vend-ztree.all.js 149 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735
  1. /*
  2. * JQuery zTree core v3.5.28
  3. * http://treejs.cn/
  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: 2017-01-20
  12. */
  13. import jQuery from 'jquery';
  14. (function ($) {
  15. var settings = {}, roots = {}, caches = {},
  16. //default consts of core
  17. _consts = {
  18. className: {
  19. BUTTON: "button",
  20. LEVEL: "level",
  21. ICO_LOADING: "ico_loading",
  22. SWITCH: "switch",
  23. NAME: 'node_name'
  24. },
  25. event: {
  26. NODECREATED: "ztree_nodeCreated",
  27. CLICK: "ztree_click",
  28. EXPAND: "ztree_expand",
  29. COLLAPSE: "ztree_collapse",
  30. ASYNC_SUCCESS: "ztree_async_success",
  31. ASYNC_ERROR: "ztree_async_error",
  32. REMOVE: "ztree_remove",
  33. SELECTED: "ztree_selected",
  34. UNSELECTED: "ztree_unselected"
  35. },
  36. id: {
  37. A: "_a",
  38. ICON: "_ico",
  39. SPAN: "_span",
  40. SWITCH: "_switch",
  41. UL: "_ul"
  42. },
  43. line: {
  44. ROOT: "root",
  45. ROOTS: "roots",
  46. CENTER: "center",
  47. BOTTOM: "bottom",
  48. NOLINE: "noline",
  49. LINE: "line"
  50. },
  51. folder: {
  52. OPEN: "open",
  53. CLOSE: "close",
  54. DOCU: "docu"
  55. },
  56. node: {
  57. CURSELECTED: "curSelectedNode"
  58. }
  59. },
  60. //default setting of core
  61. _setting = {
  62. treeId: "",
  63. treeObj: null,
  64. view: {
  65. addDiyDom: null,
  66. autoCancelSelected: true,
  67. dblClickExpand: true,
  68. expandSpeed: "fast",
  69. fontCss: {},
  70. nameIsHTML: false,
  71. selectedMulti: true,
  72. showIcon: true,
  73. showLine: true,
  74. showTitle: true,
  75. txtSelectedEnable: false
  76. },
  77. data: {
  78. key: {
  79. children: "children",
  80. name: "name",
  81. title: "",
  82. url: "url",
  83. icon: "icon"
  84. },
  85. simpleData: {
  86. enable: false,
  87. idKey: "id",
  88. pIdKey: "pId",
  89. rootPId: null
  90. },
  91. keep: {
  92. parent: false,
  93. leaf: false
  94. }
  95. },
  96. async: {
  97. enable: false,
  98. contentType: "application/x-www-form-urlencoded",
  99. type: "post",
  100. dataType: "text",
  101. url: "",
  102. autoParam: [],
  103. otherParam: [],
  104. dataFilter: null
  105. },
  106. callback: {
  107. beforeAsync: null,
  108. beforeClick: null,
  109. beforeDblClick: null,
  110. beforeRightClick: null,
  111. beforeMouseDown: null,
  112. beforeMouseUp: null,
  113. beforeExpand: null,
  114. beforeCollapse: null,
  115. beforeRemove: null,
  116. onAsyncError: null,
  117. onAsyncSuccess: null,
  118. onNodeCreated: null,
  119. onClick: null,
  120. onDblClick: null,
  121. onRightClick: null,
  122. onMouseDown: null,
  123. onMouseUp: null,
  124. onExpand: null,
  125. onCollapse: null,
  126. onRemove: null
  127. }
  128. },
  129. //default root of core
  130. //zTree use root to save full data
  131. _initRoot = function (setting) {
  132. var r = data.getRoot(setting);
  133. if (!r) {
  134. r = {};
  135. data.setRoot(setting, r);
  136. }
  137. r[setting.data.key.children] = [];
  138. r.expandTriggerFlag = false;
  139. r.curSelectedList = [];
  140. r.noSelection = true;
  141. r.createdNodes = [];
  142. r.zId = 0;
  143. r._ver = (new Date()).getTime();
  144. },
  145. //default cache of core
  146. _initCache = function (setting) {
  147. var c = data.getCache(setting);
  148. if (!c) {
  149. c = {};
  150. data.setCache(setting, c);
  151. }
  152. c.nodes = [];
  153. c.doms = [];
  154. },
  155. //default bindEvent of core
  156. _bindEvent = function (setting) {
  157. var o = setting.treeObj,
  158. c = consts.event;
  159. o.bind(c.NODECREATED, function (event, treeId, node) {
  160. tools.apply(setting.callback.onNodeCreated, [event, treeId, node]);
  161. });
  162. o.bind(c.CLICK, function (event, srcEvent, treeId, node, clickFlag) {
  163. tools.apply(setting.callback.onClick, [srcEvent, treeId, node, clickFlag]);
  164. });
  165. o.bind(c.EXPAND, function (event, treeId, node) {
  166. tools.apply(setting.callback.onExpand, [event, treeId, node]);
  167. });
  168. o.bind(c.COLLAPSE, function (event, treeId, node) {
  169. tools.apply(setting.callback.onCollapse, [event, treeId, node]);
  170. });
  171. o.bind(c.ASYNC_SUCCESS, function (event, treeId, node, msg) {
  172. tools.apply(setting.callback.onAsyncSuccess, [event, treeId, node, msg]);
  173. });
  174. o.bind(c.ASYNC_ERROR, function (event, treeId, node, XMLHttpRequest, textStatus, errorThrown) {
  175. tools.apply(setting.callback.onAsyncError, [event, treeId, node, XMLHttpRequest, textStatus, errorThrown]);
  176. });
  177. o.bind(c.REMOVE, function (event, treeId, treeNode) {
  178. tools.apply(setting.callback.onRemove, [event, treeId, treeNode]);
  179. });
  180. o.bind(c.SELECTED, function (event, treeId, node) {
  181. tools.apply(setting.callback.onSelected, [treeId, node]);
  182. });
  183. o.bind(c.UNSELECTED, function (event, treeId, node) {
  184. tools.apply(setting.callback.onUnSelected, [treeId, node]);
  185. });
  186. },
  187. _unbindEvent = function (setting) {
  188. var o = setting.treeObj,
  189. c = consts.event;
  190. o.unbind(c.NODECREATED)
  191. .unbind(c.CLICK)
  192. .unbind(c.EXPAND)
  193. .unbind(c.COLLAPSE)
  194. .unbind(c.ASYNC_SUCCESS)
  195. .unbind(c.ASYNC_ERROR)
  196. .unbind(c.REMOVE)
  197. .unbind(c.SELECTED)
  198. .unbind(c.UNSELECTED);
  199. },
  200. //default event proxy of core
  201. _eventProxy = function (event) {
  202. var target = event.target,
  203. setting = data.getSetting(event.data.treeId),
  204. tId = "", node = null,
  205. nodeEventType = "", treeEventType = "",
  206. nodeEventCallback = null, treeEventCallback = null,
  207. tmp = null;
  208. if (tools.eqs(event.type, "mousedown")) {
  209. treeEventType = "mousedown";
  210. } else if (tools.eqs(event.type, "mouseup")) {
  211. treeEventType = "mouseup";
  212. } else if (tools.eqs(event.type, "contextmenu")) {
  213. treeEventType = "contextmenu";
  214. } else if (tools.eqs(event.type, "click")) {
  215. if (tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.SWITCH) !== null) {
  216. tId = tools.getNodeMainDom(target).id;
  217. nodeEventType = "switchNode";
  218. } else {
  219. tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]);
  220. if (tmp) {
  221. tId = tools.getNodeMainDom(tmp).id;
  222. nodeEventType = "clickNode";
  223. }
  224. }
  225. } else if (tools.eqs(event.type, "dblclick")) {
  226. treeEventType = "dblclick";
  227. tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]);
  228. if (tmp) {
  229. tId = tools.getNodeMainDom(tmp).id;
  230. nodeEventType = "switchNode";
  231. }
  232. }
  233. if (treeEventType.length > 0 && tId.length == 0) {
  234. tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]);
  235. if (tmp) {
  236. tId = tools.getNodeMainDom(tmp).id;
  237. }
  238. }
  239. // event to node
  240. if (tId.length > 0) {
  241. node = data.getNodeCache(setting, tId);
  242. switch (nodeEventType) {
  243. case "switchNode" :
  244. if (!node.isParent) {
  245. nodeEventType = "";
  246. } else if (tools.eqs(event.type, "click")
  247. || (tools.eqs(event.type, "dblclick") && tools.apply(setting.view.dblClickExpand, [setting.treeId, node], setting.view.dblClickExpand))) {
  248. nodeEventCallback = handler.onSwitchNode;
  249. } else {
  250. nodeEventType = "";
  251. }
  252. break;
  253. case "clickNode" :
  254. nodeEventCallback = handler.onClickNode;
  255. break;
  256. }
  257. }
  258. // event to zTree
  259. switch (treeEventType) {
  260. case "mousedown" :
  261. treeEventCallback = handler.onZTreeMousedown;
  262. break;
  263. case "mouseup" :
  264. treeEventCallback = handler.onZTreeMouseup;
  265. break;
  266. case "dblclick" :
  267. treeEventCallback = handler.onZTreeDblclick;
  268. break;
  269. case "contextmenu" :
  270. treeEventCallback = handler.onZTreeContextmenu;
  271. break;
  272. }
  273. var proxyResult = {
  274. stop: false,
  275. node: node,
  276. nodeEventType: nodeEventType,
  277. nodeEventCallback: nodeEventCallback,
  278. treeEventType: treeEventType,
  279. treeEventCallback: treeEventCallback
  280. };
  281. return proxyResult
  282. },
  283. //default init node of core
  284. _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
  285. if (!n) return;
  286. var r = data.getRoot(setting),
  287. childKey = setting.data.key.children;
  288. n.level = level;
  289. n.tId = setting.treeId + "_" + (++r.zId);
  290. n.parentTId = parentNode ? parentNode.tId : null;
  291. n.open = (typeof n.open == "string") ? tools.eqs(n.open, "true") : !!n.open;
  292. if (n[childKey] && n[childKey].length > 0) {
  293. n.isParent = true;
  294. n.zAsync = true;
  295. } else {
  296. n.isParent = (typeof n.isParent == "string") ? tools.eqs(n.isParent, "true") : !!n.isParent;
  297. n.open = (n.isParent && !setting.async.enable) ? n.open : false;
  298. n.zAsync = !n.isParent;
  299. }
  300. n.isFirstNode = isFirstNode;
  301. n.isLastNode = isLastNode;
  302. n.getParentNode = function () {
  303. return data.getNodeCache(setting, n.parentTId);
  304. };
  305. n.getPreNode = function () {
  306. return data.getPreNode(setting, n);
  307. };
  308. n.getNextNode = function () {
  309. return data.getNextNode(setting, n);
  310. };
  311. n.getIndex = function () {
  312. return data.getNodeIndex(setting, n);
  313. };
  314. n.getPath = function () {
  315. return data.getNodePath(setting, n);
  316. };
  317. n.isAjaxing = false;
  318. data.fixPIdKeyValue(setting, n);
  319. },
  320. _init = {
  321. bind: [_bindEvent],
  322. unbind: [_unbindEvent],
  323. caches: [_initCache],
  324. nodes: [_initNode],
  325. proxys: [_eventProxy],
  326. roots: [_initRoot],
  327. beforeA: [],
  328. afterA: [],
  329. innerBeforeA: [],
  330. innerAfterA: [],
  331. zTreeTools: []
  332. },
  333. //method of operate data
  334. data = {
  335. addNodeCache: function (setting, node) {
  336. data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = node;
  337. },
  338. getNodeCacheId: function (tId) {
  339. return tId.substring(tId.lastIndexOf("_") + 1);
  340. },
  341. addAfterA: function (afterA) {
  342. _init.afterA.push(afterA);
  343. },
  344. addBeforeA: function (beforeA) {
  345. _init.beforeA.push(beforeA);
  346. },
  347. addInnerAfterA: function (innerAfterA) {
  348. _init.innerAfterA.push(innerAfterA);
  349. },
  350. addInnerBeforeA: function (innerBeforeA) {
  351. _init.innerBeforeA.push(innerBeforeA);
  352. },
  353. addInitBind: function (bindEvent) {
  354. _init.bind.push(bindEvent);
  355. },
  356. addInitUnBind: function (unbindEvent) {
  357. _init.unbind.push(unbindEvent);
  358. },
  359. addInitCache: function (initCache) {
  360. _init.caches.push(initCache);
  361. },
  362. addInitNode: function (initNode) {
  363. _init.nodes.push(initNode);
  364. },
  365. addInitProxy: function (initProxy, isFirst) {
  366. if (!!isFirst) {
  367. _init.proxys.splice(0, 0, initProxy);
  368. } else {
  369. _init.proxys.push(initProxy);
  370. }
  371. },
  372. addInitRoot: function (initRoot) {
  373. _init.roots.push(initRoot);
  374. },
  375. addNodesData: function (setting, parentNode, index, nodes) {
  376. var childKey = setting.data.key.children, params;
  377. if (!parentNode[childKey]) {
  378. parentNode[childKey] = [];
  379. index = -1;
  380. } else if (index >= parentNode[childKey].length) {
  381. index = -1;
  382. }
  383. if (parentNode[childKey].length > 0 && index === 0) {
  384. parentNode[childKey][0].isFirstNode = false;
  385. view.setNodeLineIcos(setting, parentNode[childKey][0]);
  386. } else if (parentNode[childKey].length > 0 && index < 0) {
  387. parentNode[childKey][parentNode[childKey].length - 1].isLastNode = false;
  388. view.setNodeLineIcos(setting, parentNode[childKey][parentNode[childKey].length - 1]);
  389. }
  390. parentNode.isParent = true;
  391. if (index < 0) {
  392. parentNode[childKey] = parentNode[childKey].concat(nodes);
  393. } else {
  394. params = [index, 0].concat(nodes);
  395. parentNode[childKey].splice.apply(parentNode[childKey], params);
  396. }
  397. },
  398. addSelectedNode: function (setting, node) {
  399. var root = data.getRoot(setting);
  400. if (!data.isSelectedNode(setting, node)) {
  401. root.curSelectedList.push(node);
  402. }
  403. },
  404. addCreatedNode: function (setting, node) {
  405. if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) {
  406. var root = data.getRoot(setting);
  407. root.createdNodes.push(node);
  408. }
  409. },
  410. addZTreeTools: function (zTreeTools) {
  411. _init.zTreeTools.push(zTreeTools);
  412. },
  413. exSetting: function (s) {
  414. $.extend(true, _setting, s);
  415. },
  416. fixPIdKeyValue: function (setting, node) {
  417. if (setting.data.simpleData.enable) {
  418. node[setting.data.simpleData.pIdKey] = node.parentTId ? node.getParentNode()[setting.data.simpleData.idKey] : setting.data.simpleData.rootPId;
  419. }
  420. },
  421. getAfterA: function (setting, node, array) {
  422. for (var i = 0, j = _init.afterA.length; i < j; i++) {
  423. _init.afterA[i].apply(this, arguments);
  424. }
  425. },
  426. getBeforeA: function (setting, node, array) {
  427. for (var i = 0, j = _init.beforeA.length; i < j; i++) {
  428. _init.beforeA[i].apply(this, arguments);
  429. }
  430. },
  431. getInnerAfterA: function (setting, node, array) {
  432. for (var i = 0, j = _init.innerAfterA.length; i < j; i++) {
  433. _init.innerAfterA[i].apply(this, arguments);
  434. }
  435. },
  436. getInnerBeforeA: function (setting, node, array) {
  437. for (var i = 0, j = _init.innerBeforeA.length; i < j; i++) {
  438. _init.innerBeforeA[i].apply(this, arguments);
  439. }
  440. },
  441. getCache: function (setting) {
  442. return caches[setting.treeId];
  443. },
  444. getNodeIndex: function (setting, node) {
  445. if (!node) return null;
  446. var childKey = setting.data.key.children,
  447. p = node.parentTId ? node.getParentNode() : data.getRoot(setting);
  448. for (var i = 0, l = p[childKey].length - 1; i <= l; i++) {
  449. if (p[childKey][i] === node) {
  450. return i;
  451. }
  452. }
  453. return -1;
  454. },
  455. getNextNode: function (setting, node) {
  456. if (!node) return null;
  457. var childKey = setting.data.key.children,
  458. p = node.parentTId ? node.getParentNode() : data.getRoot(setting);
  459. for (var i = 0, l = p[childKey].length - 1; i <= l; i++) {
  460. if (p[childKey][i] === node) {
  461. return (i == l ? null : p[childKey][i + 1]);
  462. }
  463. }
  464. return null;
  465. },
  466. getNodeByParam: function (setting, nodes, key, value) {
  467. if (!nodes || !key) return null;
  468. var childKey = setting.data.key.children;
  469. for (var i = 0, l = nodes.length; i < l; i++) {
  470. if (nodes[i][key] == value) {
  471. return nodes[i];
  472. }
  473. var tmp = data.getNodeByParam(setting, nodes[i][childKey], key, value);
  474. if (tmp) return tmp;
  475. }
  476. return null;
  477. },
  478. getNodeCache: function (setting, tId) {
  479. if (!tId) return null;
  480. var n = caches[setting.treeId].nodes[data.getNodeCacheId(tId)];
  481. return n ? n : null;
  482. },
  483. getNodeName: function (setting, node) {
  484. var nameKey = setting.data.key.name;
  485. return "" + node[nameKey];
  486. },
  487. getNodePath: function (setting, node) {
  488. if (!node) return null;
  489. var path;
  490. if (node.parentTId) {
  491. path = node.getParentNode().getPath();
  492. } else {
  493. path = [];
  494. }
  495. if (path) {
  496. path.push(node);
  497. }
  498. return path;
  499. },
  500. getNodeTitle: function (setting, node) {
  501. var t = setting.data.key.title === "" ? setting.data.key.name : setting.data.key.title;
  502. return "" + node[t];
  503. },
  504. getNodes: function (setting) {
  505. return data.getRoot(setting)[setting.data.key.children];
  506. },
  507. getNodesByParam: function (setting, nodes, key, value) {
  508. if (!nodes || !key) return [];
  509. var childKey = setting.data.key.children,
  510. result = [];
  511. for (var i = 0, l = nodes.length; i < l; i++) {
  512. if (nodes[i][key] == value) {
  513. result.push(nodes[i]);
  514. }
  515. result = result.concat(data.getNodesByParam(setting, nodes[i][childKey], key, value));
  516. }
  517. return result;
  518. },
  519. getNodesByParamFuzzy: function (setting, nodes, key, value) {
  520. if (!nodes || !key) return [];
  521. var childKey = setting.data.key.children,
  522. result = [];
  523. value = value.toLowerCase();
  524. for (var i = 0, l = nodes.length; i < l; i++) {
  525. if (typeof nodes[i][key] == "string" && nodes[i][key].toLowerCase().indexOf(value) > -1) {
  526. result.push(nodes[i]);
  527. }
  528. result = result.concat(data.getNodesByParamFuzzy(setting, nodes[i][childKey], key, value));
  529. }
  530. return result;
  531. },
  532. getNodesByFilter: function (setting, nodes, filter, isSingle, invokeParam) {
  533. if (!nodes) return (isSingle ? null : []);
  534. var childKey = setting.data.key.children,
  535. result = isSingle ? null : [];
  536. for (var i = 0, l = nodes.length; i < l; i++) {
  537. if (tools.apply(filter, [nodes[i], invokeParam], false)) {
  538. if (isSingle) {
  539. return nodes[i];
  540. }
  541. result.push(nodes[i]);
  542. }
  543. var tmpResult = data.getNodesByFilter(setting, nodes[i][childKey], filter, isSingle, invokeParam);
  544. if (isSingle && !!tmpResult) {
  545. return tmpResult;
  546. }
  547. result = isSingle ? tmpResult : result.concat(tmpResult);
  548. }
  549. return result;
  550. },
  551. getPreNode: function (setting, node) {
  552. if (!node) return null;
  553. var childKey = setting.data.key.children,
  554. p = node.parentTId ? node.getParentNode() : data.getRoot(setting);
  555. for (var i = 0, l = p[childKey].length; i < l; i++) {
  556. if (p[childKey][i] === node) {
  557. return (i == 0 ? null : p[childKey][i - 1]);
  558. }
  559. }
  560. return null;
  561. },
  562. getRoot: function (setting) {
  563. return setting ? roots[setting.treeId] : null;
  564. },
  565. getRoots: function () {
  566. return roots;
  567. },
  568. getSetting: function (treeId) {
  569. return settings[treeId];
  570. },
  571. getSettings: function () {
  572. return settings;
  573. },
  574. getZTreeTools: function (treeId) {
  575. var r = this.getRoot(this.getSetting(treeId));
  576. return r ? r.treeTools : null;
  577. },
  578. initCache: function (setting) {
  579. for (var i = 0, j = _init.caches.length; i < j; i++) {
  580. _init.caches[i].apply(this, arguments);
  581. }
  582. },
  583. initNode: function (setting, level, node, parentNode, preNode, nextNode) {
  584. for (var i = 0, j = _init.nodes.length; i < j; i++) {
  585. _init.nodes[i].apply(this, arguments);
  586. }
  587. },
  588. initRoot: function (setting) {
  589. for (var i = 0, j = _init.roots.length; i < j; i++) {
  590. _init.roots[i].apply(this, arguments);
  591. }
  592. },
  593. isSelectedNode: function (setting, node) {
  594. var root = data.getRoot(setting);
  595. for (var i = 0, j = root.curSelectedList.length; i < j; i++) {
  596. if (node === root.curSelectedList[i]) return true;
  597. }
  598. return false;
  599. },
  600. removeNodeCache: function (setting, node) {
  601. var childKey = setting.data.key.children;
  602. if (node[childKey]) {
  603. for (var i = 0, l = node[childKey].length; i < l; i++) {
  604. data.removeNodeCache(setting, node[childKey][i]);
  605. }
  606. }
  607. data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = null;
  608. },
  609. removeSelectedNode: function (setting, node) {
  610. var root = data.getRoot(setting);
  611. for (var i = 0, j = root.curSelectedList.length; i < j; i++) {
  612. if (node === root.curSelectedList[i] || !data.getNodeCache(setting, root.curSelectedList[i].tId)) {
  613. root.curSelectedList.splice(i, 1);
  614. setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, node]);
  615. i--;
  616. j--;
  617. }
  618. }
  619. },
  620. setCache: function (setting, cache) {
  621. caches[setting.treeId] = cache;
  622. },
  623. setRoot: function (setting, root) {
  624. roots[setting.treeId] = root;
  625. },
  626. setZTreeTools: function (setting, zTreeTools) {
  627. for (var i = 0, j = _init.zTreeTools.length; i < j; i++) {
  628. _init.zTreeTools[i].apply(this, arguments);
  629. }
  630. },
  631. transformToArrayFormat: function (setting, nodes) {
  632. if (!nodes) return [];
  633. var childKey = setting.data.key.children,
  634. r = [];
  635. if (tools.isArray(nodes)) {
  636. for (var i = 0, l = nodes.length; i < l; i++) {
  637. r.push(nodes[i]);
  638. if (nodes[i][childKey])
  639. r = r.concat(data.transformToArrayFormat(setting, nodes[i][childKey]));
  640. }
  641. } else {
  642. r.push(nodes);
  643. if (nodes[childKey])
  644. r = r.concat(data.transformToArrayFormat(setting, nodes[childKey]));
  645. }
  646. return r;
  647. },
  648. transformTozTreeFormat: function (setting, sNodes) {
  649. var i, l,
  650. key = setting.data.simpleData.idKey,
  651. parentKey = setting.data.simpleData.pIdKey,
  652. childKey = setting.data.key.children;
  653. if (!key || key == "" || !sNodes) return [];
  654. if (tools.isArray(sNodes)) {
  655. var r = [];
  656. var tmpMap = {};
  657. for (i = 0, l = sNodes.length; i < l; i++) {
  658. tmpMap[sNodes[i][key]] = sNodes[i];
  659. }
  660. for (i = 0, l = sNodes.length; i < l; i++) {
  661. if (tmpMap[sNodes[i][parentKey]] && sNodes[i][key] != sNodes[i][parentKey]) {
  662. if (!tmpMap[sNodes[i][parentKey]][childKey])
  663. tmpMap[sNodes[i][parentKey]][childKey] = [];
  664. tmpMap[sNodes[i][parentKey]][childKey].push(sNodes[i]);
  665. } else {
  666. r.push(sNodes[i]);
  667. }
  668. }
  669. return r;
  670. } else {
  671. return [sNodes];
  672. }
  673. }
  674. },
  675. //method of event proxy
  676. event = {
  677. bindEvent: function (setting) {
  678. for (var i = 0, j = _init.bind.length; i < j; i++) {
  679. _init.bind[i].apply(this, arguments);
  680. }
  681. },
  682. unbindEvent: function (setting) {
  683. for (var i = 0, j = _init.unbind.length; i < j; i++) {
  684. _init.unbind[i].apply(this, arguments);
  685. }
  686. },
  687. bindTree: function (setting) {
  688. var eventParam = {
  689. treeId: setting.treeId
  690. },
  691. o = setting.treeObj;
  692. if (!setting.view.txtSelectedEnable) {
  693. // for can't select text
  694. o.bind('selectstart', handler.onSelectStart).css({
  695. "-moz-user-select": "-moz-none"
  696. });
  697. }
  698. o.bind('click', eventParam, event.proxy);
  699. o.bind('dblclick', eventParam, event.proxy);
  700. o.bind('mouseover', eventParam, event.proxy);
  701. o.bind('mouseout', eventParam, event.proxy);
  702. o.bind('mousedown', eventParam, event.proxy);
  703. o.bind('mouseup', eventParam, event.proxy);
  704. o.bind('contextmenu', eventParam, event.proxy);
  705. },
  706. unbindTree: function (setting) {
  707. var o = setting.treeObj;
  708. o.unbind('selectstart', handler.onSelectStart)
  709. .unbind('click', event.proxy)
  710. .unbind('dblclick', event.proxy)
  711. .unbind('mouseover', event.proxy)
  712. .unbind('mouseout', event.proxy)
  713. .unbind('mousedown', event.proxy)
  714. .unbind('mouseup', event.proxy)
  715. .unbind('contextmenu', event.proxy);
  716. },
  717. doProxy: function (e) {
  718. var results = [];
  719. for (var i = 0, j = _init.proxys.length; i < j; i++) {
  720. var proxyResult = _init.proxys[i].apply(this, arguments);
  721. results.push(proxyResult);
  722. if (proxyResult.stop) {
  723. break;
  724. }
  725. }
  726. return results;
  727. },
  728. proxy: function (e) {
  729. var setting = data.getSetting(e.data.treeId);
  730. if (!tools.uCanDo(setting, e)) return true;
  731. var results = event.doProxy(e),
  732. r = true, x = false;
  733. for (var i = 0, l = results.length; i < l; i++) {
  734. var proxyResult = results[i];
  735. if (proxyResult.nodeEventCallback) {
  736. x = true;
  737. r = proxyResult.nodeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r;
  738. }
  739. if (proxyResult.treeEventCallback) {
  740. x = true;
  741. r = proxyResult.treeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r;
  742. }
  743. }
  744. return r;
  745. }
  746. },
  747. //method of event handler
  748. handler = {
  749. onSwitchNode: function (event, node) {
  750. var setting = data.getSetting(event.data.treeId);
  751. if (node.open) {
  752. if (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false) return true;
  753. data.getRoot(setting).expandTriggerFlag = true;
  754. view.switchNode(setting, node);
  755. } else {
  756. if (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false) return true;
  757. data.getRoot(setting).expandTriggerFlag = true;
  758. view.switchNode(setting, node);
  759. }
  760. return true;
  761. },
  762. onClickNode: function (event, node) {
  763. var setting = data.getSetting(event.data.treeId),
  764. clickFlag = ( (setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey)) && data.isSelectedNode(setting, node)) ? 0 : (setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey) && setting.view.selectedMulti) ? 2 : 1;
  765. if (tools.apply(setting.callback.beforeClick, [setting.treeId, node, clickFlag], true) == false) return true;
  766. if (clickFlag === 0) {
  767. view.cancelPreSelectedNode(setting, node);
  768. } else {
  769. view.selectNode(setting, node, clickFlag === 2);
  770. }
  771. setting.treeObj.trigger(consts.event.CLICK, [event, setting.treeId, node, clickFlag]);
  772. return true;
  773. },
  774. onZTreeMousedown: function (event, node) {
  775. var setting = data.getSetting(event.data.treeId);
  776. if (tools.apply(setting.callback.beforeMouseDown, [setting.treeId, node], true)) {
  777. tools.apply(setting.callback.onMouseDown, [event, setting.treeId, node]);
  778. }
  779. return true;
  780. },
  781. onZTreeMouseup: function (event, node) {
  782. var setting = data.getSetting(event.data.treeId);
  783. if (tools.apply(setting.callback.beforeMouseUp, [setting.treeId, node], true)) {
  784. tools.apply(setting.callback.onMouseUp, [event, setting.treeId, node]);
  785. }
  786. return true;
  787. },
  788. onZTreeDblclick: function (event, node) {
  789. var setting = data.getSetting(event.data.treeId);
  790. if (tools.apply(setting.callback.beforeDblClick, [setting.treeId, node], true)) {
  791. tools.apply(setting.callback.onDblClick, [event, setting.treeId, node]);
  792. }
  793. return true;
  794. },
  795. onZTreeContextmenu: function (event, node) {
  796. var setting = data.getSetting(event.data.treeId);
  797. if (tools.apply(setting.callback.beforeRightClick, [setting.treeId, node], true)) {
  798. tools.apply(setting.callback.onRightClick, [event, setting.treeId, node]);
  799. }
  800. return (typeof setting.callback.onRightClick) != "function";
  801. },
  802. onSelectStart: function (e) {
  803. var n = e.originalEvent.srcElement.nodeName.toLowerCase();
  804. return (n === "input" || n === "textarea" );
  805. }
  806. },
  807. //method of tools for zTree
  808. tools = {
  809. apply: function (fun, param, defaultValue) {
  810. if ((typeof fun) == "function") {
  811. return fun.apply(zt, param ? param : []);
  812. }
  813. return defaultValue;
  814. },
  815. canAsync: function (setting, node) {
  816. var childKey = setting.data.key.children;
  817. return (setting.async.enable && node && node.isParent && !(node.zAsync || (node[childKey] && node[childKey].length > 0)));
  818. },
  819. clone: function (obj) {
  820. if (obj === null) return null;
  821. var o = tools.isArray(obj) ? [] : {};
  822. for (var i in obj) {
  823. o[i] = (obj[i] instanceof Date) ? new Date(obj[i].getTime()) : (typeof obj[i] === "object" ? tools.clone(obj[i]) : obj[i]);
  824. }
  825. return o;
  826. },
  827. eqs: function (str1, str2) {
  828. return str1.toLowerCase() === str2.toLowerCase();
  829. },
  830. isArray: function (arr) {
  831. return Object.prototype.toString.apply(arr) === "[object Array]";
  832. },
  833. isElement: function (o) {
  834. return (
  835. typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
  836. o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string"
  837. );
  838. },
  839. $: function (node, exp, setting) {
  840. if (!!exp && typeof exp != "string") {
  841. setting = exp;
  842. exp = "";
  843. }
  844. if (typeof node == "string") {
  845. return $(node, setting ? setting.treeObj.get(0).ownerDocument : null);
  846. } else {
  847. return $("#" + node.tId + exp, setting ? setting.treeObj : null);
  848. }
  849. },
  850. getMDom: function (setting, curDom, targetExpr) {
  851. if (!curDom) return null;
  852. while (curDom && curDom.id !== setting.treeId) {
  853. for (var i = 0, l = targetExpr.length; curDom.tagName && i < l; i++) {
  854. if (tools.eqs(curDom.tagName, targetExpr[i].tagName) && curDom.getAttribute(targetExpr[i].attrName) !== null) {
  855. return curDom;
  856. }
  857. }
  858. curDom = curDom.parentNode;
  859. }
  860. return null;
  861. },
  862. getNodeMainDom: function (target) {
  863. return ($(target).parent("li").get(0) || $(target).parentsUntil("li").parent().get(0));
  864. },
  865. isChildOrSelf: function (dom, parentId) {
  866. return ( $(dom).closest("#" + parentId).length > 0 );
  867. },
  868. uCanDo: function (setting, e) {
  869. return true;
  870. }
  871. },
  872. //method of operate ztree dom
  873. view = {
  874. addNodes: function (setting, parentNode, index, newNodes, isSilent) {
  875. if (setting.data.keep.leaf && parentNode && !parentNode.isParent) {
  876. return;
  877. }
  878. if (!tools.isArray(newNodes)) {
  879. newNodes = [newNodes];
  880. }
  881. if (setting.data.simpleData.enable) {
  882. newNodes = data.transformTozTreeFormat(setting, newNodes);
  883. }
  884. if (parentNode) {
  885. var target_switchObj = $$(parentNode, consts.id.SWITCH, setting),
  886. target_icoObj = $$(parentNode, consts.id.ICON, setting),
  887. target_ulObj = $$(parentNode, consts.id.UL, setting);
  888. if (!parentNode.open) {
  889. view.replaceSwitchClass(parentNode, target_switchObj, consts.folder.CLOSE);
  890. view.replaceIcoClass(parentNode, target_icoObj, consts.folder.CLOSE);
  891. parentNode.open = false;
  892. target_ulObj.css({
  893. "display": "none"
  894. });
  895. }
  896. data.addNodesData(setting, parentNode, index, newNodes);
  897. view.createNodes(setting, parentNode.level + 1, newNodes, parentNode, index);
  898. if (!isSilent) {
  899. view.expandCollapseParentNode(setting, parentNode, true);
  900. }
  901. } else {
  902. data.addNodesData(setting, data.getRoot(setting), index, newNodes);
  903. view.createNodes(setting, 0, newNodes, null, index);
  904. }
  905. },
  906. appendNodes: function (setting, level, nodes, parentNode, index, initFlag, openFlag) {
  907. if (!nodes) return [];
  908. var html = [],
  909. childKey = setting.data.key.children;
  910. var tmpPNode = (parentNode) ? parentNode : data.getRoot(setting),
  911. tmpPChild = tmpPNode[childKey],
  912. isFirstNode, isLastNode;
  913. if (!tmpPChild || index >= tmpPChild.length - nodes.length) {
  914. index = -1;
  915. }
  916. for (var i = 0, l = nodes.length; i < l; i++) {
  917. var node = nodes[i];
  918. if (initFlag) {
  919. isFirstNode = ((index === 0 || tmpPChild.length == nodes.length) && (i == 0));
  920. isLastNode = (index < 0 && i == (nodes.length - 1));
  921. data.initNode(setting, level, node, parentNode, isFirstNode, isLastNode, openFlag);
  922. data.addNodeCache(setting, node);
  923. }
  924. var childHtml = [];
  925. if (node[childKey] && node[childKey].length > 0) {
  926. //make child html first, because checkType
  927. childHtml = view.appendNodes(setting, level + 1, node[childKey], node, -1, initFlag, openFlag && node.open);
  928. }
  929. if (openFlag) {
  930. view.makeDOMNodeMainBefore(html, setting, node);
  931. view.makeDOMNodeLine(html, setting, node);
  932. data.getBeforeA(setting, node, html);
  933. view.makeDOMNodeNameBefore(html, setting, node);
  934. data.getInnerBeforeA(setting, node, html);
  935. view.makeDOMNodeIcon(html, setting, node);
  936. data.getInnerAfterA(setting, node, html);
  937. view.makeDOMNodeNameAfter(html, setting, node);
  938. data.getAfterA(setting, node, html);
  939. if (node.isParent && node.open) {
  940. view.makeUlHtml(setting, node, html, childHtml.join(''));
  941. }
  942. view.makeDOMNodeMainAfter(html, setting, node);
  943. data.addCreatedNode(setting, node);
  944. }
  945. }
  946. return html;
  947. },
  948. appendParentULDom: function (setting, node) {
  949. var html = [],
  950. nObj = $$(node, setting);
  951. if (!nObj.get(0) && !!node.parentTId) {
  952. view.appendParentULDom(setting, node.getParentNode());
  953. nObj = $$(node, setting);
  954. }
  955. var ulObj = $$(node, consts.id.UL, setting);
  956. if (ulObj.get(0)) {
  957. ulObj.remove();
  958. }
  959. var childKey = setting.data.key.children,
  960. childHtml = view.appendNodes(setting, node.level + 1, node[childKey], node, -1, false, true);
  961. view.makeUlHtml(setting, node, html, childHtml.join(''));
  962. nObj.append(html.join(''));
  963. },
  964. asyncNode: function (setting, node, isSilent, callback) {
  965. var i, l;
  966. if (node && !node.isParent) {
  967. tools.apply(callback);
  968. return false;
  969. } else if (node && node.isAjaxing) {
  970. return false;
  971. } else if (tools.apply(setting.callback.beforeAsync, [setting.treeId, node], true) == false) {
  972. tools.apply(callback);
  973. return false;
  974. }
  975. if (node) {
  976. node.isAjaxing = true;
  977. var icoObj = $$(node, consts.id.ICON, setting);
  978. icoObj.attr({"style": "", "class": consts.className.BUTTON + " " + consts.className.ICO_LOADING});
  979. }
  980. var tmpParam = {};
  981. for (i = 0, l = setting.async.autoParam.length; node && i < l; i++) {
  982. var pKey = setting.async.autoParam[i].split("="), spKey = pKey;
  983. if (pKey.length > 1) {
  984. spKey = pKey[1];
  985. pKey = pKey[0];
  986. }
  987. tmpParam[spKey] = node[pKey];
  988. }
  989. if (tools.isArray(setting.async.otherParam)) {
  990. for (i = 0, l = setting.async.otherParam.length; i < l; i += 2) {
  991. tmpParam[setting.async.otherParam[i]] = setting.async.otherParam[i + 1];
  992. }
  993. } else {
  994. for (var p in setting.async.otherParam) {
  995. tmpParam[p] = setting.async.otherParam[p];
  996. }
  997. }
  998. var _tmpV = data.getRoot(setting)._ver;
  999. $.ajax({
  1000. contentType: setting.async.contentType,
  1001. cache: false,
  1002. type: setting.async.type,
  1003. url: tools.apply(setting.async.url, [setting.treeId, node], setting.async.url),
  1004. data: setting.async.contentType.indexOf('application/json') > -1 ? JSON.stringify(tmpParam) : tmpParam,
  1005. dataType: setting.async.dataType,
  1006. success: function (msg) {
  1007. if (_tmpV != data.getRoot(setting)._ver) {
  1008. return;
  1009. }
  1010. var newNodes = [];
  1011. try {
  1012. if (!msg || msg.length == 0) {
  1013. newNodes = [];
  1014. } else if (typeof msg == "string") {
  1015. newNodes = eval("(" + msg + ")");
  1016. } else {
  1017. newNodes = msg;
  1018. }
  1019. } catch (err) {
  1020. newNodes = msg;
  1021. }
  1022. if (node) {
  1023. node.isAjaxing = null;
  1024. node.zAsync = true;
  1025. }
  1026. view.setNodeLineIcos(setting, node);
  1027. if (newNodes && newNodes !== "") {
  1028. newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes);
  1029. view.addNodes(setting, node, -1, !!newNodes ? tools.clone(newNodes) : [], !!isSilent);
  1030. } else {
  1031. view.addNodes(setting, node, -1, [], !!isSilent);
  1032. }
  1033. setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, msg]);
  1034. tools.apply(callback);
  1035. },
  1036. error: function (XMLHttpRequest, textStatus, errorThrown) {
  1037. if (_tmpV != data.getRoot(setting)._ver) {
  1038. return;
  1039. }
  1040. if (node) node.isAjaxing = null;
  1041. view.setNodeLineIcos(setting, node);
  1042. setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]);
  1043. }
  1044. });
  1045. return true;
  1046. },
  1047. cancelPreSelectedNode: function (setting, node, excludeNode) {
  1048. var list = data.getRoot(setting).curSelectedList,
  1049. i, n;
  1050. for (i = list.length - 1; i >= 0; i--) {
  1051. n = list[i];
  1052. if (node === n || (!node && (!excludeNode || excludeNode !== n))) {
  1053. $$(n, consts.id.A, setting).removeClass(consts.node.CURSELECTED);
  1054. if (node) {
  1055. data.removeSelectedNode(setting, node);
  1056. break;
  1057. } else {
  1058. list.splice(i, 1);
  1059. setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, n]);
  1060. }
  1061. }
  1062. }
  1063. },
  1064. createNodeCallback: function (setting) {
  1065. if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) {
  1066. var root = data.getRoot(setting);
  1067. while (root.createdNodes.length > 0) {
  1068. var node = root.createdNodes.shift();
  1069. tools.apply(setting.view.addDiyDom, [setting.treeId, node]);
  1070. if (!!setting.callback.onNodeCreated) {
  1071. setting.treeObj.trigger(consts.event.NODECREATED, [setting.treeId, node]);
  1072. }
  1073. }
  1074. }
  1075. },
  1076. createNodes: function (setting, level, nodes, parentNode, index) {
  1077. if (!nodes || nodes.length == 0) return;
  1078. var root = data.getRoot(setting),
  1079. childKey = setting.data.key.children,
  1080. openFlag = !parentNode || parentNode.open || !!$$(parentNode[childKey][0], setting).get(0);
  1081. root.createdNodes = [];
  1082. var zTreeHtml = view.appendNodes(setting, level, nodes, parentNode, index, true, openFlag),
  1083. parentObj, nextObj;
  1084. if (!parentNode) {
  1085. parentObj = setting.treeObj;
  1086. //setting.treeObj.append(zTreeHtml.join(''));
  1087. } else {
  1088. var ulObj = $$(parentNode, consts.id.UL, setting);
  1089. if (ulObj.get(0)) {
  1090. parentObj = ulObj;
  1091. //ulObj.append(zTreeHtml.join(''));
  1092. }
  1093. }
  1094. if (parentObj) {
  1095. if (index >= 0) {
  1096. nextObj = parentObj.children()[index];
  1097. }
  1098. if (index >= 0 && nextObj) {
  1099. $(nextObj).before(zTreeHtml.join(''));
  1100. } else {
  1101. parentObj.append(zTreeHtml.join(''));
  1102. }
  1103. }
  1104. view.createNodeCallback(setting);
  1105. },
  1106. destroy: function (setting) {
  1107. if (!setting) return;
  1108. data.initCache(setting);
  1109. data.initRoot(setting);
  1110. event.unbindTree(setting);
  1111. event.unbindEvent(setting);
  1112. setting.treeObj.empty();
  1113. delete settings[setting.treeId];
  1114. },
  1115. expandCollapseNode: function (setting, node, expandFlag, animateFlag, callback) {
  1116. var root = data.getRoot(setting),
  1117. childKey = setting.data.key.children;
  1118. var tmpCb, _callback;
  1119. if (!node) {
  1120. tools.apply(callback, []);
  1121. return;
  1122. }
  1123. if (root.expandTriggerFlag) {
  1124. _callback = callback;
  1125. tmpCb = function () {
  1126. if (_callback) _callback();
  1127. if (node.open) {
  1128. setting.treeObj.trigger(consts.event.EXPAND, [setting.treeId, node]);
  1129. } else {
  1130. setting.treeObj.trigger(consts.event.COLLAPSE, [setting.treeId, node]);
  1131. }
  1132. };
  1133. callback = tmpCb;
  1134. root.expandTriggerFlag = false;
  1135. }
  1136. if (!node.open && node.isParent && ((!$$(node, consts.id.UL, setting).get(0)) || (node[childKey] && node[childKey].length > 0 && !$$(node[childKey][0], setting).get(0)))) {
  1137. view.appendParentULDom(setting, node);
  1138. view.createNodeCallback(setting);
  1139. }
  1140. if (node.open == expandFlag) {
  1141. tools.apply(callback, []);
  1142. return;
  1143. }
  1144. var ulObj = $$(node, consts.id.UL, setting),
  1145. switchObj = $$(node, consts.id.SWITCH, setting),
  1146. icoObj = $$(node, consts.id.ICON, setting);
  1147. if (node.isParent) {
  1148. node.open = !node.open;
  1149. if (node.iconOpen && node.iconClose) {
  1150. icoObj.attr("style", view.makeNodeIcoStyle(setting, node));
  1151. }
  1152. if (node.open) {
  1153. view.replaceSwitchClass(node, switchObj, consts.folder.OPEN);
  1154. view.replaceIcoClass(node, icoObj, consts.folder.OPEN);
  1155. if (animateFlag == false || setting.view.expandSpeed == "") {
  1156. ulObj.show();
  1157. tools.apply(callback, []);
  1158. } else {
  1159. if (node[childKey] && node[childKey].length > 0) {
  1160. ulObj.slideDown(setting.view.expandSpeed, callback);
  1161. } else {
  1162. ulObj.show();
  1163. tools.apply(callback, []);
  1164. }
  1165. }
  1166. } else {
  1167. view.replaceSwitchClass(node, switchObj, consts.folder.CLOSE);
  1168. view.replaceIcoClass(node, icoObj, consts.folder.CLOSE);
  1169. if (animateFlag == false || setting.view.expandSpeed == "" || !(node[childKey] && node[childKey].length > 0)) {
  1170. ulObj.hide();
  1171. tools.apply(callback, []);
  1172. } else {
  1173. ulObj.slideUp(setting.view.expandSpeed, callback);
  1174. }
  1175. }
  1176. } else {
  1177. tools.apply(callback, []);
  1178. }
  1179. },
  1180. expandCollapseParentNode: function (setting, node, expandFlag, animateFlag, callback) {
  1181. if (!node) return;
  1182. if (!node.parentTId) {
  1183. view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback);
  1184. return;
  1185. } else {
  1186. view.expandCollapseNode(setting, node, expandFlag, animateFlag);
  1187. }
  1188. if (node.parentTId) {
  1189. view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, animateFlag, callback);
  1190. }
  1191. },
  1192. expandCollapseSonNode: function (setting, node, expandFlag, animateFlag, callback) {
  1193. var root = data.getRoot(setting),
  1194. childKey = setting.data.key.children,
  1195. treeNodes = (node) ? node[childKey] : root[childKey],
  1196. selfAnimateSign = (node) ? false : animateFlag,
  1197. expandTriggerFlag = data.getRoot(setting).expandTriggerFlag;
  1198. data.getRoot(setting).expandTriggerFlag = false;
  1199. if (treeNodes) {
  1200. for (var i = 0, l = treeNodes.length; i < l; i++) {
  1201. if (treeNodes[i]) view.expandCollapseSonNode(setting, treeNodes[i], expandFlag, selfAnimateSign);
  1202. }
  1203. }
  1204. data.getRoot(setting).expandTriggerFlag = expandTriggerFlag;
  1205. view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback);
  1206. },
  1207. isSelectedNode: function (setting, node) {
  1208. if (!node) {
  1209. return false;
  1210. }
  1211. var list = data.getRoot(setting).curSelectedList,
  1212. i;
  1213. for (i = list.length - 1; i >= 0; i--) {
  1214. if (node === list[i]) {
  1215. return true;
  1216. }
  1217. }
  1218. return false;
  1219. },
  1220. makeDOMNodeIcon: function (html, setting, node) {
  1221. var nameStr = data.getNodeName(setting, node),
  1222. name = setting.view.nameIsHTML ? nameStr : nameStr.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
  1223. html.push("<span id='", node.tId, consts.id.ICON,
  1224. "' title='' treeNode", consts.id.ICON, " class='", view.makeNodeIcoClass(setting, node),
  1225. "' style='", view.makeNodeIcoStyle(setting, node), "'></span><span id='", node.tId, consts.id.SPAN,
  1226. "' class='", consts.className.NAME,
  1227. "'>", name, "</span>");
  1228. },
  1229. makeDOMNodeLine: function (html, setting, node) {
  1230. html.push("<span id='", node.tId, consts.id.SWITCH, "' title='' class='", view.makeNodeLineClass(setting, node), "' treeNode", consts.id.SWITCH, "></span>");
  1231. },
  1232. makeDOMNodeMainAfter: function (html, setting, node) {
  1233. html.push("</li>");
  1234. },
  1235. makeDOMNodeMainBefore: function (html, setting, node) {
  1236. html.push("<li id='", node.tId, "' class='", consts.className.LEVEL, node.level, "' tabindex='0' hidefocus='true' treenode>");
  1237. },
  1238. makeDOMNodeNameAfter: function (html, setting, node) {
  1239. html.push("</a>");
  1240. },
  1241. makeDOMNodeNameBefore: function (html, setting, node) {
  1242. var title = data.getNodeTitle(setting, node),
  1243. url = view.makeNodeUrl(setting, node),
  1244. fontcss = view.makeNodeFontCss(setting, node),
  1245. fontStyle = [];
  1246. for (var f in fontcss) {
  1247. fontStyle.push(f, ":", fontcss[f], ";");
  1248. }
  1249. html.push("<a id='", node.tId, consts.id.A, "' class='", consts.className.LEVEL, node.level, "' treeNode", consts.id.A, " onclick=\"", (node.click || ''),
  1250. "\" ", ((url != null && url.length > 0) ? "href='" + url + "'" : ""), " target='", view.makeNodeTarget(node), "' style='", fontStyle.join(''),
  1251. "'");
  1252. if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle) && title) {
  1253. html.push("title='", title.replace(/'/g, "&#39;").replace(/</g, '&lt;').replace(/>/g, '&gt;'), "'");
  1254. }
  1255. html.push(">");
  1256. },
  1257. makeNodeFontCss: function (setting, node) {
  1258. var fontCss = tools.apply(setting.view.fontCss, [setting.treeId, node], setting.view.fontCss);
  1259. return (fontCss && ((typeof fontCss) != "function")) ? fontCss : {};
  1260. },
  1261. makeNodeIcoClass: function (setting, node) {
  1262. var icoCss = ["ico"];
  1263. if (!node.isAjaxing) {
  1264. icoCss[0] = (node.iconSkin ? node.iconSkin + "_" : "") + icoCss[0];
  1265. if (node.isParent) {
  1266. icoCss.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE);
  1267. } else {
  1268. icoCss.push(consts.folder.DOCU);
  1269. }
  1270. }
  1271. return consts.className.BUTTON + " " + icoCss.join('_');
  1272. },
  1273. makeNodeIcoStyle: function (setting, node) {
  1274. var icoStyle = [];
  1275. if (!node.isAjaxing) {
  1276. var icon = (node.isParent && node.iconOpen && node.iconClose) ? (node.open ? node.iconOpen : node.iconClose) : node[setting.data.key.icon];
  1277. if (icon) icoStyle.push("background:url(", icon, ") 0 0 no-repeat;");
  1278. if (setting.view.showIcon == false || !tools.apply(setting.view.showIcon, [setting.treeId, node], true)) {
  1279. icoStyle.push("width:0px;height:0px;");
  1280. }
  1281. }
  1282. return icoStyle.join('');
  1283. },
  1284. makeNodeLineClass: function (setting, node) {
  1285. var lineClass = [];
  1286. if (setting.view.showLine) {
  1287. if (node.level == 0 && node.isFirstNode && node.isLastNode) {
  1288. lineClass.push(consts.line.ROOT);
  1289. } else if (node.level == 0 && node.isFirstNode) {
  1290. lineClass.push(consts.line.ROOTS);
  1291. } else if (node.isLastNode) {
  1292. lineClass.push(consts.line.BOTTOM);
  1293. } else {
  1294. lineClass.push(consts.line.CENTER);
  1295. }
  1296. } else {
  1297. lineClass.push(consts.line.NOLINE);
  1298. }
  1299. if (node.isParent) {
  1300. lineClass.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE);
  1301. } else {
  1302. lineClass.push(consts.folder.DOCU);
  1303. }
  1304. return view.makeNodeLineClassEx(node) + lineClass.join('_');
  1305. },
  1306. makeNodeLineClassEx: function (node) {
  1307. return consts.className.BUTTON + " " + consts.className.LEVEL + node.level + " " + consts.className.SWITCH + " ";
  1308. },
  1309. makeNodeTarget: function (node) {
  1310. return (node.target || "_blank");
  1311. },
  1312. makeNodeUrl: function (setting, node) {
  1313. var urlKey = setting.data.key.url;
  1314. return node[urlKey] ? node[urlKey] : null;
  1315. },
  1316. makeUlHtml: function (setting, node, html, content) {
  1317. html.push("<ul id='", node.tId, consts.id.UL, "' class='", consts.className.LEVEL, node.level, " ", view.makeUlLineClass(setting, node), "' style='display:", (node.open ? "block" : "none"), "'>");
  1318. html.push(content);
  1319. html.push("</ul>");
  1320. },
  1321. makeUlLineClass: function (setting, node) {
  1322. return ((setting.view.showLine && !node.isLastNode) ? consts.line.LINE : "");
  1323. },
  1324. removeChildNodes: function (setting, node) {
  1325. if (!node) return;
  1326. var childKey = setting.data.key.children,
  1327. nodes = node[childKey];
  1328. if (!nodes) return;
  1329. for (var i = 0, l = nodes.length; i < l; i++) {
  1330. data.removeNodeCache(setting, nodes[i]);
  1331. }
  1332. data.removeSelectedNode(setting);
  1333. delete node[childKey];
  1334. if (!setting.data.keep.parent) {
  1335. node.isParent = false;
  1336. node.open = false;
  1337. var tmp_switchObj = $$(node, consts.id.SWITCH, setting),
  1338. tmp_icoObj = $$(node, consts.id.ICON, setting);
  1339. view.replaceSwitchClass(node, tmp_switchObj, consts.folder.DOCU);
  1340. view.replaceIcoClass(node, tmp_icoObj, consts.folder.DOCU);
  1341. $$(node, consts.id.UL, setting).remove();
  1342. } else {
  1343. $$(node, consts.id.UL, setting).empty();
  1344. }
  1345. },
  1346. scrollIntoView: function (dom) {
  1347. if (!dom) {
  1348. return;
  1349. }
  1350. // code src: http://jsfiddle.net/08u6cxwj/
  1351. if (!Element.prototype.scrollIntoViewIfNeeded) {
  1352. Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) {
  1353. function withinBounds(value, min, max, extent) {
  1354. if (false === centerIfNeeded || max <= value + extent && value <= min + extent) {
  1355. return Math.min(max, Math.max(min, value));
  1356. } else {
  1357. return (min + max) / 2;
  1358. }
  1359. }
  1360. function makeArea(left, top, width, height) {
  1361. return {
  1362. "left": left, "top": top, "width": width, "height": height
  1363. , "right": left + width, "bottom": top + height
  1364. , "translate": function (x, y) {
  1365. return makeArea(x + left, y + top, width, height);
  1366. }
  1367. , "relativeFromTo": function (lhs, rhs) {
  1368. var newLeft = left, newTop = top;
  1369. lhs = lhs.offsetParent;
  1370. rhs = rhs.offsetParent;
  1371. if (lhs === rhs) {
  1372. return area;
  1373. }
  1374. for (; lhs; lhs = lhs.offsetParent) {
  1375. newLeft += lhs.offsetLeft + lhs.clientLeft;
  1376. newTop += lhs.offsetTop + lhs.clientTop;
  1377. }
  1378. for (; rhs; rhs = rhs.offsetParent) {
  1379. newLeft -= rhs.offsetLeft + rhs.clientLeft;
  1380. newTop -= rhs.offsetTop + rhs.clientTop;
  1381. }
  1382. return makeArea(newLeft, newTop, width, height);
  1383. }
  1384. };
  1385. }
  1386. var parent, elem = this, area = makeArea(
  1387. this.offsetLeft, this.offsetTop,
  1388. this.offsetWidth, this.offsetHeight);
  1389. while (tools.isElement(parent = elem.parentNode)) {
  1390. var clientLeft = parent.offsetLeft + parent.clientLeft;
  1391. var clientTop = parent.offsetTop + parent.clientTop;
  1392. // Make area relative to parent's client area.
  1393. area = area.relativeFromTo(elem, parent).translate(-clientLeft, -clientTop);
  1394. parent.scrollLeft = withinBounds(
  1395. parent.scrollLeft,
  1396. area.right - parent.clientWidth, area.left,
  1397. parent.clientWidth);
  1398. parent.scrollTop = withinBounds(
  1399. parent.scrollTop,
  1400. area.bottom - parent.clientHeight, area.top,
  1401. parent.clientHeight);
  1402. // Determine actual scroll amount by reading back scroll properties.
  1403. area = area.translate(clientLeft - parent.scrollLeft,
  1404. clientTop - parent.scrollTop);
  1405. elem = parent;
  1406. }
  1407. };
  1408. }
  1409. dom.scrollIntoViewIfNeeded();
  1410. },
  1411. setFirstNode: function (setting, parentNode) {
  1412. var childKey = setting.data.key.children, childLength = parentNode[childKey].length;
  1413. if (childLength > 0) {
  1414. parentNode[childKey][0].isFirstNode = true;
  1415. }
  1416. },
  1417. setLastNode: function (setting, parentNode) {
  1418. var childKey = setting.data.key.children, childLength = parentNode[childKey].length;
  1419. if (childLength > 0) {
  1420. parentNode[childKey][childLength - 1].isLastNode = true;
  1421. }
  1422. },
  1423. removeNode: function (setting, node) {
  1424. var root = data.getRoot(setting),
  1425. childKey = setting.data.key.children,
  1426. parentNode = (node.parentTId) ? node.getParentNode() : root;
  1427. node.isFirstNode = false;
  1428. node.isLastNode = false;
  1429. node.getPreNode = function () {
  1430. return null;
  1431. };
  1432. node.getNextNode = function () {
  1433. return null;
  1434. };
  1435. if (!data.getNodeCache(setting, node.tId)) {
  1436. return;
  1437. }
  1438. $$(node, setting).remove();
  1439. data.removeNodeCache(setting, node);
  1440. data.removeSelectedNode(setting, node);
  1441. for (var i = 0, l = parentNode[childKey].length; i < l; i++) {
  1442. if (parentNode[childKey][i].tId == node.tId) {
  1443. parentNode[childKey].splice(i, 1);
  1444. break;
  1445. }
  1446. }
  1447. view.setFirstNode(setting, parentNode);
  1448. view.setLastNode(setting, parentNode);
  1449. var tmp_ulObj, tmp_switchObj, tmp_icoObj,
  1450. childLength = parentNode[childKey].length;
  1451. //repair nodes old parent
  1452. if (!setting.data.keep.parent && childLength == 0) {
  1453. //old parentNode has no child nodes
  1454. parentNode.isParent = false;
  1455. parentNode.open = false;
  1456. tmp_ulObj = $$(parentNode, consts.id.UL, setting);
  1457. tmp_switchObj = $$(parentNode, consts.id.SWITCH, setting);
  1458. tmp_icoObj = $$(parentNode, consts.id.ICON, setting);
  1459. view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.DOCU);
  1460. view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.DOCU);
  1461. tmp_ulObj.css("display", "none");
  1462. } else if (setting.view.showLine && childLength > 0) {
  1463. //old parentNode has child nodes
  1464. var newLast = parentNode[childKey][childLength - 1];
  1465. tmp_ulObj = $$(newLast, consts.id.UL, setting);
  1466. tmp_switchObj = $$(newLast, consts.id.SWITCH, setting);
  1467. tmp_icoObj = $$(newLast, consts.id.ICON, setting);
  1468. if (parentNode == root) {
  1469. if (parentNode[childKey].length == 1) {
  1470. //node was root, and ztree has only one root after move node
  1471. view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.ROOT);
  1472. } else {
  1473. var tmp_first_switchObj = $$(parentNode[childKey][0], consts.id.SWITCH, setting);
  1474. view.replaceSwitchClass(parentNode[childKey][0], tmp_first_switchObj, consts.line.ROOTS);
  1475. view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM);
  1476. }
  1477. } else {
  1478. view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM);
  1479. }
  1480. tmp_ulObj.removeClass(consts.line.LINE);
  1481. }
  1482. },
  1483. replaceIcoClass: function (node, obj, newName) {
  1484. if (!obj || node.isAjaxing) return;
  1485. var tmpName = obj.attr("class");
  1486. if (tmpName == undefined) return;
  1487. var tmpList = tmpName.split("_");
  1488. switch (newName) {
  1489. case consts.folder.OPEN:
  1490. case consts.folder.CLOSE:
  1491. case consts.folder.DOCU:
  1492. tmpList[tmpList.length - 1] = newName;
  1493. break;
  1494. }
  1495. obj.attr("class", tmpList.join("_"));
  1496. },
  1497. replaceSwitchClass: function (node, obj, newName) {
  1498. if (!obj) return;
  1499. var tmpName = obj.attr("class");
  1500. if (tmpName == undefined) return;
  1501. var tmpList = tmpName.split("_");
  1502. switch (newName) {
  1503. case consts.line.ROOT:
  1504. case consts.line.ROOTS:
  1505. case consts.line.CENTER:
  1506. case consts.line.BOTTOM:
  1507. case consts.line.NOLINE:
  1508. tmpList[0] = view.makeNodeLineClassEx(node) + newName;
  1509. break;
  1510. case consts.folder.OPEN:
  1511. case consts.folder.CLOSE:
  1512. case consts.folder.DOCU:
  1513. tmpList[1] = newName;
  1514. break;
  1515. }
  1516. obj.attr("class", tmpList.join("_"));
  1517. if (newName !== consts.folder.DOCU) {
  1518. obj.removeAttr("disabled");
  1519. } else {
  1520. obj.attr("disabled", "disabled");
  1521. }
  1522. },
  1523. selectNode: function (setting, node, addFlag) {
  1524. if (!addFlag) {
  1525. view.cancelPreSelectedNode(setting, null, node);
  1526. }
  1527. $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED);
  1528. data.addSelectedNode(setting, node);
  1529. setting.treeObj.trigger(consts.event.SELECTED, [setting.treeId, node]);
  1530. },
  1531. setNodeFontCss: function (setting, treeNode) {
  1532. var aObj = $$(treeNode, consts.id.A, setting),
  1533. fontCss = view.makeNodeFontCss(setting, treeNode);
  1534. if (fontCss) {
  1535. aObj.css(fontCss);
  1536. }
  1537. },
  1538. setNodeLineIcos: function (setting, node) {
  1539. if (!node) return;
  1540. var switchObj = $$(node, consts.id.SWITCH, setting),
  1541. ulObj = $$(node, consts.id.UL, setting),
  1542. icoObj = $$(node, consts.id.ICON, setting),
  1543. ulLine = view.makeUlLineClass(setting, node);
  1544. if (ulLine.length == 0) {
  1545. ulObj.removeClass(consts.line.LINE);
  1546. } else {
  1547. ulObj.addClass(ulLine);
  1548. }
  1549. switchObj.attr("class", view.makeNodeLineClass(setting, node));
  1550. if (node.isParent) {
  1551. switchObj.removeAttr("disabled");
  1552. } else {
  1553. switchObj.attr("disabled", "disabled");
  1554. }
  1555. icoObj.removeAttr("style");
  1556. icoObj.attr("style", view.makeNodeIcoStyle(setting, node));
  1557. icoObj.attr("class", view.makeNodeIcoClass(setting, node));
  1558. },
  1559. setNodeName: function (setting, node) {
  1560. var title = data.getNodeTitle(setting, node),
  1561. nObj = $$(node, consts.id.SPAN, setting);
  1562. nObj.empty();
  1563. if (setting.view.nameIsHTML) {
  1564. nObj.html(data.getNodeName(setting, node));
  1565. } else {
  1566. nObj.text(data.getNodeName(setting, node));
  1567. }
  1568. if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle)) {
  1569. var aObj = $$(node, consts.id.A, setting);
  1570. aObj.attr("title", !title ? "" : title);
  1571. }
  1572. },
  1573. setNodeTarget: function (setting, node) {
  1574. var aObj = $$(node, consts.id.A, setting);
  1575. aObj.attr("target", view.makeNodeTarget(node));
  1576. },
  1577. setNodeUrl: function (setting, node) {
  1578. var aObj = $$(node, consts.id.A, setting),
  1579. url = view.makeNodeUrl(setting, node);
  1580. if (url == null || url.length == 0) {
  1581. aObj.removeAttr("href");
  1582. } else {
  1583. aObj.attr("href", url);
  1584. }
  1585. },
  1586. switchNode: function (setting, node) {
  1587. if (node.open || !tools.canAsync(setting, node)) {
  1588. view.expandCollapseNode(setting, node, !node.open);
  1589. } else if (setting.async.enable) {
  1590. if (!view.asyncNode(setting, node)) {
  1591. view.expandCollapseNode(setting, node, !node.open);
  1592. return;
  1593. }
  1594. } else if (node) {
  1595. view.expandCollapseNode(setting, node, !node.open);
  1596. }
  1597. }
  1598. };
  1599. // zTree defind
  1600. $.fn.zTree = {
  1601. consts: _consts,
  1602. _z: {
  1603. tools: tools,
  1604. view: view,
  1605. event: event,
  1606. data: data
  1607. },
  1608. getZTreeObj: function (treeId) {
  1609. var o = data.getZTreeTools(treeId);
  1610. return o ? o : null;
  1611. },
  1612. destroy: function (treeId) {
  1613. if (!!treeId && treeId.length > 0) {
  1614. view.destroy(data.getSetting(treeId));
  1615. } else {
  1616. for (var s in settings) {
  1617. view.destroy(settings[s]);
  1618. }
  1619. }
  1620. },
  1621. init: function (obj, zSetting, zNodes) {
  1622. var setting = tools.clone(_setting);
  1623. $.extend(true, setting, zSetting);
  1624. setting.treeId = obj.attr("id");
  1625. setting.treeObj = obj;
  1626. setting.treeObj.empty();
  1627. settings[setting.treeId] = setting;
  1628. //For some older browser,(e.g., ie6)
  1629. if (typeof document.body.style.maxHeight === "undefined") {
  1630. setting.view.expandSpeed = "";
  1631. }
  1632. data.initRoot(setting);
  1633. var root = data.getRoot(setting),
  1634. childKey = setting.data.key.children;
  1635. zNodes = zNodes ? tools.clone(tools.isArray(zNodes) ? zNodes : [zNodes]) : [];
  1636. if (setting.data.simpleData.enable) {
  1637. root[childKey] = data.transformTozTreeFormat(setting, zNodes);
  1638. } else {
  1639. root[childKey] = zNodes;
  1640. }
  1641. data.initCache(setting);
  1642. event.unbindTree(setting);
  1643. event.bindTree(setting);
  1644. event.unbindEvent(setting);
  1645. event.bindEvent(setting);
  1646. var zTreeTools = {
  1647. setting: setting,
  1648. addNodes: function (parentNode, index, newNodes, isSilent) {
  1649. if (!parentNode) parentNode = null;
  1650. if (parentNode && !parentNode.isParent && setting.data.keep.leaf) return null;
  1651. var i = parseInt(index, 10);
  1652. if (isNaN(i)) {
  1653. isSilent = !!newNodes;
  1654. newNodes = index;
  1655. index = -1;
  1656. } else {
  1657. index = i;
  1658. }
  1659. if (!newNodes) return null;
  1660. var xNewNodes = tools.clone(tools.isArray(newNodes) ? newNodes : [newNodes]);
  1661. function addCallback() {
  1662. view.addNodes(setting, parentNode, index, xNewNodes, (isSilent == true));
  1663. }
  1664. if (tools.canAsync(setting, parentNode)) {
  1665. view.asyncNode(setting, parentNode, isSilent, addCallback);
  1666. } else {
  1667. addCallback();
  1668. }
  1669. return xNewNodes;
  1670. },
  1671. cancelSelectedNode: function (node) {
  1672. view.cancelPreSelectedNode(setting, node);
  1673. },
  1674. destroy: function () {
  1675. view.destroy(setting);
  1676. },
  1677. expandAll: function (expandFlag) {
  1678. expandFlag = !!expandFlag;
  1679. view.expandCollapseSonNode(setting, null, expandFlag, true);
  1680. return expandFlag;
  1681. },
  1682. expandNode: function (node, expandFlag, sonSign, focus, callbackFlag) {
  1683. if (!node || !node.isParent) return null;
  1684. if (expandFlag !== true && expandFlag !== false) {
  1685. expandFlag = !node.open;
  1686. }
  1687. callbackFlag = !!callbackFlag;
  1688. if (callbackFlag && expandFlag && (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false)) {
  1689. return null;
  1690. } else if (callbackFlag && !expandFlag && (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false)) {
  1691. return null;
  1692. }
  1693. if (expandFlag && node.parentTId) {
  1694. view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, false);
  1695. }
  1696. if (expandFlag === node.open && !sonSign) {
  1697. return null;
  1698. }
  1699. data.getRoot(setting).expandTriggerFlag = callbackFlag;
  1700. if (!tools.canAsync(setting, node) && sonSign) {
  1701. view.expandCollapseSonNode(setting, node, expandFlag, true, showNodeFocus);
  1702. } else {
  1703. node.open = !expandFlag;
  1704. view.switchNode(this.setting, node);
  1705. showNodeFocus();
  1706. }
  1707. return expandFlag;
  1708. function showNodeFocus() {
  1709. var a = $$(node, setting).get(0);
  1710. if (a && focus !== false) {
  1711. view.scrollIntoView(a);
  1712. }
  1713. }
  1714. },
  1715. getNodes: function () {
  1716. return data.getNodes(setting);
  1717. },
  1718. getNodeByParam: function (key, value, parentNode) {
  1719. if (!key) return null;
  1720. return data.getNodeByParam(setting, parentNode ? parentNode[setting.data.key.children] : data.getNodes(setting), key, value);
  1721. },
  1722. getNodeByTId: function (tId) {
  1723. return data.getNodeCache(setting, tId);
  1724. },
  1725. getNodesByParam: function (key, value, parentNode) {
  1726. if (!key) return null;
  1727. return data.getNodesByParam(setting, parentNode ? parentNode[setting.data.key.children] : data.getNodes(setting), key, value);
  1728. },
  1729. getNodesByParamFuzzy: function (key, value, parentNode) {
  1730. if (!key) return null;
  1731. return data.getNodesByParamFuzzy(setting, parentNode ? parentNode[setting.data.key.children] : data.getNodes(setting), key, value);
  1732. },
  1733. getNodesByFilter: function (filter, isSingle, parentNode, invokeParam) {
  1734. isSingle = !!isSingle;
  1735. if (!filter || (typeof filter != "function")) return (isSingle ? null : []);
  1736. return data.getNodesByFilter(setting, parentNode ? parentNode[setting.data.key.children] : data.getNodes(setting), filter, isSingle, invokeParam);
  1737. },
  1738. getNodeIndex: function (node) {
  1739. if (!node) return null;
  1740. var childKey = setting.data.key.children,
  1741. parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
  1742. for (var i = 0, l = parentNode[childKey].length; i < l; i++) {
  1743. if (parentNode[childKey][i] == node) return i;
  1744. }
  1745. return -1;
  1746. },
  1747. getSelectedNodes: function () {
  1748. var r = [], list = data.getRoot(setting).curSelectedList;
  1749. for (var i = 0, l = list.length; i < l; i++) {
  1750. r.push(list[i]);
  1751. }
  1752. return r;
  1753. },
  1754. isSelectedNode: function (node) {
  1755. return data.isSelectedNode(setting, node);
  1756. },
  1757. reAsyncChildNodes: function (parentNode, reloadType, isSilent) {
  1758. if (!this.setting.async.enable) return;
  1759. var isRoot = !parentNode;
  1760. if (isRoot) {
  1761. parentNode = data.getRoot(setting);
  1762. }
  1763. if (reloadType == "refresh") {
  1764. var childKey = this.setting.data.key.children;
  1765. for (var i = 0, l = parentNode[childKey] ? parentNode[childKey].length : 0; i < l; i++) {
  1766. data.removeNodeCache(setting, parentNode[childKey][i]);
  1767. }
  1768. data.removeSelectedNode(setting);
  1769. parentNode[childKey] = [];
  1770. if (isRoot) {
  1771. this.setting.treeObj.empty();
  1772. } else {
  1773. var ulObj = $$(parentNode, consts.id.UL, setting);
  1774. ulObj.empty();
  1775. }
  1776. }
  1777. view.asyncNode(this.setting, isRoot ? null : parentNode, !!isSilent);
  1778. },
  1779. refresh: function () {
  1780. this.setting.treeObj.empty();
  1781. var root = data.getRoot(setting),
  1782. nodes = root[setting.data.key.children]
  1783. data.initRoot(setting);
  1784. root[setting.data.key.children] = nodes
  1785. data.initCache(setting);
  1786. view.createNodes(setting, 0, root[setting.data.key.children], null, -1);
  1787. },
  1788. removeChildNodes: function (node) {
  1789. if (!node) return null;
  1790. var childKey = setting.data.key.children,
  1791. nodes = node[childKey];
  1792. view.removeChildNodes(setting, node);
  1793. return nodes ? nodes : null;
  1794. },
  1795. removeNode: function (node, callbackFlag) {
  1796. if (!node) return;
  1797. callbackFlag = !!callbackFlag;
  1798. if (callbackFlag && tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return;
  1799. view.removeNode(setting, node);
  1800. if (callbackFlag) {
  1801. this.setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]);
  1802. }
  1803. },
  1804. selectNode: function (node, addFlag, isSilent) {
  1805. if (!node) return;
  1806. if (tools.uCanDo(setting)) {
  1807. addFlag = setting.view.selectedMulti && addFlag;
  1808. if (node.parentTId) {
  1809. view.expandCollapseParentNode(setting, node.getParentNode(), true, false, showNodeFocus);
  1810. } else if (!isSilent) {
  1811. try {
  1812. $$(node, setting).focus().blur();
  1813. } catch (e) {
  1814. }
  1815. }
  1816. view.selectNode(setting, node, addFlag);
  1817. }
  1818. function showNodeFocus() {
  1819. if (isSilent) {
  1820. return;
  1821. }
  1822. var a = $$(node, setting).get(0);
  1823. view.scrollIntoView(a);
  1824. }
  1825. },
  1826. transformTozTreeNodes: function (simpleNodes) {
  1827. return data.transformTozTreeFormat(setting, simpleNodes);
  1828. },
  1829. transformToArray: function (nodes) {
  1830. return data.transformToArrayFormat(setting, nodes);
  1831. },
  1832. updateNode: function (node, checkTypeFlag) {
  1833. if (!node) return;
  1834. var nObj = $$(node, setting);
  1835. if (nObj.get(0) && tools.uCanDo(setting)) {
  1836. view.setNodeName(setting, node);
  1837. view.setNodeTarget(setting, node);
  1838. view.setNodeUrl(setting, node);
  1839. view.setNodeLineIcos(setting, node);
  1840. view.setNodeFontCss(setting, node);
  1841. }
  1842. }
  1843. }
  1844. root.treeTools = zTreeTools;
  1845. data.setZTreeTools(setting, zTreeTools);
  1846. if (root[childKey] && root[childKey].length > 0) {
  1847. view.createNodes(setting, 0, root[childKey], null, -1);
  1848. } else if (setting.async.enable && setting.async.url && setting.async.url !== '') {
  1849. view.asyncNode(setting);
  1850. }
  1851. return zTreeTools;
  1852. }
  1853. };
  1854. var zt = $.fn.zTree,
  1855. $$ = tools.$,
  1856. consts = zt.consts;
  1857. })(jQuery);
  1858. /*
  1859. * JQuery zTree excheck v3.5.28
  1860. * http://treejs.cn/
  1861. *
  1862. * Copyright (c) 2010 Hunter.z
  1863. *
  1864. * Licensed same as jquery - MIT License
  1865. * http://www.opensource.org/licenses/mit-license.php
  1866. *
  1867. * email: hunter.z@263.net
  1868. * Date: 2017-01-20
  1869. */
  1870. (function($){
  1871. //default consts of excheck
  1872. var _consts = {
  1873. event: {
  1874. CHECK: "ztree_check"
  1875. },
  1876. id: {
  1877. CHECK: "_check"
  1878. },
  1879. checkbox: {
  1880. STYLE: "checkbox",
  1881. DEFAULT: "chk",
  1882. DISABLED: "disable",
  1883. FALSE: "false",
  1884. TRUE: "true",
  1885. FULL: "full",
  1886. PART: "part",
  1887. FOCUS: "focus"
  1888. },
  1889. radio: {
  1890. STYLE: "radio",
  1891. TYPE_ALL: "all",
  1892. TYPE_LEVEL: "level"
  1893. }
  1894. },
  1895. //default setting of excheck
  1896. _setting = {
  1897. check: {
  1898. enable: false,
  1899. autoCheckTrigger: false,
  1900. chkStyle: _consts.checkbox.STYLE,
  1901. nocheckInherit: false,
  1902. chkDisabledInherit: false,
  1903. radioType: _consts.radio.TYPE_LEVEL,
  1904. chkboxType: {
  1905. "Y": "ps",
  1906. "N": "ps"
  1907. }
  1908. },
  1909. data: {
  1910. key: {
  1911. checked: "checked"
  1912. }
  1913. },
  1914. callback: {
  1915. beforeCheck:null,
  1916. onCheck:null
  1917. }
  1918. },
  1919. //default root of excheck
  1920. _initRoot = function (setting) {
  1921. var r = data.getRoot(setting);
  1922. r.radioCheckedList = [];
  1923. },
  1924. //default cache of excheck
  1925. _initCache = function(treeId) {},
  1926. //default bind event of excheck
  1927. _bindEvent = function(setting) {
  1928. var o = setting.treeObj,
  1929. c = consts.event;
  1930. o.bind(c.CHECK, function (event, srcEvent, treeId, node) {
  1931. event.srcEvent = srcEvent;
  1932. tools.apply(setting.callback.onCheck, [event, treeId, node]);
  1933. });
  1934. },
  1935. _unbindEvent = function(setting) {
  1936. var o = setting.treeObj,
  1937. c = consts.event;
  1938. o.unbind(c.CHECK);
  1939. },
  1940. //default event proxy of excheck
  1941. _eventProxy = function(e) {
  1942. var target = e.target,
  1943. setting = data.getSetting(e.data.treeId),
  1944. tId = "", node = null,
  1945. nodeEventType = "", treeEventType = "",
  1946. nodeEventCallback = null, treeEventCallback = null;
  1947. if (tools.eqs(e.type, "mouseover")) {
  1948. if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
  1949. tId = tools.getNodeMainDom(target).id;
  1950. nodeEventType = "mouseoverCheck";
  1951. }
  1952. } else if (tools.eqs(e.type, "mouseout")) {
  1953. if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
  1954. tId = tools.getNodeMainDom(target).id;
  1955. nodeEventType = "mouseoutCheck";
  1956. }
  1957. } else if (tools.eqs(e.type, "click")) {
  1958. if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
  1959. tId = tools.getNodeMainDom(target).id;
  1960. nodeEventType = "checkNode";
  1961. }
  1962. }
  1963. if (tId.length>0) {
  1964. node = data.getNodeCache(setting, tId);
  1965. switch (nodeEventType) {
  1966. case "checkNode" :
  1967. nodeEventCallback = _handler.onCheckNode;
  1968. break;
  1969. case "mouseoverCheck" :
  1970. nodeEventCallback = _handler.onMouseoverCheck;
  1971. break;
  1972. case "mouseoutCheck" :
  1973. nodeEventCallback = _handler.onMouseoutCheck;
  1974. break;
  1975. }
  1976. }
  1977. var proxyResult = {
  1978. stop: nodeEventType === "checkNode",
  1979. node: node,
  1980. nodeEventType: nodeEventType,
  1981. nodeEventCallback: nodeEventCallback,
  1982. treeEventType: treeEventType,
  1983. treeEventCallback: treeEventCallback
  1984. };
  1985. return proxyResult
  1986. },
  1987. //default init node of excheck
  1988. _initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
  1989. if (!n) return;
  1990. var checkedKey = setting.data.key.checked;
  1991. if (typeof n[checkedKey] == "string") n[checkedKey] = tools.eqs(n[checkedKey], "true");
  1992. n[checkedKey] = !!n[checkedKey];
  1993. n.checkedOld = n[checkedKey];
  1994. if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true");
  1995. n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck);
  1996. if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true");
  1997. n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled);
  1998. if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true");
  1999. n.halfCheck = !!n.halfCheck;
  2000. n.check_Child_State = -1;
  2001. n.check_Focus = false;
  2002. n.getCheckStatus = function() {return data.getCheckStatus(setting, n);};
  2003. if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && n[checkedKey] ) {
  2004. var r = data.getRoot(setting);
  2005. r.radioCheckedList.push(n);
  2006. }
  2007. },
  2008. //add dom for check
  2009. _beforeA = function(setting, node, html) {
  2010. var checkedKey = setting.data.key.checked;
  2011. if (setting.check.enable) {
  2012. data.makeChkFlag(setting, node);
  2013. 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>");
  2014. }
  2015. },
  2016. //update zTreeObj, add method of check
  2017. _zTreeTools = function(setting, zTreeTools) {
  2018. zTreeTools.checkNode = function(node, checked, checkTypeFlag, callbackFlag) {
  2019. var checkedKey = this.setting.data.key.checked;
  2020. if (node.chkDisabled === true) return;
  2021. if (checked !== true && checked !== false) {
  2022. checked = !node[checkedKey];
  2023. }
  2024. callbackFlag = !!callbackFlag;
  2025. if (node[checkedKey] === checked && !checkTypeFlag) {
  2026. return;
  2027. } else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) {
  2028. return;
  2029. }
  2030. if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) {
  2031. node[checkedKey] = checked;
  2032. var checkObj = $$(node, consts.id.CHECK, this.setting);
  2033. if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
  2034. view.setChkClass(this.setting, checkObj, node);
  2035. view.repairParentChkClassWithSelf(this.setting, node);
  2036. if (callbackFlag) {
  2037. this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]);
  2038. }
  2039. }
  2040. }
  2041. zTreeTools.checkAllNodes = function(checked) {
  2042. view.repairAllChk(this.setting, !!checked);
  2043. }
  2044. zTreeTools.getCheckedNodes = function(checked) {
  2045. var childKey = this.setting.data.key.children;
  2046. checked = (checked !== false);
  2047. return data.getTreeCheckedNodes(this.setting, data.getRoot(this.setting)[childKey], checked);
  2048. }
  2049. zTreeTools.getChangeCheckedNodes = function() {
  2050. var childKey = this.setting.data.key.children;
  2051. return data.getTreeChangeCheckedNodes(this.setting, data.getRoot(this.setting)[childKey]);
  2052. }
  2053. zTreeTools.setChkDisabled = function(node, disabled, inheritParent, inheritChildren) {
  2054. disabled = !!disabled;
  2055. inheritParent = !!inheritParent;
  2056. inheritChildren = !!inheritChildren;
  2057. view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren);
  2058. view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent);
  2059. }
  2060. var _updateNode = zTreeTools.updateNode;
  2061. zTreeTools.updateNode = function(node, checkTypeFlag) {
  2062. if (_updateNode) _updateNode.apply(zTreeTools, arguments);
  2063. if (!node || !this.setting.check.enable) return;
  2064. var nObj = $$(node, this.setting);
  2065. if (nObj.get(0) && tools.uCanDo(this.setting)) {
  2066. var checkObj = $$(node, consts.id.CHECK, this.setting);
  2067. if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
  2068. view.setChkClass(this.setting, checkObj, node);
  2069. view.repairParentChkClassWithSelf(this.setting, node);
  2070. }
  2071. }
  2072. },
  2073. //method of operate data
  2074. _data = {
  2075. getRadioCheckedList: function(setting) {
  2076. var checkedList = data.getRoot(setting).radioCheckedList;
  2077. for (var i=0, j=checkedList.length; i<j; i++) {
  2078. if(!data.getNodeCache(setting, checkedList[i].tId)) {
  2079. checkedList.splice(i, 1);
  2080. i--; j--;
  2081. }
  2082. }
  2083. return checkedList;
  2084. },
  2085. getCheckStatus: function(setting, node) {
  2086. if (!setting.check.enable || node.nocheck || node.chkDisabled) return null;
  2087. var checkedKey = setting.data.key.checked,
  2088. r = {
  2089. checked: node[checkedKey],
  2090. 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)))
  2091. };
  2092. return r;
  2093. },
  2094. getTreeCheckedNodes: function(setting, nodes, checked, results) {
  2095. if (!nodes) return [];
  2096. var childKey = setting.data.key.children,
  2097. checkedKey = setting.data.key.checked,
  2098. onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL);
  2099. results = !results ? [] : results;
  2100. for (var i = 0, l = nodes.length; i < l; i++) {
  2101. if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] == checked) {
  2102. results.push(nodes[i]);
  2103. if(onlyOne) {
  2104. break;
  2105. }
  2106. }
  2107. data.getTreeCheckedNodes(setting, nodes[i][childKey], checked, results);
  2108. if(onlyOne && results.length > 0) {
  2109. break;
  2110. }
  2111. }
  2112. return results;
  2113. },
  2114. getTreeChangeCheckedNodes: function(setting, nodes, results) {
  2115. if (!nodes) return [];
  2116. var childKey = setting.data.key.children,
  2117. checkedKey = setting.data.key.checked;
  2118. results = !results ? [] : results;
  2119. for (var i = 0, l = nodes.length; i < l; i++) {
  2120. if (nodes[i].nocheck !== true && nodes[i].chkDisabled !== true && nodes[i][checkedKey] != nodes[i].checkedOld) {
  2121. results.push(nodes[i]);
  2122. }
  2123. data.getTreeChangeCheckedNodes(setting, nodes[i][childKey], results);
  2124. }
  2125. return results;
  2126. },
  2127. makeChkFlag: function(setting, node) {
  2128. if (!node) return;
  2129. var childKey = setting.data.key.children,
  2130. checkedKey = setting.data.key.checked,
  2131. chkFlag = -1;
  2132. if (node[childKey]) {
  2133. for (var i = 0, l = node[childKey].length; i < l; i++) {
  2134. var cNode = node[childKey][i];
  2135. var tmp = -1;
  2136. if (setting.check.chkStyle == consts.radio.STYLE) {
  2137. if (cNode.nocheck === true || cNode.chkDisabled === true) {
  2138. tmp = cNode.check_Child_State;
  2139. } else if (cNode.halfCheck === true) {
  2140. tmp = 2;
  2141. } else if (cNode[checkedKey]) {
  2142. tmp = 2;
  2143. } else {
  2144. tmp = cNode.check_Child_State > 0 ? 2:0;
  2145. }
  2146. if (tmp == 2) {
  2147. chkFlag = 2; break;
  2148. } else if (tmp == 0){
  2149. chkFlag = 0;
  2150. }
  2151. } else if (setting.check.chkStyle == consts.checkbox.STYLE) {
  2152. if (cNode.nocheck === true || cNode.chkDisabled === true) {
  2153. tmp = cNode.check_Child_State;
  2154. } else if (cNode.halfCheck === true) {
  2155. tmp = 1;
  2156. } else if (cNode[checkedKey] ) {
  2157. tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1;
  2158. } else {
  2159. tmp = (cNode.check_Child_State > 0) ? 1 : 0;
  2160. }
  2161. if (tmp === 1) {
  2162. chkFlag = 1; break;
  2163. } else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) {
  2164. chkFlag = 1; break;
  2165. } else if (chkFlag === 2 && tmp > -1 && tmp < 2) {
  2166. chkFlag = 1; break;
  2167. } else if (tmp > -1) {
  2168. chkFlag = tmp;
  2169. }
  2170. }
  2171. }
  2172. }
  2173. node.check_Child_State = chkFlag;
  2174. }
  2175. },
  2176. //method of event proxy
  2177. _event = {
  2178. },
  2179. //method of event handler
  2180. _handler = {
  2181. onCheckNode: function (event, node) {
  2182. if (node.chkDisabled === true) return false;
  2183. var setting = data.getSetting(event.data.treeId),
  2184. checkedKey = setting.data.key.checked;
  2185. if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true;
  2186. node[checkedKey] = !node[checkedKey];
  2187. view.checkNodeRelation(setting, node);
  2188. var checkObj = $$(node, consts.id.CHECK, setting);
  2189. view.setChkClass(setting, checkObj, node);
  2190. view.repairParentChkClassWithSelf(setting, node);
  2191. setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]);
  2192. return true;
  2193. },
  2194. onMouseoverCheck: function(event, node) {
  2195. if (node.chkDisabled === true) return false;
  2196. var setting = data.getSetting(event.data.treeId),
  2197. checkObj = $$(node, consts.id.CHECK, setting);
  2198. node.check_Focus = true;
  2199. view.setChkClass(setting, checkObj, node);
  2200. return true;
  2201. },
  2202. onMouseoutCheck: function(event, node) {
  2203. if (node.chkDisabled === true) return false;
  2204. var setting = data.getSetting(event.data.treeId),
  2205. checkObj = $$(node, consts.id.CHECK, setting);
  2206. node.check_Focus = false;
  2207. view.setChkClass(setting, checkObj, node);
  2208. return true;
  2209. }
  2210. },
  2211. //method of tools for zTree
  2212. _tools = {
  2213. },
  2214. //method of operate ztree dom
  2215. _view = {
  2216. checkNodeRelation: function(setting, node) {
  2217. var pNode, i, l,
  2218. childKey = setting.data.key.children,
  2219. checkedKey = setting.data.key.checked,
  2220. r = consts.radio;
  2221. if (setting.check.chkStyle == r.STYLE) {
  2222. var checkedList = data.getRadioCheckedList(setting);
  2223. if (node[checkedKey]) {
  2224. if (setting.check.radioType == r.TYPE_ALL) {
  2225. for (i = checkedList.length-1; i >= 0; i--) {
  2226. pNode = checkedList[i];
  2227. if (pNode[checkedKey] && pNode != node) {
  2228. pNode[checkedKey] = false;
  2229. checkedList.splice(i, 1);
  2230. view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
  2231. if (pNode.parentTId != node.parentTId) {
  2232. view.repairParentChkClassWithSelf(setting, pNode);
  2233. }
  2234. }
  2235. }
  2236. checkedList.push(node);
  2237. } else {
  2238. var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
  2239. for (i = 0, l = parentNode[childKey].length; i < l; i++) {
  2240. pNode = parentNode[childKey][i];
  2241. if (pNode[checkedKey] && pNode != node) {
  2242. pNode[checkedKey] = false;
  2243. view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
  2244. }
  2245. }
  2246. }
  2247. } else if (setting.check.radioType == r.TYPE_ALL) {
  2248. for (i = 0, l = checkedList.length; i < l; i++) {
  2249. if (node == checkedList[i]) {
  2250. checkedList.splice(i, 1);
  2251. break;
  2252. }
  2253. }
  2254. }
  2255. } else {
  2256. if (node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.Y.indexOf("s") > -1)) {
  2257. view.setSonNodeCheckBox(setting, node, true);
  2258. }
  2259. if (!node[checkedKey] && (!node[childKey] || node[childKey].length==0 || setting.check.chkboxType.N.indexOf("s") > -1)) {
  2260. view.setSonNodeCheckBox(setting, node, false);
  2261. }
  2262. if (node[checkedKey] && setting.check.chkboxType.Y.indexOf("p") > -1) {
  2263. view.setParentNodeCheckBox(setting, node, true);
  2264. }
  2265. if (!node[checkedKey] && setting.check.chkboxType.N.indexOf("p") > -1) {
  2266. view.setParentNodeCheckBox(setting, node, false);
  2267. }
  2268. }
  2269. },
  2270. makeChkClass: function(setting, node) {
  2271. var checkedKey = setting.data.key.checked,
  2272. c = consts.checkbox, r = consts.radio,
  2273. fullStyle = "";
  2274. if (node.chkDisabled === true) {
  2275. fullStyle = c.DISABLED;
  2276. } else if (node.halfCheck) {
  2277. fullStyle = c.PART;
  2278. } else if (setting.check.chkStyle == r.STYLE) {
  2279. fullStyle = (node.check_Child_State < 1)? c.FULL:c.PART;
  2280. } else {
  2281. 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);
  2282. }
  2283. var chkName = setting.check.chkStyle + "_" + (node[checkedKey] ? c.TRUE : c.FALSE) + "_" + fullStyle;
  2284. chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName;
  2285. return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName;
  2286. },
  2287. repairAllChk: function(setting, checked) {
  2288. if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) {
  2289. var checkedKey = setting.data.key.checked,
  2290. childKey = setting.data.key.children,
  2291. root = data.getRoot(setting);
  2292. for (var i = 0, l = root[childKey].length; i<l ; i++) {
  2293. var node = root[childKey][i];
  2294. if (node.nocheck !== true && node.chkDisabled !== true) {
  2295. node[checkedKey] = checked;
  2296. }
  2297. view.setSonNodeCheckBox(setting, node, checked);
  2298. }
  2299. }
  2300. },
  2301. repairChkClass: function(setting, node) {
  2302. if (!node) return;
  2303. data.makeChkFlag(setting, node);
  2304. if (node.nocheck !== true) {
  2305. var checkObj = $$(node, consts.id.CHECK, setting);
  2306. view.setChkClass(setting, checkObj, node);
  2307. }
  2308. },
  2309. repairParentChkClass: function(setting, node) {
  2310. if (!node || !node.parentTId) return;
  2311. var pNode = node.getParentNode();
  2312. view.repairChkClass(setting, pNode);
  2313. view.repairParentChkClass(setting, pNode);
  2314. },
  2315. repairParentChkClassWithSelf: function(setting, node) {
  2316. if (!node) return;
  2317. var childKey = setting.data.key.children;
  2318. if (node[childKey] && node[childKey].length > 0) {
  2319. view.repairParentChkClass(setting, node[childKey][0]);
  2320. } else {
  2321. view.repairParentChkClass(setting, node);
  2322. }
  2323. },
  2324. repairSonChkDisabled: function(setting, node, chkDisabled, inherit) {
  2325. if (!node) return;
  2326. var childKey = setting.data.key.children;
  2327. if (node.chkDisabled != chkDisabled) {
  2328. node.chkDisabled = chkDisabled;
  2329. }
  2330. view.repairChkClass(setting, node);
  2331. if (node[childKey] && inherit) {
  2332. for (var i = 0, l = node[childKey].length; i < l; i++) {
  2333. var sNode = node[childKey][i];
  2334. view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit);
  2335. }
  2336. }
  2337. },
  2338. repairParentChkDisabled: function(setting, node, chkDisabled, inherit) {
  2339. if (!node) return;
  2340. if (node.chkDisabled != chkDisabled && inherit) {
  2341. node.chkDisabled = chkDisabled;
  2342. }
  2343. view.repairChkClass(setting, node);
  2344. view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit);
  2345. },
  2346. setChkClass: function(setting, obj, node) {
  2347. if (!obj) return;
  2348. if (node.nocheck === true) {
  2349. obj.hide();
  2350. } else {
  2351. obj.show();
  2352. }
  2353. obj.attr('class', view.makeChkClass(setting, node));
  2354. },
  2355. setParentNodeCheckBox: function(setting, node, value, srcNode) {
  2356. var childKey = setting.data.key.children,
  2357. checkedKey = setting.data.key.checked,
  2358. checkObj = $$(node, consts.id.CHECK, setting);
  2359. if (!srcNode) srcNode = node;
  2360. data.makeChkFlag(setting, node);
  2361. if (node.nocheck !== true && node.chkDisabled !== true) {
  2362. node[checkedKey] = value;
  2363. view.setChkClass(setting, checkObj, node);
  2364. if (setting.check.autoCheckTrigger && node != srcNode) {
  2365. setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
  2366. }
  2367. }
  2368. if (node.parentTId) {
  2369. var pSign = true;
  2370. if (!value) {
  2371. var pNodes = node.getParentNode()[childKey];
  2372. for (var i = 0, l = pNodes.length; i < l; i++) {
  2373. if ((pNodes[i].nocheck !== true && pNodes[i].chkDisabled !== true && pNodes[i][checkedKey])
  2374. || ((pNodes[i].nocheck === true || pNodes[i].chkDisabled === true) && pNodes[i].check_Child_State > 0)) {
  2375. pSign = false;
  2376. break;
  2377. }
  2378. }
  2379. }
  2380. if (pSign) {
  2381. view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode);
  2382. }
  2383. }
  2384. },
  2385. setSonNodeCheckBox: function(setting, node, value, srcNode) {
  2386. if (!node) return;
  2387. var childKey = setting.data.key.children,
  2388. checkedKey = setting.data.key.checked,
  2389. checkObj = $$(node, consts.id.CHECK, setting);
  2390. if (!srcNode) srcNode = node;
  2391. var hasDisable = false;
  2392. if (node[childKey]) {
  2393. for (var i = 0, l = node[childKey].length; i < l; i++) {
  2394. var sNode = node[childKey][i];
  2395. view.setSonNodeCheckBox(setting, sNode, value, srcNode);
  2396. if (sNode.chkDisabled === true) hasDisable = true;
  2397. }
  2398. }
  2399. if (node != data.getRoot(setting) && node.chkDisabled !== true) {
  2400. if (hasDisable && node.nocheck !== true) {
  2401. data.makeChkFlag(setting, node);
  2402. }
  2403. if (node.nocheck !== true && node.chkDisabled !== true) {
  2404. node[checkedKey] = value;
  2405. if (!hasDisable) node.check_Child_State = (node[childKey] && node[childKey].length > 0) ? (value ? 2 : 0) : -1;
  2406. } else {
  2407. node.check_Child_State = -1;
  2408. }
  2409. view.setChkClass(setting, checkObj, node);
  2410. if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) {
  2411. setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
  2412. }
  2413. }
  2414. }
  2415. },
  2416. _z = {
  2417. tools: _tools,
  2418. view: _view,
  2419. event: _event,
  2420. data: _data
  2421. };
  2422. $.extend(true, $.fn.zTree.consts, _consts);
  2423. $.extend(true, $.fn.zTree._z, _z);
  2424. var zt = $.fn.zTree,
  2425. tools = zt._z.tools,
  2426. consts = zt.consts,
  2427. view = zt._z.view,
  2428. data = zt._z.data,
  2429. event = zt._z.event,
  2430. $$ = tools.$;
  2431. data.exSetting(_setting);
  2432. data.addInitBind(_bindEvent);
  2433. data.addInitUnBind(_unbindEvent);
  2434. data.addInitCache(_initCache);
  2435. data.addInitNode(_initNode);
  2436. data.addInitProxy(_eventProxy, true);
  2437. data.addInitRoot(_initRoot);
  2438. data.addBeforeA(_beforeA);
  2439. data.addZTreeTools(_zTreeTools);
  2440. var _createNodes = view.createNodes;
  2441. view.createNodes = function(setting, level, nodes, parentNode, index) {
  2442. if (_createNodes) _createNodes.apply(view, arguments);
  2443. if (!nodes) return;
  2444. view.repairParentChkClassWithSelf(setting, parentNode);
  2445. }
  2446. var _removeNode = view.removeNode;
  2447. view.removeNode = function(setting, node) {
  2448. var parentNode = node.getParentNode();
  2449. if (_removeNode) _removeNode.apply(view, arguments);
  2450. if (!node || !parentNode) return;
  2451. view.repairChkClass(setting, parentNode);
  2452. view.repairParentChkClass(setting, parentNode);
  2453. }
  2454. var _appendNodes = view.appendNodes;
  2455. view.appendNodes = function(setting, level, nodes, parentNode, index, initFlag, openFlag) {
  2456. var html = "";
  2457. if (_appendNodes) {
  2458. html = _appendNodes.apply(view, arguments);
  2459. }
  2460. if (parentNode) {
  2461. data.makeChkFlag(setting, parentNode);
  2462. }
  2463. return html;
  2464. }
  2465. })(jQuery);
  2466. /*
  2467. * JQuery zTree exedit v3.5.28
  2468. * http://treejs.cn/
  2469. *
  2470. * Copyright (c) 2010 Hunter.z
  2471. *
  2472. * Licensed same as jquery - MIT License
  2473. * http://www.opensource.org/licenses/mit-license.php
  2474. *
  2475. * email: hunter.z@263.net
  2476. * Date: 2017-01-20
  2477. */
  2478. (function($){
  2479. //default consts of exedit
  2480. var _consts = {
  2481. event: {
  2482. DRAG: "ztree_drag",
  2483. DROP: "ztree_drop",
  2484. RENAME: "ztree_rename",
  2485. DRAGMOVE:"ztree_dragmove"
  2486. },
  2487. id: {
  2488. EDIT: "_edit",
  2489. INPUT: "_input",
  2490. REMOVE: "_remove"
  2491. },
  2492. move: {
  2493. TYPE_INNER: "inner",
  2494. TYPE_PREV: "prev",
  2495. TYPE_NEXT: "next"
  2496. },
  2497. node: {
  2498. CURSELECTED_EDIT: "curSelectedNode_Edit",
  2499. TMPTARGET_TREE: "tmpTargetzTree",
  2500. TMPTARGET_NODE: "tmpTargetNode"
  2501. }
  2502. },
  2503. //default setting of exedit
  2504. _setting = {
  2505. edit: {
  2506. enable: false,
  2507. editNameSelectAll: false,
  2508. showRemoveBtn: true,
  2509. showRenameBtn: true,
  2510. removeTitle: "remove",
  2511. renameTitle: "rename",
  2512. drag: {
  2513. autoExpandTrigger: false,
  2514. isCopy: true,
  2515. isMove: true,
  2516. prev: true,
  2517. next: true,
  2518. inner: true,
  2519. minMoveSize: 5,
  2520. borderMax: 10,
  2521. borderMin: -5,
  2522. maxShowNodeNum: 5,
  2523. autoOpenTime: 500
  2524. }
  2525. },
  2526. view: {
  2527. addHoverDom: null,
  2528. removeHoverDom: null
  2529. },
  2530. callback: {
  2531. beforeDrag:null,
  2532. beforeDragOpen:null,
  2533. beforeDrop:null,
  2534. beforeEditName:null,
  2535. beforeRename:null,
  2536. onDrag:null,
  2537. onDragMove:null,
  2538. onDrop:null,
  2539. onRename:null
  2540. }
  2541. },
  2542. //default root of exedit
  2543. _initRoot = function (setting) {
  2544. var r = data.getRoot(setting), rs = data.getRoots();
  2545. r.curEditNode = null;
  2546. r.curEditInput = null;
  2547. r.curHoverNode = null;
  2548. r.dragFlag = 0;
  2549. r.dragNodeShowBefore = [];
  2550. r.dragMaskList = new Array();
  2551. rs.showHoverDom = true;
  2552. },
  2553. //default cache of exedit
  2554. _initCache = function(treeId) {},
  2555. //default bind event of exedit
  2556. _bindEvent = function(setting) {
  2557. var o = setting.treeObj;
  2558. var c = consts.event;
  2559. o.bind(c.RENAME, function (event, treeId, treeNode, isCancel) {
  2560. tools.apply(setting.callback.onRename, [event, treeId, treeNode, isCancel]);
  2561. });
  2562. o.bind(c.DRAG, function (event, srcEvent, treeId, treeNodes) {
  2563. tools.apply(setting.callback.onDrag, [srcEvent, treeId, treeNodes]);
  2564. });
  2565. o.bind(c.DRAGMOVE,function(event, srcEvent, treeId, treeNodes){
  2566. tools.apply(setting.callback.onDragMove,[srcEvent, treeId, treeNodes]);
  2567. });
  2568. o.bind(c.DROP, function (event, srcEvent, treeId, treeNodes, targetNode, moveType, isCopy) {
  2569. tools.apply(setting.callback.onDrop, [srcEvent, treeId, treeNodes, targetNode, moveType, isCopy]);
  2570. });
  2571. },
  2572. _unbindEvent = function(setting) {
  2573. var o = setting.treeObj;
  2574. var c = consts.event;
  2575. o.unbind(c.RENAME);
  2576. o.unbind(c.DRAG);
  2577. o.unbind(c.DRAGMOVE);
  2578. o.unbind(c.DROP);
  2579. },
  2580. //default event proxy of exedit
  2581. _eventProxy = function(e) {
  2582. var target = e.target,
  2583. setting = data.getSetting(e.data.treeId),
  2584. relatedTarget = e.relatedTarget,
  2585. tId = "", node = null,
  2586. nodeEventType = "", treeEventType = "",
  2587. nodeEventCallback = null, treeEventCallback = null,
  2588. tmp = null;
  2589. if (tools.eqs(e.type, "mouseover")) {
  2590. tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
  2591. if (tmp) {
  2592. tId = tools.getNodeMainDom(tmp).id;
  2593. nodeEventType = "hoverOverNode";
  2594. }
  2595. } else if (tools.eqs(e.type, "mouseout")) {
  2596. tmp = tools.getMDom(setting, relatedTarget, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
  2597. if (!tmp) {
  2598. tId = "remove";
  2599. nodeEventType = "hoverOutNode";
  2600. }
  2601. } else if (tools.eqs(e.type, "mousedown")) {
  2602. tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
  2603. if (tmp) {
  2604. tId = tools.getNodeMainDom(tmp).id;
  2605. nodeEventType = "mousedownNode";
  2606. }
  2607. }
  2608. if (tId.length>0) {
  2609. node = data.getNodeCache(setting, tId);
  2610. switch (nodeEventType) {
  2611. case "mousedownNode" :
  2612. nodeEventCallback = _handler.onMousedownNode;
  2613. break;
  2614. case "hoverOverNode" :
  2615. nodeEventCallback = _handler.onHoverOverNode;
  2616. break;
  2617. case "hoverOutNode" :
  2618. nodeEventCallback = _handler.onHoverOutNode;
  2619. break;
  2620. }
  2621. }
  2622. var proxyResult = {
  2623. stop: false,
  2624. node: node,
  2625. nodeEventType: nodeEventType,
  2626. nodeEventCallback: nodeEventCallback,
  2627. treeEventType: treeEventType,
  2628. treeEventCallback: treeEventCallback
  2629. };
  2630. return proxyResult
  2631. },
  2632. //default init node of exedit
  2633. _initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
  2634. if (!n) return;
  2635. n.isHover = false;
  2636. n.editNameFlag = false;
  2637. },
  2638. //update zTreeObj, add method of edit
  2639. _zTreeTools = function(setting, zTreeTools) {
  2640. zTreeTools.cancelEditName = function(newName) {
  2641. var root = data.getRoot(this.setting);
  2642. if (!root.curEditNode) return;
  2643. view.cancelCurEditNode(this.setting, newName?newName:null, true);
  2644. }
  2645. zTreeTools.copyNode = function(targetNode, node, moveType, isSilent) {
  2646. if (!node) return null;
  2647. if (targetNode && !targetNode.isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null;
  2648. var _this = this,
  2649. newNode = tools.clone(node);
  2650. if (!targetNode) {
  2651. targetNode = null;
  2652. moveType = consts.move.TYPE_INNER;
  2653. }
  2654. if (moveType == consts.move.TYPE_INNER) {
  2655. function copyCallback() {
  2656. view.addNodes(_this.setting, targetNode, -1, [newNode], isSilent);
  2657. }
  2658. if (tools.canAsync(this.setting, targetNode)) {
  2659. view.asyncNode(this.setting, targetNode, isSilent, copyCallback);
  2660. } else {
  2661. copyCallback();
  2662. }
  2663. } else {
  2664. view.addNodes(this.setting, targetNode.parentNode, -1, [newNode], isSilent);
  2665. view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent);
  2666. }
  2667. return newNode;
  2668. }
  2669. zTreeTools.editName = function(node) {
  2670. if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return;
  2671. if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true);
  2672. view.editNode(this.setting, node)
  2673. }
  2674. zTreeTools.moveNode = function(targetNode, node, moveType, isSilent) {
  2675. if (!node) return node;
  2676. if (targetNode && !targetNode.isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) {
  2677. return null;
  2678. } else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find("#" + targetNode.tId).length > 0)) {
  2679. return null;
  2680. } else if (!targetNode) {
  2681. targetNode = null;
  2682. }
  2683. var _this = this;
  2684. function moveCallback() {
  2685. view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent);
  2686. }
  2687. if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) {
  2688. view.asyncNode(this.setting, targetNode, isSilent, moveCallback);
  2689. } else {
  2690. moveCallback();
  2691. }
  2692. return node;
  2693. }
  2694. zTreeTools.setEditable = function(editable) {
  2695. this.setting.edit.enable = editable;
  2696. return this.refresh();
  2697. }
  2698. },
  2699. //method of operate data
  2700. _data = {
  2701. setSonNodeLevel: function(setting, parentNode, node) {
  2702. if (!node) return;
  2703. var childKey = setting.data.key.children;
  2704. node.level = (parentNode)? parentNode.level + 1 : 0;
  2705. if (!node[childKey]) return;
  2706. for (var i = 0, l = node[childKey].length; i < l; i++) {
  2707. if (node[childKey][i]) data.setSonNodeLevel(setting, node, node[childKey][i]);
  2708. }
  2709. }
  2710. },
  2711. //method of event proxy
  2712. _event = {
  2713. },
  2714. //method of event handler
  2715. _handler = {
  2716. onHoverOverNode: function(event, node) {
  2717. var setting = data.getSetting(event.data.treeId),
  2718. root = data.getRoot(setting);
  2719. if (root.curHoverNode != node) {
  2720. _handler.onHoverOutNode(event);
  2721. }
  2722. root.curHoverNode = node;
  2723. view.addHoverDom(setting, node);
  2724. },
  2725. onHoverOutNode: function(event, node) {
  2726. var setting = data.getSetting(event.data.treeId),
  2727. root = data.getRoot(setting);
  2728. if (root.curHoverNode && !data.isSelectedNode(setting, root.curHoverNode)) {
  2729. view.removeTreeDom(setting, root.curHoverNode);
  2730. root.curHoverNode = null;
  2731. }
  2732. },
  2733. onMousedownNode: function(eventMouseDown, _node) {
  2734. var i,l,
  2735. setting = data.getSetting(eventMouseDown.data.treeId),
  2736. root = data.getRoot(setting), roots = data.getRoots();
  2737. //right click can't drag & drop
  2738. if (eventMouseDown.button == 2 || !setting.edit.enable || (!setting.edit.drag.isCopy && !setting.edit.drag.isMove)) return true;
  2739. //input of edit node name can't drag & drop
  2740. var target = eventMouseDown.target,
  2741. _nodes = data.getRoot(setting).curSelectedList,
  2742. nodes = [];
  2743. if (!data.isSelectedNode(setting, _node)) {
  2744. nodes = [_node];
  2745. } else {
  2746. for (i=0, l=_nodes.length; i<l; i++) {
  2747. if (_nodes[i].editNameFlag && tools.eqs(target.tagName, "input") && target.getAttribute("treeNode"+consts.id.INPUT) !== null) {
  2748. return true;
  2749. }
  2750. nodes.push(_nodes[i]);
  2751. if (nodes[0].parentTId !== _nodes[i].parentTId) {
  2752. nodes = [_node];
  2753. break;
  2754. }
  2755. }
  2756. }
  2757. view.editNodeBlur = true;
  2758. view.cancelCurEditNode(setting);
  2759. var doc = $(setting.treeObj.get(0).ownerDocument),
  2760. body = $(setting.treeObj.get(0).ownerDocument.body), curNode, tmpArrow, tmpTarget,
  2761. isOtherTree = false,
  2762. targetSetting = setting,
  2763. sourceSetting = setting,
  2764. preNode, nextNode,
  2765. preTmpTargetNodeId = null,
  2766. preTmpMoveType = null,
  2767. tmpTargetNodeId = null,
  2768. moveType = consts.move.TYPE_INNER,
  2769. mouseDownX = eventMouseDown.clientX,
  2770. mouseDownY = eventMouseDown.clientY,
  2771. startTime = (new Date()).getTime();
  2772. if (tools.uCanDo(setting)) {
  2773. doc.bind("mousemove", _docMouseMove);
  2774. }
  2775. function _docMouseMove(event) {
  2776. //avoid start drag after click node
  2777. if (root.dragFlag == 0 && Math.abs(mouseDownX - event.clientX) < setting.edit.drag.minMoveSize
  2778. && Math.abs(mouseDownY - event.clientY) < setting.edit.drag.minMoveSize) {
  2779. return true;
  2780. }
  2781. var i, l, tmpNode, tmpDom, tmpNodes,
  2782. childKey = setting.data.key.children;
  2783. body.css("cursor", "pointer");
  2784. if (root.dragFlag == 0) {
  2785. if (tools.apply(setting.callback.beforeDrag, [setting.treeId, nodes], true) == false) {
  2786. _docMouseUp(event);
  2787. return true;
  2788. }
  2789. for (i=0, l=nodes.length; i<l; i++) {
  2790. if (i==0) {
  2791. root.dragNodeShowBefore = [];
  2792. }
  2793. tmpNode = nodes[i];
  2794. if (tmpNode.isParent && tmpNode.open) {
  2795. view.expandCollapseNode(setting, tmpNode, !tmpNode.open);
  2796. root.dragNodeShowBefore[tmpNode.tId] = true;
  2797. } else {
  2798. root.dragNodeShowBefore[tmpNode.tId] = false;
  2799. }
  2800. }
  2801. root.dragFlag = 1;
  2802. roots.showHoverDom = false;
  2803. tools.showIfameMask(setting, true);
  2804. //sort
  2805. var isOrder = true, lastIndex = -1;
  2806. if (nodes.length>1) {
  2807. var pNodes = nodes[0].parentTId ? nodes[0].getParentNode()[childKey] : data.getNodes(setting);
  2808. tmpNodes = [];
  2809. for (i=0, l=pNodes.length; i<l; i++) {
  2810. if (root.dragNodeShowBefore[pNodes[i].tId] !== undefined) {
  2811. if (isOrder && lastIndex > -1 && (lastIndex+1) !== i) {
  2812. isOrder = false;
  2813. }
  2814. tmpNodes.push(pNodes[i]);
  2815. lastIndex = i;
  2816. }
  2817. if (nodes.length === tmpNodes.length) {
  2818. nodes = tmpNodes;
  2819. break;
  2820. }
  2821. }
  2822. }
  2823. if (isOrder) {
  2824. preNode = nodes[0].getPreNode();
  2825. nextNode = nodes[nodes.length-1].getNextNode();
  2826. }
  2827. //set node in selected
  2828. curNode = $$("<ul class='zTreeDragUL'></ul>", setting);
  2829. for (i=0, l=nodes.length; i<l; i++) {
  2830. tmpNode = nodes[i];
  2831. tmpNode.editNameFlag = false;
  2832. view.selectNode(setting, tmpNode, i>0);
  2833. view.removeTreeDom(setting, tmpNode);
  2834. if (i > setting.edit.drag.maxShowNodeNum-1) {
  2835. continue;
  2836. }
  2837. tmpDom = $$("<li id='"+ tmpNode.tId +"_tmp'></li>", setting);
  2838. tmpDom.append($$(tmpNode, consts.id.A, setting).clone());
  2839. tmpDom.css("padding", "0");
  2840. tmpDom.children("#" + tmpNode.tId + consts.id.A).removeClass(consts.node.CURSELECTED);
  2841. curNode.append(tmpDom);
  2842. if (i == setting.edit.drag.maxShowNodeNum-1) {
  2843. tmpDom = $$("<li id='"+ tmpNode.tId +"_moretmp'><a> ... </a></li>", setting);
  2844. curNode.append(tmpDom);
  2845. }
  2846. }
  2847. curNode.attr("id", nodes[0].tId + consts.id.UL + "_tmp");
  2848. curNode.addClass(setting.treeObj.attr("class"));
  2849. curNode.appendTo(body);
  2850. tmpArrow = $$("<span class='tmpzTreeMove_arrow'></span>", setting);
  2851. tmpArrow.attr("id", "zTreeMove_arrow_tmp");
  2852. tmpArrow.appendTo(body);
  2853. setting.treeObj.trigger(consts.event.DRAG, [event, setting.treeId, nodes]);
  2854. }
  2855. if (root.dragFlag == 1) {
  2856. if (tmpTarget && tmpArrow.attr("id") == event.target.id && tmpTargetNodeId && (event.clientX + doc.scrollLeft()+2) > ($("#" + tmpTargetNodeId + consts.id.A, tmpTarget).offset().left)) {
  2857. var xT = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget);
  2858. event.target = (xT.length > 0) ? xT.get(0) : event.target;
  2859. } else if (tmpTarget) {
  2860. tmpTarget.removeClass(consts.node.TMPTARGET_TREE);
  2861. if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV)
  2862. .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER);
  2863. }
  2864. tmpTarget = null;
  2865. tmpTargetNodeId = null;
  2866. //judge drag & drop in multi ztree
  2867. isOtherTree = false;
  2868. targetSetting = setting;
  2869. var settings = data.getSettings();
  2870. for (var s in settings) {
  2871. if (settings[s].treeId && settings[s].edit.enable && settings[s].treeId != setting.treeId
  2872. && (event.target.id == settings[s].treeId || $(event.target).parents("#" + settings[s].treeId).length>0)) {
  2873. isOtherTree = true;
  2874. targetSetting = settings[s];
  2875. }
  2876. }
  2877. var docScrollTop = doc.scrollTop(),
  2878. docScrollLeft = doc.scrollLeft(),
  2879. treeOffset = targetSetting.treeObj.offset(),
  2880. scrollHeight = targetSetting.treeObj.get(0).scrollHeight,
  2881. scrollWidth = targetSetting.treeObj.get(0).scrollWidth,
  2882. dTop = (event.clientY + docScrollTop - treeOffset.top),
  2883. dBottom = (targetSetting.treeObj.height() + treeOffset.top - event.clientY - docScrollTop),
  2884. dLeft = (event.clientX + docScrollLeft - treeOffset.left),
  2885. dRight = (targetSetting.treeObj.width() + treeOffset.left - event.clientX - docScrollLeft),
  2886. isTop = (dTop < setting.edit.drag.borderMax && dTop > setting.edit.drag.borderMin),
  2887. isBottom = (dBottom < setting.edit.drag.borderMax && dBottom > setting.edit.drag.borderMin),
  2888. isLeft = (dLeft < setting.edit.drag.borderMax && dLeft > setting.edit.drag.borderMin),
  2889. isRight = (dRight < setting.edit.drag.borderMax && dRight > setting.edit.drag.borderMin),
  2890. isTreeInner = dTop > setting.edit.drag.borderMin && dBottom > setting.edit.drag.borderMin && dLeft > setting.edit.drag.borderMin && dRight > setting.edit.drag.borderMin,
  2891. isTreeTop = (isTop && targetSetting.treeObj.scrollTop() <= 0),
  2892. isTreeBottom = (isBottom && (targetSetting.treeObj.scrollTop() + targetSetting.treeObj.height()+10) >= scrollHeight),
  2893. isTreeLeft = (isLeft && targetSetting.treeObj.scrollLeft() <= 0),
  2894. isTreeRight = (isRight && (targetSetting.treeObj.scrollLeft() + targetSetting.treeObj.width()+10) >= scrollWidth);
  2895. if (event.target && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
  2896. //get node <li> dom
  2897. var targetObj = event.target;
  2898. while (targetObj && targetObj.tagName && !tools.eqs(targetObj.tagName, "li") && targetObj.id != targetSetting.treeId) {
  2899. targetObj = targetObj.parentNode;
  2900. }
  2901. var canMove = true;
  2902. //don't move to self or children of self
  2903. for (i=0, l=nodes.length; i<l; i++) {
  2904. tmpNode = nodes[i];
  2905. if (targetObj.id === tmpNode.tId) {
  2906. canMove = false;
  2907. break;
  2908. } else if ($$(tmpNode, setting).find("#" + targetObj.id).length > 0) {
  2909. canMove = false;
  2910. break;
  2911. }
  2912. }
  2913. if (canMove && event.target && tools.isChildOrSelf(event.target, targetObj.id + consts.id.A)) {
  2914. tmpTarget = $(targetObj);
  2915. tmpTargetNodeId = targetObj.id;
  2916. }
  2917. }
  2918. //the mouse must be in zTree
  2919. tmpNode = nodes[0];
  2920. if (isTreeInner && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
  2921. //judge mouse move in root of ztree
  2922. if (!tmpTarget && (event.target.id == targetSetting.treeId || isTreeTop || isTreeBottom || isTreeLeft || isTreeRight) && (isOtherTree || (!isOtherTree && tmpNode.parentTId))) {
  2923. tmpTarget = targetSetting.treeObj;
  2924. }
  2925. //auto scroll top
  2926. if (isTop) {
  2927. targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop()-10);
  2928. } else if (isBottom) {
  2929. targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop()+10);
  2930. }
  2931. if (isLeft) {
  2932. targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()-10);
  2933. } else if (isRight) {
  2934. targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()+10);
  2935. }
  2936. //auto scroll left
  2937. if (tmpTarget && tmpTarget != targetSetting.treeObj && tmpTarget.offset().left < targetSetting.treeObj.offset().left) {
  2938. targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()+ tmpTarget.offset().left - targetSetting.treeObj.offset().left);
  2939. }
  2940. }
  2941. curNode.css({
  2942. "top": (event.clientY + docScrollTop + 3) + "px",
  2943. "left": (event.clientX + docScrollLeft + 3) + "px"
  2944. });
  2945. var dX = 0;
  2946. var dY = 0;
  2947. if (tmpTarget && tmpTarget.attr("id")!=targetSetting.treeId) {
  2948. var tmpTargetNode = tmpTargetNodeId == null ? null: data.getNodeCache(targetSetting, tmpTargetNodeId),
  2949. isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy),
  2950. isPrev = !!(preNode && tmpTargetNodeId === preNode.tId),
  2951. isNext = !!(nextNode && tmpTargetNodeId === nextNode.tId),
  2952. isInner = (tmpNode.parentTId && tmpNode.parentTId == tmpTargetNodeId),
  2953. canPrev = (isCopy || !isNext) && tools.apply(targetSetting.edit.drag.prev, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.prev),
  2954. canNext = (isCopy || !isPrev) && tools.apply(targetSetting.edit.drag.next, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.next),
  2955. canInner = (isCopy || !isInner) && !(targetSetting.data.keep.leaf && !tmpTargetNode.isParent) && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.inner);
  2956. function clearMove() {
  2957. tmpTarget = null;
  2958. tmpTargetNodeId = "";
  2959. moveType = consts.move.TYPE_INNER;
  2960. tmpArrow.css({
  2961. "display":"none"
  2962. });
  2963. if (window.zTreeMoveTimer) {
  2964. clearTimeout(window.zTreeMoveTimer);
  2965. window.zTreeMoveTargetNodeTId = null
  2966. }
  2967. }
  2968. if (!canPrev && !canNext && !canInner) {
  2969. clearMove();
  2970. } else {
  2971. var tmpTargetA = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget),
  2972. tmpNextA = tmpTargetNode.isLastNode ? null : $("#" + tmpTargetNode.getNextNode().tId + consts.id.A, tmpTarget.next()),
  2973. tmpTop = tmpTargetA.offset().top,
  2974. tmpLeft = tmpTargetA.offset().left,
  2975. prevPercent = canPrev ? (canInner ? 0.25 : (canNext ? 0.5 : 1) ) : -1,
  2976. nextPercent = canNext ? (canInner ? 0.75 : (canPrev ? 0.5 : 0) ) : -1,
  2977. dY_percent = (event.clientY + docScrollTop - tmpTop)/tmpTargetA.height();
  2978. if ((prevPercent==1 || dY_percent<=prevPercent && dY_percent>=-.2) && canPrev) {
  2979. dX = 1 - tmpArrow.width();
  2980. dY = tmpTop - tmpArrow.height()/2;
  2981. moveType = consts.move.TYPE_PREV;
  2982. } else if ((nextPercent==0 || dY_percent>=nextPercent && dY_percent<=1.2) && canNext) {
  2983. dX = 1 - tmpArrow.width();
  2984. dY = (tmpNextA == null || (tmpTargetNode.isParent && tmpTargetNode.open)) ? (tmpTop + tmpTargetA.height() - tmpArrow.height()/2) : (tmpNextA.offset().top - tmpArrow.height()/2);
  2985. moveType = consts.move.TYPE_NEXT;
  2986. } else if (canInner) {
  2987. dX = 5 - tmpArrow.width();
  2988. dY = tmpTop;
  2989. moveType = consts.move.TYPE_INNER;
  2990. } else {
  2991. clearMove();
  2992. }
  2993. if (tmpTarget) {
  2994. tmpArrow.css({
  2995. "display":"block",
  2996. "top": dY + "px",
  2997. "left": (tmpLeft + dX) + "px"
  2998. });
  2999. tmpTargetA.addClass(consts.node.TMPTARGET_NODE + "_" + moveType);
  3000. if (preTmpTargetNodeId != tmpTargetNodeId || preTmpMoveType != moveType) {
  3001. startTime = (new Date()).getTime();
  3002. }
  3003. if (tmpTargetNode && tmpTargetNode.isParent && moveType == consts.move.TYPE_INNER) {
  3004. var startTimer = true;
  3005. if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId !== tmpTargetNode.tId) {
  3006. clearTimeout(window.zTreeMoveTimer);
  3007. window.zTreeMoveTargetNodeTId = null;
  3008. } else if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId === tmpTargetNode.tId) {
  3009. startTimer = false;
  3010. }
  3011. if (startTimer) {
  3012. window.zTreeMoveTimer = setTimeout(function() {
  3013. if (moveType != consts.move.TYPE_INNER) return;
  3014. if (tmpTargetNode && tmpTargetNode.isParent && !tmpTargetNode.open && (new Date()).getTime() - startTime > targetSetting.edit.drag.autoOpenTime
  3015. && tools.apply(targetSetting.callback.beforeDragOpen, [targetSetting.treeId, tmpTargetNode], true)) {
  3016. view.switchNode(targetSetting, tmpTargetNode);
  3017. if (targetSetting.edit.drag.autoExpandTrigger) {
  3018. targetSetting.treeObj.trigger(consts.event.EXPAND, [targetSetting.treeId, tmpTargetNode]);
  3019. }
  3020. }
  3021. }, targetSetting.edit.drag.autoOpenTime+50);
  3022. window.zTreeMoveTargetNodeTId = tmpTargetNode.tId;
  3023. }
  3024. }
  3025. }
  3026. }
  3027. } else {
  3028. moveType = consts.move.TYPE_INNER;
  3029. if (tmpTarget && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, null], !!targetSetting.edit.drag.inner)) {
  3030. tmpTarget.addClass(consts.node.TMPTARGET_TREE);
  3031. } else {
  3032. tmpTarget = null;
  3033. }
  3034. tmpArrow.css({
  3035. "display":"none"
  3036. });
  3037. if (window.zTreeMoveTimer) {
  3038. clearTimeout(window.zTreeMoveTimer);
  3039. window.zTreeMoveTargetNodeTId = null;
  3040. }
  3041. }
  3042. preTmpTargetNodeId = tmpTargetNodeId;
  3043. preTmpMoveType = moveType;
  3044. setting.treeObj.trigger(consts.event.DRAGMOVE, [event, setting.treeId, nodes]);
  3045. }
  3046. return false;
  3047. }
  3048. doc.bind("mouseup", _docMouseUp);
  3049. function _docMouseUp(event) {
  3050. if (window.zTreeMoveTimer) {
  3051. clearTimeout(window.zTreeMoveTimer);
  3052. window.zTreeMoveTargetNodeTId = null;
  3053. }
  3054. preTmpTargetNodeId = null;
  3055. preTmpMoveType = null;
  3056. doc.unbind("mousemove", _docMouseMove);
  3057. doc.unbind("mouseup", _docMouseUp);
  3058. doc.unbind("selectstart", _docSelect);
  3059. body.css("cursor", "auto");
  3060. if (tmpTarget) {
  3061. tmpTarget.removeClass(consts.node.TMPTARGET_TREE);
  3062. if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV)
  3063. .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER);
  3064. }
  3065. tools.showIfameMask(setting, false);
  3066. roots.showHoverDom = true;
  3067. if (root.dragFlag == 0) return;
  3068. root.dragFlag = 0;
  3069. var i, l, tmpNode;
  3070. for (i=0, l=nodes.length; i<l; i++) {
  3071. tmpNode = nodes[i];
  3072. if (tmpNode.isParent && root.dragNodeShowBefore[tmpNode.tId] && !tmpNode.open) {
  3073. view.expandCollapseNode(setting, tmpNode, !tmpNode.open);
  3074. delete root.dragNodeShowBefore[tmpNode.tId];
  3075. }
  3076. }
  3077. if (curNode) curNode.remove();
  3078. if (tmpArrow) tmpArrow.remove();
  3079. var isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy);
  3080. if (!isCopy && tmpTarget && tmpTargetNodeId && nodes[0].parentTId && tmpTargetNodeId==nodes[0].parentTId && moveType == consts.move.TYPE_INNER) {
  3081. tmpTarget = null;
  3082. }
  3083. if (tmpTarget) {
  3084. var dragTargetNode = tmpTargetNodeId == null ? null: data.getNodeCache(targetSetting, tmpTargetNodeId);
  3085. if (tools.apply(setting.callback.beforeDrop, [targetSetting.treeId, nodes, dragTargetNode, moveType, isCopy], true) == false) {
  3086. view.selectNodes(sourceSetting, nodes);
  3087. return;
  3088. }
  3089. var newNodes = isCopy ? tools.clone(nodes) : nodes;
  3090. function dropCallback() {
  3091. if (isOtherTree) {
  3092. if (!isCopy) {
  3093. for(var i=0, l=nodes.length; i<l; i++) {
  3094. view.removeNode(setting, nodes[i]);
  3095. }
  3096. }
  3097. if (moveType == consts.move.TYPE_INNER) {
  3098. view.addNodes(targetSetting, dragTargetNode, -1, newNodes);
  3099. } else {
  3100. view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex()+1, newNodes);
  3101. }
  3102. } else {
  3103. if (isCopy && moveType == consts.move.TYPE_INNER) {
  3104. view.addNodes(targetSetting, dragTargetNode, -1, newNodes);
  3105. } else if (isCopy) {
  3106. view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex()+1, newNodes);
  3107. } else {
  3108. if (moveType != consts.move.TYPE_NEXT) {
  3109. for (i=0, l=newNodes.length; i<l; i++) {
  3110. view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false);
  3111. }
  3112. } else {
  3113. for (i=-1, l=newNodes.length-1; i<l; l--) {
  3114. view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false);
  3115. }
  3116. }
  3117. }
  3118. }
  3119. view.selectNodes(targetSetting, newNodes);
  3120. var a = $$(newNodes[0], setting).get(0);
  3121. view.scrollIntoView(a);
  3122. setting.treeObj.trigger(consts.event.DROP, [event, targetSetting.treeId, newNodes, dragTargetNode, moveType, isCopy]);
  3123. }
  3124. if (moveType == consts.move.TYPE_INNER && tools.canAsync(targetSetting, dragTargetNode)) {
  3125. view.asyncNode(targetSetting, dragTargetNode, false, dropCallback);
  3126. } else {
  3127. dropCallback();
  3128. }
  3129. } else {
  3130. view.selectNodes(sourceSetting, nodes);
  3131. setting.treeObj.trigger(consts.event.DROP, [event, setting.treeId, nodes, null, null, null]);
  3132. }
  3133. }
  3134. doc.bind("selectstart", _docSelect);
  3135. function _docSelect() {
  3136. return false;
  3137. }
  3138. //Avoid FireFox's Bug
  3139. //If zTree Div CSS set 'overflow', so drag node outside of zTree, and event.target is error.
  3140. if(eventMouseDown.preventDefault) {
  3141. eventMouseDown.preventDefault();
  3142. }
  3143. return true;
  3144. }
  3145. },
  3146. //method of tools for zTree
  3147. _tools = {
  3148. getAbs: function (obj) {
  3149. var oRect = obj.getBoundingClientRect(),
  3150. scrollTop = document.body.scrollTop+document.documentElement.scrollTop,
  3151. scrollLeft = document.body.scrollLeft+document.documentElement.scrollLeft;
  3152. return [oRect.left+scrollLeft,oRect.top+scrollTop];
  3153. },
  3154. inputFocus: function(inputObj) {
  3155. if (inputObj.get(0)) {
  3156. inputObj.focus();
  3157. tools.setCursorPosition(inputObj.get(0), inputObj.val().length);
  3158. }
  3159. },
  3160. inputSelect: function(inputObj) {
  3161. if (inputObj.get(0)) {
  3162. inputObj.focus();
  3163. inputObj.select();
  3164. }
  3165. },
  3166. setCursorPosition: function(obj, pos){
  3167. if(obj.setSelectionRange) {
  3168. obj.focus();
  3169. obj.setSelectionRange(pos,pos);
  3170. } else if (obj.createTextRange) {
  3171. var range = obj.createTextRange();
  3172. range.collapse(true);
  3173. range.moveEnd('character', pos);
  3174. range.moveStart('character', pos);
  3175. range.select();
  3176. }
  3177. },
  3178. showIfameMask: function(setting, showSign) {
  3179. var root = data.getRoot(setting);
  3180. //clear full mask
  3181. while (root.dragMaskList.length > 0) {
  3182. root.dragMaskList[0].remove();
  3183. root.dragMaskList.shift();
  3184. }
  3185. if (showSign) {
  3186. //show mask
  3187. var iframeList = $$("iframe", setting);
  3188. for (var i = 0, l = iframeList.length; i < l; i++) {
  3189. var obj = iframeList.get(i),
  3190. r = tools.getAbs(obj),
  3191. 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);
  3192. dragMask.appendTo($$("body", setting));
  3193. root.dragMaskList.push(dragMask);
  3194. }
  3195. }
  3196. }
  3197. },
  3198. //method of operate ztree dom
  3199. _view = {
  3200. addEditBtn: function(setting, node) {
  3201. if (node.editNameFlag || $$(node, consts.id.EDIT, setting).length > 0) {
  3202. return;
  3203. }
  3204. if (!tools.apply(setting.edit.showRenameBtn, [setting.treeId, node], setting.edit.showRenameBtn)) {
  3205. return;
  3206. }
  3207. var aObj = $$(node, consts.id.A, setting),
  3208. 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>";
  3209. aObj.append(editStr);
  3210. $$(node, consts.id.EDIT, setting).bind('click',
  3211. function() {
  3212. if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeEditName, [setting.treeId, node], true) == false) return false;
  3213. view.editNode(setting, node);
  3214. return false;
  3215. }
  3216. ).show();
  3217. },
  3218. addRemoveBtn: function(setting, node) {
  3219. if (node.editNameFlag || $$(node, consts.id.REMOVE, setting).length > 0) {
  3220. return;
  3221. }
  3222. if (!tools.apply(setting.edit.showRemoveBtn, [setting.treeId, node], setting.edit.showRemoveBtn)) {
  3223. return;
  3224. }
  3225. var aObj = $$(node, consts.id.A, setting),
  3226. 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>";
  3227. aObj.append(removeStr);
  3228. $$(node, consts.id.REMOVE, setting).bind('click',
  3229. function() {
  3230. if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return false;
  3231. view.removeNode(setting, node);
  3232. setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]);
  3233. return false;
  3234. }
  3235. ).bind('mousedown',
  3236. function(eventMouseDown) {
  3237. return true;
  3238. }
  3239. ).show();
  3240. },
  3241. addHoverDom: function(setting, node) {
  3242. if (data.getRoots().showHoverDom) {
  3243. node.isHover = true;
  3244. if (setting.edit.enable) {
  3245. view.addEditBtn(setting, node);
  3246. view.addRemoveBtn(setting, node);
  3247. }
  3248. tools.apply(setting.view.addHoverDom, [setting.treeId, node]);
  3249. }
  3250. },
  3251. cancelCurEditNode: function (setting, forceName, isCancel) {
  3252. var root = data.getRoot(setting),
  3253. nameKey = setting.data.key.name,
  3254. node = root.curEditNode;
  3255. if (node) {
  3256. var inputObj = root.curEditInput,
  3257. newName = forceName ? forceName:(isCancel ? node[nameKey]: inputObj.val());
  3258. if (tools.apply(setting.callback.beforeRename, [setting.treeId, node, newName, isCancel], true) === false) {
  3259. return false;
  3260. }
  3261. node[nameKey] = newName;
  3262. var aObj = $$(node, consts.id.A, setting);
  3263. aObj.removeClass(consts.node.CURSELECTED_EDIT);
  3264. inputObj.unbind();
  3265. view.setNodeName(setting, node);
  3266. node.editNameFlag = false;
  3267. root.curEditNode = null;
  3268. root.curEditInput = null;
  3269. view.selectNode(setting, node, false);
  3270. setting.treeObj.trigger(consts.event.RENAME, [setting.treeId, node, isCancel]);
  3271. }
  3272. root.noSelection = true;
  3273. return true;
  3274. },
  3275. editNode: function(setting, node) {
  3276. var root = data.getRoot(setting);
  3277. view.editNodeBlur = false;
  3278. if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
  3279. setTimeout(function() {tools.inputFocus(root.curEditInput);}, 0);
  3280. return;
  3281. }
  3282. var nameKey = setting.data.key.name;
  3283. node.editNameFlag = true;
  3284. view.removeTreeDom(setting, node);
  3285. view.cancelCurEditNode(setting);
  3286. view.selectNode(setting, node, false);
  3287. $$(node, consts.id.SPAN, setting).html("<input type=text class='rename' id='" + node.tId + consts.id.INPUT + "' treeNode" + consts.id.INPUT + " >");
  3288. var inputObj = $$(node, consts.id.INPUT, setting);
  3289. inputObj.attr("value", node[nameKey]);
  3290. if (setting.edit.editNameSelectAll) {
  3291. tools.inputSelect(inputObj);
  3292. } else {
  3293. tools.inputFocus(inputObj);
  3294. }
  3295. inputObj.bind('blur', function(event) {
  3296. if (!view.editNodeBlur) {
  3297. view.cancelCurEditNode(setting);
  3298. }
  3299. }).bind('keydown', function(event) {
  3300. if (event.keyCode=="13") {
  3301. view.editNodeBlur = true;
  3302. view.cancelCurEditNode(setting);
  3303. } else if (event.keyCode=="27") {
  3304. view.cancelCurEditNode(setting, null, true);
  3305. }
  3306. }).bind('click', function(event) {
  3307. return false;
  3308. }).bind('dblclick', function(event) {
  3309. return false;
  3310. });
  3311. $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED_EDIT);
  3312. root.curEditInput = inputObj;
  3313. root.noSelection = false;
  3314. root.curEditNode = node;
  3315. },
  3316. moveNode: function(setting, targetNode, node, moveType, animateFlag, isSilent) {
  3317. var root = data.getRoot(setting),
  3318. childKey = setting.data.key.children;
  3319. if (targetNode == node) return;
  3320. if (setting.data.keep.leaf && targetNode && !targetNode.isParent && moveType == consts.move.TYPE_INNER) return;
  3321. var oldParentNode = (node.parentTId ? node.getParentNode(): root),
  3322. targetNodeIsRoot = (targetNode === null || targetNode == root);
  3323. if (targetNodeIsRoot && targetNode === null) targetNode = root;
  3324. if (targetNodeIsRoot) moveType = consts.move.TYPE_INNER;
  3325. var targetParentNode = (targetNode.parentTId ? targetNode.getParentNode() : root);
  3326. if (moveType != consts.move.TYPE_PREV && moveType != consts.move.TYPE_NEXT) {
  3327. moveType = consts.move.TYPE_INNER;
  3328. }
  3329. if (moveType == consts.move.TYPE_INNER) {
  3330. if (targetNodeIsRoot) {
  3331. //parentTId of root node is null
  3332. node.parentTId = null;
  3333. } else {
  3334. if (!targetNode.isParent) {
  3335. targetNode.isParent = true;
  3336. targetNode.open = !!targetNode.open;
  3337. view.setNodeLineIcos(setting, targetNode);
  3338. }
  3339. node.parentTId = targetNode.tId;
  3340. }
  3341. }
  3342. //move node Dom
  3343. var targetObj, target_ulObj;
  3344. if (targetNodeIsRoot) {
  3345. targetObj = setting.treeObj;
  3346. target_ulObj = targetObj;
  3347. } else {
  3348. if (!isSilent && moveType == consts.move.TYPE_INNER) {
  3349. view.expandCollapseNode(setting, targetNode, true, false);
  3350. } else if (!isSilent) {
  3351. view.expandCollapseNode(setting, targetNode.getParentNode(), true, false);
  3352. }
  3353. targetObj = $$(targetNode, setting);
  3354. target_ulObj = $$(targetNode, consts.id.UL, setting);
  3355. if (!!targetObj.get(0) && !target_ulObj.get(0)) {
  3356. var ulstr = [];
  3357. view.makeUlHtml(setting, targetNode, ulstr, '');
  3358. targetObj.append(ulstr.join(''));
  3359. }
  3360. target_ulObj = $$(targetNode, consts.id.UL, setting);
  3361. }
  3362. var nodeDom = $$(node, setting);
  3363. if (!nodeDom.get(0)) {
  3364. nodeDom = view.appendNodes(setting, node.level, [node], null, -1, false, true).join('');
  3365. } else if (!targetObj.get(0)) {
  3366. nodeDom.remove();
  3367. }
  3368. if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) {
  3369. target_ulObj.append(nodeDom);
  3370. } else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) {
  3371. targetObj.before(nodeDom);
  3372. } else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) {
  3373. targetObj.after(nodeDom);
  3374. }
  3375. //repair the data after move
  3376. var i,l,
  3377. tmpSrcIndex = -1,
  3378. tmpTargetIndex = 0,
  3379. oldNeighbor = null,
  3380. newNeighbor = null,
  3381. oldLevel = node.level;
  3382. if (node.isFirstNode) {
  3383. tmpSrcIndex = 0;
  3384. if (oldParentNode[childKey].length > 1 ) {
  3385. oldNeighbor = oldParentNode[childKey][1];
  3386. oldNeighbor.isFirstNode = true;
  3387. }
  3388. } else if (node.isLastNode) {
  3389. tmpSrcIndex = oldParentNode[childKey].length -1;
  3390. oldNeighbor = oldParentNode[childKey][tmpSrcIndex - 1];
  3391. oldNeighbor.isLastNode = true;
  3392. } else {
  3393. for (i = 0, l = oldParentNode[childKey].length; i < l; i++) {
  3394. if (oldParentNode[childKey][i].tId == node.tId) {
  3395. tmpSrcIndex = i;
  3396. break;
  3397. }
  3398. }
  3399. }
  3400. if (tmpSrcIndex >= 0) {
  3401. oldParentNode[childKey].splice(tmpSrcIndex, 1);
  3402. }
  3403. if (moveType != consts.move.TYPE_INNER) {
  3404. for (i = 0, l = targetParentNode[childKey].length; i < l; i++) {
  3405. if (targetParentNode[childKey][i].tId == targetNode.tId) tmpTargetIndex = i;
  3406. }
  3407. }
  3408. if (moveType == consts.move.TYPE_INNER) {
  3409. if (!targetNode[childKey]) targetNode[childKey] = new Array();
  3410. if (targetNode[childKey].length > 0) {
  3411. newNeighbor = targetNode[childKey][targetNode[childKey].length - 1];
  3412. newNeighbor.isLastNode = false;
  3413. }
  3414. targetNode[childKey].splice(targetNode[childKey].length, 0, node);
  3415. node.isLastNode = true;
  3416. node.isFirstNode = (targetNode[childKey].length == 1);
  3417. } else if (targetNode.isFirstNode && moveType == consts.move.TYPE_PREV) {
  3418. targetParentNode[childKey].splice(tmpTargetIndex, 0, node);
  3419. newNeighbor = targetNode;
  3420. newNeighbor.isFirstNode = false;
  3421. node.parentTId = targetNode.parentTId;
  3422. node.isFirstNode = true;
  3423. node.isLastNode = false;
  3424. } else if (targetNode.isLastNode && moveType == consts.move.TYPE_NEXT) {
  3425. targetParentNode[childKey].splice(tmpTargetIndex + 1, 0, node);
  3426. newNeighbor = targetNode;
  3427. newNeighbor.isLastNode = false;
  3428. node.parentTId = targetNode.parentTId;
  3429. node.isFirstNode = false;
  3430. node.isLastNode = true;
  3431. } else {
  3432. if (moveType == consts.move.TYPE_PREV) {
  3433. targetParentNode[childKey].splice(tmpTargetIndex, 0, node);
  3434. } else {
  3435. targetParentNode[childKey].splice(tmpTargetIndex + 1, 0, node);
  3436. }
  3437. node.parentTId = targetNode.parentTId;
  3438. node.isFirstNode = false;
  3439. node.isLastNode = false;
  3440. }
  3441. data.fixPIdKeyValue(setting, node);
  3442. data.setSonNodeLevel(setting, node.getParentNode(), node);
  3443. //repair node what been moved
  3444. view.setNodeLineIcos(setting, node);
  3445. view.repairNodeLevelClass(setting, node, oldLevel)
  3446. //repair node's old parentNode dom
  3447. if (!setting.data.keep.parent && oldParentNode[childKey].length < 1) {
  3448. //old parentNode has no child nodes
  3449. oldParentNode.isParent = false;
  3450. oldParentNode.open = false;
  3451. var tmp_ulObj = $$(oldParentNode, consts.id.UL, setting),
  3452. tmp_switchObj = $$(oldParentNode, consts.id.SWITCH, setting),
  3453. tmp_icoObj = $$(oldParentNode, consts.id.ICON, setting);
  3454. view.replaceSwitchClass(oldParentNode, tmp_switchObj, consts.folder.DOCU);
  3455. view.replaceIcoClass(oldParentNode, tmp_icoObj, consts.folder.DOCU);
  3456. tmp_ulObj.css("display", "none");
  3457. } else if (oldNeighbor) {
  3458. //old neigbor node
  3459. view.setNodeLineIcos(setting, oldNeighbor);
  3460. }
  3461. //new neigbor node
  3462. if (newNeighbor) {
  3463. view.setNodeLineIcos(setting, newNeighbor);
  3464. }
  3465. //repair checkbox / radio
  3466. if (!!setting.check && setting.check.enable && view.repairChkClass) {
  3467. view.repairChkClass(setting, oldParentNode);
  3468. view.repairParentChkClassWithSelf(setting, oldParentNode);
  3469. if (oldParentNode != node.parent)
  3470. view.repairParentChkClassWithSelf(setting, node);
  3471. }
  3472. //expand parents after move
  3473. if (!isSilent) {
  3474. view.expandCollapseParentNode(setting, node.getParentNode(), true, animateFlag);
  3475. }
  3476. },
  3477. removeEditBtn: function(setting, node) {
  3478. $$(node, consts.id.EDIT, setting).unbind().remove();
  3479. },
  3480. removeRemoveBtn: function(setting, node) {
  3481. $$(node, consts.id.REMOVE, setting).unbind().remove();
  3482. },
  3483. removeTreeDom: function(setting, node) {
  3484. node.isHover = false;
  3485. view.removeEditBtn(setting, node);
  3486. view.removeRemoveBtn(setting, node);
  3487. tools.apply(setting.view.removeHoverDom, [setting.treeId, node]);
  3488. },
  3489. repairNodeLevelClass: function(setting, node, oldLevel) {
  3490. if (oldLevel === node.level) return;
  3491. var liObj = $$(node, setting),
  3492. aObj = $$(node, consts.id.A, setting),
  3493. ulObj = $$(node, consts.id.UL, setting),
  3494. oldClass = consts.className.LEVEL + oldLevel,
  3495. newClass = consts.className.LEVEL + node.level;
  3496. liObj.removeClass(oldClass);
  3497. liObj.addClass(newClass);
  3498. aObj.removeClass(oldClass);
  3499. aObj.addClass(newClass);
  3500. ulObj.removeClass(oldClass);
  3501. ulObj.addClass(newClass);
  3502. },
  3503. selectNodes : function(setting, nodes) {
  3504. for (var i=0, l=nodes.length; i<l; i++) {
  3505. view.selectNode(setting, nodes[i], i>0);
  3506. }
  3507. }
  3508. },
  3509. _z = {
  3510. tools: _tools,
  3511. view: _view,
  3512. event: _event,
  3513. data: _data
  3514. };
  3515. $.extend(true, $.fn.zTree.consts, _consts);
  3516. $.extend(true, $.fn.zTree._z, _z);
  3517. var zt = $.fn.zTree,
  3518. tools = zt._z.tools,
  3519. consts = zt.consts,
  3520. view = zt._z.view,
  3521. data = zt._z.data,
  3522. event = zt._z.event,
  3523. $$ = tools.$;
  3524. data.exSetting(_setting);
  3525. data.addInitBind(_bindEvent);
  3526. data.addInitUnBind(_unbindEvent);
  3527. data.addInitCache(_initCache);
  3528. data.addInitNode(_initNode);
  3529. data.addInitProxy(_eventProxy);
  3530. data.addInitRoot(_initRoot);
  3531. data.addZTreeTools(_zTreeTools);
  3532. var _cancelPreSelectedNode = view.cancelPreSelectedNode;
  3533. view.cancelPreSelectedNode = function (setting, node) {
  3534. var list = data.getRoot(setting).curSelectedList;
  3535. for (var i=0, j=list.length; i<j; i++) {
  3536. if (!node || node === list[i]) {
  3537. view.removeTreeDom(setting, list[i]);
  3538. if (node) break;
  3539. }
  3540. }
  3541. if (_cancelPreSelectedNode) _cancelPreSelectedNode.apply(view, arguments);
  3542. }
  3543. var _createNodes = view.createNodes;
  3544. view.createNodes = function(setting, level, nodes, parentNode, index) {
  3545. if (_createNodes) {
  3546. _createNodes.apply(view, arguments);
  3547. }
  3548. if (!nodes) return;
  3549. if (view.repairParentChkClassWithSelf) {
  3550. view.repairParentChkClassWithSelf(setting, parentNode);
  3551. }
  3552. }
  3553. var _makeNodeUrl = view.makeNodeUrl;
  3554. view.makeNodeUrl = function(setting, node) {
  3555. return setting.edit.enable ? null : (_makeNodeUrl.apply(view, arguments));
  3556. }
  3557. var _removeNode = view.removeNode;
  3558. view.removeNode = function(setting, node) {
  3559. var root = data.getRoot(setting);
  3560. if (root.curEditNode === node) root.curEditNode = null;
  3561. if (_removeNode) {
  3562. _removeNode.apply(view, arguments);
  3563. }
  3564. }
  3565. var _selectNode = view.selectNode;
  3566. view.selectNode = function(setting, node, addFlag) {
  3567. var root = data.getRoot(setting);
  3568. if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
  3569. return false;
  3570. }
  3571. if (_selectNode) _selectNode.apply(view, arguments);
  3572. view.addHoverDom(setting, node);
  3573. return true;
  3574. }
  3575. var _uCanDo = tools.uCanDo;
  3576. tools.uCanDo = function(setting, e) {
  3577. var root = data.getRoot(setting);
  3578. if (e && (tools.eqs(e.type, "mouseover") || tools.eqs(e.type, "mouseout") || tools.eqs(e.type, "mousedown") || tools.eqs(e.type, "mouseup"))) {
  3579. return true;
  3580. }
  3581. if (root.curEditNode) {
  3582. view.editNodeBlur = false;
  3583. root.curEditInput.focus();
  3584. }
  3585. return (!root.curEditNode) && (_uCanDo ? _uCanDo.apply(view, arguments) : true);
  3586. }
  3587. })(jQuery);