﻿var collapseClass = "AspNet-TreeView-Collapse";
var expandClass = "AspNet-TreeView-Expand";
var showClass = "AspNet-TreeView-Show";
var hideClass = "AspNet-TreeView-Hide";

function IsExpanded__AspNetTreeView(element){
	return (HasClass__CssFriendlyAdapters(element, collapseClass));
}

function TogglePlusMinus__AspNetTreeView(element, showPlus){
	if (HasAnyClass__CssFriendlyAdapters(element))
	{
		var showPlusLocal = IsExpanded__AspNetTreeView(element);
		if ((typeof(showPlus) != "undefined") && (showPlus != null))
		{
			showPlusLocal = showPlus;
		}    
		var oldClass = showPlusLocal ? collapseClass : expandClass;
		var newClass = showPlusLocal ? expandClass : collapseClass;
		SwapClass__CssFriendlyAdapters(element, oldClass, newClass);
	}
}

function ToggleChildrenDisplay__AspNetTreeView(element, collapse){
	if ((element != null) && (element.parentNode != null) && (element.parentNode.getElementsByTagName != null)){        var childrenToHide = element.parentNode.getElementsByTagName("ul");
		var oldClass = collapse ? showClass : hideClass;
		var newClass = collapse ? hideClass : showClass;
		for (var i=0; i<childrenToHide.length; i++){
			if ((childrenToHide[i].parentNode != null) && (childrenToHide[i].parentNode == element.parentNode)){
				SwapOrAddClass__CssFriendlyAdapters(childrenToHide[i], oldClass, newClass);
			}
		}
	}
}

function ExpandCollapse__AspNetTreeView(sourceElement){
	if (HasAnyClass__CssFriendlyAdapters(sourceElement)){
		var expanded = IsExpanded__AspNetTreeView(sourceElement);
		TogglePlusMinus__AspNetTreeView(sourceElement, expanded);
		ToggleChildrenDisplay__AspNetTreeView(sourceElement, expanded);
	}
}

function GetViewState__AspNetTreeView(id){
	var retStr = "";
	if ((typeof(id) != "undefined") && (id != null) && (document.getElementById(id) != null)){
		var topUL = document.getElementById(id);
		retStr = ComposeViewState__AspNetTreeView(topUL, "");        
	}
	return retStr;
}

function ComposeViewState__AspNetTreeView(element, state){
    var child = element.firstChild;
    var bConsiderChildren = true;

    //  The following line must be changed if you alter the TreeView adapters generation of
    //  markup such that the first child within the LI no longer is the expand/collapse <span>.
    if ((element.tagName == "LI") && (child != null)){
        var expandCollapseSPAN = null;
        var currentChild = child;
        while (currentChild != null){
            if ((currentChild.tagName == "SPAN") &&
                (currentChild.className != null) &&
                ((currentChild.className.indexOf(collapseClass) > -1) ||
                 (currentChild.className.indexOf(expandClass) > -1))){
                expandCollapseSPAN = currentChild;
                break;
            }
            currentChild = currentChild.nextSibling;
        }
    
        if (expandCollapseSPAN != null){
            if (expandCollapseSPAN.className.indexOf(collapseClass) > -1){
                //  If the "collapse" class is currently being used then the "collapse" icon is, presumably, being shown.
                //  In other words, the node itself is actually expanded at the present moment (which is why you now
                //  have the option of collapsing it.  So we mark it as an "expanded" node for purposes of the view state
                //  we are now accumulating.
                state +=  "e";
            }else if (expandCollapseSPAN.className.indexOf(expandClass) > -1){
                //  This part of the tree is collapsed so we don't need to consider its children.
                bConsiderChildren = false;
                state +=  "n";
            }
        }
    }
        
    if (bConsiderChildren && (child != null)){
        state = ComposeViewState__AspNetTreeView(child, state);
    }
    if (element.nextSibling != null){
        state = ComposeViewState__AspNetTreeView(element.nextSibling, state);
    }
    
    return state;
}