1jQuery.fn.explorerTree = function(opts){
2	var $ = jQuery;
3	$(this).each(function(){
4		var tree_opts = $.extend({onselect:null},opts||{}), $tree_root = $(this), tree_selected = opts.current||':', selected_class = tree_opts.classname+"_selecter", dbcl = {id: null, TO: null, clicks: 0},
5		setselected = function(){
6			if ($(this).data('itemid') != tree_selected){
7				var $elem = $(this),
8					is_ns = $elem.is('.folder>.li>a'),
9				    ajax_call = (is_ns && tree_opts.onselectns === true) ||  (!is_ns && tree_opts.onselectpage === true),
10				    function_call = (is_ns && typeof tree_opts.onselectnsjs === 'function' ? tree_opts.onselectnsjs : undefined) ||  (!is_ns && typeof tree_opts.onselectpagejs === 'function' ? tree_opts.onselectpagejs : undefined) || null;
11				$tree_root.find('.'+selected_class).removeClass(selected_class);
12				$elem.addClass(selected_class);
13				tree_selected = $elem.data('itemid');
14				$tree_root.trigger('tree_selected',[$elem.data('itemid'),$elem,$tree_root]);
15				if (ajax_call){
16					$.post(DOKU_BASE + 'lib/exe/ajax.php',
17						{ call:'plugin_explorertree', operation: 'callback', event: is_ns ? 'ns_selected_cb':'page_selected_cb', loader: tree_opts.loader, route: tree_opts.route, sectok: tree_opts.token,itemid:$elem.data('itemid') },
18						function(r){
19							if (r.token) tree_opts.token = r.token;
20							if (r.error) alert(r.msg);
21							if (r.func){
22								try{
23									var f = window[r.func];
24									if (typeof f === 'function')
25										f.apply(null,r.args||[]);
26								}catch(e){
27									alert(e);
28								}
29							}else if (r.msg){
30								alert(r.msg);
31							}
32						}
33					);
34				}
35				if (function_call){
36					function_call.apply(null,[$elem.data('itemid'),$elem,$tree_root]);
37				}
38				$tree_root.trigger('tree_selected_'+(is_ns?'ns':'page'),[$elem.data('itemid'),$elem,$tree_root]);
39			}
40			return true;
41		},
42		setselectednodblclick = function(e){
43			var id = $(this).data('itemid'), $elem = this;
44			if (dbcl.id != id){
45				dbcl.clicks = 0;
46				dbcl.id = id;
47				dbcl.TO = null;
48			}
49			dbcl.clicks++;
50			if(dbcl.clicks == 1) {
51				dbcl.TO = setTimeout(function(){
52					if (dbcl.id == id){
53						var c = dbcl.clicks;
54						dbcl.clicks = 0;
55						if(c == 1){
56							setselected.call($elem);	// on singleclick
57						}
58					}
59				},500);
60			}
61			if (dbcl.clicks == 2){
62				clearTimeout(dbcl.TO);
63				dbcl.clicks = 0;
64			}
65		},
66		foldinghandler = function(e){
67			if (!$(e.target).is($('>.li',this)) && !$(e.target).is($('>.li>a',this))) return true;
68			var $elem = $(this);
69			if ($(this).hasClass('open')){
70				$(this).removeClass('open loading').addClass('closed'); return false;
71				$tree_root.trigger('tree_folder_closed',[$elem.data('itemid'),$elem,$tree_root]);
72			}
73			$(this).removeClass('closed').addClass('open');
74			$tree_root.trigger('tree_folder_open',[$elem.data('itemid'),$elem,$tree_root]);
75			if (!$elem.has('>ul.'+tree_opts.classname).length){
76				$(this).addClass('loading');
77				$.post(DOKU_BASE + 'lib/exe/ajax.php',
78					{call: 'plugin_explorertree',operation:'explorertree_branch',itemid:$elem.data('itemid'), loader: tree_opts.loader, route: tree_opts.route, sectok: tree_opts.token},
79					function(r){
80						if (r.token) tree_opts.token = r.token;
81						if (r.error) {alert(r.msg); return;}
82						$elem.append(r.html).removeClass('loading');
83						$tree_root.trigger('tree_folder_open_ready',[$elem.data('itemid'),$elem,$tree_root]);
84					}
85				);
86			}else{
87				$tree_root.trigger('tree_folder_open_ready',[$elem.data('itemid'),$elem,$tree_root]);
88			}
89			return false;
90		};
91		$(this).on('click','.li>a',setselectednodblclick);
92		$(this).on('dblclick','.folder',foldinghandler);
93	});
94
95};
96
97