﻿/// <reference name="MicrosoftAjax.debug.js" />
/// <reference name="MicrosoftAjaxTimer.debug.js" />
/// <reference name="MicrosoftAjaxWebForms.debug.js" />
/// <reference path="jquery-1.2.6.pack.js" />

Type.registerNamespace('n4m.Web.Behaviors');

n4m.Web.Behaviors.TreeManager = function(element) {
	this._tree = null;
	this._draggable = null;
	this._allowFolderReordering = null;
	this._allowMultipleNodeSelections = null;
	this._treeNodeSelectedDelegate = null;
	this._treeNodeOnMoveDelegate = null;
	this._rootNodeId = null;
	this.SelectNode = null;
	this.SelectNodes = null;
	this._selectingNode = false;
	this.GetNodeInfo = null;
	this.GetSelectedNodes = null;
	n4m.Web.Behaviors.TreeManager.initializeBase(this, [element]);
}

n4m.Web.Behaviors.TreeManager.prototype = {
    initialize: function() {
        n4m.Web.Behaviors.TreeManager.callBaseMethod(this, 'initialize');

        this._treeNodeSelectedDelegate = Function.createDelegate(this, this._treeNodeSelected);
        this._treeNodeOnMoveDelegate = Function.createDelegate(this, this._treeNodeOnMove);
        this.SelectNode = Function.createDelegate(this, this._selectNode);
        this.SelectNodes = Function.createDelegate(this, this._selectNodes);
        this.GetNodeInfo = Function.createDelegate(this, this._getNodeInfo);
        this.GetSelectedNodes = Function.createDelegate(this, this._getSelectedNodes)
        var draggable = (this._draggable) ? "folder" : "none";
        var multiSelect = (this._allowMultipleNodeSelections) ? "on" : "false";
        var dragRules = [];
        if (this._allowFolderReordering) {
            dragRules = [
						"folder after folder",
						"folder before folder",
						"folder inside folder"
					];
        } else {
            dragRules = [
						"folder inside folder",
						"folder inside root"
					];
        }
        this._tree = n4m.Web.LibraryScripts.tree_component();
        this._tree.init($(this.get_element()), {
            path: 'jsTree'
			, dflt: "#smtRoot"
			, dots: true
            //, languages: ['en']
			, animation: 500
			, insertAt: "bottom"
			, metadata: false
			, rules: {
			    type_attr: "rel",
			    use_inline: false,
			    clickable: ["all"],
			    draggable: [draggable],
			    deletable: ["folder"],
			    dragrules: dragRules,
			    renameable: "none",
			    multiple: multiSelect
			}
			, callback: {
			    onchange: this._treeNodeSelectedDelegate
				, error: this._treeErrorDelegate
				, beforecreate: this._treeNodeBeforeCreateDelegate
				, beforemove: this._treeNodeBeforeCreateDelegate // this appears to be called when creating a new node... odd
				, beforechange: this._confirmChangeLossWithUserDelegate
				, onbeforerename: function(NODE) { return false; }
				, onmove: this._treeNodeOnMoveDelegate
				, ondelete: this._treeNodeOnDeleteDelegate
			}
        });
    },

    dispose: function() {
        this._treeNodeSelectedDelegate = null;
        this._treeNodeOnMoveDelegate = null;
        this._selectNodeDelegate = null;
        this._selectNodesDelegate = null;
        this._tree = null;
        this.GetNodeInfo = null;
        this.GetSelectedNodes = null;
        n4m.Web.Behaviors.TreeManager.callBaseMethod(this, 'dispose');
    },

    _getNameFromNodeElement: function(node) {
        if (node) {
            return $(node.firstChild).text();
        }
    },

    _getFullNameFromNodeElement: function(node) {
        if (node) {
            var name = "";
            var parentNode = $(node);
            while (parentNode.length > 0 && parentNode[0].id !== "smtRoot") {
                if (name !== "") {
                    name = $(parentNode[0].firstChild).text() + "\\" + name;
                } else {
                    name = $(parentNode[0].firstChild).text();
                }
                parentNode = $(parentNode).parents("li:eq(0)");
            }
            //add the root name too
            if (name !== "") {
                name = "\\\\" + $(parentNode[0].firstChild).text() + "\\" + name;
            } else {
                name = "\\\\" + $(parentNode[0].firstChild).text();
            }
            return name;
        }
    },

    _changeNodeName: function(nodeId, newName) {
        if (nodeId && this._rootNodeId && (nodeId === this._rootNodeId)) {
            nodeId = "smtRoot";
        }
        var elt = $("#" + this.get_element().id + ' li#' + nodeId)
        if (elt.length > 0 && nodeId != "smtRoot") {
            $(elt).find("a:first").html(newName);
        }
    },

    _selectNode: function(nodeId) {
        if (nodeId && this._rootNodeId && (nodeId === this._rootNodeId)) {
            nodeId = "smtRoot";
        }
        var elt = $("#" + this.get_element().id + ' li#' + nodeId)
        if (elt.length > 0) {
            this._selectingNode = true;
            this._tree.select_branch(elt);
            this._selectingNode = false;
        }
    },

    _selectNodes: function(nodeIds) {
        var elt = null;
        this._selectingNode = true;
        var successfulSelectionOfOneNode = false;
        if (nodeIds.length > 0) {
            for (var i = 0; i < nodeIds.length; i++) {
                var nodeId = nodeIds[i];
                if (nodeId && this._rootNodeId && (nodeId === this._rootNodeId)) {
                    nodeId = "smtRoot";
                }
                elt = $("#" + this.get_element().id + ' li#' + nodeId)
                if (elt.length > 0) {
                    if (!successfulSelectionOfOneNode) {
                        this._tree.select_branch(elt);
                        successfulSelectionOfOneNode = true;
                    }
                    else {
                        this._tree.select_branch(elt, true);
                    }
                }
            }
        }
        this._selectingNode = false;
    },

    _getSelectedNodes: function() {
        var treeNodes = this._tree.selected_arr;
        var selectedNodes = [];
        for (var p in treeNodes) {
            var node = treeNodes[p][0];
            var nodeInfo = this.GetNodeInfo(node.id);
            if (nodeInfo !== null) {
                selectedNodes.push(nodeInfo);
            }
        }
        return selectedNodes;
    },

    GetNodeElement: function(nodeId) {
        return $("li#" + nodeId);
    },

    GetNodeName: function(nodeId) {
        var nodes = this.GetNodeElement(nodeId);
        if (nodes.length > 0) {
            return this._getNameFromNodeElement(nodes[0]);
        } else {
            return null;
        }
    },

    _getNodeInfo: function(nodeId) {
        if (nodeId && this._rootNodeId && (nodeId === this._rootNodeId)) {
            nodeId = "smtRoot";
        }
        var nodes = $("li#" + nodeId);
        if (nodes.length > 0) {
            var node = nodes[0];
            if (node.id === "smtRoot" && this._rootNodeId) {
                return { nodeId: this._rootNodeId, fullName: this._getFullNameFromNodeElement(node), name: this._getNameFromNodeElement(node), isRoot: true }
            } else {
                return { nodeId: node.id, fullName: this._getFullNameFromNodeElement(node), name: this._getNameFromNodeElement(node), isRoot: (node.id === "smtRoot"), marked: $(node).hasClass("marked") }
            }
        } else {
            return null;
        }
    },

    add_nodeSelected: function(handler) {
        this.get_events().addHandler('nodeSelected', handler);
    },

    remove_nodeSelected: function(handler) {
        this.get_events().removeHandler('nodeSelected', handler);
    },

    _treeNodeSelected: function(node, tree_obj) {
        if (this._selectingNode === false) {
            var h = this.get_events().getHandler('nodeSelected');
            if (h) {
                var info = null;
                if (node.id === "smtRoot" && this._rootNodeId) {
                    info = { nodeId: this._rootNodeId, fullName: this._getFullNameFromNodeElement(node), name: this._getNameFromNodeElement(node), isRoot: true };
                } else {
                    info = { nodeId: node.id, fullName: this._getFullNameFromNodeElement(node), name: this._getNameFromNodeElement(node), isRoot: (node.id === "smtRoot") };
                }
                h(this, info);
            }
        }
    },

    add_nodeMoved: function(handler) {
        this.get_events().addHandler('nodeMoved', handler);
    },

    remove_nodeMoved: function(handler) {
        this.get_events().removeHandler('nodeMoved', handler);
    },

    _treeNodeOnMove: function(node, ref_node, moveType) {
        if (this._selectingNode === false) {
            var h = this.get_events().getHandler('nodeMoved');
            if (h) {
                var parentNodeId = null;
                var nodeIndex = null;
                //BELOW | ABOVE | INSIDE
                switch (moveType) {
                    case "inside":
                        var parentList = $(ref_node).children("ul").children();
                        parentNodeId = ref_node.id;
                        nodeIndex = parentList.length;
                        break;
                    default: //before, after
                        var parentList = $(ref_node).parents("ul:eq(0)").children();
                        var parentNode = $(ref_node).parents("li")[0]
                        parentNodeId = parentNode.id;
                        nodeIndex = jQuery.inArray(ref_node, parentList);
                        if (moveType === "before") {
                            nodeIndex = nodeIndex - 1;
                            //if it's above the first element, set the nodeIndex to 0
                            if (nodeIndex < 0) {
                                nodeIndex = 0;
                            }
                        } else {
                            nodeIndex = nodeIndex + 1;
                        }
                        break;
                }
                var info = { nodeId: node.id, parentNodeId: parentNodeId, nodeIndex: nodeIndex, marked: $(node).hasClass("marked") };
                h(this, info);
            }
        }
    },

    _deleteNode: function(nodeId) {
        this._tree.select_branch(nodeId);
        this._tree.remove();
    },

    _addNode: function(id) {
        $(this._tree.create('folder')).attr("id", id);
    },

    _markNode: function(nodeId) {
        var nodes = $("li#" + nodeId);
        if (nodes.length > 0) {
            var node = $(nodes[0]);
            if (node.hasClass("marked") == false) {
                node.addClass("marked");
            }
        }
    },

    _unmarkNode: function(nodeId) {
        var nodes = $("li#" + nodeId);
        if (nodes.length > 0) {
            var node = $(nodes[0]);
            if (node.hasClass("marked") == true) {
                node.removeClass("marked");
            }
        }
    },

    /* properties */

    get_RootNodeId: function() {
        return this._rootNodeId;
    },

    set_RootNodeId: function(value) {
        this._rootNodeId = value;
    },

    get_AllowFolderReordering: function() {
        return this._allowFolderReordering;
    },

    set_AllowFolderReordering: function(value) {
        this._allowFolderReordering = value;
    },

    set_AllowMultipleNodeSelections: function(val) {
        this._allowMultipleNodeSelections = val;
    },

    get_AllowMultipleNodeSelections: function() {
        return this._allowMultipleNodeSelections;
    },

    get_Draggable: function() {
        return this._draggable;
    },

    set_Draggable: function(value) {
        this._draggable = value;
    }
}

n4m.Web.Behaviors.TreeManager.registerClass('n4m.Web.Behaviors.TreeManager', AjaxControlToolkit.BehaviorBase);
if (typeof (Sys) !== 'undefined') { Sys.Application.notifyScriptLoaded(); }
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();