﻿/// <reference name="MicrosoftAjax.js" />

Type.registerNamespace("cc");

cc.Tree = function(element)
{
    cc.Tree.initializeBase(this, [element]);

    this._dataServiceMethod = null;
    this._onNodeClick = null;
    this._selectedContent = null;
};

cc.Tree.prototype =
{
    initialize: function()
    {
        //var startTime = new Date().getTime();

        cc.Tree.callBaseMethod(this, "initialize");

        var self = this;

        $(this.get_element()).children("div.node-container").each(function(i)
        {
            self._initializeNodeContainer(this);
        });

        var selectedContent = $(this.get_element()).find("div.node-container > div.selected");
        if (selectedContent.length > 0)
        {
            this._selectedContent = selectedContent.get(0);
        }

        //this._hideClosedNodeContainers();

        //console.log("_initializeNodeContainer");
        //console.log("Total: " + (new Date().getTime() - startTime) / 1000);
    },

    dispose: function()
    {
        cc.Tree.callBaseMethod(this, "dispose");
    },

    _positionColumns: function(nodeContainer)
    {
        //var startTime = new Date().getTime();

        var col1Width = 0;

        var cols = $(nodeContainer).children("div.content").children("div.columns").children("div.col1");

        cols.each(function(i)
        {
            var curWidth = $(this).width();
            if (col1Width < curWidth)
            {
                col1Width = curWidth;
            }
        });

        col1Width += 5;

        if (col1Width > 100)
        {
            col1Width = 100;
        }

        cols.each(function(i)
        {
            $(this).css("width", col1Width + "px");
        });

        //console.log("positionColumns");
        //console.log((new Date().getTime() - startTime) / 1000);
    },

    _rerender: function()
    {
        $(this.get_element()).parent().removeClass("dummy");
    },

    getNodeByDataKey: function(dataKey)
    {
        $(this.get_element()).find("div[datakey=" + dataKey + "]").get(0);
    },

    expandNode: function(node)
    {
        //var startTime = new Date().getTime();

        var currentNode = $(node);
        var currentNodeContainer = currentNode.find("+ div.node-container");
        var currentExpander = currentNode.find("> div.expander");
        var dataKey;
        var level = currentNode.parents("div.node-container").length - 1;

        if (currentExpander.hasClass("closed"))
        {
            if (this._dataServiceMethod && !currentNode.attr("loaded") && currentNodeContainer.length === 0)
            {
                dataKey = currentNode.attr("datakey");

                if (dataKey === undefined)
                {
                    dataKey = null;
                }

                var columns = currentNode.find("> div.columns");
                columns.append("<img src=\"./images/ajax-loader-small.gif\" alt=\"Laden...\" />");

                this._dataServiceMethod
                (
                    dataKey,
                    level,
                    Function.createDelegate(this, this._getNodes_OnSucceeded),
                    Function.createDelegate(this, this._getNodes_OnFailed),
                    {
                        node: currentNode,
                        startTime: new Date().getTime()
                    }
                );

                currentNode.attr("loaded", "true");
            }

            this._rerender();
            currentExpander.removeClass("closed").addClass("opened")
            currentNodeContainer.show();
        }
        else if (currentExpander.hasClass("opened"))
        {
            this._rerender();
            currentExpander.removeClass("opened").addClass("closed");
            currentNodeContainer.hide();
        }

        //console.log("expandNode");
        //console.log((new Date().getTime() - startTime) / 1000);
    },

    _initializeNodeContainer: function(nodeContainer)
    {
        //var startTime = new Date().getTime();

        var self = this;

        $(nodeContainer).children("div.content").hover(
            function(e)
            {
                self._rerender();
                $(this).addClass("hover");
            },
            function(e)
            {
                self._rerender();
                $(this).removeClass("hover");
            }
        ).click(
            function(e)
            {
                if (self._selectedContent !== null)
                {
                    $(self._selectedContent).removeClass("selected");
                }

                self._rerender();
                $(this).addClass("selected");
                self._selectedContent = this;

                var dataKey = $(this).attr("datakey");
                var targetUrl = $(this).attr("targeturl");

                if (targetUrl === undefined)
                {
                    self.expandNode($(this));
                }

                if (self._onNodeClick !== null)
                {
                    self._onNodeClick(this, dataKey, targetUrl);
                }
                else if (targetUrl !== undefined)
                {
                    location.href = targetUrl;
                }
            }
        ).children("div.expander").click(
            function(e)
            {
                e.stopPropagation();

                var currentNode = $(this).parent();
                self.expandNode(currentNode);
            }
        );

        //this._positionColumns(nodeContainer);

        //console.log("initializeNodeContainer");
        //console.log((new Date().getTime() - startTime) / 1000);

        $(nodeContainer).children("div.node-container").each(function(i)
        {
            self._initializeNodeContainer(this);
        });
    },

    /*_hideClosedNodeContainers: function(startNodeContainer)
    {
    if (startNodeContainer === undefined)
    {
    startNodeContainer = $(this.get_element()).find("> div.node-container");
    }

        $(startNodeContainer).find(".closed").parent().find("+ div.node-container").hide();
    },*/

    _getNodes_OnSucceeded: function(result, context, methodName)
    {
        //console.log("request");
        //console.log((new Date().getTime() - context.startTime) / 1000);

        //var startTime = new Date().getTime();

        this._addNodeContainerHtml(context.node, result);

        context.node.find("img").remove();

        //console.log("processing");
        //console.log((new Date().getTime() - startTime) / 1000);
    },

    _getNodes_OnFailed: function(error, result, context, methodName)
    {
        context.node.find("img").remove();
        alert("getNodes_OnFailed: " + error.get_message());
    },

    _addNodeContainerHtml: function(parent, nodeContainerHtml)
    {
        var self = this;

        parent.after(nodeContainerHtml);

        parent.find("+ div.node-container").each(function(i)
        {
            self._initializeNodeContainer(this);
        });

        //this._hideClosedNodeContainers(parent.find("+ div.node-container"));
    },

    get_dataServiceMethod: function()
    {
        return this._dataServiceMethod;
    },

    set_dataServiceMethod: function(value)
    {
        this._dataServiceMethod = value;
    },

    get_nodeClick: function()
    {
        return this._onNodeClick;
    },

    set_nodeClick: function(value)
    {
        this._onNodeClick = value;
    }
};

cc.Tree.registerClass("cc.Tree", Sys.UI.Control);
Sys.Application.notifyScriptLoaded();