﻿// TreeControl public JS events.

// Each event will be given the parameter evt and treeItem. evt is the event object associated
// with the user interaction. treeItem is a reference to the <li> of the affected tree item.
// The treeItem instance contains the following properties:

// treeItem.treeControl                is a reference to the <div> of the affected TreeControl.
// treeItem.treeControl.valueElement   is the <input> that contains the selected value of the TC.
// treeItem.treeControl.branchElement  is a reference to the first <ul> of the TreeControl.
// treeItem.itemLink                   is a reference to the hyperlink inside the <li>.
// treeItem.itemIcon                   is a reference to the image inside the hyperlink.
// treeItem.itemText                   is a reference to the span which contains the item's text.
// treeItem.id                         contains the string value of the item.
// treeItem.childRoot                  contains the <ul> of the item's childeren. This can be
//                                     null if there are no childeren (can never expand)
//                                     or the <ul> may contain no <li>'s. In that case the
//                                     IsEmptyParent flag was set on the server side, meaning
//                                     the script will have to build the childeren upon expand.
// treeItem.isSelected()               returns whether or not the item is selected.
// treeItem.ensureVisible(scrollMode)  scrolls the TreeControl(div) to ensure that the item
//                                     becomes visible. Only works when the TreeControl div
//                                     has the CSS overflow-style "auto" or "scroll".
//                                     scrollMode is one of the SCROLLMODE_ constants.
// treeItem.appendChild(treeItem)      appends a new treeItem as a child to another treeItem.
// treeControl.appendChild(treeItem)   appends a new treeItem to the control.
// treeControl.createTreeItem()        returns a new treeItem to be associated with that control.

var SCROLLMODE_VERTICAL = 1;
var SCROLLMODE_HORIZONTAL = 2;
var SCROLLMODE_BOTH = 3;

var onTreeItemCollapse;
var onTreeItemExpand;
var onTreeItemLinkClick;
var onTreeItemMouseOver;
var onTreeItemMouseOut;
var onTreeItemMouseUp;

// End events.

treeControlInit = function()
{
    getAspNetForm();
    
    var forrest = document.getElementsByTagName('DIV');
    var forrestLen = forrest.length;
    for (var i = 0; i < forrestLen; i++)
    {
        var divElm = forrest[i];
        if (divElm.className == 'treecontrol')
            treeControlInitTree(divElm);
    }
}

treeControlInitTree = function(treeElm)
{
    treeElm.valueElement = getFirstChild(treeElm);
    treeElm.postbackElement = getNextSibling(treeElm.valueElement);
    treeElm.branchElement = getNextSibling(treeElm.postbackElement);
    
    treeControlSetMethods(treeElm);
    
    var allItems = treeElm.branchElement.getElementsByTagName('LI');
    var allItemsLen = allItems.length;
    
    for (var i = 0; i < allItemsLen; i++)
    {
        var treeItem = allItems[i];
        treeItem.treeControl = treeElm;
        treeItem.itemLink = getFirstChild(treeItem);
        treeItem.itemIcon = getFirstChild(treeItem.itemLink);
        treeItem.itemText = getNextSibling(treeItem.itemIcon);
        treeItem.childRoot = getNextSibling(treeItem.itemLink);
        
        treeControlInitTreeItem(treeItem);
        
        if (treeItem.isSelected())
            treeItem.ensureVisible(SCROLLMODE_VERTICAL);
    }
    
    treeElm.createTreeItem = function(value, text, href, emptyParent)
    {
        var treeItem = document.createElement('LI');
        treeItem.id = value;
        
        treeItem.itemLink = document.createElement('A');
        treeItem.itemIcon = document.createElement('IMG');
        treeItem.itemText = document.createElement('SPAN');
        if (href == null)
            treeItem.itemLink.href = '#';
        else
            treeItem.itemLink.href = href;
        treeItem.itemIcon.src = 'WebResource.axd?d=PIyMLAWfnu_t8bqXBkusWDm-ykQCRZ1wzsvs5Ka3sS2QpZ8CrF29w1pWde0hchcaweF2CJwtvNDJ89vcliWfALUrYBYCsTC1mv_hi23UbeT-4s4mwcjG374IFLn4_q3U0&t=634185031218096250';
        treeItem.itemText.appendChild(document.createTextNode(text));
        treeItem.appendChild(treeItem.itemLink);
        treeItem.itemLink.appendChild(treeItem.itemIcon);
        treeItem.itemLink.appendChild(treeItem.itemText);
        
        treeItem.treeControl = treeElm;
        if (!emptyParent)
            treeItem.childRoot = null;
        else
        {
            treeItem.childRoot = document.createElement('UL');
            treeItem.childRoot.style.display = 'none';
            treeItem.appendChild(treeItem.childRoot);
        }

        treeControlInitTreeItem(treeItem);
        
        return treeItem;
    }
}

treeControlInitTreeItem = function(treeItem)
{
    treeControlSetMethods(treeItem);
    
    treeItem.expand = function()
    {
        this.childRoot.style.display = 'block';
    }
    
    treeItem.collapse = function()
    {
        this.childRoot.style.display = 'none';
    }
    
    treeItem.isSelected = function()
    {
        return (this.itemText.parentNode.className.indexOf('tcActive') > -1)
    }
    
    treeItem.ensureVisible = function(scrollMode)
    {
        var tcPos = getAbsolutePosition(this.treeControl);
        var tiPos = getAbsolutePosition(this);
        
        if (scrollMode == SCROLLMODE_VERTICAL || scrollMode == SCROLLMODE_BOTH)
            this.treeControl.scrollTop = (tiPos.y - tcPos.y);
        if (scrollMode == SCROLLMODE_HORIZONTAL || scrollMode == SCROLLMODE_BOTH)
            this.treeControl.scrollLeft = (tiPos.x - tcPos.x);
    }
    
    treeItem.itemIcon.onclick = function(treeItem) { return function(evt)
    {
        switch (this.className)
        {
            case 'tcParentClose':
            case 'tcLastParentClose':
                this.className = (this.className == 'tcParentClose') ? 'tcParentOpen' : 'tcLastParentOpen';
                
                if (onTreeItemExpand !== undefined)
                    onTreeItemExpand(evt || event, treeItem);
                else
                    treeItem.expand();
                
                break;
            case 'tcParentOpen':
            case 'tcLastParentOpen':
                this.className = (this.className == 'tcParentOpen') ? 'tcParentClose' : 'tcLastParentClose';
                if (onTreeItemCollapse !== undefined)
                    onTreeItemCollapse(evt || event, treeItem);
                else
                    treeItem.collapse();
                    
                break;
        }
        return false;
    }}(treeItem);
    
    if (treeItem.itemLink.href.slice(-1) == '#')
    {
        treeItem.itemText.onclick = function(treeItem) { return function(evt)
        {
            var proceed = true;
            if (onTreeItemLinkClick !== undefined)
                proceed = onTreeItemLinkClick(evt || event, treeItem);
            
            if (proceed)
            {
                treeItem.treeControl.postbackElement.value = '1';
                treeItem.treeControl.valueElement.value = treeItem.id;
                aspNetForm.submit();
            }

            return false;
        }}(treeItem);
    }
    
    treeItem.itemText.onmouseover = function(treeItem) { return function(evt)
    {
        if (onTreeItemMouseOver !== undefined)
            return onTreeItemMouseOver(evt || event, treeItem);
    }}(treeItem);
    
    treeItem.itemText.onmouseout = function(treeItem) { return function(evt)
    {
        if (onTreeItemMouseOut !== undefined)
            return onTreeItemMouseOut(evt || event, treeItem);
    }}(treeItem);
    
    treeItem.itemText.onmouseup = function(treeItem) { return function(evt)
    {
        if (onTreeItemMouseUp !== undefined)
            return onTreeItemMouseUp(evt || event, treeItem);
    }}(treeItem);
    
    treeItem.itemLink.onselectstart = function() { return false; }
    treeItem.itemLink.onmousedown = function() { return false; }
}

treeControlSetMethods = function(item)
{
    // This method is shared on the tree control itself and on any tree items created.
    item.appendTreeItem = function(source)
    {
        if (item.childRoot == null)
        {
            item.childRoot = document.createElement('UL');
            item.appendChild(item.ChildRoot);
        }
        
        item.childRoot.appendChild(source);
        
        item.itemText.className = 'tcItemText';

        if (source.childRoot == null)
            source.itemIcon.className = 'tcLastItem';
        else
            source.itemIcon.className = 'tcLastParentClose';

        var previousItem = getPreviousSibling(source);
        if (previousItem != null)
        {
            if (previousItem.itemIcon.className != 'tcLastItem')
                previousItem.className = 'tcVerticalLine';
            
            switch (previousItem.itemIcon.className)
            {
                case 'tcLastParentClose':
                    previousItem.itemIcon.className = 'tcParentClose';
                    break;
                case 'tcLastParentOpen':
                    previousItem.itemIcon.className = 'tcParentOpen';
                    break;
                case 'tcLastItem':
                    previousItem.itemIcon.className = 'tcItem';
            }
        }
    }
}

addEvent(window, 'load', treeControlInit);
