From f492c6bb9e1a22ade9de87ef87169738d9e188a1 Mon Sep 17 00:00:00 2001
From: liangGe <my601426@foxmail.com>
Date: Thu, 17 May 2018 21:03:51 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ztree=E7=9A=843.5.33=E7=89=88?=
 =?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 libs/ztree/3.5.33/css/demo.css                |   33 +
 .../3.5.33/css/zTreeStyle/img/diy/1_close.png |  Bin 0 -> 601 bytes
 .../3.5.33/css/zTreeStyle/img/diy/1_open.png  |  Bin 0 -> 580 bytes
 .../ztree/3.5.33/css/zTreeStyle/img/diy/2.png |  Bin 0 -> 570 bytes
 .../ztree/3.5.33/css/zTreeStyle/img/diy/3.png |  Bin 0 -> 762 bytes
 .../ztree/3.5.33/css/zTreeStyle/img/diy/4.png |  Bin 0 -> 399 bytes
 .../ztree/3.5.33/css/zTreeStyle/img/diy/5.png |  Bin 0 -> 710 bytes
 .../ztree/3.5.33/css/zTreeStyle/img/diy/6.png |  Bin 0 -> 432 bytes
 .../ztree/3.5.33/css/zTreeStyle/img/diy/7.png |  Bin 0 -> 534 bytes
 .../ztree/3.5.33/css/zTreeStyle/img/diy/8.png |  Bin 0 -> 529 bytes
 .../ztree/3.5.33/css/zTreeStyle/img/diy/9.png |  Bin 0 -> 467 bytes
 .../3.5.33/css/zTreeStyle/img/line_conn.gif   |  Bin 0 -> 45 bytes
 .../3.5.33/css/zTreeStyle/img/loading.gif     |  Bin 0 -> 381 bytes
 .../css/zTreeStyle/img/zTreeStandard.gif      |  Bin 0 -> 5564 bytes
 .../css/zTreeStyle/img/zTreeStandard.png      |  Bin 0 -> 11173 bytes
 .../3.5.33/css/zTreeStyle/zTreeStyle.css      |   97 +
 libs/ztree/3.5.33/js/jquery.ztree.all.js      | 3821 +++++++++++++++++
 libs/ztree/3.5.33/js/jquery.ztree.all.min.js  |  167 +
 libs/ztree/3.5.33/js/jquery.ztree.core.js     | 1981 +++++++++
 libs/ztree/3.5.33/js/jquery.ztree.core.min.js |   76 +
 libs/ztree/3.5.33/js/jquery.ztree.excheck.js  |  644 +++
 .../3.5.33/js/jquery.ztree.excheck.min.js     |   34 +
 libs/ztree/3.5.33/js/jquery.ztree.exedit.js   | 1195 ++++++
 .../3.5.33/js/jquery.ztree.exedit.min.js      |   53 +
 libs/ztree/3.5.33/js/jquery.ztree.exhide.js   |  399 ++
 .../3.5.33/js/jquery.ztree.exhide.min.js      |   23 +
 libs/ztree/package.json                       |    4 +-
 27 files changed, 8525 insertions(+), 2 deletions(-)
 create mode 100644 libs/ztree/3.5.33/css/demo.css
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/1_close.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/1_open.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/2.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/3.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/4.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/5.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/6.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/7.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/8.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/diy/9.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/line_conn.gif
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/loading.gif
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/zTreeStandard.gif
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/img/zTreeStandard.png
 create mode 100644 libs/ztree/3.5.33/css/zTreeStyle/zTreeStyle.css
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.all.js
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.all.min.js
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.core.js
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.core.min.js
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.excheck.js
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.excheck.min.js
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.exedit.js
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.exedit.min.js
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.exhide.js
 create mode 100644 libs/ztree/3.5.33/js/jquery.ztree.exhide.min.js

diff --git a/libs/ztree/3.5.33/css/demo.css b/libs/ztree/3.5.33/css/demo.css
new file mode 100644
index 000000000..f6dba0de8
--- /dev/null
+++ b/libs/ztree/3.5.33/css/demo.css
@@ -0,0 +1,33 @@
+html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {
+	margin: 0;padding: 0;border: 0;outline: 0;font-weight: inherit;font-style: inherit;font-size: 100%;font-family: inherit;vertical-align: baseline;}
+body {color: #2f332a;font: 15px/21px Arial, Helvetica, simsun, sans-serif;background: #f0f6e4 \9;}
+h1, h2, h3, h4, h5, h6 {color: #2f332a;font-weight: bold;font-family: Helvetica, Arial, sans-serif;padding-bottom: 5px;}
+h1 {font-size: 24px;line-height: 34px;text-align: center;}
+h2 {font-size: 14px;line-height: 24px;padding-top: 5px;}
+h6 {font-weight: normal;font-size: 12px;letter-spacing: 1px;line-height: 24px;text-align: center;}
+a {color:#3C6E31;text-decoration: underline;}
+a:hover {background-color:#3C6E31;color:white;}
+input.radio {margin: 0 2px 0 8px;}
+input.radio.first {margin-left:0;}
+input.empty {color: lightgray;}
+code {color: #2f332a;}
+.highlight_red {color:#A60000;}
+.highlight_green {color:#A7F43D;}
+li {list-style: circle;font-size: 12px;}
+li.title {list-style: none;}
+ul.list {margin-left: 17px;}
+
+div.content_wrap {width: 600px;height:380px;}
+div.content_wrap div.left{float: left;width: 250px;}
+div.content_wrap div.right{float: right;width: 340px;}
+div.zTreeDemoBackground {width:250px;height:362px;text-align:left;}
+
+ul.ztree {margin-top: 10px;border: 1px solid #617775;background: #f0f6e4;width:220px;height:360px;overflow-y:scroll;overflow-x:auto;}
+ul.log {border: 1px solid #617775;background: #f0f6e4;width:300px;height:170px;overflow: hidden;}
+ul.log.small {height:45px;}
+ul.log li {color: #666666;list-style: none;padding-left: 10px;}
+ul.log li.dark {background-color: #E3E3E3;}
+
+/* ruler */
+div.ruler {height:20px; width:220px; background-color:#f0f6e4;border: 1px solid #333; margin-bottom: 5px; cursor: pointer}
+div.ruler div.cursor {height:20px; width:30px; background-color:#3C6E31; color:white; text-align: right; padding-right: 5px; cursor: pointer}
\ No newline at end of file
diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/1_close.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/1_close.png
new file mode 100644
index 0000000000000000000000000000000000000000..68ccb3c3b90170df7cddab1fe6e8e455c3854573
GIT binary patch
literal 601
zcmV-f0;c_mP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ--$_J4RCwB?l0Qh?U>Jv=3mDW`xPoRlZg47s^hk#c>Tuv92pw){9g3YCdL5hu
zPl^tKlA{iS!zGjsQlXPxhk_ub9SW5~g#>Fr4ipy;F_I1%TS(#S(A+iGdab2D_=ey2
zzVGw>dEXSV48y1Z#n@V})Z4_~`uO11LoSgJ;-@hTLj*w}f*=rgmR<_oc7z)Vq1%qo
zZKu)>ASE|^-{;BuBM!UznV-=3a02ra8bGlfqy_NQ3wd+&joE_6egI#-!hQg=h4zpp
z;M296ygNxTJ+86mLvIJXc<s{L0ee17k6#Xv0Cd}_9Cr0HHLBqqNA$_Cyy23QKeN2y
z(kFv=95FTeJ4A|2adLQ&-TFD1PI&g#C9gu|-Uxa1htG7vZvC9e;lUP&1Qh4SavYq7
zWP2o5w>(C!M=TaJWLajhppjQ$b;~2$BXMvVGB=iMv=}M6I9o9{cNofcv$kC$ufoz@
zz2&1CkhSd^L)mW3%^jkPvz10%8Ca;U>$W3is*d=RW~z?RZAT0&RM!C|IY^3Wnk~te
zWi?k)rfCX5`E`)ObUMvd6z7G_E(jr7XZi|C)=2!PQos#>QmOPvQIz|CD+t5zdAVGE
n9N(mtO2jh%aB#ixl<xxoAD#<CO})Ct00000NkvXXu0mjfc)0@d

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/1_open.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/1_open.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6ff36d3a99012028c6cf3d4009719108e31bc79
GIT binary patch
literal 580
zcmV-K0=xZ*P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ-%1J~)RCwB?lCeu0Q5?rVIibtp5L74?1Q$6a(r!ngUGf(c7duF)D8;MGL5C9B
zI3&~?dP1k@kYI4B4iOhq=+db}N8|9$61XK6ONK(|@rtRu4tGiK#I%-v;rQ`=zu)ik
z?!EU*5y^3!5@1Dk^TF2xBELEP=F?NIkW%WmaU4fUDV3B`)pHM(uuY{pCra3+61G_y
z1kmCO?RJ~i+jS<TkFi>SlaFBpYY-#>`2McM&&GR<Cokcw2|py9HA6oD(g)n`9FY<q
zFdjdHmVn_gyxI;7k3ma>>sLTD0AZV@N$F$EuYi9XHdi<JcJmHibt8oM$6@{wM2n1N
z%q?=^H(+EOZ*L1SS?)d$qqnyOBja574UD<P1VjTYV|k79(<Vcs6L|aEbf@lPEUg2C
zF_XpH-)3lZg7ecR#`0S4iP1W;TlLBXZcN|9tM5W4%dGV}aZ!CpeK)Kt7wE`twU^fq
z7iMb0HkByn)So2EIVEgU9WKn&06jiPy6d`$;!35`|Kf68R{{FvK?>68G}lp77xZ62
zDV3b*Ybf5M@t;ZoQvmsV{)MjVkN(yW1i?<RSbP=z$>&rock3TE{?a?juK@rdhYW4p
S$5p2Q0000<MNUMnLSTZ!E&BWb

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/2.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..9eff506ba391fa1ddf0dc44d02ae84403700321b
GIT binary patch
literal 570
zcmV-A0>%A_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ-z)3_wRCwBqlR;<`Q4of|=SoN-iXiB%SaR=4qz6IqX2`+Af>f~AQhE}Eig@Tj
zBzy8wOX*!fcWJ>?1hHVChd?QzUbR+3TN0sbpvl_ZyxsAj8?v~O{P36=X8!-p%;PB$
z!LqDbphyY|g+j?RO~o*X2<39QB12%?w%E2UB0}0Z#RxD>6UT8REjN<D|3pR-a2yB6
zabiCqa(a}T2Vq&(`p^!dDC#d~(2wK2wdY)StEJj}QEKzWrBs114AENmt=5`eugBNb
zMOwADOy0ZC)#(QSv;T|`MNz^kr4SJsZ<cYl-!nNiNBH9#P0vr?LELs2hJEt>`U>s(
zhd*TZkOSA{aI4BsFL;p{AtuIc`@T=3vYbjjXnU*0#f_PSKs<jC1bCju=j}&)KY7a8
zn->U=kNV^<ezs|@RHuP%Vg$o5$mMcmG8yvuJUjcZxpn6y?_S;I*STZ#RsiEy*lihg
zSnDQs(CKtOT9%b~?}>|)04A<I=F{dAj{F<V-Ih_;T5k;2DG@;_l?BcN**LMZkbQP}
zEO#4Vui;nb7QBam3$%fgcyCH1^^c&GIs;t#8@5EGn^yOG0KA+x0a;!{!vFvP07*qo
IM6N<$f(T^&Q2+n{

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/3.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7ba6d0c675c35197e2dae8a379155e67c0ac6cb
GIT binary patch
literal 762
zcmV<W0tNkvP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ;fJsC_RCwBqlif?xQ5eTRd)1}e+J1_fPBt@8o9(K!Cc-2TCJ0g&UIbkV;>Ciz
z_7AWNMc93KlTaWAV@cSBY1&5W$R<+0;PS1UKbI)(<#)PpMy`wwJe&j1_w(gE&v}k2
z65wB}F1vraNT9wbk&tm3Ei4)>EGA@}|6`y5dVqQWwVDpA&5PCMMXjbItEtawG=CVJ
z9MMx*=N>XjM3f}MIxTG`sST6VhE7YHl4RH@5vi<m51ky*bH-`U4xw2>MYbvIx89MA
zzj*L%?Fr<i0Vu1cq1g7gL2tds+WXstW(hTUa&FMw&s;Rjcyez9z0pj$(+8<Aq{5Wf
z`p_HAB=<&$h8gefXD+t{$NVThi$u}x`T%5BAr*quN;X1}S!H)^0E<M?{3t%a0iX&!
zr^;Ny7pcNcp``_#K8}){1>~H5Uq-EOAeFRoxIe*OY>I;&u4=cxVz8Ei5NVXm57J4Q
z%*l69;yLe?MuUu!(IG?{jS9BEVo(7(cLj~!Rvun=;&C-nRbsCponAV}Yqd4(#Fkii
z%gW+M-UMFpbSlOSfC?}G#X&zoIo2)`n=Wy%AqjaEA+I71HYAbQbO|}uE`ol7Kyj8)
zX(IsyaD14cwxpa^gVDob{3VI)1uSLNpwSYKEnzBkQE2sWt$wU^`Wd!D6Ccjafuhiq
zXO>uxJmU2jp|UGjJooFW0p@3xK5uPK?B8vlxOvGep=|6m!Knd}z-a&l{$Bd>p%ZZU
zdl}q{+QnAXF8sX=0*-v>^!L&S6#U|TGtdDA+1k`yEi^ArB9<o+T`e?cXU34#=*~FR
sMc?^`7lXH!I{<+w(~$tjf7AUO04L%4aE%4U;s5{u07*qoM6N<$g6RfPVE_OC

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/4.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..753e2bfd5725b1f32cda4e41c36a448a4b12c280
GIT binary patch
literal 399
zcmV;A0dW3_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ-6-h)vRCwB)kwHqtFc^hDO9exv%xrssDR_YP3KH}P>AHeo4<H_3_7#`y9ZFB&
z2}YPMXVs-JMUbxILYisER_i?Y7x`Xzc}dQ+)^y7AJOyIlIf|mYj%QhBxKhe+01Kc>
z!n8_44a7<*fOz{5=x+MFN<v*FVLAu^V*l}_AB=zhWM;s>_r=}XHqLH?*Vg2Dj@Q<(
zsf^{d?t$;DLEs_45(LYZkIyZa%L_PnjWytw_!&?yR*<a?+%v8{z-vjpSmE~r-mh*5
zu2Y((;V-$a%Uf9v8weqA90$j7m?I$s$G<R8Q50sn^^`^fq?AZ0XSK1X8qAeFWz210
tO&R?+_;-Wj(|>DYpK|Z9fLl(~*8t4{WR}t?Us?bF002ovPDHLkV1l&kqKg0k

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/5.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c5eccd562c303cf5197629ef5f2666b6180bd48
GIT binary patch
literal 710
zcmV;%0y+JOP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ;Oi4sRRCwB?l21sJaTv!xzis}To8;O?C>{dC{zy=SO6rn?>JoVfJ9PB0!cw|<
z5rY2EH4^INrK0lE$(TB`L1J|?w{{RVwVX+{e0A>6yZ3#69o{*#LV~{V{P^<lJfGk5
z`y-^32q6H7wl)s{R{<;V@X+-8JB56IA+HzmLjY1rY!nn}YkE}M*6w%uIsrj?CUiR@
zWF0_VyU$<Q>I2<iJ@n>5M99V?Z$DfCOu%f*iEi)VM!&PQ0~X={*pIhRm&^JADx2Ei
zO9FtZ)17!zihou!LclW{fUsJ6-KRQWX%RLy%#rdc&iw~WzZ8c|*7UlD+t<NLB-~pB
zSS81>m4dPcnr0SiDoFEg5E2Y&dPN717pvrG@d&~qN)SLk2YQ}eWhnzS2NsMXU@e;q
z$#1J?MTrek>$@}ysIbH4Pn4|s4!{BsRg~ey@o{jwK^l-v|2=daTrL(~1&Auja1qcm
zA0Pb~i;esUhr#VZ*EO_EW=H6T4sH+MBVlG^vFAPW@zEjxNMD$XUVj}71~yd{>Do))
z&``4()NF>lp&_eXY~*rG1t$YtbJ2bvy&WKdWa#Vaz0czlsCFm9?LkALArT%gs@=iz
zM3Aw>%3UB?=s|4%%0TI@ntc}!?y2fKbE&)8wwW?tw9>)Yi;<a6Ys&qbiPe{Yy7iUK
zWv9w-cwAji8tSK#g99=-I3OQ4)KB(#s?P)E+Y6<Xe@w8YvdfN&ljmw`uK@%S%R^67
sndz;a{{;Y03OEWr^?UOU!2jsi07+OLTDf7<mH+?%07*qoM6N<$g01B^zyJUM

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/6.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..070b8352d7770e6be4b6f3cbc61f7ee21ae3e4da
GIT binary patch
literal 432
zcmV;h0Z;ykP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ-Hc3Q5RCwBylf6#EFcgKqR*|SEf;KdQN{mQMNM#6bz*E3p!3*#TJOP9q=I%T}
z)g_1#i3ub?3{8Itwu2ecv`#4@J&R@g=<~Vv$_3Z+FM(5**Hx$4IK%aP-43;Gb+vXq
zUuVhneBJ75-43T-EP$6WJoRVj!|QthI?cwfXCHeI>Dj&rpcKd`Uv3%2{zO&+5OQ|7
z=;cI0rUAu-Dnz~nLZs7L08+*mb;p_3zesh*i2-sBFdS=wK}gNEso8dBf?)8;uvD5$
zpcK!qZv_3`za>=GH`uH0qya)Hf_^WvdFF_P+D<ny$~(h}Ouq&2WgM7I{40^^j}t`S
zDZ^U1nw`M#7XfxRS5k(9`f4V?^cVIo?rusI=Xlw#7zQ7=59dcG1)vOUP1d{`0q<Jt
a(a!)<XRHuJk}`<^0000<MNUMnLSTZ`D6YN$

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/7.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..532b037f2045cfa26c62d23cb928ff7405f6fc18
GIT binary patch
literal 534
zcmV+x0_pvUP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ-oJmAMRCwCNld)>sP!xtg$;P&DX##d?FjXy#1Btu@<1TrIE}b(6+V0u<0C|G+
z1!6E{h#^zPfVNUH1)Si?mq44L)RLtur52}yf<x3LX@>rAIB@yT&wtK6#}E;o1CwW>
zs0MEifRF!B`^DaweqwrPizJsaJ+ws@N@V7V{5<_TW}e7G$pgN~T?_h(db5KXZbM-X
z@i~OveZ=Qbn4^Z<)SDg9SGgG&F_ybUT3JJlcA@4#C4%DjEY}>=XqU9IhUIR75$6O7
z8YIQ(_la3W9qobDhNK8q8+Eit%qmX550Ym5hYkYx{R_;P^`1+ZR#BsUc>NAF+9yn_
ztoK|n<BVqnIe|q4+6V1(;hoWPYWPVRHT-~|lxaCNF1)iPhedS%joA=G2xh49gl=yW
zfOe;WKTl}CC}UMibbFhquivmYI<OMv9NcQuctW$)Ak_h>4k(!k^_NgGljU2p)j*9W
zaI13;R$T12?;o{2_N$D)6u7>L2Aq7}dD;>lbA1yHY`_4jK;tey79sFML_*`gU*n$v
Y0CUjIYVM#Hl>h($07*qoM6N<$g3L4G@&Et;

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/8.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8f3a86e7091de4acdd38745f74b30f0f3d40f9e
GIT binary patch
literal 529
zcmV+s0`C2ZP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ-mq|oHRCwB?ld(!1Q51&1(I{htpn+Xo2nhiLK7gQ=rA<m9k(fqEGv)!TQ|1AZ
zG{H34#s{$2CrFXP%9X?*iGdg=ggYa5?%X@Ods5ulQQU<M_`~qS$KjvzAGm>ta1-4c
z23I~Dy#=Bx=-sES#qFU9A~NtT@3!SYME0%7fru>cwq@9yhz#EV;MBm^6uNgtR8Xr=
z2i9fl6|Mue0M{9PgJ@>&J^Va_d-JF#FCqZvz~tbj{^y9_PT}y_|FTqGfU(|32N(ld
zdoN`zWX3zdQtSRe)z51`wtYaRAywY{0S-(qSQqqB^m^?LF~6wMV5jvm0?L4k3s8yo
zD*>6YSQl38yF2Ej`-O+&`dWo7gEaA8Rp?@@!`g|8C0WWJ_m{hqX~o6>&}D$W3~-$S
zV;!z@c}1laaT=qvy0*ci2asppOD)WX6h)7P*^pMr>b(YuB-DG2YA$FmJ^na9HNDvf
zXGS+Sp6w9M)GC&%xasQa+^&Tc%i_FwxOx6O0H%St(lzkAoEgbPL<cv0&i@7g-7o8#
TvKs+f00000NkvXXu0mjf2!!YZ

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/diy/9.png b/libs/ztree/3.5.33/css/zTreeStyle/img/diy/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..4db73cd41c95bc74496175625ce9ed3737e599f5
GIT binary patch
literal 467
zcmV;^0WAKBP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkOAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd
zMgRZ-SxH1eRCwCFlD%phK@^3*HCYugNa+j-+qg=ez>lIrt6Er<-ysj+R54r6Ea(-|
zq;X*c?zeMmf*6eCC_6h695=JJ71{U?e45KW_s-#5&LjXuQTzlBfs@f_G?s+5w&eg$
zhQs057_-6Uc|IlzNRo=85P&3%F=}Cq5wOKcVuv^4*#fPL|MB6ehpW|!JkK}!G)<o`
zkfte%#ext5olb{tx4Y>eCUA?`kDYU+wRQl|@AsL{=k$6#thE3*=Sl#oqXX&kO!|GS
z@au=FqXS6-*ah~DF{<lYRaL33>o$>nU{_K+;olW3X86D1zL_O(0T4pKdrt_r^NSay
z@PGjCE6_9z-g}y+dE_5_`V3#b@v&aP`RUeDmSwEhYqBic7MNZ8lJBEIOU$l)`Ssp{
zbFQ3BCIf)!bb1$GL=xlLi**V7k+e*bq}|z?$BHD9nE9)5GXRrS-uaN7-+2H4002ov
JPDHLkV1iKO%vb;b

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/line_conn.gif b/libs/ztree/3.5.33/css/zTreeStyle/img/line_conn.gif
new file mode 100644
index 0000000000000000000000000000000000000000..d561d36a915776730eb3069cee4c949f027667ed
GIT binary patch
literal 45
xcmZ?wbhEHb<YZuCXkcJCbLPzd|Nj+#vM@3*Ff!;c00Bsbfr+K3KQn;A8UP?x3jqKC

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/loading.gif b/libs/ztree/3.5.33/css/zTreeStyle/img/loading.gif
new file mode 100644
index 0000000000000000000000000000000000000000..e8c289293b11c889703d83dce6631fce90da4630
GIT binary patch
literal 381
zcmZ?wbhEHb6krfwSj5I~=*GvEjZcb~Jveda^Z5r~o`3lD|Nnmm1_s6d+<vYh!Oo5W
zu10zW%#0wRpDe6g3~UTKKsHdb00RTFLB=lEtp-v?9We?Fm*e^y1ze`Erb>T_)p@)n
z{^qIIq1(T$e$~zMQ}6t1w^a|Cj;Amo3}FHq!p^`7G=x7ROJIXqM}S9S9}m;(SWbi*
zHiVjpkZW$u7K<e~64(Tvu_CGAVqgNA!VWY?AR;8qWQpdrELO%X3QmU|kSqf^8>%QH
zEX1o><JlA@#uW;O&Uzs!Vq@S!xX5*D8xIpxf?fv$ii?;KYB(6Li78nuj!;aU<oHY%
b$wdqZ%QzU*6c++rq`Sn#$m6gp6N5DXy8K|j

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/zTreeStandard.gif b/libs/ztree/3.5.33/css/zTreeStyle/img/zTreeStandard.gif
new file mode 100644
index 0000000000000000000000000000000000000000..50c94fd41ef9f1f7c07442d669923fd7a3226f55
GIT binary patch
literal 5564
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
Ap8x;=

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/img/zTreeStandard.png b/libs/ztree/3.5.33/css/zTreeStyle/img/zTreeStandard.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffda01ef1cccc398ee4e2327f4093ba1130a4961
GIT binary patch
literal 11173
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
X3wf1`XyoU;TL_tNiW1dgpn(4aGkUu%

literal 0
HcmV?d00001

diff --git a/libs/ztree/3.5.33/css/zTreeStyle/zTreeStyle.css b/libs/ztree/3.5.33/css/zTreeStyle/zTreeStyle.css
new file mode 100644
index 000000000..4a1705b14
--- /dev/null
+++ b/libs/ztree/3.5.33/css/zTreeStyle/zTreeStyle.css
@@ -0,0 +1,97 @@
+/*-------------------------------------
+zTree Style
+
+version:	3.5.19
+author:		Hunter.z
+email:		hunter.z@263.net
+website:	http://code.google.com/p/jquerytree/
+
+-------------------------------------*/
+
+.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif}
+.ztree {margin:0; padding:5px; color:#333}
+.ztree li{padding:0; margin:0; list-style:none; line-height:14px; text-align:left; white-space:nowrap; outline:0}
+.ztree li ul{ margin:0; padding:0 0 0 18px}
+.ztree li ul.line{ background:url(./img/line_conn.gif) 0 0 repeat-y;}
+
+.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent;
+	text-decoration:none; vertical-align:top; display: inline-block}
+.ztree li a:hover {text-decoration:underline}
+.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid;
+	opacity:0.8; filter:alpha(opacity=80)}
+.ztree li a.tmpTargetNode_prev {}
+.ztree li a.tmpTargetNode_next {}
+.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
+	font-size:12px; border:1px #7EC4CC solid; *border:0px}
+.ztree li span {line-height:16px; margin-right:2px}
+.ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle;
+	border:0 none; cursor: pointer;outline:none;
+	background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+	background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
+
+.ztree li span.button.chk {width:13px; height:13px; margin:0 3px 0 0; cursor: auto}
+.ztree li span.button.chk.checkbox_false_full {background-position:0 0}
+.ztree li span.button.chk.checkbox_false_full_focus {background-position:0 -14px}
+.ztree li span.button.chk.checkbox_false_part {background-position:0 -28px}
+.ztree li span.button.chk.checkbox_false_part_focus {background-position:0 -42px}
+.ztree li span.button.chk.checkbox_false_disable {background-position:0 -56px}
+.ztree li span.button.chk.checkbox_true_full {background-position:-14px 0}
+.ztree li span.button.chk.checkbox_true_full_focus {background-position:-14px -14px}
+.ztree li span.button.chk.checkbox_true_part {background-position:-14px -28px}
+.ztree li span.button.chk.checkbox_true_part_focus {background-position:-14px -42px}
+.ztree li span.button.chk.checkbox_true_disable {background-position:-14px -56px}
+.ztree li span.button.chk.radio_false_full {background-position:-28px 0}
+.ztree li span.button.chk.radio_false_full_focus {background-position:-28px -14px}
+.ztree li span.button.chk.radio_false_part {background-position:-28px -28px}
+.ztree li span.button.chk.radio_false_part_focus {background-position:-28px -42px}
+.ztree li span.button.chk.radio_false_disable {background-position:-28px -56px}
+.ztree li span.button.chk.radio_true_full {background-position:-42px 0}
+.ztree li span.button.chk.radio_true_full_focus {background-position:-42px -14px}
+.ztree li span.button.chk.radio_true_part {background-position:-42px -28px}
+.ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px}
+.ztree li span.button.chk.radio_true_disable {background-position:-42px -56px}
+
+.ztree li span.button.switch {width:18px; height:18px}
+.ztree li span.button.root_open{background-position:-92px -54px}
+.ztree li span.button.root_close{background-position:-74px -54px}
+.ztree li span.button.roots_open{background-position:-92px 0}
+.ztree li span.button.roots_close{background-position:-74px 0}
+.ztree li span.button.center_open{background-position:-92px -18px}
+.ztree li span.button.center_close{background-position:-74px -18px}
+.ztree li span.button.bottom_open{background-position:-92px -36px}
+.ztree li span.button.bottom_close{background-position:-74px -36px}
+.ztree li span.button.noline_open{background-position:-92px -72px}
+.ztree li span.button.noline_close{background-position:-74px -72px}
+.ztree li span.button.root_docu{ background:none;}
+.ztree li span.button.roots_docu{background-position:-56px 0}
+.ztree li span.button.center_docu{background-position:-56px -18px}
+.ztree li span.button.bottom_docu{background-position:-56px -36px}
+.ztree li span.button.noline_docu{ background:none;}
+
+.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle}
+
+.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+
+ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
+
+span.tmpzTreeMove_arrow {width:16px; height:16px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute;
+	background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+	background-position:-110px -80px; background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
+
+ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)}
+.zTreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute}
+
+/* level style*/
+/*.ztree li span.button.level0 {
+	display:none;
+}
+.ztree li ul.level0 {
+	padding:0;
+	background:none;
+}*/
\ No newline at end of file
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.all.js b/libs/ztree/3.5.33/js/jquery.ztree.all.js
new file mode 100644
index 000000000..c5106ec03
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.all.js
@@ -0,0 +1,3821 @@
+
+/*
+ * JQuery zTree core v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function ($) {
+    var settings = {}, roots = {}, caches = {},
+        //default consts of core
+        _consts = {
+            className: {
+                BUTTON: "button",
+                LEVEL: "level",
+                ICO_LOADING: "ico_loading",
+                SWITCH: "switch",
+                NAME: 'node_name'
+            },
+            event: {
+                NODECREATED: "ztree_nodeCreated",
+                CLICK: "ztree_click",
+                EXPAND: "ztree_expand",
+                COLLAPSE: "ztree_collapse",
+                ASYNC_SUCCESS: "ztree_async_success",
+                ASYNC_ERROR: "ztree_async_error",
+                REMOVE: "ztree_remove",
+                SELECTED: "ztree_selected",
+                UNSELECTED: "ztree_unselected"
+            },
+            id: {
+                A: "_a",
+                ICON: "_ico",
+                SPAN: "_span",
+                SWITCH: "_switch",
+                UL: "_ul"
+            },
+            line: {
+                ROOT: "root",
+                ROOTS: "roots",
+                CENTER: "center",
+                BOTTOM: "bottom",
+                NOLINE: "noline",
+                LINE: "line"
+            },
+            folder: {
+                OPEN: "open",
+                CLOSE: "close",
+                DOCU: "docu"
+            },
+            node: {
+                CURSELECTED: "curSelectedNode"
+            }
+        },
+        //default setting of core
+        _setting = {
+            treeId: "",
+            treeObj: null,
+            view: {
+                addDiyDom: null,
+                autoCancelSelected: true,
+                dblClickExpand: true,
+                expandSpeed: "fast",
+                fontCss: {},
+                nameIsHTML: false,
+                selectedMulti: true,
+                showIcon: true,
+                showLine: true,
+                showTitle: true,
+                txtSelectedEnable: false
+            },
+            data: {
+                key: {
+                    isParent: "isParent",
+                    children: "children",
+                    name: "name",
+                    title: "",
+                    url: "url",
+                    icon: "icon"
+                },
+                simpleData: {
+                    enable: false,
+                    idKey: "id",
+                    pIdKey: "pId",
+                    rootPId: null
+                },
+                keep: {
+                    parent: false,
+                    leaf: false
+                }
+            },
+            async: {
+                enable: false,
+                contentType: "application/x-www-form-urlencoded",
+                type: "post",
+                dataType: "text",
+                url: "",
+                autoParam: [],
+                otherParam: [],
+                dataFilter: null
+            },
+            callback: {
+                beforeAsync: null,
+                beforeClick: null,
+                beforeDblClick: null,
+                beforeRightClick: null,
+                beforeMouseDown: null,
+                beforeMouseUp: null,
+                beforeExpand: null,
+                beforeCollapse: null,
+                beforeRemove: null,
+
+                onAsyncError: null,
+                onAsyncSuccess: null,
+                onNodeCreated: null,
+                onClick: null,
+                onDblClick: null,
+                onRightClick: null,
+                onMouseDown: null,
+                onMouseUp: null,
+                onExpand: null,
+                onCollapse: null,
+                onRemove: null
+            }
+        },
+        //default root of core
+        //zTree use root to save full data
+        _initRoot = function (setting) {
+            var r = data.getRoot(setting);
+            if (!r) {
+                r = {};
+                data.setRoot(setting, r);
+            }
+            data.nodeChildren(setting, r, []);
+            r.expandTriggerFlag = false;
+            r.curSelectedList = [];
+            r.noSelection = true;
+            r.createdNodes = [];
+            r.zId = 0;
+            r._ver = (new Date()).getTime();
+        },
+        //default cache of core
+        _initCache = function (setting) {
+            var c = data.getCache(setting);
+            if (!c) {
+                c = {};
+                data.setCache(setting, c);
+            }
+            c.nodes = [];
+            c.doms = [];
+        },
+        //default bindEvent of core
+        _bindEvent = function (setting) {
+            var o = setting.treeObj,
+                c = consts.event;
+            o.bind(c.NODECREATED, function (event, treeId, node) {
+                tools.apply(setting.callback.onNodeCreated, [event, treeId, node]);
+            });
+
+            o.bind(c.CLICK, function (event, srcEvent, treeId, node, clickFlag) {
+                tools.apply(setting.callback.onClick, [srcEvent, treeId, node, clickFlag]);
+            });
+
+            o.bind(c.EXPAND, function (event, treeId, node) {
+                tools.apply(setting.callback.onExpand, [event, treeId, node]);
+            });
+
+            o.bind(c.COLLAPSE, function (event, treeId, node) {
+                tools.apply(setting.callback.onCollapse, [event, treeId, node]);
+            });
+
+            o.bind(c.ASYNC_SUCCESS, function (event, treeId, node, msg) {
+                tools.apply(setting.callback.onAsyncSuccess, [event, treeId, node, msg]);
+            });
+
+            o.bind(c.ASYNC_ERROR, function (event, treeId, node, XMLHttpRequest, textStatus, errorThrown) {
+                tools.apply(setting.callback.onAsyncError, [event, treeId, node, XMLHttpRequest, textStatus, errorThrown]);
+            });
+
+            o.bind(c.REMOVE, function (event, treeId, treeNode) {
+                tools.apply(setting.callback.onRemove, [event, treeId, treeNode]);
+            });
+
+            o.bind(c.SELECTED, function (event, treeId, node) {
+                tools.apply(setting.callback.onSelected, [treeId, node]);
+            });
+            o.bind(c.UNSELECTED, function (event, treeId, node) {
+                tools.apply(setting.callback.onUnSelected, [treeId, node]);
+            });
+        },
+        _unbindEvent = function (setting) {
+            var o = setting.treeObj,
+                c = consts.event;
+            o.unbind(c.NODECREATED)
+                .unbind(c.CLICK)
+                .unbind(c.EXPAND)
+                .unbind(c.COLLAPSE)
+                .unbind(c.ASYNC_SUCCESS)
+                .unbind(c.ASYNC_ERROR)
+                .unbind(c.REMOVE)
+                .unbind(c.SELECTED)
+                .unbind(c.UNSELECTED);
+        },
+        //default event proxy of core
+        _eventProxy = function (event) {
+            var target = event.target,
+                setting = data.getSetting(event.data.treeId),
+                tId = "", node = null,
+                nodeEventType = "", treeEventType = "",
+                nodeEventCallback = null, treeEventCallback = null,
+                tmp = null;
+
+            if (tools.eqs(event.type, "mousedown")) {
+                treeEventType = "mousedown";
+            } else if (tools.eqs(event.type, "mouseup")) {
+                treeEventType = "mouseup";
+            } else if (tools.eqs(event.type, "contextmenu")) {
+                treeEventType = "contextmenu";
+            } else if (tools.eqs(event.type, "click")) {
+                if (tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.SWITCH) !== null) {
+                    tId = tools.getNodeMainDom(target).id;
+                    nodeEventType = "switchNode";
+                } else {
+                    tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]);
+                    if (tmp) {
+                        tId = tools.getNodeMainDom(tmp).id;
+                        nodeEventType = "clickNode";
+                    }
+                }
+            } else if (tools.eqs(event.type, "dblclick")) {
+                treeEventType = "dblclick";
+                tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]);
+                if (tmp) {
+                    tId = tools.getNodeMainDom(tmp).id;
+                    nodeEventType = "switchNode";
+                }
+            }
+            if (treeEventType.length > 0 && tId.length == 0) {
+                tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]);
+                if (tmp) {
+                    tId = tools.getNodeMainDom(tmp).id;
+                }
+            }
+            // event to node
+            if (tId.length > 0) {
+                node = data.getNodeCache(setting, tId);
+                switch (nodeEventType) {
+                    case "switchNode" :
+                        var isParent = data.nodeIsParent(setting, node);
+                        if (!isParent) {
+                            nodeEventType = "";
+                        } else if (tools.eqs(event.type, "click")
+                            || (tools.eqs(event.type, "dblclick") && tools.apply(setting.view.dblClickExpand, [setting.treeId, node], setting.view.dblClickExpand))) {
+                            nodeEventCallback = handler.onSwitchNode;
+                        } else {
+                            nodeEventType = "";
+                        }
+                        break;
+                    case "clickNode" :
+                        nodeEventCallback = handler.onClickNode;
+                        break;
+                }
+            }
+            // event to zTree
+            switch (treeEventType) {
+                case "mousedown" :
+                    treeEventCallback = handler.onZTreeMousedown;
+                    break;
+                case "mouseup" :
+                    treeEventCallback = handler.onZTreeMouseup;
+                    break;
+                case "dblclick" :
+                    treeEventCallback = handler.onZTreeDblclick;
+                    break;
+                case "contextmenu" :
+                    treeEventCallback = handler.onZTreeContextmenu;
+                    break;
+            }
+            var proxyResult = {
+                stop: false,
+                node: node,
+                nodeEventType: nodeEventType,
+                nodeEventCallback: nodeEventCallback,
+                treeEventType: treeEventType,
+                treeEventCallback: treeEventCallback
+            };
+            return proxyResult
+        },
+        //default init node of core
+        _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
+            if (!n) return;
+            var r = data.getRoot(setting),
+                children = data.nodeChildren(setting, n);
+            n.level = level;
+            n.tId = setting.treeId + "_" + (++r.zId);
+            n.parentTId = parentNode ? parentNode.tId : null;
+            n.open = (typeof n.open == "string") ? tools.eqs(n.open, "true") : !!n.open;
+            var isParent = data.nodeIsParent(setting, n);
+            if (tools.isArray(children) &&
+              !(isParent === false || (typeof isParent == "string" && tools.eqs(isParent, "false")))) {
+                data.nodeIsParent(setting, n, true);
+                n.zAsync = true;
+            } else {
+                isParent = data.nodeIsParent(setting, n, isParent);
+                n.open = (isParent && !setting.async.enable) ? n.open : false;
+                n.zAsync = !isParent;
+            }
+            n.isFirstNode = isFirstNode;
+            n.isLastNode = isLastNode;
+            n.getParentNode = function () {
+                return data.getNodeCache(setting, n.parentTId);
+            };
+            n.getPreNode = function () {
+                return data.getPreNode(setting, n);
+            };
+            n.getNextNode = function () {
+                return data.getNextNode(setting, n);
+            };
+            n.getIndex = function () {
+                return data.getNodeIndex(setting, n);
+            };
+            n.getPath = function () {
+                return data.getNodePath(setting, n);
+            };
+            n.isAjaxing = false;
+            data.fixPIdKeyValue(setting, n);
+        },
+        _init = {
+            bind: [_bindEvent],
+            unbind: [_unbindEvent],
+            caches: [_initCache],
+            nodes: [_initNode],
+            proxys: [_eventProxy],
+            roots: [_initRoot],
+            beforeA: [],
+            afterA: [],
+            innerBeforeA: [],
+            innerAfterA: [],
+            zTreeTools: []
+        },
+        //method of operate data
+        data = {
+            addNodeCache: function (setting, node) {
+                data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = node;
+            },
+            getNodeCacheId: function (tId) {
+                return tId.substring(tId.lastIndexOf("_") + 1);
+            },
+            addAfterA: function (afterA) {
+                _init.afterA.push(afterA);
+            },
+            addBeforeA: function (beforeA) {
+                _init.beforeA.push(beforeA);
+            },
+            addInnerAfterA: function (innerAfterA) {
+                _init.innerAfterA.push(innerAfterA);
+            },
+            addInnerBeforeA: function (innerBeforeA) {
+                _init.innerBeforeA.push(innerBeforeA);
+            },
+            addInitBind: function (bindEvent) {
+                _init.bind.push(bindEvent);
+            },
+            addInitUnBind: function (unbindEvent) {
+                _init.unbind.push(unbindEvent);
+            },
+            addInitCache: function (initCache) {
+                _init.caches.push(initCache);
+            },
+            addInitNode: function (initNode) {
+                _init.nodes.push(initNode);
+            },
+            addInitProxy: function (initProxy, isFirst) {
+                if (!!isFirst) {
+                    _init.proxys.splice(0, 0, initProxy);
+                } else {
+                    _init.proxys.push(initProxy);
+                }
+            },
+            addInitRoot: function (initRoot) {
+                _init.roots.push(initRoot);
+            },
+            addNodesData: function (setting, parentNode, index, nodes) {
+                var children = data.nodeChildren(setting, parentNode), params;
+                if (!children) {
+                    children = data.nodeChildren(setting, parentNode, []);
+                    index = -1;
+                } else if (index >= children.length) {
+                    index = -1;
+                }
+
+                if (children.length > 0 && index === 0) {
+                    children[0].isFirstNode = false;
+                    view.setNodeLineIcos(setting, children[0]);
+                } else if (children.length > 0 && index < 0) {
+                    children[children.length - 1].isLastNode = false;
+                    view.setNodeLineIcos(setting, children[children.length - 1]);
+                }
+                data.nodeIsParent(setting, parentNode, true);
+
+                if (index < 0) {
+                    data.nodeChildren(setting, parentNode, children.concat(nodes));
+                } else {
+                    params = [index, 0].concat(nodes);
+                    children.splice.apply(children, params);
+                }
+            },
+            addSelectedNode: function (setting, node) {
+                var root = data.getRoot(setting);
+                if (!data.isSelectedNode(setting, node)) {
+                    root.curSelectedList.push(node);
+                }
+            },
+            addCreatedNode: function (setting, node) {
+                if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) {
+                    var root = data.getRoot(setting);
+                    root.createdNodes.push(node);
+                }
+            },
+            addZTreeTools: function (zTreeTools) {
+                _init.zTreeTools.push(zTreeTools);
+            },
+            exSetting: function (s) {
+                $.extend(true, _setting, s);
+            },
+            fixPIdKeyValue: function (setting, node) {
+                if (setting.data.simpleData.enable) {
+                    node[setting.data.simpleData.pIdKey] = node.parentTId ? node.getParentNode()[setting.data.simpleData.idKey] : setting.data.simpleData.rootPId;
+                }
+            },
+            getAfterA: function (setting, node, array) {
+                for (var i = 0, j = _init.afterA.length; i < j; i++) {
+                    _init.afterA[i].apply(this, arguments);
+                }
+            },
+            getBeforeA: function (setting, node, array) {
+                for (var i = 0, j = _init.beforeA.length; i < j; i++) {
+                    _init.beforeA[i].apply(this, arguments);
+                }
+            },
+            getInnerAfterA: function (setting, node, array) {
+                for (var i = 0, j = _init.innerAfterA.length; i < j; i++) {
+                    _init.innerAfterA[i].apply(this, arguments);
+                }
+            },
+            getInnerBeforeA: function (setting, node, array) {
+                for (var i = 0, j = _init.innerBeforeA.length; i < j; i++) {
+                    _init.innerBeforeA[i].apply(this, arguments);
+                }
+            },
+            getCache: function (setting) {
+                return caches[setting.treeId];
+            },
+            getNodeIndex: function (setting, node) {
+                if (!node) return null;
+                var p = node.parentTId ? node.getParentNode() : data.getRoot(setting),
+                    children = data.nodeChildren(setting, p);
+                for (var i = 0, l = children.length - 1; i <= l; i++) {
+                    if (children[i] === node) {
+                        return i;
+                    }
+                }
+                return -1;
+            },
+            getNextNode: function (setting, node) {
+                if (!node) return null;
+                var p = node.parentTId ? node.getParentNode() : data.getRoot(setting),
+                    children = data.nodeChildren(setting, p);
+                for (var i = 0, l = children.length - 1; i <= l; i++) {
+                    if (children[i] === node) {
+                        return (i == l ? null : children[i + 1]);
+                    }
+                }
+                return null;
+            },
+            getNodeByParam: function (setting, nodes, key, value) {
+                if (!nodes || !key) return null;
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (node[key] == value) {
+                        return nodes[i];
+                    }
+                    var children = data.nodeChildren(setting, node);
+                    var tmp = data.getNodeByParam(setting, children, key, value);
+                    if (tmp) return tmp;
+                }
+                return null;
+            },
+            getNodeCache: function (setting, tId) {
+                if (!tId) return null;
+                var n = caches[setting.treeId].nodes[data.getNodeCacheId(tId)];
+                return n ? n : null;
+            },
+            getNodePath: function (setting, node) {
+                if (!node) return null;
+
+                var path;
+                if (node.parentTId) {
+                    path = node.getParentNode().getPath();
+                } else {
+                    path = [];
+                }
+
+                if (path) {
+                    path.push(node);
+                }
+
+                return path;
+            },
+            getNodes: function (setting) {
+                return data.nodeChildren(setting, data.getRoot(setting));
+            },
+            getNodesByParam: function (setting, nodes, key, value) {
+                if (!nodes || !key) return [];
+                var result = [];
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (node[key] == value) {
+                        result.push(node);
+                    }
+                    var children = data.nodeChildren(setting, node);
+                    result = result.concat(data.getNodesByParam(setting, children, key, value));
+                }
+                return result;
+            },
+            getNodesByParamFuzzy: function (setting, nodes, key, value) {
+                if (!nodes || !key) return [];
+                var result = [];
+                value = value.toLowerCase();
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (typeof node[key] == "string" && nodes[i][key].toLowerCase().indexOf(value) > -1) {
+                        result.push(node);
+                    }
+                    var children = data.nodeChildren(setting, node);
+                    result = result.concat(data.getNodesByParamFuzzy(setting, children, key, value));
+                }
+                return result;
+            },
+            getNodesByFilter: function (setting, nodes, filter, isSingle, invokeParam) {
+                if (!nodes) return (isSingle ? null : []);
+                var result = isSingle ? null : [];
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (tools.apply(filter, [node, invokeParam], false)) {
+                        if (isSingle) {
+                            return node;
+                        }
+                        result.push(node);
+                    }
+                    var children = data.nodeChildren(setting, node);
+                    var tmpResult = data.getNodesByFilter(setting, children, filter, isSingle, invokeParam);
+                    if (isSingle && !!tmpResult) {
+                        return tmpResult;
+                    }
+                    result = isSingle ? tmpResult : result.concat(tmpResult);
+                }
+                return result;
+            },
+            getPreNode: function (setting, node) {
+                if (!node) return null;
+                var p = node.parentTId ? node.getParentNode() : data.getRoot(setting),
+                    children = data.nodeChildren(setting, p);
+                for (var i = 0, l = children.length; i < l; i++) {
+                    if (children[i] === node) {
+                        return (i == 0 ? null : children[i - 1]);
+                    }
+                }
+                return null;
+            },
+            getRoot: function (setting) {
+                return setting ? roots[setting.treeId] : null;
+            },
+            getRoots: function () {
+                return roots;
+            },
+            getSetting: function (treeId) {
+                return settings[treeId];
+            },
+            getSettings: function () {
+                return settings;
+            },
+            getZTreeTools: function (treeId) {
+                var r = this.getRoot(this.getSetting(treeId));
+                return r ? r.treeTools : null;
+            },
+            initCache: function (setting) {
+                for (var i = 0, j = _init.caches.length; i < j; i++) {
+                    _init.caches[i].apply(this, arguments);
+                }
+            },
+            initNode: function (setting, level, node, parentNode, preNode, nextNode) {
+                for (var i = 0, j = _init.nodes.length; i < j; i++) {
+                    _init.nodes[i].apply(this, arguments);
+                }
+            },
+            initRoot: function (setting) {
+                for (var i = 0, j = _init.roots.length; i < j; i++) {
+                    _init.roots[i].apply(this, arguments);
+                }
+            },
+            isSelectedNode: function (setting, node) {
+                var root = data.getRoot(setting);
+                for (var i = 0, j = root.curSelectedList.length; i < j; i++) {
+                    if (node === root.curSelectedList[i]) return true;
+                }
+                return false;
+            },
+            nodeChildren: function (setting, node, newChildren) {
+                if (!node) {
+                    return null;
+                }
+                var key = setting.data.key.children;
+                if (typeof newChildren !== 'undefined') {
+                    node[key] = newChildren;
+                }
+                return node[key];
+            },
+            nodeIsParent: function (setting, node, newIsParent) {
+                if (!node) {
+                    return false;
+                }
+                var key = setting.data.key.isParent;
+                if (typeof newIsParent !== 'undefined') {
+                    if (typeof newIsParent === "string") {
+                        newIsParent = tools.eqs(newIsParent, "true");
+                    }
+                    newIsParent = !!newIsParent;
+                    node[key] = newIsParent;
+                }
+                return node[key];
+            },
+            nodeName: function (setting, node, newName) {
+                var key = setting.data.key.name;
+                if (typeof newName !== 'undefined') {
+                    node[key] = newName;
+                }
+                return "" + node[key];
+            },
+            nodeTitle: function (setting, node) {
+                var t = setting.data.key.title === "" ? setting.data.key.name : setting.data.key.title;
+                return "" + node[t];
+            },
+            removeNodeCache: function (setting, node) {
+                var children = data.nodeChildren(setting, node);
+                if (children) {
+                    for (var i = 0, l = children.length; i < l; i++) {
+                        data.removeNodeCache(setting, children[i]);
+                    }
+                }
+                data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = null;
+            },
+            removeSelectedNode: function (setting, node) {
+                var root = data.getRoot(setting);
+                for (var i = 0, j = root.curSelectedList.length; i < j; i++) {
+                    if (node === root.curSelectedList[i] || !data.getNodeCache(setting, root.curSelectedList[i].tId)) {
+                        root.curSelectedList.splice(i, 1);
+                        setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, node]);
+                        i--;
+                        j--;
+                    }
+                }
+            },
+            setCache: function (setting, cache) {
+                caches[setting.treeId] = cache;
+            },
+            setRoot: function (setting, root) {
+                roots[setting.treeId] = root;
+            },
+            setZTreeTools: function (setting, zTreeTools) {
+                for (var i = 0, j = _init.zTreeTools.length; i < j; i++) {
+                    _init.zTreeTools[i].apply(this, arguments);
+                }
+            },
+            transformToArrayFormat: function (setting, nodes) {
+                if (!nodes) return [];
+                var r = [];
+                if (tools.isArray(nodes)) {
+                    for (var i = 0, l = nodes.length; i < l; i++) {
+                        var node = nodes[i];
+                        _do(node);
+                    }
+                } else {
+                    _do(nodes);
+                }
+                return r;
+
+                function _do(_node) {
+                  r.push(_node);
+                  var children = data.nodeChildren(setting, _node);
+                  if (children) {
+                      r = r.concat(data.transformToArrayFormat(setting, children));
+                  }
+                }
+            },
+            transformTozTreeFormat: function (setting, sNodes) {
+                var i, l,
+                    key = setting.data.simpleData.idKey,
+                    parentKey = setting.data.simpleData.pIdKey;
+                if (!key || key == "" || !sNodes) return [];
+
+                if (tools.isArray(sNodes)) {
+                    var r = [];
+                    var tmpMap = {};
+                    for (i = 0, l = sNodes.length; i < l; i++) {
+                        tmpMap[sNodes[i][key]] = sNodes[i];
+                    }
+                    for (i = 0, l = sNodes.length; i < l; i++) {
+                        var p = tmpMap[sNodes[i][parentKey]];
+                        if (p && sNodes[i][key] != sNodes[i][parentKey]) {
+                            var children = data.nodeChildren(setting, p);
+                            if (!children) {
+                                children = data.nodeChildren(setting, p, []);
+                            }
+                            children.push(sNodes[i]);
+                        } else {
+                            r.push(sNodes[i]);
+                        }
+                    }
+                    return r;
+                } else {
+                    return [sNodes];
+                }
+            }
+        },
+        //method of event proxy
+        event = {
+            bindEvent: function (setting) {
+                for (var i = 0, j = _init.bind.length; i < j; i++) {
+                    _init.bind[i].apply(this, arguments);
+                }
+            },
+            unbindEvent: function (setting) {
+                for (var i = 0, j = _init.unbind.length; i < j; i++) {
+                    _init.unbind[i].apply(this, arguments);
+                }
+            },
+            bindTree: function (setting) {
+                var eventParam = {
+                        treeId: setting.treeId
+                    },
+                    o = setting.treeObj;
+                if (!setting.view.txtSelectedEnable) {
+                    // for can't select text
+                    o.bind('selectstart', handler.onSelectStart).css({
+                        "-moz-user-select": "-moz-none"
+                    });
+                }
+                o.bind('click', eventParam, event.proxy);
+                o.bind('dblclick', eventParam, event.proxy);
+                o.bind('mouseover', eventParam, event.proxy);
+                o.bind('mouseout', eventParam, event.proxy);
+                o.bind('mousedown', eventParam, event.proxy);
+                o.bind('mouseup', eventParam, event.proxy);
+                o.bind('contextmenu', eventParam, event.proxy);
+            },
+            unbindTree: function (setting) {
+                var o = setting.treeObj;
+                o.unbind('selectstart', handler.onSelectStart)
+                    .unbind('click', event.proxy)
+                    .unbind('dblclick', event.proxy)
+                    .unbind('mouseover', event.proxy)
+                    .unbind('mouseout', event.proxy)
+                    .unbind('mousedown', event.proxy)
+                    .unbind('mouseup', event.proxy)
+                    .unbind('contextmenu', event.proxy);
+            },
+            doProxy: function (e) {
+                var results = [];
+                for (var i = 0, j = _init.proxys.length; i < j; i++) {
+                    var proxyResult = _init.proxys[i].apply(this, arguments);
+                    results.push(proxyResult);
+                    if (proxyResult.stop) {
+                        break;
+                    }
+                }
+                return results;
+            },
+            proxy: function (e) {
+                var setting = data.getSetting(e.data.treeId);
+                if (!tools.uCanDo(setting, e)) return true;
+                var results = event.doProxy(e),
+                    r = true, x = false;
+                for (var i = 0, l = results.length; i < l; i++) {
+                    var proxyResult = results[i];
+                    if (proxyResult.nodeEventCallback) {
+                        x = true;
+                        r = proxyResult.nodeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r;
+                    }
+                    if (proxyResult.treeEventCallback) {
+                        x = true;
+                        r = proxyResult.treeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r;
+                    }
+                }
+                return r;
+            }
+        },
+        //method of event handler
+        handler = {
+            onSwitchNode: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (node.open) {
+                    if (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false) return true;
+                    data.getRoot(setting).expandTriggerFlag = true;
+                    view.switchNode(setting, node);
+                } else {
+                    if (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false) return true;
+                    data.getRoot(setting).expandTriggerFlag = true;
+                    view.switchNode(setting, node);
+                }
+                return true;
+            },
+            onClickNode: function (event, node) {
+                var setting = data.getSetting(event.data.treeId),
+                    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;
+                if (tools.apply(setting.callback.beforeClick, [setting.treeId, node, clickFlag], true) == false) return true;
+                if (clickFlag === 0) {
+                    view.cancelPreSelectedNode(setting, node);
+                } else {
+                    view.selectNode(setting, node, clickFlag === 2);
+                }
+                setting.treeObj.trigger(consts.event.CLICK, [event, setting.treeId, node, clickFlag]);
+                return true;
+            },
+            onZTreeMousedown: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (tools.apply(setting.callback.beforeMouseDown, [setting.treeId, node], true)) {
+                    tools.apply(setting.callback.onMouseDown, [event, setting.treeId, node]);
+                }
+                return true;
+            },
+            onZTreeMouseup: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (tools.apply(setting.callback.beforeMouseUp, [setting.treeId, node], true)) {
+                    tools.apply(setting.callback.onMouseUp, [event, setting.treeId, node]);
+                }
+                return true;
+            },
+            onZTreeDblclick: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (tools.apply(setting.callback.beforeDblClick, [setting.treeId, node], true)) {
+                    tools.apply(setting.callback.onDblClick, [event, setting.treeId, node]);
+                }
+                return true;
+            },
+            onZTreeContextmenu: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (tools.apply(setting.callback.beforeRightClick, [setting.treeId, node], true)) {
+                    tools.apply(setting.callback.onRightClick, [event, setting.treeId, node]);
+                }
+                return (typeof setting.callback.onRightClick) != "function";
+            },
+            onSelectStart: function (e) {
+                var n = e.originalEvent.srcElement.nodeName.toLowerCase();
+                return (n === "input" || n === "textarea" );
+            }
+        },
+        //method of tools for zTree
+        tools = {
+            apply: function (fun, param, defaultValue) {
+                if ((typeof fun) == "function") {
+                    return fun.apply(zt, param ? param : []);
+                }
+                return defaultValue;
+            },
+            canAsync: function (setting, node) {
+                var children = data.nodeChildren(setting, node);
+                var isParent = data.nodeIsParent(setting, node);
+                return (setting.async.enable && node && isParent && !(node.zAsync || (children && children.length > 0)));
+            },
+            clone: function (obj) {
+                if (obj === null) return null;
+                var o = tools.isArray(obj) ? [] : {};
+                for (var i in obj) {
+                    o[i] = (obj[i] instanceof Date) ? new Date(obj[i].getTime()) : (typeof obj[i] === "object" ? tools.clone(obj[i]) : obj[i]);
+                }
+                return o;
+            },
+            eqs: function (str1, str2) {
+                return str1.toLowerCase() === str2.toLowerCase();
+            },
+            isArray: function (arr) {
+                return Object.prototype.toString.apply(arr) === "[object Array]";
+            },
+            isElement: function (o) {
+                return (
+                    typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
+                        o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string"
+                );
+            },
+            $: function (node, exp, setting) {
+                if (!!exp && typeof exp != "string") {
+                    setting = exp;
+                    exp = "";
+                }
+                if (typeof node == "string") {
+                    return $(node, setting ? setting.treeObj.get(0).ownerDocument : null);
+                } else {
+                    return $("#" + node.tId + exp, setting ? setting.treeObj : null);
+                }
+            },
+            getMDom: function (setting, curDom, targetExpr) {
+                if (!curDom) return null;
+                while (curDom && curDom.id !== setting.treeId) {
+                    for (var i = 0, l = targetExpr.length; curDom.tagName && i < l; i++) {
+                        if (tools.eqs(curDom.tagName, targetExpr[i].tagName) && curDom.getAttribute(targetExpr[i].attrName) !== null) {
+                            return curDom;
+                        }
+                    }
+                    curDom = curDom.parentNode;
+                }
+                return null;
+            },
+            getNodeMainDom: function (target) {
+                return ($(target).parent("li").get(0) || $(target).parentsUntil("li").parent().get(0));
+            },
+            isChildOrSelf: function (dom, parentId) {
+                return ( $(dom).closest("#" + parentId).length > 0 );
+            },
+            uCanDo: function (setting, e) {
+                return true;
+            }
+        },
+        //method of operate ztree dom
+        view = {
+            addNodes: function (setting, parentNode, index, newNodes, isSilent) {
+                var isParent = data.nodeIsParent(setting, parentNode);
+                if (setting.data.keep.leaf && parentNode && !isParent) {
+                    return;
+                }
+                if (!tools.isArray(newNodes)) {
+                    newNodes = [newNodes];
+                }
+                if (setting.data.simpleData.enable) {
+                    newNodes = data.transformTozTreeFormat(setting, newNodes);
+                }
+                if (parentNode) {
+                    var target_switchObj = $$(parentNode, consts.id.SWITCH, setting),
+                        target_icoObj = $$(parentNode, consts.id.ICON, setting),
+                        target_ulObj = $$(parentNode, consts.id.UL, setting);
+
+                    if (!parentNode.open) {
+                        view.replaceSwitchClass(parentNode, target_switchObj, consts.folder.CLOSE);
+                        view.replaceIcoClass(parentNode, target_icoObj, consts.folder.CLOSE);
+                        parentNode.open = false;
+                        target_ulObj.css({
+                            "display": "none"
+                        });
+                    }
+
+                    data.addNodesData(setting, parentNode, index, newNodes);
+                    view.createNodes(setting, parentNode.level + 1, newNodes, parentNode, index);
+                    if (!isSilent) {
+                        view.expandCollapseParentNode(setting, parentNode, true);
+                    }
+                } else {
+                    data.addNodesData(setting, data.getRoot(setting), index, newNodes);
+                    view.createNodes(setting, 0, newNodes, null, index);
+                }
+            },
+            appendNodes: function (setting, level, nodes, parentNode, index, initFlag, openFlag) {
+                if (!nodes) return [];
+                var html = [];
+
+                var tmpPNode = (parentNode) ? parentNode : data.getRoot(setting),
+                    tmpPChild = data.nodeChildren(setting, tmpPNode),
+                    isFirstNode, isLastNode;
+
+                if (!tmpPChild || index >= tmpPChild.length - nodes.length) {
+                    index = -1;
+                }
+
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (initFlag) {
+                        isFirstNode = ((index === 0 || tmpPChild.length == nodes.length) && (i == 0));
+                        isLastNode = (index < 0 && i == (nodes.length - 1));
+                        data.initNode(setting, level, node, parentNode, isFirstNode, isLastNode, openFlag);
+                        data.addNodeCache(setting, node);
+                    }
+                    var isParent = data.nodeIsParent(setting, node);
+
+                    var childHtml = [];
+                    var children = data.nodeChildren(setting, node);
+                    if (children && children.length > 0) {
+                        //make child html first, because checkType
+                        childHtml = view.appendNodes(setting, level + 1, children, node, -1, initFlag, openFlag && node.open);
+                    }
+                    if (openFlag) {
+                        view.makeDOMNodeMainBefore(html, setting, node);
+                        view.makeDOMNodeLine(html, setting, node);
+                        data.getBeforeA(setting, node, html);
+                        view.makeDOMNodeNameBefore(html, setting, node);
+                        data.getInnerBeforeA(setting, node, html);
+                        view.makeDOMNodeIcon(html, setting, node);
+                        data.getInnerAfterA(setting, node, html);
+                        view.makeDOMNodeNameAfter(html, setting, node);
+                        data.getAfterA(setting, node, html);
+                        if (isParent && node.open) {
+                            view.makeUlHtml(setting, node, html, childHtml.join(''));
+                        }
+                        view.makeDOMNodeMainAfter(html, setting, node);
+                        data.addCreatedNode(setting, node);
+                    }
+                }
+                return html;
+            },
+            appendParentULDom: function (setting, node) {
+                var html = [],
+                    nObj = $$(node, setting);
+                if (!nObj.get(0) && !!node.parentTId) {
+                    view.appendParentULDom(setting, node.getParentNode());
+                    nObj = $$(node, setting);
+                }
+                var ulObj = $$(node, consts.id.UL, setting);
+                if (ulObj.get(0)) {
+                    ulObj.remove();
+                }
+                var children = data.nodeChildren(setting, node),
+                    childHtml = view.appendNodes(setting, node.level + 1, children, node, -1, false, true);
+                view.makeUlHtml(setting, node, html, childHtml.join(''));
+                nObj.append(html.join(''));
+            },
+            asyncNode: function (setting, node, isSilent, callback) {
+                var i, l;
+                var isParent = data.nodeIsParent(setting, node);
+                if (node && !isParent) {
+                    tools.apply(callback);
+                    return false;
+                } else if (node && node.isAjaxing) {
+                    return false;
+                } else if (tools.apply(setting.callback.beforeAsync, [setting.treeId, node], true) == false) {
+                    tools.apply(callback);
+                    return false;
+                }
+                if (node) {
+                    node.isAjaxing = true;
+                    var icoObj = $$(node, consts.id.ICON, setting);
+                    icoObj.attr({"style": "", "class": consts.className.BUTTON + " " + consts.className.ICO_LOADING});
+                }
+
+                var tmpParam = {};
+                var autoParam = tools.apply(setting.async.autoParam, [setting.treeId, node], setting.async.autoParam);
+                for (i = 0, l = autoParam.length; node && i < l; i++) {
+                    var pKey = autoParam[i].split("="), spKey = pKey;
+                    if (pKey.length > 1) {
+                        spKey = pKey[1];
+                        pKey = pKey[0];
+                    }
+                    tmpParam[spKey] = node[pKey];
+                }
+                var otherParam = tools.apply(setting.async.otherParam, [setting.treeId, node], setting.async.otherParam);
+                if (tools.isArray(otherParam)) {
+                    for (i = 0, l = otherParam.length; i < l; i += 2) {
+                        tmpParam[otherParam[i]] = otherParam[i + 1];
+                    }
+                } else {
+                    for (var p in otherParam) {
+                        tmpParam[p] = otherParam[p];
+                    }
+                }
+
+                var _tmpV = data.getRoot(setting)._ver;
+                $.ajax({
+                    contentType: setting.async.contentType,
+                    cache: false,
+                    type: setting.async.type,
+                    url: tools.apply(setting.async.url, [setting.treeId, node], setting.async.url),
+                    data: setting.async.contentType.indexOf('application/json') > -1 ? JSON.stringify(tmpParam) : tmpParam,
+                    dataType: setting.async.dataType,
+                    success: function (msg) {
+                        if (_tmpV != data.getRoot(setting)._ver) {
+                            return;
+                        }
+                        var newNodes = [];
+                        try {
+                            if (!msg || msg.length == 0) {
+                                newNodes = [];
+                            } else if (typeof msg == "string") {
+                                newNodes = eval("(" + msg + ")");
+                            } else {
+                                newNodes = msg;
+                            }
+                        } catch (err) {
+                            newNodes = msg;
+                        }
+
+                        if (node) {
+                            node.isAjaxing = null;
+                            node.zAsync = true;
+                        }
+                        view.setNodeLineIcos(setting, node);
+                        if (newNodes && newNodes !== "") {
+                            newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes);
+                            view.addNodes(setting, node, -1, !!newNodes ? tools.clone(newNodes) : [], !!isSilent);
+                        } else {
+                            view.addNodes(setting, node, -1, [], !!isSilent);
+                        }
+                        setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, msg]);
+                        tools.apply(callback);
+                    },
+                    error: function (XMLHttpRequest, textStatus, errorThrown) {
+                        if (_tmpV != data.getRoot(setting)._ver) {
+                            return;
+                        }
+                        if (node) node.isAjaxing = null;
+                        view.setNodeLineIcos(setting, node);
+                        setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]);
+                    }
+                });
+                return true;
+            },
+            cancelPreSelectedNode: function (setting, node, excludeNode) {
+                var list = data.getRoot(setting).curSelectedList,
+                    i, n;
+                for (i = list.length - 1; i >= 0; i--) {
+                    n = list[i];
+                    if (node === n || (!node && (!excludeNode || excludeNode !== n))) {
+                        $$(n, consts.id.A, setting).removeClass(consts.node.CURSELECTED);
+                        if (node) {
+                            data.removeSelectedNode(setting, node);
+                            break;
+                        } else {
+                            list.splice(i, 1);
+                            setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, n]);
+                        }
+                    }
+                }
+            },
+            createNodeCallback: function (setting) {
+                if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) {
+                    var root = data.getRoot(setting);
+                    while (root.createdNodes.length > 0) {
+                        var node = root.createdNodes.shift();
+                        tools.apply(setting.view.addDiyDom, [setting.treeId, node]);
+                        if (!!setting.callback.onNodeCreated) {
+                            setting.treeObj.trigger(consts.event.NODECREATED, [setting.treeId, node]);
+                        }
+                    }
+                }
+            },
+            createNodes: function (setting, level, nodes, parentNode, index) {
+                if (!nodes || nodes.length == 0) return;
+                var root = data.getRoot(setting),
+                    openFlag = !parentNode || parentNode.open || !!$$(data.nodeChildren(setting, parentNode)[0], setting).get(0);
+                root.createdNodes = [];
+                var zTreeHtml = view.appendNodes(setting, level, nodes, parentNode, index, true, openFlag),
+                    parentObj, nextObj;
+
+                if (!parentNode) {
+                    parentObj = setting.treeObj;
+                    //setting.treeObj.append(zTreeHtml.join(''));
+                } else {
+                    var ulObj = $$(parentNode, consts.id.UL, setting);
+                    if (ulObj.get(0)) {
+                        parentObj = ulObj;
+                        //ulObj.append(zTreeHtml.join(''));
+                    }
+                }
+                if (parentObj) {
+                    if (index >= 0) {
+                        nextObj = parentObj.children()[index];
+                    }
+                    if (index >= 0 && nextObj) {
+                        $(nextObj).before(zTreeHtml.join(''));
+                    } else {
+                        parentObj.append(zTreeHtml.join(''));
+                    }
+                }
+
+                view.createNodeCallback(setting);
+            },
+            destroy: function (setting) {
+                if (!setting) return;
+                data.initCache(setting);
+                data.initRoot(setting);
+                event.unbindTree(setting);
+                event.unbindEvent(setting);
+                setting.treeObj.empty();
+                delete settings[setting.treeId];
+            },
+            expandCollapseNode: function (setting, node, expandFlag, animateFlag, callback) {
+                var root = data.getRoot(setting);
+                var tmpCb, _callback;
+                if (!node) {
+                    tools.apply(callback, []);
+                    return;
+                }
+                var children = data.nodeChildren(setting, node);
+                var isParent = data.nodeIsParent(setting, node);
+                if (root.expandTriggerFlag) {
+                    _callback = callback;
+                    tmpCb = function () {
+                        if (_callback) _callback();
+                        if (node.open) {
+                            setting.treeObj.trigger(consts.event.EXPAND, [setting.treeId, node]);
+                        } else {
+                            setting.treeObj.trigger(consts.event.COLLAPSE, [setting.treeId, node]);
+                        }
+                    };
+                    callback = tmpCb;
+                    root.expandTriggerFlag = false;
+                }
+                if (!node.open && isParent && ((!$$(node, consts.id.UL, setting).get(0)) || (children && children.length > 0 && !$$(children[0], setting).get(0)))) {
+                    view.appendParentULDom(setting, node);
+                    view.createNodeCallback(setting);
+                }
+                if (node.open == expandFlag) {
+                    tools.apply(callback, []);
+                    return;
+                }
+                var ulObj = $$(node, consts.id.UL, setting),
+                    switchObj = $$(node, consts.id.SWITCH, setting),
+                    icoObj = $$(node, consts.id.ICON, setting);
+
+                if (isParent) {
+                    node.open = !node.open;
+                    if (node.iconOpen && node.iconClose) {
+                        icoObj.attr("style", view.makeNodeIcoStyle(setting, node));
+                    }
+
+                    if (node.open) {
+                        view.replaceSwitchClass(node, switchObj, consts.folder.OPEN);
+                        view.replaceIcoClass(node, icoObj, consts.folder.OPEN);
+                        if (animateFlag == false || setting.view.expandSpeed == "") {
+                            ulObj.show();
+                            tools.apply(callback, []);
+                        } else {
+                            if (children && children.length > 0) {
+                                ulObj.slideDown(setting.view.expandSpeed, callback);
+                            } else {
+                                ulObj.show();
+                                tools.apply(callback, []);
+                            }
+                        }
+                    } else {
+                        view.replaceSwitchClass(node, switchObj, consts.folder.CLOSE);
+                        view.replaceIcoClass(node, icoObj, consts.folder.CLOSE);
+                        if (animateFlag == false || setting.view.expandSpeed == "" || !(children && children.length > 0)) {
+                            ulObj.hide();
+                            tools.apply(callback, []);
+                        } else {
+                            ulObj.slideUp(setting.view.expandSpeed, callback);
+                        }
+                    }
+                } else {
+                    tools.apply(callback, []);
+                }
+            },
+            expandCollapseParentNode: function (setting, node, expandFlag, animateFlag, callback) {
+                if (!node) return;
+                if (!node.parentTId) {
+                    view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback);
+                    return;
+                } else {
+                    view.expandCollapseNode(setting, node, expandFlag, animateFlag);
+                }
+                if (node.parentTId) {
+                    view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, animateFlag, callback);
+                }
+            },
+            expandCollapseSonNode: function (setting, node, expandFlag, animateFlag, callback) {
+                var root = data.getRoot(setting),
+                    treeNodes = (node) ? data.nodeChildren(setting, node) : data.nodeChildren(setting, root),
+                    selfAnimateSign = (node) ? false : animateFlag,
+                    expandTriggerFlag = data.getRoot(setting).expandTriggerFlag;
+                data.getRoot(setting).expandTriggerFlag = false;
+                if (treeNodes) {
+                    for (var i = 0, l = treeNodes.length; i < l; i++) {
+                        if (treeNodes[i]) view.expandCollapseSonNode(setting, treeNodes[i], expandFlag, selfAnimateSign);
+                    }
+                }
+                data.getRoot(setting).expandTriggerFlag = expandTriggerFlag;
+                view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback);
+            },
+            isSelectedNode: function (setting, node) {
+                if (!node) {
+                    return false;
+                }
+                var list = data.getRoot(setting).curSelectedList,
+                    i;
+                for (i = list.length - 1; i >= 0; i--) {
+                    if (node === list[i]) {
+                        return true;
+                    }
+                }
+                return false;
+            },
+            makeDOMNodeIcon: function (html, setting, node) {
+                var nameStr = data.nodeName(setting, node),
+                    name = setting.view.nameIsHTML ? nameStr : nameStr.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+                html.push("<span id='", node.tId, consts.id.ICON,
+                    "' title='' treeNode", consts.id.ICON, " class='", view.makeNodeIcoClass(setting, node),
+                    "' style='", view.makeNodeIcoStyle(setting, node), "'></span><span id='", node.tId, consts.id.SPAN,
+                    "' class='", consts.className.NAME,
+                    "'>", name, "</span>");
+            },
+            makeDOMNodeLine: function (html, setting, node) {
+                html.push("<span id='", node.tId, consts.id.SWITCH, "' title='' class='", view.makeNodeLineClass(setting, node), "' treeNode", consts.id.SWITCH, "></span>");
+            },
+            makeDOMNodeMainAfter: function (html, setting, node) {
+                html.push("</li>");
+            },
+            makeDOMNodeMainBefore: function (html, setting, node) {
+                html.push("<li id='", node.tId, "' class='", consts.className.LEVEL, node.level, "' tabindex='0' hidefocus='true' treenode>");
+            },
+            makeDOMNodeNameAfter: function (html, setting, node) {
+                html.push("</a>");
+            },
+            makeDOMNodeNameBefore: function (html, setting, node) {
+                var title = data.nodeTitle(setting, node),
+                    url = view.makeNodeUrl(setting, node),
+                    fontcss = view.makeNodeFontCss(setting, node),
+                    fontStyle = [];
+                for (var f in fontcss) {
+                    fontStyle.push(f, ":", fontcss[f], ";");
+                }
+                html.push("<a id='", node.tId, consts.id.A, "' class='", consts.className.LEVEL, node.level, "' treeNode", consts.id.A, " onclick=\"", (node.click || ''),
+                    "\" ", ((url != null && url.length > 0) ? "href='" + url + "'" : ""), " target='", view.makeNodeTarget(node), "' style='", fontStyle.join(''),
+                    "'");
+                if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle) && title) {
+                    html.push("title='", title.replace(/'/g, "&#39;").replace(/</g, '&lt;').replace(/>/g, '&gt;'), "'");
+                }
+                html.push(">");
+            },
+            makeNodeFontCss: function (setting, node) {
+                var fontCss = tools.apply(setting.view.fontCss, [setting.treeId, node], setting.view.fontCss);
+                return (fontCss && ((typeof fontCss) != "function")) ? fontCss : {};
+            },
+            makeNodeIcoClass: function (setting, node) {
+                var icoCss = ["ico"];
+                if (!node.isAjaxing) {
+                    var isParent = data.nodeIsParent(setting, node);
+                    icoCss[0] = (node.iconSkin ? node.iconSkin + "_" : "") + icoCss[0];
+                    if (isParent) {
+                        icoCss.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE);
+                    } else {
+                        icoCss.push(consts.folder.DOCU);
+                    }
+                }
+                return consts.className.BUTTON + " " + icoCss.join('_');
+            },
+            makeNodeIcoStyle: function (setting, node) {
+                var icoStyle = [];
+                if (!node.isAjaxing) {
+                    var isParent = data.nodeIsParent(setting, node);
+                    var icon = (isParent && node.iconOpen && node.iconClose) ? (node.open ? node.iconOpen : node.iconClose) : node[setting.data.key.icon];
+                    if (icon) icoStyle.push("background:url(", icon, ") 0 0 no-repeat;");
+                    if (setting.view.showIcon == false || !tools.apply(setting.view.showIcon, [setting.treeId, node], true)) {
+                        icoStyle.push("width:0px;height:0px;");
+                    }
+                }
+                return icoStyle.join('');
+            },
+            makeNodeLineClass: function (setting, node) {
+                var lineClass = [];
+                if (setting.view.showLine) {
+                    if (node.level == 0 && node.isFirstNode && node.isLastNode) {
+                        lineClass.push(consts.line.ROOT);
+                    } else if (node.level == 0 && node.isFirstNode) {
+                        lineClass.push(consts.line.ROOTS);
+                    } else if (node.isLastNode) {
+                        lineClass.push(consts.line.BOTTOM);
+                    } else {
+                        lineClass.push(consts.line.CENTER);
+                    }
+                } else {
+                    lineClass.push(consts.line.NOLINE);
+                }
+                if (data.nodeIsParent(setting, node)) {
+                    lineClass.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE);
+                } else {
+                    lineClass.push(consts.folder.DOCU);
+                }
+                return view.makeNodeLineClassEx(node) + lineClass.join('_');
+            },
+            makeNodeLineClassEx: function (node) {
+                return consts.className.BUTTON + " " + consts.className.LEVEL + node.level + " " + consts.className.SWITCH + " ";
+            },
+            makeNodeTarget: function (node) {
+                return (node.target || "_blank");
+            },
+            makeNodeUrl: function (setting, node) {
+                var urlKey = setting.data.key.url;
+                return node[urlKey] ? node[urlKey] : null;
+            },
+            makeUlHtml: function (setting, node, html, content) {
+                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"), "'>");
+                html.push(content);
+                html.push("</ul>");
+            },
+            makeUlLineClass: function (setting, node) {
+                return ((setting.view.showLine && !node.isLastNode) ? consts.line.LINE : "");
+            },
+            removeChildNodes: function (setting, node) {
+                if (!node) return;
+                var nodes = data.nodeChildren(setting, node);
+                if (!nodes) return;
+
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    data.removeNodeCache(setting, nodes[i]);
+                }
+                data.removeSelectedNode(setting);
+                delete node[setting.data.key.children];
+
+                if (!setting.data.keep.parent) {
+                    data.nodeIsParent(setting, node, false);
+                    node.open = false;
+                    var tmp_switchObj = $$(node, consts.id.SWITCH, setting),
+                        tmp_icoObj = $$(node, consts.id.ICON, setting);
+                    view.replaceSwitchClass(node, tmp_switchObj, consts.folder.DOCU);
+                    view.replaceIcoClass(node, tmp_icoObj, consts.folder.DOCU);
+                    $$(node, consts.id.UL, setting).remove();
+                } else {
+                    $$(node, consts.id.UL, setting).empty();
+                }
+            },
+            scrollIntoView: function (setting, dom) {
+                if (!dom) {
+                    return;
+                }
+                // support IE 7
+                if (typeof Element === 'undefined') {
+                  var contRect = setting.treeObj.get(0).getBoundingClientRect(),
+                    findMeRect = dom.getBoundingClientRect();
+                  if (findMeRect.top < contRect.top || findMeRect.bottom > contRect.bottom
+                    || findMeRect.right > contRect.right || findMeRect.left < contRect.left) {
+                    dom.scrollIntoView();
+                  }
+                  return;
+                }
+                // code src: http://jsfiddle.net/08u6cxwj/
+                if (!Element.prototype.scrollIntoViewIfNeeded) {
+                    Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) {
+                        function withinBounds(value, min, max, extent) {
+                            if (false === centerIfNeeded || max <= value + extent && value <= min + extent) {
+                                return Math.min(max, Math.max(min, value));
+                            } else {
+                                return (min + max) / 2;
+                            }
+                        }
+
+                        function makeArea(left, top, width, height) {
+                            return {
+                                "left": left, "top": top, "width": width, "height": height
+                                , "right": left + width, "bottom": top + height
+                                , "translate": function (x, y) {
+                                    return makeArea(x + left, y + top, width, height);
+                                }
+                                , "relativeFromTo": function (lhs, rhs) {
+                                    var newLeft = left, newTop = top;
+                                    lhs = lhs.offsetParent;
+                                    rhs = rhs.offsetParent;
+                                    if (lhs === rhs) {
+                                        return area;
+                                    }
+                                    for (; lhs; lhs = lhs.offsetParent) {
+                                        newLeft += lhs.offsetLeft + lhs.clientLeft;
+                                        newTop += lhs.offsetTop + lhs.clientTop;
+                                    }
+                                    for (; rhs; rhs = rhs.offsetParent) {
+                                        newLeft -= rhs.offsetLeft + rhs.clientLeft;
+                                        newTop -= rhs.offsetTop + rhs.clientTop;
+                                    }
+                                    return makeArea(newLeft, newTop, width, height);
+                                }
+                            };
+                        }
+
+                        var parent, elem = this, area = makeArea(
+                            this.offsetLeft, this.offsetTop,
+                            this.offsetWidth, this.offsetHeight);
+                        while (tools.isElement(parent = elem.parentNode)) {
+                            var clientLeft = parent.offsetLeft + parent.clientLeft;
+                            var clientTop = parent.offsetTop + parent.clientTop;
+
+                            // Make area relative to parent's client area.
+                            area = area.relativeFromTo(elem, parent).translate(-clientLeft, -clientTop);
+
+                            parent.scrollLeft = withinBounds(
+                                parent.scrollLeft,
+                                area.right - parent.clientWidth, area.left,
+                                parent.clientWidth);
+
+                            parent.scrollTop = withinBounds(
+                                parent.scrollTop,
+                                area.bottom - parent.clientHeight, area.top,
+                                parent.clientHeight);
+
+                            // Determine actual scroll amount by reading back scroll properties.
+                            area = area.translate(clientLeft - parent.scrollLeft,
+                                clientTop - parent.scrollTop);
+                            elem = parent;
+                        }
+                    };
+                }
+                dom.scrollIntoViewIfNeeded();
+            },
+            setFirstNode: function (setting, parentNode) {
+                var children = data.nodeChildren(setting, parentNode);
+                if (children.length > 0) {
+                    children[0].isFirstNode = true;
+                }
+            },
+            setLastNode: function (setting, parentNode) {
+                var children = data.nodeChildren(setting, parentNode);
+                if (children.length > 0) {
+                    children[children.length - 1].isLastNode = true;
+                }
+            },
+            removeNode: function (setting, node) {
+                var root = data.getRoot(setting),
+                    parentNode = (node.parentTId) ? node.getParentNode() : root;
+
+                node.isFirstNode = false;
+                node.isLastNode = false;
+                node.getPreNode = function () {
+                    return null;
+                };
+                node.getNextNode = function () {
+                    return null;
+                };
+
+                if (!data.getNodeCache(setting, node.tId)) {
+                    return;
+                }
+
+                $$(node, setting).remove();
+                data.removeNodeCache(setting, node);
+                data.removeSelectedNode(setting, node);
+
+                var children = data.nodeChildren(setting, parentNode);
+                for (var i = 0, l = children.length; i < l; i++) {
+                    if (children[i].tId == node.tId) {
+                        children.splice(i, 1);
+                        break;
+                    }
+                }
+                view.setFirstNode(setting, parentNode);
+                view.setLastNode(setting, parentNode);
+
+                var tmp_ulObj, tmp_switchObj, tmp_icoObj,
+                    childLength = children.length;
+
+                //repair nodes old parent
+                if (!setting.data.keep.parent && childLength == 0) {
+                    //old parentNode has no child nodes
+                    data.nodeIsParent(setting, parentNode, false);
+                    parentNode.open = false;
+                    delete parentNode[setting.data.key.children];
+                    tmp_ulObj = $$(parentNode, consts.id.UL, setting);
+                    tmp_switchObj = $$(parentNode, consts.id.SWITCH, setting);
+                    tmp_icoObj = $$(parentNode, consts.id.ICON, setting);
+                    view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.DOCU);
+                    view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.DOCU);
+                    tmp_ulObj.css("display", "none");
+
+                } else if (setting.view.showLine && childLength > 0) {
+                    //old parentNode has child nodes
+                    var newLast = children[childLength - 1];
+                    tmp_ulObj = $$(newLast, consts.id.UL, setting);
+                    tmp_switchObj = $$(newLast, consts.id.SWITCH, setting);
+                    tmp_icoObj = $$(newLast, consts.id.ICON, setting);
+                    if (parentNode == root) {
+                        if (children.length == 1) {
+                            //node was root, and ztree has only one root after move node
+                            view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.ROOT);
+                        } else {
+                            var tmp_first_switchObj = $$(children[0], consts.id.SWITCH, setting);
+                            view.replaceSwitchClass(children[0], tmp_first_switchObj, consts.line.ROOTS);
+                            view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM);
+                        }
+                    } else {
+                        view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM);
+                    }
+                    tmp_ulObj.removeClass(consts.line.LINE);
+                }
+            },
+            replaceIcoClass: function (node, obj, newName) {
+                if (!obj || node.isAjaxing) return;
+                var tmpName = obj.attr("class");
+                if (tmpName == undefined) return;
+                var tmpList = tmpName.split("_");
+                switch (newName) {
+                    case consts.folder.OPEN:
+                    case consts.folder.CLOSE:
+                    case consts.folder.DOCU:
+                        tmpList[tmpList.length - 1] = newName;
+                        break;
+                }
+                obj.attr("class", tmpList.join("_"));
+            },
+            replaceSwitchClass: function (node, obj, newName) {
+                if (!obj) return;
+                var tmpName = obj.attr("class");
+                if (tmpName == undefined) return;
+                var tmpList = tmpName.split("_");
+                switch (newName) {
+                    case consts.line.ROOT:
+                    case consts.line.ROOTS:
+                    case consts.line.CENTER:
+                    case consts.line.BOTTOM:
+                    case consts.line.NOLINE:
+                        tmpList[0] = view.makeNodeLineClassEx(node) + newName;
+                        break;
+                    case consts.folder.OPEN:
+                    case consts.folder.CLOSE:
+                    case consts.folder.DOCU:
+                        tmpList[1] = newName;
+                        break;
+                }
+                obj.attr("class", tmpList.join("_"));
+                if (newName !== consts.folder.DOCU) {
+                    obj.removeAttr("disabled");
+                } else {
+                    obj.attr("disabled", "disabled");
+                }
+            },
+            selectNode: function (setting, node, addFlag) {
+                if (!addFlag) {
+                    view.cancelPreSelectedNode(setting, null, node);
+                }
+                $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED);
+                data.addSelectedNode(setting, node);
+                setting.treeObj.trigger(consts.event.SELECTED, [setting.treeId, node]);
+            },
+            setNodeFontCss: function (setting, treeNode) {
+                var aObj = $$(treeNode, consts.id.A, setting),
+                    fontCss = view.makeNodeFontCss(setting, treeNode);
+                if (fontCss) {
+                    aObj.css(fontCss);
+                }
+            },
+            setNodeLineIcos: function (setting, node) {
+                if (!node) return;
+                var switchObj = $$(node, consts.id.SWITCH, setting),
+                    ulObj = $$(node, consts.id.UL, setting),
+                    icoObj = $$(node, consts.id.ICON, setting),
+                    ulLine = view.makeUlLineClass(setting, node);
+                if (ulLine.length == 0) {
+                    ulObj.removeClass(consts.line.LINE);
+                } else {
+                    ulObj.addClass(ulLine);
+                }
+                switchObj.attr("class", view.makeNodeLineClass(setting, node));
+                if (data.nodeIsParent(setting, node)) {
+                    switchObj.removeAttr("disabled");
+                } else {
+                    switchObj.attr("disabled", "disabled");
+                }
+                icoObj.removeAttr("style");
+                icoObj.attr("style", view.makeNodeIcoStyle(setting, node));
+                icoObj.attr("class", view.makeNodeIcoClass(setting, node));
+            },
+            setNodeName: function (setting, node) {
+                var title = data.nodeTitle(setting, node),
+                    nObj = $$(node, consts.id.SPAN, setting);
+                nObj.empty();
+                if (setting.view.nameIsHTML) {
+                    nObj.html(data.nodeName(setting, node));
+                } else {
+                    nObj.text(data.nodeName(setting, node));
+                }
+                if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle)) {
+                    var aObj = $$(node, consts.id.A, setting);
+                    aObj.attr("title", !title ? "" : title);
+                }
+            },
+            setNodeTarget: function (setting, node) {
+                var aObj = $$(node, consts.id.A, setting);
+                aObj.attr("target", view.makeNodeTarget(node));
+            },
+            setNodeUrl: function (setting, node) {
+                var aObj = $$(node, consts.id.A, setting),
+                    url = view.makeNodeUrl(setting, node);
+                if (url == null || url.length == 0) {
+                    aObj.removeAttr("href");
+                } else {
+                    aObj.attr("href", url);
+                }
+            },
+            switchNode: function (setting, node) {
+                if (node.open || !tools.canAsync(setting, node)) {
+                    view.expandCollapseNode(setting, node, !node.open);
+                } else if (setting.async.enable) {
+                    if (!view.asyncNode(setting, node)) {
+                        view.expandCollapseNode(setting, node, !node.open);
+                        return;
+                    }
+                } else if (node) {
+                    view.expandCollapseNode(setting, node, !node.open);
+                }
+            }
+        };
+    // zTree defind
+    $.fn.zTree = {
+        consts: _consts,
+        _z: {
+            tools: tools,
+            view: view,
+            event: event,
+            data: data
+        },
+        getZTreeObj: function (treeId) {
+            var o = data.getZTreeTools(treeId);
+            return o ? o : null;
+        },
+        destroy: function (treeId) {
+            if (!!treeId && treeId.length > 0) {
+                view.destroy(data.getSetting(treeId));
+            } else {
+                for (var s in settings) {
+                    view.destroy(settings[s]);
+                }
+            }
+        },
+        init: function (obj, zSetting, zNodes) {
+            var setting = tools.clone(_setting);
+            $.extend(true, setting, zSetting);
+            setting.treeId = obj.attr("id");
+            setting.treeObj = obj;
+            setting.treeObj.empty();
+            settings[setting.treeId] = setting;
+            //For some older browser,(e.g., ie6)
+            if (typeof document.body.style.maxHeight === "undefined") {
+                setting.view.expandSpeed = "";
+            }
+            data.initRoot(setting);
+            var root = data.getRoot(setting);
+            zNodes = zNodes ? tools.clone(tools.isArray(zNodes) ? zNodes : [zNodes]) : [];
+            if (setting.data.simpleData.enable) {
+                data.nodeChildren(setting, root, data.transformTozTreeFormat(setting, zNodes));
+            } else {
+                data.nodeChildren(setting, root, zNodes);
+            }
+
+            data.initCache(setting);
+            event.unbindTree(setting);
+            event.bindTree(setting);
+            event.unbindEvent(setting);
+            event.bindEvent(setting);
+
+            var zTreeTools = {
+                setting: setting,
+                addNodes: function (parentNode, index, newNodes, isSilent) {
+                    if (!parentNode) parentNode = null;
+                    var isParent = data.nodeIsParent(setting, parentNode);
+                    if (parentNode && !isParent && setting.data.keep.leaf) return null;
+
+                    var i = parseInt(index, 10);
+                    if (isNaN(i)) {
+                        isSilent = !!newNodes;
+                        newNodes = index;
+                        index = -1;
+                    } else {
+                        index = i;
+                    }
+                    if (!newNodes) return null;
+
+
+                    var xNewNodes = tools.clone(tools.isArray(newNodes) ? newNodes : [newNodes]);
+
+                    function addCallback() {
+                        view.addNodes(setting, parentNode, index, xNewNodes, (isSilent == true));
+                    }
+
+                    if (tools.canAsync(setting, parentNode)) {
+                        view.asyncNode(setting, parentNode, isSilent, addCallback);
+                    } else {
+                        addCallback();
+                    }
+                    return xNewNodes;
+                },
+                cancelSelectedNode: function (node) {
+                    view.cancelPreSelectedNode(setting, node);
+                },
+                destroy: function () {
+                    view.destroy(setting);
+                },
+                expandAll: function (expandFlag) {
+                    expandFlag = !!expandFlag;
+                    view.expandCollapseSonNode(setting, null, expandFlag, true);
+                    return expandFlag;
+                },
+                expandNode: function (node, expandFlag, sonSign, focus, callbackFlag) {
+                    if (!node || !data.nodeIsParent(setting, node)) return null;
+                    if (expandFlag !== true && expandFlag !== false) {
+                        expandFlag = !node.open;
+                    }
+                    callbackFlag = !!callbackFlag;
+
+                    if (callbackFlag && expandFlag && (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false)) {
+                        return null;
+                    } else if (callbackFlag && !expandFlag && (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false)) {
+                        return null;
+                    }
+                    if (expandFlag && node.parentTId) {
+                        view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, false);
+                    }
+                    if (expandFlag === node.open && !sonSign) {
+                        return null;
+                    }
+
+                    data.getRoot(setting).expandTriggerFlag = callbackFlag;
+                    if (!tools.canAsync(setting, node) && sonSign) {
+                        view.expandCollapseSonNode(setting, node, expandFlag, true, showNodeFocus);
+                    } else {
+                        node.open = !expandFlag;
+                        view.switchNode(this.setting, node);
+                        showNodeFocus();
+                    }
+                    return expandFlag;
+
+                    function showNodeFocus() {
+                        var a = $$(node, setting).get(0);
+                        if (a && focus !== false) {
+                            view.scrollIntoView(setting, a);
+                        }
+                    }
+                },
+                getNodes: function () {
+                    return data.getNodes(setting);
+                },
+                getNodeByParam: function (key, value, parentNode) {
+                    if (!key) return null;
+                    return data.getNodeByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value);
+                },
+                getNodeByTId: function (tId) {
+                    return data.getNodeCache(setting, tId);
+                },
+                getNodesByParam: function (key, value, parentNode) {
+                    if (!key) return null;
+                    return data.getNodesByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value);
+                },
+                getNodesByParamFuzzy: function (key, value, parentNode) {
+                    if (!key) return null;
+                    return data.getNodesByParamFuzzy(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value);
+                },
+                getNodesByFilter: function (filter, isSingle, parentNode, invokeParam) {
+                    isSingle = !!isSingle;
+                    if (!filter || (typeof filter != "function")) return (isSingle ? null : []);
+                    return data.getNodesByFilter(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), filter, isSingle, invokeParam);
+                },
+                getNodeIndex: function (node) {
+                    if (!node) return null;
+                    var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
+                    var children = data.nodeChildren(setting, parentNode);
+                    for (var i = 0, l = children.length; i < l; i++) {
+                        if (children[i] == node) return i;
+                    }
+                    return -1;
+                },
+                getSelectedNodes: function () {
+                    var r = [], list = data.getRoot(setting).curSelectedList;
+                    for (var i = 0, l = list.length; i < l; i++) {
+                        r.push(list[i]);
+                    }
+                    return r;
+                },
+                isSelectedNode: function (node) {
+                    return data.isSelectedNode(setting, node);
+                },
+                reAsyncChildNodesPromise: function (parentNode, reloadType, isSilent) {
+                    var promise = new Promise(function(resolve, reject) {
+                        try {
+                            zTreeTools.reAsyncChildNodes(parentNode, reloadType, isSilent, function() {
+                                resolve(parentNode);
+                            });
+                        } catch(e) {
+                            reject(e);
+                        }
+                    });
+                    return promise;
+                },
+                reAsyncChildNodes: function (parentNode, reloadType, isSilent, callback) {
+                    if (!this.setting.async.enable) return;
+                    var isRoot = !parentNode;
+                    if (isRoot) {
+                        parentNode = data.getRoot(setting);
+                    }
+                    if (reloadType == "refresh") {
+                        var children = data.nodeChildren(setting, parentNode);
+                        for (var i = 0, l = children ? children.length : 0; i < l; i++) {
+                            data.removeNodeCache(setting, children[i]);
+                        }
+                        data.removeSelectedNode(setting);
+                        data.nodeChildren(setting, parentNode, []);
+                        if (isRoot) {
+                            this.setting.treeObj.empty();
+                        } else {
+                            var ulObj = $$(parentNode, consts.id.UL, setting);
+                            ulObj.empty();
+                        }
+                    }
+                    view.asyncNode(this.setting, isRoot ? null : parentNode, !!isSilent, callback);
+                },
+                refresh: function () {
+                    this.setting.treeObj.empty();
+                    var root = data.getRoot(setting),
+                        nodes = data.nodeChildren(setting, root);
+                    data.initRoot(setting);
+                    data.nodeChildren(setting, root, nodes);
+                    data.initCache(setting);
+                    view.createNodes(setting, 0, data.nodeChildren(setting, root), null, -1);
+                },
+                removeChildNodes: function (node) {
+                    if (!node) return null;
+                    var nodes = data.nodeChildren(setting, node);
+                    view.removeChildNodes(setting, node);
+                    return nodes ? nodes : null;
+                },
+                removeNode: function (node, callbackFlag) {
+                    if (!node) return;
+                    callbackFlag = !!callbackFlag;
+                    if (callbackFlag && tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return;
+                    view.removeNode(setting, node);
+                    if (callbackFlag) {
+                        this.setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]);
+                    }
+                },
+                selectNode: function (node, addFlag, isSilent) {
+                    if (!node) return;
+                    if (tools.uCanDo(setting)) {
+                        addFlag = setting.view.selectedMulti && addFlag;
+                        if (node.parentTId) {
+                            view.expandCollapseParentNode(setting, node.getParentNode(), true, false, showNodeFocus);
+                        } else if (!isSilent) {
+                            try {
+                                $$(node, setting).focus().blur();
+                            } catch (e) {
+                            }
+                        }
+                        view.selectNode(setting, node, addFlag);
+                    }
+
+                    function showNodeFocus() {
+                        if (isSilent) {
+                            return;
+                        }
+                        var a = $$(node, setting).get(0);
+                        view.scrollIntoView(setting, a);
+                    }
+                },
+                transformTozTreeNodes: function (simpleNodes) {
+                    return data.transformTozTreeFormat(setting, simpleNodes);
+                },
+                transformToArray: function (nodes) {
+                    return data.transformToArrayFormat(setting, nodes);
+                },
+                updateNode: function (node, checkTypeFlag) {
+                    if (!node) return;
+                    var nObj = $$(node, setting);
+                    if (nObj.get(0) && tools.uCanDo(setting)) {
+                        view.setNodeName(setting, node);
+                        view.setNodeTarget(setting, node);
+                        view.setNodeUrl(setting, node);
+                        view.setNodeLineIcos(setting, node);
+                        view.setNodeFontCss(setting, node);
+                    }
+                }
+            };
+            root.treeTools = zTreeTools;
+            data.setZTreeTools(setting, zTreeTools);
+            var children = data.nodeChildren(setting, root);
+            if (children && children.length > 0) {
+                view.createNodes(setting, 0, children, null, -1);
+            } else if (setting.async.enable && setting.async.url && setting.async.url !== '') {
+                view.asyncNode(setting);
+            }
+            return zTreeTools;
+        }
+    };
+
+    var zt = $.fn.zTree,
+        $$ = tools.$,
+        consts = zt.consts;
+})(jQuery);
+/*
+ * JQuery zTree excheck v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function($){
+	//default consts of excheck
+	var _consts = {
+		event: {
+			CHECK: "ztree_check"
+		},
+		id: {
+			CHECK: "_check"
+		},
+		checkbox: {
+			STYLE: "checkbox",
+			DEFAULT: "chk",
+			DISABLED: "disable",
+			FALSE: "false",
+			TRUE: "true",
+			FULL: "full",
+			PART: "part",
+			FOCUS: "focus"
+		},
+		radio: {
+			STYLE: "radio",
+			TYPE_ALL: "all",
+			TYPE_LEVEL: "level"
+		}
+	},
+	//default setting of excheck
+	_setting = {
+		check: {
+			enable: false,
+			autoCheckTrigger: false,
+			chkStyle: _consts.checkbox.STYLE,
+			nocheckInherit: false,
+			chkDisabledInherit: false,
+			radioType: _consts.radio.TYPE_LEVEL,
+			chkboxType: {
+				"Y": "ps",
+				"N": "ps"
+			}
+		},
+		data: {
+			key: {
+				checked: "checked"
+			}
+		},
+		callback: {
+			beforeCheck:null,
+			onCheck:null
+		}
+	},
+	//default root of excheck
+	_initRoot = function (setting) {
+		var r = data.getRoot(setting);
+		r.radioCheckedList = [];
+	},
+	//default cache of excheck
+	_initCache = function(treeId) {},
+	//default bind event of excheck
+	_bindEvent = function(setting) {
+		var o = setting.treeObj,
+		c = consts.event;
+		o.bind(c.CHECK, function (event, srcEvent, treeId, node) {
+			event.srcEvent = srcEvent;
+			tools.apply(setting.callback.onCheck, [event, treeId, node]);
+		});
+	},
+	_unbindEvent = function(setting) {
+		var o = setting.treeObj,
+		c = consts.event;
+		o.unbind(c.CHECK);
+	},
+	//default event proxy of excheck
+	_eventProxy = function(e) {
+		var target = e.target,
+		setting = data.getSetting(e.data.treeId),
+		tId = "", node = null,
+		nodeEventType = "", treeEventType = "",
+		nodeEventCallback = null, treeEventCallback = null;
+
+		if (tools.eqs(e.type, "mouseover")) {
+			if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
+				tId = tools.getNodeMainDom(target).id;
+				nodeEventType = "mouseoverCheck";
+			}
+		} else if (tools.eqs(e.type, "mouseout")) {
+			if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
+				tId = tools.getNodeMainDom(target).id;
+				nodeEventType = "mouseoutCheck";
+			}
+		} else if (tools.eqs(e.type, "click")) {
+			if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
+				tId = tools.getNodeMainDom(target).id;
+				nodeEventType = "checkNode";
+			}
+		}
+		if (tId.length>0) {
+			node = data.getNodeCache(setting, tId);
+			switch (nodeEventType) {
+				case "checkNode" :
+					nodeEventCallback = _handler.onCheckNode;
+					break;
+				case "mouseoverCheck" :
+					nodeEventCallback = _handler.onMouseoverCheck;
+					break;
+				case "mouseoutCheck" :
+					nodeEventCallback = _handler.onMouseoutCheck;
+					break;
+			}
+		}
+		var proxyResult = {
+			stop: nodeEventType === "checkNode",
+			node: node,
+			nodeEventType: nodeEventType,
+			nodeEventCallback: nodeEventCallback,
+			treeEventType: treeEventType,
+			treeEventCallback: treeEventCallback
+		};
+		return proxyResult
+	},
+	//default init node of excheck
+	_initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
+		if (!n) return;
+		var checked = data.nodeChecked(setting, n);
+		checked = data.nodeChecked(setting, n, checked);
+		n.checkedOld = checked;
+		if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true");
+		n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck);
+		if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true");
+		n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled);
+		if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true");
+		n.halfCheck = !!n.halfCheck;
+		n.check_Child_State = -1;
+		n.check_Focus = false;
+		n.getCheckStatus = function() {return data.getCheckStatus(setting, n);};
+
+		if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && checked) {
+			var r = data.getRoot(setting);
+			r.radioCheckedList.push(n);
+		}
+	},
+	//add dom for check
+	_beforeA = function(setting, node, html) {
+		if (setting.check.enable) {
+			data.makeChkFlag(setting, node);
+			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>");
+		}
+	},
+	//update zTreeObj, add method of check
+	_zTreeTools = function(setting, zTreeTools) {
+		zTreeTools.checkNode = function(node, checked, checkTypeFlag, callbackFlag) {
+			var nodeChecked = data.nodeChecked(setting, node);
+			if (node.chkDisabled === true) return;
+			if (checked !== true && checked !== false) {
+				checked = !nodeChecked;
+			}
+			callbackFlag = !!callbackFlag;
+
+			if (nodeChecked === checked && !checkTypeFlag) {
+				return;
+			} else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) {
+				return;
+			}
+			if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) {
+        data.nodeChecked(setting, node, checked);
+				var checkObj = $$(node, consts.id.CHECK, this.setting);
+				if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
+				view.setChkClass(this.setting, checkObj, node);
+				view.repairParentChkClassWithSelf(this.setting, node);
+				if (callbackFlag) {
+					this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]);
+				}
+			}
+		}
+
+		zTreeTools.checkAllNodes = function(checked) {
+			view.repairAllChk(this.setting, !!checked);
+		}
+
+		zTreeTools.getCheckedNodes = function(checked) {
+			var checked = (checked !== false);
+			var children = data.nodeChildren(setting, data.getRoot(this.setting));
+			return data.getTreeCheckedNodes(this.setting, children, checked);
+		}
+
+		zTreeTools.getChangeCheckedNodes = function() {
+      var children = data.nodeChildren(setting, data.getRoot(this.setting));
+			return data.getTreeChangeCheckedNodes(this.setting, children);
+		}
+
+		zTreeTools.setChkDisabled = function(node, disabled, inheritParent, inheritChildren) {
+			disabled = !!disabled;
+			inheritParent = !!inheritParent;
+			inheritChildren = !!inheritChildren;
+			view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren);
+			view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent);
+		}
+
+		var _updateNode = zTreeTools.updateNode;
+		zTreeTools.updateNode = function(node, checkTypeFlag) {
+			if (_updateNode) _updateNode.apply(zTreeTools, arguments);
+			if (!node || !this.setting.check.enable) return;
+			var nObj = $$(node, this.setting);
+			if (nObj.get(0) && tools.uCanDo(this.setting)) {
+				var checkObj = $$(node, consts.id.CHECK, this.setting);
+				if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
+				view.setChkClass(this.setting, checkObj, node);
+				view.repairParentChkClassWithSelf(this.setting, node);
+			}
+		}
+	},
+	//method of operate data
+	_data = {
+		getRadioCheckedList: function(setting) {
+			var checkedList = data.getRoot(setting).radioCheckedList;
+			for (var i=0, j=checkedList.length; i<j; i++) {
+				if(!data.getNodeCache(setting, checkedList[i].tId)) {
+					checkedList.splice(i, 1);
+					i--; j--;
+				}
+			}
+			return checkedList;
+		},
+		getCheckStatus: function(setting, node) {
+			if (!setting.check.enable || node.nocheck || node.chkDisabled) return null;
+			var checked = data.nodeChecked(setting, node),
+			r = {
+				checked: checked,
+				half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (checked ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0)))
+			};
+			return r;
+		},
+		getTreeCheckedNodes: function(setting, nodes, checked, results) {
+			if (!nodes) return [];
+			var onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL);
+			results = !results ? [] : results;
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				var node = nodes[i];
+        var children = data.nodeChildren(setting, node);
+        var nodeChecked = data.nodeChecked(setting, node);
+				if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked == checked) {
+					results.push(node);
+					if(onlyOne) {
+						break;
+					}
+				}
+				data.getTreeCheckedNodes(setting, children, checked, results);
+				if(onlyOne && results.length > 0) {
+					break;
+				}
+			}
+			return results;
+		},
+		getTreeChangeCheckedNodes: function(setting, nodes, results) {
+			if (!nodes) return [];
+			results = !results ? [] : results;
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				var node = nodes[i];
+        var children = data.nodeChildren(setting, node);
+        var nodeChecked = data.nodeChecked(setting, node);
+				if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked != node.checkedOld) {
+					results.push(node);
+				}
+				data.getTreeChangeCheckedNodes(setting, children, results);
+			}
+			return results;
+		},
+		makeChkFlag: function(setting, node) {
+			if (!node) return;
+			var chkFlag = -1;
+			var children = data.nodeChildren(setting, node);
+			if (children) {
+				for (var i = 0, l = children.length; i < l; i++) {
+					var cNode = children[i];
+          var nodeChecked = data.nodeChecked(setting, cNode);
+					var tmp = -1;
+					if (setting.check.chkStyle == consts.radio.STYLE) {
+						if (cNode.nocheck === true || cNode.chkDisabled === true) {
+							tmp = cNode.check_Child_State;
+						} else if (cNode.halfCheck === true) {
+							tmp = 2;
+						} else if (nodeChecked) {
+							tmp = 2;
+						} else {
+							tmp = cNode.check_Child_State > 0 ? 2:0;
+						}
+						if (tmp == 2) {
+							chkFlag = 2; break;
+						} else if (tmp == 0){
+							chkFlag = 0;
+						}
+					} else if (setting.check.chkStyle == consts.checkbox.STYLE) {
+						if (cNode.nocheck === true || cNode.chkDisabled === true) {
+							tmp = cNode.check_Child_State;
+						} else if (cNode.halfCheck === true) {
+							tmp = 1;
+						} else if (nodeChecked) {
+							tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1;
+						} else {
+							tmp = (cNode.check_Child_State > 0) ? 1 : 0;
+						}
+						if (tmp === 1) {
+							chkFlag = 1; break;
+						} else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) {
+							chkFlag = 1; break;
+						} else if (chkFlag === 2 && tmp > -1 && tmp < 2) {
+							chkFlag = 1; break;
+						} else if (tmp > -1) {
+							chkFlag = tmp;
+						}
+					}
+				}
+			}
+			node.check_Child_State = chkFlag;
+		}
+	},
+	//method of event proxy
+	_event = {
+
+	},
+	//method of event handler
+	_handler = {
+		onCheckNode: function (event, node) {
+			if (node.chkDisabled === true) return false;
+			var setting = data.getSetting(event.data.treeId);
+			if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true;
+      var nodeChecked = data.nodeChecked(setting, node);
+      data.nodeChecked(setting, node, !nodeChecked);
+			view.checkNodeRelation(setting, node);
+			var checkObj = $$(node, consts.id.CHECK, setting);
+			view.setChkClass(setting, checkObj, node);
+			view.repairParentChkClassWithSelf(setting, node);
+			setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]);
+			return true;
+		},
+		onMouseoverCheck: function(event, node) {
+			if (node.chkDisabled === true) return false;
+			var setting = data.getSetting(event.data.treeId),
+			checkObj = $$(node, consts.id.CHECK, setting);
+			node.check_Focus = true;
+			view.setChkClass(setting, checkObj, node);
+			return true;
+		},
+		onMouseoutCheck: function(event, node) {
+			if (node.chkDisabled === true) return false;
+			var setting = data.getSetting(event.data.treeId),
+			checkObj = $$(node, consts.id.CHECK, setting);
+			node.check_Focus = false;
+			view.setChkClass(setting, checkObj, node);
+			return true;
+		}
+	},
+	//method of tools for zTree
+	_tools = {
+
+	},
+	//method of operate ztree dom
+	_view = {
+		checkNodeRelation: function(setting, node) {
+			var pNode, i, l,
+			r = consts.radio;
+      var nodeChecked = data.nodeChecked(setting, node);
+			if (setting.check.chkStyle == r.STYLE) {
+				var checkedList = data.getRadioCheckedList(setting);
+				if (nodeChecked) {
+					if (setting.check.radioType == r.TYPE_ALL) {
+						for (i = checkedList.length-1; i >= 0; i--) {
+							pNode = checkedList[i];
+              var pNodeChecked = data.nodeChecked(setting, pNode);
+							if (pNodeChecked && pNode != node) {
+                data.nodeChecked(setting, pNode, false);
+								checkedList.splice(i, 1);
+
+								view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
+								if (pNode.parentTId != node.parentTId) {
+									view.repairParentChkClassWithSelf(setting, pNode);
+								}
+							}
+						}
+						checkedList.push(node);
+					} else {
+						var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
+            var children = data.nodeChildren(setting, parentNode);
+						for (i = 0, l = children.length; i < l; i++) {
+							pNode = children[i];
+              var pNodeChecked = data.nodeChecked(setting, pNode);
+							if (pNodeChecked && pNode != node) {
+								data.nodeChecked(setting, pNode, false);
+								view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
+							}
+						}
+					}
+				} else if (setting.check.radioType == r.TYPE_ALL) {
+					for (i = 0, l = checkedList.length; i < l; i++) {
+						if (node == checkedList[i]) {
+							checkedList.splice(i, 1);
+							break;
+						}
+					}
+				}
+
+			} else {
+        var children = data.nodeChildren(setting, node);
+				if (nodeChecked && (!children || children.length==0 || setting.check.chkboxType.Y.indexOf("s") > -1)) {
+					view.setSonNodeCheckBox(setting, node, true);
+				}
+				if (!nodeChecked && (!children || children.length==0 || setting.check.chkboxType.N.indexOf("s") > -1)) {
+					view.setSonNodeCheckBox(setting, node, false);
+				}
+				if (nodeChecked && setting.check.chkboxType.Y.indexOf("p") > -1) {
+					view.setParentNodeCheckBox(setting, node, true);
+				}
+				if (!nodeChecked && setting.check.chkboxType.N.indexOf("p") > -1) {
+					view.setParentNodeCheckBox(setting, node, false);
+				}
+			}
+		},
+		makeChkClass: function(setting, node) {
+			var c = consts.checkbox, r = consts.radio,
+			fullStyle = "";
+      var nodeChecked = data.nodeChecked(setting, node);
+			if (node.chkDisabled === true) {
+				fullStyle = c.DISABLED;
+			} else if (node.halfCheck) {
+				fullStyle = c.PART;
+			} else if (setting.check.chkStyle == r.STYLE) {
+				fullStyle = (node.check_Child_State < 1)? c.FULL:c.PART;
+			} else {
+				fullStyle = nodeChecked ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL:c.PART) : ((node.check_Child_State < 1)? c.FULL:c.PART);
+			}
+			var chkName = setting.check.chkStyle + "_" + (nodeChecked ? c.TRUE : c.FALSE) + "_" + fullStyle;
+			chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName;
+			return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName;
+		},
+		repairAllChk: function(setting, checked) {
+			if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) {
+				var root = data.getRoot(setting);
+				var children = data.nodeChildren(setting, root);
+				for (var i = 0, l = children.length; i<l ; i++) {
+					var node = children[i];
+					if (node.nocheck !== true && node.chkDisabled !== true) {
+            data.nodeChecked(setting, node, checked);
+					}
+					view.setSonNodeCheckBox(setting, node, checked);
+				}
+			}
+		},
+		repairChkClass: function(setting, node) {
+			if (!node) return;
+			data.makeChkFlag(setting, node);
+			if (node.nocheck !== true) {
+				var checkObj = $$(node, consts.id.CHECK, setting);
+				view.setChkClass(setting, checkObj, node);
+			}
+		},
+		repairParentChkClass: function(setting, node) {
+			if (!node || !node.parentTId) return;
+			var pNode = node.getParentNode();
+			view.repairChkClass(setting, pNode);
+			view.repairParentChkClass(setting, pNode);
+		},
+		repairParentChkClassWithSelf: function(setting, node) {
+			if (!node) return;
+      var children = data.nodeChildren(setting, node);
+			if (children && children.length > 0) {
+				view.repairParentChkClass(setting, children[0]);
+			} else {
+				view.repairParentChkClass(setting, node);
+			}
+		},
+		repairSonChkDisabled: function(setting, node, chkDisabled, inherit) {
+			if (!node) return;
+      if (node.chkDisabled != chkDisabled) {
+				node.chkDisabled = chkDisabled;
+			}
+			view.repairChkClass(setting, node);
+      var children = data.nodeChildren(setting, node);
+      if (children && inherit) {
+				for (var i = 0, l = children.length; i < l; i++) {
+					var sNode = children[i];
+					view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit);
+				}
+			}
+		},
+		repairParentChkDisabled: function(setting, node, chkDisabled, inherit) {
+			if (!node) return;
+			if (node.chkDisabled != chkDisabled && inherit) {
+				node.chkDisabled = chkDisabled;
+			}
+			view.repairChkClass(setting, node);
+			view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit);
+		},
+		setChkClass: function(setting, obj, node) {
+			if (!obj) return;
+			if (node.nocheck === true) {
+				obj.hide();
+			} else {
+				obj.show();
+			}
+            obj.attr('class', view.makeChkClass(setting, node));
+		},
+		setParentNodeCheckBox: function(setting, node, value, srcNode) {
+			var checkObj = $$(node, consts.id.CHECK, setting);
+			if (!srcNode) srcNode = node;
+			data.makeChkFlag(setting, node);
+			if (node.nocheck !== true && node.chkDisabled !== true) {
+        data.nodeChecked(setting, node, value);
+				view.setChkClass(setting, checkObj, node);
+				if (setting.check.autoCheckTrigger && node != srcNode) {
+					setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
+				}
+			}
+			if (node.parentTId) {
+				var pSign = true;
+				if (!value) {
+          var pNodes = data.nodeChildren(setting, node.getParentNode());
+					for (var i = 0, l = pNodes.length; i < l; i++) {
+					  var pNode = pNodes[i];
+            var nodeChecked = data.nodeChecked(setting, pNode);
+						if ((pNode.nocheck !== true && pNode.chkDisabled !== true && nodeChecked)
+						|| ((pNode.nocheck === true || pNode.chkDisabled === true) && pNode.check_Child_State > 0)) {
+							pSign = false;
+							break;
+						}
+					}
+				}
+				if (pSign) {
+					view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode);
+				}
+			}
+		},
+		setSonNodeCheckBox: function(setting, node, value, srcNode) {
+			if (!node) return;
+			var checkObj = $$(node, consts.id.CHECK, setting);
+			if (!srcNode) srcNode = node;
+
+			var hasDisable = false;
+      var children = data.nodeChildren(setting, node);
+			if (children) {
+				for (var i = 0, l = children.length; i < l; i++) {
+					var sNode = children[i];
+					view.setSonNodeCheckBox(setting, sNode, value, srcNode);
+					if (sNode.chkDisabled === true) hasDisable = true;
+				}
+			}
+
+			if (node != data.getRoot(setting) && node.chkDisabled !== true) {
+				if (hasDisable && node.nocheck !== true) {
+					data.makeChkFlag(setting, node);
+				}
+				if (node.nocheck !== true && node.chkDisabled !== true) {
+          data.nodeChecked(setting, node, value);
+					if (!hasDisable) node.check_Child_State = (children && children.length > 0) ? (value ? 2 : 0) : -1;
+				} else {
+					node.check_Child_State = -1;
+				}
+				view.setChkClass(setting, checkObj, node);
+				if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) {
+					setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
+				}
+			}
+
+		}
+	},
+
+	_z = {
+		tools: _tools,
+		view: _view,
+		event: _event,
+		data: _data
+	};
+	$.extend(true, $.fn.zTree.consts, _consts);
+	$.extend(true, $.fn.zTree._z, _z);
+
+	var zt = $.fn.zTree,
+	tools = zt._z.tools,
+	consts = zt.consts,
+	view = zt._z.view,
+	data = zt._z.data,
+	event = zt._z.event,
+	$$ = tools.$;
+
+	data.nodeChecked = function(setting, node, newChecked) {
+    if (!node) {
+      return false;
+    }
+    var key = setting.data.key.checked;
+    if (typeof newChecked !== 'undefined') {
+      if (typeof newChecked === "string") {
+        newChecked = tools.eqs(checked, "true");
+      }
+      newChecked = !!newChecked;
+      node[key] = newChecked;
+    }
+    return node[key];
+  };
+
+	data.exSetting(_setting);
+	data.addInitBind(_bindEvent);
+	data.addInitUnBind(_unbindEvent);
+	data.addInitCache(_initCache);
+	data.addInitNode(_initNode);
+	data.addInitProxy(_eventProxy, true);
+	data.addInitRoot(_initRoot);
+	data.addBeforeA(_beforeA);
+	data.addZTreeTools(_zTreeTools);
+
+	var _createNodes = view.createNodes;
+	view.createNodes = function(setting, level, nodes, parentNode, index) {
+		if (_createNodes) _createNodes.apply(view, arguments);
+		if (!nodes) return;
+		view.repairParentChkClassWithSelf(setting, parentNode);
+	}
+	var _removeNode = view.removeNode;
+	view.removeNode = function(setting, node) {
+		var parentNode = node.getParentNode();
+		if (_removeNode) _removeNode.apply(view, arguments);
+		if (!node || !parentNode) return;
+		view.repairChkClass(setting, parentNode);
+		view.repairParentChkClass(setting, parentNode);
+	}
+
+	var _appendNodes = view.appendNodes;
+	view.appendNodes = function(setting, level, nodes, parentNode, index, initFlag, openFlag) {
+		var html = "";
+		if (_appendNodes) {
+			html = _appendNodes.apply(view, arguments);
+		}
+		if (parentNode) {
+			data.makeChkFlag(setting, parentNode);
+		}
+		return html;
+	}
+})(jQuery);
+/*
+ * JQuery zTree exedit v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function($){
+	//default consts of exedit
+	var _consts = {
+		event: {
+			DRAG: "ztree_drag",
+			DROP: "ztree_drop",
+			RENAME: "ztree_rename",
+			DRAGMOVE:"ztree_dragmove"
+		},
+		id: {
+			EDIT: "_edit",
+			INPUT: "_input",
+			REMOVE: "_remove"
+		},
+		move: {
+			TYPE_INNER: "inner",
+			TYPE_PREV: "prev",
+			TYPE_NEXT: "next"
+		},
+		node: {
+			CURSELECTED_EDIT: "curSelectedNode_Edit",
+			TMPTARGET_TREE: "tmpTargetzTree",
+			TMPTARGET_NODE: "tmpTargetNode"
+		}
+	},
+	//default setting of exedit
+	_setting = {
+		edit: {
+			enable: false,
+			editNameSelectAll: false,
+			showRemoveBtn: true,
+			showRenameBtn: true,
+			removeTitle: "remove",
+			renameTitle: "rename",
+			drag: {
+				autoExpandTrigger: false,
+				isCopy: true,
+				isMove: true,
+				prev: true,
+				next: true,
+				inner: true,
+				minMoveSize: 5,
+				borderMax: 10,
+				borderMin: -5,
+				maxShowNodeNum: 5,
+				autoOpenTime: 500
+			}
+		},
+		view: {
+			addHoverDom: null,
+			removeHoverDom: null
+		},
+		callback: {
+			beforeDrag:null,
+			beforeDragOpen:null,
+			beforeDrop:null,
+			beforeEditName:null,
+			beforeRename:null,
+			onDrag:null,
+			onDragMove:null,
+			onDrop:null,
+			onRename:null
+		}
+	},
+	//default root of exedit
+	_initRoot = function (setting) {
+		var r = data.getRoot(setting), rs = data.getRoots();
+		r.curEditNode = null;
+		r.curEditInput = null;
+		r.curHoverNode = null;
+		r.dragFlag = 0;
+		r.dragNodeShowBefore = [];
+		r.dragMaskList = new Array();
+		rs.showHoverDom = true;
+	},
+	//default cache of exedit
+	_initCache = function(treeId) {},
+	//default bind event of exedit
+	_bindEvent = function(setting) {
+		var o = setting.treeObj;
+		var c = consts.event;
+		o.bind(c.RENAME, function (event, treeId, treeNode, isCancel) {
+			tools.apply(setting.callback.onRename, [event, treeId, treeNode, isCancel]);
+		});
+
+		o.bind(c.DRAG, function (event, srcEvent, treeId, treeNodes) {
+			tools.apply(setting.callback.onDrag, [srcEvent, treeId, treeNodes]);
+		});
+
+		o.bind(c.DRAGMOVE,function(event, srcEvent, treeId, treeNodes){
+			tools.apply(setting.callback.onDragMove,[srcEvent, treeId, treeNodes]);
+		});
+
+		o.bind(c.DROP, function (event, srcEvent, treeId, treeNodes, targetNode, moveType, isCopy) {
+			tools.apply(setting.callback.onDrop, [srcEvent, treeId, treeNodes, targetNode, moveType, isCopy]);
+		});
+	},
+	_unbindEvent = function(setting) {
+		var o = setting.treeObj;
+		var c = consts.event;
+		o.unbind(c.RENAME);
+		o.unbind(c.DRAG);
+		o.unbind(c.DRAGMOVE);
+		o.unbind(c.DROP);
+	},
+	//default event proxy of exedit
+	_eventProxy = function(e) {
+		var target = e.target,
+		setting = data.getSetting(e.data.treeId),
+		relatedTarget = e.relatedTarget,
+		tId = "", node = null,
+		nodeEventType = "", treeEventType = "",
+		nodeEventCallback = null, treeEventCallback = null,
+		tmp = null;
+
+		if (tools.eqs(e.type, "mouseover")) {
+			tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
+			if (tmp) {
+				tId = tools.getNodeMainDom(tmp).id;
+				nodeEventType = "hoverOverNode";
+			}
+		} else if (tools.eqs(e.type, "mouseout")) {
+			tmp = tools.getMDom(setting, relatedTarget, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
+			if (!tmp) {
+				tId = "remove";
+				nodeEventType = "hoverOutNode";
+			}
+		} else if (tools.eqs(e.type, "mousedown")) {
+			tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
+			if (tmp) {
+				tId = tools.getNodeMainDom(tmp).id;
+				nodeEventType = "mousedownNode";
+			}
+		}
+		if (tId.length>0) {
+			node = data.getNodeCache(setting, tId);
+			switch (nodeEventType) {
+				case "mousedownNode" :
+					nodeEventCallback = _handler.onMousedownNode;
+					break;
+				case "hoverOverNode" :
+					nodeEventCallback = _handler.onHoverOverNode;
+					break;
+				case "hoverOutNode" :
+					nodeEventCallback = _handler.onHoverOutNode;
+					break;
+			}
+		}
+		var proxyResult = {
+			stop: false,
+			node: node,
+			nodeEventType: nodeEventType,
+			nodeEventCallback: nodeEventCallback,
+			treeEventType: treeEventType,
+			treeEventCallback: treeEventCallback
+		};
+		return proxyResult
+	},
+	//default init node of exedit
+	_initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
+		if (!n) return;
+		n.isHover = false;
+		n.editNameFlag = false;
+	},
+	//update zTreeObj, add method of edit
+	_zTreeTools = function(setting, zTreeTools) {
+		zTreeTools.cancelEditName = function(newName) {
+			var root = data.getRoot(this.setting);
+			if (!root.curEditNode) return;
+			view.cancelCurEditNode(this.setting, newName?newName:null, true);
+		}
+		zTreeTools.copyNode = function(targetNode, node, moveType, isSilent) {
+			if (!node) return null;
+      var isParent = data.nodeIsParent(setting, targetNode);
+			if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null;
+			var _this = this,
+				newNode = tools.clone(node);
+			if (!targetNode) {
+				targetNode = null;
+				moveType = consts.move.TYPE_INNER;
+			}
+			if (moveType == consts.move.TYPE_INNER) {
+				function copyCallback() {
+					view.addNodes(_this.setting, targetNode, -1, [newNode], isSilent);
+				}
+
+				if (tools.canAsync(this.setting, targetNode)) {
+					view.asyncNode(this.setting, targetNode, isSilent, copyCallback);
+				} else {
+					copyCallback();
+				}
+			} else {
+				view.addNodes(this.setting, targetNode.parentNode, -1, [newNode], isSilent);
+				view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent);
+			}
+			return newNode;
+		}
+		zTreeTools.editName = function(node) {
+			if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return;
+			if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true);
+			view.editNode(this.setting, node)
+		}
+		zTreeTools.moveNode = function(targetNode, node, moveType, isSilent) {
+			if (!node) return node;
+      var isParent = data.nodeIsParent(setting, targetNode);
+			if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) {
+				return null;
+			} else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find("#" + targetNode.tId).length > 0)) {
+				return null;
+			} else if (!targetNode) {
+				targetNode = null;
+			}
+			var _this = this;
+			function moveCallback() {
+				view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent);
+			}
+			if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) {
+				view.asyncNode(this.setting, targetNode, isSilent, moveCallback);
+			} else {
+				moveCallback();
+			}
+			return node;
+		}
+		zTreeTools.setEditable = function(editable) {
+			this.setting.edit.enable = editable;
+			return this.refresh();
+		}
+	},
+	//method of operate data
+	_data = {
+		setSonNodeLevel: function(setting, parentNode, node) {
+			if (!node) return;
+      var children = data.nodeChildren(setting, node);
+			node.level = (parentNode)? parentNode.level + 1 : 0;
+			if (!children) return;
+			for (var i = 0, l = children.length; i < l; i++) {
+				if (children[i]) data.setSonNodeLevel(setting, node, children[i]);
+			}
+		}
+	},
+	//method of event proxy
+	_event = {
+
+	},
+	//method of event handler
+	_handler = {
+		onHoverOverNode: function(event, node) {
+			var setting = data.getSetting(event.data.treeId),
+			root = data.getRoot(setting);
+			if (root.curHoverNode != node) {
+				_handler.onHoverOutNode(event);
+			}
+			root.curHoverNode = node;
+			view.addHoverDom(setting, node);
+		},
+		onHoverOutNode: function(event, node) {
+			var setting = data.getSetting(event.data.treeId),
+			root = data.getRoot(setting);
+			if (root.curHoverNode && !data.isSelectedNode(setting, root.curHoverNode)) {
+				view.removeTreeDom(setting, root.curHoverNode);
+				root.curHoverNode = null;
+			}
+		},
+		onMousedownNode: function(eventMouseDown, _node) {
+			var i,l,
+			setting = data.getSetting(eventMouseDown.data.treeId),
+			root = data.getRoot(setting), roots = data.getRoots();
+			//right click can't drag & drop
+			if (eventMouseDown.button == 2 || !setting.edit.enable || (!setting.edit.drag.isCopy && !setting.edit.drag.isMove)) return true;
+
+			//input of edit node name can't drag & drop
+			var target = eventMouseDown.target,
+			_nodes = data.getRoot(setting).curSelectedList,
+			nodes = [];
+			if (!data.isSelectedNode(setting, _node)) {
+				nodes = [_node];
+			} else {
+				for (i=0, l=_nodes.length; i<l; i++) {
+					if (_nodes[i].editNameFlag && tools.eqs(target.tagName, "input") && target.getAttribute("treeNode"+consts.id.INPUT) !== null) {
+						return true;
+					}
+					nodes.push(_nodes[i]);
+					if (nodes[0].parentTId !== _nodes[i].parentTId) {
+						nodes = [_node];
+						break;
+					}
+				}
+			}
+
+			view.editNodeBlur = true;
+			view.cancelCurEditNode(setting);
+
+			var doc = $(setting.treeObj.get(0).ownerDocument),
+			body = $(setting.treeObj.get(0).ownerDocument.body), curNode, tmpArrow, tmpTarget,
+			isOtherTree = false,
+			targetSetting = setting,
+			sourceSetting = setting,
+			preNode, nextNode,
+			preTmpTargetNodeId = null,
+			preTmpMoveType = null,
+			tmpTargetNodeId = null,
+			moveType = consts.move.TYPE_INNER,
+			mouseDownX = eventMouseDown.clientX,
+			mouseDownY = eventMouseDown.clientY,
+			startTime = (new Date()).getTime();
+
+			if (tools.uCanDo(setting)) {
+				doc.bind("mousemove", _docMouseMove);
+			}
+			function _docMouseMove(event) {
+				//avoid start drag after click node
+				if (root.dragFlag == 0 && Math.abs(mouseDownX - event.clientX) < setting.edit.drag.minMoveSize
+					&& Math.abs(mouseDownY - event.clientY) < setting.edit.drag.minMoveSize) {
+					return true;
+				}
+				var i, l, tmpNode, tmpDom, tmpNodes;
+				body.css("cursor", "pointer");
+
+				if (root.dragFlag == 0) {
+					if (tools.apply(setting.callback.beforeDrag, [setting.treeId, nodes], true) == false) {
+						_docMouseUp(event);
+						return true;
+					}
+
+					for (i=0, l=nodes.length; i<l; i++) {
+						if (i==0) {
+							root.dragNodeShowBefore = [];
+						}
+						tmpNode = nodes[i];
+						if (data.nodeIsParent(setting, tmpNode) && tmpNode.open) {
+							view.expandCollapseNode(setting, tmpNode, !tmpNode.open);
+							root.dragNodeShowBefore[tmpNode.tId] = true;
+						} else {
+							root.dragNodeShowBefore[tmpNode.tId] = false;
+						}
+					}
+
+					root.dragFlag = 1;
+					roots.showHoverDom = false;
+					tools.showIfameMask(setting, true);
+
+					//sort
+					var isOrder = true, lastIndex = -1;
+					if (nodes.length>1) {
+						var pNodes = nodes[0].parentTId ? data.nodeChildren(setting, nodes[0].getParentNode()) : data.getNodes(setting);
+						tmpNodes = [];
+						for (i=0, l=pNodes.length; i<l; i++) {
+							if (root.dragNodeShowBefore[pNodes[i].tId] !== undefined) {
+								if (isOrder && lastIndex > -1 && (lastIndex+1) !== i) {
+									isOrder = false;
+								}
+								tmpNodes.push(pNodes[i]);
+								lastIndex = i;
+							}
+							if (nodes.length === tmpNodes.length) {
+								nodes = tmpNodes;
+								break;
+							}
+						}
+					}
+					if (isOrder) {
+						preNode = nodes[0].getPreNode();
+						nextNode = nodes[nodes.length-1].getNextNode();
+					}
+
+					//set node in selected
+					curNode = $$("<ul class='zTreeDragUL'></ul>", setting);
+					for (i=0, l=nodes.length; i<l; i++) {
+						tmpNode = nodes[i];
+						tmpNode.editNameFlag = false;
+						view.selectNode(setting, tmpNode, i>0);
+						view.removeTreeDom(setting, tmpNode);
+
+						if (i > setting.edit.drag.maxShowNodeNum-1) {
+							continue;
+						}
+
+						tmpDom = $$("<li id='"+ tmpNode.tId +"_tmp'></li>", setting);
+						tmpDom.append($$(tmpNode, consts.id.A, setting).clone());
+						tmpDom.css("padding", "0");
+						tmpDom.children("#" + tmpNode.tId + consts.id.A).removeClass(consts.node.CURSELECTED);
+						curNode.append(tmpDom);
+						if (i == setting.edit.drag.maxShowNodeNum-1) {
+							tmpDom = $$("<li id='"+ tmpNode.tId +"_moretmp'><a>  ...  </a></li>", setting);
+							curNode.append(tmpDom);
+						}
+					}
+					curNode.attr("id", nodes[0].tId + consts.id.UL + "_tmp");
+					curNode.addClass(setting.treeObj.attr("class"));
+					curNode.appendTo(body);
+
+					tmpArrow = $$("<span class='tmpzTreeMove_arrow'></span>", setting);
+					tmpArrow.attr("id", "zTreeMove_arrow_tmp");
+					tmpArrow.appendTo(body);
+
+					setting.treeObj.trigger(consts.event.DRAG, [event, setting.treeId, nodes]);
+				}
+
+				if (root.dragFlag == 1) {
+					if (tmpTarget && tmpArrow.attr("id") == event.target.id && tmpTargetNodeId && (event.clientX + doc.scrollLeft()+2) > ($("#" + tmpTargetNodeId + consts.id.A, tmpTarget).offset().left)) {
+						var xT = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget);
+						event.target = (xT.length > 0) ? xT.get(0) : event.target;
+					} else if (tmpTarget) {
+						tmpTarget.removeClass(consts.node.TMPTARGET_TREE);
+						if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV)
+							.removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER);
+					}
+					tmpTarget = null;
+					tmpTargetNodeId = null;
+
+					//judge drag & drop in multi ztree
+					isOtherTree = false;
+					targetSetting = setting;
+					var settings = data.getSettings();
+					for (var s in settings) {
+						if (settings[s].treeId && settings[s].edit.enable && settings[s].treeId != setting.treeId
+							&& (event.target.id == settings[s].treeId || $(event.target).parents("#" + settings[s].treeId).length>0)) {
+							isOtherTree = true;
+							targetSetting = settings[s];
+						}
+					}
+
+					var docScrollTop = doc.scrollTop(),
+					docScrollLeft = doc.scrollLeft(),
+					treeOffset = targetSetting.treeObj.offset(),
+					scrollHeight = targetSetting.treeObj.get(0).scrollHeight,
+					scrollWidth = targetSetting.treeObj.get(0).scrollWidth,
+					dTop = (event.clientY + docScrollTop - treeOffset.top),
+					dBottom = (targetSetting.treeObj.height() + treeOffset.top - event.clientY - docScrollTop),
+					dLeft = (event.clientX + docScrollLeft - treeOffset.left),
+					dRight = (targetSetting.treeObj.width() + treeOffset.left - event.clientX - docScrollLeft),
+					isTop = (dTop < setting.edit.drag.borderMax && dTop > setting.edit.drag.borderMin),
+					isBottom = (dBottom < setting.edit.drag.borderMax && dBottom > setting.edit.drag.borderMin),
+					isLeft = (dLeft < setting.edit.drag.borderMax && dLeft > setting.edit.drag.borderMin),
+					isRight = (dRight < setting.edit.drag.borderMax && dRight > setting.edit.drag.borderMin),
+					isTreeInner = dTop > setting.edit.drag.borderMin && dBottom > setting.edit.drag.borderMin && dLeft > setting.edit.drag.borderMin && dRight > setting.edit.drag.borderMin,
+					isTreeTop = (isTop && targetSetting.treeObj.scrollTop() <= 0),
+					isTreeBottom = (isBottom && (targetSetting.treeObj.scrollTop() + targetSetting.treeObj.height()+10) >= scrollHeight),
+					isTreeLeft = (isLeft && targetSetting.treeObj.scrollLeft() <= 0),
+					isTreeRight = (isRight && (targetSetting.treeObj.scrollLeft() + targetSetting.treeObj.width()+10) >= scrollWidth);
+
+					if (event.target && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
+						//get node <li> dom
+						var targetObj = event.target;
+						while (targetObj && targetObj.tagName && !tools.eqs(targetObj.tagName, "li") && targetObj.id != targetSetting.treeId) {
+							targetObj = targetObj.parentNode;
+						}
+
+						var canMove = true;
+						//don't move to self or children of self
+						for (i=0, l=nodes.length; i<l; i++) {
+							tmpNode = nodes[i];
+							if (targetObj.id === tmpNode.tId) {
+								canMove = false;
+								break;
+							} else if ($$(tmpNode, setting).find("#" + targetObj.id).length > 0) {
+								canMove = false;
+								break;
+							}
+						}
+						if (canMove && event.target && tools.isChildOrSelf(event.target, targetObj.id + consts.id.A)) {
+							tmpTarget = $(targetObj);
+							tmpTargetNodeId = targetObj.id;
+						}
+					}
+
+					//the mouse must be in zTree
+					tmpNode = nodes[0];
+					if (isTreeInner && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
+						//judge mouse move in root of ztree
+						if (!tmpTarget && (event.target.id == targetSetting.treeId || isTreeTop || isTreeBottom || isTreeLeft || isTreeRight) && (isOtherTree || (!isOtherTree && tmpNode.parentTId))) {
+							tmpTarget = targetSetting.treeObj;
+						}
+						//auto scroll top
+						if (isTop) {
+							targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop()-10);
+						} else if (isBottom)  {
+							targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop()+10);
+						}
+						if (isLeft) {
+							targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()-10);
+						} else if (isRight) {
+							targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()+10);
+						}
+						//auto scroll left
+						if (tmpTarget && tmpTarget != targetSetting.treeObj && tmpTarget.offset().left < targetSetting.treeObj.offset().left) {
+							targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()+ tmpTarget.offset().left - targetSetting.treeObj.offset().left);
+						}
+					}
+
+					curNode.css({
+						"top": (event.clientY + docScrollTop + 3) + "px",
+						"left": (event.clientX + docScrollLeft + 3) + "px"
+					});
+
+					var dX = 0;
+					var dY = 0;
+					if (tmpTarget && tmpTarget.attr("id")!=targetSetting.treeId) {
+						var tmpTargetNode = tmpTargetNodeId == null ? null: data.getNodeCache(targetSetting, tmpTargetNodeId),
+							isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy),
+							isPrev = !!(preNode && tmpTargetNodeId === preNode.tId),
+							isNext = !!(nextNode && tmpTargetNodeId === nextNode.tId),
+							isInner = (tmpNode.parentTId && tmpNode.parentTId == tmpTargetNodeId),
+							canPrev = (isCopy || !isNext) && tools.apply(targetSetting.edit.drag.prev, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.prev),
+							canNext = (isCopy || !isPrev) && tools.apply(targetSetting.edit.drag.next, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.next),
+							canInner = (isCopy || !isInner) && !(targetSetting.data.keep.leaf && !data.nodeIsParent(setting, tmpTargetNode)) && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.inner);
+
+						function clearMove() {
+							tmpTarget = null;
+							tmpTargetNodeId = "";
+							moveType = consts.move.TYPE_INNER;
+							tmpArrow.css({
+								"display":"none"
+							});
+							if (window.zTreeMoveTimer) {
+								clearTimeout(window.zTreeMoveTimer);
+								window.zTreeMoveTargetNodeTId = null
+							}
+						}
+						if (!canPrev && !canNext && !canInner) {
+							clearMove();
+						} else {
+							var tmpTargetA = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget),
+								tmpNextA = tmpTargetNode.isLastNode ? null : $("#" + tmpTargetNode.getNextNode().tId + consts.id.A, tmpTarget.next()),
+								tmpTop = tmpTargetA.offset().top,
+								tmpLeft = tmpTargetA.offset().left,
+								prevPercent = canPrev ? (canInner ? 0.25 : (canNext ? 0.5 : 1) ) : -1,
+								nextPercent = canNext ? (canInner ? 0.75 : (canPrev ? 0.5 : 0) ) : -1,
+								dY_percent = (event.clientY + docScrollTop - tmpTop)/tmpTargetA.height();
+
+							if ((prevPercent==1 || dY_percent<=prevPercent && dY_percent>=-.2) && canPrev) {
+								dX = 1 - tmpArrow.width();
+								dY = tmpTop - tmpArrow.height()/2;
+								moveType = consts.move.TYPE_PREV;
+							} else if ((nextPercent==0 || dY_percent>=nextPercent && dY_percent<=1.2) && canNext) {
+								dX = 1 - tmpArrow.width();
+								dY = (tmpNextA == null || (data.nodeIsParent(setting, tmpTargetNode) && tmpTargetNode.open)) ? (tmpTop + tmpTargetA.height() - tmpArrow.height()/2) : (tmpNextA.offset().top - tmpArrow.height()/2);
+								moveType = consts.move.TYPE_NEXT;
+							} else if (canInner) {
+								dX = 5 - tmpArrow.width();
+								dY = tmpTop;
+								moveType = consts.move.TYPE_INNER;
+							} else {
+								clearMove();
+							}
+
+							if (tmpTarget) {
+								tmpArrow.css({
+									"display":"block",
+									"top": dY + "px",
+									"left": (tmpLeft + dX) + "px"
+								});
+								tmpTargetA.addClass(consts.node.TMPTARGET_NODE + "_" + moveType);
+
+								if (preTmpTargetNodeId != tmpTargetNodeId || preTmpMoveType != moveType) {
+									startTime = (new Date()).getTime();
+								}
+								if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && moveType == consts.move.TYPE_INNER) {
+									var startTimer = true;
+									if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId !== tmpTargetNode.tId) {
+										clearTimeout(window.zTreeMoveTimer);
+										window.zTreeMoveTargetNodeTId = null;
+									} else if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId === tmpTargetNode.tId) {
+										startTimer = false;
+									}
+									if (startTimer) {
+										window.zTreeMoveTimer = setTimeout(function() {
+											if (moveType != consts.move.TYPE_INNER) return;
+											if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && !tmpTargetNode.open && (new Date()).getTime() - startTime > targetSetting.edit.drag.autoOpenTime
+												&& tools.apply(targetSetting.callback.beforeDragOpen, [targetSetting.treeId, tmpTargetNode], true)) {
+												view.switchNode(targetSetting, tmpTargetNode);
+												if (targetSetting.edit.drag.autoExpandTrigger) {
+													targetSetting.treeObj.trigger(consts.event.EXPAND, [targetSetting.treeId, tmpTargetNode]);
+												}
+											}
+										}, targetSetting.edit.drag.autoOpenTime+50);
+										window.zTreeMoveTargetNodeTId = tmpTargetNode.tId;
+									}
+								}
+							}
+						}
+					} else {
+						moveType = consts.move.TYPE_INNER;
+						if (tmpTarget && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, null], !!targetSetting.edit.drag.inner)) {
+							tmpTarget.addClass(consts.node.TMPTARGET_TREE);
+						} else {
+							tmpTarget = null;
+						}
+						tmpArrow.css({
+							"display":"none"
+						});
+						if (window.zTreeMoveTimer) {
+							clearTimeout(window.zTreeMoveTimer);
+							window.zTreeMoveTargetNodeTId = null;
+						}
+					}
+					preTmpTargetNodeId = tmpTargetNodeId;
+					preTmpMoveType = moveType;
+
+					setting.treeObj.trigger(consts.event.DRAGMOVE, [event, setting.treeId, nodes]);
+				}
+				return false;
+			}
+
+			doc.bind("mouseup", _docMouseUp);
+			function _docMouseUp(event) {
+				if (window.zTreeMoveTimer) {
+					clearTimeout(window.zTreeMoveTimer);
+					window.zTreeMoveTargetNodeTId = null;
+				}
+				preTmpTargetNodeId = null;
+				preTmpMoveType = null;
+				doc.unbind("mousemove", _docMouseMove);
+				doc.unbind("mouseup", _docMouseUp);
+				doc.unbind("selectstart", _docSelect);
+				body.css("cursor", "");
+				if (tmpTarget) {
+					tmpTarget.removeClass(consts.node.TMPTARGET_TREE);
+					if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV)
+							.removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER);
+				}
+				tools.showIfameMask(setting, false);
+
+				roots.showHoverDom = true;
+				if (root.dragFlag == 0) return;
+				root.dragFlag = 0;
+
+				var i, l, tmpNode;
+				for (i=0, l=nodes.length; i<l; i++) {
+					tmpNode = nodes[i];
+					if (data.nodeIsParent(setting, tmpNode) && root.dragNodeShowBefore[tmpNode.tId] && !tmpNode.open) {
+						view.expandCollapseNode(setting, tmpNode, !tmpNode.open);
+						delete root.dragNodeShowBefore[tmpNode.tId];
+					}
+				}
+
+				if (curNode) curNode.remove();
+				if (tmpArrow) tmpArrow.remove();
+
+				var isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy);
+				if (!isCopy && tmpTarget && tmpTargetNodeId && nodes[0].parentTId && tmpTargetNodeId==nodes[0].parentTId && moveType == consts.move.TYPE_INNER) {
+					tmpTarget = null;
+				}
+				if (tmpTarget) {
+					var dragTargetNode = tmpTargetNodeId == null ? null: data.getNodeCache(targetSetting, tmpTargetNodeId);
+					if (tools.apply(setting.callback.beforeDrop, [targetSetting.treeId, nodes, dragTargetNode, moveType, isCopy], true) == false) {
+						view.selectNodes(sourceSetting, nodes);
+						return;
+					}
+					var newNodes = isCopy ? tools.clone(nodes) : nodes;
+
+					function dropCallback() {
+						if (isOtherTree) {
+							if (!isCopy) {
+								for(var i=0, l=nodes.length; i<l; i++) {
+									view.removeNode(setting, nodes[i]);
+								}
+							}
+							if (moveType == consts.move.TYPE_INNER) {
+								view.addNodes(targetSetting, dragTargetNode, -1, newNodes);
+							} else {
+								view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex()+1, newNodes);
+							}
+						} else {
+							if (isCopy && moveType == consts.move.TYPE_INNER) {
+								view.addNodes(targetSetting, dragTargetNode, -1, newNodes);
+							} else if (isCopy) {
+								view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex()+1, newNodes);
+							} else {
+								if (moveType != consts.move.TYPE_NEXT) {
+									for (i=0, l=newNodes.length; i<l; i++) {
+										view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false);
+									}
+								} else {
+									for (i=-1, l=newNodes.length-1; i<l; l--) {
+										view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false);
+									}
+								}
+							}
+						}
+						view.selectNodes(targetSetting, newNodes);
+
+						var a = $$(newNodes[0], setting).get(0);
+						view.scrollIntoView(setting, a);
+
+						setting.treeObj.trigger(consts.event.DROP, [event, targetSetting.treeId, newNodes, dragTargetNode, moveType, isCopy]);
+					}
+
+					if (moveType == consts.move.TYPE_INNER && tools.canAsync(targetSetting, dragTargetNode)) {
+						view.asyncNode(targetSetting, dragTargetNode, false, dropCallback);
+					} else {
+						dropCallback();
+					}
+
+				} else {
+					view.selectNodes(sourceSetting, nodes);
+					setting.treeObj.trigger(consts.event.DROP, [event, setting.treeId, nodes, null, null, null]);
+				}
+			}
+
+			doc.bind("selectstart", _docSelect);
+			function _docSelect() {
+				return false;
+			}
+
+			//Avoid FireFox's Bug
+			//If zTree Div CSS set 'overflow', so drag node outside of zTree, and event.target is error.
+			if(eventMouseDown.preventDefault) {
+				eventMouseDown.preventDefault();
+			}
+			return true;
+		}
+	},
+	//method of tools for zTree
+	_tools = {
+		getAbs: function (obj) {
+			var oRect = obj.getBoundingClientRect(),
+			scrollTop = document.body.scrollTop+document.documentElement.scrollTop,
+			scrollLeft = document.body.scrollLeft+document.documentElement.scrollLeft;
+			return [oRect.left+scrollLeft,oRect.top+scrollTop];
+		},
+		inputFocus: function(inputObj) {
+			if (inputObj.get(0)) {
+				inputObj.focus();
+				tools.setCursorPosition(inputObj.get(0), inputObj.val().length);
+			}
+		},
+		inputSelect: function(inputObj) {
+			if (inputObj.get(0)) {
+				inputObj.focus();
+				inputObj.select();
+			}
+		},
+		setCursorPosition: function(obj, pos){
+			if(obj.setSelectionRange) {
+				obj.focus();
+				obj.setSelectionRange(pos,pos);
+			} else if (obj.createTextRange) {
+				var range = obj.createTextRange();
+				range.collapse(true);
+				range.moveEnd('character', pos);
+				range.moveStart('character', pos);
+				range.select();
+			}
+		},
+		showIfameMask: function(setting, showSign) {
+			var root = data.getRoot(setting);
+			//clear full mask
+			while (root.dragMaskList.length > 0) {
+				root.dragMaskList[0].remove();
+				root.dragMaskList.shift();
+			}
+			if (showSign) {
+				//show mask
+				var iframeList = $$("iframe", setting);
+				for (var i = 0, l = iframeList.length; i < l; i++) {
+					var obj = iframeList.get(i),
+					r = tools.getAbs(obj),
+					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);
+					dragMask.appendTo($$("body", setting));
+					root.dragMaskList.push(dragMask);
+				}
+			}
+		}
+	},
+	//method of operate ztree dom
+	_view = {
+		addEditBtn: function(setting, node) {
+			if (node.editNameFlag || $$(node, consts.id.EDIT, setting).length > 0) {
+				return;
+			}
+			if (!tools.apply(setting.edit.showRenameBtn, [setting.treeId, node], setting.edit.showRenameBtn)) {
+				return;
+			}
+			var aObj = $$(node, consts.id.A, setting),
+			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>";
+			aObj.append(editStr);
+
+			$$(node, consts.id.EDIT, setting).bind('click',
+				function() {
+					if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeEditName, [setting.treeId, node], true) == false) return false;
+					view.editNode(setting, node);
+					return false;
+				}
+				).show();
+		},
+		addRemoveBtn: function(setting, node) {
+			if (node.editNameFlag || $$(node, consts.id.REMOVE, setting).length > 0) {
+				return;
+			}
+			if (!tools.apply(setting.edit.showRemoveBtn, [setting.treeId, node], setting.edit.showRemoveBtn)) {
+				return;
+			}
+			var aObj = $$(node, consts.id.A, setting),
+			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>";
+			aObj.append(removeStr);
+
+			$$(node, consts.id.REMOVE, setting).bind('click',
+				function() {
+					if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return false;
+					view.removeNode(setting, node);
+					setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]);
+					return false;
+				}
+				).bind('mousedown',
+				function(eventMouseDown) {
+					return true;
+				}
+				).show();
+		},
+		addHoverDom: function(setting, node) {
+			if (data.getRoots().showHoverDom) {
+				node.isHover = true;
+				if (setting.edit.enable) {
+					view.addEditBtn(setting, node);
+					view.addRemoveBtn(setting, node);
+				}
+				tools.apply(setting.view.addHoverDom, [setting.treeId, node]);
+			}
+		},
+		cancelCurEditNode: function (setting, forceName, isCancel) {
+			var root = data.getRoot(setting),
+			node = root.curEditNode;
+
+			if (node) {
+				var inputObj = root.curEditInput,
+				newName = forceName ? forceName:(isCancel ? data.nodeName(setting, node): inputObj.val());
+				if (tools.apply(setting.callback.beforeRename, [setting.treeId, node, newName, isCancel], true) === false) {
+					return false;
+				}
+        data.nodeName(setting, node, newName);
+				var aObj = $$(node, consts.id.A, setting);
+				aObj.removeClass(consts.node.CURSELECTED_EDIT);
+				inputObj.unbind();
+				view.setNodeName(setting, node);
+				node.editNameFlag = false;
+				root.curEditNode = null;
+				root.curEditInput = null;
+				view.selectNode(setting, node, false);
+				setting.treeObj.trigger(consts.event.RENAME, [setting.treeId, node, isCancel]);
+			}
+			root.noSelection = true;
+			return true;
+		},
+		editNode: function(setting, node) {
+			var root = data.getRoot(setting);
+			view.editNodeBlur = false;
+			if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
+				setTimeout(function() {tools.inputFocus(root.curEditInput);}, 0);
+				return;
+			}
+			node.editNameFlag = true;
+			view.removeTreeDom(setting, node);
+			view.cancelCurEditNode(setting);
+			view.selectNode(setting, node, false);
+			$$(node, consts.id.SPAN, setting).html("<input type=text class='rename' id='" + node.tId + consts.id.INPUT + "' treeNode" + consts.id.INPUT + " >");
+			var inputObj = $$(node, consts.id.INPUT, setting);
+			inputObj.attr("value", data.nodeName(setting, node));
+			if (setting.edit.editNameSelectAll) {
+				tools.inputSelect(inputObj);
+			} else {
+				tools.inputFocus(inputObj);
+			}
+
+			inputObj.bind('blur', function(event) {
+				if (!view.editNodeBlur) {
+					view.cancelCurEditNode(setting);
+				}
+			}).bind('keydown', function(event) {
+				if (event.keyCode=="13") {
+					view.editNodeBlur = true;
+					view.cancelCurEditNode(setting);
+				} else if (event.keyCode=="27") {
+					view.cancelCurEditNode(setting, null, true);
+				}
+			}).bind('click', function(event) {
+				return false;
+			}).bind('dblclick', function(event) {
+				return false;
+			});
+
+			$$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED_EDIT);
+			root.curEditInput = inputObj;
+			root.noSelection = false;
+			root.curEditNode = node;
+		},
+		moveNode: function(setting, targetNode, node, moveType, animateFlag, isSilent) {
+			var root = data.getRoot(setting);
+			if (targetNode == node) return;
+			if (setting.data.keep.leaf && targetNode && !data.nodeIsParent(setting, targetNode) && moveType == consts.move.TYPE_INNER) return;
+			var oldParentNode = (node.parentTId ? node.getParentNode(): root),
+			targetNodeIsRoot = (targetNode === null || targetNode == root);
+			if (targetNodeIsRoot && targetNode === null) targetNode = root;
+			if (targetNodeIsRoot) moveType = consts.move.TYPE_INNER;
+			var targetParentNode = (targetNode.parentTId ? targetNode.getParentNode() : root);
+
+			if (moveType != consts.move.TYPE_PREV && moveType != consts.move.TYPE_NEXT) {
+				moveType = consts.move.TYPE_INNER;
+			}
+
+			if (moveType == consts.move.TYPE_INNER) {
+				if (targetNodeIsRoot) {
+					//parentTId of root node is null
+					node.parentTId = null;
+				} else {
+					if (!data.nodeIsParent(setting, targetNode)) {
+            data.nodeIsParent(setting, targetNode, true);
+						targetNode.open = !!targetNode.open;
+						view.setNodeLineIcos(setting, targetNode);
+					}
+					node.parentTId = targetNode.tId;
+				}
+			}
+
+			//move node Dom
+			var targetObj, target_ulObj;
+			if (targetNodeIsRoot) {
+				targetObj = setting.treeObj;
+				target_ulObj = targetObj;
+			} else {
+				if (!isSilent && moveType == consts.move.TYPE_INNER) {
+					view.expandCollapseNode(setting, targetNode, true, false);
+				} else if (!isSilent) {
+					view.expandCollapseNode(setting, targetNode.getParentNode(), true, false);
+				}
+				targetObj = $$(targetNode, setting);
+				target_ulObj = $$(targetNode, consts.id.UL, setting);
+				if (!!targetObj.get(0) && !target_ulObj.get(0)) {
+					var ulstr = [];
+					view.makeUlHtml(setting, targetNode, ulstr, '');
+					targetObj.append(ulstr.join(''));
+				}
+				target_ulObj = $$(targetNode, consts.id.UL, setting);
+			}
+			var nodeDom = $$(node, setting);
+			if (!nodeDom.get(0)) {
+				nodeDom = view.appendNodes(setting, node.level, [node], null, -1, false, true).join('');
+			} else if (!targetObj.get(0)) {
+				nodeDom.remove();
+			}
+			if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) {
+				target_ulObj.append(nodeDom);
+			} else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) {
+				targetObj.before(nodeDom);
+			} else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) {
+				targetObj.after(nodeDom);
+			}
+
+			//repair the data after move
+			var i,l,
+			tmpSrcIndex = -1,
+			tmpTargetIndex = 0,
+			oldNeighbor = null,
+			newNeighbor = null,
+			oldLevel = node.level;
+			var oldChildren = data.nodeChildren(setting, oldParentNode);
+			var targetParentChildren = data.nodeChildren(setting, targetParentNode);
+			var targetChildren = data.nodeChildren(setting, targetNode);
+			if (node.isFirstNode) {
+				tmpSrcIndex = 0;
+				if (oldChildren.length > 1 ) {
+					oldNeighbor = oldChildren[1];
+					oldNeighbor.isFirstNode = true;
+				}
+			} else if (node.isLastNode) {
+				tmpSrcIndex = oldChildren.length -1;
+				oldNeighbor = oldChildren[tmpSrcIndex - 1];
+				oldNeighbor.isLastNode = true;
+			} else {
+				for (i = 0, l = oldChildren.length; i < l; i++) {
+					if (oldChildren[i].tId == node.tId) {
+						tmpSrcIndex = i;
+						break;
+					}
+				}
+			}
+			if (tmpSrcIndex >= 0) {
+				oldChildren.splice(tmpSrcIndex, 1);
+			}
+			if (moveType != consts.move.TYPE_INNER) {
+				for (i = 0, l = targetParentChildren.length; i < l; i++) {
+					if (targetParentChildren[i].tId == targetNode.tId) tmpTargetIndex = i;
+				}
+			}
+			if (moveType == consts.move.TYPE_INNER) {
+				if (!targetChildren) {
+          targetChildren = data.nodeChildren(setting, targetNode, []);
+        }
+				if (targetChildren.length > 0) {
+					newNeighbor = targetChildren[targetChildren.length - 1];
+					newNeighbor.isLastNode = false;
+				}
+				targetChildren.splice(targetChildren.length, 0, node);
+				node.isLastNode = true;
+				node.isFirstNode = (targetChildren.length == 1);
+			} else if (targetNode.isFirstNode && moveType == consts.move.TYPE_PREV) {
+				targetParentChildren.splice(tmpTargetIndex, 0, node);
+				newNeighbor = targetNode;
+				newNeighbor.isFirstNode = false;
+				node.parentTId = targetNode.parentTId;
+				node.isFirstNode = true;
+				node.isLastNode = false;
+
+			} else if (targetNode.isLastNode && moveType == consts.move.TYPE_NEXT) {
+				targetParentChildren.splice(tmpTargetIndex + 1, 0, node);
+				newNeighbor = targetNode;
+				newNeighbor.isLastNode = false;
+				node.parentTId = targetNode.parentTId;
+				node.isFirstNode = false;
+				node.isLastNode = true;
+
+			} else {
+				if (moveType == consts.move.TYPE_PREV) {
+					targetParentChildren.splice(tmpTargetIndex, 0, node);
+				} else {
+					targetParentChildren.splice(tmpTargetIndex + 1, 0, node);
+				}
+				node.parentTId = targetNode.parentTId;
+				node.isFirstNode = false;
+				node.isLastNode = false;
+			}
+			data.fixPIdKeyValue(setting, node);
+			data.setSonNodeLevel(setting, node.getParentNode(), node);
+
+			//repair node what been moved
+			view.setNodeLineIcos(setting, node);
+			view.repairNodeLevelClass(setting, node, oldLevel);
+
+			//repair node's old parentNode dom
+			if (!setting.data.keep.parent && oldChildren.length < 1) {
+				//old parentNode has no child nodes
+        data.nodeIsParent(setting, oldParentNode, false);
+				oldParentNode.open = false;
+				var tmp_ulObj = $$(oldParentNode, consts.id.UL, setting),
+				tmp_switchObj = $$(oldParentNode, consts.id.SWITCH, setting),
+				tmp_icoObj = $$(oldParentNode, consts.id.ICON, setting);
+				view.replaceSwitchClass(oldParentNode, tmp_switchObj, consts.folder.DOCU);
+				view.replaceIcoClass(oldParentNode, tmp_icoObj, consts.folder.DOCU);
+				tmp_ulObj.css("display", "none");
+
+			} else if (oldNeighbor) {
+				//old neigbor node
+				view.setNodeLineIcos(setting, oldNeighbor);
+			}
+
+			//new neigbor node
+			if (newNeighbor) {
+				view.setNodeLineIcos(setting, newNeighbor);
+			}
+
+			//repair checkbox / radio
+			if (!!setting.check && setting.check.enable && view.repairChkClass) {
+				view.repairChkClass(setting, oldParentNode);
+				view.repairParentChkClassWithSelf(setting, oldParentNode);
+				if (oldParentNode != node.parent)
+					view.repairParentChkClassWithSelf(setting, node);
+			}
+
+			//expand parents after move
+			if (!isSilent) {
+				view.expandCollapseParentNode(setting, node.getParentNode(), true, animateFlag);
+			}
+		},
+		removeEditBtn: function(setting, node) {
+			$$(node, consts.id.EDIT, setting).unbind().remove();
+		},
+		removeRemoveBtn: function(setting, node) {
+			$$(node, consts.id.REMOVE, setting).unbind().remove();
+		},
+		removeTreeDom: function(setting, node) {
+			node.isHover = false;
+			view.removeEditBtn(setting, node);
+			view.removeRemoveBtn(setting, node);
+			tools.apply(setting.view.removeHoverDom, [setting.treeId, node]);
+		},
+		repairNodeLevelClass: function(setting, node, oldLevel) {
+			if (oldLevel === node.level) return;
+			var liObj = $$(node, setting),
+			aObj = $$(node, consts.id.A, setting),
+			ulObj = $$(node, consts.id.UL, setting),
+			oldClass = consts.className.LEVEL + oldLevel,
+			newClass = consts.className.LEVEL + node.level;
+			liObj.removeClass(oldClass);
+			liObj.addClass(newClass);
+			aObj.removeClass(oldClass);
+			aObj.addClass(newClass);
+			ulObj.removeClass(oldClass);
+			ulObj.addClass(newClass);
+		},
+		selectNodes : function(setting, nodes) {
+			for (var i=0, l=nodes.length; i<l; i++) {
+				view.selectNode(setting, nodes[i], i>0);
+			}
+		}
+	},
+
+	_z = {
+		tools: _tools,
+		view: _view,
+		event: _event,
+		data: _data
+	};
+	$.extend(true, $.fn.zTree.consts, _consts);
+	$.extend(true, $.fn.zTree._z, _z);
+
+	var zt = $.fn.zTree,
+	tools = zt._z.tools,
+	consts = zt.consts,
+	view = zt._z.view,
+	data = zt._z.data,
+	event = zt._z.event,
+	$$ = tools.$;
+
+	data.exSetting(_setting);
+	data.addInitBind(_bindEvent);
+	data.addInitUnBind(_unbindEvent);
+	data.addInitCache(_initCache);
+	data.addInitNode(_initNode);
+	data.addInitProxy(_eventProxy);
+	data.addInitRoot(_initRoot);
+	data.addZTreeTools(_zTreeTools);
+
+	var _cancelPreSelectedNode = view.cancelPreSelectedNode;
+	view.cancelPreSelectedNode = function (setting, node) {
+		var list = data.getRoot(setting).curSelectedList;
+		for (var i=0, j=list.length; i<j; i++) {
+			if (!node || node === list[i]) {
+				view.removeTreeDom(setting, list[i]);
+				if (node) break;
+			}
+		}
+		if (_cancelPreSelectedNode) _cancelPreSelectedNode.apply(view, arguments);
+	}
+
+	var _createNodes = view.createNodes;
+	view.createNodes = function(setting, level, nodes, parentNode, index) {
+		if (_createNodes) {
+			_createNodes.apply(view, arguments);
+		}
+		if (!nodes) return;
+		if (view.repairParentChkClassWithSelf) {
+			view.repairParentChkClassWithSelf(setting, parentNode);
+		}
+	}
+
+	var _makeNodeUrl = view.makeNodeUrl;
+	view.makeNodeUrl = function(setting, node) {
+		return setting.edit.enable ? null : (_makeNodeUrl.apply(view, arguments));
+	}
+
+	var _removeNode = view.removeNode;
+	view.removeNode = function(setting, node) {
+		var root = data.getRoot(setting);
+		if (root.curEditNode === node) root.curEditNode = null;
+		if (_removeNode) {
+			_removeNode.apply(view, arguments);
+		}
+	}
+
+	var _selectNode = view.selectNode;
+	view.selectNode = function(setting, node, addFlag) {
+		var root = data.getRoot(setting);
+		if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
+			return false;
+		}
+		if (_selectNode) _selectNode.apply(view, arguments);
+		view.addHoverDom(setting, node);
+		return true;
+	}
+
+	var _uCanDo = tools.uCanDo;
+	tools.uCanDo = function(setting, e) {
+		var root = data.getRoot(setting);
+		if (e && (tools.eqs(e.type, "mouseover") || tools.eqs(e.type, "mouseout") || tools.eqs(e.type, "mousedown") || tools.eqs(e.type, "mouseup"))) {
+			return true;
+		}
+		if (root.curEditNode) {
+			view.editNodeBlur = false;
+			root.curEditInput.focus();
+		}
+		return (!root.curEditNode) && (_uCanDo ? _uCanDo.apply(view, arguments) : true);
+	}
+})(jQuery);
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.all.min.js b/libs/ztree/3.5.33/js/jquery.ztree.all.min.js
new file mode 100644
index 000000000..9a1e07435
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.all.min.js
@@ -0,0 +1,167 @@
+
+/*
+ * JQuery zTree core v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function(q){var H,I,J,K,L,M,u,s={},v={},w={},N={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{isParent:"isParent",children:"children",name:"name",title:"",url:"url",icon:"icon"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post",
+dataType:"text",url:"",autoParam:[],otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},x=[function(a){var b=a.treeObj,c=f.event;b.bind(c.NODECREATED,function(b,
+c,h){j.apply(a.callback.onNodeCreated,[b,c,h])});b.bind(c.CLICK,function(b,c,h,e,m){j.apply(a.callback.onClick,[c,h,e,m])});b.bind(c.EXPAND,function(b,c,h){j.apply(a.callback.onExpand,[b,c,h])});b.bind(c.COLLAPSE,function(b,c,h){j.apply(a.callback.onCollapse,[b,c,h])});b.bind(c.ASYNC_SUCCESS,function(b,c,h,e){j.apply(a.callback.onAsyncSuccess,[b,c,h,e])});b.bind(c.ASYNC_ERROR,function(b,c,h,e,m,f){j.apply(a.callback.onAsyncError,[b,c,h,e,m,f])});b.bind(c.REMOVE,function(b,c,h){j.apply(a.callback.onRemove,
+[b,c,h])});b.bind(c.SELECTED,function(b,c,h){j.apply(a.callback.onSelected,[c,h])});b.bind(c.UNSELECTED,function(b,c,h){j.apply(a.callback.onUnSelected,[c,h])})}],y=[function(a){var b=f.event;a.treeObj.unbind(b.NODECREATED).unbind(b.CLICK).unbind(b.EXPAND).unbind(b.COLLAPSE).unbind(b.ASYNC_SUCCESS).unbind(b.ASYNC_ERROR).unbind(b.REMOVE).unbind(b.SELECTED).unbind(b.UNSELECTED)}],z=[function(a){var b=e.getCache(a);b||(b={},e.setCache(a,b));b.nodes=[];b.doms=[]}],A=[function(a,b,c,d,g,h){if(c){var k=
+e.getRoot(a),m=e.nodeChildren(a,c);c.level=b;c.tId=a.treeId+"_"+ ++k.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?j.eqs(c.open,"true"):!!c.open;b=e.nodeIsParent(a,c);j.isArray(m)&&!(b===!1||typeof b=="string"&&j.eqs(b,"false"))?(e.nodeIsParent(a,c,!0),c.zAsync=!0):(b=e.nodeIsParent(a,c,b),c.open=b&&!a.async.enable?c.open:!1,c.zAsync=!b);c.isFirstNode=g;c.isLastNode=h;c.getParentNode=function(){return e.getNodeCache(a,c.parentTId)};c.getPreNode=function(){return e.getPreNode(a,c)};c.getNextNode=
+function(){return e.getNextNode(a,c)};c.getIndex=function(){return e.getNodeIndex(a,c)};c.getPath=function(){return e.getNodePath(a,c)};c.isAjaxing=!1;e.fixPIdKeyValue(a,c)}}],t=[function(a){var b=a.target,c=e.getSetting(a.data.treeId),d="",g=null,h="",k="",m=null,i=null,o=null;if(j.eqs(a.type,"mousedown"))k="mousedown";else if(j.eqs(a.type,"mouseup"))k="mouseup";else if(j.eqs(a.type,"contextmenu"))k="contextmenu";else if(j.eqs(a.type,"click"))if(j.eqs(b.tagName,"span")&&b.getAttribute("treeNode"+
+f.id.SWITCH)!==null)d=j.getNodeMainDom(b).id,h="switchNode";else{if(o=j.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+f.id.A}]))d=j.getNodeMainDom(o).id,h="clickNode"}else if(j.eqs(a.type,"dblclick")&&(k="dblclick",o=j.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+f.id.A}])))d=j.getNodeMainDom(o).id,h="switchNode";if(k.length>0&&d.length==0&&(o=j.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+f.id.A}])))d=j.getNodeMainDom(o).id;if(d.length>0)switch(g=e.getNodeCache(c,d),h){case "switchNode":e.nodeIsParent(c,
+g)?j.eqs(a.type,"click")||j.eqs(a.type,"dblclick")&&j.apply(c.view.dblClickExpand,[c.treeId,g],c.view.dblClickExpand)?m=H:h="":h="";break;case "clickNode":m=I}switch(k){case "mousedown":i=J;break;case "mouseup":i=K;break;case "dblclick":i=L;break;case "contextmenu":i=M}return{stop:!1,node:g,nodeEventType:h,nodeEventCallback:m,treeEventType:k,treeEventCallback:i}}],B=[function(a){var b=e.getRoot(a);b||(b={},e.setRoot(a,b));e.nodeChildren(a,b,[]);b.expandTriggerFlag=!1;b.curSelectedList=[];b.noSelection=
+!0;b.createdNodes=[];b.zId=0;b._ver=(new Date).getTime()}],C=[],D=[],E=[],F=[],G=[],e={addNodeCache:function(a,b){e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=b},getNodeCacheId:function(a){return a.substring(a.lastIndexOf("_")+1)},addAfterA:function(a){D.push(a)},addBeforeA:function(a){C.push(a)},addInnerAfterA:function(a){F.push(a)},addInnerBeforeA:function(a){E.push(a)},addInitBind:function(a){x.push(a)},addInitUnBind:function(a){y.push(a)},addInitCache:function(a){z.push(a)},addInitNode:function(a){A.push(a)},
+addInitProxy:function(a,b){b?t.splice(0,0,a):t.push(a)},addInitRoot:function(a){B.push(a)},addNodesData:function(a,b,c,d){var g=e.nodeChildren(a,b);g?c>=g.length&&(c=-1):(g=e.nodeChildren(a,b,[]),c=-1);if(g.length>0&&c===0)g[0].isFirstNode=!1,i.setNodeLineIcos(a,g[0]);else if(g.length>0&&c<0)g[g.length-1].isLastNode=!1,i.setNodeLineIcos(a,g[g.length-1]);e.nodeIsParent(a,b,!0);c<0?e.nodeChildren(a,b,g.concat(d)):(a=[c,0].concat(d),g.splice.apply(g,a))},addSelectedNode:function(a,b){var c=e.getRoot(a);
+e.isSelectedNode(a,b)||c.curSelectedList.push(b)},addCreatedNode:function(a,b){(a.callback.onNodeCreated||a.view.addDiyDom)&&e.getRoot(a).createdNodes.push(b)},addZTreeTools:function(a){G.push(a)},exSetting:function(a){q.extend(!0,N,a)},fixPIdKeyValue:function(a,b){a.data.simpleData.enable&&(b[a.data.simpleData.pIdKey]=b.parentTId?b.getParentNode()[a.data.simpleData.idKey]:a.data.simpleData.rootPId)},getAfterA:function(a,b,c){for(var d=0,e=D.length;d<e;d++)D[d].apply(this,arguments)},getBeforeA:function(a,
+b,c){for(var d=0,e=C.length;d<e;d++)C[d].apply(this,arguments)},getInnerAfterA:function(a,b,c){for(var d=0,e=F.length;d<e;d++)F[d].apply(this,arguments)},getInnerBeforeA:function(a,b,c){for(var d=0,e=E.length;d<e;d++)E[d].apply(this,arguments)},getCache:function(a){return w[a.treeId]},getNodeIndex:function(a,b){if(!b)return null;for(var c=b.parentTId?b.getParentNode():e.getRoot(a),c=e.nodeChildren(a,c),d=0,g=c.length-1;d<=g;d++)if(c[d]===b)return d;return-1},getNextNode:function(a,b){if(!b)return null;
+for(var c=b.parentTId?b.getParentNode():e.getRoot(a),c=e.nodeChildren(a,c),d=0,g=c.length-1;d<=g;d++)if(c[d]===b)return d==g?null:c[d+1];return null},getNodeByParam:function(a,b,c,d){if(!b||!c)return null;for(var g=0,h=b.length;g<h;g++){var k=b[g];if(k[c]==d)return b[g];k=e.nodeChildren(a,k);if(k=e.getNodeByParam(a,k,c,d))return k}return null},getNodeCache:function(a,b){if(!b)return null;var c=w[a.treeId].nodes[e.getNodeCacheId(b)];return c?c:null},getNodePath:function(a,b){if(!b)return null;var c;
+(c=b.parentTId?b.getParentNode().getPath():[])&&c.push(b);return c},getNodes:function(a){return e.nodeChildren(a,e.getRoot(a))},getNodesByParam:function(a,b,c,d){if(!b||!c)return[];for(var g=[],h=0,k=b.length;h<k;h++){var m=b[h];m[c]==d&&g.push(m);m=e.nodeChildren(a,m);g=g.concat(e.getNodesByParam(a,m,c,d))}return g},getNodesByParamFuzzy:function(a,b,c,d){if(!b||!c)return[];for(var g=[],d=d.toLowerCase(),h=0,k=b.length;h<k;h++){var m=b[h];typeof m[c]=="string"&&b[h][c].toLowerCase().indexOf(d)>-1&&
+g.push(m);m=e.nodeChildren(a,m);g=g.concat(e.getNodesByParamFuzzy(a,m,c,d))}return g},getNodesByFilter:function(a,b,c,d,g){if(!b)return d?null:[];for(var h=d?null:[],k=0,m=b.length;k<m;k++){var f=b[k];if(j.apply(c,[f,g],!1)){if(d)return f;h.push(f)}f=e.nodeChildren(a,f);f=e.getNodesByFilter(a,f,c,d,g);if(d&&f)return f;h=d?f:h.concat(f)}return h},getPreNode:function(a,b){if(!b)return null;for(var c=b.parentTId?b.getParentNode():e.getRoot(a),c=e.nodeChildren(a,c),d=0,g=c.length;d<g;d++)if(c[d]===b)return d==
+0?null:c[d-1];return null},getRoot:function(a){return a?v[a.treeId]:null},getRoots:function(){return v},getSetting:function(a){return s[a]},getSettings:function(){return s},getZTreeTools:function(a){return(a=this.getRoot(this.getSetting(a)))?a.treeTools:null},initCache:function(a){for(var b=0,c=z.length;b<c;b++)z[b].apply(this,arguments)},initNode:function(a,b,c,d,e,h){for(var k=0,f=A.length;k<f;k++)A[k].apply(this,arguments)},initRoot:function(a){for(var b=0,c=B.length;b<c;b++)B[b].apply(this,arguments)},
+isSelectedNode:function(a,b){for(var c=e.getRoot(a),d=0,g=c.curSelectedList.length;d<g;d++)if(b===c.curSelectedList[d])return!0;return!1},nodeChildren:function(a,b,c){if(!b)return null;a=a.data.key.children;typeof c!=="undefined"&&(b[a]=c);return b[a]},nodeIsParent:function(a,b,c){if(!b)return!1;a=a.data.key.isParent;typeof c!=="undefined"&&(typeof c==="string"&&(c=j.eqs(c,"true")),b[a]=!!c);return b[a]},nodeName:function(a,b,c){a=a.data.key.name;typeof c!=="undefined"&&(b[a]=c);return""+b[a]},nodeTitle:function(a,
+b){return""+b[a.data.key.title===""?a.data.key.name:a.data.key.title]},removeNodeCache:function(a,b){var c=e.nodeChildren(a,b);if(c)for(var d=0,g=c.length;d<g;d++)e.removeNodeCache(a,c[d]);e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=null},removeSelectedNode:function(a,b){for(var c=e.getRoot(a),d=0,g=c.curSelectedList.length;d<g;d++)if(b===c.curSelectedList[d]||!e.getNodeCache(a,c.curSelectedList[d].tId))c.curSelectedList.splice(d,1),a.treeObj.trigger(f.event.UNSELECTED,[a.treeId,b]),d--,g--},setCache:function(a,
+b){w[a.treeId]=b},setRoot:function(a,b){v[a.treeId]=b},setZTreeTools:function(a,b){for(var c=0,d=G.length;c<d;c++)G[c].apply(this,arguments)},transformToArrayFormat:function(a,b){function c(b){d.push(b);(b=e.nodeChildren(a,b))&&(d=d.concat(e.transformToArrayFormat(a,b)))}if(!b)return[];var d=[];if(j.isArray(b))for(var g=0,h=b.length;g<h;g++)c(b[g]);else c(b);return d},transformTozTreeFormat:function(a,b){var c,d,g=a.data.simpleData.idKey,h=a.data.simpleData.pIdKey;if(!g||g==""||!b)return[];if(j.isArray(b)){var k=
+[],f={};for(c=0,d=b.length;c<d;c++)f[b[c][g]]=b[c];for(c=0,d=b.length;c<d;c++){var i=f[b[c][h]];if(i&&b[c][g]!=b[c][h]){var o=e.nodeChildren(a,i);o||(o=e.nodeChildren(a,i,[]));o.push(b[c])}else k.push(b[c])}return k}else return[b]}},n={bindEvent:function(a){for(var b=0,c=x.length;b<c;b++)x[b].apply(this,arguments)},unbindEvent:function(a){for(var b=0,c=y.length;b<c;b++)y[b].apply(this,arguments)},bindTree:function(a){var b={treeId:a.treeId},c=a.treeObj;a.view.txtSelectedEnable||c.bind("selectstart",
+u).css({"-moz-user-select":"-moz-none"});c.bind("click",b,n.proxy);c.bind("dblclick",b,n.proxy);c.bind("mouseover",b,n.proxy);c.bind("mouseout",b,n.proxy);c.bind("mousedown",b,n.proxy);c.bind("mouseup",b,n.proxy);c.bind("contextmenu",b,n.proxy)},unbindTree:function(a){a.treeObj.unbind("selectstart",u).unbind("click",n.proxy).unbind("dblclick",n.proxy).unbind("mouseover",n.proxy).unbind("mouseout",n.proxy).unbind("mousedown",n.proxy).unbind("mouseup",n.proxy).unbind("contextmenu",n.proxy)},doProxy:function(a){for(var b=
+[],c=0,d=t.length;c<d;c++){var e=t[c].apply(this,arguments);b.push(e);if(e.stop)break}return b},proxy:function(a){var b=e.getSetting(a.data.treeId);if(!j.uCanDo(b,a))return!0;for(var b=n.doProxy(a),c=!0,d=0,g=b.length;d<g;d++){var h=b[d];h.nodeEventCallback&&(c=h.nodeEventCallback.apply(h,[a,h.node])&&c);h.treeEventCallback&&(c=h.treeEventCallback.apply(h,[a,h.node])&&c)}return c}};H=function(a,b){var c=e.getSetting(a.data.treeId);if(b.open){if(j.apply(c.callback.beforeCollapse,[c.treeId,b],!0)==
+!1)return!0}else if(j.apply(c.callback.beforeExpand,[c.treeId,b],!0)==!1)return!0;e.getRoot(c).expandTriggerFlag=!0;i.switchNode(c,b);return!0};I=function(a,b){var c=e.getSetting(a.data.treeId),d=c.view.autoCancelSelected&&(a.ctrlKey||a.metaKey)&&e.isSelectedNode(c,b)?0:c.view.autoCancelSelected&&(a.ctrlKey||a.metaKey)&&c.view.selectedMulti?2:1;if(j.apply(c.callback.beforeClick,[c.treeId,b,d],!0)==!1)return!0;d===0?i.cancelPreSelectedNode(c,b):i.selectNode(c,b,d===2);c.treeObj.trigger(f.event.CLICK,
+[a,c.treeId,b,d]);return!0};J=function(a,b){var c=e.getSetting(a.data.treeId);j.apply(c.callback.beforeMouseDown,[c.treeId,b],!0)&&j.apply(c.callback.onMouseDown,[a,c.treeId,b]);return!0};K=function(a,b){var c=e.getSetting(a.data.treeId);j.apply(c.callback.beforeMouseUp,[c.treeId,b],!0)&&j.apply(c.callback.onMouseUp,[a,c.treeId,b]);return!0};L=function(a,b){var c=e.getSetting(a.data.treeId);j.apply(c.callback.beforeDblClick,[c.treeId,b],!0)&&j.apply(c.callback.onDblClick,[a,c.treeId,b]);return!0};
+M=function(a,b){var c=e.getSetting(a.data.treeId);j.apply(c.callback.beforeRightClick,[c.treeId,b],!0)&&j.apply(c.callback.onRightClick,[a,c.treeId,b]);return typeof c.callback.onRightClick!="function"};u=function(a){a=a.originalEvent.srcElement.nodeName.toLowerCase();return a==="input"||a==="textarea"};var j={apply:function(a,b,c){return typeof a=="function"?a.apply(O,b?b:[]):c},canAsync:function(a,b){var c=e.nodeChildren(a,b),d=e.nodeIsParent(a,b);return a.async.enable&&b&&d&&!(b.zAsync||c&&c.length>
+0)},clone:function(a){if(a===null)return null;var b=j.isArray(a)?[]:{},c;for(c in a)b[c]=a[c]instanceof Date?new Date(a[c].getTime()):typeof a[c]==="object"?j.clone(a[c]):a[c];return b},eqs:function(a,b){return a.toLowerCase()===b.toLowerCase()},isArray:function(a){return Object.prototype.toString.apply(a)==="[object Array]"},isElement:function(a){return typeof HTMLElement==="object"?a instanceof HTMLElement:a&&typeof a==="object"&&a!==null&&a.nodeType===1&&typeof a.nodeName==="string"},$:function(a,
+b,c){b&&typeof b!="string"&&(c=b,b="");return typeof a=="string"?q(a,c?c.treeObj.get(0).ownerDocument:null):q("#"+a.tId+b,c?c.treeObj:null)},getMDom:function(a,b,c){if(!b)return null;for(;b&&b.id!==a.treeId;){for(var d=0,e=c.length;b.tagName&&d<e;d++)if(j.eqs(b.tagName,c[d].tagName)&&b.getAttribute(c[d].attrName)!==null)return b;b=b.parentNode}return null},getNodeMainDom:function(a){return q(a).parent("li").get(0)||q(a).parentsUntil("li").parent().get(0)},isChildOrSelf:function(a,b){return q(a).closest("#"+
+b).length>0},uCanDo:function(){return!0}},i={addNodes:function(a,b,c,d,g){var h=e.nodeIsParent(a,b);if(!a.data.keep.leaf||!b||h)if(j.isArray(d)||(d=[d]),a.data.simpleData.enable&&(d=e.transformTozTreeFormat(a,d)),b){var h=l(b,f.id.SWITCH,a),k=l(b,f.id.ICON,a),m=l(b,f.id.UL,a);if(!b.open)i.replaceSwitchClass(b,h,f.folder.CLOSE),i.replaceIcoClass(b,k,f.folder.CLOSE),b.open=!1,m.css({display:"none"});e.addNodesData(a,b,c,d);i.createNodes(a,b.level+1,d,b,c);g||i.expandCollapseParentNode(a,b,!0)}else e.addNodesData(a,
+e.getRoot(a),c,d),i.createNodes(a,0,d,null,c)},appendNodes:function(a,b,c,d,g,h,k){if(!c)return[];var f=[],j=d?d:e.getRoot(a),j=e.nodeChildren(a,j),o,l;if(!j||g>=j.length-c.length)g=-1;for(var n=0,Q=c.length;n<Q;n++){var p=c[n];h&&(o=(g===0||j.length==c.length)&&n==0,l=g<0&&n==c.length-1,e.initNode(a,b,p,d,o,l,k),e.addNodeCache(a,p));o=e.nodeIsParent(a,p);l=[];var q=e.nodeChildren(a,p);q&&q.length>0&&(l=i.appendNodes(a,b+1,q,p,-1,h,k&&p.open));k&&(i.makeDOMNodeMainBefore(f,a,p),i.makeDOMNodeLine(f,
+a,p),e.getBeforeA(a,p,f),i.makeDOMNodeNameBefore(f,a,p),e.getInnerBeforeA(a,p,f),i.makeDOMNodeIcon(f,a,p),e.getInnerAfterA(a,p,f),i.makeDOMNodeNameAfter(f,a,p),e.getAfterA(a,p,f),o&&p.open&&i.makeUlHtml(a,p,f,l.join("")),i.makeDOMNodeMainAfter(f,a,p),e.addCreatedNode(a,p))}return f},appendParentULDom:function(a,b){var c=[],d=l(b,a);!d.get(0)&&b.parentTId&&(i.appendParentULDom(a,b.getParentNode()),d=l(b,a));var g=l(b,f.id.UL,a);g.get(0)&&g.remove();g=e.nodeChildren(a,b);g=i.appendNodes(a,b.level+1,
+g,b,-1,!1,!0);i.makeUlHtml(a,b,c,g.join(""));d.append(c.join(""))},asyncNode:function(a,b,c,d){var g,h;g=e.nodeIsParent(a,b);if(b&&!g)return j.apply(d),!1;else if(b&&b.isAjaxing)return!1;else if(j.apply(a.callback.beforeAsync,[a.treeId,b],!0)==!1)return j.apply(d),!1;if(b)b.isAjaxing=!0,l(b,f.id.ICON,a).attr({style:"","class":f.className.BUTTON+" "+f.className.ICO_LOADING});var k={},m=j.apply(a.async.autoParam,[a.treeId,b],a.async.autoParam);for(g=0,h=m.length;b&&g<h;g++){var r=m[g].split("="),o=
+r;r.length>1&&(o=r[1],r=r[0]);k[o]=b[r]}m=j.apply(a.async.otherParam,[a.treeId,b],a.async.otherParam);if(j.isArray(m))for(g=0,h=m.length;g<h;g+=2)k[m[g]]=m[g+1];else for(var n in m)k[n]=m[n];var P=e.getRoot(a)._ver;q.ajax({contentType:a.async.contentType,cache:!1,type:a.async.type,url:j.apply(a.async.url,[a.treeId,b],a.async.url),data:a.async.contentType.indexOf("application/json")>-1?JSON.stringify(k):k,dataType:a.async.dataType,success:function(h){if(P==e.getRoot(a)._ver){var k=[];try{k=!h||h.length==
+0?[]:typeof h=="string"?eval("("+h+")"):h}catch(g){k=h}if(b)b.isAjaxing=null,b.zAsync=!0;i.setNodeLineIcos(a,b);k&&k!==""?(k=j.apply(a.async.dataFilter,[a.treeId,b,k],k),i.addNodes(a,b,-1,k?j.clone(k):[],!!c)):i.addNodes(a,b,-1,[],!!c);a.treeObj.trigger(f.event.ASYNC_SUCCESS,[a.treeId,b,h]);j.apply(d)}},error:function(c,d,h){if(P==e.getRoot(a)._ver){if(b)b.isAjaxing=null;i.setNodeLineIcos(a,b);a.treeObj.trigger(f.event.ASYNC_ERROR,[a.treeId,b,c,d,h])}}});return!0},cancelPreSelectedNode:function(a,
+b,c){var d=e.getRoot(a).curSelectedList,g,h;for(g=d.length-1;g>=0;g--)if(h=d[g],b===h||!b&&(!c||c!==h))if(l(h,f.id.A,a).removeClass(f.node.CURSELECTED),b){e.removeSelectedNode(a,b);break}else d.splice(g,1),a.treeObj.trigger(f.event.UNSELECTED,[a.treeId,h])},createNodeCallback:function(a){if(a.callback.onNodeCreated||a.view.addDiyDom)for(var b=e.getRoot(a);b.createdNodes.length>0;){var c=b.createdNodes.shift();j.apply(a.view.addDiyDom,[a.treeId,c]);a.callback.onNodeCreated&&a.treeObj.trigger(f.event.NODECREATED,
+[a.treeId,c])}},createNodes:function(a,b,c,d,g){if(c&&c.length!=0){var h=e.getRoot(a),k=!d||d.open||!!l(e.nodeChildren(a,d)[0],a).get(0);h.createdNodes=[];var b=i.appendNodes(a,b,c,d,g,!0,k),m,j;d?(d=l(d,f.id.UL,a),d.get(0)&&(m=d)):m=a.treeObj;m&&(g>=0&&(j=m.children()[g]),g>=0&&j?q(j).before(b.join("")):m.append(b.join("")));i.createNodeCallback(a)}},destroy:function(a){a&&(e.initCache(a),e.initRoot(a),n.unbindTree(a),n.unbindEvent(a),a.treeObj.empty(),delete s[a.treeId])},expandCollapseNode:function(a,
+b,c,d,g){var h=e.getRoot(a),k;if(b){var m=e.nodeChildren(a,b),r=e.nodeIsParent(a,b);if(h.expandTriggerFlag)k=g,g=function(){k&&k();b.open?a.treeObj.trigger(f.event.EXPAND,[a.treeId,b]):a.treeObj.trigger(f.event.COLLAPSE,[a.treeId,b])},h.expandTriggerFlag=!1;if(!b.open&&r&&(!l(b,f.id.UL,a).get(0)||m&&m.length>0&&!l(m[0],a).get(0)))i.appendParentULDom(a,b),i.createNodeCallback(a);if(b.open==c)j.apply(g,[]);else{var c=l(b,f.id.UL,a),h=l(b,f.id.SWITCH,a),o=l(b,f.id.ICON,a);r?(b.open=!b.open,b.iconOpen&&
+b.iconClose&&o.attr("style",i.makeNodeIcoStyle(a,b)),b.open?(i.replaceSwitchClass(b,h,f.folder.OPEN),i.replaceIcoClass(b,o,f.folder.OPEN),d==!1||a.view.expandSpeed==""?(c.show(),j.apply(g,[])):m&&m.length>0?c.slideDown(a.view.expandSpeed,g):(c.show(),j.apply(g,[]))):(i.replaceSwitchClass(b,h,f.folder.CLOSE),i.replaceIcoClass(b,o,f.folder.CLOSE),d==!1||a.view.expandSpeed==""||!(m&&m.length>0)?(c.hide(),j.apply(g,[])):c.slideUp(a.view.expandSpeed,g))):j.apply(g,[])}}else j.apply(g,[])},expandCollapseParentNode:function(a,
+b,c,d,e){b&&(b.parentTId?(i.expandCollapseNode(a,b,c,d),b.parentTId&&i.expandCollapseParentNode(a,b.getParentNode(),c,d,e)):i.expandCollapseNode(a,b,c,d,e))},expandCollapseSonNode:function(a,b,c,d,g){var h=e.getRoot(a),h=b?e.nodeChildren(a,b):e.nodeChildren(a,h),k=b?!1:d,f=e.getRoot(a).expandTriggerFlag;e.getRoot(a).expandTriggerFlag=!1;if(h)for(var j=0,l=h.length;j<l;j++)h[j]&&i.expandCollapseSonNode(a,h[j],c,k);e.getRoot(a).expandTriggerFlag=f;i.expandCollapseNode(a,b,c,d,g)},isSelectedNode:function(a,
+b){if(!b)return!1;var c=e.getRoot(a).curSelectedList,d;for(d=c.length-1;d>=0;d--)if(b===c[d])return!0;return!1},makeDOMNodeIcon:function(a,b,c){var d=e.nodeName(b,c),d=b.view.nameIsHTML?d:d.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");a.push("<span id='",c.tId,f.id.ICON,"' title='' treeNode",f.id.ICON," class='",i.makeNodeIcoClass(b,c),"' style='",i.makeNodeIcoStyle(b,c),"'></span><span id='",c.tId,f.id.SPAN,"' class='",f.className.NAME,"'>",d,"</span>")},makeDOMNodeLine:function(a,
+b,c){a.push("<span id='",c.tId,f.id.SWITCH,"' title='' class='",i.makeNodeLineClass(b,c),"' treeNode",f.id.SWITCH,"></span>")},makeDOMNodeMainAfter:function(a){a.push("</li>")},makeDOMNodeMainBefore:function(a,b,c){a.push("<li id='",c.tId,"' class='",f.className.LEVEL,c.level,"' tabindex='0' hidefocus='true' treenode>")},makeDOMNodeNameAfter:function(a){a.push("</a>")},makeDOMNodeNameBefore:function(a,b,c){var d=e.nodeTitle(b,c),g=i.makeNodeUrl(b,c),h=i.makeNodeFontCss(b,c),k=[],m;for(m in h)k.push(m,
+":",h[m],";");a.push("<a id='",c.tId,f.id.A,"' class='",f.className.LEVEL,c.level,"' treeNode",f.id.A,' onclick="',c.click||"",'" ',g!=null&&g.length>0?"href='"+g+"'":""," target='",i.makeNodeTarget(c),"' style='",k.join(""),"'");j.apply(b.view.showTitle,[b.treeId,c],b.view.showTitle)&&d&&a.push("title='",d.replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),"'");a.push(">")},makeNodeFontCss:function(a,b){var c=j.apply(a.view.fontCss,[a.treeId,b],a.view.fontCss);return c&&typeof c!="function"?
+c:{}},makeNodeIcoClass:function(a,b){var c=["ico"];if(!b.isAjaxing){var d=e.nodeIsParent(a,b);c[0]=(b.iconSkin?b.iconSkin+"_":"")+c[0];d?c.push(b.open?f.folder.OPEN:f.folder.CLOSE):c.push(f.folder.DOCU)}return f.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(a,b){var c=[];if(!b.isAjaxing){var d=e.nodeIsParent(a,b)&&b.iconOpen&&b.iconClose?b.open?b.iconOpen:b.iconClose:b[a.data.key.icon];d&&c.push("background:url(",d,") 0 0 no-repeat;");(a.view.showIcon==!1||!j.apply(a.view.showIcon,[a.treeId,
+b],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(a,b){var c=[];a.view.showLine?b.level==0&&b.isFirstNode&&b.isLastNode?c.push(f.line.ROOT):b.level==0&&b.isFirstNode?c.push(f.line.ROOTS):b.isLastNode?c.push(f.line.BOTTOM):c.push(f.line.CENTER):c.push(f.line.NOLINE);e.nodeIsParent(a,b)?c.push(b.open?f.folder.OPEN:f.folder.CLOSE):c.push(f.folder.DOCU);return i.makeNodeLineClassEx(b)+c.join("_")},makeNodeLineClassEx:function(a){return f.className.BUTTON+" "+f.className.LEVEL+
+a.level+" "+f.className.SWITCH+" "},makeNodeTarget:function(a){return a.target||"_blank"},makeNodeUrl:function(a,b){var c=a.data.key.url;return b[c]?b[c]:null},makeUlHtml:function(a,b,c,d){c.push("<ul id='",b.tId,f.id.UL,"' class='",f.className.LEVEL,b.level," ",i.makeUlLineClass(a,b),"' style='display:",b.open?"block":"none","'>");c.push(d);c.push("</ul>")},makeUlLineClass:function(a,b){return a.view.showLine&&!b.isLastNode?f.line.LINE:""},removeChildNodes:function(a,b){if(b){var c=e.nodeChildren(a,
+b);if(c){for(var d=0,g=c.length;d<g;d++)e.removeNodeCache(a,c[d]);e.removeSelectedNode(a);delete b[a.data.key.children];a.data.keep.parent?l(b,f.id.UL,a).empty():(e.nodeIsParent(a,b,!1),b.open=!1,c=l(b,f.id.SWITCH,a),d=l(b,f.id.ICON,a),i.replaceSwitchClass(b,c,f.folder.DOCU),i.replaceIcoClass(b,d,f.folder.DOCU),l(b,f.id.UL,a).remove())}}},scrollIntoView:function(a,b){if(b)if(typeof Element==="undefined"){var c=a.treeObj.get(0).getBoundingClientRect(),d=b.getBoundingClientRect();(d.top<c.top||d.bottom>
+c.bottom||d.right>c.right||d.left<c.left)&&b.scrollIntoView()}else{if(!Element.prototype.scrollIntoViewIfNeeded)Element.prototype.scrollIntoViewIfNeeded=function(a){function b(a,c,d,f){return{left:a,top:c,width:d,height:f,right:a+d,bottom:c+f,translate:function(e,g){return b(e+a,g+c,d,f)},relativeFromTo:function(g,k){var i=a,j=c,g=g.offsetParent,k=k.offsetParent;if(g===k)return e;for(;g;g=g.offsetParent)i+=g.offsetLeft+g.clientLeft,j+=g.offsetTop+g.clientTop;for(;k;k=k.offsetParent)i-=k.offsetLeft+
+k.clientLeft,j-=k.offsetTop+k.clientTop;return b(i,j,d,f)}}}for(var c,d=this,e=b(this.offsetLeft,this.offsetTop,this.offsetWidth,this.offsetHeight);j.isElement(c=d.parentNode);){var f=c.offsetLeft+c.clientLeft,i=c.offsetTop+c.clientTop,e=e.relativeFromTo(d,c).translate(-f,-i);c.scrollLeft=!1===a||e.left<=c.scrollLeft+c.clientWidth&&c.scrollLeft<=e.right-c.clientWidth+c.clientWidth?Math.min(e.left,Math.max(e.right-c.clientWidth,c.scrollLeft)):(e.right-c.clientWidth+e.left)/2;c.scrollTop=!1===a||e.top<=
+c.scrollTop+c.clientHeight&&c.scrollTop<=e.bottom-c.clientHeight+c.clientHeight?Math.min(e.top,Math.max(e.bottom-c.clientHeight,c.scrollTop)):(e.bottom-c.clientHeight+e.top)/2;e=e.translate(f-c.scrollLeft,i-c.scrollTop);d=c}};b.scrollIntoViewIfNeeded()}},setFirstNode:function(a,b){var c=e.nodeChildren(a,b);if(c.length>0)c[0].isFirstNode=!0},setLastNode:function(a,b){var c=e.nodeChildren(a,b);if(c.length>0)c[c.length-1].isLastNode=!0},removeNode:function(a,b){var c=e.getRoot(a),d=b.parentTId?b.getParentNode():
+c;b.isFirstNode=!1;b.isLastNode=!1;b.getPreNode=function(){return null};b.getNextNode=function(){return null};if(e.getNodeCache(a,b.tId)){l(b,a).remove();e.removeNodeCache(a,b);e.removeSelectedNode(a,b);for(var g=e.nodeChildren(a,d),h=0,k=g.length;h<k;h++)if(g[h].tId==b.tId){g.splice(h,1);break}i.setFirstNode(a,d);i.setLastNode(a,d);var j,h=g.length;if(!a.data.keep.parent&&h==0)e.nodeIsParent(a,d,!1),d.open=!1,delete d[a.data.key.children],h=l(d,f.id.UL,a),k=l(d,f.id.SWITCH,a),j=l(d,f.id.ICON,a),
+i.replaceSwitchClass(d,k,f.folder.DOCU),i.replaceIcoClass(d,j,f.folder.DOCU),h.css("display","none");else if(a.view.showLine&&h>0){var r=g[h-1],h=l(r,f.id.UL,a),k=l(r,f.id.SWITCH,a);j=l(r,f.id.ICON,a);d==c?g.length==1?i.replaceSwitchClass(r,k,f.line.ROOT):(c=l(g[0],f.id.SWITCH,a),i.replaceSwitchClass(g[0],c,f.line.ROOTS),i.replaceSwitchClass(r,k,f.line.BOTTOM)):i.replaceSwitchClass(r,k,f.line.BOTTOM);h.removeClass(f.line.LINE)}}},replaceIcoClass:function(a,b,c){if(b&&!a.isAjaxing&&(a=b.attr("class"),
+a!=void 0)){a=a.split("_");switch(c){case f.folder.OPEN:case f.folder.CLOSE:case f.folder.DOCU:a[a.length-1]=c}b.attr("class",a.join("_"))}},replaceSwitchClass:function(a,b,c){if(b){var d=b.attr("class");if(d!=void 0){d=d.split("_");switch(c){case f.line.ROOT:case f.line.ROOTS:case f.line.CENTER:case f.line.BOTTOM:case f.line.NOLINE:d[0]=i.makeNodeLineClassEx(a)+c;break;case f.folder.OPEN:case f.folder.CLOSE:case f.folder.DOCU:d[1]=c}b.attr("class",d.join("_"));c!==f.folder.DOCU?b.removeAttr("disabled"):
+b.attr("disabled","disabled")}}},selectNode:function(a,b,c){c||i.cancelPreSelectedNode(a,null,b);l(b,f.id.A,a).addClass(f.node.CURSELECTED);e.addSelectedNode(a,b);a.treeObj.trigger(f.event.SELECTED,[a.treeId,b])},setNodeFontCss:function(a,b){var c=l(b,f.id.A,a),d=i.makeNodeFontCss(a,b);d&&c.css(d)},setNodeLineIcos:function(a,b){if(b){var c=l(b,f.id.SWITCH,a),d=l(b,f.id.UL,a),g=l(b,f.id.ICON,a),h=i.makeUlLineClass(a,b);h.length==0?d.removeClass(f.line.LINE):d.addClass(h);c.attr("class",i.makeNodeLineClass(a,
+b));e.nodeIsParent(a,b)?c.removeAttr("disabled"):c.attr("disabled","disabled");g.removeAttr("style");g.attr("style",i.makeNodeIcoStyle(a,b));g.attr("class",i.makeNodeIcoClass(a,b))}},setNodeName:function(a,b){var c=e.nodeTitle(a,b),d=l(b,f.id.SPAN,a);d.empty();a.view.nameIsHTML?d.html(e.nodeName(a,b)):d.text(e.nodeName(a,b));j.apply(a.view.showTitle,[a.treeId,b],a.view.showTitle)&&l(b,f.id.A,a).attr("title",!c?"":c)},setNodeTarget:function(a,b){l(b,f.id.A,a).attr("target",i.makeNodeTarget(b))},setNodeUrl:function(a,
+b){var c=l(b,f.id.A,a),d=i.makeNodeUrl(a,b);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(a,b){b.open||!j.canAsync(a,b)?i.expandCollapseNode(a,b,!b.open):a.async.enable?i.asyncNode(a,b)||i.expandCollapseNode(a,b,!b.open):b&&i.expandCollapseNode(a,b,!b.open)}};q.fn.zTree={consts:{className:{BUTTON:"button",LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch",NAME:"node_name"},event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",
+ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open",CLOSE:"close",DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:j,view:i,event:n,data:e},getZTreeObj:function(a){return(a=e.getZTreeTools(a))?a:null},destroy:function(a){if(a&&
+a.length>0)i.destroy(e.getSetting(a));else for(var b in s)i.destroy(s[b])},init:function(a,b,c){var d=j.clone(N);q.extend(!0,d,b);d.treeId=a.attr("id");d.treeObj=a;d.treeObj.empty();s[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";e.initRoot(d);a=e.getRoot(d);c=c?j.clone(j.isArray(c)?c:[c]):[];d.data.simpleData.enable?e.nodeChildren(d,a,e.transformTozTreeFormat(d,c)):e.nodeChildren(d,a,c);e.initCache(d);n.unbindTree(d);n.bindTree(d);n.unbindEvent(d);n.bindEvent(d);
+var g={setting:d,addNodes:function(a,b,c,g){function f(){i.addNodes(d,a,b,n,g==!0)}a||(a=null);var l=e.nodeIsParent(d,a);if(a&&!l&&d.data.keep.leaf)return null;l=parseInt(b,10);isNaN(l)?(g=!!c,c=b,b=-1):b=l;if(!c)return null;var n=j.clone(j.isArray(c)?c:[c]);j.canAsync(d,a)?i.asyncNode(d,a,g,f):f();return n},cancelSelectedNode:function(a){i.cancelPreSelectedNode(d,a)},destroy:function(){i.destroy(d)},expandAll:function(a){a=!!a;i.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,
+b,c,g,f){function n(){var b=l(a,d).get(0);b&&g!==!1&&i.scrollIntoView(d,b)}if(!a||!e.nodeIsParent(d,a))return null;b!==!0&&b!==!1&&(b=!a.open);if((f=!!f)&&b&&j.apply(d.callback.beforeExpand,[d.treeId,a],!0)==!1)return null;else if(f&&!b&&j.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&i.expandCollapseParentNode(d,a.getParentNode(),b,!1);if(b===a.open&&!c)return null;e.getRoot(d).expandTriggerFlag=f;!j.canAsync(d,a)&&c?i.expandCollapseSonNode(d,a,b,!0,n):(a.open=
+!b,i.switchNode(this.setting,a),n());return b},getNodes:function(){return e.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:e.getNodeByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodeByTId:function(a){return e.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:e.getNodesByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByParamFuzzy:function(a,b,c){return!a?null:e.getNodesByParamFuzzy(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByFilter:function(a,
+b,c,f){b=!!b;return!a||typeof a!="function"?b?null:[]:e.getNodesByFilter(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b,f)},getNodeIndex:function(a){if(!a)return null;for(var b=a.parentTId?a.getParentNode():e.getRoot(d),b=e.nodeChildren(d,b),c=0,f=b.length;c<f;c++)if(b[c]==a)return c;return-1},getSelectedNodes:function(){for(var a=[],b=e.getRoot(d).curSelectedList,c=0,f=b.length;c<f;c++)a.push(b[c]);return a},isSelectedNode:function(a){return e.isSelectedNode(d,a)},reAsyncChildNodesPromise:function(a,
+b,c){return new Promise(function(d,e){try{g.reAsyncChildNodes(a,b,c,function(){d(a)})}catch(f){e(f)}})},reAsyncChildNodes:function(a,b,c,g){if(this.setting.async.enable){var j=!a;j&&(a=e.getRoot(d));if(b=="refresh"){for(var b=e.nodeChildren(d,a),n=0,q=b?b.length:0;n<q;n++)e.removeNodeCache(d,b[n]);e.removeSelectedNode(d);e.nodeChildren(d,a,[]);j?this.setting.treeObj.empty():l(a,f.id.UL,d).empty()}i.asyncNode(this.setting,j?null:a,!!c,g)}},refresh:function(){this.setting.treeObj.empty();var a=e.getRoot(d),
+b=e.nodeChildren(d,a);e.initRoot(d);e.nodeChildren(d,a,b);e.initCache(d);i.createNodes(d,0,e.nodeChildren(d,a),null,-1)},removeChildNodes:function(a){if(!a)return null;var b=e.nodeChildren(d,a);i.removeChildNodes(d,a);return b?b:null},removeNode:function(a,b){a&&(b=!!b,b&&j.apply(d.callback.beforeRemove,[d.treeId,a],!0)==!1||(i.removeNode(d,a),b&&this.setting.treeObj.trigger(f.event.REMOVE,[d.treeId,a])))},selectNode:function(a,b,c){function e(){if(!c){var b=l(a,d).get(0);i.scrollIntoView(d,b)}}if(a&&
+j.uCanDo(d)){b=d.view.selectedMulti&&b;if(a.parentTId)i.expandCollapseParentNode(d,a.getParentNode(),!0,!1,e);else if(!c)try{l(a,d).focus().blur()}catch(f){}i.selectNode(d,a,b)}},transformTozTreeNodes:function(a){return e.transformTozTreeFormat(d,a)},transformToArray:function(a){return e.transformToArrayFormat(d,a)},updateNode:function(a){a&&l(a,d).get(0)&&j.uCanDo(d)&&(i.setNodeName(d,a),i.setNodeTarget(d,a),i.setNodeUrl(d,a),i.setNodeLineIcos(d,a),i.setNodeFontCss(d,a))}};a.treeTools=g;e.setZTreeTools(d,
+g);(c=e.nodeChildren(d,a))&&c.length>0?i.createNodes(d,0,c,null,-1):d.async.enable&&d.async.url&&d.async.url!==""&&i.asyncNode(d);return g}};var O=q.fn.zTree,l=j.$,f=O.consts})(jQuery);
+
+/*
+ * JQuery zTree excheck v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function(n){var q,r,s,p={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},w={check:{enable:!1,autoCheckTrigger:!1,chkStyle:p.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:p.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};q=function(c,
+a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId);if(i.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;var d=e.nodeChecked(b,a);e.nodeChecked(b,a,!d);f.checkNodeRelation(b,a);d=m(a,h.id.CHECK,b);f.setChkClass(b,d,a);f.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(h.event.CHECK,[c,b.treeId,a]);return!0};r=function(c,a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId),d=m(a,h.id.CHECK,b);a.check_Focus=!0;f.setChkClass(b,d,a);return!0};s=function(c,
+a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId),d=m(a,h.id.CHECK,b);a.check_Focus=!1;f.setChkClass(b,d,a);return!0};n.extend(!0,n.fn.zTree.consts,p);n.extend(!0,n.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,j;d=h.radio;b=e.nodeChecked(c,a);if(c.check.chkStyle==d.STYLE){var g=e.getRadioCheckedList(c);if(b)if(c.check.radioType==d.TYPE_ALL){for(d=g.length-1;d>=0;d--){b=g[d];var k=e.nodeChecked(c,b);k&&b!=a&&(e.nodeChecked(c,b,!1),g.splice(d,1),f.setChkClass(c,
+m(b,h.id.CHECK,c),b),b.parentTId!=a.parentTId&&f.repairParentChkClassWithSelf(c,b))}g.push(a)}else{g=a.parentTId?a.getParentNode():e.getRoot(c);g=e.nodeChildren(c,g);for(d=0,j=g.length;d<j;d++)if(b=g[d],(k=e.nodeChecked(c,b))&&b!=a)e.nodeChecked(c,b,!1),f.setChkClass(c,m(b,h.id.CHECK,c),b)}else if(c.check.radioType==d.TYPE_ALL)for(d=0,j=g.length;d<j;d++)if(a==g[d]){g.splice(d,1);break}}else g=e.nodeChildren(c,a),b&&(!g||g.length==0||c.check.chkboxType.Y.indexOf("s")>-1)&&f.setSonNodeCheckBox(c,a,
+!0),!b&&(!g||g.length==0||c.check.chkboxType.N.indexOf("s")>-1)&&f.setSonNodeCheckBox(c,a,!1),b&&c.check.chkboxType.Y.indexOf("p")>-1&&f.setParentNodeCheckBox(c,a,!0),!b&&c.check.chkboxType.N.indexOf("p")>-1&&f.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=h.checkbox,d=h.radio,j="",g=e.nodeChecked(c,a),j=a.chkDisabled===!0?b.DISABLED:a.halfCheck?b.PART:c.check.chkStyle==d.STYLE?a.check_Child_State<1?b.FULL:b.PART:g?a.check_Child_State===2||a.check_Child_State===-1?b.FULL:b.PART:
+a.check_Child_State<1?b.FULL:b.PART,d=c.check.chkStyle+"_"+(g?b.TRUE:b.FALSE)+"_"+j,d=a.check_Focus&&a.chkDisabled!==!0?d+"_"+b.FOCUS:d;return h.className.BUTTON+" "+b.DEFAULT+" "+d},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===h.checkbox.STYLE)for(var b=e.getRoot(c),b=e.nodeChildren(c,b),d=0,j=b.length;d<j;d++){var g=b[d];g.nocheck!==!0&&g.chkDisabled!==!0&&e.nodeChecked(c,g,a);f.setSonNodeCheckBox(c,g,a)}},repairChkClass:function(c,a){if(a&&(e.makeChkFlag(c,a),a.nocheck!==!0)){var b=
+m(a,h.id.CHECK,c);f.setChkClass(c,b,a)}},repairParentChkClass:function(c,a){if(a&&a.parentTId){var b=a.getParentNode();f.repairChkClass(c,b);f.repairParentChkClass(c,b)}},repairParentChkClassWithSelf:function(c,a){if(a){var b=e.nodeChildren(c,a);b&&b.length>0?f.repairParentChkClass(c,b[0]):f.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b)a.chkDisabled=b;f.repairChkClass(c,a);if((a=e.nodeChildren(c,a))&&d)for(var j=0,g=a.length;j<g;j++)f.repairSonChkDisabled(c,
+a[j],b,d)}},repairParentChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b&&d)a.chkDisabled=b;f.repairChkClass(c,a);f.repairParentChkDisabled(c,a.getParentNode(),b,d)}},setChkClass:function(c,a,b){a&&(b.nocheck===!0?a.hide():a.show(),a.attr("class",f.makeChkClass(c,b)))},setParentNodeCheckBox:function(c,a,b,d){var j=m(a,h.id.CHECK,c);d||(d=a);e.makeChkFlag(c,a);a.nocheck!==!0&&a.chkDisabled!==!0&&(e.nodeChecked(c,a,b),f.setChkClass(c,j,a),c.check.autoCheckTrigger&&a!=d&&c.treeObj.trigger(h.event.CHECK,
+[null,c.treeId,a]));if(a.parentTId){j=!0;if(!b)for(var g=e.nodeChildren(c,a.getParentNode()),k=0,o=g.length;k<o;k++){var l=g[k],i=e.nodeChecked(c,l);if(l.nocheck!==!0&&l.chkDisabled!==!0&&i||(l.nocheck===!0||l.chkDisabled===!0)&&l.check_Child_State>0){j=!1;break}}j&&f.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var j=m(a,h.id.CHECK,c);d||(d=a);var g=!1,k=e.nodeChildren(c,a);if(k)for(var o=0,l=k.length;o<l;o++){var i=k[o];f.setSonNodeCheckBox(c,i,b,d);
+i.chkDisabled===!0&&(g=!0)}if(a!=e.getRoot(c)&&a.chkDisabled!==!0){g&&a.nocheck!==!0&&e.makeChkFlag(c,a);if(a.nocheck!==!0&&a.chkDisabled!==!0){if(e.nodeChecked(c,a,b),!g)a.check_Child_State=k&&k.length>0?b?2:0:-1}else a.check_Child_State=-1;f.setChkClass(c,j,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(h.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=e.getRoot(c).radioCheckedList,b=0,d=a.length;b<d;b++)e.getNodeCache(c,
+a[b].tId)||(a.splice(b,1),b--,d--);return a},getCheckStatus:function(c,a){if(!c.check.enable||a.nocheck||a.chkDisabled)return null;var b=e.nodeChecked(c,a);return{checked:b,half:a.halfCheck?a.halfCheck:c.check.chkStyle==h.radio.STYLE?a.check_Child_State===2:b?a.check_Child_State>-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var j=b&&c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL,d=!d?[]:d,g=0,f=a.length;g<f;g++){var i=
+a[g],l=e.nodeChildren(c,i),m=e.nodeChecked(c,i);if(i.nocheck!==!0&&i.chkDisabled!==!0&&m==b&&(d.push(i),j))break;e.getTreeCheckedNodes(c,l,b,d);if(j&&d.length>0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var b=!b?[]:b,d=0,j=a.length;d<j;d++){var g=a[d],f=e.nodeChildren(c,g),h=e.nodeChecked(c,g);g.nocheck!==!0&&g.chkDisabled!==!0&&h!=g.checkedOld&&b.push(g);e.getTreeChangeCheckedNodes(c,f,b)}return b},makeChkFlag:function(c,a){if(a){var b=-1,d=e.nodeChildren(c,a);
+if(d)for(var j=0,g=d.length;j<g;j++){var f=d[j],i=e.nodeChecked(c,f),l=-1;if(c.check.chkStyle==h.radio.STYLE)if(l=f.nocheck===!0||f.chkDisabled===!0?f.check_Child_State:f.halfCheck===!0?2:i?2:f.check_Child_State>0?2:0,l==2){b=2;break}else l==0&&(b=0);else if(c.check.chkStyle==h.checkbox.STYLE)if(l=f.nocheck===!0||f.chkDisabled===!0?f.check_Child_State:f.halfCheck===!0?1:i?f.check_Child_State===-1||f.check_Child_State===2?2:1:f.check_Child_State>0?1:0,l===1){b=1;break}else if(l===2&&b>-1&&j>0&&l!==
+b){b=1;break}else if(b===2&&l>-1&&l<2){b=1;break}else l>-1&&(b=l)}a.check_Child_State=b}}}});var n=n.fn.zTree,i=n._z.tools,h=n.consts,f=n._z.view,e=n._z.data,m=i.$;e.nodeChecked=function(c,a,b){if(!a)return!1;c=c.data.key.checked;typeof b!=="undefined"&&(typeof b==="string"&&(b=i.eqs(checked,"true")),a[c]=!!b);return a[c]};e.exSetting(w);e.addInitBind(function(c){c.treeObj.bind(h.event.CHECK,function(a,b,d,e){a.srcEvent=b;i.apply(c.callback.onCheck,[a,d,e])})});e.addInitUnBind(function(c){c.treeObj.unbind(h.event.CHECK)});
+e.addInitCache(function(){});e.addInitNode(function(c,a,b,d){if(b){a=e.nodeChecked(c,b);a=e.nodeChecked(c,b,a);b.checkedOld=a;if(typeof b.nocheck=="string")b.nocheck=i.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=i.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=i.eqs(b.halfCheck,"true");b.halfCheck=!!b.halfCheck;
+b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return e.getCheckStatus(c,b)};c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL&&a&&e.getRoot(c).radioCheckedList.push(b)}});e.addInitProxy(function(c){var a=c.target,b=e.getSetting(c.data.treeId),d="",f=null,g="",k=null;if(i.eqs(c.type,"mouseover")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoverCheck"}else if(i.eqs(c.type,"mouseout")){if(b.check.enable&&
+i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoutCheck"}else if(i.eqs(c.type,"click")&&b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="checkNode";if(d.length>0)switch(f=e.getNodeCache(b,d),g){case "checkNode":k=q;break;case "mouseoverCheck":k=r;break;case "mouseoutCheck":k=s}return{stop:g==="checkNode",node:f,nodeEventType:g,nodeEventCallback:k,treeEventType:"",treeEventCallback:null}},
+!0);e.addInitRoot(function(c){e.getRoot(c).radioCheckedList=[]});e.addBeforeA(function(c,a,b){c.check.enable&&(e.makeChkFlag(c,a),b.push("<span ID='",a.tId,h.id.CHECK,"' class='",f.makeChkClass(c,a),"' treeNode",h.id.CHECK,a.nocheck===!0?" style='display:none;'":"","></span>"))});e.addZTreeTools(function(c,a){a.checkNode=function(a,b,g,k){var o=e.nodeChecked(c,a);if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!o),k=!!k,(o!==b||g)&&!(k&&i.apply(this.setting.callback.beforeCheck,[this.setting.treeId,a],
+!0)==!1)&&i.uCanDo(this.setting)&&this.setting.check.enable&&a.nocheck!==!0))e.nodeChecked(c,a,b),b=m(a,h.id.CHECK,this.setting),(g||this.setting.check.chkStyle===h.radio.STYLE)&&f.checkNodeRelation(this.setting,a),f.setChkClass(this.setting,b,a),f.repairParentChkClassWithSelf(this.setting,a),k&&this.setting.treeObj.trigger(h.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){f.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var a=a!==!1,b=e.nodeChildren(c,e.getRoot(this.setting));
+return e.getTreeCheckedNodes(this.setting,b,a)};a.getChangeCheckedNodes=function(){var a=e.nodeChildren(c,e.getRoot(this.setting));return e.getTreeChangeCheckedNodes(this.setting,a)};a.setChkDisabled=function(a,b,c,e){b=!!b;c=!!c;f.repairSonChkDisabled(this.setting,a,b,!!e);f.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,e){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&m(c,this.setting).get(0)&&i.uCanDo(this.setting)){var g=m(c,
+h.id.CHECK,this.setting);(e==!0||this.setting.check.chkStyle===h.radio.STYLE)&&f.checkNodeRelation(this.setting,c);f.setChkClass(this.setting,g,c);f.repairParentChkClassWithSelf(this.setting,c)}}});var t=f.createNodes;f.createNodes=function(c,a,b,d,e){t&&t.apply(f,arguments);b&&f.repairParentChkClassWithSelf(c,d)};var u=f.removeNode;f.removeNode=function(c,a){var b=a.getParentNode();u&&u.apply(f,arguments);a&&b&&(f.repairChkClass(c,b),f.repairParentChkClass(c,b))};var v=f.appendNodes;f.appendNodes=
+function(c,a,b,d,h,g,i){var m="";v&&(m=v.apply(f,arguments));d&&e.makeChkFlag(c,d);return m}})(jQuery);
+
+/*
+ * JQuery zTree exedit v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function(B){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},v={onHoverOverNode:function(a,b){var c=i.getSetting(a.data.treeId),d=i.getRoot(c);if(d.curHoverNode!=b)v.onHoverOutNode(a);d.curHoverNode=b;e.addHoverDom(c,b)},onHoverOutNode:function(a){var a=
+i.getSetting(a.data.treeId),b=i.getRoot(a);if(b.curHoverNode&&!i.isSelectedNode(a,b.curHoverNode))e.removeTreeDom(a,b.curHoverNode),b.curHoverNode=null},onMousedownNode:function(a,b){function c(a){if(m.dragFlag==0&&Math.abs(N-a.clientX)<f.edit.drag.minMoveSize&&Math.abs(O-a.clientY)<f.edit.drag.minMoveSize)return!0;var b,c,g,j;L.css("cursor","pointer");if(m.dragFlag==0){if(k.apply(f.callback.beforeDrag,[f.treeId,n],!0)==!1)return l(a),!0;for(b=0,c=n.length;b<c;b++){if(b==0)m.dragNodeShowBefore=[];
+g=n[b];i.nodeIsParent(f,g)&&g.open?(e.expandCollapseNode(f,g,!g.open),m.dragNodeShowBefore[g.tId]=!0):m.dragNodeShowBefore[g.tId]=!1}m.dragFlag=1;y.showHoverDom=!1;k.showIfameMask(f,!0);j=!0;var p=-1;if(n.length>1){var o=n[0].parentTId?i.nodeChildren(f,n[0].getParentNode()):i.getNodes(f);g=[];for(b=0,c=o.length;b<c;b++)if(m.dragNodeShowBefore[o[b].tId]!==void 0&&(j&&p>-1&&p+1!==b&&(j=!1),g.push(o[b]),p=b),n.length===g.length){n=g;break}}j&&(H=n[0].getPreNode(),Q=n[n.length-1].getNextNode());C=q("<ul class='zTreeDragUL'></ul>",
+f);for(b=0,c=n.length;b<c;b++)g=n[b],g.editNameFlag=!1,e.selectNode(f,g,b>0),e.removeTreeDom(f,g),b>f.edit.drag.maxShowNodeNum-1||(j=q("<li id='"+g.tId+"_tmp'></li>",f),j.append(q(g,d.id.A,f).clone()),j.css("padding","0"),j.children("#"+g.tId+d.id.A).removeClass(d.node.CURSELECTED),C.append(j),b==f.edit.drag.maxShowNodeNum-1&&(j=q("<li id='"+g.tId+"_moretmp'><a>  ...  </a></li>",f),C.append(j)));C.attr("id",n[0].tId+d.id.UL+"_tmp");C.addClass(f.treeObj.attr("class"));C.appendTo(L);u=q("<span class='tmpzTreeMove_arrow'></span>",
+f);u.attr("id","zTreeMove_arrow_tmp");u.appendTo(L);f.treeObj.trigger(d.event.DRAG,[a,f.treeId,n])}if(m.dragFlag==1){t&&u.attr("id")==a.target.id&&w&&a.clientX+G.scrollLeft()+2>B("#"+w+d.id.A,t).offset().left?(g=B("#"+w+d.id.A,t),a.target=g.length>0?g.get(0):a.target):t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));
+w=t=null;J=!1;h=f;g=i.getSettings();for(var z in g)if(g[z].treeId&&g[z].edit.enable&&g[z].treeId!=f.treeId&&(a.target.id==g[z].treeId||B(a.target).parents("#"+g[z].treeId).length>0))J=!0,h=g[z];z=G.scrollTop();j=G.scrollLeft();p=h.treeObj.offset();b=h.treeObj.get(0).scrollHeight;g=h.treeObj.get(0).scrollWidth;c=a.clientY+z-p.top;var E=h.treeObj.height()+p.top-a.clientY-z,r=a.clientX+j-p.left,s=h.treeObj.width()+p.left-a.clientX-j,p=c<f.edit.drag.borderMax&&c>f.edit.drag.borderMin,o=E<f.edit.drag.borderMax&&
+E>f.edit.drag.borderMin,F=r<f.edit.drag.borderMax&&r>f.edit.drag.borderMin,v=s<f.edit.drag.borderMax&&s>f.edit.drag.borderMin,E=c>f.edit.drag.borderMin&&E>f.edit.drag.borderMin&&r>f.edit.drag.borderMin&&s>f.edit.drag.borderMin,r=p&&h.treeObj.scrollTop()<=0,s=o&&h.treeObj.scrollTop()+h.treeObj.height()+10>=b,M=F&&h.treeObj.scrollLeft()<=0,P=v&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=g;if(a.target&&k.isChildOrSelf(a.target,h.treeId)){for(var D=a.target;D&&D.tagName&&!k.eqs(D.tagName,"li")&&D.id!=
+h.treeId;)D=D.parentNode;var R=!0;for(b=0,c=n.length;b<c;b++)if(g=n[b],D.id===g.tId){R=!1;break}else if(q(g,f).find("#"+D.id).length>0){R=!1;break}if(R&&a.target&&k.isChildOrSelf(a.target,D.id+d.id.A))t=B(D),w=D.id}g=n[0];if(E&&k.isChildOrSelf(a.target,h.treeId)){if(!t&&(a.target.id==h.treeId||r||s||M||P)&&(J||!J&&g.parentTId))t=h.treeObj;p?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):o&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);F?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):v&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+
+10);t&&t!=h.treeObj&&t.offset().left<h.treeObj.offset().left&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+t.offset().left-h.treeObj.offset().left)}C.css({top:a.clientY+z+3+"px",left:a.clientX+j+3+"px"});b=j=0;if(t&&t.attr("id")!=h.treeId){var A=w==null?null:i.getNodeCache(h,w),p=(a.ctrlKey||a.metaKey)&&f.edit.drag.isMove&&f.edit.drag.isCopy||!f.edit.drag.isMove&&f.edit.drag.isCopy;c=!!(H&&w===H.tId);F=!!(Q&&w===Q.tId);o=g.parentTId&&g.parentTId==w;g=(p||!F)&&k.apply(h.edit.drag.prev,[h.treeId,n,A],
+!!h.edit.drag.prev);c=(p||!c)&&k.apply(h.edit.drag.next,[h.treeId,n,A],!!h.edit.drag.next);p=(p||!o)&&!(h.data.keep.leaf&&!i.nodeIsParent(f,A))&&k.apply(h.edit.drag.inner,[h.treeId,n,A],!!h.edit.drag.inner);o=function(){t=null;w="";x=d.move.TYPE_INNER;u.css({display:"none"});if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null};if(!g&&!c&&!p)o();else if(F=B("#"+w+d.id.A,t),v=A.isLastNode?null:B("#"+A.getNextNode().tId+d.id.A,t.next()),E=F.offset().top,r=
+F.offset().left,s=g?p?0.25:c?0.5:1:-1,M=c?p?0.75:g?0.5:0:-1,z=(a.clientY+z-E)/F.height(),(s==1||z<=s&&z>=-0.2)&&g?(j=1-u.width(),b=E-u.height()/2,x=d.move.TYPE_PREV):(M==0||z>=M&&z<=1.2)&&c?(j=1-u.width(),b=v==null||i.nodeIsParent(f,A)&&A.open?E+F.height()-u.height()/2:v.offset().top-u.height()/2,x=d.move.TYPE_NEXT):p?(j=5-u.width(),b=E,x=d.move.TYPE_INNER):o(),t){u.css({display:"block",top:b+"px",left:r+j+"px"});F.addClass(d.node.TMPTARGET_NODE+"_"+x);if(S!=w||T!=x)K=(new Date).getTime();if(A&&i.nodeIsParent(f,
+A)&&x==d.move.TYPE_INNER&&(z=!0,window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId!==A.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===A.tId&&(z=!1),z))window.zTreeMoveTimer=setTimeout(function(){x==d.move.TYPE_INNER&&A&&i.nodeIsParent(f,A)&&!A.open&&(new Date).getTime()-K>h.edit.drag.autoOpenTime&&k.apply(h.callback.beforeDragOpen,[h.treeId,A],!0)&&(e.switchNode(h,A),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND,
+[h.treeId,A]))},h.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=A.tId}}else if(x=d.move.TYPE_INNER,t&&k.apply(h.edit.drag.inner,[h.treeId,n,null],!!h.edit.drag.inner)?t.addClass(d.node.TMPTARGET_TREE):t=null,u.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;S=w;T=x;f.treeObj.trigger(d.event.DRAGMOVE,[a,f.treeId,n])}return!1}function l(a){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=
+null;T=S=null;G.unbind("mousemove",c);G.unbind("mouseup",l);G.unbind("selectstart",g);L.css("cursor","");t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));k.showIfameMask(f,!1);y.showHoverDom=!0;if(m.dragFlag!=0){m.dragFlag=0;var b,j,o;for(b=0,j=n.length;b<j;b++)o=n[b],i.nodeIsParent(f,o)&&m.dragNodeShowBefore[o.tId]&&
+!o.open&&(e.expandCollapseNode(f,o,!o.open),delete m.dragNodeShowBefore[o.tId]);C&&C.remove();u&&u.remove();var r=(a.ctrlKey||a.metaKey)&&f.edit.drag.isMove&&f.edit.drag.isCopy||!f.edit.drag.isMove&&f.edit.drag.isCopy;!r&&t&&w&&n[0].parentTId&&w==n[0].parentTId&&x==d.move.TYPE_INNER&&(t=null);if(t){var p=w==null?null:i.getNodeCache(h,w);if(k.apply(f.callback.beforeDrop,[h.treeId,n,p,x,r],!0)==!1)e.selectNodes(v,n);else{var s=r?k.clone(n):n;b=function(){if(J){if(!r)for(var b=0,c=n.length;b<c;b++)e.removeNode(f,
+n[b]);x==d.move.TYPE_INNER?e.addNodes(h,p,-1,s):e.addNodes(h,p.getParentNode(),x==d.move.TYPE_PREV?p.getIndex():p.getIndex()+1,s)}else if(r&&x==d.move.TYPE_INNER)e.addNodes(h,p,-1,s);else if(r)e.addNodes(h,p.getParentNode(),x==d.move.TYPE_PREV?p.getIndex():p.getIndex()+1,s);else if(x!=d.move.TYPE_NEXT)for(b=0,c=s.length;b<c;b++)e.moveNode(h,p,s[b],x,!1);else for(b=-1,c=s.length-1;b<c;c--)e.moveNode(h,p,s[c],x,!1);e.selectNodes(h,s);b=q(s[0],f).get(0);e.scrollIntoView(f,b);f.treeObj.trigger(d.event.DROP,
+[a,h.treeId,s,p,x,r])};x==d.move.TYPE_INNER&&k.canAsync(h,p)?e.asyncNode(h,p,!1,b):b()}}else e.selectNodes(v,n),f.treeObj.trigger(d.event.DROP,[a,f.treeId,n,null,null,null])}}function g(){return!1}var o,j,f=i.getSetting(a.data.treeId),m=i.getRoot(f),y=i.getRoots();if(a.button==2||!f.edit.enable||!f.edit.drag.isCopy&&!f.edit.drag.isMove)return!0;var r=a.target,s=i.getRoot(f).curSelectedList,n=[];if(i.isSelectedNode(f,b))for(o=0,j=s.length;o<j;o++){if(s[o].editNameFlag&&k.eqs(r.tagName,"input")&&r.getAttribute("treeNode"+
+d.id.INPUT)!==null)return!0;n.push(s[o]);if(n[0].parentTId!==s[o].parentTId){n=[b];break}}else n=[b];e.editNodeBlur=!0;e.cancelCurEditNode(f);var G=B(f.treeObj.get(0).ownerDocument),L=B(f.treeObj.get(0).ownerDocument.body),C,u,t,J=!1,h=f,v=f,H,Q,S=null,T=null,w=null,x=d.move.TYPE_INNER,N=a.clientX,O=a.clientY,K=(new Date).getTime();k.uCanDo(f)&&G.bind("mousemove",c);G.bind("mouseup",l);G.bind("selectstart",g);a.preventDefault&&a.preventDefault();return!0}};B.extend(!0,B.fn.zTree.consts,I);B.extend(!0,
+B.fn.zTree._z,{tools:{getAbs:function(a){a=a.getBoundingClientRect();return[a.left+(document.body.scrollLeft+document.documentElement.scrollLeft),a.top+(document.body.scrollTop+document.documentElement.scrollTop)]},inputFocus:function(a){a.get(0)&&(a.focus(),k.setCursorPosition(a.get(0),a.val().length))},inputSelect:function(a){a.get(0)&&(a.focus(),a.select())},setCursorPosition:function(a,b){if(a.setSelectionRange)a.focus(),a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();
+c.collapse(!0);c.moveEnd("character",b);c.moveStart("character",b);c.select()}},showIfameMask:function(a,b){for(var c=i.getRoot(a);c.dragMaskList.length>0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(b)for(var d=q("iframe",a),g=0,e=d.length;g<e;g++){var j=d.get(g),f=k.getAbs(j),j=q("<div id='zTreeMask_"+g+"' class='zTreeMask' style='top:"+f[1]+"px; left:"+f[0]+"px; width:"+j.offsetWidth+"px; height:"+j.offsetHeight+"px;'></div>",a);j.appendTo(q("body",a));c.dragMaskList.push(j)}}},view:{addEditBtn:function(a,
+b){if(!(b.editNameFlag||q(b,d.id.EDIT,a).length>0)&&k.apply(a.edit.showRenameBtn,[a.treeId,b],a.edit.showRenameBtn)){var c=q(b,d.id.A,a),l="<span class='"+d.className.BUTTON+" edit' id='"+b.tId+d.id.EDIT+"' title='"+k.apply(a.edit.renameTitle,[a.treeId,b],a.edit.renameTitle)+"' treeNode"+d.id.EDIT+" style='display:none;'></span>";c.append(l);q(b,d.id.EDIT,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeEditName,[a.treeId,b],!0)==!1)return!1;e.editNode(a,b);return!1}).show()}},
+addRemoveBtn:function(a,b){if(!(b.editNameFlag||q(b,d.id.REMOVE,a).length>0)&&k.apply(a.edit.showRemoveBtn,[a.treeId,b],a.edit.showRemoveBtn)){var c=q(b,d.id.A,a),l="<span class='"+d.className.BUTTON+" remove' id='"+b.tId+d.id.REMOVE+"' title='"+k.apply(a.edit.removeTitle,[a.treeId,b],a.edit.removeTitle)+"' treeNode"+d.id.REMOVE+" style='display:none;'></span>";c.append(l);q(b,d.id.REMOVE,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeRemove,[a.treeId,b],!0)==!1)return!1;e.removeNode(a,
+b);a.treeObj.trigger(d.event.REMOVE,[a.treeId,b]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(a,b){if(i.getRoots().showHoverDom)b.isHover=!0,a.edit.enable&&(e.addEditBtn(a,b),e.addRemoveBtn(a,b)),k.apply(a.view.addHoverDom,[a.treeId,b])},cancelCurEditNode:function(a,b,c){var l=i.getRoot(a),g=l.curEditNode;if(g){var o=l.curEditInput,b=b?b:c?i.nodeName(a,g):o.val();if(k.apply(a.callback.beforeRename,[a.treeId,g,b,c],!0)===!1)return!1;i.nodeName(a,g,b);q(g,d.id.A,
+a).removeClass(d.node.CURSELECTED_EDIT);o.unbind();e.setNodeName(a,g);g.editNameFlag=!1;l.curEditNode=null;l.curEditInput=null;e.selectNode(a,g,!1);a.treeObj.trigger(d.event.RENAME,[a.treeId,g,c])}return l.noSelection=!0},editNode:function(a,b){var c=i.getRoot(a);e.editNodeBlur=!1;if(i.isSelectedNode(a,b)&&c.curEditNode==b&&b.editNameFlag)setTimeout(function(){k.inputFocus(c.curEditInput)},0);else{b.editNameFlag=!0;e.removeTreeDom(a,b);e.cancelCurEditNode(a);e.selectNode(a,b,!1);q(b,d.id.SPAN,a).html("<input type=text class='rename' id='"+
+b.tId+d.id.INPUT+"' treeNode"+d.id.INPUT+" >");var l=q(b,d.id.INPUT,a);l.attr("value",i.nodeName(a,b));a.edit.editNameSelectAll?k.inputSelect(l):k.inputFocus(l);l.bind("blur",function(){e.editNodeBlur||e.cancelCurEditNode(a)}).bind("keydown",function(b){b.keyCode=="13"?(e.editNodeBlur=!0,e.cancelCurEditNode(a)):b.keyCode=="27"&&e.cancelCurEditNode(a,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});q(b,d.id.A,a).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=l;
+c.noSelection=!1;c.curEditNode=b}},moveNode:function(a,b,c,l,g,k){var j=i.getRoot(a);if(b!=c&&(!a.data.keep.leaf||!b||i.nodeIsParent(a,b)||l!=d.move.TYPE_INNER)){var f=c.parentTId?c.getParentNode():j,m=b===null||b==j;m&&b===null&&(b=j);if(m)l=d.move.TYPE_INNER;j=b.parentTId?b.getParentNode():j;if(l!=d.move.TYPE_PREV&&l!=d.move.TYPE_NEXT)l=d.move.TYPE_INNER;if(l==d.move.TYPE_INNER)if(m)c.parentTId=null;else{if(!i.nodeIsParent(a,b))i.nodeIsParent(a,b,!0),b.open=!!b.open,e.setNodeLineIcos(a,b);c.parentTId=
+b.tId}var y;m?y=m=a.treeObj:(!k&&l==d.move.TYPE_INNER?e.expandCollapseNode(a,b,!0,!1):k||e.expandCollapseNode(a,b.getParentNode(),!0,!1),m=q(b,a),y=q(b,d.id.UL,a),m.get(0)&&!y.get(0)&&(y=[],e.makeUlHtml(a,b,y,""),m.append(y.join(""))),y=q(b,d.id.UL,a));var r=q(c,a);r.get(0)?m.get(0)||r.remove():r=e.appendNodes(a,c.level,[c],null,-1,!1,!0).join("");y.get(0)&&l==d.move.TYPE_INNER?y.append(r):m.get(0)&&l==d.move.TYPE_PREV?m.before(r):m.get(0)&&l==d.move.TYPE_NEXT&&m.after(r);var s;y=-1;var r=0,n=null,
+m=null,B=c.level,v=i.nodeChildren(a,f),C=i.nodeChildren(a,j),u=i.nodeChildren(a,b);if(c.isFirstNode){if(y=0,v.length>1)n=v[1],n.isFirstNode=!0}else if(c.isLastNode)y=v.length-1,n=v[y-1],n.isLastNode=!0;else for(j=0,s=v.length;j<s;j++)if(v[j].tId==c.tId){y=j;break}y>=0&&v.splice(y,1);if(l!=d.move.TYPE_INNER)for(j=0,s=C.length;j<s;j++)C[j].tId==b.tId&&(r=j);if(l==d.move.TYPE_INNER){u||(u=i.nodeChildren(a,b,[]));if(u.length>0)m=u[u.length-1],m.isLastNode=!1;u.splice(u.length,0,c);c.isLastNode=!0;c.isFirstNode=
+u.length==1}else b.isFirstNode&&l==d.move.TYPE_PREV?(C.splice(r,0,c),m=b,m.isFirstNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!0,c.isLastNode=!1):b.isLastNode&&l==d.move.TYPE_NEXT?(C.splice(r+1,0,c),m=b,m.isLastNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(l==d.move.TYPE_PREV?C.splice(r,0,c):C.splice(r+1,0,c),c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!1);i.fixPIdKeyValue(a,c);i.setSonNodeLevel(a,c.getParentNode(),c);e.setNodeLineIcos(a,c);e.repairNodeLevelClass(a,
+c,B);!a.data.keep.parent&&v.length<1?(i.nodeIsParent(a,f,!1),f.open=!1,b=q(f,d.id.UL,a),l=q(f,d.id.SWITCH,a),j=q(f,d.id.ICON,a),e.replaceSwitchClass(f,l,d.folder.DOCU),e.replaceIcoClass(f,j,d.folder.DOCU),b.css("display","none")):n&&e.setNodeLineIcos(a,n);m&&e.setNodeLineIcos(a,m);a.check&&a.check.enable&&e.repairChkClass&&(e.repairChkClass(a,f),e.repairParentChkClassWithSelf(a,f),f!=c.parent&&e.repairParentChkClassWithSelf(a,c));k||e.expandCollapseParentNode(a,c.getParentNode(),!0,g)}},removeEditBtn:function(a,
+b){q(b,d.id.EDIT,a).unbind().remove()},removeRemoveBtn:function(a,b){q(b,d.id.REMOVE,a).unbind().remove()},removeTreeDom:function(a,b){b.isHover=!1;e.removeEditBtn(a,b);e.removeRemoveBtn(a,b);k.apply(a.view.removeHoverDom,[a.treeId,b])},repairNodeLevelClass:function(a,b,c){if(c!==b.level){var e=q(b,a),g=q(b,d.id.A,a),a=q(b,d.id.UL,a),c=d.className.LEVEL+c,b=d.className.LEVEL+b.level;e.removeClass(c);e.addClass(b);g.removeClass(c);g.addClass(b);a.removeClass(c);a.addClass(b)}},selectNodes:function(a,
+b){for(var c=0,d=b.length;c<d;c++)e.selectNode(a,b[c],c>0)}},event:{},data:{setSonNodeLevel:function(a,b,c){if(c){var d=i.nodeChildren(a,c);c.level=b?b.level+1:0;if(d)for(var b=0,g=d.length;b<g;b++)d[b]&&i.setSonNodeLevel(a,c,d[b])}}}});var H=B.fn.zTree,k=H._z.tools,d=H.consts,e=H._z.view,i=H._z.data,q=k.$;i.exSetting({edit:{enable:!1,editNameSelectAll:!1,showRemoveBtn:!0,showRenameBtn:!0,removeTitle:"remove",renameTitle:"rename",drag:{autoExpandTrigger:!1,isCopy:!0,isMove:!0,prev:!0,next:!0,inner:!0,
+minMoveSize:5,borderMax:10,borderMin:-5,maxShowNodeNum:5,autoOpenTime:500}},view:{addHoverDom:null,removeHoverDom:null},callback:{beforeDrag:null,beforeDragOpen:null,beforeDrop:null,beforeEditName:null,beforeRename:null,onDrag:null,onDragMove:null,onDrop:null,onRename:null}});i.addInitBind(function(a){var b=a.treeObj,c=d.event;b.bind(c.RENAME,function(b,c,d,e){k.apply(a.callback.onRename,[b,c,d,e])});b.bind(c.DRAG,function(b,c,d,e){k.apply(a.callback.onDrag,[c,d,e])});b.bind(c.DRAGMOVE,function(b,
+c,d,e){k.apply(a.callback.onDragMove,[c,d,e])});b.bind(c.DROP,function(b,c,d,e,f,i,q){k.apply(a.callback.onDrop,[c,d,e,f,i,q])})});i.addInitUnBind(function(a){var a=a.treeObj,b=d.event;a.unbind(b.RENAME);a.unbind(b.DRAG);a.unbind(b.DRAGMOVE);a.unbind(b.DROP)});i.addInitCache(function(){});i.addInitNode(function(a,b,c){if(c)c.isHover=!1,c.editNameFlag=!1});i.addInitProxy(function(a){var b=a.target,c=i.getSetting(a.data.treeId),e=a.relatedTarget,g="",o=null,j="",f=null,m=null;if(k.eqs(a.type,"mouseover")){if(m=
+k.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+d.id.A}]))g=k.getNodeMainDom(m).id,j="hoverOverNode"}else if(k.eqs(a.type,"mouseout"))m=k.getMDom(c,e,[{tagName:"a",attrName:"treeNode"+d.id.A}]),m||(g="remove",j="hoverOutNode");else if(k.eqs(a.type,"mousedown")&&(m=k.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+d.id.A}])))g=k.getNodeMainDom(m).id,j="mousedownNode";if(g.length>0)switch(o=i.getNodeCache(c,g),j){case "mousedownNode":f=v.onMousedownNode;break;case "hoverOverNode":f=v.onHoverOverNode;
+break;case "hoverOutNode":f=v.onHoverOutNode}return{stop:!1,node:o,nodeEventType:j,nodeEventCallback:f,treeEventType:"",treeEventCallback:null}});i.addInitRoot(function(a){var a=i.getRoot(a),b=i.getRoots();a.curEditNode=null;a.curEditInput=null;a.curHoverNode=null;a.dragFlag=0;a.dragNodeShowBefore=[];a.dragMaskList=[];b.showHoverDom=!0});i.addZTreeTools(function(a,b){b.cancelEditName=function(a){i.getRoot(this.setting).curEditNode&&e.cancelCurEditNode(this.setting,a?a:null,!0)};b.copyNode=function(b,
+l,g,o){if(!l)return null;var j=i.nodeIsParent(a,b);if(b&&!j&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;var f=this,m=k.clone(l);if(!b)b=null,g=d.move.TYPE_INNER;g==d.move.TYPE_INNER?(l=function(){e.addNodes(f.setting,b,-1,[m],o)},k.canAsync(this.setting,b)?e.asyncNode(this.setting,b,o,l):l()):(e.addNodes(this.setting,b.parentNode,-1,[m],o),e.moveNode(this.setting,b,m,g,!1,o));return m};b.editName=function(a){a&&a.tId&&a===i.getNodeCache(this.setting,a.tId)&&(a.parentTId&&e.expandCollapseParentNode(this.setting,
+a.getParentNode(),!0),e.editNode(this.setting,a))};b.moveNode=function(b,l,g,o){function j(){e.moveNode(m.setting,b,l,g,!1,o)}if(!l)return l;var f=i.nodeIsParent(a,b);if(b&&!f&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;else if(b&&(l.parentTId==b.tId&&g==d.move.TYPE_INNER||q(l,this.setting).find("#"+b.tId).length>0))return null;else b||(b=null);var m=this;k.canAsync(this.setting,b)&&g===d.move.TYPE_INNER?e.asyncNode(this.setting,b,o,j):j();return l};b.setEditable=function(a){this.setting.edit.enable=
+a;return this.refresh()}});var N=e.cancelPreSelectedNode;e.cancelPreSelectedNode=function(a,b){for(var c=i.getRoot(a).curSelectedList,d=0,g=c.length;d<g;d++)if(!b||b===c[d])if(e.removeTreeDom(a,c[d]),b)break;N&&N.apply(e,arguments)};var O=e.createNodes;e.createNodes=function(a,b,c,d,g){O&&O.apply(e,arguments);c&&e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(a,d)};var V=e.makeNodeUrl;e.makeNodeUrl=function(a,b){return a.edit.enable?null:V.apply(e,arguments)};var K=e.removeNode;e.removeNode=
+function(a,b){var c=i.getRoot(a);if(c.curEditNode===b)c.curEditNode=null;K&&K.apply(e,arguments)};var P=e.selectNode;e.selectNode=function(a,b,c){var d=i.getRoot(a);if(i.isSelectedNode(a,b)&&d.curEditNode==b&&b.editNameFlag)return!1;P&&P.apply(e,arguments);e.addHoverDom(a,b);return!0};var U=k.uCanDo;k.uCanDo=function(a,b){var c=i.getRoot(a);if(b&&(k.eqs(b.type,"mouseover")||k.eqs(b.type,"mouseout")||k.eqs(b.type,"mousedown")||k.eqs(b.type,"mouseup")))return!0;if(c.curEditNode)e.editNodeBlur=!1,c.curEditInput.focus();
+return!c.curEditNode&&(U?U.apply(e,arguments):!0)}})(jQuery);
+
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.core.js b/libs/ztree/3.5.33/js/jquery.ztree.core.js
new file mode 100644
index 000000000..9a2b82a94
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.core.js
@@ -0,0 +1,1981 @@
+/*
+ * JQuery zTree core v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function ($) {
+    var settings = {}, roots = {}, caches = {},
+        //default consts of core
+        _consts = {
+            className: {
+                BUTTON: "button",
+                LEVEL: "level",
+                ICO_LOADING: "ico_loading",
+                SWITCH: "switch",
+                NAME: 'node_name'
+            },
+            event: {
+                NODECREATED: "ztree_nodeCreated",
+                CLICK: "ztree_click",
+                EXPAND: "ztree_expand",
+                COLLAPSE: "ztree_collapse",
+                ASYNC_SUCCESS: "ztree_async_success",
+                ASYNC_ERROR: "ztree_async_error",
+                REMOVE: "ztree_remove",
+                SELECTED: "ztree_selected",
+                UNSELECTED: "ztree_unselected"
+            },
+            id: {
+                A: "_a",
+                ICON: "_ico",
+                SPAN: "_span",
+                SWITCH: "_switch",
+                UL: "_ul"
+            },
+            line: {
+                ROOT: "root",
+                ROOTS: "roots",
+                CENTER: "center",
+                BOTTOM: "bottom",
+                NOLINE: "noline",
+                LINE: "line"
+            },
+            folder: {
+                OPEN: "open",
+                CLOSE: "close",
+                DOCU: "docu"
+            },
+            node: {
+                CURSELECTED: "curSelectedNode"
+            }
+        },
+        //default setting of core
+        _setting = {
+            treeId: "",
+            treeObj: null,
+            view: {
+                addDiyDom: null,
+                autoCancelSelected: true,
+                dblClickExpand: true,
+                expandSpeed: "fast",
+                fontCss: {},
+                nameIsHTML: false,
+                selectedMulti: true,
+                showIcon: true,
+                showLine: true,
+                showTitle: true,
+                txtSelectedEnable: false
+            },
+            data: {
+                key: {
+                    isParent: "isParent",
+                    children: "children",
+                    name: "name",
+                    title: "",
+                    url: "url",
+                    icon: "icon"
+                },
+                simpleData: {
+                    enable: false,
+                    idKey: "id",
+                    pIdKey: "pId",
+                    rootPId: null
+                },
+                keep: {
+                    parent: false,
+                    leaf: false
+                }
+            },
+            async: {
+                enable: false,
+                contentType: "application/x-www-form-urlencoded",
+                type: "post",
+                dataType: "text",
+                url: "",
+                autoParam: [],
+                otherParam: [],
+                dataFilter: null
+            },
+            callback: {
+                beforeAsync: null,
+                beforeClick: null,
+                beforeDblClick: null,
+                beforeRightClick: null,
+                beforeMouseDown: null,
+                beforeMouseUp: null,
+                beforeExpand: null,
+                beforeCollapse: null,
+                beforeRemove: null,
+
+                onAsyncError: null,
+                onAsyncSuccess: null,
+                onNodeCreated: null,
+                onClick: null,
+                onDblClick: null,
+                onRightClick: null,
+                onMouseDown: null,
+                onMouseUp: null,
+                onExpand: null,
+                onCollapse: null,
+                onRemove: null
+            }
+        },
+        //default root of core
+        //zTree use root to save full data
+        _initRoot = function (setting) {
+            var r = data.getRoot(setting);
+            if (!r) {
+                r = {};
+                data.setRoot(setting, r);
+            }
+            data.nodeChildren(setting, r, []);
+            r.expandTriggerFlag = false;
+            r.curSelectedList = [];
+            r.noSelection = true;
+            r.createdNodes = [];
+            r.zId = 0;
+            r._ver = (new Date()).getTime();
+        },
+        //default cache of core
+        _initCache = function (setting) {
+            var c = data.getCache(setting);
+            if (!c) {
+                c = {};
+                data.setCache(setting, c);
+            }
+            c.nodes = [];
+            c.doms = [];
+        },
+        //default bindEvent of core
+        _bindEvent = function (setting) {
+            var o = setting.treeObj,
+                c = consts.event;
+            o.bind(c.NODECREATED, function (event, treeId, node) {
+                tools.apply(setting.callback.onNodeCreated, [event, treeId, node]);
+            });
+
+            o.bind(c.CLICK, function (event, srcEvent, treeId, node, clickFlag) {
+                tools.apply(setting.callback.onClick, [srcEvent, treeId, node, clickFlag]);
+            });
+
+            o.bind(c.EXPAND, function (event, treeId, node) {
+                tools.apply(setting.callback.onExpand, [event, treeId, node]);
+            });
+
+            o.bind(c.COLLAPSE, function (event, treeId, node) {
+                tools.apply(setting.callback.onCollapse, [event, treeId, node]);
+            });
+
+            o.bind(c.ASYNC_SUCCESS, function (event, treeId, node, msg) {
+                tools.apply(setting.callback.onAsyncSuccess, [event, treeId, node, msg]);
+            });
+
+            o.bind(c.ASYNC_ERROR, function (event, treeId, node, XMLHttpRequest, textStatus, errorThrown) {
+                tools.apply(setting.callback.onAsyncError, [event, treeId, node, XMLHttpRequest, textStatus, errorThrown]);
+            });
+
+            o.bind(c.REMOVE, function (event, treeId, treeNode) {
+                tools.apply(setting.callback.onRemove, [event, treeId, treeNode]);
+            });
+
+            o.bind(c.SELECTED, function (event, treeId, node) {
+                tools.apply(setting.callback.onSelected, [treeId, node]);
+            });
+            o.bind(c.UNSELECTED, function (event, treeId, node) {
+                tools.apply(setting.callback.onUnSelected, [treeId, node]);
+            });
+        },
+        _unbindEvent = function (setting) {
+            var o = setting.treeObj,
+                c = consts.event;
+            o.unbind(c.NODECREATED)
+                .unbind(c.CLICK)
+                .unbind(c.EXPAND)
+                .unbind(c.COLLAPSE)
+                .unbind(c.ASYNC_SUCCESS)
+                .unbind(c.ASYNC_ERROR)
+                .unbind(c.REMOVE)
+                .unbind(c.SELECTED)
+                .unbind(c.UNSELECTED);
+        },
+        //default event proxy of core
+        _eventProxy = function (event) {
+            var target = event.target,
+                setting = data.getSetting(event.data.treeId),
+                tId = "", node = null,
+                nodeEventType = "", treeEventType = "",
+                nodeEventCallback = null, treeEventCallback = null,
+                tmp = null;
+
+            if (tools.eqs(event.type, "mousedown")) {
+                treeEventType = "mousedown";
+            } else if (tools.eqs(event.type, "mouseup")) {
+                treeEventType = "mouseup";
+            } else if (tools.eqs(event.type, "contextmenu")) {
+                treeEventType = "contextmenu";
+            } else if (tools.eqs(event.type, "click")) {
+                if (tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.SWITCH) !== null) {
+                    tId = tools.getNodeMainDom(target).id;
+                    nodeEventType = "switchNode";
+                } else {
+                    tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]);
+                    if (tmp) {
+                        tId = tools.getNodeMainDom(tmp).id;
+                        nodeEventType = "clickNode";
+                    }
+                }
+            } else if (tools.eqs(event.type, "dblclick")) {
+                treeEventType = "dblclick";
+                tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]);
+                if (tmp) {
+                    tId = tools.getNodeMainDom(tmp).id;
+                    nodeEventType = "switchNode";
+                }
+            }
+            if (treeEventType.length > 0 && tId.length == 0) {
+                tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]);
+                if (tmp) {
+                    tId = tools.getNodeMainDom(tmp).id;
+                }
+            }
+            // event to node
+            if (tId.length > 0) {
+                node = data.getNodeCache(setting, tId);
+                switch (nodeEventType) {
+                    case "switchNode" :
+                        var isParent = data.nodeIsParent(setting, node);
+                        if (!isParent) {
+                            nodeEventType = "";
+                        } else if (tools.eqs(event.type, "click")
+                            || (tools.eqs(event.type, "dblclick") && tools.apply(setting.view.dblClickExpand, [setting.treeId, node], setting.view.dblClickExpand))) {
+                            nodeEventCallback = handler.onSwitchNode;
+                        } else {
+                            nodeEventType = "";
+                        }
+                        break;
+                    case "clickNode" :
+                        nodeEventCallback = handler.onClickNode;
+                        break;
+                }
+            }
+            // event to zTree
+            switch (treeEventType) {
+                case "mousedown" :
+                    treeEventCallback = handler.onZTreeMousedown;
+                    break;
+                case "mouseup" :
+                    treeEventCallback = handler.onZTreeMouseup;
+                    break;
+                case "dblclick" :
+                    treeEventCallback = handler.onZTreeDblclick;
+                    break;
+                case "contextmenu" :
+                    treeEventCallback = handler.onZTreeContextmenu;
+                    break;
+            }
+            var proxyResult = {
+                stop: false,
+                node: node,
+                nodeEventType: nodeEventType,
+                nodeEventCallback: nodeEventCallback,
+                treeEventType: treeEventType,
+                treeEventCallback: treeEventCallback
+            };
+            return proxyResult
+        },
+        //default init node of core
+        _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
+            if (!n) return;
+            var r = data.getRoot(setting),
+                children = data.nodeChildren(setting, n);
+            n.level = level;
+            n.tId = setting.treeId + "_" + (++r.zId);
+            n.parentTId = parentNode ? parentNode.tId : null;
+            n.open = (typeof n.open == "string") ? tools.eqs(n.open, "true") : !!n.open;
+            var isParent = data.nodeIsParent(setting, n);
+            if (tools.isArray(children) &&
+              !(isParent === false || (typeof isParent == "string" && tools.eqs(isParent, "false")))) {
+                data.nodeIsParent(setting, n, true);
+                n.zAsync = true;
+            } else {
+                isParent = data.nodeIsParent(setting, n, isParent);
+                n.open = (isParent && !setting.async.enable) ? n.open : false;
+                n.zAsync = !isParent;
+            }
+            n.isFirstNode = isFirstNode;
+            n.isLastNode = isLastNode;
+            n.getParentNode = function () {
+                return data.getNodeCache(setting, n.parentTId);
+            };
+            n.getPreNode = function () {
+                return data.getPreNode(setting, n);
+            };
+            n.getNextNode = function () {
+                return data.getNextNode(setting, n);
+            };
+            n.getIndex = function () {
+                return data.getNodeIndex(setting, n);
+            };
+            n.getPath = function () {
+                return data.getNodePath(setting, n);
+            };
+            n.isAjaxing = false;
+            data.fixPIdKeyValue(setting, n);
+        },
+        _init = {
+            bind: [_bindEvent],
+            unbind: [_unbindEvent],
+            caches: [_initCache],
+            nodes: [_initNode],
+            proxys: [_eventProxy],
+            roots: [_initRoot],
+            beforeA: [],
+            afterA: [],
+            innerBeforeA: [],
+            innerAfterA: [],
+            zTreeTools: []
+        },
+        //method of operate data
+        data = {
+            addNodeCache: function (setting, node) {
+                data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = node;
+            },
+            getNodeCacheId: function (tId) {
+                return tId.substring(tId.lastIndexOf("_") + 1);
+            },
+            addAfterA: function (afterA) {
+                _init.afterA.push(afterA);
+            },
+            addBeforeA: function (beforeA) {
+                _init.beforeA.push(beforeA);
+            },
+            addInnerAfterA: function (innerAfterA) {
+                _init.innerAfterA.push(innerAfterA);
+            },
+            addInnerBeforeA: function (innerBeforeA) {
+                _init.innerBeforeA.push(innerBeforeA);
+            },
+            addInitBind: function (bindEvent) {
+                _init.bind.push(bindEvent);
+            },
+            addInitUnBind: function (unbindEvent) {
+                _init.unbind.push(unbindEvent);
+            },
+            addInitCache: function (initCache) {
+                _init.caches.push(initCache);
+            },
+            addInitNode: function (initNode) {
+                _init.nodes.push(initNode);
+            },
+            addInitProxy: function (initProxy, isFirst) {
+                if (!!isFirst) {
+                    _init.proxys.splice(0, 0, initProxy);
+                } else {
+                    _init.proxys.push(initProxy);
+                }
+            },
+            addInitRoot: function (initRoot) {
+                _init.roots.push(initRoot);
+            },
+            addNodesData: function (setting, parentNode, index, nodes) {
+                var children = data.nodeChildren(setting, parentNode), params;
+                if (!children) {
+                    children = data.nodeChildren(setting, parentNode, []);
+                    index = -1;
+                } else if (index >= children.length) {
+                    index = -1;
+                }
+
+                if (children.length > 0 && index === 0) {
+                    children[0].isFirstNode = false;
+                    view.setNodeLineIcos(setting, children[0]);
+                } else if (children.length > 0 && index < 0) {
+                    children[children.length - 1].isLastNode = false;
+                    view.setNodeLineIcos(setting, children[children.length - 1]);
+                }
+                data.nodeIsParent(setting, parentNode, true);
+
+                if (index < 0) {
+                    data.nodeChildren(setting, parentNode, children.concat(nodes));
+                } else {
+                    params = [index, 0].concat(nodes);
+                    children.splice.apply(children, params);
+                }
+            },
+            addSelectedNode: function (setting, node) {
+                var root = data.getRoot(setting);
+                if (!data.isSelectedNode(setting, node)) {
+                    root.curSelectedList.push(node);
+                }
+            },
+            addCreatedNode: function (setting, node) {
+                if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) {
+                    var root = data.getRoot(setting);
+                    root.createdNodes.push(node);
+                }
+            },
+            addZTreeTools: function (zTreeTools) {
+                _init.zTreeTools.push(zTreeTools);
+            },
+            exSetting: function (s) {
+                $.extend(true, _setting, s);
+            },
+            fixPIdKeyValue: function (setting, node) {
+                if (setting.data.simpleData.enable) {
+                    node[setting.data.simpleData.pIdKey] = node.parentTId ? node.getParentNode()[setting.data.simpleData.idKey] : setting.data.simpleData.rootPId;
+                }
+            },
+            getAfterA: function (setting, node, array) {
+                for (var i = 0, j = _init.afterA.length; i < j; i++) {
+                    _init.afterA[i].apply(this, arguments);
+                }
+            },
+            getBeforeA: function (setting, node, array) {
+                for (var i = 0, j = _init.beforeA.length; i < j; i++) {
+                    _init.beforeA[i].apply(this, arguments);
+                }
+            },
+            getInnerAfterA: function (setting, node, array) {
+                for (var i = 0, j = _init.innerAfterA.length; i < j; i++) {
+                    _init.innerAfterA[i].apply(this, arguments);
+                }
+            },
+            getInnerBeforeA: function (setting, node, array) {
+                for (var i = 0, j = _init.innerBeforeA.length; i < j; i++) {
+                    _init.innerBeforeA[i].apply(this, arguments);
+                }
+            },
+            getCache: function (setting) {
+                return caches[setting.treeId];
+            },
+            getNodeIndex: function (setting, node) {
+                if (!node) return null;
+                var p = node.parentTId ? node.getParentNode() : data.getRoot(setting),
+                    children = data.nodeChildren(setting, p);
+                for (var i = 0, l = children.length - 1; i <= l; i++) {
+                    if (children[i] === node) {
+                        return i;
+                    }
+                }
+                return -1;
+            },
+            getNextNode: function (setting, node) {
+                if (!node) return null;
+                var p = node.parentTId ? node.getParentNode() : data.getRoot(setting),
+                    children = data.nodeChildren(setting, p);
+                for (var i = 0, l = children.length - 1; i <= l; i++) {
+                    if (children[i] === node) {
+                        return (i == l ? null : children[i + 1]);
+                    }
+                }
+                return null;
+            },
+            getNodeByParam: function (setting, nodes, key, value) {
+                if (!nodes || !key) return null;
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (node[key] == value) {
+                        return nodes[i];
+                    }
+                    var children = data.nodeChildren(setting, node);
+                    var tmp = data.getNodeByParam(setting, children, key, value);
+                    if (tmp) return tmp;
+                }
+                return null;
+            },
+            getNodeCache: function (setting, tId) {
+                if (!tId) return null;
+                var n = caches[setting.treeId].nodes[data.getNodeCacheId(tId)];
+                return n ? n : null;
+            },
+            getNodePath: function (setting, node) {
+                if (!node) return null;
+
+                var path;
+                if (node.parentTId) {
+                    path = node.getParentNode().getPath();
+                } else {
+                    path = [];
+                }
+
+                if (path) {
+                    path.push(node);
+                }
+
+                return path;
+            },
+            getNodes: function (setting) {
+                return data.nodeChildren(setting, data.getRoot(setting));
+            },
+            getNodesByParam: function (setting, nodes, key, value) {
+                if (!nodes || !key) return [];
+                var result = [];
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (node[key] == value) {
+                        result.push(node);
+                    }
+                    var children = data.nodeChildren(setting, node);
+                    result = result.concat(data.getNodesByParam(setting, children, key, value));
+                }
+                return result;
+            },
+            getNodesByParamFuzzy: function (setting, nodes, key, value) {
+                if (!nodes || !key) return [];
+                var result = [];
+                value = value.toLowerCase();
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (typeof node[key] == "string" && nodes[i][key].toLowerCase().indexOf(value) > -1) {
+                        result.push(node);
+                    }
+                    var children = data.nodeChildren(setting, node);
+                    result = result.concat(data.getNodesByParamFuzzy(setting, children, key, value));
+                }
+                return result;
+            },
+            getNodesByFilter: function (setting, nodes, filter, isSingle, invokeParam) {
+                if (!nodes) return (isSingle ? null : []);
+                var result = isSingle ? null : [];
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (tools.apply(filter, [node, invokeParam], false)) {
+                        if (isSingle) {
+                            return node;
+                        }
+                        result.push(node);
+                    }
+                    var children = data.nodeChildren(setting, node);
+                    var tmpResult = data.getNodesByFilter(setting, children, filter, isSingle, invokeParam);
+                    if (isSingle && !!tmpResult) {
+                        return tmpResult;
+                    }
+                    result = isSingle ? tmpResult : result.concat(tmpResult);
+                }
+                return result;
+            },
+            getPreNode: function (setting, node) {
+                if (!node) return null;
+                var p = node.parentTId ? node.getParentNode() : data.getRoot(setting),
+                    children = data.nodeChildren(setting, p);
+                for (var i = 0, l = children.length; i < l; i++) {
+                    if (children[i] === node) {
+                        return (i == 0 ? null : children[i - 1]);
+                    }
+                }
+                return null;
+            },
+            getRoot: function (setting) {
+                return setting ? roots[setting.treeId] : null;
+            },
+            getRoots: function () {
+                return roots;
+            },
+            getSetting: function (treeId) {
+                return settings[treeId];
+            },
+            getSettings: function () {
+                return settings;
+            },
+            getZTreeTools: function (treeId) {
+                var r = this.getRoot(this.getSetting(treeId));
+                return r ? r.treeTools : null;
+            },
+            initCache: function (setting) {
+                for (var i = 0, j = _init.caches.length; i < j; i++) {
+                    _init.caches[i].apply(this, arguments);
+                }
+            },
+            initNode: function (setting, level, node, parentNode, preNode, nextNode) {
+                for (var i = 0, j = _init.nodes.length; i < j; i++) {
+                    _init.nodes[i].apply(this, arguments);
+                }
+            },
+            initRoot: function (setting) {
+                for (var i = 0, j = _init.roots.length; i < j; i++) {
+                    _init.roots[i].apply(this, arguments);
+                }
+            },
+            isSelectedNode: function (setting, node) {
+                var root = data.getRoot(setting);
+                for (var i = 0, j = root.curSelectedList.length; i < j; i++) {
+                    if (node === root.curSelectedList[i]) return true;
+                }
+                return false;
+            },
+            nodeChildren: function (setting, node, newChildren) {
+                if (!node) {
+                    return null;
+                }
+                var key = setting.data.key.children;
+                if (typeof newChildren !== 'undefined') {
+                    node[key] = newChildren;
+                }
+                return node[key];
+            },
+            nodeIsParent: function (setting, node, newIsParent) {
+                if (!node) {
+                    return false;
+                }
+                var key = setting.data.key.isParent;
+                if (typeof newIsParent !== 'undefined') {
+                    if (typeof newIsParent === "string") {
+                        newIsParent = tools.eqs(newIsParent, "true");
+                    }
+                    newIsParent = !!newIsParent;
+                    node[key] = newIsParent;
+                }
+                return node[key];
+            },
+            nodeName: function (setting, node, newName) {
+                var key = setting.data.key.name;
+                if (typeof newName !== 'undefined') {
+                    node[key] = newName;
+                }
+                return "" + node[key];
+            },
+            nodeTitle: function (setting, node) {
+                var t = setting.data.key.title === "" ? setting.data.key.name : setting.data.key.title;
+                return "" + node[t];
+            },
+            removeNodeCache: function (setting, node) {
+                var children = data.nodeChildren(setting, node);
+                if (children) {
+                    for (var i = 0, l = children.length; i < l; i++) {
+                        data.removeNodeCache(setting, children[i]);
+                    }
+                }
+                data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = null;
+            },
+            removeSelectedNode: function (setting, node) {
+                var root = data.getRoot(setting);
+                for (var i = 0, j = root.curSelectedList.length; i < j; i++) {
+                    if (node === root.curSelectedList[i] || !data.getNodeCache(setting, root.curSelectedList[i].tId)) {
+                        root.curSelectedList.splice(i, 1);
+                        setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, node]);
+                        i--;
+                        j--;
+                    }
+                }
+            },
+            setCache: function (setting, cache) {
+                caches[setting.treeId] = cache;
+            },
+            setRoot: function (setting, root) {
+                roots[setting.treeId] = root;
+            },
+            setZTreeTools: function (setting, zTreeTools) {
+                for (var i = 0, j = _init.zTreeTools.length; i < j; i++) {
+                    _init.zTreeTools[i].apply(this, arguments);
+                }
+            },
+            transformToArrayFormat: function (setting, nodes) {
+                if (!nodes) return [];
+                var r = [];
+                if (tools.isArray(nodes)) {
+                    for (var i = 0, l = nodes.length; i < l; i++) {
+                        var node = nodes[i];
+                        _do(node);
+                    }
+                } else {
+                    _do(nodes);
+                }
+                return r;
+
+                function _do(_node) {
+                  r.push(_node);
+                  var children = data.nodeChildren(setting, _node);
+                  if (children) {
+                      r = r.concat(data.transformToArrayFormat(setting, children));
+                  }
+                }
+            },
+            transformTozTreeFormat: function (setting, sNodes) {
+                var i, l,
+                    key = setting.data.simpleData.idKey,
+                    parentKey = setting.data.simpleData.pIdKey;
+                if (!key || key == "" || !sNodes) return [];
+
+                if (tools.isArray(sNodes)) {
+                    var r = [];
+                    var tmpMap = {};
+                    for (i = 0, l = sNodes.length; i < l; i++) {
+                        tmpMap[sNodes[i][key]] = sNodes[i];
+                    }
+                    for (i = 0, l = sNodes.length; i < l; i++) {
+                        var p = tmpMap[sNodes[i][parentKey]];
+                        if (p && sNodes[i][key] != sNodes[i][parentKey]) {
+                            var children = data.nodeChildren(setting, p);
+                            if (!children) {
+                                children = data.nodeChildren(setting, p, []);
+                            }
+                            children.push(sNodes[i]);
+                        } else {
+                            r.push(sNodes[i]);
+                        }
+                    }
+                    return r;
+                } else {
+                    return [sNodes];
+                }
+            }
+        },
+        //method of event proxy
+        event = {
+            bindEvent: function (setting) {
+                for (var i = 0, j = _init.bind.length; i < j; i++) {
+                    _init.bind[i].apply(this, arguments);
+                }
+            },
+            unbindEvent: function (setting) {
+                for (var i = 0, j = _init.unbind.length; i < j; i++) {
+                    _init.unbind[i].apply(this, arguments);
+                }
+            },
+            bindTree: function (setting) {
+                var eventParam = {
+                        treeId: setting.treeId
+                    },
+                    o = setting.treeObj;
+                if (!setting.view.txtSelectedEnable) {
+                    // for can't select text
+                    o.bind('selectstart', handler.onSelectStart).css({
+                        "-moz-user-select": "-moz-none"
+                    });
+                }
+                o.bind('click', eventParam, event.proxy);
+                o.bind('dblclick', eventParam, event.proxy);
+                o.bind('mouseover', eventParam, event.proxy);
+                o.bind('mouseout', eventParam, event.proxy);
+                o.bind('mousedown', eventParam, event.proxy);
+                o.bind('mouseup', eventParam, event.proxy);
+                o.bind('contextmenu', eventParam, event.proxy);
+            },
+            unbindTree: function (setting) {
+                var o = setting.treeObj;
+                o.unbind('selectstart', handler.onSelectStart)
+                    .unbind('click', event.proxy)
+                    .unbind('dblclick', event.proxy)
+                    .unbind('mouseover', event.proxy)
+                    .unbind('mouseout', event.proxy)
+                    .unbind('mousedown', event.proxy)
+                    .unbind('mouseup', event.proxy)
+                    .unbind('contextmenu', event.proxy);
+            },
+            doProxy: function (e) {
+                var results = [];
+                for (var i = 0, j = _init.proxys.length; i < j; i++) {
+                    var proxyResult = _init.proxys[i].apply(this, arguments);
+                    results.push(proxyResult);
+                    if (proxyResult.stop) {
+                        break;
+                    }
+                }
+                return results;
+            },
+            proxy: function (e) {
+                var setting = data.getSetting(e.data.treeId);
+                if (!tools.uCanDo(setting, e)) return true;
+                var results = event.doProxy(e),
+                    r = true, x = false;
+                for (var i = 0, l = results.length; i < l; i++) {
+                    var proxyResult = results[i];
+                    if (proxyResult.nodeEventCallback) {
+                        x = true;
+                        r = proxyResult.nodeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r;
+                    }
+                    if (proxyResult.treeEventCallback) {
+                        x = true;
+                        r = proxyResult.treeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r;
+                    }
+                }
+                return r;
+            }
+        },
+        //method of event handler
+        handler = {
+            onSwitchNode: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (node.open) {
+                    if (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false) return true;
+                    data.getRoot(setting).expandTriggerFlag = true;
+                    view.switchNode(setting, node);
+                } else {
+                    if (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false) return true;
+                    data.getRoot(setting).expandTriggerFlag = true;
+                    view.switchNode(setting, node);
+                }
+                return true;
+            },
+            onClickNode: function (event, node) {
+                var setting = data.getSetting(event.data.treeId),
+                    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;
+                if (tools.apply(setting.callback.beforeClick, [setting.treeId, node, clickFlag], true) == false) return true;
+                if (clickFlag === 0) {
+                    view.cancelPreSelectedNode(setting, node);
+                } else {
+                    view.selectNode(setting, node, clickFlag === 2);
+                }
+                setting.treeObj.trigger(consts.event.CLICK, [event, setting.treeId, node, clickFlag]);
+                return true;
+            },
+            onZTreeMousedown: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (tools.apply(setting.callback.beforeMouseDown, [setting.treeId, node], true)) {
+                    tools.apply(setting.callback.onMouseDown, [event, setting.treeId, node]);
+                }
+                return true;
+            },
+            onZTreeMouseup: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (tools.apply(setting.callback.beforeMouseUp, [setting.treeId, node], true)) {
+                    tools.apply(setting.callback.onMouseUp, [event, setting.treeId, node]);
+                }
+                return true;
+            },
+            onZTreeDblclick: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (tools.apply(setting.callback.beforeDblClick, [setting.treeId, node], true)) {
+                    tools.apply(setting.callback.onDblClick, [event, setting.treeId, node]);
+                }
+                return true;
+            },
+            onZTreeContextmenu: function (event, node) {
+                var setting = data.getSetting(event.data.treeId);
+                if (tools.apply(setting.callback.beforeRightClick, [setting.treeId, node], true)) {
+                    tools.apply(setting.callback.onRightClick, [event, setting.treeId, node]);
+                }
+                return (typeof setting.callback.onRightClick) != "function";
+            },
+            onSelectStart: function (e) {
+                var n = e.originalEvent.srcElement.nodeName.toLowerCase();
+                return (n === "input" || n === "textarea" );
+            }
+        },
+        //method of tools for zTree
+        tools = {
+            apply: function (fun, param, defaultValue) {
+                if ((typeof fun) == "function") {
+                    return fun.apply(zt, param ? param : []);
+                }
+                return defaultValue;
+            },
+            canAsync: function (setting, node) {
+                var children = data.nodeChildren(setting, node);
+                var isParent = data.nodeIsParent(setting, node);
+                return (setting.async.enable && node && isParent && !(node.zAsync || (children && children.length > 0)));
+            },
+            clone: function (obj) {
+                if (obj === null) return null;
+                var o = tools.isArray(obj) ? [] : {};
+                for (var i in obj) {
+                    o[i] = (obj[i] instanceof Date) ? new Date(obj[i].getTime()) : (typeof obj[i] === "object" ? tools.clone(obj[i]) : obj[i]);
+                }
+                return o;
+            },
+            eqs: function (str1, str2) {
+                return str1.toLowerCase() === str2.toLowerCase();
+            },
+            isArray: function (arr) {
+                return Object.prototype.toString.apply(arr) === "[object Array]";
+            },
+            isElement: function (o) {
+                return (
+                    typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
+                        o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string"
+                );
+            },
+            $: function (node, exp, setting) {
+                if (!!exp && typeof exp != "string") {
+                    setting = exp;
+                    exp = "";
+                }
+                if (typeof node == "string") {
+                    return $(node, setting ? setting.treeObj.get(0).ownerDocument : null);
+                } else {
+                    return $("#" + node.tId + exp, setting ? setting.treeObj : null);
+                }
+            },
+            getMDom: function (setting, curDom, targetExpr) {
+                if (!curDom) return null;
+                while (curDom && curDom.id !== setting.treeId) {
+                    for (var i = 0, l = targetExpr.length; curDom.tagName && i < l; i++) {
+                        if (tools.eqs(curDom.tagName, targetExpr[i].tagName) && curDom.getAttribute(targetExpr[i].attrName) !== null) {
+                            return curDom;
+                        }
+                    }
+                    curDom = curDom.parentNode;
+                }
+                return null;
+            },
+            getNodeMainDom: function (target) {
+                return ($(target).parent("li").get(0) || $(target).parentsUntil("li").parent().get(0));
+            },
+            isChildOrSelf: function (dom, parentId) {
+                return ( $(dom).closest("#" + parentId).length > 0 );
+            },
+            uCanDo: function (setting, e) {
+                return true;
+            }
+        },
+        //method of operate ztree dom
+        view = {
+            addNodes: function (setting, parentNode, index, newNodes, isSilent) {
+                var isParent = data.nodeIsParent(setting, parentNode);
+                if (setting.data.keep.leaf && parentNode && !isParent) {
+                    return;
+                }
+                if (!tools.isArray(newNodes)) {
+                    newNodes = [newNodes];
+                }
+                if (setting.data.simpleData.enable) {
+                    newNodes = data.transformTozTreeFormat(setting, newNodes);
+                }
+                if (parentNode) {
+                    var target_switchObj = $$(parentNode, consts.id.SWITCH, setting),
+                        target_icoObj = $$(parentNode, consts.id.ICON, setting),
+                        target_ulObj = $$(parentNode, consts.id.UL, setting);
+
+                    if (!parentNode.open) {
+                        view.replaceSwitchClass(parentNode, target_switchObj, consts.folder.CLOSE);
+                        view.replaceIcoClass(parentNode, target_icoObj, consts.folder.CLOSE);
+                        parentNode.open = false;
+                        target_ulObj.css({
+                            "display": "none"
+                        });
+                    }
+
+                    data.addNodesData(setting, parentNode, index, newNodes);
+                    view.createNodes(setting, parentNode.level + 1, newNodes, parentNode, index);
+                    if (!isSilent) {
+                        view.expandCollapseParentNode(setting, parentNode, true);
+                    }
+                } else {
+                    data.addNodesData(setting, data.getRoot(setting), index, newNodes);
+                    view.createNodes(setting, 0, newNodes, null, index);
+                }
+            },
+            appendNodes: function (setting, level, nodes, parentNode, index, initFlag, openFlag) {
+                if (!nodes) return [];
+                var html = [];
+
+                var tmpPNode = (parentNode) ? parentNode : data.getRoot(setting),
+                    tmpPChild = data.nodeChildren(setting, tmpPNode),
+                    isFirstNode, isLastNode;
+
+                if (!tmpPChild || index >= tmpPChild.length - nodes.length) {
+                    index = -1;
+                }
+
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    var node = nodes[i];
+                    if (initFlag) {
+                        isFirstNode = ((index === 0 || tmpPChild.length == nodes.length) && (i == 0));
+                        isLastNode = (index < 0 && i == (nodes.length - 1));
+                        data.initNode(setting, level, node, parentNode, isFirstNode, isLastNode, openFlag);
+                        data.addNodeCache(setting, node);
+                    }
+                    var isParent = data.nodeIsParent(setting, node);
+
+                    var childHtml = [];
+                    var children = data.nodeChildren(setting, node);
+                    if (children && children.length > 0) {
+                        //make child html first, because checkType
+                        childHtml = view.appendNodes(setting, level + 1, children, node, -1, initFlag, openFlag && node.open);
+                    }
+                    if (openFlag) {
+                        view.makeDOMNodeMainBefore(html, setting, node);
+                        view.makeDOMNodeLine(html, setting, node);
+                        data.getBeforeA(setting, node, html);
+                        view.makeDOMNodeNameBefore(html, setting, node);
+                        data.getInnerBeforeA(setting, node, html);
+                        view.makeDOMNodeIcon(html, setting, node);
+                        data.getInnerAfterA(setting, node, html);
+                        view.makeDOMNodeNameAfter(html, setting, node);
+                        data.getAfterA(setting, node, html);
+                        if (isParent && node.open) {
+                            view.makeUlHtml(setting, node, html, childHtml.join(''));
+                        }
+                        view.makeDOMNodeMainAfter(html, setting, node);
+                        data.addCreatedNode(setting, node);
+                    }
+                }
+                return html;
+            },
+            appendParentULDom: function (setting, node) {
+                var html = [],
+                    nObj = $$(node, setting);
+                if (!nObj.get(0) && !!node.parentTId) {
+                    view.appendParentULDom(setting, node.getParentNode());
+                    nObj = $$(node, setting);
+                }
+                var ulObj = $$(node, consts.id.UL, setting);
+                if (ulObj.get(0)) {
+                    ulObj.remove();
+                }
+                var children = data.nodeChildren(setting, node),
+                    childHtml = view.appendNodes(setting, node.level + 1, children, node, -1, false, true);
+                view.makeUlHtml(setting, node, html, childHtml.join(''));
+                nObj.append(html.join(''));
+            },
+            asyncNode: function (setting, node, isSilent, callback) {
+                var i, l;
+                var isParent = data.nodeIsParent(setting, node);
+                if (node && !isParent) {
+                    tools.apply(callback);
+                    return false;
+                } else if (node && node.isAjaxing) {
+                    return false;
+                } else if (tools.apply(setting.callback.beforeAsync, [setting.treeId, node], true) == false) {
+                    tools.apply(callback);
+                    return false;
+                }
+                if (node) {
+                    node.isAjaxing = true;
+                    var icoObj = $$(node, consts.id.ICON, setting);
+                    icoObj.attr({"style": "", "class": consts.className.BUTTON + " " + consts.className.ICO_LOADING});
+                }
+
+                var tmpParam = {};
+                var autoParam = tools.apply(setting.async.autoParam, [setting.treeId, node], setting.async.autoParam);
+                for (i = 0, l = autoParam.length; node && i < l; i++) {
+                    var pKey = autoParam[i].split("="), spKey = pKey;
+                    if (pKey.length > 1) {
+                        spKey = pKey[1];
+                        pKey = pKey[0];
+                    }
+                    tmpParam[spKey] = node[pKey];
+                }
+                var otherParam = tools.apply(setting.async.otherParam, [setting.treeId, node], setting.async.otherParam);
+                if (tools.isArray(otherParam)) {
+                    for (i = 0, l = otherParam.length; i < l; i += 2) {
+                        tmpParam[otherParam[i]] = otherParam[i + 1];
+                    }
+                } else {
+                    for (var p in otherParam) {
+                        tmpParam[p] = otherParam[p];
+                    }
+                }
+
+                var _tmpV = data.getRoot(setting)._ver;
+                $.ajax({
+                    contentType: setting.async.contentType,
+                    cache: false,
+                    type: setting.async.type,
+                    url: tools.apply(setting.async.url, [setting.treeId, node], setting.async.url),
+                    data: setting.async.contentType.indexOf('application/json') > -1 ? JSON.stringify(tmpParam) : tmpParam,
+                    dataType: setting.async.dataType,
+                    success: function (msg) {
+                        if (_tmpV != data.getRoot(setting)._ver) {
+                            return;
+                        }
+                        var newNodes = [];
+                        try {
+                            if (!msg || msg.length == 0) {
+                                newNodes = [];
+                            } else if (typeof msg == "string") {
+                                newNodes = eval("(" + msg + ")");
+                            } else {
+                                newNodes = msg;
+                            }
+                        } catch (err) {
+                            newNodes = msg;
+                        }
+
+                        if (node) {
+                            node.isAjaxing = null;
+                            node.zAsync = true;
+                        }
+                        view.setNodeLineIcos(setting, node);
+                        if (newNodes && newNodes !== "") {
+                            newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes);
+                            view.addNodes(setting, node, -1, !!newNodes ? tools.clone(newNodes) : [], !!isSilent);
+                        } else {
+                            view.addNodes(setting, node, -1, [], !!isSilent);
+                        }
+                        setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, msg]);
+                        tools.apply(callback);
+                    },
+                    error: function (XMLHttpRequest, textStatus, errorThrown) {
+                        if (_tmpV != data.getRoot(setting)._ver) {
+                            return;
+                        }
+                        if (node) node.isAjaxing = null;
+                        view.setNodeLineIcos(setting, node);
+                        setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]);
+                    }
+                });
+                return true;
+            },
+            cancelPreSelectedNode: function (setting, node, excludeNode) {
+                var list = data.getRoot(setting).curSelectedList,
+                    i, n;
+                for (i = list.length - 1; i >= 0; i--) {
+                    n = list[i];
+                    if (node === n || (!node && (!excludeNode || excludeNode !== n))) {
+                        $$(n, consts.id.A, setting).removeClass(consts.node.CURSELECTED);
+                        if (node) {
+                            data.removeSelectedNode(setting, node);
+                            break;
+                        } else {
+                            list.splice(i, 1);
+                            setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, n]);
+                        }
+                    }
+                }
+            },
+            createNodeCallback: function (setting) {
+                if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) {
+                    var root = data.getRoot(setting);
+                    while (root.createdNodes.length > 0) {
+                        var node = root.createdNodes.shift();
+                        tools.apply(setting.view.addDiyDom, [setting.treeId, node]);
+                        if (!!setting.callback.onNodeCreated) {
+                            setting.treeObj.trigger(consts.event.NODECREATED, [setting.treeId, node]);
+                        }
+                    }
+                }
+            },
+            createNodes: function (setting, level, nodes, parentNode, index) {
+                if (!nodes || nodes.length == 0) return;
+                var root = data.getRoot(setting),
+                    openFlag = !parentNode || parentNode.open || !!$$(data.nodeChildren(setting, parentNode)[0], setting).get(0);
+                root.createdNodes = [];
+                var zTreeHtml = view.appendNodes(setting, level, nodes, parentNode, index, true, openFlag),
+                    parentObj, nextObj;
+
+                if (!parentNode) {
+                    parentObj = setting.treeObj;
+                    //setting.treeObj.append(zTreeHtml.join(''));
+                } else {
+                    var ulObj = $$(parentNode, consts.id.UL, setting);
+                    if (ulObj.get(0)) {
+                        parentObj = ulObj;
+                        //ulObj.append(zTreeHtml.join(''));
+                    }
+                }
+                if (parentObj) {
+                    if (index >= 0) {
+                        nextObj = parentObj.children()[index];
+                    }
+                    if (index >= 0 && nextObj) {
+                        $(nextObj).before(zTreeHtml.join(''));
+                    } else {
+                        parentObj.append(zTreeHtml.join(''));
+                    }
+                }
+
+                view.createNodeCallback(setting);
+            },
+            destroy: function (setting) {
+                if (!setting) return;
+                data.initCache(setting);
+                data.initRoot(setting);
+                event.unbindTree(setting);
+                event.unbindEvent(setting);
+                setting.treeObj.empty();
+                delete settings[setting.treeId];
+            },
+            expandCollapseNode: function (setting, node, expandFlag, animateFlag, callback) {
+                var root = data.getRoot(setting);
+                var tmpCb, _callback;
+                if (!node) {
+                    tools.apply(callback, []);
+                    return;
+                }
+                var children = data.nodeChildren(setting, node);
+                var isParent = data.nodeIsParent(setting, node);
+                if (root.expandTriggerFlag) {
+                    _callback = callback;
+                    tmpCb = function () {
+                        if (_callback) _callback();
+                        if (node.open) {
+                            setting.treeObj.trigger(consts.event.EXPAND, [setting.treeId, node]);
+                        } else {
+                            setting.treeObj.trigger(consts.event.COLLAPSE, [setting.treeId, node]);
+                        }
+                    };
+                    callback = tmpCb;
+                    root.expandTriggerFlag = false;
+                }
+                if (!node.open && isParent && ((!$$(node, consts.id.UL, setting).get(0)) || (children && children.length > 0 && !$$(children[0], setting).get(0)))) {
+                    view.appendParentULDom(setting, node);
+                    view.createNodeCallback(setting);
+                }
+                if (node.open == expandFlag) {
+                    tools.apply(callback, []);
+                    return;
+                }
+                var ulObj = $$(node, consts.id.UL, setting),
+                    switchObj = $$(node, consts.id.SWITCH, setting),
+                    icoObj = $$(node, consts.id.ICON, setting);
+
+                if (isParent) {
+                    node.open = !node.open;
+                    if (node.iconOpen && node.iconClose) {
+                        icoObj.attr("style", view.makeNodeIcoStyle(setting, node));
+                    }
+
+                    if (node.open) {
+                        view.replaceSwitchClass(node, switchObj, consts.folder.OPEN);
+                        view.replaceIcoClass(node, icoObj, consts.folder.OPEN);
+                        if (animateFlag == false || setting.view.expandSpeed == "") {
+                            ulObj.show();
+                            tools.apply(callback, []);
+                        } else {
+                            if (children && children.length > 0) {
+                                ulObj.slideDown(setting.view.expandSpeed, callback);
+                            } else {
+                                ulObj.show();
+                                tools.apply(callback, []);
+                            }
+                        }
+                    } else {
+                        view.replaceSwitchClass(node, switchObj, consts.folder.CLOSE);
+                        view.replaceIcoClass(node, icoObj, consts.folder.CLOSE);
+                        if (animateFlag == false || setting.view.expandSpeed == "" || !(children && children.length > 0)) {
+                            ulObj.hide();
+                            tools.apply(callback, []);
+                        } else {
+                            ulObj.slideUp(setting.view.expandSpeed, callback);
+                        }
+                    }
+                } else {
+                    tools.apply(callback, []);
+                }
+            },
+            expandCollapseParentNode: function (setting, node, expandFlag, animateFlag, callback) {
+                if (!node) return;
+                if (!node.parentTId) {
+                    view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback);
+                    return;
+                } else {
+                    view.expandCollapseNode(setting, node, expandFlag, animateFlag);
+                }
+                if (node.parentTId) {
+                    view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, animateFlag, callback);
+                }
+            },
+            expandCollapseSonNode: function (setting, node, expandFlag, animateFlag, callback) {
+                var root = data.getRoot(setting),
+                    treeNodes = (node) ? data.nodeChildren(setting, node) : data.nodeChildren(setting, root),
+                    selfAnimateSign = (node) ? false : animateFlag,
+                    expandTriggerFlag = data.getRoot(setting).expandTriggerFlag;
+                data.getRoot(setting).expandTriggerFlag = false;
+                if (treeNodes) {
+                    for (var i = 0, l = treeNodes.length; i < l; i++) {
+                        if (treeNodes[i]) view.expandCollapseSonNode(setting, treeNodes[i], expandFlag, selfAnimateSign);
+                    }
+                }
+                data.getRoot(setting).expandTriggerFlag = expandTriggerFlag;
+                view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback);
+            },
+            isSelectedNode: function (setting, node) {
+                if (!node) {
+                    return false;
+                }
+                var list = data.getRoot(setting).curSelectedList,
+                    i;
+                for (i = list.length - 1; i >= 0; i--) {
+                    if (node === list[i]) {
+                        return true;
+                    }
+                }
+                return false;
+            },
+            makeDOMNodeIcon: function (html, setting, node) {
+                var nameStr = data.nodeName(setting, node),
+                    name = setting.view.nameIsHTML ? nameStr : nameStr.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+                html.push("<span id='", node.tId, consts.id.ICON,
+                    "' title='' treeNode", consts.id.ICON, " class='", view.makeNodeIcoClass(setting, node),
+                    "' style='", view.makeNodeIcoStyle(setting, node), "'></span><span id='", node.tId, consts.id.SPAN,
+                    "' class='", consts.className.NAME,
+                    "'>", name, "</span>");
+            },
+            makeDOMNodeLine: function (html, setting, node) {
+                html.push("<span id='", node.tId, consts.id.SWITCH, "' title='' class='", view.makeNodeLineClass(setting, node), "' treeNode", consts.id.SWITCH, "></span>");
+            },
+            makeDOMNodeMainAfter: function (html, setting, node) {
+                html.push("</li>");
+            },
+            makeDOMNodeMainBefore: function (html, setting, node) {
+                html.push("<li id='", node.tId, "' class='", consts.className.LEVEL, node.level, "' tabindex='0' hidefocus='true' treenode>");
+            },
+            makeDOMNodeNameAfter: function (html, setting, node) {
+                html.push("</a>");
+            },
+            makeDOMNodeNameBefore: function (html, setting, node) {
+                var title = data.nodeTitle(setting, node),
+                    url = view.makeNodeUrl(setting, node),
+                    fontcss = view.makeNodeFontCss(setting, node),
+                    fontStyle = [];
+                for (var f in fontcss) {
+                    fontStyle.push(f, ":", fontcss[f], ";");
+                }
+                html.push("<a id='", node.tId, consts.id.A, "' class='", consts.className.LEVEL, node.level, "' treeNode", consts.id.A, " onclick=\"", (node.click || ''),
+                    "\" ", ((url != null && url.length > 0) ? "href='" + url + "'" : ""), " target='", view.makeNodeTarget(node), "' style='", fontStyle.join(''),
+                    "'");
+                if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle) && title) {
+                    html.push("title='", title.replace(/'/g, "&#39;").replace(/</g, '&lt;').replace(/>/g, '&gt;'), "'");
+                }
+                html.push(">");
+            },
+            makeNodeFontCss: function (setting, node) {
+                var fontCss = tools.apply(setting.view.fontCss, [setting.treeId, node], setting.view.fontCss);
+                return (fontCss && ((typeof fontCss) != "function")) ? fontCss : {};
+            },
+            makeNodeIcoClass: function (setting, node) {
+                var icoCss = ["ico"];
+                if (!node.isAjaxing) {
+                    var isParent = data.nodeIsParent(setting, node);
+                    icoCss[0] = (node.iconSkin ? node.iconSkin + "_" : "") + icoCss[0];
+                    if (isParent) {
+                        icoCss.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE);
+                    } else {
+                        icoCss.push(consts.folder.DOCU);
+                    }
+                }
+                return consts.className.BUTTON + " " + icoCss.join('_');
+            },
+            makeNodeIcoStyle: function (setting, node) {
+                var icoStyle = [];
+                if (!node.isAjaxing) {
+                    var isParent = data.nodeIsParent(setting, node);
+                    var icon = (isParent && node.iconOpen && node.iconClose) ? (node.open ? node.iconOpen : node.iconClose) : node[setting.data.key.icon];
+                    if (icon) icoStyle.push("background:url(", icon, ") 0 0 no-repeat;");
+                    if (setting.view.showIcon == false || !tools.apply(setting.view.showIcon, [setting.treeId, node], true)) {
+                        icoStyle.push("width:0px;height:0px;");
+                    }
+                }
+                return icoStyle.join('');
+            },
+            makeNodeLineClass: function (setting, node) {
+                var lineClass = [];
+                if (setting.view.showLine) {
+                    if (node.level == 0 && node.isFirstNode && node.isLastNode) {
+                        lineClass.push(consts.line.ROOT);
+                    } else if (node.level == 0 && node.isFirstNode) {
+                        lineClass.push(consts.line.ROOTS);
+                    } else if (node.isLastNode) {
+                        lineClass.push(consts.line.BOTTOM);
+                    } else {
+                        lineClass.push(consts.line.CENTER);
+                    }
+                } else {
+                    lineClass.push(consts.line.NOLINE);
+                }
+                if (data.nodeIsParent(setting, node)) {
+                    lineClass.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE);
+                } else {
+                    lineClass.push(consts.folder.DOCU);
+                }
+                return view.makeNodeLineClassEx(node) + lineClass.join('_');
+            },
+            makeNodeLineClassEx: function (node) {
+                return consts.className.BUTTON + " " + consts.className.LEVEL + node.level + " " + consts.className.SWITCH + " ";
+            },
+            makeNodeTarget: function (node) {
+                return (node.target || "_blank");
+            },
+            makeNodeUrl: function (setting, node) {
+                var urlKey = setting.data.key.url;
+                return node[urlKey] ? node[urlKey] : null;
+            },
+            makeUlHtml: function (setting, node, html, content) {
+                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"), "'>");
+                html.push(content);
+                html.push("</ul>");
+            },
+            makeUlLineClass: function (setting, node) {
+                return ((setting.view.showLine && !node.isLastNode) ? consts.line.LINE : "");
+            },
+            removeChildNodes: function (setting, node) {
+                if (!node) return;
+                var nodes = data.nodeChildren(setting, node);
+                if (!nodes) return;
+
+                for (var i = 0, l = nodes.length; i < l; i++) {
+                    data.removeNodeCache(setting, nodes[i]);
+                }
+                data.removeSelectedNode(setting);
+                delete node[setting.data.key.children];
+
+                if (!setting.data.keep.parent) {
+                    data.nodeIsParent(setting, node, false);
+                    node.open = false;
+                    var tmp_switchObj = $$(node, consts.id.SWITCH, setting),
+                        tmp_icoObj = $$(node, consts.id.ICON, setting);
+                    view.replaceSwitchClass(node, tmp_switchObj, consts.folder.DOCU);
+                    view.replaceIcoClass(node, tmp_icoObj, consts.folder.DOCU);
+                    $$(node, consts.id.UL, setting).remove();
+                } else {
+                    $$(node, consts.id.UL, setting).empty();
+                }
+            },
+            scrollIntoView: function (setting, dom) {
+                if (!dom) {
+                    return;
+                }
+                // support IE 7
+                if (typeof Element === 'undefined') {
+                  var contRect = setting.treeObj.get(0).getBoundingClientRect(),
+                    findMeRect = dom.getBoundingClientRect();
+                  if (findMeRect.top < contRect.top || findMeRect.bottom > contRect.bottom
+                    || findMeRect.right > contRect.right || findMeRect.left < contRect.left) {
+                    dom.scrollIntoView();
+                  }
+                  return;
+                }
+                // code src: http://jsfiddle.net/08u6cxwj/
+                if (!Element.prototype.scrollIntoViewIfNeeded) {
+                    Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) {
+                        function withinBounds(value, min, max, extent) {
+                            if (false === centerIfNeeded || max <= value + extent && value <= min + extent) {
+                                return Math.min(max, Math.max(min, value));
+                            } else {
+                                return (min + max) / 2;
+                            }
+                        }
+
+                        function makeArea(left, top, width, height) {
+                            return {
+                                "left": left, "top": top, "width": width, "height": height
+                                , "right": left + width, "bottom": top + height
+                                , "translate": function (x, y) {
+                                    return makeArea(x + left, y + top, width, height);
+                                }
+                                , "relativeFromTo": function (lhs, rhs) {
+                                    var newLeft = left, newTop = top;
+                                    lhs = lhs.offsetParent;
+                                    rhs = rhs.offsetParent;
+                                    if (lhs === rhs) {
+                                        return area;
+                                    }
+                                    for (; lhs; lhs = lhs.offsetParent) {
+                                        newLeft += lhs.offsetLeft + lhs.clientLeft;
+                                        newTop += lhs.offsetTop + lhs.clientTop;
+                                    }
+                                    for (; rhs; rhs = rhs.offsetParent) {
+                                        newLeft -= rhs.offsetLeft + rhs.clientLeft;
+                                        newTop -= rhs.offsetTop + rhs.clientTop;
+                                    }
+                                    return makeArea(newLeft, newTop, width, height);
+                                }
+                            };
+                        }
+
+                        var parent, elem = this, area = makeArea(
+                            this.offsetLeft, this.offsetTop,
+                            this.offsetWidth, this.offsetHeight);
+                        while (tools.isElement(parent = elem.parentNode)) {
+                            var clientLeft = parent.offsetLeft + parent.clientLeft;
+                            var clientTop = parent.offsetTop + parent.clientTop;
+
+                            // Make area relative to parent's client area.
+                            area = area.relativeFromTo(elem, parent).translate(-clientLeft, -clientTop);
+
+                            parent.scrollLeft = withinBounds(
+                                parent.scrollLeft,
+                                area.right - parent.clientWidth, area.left,
+                                parent.clientWidth);
+
+                            parent.scrollTop = withinBounds(
+                                parent.scrollTop,
+                                area.bottom - parent.clientHeight, area.top,
+                                parent.clientHeight);
+
+                            // Determine actual scroll amount by reading back scroll properties.
+                            area = area.translate(clientLeft - parent.scrollLeft,
+                                clientTop - parent.scrollTop);
+                            elem = parent;
+                        }
+                    };
+                }
+                dom.scrollIntoViewIfNeeded();
+            },
+            setFirstNode: function (setting, parentNode) {
+                var children = data.nodeChildren(setting, parentNode);
+                if (children.length > 0) {
+                    children[0].isFirstNode = true;
+                }
+            },
+            setLastNode: function (setting, parentNode) {
+                var children = data.nodeChildren(setting, parentNode);
+                if (children.length > 0) {
+                    children[children.length - 1].isLastNode = true;
+                }
+            },
+            removeNode: function (setting, node) {
+                var root = data.getRoot(setting),
+                    parentNode = (node.parentTId) ? node.getParentNode() : root;
+
+                node.isFirstNode = false;
+                node.isLastNode = false;
+                node.getPreNode = function () {
+                    return null;
+                };
+                node.getNextNode = function () {
+                    return null;
+                };
+
+                if (!data.getNodeCache(setting, node.tId)) {
+                    return;
+                }
+
+                $$(node, setting).remove();
+                data.removeNodeCache(setting, node);
+                data.removeSelectedNode(setting, node);
+
+                var children = data.nodeChildren(setting, parentNode);
+                for (var i = 0, l = children.length; i < l; i++) {
+                    if (children[i].tId == node.tId) {
+                        children.splice(i, 1);
+                        break;
+                    }
+                }
+                view.setFirstNode(setting, parentNode);
+                view.setLastNode(setting, parentNode);
+
+                var tmp_ulObj, tmp_switchObj, tmp_icoObj,
+                    childLength = children.length;
+
+                //repair nodes old parent
+                if (!setting.data.keep.parent && childLength == 0) {
+                    //old parentNode has no child nodes
+                    data.nodeIsParent(setting, parentNode, false);
+                    parentNode.open = false;
+                    delete parentNode[setting.data.key.children];
+                    tmp_ulObj = $$(parentNode, consts.id.UL, setting);
+                    tmp_switchObj = $$(parentNode, consts.id.SWITCH, setting);
+                    tmp_icoObj = $$(parentNode, consts.id.ICON, setting);
+                    view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.DOCU);
+                    view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.DOCU);
+                    tmp_ulObj.css("display", "none");
+
+                } else if (setting.view.showLine && childLength > 0) {
+                    //old parentNode has child nodes
+                    var newLast = children[childLength - 1];
+                    tmp_ulObj = $$(newLast, consts.id.UL, setting);
+                    tmp_switchObj = $$(newLast, consts.id.SWITCH, setting);
+                    tmp_icoObj = $$(newLast, consts.id.ICON, setting);
+                    if (parentNode == root) {
+                        if (children.length == 1) {
+                            //node was root, and ztree has only one root after move node
+                            view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.ROOT);
+                        } else {
+                            var tmp_first_switchObj = $$(children[0], consts.id.SWITCH, setting);
+                            view.replaceSwitchClass(children[0], tmp_first_switchObj, consts.line.ROOTS);
+                            view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM);
+                        }
+                    } else {
+                        view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM);
+                    }
+                    tmp_ulObj.removeClass(consts.line.LINE);
+                }
+            },
+            replaceIcoClass: function (node, obj, newName) {
+                if (!obj || node.isAjaxing) return;
+                var tmpName = obj.attr("class");
+                if (tmpName == undefined) return;
+                var tmpList = tmpName.split("_");
+                switch (newName) {
+                    case consts.folder.OPEN:
+                    case consts.folder.CLOSE:
+                    case consts.folder.DOCU:
+                        tmpList[tmpList.length - 1] = newName;
+                        break;
+                }
+                obj.attr("class", tmpList.join("_"));
+            },
+            replaceSwitchClass: function (node, obj, newName) {
+                if (!obj) return;
+                var tmpName = obj.attr("class");
+                if (tmpName == undefined) return;
+                var tmpList = tmpName.split("_");
+                switch (newName) {
+                    case consts.line.ROOT:
+                    case consts.line.ROOTS:
+                    case consts.line.CENTER:
+                    case consts.line.BOTTOM:
+                    case consts.line.NOLINE:
+                        tmpList[0] = view.makeNodeLineClassEx(node) + newName;
+                        break;
+                    case consts.folder.OPEN:
+                    case consts.folder.CLOSE:
+                    case consts.folder.DOCU:
+                        tmpList[1] = newName;
+                        break;
+                }
+                obj.attr("class", tmpList.join("_"));
+                if (newName !== consts.folder.DOCU) {
+                    obj.removeAttr("disabled");
+                } else {
+                    obj.attr("disabled", "disabled");
+                }
+            },
+            selectNode: function (setting, node, addFlag) {
+                if (!addFlag) {
+                    view.cancelPreSelectedNode(setting, null, node);
+                }
+                $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED);
+                data.addSelectedNode(setting, node);
+                setting.treeObj.trigger(consts.event.SELECTED, [setting.treeId, node]);
+            },
+            setNodeFontCss: function (setting, treeNode) {
+                var aObj = $$(treeNode, consts.id.A, setting),
+                    fontCss = view.makeNodeFontCss(setting, treeNode);
+                if (fontCss) {
+                    aObj.css(fontCss);
+                }
+            },
+            setNodeLineIcos: function (setting, node) {
+                if (!node) return;
+                var switchObj = $$(node, consts.id.SWITCH, setting),
+                    ulObj = $$(node, consts.id.UL, setting),
+                    icoObj = $$(node, consts.id.ICON, setting),
+                    ulLine = view.makeUlLineClass(setting, node);
+                if (ulLine.length == 0) {
+                    ulObj.removeClass(consts.line.LINE);
+                } else {
+                    ulObj.addClass(ulLine);
+                }
+                switchObj.attr("class", view.makeNodeLineClass(setting, node));
+                if (data.nodeIsParent(setting, node)) {
+                    switchObj.removeAttr("disabled");
+                } else {
+                    switchObj.attr("disabled", "disabled");
+                }
+                icoObj.removeAttr("style");
+                icoObj.attr("style", view.makeNodeIcoStyle(setting, node));
+                icoObj.attr("class", view.makeNodeIcoClass(setting, node));
+            },
+            setNodeName: function (setting, node) {
+                var title = data.nodeTitle(setting, node),
+                    nObj = $$(node, consts.id.SPAN, setting);
+                nObj.empty();
+                if (setting.view.nameIsHTML) {
+                    nObj.html(data.nodeName(setting, node));
+                } else {
+                    nObj.text(data.nodeName(setting, node));
+                }
+                if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle)) {
+                    var aObj = $$(node, consts.id.A, setting);
+                    aObj.attr("title", !title ? "" : title);
+                }
+            },
+            setNodeTarget: function (setting, node) {
+                var aObj = $$(node, consts.id.A, setting);
+                aObj.attr("target", view.makeNodeTarget(node));
+            },
+            setNodeUrl: function (setting, node) {
+                var aObj = $$(node, consts.id.A, setting),
+                    url = view.makeNodeUrl(setting, node);
+                if (url == null || url.length == 0) {
+                    aObj.removeAttr("href");
+                } else {
+                    aObj.attr("href", url);
+                }
+            },
+            switchNode: function (setting, node) {
+                if (node.open || !tools.canAsync(setting, node)) {
+                    view.expandCollapseNode(setting, node, !node.open);
+                } else if (setting.async.enable) {
+                    if (!view.asyncNode(setting, node)) {
+                        view.expandCollapseNode(setting, node, !node.open);
+                        return;
+                    }
+                } else if (node) {
+                    view.expandCollapseNode(setting, node, !node.open);
+                }
+            }
+        };
+    // zTree defind
+    $.fn.zTree = {
+        consts: _consts,
+        _z: {
+            tools: tools,
+            view: view,
+            event: event,
+            data: data
+        },
+        getZTreeObj: function (treeId) {
+            var o = data.getZTreeTools(treeId);
+            return o ? o : null;
+        },
+        destroy: function (treeId) {
+            if (!!treeId && treeId.length > 0) {
+                view.destroy(data.getSetting(treeId));
+            } else {
+                for (var s in settings) {
+                    view.destroy(settings[s]);
+                }
+            }
+        },
+        init: function (obj, zSetting, zNodes) {
+            var setting = tools.clone(_setting);
+            $.extend(true, setting, zSetting);
+            setting.treeId = obj.attr("id");
+            setting.treeObj = obj;
+            setting.treeObj.empty();
+            settings[setting.treeId] = setting;
+            //For some older browser,(e.g., ie6)
+            if (typeof document.body.style.maxHeight === "undefined") {
+                setting.view.expandSpeed = "";
+            }
+            data.initRoot(setting);
+            var root = data.getRoot(setting);
+            zNodes = zNodes ? tools.clone(tools.isArray(zNodes) ? zNodes : [zNodes]) : [];
+            if (setting.data.simpleData.enable) {
+                data.nodeChildren(setting, root, data.transformTozTreeFormat(setting, zNodes));
+            } else {
+                data.nodeChildren(setting, root, zNodes);
+            }
+
+            data.initCache(setting);
+            event.unbindTree(setting);
+            event.bindTree(setting);
+            event.unbindEvent(setting);
+            event.bindEvent(setting);
+
+            var zTreeTools = {
+                setting: setting,
+                addNodes: function (parentNode, index, newNodes, isSilent) {
+                    if (!parentNode) parentNode = null;
+                    var isParent = data.nodeIsParent(setting, parentNode);
+                    if (parentNode && !isParent && setting.data.keep.leaf) return null;
+
+                    var i = parseInt(index, 10);
+                    if (isNaN(i)) {
+                        isSilent = !!newNodes;
+                        newNodes = index;
+                        index = -1;
+                    } else {
+                        index = i;
+                    }
+                    if (!newNodes) return null;
+
+
+                    var xNewNodes = tools.clone(tools.isArray(newNodes) ? newNodes : [newNodes]);
+
+                    function addCallback() {
+                        view.addNodes(setting, parentNode, index, xNewNodes, (isSilent == true));
+                    }
+
+                    if (tools.canAsync(setting, parentNode)) {
+                        view.asyncNode(setting, parentNode, isSilent, addCallback);
+                    } else {
+                        addCallback();
+                    }
+                    return xNewNodes;
+                },
+                cancelSelectedNode: function (node) {
+                    view.cancelPreSelectedNode(setting, node);
+                },
+                destroy: function () {
+                    view.destroy(setting);
+                },
+                expandAll: function (expandFlag) {
+                    expandFlag = !!expandFlag;
+                    view.expandCollapseSonNode(setting, null, expandFlag, true);
+                    return expandFlag;
+                },
+                expandNode: function (node, expandFlag, sonSign, focus, callbackFlag) {
+                    if (!node || !data.nodeIsParent(setting, node)) return null;
+                    if (expandFlag !== true && expandFlag !== false) {
+                        expandFlag = !node.open;
+                    }
+                    callbackFlag = !!callbackFlag;
+
+                    if (callbackFlag && expandFlag && (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false)) {
+                        return null;
+                    } else if (callbackFlag && !expandFlag && (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false)) {
+                        return null;
+                    }
+                    if (expandFlag && node.parentTId) {
+                        view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, false);
+                    }
+                    if (expandFlag === node.open && !sonSign) {
+                        return null;
+                    }
+
+                    data.getRoot(setting).expandTriggerFlag = callbackFlag;
+                    if (!tools.canAsync(setting, node) && sonSign) {
+                        view.expandCollapseSonNode(setting, node, expandFlag, true, showNodeFocus);
+                    } else {
+                        node.open = !expandFlag;
+                        view.switchNode(this.setting, node);
+                        showNodeFocus();
+                    }
+                    return expandFlag;
+
+                    function showNodeFocus() {
+                        var a = $$(node, setting).get(0);
+                        if (a && focus !== false) {
+                            view.scrollIntoView(setting, a);
+                        }
+                    }
+                },
+                getNodes: function () {
+                    return data.getNodes(setting);
+                },
+                getNodeByParam: function (key, value, parentNode) {
+                    if (!key) return null;
+                    return data.getNodeByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value);
+                },
+                getNodeByTId: function (tId) {
+                    return data.getNodeCache(setting, tId);
+                },
+                getNodesByParam: function (key, value, parentNode) {
+                    if (!key) return null;
+                    return data.getNodesByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value);
+                },
+                getNodesByParamFuzzy: function (key, value, parentNode) {
+                    if (!key) return null;
+                    return data.getNodesByParamFuzzy(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value);
+                },
+                getNodesByFilter: function (filter, isSingle, parentNode, invokeParam) {
+                    isSingle = !!isSingle;
+                    if (!filter || (typeof filter != "function")) return (isSingle ? null : []);
+                    return data.getNodesByFilter(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), filter, isSingle, invokeParam);
+                },
+                getNodeIndex: function (node) {
+                    if (!node) return null;
+                    var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
+                    var children = data.nodeChildren(setting, parentNode);
+                    for (var i = 0, l = children.length; i < l; i++) {
+                        if (children[i] == node) return i;
+                    }
+                    return -1;
+                },
+                getSelectedNodes: function () {
+                    var r = [], list = data.getRoot(setting).curSelectedList;
+                    for (var i = 0, l = list.length; i < l; i++) {
+                        r.push(list[i]);
+                    }
+                    return r;
+                },
+                isSelectedNode: function (node) {
+                    return data.isSelectedNode(setting, node);
+                },
+                reAsyncChildNodesPromise: function (parentNode, reloadType, isSilent) {
+                    var promise = new Promise(function(resolve, reject) {
+                        try {
+                            zTreeTools.reAsyncChildNodes(parentNode, reloadType, isSilent, function() {
+                                resolve(parentNode);
+                            });
+                        } catch(e) {
+                            reject(e);
+                        }
+                    });
+                    return promise;
+                },
+                reAsyncChildNodes: function (parentNode, reloadType, isSilent, callback) {
+                    if (!this.setting.async.enable) return;
+                    var isRoot = !parentNode;
+                    if (isRoot) {
+                        parentNode = data.getRoot(setting);
+                    }
+                    if (reloadType == "refresh") {
+                        var children = data.nodeChildren(setting, parentNode);
+                        for (var i = 0, l = children ? children.length : 0; i < l; i++) {
+                            data.removeNodeCache(setting, children[i]);
+                        }
+                        data.removeSelectedNode(setting);
+                        data.nodeChildren(setting, parentNode, []);
+                        if (isRoot) {
+                            this.setting.treeObj.empty();
+                        } else {
+                            var ulObj = $$(parentNode, consts.id.UL, setting);
+                            ulObj.empty();
+                        }
+                    }
+                    view.asyncNode(this.setting, isRoot ? null : parentNode, !!isSilent, callback);
+                },
+                refresh: function () {
+                    this.setting.treeObj.empty();
+                    var root = data.getRoot(setting),
+                        nodes = data.nodeChildren(setting, root);
+                    data.initRoot(setting);
+                    data.nodeChildren(setting, root, nodes);
+                    data.initCache(setting);
+                    view.createNodes(setting, 0, data.nodeChildren(setting, root), null, -1);
+                },
+                removeChildNodes: function (node) {
+                    if (!node) return null;
+                    var nodes = data.nodeChildren(setting, node);
+                    view.removeChildNodes(setting, node);
+                    return nodes ? nodes : null;
+                },
+                removeNode: function (node, callbackFlag) {
+                    if (!node) return;
+                    callbackFlag = !!callbackFlag;
+                    if (callbackFlag && tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return;
+                    view.removeNode(setting, node);
+                    if (callbackFlag) {
+                        this.setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]);
+                    }
+                },
+                selectNode: function (node, addFlag, isSilent) {
+                    if (!node) return;
+                    if (tools.uCanDo(setting)) {
+                        addFlag = setting.view.selectedMulti && addFlag;
+                        if (node.parentTId) {
+                            view.expandCollapseParentNode(setting, node.getParentNode(), true, false, showNodeFocus);
+                        } else if (!isSilent) {
+                            try {
+                                $$(node, setting).focus().blur();
+                            } catch (e) {
+                            }
+                        }
+                        view.selectNode(setting, node, addFlag);
+                    }
+
+                    function showNodeFocus() {
+                        if (isSilent) {
+                            return;
+                        }
+                        var a = $$(node, setting).get(0);
+                        view.scrollIntoView(setting, a);
+                    }
+                },
+                transformTozTreeNodes: function (simpleNodes) {
+                    return data.transformTozTreeFormat(setting, simpleNodes);
+                },
+                transformToArray: function (nodes) {
+                    return data.transformToArrayFormat(setting, nodes);
+                },
+                updateNode: function (node, checkTypeFlag) {
+                    if (!node) return;
+                    var nObj = $$(node, setting);
+                    if (nObj.get(0) && tools.uCanDo(setting)) {
+                        view.setNodeName(setting, node);
+                        view.setNodeTarget(setting, node);
+                        view.setNodeUrl(setting, node);
+                        view.setNodeLineIcos(setting, node);
+                        view.setNodeFontCss(setting, node);
+                    }
+                }
+            };
+            root.treeTools = zTreeTools;
+            data.setZTreeTools(setting, zTreeTools);
+            var children = data.nodeChildren(setting, root);
+            if (children && children.length > 0) {
+                view.createNodes(setting, 0, children, null, -1);
+            } else if (setting.async.enable && setting.async.url && setting.async.url !== '') {
+                view.asyncNode(setting);
+            }
+            return zTreeTools;
+        }
+    };
+
+    var zt = $.fn.zTree,
+        $$ = tools.$,
+        consts = zt.consts;
+})(jQuery);
\ No newline at end of file
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.core.min.js b/libs/ztree/3.5.33/js/jquery.ztree.core.min.js
new file mode 100644
index 000000000..ace946753
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.core.min.js
@@ -0,0 +1,76 @@
+/*
+ * JQuery zTree core v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function(q){var H,I,J,K,L,M,u,s={},v={},w={},N={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{isParent:"isParent",children:"children",name:"name",title:"",url:"url",icon:"icon"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post",
+dataType:"text",url:"",autoParam:[],otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},x=[function(a){var b=a.treeObj,c=f.event;b.bind(c.NODECREATED,function(b,
+c,h){j.apply(a.callback.onNodeCreated,[b,c,h])});b.bind(c.CLICK,function(b,c,h,e,m){j.apply(a.callback.onClick,[c,h,e,m])});b.bind(c.EXPAND,function(b,c,h){j.apply(a.callback.onExpand,[b,c,h])});b.bind(c.COLLAPSE,function(b,c,h){j.apply(a.callback.onCollapse,[b,c,h])});b.bind(c.ASYNC_SUCCESS,function(b,c,h,e){j.apply(a.callback.onAsyncSuccess,[b,c,h,e])});b.bind(c.ASYNC_ERROR,function(b,c,h,e,m,f){j.apply(a.callback.onAsyncError,[b,c,h,e,m,f])});b.bind(c.REMOVE,function(b,c,h){j.apply(a.callback.onRemove,
+[b,c,h])});b.bind(c.SELECTED,function(b,c,h){j.apply(a.callback.onSelected,[c,h])});b.bind(c.UNSELECTED,function(b,c,h){j.apply(a.callback.onUnSelected,[c,h])})}],y=[function(a){var b=f.event;a.treeObj.unbind(b.NODECREATED).unbind(b.CLICK).unbind(b.EXPAND).unbind(b.COLLAPSE).unbind(b.ASYNC_SUCCESS).unbind(b.ASYNC_ERROR).unbind(b.REMOVE).unbind(b.SELECTED).unbind(b.UNSELECTED)}],z=[function(a){var b=e.getCache(a);b||(b={},e.setCache(a,b));b.nodes=[];b.doms=[]}],A=[function(a,b,c,d,g,h){if(c){var k=
+e.getRoot(a),m=e.nodeChildren(a,c);c.level=b;c.tId=a.treeId+"_"+ ++k.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?j.eqs(c.open,"true"):!!c.open;b=e.nodeIsParent(a,c);j.isArray(m)&&!(b===!1||typeof b=="string"&&j.eqs(b,"false"))?(e.nodeIsParent(a,c,!0),c.zAsync=!0):(b=e.nodeIsParent(a,c,b),c.open=b&&!a.async.enable?c.open:!1,c.zAsync=!b);c.isFirstNode=g;c.isLastNode=h;c.getParentNode=function(){return e.getNodeCache(a,c.parentTId)};c.getPreNode=function(){return e.getPreNode(a,c)};c.getNextNode=
+function(){return e.getNextNode(a,c)};c.getIndex=function(){return e.getNodeIndex(a,c)};c.getPath=function(){return e.getNodePath(a,c)};c.isAjaxing=!1;e.fixPIdKeyValue(a,c)}}],t=[function(a){var b=a.target,c=e.getSetting(a.data.treeId),d="",g=null,h="",k="",m=null,i=null,o=null;if(j.eqs(a.type,"mousedown"))k="mousedown";else if(j.eqs(a.type,"mouseup"))k="mouseup";else if(j.eqs(a.type,"contextmenu"))k="contextmenu";else if(j.eqs(a.type,"click"))if(j.eqs(b.tagName,"span")&&b.getAttribute("treeNode"+
+f.id.SWITCH)!==null)d=j.getNodeMainDom(b).id,h="switchNode";else{if(o=j.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+f.id.A}]))d=j.getNodeMainDom(o).id,h="clickNode"}else if(j.eqs(a.type,"dblclick")&&(k="dblclick",o=j.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+f.id.A}])))d=j.getNodeMainDom(o).id,h="switchNode";if(k.length>0&&d.length==0&&(o=j.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+f.id.A}])))d=j.getNodeMainDom(o).id;if(d.length>0)switch(g=e.getNodeCache(c,d),h){case "switchNode":e.nodeIsParent(c,
+g)?j.eqs(a.type,"click")||j.eqs(a.type,"dblclick")&&j.apply(c.view.dblClickExpand,[c.treeId,g],c.view.dblClickExpand)?m=H:h="":h="";break;case "clickNode":m=I}switch(k){case "mousedown":i=J;break;case "mouseup":i=K;break;case "dblclick":i=L;break;case "contextmenu":i=M}return{stop:!1,node:g,nodeEventType:h,nodeEventCallback:m,treeEventType:k,treeEventCallback:i}}],B=[function(a){var b=e.getRoot(a);b||(b={},e.setRoot(a,b));e.nodeChildren(a,b,[]);b.expandTriggerFlag=!1;b.curSelectedList=[];b.noSelection=
+!0;b.createdNodes=[];b.zId=0;b._ver=(new Date).getTime()}],C=[],D=[],E=[],F=[],G=[],e={addNodeCache:function(a,b){e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=b},getNodeCacheId:function(a){return a.substring(a.lastIndexOf("_")+1)},addAfterA:function(a){D.push(a)},addBeforeA:function(a){C.push(a)},addInnerAfterA:function(a){F.push(a)},addInnerBeforeA:function(a){E.push(a)},addInitBind:function(a){x.push(a)},addInitUnBind:function(a){y.push(a)},addInitCache:function(a){z.push(a)},addInitNode:function(a){A.push(a)},
+addInitProxy:function(a,b){b?t.splice(0,0,a):t.push(a)},addInitRoot:function(a){B.push(a)},addNodesData:function(a,b,c,d){var g=e.nodeChildren(a,b);g?c>=g.length&&(c=-1):(g=e.nodeChildren(a,b,[]),c=-1);if(g.length>0&&c===0)g[0].isFirstNode=!1,i.setNodeLineIcos(a,g[0]);else if(g.length>0&&c<0)g[g.length-1].isLastNode=!1,i.setNodeLineIcos(a,g[g.length-1]);e.nodeIsParent(a,b,!0);c<0?e.nodeChildren(a,b,g.concat(d)):(a=[c,0].concat(d),g.splice.apply(g,a))},addSelectedNode:function(a,b){var c=e.getRoot(a);
+e.isSelectedNode(a,b)||c.curSelectedList.push(b)},addCreatedNode:function(a,b){(a.callback.onNodeCreated||a.view.addDiyDom)&&e.getRoot(a).createdNodes.push(b)},addZTreeTools:function(a){G.push(a)},exSetting:function(a){q.extend(!0,N,a)},fixPIdKeyValue:function(a,b){a.data.simpleData.enable&&(b[a.data.simpleData.pIdKey]=b.parentTId?b.getParentNode()[a.data.simpleData.idKey]:a.data.simpleData.rootPId)},getAfterA:function(a,b,c){for(var d=0,e=D.length;d<e;d++)D[d].apply(this,arguments)},getBeforeA:function(a,
+b,c){for(var d=0,e=C.length;d<e;d++)C[d].apply(this,arguments)},getInnerAfterA:function(a,b,c){for(var d=0,e=F.length;d<e;d++)F[d].apply(this,arguments)},getInnerBeforeA:function(a,b,c){for(var d=0,e=E.length;d<e;d++)E[d].apply(this,arguments)},getCache:function(a){return w[a.treeId]},getNodeIndex:function(a,b){if(!b)return null;for(var c=b.parentTId?b.getParentNode():e.getRoot(a),c=e.nodeChildren(a,c),d=0,g=c.length-1;d<=g;d++)if(c[d]===b)return d;return-1},getNextNode:function(a,b){if(!b)return null;
+for(var c=b.parentTId?b.getParentNode():e.getRoot(a),c=e.nodeChildren(a,c),d=0,g=c.length-1;d<=g;d++)if(c[d]===b)return d==g?null:c[d+1];return null},getNodeByParam:function(a,b,c,d){if(!b||!c)return null;for(var g=0,h=b.length;g<h;g++){var k=b[g];if(k[c]==d)return b[g];k=e.nodeChildren(a,k);if(k=e.getNodeByParam(a,k,c,d))return k}return null},getNodeCache:function(a,b){if(!b)return null;var c=w[a.treeId].nodes[e.getNodeCacheId(b)];return c?c:null},getNodePath:function(a,b){if(!b)return null;var c;
+(c=b.parentTId?b.getParentNode().getPath():[])&&c.push(b);return c},getNodes:function(a){return e.nodeChildren(a,e.getRoot(a))},getNodesByParam:function(a,b,c,d){if(!b||!c)return[];for(var g=[],h=0,k=b.length;h<k;h++){var m=b[h];m[c]==d&&g.push(m);m=e.nodeChildren(a,m);g=g.concat(e.getNodesByParam(a,m,c,d))}return g},getNodesByParamFuzzy:function(a,b,c,d){if(!b||!c)return[];for(var g=[],d=d.toLowerCase(),h=0,k=b.length;h<k;h++){var m=b[h];typeof m[c]=="string"&&b[h][c].toLowerCase().indexOf(d)>-1&&
+g.push(m);m=e.nodeChildren(a,m);g=g.concat(e.getNodesByParamFuzzy(a,m,c,d))}return g},getNodesByFilter:function(a,b,c,d,g){if(!b)return d?null:[];for(var h=d?null:[],k=0,m=b.length;k<m;k++){var f=b[k];if(j.apply(c,[f,g],!1)){if(d)return f;h.push(f)}f=e.nodeChildren(a,f);f=e.getNodesByFilter(a,f,c,d,g);if(d&&f)return f;h=d?f:h.concat(f)}return h},getPreNode:function(a,b){if(!b)return null;for(var c=b.parentTId?b.getParentNode():e.getRoot(a),c=e.nodeChildren(a,c),d=0,g=c.length;d<g;d++)if(c[d]===b)return d==
+0?null:c[d-1];return null},getRoot:function(a){return a?v[a.treeId]:null},getRoots:function(){return v},getSetting:function(a){return s[a]},getSettings:function(){return s},getZTreeTools:function(a){return(a=this.getRoot(this.getSetting(a)))?a.treeTools:null},initCache:function(a){for(var b=0,c=z.length;b<c;b++)z[b].apply(this,arguments)},initNode:function(a,b,c,d,e,h){for(var k=0,f=A.length;k<f;k++)A[k].apply(this,arguments)},initRoot:function(a){for(var b=0,c=B.length;b<c;b++)B[b].apply(this,arguments)},
+isSelectedNode:function(a,b){for(var c=e.getRoot(a),d=0,g=c.curSelectedList.length;d<g;d++)if(b===c.curSelectedList[d])return!0;return!1},nodeChildren:function(a,b,c){if(!b)return null;a=a.data.key.children;typeof c!=="undefined"&&(b[a]=c);return b[a]},nodeIsParent:function(a,b,c){if(!b)return!1;a=a.data.key.isParent;typeof c!=="undefined"&&(typeof c==="string"&&(c=j.eqs(c,"true")),b[a]=!!c);return b[a]},nodeName:function(a,b,c){a=a.data.key.name;typeof c!=="undefined"&&(b[a]=c);return""+b[a]},nodeTitle:function(a,
+b){return""+b[a.data.key.title===""?a.data.key.name:a.data.key.title]},removeNodeCache:function(a,b){var c=e.nodeChildren(a,b);if(c)for(var d=0,g=c.length;d<g;d++)e.removeNodeCache(a,c[d]);e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=null},removeSelectedNode:function(a,b){for(var c=e.getRoot(a),d=0,g=c.curSelectedList.length;d<g;d++)if(b===c.curSelectedList[d]||!e.getNodeCache(a,c.curSelectedList[d].tId))c.curSelectedList.splice(d,1),a.treeObj.trigger(f.event.UNSELECTED,[a.treeId,b]),d--,g--},setCache:function(a,
+b){w[a.treeId]=b},setRoot:function(a,b){v[a.treeId]=b},setZTreeTools:function(a,b){for(var c=0,d=G.length;c<d;c++)G[c].apply(this,arguments)},transformToArrayFormat:function(a,b){function c(b){d.push(b);(b=e.nodeChildren(a,b))&&(d=d.concat(e.transformToArrayFormat(a,b)))}if(!b)return[];var d=[];if(j.isArray(b))for(var g=0,h=b.length;g<h;g++)c(b[g]);else c(b);return d},transformTozTreeFormat:function(a,b){var c,d,g=a.data.simpleData.idKey,h=a.data.simpleData.pIdKey;if(!g||g==""||!b)return[];if(j.isArray(b)){var k=
+[],f={};for(c=0,d=b.length;c<d;c++)f[b[c][g]]=b[c];for(c=0,d=b.length;c<d;c++){var i=f[b[c][h]];if(i&&b[c][g]!=b[c][h]){var o=e.nodeChildren(a,i);o||(o=e.nodeChildren(a,i,[]));o.push(b[c])}else k.push(b[c])}return k}else return[b]}},n={bindEvent:function(a){for(var b=0,c=x.length;b<c;b++)x[b].apply(this,arguments)},unbindEvent:function(a){for(var b=0,c=y.length;b<c;b++)y[b].apply(this,arguments)},bindTree:function(a){var b={treeId:a.treeId},c=a.treeObj;a.view.txtSelectedEnable||c.bind("selectstart",
+u).css({"-moz-user-select":"-moz-none"});c.bind("click",b,n.proxy);c.bind("dblclick",b,n.proxy);c.bind("mouseover",b,n.proxy);c.bind("mouseout",b,n.proxy);c.bind("mousedown",b,n.proxy);c.bind("mouseup",b,n.proxy);c.bind("contextmenu",b,n.proxy)},unbindTree:function(a){a.treeObj.unbind("selectstart",u).unbind("click",n.proxy).unbind("dblclick",n.proxy).unbind("mouseover",n.proxy).unbind("mouseout",n.proxy).unbind("mousedown",n.proxy).unbind("mouseup",n.proxy).unbind("contextmenu",n.proxy)},doProxy:function(a){for(var b=
+[],c=0,d=t.length;c<d;c++){var e=t[c].apply(this,arguments);b.push(e);if(e.stop)break}return b},proxy:function(a){var b=e.getSetting(a.data.treeId);if(!j.uCanDo(b,a))return!0;for(var b=n.doProxy(a),c=!0,d=0,g=b.length;d<g;d++){var h=b[d];h.nodeEventCallback&&(c=h.nodeEventCallback.apply(h,[a,h.node])&&c);h.treeEventCallback&&(c=h.treeEventCallback.apply(h,[a,h.node])&&c)}return c}};H=function(a,b){var c=e.getSetting(a.data.treeId);if(b.open){if(j.apply(c.callback.beforeCollapse,[c.treeId,b],!0)==
+!1)return!0}else if(j.apply(c.callback.beforeExpand,[c.treeId,b],!0)==!1)return!0;e.getRoot(c).expandTriggerFlag=!0;i.switchNode(c,b);return!0};I=function(a,b){var c=e.getSetting(a.data.treeId),d=c.view.autoCancelSelected&&(a.ctrlKey||a.metaKey)&&e.isSelectedNode(c,b)?0:c.view.autoCancelSelected&&(a.ctrlKey||a.metaKey)&&c.view.selectedMulti?2:1;if(j.apply(c.callback.beforeClick,[c.treeId,b,d],!0)==!1)return!0;d===0?i.cancelPreSelectedNode(c,b):i.selectNode(c,b,d===2);c.treeObj.trigger(f.event.CLICK,
+[a,c.treeId,b,d]);return!0};J=function(a,b){var c=e.getSetting(a.data.treeId);j.apply(c.callback.beforeMouseDown,[c.treeId,b],!0)&&j.apply(c.callback.onMouseDown,[a,c.treeId,b]);return!0};K=function(a,b){var c=e.getSetting(a.data.treeId);j.apply(c.callback.beforeMouseUp,[c.treeId,b],!0)&&j.apply(c.callback.onMouseUp,[a,c.treeId,b]);return!0};L=function(a,b){var c=e.getSetting(a.data.treeId);j.apply(c.callback.beforeDblClick,[c.treeId,b],!0)&&j.apply(c.callback.onDblClick,[a,c.treeId,b]);return!0};
+M=function(a,b){var c=e.getSetting(a.data.treeId);j.apply(c.callback.beforeRightClick,[c.treeId,b],!0)&&j.apply(c.callback.onRightClick,[a,c.treeId,b]);return typeof c.callback.onRightClick!="function"};u=function(a){a=a.originalEvent.srcElement.nodeName.toLowerCase();return a==="input"||a==="textarea"};var j={apply:function(a,b,c){return typeof a=="function"?a.apply(O,b?b:[]):c},canAsync:function(a,b){var c=e.nodeChildren(a,b),d=e.nodeIsParent(a,b);return a.async.enable&&b&&d&&!(b.zAsync||c&&c.length>
+0)},clone:function(a){if(a===null)return null;var b=j.isArray(a)?[]:{},c;for(c in a)b[c]=a[c]instanceof Date?new Date(a[c].getTime()):typeof a[c]==="object"?j.clone(a[c]):a[c];return b},eqs:function(a,b){return a.toLowerCase()===b.toLowerCase()},isArray:function(a){return Object.prototype.toString.apply(a)==="[object Array]"},isElement:function(a){return typeof HTMLElement==="object"?a instanceof HTMLElement:a&&typeof a==="object"&&a!==null&&a.nodeType===1&&typeof a.nodeName==="string"},$:function(a,
+b,c){b&&typeof b!="string"&&(c=b,b="");return typeof a=="string"?q(a,c?c.treeObj.get(0).ownerDocument:null):q("#"+a.tId+b,c?c.treeObj:null)},getMDom:function(a,b,c){if(!b)return null;for(;b&&b.id!==a.treeId;){for(var d=0,e=c.length;b.tagName&&d<e;d++)if(j.eqs(b.tagName,c[d].tagName)&&b.getAttribute(c[d].attrName)!==null)return b;b=b.parentNode}return null},getNodeMainDom:function(a){return q(a).parent("li").get(0)||q(a).parentsUntil("li").parent().get(0)},isChildOrSelf:function(a,b){return q(a).closest("#"+
+b).length>0},uCanDo:function(){return!0}},i={addNodes:function(a,b,c,d,g){var h=e.nodeIsParent(a,b);if(!a.data.keep.leaf||!b||h)if(j.isArray(d)||(d=[d]),a.data.simpleData.enable&&(d=e.transformTozTreeFormat(a,d)),b){var h=l(b,f.id.SWITCH,a),k=l(b,f.id.ICON,a),m=l(b,f.id.UL,a);if(!b.open)i.replaceSwitchClass(b,h,f.folder.CLOSE),i.replaceIcoClass(b,k,f.folder.CLOSE),b.open=!1,m.css({display:"none"});e.addNodesData(a,b,c,d);i.createNodes(a,b.level+1,d,b,c);g||i.expandCollapseParentNode(a,b,!0)}else e.addNodesData(a,
+e.getRoot(a),c,d),i.createNodes(a,0,d,null,c)},appendNodes:function(a,b,c,d,g,h,k){if(!c)return[];var f=[],j=d?d:e.getRoot(a),j=e.nodeChildren(a,j),o,l;if(!j||g>=j.length-c.length)g=-1;for(var n=0,Q=c.length;n<Q;n++){var p=c[n];h&&(o=(g===0||j.length==c.length)&&n==0,l=g<0&&n==c.length-1,e.initNode(a,b,p,d,o,l,k),e.addNodeCache(a,p));o=e.nodeIsParent(a,p);l=[];var q=e.nodeChildren(a,p);q&&q.length>0&&(l=i.appendNodes(a,b+1,q,p,-1,h,k&&p.open));k&&(i.makeDOMNodeMainBefore(f,a,p),i.makeDOMNodeLine(f,
+a,p),e.getBeforeA(a,p,f),i.makeDOMNodeNameBefore(f,a,p),e.getInnerBeforeA(a,p,f),i.makeDOMNodeIcon(f,a,p),e.getInnerAfterA(a,p,f),i.makeDOMNodeNameAfter(f,a,p),e.getAfterA(a,p,f),o&&p.open&&i.makeUlHtml(a,p,f,l.join("")),i.makeDOMNodeMainAfter(f,a,p),e.addCreatedNode(a,p))}return f},appendParentULDom:function(a,b){var c=[],d=l(b,a);!d.get(0)&&b.parentTId&&(i.appendParentULDom(a,b.getParentNode()),d=l(b,a));var g=l(b,f.id.UL,a);g.get(0)&&g.remove();g=e.nodeChildren(a,b);g=i.appendNodes(a,b.level+1,
+g,b,-1,!1,!0);i.makeUlHtml(a,b,c,g.join(""));d.append(c.join(""))},asyncNode:function(a,b,c,d){var g,h;g=e.nodeIsParent(a,b);if(b&&!g)return j.apply(d),!1;else if(b&&b.isAjaxing)return!1;else if(j.apply(a.callback.beforeAsync,[a.treeId,b],!0)==!1)return j.apply(d),!1;if(b)b.isAjaxing=!0,l(b,f.id.ICON,a).attr({style:"","class":f.className.BUTTON+" "+f.className.ICO_LOADING});var k={},m=j.apply(a.async.autoParam,[a.treeId,b],a.async.autoParam);for(g=0,h=m.length;b&&g<h;g++){var r=m[g].split("="),o=
+r;r.length>1&&(o=r[1],r=r[0]);k[o]=b[r]}m=j.apply(a.async.otherParam,[a.treeId,b],a.async.otherParam);if(j.isArray(m))for(g=0,h=m.length;g<h;g+=2)k[m[g]]=m[g+1];else for(var n in m)k[n]=m[n];var P=e.getRoot(a)._ver;q.ajax({contentType:a.async.contentType,cache:!1,type:a.async.type,url:j.apply(a.async.url,[a.treeId,b],a.async.url),data:a.async.contentType.indexOf("application/json")>-1?JSON.stringify(k):k,dataType:a.async.dataType,success:function(h){if(P==e.getRoot(a)._ver){var k=[];try{k=!h||h.length==
+0?[]:typeof h=="string"?eval("("+h+")"):h}catch(g){k=h}if(b)b.isAjaxing=null,b.zAsync=!0;i.setNodeLineIcos(a,b);k&&k!==""?(k=j.apply(a.async.dataFilter,[a.treeId,b,k],k),i.addNodes(a,b,-1,k?j.clone(k):[],!!c)):i.addNodes(a,b,-1,[],!!c);a.treeObj.trigger(f.event.ASYNC_SUCCESS,[a.treeId,b,h]);j.apply(d)}},error:function(c,d,h){if(P==e.getRoot(a)._ver){if(b)b.isAjaxing=null;i.setNodeLineIcos(a,b);a.treeObj.trigger(f.event.ASYNC_ERROR,[a.treeId,b,c,d,h])}}});return!0},cancelPreSelectedNode:function(a,
+b,c){var d=e.getRoot(a).curSelectedList,g,h;for(g=d.length-1;g>=0;g--)if(h=d[g],b===h||!b&&(!c||c!==h))if(l(h,f.id.A,a).removeClass(f.node.CURSELECTED),b){e.removeSelectedNode(a,b);break}else d.splice(g,1),a.treeObj.trigger(f.event.UNSELECTED,[a.treeId,h])},createNodeCallback:function(a){if(a.callback.onNodeCreated||a.view.addDiyDom)for(var b=e.getRoot(a);b.createdNodes.length>0;){var c=b.createdNodes.shift();j.apply(a.view.addDiyDom,[a.treeId,c]);a.callback.onNodeCreated&&a.treeObj.trigger(f.event.NODECREATED,
+[a.treeId,c])}},createNodes:function(a,b,c,d,g){if(c&&c.length!=0){var h=e.getRoot(a),k=!d||d.open||!!l(e.nodeChildren(a,d)[0],a).get(0);h.createdNodes=[];var b=i.appendNodes(a,b,c,d,g,!0,k),m,j;d?(d=l(d,f.id.UL,a),d.get(0)&&(m=d)):m=a.treeObj;m&&(g>=0&&(j=m.children()[g]),g>=0&&j?q(j).before(b.join("")):m.append(b.join("")));i.createNodeCallback(a)}},destroy:function(a){a&&(e.initCache(a),e.initRoot(a),n.unbindTree(a),n.unbindEvent(a),a.treeObj.empty(),delete s[a.treeId])},expandCollapseNode:function(a,
+b,c,d,g){var h=e.getRoot(a),k;if(b){var m=e.nodeChildren(a,b),r=e.nodeIsParent(a,b);if(h.expandTriggerFlag)k=g,g=function(){k&&k();b.open?a.treeObj.trigger(f.event.EXPAND,[a.treeId,b]):a.treeObj.trigger(f.event.COLLAPSE,[a.treeId,b])},h.expandTriggerFlag=!1;if(!b.open&&r&&(!l(b,f.id.UL,a).get(0)||m&&m.length>0&&!l(m[0],a).get(0)))i.appendParentULDom(a,b),i.createNodeCallback(a);if(b.open==c)j.apply(g,[]);else{var c=l(b,f.id.UL,a),h=l(b,f.id.SWITCH,a),o=l(b,f.id.ICON,a);r?(b.open=!b.open,b.iconOpen&&
+b.iconClose&&o.attr("style",i.makeNodeIcoStyle(a,b)),b.open?(i.replaceSwitchClass(b,h,f.folder.OPEN),i.replaceIcoClass(b,o,f.folder.OPEN),d==!1||a.view.expandSpeed==""?(c.show(),j.apply(g,[])):m&&m.length>0?c.slideDown(a.view.expandSpeed,g):(c.show(),j.apply(g,[]))):(i.replaceSwitchClass(b,h,f.folder.CLOSE),i.replaceIcoClass(b,o,f.folder.CLOSE),d==!1||a.view.expandSpeed==""||!(m&&m.length>0)?(c.hide(),j.apply(g,[])):c.slideUp(a.view.expandSpeed,g))):j.apply(g,[])}}else j.apply(g,[])},expandCollapseParentNode:function(a,
+b,c,d,e){b&&(b.parentTId?(i.expandCollapseNode(a,b,c,d),b.parentTId&&i.expandCollapseParentNode(a,b.getParentNode(),c,d,e)):i.expandCollapseNode(a,b,c,d,e))},expandCollapseSonNode:function(a,b,c,d,g){var h=e.getRoot(a),h=b?e.nodeChildren(a,b):e.nodeChildren(a,h),k=b?!1:d,f=e.getRoot(a).expandTriggerFlag;e.getRoot(a).expandTriggerFlag=!1;if(h)for(var j=0,l=h.length;j<l;j++)h[j]&&i.expandCollapseSonNode(a,h[j],c,k);e.getRoot(a).expandTriggerFlag=f;i.expandCollapseNode(a,b,c,d,g)},isSelectedNode:function(a,
+b){if(!b)return!1;var c=e.getRoot(a).curSelectedList,d;for(d=c.length-1;d>=0;d--)if(b===c[d])return!0;return!1},makeDOMNodeIcon:function(a,b,c){var d=e.nodeName(b,c),d=b.view.nameIsHTML?d:d.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");a.push("<span id='",c.tId,f.id.ICON,"' title='' treeNode",f.id.ICON," class='",i.makeNodeIcoClass(b,c),"' style='",i.makeNodeIcoStyle(b,c),"'></span><span id='",c.tId,f.id.SPAN,"' class='",f.className.NAME,"'>",d,"</span>")},makeDOMNodeLine:function(a,
+b,c){a.push("<span id='",c.tId,f.id.SWITCH,"' title='' class='",i.makeNodeLineClass(b,c),"' treeNode",f.id.SWITCH,"></span>")},makeDOMNodeMainAfter:function(a){a.push("</li>")},makeDOMNodeMainBefore:function(a,b,c){a.push("<li id='",c.tId,"' class='",f.className.LEVEL,c.level,"' tabindex='0' hidefocus='true' treenode>")},makeDOMNodeNameAfter:function(a){a.push("</a>")},makeDOMNodeNameBefore:function(a,b,c){var d=e.nodeTitle(b,c),g=i.makeNodeUrl(b,c),h=i.makeNodeFontCss(b,c),k=[],m;for(m in h)k.push(m,
+":",h[m],";");a.push("<a id='",c.tId,f.id.A,"' class='",f.className.LEVEL,c.level,"' treeNode",f.id.A,' onclick="',c.click||"",'" ',g!=null&&g.length>0?"href='"+g+"'":""," target='",i.makeNodeTarget(c),"' style='",k.join(""),"'");j.apply(b.view.showTitle,[b.treeId,c],b.view.showTitle)&&d&&a.push("title='",d.replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),"'");a.push(">")},makeNodeFontCss:function(a,b){var c=j.apply(a.view.fontCss,[a.treeId,b],a.view.fontCss);return c&&typeof c!="function"?
+c:{}},makeNodeIcoClass:function(a,b){var c=["ico"];if(!b.isAjaxing){var d=e.nodeIsParent(a,b);c[0]=(b.iconSkin?b.iconSkin+"_":"")+c[0];d?c.push(b.open?f.folder.OPEN:f.folder.CLOSE):c.push(f.folder.DOCU)}return f.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(a,b){var c=[];if(!b.isAjaxing){var d=e.nodeIsParent(a,b)&&b.iconOpen&&b.iconClose?b.open?b.iconOpen:b.iconClose:b[a.data.key.icon];d&&c.push("background:url(",d,") 0 0 no-repeat;");(a.view.showIcon==!1||!j.apply(a.view.showIcon,[a.treeId,
+b],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(a,b){var c=[];a.view.showLine?b.level==0&&b.isFirstNode&&b.isLastNode?c.push(f.line.ROOT):b.level==0&&b.isFirstNode?c.push(f.line.ROOTS):b.isLastNode?c.push(f.line.BOTTOM):c.push(f.line.CENTER):c.push(f.line.NOLINE);e.nodeIsParent(a,b)?c.push(b.open?f.folder.OPEN:f.folder.CLOSE):c.push(f.folder.DOCU);return i.makeNodeLineClassEx(b)+c.join("_")},makeNodeLineClassEx:function(a){return f.className.BUTTON+" "+f.className.LEVEL+
+a.level+" "+f.className.SWITCH+" "},makeNodeTarget:function(a){return a.target||"_blank"},makeNodeUrl:function(a,b){var c=a.data.key.url;return b[c]?b[c]:null},makeUlHtml:function(a,b,c,d){c.push("<ul id='",b.tId,f.id.UL,"' class='",f.className.LEVEL,b.level," ",i.makeUlLineClass(a,b),"' style='display:",b.open?"block":"none","'>");c.push(d);c.push("</ul>")},makeUlLineClass:function(a,b){return a.view.showLine&&!b.isLastNode?f.line.LINE:""},removeChildNodes:function(a,b){if(b){var c=e.nodeChildren(a,
+b);if(c){for(var d=0,g=c.length;d<g;d++)e.removeNodeCache(a,c[d]);e.removeSelectedNode(a);delete b[a.data.key.children];a.data.keep.parent?l(b,f.id.UL,a).empty():(e.nodeIsParent(a,b,!1),b.open=!1,c=l(b,f.id.SWITCH,a),d=l(b,f.id.ICON,a),i.replaceSwitchClass(b,c,f.folder.DOCU),i.replaceIcoClass(b,d,f.folder.DOCU),l(b,f.id.UL,a).remove())}}},scrollIntoView:function(a,b){if(b)if(typeof Element==="undefined"){var c=a.treeObj.get(0).getBoundingClientRect(),d=b.getBoundingClientRect();(d.top<c.top||d.bottom>
+c.bottom||d.right>c.right||d.left<c.left)&&b.scrollIntoView()}else{if(!Element.prototype.scrollIntoViewIfNeeded)Element.prototype.scrollIntoViewIfNeeded=function(a){function b(a,c,d,f){return{left:a,top:c,width:d,height:f,right:a+d,bottom:c+f,translate:function(e,g){return b(e+a,g+c,d,f)},relativeFromTo:function(g,k){var i=a,j=c,g=g.offsetParent,k=k.offsetParent;if(g===k)return e;for(;g;g=g.offsetParent)i+=g.offsetLeft+g.clientLeft,j+=g.offsetTop+g.clientTop;for(;k;k=k.offsetParent)i-=k.offsetLeft+
+k.clientLeft,j-=k.offsetTop+k.clientTop;return b(i,j,d,f)}}}for(var c,d=this,e=b(this.offsetLeft,this.offsetTop,this.offsetWidth,this.offsetHeight);j.isElement(c=d.parentNode);){var f=c.offsetLeft+c.clientLeft,i=c.offsetTop+c.clientTop,e=e.relativeFromTo(d,c).translate(-f,-i);c.scrollLeft=!1===a||e.left<=c.scrollLeft+c.clientWidth&&c.scrollLeft<=e.right-c.clientWidth+c.clientWidth?Math.min(e.left,Math.max(e.right-c.clientWidth,c.scrollLeft)):(e.right-c.clientWidth+e.left)/2;c.scrollTop=!1===a||e.top<=
+c.scrollTop+c.clientHeight&&c.scrollTop<=e.bottom-c.clientHeight+c.clientHeight?Math.min(e.top,Math.max(e.bottom-c.clientHeight,c.scrollTop)):(e.bottom-c.clientHeight+e.top)/2;e=e.translate(f-c.scrollLeft,i-c.scrollTop);d=c}};b.scrollIntoViewIfNeeded()}},setFirstNode:function(a,b){var c=e.nodeChildren(a,b);if(c.length>0)c[0].isFirstNode=!0},setLastNode:function(a,b){var c=e.nodeChildren(a,b);if(c.length>0)c[c.length-1].isLastNode=!0},removeNode:function(a,b){var c=e.getRoot(a),d=b.parentTId?b.getParentNode():
+c;b.isFirstNode=!1;b.isLastNode=!1;b.getPreNode=function(){return null};b.getNextNode=function(){return null};if(e.getNodeCache(a,b.tId)){l(b,a).remove();e.removeNodeCache(a,b);e.removeSelectedNode(a,b);for(var g=e.nodeChildren(a,d),h=0,k=g.length;h<k;h++)if(g[h].tId==b.tId){g.splice(h,1);break}i.setFirstNode(a,d);i.setLastNode(a,d);var j,h=g.length;if(!a.data.keep.parent&&h==0)e.nodeIsParent(a,d,!1),d.open=!1,delete d[a.data.key.children],h=l(d,f.id.UL,a),k=l(d,f.id.SWITCH,a),j=l(d,f.id.ICON,a),
+i.replaceSwitchClass(d,k,f.folder.DOCU),i.replaceIcoClass(d,j,f.folder.DOCU),h.css("display","none");else if(a.view.showLine&&h>0){var r=g[h-1],h=l(r,f.id.UL,a),k=l(r,f.id.SWITCH,a);j=l(r,f.id.ICON,a);d==c?g.length==1?i.replaceSwitchClass(r,k,f.line.ROOT):(c=l(g[0],f.id.SWITCH,a),i.replaceSwitchClass(g[0],c,f.line.ROOTS),i.replaceSwitchClass(r,k,f.line.BOTTOM)):i.replaceSwitchClass(r,k,f.line.BOTTOM);h.removeClass(f.line.LINE)}}},replaceIcoClass:function(a,b,c){if(b&&!a.isAjaxing&&(a=b.attr("class"),
+a!=void 0)){a=a.split("_");switch(c){case f.folder.OPEN:case f.folder.CLOSE:case f.folder.DOCU:a[a.length-1]=c}b.attr("class",a.join("_"))}},replaceSwitchClass:function(a,b,c){if(b){var d=b.attr("class");if(d!=void 0){d=d.split("_");switch(c){case f.line.ROOT:case f.line.ROOTS:case f.line.CENTER:case f.line.BOTTOM:case f.line.NOLINE:d[0]=i.makeNodeLineClassEx(a)+c;break;case f.folder.OPEN:case f.folder.CLOSE:case f.folder.DOCU:d[1]=c}b.attr("class",d.join("_"));c!==f.folder.DOCU?b.removeAttr("disabled"):
+b.attr("disabled","disabled")}}},selectNode:function(a,b,c){c||i.cancelPreSelectedNode(a,null,b);l(b,f.id.A,a).addClass(f.node.CURSELECTED);e.addSelectedNode(a,b);a.treeObj.trigger(f.event.SELECTED,[a.treeId,b])},setNodeFontCss:function(a,b){var c=l(b,f.id.A,a),d=i.makeNodeFontCss(a,b);d&&c.css(d)},setNodeLineIcos:function(a,b){if(b){var c=l(b,f.id.SWITCH,a),d=l(b,f.id.UL,a),g=l(b,f.id.ICON,a),h=i.makeUlLineClass(a,b);h.length==0?d.removeClass(f.line.LINE):d.addClass(h);c.attr("class",i.makeNodeLineClass(a,
+b));e.nodeIsParent(a,b)?c.removeAttr("disabled"):c.attr("disabled","disabled");g.removeAttr("style");g.attr("style",i.makeNodeIcoStyle(a,b));g.attr("class",i.makeNodeIcoClass(a,b))}},setNodeName:function(a,b){var c=e.nodeTitle(a,b),d=l(b,f.id.SPAN,a);d.empty();a.view.nameIsHTML?d.html(e.nodeName(a,b)):d.text(e.nodeName(a,b));j.apply(a.view.showTitle,[a.treeId,b],a.view.showTitle)&&l(b,f.id.A,a).attr("title",!c?"":c)},setNodeTarget:function(a,b){l(b,f.id.A,a).attr("target",i.makeNodeTarget(b))},setNodeUrl:function(a,
+b){var c=l(b,f.id.A,a),d=i.makeNodeUrl(a,b);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(a,b){b.open||!j.canAsync(a,b)?i.expandCollapseNode(a,b,!b.open):a.async.enable?i.asyncNode(a,b)||i.expandCollapseNode(a,b,!b.open):b&&i.expandCollapseNode(a,b,!b.open)}};q.fn.zTree={consts:{className:{BUTTON:"button",LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch",NAME:"node_name"},event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",
+ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open",CLOSE:"close",DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:j,view:i,event:n,data:e},getZTreeObj:function(a){return(a=e.getZTreeTools(a))?a:null},destroy:function(a){if(a&&
+a.length>0)i.destroy(e.getSetting(a));else for(var b in s)i.destroy(s[b])},init:function(a,b,c){var d=j.clone(N);q.extend(!0,d,b);d.treeId=a.attr("id");d.treeObj=a;d.treeObj.empty();s[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";e.initRoot(d);a=e.getRoot(d);c=c?j.clone(j.isArray(c)?c:[c]):[];d.data.simpleData.enable?e.nodeChildren(d,a,e.transformTozTreeFormat(d,c)):e.nodeChildren(d,a,c);e.initCache(d);n.unbindTree(d);n.bindTree(d);n.unbindEvent(d);n.bindEvent(d);
+var g={setting:d,addNodes:function(a,b,c,g){function f(){i.addNodes(d,a,b,n,g==!0)}a||(a=null);var l=e.nodeIsParent(d,a);if(a&&!l&&d.data.keep.leaf)return null;l=parseInt(b,10);isNaN(l)?(g=!!c,c=b,b=-1):b=l;if(!c)return null;var n=j.clone(j.isArray(c)?c:[c]);j.canAsync(d,a)?i.asyncNode(d,a,g,f):f();return n},cancelSelectedNode:function(a){i.cancelPreSelectedNode(d,a)},destroy:function(){i.destroy(d)},expandAll:function(a){a=!!a;i.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,
+b,c,g,f){function n(){var b=l(a,d).get(0);b&&g!==!1&&i.scrollIntoView(d,b)}if(!a||!e.nodeIsParent(d,a))return null;b!==!0&&b!==!1&&(b=!a.open);if((f=!!f)&&b&&j.apply(d.callback.beforeExpand,[d.treeId,a],!0)==!1)return null;else if(f&&!b&&j.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&i.expandCollapseParentNode(d,a.getParentNode(),b,!1);if(b===a.open&&!c)return null;e.getRoot(d).expandTriggerFlag=f;!j.canAsync(d,a)&&c?i.expandCollapseSonNode(d,a,b,!0,n):(a.open=
+!b,i.switchNode(this.setting,a),n());return b},getNodes:function(){return e.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:e.getNodeByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodeByTId:function(a){return e.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:e.getNodesByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByParamFuzzy:function(a,b,c){return!a?null:e.getNodesByParamFuzzy(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByFilter:function(a,
+b,c,f){b=!!b;return!a||typeof a!="function"?b?null:[]:e.getNodesByFilter(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b,f)},getNodeIndex:function(a){if(!a)return null;for(var b=a.parentTId?a.getParentNode():e.getRoot(d),b=e.nodeChildren(d,b),c=0,f=b.length;c<f;c++)if(b[c]==a)return c;return-1},getSelectedNodes:function(){for(var a=[],b=e.getRoot(d).curSelectedList,c=0,f=b.length;c<f;c++)a.push(b[c]);return a},isSelectedNode:function(a){return e.isSelectedNode(d,a)},reAsyncChildNodesPromise:function(a,
+b,c){return new Promise(function(d,e){try{g.reAsyncChildNodes(a,b,c,function(){d(a)})}catch(f){e(f)}})},reAsyncChildNodes:function(a,b,c,g){if(this.setting.async.enable){var j=!a;j&&(a=e.getRoot(d));if(b=="refresh"){for(var b=e.nodeChildren(d,a),n=0,q=b?b.length:0;n<q;n++)e.removeNodeCache(d,b[n]);e.removeSelectedNode(d);e.nodeChildren(d,a,[]);j?this.setting.treeObj.empty():l(a,f.id.UL,d).empty()}i.asyncNode(this.setting,j?null:a,!!c,g)}},refresh:function(){this.setting.treeObj.empty();var a=e.getRoot(d),
+b=e.nodeChildren(d,a);e.initRoot(d);e.nodeChildren(d,a,b);e.initCache(d);i.createNodes(d,0,e.nodeChildren(d,a),null,-1)},removeChildNodes:function(a){if(!a)return null;var b=e.nodeChildren(d,a);i.removeChildNodes(d,a);return b?b:null},removeNode:function(a,b){a&&(b=!!b,b&&j.apply(d.callback.beforeRemove,[d.treeId,a],!0)==!1||(i.removeNode(d,a),b&&this.setting.treeObj.trigger(f.event.REMOVE,[d.treeId,a])))},selectNode:function(a,b,c){function e(){if(!c){var b=l(a,d).get(0);i.scrollIntoView(d,b)}}if(a&&
+j.uCanDo(d)){b=d.view.selectedMulti&&b;if(a.parentTId)i.expandCollapseParentNode(d,a.getParentNode(),!0,!1,e);else if(!c)try{l(a,d).focus().blur()}catch(f){}i.selectNode(d,a,b)}},transformTozTreeNodes:function(a){return e.transformTozTreeFormat(d,a)},transformToArray:function(a){return e.transformToArrayFormat(d,a)},updateNode:function(a){a&&l(a,d).get(0)&&j.uCanDo(d)&&(i.setNodeName(d,a),i.setNodeTarget(d,a),i.setNodeUrl(d,a),i.setNodeLineIcos(d,a),i.setNodeFontCss(d,a))}};a.treeTools=g;e.setZTreeTools(d,
+g);(c=e.nodeChildren(d,a))&&c.length>0?i.createNodes(d,0,c,null,-1):d.async.enable&&d.async.url&&d.async.url!==""&&i.asyncNode(d);return g}};var O=q.fn.zTree,l=j.$,f=O.consts})(jQuery);
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.excheck.js b/libs/ztree/3.5.33/js/jquery.ztree.excheck.js
new file mode 100644
index 000000000..98010e92f
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.excheck.js
@@ -0,0 +1,644 @@
+/*
+ * JQuery zTree excheck v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function($){
+	//default consts of excheck
+	var _consts = {
+		event: {
+			CHECK: "ztree_check"
+		},
+		id: {
+			CHECK: "_check"
+		},
+		checkbox: {
+			STYLE: "checkbox",
+			DEFAULT: "chk",
+			DISABLED: "disable",
+			FALSE: "false",
+			TRUE: "true",
+			FULL: "full",
+			PART: "part",
+			FOCUS: "focus"
+		},
+		radio: {
+			STYLE: "radio",
+			TYPE_ALL: "all",
+			TYPE_LEVEL: "level"
+		}
+	},
+	//default setting of excheck
+	_setting = {
+		check: {
+			enable: false,
+			autoCheckTrigger: false,
+			chkStyle: _consts.checkbox.STYLE,
+			nocheckInherit: false,
+			chkDisabledInherit: false,
+			radioType: _consts.radio.TYPE_LEVEL,
+			chkboxType: {
+				"Y": "ps",
+				"N": "ps"
+			}
+		},
+		data: {
+			key: {
+				checked: "checked"
+			}
+		},
+		callback: {
+			beforeCheck:null,
+			onCheck:null
+		}
+	},
+	//default root of excheck
+	_initRoot = function (setting) {
+		var r = data.getRoot(setting);
+		r.radioCheckedList = [];
+	},
+	//default cache of excheck
+	_initCache = function(treeId) {},
+	//default bind event of excheck
+	_bindEvent = function(setting) {
+		var o = setting.treeObj,
+		c = consts.event;
+		o.bind(c.CHECK, function (event, srcEvent, treeId, node) {
+			event.srcEvent = srcEvent;
+			tools.apply(setting.callback.onCheck, [event, treeId, node]);
+		});
+	},
+	_unbindEvent = function(setting) {
+		var o = setting.treeObj,
+		c = consts.event;
+		o.unbind(c.CHECK);
+	},
+	//default event proxy of excheck
+	_eventProxy = function(e) {
+		var target = e.target,
+		setting = data.getSetting(e.data.treeId),
+		tId = "", node = null,
+		nodeEventType = "", treeEventType = "",
+		nodeEventCallback = null, treeEventCallback = null;
+
+		if (tools.eqs(e.type, "mouseover")) {
+			if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
+				tId = tools.getNodeMainDom(target).id;
+				nodeEventType = "mouseoverCheck";
+			}
+		} else if (tools.eqs(e.type, "mouseout")) {
+			if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
+				tId = tools.getNodeMainDom(target).id;
+				nodeEventType = "mouseoutCheck";
+			}
+		} else if (tools.eqs(e.type, "click")) {
+			if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.CHECK) !== null) {
+				tId = tools.getNodeMainDom(target).id;
+				nodeEventType = "checkNode";
+			}
+		}
+		if (tId.length>0) {
+			node = data.getNodeCache(setting, tId);
+			switch (nodeEventType) {
+				case "checkNode" :
+					nodeEventCallback = _handler.onCheckNode;
+					break;
+				case "mouseoverCheck" :
+					nodeEventCallback = _handler.onMouseoverCheck;
+					break;
+				case "mouseoutCheck" :
+					nodeEventCallback = _handler.onMouseoutCheck;
+					break;
+			}
+		}
+		var proxyResult = {
+			stop: nodeEventType === "checkNode",
+			node: node,
+			nodeEventType: nodeEventType,
+			nodeEventCallback: nodeEventCallback,
+			treeEventType: treeEventType,
+			treeEventCallback: treeEventCallback
+		};
+		return proxyResult
+	},
+	//default init node of excheck
+	_initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
+		if (!n) return;
+		var checked = data.nodeChecked(setting, n);
+		checked = data.nodeChecked(setting, n, checked);
+		n.checkedOld = checked;
+		if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true");
+		n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck);
+		if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true");
+		n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled);
+		if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true");
+		n.halfCheck = !!n.halfCheck;
+		n.check_Child_State = -1;
+		n.check_Focus = false;
+		n.getCheckStatus = function() {return data.getCheckStatus(setting, n);};
+
+		if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && checked) {
+			var r = data.getRoot(setting);
+			r.radioCheckedList.push(n);
+		}
+	},
+	//add dom for check
+	_beforeA = function(setting, node, html) {
+		if (setting.check.enable) {
+			data.makeChkFlag(setting, node);
+			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>");
+		}
+	},
+	//update zTreeObj, add method of check
+	_zTreeTools = function(setting, zTreeTools) {
+		zTreeTools.checkNode = function(node, checked, checkTypeFlag, callbackFlag) {
+			var nodeChecked = data.nodeChecked(setting, node);
+			if (node.chkDisabled === true) return;
+			if (checked !== true && checked !== false) {
+				checked = !nodeChecked;
+			}
+			callbackFlag = !!callbackFlag;
+
+			if (nodeChecked === checked && !checkTypeFlag) {
+				return;
+			} else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) {
+				return;
+			}
+			if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) {
+        data.nodeChecked(setting, node, checked);
+				var checkObj = $$(node, consts.id.CHECK, this.setting);
+				if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
+				view.setChkClass(this.setting, checkObj, node);
+				view.repairParentChkClassWithSelf(this.setting, node);
+				if (callbackFlag) {
+					this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]);
+				}
+			}
+		}
+
+		zTreeTools.checkAllNodes = function(checked) {
+			view.repairAllChk(this.setting, !!checked);
+		}
+
+		zTreeTools.getCheckedNodes = function(checked) {
+			var checked = (checked !== false);
+			var children = data.nodeChildren(setting, data.getRoot(this.setting));
+			return data.getTreeCheckedNodes(this.setting, children, checked);
+		}
+
+		zTreeTools.getChangeCheckedNodes = function() {
+      var children = data.nodeChildren(setting, data.getRoot(this.setting));
+			return data.getTreeChangeCheckedNodes(this.setting, children);
+		}
+
+		zTreeTools.setChkDisabled = function(node, disabled, inheritParent, inheritChildren) {
+			disabled = !!disabled;
+			inheritParent = !!inheritParent;
+			inheritChildren = !!inheritChildren;
+			view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren);
+			view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent);
+		}
+
+		var _updateNode = zTreeTools.updateNode;
+		zTreeTools.updateNode = function(node, checkTypeFlag) {
+			if (_updateNode) _updateNode.apply(zTreeTools, arguments);
+			if (!node || !this.setting.check.enable) return;
+			var nObj = $$(node, this.setting);
+			if (nObj.get(0) && tools.uCanDo(this.setting)) {
+				var checkObj = $$(node, consts.id.CHECK, this.setting);
+				if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node);
+				view.setChkClass(this.setting, checkObj, node);
+				view.repairParentChkClassWithSelf(this.setting, node);
+			}
+		}
+	},
+	//method of operate data
+	_data = {
+		getRadioCheckedList: function(setting) {
+			var checkedList = data.getRoot(setting).radioCheckedList;
+			for (var i=0, j=checkedList.length; i<j; i++) {
+				if(!data.getNodeCache(setting, checkedList[i].tId)) {
+					checkedList.splice(i, 1);
+					i--; j--;
+				}
+			}
+			return checkedList;
+		},
+		getCheckStatus: function(setting, node) {
+			if (!setting.check.enable || node.nocheck || node.chkDisabled) return null;
+			var checked = data.nodeChecked(setting, node),
+			r = {
+				checked: checked,
+				half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (checked ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0)))
+			};
+			return r;
+		},
+		getTreeCheckedNodes: function(setting, nodes, checked, results) {
+			if (!nodes) return [];
+			var onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL);
+			results = !results ? [] : results;
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				var node = nodes[i];
+        var children = data.nodeChildren(setting, node);
+        var nodeChecked = data.nodeChecked(setting, node);
+				if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked == checked) {
+					results.push(node);
+					if(onlyOne) {
+						break;
+					}
+				}
+				data.getTreeCheckedNodes(setting, children, checked, results);
+				if(onlyOne && results.length > 0) {
+					break;
+				}
+			}
+			return results;
+		},
+		getTreeChangeCheckedNodes: function(setting, nodes, results) {
+			if (!nodes) return [];
+			results = !results ? [] : results;
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				var node = nodes[i];
+        var children = data.nodeChildren(setting, node);
+        var nodeChecked = data.nodeChecked(setting, node);
+				if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked != node.checkedOld) {
+					results.push(node);
+				}
+				data.getTreeChangeCheckedNodes(setting, children, results);
+			}
+			return results;
+		},
+		makeChkFlag: function(setting, node) {
+			if (!node) return;
+			var chkFlag = -1;
+			var children = data.nodeChildren(setting, node);
+			if (children) {
+				for (var i = 0, l = children.length; i < l; i++) {
+					var cNode = children[i];
+          var nodeChecked = data.nodeChecked(setting, cNode);
+					var tmp = -1;
+					if (setting.check.chkStyle == consts.radio.STYLE) {
+						if (cNode.nocheck === true || cNode.chkDisabled === true) {
+							tmp = cNode.check_Child_State;
+						} else if (cNode.halfCheck === true) {
+							tmp = 2;
+						} else if (nodeChecked) {
+							tmp = 2;
+						} else {
+							tmp = cNode.check_Child_State > 0 ? 2:0;
+						}
+						if (tmp == 2) {
+							chkFlag = 2; break;
+						} else if (tmp == 0){
+							chkFlag = 0;
+						}
+					} else if (setting.check.chkStyle == consts.checkbox.STYLE) {
+						if (cNode.nocheck === true || cNode.chkDisabled === true) {
+							tmp = cNode.check_Child_State;
+						} else if (cNode.halfCheck === true) {
+							tmp = 1;
+						} else if (nodeChecked) {
+							tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1;
+						} else {
+							tmp = (cNode.check_Child_State > 0) ? 1 : 0;
+						}
+						if (tmp === 1) {
+							chkFlag = 1; break;
+						} else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) {
+							chkFlag = 1; break;
+						} else if (chkFlag === 2 && tmp > -1 && tmp < 2) {
+							chkFlag = 1; break;
+						} else if (tmp > -1) {
+							chkFlag = tmp;
+						}
+					}
+				}
+			}
+			node.check_Child_State = chkFlag;
+		}
+	},
+	//method of event proxy
+	_event = {
+
+	},
+	//method of event handler
+	_handler = {
+		onCheckNode: function (event, node) {
+			if (node.chkDisabled === true) return false;
+			var setting = data.getSetting(event.data.treeId);
+			if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true;
+      var nodeChecked = data.nodeChecked(setting, node);
+      data.nodeChecked(setting, node, !nodeChecked);
+			view.checkNodeRelation(setting, node);
+			var checkObj = $$(node, consts.id.CHECK, setting);
+			view.setChkClass(setting, checkObj, node);
+			view.repairParentChkClassWithSelf(setting, node);
+			setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]);
+			return true;
+		},
+		onMouseoverCheck: function(event, node) {
+			if (node.chkDisabled === true) return false;
+			var setting = data.getSetting(event.data.treeId),
+			checkObj = $$(node, consts.id.CHECK, setting);
+			node.check_Focus = true;
+			view.setChkClass(setting, checkObj, node);
+			return true;
+		},
+		onMouseoutCheck: function(event, node) {
+			if (node.chkDisabled === true) return false;
+			var setting = data.getSetting(event.data.treeId),
+			checkObj = $$(node, consts.id.CHECK, setting);
+			node.check_Focus = false;
+			view.setChkClass(setting, checkObj, node);
+			return true;
+		}
+	},
+	//method of tools for zTree
+	_tools = {
+
+	},
+	//method of operate ztree dom
+	_view = {
+		checkNodeRelation: function(setting, node) {
+			var pNode, i, l,
+			r = consts.radio;
+      var nodeChecked = data.nodeChecked(setting, node);
+			if (setting.check.chkStyle == r.STYLE) {
+				var checkedList = data.getRadioCheckedList(setting);
+				if (nodeChecked) {
+					if (setting.check.radioType == r.TYPE_ALL) {
+						for (i = checkedList.length-1; i >= 0; i--) {
+							pNode = checkedList[i];
+              var pNodeChecked = data.nodeChecked(setting, pNode);
+							if (pNodeChecked && pNode != node) {
+                data.nodeChecked(setting, pNode, false);
+								checkedList.splice(i, 1);
+
+								view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
+								if (pNode.parentTId != node.parentTId) {
+									view.repairParentChkClassWithSelf(setting, pNode);
+								}
+							}
+						}
+						checkedList.push(node);
+					} else {
+						var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
+            var children = data.nodeChildren(setting, parentNode);
+						for (i = 0, l = children.length; i < l; i++) {
+							pNode = children[i];
+              var pNodeChecked = data.nodeChecked(setting, pNode);
+							if (pNodeChecked && pNode != node) {
+								data.nodeChecked(setting, pNode, false);
+								view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode);
+							}
+						}
+					}
+				} else if (setting.check.radioType == r.TYPE_ALL) {
+					for (i = 0, l = checkedList.length; i < l; i++) {
+						if (node == checkedList[i]) {
+							checkedList.splice(i, 1);
+							break;
+						}
+					}
+				}
+
+			} else {
+        var children = data.nodeChildren(setting, node);
+				if (nodeChecked && (!children || children.length==0 || setting.check.chkboxType.Y.indexOf("s") > -1)) {
+					view.setSonNodeCheckBox(setting, node, true);
+				}
+				if (!nodeChecked && (!children || children.length==0 || setting.check.chkboxType.N.indexOf("s") > -1)) {
+					view.setSonNodeCheckBox(setting, node, false);
+				}
+				if (nodeChecked && setting.check.chkboxType.Y.indexOf("p") > -1) {
+					view.setParentNodeCheckBox(setting, node, true);
+				}
+				if (!nodeChecked && setting.check.chkboxType.N.indexOf("p") > -1) {
+					view.setParentNodeCheckBox(setting, node, false);
+				}
+			}
+		},
+		makeChkClass: function(setting, node) {
+			var c = consts.checkbox, r = consts.radio,
+			fullStyle = "";
+      var nodeChecked = data.nodeChecked(setting, node);
+			if (node.chkDisabled === true) {
+				fullStyle = c.DISABLED;
+			} else if (node.halfCheck) {
+				fullStyle = c.PART;
+			} else if (setting.check.chkStyle == r.STYLE) {
+				fullStyle = (node.check_Child_State < 1)? c.FULL:c.PART;
+			} else {
+				fullStyle = nodeChecked ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL:c.PART) : ((node.check_Child_State < 1)? c.FULL:c.PART);
+			}
+			var chkName = setting.check.chkStyle + "_" + (nodeChecked ? c.TRUE : c.FALSE) + "_" + fullStyle;
+			chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName;
+			return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName;
+		},
+		repairAllChk: function(setting, checked) {
+			if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) {
+				var root = data.getRoot(setting);
+				var children = data.nodeChildren(setting, root);
+				for (var i = 0, l = children.length; i<l ; i++) {
+					var node = children[i];
+					if (node.nocheck !== true && node.chkDisabled !== true) {
+            data.nodeChecked(setting, node, checked);
+					}
+					view.setSonNodeCheckBox(setting, node, checked);
+				}
+			}
+		},
+		repairChkClass: function(setting, node) {
+			if (!node) return;
+			data.makeChkFlag(setting, node);
+			if (node.nocheck !== true) {
+				var checkObj = $$(node, consts.id.CHECK, setting);
+				view.setChkClass(setting, checkObj, node);
+			}
+		},
+		repairParentChkClass: function(setting, node) {
+			if (!node || !node.parentTId) return;
+			var pNode = node.getParentNode();
+			view.repairChkClass(setting, pNode);
+			view.repairParentChkClass(setting, pNode);
+		},
+		repairParentChkClassWithSelf: function(setting, node) {
+			if (!node) return;
+      var children = data.nodeChildren(setting, node);
+			if (children && children.length > 0) {
+				view.repairParentChkClass(setting, children[0]);
+			} else {
+				view.repairParentChkClass(setting, node);
+			}
+		},
+		repairSonChkDisabled: function(setting, node, chkDisabled, inherit) {
+			if (!node) return;
+      if (node.chkDisabled != chkDisabled) {
+				node.chkDisabled = chkDisabled;
+			}
+			view.repairChkClass(setting, node);
+      var children = data.nodeChildren(setting, node);
+      if (children && inherit) {
+				for (var i = 0, l = children.length; i < l; i++) {
+					var sNode = children[i];
+					view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit);
+				}
+			}
+		},
+		repairParentChkDisabled: function(setting, node, chkDisabled, inherit) {
+			if (!node) return;
+			if (node.chkDisabled != chkDisabled && inherit) {
+				node.chkDisabled = chkDisabled;
+			}
+			view.repairChkClass(setting, node);
+			view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit);
+		},
+		setChkClass: function(setting, obj, node) {
+			if (!obj) return;
+			if (node.nocheck === true) {
+				obj.hide();
+			} else {
+				obj.show();
+			}
+            obj.attr('class', view.makeChkClass(setting, node));
+		},
+		setParentNodeCheckBox: function(setting, node, value, srcNode) {
+			var checkObj = $$(node, consts.id.CHECK, setting);
+			if (!srcNode) srcNode = node;
+			data.makeChkFlag(setting, node);
+			if (node.nocheck !== true && node.chkDisabled !== true) {
+        data.nodeChecked(setting, node, value);
+				view.setChkClass(setting, checkObj, node);
+				if (setting.check.autoCheckTrigger && node != srcNode) {
+					setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
+				}
+			}
+			if (node.parentTId) {
+				var pSign = true;
+				if (!value) {
+          var pNodes = data.nodeChildren(setting, node.getParentNode());
+					for (var i = 0, l = pNodes.length; i < l; i++) {
+					  var pNode = pNodes[i];
+            var nodeChecked = data.nodeChecked(setting, pNode);
+						if ((pNode.nocheck !== true && pNode.chkDisabled !== true && nodeChecked)
+						|| ((pNode.nocheck === true || pNode.chkDisabled === true) && pNode.check_Child_State > 0)) {
+							pSign = false;
+							break;
+						}
+					}
+				}
+				if (pSign) {
+					view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode);
+				}
+			}
+		},
+		setSonNodeCheckBox: function(setting, node, value, srcNode) {
+			if (!node) return;
+			var checkObj = $$(node, consts.id.CHECK, setting);
+			if (!srcNode) srcNode = node;
+
+			var hasDisable = false;
+      var children = data.nodeChildren(setting, node);
+			if (children) {
+				for (var i = 0, l = children.length; i < l; i++) {
+					var sNode = children[i];
+					view.setSonNodeCheckBox(setting, sNode, value, srcNode);
+					if (sNode.chkDisabled === true) hasDisable = true;
+				}
+			}
+
+			if (node != data.getRoot(setting) && node.chkDisabled !== true) {
+				if (hasDisable && node.nocheck !== true) {
+					data.makeChkFlag(setting, node);
+				}
+				if (node.nocheck !== true && node.chkDisabled !== true) {
+          data.nodeChecked(setting, node, value);
+					if (!hasDisable) node.check_Child_State = (children && children.length > 0) ? (value ? 2 : 0) : -1;
+				} else {
+					node.check_Child_State = -1;
+				}
+				view.setChkClass(setting, checkObj, node);
+				if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) {
+					setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]);
+				}
+			}
+
+		}
+	},
+
+	_z = {
+		tools: _tools,
+		view: _view,
+		event: _event,
+		data: _data
+	};
+	$.extend(true, $.fn.zTree.consts, _consts);
+	$.extend(true, $.fn.zTree._z, _z);
+
+	var zt = $.fn.zTree,
+	tools = zt._z.tools,
+	consts = zt.consts,
+	view = zt._z.view,
+	data = zt._z.data,
+	event = zt._z.event,
+	$$ = tools.$;
+
+	data.nodeChecked = function(setting, node, newChecked) {
+    if (!node) {
+      return false;
+    }
+    var key = setting.data.key.checked;
+    if (typeof newChecked !== 'undefined') {
+      if (typeof newChecked === "string") {
+        newChecked = tools.eqs(checked, "true");
+      }
+      newChecked = !!newChecked;
+      node[key] = newChecked;
+    }
+    return node[key];
+  };
+
+	data.exSetting(_setting);
+	data.addInitBind(_bindEvent);
+	data.addInitUnBind(_unbindEvent);
+	data.addInitCache(_initCache);
+	data.addInitNode(_initNode);
+	data.addInitProxy(_eventProxy, true);
+	data.addInitRoot(_initRoot);
+	data.addBeforeA(_beforeA);
+	data.addZTreeTools(_zTreeTools);
+
+	var _createNodes = view.createNodes;
+	view.createNodes = function(setting, level, nodes, parentNode, index) {
+		if (_createNodes) _createNodes.apply(view, arguments);
+		if (!nodes) return;
+		view.repairParentChkClassWithSelf(setting, parentNode);
+	}
+	var _removeNode = view.removeNode;
+	view.removeNode = function(setting, node) {
+		var parentNode = node.getParentNode();
+		if (_removeNode) _removeNode.apply(view, arguments);
+		if (!node || !parentNode) return;
+		view.repairChkClass(setting, parentNode);
+		view.repairParentChkClass(setting, parentNode);
+	}
+
+	var _appendNodes = view.appendNodes;
+	view.appendNodes = function(setting, level, nodes, parentNode, index, initFlag, openFlag) {
+		var html = "";
+		if (_appendNodes) {
+			html = _appendNodes.apply(view, arguments);
+		}
+		if (parentNode) {
+			data.makeChkFlag(setting, parentNode);
+		}
+		return html;
+	}
+})(jQuery);
\ No newline at end of file
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.excheck.min.js b/libs/ztree/3.5.33/js/jquery.ztree.excheck.min.js
new file mode 100644
index 000000000..c52c8f71b
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.excheck.min.js
@@ -0,0 +1,34 @@
+/*
+ * JQuery zTree excheck v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function(n){var q,r,s,p={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},w={check:{enable:!1,autoCheckTrigger:!1,chkStyle:p.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:p.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};q=function(c,
+a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId);if(i.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;var d=e.nodeChecked(b,a);e.nodeChecked(b,a,!d);f.checkNodeRelation(b,a);d=m(a,h.id.CHECK,b);f.setChkClass(b,d,a);f.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(h.event.CHECK,[c,b.treeId,a]);return!0};r=function(c,a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId),d=m(a,h.id.CHECK,b);a.check_Focus=!0;f.setChkClass(b,d,a);return!0};s=function(c,
+a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId),d=m(a,h.id.CHECK,b);a.check_Focus=!1;f.setChkClass(b,d,a);return!0};n.extend(!0,n.fn.zTree.consts,p);n.extend(!0,n.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,j;d=h.radio;b=e.nodeChecked(c,a);if(c.check.chkStyle==d.STYLE){var g=e.getRadioCheckedList(c);if(b)if(c.check.radioType==d.TYPE_ALL){for(d=g.length-1;d>=0;d--){b=g[d];var k=e.nodeChecked(c,b);k&&b!=a&&(e.nodeChecked(c,b,!1),g.splice(d,1),f.setChkClass(c,
+m(b,h.id.CHECK,c),b),b.parentTId!=a.parentTId&&f.repairParentChkClassWithSelf(c,b))}g.push(a)}else{g=a.parentTId?a.getParentNode():e.getRoot(c);g=e.nodeChildren(c,g);for(d=0,j=g.length;d<j;d++)if(b=g[d],(k=e.nodeChecked(c,b))&&b!=a)e.nodeChecked(c,b,!1),f.setChkClass(c,m(b,h.id.CHECK,c),b)}else if(c.check.radioType==d.TYPE_ALL)for(d=0,j=g.length;d<j;d++)if(a==g[d]){g.splice(d,1);break}}else g=e.nodeChildren(c,a),b&&(!g||g.length==0||c.check.chkboxType.Y.indexOf("s")>-1)&&f.setSonNodeCheckBox(c,a,
+!0),!b&&(!g||g.length==0||c.check.chkboxType.N.indexOf("s")>-1)&&f.setSonNodeCheckBox(c,a,!1),b&&c.check.chkboxType.Y.indexOf("p")>-1&&f.setParentNodeCheckBox(c,a,!0),!b&&c.check.chkboxType.N.indexOf("p")>-1&&f.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=h.checkbox,d=h.radio,j="",g=e.nodeChecked(c,a),j=a.chkDisabled===!0?b.DISABLED:a.halfCheck?b.PART:c.check.chkStyle==d.STYLE?a.check_Child_State<1?b.FULL:b.PART:g?a.check_Child_State===2||a.check_Child_State===-1?b.FULL:b.PART:
+a.check_Child_State<1?b.FULL:b.PART,d=c.check.chkStyle+"_"+(g?b.TRUE:b.FALSE)+"_"+j,d=a.check_Focus&&a.chkDisabled!==!0?d+"_"+b.FOCUS:d;return h.className.BUTTON+" "+b.DEFAULT+" "+d},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===h.checkbox.STYLE)for(var b=e.getRoot(c),b=e.nodeChildren(c,b),d=0,j=b.length;d<j;d++){var g=b[d];g.nocheck!==!0&&g.chkDisabled!==!0&&e.nodeChecked(c,g,a);f.setSonNodeCheckBox(c,g,a)}},repairChkClass:function(c,a){if(a&&(e.makeChkFlag(c,a),a.nocheck!==!0)){var b=
+m(a,h.id.CHECK,c);f.setChkClass(c,b,a)}},repairParentChkClass:function(c,a){if(a&&a.parentTId){var b=a.getParentNode();f.repairChkClass(c,b);f.repairParentChkClass(c,b)}},repairParentChkClassWithSelf:function(c,a){if(a){var b=e.nodeChildren(c,a);b&&b.length>0?f.repairParentChkClass(c,b[0]):f.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b)a.chkDisabled=b;f.repairChkClass(c,a);if((a=e.nodeChildren(c,a))&&d)for(var j=0,g=a.length;j<g;j++)f.repairSonChkDisabled(c,
+a[j],b,d)}},repairParentChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b&&d)a.chkDisabled=b;f.repairChkClass(c,a);f.repairParentChkDisabled(c,a.getParentNode(),b,d)}},setChkClass:function(c,a,b){a&&(b.nocheck===!0?a.hide():a.show(),a.attr("class",f.makeChkClass(c,b)))},setParentNodeCheckBox:function(c,a,b,d){var j=m(a,h.id.CHECK,c);d||(d=a);e.makeChkFlag(c,a);a.nocheck!==!0&&a.chkDisabled!==!0&&(e.nodeChecked(c,a,b),f.setChkClass(c,j,a),c.check.autoCheckTrigger&&a!=d&&c.treeObj.trigger(h.event.CHECK,
+[null,c.treeId,a]));if(a.parentTId){j=!0;if(!b)for(var g=e.nodeChildren(c,a.getParentNode()),k=0,o=g.length;k<o;k++){var l=g[k],i=e.nodeChecked(c,l);if(l.nocheck!==!0&&l.chkDisabled!==!0&&i||(l.nocheck===!0||l.chkDisabled===!0)&&l.check_Child_State>0){j=!1;break}}j&&f.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var j=m(a,h.id.CHECK,c);d||(d=a);var g=!1,k=e.nodeChildren(c,a);if(k)for(var o=0,l=k.length;o<l;o++){var i=k[o];f.setSonNodeCheckBox(c,i,b,d);
+i.chkDisabled===!0&&(g=!0)}if(a!=e.getRoot(c)&&a.chkDisabled!==!0){g&&a.nocheck!==!0&&e.makeChkFlag(c,a);if(a.nocheck!==!0&&a.chkDisabled!==!0){if(e.nodeChecked(c,a,b),!g)a.check_Child_State=k&&k.length>0?b?2:0:-1}else a.check_Child_State=-1;f.setChkClass(c,j,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(h.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=e.getRoot(c).radioCheckedList,b=0,d=a.length;b<d;b++)e.getNodeCache(c,
+a[b].tId)||(a.splice(b,1),b--,d--);return a},getCheckStatus:function(c,a){if(!c.check.enable||a.nocheck||a.chkDisabled)return null;var b=e.nodeChecked(c,a);return{checked:b,half:a.halfCheck?a.halfCheck:c.check.chkStyle==h.radio.STYLE?a.check_Child_State===2:b?a.check_Child_State>-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var j=b&&c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL,d=!d?[]:d,g=0,f=a.length;g<f;g++){var i=
+a[g],l=e.nodeChildren(c,i),m=e.nodeChecked(c,i);if(i.nocheck!==!0&&i.chkDisabled!==!0&&m==b&&(d.push(i),j))break;e.getTreeCheckedNodes(c,l,b,d);if(j&&d.length>0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var b=!b?[]:b,d=0,j=a.length;d<j;d++){var g=a[d],f=e.nodeChildren(c,g),h=e.nodeChecked(c,g);g.nocheck!==!0&&g.chkDisabled!==!0&&h!=g.checkedOld&&b.push(g);e.getTreeChangeCheckedNodes(c,f,b)}return b},makeChkFlag:function(c,a){if(a){var b=-1,d=e.nodeChildren(c,a);
+if(d)for(var j=0,g=d.length;j<g;j++){var f=d[j],i=e.nodeChecked(c,f),l=-1;if(c.check.chkStyle==h.radio.STYLE)if(l=f.nocheck===!0||f.chkDisabled===!0?f.check_Child_State:f.halfCheck===!0?2:i?2:f.check_Child_State>0?2:0,l==2){b=2;break}else l==0&&(b=0);else if(c.check.chkStyle==h.checkbox.STYLE)if(l=f.nocheck===!0||f.chkDisabled===!0?f.check_Child_State:f.halfCheck===!0?1:i?f.check_Child_State===-1||f.check_Child_State===2?2:1:f.check_Child_State>0?1:0,l===1){b=1;break}else if(l===2&&b>-1&&j>0&&l!==
+b){b=1;break}else if(b===2&&l>-1&&l<2){b=1;break}else l>-1&&(b=l)}a.check_Child_State=b}}}});var n=n.fn.zTree,i=n._z.tools,h=n.consts,f=n._z.view,e=n._z.data,m=i.$;e.nodeChecked=function(c,a,b){if(!a)return!1;c=c.data.key.checked;typeof b!=="undefined"&&(typeof b==="string"&&(b=i.eqs(checked,"true")),a[c]=!!b);return a[c]};e.exSetting(w);e.addInitBind(function(c){c.treeObj.bind(h.event.CHECK,function(a,b,d,e){a.srcEvent=b;i.apply(c.callback.onCheck,[a,d,e])})});e.addInitUnBind(function(c){c.treeObj.unbind(h.event.CHECK)});
+e.addInitCache(function(){});e.addInitNode(function(c,a,b,d){if(b){a=e.nodeChecked(c,b);a=e.nodeChecked(c,b,a);b.checkedOld=a;if(typeof b.nocheck=="string")b.nocheck=i.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=i.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=i.eqs(b.halfCheck,"true");b.halfCheck=!!b.halfCheck;
+b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return e.getCheckStatus(c,b)};c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL&&a&&e.getRoot(c).radioCheckedList.push(b)}});e.addInitProxy(function(c){var a=c.target,b=e.getSetting(c.data.treeId),d="",f=null,g="",k=null;if(i.eqs(c.type,"mouseover")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoverCheck"}else if(i.eqs(c.type,"mouseout")){if(b.check.enable&&
+i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoutCheck"}else if(i.eqs(c.type,"click")&&b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="checkNode";if(d.length>0)switch(f=e.getNodeCache(b,d),g){case "checkNode":k=q;break;case "mouseoverCheck":k=r;break;case "mouseoutCheck":k=s}return{stop:g==="checkNode",node:f,nodeEventType:g,nodeEventCallback:k,treeEventType:"",treeEventCallback:null}},
+!0);e.addInitRoot(function(c){e.getRoot(c).radioCheckedList=[]});e.addBeforeA(function(c,a,b){c.check.enable&&(e.makeChkFlag(c,a),b.push("<span ID='",a.tId,h.id.CHECK,"' class='",f.makeChkClass(c,a),"' treeNode",h.id.CHECK,a.nocheck===!0?" style='display:none;'":"","></span>"))});e.addZTreeTools(function(c,a){a.checkNode=function(a,b,g,k){var o=e.nodeChecked(c,a);if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!o),k=!!k,(o!==b||g)&&!(k&&i.apply(this.setting.callback.beforeCheck,[this.setting.treeId,a],
+!0)==!1)&&i.uCanDo(this.setting)&&this.setting.check.enable&&a.nocheck!==!0))e.nodeChecked(c,a,b),b=m(a,h.id.CHECK,this.setting),(g||this.setting.check.chkStyle===h.radio.STYLE)&&f.checkNodeRelation(this.setting,a),f.setChkClass(this.setting,b,a),f.repairParentChkClassWithSelf(this.setting,a),k&&this.setting.treeObj.trigger(h.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){f.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var a=a!==!1,b=e.nodeChildren(c,e.getRoot(this.setting));
+return e.getTreeCheckedNodes(this.setting,b,a)};a.getChangeCheckedNodes=function(){var a=e.nodeChildren(c,e.getRoot(this.setting));return e.getTreeChangeCheckedNodes(this.setting,a)};a.setChkDisabled=function(a,b,c,e){b=!!b;c=!!c;f.repairSonChkDisabled(this.setting,a,b,!!e);f.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,e){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&m(c,this.setting).get(0)&&i.uCanDo(this.setting)){var g=m(c,
+h.id.CHECK,this.setting);(e==!0||this.setting.check.chkStyle===h.radio.STYLE)&&f.checkNodeRelation(this.setting,c);f.setChkClass(this.setting,g,c);f.repairParentChkClassWithSelf(this.setting,c)}}});var t=f.createNodes;f.createNodes=function(c,a,b,d,e){t&&t.apply(f,arguments);b&&f.repairParentChkClassWithSelf(c,d)};var u=f.removeNode;f.removeNode=function(c,a){var b=a.getParentNode();u&&u.apply(f,arguments);a&&b&&(f.repairChkClass(c,b),f.repairParentChkClass(c,b))};var v=f.appendNodes;f.appendNodes=
+function(c,a,b,d,h,g,i){var m="";v&&(m=v.apply(f,arguments));d&&e.makeChkFlag(c,d);return m}})(jQuery);
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.exedit.js b/libs/ztree/3.5.33/js/jquery.ztree.exedit.js
new file mode 100644
index 000000000..46e819fb7
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.exedit.js
@@ -0,0 +1,1195 @@
+/*
+ * JQuery zTree exedit v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function($){
+	//default consts of exedit
+	var _consts = {
+		event: {
+			DRAG: "ztree_drag",
+			DROP: "ztree_drop",
+			RENAME: "ztree_rename",
+			DRAGMOVE:"ztree_dragmove"
+		},
+		id: {
+			EDIT: "_edit",
+			INPUT: "_input",
+			REMOVE: "_remove"
+		},
+		move: {
+			TYPE_INNER: "inner",
+			TYPE_PREV: "prev",
+			TYPE_NEXT: "next"
+		},
+		node: {
+			CURSELECTED_EDIT: "curSelectedNode_Edit",
+			TMPTARGET_TREE: "tmpTargetzTree",
+			TMPTARGET_NODE: "tmpTargetNode"
+		}
+	},
+	//default setting of exedit
+	_setting = {
+		edit: {
+			enable: false,
+			editNameSelectAll: false,
+			showRemoveBtn: true,
+			showRenameBtn: true,
+			removeTitle: "remove",
+			renameTitle: "rename",
+			drag: {
+				autoExpandTrigger: false,
+				isCopy: true,
+				isMove: true,
+				prev: true,
+				next: true,
+				inner: true,
+				minMoveSize: 5,
+				borderMax: 10,
+				borderMin: -5,
+				maxShowNodeNum: 5,
+				autoOpenTime: 500
+			}
+		},
+		view: {
+			addHoverDom: null,
+			removeHoverDom: null
+		},
+		callback: {
+			beforeDrag:null,
+			beforeDragOpen:null,
+			beforeDrop:null,
+			beforeEditName:null,
+			beforeRename:null,
+			onDrag:null,
+			onDragMove:null,
+			onDrop:null,
+			onRename:null
+		}
+	},
+	//default root of exedit
+	_initRoot = function (setting) {
+		var r = data.getRoot(setting), rs = data.getRoots();
+		r.curEditNode = null;
+		r.curEditInput = null;
+		r.curHoverNode = null;
+		r.dragFlag = 0;
+		r.dragNodeShowBefore = [];
+		r.dragMaskList = new Array();
+		rs.showHoverDom = true;
+	},
+	//default cache of exedit
+	_initCache = function(treeId) {},
+	//default bind event of exedit
+	_bindEvent = function(setting) {
+		var o = setting.treeObj;
+		var c = consts.event;
+		o.bind(c.RENAME, function (event, treeId, treeNode, isCancel) {
+			tools.apply(setting.callback.onRename, [event, treeId, treeNode, isCancel]);
+		});
+
+		o.bind(c.DRAG, function (event, srcEvent, treeId, treeNodes) {
+			tools.apply(setting.callback.onDrag, [srcEvent, treeId, treeNodes]);
+		});
+
+		o.bind(c.DRAGMOVE,function(event, srcEvent, treeId, treeNodes){
+			tools.apply(setting.callback.onDragMove,[srcEvent, treeId, treeNodes]);
+		});
+
+		o.bind(c.DROP, function (event, srcEvent, treeId, treeNodes, targetNode, moveType, isCopy) {
+			tools.apply(setting.callback.onDrop, [srcEvent, treeId, treeNodes, targetNode, moveType, isCopy]);
+		});
+	},
+	_unbindEvent = function(setting) {
+		var o = setting.treeObj;
+		var c = consts.event;
+		o.unbind(c.RENAME);
+		o.unbind(c.DRAG);
+		o.unbind(c.DRAGMOVE);
+		o.unbind(c.DROP);
+	},
+	//default event proxy of exedit
+	_eventProxy = function(e) {
+		var target = e.target,
+		setting = data.getSetting(e.data.treeId),
+		relatedTarget = e.relatedTarget,
+		tId = "", node = null,
+		nodeEventType = "", treeEventType = "",
+		nodeEventCallback = null, treeEventCallback = null,
+		tmp = null;
+
+		if (tools.eqs(e.type, "mouseover")) {
+			tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
+			if (tmp) {
+				tId = tools.getNodeMainDom(tmp).id;
+				nodeEventType = "hoverOverNode";
+			}
+		} else if (tools.eqs(e.type, "mouseout")) {
+			tmp = tools.getMDom(setting, relatedTarget, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
+			if (!tmp) {
+				tId = "remove";
+				nodeEventType = "hoverOutNode";
+			}
+		} else if (tools.eqs(e.type, "mousedown")) {
+			tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
+			if (tmp) {
+				tId = tools.getNodeMainDom(tmp).id;
+				nodeEventType = "mousedownNode";
+			}
+		}
+		if (tId.length>0) {
+			node = data.getNodeCache(setting, tId);
+			switch (nodeEventType) {
+				case "mousedownNode" :
+					nodeEventCallback = _handler.onMousedownNode;
+					break;
+				case "hoverOverNode" :
+					nodeEventCallback = _handler.onHoverOverNode;
+					break;
+				case "hoverOutNode" :
+					nodeEventCallback = _handler.onHoverOutNode;
+					break;
+			}
+		}
+		var proxyResult = {
+			stop: false,
+			node: node,
+			nodeEventType: nodeEventType,
+			nodeEventCallback: nodeEventCallback,
+			treeEventType: treeEventType,
+			treeEventCallback: treeEventCallback
+		};
+		return proxyResult
+	},
+	//default init node of exedit
+	_initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
+		if (!n) return;
+		n.isHover = false;
+		n.editNameFlag = false;
+	},
+	//update zTreeObj, add method of edit
+	_zTreeTools = function(setting, zTreeTools) {
+		zTreeTools.cancelEditName = function(newName) {
+			var root = data.getRoot(this.setting);
+			if (!root.curEditNode) return;
+			view.cancelCurEditNode(this.setting, newName?newName:null, true);
+		}
+		zTreeTools.copyNode = function(targetNode, node, moveType, isSilent) {
+			if (!node) return null;
+      var isParent = data.nodeIsParent(setting, targetNode);
+			if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null;
+			var _this = this,
+				newNode = tools.clone(node);
+			if (!targetNode) {
+				targetNode = null;
+				moveType = consts.move.TYPE_INNER;
+			}
+			if (moveType == consts.move.TYPE_INNER) {
+				function copyCallback() {
+					view.addNodes(_this.setting, targetNode, -1, [newNode], isSilent);
+				}
+
+				if (tools.canAsync(this.setting, targetNode)) {
+					view.asyncNode(this.setting, targetNode, isSilent, copyCallback);
+				} else {
+					copyCallback();
+				}
+			} else {
+				view.addNodes(this.setting, targetNode.parentNode, -1, [newNode], isSilent);
+				view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent);
+			}
+			return newNode;
+		}
+		zTreeTools.editName = function(node) {
+			if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return;
+			if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true);
+			view.editNode(this.setting, node)
+		}
+		zTreeTools.moveNode = function(targetNode, node, moveType, isSilent) {
+			if (!node) return node;
+      var isParent = data.nodeIsParent(setting, targetNode);
+			if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) {
+				return null;
+			} else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find("#" + targetNode.tId).length > 0)) {
+				return null;
+			} else if (!targetNode) {
+				targetNode = null;
+			}
+			var _this = this;
+			function moveCallback() {
+				view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent);
+			}
+			if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) {
+				view.asyncNode(this.setting, targetNode, isSilent, moveCallback);
+			} else {
+				moveCallback();
+			}
+			return node;
+		}
+		zTreeTools.setEditable = function(editable) {
+			this.setting.edit.enable = editable;
+			return this.refresh();
+		}
+	},
+	//method of operate data
+	_data = {
+		setSonNodeLevel: function(setting, parentNode, node) {
+			if (!node) return;
+      var children = data.nodeChildren(setting, node);
+			node.level = (parentNode)? parentNode.level + 1 : 0;
+			if (!children) return;
+			for (var i = 0, l = children.length; i < l; i++) {
+				if (children[i]) data.setSonNodeLevel(setting, node, children[i]);
+			}
+		}
+	},
+	//method of event proxy
+	_event = {
+
+	},
+	//method of event handler
+	_handler = {
+		onHoverOverNode: function(event, node) {
+			var setting = data.getSetting(event.data.treeId),
+			root = data.getRoot(setting);
+			if (root.curHoverNode != node) {
+				_handler.onHoverOutNode(event);
+			}
+			root.curHoverNode = node;
+			view.addHoverDom(setting, node);
+		},
+		onHoverOutNode: function(event, node) {
+			var setting = data.getSetting(event.data.treeId),
+			root = data.getRoot(setting);
+			if (root.curHoverNode && !data.isSelectedNode(setting, root.curHoverNode)) {
+				view.removeTreeDom(setting, root.curHoverNode);
+				root.curHoverNode = null;
+			}
+		},
+		onMousedownNode: function(eventMouseDown, _node) {
+			var i,l,
+			setting = data.getSetting(eventMouseDown.data.treeId),
+			root = data.getRoot(setting), roots = data.getRoots();
+			//right click can't drag & drop
+			if (eventMouseDown.button == 2 || !setting.edit.enable || (!setting.edit.drag.isCopy && !setting.edit.drag.isMove)) return true;
+
+			//input of edit node name can't drag & drop
+			var target = eventMouseDown.target,
+			_nodes = data.getRoot(setting).curSelectedList,
+			nodes = [];
+			if (!data.isSelectedNode(setting, _node)) {
+				nodes = [_node];
+			} else {
+				for (i=0, l=_nodes.length; i<l; i++) {
+					if (_nodes[i].editNameFlag && tools.eqs(target.tagName, "input") && target.getAttribute("treeNode"+consts.id.INPUT) !== null) {
+						return true;
+					}
+					nodes.push(_nodes[i]);
+					if (nodes[0].parentTId !== _nodes[i].parentTId) {
+						nodes = [_node];
+						break;
+					}
+				}
+			}
+
+			view.editNodeBlur = true;
+			view.cancelCurEditNode(setting);
+
+			var doc = $(setting.treeObj.get(0).ownerDocument),
+			body = $(setting.treeObj.get(0).ownerDocument.body), curNode, tmpArrow, tmpTarget,
+			isOtherTree = false,
+			targetSetting = setting,
+			sourceSetting = setting,
+			preNode, nextNode,
+			preTmpTargetNodeId = null,
+			preTmpMoveType = null,
+			tmpTargetNodeId = null,
+			moveType = consts.move.TYPE_INNER,
+			mouseDownX = eventMouseDown.clientX,
+			mouseDownY = eventMouseDown.clientY,
+			startTime = (new Date()).getTime();
+
+			if (tools.uCanDo(setting)) {
+				doc.bind("mousemove", _docMouseMove);
+			}
+			function _docMouseMove(event) {
+				//avoid start drag after click node
+				if (root.dragFlag == 0 && Math.abs(mouseDownX - event.clientX) < setting.edit.drag.minMoveSize
+					&& Math.abs(mouseDownY - event.clientY) < setting.edit.drag.minMoveSize) {
+					return true;
+				}
+				var i, l, tmpNode, tmpDom, tmpNodes;
+				body.css("cursor", "pointer");
+
+				if (root.dragFlag == 0) {
+					if (tools.apply(setting.callback.beforeDrag, [setting.treeId, nodes], true) == false) {
+						_docMouseUp(event);
+						return true;
+					}
+
+					for (i=0, l=nodes.length; i<l; i++) {
+						if (i==0) {
+							root.dragNodeShowBefore = [];
+						}
+						tmpNode = nodes[i];
+						if (data.nodeIsParent(setting, tmpNode) && tmpNode.open) {
+							view.expandCollapseNode(setting, tmpNode, !tmpNode.open);
+							root.dragNodeShowBefore[tmpNode.tId] = true;
+						} else {
+							root.dragNodeShowBefore[tmpNode.tId] = false;
+						}
+					}
+
+					root.dragFlag = 1;
+					roots.showHoverDom = false;
+					tools.showIfameMask(setting, true);
+
+					//sort
+					var isOrder = true, lastIndex = -1;
+					if (nodes.length>1) {
+						var pNodes = nodes[0].parentTId ? data.nodeChildren(setting, nodes[0].getParentNode()) : data.getNodes(setting);
+						tmpNodes = [];
+						for (i=0, l=pNodes.length; i<l; i++) {
+							if (root.dragNodeShowBefore[pNodes[i].tId] !== undefined) {
+								if (isOrder && lastIndex > -1 && (lastIndex+1) !== i) {
+									isOrder = false;
+								}
+								tmpNodes.push(pNodes[i]);
+								lastIndex = i;
+							}
+							if (nodes.length === tmpNodes.length) {
+								nodes = tmpNodes;
+								break;
+							}
+						}
+					}
+					if (isOrder) {
+						preNode = nodes[0].getPreNode();
+						nextNode = nodes[nodes.length-1].getNextNode();
+					}
+
+					//set node in selected
+					curNode = $$("<ul class='zTreeDragUL'></ul>", setting);
+					for (i=0, l=nodes.length; i<l; i++) {
+						tmpNode = nodes[i];
+						tmpNode.editNameFlag = false;
+						view.selectNode(setting, tmpNode, i>0);
+						view.removeTreeDom(setting, tmpNode);
+
+						if (i > setting.edit.drag.maxShowNodeNum-1) {
+							continue;
+						}
+
+						tmpDom = $$("<li id='"+ tmpNode.tId +"_tmp'></li>", setting);
+						tmpDom.append($$(tmpNode, consts.id.A, setting).clone());
+						tmpDom.css("padding", "0");
+						tmpDom.children("#" + tmpNode.tId + consts.id.A).removeClass(consts.node.CURSELECTED);
+						curNode.append(tmpDom);
+						if (i == setting.edit.drag.maxShowNodeNum-1) {
+							tmpDom = $$("<li id='"+ tmpNode.tId +"_moretmp'><a>  ...  </a></li>", setting);
+							curNode.append(tmpDom);
+						}
+					}
+					curNode.attr("id", nodes[0].tId + consts.id.UL + "_tmp");
+					curNode.addClass(setting.treeObj.attr("class"));
+					curNode.appendTo(body);
+
+					tmpArrow = $$("<span class='tmpzTreeMove_arrow'></span>", setting);
+					tmpArrow.attr("id", "zTreeMove_arrow_tmp");
+					tmpArrow.appendTo(body);
+
+					setting.treeObj.trigger(consts.event.DRAG, [event, setting.treeId, nodes]);
+				}
+
+				if (root.dragFlag == 1) {
+					if (tmpTarget && tmpArrow.attr("id") == event.target.id && tmpTargetNodeId && (event.clientX + doc.scrollLeft()+2) > ($("#" + tmpTargetNodeId + consts.id.A, tmpTarget).offset().left)) {
+						var xT = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget);
+						event.target = (xT.length > 0) ? xT.get(0) : event.target;
+					} else if (tmpTarget) {
+						tmpTarget.removeClass(consts.node.TMPTARGET_TREE);
+						if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV)
+							.removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER);
+					}
+					tmpTarget = null;
+					tmpTargetNodeId = null;
+
+					//judge drag & drop in multi ztree
+					isOtherTree = false;
+					targetSetting = setting;
+					var settings = data.getSettings();
+					for (var s in settings) {
+						if (settings[s].treeId && settings[s].edit.enable && settings[s].treeId != setting.treeId
+							&& (event.target.id == settings[s].treeId || $(event.target).parents("#" + settings[s].treeId).length>0)) {
+							isOtherTree = true;
+							targetSetting = settings[s];
+						}
+					}
+
+					var docScrollTop = doc.scrollTop(),
+					docScrollLeft = doc.scrollLeft(),
+					treeOffset = targetSetting.treeObj.offset(),
+					scrollHeight = targetSetting.treeObj.get(0).scrollHeight,
+					scrollWidth = targetSetting.treeObj.get(0).scrollWidth,
+					dTop = (event.clientY + docScrollTop - treeOffset.top),
+					dBottom = (targetSetting.treeObj.height() + treeOffset.top - event.clientY - docScrollTop),
+					dLeft = (event.clientX + docScrollLeft - treeOffset.left),
+					dRight = (targetSetting.treeObj.width() + treeOffset.left - event.clientX - docScrollLeft),
+					isTop = (dTop < setting.edit.drag.borderMax && dTop > setting.edit.drag.borderMin),
+					isBottom = (dBottom < setting.edit.drag.borderMax && dBottom > setting.edit.drag.borderMin),
+					isLeft = (dLeft < setting.edit.drag.borderMax && dLeft > setting.edit.drag.borderMin),
+					isRight = (dRight < setting.edit.drag.borderMax && dRight > setting.edit.drag.borderMin),
+					isTreeInner = dTop > setting.edit.drag.borderMin && dBottom > setting.edit.drag.borderMin && dLeft > setting.edit.drag.borderMin && dRight > setting.edit.drag.borderMin,
+					isTreeTop = (isTop && targetSetting.treeObj.scrollTop() <= 0),
+					isTreeBottom = (isBottom && (targetSetting.treeObj.scrollTop() + targetSetting.treeObj.height()+10) >= scrollHeight),
+					isTreeLeft = (isLeft && targetSetting.treeObj.scrollLeft() <= 0),
+					isTreeRight = (isRight && (targetSetting.treeObj.scrollLeft() + targetSetting.treeObj.width()+10) >= scrollWidth);
+
+					if (event.target && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
+						//get node <li> dom
+						var targetObj = event.target;
+						while (targetObj && targetObj.tagName && !tools.eqs(targetObj.tagName, "li") && targetObj.id != targetSetting.treeId) {
+							targetObj = targetObj.parentNode;
+						}
+
+						var canMove = true;
+						//don't move to self or children of self
+						for (i=0, l=nodes.length; i<l; i++) {
+							tmpNode = nodes[i];
+							if (targetObj.id === tmpNode.tId) {
+								canMove = false;
+								break;
+							} else if ($$(tmpNode, setting).find("#" + targetObj.id).length > 0) {
+								canMove = false;
+								break;
+							}
+						}
+						if (canMove && event.target && tools.isChildOrSelf(event.target, targetObj.id + consts.id.A)) {
+							tmpTarget = $(targetObj);
+							tmpTargetNodeId = targetObj.id;
+						}
+					}
+
+					//the mouse must be in zTree
+					tmpNode = nodes[0];
+					if (isTreeInner && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
+						//judge mouse move in root of ztree
+						if (!tmpTarget && (event.target.id == targetSetting.treeId || isTreeTop || isTreeBottom || isTreeLeft || isTreeRight) && (isOtherTree || (!isOtherTree && tmpNode.parentTId))) {
+							tmpTarget = targetSetting.treeObj;
+						}
+						//auto scroll top
+						if (isTop) {
+							targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop()-10);
+						} else if (isBottom)  {
+							targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop()+10);
+						}
+						if (isLeft) {
+							targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()-10);
+						} else if (isRight) {
+							targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()+10);
+						}
+						//auto scroll left
+						if (tmpTarget && tmpTarget != targetSetting.treeObj && tmpTarget.offset().left < targetSetting.treeObj.offset().left) {
+							targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft()+ tmpTarget.offset().left - targetSetting.treeObj.offset().left);
+						}
+					}
+
+					curNode.css({
+						"top": (event.clientY + docScrollTop + 3) + "px",
+						"left": (event.clientX + docScrollLeft + 3) + "px"
+					});
+
+					var dX = 0;
+					var dY = 0;
+					if (tmpTarget && tmpTarget.attr("id")!=targetSetting.treeId) {
+						var tmpTargetNode = tmpTargetNodeId == null ? null: data.getNodeCache(targetSetting, tmpTargetNodeId),
+							isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy),
+							isPrev = !!(preNode && tmpTargetNodeId === preNode.tId),
+							isNext = !!(nextNode && tmpTargetNodeId === nextNode.tId),
+							isInner = (tmpNode.parentTId && tmpNode.parentTId == tmpTargetNodeId),
+							canPrev = (isCopy || !isNext) && tools.apply(targetSetting.edit.drag.prev, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.prev),
+							canNext = (isCopy || !isPrev) && tools.apply(targetSetting.edit.drag.next, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.next),
+							canInner = (isCopy || !isInner) && !(targetSetting.data.keep.leaf && !data.nodeIsParent(setting, tmpTargetNode)) && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.inner);
+
+						function clearMove() {
+							tmpTarget = null;
+							tmpTargetNodeId = "";
+							moveType = consts.move.TYPE_INNER;
+							tmpArrow.css({
+								"display":"none"
+							});
+							if (window.zTreeMoveTimer) {
+								clearTimeout(window.zTreeMoveTimer);
+								window.zTreeMoveTargetNodeTId = null
+							}
+						}
+						if (!canPrev && !canNext && !canInner) {
+							clearMove();
+						} else {
+							var tmpTargetA = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget),
+								tmpNextA = tmpTargetNode.isLastNode ? null : $("#" + tmpTargetNode.getNextNode().tId + consts.id.A, tmpTarget.next()),
+								tmpTop = tmpTargetA.offset().top,
+								tmpLeft = tmpTargetA.offset().left,
+								prevPercent = canPrev ? (canInner ? 0.25 : (canNext ? 0.5 : 1) ) : -1,
+								nextPercent = canNext ? (canInner ? 0.75 : (canPrev ? 0.5 : 0) ) : -1,
+								dY_percent = (event.clientY + docScrollTop - tmpTop)/tmpTargetA.height();
+
+							if ((prevPercent==1 || dY_percent<=prevPercent && dY_percent>=-.2) && canPrev) {
+								dX = 1 - tmpArrow.width();
+								dY = tmpTop - tmpArrow.height()/2;
+								moveType = consts.move.TYPE_PREV;
+							} else if ((nextPercent==0 || dY_percent>=nextPercent && dY_percent<=1.2) && canNext) {
+								dX = 1 - tmpArrow.width();
+								dY = (tmpNextA == null || (data.nodeIsParent(setting, tmpTargetNode) && tmpTargetNode.open)) ? (tmpTop + tmpTargetA.height() - tmpArrow.height()/2) : (tmpNextA.offset().top - tmpArrow.height()/2);
+								moveType = consts.move.TYPE_NEXT;
+							} else if (canInner) {
+								dX = 5 - tmpArrow.width();
+								dY = tmpTop;
+								moveType = consts.move.TYPE_INNER;
+							} else {
+								clearMove();
+							}
+
+							if (tmpTarget) {
+								tmpArrow.css({
+									"display":"block",
+									"top": dY + "px",
+									"left": (tmpLeft + dX) + "px"
+								});
+								tmpTargetA.addClass(consts.node.TMPTARGET_NODE + "_" + moveType);
+
+								if (preTmpTargetNodeId != tmpTargetNodeId || preTmpMoveType != moveType) {
+									startTime = (new Date()).getTime();
+								}
+								if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && moveType == consts.move.TYPE_INNER) {
+									var startTimer = true;
+									if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId !== tmpTargetNode.tId) {
+										clearTimeout(window.zTreeMoveTimer);
+										window.zTreeMoveTargetNodeTId = null;
+									} else if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId === tmpTargetNode.tId) {
+										startTimer = false;
+									}
+									if (startTimer) {
+										window.zTreeMoveTimer = setTimeout(function() {
+											if (moveType != consts.move.TYPE_INNER) return;
+											if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && !tmpTargetNode.open && (new Date()).getTime() - startTime > targetSetting.edit.drag.autoOpenTime
+												&& tools.apply(targetSetting.callback.beforeDragOpen, [targetSetting.treeId, tmpTargetNode], true)) {
+												view.switchNode(targetSetting, tmpTargetNode);
+												if (targetSetting.edit.drag.autoExpandTrigger) {
+													targetSetting.treeObj.trigger(consts.event.EXPAND, [targetSetting.treeId, tmpTargetNode]);
+												}
+											}
+										}, targetSetting.edit.drag.autoOpenTime+50);
+										window.zTreeMoveTargetNodeTId = tmpTargetNode.tId;
+									}
+								}
+							}
+						}
+					} else {
+						moveType = consts.move.TYPE_INNER;
+						if (tmpTarget && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, null], !!targetSetting.edit.drag.inner)) {
+							tmpTarget.addClass(consts.node.TMPTARGET_TREE);
+						} else {
+							tmpTarget = null;
+						}
+						tmpArrow.css({
+							"display":"none"
+						});
+						if (window.zTreeMoveTimer) {
+							clearTimeout(window.zTreeMoveTimer);
+							window.zTreeMoveTargetNodeTId = null;
+						}
+					}
+					preTmpTargetNodeId = tmpTargetNodeId;
+					preTmpMoveType = moveType;
+
+					setting.treeObj.trigger(consts.event.DRAGMOVE, [event, setting.treeId, nodes]);
+				}
+				return false;
+			}
+
+			doc.bind("mouseup", _docMouseUp);
+			function _docMouseUp(event) {
+				if (window.zTreeMoveTimer) {
+					clearTimeout(window.zTreeMoveTimer);
+					window.zTreeMoveTargetNodeTId = null;
+				}
+				preTmpTargetNodeId = null;
+				preTmpMoveType = null;
+				doc.unbind("mousemove", _docMouseMove);
+				doc.unbind("mouseup", _docMouseUp);
+				doc.unbind("selectstart", _docSelect);
+				body.css("cursor", "");
+				if (tmpTarget) {
+					tmpTarget.removeClass(consts.node.TMPTARGET_TREE);
+					if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV)
+							.removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER);
+				}
+				tools.showIfameMask(setting, false);
+
+				roots.showHoverDom = true;
+				if (root.dragFlag == 0) return;
+				root.dragFlag = 0;
+
+				var i, l, tmpNode;
+				for (i=0, l=nodes.length; i<l; i++) {
+					tmpNode = nodes[i];
+					if (data.nodeIsParent(setting, tmpNode) && root.dragNodeShowBefore[tmpNode.tId] && !tmpNode.open) {
+						view.expandCollapseNode(setting, tmpNode, !tmpNode.open);
+						delete root.dragNodeShowBefore[tmpNode.tId];
+					}
+				}
+
+				if (curNode) curNode.remove();
+				if (tmpArrow) tmpArrow.remove();
+
+				var isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy);
+				if (!isCopy && tmpTarget && tmpTargetNodeId && nodes[0].parentTId && tmpTargetNodeId==nodes[0].parentTId && moveType == consts.move.TYPE_INNER) {
+					tmpTarget = null;
+				}
+				if (tmpTarget) {
+					var dragTargetNode = tmpTargetNodeId == null ? null: data.getNodeCache(targetSetting, tmpTargetNodeId);
+					if (tools.apply(setting.callback.beforeDrop, [targetSetting.treeId, nodes, dragTargetNode, moveType, isCopy], true) == false) {
+						view.selectNodes(sourceSetting, nodes);
+						return;
+					}
+					var newNodes = isCopy ? tools.clone(nodes) : nodes;
+
+					function dropCallback() {
+						if (isOtherTree) {
+							if (!isCopy) {
+								for(var i=0, l=nodes.length; i<l; i++) {
+									view.removeNode(setting, nodes[i]);
+								}
+							}
+							if (moveType == consts.move.TYPE_INNER) {
+								view.addNodes(targetSetting, dragTargetNode, -1, newNodes);
+							} else {
+								view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex()+1, newNodes);
+							}
+						} else {
+							if (isCopy && moveType == consts.move.TYPE_INNER) {
+								view.addNodes(targetSetting, dragTargetNode, -1, newNodes);
+							} else if (isCopy) {
+								view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex()+1, newNodes);
+							} else {
+								if (moveType != consts.move.TYPE_NEXT) {
+									for (i=0, l=newNodes.length; i<l; i++) {
+										view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false);
+									}
+								} else {
+									for (i=-1, l=newNodes.length-1; i<l; l--) {
+										view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false);
+									}
+								}
+							}
+						}
+						view.selectNodes(targetSetting, newNodes);
+
+						var a = $$(newNodes[0], setting).get(0);
+						view.scrollIntoView(setting, a);
+
+						setting.treeObj.trigger(consts.event.DROP, [event, targetSetting.treeId, newNodes, dragTargetNode, moveType, isCopy]);
+					}
+
+					if (moveType == consts.move.TYPE_INNER && tools.canAsync(targetSetting, dragTargetNode)) {
+						view.asyncNode(targetSetting, dragTargetNode, false, dropCallback);
+					} else {
+						dropCallback();
+					}
+
+				} else {
+					view.selectNodes(sourceSetting, nodes);
+					setting.treeObj.trigger(consts.event.DROP, [event, setting.treeId, nodes, null, null, null]);
+				}
+			}
+
+			doc.bind("selectstart", _docSelect);
+			function _docSelect() {
+				return false;
+			}
+
+			//Avoid FireFox's Bug
+			//If zTree Div CSS set 'overflow', so drag node outside of zTree, and event.target is error.
+			if(eventMouseDown.preventDefault) {
+				eventMouseDown.preventDefault();
+			}
+			return true;
+		}
+	},
+	//method of tools for zTree
+	_tools = {
+		getAbs: function (obj) {
+			var oRect = obj.getBoundingClientRect(),
+			scrollTop = document.body.scrollTop+document.documentElement.scrollTop,
+			scrollLeft = document.body.scrollLeft+document.documentElement.scrollLeft;
+			return [oRect.left+scrollLeft,oRect.top+scrollTop];
+		},
+		inputFocus: function(inputObj) {
+			if (inputObj.get(0)) {
+				inputObj.focus();
+				tools.setCursorPosition(inputObj.get(0), inputObj.val().length);
+			}
+		},
+		inputSelect: function(inputObj) {
+			if (inputObj.get(0)) {
+				inputObj.focus();
+				inputObj.select();
+			}
+		},
+		setCursorPosition: function(obj, pos){
+			if(obj.setSelectionRange) {
+				obj.focus();
+				obj.setSelectionRange(pos,pos);
+			} else if (obj.createTextRange) {
+				var range = obj.createTextRange();
+				range.collapse(true);
+				range.moveEnd('character', pos);
+				range.moveStart('character', pos);
+				range.select();
+			}
+		},
+		showIfameMask: function(setting, showSign) {
+			var root = data.getRoot(setting);
+			//clear full mask
+			while (root.dragMaskList.length > 0) {
+				root.dragMaskList[0].remove();
+				root.dragMaskList.shift();
+			}
+			if (showSign) {
+				//show mask
+				var iframeList = $$("iframe", setting);
+				for (var i = 0, l = iframeList.length; i < l; i++) {
+					var obj = iframeList.get(i),
+					r = tools.getAbs(obj),
+					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);
+					dragMask.appendTo($$("body", setting));
+					root.dragMaskList.push(dragMask);
+				}
+			}
+		}
+	},
+	//method of operate ztree dom
+	_view = {
+		addEditBtn: function(setting, node) {
+			if (node.editNameFlag || $$(node, consts.id.EDIT, setting).length > 0) {
+				return;
+			}
+			if (!tools.apply(setting.edit.showRenameBtn, [setting.treeId, node], setting.edit.showRenameBtn)) {
+				return;
+			}
+			var aObj = $$(node, consts.id.A, setting),
+			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>";
+			aObj.append(editStr);
+
+			$$(node, consts.id.EDIT, setting).bind('click',
+				function() {
+					if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeEditName, [setting.treeId, node], true) == false) return false;
+					view.editNode(setting, node);
+					return false;
+				}
+				).show();
+		},
+		addRemoveBtn: function(setting, node) {
+			if (node.editNameFlag || $$(node, consts.id.REMOVE, setting).length > 0) {
+				return;
+			}
+			if (!tools.apply(setting.edit.showRemoveBtn, [setting.treeId, node], setting.edit.showRemoveBtn)) {
+				return;
+			}
+			var aObj = $$(node, consts.id.A, setting),
+			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>";
+			aObj.append(removeStr);
+
+			$$(node, consts.id.REMOVE, setting).bind('click',
+				function() {
+					if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return false;
+					view.removeNode(setting, node);
+					setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]);
+					return false;
+				}
+				).bind('mousedown',
+				function(eventMouseDown) {
+					return true;
+				}
+				).show();
+		},
+		addHoverDom: function(setting, node) {
+			if (data.getRoots().showHoverDom) {
+				node.isHover = true;
+				if (setting.edit.enable) {
+					view.addEditBtn(setting, node);
+					view.addRemoveBtn(setting, node);
+				}
+				tools.apply(setting.view.addHoverDom, [setting.treeId, node]);
+			}
+		},
+		cancelCurEditNode: function (setting, forceName, isCancel) {
+			var root = data.getRoot(setting),
+			node = root.curEditNode;
+
+			if (node) {
+				var inputObj = root.curEditInput,
+				newName = forceName ? forceName:(isCancel ? data.nodeName(setting, node): inputObj.val());
+				if (tools.apply(setting.callback.beforeRename, [setting.treeId, node, newName, isCancel], true) === false) {
+					return false;
+				}
+        data.nodeName(setting, node, newName);
+				var aObj = $$(node, consts.id.A, setting);
+				aObj.removeClass(consts.node.CURSELECTED_EDIT);
+				inputObj.unbind();
+				view.setNodeName(setting, node);
+				node.editNameFlag = false;
+				root.curEditNode = null;
+				root.curEditInput = null;
+				view.selectNode(setting, node, false);
+				setting.treeObj.trigger(consts.event.RENAME, [setting.treeId, node, isCancel]);
+			}
+			root.noSelection = true;
+			return true;
+		},
+		editNode: function(setting, node) {
+			var root = data.getRoot(setting);
+			view.editNodeBlur = false;
+			if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
+				setTimeout(function() {tools.inputFocus(root.curEditInput);}, 0);
+				return;
+			}
+			node.editNameFlag = true;
+			view.removeTreeDom(setting, node);
+			view.cancelCurEditNode(setting);
+			view.selectNode(setting, node, false);
+			$$(node, consts.id.SPAN, setting).html("<input type=text class='rename' id='" + node.tId + consts.id.INPUT + "' treeNode" + consts.id.INPUT + " >");
+			var inputObj = $$(node, consts.id.INPUT, setting);
+			inputObj.attr("value", data.nodeName(setting, node));
+			if (setting.edit.editNameSelectAll) {
+				tools.inputSelect(inputObj);
+			} else {
+				tools.inputFocus(inputObj);
+			}
+
+			inputObj.bind('blur', function(event) {
+				if (!view.editNodeBlur) {
+					view.cancelCurEditNode(setting);
+				}
+			}).bind('keydown', function(event) {
+				if (event.keyCode=="13") {
+					view.editNodeBlur = true;
+					view.cancelCurEditNode(setting);
+				} else if (event.keyCode=="27") {
+					view.cancelCurEditNode(setting, null, true);
+				}
+			}).bind('click', function(event) {
+				return false;
+			}).bind('dblclick', function(event) {
+				return false;
+			});
+
+			$$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED_EDIT);
+			root.curEditInput = inputObj;
+			root.noSelection = false;
+			root.curEditNode = node;
+		},
+		moveNode: function(setting, targetNode, node, moveType, animateFlag, isSilent) {
+			var root = data.getRoot(setting);
+			if (targetNode == node) return;
+			if (setting.data.keep.leaf && targetNode && !data.nodeIsParent(setting, targetNode) && moveType == consts.move.TYPE_INNER) return;
+			var oldParentNode = (node.parentTId ? node.getParentNode(): root),
+			targetNodeIsRoot = (targetNode === null || targetNode == root);
+			if (targetNodeIsRoot && targetNode === null) targetNode = root;
+			if (targetNodeIsRoot) moveType = consts.move.TYPE_INNER;
+			var targetParentNode = (targetNode.parentTId ? targetNode.getParentNode() : root);
+
+			if (moveType != consts.move.TYPE_PREV && moveType != consts.move.TYPE_NEXT) {
+				moveType = consts.move.TYPE_INNER;
+			}
+
+			if (moveType == consts.move.TYPE_INNER) {
+				if (targetNodeIsRoot) {
+					//parentTId of root node is null
+					node.parentTId = null;
+				} else {
+					if (!data.nodeIsParent(setting, targetNode)) {
+            data.nodeIsParent(setting, targetNode, true);
+						targetNode.open = !!targetNode.open;
+						view.setNodeLineIcos(setting, targetNode);
+					}
+					node.parentTId = targetNode.tId;
+				}
+			}
+
+			//move node Dom
+			var targetObj, target_ulObj;
+			if (targetNodeIsRoot) {
+				targetObj = setting.treeObj;
+				target_ulObj = targetObj;
+			} else {
+				if (!isSilent && moveType == consts.move.TYPE_INNER) {
+					view.expandCollapseNode(setting, targetNode, true, false);
+				} else if (!isSilent) {
+					view.expandCollapseNode(setting, targetNode.getParentNode(), true, false);
+				}
+				targetObj = $$(targetNode, setting);
+				target_ulObj = $$(targetNode, consts.id.UL, setting);
+				if (!!targetObj.get(0) && !target_ulObj.get(0)) {
+					var ulstr = [];
+					view.makeUlHtml(setting, targetNode, ulstr, '');
+					targetObj.append(ulstr.join(''));
+				}
+				target_ulObj = $$(targetNode, consts.id.UL, setting);
+			}
+			var nodeDom = $$(node, setting);
+			if (!nodeDom.get(0)) {
+				nodeDom = view.appendNodes(setting, node.level, [node], null, -1, false, true).join('');
+			} else if (!targetObj.get(0)) {
+				nodeDom.remove();
+			}
+			if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) {
+				target_ulObj.append(nodeDom);
+			} else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) {
+				targetObj.before(nodeDom);
+			} else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) {
+				targetObj.after(nodeDom);
+			}
+
+			//repair the data after move
+			var i,l,
+			tmpSrcIndex = -1,
+			tmpTargetIndex = 0,
+			oldNeighbor = null,
+			newNeighbor = null,
+			oldLevel = node.level;
+			var oldChildren = data.nodeChildren(setting, oldParentNode);
+			var targetParentChildren = data.nodeChildren(setting, targetParentNode);
+			var targetChildren = data.nodeChildren(setting, targetNode);
+			if (node.isFirstNode) {
+				tmpSrcIndex = 0;
+				if (oldChildren.length > 1 ) {
+					oldNeighbor = oldChildren[1];
+					oldNeighbor.isFirstNode = true;
+				}
+			} else if (node.isLastNode) {
+				tmpSrcIndex = oldChildren.length -1;
+				oldNeighbor = oldChildren[tmpSrcIndex - 1];
+				oldNeighbor.isLastNode = true;
+			} else {
+				for (i = 0, l = oldChildren.length; i < l; i++) {
+					if (oldChildren[i].tId == node.tId) {
+						tmpSrcIndex = i;
+						break;
+					}
+				}
+			}
+			if (tmpSrcIndex >= 0) {
+				oldChildren.splice(tmpSrcIndex, 1);
+			}
+			if (moveType != consts.move.TYPE_INNER) {
+				for (i = 0, l = targetParentChildren.length; i < l; i++) {
+					if (targetParentChildren[i].tId == targetNode.tId) tmpTargetIndex = i;
+				}
+			}
+			if (moveType == consts.move.TYPE_INNER) {
+				if (!targetChildren) {
+          targetChildren = data.nodeChildren(setting, targetNode, []);
+        }
+				if (targetChildren.length > 0) {
+					newNeighbor = targetChildren[targetChildren.length - 1];
+					newNeighbor.isLastNode = false;
+				}
+				targetChildren.splice(targetChildren.length, 0, node);
+				node.isLastNode = true;
+				node.isFirstNode = (targetChildren.length == 1);
+			} else if (targetNode.isFirstNode && moveType == consts.move.TYPE_PREV) {
+				targetParentChildren.splice(tmpTargetIndex, 0, node);
+				newNeighbor = targetNode;
+				newNeighbor.isFirstNode = false;
+				node.parentTId = targetNode.parentTId;
+				node.isFirstNode = true;
+				node.isLastNode = false;
+
+			} else if (targetNode.isLastNode && moveType == consts.move.TYPE_NEXT) {
+				targetParentChildren.splice(tmpTargetIndex + 1, 0, node);
+				newNeighbor = targetNode;
+				newNeighbor.isLastNode = false;
+				node.parentTId = targetNode.parentTId;
+				node.isFirstNode = false;
+				node.isLastNode = true;
+
+			} else {
+				if (moveType == consts.move.TYPE_PREV) {
+					targetParentChildren.splice(tmpTargetIndex, 0, node);
+				} else {
+					targetParentChildren.splice(tmpTargetIndex + 1, 0, node);
+				}
+				node.parentTId = targetNode.parentTId;
+				node.isFirstNode = false;
+				node.isLastNode = false;
+			}
+			data.fixPIdKeyValue(setting, node);
+			data.setSonNodeLevel(setting, node.getParentNode(), node);
+
+			//repair node what been moved
+			view.setNodeLineIcos(setting, node);
+			view.repairNodeLevelClass(setting, node, oldLevel);
+
+			//repair node's old parentNode dom
+			if (!setting.data.keep.parent && oldChildren.length < 1) {
+				//old parentNode has no child nodes
+        data.nodeIsParent(setting, oldParentNode, false);
+				oldParentNode.open = false;
+				var tmp_ulObj = $$(oldParentNode, consts.id.UL, setting),
+				tmp_switchObj = $$(oldParentNode, consts.id.SWITCH, setting),
+				tmp_icoObj = $$(oldParentNode, consts.id.ICON, setting);
+				view.replaceSwitchClass(oldParentNode, tmp_switchObj, consts.folder.DOCU);
+				view.replaceIcoClass(oldParentNode, tmp_icoObj, consts.folder.DOCU);
+				tmp_ulObj.css("display", "none");
+
+			} else if (oldNeighbor) {
+				//old neigbor node
+				view.setNodeLineIcos(setting, oldNeighbor);
+			}
+
+			//new neigbor node
+			if (newNeighbor) {
+				view.setNodeLineIcos(setting, newNeighbor);
+			}
+
+			//repair checkbox / radio
+			if (!!setting.check && setting.check.enable && view.repairChkClass) {
+				view.repairChkClass(setting, oldParentNode);
+				view.repairParentChkClassWithSelf(setting, oldParentNode);
+				if (oldParentNode != node.parent)
+					view.repairParentChkClassWithSelf(setting, node);
+			}
+
+			//expand parents after move
+			if (!isSilent) {
+				view.expandCollapseParentNode(setting, node.getParentNode(), true, animateFlag);
+			}
+		},
+		removeEditBtn: function(setting, node) {
+			$$(node, consts.id.EDIT, setting).unbind().remove();
+		},
+		removeRemoveBtn: function(setting, node) {
+			$$(node, consts.id.REMOVE, setting).unbind().remove();
+		},
+		removeTreeDom: function(setting, node) {
+			node.isHover = false;
+			view.removeEditBtn(setting, node);
+			view.removeRemoveBtn(setting, node);
+			tools.apply(setting.view.removeHoverDom, [setting.treeId, node]);
+		},
+		repairNodeLevelClass: function(setting, node, oldLevel) {
+			if (oldLevel === node.level) return;
+			var liObj = $$(node, setting),
+			aObj = $$(node, consts.id.A, setting),
+			ulObj = $$(node, consts.id.UL, setting),
+			oldClass = consts.className.LEVEL + oldLevel,
+			newClass = consts.className.LEVEL + node.level;
+			liObj.removeClass(oldClass);
+			liObj.addClass(newClass);
+			aObj.removeClass(oldClass);
+			aObj.addClass(newClass);
+			ulObj.removeClass(oldClass);
+			ulObj.addClass(newClass);
+		},
+		selectNodes : function(setting, nodes) {
+			for (var i=0, l=nodes.length; i<l; i++) {
+				view.selectNode(setting, nodes[i], i>0);
+			}
+		}
+	},
+
+	_z = {
+		tools: _tools,
+		view: _view,
+		event: _event,
+		data: _data
+	};
+	$.extend(true, $.fn.zTree.consts, _consts);
+	$.extend(true, $.fn.zTree._z, _z);
+
+	var zt = $.fn.zTree,
+	tools = zt._z.tools,
+	consts = zt.consts,
+	view = zt._z.view,
+	data = zt._z.data,
+	event = zt._z.event,
+	$$ = tools.$;
+
+	data.exSetting(_setting);
+	data.addInitBind(_bindEvent);
+	data.addInitUnBind(_unbindEvent);
+	data.addInitCache(_initCache);
+	data.addInitNode(_initNode);
+	data.addInitProxy(_eventProxy);
+	data.addInitRoot(_initRoot);
+	data.addZTreeTools(_zTreeTools);
+
+	var _cancelPreSelectedNode = view.cancelPreSelectedNode;
+	view.cancelPreSelectedNode = function (setting, node) {
+		var list = data.getRoot(setting).curSelectedList;
+		for (var i=0, j=list.length; i<j; i++) {
+			if (!node || node === list[i]) {
+				view.removeTreeDom(setting, list[i]);
+				if (node) break;
+			}
+		}
+		if (_cancelPreSelectedNode) _cancelPreSelectedNode.apply(view, arguments);
+	}
+
+	var _createNodes = view.createNodes;
+	view.createNodes = function(setting, level, nodes, parentNode, index) {
+		if (_createNodes) {
+			_createNodes.apply(view, arguments);
+		}
+		if (!nodes) return;
+		if (view.repairParentChkClassWithSelf) {
+			view.repairParentChkClassWithSelf(setting, parentNode);
+		}
+	}
+
+	var _makeNodeUrl = view.makeNodeUrl;
+	view.makeNodeUrl = function(setting, node) {
+		return setting.edit.enable ? null : (_makeNodeUrl.apply(view, arguments));
+	}
+
+	var _removeNode = view.removeNode;
+	view.removeNode = function(setting, node) {
+		var root = data.getRoot(setting);
+		if (root.curEditNode === node) root.curEditNode = null;
+		if (_removeNode) {
+			_removeNode.apply(view, arguments);
+		}
+	}
+
+	var _selectNode = view.selectNode;
+	view.selectNode = function(setting, node, addFlag) {
+		var root = data.getRoot(setting);
+		if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
+			return false;
+		}
+		if (_selectNode) _selectNode.apply(view, arguments);
+		view.addHoverDom(setting, node);
+		return true;
+	}
+
+	var _uCanDo = tools.uCanDo;
+	tools.uCanDo = function(setting, e) {
+		var root = data.getRoot(setting);
+		if (e && (tools.eqs(e.type, "mouseover") || tools.eqs(e.type, "mouseout") || tools.eqs(e.type, "mousedown") || tools.eqs(e.type, "mouseup"))) {
+			return true;
+		}
+		if (root.curEditNode) {
+			view.editNodeBlur = false;
+			root.curEditInput.focus();
+		}
+		return (!root.curEditNode) && (_uCanDo ? _uCanDo.apply(view, arguments) : true);
+	}
+})(jQuery);
\ No newline at end of file
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.exedit.min.js b/libs/ztree/3.5.33/js/jquery.ztree.exedit.min.js
new file mode 100644
index 000000000..fee55f088
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.exedit.min.js
@@ -0,0 +1,53 @@
+/*
+ * JQuery zTree exedit v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function(B){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},v={onHoverOverNode:function(a,b){var c=i.getSetting(a.data.treeId),d=i.getRoot(c);if(d.curHoverNode!=b)v.onHoverOutNode(a);d.curHoverNode=b;e.addHoverDom(c,b)},onHoverOutNode:function(a){var a=
+i.getSetting(a.data.treeId),b=i.getRoot(a);if(b.curHoverNode&&!i.isSelectedNode(a,b.curHoverNode))e.removeTreeDom(a,b.curHoverNode),b.curHoverNode=null},onMousedownNode:function(a,b){function c(a){if(m.dragFlag==0&&Math.abs(N-a.clientX)<f.edit.drag.minMoveSize&&Math.abs(O-a.clientY)<f.edit.drag.minMoveSize)return!0;var b,c,g,j;L.css("cursor","pointer");if(m.dragFlag==0){if(k.apply(f.callback.beforeDrag,[f.treeId,n],!0)==!1)return l(a),!0;for(b=0,c=n.length;b<c;b++){if(b==0)m.dragNodeShowBefore=[];
+g=n[b];i.nodeIsParent(f,g)&&g.open?(e.expandCollapseNode(f,g,!g.open),m.dragNodeShowBefore[g.tId]=!0):m.dragNodeShowBefore[g.tId]=!1}m.dragFlag=1;y.showHoverDom=!1;k.showIfameMask(f,!0);j=!0;var p=-1;if(n.length>1){var o=n[0].parentTId?i.nodeChildren(f,n[0].getParentNode()):i.getNodes(f);g=[];for(b=0,c=o.length;b<c;b++)if(m.dragNodeShowBefore[o[b].tId]!==void 0&&(j&&p>-1&&p+1!==b&&(j=!1),g.push(o[b]),p=b),n.length===g.length){n=g;break}}j&&(H=n[0].getPreNode(),Q=n[n.length-1].getNextNode());C=q("<ul class='zTreeDragUL'></ul>",
+f);for(b=0,c=n.length;b<c;b++)g=n[b],g.editNameFlag=!1,e.selectNode(f,g,b>0),e.removeTreeDom(f,g),b>f.edit.drag.maxShowNodeNum-1||(j=q("<li id='"+g.tId+"_tmp'></li>",f),j.append(q(g,d.id.A,f).clone()),j.css("padding","0"),j.children("#"+g.tId+d.id.A).removeClass(d.node.CURSELECTED),C.append(j),b==f.edit.drag.maxShowNodeNum-1&&(j=q("<li id='"+g.tId+"_moretmp'><a>  ...  </a></li>",f),C.append(j)));C.attr("id",n[0].tId+d.id.UL+"_tmp");C.addClass(f.treeObj.attr("class"));C.appendTo(L);u=q("<span class='tmpzTreeMove_arrow'></span>",
+f);u.attr("id","zTreeMove_arrow_tmp");u.appendTo(L);f.treeObj.trigger(d.event.DRAG,[a,f.treeId,n])}if(m.dragFlag==1){t&&u.attr("id")==a.target.id&&w&&a.clientX+G.scrollLeft()+2>B("#"+w+d.id.A,t).offset().left?(g=B("#"+w+d.id.A,t),a.target=g.length>0?g.get(0):a.target):t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));
+w=t=null;J=!1;h=f;g=i.getSettings();for(var z in g)if(g[z].treeId&&g[z].edit.enable&&g[z].treeId!=f.treeId&&(a.target.id==g[z].treeId||B(a.target).parents("#"+g[z].treeId).length>0))J=!0,h=g[z];z=G.scrollTop();j=G.scrollLeft();p=h.treeObj.offset();b=h.treeObj.get(0).scrollHeight;g=h.treeObj.get(0).scrollWidth;c=a.clientY+z-p.top;var E=h.treeObj.height()+p.top-a.clientY-z,r=a.clientX+j-p.left,s=h.treeObj.width()+p.left-a.clientX-j,p=c<f.edit.drag.borderMax&&c>f.edit.drag.borderMin,o=E<f.edit.drag.borderMax&&
+E>f.edit.drag.borderMin,F=r<f.edit.drag.borderMax&&r>f.edit.drag.borderMin,v=s<f.edit.drag.borderMax&&s>f.edit.drag.borderMin,E=c>f.edit.drag.borderMin&&E>f.edit.drag.borderMin&&r>f.edit.drag.borderMin&&s>f.edit.drag.borderMin,r=p&&h.treeObj.scrollTop()<=0,s=o&&h.treeObj.scrollTop()+h.treeObj.height()+10>=b,M=F&&h.treeObj.scrollLeft()<=0,P=v&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=g;if(a.target&&k.isChildOrSelf(a.target,h.treeId)){for(var D=a.target;D&&D.tagName&&!k.eqs(D.tagName,"li")&&D.id!=
+h.treeId;)D=D.parentNode;var R=!0;for(b=0,c=n.length;b<c;b++)if(g=n[b],D.id===g.tId){R=!1;break}else if(q(g,f).find("#"+D.id).length>0){R=!1;break}if(R&&a.target&&k.isChildOrSelf(a.target,D.id+d.id.A))t=B(D),w=D.id}g=n[0];if(E&&k.isChildOrSelf(a.target,h.treeId)){if(!t&&(a.target.id==h.treeId||r||s||M||P)&&(J||!J&&g.parentTId))t=h.treeObj;p?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):o&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);F?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):v&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+
+10);t&&t!=h.treeObj&&t.offset().left<h.treeObj.offset().left&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+t.offset().left-h.treeObj.offset().left)}C.css({top:a.clientY+z+3+"px",left:a.clientX+j+3+"px"});b=j=0;if(t&&t.attr("id")!=h.treeId){var A=w==null?null:i.getNodeCache(h,w),p=(a.ctrlKey||a.metaKey)&&f.edit.drag.isMove&&f.edit.drag.isCopy||!f.edit.drag.isMove&&f.edit.drag.isCopy;c=!!(H&&w===H.tId);F=!!(Q&&w===Q.tId);o=g.parentTId&&g.parentTId==w;g=(p||!F)&&k.apply(h.edit.drag.prev,[h.treeId,n,A],
+!!h.edit.drag.prev);c=(p||!c)&&k.apply(h.edit.drag.next,[h.treeId,n,A],!!h.edit.drag.next);p=(p||!o)&&!(h.data.keep.leaf&&!i.nodeIsParent(f,A))&&k.apply(h.edit.drag.inner,[h.treeId,n,A],!!h.edit.drag.inner);o=function(){t=null;w="";x=d.move.TYPE_INNER;u.css({display:"none"});if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null};if(!g&&!c&&!p)o();else if(F=B("#"+w+d.id.A,t),v=A.isLastNode?null:B("#"+A.getNextNode().tId+d.id.A,t.next()),E=F.offset().top,r=
+F.offset().left,s=g?p?0.25:c?0.5:1:-1,M=c?p?0.75:g?0.5:0:-1,z=(a.clientY+z-E)/F.height(),(s==1||z<=s&&z>=-0.2)&&g?(j=1-u.width(),b=E-u.height()/2,x=d.move.TYPE_PREV):(M==0||z>=M&&z<=1.2)&&c?(j=1-u.width(),b=v==null||i.nodeIsParent(f,A)&&A.open?E+F.height()-u.height()/2:v.offset().top-u.height()/2,x=d.move.TYPE_NEXT):p?(j=5-u.width(),b=E,x=d.move.TYPE_INNER):o(),t){u.css({display:"block",top:b+"px",left:r+j+"px"});F.addClass(d.node.TMPTARGET_NODE+"_"+x);if(S!=w||T!=x)K=(new Date).getTime();if(A&&i.nodeIsParent(f,
+A)&&x==d.move.TYPE_INNER&&(z=!0,window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId!==A.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===A.tId&&(z=!1),z))window.zTreeMoveTimer=setTimeout(function(){x==d.move.TYPE_INNER&&A&&i.nodeIsParent(f,A)&&!A.open&&(new Date).getTime()-K>h.edit.drag.autoOpenTime&&k.apply(h.callback.beforeDragOpen,[h.treeId,A],!0)&&(e.switchNode(h,A),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND,
+[h.treeId,A]))},h.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=A.tId}}else if(x=d.move.TYPE_INNER,t&&k.apply(h.edit.drag.inner,[h.treeId,n,null],!!h.edit.drag.inner)?t.addClass(d.node.TMPTARGET_TREE):t=null,u.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;S=w;T=x;f.treeObj.trigger(d.event.DRAGMOVE,[a,f.treeId,n])}return!1}function l(a){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=
+null;T=S=null;G.unbind("mousemove",c);G.unbind("mouseup",l);G.unbind("selectstart",g);L.css("cursor","");t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));k.showIfameMask(f,!1);y.showHoverDom=!0;if(m.dragFlag!=0){m.dragFlag=0;var b,j,o;for(b=0,j=n.length;b<j;b++)o=n[b],i.nodeIsParent(f,o)&&m.dragNodeShowBefore[o.tId]&&
+!o.open&&(e.expandCollapseNode(f,o,!o.open),delete m.dragNodeShowBefore[o.tId]);C&&C.remove();u&&u.remove();var r=(a.ctrlKey||a.metaKey)&&f.edit.drag.isMove&&f.edit.drag.isCopy||!f.edit.drag.isMove&&f.edit.drag.isCopy;!r&&t&&w&&n[0].parentTId&&w==n[0].parentTId&&x==d.move.TYPE_INNER&&(t=null);if(t){var p=w==null?null:i.getNodeCache(h,w);if(k.apply(f.callback.beforeDrop,[h.treeId,n,p,x,r],!0)==!1)e.selectNodes(v,n);else{var s=r?k.clone(n):n;b=function(){if(J){if(!r)for(var b=0,c=n.length;b<c;b++)e.removeNode(f,
+n[b]);x==d.move.TYPE_INNER?e.addNodes(h,p,-1,s):e.addNodes(h,p.getParentNode(),x==d.move.TYPE_PREV?p.getIndex():p.getIndex()+1,s)}else if(r&&x==d.move.TYPE_INNER)e.addNodes(h,p,-1,s);else if(r)e.addNodes(h,p.getParentNode(),x==d.move.TYPE_PREV?p.getIndex():p.getIndex()+1,s);else if(x!=d.move.TYPE_NEXT)for(b=0,c=s.length;b<c;b++)e.moveNode(h,p,s[b],x,!1);else for(b=-1,c=s.length-1;b<c;c--)e.moveNode(h,p,s[c],x,!1);e.selectNodes(h,s);b=q(s[0],f).get(0);e.scrollIntoView(f,b);f.treeObj.trigger(d.event.DROP,
+[a,h.treeId,s,p,x,r])};x==d.move.TYPE_INNER&&k.canAsync(h,p)?e.asyncNode(h,p,!1,b):b()}}else e.selectNodes(v,n),f.treeObj.trigger(d.event.DROP,[a,f.treeId,n,null,null,null])}}function g(){return!1}var o,j,f=i.getSetting(a.data.treeId),m=i.getRoot(f),y=i.getRoots();if(a.button==2||!f.edit.enable||!f.edit.drag.isCopy&&!f.edit.drag.isMove)return!0;var r=a.target,s=i.getRoot(f).curSelectedList,n=[];if(i.isSelectedNode(f,b))for(o=0,j=s.length;o<j;o++){if(s[o].editNameFlag&&k.eqs(r.tagName,"input")&&r.getAttribute("treeNode"+
+d.id.INPUT)!==null)return!0;n.push(s[o]);if(n[0].parentTId!==s[o].parentTId){n=[b];break}}else n=[b];e.editNodeBlur=!0;e.cancelCurEditNode(f);var G=B(f.treeObj.get(0).ownerDocument),L=B(f.treeObj.get(0).ownerDocument.body),C,u,t,J=!1,h=f,v=f,H,Q,S=null,T=null,w=null,x=d.move.TYPE_INNER,N=a.clientX,O=a.clientY,K=(new Date).getTime();k.uCanDo(f)&&G.bind("mousemove",c);G.bind("mouseup",l);G.bind("selectstart",g);a.preventDefault&&a.preventDefault();return!0}};B.extend(!0,B.fn.zTree.consts,I);B.extend(!0,
+B.fn.zTree._z,{tools:{getAbs:function(a){a=a.getBoundingClientRect();return[a.left+(document.body.scrollLeft+document.documentElement.scrollLeft),a.top+(document.body.scrollTop+document.documentElement.scrollTop)]},inputFocus:function(a){a.get(0)&&(a.focus(),k.setCursorPosition(a.get(0),a.val().length))},inputSelect:function(a){a.get(0)&&(a.focus(),a.select())},setCursorPosition:function(a,b){if(a.setSelectionRange)a.focus(),a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();
+c.collapse(!0);c.moveEnd("character",b);c.moveStart("character",b);c.select()}},showIfameMask:function(a,b){for(var c=i.getRoot(a);c.dragMaskList.length>0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(b)for(var d=q("iframe",a),g=0,e=d.length;g<e;g++){var j=d.get(g),f=k.getAbs(j),j=q("<div id='zTreeMask_"+g+"' class='zTreeMask' style='top:"+f[1]+"px; left:"+f[0]+"px; width:"+j.offsetWidth+"px; height:"+j.offsetHeight+"px;'></div>",a);j.appendTo(q("body",a));c.dragMaskList.push(j)}}},view:{addEditBtn:function(a,
+b){if(!(b.editNameFlag||q(b,d.id.EDIT,a).length>0)&&k.apply(a.edit.showRenameBtn,[a.treeId,b],a.edit.showRenameBtn)){var c=q(b,d.id.A,a),l="<span class='"+d.className.BUTTON+" edit' id='"+b.tId+d.id.EDIT+"' title='"+k.apply(a.edit.renameTitle,[a.treeId,b],a.edit.renameTitle)+"' treeNode"+d.id.EDIT+" style='display:none;'></span>";c.append(l);q(b,d.id.EDIT,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeEditName,[a.treeId,b],!0)==!1)return!1;e.editNode(a,b);return!1}).show()}},
+addRemoveBtn:function(a,b){if(!(b.editNameFlag||q(b,d.id.REMOVE,a).length>0)&&k.apply(a.edit.showRemoveBtn,[a.treeId,b],a.edit.showRemoveBtn)){var c=q(b,d.id.A,a),l="<span class='"+d.className.BUTTON+" remove' id='"+b.tId+d.id.REMOVE+"' title='"+k.apply(a.edit.removeTitle,[a.treeId,b],a.edit.removeTitle)+"' treeNode"+d.id.REMOVE+" style='display:none;'></span>";c.append(l);q(b,d.id.REMOVE,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeRemove,[a.treeId,b],!0)==!1)return!1;e.removeNode(a,
+b);a.treeObj.trigger(d.event.REMOVE,[a.treeId,b]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(a,b){if(i.getRoots().showHoverDom)b.isHover=!0,a.edit.enable&&(e.addEditBtn(a,b),e.addRemoveBtn(a,b)),k.apply(a.view.addHoverDom,[a.treeId,b])},cancelCurEditNode:function(a,b,c){var l=i.getRoot(a),g=l.curEditNode;if(g){var o=l.curEditInput,b=b?b:c?i.nodeName(a,g):o.val();if(k.apply(a.callback.beforeRename,[a.treeId,g,b,c],!0)===!1)return!1;i.nodeName(a,g,b);q(g,d.id.A,
+a).removeClass(d.node.CURSELECTED_EDIT);o.unbind();e.setNodeName(a,g);g.editNameFlag=!1;l.curEditNode=null;l.curEditInput=null;e.selectNode(a,g,!1);a.treeObj.trigger(d.event.RENAME,[a.treeId,g,c])}return l.noSelection=!0},editNode:function(a,b){var c=i.getRoot(a);e.editNodeBlur=!1;if(i.isSelectedNode(a,b)&&c.curEditNode==b&&b.editNameFlag)setTimeout(function(){k.inputFocus(c.curEditInput)},0);else{b.editNameFlag=!0;e.removeTreeDom(a,b);e.cancelCurEditNode(a);e.selectNode(a,b,!1);q(b,d.id.SPAN,a).html("<input type=text class='rename' id='"+
+b.tId+d.id.INPUT+"' treeNode"+d.id.INPUT+" >");var l=q(b,d.id.INPUT,a);l.attr("value",i.nodeName(a,b));a.edit.editNameSelectAll?k.inputSelect(l):k.inputFocus(l);l.bind("blur",function(){e.editNodeBlur||e.cancelCurEditNode(a)}).bind("keydown",function(b){b.keyCode=="13"?(e.editNodeBlur=!0,e.cancelCurEditNode(a)):b.keyCode=="27"&&e.cancelCurEditNode(a,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});q(b,d.id.A,a).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=l;
+c.noSelection=!1;c.curEditNode=b}},moveNode:function(a,b,c,l,g,k){var j=i.getRoot(a);if(b!=c&&(!a.data.keep.leaf||!b||i.nodeIsParent(a,b)||l!=d.move.TYPE_INNER)){var f=c.parentTId?c.getParentNode():j,m=b===null||b==j;m&&b===null&&(b=j);if(m)l=d.move.TYPE_INNER;j=b.parentTId?b.getParentNode():j;if(l!=d.move.TYPE_PREV&&l!=d.move.TYPE_NEXT)l=d.move.TYPE_INNER;if(l==d.move.TYPE_INNER)if(m)c.parentTId=null;else{if(!i.nodeIsParent(a,b))i.nodeIsParent(a,b,!0),b.open=!!b.open,e.setNodeLineIcos(a,b);c.parentTId=
+b.tId}var y;m?y=m=a.treeObj:(!k&&l==d.move.TYPE_INNER?e.expandCollapseNode(a,b,!0,!1):k||e.expandCollapseNode(a,b.getParentNode(),!0,!1),m=q(b,a),y=q(b,d.id.UL,a),m.get(0)&&!y.get(0)&&(y=[],e.makeUlHtml(a,b,y,""),m.append(y.join(""))),y=q(b,d.id.UL,a));var r=q(c,a);r.get(0)?m.get(0)||r.remove():r=e.appendNodes(a,c.level,[c],null,-1,!1,!0).join("");y.get(0)&&l==d.move.TYPE_INNER?y.append(r):m.get(0)&&l==d.move.TYPE_PREV?m.before(r):m.get(0)&&l==d.move.TYPE_NEXT&&m.after(r);var s;y=-1;var r=0,n=null,
+m=null,B=c.level,v=i.nodeChildren(a,f),C=i.nodeChildren(a,j),u=i.nodeChildren(a,b);if(c.isFirstNode){if(y=0,v.length>1)n=v[1],n.isFirstNode=!0}else if(c.isLastNode)y=v.length-1,n=v[y-1],n.isLastNode=!0;else for(j=0,s=v.length;j<s;j++)if(v[j].tId==c.tId){y=j;break}y>=0&&v.splice(y,1);if(l!=d.move.TYPE_INNER)for(j=0,s=C.length;j<s;j++)C[j].tId==b.tId&&(r=j);if(l==d.move.TYPE_INNER){u||(u=i.nodeChildren(a,b,[]));if(u.length>0)m=u[u.length-1],m.isLastNode=!1;u.splice(u.length,0,c);c.isLastNode=!0;c.isFirstNode=
+u.length==1}else b.isFirstNode&&l==d.move.TYPE_PREV?(C.splice(r,0,c),m=b,m.isFirstNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!0,c.isLastNode=!1):b.isLastNode&&l==d.move.TYPE_NEXT?(C.splice(r+1,0,c),m=b,m.isLastNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(l==d.move.TYPE_PREV?C.splice(r,0,c):C.splice(r+1,0,c),c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!1);i.fixPIdKeyValue(a,c);i.setSonNodeLevel(a,c.getParentNode(),c);e.setNodeLineIcos(a,c);e.repairNodeLevelClass(a,
+c,B);!a.data.keep.parent&&v.length<1?(i.nodeIsParent(a,f,!1),f.open=!1,b=q(f,d.id.UL,a),l=q(f,d.id.SWITCH,a),j=q(f,d.id.ICON,a),e.replaceSwitchClass(f,l,d.folder.DOCU),e.replaceIcoClass(f,j,d.folder.DOCU),b.css("display","none")):n&&e.setNodeLineIcos(a,n);m&&e.setNodeLineIcos(a,m);a.check&&a.check.enable&&e.repairChkClass&&(e.repairChkClass(a,f),e.repairParentChkClassWithSelf(a,f),f!=c.parent&&e.repairParentChkClassWithSelf(a,c));k||e.expandCollapseParentNode(a,c.getParentNode(),!0,g)}},removeEditBtn:function(a,
+b){q(b,d.id.EDIT,a).unbind().remove()},removeRemoveBtn:function(a,b){q(b,d.id.REMOVE,a).unbind().remove()},removeTreeDom:function(a,b){b.isHover=!1;e.removeEditBtn(a,b);e.removeRemoveBtn(a,b);k.apply(a.view.removeHoverDom,[a.treeId,b])},repairNodeLevelClass:function(a,b,c){if(c!==b.level){var e=q(b,a),g=q(b,d.id.A,a),a=q(b,d.id.UL,a),c=d.className.LEVEL+c,b=d.className.LEVEL+b.level;e.removeClass(c);e.addClass(b);g.removeClass(c);g.addClass(b);a.removeClass(c);a.addClass(b)}},selectNodes:function(a,
+b){for(var c=0,d=b.length;c<d;c++)e.selectNode(a,b[c],c>0)}},event:{},data:{setSonNodeLevel:function(a,b,c){if(c){var d=i.nodeChildren(a,c);c.level=b?b.level+1:0;if(d)for(var b=0,g=d.length;b<g;b++)d[b]&&i.setSonNodeLevel(a,c,d[b])}}}});var H=B.fn.zTree,k=H._z.tools,d=H.consts,e=H._z.view,i=H._z.data,q=k.$;i.exSetting({edit:{enable:!1,editNameSelectAll:!1,showRemoveBtn:!0,showRenameBtn:!0,removeTitle:"remove",renameTitle:"rename",drag:{autoExpandTrigger:!1,isCopy:!0,isMove:!0,prev:!0,next:!0,inner:!0,
+minMoveSize:5,borderMax:10,borderMin:-5,maxShowNodeNum:5,autoOpenTime:500}},view:{addHoverDom:null,removeHoverDom:null},callback:{beforeDrag:null,beforeDragOpen:null,beforeDrop:null,beforeEditName:null,beforeRename:null,onDrag:null,onDragMove:null,onDrop:null,onRename:null}});i.addInitBind(function(a){var b=a.treeObj,c=d.event;b.bind(c.RENAME,function(b,c,d,e){k.apply(a.callback.onRename,[b,c,d,e])});b.bind(c.DRAG,function(b,c,d,e){k.apply(a.callback.onDrag,[c,d,e])});b.bind(c.DRAGMOVE,function(b,
+c,d,e){k.apply(a.callback.onDragMove,[c,d,e])});b.bind(c.DROP,function(b,c,d,e,f,i,q){k.apply(a.callback.onDrop,[c,d,e,f,i,q])})});i.addInitUnBind(function(a){var a=a.treeObj,b=d.event;a.unbind(b.RENAME);a.unbind(b.DRAG);a.unbind(b.DRAGMOVE);a.unbind(b.DROP)});i.addInitCache(function(){});i.addInitNode(function(a,b,c){if(c)c.isHover=!1,c.editNameFlag=!1});i.addInitProxy(function(a){var b=a.target,c=i.getSetting(a.data.treeId),e=a.relatedTarget,g="",o=null,j="",f=null,m=null;if(k.eqs(a.type,"mouseover")){if(m=
+k.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+d.id.A}]))g=k.getNodeMainDom(m).id,j="hoverOverNode"}else if(k.eqs(a.type,"mouseout"))m=k.getMDom(c,e,[{tagName:"a",attrName:"treeNode"+d.id.A}]),m||(g="remove",j="hoverOutNode");else if(k.eqs(a.type,"mousedown")&&(m=k.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+d.id.A}])))g=k.getNodeMainDom(m).id,j="mousedownNode";if(g.length>0)switch(o=i.getNodeCache(c,g),j){case "mousedownNode":f=v.onMousedownNode;break;case "hoverOverNode":f=v.onHoverOverNode;
+break;case "hoverOutNode":f=v.onHoverOutNode}return{stop:!1,node:o,nodeEventType:j,nodeEventCallback:f,treeEventType:"",treeEventCallback:null}});i.addInitRoot(function(a){var a=i.getRoot(a),b=i.getRoots();a.curEditNode=null;a.curEditInput=null;a.curHoverNode=null;a.dragFlag=0;a.dragNodeShowBefore=[];a.dragMaskList=[];b.showHoverDom=!0});i.addZTreeTools(function(a,b){b.cancelEditName=function(a){i.getRoot(this.setting).curEditNode&&e.cancelCurEditNode(this.setting,a?a:null,!0)};b.copyNode=function(b,
+l,g,o){if(!l)return null;var j=i.nodeIsParent(a,b);if(b&&!j&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;var f=this,m=k.clone(l);if(!b)b=null,g=d.move.TYPE_INNER;g==d.move.TYPE_INNER?(l=function(){e.addNodes(f.setting,b,-1,[m],o)},k.canAsync(this.setting,b)?e.asyncNode(this.setting,b,o,l):l()):(e.addNodes(this.setting,b.parentNode,-1,[m],o),e.moveNode(this.setting,b,m,g,!1,o));return m};b.editName=function(a){a&&a.tId&&a===i.getNodeCache(this.setting,a.tId)&&(a.parentTId&&e.expandCollapseParentNode(this.setting,
+a.getParentNode(),!0),e.editNode(this.setting,a))};b.moveNode=function(b,l,g,o){function j(){e.moveNode(m.setting,b,l,g,!1,o)}if(!l)return l;var f=i.nodeIsParent(a,b);if(b&&!f&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;else if(b&&(l.parentTId==b.tId&&g==d.move.TYPE_INNER||q(l,this.setting).find("#"+b.tId).length>0))return null;else b||(b=null);var m=this;k.canAsync(this.setting,b)&&g===d.move.TYPE_INNER?e.asyncNode(this.setting,b,o,j):j();return l};b.setEditable=function(a){this.setting.edit.enable=
+a;return this.refresh()}});var N=e.cancelPreSelectedNode;e.cancelPreSelectedNode=function(a,b){for(var c=i.getRoot(a).curSelectedList,d=0,g=c.length;d<g;d++)if(!b||b===c[d])if(e.removeTreeDom(a,c[d]),b)break;N&&N.apply(e,arguments)};var O=e.createNodes;e.createNodes=function(a,b,c,d,g){O&&O.apply(e,arguments);c&&e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(a,d)};var V=e.makeNodeUrl;e.makeNodeUrl=function(a,b){return a.edit.enable?null:V.apply(e,arguments)};var K=e.removeNode;e.removeNode=
+function(a,b){var c=i.getRoot(a);if(c.curEditNode===b)c.curEditNode=null;K&&K.apply(e,arguments)};var P=e.selectNode;e.selectNode=function(a,b,c){var d=i.getRoot(a);if(i.isSelectedNode(a,b)&&d.curEditNode==b&&b.editNameFlag)return!1;P&&P.apply(e,arguments);e.addHoverDom(a,b);return!0};var U=k.uCanDo;k.uCanDo=function(a,b){var c=i.getRoot(a);if(b&&(k.eqs(b.type,"mouseover")||k.eqs(b.type,"mouseout")||k.eqs(b.type,"mousedown")||k.eqs(b.type,"mouseup")))return!0;if(c.curEditNode)e.editNodeBlur=!1,c.curEditInput.focus();
+return!c.curEditNode&&(U?U.apply(e,arguments):!0)}})(jQuery);
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.exhide.js b/libs/ztree/3.5.33/js/jquery.ztree.exhide.js
new file mode 100644
index 000000000..683d0e4c3
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.exhide.js
@@ -0,0 +1,399 @@
+/*
+ * JQuery zTree exHideNodes v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function($){
+  var _setting = {
+    data: {
+      key: {
+        isHidden: "isHidden"
+      }
+    }
+  };
+	//default init node of exLib
+	var _initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
+		var isHidden = data.isHidden(setting, n);
+		data.isHidden(setting, n, isHidden);
+		data.initHideForExCheck(setting, n);
+	},
+	//add dom for check
+	_beforeA = function(setting, node, html) {},
+	//update zTreeObj, add method of exLib
+	_zTreeTools = function(setting, zTreeTools) {
+		zTreeTools.showNodes = function(nodes, options) {
+			view.showNodes(setting, nodes, options);
+		}
+		zTreeTools.showNode = function(node, options) {
+			if (!node) {
+				return;
+			}
+			view.showNodes(setting, [node], options);
+		}
+		zTreeTools.hideNodes = function(nodes, options) {
+			view.hideNodes(setting, nodes, options);
+		}
+		zTreeTools.hideNode = function(node, options) {
+			if (!node) {
+				return;
+			}
+			view.hideNodes(setting, [node], options);
+		}
+
+		var _checkNode = zTreeTools.checkNode;
+		if (_checkNode) {
+			zTreeTools.checkNode = function(node, checked, checkTypeFlag, callbackFlag) {
+				if (!!node && !!data.isHidden(setting, node)) {
+					return;
+				}
+				_checkNode.apply(zTreeTools, arguments);
+			}
+		}
+	},
+	//method of operate data
+	_data = {
+		initHideForExCheck: function(setting, n) {
+      var isHidden = data.isHidden(setting, n);
+			if (isHidden && setting.check && setting.check.enable) {
+				if(typeof n._nocheck == "undefined") {
+					n._nocheck = !!n.nocheck
+					n.nocheck = true;
+				}
+				n.check_Child_State = -1;
+				if (view.repairParentChkClassWithSelf) {
+					view.repairParentChkClassWithSelf(setting, n);
+				}
+			}
+		},
+		initShowForExCheck: function(setting, n) {
+      var isHidden = data.isHidden(setting, n);
+			if (!isHidden && setting.check && setting.check.enable) {
+				if(typeof n._nocheck != "undefined") {
+					n.nocheck = n._nocheck;
+					delete n._nocheck;
+				}
+				if (view.setChkClass) {
+					var checkObj = $$(n, consts.id.CHECK, setting);
+					view.setChkClass(setting, checkObj, n);
+				}
+				if (view.repairParentChkClassWithSelf) {
+					view.repairParentChkClassWithSelf(setting, n);
+				}
+			}
+		}
+	},
+	//method of operate ztree dom
+	_view = {
+		clearOldFirstNode: function(setting, node) {
+			var n = node.getNextNode();
+			while(!!n){
+				if (n.isFirstNode) {
+					n.isFirstNode = false;
+					view.setNodeLineIcos(setting, n);
+					break;
+				}
+				if (n.isLastNode) {
+					break;
+				}
+				n = n.getNextNode();
+			}
+		},
+        clearOldLastNode: function(setting, node, openFlag) {
+            var n = node.getPreNode();
+            while(!!n){
+                if (n.isLastNode) {
+                    n.isLastNode = false;
+                    if (openFlag) {
+                        view.setNodeLineIcos(setting, n);
+                    }
+                    break;
+                }
+                if (n.isFirstNode) {
+                    break;
+                }
+                n = n.getPreNode();
+            }
+        },
+		makeDOMNodeMainBefore: function(html, setting, node) {
+      var isHidden = data.isHidden(setting, node);
+			html.push("<li ", (isHidden ? "style='display:none;' " : ""), "id='", node.tId, "' class='", consts.className.LEVEL, node.level,"' tabindex='0' hidefocus='true' treenode>");
+		},
+		showNode: function(setting, node, options) {
+      data.isHidden(setting, node, false);
+			data.initShowForExCheck(setting, node);
+			$$(node, setting).show();
+		},
+		showNodes: function(setting, nodes, options) {
+			if (!nodes || nodes.length == 0) {
+				return;
+			}
+			var pList = {}, i, j;
+			for (i=0, j=nodes.length; i<j; i++) {
+				var n = nodes[i];
+				if (!pList[n.parentTId]) {
+					var pn = n.getParentNode();
+					pList[n.parentTId] = (pn === null) ? data.getRoot(setting) : n.getParentNode();
+				}
+				view.showNode(setting, n, options);
+			}
+			for (var tId in pList) {
+				var children = data.nodeChildren(setting, pList[tId]);
+				view.setFirstNodeForShow(setting, children);
+				view.setLastNodeForShow(setting, children);
+			}
+		},
+		hideNode: function(setting, node, options) {
+      data.isHidden(setting, node, true);
+			node.isFirstNode = false;
+			node.isLastNode = false;
+			data.initHideForExCheck(setting, node);
+			view.cancelPreSelectedNode(setting, node);
+			$$(node, setting).hide();
+		},
+		hideNodes: function(setting, nodes, options) {
+			if (!nodes || nodes.length == 0) {
+				return;
+			}
+			var pList = {}, i, j;
+			for (i=0, j=nodes.length; i<j; i++) {
+				var n = nodes[i];
+				if ((n.isFirstNode || n.isLastNode) && !pList[n.parentTId]) {
+					var pn = n.getParentNode();
+					pList[n.parentTId] = (pn === null) ? data.getRoot(setting) : n.getParentNode();
+				}
+				view.hideNode(setting, n, options);
+			}
+			for (var tId in pList) {
+				var children = data.nodeChildren(setting, pList[tId]);
+				view.setFirstNodeForHide(setting, children);
+				view.setLastNodeForHide(setting, children);
+			}
+		},
+		setFirstNode: function(setting, parentNode) {
+      var children = data.nodeChildren(setting, parentNode);
+      var isHidden = data.isHidden(setting, children[0], false);
+			if (children.length > 0 && !isHidden) {
+        children[0].isFirstNode = true;
+			} else if (children.length > 0) {
+				view.setFirstNodeForHide(setting, children);
+			}
+		},
+		setLastNode: function(setting, parentNode) {
+      var children = data.nodeChildren(setting, parentNode);
+      var isHidden = data.isHidden(setting, children[0]);
+			if (children.length > 0 && !isHidden) {
+        children[children.length - 1].isLastNode = true;
+			} else if (children.length > 0) {
+				view.setLastNodeForHide(setting, children);
+			}
+		},
+		setFirstNodeForHide: function(setting, nodes) {
+			var n,i,j;
+			for (i=0, j=nodes.length; i<j; i++) {
+				n = nodes[i];
+				if (n.isFirstNode) {
+					break;
+				}
+        var isHidden = data.isHidden(setting, n);
+				if (!isHidden && !n.isFirstNode) {
+					n.isFirstNode = true;
+					view.setNodeLineIcos(setting, n);
+					break;
+				} else {
+					n = null;
+				}
+			}
+			return n;
+		},
+		setFirstNodeForShow: function(setting, nodes) {
+			var n,i,j, first, old;
+			for(i=0, j=nodes.length; i<j; i++) {
+				n = nodes[i];
+        var isHidden = data.isHidden(setting, n);
+				if (!first && !isHidden && n.isFirstNode) {
+					first = n;
+					break;
+				} else if (!first && !isHidden && !n.isFirstNode) {
+					n.isFirstNode = true;
+					first = n;
+					view.setNodeLineIcos(setting, n);
+				} else if (first && n.isFirstNode) {
+					n.isFirstNode = false;
+					old = n;
+					view.setNodeLineIcos(setting, n);
+					break;
+				} else {
+					n = null;
+				}
+			}
+			return {"new":first, "old":old};
+		},
+		setLastNodeForHide: function(setting, nodes) {
+			var n,i;
+			for (i=nodes.length-1; i>=0; i--) {
+				n = nodes[i];
+				if (n.isLastNode) {
+					break;
+				}
+        var isHidden = data.isHidden(setting, n);
+				if (!isHidden && !n.isLastNode) {
+					n.isLastNode = true;
+					view.setNodeLineIcos(setting, n);
+					break;
+				} else {
+					n = null;
+				}
+			}
+			return n;
+		},
+		setLastNodeForShow: function(setting, nodes) {
+			var n,i,j, last, old;
+			for (i=nodes.length-1; i>=0; i--) {
+				n = nodes[i];
+        var isHidden = data.isHidden(setting, n);
+				if (!last && !isHidden && n.isLastNode) {
+					last = n;
+					break;
+				} else if (!last && !isHidden && !n.isLastNode) {
+					n.isLastNode = true;
+					last = n;
+					view.setNodeLineIcos(setting, n);
+				} else if (last && n.isLastNode) {
+					n.isLastNode = false;
+					old = n;
+					view.setNodeLineIcos(setting, n);
+					break;
+				} else {
+					n = null;
+				}
+			}
+			return {"new":last, "old":old};
+		}
+	},
+
+	_z = {
+		view: _view,
+		data: _data
+	};
+	$.extend(true, $.fn.zTree._z, _z);
+
+	var zt = $.fn.zTree,
+	tools = zt._z.tools,
+	consts = zt.consts,
+	view = zt._z.view,
+	data = zt._z.data,
+	event = zt._z.event,
+	$$ = tools.$;
+
+  data.isHidden = function(setting, node, newIsHidden) {
+    if (!node) {
+      return false;
+    }
+    var key = setting.data.key.isHidden;
+    if (typeof newIsHidden !== 'undefined') {
+      if (typeof newIsHidden === "string") {
+        newIsHidden = tools.eqs(checked, "true");
+      }
+      newIsHidden = !!newIsHidden;
+      node[key] = newIsHidden;
+    }
+    return node[key];
+  };
+
+  data.exSetting(_setting);
+	data.addInitNode(_initNode);
+	data.addBeforeA(_beforeA);
+	data.addZTreeTools(_zTreeTools);
+
+//	Override method in core
+	var _dInitNode = data.initNode;
+    data.initNode = function(setting, level, node, parentNode, isFirstNode, isLastNode, openFlag) {
+        var tmpPNode = (parentNode) ? parentNode: data.getRoot(setting),
+            children = tmpPNode[setting.data.key.children];
+        data.tmpHideFirstNode = view.setFirstNodeForHide(setting, children);
+        data.tmpHideLastNode = view.setLastNodeForHide(setting, children);
+        if (openFlag) {
+            view.setNodeLineIcos(setting, data.tmpHideFirstNode);
+            view.setNodeLineIcos(setting, data.tmpHideLastNode);
+        }
+        isFirstNode = (data.tmpHideFirstNode === node);
+        isLastNode = (data.tmpHideLastNode === node);
+        if (_dInitNode) _dInitNode.apply(data, arguments);
+        if (openFlag && isLastNode) {
+            view.clearOldLastNode(setting, node, openFlag);
+        }
+    };
+
+	var _makeChkFlag = data.makeChkFlag;
+	if (!!_makeChkFlag) {
+		data.makeChkFlag = function(setting, node) {
+			if (!!node && !!data.isHidden(setting, node)) {
+				return;
+			}
+			_makeChkFlag.apply(data, arguments);
+		}
+	}
+
+	var _getTreeCheckedNodes = data.getTreeCheckedNodes;
+	if (!!_getTreeCheckedNodes) {
+		data.getTreeCheckedNodes = function(setting, nodes, checked, results) {
+			if (!!nodes && nodes.length > 0) {
+				var p = nodes[0].getParentNode();
+				if (!!p && !!data.isHidden(setting, p)) {
+					return [];
+				}
+			}
+			return _getTreeCheckedNodes.apply(data, arguments);
+		}
+	}
+
+	var _getTreeChangeCheckedNodes = data.getTreeChangeCheckedNodes;
+	if (!!_getTreeChangeCheckedNodes) {
+		data.getTreeChangeCheckedNodes = function(setting, nodes, results) {
+			if (!!nodes && nodes.length > 0) {
+				var p = nodes[0].getParentNode();
+				if (!!p && !!data.isHidden(setting, p)) {
+					return [];
+				}
+			}
+			return _getTreeChangeCheckedNodes.apply(data, arguments);
+		}
+	}
+
+	var _expandCollapseSonNode = view.expandCollapseSonNode;
+	if (!!_expandCollapseSonNode) {
+		view.expandCollapseSonNode = function(setting, node, expandFlag, animateFlag, callback) {
+			if (!!node && !!data.isHidden(setting, node)) {
+				return;
+			}
+			_expandCollapseSonNode.apply(view, arguments);
+		}
+	}
+
+	var _setSonNodeCheckBox = view.setSonNodeCheckBox;
+	if (!!_setSonNodeCheckBox) {
+		view.setSonNodeCheckBox = function(setting, node, value, srcNode) {
+			if (!!node && !!data.isHidden(setting, node)) {
+				return;
+			}
+			_setSonNodeCheckBox.apply(view, arguments);
+		}
+	}
+
+	var _repairParentChkClassWithSelf = view.repairParentChkClassWithSelf;
+	if (!!_repairParentChkClassWithSelf) {
+		view.repairParentChkClassWithSelf = function(setting, node) {
+			if (!!node && !!data.isHidden(setting, node)) {
+				return;
+			}
+			_repairParentChkClassWithSelf.apply(view, arguments);
+		}
+	}
+})(jQuery);
\ No newline at end of file
diff --git a/libs/ztree/3.5.33/js/jquery.ztree.exhide.min.js b/libs/ztree/3.5.33/js/jquery.ztree.exhide.min.js
new file mode 100644
index 000000000..6c78a1fe9
--- /dev/null
+++ b/libs/ztree/3.5.33/js/jquery.ztree.exhide.min.js
@@ -0,0 +1,23 @@
+/*
+ * JQuery zTree exHideNodes v3.5.33
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-01-30
+ */
+(function(j){j.extend(!0,j.fn.zTree._z,{view:{clearOldFirstNode:function(c,a){for(var b=a.getNextNode();b;){if(b.isFirstNode){b.isFirstNode=!1;e.setNodeLineIcos(c,b);break}if(b.isLastNode)break;b=b.getNextNode()}},clearOldLastNode:function(c,a,b){for(a=a.getPreNode();a;){if(a.isLastNode){a.isLastNode=!1;b&&e.setNodeLineIcos(c,a);break}if(a.isFirstNode)break;a=a.getPreNode()}},makeDOMNodeMainBefore:function(c,a,b){a=d.isHidden(a,b);c.push("<li ",a?"style='display:none;' ":"","id='",b.tId,"' class='",
+l.className.LEVEL,b.level,"' tabindex='0' hidefocus='true' treenode>")},showNode:function(c,a){d.isHidden(c,a,!1);d.initShowForExCheck(c,a);k(a,c).show()},showNodes:function(c,a,b){if(a&&a.length!=0){var f={},g,i;for(g=0,i=a.length;g<i;g++){var h=a[g];if(!f[h.parentTId]){var u=h.getParentNode();f[h.parentTId]=u===null?d.getRoot(c):h.getParentNode()}e.showNode(c,h,b)}for(var j in f)a=d.nodeChildren(c,f[j]),e.setFirstNodeForShow(c,a),e.setLastNodeForShow(c,a)}},hideNode:function(c,a){d.isHidden(c,a,
+!0);a.isFirstNode=!1;a.isLastNode=!1;d.initHideForExCheck(c,a);e.cancelPreSelectedNode(c,a);k(a,c).hide()},hideNodes:function(c,a,b){if(a&&a.length!=0){var f={},g,i;for(g=0,i=a.length;g<i;g++){var h=a[g];if((h.isFirstNode||h.isLastNode)&&!f[h.parentTId]){var j=h.getParentNode();f[h.parentTId]=j===null?d.getRoot(c):h.getParentNode()}e.hideNode(c,h,b)}for(var k in f)a=d.nodeChildren(c,f[k]),e.setFirstNodeForHide(c,a),e.setLastNodeForHide(c,a)}},setFirstNode:function(c,a){var b=d.nodeChildren(c,a),f=
+d.isHidden(c,b[0],!1);b.length>0&&!f?b[0].isFirstNode=!0:b.length>0&&e.setFirstNodeForHide(c,b)},setLastNode:function(c,a){var b=d.nodeChildren(c,a),f=d.isHidden(c,b[0]);b.length>0&&!f?b[b.length-1].isLastNode=!0:b.length>0&&e.setLastNodeForHide(c,b)},setFirstNodeForHide:function(c,a){var b,f,g;for(f=0,g=a.length;f<g;f++){b=a[f];if(b.isFirstNode)break;if(!d.isHidden(c,b)&&!b.isFirstNode){b.isFirstNode=!0;e.setNodeLineIcos(c,b);break}else b=null}return b},setFirstNodeForShow:function(c,a){var b,f,
+g,i,h;for(f=0,g=a.length;f<g;f++){b=a[f];var j=d.isHidden(c,b);if(!i&&!j&&b.isFirstNode){i=b;break}else if(!i&&!j&&!b.isFirstNode)b.isFirstNode=!0,i=b,e.setNodeLineIcos(c,b);else if(i&&b.isFirstNode){b.isFirstNode=!1;h=b;e.setNodeLineIcos(c,b);break}}return{"new":i,old:h}},setLastNodeForHide:function(c,a){var b,f;for(f=a.length-1;f>=0;f--){b=a[f];if(b.isLastNode)break;if(!d.isHidden(c,b)&&!b.isLastNode){b.isLastNode=!0;e.setNodeLineIcos(c,b);break}else b=null}return b},setLastNodeForShow:function(c,
+a){var b,f,g,i;for(f=a.length-1;f>=0;f--){b=a[f];var h=d.isHidden(c,b);if(!g&&!h&&b.isLastNode){g=b;break}else if(!g&&!h&&!b.isLastNode)b.isLastNode=!0,g=b,e.setNodeLineIcos(c,b);else if(g&&b.isLastNode){b.isLastNode=!1;i=b;e.setNodeLineIcos(c,b);break}}return{"new":g,old:i}}},data:{initHideForExCheck:function(c,a){if(d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck=="undefined")a._nocheck=!!a.nocheck,a.nocheck=!0;a.check_Child_State=-1;e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c,
+a)}},initShowForExCheck:function(c,a){if(!d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck!="undefined")a.nocheck=a._nocheck,delete a._nocheck;if(e.setChkClass){var b=k(a,l.id.CHECK,c);e.setChkClass(c,b,a)}e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c,a)}}}});var j=j.fn.zTree,m=j._z.tools,l=j.consts,e=j._z.view,d=j._z.data,k=m.$;d.isHidden=function(c,a,b){if(!a)return!1;c=c.data.key.isHidden;typeof b!=="undefined"&&(typeof b==="string"&&(b=m.eqs(checked,"true")),a[c]=
+!!b);return a[c]};d.exSetting({data:{key:{isHidden:"isHidden"}}});d.addInitNode(function(c,a,b){a=d.isHidden(c,b);d.isHidden(c,b,a);d.initHideForExCheck(c,b)});d.addBeforeA(function(){});d.addZTreeTools(function(c,a){a.showNodes=function(a,b){e.showNodes(c,a,b)};a.showNode=function(a,b){a&&e.showNodes(c,[a],b)};a.hideNodes=function(a,b){e.hideNodes(c,a,b)};a.hideNode=function(a,b){a&&e.hideNodes(c,[a],b)};var b=a.checkNode;if(b)a.checkNode=function(f,e,i,h){(!f||!d.isHidden(c,f))&&b.apply(a,arguments)}});
+var n=d.initNode;d.initNode=function(c,a,b,f,g,i,h){var j=(f?f:d.getRoot(c))[c.data.key.children];d.tmpHideFirstNode=e.setFirstNodeForHide(c,j);d.tmpHideLastNode=e.setLastNodeForHide(c,j);h&&(e.setNodeLineIcos(c,d.tmpHideFirstNode),e.setNodeLineIcos(c,d.tmpHideLastNode));g=d.tmpHideFirstNode===b;i=d.tmpHideLastNode===b;n&&n.apply(d,arguments);h&&i&&e.clearOldLastNode(c,b,h)};var o=d.makeChkFlag;if(o)d.makeChkFlag=function(c,a){(!a||!d.isHidden(c,a))&&o.apply(d,arguments)};var p=d.getTreeCheckedNodes;
+if(p)d.getTreeCheckedNodes=function(c,a,b,f){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return p.apply(d,arguments)};var q=d.getTreeChangeCheckedNodes;if(q)d.getTreeChangeCheckedNodes=function(c,a,b){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return q.apply(d,arguments)};var r=e.expandCollapseSonNode;if(r)e.expandCollapseSonNode=function(c,a,b,f,g){(!a||!d.isHidden(c,a))&&r.apply(e,arguments)};var s=e.setSonNodeCheckBox;if(s)e.setSonNodeCheckBox=
+function(c,a,b,f){(!a||!d.isHidden(c,a))&&s.apply(e,arguments)};var t=e.repairParentChkClassWithSelf;if(t)e.repairParentChkClassWithSelf=function(c,a){(!a||!d.isHidden(c,a))&&t.apply(e,arguments)}})(jQuery);
diff --git a/libs/ztree/package.json b/libs/ztree/package.json
index 763176986..9f3015c63 100644
--- a/libs/ztree/package.json
+++ b/libs/ztree/package.json
@@ -1,7 +1,7 @@
 {
     "name": "ztree",
-    "filename": "jquery.ztree.all-3.5.js",
-    "version": "3.5.16",
+    "filename": "jquery.ztree.all.min.js",
+    "version": "3.5.33",
     "description": "zTree 是一个依靠 jQuery 实现的多功能 “树插件”。优异的性能、灵活的配置、多种功能的组合是 zTree 最大优点",
     "homepage": "http://www.ztree.me",
     "keywords": [