diff --git a/app/admin/view/system/auth/authorize.html b/app/admin/view/system/auth/authorize.html
index 5a36706..6f276fc 100644
--- a/app/admin/view/system/auth/authorize.html
+++ b/app/admin/view/system/auth/authorize.html
@@ -1,4 +1,11 @@
+
+
+
+
+
+
diff --git a/public/static/admin/js/system/auth.js b/public/static/admin/js/system/auth.js
index 5607dba..6a15958 100644
--- a/public/static/admin/js/system/auth.js
+++ b/public/static/admin/js/system/auth.js
@@ -1,89 +1,107 @@
define(["jquery", "easy-admin"], function ($, ea) {
- var init = {
- table_elem: '#currentTable',
- table_render_id: 'currentTableRenderId',
- index_url: 'system.auth/index',
- add_url: 'system.auth/add',
- edit_url: 'system.auth/edit',
- delete_url: 'system.auth/delete',
- export_url: 'system.auth/export',
- modify_url: 'system.auth/modify',
- authorize_url: 'system.auth/authorize',
- };
+ var init = {
+ table_elem: '#currentTable',
+ table_render_id: 'currentTableRenderId',
+ index_url: 'system.auth/index',
+ add_url: 'system.auth/add',
+ edit_url: 'system.auth/edit',
+ delete_url: 'system.auth/delete',
+ export_url: 'system.auth/export',
+ modify_url: 'system.auth/modify',
+ authorize_url: 'system.auth/authorize',
+ };
- return {
+ return {
- index: function () {
- ea.table.render({
- init: init,
- cols: [[
- {type: "checkbox"},
- {field: 'id', width: 80, title: 'ID', searchOp: '='},
- {field: 'sort', width: 80, title: '排序', edit: 'text'},
- {field: 'title', minWidth: 80, title: '权限名称'},
- {field: 'remark', minWidth: 80, title: '备注信息'},
- {field: 'status', title: '状态', width: 85, search: 'select', selectList: {0: '禁用', 1: '启用'}, templet: ea.table.switch},
- {field: 'create_time', minWidth: 80, title: '创建时间', search: 'range'},
- {
- width: 250,
- title: '操作',
- templet: ea.table.tool,
- operat: [
- 'edit',
- [{
- text: '授权',
- url: init.authorize_url,
- method: 'open',
- auth: 'authorize',
- class: 'layui-btn layui-btn-normal layui-btn-xs',
- }],
- 'delete'
- ]
- }
- ]],
- });
-
- ea.listen();
- },
- add: function () {
- ea.listen();
- },
- edit: function () {
- ea.listen();
- },
- authorize: function () {
- var tree = layui.tree;
-
- ea.request.get(
- {
- url: window.location.href,
- }, function (res) {
- res.data = res.data || [];
- tree.render({
- elem: '#node_ids',
- data: res.data,
- showCheckbox: true,
- id: 'nodeDataId',
- });
- }
- );
-
- ea.listen(function (data) {
- var checkedData = tree.getChecked('nodeDataId');
- var ids = [];
- $.each(checkedData, function (i, v) {
- ids.push(v.id);
- if (v.children !== undefined && v.children.length > 0) {
- $.each(v.children, function (ii, vv) {
- ids.push(vv.id);
- });
- }
+ index: function () {
+ ea.table.render({
+ init: init,
+ cols: [[
+ {type: "checkbox"},
+ {field: 'id', width: 80, title: 'ID', searchOp: '='},
+ {field: 'sort', width: 80, title: '排序', edit: 'text'},
+ {field: 'title', minWidth: 80, title: '权限名称'},
+ {field: 'remark', minWidth: 80, title: '备注信息'},
+ {field: 'status', title: '状态', width: 85, search: 'select', selectList: {0: '禁用', 1: '启用'}, templet: ea.table.switch},
+ {field: 'create_time', minWidth: 80, title: '创建时间', search: 'range'},
+ {
+ width: 250,
+ title: '操作',
+ templet: ea.table.tool,
+ operat: [
+ 'edit',
+ [{
+ text: '授权',
+ url: init.authorize_url,
+ method: 'open',
+ auth: 'authorize',
+ class: 'layui-btn layui-btn-normal layui-btn-xs',
+ }],
+ 'delete'
+ ]
+ }
+ ]],
});
- data.node = JSON.stringify(ids);
- return data;
- });
+ ea.listen();
+ },
+ add: function () {
+ ea.listen();
+ },
+ edit: function () {
+ ea.listen();
+ },
+ authorize: function () {
+
+ let setting = {
+ check: {
+ enable: true,
+ chkStyle: "checkbox",
+ },
+ view: {
+ showIcon: true,
+ showLine: true,
+ selectedMulti: false,
+ dblClickExpand: false
+ }, callback: {
+ onClick: function (e, treeId, treeNode, clickFlag) {
+ treeObj.checkNode(treeNode, !treeNode.checked, true);
+ }
+ }
+ };
+ let treeObj
+ let treeData = []
+ ea.request.get({url: window.location.href}, function (res) {
+ res.data = res.data || [];
+ $.each(res.data, function (index, value) {
+ treeData[index] = []
+ treeData[index].id = value.id
+ treeData[index].name = value.title
+ treeData[index].pId = 0
+ treeData[index].open = true
+ let children = value.children
+ treeData[index]['children'] = []
+ $.each(children, function (idx, val) {
+ treeData[index]['children'].push({id: val.id, name: val.title, checked: val.checked, pId: value.id})
+ })
+ })
+ $.fn.zTree.init($("#tree"), setting, treeData);
+ treeObj = $.fn.zTree.getZTreeObj("tree");
+ }
+ );
+
+ ea.listen(function (data) {
+ let checkedData = treeObj.getCheckedNodes();
+ let ids = []
+ for (var i = 0; i < checkedData.length; i++) {
+ ids.push(checkedData[i].id)
+ }
+ data.node = JSON.stringify(ids);
+ return data;
+ });
+
+ }
}
- };
-});
\ No newline at end of file
+ }
+)
diff --git a/public/static/plugs/zTree/fontawesome.css b/public/static/plugs/zTree/fontawesome.css
new file mode 100644
index 0000000..1b7d465
--- /dev/null
+++ b/public/static/plugs/zTree/fontawesome.css
@@ -0,0 +1,6110 @@
+/*!
+ * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.fa, .fab, .fad, .fal, .far, .fas {
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ display: inline-block;
+ font-style: normal;
+ font-variant: normal;
+ text-rendering: auto;
+ line-height: 1
+}
+
+.fa-lg {
+ font-size: 1.33333em;
+ line-height: .75em;
+ vertical-align: -.0667em
+}
+
+.fa-xs {
+ font-size: .75em
+}
+
+.fa-sm {
+ font-size: .875em
+}
+
+.fa-1x {
+ font-size: 1em
+}
+
+.fa-2x {
+ font-size: 2em
+}
+
+.fa-3x {
+ font-size: 3em
+}
+
+.fa-4x {
+ font-size: 4em
+}
+
+.fa-5x {
+ font-size: 5em
+}
+
+.fa-6x {
+ font-size: 6em
+}
+
+.fa-7x {
+ font-size: 7em
+}
+
+.fa-8x {
+ font-size: 8em
+}
+
+.fa-9x {
+ font-size: 9em
+}
+
+.fa-10x {
+ font-size: 10em
+}
+
+.fa-fw {
+ text-align: center;
+ width: 1.25em
+}
+
+.fa-ul {
+ list-style-type: none;
+ margin-left: 2.5em;
+ padding-left: 0
+}
+
+.fa-ul > li {
+ position: relative
+}
+
+.fa-li {
+ left: -2em;
+ position: absolute;
+ text-align: center;
+ width: 2em;
+ line-height: inherit
+}
+
+.fa-border {
+ border: .08em solid #eee;
+ border-radius: .1em;
+ padding: .2em .25em .15em
+}
+
+.fa-pull-left {
+ float: left
+}
+
+.fa-pull-right {
+ float: right
+}
+
+.fa.fa-pull-left, .fab.fa-pull-left, .fal.fa-pull-left, .far.fa-pull-left, .fas.fa-pull-left {
+ margin-right: .3em
+}
+
+.fa.fa-pull-right, .fab.fa-pull-right, .fal.fa-pull-right, .far.fa-pull-right, .fas.fa-pull-right {
+ margin-left: .3em
+}
+
+.fa-spin {
+ -webkit-animation: fa-spin 2s linear infinite;
+ animation: fa-spin 2s linear infinite
+}
+
+.fa-pulse {
+ -webkit-animation: fa-spin 1s steps(8) infinite;
+ animation: fa-spin 1s steps(8) infinite
+}
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg)
+ }
+ to {
+ -webkit-transform: rotate(1turn);
+ transform: rotate(1turn)
+ }
+}
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg)
+ }
+ to {
+ -webkit-transform: rotate(1turn);
+ transform: rotate(1turn)
+ }
+}
+
+.fa-rotate-90 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg)
+}
+
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg)
+}
+
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ transform: rotate(270deg)
+}
+
+.fa-flip-horizontal {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+ -webkit-transform: scaleX(-1);
+ transform: scaleX(-1)
+}
+
+.fa-flip-vertical {
+ -webkit-transform: scaleY(-1);
+ transform: scaleY(-1)
+}
+
+.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical, .fa-flip-vertical {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"
+}
+
+.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {
+ -webkit-transform: scale(-1);
+ transform: scale(-1)
+}
+
+:root .fa-flip-both, :root .fa-flip-horizontal, :root .fa-flip-vertical, :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270 {
+ -webkit-filter: none;
+ filter: none
+}
+
+.fa-stack {
+ display: inline-block;
+ height: 2em;
+ line-height: 2em;
+ position: relative;
+ vertical-align: middle;
+ width: 2.5em
+}
+
+.fa-stack-1x, .fa-stack-2x {
+ left: 0;
+ position: absolute;
+ text-align: center;
+ width: 100%
+}
+
+.fa-stack-1x {
+ line-height: inherit
+}
+
+.fa-stack-2x {
+ font-size: 2em
+}
+
+.fa-inverse {
+ color: #fff
+}
+
+.fa-500px:before {
+ content: "\f26e"
+}
+
+.fa-accessible-icon:before {
+ content: "\f368"
+}
+
+.fa-accusoft:before {
+ content: "\f369"
+}
+
+.fa-acquisitions-incorporated:before {
+ content: "\f6af"
+}
+
+.fa-ad:before {
+ content: "\f641"
+}
+
+.fa-address-book:before {
+ content: "\f2b9"
+}
+
+.fa-address-card:before {
+ content: "\f2bb"
+}
+
+.fa-adjust:before {
+ content: "\f042"
+}
+
+.fa-adn:before {
+ content: "\f170"
+}
+
+.fa-adversal:before {
+ content: "\f36a"
+}
+
+.fa-affiliatetheme:before {
+ content: "\f36b"
+}
+
+.fa-air-freshener:before {
+ content: "\f5d0"
+}
+
+.fa-airbnb:before {
+ content: "\f834"
+}
+
+.fa-algolia:before {
+ content: "\f36c"
+}
+
+.fa-align-center:before {
+ content: "\f037"
+}
+
+.fa-align-justify:before {
+ content: "\f039"
+}
+
+.fa-align-left:before {
+ content: "\f036"
+}
+
+.fa-align-right:before {
+ content: "\f038"
+}
+
+.fa-alipay:before {
+ content: "\f642"
+}
+
+.fa-allergies:before {
+ content: "\f461"
+}
+
+.fa-amazon:before {
+ content: "\f270"
+}
+
+.fa-amazon-pay:before {
+ content: "\f42c"
+}
+
+.fa-ambulance:before {
+ content: "\f0f9"
+}
+
+.fa-american-sign-language-interpreting:before {
+ content: "\f2a3"
+}
+
+.fa-amilia:before {
+ content: "\f36d"
+}
+
+.fa-anchor:before {
+ content: "\f13d"
+}
+
+.fa-android:before {
+ content: "\f17b"
+}
+
+.fa-angellist:before {
+ content: "\f209"
+}
+
+.fa-angle-double-down:before {
+ content: "\f103"
+}
+
+.fa-angle-double-left:before {
+ content: "\f100"
+}
+
+.fa-angle-double-right:before {
+ content: "\f101"
+}
+
+.fa-angle-double-up:before {
+ content: "\f102"
+}
+
+.fa-angle-down:before {
+ content: "\f107"
+}
+
+.fa-angle-left:before {
+ content: "\f104"
+}
+
+.fa-angle-right:before {
+ content: "\f105"
+}
+
+.fa-angle-up:before {
+ content: "\f106"
+}
+
+.fa-angry:before {
+ content: "\f556"
+}
+
+.fa-angrycreative:before {
+ content: "\f36e"
+}
+
+.fa-angular:before {
+ content: "\f420"
+}
+
+.fa-ankh:before {
+ content: "\f644"
+}
+
+.fa-app-store:before {
+ content: "\f36f"
+}
+
+.fa-app-store-ios:before {
+ content: "\f370"
+}
+
+.fa-apper:before {
+ content: "\f371"
+}
+
+.fa-apple:before {
+ content: "\f179"
+}
+
+.fa-apple-alt:before {
+ content: "\f5d1"
+}
+
+.fa-apple-pay:before {
+ content: "\f415"
+}
+
+.fa-archive:before {
+ content: "\f187"
+}
+
+.fa-archway:before {
+ content: "\f557"
+}
+
+.fa-arrow-alt-circle-down:before {
+ content: "\f358"
+}
+
+.fa-arrow-alt-circle-left:before {
+ content: "\f359"
+}
+
+.fa-arrow-alt-circle-right:before {
+ content: "\f35a"
+}
+
+.fa-arrow-alt-circle-up:before {
+ content: "\f35b"
+}
+
+.fa-arrow-circle-down:before {
+ content: "\f0ab"
+}
+
+.fa-arrow-circle-left:before {
+ content: "\f0a8"
+}
+
+.fa-arrow-circle-right:before {
+ content: "\f0a9"
+}
+
+.fa-arrow-circle-up:before {
+ content: "\f0aa"
+}
+
+.fa-arrow-down:before {
+ content: "\f063"
+}
+
+.fa-arrow-left:before {
+ content: "\f060"
+}
+
+.fa-arrow-right:before {
+ content: "\f061"
+}
+
+.fa-arrow-up:before {
+ content: "\f062"
+}
+
+.fa-arrows-alt:before {
+ content: "\f0b2"
+}
+
+.fa-arrows-alt-h:before {
+ content: "\f337"
+}
+
+.fa-arrows-alt-v:before {
+ content: "\f338"
+}
+
+.fa-artstation:before {
+ content: "\f77a"
+}
+
+.fa-assistive-listening-systems:before {
+ content: "\f2a2"
+}
+
+.fa-asterisk:before {
+ content: "\f069"
+}
+
+.fa-asymmetrik:before {
+ content: "\f372"
+}
+
+.fa-at:before {
+ content: "\f1fa"
+}
+
+.fa-atlas:before {
+ content: "\f558"
+}
+
+.fa-atlassian:before {
+ content: "\f77b"
+}
+
+.fa-atom:before {
+ content: "\f5d2"
+}
+
+.fa-audible:before {
+ content: "\f373"
+}
+
+.fa-audio-description:before {
+ content: "\f29e"
+}
+
+.fa-autoprefixer:before {
+ content: "\f41c"
+}
+
+.fa-avianex:before {
+ content: "\f374"
+}
+
+.fa-aviato:before {
+ content: "\f421"
+}
+
+.fa-award:before {
+ content: "\f559"
+}
+
+.fa-aws:before {
+ content: "\f375"
+}
+
+.fa-baby:before {
+ content: "\f77c"
+}
+
+.fa-baby-carriage:before {
+ content: "\f77d"
+}
+
+.fa-backspace:before {
+ content: "\f55a"
+}
+
+.fa-backward:before {
+ content: "\f04a"
+}
+
+.fa-bacon:before {
+ content: "\f7e5"
+}
+
+.fa-bacteria:before {
+ content: "\e059"
+}
+
+.fa-bacterium:before {
+ content: "\e05a"
+}
+
+.fa-bahai:before {
+ content: "\f666"
+}
+
+.fa-balance-scale:before {
+ content: "\f24e"
+}
+
+.fa-balance-scale-left:before {
+ content: "\f515"
+}
+
+.fa-balance-scale-right:before {
+ content: "\f516"
+}
+
+.fa-ban:before {
+ content: "\f05e"
+}
+
+.fa-band-aid:before {
+ content: "\f462"
+}
+
+.fa-bandcamp:before {
+ content: "\f2d5"
+}
+
+.fa-barcode:before {
+ content: "\f02a"
+}
+
+.fa-bars:before {
+ content: "\f0c9"
+}
+
+.fa-baseball-ball:before {
+ content: "\f433"
+}
+
+.fa-basketball-ball:before {
+ content: "\f434"
+}
+
+.fa-bath:before {
+ content: "\f2cd"
+}
+
+.fa-battery-empty:before {
+ content: "\f244"
+}
+
+.fa-battery-full:before {
+ content: "\f240"
+}
+
+.fa-battery-half:before {
+ content: "\f242"
+}
+
+.fa-battery-quarter:before {
+ content: "\f243"
+}
+
+.fa-battery-three-quarters:before {
+ content: "\f241"
+}
+
+.fa-battle-net:before {
+ content: "\f835"
+}
+
+.fa-bed:before {
+ content: "\f236"
+}
+
+.fa-beer:before {
+ content: "\f0fc"
+}
+
+.fa-behance:before {
+ content: "\f1b4"
+}
+
+.fa-behance-square:before {
+ content: "\f1b5"
+}
+
+.fa-bell:before {
+ content: "\f0f3"
+}
+
+.fa-bell-slash:before {
+ content: "\f1f6"
+}
+
+.fa-bezier-curve:before {
+ content: "\f55b"
+}
+
+.fa-bible:before {
+ content: "\f647"
+}
+
+.fa-bicycle:before {
+ content: "\f206"
+}
+
+.fa-biking:before {
+ content: "\f84a"
+}
+
+.fa-bimobject:before {
+ content: "\f378"
+}
+
+.fa-binoculars:before {
+ content: "\f1e5"
+}
+
+.fa-biohazard:before {
+ content: "\f780"
+}
+
+.fa-birthday-cake:before {
+ content: "\f1fd"
+}
+
+.fa-bitbucket:before {
+ content: "\f171"
+}
+
+.fa-bitcoin:before {
+ content: "\f379"
+}
+
+.fa-bity:before {
+ content: "\f37a"
+}
+
+.fa-black-tie:before {
+ content: "\f27e"
+}
+
+.fa-blackberry:before {
+ content: "\f37b"
+}
+
+.fa-blender:before {
+ content: "\f517"
+}
+
+.fa-blender-phone:before {
+ content: "\f6b6"
+}
+
+.fa-blind:before {
+ content: "\f29d"
+}
+
+.fa-blog:before {
+ content: "\f781"
+}
+
+.fa-blogger:before {
+ content: "\f37c"
+}
+
+.fa-blogger-b:before {
+ content: "\f37d"
+}
+
+.fa-bluetooth:before {
+ content: "\f293"
+}
+
+.fa-bluetooth-b:before {
+ content: "\f294"
+}
+
+.fa-bold:before {
+ content: "\f032"
+}
+
+.fa-bolt:before {
+ content: "\f0e7"
+}
+
+.fa-bomb:before {
+ content: "\f1e2"
+}
+
+.fa-bone:before {
+ content: "\f5d7"
+}
+
+.fa-bong:before {
+ content: "\f55c"
+}
+
+.fa-book:before {
+ content: "\f02d"
+}
+
+.fa-book-dead:before {
+ content: "\f6b7"
+}
+
+.fa-book-medical:before {
+ content: "\f7e6"
+}
+
+.fa-book-open:before {
+ content: "\f518"
+}
+
+.fa-book-reader:before {
+ content: "\f5da"
+}
+
+.fa-bookmark:before {
+ content: "\f02e"
+}
+
+.fa-bootstrap:before {
+ content: "\f836"
+}
+
+.fa-border-all:before {
+ content: "\f84c"
+}
+
+.fa-border-none:before {
+ content: "\f850"
+}
+
+.fa-border-style:before {
+ content: "\f853"
+}
+
+.fa-bowling-ball:before {
+ content: "\f436"
+}
+
+.fa-box:before {
+ content: "\f466"
+}
+
+.fa-box-open:before {
+ content: "\f49e"
+}
+
+.fa-box-tissue:before {
+ content: "\e05b"
+}
+
+.fa-boxes:before {
+ content: "\f468"
+}
+
+.fa-braille:before {
+ content: "\f2a1"
+}
+
+.fa-brain:before {
+ content: "\f5dc"
+}
+
+.fa-bread-slice:before {
+ content: "\f7ec"
+}
+
+.fa-briefcase:before {
+ content: "\f0b1"
+}
+
+.fa-briefcase-medical:before {
+ content: "\f469"
+}
+
+.fa-broadcast-tower:before {
+ content: "\f519"
+}
+
+.fa-broom:before {
+ content: "\f51a"
+}
+
+.fa-brush:before {
+ content: "\f55d"
+}
+
+.fa-btc:before {
+ content: "\f15a"
+}
+
+.fa-buffer:before {
+ content: "\f837"
+}
+
+.fa-bug:before {
+ content: "\f188"
+}
+
+.fa-building:before {
+ content: "\f1ad"
+}
+
+.fa-bullhorn:before {
+ content: "\f0a1"
+}
+
+.fa-bullseye:before {
+ content: "\f140"
+}
+
+.fa-burn:before {
+ content: "\f46a"
+}
+
+.fa-buromobelexperte:before {
+ content: "\f37f"
+}
+
+.fa-bus:before {
+ content: "\f207"
+}
+
+.fa-bus-alt:before {
+ content: "\f55e"
+}
+
+.fa-business-time:before {
+ content: "\f64a"
+}
+
+.fa-buy-n-large:before {
+ content: "\f8a6"
+}
+
+.fa-buysellads:before {
+ content: "\f20d"
+}
+
+.fa-calculator:before {
+ content: "\f1ec"
+}
+
+.fa-calendar:before {
+ content: "\f133"
+}
+
+.fa-calendar-alt:before {
+ content: "\f073"
+}
+
+.fa-calendar-check:before {
+ content: "\f274"
+}
+
+.fa-calendar-day:before {
+ content: "\f783"
+}
+
+.fa-calendar-minus:before {
+ content: "\f272"
+}
+
+.fa-calendar-plus:before {
+ content: "\f271"
+}
+
+.fa-calendar-times:before {
+ content: "\f273"
+}
+
+.fa-calendar-week:before {
+ content: "\f784"
+}
+
+.fa-camera:before {
+ content: "\f030"
+}
+
+.fa-camera-retro:before {
+ content: "\f083"
+}
+
+.fa-campground:before {
+ content: "\f6bb"
+}
+
+.fa-canadian-maple-leaf:before {
+ content: "\f785"
+}
+
+.fa-candy-cane:before {
+ content: "\f786"
+}
+
+.fa-cannabis:before {
+ content: "\f55f"
+}
+
+.fa-capsules:before {
+ content: "\f46b"
+}
+
+.fa-car:before {
+ content: "\f1b9"
+}
+
+.fa-car-alt:before {
+ content: "\f5de"
+}
+
+.fa-car-battery:before {
+ content: "\f5df"
+}
+
+.fa-car-crash:before {
+ content: "\f5e1"
+}
+
+.fa-car-side:before {
+ content: "\f5e4"
+}
+
+.fa-caravan:before {
+ content: "\f8ff"
+}
+
+.fa-caret-down:before {
+ content: "\f0d7"
+}
+
+.fa-caret-left:before {
+ content: "\f0d9"
+}
+
+.fa-caret-right:before {
+ content: "\f0da"
+}
+
+.fa-caret-square-down:before {
+ content: "\f150"
+}
+
+.fa-caret-square-left:before {
+ content: "\f191"
+}
+
+.fa-caret-square-right:before {
+ content: "\f152"
+}
+
+.fa-caret-square-up:before {
+ content: "\f151"
+}
+
+.fa-caret-up:before {
+ content: "\f0d8"
+}
+
+.fa-carrot:before {
+ content: "\f787"
+}
+
+.fa-cart-arrow-down:before {
+ content: "\f218"
+}
+
+.fa-cart-plus:before {
+ content: "\f217"
+}
+
+.fa-cash-register:before {
+ content: "\f788"
+}
+
+.fa-cat:before {
+ content: "\f6be"
+}
+
+.fa-cc-amazon-pay:before {
+ content: "\f42d"
+}
+
+.fa-cc-amex:before {
+ content: "\f1f3"
+}
+
+.fa-cc-apple-pay:before {
+ content: "\f416"
+}
+
+.fa-cc-diners-club:before {
+ content: "\f24c"
+}
+
+.fa-cc-discover:before {
+ content: "\f1f2"
+}
+
+.fa-cc-jcb:before {
+ content: "\f24b"
+}
+
+.fa-cc-mastercard:before {
+ content: "\f1f1"
+}
+
+.fa-cc-paypal:before {
+ content: "\f1f4"
+}
+
+.fa-cc-stripe:before {
+ content: "\f1f5"
+}
+
+.fa-cc-visa:before {
+ content: "\f1f0"
+}
+
+.fa-centercode:before {
+ content: "\f380"
+}
+
+.fa-centos:before {
+ content: "\f789"
+}
+
+.fa-certificate:before {
+ content: "\f0a3"
+}
+
+.fa-chair:before {
+ content: "\f6c0"
+}
+
+.fa-chalkboard:before {
+ content: "\f51b"
+}
+
+.fa-chalkboard-teacher:before {
+ content: "\f51c"
+}
+
+.fa-charging-station:before {
+ content: "\f5e7"
+}
+
+.fa-chart-area:before {
+ content: "\f1fe"
+}
+
+.fa-chart-bar:before {
+ content: "\f080"
+}
+
+.fa-chart-line:before {
+ content: "\f201"
+}
+
+.fa-chart-pie:before {
+ content: "\f200"
+}
+
+.fa-check:before {
+ content: "\f00c"
+}
+
+.fa-check-circle:before {
+ content: "\f058"
+}
+
+.fa-check-double:before {
+ content: "\f560"
+}
+
+.fa-check-square:before {
+ content: "\f14a"
+}
+
+.fa-cheese:before {
+ content: "\f7ef"
+}
+
+.fa-chess:before {
+ content: "\f439"
+}
+
+.fa-chess-bishop:before {
+ content: "\f43a"
+}
+
+.fa-chess-board:before {
+ content: "\f43c"
+}
+
+.fa-chess-king:before {
+ content: "\f43f"
+}
+
+.fa-chess-knight:before {
+ content: "\f441"
+}
+
+.fa-chess-pawn:before {
+ content: "\f443"
+}
+
+.fa-chess-queen:before {
+ content: "\f445"
+}
+
+.fa-chess-rook:before {
+ content: "\f447"
+}
+
+.fa-chevron-circle-down:before {
+ content: "\f13a"
+}
+
+.fa-chevron-circle-left:before {
+ content: "\f137"
+}
+
+.fa-chevron-circle-right:before {
+ content: "\f138"
+}
+
+.fa-chevron-circle-up:before {
+ content: "\f139"
+}
+
+.fa-chevron-down:before {
+ content: "\f078"
+}
+
+.fa-chevron-left:before {
+ content: "\f053"
+}
+
+.fa-chevron-right:before {
+ content: "\f054"
+}
+
+.fa-chevron-up:before {
+ content: "\f077"
+}
+
+.fa-child:before {
+ content: "\f1ae"
+}
+
+.fa-chrome:before {
+ content: "\f268"
+}
+
+.fa-chromecast:before {
+ content: "\f838"
+}
+
+.fa-church:before {
+ content: "\f51d"
+}
+
+.fa-circle:before {
+ content: "\f111"
+}
+
+.fa-circle-notch:before {
+ content: "\f1ce"
+}
+
+.fa-city:before {
+ content: "\f64f"
+}
+
+.fa-clinic-medical:before {
+ content: "\f7f2"
+}
+
+.fa-clipboard:before {
+ content: "\f328"
+}
+
+.fa-clipboard-check:before {
+ content: "\f46c"
+}
+
+.fa-clipboard-list:before {
+ content: "\f46d"
+}
+
+.fa-clock:before {
+ content: "\f017"
+}
+
+.fa-clone:before {
+ content: "\f24d"
+}
+
+.fa-closed-captioning:before {
+ content: "\f20a"
+}
+
+.fa-cloud:before {
+ content: "\f0c2"
+}
+
+.fa-cloud-download-alt:before {
+ content: "\f381"
+}
+
+.fa-cloud-meatball:before {
+ content: "\f73b"
+}
+
+.fa-cloud-moon:before {
+ content: "\f6c3"
+}
+
+.fa-cloud-moon-rain:before {
+ content: "\f73c"
+}
+
+.fa-cloud-rain:before {
+ content: "\f73d"
+}
+
+.fa-cloud-showers-heavy:before {
+ content: "\f740"
+}
+
+.fa-cloud-sun:before {
+ content: "\f6c4"
+}
+
+.fa-cloud-sun-rain:before {
+ content: "\f743"
+}
+
+.fa-cloud-upload-alt:before {
+ content: "\f382"
+}
+
+.fa-cloudflare:before {
+ content: "\e07d"
+}
+
+.fa-cloudscale:before {
+ content: "\f383"
+}
+
+.fa-cloudsmith:before {
+ content: "\f384"
+}
+
+.fa-cloudversify:before {
+ content: "\f385"
+}
+
+.fa-cocktail:before {
+ content: "\f561"
+}
+
+.fa-code:before {
+ content: "\f121"
+}
+
+.fa-code-branch:before {
+ content: "\f126"
+}
+
+.fa-codepen:before {
+ content: "\f1cb"
+}
+
+.fa-codiepie:before {
+ content: "\f284"
+}
+
+.fa-coffee:before {
+ content: "\f0f4"
+}
+
+.fa-cog:before {
+ content: "\f013"
+}
+
+.fa-cogs:before {
+ content: "\f085"
+}
+
+.fa-coins:before {
+ content: "\f51e"
+}
+
+.fa-columns:before {
+ content: "\f0db"
+}
+
+.fa-comment:before {
+ content: "\f075"
+}
+
+.fa-comment-alt:before {
+ content: "\f27a"
+}
+
+.fa-comment-dollar:before {
+ content: "\f651"
+}
+
+.fa-comment-dots:before {
+ content: "\f4ad"
+}
+
+.fa-comment-medical:before {
+ content: "\f7f5"
+}
+
+.fa-comment-slash:before {
+ content: "\f4b3"
+}
+
+.fa-comments:before {
+ content: "\f086"
+}
+
+.fa-comments-dollar:before {
+ content: "\f653"
+}
+
+.fa-compact-disc:before {
+ content: "\f51f"
+}
+
+.fa-compass:before {
+ content: "\f14e"
+}
+
+.fa-compress:before {
+ content: "\f066"
+}
+
+.fa-compress-alt:before {
+ content: "\f422"
+}
+
+.fa-compress-arrows-alt:before {
+ content: "\f78c"
+}
+
+.fa-concierge-bell:before {
+ content: "\f562"
+}
+
+.fa-confluence:before {
+ content: "\f78d"
+}
+
+.fa-connectdevelop:before {
+ content: "\f20e"
+}
+
+.fa-contao:before {
+ content: "\f26d"
+}
+
+.fa-cookie:before {
+ content: "\f563"
+}
+
+.fa-cookie-bite:before {
+ content: "\f564"
+}
+
+.fa-copy:before {
+ content: "\f0c5"
+}
+
+.fa-copyright:before {
+ content: "\f1f9"
+}
+
+.fa-cotton-bureau:before {
+ content: "\f89e"
+}
+
+.fa-couch:before {
+ content: "\f4b8"
+}
+
+.fa-cpanel:before {
+ content: "\f388"
+}
+
+.fa-creative-commons:before {
+ content: "\f25e"
+}
+
+.fa-creative-commons-by:before {
+ content: "\f4e7"
+}
+
+.fa-creative-commons-nc:before {
+ content: "\f4e8"
+}
+
+.fa-creative-commons-nc-eu:before {
+ content: "\f4e9"
+}
+
+.fa-creative-commons-nc-jp:before {
+ content: "\f4ea"
+}
+
+.fa-creative-commons-nd:before {
+ content: "\f4eb"
+}
+
+.fa-creative-commons-pd:before {
+ content: "\f4ec"
+}
+
+.fa-creative-commons-pd-alt:before {
+ content: "\f4ed"
+}
+
+.fa-creative-commons-remix:before {
+ content: "\f4ee"
+}
+
+.fa-creative-commons-sa:before {
+ content: "\f4ef"
+}
+
+.fa-creative-commons-sampling:before {
+ content: "\f4f0"
+}
+
+.fa-creative-commons-sampling-plus:before {
+ content: "\f4f1"
+}
+
+.fa-creative-commons-share:before {
+ content: "\f4f2"
+}
+
+.fa-creative-commons-zero:before {
+ content: "\f4f3"
+}
+
+.fa-credit-card:before {
+ content: "\f09d"
+}
+
+.fa-critical-role:before {
+ content: "\f6c9"
+}
+
+.fa-crop:before {
+ content: "\f125"
+}
+
+.fa-crop-alt:before {
+ content: "\f565"
+}
+
+.fa-cross:before {
+ content: "\f654"
+}
+
+.fa-crosshairs:before {
+ content: "\f05b"
+}
+
+.fa-crow:before {
+ content: "\f520"
+}
+
+.fa-crown:before {
+ content: "\f521"
+}
+
+.fa-crutch:before {
+ content: "\f7f7"
+}
+
+.fa-css3:before {
+ content: "\f13c"
+}
+
+.fa-css3-alt:before {
+ content: "\f38b"
+}
+
+.fa-cube:before {
+ content: "\f1b2"
+}
+
+.fa-cubes:before {
+ content: "\f1b3"
+}
+
+.fa-cut:before {
+ content: "\f0c4"
+}
+
+.fa-cuttlefish:before {
+ content: "\f38c"
+}
+
+.fa-d-and-d:before {
+ content: "\f38d"
+}
+
+.fa-d-and-d-beyond:before {
+ content: "\f6ca"
+}
+
+.fa-dailymotion:before {
+ content: "\e052"
+}
+
+.fa-dashcube:before {
+ content: "\f210"
+}
+
+.fa-database:before {
+ content: "\f1c0"
+}
+
+.fa-deaf:before {
+ content: "\f2a4"
+}
+
+.fa-deezer:before {
+ content: "\e077"
+}
+
+.fa-delicious:before {
+ content: "\f1a5"
+}
+
+.fa-democrat:before {
+ content: "\f747"
+}
+
+.fa-deploydog:before {
+ content: "\f38e"
+}
+
+.fa-deskpro:before {
+ content: "\f38f"
+}
+
+.fa-desktop:before {
+ content: "\f108"
+}
+
+.fa-dev:before {
+ content: "\f6cc"
+}
+
+.fa-deviantart:before {
+ content: "\f1bd"
+}
+
+.fa-dharmachakra:before {
+ content: "\f655"
+}
+
+.fa-dhl:before {
+ content: "\f790"
+}
+
+.fa-diagnoses:before {
+ content: "\f470"
+}
+
+.fa-diaspora:before {
+ content: "\f791"
+}
+
+.fa-dice:before {
+ content: "\f522"
+}
+
+.fa-dice-d20:before {
+ content: "\f6cf"
+}
+
+.fa-dice-d6:before {
+ content: "\f6d1"
+}
+
+.fa-dice-five:before {
+ content: "\f523"
+}
+
+.fa-dice-four:before {
+ content: "\f524"
+}
+
+.fa-dice-one:before {
+ content: "\f525"
+}
+
+.fa-dice-six:before {
+ content: "\f526"
+}
+
+.fa-dice-three:before {
+ content: "\f527"
+}
+
+.fa-dice-two:before {
+ content: "\f528"
+}
+
+.fa-digg:before {
+ content: "\f1a6"
+}
+
+.fa-digital-ocean:before {
+ content: "\f391"
+}
+
+.fa-digital-tachograph:before {
+ content: "\f566"
+}
+
+.fa-directions:before {
+ content: "\f5eb"
+}
+
+.fa-discord:before {
+ content: "\f392"
+}
+
+.fa-discourse:before {
+ content: "\f393"
+}
+
+.fa-disease:before {
+ content: "\f7fa"
+}
+
+.fa-divide:before {
+ content: "\f529"
+}
+
+.fa-dizzy:before {
+ content: "\f567"
+}
+
+.fa-dna:before {
+ content: "\f471"
+}
+
+.fa-dochub:before {
+ content: "\f394"
+}
+
+.fa-docker:before {
+ content: "\f395"
+}
+
+.fa-dog:before {
+ content: "\f6d3"
+}
+
+.fa-dollar-sign:before {
+ content: "\f155"
+}
+
+.fa-dolly:before {
+ content: "\f472"
+}
+
+.fa-dolly-flatbed:before {
+ content: "\f474"
+}
+
+.fa-donate:before {
+ content: "\f4b9"
+}
+
+.fa-door-closed:before {
+ content: "\f52a"
+}
+
+.fa-door-open:before {
+ content: "\f52b"
+}
+
+.fa-dot-circle:before {
+ content: "\f192"
+}
+
+.fa-dove:before {
+ content: "\f4ba"
+}
+
+.fa-download:before {
+ content: "\f019"
+}
+
+.fa-draft2digital:before {
+ content: "\f396"
+}
+
+.fa-drafting-compass:before {
+ content: "\f568"
+}
+
+.fa-dragon:before {
+ content: "\f6d5"
+}
+
+.fa-draw-polygon:before {
+ content: "\f5ee"
+}
+
+.fa-dribbble:before {
+ content: "\f17d"
+}
+
+.fa-dribbble-square:before {
+ content: "\f397"
+}
+
+.fa-dropbox:before {
+ content: "\f16b"
+}
+
+.fa-drum:before {
+ content: "\f569"
+}
+
+.fa-drum-steelpan:before {
+ content: "\f56a"
+}
+
+.fa-drumstick-bite:before {
+ content: "\f6d7"
+}
+
+.fa-drupal:before {
+ content: "\f1a9"
+}
+
+.fa-dumbbell:before {
+ content: "\f44b"
+}
+
+.fa-dumpster:before {
+ content: "\f793"
+}
+
+.fa-dumpster-fire:before {
+ content: "\f794"
+}
+
+.fa-dungeon:before {
+ content: "\f6d9"
+}
+
+.fa-dyalog:before {
+ content: "\f399"
+}
+
+.fa-earlybirds:before {
+ content: "\f39a"
+}
+
+.fa-ebay:before {
+ content: "\f4f4"
+}
+
+.fa-edge:before {
+ content: "\f282"
+}
+
+.fa-edge-legacy:before {
+ content: "\e078"
+}
+
+.fa-edit:before {
+ content: "\f044"
+}
+
+.fa-egg:before {
+ content: "\f7fb"
+}
+
+.fa-eject:before {
+ content: "\f052"
+}
+
+.fa-elementor:before {
+ content: "\f430"
+}
+
+.fa-ellipsis-h:before {
+ content: "\f141"
+}
+
+.fa-ellipsis-v:before {
+ content: "\f142"
+}
+
+.fa-ello:before {
+ content: "\f5f1"
+}
+
+.fa-ember:before {
+ content: "\f423"
+}
+
+.fa-empire:before {
+ content: "\f1d1"
+}
+
+.fa-envelope:before {
+ content: "\f0e0"
+}
+
+.fa-envelope-open:before {
+ content: "\f2b6"
+}
+
+.fa-envelope-open-text:before {
+ content: "\f658"
+}
+
+.fa-envelope-square:before {
+ content: "\f199"
+}
+
+.fa-envira:before {
+ content: "\f299"
+}
+
+.fa-equals:before {
+ content: "\f52c"
+}
+
+.fa-eraser:before {
+ content: "\f12d"
+}
+
+.fa-erlang:before {
+ content: "\f39d"
+}
+
+.fa-ethereum:before {
+ content: "\f42e"
+}
+
+.fa-ethernet:before {
+ content: "\f796"
+}
+
+.fa-etsy:before {
+ content: "\f2d7"
+}
+
+.fa-euro-sign:before {
+ content: "\f153"
+}
+
+.fa-evernote:before {
+ content: "\f839"
+}
+
+.fa-exchange-alt:before {
+ content: "\f362"
+}
+
+.fa-exclamation:before {
+ content: "\f12a"
+}
+
+.fa-exclamation-circle:before {
+ content: "\f06a"
+}
+
+.fa-exclamation-triangle:before {
+ content: "\f071"
+}
+
+.fa-expand:before {
+ content: "\f065"
+}
+
+.fa-expand-alt:before {
+ content: "\f424"
+}
+
+.fa-expand-arrows-alt:before {
+ content: "\f31e"
+}
+
+.fa-expeditedssl:before {
+ content: "\f23e"
+}
+
+.fa-external-link-alt:before {
+ content: "\f35d"
+}
+
+.fa-external-link-square-alt:before {
+ content: "\f360"
+}
+
+.fa-eye:before {
+ content: "\f06e"
+}
+
+.fa-eye-dropper:before {
+ content: "\f1fb"
+}
+
+.fa-eye-slash:before {
+ content: "\f070"
+}
+
+.fa-facebook:before {
+ content: "\f09a"
+}
+
+.fa-facebook-f:before {
+ content: "\f39e"
+}
+
+.fa-facebook-messenger:before {
+ content: "\f39f"
+}
+
+.fa-facebook-square:before {
+ content: "\f082"
+}
+
+.fa-fan:before {
+ content: "\f863"
+}
+
+.fa-fantasy-flight-games:before {
+ content: "\f6dc"
+}
+
+.fa-fast-backward:before {
+ content: "\f049"
+}
+
+.fa-fast-forward:before {
+ content: "\f050"
+}
+
+.fa-faucet:before {
+ content: "\e005"
+}
+
+.fa-fax:before {
+ content: "\f1ac"
+}
+
+.fa-feather:before {
+ content: "\f52d"
+}
+
+.fa-feather-alt:before {
+ content: "\f56b"
+}
+
+.fa-fedex:before {
+ content: "\f797"
+}
+
+.fa-fedora:before {
+ content: "\f798"
+}
+
+.fa-female:before {
+ content: "\f182"
+}
+
+.fa-fighter-jet:before {
+ content: "\f0fb"
+}
+
+.fa-figma:before {
+ content: "\f799"
+}
+
+.fa-file:before {
+ content: "\f15b"
+}
+
+.fa-file-alt:before {
+ content: "\f15c"
+}
+
+.fa-file-archive:before {
+ content: "\f1c6"
+}
+
+.fa-file-audio:before {
+ content: "\f1c7"
+}
+
+.fa-file-code:before {
+ content: "\f1c9"
+}
+
+.fa-file-contract:before {
+ content: "\f56c"
+}
+
+.fa-file-csv:before {
+ content: "\f6dd"
+}
+
+.fa-file-download:before {
+ content: "\f56d"
+}
+
+.fa-file-excel:before {
+ content: "\f1c3"
+}
+
+.fa-file-export:before {
+ content: "\f56e"
+}
+
+.fa-file-image:before {
+ content: "\f1c5"
+}
+
+.fa-file-import:before {
+ content: "\f56f"
+}
+
+.fa-file-invoice:before {
+ content: "\f570"
+}
+
+.fa-file-invoice-dollar:before {
+ content: "\f571"
+}
+
+.fa-file-medical:before {
+ content: "\f477"
+}
+
+.fa-file-medical-alt:before {
+ content: "\f478"
+}
+
+.fa-file-pdf:before {
+ content: "\f1c1"
+}
+
+.fa-file-powerpoint:before {
+ content: "\f1c4"
+}
+
+.fa-file-prescription:before {
+ content: "\f572"
+}
+
+.fa-file-signature:before {
+ content: "\f573"
+}
+
+.fa-file-upload:before {
+ content: "\f574"
+}
+
+.fa-file-video:before {
+ content: "\f1c8"
+}
+
+.fa-file-word:before {
+ content: "\f1c2"
+}
+
+.fa-fill:before {
+ content: "\f575"
+}
+
+.fa-fill-drip:before {
+ content: "\f576"
+}
+
+.fa-film:before {
+ content: "\f008"
+}
+
+.fa-filter:before {
+ content: "\f0b0"
+}
+
+.fa-fingerprint:before {
+ content: "\f577"
+}
+
+.fa-fire:before {
+ content: "\f06d"
+}
+
+.fa-fire-alt:before {
+ content: "\f7e4"
+}
+
+.fa-fire-extinguisher:before {
+ content: "\f134"
+}
+
+.fa-firefox:before {
+ content: "\f269"
+}
+
+.fa-firefox-browser:before {
+ content: "\e007"
+}
+
+.fa-first-aid:before {
+ content: "\f479"
+}
+
+.fa-first-order:before {
+ content: "\f2b0"
+}
+
+.fa-first-order-alt:before {
+ content: "\f50a"
+}
+
+.fa-firstdraft:before {
+ content: "\f3a1"
+}
+
+.fa-fish:before {
+ content: "\f578"
+}
+
+.fa-fist-raised:before {
+ content: "\f6de"
+}
+
+.fa-flag:before {
+ content: "\f024"
+}
+
+.fa-flag-checkered:before {
+ content: "\f11e"
+}
+
+.fa-flag-usa:before {
+ content: "\f74d"
+}
+
+.fa-flask:before {
+ content: "\f0c3"
+}
+
+.fa-flickr:before {
+ content: "\f16e"
+}
+
+.fa-flipboard:before {
+ content: "\f44d"
+}
+
+.fa-flushed:before {
+ content: "\f579"
+}
+
+.fa-fly:before {
+ content: "\f417"
+}
+
+.fa-folder:before {
+ content: "\f07b"
+}
+
+.fa-folder-minus:before {
+ content: "\f65d"
+}
+
+.fa-folder-open:before {
+ content: "\f07c"
+}
+
+.fa-folder-plus:before {
+ content: "\f65e"
+}
+
+.fa-font:before {
+ content: "\f031"
+}
+
+.fa-font-awesome:before {
+ content: "\f2b4"
+}
+
+.fa-font-awesome-alt:before {
+ content: "\f35c"
+}
+
+.fa-font-awesome-flag:before {
+ content: "\f425"
+}
+
+.fa-font-awesome-logo-full:before {
+ content: "\f4e6"
+}
+
+.fa-fonticons:before {
+ content: "\f280"
+}
+
+.fa-fonticons-fi:before {
+ content: "\f3a2"
+}
+
+.fa-football-ball:before {
+ content: "\f44e"
+}
+
+.fa-fort-awesome:before {
+ content: "\f286"
+}
+
+.fa-fort-awesome-alt:before {
+ content: "\f3a3"
+}
+
+.fa-forumbee:before {
+ content: "\f211"
+}
+
+.fa-forward:before {
+ content: "\f04e"
+}
+
+.fa-foursquare:before {
+ content: "\f180"
+}
+
+.fa-free-code-camp:before {
+ content: "\f2c5"
+}
+
+.fa-freebsd:before {
+ content: "\f3a4"
+}
+
+.fa-frog:before {
+ content: "\f52e"
+}
+
+.fa-frown:before {
+ content: "\f119"
+}
+
+.fa-frown-open:before {
+ content: "\f57a"
+}
+
+.fa-fulcrum:before {
+ content: "\f50b"
+}
+
+.fa-funnel-dollar:before {
+ content: "\f662"
+}
+
+.fa-futbol:before {
+ content: "\f1e3"
+}
+
+.fa-galactic-republic:before {
+ content: "\f50c"
+}
+
+.fa-galactic-senate:before {
+ content: "\f50d"
+}
+
+.fa-gamepad:before {
+ content: "\f11b"
+}
+
+.fa-gas-pump:before {
+ content: "\f52f"
+}
+
+.fa-gavel:before {
+ content: "\f0e3"
+}
+
+.fa-gem:before {
+ content: "\f3a5"
+}
+
+.fa-genderless:before {
+ content: "\f22d"
+}
+
+.fa-get-pocket:before {
+ content: "\f265"
+}
+
+.fa-gg:before {
+ content: "\f260"
+}
+
+.fa-gg-circle:before {
+ content: "\f261"
+}
+
+.fa-ghost:before {
+ content: "\f6e2"
+}
+
+.fa-gift:before {
+ content: "\f06b"
+}
+
+.fa-gifts:before {
+ content: "\f79c"
+}
+
+.fa-git:before {
+ content: "\f1d3"
+}
+
+.fa-git-alt:before {
+ content: "\f841"
+}
+
+.fa-git-square:before {
+ content: "\f1d2"
+}
+
+.fa-github:before {
+ content: "\f09b"
+}
+
+.fa-github-alt:before {
+ content: "\f113"
+}
+
+.fa-github-square:before {
+ content: "\f092"
+}
+
+.fa-gitkraken:before {
+ content: "\f3a6"
+}
+
+.fa-gitlab:before {
+ content: "\f296"
+}
+
+.fa-gitter:before {
+ content: "\f426"
+}
+
+.fa-glass-cheers:before {
+ content: "\f79f"
+}
+
+.fa-glass-martini:before {
+ content: "\f000"
+}
+
+.fa-glass-martini-alt:before {
+ content: "\f57b"
+}
+
+.fa-glass-whiskey:before {
+ content: "\f7a0"
+}
+
+.fa-glasses:before {
+ content: "\f530"
+}
+
+.fa-glide:before {
+ content: "\f2a5"
+}
+
+.fa-glide-g:before {
+ content: "\f2a6"
+}
+
+.fa-globe:before {
+ content: "\f0ac"
+}
+
+.fa-globe-africa:before {
+ content: "\f57c"
+}
+
+.fa-globe-americas:before {
+ content: "\f57d"
+}
+
+.fa-globe-asia:before {
+ content: "\f57e"
+}
+
+.fa-globe-europe:before {
+ content: "\f7a2"
+}
+
+.fa-gofore:before {
+ content: "\f3a7"
+}
+
+.fa-golf-ball:before {
+ content: "\f450"
+}
+
+.fa-goodreads:before {
+ content: "\f3a8"
+}
+
+.fa-goodreads-g:before {
+ content: "\f3a9"
+}
+
+.fa-google:before {
+ content: "\f1a0"
+}
+
+.fa-google-drive:before {
+ content: "\f3aa"
+}
+
+.fa-google-pay:before {
+ content: "\e079"
+}
+
+.fa-google-play:before {
+ content: "\f3ab"
+}
+
+.fa-google-plus:before {
+ content: "\f2b3"
+}
+
+.fa-google-plus-g:before {
+ content: "\f0d5"
+}
+
+.fa-google-plus-square:before {
+ content: "\f0d4"
+}
+
+.fa-google-wallet:before {
+ content: "\f1ee"
+}
+
+.fa-gopuram:before {
+ content: "\f664"
+}
+
+.fa-graduation-cap:before {
+ content: "\f19d"
+}
+
+.fa-gratipay:before {
+ content: "\f184"
+}
+
+.fa-grav:before {
+ content: "\f2d6"
+}
+
+.fa-greater-than:before {
+ content: "\f531"
+}
+
+.fa-greater-than-equal:before {
+ content: "\f532"
+}
+
+.fa-grimace:before {
+ content: "\f57f"
+}
+
+.fa-grin:before {
+ content: "\f580"
+}
+
+.fa-grin-alt:before {
+ content: "\f581"
+}
+
+.fa-grin-beam:before {
+ content: "\f582"
+}
+
+.fa-grin-beam-sweat:before {
+ content: "\f583"
+}
+
+.fa-grin-hearts:before {
+ content: "\f584"
+}
+
+.fa-grin-squint:before {
+ content: "\f585"
+}
+
+.fa-grin-squint-tears:before {
+ content: "\f586"
+}
+
+.fa-grin-stars:before {
+ content: "\f587"
+}
+
+.fa-grin-tears:before {
+ content: "\f588"
+}
+
+.fa-grin-tongue:before {
+ content: "\f589"
+}
+
+.fa-grin-tongue-squint:before {
+ content: "\f58a"
+}
+
+.fa-grin-tongue-wink:before {
+ content: "\f58b"
+}
+
+.fa-grin-wink:before {
+ content: "\f58c"
+}
+
+.fa-grip-horizontal:before {
+ content: "\f58d"
+}
+
+.fa-grip-lines:before {
+ content: "\f7a4"
+}
+
+.fa-grip-lines-vertical:before {
+ content: "\f7a5"
+}
+
+.fa-grip-vertical:before {
+ content: "\f58e"
+}
+
+.fa-gripfire:before {
+ content: "\f3ac"
+}
+
+.fa-grunt:before {
+ content: "\f3ad"
+}
+
+.fa-guilded:before {
+ content: "\e07e"
+}
+
+.fa-guitar:before {
+ content: "\f7a6"
+}
+
+.fa-gulp:before {
+ content: "\f3ae"
+}
+
+.fa-h-square:before {
+ content: "\f0fd"
+}
+
+.fa-hacker-news:before {
+ content: "\f1d4"
+}
+
+.fa-hacker-news-square:before {
+ content: "\f3af"
+}
+
+.fa-hackerrank:before {
+ content: "\f5f7"
+}
+
+.fa-hamburger:before {
+ content: "\f805"
+}
+
+.fa-hammer:before {
+ content: "\f6e3"
+}
+
+.fa-hamsa:before {
+ content: "\f665"
+}
+
+.fa-hand-holding:before {
+ content: "\f4bd"
+}
+
+.fa-hand-holding-heart:before {
+ content: "\f4be"
+}
+
+.fa-hand-holding-medical:before {
+ content: "\e05c"
+}
+
+.fa-hand-holding-usd:before {
+ content: "\f4c0"
+}
+
+.fa-hand-holding-water:before {
+ content: "\f4c1"
+}
+
+.fa-hand-lizard:before {
+ content: "\f258"
+}
+
+.fa-hand-middle-finger:before {
+ content: "\f806"
+}
+
+.fa-hand-paper:before {
+ content: "\f256"
+}
+
+.fa-hand-peace:before {
+ content: "\f25b"
+}
+
+.fa-hand-point-down:before {
+ content: "\f0a7"
+}
+
+.fa-hand-point-left:before {
+ content: "\f0a5"
+}
+
+.fa-hand-point-right:before {
+ content: "\f0a4"
+}
+
+.fa-hand-point-up:before {
+ content: "\f0a6"
+}
+
+.fa-hand-pointer:before {
+ content: "\f25a"
+}
+
+.fa-hand-rock:before {
+ content: "\f255"
+}
+
+.fa-hand-scissors:before {
+ content: "\f257"
+}
+
+.fa-hand-sparkles:before {
+ content: "\e05d"
+}
+
+.fa-hand-spock:before {
+ content: "\f259"
+}
+
+.fa-hands:before {
+ content: "\f4c2"
+}
+
+.fa-hands-helping:before {
+ content: "\f4c4"
+}
+
+.fa-hands-wash:before {
+ content: "\e05e"
+}
+
+.fa-handshake:before {
+ content: "\f2b5"
+}
+
+.fa-handshake-alt-slash:before {
+ content: "\e05f"
+}
+
+.fa-handshake-slash:before {
+ content: "\e060"
+}
+
+.fa-hanukiah:before {
+ content: "\f6e6"
+}
+
+.fa-hard-hat:before {
+ content: "\f807"
+}
+
+.fa-hashtag:before {
+ content: "\f292"
+}
+
+.fa-hat-cowboy:before {
+ content: "\f8c0"
+}
+
+.fa-hat-cowboy-side:before {
+ content: "\f8c1"
+}
+
+.fa-hat-wizard:before {
+ content: "\f6e8"
+}
+
+.fa-hdd:before {
+ content: "\f0a0"
+}
+
+.fa-head-side-cough:before {
+ content: "\e061"
+}
+
+.fa-head-side-cough-slash:before {
+ content: "\e062"
+}
+
+.fa-head-side-mask:before {
+ content: "\e063"
+}
+
+.fa-head-side-virus:before {
+ content: "\e064"
+}
+
+.fa-heading:before {
+ content: "\f1dc"
+}
+
+.fa-headphones:before {
+ content: "\f025"
+}
+
+.fa-headphones-alt:before {
+ content: "\f58f"
+}
+
+.fa-headset:before {
+ content: "\f590"
+}
+
+.fa-heart:before {
+ content: "\f004"
+}
+
+.fa-heart-broken:before {
+ content: "\f7a9"
+}
+
+.fa-heartbeat:before {
+ content: "\f21e"
+}
+
+.fa-helicopter:before {
+ content: "\f533"
+}
+
+.fa-highlighter:before {
+ content: "\f591"
+}
+
+.fa-hiking:before {
+ content: "\f6ec"
+}
+
+.fa-hippo:before {
+ content: "\f6ed"
+}
+
+.fa-hips:before {
+ content: "\f452"
+}
+
+.fa-hire-a-helper:before {
+ content: "\f3b0"
+}
+
+.fa-history:before {
+ content: "\f1da"
+}
+
+.fa-hive:before {
+ content: "\e07f"
+}
+
+.fa-hockey-puck:before {
+ content: "\f453"
+}
+
+.fa-holly-berry:before {
+ content: "\f7aa"
+}
+
+.fa-home:before {
+ content: "\f015"
+}
+
+.fa-hooli:before {
+ content: "\f427"
+}
+
+.fa-hornbill:before {
+ content: "\f592"
+}
+
+.fa-horse:before {
+ content: "\f6f0"
+}
+
+.fa-horse-head:before {
+ content: "\f7ab"
+}
+
+.fa-hospital:before {
+ content: "\f0f8"
+}
+
+.fa-hospital-alt:before {
+ content: "\f47d"
+}
+
+.fa-hospital-symbol:before {
+ content: "\f47e"
+}
+
+.fa-hospital-user:before {
+ content: "\f80d"
+}
+
+.fa-hot-tub:before {
+ content: "\f593"
+}
+
+.fa-hotdog:before {
+ content: "\f80f"
+}
+
+.fa-hotel:before {
+ content: "\f594"
+}
+
+.fa-hotjar:before {
+ content: "\f3b1"
+}
+
+.fa-hourglass:before {
+ content: "\f254"
+}
+
+.fa-hourglass-end:before {
+ content: "\f253"
+}
+
+.fa-hourglass-half:before {
+ content: "\f252"
+}
+
+.fa-hourglass-start:before {
+ content: "\f251"
+}
+
+.fa-house-damage:before {
+ content: "\f6f1"
+}
+
+.fa-house-user:before {
+ content: "\e065"
+}
+
+.fa-houzz:before {
+ content: "\f27c"
+}
+
+.fa-hryvnia:before {
+ content: "\f6f2"
+}
+
+.fa-html5:before {
+ content: "\f13b"
+}
+
+.fa-hubspot:before {
+ content: "\f3b2"
+}
+
+.fa-i-cursor:before {
+ content: "\f246"
+}
+
+.fa-ice-cream:before {
+ content: "\f810"
+}
+
+.fa-icicles:before {
+ content: "\f7ad"
+}
+
+.fa-icons:before {
+ content: "\f86d"
+}
+
+.fa-id-badge:before {
+ content: "\f2c1"
+}
+
+.fa-id-card:before {
+ content: "\f2c2"
+}
+
+.fa-id-card-alt:before {
+ content: "\f47f"
+}
+
+.fa-ideal:before {
+ content: "\e013"
+}
+
+.fa-igloo:before {
+ content: "\f7ae"
+}
+
+.fa-image:before {
+ content: "\f03e"
+}
+
+.fa-images:before {
+ content: "\f302"
+}
+
+.fa-imdb:before {
+ content: "\f2d8"
+}
+
+.fa-inbox:before {
+ content: "\f01c"
+}
+
+.fa-indent:before {
+ content: "\f03c"
+}
+
+.fa-industry:before {
+ content: "\f275"
+}
+
+.fa-infinity:before {
+ content: "\f534"
+}
+
+.fa-info:before {
+ content: "\f129"
+}
+
+.fa-info-circle:before {
+ content: "\f05a"
+}
+
+.fa-innosoft:before {
+ content: "\e080"
+}
+
+.fa-instagram:before {
+ content: "\f16d"
+}
+
+.fa-instagram-square:before {
+ content: "\e055"
+}
+
+.fa-instalod:before {
+ content: "\e081"
+}
+
+.fa-intercom:before {
+ content: "\f7af"
+}
+
+.fa-internet-explorer:before {
+ content: "\f26b"
+}
+
+.fa-invision:before {
+ content: "\f7b0"
+}
+
+.fa-ioxhost:before {
+ content: "\f208"
+}
+
+.fa-italic:before {
+ content: "\f033"
+}
+
+.fa-itch-io:before {
+ content: "\f83a"
+}
+
+.fa-itunes:before {
+ content: "\f3b4"
+}
+
+.fa-itunes-note:before {
+ content: "\f3b5"
+}
+
+.fa-java:before {
+ content: "\f4e4"
+}
+
+.fa-jedi:before {
+ content: "\f669"
+}
+
+.fa-jedi-order:before {
+ content: "\f50e"
+}
+
+.fa-jenkins:before {
+ content: "\f3b6"
+}
+
+.fa-jira:before {
+ content: "\f7b1"
+}
+
+.fa-joget:before {
+ content: "\f3b7"
+}
+
+.fa-joint:before {
+ content: "\f595"
+}
+
+.fa-joomla:before {
+ content: "\f1aa"
+}
+
+.fa-journal-whills:before {
+ content: "\f66a"
+}
+
+.fa-js:before {
+ content: "\f3b8"
+}
+
+.fa-js-square:before {
+ content: "\f3b9"
+}
+
+.fa-jsfiddle:before {
+ content: "\f1cc"
+}
+
+.fa-kaaba:before {
+ content: "\f66b"
+}
+
+.fa-kaggle:before {
+ content: "\f5fa"
+}
+
+.fa-key:before {
+ content: "\f084"
+}
+
+.fa-keybase:before {
+ content: "\f4f5"
+}
+
+.fa-keyboard:before {
+ content: "\f11c"
+}
+
+.fa-keycdn:before {
+ content: "\f3ba"
+}
+
+.fa-khanda:before {
+ content: "\f66d"
+}
+
+.fa-kickstarter:before {
+ content: "\f3bb"
+}
+
+.fa-kickstarter-k:before {
+ content: "\f3bc"
+}
+
+.fa-kiss:before {
+ content: "\f596"
+}
+
+.fa-kiss-beam:before {
+ content: "\f597"
+}
+
+.fa-kiss-wink-heart:before {
+ content: "\f598"
+}
+
+.fa-kiwi-bird:before {
+ content: "\f535"
+}
+
+.fa-korvue:before {
+ content: "\f42f"
+}
+
+.fa-landmark:before {
+ content: "\f66f"
+}
+
+.fa-language:before {
+ content: "\f1ab"
+}
+
+.fa-laptop:before {
+ content: "\f109"
+}
+
+.fa-laptop-code:before {
+ content: "\f5fc"
+}
+
+.fa-laptop-house:before {
+ content: "\e066"
+}
+
+.fa-laptop-medical:before {
+ content: "\f812"
+}
+
+.fa-laravel:before {
+ content: "\f3bd"
+}
+
+.fa-lastfm:before {
+ content: "\f202"
+}
+
+.fa-lastfm-square:before {
+ content: "\f203"
+}
+
+.fa-laugh:before {
+ content: "\f599"
+}
+
+.fa-laugh-beam:before {
+ content: "\f59a"
+}
+
+.fa-laugh-squint:before {
+ content: "\f59b"
+}
+
+.fa-laugh-wink:before {
+ content: "\f59c"
+}
+
+.fa-layer-group:before {
+ content: "\f5fd"
+}
+
+.fa-leaf:before {
+ content: "\f06c"
+}
+
+.fa-leanpub:before {
+ content: "\f212"
+}
+
+.fa-lemon:before {
+ content: "\f094"
+}
+
+.fa-less:before {
+ content: "\f41d"
+}
+
+.fa-less-than:before {
+ content: "\f536"
+}
+
+.fa-less-than-equal:before {
+ content: "\f537"
+}
+
+.fa-level-down-alt:before {
+ content: "\f3be"
+}
+
+.fa-level-up-alt:before {
+ content: "\f3bf"
+}
+
+.fa-life-ring:before {
+ content: "\f1cd"
+}
+
+.fa-lightbulb:before {
+ content: "\f0eb"
+}
+
+.fa-line:before {
+ content: "\f3c0"
+}
+
+.fa-link:before {
+ content: "\f0c1"
+}
+
+.fa-linkedin:before {
+ content: "\f08c"
+}
+
+.fa-linkedin-in:before {
+ content: "\f0e1"
+}
+
+.fa-linode:before {
+ content: "\f2b8"
+}
+
+.fa-linux:before {
+ content: "\f17c"
+}
+
+.fa-lira-sign:before {
+ content: "\f195"
+}
+
+.fa-list:before {
+ content: "\f03a"
+}
+
+.fa-list-alt:before {
+ content: "\f022"
+}
+
+.fa-list-ol:before {
+ content: "\f0cb"
+}
+
+.fa-list-ul:before {
+ content: "\f0ca"
+}
+
+.fa-location-arrow:before {
+ content: "\f124"
+}
+
+.fa-lock:before {
+ content: "\f023"
+}
+
+.fa-lock-open:before {
+ content: "\f3c1"
+}
+
+.fa-long-arrow-alt-down:before {
+ content: "\f309"
+}
+
+.fa-long-arrow-alt-left:before {
+ content: "\f30a"
+}
+
+.fa-long-arrow-alt-right:before {
+ content: "\f30b"
+}
+
+.fa-long-arrow-alt-up:before {
+ content: "\f30c"
+}
+
+.fa-low-vision:before {
+ content: "\f2a8"
+}
+
+.fa-luggage-cart:before {
+ content: "\f59d"
+}
+
+.fa-lungs:before {
+ content: "\f604"
+}
+
+.fa-lungs-virus:before {
+ content: "\e067"
+}
+
+.fa-lyft:before {
+ content: "\f3c3"
+}
+
+.fa-magento:before {
+ content: "\f3c4"
+}
+
+.fa-magic:before {
+ content: "\f0d0"
+}
+
+.fa-magnet:before {
+ content: "\f076"
+}
+
+.fa-mail-bulk:before {
+ content: "\f674"
+}
+
+.fa-mailchimp:before {
+ content: "\f59e"
+}
+
+.fa-male:before {
+ content: "\f183"
+}
+
+.fa-mandalorian:before {
+ content: "\f50f"
+}
+
+.fa-map:before {
+ content: "\f279"
+}
+
+.fa-map-marked:before {
+ content: "\f59f"
+}
+
+.fa-map-marked-alt:before {
+ content: "\f5a0"
+}
+
+.fa-map-marker:before {
+ content: "\f041"
+}
+
+.fa-map-marker-alt:before {
+ content: "\f3c5"
+}
+
+.fa-map-pin:before {
+ content: "\f276"
+}
+
+.fa-map-signs:before {
+ content: "\f277"
+}
+
+.fa-markdown:before {
+ content: "\f60f"
+}
+
+.fa-marker:before {
+ content: "\f5a1"
+}
+
+.fa-mars:before {
+ content: "\f222"
+}
+
+.fa-mars-double:before {
+ content: "\f227"
+}
+
+.fa-mars-stroke:before {
+ content: "\f229"
+}
+
+.fa-mars-stroke-h:before {
+ content: "\f22b"
+}
+
+.fa-mars-stroke-v:before {
+ content: "\f22a"
+}
+
+.fa-mask:before {
+ content: "\f6fa"
+}
+
+.fa-mastodon:before {
+ content: "\f4f6"
+}
+
+.fa-maxcdn:before {
+ content: "\f136"
+}
+
+.fa-mdb:before {
+ content: "\f8ca"
+}
+
+.fa-medal:before {
+ content: "\f5a2"
+}
+
+.fa-medapps:before {
+ content: "\f3c6"
+}
+
+.fa-medium:before {
+ content: "\f23a"
+}
+
+.fa-medium-m:before {
+ content: "\f3c7"
+}
+
+.fa-medkit:before {
+ content: "\f0fa"
+}
+
+.fa-medrt:before {
+ content: "\f3c8"
+}
+
+.fa-meetup:before {
+ content: "\f2e0"
+}
+
+.fa-megaport:before {
+ content: "\f5a3"
+}
+
+.fa-meh:before {
+ content: "\f11a"
+}
+
+.fa-meh-blank:before {
+ content: "\f5a4"
+}
+
+.fa-meh-rolling-eyes:before {
+ content: "\f5a5"
+}
+
+.fa-memory:before {
+ content: "\f538"
+}
+
+.fa-mendeley:before {
+ content: "\f7b3"
+}
+
+.fa-menorah:before {
+ content: "\f676"
+}
+
+.fa-mercury:before {
+ content: "\f223"
+}
+
+.fa-meteor:before {
+ content: "\f753"
+}
+
+.fa-microblog:before {
+ content: "\e01a"
+}
+
+.fa-microchip:before {
+ content: "\f2db"
+}
+
+.fa-microphone:before {
+ content: "\f130"
+}
+
+.fa-microphone-alt:before {
+ content: "\f3c9"
+}
+
+.fa-microphone-alt-slash:before {
+ content: "\f539"
+}
+
+.fa-microphone-slash:before {
+ content: "\f131"
+}
+
+.fa-microscope:before {
+ content: "\f610"
+}
+
+.fa-microsoft:before {
+ content: "\f3ca"
+}
+
+.fa-minus:before {
+ content: "\f068"
+}
+
+.fa-minus-circle:before {
+ content: "\f056"
+}
+
+.fa-minus-square:before {
+ content: "\f146"
+}
+
+.fa-mitten:before {
+ content: "\f7b5"
+}
+
+.fa-mix:before {
+ content: "\f3cb"
+}
+
+.fa-mixcloud:before {
+ content: "\f289"
+}
+
+.fa-mixer:before {
+ content: "\e056"
+}
+
+.fa-mizuni:before {
+ content: "\f3cc"
+}
+
+.fa-mobile:before {
+ content: "\f10b"
+}
+
+.fa-mobile-alt:before {
+ content: "\f3cd"
+}
+
+.fa-modx:before {
+ content: "\f285"
+}
+
+.fa-monero:before {
+ content: "\f3d0"
+}
+
+.fa-money-bill:before {
+ content: "\f0d6"
+}
+
+.fa-money-bill-alt:before {
+ content: "\f3d1"
+}
+
+.fa-money-bill-wave:before {
+ content: "\f53a"
+}
+
+.fa-money-bill-wave-alt:before {
+ content: "\f53b"
+}
+
+.fa-money-check:before {
+ content: "\f53c"
+}
+
+.fa-money-check-alt:before {
+ content: "\f53d"
+}
+
+.fa-monument:before {
+ content: "\f5a6"
+}
+
+.fa-moon:before {
+ content: "\f186"
+}
+
+.fa-mortar-pestle:before {
+ content: "\f5a7"
+}
+
+.fa-mosque:before {
+ content: "\f678"
+}
+
+.fa-motorcycle:before {
+ content: "\f21c"
+}
+
+.fa-mountain:before {
+ content: "\f6fc"
+}
+
+.fa-mouse:before {
+ content: "\f8cc"
+}
+
+.fa-mouse-pointer:before {
+ content: "\f245"
+}
+
+.fa-mug-hot:before {
+ content: "\f7b6"
+}
+
+.fa-music:before {
+ content: "\f001"
+}
+
+.fa-napster:before {
+ content: "\f3d2"
+}
+
+.fa-neos:before {
+ content: "\f612"
+}
+
+.fa-network-wired:before {
+ content: "\f6ff"
+}
+
+.fa-neuter:before {
+ content: "\f22c"
+}
+
+.fa-newspaper:before {
+ content: "\f1ea"
+}
+
+.fa-nimblr:before {
+ content: "\f5a8"
+}
+
+.fa-node:before {
+ content: "\f419"
+}
+
+.fa-node-js:before {
+ content: "\f3d3"
+}
+
+.fa-not-equal:before {
+ content: "\f53e"
+}
+
+.fa-notes-medical:before {
+ content: "\f481"
+}
+
+.fa-npm:before {
+ content: "\f3d4"
+}
+
+.fa-ns8:before {
+ content: "\f3d5"
+}
+
+.fa-nutritionix:before {
+ content: "\f3d6"
+}
+
+.fa-object-group:before {
+ content: "\f247"
+}
+
+.fa-object-ungroup:before {
+ content: "\f248"
+}
+
+.fa-octopus-deploy:before {
+ content: "\e082"
+}
+
+.fa-odnoklassniki:before {
+ content: "\f263"
+}
+
+.fa-odnoklassniki-square:before {
+ content: "\f264"
+}
+
+.fa-oil-can:before {
+ content: "\f613"
+}
+
+.fa-old-republic:before {
+ content: "\f510"
+}
+
+.fa-om:before {
+ content: "\f679"
+}
+
+.fa-opencart:before {
+ content: "\f23d"
+}
+
+.fa-openid:before {
+ content: "\f19b"
+}
+
+.fa-opera:before {
+ content: "\f26a"
+}
+
+.fa-optin-monster:before {
+ content: "\f23c"
+}
+
+.fa-orcid:before {
+ content: "\f8d2"
+}
+
+.fa-osi:before {
+ content: "\f41a"
+}
+
+.fa-otter:before {
+ content: "\f700"
+}
+
+.fa-outdent:before {
+ content: "\f03b"
+}
+
+.fa-page4:before {
+ content: "\f3d7"
+}
+
+.fa-pagelines:before {
+ content: "\f18c"
+}
+
+.fa-pager:before {
+ content: "\f815"
+}
+
+.fa-paint-brush:before {
+ content: "\f1fc"
+}
+
+.fa-paint-roller:before {
+ content: "\f5aa"
+}
+
+.fa-palette:before {
+ content: "\f53f"
+}
+
+.fa-palfed:before {
+ content: "\f3d8"
+}
+
+.fa-pallet:before {
+ content: "\f482"
+}
+
+.fa-paper-plane:before {
+ content: "\f1d8"
+}
+
+.fa-paperclip:before {
+ content: "\f0c6"
+}
+
+.fa-parachute-box:before {
+ content: "\f4cd"
+}
+
+.fa-paragraph:before {
+ content: "\f1dd"
+}
+
+.fa-parking:before {
+ content: "\f540"
+}
+
+.fa-passport:before {
+ content: "\f5ab"
+}
+
+.fa-pastafarianism:before {
+ content: "\f67b"
+}
+
+.fa-paste:before {
+ content: "\f0ea"
+}
+
+.fa-patreon:before {
+ content: "\f3d9"
+}
+
+.fa-pause:before {
+ content: "\f04c"
+}
+
+.fa-pause-circle:before {
+ content: "\f28b"
+}
+
+.fa-paw:before {
+ content: "\f1b0"
+}
+
+.fa-paypal:before {
+ content: "\f1ed"
+}
+
+.fa-peace:before {
+ content: "\f67c"
+}
+
+.fa-pen:before {
+ content: "\f304"
+}
+
+.fa-pen-alt:before {
+ content: "\f305"
+}
+
+.fa-pen-fancy:before {
+ content: "\f5ac"
+}
+
+.fa-pen-nib:before {
+ content: "\f5ad"
+}
+
+.fa-pen-square:before {
+ content: "\f14b"
+}
+
+.fa-pencil-alt:before {
+ content: "\f303"
+}
+
+.fa-pencil-ruler:before {
+ content: "\f5ae"
+}
+
+.fa-penny-arcade:before {
+ content: "\f704"
+}
+
+.fa-people-arrows:before {
+ content: "\e068"
+}
+
+.fa-people-carry:before {
+ content: "\f4ce"
+}
+
+.fa-pepper-hot:before {
+ content: "\f816"
+}
+
+.fa-perbyte:before {
+ content: "\e083"
+}
+
+.fa-percent:before {
+ content: "\f295"
+}
+
+.fa-percentage:before {
+ content: "\f541"
+}
+
+.fa-periscope:before {
+ content: "\f3da"
+}
+
+.fa-person-booth:before {
+ content: "\f756"
+}
+
+.fa-phabricator:before {
+ content: "\f3db"
+}
+
+.fa-phoenix-framework:before {
+ content: "\f3dc"
+}
+
+.fa-phoenix-squadron:before {
+ content: "\f511"
+}
+
+.fa-phone:before {
+ content: "\f095"
+}
+
+.fa-phone-alt:before {
+ content: "\f879"
+}
+
+.fa-phone-slash:before {
+ content: "\f3dd"
+}
+
+.fa-phone-square:before {
+ content: "\f098"
+}
+
+.fa-phone-square-alt:before {
+ content: "\f87b"
+}
+
+.fa-phone-volume:before {
+ content: "\f2a0"
+}
+
+.fa-photo-video:before {
+ content: "\f87c"
+}
+
+.fa-php:before {
+ content: "\f457"
+}
+
+.fa-pied-piper:before {
+ content: "\f2ae"
+}
+
+.fa-pied-piper-alt:before {
+ content: "\f1a8"
+}
+
+.fa-pied-piper-hat:before {
+ content: "\f4e5"
+}
+
+.fa-pied-piper-pp:before {
+ content: "\f1a7"
+}
+
+.fa-pied-piper-square:before {
+ content: "\e01e"
+}
+
+.fa-piggy-bank:before {
+ content: "\f4d3"
+}
+
+.fa-pills:before {
+ content: "\f484"
+}
+
+.fa-pinterest:before {
+ content: "\f0d2"
+}
+
+.fa-pinterest-p:before {
+ content: "\f231"
+}
+
+.fa-pinterest-square:before {
+ content: "\f0d3"
+}
+
+.fa-pizza-slice:before {
+ content: "\f818"
+}
+
+.fa-place-of-worship:before {
+ content: "\f67f"
+}
+
+.fa-plane:before {
+ content: "\f072"
+}
+
+.fa-plane-arrival:before {
+ content: "\f5af"
+}
+
+.fa-plane-departure:before {
+ content: "\f5b0"
+}
+
+.fa-plane-slash:before {
+ content: "\e069"
+}
+
+.fa-play:before {
+ content: "\f04b"
+}
+
+.fa-play-circle:before {
+ content: "\f144"
+}
+
+.fa-playstation:before {
+ content: "\f3df"
+}
+
+.fa-plug:before {
+ content: "\f1e6"
+}
+
+.fa-plus:before {
+ content: "\f067"
+}
+
+.fa-plus-circle:before {
+ content: "\f055"
+}
+
+.fa-plus-square:before {
+ content: "\f0fe"
+}
+
+.fa-podcast:before {
+ content: "\f2ce"
+}
+
+.fa-poll:before {
+ content: "\f681"
+}
+
+.fa-poll-h:before {
+ content: "\f682"
+}
+
+.fa-poo:before {
+ content: "\f2fe"
+}
+
+.fa-poo-storm:before {
+ content: "\f75a"
+}
+
+.fa-poop:before {
+ content: "\f619"
+}
+
+.fa-portrait:before {
+ content: "\f3e0"
+}
+
+.fa-pound-sign:before {
+ content: "\f154"
+}
+
+.fa-power-off:before {
+ content: "\f011"
+}
+
+.fa-pray:before {
+ content: "\f683"
+}
+
+.fa-praying-hands:before {
+ content: "\f684"
+}
+
+.fa-prescription:before {
+ content: "\f5b1"
+}
+
+.fa-prescription-bottle:before {
+ content: "\f485"
+}
+
+.fa-prescription-bottle-alt:before {
+ content: "\f486"
+}
+
+.fa-print:before {
+ content: "\f02f"
+}
+
+.fa-procedures:before {
+ content: "\f487"
+}
+
+.fa-product-hunt:before {
+ content: "\f288"
+}
+
+.fa-project-diagram:before {
+ content: "\f542"
+}
+
+.fa-pump-medical:before {
+ content: "\e06a"
+}
+
+.fa-pump-soap:before {
+ content: "\e06b"
+}
+
+.fa-pushed:before {
+ content: "\f3e1"
+}
+
+.fa-puzzle-piece:before {
+ content: "\f12e"
+}
+
+.fa-python:before {
+ content: "\f3e2"
+}
+
+.fa-qq:before {
+ content: "\f1d6"
+}
+
+.fa-qrcode:before {
+ content: "\f029"
+}
+
+.fa-question:before {
+ content: "\f128"
+}
+
+.fa-question-circle:before {
+ content: "\f059"
+}
+
+.fa-quidditch:before {
+ content: "\f458"
+}
+
+.fa-quinscape:before {
+ content: "\f459"
+}
+
+.fa-quora:before {
+ content: "\f2c4"
+}
+
+.fa-quote-left:before {
+ content: "\f10d"
+}
+
+.fa-quote-right:before {
+ content: "\f10e"
+}
+
+.fa-quran:before {
+ content: "\f687"
+}
+
+.fa-r-project:before {
+ content: "\f4f7"
+}
+
+.fa-radiation:before {
+ content: "\f7b9"
+}
+
+.fa-radiation-alt:before {
+ content: "\f7ba"
+}
+
+.fa-rainbow:before {
+ content: "\f75b"
+}
+
+.fa-random:before {
+ content: "\f074"
+}
+
+.fa-raspberry-pi:before {
+ content: "\f7bb"
+}
+
+.fa-ravelry:before {
+ content: "\f2d9"
+}
+
+.fa-react:before {
+ content: "\f41b"
+}
+
+.fa-reacteurope:before {
+ content: "\f75d"
+}
+
+.fa-readme:before {
+ content: "\f4d5"
+}
+
+.fa-rebel:before {
+ content: "\f1d0"
+}
+
+.fa-receipt:before {
+ content: "\f543"
+}
+
+.fa-record-vinyl:before {
+ content: "\f8d9"
+}
+
+.fa-recycle:before {
+ content: "\f1b8"
+}
+
+.fa-red-river:before {
+ content: "\f3e3"
+}
+
+.fa-reddit:before {
+ content: "\f1a1"
+}
+
+.fa-reddit-alien:before {
+ content: "\f281"
+}
+
+.fa-reddit-square:before {
+ content: "\f1a2"
+}
+
+.fa-redhat:before {
+ content: "\f7bc"
+}
+
+.fa-redo:before {
+ content: "\f01e"
+}
+
+.fa-redo-alt:before {
+ content: "\f2f9"
+}
+
+.fa-registered:before {
+ content: "\f25d"
+}
+
+.fa-remove-format:before {
+ content: "\f87d"
+}
+
+.fa-renren:before {
+ content: "\f18b"
+}
+
+.fa-reply:before {
+ content: "\f3e5"
+}
+
+.fa-reply-all:before {
+ content: "\f122"
+}
+
+.fa-replyd:before {
+ content: "\f3e6"
+}
+
+.fa-republican:before {
+ content: "\f75e"
+}
+
+.fa-researchgate:before {
+ content: "\f4f8"
+}
+
+.fa-resolving:before {
+ content: "\f3e7"
+}
+
+.fa-restroom:before {
+ content: "\f7bd"
+}
+
+.fa-retweet:before {
+ content: "\f079"
+}
+
+.fa-rev:before {
+ content: "\f5b2"
+}
+
+.fa-ribbon:before {
+ content: "\f4d6"
+}
+
+.fa-ring:before {
+ content: "\f70b"
+}
+
+.fa-road:before {
+ content: "\f018"
+}
+
+.fa-robot:before {
+ content: "\f544"
+}
+
+.fa-rocket:before {
+ content: "\f135"
+}
+
+.fa-rocketchat:before {
+ content: "\f3e8"
+}
+
+.fa-rockrms:before {
+ content: "\f3e9"
+}
+
+.fa-route:before {
+ content: "\f4d7"
+}
+
+.fa-rss:before {
+ content: "\f09e"
+}
+
+.fa-rss-square:before {
+ content: "\f143"
+}
+
+.fa-ruble-sign:before {
+ content: "\f158"
+}
+
+.fa-ruler:before {
+ content: "\f545"
+}
+
+.fa-ruler-combined:before {
+ content: "\f546"
+}
+
+.fa-ruler-horizontal:before {
+ content: "\f547"
+}
+
+.fa-ruler-vertical:before {
+ content: "\f548"
+}
+
+.fa-running:before {
+ content: "\f70c"
+}
+
+.fa-rupee-sign:before {
+ content: "\f156"
+}
+
+.fa-rust:before {
+ content: "\e07a"
+}
+
+.fa-sad-cry:before {
+ content: "\f5b3"
+}
+
+.fa-sad-tear:before {
+ content: "\f5b4"
+}
+
+.fa-safari:before {
+ content: "\f267"
+}
+
+.fa-salesforce:before {
+ content: "\f83b"
+}
+
+.fa-sass:before {
+ content: "\f41e"
+}
+
+.fa-satellite:before {
+ content: "\f7bf"
+}
+
+.fa-satellite-dish:before {
+ content: "\f7c0"
+}
+
+.fa-save:before {
+ content: "\f0c7"
+}
+
+.fa-schlix:before {
+ content: "\f3ea"
+}
+
+.fa-school:before {
+ content: "\f549"
+}
+
+.fa-screwdriver:before {
+ content: "\f54a"
+}
+
+.fa-scribd:before {
+ content: "\f28a"
+}
+
+.fa-scroll:before {
+ content: "\f70e"
+}
+
+.fa-sd-card:before {
+ content: "\f7c2"
+}
+
+.fa-search:before {
+ content: "\f002"
+}
+
+.fa-search-dollar:before {
+ content: "\f688"
+}
+
+.fa-search-location:before {
+ content: "\f689"
+}
+
+.fa-search-minus:before {
+ content: "\f010"
+}
+
+.fa-search-plus:before {
+ content: "\f00e"
+}
+
+.fa-searchengin:before {
+ content: "\f3eb"
+}
+
+.fa-seedling:before {
+ content: "\f4d8"
+}
+
+.fa-sellcast:before {
+ content: "\f2da"
+}
+
+.fa-sellsy:before {
+ content: "\f213"
+}
+
+.fa-server:before {
+ content: "\f233"
+}
+
+.fa-servicestack:before {
+ content: "\f3ec"
+}
+
+.fa-shapes:before {
+ content: "\f61f"
+}
+
+.fa-share:before {
+ content: "\f064"
+}
+
+.fa-share-alt:before {
+ content: "\f1e0"
+}
+
+.fa-share-alt-square:before {
+ content: "\f1e1"
+}
+
+.fa-share-square:before {
+ content: "\f14d"
+}
+
+.fa-shekel-sign:before {
+ content: "\f20b"
+}
+
+.fa-shield-alt:before {
+ content: "\f3ed"
+}
+
+.fa-shield-virus:before {
+ content: "\e06c"
+}
+
+.fa-ship:before {
+ content: "\f21a"
+}
+
+.fa-shipping-fast:before {
+ content: "\f48b"
+}
+
+.fa-shirtsinbulk:before {
+ content: "\f214"
+}
+
+.fa-shoe-prints:before {
+ content: "\f54b"
+}
+
+.fa-shopify:before {
+ content: "\e057"
+}
+
+.fa-shopping-bag:before {
+ content: "\f290"
+}
+
+.fa-shopping-basket:before {
+ content: "\f291"
+}
+
+.fa-shopping-cart:before {
+ content: "\f07a"
+}
+
+.fa-shopware:before {
+ content: "\f5b5"
+}
+
+.fa-shower:before {
+ content: "\f2cc"
+}
+
+.fa-shuttle-van:before {
+ content: "\f5b6"
+}
+
+.fa-sign:before {
+ content: "\f4d9"
+}
+
+.fa-sign-in-alt:before {
+ content: "\f2f6"
+}
+
+.fa-sign-language:before {
+ content: "\f2a7"
+}
+
+.fa-sign-out-alt:before {
+ content: "\f2f5"
+}
+
+.fa-signal:before {
+ content: "\f012"
+}
+
+.fa-signature:before {
+ content: "\f5b7"
+}
+
+.fa-sim-card:before {
+ content: "\f7c4"
+}
+
+.fa-simplybuilt:before {
+ content: "\f215"
+}
+
+.fa-sink:before {
+ content: "\e06d"
+}
+
+.fa-sistrix:before {
+ content: "\f3ee"
+}
+
+.fa-sitemap:before {
+ content: "\f0e8"
+}
+
+.fa-sith:before {
+ content: "\f512"
+}
+
+.fa-skating:before {
+ content: "\f7c5"
+}
+
+.fa-sketch:before {
+ content: "\f7c6"
+}
+
+.fa-skiing:before {
+ content: "\f7c9"
+}
+
+.fa-skiing-nordic:before {
+ content: "\f7ca"
+}
+
+.fa-skull:before {
+ content: "\f54c"
+}
+
+.fa-skull-crossbones:before {
+ content: "\f714"
+}
+
+.fa-skyatlas:before {
+ content: "\f216"
+}
+
+.fa-skype:before {
+ content: "\f17e"
+}
+
+.fa-slack:before {
+ content: "\f198"
+}
+
+.fa-slack-hash:before {
+ content: "\f3ef"
+}
+
+.fa-slash:before {
+ content: "\f715"
+}
+
+.fa-sleigh:before {
+ content: "\f7cc"
+}
+
+.fa-sliders-h:before {
+ content: "\f1de"
+}
+
+.fa-slideshare:before {
+ content: "\f1e7"
+}
+
+.fa-smile:before {
+ content: "\f118"
+}
+
+.fa-smile-beam:before {
+ content: "\f5b8"
+}
+
+.fa-smile-wink:before {
+ content: "\f4da"
+}
+
+.fa-smog:before {
+ content: "\f75f"
+}
+
+.fa-smoking:before {
+ content: "\f48d"
+}
+
+.fa-smoking-ban:before {
+ content: "\f54d"
+}
+
+.fa-sms:before {
+ content: "\f7cd"
+}
+
+.fa-snapchat:before {
+ content: "\f2ab"
+}
+
+.fa-snapchat-ghost:before {
+ content: "\f2ac"
+}
+
+.fa-snapchat-square:before {
+ content: "\f2ad"
+}
+
+.fa-snowboarding:before {
+ content: "\f7ce"
+}
+
+.fa-snowflake:before {
+ content: "\f2dc"
+}
+
+.fa-snowman:before {
+ content: "\f7d0"
+}
+
+.fa-snowplow:before {
+ content: "\f7d2"
+}
+
+.fa-soap:before {
+ content: "\e06e"
+}
+
+.fa-socks:before {
+ content: "\f696"
+}
+
+.fa-solar-panel:before {
+ content: "\f5ba"
+}
+
+.fa-sort:before {
+ content: "\f0dc"
+}
+
+.fa-sort-alpha-down:before {
+ content: "\f15d"
+}
+
+.fa-sort-alpha-down-alt:before {
+ content: "\f881"
+}
+
+.fa-sort-alpha-up:before {
+ content: "\f15e"
+}
+
+.fa-sort-alpha-up-alt:before {
+ content: "\f882"
+}
+
+.fa-sort-amount-down:before {
+ content: "\f160"
+}
+
+.fa-sort-amount-down-alt:before {
+ content: "\f884"
+}
+
+.fa-sort-amount-up:before {
+ content: "\f161"
+}
+
+.fa-sort-amount-up-alt:before {
+ content: "\f885"
+}
+
+.fa-sort-down:before {
+ content: "\f0dd"
+}
+
+.fa-sort-numeric-down:before {
+ content: "\f162"
+}
+
+.fa-sort-numeric-down-alt:before {
+ content: "\f886"
+}
+
+.fa-sort-numeric-up:before {
+ content: "\f163"
+}
+
+.fa-sort-numeric-up-alt:before {
+ content: "\f887"
+}
+
+.fa-sort-up:before {
+ content: "\f0de"
+}
+
+.fa-soundcloud:before {
+ content: "\f1be"
+}
+
+.fa-sourcetree:before {
+ content: "\f7d3"
+}
+
+.fa-spa:before {
+ content: "\f5bb"
+}
+
+.fa-space-shuttle:before {
+ content: "\f197"
+}
+
+.fa-speakap:before {
+ content: "\f3f3"
+}
+
+.fa-speaker-deck:before {
+ content: "\f83c"
+}
+
+.fa-spell-check:before {
+ content: "\f891"
+}
+
+.fa-spider:before {
+ content: "\f717"
+}
+
+.fa-spinner:before {
+ content: "\f110"
+}
+
+.fa-splotch:before {
+ content: "\f5bc"
+}
+
+.fa-spotify:before {
+ content: "\f1bc"
+}
+
+.fa-spray-can:before {
+ content: "\f5bd"
+}
+
+.fa-square:before {
+ content: "\f0c8"
+}
+
+.fa-square-full:before {
+ content: "\f45c"
+}
+
+.fa-square-root-alt:before {
+ content: "\f698"
+}
+
+.fa-squarespace:before {
+ content: "\f5be"
+}
+
+.fa-stack-exchange:before {
+ content: "\f18d"
+}
+
+.fa-stack-overflow:before {
+ content: "\f16c"
+}
+
+.fa-stackpath:before {
+ content: "\f842"
+}
+
+.fa-stamp:before {
+ content: "\f5bf"
+}
+
+.fa-star:before {
+ content: "\f005"
+}
+
+.fa-star-and-crescent:before {
+ content: "\f699"
+}
+
+.fa-star-half:before {
+ content: "\f089"
+}
+
+.fa-star-half-alt:before {
+ content: "\f5c0"
+}
+
+.fa-star-of-david:before {
+ content: "\f69a"
+}
+
+.fa-star-of-life:before {
+ content: "\f621"
+}
+
+.fa-staylinked:before {
+ content: "\f3f5"
+}
+
+.fa-steam:before {
+ content: "\f1b6"
+}
+
+.fa-steam-square:before {
+ content: "\f1b7"
+}
+
+.fa-steam-symbol:before {
+ content: "\f3f6"
+}
+
+.fa-step-backward:before {
+ content: "\f048"
+}
+
+.fa-step-forward:before {
+ content: "\f051"
+}
+
+.fa-stethoscope:before {
+ content: "\f0f1"
+}
+
+.fa-sticker-mule:before {
+ content: "\f3f7"
+}
+
+.fa-sticky-note:before {
+ content: "\f249"
+}
+
+.fa-stop:before {
+ content: "\f04d"
+}
+
+.fa-stop-circle:before {
+ content: "\f28d"
+}
+
+.fa-stopwatch:before {
+ content: "\f2f2"
+}
+
+.fa-stopwatch-20:before {
+ content: "\e06f"
+}
+
+.fa-store:before {
+ content: "\f54e"
+}
+
+.fa-store-alt:before {
+ content: "\f54f"
+}
+
+.fa-store-alt-slash:before {
+ content: "\e070"
+}
+
+.fa-store-slash:before {
+ content: "\e071"
+}
+
+.fa-strava:before {
+ content: "\f428"
+}
+
+.fa-stream:before {
+ content: "\f550"
+}
+
+.fa-street-view:before {
+ content: "\f21d"
+}
+
+.fa-strikethrough:before {
+ content: "\f0cc"
+}
+
+.fa-stripe:before {
+ content: "\f429"
+}
+
+.fa-stripe-s:before {
+ content: "\f42a"
+}
+
+.fa-stroopwafel:before {
+ content: "\f551"
+}
+
+.fa-studiovinari:before {
+ content: "\f3f8"
+}
+
+.fa-stumbleupon:before {
+ content: "\f1a4"
+}
+
+.fa-stumbleupon-circle:before {
+ content: "\f1a3"
+}
+
+.fa-subscript:before {
+ content: "\f12c"
+}
+
+.fa-subway:before {
+ content: "\f239"
+}
+
+.fa-suitcase:before {
+ content: "\f0f2"
+}
+
+.fa-suitcase-rolling:before {
+ content: "\f5c1"
+}
+
+.fa-sun:before {
+ content: "\f185"
+}
+
+.fa-superpowers:before {
+ content: "\f2dd"
+}
+
+.fa-superscript:before {
+ content: "\f12b"
+}
+
+.fa-supple:before {
+ content: "\f3f9"
+}
+
+.fa-surprise:before {
+ content: "\f5c2"
+}
+
+.fa-suse:before {
+ content: "\f7d6"
+}
+
+.fa-swatchbook:before {
+ content: "\f5c3"
+}
+
+.fa-swift:before {
+ content: "\f8e1"
+}
+
+.fa-swimmer:before {
+ content: "\f5c4"
+}
+
+.fa-swimming-pool:before {
+ content: "\f5c5"
+}
+
+.fa-symfony:before {
+ content: "\f83d"
+}
+
+.fa-synagogue:before {
+ content: "\f69b"
+}
+
+.fa-sync:before {
+ content: "\f021"
+}
+
+.fa-sync-alt:before {
+ content: "\f2f1"
+}
+
+.fa-syringe:before {
+ content: "\f48e"
+}
+
+.fa-table:before {
+ content: "\f0ce"
+}
+
+.fa-table-tennis:before {
+ content: "\f45d"
+}
+
+.fa-tablet:before {
+ content: "\f10a"
+}
+
+.fa-tablet-alt:before {
+ content: "\f3fa"
+}
+
+.fa-tablets:before {
+ content: "\f490"
+}
+
+.fa-tachometer-alt:before {
+ content: "\f3fd"
+}
+
+.fa-tag:before {
+ content: "\f02b"
+}
+
+.fa-tags:before {
+ content: "\f02c"
+}
+
+.fa-tape:before {
+ content: "\f4db"
+}
+
+.fa-tasks:before {
+ content: "\f0ae"
+}
+
+.fa-taxi:before {
+ content: "\f1ba"
+}
+
+.fa-teamspeak:before {
+ content: "\f4f9"
+}
+
+.fa-teeth:before {
+ content: "\f62e"
+}
+
+.fa-teeth-open:before {
+ content: "\f62f"
+}
+
+.fa-telegram:before {
+ content: "\f2c6"
+}
+
+.fa-telegram-plane:before {
+ content: "\f3fe"
+}
+
+.fa-temperature-high:before {
+ content: "\f769"
+}
+
+.fa-temperature-low:before {
+ content: "\f76b"
+}
+
+.fa-tencent-weibo:before {
+ content: "\f1d5"
+}
+
+.fa-tenge:before {
+ content: "\f7d7"
+}
+
+.fa-terminal:before {
+ content: "\f120"
+}
+
+.fa-text-height:before {
+ content: "\f034"
+}
+
+.fa-text-width:before {
+ content: "\f035"
+}
+
+.fa-th:before {
+ content: "\f00a"
+}
+
+.fa-th-large:before {
+ content: "\f009"
+}
+
+.fa-th-list:before {
+ content: "\f00b"
+}
+
+.fa-the-red-yeti:before {
+ content: "\f69d"
+}
+
+.fa-theater-masks:before {
+ content: "\f630"
+}
+
+.fa-themeco:before {
+ content: "\f5c6"
+}
+
+.fa-themeisle:before {
+ content: "\f2b2"
+}
+
+.fa-thermometer:before {
+ content: "\f491"
+}
+
+.fa-thermometer-empty:before {
+ content: "\f2cb"
+}
+
+.fa-thermometer-full:before {
+ content: "\f2c7"
+}
+
+.fa-thermometer-half:before {
+ content: "\f2c9"
+}
+
+.fa-thermometer-quarter:before {
+ content: "\f2ca"
+}
+
+.fa-thermometer-three-quarters:before {
+ content: "\f2c8"
+}
+
+.fa-think-peaks:before {
+ content: "\f731"
+}
+
+.fa-thumbs-down:before {
+ content: "\f165"
+}
+
+.fa-thumbs-up:before {
+ content: "\f164"
+}
+
+.fa-thumbtack:before {
+ content: "\f08d"
+}
+
+.fa-ticket-alt:before {
+ content: "\f3ff"
+}
+
+.fa-tiktok:before {
+ content: "\e07b"
+}
+
+.fa-times:before {
+ content: "\f00d"
+}
+
+.fa-times-circle:before {
+ content: "\f057"
+}
+
+.fa-tint:before {
+ content: "\f043"
+}
+
+.fa-tint-slash:before {
+ content: "\f5c7"
+}
+
+.fa-tired:before {
+ content: "\f5c8"
+}
+
+.fa-toggle-off:before {
+ content: "\f204"
+}
+
+.fa-toggle-on:before {
+ content: "\f205"
+}
+
+.fa-toilet:before {
+ content: "\f7d8"
+}
+
+.fa-toilet-paper:before {
+ content: "\f71e"
+}
+
+.fa-toilet-paper-slash:before {
+ content: "\e072"
+}
+
+.fa-toolbox:before {
+ content: "\f552"
+}
+
+.fa-tools:before {
+ content: "\f7d9"
+}
+
+.fa-tooth:before {
+ content: "\f5c9"
+}
+
+.fa-torah:before {
+ content: "\f6a0"
+}
+
+.fa-torii-gate:before {
+ content: "\f6a1"
+}
+
+.fa-tractor:before {
+ content: "\f722"
+}
+
+.fa-trade-federation:before {
+ content: "\f513"
+}
+
+.fa-trademark:before {
+ content: "\f25c"
+}
+
+.fa-traffic-light:before {
+ content: "\f637"
+}
+
+.fa-trailer:before {
+ content: "\e041"
+}
+
+.fa-train:before {
+ content: "\f238"
+}
+
+.fa-tram:before {
+ content: "\f7da"
+}
+
+.fa-transgender:before {
+ content: "\f224"
+}
+
+.fa-transgender-alt:before {
+ content: "\f225"
+}
+
+.fa-trash:before {
+ content: "\f1f8"
+}
+
+.fa-trash-alt:before {
+ content: "\f2ed"
+}
+
+.fa-trash-restore:before {
+ content: "\f829"
+}
+
+.fa-trash-restore-alt:before {
+ content: "\f82a"
+}
+
+.fa-tree:before {
+ content: "\f1bb"
+}
+
+.fa-trello:before {
+ content: "\f181"
+}
+
+.fa-trophy:before {
+ content: "\f091"
+}
+
+.fa-truck:before {
+ content: "\f0d1"
+}
+
+.fa-truck-loading:before {
+ content: "\f4de"
+}
+
+.fa-truck-monster:before {
+ content: "\f63b"
+}
+
+.fa-truck-moving:before {
+ content: "\f4df"
+}
+
+.fa-truck-pickup:before {
+ content: "\f63c"
+}
+
+.fa-tshirt:before {
+ content: "\f553"
+}
+
+.fa-tty:before {
+ content: "\f1e4"
+}
+
+.fa-tumblr:before {
+ content: "\f173"
+}
+
+.fa-tumblr-square:before {
+ content: "\f174"
+}
+
+.fa-tv:before {
+ content: "\f26c"
+}
+
+.fa-twitch:before {
+ content: "\f1e8"
+}
+
+.fa-twitter:before {
+ content: "\f099"
+}
+
+.fa-twitter-square:before {
+ content: "\f081"
+}
+
+.fa-typo3:before {
+ content: "\f42b"
+}
+
+.fa-uber:before {
+ content: "\f402"
+}
+
+.fa-ubuntu:before {
+ content: "\f7df"
+}
+
+.fa-uikit:before {
+ content: "\f403"
+}
+
+.fa-umbraco:before {
+ content: "\f8e8"
+}
+
+.fa-umbrella:before {
+ content: "\f0e9"
+}
+
+.fa-umbrella-beach:before {
+ content: "\f5ca"
+}
+
+.fa-uncharted:before {
+ content: "\e084"
+}
+
+.fa-underline:before {
+ content: "\f0cd"
+}
+
+.fa-undo:before {
+ content: "\f0e2"
+}
+
+.fa-undo-alt:before {
+ content: "\f2ea"
+}
+
+.fa-uniregistry:before {
+ content: "\f404"
+}
+
+.fa-unity:before {
+ content: "\e049"
+}
+
+.fa-universal-access:before {
+ content: "\f29a"
+}
+
+.fa-university:before {
+ content: "\f19c"
+}
+
+.fa-unlink:before {
+ content: "\f127"
+}
+
+.fa-unlock:before {
+ content: "\f09c"
+}
+
+.fa-unlock-alt:before {
+ content: "\f13e"
+}
+
+.fa-unsplash:before {
+ content: "\e07c"
+}
+
+.fa-untappd:before {
+ content: "\f405"
+}
+
+.fa-upload:before {
+ content: "\f093"
+}
+
+.fa-ups:before {
+ content: "\f7e0"
+}
+
+.fa-usb:before {
+ content: "\f287"
+}
+
+.fa-user:before {
+ content: "\f007"
+}
+
+.fa-user-alt:before {
+ content: "\f406"
+}
+
+.fa-user-alt-slash:before {
+ content: "\f4fa"
+}
+
+.fa-user-astronaut:before {
+ content: "\f4fb"
+}
+
+.fa-user-check:before {
+ content: "\f4fc"
+}
+
+.fa-user-circle:before {
+ content: "\f2bd"
+}
+
+.fa-user-clock:before {
+ content: "\f4fd"
+}
+
+.fa-user-cog:before {
+ content: "\f4fe"
+}
+
+.fa-user-edit:before {
+ content: "\f4ff"
+}
+
+.fa-user-friends:before {
+ content: "\f500"
+}
+
+.fa-user-graduate:before {
+ content: "\f501"
+}
+
+.fa-user-injured:before {
+ content: "\f728"
+}
+
+.fa-user-lock:before {
+ content: "\f502"
+}
+
+.fa-user-md:before {
+ content: "\f0f0"
+}
+
+.fa-user-minus:before {
+ content: "\f503"
+}
+
+.fa-user-ninja:before {
+ content: "\f504"
+}
+
+.fa-user-nurse:before {
+ content: "\f82f"
+}
+
+.fa-user-plus:before {
+ content: "\f234"
+}
+
+.fa-user-secret:before {
+ content: "\f21b"
+}
+
+.fa-user-shield:before {
+ content: "\f505"
+}
+
+.fa-user-slash:before {
+ content: "\f506"
+}
+
+.fa-user-tag:before {
+ content: "\f507"
+}
+
+.fa-user-tie:before {
+ content: "\f508"
+}
+
+.fa-user-times:before {
+ content: "\f235"
+}
+
+.fa-users:before {
+ content: "\f0c0"
+}
+
+.fa-users-cog:before {
+ content: "\f509"
+}
+
+.fa-users-slash:before {
+ content: "\e073"
+}
+
+.fa-usps:before {
+ content: "\f7e1"
+}
+
+.fa-ussunnah:before {
+ content: "\f407"
+}
+
+.fa-utensil-spoon:before {
+ content: "\f2e5"
+}
+
+.fa-utensils:before {
+ content: "\f2e7"
+}
+
+.fa-vaadin:before {
+ content: "\f408"
+}
+
+.fa-vector-square:before {
+ content: "\f5cb"
+}
+
+.fa-venus:before {
+ content: "\f221"
+}
+
+.fa-venus-double:before {
+ content: "\f226"
+}
+
+.fa-venus-mars:before {
+ content: "\f228"
+}
+
+.fa-vest:before {
+ content: "\e085"
+}
+
+.fa-vest-patches:before {
+ content: "\e086"
+}
+
+.fa-viacoin:before {
+ content: "\f237"
+}
+
+.fa-viadeo:before {
+ content: "\f2a9"
+}
+
+.fa-viadeo-square:before {
+ content: "\f2aa"
+}
+
+.fa-vial:before {
+ content: "\f492"
+}
+
+.fa-vials:before {
+ content: "\f493"
+}
+
+.fa-viber:before {
+ content: "\f409"
+}
+
+.fa-video:before {
+ content: "\f03d"
+}
+
+.fa-video-slash:before {
+ content: "\f4e2"
+}
+
+.fa-vihara:before {
+ content: "\f6a7"
+}
+
+.fa-vimeo:before {
+ content: "\f40a"
+}
+
+.fa-vimeo-square:before {
+ content: "\f194"
+}
+
+.fa-vimeo-v:before {
+ content: "\f27d"
+}
+
+.fa-vine:before {
+ content: "\f1ca"
+}
+
+.fa-virus:before {
+ content: "\e074"
+}
+
+.fa-virus-slash:before {
+ content: "\e075"
+}
+
+.fa-viruses:before {
+ content: "\e076"
+}
+
+.fa-vk:before {
+ content: "\f189"
+}
+
+.fa-vnv:before {
+ content: "\f40b"
+}
+
+.fa-voicemail:before {
+ content: "\f897"
+}
+
+.fa-volleyball-ball:before {
+ content: "\f45f"
+}
+
+.fa-volume-down:before {
+ content: "\f027"
+}
+
+.fa-volume-mute:before {
+ content: "\f6a9"
+}
+
+.fa-volume-off:before {
+ content: "\f026"
+}
+
+.fa-volume-up:before {
+ content: "\f028"
+}
+
+.fa-vote-yea:before {
+ content: "\f772"
+}
+
+.fa-vr-cardboard:before {
+ content: "\f729"
+}
+
+.fa-vuejs:before {
+ content: "\f41f"
+}
+
+.fa-walking:before {
+ content: "\f554"
+}
+
+.fa-wallet:before {
+ content: "\f555"
+}
+
+.fa-warehouse:before {
+ content: "\f494"
+}
+
+.fa-watchman-monitoring:before {
+ content: "\e087"
+}
+
+.fa-water:before {
+ content: "\f773"
+}
+
+.fa-wave-square:before {
+ content: "\f83e"
+}
+
+.fa-waze:before {
+ content: "\f83f"
+}
+
+.fa-weebly:before {
+ content: "\f5cc"
+}
+
+.fa-weibo:before {
+ content: "\f18a"
+}
+
+.fa-weight:before {
+ content: "\f496"
+}
+
+.fa-weight-hanging:before {
+ content: "\f5cd"
+}
+
+.fa-weixin:before {
+ content: "\f1d7"
+}
+
+.fa-whatsapp:before {
+ content: "\f232"
+}
+
+.fa-whatsapp-square:before {
+ content: "\f40c"
+}
+
+.fa-wheelchair:before {
+ content: "\f193"
+}
+
+.fa-whmcs:before {
+ content: "\f40d"
+}
+
+.fa-wifi:before {
+ content: "\f1eb"
+}
+
+.fa-wikipedia-w:before {
+ content: "\f266"
+}
+
+.fa-wind:before {
+ content: "\f72e"
+}
+
+.fa-window-close:before {
+ content: "\f410"
+}
+
+.fa-window-maximize:before {
+ content: "\f2d0"
+}
+
+.fa-window-minimize:before {
+ content: "\f2d1"
+}
+
+.fa-window-restore:before {
+ content: "\f2d2"
+}
+
+.fa-windows:before {
+ content: "\f17a"
+}
+
+.fa-wine-bottle:before {
+ content: "\f72f"
+}
+
+.fa-wine-glass:before {
+ content: "\f4e3"
+}
+
+.fa-wine-glass-alt:before {
+ content: "\f5ce"
+}
+
+.fa-wix:before {
+ content: "\f5cf"
+}
+
+.fa-wizards-of-the-coast:before {
+ content: "\f730"
+}
+
+.fa-wodu:before {
+ content: "\e088"
+}
+
+.fa-wolf-pack-battalion:before {
+ content: "\f514"
+}
+
+.fa-won-sign:before {
+ content: "\f159"
+}
+
+.fa-wordpress:before {
+ content: "\f19a"
+}
+
+.fa-wordpress-simple:before {
+ content: "\f411"
+}
+
+.fa-wpbeginner:before {
+ content: "\f297"
+}
+
+.fa-wpexplorer:before {
+ content: "\f2de"
+}
+
+.fa-wpforms:before {
+ content: "\f298"
+}
+
+.fa-wpressr:before {
+ content: "\f3e4"
+}
+
+.fa-wrench:before {
+ content: "\f0ad"
+}
+
+.fa-x-ray:before {
+ content: "\f497"
+}
+
+.fa-xbox:before {
+ content: "\f412"
+}
+
+.fa-xing:before {
+ content: "\f168"
+}
+
+.fa-xing-square:before {
+ content: "\f169"
+}
+
+.fa-y-combinator:before {
+ content: "\f23b"
+}
+
+.fa-yahoo:before {
+ content: "\f19e"
+}
+
+.fa-yammer:before {
+ content: "\f840"
+}
+
+.fa-yandex:before {
+ content: "\f413"
+}
+
+.fa-yandex-international:before {
+ content: "\f414"
+}
+
+.fa-yarn:before {
+ content: "\f7e3"
+}
+
+.fa-yelp:before {
+ content: "\f1e9"
+}
+
+.fa-yen-sign:before {
+ content: "\f157"
+}
+
+.fa-yin-yang:before {
+ content: "\f6ad"
+}
+
+.fa-yoast:before {
+ content: "\f2b1"
+}
+
+.fa-youtube:before {
+ content: "\f167"
+}
+
+.fa-youtube-square:before {
+ content: "\f431"
+}
+
+.fa-zhihu:before {
+ content: "\f63f"
+}
+
+.sr-only {
+ border: 0;
+ clip: rect(0, 0, 0, 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px
+}
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ clip: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ position: static;
+ width: auto
+}
+
+@font-face {
+ font-family: "Font Awesome 5 Brands";
+ font-style: normal;
+ font-weight: 400;
+ font-display: block;
+ src: url(./webfonts/fa-brands-400.eot);
+ src: url(./webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"), url(./webfonts/fa-brands-400.woff2) format("woff2"), url(./webfonts/fa-brands-400.woff) format("woff"), url(./webfonts/fa-brands-400.ttf) format("truetype"), url(./webfonts/fa-brands-400.svg#fontawesome) format("svg")
+}
+
+.fab {
+ font-family: "Font Awesome 5 Brands"
+}
+
+@font-face {
+ font-family: "Font Awesome 5 Free";
+ font-style: normal;
+ font-weight: 400;
+ font-display: block;
+ src: url(./webfonts/fa-regular-400.eot);
+ src: url(./webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"), url(./webfonts/fa-regular-400.woff2) format("woff2"), url(./webfonts/fa-regular-400.woff) format("woff"), url(./webfonts/fa-regular-400.ttf) format("truetype"), url(./webfonts/fa-regular-400.svg#fontawesome) format("svg")
+}
+
+.fab, .far {
+ font-weight: 400
+}
+
+@font-face {
+ font-family: "Font Awesome 5 Free";
+ font-style: normal;
+ font-weight: 900;
+ font-display: block;
+ src: url(./webfonts/fa-solid-900.eot);
+ src: url(./webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"), url(./webfonts/fa-solid-900.woff2) format("woff2"), url(./webfonts/fa-solid-900.woff) format("woff"), url(./webfonts/fa-solid-900.ttf) format("truetype"), url(./webfonts/fa-solid-900.svg#fontawesome) format("svg")
+}
+
+.fa, .far, .fas {
+ font-family: "Font Awesome 5 Free"
+}
+
+.fa, .fas {
+ font-weight: 900
+}
\ No newline at end of file
diff --git a/public/static/plugs/zTree/img/diy/1_close.png b/public/static/plugs/zTree/img/diy/1_close.png
new file mode 100644
index 0000000..68ccb3c
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/1_close.png differ
diff --git a/public/static/plugs/zTree/img/diy/1_open.png b/public/static/plugs/zTree/img/diy/1_open.png
new file mode 100644
index 0000000..d6ff36d
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/1_open.png differ
diff --git a/public/static/plugs/zTree/img/diy/2.png b/public/static/plugs/zTree/img/diy/2.png
new file mode 100644
index 0000000..9eff506
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/2.png differ
diff --git a/public/static/plugs/zTree/img/diy/3.png b/public/static/plugs/zTree/img/diy/3.png
new file mode 100644
index 0000000..d7ba6d0
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/3.png differ
diff --git a/public/static/plugs/zTree/img/diy/4.png b/public/static/plugs/zTree/img/diy/4.png
new file mode 100644
index 0000000..753e2bf
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/4.png differ
diff --git a/public/static/plugs/zTree/img/diy/5.png b/public/static/plugs/zTree/img/diy/5.png
new file mode 100644
index 0000000..0c5eccd
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/5.png differ
diff --git a/public/static/plugs/zTree/img/diy/6.png b/public/static/plugs/zTree/img/diy/6.png
new file mode 100644
index 0000000..070b835
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/6.png differ
diff --git a/public/static/plugs/zTree/img/diy/7.png b/public/static/plugs/zTree/img/diy/7.png
new file mode 100644
index 0000000..532b037
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/7.png differ
diff --git a/public/static/plugs/zTree/img/diy/8.png b/public/static/plugs/zTree/img/diy/8.png
new file mode 100644
index 0000000..a8f3a86
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/8.png differ
diff --git a/public/static/plugs/zTree/img/diy/9.png b/public/static/plugs/zTree/img/diy/9.png
new file mode 100644
index 0000000..4db73cd
Binary files /dev/null and b/public/static/plugs/zTree/img/diy/9.png differ
diff --git a/public/static/plugs/zTree/img/line_conn.gif b/public/static/plugs/zTree/img/line_conn.gif
new file mode 100644
index 0000000..d561d36
Binary files /dev/null and b/public/static/plugs/zTree/img/line_conn.gif differ
diff --git a/public/static/plugs/zTree/img/loading.gif b/public/static/plugs/zTree/img/loading.gif
new file mode 100644
index 0000000..e8c2892
Binary files /dev/null and b/public/static/plugs/zTree/img/loading.gif differ
diff --git a/public/static/plugs/zTree/img/zTreeStandard.gif b/public/static/plugs/zTree/img/zTreeStandard.gif
new file mode 100644
index 0000000..50c94fd
Binary files /dev/null and b/public/static/plugs/zTree/img/zTreeStandard.gif differ
diff --git a/public/static/plugs/zTree/img/zTreeStandard.png b/public/static/plugs/zTree/img/zTreeStandard.png
new file mode 100644
index 0000000..ffda01e
Binary files /dev/null and b/public/static/plugs/zTree/img/zTreeStandard.png differ
diff --git a/public/static/plugs/zTree/jquery.ztree.all.min.js b/public/static/plugs/zTree/jquery.ztree.all.min.js
new file mode 100644
index 0000000..62e9dd8
--- /dev/null
+++ b/public/static/plugs/zTree/jquery.ztree.all.min.js
@@ -0,0 +1,3 @@
+!function($){var settings={},roots={},caches={},_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"}},_setting={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nodeClasses:{},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"},render:{name:null,title:null},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",headers:{},xhrFields:{},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}},_initRoot=function(e){var t=data.getRoot(e);t||(t={},data.setRoot(e,t)),data.nodeChildren(e,t,[]),t.expandTriggerFlag=!1,t.curSelectedList=[],t.noSelection=!0,t.createdNodes=[],t.zId=0,t._ver=(new Date).getTime()},_initCache=function(e){var t=data.getCache(e);t||(t={},data.setCache(e,t)),t.nodes=[],t.doms=[]},_bindEvent=function(d){var e=d.treeObj,t=consts.event;e.bind(t.NODECREATED,function(e,t,n){tools.apply(d.callback.onNodeCreated,[e,t,n])}),e.bind(t.CLICK,function(e,t,n,o,a){tools.apply(d.callback.onClick,[t,n,o,a])}),e.bind(t.EXPAND,function(e,t,n){tools.apply(d.callback.onExpand,[e,t,n])}),e.bind(t.COLLAPSE,function(e,t,n){tools.apply(d.callback.onCollapse,[e,t,n])}),e.bind(t.ASYNC_SUCCESS,function(e,t,n,o){tools.apply(d.callback.onAsyncSuccess,[e,t,n,o])}),e.bind(t.ASYNC_ERROR,function(e,t,n,o,a,r){tools.apply(d.callback.onAsyncError,[e,t,n,o,a,r])}),e.bind(t.REMOVE,function(e,t,n){tools.apply(d.callback.onRemove,[e,t,n])}),e.bind(t.SELECTED,function(e,t,n){tools.apply(d.callback.onSelected,[t,n])}),e.bind(t.UNSELECTED,function(e,t,n){tools.apply(d.callback.onUnSelected,[t,n])})},_unbindEvent=function(e){var t=e.treeObj,n=consts.event;t.unbind(n.NODECREATED).unbind(n.CLICK).unbind(n.EXPAND).unbind(n.COLLAPSE).unbind(n.ASYNC_SUCCESS).unbind(n.ASYNC_ERROR).unbind(n.REMOVE).unbind(n.SELECTED).unbind(n.UNSELECTED)},_eventProxy=function(e){var t=e.target,n=data.getSetting(e.data.treeId),o="",a=null,r="",d="",i=null,s=null,l=null;if(tools.eqs(e.type,"mousedown")?d="mousedown":tools.eqs(e.type,"mouseup")?d="mouseup":tools.eqs(e.type,"contextmenu")?d="contextmenu":tools.eqs(e.type,"click")?tools.eqs(t.tagName,"span")&&null!==t.getAttribute("treeNode"+consts.id.SWITCH)?(o=tools.getNodeMainDom(t).id,r="switchNode"):(l=tools.getMDom(n,t,[{tagName:"a",attrName:"treeNode"+consts.id.A}]))&&(o=tools.getNodeMainDom(l).id,r="clickNode"):tools.eqs(e.type,"dblclick")&&(d="dblclick",(l=tools.getMDom(n,t,[{tagName:"a",attrName:"treeNode"+consts.id.A}]))&&(o=tools.getNodeMainDom(l).id,r="switchNode")),0=r.length&&(n=-1):(r=data.nodeChildren(e,t,[]),n=-1),0=u.length-n.length)&&(a=-1);for(var p=0,f=n.length;p/g,">");e.push("",a,"")},makeDOMNodeLine:function(e,t,n){e.push("")},makeDOMNodeMainAfter:function(e,t,n){e.push("")},makeDOMNodeMainBefore:function(e,t,n){e.push("")},makeDOMNodeNameAfter:function(e,t,n){e.push("")},makeDOMNodeNameBefore:function(e,t,n){var o=data.nodeTitle(t,n),a=view.makeNodeUrl(t,n),r=view.makeNodeFontCss(t,n),d=view.makeNodeClasses(t,n),i=[];for(var s in r)i.push(s,":",r[s],";");e.push("/g,">"),"'"),e.push(">")},makeNodeFontCss:function(e,t){var n=tools.apply(e.view.fontCss,[e.treeId,t],e.view.fontCss);return n&&"function"!=typeof n?n:{}},makeNodeClasses:function(e,t){var n=tools.apply(e.view.nodeClasses,[e.treeId,t],e.view.nodeClasses);return n&&"function"!=typeof n?n:{add:[],remove:[]}},makeNodeIcoClass:function(e,t){var n=["ico"];if(!t.isAjaxing){var o=data.nodeIsParent(e,t);n[0]=(t.iconSkin?t.iconSkin+"_":"")+n[0],o?n.push(t.open?consts.folder.OPEN:consts.folder.CLOSE):n.push(consts.folder.DOCU)}return consts.className.BUTTON+" "+n.join("_")},makeNodeIcoStyle:function(e,t){var n=[];if(!t.isAjaxing){var o=data.nodeIsParent(e,t)&&t.iconOpen&&t.iconClose?t.open?t.iconOpen:t.iconClose:t[e.data.key.icon];o&&n.push("background:url(",o,") 0 0 no-repeat;"),0!=e.view.showIcon&&tools.apply(e.view.showIcon,[e.treeId,t],!0)||n.push("display:none;")}return n.join("")},makeNodeLineClass:function(e,t){var n=[];return e.view.showLine?0==t.level&&t.isFirstNode&&t.isLastNode?n.push(consts.line.ROOT):0==t.level&&t.isFirstNode?n.push(consts.line.ROOTS):t.isLastNode?n.push(consts.line.BOTTOM):n.push(consts.line.CENTER):n.push(consts.line.NOLINE),data.nodeIsParent(e,t)?n.push(t.open?consts.folder.OPEN:consts.folder.CLOSE):n.push(consts.folder.DOCU),view.makeNodeLineClassEx(t)+n.join("_")},makeNodeLineClassEx:function(e){return consts.className.BUTTON+" "+consts.className.LEVEL+e.level+" "+consts.className.SWITCH+" "},makeNodeTarget:function(e){return e.target||"_blank"},makeNodeUrl:function(e,t){var n=e.data.key.url;return t[n]?t[n]:null},makeUlHtml:function(e,t,n,o){n.push("")},makeUlLineClass:function(e,t){return e.view.showLine&&!t.isLastNode?consts.line.LINE:""},removeChildNodes:function(e,t){if(t){var n=data.nodeChildren(e,t);if(n){for(var o=0,a=n.length;on.bottom||o.right>n.right||o.left"))}),C.addZTreeTools(function(i,h){h.checkNode=function(e,t,c,h){var a=C.nodeChecked(i,e);if(!0!==e.chkDisabled&&(!0!==t&&!1!==t&&(t=!a),h=!!h,(a!==t||c)&&(!h||0!=o.apply(this.setting.callback.beforeCheck,[this.setting.treeId,e],!0))&&o.uCanDo(this.setting)&&this.setting.check.enable&&!0!==e.nocheck)){C.nodeChecked(i,e,t);var n=f(e,s.id.CHECK,this.setting);!c&&this.setting.check.chkStyle!==s.radio.STYLE||l.checkNodeRelation(this.setting,e),l.setChkClass(this.setting,n,e),l.repairParentChkClassWithSelf(this.setting,e),h&&this.setting.treeObj.trigger(s.event.CHECK,[null,this.setting.treeId,e])}},h.checkAllNodes=function(e){l.repairAllChk(this.setting,!!e)},h.getCheckedNodes=function(e){e=!1!==e;var t=C.nodeChildren(i,C.getRoot(this.setting));return C.getTreeCheckedNodes(this.setting,t,e)},h.getChangeCheckedNodes=function(){var e=C.nodeChildren(i,C.getRoot(this.setting));return C.getTreeChangeCheckedNodes(this.setting,e)},h.setChkDisabled=function(e,t,c,h){t=!!t,c=!!c,h=!!h,l.repairSonChkDisabled(this.setting,e,t,h),l.repairParentChkDisabled(this.setting,e.getParentNode(),t,c)};var a=h.updateNode;h.updateNode=function(e,t){if((a&&a.apply(h,arguments),e&&this.setting.check.enable)&&(f(e,this.setting).get(0)&&o.uCanDo(this.setting))){var c=f(e,s.id.CHECK,this.setting);1!=t&&this.setting.check.chkStyle!==s.radio.STYLE||l.checkNodeRelation(this.setting,e),l.setChkClass(this.setting,c,e),l.repairParentChkClassWithSelf(this.setting,e)}}});var n=l.createNodes;l.createNodes=function(e,t,c,h,a){n&&n.apply(l,arguments),c&&l.repairParentChkClassWithSelf(e,h)};var i=l.removeNode;l.removeNode=function(e,t){var c=t.getParentNode();i&&i.apply(l,arguments),t&&c&&(l.repairChkClass(e,c),l.repairParentChkClass(e,c))};var d=l.appendNodes;l.appendNodes=function(e,t,c,h,a,n,i){var r="";return d&&(r=d.apply(l,arguments)),h&&C.makeChkFlag(e,h),r}}(jQuery);
+!function(fe){var Ee={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"}},s={onHoverOverNode:function(e,t){var o=Re.getSetting(e.data.treeId),d=Re.getRoot(o);d.curHoverNode!=t&&s.onHoverOutNode(e),d.curHoverNode=t,be.addHoverDom(o,t)},onHoverOutNode:function(e,t){var o=Re.getSetting(e.data.treeId),d=Re.getRoot(o);d.curHoverNode&&!Re.isSelectedNode(o,d.curHoverNode)&&(be.removeTreeDom(o,d.curHoverNode),d.curHoverNode=null)},onMousedownNode:function(e,t){var o,d,Z=Re.getSetting(e.data.treeId),$=Re.getRoot(Z),J=Re.getRoots();if(2==e.button||!Z.edit.enable||!Z.edit.drag.isCopy&&!Z.edit.drag.isMove)return!0;var r=e.target,n=Re.getRoot(Z).curSelectedList,ee=[];if(Re.isSelectedNode(Z,t))for(o=0,d=n.length;o",Z),t=0,o=ee.length;tZ.edit.drag.maxShowNodeNum-1||((r=Pe("",Z)).append(Pe(d,he.id.A,Z).clone()),r.css("padding","0"),r.children("#"+d.tId+he.id.A).removeClass(he.node.CURSELECTED),te.append(r),t==Z.edit.drag.maxShowNodeNum-1&&(r=Pe(" ... ",Z),te.append(r)));te.attr("id",ee[0].tId+he.id.UL+"_tmp"),te.addClass(Z.treeObj.attr("class")),te.appendTo(ie),(oe=Pe("",Z)).attr("id","zTreeMove_arrow_tmp"),oe.appendTo(ie),Z.treeObj.trigger(he.event.DRAG,[e,Z.treeId,ee])}if(1==$.dragFlag){if(de&&oe.attr("id")==e.target.id&&ue&&e.clientX+ae.scrollLeft()+2>fe("#"+ue+he.id.A,de).offset().left){var s=fe("#"+ue+he.id.A,de);e.target=0Z.edit.drag.borderMin,b=fZ.edit.drag.borderMin,R=EZ.edit.drag.borderMin,P=IZ.edit.drag.borderMin,C=T>Z.edit.drag.borderMin&&f>Z.edit.drag.borderMin&&E>Z.edit.drag.borderMin&&I>Z.edit.drag.borderMin,w=h&&se.treeObj.scrollTop()<=0,M=b&&se.treeObj.scrollTop()+se.treeObj.height()+10>=m,_=R&&se.treeObj.scrollLeft()<=0,O=P&&se.treeObj.scrollLeft()+se.treeObj.width()+10>=p;if(e.target&&Ie.isChildOrSelf(e.target,se.treeId)){for(var D=e.target;D&&D.tagName&&!Ie.eqs(D.tagName,"li")&&D.id!=se.treeId;)D=D.parentNode;var y=!0;for(t=0,o=ee.length;tse.edit.drag.autoOpenTime&&Ie.apply(se.callback.beforeDragOpen,[se.treeId,L],!0)&&(be.switchNode(se,L),se.edit.drag.autoExpandTrigger&&se.treeObj.trigger(he.event.EXPAND,[se.treeId,L]))},se.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=L.tId)}}else F()}else ve=he.move.TYPE_INNER,de&&Ie.apply(se.edit.drag.inner,[se.treeId,ee,null],!!se.edit.drag.inner)?de.addClass(he.node.TMPTARGET_TREE):de=null,oe.css({display:"none"}),window.zTreeMoveTimer&&(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null);ce=ue,Ne=ve,Z.treeObj.trigger(he.event.DRAGMOVE,[e,Z.treeId,ee])}return!1}function Te(d){if(window.zTreeMoveTimer&&(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null),Ne=ce=null,ae.unbind("mousemove",s),ae.unbind("mouseup",Te),ae.unbind("selectstart",c),ie.css("cursor",""),de&&(de.removeClass(he.node.TMPTARGET_TREE),ue&&fe("#"+ue+he.id.A,de).removeClass(he.node.TMPTARGET_NODE+"_"+he.move.TYPE_PREV).removeClass(he.node.TMPTARGET_NODE+"_"+Ee.move.TYPE_NEXT).removeClass(he.node.TMPTARGET_NODE+"_"+Ee.move.TYPE_INNER)),Ie.showIfameMask(Z,!1),J.showHoverDom=!0,0!=$.dragFlag){var e,t,o;for(e=$.dragFlag=0,t=ee.length;e",e);l.appendTo(Pe("body",e)),o.dragMaskList.push(l)}}},view:{addEditBtn:function(e,t){if(!(t.editNameFlag||0";o.append(d),Pe(t,he.id.EDIT,e).bind("click",function(){return Ie.uCanDo(e)&&0!=Ie.apply(e.callback.beforeEditName,[e.treeId,t],!0)&&be.editNode(e,t),!1}).show()}},addRemoveBtn:function(e,t){if(!(t.editNameFlag||0";o.append(d),Pe(t,he.id.REMOVE,e).bind("click",function(){return Ie.uCanDo(e)&&0!=Ie.apply(e.callback.beforeRemove,[e.treeId,t],!0)&&(be.removeNode(e,t),e.treeObj.trigger(he.event.REMOVE,[e.treeId,t])),!1}).bind("mousedown",function(e){return!0}).show()}},addHoverDom:function(e,t){Re.getRoots().showHoverDom&&(t.isHover=!0,e.edit.enable&&(be.addEditBtn(e,t),be.addRemoveBtn(e,t)),Ie.apply(e.view.addHoverDom,[e.treeId,t]))},cancelCurEditNode:function(e,t,o){var d=Re.getRoot(e),r=d.curEditNode;if(r){var n=d.curEditInput,a=t||(o?Re.nodeName(e,r):n.val());if(!1===Ie.apply(e.callback.beforeRename,[e.treeId,r,a,o],!0))return!1;Re.nodeName(e,r,a),Pe(r,he.id.A,e).removeClass(he.node.CURSELECTED_EDIT),n.unbind(),be.setNodeName(e,r),r.editNameFlag=!1,d.curEditNode=null,d.curEditInput=null,be.selectNode(e,r,!1),e.treeObj.trigger(he.event.RENAME,[e.treeId,r,o])}return d.noSelection=!0},editNode:function(t,e){var o=Re.getRoot(t);if(be.editNodeBlur=!1,Re.isSelectedNode(t,e)&&o.curEditNode==e&&e.editNameFlag)setTimeout(function(){Ie.inputFocus(o.curEditInput)},0);else{e.editNameFlag=!0,be.removeTreeDom(t,e),be.cancelCurEditNode(t),be.selectNode(t,e,!1),Pe(e,he.id.SPAN,t).html("");var d=Pe(e,he.id.INPUT,t);d.attr("value",Re.nodeName(t,e)),t.edit.editNameSelectAll?Ie.inputSelect(d):Ie.inputFocus(d),d.bind("blur",function(e){be.editNodeBlur||be.cancelCurEditNode(t)}).bind("keydown",function(e){"13"==e.keyCode?(be.editNodeBlur=!0,be.cancelCurEditNode(t)):"27"==e.keyCode&&be.cancelCurEditNode(t,null,!0)}).bind("click",function(e){return!1}).bind("dblclick",function(e){return!1}),Pe(e,he.id.A,t).addClass(he.node.CURSELECTED_EDIT),o.curEditInput=d,o.noSelection=!1,o.curEditNode=e}},moveNode:function(e,t,o,d,r,n){var a=Re.getRoot(e);if(t!=o&&(!e.data.keep.leaf||!t||Re.nodeIsParent(e,t)||d!=he.move.TYPE_INNER)){var i=o.parentTId?o.getParentNode():a,l=null===t||t==a;l&&null===t&&(t=a),l&&(d=he.move.TYPE_INNER);var s,c,N=t.parentTId?t.getParentNode():a;if(d!=he.move.TYPE_PREV&&d!=he.move.TYPE_NEXT&&(d=he.move.TYPE_INNER),d==he.move.TYPE_INNER&&(l?o.parentTId=null:(Re.nodeIsParent(e,t)||(Re.nodeIsParent(e,t,!0),t.open=!!t.open,be.setNodeLineIcos(e,t)),o.parentTId=t.tId)),l)c=s=e.treeObj;else{if(n||d!=he.move.TYPE_INNER?n||be.expandCollapseNode(e,t.getParentNode(),!0,!1):be.expandCollapseNode(e,t,!0,!1),s=Pe(t,e),c=Pe(t,he.id.UL,e),s.get(0)&&!c.get(0)){var u=[];be.makeUlHtml(e,t,u,""),s.append(u.join(""))}c=Pe(t,he.id.UL,e)}var v=Pe(o,e);v.get(0)?s.get(0)||v.remove():v=be.appendNodes(e,o.level,[o],null,-1,!1,!0).join(""),c.get(0)&&d==he.move.TYPE_INNER?c.append(v):s.get(0)&&d==he.move.TYPE_PREV?s.before(v):s.get(0)&&d==he.move.TYPE_NEXT&&s.after(v);var g,m,p=-1,T=0,f=null,E=null,I=o.level,h=Re.nodeChildren(e,i),b=Re.nodeChildren(e,N),R=Re.nodeChildren(e,t);if(o.isFirstNode)p=0,1 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)) {
+ 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;
+ } else if (typeof node[key] == "string"){
+ node[key] = tools.eqs(node[key], "true");
+ } else {
+ node[key] = !!node[key];
+ }
+ return node[key];
+ },
+ nodeName: function (setting, node, newName) {
+ var key = setting.data.key.name;
+ if (typeof newName !== 'undefined') {
+ node[key] = newName;
+ }
+ var rawName = "" + node[key];
+ if(typeof setting.data.render.name === 'function') {
+ return setting.data.render.name.call(this,rawName,node);
+ }
+ return rawName;
+ },
+ nodeTitle: function (setting, node) {
+ var t = setting.data.key.title === "" ? setting.data.key.name : setting.data.key.title;
+ var rawTitle = "" + node[t];
+ if(typeof setting.data.render.title === 'function') {
+ return setting.data.render.title.call(this,rawTitle,node);
+ }
+ return rawTitle;
+ },
+ 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;
+ for (var i = 0, l = results.length; i < l; i++) {
+ var proxyResult = results[i];
+ if (proxyResult.nodeEventCallback) {
+ r = proxyResult.nodeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r;
+ }
+ if (proxyResult.treeEventCallback) {
+ 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,
+ headers: setting.async.headers,
+ xhrFields: setting.async.xhrFields,
+ 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, '&').replace(//g, '>');
+ html.push("", name, "");
+ },
+ makeDOMNodeLine: function (html, setting, node) {
+ html.push("");
+ },
+ makeDOMNodeMainAfter: function (html, setting, node) {
+ html.push("");
+ },
+ makeDOMNodeMainBefore: function (html, setting, node) {
+ html.push("");
+ },
+ makeDOMNodeNameAfter: function (html, setting, node) {
+ html.push("");
+ },
+ makeDOMNodeNameBefore: function (html, setting, node) {
+ var title = data.nodeTitle(setting, node),
+ url = view.makeNodeUrl(setting, node),
+ fontcss = view.makeNodeFontCss(setting, node),
+ nodeClasses = view.makeNodeClasses(setting, node),
+ fontStyle = [];
+ for (var f in fontcss) {
+ fontStyle.push(f, ":", fontcss[f], ";");
+ }
+ html.push(" 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, "'").replace(//g, '>'), "'");
+ }
+ 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 : {};
+ },
+ makeNodeClasses: function (setting, node) {
+ var classes = tools.apply(setting.view.nodeClasses, [setting.treeId, node], setting.view.nodeClasses);
+ return (classes && (typeof classes !== "function")) ? classes : {add:[], remove:[]};
+ },
+ 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("display:none;");
+ }
+ }
+ 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("");
+ html.push(content);
+ html.push("
");
+ },
+ 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 / 8
+ if (typeof Element === 'undefined' || typeof HTMLElement === '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;
+ }
+ // CC-BY jocki84@googlemail.com, https://gist.github.com/jocki84/6ffafd003387179a988e
+ if (!Element.prototype.scrollIntoViewIfNeeded) {
+ Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) {
+ "use strict";
+
+ function makeRange(start, length) {
+ return {"start": start, "length": length, "end": start + length};
+ }
+
+ function coverRange(inner, outer) {
+ if (
+ false === centerIfNeeded ||
+ (outer.start < inner.end && inner.start < outer.end)
+ ) {
+ return Math.max(
+ inner.end - outer.length,
+ Math.min(outer.start, inner.start)
+ );
+ }
+ return (inner.start + inner.end - outer.length) / 2;
+ }
+
+ function makePoint(x, y) {
+ return {
+ "x": x,
+ "y": y,
+ "translate": function translate(dX, dY) {
+ return makePoint(x + dX, y + dY);
+ }
+ };
+ }
+
+ function absolute(elem, pt) {
+ while (elem) {
+ pt = pt.translate(elem.offsetLeft, elem.offsetTop);
+ elem = elem.offsetParent;
+ }
+ return pt;
+ }
+
+ var target = absolute(this, makePoint(0, 0)),
+ extent = makePoint(this.offsetWidth, this.offsetHeight),
+ elem = this.parentNode,
+ origin;
+
+ while (elem instanceof HTMLElement) {
+ // Apply desired scroll amount.
+ origin = absolute(elem, makePoint(elem.clientLeft, elem.clientTop));
+ elem.scrollLeft = coverRange(
+ makeRange(target.x - origin.x, extent.x),
+ makeRange(elem.scrollLeft, elem.clientWidth)
+ );
+ elem.scrollTop = coverRange(
+ makeRange(target.y - origin.y, extent.y),
+ makeRange(elem.scrollTop, elem.clientHeight)
+ );
+
+ // Determine actual scroll amount by reading back scroll properties.
+ target = target.translate(-elem.scrollLeft, -elem.scrollTop);
+ elem = elem.parentNode;
+ }
+ };
+ }
+ 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);
+ }
+ },
+ setNodeClasses: function (setting, treeNode) {
+ var aObj = $$(treeNode, consts.id.A, setting),
+ classes = view.makeNodeClasses(setting, treeNode);
+ if ('add' in classes && classes.add.length) {
+ aObj.addClass(classes.add.join(' '));
+ }
+ if ('remove' in classes && classes.remove.length) {
+ aObj.removeClass(classes.remove.join(' '));
+ }
+ },
+ 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, consts.id.A, 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);
+ view.setNodeClasses(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/public/static/plugs/zTree/jquery.ztree.excheck.js b/public/static/plugs/zTree/jquery.ztree.excheck.js
new file mode 100644
index 0000000..44b5336
--- /dev/null
+++ b/public/static/plugs/zTree/jquery.ztree.excheck.js
@@ -0,0 +1,652 @@
+/*
+ * JQuery zTree excheck
+ * v3.5.48
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * Date: 2020-11-21
+ */
+
+(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);
+ 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("");
+ }
+ },
+ //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) {
+ 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(newChecked, "true");
+ }
+ newChecked = !!newChecked;
+ node[key] = newChecked;
+ } else if (typeof node[key] == "string"){
+ node[key] = tools.eqs(node[key], "true");
+ } else {
+ node[key] = !!node[key];
+ }
+ 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/public/static/plugs/zTree/webfonts/fa-regular-400.woff2 b/public/static/plugs/zTree/webfonts/fa-regular-400.woff2
new file mode 100644
index 0000000..5632894
Binary files /dev/null and b/public/static/plugs/zTree/webfonts/fa-regular-400.woff2 differ
diff --git a/public/static/plugs/zTree/webfonts/fa-solid-900.woff2 b/public/static/plugs/zTree/webfonts/fa-solid-900.woff2
new file mode 100644
index 0000000..2217164
Binary files /dev/null and b/public/static/plugs/zTree/webfonts/fa-solid-900.woff2 differ
diff --git a/public/static/plugs/zTree/zTreeStyle.css b/public/static/plugs/zTree/zTreeStyle.css
new file mode 100644
index 0000000..38eb0fd
--- /dev/null
+++ b/public/static/plugs/zTree/zTreeStyle.css
@@ -0,0 +1,250 @@
+/**
+ * @author zhixin wen
+ * version: 1.2.0
+ * https://github.com/wenzhixin/font-awesome-zTree
+ */
+.ztree * {
+ font-size: 14px;
+ font-family: inherit;
+}
+
+.ztree .fa, .ztree .fab, .ztree .fad, .ztree .fal, .ztree .far, .ztree .fas {
+ font-family: "Font Awesome 5 Free";
+}
+
+.ztree .ztree-search {
+ margin: 5px;
+}
+
+.ztree .ztree-search input {
+ padding: 5px 10px;
+}
+
+.ztree .ztree-search .search-clear {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1;
+}
+
+.ztree li ul {
+ position: relative;
+ background: none;
+ margin-left: 12px;
+ padding-left: 0;
+}
+
+.ztree li ul.line {
+ background: none;
+}
+
+.ztree li ul::before {
+ content: "";
+ display: block;
+ width: 0;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ border-left: 1px dotted #ccc;
+}
+
+.ztree li li {
+ position: relative;
+ padding-left: 9px;
+ line-height: inherit;
+}
+
+.ztree li li::before {
+ content: "";
+ display: block;
+ width: 10px;
+ height: 0;
+ border-top: 1px dotted #ccc;
+ position: absolute;
+ top: 13px;
+ left: 0;
+}
+
+.ztree li .noline_open + a + ul li::before {
+ border-top: none;
+}
+
+.ztree li .noline_open + a + ul::before {
+ border-left: none;
+}
+
+.ztree li span.node_name {
+ margin-right: 6px;
+}
+
+.ztree li span.button[class$=Page] {
+ width: 15px;
+}
+
+.ztree li span.button::before {
+ display: block;
+ line-height: 26px;
+ text-align: center;
+}
+
+.ztree li span.button.roots_docu, .ztree li span.button.center_docu, .ztree li span.button.bottom_docu {
+ position: relative;
+ height: 26px;
+ padding: 0;
+}
+
+.ztree li span.button.roots_docu::before, .ztree li span.button.center_docu::before, .ztree li span.button.bottom_docu::before {
+ content: "";
+ display: block;
+ width: 18px;
+ height: 0;
+ border-top: 1px dotted #ccc;
+ position: absolute;
+ top: 13px;
+ left: 0;
+}
+
+.ztree li span.button.root_open::before, .ztree li span.button.roots_open::before, .ztree li span.button.center_open::before, .ztree li span.button.bottom_open::before, .ztree li span.button.noline_open::before {
+ content: "\f146";
+ color: #3c8dbc;
+}
+
+.ztree li span.button.root_close::before, .ztree li span.button.roots_close::before, .ztree li span.button.center_close::before, .ztree li span.button.bottom_close::before, .ztree li span.button.noline_close::before {
+ content: "\f0fe";
+ color: #3c8dbc;
+}
+
+.ztree li span.button.chk {
+ color: #6b6b6b;
+}
+
+.ztree li span.button.chk[class$=focus]::before {
+ font-weight: bold;
+}
+
+.ztree li span.button.chk[class$=disable] {
+ color: #ccc;
+}
+
+.ztree li span.button.chk.checkbox_true_full::before, .ztree li span.button.chk.checkbox_true_disable::before, .ztree li span.button.chk.checkbox_true_full_focus::before {
+ content: "\f14a";
+ font-weight: normal !important;
+ color: #16b777;
+}
+
+.ztree li span.button.chk.checkbox_false_full::before, .ztree li span.button.chk.checkbox_false_disable::before, .ztree li span.button.chk.checkbox_false_full_focus::before {
+ content: "\f0c8";
+ font-weight: normal !important;
+}
+
+.ztree li span.button.chk.checkbox_true_part::before, .ztree li span.button.chk.checkbox_true_part_focus::before, .ztree li span.button.chk.checkbox_false_part::before, .ztree li span.button.chk.checkbox_false_part_focus::before {
+ content: "\f146";
+ font-weight: bold !important;
+ color: #16B777;
+}
+
+.ztree li span.button.chk.radio_true_full::before, .ztree li span.button.chk.radio_true_disable::before, .ztree li span.button.chk.radio_true_full_focus::before {
+ content: "\f058";
+ font-weight: normal !important;
+}
+
+.ztree li span.button.chk.radio_false_full::before, .ztree li span.button.chk.radio_false_disable::before, .ztree li span.button.chk.radio_false_full_focus::before {
+ content: "\f111";
+ font-weight: normal !important;
+}
+
+.ztree li span.button.chk.radio_true_part::before, .ztree li span.button.chk.radio_true_part_focus::before, .ztree li span.button.chk.radio_false_part::before, .ztree li span.button.chk.radio_false_part_focus::before {
+ content: "\f192";
+ font-weight: normal !important;
+}
+
+.ztree li span.button.ico_open::before {
+ content: "\f07c";
+}
+
+.ztree li span.button.ico_close::before {
+ content: "\f07b";
+}
+
+.ztree li span.button.ico_docu::before {
+ content: "\f15b";
+}
+
+.ztree li span.button.add::before {
+ content: "\f067";
+}
+
+.ztree li span.button.edit::before {
+ content: "\f044";
+}
+
+.ztree li span.button.remove::before {
+ content: "\f2ed";
+}
+
+.ztree li span.button.fa_history_ico_open::before, .ztree li span.button.fa_history_ico_close::before, .ztree li span.button.fa_history_ico_docu::before {
+ font-weight: bold !important;
+ content: "\f1da";
+}
+
+.ztree li span.button.fa_tasks_ico_open::before {
+ font-weight: bold !important;
+ content: "\f233";
+}
+
+.ztree li span.button.firstPage::before {
+ content: "\f100";
+}
+
+.ztree li span.button.prevPage::before {
+ content: "\f053";
+}
+
+.ztree li span.button.nextPage::before {
+ content: "\f054";
+}
+
+.ztree li span.button.lastPage::before {
+ content: "\f101";
+}
+
+.ztree li a span.button[style="width:0px;height:0px;"]::before, .ztree li a span.button[style^=background]::before {
+ content: "";
+}
+
+.ztree li a.curSelectedNode, .ztree li a.tmpTargetNode_inner {
+ height: 26px;
+}
+
+.ztree li > a {
+ height: 26px;
+ line-height: 26px;
+}
+
+.ztree li > span {
+ height: 26px;
+}
+
+.ztree li:last-child::before {
+ height: auto;
+ top: 13px;
+ bottom: 0;
+}
+
+.ztree li span.button.switch,
+.ztree li span.button.chk,
+.ztree li a span.button,
+.ztree li span.button[class$=Page] {
+ position: relative;
+ width: 21px;
+ height: 26px;
+ background: none;
+ background-position: center center !important;
+ padding: 2px 0;
+ vertical-align: middle;
+ display: inline-block;
+ font: normal normal normal 15px/1 "Font Awesome 5 Free";
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
\ No newline at end of file