rztree 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,1191 @@
1
+ /*
2
+ * JQuery zTree exedit v3.5.17
3
+ * http://zTree.me/
4
+ *
5
+ * Copyright (c) 2010 Hunter.z
6
+ *
7
+ * Licensed same as jquery - MIT License
8
+ * http://www.opensource.org/licenses/mit-license.php
9
+ *
10
+ * email: hunter.z@263.net
11
+ * Date: 2014-05-08
12
+ */
13
+ (function($){
14
+ //default consts of exedit
15
+ var _consts = {
16
+ event: {
17
+ DRAG: "ztree_drag",
18
+ DROP: "ztree_drop",
19
+ RENAME: "ztree_rename",
20
+ DRAGMOVE:"ztree_dragmove"
21
+ },
22
+ id: {
23
+ EDIT: "_edit",
24
+ INPUT: "_input",
25
+ REMOVE: "_remove"
26
+ },
27
+ move: {
28
+ TYPE_INNER: "inner",
29
+ TYPE_PREV: "prev",
30
+ TYPE_NEXT: "next"
31
+ },
32
+ node: {
33
+ CURSELECTED_EDIT: "curSelectedNode_Edit",
34
+ TMPTARGET_TREE: "tmpTargetzTree",
35
+ TMPTARGET_NODE: "tmpTargetNode"
36
+ }
37
+ },
38
+ //default setting of exedit
39
+ _setting = {
40
+ edit: {
41
+ enable: false,
42
+ editNameSelectAll: false,
43
+ showRemoveBtn: true,
44
+ showRenameBtn: true,
45
+ removeTitle: "remove",
46
+ renameTitle: "rename",
47
+ drag: {
48
+ autoExpandTrigger: false,
49
+ isCopy: true,
50
+ isMove: true,
51
+ prev: true,
52
+ next: true,
53
+ inner: true,
54
+ minMoveSize: 5,
55
+ borderMax: 10,
56
+ borderMin: -5,
57
+ maxShowNodeNum: 5,
58
+ autoOpenTime: 500
59
+ }
60
+ },
61
+ view: {
62
+ addHoverDom: null,
63
+ removeHoverDom: null
64
+ },
65
+ callback: {
66
+ beforeDrag:null,
67
+ beforeDragOpen:null,
68
+ beforeDrop:null,
69
+ beforeEditName:null,
70
+ beforeRename:null,
71
+ onDrag:null,
72
+ onDragMove:null,
73
+ onDrop:null,
74
+ onRename:null
75
+ }
76
+ },
77
+ //default root of exedit
78
+ _initRoot = function (setting) {
79
+ var r = data.getRoot(setting), rs = data.getRoots();
80
+ r.curEditNode = null;
81
+ r.curEditInput = null;
82
+ r.curHoverNode = null;
83
+ r.dragFlag = 0;
84
+ r.dragNodeShowBefore = [];
85
+ r.dragMaskList = new Array();
86
+ rs.showHoverDom = true;
87
+ },
88
+ //default cache of exedit
89
+ _initCache = function(treeId) {},
90
+ //default bind event of exedit
91
+ _bindEvent = function(setting) {
92
+ var o = setting.treeObj;
93
+ var c = consts.event;
94
+ o.bind(c.RENAME, function (event, treeId, treeNode, isCancel) {
95
+ tools.apply(setting.callback.onRename, [event, treeId, treeNode, isCancel]);
96
+ });
97
+
98
+ o.bind(c.DRAG, function (event, srcEvent, treeId, treeNodes) {
99
+ tools.apply(setting.callback.onDrag, [srcEvent, treeId, treeNodes]);
100
+ });
101
+
102
+ o.bind(c.DRAGMOVE,function(event, srcEvent, treeId, treeNodes){
103
+ tools.apply(setting.callback.onDragMove,[srcEvent, treeId, treeNodes]);
104
+ });
105
+
106
+ o.bind(c.DROP, function (event, srcEvent, treeId, treeNodes, targetNode, moveType, isCopy) {
107
+ tools.apply(setting.callback.onDrop, [srcEvent, treeId, treeNodes, targetNode, moveType, isCopy]);
108
+ });
109
+ },
110
+ _unbindEvent = function(setting) {
111
+ var o = setting.treeObj;
112
+ var c = consts.event;
113
+ o.unbind(c.RENAME);
114
+ o.unbind(c.DRAG);
115
+ o.unbind(c.DRAGMOVE);
116
+ o.unbind(c.DROP);
117
+ },
118
+ //default event proxy of exedit
119
+ _eventProxy = function(e) {
120
+ var target = e.target,
121
+ setting = data.getSetting(e.data.treeId),
122
+ relatedTarget = e.relatedTarget,
123
+ tId = "", node = null,
124
+ nodeEventType = "", treeEventType = "",
125
+ nodeEventCallback = null, treeEventCallback = null,
126
+ tmp = null;
127
+
128
+ if (tools.eqs(e.type, "mouseover")) {
129
+ tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
130
+ if (tmp) {
131
+ tId = tools.getNodeMainDom(tmp).id;
132
+ nodeEventType = "hoverOverNode";
133
+ }
134
+ } else if (tools.eqs(e.type, "mouseout")) {
135
+ tmp = tools.getMDom(setting, relatedTarget, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
136
+ if (!tmp) {
137
+ tId = "remove";
138
+ nodeEventType = "hoverOutNode";
139
+ }
140
+ } else if (tools.eqs(e.type, "mousedown")) {
141
+ tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
142
+ if (tmp) {
143
+ tId = tools.getNodeMainDom(tmp).id;
144
+ nodeEventType = "mousedownNode";
145
+ }
146
+ }
147
+ if (tId.length>0) {
148
+ node = data.getNodeCache(setting, tId);
149
+ switch (nodeEventType) {
150
+ case "mousedownNode" :
151
+ nodeEventCallback = _handler.onMousedownNode;
152
+ break;
153
+ case "hoverOverNode" :
154
+ nodeEventCallback = _handler.onHoverOverNode;
155
+ break;
156
+ case "hoverOutNode" :
157
+ nodeEventCallback = _handler.onHoverOutNode;
158
+ break;
159
+ }
160
+ }
161
+ var proxyResult = {
162
+ stop: false,
163
+ node: node,
164
+ nodeEventType: nodeEventType,
165
+ nodeEventCallback: nodeEventCallback,
166
+ treeEventType: treeEventType,
167
+ treeEventCallback: treeEventCallback
168
+ };
169
+ return proxyResult
170
+ },
171
+ //default init node of exedit
172
+ _initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
173
+ if (!n) return;
174
+ n.isHover = false;
175
+ n.editNameFlag = false;
176
+ },
177
+ //update zTreeObj, add method of edit
178
+ _zTreeTools = function(setting, zTreeTools) {
179
+ zTreeTools.cancelEditName = function(newName) {
180
+ var root = data.getRoot(this.setting);
181
+ if (!root.curEditNode) return;
182
+ view.cancelCurEditNode(this.setting, newName?newName:null, true);
183
+ }
184
+ zTreeTools.copyNode = function(targetNode, node, moveType, isSilent) {
185
+ if (!node) return null;
186
+ if (targetNode && !targetNode.isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null;
187
+ var _this = this,
188
+ newNode = tools.clone(node);
189
+ if (!targetNode) {
190
+ targetNode = null;
191
+ moveType = consts.move.TYPE_INNER;
192
+ }
193
+ if (moveType == consts.move.TYPE_INNER) {
194
+ function copyCallback() {
195
+ view.addNodes(_this.setting, targetNode, [newNode], isSilent);
196
+ }
197
+
198
+ if (tools.canAsync(this.setting, targetNode)) {
199
+ view.asyncNode(this.setting, targetNode, isSilent, copyCallback);
200
+ } else {
201
+ copyCallback();
202
+ }
203
+ } else {
204
+ view.addNodes(this.setting, targetNode.parentNode, [newNode], isSilent);
205
+ view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent);
206
+ }
207
+ return newNode;
208
+ }
209
+ zTreeTools.editName = function(node) {
210
+ if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return;
211
+ if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true);
212
+ view.editNode(this.setting, node)
213
+ }
214
+ zTreeTools.moveNode = function(targetNode, node, moveType, isSilent) {
215
+ if (!node) return node;
216
+ if (targetNode && !targetNode.isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) {
217
+ return null;
218
+ } else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find("#" + targetNode.tId).length > 0)) {
219
+ return null;
220
+ } else if (!targetNode) {
221
+ targetNode = null;
222
+ }
223
+ var _this = this;
224
+ function moveCallback() {
225
+ view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent);
226
+ }
227
+ if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) {
228
+ view.asyncNode(this.setting, targetNode, isSilent, moveCallback);
229
+ } else {
230
+ moveCallback();
231
+ }
232
+ return node;
233
+ }
234
+ zTreeTools.setEditable = function(editable) {
235
+ this.setting.edit.enable = editable;
236
+ return this.refresh();
237
+ }
238
+ },
239
+ //method of operate data
240
+ _data = {
241
+ setSonNodeLevel: function(setting, parentNode, node) {
242
+ if (!node) return;
243
+ var childKey = setting.data.key.children;
244
+ node.level = (parentNode)? parentNode.level + 1 : 0;
245
+ if (!node[childKey]) return;
246
+ for (var i = 0, l = node[childKey].length; i < l; i++) {
247
+ if (node[childKey][i]) data.setSonNodeLevel(setting, node, node[childKey][i]);
248
+ }
249
+ }
250
+ },
251
+ //method of event proxy
252
+ _event = {
253
+
254
+ },
255
+ //method of event handler
256
+ _handler = {
257
+ onHoverOverNode: function(event, node) {
258
+ var setting = data.getSetting(event.data.treeId),
259
+ root = data.getRoot(setting);
260
+ if (root.curHoverNode != node) {
261
+ _handler.onHoverOutNode(event);
262
+ }
263
+ root.curHoverNode = node;
264
+ view.addHoverDom(setting, node);
265
+ },
266
+ onHoverOutNode: function(event, node) {
267
+ var setting = data.getSetting(event.data.treeId),
268
+ root = data.getRoot(setting);
269
+ if (root.curHoverNode && !data.isSelectedNode(setting, root.curHoverNode)) {
270
+ view.removeTreeDom(setting, root.curHoverNode);
271
+ root.curHoverNode = null;
272
+ }
273
+ },
274
+ onMousedownNode: function(eventMouseDown, _node) {
275
+ var i,l,
276
+ setting = data.getSetting(eventMouseDown.data.treeId),
277
+ root = data.getRoot(setting), roots = data.getRoots();
278
+ //right click can't drag & drop
279
+ if (eventMouseDown.button == 2 || !setting.edit.enable || (!setting.edit.drag.isCopy && !setting.edit.drag.isMove)) return true;
280
+
281
+ //input of edit node name can't drag & drop
282
+ var target = eventMouseDown.target,
283
+ _nodes = data.getRoot(setting).curSelectedList,
284
+ nodes = [];
285
+ if (!data.isSelectedNode(setting, _node)) {
286
+ nodes = [_node];
287
+ } else {
288
+ for (i=0, l=_nodes.length; i<l; i++) {
289
+ if (_nodes[i].editNameFlag && tools.eqs(target.tagName, "input") && target.getAttribute("treeNode"+consts.id.INPUT) !== null) {
290
+ return true;
291
+ }
292
+ nodes.push(_nodes[i]);
293
+ if (nodes[0].parentTId !== _nodes[i].parentTId) {
294
+ nodes = [_node];
295
+ break;
296
+ }
297
+ }
298
+ }
299
+
300
+ view.editNodeBlur = true;
301
+ view.cancelCurEditNode(setting);
302
+
303
+ var doc = $(setting.treeObj.get(0).ownerDocument),
304
+ body = $(setting.treeObj.get(0).ownerDocument.body), curNode, tmpArrow, tmpTarget,
305
+ isOtherTree = false,
306
+ targetSetting = setting,
307
+ sourceSetting = setting,
308
+ preNode, nextNode,
309
+ preTmpTargetNodeId = null,
310
+ preTmpMoveType = null,
311
+ tmpTargetNodeId = null,
312
+ moveType = consts.move.TYPE_INNER,
313
+ mouseDownX = eventMouseDown.clientX,
314
+ mouseDownY = eventMouseDown.clientY,
315
+ startTime = (new Date()).getTime();
316
+
317
+ if (tools.uCanDo(setting)) {
318
+ doc.bind("mousemove", _docMouseMove);
319
+ }
320
+ function _docMouseMove(event) {
321
+ //avoid start drag after click node
322
+ if (root.dragFlag == 0 && Math.abs(mouseDownX - event.clientX) < setting.edit.drag.minMoveSize
323
+ && Math.abs(mouseDownY - event.clientY) < setting.edit.drag.minMoveSize) {
324
+ return true;
325
+ }
326
+ var i, l, tmpNode, tmpDom, tmpNodes,
327
+ childKey = setting.data.key.children;
328
+ body.css("cursor", "pointer");
329
+
330
+ if (root.dragFlag == 0) {
331
+ if (tools.apply(setting.callback.beforeDrag, [setting.treeId, nodes], true) == false) {
332
+ _docMouseUp(event);
333
+ return true;
334
+ }
335
+
336
+ for (i=0, l=nodes.length; i<l; i++) {
337
+ if (i==0) {
338
+ root.dragNodeShowBefore = [];
339
+ }
340
+ tmpNode = nodes[i];
341
+ if (tmpNode.isParent && tmpNode.open) {
342
+ view.expandCollapseNode(setting, tmpNode, !tmpNode.open);
343
+ root.dragNodeShowBefore[tmpNode.tId] = true;
344
+ } else {
345
+ root.dragNodeShowBefore[tmpNode.tId] = false;
346
+ }
347
+ }
348
+
349
+ root.dragFlag = 1;
350
+ roots.showHoverDom = false;
351
+ tools.showIfameMask(setting, true);
352
+
353
+ //sort
354
+ var isOrder = true, lastIndex = -1;
355
+ if (nodes.length>1) {
356
+ var pNodes = nodes[0].parentTId ? nodes[0].getParentNode()[childKey] : data.getNodes(setting);
357
+ tmpNodes = [];
358
+ for (i=0, l=pNodes.length; i<l; i++) {
359
+ if (root.dragNodeShowBefore[pNodes[i].tId] !== undefined) {
360
+ if (isOrder && lastIndex > -1 && (lastIndex+1) !== i) {
361
+ isOrder = false;
362
+ }
363
+ tmpNodes.push(pNodes[i]);
364
+ lastIndex = i;
365
+ }
366
+ if (nodes.length === tmpNodes.length) {
367
+ nodes = tmpNodes;
368
+ break;
369
+ }
370
+ }
371
+ }
372
+ if (isOrder) {
373
+ preNode = nodes[0].getPreNode();
374
+ nextNode = nodes[nodes.length-1].getNextNode();
375
+ }
376
+
377
+ //set node in selected
378
+ curNode = $$("<ul class='zTreeDragUL'></ul>", setting);
379
+ for (i=0, l=nodes.length; i<l; i++) {
380
+ tmpNode = nodes[i];
381
+ tmpNode.editNameFlag = false;
382
+ view.selectNode(setting, tmpNode, i>0);
383
+ view.removeTreeDom(setting, tmpNode);
384
+
385
+ if (i > setting.edit.drag.maxShowNodeNum-1) {
386
+ continue;
387
+ }
388
+
389
+ tmpDom = $$("<li id='"+ tmpNode.tId +"_tmp'></li>", setting);
390
+ tmpDom.append($$(tmpNode, consts.id.A, setting).clone());
391
+ tmpDom.css("padding", "0");
392
+ tmpDom.children("#" + tmpNode.tId + consts.id.A).removeClass(consts.node.CURSELECTED);
393
+ curNode.append(tmpDom);
394
+ if (i == setting.edit.drag.maxShowNodeNum-1) {
395
+ tmpDom = $$("<li id='"+ tmpNode.tId +"_moretmp'><a> ... </a></li>", setting);
396
+ curNode.append(tmpDom);
397
+ }
398
+ }
399
+ curNode.attr("id", nodes[0].tId + consts.id.UL + "_tmp");
400
+ curNode.addClass(setting.treeObj.attr("class"));
401
+ curNode.appendTo(body);
402
+
403
+ tmpArrow = $$("<span class='tmpzTreeMove_arrow'></span>", setting);
404
+ tmpArrow.attr("id", "zTreeMove_arrow_tmp");
405
+ tmpArrow.appendTo(body);
406
+
407
+ setting.treeObj.trigger(consts.event.DRAG, [event, setting.treeId, nodes]);
408
+ }
409
+
410
+ if (root.dragFlag == 1) {
411
+ if (tmpTarget && tmpArrow.attr("id") == event.target.id && tmpTargetNodeId && (event.clientX + doc.scrollLeft()+2) > ($("#" + tmpTargetNodeId + consts.id.A, tmpTarget).offset().left)) {
412
+ var xT = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget);
413
+ event.target = (xT.length > 0) ? xT.get(0) : event.target;
414
+ } else if (tmpTarget) {
415
+ tmpTarget.removeClass(consts.node.TMPTARGET_TREE);
416
+ if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV)
417
+ .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER);
418
+ }
419
+ tmpTarget = null;
420
+ tmpTargetNodeId = null;
421
+
422
+ //judge drag & drop in multi ztree
423
+ isOtherTree = false;
424
+ targetSetting = setting;
425
+ var settings = data.getSettings();
426
+ for (var s in settings) {
427
+ if (settings[s].treeId && settings[s].edit.enable && settings[s].treeId != setting.treeId
428
+ && (event.target.id == settings[s].treeId || $(event.target).parents("#" + settings[s].treeId).length>0)) {
429
+ isOtherTree = true;
430
+ targetSetting = settings[s];
431
+ }
432
+ }
433
+
434
+ var docScrollTop = doc.scrollTop(),
435
+ docScrollLeft = doc.scrollLeft(),
436
+ treeOffset = targetSetting.treeObj.offset(),
437
+ scrollHeight = targetSetting.treeObj.get(0).scrollHeight,
438
+ scrollWidth = targetSetting.treeObj.get(0).scrollWidth,
439
+ dTop = (event.clientY + docScrollTop - treeOffset.top),
440
+ dBottom = (targetSetting.treeObj.height() + treeOffset.top - event.clientY - docScrollTop),
441
+ dLeft = (event.clientX + docScrollLeft - treeOffset.left),
442
+ dRight = (targetSetting.treeObj.width() + treeOffset.left - event.clientX - docScrollLeft),
443
+ isTop = (dTop < setting.edit.drag.borderMax && dTop > setting.edit.drag.borderMin),
444
+ isBottom = (dBottom < setting.edit.drag.borderMax && dBottom > setting.edit.drag.borderMin),
445
+ isLeft = (dLeft < setting.edit.drag.borderMax && dLeft > setting.edit.drag.borderMin),
446
+ isRight = (dRight < setting.edit.drag.borderMax && dRight > setting.edit.drag.borderMin),
447
+ isTreeInner = dTop > setting.edit.drag.borderMin && dBottom > setting.edit.drag.borderMin && dLeft > setting.edit.drag.borderMin && dRight > setting.edit.drag.borderMin,
448
+ isTreeTop = (isTop && targetSetting.treeObj.scrollTop() <= 0),
449
+ isTreeBottom = (isBottom && (targetSetting.treeObj.scrollTop() + targetSetting.treeObj.height()+10) >= scrollHeight),
450
+ isTreeLeft = (isLeft && targetSetting.treeObj.scrollLeft() <= 0),
451
+ isTreeRight = (isRight && (targetSetting.treeObj.scrollLeft() + targetSetting.treeObj.width()+10) >= scrollWidth);
452
+
453
+ if (event.target && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
454
+ //get node <li> dom
455
+ var targetObj = event.target;
456
+ while (targetObj && targetObj.tagName && !tools.eqs(targetObj.tagName, "li") && targetObj.id != targetSetting.treeId) {
457
+ targetObj = targetObj.parentNode;
458
+ }
459
+
460
+ var canMove = true;
461
+ //don't move to self or children of self
462
+ for (i=0, l=nodes.length; i<l; i++) {
463
+ tmpNode = nodes[i];
464
+ if (targetObj.id === tmpNode.tId) {
465
+ canMove = false;
466
+ break;
467
+ } else if ($$(tmpNode, setting).find("#" + targetObj.id).length > 0) {
468
+ canMove = false;
469
+ break;
470
+ }
471
+ }
472
+ if (canMove && event.target && tools.isChildOrSelf(event.target, targetObj.id + consts.id.A)) {
473
+ tmpTarget = $(targetObj);
474
+ tmpTargetNodeId = targetObj.id;
475
+ }
476
+ }
477
+
478
+ //the mouse must be in zTree
479
+ tmpNode = nodes[0];
480
+ if (isTreeInner && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
481
+ //judge mouse move in root of ztree
482
+ if (!tmpTarget && (event.target.id == targetSetting.treeId || isTreeTop || isTreeBottom || isTreeLeft || isTreeRight) && (isOtherTree || (!isOtherTree && tmpNode.parentTId))) {
483
+ tmpTarget = targetSetting.treeObj;
484
+ }
485
+ //auto scroll top
486
+ if (isTop) {
487
+ targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop()-10);
488
+ } else if (isBottom) {
489
+ targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop()+10);
490
+ }
491
+ if (isLeft) {
492
+ targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()-10);
493
+ } else if (isRight) {
494
+ targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()+10);
495
+ }
496
+ //auto scroll left
497
+ if (tmpTarget && tmpTarget != targetSetting.treeObj && tmpTarget.offset().left < targetSetting.treeObj.offset().left) {
498
+ targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()+ tmpTarget.offset().left - targetSetting.treeObj.offset().left);
499
+ }
500
+ }
501
+
502
+ curNode.css({
503
+ "top": (event.clientY + docScrollTop + 3) + "px",
504
+ "left": (event.clientX + docScrollLeft + 3) + "px"
505
+ });
506
+
507
+ var dX = 0;
508
+ var dY = 0;
509
+ if (tmpTarget && tmpTarget.attr("id")!=targetSetting.treeId) {
510
+ var tmpTargetNode = tmpTargetNodeId == null ? null: data.getNodeCache(targetSetting, tmpTargetNodeId),
511
+ isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy),
512
+ isPrev = !!(preNode && tmpTargetNodeId === preNode.tId),
513
+ isNext = !!(nextNode && tmpTargetNodeId === nextNode.tId),
514
+ isInner = (tmpNode.parentTId && tmpNode.parentTId == tmpTargetNodeId),
515
+ canPrev = (isCopy || !isNext) && tools.apply(targetSetting.edit.drag.prev, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.prev),
516
+ canNext = (isCopy || !isPrev) && tools.apply(targetSetting.edit.drag.next, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.next),
517
+ canInner = (isCopy || !isInner) && !(targetSetting.data.keep.leaf && !tmpTargetNode.isParent) && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.inner);
518
+ if (!canPrev && !canNext && !canInner) {
519
+ tmpTarget = null;
520
+ tmpTargetNodeId = "";
521
+ moveType = consts.move.TYPE_INNER;
522
+ tmpArrow.css({
523
+ "display":"none"
524
+ });
525
+ if (window.zTreeMoveTimer) {
526
+ clearTimeout(window.zTreeMoveTimer);
527
+ window.zTreeMoveTargetNodeTId = null
528
+ }
529
+ } else {
530
+ var tmpTargetA = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget),
531
+ tmpNextA = tmpTargetNode.isLastNode ? null : $("#" + tmpTargetNode.getNextNode().tId + consts.id.A, tmpTarget.next()),
532
+ tmpTop = tmpTargetA.offset().top,
533
+ tmpLeft = tmpTargetA.offset().left,
534
+ prevPercent = canPrev ? (canInner ? 0.25 : (canNext ? 0.5 : 1) ) : -1,
535
+ nextPercent = canNext ? (canInner ? 0.75 : (canPrev ? 0.5 : 0) ) : -1,
536
+ dY_percent = (event.clientY + docScrollTop - tmpTop)/tmpTargetA.height();
537
+ if ((prevPercent==1 ||dY_percent<=prevPercent && dY_percent>=-.2) && canPrev) {
538
+ dX = 1 - tmpArrow.width();
539
+ dY = tmpTop - tmpArrow.height()/2;
540
+ moveType = consts.move.TYPE_PREV;
541
+ } else if ((nextPercent==0 || dY_percent>=nextPercent && dY_percent<=1.2) && canNext) {
542
+ dX = 1 - tmpArrow.width();
543
+ dY = (tmpNextA == null || (tmpTargetNode.isParent && tmpTargetNode.open)) ? (tmpTop + tmpTargetA.height() - tmpArrow.height()/2) : (tmpNextA.offset().top - tmpArrow.height()/2);
544
+ moveType = consts.move.TYPE_NEXT;
545
+ }else {
546
+ dX = 5 - tmpArrow.width();
547
+ dY = tmpTop;
548
+ moveType = consts.move.TYPE_INNER;
549
+ }
550
+ tmpArrow.css({
551
+ "display":"block",
552
+ "top": dY + "px",
553
+ "left": (tmpLeft + dX) + "px"
554
+ });
555
+ tmpTargetA.addClass(consts.node.TMPTARGET_NODE + "_" + moveType);
556
+
557
+ if (preTmpTargetNodeId != tmpTargetNodeId || preTmpMoveType != moveType) {
558
+ startTime = (new Date()).getTime();
559
+ }
560
+ if (tmpTargetNode && tmpTargetNode.isParent && moveType == consts.move.TYPE_INNER) {
561
+ var startTimer = true;
562
+ if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId !== tmpTargetNode.tId) {
563
+ clearTimeout(window.zTreeMoveTimer);
564
+ window.zTreeMoveTargetNodeTId = null;
565
+ }else if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId === tmpTargetNode.tId) {
566
+ startTimer = false;
567
+ }
568
+ if (startTimer) {
569
+ window.zTreeMoveTimer = setTimeout(function() {
570
+ if (moveType != consts.move.TYPE_INNER) return;
571
+ if (tmpTargetNode && tmpTargetNode.isParent && !tmpTargetNode.open && (new Date()).getTime() - startTime > targetSetting.edit.drag.autoOpenTime
572
+ && tools.apply(targetSetting.callback.beforeDragOpen, [targetSetting.treeId, tmpTargetNode], true)) {
573
+ view.switchNode(targetSetting, tmpTargetNode);
574
+ if (targetSetting.edit.drag.autoExpandTrigger) {
575
+ targetSetting.treeObj.trigger(consts.event.EXPAND, [targetSetting.treeId, tmpTargetNode]);
576
+ }
577
+ }
578
+ }, targetSetting.edit.drag.autoOpenTime+50);
579
+ window.zTreeMoveTargetNodeTId = tmpTargetNode.tId;
580
+ }
581
+ }
582
+ }
583
+ } else {
584
+ moveType = consts.move.TYPE_INNER;
585
+ if (tmpTarget && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, null], !!targetSetting.edit.drag.inner)) {
586
+ tmpTarget.addClass(consts.node.TMPTARGET_TREE);
587
+ } else {
588
+ tmpTarget = null;
589
+ }
590
+ tmpArrow.css({
591
+ "display":"none"
592
+ });
593
+ if (window.zTreeMoveTimer) {
594
+ clearTimeout(window.zTreeMoveTimer);
595
+ window.zTreeMoveTargetNodeTId = null;
596
+ }
597
+ }
598
+ preTmpTargetNodeId = tmpTargetNodeId;
599
+ preTmpMoveType = moveType;
600
+
601
+ setting.treeObj.trigger(consts.event.DRAGMOVE, [event, setting.treeId, nodes]);
602
+ }
603
+ return false;
604
+ }
605
+
606
+ doc.bind("mouseup", _docMouseUp);
607
+ function _docMouseUp(event) {
608
+ if (window.zTreeMoveTimer) {
609
+ clearTimeout(window.zTreeMoveTimer);
610
+ window.zTreeMoveTargetNodeTId = null;
611
+ }
612
+ preTmpTargetNodeId = null;
613
+ preTmpMoveType = null;
614
+ doc.unbind("mousemove", _docMouseMove);
615
+ doc.unbind("mouseup", _docMouseUp);
616
+ doc.unbind("selectstart", _docSelect);
617
+ body.css("cursor", "auto");
618
+ if (tmpTarget) {
619
+ tmpTarget.removeClass(consts.node.TMPTARGET_TREE);
620
+ if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV)
621
+ .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER);
622
+ }
623
+ tools.showIfameMask(setting, false);
624
+
625
+ roots.showHoverDom = true;
626
+ if (root.dragFlag == 0) return;
627
+ root.dragFlag = 0;
628
+
629
+ var i, l, tmpNode;
630
+ for (i=0, l=nodes.length; i<l; i++) {
631
+ tmpNode = nodes[i];
632
+ if (tmpNode.isParent && root.dragNodeShowBefore[tmpNode.tId] && !tmpNode.open) {
633
+ view.expandCollapseNode(setting, tmpNode, !tmpNode.open);
634
+ delete root.dragNodeShowBefore[tmpNode.tId];
635
+ }
636
+ }
637
+
638
+ if (curNode) curNode.remove();
639
+ if (tmpArrow) tmpArrow.remove();
640
+
641
+ var isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy);
642
+ if (!isCopy && tmpTarget && tmpTargetNodeId && nodes[0].parentTId && tmpTargetNodeId==nodes[0].parentTId && moveType == consts.move.TYPE_INNER) {
643
+ tmpTarget = null;
644
+ }
645
+ if (tmpTarget) {
646
+ var dragTargetNode = tmpTargetNodeId == null ? null: data.getNodeCache(targetSetting, tmpTargetNodeId);
647
+ if (tools.apply(setting.callback.beforeDrop, [targetSetting.treeId, nodes, dragTargetNode, moveType, isCopy], true) == false) {
648
+ view.selectNodes(sourceSetting, nodes);
649
+ return;
650
+ }
651
+ var newNodes = isCopy ? tools.clone(nodes) : nodes;
652
+
653
+ function dropCallback() {
654
+ if (isOtherTree) {
655
+ if (!isCopy) {
656
+ for(var i=0, l=nodes.length; i<l; i++) {
657
+ view.removeNode(setting, nodes[i]);
658
+ }
659
+ }
660
+ if (moveType == consts.move.TYPE_INNER) {
661
+ view.addNodes(targetSetting, dragTargetNode, newNodes);
662
+ } else {
663
+ view.addNodes(targetSetting, dragTargetNode.getParentNode(), newNodes);
664
+ if (moveType == consts.move.TYPE_PREV) {
665
+ for (i=0, l=newNodes.length; i<l; i++) {
666
+ view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false);
667
+ }
668
+ } else {
669
+ for (i=-1, l=newNodes.length-1; i<l; l--) {
670
+ view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false);
671
+ }
672
+ }
673
+ }
674
+ } else {
675
+ if (isCopy && moveType == consts.move.TYPE_INNER) {
676
+ view.addNodes(targetSetting, dragTargetNode, newNodes);
677
+ } else {
678
+ if (isCopy) {
679
+ view.addNodes(targetSetting, dragTargetNode.getParentNode(), newNodes);
680
+ }
681
+ if (moveType != consts.move.TYPE_NEXT) {
682
+ for (i=0, l=newNodes.length; i<l; i++) {
683
+ view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false);
684
+ }
685
+ } else {
686
+ for (i=-1, l=newNodes.length-1; i<l; l--) {
687
+ view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false);
688
+ }
689
+ }
690
+ }
691
+ }
692
+ view.selectNodes(targetSetting, newNodes);
693
+ $$(newNodes[0], setting).focus().blur();
694
+
695
+ setting.treeObj.trigger(consts.event.DROP, [event, targetSetting.treeId, newNodes, dragTargetNode, moveType, isCopy]);
696
+ }
697
+
698
+ if (moveType == consts.move.TYPE_INNER && tools.canAsync(targetSetting, dragTargetNode)) {
699
+ view.asyncNode(targetSetting, dragTargetNode, false, dropCallback);
700
+ } else {
701
+ dropCallback();
702
+ }
703
+
704
+ } else {
705
+ view.selectNodes(sourceSetting, nodes);
706
+ setting.treeObj.trigger(consts.event.DROP, [event, setting.treeId, nodes, null, null, null]);
707
+ }
708
+ }
709
+
710
+ doc.bind("selectstart", _docSelect);
711
+ function _docSelect() {
712
+ return false;
713
+ }
714
+
715
+ //Avoid FireFox's Bug
716
+ //If zTree Div CSS set 'overflow', so drag node outside of zTree, and event.target is error.
717
+ if(eventMouseDown.preventDefault) {
718
+ eventMouseDown.preventDefault();
719
+ }
720
+ return true;
721
+ }
722
+ },
723
+ //method of tools for zTree
724
+ _tools = {
725
+ getAbs: function (obj) {
726
+ var oRect = obj.getBoundingClientRect(),
727
+ scrollTop = document.body.scrollTop+document.documentElement.scrollTop,
728
+ scrollLeft = document.body.scrollLeft+document.documentElement.scrollLeft;
729
+ return [oRect.left+scrollLeft,oRect.top+scrollTop];
730
+ },
731
+ inputFocus: function(inputObj) {
732
+ if (inputObj.get(0)) {
733
+ inputObj.focus();
734
+ tools.setCursorPosition(inputObj.get(0), inputObj.val().length);
735
+ }
736
+ },
737
+ inputSelect: function(inputObj) {
738
+ if (inputObj.get(0)) {
739
+ inputObj.focus();
740
+ inputObj.select();
741
+ }
742
+ },
743
+ setCursorPosition: function(obj, pos){
744
+ if(obj.setSelectionRange) {
745
+ obj.focus();
746
+ obj.setSelectionRange(pos,pos);
747
+ } else if (obj.createTextRange) {
748
+ var range = obj.createTextRange();
749
+ range.collapse(true);
750
+ range.moveEnd('character', pos);
751
+ range.moveStart('character', pos);
752
+ range.select();
753
+ }
754
+ },
755
+ showIfameMask: function(setting, showSign) {
756
+ var root = data.getRoot(setting);
757
+ //clear full mask
758
+ while (root.dragMaskList.length > 0) {
759
+ root.dragMaskList[0].remove();
760
+ root.dragMaskList.shift();
761
+ }
762
+ if (showSign) {
763
+ //show mask
764
+ var iframeList = $$("iframe", setting);
765
+ for (var i = 0, l = iframeList.length; i < l; i++) {
766
+ var obj = iframeList.get(i),
767
+ r = tools.getAbs(obj),
768
+ dragMask = $$("<div id='zTreeMask_" + i + "' class='zTreeMask' style='top:" + r[1] + "px; left:" + r[0] + "px; width:" + obj.offsetWidth + "px; height:" + obj.offsetHeight + "px;'></div>", setting);
769
+ dragMask.appendTo($$("body", setting));
770
+ root.dragMaskList.push(dragMask);
771
+ }
772
+ }
773
+ }
774
+ },
775
+ //method of operate ztree dom
776
+ _view = {
777
+ addEditBtn: function(setting, node) {
778
+ if (node.editNameFlag || $$(node, consts.id.EDIT, setting).length > 0) {
779
+ return;
780
+ }
781
+ if (!tools.apply(setting.edit.showRenameBtn, [setting.treeId, node], setting.edit.showRenameBtn)) {
782
+ return;
783
+ }
784
+ var aObj = $$(node, consts.id.A, setting),
785
+ editStr = "<span class='" + consts.className.BUTTON + " edit' id='" + node.tId + consts.id.EDIT + "' title='"+tools.apply(setting.edit.renameTitle, [setting.treeId, node], setting.edit.renameTitle)+"' treeNode"+consts.id.EDIT+" style='display:none;'></span>";
786
+ aObj.append(editStr);
787
+
788
+ $$(node, consts.id.EDIT, setting).bind('click',
789
+ function() {
790
+ if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeEditName, [setting.treeId, node], true) == false) return false;
791
+ view.editNode(setting, node);
792
+ return false;
793
+ }
794
+ ).show();
795
+ },
796
+ addRemoveBtn: function(setting, node) {
797
+ if (node.editNameFlag || $$(node, consts.id.REMOVE, setting).length > 0) {
798
+ return;
799
+ }
800
+ if (!tools.apply(setting.edit.showRemoveBtn, [setting.treeId, node], setting.edit.showRemoveBtn)) {
801
+ return;
802
+ }
803
+ var aObj = $$(node, consts.id.A, setting),
804
+ removeStr = "<span class='" + consts.className.BUTTON + " remove' id='" + node.tId + consts.id.REMOVE + "' title='"+tools.apply(setting.edit.removeTitle, [setting.treeId, node], setting.edit.removeTitle)+"' treeNode"+consts.id.REMOVE+" style='display:none;'></span>";
805
+ aObj.append(removeStr);
806
+
807
+ $$(node, consts.id.REMOVE, setting).bind('click',
808
+ function() {
809
+ if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return false;
810
+ view.removeNode(setting, node);
811
+ setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]);
812
+ return false;
813
+ }
814
+ ).bind('mousedown',
815
+ function(eventMouseDown) {
816
+ return true;
817
+ }
818
+ ).show();
819
+ },
820
+ addHoverDom: function(setting, node) {
821
+ if (data.getRoots().showHoverDom) {
822
+ node.isHover = true;
823
+ if (setting.edit.enable) {
824
+ view.addEditBtn(setting, node);
825
+ view.addRemoveBtn(setting, node);
826
+ }
827
+ tools.apply(setting.view.addHoverDom, [setting.treeId, node]);
828
+ }
829
+ },
830
+ cancelCurEditNode: function (setting, forceName, isCancel) {
831
+ var root = data.getRoot(setting),
832
+ nameKey = setting.data.key.name,
833
+ node = root.curEditNode;
834
+
835
+ if (node) {
836
+ var inputObj = root.curEditInput,
837
+ newName = forceName ? forceName:(isCancel ? node[nameKey]: inputObj.val());
838
+ if (tools.apply(setting.callback.beforeRename, [setting.treeId, node, newName, isCancel], true) === false) {
839
+ return false;
840
+ } else {
841
+ node[nameKey] = newName;
842
+ setting.treeObj.trigger(consts.event.RENAME, [setting.treeId, node, isCancel]);
843
+ }
844
+ var aObj = $$(node, consts.id.A, setting);
845
+ aObj.removeClass(consts.node.CURSELECTED_EDIT);
846
+ inputObj.unbind();
847
+ view.setNodeName(setting, node);
848
+ node.editNameFlag = false;
849
+ root.curEditNode = null;
850
+ root.curEditInput = null;
851
+ view.selectNode(setting, node, false);
852
+ }
853
+ root.noSelection = true;
854
+ return true;
855
+ },
856
+ editNode: function(setting, node) {
857
+ var root = data.getRoot(setting);
858
+ view.editNodeBlur = false;
859
+ if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
860
+ setTimeout(function() {tools.inputFocus(root.curEditInput);}, 0);
861
+ return;
862
+ }
863
+ var nameKey = setting.data.key.name;
864
+ node.editNameFlag = true;
865
+ view.removeTreeDom(setting, node);
866
+ view.cancelCurEditNode(setting);
867
+ view.selectNode(setting, node, false);
868
+ $$(node, consts.id.SPAN, setting).html("<input type=text class='rename' id='" + node.tId + consts.id.INPUT + "' treeNode" + consts.id.INPUT + " >");
869
+ var inputObj = $$(node, consts.id.INPUT, setting);
870
+ inputObj.attr("value", node[nameKey]);
871
+ if (setting.edit.editNameSelectAll) {
872
+ tools.inputSelect(inputObj);
873
+ } else {
874
+ tools.inputFocus(inputObj);
875
+ }
876
+
877
+ inputObj.bind('blur', function(event) {
878
+ if (!view.editNodeBlur) {
879
+ view.cancelCurEditNode(setting);
880
+ }
881
+ }).bind('keydown', function(event) {
882
+ if (event.keyCode=="13") {
883
+ view.editNodeBlur = true;
884
+ view.cancelCurEditNode(setting);
885
+ } else if (event.keyCode=="27") {
886
+ view.cancelCurEditNode(setting, null, true);
887
+ }
888
+ }).bind('click', function(event) {
889
+ return false;
890
+ }).bind('dblclick', function(event) {
891
+ return false;
892
+ });
893
+
894
+ $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED_EDIT);
895
+ root.curEditInput = inputObj;
896
+ root.noSelection = false;
897
+ root.curEditNode = node;
898
+ },
899
+ moveNode: function(setting, targetNode, node, moveType, animateFlag, isSilent) {
900
+ var root = data.getRoot(setting),
901
+ childKey = setting.data.key.children;
902
+ if (targetNode == node) return;
903
+ if (setting.data.keep.leaf && targetNode && !targetNode.isParent && moveType == consts.move.TYPE_INNER) return;
904
+ var oldParentNode = (node.parentTId ? node.getParentNode(): root),
905
+ targetNodeIsRoot = (targetNode === null || targetNode == root);
906
+ if (targetNodeIsRoot && targetNode === null) targetNode = root;
907
+ if (targetNodeIsRoot) moveType = consts.move.TYPE_INNER;
908
+ var targetParentNode = (targetNode.parentTId ? targetNode.getParentNode() : root);
909
+
910
+ if (moveType != consts.move.TYPE_PREV && moveType != consts.move.TYPE_NEXT) {
911
+ moveType = consts.move.TYPE_INNER;
912
+ }
913
+
914
+ if (moveType == consts.move.TYPE_INNER) {
915
+ if (targetNodeIsRoot) {
916
+ //parentTId of root node is null
917
+ node.parentTId = null;
918
+ } else {
919
+ if (!targetNode.isParent) {
920
+ targetNode.isParent = true;
921
+ targetNode.open = !!targetNode.open;
922
+ view.setNodeLineIcos(setting, targetNode);
923
+ }
924
+ node.parentTId = targetNode.tId;
925
+ }
926
+ }
927
+
928
+ //move node Dom
929
+ var targetObj, target_ulObj;
930
+ if (targetNodeIsRoot) {
931
+ targetObj = setting.treeObj;
932
+ target_ulObj = targetObj;
933
+ } else {
934
+ if (!isSilent && moveType == consts.move.TYPE_INNER) {
935
+ view.expandCollapseNode(setting, targetNode, true, false);
936
+ } else if (!isSilent) {
937
+ view.expandCollapseNode(setting, targetNode.getParentNode(), true, false);
938
+ }
939
+ targetObj = $$(targetNode, setting);
940
+ target_ulObj = $$(targetNode, consts.id.UL, setting);
941
+ if (!!targetObj.get(0) && !target_ulObj.get(0)) {
942
+ var ulstr = [];
943
+ view.makeUlHtml(setting, targetNode, ulstr, '');
944
+ targetObj.append(ulstr.join(''));
945
+ }
946
+ target_ulObj = $$(targetNode, consts.id.UL, setting);
947
+ }
948
+ var nodeDom = $$(node, setting);
949
+ if (!nodeDom.get(0)) {
950
+ nodeDom = view.appendNodes(setting, node.level, [node], null, false, true).join('');
951
+ } else if (!targetObj.get(0)) {
952
+ nodeDom.remove();
953
+ }
954
+ if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) {
955
+ target_ulObj.append(nodeDom);
956
+ } else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) {
957
+ targetObj.before(nodeDom);
958
+ } else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) {
959
+ targetObj.after(nodeDom);
960
+ }
961
+
962
+ //repair the data after move
963
+ var i,l,
964
+ tmpSrcIndex = -1,
965
+ tmpTargetIndex = 0,
966
+ oldNeighbor = null,
967
+ newNeighbor = null,
968
+ oldLevel = node.level;
969
+ if (node.isFirstNode) {
970
+ tmpSrcIndex = 0;
971
+ if (oldParentNode[childKey].length > 1 ) {
972
+ oldNeighbor = oldParentNode[childKey][1];
973
+ oldNeighbor.isFirstNode = true;
974
+ }
975
+ } else if (node.isLastNode) {
976
+ tmpSrcIndex = oldParentNode[childKey].length -1;
977
+ oldNeighbor = oldParentNode[childKey][tmpSrcIndex - 1];
978
+ oldNeighbor.isLastNode = true;
979
+ } else {
980
+ for (i = 0, l = oldParentNode[childKey].length; i < l; i++) {
981
+ if (oldParentNode[childKey][i].tId == node.tId) {
982
+ tmpSrcIndex = i;
983
+ break;
984
+ }
985
+ }
986
+ }
987
+ if (tmpSrcIndex >= 0) {
988
+ oldParentNode[childKey].splice(tmpSrcIndex, 1);
989
+ }
990
+ if (moveType != consts.move.TYPE_INNER) {
991
+ for (i = 0, l = targetParentNode[childKey].length; i < l; i++) {
992
+ if (targetParentNode[childKey][i].tId == targetNode.tId) tmpTargetIndex = i;
993
+ }
994
+ }
995
+ if (moveType == consts.move.TYPE_INNER) {
996
+ if (!targetNode[childKey]) targetNode[childKey] = new Array();
997
+ if (targetNode[childKey].length > 0) {
998
+ newNeighbor = targetNode[childKey][targetNode[childKey].length - 1];
999
+ newNeighbor.isLastNode = false;
1000
+ }
1001
+ targetNode[childKey].splice(targetNode[childKey].length, 0, node);
1002
+ node.isLastNode = true;
1003
+ node.isFirstNode = (targetNode[childKey].length == 1);
1004
+ } else if (targetNode.isFirstNode && moveType == consts.move.TYPE_PREV) {
1005
+ targetParentNode[childKey].splice(tmpTargetIndex, 0, node);
1006
+ newNeighbor = targetNode;
1007
+ newNeighbor.isFirstNode = false;
1008
+ node.parentTId = targetNode.parentTId;
1009
+ node.isFirstNode = true;
1010
+ node.isLastNode = false;
1011
+
1012
+ } else if (targetNode.isLastNode && moveType == consts.move.TYPE_NEXT) {
1013
+ targetParentNode[childKey].splice(tmpTargetIndex + 1, 0, node);
1014
+ newNeighbor = targetNode;
1015
+ newNeighbor.isLastNode = false;
1016
+ node.parentTId = targetNode.parentTId;
1017
+ node.isFirstNode = false;
1018
+ node.isLastNode = true;
1019
+
1020
+ } else {
1021
+ if (moveType == consts.move.TYPE_PREV) {
1022
+ targetParentNode[childKey].splice(tmpTargetIndex, 0, node);
1023
+ } else {
1024
+ targetParentNode[childKey].splice(tmpTargetIndex + 1, 0, node);
1025
+ }
1026
+ node.parentTId = targetNode.parentTId;
1027
+ node.isFirstNode = false;
1028
+ node.isLastNode = false;
1029
+ }
1030
+ data.fixPIdKeyValue(setting, node);
1031
+ data.setSonNodeLevel(setting, node.getParentNode(), node);
1032
+
1033
+ //repair node what been moved
1034
+ view.setNodeLineIcos(setting, node);
1035
+ view.repairNodeLevelClass(setting, node, oldLevel)
1036
+
1037
+ //repair node's old parentNode dom
1038
+ if (!setting.data.keep.parent && oldParentNode[childKey].length < 1) {
1039
+ //old parentNode has no child nodes
1040
+ oldParentNode.isParent = false;
1041
+ oldParentNode.open = false;
1042
+ var tmp_ulObj = $$(oldParentNode, consts.id.UL, setting),
1043
+ tmp_switchObj = $$(oldParentNode, consts.id.SWITCH, setting),
1044
+ tmp_icoObj = $$(oldParentNode, consts.id.ICON, setting);
1045
+ view.replaceSwitchClass(oldParentNode, tmp_switchObj, consts.folder.DOCU);
1046
+ view.replaceIcoClass(oldParentNode, tmp_icoObj, consts.folder.DOCU);
1047
+ tmp_ulObj.css("display", "none");
1048
+
1049
+ } else if (oldNeighbor) {
1050
+ //old neigbor node
1051
+ view.setNodeLineIcos(setting, oldNeighbor);
1052
+ }
1053
+
1054
+ //new neigbor node
1055
+ if (newNeighbor) {
1056
+ view.setNodeLineIcos(setting, newNeighbor);
1057
+ }
1058
+
1059
+ //repair checkbox / radio
1060
+ if (!!setting.check && setting.check.enable && view.repairChkClass) {
1061
+ view.repairChkClass(setting, oldParentNode);
1062
+ view.repairParentChkClassWithSelf(setting, oldParentNode);
1063
+ if (oldParentNode != node.parent)
1064
+ view.repairParentChkClassWithSelf(setting, node);
1065
+ }
1066
+
1067
+ //expand parents after move
1068
+ if (!isSilent) {
1069
+ view.expandCollapseParentNode(setting, node.getParentNode(), true, animateFlag);
1070
+ }
1071
+ },
1072
+ removeEditBtn: function(setting, node) {
1073
+ $$(node, consts.id.EDIT, setting).unbind().remove();
1074
+ },
1075
+ removeRemoveBtn: function(setting, node) {
1076
+ $$(node, consts.id.REMOVE, setting).unbind().remove();
1077
+ },
1078
+ removeTreeDom: function(setting, node) {
1079
+ node.isHover = false;
1080
+ view.removeEditBtn(setting, node);
1081
+ view.removeRemoveBtn(setting, node);
1082
+ tools.apply(setting.view.removeHoverDom, [setting.treeId, node]);
1083
+ },
1084
+ repairNodeLevelClass: function(setting, node, oldLevel) {
1085
+ if (oldLevel === node.level) return;
1086
+ var liObj = $$(node, setting),
1087
+ aObj = $$(node, consts.id.A, setting),
1088
+ ulObj = $$(node, consts.id.UL, setting),
1089
+ oldClass = consts.className.LEVEL + oldLevel,
1090
+ newClass = consts.className.LEVEL + node.level;
1091
+ liObj.removeClass(oldClass);
1092
+ liObj.addClass(newClass);
1093
+ aObj.removeClass(oldClass);
1094
+ aObj.addClass(newClass);
1095
+ ulObj.removeClass(oldClass);
1096
+ ulObj.addClass(newClass);
1097
+ },
1098
+ selectNodes : function(setting, nodes) {
1099
+ for (var i=0, l=nodes.length; i<l; i++) {
1100
+ view.selectNode(setting, nodes[i], i>0);
1101
+ }
1102
+ }
1103
+ },
1104
+
1105
+ _z = {
1106
+ tools: _tools,
1107
+ view: _view,
1108
+ event: _event,
1109
+ data: _data
1110
+ };
1111
+ $.extend(true, $.fn.zTree.consts, _consts);
1112
+ $.extend(true, $.fn.zTree._z, _z);
1113
+
1114
+ var zt = $.fn.zTree,
1115
+ tools = zt._z.tools,
1116
+ consts = zt.consts,
1117
+ view = zt._z.view,
1118
+ data = zt._z.data,
1119
+ event = zt._z.event,
1120
+ $$ = tools.$;
1121
+
1122
+ data.exSetting(_setting);
1123
+ data.addInitBind(_bindEvent);
1124
+ data.addInitUnBind(_unbindEvent);
1125
+ data.addInitCache(_initCache);
1126
+ data.addInitNode(_initNode);
1127
+ data.addInitProxy(_eventProxy);
1128
+ data.addInitRoot(_initRoot);
1129
+ data.addZTreeTools(_zTreeTools);
1130
+
1131
+ var _cancelPreSelectedNode = view.cancelPreSelectedNode;
1132
+ view.cancelPreSelectedNode = function (setting, node) {
1133
+ var list = data.getRoot(setting).curSelectedList;
1134
+ for (var i=0, j=list.length; i<j; i++) {
1135
+ if (!node || node === list[i]) {
1136
+ view.removeTreeDom(setting, list[i]);
1137
+ if (node) break;
1138
+ }
1139
+ }
1140
+ if (_cancelPreSelectedNode) _cancelPreSelectedNode.apply(view, arguments);
1141
+ }
1142
+
1143
+ var _createNodes = view.createNodes;
1144
+ view.createNodes = function(setting, level, nodes, parentNode) {
1145
+ if (_createNodes) {
1146
+ _createNodes.apply(view, arguments);
1147
+ }
1148
+ if (!nodes) return;
1149
+ if (view.repairParentChkClassWithSelf) {
1150
+ view.repairParentChkClassWithSelf(setting, parentNode);
1151
+ }
1152
+ }
1153
+
1154
+ var _makeNodeUrl = view.makeNodeUrl;
1155
+ view.makeNodeUrl = function(setting, node) {
1156
+ return setting.edit.enable ? null : (_makeNodeUrl.apply(view, arguments));
1157
+ }
1158
+
1159
+ var _removeNode = view.removeNode;
1160
+ view.removeNode = function(setting, node) {
1161
+ var root = data.getRoot(setting);
1162
+ if (root.curEditNode === node) root.curEditNode = null;
1163
+ if (_removeNode) {
1164
+ _removeNode.apply(view, arguments);
1165
+ }
1166
+ }
1167
+
1168
+ var _selectNode = view.selectNode;
1169
+ view.selectNode = function(setting, node, addFlag) {
1170
+ var root = data.getRoot(setting);
1171
+ if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
1172
+ return false;
1173
+ }
1174
+ if (_selectNode) _selectNode.apply(view, arguments);
1175
+ view.addHoverDom(setting, node);
1176
+ return true;
1177
+ }
1178
+
1179
+ var _uCanDo = tools.uCanDo;
1180
+ tools.uCanDo = function(setting, e) {
1181
+ var root = data.getRoot(setting);
1182
+ if (e && (tools.eqs(e.type, "mouseover") || tools.eqs(e.type, "mouseout") || tools.eqs(e.type, "mousedown") || tools.eqs(e.type, "mouseup"))) {
1183
+ return true;
1184
+ }
1185
+ if (root.curEditNode) {
1186
+ view.editNodeBlur = false;
1187
+ root.curEditInput.focus();
1188
+ }
1189
+ return (!root.curEditNode) && (_uCanDo ? _uCanDo.apply(view, arguments) : true);
1190
+ }
1191
+ })(jQuery);