diff --git a/umbraco/presentation/umbraco.presentation.csproj b/umbraco/presentation/umbraco.presentation.csproj index 49963420c6..a90ce5cc09 100644 --- a/umbraco/presentation/umbraco.presentation.csproj +++ b/umbraco/presentation/umbraco.presentation.csproj @@ -1467,6 +1467,15 @@ + + + + + + + + + @@ -1512,22 +1521,6 @@ - - - - - - - - - - - - - - - - @@ -1535,7 +1528,6 @@ - @@ -1574,13 +1566,10 @@ - - - diff --git a/umbraco/presentation/umbraco/Trees/BaseContentTree.cs b/umbraco/presentation/umbraco/Trees/BaseContentTree.cs index 70dc205d08..9e77753fb1 100644 --- a/umbraco/presentation/umbraco/Trees/BaseContentTree.cs +++ b/umbraco/presentation/umbraco/Trees/BaseContentTree.cs @@ -232,9 +232,14 @@ function openContent(id) { treeElement.Action = String.Format("javascript:openContent('{0}');", nodeLink.Replace("'","\\'")); } + else if (this.DialogMode == TreeDialogModes.id || this.DialogMode == TreeDialogModes.none) + { + treeElement.Action = String.Format("javascript:openContent('{0}');", dd.Id.ToString()); + } else if (!this.IsDialog || (this.DialogMode == TreeDialogModes.id)) { - if (CurrentUser.GetPermissions(dd.Path).Contains(ActionUpdate.Instance.Letter.ToString())) { + if (CurrentUser.GetPermissions(dd.Path).Contains(ActionUpdate.Instance.Letter.ToString())) + { treeElement.Action = String.Format("javascript:openContent({0});", dd.Id); } } diff --git a/umbraco/presentation/umbraco/Trees/BaseMediaTree.cs b/umbraco/presentation/umbraco/Trees/BaseMediaTree.cs index 1efa219c4f..2de70edf32 100644 --- a/umbraco/presentation/umbraco/Trees/BaseMediaTree.cs +++ b/umbraco/presentation/umbraco/Trees/BaseMediaTree.cs @@ -59,7 +59,7 @@ namespace umbraco.cms.presentation.Trees Javascript.Append(this.FunctionToCall + "(id)\n"); Javascript.Append("}\n"); } - else if (HttpContext.Current.Request.QueryString["isDialog"] == null) + else if (!this.IsDialog) { Javascript.Append( @" diff --git a/umbraco/presentation/umbraco/controls/TreeControl.ascx b/umbraco/presentation/umbraco/controls/TreeControl.ascx index 8aca4e6991..dc898e2e25 100644 --- a/umbraco/presentation/umbraco/controls/TreeControl.ascx +++ b/umbraco/presentation/umbraco/controls/TreeControl.ascx @@ -1,7 +1,6 @@ <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TreeControl.ascx.cs" Inherits="umbraco.presentation.umbraco.controls.TreeControl" %> <%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %> - @@ -11,12 +10,14 @@ - - -<%----%> + +<%----%> + + + - -<%----%> +<%----%> + "); - } - _this._initNode = eval(msg.json); - _this._tree = $.tree_create(); - _this._tree.init(_this._container, _this._getInitOptions()); - _this._tree.rename = _this._umbracoRename; //replaces the jsTree rename method - _this._container.show(); - _this._loadChildNodes(_this._container.find("li:first"), null); - _this._currentAJAXRequest = false; - $(_this).trigger("rebuiltTree", [msg.app]); - }, - error: function(e) { - _this._debug("rebuildTree: AJAX error occurred"); - _this._currentAJAXRequest = false; - $(_this).trigger("ajaxError", [{ msg: "rebuildTree"}]); - } - }); + + _this._tree = $.tree.create(); + _this._tree.init(_this._container, _this._getInitOptions()); }, @@ -215,10 +186,10 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); this._container.data("tree_" + appAlias, null); return; } - - var treeData = this._tree.getJSON(null, ["id", "umb:type", "class", "rel"], ["umb:nodedata", "href", "class", "style"]); - - //need to update the 'state' of the data. jsTree getJSON doesn't return the state of nodes (yet)! + + var treeData = this._tree.get(); + + //need to update the 'state' of the data. jsTree get doesn't return the state of nodes properly! this._updateJSONNodeState(treeData); this._container.data("tree_" + appAlias, { selected: this._tree.selected, d: treeData }); @@ -228,16 +199,18 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); /// /// A recursive function to store the state of the node for the JSON object when using saveTreeState. /// This is required since jsTree doesn't output the state of the tree nodes with the request to getJSON method. + /// This is also required to save the correct title for each node since we store our title in a div tag, not just the a tag /// var node = $("li[id='" + obj.attributes.id + "']").filter(function() { return ($(this).attr("umb:type") == obj.attributes["umb:type"]); //filter based on custom namespace requires custom function }); - var c = node.attr("class"); - if (c != null) { - var state = c.indexOf("open") > -1 ? "open" : c.indexOf("closed") > -1 ? "closed" : null; - if (state != null) obj.state = state; - } + + //saves the correct title + obj.data.title = $.trim(node.children("a").children("div").text()); + obj.state = obj.data.state; + + //recurse through children if (obj.children != null) { for (var x in obj.children) { this._updateJSONNodeState(obj.children[x]); @@ -399,11 +372,11 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); var nodeParent = this._actionNode.jsNode.parents("li:first"); this._debug("reloadActionNode: found " + nodeParent.length + " parent nodes"); if (nodeParent.length == 1) { - var nodeDef = this._getNodeDef(nodeParent); + var nodeDef = this.getNodeDef(nodeParent); this._debug("reloadActionNode: loading ajax for node: " + nodeDef.nodeId); var _this = this; //replace the node to refresh with loading and return the new loading element - var toReplace = $("
  • " + (this._tree.settings.lang.loading || "Loading ...") + "
  • ").replaceAll(this._actionNode.jsNode); + var toReplace = $("
  • " + (this._tree.settings.lang.loading || "Loading ...") + "
  • ").replaceAll(this._actionNode.jsNode); $.get(this._getUrl(nodeDef.sourceUrl), null, function(msg) { if (!msg || msg.length == 0) { @@ -416,17 +389,17 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); var oFound = null; for (var o in msg) { if (msg[o].attributes != null && msg[o].attributes.id == _this._actionNode.nodeId) { - oFound = _this._tree.parseJSON(msg[o]); + oFound = $.tree.datastores.json().parse(msg[o], _this._tree); //ensure the tree type is the same too if ($(oFound).attr("umb:type") == _this._actionNode.treeType) { break; } else { oFound = null; } } } if (oFound != null) { - _this._debug("reloadActionNode: node is refreshed!"); + _this._debug("reloadActionNode: node is refreshed! : " + supressSelect); var reloaded = $(oFound).replaceAll(toReplace); _this._configureNodes(reloaded, true); - if (!supressSelect) _this.selectNode(reloaded); + if (!supressSelect) _this.selectNode(reloaded, true, true); if (!supressChildReload) { _this._loadChildNodes(reloaded, function() { if (callback != null) callback.call(_this, true); @@ -451,6 +424,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); getActionNode: function() { /// Returns the latest node interacted with + this._debug("getActionNode: " + this._actionNode.nodeId); return this._actionNode; }, @@ -527,112 +501,73 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); }, - onOpen: function(NODE, TREE_OBJ) { - /// - /// Updates the image path references after data is returned from the server. - /// Adds the overlay div to the markup if the specified style is found in the classes of this node. - /// - - this._debug("onOpen: " + $(NODE).attr("id")); - - var nodes = $(NODE).find("ul > li"); - this._configureNodes(nodes); - - return true; - }, - onBeforeOpen: function(NODE, TREE_OBJ) { - /// Gets the node source from the meta data and assigns it to the tree prior to loading - var nodeDef = this._getNodeDef($(NODE)); - this._debug("onBeforeOpen: " + nodeDef.nodeId); - this._currentAJAXRequest = true; - TREE_OBJ.settings.data.url = this._getUrl(nodeDef.sourceUrl); + /// Before opening child nodes, ensure that the data method and url are set properly + this._currentAJAXRequest = true; + TREE_OBJ.settings.data.opts.url = this._dataUrl; + TREE_OBJ.settings.data.opts.method = "GET"; }, onJSONData: function(DATA, TREE_OBJ) { this._debug("onJSONData"); + this._currentAJAXRequest = false; + + if (typeof DATA.d != "undefined") { + + var msg = DATA.d; + //recreates the tree + if ($.inArray(msg.app, this._loadedApps) == -1) { + this._debug("loading js for app: " + msg.app); + this._loadedApps.push(msg.app); + //inject the scripts + this._container.after(""); + } + return eval(msg.json); + } + return DATA; }, - + + onBeforeRequest: function(NODE, TREE_OBJ) { + if (TREE_OBJ.settings.data.opts.method == "POST") { + var parameters = "{'app':'" + this._app + "','showContextMenu':'" + this._showContext + "', 'isDialog':'" + this._isDialog + "'}" + return parameters; + } + else { + var nodeDef = this.getNodeDef($(NODE)); + return this._getUrlParams(nodeDef.sourceUrl); + } + }, + onChange: function(NODE, TREE_OBJ) { - /// - /// Some code taken from the jsTree checkbox tree theme to allow for checkboxes - /// - if (this._treeType == "checkbox") { - var $this = $(NODE).is("li") ? $(NODE) : $(NODE).parent(); - if ($this.children("a").hasClass("checked")) $this.children("a").removeClass("checked") - else $this.children("a").addClass("checked"); - } - else if (this._treeType == "inheritedcheckbox") { - var $this = $(NODE).is("li") ? $(NODE) : $(NODE).parent(); - if ($this.children("a.unchecked").size() == 0) { - TREE_OBJ.container.find("a").addClass("unchecked"); - } - $this.children("a").removeClass("clicked"); - if ($this.children("a").hasClass("checked")) { - $this.find("li").andSelf().children("a").removeClass("checked").removeClass("undetermined").addClass("unchecked"); - var state = 0; - } - else { - $this.find("li").andSelf().children("a").removeClass("unchecked").removeClass("undetermined").addClass("checked"); - var state = 1; - } - $this.parents("li").each(function() { - if (state == 1) { - if ($(this).find("a.unchecked, a.undetermined").size() - 1 > 0) { - $(this).parents("li").andSelf().children("a").removeClass("unchecked").removeClass("checked").addClass("undetermined"); - return false; - } - else $(this).children("a").removeClass("unchecked").removeClass("undetermined").addClass("checked"); - } - else { - if ($(this).find("a.checked, a.undetermined").size() - 1 > 0) { - $(this).parents("li").andSelf().children("a").removeClass("unchecked").removeClass("checked").addClass("undetermined"); - return false; - } - else $(this).children("a").removeClass("checked").removeClass("undetermined").addClass("unchecked"); - } - }); - } - //bubble an event! $(this).trigger("nodeClicked", [NODE]); }, - onRightClick: function(NODE, TREE_OBJ, EV) { - /// Builds the context menu based on the current node - + onBeforeContext: function(NODE, TREE_OBJ, EV) { + //update the action node's NodeDefinition and set the active tree type - this._actionNode = this._getNodeDef($(NODE)); + this._actionNode = this.getNodeDef($(NODE)); this.setActiveTreeType($(NODE).attr("umb:type")); - this._debug("onRightClick: menu = " + this._actionNode.menu); - - //remove the old menu from the DOM as jsTree will keep appending new ones. - $("div").remove(".tree-default-context"); - - if (this._actionNode.menu != "") { - - //if there is a menu, then rebuilt the context menu - TREE_OBJ.settings.ui.context = this._getContextMenu(this._actionNode.menu); - TREE_OBJ.context_menu(); - - //now we need to bind events for hiding on a timer when lost focus - var timeout = null; - TREE_OBJ.context.mouseenter(function() { - clearTimeout(timeout); - }); - TREE_OBJ.context.mouseleave(function() { - timeout = setTimeout(function() { - TREE_OBJ.hide_context(); - }, 400); - }); - - this._checkContextMenu(TREE_OBJ); - } + this._debug("onBeforeContext: " + this._actionNode.menu); + + return this._actionNode.menu; }, + onLoad: function(TREE_OBJ) { + /// When the application first loads, load the child nodes + + this._debug("onLoad"); + + this._container.show(); + //ensure the static data is gone + this._tree.settings.data.opts.static = null; + var _this = this; + _this._loadChildNodes($(_this._container).find("li"), null); + }, + onBeforeMove: function(NODE,REF_NODE,TYPE,TREE_OBJ) { /// /// First, check if it's a move or a sort @@ -640,11 +575,11 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); /// Third, /// - var nodeDef = this._getNodeDef($(NODE)); + var nodeDef = this.getNodeDef($(NODE)); var nodeParent = nodeDef.jsNode.parents("li:first"); - var nodeParentDef = this._getNodeDef(nodeParent); + var nodeParentDef = this.getNodeDef(nodeParent); - var refNodeDef = this._getNodeDef($(REF_NODE)); + var refNodeDef = this.getNodeDef($(REF_NODE)); this._debug("onBeforeMove, TYPE: " + TYPE); this._debug("onBeforeMove, NODE ID: " + nodeDef.nodeId); @@ -674,35 +609,15 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); return false; }, - _checkContextMenu: function(TREE_OBJ, count) { - /// - /// we need to check if the menu is too low in the browser. - /// in order for this to work, we need to set a timer because there is no event - /// for when the context menu is displayed. - /// - - //this ensures there's no infinite loop looking for the context menu if an exception occurs - if (count > 20) - return; - - var isVisible = TREE_OBJ.context.is(":visible"); - if (!isVisible) { - this._debug("_checkContextMenu - waiting for visible menu"); - var _this = this; - setTimeout(function() { _this._checkContextMenu(TREE_OBJ, ++count); }, 50); - return; - } - var offset = TREE_OBJ.context.offset(); - var bodyHeight = $("body").innerHeight(); - var ctxHeight = TREE_OBJ.context.height(); - this._debug("_checkContextMenu - offset top: " + offset.top + ", bodyHeight: " + bodyHeight + ", ctxHeight: " + ctxHeight); - var diff = (offset.top + ctxHeight) - bodyHeight; - if (diff > 0) { - this._debug("_checkContextMenu - Menu needs adjusting, new top: " + diff); - TREE_OBJ.context.css("top", (offset.top - diff - 10) + "px"); - } + onParse: function(STR, TREE_OBJ) { + this._debug("onParse"); + + var obj = $(STR); + this._configureNodes(obj); + //this will return the full html of the configured node + return $('
    ').append($(obj).clone()).remove().html(); }, - + _debug: function(strMsg) { if (this._isDebug) { Sys.Debug.trace("UmbracoTree: " + strMsg); @@ -741,20 +656,30 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); $(this).children("a:first").before("
    "); } } - //create a div element inside the anchor and move the inner text into it - var txt = $(this).children("a").html(); - $(this).children("a").html("
    " + txt + "
    "); + //create a div for the text + var a = $(this).children("a"); + var ins = a.children("ins"); + var txt = $("
    " + a.text() + "
    "); + //check if it's not a sprite, if not then move the ins node just after the anchor, otherwise remove + if (a.hasClass("noSpr")) { + a.attr("style", ins.attr("style")); + } + else { + + } + a.html(txt); + ins.remove(); //add the loaded class to each element so we know not to process it again $(this).addClass("loaded"); }); }, - _getNodeDef: function(NODE) { + getNodeDef: function(NODE) { /// Converts a jquery node with metadata to a NodeDefinition //get our meta data stored with our node var nodedata = $(NODE).children("a").metadata({ type: 'attr', name: 'umb:nodedata' }); - this._debug("_getNodeDef: " + $(NODE).attr("id") + ", " + nodedata.nodeType + ", " + nodedata.source); + this._debug("getNodeDef: " + $(NODE).attr("id") + ", " + nodedata.nodeType + ", " + nodedata.source); var def = new Umbraco.Controls.NodeDefinition(); def.updateDefinition(this._tree, $(NODE), $(NODE).attr("id"), $(NODE).find("a > div").html(), nodedata.nodeType, nodedata.source, nodedata.menu, $(NODE).attr("umb:type")); return def; @@ -765,7 +690,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); var rNode = this.findNode(this._recycleBinId, true); if (rNode) { - this._actionNode = this._getNodeDef(rNode); + this._actionNode = this.getNodeDef(rNode); var _this = this; this.reloadActionNode(true, true, function(success) { if (success) { @@ -837,8 +762,8 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); var doReload = (forceReload && (numAsync == null || numAsync < 1)); this._debug("_syncTree: found! numAsync: " + numAsync + ", forceReload: " + forceReload); if (doReload) { - this._actionNode = this._getNodeDef(found); - this.reloadActionNode(true, true, null); + this._actionNode = this.getNodeDef(found); + this.reloadActionNode(false, true, null); } else { //we have found our node, select it but supress the selecting event @@ -850,34 +775,6 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); } }, - _getContextMenu: function(strMenu) { - /// Builds a new context menu object (array) based on the string representation passed in - - this._debug("_getContextMenu: " + strMenu); - - var newMenu = new Array(); - for (var i = 0; i < strMenu.length; i++) { - var letter = strMenu.charAt(i); - //get a js menu item by letter - var menuItem = this._getMenuItemByLetter(letter); - if (menuItem != null) newMenu.push(menuItem); - } - return newMenu; - }, - - _getMenuItemByLetter: function(letter) { - /// Finds the menu item in our full menu by the letter and returns object - - //insert selector if it's a comma - if (letter == ",") return "separator"; - for (var m in this._fullMenu) { - if (this._fullMenu[m].id == letter) { - return this._fullMenu[m]; - } - } - return null; - }, - _init: function(jFullMenu, jInitNode, treeContainer, appActions, uiKeys, app, showContext, isDialog, treeType, serviceUrl, dataUrl, umbClientFolder, recycleBinId) { /// initialization method, must be called on page ready. /// JSON markup for the full context menu in accordance with the jsTree context menu object standard @@ -919,71 +816,83 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); //initializes the jsTree this._container = treeContainer; - this._tree = $.tree_create(); + this._tree = $.tree.create(); this._tree.init(this._container, this._getInitOptions()); - this._tree.rename = this._umbracoRename; //replaces the jsTree rename method + //this._tree.rename = this._umbracoRename; //replaces the jsTree rename method //add this app to the loaded apps array - if ($.inArray(app, this._loadedApps) == -1) { - this._loadedApps.push(app); - } + //if ($.inArray(app, this._loadedApps) == -1) { + // this._loadedApps.push(app); + //} //load child nodes of the init node - this._loadChildNodes(this._container.find("li:first"), null); + //this._loadChildNodes(this._container.find("li:first"), null); }, - _umbracoRename : function (obj) { - /// A modified version of the original jsTree rename method. We need to use our own since - /// we've modified the rendering so much. This method replaces the tree rename method. - /// 'this' in this method context is jsTree. - /// - if(this.locked) return this.error("LOCKED"); - obj = obj ? this.get_node(obj) : this.selected; - var _this = this; - if(!obj || !obj.size()) return this.error("RENAME: NO NODE SELECTED"); - if(!this.check("renameable", obj)) return this.error("RENAME: NODE NOT RENAMABLE"); - if(!this.settings.callback.beforerename.call(null,obj.get(0), _this.current_lang, _this)) return this.error("RENAME: STOPPED BY USER"); +// _umbracoRename : function (obj) { +// /// A modified version of the original jsTree rename method. We need to use our own since +// /// we've modified the rendering so much. This method replaces the tree rename method. +// /// 'this' in this method context is jsTree. +// /// +// if(this.locked) return this.error("LOCKED"); +// obj = obj ? this.get_node(obj) : this.selected; +// var _this = this; +// if(!obj || !obj.size()) return this.error("RENAME: NO NODE SELECTED"); +// if(!this.check("renameable", obj)) return this.error("RENAME: NODE NOT RENAMABLE"); +// if(!this.settings.callback.beforerename.call(null,obj.get(0), _this.current_lang, _this)) return this.error("RENAME: STOPPED BY USER"); - obj.parents("li.closed").each(function () { _this.open_branch(this) }); - //if(this.current_lang) obj = obj.find("a." + this.current_lang).get(0); - //else obj = obj.find("a:first").get(0); - obj = obj.find("a:first div"); - last_value = obj.html(); - _this.inp = $(""); - _this.inp - .val(last_value.replace(/&/g,"&").replace(/>/g,">").replace(/</g,"<")) - .bind("mousedown", function (event) { event.stopPropagation(); }) - .bind("mouseup", function (event) { event.stopPropagation(); }) - .bind("click", function (event) { event.stopPropagation(); }) - .bind("keyup", function (event) { - var key = event.keyCode || event.which; - if(key == 27) { this.value = last_value; this.blur(); return } - if(key == 13) { this.blur(); return } - }); - // Rollback - var rb = {}; - rb[this.container.attr("id")] = this.get_rollback(); - - - var spn = $("
    ").addClass($(obj).parent().attr("class")).addClass("renaming").append(_this.inp); - spn.attr("style", $(obj).attr("style")); - obj.parent().hide(); - - obj.parents("li:first").prepend(spn); - //_this.inp.get(0).focus(); - //_this.inp.get(0).select(); - -// _this.inp.blur(function(event) { -// if(this.value == "") this.value = last_value; -// var li = obj.parents("li:first") -// obj.html(li.find("input").val()); -// obj.parent().show(); -// li.find("div.renaming").remove(); -// _this.settings.callback.onrename.call(null, _this.get_node(li).get(0), _this.current_lang, _this, rb); -// _this.inp = false; -// }); - }, +// obj.parents("li.closed").each(function () { _this.open_branch(this) }); +// //if(this.current_lang) obj = obj.find("a." + this.current_lang).get(0); +// //else obj = obj.find("a:first").get(0); +// obj = obj.find("a:first div"); +// last_value = obj.html(); +// _this.inp = $(""); +// _this.inp +// .val(last_value.replace(/&/g,"&").replace(/>/g,">").replace(/</g,"<")) +// .bind("mousedown", function (event) { event.stopPropagation(); }) +// .bind("mouseup", function (event) { event.stopPropagation(); }) +// .bind("click", function (event) { event.stopPropagation(); }) +// .bind("keyup", function (event) { +// var key = event.keyCode || event.which; +// if(key == 27) { this.value = last_value; this.blur(); return } +// if(key == 13) { this.blur(); return } +// }); +// // Rollback +// var rb = {}; +// rb[this.container.attr("id")] = this.get_rollback(); +// +// +// var spn = $("
    ").addClass($(obj).parent().attr("class")).addClass("renaming").append(_this.inp); +// spn.attr("style", $(obj).attr("style")); +// obj.parent().hide(); +// +// obj.parents("li:first").prepend(spn); +// //_this.inp.get(0).focus(); +// //_this.inp.get(0).select(); +// +//// _this.inp.blur(function(event) { +//// if(this.value == "") this.value = last_value; +//// var li = obj.parents("li:first") +//// obj.html(li.find("input").val()); +//// obj.parent().show(); +//// li.find("div.renaming").remove(); +//// _this.settings.callback.onrename.call(null, _this.get_node(li).get(0), _this.current_lang, _this, rb); +//// _this.inp = false; +//// }); +// }, + _getUrlParams: function(nodeSource) { + /// This converts Url query string params to json + var p = {}; + var sp = nodeSource.split("?")[1].split("&"); + for(var i=0;iReturns the json service url @@ -994,7 +903,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); return this._dataUrl + "?" + params + "&rnd2=" + Umbraco.Utils.generateRandom(); }, - _getInitOptions: function() { + _getInitOptions: function(initData) { /// return the initialization objects for the tree this._debug("_getInitOptions"); @@ -1005,44 +914,61 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); data: { type: "json", async: true, - url: "", - json: this._initNode, - async_data: function(NODE) { return null; } //ensures that the node id isn't appended to the async url + opts : { + static: initData == null ? null: initData, + method: "POST", + url: _this._serviceUrl, + outer_attrib: ["id", "umb:type", "class", "rel"], + inner_attrib: ["umb:nodedata", "href", "class", "style"] + } }, ui: { dots: false, rtl: false, animation: false, hover_mode: true, - theme_path: this._umb_clientFolderRoot + "/Tree/Themes/", - theme_name: "umbraco", - context: null //no context menu by default + //theme_path: this._umb_clientFolderRoot + "/Tree/Themes/", + theme_name: "umbraco" + //context: null //no context menu by default }, - lang: { + langs: { new_node: "New folder", loading: "
    " + (this._tree.settings.lang.loading || "Loading ...") + "
    " }, - rules: { - metadata: "umb:nodedata", - creatable: "none", - draggable: (!this._isEditMode ? "none" : ["dataNode"]), - - }, callback: { + //ensures that the node id isn't appended to the async url + beforedata: function(N, T) { return _this.onBeforeRequest(N,T); }, //wrapped functions maintain scope in callback - onrgtclk: function(N, T, E) { _this.onRightClick(N, T, E) }, - beforemove : function(N,RN,TYPE,T) { _this.onBeforeMove(N,RN,TYPE,T) }, - beforeopen: function(N, T) { _this.onBeforeOpen(N, T) }, - onopen: function(N, T) { _this.onOpen(N, T) }, - onselect: function(N, T) { _this.onSelect(N, T) }, - onchange: function(N, T) { _this.onChange(N, T) }, - onJSONdata: function(D, T) { return _this.onJSONData(D, T) } + beforemove : function(N,RN,TYPE,T) { _this.onBeforeMove(N,RN,TYPE,T); }, + beforeopen: function(N, T) { _this.onBeforeOpen(N, T); }, + onselect: function(N, T) { _this.onSelect(N, T); }, + onchange: function(N, T) { _this.onChange(N, T); }, + ondata: function(D, T) { return _this.onJSONData(D, T); }, + onload: function(T) { if (initData == null) _this.onLoad(T); }, + onparse: function(S,T) { return _this.onParse(S,T); } + }, + plugins: { + //UmbracoContext comes before context menu so that the events fire first + UmbracoContext: { + fullMenu: _this._fullMenu, + onBeforeContext: function(N,T,E) { return _this.onBeforeContext(N,T,E); } + }, + contextmenu: {} } }; + if (this._treeType != "standard") { + options.plugins.checkbox = {three_state:false} + } + + //set global ajax settings: + $.ajaxSetup({ + contentType: "application/json; charset=utf-8" + }); + return options; } }; } -})(jQuery); \ No newline at end of file +})(jQuery); diff --git a/umbraco/presentation/umbraco_client/Tree/css.js b/umbraco/presentation/umbraco_client/Tree/css.js deleted file mode 100644 index 4a6dfcfc68..0000000000 --- a/umbraco/presentation/umbraco_client/Tree/css.js +++ /dev/null @@ -1,50 +0,0 @@ -function get_css(rule_name, stylesheet, delete_flag) { - if (!document.styleSheets) return false; - rule_name = rule_name.toLowerCase(); stylesheet = stylesheet || 0; - for (var i = stylesheet; i < document.styleSheets.length; i++) { - var styleSheet = document.styleSheets[i]; css_rules = document.styleSheets[i].cssRules || document.styleSheets[i].rules; - if(!css_rules) continue; - var j = 0; - do { - if(css_rules[j].selectorText.toLowerCase() == rule_name) { - if(delete_flag == true) { - if(document.styleSheets[i].removeRule) document.styleSheets[i].removeRule(j); - if(document.styleSheets[i].deleteRule) document.styleSheets[i].deleteRule(j); - return true; - } - else return css_rules[j]; - } - } - while (css_rules[++j]); - } - return false; -} -function add_css(rule_name, stylesheet) { - rule_name = rule_name.toLowerCase(); stylesheet = stylesheet || 0; - if (!document.styleSheets || get_css(rule_name, stylesheet)) return false; - (document.styleSheets[stylesheet].addRule) ? document.styleSheets[stylesheet].addRule(rule_name, null, 0) : document.styleSheets[stylesheet].insertRule(rule_name+' { }', 0); - return get_css(rule_name); -} -function get_sheet_num (href_name) { - if (!document.styleSheets) return false; - for (var i = 0; i < document.styleSheets.length; i++) { if(document.styleSheets[i].href && document.styleSheets[i].href.toString().match(href_name)) return i; } - return false; -} -function remove_css(rule_name, stylesheet) { return get_css(rule_name, stylesheet, true); } - -function add_sheet(url, media) { - if(document.createStyleSheet) { - document.createStyleSheet(url); - } - else { - var newSS = document.createElement('link'); - newSS.rel = 'stylesheet'; - newSS.type = 'text/css'; - newSS.media = media || "all"; - - newSS.href = url; - // var styles = "@import url(' " + url + " ');"; - // newSS.href ='data:text/css,'+escape(styles); - document.getElementsByTagName("head")[0].appendChild(newSS); - } -} \ No newline at end of file diff --git a/umbraco/presentation/umbraco_client/Tree/jquery.tree.checkbox.js b/umbraco/presentation/umbraco_client/Tree/jquery.tree.checkbox.js new file mode 100644 index 0000000000..a31e0d6b9f --- /dev/null +++ b/umbraco/presentation/umbraco_client/Tree/jquery.tree.checkbox.js @@ -0,0 +1,75 @@ +(function ($) { + $.extend($.tree.plugins, { + "checkbox" : { + defaults : { + three_state : true + }, + get_checked : function (t) { + if(!t) t = $.tree.focused(); + return t.container.find("a.checked").parent(); + }, + get_undeterminded : function (t) { + if(!t) t = $.tree.focused(); + return t.container.find("a.undetermined").parent(); + }, + get_unchecked : function (t) { + if(!t) t = $.tree.focused(); + return t.container.find("a:not(.checked, .undetermined)").parent(); + }, + + check : function (n) { + if(!n) return false; + var t = $.tree.reference(n); + n = t.get_node(n); + if(n.children("a").hasClass("checked")) return true; + + var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox); + if(opts.three_state) { + n.find("li").andSelf().children("a").removeClass("unchecked undetermined").addClass("checked"); + n.parents("li").each(function () { + if($(this).children("ul").find("a:not(.checked):eq(0)").size() > 0) { + $(this).parents("li").andSelf().children("a").removeClass("unchecked checked").addClass("undetermined"); + return false; + } + else $(this).children("a").removeClass("unchecked undetermined").addClass("checked"); + }); + } + else n.children("a").removeClass("unchecked").addClass("checked"); + return true; + }, + uncheck : function (n) { + if(!n) return false; + var t = $.tree.reference(n); + n = t.get_node(n); + if(n.children("a").hasClass("unchecked")) return true; + + var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox); + if(opts.three_state) { + n.find("li").andSelf().children("a").removeClass("checked undetermined").addClass("unchecked"); + n.parents("li").each(function () { + if($(this).find("a.checked, a.undetermined").size() - 1 > 0) { + $(this).parents("li").andSelf().children("a").removeClass("unchecked checked").addClass("undetermined"); + return false; + } + else $(this).children("a").removeClass("checked undetermined").addClass("unchecked"); + }); + } + else n.children("a").removeClass("checked").addClass("unchecked"); + return true; + }, + toggle : function (n) { + if(!n) return false; + var t = $.tree.reference(n); + n = t.get_node(n); + if(n.children("a").hasClass("checked")) $.tree.plugins.checkbox.uncheck(n); + else $.tree.plugins.checkbox.check(n); + }, + + callbacks : { + onchange : function(n, t) { + $.tree.plugins.checkbox.toggle(n); + } + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/umbraco/presentation/umbraco_client/Tree/jquery.tree.contextmenu.js b/umbraco/presentation/umbraco_client/Tree/jquery.tree.contextmenu.js new file mode 100644 index 0000000000..6401cb3ef0 --- /dev/null +++ b/umbraco/presentation/umbraco_client/Tree/jquery.tree.contextmenu.js @@ -0,0 +1,129 @@ +(function ($) { + $.extend($.tree.plugins, { + "contextmenu" : { + object : $("
      "), + data : { + t : false, + a : false, + r : false + }, + + defaults : { + class_name : "hover", + items : { + create : { + label : "Create", + icon : "create", + visible : function (NODE, TREE_OBJ) { if(NODE.length != 1) return 0; return TREE_OBJ.check("creatable", NODE); }, + action : function (NODE, TREE_OBJ) { TREE_OBJ.create(false, TREE_OBJ.get_node(NODE[0])); }, + separator_after : true + }, + rename : { + label : "Rename", + icon : "rename", + visible : function (NODE, TREE_OBJ) { if(NODE.length != 1) return false; return TREE_OBJ.check("renameable", NODE); }, + action : function (NODE, TREE_OBJ) { TREE_OBJ.rename(NODE); } + }, + remove : { + label : "Delete", + icon : "remove", + visible : function (NODE, TREE_OBJ) { var ok = true; $.each(NODE, function () { if(TREE_OBJ.check("deletable", this) == false) ok = false; return false; }); return ok; }, + action : function (NODE, TREE_OBJ) { $.each(NODE, function () { TREE_OBJ.remove(this); }); } + } + } + }, + show : function(obj, t) { + var opts = $.extend(true, {}, $.tree.plugins.contextmenu.defaults, t.settings.plugins.contextmenu); + obj = $(obj); + $.tree.plugins.contextmenu.object.empty(); + var str = ""; + var cnt = 0; + for(var i in opts.items) { + if(!opts.items.hasOwnProperty(i)) continue; + if(opts.items[i] === false) continue; + var r = 1; + if(typeof opts.items[i].visible == "function") r = opts.items[i].visible.call(null, $.tree.plugins.contextmenu.data.a, t); + if(r == -1) continue; + else cnt ++; + if(opts.items[i].separator_before === true) str += "
    •  
    • "; + str += '
    • '; + if(opts.items[i].icon) str += " "; + else str += " "; + str += "" + opts.items[i].label + '
    • '; + if(opts.items[i].separator_after === true) str += "
    •  
    • "; + } + var tmp = obj.children("a:visible").offset(); + $.tree.plugins.contextmenu.object.attr("class","tree-context tree-" + t.settings.ui.theme_name.toString() + "-context").html(str); + var h = $.tree.plugins.contextmenu.object.height(); + var w = $.tree.plugins.contextmenu.object.width(); + var x = tmp.left; + var y = tmp.top + parseInt(obj.children("a:visible").height()) + 2; + var max_y = $(window).height() + $(window).scrollTop(); + var max_x = $(window).width() + $(window).scrollLeft(); + if(y + h > max_y) y = Math.max( (max_y - h - 2), 0); + if(x + w > max_x) x = Math.max( (max_x - w - 2), 0); + $.tree.plugins.contextmenu.object.css({ "left" : (x), "top" : (y) }).fadeIn("fast"); + }, + hide : function () { + if(!$.tree.plugins.contextmenu.data.t) return; + var opts = $.extend(true, {}, $.tree.plugins.contextmenu.defaults, $.tree.plugins.contextmenu.data.t.settings.plugins.contextmenu); + if($.tree.plugins.contextmenu.data.r && $.tree.plugins.contextmenu.data.a) { + $.tree.plugins.contextmenu.data.a.children("a, span").removeClass(opts.class_name); + } + $.tree.plugins.contextmenu.data = { a : false, r : false, t : false }; + $.tree.plugins.contextmenu.object.fadeOut("fast"); + }, + exec : function (cmd) { + if($.tree.plugins.contextmenu.data.t == false) return; + var opts = $.extend(true, {}, $.tree.plugins.contextmenu.defaults, $.tree.plugins.contextmenu.data.t.settings.plugins.contextmenu); + try { opts.items[cmd].action.apply(null, [$.tree.plugins.contextmenu.data.a, $.tree.plugins.contextmenu.data.t]); } catch(e) { }; + }, + + callbacks : { + oninit : function () { + if(!$.tree.plugins.contextmenu.css) { + var css = '#jstree-contextmenu { display:none; position:absolute; z-index:2000; list-style-type:none; margin:0; padding:0; left:-2000px; top:-2000px; } .tree-context { margin:20px; padding:0; width:180px; border:1px solid #979797; padding:2px; background:#f5f5f5; list-style-type:none; }.tree-context li { height:22px; margin:0 0 0 27px; padding:0; background:#ffffff; border-left:1px solid #e0e0e0; }.tree-context li a { position:relative; display:block; height:22px; line-height:22px; margin:0 0 0 -28px; text-decoration:none; color:black; padding:0; }.tree-context li a ins { text-decoration:none; float:left; width:16px; height:16px; margin:0 0 0 0; background-color:#f0f0f0; border:1px solid #f0f0f0; border-width:3px 5px 3px 6px; line-height:16px; }.tree-context li a span { display:block; background:#f0f0f0; margin:0 0 0 29px; padding-left:5px; }.tree-context li.separator { background:#f0f0f0; height:2px; line-height:2px; font-size:1px; border:0; margin:0; padding:0; }.tree-context li.separator span { display:block; margin:0px 0 0px 27px; height:1px; border-top:1px solid #e0e0e0; border-left:1px solid #e0e0e0; line-height:1px; font-size:1px; background:white; }.tree-context li a:hover { border:1px solid #d8f0fa; height:20px; line-height:20px; }.tree-context li a:hover span { background:#e7f4f9; margin-left:28px; }.tree-context li a:hover ins { background-color:#e7f4f9; border-color:#e7f4f9; border-width:2px 5px 2px 5px; }.tree-context li a.disabled { color:gray; }.tree-context li a.disabled ins { }.tree-context li a.disabled:hover { border:0; height:22px; line-height:22px; }.tree-context li a.disabled:hover span { background:#f0f0f0; margin-left:29px; }.tree-context li a.disabled:hover ins { border-color:#f0f0f0; background-color:#f0f0f0; border-width:3px 5px 3px 6px; }'; + $.tree.plugins.contextmenu.css = this.add_sheet({ str : css }); + } + }, + onrgtclk : function (n, t, e) { + var opts = $.extend(true, {}, $.tree.plugins.contextmenu.defaults, t.settings.plugins.contextmenu); + n = $(n); + if(n.size() == 0) return; + $.tree.plugins.contextmenu.data.t = t; + if(!n.children("a:eq(0)").hasClass("clicked")) { + $.tree.plugins.contextmenu.data.a = n; + $.tree.plugins.contextmenu.data.r = true; + n.children("a").addClass(opts.class_name); + e.target.blur(); + } + else { + $.tree.plugins.contextmenu.data.r = false; + $.tree.plugins.contextmenu.data.a = (t.selected_arr && t.selected_arr.length > 1) ? t.selected_arr : t.selected; + } + $.tree.plugins.contextmenu.show(n, t); + e.preventDefault(); + e.stopPropagation(); + // return false; // commented out because you might want to do something in your own callback + }, + onchange : function () { $.tree.plugins.contextmenu.hide(); }, + beforedata : function () { $.tree.plugins.contextmenu.hide(); }, + ondestroy : function () { $.tree.plugins.contextmenu.hide(); } + } + } + }); + $(function () { + $.tree.plugins.contextmenu.object.hide().appendTo("body"); + $("#jstree-contextmenu a") + .live("click", function (event) { + if(!$(this).hasClass("disabled")) { + $.tree.plugins.contextmenu.exec.apply(null, [$(this).attr("rel")]); + $.tree.plugins.contextmenu.hide(); + } + event.stopPropagation(); + event.preventDefault(); + return false; + }) + $(document).bind("mousedown", function(event) { if($(event.target).parents("#jstree-contextmenu").size() == 0) $.tree.plugins.contextmenu.hide(); }); + }); +})(jQuery); \ No newline at end of file diff --git a/umbraco/presentation/umbraco_client/Tree/jquery.tree.js b/umbraco/presentation/umbraco_client/Tree/jquery.tree.js new file mode 100644 index 0000000000..13360aaf38 --- /dev/null +++ b/umbraco/presentation/umbraco_client/Tree/jquery.tree.js @@ -0,0 +1,2061 @@ +/* + * jsTree 0.9.9a + * http://jstree.com/ + * + * Copyright (c) 2009 Ivan Bozhanov (vakata.com) + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Date: 2009-10-06 + * + */ + +(function($) { + // jQuery plugin + $.tree = { + datastores : { }, + plugins : { }, + defaults : { + data : { + async : false, // Are async requests used to load open_branch contents + type : "html", // One of included datastores + opts : { method: "GET", url: false } // Options passed to datastore + }, + selected : false, // FALSE or STRING or ARRAY + opened : [], // ARRAY OF INITIALLY OPENED NODES + languages : [], // ARRAY of string values (which will be used as CSS classes - so they must be valid) + ui : { + dots : true, // BOOL - dots or no dots + animation : 0, // INT - duration of open/close animations in miliseconds + scroll_spd : 4, + theme_path : false, // Path to the theme CSS file - if set to false and theme_name is not false - will lookup jstree-path-here/themes/theme-name-here/style.css + theme_name : "default",// if set to false no theme will be loaded + selected_parent_close : "select_parent", // false, "deselect", "select_parent" + selected_delete : "select_previous" // false, "select_previous" + }, + types : { + "default" : { + clickable : true, // can be function + renameable : true, // can be function + deletable : true, // can be function + creatable : true, // can be function + draggable : true, // can be function + max_children : -1, // -1 - not set, 0 - no children, 1 - one child, etc // can be function + max_depth : -1, // -1 - not set, 0 - no children, 1 - one level of children, etc // can be function + valid_children : "all", // all, none, array of values // can be function + icon : { + image : false, + position : false + } + } + }, + rules : { + multiple : false, // FALSE | CTRL | ON - multiple selection off/ with or without holding Ctrl + multitree : "none", // all, none, array of tree IDs to accept from + type_attr : "rel", // STRING attribute name (where is the type stored as string) + createat : "bottom", // STRING (top or bottom) new nodes get inserted at top or bottom + drag_copy : "ctrl", // FALSE | CTRL | ON - drag to copy off/ with or without holding Ctrl + drag_button : "left", // left, right or both + use_max_children : true, + use_max_depth : true, + + max_children: -1, + max_depth : -1, + valid_children : "all" + }, + lang : { + new_node : "New folder", + loading : "Loading ..." + }, + callback : { + beforechange: function(NODE,TREE_OBJ) { return true }, + beforeopen : function(NODE,TREE_OBJ) { return true }, + beforeclose : function(NODE,TREE_OBJ) { return true }, + beforemove : function(NODE,REF_NODE,TYPE,TREE_OBJ) { return true }, + beforecreate: function(NODE,REF_NODE,TYPE,TREE_OBJ) { return true }, + beforerename: function(NODE,LANG,TREE_OBJ) { return true }, + beforedelete: function(NODE,TREE_OBJ) { return true }, + beforedata : function(NODE,TREE_OBJ) { return { id : $(NODE).attr("id") || 0 } }, // PARAMETERS PASSED TO SERVER + ondata : function(DATA,TREE_OBJ) { return DATA; }, // modify data before parsing it + onparse : function(STR,TREE_OBJ) { return STR; }, // modify string before visualizing it + onhover : function(NODE,TREE_OBJ) { }, // node hovered + onselect : function(NODE,TREE_OBJ) { }, // node selected + ondeselect : function(NODE,TREE_OBJ) { }, // node deselected + onchange : function(NODE,TREE_OBJ) { }, // focus changed + onrename : function(NODE,TREE_OBJ,RB) { }, // node renamed + onmove : function(NODE,REF_NODE,TYPE,TREE_OBJ,RB) { }, // move completed + oncopy : function(NODE,REF_NODE,TYPE,TREE_OBJ,RB) { }, // copy completed + oncreate : function(NODE,REF_NODE,TYPE,TREE_OBJ,RB) { }, // node created + ondelete : function(NODE,TREE_OBJ,RB) { }, // node deleted + onopen : function(NODE,TREE_OBJ) { }, // node opened + onopen_all : function(TREE_OBJ) { }, // all nodes opened + onclose_all : function(TREE_OBJ) { }, // all nodes closed + onclose : function(NODE,TREE_OBJ) { }, // node closed + error : function(TEXT,TREE_OBJ) { }, // error occured + ondblclk : function(NODE,TREE_OBJ) { TREE_OBJ.toggle_branch.call(TREE_OBJ, NODE); TREE_OBJ.select_branch.call(TREE_OBJ, NODE); }, + onrgtclk : function(NODE,TREE_OBJ,EV) { }, // right click - to prevent use: EV.preventDefault(); EV.stopPropagation(); return false + onload : function(TREE_OBJ) { }, + oninit : function(TREE_OBJ) { }, + onfocus : function(TREE_OBJ) { }, + ondestroy : function(TREE_OBJ) { }, + onsearch : function(NODES, TREE_OBJ) { NODES.addClass("search"); }, + ondrop : function(NODE,REF_NODE,TYPE,TREE_OBJ) { }, + check : function(RULE,NODE,VALUE,TREE_OBJ) { return VALUE; }, + check_move : function(NODE,REF_NODE,TYPE,TREE_OBJ) { return true; } + }, + plugins : { } + }, + + create : function () { return new tree_component(); }, + focused : function () { return tree_component.inst[tree_component.focused]; }, + reference : function (obj) { + var o = $(obj); + if(!o.size()) o = $("#" + obj); + if(!o.size()) return null; + o = (o.is(".tree")) ? o.attr("id") : o.parents(".tree:eq(0)").attr("id"); + return tree_component.inst[o] || null; + }, + rollback : function (data) { + for(var i in data) { + if(!data.hasOwnProperty(i)) continue; + var tmp = tree_component.inst[i]; + var lock = !tmp.locked; + + // if not locked - lock the tree + if(lock) tmp.lock(true); + // Cancel ongoing rename + tmp.inp = false; + tmp.container.html(data[i].html).find(".dragged").removeClass("dragged").end().find(".hover").removeClass("hover"); + + if(data[i].selected) { + tmp.selected = $("#" + data[i].selected); + tmp.selected_arr = []; + tmp.container + .find("a.clicked").each( function () { + tmp.selected_arr.push(tmp.get_node(this)); + }); + } + // if this function set the lock - unlock + if(lock) tmp.lock(false); + + delete lock; + delete tmp; + } + }, + drop_mode : function (opts) { + opts = $.extend(opts, { show : false, type : "default", str : "Foreign node" }); + tree_component.drag_drop.foreign = true; + tree_component.drag_drop.isdown = true; + tree_component.drag_drop.moving = true; + tree_component.drag_drop.appended = false; + tree_component.drag_drop.f_type = opts.type; + tree_component.drag_drop.f_data = opts; + + + if(!opts.show) { + tree_component.drag_drop.drag_help = false; + tree_component.drag_drop.drag_node = false; + } + else { + tree_component.drag_drop.drag_help = $(""); + tree_component.drag_drop.drag_node = tree_component.drag_drop.drag_help.find("li:eq(0)"); + } + if($.tree.drag_start !== false) $.tree.drag_start.call(null, false); + }, + drag_start : false, + drag : false, + drag_end : false + }; + $.fn.tree = function (opts) { + return this.each(function() { + var conf = $.extend({},opts); + if(tree_component.inst && tree_component.inst[$(this).attr('id')]) tree_component.inst[$(this).attr('id')].destroy(); + if(conf !== false) new tree_component().init(this, conf); + }); + }; + + // core + function tree_component () { + return { + cntr : ++tree_component.cntr, + settings : $.extend({},$.tree.defaults), + + init : function(elem, conf) { + var _this = this; + this.container = $(elem); + if(this.container.size == 0) return false; + tree_component.inst[this.cntr] = this; + if(!this.container.attr("id")) this.container.attr("id","jstree_" + this.cntr); + tree_component.inst[this.container.attr("id")] = tree_component.inst[this.cntr]; + tree_component.focused = this.cntr; + this.settings = $.extend(true, {}, this.settings, conf); + + // DEAL WITH LANGUAGE VERSIONS + if(this.settings.languages && this.settings.languages.length) { + this.current_lang = this.settings.languages[0]; + var st = false; + var id = "#" + this.container.attr("id"); + for(var ln = 0; ln < this.settings.languages.length; ln++) { + st = tree_component.add_css(id + " ." + this.settings.languages[ln]); + if(st !== false) st.style.display = (this.settings.languages[ln] == this.current_lang) ? "" : "none"; + } + } + else this.current_lang = false; + // THEMES + this.container.addClass("tree"); + if(this.settings.ui.theme_name !== false) { + if(this.settings.ui.theme_path === false) { + $("script").each(function () { + if(this.src.toString().match(/jquery\.tree.*?js$/)) { _this.settings.ui.theme_path = this.src.toString().replace(/jquery\.tree.*?js$/, "") + "themes/" + _this.settings.ui.theme_name + "/style.css"; return false; } + }); + } + if(this.settings.ui.theme_path != "" && $.inArray(this.settings.ui.theme_path, tree_component.themes) == -1) { + tree_component.add_sheet({ url : this.settings.ui.theme_path }); + tree_component.themes.push(this.settings.ui.theme_path); + } + this.container.addClass("tree-" + this.settings.ui.theme_name); + } + // TYPE ICONS + var type_icons = ""; + for(var t in this.settings.types) { + if(!this.settings.types.hasOwnProperty(t)) continue; + if(!this.settings.types[t].icon) continue; + if( this.settings.types[t].icon.image || this.settings.types[t].icon.position) { + if(t == "default") type_icons += "#" + this.container.attr("id") + " li > a ins { "; + else type_icons += "#" + this.container.attr("id") + " li[rel=" + t + "] > a ins { "; + if(this.settings.types[t].icon.image) type_icons += " background-image:url(" + this.settings.types[t].icon.image + "); "; + if(this.settings.types[t].icon.position) type_icons += " background-position:" + this.settings.types[t].icon.position + "; "; + type_icons += "} "; + } + } + if(type_icons != "") tree_component.add_sheet({ str : type_icons }); + + if(this.settings.rules.multiple) this.selected_arr = []; + this.offset = false; + this.hovered = false; + this.locked = false; + + if(tree_component.drag_drop.marker === false) tree_component.drag_drop.marker = $("
      ").attr({ id : "jstree-marker" }).hide().appendTo("body"); + this.callback("oninit", [this]); + this.refresh(); + this.attach_events(); + this.focus(); + }, + refresh : function (obj) { + if(this.locked) return this.error("LOCKED"); + var _this = this; + if(obj && !this.settings.data.async) obj = false; + this.is_partial_refresh = obj ? true : false; + + // SAVE OPENED + this.opened = Array(); + if(this.settings.opened != false) { + $.each(this.settings.opened, function (i, item) { + if(this.replace(/^#/,"").length > 0) { _this.opened.push("#" + this.replace(/^#/,"")); } + }); + this.settings.opened = false; + } + else { + this.container.find("li.open").each(function (i) { if(this.id) { _this.opened.push("#" + this.id); } }); + } + + // SAVE SELECTED + if(this.selected) { + this.settings.selected = Array(); + if(obj) { + $(obj).find("li:has(a.clicked)").each(function () { + if(this.id) _this.settings.selected.push("#" + this.id); + }); + } + else { + if(this.selected_arr) { + $.each(this.selected_arr, function () { + if(this.attr("id")) _this.settings.selected.push("#" + this.attr("id")); + }); + } + else { + if(this.selected.attr("id")) this.settings.selected.push("#" + this.selected.attr("id")); + } + } + } + else if(this.settings.selected !== false) { + var tmp = Array(); + if((typeof this.settings.selected).toLowerCase() == "object") { + $.each(this.settings.selected, function () { + if(this.replace(/^#/,"").length > 0) tmp.push("#" + this.replace(/^#/,"")); + }); + } + else { + if(this.settings.selected.replace(/^#/,"").length > 0) tmp.push("#" + this.settings.selected.replace(/^#/,"")); + } + this.settings.selected = tmp; + } + + if(obj && this.settings.data.async) { + this.opened = Array(); + obj = this.get_node(obj); + obj.find("li.open").each(function (i) { _this.opened.push("#" + this.id); }); + if(obj.hasClass("open")) obj.removeClass("open").addClass("closed"); + if(obj.hasClass("leaf")) obj.removeClass("leaf"); + obj.children("ul:eq(0)").html(""); + return this.open_branch(obj, true, function () { _this.reselect.apply(_this); }); + } + + var _this = this; + var _datastore = new $.tree.datastores[this.settings.data.type](); + if(this.container.children("ul").size() == 0) { + this.container.html(""); + } + _datastore.load(this.callback("beforedata",[false,this]),this,this.settings.data.opts,function(data) { + data = _this.callback("ondata",[data, _this]); + _datastore.parse(data,_this,_this.settings.data.opts,function(str) { + str = _this.callback("onparse", [str, _this]); + _this.container.empty().append($("
        ").html(str)); + _this.container.find("li:last-child").addClass("last").end().find("li:has(ul)").not(".open").addClass("closed"); + _this.container.find("li").not(".open").not(".closed").addClass("leaf"); + _this.reselect(); + }); + }); + }, + reselect : function (is_callback) { + var _this = this; + + if(!is_callback) this.cl_count = 0; + else this.cl_count --; + // REOPEN BRANCHES + if(this.opened && this.opened.length) { + var opn = false; + for(var j = 0; this.opened && j < this.opened.length; j++) { + if(this.settings.data.async) { + var tmp = this.get_node(this.opened[j]); + if(tmp.size() && tmp.hasClass("closed") > 0) { + opn = true; + var tmp = this.opened[j].toString().replace('/','\\/'); + delete this.opened[j]; + this.open_branch(tmp, true, function () { _this.reselect.apply(_this, [true]); } ); + this.cl_count ++; + } + } + else this.open_branch(this.opened[j], true); + } + if(this.settings.data.async && opn) return; + if(this.cl_count > 0) return; + delete this.opened; + } + if(this.cl_count > 0) return; + + // DOTS and RIGHT TO LEFT + this.container.css("direction","ltr").children("ul:eq(0)").addClass("ltr"); + if(this.settings.ui.dots == false) this.container.children("ul:eq(0)").addClass("no_dots"); + + // REPOSITION SCROLL + if(this.scrtop) { + this.container.scrollTop(_this.scrtop); + delete this.scrtop; + } + // RESELECT PREVIOUSLY SELECTED + if(this.settings.selected !== false) { + $.each(this.settings.selected, function (i) { + if(_this.is_partial_refresh) _this.select_branch($(_this.settings.selected[i].toString().replace('/','\\/'), _this.container), (_this.settings.rules.multiple !== false) ); + else _this.select_branch($(_this.settings.selected[i].toString().replace('/','\\/'), _this.container), (_this.settings.rules.multiple !== false && i > 0) ); + }); + this.settings.selected = false; + } + this.callback("onload", [_this]); + }, + + get : function (obj, format, opts) { + if(!format) format = this.settings.data.type; + if(!opts) opts = this.settings.data.opts; + return new $.tree.datastores[format]().get(obj, this, opts); + }, + + attach_events : function () { + var _this = this; + + this.container + .bind("mousedown.jstree", function (event) { + if(tree_component.drag_drop.isdown) { + tree_component.drag_drop.move_type = false; + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + return false; + } + }) + .bind("mouseup.jstree", function (event) { + setTimeout( function() { _this.focus.apply(_this); }, 5); + }) + .bind("click.jstree", function (event) { + //event.stopPropagation(); + return true; + }); + $("#" + this.container.attr("id") + " li") + .live("click", function(event) { // WHEN CLICK IS ON THE ARROW + if(event.target.tagName != "LI") return true; + _this.off_height(); + if(event.pageY - $(event.target).offset().top > _this.li_height) return true; + _this.toggle_branch.apply(_this, [event.target]); + event.stopPropagation(); + return false; + }); + $("#" + this.container.attr("id") + " li a") + .live("click.jstree", function (event) { // WHEN CLICK IS ON THE TEXT OR ICON + if(event.which && event.which == 3) return true; + if(_this.locked) { + event.preventDefault(); + event.target.blur(); + return _this.error("LOCKED"); + } + _this.select_branch.apply(_this, [event.target, event.ctrlKey || _this.settings.rules.multiple == "on"]); + if(_this.inp) { _this.inp.blur(); } + event.preventDefault(); + event.target.blur(); + return false; + }) + .live("dblclick.jstree", function (event) { // WHEN DOUBLECLICK ON TEXT OR ICON + if(_this.locked) { + event.preventDefault(); + event.stopPropagation(); + event.target.blur(); + return _this.error("LOCKED"); + } + _this.callback("ondblclk", [_this.get_node(event.target).get(0), _this]); + event.preventDefault(); + event.stopPropagation(); + event.target.blur(); + }) + .live("contextmenu.jstree", function (event) { + if(_this.locked) { + event.target.blur(); + return _this.error("LOCKED"); + } + return _this.callback("onrgtclk", [_this.get_node(event.target).get(0), _this, event]); + }) + .live("mouseover.jstree", function (event) { + if(_this.locked) { + event.preventDefault(); + event.stopPropagation(); + return _this.error("LOCKED"); + } + if(_this.hovered !== false && (event.target.tagName == "A" || event.target.tagName == "INS")) { + _this.hovered.children("a").removeClass("hover"); + _this.hovered = false; + } + _this.callback("onhover",[_this.get_node(event.target).get(0), _this]); + }) + .live("mousedown.jstree", function (event) { + if(_this.settings.rules.drag_button == "left" && event.which && event.which != 1) return true; + if(_this.settings.rules.drag_button == "right" && event.which && event.which != 3) return true; + _this.focus.apply(_this); + if(_this.locked) return _this.error("LOCKED"); + // SELECT LIST ITEM NODE + var obj = _this.get_node(event.target); + // IF ITEM IS DRAGGABLE + if(_this.settings.rules.multiple != false && _this.selected_arr.length > 1 && obj.children("a:eq(0)").hasClass("clicked")) { + var counter = 0; + for(var i in _this.selected_arr) { + if(!_this.selected_arr.hasOwnProperty(i)) continue; + if(_this.check("draggable", _this.selected_arr[i])) { + _this.selected_arr[i].addClass("dragged"); + tree_component.drag_drop.origin_tree = _this; + counter ++; + } + } + if(counter > 0) { + if(_this.check("draggable", obj)) tree_component.drag_drop.drag_node = obj; + else tree_component.drag_drop.drag_node = _this.container.find("li.dragged:eq(0)"); + tree_component.drag_drop.isdown = true; + tree_component.drag_drop.drag_help = $("
        ").append("
          "); + var tmp = tree_component.drag_drop.drag_node.clone(); + if(_this.settings.languages.length > 0) tmp.find("a").not("." + _this.current_lang).hide(); + tree_component.drag_drop.drag_help.children("ul:eq(0)").append(tmp); + tree_component.drag_drop.drag_help.find("li:eq(0)").removeClass("last").addClass("last").children("a").html(" Multiple selection").end().children("ul").remove(); + + tree_component.drag_drop.dragged = _this.container.find("li.dragged"); + } + } + else { + if(_this.check("draggable", obj)) { + tree_component.drag_drop.drag_node = obj; + tree_component.drag_drop.drag_help = $("
          ").append("
            "); + var tmp = obj.clone(); + if(_this.settings.languages.length > 0) tmp.find("a").not("." + _this.current_lang).hide(); + tree_component.drag_drop.drag_help.children("ul:eq(0)").append(tmp); + tree_component.drag_drop.drag_help.find("li:eq(0)").removeClass("last").addClass("last"); + tree_component.drag_drop.isdown = true; + tree_component.drag_drop.foreign = false; + tree_component.drag_drop.origin_tree = _this; + obj.addClass("dragged"); + + tree_component.drag_drop.dragged = _this.container.find("li.dragged"); + } + } + tree_component.drag_drop.init_x = event.pageX; + tree_component.drag_drop.init_y = event.pageY; + obj.blur(); + event.preventDefault(); + event.stopPropagation(); + return false; + }); + }, + focus : function () { + if(this.locked) return false; + if(tree_component.focused != this.cntr) { + tree_component.focused = this.cntr; + this.callback("onfocus",[this]); + } + }, + + off_height : function () { + if(this.offset === false) { + this.container.css({ position : "relative" }); + this.offset = this.container.offset(); + var tmp = 0; + tmp = parseInt($.curCSS(this.container.get(0), "paddingTop", true),10); + if(tmp) this.offset.top += tmp; + tmp = parseInt($.curCSS(this.container.get(0), "borderTopWidth", true),10); + if(tmp) this.offset.top += tmp; + this.container.css({ position : "" }); + } + if(!this.li_height) { + var tmp = this.container.find("ul li.closed, ul li.leaf").eq(0); + this.li_height = tmp.height(); + if(tmp.children("ul:eq(0)").size()) this.li_height -= tmp.children("ul:eq(0)").height(); + if(!this.li_height) this.li_height = 18; + } + }, + scroll_check : function (x,y) { + var _this = this; + var cnt = _this.container; + var off = _this.container.offset(); + + var st = cnt.scrollTop(); + var sl = cnt.scrollLeft(); + // DETECT HORIZONTAL SCROLL + var h_cor = (cnt.get(0).scrollWidth > cnt.width()) ? 40 : 20; + + if(y - off.top < 20) cnt.scrollTop(Math.max( (st - _this.settings.ui.scroll_spd) ,0)); // NEAR TOP + if(cnt.height() - (y - off.top) < h_cor) cnt.scrollTop(st + _this.settings.ui.scroll_spd); // NEAR BOTTOM + if(x - off.left < 20) cnt.scrollLeft(Math.max( (sl - _this.settings.ui.scroll_spd),0)); // NEAR LEFT + if(cnt.width() - (x - off.left) < 40) cnt.scrollLeft(sl + _this.settings.ui.scroll_spd); // NEAR RIGHT + + if(cnt.scrollLeft() != sl || cnt.scrollTop() != st) { + tree_component.drag_drop.move_type = false; + tree_component.drag_drop.ref_node = false; + tree_component.drag_drop.marker.hide(); + } + tree_component.drag_drop.scroll_time = setTimeout( function() { _this.scroll_check(x,y); }, 50); + }, + scroll_into_view : function (obj) { + obj = obj ? this.get_node(obj) : this.selected; + if(!obj) return false; + var off_t = obj.offset().top; + var beg_t = this.container.offset().top; + var end_t = beg_t + this.container.height(); + var h_cor = (this.container.get(0).scrollWidth > this.container.width()) ? 40 : 20; + if(off_t + 5 < beg_t) this.container.scrollTop(this.container.scrollTop() - (beg_t - off_t + 5) ); + if(off_t + h_cor > end_t) this.container.scrollTop(this.container.scrollTop() + (off_t + h_cor - end_t) ); + }, + + get_node : function (obj) { + return $(obj).closest("li"); + }, + get_type : function (obj) { + obj = !obj ? this.selected : this.get_node(obj); + if(!obj) return; + var tmp = obj.attr(this.settings.rules.type_attr); + return tmp || "default"; + }, + set_type : function (str, obj) { + obj = !obj ? this.selected : this.get_node(obj); + if(!obj || !str) return; + obj.attr(this.settings.rules.type_attr, str); + }, + get_text : function (obj, lang) { + obj = this.get_node(obj); + if(!obj || obj.size() == 0) return ""; + if(this.settings.languages && this.settings.languages.length) { + lang = lang ? lang : this.current_lang; + obj = obj.children("a." + lang); + } + else obj = obj.children("a:visible"); + var val = ""; + obj.contents().each(function () { + if(this.nodeType == 3) { val = this.data; return false; } + }); + return val; + }, + + check : function (rule, obj) { + if(this.locked) return false; + var v = false; + // if root node + if(obj === -1) { if(typeof this.settings.rules[rule] != "undefined") v = this.settings.rules[rule]; } + else { + obj = !obj ? this.selected : this.get_node(obj); + if(!obj) return; + var t = this.get_type(obj); + if(typeof this.settings.types[t] != "undefined" && typeof this.settings.types[t][rule] != "undefined") v = this.settings.types[t][rule]; + else if(typeof this.settings.types["default"] != "undefined" && typeof this.settings.types["default"][rule] != "undefined") v = this.settings.types["default"][rule]; + } + if(typeof v == "function") v = v.call(null, obj, this); + v = this.callback("check", [rule, obj, v, this]); + return v; + }, + check_move : function (nod, ref_node, how) { + if(this.locked) return false; + if($(ref_node).closest("li.dragged").size()) return false; + + var tree1 = nod.parents(".tree:eq(0)").get(0); + var tree2 = ref_node.parents(".tree:eq(0)").get(0); + // if different trees + if(tree1 && tree1 != tree2) { + var m = $.tree.reference(tree2.id).settings.rules.multitree; + if(m == "none" || ($.isArray(m) && $.inArray(tree1.id, m) == -1)) return false; + } + + var p = (how != "inside") ? this.parent(ref_node) : this.get_node(ref_node); + nod = this.get_node(nod); + if(p == false) return false; + var r = { + max_depth : this.settings.rules.use_max_depth ? this.check("max_depth", p) : -1, + max_children : this.settings.rules.use_max_children ? this.check("max_children", p) : -1, + valid_children : this.check("valid_children", p) + }; + var nod_type = (typeof nod == "string") ? nod : this.get_type(nod); + if(typeof r.valid_children != "undefined" && (r.valid_children == "none" || (typeof r.valid_children == "object" && $.inArray(nod_type, $.makeArray(r.valid_children)) == -1))) return false; + + if(this.settings.rules.use_max_children) { + if(typeof r.max_children != "undefined" && r.max_children != -1) { + if(r.max_children == 0) return false; + var c_count = 1; + if(tree_component.drag_drop.moving == true && tree_component.drag_drop.foreign == false) { + c_count = tree_component.drag_drop.dragged.size(); + c_count = c_count - p.find('> ul > li.dragged').size(); + } + if(r.max_children < p.find('> ul > li').size() + c_count) return false; + } + } + + if(this.settings.rules.use_max_depth) { + if(typeof r.max_depth != "undefined" && r.max_depth === 0) return this.error("MOVE: MAX-DEPTH REACHED"); + // check for max_depth up the chain + var mx = (r.max_depth > 0) ? r.max_depth : false; + var i = 0; + var t = p; + while(t !== -1) { + t = this.parent(t); + i ++; + var m = this.check("max_depth",t); + if(m >= 0) { + mx = (mx === false) ? (m - i) : Math.min(mx, m - i); + } + if(mx !== false && mx <= 0) return this.error("MOVE: MAX-DEPTH REACHED"); + } + if(mx !== false && mx <= 0) return this.error("MOVE: MAX-DEPTH REACHED"); + if(mx !== false) { + var incr = 1; + if(typeof nod != "string") { + var t = nod; + // possible async problem - when nodes are not all loaded down the chain + while(t.size() > 0) { + if(mx - incr < 0) return this.error("MOVE: MAX-DEPTH REACHED"); + t = t.children("ul").children("li"); + incr ++; + } + } + } + } + if(this.callback("check_move", [nod, ref_node, how, this]) == false) return false; + return true; + }, + + hover_branch : function (obj) { + if(this.locked) return this.error("LOCKED"); + var _this = this; + var obj = _this.get_node(obj); + if(!obj.size()) return this.error("HOVER: NOT A VALID NODE"); + if(!_this.check("clickable", obj)) return this.error("SELECT: NODE NOT SELECTABLE"); + if(this.hovered) this.hovered.children("A").removeClass("hover"); + this.hovered = obj; + this.hovered.children("a").addClass("hover"); + this.scroll_into_view(this.hovered); + }, + select_branch : function (obj, multiple) { + if(this.locked) return this.error("LOCKED"); + if(!obj && this.hovered !== false) obj = this.hovered; + var _this = this; + obj = _this.get_node(obj); + if(!obj.size()) return this.error("SELECT: NOT A VALID NODE"); + obj.children("a").removeClass("hover"); + // CHECK AGAINST RULES FOR SELECTABLE NODES + if(!_this.check("clickable", obj)) return this.error("SELECT: NODE NOT SELECTABLE"); + if(_this.callback("beforechange",[obj.get(0),_this]) === false) return this.error("SELECT: STOPPED BY USER"); + // IF multiple AND obj IS ALREADY SELECTED - DESELECT IT + if(this.settings.rules.multiple != false && multiple && obj.children("a.clicked").size() > 0) { + return this.deselect_branch(obj); + } + if(this.settings.rules.multiple != false && multiple) { + this.selected_arr.push(obj); + } + if(this.settings.rules.multiple != false && !multiple) { + for(var i in this.selected_arr) { + if(!this.selected_arr.hasOwnProperty(i)) continue; + this.selected_arr[i].children("A").removeClass("clicked"); + this.callback("ondeselect", [this.selected_arr[i].get(0), _this]); + } + this.selected_arr = []; + this.selected_arr.push(obj); + if(this.selected && this.selected.children("A").hasClass("clicked")) { + this.selected.children("A").removeClass("clicked"); + this.callback("ondeselect", [this.selected.get(0), _this]); + } + } + if(!this.settings.rules.multiple) { + if(this.selected) { + this.selected.children("A").removeClass("clicked"); + this.callback("ondeselect", [this.selected.get(0), _this]); + } + } + // SAVE NEWLY SELECTED + this.selected = obj; + if(this.hovered !== false) { + this.hovered.children("A").removeClass("hover"); + this.hovered = obj; + } + + // FOCUS NEW NODE AND OPEN ALL PARENT NODES IF CLOSED + this.selected.children("a").addClass("clicked").end().parents("li.closed").each( function () { _this.open_branch(this, true); }); + + // SCROLL SELECTED NODE INTO VIEW + this.scroll_into_view(this.selected); + + this.callback("onselect", [this.selected.get(0), _this]); + this.callback("onchange", [this.selected.get(0), _this]); + }, + deselect_branch : function (obj) { + if(this.locked) return this.error("LOCKED"); + var _this = this; + var obj = this.get_node(obj); + if(obj.children("a.clicked").size() == 0) return this.error("DESELECT: NODE NOT SELECTED"); + + obj.children("a").removeClass("clicked"); + this.callback("ondeselect", [obj.get(0), _this]); + if(this.settings.rules.multiple != false && this.selected_arr.length > 1) { + this.selected_arr = []; + this.container.find("a.clicked").filter(":first-child").parent().each(function () { + _this.selected_arr.push($(this)); + }); + if(obj.get(0) == this.selected.get(0)) { + this.selected = this.selected_arr[0]; + } + } + else { + if(this.settings.rules.multiple != false) this.selected_arr = []; + this.selected = false; + } + this.callback("onchange", [obj.get(0), _this]); + }, + toggle_branch : function (obj) { + if(this.locked) return this.error("LOCKED"); + var obj = this.get_node(obj); + if(obj.hasClass("closed")) return this.open_branch(obj); + if(obj.hasClass("open")) return this.close_branch(obj); + }, + open_branch : function (obj, disable_animation, callback) { + var _this = this; + + if(this.locked) return this.error("LOCKED"); + var obj = this.get_node(obj); + if(!obj.size()) return this.error("OPEN: NO SUCH NODE"); + if(obj.hasClass("leaf")) return this.error("OPEN: OPENING LEAF NODE"); + if(this.settings.data.async && obj.find("li").size() == 0) { + + if(this.callback("beforeopen",[obj.get(0),this]) === false) return this.error("OPEN: STOPPED BY USER"); + + obj.children("ul:eq(0)").remove().end().append(""); + obj.removeClass("closed").addClass("open"); + + var _datastore = new $.tree.datastores[this.settings.data.type](); + _datastore.load(this.callback("beforedata",[obj,this]),this,this.settings.data.opts,function(data){ + data = _this.callback("ondata", [data, _this]); + if(!data || data.length == 0) { + obj.removeClass("closed").removeClass("open").addClass("leaf").children("ul").remove(); + if(callback) callback.call(); + return; + } + _datastore.parse(data,_this,_this.settings.data.opts,function(str){ + str = _this.callback("onparse", [str, _this]); + // if(obj.children('ul:eq(0)').children('li').size() > 1) obj.children("ul").find('.loaading').parent().replaceWith(str); else + obj.children("ul:eq(0)").replaceWith($("
              ").html(str)); + obj.find("li:last-child").addClass("last").end().find("li:has(ul)").not(".open").addClass("closed"); + obj.find("li").not(".open").not(".closed").addClass("leaf"); + _this.open_branch.apply(_this, [obj]); + if(callback) callback.call(); + }); + }); + return true; + } + else { + if(!this.settings.data.async) { + if(this.callback("beforeopen",[obj.get(0),this]) === false) return this.error("OPEN: STOPPED BY USER"); + } + if(parseInt(this.settings.ui.animation) > 0 && !disable_animation ) { + obj.children("ul:eq(0)").css("display","none"); + obj.removeClass("closed").addClass("open"); + obj.children("ul:eq(0)").slideDown(parseInt(this.settings.ui.animation), function() { + $(this).css("display",""); + if(callback) callback.call(); + }); + } else { + obj.removeClass("closed").addClass("open"); + if(callback) callback.call(); + } + this.callback("onopen", [obj.get(0), this]); + return true; + } + }, + close_branch : function (obj, disable_animation) { + if(this.locked) return this.error("LOCKED"); + var _this = this; + var obj = this.get_node(obj); + if(!obj.size()) return this.error("CLOSE: NO SUCH NODE"); + if(_this.callback("beforeclose",[obj.get(0),_this]) === false) return this.error("CLOSE: STOPPED BY USER"); + if(parseInt(this.settings.ui.animation) > 0 && !disable_animation && obj.children("ul:eq(0)").size() == 1) { + obj.children("ul:eq(0)").slideUp(parseInt(this.settings.ui.animation), function() { + if(obj.hasClass("open")) obj.removeClass("open").addClass("closed"); + $(this).css("display",""); + }); + } + else { + if(obj.hasClass("open")) obj.removeClass("open").addClass("closed"); + } + if(this.selected && this.settings.ui.selected_parent_close !== false && obj.children("ul:eq(0)").find("a.clicked").size() > 0) { + obj.find("li:has(a.clicked)").each(function() { + _this.deselect_branch(this); + }); + if(this.settings.ui.selected_parent_close == "select_parent" && obj.children("a.clicked").size() == 0) this.select_branch(obj, (this.settings.rules.multiple != false && this.selected_arr.length > 0) ); + } + this.callback("onclose", [obj.get(0), this]); + }, + open_all : function (obj, callback) { + if(this.locked) return this.error("LOCKED"); + var _this = this; + obj = obj ? this.get_node(obj) : this.container; + + var s = obj.find("li.closed").size(); + if(!callback) this.cl_count = 0; + else this.cl_count --; + if(s > 0) { + this.cl_count += s; + // maybe add .andSelf() + obj.find("li.closed").each( function () { var __this = this; _this.open_branch.apply(_this, [this, true, function() { _this.open_all.apply(_this, [__this, true]); } ]); }); + } + else if(this.cl_count == 0) this.callback("onopen_all",[this]); + }, + close_all : function (obj) { + if(this.locked) return this.error("LOCKED"); + var _this = this; + obj = obj ? this.get_node(obj) : this.container; + // maybe add .andSelf() + obj.find("li.open").each( function () { _this.close_branch(this, true); }); + this.callback("onclose_all",[this]); + }, + + set_lang : function (i) { + if(!$.isArray(this.settings.languages) || this.settings.languages.length == 0) return false; + if(this.locked) return this.error("LOCKED"); + if(!$.inArray(i,this.settings.languages) && typeof this.settings.languages[i] != "undefined") i = this.settings.languages[i]; + if(typeof i == "undefined") return false; + if(i == this.current_lang) return true; + var st = false; + var id = "#" + this.container.attr("id"); + st = tree_component.get_css(id + " ." + this.current_lang); + if(st !== false) st.style.display = "none"; + st = tree_component.get_css(id + " ." + i); + if(st !== false) st.style.display = ""; + this.current_lang = i; + return true; + }, + get_lang : function () { + if(!$.isArray(this.settings.languages) || this.settings.languages.length == 0) return false; + return this.current_lang; + }, + + create : function (obj, ref_node, position) { + if(this.locked) return this.error("LOCKED"); + + var root = false; + if(ref_node == -1) { root = true; ref_node = this.container; } + else ref_node = ref_node ? this.get_node(ref_node) : this.selected; + + if(!root && (!ref_node || !ref_node.size())) return this.error("CREATE: NO NODE SELECTED"); + + var pos = position; + + var tmp = ref_node; // for type calculation + if(position == "before") { + position = ref_node.parent().children().index(ref_node); + ref_node = ref_node.parents("li:eq(0)"); + } + if(position == "after") { + position = ref_node.parent().children().index(ref_node) + 1; + ref_node = ref_node.parents("li:eq(0)"); + } + if(!root && ref_node.size() == 0) { root = true; ref_node = this.container; } + + if(!root) { + if(!this.check("creatable", ref_node)) return this.error("CREATE: CANNOT CREATE IN NODE"); + if(ref_node.hasClass("closed")) { + if(this.settings.data.async && ref_node.children("ul").size() == 0) { + var _this = this; + return this.open_branch(ref_node, true, function () { _this.create.apply(_this, [obj, ref_node, position]); } ); + } + else this.open_branch(ref_node, true); + } + } + + // creating new object to pass to parseJSON + var torename = false; + if(!obj) obj = {}; + else obj = $.extend(true, {}, obj); + if(!obj.attributes) obj.attributes = {}; + if(!obj.attributes[this.settings.rules.type_attr]) obj.attributes[this.settings.rules.type_attr] = this.get_type(tmp) || "default"; + if(this.settings.languages.length) { + if(!obj.data) { obj.data = {}; torename = true; } + for(var i = 0; i < this.settings.languages.length; i++) { + if(!obj.data[this.settings.languages[i]]) obj.data[this.settings.languages[i]] = ((typeof this.settings.lang.new_node).toLowerCase() != "string" && this.settings.lang.new_node[i]) ? this.settings.lang.new_node[i] : this.settings.lang.new_node; + } + } + else { + if(!obj.data) { obj.data = this.settings.lang.new_node; torename = true; } + } + + obj = this.callback("ondata",[obj, this]); + var obj_s = $.tree.datastores.json().parse(obj,this); + obj_s = this.callback("onparse", [obj_s, this]); + var $li = $(obj_s); + + if($li.children("ul").size()) { + if(!$li.is(".open")) $li.addClass("closed"); + } + else $li.addClass("leaf"); + $li.find("li:last-child").addClass("last").end().find("li:has(ul)").not(".open").addClass("closed"); + $li.find("li").not(".open").not(".closed").addClass("leaf"); + + var r = { + max_depth : this.settings.rules.use_max_depth ? this.check("max_depth", (root ? -1 : ref_node) ) : -1, + max_children : this.settings.rules.use_max_children ? this.check("max_children", (root ? -1 : ref_node) ) : -1, + valid_children : this.check("valid_children", (root ? -1 : ref_node) ) + }; + var nod_type = this.get_type($li); + if(typeof r.valid_children != "undefined" && (r.valid_children == "none" || ($.isArray(r.valid_children) && $.inArray(nod_type, r.valid_children) == -1))) return this.error("CREATE: NODE NOT A VALID CHILD"); + + if(this.settings.rules.use_max_children) { + if(typeof r.max_children != "undefined" && r.max_children != -1 && r.max_children >= this.children(ref_node).size()) return this.error("CREATE: MAX_CHILDREN REACHED"); + } + + if(this.settings.rules.use_max_depth) { + if(typeof r.max_depth != "undefined" && r.max_depth === 0) return this.error("CREATE: MAX-DEPTH REACHED"); + // check for max_depth up the chain + var mx = (r.max_depth > 0) ? r.max_depth : false; + var i = 0; + var t = ref_node; + + while(t !== -1 && !root) { + t = this.parent(t); + i ++; + var m = this.check("max_depth",t); + if(m >= 0) { + mx = (mx === false) ? (m - i) : Math.min(mx, m - i); + } + if(mx !== false && mx <= 0) return this.error("CREATE: MAX-DEPTH REACHED"); + } + if(mx !== false && mx <= 0) return this.error("CREATE: MAX-DEPTH REACHED"); + if(mx !== false) { + var incr = 1; + var t = $li; + while(t.size() > 0) { + if(mx - incr < 0) return this.error("CREATE: MAX-DEPTH REACHED"); + t = t.children("ul").children("li"); + incr ++; + } + } + } + + if((typeof position).toLowerCase() == "undefined" || position == "inside") + position = (this.settings.rules.createat == "top") ? 0 : ref_node.children("ul:eq(0)").children("li").size(); + if(ref_node.children("ul").size() == 0 || (root == true && ref_node.children("ul").children("li").size() == 0) ) { + if(!root) var a = this.moved($li,ref_node.children("a:eq(0)"),"inside", true); + else var a = this.moved($li,this.container.children("ul:eq(0)"),"inside", true); + } + else if(pos == "before" && ref_node.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").size()) + var a = this.moved($li,ref_node.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").children("a:eq(0)"),"before", true); + else if(pos == "after" && ref_node.children("ul:eq(0)").children("li:nth-child(" + (position) + ")").size()) + var a = this.moved($li,ref_node.children("ul:eq(0)").children("li:nth-child(" + (position) + ")").children("a:eq(0)"),"after", true); + else if(ref_node.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").size()) + var a = this.moved($li,ref_node.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").children("a:eq(0)"),"before", true); + else + var a = this.moved($li,ref_node.children("ul:eq(0)").children("li:last").children("a:eq(0)"),"after",true); + + if(a === false) return this.error("CREATE: ABORTED"); + + if(torename) { + this.select_branch($li.children("a:eq(0)")); + this.rename(); + } + return $li; + }, + rename : function (obj, new_name) { + if(this.locked) return this.error("LOCKED"); + obj = obj ? this.get_node(obj) : this.selected; + var _this = this; + if(!obj || !obj.size()) return this.error("RENAME: NO NODE SELECTED"); + if(!this.check("renameable", obj)) return this.error("RENAME: NODE NOT RENAMABLE"); + if(!this.callback("beforerename",[obj.get(0), _this.current_lang, _this])) return this.error("RENAME: STOPPED BY USER"); + + obj.parents("li.closed").each(function () { _this.open_branch(this) }); + if(this.current_lang) obj = obj.find("a." + this.current_lang); + else obj = obj.find("a:first"); + + // Rollback + var rb = {}; + rb[this.container.attr("id")] = this.get_rollback(); + + var icn = obj.children("ins").clone(); + if((typeof new_name).toLowerCase() == "string") { + obj.text(new_name).prepend(icn); + _this.callback("onrename", [_this.get_node(obj).get(0), _this, rb]); + } + else { + var last_value = ""; + obj.contents().each(function () { + if(this.nodeType == 3) { last_value = this.data; return false; } + }); + _this.inp = $(""); + _this.inp + .val(last_value.replace(/&/g,"&").replace(/>/g,">").replace(/</g,"<")) + .bind("mousedown", function (event) { event.stopPropagation(); }) + .bind("mouseup", function (event) { event.stopPropagation(); }) + .bind("click", function (event) { event.stopPropagation(); }) + .bind("keyup", function (event) { + var key = event.keyCode || event.which; + if(key == 27) { this.value = last_value; this.blur(); return } + if(key == 13) { this.blur(); return; } + }); + _this.inp.blur(function(event) { + if(this.value == "") this.value = last_value; + obj.text(this.value).prepend(icn); + obj.get(0).style.display = ""; + obj.prevAll("span").remove(); + _this.inp = false; + _this.callback("onrename", [_this.get_node(obj).get(0), _this, rb]); + }); + + var spn = $("").addClass(obj.attr("class")).append(icn).append(_this.inp); + obj.get(0).style.display = "none"; + obj.parent().prepend(spn); + _this.inp.get(0).focus(); + _this.inp.get(0).select(); + } + }, + remove : function(obj) { + if(this.locked) return this.error("LOCKED"); + var _this = this; + + // Rollback + var rb = {}; + rb[this.container.attr("id")] = this.get_rollback(); + + if(obj && (!this.selected || this.get_node(obj).get(0) != this.selected.get(0) )) { + obj = this.get_node(obj); + if(obj.size()) { + if(!this.check("deletable", obj)) return this.error("DELETE: NODE NOT DELETABLE"); + if(!this.callback("beforedelete",[obj.get(0), _this])) return this.error("DELETE: STOPPED BY USER"); + $parent = obj.parent(); + if(obj.find("a.clicked").size()) { + var reset_selected = false; + _this.selected_arr = []; + this.container.find("a.clicked").filter(":first-child").parent().each(function () { + if(!reset_selected && this == _this.selected.get(0)) reset_selected = true; + if($(this).parents().index(obj) != -1) return true; + _this.selected_arr.push($(this)); + }); + if(reset_selected) this.selected = this.selected_arr[0] || false; + } + obj = obj.remove(); + $parent.children("li:last").addClass("last"); + if($parent.children("li").size() == 0) { + $li = $parent.parents("li:eq(0)"); + $li.removeClass("open").removeClass("closed").addClass("leaf").children("ul").remove(); + } + this.callback("ondelete", [obj.get(0), this, rb]); + } + } + else if(this.selected) { + if(!this.check("deletable", this.selected)) return this.error("DELETE: NODE NOT DELETABLE"); + if(!this.callback("beforedelete",[this.selected.get(0), _this])) return this.error("DELETE: STOPPED BY USER"); + $parent = this.selected.parent(); + var obj = this.selected; + if(this.settings.rules.multiple == false || this.selected_arr.length == 1) { + var stop = true; + var tmp = this.settings.ui.selected_delete == "select_previous" ? this.prev(this.selected) : false; + } + obj = obj.remove(); + $parent.children("li:last").addClass("last"); + if($parent.children("li").size() == 0) { + $li = $parent.parents("li:eq(0)"); + $li.removeClass("open").removeClass("closed").addClass("leaf").children("ul").remove(); + } + if(!stop && this.settings.rules.multiple != false) { + var _this = this; + this.selected_arr = []; + this.container.find("a.clicked").filter(":first-child").parent().each(function () { + _this.selected_arr.push($(this)); + }); + if(this.selected_arr.length > 0) { + this.selected = this.selected_arr[0]; + this.remove(); + } + } + if(stop && tmp) this.select_branch(tmp); + this.callback("ondelete", [obj.get(0), this, rb]); + } + else return this.error("DELETE: NO NODE SELECTED"); + }, + + next : function (obj, strict) { + obj = this.get_node(obj); + if(!obj.size()) return false; + if(strict) return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; + + if(obj.hasClass("open")) return obj.find("li:eq(0)"); + else if(obj.nextAll("li").size() > 0) return obj.nextAll("li:eq(0)"); + else return obj.parents("li").next("li").eq(0); + }, + prev : function(obj, strict) { + obj = this.get_node(obj); + if(!obj.size()) return false; + if(strict) return (obj.prevAll("li").size() > 0) ? obj.prevAll("li:eq(0)") : false; + + if(obj.prev("li").size()) { + var obj = obj.prev("li").eq(0); + while(obj.hasClass("open")) obj = obj.children("ul:eq(0)").children("li:last"); + return obj; + } + else return obj.parents("li:eq(0)").size() ? obj.parents("li:eq(0)") : false; + }, + parent : function(obj) { + obj = this.get_node(obj); + if(!obj.size()) return false; + return obj.parents("li:eq(0)").size() ? obj.parents("li:eq(0)") : -1; + }, + children : function(obj) { + if(obj === -1) return this.container.children("ul:eq(0)").children("li"); + + obj = this.get_node(obj); + if(!obj.size()) return false; + return obj.children("ul:eq(0)").children("li"); + }, + + toggle_dots : function () { + if(this.settings.ui.dots) { + this.settings.ui.dots = false; + this.container.children("ul:eq(0)").addClass("no_dots"); + } + else { + this.settings.ui.dots = true; + this.container.children("ul:eq(0)").removeClass("no_dots"); + } + }, + + callback : function (cb, args) { + var p = false; + var r = null; + for(var i in this.settings.plugins) { + if(typeof $.tree.plugins[i] != "object") continue; + p = $.tree.plugins[i]; + if(p.callbacks && typeof p.callbacks[cb] == "function") r = p.callbacks[cb].apply(this, args); + if(typeof r !== "undefined" && r !== null) { + if(cb == "ondata" || cb == "onparse") args[0] = r; // keep the chain if data or parse + else return r; + } + } + p = this.settings.callback[cb]; + if(typeof p == "function") return p.apply(null, args); + }, + get_rollback : function () { + var rb = {}; + rb.html = this.container.html(); + rb.selected = this.selected ? this.selected.attr("id") : false; + return rb; + }, + moved : function (what, where, how, is_new, is_copy, rb) { + var what = $(what); + var $parent = $(what).parents("ul:eq(0)"); + var $where = $(where); + if($where.is("ins")) $where = $where.parent(); + + // Rollback + if(!rb) { + var rb = {}; + rb[this.container.attr("id")] = this.get_rollback(); + if(!is_new) { + var tmp = what.size() > 1 ? what.eq(0).parents(".tree:eq(0)") : what.parents(".tree:eq(0)"); + if(tmp.get(0) != this.container.get(0)) { + tmp = tree_component.inst[tmp.attr("id")]; + rb[tmp.container.attr("id")] = tmp.get_rollback(); + } + delete tmp; + } + } + + if(how == "inside" && this.settings.data.async) { + var _this = this; + if(this.get_node($where).hasClass("closed")) { + return this.open_branch(this.get_node($where), true, function () { _this.moved.apply(_this, [what, where, how, is_new, is_copy, rb]); }); + } + if(this.get_node($where).find("> ul > li > a.loading").size() == 1) { + setTimeout(function () { _this.moved.apply(_this, [what, where, how, is_new, is_copy]); }, 200); + return; + } + } + + + // IF MULTIPLE + if(what.size() > 1) { + var _this = this; + var tmp = this.moved(what.eq(0), where, how, false, is_copy, rb); + what.each(function (i) { + if(i == 0) return; + if(tmp) { // if tmp is false - the previous move was a no-go + tmp = _this.moved(this, tmp.children("a:eq(0)"), "after", false, is_copy, rb); + } + }); + return what; + } + + if(is_copy) { + _what = what.clone(); + _what.each(function (i) { + this.id = this.id + "_copy"; + $(this).find("li").each(function () { + this.id = this.id + "_copy"; + }); + $(this).removeClass("dragged").find("a.clicked").removeClass("clicked").end().find("li.dragged").removeClass("dragged"); + }); + } + else _what = what; + if(is_new) { + if(!this.callback("beforecreate", [this.get_node(what).get(0), this.get_node(where).get(0),how,this])) return false; + } + else { + if(!this.callback("beforemove", [this.get_node(what).get(0), this.get_node(where).get(0),how,this])) return false; + } + + if(!is_new) { + var tmp = what.parents(".tree:eq(0)"); + // if different trees + if(tmp.get(0) != this.container.get(0)) { + tmp = tree_component.inst[tmp.attr("id")]; + + // if there are languages - otherwise - no cleanup needed + if(tmp.settings.languages.length) { + var res = []; + // if new tree has no languages - use current visible + if(this.settings.languages.length == 0) res.push("." + tmp.current_lang); + else { + for(var i in this.settings.languages) { + if(!this.settings.languages.hasOwnProperty(i)) continue; + for(var j in tmp.settings.languages) { + if(!tmp.settings.languages.hasOwnProperty(j)) continue; + if(this.settings.languages[i] == tmp.settings.languages[j]) res.push("." + this.settings.languages[i]); + } + } + } + if(res.length == 0) return this.error("MOVE: NO COMMON LANGUAGES"); + _what.find("a").not(res.join(",")).remove(); + } + _what.find("a.clicked").removeClass("clicked"); + } + } + what = _what; + + // ADD NODE TO NEW PLACE + switch(how) { + case "before": + $where.parents("ul:eq(0)").children("li.last").removeClass("last"); + $where.parent().before(what.removeClass("last")); + $where.parents("ul:eq(0)").children("li:last").addClass("last"); + break; + case "after": + $where.parents("ul:eq(0)").children("li.last").removeClass("last"); + $where.parent().after(what.removeClass("last")); + $where.parents("ul:eq(0)").children("li:last").addClass("last"); + break; + case "inside": + if($where.parent().children("ul:first").size()) { + if(this.settings.rules.createat == "top") { + $where.parent().children("ul:first").prepend(what.removeClass("last")).children("li:last").addClass("last"); + + // restored this section + var tmp_node = $where.parent().children("ul:first").children("li:first"); + if(tmp_node.size()) { + how = "before"; + where = tmp_node; + } + } + else { + // restored this section + var tmp_node = $where.parent().children("ul:first").children(".last"); + if(tmp_node.size()) { + how = "after"; + where = tmp_node; + } + + $where.parent().children("ul:first").children(".last").removeClass("last").end().append(what.removeClass("last")).children("li:last").addClass("last"); + } + } + else { + what.addClass("last"); + $where.parent().removeClass("leaf").append("
                "); + if(!$where.parent().hasClass("open")) $where.parent().addClass("closed"); + $where.parent().children("ul:first").prepend(what); + } + if($where.parent().hasClass("closed")) { this.open_branch($where); } + break; + default: + break; + } + // CLEANUP OLD PARENT + if($parent.find("li").size() == 0) { + var $li = $parent.parent(); + $li.removeClass("open").removeClass("closed").addClass("leaf"); + if(!$li.is(".tree")) $li.children("ul").remove(); + $li.parents("ul:eq(0)").children("li.last").removeClass("last").end().children("li:last").addClass("last"); + } + else { + $parent.children("li.last").removeClass("last"); + $parent.children("li:last").addClass("last"); + } + + // NO LONGER CORRECT WITH position PARAM - if(is_new && how != "inside") where = this.get_node(where).parents("li:eq(0)"); + if(is_copy) this.callback("oncopy", [this.get_node(what).get(0), this.get_node(where).get(0), how, this, rb]); + else if(is_new) this.callback("oncreate", [this.get_node(what).get(0), ($where.is("ul") ? -1 : this.get_node(where).get(0) ), how, this, rb]); + else this.callback("onmove", [this.get_node(what).get(0), this.get_node(where).get(0), how, this, rb]); + return what; + }, + error : function (code) { + this.callback("error",[code,this]); + return false; + }, + lock : function (state) { + this.locked = state; + if(this.locked) this.container.children("ul:eq(0)").addClass("locked"); + else this.container.children("ul:eq(0)").removeClass("locked"); + }, + cut : function (obj) { + if(this.locked) return this.error("LOCKED"); + obj = obj ? this.get_node(obj) : this.container.find("a.clicked").filter(":first-child").parent(); + if(!obj || !obj.size()) return this.error("CUT: NO NODE SELECTED"); + tree_component.cut_copy.copy_nodes = false; + tree_component.cut_copy.cut_nodes = obj; + }, + copy : function (obj) { + if(this.locked) return this.error("LOCKED"); + obj = obj ? this.get_node(obj) : this.container.find("a.clicked").filter(":first-child").parent(); + if(!obj || !obj.size()) return this.error("COPY: NO NODE SELECTED"); + tree_component.cut_copy.copy_nodes = obj; + tree_component.cut_copy.cut_nodes = false; + }, + paste : function (obj, position) { + if(this.locked) return this.error("LOCKED"); + + var root = false; + if(obj == -1) { root = true; obj = this.container; } + else obj = obj ? this.get_node(obj) : this.selected; + + if(!root && (!obj || !obj.size())) return this.error("PASTE: NO NODE SELECTED"); + if(!tree_component.cut_copy.copy_nodes && !tree_component.cut_copy.cut_nodes) return this.error("PASTE: NOTHING TO DO"); + + var _this = this; + + var pos = position; + + if(position == "before") { + position = obj.parent().children().index(obj); + obj = obj.parents("li:eq(0)"); + } + else if(position == "after") { + position = obj.parent().children().index(obj) + 1; + obj = obj.parents("li:eq(0)"); + } + else if((typeof position).toLowerCase() == "undefined" || position == "inside") { + position = (this.settings.rules.createat == "top") ? 0 : obj.children("ul:eq(0)").children("li").size(); + } + if(!root && obj.size() == 0) { root = true; obj = this.container; } + + if(tree_component.cut_copy.copy_nodes && tree_component.cut_copy.copy_nodes.size()) { + var ok = true; + if(!root && !this.check_move(tree_component.cut_copy.copy_nodes, obj.children("a:eq(0)"), "inside")) return false; + + if(obj.children("ul").size() == 0 || (root == true && obj.children("ul").children("li").size() == 0) ) { + if(!root) var a = this.moved(tree_component.cut_copy.copy_nodes,obj.children("a:eq(0)"),"inside", false, true); + else var a = this.moved(tree_component.cut_copy.copy_nodes,this.container.children("ul:eq(0)"),"inside", false, true); + } + else if(pos == "before" && obj.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").size()) + var a = this.moved(tree_component.cut_copy.copy_nodes,obj.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").children("a:eq(0)"),"before", false, true); + else if(pos == "after" && obj.children("ul:eq(0)").children("li:nth-child(" + (position) + ")").size()) + var a = this.moved(tree_component.cut_copy.copy_nodes,obj.children("ul:eq(0)").children("li:nth-child(" + (position) + ")").children("a:eq(0)"),"after", false, true); + else if(obj.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").size()) + var a = this.moved(tree_component.cut_copy.copy_nodes,obj.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").children("a:eq(0)"),"before", false, true); + else + var a = this.moved(tree_component.cut_copy.copy_nodes,obj.children("ul:eq(0)").children("li:last").children("a:eq(0)"),"after", false, true); + tree_component.cut_copy.copy_nodes = false; + } + if(tree_component.cut_copy.cut_nodes && tree_component.cut_copy.cut_nodes.size()) { + var ok = true; + obj.parents().andSelf().each(function () { + if(tree_component.cut_copy.cut_nodes.index(this) != -1) { + ok = false; + return false; + } + }); + if(!ok) return this.error("Invalid paste"); + if(!root && !this.check_move(tree_component.cut_copy.cut_nodes, obj.children("a:eq(0)"), "inside")) return false; + + if(obj.children("ul").size() == 0 || (root == true && obj.children("ul").children("li").size() == 0) ) { + if(!root) var a = this.moved(tree_component.cut_copy.cut_nodes,obj.children("a:eq(0)"),"inside"); + else var a = this.moved(tree_component.cut_copy.cut_nodes,this.container.children("ul:eq(0)"),"inside"); + } + else if(pos == "before" && obj.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").size()) + var a = this.moved(tree_component.cut_copy.cut_nodes,obj.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").children("a:eq(0)"),"before"); + else if(pos == "after" && obj.children("ul:eq(0)").children("li:nth-child(" + (position) + ")").size()) + var a = this.moved(tree_component.cut_copy.cut_nodes,obj.children("ul:eq(0)").children("li:nth-child(" + (position) + ")").children("a:eq(0)"),"after"); + else if(obj.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").size()) + var a = this.moved(tree_component.cut_copy.cut_nodes,obj.children("ul:eq(0)").children("li:nth-child(" + (position + 1) + ")").children("a:eq(0)"),"before"); + else + var a = this.moved(tree_component.cut_copy.cut_nodes,obj.children("ul:eq(0)").children("li:last").children("a:eq(0)"),"after"); + tree_component.cut_copy.cut_nodes = false; + } + }, + search : function(str, func) { + var _this = this; + if(!str || (this.srch && str != this.srch) ) { + this.srch = ""; + this.srch_opn = false; + this.container.find("a.search").removeClass("search"); + } + this.srch = str; + if(!str) return; + + if(!func) func = "contains"; + if(this.settings.data.async) { + if(!this.srch_opn) { + var dd = $.extend( { "search" : str } , this.callback("beforedata", [false, this] ) ); + $.ajax({ + type : this.settings.data.opts.method, + url : this.settings.data.opts.url, + contentType : this.settings.data.opts.contentType, + data : dd, + dataType : "text", + success : function (data) { + _this.srch_opn = $.unique(data.split(",")); + _this.search.apply(_this,[str, func]); + } + }); + } + else if(this.srch_opn.length) { + if(this.srch_opn && this.srch_opn.length) { + var opn = false; + for(var j = 0; j < this.srch_opn.length; j++) { + if(this.get_node("#" + this.srch_opn[j]).size() > 0) { + opn = true; + var tmp = "#" + this.srch_opn[j]; + delete this.srch_opn[j]; + this.open_branch(tmp, true, function () { _this.search.apply(_this,[str, func]); } ); + } + } + if(!opn) { + this.srch_opn = []; + _this.search.apply(_this,[str, func]); + } + } + } + else { + this.srch_opn = false; + var selector = "a"; + // IF LANGUAGE VERSIONS + if(this.settings.languages.length) selector += "." + this.current_lang; + this.callback("onsearch", [this.container.find(selector + ":" + func + "('" + str + "')"), this]); + } + } + else { + var selector = "a"; + // IF LANGUAGE VERSIONS + if(this.settings.languages.length) selector += "." + this.current_lang; + var nn = this.container.find(selector + ":" + func + "('" + str + "')"); + nn.parents("li.closed").each( function () { _this.open_branch(this, true); }); + this.callback("onsearch", [nn, this]); + } + }, + add_sheet : tree_component.add_sheet, + + destroy : function() { + this.callback("ondestroy", [this]); + + this.container.unbind(".jstree"); + $("#" + this.container.attr("id")).die("click.jstree").die("dblclick.jstree").die("mouseover.jstree").die("mouseout.jstree").die("mousedown.jstree"); + this.container.removeClass("tree ui-widget ui-widget-content tree-default tree-" + this.settings.ui.theme_name).children("ul").removeClass("no_dots ltr locked").find("li").removeClass("leaf").removeClass("open").removeClass("closed").removeClass("last").children("a").removeClass("clicked hover search"); + + if(this.cntr == tree_component.focused) { + for(var i in tree_component.inst) { + if(i != this.cntr && i != this.container.attr("id")) { + tree_component.inst[i].focus(); + break; + } + } + } + + tree_component.inst[this.cntr] = false; + tree_component.inst[this.container.attr("id")] = false; + delete tree_component.inst[this.cntr]; + delete tree_component.inst[this.container.attr("id")]; + tree_component.cntr --; + } + } + }; + + // instance manager + tree_component.cntr = 0; + tree_component.inst = {}; + + // themes + tree_component.themes = []; + + // drag'n'drop stuff + tree_component.drag_drop = { + isdown : false, // Is there a drag + drag_node : false, // The actual node + drag_help : false, // The helper + dragged : false, + + init_x : false, + init_y : false, + moving : false, + + origin_tree : false, + marker : false, + + move_type : false, // before, after or inside + ref_node : false, // reference node + appended : false, // is helper appended + + foreign : false, // Is the dragged node a foreign one + droppable : [], // Array of classes that can be dropped onto the tree + + open_time : false, // Timeout for opening nodes + scroll_time : false // Timeout for scrolling + }; + tree_component.mouseup = function(event) { + var tmp = tree_component.drag_drop; + if(tmp.open_time) clearTimeout(tmp.open_time); + if(tmp.scroll_time) clearTimeout(tmp.scroll_time); + + if(tmp.moving && $.tree.drag_end !== false) $.tree.drag_end.call(null, event, tmp); + + if(tmp.foreign === false && tmp.drag_node && tmp.drag_node.size()) { + tmp.drag_help.remove(); + if(tmp.move_type) { + var tree1 = tree_component.inst[tmp.ref_node.parents(".tree:eq(0)").attr("id")]; + if(tree1) tree1.moved(tmp.dragged, tmp.ref_node, tmp.move_type, false, (tmp.origin_tree.settings.rules.drag_copy == "on" || (tmp.origin_tree.settings.rules.drag_copy == "ctrl" && event.ctrlKey) ) ); + } + tmp.move_type = false; + tmp.ref_node = false; + } + if(tmp.foreign !== false) { + if(tmp.drag_help) tmp.drag_help.remove(); + if(tmp.move_type) { + var tree1 = tree_component.inst[tmp.ref_node.parents(".tree:eq(0)").attr("id")]; + if(tree1) tree1.callback("ondrop",[tmp.f_data, tree1.get_node(tmp.ref_node).get(0), tmp.move_type, tree1]); + } + tmp.foreign = false; + tmp.move_type = false; + tmp.ref_node = false; + } + // RESET EVERYTHING + if(tree_component.drag_drop.marker) tree_component.drag_drop.marker.hide(); + if(tmp.dragged && tmp.dragged.size()) tmp.dragged.removeClass("dragged"); + tmp.dragged = false; + tmp.drag_help = false; + tmp.drag_node = false; + tmp.f_type = false; + tmp.f_data = false; + tmp.init_x = false; + tmp.init_y = false; + tmp.moving = false; + tmp.appended = false; + tmp.origin_tree = false; + if(tmp.isdown) { + tmp.isdown = false; + event.preventDefault(); + event.stopPropagation(); + return false; + } + }; + tree_component.mousemove = function(event) { + var tmp = tree_component.drag_drop; + var is_start = false; + + if(tmp.isdown) { + if(!tmp.moving && Math.abs(tmp.init_x - event.pageX) < 5 && Math.abs(tmp.init_y - event.pageY) < 5) { + event.preventDefault(); + event.stopPropagation(); + return false; + } + else { + if(!tmp.moving) { + tree_component.drag_drop.moving = true; + is_start = true; + } + } + + if(tmp.open_time) clearTimeout(tmp.open_time); + + if(tmp.drag_help !== false) { + if(!tmp.appended) { + if(tmp.foreign !== false) tmp.origin_tree = $.tree.focused(); + $("body").append(tmp.drag_help); + tmp.w = tmp.drag_help.width(); + tmp.appended = true; + } + tmp.drag_help.css({ "left" : (event.pageX + 5 ), "top" : (event.pageY + 15) }); + } + + if(is_start && $.tree.drag_start !== false) $.tree.drag_start.call(null, event, tmp); + if($.tree.drag !== false) $.tree.drag.call(null, event, tmp); + + if(event.target.tagName == "DIV" && event.target.id == "jstree-marker") return false; + + var et = $(event.target); + if(et.is("ins")) et = et.parent(); + var cnt = et.is(".tree") ? et : et.parents(".tree:eq(0)"); + + // if not moving over a tree + if(cnt.size() == 0 || !tree_component.inst[cnt.attr("id")]) { + if(tmp.scroll_time) clearTimeout(tmp.scroll_time); + if(tmp.drag_help !== false) tmp.drag_help.find("li:eq(0) ins").addClass("forbidden"); + tmp.move_type = false; + tmp.ref_node = false; + tree_component.drag_drop.marker.hide(); + return false; + } + + var tree2 = tree_component.inst[cnt.attr("id")]; + tree2.off_height(); + + if(tmp.scroll_time) clearTimeout(tmp.scroll_time); + tmp.scroll_time = setTimeout( function() { tree2.scroll_check(event.pageX,event.pageY); }, 50); + + var mov = false; + var st = cnt.scrollTop(); + + if(event.target.tagName == "A" || event.target.tagName == "INS") { + // just in case if hover is over the draggable + if(et.is("#jstree-dragged")) return false; + if(tree2.get_node(event.target).hasClass("closed")) { + tmp.open_time = setTimeout( function () { tree2.open_branch(et); }, 500); + } + + var et_off = et.offset(); + var goTo = { + x : (et_off.left - 1), + y : (event.pageY - et_off.top) + }; + + var arr = []; + if(goTo.y < tree2.li_height/3 + 1 ) arr = ["before","inside","after"]; + else if(goTo.y > tree2.li_height*2/3 - 1 ) arr = ["after","inside","before"]; + else { + if(goTo.y < tree2.li_height/2) arr = ["inside","before","after"]; + else arr = ["inside","after","before"]; + } + var ok = false; + var nn = (tmp.foreign == false) ? tmp.origin_tree.container.find("li.dragged") : tmp.f_type; + $.each(arr, function(i, val) { + if(tree2.check_move(nn, et, val)) { + mov = val; + ok = true; + return false; + } + }); + if(ok) { + switch(mov) { + case "before": + goTo.y = et_off.top - 2; + tree_component.drag_drop.marker.attr("class","marker"); + break; + case "after": + goTo.y = et_off.top - 2 + tree2.li_height; + tree_component.drag_drop.marker.attr("class","marker"); + break; + case "inside": + goTo.x -= 2; + goTo.y = et_off.top - 2 + tree2.li_height/2; + tree_component.drag_drop.marker.attr("class","marker_plus"); + break; + } + tmp.move_type = mov; + tmp.ref_node = $(event.target); + if(tmp.drag_help !== false) tmp.drag_help.find(".forbidden").removeClass("forbidden"); + tree_component.drag_drop.marker.css({ "left" : goTo.x , "top" : goTo.y }).show(); + } + } + + if( (et.is(".tree") || et.is("ul") ) && et.find("li:eq(0)").size() == 0) { + var et_off = et.offset(); + tmp.move_type = "inside"; + tmp.ref_node = cnt.children("ul:eq(0)"); + if(tmp.drag_help !== false) tmp.drag_help.find(".forbidden").removeClass("forbidden"); + tree_component.drag_drop.marker.attr("class","marker_plus"); + tree_component.drag_drop.marker.css({ "left" : (et_off.left + 10) , "top" : et_off.top + 15 }).show(); + } + else if( (event.target.tagName != "A" && event.target.tagName != "INS") || !ok) { + if(tmp.drag_help !== false) tmp.drag_help.find("li:eq(0) ins").addClass("forbidden"); + tmp.move_type = false; + tmp.ref_node = false; + tree_component.drag_drop.marker.hide(); + } + event.preventDefault(); + event.stopPropagation(); + return false; + } + return true; + }; + $(function () { + $(document).bind("mousemove.jstree", tree_component.mousemove); + $(document).bind("mouseup.jstree", tree_component.mouseup); + }); + + // cut, copy, paste stuff + tree_component.cut_copy = { + copy_nodes : false, + cut_nodes : false + }; + + // css stuff + tree_component.css = false; + tree_component.get_css = function(rule_name, delete_flag) { + rule_name = rule_name.toLowerCase(); + var css_rules = tree_component.css.cssRules || tree_component.css.rules; + var j = 0; + do { + if(css_rules.length && j > css_rules.length + 5) return false; + if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) { + if(delete_flag == true) { + if(tree_component.css.removeRule) document.styleSheets[i].removeRule(j); + if(tree_component.css.deleteRule) document.styleSheets[i].deleteRule(j); + return true; + } + else return css_rules[j]; + } + } + while (css_rules[++j]); + return false; + }; + tree_component.add_css = function(rule_name) { + if(tree_component.get_css(rule_name)) return false; + (tree_component.css.insertRule) ? tree_component.css.insertRule(rule_name + ' { }', 0) : tree_component.css.addRule(rule_name, null, 0); + return tree_component.get_css(rule_name); + }; + tree_component.remove_css = function(rule_name) { + return tree_component.get_css(rule_name, true); + }; + tree_component.add_sheet = function(opts) { + if(opts.str) { + var tmp = document.createElement("style"); + tmp.type = "text/css"; + if(tmp.styleSheet) tmp.styleSheet.cssText = opts.str; + else tmp.appendChild(document.createTextNode(opts.str)); + document.getElementsByTagName("head")[0].appendChild(tmp); + return tmp.sheet; + } + if(opts.url) { + if(document.createStyleSheet) { + try { document.createStyleSheet(opts.url); } catch (e) { }; + } + else { + var newSS = document.createElement('link'); + newSS.rel = 'stylesheet'; + newSS.type = 'text/css'; + newSS.media = "all"; + newSS.href = opts.url; + // var styles = "@import url(' " + url + " ');"; + // newSS.href ='data:text/css,'+escape(styles); + document.getElementsByTagName("head")[0].appendChild(newSS); + return newSS.styleSheet; + } + } + }; + $(function () { + var u = navigator.userAgent.toLowerCase(); + var v = (u.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]; + var css = '/* TREE LAYOUT */ .tree ul { margin:0 0 0 5px; padding:0 0 0 0; list-style-type:none; } .tree li { display:block; min-height:18px; line-height:18px; padding:0 0 0 15px; margin:0 0 0 0; /* Background fix */ clear:both; } .tree li ul { display:none; } .tree li a, .tree li span { display:inline-block;line-height:16px;height:16px;color:black;white-space:nowrap;text-decoration:none;padding:1px 4px 1px 4px;margin:0; } .tree li a:focus { outline: none; } .tree li a input, .tree li span input { margin:0;padding:0 0;display:inline-block;height:12px !important;border:1px solid white;background:white;font-size:10px;font-family:Verdana; } .tree li a input:not([class="xxx"]), .tree li span input:not([class="xxx"]) { padding:1px 0; } /* FOR DOTS */ .tree .ltr li.last { float:left; } .tree > ul li.last { overflow:visible; } /* OPEN OR CLOSE */ .tree li.open ul { display:block; } .tree li.closed ul { display:none !important; } /* FOR DRAGGING */ #jstree-dragged { position:absolute; top:-10px; left:-10px; margin:0; padding:0; } #jstree-dragged ul ul ul { display:none; } #jstree-marker { padding:0; margin:0; line-height:5px; font-size:1px; overflow:hidden; height:5px; position:absolute; left:-45px; top:-30px; z-index:1000; background-color:transparent; background-repeat:no-repeat; display:none; } #jstree-marker.marker { width:45px; background-position:-32px top; } #jstree-marker.marker_plus { width:5px; background-position:right top; } /* BACKGROUND DOTS */ .tree li li { overflow:hidden; } .tree > .ltr > li { display:table; } /* ICONS */ .tree ul ins { display:inline-block; text-decoration:none; width:16px; height:16px; } .tree .ltr ins { margin:0 4px 0 0px; } '; + if(/msie/.test(u) && !/opera/.test(u)) { + if(parseInt(v) == 6) css += '.tree li { height:18px; zoom:1; } .tree li li { overflow:visible; } .tree .ltr li.last { margin-top: expression( (this.previousSibling && /open/.test(this.previousSibling.className) ) ? "-2px" : "0"); } .marker { width:45px; background-position:-32px top; } .marker_plus { width:5px; background-position:right top; }'; + if(parseInt(v) == 7) css += '.tree li li { overflow:visible; } .tree .ltr li.last { margin-top: expression( (this.previousSibling && /open/.test(this.previousSibling.className) ) ? "-2px" : "0"); }'; + } + if(/opera/.test(u)) css += '.tree > ul > li.last:after { content:"."; display: block; height:1px; clear:both; visibility:hidden; }'; + if(/mozilla/.test(u) && !/(compatible|webkit)/.test(u) && v.indexOf("1.8") == 0) css += '.tree .ltr li a { display:inline; float:left; } .tree li ul { clear:both; }'; + tree_component.css = tree_component.add_sheet({ str : css }); + }); +})(jQuery); + +// Datastores +// HTML and JSON are included here by default +(function ($) { + $.extend($.tree.datastores, { + "html" : function () { + return { + get : function(obj, tree, opts) { + return obj && $(obj).size() ? $('
                ').append(tree.get_node(obj).clone()).html() : tree.container.children("ul:eq(0)").html(); + }, + parse : function(data, tree, opts, callback) { + if(callback) callback.call(null, data); + return data; + }, + load : function(data, tree, opts, callback) { + if(opts.url) { + $.ajax({ + 'type' : opts.method, + 'url' : opts.url, + 'contentType' : opts.contentType, + 'data' : data, + 'dataType' : "html", + 'success' : function (d, textStatus) { + callback.call(null, d); + }, + 'error' : function (xhttp, textStatus, errorThrown) { + callback.call(null, false); + tree.error(errorThrown + " " + textStatus); + } + }); + } + else { + callback.call(null, opts.static || tree.container.children("ul:eq(0)").html()); + } + } + }; + }, + "json" : function () { + return { + get : function(obj, tree, opts) { + var _this = this; + if(!obj || $(obj).size() == 0) obj = tree.container.children("ul").children("li"); + else obj = $(obj); + + if(!opts) opts = {}; + if(!opts.outer_attrib) opts.outer_attrib = [ "id", "rel", "class" ]; + if(!opts.inner_attrib) opts.inner_attrib = [ ]; + + if(obj.size() > 1) { + var arr = []; + obj.each(function () { + arr.push(_this.get(this, tree, opts)); + }); + return arr; + } + if(obj.size() == 0) return []; + + var json = { attributes : {}, data : {} }; + if(obj.hasClass("open")) json.data.state = "open"; + if(obj.hasClass("closed")) json.data.state = "closed"; + + for(var i in opts.outer_attrib) { + if(!opts.outer_attrib.hasOwnProperty(i)) continue; + var val = (opts.outer_attrib[i] == "class") ? obj.attr(opts.outer_attrib[i]).replace(/(^| )last( |$)/ig," ").replace(/(^| )(leaf|closed|open)( |$)/ig," ") : obj.attr(opts.outer_attrib[i]); + if(typeof val != "undefined" && val.toString().replace(" ","").length > 0) json.attributes[opts.outer_attrib[i]] = val; + delete val; + } + + if(tree.settings.languages.length) { + for(var i in tree.settings.languages) { + if(!tree.settings.languages.hasOwnProperty(i)) continue; + var a = obj.children("a." + tree.settings.languages[i]); + if(opts.force || opts.inner_attrib.length || a.children("ins").get(0).style.backgroundImage.toString().length || a.children("ins").get(0).className.length) { + json.data[tree.settings.languages[i]] = {}; + json.data[tree.settings.languages[i]].title = tree.get_text(obj,tree.settings.languages[i]); + if(a.children("ins").get(0).style.className.length) { + json.data[tree.settings.languages[i]].icon = a.children("ins").get(0).style.className; + } + if(a.children("ins").get(0).style.backgroundImage.length) { + json.data[tree.settings.languages[i]].icon = a.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")",""); + } + if(opts.inner_attrib.length) { + json.data[tree.settings.languages[i]].attributes = {}; + for(var j in opts.inner_attrib) { + if(!opts.inner_attrib.hasOwnProperty(j)) continue; + var val = a.attr(opts.inner_attrib[j]); + if(typeof val != "undefined" && val.toString().replace(" ","").length > 0) json.data[tree.settings.languages[i]].attributes[opts.inner_attrib[j]] = val; + delete val; + } + } + } + else { + json.data[tree.settings.languages[i]] = tree.get_text(obj,tree.settings.languages[i]); + } + } + } + else { + var a = obj.children("a"); + json.data.title = tree.get_text(obj); + + if(a.children("ins").size() && a.children("ins").get(0).className.length) { + json.data.icon = a.children("ins").get(0).className; + } + if(a.children("ins").size() && a.children("ins").get(0).style.backgroundImage.length) { + json.data.icon = a.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")",""); + } + + if(opts.inner_attrib.length) { + json.data.attributes = {}; + for(var j in opts.inner_attrib) { + if(!opts.inner_attrib.hasOwnProperty(j)) continue; + var val = a.attr(opts.inner_attrib[j]); + if(typeof val != "undefined" && val.toString().replace(" ","").length > 0) json.data.attributes[opts.inner_attrib[j]] = val; + delete val; + } + } + } + + if(obj.children("ul").size() > 0) { + json.children = []; + obj.children("ul").children("li").each(function () { + json.children.push(_this.get(this, tree, opts)); + }); + } + return json; + }, + parse : function(data, tree, opts, callback) { + if(Object.prototype.toString.apply(data) === "[object Array]") { + var str = ''; + for(var i = 0; i < data.length; i ++) { + if(typeof data[i] == "function") continue; + str += this.parse(data[i], tree, opts); + } + if(callback) callback.call(null, str); + return str; + } + + if(!data || !data.data) { + if(callback) callback.call(null, false); + return ""; + } + + var str = ''; + str += "
              •  "; + } + else str += " "; + str += ( (typeof data.data[tree.settings.languages[i]].title).toLowerCase() != "undefined" ? data.data[tree.settings.languages[i]].title : data.data[tree.settings.languages[i]] ) + ""; + } + } + else { + var attr = {}; + attr["href"] = ""; + attr["style"] = ""; + attr["class"] = ""; + if((typeof data.data.attributes).toLowerCase() != "undefined") { + for(var i in data.data.attributes) { + if(!data.data.attributes.hasOwnProperty(i)) continue; + if(i == "style" || i == "class") attr[i] += " " + data.data.attributes[i]; + else attr[i] = data.data.attributes[i]; + } + } + str += " "; + } + else str += " "; + str += ( (typeof data.data.title).toLowerCase() != "undefined" ? data.data.title : data.data ) + ""; + } + if(data.children && data.children.length) { + str += '
                  '; + for(var i = 0; i < data.children.length; i++) { + str += this.parse(data.children[i], tree, opts); + } + str += '
                '; + } + str += "
              • "; + if(callback) callback.call(null, str); + return str; + }, + load : function(data, tree, opts, callback) { + if(opts.static) { + callback.call(null, opts.static); + } + else { + $.ajax({ + 'type' : opts.method, + 'url' : opts.url, + 'contentType': opts.contentType, + 'data' : data, + 'dataType' : "json", + 'success' : function (d, textStatus) { + callback.call(null, d); + }, + 'error' : function (xhttp, textStatus, errorThrown) { + callback.call(null, false); + tree.error(errorThrown + " " + textStatus); + } + }); + } + } + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/umbraco/presentation/umbraco_client/Tree/jquery.tree.metadata.js b/umbraco/presentation/umbraco_client/Tree/jquery.tree.metadata.js new file mode 100644 index 0000000000..8c12a7bdf5 --- /dev/null +++ b/umbraco/presentation/umbraco_client/Tree/jquery.tree.metadata.js @@ -0,0 +1,17 @@ +(function ($) { + if(typeof $.metadata == "undefined") throw "jsTree metadata: jQuery metadata plugin not included."; + + $.extend($.tree.plugins, { + "metadata" : { + defaults : { + attribute : "data" + }, + callbacks : { + check : function(rule, obj, value, tree) { + var opts = $.extend(true, {}, $.tree.plugins.metadata.defaults, this.settings.plugins.metadata); + if(typeof $(obj).metadata({ type : "attr", name : opts.attribute })[rule] != "undefined") return $(obj).metadata()[rule]; + } + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/umbraco/presentation/umbraco_client/Tree/jquery.tree.min.js b/umbraco/presentation/umbraco_client/Tree/jquery.tree.min.js new file mode 100644 index 0000000000..27699ca854 --- /dev/null +++ b/umbraco/presentation/umbraco_client/Tree/jquery.tree.min.js @@ -0,0 +1 @@ +(function($){$.tree={datastores:{},plugins:{},defaults:{data:{async:false,type:"html",opts:{method:"GET",url:false}},selected:false,opened:[],languages:[],ui:{dots:true,animation:0,scroll_spd:4,theme_path:false,theme_name:"default",selected_parent_close:"select_parent",selected_delete:"select_previous"},types:{"default":{clickable:true,renameable:true,deletable:true,creatable:true,draggable:true,max_children:-1,max_depth:-1,valid_children:"all",icon:{image:false,position:false}}},rules:{multiple:false,multitree:"none",type_attr:"rel",createat:"bottom",drag_copy:"ctrl",drag_button:"left",use_max_children:true,use_max_depth:true,max_children:-1,max_depth:-1,valid_children:"all"},lang:{new_node:"New folder",loading:"Loading ..."},callback:{beforechange:function(NODE,TREE_OBJ){return true},beforeopen:function(NODE,TREE_OBJ){return true},beforeclose:function(NODE,TREE_OBJ){return true},beforemove:function(NODE,REF_NODE,TYPE,TREE_OBJ){return true},beforecreate:function(NODE,REF_NODE,TYPE,TREE_OBJ){return true},beforerename:function(NODE,LANG,TREE_OBJ){return true},beforedelete:function(NODE,TREE_OBJ){return true},beforedata:function(NODE,TREE_OBJ){return{id:$(NODE).attr("id")||0}},ondata:function(DATA,TREE_OBJ){return DATA},onparse:function(STR,TREE_OBJ){return STR},onhover:function(NODE,TREE_OBJ){},onselect:function(NODE,TREE_OBJ){},ondeselect:function(NODE,TREE_OBJ){},onchange:function(NODE,TREE_OBJ){},onrename:function(NODE,TREE_OBJ,RB){},onmove:function(NODE,REF_NODE,TYPE,TREE_OBJ,RB){},oncopy:function(NODE,REF_NODE,TYPE,TREE_OBJ,RB){},oncreate:function(NODE,REF_NODE,TYPE,TREE_OBJ,RB){},ondelete:function(NODE,TREE_OBJ,RB){},onopen:function(NODE,TREE_OBJ){},onopen_all:function(TREE_OBJ){},onclose_all:function(TREE_OBJ){},onclose:function(NODE,TREE_OBJ){},error:function(TEXT,TREE_OBJ){},ondblclk:function(NODE,TREE_OBJ){TREE_OBJ.toggle_branch.call(TREE_OBJ,NODE);TREE_OBJ.select_branch.call(TREE_OBJ,NODE)},onrgtclk:function(NODE,TREE_OBJ,EV){},onload:function(TREE_OBJ){},oninit:function(TREE_OBJ){},onfocus:function(TREE_OBJ){},ondestroy:function(TREE_OBJ){},onsearch:function(NODES,TREE_OBJ){NODES.addClass("search")},ondrop:function(NODE,REF_NODE,TYPE,TREE_OBJ){},check:function(RULE,NODE,VALUE,TREE_OBJ){return VALUE},check_move:function(NODE,REF_NODE,TYPE,TREE_OBJ){return true}},plugins:{}},create:function(){return new tree_component()},focused:function(){return tree_component.inst[tree_component.focused]},reference:function(obj){var o=$(obj);if(!o.size())o=$("#"+obj);if(!o.size())return null;o=(o.is(".tree"))?o.attr("id"):o.parents(".tree:eq(0)").attr("id");return tree_component.inst[o]||null},rollback:function(data){for(var i in data){if(!data.hasOwnProperty(i))continue;var tmp=tree_component.inst[i];var lock=!tmp.locked;if(lock)tmp.lock(true);tmp.inp=false;tmp.container.html(data[i].html).find(".dragged").removeClass("dragged").end().find(".hover").removeClass("hover");if(data[i].selected){tmp.selected=$("#"+data[i].selected);tmp.selected_arr=[];tmp.container.find("a.clicked").each(function(){tmp.selected_arr.push(tmp.get_node(this))})}if(lock)tmp.lock(false);delete lock;delete tmp}},drop_mode:function(opts){opts=$.extend(opts,{show:false,type:"default",str:"Foreign node"});tree_component.drag_drop.foreign=true;tree_component.drag_drop.isdown=true;tree_component.drag_drop.moving=true;tree_component.drag_drop.appended=false;tree_component.drag_drop.f_type=opts.type;tree_component.drag_drop.f_data=opts;if(!opts.show){tree_component.drag_drop.drag_help=false;tree_component.drag_drop.drag_node=false}else{tree_component.drag_drop.drag_help=$("");tree_component.drag_drop.drag_node=tree_component.drag_drop.drag_help.find("li:eq(0)")}if($.tree.drag_start!==false)$.tree.drag_start.call(null,false)},drag_start:false,drag:false,drag_end:false};$.fn.tree=function(opts){return this.each(function(){var conf=$.extend({},opts);if(tree_component.inst&&tree_component.inst[$(this).attr('id')])tree_component.inst[$(this).attr('id')].destroy();if(conf!==false)new tree_component().init(this,conf)})};function tree_component(){return{cntr:++tree_component.cntr,settings:$.extend({},$.tree.defaults),init:function(elem,conf){var _this=this;this.container=$(elem);if(this.container.size==0)return false;tree_component.inst[this.cntr]=this;if(!this.container.attr("id"))this.container.attr("id","jstree_"+this.cntr);tree_component.inst[this.container.attr("id")]=tree_component.inst[this.cntr];tree_component.focused=this.cntr;this.settings=$.extend(true,{},this.settings,conf);if(this.settings.languages&&this.settings.languages.length){this.current_lang=this.settings.languages[0];var st=false;var id="#"+this.container.attr("id");for(var ln=0;ln a ins { ";else type_icons+="#"+this.container.attr("id")+" li[rel="+t+"] > a ins { ";if(this.settings.types[t].icon.image)type_icons+=" background-image:url("+this.settings.types[t].icon.image+"); ";if(this.settings.types[t].icon.position)type_icons+=" background-position:"+this.settings.types[t].icon.position+"; ";type_icons+="} "}}if(type_icons!="")tree_component.add_sheet({str:type_icons});if(this.settings.rules.multiple)this.selected_arr=[];this.offset=false;this.hovered=false;this.locked=false;if(tree_component.drag_drop.marker===false)tree_component.drag_drop.marker=$("
                ").attr({id:"jstree-marker"}).hide().appendTo("body");this.callback("oninit",[this]);this.refresh();this.attach_events();this.focus()},refresh:function(obj){if(this.locked)return this.error("LOCKED");var _this=this;if(obj&&!this.settings.data.async)obj=false;this.is_partial_refresh=obj?true:false;this.opened=Array();if(this.settings.opened!=false){$.each(this.settings.opened,function(i,item){if(this.replace(/^#/,"").length>0){_this.opened.push("#"+this.replace(/^#/,""))}});this.settings.opened=false}else{this.container.find("li.open").each(function(i){if(this.id){_this.opened.push("#"+this.id)}})}if(this.selected){this.settings.selected=Array();if(obj){$(obj).find("li:has(a.clicked)").each(function(){if(this.id)_this.settings.selected.push("#"+this.id)})}else{if(this.selected_arr){$.each(this.selected_arr,function(){if(this.attr("id"))_this.settings.selected.push("#"+this.attr("id"))})}else{if(this.selected.attr("id"))this.settings.selected.push("#"+this.selected.attr("id"))}}}else if(this.settings.selected!==false){var tmp=Array();if((typeof this.settings.selected).toLowerCase()=="object"){$.each(this.settings.selected,function(){if(this.replace(/^#/,"").length>0)tmp.push("#"+this.replace(/^#/,""))})}else{if(this.settings.selected.replace(/^#/,"").length>0)tmp.push("#"+this.settings.selected.replace(/^#/,""))}this.settings.selected=tmp}if(obj&&this.settings.data.async){this.opened=Array();obj=this.get_node(obj);obj.find("li.open").each(function(i){_this.opened.push("#"+this.id)});if(obj.hasClass("open"))obj.removeClass("open").addClass("closed");if(obj.hasClass("leaf"))obj.removeClass("leaf");obj.children("ul:eq(0)").html("");return this.open_branch(obj,true,function(){_this.reselect.apply(_this)})}var _this=this;var _datastore=new $.tree.datastores[this.settings.data.type]();if(this.container.children("ul").size()==0){this.container.html("")}_datastore.load(this.callback("beforedata",[false,this]),this,this.settings.data.opts,function(data){data=_this.callback("ondata",[data,_this]);_datastore.parse(data,_this,_this.settings.data.opts,function(str){str=_this.callback("onparse",[str,_this]);_this.container.empty().append($("
                  ").html(str));_this.container.find("li:last-child").addClass("last").end().find("li:has(ul)").not(".open").addClass("closed");_this.container.find("li").not(".open").not(".closed").addClass("leaf");_this.reselect()})})},reselect:function(is_callback){var _this=this;if(!is_callback)this.cl_count=0;else this.cl_count--;if(this.opened&&this.opened.length){var opn=false;for(var j=0;this.opened&&j0){opn=true;var tmp=this.opened[j].toString().replace('/','\\/');delete this.opened[j];this.open_branch(tmp,true,function(){_this.reselect.apply(_this,[true])});this.cl_count++}}else this.open_branch(this.opened[j],true)}if(this.settings.data.async&&opn)return;if(this.cl_count>0)return;delete this.opened}if(this.cl_count>0)return;this.container.css("direction","ltr").children("ul:eq(0)").addClass("ltr");if(this.settings.ui.dots==false)this.container.children("ul:eq(0)").addClass("no_dots");if(this.scrtop){this.container.scrollTop(_this.scrtop);delete this.scrtop}if(this.settings.selected!==false){$.each(this.settings.selected,function(i){if(_this.is_partial_refresh)_this.select_branch($(_this.settings.selected[i].toString().replace('/','\\/'),_this.container),(_this.settings.rules.multiple!==false));else _this.select_branch($(_this.settings.selected[i].toString().replace('/','\\/'),_this.container),(_this.settings.rules.multiple!==false&&i>0))});this.settings.selected=false}this.callback("onload",[_this])},get:function(obj,format,opts){if(!format)format=this.settings.data.type;if(!opts)opts=this.settings.data.opts;return new $.tree.datastores[format]().get(obj,this,opts)},attach_events:function(){var _this=this;this.container.bind("mousedown.jstree",function(event){if(tree_component.drag_drop.isdown){tree_component.drag_drop.move_type=false;event.preventDefault();event.stopPropagation();event.stopImmediatePropagation();return false}}).bind("mouseup.jstree",function(event){setTimeout(function(){_this.focus.apply(_this)},5)}).bind("click.jstree",function(event){return true});$("#"+this.container.attr("id")+" li").live("click",function(event){if(event.target.tagName!="LI")return true;_this.off_height();if(event.pageY-$(event.target).offset().top>_this.li_height)return true;_this.toggle_branch.apply(_this,[event.target]);event.stopPropagation();return false});$("#"+this.container.attr("id")+" li a").live("click.jstree",function(event){if(event.which&&event.which==3)return true;if(_this.locked){event.preventDefault();event.target.blur();return _this.error("LOCKED")}_this.select_branch.apply(_this,[event.target,event.ctrlKey||_this.settings.rules.multiple=="on"]);if(_this.inp){_this.inp.blur()}event.preventDefault();event.target.blur();return false}).live("dblclick.jstree",function(event){if(_this.locked){event.preventDefault();event.stopPropagation();event.target.blur();return _this.error("LOCKED")}_this.callback("ondblclk",[_this.get_node(event.target).get(0),_this]);event.preventDefault();event.stopPropagation();event.target.blur()}).live("contextmenu.jstree",function(event){if(_this.locked){event.target.blur();return _this.error("LOCKED")}return _this.callback("onrgtclk",[_this.get_node(event.target).get(0),_this,event])}).live("mouseover.jstree",function(event){if(_this.locked){event.preventDefault();event.stopPropagation();return _this.error("LOCKED")}if(_this.hovered!==false&&(event.target.tagName=="A"||event.target.tagName=="INS")){_this.hovered.children("a").removeClass("hover");_this.hovered=false}_this.callback("onhover",[_this.get_node(event.target).get(0),_this])}).live("mousedown.jstree",function(event){if(_this.settings.rules.drag_button=="left"&&event.which&&event.which!=1)return true;if(_this.settings.rules.drag_button=="right"&&event.which&&event.which!=3)return true;_this.focus.apply(_this);if(_this.locked)return _this.error("LOCKED");var obj=_this.get_node(event.target);if(_this.settings.rules.multiple!=false&&_this.selected_arr.length>1&&obj.children("a:eq(0)").hasClass("clicked")){var counter=0;for(var i in _this.selected_arr){if(!_this.selected_arr.hasOwnProperty(i))continue;if(_this.check("draggable",_this.selected_arr[i])){_this.selected_arr[i].addClass("dragged");tree_component.drag_drop.origin_tree=_this;counter++}}if(counter>0){if(_this.check("draggable",obj))tree_component.drag_drop.drag_node=obj;else tree_component.drag_drop.drag_node=_this.container.find("li.dragged:eq(0)");tree_component.drag_drop.isdown=true;tree_component.drag_drop.drag_help=$("
                  ").append("
                    ");var tmp=tree_component.drag_drop.drag_node.clone();if(_this.settings.languages.length>0)tmp.find("a").not("."+_this.current_lang).hide();tree_component.drag_drop.drag_help.children("ul:eq(0)").append(tmp);tree_component.drag_drop.drag_help.find("li:eq(0)").removeClass("last").addClass("last").children("a").html(" Multiple selection").end().children("ul").remove();tree_component.drag_drop.dragged=_this.container.find("li.dragged")}}else{if(_this.check("draggable",obj)){tree_component.drag_drop.drag_node=obj;tree_component.drag_drop.drag_help=$("
                    ").append("
                      ");var tmp=obj.clone();if(_this.settings.languages.length>0)tmp.find("a").not("."+_this.current_lang).hide();tree_component.drag_drop.drag_help.children("ul:eq(0)").append(tmp);tree_component.drag_drop.drag_help.find("li:eq(0)").removeClass("last").addClass("last");tree_component.drag_drop.isdown=true;tree_component.drag_drop.foreign=false;tree_component.drag_drop.origin_tree=_this;obj.addClass("dragged");tree_component.drag_drop.dragged=_this.container.find("li.dragged")}}tree_component.drag_drop.init_x=event.pageX;tree_component.drag_drop.init_y=event.pageY;obj.blur();event.preventDefault();event.stopPropagation();return false})},focus:function(){if(this.locked)return false;if(tree_component.focused!=this.cntr){tree_component.focused=this.cntr;this.callback("onfocus",[this])}},off_height:function(){if(this.offset===false){this.container.css({position:"relative"});this.offset=this.container.offset();var tmp=0;tmp=parseInt($.curCSS(this.container.get(0),"paddingTop",true),10);if(tmp)this.offset.top+=tmp;tmp=parseInt($.curCSS(this.container.get(0),"borderTopWidth",true),10);if(tmp)this.offset.top+=tmp;this.container.css({position:""})}if(!this.li_height){var tmp=this.container.find("ul li.closed, ul li.leaf").eq(0);this.li_height=tmp.height();if(tmp.children("ul:eq(0)").size())this.li_height-=tmp.children("ul:eq(0)").height();if(!this.li_height)this.li_height=18}},scroll_check:function(x,y){var _this=this;var cnt=_this.container;var off=_this.container.offset();var st=cnt.scrollTop();var sl=cnt.scrollLeft();var h_cor=(cnt.get(0).scrollWidth>cnt.width())?40:20;if(y-off.top<20)cnt.scrollTop(Math.max((st-_this.settings.ui.scroll_spd),0));if(cnt.height()-(y-off.top)this.container.width())?40:20;if(off_t+5end_t)this.container.scrollTop(this.container.scrollTop()+(off_t+h_cor-end_t))},get_node:function(obj){return $(obj).closest("li")},get_type:function(obj){obj=!obj?this.selected:this.get_node(obj);if(!obj)return;var tmp=obj.attr(this.settings.rules.type_attr);return tmp||"default"},set_type:function(str,obj){obj=!obj?this.selected:this.get_node(obj);if(!obj||!str)return;obj.attr(this.settings.rules.type_attr,str)},get_text:function(obj,lang){obj=this.get_node(obj);if(!obj||obj.size()==0)return"";if(this.settings.languages&&this.settings.languages.length){lang=lang?lang:this.current_lang;obj=obj.children("a."+lang)}else obj=obj.children("a:visible");var val="";obj.contents().each(function(){if(this.nodeType==3){val=this.data;return false}});return val},check:function(rule,obj){if(this.locked)return false;var v=false;if(obj===-1){if(typeof this.settings.rules[rule]!="undefined")v=this.settings.rules[rule]}else{obj=!obj?this.selected:this.get_node(obj);if(!obj)return;var t=this.get_type(obj);if(typeof this.settings.types[t]!="undefined"&&typeof this.settings.types[t][rule]!="undefined")v=this.settings.types[t][rule];else if(typeof this.settings.types["default"]!="undefined"&&typeof this.settings.types["default"][rule]!="undefined")v=this.settings.types["default"][rule]}if(typeof v=="function")v=v.call(null,obj,this);v=this.callback("check",[rule,obj,v,this]);return v},check_move:function(nod,ref_node,how){if(this.locked)return false;if($(ref_node).closest("li.dragged").size())return false;var tree1=nod.parents(".tree:eq(0)").get(0);var tree2=ref_node.parents(".tree:eq(0)").get(0);if(tree1&&tree1!=tree2){var m=$.tree.reference(tree2.id).settings.rules.multitree;if(m=="none"||($.isArray(m)&&$.inArray(tree1.id,m)==-1))return false}var p=(how!="inside")?this.parent(ref_node):this.get_node(ref_node);nod=this.get_node(nod);if(p==false)return false;var r={max_depth:this.settings.rules.use_max_depth?this.check("max_depth",p):-1,max_children:this.settings.rules.use_max_children?this.check("max_children",p):-1,valid_children:this.check("valid_children",p)};var nod_type=(typeof nod=="string")?nod:this.get_type(nod);if(typeof r.valid_children!="undefined"&&(r.valid_children=="none"||(typeof r.valid_children=="object"&&$.inArray(nod_type,$.makeArray(r.valid_children))==-1)))return false;if(this.settings.rules.use_max_children){if(typeof r.max_children!="undefined"&&r.max_children!=-1){if(r.max_children==0)return false;var c_count=1;if(tree_component.drag_drop.moving==true&&tree_component.drag_drop.foreign==false){c_count=tree_component.drag_drop.dragged.size();c_count=c_count-p.find('> ul > li.dragged').size()}if(r.max_children ul > li').size()+c_count)return false}}if(this.settings.rules.use_max_depth){if(typeof r.max_depth!="undefined"&&r.max_depth===0)return this.error("MOVE: MAX-DEPTH REACHED");var mx=(r.max_depth>0)?r.max_depth:false;var i=0;var t=p;while(t!==-1){t=this.parent(t);i++;var m=this.check("max_depth",t);if(m>=0){mx=(mx===false)?(m-i):Math.min(mx,m-i)}if(mx!==false&&mx<=0)return this.error("MOVE: MAX-DEPTH REACHED")}if(mx!==false&&mx<=0)return this.error("MOVE: MAX-DEPTH REACHED");if(mx!==false){var incr=1;if(typeof nod!="string"){var t=nod;while(t.size()>0){if(mx-incr<0)return this.error("MOVE: MAX-DEPTH REACHED");t=t.children("ul").children("li");incr++}}}}if(this.callback("check_move",[nod,ref_node,how,this])==false)return false;return true},hover_branch:function(obj){if(this.locked)return this.error("LOCKED");var _this=this;var obj=_this.get_node(obj);if(!obj.size())return this.error("HOVER: NOT A VALID NODE");if(!_this.check("clickable",obj))return this.error("SELECT: NODE NOT SELECTABLE");if(this.hovered)this.hovered.children("A").removeClass("hover");this.hovered=obj;this.hovered.children("a").addClass("hover");this.scroll_into_view(this.hovered)},select_branch:function(obj,multiple){if(this.locked)return this.error("LOCKED");if(!obj&&this.hovered!==false)obj=this.hovered;var _this=this;obj=_this.get_node(obj);if(!obj.size())return this.error("SELECT: NOT A VALID NODE");obj.children("a").removeClass("hover");if(!_this.check("clickable",obj))return this.error("SELECT: NODE NOT SELECTABLE");if(_this.callback("beforechange",[obj.get(0),_this])===false)return this.error("SELECT: STOPPED BY USER");if(this.settings.rules.multiple!=false&&multiple&&obj.children("a.clicked").size()>0){return this.deselect_branch(obj)}if(this.settings.rules.multiple!=false&&multiple){this.selected_arr.push(obj)}if(this.settings.rules.multiple!=false&&!multiple){for(var i in this.selected_arr){if(!this.selected_arr.hasOwnProperty(i))continue;this.selected_arr[i].children("A").removeClass("clicked");this.callback("ondeselect",[this.selected_arr[i].get(0),_this])}this.selected_arr=[];this.selected_arr.push(obj);if(this.selected&&this.selected.children("A").hasClass("clicked")){this.selected.children("A").removeClass("clicked");this.callback("ondeselect",[this.selected.get(0),_this])}}if(!this.settings.rules.multiple){if(this.selected){this.selected.children("A").removeClass("clicked");this.callback("ondeselect",[this.selected.get(0),_this])}}this.selected=obj;if(this.hovered!==false){this.hovered.children("A").removeClass("hover");this.hovered=obj}this.selected.children("a").addClass("clicked").end().parents("li.closed").each(function(){_this.open_branch(this,true)});this.scroll_into_view(this.selected);this.callback("onselect",[this.selected.get(0),_this]);this.callback("onchange",[this.selected.get(0),_this])},deselect_branch:function(obj){if(this.locked)return this.error("LOCKED");var _this=this;var obj=this.get_node(obj);if(obj.children("a.clicked").size()==0)return this.error("DESELECT: NODE NOT SELECTED");obj.children("a").removeClass("clicked");this.callback("ondeselect",[obj.get(0),_this]);if(this.settings.rules.multiple!=false&&this.selected_arr.length>1){this.selected_arr=[];this.container.find("a.clicked").filter(":first-child").parent().each(function(){_this.selected_arr.push($(this))});if(obj.get(0)==this.selected.get(0)){this.selected=this.selected_arr[0]}}else{if(this.settings.rules.multiple!=false)this.selected_arr=[];this.selected=false}this.callback("onchange",[obj.get(0),_this])},toggle_branch:function(obj){if(this.locked)return this.error("LOCKED");var obj=this.get_node(obj);if(obj.hasClass("closed"))return this.open_branch(obj);if(obj.hasClass("open"))return this.close_branch(obj)},open_branch:function(obj,disable_animation,callback){var _this=this;if(this.locked)return this.error("LOCKED");var obj=this.get_node(obj);if(!obj.size())return this.error("OPEN: NO SUCH NODE");if(obj.hasClass("leaf"))return this.error("OPEN: OPENING LEAF NODE");if(this.settings.data.async&&obj.find("li").size()==0){if(this.callback("beforeopen",[obj.get(0),this])===false)return this.error("OPEN: STOPPED BY USER");obj.children("ul:eq(0)").remove().end().append("");obj.removeClass("closed").addClass("open");var _datastore=new $.tree.datastores[this.settings.data.type]();_datastore.load(this.callback("beforedata",[obj,this]),this,this.settings.data.opts,function(data){data=_this.callback("ondata",[data,_this]);if(!data||data.length==0){obj.removeClass("closed").removeClass("open").addClass("leaf").children("ul").remove();if(callback)callback.call();return}_datastore.parse(data,_this,_this.settings.data.opts,function(str){str=_this.callback("onparse",[str,_this]);obj.children("ul:eq(0)").replaceWith($("
                        ").html(str));obj.find("li:last-child").addClass("last").end().find("li:has(ul)").not(".open").addClass("closed");obj.find("li").not(".open").not(".closed").addClass("leaf");_this.open_branch.apply(_this,[obj]);if(callback)callback.call()})});return true}else{if(!this.settings.data.async){if(this.callback("beforeopen",[obj.get(0),this])===false)return this.error("OPEN: STOPPED BY USER")}if(parseInt(this.settings.ui.animation)>0&&!disable_animation){obj.children("ul:eq(0)").css("display","none");obj.removeClass("closed").addClass("open");obj.children("ul:eq(0)").slideDown(parseInt(this.settings.ui.animation),function(){$(this).css("display","");if(callback)callback.call()})}else{obj.removeClass("closed").addClass("open");if(callback)callback.call()}this.callback("onopen",[obj.get(0),this]);return true}},close_branch:function(obj,disable_animation){if(this.locked)return this.error("LOCKED");var _this=this;var obj=this.get_node(obj);if(!obj.size())return this.error("CLOSE: NO SUCH NODE");if(_this.callback("beforeclose",[obj.get(0),_this])===false)return this.error("CLOSE: STOPPED BY USER");if(parseInt(this.settings.ui.animation)>0&&!disable_animation&&obj.children("ul:eq(0)").size()==1){obj.children("ul:eq(0)").slideUp(parseInt(this.settings.ui.animation),function(){if(obj.hasClass("open"))obj.removeClass("open").addClass("closed");$(this).css("display","")})}else{if(obj.hasClass("open"))obj.removeClass("open").addClass("closed")}if(this.selected&&this.settings.ui.selected_parent_close!==false&&obj.children("ul:eq(0)").find("a.clicked").size()>0){obj.find("li:has(a.clicked)").each(function(){_this.deselect_branch(this)});if(this.settings.ui.selected_parent_close=="select_parent"&&obj.children("a.clicked").size()==0)this.select_branch(obj,(this.settings.rules.multiple!=false&&this.selected_arr.length>0))}this.callback("onclose",[obj.get(0),this])},open_all:function(obj,callback){if(this.locked)return this.error("LOCKED");var _this=this;obj=obj?this.get_node(obj):this.container;var s=obj.find("li.closed").size();if(!callback)this.cl_count=0;else this.cl_count--;if(s>0){this.cl_count+=s;obj.find("li.closed").each(function(){var __this=this;_this.open_branch.apply(_this,[this,true,function(){_this.open_all.apply(_this,[__this,true])}])})}else if(this.cl_count==0)this.callback("onopen_all",[this])},close_all:function(obj){if(this.locked)return this.error("LOCKED");var _this=this;obj=obj?this.get_node(obj):this.container;obj.find("li.open").each(function(){_this.close_branch(this,true)});this.callback("onclose_all",[this])},set_lang:function(i){if(!$.isArray(this.settings.languages)||this.settings.languages.length==0)return false;if(this.locked)return this.error("LOCKED");if(!$.inArray(i,this.settings.languages)&&typeof this.settings.languages[i]!="undefined")i=this.settings.languages[i];if(typeof i=="undefined")return false;if(i==this.current_lang)return true;var st=false;var id="#"+this.container.attr("id");st=tree_component.get_css(id+" ."+this.current_lang);if(st!==false)st.style.display="none";st=tree_component.get_css(id+" ."+i);if(st!==false)st.style.display="";this.current_lang=i;return true},get_lang:function(){if(!$.isArray(this.settings.languages)||this.settings.languages.length==0)return false;return this.current_lang},create:function(obj,ref_node,position){if(this.locked)return this.error("LOCKED");var root=false;if(ref_node==-1){root=true;ref_node=this.container}else ref_node=ref_node?this.get_node(ref_node):this.selected;if(!root&&(!ref_node||!ref_node.size()))return this.error("CREATE: NO NODE SELECTED");var pos=position;var tmp=ref_node;if(position=="before"){position=ref_node.parent().children().index(ref_node);ref_node=ref_node.parents("li:eq(0)")}if(position=="after"){position=ref_node.parent().children().index(ref_node)+1;ref_node=ref_node.parents("li:eq(0)")}if(!root&&ref_node.size()==0){root=true;ref_node=this.container}if(!root){if(!this.check("creatable",ref_node))return this.error("CREATE: CANNOT CREATE IN NODE");if(ref_node.hasClass("closed")){if(this.settings.data.async&&ref_node.children("ul").size()==0){var _this=this;return this.open_branch(ref_node,true,function(){_this.create.apply(_this,[obj,ref_node,position])})}else this.open_branch(ref_node,true)}}var torename=false;if(!obj)obj={};else obj=$.extend(true,{},obj);if(!obj.attributes)obj.attributes={};if(!obj.attributes[this.settings.rules.type_attr])obj.attributes[this.settings.rules.type_attr]=this.get_type(tmp)||"default";if(this.settings.languages.length){if(!obj.data){obj.data={};torename=true}for(var i=0;i=this.children(ref_node).size())return this.error("CREATE: MAX_CHILDREN REACHED")}if(this.settings.rules.use_max_depth){if(typeof r.max_depth!="undefined"&&r.max_depth===0)return this.error("CREATE: MAX-DEPTH REACHED");var mx=(r.max_depth>0)?r.max_depth:false;var i=0;var t=ref_node;while(t!==-1&&!root){t=this.parent(t);i++;var m=this.check("max_depth",t);if(m>=0){mx=(mx===false)?(m-i):Math.min(mx,m-i)}if(mx!==false&&mx<=0)return this.error("CREATE: MAX-DEPTH REACHED")}if(mx!==false&&mx<=0)return this.error("CREATE: MAX-DEPTH REACHED");if(mx!==false){var incr=1;var t=$li;while(t.size()>0){if(mx-incr<0)return this.error("CREATE: MAX-DEPTH REACHED");t=t.children("ul").children("li");incr++}}}if((typeof position).toLowerCase()=="undefined"||position=="inside")position=(this.settings.rules.createat=="top")?0:ref_node.children("ul:eq(0)").children("li").size();if(ref_node.children("ul").size()==0||(root==true&&ref_node.children("ul").children("li").size()==0)){if(!root)var a=this.moved($li,ref_node.children("a:eq(0)"),"inside",true);else var a=this.moved($li,this.container.children("ul:eq(0)"),"inside",true)}else if(pos=="before"&&ref_node.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").size())var a=this.moved($li,ref_node.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").children("a:eq(0)"),"before",true);else if(pos=="after"&&ref_node.children("ul:eq(0)").children("li:nth-child("+(position)+")").size())var a=this.moved($li,ref_node.children("ul:eq(0)").children("li:nth-child("+(position)+")").children("a:eq(0)"),"after",true);else if(ref_node.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").size())var a=this.moved($li,ref_node.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").children("a:eq(0)"),"before",true);else var a=this.moved($li,ref_node.children("ul:eq(0)").children("li:last").children("a:eq(0)"),"after",true);if(a===false)return this.error("CREATE: ABORTED");if(torename){this.select_branch($li.children("a:eq(0)"));this.rename()}return $li},rename:function(obj,new_name){if(this.locked)return this.error("LOCKED");obj=obj?this.get_node(obj):this.selected;var _this=this;if(!obj||!obj.size())return this.error("RENAME: NO NODE SELECTED");if(!this.check("renameable",obj))return this.error("RENAME: NODE NOT RENAMABLE");if(!this.callback("beforerename",[obj.get(0),_this.current_lang,_this]))return this.error("RENAME: STOPPED BY USER");obj.parents("li.closed").each(function(){_this.open_branch(this)});if(this.current_lang)obj=obj.find("a."+this.current_lang);else obj=obj.find("a:first");var rb={};rb[this.container.attr("id")]=this.get_rollback();var icn=obj.children("ins").clone();if((typeof new_name).toLowerCase()=="string"){obj.text(new_name).prepend(icn);_this.callback("onrename",[_this.get_node(obj).get(0),_this,rb])}else{var last_value="";obj.contents().each(function(){if(this.nodeType==3){last_value=this.data;return false}});_this.inp=$("");_this.inp.val(last_value.replace(/&/g,"&").replace(/>/g,">").replace(/</g,"<")).bind("mousedown",function(event){event.stopPropagation()}).bind("mouseup",function(event){event.stopPropagation()}).bind("click",function(event){event.stopPropagation()}).bind("keyup",function(event){var key=event.keyCode||event.which;if(key==27){this.value=last_value;this.blur();return}if(key==13){this.blur();return}});_this.inp.blur(function(event){if(this.value=="")this.value=last_value;obj.text(this.value).prepend(icn);obj.get(0).style.display="";obj.prevAll("span").remove();_this.inp=false;_this.callback("onrename",[_this.get_node(obj).get(0),_this,rb])});var spn=$("").addClass(obj.attr("class")).append(icn).append(_this.inp);obj.get(0).style.display="none";obj.parent().prepend(spn);_this.inp.get(0).focus();_this.inp.get(0).select()}},remove:function(obj){if(this.locked)return this.error("LOCKED");var _this=this;var rb={};rb[this.container.attr("id")]=this.get_rollback();if(obj&&(!this.selected||this.get_node(obj).get(0)!=this.selected.get(0))){obj=this.get_node(obj);if(obj.size()){if(!this.check("deletable",obj))return this.error("DELETE: NODE NOT DELETABLE");if(!this.callback("beforedelete",[obj.get(0),_this]))return this.error("DELETE: STOPPED BY USER");$parent=obj.parent();if(obj.find("a.clicked").size()){var reset_selected=false;_this.selected_arr=[];this.container.find("a.clicked").filter(":first-child").parent().each(function(){if(!reset_selected&&this==_this.selected.get(0))reset_selected=true;if($(this).parents().index(obj)!=-1)return true;_this.selected_arr.push($(this))});if(reset_selected)this.selected=this.selected_arr[0]||false}obj=obj.remove();$parent.children("li:last").addClass("last");if($parent.children("li").size()==0){$li=$parent.parents("li:eq(0)");$li.removeClass("open").removeClass("closed").addClass("leaf").children("ul").remove()}this.callback("ondelete",[obj.get(0),this,rb])}}else if(this.selected){if(!this.check("deletable",this.selected))return this.error("DELETE: NODE NOT DELETABLE");if(!this.callback("beforedelete",[this.selected.get(0),_this]))return this.error("DELETE: STOPPED BY USER");$parent=this.selected.parent();var obj=this.selected;if(this.settings.rules.multiple==false||this.selected_arr.length==1){var stop=true;var tmp=this.settings.ui.selected_delete=="select_previous"?this.prev(this.selected):false}obj=obj.remove();$parent.children("li:last").addClass("last");if($parent.children("li").size()==0){$li=$parent.parents("li:eq(0)");$li.removeClass("open").removeClass("closed").addClass("leaf").children("ul").remove()}if(!stop&&this.settings.rules.multiple!=false){var _this=this;this.selected_arr=[];this.container.find("a.clicked").filter(":first-child").parent().each(function(){_this.selected_arr.push($(this))});if(this.selected_arr.length>0){this.selected=this.selected_arr[0];this.remove()}}if(stop&&tmp)this.select_branch(tmp);this.callback("ondelete",[obj.get(0),this,rb])}else return this.error("DELETE: NO NODE SELECTED")},next:function(obj,strict){obj=this.get_node(obj);if(!obj.size())return false;if(strict)return(obj.nextAll("li").size()>0)?obj.nextAll("li:eq(0)"):false;if(obj.hasClass("open"))return obj.find("li:eq(0)");else if(obj.nextAll("li").size()>0)return obj.nextAll("li:eq(0)");else return obj.parents("li").next("li").eq(0)},prev:function(obj,strict){obj=this.get_node(obj);if(!obj.size())return false;if(strict)return(obj.prevAll("li").size()>0)?obj.prevAll("li:eq(0)"):false;if(obj.prev("li").size()){var obj=obj.prev("li").eq(0);while(obj.hasClass("open"))obj=obj.children("ul:eq(0)").children("li:last");return obj}else return obj.parents("li:eq(0)").size()?obj.parents("li:eq(0)"):false},parent:function(obj){obj=this.get_node(obj);if(!obj.size())return false;return obj.parents("li:eq(0)").size()?obj.parents("li:eq(0)"):-1},children:function(obj){if(obj===-1)return this.container.children("ul:eq(0)").children("li");obj=this.get_node(obj);if(!obj.size())return false;return obj.children("ul:eq(0)").children("li")},toggle_dots:function(){if(this.settings.ui.dots){this.settings.ui.dots=false;this.container.children("ul:eq(0)").addClass("no_dots")}else{this.settings.ui.dots=true;this.container.children("ul:eq(0)").removeClass("no_dots")}},callback:function(cb,args){var p=false;var r=null;for(var i in this.settings.plugins){if(typeof $.tree.plugins[i]!="object")continue;p=$.tree.plugins[i];if(p.callbacks&&typeof p.callbacks[cb]=="function")r=p.callbacks[cb].apply(this,args);if(typeof r!=="undefined"&&r!==null){if(cb=="ondata"||cb=="onparse")args[0]=r;else return r}}p=this.settings.callback[cb];if(typeof p=="function")return p.apply(null,args)},get_rollback:function(){var rb={};rb.html=this.container.html();rb.selected=this.selected?this.selected.attr("id"):false;return rb},moved:function(what,where,how,is_new,is_copy,rb){var what=$(what);var $parent=$(what).parents("ul:eq(0)");var $where=$(where);if($where.is("ins"))$where=$where.parent();if(!rb){var rb={};rb[this.container.attr("id")]=this.get_rollback();if(!is_new){var tmp=what.size()>1?what.eq(0).parents(".tree:eq(0)"):what.parents(".tree:eq(0)");if(tmp.get(0)!=this.container.get(0)){tmp=tree_component.inst[tmp.attr("id")];rb[tmp.container.attr("id")]=tmp.get_rollback()}delete tmp}}if(how=="inside"&&this.settings.data.async){var _this=this;if(this.get_node($where).hasClass("closed")){return this.open_branch(this.get_node($where),true,function(){_this.moved.apply(_this,[what,where,how,is_new,is_copy,rb])})}if(this.get_node($where).find("> ul > li > a.loading").size()==1){setTimeout(function(){_this.moved.apply(_this,[what,where,how,is_new,is_copy])},200);return}}if(what.size()>1){var _this=this;var tmp=this.moved(what.eq(0),where,how,false,is_copy,rb);what.each(function(i){if(i==0)return;if(tmp){tmp=_this.moved(this,tmp.children("a:eq(0)"),"after",false,is_copy,rb)}});return what}if(is_copy){_what=what.clone();_what.each(function(i){this.id=this.id+"_copy";$(this).find("li").each(function(){this.id=this.id+"_copy"});$(this).removeClass("dragged").find("a.clicked").removeClass("clicked").end().find("li.dragged").removeClass("dragged")})}else _what=what;if(is_new){if(!this.callback("beforecreate",[this.get_node(what).get(0),this.get_node(where).get(0),how,this]))return false}else{if(!this.callback("beforemove",[this.get_node(what).get(0),this.get_node(where).get(0),how,this]))return false}if(!is_new){var tmp=what.parents(".tree:eq(0)");if(tmp.get(0)!=this.container.get(0)){tmp=tree_component.inst[tmp.attr("id")];if(tmp.settings.languages.length){var res=[];if(this.settings.languages.length==0)res.push("."+tmp.current_lang);else{for(var i in this.settings.languages){if(!this.settings.languages.hasOwnProperty(i))continue;for(var j in tmp.settings.languages){if(!tmp.settings.languages.hasOwnProperty(j))continue;if(this.settings.languages[i]==tmp.settings.languages[j])res.push("."+this.settings.languages[i])}}}if(res.length==0)return this.error("MOVE: NO COMMON LANGUAGES");_what.find("a").not(res.join(",")).remove()}_what.find("a.clicked").removeClass("clicked")}}what=_what;switch(how){case"before":$where.parents("ul:eq(0)").children("li.last").removeClass("last");$where.parent().before(what.removeClass("last"));$where.parents("ul:eq(0)").children("li:last").addClass("last");break;case"after":$where.parents("ul:eq(0)").children("li.last").removeClass("last");$where.parent().after(what.removeClass("last"));$where.parents("ul:eq(0)").children("li:last").addClass("last");break;case"inside":if($where.parent().children("ul:first").size()){if(this.settings.rules.createat=="top"){$where.parent().children("ul:first").prepend(what.removeClass("last")).children("li:last").addClass("last");var tmp_node=$where.parent().children("ul:first").children("li:first");if(tmp_node.size()){how="before";where=tmp_node}}else{var tmp_node=$where.parent().children("ul:first").children(".last");if(tmp_node.size()){how="after";where=tmp_node}$where.parent().children("ul:first").children(".last").removeClass("last").end().append(what.removeClass("last")).children("li:last").addClass("last")}}else{what.addClass("last");$where.parent().removeClass("leaf").append("
                          ");if(!$where.parent().hasClass("open"))$where.parent().addClass("closed");$where.parent().children("ul:first").prepend(what)}if($where.parent().hasClass("closed")){this.open_branch($where)}break;default:break}if($parent.find("li").size()==0){var $li=$parent.parent();$li.removeClass("open").removeClass("closed").addClass("leaf");if(!$li.is(".tree"))$li.children("ul").remove();$li.parents("ul:eq(0)").children("li.last").removeClass("last").end().children("li:last").addClass("last")}else{$parent.children("li.last").removeClass("last");$parent.children("li:last").addClass("last")}if(is_copy)this.callback("oncopy",[this.get_node(what).get(0),this.get_node(where).get(0),how,this,rb]);else if(is_new)this.callback("oncreate",[this.get_node(what).get(0),($where.is("ul")?-1:this.get_node(where).get(0)),how,this,rb]);else this.callback("onmove",[this.get_node(what).get(0),this.get_node(where).get(0),how,this,rb]);return what},error:function(code){this.callback("error",[code,this]);return false},lock:function(state){this.locked=state;if(this.locked)this.container.children("ul:eq(0)").addClass("locked");else this.container.children("ul:eq(0)").removeClass("locked")},cut:function(obj){if(this.locked)return this.error("LOCKED");obj=obj?this.get_node(obj):this.container.find("a.clicked").filter(":first-child").parent();if(!obj||!obj.size())return this.error("CUT: NO NODE SELECTED");tree_component.cut_copy.copy_nodes=false;tree_component.cut_copy.cut_nodes=obj},copy:function(obj){if(this.locked)return this.error("LOCKED");obj=obj?this.get_node(obj):this.container.find("a.clicked").filter(":first-child").parent();if(!obj||!obj.size())return this.error("COPY: NO NODE SELECTED");tree_component.cut_copy.copy_nodes=obj;tree_component.cut_copy.cut_nodes=false},paste:function(obj,position){if(this.locked)return this.error("LOCKED");var root=false;if(obj==-1){root=true;obj=this.container}else obj=obj?this.get_node(obj):this.selected;if(!root&&(!obj||!obj.size()))return this.error("PASTE: NO NODE SELECTED");if(!tree_component.cut_copy.copy_nodes&&!tree_component.cut_copy.cut_nodes)return this.error("PASTE: NOTHING TO DO");var _this=this;var pos=position;if(position=="before"){position=obj.parent().children().index(obj);obj=obj.parents("li:eq(0)")}else if(position=="after"){position=obj.parent().children().index(obj)+1;obj=obj.parents("li:eq(0)")}else if((typeof position).toLowerCase()=="undefined"||position=="inside"){position=(this.settings.rules.createat=="top")?0:obj.children("ul:eq(0)").children("li").size()}if(!root&&obj.size()==0){root=true;obj=this.container}if(tree_component.cut_copy.copy_nodes&&tree_component.cut_copy.copy_nodes.size()){var ok=true;if(!root&&!this.check_move(tree_component.cut_copy.copy_nodes,obj.children("a:eq(0)"),"inside"))return false;if(obj.children("ul").size()==0||(root==true&&obj.children("ul").children("li").size()==0)){if(!root)var a=this.moved(tree_component.cut_copy.copy_nodes,obj.children("a:eq(0)"),"inside",false,true);else var a=this.moved(tree_component.cut_copy.copy_nodes,this.container.children("ul:eq(0)"),"inside",false,true)}else if(pos=="before"&&obj.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").size())var a=this.moved(tree_component.cut_copy.copy_nodes,obj.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").children("a:eq(0)"),"before",false,true);else if(pos=="after"&&obj.children("ul:eq(0)").children("li:nth-child("+(position)+")").size())var a=this.moved(tree_component.cut_copy.copy_nodes,obj.children("ul:eq(0)").children("li:nth-child("+(position)+")").children("a:eq(0)"),"after",false,true);else if(obj.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").size())var a=this.moved(tree_component.cut_copy.copy_nodes,obj.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").children("a:eq(0)"),"before",false,true);else var a=this.moved(tree_component.cut_copy.copy_nodes,obj.children("ul:eq(0)").children("li:last").children("a:eq(0)"),"after",false,true);tree_component.cut_copy.copy_nodes=false}if(tree_component.cut_copy.cut_nodes&&tree_component.cut_copy.cut_nodes.size()){var ok=true;obj.parents().andSelf().each(function(){if(tree_component.cut_copy.cut_nodes.index(this)!=-1){ok=false;return false}});if(!ok)return this.error("Invalid paste");if(!root&&!this.check_move(tree_component.cut_copy.cut_nodes,obj.children("a:eq(0)"),"inside"))return false;if(obj.children("ul").size()==0||(root==true&&obj.children("ul").children("li").size()==0)){if(!root)var a=this.moved(tree_component.cut_copy.cut_nodes,obj.children("a:eq(0)"),"inside");else var a=this.moved(tree_component.cut_copy.cut_nodes,this.container.children("ul:eq(0)"),"inside")}else if(pos=="before"&&obj.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").size())var a=this.moved(tree_component.cut_copy.cut_nodes,obj.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").children("a:eq(0)"),"before");else if(pos=="after"&&obj.children("ul:eq(0)").children("li:nth-child("+(position)+")").size())var a=this.moved(tree_component.cut_copy.cut_nodes,obj.children("ul:eq(0)").children("li:nth-child("+(position)+")").children("a:eq(0)"),"after");else if(obj.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").size())var a=this.moved(tree_component.cut_copy.cut_nodes,obj.children("ul:eq(0)").children("li:nth-child("+(position+1)+")").children("a:eq(0)"),"before");else var a=this.moved(tree_component.cut_copy.cut_nodes,obj.children("ul:eq(0)").children("li:last").children("a:eq(0)"),"after");tree_component.cut_copy.cut_nodes=false}},search:function(str,func){var _this=this;if(!str||(this.srch&&str!=this.srch)){this.srch="";this.srch_opn=false;this.container.find("a.search").removeClass("search")}this.srch=str;if(!str)return;if(!func)func="contains";if(this.settings.data.async){if(!this.srch_opn){var dd=$.extend({"search":str},this.callback("beforedata",[false,this]));$.ajax({type:this.settings.data.opts.method,url:this.settings.data.opts.url,data:dd,dataType:"text",success:function(data){_this.srch_opn=$.unique(data.split(","));_this.search.apply(_this,[str,func])}})}else if(this.srch_opn.length){if(this.srch_opn&&this.srch_opn.length){var opn=false;for(var j=0;j0){opn=true;var tmp="#"+this.srch_opn[j];delete this.srch_opn[j];this.open_branch(tmp,true,function(){_this.search.apply(_this,[str,func])})}}if(!opn){this.srch_opn=[];_this.search.apply(_this,[str,func])}}}else{this.srch_opn=false;var selector="a";if(this.settings.languages.length)selector+="."+this.current_lang;this.callback("onsearch",[this.container.find(selector+":"+func+"('"+str+"')"),this])}}else{var selector="a";if(this.settings.languages.length)selector+="."+this.current_lang;var nn=this.container.find(selector+":"+func+"('"+str+"')");nn.parents("li.closed").each(function(){_this.open_branch(this,true)});this.callback("onsearch",[nn,this])}},add_sheet:tree_component.add_sheet,destroy:function(){this.callback("ondestroy",[this]);this.container.unbind(".jstree");$("#"+this.container.attr("id")).die("click.jstree").die("dblclick.jstree").die("mouseover.jstree").die("mouseout.jstree").die("mousedown.jstree");this.container.removeClass("tree ui-widget ui-widget-content tree-default tree-"+this.settings.ui.theme_name).children("ul").removeClass("no_dots ltr locked").find("li").removeClass("leaf").removeClass("open").removeClass("closed").removeClass("last").children("a").removeClass("clicked hover search");if(this.cntr==tree_component.focused){for(var i in tree_component.inst){if(i!=this.cntr&&i!=this.container.attr("id")){tree_component.inst[i].focus();break}}}tree_component.inst[this.cntr]=false;tree_component.inst[this.container.attr("id")]=false;delete tree_component.inst[this.cntr];delete tree_component.inst[this.container.attr("id")];tree_component.cntr--}}};tree_component.cntr=0;tree_component.inst={};tree_component.themes=[];tree_component.drag_drop={isdown:false,drag_node:false,drag_help:false,dragged:false,init_x:false,init_y:false,moving:false,origin_tree:false,marker:false,move_type:false,ref_node:false,appended:false,foreign:false,droppable:[],open_time:false,scroll_time:false};tree_component.mouseup=function(event){var tmp=tree_component.drag_drop;if(tmp.open_time)clearTimeout(tmp.open_time);if(tmp.scroll_time)clearTimeout(tmp.scroll_time);if(tmp.moving&&$.tree.drag_end!==false)$.tree.drag_end.call(null,event,tmp);if(tmp.foreign===false&&tmp.drag_node&&tmp.drag_node.size()){tmp.drag_help.remove();if(tmp.move_type){var tree1=tree_component.inst[tmp.ref_node.parents(".tree:eq(0)").attr("id")];if(tree1)tree1.moved(tmp.dragged,tmp.ref_node,tmp.move_type,false,(tmp.origin_tree.settings.rules.drag_copy=="on"||(tmp.origin_tree.settings.rules.drag_copy=="ctrl"&&event.ctrlKey)))}tmp.move_type=false;tmp.ref_node=false}if(tmp.foreign!==false){if(tmp.drag_help)tmp.drag_help.remove();if(tmp.move_type){var tree1=tree_component.inst[tmp.ref_node.parents(".tree:eq(0)").attr("id")];if(tree1)tree1.callback("ondrop",[tmp.f_data,tree1.get_node(tmp.ref_node).get(0),tmp.move_type,tree1])}tmp.foreign=false;tmp.move_type=false;tmp.ref_node=false}if(tree_component.drag_drop.marker)tree_component.drag_drop.marker.hide();if(tmp.dragged&&tmp.dragged.size())tmp.dragged.removeClass("dragged");tmp.dragged=false;tmp.drag_help=false;tmp.drag_node=false;tmp.f_type=false;tmp.f_data=false;tmp.init_x=false;tmp.init_y=false;tmp.moving=false;tmp.appended=false;tmp.origin_tree=false;if(tmp.isdown){tmp.isdown=false;event.preventDefault();event.stopPropagation();return false}};tree_component.mousemove=function(event){var tmp=tree_component.drag_drop;var is_start=false;if(tmp.isdown){if(!tmp.moving&&Math.abs(tmp.init_x-event.pageX)<5&&Math.abs(tmp.init_y-event.pageY)<5){event.preventDefault();event.stopPropagation();return false}else{if(!tmp.moving){tree_component.drag_drop.moving=true;is_start=true}}if(tmp.open_time)clearTimeout(tmp.open_time);if(tmp.drag_help!==false){if(!tmp.appended){if(tmp.foreign!==false)tmp.origin_tree=$.tree.focused();$("body").append(tmp.drag_help);tmp.w=tmp.drag_help.width();tmp.appended=true}tmp.drag_help.css({"left":(event.pageX+5),"top":(event.pageY+15)})}if(is_start&&$.tree.drag_start!==false)$.tree.drag_start.call(null,event,tmp);if($.tree.drag!==false)$.tree.drag.call(null,event,tmp);if(event.target.tagName=="DIV"&&event.target.id=="jstree-marker")return false;var et=$(event.target);if(et.is("ins"))et=et.parent();var cnt=et.is(".tree")?et:et.parents(".tree:eq(0)");if(cnt.size()==0||!tree_component.inst[cnt.attr("id")]){if(tmp.scroll_time)clearTimeout(tmp.scroll_time);if(tmp.drag_help!==false)tmp.drag_help.find("li:eq(0) ins").addClass("forbidden");tmp.move_type=false;tmp.ref_node=false;tree_component.drag_drop.marker.hide();return false}var tree2=tree_component.inst[cnt.attr("id")];tree2.off_height();if(tmp.scroll_time)clearTimeout(tmp.scroll_time);tmp.scroll_time=setTimeout(function(){tree2.scroll_check(event.pageX,event.pageY)},50);var mov=false;var st=cnt.scrollTop();if(event.target.tagName=="A"||event.target.tagName=="INS"){if(et.is("#jstree-dragged"))return false;if(tree2.get_node(event.target).hasClass("closed")){tmp.open_time=setTimeout(function(){tree2.open_branch(et)},500)}var et_off=et.offset();var goTo={x:(et_off.left-1),y:(event.pageY-et_off.top)};var arr=[];if(goTo.ytree2.li_height*2/3-1)arr=["after","inside","before"];else{if(goTo.ycss_rules.length+5)return false;if(css_rules[j].selectorText&&css_rules[j].selectorText.toLowerCase()==rule_name){if(delete_flag==true){if(tree_component.css.removeRule)document.styleSheets[i].removeRule(j);if(tree_component.css.deleteRule)document.styleSheets[i].deleteRule(j);return true}else return css_rules[j]}}while(css_rules[++j]);return false};tree_component.add_css=function(rule_name){if(tree_component.get_css(rule_name))return false;(tree_component.css.insertRule)?tree_component.css.insertRule(rule_name+' { }',0):tree_component.css.addRule(rule_name,null,0);return tree_component.get_css(rule_name)};tree_component.remove_css=function(rule_name){return tree_component.get_css(rule_name,true)};tree_component.add_sheet=function(opts){if(opts.str){var tmp=document.createElement("style");tmp.type="text/css";if(tmp.styleSheet)tmp.styleSheet.cssText=opts.str;else tmp.appendChild(document.createTextNode(opts.str));document.getElementsByTagName("head")[0].appendChild(tmp);return tmp.sheet}if(opts.url){if(document.createStyleSheet){try{document.createStyleSheet(opts.url)}catch(e){}}else{var newSS=document.createElement('link');newSS.rel='stylesheet';newSS.type='text/css';newSS.media="all";newSS.href=opts.url;document.getElementsByTagName("head")[0].appendChild(newSS);return newSS.styleSheet}}};$(function(){var u=navigator.userAgent.toLowerCase();var v=(u.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,'0'])[1];var css='/* TREE LAYOUT */ .tree ul { margin:0 0 0 5px; padding:0 0 0 0; list-style-type:none; } .tree li { display:block; min-height:18px; line-height:18px; padding:0 0 0 15px; margin:0 0 0 0; /* Background fix */ clear:both; } .tree li ul { display:none; } .tree li a, .tree li span { display:inline-block;line-height:16px;height:16px;color:black;white-space:nowrap;text-decoration:none;padding:1px 4px 1px 4px;margin:0; } .tree li a:focus { outline: none; } .tree li a input, .tree li span input { margin:0;padding:0 0;display:inline-block;height:12px !important;border:1px solid white;background:white;font-size:10px;font-family:Verdana; } .tree li a input:not([class="xxx"]), .tree li span input:not([class="xxx"]) { padding:1px 0; } /* FOR DOTS */ .tree .ltr li.last { float:left; } .tree > ul li.last { overflow:visible; } /* OPEN OR CLOSE */ .tree li.open ul { display:block; } .tree li.closed ul { display:none !important; } /* FOR DRAGGING */ #jstree-dragged { position:absolute; top:-10px; left:-10px; margin:0; padding:0; } #jstree-dragged ul ul ul { display:none; } #jstree-marker { padding:0; margin:0; line-height:5px; font-size:1px; overflow:hidden; height:5px; position:absolute; left:-45px; top:-30px; z-index:1000; background-color:transparent; background-repeat:no-repeat; display:none; } #jstree-marker.marker { width:45px; background-position:-32px top; } #jstree-marker.marker_plus { width:5px; background-position:right top; } /* BACKGROUND DOTS */ .tree li li { overflow:hidden; } .tree > .ltr > li { display:table; } /* ICONS */ .tree ul ins { display:inline-block; text-decoration:none; width:16px; height:16px; } .tree .ltr ins { margin:0 4px 0 0px; } ';if(/msie/.test(u)&&!/opera/.test(u)){if(parseInt(v)==6)css+='.tree li { height:18px; zoom:1; } .tree li li { overflow:visible; } .tree .ltr li.last { margin-top: expression( (this.previousSibling && /open/.test(this.previousSibling.className) ) ? "-2px" : "0"); } .marker { width:45px; background-position:-32px top; } .marker_plus { width:5px; background-position:right top; }';if(parseInt(v)==7)css+='.tree li li { overflow:visible; } .tree .ltr li.last { margin-top: expression( (this.previousSibling && /open/.test(this.previousSibling.className) ) ? "-2px" : "0"); }'}if(/opera/.test(u))css+='.tree > ul > li.last:after { content:"."; display: block; height:1px; clear:both; visibility:hidden; }';if(/mozilla/.test(u)&&!/(compatible|webkit)/.test(u)&&v.indexOf("1.8")==0)css+='.tree .ltr li a { display:inline; float:left; } .tree li ul { clear:both; }';tree_component.css=tree_component.add_sheet({str:css})})})(jQuery);(function($){$.extend($.tree.datastores,{"html":function(){return{get:function(obj,tree,opts){return obj&&$(obj).size()?$('
                          ').append(tree.get_node(obj).clone()).html():tree.container.children("ul:eq(0)").html()},parse:function(data,tree,opts,callback){if(callback)callback.call(null,data);return data},load:function(data,tree,opts,callback){if(opts.url){$.ajax({'type':opts.method,'url':opts.url,'data':data,'dataType':"html",'success':function(d,textStatus){callback.call(null,d)},'error':function(xhttp,textStatus,errorThrown){callback.call(null,false);tree.error(errorThrown+" "+textStatus)}})}else{callback.call(null,opts.static||tree.container.children("ul:eq(0)").html())}}}},"json":function(){return{get:function(obj,tree,opts){var _this=this;if(!obj||$(obj).size()==0)obj=tree.container.children("ul").children("li");else obj=$(obj);if(!opts)opts={};if(!opts.outer_attrib)opts.outer_attrib=["id","rel","class"];if(!opts.inner_attrib)opts.inner_attrib=[];if(obj.size()>1){var arr=[];obj.each(function(){arr.push(_this.get(this,tree,opts))});return arr}if(obj.size()==0)return[];var json={attributes:{},data:{}};if(obj.hasClass("open"))json.data.state="open";if(obj.hasClass("closed"))json.data.state="closed";for(var i in opts.outer_attrib){if(!opts.outer_attrib.hasOwnProperty(i))continue;var val=(opts.outer_attrib[i]=="class")?obj.attr(opts.outer_attrib[i]).replace(/(^| )last( |$)/ig," ").replace(/(^| )(leaf|closed|open)( |$)/ig," "):obj.attr(opts.outer_attrib[i]);if(typeof val!="undefined"&&val.toString().replace(" ","").length>0)json.attributes[opts.outer_attrib[i]]=val;delete val}if(tree.settings.languages.length){for(var i in tree.settings.languages){if(!tree.settings.languages.hasOwnProperty(i))continue;var a=obj.children("a."+tree.settings.languages[i]);if(opts.force||opts.inner_attrib.length||a.children("ins").get(0).style.backgroundImage.toString().length||a.children("ins").get(0).className.length){json.data[tree.settings.languages[i]]={};json.data[tree.settings.languages[i]].title=tree.get_text(obj,tree.settings.languages[i]);if(a.children("ins").get(0).style.className.length){json.data[tree.settings.languages[i]].icon=a.children("ins").get(0).style.className}if(a.children("ins").get(0).style.backgroundImage.length){json.data[tree.settings.languages[i]].icon=a.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","")}if(opts.inner_attrib.length){json.data[tree.settings.languages[i]].attributes={};for(var j in opts.inner_attrib){if(!opts.inner_attrib.hasOwnProperty(j))continue;var val=a.attr(opts.inner_attrib[j]);if(typeof val!="undefined"&&val.toString().replace(" ","").length>0)json.data[tree.settings.languages[i]].attributes[opts.inner_attrib[j]]=val;delete val}}}else{json.data[tree.settings.languages[i]]=tree.get_text(obj,tree.settings.languages[i])}}}else{var a=obj.children("a");json.data.title=tree.get_text(obj);if(a.children("ins").size()&&a.children("ins").get(0).className.length){json.data.icon=a.children("ins").get(0).className}if(a.children("ins").size()&&a.children("ins").get(0).style.backgroundImage.length){json.data.icon=a.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","")}if(opts.inner_attrib.length){json.data.attributes={};for(var j in opts.inner_attrib){if(!opts.inner_attrib.hasOwnProperty(j))continue;var val=a.attr(opts.inner_attrib[j]);if(typeof val!="undefined"&&val.toString().replace(" ","").length>0)json.data.attributes[opts.inner_attrib[j]]=val;delete val}}}if(obj.children("ul").size()>0){json.children=[];obj.children("ul").children("li").each(function(){json.children.push(_this.get(this,tree,opts))})}return json},parse:function(data,tree,opts,callback){if(Object.prototype.toString.apply(data)==="[object Array]"){var str='';for(var i=0;i "}else str+=" ";str+=((typeof data.data[tree.settings.languages[i]].title).toLowerCase()!="undefined"?data.data[tree.settings.languages[i]].title:data.data[tree.settings.languages[i]])+""}}else{var attr={};attr["href"]="";attr["style"]="";attr["class"]="";if((typeof data.data.attributes).toLowerCase()!="undefined"){for(var i in data.data.attributes){if(!data.data.attributes.hasOwnProperty(i))continue;if(i=="style"||i=="class")attr[i]+=" "+data.data.attributes[i];else attr[i]=data.data.attributes[i]}}str+=" "}else str+=" ";str+=((typeof data.data.title).toLowerCase()!="undefined"?data.data.title:data.data)+""}if(data.children&&data.children.length){str+='
                            ';for(var i=0;i'}str+="";if(callback)callback.call(null,str);return str},load:function(data,tree,opts,callback){if(opts.static){callback.call(null,opts.static)}else{$.ajax({'type':opts.method,'url':opts.url,'data':data,'dataType':"json",'success':function(d,textStatus){callback.call(null,d)},'error':function(xhttp,textStatus,errorThrown){callback.call(null,false);tree.error(errorThrown+" "+textStatus)}})}}}}})})(jQuery); \ No newline at end of file