Type.registerNamespace('DeveloperFusion.Library.Controls');

DeveloperFusion.Library.Controls.TreeView = function(element)
{
    DeveloperFusion.Library.Controls.TreeView.initializeBase(this, [element]);
}
DeveloperFusion.Library.Controls.TreeView.prototype =
{
    initialize : function()
    {
        DeveloperFusion.Library.Controls.TreeView.callBaseMethod(this, 'initialize');
        $addHandlers(this.get_element(), { 'click' : this._displayNodes }, this);
        //, 'dblclick' : this._displayNodes
    },
    dispose : function()
    {
        $clearHandlers(this.get_element());
        // call base dispose
        DeveloperFusion.Library.Controls.TreeView.callBaseMethod(this, 'dispose');
    },
    add_nodeClick : function(handler)    
    {    
        this.get_events().addHandler('nodeClick', handler);    
    },    

    remove_nodeClick : function(handler)    
    {    
        this.get_events().removeHandler('nodeClick', handler);    
    },    
    _displayNodes : function _displayNodes(e) {
        var targetElement = $(e.target);
        if (targetElement.getTag()=="a") { // && targetElement.hasClass('action') || e.type=='dblclick'
            e.preventDefault();
            var clickedNode = targetElement.getParent();
            var children = clickedNode.getChildren();
            if (children.length < 2)
                return; // failed
            var nodeAction = children[0];
            var nodeText = children[1];
            
            // raise events
            var handler = this.get_events().getHandler('nodeClick'); 
   
            if (handler != null)    
                handler(this, { clickedNode : clickedNode.id, clickedText : targetElement.hasClass('text') });

            if (nodeAction.hasClass('noaction'))
                return; // don't do anything
                
            if (children.length > 2) {
                var childNodes = children[2];
                // we already have sub-nodes loaded
                
                if (nodeAction.hasClass('expanded')) {
                    nodeAction.removeClass('expanded');
                    childNodes.setStyle('display','none');
                } else {
                    nodeAction.addClass('expanded');
                    childNodes.setStyle('display','block');
                }
            } else {
                nodeText.addClass('loading');
                DeveloperFusion.Web.Labs.Services.SourceViewer.GetNodes(clickedNode.id, this._displayNodesCallback, this._displayNodesCallbackFailed, clickedNode.id);
            }
        }
    },
    _displayNodesCallback : function (result,target) {
        var clickedNode = $(target);
        
        var children = clickedNode.getChildren();
        if (children.length < 2 || children.length > 2)
            return; // invalid node
        var nodeAction = children[0];
        var nodeText = children[1];
        
        var el = new Element('ul');
        el.injectAfter(nodeText);
        
        if (result.length == 0) {
            //var actionElement = new Element('div', {'class':'noaction'});
            //actionElement.injectInside(listItem);
            nodeText.removeClass('loading');
            nodeAction.removeClass("action");
            nodeAction.addClass("noaction");
            return;
        }
        
        for(var i=0; i<result.length; i++) {
            var node = result[i];
            var listItem = new Element('li');
            listItem.id = node.UniqueId;
            if (i==result.length-1)
                listItem.addClass("last");
                
            if (node.HasChildren) {
                var actionElement = new Element('a', {'class':'action'});
                actionElement.setText("Expand");
                actionElement.injectInside(listItem);
            } else {
                var actionElement = new Element('div', {'class':'noaction'});
                actionElement.injectInside(listItem);
            }
            
            var nodeTextElement = new Element('a',{'class':'text'});
            nodeTextElement.addClass(node.CssClass);
            nodeTextElement.href = node.Url;
            nodeTextElement.setText(node.Text);
            
            nodeTextElement.injectInside(listItem);
            
            listItem.injectInside(el);
        }
        nodeAction.addClass('expanded');
        nodeText.removeClass('loading');
        
    },
    _displayNodesCallbackFailed : function (error,target) {
        //alert(error.get_message());
        var clickedNode = $(target);
        var children = clickedNode.getChildren();
        if (children.length < 2 || children.length > 2)
            return; // invalid node
        var nodeText = children[1];
        nodeText.removeClass('loading');
        nodeText.addClass('error');
        nodeText.setAttribute('title','An error occured: ' + error.get_message());
    }
}


DeveloperFusion.Library.Controls.TreeView.registerClass(
    'DeveloperFusion.Library.Controls.TreeView', Sys.UI.Control);

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();