2011-03-01 05:37:59 +01:00
/ *
2016-01-02 22:29:58 +01:00
* jsTree ( custom version for SilverStripe : 1.0 - rc3 + minor bugfixes )
2011-03-01 05:37:59 +01:00
* http : //jstree.com/
*
* Copyright ( c ) 2010 Ivan Bozhanov ( vakata . com )
*
* 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
*
2011-10-04 12:43:47 +02:00
* $Date : 2011 - 02 - 09 01 : 17 : 14 + 0200 ( с р , 09 февр 2011 ) $
2011-03-01 05:37:59 +01:00
* $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" ;
// 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 = {
get _css : function ( rule _name , delete _flag , sheet ) {
rule _name = rule _name . toLowerCase ( ) ;
var css _rules = sheet . cssRules || sheet . rules ,
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 ( sheet . removeRule ) { sheet . removeRule ( j ) ; }
if ( sheet . deleteRule ) { sheet . deleteRule ( j ) ; }
return true ;
}
else { return css _rules [ j ] ; }
}
}
while ( css _rules [ ++ j ] ) ;
return false ;
} ,
add _css : function ( rule _name , sheet ) {
if ( $ . jstree . css . get _css ( rule _name , false , sheet ) ) { return false ; }
if ( sheet . insertRule ) { sheet . insertRule ( rule _name + ' { }' , 0 ) ; } else { sheet . addRule ( rule _name , null , 0 ) ; }
return $ . vakata . css . get _css ( rule _name ) ;
} ,
remove _css : function ( rule _name , sheet ) {
return $ . vakata . css . get _css ( rule _name , true , sheet ) ;
} ,
add _sheet : function ( opts ) {
2011-04-15 01:15:15 +02:00
// MODIFIED ischommer/SilverStripe: add_sheet significantly slows down rendering,
// we're loading all required CSS directly rather than adding it inline
// var tmp = false, is_new = true;
// if(opts.str) {
// 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) {
// 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));
// document.getElementsByTagName("head")[0].appendChild(tmp);
// }
// return tmp.sheet || tmp.styleSheet;
// }
// if(opts.url) {
// if(document.createStyleSheet) {
// try { tmp = document.createStyleSheet(opts.url); } catch (e) { }
// }
// else {
// tmp = document.createElement('link');
// tmp.rel = 'stylesheet';
// tmp.type = 'text/css';
// tmp.media = "all";
// tmp.href = opts.url;
// document.getElementsByTagName("head")[0].appendChild(tmp);
// return tmp.styleSheet;
// }
// }
2011-03-01 05:37:59 +01:00
}
} ;
// 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_node function
// jQuery plugin wrapper (thanks to jquery UI widget function)
$ . fn . jstree = function ( settings ) {
var isMethodCall = ( typeof settings == 'string' ) , // is this a method call like $().jstree("open_node")
args = Array . prototype . slice . call ( arguments , 1 ) ,
returnValue = this ;
// if a method call execute the method on all selected instances
if ( isMethodCall ) {
if ( settings . substring ( 0 , 1 ) == '_' ) { return returnValue ; }
this . each ( function ( ) {
2011-10-04 12:43:47 +02:00
var instance = instances [ $ . data ( this , "jstree_instance_id" ) ] ,
2011-03-01 05:37:59 +01:00
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 ; }
} ) ;
}
else {
this . each ( function ( ) {
// extend settings and allow for multiple hashes and $.data
2011-10-04 12:43:47 +02:00
var instance _id = $ . data ( this , "jstree_instance_id" ) ,
2011-03-01 05:37:59 +01:00
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
instance _id = parseInt ( instances . push ( { } ) , 10 ) - 1 ;
// store the jstree instance id to the container element
2011-10-04 12:43:47 +02:00
$ . data ( this , "jstree_instance_id" , instance _id ) ;
2011-03-01 05:37:59 +01:00
// clean up all plugins
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 , 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
2011-10-04 12:43:47 +02:00
setTimeout ( function ( ) { if ( instances [ instance _id ] ) { instances [ instance _id ] . init ( ) ; } } , 0 ) ;
2011-03-01 05:37:59 +01:00
} ) ;
}
// return the jquery selection (or if it was a method call that returned a value - the returned value)
return returnValue ;
} ;
// object to store exposed functions and objects
$ . jstree = {
defaults : {
plugins : [ ]
} ,
_focused : function ( ) { return instances [ focused _instance ] || null ; } ,
_reference : function ( needle ) {
// get by instance id
if ( instances [ needle ] ) { return instances [ needle ] ; }
// get by DOM (if still no luck - return null
var o = $ ( needle ) ;
if ( ! o . length && typeof needle === "string" ) { o = $ ( "#" + needle ) ; }
if ( ! o . length ) { return null ; }
2011-10-04 12:43:47 +02:00
return instances [ o . closest ( ".jstree" ) . data ( "jstree_instance_id" ) ] || null ;
2011-03-01 05:37:59 +01:00
} ,
_instance : function ( index , container , settings ) {
// for plugins to store data in
this . data = { core : { } } ;
this . get _settings = function ( ) { return $ . extend ( true , { } , settings ) ; } ;
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 ) ;
} ;
} ,
_fn : { } ,
plugin : function ( pname , pdata ) {
pdata = $ . extend ( { } , {
_ _init : $ . noop ,
_ _destroy : $ . noop ,
_fn : { } ,
defaults : false
} , pdata ) ;
plugins [ pname ] = pdata ;
$ . jstree . defaults [ pname ] = pdata . defaults ;
$ . each ( pdata . _fn , function ( i , val ) {
val . plugin = pname ;
val . old = $ . jstree . _fn [ i ] ;
$ . jstree . _fn [ i ] = function ( ) {
var rslt ,
func = val ,
args = Array . prototype . slice . call ( arguments ) ,
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 ; }
func = func . old ;
} while ( func ) ;
if ( ! func ) { return ; }
// 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 ) {
this . get _container ( ) . triggerHandler ( i + '.jstree' , { "inst" : this , "args" : args , "rslt" : data , "rlbk" : rlbk } ) ;
} ,
_ _rollback : function ( ) {
rlbk = this . get _rollback ( ) ;
return rlbk ;
} ,
_ _call _old : function ( replace _arguments ) {
return func . old . apply ( this , ( replace _arguments ? Array . prototype . slice . call ( arguments , 1 ) : args ) ) ;
}
} ) , args ) ;
}
// return the result
return rslt ;
} ;
$ . jstree . _fn [ i ] . old = val . old ;
$ . jstree . _fn [ i ] . plugin = pname ;
} ) ;
} ,
rollback : function ( rb ) {
if ( rb ) {
if ( ! $ . isArray ( rb ) ) { rb = [ rb ] ; }
$ . each ( rb , function ( i , val ) {
instances [ val . i ] . set _rollback ( val . h , val . d ) ;
} ) ;
}
}
} ;
// set the prototype for all instances
$ . jstree . _fn = $ . jstree . _instance . prototype = { } ;
// load the css when DOM is ready
$ ( function ( ) {
// 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; 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; } ' +
'.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' +
'.jstree a { display:inline-block; line-height:16px; height:16px; color:black; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' +
'.jstree a:focus { outline: none; } ' +
'.jstree a > ins { height:16px; width:16px; } ' +
'.jstree a > .jstree-icon { margin-right:3px; } ' +
'.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' +
'li.jstree-open > ul { display:block; } ' +
'li.jstree-closed > ul { display:none; } ' ;
// 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; } ' +
'.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' +
'li.jstree-open ul { display:block; } ' +
'li.jstree-closed ul { display:none !important; } ' +
'.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' +
'.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' +
'.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } ' ;
}
// 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; } ' ;
}
// 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 . 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" ,
multiple _selection : "Multiple selection"
}
} ,
_fn : {
init : function ( ) {
this . set _focus ( ) ;
if ( this . _get _settings ( ) . core . rtl ) {
this . get _container ( ) . addClass ( "jstree-rtl" ) . css ( "direction" , "rtl" ) ;
}
this . get _container ( ) . html ( "<ul><li class='jstree-last jstree-leaf'><ins> </ins><a class='jstree-loading' href='#'><ins class='jstree-icon'> </ins>" + this . _get _string ( "loading" ) + "</a></li></ul>" ) ;
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 ) {
var trgt = $ ( event . target ) ;
2011-10-04 12:43:47 +02:00
// if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); }
this . toggle _node ( trgt ) ;
2011-03-01 05:37:59 +01:00
} , this ) )
. bind ( "mousedown.jstree" , $ . proxy ( function ( ) {
this . set _focus ( ) ; // This used to be setTimeout(set_focus,0) - why?
} , this ) )
. bind ( "dblclick.jstree" , function ( event ) {
var sel ;
if ( document . selection && document . selection . empty ) { document . selection . empty ( ) ; }
else {
if ( window . getSelection ) {
sel = window . getSelection ( ) ;
try {
sel . removeAllRanges ( ) ;
sel . collapse ( ) ;
} catch ( err ) { }
}
}
} ) ;
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 . reload _nodes ( ) ; } ) ;
} ,
destroy : function ( ) {
var i ,
n = this . get _index ( ) ,
s = this . _get _settings ( ) ,
_this = this ;
$ . each ( s . plugins , function ( i , val ) {
try { plugins [ val ] . _ _destroy . apply ( _this ) ; } catch ( err ) { }
} ) ;
this . _ _callback ( ) ;
// set focus to another instance if this one is focused
if ( this . is _focused ( ) ) {
for ( i in instances ) {
if ( instances . hasOwnProperty ( i ) && i != n ) {
instances [ i ] . set _focus ( ) ;
break ;
}
}
}
// if no other instance found
if ( n === focused _instance ) { focused _instance = - 1 ; }
// remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events
this . get _container ( )
. unbind ( ".jstree" )
. undelegate ( ".jstree" )
2011-10-04 12:43:47 +02:00
. removeData ( "jstree_instance_id" )
2011-03-01 05:37:59 +01:00
. 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 _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 ) ;
} ,
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 ;
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 ) { current . push ( val ) ; }
else { remaining . push ( val ) ; }
} ) ;
if ( current . length ) {
this . data . core . to _load = remaining ;
$ . each ( current , function ( i , val ) {
if ( ! _this . _is _loaded ( val ) ) {
_this . load _node ( val , function ( ) { _this . reload _nodes ( true ) ; } , function ( ) { _this . reload _nodes ( true ) ; } ) ;
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 ( { } ) ;
} ,
2011-03-17 22:50:57 +01:00
refresh : function ( obj , s _call , e _call ) {
2011-03-01 05:37:59 +01:00
var _this = this ;
this . save _opened ( ) ;
if ( ! obj ) { obj = - 1 ; }
obj = this . _get _node ( obj ) ;
if ( ! obj ) { obj = - 1 ; }
if ( obj !== - 1 ) { obj . children ( "UL" ) . remove ( ) ; }
else { this . get _container _ul ( ) . empty ( ) ; }
2011-03-17 22:50:57 +01:00
this . load _node (
obj ,
function ( ) {
_this . _ _callback ( { "obj" : obj } ) ;
_this . reload _nodes ( ) ;
if ( s _call ) s _call . call ( this ) ;
} ,
e _call
) ;
2011-03-01 05:37:59 +01:00
} ,
// Dummy function to fire after the first load (so that there is a jstree.loaded event)
loaded : function ( ) {
this . _ _callback ( ) ;
} ,
// deal with focus
set _focus : function ( ) {
if ( this . is _focused ( ) ) { return ; }
var f = $ . jstree . _focused ( ) ;
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 ) {
var $obj = $ ( obj , this . get _container ( ) ) ;
if ( $obj . is ( ".jstree" ) || obj == - 1 ) { return - 1 ; }
$obj = $obj . closest ( "li" , this . get _container ( ) ) ;
return $obj . length ? $obj : false ;
} ,
_get _next : function ( obj , strict ) {
obj = this . _get _node ( obj ) ;
if ( obj === - 1 ) { return this . get _container ( ) . find ( "> ul > li:first-child" ) ; }
if ( ! obj . length ) { return false ; }
if ( strict ) { return ( obj . nextAll ( "li" ) . size ( ) > 0 ) ? obj . nextAll ( "li:eq(0)" ) : false ; }
if ( obj . hasClass ( "jstree-open" ) ) { return obj . find ( "li:eq(0)" ) ; }
else if ( obj . nextAll ( "li" ) . size ( ) > 0 ) { return obj . nextAll ( "li:eq(0)" ) ; }
else { return obj . parentsUntil ( ".jstree" , "li" ) . next ( "li" ) . eq ( 0 ) ; }
} ,
_get _prev : function ( obj , strict ) {
obj = this . _get _node ( obj ) ;
if ( obj === - 1 ) { return this . get _container ( ) . find ( "> ul > li:last-child" ) ; }
if ( ! obj . length ) { return false ; }
if ( strict ) { return ( obj . prevAll ( "li" ) . length > 0 ) ? obj . prevAll ( "li:eq(0)" ) : false ; }
if ( obj . prev ( "li" ) . length ) {
obj = obj . prev ( "li" ) . eq ( 0 ) ;
while ( obj . hasClass ( "jstree-open" ) ) { obj = obj . children ( "ul:eq(0)" ) . children ( "li:last" ) ; }
return obj ;
}
else { var o = obj . parentsUntil ( ".jstree" , "li:eq(0)" ) ; return o . length ? o : false ; }
} ,
_get _parent : function ( obj ) {
obj = this . _get _node ( obj ) ;
if ( obj == - 1 || ! obj . length ) { return false ; }
var o = obj . parentsUntil ( ".jstree" , "li:eq(0)" ) ;
return o . length ? o : - 1 ;
} ,
_get _children : function ( obj ) {
obj = this . _get _node ( obj ) ;
if ( obj === - 1 ) { return this . get _container ( ) . children ( "ul:eq(0)" ) . children ( "li" ) ; }
if ( ! obj . length ) { return false ; }
return obj . children ( "ul:eq(0)" ) . children ( "li" ) ;
} ,
get _path : function ( obj , id _mode ) {
var p = [ ] ,
_this = this ;
obj = this . _get _node ( obj ) ;
if ( obj === - 1 || ! obj || ! obj . length ) { return false ; }
obj . parentsUntil ( ".jstree" , "li" ) . each ( function ( ) {
p . push ( id _mode ? this . id : _this . get _text ( this ) ) ;
} ) ;
p . reverse ( ) ;
p . push ( id _mode ? obj . attr ( "id" ) : this . get _text ( obj ) ) ;
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 ) ;
if ( ! obj . length ) { return false ; }
if ( ! obj . hasClass ( "jstree-closed" ) ) { if ( callback ) { callback . call ( ) ; } return false ; }
var s = skip _animation || is _ie6 ? 0 : this . _get _settings ( ) . core . animation ,
t = this ;
if ( ! this . _is _loaded ( obj ) ) {
obj . children ( "a" ) . addClass ( "jstree-loading" ) ;
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 , 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 ,
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 , 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 , 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" ) ;
}
else {
original _obj = obj ;
if ( obj . is ( ".jstree-closed" ) ) { obj = obj . find ( "li.jstree-closed" ) . andSelf ( ) ; }
else { obj = obj . find ( "li.jstree-closed" ) ; }
}
var _this = this ;
obj . each ( function ( ) {
var _ _this = this ;
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 , do _animation ) {
var _this = this ;
obj = obj ? this . _get _node ( obj ) : this . get _container ( ) ;
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 _ul ( ) ;
obj = obj . is ( "li" ) ? obj . find ( "li" ) . andSelf ( ) : obj . find ( "li" ) ;
obj . removeClass ( "jstree-last" )
. filter ( "li:last-child" ) . addClass ( "jstree-last" ) . end ( )
. filter ( ":has(li)" )
. not ( ".jstree-open" ) . removeClass ( "jstree-leaf" ) . addClass ( "jstree-closed" ) ;
obj . not ( ".jstree-open, .jstree-closed" ) . addClass ( "jstree-leaf" ) . children ( "ul" ) . remove ( ) ;
this . _ _callback ( { "obj" : obj } ) ;
} ,
// rollback
get _rollback : function ( ) {
this . _ _callback ( ) ;
return { i : this . get _index ( ) , h : this . get _container ( ) . children ( "ul" ) . clone ( true ) , d : this . data } ;
} ,
set _rollback : function ( html , data ) {
this . get _container ( ) . empty ( ) . append ( html ) ;
this . data = data ;
this . _ _callback ( ) ;
} ,
// Dummy functions to be overwritten by any datastore plugin included
load _node : function ( obj , s _call , e _call ) { this . _ _callback ( { "obj" : obj } ) ; } ,
_is _loaded : function ( obj ) { return true ; } ,
// Basic operations: create
create _node : function ( obj , position , js , callback , is _loaded ) {
obj = this . _get _node ( obj ) ;
position = typeof position === "undefined" ? "last" : position ;
var d = $ ( "<li />" ) ,
s = this . _get _settings ( ) . core ,
tmp ;
if ( obj !== - 1 && ! obj . length ) { return false ; }
if ( ! is _loaded && ! this . _is _loaded ( obj ) ) { this . load _node ( obj , function ( ) { this . create _node ( obj , position , js , callback , true ) ; } ) ; return false ; }
this . _ _rollback ( ) ;
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 = 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 = $ ( "<a />" ) ;
if ( $ . isFunction ( m ) ) { m = m . call ( this , js ) ; }
if ( typeof m == "string" ) { tmp . attr ( 'href' , '#' ) [ s . html _titles ? "html" : "text" ] ( m ) ; }
else {
if ( ! m . attr ) { m . attr = { } ; }
if ( ! m . attr . href ) { m . attr . href = '#' ; }
tmp . attr ( m . attr ) [ s . html _titles ? "html" : "text" ] ( m . title ) ;
if ( m . language ) { tmp . addClass ( m . language ) ; }
}
tmp . prepend ( "<ins class='jstree-icon'> </ins>" ) ;
2011-10-04 12:43:47 +02:00
if ( ! m . icon && js . icon ) { m . icon = js . icon ; }
2011-03-01 05:37:59 +01:00
if ( m . icon ) {
if ( m . icon . indexOf ( "/" ) === - 1 ) { tmp . children ( "ins" ) . addClass ( m . icon ) ; }
else { tmp . children ( "ins" ) . css ( "background" , "url('" + m . icon + "') center center no-repeat" ) ; }
}
d . append ( tmp ) ;
} ) ;
d . prepend ( "<ins class='jstree-icon'> </ins>" ) ;
if ( obj === - 1 ) {
obj = this . get _container ( ) ;
if ( position === "before" ) { position = "first" ; }
if ( position === "after" ) { position = "last" ; }
}
switch ( position ) {
case "before" : obj . before ( d ) ; tmp = this . _get _parent ( obj ) ; break ;
case "after" : obj . after ( d ) ; tmp = this . _get _parent ( obj ) ; break ;
case "inside" :
case "first" :
if ( ! obj . children ( "ul" ) . length ) { obj . append ( "<ul />" ) ; }
obj . children ( "ul" ) . prepend ( d ) ;
tmp = obj ;
break ;
case "last" :
if ( ! obj . children ( "ul" ) . length ) { obj . append ( "<ul />" ) ; }
obj . children ( "ul" ) . append ( d ) ;
tmp = obj ;
break ;
default :
if ( ! obj . children ( "ul" ) . length ) { obj . append ( "<ul />" ) ; }
if ( ! position ) { position = 0 ; }
tmp = obj . children ( "ul" ) . children ( "li" ) . eq ( position ) ;
if ( tmp . length ) { tmp . before ( d ) ; }
else { obj . children ( "ul" ) . append ( d ) ; }
tmp = obj ;
break ;
}
if ( tmp === - 1 || tmp . get ( 0 ) === this . get _container ( ) . get ( 0 ) ) { tmp = - 1 ; }
this . clean _node ( tmp ) ;
this . _ _callback ( { "obj" : d , "parent" : tmp } ) ;
if ( callback ) { callback . call ( this , d ) ; }
return d ;
} ,
// Basic operations: rename (deal with text)
get _text : function ( obj ) {
obj = this . _get _node ( obj ) ;
if ( ! obj . length ) { return false ; }
var s = this . _get _settings ( ) . core . html _titles ;
obj = obj . children ( "a:eq(0)" ) ;
if ( s ) {
obj = obj . clone ( ) ;
obj . children ( "INS" ) . remove ( ) ;
return obj . html ( ) ;
}
else {
obj = obj . contents ( ) . filter ( function ( ) { return this . nodeType == 3 ; } ) [ 0 ] ;
2011-03-02 20:37:05 +01:00
return obj ? obj . nodeValue : '' ;
2011-03-01 05:37:59 +01:00
}
} ,
set _text : function ( obj , val ) {
obj = this . _get _node ( obj ) ;
if ( ! obj . length ) { return false ; }
obj = obj . children ( "a:eq(0)" ) ;
if ( this . _get _settings ( ) . core . html _titles ) {
var tmp = obj . children ( "INS" ) . clone ( ) ;
obj . html ( val ) . prepend ( tmp ) ;
this . _ _callback ( { "obj" : obj , "name" : val } ) ;
return true ;
}
else {
obj = obj . contents ( ) . filter ( function ( ) { return this . nodeType == 3 ; } ) [ 0 ] ;
this . _ _callback ( { "obj" : obj , "name" : val } ) ;
return ( obj . nodeValue = val ) ;
}
} ,
rename _node : function ( obj , val ) {
obj = this . _get _node ( obj ) ;
this . _ _rollback ( ) ;
if ( obj && obj . length && this . set _text . apply ( this , Array . prototype . slice . call ( arguments ) ) ) { this . _ _callback ( { "obj" : obj , "name" : val } ) ; }
} ,
// Basic operations: deleting nodes
delete _node : function ( obj ) {
obj = this . _get _node ( obj ) ;
if ( ! obj . length ) { return false ; }
this . _ _rollback ( ) ;
var p = this . _get _parent ( obj ) , prev = $ ( [ ] ) , t = this ;
obj . each ( function ( ) {
prev = prev . add ( t . _get _prev ( this ) ) ;
} ) ;
obj = obj . detach ( ) ;
if ( p !== - 1 && p . find ( "> ul > li" ) . length === 0 ) {
p . removeClass ( "jstree-open jstree-closed" ) . addClass ( "jstree-leaf" ) ;
}
this . clean _node ( p ) ;
this . _ _callback ( { "obj" : obj , "prev" : prev , "parent" : p } ) ;
return obj ;
} ,
prepare _move : function ( o , r , pos , cb , is _cb ) {
var p = { } ;
p . ot = $ . jstree . _reference ( o ) || this ;
p . o = p . ot . _get _node ( o ) ;
p . r = r === - 1 ? - 1 : this . _get _node ( r ) ;
p . p = ( typeof pos === "undefined" || pos === false ) ? "last" : pos ; // TODO: move to a setting
if ( ! is _cb && prepared _move . o && prepared _move . o [ 0 ] === p . o [ 0 ] && prepared _move . r [ 0 ] === p . r [ 0 ] && prepared _move . p === p . p ) {
this . _ _callback ( prepared _move ) ;
if ( cb ) { cb . call ( this , prepared _move ) ; }
return ;
}
p . ot = $ . jstree . _reference ( p . o ) || this ;
p . rt = $ . jstree . _reference ( p . r ) || this ; // r === -1 ? p.ot : $.jstree._reference(p.r) || this
if ( p . r === - 1 || ! p . r ) {
p . cr = - 1 ;
switch ( p . p ) {
case "first" :
case "before" :
case "inside" :
p . cp = 0 ;
break ;
case "after" :
case "last" :
p . cp = p . rt . get _container ( ) . find ( " > ul > li" ) . length ;
break ;
default :
p . cp = p . p ;
break ;
}
}
else {
if ( ! /^(before|after)$/ . test ( p . p ) && ! this . _is _loaded ( p . r ) ) {
return this . load _node ( p . r , function ( ) { this . prepare _move ( o , r , pos , cb , true ) ; } ) ;
}
switch ( p . p ) {
case "before" :
p . cp = p . r . index ( ) ;
p . cr = p . rt . _get _parent ( p . r ) ;
break ;
case "after" :
p . cp = p . r . index ( ) + 1 ;
p . cr = p . rt . _get _parent ( p . r ) ;
break ;
case "inside" :
case "first" :
p . cp = 0 ;
p . cr = p . r ;
break ;
case "last" :
p . cp = p . r . find ( " > ul > li" ) . length ;
p . cr = p . r ;
break ;
default :
p . cp = p . p ;
p . cr = p . r ;
break ;
}
}
p . np = p . cr == - 1 ? p . rt . get _container ( ) : p . cr ;
p . op = p . ot . _get _parent ( p . o ) ;
p . cop = p . o . index ( ) ;
if ( p . op === - 1 ) { p . op = p . ot ? p . ot . get _container ( ) : this . get _container ( ) ; }
if ( ! /^(before|after)$/ . test ( p . p ) && p . op && p . np && p . op [ 0 ] === p . np [ 0 ] && p . o . index ( ) < p . cp ) { p . cp ++ ; }
//if(p.p === "before" && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp--; }
p . or = p . np . find ( " > ul > li:nth-child(" + ( p . cp + 1 ) + ")" ) ;
prepared _move = p ;
this . _ _callback ( prepared _move ) ;
if ( cb ) { cb . call ( this , prepared _move ) ; }
} ,
check _move : function ( ) {
var obj = prepared _move , ret = true , r = obj . r === - 1 ? this . get _container ( ) : obj . r ;
if ( ! obj || ! obj . o || obj . or [ 0 ] === obj . o [ 0 ] ) { return false ; }
2011-10-04 12:43:47 +02:00
if ( ! obj . cy ) {
if ( obj . op && obj . np && obj . op [ 0 ] === obj . np [ 0 ] && obj . cp - 1 === obj . o . index ( ) ) { return false ; }
obj . o . each ( function ( ) {
if ( r . parentsUntil ( ".jstree" , "li" ) . andSelf ( ) . index ( this ) !== - 1 ) { ret = false ; return false ; }
} ) ;
}
2011-03-01 05:37:59 +01:00
return ret ;
} ,
move _node : function ( obj , ref , position , is _copy , is _prepared , skip _check ) {
if ( ! is _prepared ) {
return this . prepare _move ( obj , ref , position , function ( p ) {
this . move _node ( p , false , false , is _copy , true , skip _check ) ;
} ) ;
}
if ( is _copy ) {
prepared _move . cy = true ;
}
if ( ! skip _check && ! this . check _move ( ) ) { return false ; }
this . _ _rollback ( ) ;
var o = false ;
if ( is _copy ) {
o = obj . o . clone ( true ) ;
o . find ( "*[id]" ) . andSelf ( ) . each ( function ( ) {
if ( this . id ) { this . id = "copy_" + this . id ; }
} ) ;
}
else { o = obj . o ; }
if ( obj . or . length ) { obj . or . before ( o ) ; }
else {
if ( ! obj . np . children ( "ul" ) . length ) { $ ( "<ul />" ) . appendTo ( obj . np ) ; }
obj . np . children ( "ul:eq(0)" ) . append ( o ) ;
}
try {
obj . ot . clean _node ( obj . op ) ;
obj . rt . clean _node ( obj . np ) ;
if ( ! obj . op . find ( "> ul > li" ) . length ) {
obj . op . removeClass ( "jstree-open jstree-closed" ) . addClass ( "jstree-leaf" ) . children ( "ul" ) . remove ( ) ;
}
} catch ( e ) { }
if ( is _copy ) {
prepared _move . cy = true ;
prepared _move . oc = o ;
}
this . _ _callback ( prepared _move ) ;
return prepared _move ;
} ,
_get _move : function ( ) { return prepared _move ; }
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree ui plugin
* This plugins handles selecting / deselecting / hovering / dehovering nodes
* /
( function ( $ ) {
var scrollbar _width , e1 , e2 ;
$ ( function ( ) {
if ( /msie/ . test ( navigator . userAgent . toLowerCase ( ) ) ) {
e1 = $ ( '<textarea cols="10" rows="2"></textarea>' ) . css ( { position : 'absolute' , top : - 1000 , left : 0 } ) . appendTo ( 'body' ) ;
e2 = $ ( '<textarea cols="10" rows="2" style="overflow: hidden;"></textarea>' ) . css ( { position : 'absolute' , top : - 1000 , left : 0 } ) . appendTo ( 'body' ) ;
scrollbar _width = e1 . width ( ) - e2 . width ( ) ;
e1 . add ( e2 ) . remove ( ) ;
}
else {
e1 = $ ( '<div />' ) . css ( { width : 100 , height : 100 , overflow : 'auto' , position : 'absolute' , top : - 1000 , left : 0 } )
. prependTo ( 'body' ) . append ( '<div />' ) . find ( 'div' ) . css ( { width : '100%' , height : 200 } ) ;
scrollbar _width = 100 - e1 . width ( ) ;
e1 . parent ( ) . remove ( ) ;
}
} ) ;
$ . jstree . plugin ( "ui" , {
_ _init : function ( ) {
this . data . ui . selected = $ ( ) ;
this . data . ui . last _selected = false ;
this . data . ui . hovered = null ;
this . data . ui . to _select = this . get _settings ( ) . ui . initially _select ;
this . get _container ( )
. delegate ( "a" , "click.jstree" , $ . proxy ( function ( event ) {
event . preventDefault ( ) ;
event . currentTarget . blur ( ) ;
if ( ! $ ( event . currentTarget ) . hasClass ( "jstree-loading" ) ) {
this . select _node ( event . currentTarget , true , event ) ;
}
} , this ) )
. delegate ( "a" , "mouseenter.jstree" , $ . proxy ( function ( event ) {
if ( ! $ ( event . currentTarget ) . hasClass ( "jstree-loading" ) ) {
this . hover _node ( event . target ) ;
}
} , this ) )
. delegate ( "a" , "mouseleave.jstree" , $ . proxy ( function ( event ) {
if ( ! $ ( event . currentTarget ) . hasClass ( "jstree-loading" ) ) {
this . dehover _node ( event . target ) ;
}
} , this ) )
. bind ( "reopen.jstree" , $ . proxy ( function ( ) {
this . reselect ( ) ;
} , this ) )
. bind ( "get_rollback.jstree" , $ . proxy ( function ( ) {
this . dehover _node ( ) ;
this . save _selected ( ) ;
} , this ) )
. bind ( "set_rollback.jstree" , $ . proxy ( function ( ) {
this . reselect ( ) ;
} , this ) )
. bind ( "close_node.jstree" , $ . proxy ( function ( event , data ) {
var s = this . _get _settings ( ) . ui ,
obj = this . _get _node ( data . rslt . obj ) ,
clk = ( obj && obj . length ) ? obj . children ( "ul" ) . find ( "a.jstree-clicked" ) : $ ( ) ,
_this = this ;
if ( s . selected _parent _close === false || ! clk . length ) { return ; }
clk . each ( function ( ) {
_this . deselect _node ( this ) ;
if ( s . selected _parent _close === "select_parent" ) { _this . select _node ( obj ) ; }
} ) ;
} , this ) )
. bind ( "delete_node.jstree" , $ . proxy ( function ( event , data ) {
var s = this . _get _settings ( ) . ui . select _prev _on _delete ,
obj = this . _get _node ( data . rslt . obj ) ,
clk = ( obj && obj . length ) ? obj . find ( "a.jstree-clicked" ) : [ ] ,
_this = this ;
clk . each ( function ( ) { _this . deselect _node ( this ) ; } ) ;
if ( s && clk . length ) {
data . rslt . prev . each ( function ( ) {
if ( this . parentNode ) { _this . select _node ( this ) ; return false ; /* if return false is removed all prev nodes will be selected */ }
} ) ;
}
} , this ) )
. bind ( "move_node.jstree" , $ . proxy ( function ( event , data ) {
if ( data . rslt . cy ) {
data . rslt . oc . find ( "a.jstree-clicked" ) . removeClass ( "jstree-clicked" ) ;
}
} , this ) ) ;
} ,
defaults : {
select _limit : - 1 , // 0, 1, 2 ... or -1 for unlimited
select _multiple _modifier : "ctrl" , // on, or ctrl, shift, alt
select _range _modifier : "shift" ,
selected _parent _close : "select_parent" , // false, "deselect", "select_parent"
selected _parent _open : true ,
select _prev _on _delete : true ,
disable _selecting _children : false ,
initially _select : [ ]
} ,
_fn : {
_get _node : function ( obj , allow _multiple ) {
if ( typeof obj === "undefined" || obj === null ) { return allow _multiple ? this . data . ui . selected : this . data . ui . last _selected ; }
var $obj = $ ( obj , this . get _container ( ) ) ;
if ( $obj . is ( ".jstree" ) || obj == - 1 ) { return - 1 ; }
$obj = $obj . closest ( "li" , this . get _container ( ) ) ;
return $obj . length ? $obj : false ;
} ,
_ui _notify : function ( n , data ) {
if ( data . selected ) {
this . select _node ( n , false ) ;
}
} ,
save _selected : function ( ) {
var _this = this ;
this . data . ui . to _select = [ ] ;
this . data . ui . selected . each ( function ( ) { if ( this . id ) { _this . data . ui . to _select . push ( "#" + this . id . toString ( ) . replace ( /^#/ , "" ) . replace ( /\\\//g , "/" ) . replace ( /\//g , "\\\/" ) . replace ( /\\\./g , "." ) . replace ( /\./g , "\\." ) . replace ( /\:/g , "\\:" ) ) ; } } ) ;
this . _ _callback ( this . data . ui . to _select ) ;
} ,
reselect : function ( ) {
var _this = this ,
s = this . data . ui . to _select ;
s = $ . map ( $ . makeArray ( s ) , function ( n ) { return "#" + n . toString ( ) . replace ( /^#/ , "" ) . replace ( /\\\//g , "/" ) . replace ( /\//g , "\\\/" ) . replace ( /\\\./g , "." ) . replace ( /\./g , "\\." ) . replace ( /\:/g , "\\:" ) ; } ) ;
// this.deselect_all(); WHY deselect, breaks plugin state notifier?
$ . each ( s , function ( i , val ) { if ( val && val !== "#" ) { _this . select _node ( val ) ; } } ) ;
this . data . ui . selected = this . data . ui . selected . filter ( function ( ) { return this . parentNode ; } ) ;
this . _ _callback ( ) ;
} ,
refresh : function ( obj ) {
this . save _selected ( ) ;
return this . _ _call _old ( ) ;
} ,
hover _node : function ( obj ) {
obj = this . _get _node ( obj ) ;
if ( ! obj . length ) { return false ; }
//if(this.data.ui.hovered && obj.get(0) === this.data.ui.hovered.get(0)) { return; }
if ( ! obj . hasClass ( "jstree-hovered" ) ) { this . dehover _node ( ) ; }
this . data . ui . hovered = obj . children ( "a" ) . addClass ( "jstree-hovered" ) . parent ( ) ;
this . _fix _scroll ( obj ) ;
this . _ _callback ( { "obj" : obj } ) ;
} ,
dehover _node : function ( ) {
var obj = this . data . ui . hovered , p ;
if ( ! obj || ! obj . length ) { return false ; }
p = obj . children ( "a" ) . removeClass ( "jstree-hovered" ) . parent ( ) ;
if ( this . data . ui . hovered [ 0 ] === p [ 0 ] ) { this . data . ui . hovered = null ; }
this . _ _callback ( { "obj" : obj } ) ;
} ,
select _node : function ( obj , check , e ) {
obj = this . _get _node ( obj ) ;
if ( obj == - 1 || ! obj || ! obj . length ) { return false ; }
var s = this . _get _settings ( ) . ui ,
is _multiple = ( s . select _multiple _modifier == "on" || ( s . select _multiple _modifier !== false && e && e [ s . select _multiple _modifier + "Key" ] ) ) ,
is _range = ( s . select _range _modifier !== false && e && e [ s . select _range _modifier + "Key" ] && this . data . ui . last _selected && this . data . ui . last _selected [ 0 ] !== obj [ 0 ] && this . data . ui . last _selected . parent ( ) [ 0 ] === obj . parent ( ) [ 0 ] ) ,
is _selected = this . is _selected ( obj ) ,
proceed = true ,
t = this ;
if ( check ) {
if ( s . disable _selecting _children && is _multiple &&
(
( obj . parentsUntil ( ".jstree" , "li" ) . children ( "a.jstree-clicked" ) . length ) ||
( obj . children ( "ul" ) . find ( "a.jstree-clicked:eq(0)" ) . length )
)
) {
return false ;
}
proceed = false ;
switch ( ! 0 ) {
case ( is _range ) :
this . data . ui . last _selected . addClass ( "jstree-last-selected" ) ;
obj = obj [ obj . index ( ) < this . data . ui . last _selected . index ( ) ? "nextUntil" : "prevUntil" ] ( ".jstree-last-selected" ) . andSelf ( ) ;
if ( s . select _limit == - 1 || obj . length < s . select _limit ) {
this . data . ui . last _selected . removeClass ( "jstree-last-selected" ) ;
this . data . ui . selected . each ( function ( ) {
if ( this !== t . data . ui . last _selected [ 0 ] ) { t . deselect _node ( this ) ; }
} ) ;
is _selected = false ;
proceed = true ;
}
else {
proceed = false ;
}
break ;
case ( is _selected && ! is _multiple ) :
this . deselect _all ( ) ;
is _selected = false ;
proceed = true ;
break ;
case ( ! is _selected && ! is _multiple ) :
if ( s . select _limit == - 1 || s . select _limit > 0 ) {
this . deselect _all ( ) ;
proceed = true ;
}
break ;
case ( is _selected && is _multiple ) :
this . deselect _node ( obj ) ;
break ;
case ( ! is _selected && is _multiple ) :
if ( s . select _limit == - 1 || this . data . ui . selected . length + 1 <= s . select _limit ) {
proceed = true ;
}
break ;
}
}
if ( proceed && ! is _selected ) {
if ( ! is _range ) { this . data . ui . last _selected = obj ; }
obj . children ( "a" ) . addClass ( "jstree-clicked" ) ;
if ( s . selected _parent _open ) {
obj . parents ( ".jstree-closed" ) . each ( function ( ) { t . open _node ( this , false , true ) ; } ) ;
}
this . data . ui . selected = this . data . ui . selected . add ( obj ) ;
this . _fix _scroll ( obj . eq ( 0 ) ) ;
this . _ _callback ( { "obj" : obj , "e" : e } ) ;
}
} ,
_fix _scroll : function ( obj ) {
var c = this . get _container ( ) [ 0 ] , t ;
if ( c . scrollHeight > c . offsetHeight ) {
obj = this . _get _node ( obj ) ;
if ( ! obj || obj === - 1 || ! obj . length || ! obj . is ( ":visible" ) ) { return ; }
t = obj . offset ( ) . top - this . get _container ( ) . offset ( ) . top ;
if ( t < 0 ) {
c . scrollTop = c . scrollTop + t - 1 ;
}
if ( t + this . data . core . li _height + ( c . scrollWidth > c . offsetWidth ? scrollbar _width : 0 ) > c . offsetHeight ) {
c . scrollTop = c . scrollTop + ( t - c . offsetHeight + this . data . core . li _height + 1 + ( c . scrollWidth > c . offsetWidth ? scrollbar _width : 0 ) ) ;
}
}
} ,
deselect _node : function ( obj ) {
obj = this . _get _node ( obj ) ;
if ( ! obj . length ) { return false ; }
if ( this . is _selected ( obj ) ) {
obj . children ( "a" ) . removeClass ( "jstree-clicked" ) ;
this . data . ui . selected = this . data . ui . selected . not ( obj ) ;
if ( this . data . ui . last _selected . get ( 0 ) === obj . get ( 0 ) ) { this . data . ui . last _selected = this . data . ui . selected . eq ( 0 ) ; }
this . _ _callback ( { "obj" : obj } ) ;
}
} ,
toggle _select : function ( obj ) {
obj = this . _get _node ( obj ) ;
if ( ! obj . length ) { return false ; }
if ( this . is _selected ( obj ) ) { this . deselect _node ( obj ) ; }
else { this . select _node ( obj ) ; }
} ,
is _selected : function ( obj ) { return this . data . ui . selected . index ( this . _get _node ( obj ) ) >= 0 ; } ,
get _selected : function ( context ) {
return context ? $ ( context ) . find ( "a.jstree-clicked" ) . parent ( ) : this . data . ui . selected ;
} ,
deselect _all : function ( context ) {
var ret = context ? $ ( context ) . find ( "a.jstree-clicked" ) . parent ( ) : this . get _container ( ) . find ( "a.jstree-clicked" ) . parent ( ) ;
ret . children ( "a.jstree-clicked" ) . removeClass ( "jstree-clicked" ) ;
this . data . ui . selected = $ ( [ ] ) ;
this . data . ui . last _selected = false ;
this . _ _callback ( { "obj" : ret } ) ;
}
}
} ) ;
// include the selection plugin by default
$ . jstree . defaults . plugins . push ( "ui" ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree CRRM plugin
* Handles creating / renaming / removing / moving nodes by user interaction .
* /
( function ( $ ) {
$ . jstree . plugin ( "crrm" , {
_ _init : function ( ) {
this . get _container ( )
. bind ( "move_node.jstree" , $ . proxy ( function ( e , data ) {
if ( this . _get _settings ( ) . crrm . move . open _onmove ) {
var t = this ;
data . rslt . np . parentsUntil ( ".jstree" ) . andSelf ( ) . filter ( ".jstree-closed" ) . each ( function ( ) {
t . open _node ( this , false , true ) ;
} ) ;
}
} , this ) ) ;
} ,
defaults : {
input _width _limit : 200 ,
move : {
always _copy : false , // false, true or "multitree"
open _onmove : true ,
default _position : "last" ,
check _move : function ( m ) { return true ; }
}
} ,
_fn : {
_show _input : function ( obj , callback ) {
obj = this . _get _node ( obj ) ;
var rtl = this . _get _settings ( ) . core . rtl ,
w = this . _get _settings ( ) . crrm . input _width _limit ,
w1 = obj . children ( "ins" ) . width ( ) ,
w2 = obj . find ( "> a:visible > ins" ) . width ( ) * obj . find ( "> a:visible > ins" ) . length ,
t = this . get _text ( obj ) ,
h1 = $ ( "<div />" , { css : { "position" : "absolute" , "top" : "-200px" , "left" : ( rtl ? "0px" : "-1000px" ) , "visibility" : "hidden" } } ) . appendTo ( "body" ) ,
h2 = obj . css ( "position" , "relative" ) . append (
$ ( "<input />" , {
"value" : t ,
"class" : "jstree-rename-input" ,
// "size" : t.length,
"css" : {
"padding" : "0" ,
"border" : "1px solid silver" ,
"position" : "absolute" ,
"left" : ( rtl ? "auto" : ( w1 + w2 + 4 ) + "px" ) ,
"right" : ( rtl ? ( w1 + w2 + 4 ) + "px" : "auto" ) ,
"top" : "0px" ,
"height" : ( this . data . core . li _height - 2 ) + "px" ,
"lineHeight" : ( this . data . core . li _height - 2 ) + "px" ,
"width" : "150px" // will be set a bit further down
} ,
"blur" : $ . proxy ( function ( ) {
var i = obj . children ( ".jstree-rename-input" ) ,
v = i . val ( ) ;
if ( v === "" ) { v = t ; }
h1 . remove ( ) ;
i . remove ( ) ; // rollback purposes
this . set _text ( obj , t ) ; // rollback purposes
this . rename _node ( obj , v ) ;
callback . call ( this , obj , v , t ) ;
obj . css ( "position" , "" ) ;
} , this ) ,
"keyup" : function ( event ) {
var key = event . keyCode || event . which ;
if ( key == 27 ) { this . value = t ; this . blur ( ) ; return ; }
else if ( key == 13 ) { this . blur ( ) ; return ; }
else {
h2 . width ( Math . min ( h1 . text ( "pW" + this . value ) . width ( ) , w ) ) ;
}
} ,
"keypress" : function ( event ) {
var key = event . keyCode || event . which ;
if ( key == 13 ) { return false ; }
}
} )
) . children ( ".jstree-rename-input" ) ;
this . set _text ( obj , "" ) ;
h1 . css ( {
fontFamily : h2 . css ( 'fontFamily' ) || '' ,
fontSize : h2 . css ( 'fontSize' ) || '' ,
fontWeight : h2 . css ( 'fontWeight' ) || '' ,
fontStyle : h2 . css ( 'fontStyle' ) || '' ,
fontStretch : h2 . css ( 'fontStretch' ) || '' ,
fontVariant : h2 . css ( 'fontVariant' ) || '' ,
letterSpacing : h2 . css ( 'letterSpacing' ) || '' ,
wordSpacing : h2 . css ( 'wordSpacing' ) || ''
} ) ;
h2 . width ( Math . min ( h1 . text ( "pW" + h2 [ 0 ] . value ) . width ( ) , w ) ) [ 0 ] . select ( ) ;
} ,
rename : function ( obj ) {
obj = this . _get _node ( obj ) ;
this . _ _rollback ( ) ;
var f = this . _ _callback ;
this . _show _input ( obj , function ( obj , new _name , old _name ) {
f . call ( this , { "obj" : obj , "new_name" : new _name , "old_name" : old _name } ) ;
} ) ;
} ,
create : function ( obj , position , js , callback , skip _rename ) {
var t , _this = this ;
obj = this . _get _node ( obj ) ;
if ( ! obj ) { obj = - 1 ; }
this . _ _rollback ( ) ;
t = this . create _node ( obj , position , js , function ( t ) {
var p = this . _get _parent ( t ) ,
pos = $ ( t ) . index ( ) ;
if ( callback ) { callback . call ( this , t ) ; }
if ( p . length && p . hasClass ( "jstree-closed" ) ) { this . open _node ( p , false , true ) ; }
if ( ! skip _rename ) {
this . _show _input ( t , function ( obj , new _name , old _name ) {
_this . _ _callback ( { "obj" : obj , "name" : new _name , "parent" : p , "position" : pos } ) ;
} ) ;
}
else { _this . _ _callback ( { "obj" : t , "name" : this . get _text ( t ) , "parent" : p , "position" : pos } ) ; }
} ) ;
return t ;
} ,
remove : function ( obj ) {
obj = this . _get _node ( obj , true ) ;
var p = this . _get _parent ( obj ) , prev = this . _get _prev ( obj ) ;
this . _ _rollback ( ) ;
obj = this . delete _node ( obj ) ;
if ( obj !== false ) { this . _ _callback ( { "obj" : obj , "prev" : prev , "parent" : p } ) ; }
} ,
check _move : function ( ) {
if ( ! this . _ _call _old ( ) ) { return false ; }
var s = this . _get _settings ( ) . crrm . move ;
if ( ! s . check _move . call ( this , this . _get _move ( ) ) ) { return false ; }
return true ;
} ,
move _node : function ( obj , ref , position , is _copy , is _prepared , skip _check ) {
var s = this . _get _settings ( ) . crrm . move ;
if ( ! is _prepared ) {
if ( typeof position === "undefined" ) { position = s . default _position ; }
if ( position === "inside" && ! s . default _position . match ( /^(before|after)$/ ) ) { position = s . default _position ; }
return this . _ _call _old ( true , obj , ref , position , is _copy , false , skip _check ) ;
}
// if the move is already prepared
if ( s . always _copy === true || ( s . always _copy === "multitree" && obj . rt . get _index ( ) !== obj . ot . get _index ( ) ) ) {
is _copy = true ;
}
this . _ _call _old ( true , obj , ref , position , is _copy , true , skip _check ) ;
} ,
cut : function ( obj ) {
obj = this . _get _node ( obj , true ) ;
if ( ! obj || ! obj . length ) { return false ; }
this . data . crrm . cp _nodes = false ;
this . data . crrm . ct _nodes = obj ;
this . _ _callback ( { "obj" : obj } ) ;
} ,
copy : function ( obj ) {
obj = this . _get _node ( obj , true ) ;
if ( ! obj || ! obj . length ) { return false ; }
this . data . crrm . ct _nodes = false ;
this . data . crrm . cp _nodes = obj ;
this . _ _callback ( { "obj" : obj } ) ;
} ,
paste : function ( obj ) {
obj = this . _get _node ( obj ) ;
if ( ! obj || ! obj . length ) { return false ; }
var nodes = this . data . crrm . ct _nodes ? this . data . crrm . ct _nodes : this . data . crrm . cp _nodes ;
if ( ! this . data . crrm . ct _nodes && ! this . data . crrm . cp _nodes ) { return false ; }
if ( this . data . crrm . ct _nodes ) { this . move _node ( this . data . crrm . ct _nodes , obj ) ; this . data . crrm . ct _nodes = false ; }
if ( this . data . crrm . cp _nodes ) { this . move _node ( this . data . crrm . cp _nodes , obj , false , true ) ; }
this . _ _callback ( { "obj" : obj , "nodes" : nodes } ) ;
}
}
} ) ;
// include the crr plugin by default
// $.jstree.defaults.plugins.push("crrm");
} ) ( jQuery ) ;
//*/
/ *
* jsTree themes plugin
* Handles loading and setting themes , as well as detecting path to themes , etc .
* /
( function ( $ ) {
var themes _loaded = [ ] ;
// this variable stores the path to the themes folder - if left as false - it will be autodetected
$ . jstree . _themes = false ;
$ . jstree . plugin ( "themes" , {
_ _init : function ( ) {
this . get _container ( )
. bind ( "init.jstree" , $ . proxy ( function ( ) {
var s = this . _get _settings ( ) . themes ;
this . data . themes . dots = s . dots ;
this . data . themes . icons = s . icons ;
this . set _theme ( s . theme , s . url ) ;
} , this ) )
. bind ( "loaded.jstree" , $ . proxy ( function ( ) {
// bound here too, as simple HTML tree's won't honor dots & icons otherwise
if ( ! this . data . themes . dots ) { this . hide _dots ( ) ; }
else { this . show _dots ( ) ; }
if ( ! this . data . themes . icons ) { this . hide _icons ( ) ; }
else { this . show _icons ( ) ; }
} , this ) ) ;
} ,
defaults : {
theme : "default" ,
url : false ,
dots : true ,
icons : true
} ,
_fn : {
set _theme : function ( theme _name , theme _url ) {
if ( ! theme _name ) { return false ; }
if ( ! theme _url ) { theme _url = $ . jstree . _themes + theme _name + '/style.css' ; }
if ( $ . inArray ( theme _url , themes _loaded ) == - 1 ) {
$ . vakata . css . add _sheet ( { "url" : theme _url } ) ;
themes _loaded . push ( theme _url ) ;
}
if ( this . data . themes . theme != theme _name ) {
this . get _container ( ) . removeClass ( 'jstree-' + this . data . themes . theme ) ;
this . data . themes . theme = theme _name ;
}
this . get _container ( ) . addClass ( 'jstree-' + theme _name ) ;
if ( ! this . data . themes . dots ) { this . hide _dots ( ) ; }
else { this . show _dots ( ) ; }
if ( ! this . data . themes . icons ) { this . hide _icons ( ) ; }
else { this . show _icons ( ) ; }
this . _ _callback ( ) ;
} ,
get _theme : function ( ) { return this . data . themes . theme ; } ,
show _dots : function ( ) { this . data . themes . dots = true ; this . get _container ( ) . children ( "ul" ) . removeClass ( "jstree-no-dots" ) ; } ,
hide _dots : function ( ) { this . data . themes . dots = false ; this . get _container ( ) . children ( "ul" ) . addClass ( "jstree-no-dots" ) ; } ,
toggle _dots : function ( ) { if ( this . data . themes . dots ) { this . hide _dots ( ) ; } else { this . show _dots ( ) ; } } ,
show _icons : function ( ) { this . data . themes . icons = true ; this . get _container ( ) . children ( "ul" ) . removeClass ( "jstree-no-icons" ) ; } ,
hide _icons : function ( ) { this . data . themes . icons = false ; this . get _container ( ) . children ( "ul" ) . addClass ( "jstree-no-icons" ) ; } ,
toggle _icons : function ( ) { if ( this . data . themes . icons ) { this . hide _icons ( ) ; } else { this . show _icons ( ) ; } }
}
} ) ;
// autodetect themes path
$ ( function ( ) {
if ( $ . jstree . _themes === false ) {
$ ( "script" ) . each ( function ( ) {
if ( this . src . toString ( ) . match ( /jquery\.jstree[^\/]*?\.js(\?.*)?$/ ) ) {
$ . jstree . _themes = this . src . toString ( ) . replace ( /jquery\.jstree[^\/]*?\.js(\?.*)?$/ , "" ) + 'themes/' ;
return false ;
}
} ) ;
}
if ( $ . jstree . _themes === false ) { $ . jstree . _themes = "themes/" ; }
} ) ;
// include the themes plugin by default
$ . jstree . defaults . plugins . push ( "themes" ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree hotkeys plugin
* Enables keyboard navigation for all tree instances
* Depends on the jstree ui & jquery hotkeys plugins
* /
( function ( $ ) {
var bound = [ ] ;
function exec ( i , event ) {
var f = $ . jstree . _focused ( ) , tmp ;
if ( f && f . data && f . data . hotkeys && f . data . hotkeys . enabled ) {
tmp = f . _get _settings ( ) . hotkeys [ i ] ;
if ( tmp ) { return tmp . call ( f , event ) ; }
}
}
$ . jstree . plugin ( "hotkeys" , {
_ _init : function ( ) {
if ( typeof $ . hotkeys === "undefined" ) { throw "jsTree hotkeys: jQuery hotkeys plugin not included." ; }
if ( ! this . data . ui ) { throw "jsTree hotkeys: jsTree UI plugin not included." ; }
$ . each ( this . _get _settings ( ) . hotkeys , function ( i , v ) {
if ( v !== false && $ . inArray ( i , bound ) == - 1 ) {
$ ( document ) . bind ( "keydown" , i , function ( event ) { return exec ( i , event ) ; } ) ;
bound . push ( i ) ;
}
} ) ;
this . get _container ( )
. bind ( "lock.jstree" , $ . proxy ( function ( ) {
if ( this . data . hotkeys . enabled ) { this . data . hotkeys . enabled = false ; this . data . hotkeys . revert = true ; }
} , this ) )
. bind ( "unlock.jstree" , $ . proxy ( function ( ) {
if ( this . data . hotkeys . revert ) { this . data . hotkeys . enabled = true ; }
} , this ) ) ;
this . enable _hotkeys ( ) ;
} ,
defaults : {
"up" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected || - 1 ;
this . hover _node ( this . _get _prev ( o ) ) ;
return false ;
} ,
"ctrl+up" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected || - 1 ;
this . hover _node ( this . _get _prev ( o ) ) ;
return false ;
} ,
"shift+up" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected || - 1 ;
this . hover _node ( this . _get _prev ( o ) ) ;
return false ;
} ,
"down" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected || - 1 ;
this . hover _node ( this . _get _next ( o ) ) ;
return false ;
} ,
"ctrl+down" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected || - 1 ;
this . hover _node ( this . _get _next ( o ) ) ;
return false ;
} ,
"shift+down" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected || - 1 ;
this . hover _node ( this . _get _next ( o ) ) ;
return false ;
} ,
"left" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected ;
if ( o ) {
if ( o . hasClass ( "jstree-open" ) ) { this . close _node ( o ) ; }
else { this . hover _node ( this . _get _prev ( o ) ) ; }
}
return false ;
} ,
"ctrl+left" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected ;
if ( o ) {
if ( o . hasClass ( "jstree-open" ) ) { this . close _node ( o ) ; }
else { this . hover _node ( this . _get _prev ( o ) ) ; }
}
return false ;
} ,
"shift+left" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected ;
if ( o ) {
if ( o . hasClass ( "jstree-open" ) ) { this . close _node ( o ) ; }
else { this . hover _node ( this . _get _prev ( o ) ) ; }
}
return false ;
} ,
"right" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected ;
if ( o && o . length ) {
if ( o . hasClass ( "jstree-closed" ) ) { this . open _node ( o ) ; }
else { this . hover _node ( this . _get _next ( o ) ) ; }
}
return false ;
} ,
"ctrl+right" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected ;
if ( o && o . length ) {
if ( o . hasClass ( "jstree-closed" ) ) { this . open _node ( o ) ; }
else { this . hover _node ( this . _get _next ( o ) ) ; }
}
return false ;
} ,
"shift+right" : function ( ) {
var o = this . data . ui . hovered || this . data . ui . last _selected ;
if ( o && o . length ) {
if ( o . hasClass ( "jstree-closed" ) ) { this . open _node ( o ) ; }
else { this . hover _node ( this . _get _next ( o ) ) ; }
}
return false ;
} ,
"space" : function ( ) {
if ( this . data . ui . hovered ) { this . data . ui . hovered . children ( "a:eq(0)" ) . click ( ) ; }
return false ;
} ,
"ctrl+space" : function ( event ) {
event . type = "click" ;
if ( this . data . ui . hovered ) { this . data . ui . hovered . children ( "a:eq(0)" ) . trigger ( event ) ; }
return false ;
} ,
"shift+space" : function ( event ) {
event . type = "click" ;
if ( this . data . ui . hovered ) { this . data . ui . hovered . children ( "a:eq(0)" ) . trigger ( event ) ; }
return false ;
} ,
"f2" : function ( ) { this . rename ( this . data . ui . hovered || this . data . ui . last _selected ) ; } ,
"del" : function ( ) { this . remove ( this . data . ui . hovered || this . _get _node ( null ) ) ; }
} ,
_fn : {
enable _hotkeys : function ( ) {
this . data . hotkeys . enabled = true ;
} ,
disable _hotkeys : function ( ) {
this . data . hotkeys . enabled = false ;
}
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree JSON plugin
* The JSON data store . Datastores are build by overriding the ` load_node ` and ` _is_loaded ` functions .
* /
( function ( $ ) {
$ . jstree . plugin ( "json_data" , {
_ _init : function ( ) {
var s = this . _get _settings ( ) . json _data ;
if ( s . progressive _unload ) {
this . get _container ( ) . bind ( "after_close.jstree" , function ( e , data ) {
data . rslt . obj . children ( "ul" ) . remove ( ) ;
} ) ;
}
} ,
defaults : {
// `data` can be a function:
// * accepts two arguments - node being loaded and a callback to pass the result to
// * will be executed in the current tree's scope & ajax won't be supported
data : false ,
ajax : false ,
correct _state : true ,
progressive _render : false ,
progressive _unload : false
} ,
_fn : {
load _node : function ( obj , s _call , e _call ) { var _this = this ; this . load _node _json ( obj , function ( ) { _this . _ _callback ( { "obj" : _this . _get _node ( obj ) } ) ; s _call . call ( this ) ; } , e _call ) ; } ,
_is _loaded : function ( obj ) {
var s = this . _get _settings ( ) . json _data ;
obj = this . _get _node ( obj ) ;
return obj == - 1 || ! obj || ( ! s . ajax && ! s . progressive _render && ! $ . isFunction ( s . data ) ) || obj . is ( ".jstree-open, .jstree-leaf" ) || obj . children ( "ul" ) . children ( "li" ) . length > 0 ;
} ,
refresh : function ( obj ) {
obj = this . _get _node ( obj ) ;
var s = this . _get _settings ( ) . json _data ;
if ( obj && obj !== - 1 && s . progressive _unload && ( $ . isFunction ( s . data ) || ! ! s . ajax ) ) {
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_children" ) ;
2011-03-01 05:37:59 +01:00
}
return this . _ _call _old ( ) ;
} ,
load _node _json : function ( obj , s _call , e _call ) {
var s = this . get _settings ( ) . json _data , d ,
error _func = function ( ) { } ,
success _func = function ( ) { } ;
obj = this . _get _node ( obj ) ;
2011-10-04 12:43:47 +02:00
if ( obj && obj !== - 1 && ( s . progressive _render || s . progressive _unload ) && ! obj . is ( ".jstree-open, .jstree-leaf" ) && obj . children ( "ul" ) . children ( "li" ) . length === 0 && obj . data ( "jstree_children" ) ) {
d = this . _parse _json ( obj . data ( "jstree_children" ) , obj ) ;
2011-03-01 05:37:59 +01:00
if ( d ) {
obj . append ( d ) ;
2011-10-04 12:43:47 +02:00
if ( ! s . progressive _unload ) { obj . removeData ( "jstree_children" ) ; }
2011-03-01 05:37:59 +01:00
}
this . clean _node ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
return ;
}
if ( obj && obj !== - 1 ) {
2011-10-04 12:43:47 +02:00
if ( obj . data ( "jstree_is_loading" ) ) { return ; }
else { obj . data ( "jstree_is_loading" , true ) ; }
2011-03-01 05:37:59 +01:00
}
switch ( ! 0 ) {
case ( ! s . data && ! s . ajax ) : throw "Neither data nor ajax settings supplied." ;
// function option added here for easier model integration (also supporting async - see callback)
case ( $ . isFunction ( s . data ) ) :
s . data . call ( this , obj , $ . proxy ( function ( d ) {
d = this . _parse _json ( d , obj ) ;
if ( ! d ) {
if ( obj === - 1 || ! obj ) {
if ( s . correct _state ) { this . get _container ( ) . children ( "ul" ) . empty ( ) ; }
}
else {
obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ;
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_is_loading" ) ;
2011-03-01 05:37:59 +01:00
if ( s . correct _state ) { this . correct _state ( obj ) ; }
}
if ( e _call ) { e _call . call ( this ) ; }
}
else {
if ( obj === - 1 || ! obj ) { this . get _container ( ) . children ( "ul" ) . empty ( ) . append ( d . children ( ) ) ; }
2011-10-04 12:43:47 +02:00
else { obj . append ( d ) . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ; obj . removeData ( "jstree_is_loading" ) ; }
2011-03-01 05:37:59 +01:00
this . clean _node ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
} , this ) ) ;
break ;
case ( ! ! s . data && ! s . ajax ) || ( ! ! s . data && ! ! s . ajax && ( ! obj || obj === - 1 ) ) :
if ( ! obj || obj == - 1 ) {
d = this . _parse _json ( s . data , obj ) ;
if ( d ) {
this . get _container ( ) . children ( "ul" ) . empty ( ) . append ( d . children ( ) ) ;
this . clean _node ( ) ;
}
else {
if ( s . correct _state ) { this . get _container ( ) . children ( "ul" ) . empty ( ) ; }
}
}
if ( s _call ) { s _call . call ( this ) ; }
break ;
case ( ! s . data && ! ! s . ajax ) || ( ! ! s . data && ! ! s . ajax && obj && obj !== - 1 ) :
error _func = function ( x , t , e ) {
var ef = this . get _settings ( ) . json _data . ajax . error ;
if ( ef ) { ef . call ( this , x , t , e ) ; }
if ( obj != - 1 && obj . length ) {
obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ;
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_is_loading" ) ;
2011-03-01 05:37:59 +01:00
if ( t === "success" && s . correct _state ) { this . correct _state ( obj ) ; }
}
else {
if ( t === "success" && s . correct _state ) { this . get _container ( ) . children ( "ul" ) . empty ( ) ; }
}
if ( e _call ) { e _call . call ( this ) ; }
} ;
success _func = function ( d , t , x ) {
var sf = this . get _settings ( ) . json _data . ajax . success ;
if ( sf ) { d = sf . call ( this , d , t , x ) || d ; }
if ( d === "" || ( d && d . toString && d . toString ( ) . replace ( /^[\s\n]+$/ , "" ) === "" ) || ( ! $ . isArray ( d ) && ! $ . isPlainObject ( d ) ) ) {
return error _func . call ( this , x , t , "" ) ;
}
d = this . _parse _json ( d , obj ) ;
if ( d ) {
if ( obj === - 1 || ! obj ) { this . get _container ( ) . children ( "ul" ) . empty ( ) . append ( d . children ( ) ) ; }
2011-10-04 12:43:47 +02:00
else { obj . append ( d ) . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ; obj . removeData ( "jstree_is_loading" ) ; }
2011-03-01 05:37:59 +01:00
this . clean _node ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
else {
if ( obj === - 1 || ! obj ) {
if ( s . correct _state ) {
this . get _container ( ) . children ( "ul" ) . empty ( ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
else {
obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ;
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_is_loading" ) ;
2011-03-01 05:37:59 +01:00
if ( s . correct _state ) {
this . correct _state ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
}
} ;
s . ajax . context = this ;
s . ajax . error = error _func ;
s . ajax . success = success _func ;
if ( ! s . ajax . dataType ) { s . ajax . dataType = "json" ; }
if ( $ . isFunction ( s . ajax . url ) ) { s . ajax . url = s . ajax . url . call ( this , obj ) ; }
if ( $ . isFunction ( s . ajax . data ) ) { s . ajax . data = s . ajax . data . call ( this , obj ) ; }
$ . ajax ( s . ajax ) ;
break ;
}
} ,
_parse _json : function ( js , obj , is _callback ) {
var d = false ,
p = this . _get _settings ( ) ,
s = p . json _data ,
t = p . core . html _titles ,
tmp , i , j , ul1 , ul2 ;
if ( ! js ) { return d ; }
if ( s . progressive _unload && obj && obj !== - 1 ) {
2011-10-04 12:43:47 +02:00
obj . data ( "jstree_children" , d ) ;
2011-03-01 05:37:59 +01:00
}
if ( $ . isArray ( js ) ) {
d = $ ( ) ;
if ( ! js . length ) { return false ; }
for ( i = 0 , j = js . length ; i < j ; i ++ ) {
tmp = this . _parse _json ( js [ i ] , obj , true ) ;
if ( tmp . length ) { d = d . add ( tmp ) ; }
}
}
else {
if ( typeof js == "string" ) { js = { data : js } ; }
if ( ! js . data && js . data !== "" ) { return d ; }
d = $ ( "<li />" ) ;
if ( js . attr ) { d . attr ( js . attr ) ; }
if ( js . metadata ) { d . data ( js . metadata ) ; }
if ( js . state ) { d . addClass ( "jstree-" + js . state ) ; }
if ( ! $ . isArray ( js . data ) ) { tmp = js . data ; js . data = [ ] ; js . data . push ( tmp ) ; }
$ . each ( js . data , function ( i , m ) {
tmp = $ ( "<a />" ) ;
if ( $ . isFunction ( m ) ) { m = m . call ( this , js ) ; }
if ( typeof m == "string" ) { tmp . attr ( 'href' , '#' ) [ t ? "html" : "text" ] ( m ) ; }
else {
if ( ! m . attr ) { m . attr = { } ; }
if ( ! m . attr . href ) { m . attr . href = '#' ; }
tmp . attr ( m . attr ) [ t ? "html" : "text" ] ( m . title ) ;
if ( m . language ) { tmp . addClass ( m . language ) ; }
}
tmp . prepend ( "<ins class='jstree-icon'> </ins>" ) ;
if ( ! m . icon && js . icon ) { m . icon = js . icon ; }
if ( m . icon ) {
if ( m . icon . indexOf ( "/" ) === - 1 ) { tmp . children ( "ins" ) . addClass ( m . icon ) ; }
else { tmp . children ( "ins" ) . css ( "background" , "url('" + m . icon + "') center center no-repeat" ) ; }
}
d . append ( tmp ) ;
} ) ;
d . prepend ( "<ins class='jstree-icon'> </ins>" ) ;
if ( js . children ) {
if ( s . progressive _render && js . state !== "open" ) {
2011-10-04 12:43:47 +02:00
d . addClass ( "jstree-closed" ) . data ( "jstree_children" , js . children ) ;
2011-03-01 05:37:59 +01:00
}
else {
2011-10-04 12:43:47 +02:00
if ( s . progressive _unload ) { d . data ( "jstree_children" , js . children ) ; }
2011-03-01 05:37:59 +01:00
if ( $ . isArray ( js . children ) && js . children . length ) {
tmp = this . _parse _json ( js . children , obj , true ) ;
if ( tmp . length ) {
ul2 = $ ( "<ul />" ) ;
ul2 . append ( tmp ) ;
d . append ( ul2 ) ;
}
}
}
}
}
if ( ! is _callback ) {
ul1 = $ ( "<ul />" ) ;
ul1 . append ( d ) ;
d = ul1 ;
}
return d ;
} ,
get _json : function ( obj , li _attr , a _attr , is _callback ) {
var result = [ ] ,
s = this . _get _settings ( ) ,
_this = this ,
tmp1 , tmp2 , li , a , t , lang ;
obj = this . _get _node ( obj ) ;
if ( ! obj || obj === - 1 ) { obj = this . get _container ( ) . find ( "> ul > li" ) ; }
li _attr = $ . isArray ( li _attr ) ? li _attr : [ "id" , "class" ] ;
if ( ! is _callback && this . data . types ) { li _attr . push ( s . types . type _attr ) ; }
a _attr = $ . isArray ( a _attr ) ? a _attr : [ ] ;
obj . each ( function ( ) {
li = $ ( this ) ;
tmp1 = { data : [ ] } ;
if ( li _attr . length ) { tmp1 . attr = { } ; }
$ . each ( li _attr , function ( i , v ) {
tmp2 = li . attr ( v ) ;
if ( tmp2 && tmp2 . length && tmp2 . replace ( /jstree[^ ]*/ig , '' ) . length ) {
tmp1 . attr [ v ] = ( " " + tmp2 ) . replace ( / jstree[^ ]*/ig , '' ) . replace ( /\s+$/ig , " " ) . replace ( /^ / , "" ) . replace ( / $/ , "" ) ;
}
} ) ;
if ( li . hasClass ( "jstree-open" ) ) { tmp1 . state = "open" ; }
if ( li . hasClass ( "jstree-closed" ) ) { tmp1 . state = "closed" ; }
if ( li . data ( ) ) { tmp1 . metadata = li . data ( ) ; }
a = li . children ( "a" ) ;
a . each ( function ( ) {
t = $ ( this ) ;
if (
a _attr . length ||
$ . inArray ( "languages" , s . plugins ) !== - 1 ||
t . children ( "ins" ) . get ( 0 ) . style . backgroundImage . length ||
( t . children ( "ins" ) . get ( 0 ) . className && t . children ( "ins" ) . get ( 0 ) . className . replace ( /jstree[^ ]*|$/ig , '' ) . length )
) {
lang = false ;
if ( $ . inArray ( "languages" , s . plugins ) !== - 1 && $ . isArray ( s . languages ) && s . languages . length ) {
$ . each ( s . languages , function ( l , lv ) {
if ( t . hasClass ( lv ) ) {
lang = lv ;
return false ;
}
} ) ;
}
tmp2 = { attr : { } , title : _this . get _text ( t , lang ) } ;
$ . each ( a _attr , function ( k , z ) {
tmp2 . attr [ z ] = ( " " + ( t . attr ( z ) || "" ) ) . replace ( / jstree[^ ]*/ig , '' ) . replace ( /\s+$/ig , " " ) . replace ( /^ / , "" ) . replace ( / $/ , "" ) ;
} ) ;
if ( $ . inArray ( "languages" , s . plugins ) !== - 1 && $ . isArray ( s . languages ) && s . languages . length ) {
$ . each ( s . languages , function ( k , z ) {
if ( t . hasClass ( z ) ) { tmp2 . language = z ; return true ; }
} ) ;
}
if ( t . children ( "ins" ) . get ( 0 ) . className . replace ( /jstree[^ ]*|$/ig , '' ) . replace ( /^\s+$/ig , "" ) . length ) {
tmp2 . icon = t . children ( "ins" ) . get ( 0 ) . className . replace ( /jstree[^ ]*|$/ig , '' ) . replace ( /\s+$/ig , " " ) . replace ( /^ / , "" ) . replace ( / $/ , "" ) ;
}
if ( t . children ( "ins" ) . get ( 0 ) . style . backgroundImage . length ) {
tmp2 . icon = t . children ( "ins" ) . get ( 0 ) . style . backgroundImage . replace ( "url(" , "" ) . replace ( ")" , "" ) ;
}
}
else {
tmp2 = _this . get _text ( t ) ;
}
if ( a . length > 1 ) { tmp1 . data . push ( tmp2 ) ; }
else { tmp1 . data = tmp2 ; }
} ) ;
li = li . find ( "> ul > li" ) ;
if ( li . length ) { tmp1 . children = _this . get _json ( li , li _attr , a _attr , true ) ; }
result . push ( tmp1 ) ;
} ) ;
return result ;
}
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree languages plugin
* Adds support for multiple language versions in one tree
* This basically allows for many titles coexisting in one node , but only one of them being visible at any given time
* This is useful for maintaining the same structure in many languages ( hence the name of the plugin )
* /
( function ( $ ) {
2011-10-04 12:43:47 +02:00
var sh = false ;
2011-03-01 05:37:59 +01:00
$ . jstree . plugin ( "languages" , {
_ _init : function ( ) { this . _load _css ( ) ; } ,
defaults : [ ] ,
_fn : {
set _lang : function ( i ) {
var langs = this . _get _settings ( ) . languages ,
st = false ,
selector = ".jstree-" + this . get _index ( ) + ' a' ;
if ( ! $ . isArray ( langs ) || langs . length === 0 ) { return false ; }
if ( $ . inArray ( i , langs ) == - 1 ) {
if ( ! ! langs [ i ] ) { i = langs [ i ] ; }
else { return false ; }
}
if ( i == this . data . languages . current _language ) { return true ; }
2011-10-04 12:43:47 +02:00
st = $ . vakata . css . get _css ( selector + "." + this . data . languages . current _language , false , sh ) ;
2011-03-01 05:37:59 +01:00
if ( st !== false ) { st . style . display = "none" ; }
2011-10-04 12:43:47 +02:00
st = $ . vakata . css . get _css ( selector + "." + i , false , sh ) ;
2011-03-01 05:37:59 +01:00
if ( st !== false ) { st . style . display = "" ; }
this . data . languages . current _language = i ;
this . _ _callback ( i ) ;
return true ;
} ,
get _lang : function ( ) {
return this . data . languages . current _language ;
} ,
_get _string : function ( key , lang ) {
var langs = this . _get _settings ( ) . languages ,
s = this . _get _settings ( ) . core . strings ;
if ( $ . isArray ( langs ) && langs . length ) {
lang = ( lang && $ . inArray ( lang , langs ) != - 1 ) ? lang : this . data . languages . current _language ;
}
if ( s [ lang ] && s [ lang ] [ key ] ) { return s [ lang ] [ key ] ; }
if ( s [ key ] ) { return s [ key ] ; }
return key ;
} ,
get _text : function ( obj , lang ) {
obj = this . _get _node ( obj ) || this . data . ui . last _selected ;
if ( ! obj . size ( ) ) { return false ; }
var langs = this . _get _settings ( ) . languages ,
s = this . _get _settings ( ) . core . html _titles ;
if ( $ . isArray ( langs ) && langs . length ) {
lang = ( lang && $ . inArray ( lang , langs ) != - 1 ) ? lang : this . data . languages . current _language ;
obj = obj . children ( "a." + lang ) ;
}
else { obj = obj . children ( "a:eq(0)" ) ; }
if ( s ) {
obj = obj . clone ( ) ;
obj . children ( "INS" ) . remove ( ) ;
return obj . html ( ) ;
}
else {
obj = obj . contents ( ) . filter ( function ( ) { return this . nodeType == 3 ; } ) [ 0 ] ;
return obj . nodeValue ;
}
} ,
set _text : function ( obj , val , lang ) {
obj = this . _get _node ( obj ) || this . data . ui . last _selected ;
if ( ! obj . size ( ) ) { return false ; }
var langs = this . _get _settings ( ) . languages ,
s = this . _get _settings ( ) . core . html _titles ,
tmp ;
if ( $ . isArray ( langs ) && langs . length ) {
lang = ( lang && $ . inArray ( lang , langs ) != - 1 ) ? lang : this . data . languages . current _language ;
obj = obj . children ( "a." + lang ) ;
}
else { obj = obj . children ( "a:eq(0)" ) ; }
if ( s ) {
tmp = obj . children ( "INS" ) . clone ( ) ;
obj . html ( val ) . prepend ( tmp ) ;
this . _ _callback ( { "obj" : obj , "name" : val , "lang" : lang } ) ;
return true ;
}
else {
obj = obj . contents ( ) . filter ( function ( ) { return this . nodeType == 3 ; } ) [ 0 ] ;
this . _ _callback ( { "obj" : obj , "name" : val , "lang" : lang } ) ;
return ( obj . nodeValue = val ) ;
}
} ,
_load _css : function ( ) {
var langs = this . _get _settings ( ) . languages ,
str = "/* languages css */" ,
selector = ".jstree-" + this . get _index ( ) + ' a' ,
ln ;
if ( $ . isArray ( langs ) && langs . length ) {
this . data . languages . current _language = langs [ 0 ] ;
for ( ln = 0 ; ln < langs . length ; ln ++ ) {
str += selector + "." + langs [ ln ] + " {" ;
if ( langs [ ln ] != this . data . languages . current _language ) { str += " display:none; " ; }
str += " } " ;
}
2011-10-04 12:43:47 +02:00
sh = $ . vakata . css . add _sheet ( { 'str' : str , 'title' : "jstree-languages" } ) ;
2011-03-01 05:37:59 +01:00
}
} ,
create _node : function ( obj , position , js , callback ) {
var t = this . _ _call _old ( true , obj , position , js , function ( t ) {
var langs = this . _get _settings ( ) . languages ,
a = t . children ( "a" ) ,
ln ;
if ( $ . isArray ( langs ) && langs . length ) {
for ( ln = 0 ; ln < langs . length ; ln ++ ) {
if ( ! a . is ( "." + langs [ ln ] ) ) {
t . append ( a . eq ( 0 ) . clone ( ) . removeClass ( langs . join ( " " ) ) . addClass ( langs [ ln ] ) ) ;
}
}
a . not ( "." + langs . join ( ", ." ) ) . remove ( ) ;
}
if ( callback ) { callback . call ( this , t ) ; }
} ) ;
return t ;
}
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree cookies plugin
* Stores the currently opened / selected nodes in a cookie and then restores them
* Depends on the jquery . cookie plugin
* /
( function ( $ ) {
$ . jstree . plugin ( "cookies" , {
_ _init : function ( ) {
if ( typeof $ . cookie === "undefined" ) { throw "jsTree cookie: jQuery cookie plugin not included." ; }
var s = this . _get _settings ( ) . cookies ,
tmp ;
if ( ! ! s . save _loaded ) {
tmp = $ . cookie ( s . save _loaded ) ;
if ( tmp && tmp . length ) { this . data . core . to _load = tmp . split ( "," ) ; }
}
if ( ! ! s . save _opened ) {
tmp = $ . cookie ( s . save _opened ) ;
if ( tmp && tmp . length ) { this . data . core . to _open = tmp . split ( "," ) ; }
}
if ( ! ! s . save _selected ) {
tmp = $ . cookie ( s . save _selected ) ;
if ( tmp && tmp . length && this . data . ui ) { this . data . ui . to _select = tmp . split ( "," ) ; }
}
this . get _container ( )
. one ( ( this . data . ui ? "reselect" : "reopen" ) + ".jstree" , $ . proxy ( function ( ) {
this . get _container ( )
. bind ( "open_node.jstree close_node.jstree select_node.jstree deselect_node.jstree" , $ . proxy ( function ( e ) {
if ( this . _get _settings ( ) . cookies . auto _save ) { this . save _cookie ( ( e . handleObj . namespace + e . handleObj . type ) . replace ( "jstree" , "" ) ) ; }
} , this ) ) ;
} , this ) ) ;
} ,
defaults : {
save _loaded : "jstree_load" ,
save _opened : "jstree_open" ,
save _selected : "jstree_select" ,
auto _save : true ,
cookie _options : { }
} ,
_fn : {
save _cookie : function ( c ) {
if ( this . data . core . refreshing ) { return ; }
var s = this . _get _settings ( ) . cookies ;
if ( ! c ) { // if called manually and not by event
if ( s . save _loaded ) {
this . save _loaded ( ) ;
$ . cookie ( s . save _loaded , this . data . core . to _load . join ( "," ) , s . cookie _options ) ;
}
if ( s . save _opened ) {
this . save _opened ( ) ;
$ . cookie ( s . save _opened , this . data . core . to _open . join ( "," ) , s . cookie _options ) ;
}
if ( s . save _selected && this . data . ui ) {
this . save _selected ( ) ;
$ . cookie ( s . save _selected , this . data . ui . to _select . join ( "," ) , s . cookie _options ) ;
}
return ;
}
switch ( c ) {
case "open_node" :
case "close_node" :
if ( ! ! s . save _opened ) {
this . save _opened ( ) ;
$ . cookie ( s . save _opened , this . data . core . to _open . join ( "," ) , s . cookie _options ) ;
}
if ( ! ! s . save _loaded ) {
this . save _loaded ( ) ;
$ . cookie ( s . save _loaded , this . data . core . to _load . join ( "," ) , s . cookie _options ) ;
}
break ;
case "select_node" :
case "deselect_node" :
if ( ! ! s . save _selected && this . data . ui ) {
this . save _selected ( ) ;
$ . cookie ( s . save _selected , this . data . ui . to _select . join ( "," ) , s . cookie _options ) ;
}
break ;
}
}
}
} ) ;
// include cookies by default
// $.jstree.defaults.plugins.push("cookies");
} ) ( jQuery ) ;
//*/
/ *
* jsTree sort plugin
* Sorts items alphabetically ( or using any other function )
* /
( function ( $ ) {
$ . jstree . plugin ( "sort" , {
_ _init : function ( ) {
this . get _container ( )
. bind ( "load_node.jstree" , $ . proxy ( function ( e , data ) {
var obj = this . _get _node ( data . rslt . obj ) ;
obj = obj === - 1 ? this . get _container ( ) . children ( "ul" ) : obj . children ( "ul" ) ;
this . sort ( obj ) ;
} , this ) )
. bind ( "rename_node.jstree create_node.jstree create.jstree" , $ . proxy ( function ( e , data ) {
this . sort ( data . rslt . obj . parent ( ) ) ;
} , this ) )
. bind ( "move_node.jstree" , $ . proxy ( function ( e , data ) {
var m = data . rslt . np == - 1 ? this . get _container ( ) : data . rslt . np ;
this . sort ( m . children ( "ul" ) ) ;
} , this ) ) ;
} ,
defaults : function ( a , b ) { return this . get _text ( a ) > this . get _text ( b ) ? 1 : - 1 ; } ,
_fn : {
sort : function ( obj ) {
var s = this . _get _settings ( ) . sort ,
t = this ;
obj . append ( $ . makeArray ( obj . children ( "li" ) ) . sort ( $ . proxy ( s , t ) ) ) ;
obj . find ( "> li > ul" ) . each ( function ( ) { t . sort ( $ ( this ) ) ; } ) ;
this . clean _node ( obj ) ;
}
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree DND plugin
* Drag and drop plugin for moving / copying nodes
* /
( function ( $ ) {
var o = false ,
r = false ,
m = false ,
ml = false ,
sli = false ,
sti = false ,
dir1 = false ,
dir2 = false ,
last _pos = false ;
$ . vakata . dnd = {
is _down : false ,
is _drag : false ,
helper : false ,
scroll _spd : 10 ,
init _x : 0 ,
init _y : 0 ,
threshold : 5 ,
helper _left : 5 ,
helper _top : 10 ,
user _data : { } ,
drag _start : function ( e , data , html ) {
if ( $ . vakata . dnd . is _drag ) { $ . vakata . drag _stop ( { } ) ; }
try {
e . currentTarget . unselectable = "on" ;
e . currentTarget . onselectstart = function ( ) { return false ; } ;
if ( e . currentTarget . style ) { e . currentTarget . style . MozUserSelect = "none" ; }
} catch ( err ) { }
$ . vakata . dnd . init _x = e . pageX ;
$ . vakata . dnd . init _y = e . pageY ;
$ . vakata . dnd . user _data = data ;
$ . vakata . dnd . is _down = true ;
$ . vakata . dnd . helper = $ ( "<div id='vakata-dragged' />" ) . html ( html ) ; //.fadeTo(10,0.25);
$ ( document ) . bind ( "mousemove" , $ . vakata . dnd . drag ) ;
$ ( document ) . bind ( "mouseup" , $ . vakata . dnd . drag _stop ) ;
return false ;
} ,
drag : function ( e ) {
if ( ! $ . vakata . dnd . is _down ) { return ; }
if ( ! $ . vakata . dnd . is _drag ) {
if ( Math . abs ( e . pageX - $ . vakata . dnd . init _x ) > 5 || Math . abs ( e . pageY - $ . vakata . dnd . init _y ) > 5 ) {
$ . vakata . dnd . helper . appendTo ( "body" ) ;
$ . vakata . dnd . is _drag = true ;
$ ( document ) . triggerHandler ( "drag_start.vakata" , { "event" : e , "data" : $ . vakata . dnd . user _data } ) ;
}
else { return ; }
}
// maybe use a scrolling parent element instead of document?
if ( e . type === "mousemove" ) { // thought of adding scroll in order to move the helper, but mouse poisition is n/a
var d = $ ( document ) , t = d . scrollTop ( ) , l = d . scrollLeft ( ) ;
if ( e . pageY - t < 20 ) {
if ( sti && dir1 === "down" ) { clearInterval ( sti ) ; sti = false ; }
if ( ! sti ) { dir1 = "up" ; sti = setInterval ( function ( ) { $ ( document ) . scrollTop ( $ ( document ) . scrollTop ( ) - $ . vakata . dnd . scroll _spd ) ; } , 150 ) ; }
}
else {
if ( sti && dir1 === "up" ) { clearInterval ( sti ) ; sti = false ; }
}
if ( $ ( window ) . height ( ) - ( e . pageY - t ) < 20 ) {
if ( sti && dir1 === "up" ) { clearInterval ( sti ) ; sti = false ; }
if ( ! sti ) { dir1 = "down" ; sti = setInterval ( function ( ) { $ ( document ) . scrollTop ( $ ( document ) . scrollTop ( ) + $ . vakata . dnd . scroll _spd ) ; } , 150 ) ; }
}
else {
if ( sti && dir1 === "down" ) { clearInterval ( sti ) ; sti = false ; }
}
if ( e . pageX - l < 20 ) {
if ( sli && dir2 === "right" ) { clearInterval ( sli ) ; sli = false ; }
if ( ! sli ) { dir2 = "left" ; sli = setInterval ( function ( ) { $ ( document ) . scrollLeft ( $ ( document ) . scrollLeft ( ) - $ . vakata . dnd . scroll _spd ) ; } , 150 ) ; }
}
else {
if ( sli && dir2 === "left" ) { clearInterval ( sli ) ; sli = false ; }
}
if ( $ ( window ) . width ( ) - ( e . pageX - l ) < 20 ) {
if ( sli && dir2 === "left" ) { clearInterval ( sli ) ; sli = false ; }
if ( ! sli ) { dir2 = "right" ; sli = setInterval ( function ( ) { $ ( document ) . scrollLeft ( $ ( document ) . scrollLeft ( ) + $ . vakata . dnd . scroll _spd ) ; } , 150 ) ; }
}
else {
if ( sli && dir2 === "right" ) { clearInterval ( sli ) ; sli = false ; }
}
}
$ . vakata . dnd . helper . css ( { left : ( e . pageX + $ . vakata . dnd . helper _left ) + "px" , top : ( e . pageY + $ . vakata . dnd . helper _top ) + "px" } ) ;
$ ( document ) . triggerHandler ( "drag.vakata" , { "event" : e , "data" : $ . vakata . dnd . user _data } ) ;
} ,
drag _stop : function ( e ) {
if ( sli ) { clearInterval ( sli ) ; }
if ( sti ) { clearInterval ( sti ) ; }
$ ( document ) . unbind ( "mousemove" , $ . vakata . dnd . drag ) ;
$ ( document ) . unbind ( "mouseup" , $ . vakata . dnd . drag _stop ) ;
$ ( document ) . triggerHandler ( "drag_stop.vakata" , { "event" : e , "data" : $ . vakata . dnd . user _data } ) ;
$ . vakata . dnd . helper . remove ( ) ;
$ . vakata . dnd . init _x = 0 ;
$ . vakata . dnd . init _y = 0 ;
$ . vakata . dnd . user _data = { } ;
$ . vakata . dnd . is _down = false ;
$ . vakata . dnd . is _drag = false ;
}
} ;
$ ( function ( ) {
var css _string = '#vakata-dragged { display:block; margin:0 0 0 0; padding:4px 4px 4px 24px; position:absolute; top:-2000px; line-height:16px; z-index:10000; } ' ;
$ . vakata . css . add _sheet ( { str : css _string , title : "vakata" } ) ;
} ) ;
$ . jstree . plugin ( "dnd" , {
_ _init : function ( ) {
this . data . dnd = {
active : false ,
after : false ,
inside : false ,
before : false ,
off : false ,
prepared : false ,
w : 0 ,
to1 : false ,
to2 : false ,
cof : false ,
cw : false ,
ch : false ,
i1 : false ,
i2 : false ,
mto : false
} ;
this . get _container ( )
. bind ( "mouseenter.jstree" , $ . proxy ( function ( e ) {
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree ) {
if ( this . data . themes ) {
m . attr ( "class" , "jstree-" + this . data . themes . theme ) ;
if ( ml ) { ml . attr ( "class" , "jstree-" + this . data . themes . theme ) ; }
$ . vakata . dnd . helper . attr ( "class" , "jstree-dnd-helper jstree-" + this . data . themes . theme ) ;
}
//if($(e.currentTarget).find("> ul > li").length === 0) {
if ( e . currentTarget === e . target && $ . vakata . dnd . user _data . obj && $ ( $ . vakata . dnd . user _data . obj ) . length && $ ( $ . vakata . dnd . user _data . obj ) . parents ( ".jstree:eq(0)" ) [ 0 ] !== e . target ) { // node should not be from the same tree
var tr = $ . jstree . _reference ( e . target ) , dc ;
if ( tr . data . dnd . foreign ) {
dc = tr . _get _settings ( ) . dnd . drag _check . call ( this , { "o" : o , "r" : tr . get _container ( ) , is _root : true } ) ;
if ( dc === true || dc . inside === true || dc . before === true || dc . after === true ) {
$ . vakata . dnd . helper . children ( "ins" ) . attr ( "class" , "jstree-ok" ) ;
}
}
else {
tr . prepare _move ( o , tr . get _container ( ) , "last" ) ;
if ( tr . check _move ( ) ) {
$ . vakata . dnd . helper . children ( "ins" ) . attr ( "class" , "jstree-ok" ) ;
}
}
}
}
} , this ) )
. bind ( "mouseup.jstree" , $ . proxy ( function ( e ) {
//if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && $(e.currentTarget).find("> ul > li").length === 0) {
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree && e . currentTarget === e . target && $ . vakata . dnd . user _data . obj && $ ( $ . vakata . dnd . user _data . obj ) . length && $ ( $ . vakata . dnd . user _data . obj ) . parents ( ".jstree:eq(0)" ) [ 0 ] !== e . target ) { // node should not be from the same tree
var tr = $ . jstree . _reference ( e . currentTarget ) , dc ;
if ( tr . data . dnd . foreign ) {
dc = tr . _get _settings ( ) . dnd . drag _check . call ( this , { "o" : o , "r" : tr . get _container ( ) , is _root : true } ) ;
if ( dc === true || dc . inside === true || dc . before === true || dc . after === true ) {
tr . _get _settings ( ) . dnd . drag _finish . call ( this , { "o" : o , "r" : tr . get _container ( ) , is _root : true } ) ;
}
}
else {
tr . move _node ( o , tr . get _container ( ) , "last" , e [ tr . _get _settings ( ) . dnd . copy _modifier + "Key" ] ) ;
}
}
} , this ) )
. bind ( "mouseleave.jstree" , $ . proxy ( function ( e ) {
if ( e . relatedTarget && e . relatedTarget . id && e . relatedTarget . id === "jstree-marker-line" ) {
return false ;
}
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree ) {
if ( this . data . dnd . i1 ) { clearInterval ( this . data . dnd . i1 ) ; }
if ( this . data . dnd . i2 ) { clearInterval ( this . data . dnd . i2 ) ; }
if ( this . data . dnd . to1 ) { clearTimeout ( this . data . dnd . to1 ) ; }
if ( this . data . dnd . to2 ) { clearTimeout ( this . data . dnd . to2 ) ; }
if ( $ . vakata . dnd . helper . children ( "ins" ) . hasClass ( "jstree-ok" ) ) {
$ . vakata . dnd . helper . children ( "ins" ) . attr ( "class" , "jstree-invalid" ) ;
}
}
} , this ) )
. bind ( "mousemove.jstree" , $ . proxy ( function ( e ) {
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree ) {
var cnt = this . get _container ( ) [ 0 ] ;
// Horizontal scroll
if ( e . pageX + 24 > this . data . dnd . cof . left + this . data . dnd . cw ) {
if ( this . data . dnd . i1 ) { clearInterval ( this . data . dnd . i1 ) ; }
this . data . dnd . i1 = setInterval ( $ . proxy ( function ( ) { this . scrollLeft += $ . vakata . dnd . scroll _spd ; } , cnt ) , 100 ) ;
}
else if ( e . pageX - 24 < this . data . dnd . cof . left ) {
if ( this . data . dnd . i1 ) { clearInterval ( this . data . dnd . i1 ) ; }
this . data . dnd . i1 = setInterval ( $ . proxy ( function ( ) { this . scrollLeft -= $ . vakata . dnd . scroll _spd ; } , cnt ) , 100 ) ;
}
else {
if ( this . data . dnd . i1 ) { clearInterval ( this . data . dnd . i1 ) ; }
}
// Vertical scroll
if ( e . pageY + 24 > this . data . dnd . cof . top + this . data . dnd . ch ) {
if ( this . data . dnd . i2 ) { clearInterval ( this . data . dnd . i2 ) ; }
this . data . dnd . i2 = setInterval ( $ . proxy ( function ( ) { this . scrollTop += $ . vakata . dnd . scroll _spd ; } , cnt ) , 100 ) ;
}
else if ( e . pageY - 24 < this . data . dnd . cof . top ) {
if ( this . data . dnd . i2 ) { clearInterval ( this . data . dnd . i2 ) ; }
this . data . dnd . i2 = setInterval ( $ . proxy ( function ( ) { this . scrollTop -= $ . vakata . dnd . scroll _spd ; } , cnt ) , 100 ) ;
}
else {
if ( this . data . dnd . i2 ) { clearInterval ( this . data . dnd . i2 ) ; }
}
}
} , this ) )
. bind ( "scroll.jstree" , $ . proxy ( function ( e ) {
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree && m && ml ) {
m . hide ( ) ;
ml . hide ( ) ;
}
} , this ) )
. delegate ( "a" , "mousedown.jstree" , $ . proxy ( function ( e ) {
if ( e . which === 1 ) {
this . start _drag ( e . currentTarget , e ) ;
return false ;
}
} , this ) )
. delegate ( "a" , "mouseenter.jstree" , $ . proxy ( function ( e ) {
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree ) {
this . dnd _enter ( e . currentTarget ) ;
}
} , this ) )
. delegate ( "a" , "mousemove.jstree" , $ . proxy ( function ( e ) {
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree ) {
if ( ! r || ! r . length || r . children ( "a" ) [ 0 ] !== e . currentTarget ) {
this . dnd _enter ( e . currentTarget ) ;
}
if ( typeof this . data . dnd . off . top === "undefined" ) { this . data . dnd . off = $ ( e . target ) . offset ( ) ; }
this . data . dnd . w = ( e . pageY - ( this . data . dnd . off . top || 0 ) ) % this . data . core . li _height ;
if ( this . data . dnd . w < 0 ) { this . data . dnd . w += this . data . core . li _height ; }
this . dnd _show ( ) ;
}
} , this ) )
. delegate ( "a" , "mouseleave.jstree" , $ . proxy ( function ( e ) {
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree ) {
if ( e . relatedTarget && e . relatedTarget . id && e . relatedTarget . id === "jstree-marker-line" ) {
return false ;
}
if ( m ) { m . hide ( ) ; }
if ( ml ) { ml . hide ( ) ; }
/ *
var ec = $ ( e . currentTarget ) . closest ( "li" ) ,
er = $ ( e . relatedTarget ) . closest ( "li" ) ;
if ( er [ 0 ] !== ec . prev ( ) [ 0 ] && er [ 0 ] !== ec . next ( ) [ 0 ] ) {
if ( m ) { m . hide ( ) ; }
if ( ml ) { ml . hide ( ) ; }
}
* /
this . data . dnd . mto = setTimeout (
( function ( t ) { return function ( ) { t . dnd _leave ( e ) ; } ; } ) ( this ) ,
0 ) ;
}
} , this ) )
2016-01-02 22:29:58 +01:00
. delegate ( "a, #jstree-marker-line" , "mouseup.jstree" , $ . proxy ( function ( e ) {
2011-03-01 05:37:59 +01:00
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree ) {
this . dnd _finish ( e ) ;
}
} , this ) ) ;
$ ( document )
. bind ( "drag_stop.vakata" , $ . proxy ( function ( ) {
if ( this . data . dnd . to1 ) { clearTimeout ( this . data . dnd . to1 ) ; }
if ( this . data . dnd . to2 ) { clearTimeout ( this . data . dnd . to2 ) ; }
if ( this . data . dnd . i1 ) { clearInterval ( this . data . dnd . i1 ) ; }
if ( this . data . dnd . i2 ) { clearInterval ( this . data . dnd . i2 ) ; }
this . data . dnd . after = false ;
this . data . dnd . before = false ;
this . data . dnd . inside = false ;
this . data . dnd . off = false ;
this . data . dnd . prepared = false ;
this . data . dnd . w = false ;
this . data . dnd . to1 = false ;
this . data . dnd . to2 = false ;
this . data . dnd . i1 = false ;
this . data . dnd . i2 = false ;
this . data . dnd . active = false ;
this . data . dnd . foreign = false ;
if ( m ) { m . css ( { "top" : "-2000px" } ) ; }
if ( ml ) { ml . css ( { "top" : "-2000px" } ) ; }
} , this ) )
. bind ( "drag_start.vakata" , $ . proxy ( function ( e , data ) {
if ( data . data . jstree ) {
var et = $ ( data . event . target ) ;
if ( et . closest ( ".jstree" ) . hasClass ( "jstree-" + this . get _index ( ) ) ) {
this . dnd _enter ( et ) ;
}
}
} , this ) ) ;
/ *
. bind ( "keydown.jstree-" + this . get _index ( ) + " keyup.jstree-" + this . get _index ( ) , $ . proxy ( function ( e ) {
if ( $ . vakata . dnd . is _drag && $ . vakata . dnd . user _data . jstree && ! this . data . dnd . foreign ) {
var h = $ . vakata . dnd . helper . children ( "ins" ) ;
if ( e [ this . _get _settings ( ) . dnd . copy _modifier + "Key" ] && h . hasClass ( "jstree-ok" ) ) {
h . parent ( ) . html ( h . parent ( ) . html ( ) . replace ( / \(Copy\)$/ , "" ) + " (Copy)" ) ;
}
else {
h . parent ( ) . html ( h . parent ( ) . html ( ) . replace ( / \(Copy\)$/ , "" ) ) ;
}
}
} , this ) ) ; * /
var s = this . _get _settings ( ) . dnd ;
if ( s . drag _target ) {
$ ( document )
. delegate ( s . drag _target , "mousedown.jstree-" + this . get _index ( ) , $ . proxy ( function ( e ) {
o = e . target ;
$ . vakata . dnd . drag _start ( e , { jstree : true , obj : e . target } , "<ins class='jstree-icon'></ins>" + $ ( e . target ) . text ( ) ) ;
if ( this . data . themes ) {
if ( m ) { m . attr ( "class" , "jstree-" + this . data . themes . theme ) ; }
if ( ml ) { ml . attr ( "class" , "jstree-" + this . data . themes . theme ) ; }
$ . vakata . dnd . helper . attr ( "class" , "jstree-dnd-helper jstree-" + this . data . themes . theme ) ;
}
$ . vakata . dnd . helper . children ( "ins" ) . attr ( "class" , "jstree-invalid" ) ;
var cnt = this . get _container ( ) ;
this . data . dnd . cof = cnt . offset ( ) ;
this . data . dnd . cw = parseInt ( cnt . width ( ) , 10 ) ;
this . data . dnd . ch = parseInt ( cnt . height ( ) , 10 ) ;
this . data . dnd . foreign = true ;
e . preventDefault ( ) ;
} , this ) ) ;
}
if ( s . drop _target ) {
$ ( document )
. delegate ( s . drop _target , "mouseenter.jstree-" + this . get _index ( ) , $ . proxy ( function ( e ) {
if ( this . data . dnd . active && this . _get _settings ( ) . dnd . drop _check . call ( this , { "o" : o , "r" : $ ( e . target ) , "e" : e } ) ) {
$ . vakata . dnd . helper . children ( "ins" ) . attr ( "class" , "jstree-ok" ) ;
}
} , this ) )
. delegate ( s . drop _target , "mouseleave.jstree-" + this . get _index ( ) , $ . proxy ( function ( e ) {
if ( this . data . dnd . active ) {
$ . vakata . dnd . helper . children ( "ins" ) . attr ( "class" , "jstree-invalid" ) ;
}
} , this ) )
2016-01-02 22:29:58 +01:00
. delegate ( s . drop _target + ", #jstree-marker-line" , "mouseup.jstree-" + this . get _index ( ) , $ . proxy ( function ( e ) {
2011-03-01 05:37:59 +01:00
if ( this . data . dnd . active && $ . vakata . dnd . helper . children ( "ins" ) . hasClass ( "jstree-ok" ) ) {
this . _get _settings ( ) . dnd . drop _finish . call ( this , { "o" : o , "r" : $ ( e . target ) , "e" : e } ) ;
}
} , this ) ) ;
}
} ,
defaults : {
copy _modifier : "ctrl" ,
check _timeout : 100 ,
open _timeout : 500 ,
drop _target : ".jstree-drop" ,
drop _check : function ( data ) { return true ; } ,
drop _finish : $ . noop ,
drag _target : ".jstree-draggable" ,
drag _finish : $ . noop ,
drag _check : function ( data ) { return { after : false , before : false , inside : true } ; }
} ,
2012-06-14 18:11:51 +02:00
_ _destroy : function ( ) {
// unbind global event handlers when last instance is removed
// (no access to private 'instances' variable from here)
if ( $ ( '.jstree' ) . length <= 1 ) {
$ ( document )
. unbind ( "drag_start.vakata" )
. unbind ( "drag_stop.vakata" ) ;
}
2013-08-20 06:07:54 +02:00
o = false ;
2012-06-14 18:11:51 +02:00
} ,
2011-03-01 05:37:59 +01:00
_fn : {
dnd _prepare : function ( ) {
if ( ! r || ! r . length ) { return ; }
this . data . dnd . off = r . offset ( ) ;
if ( this . _get _settings ( ) . core . rtl ) {
this . data . dnd . off . right = this . data . dnd . off . left + r . width ( ) ;
}
if ( this . data . dnd . foreign ) {
var a = this . _get _settings ( ) . dnd . drag _check . call ( this , { "o" : o , "r" : r } ) ;
this . data . dnd . after = a . after ;
this . data . dnd . before = a . before ;
this . data . dnd . inside = a . inside ;
this . data . dnd . prepared = true ;
return this . dnd _show ( ) ;
}
this . prepare _move ( o , r , "before" ) ;
this . data . dnd . before = this . check _move ( ) ;
this . prepare _move ( o , r , "after" ) ;
this . data . dnd . after = this . check _move ( ) ;
if ( this . _is _loaded ( r ) ) {
this . prepare _move ( o , r , "inside" ) ;
this . data . dnd . inside = this . check _move ( ) ;
}
else {
this . data . dnd . inside = false ;
}
this . data . dnd . prepared = true ;
return this . dnd _show ( ) ;
} ,
dnd _show : function ( ) {
if ( ! this . data . dnd . prepared ) { return ; }
var o = [ "before" , "inside" , "after" ] ,
r = false ,
rtl = this . _get _settings ( ) . core . rtl ,
pos ;
if ( this . data . dnd . w < this . data . core . li _height / 3 ) { o = [ "before" , "inside" , "after" ] ; }
else if ( this . data . dnd . w <= this . data . core . li _height * 2 / 3 ) {
o = this . data . dnd . w < this . data . core . li _height / 2 ? [ "inside" , "before" , "after" ] : [ "inside" , "after" , "before" ] ;
}
else { o = [ "after" , "inside" , "before" ] ; }
$ . each ( o , $ . proxy ( function ( i , val ) {
if ( this . data . dnd [ val ] ) {
$ . vakata . dnd . helper . children ( "ins" ) . attr ( "class" , "jstree-ok" ) ;
r = val ;
return false ;
}
} , this ) ) ;
if ( r === false ) { $ . vakata . dnd . helper . children ( "ins" ) . attr ( "class" , "jstree-invalid" ) ; }
pos = rtl ? ( this . data . dnd . off . right - 18 ) : ( this . data . dnd . off . left + 10 ) ;
switch ( r ) {
case "before" :
m . css ( { "left" : pos + "px" , "top" : ( this . data . dnd . off . top - 6 ) + "px" } ) . show ( ) ;
if ( ml ) { ml . css ( { "left" : ( pos + 8 ) + "px" , "top" : ( this . data . dnd . off . top - 1 ) + "px" } ) . show ( ) ; }
break ;
case "after" :
m . css ( { "left" : pos + "px" , "top" : ( this . data . dnd . off . top + this . data . core . li _height - 6 ) + "px" } ) . show ( ) ;
if ( ml ) { ml . css ( { "left" : ( pos + 8 ) + "px" , "top" : ( this . data . dnd . off . top + this . data . core . li _height - 1 ) + "px" } ) . show ( ) ; }
break ;
case "inside" :
m . css ( { "left" : pos + ( rtl ? - 4 : 4 ) + "px" , "top" : ( this . data . dnd . off . top + this . data . core . li _height / 2 - 5 ) + "px" } ) . show ( ) ;
if ( ml ) { ml . hide ( ) ; }
break ;
default :
m . hide ( ) ;
if ( ml ) { ml . hide ( ) ; }
break ;
}
last _pos = r ;
return r ;
} ,
dnd _open : function ( ) {
this . data . dnd . to2 = false ;
this . open _node ( r , $ . proxy ( this . dnd _prepare , this ) , true ) ;
} ,
dnd _finish : function ( e ) {
if ( this . data . dnd . foreign ) {
if ( this . data . dnd . after || this . data . dnd . before || this . data . dnd . inside ) {
this . _get _settings ( ) . dnd . drag _finish . call ( this , { "o" : o , "r" : r , "p" : last _pos } ) ;
}
}
else {
this . dnd _prepare ( ) ;
this . move _node ( o , r , last _pos , e [ this . _get _settings ( ) . dnd . copy _modifier + "Key" ] ) ;
}
o = false ;
r = false ;
m . hide ( ) ;
if ( ml ) { ml . hide ( ) ; }
} ,
dnd _enter : function ( obj ) {
if ( this . data . dnd . mto ) {
clearTimeout ( this . data . dnd . mto ) ;
this . data . dnd . mto = false ;
}
var s = this . _get _settings ( ) . dnd ;
this . data . dnd . prepared = false ;
r = this . _get _node ( obj ) ;
if ( s . check _timeout ) {
// do the calculations after a minimal timeout (users tend to drag quickly to the desired location)
if ( this . data . dnd . to1 ) { clearTimeout ( this . data . dnd . to1 ) ; }
this . data . dnd . to1 = setTimeout ( $ . proxy ( this . dnd _prepare , this ) , s . check _timeout ) ;
}
else {
this . dnd _prepare ( ) ;
}
if ( s . open _timeout ) {
if ( this . data . dnd . to2 ) { clearTimeout ( this . data . dnd . to2 ) ; }
if ( r && r . length && r . hasClass ( "jstree-closed" ) ) {
// if the node is closed - open it, then recalculate
this . data . dnd . to2 = setTimeout ( $ . proxy ( this . dnd _open , this ) , s . open _timeout ) ;
}
}
else {
if ( r && r . length && r . hasClass ( "jstree-closed" ) ) {
this . dnd _open ( ) ;
}
}
} ,
dnd _leave : function ( e ) {
this . data . dnd . after = false ;
this . data . dnd . before = false ;
this . data . dnd . inside = false ;
$ . vakata . dnd . helper . children ( "ins" ) . attr ( "class" , "jstree-invalid" ) ;
m . hide ( ) ;
if ( ml ) { ml . hide ( ) ; }
if ( r && r [ 0 ] === e . target . parentNode ) {
if ( this . data . dnd . to1 ) {
clearTimeout ( this . data . dnd . to1 ) ;
this . data . dnd . to1 = false ;
}
if ( this . data . dnd . to2 ) {
clearTimeout ( this . data . dnd . to2 ) ;
this . data . dnd . to2 = false ;
}
}
} ,
start _drag : function ( obj , e ) {
o = this . _get _node ( obj ) ;
if ( this . data . ui && this . is _selected ( o ) ) { o = this . _get _node ( null , true ) ; }
var dt = o . length > 1 ? this . _get _string ( "multiple_selection" ) : this . get _text ( o ) ,
cnt = this . get _container ( ) ;
if ( ! this . _get _settings ( ) . core . html _titles ) { dt = dt . replace ( /</ig , "<" ) . replace ( />/ig , ">" ) ; }
$ . vakata . dnd . drag _start ( e , { jstree : true , obj : o } , "<ins class='jstree-icon'></ins>" + dt ) ;
if ( this . data . themes ) {
if ( m ) { m . attr ( "class" , "jstree-" + this . data . themes . theme ) ; }
if ( ml ) { ml . attr ( "class" , "jstree-" + this . data . themes . theme ) ; }
$ . vakata . dnd . helper . attr ( "class" , "jstree-dnd-helper jstree-" + this . data . themes . theme ) ;
}
this . data . dnd . cof = cnt . offset ( ) ;
this . data . dnd . cw = parseInt ( cnt . width ( ) , 10 ) ;
this . data . dnd . ch = parseInt ( cnt . height ( ) , 10 ) ;
this . data . dnd . active = true ;
}
}
} ) ;
$ ( function ( ) {
var css _string = '' +
'#vakata-dragged ins { display:block; text-decoration:none; width:16px; height:16px; margin:0 0 0 0; padding:0; position:absolute; top:4px; left:4px; ' +
' -moz-border-radius:4px; border-radius:4px; -webkit-border-radius:4px; ' +
'} ' +
'#vakata-dragged .jstree-ok { background:green; } ' +
'#vakata-dragged .jstree-invalid { background:red; } ' +
'#jstree-marker { padding:0; margin:0; font-size:12px; overflow:hidden; height:12px; width:8px; position:absolute; top:-30px; z-index:10001; background-repeat:no-repeat; display:none; background-color:transparent; text-shadow:1px 1px 1px white; color:black; line-height:10px; } ' +
'#jstree-marker-line { padding:0; margin:0; line-height:0%; font-size:1px; overflow:hidden; height:1px; width:100px; position:absolute; top:-30px; z-index:10000; background-repeat:no-repeat; display:none; background-color:#456c43; ' +
' cursor:pointer; border:1px solid #eeeeee; border-left:0; -moz-box-shadow: 0px 0px 2px #666; -webkit-box-shadow: 0px 0px 2px #666; box-shadow: 0px 0px 2px #666; ' +
' -moz-border-radius:1px; border-radius:1px; -webkit-border-radius:1px; ' +
'}' +
'' ;
$ . vakata . css . add _sheet ( { str : css _string , title : "jstree" } ) ;
m = $ ( "<div />" ) . attr ( { id : "jstree-marker" } ) . hide ( ) . html ( "»" )
. bind ( "mouseleave mouseenter" , function ( e ) {
m . hide ( ) ;
ml . hide ( ) ;
e . preventDefault ( ) ;
e . stopImmediatePropagation ( ) ;
return false ;
} )
. appendTo ( "body" ) ;
ml = $ ( "<div />" ) . attr ( { id : "jstree-marker-line" } ) . hide ( )
. bind ( "mouseup" , function ( e ) {
if ( r && r . length ) {
r . children ( "a" ) . trigger ( e ) ;
e . preventDefault ( ) ;
e . stopImmediatePropagation ( ) ;
return false ;
}
} )
. bind ( "mouseleave" , function ( e ) {
var rt = $ ( e . relatedTarget ) ;
if ( rt . is ( ".jstree" ) || rt . closest ( ".jstree" ) . length === 0 ) {
if ( r && r . length ) {
r . children ( "a" ) . trigger ( e ) ;
m . hide ( ) ;
ml . hide ( ) ;
e . preventDefault ( ) ;
e . stopImmediatePropagation ( ) ;
return false ;
}
}
} )
. appendTo ( "body" ) ;
$ ( document ) . bind ( "drag_start.vakata" , function ( e , data ) {
if ( data . data . jstree ) { m . show ( ) ; if ( ml ) { ml . show ( ) ; } }
} ) ;
$ ( document ) . bind ( "drag_stop.vakata" , function ( e , data ) {
if ( data . data . jstree ) { m . hide ( ) ; if ( ml ) { ml . hide ( ) ; } }
} ) ;
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree checkbox plugin
* Inserts checkboxes in front of every node
* Depends on the ui plugin
* DOES NOT WORK NICELY WITH MULTITREE DRAG 'N' DROP
* /
( function ( $ ) {
$ . jstree . plugin ( "checkbox" , {
_ _init : function ( ) {
this . data . checkbox . noui = this . _get _settings ( ) . checkbox . override _ui ;
if ( this . data . ui && this . data . checkbox . noui ) {
this . select _node = this . deselect _node = this . deselect _all = $ . noop ;
this . get _selected = this . get _checked ;
}
this . get _container ( )
. bind ( "open_node.jstree create_node.jstree clean_node.jstree refresh.jstree" , $ . proxy ( function ( e , data ) {
this . _prepare _checkboxes ( data . rslt . obj ) ;
} , this ) )
. bind ( "loaded.jstree" , $ . proxy ( function ( e ) {
this . _prepare _checkboxes ( ) ;
} , this ) )
. delegate ( ( this . data . ui && this . data . checkbox . noui ? "a" : "ins.jstree-checkbox" ) , "click.jstree" , $ . proxy ( function ( e ) {
e . preventDefault ( ) ;
if ( this . _get _node ( e . target ) . hasClass ( "jstree-checked" ) ) { this . uncheck _node ( e . target ) ; }
else { this . check _node ( e . target ) ; }
if ( this . data . ui && this . data . checkbox . noui ) {
this . save _selected ( ) ;
if ( this . data . cookies ) { this . save _cookie ( "select_node" ) ; }
}
else {
e . stopImmediatePropagation ( ) ;
return false ;
}
} , this ) ) ;
} ,
defaults : {
override _ui : false ,
two _state : false ,
real _checkboxes : false ,
checked _parent _open : true ,
real _checkboxes _names : function ( n ) { return [ ( "check_" + ( n [ 0 ] . id || Math . ceil ( Math . random ( ) * 10000 ) ) ) , 1 ] ; }
} ,
_ _destroy : function ( ) {
this . get _container ( )
. find ( "input.jstree-real-checkbox" ) . removeClass ( "jstree-real-checkbox" ) . end ( )
. find ( "ins.jstree-checkbox" ) . remove ( ) ;
} ,
_fn : {
_checkbox _notify : function ( n , data ) {
if ( data . checked ) {
this . check _node ( n , false ) ;
}
} ,
_prepare _checkboxes : function ( obj ) {
obj = ! obj || obj == - 1 ? this . get _container ( ) . find ( "> ul > li" ) : this . _get _node ( obj ) ;
if ( obj === false ) { return ; } // added for removing root nodes
var c , _this = this , t , ts = this . _get _settings ( ) . checkbox . two _state , rc = this . _get _settings ( ) . checkbox . real _checkboxes , rcn = this . _get _settings ( ) . checkbox . real _checkboxes _names ;
obj . each ( function ( ) {
t = $ ( this ) ;
c = t . is ( "li" ) && ( t . hasClass ( "jstree-checked" ) || ( rc && t . children ( ":checked" ) . length ) ) ? "jstree-checked" : "jstree-unchecked" ;
t . find ( "li" ) . andSelf ( ) . each ( function ( ) {
var $t = $ ( this ) , nm ;
$t . children ( "a" + ( _this . data . languages ? "" : ":eq(0)" ) ) . not ( ":has(.jstree-checkbox)" ) . prepend ( "<ins class='jstree-checkbox'> </ins>" ) . parent ( ) . not ( ".jstree-checked, .jstree-unchecked" ) . addClass ( ts ? "jstree-unchecked" : c ) ;
if ( rc ) {
if ( ! $t . children ( ":checkbox" ) . length ) {
nm = rcn . call ( _this , $t ) ;
$t . prepend ( "<input type='checkbox' class='jstree-real-checkbox' id='" + nm [ 0 ] + "' name='" + nm [ 0 ] + "' value='" + nm [ 1 ] + "' />" ) ;
}
else {
$t . children ( ":checkbox" ) . addClass ( "jstree-real-checkbox" ) ;
}
2011-10-04 12:43:47 +02:00
}
if ( ! ts ) {
if ( c === "jstree-checked" || $t . hasClass ( "jstree-checked" ) || $t . children ( ':checked' ) . length ) {
$t . find ( "li" ) . andSelf ( ) . addClass ( "jstree-checked" ) . children ( ":checkbox" ) . prop ( "checked" , true ) ;
2011-03-01 05:37:59 +01:00
}
}
2011-10-04 12:43:47 +02:00
else {
if ( $t . hasClass ( "jstree-checked" ) || $t . children ( ':checked' ) . length ) {
$t . addClass ( "jstree-checked" ) . children ( ":checkbox" ) . prop ( "checked" , true ) ;
}
2011-03-01 05:37:59 +01:00
}
} ) ;
} ) ;
if ( ! ts ) {
obj . find ( ".jstree-checked" ) . parent ( ) . parent ( ) . each ( function ( ) { _this . _repair _state ( this ) ; } ) ;
}
} ,
change _state : function ( obj , state ) {
obj = this . _get _node ( obj ) ;
var coll = false , rc = this . _get _settings ( ) . checkbox . real _checkboxes ;
if ( ! obj || obj === - 1 ) { return false ; }
state = ( state === false || state === true ) ? state : obj . hasClass ( "jstree-checked" ) ;
if ( this . _get _settings ( ) . checkbox . two _state ) {
if ( state ) {
obj . removeClass ( "jstree-checked" ) . addClass ( "jstree-unchecked" ) ;
2011-10-04 12:43:47 +02:00
if ( rc ) { obj . children ( ":checkbox" ) . prop ( "checked" , false ) ; }
2011-03-01 05:37:59 +01:00
}
else {
obj . removeClass ( "jstree-unchecked" ) . addClass ( "jstree-checked" ) ;
2011-10-04 12:43:47 +02:00
if ( rc ) { obj . children ( ":checkbox" ) . prop ( "checked" , true ) ; }
2011-03-01 05:37:59 +01:00
}
}
else {
if ( state ) {
coll = obj . find ( "li" ) . andSelf ( ) ;
if ( ! coll . filter ( ".jstree-checked, .jstree-undetermined" ) . length ) { return false ; }
coll . removeClass ( "jstree-checked jstree-undetermined" ) . addClass ( "jstree-unchecked" ) ;
2011-10-04 12:43:47 +02:00
if ( rc ) { coll . children ( ":checkbox" ) . prop ( "checked" , false ) ; }
2011-03-01 05:37:59 +01:00
}
else {
coll = obj . find ( "li" ) . andSelf ( ) ;
if ( ! coll . filter ( ".jstree-unchecked, .jstree-undetermined" ) . length ) { return false ; }
coll . removeClass ( "jstree-unchecked jstree-undetermined" ) . addClass ( "jstree-checked" ) ;
2011-10-04 12:43:47 +02:00
if ( rc ) { coll . children ( ":checkbox" ) . prop ( "checked" , true ) ; }
2011-03-01 05:37:59 +01:00
if ( this . data . ui ) { this . data . ui . last _selected = obj ; }
this . data . checkbox . last _selected = obj ;
}
obj . parentsUntil ( ".jstree" , "li" ) . each ( function ( ) {
var $this = $ ( this ) ;
if ( state ) {
if ( $this . children ( "ul" ) . children ( "li.jstree-checked, li.jstree-undetermined" ) . length ) {
$this . parentsUntil ( ".jstree" , "li" ) . andSelf ( ) . removeClass ( "jstree-checked jstree-unchecked" ) . addClass ( "jstree-undetermined" ) ;
2011-10-04 12:43:47 +02:00
if ( rc ) { $this . parentsUntil ( ".jstree" , "li" ) . andSelf ( ) . children ( ":checkbox" ) . prop ( "checked" , false ) ; }
2011-03-01 05:37:59 +01:00
return false ;
}
else {
$this . removeClass ( "jstree-checked jstree-undetermined" ) . addClass ( "jstree-unchecked" ) ;
2011-10-04 12:43:47 +02:00
if ( rc ) { $this . children ( ":checkbox" ) . prop ( "checked" , false ) ; }
2011-03-01 05:37:59 +01:00
}
}
else {
if ( $this . children ( "ul" ) . children ( "li.jstree-unchecked, li.jstree-undetermined" ) . length ) {
$this . parentsUntil ( ".jstree" , "li" ) . andSelf ( ) . removeClass ( "jstree-checked jstree-unchecked" ) . addClass ( "jstree-undetermined" ) ;
2011-10-04 12:43:47 +02:00
if ( rc ) { $this . parentsUntil ( ".jstree" , "li" ) . andSelf ( ) . children ( ":checkbox" ) . prop ( "checked" , false ) ; }
2011-03-01 05:37:59 +01:00
return false ;
}
else {
$this . removeClass ( "jstree-unchecked jstree-undetermined" ) . addClass ( "jstree-checked" ) ;
2011-10-04 12:43:47 +02:00
if ( rc ) { $this . children ( ":checkbox" ) . prop ( "checked" , true ) ; }
2011-03-01 05:37:59 +01:00
}
}
} ) ;
}
if ( this . data . ui && this . data . checkbox . noui ) { this . data . ui . selected = this . get _checked ( ) ; }
this . _ _callback ( obj ) ;
return true ;
} ,
check _node : function ( obj ) {
if ( this . change _state ( obj , false ) ) {
obj = this . _get _node ( obj ) ;
if ( this . _get _settings ( ) . checkbox . checked _parent _open ) {
var t = this ;
obj . parents ( ".jstree-closed" ) . each ( function ( ) { t . open _node ( this , false , true ) ; } ) ;
}
this . _ _callback ( { "obj" : obj } ) ;
}
} ,
uncheck _node : function ( obj ) {
if ( this . change _state ( obj , true ) ) { this . _ _callback ( { "obj" : this . _get _node ( obj ) } ) ; }
} ,
check _all : function ( ) {
var _this = this ,
coll = this . _get _settings ( ) . checkbox . two _state ? this . get _container _ul ( ) . find ( "li" ) : this . get _container _ul ( ) . children ( "li" ) ;
coll . each ( function ( ) {
_this . change _state ( this , false ) ;
} ) ;
this . _ _callback ( ) ;
} ,
uncheck _all : function ( ) {
var _this = this ,
coll = this . _get _settings ( ) . checkbox . two _state ? this . get _container _ul ( ) . find ( "li" ) : this . get _container _ul ( ) . children ( "li" ) ;
coll . each ( function ( ) {
_this . change _state ( this , true ) ;
} ) ;
this . _ _callback ( ) ;
} ,
is _checked : function ( obj ) {
obj = this . _get _node ( obj ) ;
return obj . length ? obj . is ( ".jstree-checked" ) : false ;
} ,
get _checked : function ( obj , get _all ) {
obj = ! obj || obj === - 1 ? this . get _container ( ) : this . _get _node ( obj ) ;
return get _all || this . _get _settings ( ) . checkbox . two _state ? obj . find ( ".jstree-checked" ) : obj . find ( "> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked" ) ;
} ,
get _unchecked : function ( obj , get _all ) {
obj = ! obj || obj === - 1 ? this . get _container ( ) : this . _get _node ( obj ) ;
return get _all || this . _get _settings ( ) . checkbox . two _state ? obj . find ( ".jstree-unchecked" ) : obj . find ( "> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked" ) ;
} ,
show _checkboxes : function ( ) { this . get _container ( ) . children ( "ul" ) . removeClass ( "jstree-no-checkboxes" ) ; } ,
hide _checkboxes : function ( ) { this . get _container ( ) . children ( "ul" ) . addClass ( "jstree-no-checkboxes" ) ; } ,
_repair _state : function ( obj ) {
obj = this . _get _node ( obj ) ;
if ( ! obj . length ) { return ; }
2011-10-04 12:43:47 +02:00
if ( this . _get _settings ( ) . checkbox . two _state ) {
obj . find ( 'li' ) . andSelf ( ) . not ( '.jstree-checked' ) . removeClass ( 'jstree-undetermined' ) . addClass ( 'jstree-unchecked' ) . children ( ':checkbox' ) . prop ( 'checked' , true ) ;
return ;
}
2011-03-01 05:37:59 +01:00
var rc = this . _get _settings ( ) . checkbox . real _checkboxes ,
a = obj . find ( "> ul > .jstree-checked" ) . length ,
b = obj . find ( "> ul > .jstree-undetermined" ) . length ,
c = obj . find ( "> ul > li" ) . length ;
if ( c === 0 ) { if ( obj . hasClass ( "jstree-undetermined" ) ) { this . change _state ( obj , false ) ; } }
else if ( a === 0 && b === 0 ) { this . change _state ( obj , true ) ; }
else if ( a === c ) { this . change _state ( obj , false ) ; }
else {
obj . parentsUntil ( ".jstree" , "li" ) . andSelf ( ) . removeClass ( "jstree-checked jstree-unchecked" ) . addClass ( "jstree-undetermined" ) ;
2011-10-04 12:43:47 +02:00
if ( rc ) { obj . parentsUntil ( ".jstree" , "li" ) . andSelf ( ) . children ( ":checkbox" ) . prop ( "checked" , false ) ; }
2011-03-01 05:37:59 +01:00
}
} ,
reselect : function ( ) {
if ( this . data . ui && this . data . checkbox . noui ) {
var _this = this ,
s = this . data . ui . to _select ;
s = $ . map ( $ . makeArray ( s ) , function ( n ) { return "#" + n . toString ( ) . replace ( /^#/ , "" ) . replace ( /\\\//g , "/" ) . replace ( /\//g , "\\\/" ) . replace ( /\\\./g , "." ) . replace ( /\./g , "\\." ) . replace ( /\:/g , "\\:" ) ; } ) ;
this . deselect _all ( ) ;
$ . each ( s , function ( i , val ) { _this . check _node ( val ) ; } ) ;
this . _ _callback ( ) ;
}
else {
this . _ _call _old ( ) ;
}
} ,
save _loaded : function ( ) {
var _this = this ;
this . data . core . to _load = [ ] ;
this . get _container _ul ( ) . find ( "li.jstree-closed.jstree-undetermined" ) . each ( function ( ) {
if ( this . id ) { _this . data . core . to _load . push ( "#" + this . id ) ; }
} ) ;
}
}
} ) ;
$ ( function ( ) {
var css _string = '.jstree .jstree-real-checkbox { display:none; } ' ;
$ . vakata . css . add _sheet ( { str : css _string , title : "jstree" } ) ;
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree XML plugin
* The XML data store . Datastores are build by overriding the ` load_node ` and ` _is_loaded ` functions .
* /
( function ( $ ) {
$ . vakata . xslt = function ( xml , xsl , callback ) {
var rs = "" , xm , xs , processor , support ;
// TODO: IE9 no XSLTProcessor, no document.recalc
if ( document . recalc ) {
xm = document . createElement ( 'xml' ) ;
xs = document . createElement ( 'xml' ) ;
xm . innerHTML = xml ;
xs . innerHTML = xsl ;
$ ( "body" ) . append ( xm ) . append ( xs ) ;
setTimeout ( ( function ( xm , xs , callback ) {
return function ( ) {
callback . call ( null , xm . transformNode ( xs . XMLDocument ) ) ;
setTimeout ( ( function ( xm , xs ) { return function ( ) { $ ( xm ) . remove ( ) ; $ ( xs ) . remove ( ) ; } ; } ) ( xm , xs ) , 200 ) ;
} ;
} ) ( xm , xs , callback ) , 100 ) ;
return true ;
}
if ( typeof window . DOMParser !== "undefined" && typeof window . XMLHttpRequest !== "undefined" && typeof window . XSLTProcessor === "undefined" ) {
xml = new DOMParser ( ) . parseFromString ( xml , "text/xml" ) ;
xsl = new DOMParser ( ) . parseFromString ( xsl , "text/xml" ) ;
// alert(xml.transformNode());
// callback.call(null, new XMLSerializer().serializeToString(rs));
}
if ( typeof window . DOMParser !== "undefined" && typeof window . XMLHttpRequest !== "undefined" && typeof window . XSLTProcessor !== "undefined" ) {
processor = new XSLTProcessor ( ) ;
support = $ . isFunction ( processor . transformDocument ) ? ( typeof window . XMLSerializer !== "undefined" ) : true ;
if ( ! support ) { return false ; }
xml = new DOMParser ( ) . parseFromString ( xml , "text/xml" ) ;
xsl = new DOMParser ( ) . parseFromString ( xsl , "text/xml" ) ;
if ( $ . isFunction ( processor . transformDocument ) ) {
rs = document . implementation . createDocument ( "" , "" , null ) ;
processor . transformDocument ( xml , xsl , rs , null ) ;
callback . call ( null , new XMLSerializer ( ) . serializeToString ( rs ) ) ;
return true ;
}
else {
processor . importStylesheet ( xsl ) ;
rs = processor . transformToFragment ( xml , document ) ;
callback . call ( null , $ ( "<div />" ) . append ( rs ) . html ( ) ) ;
return true ;
}
}
return false ;
} ;
var xsl = {
'nest' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
'<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/html" />' +
'<xsl:template match="/">' +
' <xsl:call-template name="nodes">' +
' <xsl:with-param name="node" select="/root" />' +
' </xsl:call-template>' +
'</xsl:template>' +
'<xsl:template name="nodes">' +
' <xsl:param name="node" />' +
' <ul>' +
' <xsl:for-each select="$node/item">' +
' <xsl:variable name="children" select="count(./item) > 0" />' +
' <li>' +
' <xsl:attribute name="class">' +
' <xsl:if test="position() = last()">jstree-last </xsl:if>' +
' <xsl:choose>' +
' <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
' <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
' <xsl:otherwise>jstree-leaf </xsl:otherwise>' +
' </xsl:choose>' +
' <xsl:value-of select="@class" />' +
' </xsl:attribute>' +
' <xsl:for-each select="@*">' +
' <xsl:if test="name() != \'class\' and name() != \'state\' and name() != \'hasChildren\'">' +
' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
' </xsl:if>' +
' </xsl:for-each>' +
' <ins class="jstree-icon"><xsl:text> </xsl:text></ins>' +
' <xsl:for-each select="content/name">' +
' <a>' +
' <xsl:attribute name="href">' +
' <xsl:choose>' +
' <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
' <xsl:otherwise>#</xsl:otherwise>' +
' </xsl:choose>' +
' </xsl:attribute>' +
' <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
' <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
' <xsl:for-each select="@*">' +
' <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
' </xsl:if>' +
' </xsl:for-each>' +
' <ins>' +
' <xsl:attribute name="class">jstree-icon ' +
' <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
' </xsl:attribute>' +
' <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
' <xsl:text> </xsl:text>' +
' </ins>' +
' <xsl:copy-of select="./child::node()" />' +
' </a>' +
' </xsl:for-each>' +
' <xsl:if test="$children or @hasChildren"><xsl:call-template name="nodes"><xsl:with-param name="node" select="current()" /></xsl:call-template></xsl:if>' +
' </li>' +
' </xsl:for-each>' +
' </ul>' +
'</xsl:template>' +
'</xsl:stylesheet>' ,
'flat' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
'<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/xml" />' +
'<xsl:template match="/">' +
' <ul>' +
' <xsl:for-each select="//item[not(@parent_id) or @parent_id=0 or not(@parent_id = //item/@id)]">' + /* the last `or` may be removed */
' <xsl:call-template name="nodes">' +
' <xsl:with-param name="node" select="." />' +
' <xsl:with-param name="is_last" select="number(position() = last())" />' +
' </xsl:call-template>' +
' </xsl:for-each>' +
' </ul>' +
'</xsl:template>' +
'<xsl:template name="nodes">' +
' <xsl:param name="node" />' +
' <xsl:param name="is_last" />' +
' <xsl:variable name="children" select="count(//item[@parent_id=$node/attribute::id]) > 0" />' +
' <li>' +
' <xsl:attribute name="class">' +
' <xsl:if test="$is_last = true()">jstree-last </xsl:if>' +
' <xsl:choose>' +
' <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
' <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
' <xsl:otherwise>jstree-leaf </xsl:otherwise>' +
' </xsl:choose>' +
' <xsl:value-of select="@class" />' +
' </xsl:attribute>' +
' <xsl:for-each select="@*">' +
' <xsl:if test="name() != \'parent_id\' and name() != \'hasChildren\' and name() != \'class\' and name() != \'state\'">' +
' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
' </xsl:if>' +
' </xsl:for-each>' +
' <ins class="jstree-icon"><xsl:text> </xsl:text></ins>' +
' <xsl:for-each select="content/name">' +
' <a>' +
' <xsl:attribute name="href">' +
' <xsl:choose>' +
' <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
' <xsl:otherwise>#</xsl:otherwise>' +
' </xsl:choose>' +
' </xsl:attribute>' +
' <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
' <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
' <xsl:for-each select="@*">' +
' <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
' </xsl:if>' +
' </xsl:for-each>' +
' <ins>' +
' <xsl:attribute name="class">jstree-icon ' +
' <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
' </xsl:attribute>' +
' <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
' <xsl:text> </xsl:text>' +
' </ins>' +
' <xsl:copy-of select="./child::node()" />' +
' </a>' +
' </xsl:for-each>' +
' <xsl:if test="$children">' +
' <ul>' +
' <xsl:for-each select="//item[@parent_id=$node/attribute::id]">' +
' <xsl:call-template name="nodes">' +
' <xsl:with-param name="node" select="." />' +
' <xsl:with-param name="is_last" select="number(position() = last())" />' +
' </xsl:call-template>' +
' </xsl:for-each>' +
' </ul>' +
' </xsl:if>' +
' </li>' +
'</xsl:template>' +
'</xsl:stylesheet>'
} ,
escape _xml = function ( string ) {
return string
. toString ( )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' )
. replace ( /'/g , ''' ) ;
} ;
$ . jstree . plugin ( "xml_data" , {
defaults : {
data : false ,
ajax : false ,
xsl : "flat" ,
clean _node : false ,
correct _state : true ,
get _skip _empty : false ,
get _include _preamble : true
} ,
_fn : {
load _node : function ( obj , s _call , e _call ) { var _this = this ; this . load _node _xml ( obj , function ( ) { _this . _ _callback ( { "obj" : _this . _get _node ( obj ) } ) ; s _call . call ( this ) ; } , e _call ) ; } ,
_is _loaded : function ( obj ) {
var s = this . _get _settings ( ) . xml _data ;
obj = this . _get _node ( obj ) ;
return obj == - 1 || ! obj || ( ! s . ajax && ! $ . isFunction ( s . data ) ) || obj . is ( ".jstree-open, .jstree-leaf" ) || obj . children ( "ul" ) . children ( "li" ) . size ( ) > 0 ;
} ,
load _node _xml : function ( obj , s _call , e _call ) {
var s = this . get _settings ( ) . xml _data ,
error _func = function ( ) { } ,
success _func = function ( ) { } ;
obj = this . _get _node ( obj ) ;
if ( obj && obj !== - 1 ) {
2011-10-04 12:43:47 +02:00
if ( obj . data ( "jstree_is_loading" ) ) { return ; }
else { obj . data ( "jstree_is_loading" , true ) ; }
2011-03-01 05:37:59 +01:00
}
switch ( ! 0 ) {
case ( ! s . data && ! s . ajax ) : throw "Neither data nor ajax settings supplied." ;
case ( $ . isFunction ( s . data ) ) :
s . data . call ( this , obj , $ . proxy ( function ( d ) {
this . parse _xml ( d , $ . proxy ( function ( d ) {
if ( d ) {
d = d . replace ( / ?xmlns="[^"]*"/ig , "" ) ;
if ( d . length > 10 ) {
d = $ ( d ) ;
if ( obj === - 1 || ! obj ) { this . get _container ( ) . children ( "ul" ) . empty ( ) . append ( d . children ( ) ) ; }
2011-10-04 12:43:47 +02:00
else { obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ; obj . append ( d ) ; obj . removeData ( "jstree_is_loading" ) ; }
2011-03-01 05:37:59 +01:00
if ( s . clean _node ) { this . clean _node ( obj ) ; }
if ( s _call ) { s _call . call ( this ) ; }
}
else {
if ( obj && obj !== - 1 ) {
obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ;
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_is_loading" ) ;
2011-03-01 05:37:59 +01:00
if ( s . correct _state ) {
this . correct _state ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
else {
if ( s . correct _state ) {
this . get _container ( ) . children ( "ul" ) . empty ( ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
}
}
} , this ) ) ;
} , this ) ) ;
break ;
case ( ! ! s . data && ! s . ajax ) || ( ! ! s . data && ! ! s . ajax && ( ! obj || obj === - 1 ) ) :
if ( ! obj || obj == - 1 ) {
this . parse _xml ( s . data , $ . proxy ( function ( d ) {
if ( d ) {
d = d . replace ( / ?xmlns="[^"]*"/ig , "" ) ;
if ( d . length > 10 ) {
d = $ ( d ) ;
this . get _container ( ) . children ( "ul" ) . empty ( ) . append ( d . children ( ) ) ;
if ( s . clean _node ) { this . clean _node ( obj ) ; }
if ( s _call ) { s _call . call ( this ) ; }
}
}
else {
if ( s . correct _state ) {
this . get _container ( ) . children ( "ul" ) . empty ( ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
} , this ) ) ;
}
break ;
case ( ! s . data && ! ! s . ajax ) || ( ! ! s . data && ! ! s . ajax && obj && obj !== - 1 ) :
error _func = function ( x , t , e ) {
var ef = this . get _settings ( ) . xml _data . ajax . error ;
if ( ef ) { ef . call ( this , x , t , e ) ; }
if ( obj !== - 1 && obj . length ) {
obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ;
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_is_loading" ) ;
2011-03-01 05:37:59 +01:00
if ( t === "success" && s . correct _state ) { this . correct _state ( obj ) ; }
}
else {
if ( t === "success" && s . correct _state ) { this . get _container ( ) . children ( "ul" ) . empty ( ) ; }
}
if ( e _call ) { e _call . call ( this ) ; }
} ;
success _func = function ( d , t , x ) {
d = x . responseText ;
var sf = this . get _settings ( ) . xml _data . ajax . success ;
if ( sf ) { d = sf . call ( this , d , t , x ) || d ; }
if ( d === "" || ( d && d . toString && d . toString ( ) . replace ( /^[\s\n]+$/ , "" ) === "" ) ) {
return error _func . call ( this , x , t , "" ) ;
}
this . parse _xml ( d , $ . proxy ( function ( d ) {
if ( d ) {
d = d . replace ( / ?xmlns="[^"]*"/ig , "" ) ;
if ( d . length > 10 ) {
d = $ ( d ) ;
if ( obj === - 1 || ! obj ) { this . get _container ( ) . children ( "ul" ) . empty ( ) . append ( d . children ( ) ) ; }
2011-10-04 12:43:47 +02:00
else { obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ; obj . append ( d ) ; obj . removeData ( "jstree_is_loading" ) ; }
2011-03-01 05:37:59 +01:00
if ( s . clean _node ) { this . clean _node ( obj ) ; }
if ( s _call ) { s _call . call ( this ) ; }
}
else {
if ( obj && obj !== - 1 ) {
obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ;
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_is_loading" ) ;
2011-03-01 05:37:59 +01:00
if ( s . correct _state ) {
this . correct _state ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
else {
if ( s . correct _state ) {
this . get _container ( ) . children ( "ul" ) . empty ( ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
}
}
} , this ) ) ;
} ;
s . ajax . context = this ;
s . ajax . error = error _func ;
s . ajax . success = success _func ;
if ( ! s . ajax . dataType ) { s . ajax . dataType = "xml" ; }
if ( $ . isFunction ( s . ajax . url ) ) { s . ajax . url = s . ajax . url . call ( this , obj ) ; }
if ( $ . isFunction ( s . ajax . data ) ) { s . ajax . data = s . ajax . data . call ( this , obj ) ; }
$ . ajax ( s . ajax ) ;
break ;
}
} ,
parse _xml : function ( xml , callback ) {
var s = this . _get _settings ( ) . xml _data ;
$ . vakata . xslt ( xml , xsl [ s . xsl ] , callback ) ;
} ,
get _xml : function ( tp , obj , li _attr , a _attr , is _callback ) {
var result = "" ,
s = this . _get _settings ( ) ,
_this = this ,
tmp1 , tmp2 , li , a , lang ;
if ( ! tp ) { tp = "flat" ; }
if ( ! is _callback ) { is _callback = 0 ; }
obj = this . _get _node ( obj ) ;
if ( ! obj || obj === - 1 ) { obj = this . get _container ( ) . find ( "> ul > li" ) ; }
li _attr = $ . isArray ( li _attr ) ? li _attr : [ "id" , "class" ] ;
if ( ! is _callback && this . data . types && $ . inArray ( s . types . type _attr , li _attr ) === - 1 ) { li _attr . push ( s . types . type _attr ) ; }
a _attr = $ . isArray ( a _attr ) ? a _attr : [ ] ;
if ( ! is _callback ) {
if ( s . xml _data . get _include _preamble ) {
result += '<' + '?xml version="1.0" encoding="UTF-8"?' + '>' ;
}
result += "<root>" ;
}
obj . each ( function ( ) {
result += "<item" ;
li = $ ( this ) ;
$ . each ( li _attr , function ( i , v ) {
var t = li . attr ( v ) ;
if ( ! s . xml _data . get _skip _empty || typeof t !== "undefined" ) {
result += " " + v + "=\"" + escape _xml ( ( " " + ( t || "" ) ) . replace ( / jstree[^ ]*/ig , '' ) . replace ( /\s+$/ig , " " ) . replace ( /^ / , "" ) . replace ( / $/ , "" ) ) + "\"" ;
}
} ) ;
if ( li . hasClass ( "jstree-open" ) ) { result += " state=\"open\"" ; }
if ( li . hasClass ( "jstree-closed" ) ) { result += " state=\"closed\"" ; }
if ( tp === "flat" ) { result += " parent_id=\"" + escape _xml ( is _callback ) + "\"" ; }
result += ">" ;
result += "<content>" ;
a = li . children ( "a" ) ;
a . each ( function ( ) {
tmp1 = $ ( this ) ;
lang = false ;
result += "<name" ;
if ( $ . inArray ( "languages" , s . plugins ) !== - 1 ) {
$ . each ( s . languages , function ( k , z ) {
if ( tmp1 . hasClass ( z ) ) { result += " lang=\"" + escape _xml ( z ) + "\"" ; lang = z ; return false ; }
} ) ;
}
if ( a _attr . length ) {
$ . each ( a _attr , function ( k , z ) {
var t = tmp1 . attr ( z ) ;
if ( ! s . xml _data . get _skip _empty || typeof t !== "undefined" ) {
result += " " + z + "=\"" + escape _xml ( ( " " + t || "" ) . replace ( / jstree[^ ]*/ig , '' ) . replace ( /\s+$/ig , " " ) . replace ( /^ / , "" ) . replace ( / $/ , "" ) ) + "\"" ;
}
} ) ;
}
if ( tmp1 . children ( "ins" ) . get ( 0 ) . className . replace ( /jstree[^ ]*|$/ig , '' ) . replace ( /^\s+$/ig , "" ) . length ) {
result += ' icon="' + escape _xml ( tmp1 . children ( "ins" ) . get ( 0 ) . className . replace ( /jstree[^ ]*|$/ig , '' ) . replace ( /\s+$/ig , " " ) . replace ( /^ / , "" ) . replace ( / $/ , "" ) ) + '"' ;
}
if ( tmp1 . children ( "ins" ) . get ( 0 ) . style . backgroundImage . length ) {
result += ' icon="' + escape _xml ( tmp1 . children ( "ins" ) . get ( 0 ) . style . backgroundImage . replace ( "url(" , "" ) . replace ( ")" , "" ) . replace ( /'/ig , "" ) . replace ( /"/ig , "" ) ) + '"' ;
}
result += ">" ;
result += "<![CDATA[" + _this . get _text ( tmp1 , lang ) + "]]>" ;
result += "</name>" ;
} ) ;
result += "</content>" ;
tmp2 = li [ 0 ] . id || true ;
li = li . find ( "> ul > li" ) ;
if ( li . length ) { tmp2 = _this . get _xml ( tp , li , li _attr , a _attr , tmp2 ) ; }
else { tmp2 = "" ; }
if ( tp == "nest" ) { result += tmp2 ; }
result += "</item>" ;
if ( tp == "flat" ) { result += tmp2 ; }
} ) ;
if ( ! is _callback ) { result += "</root>" ; }
return result ;
}
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree search plugin
* Enables both sync and async search on the tree
* DOES NOT WORK WITH JSON PROGRESSIVE RENDER
* /
( function ( $ ) {
$ . expr [ ':' ] . jstree _contains = function ( a , i , m ) {
return ( a . textContent || a . innerText || "" ) . toLowerCase ( ) . indexOf ( m [ 3 ] . toLowerCase ( ) ) >= 0 ;
} ;
$ . expr [ ':' ] . jstree _title _contains = function ( a , i , m ) {
return ( a . getAttribute ( "title" ) || "" ) . toLowerCase ( ) . indexOf ( m [ 3 ] . toLowerCase ( ) ) >= 0 ;
} ;
$ . jstree . plugin ( "search" , {
_ _init : function ( ) {
this . data . search . str = "" ;
this . data . search . result = $ ( ) ;
if ( this . _get _settings ( ) . search . show _only _matches ) {
this . get _container ( )
. bind ( "search.jstree" , function ( e , data ) {
$ ( this ) . children ( "ul" ) . find ( "li" ) . hide ( ) . removeClass ( "jstree-last" ) ;
data . rslt . nodes . parentsUntil ( ".jstree" ) . andSelf ( ) . show ( )
. filter ( "ul" ) . each ( function ( ) { $ ( this ) . children ( "li:visible" ) . eq ( - 1 ) . addClass ( "jstree-last" ) ; } ) ;
} )
. bind ( "clear_search.jstree" , function ( ) {
$ ( this ) . children ( "ul" ) . find ( "li" ) . css ( "display" , "" ) . end ( ) . end ( ) . jstree ( "clean_node" , - 1 ) ;
} ) ;
}
} ,
defaults : {
ajax : false ,
search _method : "jstree_contains" , // for case insensitive - jstree_contains
show _only _matches : false
} ,
_fn : {
search : function ( str , skip _async ) {
if ( $ . trim ( str ) === "" ) { this . clear _search ( ) ; return ; }
var s = this . get _settings ( ) . search ,
t = this ,
error _func = function ( ) { } ,
success _func = function ( ) { } ;
this . data . search . str = str ;
if ( ! skip _async && s . ajax !== false && this . get _container _ul ( ) . find ( "li.jstree-closed:not(:has(ul)):eq(0)" ) . length > 0 ) {
this . search . supress _callback = true ;
error _func = function ( ) { } ;
success _func = function ( d , t , x ) {
var sf = this . get _settings ( ) . search . ajax . success ;
if ( sf ) { d = sf . call ( this , d , t , x ) || d ; }
this . data . search . to _open = d ;
this . _search _open ( ) ;
} ;
s . ajax . context = this ;
s . ajax . error = error _func ;
s . ajax . success = success _func ;
if ( $ . isFunction ( s . ajax . url ) ) { s . ajax . url = s . ajax . url . call ( this , str ) ; }
if ( $ . isFunction ( s . ajax . data ) ) { s . ajax . data = s . ajax . data . call ( this , str ) ; }
if ( ! s . ajax . data ) { s . ajax . data = { "search_string" : str } ; }
if ( ! s . ajax . dataType || /^json/ . exec ( s . ajax . dataType ) ) { s . ajax . dataType = "json" ; }
$ . ajax ( s . ajax ) ;
return ;
}
if ( this . data . search . result . length ) { this . clear _search ( ) ; }
this . data . search . result = this . get _container ( ) . find ( "a" + ( this . data . languages ? "." + this . get _lang ( ) : "" ) + ":" + ( s . search _method ) + "(" + this . data . search . str + ")" ) ;
this . data . search . result . addClass ( "jstree-search" ) . parent ( ) . parents ( ".jstree-closed" ) . each ( function ( ) {
t . open _node ( this , false , true ) ;
} ) ;
this . _ _callback ( { nodes : this . data . search . result , str : str } ) ;
} ,
clear _search : function ( str ) {
this . data . search . result . removeClass ( "jstree-search" ) ;
this . _ _callback ( this . data . search . result ) ;
this . data . search . result = $ ( ) ;
} ,
_search _open : function ( is _callback ) {
var _this = this ,
done = true ,
current = [ ] ,
remaining = [ ] ;
if ( this . data . search . to _open . length ) {
$ . each ( this . data . search . to _open , function ( i , val ) {
if ( val == "#" ) { return true ; }
if ( $ ( val ) . length && $ ( val ) . is ( ".jstree-closed" ) ) { current . push ( val ) ; }
else { remaining . push ( val ) ; }
} ) ;
if ( current . length ) {
this . data . search . to _open = remaining ;
$ . each ( current , function ( i , val ) {
_this . open _node ( val , function ( ) { _this . _search _open ( true ) ; } ) ;
} ) ;
done = false ;
}
}
if ( done ) { this . search ( this . data . search . str , true ) ; }
}
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree contextmenu plugin
* /
( function ( $ ) {
$ . vakata . context = {
hide _on _mouseleave : false ,
cnt : $ ( "<div id='vakata-contextmenu' />" ) ,
vis : false ,
tgt : false ,
par : false ,
func : false ,
data : false ,
rtl : false ,
show : function ( s , t , x , y , d , p , rtl ) {
$ . vakata . context . rtl = ! ! rtl ;
var html = $ . vakata . context . parse ( s ) , h , w ;
if ( ! html ) { return ; }
$ . vakata . context . vis = true ;
$ . vakata . context . tgt = t ;
$ . vakata . context . par = p || t || null ;
$ . vakata . context . data = d || null ;
$ . vakata . context . cnt
. html ( html )
. css ( { "visibility" : "hidden" , "display" : "block" , "left" : 0 , "top" : 0 } ) ;
if ( $ . vakata . context . hide _on _mouseleave ) {
$ . vakata . context . cnt
. one ( "mouseleave" , function ( e ) { $ . vakata . context . hide ( ) ; } ) ;
}
h = $ . vakata . context . cnt . height ( ) ;
w = $ . vakata . context . cnt . width ( ) ;
if ( x + w > $ ( document ) . width ( ) ) {
x = $ ( document ) . width ( ) - ( w + 5 ) ;
$ . vakata . context . cnt . find ( "li > ul" ) . addClass ( "right" ) ;
}
if ( y + h > $ ( document ) . height ( ) ) {
y = y - ( h + t [ 0 ] . offsetHeight ) ;
$ . vakata . context . cnt . find ( "li > ul" ) . addClass ( "bottom" ) ;
}
$ . vakata . context . cnt
. css ( { "left" : x , "top" : y } )
. find ( "li:has(ul)" )
. bind ( "mouseenter" , function ( e ) {
var w = $ ( document ) . width ( ) ,
h = $ ( document ) . height ( ) ,
ul = $ ( this ) . children ( "ul" ) . show ( ) ;
if ( w !== $ ( document ) . width ( ) ) { ul . toggleClass ( "right" ) ; }
if ( h !== $ ( document ) . height ( ) ) { ul . toggleClass ( "bottom" ) ; }
} )
. bind ( "mouseleave" , function ( e ) {
$ ( this ) . children ( "ul" ) . hide ( ) ;
} )
. end ( )
. css ( { "visibility" : "visible" } )
. show ( ) ;
$ ( document ) . triggerHandler ( "context_show.vakata" ) ;
} ,
hide : function ( ) {
$ . vakata . context . vis = false ;
$ . vakata . context . cnt . attr ( "class" , "" ) . css ( { "visibility" : "hidden" } ) ;
$ ( document ) . triggerHandler ( "context_hide.vakata" ) ;
} ,
parse : function ( s , is _callback ) {
if ( ! s ) { return false ; }
var str = "" ,
tmp = false ,
was _sep = true ;
if ( ! is _callback ) { $ . vakata . context . func = { } ; }
str += "<ul>" ;
$ . each ( s , function ( i , val ) {
if ( ! val ) { return true ; }
$ . vakata . context . func [ i ] = val . action ;
if ( ! was _sep && val . separator _before ) {
str += "<li class='vakata-separator vakata-separator-before'></li>" ;
}
was _sep = false ;
str += "<li class='" + ( val . _class || "" ) + ( val . _disabled ? " jstree-contextmenu-disabled " : "" ) + "'><ins " ;
if ( val . icon && val . icon . indexOf ( "/" ) === - 1 ) { str += " class='" + val . icon + "' " ; }
if ( val . icon && val . icon . indexOf ( "/" ) !== - 1 ) { str += " style='background:url(" + val . icon + ") center center no-repeat;' " ; }
str += "> </ins><a href='#' rel='" + i + "'>" ;
if ( val . submenu ) {
str += "<span style='float:" + ( $ . vakata . context . rtl ? "left" : "right" ) + ";'>»</span>" ;
}
str += val . label + "</a>" ;
if ( val . submenu ) {
tmp = $ . vakata . context . parse ( val . submenu , true ) ;
if ( tmp ) { str += tmp ; }
}
str += "</li>" ;
if ( val . separator _after ) {
str += "<li class='vakata-separator vakata-separator-after'></li>" ;
was _sep = true ;
}
} ) ;
str = str . replace ( /<li class\='vakata-separator vakata-separator-after'\><\/li\>$/ , "" ) ;
str += "</ul>" ;
$ ( document ) . triggerHandler ( "context_parse.vakata" ) ;
return str . length > 10 ? str : false ;
} ,
exec : function ( i ) {
if ( $ . isFunction ( $ . vakata . context . func [ i ] ) ) {
// if is string - eval and call it!
$ . vakata . context . func [ i ] . call ( $ . vakata . context . data , $ . vakata . context . par ) ;
return true ;
}
else { return false ; }
}
} ;
$ ( function ( ) {
var css _string = '' +
'#vakata-contextmenu { display:block; visibility:hidden; left:0; top:-200px; position:absolute; margin:0; padding:0; min-width:180px; background:#ebebeb; border:1px solid silver; z-index:10000; *width:180px; } ' +
'#vakata-contextmenu ul { min-width:180px; *width:180px; } ' +
'#vakata-contextmenu ul, #vakata-contextmenu li { margin:0; padding:0; list-style-type:none; display:block; } ' +
'#vakata-contextmenu li { line-height:20px; min-height:20px; position:relative; padding:0px; } ' +
'#vakata-contextmenu li a { padding:1px 6px; line-height:17px; display:block; text-decoration:none; margin:1px 1px 0 1px; } ' +
'#vakata-contextmenu li ins { float:left; width:16px; height:16px; text-decoration:none; margin-right:2px; } ' +
'#vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background:gray; color:white; } ' +
'#vakata-contextmenu li ul { display:none; position:absolute; top:-2px; left:100%; background:#ebebeb; border:1px solid gray; } ' +
'#vakata-contextmenu .right { right:100%; left:auto; } ' +
'#vakata-contextmenu .bottom { bottom:-1px; top:auto; } ' +
'#vakata-contextmenu li.vakata-separator { min-height:0; height:1px; line-height:1px; font-size:1px; overflow:hidden; margin:0 2px; background:silver; /* border-top:1px solid #fefefe; */ padding:0; } ' ;
$ . vakata . css . add _sheet ( { str : css _string , title : "vakata" } ) ;
$ . vakata . context . cnt
. delegate ( "a" , "click" , function ( e ) { e . preventDefault ( ) ; } )
. delegate ( "a" , "mouseup" , function ( e ) {
if ( ! $ ( this ) . parent ( ) . hasClass ( "jstree-contextmenu-disabled" ) && $ . vakata . context . exec ( $ ( this ) . attr ( "rel" ) ) ) {
$ . vakata . context . hide ( ) ;
}
else { $ ( this ) . blur ( ) ; }
} )
. delegate ( "a" , "mouseover" , function ( ) {
$ . vakata . context . cnt . find ( ".vakata-hover" ) . removeClass ( "vakata-hover" ) ;
} )
. appendTo ( "body" ) ;
$ ( document ) . bind ( "mousedown" , function ( e ) { if ( $ . vakata . context . vis && ! $ . contains ( $ . vakata . context . cnt [ 0 ] , e . target ) ) { $ . vakata . context . hide ( ) ; } } ) ;
if ( typeof $ . hotkeys !== "undefined" ) {
$ ( document )
. bind ( "keydown" , "up" , function ( e ) {
if ( $ . vakata . context . vis ) {
var o = $ . vakata . context . cnt . find ( "ul:visible" ) . last ( ) . children ( ".vakata-hover" ) . removeClass ( "vakata-hover" ) . prevAll ( "li:not(.vakata-separator)" ) . first ( ) ;
if ( ! o . length ) { o = $ . vakata . context . cnt . find ( "ul:visible" ) . last ( ) . children ( "li:not(.vakata-separator)" ) . last ( ) ; }
o . addClass ( "vakata-hover" ) ;
e . stopImmediatePropagation ( ) ;
e . preventDefault ( ) ;
}
} )
. bind ( "keydown" , "down" , function ( e ) {
if ( $ . vakata . context . vis ) {
var o = $ . vakata . context . cnt . find ( "ul:visible" ) . last ( ) . children ( ".vakata-hover" ) . removeClass ( "vakata-hover" ) . nextAll ( "li:not(.vakata-separator)" ) . first ( ) ;
if ( ! o . length ) { o = $ . vakata . context . cnt . find ( "ul:visible" ) . last ( ) . children ( "li:not(.vakata-separator)" ) . first ( ) ; }
o . addClass ( "vakata-hover" ) ;
e . stopImmediatePropagation ( ) ;
e . preventDefault ( ) ;
}
} )
. bind ( "keydown" , "right" , function ( e ) {
if ( $ . vakata . context . vis ) {
$ . vakata . context . cnt . find ( ".vakata-hover" ) . children ( "ul" ) . show ( ) . children ( "li:not(.vakata-separator)" ) . removeClass ( "vakata-hover" ) . first ( ) . addClass ( "vakata-hover" ) ;
e . stopImmediatePropagation ( ) ;
e . preventDefault ( ) ;
}
} )
. bind ( "keydown" , "left" , function ( e ) {
if ( $ . vakata . context . vis ) {
$ . vakata . context . cnt . find ( ".vakata-hover" ) . children ( "ul" ) . hide ( ) . children ( ".vakata-separator" ) . removeClass ( "vakata-hover" ) ;
e . stopImmediatePropagation ( ) ;
e . preventDefault ( ) ;
}
} )
. bind ( "keydown" , "esc" , function ( e ) {
$ . vakata . context . hide ( ) ;
e . preventDefault ( ) ;
} )
. bind ( "keydown" , "space" , function ( e ) {
$ . vakata . context . cnt . find ( ".vakata-hover" ) . last ( ) . children ( "a" ) . click ( ) ;
e . preventDefault ( ) ;
} ) ;
}
} ) ;
$ . jstree . plugin ( "contextmenu" , {
_ _init : function ( ) {
this . get _container ( )
. delegate ( "a" , "contextmenu.jstree" , $ . proxy ( function ( e ) {
e . preventDefault ( ) ;
if ( ! $ ( e . currentTarget ) . hasClass ( "jstree-loading" ) ) {
this . show _contextmenu ( e . currentTarget , e . pageX , e . pageY ) ;
}
} , this ) )
. delegate ( "a" , "click.jstree" , $ . proxy ( function ( e ) {
if ( this . data . contextmenu ) {
$ . vakata . context . hide ( ) ;
}
} , this ) )
. bind ( "destroy.jstree" , $ . proxy ( function ( ) {
// TODO: move this to descruct method
if ( this . data . contextmenu ) {
$ . vakata . context . hide ( ) ;
}
} , this ) ) ;
$ ( document ) . bind ( "context_hide.vakata" , $ . proxy ( function ( ) { this . data . contextmenu = false ; } , this ) ) ;
} ,
2012-06-14 18:11:51 +02:00
_ _destroy : function ( ) {
// unbind global event handlers when last instance is removed
// (no access to private 'instances' variable from here)
if ( $ ( '.jstree' ) . length <= 1 ) {
$ ( document ) . unbind ( "context_hide.vakata" ) ;
}
} ,
2011-03-01 05:37:59 +01:00
defaults : {
select _node : false , // requires UI plugin
show _at _node : true ,
items : { // Could be a function that should return an object like this one
"create" : {
"separator_before" : false ,
"separator_after" : true ,
"label" : "Create" ,
"action" : function ( obj ) { this . create ( obj ) ; }
} ,
"rename" : {
"separator_before" : false ,
"separator_after" : false ,
"label" : "Rename" ,
"action" : function ( obj ) { this . rename ( obj ) ; }
} ,
"remove" : {
"separator_before" : false ,
"icon" : false ,
"separator_after" : false ,
"label" : "Delete" ,
"action" : function ( obj ) { if ( this . is _selected ( obj ) ) { this . remove ( ) ; } else { this . remove ( obj ) ; } }
} ,
"ccp" : {
"separator_before" : true ,
"icon" : false ,
"separator_after" : false ,
"label" : "Edit" ,
"action" : false ,
"submenu" : {
"cut" : {
"separator_before" : false ,
"separator_after" : false ,
"label" : "Cut" ,
"action" : function ( obj ) { this . cut ( obj ) ; }
} ,
"copy" : {
"separator_before" : false ,
"icon" : false ,
"separator_after" : false ,
"label" : "Copy" ,
"action" : function ( obj ) { this . copy ( obj ) ; }
} ,
"paste" : {
"separator_before" : false ,
"icon" : false ,
"separator_after" : false ,
"label" : "Paste" ,
"action" : function ( obj ) { this . paste ( obj ) ; }
}
}
}
}
} ,
_fn : {
show _contextmenu : function ( obj , x , y ) {
obj = this . _get _node ( obj ) ;
var s = this . get _settings ( ) . contextmenu ,
a = obj . children ( "a:visible:eq(0)" ) ,
o = false ,
i = false ;
if ( s . select _node && this . data . ui && ! this . is _selected ( obj ) ) {
this . deselect _all ( ) ;
this . select _node ( obj , true ) ;
}
if ( s . show _at _node || typeof x === "undefined" || typeof y === "undefined" ) {
o = a . offset ( ) ;
x = o . left ;
y = o . top + this . data . core . li _height ;
}
i = obj . data ( "jstree" ) && obj . data ( "jstree" ) . contextmenu ? obj . data ( "jstree" ) . contextmenu : s . items ;
if ( $ . isFunction ( i ) ) { i = i . call ( this , obj ) ; }
this . data . contextmenu = true ;
$ . vakata . context . show ( i , a , x , y , this , obj , this . _get _settings ( ) . core . rtl ) ;
if ( this . data . themes ) { $ . vakata . context . cnt . attr ( "class" , "jstree-" + this . data . themes . theme + "-context" ) ; }
}
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree types plugin
* Adds support types of nodes
* You can set an attribute on each li node , that represents its type .
* According to the type setting the node may get custom icon / validation rules
* /
( function ( $ ) {
$ . jstree . plugin ( "types" , {
_ _init : function ( ) {
var s = this . _get _settings ( ) . types ;
this . data . types . attach _to = [ ] ;
this . get _container ( )
. bind ( "init.jstree" , $ . proxy ( function ( ) {
var types = s . types ,
attr = s . type _attr ,
icons _css = "" ,
_this = this ;
$ . each ( types , function ( i , tp ) {
$ . each ( tp , function ( k , v ) {
if ( ! /^(max_depth|max_children|icon|valid_children)$/ . test ( k ) ) { _this . data . types . attach _to . push ( k ) ; }
} ) ;
if ( ! tp . icon ) { return true ; }
if ( tp . icon . image || tp . icon . position ) {
if ( i == "default" ) { icons _css += '.jstree-' + _this . get _index ( ) + ' a > .jstree-icon { ' ; }
else { icons _css += '.jstree-' + _this . get _index ( ) + ' li[' + attr + '="' + i + '"] > a > .jstree-icon { ' ; }
if ( tp . icon . image ) { icons _css += ' background-image:url(' + tp . icon . image + '); ' ; }
if ( tp . icon . position ) { icons _css += ' background-position:' + tp . icon . position + '; ' ; }
else { icons _css += ' background-position:0 0; ' ; }
icons _css += '} ' ;
}
} ) ;
if ( icons _css !== "" ) { $ . vakata . css . add _sheet ( { 'str' : icons _css , title : "jstree-types" } ) ; }
} , this ) )
. bind ( "before.jstree" , $ . proxy ( function ( e , data ) {
var s , t ,
o = this . _get _settings ( ) . types . use _data ? this . _get _node ( data . args [ 0 ] ) : false ,
d = o && o !== - 1 && o . length ? o . data ( "jstree" ) : false ;
if ( d && d . types && d . types [ data . func ] === false ) { e . stopImmediatePropagation ( ) ; return false ; }
if ( $ . inArray ( data . func , this . data . types . attach _to ) !== - 1 ) {
if ( ! data . args [ 0 ] || ( ! data . args [ 0 ] . tagName && ! data . args [ 0 ] . jquery ) ) { return ; }
s = this . _get _settings ( ) . types . types ;
t = this . _get _type ( data . args [ 0 ] ) ;
if (
(
( s [ t ] && typeof s [ t ] [ data . func ] !== "undefined" ) ||
( s [ "default" ] && typeof s [ "default" ] [ data . func ] !== "undefined" )
) && this . _check ( data . func , data . args [ 0 ] ) === false
) {
e . stopImmediatePropagation ( ) ;
return false ;
}
}
} , this ) ) ;
if ( is _ie6 ) {
this . get _container ( )
. bind ( "load_node.jstree set_type.jstree" , $ . proxy ( function ( e , data ) {
var r = data && data . rslt && data . rslt . obj && data . rslt . obj !== - 1 ? this . _get _node ( data . rslt . obj ) . parent ( ) : this . get _container _ul ( ) ,
c = false ,
s = this . _get _settings ( ) . types ;
$ . each ( s . types , function ( i , tp ) {
if ( tp . icon && ( tp . icon . image || tp . icon . position ) ) {
c = i === "default" ? r . find ( "li > a > .jstree-icon" ) : r . find ( "li[" + s . type _attr + "='" + i + "'] > a > .jstree-icon" ) ;
if ( tp . icon . image ) { c . css ( "backgroundImage" , "url(" + tp . icon . image + ")" ) ; }
c . css ( "backgroundPosition" , tp . icon . position || "0 0" ) ;
}
} ) ;
} , this ) ) ;
}
} ,
defaults : {
// defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking)
max _children : - 1 ,
// defines the maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking)
max _depth : - 1 ,
// defines valid node types for the root nodes
valid _children : "all" ,
// whether to use $.data
use _data : false ,
// where is the type stores (the rel attribute of the LI element)
type _attr : "rel" ,
// a list of types
types : {
// the default type
"default" : {
"max_children" : - 1 ,
"max_depth" : - 1 ,
"valid_children" : "all"
// Bound functions - you can bind any other function here (using boolean or function)
//"select_node" : true
}
}
} ,
_fn : {
_types _notify : function ( n , data ) {
if ( data . type && this . _get _settings ( ) . types . use _data ) {
this . set _type ( data . type , n ) ;
}
} ,
_get _type : function ( obj ) {
obj = this . _get _node ( obj ) ;
return ( ! obj || ! obj . length ) ? false : obj . attr ( this . _get _settings ( ) . types . type _attr ) || "default" ;
} ,
set _type : function ( str , obj ) {
obj = this . _get _node ( obj ) ;
var ret = ( ! obj . length || ! str ) ? false : obj . attr ( this . _get _settings ( ) . types . type _attr , str ) ;
if ( ret ) { this . _ _callback ( { obj : obj , type : str } ) ; }
return ret ;
} ,
_check : function ( rule , obj , opts ) {
obj = this . _get _node ( obj ) ;
var v = false , t = this . _get _type ( obj ) , d = 0 , _this = this , s = this . _get _settings ( ) . types , data = false ;
if ( obj === - 1 ) {
if ( ! ! s [ rule ] ) { v = s [ rule ] ; }
else { return ; }
}
else {
if ( t === false ) { return ; }
data = s . use _data ? obj . data ( "jstree" ) : false ;
if ( data && data . types && typeof data . types [ rule ] !== "undefined" ) { v = data . types [ rule ] ; }
else if ( ! ! s . types [ t ] && typeof s . types [ t ] [ rule ] !== "undefined" ) { v = s . types [ t ] [ rule ] ; }
else if ( ! ! s . types [ "default" ] && typeof s . types [ "default" ] [ rule ] !== "undefined" ) { v = s . types [ "default" ] [ rule ] ; }
}
if ( $ . isFunction ( v ) ) { v = v . call ( this , obj ) ; }
if ( rule === "max_depth" && obj !== - 1 && opts !== false && s . max _depth !== - 2 && v !== 0 ) {
// also include the node itself - otherwise if root node it is not checked
obj . children ( "a:eq(0)" ) . parentsUntil ( ".jstree" , "li" ) . each ( function ( i ) {
// check if current depth already exceeds global tree depth
if ( s . max _depth !== - 1 && s . max _depth - ( i + 1 ) <= 0 ) { v = 0 ; return false ; }
d = ( i === 0 ) ? v : _this . _check ( rule , this , false ) ;
// check if current node max depth is already matched or exceeded
if ( d !== - 1 && d - ( i + 1 ) <= 0 ) { v = 0 ; return false ; }
// otherwise - set the max depth to the current value minus current depth
if ( d >= 0 && ( d - ( i + 1 ) < v || v < 0 ) ) { v = d - ( i + 1 ) ; }
// if the global tree depth exists and it minus the nodes calculated so far is less than `v` or `v` is unlimited
if ( s . max _depth >= 0 && ( s . max _depth - ( i + 1 ) < v || v < 0 ) ) { v = s . max _depth - ( i + 1 ) ; }
} ) ;
}
return v ;
} ,
check _move : function ( ) {
if ( ! this . _ _call _old ( ) ) { return false ; }
var m = this . _get _move ( ) ,
s = m . rt . _get _settings ( ) . types ,
mc = m . rt . _check ( "max_children" , m . cr ) ,
md = m . rt . _check ( "max_depth" , m . cr ) ,
vc = m . rt . _check ( "valid_children" , m . cr ) ,
ch = 0 , d = 1 , t ;
if ( vc === "none" ) { return false ; }
if ( $ . isArray ( vc ) && m . ot && m . ot . _get _type ) {
m . o . each ( function ( ) {
if ( $ . inArray ( m . ot . _get _type ( this ) , vc ) === - 1 ) { d = false ; return false ; }
} ) ;
if ( d === false ) { return false ; }
}
if ( s . max _children !== - 2 && mc !== - 1 ) {
ch = m . cr === - 1 ? this . get _container ( ) . find ( "> ul > li" ) . not ( m . o ) . length : m . cr . find ( "> ul > li" ) . not ( m . o ) . length ;
if ( ch + m . o . length > mc ) { return false ; }
}
if ( s . max _depth !== - 2 && md !== - 1 ) {
d = 0 ;
if ( md === 0 ) { return false ; }
if ( typeof m . o . d === "undefined" ) {
// TODO: deal with progressive rendering and async when checking max_depth (how to know the depth of the moved node)
t = m . o ;
while ( t . length > 0 ) {
t = t . find ( "> ul > li" ) ;
d ++ ;
}
m . o . d = d ;
}
if ( md - m . o . d < 0 ) { return false ; }
}
return true ;
} ,
create _node : function ( obj , position , js , callback , is _loaded , skip _check ) {
if ( ! skip _check && ( is _loaded || this . _is _loaded ( obj ) ) ) {
var p = ( typeof position == "string" && position . match ( /^before|after$/i ) && obj !== - 1 ) ? this . _get _parent ( obj ) : this . _get _node ( obj ) ,
s = this . _get _settings ( ) . types ,
mc = this . _check ( "max_children" , p ) ,
md = this . _check ( "max_depth" , p ) ,
vc = this . _check ( "valid_children" , p ) ,
ch ;
if ( typeof js === "string" ) { js = { data : js } ; }
if ( ! js ) { js = { } ; }
if ( vc === "none" ) { return false ; }
if ( $ . isArray ( vc ) ) {
if ( ! js . attr || ! js . attr [ s . type _attr ] ) {
if ( ! js . attr ) { js . attr = { } ; }
js . attr [ s . type _attr ] = vc [ 0 ] ;
}
else {
if ( $ . inArray ( js . attr [ s . type _attr ] , vc ) === - 1 ) { return false ; }
}
}
if ( s . max _children !== - 2 && mc !== - 1 ) {
ch = p === - 1 ? this . get _container ( ) . find ( "> ul > li" ) . length : p . find ( "> ul > li" ) . length ;
if ( ch + 1 > mc ) { return false ; }
}
if ( s . max _depth !== - 2 && md !== - 1 && ( md - 1 ) < 0 ) { return false ; }
}
return this . _ _call _old ( true , obj , position , js , callback , is _loaded , skip _check ) ;
}
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree HTML plugin
* The HTML data store . Datastores are build by replacing the ` load_node ` and ` _is_loaded ` functions .
* /
( function ( $ ) {
$ . jstree . plugin ( "html_data" , {
_ _init : function ( ) {
// this used to use html() and clean the whitespace, but this way any attached data was lost
this . data . html _data . original _container _html = this . get _container ( ) . find ( " > ul > li" ) . clone ( true ) ;
// remove white space from LI node - otherwise nodes appear a bit to the right
this . data . html _data . original _container _html . find ( "li" ) . andSelf ( ) . contents ( ) . filter ( function ( ) { return this . nodeType == 3 ; } ) . remove ( ) ;
} ,
defaults : {
data : false ,
ajax : false ,
correct _state : true
} ,
_fn : {
load _node : function ( obj , s _call , e _call ) { var _this = this ; this . load _node _html ( obj , function ( ) { _this . _ _callback ( { "obj" : _this . _get _node ( obj ) } ) ; s _call . call ( this ) ; } , e _call ) ; } ,
_is _loaded : function ( obj ) {
obj = this . _get _node ( obj ) ;
return obj == - 1 || ! obj || ( ! this . _get _settings ( ) . html _data . ajax && ! $ . isFunction ( this . _get _settings ( ) . html _data . data ) ) || obj . is ( ".jstree-open, .jstree-leaf" ) || obj . children ( "ul" ) . children ( "li" ) . size ( ) > 0 ;
} ,
load _node _html : function ( obj , s _call , e _call ) {
var d ,
s = this . get _settings ( ) . html _data ,
error _func = function ( ) { } ,
success _func = function ( ) { } ;
obj = this . _get _node ( obj ) ;
if ( obj && obj !== - 1 ) {
2011-10-04 12:43:47 +02:00
if ( obj . data ( "jstree_is_loading" ) ) { return ; }
else { obj . data ( "jstree_is_loading" , true ) ; }
2011-03-01 05:37:59 +01:00
}
switch ( ! 0 ) {
case ( $ . isFunction ( s . data ) ) :
s . data . call ( this , obj , $ . proxy ( function ( d ) {
if ( d && d !== "" && d . toString && d . toString ( ) . replace ( /^[\s\n]+$/ , "" ) !== "" ) {
d = $ ( d ) ;
if ( ! d . is ( "ul" ) ) { d = $ ( "<ul />" ) . append ( d ) ; }
if ( obj == - 1 || ! obj ) { this . get _container ( ) . children ( "ul" ) . empty ( ) . append ( d . children ( ) ) . find ( "li, a" ) . filter ( function ( ) { return ! this . firstChild || ! this . firstChild . tagName || this . firstChild . tagName !== "INS" ; } ) . prepend ( "<ins class='jstree-icon'> </ins>" ) . end ( ) . filter ( "a" ) . children ( "ins:first-child" ) . not ( ".jstree-icon" ) . addClass ( "jstree-icon" ) ; }
2011-10-04 12:43:47 +02:00
else { obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ; obj . append ( d ) . children ( "ul" ) . find ( "li, a" ) . filter ( function ( ) { return ! this . firstChild || ! this . firstChild . tagName || this . firstChild . tagName !== "INS" ; } ) . prepend ( "<ins class='jstree-icon'> </ins>" ) . end ( ) . filter ( "a" ) . children ( "ins:first-child" ) . not ( ".jstree-icon" ) . addClass ( "jstree-icon" ) ; obj . removeData ( "jstree_is_loading" ) ; }
2011-03-01 05:37:59 +01:00
this . clean _node ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
else {
if ( obj && obj !== - 1 ) {
obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ;
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_is_loading" ) ;
2011-03-01 05:37:59 +01:00
if ( s . correct _state ) {
this . correct _state ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
else {
if ( s . correct _state ) {
this . get _container ( ) . children ( "ul" ) . empty ( ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
}
} , this ) ) ;
break ;
case ( ! s . data && ! s . ajax ) :
if ( ! obj || obj == - 1 ) {
this . get _container ( )
. children ( "ul" ) . empty ( )
. append ( this . data . html _data . original _container _html )
. find ( "li, a" ) . filter ( function ( ) { return ! this . firstChild || ! this . firstChild . tagName || this . firstChild . tagName !== "INS" ; } ) . prepend ( "<ins class='jstree-icon'> </ins>" ) . end ( )
. filter ( "a" ) . children ( "ins:first-child" ) . not ( ".jstree-icon" ) . addClass ( "jstree-icon" ) ;
this . clean _node ( ) ;
}
if ( s _call ) { s _call . call ( this ) ; }
break ;
case ( ! ! s . data && ! s . ajax ) || ( ! ! s . data && ! ! s . ajax && ( ! obj || obj === - 1 ) ) :
if ( ! obj || obj == - 1 ) {
d = $ ( s . data ) ;
if ( ! d . is ( "ul" ) ) { d = $ ( "<ul />" ) . append ( d ) ; }
this . get _container ( )
. children ( "ul" ) . empty ( ) . append ( d . children ( ) )
. find ( "li, a" ) . filter ( function ( ) { return ! this . firstChild || ! this . firstChild . tagName || this . firstChild . tagName !== "INS" ; } ) . prepend ( "<ins class='jstree-icon'> </ins>" ) . end ( )
. filter ( "a" ) . children ( "ins:first-child" ) . not ( ".jstree-icon" ) . addClass ( "jstree-icon" ) ;
this . clean _node ( ) ;
}
if ( s _call ) { s _call . call ( this ) ; }
break ;
case ( ! s . data && ! ! s . ajax ) || ( ! ! s . data && ! ! s . ajax && obj && obj !== - 1 ) :
obj = this . _get _node ( obj ) ;
error _func = function ( x , t , e ) {
var ef = this . get _settings ( ) . html _data . ajax . error ;
if ( ef ) { ef . call ( this , x , t , e ) ; }
if ( obj != - 1 && obj . length ) {
obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ;
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_is_loading" ) ;
2011-03-01 05:37:59 +01:00
if ( t === "success" && s . correct _state ) { this . correct _state ( obj ) ; }
}
else {
if ( t === "success" && s . correct _state ) { this . get _container ( ) . children ( "ul" ) . empty ( ) ; }
}
if ( e _call ) { e _call . call ( this ) ; }
} ;
success _func = function ( d , t , x ) {
var sf = this . get _settings ( ) . html _data . ajax . success ;
if ( sf ) { d = sf . call ( this , d , t , x ) || d ; }
if ( d === "" || ( d && d . toString && d . toString ( ) . replace ( /^[\s\n]+$/ , "" ) === "" ) ) {
return error _func . call ( this , x , t , "" ) ;
}
if ( d ) {
d = $ ( d ) ;
if ( ! d . is ( "ul" ) ) { d = $ ( "<ul />" ) . append ( d ) ; }
if ( obj == - 1 || ! obj ) { this . get _container ( ) . children ( "ul" ) . empty ( ) . append ( d . children ( ) ) . find ( "li, a" ) . filter ( function ( ) { return ! this . firstChild || ! this . firstChild . tagName || this . firstChild . tagName !== "INS" ; } ) . prepend ( "<ins class='jstree-icon'> </ins>" ) . end ( ) . filter ( "a" ) . children ( "ins:first-child" ) . not ( ".jstree-icon" ) . addClass ( "jstree-icon" ) ; }
2011-10-04 12:43:47 +02:00
else { obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ; obj . append ( d ) . children ( "ul" ) . find ( "li, a" ) . filter ( function ( ) { return ! this . firstChild || ! this . firstChild . tagName || this . firstChild . tagName !== "INS" ; } ) . prepend ( "<ins class='jstree-icon'> </ins>" ) . end ( ) . filter ( "a" ) . children ( "ins:first-child" ) . not ( ".jstree-icon" ) . addClass ( "jstree-icon" ) ; obj . removeData ( "jstree_is_loading" ) ; }
2011-03-01 05:37:59 +01:00
this . clean _node ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
else {
if ( obj && obj !== - 1 ) {
obj . children ( "a.jstree-loading" ) . removeClass ( "jstree-loading" ) ;
2011-10-04 12:43:47 +02:00
obj . removeData ( "jstree_is_loading" ) ;
2011-03-01 05:37:59 +01:00
if ( s . correct _state ) {
this . correct _state ( obj ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
else {
if ( s . correct _state ) {
this . get _container ( ) . children ( "ul" ) . empty ( ) ;
if ( s _call ) { s _call . call ( this ) ; }
}
}
}
} ;
s . ajax . context = this ;
s . ajax . error = error _func ;
s . ajax . success = success _func ;
if ( ! s . ajax . dataType ) { s . ajax . dataType = "html" ; }
if ( $ . isFunction ( s . ajax . url ) ) { s . ajax . url = s . ajax . url . call ( this , obj ) ; }
if ( $ . isFunction ( s . ajax . data ) ) { s . ajax . data = s . ajax . data . call ( this , obj ) ; }
$ . ajax ( s . ajax ) ;
break ;
}
}
}
} ) ;
// include the HTML data plugin by default
$ . jstree . defaults . plugins . push ( "html_data" ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree themeroller plugin
* Adds support for jQuery UI themes . Include this at the end of your plugins list , also make sure "themes" is not included .
* /
( function ( $ ) {
$ . jstree . plugin ( "themeroller" , {
_ _init : function ( ) {
var s = this . _get _settings ( ) . themeroller ;
this . get _container ( )
. addClass ( "ui-widget-content" )
. addClass ( "jstree-themeroller" )
. delegate ( "a" , "mouseenter.jstree" , function ( e ) {
if ( ! $ ( e . currentTarget ) . hasClass ( "jstree-loading" ) ) {
$ ( this ) . addClass ( s . item _h ) ;
}
} )
. delegate ( "a" , "mouseleave.jstree" , function ( ) {
$ ( this ) . removeClass ( s . item _h ) ;
} )
. bind ( "init.jstree" , $ . proxy ( function ( e , data ) {
data . inst . get _container ( ) . find ( "> ul > li > .jstree-loading > ins" ) . addClass ( "ui-icon-refresh" ) ;
this . _themeroller ( data . inst . get _container ( ) . find ( "> ul > li" ) ) ;
} , this ) )
. bind ( "open_node.jstree create_node.jstree" , $ . proxy ( function ( e , data ) {
this . _themeroller ( data . rslt . obj ) ;
} , this ) )
. bind ( "loaded.jstree refresh.jstree" , $ . proxy ( function ( e ) {
this . _themeroller ( ) ;
} , this ) )
. bind ( "close_node.jstree" , $ . proxy ( function ( e , data ) {
this . _themeroller ( data . rslt . obj ) ;
} , this ) )
. bind ( "delete_node.jstree" , $ . proxy ( function ( e , data ) {
this . _themeroller ( data . rslt . parent ) ;
} , this ) )
. bind ( "correct_state.jstree" , $ . proxy ( function ( e , data ) {
data . rslt . obj
. children ( "ins.jstree-icon" ) . removeClass ( s . opened + " " + s . closed + " ui-icon" ) . end ( )
. find ( "> a > ins.ui-icon" )
. filter ( function ( ) {
return this . className . toString ( )
. replace ( s . item _clsd , "" ) . replace ( s . item _open , "" ) . replace ( s . item _leaf , "" )
. indexOf ( "ui-icon-" ) === - 1 ;
} ) . removeClass ( s . item _open + " " + s . item _clsd ) . addClass ( s . item _leaf || "jstree-no-icon" ) ;
} , this ) )
. bind ( "select_node.jstree" , $ . proxy ( function ( e , data ) {
data . rslt . obj . children ( "a" ) . addClass ( s . item _a ) ;
} , this ) )
. bind ( "deselect_node.jstree deselect_all.jstree" , $ . proxy ( function ( e , data ) {
this . get _container ( )
. find ( "a." + s . item _a ) . removeClass ( s . item _a ) . end ( )
. find ( "a.jstree-clicked" ) . addClass ( s . item _a ) ;
} , this ) )
. bind ( "dehover_node.jstree" , $ . proxy ( function ( e , data ) {
data . rslt . obj . children ( "a" ) . removeClass ( s . item _h ) ;
} , this ) )
. bind ( "hover_node.jstree" , $ . proxy ( function ( e , data ) {
this . get _container ( )
. find ( "a." + s . item _h ) . not ( data . rslt . obj ) . removeClass ( s . item _h ) ;
data . rslt . obj . children ( "a" ) . addClass ( s . item _h ) ;
} , this ) )
. bind ( "move_node.jstree" , $ . proxy ( function ( e , data ) {
this . _themeroller ( data . rslt . o ) ;
this . _themeroller ( data . rslt . op ) ;
} , this ) ) ;
} ,
_ _destroy : function ( ) {
var s = this . _get _settings ( ) . themeroller ,
c = [ "ui-icon" ] ;
$ . each ( s , function ( i , v ) {
v = v . split ( " " ) ;
if ( v . length ) { c = c . concat ( v ) ; }
} ) ;
this . get _container ( )
. removeClass ( "ui-widget-content" )
. find ( "." + c . join ( ", ." ) ) . removeClass ( c . join ( " " ) ) ;
} ,
_fn : {
_themeroller : function ( obj ) {
var s = this . _get _settings ( ) . themeroller ;
2011-10-04 12:43:47 +02:00
obj = ( ! obj || obj == - 1 ) ? this . get _container _ul ( ) : this . _get _node ( obj ) ;
obj = ( ! obj || obj == - 1 ) ? this . get _container _ul ( ) : obj . parent ( ) ;
2011-03-01 05:37:59 +01:00
obj
. find ( "li.jstree-closed" )
. children ( "ins.jstree-icon" ) . removeClass ( s . opened ) . addClass ( "ui-icon " + s . closed ) . end ( )
. children ( "a" ) . addClass ( s . item )
. children ( "ins.jstree-icon" ) . addClass ( "ui-icon" )
. filter ( function ( ) {
return this . className . toString ( )
. replace ( s . item _clsd , "" ) . replace ( s . item _open , "" ) . replace ( s . item _leaf , "" )
. indexOf ( "ui-icon-" ) === - 1 ;
} ) . removeClass ( s . item _leaf + " " + s . item _open ) . addClass ( s . item _clsd || "jstree-no-icon" )
. end ( )
. end ( )
. end ( )
. end ( )
. find ( "li.jstree-open" )
. children ( "ins.jstree-icon" ) . removeClass ( s . closed ) . addClass ( "ui-icon " + s . opened ) . end ( )
. children ( "a" ) . addClass ( s . item )
. children ( "ins.jstree-icon" ) . addClass ( "ui-icon" )
. filter ( function ( ) {
return this . className . toString ( )
. replace ( s . item _clsd , "" ) . replace ( s . item _open , "" ) . replace ( s . item _leaf , "" )
. indexOf ( "ui-icon-" ) === - 1 ;
} ) . removeClass ( s . item _leaf + " " + s . item _clsd ) . addClass ( s . item _open || "jstree-no-icon" )
. end ( )
. end ( )
. end ( )
. end ( )
. find ( "li.jstree-leaf" )
. children ( "ins.jstree-icon" ) . removeClass ( s . closed + " ui-icon " + s . opened ) . end ( )
. children ( "a" ) . addClass ( s . item )
. children ( "ins.jstree-icon" ) . addClass ( "ui-icon" )
. filter ( function ( ) {
return this . className . toString ( )
. replace ( s . item _clsd , "" ) . replace ( s . item _open , "" ) . replace ( s . item _leaf , "" )
. indexOf ( "ui-icon-" ) === - 1 ;
} ) . removeClass ( s . item _clsd + " " + s . item _open ) . addClass ( s . item _leaf || "jstree-no-icon" ) ;
}
} ,
defaults : {
"opened" : "ui-icon-triangle-1-se" ,
"closed" : "ui-icon-triangle-1-e" ,
"item" : "ui-state-default" ,
"item_h" : "ui-state-hover" ,
"item_a" : "ui-state-active" ,
"item_open" : "ui-icon-folder-open" ,
"item_clsd" : "ui-icon-folder-collapsed" ,
"item_leaf" : "ui-icon-document"
}
} ) ;
$ ( function ( ) {
var css _string = '' +
'.jstree-themeroller .ui-icon { overflow:visible; } ' +
'.jstree-themeroller a { padding:0 2px; } ' +
'.jstree-themeroller .jstree-no-icon { display:none; }' ;
$ . vakata . css . add _sheet ( { str : css _string , title : "jstree" } ) ;
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree unique plugin
* Forces different names amongst siblings ( still a bit experimental )
* NOTE : does not check language versions ( it will not be possible to have nodes with the same title , even in different languages )
* /
( function ( $ ) {
$ . jstree . plugin ( "unique" , {
_ _init : function ( ) {
this . get _container ( )
. bind ( "before.jstree" , $ . proxy ( function ( e , data ) {
var nms = [ ] , res = true , p , t ;
if ( data . func == "move_node" ) {
// obj, ref, position, is_copy, is_prepared, skip_check
if ( data . args [ 4 ] === true ) {
if ( data . args [ 0 ] . o && data . args [ 0 ] . o . length ) {
data . args [ 0 ] . o . children ( "a" ) . each ( function ( ) { nms . push ( $ ( this ) . text ( ) . replace ( /^\s+/g , "" ) ) ; } ) ;
res = this . _check _unique ( nms , data . args [ 0 ] . np . find ( "> ul > li" ) . not ( data . args [ 0 ] . o ) , "move_node" ) ;
}
}
}
if ( data . func == "create_node" ) {
// obj, position, js, callback, is_loaded
if ( data . args [ 4 ] || this . _is _loaded ( data . args [ 0 ] ) ) {
p = this . _get _node ( data . args [ 0 ] ) ;
if ( data . args [ 1 ] && ( data . args [ 1 ] === "before" || data . args [ 1 ] === "after" ) ) {
p = this . _get _parent ( data . args [ 0 ] ) ;
if ( ! p || p === - 1 ) { p = this . get _container ( ) ; }
}
if ( typeof data . args [ 2 ] === "string" ) { nms . push ( data . args [ 2 ] ) ; }
else if ( ! data . args [ 2 ] || ! data . args [ 2 ] . data ) { nms . push ( this . _get _string ( "new_node" ) ) ; }
else { nms . push ( data . args [ 2 ] . data ) ; }
res = this . _check _unique ( nms , p . find ( "> ul > li" ) , "create_node" ) ;
}
}
if ( data . func == "rename_node" ) {
// obj, val
nms . push ( data . args [ 1 ] ) ;
t = this . _get _node ( data . args [ 0 ] ) ;
p = this . _get _parent ( t ) ;
if ( ! p || p === - 1 ) { p = this . get _container ( ) ; }
res = this . _check _unique ( nms , p . find ( "> ul > li" ) . not ( t ) , "rename_node" ) ;
}
if ( ! res ) {
e . stopPropagation ( ) ;
return false ;
}
} , this ) ) ;
} ,
defaults : {
error _callback : $ . noop
} ,
_fn : {
_check _unique : function ( nms , p , func ) {
2011-10-04 12:43:47 +02:00
var cnms = [ ] , ok = true ;
2011-03-01 05:37:59 +01:00
p . children ( "a" ) . each ( function ( ) { cnms . push ( $ ( this ) . text ( ) . replace ( /^\s+/g , "" ) ) ; } ) ;
if ( ! cnms . length || ! nms . length ) { return true ; }
2011-10-04 12:43:47 +02:00
$ . each ( nms , function ( i , v ) {
if ( $ . inArray ( v , cnms ) !== - 1 ) {
ok = false ;
return false ;
}
} ) ;
if ( ! ok ) {
2011-03-01 05:37:59 +01:00
this . _get _settings ( ) . unique . error _callback . call ( null , nms , p , func ) ;
}
2011-10-04 12:43:47 +02:00
return ok ;
2011-03-01 05:37:59 +01:00
} ,
check _move : function ( ) {
if ( ! this . _ _call _old ( ) ) { return false ; }
var p = this . _get _move ( ) , nms = [ ] ;
if ( p . o && p . o . length ) {
p . o . children ( "a" ) . each ( function ( ) { nms . push ( $ ( this ) . text ( ) . replace ( /^\s+/g , "" ) ) ; } ) ;
return this . _check _unique ( nms , p . np . find ( "> ul > li" ) . not ( p . o ) , "check_move" ) ;
}
return true ;
}
}
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree wholerow plugin
* Makes select and hover work on the entire width of the node
* MAY BE HEAVY IN LARGE DOM
* /
( function ( $ ) {
$ . jstree . plugin ( "wholerow" , {
_ _init : function ( ) {
if ( ! this . data . ui ) { throw "jsTree wholerow: jsTree UI plugin not included." ; }
this . data . wholerow . html = false ;
this . data . wholerow . to = false ;
this . get _container ( )
. bind ( "init.jstree" , $ . proxy ( function ( e , data ) {
this . _get _settings ( ) . core . animation = 0 ;
} , this ) )
. bind ( "open_node.jstree create_node.jstree clean_node.jstree loaded.jstree" , $ . proxy ( function ( e , data ) {
this . _prepare _wholerow _span ( data && data . rslt && data . rslt . obj ? data . rslt . obj : - 1 ) ;
} , this ) )
. bind ( "search.jstree clear_search.jstree reopen.jstree after_open.jstree after_close.jstree create_node.jstree delete_node.jstree clean_node.jstree" , $ . proxy ( function ( e , data ) {
if ( this . data . to ) { clearTimeout ( this . data . to ) ; }
this . data . to = setTimeout ( ( function ( t , o ) { return function ( ) { t . _prepare _wholerow _ul ( o ) ; } ; } ) ( this , data && data . rslt && data . rslt . obj ? data . rslt . obj : - 1 ) , 0 ) ;
} , this ) )
. bind ( "deselect_all.jstree" , $ . proxy ( function ( e , data ) {
this . get _container ( ) . find ( " > .jstree-wholerow .jstree-clicked" ) . removeClass ( "jstree-clicked " + ( this . data . themeroller ? this . _get _settings ( ) . themeroller . item _a : "" ) ) ;
} , this ) )
. bind ( "select_node.jstree deselect_node.jstree " , $ . proxy ( function ( e , data ) {
data . rslt . obj . each ( function ( ) {
var ref = data . inst . get _container ( ) . find ( " > .jstree-wholerow li:visible:eq(" + ( parseInt ( ( ( $ ( this ) . offset ( ) . top - data . inst . get _container ( ) . offset ( ) . top + data . inst . get _container ( ) [ 0 ] . scrollTop ) / data . inst . data . core . li _height ) , 10 ) ) + ")" ) ;
// ref.children("a")[e.type === "select_node" ? "addClass" : "removeClass"]("jstree-clicked");
ref . children ( "a" ) . attr ( "class" , data . rslt . obj . children ( "a" ) . attr ( "class" ) ) ;
} ) ;
} , this ) )
. bind ( "hover_node.jstree dehover_node.jstree" , $ . proxy ( function ( e , data ) {
this . get _container ( ) . find ( " > .jstree-wholerow .jstree-hovered" ) . removeClass ( "jstree-hovered " + ( this . data . themeroller ? this . _get _settings ( ) . themeroller . item _h : "" ) ) ;
if ( e . type === "hover_node" ) {
var ref = this . get _container ( ) . find ( " > .jstree-wholerow li:visible:eq(" + ( parseInt ( ( ( data . rslt . obj . offset ( ) . top - this . get _container ( ) . offset ( ) . top + this . get _container ( ) [ 0 ] . scrollTop ) / this . data . core . li _height ) , 10 ) ) + ")" ) ;
// ref.children("a").addClass("jstree-hovered");
ref . children ( "a" ) . attr ( "class" , data . rslt . obj . children ( ".jstree-hovered" ) . attr ( "class" ) ) ;
}
} , this ) )
. delegate ( ".jstree-wholerow-span, ins.jstree-icon, li" , "click.jstree" , function ( e ) {
var n = $ ( e . currentTarget ) ;
if ( e . target . tagName === "A" || ( e . target . tagName === "INS" && n . closest ( "li" ) . is ( ".jstree-open, .jstree-closed" ) ) ) { return ; }
n . closest ( "li" ) . children ( "a:visible:eq(0)" ) . click ( ) ;
e . stopImmediatePropagation ( ) ;
} )
. delegate ( "li" , "mouseover.jstree" , $ . proxy ( function ( e ) {
e . stopImmediatePropagation ( ) ;
if ( $ ( e . currentTarget ) . children ( ".jstree-hovered, .jstree-clicked" ) . length ) { return false ; }
this . hover _node ( e . currentTarget ) ;
return false ;
} , this ) )
. delegate ( "li" , "mouseleave.jstree" , $ . proxy ( function ( e ) {
if ( $ ( e . currentTarget ) . children ( "a" ) . hasClass ( "jstree-hovered" ) . length ) { return ; }
this . dehover _node ( e . currentTarget ) ;
} , this ) ) ;
if ( is _ie7 || is _ie6 ) {
$ . vakata . css . add _sheet ( { str : ".jstree-" + this . get _index ( ) + " { position:relative; } " , title : "jstree" } ) ;
}
} ,
defaults : {
} ,
_ _destroy : function ( ) {
this . get _container ( ) . children ( ".jstree-wholerow" ) . remove ( ) ;
this . get _container ( ) . find ( ".jstree-wholerow-span" ) . remove ( ) ;
} ,
_fn : {
_prepare _wholerow _span : function ( obj ) {
obj = ! obj || obj == - 1 ? this . get _container ( ) . find ( "> ul > li" ) : this . _get _node ( obj ) ;
if ( obj === false ) { return ; } // added for removing root nodes
obj . each ( function ( ) {
$ ( this ) . find ( "li" ) . andSelf ( ) . each ( function ( ) {
var $t = $ ( this ) ;
if ( $t . children ( ".jstree-wholerow-span" ) . length ) { return true ; }
$t . prepend ( "<span class='jstree-wholerow-span' style='width:" + ( $t . parentsUntil ( ".jstree" , "li" ) . length * 18 ) + "px;'> </span>" ) ;
} ) ;
} ) ;
} ,
_prepare _wholerow _ul : function ( ) {
var o = this . get _container ( ) . children ( "ul" ) . eq ( 0 ) , h = o . html ( ) ;
o . addClass ( "jstree-wholerow-real" ) ;
if ( this . data . wholerow . last _html !== h ) {
this . data . wholerow . last _html = h ;
this . get _container ( ) . children ( ".jstree-wholerow" ) . remove ( ) ;
this . get _container ( ) . append (
o . clone ( ) . removeClass ( "jstree-wholerow-real" )
. wrapAll ( "<div class='jstree-wholerow' />" ) . parent ( )
. width ( o . parent ( ) [ 0 ] . scrollWidth )
. css ( "top" , ( o . height ( ) + ( is _ie7 ? 5 : 0 ) ) * - 1 )
. find ( "li[id]" ) . each ( function ( ) { this . removeAttribute ( "id" ) ; } ) . end ( )
) ;
}
}
}
} ) ;
$ ( function ( ) {
var css _string = '' +
'.jstree .jstree-wholerow-real { position:relative; z-index:1; } ' +
'.jstree .jstree-wholerow-real li { cursor:pointer; } ' +
'.jstree .jstree-wholerow-real a { border-left-color:transparent !important; border-right-color:transparent !important; } ' +
'.jstree .jstree-wholerow { position:relative; z-index:0; height:0; } ' +
'.jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { width:100%; } ' +
'.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li, .jstree .jstree-wholerow a { margin:0 !important; padding:0 !important; } ' +
'.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { background:transparent !important; }' +
'.jstree .jstree-wholerow ins, .jstree .jstree-wholerow span, .jstree .jstree-wholerow input { display:none !important; }' +
'.jstree .jstree-wholerow a, .jstree .jstree-wholerow a:hover { text-indent:-9999px; !important; width:100%; padding:0 !important; border-right-width:0px !important; border-left-width:0px !important; } ' +
'.jstree .jstree-wholerow-span { position:absolute; left:0; margin:0px; padding:0; height:18px; border-width:0; padding:0; z-index:0; }' ;
if ( is _ff2 ) {
css _string += '' +
'.jstree .jstree-wholerow a { display:block; height:18px; margin:0; padding:0; border:0; } ' +
'.jstree .jstree-wholerow-real a { border-color:transparent !important; } ' ;
}
if ( is _ie7 || is _ie6 ) {
css _string += '' +
'.jstree .jstree-wholerow, .jstree .jstree-wholerow li, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow a { margin:0; padding:0; line-height:18px; } ' +
'.jstree .jstree-wholerow a { display:block; height:18px; line-height:18px; overflow:hidden; } ' ;
}
$ . vakata . css . add _sheet ( { str : css _string , title : "jstree" } ) ;
} ) ;
} ) ( jQuery ) ;
//*/
/ *
* jsTree model plugin
* This plugin gets jstree to use a class model to retrieve data , creating great dynamism
* /
( function ( $ ) {
var nodeInterface = [ "getChildren" , "getChildrenCount" , "getAttr" , "getName" , "getProps" ] ,
validateInterface = function ( obj , inter ) {
var valid = true ;
obj = obj || { } ;
inter = [ ] . concat ( inter ) ;
$ . each ( inter , function ( i , v ) {
if ( ! $ . isFunction ( obj [ v ] ) ) { valid = false ; return false ; }
} ) ;
return valid ;
} ;
$ . jstree . plugin ( "model" , {
_ _init : function ( ) {
if ( ! this . data . json _data ) { throw "jsTree model: jsTree json_data plugin not included." ; }
this . _get _settings ( ) . json _data . data = function ( n , b ) {
var obj = ( n == - 1 ) ? this . _get _settings ( ) . model . object : n . data ( "jstree_model" ) ;
if ( ! validateInterface ( obj , nodeInterface ) ) { return b . call ( null , false ) ; }
if ( this . _get _settings ( ) . model . async ) {
obj . getChildren ( $ . proxy ( function ( data ) {
this . model _done ( data , b ) ;
} , this ) ) ;
}
else {
this . model _done ( obj . getChildren ( ) , b ) ;
}
} ;
} ,
defaults : {
object : false ,
id _prefix : false ,
async : false
} ,
_fn : {
model _done : function ( data , callback ) {
var ret = [ ] ,
s = this . _get _settings ( ) ,
_this = this ;
if ( ! $ . isArray ( data ) ) { data = [ data ] ; }
$ . each ( data , function ( i , nd ) {
var r = nd . getProps ( ) || { } ;
r . attr = nd . getAttr ( ) || { } ;
if ( nd . getChildrenCount ( ) ) { r . state = "closed" ; }
r . data = nd . getName ( ) ;
if ( ! $ . isArray ( r . data ) ) { r . data = [ r . data ] ; }
if ( _this . data . types && $ . isFunction ( nd . getType ) ) {
r . attr [ s . types . type _attr ] = nd . getType ( ) ;
}
if ( r . attr . id && s . model . id _prefix ) { r . attr . id = s . model . id _prefix + r . attr . id ; }
if ( ! r . metadata ) { r . metadata = { } ; }
r . metadata . jstree _model = nd ;
ret . push ( r ) ;
} ) ;
callback . call ( null , ret ) ;
}
}
} ) ;
} ) ( jQuery ) ;
//*/
} ) ( ) ;