From 63eac434d82c8a18c3c2b437049f8c2401b0349f Mon Sep 17 00:00:00 2001 From: Leif Johansson Date: Mon, 13 Jun 2011 17:42:59 +0200 Subject: style polish, new jstree (still not working with jquery 1.5) and fresh jquery --- site-media/js/jquery.jstree.js | 1862 +++++++++++++++++++++++++++++++--------- 1 file changed, 1448 insertions(+), 414 deletions(-) (limited to 'site-media/js/jquery.jstree.js') diff --git a/site-media/js/jquery.jstree.js b/site-media/js/jquery.jstree.js index 5037698..965a612 100644 --- a/site-media/js/jquery.jstree.js +++ b/site-media/js/jquery.jstree.js @@ -1,24 +1,32 @@ /* - * jsTree 1.0-rc1 + * jsTree 1.0-rc3 * http://jstree.com/ * * Copyright (c) 2010 Ivan Bozhanov (vakata.com) * - * Dual licensed under the MIT and GPL licenses (same as jQuery): + * Licensed same as jquery - under the terms of either the MIT License or the GPL Version 2 License * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * - * $Date: 2010-07-01 10:51:11 +0300 (четв, 01 юли 2010) $ - * $Revision: 191 $ + * $Date: 2011-02-09 01:17:14 +0200 (ср, 09 февр 2011) $ + * $Revision: 236 $ */ /*jslint browser: true, onevar: true, undef: true, bitwise: true, strict: true */ /*global window : false, clearInterval: false, clearTimeout: false, document: false, setInterval: false, setTimeout: false, jQuery: false, navigator: false, XSLTProcessor: false, DOMParser: false, XMLSerializer: false*/ "use strict"; -// Common functions not related to jsTree -// decided to move them to a `vakata` "namespace" + +// top wrapper to prevent multiple inclusion (is this OK?) +(function () { if(jQuery && jQuery.jstree) { return; } + var is_ie6 = false, is_ie7 = false, is_ff2 = false; + +/* + * jsTree core + */ (function ($) { + // Common functions not related to jsTree + // decided to move them to a `vakata` "namespace" $.vakata = {}; // CSS related functions $.vakata.css = { @@ -49,13 +57,23 @@ return $.vakata.css.get_css(rule_name, true, sheet); }, add_sheet : function(opts) { - var tmp; + var tmp = false, is_new = true; if(opts.str) { - tmp = document.createElement("style"); - tmp.setAttribute('type',"text/css"); + if(opts.title) { tmp = $("style[id='" + opts.title + "-stylesheet']")[0]; } + if(tmp) { is_new = false; } + else { + tmp = document.createElement("style"); + tmp.setAttribute('type',"text/css"); + if(opts.title) { tmp.setAttribute("id", opts.title + "-stylesheet"); } + } if(tmp.styleSheet) { - document.getElementsByTagName("head")[0].appendChild(tmp); - tmp.styleSheet.cssText = opts.str; + if(is_new) { + document.getElementsByTagName("head")[0].appendChild(tmp); + tmp.styleSheet.cssText = opts.str; + } + else { + tmp.styleSheet.cssText = tmp.styleSheet.cssText + " " + opts.str; + } } else { tmp.appendChild(document.createTextNode(opts.str)); @@ -79,18 +97,12 @@ } } }; -})(jQuery); -/* - * jsTree core 1.0 - */ -(function ($) { // private variables var instances = [], // instance array (used by $.jstree.reference/create/focused) focused_instance = -1, // the index in the instance array of the currently focused instance plugins = {}, // list of included plugins - prepared_move = {}, // for the move plugin - is_ie6 = false; + prepared_move = {}; // for the move_node function // jQuery plugin wrapper (thanks to jquery UI widget function) $.fn.jstree = function (settings) { @@ -98,24 +110,28 @@ args = Array.prototype.slice.call(arguments, 1), returnValue = this; - // extend settings and allow for multiple hashes and metadata - if(!isMethodCall && $.meta) { args.push($.metadata.get(this).jstree); } - settings = !isMethodCall && args.length ? $.extend.apply(null, [true, settings].concat(args)) : settings; - // block calls to "private" methods - if(isMethodCall && settings.substring(0, 1) == '_') { return returnValue; } - // if a method call execute the method on all selected instances if(isMethodCall) { + if(settings.substring(0, 1) == '_') { return returnValue; } this.each(function() { var instance = instances[$.data(this, "jstree-instance-id")], methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance; - if(typeof methodValue !== "undefined" && (settings.indexOf("is_" === 0) || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; } + if(typeof methodValue !== "undefined" && (settings.indexOf("is_") === 0 || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; } }); } else { this.each(function() { + // extend settings and allow for multiple hashes and $.data var instance_id = $.data(this, "jstree-instance-id"), - s = false; + a = [], + b = settings ? $.extend({}, true, settings) : {}, + c = $(this), + s = false, + t = []; + a = a.concat(args); + if(c.data("jstree")) { a.push(c.data("jstree")); } + b = a.length ? $.extend.apply(null, [true, b].concat(a)) : b; + // if an instance already exists, destroy it first if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); } // push a new empty object to the instances array @@ -123,24 +139,27 @@ // store the jstree instance id to the container element $.data(this, "jstree-instance-id", instance_id); // clean up all plugins - if(!settings) { settings = {}; } - settings.plugins = $.isArray(settings.plugins) ? settings.plugins : $.jstree.defaults.plugins; - if($.inArray("core", settings.plugins) === -1) { settings.plugins.unshift("core"); } - - // only unique plugins (NOT WORKING) - // settings.plugins = settings.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(","); + b.plugins = $.isArray(b.plugins) ? b.plugins : $.jstree.defaults.plugins.slice(); + b.plugins.unshift("core"); + // only unique plugins + b.plugins = b.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(","); // extend defaults with passed data - s = $.extend(true, {}, $.jstree.defaults, settings); - s.plugins = settings.plugins; - $.each(plugins, function (i, val) { if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; } }); + s = $.extend(true, {}, $.jstree.defaults, b); + s.plugins = b.plugins; + $.each(plugins, function (i, val) { + if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; } + else { t.push(i); } + }); + s.plugins = t; + // push the new object to the instances array (at the same time set the default classes to the container) and init instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s); // init all activated plugins for this instance $.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; }); $.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } }); // initialize the instance - instances[instance_id].init(); + setTimeout(function() { instances[instance_id].init(); }, 0); }); } // return the jquery selection (or if it was a method call that returned a value - the returned value) @@ -168,6 +187,7 @@ this._get_settings = function () { return settings; }; this.get_index = function () { return index; }; this.get_container = function () { return container; }; + this.get_container_ul = function () { return container.children("ul:eq(0)"); }; this._set_settings = function (s) { settings = $.extend(true, {}, settings, s); }; @@ -193,6 +213,8 @@ evnt = new $.Event("before.jstree"), rlbk = false; + if(this.data.core.locked === true && i !== "unlock" && i !== "is_locked") { return; } + // Check if function belongs to the included plugins of this instance do { if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; } @@ -200,20 +222,15 @@ } while(func); if(!func) { return; } - // a chance to stop execution (or change arguments): - // * just bind to jstree.before - // * check the additional data object (func property) - // * call event.stopImmediatePropagation() - // * return false (or an array of arguments) - rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args }); - if(rslt === false) { return; } - if(typeof rslt !== "undefined") { args = rslt; } - // context and function to trigger events, then finally call the function if(i.indexOf("_") === 0) { rslt = func.apply(this, args); } else { + rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args, "plugin" : func.plugin }); + if(rslt === false) { return; } + if(typeof rslt !== "undefined") { args = rslt; } + rslt = func.apply( $.extend({}, this, { __callback : function (data) { @@ -248,16 +265,14 @@ // set the prototype for all instances $.jstree._fn = $.jstree._instance.prototype = {}; - // css functions - used internally - // load the css when DOM is ready $(function() { - // code is copied form jQuery ($.browser is deprecated + there is a bug in IE) + // code is copied from jQuery ($.browser is deprecated + there is a bug in IE) var u = navigator.userAgent.toLowerCase(), v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1], css_string = '' + '.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' + - '.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; } ' + + '.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; min-width:18px; } ' + '.jstree-rtl li { margin-left:0; margin-right:18px; } ' + '.jstree > ul > li { margin-left:0px; } ' + '.jstree-rtl > ul > li { margin-right:0px; } ' + @@ -272,6 +287,12 @@ // Correct IE 6 (does not support the > CSS selector) if(/msie/.test(u) && parseInt(v, 10) == 6) { is_ie6 = true; + + // fix image flicker and lack of caching + try { + document.execCommand("BackgroundImageCache", false, true); + } catch (err) { } + css_string += '' + '.jstree li { height:18px; margin-left:0; margin-right:0; } ' + '.jstree li li { margin-left:18px; } ' + @@ -284,24 +305,43 @@ } // Correct IE 7 (shifts anchor nodes onhover) if(/msie/.test(u) && parseInt(v, 10) == 7) { + is_ie7 = true; css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } '; } - $.vakata.css.add_sheet({ str : css_string }); + // correct ff2 lack of display:inline-block + if(!/compatible/.test(u) && /mozilla/.test(u) && parseFloat(v, 10) < 1.9) { + is_ff2 = true; + css_string += '' + + '.jstree ins { display:-moz-inline-box; } ' + + '.jstree li { line-height:12px; } ' + // WHY?? + '.jstree a { display:-moz-inline-box; } ' + + '.jstree .jstree-no-icons .jstree-checkbox { display:-moz-inline-stack !important; } '; + /* this shouldn't be here as it is theme specific */ + } + // the default stylesheet + $.vakata.css.add_sheet({ str : css_string, title : "jstree" }); }); // core functions (open, close, create, update, delete) $.jstree.plugin("core", { __init : function () { - this.data.core.to_open = $.map($.makeArray(this.get_settings().core.initially_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/'); }); + this.data.core.locked = false; + this.data.core.to_open = this.get_settings().core.initially_open; + this.data.core.to_load = this.get_settings().core.initially_load; }, defaults : { html_titles : false, animation : 500, initially_open : [], + initially_load : [], + open_parents : true, + notify_plugins : true, rtl : false, + load_open : false, strings : { loading : "Loading ...", - new_node : "New node" + new_node : "New node", + multiple_selection : "Multiple selection" } }, _fn : { @@ -310,8 +350,8 @@ if(this._get_settings().core.rtl) { this.get_container().addClass("jstree-rtl").css("direction", "rtl"); } - this.get_container().html(""); - this.data.core.li_height = this.get_container().find("ul li.jstree-closed, ul li.jstree-leaf").eq(0).height() || 18; + this.get_container().html(""); + this.data.core.li_height = this.get_container_ul().find("li.jstree-closed, li.jstree-leaf").eq(0).height() || 18; this.get_container() .delegate("li > ins", "click.jstree", $.proxy(function (event) { @@ -334,8 +374,39 @@ } } }); + if(this._get_settings().core.notify_plugins) { + this.get_container() + .bind("load_node.jstree", $.proxy(function (e, data) { + var o = this._get_node(data.rslt.obj), + t = this; + if(o === -1) { o = this.get_container_ul(); } + if(!o.length) { return; } + o.find("li").each(function () { + var th = $(this); + if(th.data("jstree")) { + $.each(th.data("jstree"), function (plugin, values) { + if(t.data[plugin] && $.isFunction(t["_" + plugin + "_notify"])) { + t["_" + plugin + "_notify"].call(t, th, values); + } + }); + } + }); + }, this)); + } + if(this._get_settings().core.load_open) { + this.get_container() + .bind("load_node.jstree", $.proxy(function (e, data) { + var o = this._get_node(data.rslt.obj), + t = this; + if(o === -1) { o = this.get_container_ul(); } + if(!o.length) { return; } + o.find("li.jstree-open:not(:has(ul))").each(function () { + t.load_node(this, $.noop, $.noop); + }); + }, this)); + } this.__callback(); - this.load_node(-1, function () { this.loaded(); this.reopen(); }); + this.load_node(-1, function () { this.loaded(); this.reload_nodes(); }); }, destroy : function () { var i, @@ -366,45 +437,92 @@ .find("[class^='jstree']") .andSelf() .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); }); + $(document) + .unbind(".jstree-" + n) + .undelegate(".jstree-" + n); // remove the actual data instances[n] = null; delete instances[n]; }, + + _core_notify : function (n, data) { + if(data.opened) { + this.open_node(n, false, true); + } + }, + + lock : function () { + this.data.core.locked = true; + this.get_container().children("ul").addClass("jstree-locked").css("opacity","0.7"); + this.__callback({}); + }, + unlock : function () { + this.data.core.locked = false; + this.get_container().children("ul").removeClass("jstree-locked").css("opacity","1"); + this.__callback({}); + }, + is_locked : function () { return this.data.core.locked; }, save_opened : function () { var _this = this; this.data.core.to_open = []; - this.get_container().find(".jstree-open").each(function () { - _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/')); + this.get_container_ul().find("li.jstree-open").each(function () { + if(this.id) { _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); } }); this.__callback(_this.data.core.to_open); }, - reopen : function (is_callback) { + save_loaded : function () { }, + reload_nodes : function (is_callback) { var _this = this, done = true, current = [], remaining = []; - if(!is_callback) { this.data.core.reopen = false; this.data.core.refreshing = true; } - if(this.data.core.to_open.length) { - $.each(this.data.core.to_open, function (i, val) { + if(!is_callback) { + this.data.core.reopen = false; + this.data.core.refreshing = true; + this.data.core.to_open = $.map($.makeArray(this.data.core.to_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); }); + this.data.core.to_load = $.map($.makeArray(this.data.core.to_load), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); }); + if(this.data.core.to_open.length) { + this.data.core.to_load = this.data.core.to_load.concat(this.data.core.to_open); + } + } + if(this.data.core.to_load.length) { + $.each(this.data.core.to_load, function (i, val) { if(val == "#") { return true; } - if($(val).length && $(val).is(".jstree-closed")) { current.push(val); } + if($(val).length) { current.push(val); } else { remaining.push(val); } }); if(current.length) { - this.data.core.to_open = remaining; + this.data.core.to_load = remaining; $.each(current, function (i, val) { - _this.open_node(val, function () { _this.reopen(true); }, true); + if(!_this._is_loaded(val)) { + _this.load_node(val, function () { _this.reload_nodes(true); }, function () { _this.reload_nodes(true); }); + done = false; + } }); - done = false; } } + if(this.data.core.to_open.length) { + $.each(this.data.core.to_open, function (i, val) { + _this.open_node(val, false, true); + }); + } if(done) { // TODO: find a more elegant approach to syncronizing returning requests if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); } this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50); this.data.core.refreshing = false; + this.reopen(); } }, + reopen : function () { + var _this = this; + if(this.data.core.to_open.length) { + $.each(this.data.core.to_open, function (i, val) { + _this.open_node(val, false, true); + }); + } + this.__callback({}); + }, refresh : function (obj) { var _this = this; this.save_opened(); @@ -412,7 +530,8 @@ obj = this._get_node(obj); if(!obj) { obj = -1; } if(obj !== -1) { obj.children("UL").remove(); } - this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reopen(); }); + else { this.get_container_ul().empty(); } + this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes(); }); }, // Dummy function to fire after the first load (so that there is a jstree.loaded event) loaded : function () { @@ -420,19 +539,24 @@ }, // deal with focus set_focus : function () { + if(this.is_focused()) { return; } var f = $.jstree._focused(); - if(f && f !== this) { - f.get_container().removeClass("jstree-focused"); - } - if(f !== this) { - this.get_container().addClass("jstree-focused"); - focused_instance = this.get_index(); - } + if(f) { f.unset_focus(); } + + this.get_container().addClass("jstree-focused"); + focused_instance = this.get_index(); this.__callback(); }, is_focused : function () { return focused_instance == this.get_index(); }, + unset_focus : function () { + if(this.is_focused()) { + this.get_container().removeClass("jstree-focused"); + focused_instance = -1; + } + this.__callback(); + }, // traverse _get_node : function (obj) { @@ -489,9 +613,20 @@ return p; }, + // string functions + _get_string : function (key) { + return this._get_settings().core.strings[key] || key; + }, + is_open : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); }, is_closed : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); }, is_leaf : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); }, + correct_state : function (obj) { + obj = this._get_node(obj); + if(!obj || obj === -1) { return false; } + obj.removeClass("jstree-closed jstree-open").addClass("jstree-leaf").children("ul").remove(); + this.__callback({ "obj" : obj }); + }, // open/close open_node : function (obj, callback, skip_animation) { obj = this._get_node(obj); @@ -504,30 +639,40 @@ this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback); } else { + if(this._get_settings().core.open_parents) { + obj.parentsUntil(".jstree",".jstree-closed").each(function () { + t.open_node(this, false, true); + }); + } if(s) { obj.children("ul").css("display","none"); } obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading"); - if(s) { obj.children("ul").stop(true).slideDown(s, function () { this.style.display = ""; }); } + if(s) { obj.children("ul").stop(true, true).slideDown(s, function () { this.style.display = ""; t.after_open(obj); }); } + else { t.after_open(obj); } this.__callback({ "obj" : obj }); if(callback) { callback.call(); } } }, + after_open : function (obj) { this.__callback({ "obj" : obj }); }, close_node : function (obj, skip_animation) { obj = this._get_node(obj); - var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation; + var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation, + t = this; if(!obj.length || !obj.hasClass("jstree-open")) { return false; } if(s) { obj.children("ul").attr("style","display:block !important"); } obj.removeClass("jstree-open").addClass("jstree-closed"); - if(s) { obj.children("ul").stop(true).slideUp(s, function () { this.style.display = ""; }); } + if(s) { obj.children("ul").stop(true, true).slideUp(s, function () { this.style.display = ""; t.after_close(obj); }); } + else { t.after_close(obj); } this.__callback({ "obj" : obj }); }, + after_close : function (obj) { this.__callback({ "obj" : obj }); }, toggle_node : function (obj) { obj = this._get_node(obj); if(obj.hasClass("jstree-closed")) { return this.open_node(obj); } if(obj.hasClass("jstree-open")) { return this.close_node(obj); } }, - open_all : function (obj, original_obj) { - obj = obj ? this._get_node(obj) : this.get_container(); - if(!obj || obj === -1) { obj = this.get_container(); } + open_all : function (obj, do_animation, original_obj) { + obj = obj ? this._get_node(obj) : -1; + if(!obj || obj === -1) { obj = this.get_container_ul(); } if(original_obj) { obj = obj.find("li.jstree-closed"); } @@ -539,21 +684,21 @@ var _this = this; obj.each(function () { var __this = this; - if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, original_obj); }, true); } - else { _this.open_node(this, false, true); } + if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, do_animation, original_obj); }, !do_animation); } + else { _this.open_node(this, false, !do_animation); } }); // so that callback is fired AFTER all nodes are open if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); } }, - close_all : function (obj) { + close_all : function (obj, do_animation) { var _this = this; obj = obj ? this._get_node(obj) : this.get_container(); - if(!obj || obj === -1) { obj = this.get_container(); } - obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this); }); + if(!obj || obj === -1) { obj = this.get_container_ul(); } + obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this, !do_animation); }); this.__callback({ "obj" : obj }); }, clean_node : function (obj) { - obj = obj && obj != -1 ? $(obj) : this.get_container(); + obj = obj && obj != -1 ? $(obj) : this.get_container_ul(); obj = obj.is("li") ? obj.find("li").andSelf() : obj.find("li"); obj.removeClass("jstree-last") .filter("li:last-child").addClass("jstree-last").end() @@ -580,7 +725,7 @@ create_node : function (obj, position, js, callback, is_loaded) { obj = this._get_node(obj); position = typeof position === "undefined" ? "last" : position; - var d = $("
  • "), + var d = $("
  • "), s = this._get_settings().core, tmp; @@ -592,11 +737,12 @@ if(typeof js === "string") { js = { "data" : js }; } if(!js) { js = {}; } if(js.attr) { d.attr(js.attr); } + if(js.metadata) { d.data(js.metadata); } if(js.state) { d.addClass("jstree-" + js.state); } - if(!js.data) { js.data = s.strings.new_node; } + if(!js.data) { js.data = this._get_string("new_node"); } if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); } $.each(js.data, function (i, m) { - tmp = $(""); + tmp = $(""); if($.isFunction(m)) { m = m.call(this, js); } if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); } else { @@ -623,17 +769,17 @@ case "after" : obj.after(d); tmp = this._get_parent(obj); break; case "inside": case "first" : - if(!obj.children("ul").length) { obj.append("