// Tree class
// ----------

// constructor
function Tree(ElementID, ClassPrefix, ExpandedURL, CollapsedURL, LeafURL, ExpandCollapseHandler)
{
    this.RootNode = new TreeNode(null, null, true, false) // reference to root node of the tree
    this.ElementID = ElementID
    this.ClassPrefix = ClassPrefix
    this.ExpandedURL = ExpandedURL
    this.CollapsedURL = CollapsedURL
    this.LeafURL = LeafURL
    
    this.LoadUI = LoadUI
    this.LoadLevelUI = LoadLevelUI
    this.ExpandCollapse = ExpandCollapse
    this.FindNodeByID = FindNodeByID
    
    this.ExpandCollapseHandler = ExpandCollapseHandler
}

function LoadUI()
{
    Element = document.getElementById(this.ElementID)
    
    // remove previous children
    while ( Element.hasChildNodes() ) { Element.removeChild(Element.firstChild); }

    // do actual loading
    this.LoadLevelUI(Element, this.RootNode, 0)
    
}

function LoadLevelUI(Element, Node, Level)
{
    //window.alert("LoadLevelUI start: Level = " + Level + ", Node.NodeCount = " + Node.NodeCount + ", Node.Expanded = " + Node.Expanded)
    if (Level > 0)
    {
        // add HTML tags
        Div = document.createElement("div")
        Div.className = this.ClassPrefix + Level
        Div.id = "div_" + Node.GetID()
        addEvent(Div, "click", this.ExpandCollapseHandler)
        //window.alert("Div.id = " + Div.id);
        
        ImgDiv = document.createElement("div")
        ImgDiv.className = "blmcr_img"
        ImgDiv.id = "imgdiv_" + Node.GetID()
        Div.appendChild(ImgDiv)
        
        Img = document.createElement("img")
        Img.id = "img_" + Node.GetID()
        Img.setAttribute("alt", "")
        if (Node.NodeCount == 0)
            Img.setAttribute("src", this.LeafURL) 
        else if (Node.Expanded == true)
            Img.setAttribute("src", this.ExpandedURL)
        else
            Img.setAttribute("src", this.CollapsedURL)
        ImgDiv.appendChild(Img)
        
        TextDiv = document.createElement("div")
        TextDiv.className = "blmcr_text"
        TextDiv.id = "textdiv_" + Node.GetID()
        Div.appendChild(TextDiv)

        TextParent = TextDiv
        if (Node.Selected == true)
        {
            TextDiv.className = "blmcr_texta"
        }

        T = document.createTextNode(Node.Text)
        TextParent.appendChild(T)
        Element.appendChild(Div)
    }
    
    // go through children
    if ((Node.NodeCount > 0) && (Node.Expanded == true))
    {
        for (var i = 0; i < Node.NodeCount; i++)
        {
            //window.alert("LoadLevelUI before: Level = " + Level + ", Node.NodeCount = " + Node.NodeCount + ", i = " + i)
            this.LoadLevelUI(Element, Node.Nodes[i], Level+1)
            //window.alert("LoadLevelUI after: Level = " + Level + ", Node.NodeCount = " + Node.NodeCount + ", i = " + i)
        }
    }
}

function FindNodeByID(ID)
{
    //window.alert("FindNodeByID: " + ID)
    endPos = ID.length
    startPos = ID.lastIndexOf("n")
    Node = this.RootNode
    i = -1;
    while (startPos != -1)
    {
        i = ID.toString().substr(startPos + 1, endPos - startPos - 1)
        //window.alert("Node: " + Node + ", i: " + i + ", startPos: " + startPos + ", endPos: " + endPos)
        Node = Node.Nodes[i]
        endPos = startPos
        startPos = ID.lastIndexOf("n", endPos - 1)
    }
    //window.alert(Node.GetID())
    return Node;
}

function ExpandCollapse(SrcElement)
{
    //window.alert("ExpandCollapse")
    //window.alert("ExpandCollapse SrcElement: " + SrcElement)
    //window.alert("ExpandCollapse SrcElement.id: " + SrcElement.id)
    //window.alert("ExpandCollapse")
    Node = this.FindNodeByID(SrcElement.id)
    //window.alert("ExpandCollapse: Node.Text = " + Node.Text)
    if (Node.NodeCount == 0)
        window.location = Node.URL;
    if (! Node.Expanded) // if expand, then collapse other siblings
    {
        for (var i = 0; i < Node.Parent.NodeCount; i++)
            Node.Parent.Nodes[i].Expanded = false
    }
    Node.Expanded = ! Node.Expanded
    
}

// TreeNode class
// --------------

// constructor
function TreeNode(Text, URL, Expanded, Selected)
{
    // properties
    this.Nodes = new Array() // array of references to child nodes
    this.NodeCount = 0 // number of child nodes
    this.Parent = null
    this.Index = -1
    this.Text = Text
    this.URL = URL
    this.Expanded = Expanded
    this.Selected = Selected
    
    this.Add = Add
    this.GetID = GetID
}

function Add(Node)
{
    this.Nodes[this.NodeCount] = Node
    Node.Parent = this
    Node.Index = this.NodeCount
    this.NodeCount++
}

function GetID()
{
    Result = "n" + this.Index
    Node = this
    while (Node.Parent.Parent != null)
    {
        Node = Node.Parent
        Result += "n" + Node.Index
    }
    //window.alert("GetID = " + Result);
    return Result;
}