var leftnavContainerId = 'leftnav';
var ulElementName = 'UL';
var liElementName = 'LI';
var divElementName = 'DIV';
var crosslinkPanelPrefix = 'CrossLinkPanel';
var cssShow = 'show';
var cssHide = 'hide';
var cssCrosslink = 'crosslink ';
var voidLink = 'javascript:void(0)';

function collapse(
    /*<a> element*/
    element, 
    /*<div> under <li>*/
    subPanelID, 
    /*<div> element in crosslink panel*/
    crossLinkPanelID)
{
    if(!element)
        return;

    var hrefString = element.href;
    if(hrefString && hrefString != voidLink)
        return;

    var divEle = document.getElementById(subPanelID);
    if(!divEle)
        return;

    var liEle = element.parentNode;//get <li> element
    hideAllCrossLinkDiv();
    if(divEle.className == cssHide)
    {
        hideSameLevelLeaf(liEle);//recursive hide all expanded tree levels
        divEle.className = cssShow;
        var crossLinkDiv = document.getElementById(crossLinkPanelID);
        if(crossLinkDiv)
        {
            crossLinkDiv.className = cssCrosslink + cssShow;
            var crossPanel = document.getElementById(crosslinkPanelPrefix);//show global cross link panel
            if(crossPanel)
                crossPanel.className = cssShow;
        }
        liEle.className += ' highlighted_smarrow';
    }
    else
    {
        divEle.className = cssHide;
        var index = liEle.className.indexOf(' highlighted_smarrow');
        if (index != -1) {
            liEle.className = liEle.className.substring(0, index);
        }
    }
    showParentCrossLinkPanel(element.parentNode);
}

function hideSameLevelLeaf(/*<ul> element or its sub element*/levelElement)
{
    if(!levelElement)
        return;
        
    var liEle = levelElement;//current <li> element
    while(liEle && liEle.id != leftnavContainerId && liEle.nodeName.toUpperCase() != ulElementName)
    {
        liEle = liEle.parentNode;
    }
    if(liEle.id == leftnavContainerId)//find to the root
        return;
    if(liEle.nodeName.toUpperCase() == ulElementName)
    {
        var nodeList = liEle.childNodes;//all <li> elements
        if(nodeList && nodeList.length != 0)
        {
            for(var node in nodeList)
            {
                if((nodeList[node].nodeName) && nodeList[node].nodeName.toUpperCase() == liElementName)
                {
                    var index = nodeList[node].className.indexOf(' highlighted_smarrow');
                    if (index != -1) {
                        nodeList[node].className = nodeList[node].className.substring(0, index);
                    }
                    
                    var subPanelItems = nodeList[node].childNodes;
                    if(subPanelItems)
                    {
                        for(var subPanelItem in subPanelItems)
                        {
                            var item = subPanelItems[subPanelItem];
                            if((item.nodeName) && item.nodeName.toUpperCase() == divElementName)
                            {
                                item.className = cssHide;
                                var subLi = item.firstChild;
                                while(subLi && subLi.nodeName && subLi.nodeName.toUpperCase() != ulElementName)
                                    subLi = subLi.nextSibling;
                                hideSameLevelLeaf(subLi);
                            }
                        }
                    }
                }
            }
        }
    }
}

function showParentCrossLinkPanel(/*<li> element*/currentElement)
{
    var ulEle = currentElement.parentNode;//<ul> element
    var showValid = false;
    while(ulEle && ulEle.parentNode && ulEle.parentNode.id != leftnavContainerId)//<div> element
    {
        if((ulEle.parentNode.nodeName) && ulEle.parentNode.nodeName.toUpperCase() == liElementName)
        {
            var id = ulEle.parentNode.id;
            if(!id)
                return;
            var ids = id.toString();
            if(ids.length >15)
            {
                var crossLink = document.getElementById(crosslinkPanelPrefix + ids.substring(15, ids.length));
                if(crossLink)
                {
                    crossLink.className = cssCrosslink + cssShow;
                    showValid = true;
                }
            }
        }
        ulEle = ulEle.parentNode;
    }
    var crossPanel = document.getElementById(crosslinkPanelPrefix + '0');
    if(crossPanel)
    {
        showValid = true;
        crossPanel.className = cssCrosslink + cssShow;
    }

    crossPanel = document.getElementById(crosslinkPanelPrefix);
    if(crossPanel && showValid)
        crossPanel.className = cssShow;
}

function hideAllCrossLinkDiv()
{
    var crossPanel = document.getElementById(crosslinkPanelPrefix);
    if(!crossPanel)
        return;
    var nodeList = crossPanel.childNodes;
    if(!nodeList || nodeList.length == 0)
        return;
    for(var node in nodeList)
    {
        if((nodeList[node].nodeName) && nodeList[node].nodeName.toUpperCase() == divElementName)
        {
            nodeList[node].className = cssCrosslink + cssHide;
        }
    }
    crossPanel.className = cssCrosslink + cssHide;
}