jquery.ztree.excheck-3.5.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. /*
  2. * JQuery zTree excheck 3.5.12
  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: 2013-03-11
  12. */
  13. (function($){
  14. //default consts of excheck
  15. var _consts = {
  16. event: {
  17. CHECK: "ztree_check"
  18. },
  19. id: {
  20. CHECK: "_check"
  21. },
  22. checkbox: {
  23. STYLE: "checkbox",
  24. DEFAULT: "chk",
  25. DISABLED: "disable",
  26. FALSE: "false",
  27. TRUE: "true",
  28. FULL: "full",
  29. PART: "part",
  30. FOCUS: "focus"
  31. },
  32. radio: {
  33. STYLE: "radio",
  34. TYPE_ALL: "all",
  35. TYPE_LEVEL: "level"
  36. }
  37. },
  38. //default setting of excheck
  39. _setting = {
  40. check: {
  41. enable: false,
  42. autoCheckTrigger: false,
  43. chkStyle: _consts.checkbox.STYLE,
  44. nocheckInherit: false,
  45. chkDisabledInherit: false,
  46. radioType: _consts.radio.TYPE_LEVEL,
  47. chkboxType: {
  48. "Y": "ps",
  49. "N": "ps"
  50. }
  51. },
  52. data: {
  53. key: {
  54. checked: "checked"
  55. }
  56. },
  57. callback: {
  58. beforeCheck:null,
  59. onCheck:null
  60. }
  61. },
  62. //default root of excheck
  63. _initRoot = function (setting) {
  64. var r = data.getRoot(setting);
  65. r.radioCheckedList = [];
  66. },
  67. //default cache of excheck
  68. _initCache = function(treeId) {},
  69. //default bind event of excheck
  70. _bindEvent = function(setting) {
  71. var o = setting.treeObj,
  72. c = consts.event;
  73. o.bind(c.CHECK, function (event, srcEvent, treeId, node) {
  74. tools.apply(setting.callback.onCheck, [!!srcEvent?srcEvent : event, treeId, node]);
  75. });
  76. },
  77. _unbindEvent = function(setting) {
  78. var o = setting.treeObj,
  79. c = consts.event;
  80. o.unbind(c.CHECK);
  81. },
  82. //default event proxy of excheck
  83. _eventProxy = function(e) {
  84. var target = e.target,
  85. setting = data.getSetting(e.data.treeId),
  86. tId = "", node = null,
  87. nodeEventType = "", treeEventType = "",
  88. nodeEventCallback = null, treeEventCallback = null;
  89. if (tools.eqs(e.type, "mouseover")) {
  90. if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
  91. tId = target.parentNode.id;
  92. nodeEventType = "mouseoverCheck";
  93. }
  94. } else if (tools.eqs(e.type, "mouseout")) {
  95. if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
  96. tId = target.parentNode.id;
  97. nodeEventType = "mouseoutCheck";
  98. }
  99. } else if (tools.eqs(e.type, "click")) {
  100. if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
  101. tId = target.parentNode.id;
  102. nodeEventType = "checkNode";
  103. }
  104. }
  105. if (tId.length>0) {
  106. node = data.getNodeCache(setting, tId);
  107. switch (nodeEventType) {
  108. case "checkNode" :
  109. nodeEventCallback = _handler.onCheckNode;
  110. break;
  111. case "mouseoverCheck" :
  112. nodeEventCallback = _handler.onMouseoverCheck;
  113. break;
  114. case "mouseoutCheck" :
  115. nodeEventCallback = _handler.onMouseoutCheck;
  116. break;
  117. }
  118. }
  119. var proxyResult = {
  120. stop: false,
  121. node: node,
  122. nodeEventType: nodeEventType,
  123. nodeEventCallback: nodeEventCallback,
  124. treeEventType: treeEventType,
  125. treeEventCallback: treeEventCallback
  126. };
  127. return proxyResult
  128. },
  129. //default init node of excheck
  130. _initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
  131. if (!n) return;
  132. var checkedKey = setting.data.key.checked;
  133. if (typeof n[checkedKey] == "string") n[checkedKey] = tools.eqs(n[checkedKey], "true");
  134. n[checkedKey] = !!n[checkedKey];
  135. n.checkedOld = n[checkedKey];
  136. if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true");
  137. n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck);
  138. if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true");
  139. n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled);
  140. if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true");
  141. n.halfCheck = !!n.halfCheck;
  142. n.check_Child_State = -1;
  143. n.check_Focus = false;
  144. n.getCheckStatus = function() {return data.getCheckStatus(setting, n);};
  145. },
  146. //add dom for check
  147. _beforeA = function(setting, node, html) {
  148. var checkedKey = setting.data.key.checked;
  149. if (setting.check.enable) {
  150. data.makeChkFlag(setting, node);
  151. if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && node[checkedKey] ) {
  152. var r = data.getRoot(setting);
  153. r.radioCheckedList.push(node);
  154. }
  155. html.push("<span ID='", node.tId, consts.id.CHECK, "' class='", view.makeChkClass(setting, node), "' treeNode", consts.id.CHECK, (node.nocheck === true?" style='display:none;'":""),"></span>");
  156. }
  157. },
  158. //update zTreeObj, add method of check
  159. _zTreeTools = function(setting, zTreeTools) {
  160. zTreeTools.checkNode = function(node, checked, checkTypeFlag, callbackFlag) {
  161. var checkedKey = this.setting.data.key.checked;
  162. if (node.chkDisabled === true) return;
  163. if (checked !== true && checked !== false) {
  164. checked = !node[checkedKey];
  165. }
  166. callbackFlag = !!callbackFlag;
  167. if (node[checkedKey] === checked && !checkTypeFlag) {
  168. return;
  169. } else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) {
  170. return;
  171. }
  172. if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) {
  173. node[checkedKey] = checked;
  174. var checkObj = $("#" + node.tId + consts.id.CHECK);
  175. if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
  176. view.setChkClass(this.setting, checkObj, node);
  177. view.repairParentChkClassWithSelf(this.setting, node);
  178. if (callbackFlag) {
  179. setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
  180. }
  181. }
  182. }
  183. zTreeTools.checkAllNodes = function(checked) {
  184. view.repairAllChk(this.setting, !!checked);
  185. }
  186. zTreeTools.getCheckedNodes = function(checked) {
  187. var childKey = this.setting.data.key.children;
  188. checked = (checked !== false);
  189. return data.getTreeCheckedNodes(this.setting, data.getRoot(setting)[childKey], checked);
  190. }
  191. zTreeTools.getChangeCheckedNodes = function() {
  192. var childKey = this.setting.data.key.children;
  193. return data.getTreeChangeCheckedNodes(this.setting, data.getRoot(setting)[childKey]);
  194. }
  195. zTreeTools.setChkDisabled = function(node, disabled, inheritParent, inheritChildren) {
  196. disabled = !!disabled;
  197. inheritParent = !!inheritParent;
  198. inheritChildren = !!inheritChildren;
  199. view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren);
  200. view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent);
  201. }
  202. var _updateNode = zTreeTools.updateNode;
  203. zTreeTools.updateNode = function(node, checkTypeFlag) {
  204. if (_updateNode) _updateNode.apply(zTreeTools, arguments);
  205. if (!node || !this.setting.check.enable) return;
  206. var nObj = $("#" + node.tId);
  207. if (nObj.get(0) && tools.uCanDo(this.setting)) {
  208. var checkObj = $("#" + node.tId + consts.id.CHECK);
  209. if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
  210. view.setChkClass(this.setting, checkObj, node);
  211. view.repairParentChkClassWithSelf(this.setting, node);
  212. }
  213. }
  214. },
  215. //method of operate data
  216. _data = {
  217. getRadioCheckedList: function(setting) {
  218. var checkedList = data.getRoot(setting).radioCheckedList;
  219. for (var i=0, j=checkedList.length; i<j; i++) {
  220. if(!data.getNodeCache(setting, checkedList[i].tId)) {
  221. checkedList.splice(i, 1);
  222. i--; j--;
  223. }
  224. }
  225. return checkedList;
  226. },
  227. getCheckStatus: function(setting, node) {
  228. if (!setting.check.enable || node.nocheck || node.chkDisabled) return null;
  229. var checkedKey = setting.data.key.checked,
  230. r = {
  231. checked: node[checkedKey],
  232. half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (node[checkedKey] ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0)))
  233. };
  234. return r;
  235. },
  236. getTreeCheckedNodes: function(setting, nodes, checked, results) {
  237. if (!nodes) return [];
  238. var childKey = setting.data.key.children,
  239. checkedKey = setting.data.key.checked,
  240. onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL);
  241. results = !results ? [] : results;
  242. for (var i = 0, l = nodes.length; i < l; i++) {
  243. if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] == checked) {
  244. results.push(nodes[i]);
  245. if(onlyOne) {
  246. break;
  247. }
  248. }
  249. data.getTreeCheckedNodes(setting, nodes[i][childKey], checked, results);
  250. if(onlyOne && results.length > 0) {
  251. break;
  252. }
  253. }
  254. return results;
  255. },
  256. getTreeChangeCheckedNodes: function(setting, nodes, results) {
  257. if (!nodes) return [];
  258. var childKey = setting.data.key.children,
  259. checkedKey = setting.data.key.checked;
  260. results = !results ? [] : results;
  261. for (var i = 0, l = nodes.length; i < l; i++) {
  262. if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] != nodes[i].checkedOld) {
  263. results.push(nodes[i]);
  264. }
  265. data.getTreeChangeCheckedNodes(setting, nodes[i][childKey], results);
  266. }
  267. return results;
  268. },
  269. makeChkFlag: function(setting, node) {
  270. if (!node) return;
  271. var childKey = setting.data.key.children,
  272. checkedKey = setting.data.key.checked,
  273. chkFlag = -1;
  274. if (node[childKey]) {
  275. for (var i = 0, l = node[childKey].length; i < l; i++) {
  276. var cNode = node[childKey][i];
  277. var tmp = -1;
  278. if (setting.check.chkStyle == consts.radio.STYLE) {
  279. if (cNode.nocheck === true || cNode.chkDisabled === true) {
  280. tmp = cNode.check_Child_State;
  281. } else if (cNode.halfCheck === true) {
  282. tmp = 2;
  283. } else if (cNode[checkedKey]) {
  284. tmp = 2;
  285. } else {
  286. tmp = cNode.check_Child_State > 0 ? 2:0;
  287. }
  288. if (tmp == 2) {
  289. chkFlag = 2; break;
  290. } else if (tmp == 0){
  291. chkFlag = 0;
  292. }
  293. } else if (setting.check.chkStyle == consts.checkbox.STYLE) {
  294. if (cNode.nocheck === true || cNode.chkDisabled === true) {
  295. tmp = cNode.check_Child_State;
  296. } else if (cNode.halfCheck === true) {
  297. tmp = 1;
  298. } else if (cNode[checkedKey] ) {
  299. tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1;
  300. } else {
  301. tmp = (cNode.check_Child_State > 0) ? 1 : 0;
  302. }
  303. if (tmp === 1) {
  304. chkFlag = 1; break;
  305. } else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) {
  306. chkFlag = 1; break;
  307. } else if (chkFlag === 2 && tmp > -1 && tmp < 2) {
  308. chkFlag = 1; break;
  309. } else if (tmp > -1) {
  310. chkFlag = tmp;
  311. }
  312. }
  313. }
  314. }
  315. node.check_Child_State = chkFlag;
  316. }
  317. },
  318. //method of event proxy
  319. _event = {
  320. },
  321. //method of event handler
  322. _handler = {
  323. onCheckNode: function (event, node) {
  324. if (node.chkDisabled === true) return false;
  325. var setting = data.getSetting(event.data.treeId),
  326. checkedKey = setting.data.key.checked;
  327. if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true;
  328. node[checkedKey] = !node[checkedKey];
  329. view.checkNodeRelation(setting, node);
  330. var checkObj = $("#" + node.tId + consts.id.CHECK);
  331. view.setChkClass(setting, checkObj, node);
  332. view.repairParentChkClassWithSelf(setting, node);
  333. setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]);
  334. return true;
  335. },
  336. onMouseoverCheck: function(event, node) {
  337. if (node.chkDisabled === true) return false;
  338. var setting = data.getSetting(event.data.treeId),
  339. checkObj = $("#" + node.tId + consts.id.CHECK);
  340. node.check_Focus = true;
  341. view.setChkClass(setting, checkObj, node);
  342. return true;
  343. },
  344. onMouseoutCheck: function(event, node) {
  345. if (node.chkDisabled === true) return false;
  346. var setting = data.getSetting(event.data.treeId),
  347. checkObj = $("#" + node.tId + consts.id.CHECK);
  348. node.check_Focus = false;
  349. view.setChkClass(setting, checkObj, node);
  350. return true;
  351. }
  352. },
  353. //method of tools for zTree
  354. _tools = {
  355. },
  356. //method of operate ztree dom
  357. _view = {
  358. checkNodeRelation: function(setting, node) {
  359. var pNode, i, l,
  360. childKey = setting.data.key.children,
  361. checkedKey = setting.data.key.checked,
  362. r = consts.radio;
  363. if (setting.check.chkStyle == r.STYLE) {
  364. var checkedList = data.getRadioCheckedList(setting);
  365. if (node[checkedKey]) {
  366. if (setting.check.radioType == r.TYPE_ALL) {
  367. for (i = checkedList.length-1; i >= 0; i--) {
  368. pNode = checkedList[i];
  369. pNode[checkedKey] = false;
  370. checkedList.splice(i, 1);
  371. view.setChkClass(setting, $("#" + pNode.tId + consts.id.CHECK), pNode);
  372. if (pNode.parentTId != node.parentTId) {
  373. view.repairParentChkClassWithSelf(setting, pNode);
  374. }
  375. }
  376. checkedList.push(node);
  377. } else {
  378. var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
  379. for (i = 0, l = parentNode[childKey].length; i < l; i++) {
  380. pNode = parentNode[childKey][i];
  381. if (pNode[checkedKey] && pNode != node) {
  382. pNode[checkedKey] = false;
  383. view.setChkClass(setting, $("#" + pNode.tId + consts.id.CHECK), pNode);
  384. }
  385. }
  386. }
  387. } else if (setting.check.radioType == r.TYPE_ALL) {
  388. for (i = 0, l = checkedList.length; i < l; i++) {
  389. if (node == checkedList[i]) {
  390. checkedList.splice(i, 1);
  391. break;
  392. }
  393. }
  394. }
  395. } else {
  396. if (node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.Y.indexOf("s") > -1)) {
  397. view.setSonNodeCheckBox(setting, node, true);
  398. }
  399. if (!node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.N.indexOf("s") > -1)) {
  400. view.setSonNodeCheckBox(setting, node, false);
  401. }
  402. if (node[checkedKey] && setting.check.chkboxType.Y.indexOf("p") > -1) {
  403. view.setParentNodeCheckBox(setting, node, true);
  404. }
  405. if (!node[checkedKey] && setting.check.chkboxType.N.indexOf("p") > -1) {
  406. view.setParentNodeCheckBox(setting, node, false);
  407. }
  408. }
  409. },
  410. makeChkClass: function(setting, node) {
  411. var checkedKey = setting.data.key.checked,
  412. c = consts.checkbox, r = consts.radio,
  413. fullStyle = "";
  414. if (node.chkDisabled === true) {
  415. fullStyle = c.DISABLED;
  416. } else if (node.halfCheck) {
  417. fullStyle = c.PART;
  418. } else if (setting.check.chkStyle == r.STYLE) {
  419. fullStyle = (node.check_Child_State < 1)? c.FULL:c.PART;
  420. } else {
  421. fullStyle = node[checkedKey] ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL:c.PART) : ((node.check_Child_State < 1)? c.FULL:c.PART);
  422. }
  423. var chkName = setting.check.chkStyle + "_" + (node[checkedKey] ? c.TRUE : c.FALSE) + "_" + fullStyle;
  424. chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName;
  425. return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName;
  426. },
  427. repairAllChk: function(setting, checked) {
  428. if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) {
  429. var checkedKey = setting.data.key.checked,
  430. childKey = setting.data.key.children,
  431. root = data.getRoot(setting);
  432. for (var i = 0, l = root[childKey].length; i<l ; i++) {
  433. var node = root[childKey][i];
  434. if (node.nocheck !== true && node.chkDisabled !== true) {
  435. node[checkedKey] = checked;
  436. }
  437. view.setSonNodeCheckBox(setting, node, checked);
  438. }
  439. }
  440. },
  441. repairChkClass: function(setting, node) {
  442. if (!node) return;
  443. data.makeChkFlag(setting, node);
  444. if (node.nocheck !== true) {
  445. var checkObj = $("#" + node.tId + consts.id.CHECK);
  446. view.setChkClass(setting, checkObj, node);
  447. }
  448. },
  449. repairParentChkClass: function(setting, node) {
  450. if (!node || !node.parentTId) return;
  451. var pNode = node.getParentNode();
  452. view.repairChkClass(setting, pNode);
  453. view.repairParentChkClass(setting, pNode);
  454. },
  455. repairParentChkClassWithSelf: function(setting, node) {
  456. if (!node) return;
  457. var childKey = setting.data.key.children;
  458. if (node[childKey] && node[childKey].length > 0) {
  459. view.repairParentChkClass(setting, node[childKey][0]);
  460. } else {
  461. view.repairParentChkClass(setting, node);
  462. }
  463. },
  464. repairSonChkDisabled: function(setting, node, chkDisabled, inherit) {
  465. if (!node) return;
  466. var childKey = setting.data.key.children;
  467. if (node.chkDisabled != chkDisabled) {
  468. node.chkDisabled = chkDisabled;
  469. }
  470. view.repairChkClass(setting, node);
  471. if (node[childKey] && inherit) {
  472. for (var i = 0, l = node[childKey].length; i < l; i++) {
  473. var sNode = node[childKey][i];
  474. view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit);
  475. }
  476. }
  477. },
  478. repairParentChkDisabled: function(setting, node, chkDisabled, inherit) {
  479. if (!node) return;
  480. if (node.chkDisabled != chkDisabled && inherit) {
  481. node.chkDisabled = chkDisabled;
  482. }
  483. view.repairChkClass(setting, node);
  484. view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit);
  485. },
  486. setChkClass: function(setting, obj, node) {
  487. if (!obj) return;
  488. if (node.nocheck === true) {
  489. obj.hide();
  490. } else {
  491. obj.show();
  492. }
  493. obj.removeClass();
  494. obj.addClass(view.makeChkClass(setting, node));
  495. },
  496. setParentNodeCheckBox: function(setting, node, value, srcNode) {
  497. var childKey = setting.data.key.children,
  498. checkedKey = setting.data.key.checked,
  499. checkObj = $("#" + node.tId + consts.id.CHECK);
  500. if (!srcNode) srcNode = node;
  501. data.makeChkFlag(setting, node);
  502. if (node.nocheck !== true && node.chkDisabled !== true) {
  503. node[checkedKey] = value;
  504. view.setChkClass(setting, checkObj, node);
  505. if (setting.check.autoCheckTrigger && node != srcNode) {
  506. setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
  507. }
  508. }
  509. if (node.parentTId) {
  510. var pSign = true;
  511. if (!value) {
  512. var pNodes = node.getParentNode()[childKey];
  513. for (var i = 0, l = pNodes.length; i < l; i++) {
  514. if ((pNodes[i].nocheck !== true && pNodes[i].chkDisabled !== true && pNodes[i][checkedKey])
  515. || ((pNodes[i].nocheck === true || pNodes[i].chkDisabled === true) && pNodes[i].check_Child_State > 0)) {
  516. pSign = false;
  517. break;
  518. }
  519. }
  520. }
  521. if (pSign) {
  522. view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode);
  523. }
  524. }
  525. },
  526. setSonNodeCheckBox: function(setting, node, value, srcNode) {
  527. if (!node) return;
  528. var childKey = setting.data.key.children,
  529. checkedKey = setting.data.key.checked,
  530. checkObj = $("#" + node.tId + consts.id.CHECK);
  531. if (!srcNode) srcNode = node;
  532. var hasDisable = false;
  533. if (node[childKey]) {
  534. for (var i = 0, l = node[childKey].length; i < l && node.chkDisabled !== true; i++) {
  535. var sNode = node[childKey][i];
  536. view.setSonNodeCheckBox(setting, sNode, value, srcNode);
  537. if (sNode.chkDisabled === true) hasDisable = true;
  538. }
  539. }
  540. if (node != data.getRoot(setting) && node.chkDisabled !== true) {
  541. if (hasDisable && node.nocheck !== true) {
  542. data.makeChkFlag(setting, node);
  543. }
  544. if (node.nocheck !== true && node.chkDisabled !== true) {
  545. node[checkedKey] = value;
  546. if (!hasDisable) node.check_Child_State = (node[childKey] && node[childKey].length > 0) ? (value ? 2 : 0) : -1;
  547. } else {
  548. node.check_Child_State = -1;
  549. }
  550. view.setChkClass(setting, checkObj, node);
  551. if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) {
  552. setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
  553. }
  554. }
  555. }
  556. },
  557. _z = {
  558. tools: _tools,
  559. view: _view,
  560. event: _event,
  561. data: _data
  562. };
  563. $.extend(true, $.fn.zTree.consts, _consts);
  564. $.extend(true, $.fn.zTree._z, _z);
  565. var zt = $.fn.zTree,
  566. tools = zt._z.tools,
  567. consts = zt.consts,
  568. view = zt._z.view,
  569. data = zt._z.data,
  570. event = zt._z.event;
  571. data.exSetting(_setting);
  572. data.addInitBind(_bindEvent);
  573. data.addInitUnBind(_unbindEvent);
  574. data.addInitCache(_initCache);
  575. data.addInitNode(_initNode);
  576. data.addInitProxy(_eventProxy);
  577. data.addInitRoot(_initRoot);
  578. data.addBeforeA(_beforeA);
  579. data.addZTreeTools(_zTreeTools);
  580. var _createNodes = view.createNodes;
  581. view.createNodes = function(setting, level, nodes, parentNode) {
  582. if (_createNodes) _createNodes.apply(view, arguments);
  583. if (!nodes) return;
  584. view.repairParentChkClassWithSelf(setting, parentNode);
  585. }
  586. var _removeNode = view.removeNode;
  587. view.removeNode = function(setting, node) {
  588. var parentNode = node.getParentNode();
  589. if (_removeNode) _removeNode.apply(view, arguments);
  590. if (!node || !parentNode) return;
  591. view.repairChkClass(setting, parentNode);
  592. view.repairParentChkClass(setting, parentNode);
  593. }
  594. var _appendNodes = view.appendNodes;
  595. view.appendNodes = function(setting, level, nodes, parentNode, initFlag, openFlag) {
  596. var html = "";
  597. if (_appendNodes) {
  598. html = _appendNodes.apply(view, arguments);
  599. }
  600. if (parentNode) {
  601. data.makeChkFlag(setting, parentNode);
  602. }
  603. return html;
  604. }
  605. })(jQuery);