/* * jsTree 0.9.5 * * Copyright (c) 2008 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-01-03 * */ // browser fix jQuery.browser = {}; jQuery.browser.mozilla = /mozilla/.test(navigator.userAgent.toLowerCase()) && !/webkit/.test(navigator.userAgent.toLowerCase()); jQuery.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase()); jQuery.browser.opera = /opera/.test(navigator.userAgent.toLowerCase()); jQuery.browser.msie = /msie/.test(navigator.userAgent.toLowerCase()); // jQuery plugin jQuery.fn.tree = function (opts) { return this.each(function() { if(tree_component.inst && tree_component.inst[jQuery(this).attr('id')]) tree_component.inst[jQuery(this).attr('id')].destroy(); if(opts !== false) { var tmp = new tree_component(); tmp.init(this, opts); } }); }; // core function tree_component () { // instance manager if(typeof tree_component.inst == "undefined") { tree_component.cntr = 0; tree_component.inst = new Array(); tree_component.drop = new Array(); tree_component.focusInst = function () { return tree_component.inst[tree_component.focused]; } tree_component.mousedown = function(event) { var _this = tree_component.focusInst(); if(!_this) return; var tmp = jQuery(event.target); if(tree_component.drop.length && tmp.is("." + tree_component.drop.join(", .")) ) { _this.drag = jQuery("
");
}
_this.moveType = false;
_this.moveRef = false;
jQuery("#marker").hide();
return false;
}
tree_component.inst[cnt.attr("id")].off_height();
// if moving over another tree and multitree is false
if( _this.foreign === false && cnt.get(0) != _this.container.get(0) && (!_this.settings.rules.multitree || !tree_component.inst[cnt.attr("id")].settings.rules.multitree) ) {
if(jQuery(_this.drag).children("IMG").size() == 0) {
jQuery(_this.drag).append("
");
}
_this.moveType = false;
_this.moveRef = false;
jQuery("#marker").hide();
return false;
}
if(tree_component.sto) clearTimeout(tree_component.sto);
tree_component.sto = setTimeout( function() { tree_component.inst[cnt.attr("id")].scrollCheck(event.pageX,event.pageY); }, 50);
var mov = false;
var st = cnt.scrollTop();
if(event.target.tagName == "A" && event.target.className=="title") {
// just in case if hover is over the draggable
if(jQuery(event.target).is("#dragged")) return false;
var goTo = {
x : (jQuery(event.target).offset().left - 1),
y : (event.pageY - tree_component.inst[cnt.attr("id")].offset.top)
}
if(cnt.hasClass("rtl")) {
goTo.x += jQuery(event.target).width() - 8;
}
if( (goTo.y + st)%_this.li_height < _this.li_height/3 + 1 ) {
mov = "before";
goTo.y = event.pageY - (goTo.y + st)%_this.li_height - 2 ;
}
else if((goTo.y + st)%_this.li_height > _this.li_height*2/3 - 1 ) {
mov = "after";
goTo.y = event.pageY - (goTo.y + st)%_this.li_height + _this.li_height - 2 ;
}
else {
mov = "inside";
goTo.x -= 2;
if(cnt.hasClass("rtl")) {
goTo.x += 36;
}
goTo.y = event.pageY - (goTo.y + st)%_this.li_height + Math.floor(_this.li_height/2) - 2 ;
if(_this.get_node(event.target).hasClass("closed")) {
tree_component.to = setTimeout( function () { _this.open_branch(_this.get_node(event.target)); }, 500);
}
}
if(tree_component.inst[cnt.attr("id")].checkMove(_this.container.find("li.dragged"), jQuery(event.target), mov)) {
if(mov == "inside") jQuery("#marker").attr("src", _this.settings.ui.theme_path + "default/plus.gif").width(14);
else {
if(cnt.hasClass("rtl")) { jQuery("#marker").attr("src", _this.settings.ui.theme_path + "default/marker_rtl.gif").width(40); }
else { jQuery("#marker").attr("src", _this.settings.ui.theme_path + "default/marker.gif").width(40); }
}
_this.moveType = mov;
_this.moveRef = event.target;
jQuery(_this.drag).children("IMG").remove();
jQuery("#marker").css({ "left" : goTo.x-1 , "top" : goTo.y-2 }).show();
}
else {
if(jQuery(_this.drag).children("IMG").size() == 0) {
jQuery(_this.drag).append("
");
}
_this.moveType = false;
_this.moveRef = false;
jQuery("#marker").hide();
}
}
else {
if(jQuery(_this.drag).children("IMG").size() == 0) {
jQuery(_this.drag).append("
");
}
_this.moveType = false;
_this.moveRef = false;
jQuery("#marker").hide();
}
event.preventDefault();
event.stopPropagation();
return false;
}
return true;
};
}
return {
cntr : tree_component.cntr ++,
settings : {
data : {
type : "predefined", // ENUM [json, xml_flat, xml_nested, predefined]
method : "GET", // HOW TO REQUEST FILES
async : false, // BOOL - async loading onopen
async_data : function (NODE) { return { id : jQuery(NODE).attr("id") || 0 } }, // PARAMETERS PASSED TO SERVER
url : false, // FALSE or STRING - url to document to be used (async or not)
json : false // FALSE or OBJECT if type is JSON and async is false - the tree dump as json
},
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 - si they must be valid)
path : false, // FALSE or STRING (if false - will be autodetected)
cookies : false, // FALSE or OBJECT (prefix, opts - from jqCookie - expires, path, domain, secure)
ui : {
dots : true, // BOOL - dots or no dots
rtl : false, // BOOL - is the tree right-to-left
animation : 0, // INT - duration of open/close animations in miliseconds
hover_mode : true, // SHOULD get_* functions chage focus or change hovered item
scroll_spd : 4,
theme_path : false, // Path to themes
theme_name : "default",// Name of theme
context : [
{
id : "create",
label : "Create",
icon : "create.png",
visible : function (NODE, TREE_OBJ) { if(NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); },
action : function (NODE, TREE_OBJ) { TREE_OBJ.create(false, NODE); }
},
"separator",
{
id : "rename",
label : "Rename",
icon : "rename.png",
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(); }
},
{
id : "delete",
label : "Delete",
icon : "remove.gif",
visible : function (NODE, TREE_OBJ) { return TREE_OBJ.check("deletable", NODE); },
action : function (NODE, TREE_OBJ) { NODE.each( function () { TREE_OBJ.remove(this); }); }
}
]
},
rules : {
multiple : false, // FALSE | CTRL | ON - multiple selection off/ with or without holding Ctrl
metadata : false, // FALSE or STRING - attribute name (use metadata plugin)
type_attr : "rel", // STRING attribute name (where is the type stored if no metadata)
multitree : false, // BOOL - is drag n drop between trees allowed
createat : "bottom", // STRING (top or bottom) new nodes get inserted at top or bottom
use_inline : false, // CHECK FOR INLINE RULES - REQUIRES METADATA
clickable : "all", // which node types can the user select | default - all
renameable : "all", // which node types can the user select | default - all
deletable : "all", // which node types can the user delete | default - all
creatable : "all", // which node types can the user create in | default - all
draggable : "none", // which node types can the user move | default - none | "all"
dragrules : "all", // what move operations between nodes are allowed | default - none | "all"
drag_copy : false, // FALSE | CTRL | ON - drag to copy off/ with or without holding Ctrl
droppable : []
},
lang : {
new_node : "New folder",
loading : "Loading ..."
},
callback : { // various callbacks to attach custom logic to
// before focus - should return true | false
beforechange: function(NODE,TREE_OBJ) { return true },
// before move - should return true | false
beforemove : function(NODE,REF_NODE,TYPE,TREE_OBJ) { return true },
// before create - should return true | false
beforecreate: function(NODE,REF_NODE,TYPE,TREE_OBJ) { return true },
// before rename - should return true | false
beforerename: function(NODE,LANG,TREE_OBJ) { return true },
// before delete - should return true | false
beforedelete: function(NODE,TREE_OBJ) { return true },
onchange : function(NODE,TREE_OBJ) { }, // focus changed
onrename : function(NODE,LANG,TREE_OBJ) { }, // node renamed ISNEW - TRUE|FALSE, current language
onmove : function(NODE,REF_NODE,TYPE,TREE_OBJ) { }, // move completed (TYPE is BELOW|ABOVE|INSIDE)
oncopy : function(NODE,REF_NODE,TYPE,TREE_OBJ) { }, // copy completed (TYPE is BELOW|ABOVE|INSIDE)
oncreate : function(NODE,REF_NODE,TYPE,TREE_OBJ) { }, // node created, parent node (TYPE is insertAt)
ondelete : function(NODE, TREE_OBJ) { }, // node deleted
onopen : function(NODE, TREE_OBJ) { }, // node opened
onclose : function(NODE, TREE_OBJ) { }, // node closed
error : function(TEXT, TREE_OBJ) { }, // error occured
// double click on node - defaults to open/close & select
ondblclk : function(NODE, TREE_OBJ) { TREE_OBJ.toggle_branch.call(TREE_OBJ, NODE); TREE_OBJ.select_branch.call(TREE_OBJ, NODE); },
// right click - to prevent use: EV.preventDefault(); EV.stopPropagation(); return false
onrgtclk : function(NODE, TREE_OBJ, EV) { },
onload : function(TREE_OBJ) { },
onfocus : function(TREE_OBJ) { },
ondrop : function(NODE,REF_NODE,TYPE,TREE_OBJ) {}
}
},
// INITIALIZATION
init : function(elem, opts) {
var _this = this;
this.container = jQuery(elem);
if(this.container.size == 0) { alert("Invalid container node!"); return }
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;
// MERGE OPTIONS WITH DEFAULTS
if(opts && opts.cookies) {
this.settings.cookies = jQuery.extend({},this.settings.cookies,opts.cookies);
delete opts.cookies;
if(!this.settings.cookies.opts) this.settings.cookies.opts = {};
}
if(opts && opts.callback) {
this.settings.callback = jQuery.extend({},this.settings.callback,opts.callback);
delete opts.callback;
}
if(opts && opts.data) {
this.settings.data = jQuery.extend({},this.settings.data,opts.data);
delete opts.data;
}
if(opts && opts.ui) {
this.settings.ui = jQuery.extend({},this.settings.ui,opts.ui);
delete opts.ui;
}
if(opts && opts.rules) {
this.settings.rules = jQuery.extend({},this.settings.rules,opts.rules);
delete opts.rules;
}
if(opts && opts.lang) {
this.settings.lang = jQuery.extend({},this.settings.lang,opts.lang);
delete opts.lang;
}
this.settings = jQuery.extend({},this.settings,opts);
// PATH TO IMAGES AND XSL
if(this.settings.path == false) {
this.path = "";
jQuery("script").each( function () {
if(this.src.toString().match(/tree_component.*?js.*$/)) {
_this.path = this.src.toString().replace(/tree_component.*?js.*$/, "");
}
});
}
else this.path = this.settings.path;
// DEAL WITH LANGUAGE VERSIONS
this.current_lang = this.settings.languages && this.settings.languages.length ? this.settings.languages[0] : false;
if(this.settings.languages && this.settings.languages.length) {
this.sn = get_sheet_num("tree_component.css");
var st = false;
var id = this.container.attr("id") ? "#" + this.container.attr("id") : ".tree";
for(var ln = 0; ln < this.settings.languages.length; ln++) {
st = add_css(id + " ." + this.settings.languages[ln], this.sn);
if(st !== false) {
if(this.settings.languages[ln] == this.current_lang) st.style.display = "inline";
else st.style.display = "none";
}
}
}
// DROPPABLES
if(this.settings.rules.droppable.length) {
for(i in this.settings.rules.droppable) {
tree_component.drop.push(this.settings.rules.droppable[i]);
tree_component.drop = jQuery.unique(tree_component.drop);
}
}
// THEMES
if(this.settings.ui.theme_path === false) this.settings.ui.theme_path = this.path + "themes/";
this.theme = this.settings.ui.theme_path + _this.settings.ui.theme_name + "/";
add_sheet(_this.settings.ui.theme_path + "default/style.css");
if(this.settings.ui.theme_name != "default") add_sheet(_this.theme + "style.css");
this.container.addClass("tree");
if(this.settings.ui.rtl) this.container.addClass("rtl");
if(this.settings.rules.multiple) this.selected_arr = [];
this.offset = false;
if(this.settings.ui.dots == false) this.container.addClass("no_dots");
// CONTEXT MENU
this.context = false;
if(this.settings.ui.context != false) {
var str = '
");
}
_this.moveType = false;
_this.moveRef = false;
jQuery("#marker").hide();
return false;
}
tree_component.inst[cnt.attr("id")].off_height();
// if moving over another tree and multitree is false
if( _this.foreign === false && cnt.get(0) != _this.container.get(0) && (!_this.settings.rules.multitree || !tree_component.inst[cnt.attr("id")].settings.rules.multitree) ) {
if(jQuery(_this.drag).children("IMG").size() == 0) {
jQuery(_this.drag).append("
");
}
_this.moveType = false;
_this.moveRef = false;
jQuery("#marker").hide();
return false;
}
if(tree_component.sto) clearTimeout(tree_component.sto);
tree_component.sto = setTimeout( function() { tree_component.inst[cnt.attr("id")].scrollCheck(event.pageX,event.pageY); }, 50);
var mov = false;
var st = cnt.scrollTop();
if(event.target.tagName == "A" && event.target.className=="title") {
// just in case if hover is over the draggable
if(jQuery(event.target).is("#dragged")) return false;
var goTo = {
x : (jQuery(event.target).offset().left - 1),
y : (event.pageY - tree_component.inst[cnt.attr("id")].offset.top)
}
if(cnt.hasClass("rtl")) {
goTo.x += jQuery(event.target).width() - 8;
}
if( (goTo.y + st)%_this.li_height < _this.li_height/3 + 1 ) {
mov = "before";
goTo.y = event.pageY - (goTo.y + st)%_this.li_height - 2 ;
}
else if((goTo.y + st)%_this.li_height > _this.li_height*2/3 - 1 ) {
mov = "after";
goTo.y = event.pageY - (goTo.y + st)%_this.li_height + _this.li_height - 2 ;
}
else {
mov = "inside";
goTo.x -= 2;
if(cnt.hasClass("rtl")) {
goTo.x += 36;
}
goTo.y = event.pageY - (goTo.y + st)%_this.li_height + Math.floor(_this.li_height/2) - 2 ;
if(_this.get_node(event.target).hasClass("closed")) {
tree_component.to = setTimeout( function () { _this.open_branch(_this.get_node(event.target)); }, 500);
}
}
if(tree_component.inst[cnt.attr("id")].checkMove(_this.container.find("li.dragged"), jQuery(event.target), mov)) {
if(mov == "inside") jQuery("#marker").attr("src", _this.settings.ui.theme_path + "default/plus.gif").width(14);
else {
if(cnt.hasClass("rtl")) { jQuery("#marker").attr("src", _this.settings.ui.theme_path + "default/marker_rtl.gif").width(40); }
else { jQuery("#marker").attr("src", _this.settings.ui.theme_path + "default/marker.gif").width(40); }
}
_this.moveType = mov;
_this.moveRef = event.target;
jQuery(_this.drag).children("IMG").remove();
jQuery("#marker").css({ "left" : goTo.x-1 , "top" : goTo.y-2 }).show();
}
else {
if(jQuery(_this.drag).children("IMG").size() == 0) {
jQuery(_this.drag).append("
");
}
_this.moveType = false;
_this.moveRef = false;
jQuery("#marker").hide();
}
}
else {
if(jQuery(_this.drag).children("IMG").size() == 0) {
jQuery(_this.drag).append("
");
}
_this.moveType = false;
_this.moveRef = false;
jQuery("#marker").hide();
}
event.preventDefault();
event.stopPropagation();
return false;
}
return true;
};
}
return {
cntr : tree_component.cntr ++,
settings : {
data : {
type : "predefined", // ENUM [json, xml_flat, xml_nested, predefined]
method : "GET", // HOW TO REQUEST FILES
async : false, // BOOL - async loading onopen
async_data : function (NODE) { return { id : jQuery(NODE).attr("id") || 0 } }, // PARAMETERS PASSED TO SERVER
url : false, // FALSE or STRING - url to document to be used (async or not)
json : false // FALSE or OBJECT if type is JSON and async is false - the tree dump as json
},
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 - si they must be valid)
path : false, // FALSE or STRING (if false - will be autodetected)
cookies : false, // FALSE or OBJECT (prefix, opts - from jqCookie - expires, path, domain, secure)
ui : {
dots : true, // BOOL - dots or no dots
rtl : false, // BOOL - is the tree right-to-left
animation : 0, // INT - duration of open/close animations in miliseconds
hover_mode : true, // SHOULD get_* functions chage focus or change hovered item
scroll_spd : 4,
theme_path : false, // Path to themes
theme_name : "default",// Name of theme
context : [
{
id : "create",
label : "Create",
icon : "create.png",
visible : function (NODE, TREE_OBJ) { if(NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); },
action : function (NODE, TREE_OBJ) { TREE_OBJ.create(false, NODE); }
},
"separator",
{
id : "rename",
label : "Rename",
icon : "rename.png",
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(); }
},
{
id : "delete",
label : "Delete",
icon : "remove.gif",
visible : function (NODE, TREE_OBJ) { return TREE_OBJ.check("deletable", NODE); },
action : function (NODE, TREE_OBJ) { NODE.each( function () { TREE_OBJ.remove(this); }); }
}
]
},
rules : {
multiple : false, // FALSE | CTRL | ON - multiple selection off/ with or without holding Ctrl
metadata : false, // FALSE or STRING - attribute name (use metadata plugin)
type_attr : "rel", // STRING attribute name (where is the type stored if no metadata)
multitree : false, // BOOL - is drag n drop between trees allowed
createat : "bottom", // STRING (top or bottom) new nodes get inserted at top or bottom
use_inline : false, // CHECK FOR INLINE RULES - REQUIRES METADATA
clickable : "all", // which node types can the user select | default - all
renameable : "all", // which node types can the user select | default - all
deletable : "all", // which node types can the user delete | default - all
creatable : "all", // which node types can the user create in | default - all
draggable : "none", // which node types can the user move | default - none | "all"
dragrules : "all", // what move operations between nodes are allowed | default - none | "all"
drag_copy : false, // FALSE | CTRL | ON - drag to copy off/ with or without holding Ctrl
droppable : []
},
lang : {
new_node : "New folder",
loading : "Loading ..."
},
callback : { // various callbacks to attach custom logic to
// before focus - should return true | false
beforechange: function(NODE,TREE_OBJ) { return true },
// before move - should return true | false
beforemove : function(NODE,REF_NODE,TYPE,TREE_OBJ) { return true },
// before create - should return true | false
beforecreate: function(NODE,REF_NODE,TYPE,TREE_OBJ) { return true },
// before rename - should return true | false
beforerename: function(NODE,LANG,TREE_OBJ) { return true },
// before delete - should return true | false
beforedelete: function(NODE,TREE_OBJ) { return true },
onchange : function(NODE,TREE_OBJ) { }, // focus changed
onrename : function(NODE,LANG,TREE_OBJ) { }, // node renamed ISNEW - TRUE|FALSE, current language
onmove : function(NODE,REF_NODE,TYPE,TREE_OBJ) { }, // move completed (TYPE is BELOW|ABOVE|INSIDE)
oncopy : function(NODE,REF_NODE,TYPE,TREE_OBJ) { }, // copy completed (TYPE is BELOW|ABOVE|INSIDE)
oncreate : function(NODE,REF_NODE,TYPE,TREE_OBJ) { }, // node created, parent node (TYPE is insertAt)
ondelete : function(NODE, TREE_OBJ) { }, // node deleted
onopen : function(NODE, TREE_OBJ) { }, // node opened
onclose : function(NODE, TREE_OBJ) { }, // node closed
error : function(TEXT, TREE_OBJ) { }, // error occured
// double click on node - defaults to open/close & select
ondblclk : function(NODE, TREE_OBJ) { TREE_OBJ.toggle_branch.call(TREE_OBJ, NODE); TREE_OBJ.select_branch.call(TREE_OBJ, NODE); },
// right click - to prevent use: EV.preventDefault(); EV.stopPropagation(); return false
onrgtclk : function(NODE, TREE_OBJ, EV) { },
onload : function(TREE_OBJ) { },
onfocus : function(TREE_OBJ) { },
ondrop : function(NODE,REF_NODE,TYPE,TREE_OBJ) {}
}
},
// INITIALIZATION
init : function(elem, opts) {
var _this = this;
this.container = jQuery(elem);
if(this.container.size == 0) { alert("Invalid container node!"); return }
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;
// MERGE OPTIONS WITH DEFAULTS
if(opts && opts.cookies) {
this.settings.cookies = jQuery.extend({},this.settings.cookies,opts.cookies);
delete opts.cookies;
if(!this.settings.cookies.opts) this.settings.cookies.opts = {};
}
if(opts && opts.callback) {
this.settings.callback = jQuery.extend({},this.settings.callback,opts.callback);
delete opts.callback;
}
if(opts && opts.data) {
this.settings.data = jQuery.extend({},this.settings.data,opts.data);
delete opts.data;
}
if(opts && opts.ui) {
this.settings.ui = jQuery.extend({},this.settings.ui,opts.ui);
delete opts.ui;
}
if(opts && opts.rules) {
this.settings.rules = jQuery.extend({},this.settings.rules,opts.rules);
delete opts.rules;
}
if(opts && opts.lang) {
this.settings.lang = jQuery.extend({},this.settings.lang,opts.lang);
delete opts.lang;
}
this.settings = jQuery.extend({},this.settings,opts);
// PATH TO IMAGES AND XSL
if(this.settings.path == false) {
this.path = "";
jQuery("script").each( function () {
if(this.src.toString().match(/tree_component.*?js.*$/)) {
_this.path = this.src.toString().replace(/tree_component.*?js.*$/, "");
}
});
}
else this.path = this.settings.path;
// DEAL WITH LANGUAGE VERSIONS
this.current_lang = this.settings.languages && this.settings.languages.length ? this.settings.languages[0] : false;
if(this.settings.languages && this.settings.languages.length) {
this.sn = get_sheet_num("tree_component.css");
var st = false;
var id = this.container.attr("id") ? "#" + this.container.attr("id") : ".tree";
for(var ln = 0; ln < this.settings.languages.length; ln++) {
st = add_css(id + " ." + this.settings.languages[ln], this.sn);
if(st !== false) {
if(this.settings.languages[ln] == this.current_lang) st.style.display = "inline";
else st.style.display = "none";
}
}
}
// DROPPABLES
if(this.settings.rules.droppable.length) {
for(i in this.settings.rules.droppable) {
tree_component.drop.push(this.settings.rules.droppable[i]);
tree_component.drop = jQuery.unique(tree_component.drop);
}
}
// THEMES
if(this.settings.ui.theme_path === false) this.settings.ui.theme_path = this.path + "themes/";
this.theme = this.settings.ui.theme_path + _this.settings.ui.theme_name + "/";
add_sheet(_this.settings.ui.theme_path + "default/style.css");
if(this.settings.ui.theme_name != "default") add_sheet(_this.theme + "style.css");
this.container.addClass("tree");
if(this.settings.ui.rtl) this.container.addClass("rtl");
if(this.settings.rules.multiple) this.selected_arr = [];
this.offset = false;
if(this.settings.ui.dots == false) this.container.addClass("no_dots");
// CONTEXT MENU
this.context = false;
if(this.settings.ui.context != false) {
var str = '