﻿var cancelBranchToggle = false;

function ExplorerTree(type, autoHighlight) {
    this.type = type;
    this.autoHighlight = autoHighlight;
    var tree;

    var requestHandler = "Handlers/ExplorerHandler.ashx";

    function loadNodeData(node, onLoadComplete) {
        //prepare our callback object
        var callback = {
            success: function(response) {
                YAHOO.log("Node retrieval was successful.", "info", "explorerTree");
                var responseData = eval("(" + response.responseText + ")");
                append(responseData.Nodes, node);
                response.argument.onLoadComplete();
            },

            failure: function(response) {
                YAHOO.log("Failed to retrieve tree nodes from handler.", "error", "explorerTree");
                response.argument.onLoadComplete();
            },

            argument: {
                "node": node,
                "onLoadComplete": onLoadComplete
            },

            timeout: 7000 // 7 seconds
        };

        var url = requestHandler + "?" + node.requestParameters;
        YAHOO.log("Attempting to connect to: " + url, "info", "explorerTree");
        YAHOO.util.Connect.asyncRequest("GET", url, callback);
    }

    function buildTree() {
        tree = new YAHOO.widget.TreeView(type);

        tree.subscribe("clickEvent", function(event, node) {
            if (cancelBranchToggle) {
                cancelBranchToggle = false;
                return false;
            }
        });

        tree.subscribe("expandComplete", function(node) {
            if (node.highlightTargetNode) {
                node.highlightTargetNode();
            }
        });

        var root = tree.getRoot();
        root.requestParameters = "t=" + type;
        loadNodeData(root, function() {
            applyDynamicLoadFunction(root);
            tree.render();
            if (autoHighlight) {
                highlightNodeFromQueryString();
            }
        });
    }

    function append(nodes, toNode) {
        if ((nodes) && (nodes.length)) {
            //Result is an array if more than one result, string otherwise
            if (YAHOO.lang.isArray(nodes)) {
                YAHOO.log("Creating nodes from array", "info", "explorerTree");
                for (var i = 0, j = nodes.length; i < j; i++) {
                    var node = appendTreeNodeAndChildren(nodes[i], toNode);
                }
            } else {
                //there is only one result; comes as string:
                YAHOO.log("Creating node from string", "info", "explorerTree");
                var node = appendTreeNodeAndChildren(nodes, toNode);
            }
        }
    }

    function appendTreeNodeAndChildren(node, parentNode) {
        var treeNode = new YAHOO.widget.TextNode(node, parentNode);
        append(node.childNodes, treeNode);
        return treeNode;
    }

    function applyDynamicLoadFunction(node) {
        if (!node) {
            return;
        }

        if (!node.children || node.children.length == 0) {
            node.requestParameters = "m=" + node.data.martId;
            node.setDynamicLoad(loadNodeData, 1);
            if (node.nextSibling) {
                applyDynamicLoadFunction(node.nextSibling);
            } else {
                applyDynamicLoadFunction(node.parent.nextSibling);
            }
        }

        applyDynamicLoadFunction(node.children[0]);
    }

    function getNodes(martId, dataFilter) {
        if (!martId) {
            return;
        }

        var selector;

        if (dataFilter) {
            selector = function(node) {
                return node.data.dataFilter == dataFilter && node.data.martId == martId;
            };
        } else {
            selector = function(node) {
                return node.data.martId == martId;
            };
        }

        return tree.getNodesBy(selector);
    }

    function expandTreeTo(node) {
        if (!node) {
            return;
        }

        expandTreeTo(node.parent);
        node.expand();
    }

    function highlightNodeFromQueryString() {
        var martId = QueryString("d");
        var dataFilter = QueryString("f");

        if (!martId) {
            return;
        }

        var martNodes = getNodes(martId);

        // Expand & highlight node
        if (martNodes && martNodes.length > 0) {
            martNodes[0].highlightTargetNode = function() {
                if (!dataFilter) {
                    this.focus();
                } else {
                    var dataNodes = getNodes(martId, dataFilter);
                    if (dataNodes) {
                        for (i = 0, j = dataNodes.length; i < j; i++) {
                            expandTreeTo(dataNodes[i]);
                            dataNodes[i].focus();
                        }
                    }
                }
            };
            martNodes[0].expand();
        }
    }

    return {
        init: function() {
            buildTree();
        }
    }
}

var martTree = new ExplorerTree("marts", true);
var sourcesTree = new ExplorerTree("sources");
var topicsTree = new ExplorerTree("topics");

YAHOO.util.Event.onDOMReady(martTree.init);
YAHOO.util.Event.onDOMReady(sourcesTree.init);
YAHOO.util.Event.onDOMReady(topicsTree.init);
