CLIENT GUI Framework
[vnfsdk/refrepo.git] / portal-common / src / main / webapp / framework / browser / thirdparty / js / tree.jquery.js
1 /*\r
2  JqTree 1.3.6\r
3 \r
4  Copyright 2015 Marco Braak\r
5 \r
6  Licensed under the Apache License, Version 2.0 (the "License");\r
7  you may not use this file except in compliance with the License.\r
8  You may obtain a copy of the License at\r
9 \r
10  http://www.apache.org/licenses/LICENSE-2.0\r
11 \r
12  Unless required by applicable law or agreed to in writing, software\r
13  distributed under the License is distributed on an "AS IS" BASIS,\r
14  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
15  See the License for the specific language governing permissions and\r
16  limitations under the License.\r
17  */\r
18 (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r
19     var $, DragAndDropHandler, DragElement, HitAreasGenerator, Position, VisibleNodeIterator, node_module, util,\r
20         extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\r
21         hasProp = {}.hasOwnProperty;\r
22 \r
23     node_module = require('./node');\r
24 \r
25     util = require('./util');\r
26 \r
27     Position = node_module.Position;\r
28 \r
29     $ = jQuery;\r
30 \r
31     DragAndDropHandler = (function() {\r
32         function DragAndDropHandler(tree_widget) {\r
33             this.tree_widget = tree_widget;\r
34             this.hovered_area = null;\r
35             this.$ghost = null;\r
36             this.hit_areas = [];\r
37             this.is_dragging = false;\r
38             this.current_item = null;\r
39         }\r
40 \r
41         DragAndDropHandler.prototype.mouseCapture = function(position_info) {\r
42             var $element, node_element;\r
43             $element = $(position_info.target);\r
44             if (!this.mustCaptureElement($element)) {\r
45                 return null;\r
46             }\r
47             if (this.tree_widget.options.onIsMoveHandle && !this.tree_widget.options.onIsMoveHandle($element)) {\r
48                 return null;\r
49             }\r
50             node_element = this.tree_widget._getNodeElement($element);\r
51             if (node_element && this.tree_widget.options.onCanMove) {\r
52                 if (!this.tree_widget.options.onCanMove(node_element.node)) {\r
53                     node_element = null;\r
54                 }\r
55             }\r
56             this.current_item = node_element;\r
57             return this.current_item !== null;\r
58         };\r
59 \r
60         DragAndDropHandler.prototype.mouseStart = function(position_info) {\r
61             var node, node_name, offset;\r
62             this.refresh();\r
63             offset = $(position_info.target).offset();\r
64             node = this.current_item.node;\r
65             if (this.tree_widget.options.autoEscape) {\r
66                 node_name = util.html_escape(node.name);\r
67             } else {\r
68                 node_name = node.name;\r
69             }\r
70             this.drag_element = new DragElement(node_name, position_info.page_x - offset.left, position_info.page_y - offset.top, this.tree_widget.element);\r
71             this.is_dragging = true;\r
72             this.current_item.$element.addClass('jqtree-moving');\r
73             return true;\r
74         };\r
75 \r
76         DragAndDropHandler.prototype.mouseDrag = function(position_info) {\r
77             var area, can_move_to;\r
78             this.drag_element.move(position_info.page_x, position_info.page_y);\r
79             area = this.findHoveredArea(position_info.page_x, position_info.page_y);\r
80             can_move_to = this.canMoveToArea(area);\r
81             if (can_move_to && area) {\r
82                 if (!area.node.isFolder()) {\r
83                     this.stopOpenFolderTimer();\r
84                 }\r
85                 if (this.hovered_area !== area) {\r
86                     this.hovered_area = area;\r
87                     if (this.mustOpenFolderTimer(area)) {\r
88                         this.startOpenFolderTimer(area.node);\r
89                     } else {\r
90                         this.stopOpenFolderTimer();\r
91                     }\r
92                     this.updateDropHint();\r
93                 }\r
94             } else {\r
95                 this.removeHover();\r
96                 this.removeDropHint();\r
97                 this.stopOpenFolderTimer();\r
98             }\r
99             if (!area) {\r
100                 if (this.tree_widget.options.onDragMove != null) {\r
101                     this.tree_widget.options.onDragMove(this.current_item.node, position_info.original_event);\r
102                 }\r
103             }\r
104             return true;\r
105         };\r
106 \r
107         DragAndDropHandler.prototype.mustCaptureElement = function($element) {\r
108             return !$element.is('input,select,textarea');\r
109         };\r
110 \r
111         DragAndDropHandler.prototype.canMoveToArea = function(area) {\r
112             var position_name;\r
113             if (!area) {\r
114                 return false;\r
115             } else if (this.tree_widget.options.onCanMoveTo) {\r
116                 position_name = Position.getName(area.position);\r
117                 return this.tree_widget.options.onCanMoveTo(this.current_item.node, area.node, position_name);\r
118             } else {\r
119                 return true;\r
120             }\r
121         };\r
122 \r
123         DragAndDropHandler.prototype.mouseStop = function(position_info) {\r
124             var current_item;\r
125             this.moveItem(position_info);\r
126             this.clear();\r
127             this.removeHover();\r
128             this.removeDropHint();\r
129             this.removeHitAreas();\r
130             current_item = this.current_item;\r
131             if (this.current_item) {\r
132                 this.current_item.$element.removeClass('jqtree-moving');\r
133                 this.current_item = null;\r
134             }\r
135             this.is_dragging = false;\r
136             if (!this.hovered_area && current_item) {\r
137                 if (this.tree_widget.options.onDragStop != null) {\r
138                     this.tree_widget.options.onDragStop(current_item.node, position_info.original_event);\r
139                 }\r
140             }\r
141             return false;\r
142         };\r
143 \r
144         DragAndDropHandler.prototype.refresh = function() {\r
145             this.removeHitAreas();\r
146             if (this.current_item) {\r
147                 this.generateHitAreas();\r
148                 this.current_item = this.tree_widget._getNodeElementForNode(this.current_item.node);\r
149                 if (this.is_dragging) {\r
150                     return this.current_item.$element.addClass('jqtree-moving');\r
151                 }\r
152             }\r
153         };\r
154 \r
155         DragAndDropHandler.prototype.removeHitAreas = function() {\r
156             return this.hit_areas = [];\r
157         };\r
158 \r
159         DragAndDropHandler.prototype.clear = function() {\r
160             this.drag_element.remove();\r
161             return this.drag_element = null;\r
162         };\r
163 \r
164         DragAndDropHandler.prototype.removeDropHint = function() {\r
165             if (this.previous_ghost) {\r
166                 return this.previous_ghost.remove();\r
167             }\r
168         };\r
169 \r
170         DragAndDropHandler.prototype.removeHover = function() {\r
171             return this.hovered_area = null;\r
172         };\r
173 \r
174         DragAndDropHandler.prototype.generateHitAreas = function() {\r
175             var hit_areas_generator;\r
176             hit_areas_generator = new HitAreasGenerator(this.tree_widget.tree, this.current_item.node, this.getTreeDimensions().bottom);\r
177             return this.hit_areas = hit_areas_generator.generate();\r
178         };\r
179 \r
180         DragAndDropHandler.prototype.findHoveredArea = function(x, y) {\r
181             var area, dimensions, high, low, mid;\r
182             dimensions = this.getTreeDimensions();\r
183             if (x < dimensions.left || y < dimensions.top || x > dimensions.right || y > dimensions.bottom) {\r
184                 return null;\r
185             }\r
186             low = 0;\r
187             high = this.hit_areas.length;\r
188             while (low < high) {\r
189                 mid = (low + high) >> 1;\r
190                 area = this.hit_areas[mid];\r
191                 if (y < area.top) {\r
192                     high = mid;\r
193                 } else if (y > area.bottom) {\r
194                     low = mid + 1;\r
195                 } else {\r
196                     return area;\r
197                 }\r
198             }\r
199             return null;\r
200         };\r
201 \r
202         DragAndDropHandler.prototype.mustOpenFolderTimer = function(area) {\r
203             var node;\r
204             node = area.node;\r
205             return node.isFolder() && !node.is_open && area.position === Position.INSIDE;\r
206         };\r
207 \r
208         DragAndDropHandler.prototype.updateDropHint = function() {\r
209             var node_element;\r
210             if (!this.hovered_area) {\r
211                 return;\r
212             }\r
213             this.removeDropHint();\r
214             node_element = this.tree_widget._getNodeElementForNode(this.hovered_area.node);\r
215             return this.previous_ghost = node_element.addDropHint(this.hovered_area.position);\r
216         };\r
217 \r
218         DragAndDropHandler.prototype.startOpenFolderTimer = function(folder) {\r
219             var openFolder;\r
220             openFolder = (function(_this) {\r
221                 return function() {\r
222                     return _this.tree_widget._openNode(folder, _this.tree_widget.options.slide, function() {\r
223                         _this.refresh();\r
224                         return _this.updateDropHint();\r
225                     });\r
226                 };\r
227             })(this);\r
228             this.stopOpenFolderTimer();\r
229             return this.open_folder_timer = setTimeout(openFolder, this.tree_widget.options.openFolderDelay);\r
230         };\r
231 \r
232         DragAndDropHandler.prototype.stopOpenFolderTimer = function() {\r
233             if (this.open_folder_timer) {\r
234                 clearTimeout(this.open_folder_timer);\r
235                 return this.open_folder_timer = null;\r
236             }\r
237         };\r
238 \r
239         DragAndDropHandler.prototype.moveItem = function(position_info) {\r
240             var doMove, event, moved_node, position, previous_parent, target_node;\r
241             if (this.hovered_area && this.hovered_area.position !== Position.NONE && this.canMoveToArea(this.hovered_area)) {\r
242                 moved_node = this.current_item.node;\r
243                 target_node = this.hovered_area.node;\r
244                 position = this.hovered_area.position;\r
245                 previous_parent = moved_node.parent;\r
246                 if (position === Position.INSIDE) {\r
247                     this.hovered_area.node.is_open = true;\r
248                 }\r
249                 doMove = (function(_this) {\r
250                     return function() {\r
251                         _this.tree_widget.tree.moveNode(moved_node, target_node, position);\r
252                         _this.tree_widget.element.empty();\r
253                         return _this.tree_widget._refreshElements();\r
254                     };\r
255                 })(this);\r
256                 event = this.tree_widget._triggerEvent('tree.move', {\r
257                     move_info: {\r
258                         moved_node: moved_node,\r
259                         target_node: target_node,\r
260                         position: Position.getName(position),\r
261                         previous_parent: previous_parent,\r
262                         do_move: doMove,\r
263                         original_event: position_info.original_event\r
264                     }\r
265                 });\r
266                 if (!event.isDefaultPrevented()) {\r
267                     return doMove();\r
268                 }\r
269             }\r
270         };\r
271 \r
272         DragAndDropHandler.prototype.getTreeDimensions = function() {\r
273             var offset;\r
274             offset = this.tree_widget.element.offset();\r
275             return {\r
276                 left: offset.left,\r
277                 top: offset.top,\r
278                 right: offset.left + this.tree_widget.element.width(),\r
279                 bottom: offset.top + this.tree_widget.element.height() + 16\r
280             };\r
281         };\r
282 \r
283         return DragAndDropHandler;\r
284 \r
285     })();\r
286 \r
287     VisibleNodeIterator = (function() {\r
288         function VisibleNodeIterator(tree) {\r
289             this.tree = tree;\r
290         }\r
291 \r
292         VisibleNodeIterator.prototype.iterate = function() {\r
293             var _iterateNode, is_first_node;\r
294             is_first_node = true;\r
295             _iterateNode = (function(_this) {\r
296                 return function(node, next_node) {\r
297                     var $element, child, children_length, i, j, len, must_iterate_inside, ref;\r
298                     must_iterate_inside = (node.is_open || !node.element) && node.hasChildren();\r
299                     if (node.element) {\r
300                         $element = $(node.element);\r
301                         if (!$element.is(':visible')) {\r
302                             return;\r
303                         }\r
304                         if (is_first_node) {\r
305                             _this.handleFirstNode(node, $element);\r
306                             is_first_node = false;\r
307                         }\r
308                         if (!node.hasChildren()) {\r
309                             _this.handleNode(node, next_node, $element);\r
310                         } else if (node.is_open) {\r
311                             if (!_this.handleOpenFolder(node, $element)) {\r
312                                 must_iterate_inside = false;\r
313                             }\r
314                         } else {\r
315                             _this.handleClosedFolder(node, next_node, $element);\r
316                         }\r
317                     }\r
318                     if (must_iterate_inside) {\r
319                         children_length = node.children.length;\r
320                         ref = node.children;\r
321                         for (i = j = 0, len = ref.length; j < len; i = ++j) {\r
322                             child = ref[i];\r
323                             if (i === (children_length - 1)) {\r
324                                 _iterateNode(node.children[i], null);\r
325                             } else {\r
326                                 _iterateNode(node.children[i], node.children[i + 1]);\r
327                             }\r
328                         }\r
329                         if (node.is_open) {\r
330                             return _this.handleAfterOpenFolder(node, next_node, $element);\r
331                         }\r
332                     }\r
333                 };\r
334             })(this);\r
335             return _iterateNode(this.tree, null);\r
336         };\r
337 \r
338         VisibleNodeIterator.prototype.handleNode = function(node, next_node, $element) {};\r
339 \r
340         VisibleNodeIterator.prototype.handleOpenFolder = function(node, $element) {};\r
341 \r
342         VisibleNodeIterator.prototype.handleClosedFolder = function(node, next_node, $element) {};\r
343 \r
344         VisibleNodeIterator.prototype.handleAfterOpenFolder = function(node, next_node, $element) {};\r
345 \r
346         VisibleNodeIterator.prototype.handleFirstNode = function(node, $element) {};\r
347 \r
348         return VisibleNodeIterator;\r
349 \r
350     })();\r
351 \r
352     HitAreasGenerator = (function(superClass) {\r
353         extend(HitAreasGenerator, superClass);\r
354 \r
355         function HitAreasGenerator(tree, current_node, tree_bottom) {\r
356             HitAreasGenerator.__super__.constructor.call(this, tree);\r
357             this.current_node = current_node;\r
358             this.tree_bottom = tree_bottom;\r
359         }\r
360 \r
361         HitAreasGenerator.prototype.generate = function() {\r
362             this.positions = [];\r
363             this.last_top = 0;\r
364             this.iterate();\r
365             return this.generateHitAreas(this.positions);\r
366         };\r
367 \r
368         HitAreasGenerator.prototype.getTop = function($element) {\r
369             return $element.offset().top;\r
370         };\r
371 \r
372         HitAreasGenerator.prototype.addPosition = function(node, position, top) {\r
373             var area;\r
374             area = {\r
375                 top: top,\r
376                 node: node,\r
377                 position: position\r
378             };\r
379             this.positions.push(area);\r
380             return this.last_top = top;\r
381         };\r
382 \r
383         HitAreasGenerator.prototype.handleNode = function(node, next_node, $element) {\r
384             var top;\r
385             top = this.getTop($element);\r
386             if (node === this.current_node) {\r
387                 this.addPosition(node, Position.NONE, top);\r
388             } else {\r
389                 this.addPosition(node, Position.INSIDE, top);\r
390             }\r
391             if (next_node === this.current_node || node === this.current_node) {\r
392                 return this.addPosition(node, Position.NONE, top);\r
393             } else {\r
394                 return this.addPosition(node, Position.AFTER, top);\r
395             }\r
396         };\r
397 \r
398         HitAreasGenerator.prototype.handleOpenFolder = function(node, $element) {\r
399             if (node === this.current_node) {\r
400                 return false;\r
401             }\r
402             if (node.children[0] !== this.current_node) {\r
403                 this.addPosition(node, Position.INSIDE, this.getTop($element));\r
404             }\r
405             return true;\r
406         };\r
407 \r
408         HitAreasGenerator.prototype.handleClosedFolder = function(node, next_node, $element) {\r
409             var top;\r
410             top = this.getTop($element);\r
411             if (node === this.current_node) {\r
412                 return this.addPosition(node, Position.NONE, top);\r
413             } else {\r
414                 this.addPosition(node, Position.INSIDE, top);\r
415                 if (next_node !== this.current_node) {\r
416                     return this.addPosition(node, Position.AFTER, top);\r
417                 }\r
418             }\r
419         };\r
420 \r
421         HitAreasGenerator.prototype.handleFirstNode = function(node, $element) {\r
422             if (node !== this.current_node) {\r
423                 return this.addPosition(node, Position.BEFORE, this.getTop($(node.element)));\r
424             }\r
425         };\r
426 \r
427         HitAreasGenerator.prototype.handleAfterOpenFolder = function(node, next_node, $element) {\r
428             if (node === this.current_node.node || next_node === this.current_node.node) {\r
429                 return this.addPosition(node, Position.NONE, this.last_top);\r
430             } else {\r
431                 return this.addPosition(node, Position.AFTER, this.last_top);\r
432             }\r
433         };\r
434 \r
435         HitAreasGenerator.prototype.generateHitAreas = function(positions) {\r
436             var group, hit_areas, j, len, position, previous_top;\r
437             previous_top = -1;\r
438             group = [];\r
439             hit_areas = [];\r
440             for (j = 0, len = positions.length; j < len; j++) {\r
441                 position = positions[j];\r
442                 if (position.top !== previous_top && group.length) {\r
443                     if (group.length) {\r
444                         this.generateHitAreasForGroup(hit_areas, group, previous_top, position.top);\r
445                     }\r
446                     previous_top = position.top;\r
447                     group = [];\r
448                 }\r
449                 group.push(position);\r
450             }\r
451             this.generateHitAreasForGroup(hit_areas, group, previous_top, this.tree_bottom);\r
452             return hit_areas;\r
453         };\r
454 \r
455         HitAreasGenerator.prototype.generateHitAreasForGroup = function(hit_areas, positions_in_group, top, bottom) {\r
456             var area_height, area_top, i, position, position_count;\r
457             position_count = Math.min(positions_in_group.length, 4);\r
458             area_height = Math.round((bottom - top) / position_count);\r
459             area_top = top;\r
460             i = 0;\r
461             while (i < position_count) {\r
462                 position = positions_in_group[i];\r
463                 hit_areas.push({\r
464                     top: area_top,\r
465                     bottom: area_top + area_height,\r
466                     node: position.node,\r
467                     position: position.position\r
468                 });\r
469                 area_top += area_height;\r
470                 i += 1;\r
471             }\r
472             return null;\r
473         };\r
474 \r
475         return HitAreasGenerator;\r
476 \r
477     })(VisibleNodeIterator);\r
478 \r
479     DragElement = (function() {\r
480         function DragElement(node_name, offset_x, offset_y, $tree) {\r
481             this.offset_x = offset_x;\r
482             this.offset_y = offset_y;\r
483             this.$element = $("<span class=\"jqtree-title jqtree-dragging\">" + node_name + "</span>");\r
484             this.$element.css("position", "absolute");\r
485             $tree.append(this.$element);\r
486         }\r
487 \r
488         DragElement.prototype.move = function(page_x, page_y) {\r
489             return this.$element.offset({\r
490                 left: page_x - this.offset_x,\r
491                 top: page_y - this.offset_y\r
492             });\r
493         };\r
494 \r
495         DragElement.prototype.remove = function() {\r
496             return this.$element.remove();\r
497         };\r
498 \r
499         return DragElement;\r
500 \r
501     })();\r
502 \r
503     module.exports = {\r
504         DragAndDropHandler: DragAndDropHandler,\r
505         DragElement: DragElement,\r
506         HitAreasGenerator: HitAreasGenerator\r
507     };\r
508 \r
509 },{"./node":5,"./util":12}],2:[function(require,module,exports){\r
510     var $, ElementsRenderer, NodeElement, html_escape, node_element, util;\r
511 \r
512     node_element = require('./node_element');\r
513 \r
514     NodeElement = node_element.NodeElement;\r
515 \r
516     util = require('./util');\r
517 \r
518     html_escape = util.html_escape;\r
519 \r
520     $ = jQuery;\r
521 \r
522     ElementsRenderer = (function() {\r
523         function ElementsRenderer(tree_widget) {\r
524             this.tree_widget = tree_widget;\r
525             this.opened_icon_element = this.createButtonElement(tree_widget.options.openedIcon);\r
526             this.closed_icon_element = this.createButtonElement(tree_widget.options.closedIcon);\r
527         }\r
528 \r
529         ElementsRenderer.prototype.render = function(from_node) {\r
530             if (from_node && from_node.parent) {\r
531                 return this.renderFromNode(from_node);\r
532             } else {\r
533                 return this.renderFromRoot();\r
534             }\r
535         };\r
536 \r
537         ElementsRenderer.prototype.renderFromRoot = function() {\r
538             var $element;\r
539             $element = this.tree_widget.element;\r
540             $element.empty();\r
541             return this.createDomElements($element[0], this.tree_widget.tree.children, true, true, 1);\r
542         };\r
543 \r
544         ElementsRenderer.prototype.renderFromNode = function(node) {\r
545             var $previous_li, li;\r
546             $previous_li = $(node.element);\r
547             li = this.createLi(node, node.getLevel());\r
548             this.attachNodeData(node, li);\r
549             $previous_li.after(li);\r
550             $previous_li.remove();\r
551             if (node.children) {\r
552                 return this.createDomElements(li, node.children, false, false, node.getLevel() + 1);\r
553             }\r
554         };\r
555 \r
556         ElementsRenderer.prototype.createDomElements = function(element, children, is_root_node, is_open, level) {\r
557             var child, i, len, li, ul;\r
558             ul = this.createUl(is_root_node);\r
559             element.appendChild(ul);\r
560             for (i = 0, len = children.length; i < len; i++) {\r
561                 child = children[i];\r
562                 li = this.createLi(child, level);\r
563                 ul.appendChild(li);\r
564                 this.attachNodeData(child, li);\r
565                 if (child.hasChildren()) {\r
566                     this.createDomElements(li, child.children, false, child.is_open, level + 1);\r
567                 }\r
568             }\r
569             return null;\r
570         };\r
571 \r
572         ElementsRenderer.prototype.attachNodeData = function(node, li) {\r
573             node.element = li;\r
574             return $(li).data('node', node);\r
575         };\r
576 \r
577         ElementsRenderer.prototype.createUl = function(is_root_node) {\r
578             var class_string, role, ul;\r
579             if (!is_root_node) {\r
580                 class_string = '';\r
581                 role = 'group';\r
582             } else {\r
583                 class_string = 'jqtree-tree';\r
584                 role = 'tree';\r
585                 if (this.tree_widget.options.rtl) {\r
586                     class_string += ' jqtree-rtl';\r
587                 }\r
588             }\r
589             ul = document.createElement('ul');\r
590             ul.className = "jqtree_common " + class_string;\r
591             ul.setAttribute('role', role);\r
592             return ul;\r
593         };\r
594 \r
595         ElementsRenderer.prototype.createLi = function(node, level) {\r
596             var is_selected, li;\r
597             is_selected = this.tree_widget.select_node_handler && this.tree_widget.select_node_handler.isNodeSelected(node);\r
598             if (node.isFolder()) {\r
599                 li = this.createFolderLi(node, level, is_selected);\r
600             } else {\r
601                 li = this.createNodeLi(node, level, is_selected);\r
602             }\r
603             if (this.tree_widget.options.onCreateLi) {\r
604                 this.tree_widget.options.onCreateLi(node, $(li));\r
605             }\r
606             return li;\r
607         };\r
608 \r
609         ElementsRenderer.prototype.createFolderLi = function(node, level, is_selected) {\r
610             var button_classes, button_link, div, folder_classes, icon_element, is_folder, li;\r
611             button_classes = this.getButtonClasses(node);\r
612             folder_classes = this.getFolderClasses(node, is_selected);\r
613             if (node.is_open) {\r
614                 icon_element = this.opened_icon_element;\r
615             } else {\r
616                 icon_element = this.closed_icon_element;\r
617             }\r
618             li = document.createElement('li');\r
619             li.className = "jqtree_common " + folder_classes;\r
620             li.setAttribute('role', 'presentation');\r
621             div = document.createElement('div');\r
622             div.className = "jqtree-element jqtree_common";\r
623             div.setAttribute('role', 'presentation');\r
624             li.appendChild(div);\r
625             button_link = document.createElement('a');\r
626             button_link.className = button_classes;\r
627             button_link.appendChild(icon_element.cloneNode(false));\r
628             button_link.setAttribute('role', 'presentation');\r
629             button_link.setAttribute('aria-hidden', 'true');\r
630             if (this.tree_widget.options.buttonLeft) {\r
631                 div.appendChild(button_link);\r
632             }\r
633             div.appendChild(this.createTitleSpan(node.name, level, is_selected, node.is_open, is_folder = true));\r
634             if (!this.tree_widget.options.buttonLeft) {\r
635                 div.appendChild(button_link);\r
636             }\r
637             return li;\r
638         };\r
639 \r
640         ElementsRenderer.prototype.createNodeLi = function(node, level, is_selected) {\r
641             var class_string, div, is_folder, li, li_classes;\r
642             li_classes = ['jqtree_common'];\r
643             if (is_selected) {\r
644                 li_classes.push('jqtree-selected');\r
645             }\r
646             class_string = li_classes.join(' ');\r
647             li = document.createElement('li');\r
648             li.className = class_string;\r
649             li.setAttribute('role', 'presentation');\r
650             div = document.createElement('div');\r
651             div.className = "jqtree-element jqtree_common";\r
652             div.setAttribute('role', 'presentation');\r
653             li.appendChild(div);\r
654             div.appendChild(this.createTitleSpan(node.name, level, is_selected, node.is_open, is_folder = false));\r
655             return li;\r
656         };\r
657 \r
658         ElementsRenderer.prototype.createTitleSpan = function(node_name, level, is_selected, is_open, is_folder) {\r
659             var classes, title_span;\r
660             title_span = document.createElement('span');\r
661             classes = "jqtree-title jqtree_common";\r
662             if (is_folder) {\r
663                 classes += " jqtree-title-folder";\r
664             }\r
665             title_span.className = classes;\r
666             title_span.setAttribute('role', 'treeitem');\r
667             title_span.setAttribute('aria-level', level);\r
668             title_span.setAttribute('aria-selected', util.getBoolString(is_selected));\r
669             title_span.setAttribute('aria-expanded', util.getBoolString(is_open));\r
670             if (is_selected) {\r
671                 title_span.setAttribute('tabindex', 0);\r
672             }\r
673             title_span.innerHTML = this.escapeIfNecessary(node_name);\r
674             return title_span;\r
675         };\r
676 \r
677         ElementsRenderer.prototype.getButtonClasses = function(node) {\r
678             var classes;\r
679             classes = ['jqtree-toggler', 'jqtree_common'];\r
680             if (!node.is_open) {\r
681                 classes.push('jqtree-closed');\r
682             }\r
683             if (this.tree_widget.options.buttonLeft) {\r
684                 classes.push('jqtree-toggler-left');\r
685             } else {\r
686                 classes.push('jqtree-toggler-right');\r
687             }\r
688             return classes.join(' ');\r
689         };\r
690 \r
691         ElementsRenderer.prototype.getFolderClasses = function(node, is_selected) {\r
692             var classes;\r
693             classes = ['jqtree-folder'];\r
694             if (!node.is_open) {\r
695                 classes.push('jqtree-closed');\r
696             }\r
697             if (is_selected) {\r
698                 classes.push('jqtree-selected');\r
699             }\r
700             if (node.is_loading) {\r
701                 classes.push('jqtree-loading');\r
702             }\r
703             return classes.join(' ');\r
704         };\r
705 \r
706         ElementsRenderer.prototype.escapeIfNecessary = function(value) {\r
707             if (this.tree_widget.options.autoEscape) {\r
708                 return html_escape(value);\r
709             } else {\r
710                 return value;\r
711             }\r
712         };\r
713 \r
714         ElementsRenderer.prototype.createButtonElement = function(value) {\r
715             var div;\r
716             if (typeof value === 'string') {\r
717                 div = document.createElement('div');\r
718                 div.innerHTML = value;\r
719                 return document.createTextNode(div.innerHTML);\r
720             } else {\r
721                 return $(value)[0];\r
722             }\r
723         };\r
724 \r
725         return ElementsRenderer;\r
726 \r
727     })();\r
728 \r
729     module.exports = ElementsRenderer;\r
730 \r
731 },{"./node_element":6,"./util":12}],3:[function(require,module,exports){\r
732     var $, KeyHandler,\r
733         bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\r
734 \r
735     $ = jQuery;\r
736 \r
737     KeyHandler = (function() {\r
738         var DOWN, LEFT, RIGHT, UP;\r
739 \r
740         LEFT = 37;\r
741 \r
742         UP = 38;\r
743 \r
744         RIGHT = 39;\r
745 \r
746         DOWN = 40;\r
747 \r
748         function KeyHandler(tree_widget) {\r
749             this.selectNode = bind(this.selectNode, this);\r
750             this.tree_widget = tree_widget;\r
751             if (tree_widget.options.keyboardSupport) {\r
752                 $(document).bind('keydown.jqtree', $.proxy(this.handleKeyDown, this));\r
753             }\r
754         }\r
755 \r
756         KeyHandler.prototype.deinit = function() {\r
757             return $(document).unbind('keydown.jqtree');\r
758         };\r
759 \r
760         KeyHandler.prototype.moveDown = function() {\r
761             var node;\r
762             node = this.tree_widget.getSelectedNode();\r
763             if (node) {\r
764                 return this.selectNode(node.getNextNode());\r
765             } else {\r
766                 return false;\r
767             }\r
768         };\r
769 \r
770         KeyHandler.prototype.moveUp = function() {\r
771             var node;\r
772             node = this.tree_widget.getSelectedNode();\r
773             if (node) {\r
774                 return this.selectNode(node.getPreviousNode());\r
775             } else {\r
776                 return false;\r
777             }\r
778         };\r
779 \r
780         KeyHandler.prototype.moveRight = function() {\r
781             var node;\r
782             node = this.tree_widget.getSelectedNode();\r
783             if (!node) {\r
784                 return true;\r
785             } else if (!node.isFolder()) {\r
786                 return true;\r
787             } else {\r
788                 if (node.is_open) {\r
789                     return this.selectNode(node.getNextNode());\r
790                 } else {\r
791                     this.tree_widget.openNode(node);\r
792                     return false;\r
793                 }\r
794             }\r
795         };\r
796 \r
797         KeyHandler.prototype.moveLeft = function() {\r
798             var node;\r
799             node = this.tree_widget.getSelectedNode();\r
800             if (!node) {\r
801                 return true;\r
802             } else if (node.isFolder() && node.is_open) {\r
803                 this.tree_widget.closeNode(node);\r
804                 return false;\r
805             } else {\r
806                 return this.selectNode(node.getParent());\r
807             }\r
808         };\r
809 \r
810         KeyHandler.prototype.handleKeyDown = function(e) {\r
811             var key;\r
812             if (!this.tree_widget.options.keyboardSupport) {\r
813                 return true;\r
814             }\r
815             if ($(document.activeElement).is('textarea,input,select')) {\r
816                 return true;\r
817             }\r
818             if (!this.tree_widget.getSelectedNode()) {\r
819                 return true;\r
820             }\r
821             key = e.which;\r
822             switch (key) {\r
823                 case DOWN:\r
824                     return this.moveDown();\r
825                 case UP:\r
826                     return this.moveUp();\r
827                 case RIGHT:\r
828                     return this.moveRight();\r
829                 case LEFT:\r
830                     return this.moveLeft();\r
831             }\r
832             return true;\r
833         };\r
834 \r
835         KeyHandler.prototype.selectNode = function(node) {\r
836             if (!node) {\r
837                 return true;\r
838             } else {\r
839                 this.tree_widget.selectNode(node);\r
840                 if (this.tree_widget.scroll_handler && (!this.tree_widget.scroll_handler.isScrolledIntoView($(node.element).find('.jqtree-element')))) {\r
841                     this.tree_widget.scrollToNode(node);\r
842                 }\r
843                 return false;\r
844             }\r
845         };\r
846 \r
847         return KeyHandler;\r
848 \r
849     })();\r
850 \r
851     module.exports = KeyHandler;\r
852 \r
853 },{}],4:[function(require,module,exports){\r
854 \r
855     /*\r
856      This widget does the same a the mouse widget in jqueryui.\r
857      */\r
858     var $, MouseWidget, SimpleWidget,\r
859         extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\r
860         hasProp = {}.hasOwnProperty;\r
861 \r
862     SimpleWidget = require('./simple.widget');\r
863 \r
864     $ = jQuery;\r
865 \r
866     MouseWidget = (function(superClass) {\r
867         extend(MouseWidget, superClass);\r
868 \r
869         function MouseWidget() {\r
870             return MouseWidget.__super__.constructor.apply(this, arguments);\r
871         }\r
872 \r
873         MouseWidget.is_mouse_handled = false;\r
874 \r
875         MouseWidget.prototype._init = function() {\r
876             this.$el.bind('mousedown.mousewidget', $.proxy(this._mouseDown, this));\r
877             this.$el.bind('touchstart.mousewidget', $.proxy(this._touchStart, this));\r
878             this.is_mouse_started = false;\r
879             this.mouse_delay = 0;\r
880             this._mouse_delay_timer = null;\r
881             this._is_mouse_delay_met = true;\r
882             return this.mouse_down_info = null;\r
883         };\r
884 \r
885         MouseWidget.prototype._deinit = function() {\r
886             var $document;\r
887             this.$el.unbind('mousedown.mousewidget');\r
888             this.$el.unbind('touchstart.mousewidget');\r
889             $document = $(document);\r
890             $document.unbind('mousemove.mousewidget');\r
891             return $document.unbind('mouseup.mousewidget');\r
892         };\r
893 \r
894         MouseWidget.prototype._mouseDown = function(e) {\r
895             var result;\r
896             if (e.which !== 1) {\r
897                 return;\r
898             }\r
899             result = this._handleMouseDown(e, this._getPositionInfo(e));\r
900             if (result) {\r
901                 e.preventDefault();\r
902             }\r
903             return result;\r
904         };\r
905 \r
906         MouseWidget.prototype._handleMouseDown = function(e, position_info) {\r
907             if (MouseWidget.is_mouse_handled) {\r
908                 return;\r
909             }\r
910             if (this.is_mouse_started) {\r
911                 this._handleMouseUp(position_info);\r
912             }\r
913             this.mouse_down_info = position_info;\r
914             if (!this._mouseCapture(position_info)) {\r
915                 return;\r
916             }\r
917             this._handleStartMouse();\r
918             this.is_mouse_handled = true;\r
919             return true;\r
920         };\r
921 \r
922         MouseWidget.prototype._handleStartMouse = function() {\r
923             var $document;\r
924             $document = $(document);\r
925             $document.bind('mousemove.mousewidget', $.proxy(this._mouseMove, this));\r
926             $document.bind('touchmove.mousewidget', $.proxy(this._touchMove, this));\r
927             $document.bind('mouseup.mousewidget', $.proxy(this._mouseUp, this));\r
928             $document.bind('touchend.mousewidget', $.proxy(this._touchEnd, this));\r
929             if (this.mouse_delay) {\r
930                 return this._startMouseDelayTimer();\r
931             }\r
932         };\r
933 \r
934         MouseWidget.prototype._startMouseDelayTimer = function() {\r
935             if (this._mouse_delay_timer) {\r
936                 clearTimeout(this._mouse_delay_timer);\r
937             }\r
938             this._mouse_delay_timer = setTimeout((function(_this) {\r
939                 return function() {\r
940                     return _this._is_mouse_delay_met = true;\r
941                 };\r
942             })(this), this.mouse_delay);\r
943             return this._is_mouse_delay_met = false;\r
944         };\r
945 \r
946         MouseWidget.prototype._mouseMove = function(e) {\r
947             return this._handleMouseMove(e, this._getPositionInfo(e));\r
948         };\r
949 \r
950         MouseWidget.prototype._handleMouseMove = function(e, position_info) {\r
951             if (this.is_mouse_started) {\r
952                 this._mouseDrag(position_info);\r
953                 return e.preventDefault();\r
954             }\r
955             if (this.mouse_delay && !this._is_mouse_delay_met) {\r
956                 return true;\r
957             }\r
958             this.is_mouse_started = this._mouseStart(this.mouse_down_info) !== false;\r
959             if (this.is_mouse_started) {\r
960                 this._mouseDrag(position_info);\r
961             } else {\r
962                 this._handleMouseUp(position_info);\r
963             }\r
964             return !this.is_mouse_started;\r
965         };\r
966 \r
967         MouseWidget.prototype._getPositionInfo = function(e) {\r
968             return {\r
969                 page_x: e.pageX,\r
970                 page_y: e.pageY,\r
971                 target: e.target,\r
972                 original_event: e\r
973             };\r
974         };\r
975 \r
976         MouseWidget.prototype._mouseUp = function(e) {\r
977             return this._handleMouseUp(this._getPositionInfo(e));\r
978         };\r
979 \r
980         MouseWidget.prototype._handleMouseUp = function(position_info) {\r
981             var $document;\r
982             $document = $(document);\r
983             $document.unbind('mousemove.mousewidget');\r
984             $document.unbind('touchmove.mousewidget');\r
985             $document.unbind('mouseup.mousewidget');\r
986             $document.unbind('touchend.mousewidget');\r
987             if (this.is_mouse_started) {\r
988                 this.is_mouse_started = false;\r
989                 this._mouseStop(position_info);\r
990             }\r
991         };\r
992 \r
993         MouseWidget.prototype._mouseCapture = function(position_info) {\r
994             return true;\r
995         };\r
996 \r
997         MouseWidget.prototype._mouseStart = function(position_info) {\r
998             return null;\r
999         };\r
1000 \r
1001         MouseWidget.prototype._mouseDrag = function(position_info) {\r
1002             return null;\r
1003         };\r
1004 \r
1005         MouseWidget.prototype._mouseStop = function(position_info) {\r
1006             return null;\r
1007         };\r
1008 \r
1009         MouseWidget.prototype.setMouseDelay = function(mouse_delay) {\r
1010             return this.mouse_delay = mouse_delay;\r
1011         };\r
1012 \r
1013         MouseWidget.prototype._touchStart = function(e) {\r
1014             var touch;\r
1015             if (e.originalEvent.touches.length > 1) {\r
1016                 return;\r
1017             }\r
1018             touch = e.originalEvent.changedTouches[0];\r
1019             return this._handleMouseDown(e, this._getPositionInfo(touch));\r
1020         };\r
1021 \r
1022         MouseWidget.prototype._touchMove = function(e) {\r
1023             var touch;\r
1024             if (e.originalEvent.touches.length > 1) {\r
1025                 return;\r
1026             }\r
1027             touch = e.originalEvent.changedTouches[0];\r
1028             return this._handleMouseMove(e, this._getPositionInfo(touch));\r
1029         };\r
1030 \r
1031         MouseWidget.prototype._touchEnd = function(e) {\r
1032             var touch;\r
1033             if (e.originalEvent.touches.length > 1) {\r
1034                 return;\r
1035             }\r
1036             touch = e.originalEvent.changedTouches[0];\r
1037             return this._handleMouseUp(this._getPositionInfo(touch));\r
1038         };\r
1039 \r
1040         return MouseWidget;\r
1041 \r
1042     })(SimpleWidget);\r
1043 \r
1044     module.exports = MouseWidget;\r
1045 \r
1046 },{"./simple.widget":10}],5:[function(require,module,exports){\r
1047     var $, Node, Position;\r
1048 \r
1049     $ = jQuery;\r
1050 \r
1051     Position = {\r
1052         getName: function(position) {\r
1053             return Position.strings[position - 1];\r
1054         },\r
1055         nameToIndex: function(name) {\r
1056             var i, j, ref;\r
1057             for (i = j = 1, ref = Position.strings.length; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\r
1058                 if (Position.strings[i - 1] === name) {\r
1059                     return i;\r
1060                 }\r
1061             }\r
1062             return 0;\r
1063         }\r
1064     };\r
1065 \r
1066     Position.BEFORE = 1;\r
1067 \r
1068     Position.AFTER = 2;\r
1069 \r
1070     Position.INSIDE = 3;\r
1071 \r
1072     Position.NONE = 4;\r
1073 \r
1074     Position.strings = ['before', 'after', 'inside', 'none'];\r
1075 \r
1076     Node = (function() {\r
1077         function Node(o, is_root, node_class) {\r
1078             if (is_root == null) {\r
1079                 is_root = false;\r
1080             }\r
1081             if (node_class == null) {\r
1082                 node_class = Node;\r
1083             }\r
1084             this.name = '';\r
1085             this.setData(o);\r
1086             this.children = [];\r
1087             this.parent = null;\r
1088             if (is_root) {\r
1089                 this.id_mapping = {};\r
1090                 this.tree = this;\r
1091                 this.node_class = node_class;\r
1092             }\r
1093         }\r
1094 \r
1095         Node.prototype.setData = function(o) {\r
1096 \r
1097             /*\r
1098              Set the data of this node.\r
1099 \r
1100              setData(string): set the name of the node\r
1101              setdata(object): set attributes of the node\r
1102 \r
1103              Examples:\r
1104              setdata('node1')\r
1105 \r
1106              setData({ name: 'node1', id: 1});\r
1107 \r
1108              setData({ name: 'node2', id: 2, color: 'green'});\r
1109 \r
1110              * This is an internal function; it is not in the docs\r
1111              * Does not remove existing node values\r
1112              */\r
1113             var key, setName, value;\r
1114             setName = (function(_this) {\r
1115                 return function(name) {\r
1116                     if (name !== null) {\r
1117                         return _this.name = name;\r
1118                     }\r
1119                 };\r
1120             })(this);\r
1121             if (typeof o !== 'object') {\r
1122                 setName(o);\r
1123             } else {\r
1124                 for (key in o) {\r
1125                     value = o[key];\r
1126                     if (key === 'label') {\r
1127                         setName(value);\r
1128                     } else if (key !== 'children') {\r
1129                         this[key] = value;\r
1130                     }\r
1131                 }\r
1132             }\r
1133             return null;\r
1134         };\r
1135 \r
1136         Node.prototype.initFromData = function(data) {\r
1137             var addChildren, addNode;\r
1138             addNode = (function(_this) {\r
1139                 return function(node_data) {\r
1140                     _this.setData(node_data);\r
1141                     if (node_data.children) {\r
1142                         return addChildren(node_data.children);\r
1143                     }\r
1144                 };\r
1145             })(this);\r
1146             addChildren = (function(_this) {\r
1147                 return function(children_data) {\r
1148                     var child, j, len, node;\r
1149                     for (j = 0, len = children_data.length; j < len; j++) {\r
1150                         child = children_data[j];\r
1151                         node = new _this.tree.node_class('');\r
1152                         node.initFromData(child);\r
1153                         _this.addChild(node);\r
1154                     }\r
1155                     return null;\r
1156                 };\r
1157             })(this);\r
1158             addNode(data);\r
1159             return null;\r
1160         };\r
1161 \r
1162 \r
1163         /*\r
1164          Create tree from data.\r
1165 \r
1166          Structure of data is:\r
1167          [\r
1168          {\r
1169          label: 'node1',\r
1170          children: [\r
1171          { label: 'child1' },\r
1172          { label: 'child2' }\r
1173          ]\r
1174          },\r
1175          {\r
1176          label: 'node2'\r
1177          }\r
1178          ]\r
1179          */\r
1180 \r
1181         Node.prototype.loadFromData = function(data) {\r
1182             var j, len, node, o;\r
1183             this.removeChildren();\r
1184             for (j = 0, len = data.length; j < len; j++) {\r
1185                 o = data[j];\r
1186                 node = new this.tree.node_class(o);\r
1187                 this.addChild(node);\r
1188                 if (typeof o === 'object' && o.children) {\r
1189                     node.loadFromData(o.children);\r
1190                 }\r
1191             }\r
1192             return null;\r
1193         };\r
1194 \r
1195 \r
1196         /*\r
1197          Add child.\r
1198 \r
1199          tree.addChild(\r
1200          new Node('child1')\r
1201          );\r
1202          */\r
1203 \r
1204         Node.prototype.addChild = function(node) {\r
1205             this.children.push(node);\r
1206             return node._setParent(this);\r
1207         };\r
1208 \r
1209 \r
1210         /*\r
1211          Add child at position. Index starts at 0.\r
1212 \r
1213          tree.addChildAtPosition(\r
1214          new Node('abc'),\r
1215          1\r
1216          );\r
1217          */\r
1218 \r
1219         Node.prototype.addChildAtPosition = function(node, index) {\r
1220             this.children.splice(index, 0, node);\r
1221             return node._setParent(this);\r
1222         };\r
1223 \r
1224         Node.prototype._setParent = function(parent) {\r
1225             this.parent = parent;\r
1226             this.tree = parent.tree;\r
1227             return this.tree.addNodeToIndex(this);\r
1228         };\r
1229 \r
1230 \r
1231         /*\r
1232          Remove child. This also removes the children of the node.\r
1233 \r
1234          tree.removeChild(tree.children[0]);\r
1235          */\r
1236 \r
1237         Node.prototype.removeChild = function(node) {\r
1238             node.removeChildren();\r
1239             return this._removeChild(node);\r
1240         };\r
1241 \r
1242         Node.prototype._removeChild = function(node) {\r
1243             this.children.splice(this.getChildIndex(node), 1);\r
1244             return this.tree.removeNodeFromIndex(node);\r
1245         };\r
1246 \r
1247 \r
1248         /*\r
1249          Get child index.\r
1250 \r
1251          var index = getChildIndex(node);\r
1252          */\r
1253 \r
1254         Node.prototype.getChildIndex = function(node) {\r
1255             return $.inArray(node, this.children);\r
1256         };\r
1257 \r
1258 \r
1259         /*\r
1260          Does the tree have children?\r
1261 \r
1262          if (tree.hasChildren()) {\r
1263          //\r
1264          }\r
1265          */\r
1266 \r
1267         Node.prototype.hasChildren = function() {\r
1268             return this.children.length !== 0;\r
1269         };\r
1270 \r
1271         Node.prototype.isFolder = function() {\r
1272             return this.hasChildren() || this.load_on_demand;\r
1273         };\r
1274 \r
1275 \r
1276         /*\r
1277          Iterate over all the nodes in the tree.\r
1278 \r
1279          Calls callback with (node, level).\r
1280 \r
1281          The callback must return true to continue the iteration on current node.\r
1282 \r
1283          tree.iterate(\r
1284          function(node, level) {\r
1285          console.log(node.name);\r
1286 \r
1287          // stop iteration after level 2\r
1288          return (level <= 2);\r
1289          }\r
1290          );\r
1291          */\r
1292 \r
1293         Node.prototype.iterate = function(callback) {\r
1294             var _iterate;\r
1295             _iterate = function(node, level) {\r
1296                 var child, j, len, ref, result;\r
1297                 if (node.children) {\r
1298                     ref = node.children;\r
1299                     for (j = 0, len = ref.length; j < len; j++) {\r
1300                         child = ref[j];\r
1301                         result = callback(child, level);\r
1302                         if (result && child.hasChildren()) {\r
1303                             _iterate(child, level + 1);\r
1304                         }\r
1305                     }\r
1306                     return null;\r
1307                 }\r
1308             };\r
1309             _iterate(this, 0);\r
1310             return null;\r
1311         };\r
1312 \r
1313 \r
1314         /*\r
1315          Move node relative to another node.\r
1316 \r
1317          Argument position: Position.BEFORE, Position.AFTER or Position.Inside\r
1318 \r
1319          // move node1 after node2\r
1320          tree.moveNode(node1, node2, Position.AFTER);\r
1321          */\r
1322 \r
1323         Node.prototype.moveNode = function(moved_node, target_node, position) {\r
1324             if (moved_node.isParentOf(target_node)) {\r
1325                 return;\r
1326             }\r
1327             moved_node.parent._removeChild(moved_node);\r
1328             if (position === Position.AFTER) {\r
1329                 return target_node.parent.addChildAtPosition(moved_node, target_node.parent.getChildIndex(target_node) + 1);\r
1330             } else if (position === Position.BEFORE) {\r
1331                 return target_node.parent.addChildAtPosition(moved_node, target_node.parent.getChildIndex(target_node));\r
1332             } else if (position === Position.INSIDE) {\r
1333                 return target_node.addChildAtPosition(moved_node, 0);\r
1334             }\r
1335         };\r
1336 \r
1337 \r
1338         /*\r
1339          Get the tree as data.\r
1340          */\r
1341 \r
1342         Node.prototype.getData = function(include_parent) {\r
1343             var getDataFromNodes;\r
1344             if (include_parent == null) {\r
1345                 include_parent = false;\r
1346             }\r
1347             getDataFromNodes = function(nodes) {\r
1348                 var data, j, k, len, node, tmp_node, v;\r
1349                 data = [];\r
1350                 for (j = 0, len = nodes.length; j < len; j++) {\r
1351                     node = nodes[j];\r
1352                     tmp_node = {};\r
1353                     for (k in node) {\r
1354                         v = node[k];\r
1355                         if ((k !== 'parent' && k !== 'children' && k !== 'element' && k !== 'tree') && Object.prototype.hasOwnProperty.call(node, k)) {\r
1356                             tmp_node[k] = v;\r
1357                         }\r
1358                     }\r
1359                     if (node.hasChildren()) {\r
1360                         tmp_node.children = getDataFromNodes(node.children);\r
1361                     }\r
1362                     data.push(tmp_node);\r
1363                 }\r
1364                 return data;\r
1365             };\r
1366             if (include_parent) {\r
1367                 return getDataFromNodes([this]);\r
1368             } else {\r
1369                 return getDataFromNodes(this.children);\r
1370             }\r
1371         };\r
1372 \r
1373         Node.prototype.getNodeByName = function(name) {\r
1374             return this.getNodeByCallback(function(node) {\r
1375                 return node.name === name;\r
1376             });\r
1377         };\r
1378 \r
1379         Node.prototype.getNodeByCallback = function(callback) {\r
1380             var result;\r
1381             result = null;\r
1382             this.iterate(function(node) {\r
1383                 if (callback(node)) {\r
1384                     result = node;\r
1385                     return false;\r
1386                 } else {\r
1387                     return true;\r
1388                 }\r
1389             });\r
1390             return result;\r
1391         };\r
1392 \r
1393         Node.prototype.addAfter = function(node_info) {\r
1394             var child_index, node;\r
1395             if (!this.parent) {\r
1396                 return null;\r
1397             } else {\r
1398                 node = new this.tree.node_class(node_info);\r
1399                 child_index = this.parent.getChildIndex(this);\r
1400                 this.parent.addChildAtPosition(node, child_index + 1);\r
1401                 if (typeof node_info === 'object' && node_info.children && node_info.children.length) {\r
1402                     node.loadFromData(node_info.children);\r
1403                 }\r
1404                 return node;\r
1405             }\r
1406         };\r
1407 \r
1408         Node.prototype.addBefore = function(node_info) {\r
1409             var child_index, node;\r
1410             if (!this.parent) {\r
1411                 return null;\r
1412             } else {\r
1413                 node = new this.tree.node_class(node_info);\r
1414                 child_index = this.parent.getChildIndex(this);\r
1415                 this.parent.addChildAtPosition(node, child_index);\r
1416                 if (typeof node_info === 'object' && node_info.children && node_info.children.length) {\r
1417                     node.loadFromData(node_info.children);\r
1418                 }\r
1419                 return node;\r
1420             }\r
1421         };\r
1422 \r
1423         Node.prototype.addParent = function(node_info) {\r
1424             var child, j, len, new_parent, original_parent, ref;\r
1425             if (!this.parent) {\r
1426                 return null;\r
1427             } else {\r
1428                 new_parent = new this.tree.node_class(node_info);\r
1429                 new_parent._setParent(this.tree);\r
1430                 original_parent = this.parent;\r
1431                 ref = original_parent.children;\r
1432                 for (j = 0, len = ref.length; j < len; j++) {\r
1433                     child = ref[j];\r
1434                     new_parent.addChild(child);\r
1435                 }\r
1436                 original_parent.children = [];\r
1437                 original_parent.addChild(new_parent);\r
1438                 return new_parent;\r
1439             }\r
1440         };\r
1441 \r
1442         Node.prototype.remove = function() {\r
1443             if (this.parent) {\r
1444                 this.parent.removeChild(this);\r
1445                 return this.parent = null;\r
1446             }\r
1447         };\r
1448 \r
1449         Node.prototype.append = function(node_info) {\r
1450             var node;\r
1451             node = new this.tree.node_class(node_info);\r
1452             this.addChild(node);\r
1453             if (typeof node_info === 'object' && node_info.children && node_info.children.length) {\r
1454                 node.loadFromData(node_info.children);\r
1455             }\r
1456             return node;\r
1457         };\r
1458 \r
1459         Node.prototype.prepend = function(node_info) {\r
1460             var node;\r
1461             node = new this.tree.node_class(node_info);\r
1462             this.addChildAtPosition(node, 0);\r
1463             if (typeof node_info === 'object' && node_info.children && node_info.children.length) {\r
1464                 node.loadFromData(node_info.children);\r
1465             }\r
1466             return node;\r
1467         };\r
1468 \r
1469         Node.prototype.isParentOf = function(node) {\r
1470             var parent;\r
1471             parent = node.parent;\r
1472             while (parent) {\r
1473                 if (parent === this) {\r
1474                     return true;\r
1475                 }\r
1476                 parent = parent.parent;\r
1477             }\r
1478             return false;\r
1479         };\r
1480 \r
1481         Node.prototype.getLevel = function() {\r
1482             var level, node;\r
1483             level = 0;\r
1484             node = this;\r
1485             while (node.parent) {\r
1486                 level += 1;\r
1487                 node = node.parent;\r
1488             }\r
1489             return level;\r
1490         };\r
1491 \r
1492         Node.prototype.getNodeById = function(node_id) {\r
1493             return this.id_mapping[node_id];\r
1494         };\r
1495 \r
1496         Node.prototype.addNodeToIndex = function(node) {\r
1497             if (node.id != null) {\r
1498                 return this.id_mapping[node.id] = node;\r
1499             }\r
1500         };\r
1501 \r
1502         Node.prototype.removeNodeFromIndex = function(node) {\r
1503             if (node.id != null) {\r
1504                 return delete this.id_mapping[node.id];\r
1505             }\r
1506         };\r
1507 \r
1508         Node.prototype.removeChildren = function() {\r
1509             this.iterate((function(_this) {\r
1510                 return function(child) {\r
1511                     _this.tree.removeNodeFromIndex(child);\r
1512                     return true;\r
1513                 };\r
1514             })(this));\r
1515             return this.children = [];\r
1516         };\r
1517 \r
1518         Node.prototype.getPreviousSibling = function() {\r
1519             var previous_index;\r
1520             if (!this.parent) {\r
1521                 return null;\r
1522             } else {\r
1523                 previous_index = this.parent.getChildIndex(this) - 1;\r
1524                 if (previous_index >= 0) {\r
1525                     return this.parent.children[previous_index];\r
1526                 } else {\r
1527                     return null;\r
1528                 }\r
1529             }\r
1530         };\r
1531 \r
1532         Node.prototype.getNextSibling = function() {\r
1533             var next_index;\r
1534             if (!this.parent) {\r
1535                 return null;\r
1536             } else {\r
1537                 next_index = this.parent.getChildIndex(this) + 1;\r
1538                 if (next_index < this.parent.children.length) {\r
1539                     return this.parent.children[next_index];\r
1540                 } else {\r
1541                     return null;\r
1542                 }\r
1543             }\r
1544         };\r
1545 \r
1546         Node.prototype.getNodesByProperty = function(key, value) {\r
1547             return this.filter(function(node) {\r
1548                 return node[key] === value;\r
1549             });\r
1550         };\r
1551 \r
1552         Node.prototype.filter = function(f) {\r
1553             var result;\r
1554             result = [];\r
1555             this.iterate(function(node) {\r
1556                 if (f(node)) {\r
1557                     result.push(node);\r
1558                 }\r
1559                 return true;\r
1560             });\r
1561             return result;\r
1562         };\r
1563 \r
1564         Node.prototype.getNextNode = function(include_children) {\r
1565             var next_sibling;\r
1566             if (include_children == null) {\r
1567                 include_children = true;\r
1568             }\r
1569             if (include_children && this.hasChildren() && this.is_open) {\r
1570                 return this.children[0];\r
1571             } else {\r
1572                 if (!this.parent) {\r
1573                     return null;\r
1574                 } else {\r
1575                     next_sibling = this.getNextSibling();\r
1576                     if (next_sibling) {\r
1577                         return next_sibling;\r
1578                     } else {\r
1579                         return this.parent.getNextNode(false);\r
1580                     }\r
1581                 }\r
1582             }\r
1583         };\r
1584 \r
1585         Node.prototype.getPreviousNode = function() {\r
1586             var previous_sibling;\r
1587             if (!this.parent) {\r
1588                 return null;\r
1589             } else {\r
1590                 previous_sibling = this.getPreviousSibling();\r
1591                 if (previous_sibling) {\r
1592                     if (!previous_sibling.hasChildren() || !previous_sibling.is_open) {\r
1593                         return previous_sibling;\r
1594                     } else {\r
1595                         return previous_sibling.getLastChild();\r
1596                     }\r
1597                 } else {\r
1598                     return this.getParent();\r
1599                 }\r
1600             }\r
1601         };\r
1602 \r
1603         Node.prototype.getParent = function() {\r
1604             if (!this.parent) {\r
1605                 return null;\r
1606             } else if (!this.parent.parent) {\r
1607                 return null;\r
1608             } else {\r
1609                 return this.parent;\r
1610             }\r
1611         };\r
1612 \r
1613         Node.prototype.getLastChild = function() {\r
1614             var last_child;\r
1615             if (!this.hasChildren()) {\r
1616                 return null;\r
1617             } else {\r
1618                 last_child = this.children[this.children.length - 1];\r
1619                 if (!last_child.hasChildren() || !last_child.is_open) {\r
1620                     return last_child;\r
1621                 } else {\r
1622                     return last_child.getLastChild();\r
1623                 }\r
1624             }\r
1625         };\r
1626 \r
1627         return Node;\r
1628 \r
1629     })();\r
1630 \r
1631     module.exports = {\r
1632         Node: Node,\r
1633         Position: Position\r
1634     };\r
1635 \r
1636 },{}],6:[function(require,module,exports){\r
1637     var $, BorderDropHint, FolderElement, GhostDropHint, NodeElement, Position, node,\r
1638         extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\r
1639         hasProp = {}.hasOwnProperty;\r
1640 \r
1641     node = require('./node');\r
1642 \r
1643     Position = node.Position;\r
1644 \r
1645     $ = jQuery;\r
1646 \r
1647     NodeElement = (function() {\r
1648         function NodeElement(node, tree_widget) {\r
1649             this.init(node, tree_widget);\r
1650         }\r
1651 \r
1652         NodeElement.prototype.init = function(node, tree_widget) {\r
1653             this.node = node;\r
1654             this.tree_widget = tree_widget;\r
1655             if (!node.element) {\r
1656                 node.element = this.tree_widget.element;\r
1657             }\r
1658             return this.$element = $(node.element);\r
1659         };\r
1660 \r
1661         NodeElement.prototype.getUl = function() {\r
1662             return this.$element.children('ul:first');\r
1663         };\r
1664 \r
1665         NodeElement.prototype.getSpan = function() {\r
1666             return this.$element.children('.jqtree-element').find('span.jqtree-title');\r
1667         };\r
1668 \r
1669         NodeElement.prototype.getLi = function() {\r
1670             return this.$element;\r
1671         };\r
1672 \r
1673         NodeElement.prototype.addDropHint = function(position) {\r
1674             if (position === Position.INSIDE) {\r
1675                 return new BorderDropHint(this.$element);\r
1676             } else {\r
1677                 return new GhostDropHint(this.node, this.$element, position);\r
1678             }\r
1679         };\r
1680 \r
1681         NodeElement.prototype.select = function() {\r
1682             var $li, $span;\r
1683             $li = this.getLi();\r
1684             $li.addClass('jqtree-selected');\r
1685             $li.attr('aria-selected', 'true');\r
1686             $span = this.getSpan();\r
1687             return $span.attr('tabindex', 0);\r
1688         };\r
1689 \r
1690         NodeElement.prototype.deselect = function() {\r
1691             var $li, $span;\r
1692             $li = this.getLi();\r
1693             $li.removeClass('jqtree-selected');\r
1694             $li.attr('aria-selected', 'false');\r
1695             $span = this.getSpan();\r
1696             return $span.attr('tabindex', -1);\r
1697         };\r
1698 \r
1699         return NodeElement;\r
1700 \r
1701     })();\r
1702 \r
1703     FolderElement = (function(superClass) {\r
1704         extend(FolderElement, superClass);\r
1705 \r
1706         function FolderElement() {\r
1707             return FolderElement.__super__.constructor.apply(this, arguments);\r
1708         }\r
1709 \r
1710         FolderElement.prototype.open = function(on_finished, slide) {\r
1711             var $button, doOpen;\r
1712             if (slide == null) {\r
1713                 slide = true;\r
1714             }\r
1715             if (!this.node.is_open) {\r
1716                 this.node.is_open = true;\r
1717                 $button = this.getButton();\r
1718                 $button.removeClass('jqtree-closed');\r
1719                 $button.html('');\r
1720                 $button.append(this.tree_widget.renderer.opened_icon_element.cloneNode(false));\r
1721                 doOpen = (function(_this) {\r
1722                     return function() {\r
1723                         var $li, $span;\r
1724                         $li = _this.getLi();\r
1725                         $li.removeClass('jqtree-closed');\r
1726                         $span = _this.getSpan();\r
1727                         $span.attr('aria-expanded', 'true');\r
1728                         if (on_finished) {\r
1729                             on_finished();\r
1730                         }\r
1731                         return _this.tree_widget._triggerEvent('tree.open', {\r
1732                             node: _this.node\r
1733                         });\r
1734                     };\r
1735                 })(this);\r
1736                 if (slide) {\r
1737                     return this.getUl().slideDown('fast', doOpen);\r
1738                 } else {\r
1739                     this.getUl().show();\r
1740                     return doOpen();\r
1741                 }\r
1742             }\r
1743         };\r
1744 \r
1745         FolderElement.prototype.close = function(slide) {\r
1746             var $button, doClose;\r
1747             if (slide == null) {\r
1748                 slide = true;\r
1749             }\r
1750             if (this.node.is_open) {\r
1751                 this.node.is_open = false;\r
1752                 $button = this.getButton();\r
1753                 $button.addClass('jqtree-closed');\r
1754                 $button.html('');\r
1755                 $button.append(this.tree_widget.renderer.closed_icon_element.cloneNode(false));\r
1756                 doClose = (function(_this) {\r
1757                     return function() {\r
1758                         var $li, $span;\r
1759                         $li = _this.getLi();\r
1760                         $li.addClass('jqtree-closed');\r
1761                         $span = _this.getSpan();\r
1762                         $span.attr('aria-expanded', 'false');\r
1763                         return _this.tree_widget._triggerEvent('tree.close', {\r
1764                             node: _this.node\r
1765                         });\r
1766                     };\r
1767                 })(this);\r
1768                 if (slide) {\r
1769                     return this.getUl().slideUp('fast', doClose);\r
1770                 } else {\r
1771                     this.getUl().hide();\r
1772                     return doClose();\r
1773                 }\r
1774             }\r
1775         };\r
1776 \r
1777         FolderElement.prototype.getButton = function() {\r
1778             return this.$element.children('.jqtree-element').find('a.jqtree-toggler');\r
1779         };\r
1780 \r
1781         FolderElement.prototype.addDropHint = function(position) {\r
1782             if (!this.node.is_open && position === Position.INSIDE) {\r
1783                 return new BorderDropHint(this.$element);\r
1784             } else {\r
1785                 return new GhostDropHint(this.node, this.$element, position);\r
1786             }\r
1787         };\r
1788 \r
1789         return FolderElement;\r
1790 \r
1791     })(NodeElement);\r
1792 \r
1793     BorderDropHint = (function() {\r
1794         function BorderDropHint($element) {\r
1795             var $div, width;\r
1796             $div = $element.children('.jqtree-element');\r
1797             width = $element.width() - 4;\r
1798             this.$hint = $('<span class="jqtree-border"></span>');\r
1799             $div.append(this.$hint);\r
1800             this.$hint.css({\r
1801                 width: width,\r
1802                 height: $div.outerHeight() - 4\r
1803             });\r
1804         }\r
1805 \r
1806         BorderDropHint.prototype.remove = function() {\r
1807             return this.$hint.remove();\r
1808         };\r
1809 \r
1810         return BorderDropHint;\r
1811 \r
1812     })();\r
1813 \r
1814     GhostDropHint = (function() {\r
1815         function GhostDropHint(node, $element, position) {\r
1816             this.$element = $element;\r
1817             this.node = node;\r
1818             this.$ghost = $('<li class="jqtree_common jqtree-ghost"><span class="jqtree_common jqtree-circle"></span><span class="jqtree_common jqtree-line"></span></li>');\r
1819             if (position === Position.AFTER) {\r
1820                 this.moveAfter();\r
1821             } else if (position === Position.BEFORE) {\r
1822                 this.moveBefore();\r
1823             } else if (position === Position.INSIDE) {\r
1824                 if (node.isFolder() && node.is_open) {\r
1825                     this.moveInsideOpenFolder();\r
1826                 } else {\r
1827                     this.moveInside();\r
1828                 }\r
1829             }\r
1830         }\r
1831 \r
1832         GhostDropHint.prototype.remove = function() {\r
1833             return this.$ghost.remove();\r
1834         };\r
1835 \r
1836         GhostDropHint.prototype.moveAfter = function() {\r
1837             return this.$element.after(this.$ghost);\r
1838         };\r
1839 \r
1840         GhostDropHint.prototype.moveBefore = function() {\r
1841             return this.$element.before(this.$ghost);\r
1842         };\r
1843 \r
1844         GhostDropHint.prototype.moveInsideOpenFolder = function() {\r
1845             return $(this.node.children[0].element).before(this.$ghost);\r
1846         };\r
1847 \r
1848         GhostDropHint.prototype.moveInside = function() {\r
1849             this.$element.after(this.$ghost);\r
1850             return this.$ghost.addClass('jqtree-inside');\r
1851         };\r
1852 \r
1853         return GhostDropHint;\r
1854 \r
1855     })();\r
1856 \r
1857     module.exports = {\r
1858         BorderDropHint: BorderDropHint,\r
1859         FolderElement: FolderElement,\r
1860         GhostDropHint: GhostDropHint,\r
1861         NodeElement: NodeElement\r
1862     };\r
1863 \r
1864 },{"./node":5}],7:[function(require,module,exports){\r
1865     var $, SaveStateHandler, indexOf, isInt, util;\r
1866 \r
1867     util = require('./util');\r
1868 \r
1869     indexOf = util.indexOf;\r
1870 \r
1871     isInt = util.isInt;\r
1872 \r
1873     $ = jQuery;\r
1874 \r
1875     SaveStateHandler = (function() {\r
1876         function SaveStateHandler(tree_widget) {\r
1877             this.tree_widget = tree_widget;\r
1878         }\r
1879 \r
1880         SaveStateHandler.prototype.saveState = function() {\r
1881             var state;\r
1882             state = JSON.stringify(this.getState());\r
1883             if (this.tree_widget.options.onSetStateFromStorage) {\r
1884                 return this.tree_widget.options.onSetStateFromStorage(state);\r
1885             } else if (this.supportsLocalStorage()) {\r
1886                 return localStorage.setItem(this.getCookieName(), state);\r
1887             } else if ($.cookie) {\r
1888                 $.cookie.raw = true;\r
1889                 return $.cookie(this.getCookieName(), state, {\r
1890                     path: '/'\r
1891                 });\r
1892             }\r
1893         };\r
1894 \r
1895         SaveStateHandler.prototype.getStateFromStorage = function() {\r
1896             var json_data;\r
1897             json_data = this._loadFromStorage();\r
1898             if (json_data) {\r
1899                 return this._parseState(json_data);\r
1900             } else {\r
1901                 return null;\r
1902             }\r
1903         };\r
1904 \r
1905         SaveStateHandler.prototype._parseState = function(json_data) {\r
1906             var state;\r
1907             state = $.parseJSON(json_data);\r
1908             if (state && state.selected_node && isInt(state.selected_node)) {\r
1909                 state.selected_node = [state.selected_node];\r
1910             }\r
1911             return state;\r
1912         };\r
1913 \r
1914         SaveStateHandler.prototype._loadFromStorage = function() {\r
1915             if (this.tree_widget.options.onGetStateFromStorage) {\r
1916                 return this.tree_widget.options.onGetStateFromStorage();\r
1917             } else if (this.supportsLocalStorage()) {\r
1918                 return localStorage.getItem(this.getCookieName());\r
1919             } else if ($.cookie) {\r
1920                 $.cookie.raw = true;\r
1921                 return $.cookie(this.getCookieName());\r
1922             } else {\r
1923                 return null;\r
1924             }\r
1925         };\r
1926 \r
1927         SaveStateHandler.prototype.getState = function() {\r
1928             var getOpenNodeIds, getSelectedNodeIds;\r
1929             getOpenNodeIds = (function(_this) {\r
1930                 return function() {\r
1931                     var open_nodes;\r
1932                     open_nodes = [];\r
1933                     _this.tree_widget.tree.iterate(function(node) {\r
1934                         if (node.is_open && node.id && node.hasChildren()) {\r
1935                             open_nodes.push(node.id);\r
1936                         }\r
1937                         return true;\r
1938                     });\r
1939                     return open_nodes;\r
1940                 };\r
1941             })(this);\r
1942             getSelectedNodeIds = (function(_this) {\r
1943                 return function() {\r
1944                     var n;\r
1945                     return (function() {\r
1946                         var i, len, ref, results;\r
1947                         ref = this.tree_widget.getSelectedNodes();\r
1948                         results = [];\r
1949                         for (i = 0, len = ref.length; i < len; i++) {\r
1950                             n = ref[i];\r
1951                             results.push(n.id);\r
1952                         }\r
1953                         return results;\r
1954                     }).call(_this);\r
1955                 };\r
1956             })(this);\r
1957             return {\r
1958                 open_nodes: getOpenNodeIds(),\r
1959                 selected_node: getSelectedNodeIds()\r
1960             };\r
1961         };\r
1962 \r
1963         SaveStateHandler.prototype.setInitialState = function(state) {\r
1964             var must_load_on_demand;\r
1965             if (!state) {\r
1966                 return false;\r
1967             } else {\r
1968                 must_load_on_demand = this._openInitialNodes(state.open_nodes);\r
1969                 this._selectInitialNodes(state.selected_node);\r
1970                 return must_load_on_demand;\r
1971             }\r
1972         };\r
1973 \r
1974         SaveStateHandler.prototype._openInitialNodes = function(node_ids) {\r
1975             var i, len, must_load_on_demand, node, node_id;\r
1976             must_load_on_demand = false;\r
1977             for (i = 0, len = node_ids.length; i < len; i++) {\r
1978                 node_id = node_ids[i];\r
1979                 node = this.tree_widget.getNodeById(node_id);\r
1980                 if (node) {\r
1981                     if (!node.load_on_demand) {\r
1982                         node.is_open = true;\r
1983                     } else {\r
1984                         must_load_on_demand = true;\r
1985                     }\r
1986                 }\r
1987             }\r
1988             return must_load_on_demand;\r
1989         };\r
1990 \r
1991         SaveStateHandler.prototype._selectInitialNodes = function(node_ids) {\r
1992             var i, len, node, node_id, select_count;\r
1993             select_count = 0;\r
1994             for (i = 0, len = node_ids.length; i < len; i++) {\r
1995                 node_id = node_ids[i];\r
1996                 node = this.tree_widget.getNodeById(node_id);\r
1997                 if (node) {\r
1998                     select_count += 1;\r
1999                     this.tree_widget.select_node_handler.addToSelection(node);\r
2000                 }\r
2001             }\r
2002             return select_count !== 0;\r
2003         };\r
2004 \r
2005         SaveStateHandler.prototype.setInitialStateOnDemand = function(state, cb_finished) {\r
2006             if (state) {\r
2007                 return this._setInitialStateOnDemand(state.open_nodes, state.selected_node, cb_finished);\r
2008             } else {\r
2009                 return cb_finished();\r
2010             }\r
2011         };\r
2012 \r
2013         SaveStateHandler.prototype._setInitialStateOnDemand = function(node_ids, selected_nodes, cb_finished) {\r
2014             var loadAndOpenNode, loading_count, openNodes;\r
2015             loading_count = 0;\r
2016             openNodes = (function(_this) {\r
2017                 return function() {\r
2018                     var i, len, new_nodes_ids, node, node_id;\r
2019                     new_nodes_ids = [];\r
2020                     for (i = 0, len = node_ids.length; i < len; i++) {\r
2021                         node_id = node_ids[i];\r
2022                         node = _this.tree_widget.getNodeById(node_id);\r
2023                         if (!node) {\r
2024                             new_nodes_ids.push(node_id);\r
2025                         } else {\r
2026                             if (!node.is_loading) {\r
2027                                 if (node.load_on_demand) {\r
2028                                     loadAndOpenNode(node);\r
2029                                 } else {\r
2030                                     _this.tree_widget._openNode(node, false);\r
2031                                 }\r
2032                             }\r
2033                         }\r
2034                     }\r
2035                     node_ids = new_nodes_ids;\r
2036                     if (_this._selectInitialNodes(selected_nodes)) {\r
2037                         _this.tree_widget._refreshElements();\r
2038                     }\r
2039                     if (loading_count === 0) {\r
2040                         return cb_finished();\r
2041                     }\r
2042                 };\r
2043             })(this);\r
2044             loadAndOpenNode = (function(_this) {\r
2045                 return function(node) {\r
2046                     loading_count += 1;\r
2047                     return _this.tree_widget._openNode(node, false, function() {\r
2048                         loading_count -= 1;\r
2049                         return openNodes();\r
2050                     });\r
2051                 };\r
2052             })(this);\r
2053             return openNodes();\r
2054         };\r
2055 \r
2056         SaveStateHandler.prototype.getCookieName = function() {\r
2057             if (typeof this.tree_widget.options.saveState === 'string') {\r
2058                 return this.tree_widget.options.saveState;\r
2059             } else {\r
2060                 return 'tree';\r
2061             }\r
2062         };\r
2063 \r
2064         SaveStateHandler.prototype.supportsLocalStorage = function() {\r
2065             var testSupport;\r
2066             testSupport = function() {\r
2067                 var error, key;\r
2068                 if (typeof localStorage === "undefined" || localStorage === null) {\r
2069                     return false;\r
2070                 } else {\r
2071                     try {\r
2072                         key = '_storage_test';\r
2073                         sessionStorage.setItem(key, true);\r
2074                         sessionStorage.removeItem(key);\r
2075                     } catch (error1) {\r
2076                         error = error1;\r
2077                         return false;\r
2078                     }\r
2079                     return true;\r
2080                 }\r
2081             };\r
2082             if (this._supportsLocalStorage == null) {\r
2083                 this._supportsLocalStorage = testSupport();\r
2084             }\r
2085             return this._supportsLocalStorage;\r
2086         };\r
2087 \r
2088         SaveStateHandler.prototype.getNodeIdToBeSelected = function() {\r
2089             var state;\r
2090             state = this.getStateFromStorage();\r
2091             if (state && state.selected_node) {\r
2092                 return state.selected_node[0];\r
2093             } else {\r
2094                 return null;\r
2095             }\r
2096         };\r
2097 \r
2098         return SaveStateHandler;\r
2099 \r
2100     })();\r
2101 \r
2102     module.exports = SaveStateHandler;\r
2103 \r
2104 },{"./util":12}],8:[function(require,module,exports){\r
2105     var $, ScrollHandler;\r
2106 \r
2107     $ = jQuery;\r
2108 \r
2109     ScrollHandler = (function() {\r
2110         function ScrollHandler(tree_widget) {\r
2111             this.tree_widget = tree_widget;\r
2112             this.previous_top = -1;\r
2113             this.is_initialized = false;\r
2114             this._initScrollParent();\r
2115         }\r
2116 \r
2117         ScrollHandler.prototype._initScrollParent = function() {\r
2118             var $scroll_parent, getParentWithOverflow, setDocumentAsScrollParent;\r
2119             getParentWithOverflow = (function(_this) {\r
2120                 return function() {\r
2121                     var css_values, el, hasOverFlow, i, len, ref;\r
2122                     css_values = ['overflow', 'overflow-y'];\r
2123                     hasOverFlow = function(el) {\r
2124                         var css_value, i, len, ref;\r
2125                         for (i = 0, len = css_values.length; i < len; i++) {\r
2126                             css_value = css_values[i];\r
2127                             if ((ref = $.css(el, css_value)) === 'auto' || ref === 'scroll') {\r
2128                                 return true;\r
2129                             }\r
2130                         }\r
2131                         return false;\r
2132                     };\r
2133                     if (hasOverFlow(_this.tree_widget.$el[0])) {\r
2134                         return _this.tree_widget.$el;\r
2135                     }\r
2136                     ref = _this.tree_widget.$el.parents();\r
2137                     for (i = 0, len = ref.length; i < len; i++) {\r
2138                         el = ref[i];\r
2139                         if (hasOverFlow(el)) {\r
2140                             return $(el);\r
2141                         }\r
2142                     }\r
2143                     return null;\r
2144                 };\r
2145             })(this);\r
2146             setDocumentAsScrollParent = (function(_this) {\r
2147                 return function() {\r
2148                     _this.scroll_parent_top = 0;\r
2149                     return _this.$scroll_parent = null;\r
2150                 };\r
2151             })(this);\r
2152             if (this.tree_widget.$el.css('position') === 'fixed') {\r
2153                 setDocumentAsScrollParent();\r
2154             }\r
2155             $scroll_parent = getParentWithOverflow();\r
2156             if ($scroll_parent && $scroll_parent.length && $scroll_parent[0].tagName !== 'HTML') {\r
2157                 this.$scroll_parent = $scroll_parent;\r
2158                 this.scroll_parent_top = this.$scroll_parent.offset().top;\r
2159             } else {\r
2160                 setDocumentAsScrollParent();\r
2161             }\r
2162             return this.is_initialized = true;\r
2163         };\r
2164 \r
2165         ScrollHandler.prototype._ensureInit = function() {\r
2166             if (!this.is_initialized) {\r
2167                 return this._initScrollParent();\r
2168             }\r
2169         };\r
2170 \r
2171         ScrollHandler.prototype.checkScrolling = function() {\r
2172             var hovered_area;\r
2173             this._ensureInit();\r
2174             hovered_area = this.tree_widget.dnd_handler.hovered_area;\r
2175             if (hovered_area && hovered_area.top !== this.previous_top) {\r
2176                 this.previous_top = hovered_area.top;\r
2177                 if (this.$scroll_parent) {\r
2178                     return this._handleScrollingWithScrollParent(hovered_area);\r
2179                 } else {\r
2180                     return this._handleScrollingWithDocument(hovered_area);\r
2181                 }\r
2182             }\r
2183         };\r
2184 \r
2185         ScrollHandler.prototype._handleScrollingWithScrollParent = function(area) {\r
2186             var distance_bottom;\r
2187             distance_bottom = this.scroll_parent_top + this.$scroll_parent[0].offsetHeight - area.bottom;\r
2188             if (distance_bottom < 20) {\r
2189                 this.$scroll_parent[0].scrollTop += 20;\r
2190                 this.tree_widget.refreshHitAreas();\r
2191                 return this.previous_top = -1;\r
2192             } else if ((area.top - this.scroll_parent_top) < 20) {\r
2193                 this.$scroll_parent[0].scrollTop -= 20;\r
2194                 this.tree_widget.refreshHitAreas();\r
2195                 return this.previous_top = -1;\r
2196             }\r
2197         };\r
2198 \r
2199         ScrollHandler.prototype._handleScrollingWithDocument = function(area) {\r
2200             var distance_top;\r
2201             distance_top = area.top - $(document).scrollTop();\r
2202             if (distance_top < 20) {\r
2203                 return $(document).scrollTop($(document).scrollTop() - 20);\r
2204             } else if ($(window).height() - (area.bottom - $(document).scrollTop()) < 20) {\r
2205                 return $(document).scrollTop($(document).scrollTop() + 20);\r
2206             }\r
2207         };\r
2208 \r
2209         ScrollHandler.prototype.scrollTo = function(top) {\r
2210             var tree_top;\r
2211             this._ensureInit();\r
2212             if (this.$scroll_parent) {\r
2213                 return this.$scroll_parent[0].scrollTop = top;\r
2214             } else {\r
2215                 tree_top = this.tree_widget.$el.offset().top;\r
2216                 return $(document).scrollTop(top + tree_top);\r
2217             }\r
2218         };\r
2219 \r
2220         ScrollHandler.prototype.isScrolledIntoView = function(element) {\r
2221             var $element, element_bottom, element_top, view_bottom, view_top;\r
2222             this._ensureInit();\r
2223             $element = $(element);\r
2224             if (this.$scroll_parent) {\r
2225                 view_top = 0;\r
2226                 view_bottom = this.$scroll_parent.height();\r
2227                 element_top = $element.offset().top - this.scroll_parent_top;\r
2228                 element_bottom = element_top + $element.height();\r
2229             } else {\r
2230                 view_top = $(window).scrollTop();\r
2231                 view_bottom = view_top + $(window).height();\r
2232                 element_top = $element.offset().top;\r
2233                 element_bottom = element_top + $element.height();\r
2234             }\r
2235             return (element_bottom <= view_bottom) && (element_top >= view_top);\r
2236         };\r
2237 \r
2238         return ScrollHandler;\r
2239 \r
2240     })();\r
2241 \r
2242     module.exports = ScrollHandler;\r
2243 \r
2244 },{}],9:[function(require,module,exports){\r
2245     var $, SelectNodeHandler;\r
2246 \r
2247     $ = jQuery;\r
2248 \r
2249     SelectNodeHandler = (function() {\r
2250         function SelectNodeHandler(tree_widget) {\r
2251             this.tree_widget = tree_widget;\r
2252             this.clear();\r
2253         }\r
2254 \r
2255         SelectNodeHandler.prototype.getSelectedNode = function() {\r
2256             var selected_nodes;\r
2257             selected_nodes = this.getSelectedNodes();\r
2258             if (selected_nodes.length) {\r
2259                 return selected_nodes[0];\r
2260             } else {\r
2261                 return false;\r
2262             }\r
2263         };\r
2264 \r
2265         SelectNodeHandler.prototype.getSelectedNodes = function() {\r
2266             var id, node, selected_nodes;\r
2267             if (this.selected_single_node) {\r
2268                 return [this.selected_single_node];\r
2269             } else {\r
2270                 selected_nodes = [];\r
2271                 for (id in this.selected_nodes) {\r
2272                     node = this.tree_widget.getNodeById(id);\r
2273                     if (node) {\r
2274                         selected_nodes.push(node);\r
2275                     }\r
2276                 }\r
2277                 return selected_nodes;\r
2278             }\r
2279         };\r
2280 \r
2281         SelectNodeHandler.prototype.getSelectedNodesUnder = function(parent) {\r
2282             var id, node, selected_nodes;\r
2283             if (this.selected_single_node) {\r
2284                 if (parent.isParentOf(this.selected_single_node)) {\r
2285                     return [this.selected_single_node];\r
2286                 } else {\r
2287                     return [];\r
2288                 }\r
2289             } else {\r
2290                 selected_nodes = [];\r
2291                 for (id in this.selected_nodes) {\r
2292                     node = this.tree_widget.getNodeById(id);\r
2293                     if (node && parent.isParentOf(node)) {\r
2294                         selected_nodes.push(node);\r
2295                     }\r
2296                 }\r
2297                 return selected_nodes;\r
2298             }\r
2299         };\r
2300 \r
2301         SelectNodeHandler.prototype.isNodeSelected = function(node) {\r
2302             if (!node) {\r
2303                 return false;\r
2304             } else if (node.id) {\r
2305                 if (this.selected_nodes[node.id]) {\r
2306                     return true;\r
2307                 } else {\r
2308                     return false;\r
2309                 }\r
2310             } else if (this.selected_single_node) {\r
2311                 return this.selected_single_node.element === node.element;\r
2312             } else {\r
2313                 return false;\r
2314             }\r
2315         };\r
2316 \r
2317         SelectNodeHandler.prototype.clear = function() {\r
2318             this.selected_nodes = {};\r
2319             return this.selected_single_node = null;\r
2320         };\r
2321 \r
2322         SelectNodeHandler.prototype.removeFromSelection = function(node, include_children) {\r
2323             if (include_children == null) {\r
2324                 include_children = false;\r
2325             }\r
2326             if (!node.id) {\r
2327                 if (this.selected_single_node && node.element === this.selected_single_node.element) {\r
2328                     return this.selected_single_node = null;\r
2329                 }\r
2330             } else {\r
2331                 delete this.selected_nodes[node.id];\r
2332                 if (include_children) {\r
2333                     return node.iterate((function(_this) {\r
2334                         return function(n) {\r
2335                             delete _this.selected_nodes[node.id];\r
2336                             return true;\r
2337                         };\r
2338                     })(this));\r
2339                 }\r
2340             }\r
2341         };\r
2342 \r
2343         SelectNodeHandler.prototype.addToSelection = function(node) {\r
2344             if (node.id) {\r
2345                 return this.selected_nodes[node.id] = true;\r
2346             } else {\r
2347                 return this.selected_single_node = node;\r
2348             }\r
2349         };\r
2350 \r
2351         return SelectNodeHandler;\r
2352 \r
2353     })();\r
2354 \r
2355     module.exports = SelectNodeHandler;\r
2356 \r
2357 },{}],10:[function(require,module,exports){\r
2358 \r
2359     /*\r
2360      Copyright 2013 Marco Braak\r
2361 \r
2362      Licensed under the Apache License, Version 2.0 (the "License");\r
2363      you may not use this file except in compliance with the License.\r
2364      You may obtain a copy of the License at\r
2365 \r
2366      http://www.apache.org/licenses/LICENSE-2.0\r
2367 \r
2368      Unless required by applicable law or agreed to in writing, software\r
2369      distributed under the License is distributed on an "AS IS" BASIS,\r
2370      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
2371      See the License for the specific language governing permissions and\r
2372      limitations under the License.\r
2373      */\r
2374     var $, SimpleWidget,\r
2375         slice = [].slice;\r
2376 \r
2377     $ = jQuery;\r
2378 \r
2379     SimpleWidget = (function() {\r
2380         SimpleWidget.prototype.defaults = {};\r
2381 \r
2382         function SimpleWidget(el, options) {\r
2383             this.$el = $(el);\r
2384             this.options = $.extend({}, this.defaults, options);\r
2385         }\r
2386 \r
2387         SimpleWidget.prototype.destroy = function() {\r
2388             return this._deinit();\r
2389         };\r
2390 \r
2391         SimpleWidget.prototype._init = function() {\r
2392             return null;\r
2393         };\r
2394 \r
2395         SimpleWidget.prototype._deinit = function() {\r
2396             return null;\r
2397         };\r
2398 \r
2399         SimpleWidget.register = function(widget_class, widget_name) {\r
2400             var callFunction, createWidget, destroyWidget, getDataKey, getWidgetData;\r
2401             getDataKey = function() {\r
2402                 return "simple_widget_" + widget_name;\r
2403             };\r
2404             getWidgetData = function(el, data_key) {\r
2405                 var widget;\r
2406                 widget = $.data(el, data_key);\r
2407                 if (widget && (widget instanceof SimpleWidget)) {\r
2408                     return widget;\r
2409                 } else {\r
2410                     return null;\r
2411                 }\r
2412             };\r
2413             createWidget = function($el, options) {\r
2414                 var data_key, el, existing_widget, i, len, widget;\r
2415                 data_key = getDataKey();\r
2416                 for (i = 0, len = $el.length; i < len; i++) {\r
2417                     el = $el[i];\r
2418                     existing_widget = getWidgetData(el, data_key);\r
2419                     if (!existing_widget) {\r
2420                         widget = new widget_class(el, options);\r
2421                         if (!$.data(el, data_key)) {\r
2422                             $.data(el, data_key, widget);\r
2423                         }\r
2424                         widget._init();\r
2425                     }\r
2426                 }\r
2427                 return $el;\r
2428             };\r
2429             destroyWidget = function($el) {\r
2430                 var data_key, el, i, len, results, widget;\r
2431                 data_key = getDataKey();\r
2432                 results = [];\r
2433                 for (i = 0, len = $el.length; i < len; i++) {\r
2434                     el = $el[i];\r
2435                     widget = getWidgetData(el, data_key);\r
2436                     if (widget) {\r
2437                         widget.destroy();\r
2438                     }\r
2439                     results.push($.removeData(el, data_key));\r
2440                 }\r
2441                 return results;\r
2442             };\r
2443             callFunction = function($el, function_name, args) {\r
2444                 var el, i, len, result, widget, widget_function;\r
2445                 result = null;\r
2446                 for (i = 0, len = $el.length; i < len; i++) {\r
2447                     el = $el[i];\r
2448                     widget = $.data(el, getDataKey());\r
2449                     if (widget && (widget instanceof SimpleWidget)) {\r
2450                         widget_function = widget[function_name];\r
2451                         if (widget_function && (typeof widget_function === 'function')) {\r
2452                             result = widget_function.apply(widget, args);\r
2453                         }\r
2454                     }\r
2455                 }\r
2456                 return result;\r
2457             };\r
2458             return $.fn[widget_name] = function() {\r
2459                 var $el, args, argument1, function_name, options;\r
2460                 argument1 = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];\r
2461                 $el = this;\r
2462                 if (argument1 === void 0 || typeof argument1 === 'object') {\r
2463                     options = argument1;\r
2464                     return createWidget($el, options);\r
2465                 } else if (typeof argument1 === 'string' && argument1[0] !== '_') {\r
2466                     function_name = argument1;\r
2467                     if (function_name === 'destroy') {\r
2468                         return destroyWidget($el);\r
2469                     } else if (function_name === 'get_widget_class') {\r
2470                         return widget_class;\r
2471                     } else {\r
2472                         return callFunction($el, function_name, args);\r
2473                     }\r
2474                 }\r
2475             };\r
2476         };\r
2477 \r
2478         return SimpleWidget;\r
2479 \r
2480     })();\r
2481 \r
2482     module.exports = SimpleWidget;\r
2483 \r
2484 },{}],11:[function(require,module,exports){\r
2485     var $, BorderDropHint, DragAndDropHandler, DragElement, ElementsRenderer, FolderElement, GhostDropHint, HitAreasGenerator, JqTreeWidget, KeyHandler, MouseWidget, Node, NodeElement, Position, SaveStateHandler, ScrollHandler, SelectNodeHandler, SimpleWidget, __version__, drag_and_drop_handler, node_module, ref, util_module,\r
2486         extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\r
2487         hasProp = {}.hasOwnProperty;\r
2488 \r
2489     __version__ = require('./version');\r
2490 \r
2491     drag_and_drop_handler = require('./drag_and_drop_handler');\r
2492 \r
2493     ElementsRenderer = require('./elements_renderer');\r
2494 \r
2495     KeyHandler = require('./key_handler');\r
2496 \r
2497     MouseWidget = require('./mouse.widget');\r
2498 \r
2499     SaveStateHandler = require('./save_state_handler');\r
2500 \r
2501     ScrollHandler = require('./scroll_handler');\r
2502 \r
2503     SelectNodeHandler = require('./select_node_handler');\r
2504 \r
2505     SimpleWidget = require('./simple.widget');\r
2506 \r
2507     node_module = require('./node');\r
2508 \r
2509     Node = node_module.Node;\r
2510 \r
2511     Position = node_module.Position;\r
2512 \r
2513     util_module = require('./util');\r
2514 \r
2515     ref = require('./node_element'), BorderDropHint = ref.BorderDropHint, FolderElement = ref.FolderElement, GhostDropHint = ref.GhostDropHint, NodeElement = ref.NodeElement;\r
2516 \r
2517     DragAndDropHandler = drag_and_drop_handler.DragAndDropHandler, DragElement = drag_and_drop_handler.DragElement, HitAreasGenerator = drag_and_drop_handler.HitAreasGenerator;\r
2518 \r
2519     $ = jQuery;\r
2520 \r
2521     JqTreeWidget = (function(superClass) {\r
2522         extend(JqTreeWidget, superClass);\r
2523 \r
2524         function JqTreeWidget() {\r
2525             return JqTreeWidget.__super__.constructor.apply(this, arguments);\r
2526         }\r
2527 \r
2528         JqTreeWidget.prototype.BorderDropHint = BorderDropHint;\r
2529 \r
2530         JqTreeWidget.prototype.DragElement = DragElement;\r
2531 \r
2532         JqTreeWidget.prototype.DragAndDropHandler = DragAndDropHandler;\r
2533 \r
2534         JqTreeWidget.prototype.ElementsRenderer = ElementsRenderer;\r
2535 \r
2536         JqTreeWidget.prototype.GhostDropHint = GhostDropHint;\r
2537 \r
2538         JqTreeWidget.prototype.HitAreasGenerator = HitAreasGenerator;\r
2539 \r
2540         JqTreeWidget.prototype.Node = Node;\r
2541 \r
2542         JqTreeWidget.prototype.SaveStateHandler = SaveStateHandler;\r
2543 \r
2544         JqTreeWidget.prototype.ScrollHandler = ScrollHandler;\r
2545 \r
2546         JqTreeWidget.prototype.SelectNodeHandler = SelectNodeHandler;\r
2547 \r
2548         JqTreeWidget.prototype.defaults = {\r
2549             autoOpen: false,\r
2550             saveState: false,\r
2551             dragAndDrop: false,\r
2552             selectable: true,\r
2553             useContextMenu: true,\r
2554             onCanSelectNode: null,\r
2555             onSetStateFromStorage: null,\r
2556             onGetStateFromStorage: null,\r
2557             onCreateLi: null,\r
2558             onIsMoveHandle: null,\r
2559             onCanMove: null,\r
2560             onCanMoveTo: null,\r
2561             onLoadFailed: null,\r
2562             autoEscape: true,\r
2563             dataUrl: null,\r
2564             closedIcon: null,\r
2565             openedIcon: '&#x25bc;',\r
2566             slide: true,\r
2567             nodeClass: Node,\r
2568             dataFilter: null,\r
2569             keyboardSupport: true,\r
2570             openFolderDelay: 500,\r
2571             rtl: null,\r
2572             onDragMove: null,\r
2573             onDragStop: null,\r
2574             buttonLeft: true,\r
2575             onLoading: null\r
2576         };\r
2577 \r
2578         JqTreeWidget.prototype.toggle = function(node, slide) {\r
2579             if (slide == null) {\r
2580                 slide = null;\r
2581             }\r
2582             if (slide === null) {\r
2583                 slide = this.options.slide;\r
2584             }\r
2585             if (node.is_open) {\r
2586                 this.closeNode(node, slide);\r
2587             } else {\r
2588                 this.openNode(node, slide);\r
2589             }\r
2590             return this.element;\r
2591         };\r
2592 \r
2593         JqTreeWidget.prototype.getTree = function() {\r
2594             return this.tree;\r
2595         };\r
2596 \r
2597         JqTreeWidget.prototype.selectNode = function(node) {\r
2598             this._selectNode(node, false);\r
2599             return this.element;\r
2600         };\r
2601 \r
2602         JqTreeWidget.prototype._selectNode = function(node, must_toggle) {\r
2603             var canSelect, deselected_node, openParents, saveState;\r
2604             if (must_toggle == null) {\r
2605                 must_toggle = false;\r
2606             }\r
2607             if (!this.select_node_handler) {\r
2608                 return;\r
2609             }\r
2610             canSelect = (function(_this) {\r
2611                 return function() {\r
2612                     if (_this.options.onCanSelectNode) {\r
2613                         return _this.options.selectable && _this.options.onCanSelectNode(node);\r
2614                     } else {\r
2615                         return _this.options.selectable;\r
2616                     }\r
2617                 };\r
2618             })(this);\r
2619             openParents = (function(_this) {\r
2620                 return function() {\r
2621                     var parent;\r
2622                     parent = node.parent;\r
2623                     if (parent && parent.parent && !parent.is_open) {\r
2624                         return _this.openNode(parent, false);\r
2625                     }\r
2626                 };\r
2627             })(this);\r
2628             saveState = (function(_this) {\r
2629                 return function() {\r
2630                     if (_this.options.saveState) {\r
2631                         return _this.save_state_handler.saveState();\r
2632                     }\r
2633                 };\r
2634             })(this);\r
2635             if (!node) {\r
2636                 this._deselectCurrentNode();\r
2637                 saveState();\r
2638                 return;\r
2639             }\r
2640             if (!canSelect()) {\r
2641                 return;\r
2642             }\r
2643             if (this.select_node_handler.isNodeSelected(node)) {\r
2644                 if (must_toggle) {\r
2645                     this._deselectCurrentNode();\r
2646                     this._triggerEvent('tree.select', {\r
2647                         node: null,\r
2648                         previous_node: node\r
2649                     });\r
2650                 }\r
2651             } else {\r
2652                 deselected_node = this.getSelectedNode();\r
2653                 this._deselectCurrentNode();\r
2654                 this.addToSelection(node);\r
2655                 this._triggerEvent('tree.select', {\r
2656                     node: node,\r
2657                     deselected_node: deselected_node\r
2658                 });\r
2659                 openParents();\r
2660             }\r
2661             return saveState();\r
2662         };\r
2663 \r
2664         JqTreeWidget.prototype.getSelectedNode = function() {\r
2665             if (this.select_node_handler) {\r
2666                 return this.select_node_handler.getSelectedNode();\r
2667             } else {\r
2668                 return null;\r
2669             }\r
2670         };\r
2671 \r
2672         JqTreeWidget.prototype.toJson = function() {\r
2673             return JSON.stringify(this.tree.getData());\r
2674         };\r
2675 \r
2676         JqTreeWidget.prototype.loadData = function(data, parent_node) {\r
2677             this._loadData(data, parent_node);\r
2678             return this.element;\r
2679         };\r
2680 \r
2681 \r
2682         /*\r
2683          signatures:\r
2684          - loadDataFromUrl(url, parent_node=null, on_finished=null)\r
2685          loadDataFromUrl('/my_data');\r
2686          loadDataFromUrl('/my_data', node1);\r
2687          loadDataFromUrl('/my_data', node1, function() { console.log('finished'); });\r
2688          loadDataFromUrl('/my_data', null, function() { console.log('finished'); });\r
2689 \r
2690          - loadDataFromUrl(parent_node=null, on_finished=null)\r
2691          loadDataFromUrl();\r
2692          loadDataFromUrl(node1);\r
2693          loadDataFromUrl(null, function() { console.log('finished'); });\r
2694          loadDataFromUrl(node1, function() { console.log('finished'); });\r
2695          */\r
2696 \r
2697         JqTreeWidget.prototype.loadDataFromUrl = function(param1, param2, param3) {\r
2698             if ($.type(param1) === 'string') {\r
2699                 this._loadDataFromUrl(param1, param2, param3);\r
2700             } else {\r
2701                 this._loadDataFromUrl(null, param1, param2);\r
2702             }\r
2703             return this.element;\r
2704         };\r
2705 \r
2706         JqTreeWidget.prototype.reload = function(on_finished) {\r
2707             this._loadDataFromUrl(null, null, on_finished);\r
2708             return this.element;\r
2709         };\r
2710 \r
2711         JqTreeWidget.prototype._loadDataFromUrl = function(url_info, parent_node, on_finished) {\r
2712             var $el, addLoadingClass, handeLoadData, handleError, handleSuccess, loadDataFromUrlInfo, parseUrlInfo, removeLoadingClass;\r
2713             $el = null;\r
2714             addLoadingClass = (function(_this) {\r
2715                 return function() {\r
2716                     if (parent_node) {\r
2717                         $el = $(parent_node.element);\r
2718                     } else {\r
2719                         $el = _this.element;\r
2720                     }\r
2721                     $el.addClass('jqtree-loading');\r
2722                     return _this._notifyLoading(true, parent_node, $el);\r
2723                 };\r
2724             })(this);\r
2725             removeLoadingClass = (function(_this) {\r
2726                 return function() {\r
2727                     if ($el) {\r
2728                         $el.removeClass('jqtree-loading');\r
2729                         return _this._notifyLoading(false, parent_node, $el);\r
2730                     }\r
2731                 };\r
2732             })(this);\r
2733             parseUrlInfo = function() {\r
2734                 if ($.type(url_info) === 'string') {\r
2735                     return {\r
2736                         url: url_info\r
2737                     };\r
2738                 }\r
2739                 if (!url_info.method) {\r
2740                     url_info.method = 'get';\r
2741                 }\r
2742                 return url_info;\r
2743             };\r
2744             handeLoadData = (function(_this) {\r
2745                 return function(data) {\r
2746                     removeLoadingClass();\r
2747                     _this._loadData(data, parent_node);\r
2748                     if (on_finished && $.isFunction(on_finished)) {\r
2749                         return on_finished();\r
2750                     }\r
2751                 };\r
2752             })(this);\r
2753             handleSuccess = (function(_this) {\r
2754                 return function(response) {\r
2755                     var data;\r
2756                     if ($.isArray(response) || typeof response === 'object') {\r
2757                         data = response;\r
2758                     } else if (data != null) {\r
2759                         data = $.parseJSON(response);\r
2760                     } else {\r
2761                         data = [];\r
2762                     }\r
2763                     if (_this.options.dataFilter) {\r
2764                         data = _this.options.dataFilter(data);\r
2765                     }\r
2766                     return handeLoadData(data);\r
2767                 };\r
2768             })(this);\r
2769             handleError = (function(_this) {\r
2770                 return function(response) {\r
2771                     removeLoadingClass();\r
2772                     if (_this.options.onLoadFailed) {\r
2773                         return _this.options.onLoadFailed(response);\r
2774                     }\r
2775                 };\r
2776             })(this);\r
2777             loadDataFromUrlInfo = function() {\r
2778                 url_info = parseUrlInfo();\r
2779                 return $.ajax($.extend({}, url_info, {\r
2780                     method: url_info.method != null ? url_info.method.toUpperCase() : 'GET',\r
2781                     cache: false,\r
2782                     dataType: 'json',\r
2783                     success: handleSuccess,\r
2784                     error: handleError\r
2785                 }));\r
2786             };\r
2787             if (!url_info) {\r
2788                 url_info = this._getDataUrlInfo(parent_node);\r
2789             }\r
2790             addLoadingClass();\r
2791             if (!url_info) {\r
2792                 removeLoadingClass();\r
2793             } else if ($.isArray(url_info)) {\r
2794                 handeLoadData(url_info);\r
2795             } else {\r
2796                 loadDataFromUrlInfo();\r
2797             }\r
2798         };\r
2799 \r
2800         JqTreeWidget.prototype._loadData = function(data, parent_node) {\r
2801             var deselectNodes, loadSubtree;\r
2802             if (parent_node == null) {\r
2803                 parent_node = null;\r
2804             }\r
2805             deselectNodes = (function(_this) {\r
2806                 return function() {\r
2807                     var i, len, n, selected_nodes_under_parent;\r
2808                     if (_this.select_node_handler) {\r
2809                         selected_nodes_under_parent = _this.select_node_handler.getSelectedNodesUnder(parent_node);\r
2810                         for (i = 0, len = selected_nodes_under_parent.length; i < len; i++) {\r
2811                             n = selected_nodes_under_parent[i];\r
2812                             _this.select_node_handler.removeFromSelection(n);\r
2813                         }\r
2814                     }\r
2815                     return null;\r
2816                 };\r
2817             })(this);\r
2818             loadSubtree = (function(_this) {\r
2819                 return function() {\r
2820                     parent_node.loadFromData(data);\r
2821                     parent_node.load_on_demand = false;\r
2822                     parent_node.is_loading = false;\r
2823                     return _this._refreshElements(parent_node);\r
2824                 };\r
2825             })(this);\r
2826             if (!data) {\r
2827                 return;\r
2828             }\r
2829             this._triggerEvent('tree.load_data', {\r
2830                 tree_data: data\r
2831             });\r
2832             if (!parent_node) {\r
2833                 this._initTree(data);\r
2834             } else {\r
2835                 deselectNodes();\r
2836                 loadSubtree();\r
2837             }\r
2838             if (this.isDragging()) {\r
2839                 return this.dnd_handler.refresh();\r
2840             }\r
2841         };\r
2842 \r
2843         JqTreeWidget.prototype.getNodeById = function(node_id) {\r
2844             return this.tree.getNodeById(node_id);\r
2845         };\r
2846 \r
2847         JqTreeWidget.prototype.getNodeByName = function(name) {\r
2848             return this.tree.getNodeByName(name);\r
2849         };\r
2850 \r
2851         JqTreeWidget.prototype.getNodesByProperty = function(key, value) {\r
2852             return this.tree.getNodesByProperty(key, value);\r
2853         };\r
2854 \r
2855         JqTreeWidget.prototype.getNodeByHtmlElement = function(element) {\r
2856             return this._getNode($(element));\r
2857         };\r
2858 \r
2859         JqTreeWidget.prototype.getNodeByCallback = function(callback) {\r
2860             return this.tree.getNodeByCallback(callback);\r
2861         };\r
2862 \r
2863         JqTreeWidget.prototype.openNode = function(node, slide) {\r
2864             if (slide == null) {\r
2865                 slide = null;\r
2866             }\r
2867             if (node) {\r
2868                 if (slide === null) {\r
2869                     slide = this.options.slide;\r
2870                 }\r
2871                 this._openNode(node, slide);\r
2872             }\r
2873             return this.element;\r
2874         };\r
2875 \r
2876         JqTreeWidget.prototype._openNode = function(node, slide, on_finished) {\r
2877             var doOpenNode, parent;\r
2878             if (slide == null) {\r
2879                 slide = true;\r
2880             }\r
2881             doOpenNode = (function(_this) {\r
2882                 return function(_node, _slide, _on_finished) {\r
2883                     var folder_element;\r
2884                     folder_element = new FolderElement(_node, _this);\r
2885                     return folder_element.open(_on_finished, _slide);\r
2886                 };\r
2887             })(this);\r
2888             if (node.isFolder()) {\r
2889                 if (node.load_on_demand) {\r
2890                     return this._loadFolderOnDemand(node, slide, on_finished);\r
2891                 } else {\r
2892                     parent = node.parent;\r
2893                     while (parent) {\r
2894                         if (parent.parent) {\r
2895                             doOpenNode(parent, false, null);\r
2896                         }\r
2897                         parent = parent.parent;\r
2898                     }\r
2899                     doOpenNode(node, slide, on_finished);\r
2900                     return this._saveState();\r
2901                 }\r
2902             }\r
2903         };\r
2904 \r
2905         JqTreeWidget.prototype._loadFolderOnDemand = function(node, slide, on_finished) {\r
2906             if (slide == null) {\r
2907                 slide = true;\r
2908             }\r
2909             node.is_loading = true;\r
2910             return this._loadDataFromUrl(null, node, (function(_this) {\r
2911                 return function() {\r
2912                     return _this._openNode(node, slide, on_finished);\r
2913                 };\r
2914             })(this));\r
2915         };\r
2916 \r
2917         JqTreeWidget.prototype.closeNode = function(node, slide) {\r
2918             if (slide == null) {\r
2919                 slide = null;\r
2920             }\r
2921             if (slide === null) {\r
2922                 slide = this.options.slide;\r
2923             }\r
2924             if (node.isFolder()) {\r
2925                 new FolderElement(node, this).close(slide);\r
2926                 this._saveState();\r
2927             }\r
2928             return this.element;\r
2929         };\r
2930 \r
2931         JqTreeWidget.prototype.isDragging = function() {\r
2932             if (this.dnd_handler) {\r
2933                 return this.dnd_handler.is_dragging;\r
2934             } else {\r
2935                 return false;\r
2936             }\r
2937         };\r
2938 \r
2939         JqTreeWidget.prototype.refreshHitAreas = function() {\r
2940             this.dnd_handler.refresh();\r
2941             return this.element;\r
2942         };\r
2943 \r
2944         JqTreeWidget.prototype.addNodeAfter = function(new_node_info, existing_node) {\r
2945             var new_node;\r
2946             new_node = existing_node.addAfter(new_node_info);\r
2947             this._refreshElements(existing_node.parent);\r
2948             return new_node;\r
2949         };\r
2950 \r
2951         JqTreeWidget.prototype.addNodeBefore = function(new_node_info, existing_node) {\r
2952             var new_node;\r
2953             new_node = existing_node.addBefore(new_node_info);\r
2954             this._refreshElements(existing_node.parent);\r
2955             return new_node;\r
2956         };\r
2957 \r
2958         JqTreeWidget.prototype.addParentNode = function(new_node_info, existing_node) {\r
2959             var new_node;\r
2960             new_node = existing_node.addParent(new_node_info);\r
2961             this._refreshElements(new_node.parent);\r
2962             return new_node;\r
2963         };\r
2964 \r
2965         JqTreeWidget.prototype.removeNode = function(node) {\r
2966             var parent;\r
2967             parent = node.parent;\r
2968             if (parent) {\r
2969                 this.select_node_handler.removeFromSelection(node, true);\r
2970                 node.remove();\r
2971                 this._refreshElements(parent);\r
2972             }\r
2973             return this.element;\r
2974         };\r
2975 \r
2976         JqTreeWidget.prototype.appendNode = function(new_node_info, parent_node) {\r
2977             var node;\r
2978             parent_node = parent_node || this.tree;\r
2979             node = parent_node.append(new_node_info);\r
2980             this._refreshElements(parent_node);\r
2981             return node;\r
2982         };\r
2983 \r
2984         JqTreeWidget.prototype.prependNode = function(new_node_info, parent_node) {\r
2985             var node;\r
2986             if (!parent_node) {\r
2987                 parent_node = this.tree;\r
2988             }\r
2989             node = parent_node.prepend(new_node_info);\r
2990             this._refreshElements(parent_node);\r
2991             return node;\r
2992         };\r
2993 \r
2994         JqTreeWidget.prototype.updateNode = function(node, data) {\r
2995             var id_is_changed;\r
2996             id_is_changed = data.id && data.id !== node.id;\r
2997             if (id_is_changed) {\r
2998                 this.tree.removeNodeFromIndex(node);\r
2999             }\r
3000             node.setData(data);\r
3001             if (id_is_changed) {\r
3002                 this.tree.addNodeToIndex(node);\r
3003             }\r
3004             if (typeof data === 'object' && data.children) {\r
3005                 node.removeChildren();\r
3006                 if (data.children.length) {\r
3007                     node.loadFromData(data.children);\r
3008                 }\r
3009             }\r
3010             this.renderer.renderFromNode(node);\r
3011             this._selectCurrentNode();\r
3012             return this.element;\r
3013         };\r
3014 \r
3015         JqTreeWidget.prototype.moveNode = function(node, target_node, position) {\r
3016             var position_index;\r
3017             position_index = Position.nameToIndex(position);\r
3018             this.tree.moveNode(node, target_node, position_index);\r
3019             this._refreshElements();\r
3020             return this.element;\r
3021         };\r
3022 \r
3023         JqTreeWidget.prototype.getStateFromStorage = function() {\r
3024             return this.save_state_handler.getStateFromStorage();\r
3025         };\r
3026 \r
3027         JqTreeWidget.prototype.addToSelection = function(node) {\r
3028             if (node) {\r
3029                 this.select_node_handler.addToSelection(node);\r
3030                 this._getNodeElementForNode(node).select();\r
3031                 this._saveState();\r
3032             }\r
3033             return this.element;\r
3034         };\r
3035 \r
3036         JqTreeWidget.prototype.getSelectedNodes = function() {\r
3037             return this.select_node_handler.getSelectedNodes();\r
3038         };\r
3039 \r
3040         JqTreeWidget.prototype.isNodeSelected = function(node) {\r
3041             return this.select_node_handler.isNodeSelected(node);\r
3042         };\r
3043 \r
3044         JqTreeWidget.prototype.removeFromSelection = function(node) {\r
3045             this.select_node_handler.removeFromSelection(node);\r
3046             this._getNodeElementForNode(node).deselect();\r
3047             this._saveState();\r
3048             return this.element;\r
3049         };\r
3050 \r
3051         JqTreeWidget.prototype.scrollToNode = function(node) {\r
3052             var $element, top;\r
3053             $element = $(node.element);\r
3054             top = $element.offset().top - this.$el.offset().top;\r
3055             this.scroll_handler.scrollTo(top);\r
3056             return this.element;\r
3057         };\r
3058 \r
3059         JqTreeWidget.prototype.getState = function() {\r
3060             return this.save_state_handler.getState();\r
3061         };\r
3062 \r
3063         JqTreeWidget.prototype.setState = function(state) {\r
3064             this.save_state_handler.setInitialState(state);\r
3065             this._refreshElements();\r
3066             return this.element;\r
3067         };\r
3068 \r
3069         JqTreeWidget.prototype.setOption = function(option, value) {\r
3070             this.options[option] = value;\r
3071             return this.element;\r
3072         };\r
3073 \r
3074         JqTreeWidget.prototype.moveDown = function() {\r
3075             if (this.key_handler) {\r
3076                 this.key_handler.moveDown();\r
3077             }\r
3078             return this.element;\r
3079         };\r
3080 \r
3081         JqTreeWidget.prototype.moveUp = function() {\r
3082             if (this.key_handler) {\r
3083                 this.key_handler.moveUp();\r
3084             }\r
3085             return this.element;\r
3086         };\r
3087 \r
3088         JqTreeWidget.prototype.getVersion = function() {\r
3089             return __version__;\r
3090         };\r
3091 \r
3092         JqTreeWidget.prototype._init = function() {\r
3093             JqTreeWidget.__super__._init.call(this);\r
3094             this.element = this.$el;\r
3095             this.mouse_delay = 300;\r
3096             this.is_initialized = false;\r
3097             this.options.rtl = this._getRtlOption();\r
3098             if (!this.options.closedIcon) {\r
3099                 this.options.closedIcon = this._getDefaultClosedIcon();\r
3100             }\r
3101             this.renderer = new ElementsRenderer(this);\r
3102             if (SaveStateHandler != null) {\r
3103                 this.save_state_handler = new SaveStateHandler(this);\r
3104             } else {\r
3105                 this.options.saveState = false;\r
3106             }\r
3107             if (SelectNodeHandler != null) {\r
3108                 this.select_node_handler = new SelectNodeHandler(this);\r
3109             }\r
3110             if (DragAndDropHandler != null) {\r
3111                 this.dnd_handler = new DragAndDropHandler(this);\r
3112             } else {\r
3113                 this.options.dragAndDrop = false;\r
3114             }\r
3115             if (ScrollHandler != null) {\r
3116                 this.scroll_handler = new ScrollHandler(this);\r
3117             }\r
3118             if ((KeyHandler != null) && (SelectNodeHandler != null)) {\r
3119                 this.key_handler = new KeyHandler(this);\r
3120             }\r
3121             this._initData();\r
3122             this.element.click($.proxy(this._click, this));\r
3123             this.element.dblclick($.proxy(this._dblclick, this));\r
3124             if (this.options.useContextMenu) {\r
3125                 return this.element.bind('contextmenu', $.proxy(this._contextmenu, this));\r
3126             }\r
3127         };\r
3128 \r
3129         JqTreeWidget.prototype._deinit = function() {\r
3130             this.element.empty();\r
3131             this.element.unbind();\r
3132             if (this.key_handler) {\r
3133                 this.key_handler.deinit();\r
3134             }\r
3135             this.tree = null;\r
3136             return JqTreeWidget.__super__._deinit.call(this);\r
3137         };\r
3138 \r
3139         JqTreeWidget.prototype._initData = function() {\r
3140             var data_url;\r
3141             if (this.options.data) {\r
3142                 return this._loadData(this.options.data);\r
3143             } else {\r
3144                 data_url = this._getDataUrlInfo();\r
3145                 if (data_url) {\r
3146                     return this._loadDataFromUrl();\r
3147                 } else {\r
3148                     return this._loadData([]);\r
3149                 }\r
3150             }\r
3151         };\r
3152 \r
3153         JqTreeWidget.prototype._getDataUrlInfo = function(node) {\r
3154             var data_url, getUrlFromString;\r
3155             data_url = this.options.dataUrl || this.element.data('url');\r
3156             getUrlFromString = (function(_this) {\r
3157                 return function() {\r
3158                     var data, selected_node_id, url_info;\r
3159                     url_info = {\r
3160                         url: data_url\r
3161                     };\r
3162                     if (node && node.id) {\r
3163                         data = {\r
3164                             node: node.id\r
3165                         };\r
3166                         url_info['data'] = data;\r
3167                     } else {\r
3168                         selected_node_id = _this._getNodeIdToBeSelected();\r
3169                         if (selected_node_id) {\r
3170                             data = {\r
3171                                 selected_node: selected_node_id\r
3172                             };\r
3173                             url_info['data'] = data;\r
3174                         }\r
3175                     }\r
3176                     return url_info;\r
3177                 };\r
3178             })(this);\r
3179             if ($.isFunction(data_url)) {\r
3180                 return data_url(node);\r
3181             } else if ($.type(data_url) === 'string') {\r
3182                 return getUrlFromString();\r
3183             } else {\r
3184                 return data_url;\r
3185             }\r
3186         };\r
3187 \r
3188         JqTreeWidget.prototype._getNodeIdToBeSelected = function() {\r
3189             if (this.options.saveState) {\r
3190                 return this.save_state_handler.getNodeIdToBeSelected();\r
3191             } else {\r
3192                 return null;\r
3193             }\r
3194         };\r
3195 \r
3196         JqTreeWidget.prototype._initTree = function(data) {\r
3197             var doInit, must_load_on_demand;\r
3198             doInit = (function(_this) {\r
3199                 return function() {\r
3200                     if (!_this.is_initialized) {\r
3201                         _this.is_initialized = true;\r
3202                         return _this._triggerEvent('tree.init');\r
3203                     }\r
3204                 };\r
3205             })(this);\r
3206             this.tree = new this.options.nodeClass(null, true, this.options.nodeClass);\r
3207             if (this.select_node_handler) {\r
3208                 this.select_node_handler.clear();\r
3209             }\r
3210             this.tree.loadFromData(data);\r
3211             must_load_on_demand = this._setInitialState();\r
3212             this._refreshElements();\r
3213             if (!must_load_on_demand) {\r
3214                 return doInit();\r
3215             } else {\r
3216                 return this._setInitialStateOnDemand(doInit);\r
3217             }\r
3218         };\r
3219 \r
3220         JqTreeWidget.prototype._setInitialState = function() {\r
3221             var autoOpenNodes, is_restored, must_load_on_demand, ref1, restoreState;\r
3222             restoreState = (function(_this) {\r
3223                 return function() {\r
3224                     var must_load_on_demand, state;\r
3225                     if (!(_this.options.saveState && _this.save_state_handler)) {\r
3226                         return [false, false];\r
3227                     } else {\r
3228                         state = _this.save_state_handler.getStateFromStorage();\r
3229                         if (!state) {\r
3230                             return [false, false];\r
3231                         } else {\r
3232                             must_load_on_demand = _this.save_state_handler.setInitialState(state);\r
3233                             return [true, must_load_on_demand];\r
3234                         }\r
3235                     }\r
3236                 };\r
3237             })(this);\r
3238             autoOpenNodes = (function(_this) {\r
3239                 return function() {\r
3240                     var max_level, must_load_on_demand;\r
3241                     if (_this.options.autoOpen === false) {\r
3242                         return false;\r
3243                     }\r
3244                     max_level = _this._getAutoOpenMaxLevel();\r
3245                     must_load_on_demand = false;\r
3246                     _this.tree.iterate(function(node, level) {\r
3247                         if (node.load_on_demand) {\r
3248                             must_load_on_demand = true;\r
3249                             return false;\r
3250                         } else if (!node.hasChildren()) {\r
3251                             return false;\r
3252                         } else {\r
3253                             node.is_open = true;\r
3254                             return level !== max_level;\r
3255                         }\r
3256                     });\r
3257                     return must_load_on_demand;\r
3258                 };\r
3259             })(this);\r
3260             ref1 = restoreState(), is_restored = ref1[0], must_load_on_demand = ref1[1];\r
3261             if (!is_restored) {\r
3262                 must_load_on_demand = autoOpenNodes();\r
3263             }\r
3264             return must_load_on_demand;\r
3265         };\r
3266 \r
3267         JqTreeWidget.prototype._setInitialStateOnDemand = function(cb_finished) {\r
3268             var autoOpenNodes, restoreState;\r
3269             restoreState = (function(_this) {\r
3270                 return function() {\r
3271                     var state;\r
3272                     if (!(_this.options.saveState && _this.save_state_handler)) {\r
3273                         return false;\r
3274                     } else {\r
3275                         state = _this.save_state_handler.getStateFromStorage();\r
3276                         if (!state) {\r
3277                             return false;\r
3278                         } else {\r
3279                             _this.save_state_handler.setInitialStateOnDemand(state, cb_finished);\r
3280                             return true;\r
3281                         }\r
3282                     }\r
3283                 };\r
3284             })(this);\r
3285             autoOpenNodes = (function(_this) {\r
3286                 return function() {\r
3287                     var loadAndOpenNode, loading_count, max_level, openNodes;\r
3288                     max_level = _this._getAutoOpenMaxLevel();\r
3289                     loading_count = 0;\r
3290                     loadAndOpenNode = function(node) {\r
3291                         loading_count += 1;\r
3292                         return _this._openNode(node, false, function() {\r
3293                             loading_count -= 1;\r
3294                             return openNodes();\r
3295                         });\r
3296                     };\r
3297                     openNodes = function() {\r
3298                         _this.tree.iterate(function(node, level) {\r
3299                             if (node.load_on_demand) {\r
3300                                 if (!node.is_loading) {\r
3301                                     loadAndOpenNode(node);\r
3302                                 }\r
3303                                 return false;\r
3304                             } else {\r
3305                                 _this._openNode(node, false);\r
3306                                 return level !== max_level;\r
3307                             }\r
3308                         });\r
3309                         if (loading_count === 0) {\r
3310                             return cb_finished();\r
3311                         }\r
3312                     };\r
3313                     return openNodes();\r
3314                 };\r
3315             })(this);\r
3316             if (!restoreState()) {\r
3317                 return autoOpenNodes();\r
3318             }\r
3319         };\r
3320 \r
3321         JqTreeWidget.prototype._getAutoOpenMaxLevel = function() {\r
3322             if (this.options.autoOpen === true) {\r
3323                 return -1;\r
3324             } else {\r
3325                 return parseInt(this.options.autoOpen);\r
3326             }\r
3327         };\r
3328 \r
3329 \r
3330         /*\r
3331          Redraw the tree or part of the tree.\r
3332          * from_node: redraw this subtree\r
3333          */\r
3334 \r
3335         JqTreeWidget.prototype._refreshElements = function(from_node) {\r
3336             if (from_node == null) {\r
3337                 from_node = null;\r
3338             }\r
3339             this.renderer.render(from_node);\r
3340             return this._triggerEvent('tree.refresh');\r
3341         };\r
3342 \r
3343         JqTreeWidget.prototype._click = function(e) {\r
3344             var click_target, event, node;\r
3345             click_target = this._getClickTarget(e.target);\r
3346             if (click_target) {\r
3347                 if (click_target.type === 'button') {\r
3348                     this.toggle(click_target.node, this.options.slide);\r
3349                     e.preventDefault();\r
3350                     return e.stopPropagation();\r
3351                 } else if (click_target.type === 'label') {\r
3352                     node = click_target.node;\r
3353                     event = this._triggerEvent('tree.click', {\r
3354                         node: node,\r
3355                         click_event: e\r
3356                     });\r
3357                     if (!event.isDefaultPrevented()) {\r
3358                         return this._selectNode(node, true);\r
3359                     }\r
3360                 }\r
3361             }\r
3362         };\r
3363 \r
3364         JqTreeWidget.prototype._dblclick = function(e) {\r
3365             var click_target;\r
3366             click_target = this._getClickTarget(e.target);\r
3367             if (click_target && click_target.type === 'label') {\r
3368                 return this._triggerEvent('tree.dblclick', {\r
3369                     node: click_target.node,\r
3370                     click_event: e\r
3371                 });\r
3372             }\r
3373         };\r
3374 \r
3375         JqTreeWidget.prototype._getClickTarget = function(element) {\r
3376             var $button, $el, $target, node;\r
3377             $target = $(element);\r
3378             $button = $target.closest('.jqtree-toggler');\r
3379             if ($button.length) {\r
3380                 node = this._getNode($button);\r
3381                 if (node) {\r
3382                     return {\r
3383                         type: 'button',\r
3384                         node: node\r
3385                     };\r
3386                 }\r
3387             } else {\r
3388                 $el = $target.closest('.jqtree-element');\r
3389                 if ($el.length) {\r
3390                     node = this._getNode($el);\r
3391                     if (node) {\r
3392                         return {\r
3393                             type: 'label',\r
3394                             node: node\r
3395                         };\r
3396                     }\r
3397                 }\r
3398             }\r
3399             return null;\r
3400         };\r
3401 \r
3402         JqTreeWidget.prototype._getNode = function($element) {\r
3403             var $li;\r
3404             $li = $element.closest('li.jqtree_common');\r
3405             if ($li.length === 0) {\r
3406                 return null;\r
3407             } else {\r
3408                 return $li.data('node');\r
3409             }\r
3410         };\r
3411 \r
3412         JqTreeWidget.prototype._getNodeElementForNode = function(node) {\r
3413             if (node.isFolder()) {\r
3414                 return new FolderElement(node, this);\r
3415             } else {\r
3416                 return new NodeElement(node, this);\r
3417             }\r
3418         };\r
3419 \r
3420         JqTreeWidget.prototype._getNodeElement = function($element) {\r
3421             var node;\r
3422             node = this._getNode($element);\r
3423             if (node) {\r
3424                 return this._getNodeElementForNode(node);\r
3425             } else {\r
3426                 return null;\r
3427             }\r
3428         };\r
3429 \r
3430         JqTreeWidget.prototype._contextmenu = function(e) {\r
3431             var $div, node;\r
3432             $div = $(e.target).closest('ul.jqtree-tree .jqtree-element');\r
3433             if ($div.length) {\r
3434                 node = this._getNode($div);\r
3435                 if (node) {\r
3436                     e.preventDefault();\r
3437                     e.stopPropagation();\r
3438                     this._triggerEvent('tree.contextmenu', {\r
3439                         node: node,\r
3440                         click_event: e\r
3441                     });\r
3442                     return false;\r
3443                 }\r
3444             }\r
3445         };\r
3446 \r
3447         JqTreeWidget.prototype._saveState = function() {\r
3448             if (this.options.saveState) {\r
3449                 return this.save_state_handler.saveState();\r
3450             }\r
3451         };\r
3452 \r
3453         JqTreeWidget.prototype._mouseCapture = function(position_info) {\r
3454             if (this.options.dragAndDrop) {\r
3455                 return this.dnd_handler.mouseCapture(position_info);\r
3456             } else {\r
3457                 return false;\r
3458             }\r
3459         };\r
3460 \r
3461         JqTreeWidget.prototype._mouseStart = function(position_info) {\r
3462             if (this.options.dragAndDrop) {\r
3463                 return this.dnd_handler.mouseStart(position_info);\r
3464             } else {\r
3465                 return false;\r
3466             }\r
3467         };\r
3468 \r
3469         JqTreeWidget.prototype._mouseDrag = function(position_info) {\r
3470             var result;\r
3471             if (this.options.dragAndDrop) {\r
3472                 result = this.dnd_handler.mouseDrag(position_info);\r
3473                 if (this.scroll_handler) {\r
3474                     this.scroll_handler.checkScrolling();\r
3475                 }\r
3476                 return result;\r
3477             } else {\r
3478                 return false;\r
3479             }\r
3480         };\r
3481 \r
3482         JqTreeWidget.prototype._mouseStop = function(position_info) {\r
3483             if (this.options.dragAndDrop) {\r
3484                 return this.dnd_handler.mouseStop(position_info);\r
3485             } else {\r
3486                 return false;\r
3487             }\r
3488         };\r
3489 \r
3490         JqTreeWidget.prototype._triggerEvent = function(event_name, values) {\r
3491             var event;\r
3492             event = $.Event(event_name);\r
3493             $.extend(event, values);\r
3494             this.element.trigger(event);\r
3495             return event;\r
3496         };\r
3497 \r
3498         JqTreeWidget.prototype.testGenerateHitAreas = function(moving_node) {\r
3499             this.dnd_handler.current_item = this._getNodeElementForNode(moving_node);\r
3500             this.dnd_handler.generateHitAreas();\r
3501             return this.dnd_handler.hit_areas;\r
3502         };\r
3503 \r
3504         JqTreeWidget.prototype._selectCurrentNode = function() {\r
3505             var node, node_element;\r
3506             node = this.getSelectedNode();\r
3507             if (node) {\r
3508                 node_element = this._getNodeElementForNode(node);\r
3509                 if (node_element) {\r
3510                     return node_element.select();\r
3511                 }\r
3512             }\r
3513         };\r
3514 \r
3515         JqTreeWidget.prototype._deselectCurrentNode = function() {\r
3516             var node;\r
3517             node = this.getSelectedNode();\r
3518             if (node) {\r
3519                 return this.removeFromSelection(node);\r
3520             }\r
3521         };\r
3522 \r
3523         JqTreeWidget.prototype._getDefaultClosedIcon = function() {\r
3524             if (this.options.rtl) {\r
3525                 return '&#x25c0;';\r
3526             } else {\r
3527                 return '&#x25ba;';\r
3528             }\r
3529         };\r
3530 \r
3531         JqTreeWidget.prototype._getRtlOption = function() {\r
3532             var data_rtl;\r
3533             if (this.options.rtl !== null) {\r
3534                 return this.options.rtl;\r
3535             } else {\r
3536                 data_rtl = this.element.data('rtl');\r
3537                 if ((data_rtl != null) && data_rtl !== false) {\r
3538                     return true;\r
3539                 } else {\r
3540                     return false;\r
3541                 }\r
3542             }\r
3543         };\r
3544 \r
3545         JqTreeWidget.prototype._notifyLoading = function(is_loading, node, $el) {\r
3546             if (this.options.onLoading) {\r
3547                 return this.options.onLoading(is_loading, node, $el);\r
3548             }\r
3549         };\r
3550 \r
3551         return JqTreeWidget;\r
3552 \r
3553     })(MouseWidget);\r
3554 \r
3555     JqTreeWidget.getModule = function(name) {\r
3556         var modules;\r
3557         modules = {\r
3558             'node': node_module,\r
3559             'util': util_module,\r
3560             'drag_and_drop_handler': drag_and_drop_handler\r
3561         };\r
3562         return modules[name];\r
3563     };\r
3564 \r
3565     SimpleWidget.register(JqTreeWidget, 'tree');\r
3566 \r
3567 },{"./drag_and_drop_handler":1,"./elements_renderer":2,"./key_handler":3,"./mouse.widget":4,"./node":5,"./node_element":6,"./save_state_handler":7,"./scroll_handler":8,"./select_node_handler":9,"./simple.widget":10,"./util":12,"./version":13}],12:[function(require,module,exports){\r
3568     var _indexOf, getBoolString, html_escape, indexOf, isInt;\r
3569 \r
3570     _indexOf = function(array, item) {\r
3571         var i, j, len, value;\r
3572         for (i = j = 0, len = array.length; j < len; i = ++j) {\r
3573             value = array[i];\r
3574             if (value === item) {\r
3575                 return i;\r
3576             }\r
3577         }\r
3578         return -1;\r
3579     };\r
3580 \r
3581     indexOf = function(array, item) {\r
3582         if (array.indexOf) {\r
3583             return array.indexOf(item);\r
3584         } else {\r
3585             return _indexOf(array, item);\r
3586         }\r
3587     };\r
3588 \r
3589     isInt = function(n) {\r
3590         return typeof n === 'number' && n % 1 === 0;\r
3591     };\r
3592 \r
3593     html_escape = function(string) {\r
3594         return ('' + string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g, '&#x2F;');\r
3595     };\r
3596 \r
3597     getBoolString = function(value) {\r
3598         if (value) {\r
3599             return 'true';\r
3600         } else {\r
3601             return 'false';\r
3602         }\r
3603     };\r
3604 \r
3605     module.exports = {\r
3606         _indexOf: _indexOf,\r
3607         getBoolString: getBoolString,\r
3608         html_escape: html_escape,\r
3609         indexOf: indexOf,\r
3610         isInt: isInt\r
3611     };\r
3612 \r
3613 },{}],13:[function(require,module,exports){\r
3614     module.exports = '1.3.6';\r
3615 \r
3616 },{}]},{},[11]);