CMS Tree Page View - Version 0.7.17

Version Description

  • Removed cookie.js
  • Updated jstree
  • If Keyboard Shortcuts was enabled for a user, title and content of a post could not be edited.
  • Drag and drop is now a bit more accurate and less "jerky"
  • Hopefully fixed the problem that moving a page resulted in WPML losing the connection between the languages
  • Dutch translation added
  • Hebrew translation added
  • Updated POT-file. Translators may want to check for added or updated words and sentences.
  • Fixed a notice-message
Download this release

Release Info

Developer eskapism
Plugin Icon wp plugin CMS Tree Page View
Version 0.7.17
Comparing to
See all releases

Code changes from version 0.7.15 to 0.7.17

functions.php CHANGED
@@ -237,7 +237,10 @@ function cms_tpv_get_selected_post_type() {
237
  // http://localhost/wp-admin/edit.php?post_type=movies&page=cms-tpv-page-xmovies
238
  // movies funkar inte:
239
  // http://localhost/wp-admin/admin.php?page=cms-tpv-page-movies
240
- $post_type = $_GET["post_type"];
 
 
 
241
  if (!$post_type) {
242
  // no post type, happens with ozh admin drop down, so get it via page instead
243
  $page = $_GET["page"];
@@ -365,6 +368,8 @@ function cms_tpv_print_common_tree_stuff($post_type = "") {
365
  <div class="cms_tpv_working">
366
  <?php _e("Loading...", 'cms-tree-page-view') ?>
367
  </div>
 
 
368
 
369
  <div class="updated below-h2 hidden cms_tpv_search_no_hits"><p><?php _e("Search: no pages found", 'cms-tree-page-view') ?></p></div>
370
 
@@ -551,7 +556,7 @@ function cms_tpv_print_childs($pageID, $view = "all", $arrOpenChilds = null, $po
551
  $screen = convert_to_screen("edit");
552
  $screen->post_type = null;
553
 
554
- ob_start(); // some plugins, for example magic fields, return javascript and things here. we're not campatible with that, so just swallow any output
555
  $posts_columns = get_column_headers($screen);
556
  ob_get_clean();
557
 
@@ -692,7 +697,7 @@ function cms_tpv_print_childs($pageID, $view = "all", $arrOpenChilds = null, $po
692
  "editlink": "<?php echo htmlspecialchars_decode($editLink) ?>",
693
  "modified_time": "<?php echo $post_modified_time ?>",
694
  "modified_author": "<?php echo $post_author ?>",
695
- "columns": "<?php echo rawurlencode($str_columns) ?>",
696
  "user_can_edit_page": "<?php echo (int) $user_can_edit_page ?>"
697
  }
698
  <?php
237
  // http://localhost/wp-admin/edit.php?post_type=movies&page=cms-tpv-page-xmovies
238
  // movies funkar inte:
239
  // http://localhost/wp-admin/admin.php?page=cms-tpv-page-movies
240
+ $post_type = NULL;
241
+ if (isset($_GET["post_type"])) {
242
+ $post_type = $_GET["post_type"];
243
+ }
244
  if (!$post_type) {
245
  // no post type, happens with ozh admin drop down, so get it via page instead
246
  $page = $_GET["page"];
368
  <div class="cms_tpv_working">
369
  <?php _e("Loading...", 'cms-tree-page-view') ?>
370
  </div>
371
+
372
+ <div class="cms_tpv_message updated below-h2 hidden"><p>Message goes here.</p></div>
373
 
374
  <div class="updated below-h2 hidden cms_tpv_search_no_hits"><p><?php _e("Search: no pages found", 'cms-tree-page-view') ?></p></div>
375
 
556
  $screen = convert_to_screen("edit");
557
  $screen->post_type = null;
558
 
559
+ ob_start(); // some plugins, for example magic fields, return javascript and things here. we're not compatible with that, so just swallow any output
560
  $posts_columns = get_column_headers($screen);
561
  ob_get_clean();
562
 
697
  "editlink": "<?php echo htmlspecialchars_decode($editLink) ?>",
698
  "modified_time": "<?php echo $post_modified_time ?>",
699
  "modified_author": "<?php echo $post_author ?>",
700
+ "columns": "<?php echo rawurlencode(utf8_decode($str_columns)) ?>",
701
  "user_can_edit_page": "<?php echo (int) $user_can_edit_page ?>"
702
  }
703
  <?php
index.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: CMS Tree Page View
4
  Plugin URI: http://eskapism.se/code-playground/cms-tree-page-view/
5
  Description: Adds a CMS-like tree view of all your pages, like the view often found in a page-focused CMS. Use the tree you to edit, view, add pages and search pages (very useful if you have many pages). And with drag and drop you can rearrange the order of your pages. Page management won't get any easier than this!
6
- Version: 0.7.15
7
  Author: Pär Thernström
8
  Author URI: http://eskapism.se/
9
  License: GPL2
@@ -28,7 +28,7 @@ License: GPL2
28
  #require("functions.php");
29
  require(dirname(__FILE__)."/functions.php");
30
 
31
- define( "CMS_TPV_VERSION", "0.7.15");
32
  define( "CMS_TPV_URL", WP_PLUGIN_URL . '/cms-tree-page-view/');
33
  define( "CMS_TPV_NAME", "CMS Tree Page View");
34
 
3
  Plugin Name: CMS Tree Page View
4
  Plugin URI: http://eskapism.se/code-playground/cms-tree-page-view/
5
  Description: Adds a CMS-like tree view of all your pages, like the view often found in a page-focused CMS. Use the tree you to edit, view, add pages and search pages (very useful if you have many pages). And with drag and drop you can rearrange the order of your pages. Page management won't get any easier than this!
6
+ Version: 0.7.17
7
  Author: Pär Thernström
8
  Author URI: http://eskapism.se/
9
  License: GPL2
28
  #require("functions.php");
29
  require(dirname(__FILE__)."/functions.php");
30
 
31
+ define( "CMS_TPV_VERSION", "0.7.17");
32
  define( "CMS_TPV_URL", WP_PLUGIN_URL . '/cms-tree-page-view/');
33
  define( "CMS_TPV_NAME", "CMS Tree Page View");
34
 
languages/cms-tree-page-view-he_IL.mo ADDED
Binary file
languages/cms-tree-page-view-he_IL.po ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of the WordPress plugin by .
2
+ # Copyright (C) 2010
3
+ # This file is distributed under the same license as the package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: cms-tree-page-view\n"
9
+ "Report-Msgid-Bugs-To: http://wordpress.org/tag/cms-tree-page-view\n"
10
+ "POT-Creation-Date: 2010-08-28 21:55+0000\n"
11
+ "PO-Revision-Date: 2011-02-28 23:55+0200\n"
12
+ "Last-Translator: shahar <asafgreenberg@gmail.com>\n"
13
+ "Language-Team: ותודה לאחי דקר <asafgreenberg@gmail.com>\n"
14
+ "MIME-Version: 1.0\n"
15
+ "Content-Type: text/plain; charset=utf-8\n"
16
+ "Content-Transfer-Encoding: 8bit\n"
17
+ "X-Poedit-Language: Hebrew\n"
18
+ "X-Poedit-Country: ISRAEL\n"
19
+ "X-Poedit-SourceCharset: utf-8\n"
20
+ "Plural-Forms: Plural-Forms: nplurals=2; plural=n != 1;\n"
21
+
22
+ #: functions.php:53
23
+ msgid "Enter title of new page"
24
+ msgstr "כתבי כותרת לעמוד החדש"
25
+
26
+ #: functions.php:54
27
+ msgid "child pages"
28
+ msgstr "עמודי-בת"
29
+
30
+ #: functions.php:55
31
+ #: functions.php:376
32
+ msgid "Edit page"
33
+ msgstr "עריכת עמוד"
34
+
35
+ #: functions.php:56
36
+ #: functions.php:377
37
+ msgid "View page"
38
+ msgstr "הצגת עמוד"
39
+
40
+ #: functions.php:57
41
+ #: functions.php:376
42
+ msgid "Edit"
43
+ msgstr "עריכה"
44
+
45
+ #: functions.php:58
46
+ #: functions.php:377
47
+ msgid "View"
48
+ msgstr "תצוגה"
49
+
50
+ #: functions.php:59
51
+ msgid "Add page"
52
+ msgstr "הוספת עמוד"
53
+
54
+ #: functions.php:60
55
+ #: functions.php:381
56
+ msgid "Add new page after"
57
+ msgstr "הוסיפי עמוד חדש אחרי"
58
+
59
+ #: functions.php:61
60
+ msgid "after"
61
+ msgstr "אחרי"
62
+
63
+ #: functions.php:62
64
+ msgid "inside"
65
+ msgstr "בתוך"
66
+
67
+ #: functions.php:63
68
+ msgid "Sorry, can't create a sub page to a page with status \"draft\"."
69
+ msgstr "'צטערת, לא יכולה ליצור תת-עמוד של עמוד בסטטוס \"טיוטה\""
70
+
71
+ #: functions.php:64
72
+ #: functions.php:385
73
+ msgid "Add new page inside"
74
+ msgstr "הוסיפת עמוד חדש בתוך"
75
+
76
+ #: functions.php:65
77
+ msgid "draft"
78
+ msgstr "טיוטה"
79
+
80
+ #: functions.php:66
81
+ msgid "future"
82
+ msgstr "עתידי"
83
+
84
+ #: functions.php:67
85
+ msgid "protected"
86
+ msgstr "מוגן"
87
+
88
+ #: functions.php:68
89
+ #: functions.php:586
90
+ msgid "pending"
91
+ msgstr "ממתין"
92
+
93
+ #: functions.php:69
94
+ msgid "private"
95
+ msgstr "פרטית"
96
+
97
+ #: functions.php:70
98
+ msgid "Password protected page"
99
+ msgstr "עמוד מוגן בסיסמה"
100
+
101
+ #: functions.php:71
102
+ msgid "Adding page..."
103
+ msgstr "מוסיפה עמוד..."
104
+
105
+ #: functions.php:172
106
+ msgid "settings"
107
+ msgstr "הגדרות"
108
+
109
+ #: functions.php:177
110
+ msgid "Select where to show a tree for pages and custom post types"
111
+ msgstr "בחרי היכן להציג עץ עבור עמודים ופוסטים מותאמות אישית"
112
+
113
+ #: functions.php:201
114
+ msgid "On dashboard"
115
+ msgstr "בלוח הבקרה"
116
+
117
+ #: functions.php:205
118
+ msgid "In menu"
119
+ msgstr "בתפריט"
120
+
121
+ #: functions.php:216
122
+ msgid "Save Changes"
123
+ msgstr "שמירת שינויים"
124
+
125
+ #: functions.php:333
126
+ msgid "No posts found."
127
+ msgstr "לא נמצאו פוסטים"
128
+
129
+ #: functions.php:339
130
+ msgid "All"
131
+ msgstr "הכל"
132
+
133
+ #: functions.php:340
134
+ msgid "Public"
135
+ msgstr "ציבורי"
136
+
137
+ #: functions.php:345
138
+ msgid "Expand"
139
+ msgstr "פתח הכל"
140
+
141
+ #: functions.php:346
142
+ msgid "Collapse"
143
+ msgstr "סגור הכל"
144
+
145
+ #: functions.php:354
146
+ msgid "Clear search"
147
+ msgstr "ניקוי"
148
+
149
+ #: functions.php:355
150
+ msgid "Search"
151
+ msgstr "חיפוש"
152
+
153
+ #: functions.php:356
154
+ msgid "Searching..."
155
+ msgstr "מחפשת..."
156
+
157
+ #: functions.php:357
158
+ msgid "Nothing found."
159
+ msgstr "לא מצאתי"
160
+
161
+ #: functions.php:363
162
+ msgid "Loading..."
163
+ msgstr "טוענת..."
164
+
165
+ #: functions.php:366
166
+ msgid "Search: no pages found"
167
+ msgstr "חיפוש: לא נמצאו עמודים"
168
+
169
+ #: functions.php:369
170
+ msgid "Loading tree"
171
+ msgstr "טוענת עץ"
172
+
173
+ #: functions.php:381
174
+ msgid "After"
175
+ msgstr "אחרי"
176
+
177
+ #: functions.php:385
178
+ msgid "Inside"
179
+ msgstr "בתוך"
180
+
181
+ #: functions.php:389
182
+ msgid "Can not create page inside of a page with draft status"
183
+ msgstr "לא יכולה ליצור עמוד בתוך עמוד טיוטה"
184
+
185
+ #: functions.php:392
186
+ msgid "Last modified"
187
+ msgstr "שונתה לאחרונה ב..."
188
+
189
+ #: functions.php:394
190
+ msgid "by"
191
+ msgstr "ע\"י"
192
+
193
+ #: functions.php:397
194
+ msgid "Page ID"
195
+ msgstr "מזהה עמוד (ID)"
196
+
197
+ #: functions.php:551
198
+ msgid "Unknown user"
199
+ msgstr "משתמשת לא ידועה"
200
+
201
+ #: functions.php:556
202
+ msgid "<Untitled page>"
203
+ msgstr "<ללא שם>"
204
+
205
+ #: functions.php:576
206
+ msgid "Comments"
207
+ msgstr "הערות"
208
+
209
+ #: functions.php:583
210
+ #, php-format
211
+ msgid "%s pending"
212
+ msgstr "ממתינה %s"
213
+
214
+ #: functions.php:593
215
+ msgctxt "comment count"
216
+ msgid "0"
217
+ msgstr "0"
218
+
219
+ #: functions.php:593
220
+ msgctxt "comment count"
221
+ msgid "1"
222
+ msgstr "1"
223
+
224
+ #: functions.php:593
225
+ msgctxt "comment count"
226
+ msgid "%"
227
+ msgstr "%"
228
+
229
+ #: functions.php:624
230
+ msgid "Click to edit. Drag to move."
231
+ msgstr "לחצי לעריכה. גררי להזזה"
232
+
233
+ #: functions.php:775
234
+ msgid "New page"
235
+ msgstr "עמוד חדש"
236
+
languages/cms-tree-page-view-nl_NL.mo ADDED
Binary file
languages/cms-tree-page-view-nl_NL.po ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of the WordPress plugin by .
2
+ # Copyright (C) 2010
3
+ # This file is distributed under the same license as the package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: CMS-tree-page-view\n"
9
+ "Report-Msgid-Bugs-To: http://wordpress.org/tag/cms-tree-page-view\n"
10
+ "POT-Creation-Date: 2010-08-28 21:55+0000\n"
11
+ "PO-Revision-Date: 2011-02-23 13:01+0100\n"
12
+ "Last-Translator: Cees van den Heuvel <cvandenheuvel@intermediad.nl>\n"
13
+ "Language-Team: Intermediad <cvandenheuvel@intermediad.nl>\n"
14
+ "MIME-Version: 1.0\n"
15
+ "Content-Type: text/plain; charset=UTF-8\n"
16
+ "Content-Transfer-Encoding: 8bit\n"
17
+ "X-Poedit-Language: Dutch\n"
18
+ "X-Poedit-Country: NETHERLANDS\n"
19
+
20
+ #: functions.php:53
21
+ msgid "Enter title of new page"
22
+ msgstr "Voer de titel van de nieuwe pagina in"
23
+
24
+ #: functions.php:54
25
+ msgid "child pages"
26
+ msgstr "dochter paginas"
27
+
28
+ #: functions.php:55
29
+ #: functions.php:376
30
+ msgid "Edit page"
31
+ msgstr "Wijzig pagina"
32
+
33
+ #: functions.php:56
34
+ #: functions.php:377
35
+ msgid "View page"
36
+ msgstr "Toon pagina"
37
+
38
+ #: functions.php:57
39
+ #: functions.php:376
40
+ msgid "Edit"
41
+ msgstr "Wijzig"
42
+
43
+ #: functions.php:58
44
+ #: functions.php:377
45
+ msgid "View"
46
+ msgstr "Toon"
47
+
48
+ #: functions.php:59
49
+ msgid "Add page"
50
+ msgstr "Voeg pagina toe"
51
+
52
+ #: functions.php:60
53
+ #: functions.php:381
54
+ msgid "Add new page after"
55
+ msgstr "Voeg nieuwe pagina toe na"
56
+
57
+ #: functions.php:61
58
+ msgid "after"
59
+ msgstr "na"
60
+
61
+ #: functions.php:62
62
+ msgid "inside"
63
+ msgstr "binnen"
64
+
65
+ #: functions.php:63
66
+ msgid "Sorry, can't create a sub page to a page with status \"draft\"."
67
+ msgstr "Sorry, kan geen sub pagina maken voor een pagina met de status \"draft\"."
68
+
69
+ #: functions.php:64
70
+ #: functions.php:385
71
+ msgid "Add new page inside"
72
+ msgstr "Voeg nieuwe pagina toe binnen"
73
+
74
+ #: functions.php:65
75
+ msgid "draft"
76
+ msgstr "concept"
77
+
78
+ #: functions.php:66
79
+ msgid "future"
80
+ msgstr "toekomstig"
81
+
82
+ #: functions.php:67
83
+ msgid "protected"
84
+ msgstr "beschermd"
85
+
86
+ #: functions.php:68
87
+ #: functions.php:586
88
+ msgid "pending"
89
+ msgstr "wacht"
90
+
91
+ #: functions.php:69
92
+ msgid "private"
93
+ msgstr "privé"
94
+
95
+ #: functions.php:70
96
+ msgid "Password protected page"
97
+ msgstr "Wachtwoord beschermde pagina"
98
+
99
+ #: functions.php:71
100
+ msgid "Adding page..."
101
+ msgstr "Toevoegen pagina ..."
102
+
103
+ #: functions.php:172
104
+ msgid "settings"
105
+ msgstr "instellingen"
106
+
107
+ #: functions.php:177
108
+ msgid "Select where to show a tree for pages and custom post types"
109
+ msgstr "Kies waar de boom voor pagina's en eigen berichttypes getoond wordt"
110
+
111
+ #: functions.php:201
112
+ msgid "On dashboard"
113
+ msgstr "Op het Dashboard"
114
+
115
+ #: functions.php:205
116
+ msgid "In menu"
117
+ msgstr "In het Menu"
118
+
119
+ #: functions.php:216
120
+ msgid "Save Changes"
121
+ msgstr "Opslaan wijzigingen"
122
+
123
+ #: functions.php:333
124
+ msgid "No posts found."
125
+ msgstr "Geen berichten gevonden."
126
+
127
+ #: functions.php:339
128
+ msgid "All"
129
+ msgstr "Alle"
130
+
131
+ #: functions.php:340
132
+ msgid "Public"
133
+ msgstr "Openbare"
134
+
135
+ #: functions.php:345
136
+ msgid "Expand"
137
+ msgstr "Uitklappen"
138
+
139
+ #: functions.php:346
140
+ msgid "Collapse"
141
+ msgstr "Inklappen"
142
+
143
+ #: functions.php:354
144
+ msgid "Clear search"
145
+ msgstr "Wis zoekcriteria"
146
+
147
+ #: functions.php:355
148
+ msgid "Search"
149
+ msgstr "Zoek"
150
+
151
+ #: functions.php:356
152
+ msgid "Searching..."
153
+ msgstr "Zoeken ..."
154
+
155
+ #: functions.php:357
156
+ msgid "Nothing found."
157
+ msgstr "Niets gevonden."
158
+
159
+ #: functions.php:363
160
+ msgid "Loading..."
161
+ msgstr "Laden ..."
162
+
163
+ #: functions.php:366
164
+ msgid "Search: no pages found"
165
+ msgstr "Zoek: geen paginas gevonden"
166
+
167
+ #: functions.php:369
168
+ msgid "Loading tree"
169
+ msgstr "Boom laden"
170
+
171
+ #: functions.php:381
172
+ msgid "After"
173
+ msgstr "Na"
174
+
175
+ #: functions.php:385
176
+ msgid "Inside"
177
+ msgstr "Binnen"
178
+
179
+ #: functions.php:389
180
+ msgid "Can not create page inside of a page with draft status"
181
+ msgstr "Kan geen pagina maken binnen een pagina met de status concept"
182
+
183
+ #: functions.php:392
184
+ msgid "Last modified"
185
+ msgstr "Laatst gewijzigd"
186
+
187
+ #: functions.php:394
188
+ msgid "by"
189
+ msgstr "door"
190
+
191
+ #: functions.php:397
192
+ msgid "Page ID"
193
+ msgstr "Pagina ID"
194
+
195
+ #: functions.php:551
196
+ msgid "Unknown user"
197
+ msgstr "Onbekende gebruiker"
198
+
199
+ #: functions.php:556
200
+ msgid "<Untitled page>"
201
+ msgstr "<Pagina zonder titel>"
202
+
203
+ #: functions.php:576
204
+ msgid "Comments"
205
+ msgstr "Opmerkingen"
206
+
207
+ #: functions.php:583
208
+ #, php-format
209
+ msgid "%s pending"
210
+ msgstr "% voortgang"
211
+
212
+ #: functions.php:593
213
+ msgctxt "comment count"
214
+ msgid "0"
215
+ msgstr "0"
216
+
217
+ #: functions.php:593
218
+ msgctxt "comment count"
219
+ msgid "1"
220
+ msgstr "1"
221
+
222
+ #: functions.php:593
223
+ msgctxt "comment count"
224
+ msgid "%"
225
+ msgstr "%"
226
+
227
+ #: functions.php:624
228
+ msgid "Click to edit. Drag to move."
229
+ msgstr "Klik om te wijzigen. Sleep om te verplaatsen."
230
+
231
+ #: functions.php:775
232
+ msgid "New page"
233
+ msgstr "Nieuwe pagina"
234
+
languages/cms-tree-page-view.pot CHANGED
@@ -1,20 +1,16 @@
1
- # Translation of the WordPress plugin by .
2
  # Copyright (C) 2010
3
  # This file is distributed under the same license as the package.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
5
- #
6
- #, fuzzy
7
  msgid ""
8
  msgstr ""
9
  "Project-Id-Version: \n"
10
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/cms-tree-page-view\n"
11
- "POT-Creation-Date: 2010-08-28 21:55+0000\n"
 
 
 
12
  "PO-Revision-Date: 2010-MO-DA HO:MI+ZONE\n"
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
15
- "MIME-Version: 1.0\n"
16
- "Content-Type: text/plain; charset=utf-8\n"
17
- "Content-Transfer-Encoding: 8bit\n"
18
 
19
  #: functions.php:53
20
  msgid "Enter title of new page"
@@ -24,19 +20,19 @@ msgstr ""
24
  msgid "child pages"
25
  msgstr ""
26
 
27
- #: functions.php:55 functions.php:376
28
  msgid "Edit page"
29
  msgstr ""
30
 
31
- #: functions.php:56 functions.php:377
32
  msgid "View page"
33
  msgstr ""
34
 
35
- #: functions.php:57 functions.php:376
36
  msgid "Edit"
37
  msgstr ""
38
 
39
- #: functions.php:58 functions.php:377
40
  msgid "View"
41
  msgstr ""
42
 
@@ -44,7 +40,7 @@ msgstr ""
44
  msgid "Add page"
45
  msgstr ""
46
 
47
- #: functions.php:60 functions.php:381
48
  msgid "Add new page after"
49
  msgstr ""
50
 
@@ -60,166 +56,202 @@ msgstr ""
60
  msgid "Sorry, can't create a sub page to a page with status \"draft\"."
61
  msgstr ""
62
 
63
- #: functions.php:64 functions.php:385
64
- msgid "Add new page inside"
65
  msgstr ""
66
 
67
  #: functions.php:65
 
 
 
 
 
 
 
 
68
  msgid "draft"
69
  msgstr ""
70
 
71
- #: functions.php:66
72
  msgid "future"
73
  msgstr ""
74
 
75
- #: functions.php:67
76
  msgid "protected"
77
  msgstr ""
78
 
79
- #: functions.php:68 functions.php:586
80
  msgid "pending"
81
  msgstr ""
82
 
83
- #: functions.php:69
84
  msgid "private"
85
  msgstr ""
86
 
87
- #: functions.php:70
 
 
 
 
88
  msgid "Password protected page"
89
  msgstr ""
90
 
91
- #: functions.php:71
92
  msgid "Adding page..."
93
  msgstr ""
94
 
95
- #: functions.php:172
96
  msgid "settings"
97
  msgstr ""
98
 
99
- #: functions.php:177
100
  msgid "Select where to show a tree for pages and custom post types"
101
  msgstr ""
102
 
103
- #: functions.php:201
104
  msgid "On dashboard"
105
  msgstr ""
106
 
107
- #: functions.php:205
108
  msgid "In menu"
109
  msgstr ""
110
 
111
- #: functions.php:216
112
  msgid "Save Changes"
113
  msgstr ""
114
 
115
- #: functions.php:333
116
  msgid "No posts found."
117
  msgstr ""
118
 
119
- #: functions.php:339
120
  msgid "All"
121
  msgstr ""
122
 
123
- #: functions.php:340
124
  msgid "Public"
125
  msgstr ""
126
 
127
- #: functions.php:345
 
 
 
 
128
  msgid "Expand"
129
  msgstr ""
130
 
131
- #: functions.php:346
132
  msgid "Collapse"
133
  msgstr ""
134
 
135
- #: functions.php:354
136
  msgid "Clear search"
137
  msgstr ""
138
 
139
- #: functions.php:355
140
  msgid "Search"
141
  msgstr ""
142
 
143
- #: functions.php:356
144
  msgid "Searching..."
145
  msgstr ""
146
 
147
- #: functions.php:357
148
  msgid "Nothing found."
149
  msgstr ""
150
 
151
- #: functions.php:363
152
  msgid "Loading..."
153
  msgstr ""
154
 
155
- #: functions.php:366
156
  msgid "Search: no pages found"
157
  msgstr ""
158
 
159
- #: functions.php:369
160
  msgid "Loading tree"
161
  msgstr ""
162
 
163
- #: functions.php:381
164
  msgid "After"
165
  msgstr ""
166
 
167
- #: functions.php:385
168
  msgid "Inside"
169
  msgstr ""
170
 
171
- #: functions.php:389
172
  msgid "Can not create page inside of a page with draft status"
173
  msgstr ""
174
 
175
- #: functions.php:392
176
  msgid "Last modified"
177
  msgstr ""
178
 
179
- #: functions.php:394
180
  msgid "by"
181
  msgstr ""
182
 
183
- #: functions.php:397
184
  msgid "Page ID"
185
  msgstr ""
186
 
187
- #: functions.php:551
188
  msgid "Unknown user"
189
  msgstr ""
190
 
191
- #: functions.php:556
192
  msgid "<Untitled page>"
193
  msgstr ""
194
 
195
- #: functions.php:576
196
  msgid "Comments"
197
  msgstr ""
198
 
199
- #: functions.php:583
200
- #, php-format
201
  msgid "%s pending"
202
  msgstr ""
203
 
204
- #: functions.php:593
205
  msgctxt "comment count"
206
  msgid "0"
207
  msgstr ""
208
 
209
- #: functions.php:593
210
  msgctxt "comment count"
211
  msgid "1"
212
  msgstr ""
213
 
214
- #: functions.php:593
215
  msgctxt "comment count"
216
  msgid "%"
217
  msgstr ""
218
 
219
- #: functions.php:624
220
  msgid "Click to edit. Drag to move."
221
  msgstr ""
222
 
223
- #: functions.php:775
224
  msgid "New page"
225
  msgstr ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  # Copyright (C) 2010
2
  # This file is distributed under the same license as the package.
 
 
 
3
  msgid ""
4
  msgstr ""
5
  "Project-Id-Version: \n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/cms-tree-page-view\n"
7
+ "POT-Creation-Date: 2011-03-06 14:33:36+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
  "PO-Revision-Date: 2010-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
 
 
 
14
 
15
  #: functions.php:53
16
  msgid "Enter title of new page"
20
  msgid "child pages"
21
  msgstr ""
22
 
23
+ #: functions.php:55 functions.php:381
24
  msgid "Edit page"
25
  msgstr ""
26
 
27
+ #: functions.php:56 functions.php:382
28
  msgid "View page"
29
  msgstr ""
30
 
31
+ #: functions.php:57 functions.php:381
32
  msgid "Edit"
33
  msgstr ""
34
 
35
+ #: functions.php:58 functions.php:382
36
  msgid "View"
37
  msgstr ""
38
 
40
  msgid "Add page"
41
  msgstr ""
42
 
43
+ #: functions.php:60 functions.php:386
44
  msgid "Add new page after"
45
  msgstr ""
46
 
56
  msgid "Sorry, can't create a sub page to a page with status \"draft\"."
57
  msgstr ""
58
 
59
+ #: functions.php:64
60
+ msgid "Sorry, can't create a sub page to a page with status \"trash\"."
61
  msgstr ""
62
 
63
  #: functions.php:65
64
+ msgid "Sorry, can't create a page after a page with status \"trash\"."
65
+ msgstr ""
66
+
67
+ #: functions.php:66 functions.php:390
68
+ msgid "Add new page inside"
69
+ msgstr ""
70
+
71
+ #: functions.php:67
72
  msgid "draft"
73
  msgstr ""
74
 
75
+ #: functions.php:68
76
  msgid "future"
77
  msgstr ""
78
 
79
+ #: functions.php:69
80
  msgid "protected"
81
  msgstr ""
82
 
83
+ #: functions.php:70 functions.php:644
84
  msgid "pending"
85
  msgstr ""
86
 
87
+ #: functions.php:71
88
  msgid "private"
89
  msgstr ""
90
 
91
+ #: functions.php:72
92
+ msgid "trash"
93
+ msgstr ""
94
+
95
+ #: functions.php:73
96
  msgid "Password protected page"
97
  msgstr ""
98
 
99
+ #: functions.php:74
100
  msgid "Adding page..."
101
  msgstr ""
102
 
103
+ #: functions.php:175
104
  msgid "settings"
105
  msgstr ""
106
 
107
+ #: functions.php:180
108
  msgid "Select where to show a tree for pages and custom post types"
109
  msgstr ""
110
 
111
+ #: functions.php:204
112
  msgid "On dashboard"
113
  msgstr ""
114
 
115
+ #: functions.php:208
116
  msgid "In menu"
117
  msgstr ""
118
 
119
+ #: functions.php:219
120
  msgid "Save Changes"
121
  msgstr ""
122
 
123
+ #: functions.php:335
124
  msgid "No posts found."
125
  msgstr ""
126
 
127
+ #: functions.php:341
128
  msgid "All"
129
  msgstr ""
130
 
131
+ #: functions.php:342
132
  msgid "Public"
133
  msgstr ""
134
 
135
+ #: functions.php:343
136
+ msgid "Trash"
137
+ msgstr ""
138
+
139
+ #: functions.php:348
140
  msgid "Expand"
141
  msgstr ""
142
 
143
+ #: functions.php:349
144
  msgid "Collapse"
145
  msgstr ""
146
 
147
+ #: functions.php:357
148
  msgid "Clear search"
149
  msgstr ""
150
 
151
+ #: functions.php:358
152
  msgid "Search"
153
  msgstr ""
154
 
155
+ #: functions.php:359
156
  msgid "Searching..."
157
  msgstr ""
158
 
159
+ #: functions.php:360
160
  msgid "Nothing found."
161
  msgstr ""
162
 
163
+ #: functions.php:366
164
  msgid "Loading..."
165
  msgstr ""
166
 
167
+ #: functions.php:371
168
  msgid "Search: no pages found"
169
  msgstr ""
170
 
171
+ #: functions.php:374
172
  msgid "Loading tree"
173
  msgstr ""
174
 
175
+ #: functions.php:386
176
  msgid "After"
177
  msgstr ""
178
 
179
+ #: functions.php:390
180
  msgid "Inside"
181
  msgstr ""
182
 
183
+ #: functions.php:394
184
  msgid "Can not create page inside of a page with draft status"
185
  msgstr ""
186
 
187
+ #: functions.php:397
188
  msgid "Last modified"
189
  msgstr ""
190
 
191
+ #: functions.php:399
192
  msgid "by"
193
  msgstr ""
194
 
195
+ #: functions.php:402
196
  msgid "Page ID"
197
  msgstr ""
198
 
199
+ #: functions.php:609
200
  msgid "Unknown user"
201
  msgstr ""
202
 
203
+ #: functions.php:614
204
  msgid "<Untitled page>"
205
  msgstr ""
206
 
207
+ #: functions.php:634
208
  msgid "Comments"
209
  msgstr ""
210
 
211
+ #: functions.php:641
 
212
  msgid "%s pending"
213
  msgstr ""
214
 
215
+ #: functions.php:651
216
  msgctxt "comment count"
217
  msgid "0"
218
  msgstr ""
219
 
220
+ #: functions.php:651
221
  msgctxt "comment count"
222
  msgid "1"
223
  msgstr ""
224
 
225
+ #: functions.php:651
226
  msgctxt "comment count"
227
  msgid "%"
228
  msgstr ""
229
 
230
+ #: functions.php:682
231
  msgid "Click to edit. Drag to move."
232
  msgstr ""
233
 
234
+ #: functions.php:833
235
  msgid "New page"
236
  msgstr ""
237
+
238
+ #: functions.php:1015
239
+ msgid "Close"
240
+ msgstr ""
241
+
242
+ #: functions.php:1016
243
+ msgid ""
244
+ "<strong>Thank you for using this plugin!</strong> If you need help please "
245
+ "check out the <a href=\"http://eskapism.se/code-playground/cms-tree-page-"
246
+ "view/?utm_source=wordpress&utm_medium=banner&utm_campaign=promobox\">plugin "
247
+ "homepage</a> or the <a href=\"http://wordpress.org/tags/cms-tree-page-view?"
248
+ "forum_id=10\">support forum</a>."
249
+ msgstr ""
250
+
251
+ #: functions.php:1017
252
+ msgid ""
253
+ "If you like this plugin, please <a href=\"http://eskapism.se/sida/donate/?"
254
+ "utm_source=wordpress&utm_medium=banner&utm_campaign=promobox\">support my "
255
+ "work by donating</a> - or at least say something nice about this plugin in a "
256
+ "blog post or tweet."
257
+ msgstr ""
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: http://eskapism.se/sida/donate/
4
  Tags: page, pages, posts, custom posts, tree, cms, dashboard, overview, drag-and-drop, rearrange, management, manage, admin
5
  Requires at least: 3.0
6
  Tested up to: 3.1
7
- Stable tag: 0.7.16
8
 
9
  Adds a tree of all your pages or custom posts. Use drag & drop to reorder your pages, and edit, view, add, and search your pages.
10
 
@@ -46,6 +46,7 @@ This plugin is available in the following languages:
46
  * Swedish
47
  * Czech
48
  * Italian
 
49
 
50
  #### Making the tree available for your vistors
51
  If you're looking for a version of this page tree that the vistors of your site can use, then check out
@@ -80,11 +81,23 @@ Now the tree with the pages will be visible both on the dashboard and in the men
80
 
81
  == Changelog ==
82
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  = 0.7.16 =
84
- * fix for wpml-languages with "-" in them, like chinese simplified or chinese traditional.
85
  http://wordpress.org/support/topic/plugin-cms-tree-page-view-broken-for-languages-with-a-in
86
- * fixed some problems with columns and utf-encoding
87
- * moved adding page to a box above the tree, so you won't get the feeling that the tree has been deleted when you add a page.
88
 
89
  = 0.7.15 =
90
  * Czech translation added
4
  Tags: page, pages, posts, custom posts, tree, cms, dashboard, overview, drag-and-drop, rearrange, management, manage, admin
5
  Requires at least: 3.0
6
  Tested up to: 3.1
7
+ Stable tag: 0.7.17
8
 
9
  Adds a tree of all your pages or custom posts. Use drag & drop to reorder your pages, and edit, view, add, and search your pages.
10
 
46
  * Swedish
47
  * Czech
48
  * Italian
49
+ * Dutch
50
 
51
  #### Making the tree available for your vistors
52
  If you're looking for a version of this page tree that the vistors of your site can use, then check out
81
 
82
  == Changelog ==
83
 
84
+ = 0.7.17 =
85
+
86
+ * Removed cookie.js
87
+ * Updated jstree
88
+ * If Keyboard Shortcuts was enabled for a user, title and content of a post could not be edited.
89
+ * Drag and drop is now a bit more accurate and less "jerky"
90
+ * Hopefully fixed the problem that moving a page resulted in WPML losing the connection between the languages
91
+ * Dutch translation added
92
+ * Hebrew translation added
93
+ * Updated POT-file. Translators may want to check for added or updated words and sentences.
94
+ * Fixed a notice-message
95
+
96
  = 0.7.16 =
97
+ * Fix for wpml-languages with "-" in them, like chinese simplified or chinese traditional.
98
  http://wordpress.org/support/topic/plugin-cms-tree-page-view-broken-for-languages-with-a-in
99
+ * Fixed some problems with columns and utf-encoding
100
+ * Moved adding page to a box above the tree, so you won't get the feeling that the tree has been deleted when you add a page.
101
 
102
  = 0.7.15 =
103
  * Czech translation added
scripts/cms_tree_page_view.js CHANGED
@@ -20,7 +20,7 @@ jQuery(function($) {
20
  "data" : function (n) {
21
  // the result is fed to the AJAX request `data` option
22
  if (n.data) {
23
- var post_id = n.data("jstree").post_id;
24
  return {
25
  "id": post_id
26
  }
@@ -142,7 +142,7 @@ jQuery(".cms_tpv_action_add_page_after").live("click", function() {
142
  var post_type = cms_tpv_get_post_type(this);
143
  var selected_lang = cms_tpv_get_wpml_selected_lang(this);
144
 
145
- var post_status = $this.closest("li").data("jstree").post_status;
146
 
147
  // not allowed when status is trash
148
  if (post_status == "trash") {
@@ -153,7 +153,7 @@ jQuery(".cms_tpv_action_add_page_after").live("click", function() {
153
  jPrompt(cmstpv_l10n.Enter_title_of_new_page, "", "CMS Tree Page View", function(new_page_title) {
154
  if (new_page_title) {
155
  var pageID = $this.parents("li:first").attr("id");
156
- $this.closest(".cms_tpv_container").html(cmstpv_l10n.Adding_page);
157
  jQuery.post(ajaxurl, {
158
  "action": "cms_tpv_add_page",
159
  "pageID": pageID,
@@ -176,7 +176,7 @@ jQuery(".cms_tpv_action_add_page_inside").live("click", function() {
176
  var post_type = cms_tpv_get_post_type(this);
177
  var selected_lang = cms_tpv_get_wpml_selected_lang(this);
178
 
179
- var post_status = $this.closest("li").data("jstree").post_status;
180
 
181
  // check page status, because we cant add a page inside a page with status draft or status trash
182
  // if we edit the page wordpress will forget the parent
@@ -196,7 +196,7 @@ jQuery(".cms_tpv_action_add_page_inside").live("click", function() {
196
  jPrompt(cmstpv_l10n.Enter_title_of_new_page, "", "CMS Tree Page View", function(new_page_title) {
197
  if (new_page_title) {
198
  var pageID = $this.parents("li:first").attr("id");
199
- $this.closest(".cms_tpv_container").html(cmstpv_l10n.Adding_page);
200
  jQuery.post(ajaxurl, {
201
  "action": "cms_tpv_add_page",
202
  "pageID": pageID,
@@ -238,17 +238,17 @@ function cms_tpv_mouseover_li(li) {
238
 
239
  // setup link for view page
240
  $view = div_actions_for_post_type.find(".cms_tpv_action_view");
241
- var permalink = $li.data("jstree").permalink;
242
  $view.attr("href", permalink);
243
 
244
  // setup link for edit page
245
  $edit = div_actions_for_post_type.find(".cms_tpv_action_edit");
246
- var editlink = $li.data("jstree").editlink;
247
  $edit.attr("href", editlink);
248
 
249
  // check if user is allowed to edit page
250
  var $cms_tpv_action_add_and_edit_page = div_actions_for_post_type.find(".cms_tpv_action_add_and_edit_page");
251
- if ($li.data("jstree").user_can_edit_page == 0) {
252
  // nooope
253
  $edit.hide();
254
  $cms_tpv_action_add_and_edit_page.hide();
@@ -258,11 +258,11 @@ function cms_tpv_mouseover_li(li) {
258
  }
259
 
260
  // ..and some extras
261
- div_actions_for_post_type.find(".cms_tpv_page_actions_modified_time").text($li.data("jstree").modified_time);
262
- div_actions_for_post_type.find(".cms_tpv_page_actions_modified_by").text($li.data("jstree").modified_author);
263
- div_actions_for_post_type.find(".cms_tpv_page_actions_page_id").text($li.data("jstree").post_id);
264
 
265
- div_actions_for_post_type.find(".cms_tpv_page_actions_columns").html( unescape($li.data("jstree").columns) );
266
 
267
  // position and show action div
268
  var $a = $li.find("a");
@@ -343,7 +343,7 @@ function cms_tpv_bind_clean_node() {
343
  var nodePosition = data.rslt.p;
344
  var nodeR = data.rslt.r;
345
  var nodeRef = data.rslt.or; // noden som positionen gäller versus
346
-
347
  /*
348
 
349
  // om ovanför
@@ -384,41 +384,43 @@ function cms_tpv_bind_clean_node() {
384
  action: "cms_tpv_move_page",
385
  "node_id": node_id,
386
  "ref_node_id": ref_node_id,
387
- type: nodePosition
 
388
  }, function(data, textStatus) {
389
  });
390
 
391
  });
392
 
393
  cms_tpv_tree.bind("clean_node.jstree", function(event, data) {
394
- obj = (data.rslt.obj);
395
  if (obj && obj != -1) {
396
  obj.each(function(i, elm) {
397
  var li = jQuery(elm);
398
  var aFirst = li.find("a:first");
399
-
400
  // check that we haven't added our stuff already
401
  if (li.data("done_cms_tpv_clean_node")) {
402
  return;
403
  } else {
404
  li.data("done_cms_tpv_clean_node", true);
405
  }
406
-
 
407
  // add number of children
408
- if (li.data("jstree")) {
409
- var childCount = li.data("jstree").childCount;
410
  if (childCount > 0) {
411
  aFirst.append("<span title='" + childCount + " " + cmstpv_l10n.child_pages + "' class='child_count'>("+childCount+")</span>");
412
  }
413
 
414
  // add protection type
415
- var rel = li.data("jstree").rel;
416
  if(rel == "password") {
417
  aFirst.find("ins").after("<span class='post_protected' title='" + cmstpv_l10n.Password_protected_page + "'>&nbsp;</span>");
418
  }
419
 
420
  // add page type
421
- var post_status = li.data("jstree").post_status;
422
  // post_status can be any value because of plugins like Edit flow
423
  // check if we have an existing translation for the string, otherwise use the post status directly
424
  var post_status_to_show = "";
@@ -430,7 +432,7 @@ function cms_tpv_bind_clean_node() {
430
  if (post_status != "publish") {
431
  aFirst.find("ins").first().after("<span class='post_type post_type_"+post_status+"'>" + post_status_to_show + "</span>");
432
  }
433
- }
434
 
435
  });
436
  }
@@ -502,7 +504,7 @@ jQuery("a.cms_tvp_switch_lang").live("click", function(e) {
502
  $wrapper.find("ul.cms_tvp_switch_langs a").removeClass("current");
503
  jQuery(this).addClass("current");
504
 
505
- var re = /cms_tpv_switch_language_code_([\w]+)/;
506
  var matches = re.exec( jQuery(this).attr("class") );
507
  var lang_code = matches[1];
508
  $wrapper.find("[name=cms_tpv_meta_wpml_language]").val(lang_code);
20
  "data" : function (n) {
21
  // the result is fed to the AJAX request `data` option
22
  if (n.data) {
23
+ var post_id = n.data("post_id");
24
  return {
25
  "id": post_id
26
  }
142
  var post_type = cms_tpv_get_post_type(this);
143
  var selected_lang = cms_tpv_get_wpml_selected_lang(this);
144
 
145
+ var post_status = $this.closest("li").data("post_status");
146
 
147
  // not allowed when status is trash
148
  if (post_status == "trash") {
153
  jPrompt(cmstpv_l10n.Enter_title_of_new_page, "", "CMS Tree Page View", function(new_page_title) {
154
  if (new_page_title) {
155
  var pageID = $this.parents("li:first").attr("id");
156
+ jQuery(".cms_tpv_message").html("<p>"+cmstpv_l10n.Adding_page+"</p>").slideDown("fast");
157
  jQuery.post(ajaxurl, {
158
  "action": "cms_tpv_add_page",
159
  "pageID": pageID,
176
  var post_type = cms_tpv_get_post_type(this);
177
  var selected_lang = cms_tpv_get_wpml_selected_lang(this);
178
 
179
+ var post_status = $this.closest("li").data("post_status");
180
 
181
  // check page status, because we cant add a page inside a page with status draft or status trash
182
  // if we edit the page wordpress will forget the parent
196
  jPrompt(cmstpv_l10n.Enter_title_of_new_page, "", "CMS Tree Page View", function(new_page_title) {
197
  if (new_page_title) {
198
  var pageID = $this.parents("li:first").attr("id");
199
+ jQuery(".cms_tpv_message").html("<p>" + cmstpv_l10n.Adding_page + "</p>").slideDown("fast");
200
  jQuery.post(ajaxurl, {
201
  "action": "cms_tpv_add_page",
202
  "pageID": pageID,
238
 
239
  // setup link for view page
240
  $view = div_actions_for_post_type.find(".cms_tpv_action_view");
241
+ var permalink = $li.data("permalink");
242
  $view.attr("href", permalink);
243
 
244
  // setup link for edit page
245
  $edit = div_actions_for_post_type.find(".cms_tpv_action_edit");
246
+ var editlink = $li.data("editlink");
247
  $edit.attr("href", editlink);
248
 
249
  // check if user is allowed to edit page
250
  var $cms_tpv_action_add_and_edit_page = div_actions_for_post_type.find(".cms_tpv_action_add_and_edit_page");
251
+ if ($li.data("user_can_edit_page") == 0) {
252
  // nooope
253
  $edit.hide();
254
  $cms_tpv_action_add_and_edit_page.hide();
258
  }
259
 
260
  // ..and some extras
261
+ div_actions_for_post_type.find(".cms_tpv_page_actions_modified_time").text($li.data("modified_time"));
262
+ div_actions_for_post_type.find(".cms_tpv_page_actions_modified_by").text($li.data("modified_author"));
263
+ div_actions_for_post_type.find(".cms_tpv_page_actions_page_id").text($li.data("post_id"));
264
 
265
+ div_actions_for_post_type.find(".cms_tpv_page_actions_columns").html( unescape($li.data("columns")) );
266
 
267
  // position and show action div
268
  var $a = $li.find("a");
343
  var nodePosition = data.rslt.p;
344
  var nodeR = data.rslt.r;
345
  var nodeRef = data.rslt.or; // noden som positionen gäller versus
346
+ var selected_lang = cms_tpv_get_wpml_selected_lang(nodeBeingMoved);
347
  /*
348
 
349
  // om ovanför
384
  action: "cms_tpv_move_page",
385
  "node_id": node_id,
386
  "ref_node_id": ref_node_id,
387
+ "type": nodePosition,
388
+ "icl_post_language": selected_lang
389
  }, function(data, textStatus) {
390
  });
391
 
392
  });
393
 
394
  cms_tpv_tree.bind("clean_node.jstree", function(event, data) {
395
+ var obj = (data.rslt.obj);
396
  if (obj && obj != -1) {
397
  obj.each(function(i, elm) {
398
  var li = jQuery(elm);
399
  var aFirst = li.find("a:first");
400
+
401
  // check that we haven't added our stuff already
402
  if (li.data("done_cms_tpv_clean_node")) {
403
  return;
404
  } else {
405
  li.data("done_cms_tpv_clean_node", true);
406
  }
407
+ // new way:
408
+ // console.log(li.data("childCount"));
409
  // add number of children
410
+ //if (li.data("jstree")) {
411
+ var childCount = li.data("childCount");
412
  if (childCount > 0) {
413
  aFirst.append("<span title='" + childCount + " " + cmstpv_l10n.child_pages + "' class='child_count'>("+childCount+")</span>");
414
  }
415
 
416
  // add protection type
417
+ var rel = li.data("rel");
418
  if(rel == "password") {
419
  aFirst.find("ins").after("<span class='post_protected' title='" + cmstpv_l10n.Password_protected_page + "'>&nbsp;</span>");
420
  }
421
 
422
  // add page type
423
+ var post_status = li.data("post_status");
424
  // post_status can be any value because of plugins like Edit flow
425
  // check if we have an existing translation for the string, otherwise use the post status directly
426
  var post_status_to_show = "";
432
  if (post_status != "publish") {
433
  aFirst.find("ins").first().after("<span class='post_type post_type_"+post_status+"'>" + post_status_to_show + "</span>");
434
  }
435
+ //}
436
 
437
  });
438
  }
504
  $wrapper.find("ul.cms_tvp_switch_langs a").removeClass("current");
505
  jQuery(this).addClass("current");
506
 
507
+ var re = /cms_tpv_switch_language_code_([\w-]+)/;
508
  var matches = re.exec( jQuery(this).attr("class") );
509
  var lang_code = matches[1];
510
  $wrapper.find("[name=cms_tpv_meta_wpml_language]").val(lang_code);
scripts/jquery.cookie.js DELETED
@@ -1,96 +0,0 @@
1
- /**
2
- * Cookie plugin
3
- *
4
- * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
5
- * Dual licensed under the MIT and GPL licenses:
6
- * http://www.opensource.org/licenses/mit-license.php
7
- * http://www.gnu.org/licenses/gpl.html
8
- *
9
- */
10
-
11
- /**
12
- * Create a cookie with the given name and value and other optional parameters.
13
- *
14
- * @example $.cookie('the_cookie', 'the_value');
15
- * @desc Set the value of a cookie.
16
- * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
17
- * @desc Create a cookie with all available options.
18
- * @example $.cookie('the_cookie', 'the_value');
19
- * @desc Create a session cookie.
20
- * @example $.cookie('the_cookie', null);
21
- * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
22
- * used when the cookie was set.
23
- *
24
- * @param String name The name of the cookie.
25
- * @param String value The value of the cookie.
26
- * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
27
- * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
28
- * If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
29
- * If set to null or omitted, the cookie will be a session cookie and will not be retained
30
- * when the the browser exits.
31
- * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
32
- * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
33
- * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
34
- * require a secure protocol (like HTTPS).
35
- * @type undefined
36
- *
37
- * @name $.cookie
38
- * @cat Plugins/Cookie
39
- * @author Klaus Hartl/klaus.hartl@stilbuero.de
40
- */
41
-
42
- /**
43
- * Get the value of a cookie with the given name.
44
- *
45
- * @example $.cookie('the_cookie');
46
- * @desc Get the value of a cookie.
47
- *
48
- * @param String name The name of the cookie.
49
- * @return The value of the cookie.
50
- * @type String
51
- *
52
- * @name $.cookie
53
- * @cat Plugins/Cookie
54
- * @author Klaus Hartl/klaus.hartl@stilbuero.de
55
- */
56
- jQuery.cookie = function(name, value, options) {
57
- if (typeof value != 'undefined') { // name and value given, set cookie
58
- options = options || {};
59
- if (value === null) {
60
- value = '';
61
- options.expires = -1;
62
- }
63
- var expires = '';
64
- if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
65
- var date;
66
- if (typeof options.expires == 'number') {
67
- date = new Date();
68
- date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
69
- } else {
70
- date = options.expires;
71
- }
72
- expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
73
- }
74
- // CAUTION: Needed to parenthesize options.path and options.domain
75
- // in the following expressions, otherwise they evaluate to undefined
76
- // in the packed version for some reason...
77
- var path = options.path ? '; path=' + (options.path) : '';
78
- var domain = options.domain ? '; domain=' + (options.domain) : '';
79
- var secure = options.secure ? '; secure' : '';
80
- document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
81
- } else { // only name given, get cookie
82
- var cookieValue = null;
83
- if (document.cookie && document.cookie != '') {
84
- var cookies = document.cookie.split(';');
85
- for (var i = 0; i < cookies.length; i++) {
86
- var cookie = jQuery.trim(cookies[i]);
87
- // Does this cookie string begin with the name we want?
88
- if (cookie.substring(0, name.length + 1) == (name + '=')) {
89
- cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
90
- break;
91
- }
92
- }
93
- }
94
- return cookieValue;
95
- }
96
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
scripts/jquery.jstree.js CHANGED
@@ -1,3510 +1,4545 @@
1
- /*
2
- * jsTree 1.0-rc1
3
- * http://jstree.com/
4
- *
5
- * Copyright (c) 2010 Ivan Bozhanov (vakata.com)
6
- *
7
- * Dual licensed under the MIT and GPL licenses (same as jQuery):
8
- * http://www.opensource.org/licenses/mit-license.php
9
- * http://www.gnu.org/licenses/gpl.html
10
- *
11
- * $Date: 2010-07-01 10:51:11 +0300 (четв, 01 юли 2010) $
12
- * $Revision: 191 $
13
- */
14
-
15
- /*jslint browser: true, onevar: true, undef: true, bitwise: true, strict: true */
16
- /*global window : false, clearInterval: false, clearTimeout: false, document: false, setInterval: false, setTimeout: false, jQuery: false, navigator: false, XSLTProcessor: false, DOMParser: false, XMLSerializer: false*/
17
-
18
- "use strict";
19
- // Common functions not related to jsTree
20
- // decided to move them to a `vakata` "namespace"
21
- (function ($) {
22
- $.vakata = {};
23
- // CSS related functions
24
- $.vakata.css = {
25
- get_css : function(rule_name, delete_flag, sheet) {
26
- rule_name = rule_name.toLowerCase();
27
- var css_rules = sheet.cssRules || sheet.rules,
28
- j = 0;
29
- do {
30
- if(css_rules.length && j > css_rules.length + 5) { return false; }
31
- if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) {
32
- if(delete_flag === true) {
33
- if(sheet.removeRule) { sheet.removeRule(j); }
34
- if(sheet.deleteRule) { sheet.deleteRule(j); }
35
- return true;
36
- }
37
- else { return css_rules[j]; }
38
- }
39
- }
40
- while (css_rules[++j]);
41
- return false;
42
- },
43
- add_css : function(rule_name, sheet) {
44
- if($.jstree.css.get_css(rule_name, false, sheet)) { return false; }
45
- if(sheet.insertRule) { sheet.insertRule(rule_name + ' { }', 0); } else { sheet.addRule(rule_name, null, 0); }
46
- return $.vakata.css.get_css(rule_name);
47
- },
48
- remove_css : function(rule_name, sheet) {
49
- return $.vakata.css.get_css(rule_name, true, sheet);
50
- },
51
- add_sheet : function(opts) {
52
- var tmp;
53
- if(opts.str) {
54
- tmp = document.createElement("style");
55
- tmp.setAttribute('type',"text/css");
56
- if(tmp.styleSheet) {
57
- document.getElementsByTagName("head")[0].appendChild(tmp);
58
- tmp.styleSheet.cssText = opts.str;
59
- }
60
- else {
61
- tmp.appendChild(document.createTextNode(opts.str));
62
- document.getElementsByTagName("head")[0].appendChild(tmp);
63
- }
64
- return tmp.sheet || tmp.styleSheet;
65
- }
66
- if(opts.url) {
67
- if(document.createStyleSheet) {
68
- try { tmp = document.createStyleSheet(opts.url); } catch (e) { }
69
- }
70
- else {
71
- tmp = document.createElement('link');
72
- tmp.rel = 'stylesheet';
73
- tmp.type = 'text/css';
74
- tmp.media = "all";
75
- tmp.href = opts.url;
76
- document.getElementsByTagName("head")[0].appendChild(tmp);
77
- return tmp.styleSheet;
78
- }
79
- }
80
- }
81
- };
82
- })(jQuery);
83
-
84
- /*
85
- * jsTree core 1.0
86
- */
87
- (function ($) {
88
- // private variables
89
- var instances = [], // instance array (used by $.jstree.reference/create/focused)
90
- focused_instance = -1, // the index in the instance array of the currently focused instance
91
- plugins = {}, // list of included plugins
92
- prepared_move = {}, // for the move plugin
93
- is_ie6 = false;
94
-
95
- // jQuery plugin wrapper (thanks to jquery UI widget function)
96
- $.fn.jstree = function (settings) {
97
- var isMethodCall = (typeof settings == 'string'), // is this a method call like $().jstree("open_node")
98
- args = Array.prototype.slice.call(arguments, 1),
99
- returnValue = this;
100
-
101
- // extend settings and allow for multiple hashes and metadata
102
- if(!isMethodCall && $.meta) { args.push($.metadata.get(this).jstree); }
103
- settings = !isMethodCall && args.length ? $.extend.apply(null, [true, settings].concat(args)) : settings;
104
- // block calls to "private" methods
105
- if(isMethodCall && settings.substring(0, 1) == '_') { return returnValue; }
106
-
107
- // if a method call execute the method on all selected instances
108
- if(isMethodCall) {
109
- this.each(function() {
110
- var instance = instances[$.data(this, "jstree-instance-id")],
111
- methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance;
112
- if(typeof methodValue !== "undefined" && (settings.indexOf("is_" === 0) || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; }
113
- });
114
- }
115
- else {
116
- this.each(function() {
117
- var instance_id = $.data(this, "jstree-instance-id"),
118
- s = false;
119
- // if an instance already exists, destroy it first
120
- if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); }
121
- // push a new empty object to the instances array
122
- instance_id = parseInt(instances.push({}),10) - 1;
123
- // store the jstree instance id to the container element
124
- $.data(this, "jstree-instance-id", instance_id);
125
- // clean up all plugins
126
- if(!settings) { settings = {}; }
127
- settings.plugins = $.isArray(settings.plugins) ? settings.plugins : $.jstree.defaults.plugins;
128
- if($.inArray("core", settings.plugins) === -1) { settings.plugins.unshift("core"); }
129
-
130
- // only unique plugins (NOT WORKING)
131
- // settings.plugins = settings.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
132
-
133
- // extend defaults with passed data
134
- s = $.extend(true, {}, $.jstree.defaults, settings);
135
- s.plugins = settings.plugins;
136
- $.each(plugins, function (i, val) { if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; } });
137
- // push the new object to the instances array (at the same time set the default classes to the container) and init
138
- instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s);
139
- // init all activated plugins for this instance
140
- $.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; });
141
- $.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } });
142
- // initialize the instance
143
- instances[instance_id].init();
144
- });
145
- }
146
- // return the jquery selection (or if it was a method call that returned a value - the returned value)
147
- return returnValue;
148
- };
149
- // object to store exposed functions and objects
150
- $.jstree = {
151
- defaults : {
152
- plugins : []
153
- },
154
- _focused : function () { return instances[focused_instance] || null; },
155
- _reference : function (needle) {
156
- // get by instance id
157
- if(instances[needle]) { return instances[needle]; }
158
- // get by DOM (if still no luck - return null
159
- var o = $(needle);
160
- if(!o.length && typeof needle === "string") { o = $("#" + needle); }
161
- if(!o.length) { return null; }
162
- return instances[o.closest(".jstree").data("jstree-instance-id")] || null;
163
- },
164
- _instance : function (index, container, settings) {
165
- // for plugins to store data in
166
- this.data = { core : {} };
167
- this.get_settings = function () { return $.extend(true, {}, settings); };
168
- this._get_settings = function () { return settings; };
169
- this.get_index = function () { return index; };
170
- this.get_container = function () { return container; };
171
- this._set_settings = function (s) {
172
- settings = $.extend(true, {}, settings, s);
173
- };
174
- },
175
- _fn : { },
176
- plugin : function (pname, pdata) {
177
- pdata = $.extend({}, {
178
- __init : $.noop,
179
- __destroy : $.noop,
180
- _fn : {},
181
- defaults : false
182
- }, pdata);
183
- plugins[pname] = pdata;
184
-
185
- $.jstree.defaults[pname] = pdata.defaults;
186
- $.each(pdata._fn, function (i, val) {
187
- val.plugin = pname;
188
- val.old = $.jstree._fn[i];
189
- $.jstree._fn[i] = function () {
190
- var rslt,
191
- func = val,
192
- args = Array.prototype.slice.call(arguments),
193
- evnt = new $.Event("before.jstree"),
194
- rlbk = false;
195
-
196
- // Check if function belongs to the included plugins of this instance
197
- do {
198
- if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; }
199
- func = func.old;
200
- } while(func);
201
- if(!func) { return; }
202
-
203
- // a chance to stop execution (or change arguments):
204
- // * just bind to jstree.before
205
- // * check the additional data object (func property)
206
- // * call event.stopImmediatePropagation()
207
- // * return false (or an array of arguments)
208
- rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args });
209
- if(rslt === false) { return; }
210
- if(typeof rslt !== "undefined") { args = rslt; }
211
-
212
- // context and function to trigger events, then finally call the function
213
- if(i.indexOf("_") === 0) {
214
- rslt = func.apply(this, args);
215
- }
216
- else {
217
- rslt = func.apply(
218
- $.extend({}, this, {
219
- __callback : function (data) {
220
- this.get_container().triggerHandler( i + '.jstree', { "inst" : this, "args" : args, "rslt" : data, "rlbk" : rlbk });
221
- },
222
- __rollback : function () {
223
- rlbk = this.get_rollback();
224
- return rlbk;
225
- },
226
- __call_old : function (replace_arguments) {
227
- return func.old.apply(this, (replace_arguments ? Array.prototype.slice.call(arguments, 1) : args ) );
228
- }
229
- }), args);
230
- }
231
-
232
- // return the result
233
- return rslt;
234
- };
235
- $.jstree._fn[i].old = val.old;
236
- $.jstree._fn[i].plugin = pname;
237
- });
238
- },
239
- rollback : function (rb) {
240
- if(rb) {
241
- if(!$.isArray(rb)) { rb = [ rb ]; }
242
- $.each(rb, function (i, val) {
243
- instances[val.i].set_rollback(val.h, val.d);
244
- });
245
- }
246
- }
247
- };
248
- // set the prototype for all instances
249
- $.jstree._fn = $.jstree._instance.prototype = {};
250
-
251
- // css functions - used internally
252
-
253
- // load the css when DOM is ready
254
- $(function() {
255
- // code is copied form jQuery ($.browser is deprecated + there is a bug in IE)
256
- var u = navigator.userAgent.toLowerCase(),
257
- v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
258
- css_string = '' +
259
- '.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' +
260
- '.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; } ' +
261
- '.jstree-rtl li { margin-left:0; margin-right:18px; } ' +
262
- '.jstree > ul > li { margin-left:0px; } ' +
263
- '.jstree-rtl > ul > li { margin-right:0px; } ' +
264
- '.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' +
265
- '.jstree a { display:inline-block; line-height:16px; height:16px; color:black; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' +
266
- '.jstree a:focus { outline: none; } ' +
267
- '.jstree a > ins { height:16px; width:16px; } ' +
268
- '.jstree a > .jstree-icon { margin-right:3px; } ' +
269
- '.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' +
270
- 'li.jstree-open > ul { display:block; } ' +
271
- 'li.jstree-closed > ul { display:none; } ';
272
- // Correct IE 6 (does not support the > CSS selector)
273
- if(/msie/.test(u) && parseInt(v, 10) == 6) {
274
- is_ie6 = true;
275
- css_string += '' +
276
- '.jstree li { height:18px; margin-left:0; margin-right:0; } ' +
277
- '.jstree li li { margin-left:18px; } ' +
278
- '.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' +
279
- 'li.jstree-open ul { display:block; } ' +
280
- 'li.jstree-closed ul { display:none !important; } ' +
281
- '.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' +
282
- '.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' +
283
- '.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } ';
284
- }
285
- // Correct IE 7 (shifts anchor nodes onhover)
286
- if(/msie/.test(u) && parseInt(v, 10) == 7) {
287
- css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } ';
288
- }
289
- $.vakata.css.add_sheet({ str : css_string });
290
- });
291
-
292
- // core functions (open, close, create, update, delete)
293
- $.jstree.plugin("core", {
294
- __init : function () {
295
- this.data.core.to_open = $.map($.makeArray(this.get_settings().core.initially_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/'); });
296
- },
297
- defaults : {
298
- html_titles : false,
299
- animation : 500,
300
- initially_open : [],
301
- rtl : false,
302
- strings : {
303
- loading : "Loading ...",
304
- new_node : "New node"
305
- }
306
- },
307
- _fn : {
308
- init : function () {
309
- this.set_focus();
310
- if(this._get_settings().core.rtl) {
311
- this.get_container().addClass("jstree-rtl").css("direction", "rtl");
312
- }
313
- this.get_container().html("<ul><li class='jstree-last jstree-leaf'><ins>&#160;</ins><a class='jstree-loading' href='#'><ins class='jstree-icon'>&#160;</ins>" + this._get_settings().core.strings.loading + "</a></li></ul>");
314
- this.data.core.li_height = this.get_container().find("ul li.jstree-closed, ul li.jstree-leaf").eq(0).height() || 18;
315
-
316
- this.get_container()
317
- .delegate("li > ins", "click.jstree", $.proxy(function (event) {
318
- var trgt = $(event.target);
319
- if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); }
320
- }, this))
321
- .bind("mousedown.jstree", $.proxy(function () {
322
- this.set_focus(); // This used to be setTimeout(set_focus,0) - why?
323
- }, this))
324
- .bind("dblclick.jstree", function (event) {
325
- var sel;
326
- if(document.selection && document.selection.empty) { document.selection.empty(); }
327
- else {
328
- if(window.getSelection) {
329
- sel = window.getSelection();
330
- try {
331
- sel.removeAllRanges();
332
- sel.collapse();
333
- } catch (err) { }
334
- }
335
- }
336
- });
337
- this.__callback();
338
- this.load_node(-1, function () { this.loaded(); this.reopen(); });
339
- },
340
- destroy : function () {
341
- var i,
342
- n = this.get_index(),
343
- s = this._get_settings(),
344
- _this = this;
345
-
346
- $.each(s.plugins, function (i, val) {
347
- try { plugins[val].__destroy.apply(_this); } catch(err) { }
348
- });
349
- this.__callback();
350
- // set focus to another instance if this one is focused
351
- if(this.is_focused()) {
352
- for(i in instances) {
353
- if(instances.hasOwnProperty(i) && i != n) {
354
- instances[i].set_focus();
355
- break;
356
- }
357
- }
358
- }
359
- // if no other instance found
360
- if(n === focused_instance) { focused_instance = -1; }
361
- // remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events
362
- this.get_container()
363
- .unbind(".jstree")
364
- .undelegate(".jstree")
365
- .removeData("jstree-instance-id")
366
- .find("[class^='jstree']")
367
- .andSelf()
368
- .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });
369
- // remove the actual data
370
- instances[n] = null;
371
- delete instances[n];
372
- },
373
- save_opened : function () {
374
- var _this = this;
375
- this.data.core.to_open = [];
376
- this.get_container().find(".jstree-open").each(function () {
377
- _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/'));
378
- });
379
- this.__callback(_this.data.core.to_open);
380
- },
381
- reopen : function (is_callback) {
382
- var _this = this,
383
- done = true,
384
- current = [],
385
- remaining = [];
386
- if(!is_callback) { this.data.core.reopen = false; this.data.core.refreshing = true; }
387
- if(this.data.core.to_open.length) {
388
- $.each(this.data.core.to_open, function (i, val) {
389
- if(val == "#") { return true; }
390
- if($(val).length && $(val).is(".jstree-closed")) { current.push(val); }
391
- else { remaining.push(val); }
392
- });
393
- if(current.length) {
394
- this.data.core.to_open = remaining;
395
- $.each(current, function (i, val) {
396
- _this.open_node(val, function () { _this.reopen(true); }, true);
397
- });
398
- done = false;
399
- }
400
- }
401
- if(done) {
402
- // TODO: find a more elegant approach to syncronizing returning requests
403
- if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); }
404
- this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50);
405
- this.data.core.refreshing = false;
406
- }
407
- },
408
- refresh : function (obj) {
409
- var _this = this;
410
- this.save_opened();
411
- if(!obj) { obj = -1; }
412
- obj = this._get_node(obj);
413
- if(!obj) { obj = -1; }
414
- if(obj !== -1) { obj.children("UL").remove(); }
415
- this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reopen(); });
416
- },
417
- // Dummy function to fire after the first load (so that there is a jstree.loaded event)
418
- loaded : function () {
419
- this.__callback();
420
- },
421
- // deal with focus
422
- set_focus : function () {
423
- var f = $.jstree._focused();
424
- if(f && f !== this) {
425
- f.get_container().removeClass("jstree-focused");
426
- }
427
- if(f !== this) {
428
- this.get_container().addClass("jstree-focused");
429
- focused_instance = this.get_index();
430
- }
431
- this.__callback();
432
- },
433
- is_focused : function () {
434
- return focused_instance == this.get_index();
435
- },
436
-
437
- // traverse
438
- _get_node : function (obj) {
439
- var $obj = $(obj, this.get_container());
440
- if($obj.is(".jstree") || obj == -1) { return -1; }
441
- $obj = $obj.closest("li", this.get_container());
442
- return $obj.length ? $obj : false;
443
- },
444
- _get_next : function (obj, strict) {
445
- obj = this._get_node(obj);
446
- if(obj === -1) { return this.get_container().find("> ul > li:first-child"); }
447
- if(!obj.length) { return false; }
448
- if(strict) { return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; }
449
-
450
- if(obj.hasClass("jstree-open")) { return obj.find("li:eq(0)"); }
451
- else if(obj.nextAll("li").size() > 0) { return obj.nextAll("li:eq(0)"); }
452
- else { return obj.parentsUntil(".jstree","li").next("li").eq(0); }
453
- },
454
- _get_prev : function (obj, strict) {
455
- obj = this._get_node(obj);
456
- if(obj === -1) { return this.get_container().find("> ul > li:last-child"); }
457
- if(!obj.length) { return false; }
458
- if(strict) { return (obj.prevAll("li").length > 0) ? obj.prevAll("li:eq(0)") : false; }
459
-
460
- if(obj.prev("li").length) {
461
- obj = obj.prev("li").eq(0);
462
- while(obj.hasClass("jstree-open")) { obj = obj.children("ul:eq(0)").children("li:last"); }
463
- return obj;
464
- }
465
- else { var o = obj.parentsUntil(".jstree","li:eq(0)"); return o.length ? o : false; }
466
- },
467
- _get_parent : function (obj) {
468
- obj = this._get_node(obj);
469
- if(obj == -1 || !obj.length) { return false; }
470
- var o = obj.parentsUntil(".jstree", "li:eq(0)");
471
- return o.length ? o : -1;
472
- },
473
- _get_children : function (obj) {
474
- obj = this._get_node(obj);
475
- if(obj === -1) { return this.get_container().children("ul:eq(0)").children("li"); }
476
- if(!obj.length) { return false; }
477
- return obj.children("ul:eq(0)").children("li");
478
- },
479
- get_path : function (obj, id_mode) {
480
- var p = [],
481
- _this = this;
482
- obj = this._get_node(obj);
483
- if(obj === -1 || !obj || !obj.length) { return false; }
484
- obj.parentsUntil(".jstree", "li").each(function () {
485
- p.push( id_mode ? this.id : _this.get_text(this) );
486
- });
487
- p.reverse();
488
- p.push( id_mode ? obj.attr("id") : this.get_text(obj) );
489
- return p;
490
- },
491
-
492
- is_open : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); },
493
- is_closed : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); },
494
- is_leaf : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); },
495
- // open/close
496
- open_node : function (obj, callback, skip_animation) {
497
- obj = this._get_node(obj);
498
- if(!obj.length) { return false; }
499
- if(!obj.hasClass("jstree-closed")) { if(callback) { callback.call(); } return false; }
500
- var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,
501
- t = this;
502
- if(!this._is_loaded(obj)) {
503
- obj.children("a").addClass("jstree-loading");
504
- this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback);
505
- }
506
- else {
507
- if(s) { obj.children("ul").css("display","none"); }
508
- obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading");
509
- if(s) { obj.children("ul").stop(true).slideDown(s, function () { this.style.display = ""; }); }
510
- this.__callback({ "obj" : obj });
511
- if(callback) { callback.call(); }
512
- }
513
- },
514
- close_node : function (obj, skip_animation) {
515
- obj = this._get_node(obj);
516
- var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation;
517
- if(!obj.length || !obj.hasClass("jstree-open")) { return false; }
518
- if(s) { obj.children("ul").attr("style","display:block !important"); }
519
- obj.removeClass("jstree-open").addClass("jstree-closed");
520
- if(s) { obj.children("ul").stop(true).slideUp(s, function () { this.style.display = ""; }); }
521
- this.__callback({ "obj" : obj });
522
- },
523
- toggle_node : function (obj) {
524
- obj = this._get_node(obj);
525
- if(obj.hasClass("jstree-closed")) { return this.open_node(obj); }
526
- if(obj.hasClass("jstree-open")) { return this.close_node(obj); }
527
- },
528
- open_all : function (obj, original_obj) {
529
- obj = obj ? this._get_node(obj) : this.get_container();
530
- if(!obj || obj === -1) { obj = this.get_container(); }
531
- if(original_obj) {
532
- obj = obj.find("li.jstree-closed");
533
- }
534
- else {
535
- original_obj = obj;
536
- if(obj.is(".jstree-closed")) { obj = obj.find("li.jstree-closed").andSelf(); }
537
- else { obj = obj.find("li.jstree-closed"); }
538
- }
539
- var _this = this;
540
- obj.each(function () {
541
- var __this = this;
542
- if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, original_obj); }, true); }
543
- else { _this.open_node(this, false, true); }
544
- });
545
- // so that callback is fired AFTER all nodes are open
546
- if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); }
547
- },
548
- close_all : function (obj) {
549
- var _this = this;
550
- obj = obj ? this._get_node(obj) : this.get_container();
551
- if(!obj || obj === -1) { obj = this.get_container(); }
552
- obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this); });
553
- this.__callback({ "obj" : obj });
554
- },
555
- clean_node : function (obj) {
556
- obj = obj && obj != -1 ? $(obj) : this.get_container();
557
- obj = obj.is("li") ? obj.find("li").andSelf() : obj.find("li");
558
- obj.removeClass("jstree-last")
559
- .filter("li:last-child").addClass("jstree-last").end()
560
- .filter(":has(li)")
561
- .not(".jstree-open").removeClass("jstree-leaf").addClass("jstree-closed");
562
- obj.not(".jstree-open, .jstree-closed").addClass("jstree-leaf").children("ul").remove();
563
- this.__callback({ "obj" : obj });
564
- },
565
- // rollback
566
- get_rollback : function () {
567
- this.__callback();
568
- return { i : this.get_index(), h : this.get_container().children("ul").clone(true), d : this.data };
569
- },
570
- set_rollback : function (html, data) {
571
- this.get_container().empty().append(html);
572
- this.data = data;
573
- this.__callback();
574
- },
575
- // Dummy functions to be overwritten by any datastore plugin included
576
- load_node : function (obj, s_call, e_call) { this.__callback({ "obj" : obj }); },
577
- _is_loaded : function (obj) { return true; },
578
-
579
- // Basic operations: create
580
- create_node : function (obj, position, js, callback, is_loaded) {
581
- obj = this._get_node(obj);
582
- position = typeof position === "undefined" ? "last" : position;
583
- var d = $("<li>"),
584
- s = this._get_settings().core,
585
- tmp;
586
-
587
- if(obj !== -1 && !obj.length) { return false; }
588
- if(!is_loaded && !this._is_loaded(obj)) { this.load_node(obj, function () { this.create_node(obj, position, js, callback, true); }); return false; }
589
-
590
- this.__rollback();
591
-
592
- if(typeof js === "string") { js = { "data" : js }; }
593
- if(!js) { js = {}; }
594
- if(js.attr) { d.attr(js.attr); }
595
- if(js.state) { d.addClass("jstree-" + js.state); }
596
- if(!js.data) { js.data = s.strings.new_node; }
597
- if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
598
- $.each(js.data, function (i, m) {
599
- tmp = $("<a>");
600
- if($.isFunction(m)) { m = m.call(this, js); }
601
- if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); }
602
- else {
603
- if(!m.attr) { m.attr = {}; }
604
- if(!m.attr.href) { m.attr.href = '#'; }
605
- tmp.attr(m.attr)[ s.html_titles ? "html" : "text" ](m.title);
606
- if(m.language) { tmp.addClass(m.language); }
607
- }
608
- tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");
609
- if(m.icon) {
610
- if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
611
- else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
612
- }
613
- d.append(tmp);
614
- });
615
- d.prepend("<ins class='jstree-icon'>&#160;</ins>");
616
- if(obj === -1) {
617
- obj = this.get_container();
618
- if(position === "before") { position = "first"; }
619
- if(position === "after") { position = "last"; }
620
- }
621
- switch(position) {
622
- case "before": obj.before(d); tmp = this._get_parent(obj); break;
623
- case "after" : obj.after(d); tmp = this._get_parent(obj); break;
624
- case "inside":
625
- case "first" :
626
- if(!obj.children("ul").length) { obj.append("<ul>"); }
627
- obj.children("ul").prepend(d);
628
- tmp = obj;
629
- break;
630
- case "last":
631
- if(!obj.children("ul").length) { obj.append("<ul>"); }
632
- obj.children("ul").append(d);
633
- tmp = obj;
634
- break;
635
- default:
636
- if(!obj.children("ul").length) { obj.append("<ul>"); }
637
- if(!position) { position = 0; }
638
- tmp = obj.children("ul").children("li").eq(position);
639
- if(tmp.length) { tmp.before(d); }
640
- else { obj.children("ul").append(d); }
641
- tmp = obj;
642
- break;
643
- }
644
- if(tmp === -1 || tmp.get(0) === this.get_container().get(0)) { tmp = -1; }
645
- this.clean_node(tmp);
646
- this.__callback({ "obj" : d, "parent" : tmp });
647
- if(callback) { callback.call(this, d); }
648
- return d;
649
- },
650
- // Basic operations: rename (deal with text)
651
- get_text : function (obj) {
652
- obj = this._get_node(obj);
653
- if(!obj.length) { return false; }
654
- var s = this._get_settings().core.html_titles;
655
- obj = obj.children("a:eq(0)");
656
- if(s) {
657
- obj = obj.clone();
658
- obj.children("INS").remove();
659
- return obj.html();
660
- }
661
- else {
662
- obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
663
- return obj.nodeValue;
664
- }
665
- },
666
- set_text : function (obj, val) {
667
- obj = this._get_node(obj);
668
- if(!obj.length) { return false; }
669
- obj = obj.children("a:eq(0)");
670
- if(this._get_settings().core.html_titles) {
671
- var tmp = obj.children("INS").clone();
672
- obj.html(val).prepend(tmp);
673
- this.__callback({ "obj" : obj, "name" : val });
674
- return true;
675
- }
676
- else {
677
- obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
678
- this.__callback({ "obj" : obj, "name" : val });
679
- return (obj.nodeValue = val);
680
- }
681
- },
682
- rename_node : function (obj, val) {
683
- obj = this._get_node(obj);
684
- this.__rollback();
685
- if(obj && obj.length && this.set_text.apply(this, Array.prototype.slice.call(arguments))) { this.__callback({ "obj" : obj, "name" : val }); }
686
- },
687
- // Basic operations: deleting nodes
688
- delete_node : function (obj) {
689
- obj = this._get_node(obj);
690
- if(!obj.length) { return false; }
691
- this.__rollback();
692
- var p = this._get_parent(obj), prev = this._get_prev(obj);
693
- obj = obj.remove();
694
- if(p !== -1 && p.find("> ul > li").length === 0) {
695
- p.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");
696
- }
697
- this.clean_node(p);
698
- this.__callback({ "obj" : obj, "prev" : prev });
699
- return obj;
700
- },
701
- prepare_move : function (o, r, pos, cb, is_cb) {
702
- var p = {};
703
-
704
- p.ot = $.jstree._reference(p.o) || this;
705
- p.o = p.ot._get_node(o);
706
- p.r = r === - 1 ? -1 : this._get_node(r);
707
- p.p = (typeof p === "undefined") ? "last" : pos; // TODO: move to a setting
708
- if(!is_cb && prepared_move.o && prepared_move.o[0] === p.o[0] && prepared_move.r[0] === p.r[0] && prepared_move.p === p.p) {
709
- this.__callback(prepared_move);
710
- if(cb) { cb.call(this, prepared_move); }
711
- return;
712
- }
713
- p.ot = $.jstree._reference(p.o) || this;
714
- p.rt = r === -1 ? p.ot : $.jstree._reference(p.r) || this;
715
- if(p.r === -1) {
716
- p.cr = -1;
717
- switch(p.p) {
718
- case "first":
719
- case "before":
720
- case "inside":
721
- p.cp = 0;
722
- break;
723
- case "after":
724
- case "last":
725
- p.cp = p.rt.get_container().find(" > ul > li").length;
726
- break;
727
- default:
728
- p.cp = p.p;
729
- break;
730
- }
731
- }
732
- else {
733
- if(!/^(before|after)$/.test(p.p) && !this._is_loaded(p.r)) {
734
- return this.load_node(p.r, function () { this.prepare_move(o, r, pos, cb, true); });
735
- }
736
- switch(p.p) {
737
- case "before":
738
- p.cp = p.r.index();
739
- p.cr = p.rt._get_parent(p.r);
740
- break;
741
- case "after":
742
- p.cp = p.r.index() + 1;
743
- p.cr = p.rt._get_parent(p.r);
744
- break;
745
- case "inside":
746
- case "first":
747
- p.cp = 0;
748
- p.cr = p.r;
749
- break;
750
- case "last":
751
- p.cp = p.r.find(" > ul > li").length;
752
- p.cr = p.r;
753
- break;
754
- default:
755
- p.cp = p.p;
756
- p.cr = p.r;
757
- break;
758
- }
759
- }
760
- p.np = p.cr == -1 ? p.rt.get_container() : p.cr;
761
- p.op = p.ot._get_parent(p.o);
762
- p.or = p.np.find(" > ul > li:nth-child(" + (p.cp + 1) + ")");
763
-
764
- prepared_move = p;
765
- this.__callback(prepared_move);
766
- if(cb) { cb.call(this, prepared_move); }
767
- },
768
- check_move : function () {
769
- var obj = prepared_move, ret = true;
770
- if(obj.or[0] === obj.o[0]) { return false; }
771
- obj.o.each(function () {
772
- if(obj.r.parentsUntil(".jstree").andSelf().filter("li").index(this) !== -1) { ret = false; return false; }
773
- });
774
- return ret;
775
- },
776
- move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
777
- if(!is_prepared) {
778
- return this.prepare_move(obj, ref, position, function (p) {
779
- this.move_node(p, false, false, is_copy, true, skip_check);
780
- });
781
- }
782
- if(!skip_check && !this.check_move()) { return false; }
783
-
784
- this.__rollback();
785
- var o = false;
786
- if(is_copy) {
787
- o = obj.o.clone();
788
- o.find("*[id]").andSelf().each(function () {
789
- if(this.id) { this.id = "copy_" + this.id; }
790
- });
791
- }
792
- else { o = obj.o; }
793
-
794
- if(obj.or.length) { obj.or.before(o); }
795
- else {
796
- if(!obj.np.children("ul").length) { $("<ul>").appendTo(obj.np); }
797
- obj.np.children("ul:eq(0)").append(o);
798
- }
799
-
800
- try {
801
- obj.ot.clean_node(obj.op);
802
- obj.rt.clean_node(obj.np);
803
- if(!obj.op.find("> ul > li").length) {
804
- obj.op.removeClass("jstree-open jstree-closed").addClass("jstree-leaf").children("ul").remove();
805
- }
806
- } catch (e) { }
807
-
808
- if(is_copy) {
809
- prepared_move.cy = true;
810
- prepared_move.oc = o;
811
- }
812
- this.__callback(prepared_move);
813
- return prepared_move;
814
- },
815
- _get_move : function () { return prepared_move; }
816
- }
817
- });
818
- })(jQuery);
819
- //*/
820
-
821
- /*
822
- * jsTree ui plugin 1.0
823
- * This plugins handles selecting/deselecting/hovering/dehovering nodes
824
- */
825
- (function ($) {
826
- $.jstree.plugin("ui", {
827
- __init : function () {
828
- this.data.ui.selected = $();
829
- this.data.ui.last_selected = false;
830
- this.data.ui.hovered = null;
831
- this.data.ui.to_select = this.get_settings().ui.initially_select;
832
-
833
- this.get_container()
834
- .delegate("a", "click.jstree", $.proxy(function (event) {
835
- event.preventDefault();
836
- this.select_node(event.currentTarget, true, event);
837
- }, this))
838
- .delegate("a", "mouseenter.jstree", $.proxy(function (event) {
839
- this.hover_node(event.target);
840
- }, this))
841
- .delegate("a", "mouseleave.jstree", $.proxy(function (event) {
842
- this.dehover_node(event.target);
843
- }, this))
844
- .bind("reopen.jstree", $.proxy(function () {
845
- this.reselect();
846
- }, this))
847
- .bind("get_rollback.jstree", $.proxy(function () {
848
- this.dehover_node();
849
- this.save_selected();
850
- }, this))
851
- .bind("set_rollback.jstree", $.proxy(function () {
852
- this.reselect();
853
- }, this))
854
- .bind("close_node.jstree", $.proxy(function (event, data) {
855
- var s = this._get_settings().ui,
856
- obj = this._get_node(data.rslt.obj),
857
- clk = (obj && obj.length) ? obj.children("ul").find(".jstree-clicked") : $(),
858
- _this = this;
859
- if(s.selected_parent_close === false || !clk.length) { return; }
860
- clk.each(function () {
861
- _this.deselect_node(this);
862
- if(s.selected_parent_close === "select_parent") { _this.select_node(obj); }
863
- });
864
- }, this))
865
- .bind("delete_node.jstree", $.proxy(function (event, data) {
866
- var s = this._get_settings().ui.select_prev_on_delete,
867
- obj = this._get_node(data.rslt.obj),
868
- clk = (obj && obj.length) ? obj.find(".jstree-clicked") : [],
869
- _this = this;
870
- clk.each(function () { _this.deselect_node(this); });
871
- if(s && clk.length) { this.select_node(data.rslt.prev); }
872
- }, this))
873
- .bind("move_node.jstree", $.proxy(function (event, data) {
874
- if(data.rslt.cy) {
875
- data.rslt.oc.find(".jstree-clicked").removeClass("jstree-clicked");
876
- }
877
- }, this));
878
- },
879
- defaults : {
880
- select_limit : -1, // 0, 1, 2 ... or -1 for unlimited
881
- select_multiple_modifier : "ctrl", // on, or ctrl, shift, alt
882
- selected_parent_close : "select_parent", // false, "deselect", "select_parent"
883
- select_prev_on_delete : true,
884
- disable_selecting_children : false,
885
- initially_select : []
886
- },
887
- _fn : {
888
- _get_node : function (obj, allow_multiple) {
889
- if(typeof obj === "undefined" || obj === null) { return allow_multiple ? this.data.ui.selected : this.data.ui.last_selected; }
890
- var $obj = $(obj, this.get_container());
891
- if($obj.is(".jstree") || obj == -1) { return -1; }
892
- $obj = $obj.closest("li", this.get_container());
893
- return $obj.length ? $obj : false;
894
- },
895
- save_selected : function () {
896
- var _this = this;
897
- this.data.ui.to_select = [];
898
- this.data.ui.selected.each(function () { _this.data.ui.to_select.push("#" + this.id.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/')); });
899
- this.__callback(this.data.ui.to_select);
900
- },
901
- reselect : function () {
902
- var _this = this,
903
- s = this.data.ui.to_select;
904
- s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/'); });
905
- this.deselect_all();
906
- $.each(s, function (i, val) { if(val && val !== "#") { _this.select_node(val); } });
907
- this.__callback();
908
- },
909
- refresh : function (obj) {
910
- this.save_selected();
911
- return this.__call_old();
912
- },
913
- hover_node : function (obj) {
914
- obj = this._get_node(obj);
915
- if(!obj.length) { return false; }
916
- //if(this.data.ui.hovered && obj.get(0) === this.data.ui.hovered.get(0)) { return; }
917
- if(!obj.hasClass("jstree-hovered")) { this.dehover_node(); }
918
- this.data.ui.hovered = obj.children("a").addClass("jstree-hovered").parent();
919
- this.__callback({ "obj" : obj });
920
- },
921
- dehover_node : function () {
922
- var obj = this.data.ui.hovered, p;
923
- if(!obj || !obj.length) { return false; }
924
- p = obj.children("a").removeClass("jstree-hovered").parent();
925
- if(this.data.ui.hovered[0] === p[0]) { this.data.ui.hovered = null; }
926
- this.__callback({ "obj" : obj });
927
- },
928
- select_node : function (obj, check, e) {
929
- obj = this._get_node(obj);
930
- if(obj == -1 || !obj || !obj.length) { return false; }
931
- var s = this._get_settings().ui,
932
- is_multiple = (s.select_multiple_modifier == "on" || (s.select_multiple_modifier !== false && e && e[s.select_multiple_modifier + "Key"])),
933
- is_selected = this.is_selected(obj),
934
- proceed = true;
935
- if(check) {
936
- if(s.disable_selecting_children && is_multiple && obj.parents("li", this.get_container()).children(".jstree-clicked").length) {
937
- return false;
938
- }
939
- proceed = false;
940
- switch(!0) {
941
- case (is_selected && !is_multiple):
942
- this.deselect_all();
943
- is_selected = false;
944
- proceed = true;
945
- break;
946
- case (!is_selected && !is_multiple):
947
- if(s.select_limit == -1 || s.select_limit > 0) {
948
- this.deselect_all();
949
- proceed = true;
950
- }
951
- break;
952
- case (is_selected && is_multiple):
953
- this.deselect_node(obj);
954
- break;
955
- case (!is_selected && is_multiple):
956
- if(s.select_limit == -1 || this.data.ui.selected.length + 1 <= s.select_limit) {
957
- proceed = true;
958
- }
959
- break;
960
- }
961
- }
962
- if(proceed && !is_selected) {
963
- obj.children("a").addClass("jstree-clicked");
964
- this.data.ui.selected = this.data.ui.selected.add(obj);
965
- this.data.ui.last_selected = obj;
966
- this.__callback({ "obj" : obj });
967
- }
968
- },
969
- deselect_node : function (obj) {
970
- obj = this._get_node(obj);
971
- if(!obj.length) { return false; }
972
- if(this.is_selected(obj)) {
973
- obj.children("a").removeClass("jstree-clicked");
974
- this.data.ui.selected = this.data.ui.selected.not(obj);
975
- if(this.data.ui.last_selected.get(0) === obj.get(0)) { this.data.ui.last_selected = this.data.ui.selected.eq(0); }
976
- this.__callback({ "obj" : obj });
977
- }
978
- },
979
- toggle_select : function (obj) {
980
- obj = this._get_node(obj);
981
- if(!obj.length) { return false; }
982
- if(this.is_selected(obj)) { this.deselect_node(obj); }
983
- else { this.select_node(obj); }
984
- },
985
- is_selected : function (obj) { return this.data.ui.selected.index(this._get_node(obj)) >= 0; },
986
- get_selected : function (context) {
987
- return context ? $(context).find(".jstree-clicked").parent() : this.data.ui.selected;
988
- },
989
- deselect_all : function (context) {
990
- if(context) { $(context).find(".jstree-clicked").removeClass("jstree-clicked"); }
991
- else { this.get_container().find(".jstree-clicked").removeClass("jstree-clicked"); }
992
- this.data.ui.selected = $([]);
993
- this.data.ui.last_selected = false;
994
- this.__callback();
995
- }
996
- }
997
- });
998
- // include the selection plugin by default
999
- $.jstree.defaults.plugins.push("ui");
1000
- })(jQuery);
1001
- //*/
1002
-
1003
- /*
1004
- * jsTree CRRM plugin 1.0
1005
- * Handles creating/renaming/removing/moving nodes by user interaction.
1006
- */
1007
- (function ($) {
1008
- $.jstree.plugin("crrm", {
1009
- __init : function () {
1010
- this.get_container()
1011
- .bind("move_node.jstree", $.proxy(function (e, data) {
1012
- if(this._get_settings().crrm.move.open_onmove) {
1013
- var t = this;
1014
- data.rslt.np.parentsUntil(".jstree").andSelf().filter(".jstree-closed").each(function () {
1015
- t.open_node(this, false, true);
1016
- });
1017
- }
1018
- }, this));
1019
- },
1020
- defaults : {
1021
- input_width_limit : 200,
1022
- move : {
1023
- always_copy : false, // false, true or "multitree"
1024
- open_onmove : true,
1025
- default_position : "last",
1026
- check_move : function (m) { return true; }
1027
- }
1028
- },
1029
- _fn : {
1030
- _show_input : function (obj, callback) {
1031
- obj = this._get_node(obj);
1032
- var rtl = this._get_settings().core.rtl,
1033
- w = this._get_settings().crrm.input_width_limit,
1034
- w1 = obj.children("ins").width(),
1035
- w2 = obj.find("> a:visible > ins").width() * obj.find("> a:visible > ins").length,
1036
- t = this.get_text(obj),
1037
- h1 = $("<div>", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"),
1038
- h2 = obj.css("position","relative").append(
1039
- $("<input>", {
1040
- "value" : t,
1041
- // "size" : t.length,
1042
- "css" : {
1043
- "padding" : "0",
1044
- "border" : "1px solid silver",
1045
- "position" : "absolute",
1046
- "left" : (rtl ? "auto" : (w1 + w2 + 4) + "px"),
1047
- "right" : (rtl ? (w1 + w2 + 4) + "px" : "auto"),
1048
- "top" : "0px",
1049
- "height" : (this.data.core.li_height - 2) + "px",
1050
- "lineHeight" : (this.data.core.li_height - 2) + "px",
1051
- "width" : "150px" // will be set a bit further down
1052
- },
1053
- "blur" : $.proxy(function () {
1054
- var i = obj.children("input"),
1055
- v = i.val();
1056
- if(v === "") { v = t; }
1057
- i.remove(); // rollback purposes
1058
- this.set_text(obj,t); // rollback purposes
1059
- this.rename_node(obj, v);
1060
- callback.call(this, obj, v, t);
1061
- obj.css("position","");
1062
- }, this),
1063
- "keyup" : function (event) {
1064
- var key = event.keyCode || event.which;
1065
- if(key == 27) { this.value = t; this.blur(); return; }
1066
- else if(key == 13) { this.blur(); return; }
1067
- else {
1068
- h2.width(Math.min(h1.text("pW" + this.value).width(),w));
1069
- }
1070
- }
1071
- })
1072
- ).children("input");
1073
- this.set_text(obj, "");
1074
- h1.css({
1075
- fontFamily : h2.css('fontFamily') || '',
1076
- fontSize : h2.css('fontSize') || '',
1077
- fontWeight : h2.css('fontWeight') || '',
1078
- fontStyle : h2.css('fontStyle') || '',
1079
- fontStretch : h2.css('fontStretch') || '',
1080
- fontVariant : h2.css('fontVariant') || '',
1081
- letterSpacing : h2.css('letterSpacing') || '',
1082
- wordSpacing : h2.css('wordSpacing') || ''
1083
- });
1084
- h2.width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();
1085
- },
1086
- rename : function (obj) {
1087
- obj = this._get_node(obj);
1088
- this.__rollback();
1089
- var f = this.__callback;
1090
- this._show_input(obj, function (obj, new_name, old_name) {
1091
- f.call(this, { "obj" : obj, "new_name" : new_name, "old_name" : old_name });
1092
- });
1093
- },
1094
- create : function (obj, position, js, callback, skip_rename) {
1095
- var t, _this = this;
1096
- obj = this._get_node(obj);
1097
- if(!obj) { obj = -1; }
1098
- this.__rollback();
1099
- t = this.create_node(obj, position, js, function (t) {
1100
- var p = this._get_parent(t),
1101
- pos = $(t).index();
1102
- if(callback) { callback.call(this, t); }
1103
- if(p.length && p.hasClass("jstree-closed")) { this.open_node(p, false, true); }
1104
- if(!skip_rename) {
1105
- this._show_input(t, function (obj, new_name, old_name) {
1106
- _this.__callback({ "obj" : obj, "name" : new_name, "parent" : p, "position" : pos });
1107
- });
1108
- }
1109
- else { _this.__callback({ "obj" : t, "name" : this.get_text(t), "parent" : p, "position" : pos }); }
1110
- });
1111
- return t;
1112
- },
1113
- remove : function (obj) {
1114
- obj = this._get_node(obj, true);
1115
- this.__rollback();
1116
- this.delete_node(obj);
1117
- this.__callback({ "obj" : obj });
1118
- },
1119
- check_move : function () {
1120
- if(!this.__call_old()) { return false; }
1121
- var s = this._get_settings().crrm.move;
1122
- if(!s.check_move.call(this, this._get_move())) { return false; }
1123
- return true;
1124
- },
1125
- move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
1126
- var s = this._get_settings().crrm.move;
1127
- if(!is_prepared) {
1128
- if(!position) { position = s.default_position; }
1129
- if(position === "inside" && !s.default_position.match(/^(before|after)$/)) { position = s.default_position; }
1130
- return this.__call_old(true, obj, ref, position, is_copy, false, skip_check);
1131
- }
1132
- // if the move is already prepared
1133
- if(s.always_copy === true || (s.always_copy === "multitree" && obj.rt.get_index() !== obj.ot.get_index() )) {
1134
- is_copy = true;
1135
- }
1136
- this.__call_old(true, obj, ref, position, is_copy, true, skip_check);
1137
- },
1138
-
1139
- cut : function (obj) {
1140
- obj = this._get_node(obj);
1141
- this.data.crrm.cp_nodes = false;
1142
- this.data.crrm.ct_nodes = false;
1143
- if(!obj || !obj.length) { return false; }
1144
- this.data.crrm.ct_nodes = obj;
1145
- },
1146
- copy : function (obj) {
1147
- obj = this._get_node(obj);
1148
- this.data.crrm.cp_nodes = false;
1149
- this.data.crrm.ct_nodes = false;
1150
- if(!obj || !obj.length) { return false; }
1151
- this.data.crrm.cp_nodes = obj;
1152
- },
1153
- paste : function (obj) {
1154
- obj = this._get_node(obj);
1155
- if(!obj || !obj.length) { return false; }
1156
- if(!this.data.crrm.ct_nodes && !this.data.crrm.cp_nodes) { return false; }
1157
- if(this.data.crrm.ct_nodes) { this.move_node(this.data.crrm.ct_nodes, obj); }
1158
- if(this.data.crrm.cp_nodes) { this.move_node(this.data.crrm.cp_nodes, obj, false, true); }
1159
- this.data.crrm.cp_nodes = false;
1160
- this.data.crrm.ct_nodes = false;
1161
- }
1162
- }
1163
- });
1164
- // include the crr plugin by default
1165
- $.jstree.defaults.plugins.push("crrm");
1166
- })(jQuery);
1167
-
1168
- /*
1169
- * jsTree themes plugin 1.0
1170
- * Handles loading and setting themes, as well as detecting path to themes, etc.
1171
- */
1172
- (function ($) {
1173
- var themes_loaded = [];
1174
- // this variable stores the path to the themes folder - if left as false - it will be autodetected
1175
- $.jstree._themes = false;
1176
- $.jstree.plugin("themes", {
1177
- __init : function () {
1178
- this.get_container()
1179
- .bind("init.jstree", $.proxy(function () {
1180
- var s = this._get_settings().themes;
1181
- this.data.themes.dots = s.dots;
1182
- this.data.themes.icons = s.icons;
1183
- //alert(s.dots);
1184
- this.set_theme(s.theme, s.url);
1185
- }, this))
1186
- .bind("loaded.jstree", $.proxy(function () {
1187
- // bound here too, as simple HTML tree's won't honor dots & icons otherwise
1188
- if(!this.data.themes.dots) { this.hide_dots(); }
1189
- else { this.show_dots(); }
1190
- if(!this.data.themes.icons) { this.hide_icons(); }
1191
- else { this.show_icons(); }
1192
- }, this));
1193
- },
1194
- defaults : {
1195
- theme : "default",
1196
- url : false,
1197
- dots : true,
1198
- icons : true
1199
- },
1200
- _fn : {
1201
- set_theme : function (theme_name, theme_url) {
1202
- if(!theme_name) { return false; }
1203
- if(!theme_url) { theme_url = $.jstree._themes + theme_name + '/style.css'; }
1204
- if($.inArray(theme_url, themes_loaded) == -1) {
1205
- $.vakata.css.add_sheet({ "url" : theme_url, "rel" : "jstree" });
1206
- themes_loaded.push(theme_url);
1207
- }
1208
- if(this.data.themes.theme != theme_name) {
1209
- this.get_container().removeClass('jstree-' + this.data.themes.theme);
1210
- this.data.themes.theme = theme_name;
1211
- }
1212
- this.get_container().addClass('jstree-' + theme_name);
1213
- if(!this.data.themes.dots) { this.hide_dots(); }
1214
- else { this.show_dots(); }
1215
- if(!this.data.themes.icons) { this.hide_icons(); }
1216
- else { this.show_icons(); }
1217
- this.__callback();
1218
- },
1219
- get_theme : function () { return this.data.themes.theme; },
1220
-
1221
- show_dots : function () { this.data.themes.dots = true; this.get_container().children("ul").removeClass("jstree-no-dots"); },
1222
- hide_dots : function () { this.data.themes.dots = false; this.get_container().children("ul").addClass("jstree-no-dots"); },
1223
- toggle_dots : function () { if(this.data.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },
1224
-
1225
- show_icons : function () { this.data.themes.icons = true; this.get_container().children("ul").removeClass("jstree-no-icons"); },
1226
- hide_icons : function () { this.data.themes.icons = false; this.get_container().children("ul").addClass("jstree-no-icons"); },
1227
- toggle_icons: function () { if(this.data.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }
1228
- }
1229
- });
1230
- // autodetect themes path
1231
- $(function () {
1232
- if($.jstree._themes === false) {
1233
- $("script").each(function () {
1234
- if(this.src.toString().match(/jquery\.jstree[^\/]*?\.js(\?.*)?$/)) {
1235
- $.jstree._themes = this.src.toString().replace(/jquery\.jstree[^\/]*?\.js(\?.*)?$/, "") + 'themes/';
1236
- return false;
1237
- }
1238
- });
1239
- }
1240
- if($.jstree._themes === false) { $.jstree._themes = "themes/"; }
1241
- });
1242
- // include the themes plugin by default
1243
- $.jstree.defaults.plugins.push("themes");
1244
- })(jQuery);
1245
- //*/
1246
-
1247
- /*
1248
- * jsTree hotkeys plugin 1.0
1249
- * Enables keyboard navigation for all tree instances
1250
- * Depends on the jstree ui & jquery hotkeys plugins
1251
- */
1252
- (function ($) {
1253
- var bound = [];
1254
- function exec(i, event) {
1255
- var f = $.jstree._focused(), tmp;
1256
- if(f && f.data && f.data.hotkeys && f.data.hotkeys.enabled) {
1257
- tmp = f._get_settings().hotkeys[i];
1258
- if(tmp) { return tmp.call(f, event); }
1259
- }
1260
- }
1261
- $.jstree.plugin("hotkeys", {
1262
- __init : function () {
1263
- if(typeof $.hotkeys === "undefined") { throw "jsTree hotkeys: jQuery hotkeys plugin not included."; }
1264
- if(!this.data.ui) { throw "jsTree hotkeys: jsTree UI plugin not included."; }
1265
- $.each(this._get_settings().hotkeys, function (i, val) {
1266
- if($.inArray(i, bound) == -1) {
1267
- $(document).bind("keydown", i, function (event) { return exec(i, event); });
1268
- bound.push(i);
1269
- }
1270
- });
1271
- this.enable_hotkeys();
1272
- },
1273
- defaults : {
1274
- "up" : function () {
1275
- var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
1276
- this.hover_node(this._get_prev(o));
1277
- return false;
1278
- },
1279
- "down" : function () {
1280
- var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
1281
- this.hover_node(this._get_next(o));
1282
- return false;
1283
- },
1284
- "left" : function () {
1285
- var o = this.data.ui.hovered || this.data.ui.last_selected;
1286
- if(o) {
1287
- if(o.hasClass("jstree-open")) { this.close_node(o); }
1288
- else { this.hover_node(this._get_prev(o)); }
1289
- }
1290
- return false;
1291
- },
1292
- "right" : function () {
1293
- var o = this.data.ui.hovered || this.data.ui.last_selected;
1294
- if(o && o.length) {
1295
- if(o.hasClass("jstree-closed")) { this.open_node(o); }
1296
- else { this.hover_node(this._get_next(o)); }
1297
- }
1298
- return false;
1299
- },
1300
- "space" : function () {
1301
- if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").click(); }
1302
- return false;
1303
- },
1304
- "ctrl+space" : function (event) {
1305
- event.type = "click";
1306
- if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); }
1307
- return false;
1308
- },
1309
- "f2" : function () { this.rename(this.data.ui.hovered || this.data.ui.last_selected); },
1310
- "del" : function () { this.remove(this.data.ui.hovered || this._get_node(null)); }
1311
- },
1312
- _fn : {
1313
- enable_hotkeys : function () {
1314
- this.data.hotkeys.enabled = true;
1315
- },
1316
- disable_hotkeys : function () {
1317
- this.data.hotkeys.enabled = false;
1318
- }
1319
- }
1320
- });
1321
- })(jQuery);
1322
- //*/
1323
-
1324
- /*
1325
- * jsTree JSON 1.0
1326
- * The JSON data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
1327
- */
1328
- (function ($) {
1329
- $.jstree.plugin("json_data", {
1330
- defaults : {
1331
- data : false,
1332
- ajax : false,
1333
- correct_state : true,
1334
- progressive_render : false
1335
- },
1336
- _fn : {
1337
- load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_json(obj, function () { _this.__callback({ "obj" : obj }); s_call.call(this); }, e_call); },
1338
- _is_loaded : function (obj) {
1339
- var s = this._get_settings().json_data, d;
1340
- obj = this._get_node(obj);
1341
- if(obj && obj !== -1 && s.progressive_render && !obj.is(".jstree-open, .jstree-leaf") && obj.children("ul").children("li").length === 0 && obj.data("jstree-children")) {
1342
- d = this._parse_json(obj.data("jstree-children"));
1343
- if(d) {
1344
- obj.append(d);
1345
- $.removeData(obj, "jstree-children");
1346
- }
1347
- this.clean_node(obj);
1348
- return true;
1349
- }
1350
- return obj == -1 || !obj || !s.ajax || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
1351
- },
1352
- load_node_json : function (obj, s_call, e_call) {
1353
- var s = this.get_settings().json_data, d,
1354
- error_func = function () {},
1355
- success_func = function () {};
1356
- obj = this._get_node(obj);
1357
- if(obj && obj !== -1) {
1358
- if(obj.data("jstree-is-loading")) { return; }
1359
- else { obj.data("jstree-is-loading",true); }
1360
- }
1361
- switch(!0) {
1362
- case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
1363
- case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
1364
- if(!obj || obj == -1) {
1365
- d = this._parse_json(s.data);
1366
- if(d) {
1367
- this.get_container().children("ul").empty().append(d.children());
1368
- this.clean_node();
1369
- }
1370
- else {
1371
- if(s.correct_state) { this.get_container().children("ul").empty(); }
1372
- }
1373
- }
1374
- if(s_call) { s_call.call(this); }
1375
- break;
1376
- case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
1377
- error_func = function (x, t, e) {
1378
- var ef = this.get_settings().json_data.ajax.error;
1379
- if(ef) { ef.call(this, x, t, e); }
1380
- if(obj != -1 && obj.length) {
1381
- obj.children(".jstree-loading").removeClass("jstree-loading");
1382
- obj.data("jstree-is-loading",false);
1383
- if(t === "success" && s.correct_state) { obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); }
1384
- }
1385
- else {
1386
- if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
1387
- }
1388
- if(e_call) { e_call.call(this); }
1389
- };
1390
- success_func = function (d, t, x) {
1391
- var sf = this.get_settings().json_data.ajax.success;
1392
- if(sf) { d = sf.call(this,d,t,x) || d; }
1393
- if(d === "" || (!$.isArray(d) && !$.isPlainObject(d))) {
1394
- return error_func.call(this, x, t, "");
1395
- }
1396
- d = this._parse_json(d);
1397
- if(d) {
1398
- if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
1399
- else { obj.append(d).children(".jstree-loading").removeClass("jstree-loading"); obj.data("jstree-is-loading",false); }
1400
- this.clean_node(obj);
1401
- if(s_call) { s_call.call(this); }
1402
- }
1403
- else {
1404
- if(obj === -1 || !obj) {
1405
- if(s.correct_state) {
1406
- this.get_container().children("ul").empty();
1407
- if(s_call) { s_call.call(this); }
1408
- }
1409
- }
1410
- else {
1411
- obj.children(".jstree-loading").removeClass("jstree-loading");
1412
- obj.data("jstree-is-loading",false);
1413
- if(s.correct_state) {
1414
- obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");
1415
- if(s_call) { s_call.call(this); }
1416
- }
1417
- }
1418
- }
1419
- };
1420
- s.ajax.context = this;
1421
- s.ajax.error = error_func;
1422
- s.ajax.success = success_func;
1423
- if(!s.ajax.dataType) { s.ajax.dataType = "json"; }
1424
- if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
1425
- if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
1426
- $.ajax(s.ajax);
1427
- break;
1428
- }
1429
- },
1430
- _parse_json : function (js, is_callback) {
1431
- var d = false,
1432
- p = this._get_settings(),
1433
- s = p.json_data,
1434
- t = p.core.html_titles,
1435
- tmp, i, j, ul1, ul2;
1436
-
1437
- if(!js) { return d; }
1438
- if($.isFunction(js)) {
1439
- js = js.call(this);
1440
- }
1441
- if($.isArray(js)) {
1442
- d = $();
1443
- if(!js.length) { return false; }
1444
- for(i = 0, j = js.length; i < j; i++) {
1445
- tmp = this._parse_json(js[i], true);
1446
- if(tmp.length) { d = d.add(tmp); }
1447
- }
1448
- }
1449
- else {
1450
- if(typeof js == "string") { js = { data : js }; }
1451
- if(!js.data && js.data !== "") { return d; }
1452
- d = $("<li>");
1453
- if(js.attr) { d.attr(js.attr); }
1454
- if(js.metadata) { d.data("jstree", js.metadata); }
1455
- if(js.state) { d.addClass("jstree-" + js.state); }
1456
- if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
1457
- $.each(js.data, function (i, m) {
1458
- tmp = $("<a>");
1459
- if($.isFunction(m)) { m = m.call(this, js); }
1460
- if(typeof m == "string") { tmp.attr('href','#')[ t ? "html" : "text" ](m); }
1461
- else {
1462
- if(!m.attr) { m.attr = {}; }
1463
- if(!m.attr.href) { m.attr.href = '#'; }
1464
- tmp.attr(m.attr)[ t ? "html" : "text" ](m.title);
1465
- if(m.language) { tmp.addClass(m.language); }
1466
- }
1467
- tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");
1468
- if(!m.icon && js.icon) { m.icon = js.icon; }
1469
- if(m.icon) {
1470
- if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
1471
- else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
1472
- }
1473
- d.append(tmp);
1474
- });
1475
- d.prepend("<ins class='jstree-icon'>&#160;</ins>");
1476
- if(js.children) {
1477
- if(s.progressive_render && js.state !== "open") {
1478
- d.addClass("jstree-closed").data("jstree-children", js.children);
1479
- }
1480
- else {
1481
- if($.isFunction(js.children)) {
1482
- js.children = js.children.call(this, js);
1483
- }
1484
- if($.isArray(js.children) && js.children.length) {
1485
- tmp = this._parse_json(js.children, true);
1486
- if(tmp.length) {
1487
- ul2 = $("<ul>");
1488
- ul2.append(tmp);
1489
- d.append(ul2);
1490
- }
1491
- }
1492
- }
1493
- }
1494
- }
1495
- if(!is_callback) {
1496
- ul1 = $("<ul>");
1497
- ul1.append(d);
1498
- d = ul1;
1499
- }
1500
- return d;
1501
- },
1502
- get_json : function (obj, li_attr, a_attr, is_callback) {
1503
- var result = [],
1504
- s = this._get_settings(),
1505
- _this = this,
1506
- tmp1, tmp2, li, a, t, lang;
1507
- obj = this._get_node(obj);
1508
- if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
1509
- li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
1510
- if(!is_callback && this.data.types) { li_attr.push(s.types.type_attr); }
1511
- a_attr = $.isArray(a_attr) ? a_attr : [ ];
1512
-
1513
- obj.each(function () {
1514
- li = $(this);
1515
- tmp1 = { data : [] };
1516
- if(li_attr.length) { tmp1.attr = { }; }
1517
- $.each(li_attr, function (i, v) {
1518
- tmp2 = li.attr(v);
1519
- if(tmp2 && tmp2.length && tmp2.replace(/jstree[^ ]*|$/ig,'').length) {
1520
- tmp1.attr[v] = tmp2.replace(/jstree[^ ]*|$/ig,'');
1521
- }
1522
- });
1523
- if(li.hasClass("jstree-open")) { tmp1.state = "open"; }
1524
- if(li.hasClass("jstree-closed")) { tmp1.state = "closed"; }
1525
- a = li.children("a");
1526
- a.each(function () {
1527
- t = $(this);
1528
- if(
1529
- a_attr.length ||
1530
- $.inArray("languages", s.plugins) !== -1 ||
1531
- t.children("ins").get(0).style.backgroundImage.length ||
1532
- (t.children("ins").get(0).className && t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').length)
1533
- ) {
1534
- lang = false;
1535
- if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {
1536
- $.each(s.languages, function (l, lv) {
1537
- if(t.hasClass(lv)) {
1538
- lang = lv;
1539
- return false;
1540
- }
1541
- });
1542
- }
1543
- tmp2 = { attr : { }, title : _this.get_text(t, lang) };
1544
- $.each(a_attr, function (k, z) {
1545
- tmp1.attr[z] = (t.attr(z) || "").replace(/jstree[^ ]*|$/ig,'');
1546
- });
1547
- $.each(s.languages, function (k, z) {
1548
- if(t.hasClass(z)) { tmp2.language = z; return true; }
1549
- });
1550
- if(t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
1551
- tmp2.icon = t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"");
1552
- }
1553
- if(t.children("ins").get(0).style.backgroundImage.length) {
1554
- tmp2.icon = t.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","");
1555
- }
1556
- }
1557
- else {
1558
- tmp2 = _this.get_text(t);
1559
- }
1560
- if(a.length > 1) { tmp1.data.push(tmp2); }
1561
- else { tmp1.data = tmp2; }
1562
- });
1563
- li = li.find("> ul > li");
1564
- if(li.length) { tmp1.children = _this.get_json(li, li_attr, a_attr, true); }
1565
- result.push(tmp1);
1566
- });
1567
- return result;
1568
- }
1569
- }
1570
- });
1571
- })(jQuery);
1572
- //*/
1573
-
1574
- /*
1575
- * jsTree languages plugin 1.0
1576
- * Adds support for multiple language versions in one tree
1577
- * This basically allows for many titles coexisting in one node, but only one of them being visible at any given time
1578
- * This is useful for maintaining the same structure in many languages (hence the name of the plugin)
1579
- */
1580
- (function ($) {
1581
- $.jstree.plugin("languages", {
1582
- __init : function () { this._load_css(); },
1583
- defaults : [],
1584
- _fn : {
1585
- set_lang : function (i) {
1586
- var langs = this._get_settings().languages,
1587
- st = false,
1588
- selector = ".jstree-" + this.get_index() + ' a';
1589
- if(!$.isArray(langs) || langs.length === 0) { return false; }
1590
- if($.inArray(i,langs) == -1) {
1591
- if(!!langs[i]) { i = langs[i]; }
1592
- else { return false; }
1593
- }
1594
- if(i == this.data.languages.current_language) { return true; }
1595
- st = $.vakata.css.get_css(selector + "." + this.data.languages.current_language, false, this.data.languages.language_css);
1596
- if(st !== false) { st.style.display = "none"; }
1597
- st = $.vakata.css.get_css(selector + "." + i, false, this.data.languages.language_css);
1598
- if(st !== false) { st.style.display = ""; }
1599
- this.data.languages.current_language = i;
1600
- this.__callback(i);
1601
- return true;
1602
- },
1603
- get_lang : function () {
1604
- return this.data.languages.current_language;
1605
- },
1606
- get_text : function (obj, lang) {
1607
- obj = this._get_node(obj) || this.data.ui.last_selected;
1608
- if(!obj.size()) { return false; }
1609
- var langs = this._get_settings().languages,
1610
- s = this._get_settings().core.html_titles;
1611
- if($.isArray(langs) && langs.length) {
1612
- lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
1613
- obj = obj.children("a." + lang);
1614
- }
1615
- else { obj = obj.children("a:eq(0)"); }
1616
- if(s) {
1617
- obj = obj.clone();
1618
- obj.children("INS").remove();
1619
- return obj.html();
1620
- }
1621
- else {
1622
- obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
1623
- return obj.nodeValue;
1624
- }
1625
- },
1626
- set_text : function (obj, val, lang) {
1627
- obj = this._get_node(obj) || this.data.ui.last_selected;
1628
- if(!obj.size()) { return false; }
1629
- var langs = this._get_settings().languages,
1630
- s = this._get_settings().core.html_titles,
1631
- tmp;
1632
- if($.isArray(langs) && langs.length) {
1633
- lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
1634
- obj = obj.children("a." + lang);
1635
- }
1636
- else { obj = obj.children("a:eq(0)"); }
1637
- if(s) {
1638
- tmp = obj.children("INS").clone();
1639
- obj.html(val).prepend(tmp);
1640
- this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
1641
- return true;
1642
- }
1643
- else {
1644
- obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
1645
- this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
1646
- return (obj.nodeValue = val);
1647
- }
1648
- },
1649
- _load_css : function () {
1650
- var langs = this._get_settings().languages,
1651
- str = "/* languages css */",
1652
- selector = ".jstree-" + this.get_index() + ' a',
1653
- ln;
1654
- if($.isArray(langs) && langs.length) {
1655
- this.data.languages.current_language = langs[0];
1656
- for(ln = 0; ln < langs.length; ln++) {
1657
- str += selector + "." + langs[ln] + " {";
1658
- if(langs[ln] != this.data.languages.current_language) { str += " display:none; "; }
1659
- str += " } ";
1660
- }
1661
- this.data.languages.language_css = $.vakata.css.add_sheet({ 'str' : str });
1662
- }
1663
- },
1664
- create_node : function (obj, position, js, callback) {
1665
- var t = this.__call_old(true, obj, position, js, function (t) {
1666
- var langs = this._get_settings().languages,
1667
- a = t.children("a"),
1668
- ln;
1669
- if($.isArray(langs) && langs.length) {
1670
- for(ln = 0; ln < langs.length; ln++) {
1671
- if(!a.is("." + langs[ln])) {
1672
- t.append(a.eq(0).clone().removeClass(langs.join(" ")).addClass(langs[ln]));
1673
- }
1674
- }
1675
- a.not("." + langs.join(", .")).remove();
1676
- }
1677
- if(callback) { callback.call(this, t); }
1678
- });
1679
- return t;
1680
- }
1681
- }
1682
- });
1683
- })(jQuery);
1684
- //*/
1685
-
1686
- /*
1687
- * jsTree cookies plugin 1.0
1688
- * Stores the currently opened/selected nodes in a cookie and then restores them
1689
- * Depends on the jquery.cookie plugin
1690
- */
1691
- (function ($) {
1692
- $.jstree.plugin("cookies", {
1693
- __init : function () {
1694
- if(typeof $.cookie === "undefined") { throw "jsTree cookie: jQuery cookie plugin not included."; }
1695
-
1696
- var s = this._get_settings().cookies,
1697
- tmp;
1698
- if(!!s.save_opened) {
1699
- tmp = $.cookie(s.save_opened);
1700
- if(tmp && tmp.length) { this.data.core.to_open = tmp.split(","); }
1701
- }
1702
- if(!!s.save_selected) {
1703
- tmp = $.cookie(s.save_selected);
1704
- if(tmp && tmp.length && this.data.ui) { this.data.ui.to_select = tmp.split(","); }
1705
- }
1706
- this.get_container()
1707
- .one( ( this.data.ui ? "reselect" : "reopen" ) + ".jstree", $.proxy(function () {
1708
- this.get_container()
1709
- .bind("open_node.jstree close_node.jstree select_node.jstree deselect_node.jstree", $.proxy(function (e) {
1710
- if(this._get_settings().cookies.auto_save) { this.save_cookie((e.handleObj.namespace + e.handleObj.type).replace("jstree","")); }
1711
- }, this));
1712
- }, this));
1713
- },
1714
- defaults : {
1715
- save_opened : "jstree_open",
1716
- save_selected : "jstree_select",
1717
- auto_save : true,
1718
- cookie_options : {}
1719
- },
1720
- _fn : {
1721
- save_cookie : function (c) {
1722
- if(this.data.core.refreshing) { return; }
1723
- var s = this._get_settings().cookies;
1724
- if(!c) { // if called manually and not by event
1725
- if(s.save_opened) {
1726
- this.save_opened();
1727
- $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);
1728
- }
1729
- if(s.save_selected && this.data.ui) {
1730
- this.save_selected();
1731
- $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);
1732
- }
1733
- return;
1734
- }
1735
- switch(c) {
1736
- case "open_node":
1737
- case "close_node":
1738
- if(!!s.save_opened) {
1739
- this.save_opened();
1740
- $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);
1741
- }
1742
- break;
1743
- case "select_node":
1744
- case "deselect_node":
1745
- if(!!s.save_selected && this.data.ui) {
1746
- this.save_selected();
1747
- $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);
1748
- }
1749
- break;
1750
- }
1751
- }
1752
- }
1753
- });
1754
- // include cookies by default
1755
- $.jstree.defaults.plugins.push("cookies");
1756
- })(jQuery);
1757
- //*/
1758
-
1759
- /*
1760
- * jsTree sort plugin 1.0
1761
- * Sorts items alphabetically (or using any other function)
1762
- */
1763
- (function ($) {
1764
- $.jstree.plugin("sort", {
1765
- __init : function () {
1766
- this.get_container()
1767
- .bind("load_node.jstree", $.proxy(function (e, data) {
1768
- var obj = this._get_node(data.rslt.obj);
1769
- obj = obj === -1 ? this.get_container().children("ul") : obj.children("ul");
1770
- this.sort(obj);
1771
- }, this))
1772
- .bind("rename_node.jstree", $.proxy(function (e, data) {
1773
- this.sort(data.rslt.obj.parent());
1774
- }, this))
1775
- .bind("move_node.jstree", $.proxy(function (e, data) {
1776
- var m = data.rslt.np == -1 ? this.get_container() : data.rslt.np;
1777
- this.sort(m.children("ul"));
1778
- }, this));
1779
- },
1780
- defaults : function (a, b) { return this.get_text(a) > this.get_text(b) ? 1 : -1; },
1781
- _fn : {
1782
- sort : function (obj) {
1783
- var s = this._get_settings().sort,
1784
- t = this;
1785
- obj.append($.makeArray(obj.children("li")).sort($.proxy(s, t)));
1786
- obj.find("> li > ul").each(function() { t.sort($(this)); });
1787
- this.clean_node(obj);
1788
- }
1789
- }
1790
- });
1791
- })(jQuery);
1792
- //*/
1793
-
1794
- /*
1795
- * jsTree DND plugin 1.0
1796
- * Drag and drop plugin for moving/copying nodes
1797
- */
1798
- (function ($) {
1799
- var o = false,
1800
- r = false,
1801
- m = false,
1802
- sli = false,
1803
- sti = false,
1804
- dir1 = false,
1805
- dir2 = false;
1806
- $.vakata.dnd = {
1807
- is_down : false,
1808
- is_drag : false,
1809
- helper : false,
1810
- scroll_spd : 10,
1811
- init_x : 0,
1812
- init_y : 0,
1813
- threshold : 5,
1814
- user_data : {},
1815
-
1816
- drag_start : function (e, data, html) {
1817
- if($.vakata.dnd.is_drag) { $.vakata.drag_stop({}); }
1818
- try {
1819
- e.currentTarget.unselectable = "on";
1820
- e.currentTarget.onselectstart = function() { return false; };
1821
- if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; }
1822
- } catch(err) { }
1823
- $.vakata.dnd.init_x = e.pageX;
1824
- $.vakata.dnd.init_y = e.pageY;
1825
- $.vakata.dnd.user_data = data;
1826
- $.vakata.dnd.is_down = true;
1827
- $.vakata.dnd.helper = $("<div id='vakata-dragged'>").html(html).css("opacity", "0.75");
1828
- $(document).bind("mousemove", $.vakata.dnd.drag);
1829
- $(document).bind("mouseup", $.vakata.dnd.drag_stop);
1830
- return false;
1831
- },
1832
- drag : function (e) {
1833
- if(!$.vakata.dnd.is_down) { return; }
1834
- if(!$.vakata.dnd.is_drag) {
1835
- if(Math.abs(e.pageX - $.vakata.dnd.init_x) > 5 || Math.abs(e.pageY - $.vakata.dnd.init_y) > 5) {
1836
- $.vakata.dnd.helper.appendTo("body");
1837
- $.vakata.dnd.is_drag = true;
1838
- $(document).triggerHandler("drag_start.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
1839
- }
1840
- else { return; }
1841
- }
1842
-
1843
- // maybe use a scrolling parent element instead of document?
1844
- if(e.type === "mousemove") { // thought of adding scroll in order to move the helper, but mouse poisition is n/a
1845
- var d = $(document), t = d.scrollTop(), l = d.scrollLeft();
1846
- if(e.pageY - t < 20) {
1847
- if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
1848
- if(!sti) { dir1 = "up"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() - $.vakata.dnd.scroll_spd); }, 150); }
1849
- }
1850
- else {
1851
- if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
1852
- }
1853
- if($(window).height() - (e.pageY - t) < 20) {
1854
- if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
1855
- if(!sti) { dir1 = "down"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() + $.vakata.dnd.scroll_spd); }, 150); }
1856
- }
1857
- else {
1858
- if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
1859
- }
1860
-
1861
- if(e.pageX - l < 20) {
1862
- if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
1863
- if(!sli) { dir2 = "left"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() - $.vakata.dnd.scroll_spd); }, 150); }
1864
- }
1865
- else {
1866
- if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
1867
- }
1868
- if($(window).width() - (e.pageX - l) < 20) {
1869
- if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
1870
- if(!sli) { dir2 = "right"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() + $.vakata.dnd.scroll_spd); }, 150); }
1871
- }
1872
- else {
1873
- if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
1874
- }
1875
- }
1876
-
1877
- $.vakata.dnd.helper.css({ left : (e.pageX + 5) + "px", top : (e.pageY + 10) + "px" });
1878
- $(document).triggerHandler("drag.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
1879
- },
1880
- drag_stop : function (e) {
1881
- $(document).unbind("mousemove", $.vakata.dnd.drag);
1882
- $(document).unbind("mouseup", $.vakata.dnd.drag_stop);
1883
- $(document).triggerHandler("drag_stop.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
1884
- $.vakata.dnd.helper.remove();
1885
- $.vakata.dnd.init_x = 0;
1886
- $.vakata.dnd.init_y = 0;
1887
- $.vakata.dnd.user_data = {};
1888
- $.vakata.dnd.is_down = false;
1889
- $.vakata.dnd.is_drag = false;
1890
- }
1891
- };
1892
- $(function() {
1893
- var css_string = '#vakata-dragged { display:block; margin:0 0 0 0; padding:4px 4px 4px 24px; position:absolute; top:-2000px; line-height:16px; z-index:10000; } ';
1894
- $.vakata.css.add_sheet({ str : css_string });
1895
- });
1896
-
1897
- $.jstree.plugin("dnd", {
1898
- __init : function () {
1899
- this.data.dnd = {
1900
- active : false,
1901
- after : false,
1902
- inside : false,
1903
- before : false,
1904
- off : false,
1905
- prepared : false,
1906
- w : 0,
1907
- to1 : false,
1908
- to2 : false,
1909
- cof : false,
1910
- cw : false,
1911
- ch : false,
1912
- i1 : false,
1913
- i2 : false
1914
- };
1915
- this.get_container()
1916
- .bind("mouseenter.jstree", $.proxy(function () {
1917
- if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && this.data.themes) {
1918
- m.attr("class", "jstree-" + this.data.themes.theme);
1919
- $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
1920
- }
1921
- }, this))
1922
- .bind("mouseleave.jstree", $.proxy(function () {
1923
- if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
1924
- if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
1925
- if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
1926
- }
1927
- }, this))
1928
- .bind("mousemove.jstree", $.proxy(function (e) {
1929
- if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
1930
- var cnt = this.get_container()[0];
1931
-
1932
- // Horizontal scroll
1933
- if(e.pageX + 24 > this.data.dnd.cof.left + this.data.dnd.cw) {
1934
- if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
1935
- this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft += $.vakata.dnd.scroll_spd; }, cnt), 100);
1936
- }
1937
- else if(e.pageX - 24 < this.data.dnd.cof.left) {
1938
- if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
1939
- this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft -= $.vakata.dnd.scroll_spd; }, cnt), 100);
1940
- }
1941
- else {
1942
- if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
1943
- }
1944
-
1945
- // Vertical scroll
1946
- if(e.pageY + 24 > this.data.dnd.cof.top + this.data.dnd.ch) {
1947
- if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
1948
- this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop += $.vakata.dnd.scroll_spd; }, cnt), 100);
1949
- }
1950
- else if(e.pageY - 24 < this.data.dnd.cof.top) {
1951
- if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
1952
- this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop -= $.vakata.dnd.scroll_spd; }, cnt), 100);
1953
- }
1954
- else {
1955
- if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
1956
- }
1957
-
1958
- }
1959
- }, this))
1960
- .delegate("a", "mousedown.jstree", $.proxy(function (e) {
1961
- if(e.which === 1) {
1962
- this.start_drag(e.currentTarget, e);
1963
- return false;
1964
- }
1965
- }, this))
1966
- .delegate("a", "mouseenter.jstree", $.proxy(function (e) {
1967
- if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
1968
- this.dnd_enter(e.currentTarget);
1969
- }
1970
- }, this))
1971
- .delegate("a", "mousemove.jstree", $.proxy(function (e) {
1972
- if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
1973
- if(typeof this.data.dnd.off.top === "undefined") { this.data.dnd.off = $(e.target).offset(); }
1974
- this.data.dnd.w = (e.pageY - (this.data.dnd.off.top || 0)) % this.data.core.li_height;
1975
- if(this.data.dnd.w < 0) { this.data.dnd.w += this.data.core.li_height; }
1976
- this.dnd_show();
1977
- }
1978
- }, this))
1979
- .delegate("a", "mouseleave.jstree", $.proxy(function (e) {
1980
- if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
1981
- this.data.dnd.after = false;
1982
- this.data.dnd.before = false;
1983
- this.data.dnd.inside = false;
1984
- $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
1985
- m.hide();
1986
- if(r && r[0] === e.target.parentNode) {
1987
- if(this.data.dnd.to1) {
1988
- clearTimeout(this.data.dnd.to1);
1989
- this.data.dnd.to1 = false;
1990
- }
1991
- if(this.data.dnd.to2) {
1992
- clearTimeout(this.data.dnd.to2);
1993
- this.data.dnd.to2 = false;
1994
- }
1995
- }
1996
- }
1997
- }, this))
1998
- .delegate("a", "mouseup.jstree", $.proxy(function (e) {
1999
- if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
2000
- this.dnd_finish(e);
2001
- }
2002
- }, this));
2003
-
2004
- $(document)
2005
- .bind("drag_stop.vakata", $.proxy(function () {
2006
- this.data.dnd.after = false;
2007
- this.data.dnd.before = false;
2008
- this.data.dnd.inside = false;
2009
- this.data.dnd.off = false;
2010
- this.data.dnd.prepared = false;
2011
- this.data.dnd.w = false;
2012
- this.data.dnd.to1 = false;
2013
- this.data.dnd.to2 = false;
2014
- this.data.dnd.active = false;
2015
- this.data.dnd.foreign = false;
2016
- if(m) { m.css({ "top" : "-2000px" }); }
2017
- }, this))
2018
- .bind("drag_start.vakata", $.proxy(function (e, data) {
2019
- if(data.data.jstree) {
2020
- var et = $(data.event.target);
2021
- if(et.closest(".jstree").hasClass("jstree-" + this.get_index())) {
2022
- this.dnd_enter(et);
2023
- }
2024
- }
2025
- }, this));
2026
-
2027
- var s = this._get_settings().dnd;
2028
- if(s.drag_target) {
2029
- $(document)
2030
- .delegate(s.drag_target, "mousedown.jstree", $.proxy(function (e) {
2031
- o = e.target;
2032
- $.vakata.dnd.drag_start(e, { jstree : true, obj : e.target }, "<ins class='jstree-icon'></ins>" + $(e.target).text() );
2033
- if(this.data.themes) {
2034
- m.attr("class", "jstree-" + this.data.themes.theme);
2035
- $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
2036
- }
2037
- $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
2038
- var cnt = this.get_container();
2039
- this.data.dnd.cof = cnt.offset();
2040
- this.data.dnd.cw = parseInt(cnt.width(),10);
2041
- this.data.dnd.ch = parseInt(cnt.height(),10);
2042
- this.data.dnd.foreign = true;
2043
- return false;
2044
- }, this));
2045
- }
2046
- if(s.drop_target) {
2047
- $(document)
2048
- .delegate(s.drop_target, "mouseenter.jstree", $.proxy(function (e) {
2049
- if(this.data.dnd.active && this._get_settings().dnd.drop_check.call(this, { "o" : o, "r" : $(e.target) })) {
2050
- $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
2051
- }
2052
- }, this))
2053
- .delegate(s.drop_target, "mouseleave.jstree", $.proxy(function (e) {
2054
- if(this.data.dnd.active) {
2055
- $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
2056
- }
2057
- }, this))
2058
- .delegate(s.drop_target, "mouseup.jstree", $.proxy(function (e) {
2059
- if(this.data.dnd.active && $.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {
2060
- this._get_settings().dnd.drop_finish.call(this, { "o" : o, "r" : $(e.target) });
2061
- }
2062
- }, this));
2063
- }
2064
- },
2065
- defaults : {
2066
- copy_modifier : "ctrl",
2067
- check_timeout : 200,
2068
- open_timeout : 500,
2069
- drop_target : ".jstree-drop",
2070
- drop_check : function (data) { return true; },
2071
- drop_finish : $.noop,
2072
- drag_target : ".jstree-draggable",
2073
- drag_finish : $.noop,
2074
- drag_check : function (data) { return { after : false, before : false, inside : true }; }
2075
- },
2076
- _fn : {
2077
- dnd_prepare : function () {
2078
- if(!r || !r.length) { return; }
2079
- this.data.dnd.off = r.offset();
2080
- if(this._get_settings().core.rtl) {
2081
- this.data.dnd.off.right = this.data.dnd.off.left + r.width();
2082
- }
2083
- if(this.data.dnd.foreign) {
2084
- var a = this._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : r });
2085
- this.data.dnd.after = a.after;
2086
- this.data.dnd.before = a.before;
2087
- this.data.dnd.inside = a.inside;
2088
- this.data.dnd.prepared = true;
2089
- return this.dnd_show();
2090
- }
2091
- this.prepare_move(o, r, "before");
2092
- this.data.dnd.before = this.check_move();
2093
- this.prepare_move(o, r, "after");
2094
- this.data.dnd.after = this.check_move();
2095
- if(this._is_loaded(r)) {
2096
- this.prepare_move(o, r, "inside");
2097
- this.data.dnd.inside = this.check_move();
2098
- }
2099
- else {
2100
- this.data.dnd.inside = false;
2101
- }
2102
- this.data.dnd.prepared = true;
2103
- return this.dnd_show();
2104
- },
2105
- dnd_show : function () {
2106
- if(!this.data.dnd.prepared) { return; }
2107
- var o = ["before","inside","after"],
2108
- r = false,
2109
- rtl = this._get_settings().core.rtl,
2110
- pos;
2111
- if(this.data.dnd.w < this.data.core.li_height/3) { o = ["before","inside","after"]; }
2112
- else if(this.data.dnd.w <= this.data.core.li_height*2/3) {
2113
- o = this.data.dnd.w < this.data.core.li_height/2 ? ["inside","before","after"] : ["inside","after","before"];
2114
- }
2115
- else { o = ["after","inside","before"]; }
2116
- $.each(o, $.proxy(function (i, val) {
2117
- if(this.data.dnd[val]) {
2118
- $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
2119
- r = val;
2120
- return false;
2121
- }
2122
- }, this));
2123
- if(r === false) { $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); }
2124
-
2125
- pos = rtl ? (this.data.dnd.off.right - 18) : (this.data.dnd.off.left + 10);
2126
- switch(r) {
2127
- case "before":
2128
- m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top - 6) + "px" }).show();
2129
- break;
2130
- case "after":
2131
- m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 7) + "px" }).show();
2132
- break;
2133
- case "inside":
2134
- m.css({ "left" : pos + ( rtl ? -4 : 4) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height/2 - 5) + "px" }).show();
2135
- break;
2136
- default:
2137
- m.hide();
2138
- break;
2139
- }
2140
- return r;
2141
- },
2142
- dnd_open : function () {
2143
- this.data.dnd.to2 = false;
2144
- this.open_node(r, $.proxy(this.dnd_prepare,this), true);
2145
- },
2146
- dnd_finish : function (e) {
2147
- if(this.data.dnd.foreign) {
2148
- if(this.data.dnd.after || this.data.dnd.before || this.data.dnd.inside) {
2149
- this._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : r });
2150
- }
2151
- }
2152
- else {
2153
- this.dnd_prepare();
2154
- this.move_node(o, r, this.dnd_show(), e[this._get_settings().dnd.copy_modifier + "Key"]);
2155
- }
2156
- o = false;
2157
- r = false;
2158
- m.hide();
2159
- },
2160
- dnd_enter : function (obj) {
2161
- var s = this._get_settings().dnd;
2162
- this.data.dnd.prepared = false;
2163
- r = this._get_node(obj);
2164
- if(s.check_timeout) {
2165
- // do the calculations after a minimal timeout (users tend to drag quickly to the desired location)
2166
- if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
2167
- this.data.dnd.to1 = setTimeout($.proxy(this.dnd_prepare, this), s.check_timeout);
2168
- }
2169
- else {
2170
- this.dnd_prepare();
2171
- }
2172
- if(s.open_timeout) {
2173
- if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
2174
- if(r && r.length && r.hasClass("jstree-closed")) {
2175
- // if the node is closed - open it, then recalculate
2176
- this.data.dnd.to2 = setTimeout($.proxy(this.dnd_open, this), s.open_timeout);
2177
- }
2178
- }
2179
- else {
2180
- if(r && r.length && r.hasClass("jstree-closed")) {
2181
- this.dnd_open();
2182
- }
2183
- }
2184
- },
2185
- start_drag : function (obj, e) {
2186
- o = this._get_node(obj);
2187
- if(this.data.ui && this.is_selected(o)) { o = this._get_node(null, true); }
2188
- $.vakata.dnd.drag_start(e, { jstree : true, obj : o }, "<ins class='jstree-icon'></ins>" + (o.length > 1 ? "Multiple selection" : this.get_text(o)) );
2189
- if(this.data.themes) {
2190
- m.attr("class", "jstree-" + this.data.themes.theme);
2191
- $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
2192
- }
2193
- var cnt = this.get_container();
2194
- this.data.dnd.cof = cnt.children("ul").offset();
2195
- this.data.dnd.cw = parseInt(cnt.width(),10);
2196
- this.data.dnd.ch = parseInt(cnt.height(),10);
2197
- this.data.dnd.active = true;
2198
- }
2199
- }
2200
- });
2201
- $(function() {
2202
- var css_string = '' +
2203
- '#vakata-dragged ins { display:block; text-decoration:none; width:16px; height:16px; margin:0 0 0 0; padding:0; position:absolute; top:4px; left:4px; } ' +
2204
- '#vakata-dragged .jstree-ok { background:green; } ' +
2205
- '#vakata-dragged .jstree-invalid { background:red; } ' +
2206
- '#jstree-marker { padding:0; margin:0; line-height:12px; font-size:1px; overflow:hidden; height:12px; width:8px; position:absolute; top:-30px; z-index:10000; background-repeat:no-repeat; display:none; background-color:silver; } ';
2207
- $.vakata.css.add_sheet({ str : css_string });
2208
- m = $("<div>").attr({ id : "jstree-marker" }).hide().appendTo("body");
2209
- $(document).bind("drag_start.vakata", function (e, data) {
2210
- if(data.data.jstree) {
2211
- m.show();
2212
- }
2213
- });
2214
- $(document).bind("drag_stop.vakata", function (e, data) {
2215
- if(data.data.jstree) { m.hide(); }
2216
- });
2217
- });
2218
- })(jQuery);
2219
- //*/
2220
-
2221
- /*
2222
- * jsTree checkbox plugin 1.0
2223
- * Inserts checkboxes in front of every node
2224
- * Depends on the ui plugin
2225
- * DOES NOT WORK NICELY WITH MULTITREE DRAG'N'DROP
2226
- */
2227
- (function ($) {
2228
- $.jstree.plugin("checkbox", {
2229
- __init : function () {
2230
- this.select_node = this.deselect_node = this.deselect_all = $.noop;
2231
- this.get_selected = this.get_checked;
2232
-
2233
- this.get_container()
2234
- .bind("open_node.jstree create_node.jstree clean_node.jstree", $.proxy(function (e, data) {
2235
- this._prepare_checkboxes(data.rslt.obj);
2236
- }, this))
2237
- .bind("loaded.jstree", $.proxy(function (e) {
2238
- this._prepare_checkboxes();
2239
- }, this))
2240
- .delegate("a", "click.jstree", $.proxy(function (e) {
2241
- if(this._get_node(e.target).hasClass("jstree-checked")) { this.uncheck_node(e.target); }
2242
- else { this.check_node(e.target); }
2243
- if(this.data.ui) { this.save_selected(); }
2244
- if(this.data.cookies) { this.save_cookie("select_node"); }
2245
- e.preventDefault();
2246
- }, this));
2247
- },
2248
- __destroy : function () {
2249
- this.get_container().find(".jstree-checkbox").remove();
2250
- },
2251
- _fn : {
2252
- _prepare_checkboxes : function (obj) {
2253
- obj = !obj || obj == -1 ? this.get_container() : this._get_node(obj);
2254
- var c, _this = this, t;
2255
- obj.each(function () {
2256
- t = $(this);
2257
- c = t.is("li") && t.hasClass("jstree-checked") ? "jstree-checked" : "jstree-unchecked";
2258
- t.find("a").not(":has(.jstree-checkbox)").prepend("<ins class='jstree-checkbox'>&#160;</ins>").parent().not(".jstree-checked, .jstree-unchecked").addClass(c);
2259
- });
2260
- if(obj.is("li")) { this._repair_state(obj); }
2261
- else { obj.find("> ul > li").each(function () { _this._repair_state(this); }); }
2262
- },
2263
- change_state : function (obj, state) {
2264
- obj = this._get_node(obj);
2265
- state = (state === false || state === true) ? state : obj.hasClass("jstree-checked");
2266
- if(state) { obj.find("li").andSelf().removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked"); }
2267
- else {
2268
- obj.find("li").andSelf().removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");
2269
- if(this.data.ui) { this.data.ui.last_selected = obj; }
2270
- this.data.checkbox.last_selected = obj;
2271
- }
2272
- obj.parentsUntil(".jstree", "li").each(function () {
2273
- var $this = $(this);
2274
- if(state) {
2275
- if($this.children("ul").children(".jstree-checked, .jstree-undetermined").length) {
2276
- $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
2277
- return false;
2278
- }
2279
- else {
2280
- $this.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");
2281
- }
2282
- }
2283
- else {
2284
- if($this.children("ul").children(".jstree-unchecked, .jstree-undetermined").length) {
2285
- $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
2286
- return false;
2287
- }
2288
- else {
2289
- $this.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");
2290
- }
2291
- }
2292
- });
2293
- if(this.data.ui) { this.data.ui.selected = this.get_checked(); }
2294
- this.__callback(obj);
2295
- },
2296
- check_node : function (obj) {
2297
- this.change_state(obj, false);
2298
- },
2299
- uncheck_node : function (obj) {
2300
- this.change_state(obj, true);
2301
- },
2302
- check_all : function () {
2303
- var _this = this;
2304
- this.get_container().children("ul").children("li").each(function () {
2305
- _this.check_node(this, false);
2306
- });
2307
- },
2308
- uncheck_all : function () {
2309
- var _this = this;
2310
- this.get_container().children("ul").children("li").each(function () {
2311
- _this.change_state(this, true);
2312
- });
2313
- },
2314
-
2315
- is_checked : function(obj) {
2316
- obj = this._get_node(obj);
2317
- return obj.length ? obj.is(".jstree-checked") : false;
2318
- },
2319
- get_checked : function (obj) {
2320
- obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
2321
- return obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked");
2322
- },
2323
- get_unchecked : function (obj) {
2324
- obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
2325
- return obj.find("> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked");
2326
- },
2327
-
2328
- show_checkboxes : function () { this.get_container().children("ul").removeClass("jstree-no-checkboxes"); },
2329
- hide_checkboxes : function () { this.get_container().children("ul").addClass("jstree-no-checkboxes"); },
2330
-
2331
- _repair_state : function (obj) {
2332
- obj = this._get_node(obj);
2333
- if(!obj.length) { return; }
2334
- var a = obj.find("> ul > .jstree-checked").length,
2335
- b = obj.find("> ul > .jstree-undetermined").length,
2336
- c = obj.find("> ul > li").length;
2337
-
2338
- if(c === 0) { if(obj.hasClass("jstree-undetermined")) { this.check_node(obj); } }
2339
- else if(a === 0 && b === 0) { this.uncheck_node(obj); }
2340
- else if(a === c) { this.check_node(obj); }
2341
- else {
2342
- obj.parentsUntil(".jstree","li").removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
2343
- }
2344
- },
2345
- reselect : function () {
2346
- if(this.data.ui) {
2347
- var _this = this,
2348
- s = this.data.ui.to_select;
2349
- s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/'); });
2350
- this.deselect_all();
2351
- $.each(s, function (i, val) { _this.check_node(val); });
2352
- this.__callback();
2353
- }
2354
- }
2355
- }
2356
- });
2357
- })(jQuery);
2358
- //*/
2359
-
2360
- /*
2361
- * jsTree XML 1.0
2362
- * The XML data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
2363
- */
2364
- (function ($) {
2365
- $.vakata.xslt = function (xml, xsl, callback) {
2366
- var rs = "", xm, xs, processor, support;
2367
- if(document.recalc) {
2368
- xm = document.createElement('xml');
2369
- xs = document.createElement('xml');
2370
- xm.innerHTML = xml;
2371
- xs.innerHTML = xsl;
2372
- $("body").append(xm).append(xs);
2373
- setTimeout( (function (xm, xs, callback) {
2374
- return function () {
2375
- callback.call(null, xm.transformNode(xs.XMLDocument));
2376
- setTimeout( (function (xm, xs) { return function () { jQuery("body").remove(xm).remove(xs); }; })(xm, xs), 200);
2377
- };
2378
- }) (xm, xs, callback), 100);
2379
- return true;
2380
- }
2381
- if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor !== "undefined") {
2382
- processor = new XSLTProcessor();
2383
- support = $.isFunction(processor.transformDocument) ? (typeof window.XMLSerializer !== "undefined") : true;
2384
- if(!support) { return false; }
2385
- xml = new DOMParser().parseFromString(xml, "text/xml");
2386
- xsl = new DOMParser().parseFromString(xsl, "text/xml");
2387
- if($.isFunction(processor.transformDocument)) {
2388
- rs = document.implementation.createDocument("", "", null);
2389
- processor.transformDocument(xml, xsl, rs, null);
2390
- callback.call(null, XMLSerializer().serializeToString(rs));
2391
- return true;
2392
- }
2393
- else {
2394
- processor.importStylesheet(xsl);
2395
- rs = processor.transformToFragment(xml, document);
2396
- callback.call(null, $("<div>").append(rs).html());
2397
- return true;
2398
- }
2399
- }
2400
- return false;
2401
- };
2402
- var xsl = {
2403
- 'nest' : '<?xml version="1.0" encoding="utf-8" ?>' +
2404
- '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
2405
- '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/html" />' +
2406
- '<xsl:template match="/">' +
2407
- ' <xsl:call-template name="nodes">' +
2408
- ' <xsl:with-param name="node" select="/root" />' +
2409
- ' </xsl:call-template>' +
2410
- '</xsl:template>' +
2411
- '<xsl:template name="nodes">' +
2412
- ' <xsl:param name="node" />' +
2413
- ' <ul>' +
2414
- ' <xsl:for-each select="$node/item">' +
2415
- ' <xsl:variable name="children" select="count(./item) &gt; 0" />' +
2416
- ' <li>' +
2417
- ' <xsl:attribute name="class">' +
2418
- ' <xsl:if test="position() = last()">jstree-last </xsl:if>' +
2419
- ' <xsl:choose>' +
2420
- ' <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
2421
- ' <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
2422
- ' <xsl:otherwise>jstree-leaf </xsl:otherwise>' +
2423
- ' </xsl:choose>' +
2424
- ' <xsl:value-of select="@class" />' +
2425
- ' </xsl:attribute>' +
2426
- ' <xsl:for-each select="@*">' +
2427
- ' <xsl:if test="name() != \'class\' and name() != \'state\' and name() != \'hasChildren\'">' +
2428
- ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
2429
- ' </xsl:if>' +
2430
- ' </xsl:for-each>' +
2431
- ' <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' +
2432
- ' <xsl:for-each select="content/name">' +
2433
- ' <a>' +
2434
- ' <xsl:attribute name="href">' +
2435
- ' <xsl:choose>' +
2436
- ' <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
2437
- ' <xsl:otherwise>#</xsl:otherwise>' +
2438
- ' </xsl:choose>' +
2439
- ' </xsl:attribute>' +
2440
- ' <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
2441
- ' <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
2442
- ' <xsl:for-each select="@*">' +
2443
- ' <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
2444
- ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
2445
- ' </xsl:if>' +
2446
- ' </xsl:for-each>' +
2447
- ' <ins>' +
2448
- ' <xsl:attribute name="class">jstree-icon ' +
2449
- ' <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
2450
- ' </xsl:attribute>' +
2451
- ' <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
2452
- ' <xsl:text>&#xa0;</xsl:text>' +
2453
- ' </ins>' +
2454
- ' <xsl:value-of select="current()" />' +
2455
- ' </a>' +
2456
- ' </xsl:for-each>' +
2457
- ' <xsl:if test="$children or @hasChildren"><xsl:call-template name="nodes"><xsl:with-param name="node" select="current()" /></xsl:call-template></xsl:if>' +
2458
- ' </li>' +
2459
- ' </xsl:for-each>' +
2460
- ' </ul>' +
2461
- '</xsl:template>' +
2462
- '</xsl:stylesheet>',
2463
-
2464
- 'flat' : '<?xml version="1.0" encoding="utf-8" ?>' +
2465
- '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
2466
- '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/xml" />' +
2467
- '<xsl:template match="/">' +
2468
- ' <ul>' +
2469
- ' <xsl:for-each select="//item[not(@parent_id) or @parent_id=0 or not(@parent_id = //item/@id)]">' + /* the last `or` may be removed */
2470
- ' <xsl:call-template name="nodes">' +
2471
- ' <xsl:with-param name="node" select="." />' +
2472
- ' <xsl:with-param name="is_last" select="number(position() = last())" />' +
2473
- ' </xsl:call-template>' +
2474
- ' </xsl:for-each>' +
2475
- ' </ul>' +
2476
- '</xsl:template>' +
2477
- '<xsl:template name="nodes">' +
2478
- ' <xsl:param name="node" />' +
2479
- ' <xsl:param name="is_last" />' +
2480
- ' <xsl:variable name="children" select="count(//item[@parent_id=$node/attribute::id]) &gt; 0" />' +
2481
- ' <li>' +
2482
- ' <xsl:attribute name="class">' +
2483
- ' <xsl:if test="$is_last = true()">jstree-last </xsl:if>' +
2484
- ' <xsl:choose>' +
2485
- ' <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
2486
- ' <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
2487
- ' <xsl:otherwise>jstree-leaf </xsl:otherwise>' +
2488
- ' </xsl:choose>' +
2489
- ' <xsl:value-of select="@class" />' +
2490
- ' </xsl:attribute>' +
2491
- ' <xsl:for-each select="@*">' +
2492
- ' <xsl:if test="name() != \'parent_id\' and name() != \'hasChildren\' and name() != \'class\' and name() != \'state\'">' +
2493
- ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
2494
- ' </xsl:if>' +
2495
- ' </xsl:for-each>' +
2496
- ' <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' +
2497
- ' <xsl:for-each select="content/name">' +
2498
- ' <a>' +
2499
- ' <xsl:attribute name="href">' +
2500
- ' <xsl:choose>' +
2501
- ' <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
2502
- ' <xsl:otherwise>#</xsl:otherwise>' +
2503
- ' </xsl:choose>' +
2504
- ' </xsl:attribute>' +
2505
- ' <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
2506
- ' <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
2507
- ' <xsl:for-each select="@*">' +
2508
- ' <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
2509
- ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
2510
- ' </xsl:if>' +
2511
- ' </xsl:for-each>' +
2512
- ' <ins>' +
2513
- ' <xsl:attribute name="class">jstree-icon ' +
2514
- ' <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
2515
- ' </xsl:attribute>' +
2516
- ' <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
2517
- ' <xsl:text>&#xa0;</xsl:text>' +
2518
- ' </ins>' +
2519
- ' <xsl:value-of select="current()" />' +
2520
- ' </a>' +
2521
- ' </xsl:for-each>' +
2522
- ' <xsl:if test="$children">' +
2523
- ' <ul>' +
2524
- ' <xsl:for-each select="//item[@parent_id=$node/attribute::id]">' +
2525
- ' <xsl:call-template name="nodes">' +
2526
- ' <xsl:with-param name="node" select="." />' +
2527
- ' <xsl:with-param name="is_last" select="number(position() = last())" />' +
2528
- ' </xsl:call-template>' +
2529
- ' </xsl:for-each>' +
2530
- ' </ul>' +
2531
- ' </xsl:if>' +
2532
- ' </li>' +
2533
- '</xsl:template>' +
2534
- '</xsl:stylesheet>'
2535
- };
2536
- $.jstree.plugin("xml_data", {
2537
- defaults : {
2538
- data : false,
2539
- ajax : false,
2540
- xsl : "flat",
2541
- clean_node : false,
2542
- correct_state : true
2543
- },
2544
- _fn : {
2545
- load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_xml(obj, function () { _this.__callback({ "obj" : obj }); s_call.call(this); }, e_call); },
2546
- _is_loaded : function (obj) {
2547
- var s = this._get_settings().xml_data;
2548
- obj = this._get_node(obj);
2549
- return obj == -1 || !obj || !s.ajax || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
2550
- },
2551
- load_node_xml : function (obj, s_call, e_call) {
2552
- var s = this.get_settings().xml_data,
2553
- error_func = function () {},
2554
- success_func = function () {};
2555
-
2556
- obj = this._get_node(obj);
2557
- if(obj && obj !== -1) {
2558
- if(obj.data("jstree-is-loading")) { return; }
2559
- else { obj.data("jstree-is-loading",true); }
2560
- }
2561
- switch(!0) {
2562
- case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
2563
- case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
2564
- if(!obj || obj == -1) {
2565
- this.parse_xml(s.data, $.proxy(function (d) {
2566
- if(d) {
2567
- d = d.replace(/ ?xmlns="[^"]*"/ig, "");
2568
- if(d.length > 10) {
2569
- d = $(d);
2570
- this.get_container().children("ul").empty().append(d.children());
2571
- if(s.clean_node) { this.clean_node(obj); }
2572
- if(s_call) { s_call.call(this); }
2573
- }
2574
- }
2575
- else {
2576
- if(s.correct_state) {
2577
- this.get_container().children("ul").empty();
2578
- if(s_call) { s_call.call(this); }
2579
- }
2580
- }
2581
- }, this));
2582
- }
2583
- break;
2584
- case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
2585
- error_func = function (x, t, e) {
2586
- var ef = this.get_settings().xml_data.ajax.error;
2587
- if(ef) { ef.call(this, x, t, e); }
2588
- if(obj !== -1 && obj.length) {
2589
- obj.children(".jstree-loading").removeClass("jstree-loading");
2590
- obj.data("jstree-is-loading",false);
2591
- if(t === "success" && s.correct_state) { obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); }
2592
- }
2593
- else {
2594
- if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
2595
- }
2596
- if(e_call) { e_call.call(this); }
2597
- };
2598
- success_func = function (d, t, x) {
2599
- d = x.responseText;
2600
- var sf = this.get_settings().xml_data.ajax.success;
2601
- if(sf) { d = sf.call(this,d,t,x) || d; }
2602
- if(d == "") {
2603
- return error_func.call(this, x, t, "");
2604
- }
2605
- this.parse_xml(d, $.proxy(function (d) {
2606
- if(d) {
2607
- d = d.replace(/ ?xmlns="[^"]*"/ig, "");
2608
- if(d.length > 10) {
2609
- d = $(d);
2610
- if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
2611
- else { obj.children(".jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.data("jstree-is-loading",false); }
2612
- if(s.clean_node) { this.clean_node(obj); }
2613
- if(s_call) { s_call.call(this); }
2614
- }
2615
- else {
2616
- if(obj && obj !== -1) {
2617
- obj.children(".jstree-loading").removeClass("jstree-loading");
2618
- obj.data("jstree-is-loading",false);
2619
- if(s.correct_state) {
2620
- obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");
2621
- if(s_call) { s_call.call(this); }
2622
- }
2623
- }
2624
- else {
2625
- if(s.correct_state) {
2626
- this.get_container().children("ul").empty();
2627
- if(s_call) { s_call.call(this); }
2628
- }
2629
- }
2630
- }
2631
- }
2632
- }, this));
2633
- };
2634
- s.ajax.context = this;
2635
- s.ajax.error = error_func;
2636
- s.ajax.success = success_func;
2637
- if(!s.ajax.dataType) { s.ajax.dataType = "xml"; }
2638
- if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
2639
- if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
2640
- $.ajax(s.ajax);
2641
- break;
2642
- }
2643
- },
2644
- parse_xml : function (xml, callback) {
2645
- var s = this._get_settings().xml_data;
2646
- $.vakata.xslt(xml, xsl[s.xsl], callback);
2647
- },
2648
- get_xml : function (tp, obj, li_attr, a_attr, is_callback) {
2649
- var result = "",
2650
- s = this._get_settings(),
2651
- _this = this,
2652
- tmp1, tmp2, li, a, lang;
2653
- if(!tp) { tp = "flat"; }
2654
- if(!is_callback) { is_callback = 0; }
2655
- obj = this._get_node(obj);
2656
- if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
2657
- li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
2658
- if(!is_callback && this.data.types && $.inArray(s.types.type_attr, li_attr) === -1) { li_attr.push(s.types.type_attr); }
2659
-
2660
- a_attr = $.isArray(a_attr) ? a_attr : [ ];
2661
-
2662
- if(!is_callback) { result += "<root>"; }
2663
- obj.each(function () {
2664
- result += "<item";
2665
- li = $(this);
2666
- $.each(li_attr, function (i, v) { result += " " + v + "=\"" + (li.attr(v) || "").replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"") + "\""; });
2667
- if(li.hasClass("jstree-open")) { result += " state=\"open\""; }
2668
- if(li.hasClass("jstree-closed")) { result += " state=\"closed\""; }
2669
- if(tp === "flat") { result += " parent_id=\"" + is_callback + "\""; }
2670
- result += ">";
2671
- result += "<content>";
2672
- a = li.children("a");
2673
- a.each(function () {
2674
- tmp1 = $(this);
2675
- lang = false;
2676
- result += "<name";
2677
- if($.inArray("languages", s.plugins) !== -1) {
2678
- $.each(s.languages, function (k, z) {
2679
- if(tmp1.hasClass(z)) { result += " lang=\"" + z + "\""; lang = z; return false; }
2680
- });
2681
- }
2682
- if(a_attr.length) {
2683
- $.each(a_attr, function (k, z) {
2684
- result += " " + z + "=\"" + (tmp1.attr(z) || "").replace(/jstree[^ ]*|$/ig,'') + "\"";
2685
- });
2686
- }
2687
- if(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
2688
- result += ' icon="' + tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"") + '"';
2689
- }
2690
- if(tmp1.children("ins").get(0).style.backgroundImage.length) {
2691
- result += ' icon="' + tmp1.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","") + '"';
2692
- }
2693
- result += ">";
2694
- result += "<![CDATA[" + _this.get_text(tmp1, lang) + "]]>";
2695
- result += "</name>";
2696
- });
2697
- result += "</content>";
2698
- tmp2 = li[0].id;
2699
- li = li.find("> ul > li");
2700
- if(li.length) { tmp2 = _this.get_xml(tp, li, li_attr, a_attr, tmp2); }
2701
- else { tmp2 = ""; }
2702
- if(tp == "nest") { result += tmp2; }
2703
- result += "</item>";
2704
- if(tp == "flat") { result += tmp2; }
2705
- });
2706
- if(!is_callback) { result += "</root>"; }
2707
- return result;
2708
- }
2709
- }
2710
- });
2711
- })(jQuery);
2712
- //*/
2713
-
2714
- /*
2715
- * jsTree search plugin 1.0
2716
- * Enables both sync and async search on the tree
2717
- * DOES NOT WORK WITH JSON PROGRESSIVE RENDER
2718
- */
2719
- (function ($) {
2720
- $.expr[':'].jstree_contains = function(a,i,m){
2721
- return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
2722
- };
2723
- $.jstree.plugin("search", {
2724
- __init : function () {
2725
- this.data.search.str = "";
2726
- this.data.search.result = $();
2727
- },
2728
- defaults : {
2729
- ajax : false, // OR ajax object
2730
- case_insensitive : false
2731
- },
2732
- _fn : {
2733
- search : function (str, skip_async) {
2734
- if(str === "") { return; }
2735
- var s = this.get_settings().search,
2736
- t = this,
2737
- error_func = function () { },
2738
- success_func = function () { };
2739
- this.data.search.str = str;
2740
-
2741
- if(!skip_async && s.ajax !== false && this.get_container().find(".jstree-closed:eq(0)").length > 0) {
2742
- this.search.supress_callback = true;
2743
- error_func = function () { };
2744
- success_func = function (d, t, x) {
2745
- var sf = this.get_settings().search.ajax.success;
2746
- if(sf) { d = sf.call(this,d,t,x) || d; }
2747
- this.data.search.to_open = d;
2748
- this._search_open();
2749
- };
2750
- s.ajax.context = this;
2751
- s.ajax.error = error_func;
2752
- s.ajax.success = success_func;
2753
- if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, str); }
2754
- if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, str); }
2755
- if(!s.ajax.data) { s.ajax.data = { "search_string" : str }; }
2756
- if(!s.ajax.dataType || /^json/.exec(s.ajax.dataType)) { s.ajax.dataType = "json"; }
2757
- $.ajax(s.ajax);
2758
- return;
2759
- }
2760
- if(this.data.search.result.length) { this.clear_search(); }
2761
- this.data.search.result = this.get_container().find("a" + (this.data.languages ? "." + this.get_lang() : "" ) + ":" + (s.case_insensitive ? "jstree_contains" : "contains") + "(" + this.data.search.str + ")");
2762
- this.data.search.result.addClass("jstree-search").parents(".jstree-closed").each(function () {
2763
- t.open_node(this, false, true);
2764
- });
2765
- this.__callback({ nodes : this.data.search.result, str : str });
2766
- },
2767
- clear_search : function (str) {
2768
- this.data.search.result.removeClass("jstree-search");
2769
- this.__callback(this.data.search.result);
2770
- this.data.search.result = $();
2771
- },
2772
- _search_open : function (is_callback) {
2773
- var _this = this,
2774
- done = true,
2775
- current = [],
2776
- remaining = [];
2777
- if(this.data.search.to_open.length) {
2778
- $.each(this.data.search.to_open, function (i, val) {
2779
- if(val == "#") { return true; }
2780
- if($(val).length && $(val).is(".jstree-closed")) { current.push(val); }
2781
- else { remaining.push(val); }
2782
- });
2783
- if(current.length) {
2784
- this.data.search.to_open = remaining;
2785
- $.each(current, function (i, val) {
2786
- _this.open_node(val, function () { _this._search_open(true); });
2787
- });
2788
- done = false;
2789
- }
2790
- }
2791
- if(done) { this.search(this.data.search.str, true); }
2792
- }
2793
- }
2794
- });
2795
- })(jQuery);
2796
- //*/
2797
-
2798
- /*
2799
- * jsTree contextmenu plugin 1.0
2800
- */
2801
- (function ($) {
2802
- $.vakata.context = {
2803
- cnt : $("<div id='vakata-contextmenu'>"),
2804
- vis : false,
2805
- tgt : false,
2806
- par : false,
2807
- func : false,
2808
- data : false,
2809
- show : function (s, t, x, y, d, p) {
2810
- var html = $.vakata.context.parse(s), h, w;
2811
- if(!html) { return; }
2812
- $.vakata.context.vis = true;
2813
- $.vakata.context.tgt = t;
2814
- $.vakata.context.par = p || t || null;
2815
- $.vakata.context.data = d || null;
2816
- $.vakata.context.cnt
2817
- .html(html)
2818
- .css({ "visibility" : "hidden", "display" : "block", "left" : 0, "top" : 0 });
2819
- h = $.vakata.context.cnt.height();
2820
- w = $.vakata.context.cnt.width();
2821
- if(x + w > $(document).width()) {
2822
- x = $(document).width() - (w + 5);
2823
- $.vakata.context.cnt.find("li > ul").addClass("right");
2824
- }
2825
- if(y + h > $(document).height()) {
2826
- y = y - (h + t[0].offsetHeight);
2827
- $.vakata.context.cnt.find("li > ul").addClass("bottom");
2828
- }
2829
-
2830
- $.vakata.context.cnt
2831
- .css({ "left" : x, "top" : y })
2832
- .find("li:has(ul)")
2833
- .bind("mouseenter", function (e) {
2834
- var w = $(document).width(),
2835
- h = $(document).height(),
2836
- ul = $(this).children("ul").show();
2837
- if(w !== $(document).width()) { ul.toggleClass("right"); }
2838
- if(h !== $(document).height()) { ul.toggleClass("bottom"); }
2839
- })
2840
- .bind("mouseleave", function (e) {
2841
- $(this).children("ul").hide();
2842
- })
2843
- .end()
2844
- .css({ "visibility" : "visible" })
2845
- .show();
2846
- $(document).triggerHandler("context_show.vakata");
2847
- },
2848
- hide : function () {
2849
- $.vakata.context.vis = false;
2850
- $.vakata.context.cnt.attr("class","").hide();
2851
- $(document).triggerHandler("context_hide.vakata");
2852
- },
2853
- parse : function (s, is_callback) {
2854
- if(!s) { return false; }
2855
- var str = "",
2856
- tmp = false,
2857
- was_sep = true;
2858
- if(!is_callback) { $.vakata.context.func = {}; }
2859
- str += "<ul>";
2860
- $.each(s, function (i, val) {
2861
- if(!val) { return true; }
2862
- $.vakata.context.func[i] = val.action;
2863
- if(!was_sep && val.separator_before) {
2864
- str += "<li class='vakata-separator vakata-separator-before'></li>";
2865
- }
2866
- was_sep = false;
2867
- str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
2868
- if(val.icon && val.icon.indexOf("/") === -1) { str += " class='" + val.icon + "' "; }
2869
- if(val.icon && val.icon.indexOf("/") !== -1) { str += " style='background:url(" + val.icon + ") center center no-repeat;' "; }
2870
- str += ">&#160;</ins><a href='#' rel='" + i + "'>";
2871
- if(val.submenu) {
2872
- str += "<span style='float:right;'>&raquo;</span>";
2873
- }
2874
- str += val.label + "</a>";
2875
- if(val.submenu) {
2876
- tmp = $.vakata.context.parse(val.submenu, true);
2877
- if(tmp) { str += tmp; }
2878
- }
2879
- str += "</li>";
2880
- if(val.separator_after) {
2881
- str += "<li class='vakata-separator vakata-separator-after'></li>";
2882
- was_sep = true;
2883
- }
2884
- });
2885
- str = str.replace(/<li class\='vakata-separator vakata-separator-after'\><\/li\>$/,"");
2886
- str += "</ul>";
2887
- return str.length > 10 ? str : false;
2888
- },
2889
- exec : function (i) {
2890
- if($.isFunction($.vakata.context.func[i])) {
2891
- $.vakata.context.func[i].call($.vakata.context.data, $.vakata.context.par);
2892
- return true;
2893
- }
2894
- else { return false; }
2895
- }
2896
- };
2897
- $(function () {
2898
- var css_string = '' +
2899
- '#vakata-contextmenu { display:none; position:absolute; margin:0; padding:0; min-width:180px; background:#ebebeb; border:1px solid silver; z-index:10000; *width:180px; } ' +
2900
- '#vakata-contextmenu ul { min-width:180px; *width:180px; } ' +
2901
- '#vakata-contextmenu ul, #vakata-contextmenu li { margin:0; padding:0; list-style-type:none; display:block; } ' +
2902
- '#vakata-contextmenu li { line-height:20px; min-height:20px; position:relative; padding:0px; } ' +
2903
- '#vakata-contextmenu li a { padding:1px 6px; line-height:17px; display:block; text-decoration:none; margin:1px 1px 0 1px; } ' +
2904
- '#vakata-contextmenu li ins { float:left; width:16px; height:16px; text-decoration:none; margin-right:2px; } ' +
2905
- '#vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background:gray; color:white; } ' +
2906
- '#vakata-contextmenu li ul { display:none; position:absolute; top:-2px; left:100%; background:#ebebeb; border:1px solid gray; } ' +
2907
- '#vakata-contextmenu .right { right:100%; left:auto; } ' +
2908
- '#vakata-contextmenu .bottom { bottom:-1px; top:auto; } ' +
2909
- '#vakata-contextmenu li.vakata-separator { min-height:0; height:1px; line-height:1px; font-size:1px; overflow:hidden; margin:0 2px; background:silver; /* border-top:1px solid #fefefe; */ padding:0; } ';
2910
- $.vakata.css.add_sheet({ str : css_string });
2911
- $.vakata.context.cnt
2912
- .delegate("a","click", function (e) { e.preventDefault(); })
2913
- .delegate("a","mouseup", function (e) {
2914
- if(!$(this).parent().hasClass("jstree-contextmenu-disabled") && $.vakata.context.exec($(this).attr("rel"))) {
2915
- $.vakata.context.hide();
2916
- }
2917
- else { $(this).blur(); }
2918
- })
2919
- .delegate("a","mouseover", function () {
2920
- $.vakata.context.cnt.find(".vakata-hover").removeClass("vakata-hover");
2921
- })
2922
- .appendTo("body");
2923
- $(document).bind("mousedown", function (e) { if($.vakata.context.vis && !$.contains($.vakata.context.cnt[0], e.target)) { $.vakata.context.hide(); } });
2924
- if(typeof $.hotkeys !== "undefined") {
2925
- $(document)
2926
- .bind("keydown", "up", function (e) {
2927
- if($.vakata.context.vis) {
2928
- var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").prevAll("li:not(.vakata-separator)").first();
2929
- if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").last(); }
2930
- o.addClass("vakata-hover");
2931
- e.stopImmediatePropagation();
2932
- e.preventDefault();
2933
- }
2934
- })
2935
- .bind("keydown", "down", function (e) {
2936
- if($.vakata.context.vis) {
2937
- var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").nextAll("li:not(.vakata-separator)").first();
2938
- if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").first(); }
2939
- o.addClass("vakata-hover");
2940
- e.stopImmediatePropagation();
2941
- e.preventDefault();
2942
- }
2943
- })
2944
- .bind("keydown", "right", function (e) {
2945
- if($.vakata.context.vis) {
2946
- $.vakata.context.cnt.find(".vakata-hover").children("ul").show().children("li:not(.vakata-separator)").removeClass("vakata-hover").first().addClass("vakata-hover");
2947
- e.stopImmediatePropagation();
2948
- e.preventDefault();
2949
- }
2950
- })
2951
- .bind("keydown", "left", function (e) {
2952
- if($.vakata.context.vis) {
2953
- $.vakata.context.cnt.find(".vakata-hover").children("ul").hide().children(".vakata-separator").removeClass("vakata-hover");
2954
- e.stopImmediatePropagation();
2955
- e.preventDefault();
2956
- }
2957
- })
2958
- .bind("keydown", "esc", function (e) {
2959
- $.vakata.context.hide();
2960
- e.preventDefault();
2961
- })
2962
- .bind("keydown", "space", function (e) {
2963
- $.vakata.context.cnt.find(".vakata-hover").last().children("a").click();
2964
- e.preventDefault();
2965
- });
2966
- }
2967
- });
2968
-
2969
- $.jstree.plugin("contextmenu", {
2970
- __init : function () {
2971
- this.get_container()
2972
- .delegate("a", "contextmenu.jstree", $.proxy(function (e) {
2973
- e.preventDefault();
2974
- this.show_contextmenu(e.currentTarget, e.pageX, e.pageY);
2975
- }, this))
2976
- .bind("destroy.jstree", $.proxy(function () {
2977
- if(this.data.contextmenu) {
2978
- $.vakata.context.hide();
2979
- }
2980
- }, this));
2981
- $(document).bind("context_hide.vakata", $.proxy(function () { this.data.contextmenu = false; }, this));
2982
- },
2983
- defaults : {
2984
- select_node : false, // requires UI plugin
2985
- show_at_node : true,
2986
- items : { // Could be a function that should return an object like this one
2987
- "create" : {
2988
- "separator_before" : false,
2989
- "separator_after" : true,
2990
- "label" : "Create",
2991
- "action" : function (obj) { this.create(obj); }
2992
- },
2993
- "rename" : {
2994
- "separator_before" : false,
2995
- "separator_after" : false,
2996
- "label" : "Rename",
2997
- "action" : function (obj) { this.rename(obj); }
2998
- },
2999
- "remove" : {
3000
- "separator_before" : false,
3001
- "icon" : false,
3002
- "separator_after" : false,
3003
- "label" : "Delete",
3004
- "action" : function (obj) { this.remove(obj); }
3005
- },
3006
- "ccp" : {
3007
- "separator_before" : true,
3008
- "icon" : false,
3009
- "separator_after" : false,
3010
- "label" : "Edit",
3011
- "action" : false,
3012
- "submenu" : {
3013
- "cut" : {
3014
- "separator_before" : false,
3015
- "separator_after" : false,
3016
- "label" : "Cut",
3017
- "action" : function (obj) { this.cut(obj); }
3018
- },
3019
- "copy" : {
3020
- "separator_before" : false,
3021
- "icon" : false,
3022
- "separator_after" : false,
3023
- "label" : "Copy",
3024
- "action" : function (obj) { this.copy(obj); }
3025
- },
3026
- "paste" : {
3027
- "separator_before" : false,
3028
- "icon" : false,
3029
- "separator_after" : false,
3030
- "label" : "Paste",
3031
- "action" : function (obj) { this.paste(obj); }
3032
- }
3033
- }
3034
- }
3035
- }
3036
- },
3037
- _fn : {
3038
- show_contextmenu : function (obj, x, y) {
3039
- obj = this._get_node(obj);
3040
- var s = this.get_settings().contextmenu,
3041
- a = obj.children("a:visible:eq(0)"),
3042
- o = false;
3043
- if(s.select_node && this.data.ui && !this.is_selected(obj)) {
3044
- this.deselect_all();
3045
- this.select_node(obj, true);
3046
- }
3047
- if(s.show_at_node || typeof x === "undefined" || typeof y === "undefined") {
3048
- o = a.offset();
3049
- x = o.left;
3050
- y = o.top + this.data.core.li_height;
3051
- }
3052
- if($.isFunction(s.items)) { s.items = s.items.call(this, obj); }
3053
- this.data.contextmenu = true;
3054
- $.vakata.context.show(s.items, a, x, y, this, obj);
3055
- if(this.data.themes) { $.vakata.context.cnt.attr("class", "jstree-" + this.data.themes.theme + "-context"); }
3056
- }
3057
- }
3058
- });
3059
- })(jQuery);
3060
- //*/
3061
-
3062
- /*
3063
- * jsTree types plugin 1.0
3064
- * Adds support types of nodes
3065
- * You can set an attribute on each li node, that represents its type.
3066
- * According to the type setting the node may get custom icon/validation rules
3067
- */
3068
- (function ($) {
3069
- $.jstree.plugin("types", {
3070
- __init : function () {
3071
- var s = this._get_settings().types;
3072
- this.data.types.attach_to = [];
3073
- this.get_container()
3074
- .bind("init.jstree", $.proxy(function () {
3075
- var types = s.types,
3076
- attr = s.type_attr,
3077
- icons_css = "",
3078
- _this = this;
3079
-
3080
- $.each(types, function (i, tp) {
3081
- $.each(tp, function (k, v) {
3082
- if(!/^(max_depth|max_children|icon|valid_children)$/.test(k)) { _this.data.types.attach_to.push(k); }
3083
- });
3084
- if(!tp.icon) { return true; }
3085
- if( tp.icon.image || tp.icon.position) {
3086
- if(i == "default") { icons_css += '.jstree-' + _this.get_index() + ' a > .jstree-icon { '; }
3087
- else { icons_css += '.jstree-' + _this.get_index() + ' li[' + attr + '=' + i + '] > a > .jstree-icon { '; }
3088
- if(tp.icon.image) { icons_css += ' background-image:url(' + tp.icon.image + '); '; }
3089
- if(tp.icon.position){ icons_css += ' background-position:' + tp.icon.position + '; '; }
3090
- else { icons_css += ' background-position:0 0; '; }
3091
- icons_css += '} ';
3092
- }
3093
- });
3094
- if(icons_css != "") { $.vakata.css.add_sheet({ 'str' : icons_css }); }
3095
- }, this))
3096
- .bind("before.jstree", $.proxy(function (e, data) {
3097
- if($.inArray(data.func, this.data.types.attach_to) !== -1) {
3098
- var s = this._get_settings().types.types,
3099
- t = this._get_type(data.args[0]);
3100
- if(
3101
- (
3102
- (s[t] && typeof s[t][data.func] !== "undefined") ||
3103
- (s["default"] && typeof s["default"][data.func] !== "undefined")
3104
- ) && !this._check(data.func, data.args[0])
3105
- ) {
3106
- e.stopImmediatePropagation();
3107
- return false;
3108
- }
3109
- }
3110
- }, this));
3111
- },
3112
- defaults : {
3113
- // defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking)
3114
- max_children : -1,
3115
- // defines the maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking)
3116
- max_depth : -1,
3117
- // defines valid node types for the root nodes
3118
- valid_children : "all",
3119
-
3120
- // where is the type stores (the rel attribute of the LI element)
3121
- type_attr : "rel",
3122
- // a list of types
3123
- types : {
3124
- // the default type
3125
- "default" : {
3126
- "max_children" : -1,
3127
- "max_depth" : -1,
3128
- "valid_children": "all"
3129
-
3130
- // Bound functions - you can bind any other function here (using boolean or function)
3131
- //"select_node" : true,
3132
- //"open_node" : true,
3133
- //"close_node" : true,
3134
- //"create_node" : true,
3135
- //"delete_node" : true
3136
- }
3137
- }
3138
- },
3139
- _fn : {
3140
- _get_type : function (obj) {
3141
- obj = this._get_node(obj);
3142
- return (!obj || !obj.length) ? false : obj.attr(this._get_settings().types.type_attr) || "default";
3143
- },
3144
- set_type : function (str, obj) {
3145
- obj = this._get_node(obj);
3146
- return (!obj.length || !str) ? false : obj.attr(this._get_settings().types.type_attr, str);
3147
- },
3148
- _check : function (rule, obj, opts) {
3149
- var v = false, t = this._get_type(obj), d = 0, _this = this, s = this._get_settings().types;
3150
- if(obj === -1) {
3151
- if(!!s[rule]) { v = s[rule]; }
3152
- else { return; }
3153
- }
3154
- else {
3155
- if(t === false) { return; }
3156
- if(!!s.types[t] && !!s.types[t][rule]) { v = s.types[t][rule]; }
3157
- else if(!!s.types["default"] && !!s.types["default"][rule]) { v = s.types["default"][rule]; }
3158
- }
3159
- if($.isFunction(v)) { v = v.call(this, obj); }
3160
- if(rule === "max_depth" && obj !== -1 && opts !== false && s.max_depth !== -2 && v !== 0) {
3161
- // also include the node itself - otherwise if root node it is not checked
3162
- this._get_node(obj).children("a:eq(0)").parentsUntil(".jstree","li").each(function (i) {
3163
- // check if current depth already exceeds global tree depth
3164
- if(s.max_depth !== -1 && s.max_depth - (i + 1) <= 0) { v = 0; return false; }
3165
- d = (i === 0) ? v : _this._check(rule, this, false);
3166
- // check if current node max depth is already matched or exceeded
3167
- if(d !== -1 && d - (i + 1) <= 0) { v = 0; return false; }
3168
- // otherwise - set the max depth to the current value minus current depth
3169
- if(d >= 0 && (d - (i + 1) < v || v < 0) ) { v = d - (i + 1); }
3170
- // if the global tree depth exists and it minus the nodes calculated so far is less than `v` or `v` is unlimited
3171
- if(s.max_depth >= 0 && (s.max_depth - (i + 1) < v || v < 0) ) { v = s.max_depth - (i + 1); }
3172
- });
3173
- }
3174
- return v;
3175
- },
3176
- check_move : function () {
3177
- if(!this.__call_old()) { return false; }
3178
- var m = this._get_move(),
3179
- s = m.rt._get_settings().types,
3180
- mc = m.rt._check("max_children", m.cr),
3181
- md = m.rt._check("max_depth", m.cr),
3182
- vc = m.rt._check("valid_children", m.cr),
3183
- ch = 0, d = 1, t;
3184
-
3185
- if(vc === "none") { return false; }
3186
- if($.isArray(vc) && m.ot && m.ot._get_type) {
3187
- m.o.each(function () {
3188
- if($.inArray(m.ot._get_type(this), vc) === -1) { d = false; return false; }
3189
- });
3190
- if(d === false) { return false; }
3191
- }
3192
- if(s.max_children !== -2 && mc !== -1) {
3193
- ch = m.cr === -1 ? this.get_container().children("> ul > li").not(m.o).length : m.cr.children("> ul > li").not(m.o).length;
3194
- if(ch + m.o.length > mc) { return false; }
3195
- }
3196
- if(s.max_depth !== -2 && md !== -1) {
3197
- d = 0;
3198
- if(md === 0) { return false; }
3199
- if(typeof m.o.d === "undefined") {
3200
- // TODO: deal with progressive rendering and async when checking max_depth (how to know the depth of the moved node)
3201
- t = m.o;
3202
- while(t.length > 0) {
3203
- t = t.find("> ul > li");
3204
- d ++;
3205
- }
3206
- m.o.d = d;
3207
- }
3208
- if(md - m.o.d < 0) { return false; }
3209
- }
3210
- return true;
3211
- },
3212
- create_node : function (obj, position, js, callback, is_loaded, skip_check) {
3213
- if(!skip_check && (is_loaded || this._is_loaded(obj))) {
3214
- var p = (position && position.match(/^before|after$/i) && obj !== -1) ? this._get_parent(obj) : this._get_node(obj),
3215
- s = this._get_settings().types,
3216
- mc = this._check("max_children", p),
3217
- md = this._check("max_depth", p),
3218
- vc = this._check("valid_children", p),
3219
- ch;
3220
- if(!js) { js = {}; }
3221
- if(vc === "none") { return false; }
3222
- if($.isArray(vc)) {
3223
- if(!js.attr || !js.attr[s.type_attr]) {
3224
- if(!js.attr) { js.attr = {}; }
3225
- js.attr[s.type_attr] = vc[0];
3226
- }
3227
- else {
3228
- if($.inArray(js.attr[s.type_attr], vc) === -1) { return false; }
3229
- }
3230
- }
3231
- if(s.max_children !== -2 && mc !== -1) {
3232
- ch = p === -1 ? this.get_container().children("> ul > li").length : p.children("> ul > li").length;
3233
- if(ch + 1 > mc) { return false; }
3234
- }
3235
- if(s.max_depth !== -2 && md !== -1 && (md - 1) < 0) { return false; }
3236
- }
3237
- return this.__call_old(true, obj, position, js, callback, is_loaded, skip_check);
3238
- }
3239
- }
3240
- });
3241
- })(jQuery);
3242
- //*/
3243
-
3244
- /*
3245
- * jsTree HTML data 1.0
3246
- * The HTML data store. Datastores are build by replacing the `load_node` and `_is_loaded` functions.
3247
- */
3248
- (function ($) {
3249
- $.jstree.plugin("html_data", {
3250
- __init : function () {
3251
- // this used to use html() and clean the whitespace, but this way any attached data was lost
3252
- this.data.html_data.original_container_html = this.get_container().find(" > ul > li").clone(true);
3253
- // remove white space from LI node - otherwise nodes appear a bit to the right
3254
- this.data.html_data.original_container_html.find("li").andSelf().contents().filter(function() { return this.nodeType == 3; }).remove();
3255
- },
3256
- defaults : {
3257
- data : false,
3258
- ajax : false,
3259
- correct_state : true
3260
- },
3261
- _fn : {
3262
- load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_html(obj, function () { _this.__callback({ "obj" : obj }); s_call.call(this); }, e_call); },
3263
- _is_loaded : function (obj) {
3264
- obj = this._get_node(obj);
3265
- return obj == -1 || !obj || !this._get_settings().html_data.ajax || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
3266
- },
3267
- load_node_html : function (obj, s_call, e_call) {
3268
- var d,
3269
- s = this.get_settings().html_data,
3270
- error_func = function () {},
3271
- success_func = function () {};
3272
- obj = this._get_node(obj);
3273
- if(obj && obj !== -1) {
3274
- if(obj.data("jstree-is-loading")) { return; }
3275
- else { obj.data("jstree-is-loading",true); }
3276
- }
3277
- switch(!0) {
3278
- case (!s.data && !s.ajax):
3279
- if(!obj || obj == -1) {
3280
- this.get_container()
3281
- .children("ul").empty()
3282
- .append(this.data.html_data.original_container_html)
3283
- .find("li, a").filter(function () { return this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()
3284
- .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
3285
- this.clean_node();
3286
- }
3287
- if(s_call) { s_call.call(this); }
3288
- break;
3289
- case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
3290
- if(!obj || obj == -1) {
3291
- d = $(s.data);
3292
- if(!d.is("ul")) { d = $("<ul>").append(d); }
3293
- this.get_container()
3294
- .children("ul").empty().append(d.children())
3295
- .find("li, a").filter(function () { return this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()
3296
- .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
3297
- this.clean_node();
3298
- }
3299
- if(s_call) { s_call.call(this); }
3300
- break;
3301
- case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
3302
- obj = this._get_node(obj);
3303
- error_func = function (x, t, e) {
3304
- var ef = this.get_settings().html_data.ajax.error;
3305
- if(ef) { ef.call(this, x, t, e); }
3306
- if(obj != -1 && obj.length) {
3307
- obj.children(".jstree-loading").removeClass("jstree-loading");
3308
- obj.data("jstree-is-loading",false);
3309
- if(t === "success" && s.correct_state) { obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); }
3310
- }
3311
- else {
3312
- if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
3313
- }
3314
- if(e_call) { e_call.call(this); }
3315
- };
3316
- success_func = function (d, t, x) {
3317
- var sf = this.get_settings().html_data.ajax.success;
3318
- if(sf) { d = sf.call(this,d,t,x) || d; }
3319
- if(d == "") {
3320
- return error_func.call(this, x, t, "");
3321
- }
3322
- if(d) {
3323
- d = $(d);
3324
- if(!d.is("ul")) { d = $("<ul>").append(d); }
3325
- if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }
3326
- else { obj.children(".jstree-loading").removeClass("jstree-loading"); obj.append(d).find("li, a").filter(function () { return this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.data("jstree-is-loading",false); }
3327
- this.clean_node(obj);
3328
- if(s_call) { s_call.call(this); }
3329
- }
3330
- else {
3331
- if(obj && obj !== -1) {
3332
- obj.children(".jstree-loading").removeClass("jstree-loading");
3333
- obj.data("jstree-is-loading",false);
3334
- if(s.correct_state) {
3335
- obj.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");
3336
- if(s_call) { s_call.call(this); }
3337
- }
3338
- }
3339
- else {
3340
- if(s.correct_state) {
3341
- this.get_container().children("ul").empty();
3342
- if(s_call) { s_call.call(this); }
3343
- }
3344
- }
3345
- }
3346
- };
3347
- s.ajax.context = this;
3348
- s.ajax.error = error_func;
3349
- s.ajax.success = success_func;
3350
- if(!s.ajax.dataType) { s.ajax.dataType = "html"; }
3351
- if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
3352
- if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
3353
- $.ajax(s.ajax);
3354
- break;
3355
- }
3356
- }
3357
- }
3358
- });
3359
- // include the HTML data plugin by default
3360
- $.jstree.defaults.plugins.push("html_data");
3361
- })(jQuery);
3362
- //*/
3363
-
3364
- /*
3365
- * jsTree themeroller plugin 1.0
3366
- * Adds support for jQuery UI themes. Include this at the end of your plugins list, also make sure "themes" is not included.
3367
- */
3368
- (function ($) {
3369
- $.jstree.plugin("themeroller", {
3370
- __init : function () {
3371
- var s = this._get_settings().themeroller;
3372
- this.get_container()
3373
- .addClass("ui-widget-content")
3374
- .delegate("a","mouseenter.jstree", function () {
3375
- $(this).addClass(s.item_h);
3376
- })
3377
- .delegate("a","mouseleave.jstree", function () {
3378
- $(this).removeClass(s.item_h);
3379
- })
3380
- .bind("open_node.jstree create_node.jstree", $.proxy(function (e, data) {
3381
- this._themeroller(data.rslt.obj);
3382
- }, this))
3383
- .bind("loaded.jstree refresh.jstree", $.proxy(function (e) {
3384
- this._themeroller();
3385
- }, this))
3386
- .bind("close_node.jstree", $.proxy(function (e, data) {
3387
- data.rslt.obj.children("ins").removeClass(s.opened).addClass(s.closed);
3388
- }, this))
3389
- .bind("select_node.jstree", $.proxy(function (e, data) {
3390
- data.rslt.obj.children("a").addClass(s.item_a);
3391
- }, this))
3392
- .bind("deselect_node.jstree deselect_all.jstree", $.proxy(function (e, data) {
3393
- this.get_container()
3394
- .find("." + s.item_a).removeClass(s.item_a).end()
3395
- .find(".jstree-clicked").addClass(s.item_a);
3396
- }, this))
3397
- .bind("move_node.jstree", $.proxy(function (e, data) {
3398
- this._themeroller(data.rslt.o);
3399
- }, this));
3400
- },
3401
- __destroy : function () {
3402
- var s = this._get_settings().themeroller,
3403
- c = [ "ui-icon" ];
3404
- $.each(s, function (i, v) {
3405
- v = v.split(" ");
3406
- if(v.length) { c = c.concat(v); }
3407
- });
3408
- this.get_container()
3409
- .removeClass("ui-widget-content")
3410
- .find("." + c.join(", .")).removeClass(c.join(" "));
3411
- },
3412
- _fn : {
3413
- _themeroller : function (obj) {
3414
- var s = this._get_settings().themeroller;
3415
- obj = !obj || obj == -1 ? this.get_container() : this._get_node(obj).parent();
3416
- obj
3417
- .find("li.jstree-closed > ins.jstree-icon").removeClass(s.opened).addClass("ui-icon " + s.closed).end()
3418
- .find("li.jstree-open > ins.jstree-icon").removeClass(s.closed).addClass("ui-icon " + s.opened).end()
3419
- .find("a").addClass(s.item)
3420
- .children("ins.jstree-icon").addClass("ui-icon " + s.item_icon);
3421
- }
3422
- },
3423
- defaults : {
3424
- "opened" : "ui-icon-triangle-1-se",
3425
- "closed" : "ui-icon-triangle-1-e",
3426
- "item" : "ui-state-default",
3427
- "item_h" : "ui-state-hover",
3428
- "item_a" : "ui-state-active",
3429
- "item_icon" : "ui-icon-folder-collapsed"
3430
- }
3431
- });
3432
- $(function() {
3433
- var css_string = '.jstree .ui-icon { overflow:visible; } .jstree a { padding:0 2px; }';
3434
- $.vakata.css.add_sheet({ str : css_string });
3435
- });
3436
- })(jQuery);
3437
- //*/
3438
-
3439
- /*
3440
- * jsTree unique plugin 1.0
3441
- * Forces different names amongst siblings (still a bit experimental)
3442
- * NOTE: does not check language versions (it will not be possible to have nodes with the same title, even in different languages)
3443
- */
3444
- (function ($) {
3445
- $.jstree.plugin("unique", {
3446
- __init : function () {
3447
- this.get_container()
3448
- .bind("before.jstree", $.proxy(function (e, data) {
3449
- var nms = [], res = true, p, t;
3450
- if(data.func == "move_node") {
3451
- // obj, ref, position, is_copy, is_prepared, skip_check
3452
- if(data.args[4] === true) {
3453
- if(data.args[0].o && data.args[0].o.length) {
3454
- data.args[0].o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
3455
- res = this._check_unique(nms, data.args[0].np.find("> ul > li").not(data.args[0].o));
3456
- }
3457
- }
3458
- }
3459
- if(data.func == "create_node") {
3460
- // obj, position, js, callback, is_loaded
3461
- if(data.args[4] || this._is_loaded(data.args[0])) {
3462
- p = this._get_node(data.args[0]);
3463
- if(data.args[1] && (data.args[1] === "before" || data.args[1] === "after")) {
3464
- p = this._get_parent(data.args[0]);
3465
- if(!p || p === -1) { p = this.get_container(); }
3466
- }
3467
- if(typeof data.args[2] === "string") { nms.push(data.args[2]); }
3468
- else if(!data.args[2] || !data.args[2].data) { nms.push(this._get_settings().core.strings.new_node); }
3469
- else { nms.push(data.args[2].data); }
3470
- res = this._check_unique(nms, p.find("> ul > li"));
3471
- }
3472
- }
3473
- if(data.func == "rename_node") {
3474
- // obj, val
3475
- nms.push(data.args[1]);
3476
- t = this._get_node(data.args[0]);
3477
- p = this._get_parent(t);
3478
- if(!p || p === -1) { p = this.get_container(); }
3479
- res = this._check_unique(nms, p.find("> ul > li").not(t));
3480
- }
3481
- if(!res) {
3482
- e.stopPropagation();
3483
- return false;
3484
- }
3485
- }, this));
3486
- },
3487
- _fn : {
3488
- _check_unique : function (nms, p) {
3489
- var cnms = [];
3490
- p.children("a").each(function () { cnms.push($(this).text().replace(/^\s+/g,"")); });
3491
- if(!cnms.length || !nms.length) { return true; }
3492
- cnms = cnms.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
3493
- if((cnms.length + nms.length) != cnms.concat(nms).sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",").length) {
3494
- return false;
3495
- }
3496
- return true;
3497
- },
3498
- check_move : function () {
3499
- if(!this.__call_old()) { return false; }
3500
- var p = this._get_move(), nms = [];
3501
- if(p.o && p.o.length) {
3502
- p.o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
3503
- return this._check_unique(nms, p.np.find("> ul > li").not(p.o));
3504
- }
3505
- return true;
3506
- }
3507
- }
3508
- });
3509
- })(jQuery);
3510
- //*/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * jsTree 1.0-rc3
3
+ * http://jstree.com/
4
+ *
5
+ * Copyright (c) 2010 Ivan Bozhanov (vakata.com)
6
+ *
7
+ * Licensed same as jquery - under the terms of either the MIT License or the GPL Version 2 License
8
+ * http://www.opensource.org/licenses/mit-license.php
9
+ * http://www.gnu.org/licenses/gpl.html
10
+ *
11
+ * $Date: 2011-02-09 00:17:14 +0100 (Wed, 09 Feb 2011) $
12
+ * $Revision: 236 $
13
+ */
14
+
15
+ /*jslint browser: true, onevar: true, undef: true, bitwise: true, strict: true */
16
+ /*global window : false, clearInterval: false, clearTimeout: false, document: false, setInterval: false, setTimeout: false, jQuery: false, navigator: false, XSLTProcessor: false, DOMParser: false, XMLSerializer: false*/
17
+
18
+ "use strict";
19
+
20
+ // top wrapper to prevent multiple inclusion (is this OK?)
21
+ (function () { if(jQuery && jQuery.jstree) { return; }
22
+ var is_ie6 = false, is_ie7 = false, is_ff2 = false;
23
+
24
+ /*
25
+ * jsTree core
26
+ */
27
+ (function ($) {
28
+ // Common functions not related to jsTree
29
+ // decided to move them to a `vakata` "namespace"
30
+ $.vakata = {};
31
+ // CSS related functions
32
+ $.vakata.css = {
33
+ get_css : function(rule_name, delete_flag, sheet) {
34
+ rule_name = rule_name.toLowerCase();
35
+ var css_rules = sheet.cssRules || sheet.rules,
36
+ j = 0;
37
+ do {
38
+ if(css_rules.length && j > css_rules.length + 5) { return false; }
39
+ if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) {
40
+ if(delete_flag === true) {
41
+ if(sheet.removeRule) { sheet.removeRule(j); }
42
+ if(sheet.deleteRule) { sheet.deleteRule(j); }
43
+ return true;
44
+ }
45
+ else { return css_rules[j]; }
46
+ }
47
+ }
48
+ while (css_rules[++j]);
49
+ return false;
50
+ },
51
+ add_css : function(rule_name, sheet) {
52
+ if($.jstree.css.get_css(rule_name, false, sheet)) { return false; }
53
+ if(sheet.insertRule) { sheet.insertRule(rule_name + ' { }', 0); } else { sheet.addRule(rule_name, null, 0); }
54
+ return $.vakata.css.get_css(rule_name);
55
+ },
56
+ remove_css : function(rule_name, sheet) {
57
+ return $.vakata.css.get_css(rule_name, true, sheet);
58
+ },
59
+ add_sheet : function(opts) {
60
+ var tmp = false, is_new = true;
61
+ if(opts.str) {
62
+ if(opts.title) { tmp = $("style[id='" + opts.title + "-stylesheet']")[0]; }
63
+ if(tmp) { is_new = false; }
64
+ else {
65
+ tmp = document.createElement("style");
66
+ tmp.setAttribute('type',"text/css");
67
+ if(opts.title) { tmp.setAttribute("id", opts.title + "-stylesheet"); }
68
+ }
69
+ if(tmp.styleSheet) {
70
+ if(is_new) {
71
+ document.getElementsByTagName("head")[0].appendChild(tmp);
72
+ tmp.styleSheet.cssText = opts.str;
73
+ }
74
+ else {
75
+ tmp.styleSheet.cssText = tmp.styleSheet.cssText + " " + opts.str;
76
+ }
77
+ }
78
+ else {
79
+ tmp.appendChild(document.createTextNode(opts.str));
80
+ document.getElementsByTagName("head")[0].appendChild(tmp);
81
+ }
82
+ return tmp.sheet || tmp.styleSheet;
83
+ }
84
+ if(opts.url) {
85
+ if(document.createStyleSheet) {
86
+ try { tmp = document.createStyleSheet(opts.url); } catch (e) { }
87
+ }
88
+ else {
89
+ tmp = document.createElement('link');
90
+ tmp.rel = 'stylesheet';
91
+ tmp.type = 'text/css';
92
+ tmp.media = "all";
93
+ tmp.href = opts.url;
94
+ document.getElementsByTagName("head")[0].appendChild(tmp);
95
+ return tmp.styleSheet;
96
+ }
97
+ }
98
+ }
99
+ };
100
+
101
+ // private variables
102
+ var instances = [], // instance array (used by $.jstree.reference/create/focused)
103
+ focused_instance = -1, // the index in the instance array of the currently focused instance
104
+ plugins = {}, // list of included plugins
105
+ prepared_move = {}; // for the move_node function
106
+
107
+ // jQuery plugin wrapper (thanks to jquery UI widget function)
108
+ $.fn.jstree = function (settings) {
109
+ var isMethodCall = (typeof settings == 'string'), // is this a method call like $().jstree("open_node")
110
+ args = Array.prototype.slice.call(arguments, 1),
111
+ returnValue = this;
112
+
113
+ // if a method call execute the method on all selected instances
114
+ if(isMethodCall) {
115
+ if(settings.substring(0, 1) == '_') { return returnValue; }
116
+ this.each(function() {
117
+ var instance = instances[$.data(this, "jstree-instance-id")],
118
+ methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance;
119
+ if(typeof methodValue !== "undefined" && (settings.indexOf("is_") === 0 || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; }
120
+ });
121
+ }
122
+ else {
123
+ this.each(function() {
124
+ // extend settings and allow for multiple hashes and $.data
125
+ var instance_id = $.data(this, "jstree-instance-id"),
126
+ a = [],
127
+ b = settings ? $.extend({}, true, settings) : {},
128
+ c = $(this),
129
+ s = false,
130
+ t = [];
131
+ a = a.concat(args);
132
+ if(c.data("jstree")) { a.push(c.data("jstree")); }
133
+ b = a.length ? $.extend.apply(null, [true, b].concat(a)) : b;
134
+
135
+ // if an instance already exists, destroy it first
136
+ if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); }
137
+ // push a new empty object to the instances array
138
+ instance_id = parseInt(instances.push({}),10) - 1;
139
+ // store the jstree instance id to the container element
140
+ $.data(this, "jstree-instance-id", instance_id);
141
+ // clean up all plugins
142
+ b.plugins = $.isArray(b.plugins) ? b.plugins : $.jstree.defaults.plugins.slice();
143
+ b.plugins.unshift("core");
144
+ // only unique plugins
145
+ b.plugins = b.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
146
+
147
+ // extend defaults with passed data
148
+ s = $.extend(true, {}, $.jstree.defaults, b);
149
+ s.plugins = b.plugins;
150
+ $.each(plugins, function (i, val) {
151
+ if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; }
152
+ else { t.push(i); }
153
+ });
154
+ s.plugins = t;
155
+
156
+ // push the new object to the instances array (at the same time set the default classes to the container) and init
157
+ instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s);
158
+ // init all activated plugins for this instance
159
+ $.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; });
160
+ $.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } });
161
+ // initialize the instance
162
+ setTimeout(function() { instances[instance_id].init(); }, 0);
163
+ });
164
+ }
165
+ // return the jquery selection (or if it was a method call that returned a value - the returned value)
166
+ return returnValue;
167
+ };
168
+ // object to store exposed functions and objects
169
+ $.jstree = {
170
+ defaults : {
171
+ plugins : []
172
+ },
173
+ _focused : function () { return instances[focused_instance] || null; },
174
+ _reference : function (needle) {
175
+ // get by instance id
176
+ if(instances[needle]) { return instances[needle]; }
177
+ // get by DOM (if still no luck - return null
178
+ var o = $(needle);
179
+ if(!o.length && typeof needle === "string") { o = $("#" + needle); }
180
+ if(!o.length) { return null; }
181
+ return instances[o.closest(".jstree").data("jstree-instance-id")] || null;
182
+ },
183
+ _instance : function (index, container, settings) {
184
+ // for plugins to store data in
185
+ this.data = { core : {} };
186
+ this.get_settings = function () { return $.extend(true, {}, settings); };
187
+ this._get_settings = function () { return settings; };
188
+ this.get_index = function () { return index; };
189
+ this.get_container = function () { return container; };
190
+ this.get_container_ul = function () { return container.children("ul:eq(0)"); };
191
+ this._set_settings = function (s) {
192
+ settings = $.extend(true, {}, settings, s);
193
+ };
194
+ },
195
+ _fn : { },
196
+ plugin : function (pname, pdata) {
197
+ pdata = $.extend({}, {
198
+ __init : $.noop,
199
+ __destroy : $.noop,
200
+ _fn : {},
201
+ defaults : false
202
+ }, pdata);
203
+ plugins[pname] = pdata;
204
+
205
+ $.jstree.defaults[pname] = pdata.defaults;
206
+ $.each(pdata._fn, function (i, val) {
207
+ val.plugin = pname;
208
+ val.old = $.jstree._fn[i];
209
+ $.jstree._fn[i] = function () {
210
+ var rslt,
211
+ func = val,
212
+ args = Array.prototype.slice.call(arguments),
213
+ evnt = new $.Event("before.jstree"),
214
+ rlbk = false;
215
+
216
+ if(this.data.core.locked === true && i !== "unlock" && i !== "is_locked") { return; }
217
+
218
+ // Check if function belongs to the included plugins of this instance
219
+ do {
220
+ if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; }
221
+ func = func.old;
222
+ } while(func);
223
+ if(!func) { return; }
224
+
225
+ // context and function to trigger events, then finally call the function
226
+ if(i.indexOf("_") === 0) {
227
+ rslt = func.apply(this, args);
228
+ }
229
+ else {
230
+ rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args, "plugin" : func.plugin });
231
+ if(rslt === false) { return; }
232
+ if(typeof rslt !== "undefined") { args = rslt; }
233
+
234
+ rslt = func.apply(
235
+ $.extend({}, this, {
236
+ __callback : function (data) {
237
+ this.get_container().triggerHandler( i + '.jstree', { "inst" : this, "args" : args, "rslt" : data, "rlbk" : rlbk });
238
+ },
239
+ __rollback : function () {
240
+ rlbk = this.get_rollback();
241
+ return rlbk;
242
+ },
243
+ __call_old : function (replace_arguments) {
244
+ return func.old.apply(this, (replace_arguments ? Array.prototype.slice.call(arguments, 1) : args ) );
245
+ }
246
+ }), args);
247
+ }
248
+
249
+ // return the result
250
+ return rslt;
251
+ };
252
+ $.jstree._fn[i].old = val.old;
253
+ $.jstree._fn[i].plugin = pname;
254
+ });
255
+ },
256
+ rollback : function (rb) {
257
+ if(rb) {
258
+ if(!$.isArray(rb)) { rb = [ rb ]; }
259
+ $.each(rb, function (i, val) {
260
+ instances[val.i].set_rollback(val.h, val.d);
261
+ });
262
+ }
263
+ }
264
+ };
265
+ // set the prototype for all instances
266
+ $.jstree._fn = $.jstree._instance.prototype = {};
267
+
268
+ // load the css when DOM is ready
269
+ $(function() {
270
+ // code is copied from jQuery ($.browser is deprecated + there is a bug in IE)
271
+ var u = navigator.userAgent.toLowerCase(),
272
+ v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
273
+ css_string = '' +
274
+ '.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' +
275
+ '.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; min-width:18px; } ' +
276
+ '.jstree-rtl li { margin-left:0; margin-right:18px; } ' +
277
+ '.jstree > ul > li { margin-left:0px; } ' +
278
+ '.jstree-rtl > ul > li { margin-right:0px; } ' +
279
+ '.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' +
280
+ '.jstree a { display:inline-block; line-height:16px; height:16px; color:black; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' +
281
+ '.jstree a:focus { outline: none; } ' +
282
+ '.jstree a > ins { height:16px; width:16px; } ' +
283
+ '.jstree a > .jstree-icon { margin-right:3px; } ' +
284
+ '.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' +
285
+ 'li.jstree-open > ul { display:block; } ' +
286
+ 'li.jstree-closed > ul { display:none; } ';
287
+ // Correct IE 6 (does not support the > CSS selector)
288
+ if(/msie/.test(u) && parseInt(v, 10) == 6) {
289
+ is_ie6 = true;
290
+
291
+ // fix image flicker and lack of caching
292
+ try {
293
+ document.execCommand("BackgroundImageCache", false, true);
294
+ } catch (err) { }
295
+
296
+ css_string += '' +
297
+ '.jstree li { height:18px; margin-left:0; margin-right:0; } ' +
298
+ '.jstree li li { margin-left:18px; } ' +
299
+ '.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' +
300
+ 'li.jstree-open ul { display:block; } ' +
301
+ 'li.jstree-closed ul { display:none !important; } ' +
302
+ '.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' +
303
+ '.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' +
304
+ '.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } ';
305
+ }
306
+ // Correct IE 7 (shifts anchor nodes onhover)
307
+ if(/msie/.test(u) && parseInt(v, 10) == 7) {
308
+ is_ie7 = true;
309
+ css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } ';
310
+ }
311
+ // correct ff2 lack of display:inline-block
312
+ if(!/compatible/.test(u) && /mozilla/.test(u) && parseFloat(v, 10) < 1.9) {
313
+ is_ff2 = true;
314
+ css_string += '' +
315
+ '.jstree ins { display:-moz-inline-box; } ' +
316
+ '.jstree li { line-height:12px; } ' + // WHY??
317
+ '.jstree a { display:-moz-inline-box; } ' +
318
+ '.jstree .jstree-no-icons .jstree-checkbox { display:-moz-inline-stack !important; } ';
319
+ /* this shouldn't be here as it is theme specific */
320
+ }
321
+ // the default stylesheet
322
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
323
+ });
324
+
325
+ // core functions (open, close, create, update, delete)
326
+ $.jstree.plugin("core", {
327
+ __init : function () {
328
+ this.data.core.locked = false;
329
+ this.data.core.to_open = this.get_settings().core.initially_open;
330
+ this.data.core.to_load = this.get_settings().core.initially_load;
331
+ },
332
+ defaults : {
333
+ html_titles : false,
334
+ animation : 500,
335
+ initially_open : [],
336
+ initially_load : [],
337
+ open_parents : true,
338
+ notify_plugins : true,
339
+ rtl : false,
340
+ load_open : false,
341
+ strings : {
342
+ loading : "Loading ...",
343
+ new_node : "New node",
344
+ multiple_selection : "Multiple selection"
345
+ }
346
+ },
347
+ _fn : {
348
+ init : function () {
349
+ this.set_focus();
350
+ if(this._get_settings().core.rtl) {
351
+ this.get_container().addClass("jstree-rtl").css("direction", "rtl");
352
+ }
353
+ this.get_container().html("<ul><li class='jstree-last jstree-leaf'><ins>&#160;</ins><a class='jstree-loading' href='#'><ins class='jstree-icon'>&#160;</ins>" + this._get_string("loading") + "</a></li></ul>");
354
+ this.data.core.li_height = this.get_container_ul().find("li.jstree-closed, li.jstree-leaf").eq(0).height() || 18;
355
+
356
+ this.get_container()
357
+ .delegate("li > ins", "click.jstree", $.proxy(function (event) {
358
+ var trgt = $(event.target);
359
+ if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); }
360
+ }, this))
361
+ .bind("mousedown.jstree", $.proxy(function () {
362
+ this.set_focus(); // This used to be setTimeout(set_focus,0) - why?
363
+ }, this))
364
+ .bind("dblclick.jstree", function (event) {
365
+ var sel;
366
+ if(document.selection && document.selection.empty) { document.selection.empty(); }
367
+ else {
368
+ if(window.getSelection) {
369
+ sel = window.getSelection();
370
+ try {
371
+ sel.removeAllRanges();
372
+ sel.collapse();
373
+ } catch (err) { }
374
+ }
375
+ }
376
+ });
377
+ if(this._get_settings().core.notify_plugins) {
378
+ this.get_container()
379
+ .bind("load_node.jstree", $.proxy(function (e, data) {
380
+ var o = this._get_node(data.rslt.obj),
381
+ t = this;
382
+ if(o === -1) { o = this.get_container_ul(); }
383
+ if(!o.length) { return; }
384
+ o.find("li").each(function () {
385
+ var th = $(this);
386
+ if(th.data("jstree")) {
387
+ $.each(th.data("jstree"), function (plugin, values) {
388
+ if(t.data[plugin] && $.isFunction(t["_" + plugin + "_notify"])) {
389
+ t["_" + plugin + "_notify"].call(t, th, values);
390
+ }
391
+ });
392
+ }
393
+ });
394
+ }, this));
395
+ }
396
+ if(this._get_settings().core.load_open) {
397
+ this.get_container()
398
+ .bind("load_node.jstree", $.proxy(function (e, data) {
399
+ var o = this._get_node(data.rslt.obj),
400
+ t = this;
401
+ if(o === -1) { o = this.get_container_ul(); }
402
+ if(!o.length) { return; }
403
+ o.find("li.jstree-open:not(:has(ul))").each(function () {
404
+ t.load_node(this, $.noop, $.noop);
405
+ });
406
+ }, this));
407
+ }
408
+ this.__callback();
409
+ this.load_node(-1, function () { this.loaded(); this.reload_nodes(); });
410
+ },
411
+ destroy : function () {
412
+ var i,
413
+ n = this.get_index(),
414
+ s = this._get_settings(),
415
+ _this = this;
416
+
417
+ $.each(s.plugins, function (i, val) {
418
+ try { plugins[val].__destroy.apply(_this); } catch(err) { }
419
+ });
420
+ this.__callback();
421
+ // set focus to another instance if this one is focused
422
+ if(this.is_focused()) {
423
+ for(i in instances) {
424
+ if(instances.hasOwnProperty(i) && i != n) {
425
+ instances[i].set_focus();
426
+ break;
427
+ }
428
+ }
429
+ }
430
+ // if no other instance found
431
+ if(n === focused_instance) { focused_instance = -1; }
432
+ // remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events
433
+ this.get_container()
434
+ .unbind(".jstree")
435
+ .undelegate(".jstree")
436
+ .removeData("jstree-instance-id")
437
+ .find("[class^='jstree']")
438
+ .andSelf()
439
+ .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });
440
+ $(document)
441
+ .unbind(".jstree-" + n)
442
+ .undelegate(".jstree-" + n);
443
+ // remove the actual data
444
+ instances[n] = null;
445
+ delete instances[n];
446
+ },
447
+
448
+ _core_notify : function (n, data) {
449
+ if(data.opened) {
450
+ this.open_node(n, false, true);
451
+ }
452
+ },
453
+
454
+ lock : function () {
455
+ this.data.core.locked = true;
456
+ this.get_container().children("ul").addClass("jstree-locked").css("opacity","0.7");
457
+ this.__callback({});
458
+ },
459
+ unlock : function () {
460
+ this.data.core.locked = false;
461
+ this.get_container().children("ul").removeClass("jstree-locked").css("opacity","1");
462
+ this.__callback({});
463
+ },
464
+ is_locked : function () { return this.data.core.locked; },
465
+ save_opened : function () {
466
+ var _this = this;
467
+ this.data.core.to_open = [];
468
+ this.get_container_ul().find("li.jstree-open").each(function () {
469
+ if(this.id) { _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); }
470
+ });
471
+ this.__callback(_this.data.core.to_open);
472
+ },
473
+ save_loaded : function () { },
474
+ reload_nodes : function (is_callback) {
475
+ var _this = this,
476
+ done = true,
477
+ current = [],
478
+ remaining = [];
479
+ if(!is_callback) {
480
+ this.data.core.reopen = false;
481
+ this.data.core.refreshing = true;
482
+ this.data.core.to_open = $.map($.makeArray(this.data.core.to_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
483
+ this.data.core.to_load = $.map($.makeArray(this.data.core.to_load), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
484
+ if(this.data.core.to_open.length) {
485
+ this.data.core.to_load = this.data.core.to_load.concat(this.data.core.to_open);
486
+ }
487
+ }
488
+ if(this.data.core.to_load.length) {
489
+ $.each(this.data.core.to_load, function (i, val) {
490
+ if(val == "#") { return true; }
491
+ if($(val).length) { current.push(val); }
492
+ else { remaining.push(val); }
493
+ });
494
+ if(current.length) {
495
+ this.data.core.to_load = remaining;
496
+ $.each(current, function (i, val) {
497
+ if(!_this._is_loaded(val)) {
498
+ _this.load_node(val, function () { _this.reload_nodes(true); }, function () { _this.reload_nodes(true); });
499
+ done = false;
500
+ }
501
+ });
502
+ }
503
+ }
504
+ if(this.data.core.to_open.length) {
505
+ $.each(this.data.core.to_open, function (i, val) {
506
+ _this.open_node(val, false, true);
507
+ });
508
+ }
509
+ if(done) {
510
+ // TODO: find a more elegant approach to syncronizing returning requests
511
+ if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); }
512
+ this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50);
513
+ this.data.core.refreshing = false;
514
+ this.reopen();
515
+ }
516
+ },
517
+ reopen : function () {
518
+ var _this = this;
519
+ if(this.data.core.to_open.length) {
520
+ $.each(this.data.core.to_open, function (i, val) {
521
+ _this.open_node(val, false, true);
522
+ });
523
+ }
524
+ this.__callback({});
525
+ },
526
+ refresh : function (obj) {
527
+ var _this = this;
528
+ this.save_opened();
529
+ if(!obj) { obj = -1; }
530
+ obj = this._get_node(obj);
531
+ if(!obj) { obj = -1; }
532
+ if(obj !== -1) { obj.children("UL").remove(); }
533
+ else { this.get_container_ul().empty(); }
534
+ this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes(); });
535
+ },
536
+ // Dummy function to fire after the first load (so that there is a jstree.loaded event)
537
+ loaded : function () {
538
+ this.__callback();
539
+ },
540
+ // deal with focus
541
+ set_focus : function () {
542
+ if(this.is_focused()) { return; }
543
+ var f = $.jstree._focused();
544
+ if(f) { f.unset_focus(); }
545
+
546
+ this.get_container().addClass("jstree-focused");
547
+ focused_instance = this.get_index();
548
+ this.__callback();
549
+ },
550
+ is_focused : function () {
551
+ return focused_instance == this.get_index();
552
+ },
553
+ unset_focus : function () {
554
+ if(this.is_focused()) {
555
+ this.get_container().removeClass("jstree-focused");
556
+ focused_instance = -1;
557
+ }
558
+ this.__callback();
559
+ },
560
+
561
+ // traverse
562
+ _get_node : function (obj) {
563
+ var $obj = $(obj, this.get_container());
564
+ if($obj.is(".jstree") || obj == -1) { return -1; }
565
+ $obj = $obj.closest("li", this.get_container());
566
+ return $obj.length ? $obj : false;
567
+ },
568
+ _get_next : function (obj, strict) {
569
+ obj = this._get_node(obj);
570
+ if(obj === -1) { return this.get_container().find("> ul > li:first-child"); }
571
+ if(!obj.length) { return false; }
572
+ if(strict) { return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; }
573
+
574
+ if(obj.hasClass("jstree-open")) { return obj.find("li:eq(0)"); }
575
+ else if(obj.nextAll("li").size() > 0) { return obj.nextAll("li:eq(0)"); }
576
+ else { return obj.parentsUntil(".jstree","li").next("li").eq(0); }
577
+ },
578
+ _get_prev : function (obj, strict) {
579
+ obj = this._get_node(obj);
580
+ if(obj === -1) { return this.get_container().find("> ul > li:last-child"); }
581
+ if(!obj.length) { return false; }
582
+ if(strict) { return (obj.prevAll("li").length > 0) ? obj.prevAll("li:eq(0)") : false; }
583
+
584
+ if(obj.prev("li").length) {
585
+ obj = obj.prev("li").eq(0);
586
+ while(obj.hasClass("jstree-open")) { obj = obj.children("ul:eq(0)").children("li:last"); }
587
+ return obj;
588
+ }
589
+ else { var o = obj.parentsUntil(".jstree","li:eq(0)"); return o.length ? o : false; }
590
+ },
591
+ _get_parent : function (obj) {
592
+ obj = this._get_node(obj);
593
+ if(obj == -1 || !obj.length) { return false; }
594
+ var o = obj.parentsUntil(".jstree", "li:eq(0)");
595
+ return o.length ? o : -1;
596
+ },
597
+ _get_children : function (obj) {
598
+ obj = this._get_node(obj);
599
+ if(obj === -1) { return this.get_container().children("ul:eq(0)").children("li"); }
600
+ if(!obj.length) { return false; }
601
+ return obj.children("ul:eq(0)").children("li");
602
+ },
603
+ get_path : function (obj, id_mode) {
604
+ var p = [],
605
+ _this = this;
606
+ obj = this._get_node(obj);
607
+ if(obj === -1 || !obj || !obj.length) { return false; }
608
+ obj.parentsUntil(".jstree", "li").each(function () {
609
+ p.push( id_mode ? this.id : _this.get_text(this) );
610
+ });
611
+ p.reverse();
612
+ p.push( id_mode ? obj.attr("id") : this.get_text(obj) );
613
+ return p;
614
+ },
615
+
616
+ // string functions
617
+ _get_string : function (key) {
618
+ return this._get_settings().core.strings[key] || key;
619
+ },
620
+
621
+ is_open : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); },
622
+ is_closed : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); },
623
+ is_leaf : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); },
624
+ correct_state : function (obj) {
625
+ obj = this._get_node(obj);
626
+ if(!obj || obj === -1) { return false; }
627
+ obj.removeClass("jstree-closed jstree-open").addClass("jstree-leaf").children("ul").remove();
628
+ this.__callback({ "obj" : obj });
629
+ },
630
+ // open/close
631
+ open_node : function (obj, callback, skip_animation) {
632
+ obj = this._get_node(obj);
633
+ if(!obj.length) { return false; }
634
+ if(!obj.hasClass("jstree-closed")) { if(callback) { callback.call(); } return false; }
635
+ var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,
636
+ t = this;
637
+ if(!this._is_loaded(obj)) {
638
+ obj.children("a").addClass("jstree-loading");
639
+ this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback);
640
+ }
641
+ else {
642
+ if(this._get_settings().core.open_parents) {
643
+ obj.parentsUntil(".jstree",".jstree-closed").each(function () {
644
+ t.open_node(this, false, true);
645
+ });
646
+ }
647
+ if(s) { obj.children("ul").css("display","none"); }
648
+ obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading");
649
+ if(s) { obj.children("ul").stop(true, true).slideDown(s, function () { this.style.display = ""; t.after_open(obj); }); }
650
+ else { t.after_open(obj); }
651
+ this.__callback({ "obj" : obj });
652
+ if(callback) { callback.call(); }
653
+ }
654
+ },
655
+ after_open : function (obj) { this.__callback({ "obj" : obj }); },
656
+ close_node : function (obj, skip_animation) {
657
+ obj = this._get_node(obj);
658
+ var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,
659
+ t = this;
660
+ if(!obj.length || !obj.hasClass("jstree-open")) { return false; }
661
+ if(s) { obj.children("ul").attr("style","display:block !important"); }
662
+ obj.removeClass("jstree-open").addClass("jstree-closed");
663
+ if(s) { obj.children("ul").stop(true, true).slideUp(s, function () { this.style.display = ""; t.after_close(obj); }); }
664
+ else { t.after_close(obj); }
665
+ this.__callback({ "obj" : obj });
666
+ },
667
+ after_close : function (obj) { this.__callback({ "obj" : obj }); },
668
+ toggle_node : function (obj) {
669
+ obj = this._get_node(obj);
670
+ if(obj.hasClass("jstree-closed")) { return this.open_node(obj); }
671
+ if(obj.hasClass("jstree-open")) { return this.close_node(obj); }
672
+ },
673
+ open_all : function (obj, do_animation, original_obj) {
674
+ obj = obj ? this._get_node(obj) : -1;
675
+ if(!obj || obj === -1) { obj = this.get_container_ul(); }
676
+ if(original_obj) {
677
+ obj = obj.find("li.jstree-closed");
678
+ }
679
+ else {
680
+ original_obj = obj;
681
+ if(obj.is(".jstree-closed")) { obj = obj.find("li.jstree-closed").andSelf(); }
682
+ else { obj = obj.find("li.jstree-closed"); }
683
+ }
684
+ var _this = this;
685
+ obj.each(function () {
686
+ var __this = this;
687
+ if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, do_animation, original_obj); }, !do_animation); }
688
+ else { _this.open_node(this, false, !do_animation); }
689
+ });
690
+ // so that callback is fired AFTER all nodes are open
691
+ if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); }
692
+ },
693
+ close_all : function (obj, do_animation) {
694
+ var _this = this;
695
+ obj = obj ? this._get_node(obj) : this.get_container();
696
+ if(!obj || obj === -1) { obj = this.get_container_ul(); }
697
+ obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this, !do_animation); });
698
+ this.__callback({ "obj" : obj });
699
+ },
700
+ clean_node : function (obj) {
701
+ obj = obj && obj != -1 ? $(obj) : this.get_container_ul();
702
+ obj = obj.is("li") ? obj.find("li").andSelf() : obj.find("li");
703
+ obj.removeClass("jstree-last")
704
+ .filter("li:last-child").addClass("jstree-last").end()
705
+ .filter(":has(li)")
706
+ .not(".jstree-open").removeClass("jstree-leaf").addClass("jstree-closed");
707
+ obj.not(".jstree-open, .jstree-closed").addClass("jstree-leaf").children("ul").remove();
708
+ this.__callback({ "obj" : obj });
709
+ },
710
+ // rollback
711
+ get_rollback : function () {
712
+ this.__callback();
713
+ return { i : this.get_index(), h : this.get_container().children("ul").clone(true), d : this.data };
714
+ },
715
+ set_rollback : function (html, data) {
716
+ this.get_container().empty().append(html);
717
+ this.data = data;
718
+ this.__callback();
719
+ },
720
+ // Dummy functions to be overwritten by any datastore plugin included
721
+ load_node : function (obj, s_call, e_call) { this.__callback({ "obj" : obj }); },
722
+ _is_loaded : function (obj) { return true; },
723
+
724
+ // Basic operations: create
725
+ create_node : function (obj, position, js, callback, is_loaded) {
726
+ obj = this._get_node(obj);
727
+ position = typeof position === "undefined" ? "last" : position;
728
+ var d = $("<li />"),
729
+ s = this._get_settings().core,
730
+ tmp;
731
+
732
+ if(obj !== -1 && !obj.length) { return false; }
733
+ if(!is_loaded && !this._is_loaded(obj)) { this.load_node(obj, function () { this.create_node(obj, position, js, callback, true); }); return false; }
734
+
735
+ this.__rollback();
736
+
737
+ if(typeof js === "string") { js = { "data" : js }; }
738
+ if(!js) { js = {}; }
739
+ if(js.attr) { d.attr(js.attr); }
740
+ if(js.metadata) { d.data(js.metadata); }
741
+ if(js.state) { d.addClass("jstree-" + js.state); }
742
+ if(!js.data) { js.data = this._get_string("new_node"); }
743
+ if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
744
+ $.each(js.data, function (i, m) {
745
+ tmp = $("<a />");
746
+ if($.isFunction(m)) { m = m.call(this, js); }
747
+ if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); }
748
+ else {
749
+ if(!m.attr) { m.attr = {}; }
750
+ if(!m.attr.href) { m.attr.href = '#'; }
751
+ tmp.attr(m.attr)[ s.html_titles ? "html" : "text" ](m.title);
752
+ if(m.language) { tmp.addClass(m.language); }
753
+ }
754
+ tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");
755
+ if(m.icon) {
756
+ if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
757
+ else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
758
+ }
759
+ d.append(tmp);
760
+ });
761
+ d.prepend("<ins class='jstree-icon'>&#160;</ins>");
762
+ if(obj === -1) {
763
+ obj = this.get_container();
764
+ if(position === "before") { position = "first"; }
765
+ if(position === "after") { position = "last"; }
766
+ }
767
+ switch(position) {
768
+ case "before": obj.before(d); tmp = this._get_parent(obj); break;
769
+ case "after" : obj.after(d); tmp = this._get_parent(obj); break;
770
+ case "inside":
771
+ case "first" :
772
+ if(!obj.children("ul").length) { obj.append("<ul />"); }
773
+ obj.children("ul").prepend(d);
774
+ tmp = obj;
775
+ break;
776
+ case "last":
777
+ if(!obj.children("ul").length) { obj.append("<ul />"); }
778
+ obj.children("ul").append(d);
779
+ tmp = obj;
780
+ break;
781
+ default:
782
+ if(!obj.children("ul").length) { obj.append("<ul />"); }
783
+ if(!position) { position = 0; }
784
+ tmp = obj.children("ul").children("li").eq(position);
785
+ if(tmp.length) { tmp.before(d); }
786
+ else { obj.children("ul").append(d); }
787
+ tmp = obj;
788
+ break;
789
+ }
790
+ if(tmp === -1 || tmp.get(0) === this.get_container().get(0)) { tmp = -1; }
791
+ this.clean_node(tmp);
792
+ this.__callback({ "obj" : d, "parent" : tmp });
793
+ if(callback) { callback.call(this, d); }
794
+ return d;
795
+ },
796
+ // Basic operations: rename (deal with text)
797
+ get_text : function (obj) {
798
+ obj = this._get_node(obj);
799
+ if(!obj.length) { return false; }
800
+ var s = this._get_settings().core.html_titles;
801
+ obj = obj.children("a:eq(0)");
802
+ if(s) {
803
+ obj = obj.clone();
804
+ obj.children("INS").remove();
805
+ return obj.html();
806
+ }
807
+ else {
808
+ obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
809
+ return obj.nodeValue;
810
+ }
811
+ },
812
+ set_text : function (obj, val) {
813
+ obj = this._get_node(obj);
814
+ if(!obj.length) { return false; }
815
+ obj = obj.children("a:eq(0)");
816
+ if(this._get_settings().core.html_titles) {
817
+ var tmp = obj.children("INS").clone();
818
+ obj.html(val).prepend(tmp);
819
+ this.__callback({ "obj" : obj, "name" : val });
820
+ return true;
821
+ }
822
+ else {
823
+ obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
824
+ this.__callback({ "obj" : obj, "name" : val });
825
+ return (obj.nodeValue = val);
826
+ }
827
+ },
828
+ rename_node : function (obj, val) {
829
+ obj = this._get_node(obj);
830
+ this.__rollback();
831
+ if(obj && obj.length && this.set_text.apply(this, Array.prototype.slice.call(arguments))) { this.__callback({ "obj" : obj, "name" : val }); }
832
+ },
833
+ // Basic operations: deleting nodes
834
+ delete_node : function (obj) {
835
+ obj = this._get_node(obj);
836
+ if(!obj.length) { return false; }
837
+ this.__rollback();
838
+ var p = this._get_parent(obj), prev = $([]), t = this;
839
+ obj.each(function () {
840
+ prev = prev.add(t._get_prev(this));
841
+ });
842
+ obj = obj.detach();
843
+ if(p !== -1 && p.find("> ul > li").length === 0) {
844
+ p.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");
845
+ }
846
+ this.clean_node(p);
847
+ this.__callback({ "obj" : obj, "prev" : prev, "parent" : p });
848
+ return obj;
849
+ },
850
+ prepare_move : function (o, r, pos, cb, is_cb) {
851
+ var p = {};
852
+
853
+ p.ot = $.jstree._reference(o) || this;
854
+ p.o = p.ot._get_node(o);
855
+ p.r = r === - 1 ? -1 : this._get_node(r);
856
+ p.p = (typeof pos === "undefined" || pos === false) ? "last" : pos; // TODO: move to a setting
857
+ if(!is_cb && prepared_move.o && prepared_move.o[0] === p.o[0] && prepared_move.r[0] === p.r[0] && prepared_move.p === p.p) {
858
+ this.__callback(prepared_move);
859
+ if(cb) { cb.call(this, prepared_move); }
860
+ return;
861
+ }
862
+ p.ot = $.jstree._reference(p.o) || this;
863
+ p.rt = $.jstree._reference(p.r) || this; // r === -1 ? p.ot : $.jstree._reference(p.r) || this
864
+ if(p.r === -1 || !p.r) {
865
+ p.cr = -1;
866
+ switch(p.p) {
867
+ case "first":
868
+ case "before":
869
+ case "inside":
870
+ p.cp = 0;
871
+ break;
872
+ case "after":
873
+ case "last":
874
+ p.cp = p.rt.get_container().find(" > ul > li").length;
875
+ break;
876
+ default:
877
+ p.cp = p.p;
878
+ break;
879
+ }
880
+ }
881
+ else {
882
+ if(!/^(before|after)$/.test(p.p) && !this._is_loaded(p.r)) {
883
+ return this.load_node(p.r, function () { this.prepare_move(o, r, pos, cb, true); });
884
+ }
885
+ switch(p.p) {
886
+ case "before":
887
+ p.cp = p.r.index();
888
+ p.cr = p.rt._get_parent(p.r);
889
+ break;
890
+ case "after":
891
+ p.cp = p.r.index() + 1;
892
+ p.cr = p.rt._get_parent(p.r);
893
+ break;
894
+ case "inside":
895
+ case "first":
896
+ p.cp = 0;
897
+ p.cr = p.r;
898
+ break;
899
+ case "last":
900
+ p.cp = p.r.find(" > ul > li").length;
901
+ p.cr = p.r;
902
+ break;
903
+ default:
904
+ p.cp = p.p;
905
+ p.cr = p.r;
906
+ break;
907
+ }
908
+ }
909
+ p.np = p.cr == -1 ? p.rt.get_container() : p.cr;
910
+ p.op = p.ot._get_parent(p.o);
911
+ p.cop = p.o.index();
912
+ if(p.op === -1) { p.op = p.ot ? p.ot.get_container() : this.get_container(); }
913
+ if(!/^(before|after)$/.test(p.p) && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp++; }
914
+ //if(p.p === "before" && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp--; }
915
+ p.or = p.np.find(" > ul > li:nth-child(" + (p.cp + 1) + ")");
916
+ prepared_move = p;
917
+ this.__callback(prepared_move);
918
+ if(cb) { cb.call(this, prepared_move); }
919
+ },
920
+ check_move : function () {
921
+ var obj = prepared_move, ret = true, r = obj.r === -1 ? this.get_container() : obj.r;
922
+ if(!obj || !obj.o || obj.or[0] === obj.o[0]) { return false; }
923
+ if(obj.op && obj.np && obj.op[0] === obj.np[0] && obj.cp - 1 === obj.o.index()) { return false; }
924
+ obj.o.each(function () {
925
+ if(r.parentsUntil(".jstree", "li").andSelf().index(this) !== -1) { ret = false; return false; }
926
+ });
927
+ return ret;
928
+ },
929
+ move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
930
+ if(!is_prepared) {
931
+ return this.prepare_move(obj, ref, position, function (p) {
932
+ this.move_node(p, false, false, is_copy, true, skip_check);
933
+ });
934
+ }
935
+ if(is_copy) {
936
+ prepared_move.cy = true;
937
+ }
938
+ if(!skip_check && !this.check_move()) { return false; }
939
+
940
+ this.__rollback();
941
+ var o = false;
942
+ if(is_copy) {
943
+ o = obj.o.clone(true);
944
+ o.find("*[id]").andSelf().each(function () {
945
+ if(this.id) { this.id = "copy_" + this.id; }
946
+ });
947
+ }
948
+ else { o = obj.o; }
949
+
950
+ if(obj.or.length) { obj.or.before(o); }
951
+ else {
952
+ if(!obj.np.children("ul").length) { $("<ul />").appendTo(obj.np); }
953
+ obj.np.children("ul:eq(0)").append(o);
954
+ }
955
+
956
+ try {
957
+ obj.ot.clean_node(obj.op);
958
+ obj.rt.clean_node(obj.np);
959
+ if(!obj.op.find("> ul > li").length) {
960
+ obj.op.removeClass("jstree-open jstree-closed").addClass("jstree-leaf").children("ul").remove();
961
+ }
962
+ } catch (e) { }
963
+
964
+ if(is_copy) {
965
+ prepared_move.cy = true;
966
+ prepared_move.oc = o;
967
+ }
968
+ this.__callback(prepared_move);
969
+ return prepared_move;
970
+ },
971
+ _get_move : function () { return prepared_move; }
972
+ }
973
+ });
974
+ })(jQuery);
975
+ //*/
976
+
977
+ /*
978
+ * jsTree ui plugin
979
+ * This plugins handles selecting/deselecting/hovering/dehovering nodes
980
+ */
981
+ (function ($) {
982
+ var scrollbar_width, e1, e2;
983
+ $(function() {
984
+ if (/msie/.test(navigator.userAgent.toLowerCase())) {
985
+ e1 = $('<textarea cols="10" rows="2"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');
986
+ e2 = $('<textarea cols="10" rows="2" style="overflow: hidden;"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');
987
+ scrollbar_width = e1.width() - e2.width();
988
+ e1.add(e2).remove();
989
+ }
990
+ else {
991
+ e1 = $('<div />').css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: 0 })
992
+ .prependTo('body').append('<div />').find('div').css({ width: '100%', height: 200 });
993
+ scrollbar_width = 100 - e1.width();
994
+ e1.parent().remove();
995
+ }
996
+ });
997
+ $.jstree.plugin("ui", {
998
+ __init : function () {
999
+ this.data.ui.selected = $();
1000
+ this.data.ui.last_selected = false;
1001
+ this.data.ui.hovered = null;
1002
+ this.data.ui.to_select = this.get_settings().ui.initially_select;
1003
+
1004
+ this.get_container()
1005
+ .delegate("a", "click.jstree", $.proxy(function (event) {
1006
+ event.preventDefault();
1007
+ event.currentTarget.blur();
1008
+ if(!$(event.currentTarget).hasClass("jstree-loading")) {
1009
+ this.select_node(event.currentTarget, true, event);
1010
+ }
1011
+ }, this))
1012
+ .delegate("a", "mouseenter.jstree", $.proxy(function (event) {
1013
+ if(!$(event.currentTarget).hasClass("jstree-loading")) {
1014
+ this.hover_node(event.target);
1015
+ }
1016
+ }, this))
1017
+ .delegate("a", "mouseleave.jstree", $.proxy(function (event) {
1018
+ if(!$(event.currentTarget).hasClass("jstree-loading")) {
1019
+ this.dehover_node(event.target);
1020
+ }
1021
+ }, this))
1022
+ .bind("reopen.jstree", $.proxy(function () {
1023
+ this.reselect();
1024
+ }, this))
1025
+ .bind("get_rollback.jstree", $.proxy(function () {
1026
+ this.dehover_node();
1027
+ this.save_selected();
1028
+ }, this))
1029
+ .bind("set_rollback.jstree", $.proxy(function () {
1030
+ this.reselect();
1031
+ }, this))
1032
+ .bind("close_node.jstree", $.proxy(function (event, data) {
1033
+ var s = this._get_settings().ui,
1034
+ obj = this._get_node(data.rslt.obj),
1035
+ clk = (obj && obj.length) ? obj.children("ul").find("a.jstree-clicked") : $(),
1036
+ _this = this;
1037
+ if(s.selected_parent_close === false || !clk.length) { return; }
1038
+ clk.each(function () {
1039
+ _this.deselect_node(this);
1040
+ if(s.selected_parent_close === "select_parent") { _this.select_node(obj); }
1041
+ });
1042
+ }, this))
1043
+ .bind("delete_node.jstree", $.proxy(function (event, data) {
1044
+ var s = this._get_settings().ui.select_prev_on_delete,
1045
+ obj = this._get_node(data.rslt.obj),
1046
+ clk = (obj && obj.length) ? obj.find("a.jstree-clicked") : [],
1047
+ _this = this;
1048
+ clk.each(function () { _this.deselect_node(this); });
1049
+ if(s && clk.length) {
1050
+ data.rslt.prev.each(function () {
1051
+ if(this.parentNode) { _this.select_node(this); return false; /* if return false is removed all prev nodes will be selected */}
1052
+ });
1053
+ }
1054
+ }, this))
1055
+ .bind("move_node.jstree", $.proxy(function (event, data) {
1056
+ if(data.rslt.cy) {
1057
+ data.rslt.oc.find("a.jstree-clicked").removeClass("jstree-clicked");
1058
+ }
1059
+ }, this));
1060
+ },
1061
+ defaults : {
1062
+ select_limit : -1, // 0, 1, 2 ... or -1 for unlimited
1063
+ select_multiple_modifier : "ctrl", // on, or ctrl, shift, alt
1064
+ select_range_modifier : "shift",
1065
+ selected_parent_close : "select_parent", // false, "deselect", "select_parent"
1066
+ selected_parent_open : true,
1067
+ select_prev_on_delete : true,
1068
+ disable_selecting_children : false,
1069
+ initially_select : []
1070
+ },
1071
+ _fn : {
1072
+ _get_node : function (obj, allow_multiple) {
1073
+ if(typeof obj === "undefined" || obj === null) { return allow_multiple ? this.data.ui.selected : this.data.ui.last_selected; }
1074
+ var $obj = $(obj, this.get_container());
1075
+ if($obj.is(".jstree") || obj == -1) { return -1; }
1076
+ $obj = $obj.closest("li", this.get_container());
1077
+ return $obj.length ? $obj : false;
1078
+ },
1079
+ _ui_notify : function (n, data) {
1080
+ if(data.selected) {
1081
+ this.select_node(n, false);
1082
+ }
1083
+ },
1084
+ save_selected : function () {
1085
+ var _this = this;
1086
+ this.data.ui.to_select = [];
1087
+ this.data.ui.selected.each(function () { if(this.id) { _this.data.ui.to_select.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); } });
1088
+ this.__callback(this.data.ui.to_select);
1089
+ },
1090
+ reselect : function () {
1091
+ var _this = this,
1092
+ s = this.data.ui.to_select;
1093
+ s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
1094
+ // this.deselect_all(); WHY deselect, breaks plugin state notifier?
1095
+ $.each(s, function (i, val) { if(val && val !== "#") { _this.select_node(val); } });
1096
+ this.data.ui.selected = this.data.ui.selected.filter(function () { return this.parentNode; });
1097
+ this.__callback();
1098
+ },
1099
+ refresh : function (obj) {
1100
+ this.save_selected();
1101
+ return this.__call_old();
1102
+ },
1103
+ hover_node : function (obj) {
1104
+ obj = this._get_node(obj);
1105
+ if(!obj.length) { return false; }
1106
+ //if(this.data.ui.hovered && obj.get(0) === this.data.ui.hovered.get(0)) { return; }
1107
+ if(!obj.hasClass("jstree-hovered")) { this.dehover_node(); }
1108
+ this.data.ui.hovered = obj.children("a").addClass("jstree-hovered").parent();
1109
+ this._fix_scroll(obj);
1110
+ this.__callback({ "obj" : obj });
1111
+ },
1112
+ dehover_node : function () {
1113
+ var obj = this.data.ui.hovered, p;
1114
+ if(!obj || !obj.length) { return false; }
1115
+ p = obj.children("a").removeClass("jstree-hovered").parent();
1116
+ if(this.data.ui.hovered[0] === p[0]) { this.data.ui.hovered = null; }
1117
+ this.__callback({ "obj" : obj });
1118
+ },
1119
+ select_node : function (obj, check, e) {
1120
+ obj = this._get_node(obj);
1121
+ if(obj == -1 || !obj || !obj.length) { return false; }
1122
+ var s = this._get_settings().ui,
1123
+ is_multiple = (s.select_multiple_modifier == "on" || (s.select_multiple_modifier !== false && e && e[s.select_multiple_modifier + "Key"])),
1124
+ is_range = (s.select_range_modifier !== false && e && e[s.select_range_modifier + "Key"] && this.data.ui.last_selected && this.data.ui.last_selected[0] !== obj[0] && this.data.ui.last_selected.parent()[0] === obj.parent()[0]),
1125
+ is_selected = this.is_selected(obj),
1126
+ proceed = true,
1127
+ t = this;
1128
+ if(check) {
1129
+ if(s.disable_selecting_children && is_multiple &&
1130
+ (
1131
+ (obj.parentsUntil(".jstree","li").children("a.jstree-clicked").length) ||
1132
+ (obj.children("ul").find("a.jstree-clicked:eq(0)").length)
1133
+ )
1134
+ ) {
1135
+ return false;
1136
+ }
1137
+ proceed = false;
1138
+ switch(!0) {
1139
+ case (is_range):
1140
+ this.data.ui.last_selected.addClass("jstree-last-selected");
1141
+ obj = obj[ obj.index() < this.data.ui.last_selected.index() ? "nextUntil" : "prevUntil" ](".jstree-last-selected").andSelf();
1142
+ if(s.select_limit == -1 || obj.length < s.select_limit) {
1143
+ this.data.ui.last_selected.removeClass("jstree-last-selected");
1144
+ this.data.ui.selected.each(function () {
1145
+ if(this !== t.data.ui.last_selected[0]) { t.deselect_node(this); }
1146
+ });
1147
+ is_selected = false;
1148
+ proceed = true;
1149
+ }
1150
+ else {
1151
+ proceed = false;
1152
+ }
1153
+ break;
1154
+ case (is_selected && !is_multiple):
1155
+ this.deselect_all();
1156
+ is_selected = false;
1157
+ proceed = true;
1158
+ break;
1159
+ case (!is_selected && !is_multiple):
1160
+ if(s.select_limit == -1 || s.select_limit > 0) {
1161
+ this.deselect_all();
1162
+ proceed = true;
1163
+ }
1164
+ break;
1165
+ case (is_selected && is_multiple):
1166
+ this.deselect_node(obj);
1167
+ break;
1168
+ case (!is_selected && is_multiple):
1169
+ if(s.select_limit == -1 || this.data.ui.selected.length + 1 <= s.select_limit) {
1170
+ proceed = true;
1171
+ }
1172
+ break;
1173
+ }
1174
+ }
1175
+ if(proceed && !is_selected) {
1176
+ if(!is_range) { this.data.ui.last_selected = obj; }
1177
+ obj.children("a").addClass("jstree-clicked");
1178
+ if(s.selected_parent_open) {
1179
+ obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });
1180
+ }
1181
+ this.data.ui.selected = this.data.ui.selected.add(obj);
1182
+ this._fix_scroll(obj.eq(0));
1183
+ this.__callback({ "obj" : obj, "e" : e });
1184
+ }
1185
+ },
1186
+ _fix_scroll : function (obj) {
1187
+ var c = this.get_container()[0], t;
1188
+ if(c.scrollHeight > c.offsetHeight) {
1189
+ obj = this._get_node(obj);
1190
+ if(!obj || obj === -1 || !obj.length || !obj.is(":visible")) { return; }
1191
+ t = obj.offset().top - this.get_container().offset().top;
1192
+ if(t < 0) {
1193
+ c.scrollTop = c.scrollTop + t - 1;
1194
+ }
1195
+ if(t + this.data.core.li_height + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0) > c.offsetHeight) {
1196
+ c.scrollTop = c.scrollTop + (t - c.offsetHeight + this.data.core.li_height + 1 + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0));
1197
+ }
1198
+ }
1199
+ },
1200
+ deselect_node : function (obj) {
1201
+ obj = this._get_node(obj);
1202
+ if(!obj.length) { return false; }
1203
+ if(this.is_selected(obj)) {
1204
+ obj.children("a").removeClass("jstree-clicked");
1205
+ this.data.ui.selected = this.data.ui.selected.not(obj);
1206
+ if(this.data.ui.last_selected.get(0) === obj.get(0)) { this.data.ui.last_selected = this.data.ui.selected.eq(0); }
1207
+ this.__callback({ "obj" : obj });
1208
+ }
1209
+ },
1210
+ toggle_select : function (obj) {
1211
+ obj = this._get_node(obj);
1212
+ if(!obj.length) { return false; }
1213
+ if(this.is_selected(obj)) { this.deselect_node(obj); }
1214
+ else { this.select_node(obj); }
1215
+ },
1216
+ is_selected : function (obj) { return this.data.ui.selected.index(this._get_node(obj)) >= 0; },
1217
+ get_selected : function (context) {
1218
+ return context ? $(context).find("a.jstree-clicked").parent() : this.data.ui.selected;
1219
+ },
1220
+ deselect_all : function (context) {
1221
+ var ret = context ? $(context).find("a.jstree-clicked").parent() : this.get_container().find("a.jstree-clicked").parent();
1222
+ ret.children("a.jstree-clicked").removeClass("jstree-clicked");
1223
+ this.data.ui.selected = $([]);
1224
+ this.data.ui.last_selected = false;
1225
+ this.__callback({ "obj" : ret });
1226
+ }
1227
+ }
1228
+ });
1229
+ // include the selection plugin by default
1230
+ $.jstree.defaults.plugins.push("ui");
1231
+ })(jQuery);
1232
+ //*/
1233
+
1234
+ /*
1235
+ * jsTree CRRM plugin
1236
+ * Handles creating/renaming/removing/moving nodes by user interaction.
1237
+ */
1238
+ (function ($) {
1239
+ $.jstree.plugin("crrm", {
1240
+ __init : function () {
1241
+ this.get_container()
1242
+ .bind("move_node.jstree", $.proxy(function (e, data) {
1243
+ if(this._get_settings().crrm.move.open_onmove) {
1244
+ var t = this;
1245
+ data.rslt.np.parentsUntil(".jstree").andSelf().filter(".jstree-closed").each(function () {
1246
+ t.open_node(this, false, true);
1247
+ });
1248
+ }
1249
+ }, this));
1250
+ },
1251
+ defaults : {
1252
+ input_width_limit : 200,
1253
+ move : {
1254
+ always_copy : false, // false, true or "multitree"
1255
+ open_onmove : true,
1256
+ default_position : "last",
1257
+ check_move : function (m) { return true; }
1258
+ }
1259
+ },
1260
+ _fn : {
1261
+ _show_input : function (obj, callback) {
1262
+ obj = this._get_node(obj);
1263
+ var rtl = this._get_settings().core.rtl,
1264
+ w = this._get_settings().crrm.input_width_limit,
1265
+ w1 = obj.children("ins").width(),
1266
+ w2 = obj.find("> a:visible > ins").width() * obj.find("> a:visible > ins").length,
1267
+ t = this.get_text(obj),
1268
+ h1 = $("<div />", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"),
1269
+ h2 = obj.css("position","relative").append(
1270
+ $("<input />", {
1271
+ "value" : t,
1272
+ "class" : "jstree-rename-input",
1273
+ // "size" : t.length,
1274
+ "css" : {
1275
+ "padding" : "0",
1276
+ "border" : "1px solid silver",
1277
+ "position" : "absolute",
1278
+ "left" : (rtl ? "auto" : (w1 + w2 + 4) + "px"),
1279
+ "right" : (rtl ? (w1 + w2 + 4) + "px" : "auto"),
1280
+ "top" : "0px",
1281
+ "height" : (this.data.core.li_height - 2) + "px",
1282
+ "lineHeight" : (this.data.core.li_height - 2) + "px",
1283
+ "width" : "150px" // will be set a bit further down
1284
+ },
1285
+ "blur" : $.proxy(function () {
1286
+ var i = obj.children(".jstree-rename-input"),
1287
+ v = i.val();
1288
+ if(v === "") { v = t; }
1289
+ h1.remove();
1290
+ i.remove(); // rollback purposes
1291
+ this.set_text(obj,t); // rollback purposes
1292
+ this.rename_node(obj, v);
1293
+ callback.call(this, obj, v, t);
1294
+ obj.css("position","");
1295
+ }, this),
1296
+ "keyup" : function (event) {
1297
+ var key = event.keyCode || event.which;
1298
+ if(key == 27) { this.value = t; this.blur(); return; }
1299
+ else if(key == 13) { this.blur(); return; }
1300
+ else {
1301
+ h2.width(Math.min(h1.text("pW" + this.value).width(),w));
1302
+ }
1303
+ },
1304
+ "keypress" : function(event) {
1305
+ var key = event.keyCode || event.which;
1306
+ if(key == 13) { return false; }
1307
+ }
1308
+ })
1309
+ ).children(".jstree-rename-input");
1310
+ this.set_text(obj, "");
1311
+ h1.css({
1312
+ fontFamily : h2.css('fontFamily') || '',
1313
+ fontSize : h2.css('fontSize') || '',
1314
+ fontWeight : h2.css('fontWeight') || '',
1315
+ fontStyle : h2.css('fontStyle') || '',
1316
+ fontStretch : h2.css('fontStretch') || '',
1317
+ fontVariant : h2.css('fontVariant') || '',
1318
+ letterSpacing : h2.css('letterSpacing') || '',
1319
+ wordSpacing : h2.css('wordSpacing') || ''
1320
+ });
1321
+ h2.width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();
1322
+ },
1323
+ rename : function (obj) {
1324
+ obj = this._get_node(obj);
1325
+ this.__rollback();
1326
+ var f = this.__callback;
1327
+ this._show_input(obj, function (obj, new_name, old_name) {
1328
+ f.call(this, { "obj" : obj, "new_name" : new_name, "old_name" : old_name });
1329
+ });
1330
+ },
1331
+ create : function (obj, position, js, callback, skip_rename) {
1332
+ var t, _this = this;
1333
+ obj = this._get_node(obj);
1334
+ if(!obj) { obj = -1; }
1335
+ this.__rollback();
1336
+ t = this.create_node(obj, position, js, function (t) {
1337
+ var p = this._get_parent(t),
1338
+ pos = $(t).index();
1339
+ if(callback) { callback.call(this, t); }
1340
+ if(p.length && p.hasClass("jstree-closed")) { this.open_node(p, false, true); }
1341
+ if(!skip_rename) {
1342
+ this._show_input(t, function (obj, new_name, old_name) {
1343
+ _this.__callback({ "obj" : obj, "name" : new_name, "parent" : p, "position" : pos });
1344
+ });
1345
+ }
1346
+ else { _this.__callback({ "obj" : t, "name" : this.get_text(t), "parent" : p, "position" : pos }); }
1347
+ });
1348
+ return t;
1349
+ },
1350
+ remove : function (obj) {
1351
+ obj = this._get_node(obj, true);
1352
+ var p = this._get_parent(obj), prev = this._get_prev(obj);
1353
+ this.__rollback();
1354
+ obj = this.delete_node(obj);
1355
+ if(obj !== false) { this.__callback({ "obj" : obj, "prev" : prev, "parent" : p }); }
1356
+ },
1357
+ check_move : function () {
1358
+ if(!this.__call_old()) { return false; }
1359
+ var s = this._get_settings().crrm.move;
1360
+ if(!s.check_move.call(this, this._get_move())) { return false; }
1361
+ return true;
1362
+ },
1363
+ move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
1364
+ var s = this._get_settings().crrm.move;
1365
+ if(!is_prepared) {
1366
+ if(typeof position === "undefined") { position = s.default_position; }
1367
+ if(position === "inside" && !s.default_position.match(/^(before|after)$/)) { position = s.default_position; }
1368
+ return this.__call_old(true, obj, ref, position, is_copy, false, skip_check);
1369
+ }
1370
+ // if the move is already prepared
1371
+ if(s.always_copy === true || (s.always_copy === "multitree" && obj.rt.get_index() !== obj.ot.get_index() )) {
1372
+ is_copy = true;
1373
+ }
1374
+ this.__call_old(true, obj, ref, position, is_copy, true, skip_check);
1375
+ },
1376
+
1377
+ cut : function (obj) {
1378
+ obj = this._get_node(obj, true);
1379
+ if(!obj || !obj.length) { return false; }
1380
+ this.data.crrm.cp_nodes = false;
1381
+ this.data.crrm.ct_nodes = obj;
1382
+ this.__callback({ "obj" : obj });
1383
+ },
1384
+ copy : function (obj) {
1385
+ obj = this._get_node(obj, true);
1386
+ if(!obj || !obj.length) { return false; }
1387
+ this.data.crrm.ct_nodes = false;
1388
+ this.data.crrm.cp_nodes = obj;
1389
+ this.__callback({ "obj" : obj });
1390
+ },
1391
+ paste : function (obj) {
1392
+ obj = this._get_node(obj);
1393
+ if(!obj || !obj.length) { return false; }
1394
+ var nodes = this.data.crrm.ct_nodes ? this.data.crrm.ct_nodes : this.data.crrm.cp_nodes;
1395
+ if(!this.data.crrm.ct_nodes && !this.data.crrm.cp_nodes) { return false; }
1396
+ if(this.data.crrm.ct_nodes) { this.move_node(this.data.crrm.ct_nodes, obj); this.data.crrm.ct_nodes = false; }
1397
+ if(this.data.crrm.cp_nodes) { this.move_node(this.data.crrm.cp_nodes, obj, false, true); }
1398
+ this.__callback({ "obj" : obj, "nodes" : nodes });
1399
+ }
1400
+ }
1401
+ });
1402
+ // include the crr plugin by default
1403
+ // $.jstree.defaults.plugins.push("crrm");
1404
+ })(jQuery);
1405
+ //*/
1406
+
1407
+ /*
1408
+ * jsTree themes plugin
1409
+ * Handles loading and setting themes, as well as detecting path to themes, etc.
1410
+ */
1411
+ (function ($) {
1412
+ var themes_loaded = [];
1413
+ // this variable stores the path to the themes folder - if left as false - it will be autodetected
1414
+ $.jstree._themes = false;
1415
+ $.jstree.plugin("themes", {
1416
+ __init : function () {
1417
+ this.get_container()
1418
+ .bind("init.jstree", $.proxy(function () {
1419
+ var s = this._get_settings().themes;
1420
+ this.data.themes.dots = s.dots;
1421
+ this.data.themes.icons = s.icons;
1422
+ this.set_theme(s.theme, s.url);
1423
+ }, this))
1424
+ .bind("loaded.jstree", $.proxy(function () {
1425
+ // bound here too, as simple HTML tree's won't honor dots & icons otherwise
1426
+ if(!this.data.themes.dots) { this.hide_dots(); }
1427
+ else { this.show_dots(); }
1428
+ if(!this.data.themes.icons) { this.hide_icons(); }
1429
+ else { this.show_icons(); }
1430
+ }, this));
1431
+ },
1432
+ defaults : {
1433
+ theme : "default",
1434
+ url : false,
1435
+ dots : true,
1436
+ icons : true
1437
+ },
1438
+ _fn : {
1439
+ set_theme : function (theme_name, theme_url) {
1440
+ if(!theme_name) { return false; }
1441
+ if(!theme_url) { theme_url = $.jstree._themes + theme_name + '/style.css'; }
1442
+ if($.inArray(theme_url, themes_loaded) == -1) {
1443
+ $.vakata.css.add_sheet({ "url" : theme_url });
1444
+ themes_loaded.push(theme_url);
1445
+ }
1446
+ if(this.data.themes.theme != theme_name) {
1447
+ this.get_container().removeClass('jstree-' + this.data.themes.theme);
1448
+ this.data.themes.theme = theme_name;
1449
+ }
1450
+ this.get_container().addClass('jstree-' + theme_name);
1451
+ if(!this.data.themes.dots) { this.hide_dots(); }
1452
+ else { this.show_dots(); }
1453
+ if(!this.data.themes.icons) { this.hide_icons(); }
1454
+ else { this.show_icons(); }
1455
+ this.__callback();
1456
+ },
1457
+ get_theme : function () { return this.data.themes.theme; },
1458
+
1459
+ show_dots : function () { this.data.themes.dots = true; this.get_container().children("ul").removeClass("jstree-no-dots"); },
1460
+ hide_dots : function () { this.data.themes.dots = false; this.get_container().children("ul").addClass("jstree-no-dots"); },
1461
+ toggle_dots : function () { if(this.data.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },
1462
+
1463
+ show_icons : function () { this.data.themes.icons = true; this.get_container().children("ul").removeClass("jstree-no-icons"); },
1464
+ hide_icons : function () { this.data.themes.icons = false; this.get_container().children("ul").addClass("jstree-no-icons"); },
1465
+ toggle_icons: function () { if(this.data.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }
1466
+ }
1467
+ });
1468
+ // autodetect themes path
1469
+ $(function () {
1470
+ if($.jstree._themes === false) {
1471
+ $("script").each(function () {
1472
+ if(this.src.toString().match(/jquery\.jstree[^\/]*?\.js(\?.*)?$/)) {
1473
+ $.jstree._themes = this.src.toString().replace(/jquery\.jstree[^\/]*?\.js(\?.*)?$/, "") + 'themes/';
1474
+ return false;
1475
+ }
1476
+ });
1477
+ }
1478
+ if($.jstree._themes === false) { $.jstree._themes = "themes/"; }
1479
+ });
1480
+ // include the themes plugin by default
1481
+ $.jstree.defaults.plugins.push("themes");
1482
+ })(jQuery);
1483
+ //*/
1484
+
1485
+ /*
1486
+ * jsTree hotkeys plugin
1487
+ * Enables keyboard navigation for all tree instances
1488
+ * Depends on the jstree ui & jquery hotkeys plugins
1489
+ */
1490
+ (function ($) {
1491
+ var bound = [];
1492
+ function exec(i, event) {
1493
+ var f = $.jstree._focused(), tmp;
1494
+ if(f && f.data && f.data.hotkeys && f.data.hotkeys.enabled) {
1495
+ tmp = f._get_settings().hotkeys[i];
1496
+ if(tmp) { return tmp.call(f, event); }
1497
+ }
1498
+ }
1499
+ $.jstree.plugin("hotkeys", {
1500
+ __init : function () {
1501
+ if(typeof $.hotkeys === "undefined") { throw "jsTree hotkeys: jQuery hotkeys plugin not included."; }
1502
+ if(!this.data.ui) { throw "jsTree hotkeys: jsTree UI plugin not included."; }
1503
+ $.each(this._get_settings().hotkeys, function (i, v) {
1504
+ if(v !== false && $.inArray(i, bound) == -1) {
1505
+ $(document).bind("keydown", i, function (event) { return exec(i, event); });
1506
+ bound.push(i);
1507
+ }
1508
+ });
1509
+ this.get_container()
1510
+ .bind("lock.jstree", $.proxy(function () {
1511
+ if(this.data.hotkeys.enabled) { this.data.hotkeys.enabled = false; this.data.hotkeys.revert = true; }
1512
+ }, this))
1513
+ .bind("unlock.jstree", $.proxy(function () {
1514
+ if(this.data.hotkeys.revert) { this.data.hotkeys.enabled = true; }
1515
+ }, this));
1516
+ this.enable_hotkeys();
1517
+ },
1518
+ defaults : {
1519
+ "up" : function () {
1520
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
1521
+ this.hover_node(this._get_prev(o));
1522
+ return false;
1523
+ },
1524
+ "ctrl+up" : function () {
1525
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
1526
+ this.hover_node(this._get_prev(o));
1527
+ return false;
1528
+ },
1529
+ "shift+up" : function () {
1530
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
1531
+ this.hover_node(this._get_prev(o));
1532
+ return false;
1533
+ },
1534
+ "down" : function () {
1535
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
1536
+ this.hover_node(this._get_next(o));
1537
+ return false;
1538
+ },
1539
+ "ctrl+down" : function () {
1540
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
1541
+ this.hover_node(this._get_next(o));
1542
+ return false;
1543
+ },
1544
+ "shift+down" : function () {
1545
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
1546
+ this.hover_node(this._get_next(o));
1547
+ return false;
1548
+ },
1549
+ "left" : function () {
1550
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
1551
+ if(o) {
1552
+ if(o.hasClass("jstree-open")) { this.close_node(o); }
1553
+ else { this.hover_node(this._get_prev(o)); }
1554
+ }
1555
+ return false;
1556
+ },
1557
+ "ctrl+left" : function () {
1558
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
1559
+ if(o) {
1560
+ if(o.hasClass("jstree-open")) { this.close_node(o); }
1561
+ else { this.hover_node(this._get_prev(o)); }
1562
+ }
1563
+ return false;
1564
+ },
1565
+ "shift+left" : function () {
1566
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
1567
+ if(o) {
1568
+ if(o.hasClass("jstree-open")) { this.close_node(o); }
1569
+ else { this.hover_node(this._get_prev(o)); }
1570
+ }
1571
+ return false;
1572
+ },
1573
+ "right" : function () {
1574
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
1575
+ if(o && o.length) {
1576
+ if(o.hasClass("jstree-closed")) { this.open_node(o); }
1577
+ else { this.hover_node(this._get_next(o)); }
1578
+ }
1579
+ return false;
1580
+ },
1581
+ "ctrl+right" : function () {
1582
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
1583
+ if(o && o.length) {
1584
+ if(o.hasClass("jstree-closed")) { this.open_node(o); }
1585
+ else { this.hover_node(this._get_next(o)); }
1586
+ }
1587
+ return false;
1588
+ },
1589
+ "shift+right" : function () {
1590
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
1591
+ if(o && o.length) {
1592
+ if(o.hasClass("jstree-closed")) { this.open_node(o); }
1593
+ else { this.hover_node(this._get_next(o)); }
1594
+ }
1595
+ return false;
1596
+ },
1597
+ "space" : function () {
1598
+ if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").click(); }
1599
+ return false;
1600
+ },
1601
+ "ctrl+space" : function (event) {
1602
+ event.type = "click";
1603
+ if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); }
1604
+ return false;
1605
+ },
1606
+ "shift+space" : function (event) {
1607
+ event.type = "click";
1608
+ if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); }
1609
+ return false;
1610
+ },
1611
+ "f2" : function () { this.rename(this.data.ui.hovered || this.data.ui.last_selected); },
1612
+ "del" : function () { this.remove(this.data.ui.hovered || this._get_node(null)); }
1613
+ },
1614
+ _fn : {
1615
+ enable_hotkeys : function () {
1616
+ this.data.hotkeys.enabled = true;
1617
+ },
1618
+ disable_hotkeys : function () {
1619
+ this.data.hotkeys.enabled = false;
1620
+ }
1621
+ }
1622
+ });
1623
+ })(jQuery);
1624
+ //*/
1625
+
1626
+ /*
1627
+ * jsTree JSON plugin
1628
+ * The JSON data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
1629
+ */
1630
+ (function ($) {
1631
+ $.jstree.plugin("json_data", {
1632
+ __init : function() {
1633
+ var s = this._get_settings().json_data;
1634
+ if(s.progressive_unload) {
1635
+ this.get_container().bind("after_close.jstree", function (e, data) {
1636
+ data.rslt.obj.children("ul").remove();
1637
+ });
1638
+ }
1639
+ },
1640
+ defaults : {
1641
+ // `data` can be a function:
1642
+ // * accepts two arguments - node being loaded and a callback to pass the result to
1643
+ // * will be executed in the current tree's scope & ajax won't be supported
1644
+ data : false,
1645
+ ajax : false,
1646
+ correct_state : true,
1647
+ progressive_render : false,
1648
+ progressive_unload : false
1649
+ },
1650
+ _fn : {
1651
+ load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_json(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
1652
+ _is_loaded : function (obj) {
1653
+ var s = this._get_settings().json_data;
1654
+ obj = this._get_node(obj);
1655
+ return obj == -1 || !obj || (!s.ajax && !s.progressive_render && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").length > 0;
1656
+ },
1657
+ refresh : function (obj) {
1658
+ obj = this._get_node(obj);
1659
+ var s = this._get_settings().json_data;
1660
+ if(obj && obj !== -1 && s.progressive_unload && ($.isFunction(s.data) || !!s.ajax)) {
1661
+ obj.removeData("jstree-children");
1662
+ }
1663
+ return this.__call_old();
1664
+ },
1665
+ load_node_json : function (obj, s_call, e_call) {
1666
+ var s = this.get_settings().json_data, d,
1667
+ error_func = function () {},
1668
+ success_func = function () {};
1669
+ obj = this._get_node(obj);
1670
+
1671
+ if(obj && obj !== -1 && (s.progressive_render || s.progressive_unload) && !obj.is(".jstree-open, .jstree-leaf") && obj.children("ul").children("li").length === 0 && obj.data("jstree-children")) {
1672
+ d = this._parse_json(obj.data("jstree-children"), obj);
1673
+ if(d) {
1674
+ obj.append(d);
1675
+ if(!s.progressive_unload) { obj.removeData("jstree-children"); }
1676
+ }
1677
+ this.clean_node(obj);
1678
+ if(s_call) { s_call.call(this); }
1679
+ return;
1680
+ }
1681
+
1682
+ if(obj && obj !== -1) {
1683
+ if(obj.data("jstree-is-loading")) { return; }
1684
+ else { obj.data("jstree-is-loading",true); }
1685
+ }
1686
+ switch(!0) {
1687
+ case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
1688
+ // function option added here for easier model integration (also supporting async - see callback)
1689
+ case ($.isFunction(s.data)):
1690
+ s.data.call(this, obj, $.proxy(function (d) {
1691
+ d = this._parse_json(d, obj);
1692
+ if(!d) {
1693
+ if(obj === -1 || !obj) {
1694
+ if(s.correct_state) { this.get_container().children("ul").empty(); }
1695
+ }
1696
+ else {
1697
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
1698
+ obj.removeData("jstree-is-loading");
1699
+ if(s.correct_state) { this.correct_state(obj); }
1700
+ }
1701
+ if(e_call) { e_call.call(this); }
1702
+ }
1703
+ else {
1704
+ if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
1705
+ else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree-is-loading"); }
1706
+ this.clean_node(obj);
1707
+ if(s_call) { s_call.call(this); }
1708
+ }
1709
+ }, this));
1710
+ break;
1711
+ case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
1712
+ if(!obj || obj == -1) {
1713
+ d = this._parse_json(s.data, obj);
1714
+ if(d) {
1715
+ this.get_container().children("ul").empty().append(d.children());
1716
+ this.clean_node();
1717
+ }
1718
+ else {
1719
+ if(s.correct_state) { this.get_container().children("ul").empty(); }
1720
+ }
1721
+ }
1722
+ if(s_call) { s_call.call(this); }
1723
+ break;
1724
+ case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
1725
+ error_func = function (x, t, e) {
1726
+ var ef = this.get_settings().json_data.ajax.error;
1727
+ if(ef) { ef.call(this, x, t, e); }
1728
+ if(obj != -1 && obj.length) {
1729
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
1730
+ obj.removeData("jstree-is-loading");
1731
+ if(t === "success" && s.correct_state) { this.correct_state(obj); }
1732
+ }
1733
+ else {
1734
+ if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
1735
+ }
1736
+ if(e_call) { e_call.call(this); }
1737
+ };
1738
+ success_func = function (d, t, x) {
1739
+ var sf = this.get_settings().json_data.ajax.success;
1740
+ if(sf) { d = sf.call(this,d,t,x) || d; }
1741
+ if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "") || (!$.isArray(d) && !$.isPlainObject(d))) {
1742
+ return error_func.call(this, x, t, "");
1743
+ }
1744
+ d = this._parse_json(d, obj);
1745
+ if(d) {
1746
+ if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
1747
+ else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree-is-loading"); }
1748
+ this.clean_node(obj);
1749
+ if(s_call) { s_call.call(this); }
1750
+ }
1751
+ else {
1752
+ if(obj === -1 || !obj) {
1753
+ if(s.correct_state) {
1754
+ this.get_container().children("ul").empty();
1755
+ if(s_call) { s_call.call(this); }
1756
+ }
1757
+ }
1758
+ else {
1759
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
1760
+ obj.removeData("jstree-is-loading");
1761
+ if(s.correct_state) {
1762
+ this.correct_state(obj);
1763
+ if(s_call) { s_call.call(this); }
1764
+ }
1765
+ }
1766
+ }
1767
+ };
1768
+ s.ajax.context = this;
1769
+ s.ajax.error = error_func;
1770
+ s.ajax.success = success_func;
1771
+ if(!s.ajax.dataType) { s.ajax.dataType = "json"; }
1772
+ if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
1773
+ if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
1774
+ $.ajax(s.ajax);
1775
+ break;
1776
+ }
1777
+ },
1778
+ _parse_json : function (js, obj, is_callback) {
1779
+ var d = false,
1780
+ p = this._get_settings(),
1781
+ s = p.json_data,
1782
+ t = p.core.html_titles,
1783
+ tmp, i, j, ul1, ul2;
1784
+
1785
+ if(!js) { return d; }
1786
+ if(s.progressive_unload && obj && obj !== -1) {
1787
+ obj.data("jstree-children", d);
1788
+ }
1789
+ if($.isArray(js)) {
1790
+ d = $();
1791
+ if(!js.length) { return false; }
1792
+ for(i = 0, j = js.length; i < j; i++) {
1793
+ tmp = this._parse_json(js[i], obj, true);
1794
+ if(tmp.length) { d = d.add(tmp); }
1795
+ }
1796
+ }
1797
+ else {
1798
+ if(typeof js == "string") { js = { data : js }; }
1799
+ if(!js.data && js.data !== "") { return d; }
1800
+ d = $("<li />");
1801
+ if(js.attr) { d.attr(js.attr); }
1802
+ if(js.metadata) { d.data(js.metadata); }
1803
+ if(js.state) { d.addClass("jstree-" + js.state); }
1804
+ if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
1805
+ $.each(js.data, function (i, m) {
1806
+ tmp = $("<a />");
1807
+ if($.isFunction(m)) { m = m.call(this, js); }
1808
+ if(typeof m == "string") { tmp.attr('href','#')[ t ? "html" : "text" ](m); }
1809
+ else {
1810
+ if(!m.attr) { m.attr = {}; }
1811
+ if(!m.attr.href) { m.attr.href = '#'; }
1812
+ tmp.attr(m.attr)[ t ? "html" : "text" ](m.title);
1813
+ if(m.language) { tmp.addClass(m.language); }
1814
+ }
1815
+ tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");
1816
+ if(!m.icon && js.icon) { m.icon = js.icon; }
1817
+ if(m.icon) {
1818
+ if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
1819
+ else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
1820
+ }
1821
+ d.append(tmp);
1822
+ });
1823
+ d.prepend("<ins class='jstree-icon'>&#160;</ins>");
1824
+ if(js.children) {
1825
+ if(s.progressive_render && js.state !== "open") {
1826
+ d.addClass("jstree-closed").data("jstree-children", js.children);
1827
+ }
1828
+ else {
1829
+ if(s.progressive_unload) { d.data("jstree-children", js.children); }
1830
+ if($.isArray(js.children) && js.children.length) {
1831
+ tmp = this._parse_json(js.children, obj, true);
1832
+ if(tmp.length) {
1833
+ ul2 = $("<ul />");
1834
+ ul2.append(tmp);
1835
+ d.append(ul2);
1836
+ }
1837
+ }
1838
+ }
1839
+ }
1840
+ }
1841
+ if(!is_callback) {
1842
+ ul1 = $("<ul />");
1843
+ ul1.append(d);
1844
+ d = ul1;
1845
+ }
1846
+ return d;
1847
+ },
1848
+ get_json : function (obj, li_attr, a_attr, is_callback) {
1849
+ var result = [],
1850
+ s = this._get_settings(),
1851
+ _this = this,
1852
+ tmp1, tmp2, li, a, t, lang;
1853
+ obj = this._get_node(obj);
1854
+ if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
1855
+ li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
1856
+ if(!is_callback && this.data.types) { li_attr.push(s.types.type_attr); }
1857
+ a_attr = $.isArray(a_attr) ? a_attr : [ ];
1858
+
1859
+ obj.each(function () {
1860
+ li = $(this);
1861
+ tmp1 = { data : [] };
1862
+ if(li_attr.length) { tmp1.attr = { }; }
1863
+ $.each(li_attr, function (i, v) {
1864
+ tmp2 = li.attr(v);
1865
+ if(tmp2 && tmp2.length && tmp2.replace(/jstree[^ ]*/ig,'').length) {
1866
+ tmp1.attr[v] = (" " + tmp2).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
1867
+ }
1868
+ });
1869
+ if(li.hasClass("jstree-open")) { tmp1.state = "open"; }
1870
+ if(li.hasClass("jstree-closed")) { tmp1.state = "closed"; }
1871
+ if(li.data()) { tmp1.metadata = li.data(); }
1872
+ a = li.children("a");
1873
+ a.each(function () {
1874
+ t = $(this);
1875
+ if(
1876
+ a_attr.length ||
1877
+ $.inArray("languages", s.plugins) !== -1 ||
1878
+ t.children("ins").get(0).style.backgroundImage.length ||
1879
+ (t.children("ins").get(0).className && t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').length)
1880
+ ) {
1881
+ lang = false;
1882
+ if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {
1883
+ $.each(s.languages, function (l, lv) {
1884
+ if(t.hasClass(lv)) {
1885
+ lang = lv;
1886
+ return false;
1887
+ }
1888
+ });
1889
+ }
1890
+ tmp2 = { attr : { }, title : _this.get_text(t, lang) };
1891
+ $.each(a_attr, function (k, z) {
1892
+ tmp2.attr[z] = (" " + (t.attr(z) || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
1893
+ });
1894
+ if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {
1895
+ $.each(s.languages, function (k, z) {
1896
+ if(t.hasClass(z)) { tmp2.language = z; return true; }
1897
+ });
1898
+ }
1899
+ if(t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
1900
+ tmp2.icon = t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
1901
+ }
1902
+ if(t.children("ins").get(0).style.backgroundImage.length) {
1903
+ tmp2.icon = t.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","");
1904
+ }
1905
+ }
1906
+ else {
1907
+ tmp2 = _this.get_text(t);
1908
+ }
1909
+ if(a.length > 1) { tmp1.data.push(tmp2); }
1910
+ else { tmp1.data = tmp2; }
1911
+ });
1912
+ li = li.find("> ul > li");
1913
+ if(li.length) { tmp1.children = _this.get_json(li, li_attr, a_attr, true); }
1914
+ result.push(tmp1);
1915
+ });
1916
+ return result;
1917
+ }
1918
+ }
1919
+ });
1920
+ })(jQuery);
1921
+ //*/
1922
+
1923
+ /*
1924
+ * jsTree languages plugin
1925
+ * Adds support for multiple language versions in one tree
1926
+ * This basically allows for many titles coexisting in one node, but only one of them being visible at any given time
1927
+ * This is useful for maintaining the same structure in many languages (hence the name of the plugin)
1928
+ */
1929
+ (function ($) {
1930
+ $.jstree.plugin("languages", {
1931
+ __init : function () { this._load_css(); },
1932
+ defaults : [],
1933
+ _fn : {
1934
+ set_lang : function (i) {
1935
+ var langs = this._get_settings().languages,
1936
+ st = false,
1937
+ selector = ".jstree-" + this.get_index() + ' a';
1938
+ if(!$.isArray(langs) || langs.length === 0) { return false; }
1939
+ if($.inArray(i,langs) == -1) {
1940
+ if(!!langs[i]) { i = langs[i]; }
1941
+ else { return false; }
1942
+ }
1943
+ if(i == this.data.languages.current_language) { return true; }
1944
+ st = $.vakata.css.get_css(selector + "." + this.data.languages.current_language, false, this.data.languages.language_css);
1945
+ if(st !== false) { st.style.display = "none"; }
1946
+ st = $.vakata.css.get_css(selector + "." + i, false, this.data.languages.language_css);
1947
+ if(st !== false) { st.style.display = ""; }
1948
+ this.data.languages.current_language = i;
1949
+ this.__callback(i);
1950
+ return true;
1951
+ },
1952
+ get_lang : function () {
1953
+ return this.data.languages.current_language;
1954
+ },
1955
+ _get_string : function (key, lang) {
1956
+ var langs = this._get_settings().languages,
1957
+ s = this._get_settings().core.strings;
1958
+ if($.isArray(langs) && langs.length) {
1959
+ lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
1960
+ }
1961
+ if(s[lang] && s[lang][key]) { return s[lang][key]; }
1962
+ if(s[key]) { return s[key]; }
1963
+ return key;
1964
+ },
1965
+ get_text : function (obj, lang) {
1966
+ obj = this._get_node(obj) || this.data.ui.last_selected;
1967
+ if(!obj.size()) { return false; }
1968
+ var langs = this._get_settings().languages,
1969
+ s = this._get_settings().core.html_titles;
1970
+ if($.isArray(langs) && langs.length) {
1971
+ lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
1972
+ obj = obj.children("a." + lang);
1973
+ }
1974
+ else { obj = obj.children("a:eq(0)"); }
1975
+ if(s) {
1976
+ obj = obj.clone();
1977
+ obj.children("INS").remove();
1978
+ return obj.html();
1979
+ }
1980
+ else {
1981
+ obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
1982
+ return obj.nodeValue;
1983
+ }
1984
+ },
1985
+ set_text : function (obj, val, lang) {
1986
+ obj = this._get_node(obj) || this.data.ui.last_selected;
1987
+ if(!obj.size()) { return false; }
1988
+ var langs = this._get_settings().languages,
1989
+ s = this._get_settings().core.html_titles,
1990
+ tmp;
1991
+ if($.isArray(langs) && langs.length) {
1992
+ lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
1993
+ obj = obj.children("a." + lang);
1994
+ }
1995
+ else { obj = obj.children("a:eq(0)"); }
1996
+ if(s) {
1997
+ tmp = obj.children("INS").clone();
1998
+ obj.html(val).prepend(tmp);
1999
+ this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
2000
+ return true;
2001
+ }
2002
+ else {
2003
+ obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
2004
+ this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
2005
+ return (obj.nodeValue = val);
2006
+ }
2007
+ },
2008
+ _load_css : function () {
2009
+ var langs = this._get_settings().languages,
2010
+ str = "/* languages css */",
2011
+ selector = ".jstree-" + this.get_index() + ' a',
2012
+ ln;
2013
+ if($.isArray(langs) && langs.length) {
2014
+ this.data.languages.current_language = langs[0];
2015
+ for(ln = 0; ln < langs.length; ln++) {
2016
+ str += selector + "." + langs[ln] + " {";
2017
+ if(langs[ln] != this.data.languages.current_language) { str += " display:none; "; }
2018
+ str += " } ";
2019
+ }
2020
+ this.data.languages.language_css = $.vakata.css.add_sheet({ 'str' : str, 'title' : "jstree-languages" });
2021
+ }
2022
+ },
2023
+ create_node : function (obj, position, js, callback) {
2024
+ var t = this.__call_old(true, obj, position, js, function (t) {
2025
+ var langs = this._get_settings().languages,
2026
+ a = t.children("a"),
2027
+ ln;
2028
+ if($.isArray(langs) && langs.length) {
2029
+ for(ln = 0; ln < langs.length; ln++) {
2030
+ if(!a.is("." + langs[ln])) {
2031
+ t.append(a.eq(0).clone().removeClass(langs.join(" ")).addClass(langs[ln]));
2032
+ }
2033
+ }
2034
+ a.not("." + langs.join(", .")).remove();
2035
+ }
2036
+ if(callback) { callback.call(this, t); }
2037
+ });
2038
+ return t;
2039
+ }
2040
+ }
2041
+ });
2042
+ })(jQuery);
2043
+ //*/
2044
+
2045
+ /*
2046
+ * jsTree cookies plugin
2047
+ * Stores the currently opened/selected nodes in a cookie and then restores them
2048
+ * Depends on the jquery.cookie plugin
2049
+ */
2050
+ (function ($) {
2051
+ $.jstree.plugin("cookies", {
2052
+ __init : function () {
2053
+ if(typeof $.cookie === "undefined") { throw "jsTree cookie: jQuery cookie plugin not included."; }
2054
+
2055
+ var s = this._get_settings().cookies,
2056
+ tmp;
2057
+ if(!!s.save_loaded) {
2058
+ tmp = $.cookie(s.save_loaded);
2059
+ if(tmp && tmp.length) { this.data.core.to_load = tmp.split(","); }
2060
+ }
2061
+ if(!!s.save_opened) {
2062
+ tmp = $.cookie(s.save_opened);
2063
+ if(tmp && tmp.length) { this.data.core.to_open = tmp.split(","); }
2064
+ }
2065
+ if(!!s.save_selected) {
2066
+ tmp = $.cookie(s.save_selected);
2067
+ if(tmp && tmp.length && this.data.ui) { this.data.ui.to_select = tmp.split(","); }
2068
+ }
2069
+ this.get_container()
2070
+ .one( ( this.data.ui ? "reselect" : "reopen" ) + ".jstree", $.proxy(function () {
2071
+ this.get_container()
2072
+ .bind("open_node.jstree close_node.jstree select_node.jstree deselect_node.jstree", $.proxy(function (e) {
2073
+ if(this._get_settings().cookies.auto_save) { this.save_cookie((e.handleObj.namespace + e.handleObj.type).replace("jstree","")); }
2074
+ }, this));
2075
+ }, this));
2076
+ },
2077
+ defaults : {
2078
+ save_loaded : "jstree_load",
2079
+ save_opened : "jstree_open",
2080
+ save_selected : "jstree_select",
2081
+ auto_save : true,
2082
+ cookie_options : {}
2083
+ },
2084
+ _fn : {
2085
+ save_cookie : function (c) {
2086
+ if(this.data.core.refreshing) { return; }
2087
+ var s = this._get_settings().cookies;
2088
+ if(!c) { // if called manually and not by event
2089
+ if(s.save_loaded) {
2090
+ this.save_loaded();
2091
+ $.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options);
2092
+ }
2093
+ if(s.save_opened) {
2094
+ this.save_opened();
2095
+ $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);
2096
+ }
2097
+ if(s.save_selected && this.data.ui) {
2098
+ this.save_selected();
2099
+ $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);
2100
+ }
2101
+ return;
2102
+ }
2103
+ switch(c) {
2104
+ case "open_node":
2105
+ case "close_node":
2106
+ if(!!s.save_opened) {
2107
+ this.save_opened();
2108
+ $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);
2109
+ }
2110
+ if(!!s.save_loaded) {
2111
+ this.save_loaded();
2112
+ $.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options);
2113
+ }
2114
+ break;
2115
+ case "select_node":
2116
+ case "deselect_node":
2117
+ if(!!s.save_selected && this.data.ui) {
2118
+ this.save_selected();
2119
+ $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);
2120
+ }
2121
+ break;
2122
+ }
2123
+ }
2124
+ }
2125
+ });
2126
+ // include cookies by default
2127
+ // $.jstree.defaults.plugins.push("cookies");
2128
+ })(jQuery);
2129
+ //*/
2130
+
2131
+ /*
2132
+ * jsTree sort plugin
2133
+ * Sorts items alphabetically (or using any other function)
2134
+ */
2135
+ (function ($) {
2136
+ $.jstree.plugin("sort", {
2137
+ __init : function () {
2138
+ this.get_container()
2139
+ .bind("load_node.jstree", $.proxy(function (e, data) {
2140
+ var obj = this._get_node(data.rslt.obj);
2141
+ obj = obj === -1 ? this.get_container().children("ul") : obj.children("ul");
2142
+ this.sort(obj);
2143
+ }, this))
2144
+ .bind("rename_node.jstree create_node.jstree create.jstree", $.proxy(function (e, data) {
2145
+ this.sort(data.rslt.obj.parent());
2146
+ }, this))
2147
+ .bind("move_node.jstree", $.proxy(function (e, data) {
2148
+ var m = data.rslt.np == -1 ? this.get_container() : data.rslt.np;
2149
+ this.sort(m.children("ul"));
2150
+ }, this));
2151
+ },
2152
+ defaults : function (a, b) { return this.get_text(a) > this.get_text(b) ? 1 : -1; },
2153
+ _fn : {
2154
+ sort : function (obj) {
2155
+ var s = this._get_settings().sort,
2156
+ t = this;
2157
+ obj.append($.makeArray(obj.children("li")).sort($.proxy(s, t)));
2158
+ obj.find("> li > ul").each(function() { t.sort($(this)); });
2159
+ this.clean_node(obj);
2160
+ }
2161
+ }
2162
+ });
2163
+ })(jQuery);
2164
+ //*/
2165
+
2166
+ /*
2167
+ * jsTree DND plugin
2168
+ * Drag and drop plugin for moving/copying nodes
2169
+ */
2170
+ (function ($) {
2171
+ var o = false,
2172
+ r = false,
2173
+ m = false,
2174
+ ml = false,
2175
+ sli = false,
2176
+ sti = false,
2177
+ dir1 = false,
2178
+ dir2 = false,
2179
+ last_pos = false;
2180
+ $.vakata.dnd = {
2181
+ is_down : false,
2182
+ is_drag : false,
2183
+ helper : false,
2184
+ scroll_spd : 10,
2185
+ init_x : 0,
2186
+ init_y : 0,
2187
+ threshold : 5,
2188
+ helper_left : 5,
2189
+ helper_top : 10,
2190
+ user_data : {},
2191
+
2192
+ drag_start : function (e, data, html) {
2193
+ if($.vakata.dnd.is_drag) { $.vakata.drag_stop({}); }
2194
+ try {
2195
+ e.currentTarget.unselectable = "on";
2196
+ e.currentTarget.onselectstart = function() { return false; };
2197
+ if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; }
2198
+ } catch(err) { }
2199
+ $.vakata.dnd.init_x = e.pageX;
2200
+ $.vakata.dnd.init_y = e.pageY;
2201
+ $.vakata.dnd.user_data = data;
2202
+ $.vakata.dnd.is_down = true;
2203
+ $.vakata.dnd.helper = $("<div id='vakata-dragged' />").html(html); //.fadeTo(10,0.25);
2204
+ $(document).bind("mousemove", $.vakata.dnd.drag);
2205
+ $(document).bind("mouseup", $.vakata.dnd.drag_stop);
2206
+ return false;
2207
+ },
2208
+ drag : function (e) {
2209
+ if(!$.vakata.dnd.is_down) { return; }
2210
+ if(!$.vakata.dnd.is_drag) {
2211
+ if(Math.abs(e.pageX - $.vakata.dnd.init_x) > 5 || Math.abs(e.pageY - $.vakata.dnd.init_y) > 5) {
2212
+ $.vakata.dnd.helper.appendTo("body");
2213
+ $.vakata.dnd.is_drag = true;
2214
+ $(document).triggerHandler("drag_start.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
2215
+ }
2216
+ else { return; }
2217
+ }
2218
+
2219
+ // maybe use a scrolling parent element instead of document?
2220
+ if(e.type === "mousemove") { // thought of adding scroll in order to move the helper, but mouse poisition is n/a
2221
+ var d = $(document), t = d.scrollTop(), l = d.scrollLeft();
2222
+ if(e.pageY - t < 20) {
2223
+ if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
2224
+ if(!sti) { dir1 = "up"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() - $.vakata.dnd.scroll_spd); }, 150); }
2225
+ }
2226
+ else {
2227
+ if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
2228
+ }
2229
+ if($(window).height() - (e.pageY - t) < 20) {
2230
+ if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
2231
+ if(!sti) { dir1 = "down"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() + $.vakata.dnd.scroll_spd); }, 150); }
2232
+ }
2233
+ else {
2234
+ if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
2235
+ }
2236
+
2237
+ if(e.pageX - l < 20) {
2238
+ if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
2239
+ if(!sli) { dir2 = "left"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() - $.vakata.dnd.scroll_spd); }, 150); }
2240
+ }
2241
+ else {
2242
+ if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
2243
+ }
2244
+ if($(window).width() - (e.pageX - l) < 20) {
2245
+ if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
2246
+ if(!sli) { dir2 = "right"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() + $.vakata.dnd.scroll_spd); }, 150); }
2247
+ }
2248
+ else {
2249
+ if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
2250
+ }
2251
+ }
2252
+
2253
+ $.vakata.dnd.helper.css({ left : (e.pageX + $.vakata.dnd.helper_left) + "px", top : (e.pageY + $.vakata.dnd.helper_top) + "px" });
2254
+ $(document).triggerHandler("drag.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
2255
+ },
2256
+ drag_stop : function (e) {
2257
+ if(sli) { clearInterval(sli); }
2258
+ if(sti) { clearInterval(sti); }
2259
+ $(document).unbind("mousemove", $.vakata.dnd.drag);
2260
+ $(document).unbind("mouseup", $.vakata.dnd.drag_stop);
2261
+ $(document).triggerHandler("drag_stop.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
2262
+ $.vakata.dnd.helper.remove();
2263
+ $.vakata.dnd.init_x = 0;
2264
+ $.vakata.dnd.init_y = 0;
2265
+ $.vakata.dnd.user_data = {};
2266
+ $.vakata.dnd.is_down = false;
2267
+ $.vakata.dnd.is_drag = false;
2268
+ }
2269
+ };
2270
+ $(function() {
2271
+ var css_string = '#vakata-dragged { display:block; margin:0 0 0 0; padding:4px 4px 4px 24px; position:absolute; top:-2000px; line-height:16px; z-index:10000; } ';
2272
+ $.vakata.css.add_sheet({ str : css_string, title : "vakata" });
2273
+ });
2274
+
2275
+ $.jstree.plugin("dnd", {
2276
+ __init : function () {
2277
+ this.data.dnd = {
2278
+ active : false,
2279
+ after : false,
2280
+ inside : false,
2281
+ before : false,
2282
+ off : false,
2283
+ prepared : false,
2284
+ w : 0,
2285
+ to1 : false,
2286
+ to2 : false,
2287
+ cof : false,
2288
+ cw : false,
2289
+ ch : false,
2290
+ i1 : false,
2291
+ i2 : false,
2292
+ mto : false
2293
+ };
2294
+ this.get_container()
2295
+ .bind("mouseenter.jstree", $.proxy(function (e) {
2296
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
2297
+ if(this.data.themes) {
2298
+ m.attr("class", "jstree-" + this.data.themes.theme);
2299
+ if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
2300
+ $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
2301
+ }
2302
+ //if($(e.currentTarget).find("> ul > li").length === 0) {
2303
+ if(e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree
2304
+ var tr = $.jstree._reference(e.target), dc;
2305
+ if(tr.data.dnd.foreign) {
2306
+ dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
2307
+ if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {
2308
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
2309
+ }
2310
+ }
2311
+ else {
2312
+ tr.prepare_move(o, tr.get_container(), "last");
2313
+ if(tr.check_move()) {
2314
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
2315
+ }
2316
+ }
2317
+ }
2318
+ }
2319
+ }, this))
2320
+ .bind("mouseup.jstree", $.proxy(function (e) {
2321
+ //if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && $(e.currentTarget).find("> ul > li").length === 0) {
2322
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree
2323
+ var tr = $.jstree._reference(e.currentTarget), dc;
2324
+ if(tr.data.dnd.foreign) {
2325
+ dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
2326
+ if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {
2327
+ tr._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
2328
+ }
2329
+ }
2330
+ else {
2331
+ tr.move_node(o, tr.get_container(), "last", e[tr._get_settings().dnd.copy_modifier + "Key"]);
2332
+ }
2333
+ }
2334
+ }, this))
2335
+ .bind("mouseleave.jstree", $.proxy(function (e) {
2336
+ if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {
2337
+ return false;
2338
+ }
2339
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
2340
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
2341
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
2342
+ if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
2343
+ if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
2344
+ if($.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {
2345
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
2346
+ }
2347
+ }
2348
+ }, this))
2349
+ .bind("mousemove.jstree", $.proxy(function (e) {
2350
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
2351
+ var cnt = this.get_container()[0];
2352
+
2353
+ // Horizontal scroll
2354
+ if(e.pageX + 24 > this.data.dnd.cof.left + this.data.dnd.cw) {
2355
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
2356
+ this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft += $.vakata.dnd.scroll_spd; }, cnt), 100);
2357
+ }
2358
+ else if(e.pageX - 24 < this.data.dnd.cof.left) {
2359
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
2360
+ this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft -= $.vakata.dnd.scroll_spd; }, cnt), 100);
2361
+ }
2362
+ else {
2363
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
2364
+ }
2365
+
2366
+ // Vertical scroll
2367
+ if(e.pageY + 24 > this.data.dnd.cof.top + this.data.dnd.ch) {
2368
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
2369
+ this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop += $.vakata.dnd.scroll_spd; }, cnt), 100);
2370
+ }
2371
+ else if(e.pageY - 24 < this.data.dnd.cof.top) {
2372
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
2373
+ this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop -= $.vakata.dnd.scroll_spd; }, cnt), 100);
2374
+ }
2375
+ else {
2376
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
2377
+ }
2378
+
2379
+ }
2380
+ }, this))
2381
+ .bind("scroll.jstree", $.proxy(function (e) {
2382
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && m && ml) {
2383
+ m.hide();
2384
+ ml.hide();
2385
+ }
2386
+ }, this))
2387
+ .delegate("a", "mousedown.jstree", $.proxy(function (e) {
2388
+ if(e.which === 1) {
2389
+ this.start_drag(e.currentTarget, e);
2390
+ return false;
2391
+ }
2392
+ }, this))
2393
+ .delegate("a", "mouseenter.jstree", $.proxy(function (e) {
2394
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
2395
+ this.dnd_enter(e.currentTarget);
2396
+ }
2397
+ }, this))
2398
+ .delegate("a", "mousemove.jstree", $.proxy(function (e) {
2399
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
2400
+ if(!r || !r.length || r.children("a")[0] !== e.currentTarget) {
2401
+ this.dnd_enter(e.currentTarget);
2402
+ }
2403
+ if(typeof this.data.dnd.off.top === "undefined") { this.data.dnd.off = $(e.target).offset(); }
2404
+ this.data.dnd.w = (e.pageY - (this.data.dnd.off.top || 0)) % this.data.core.li_height;
2405
+ if(this.data.dnd.w < 0) { this.data.dnd.w += this.data.core.li_height; }
2406
+ this.dnd_show();
2407
+ }
2408
+ }, this))
2409
+ .delegate("a", "mouseleave.jstree", $.proxy(function (e) {
2410
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
2411
+ if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {
2412
+ return false;
2413
+ }
2414
+ if(m) { m.hide(); }
2415
+ if(ml) { ml.hide(); }
2416
+ /*
2417
+ var ec = $(e.currentTarget).closest("li"),
2418
+ er = $(e.relatedTarget).closest("li");
2419
+ if(er[0] !== ec.prev()[0] && er[0] !== ec.next()[0]) {
2420
+ if(m) { m.hide(); }
2421
+ if(ml) { ml.hide(); }
2422
+ }
2423
+ */
2424
+ this.data.dnd.mto = setTimeout(
2425
+ (function (t) { return function () { t.dnd_leave(e); }; })(this),
2426
+ 0);
2427
+ }
2428
+ }, this))
2429
+ .delegate("a", "mouseup.jstree", $.proxy(function (e) {
2430
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
2431
+ this.dnd_finish(e);
2432
+ }
2433
+ }, this));
2434
+
2435
+ $(document)
2436
+ .bind("drag_stop.vakata", $.proxy(function () {
2437
+ if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
2438
+ if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
2439
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
2440
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
2441
+ this.data.dnd.after = false;
2442
+ this.data.dnd.before = false;
2443
+ this.data.dnd.inside = false;
2444
+ this.data.dnd.off = false;
2445
+ this.data.dnd.prepared = false;
2446
+ this.data.dnd.w = false;
2447
+ this.data.dnd.to1 = false;
2448
+ this.data.dnd.to2 = false;
2449
+ this.data.dnd.i1 = false;
2450
+ this.data.dnd.i2 = false;
2451
+ this.data.dnd.active = false;
2452
+ this.data.dnd.foreign = false;
2453
+ if(m) { m.css({ "top" : "-2000px" }); }
2454
+ if(ml) { ml.css({ "top" : "-2000px" }); }
2455
+ }, this))
2456
+ .bind("drag_start.vakata", $.proxy(function (e, data) {
2457
+ if(data.data.jstree) {
2458
+ var et = $(data.event.target);
2459
+ if(et.closest(".jstree").hasClass("jstree-" + this.get_index())) {
2460
+ this.dnd_enter(et);
2461
+ }
2462
+ }
2463
+ }, this));
2464
+ /*
2465
+ .bind("keydown.jstree-" + this.get_index() + " keyup.jstree-" + this.get_index(), $.proxy(function(e) {
2466
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && !this.data.dnd.foreign) {
2467
+ var h = $.vakata.dnd.helper.children("ins");
2468
+ if(e[this._get_settings().dnd.copy_modifier + "Key"] && h.hasClass("jstree-ok")) {
2469
+ h.parent().html(h.parent().html().replace(/ \(Copy\)$/, "") + " (Copy)");
2470
+ }
2471
+ else {
2472
+ h.parent().html(h.parent().html().replace(/ \(Copy\)$/, ""));
2473
+ }
2474
+ }
2475
+ }, this)); */
2476
+
2477
+
2478
+
2479
+ var s = this._get_settings().dnd;
2480
+ if(s.drag_target) {
2481
+ $(document)
2482
+ .delegate(s.drag_target, "mousedown.jstree-" + this.get_index(), $.proxy(function (e) {
2483
+ o = e.target;
2484
+ $.vakata.dnd.drag_start(e, { jstree : true, obj : e.target }, "<ins class='jstree-icon'></ins>" + $(e.target).text() );
2485
+ if(this.data.themes) {
2486
+ if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }
2487
+ if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
2488
+ $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
2489
+ }
2490
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
2491
+ var cnt = this.get_container();
2492
+ this.data.dnd.cof = cnt.offset();
2493
+ this.data.dnd.cw = parseInt(cnt.width(),10);
2494
+ this.data.dnd.ch = parseInt(cnt.height(),10);
2495
+ this.data.dnd.foreign = true;
2496
+ e.preventDefault();
2497
+ }, this));
2498
+ }
2499
+ if(s.drop_target) {
2500
+ $(document)
2501
+ .delegate(s.drop_target, "mouseenter.jstree-" + this.get_index(), $.proxy(function (e) {
2502
+ if(this.data.dnd.active && this._get_settings().dnd.drop_check.call(this, { "o" : o, "r" : $(e.target), "e" : e })) {
2503
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
2504
+ }
2505
+ }, this))
2506
+ .delegate(s.drop_target, "mouseleave.jstree-" + this.get_index(), $.proxy(function (e) {
2507
+ if(this.data.dnd.active) {
2508
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
2509
+ }
2510
+ }, this))
2511
+ .delegate(s.drop_target, "mouseup.jstree-" + this.get_index(), $.proxy(function (e) {
2512
+ if(this.data.dnd.active && $.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {
2513
+ this._get_settings().dnd.drop_finish.call(this, { "o" : o, "r" : $(e.target), "e" : e });
2514
+ }
2515
+ }, this));
2516
+ }
2517
+ },
2518
+ defaults : {
2519
+ copy_modifier : "ctrl",
2520
+ check_timeout : 100,
2521
+ open_timeout : 500,
2522
+ drop_target : ".jstree-drop",
2523
+ drop_check : function (data) { return true; },
2524
+ drop_finish : $.noop,
2525
+ drag_target : ".jstree-draggable",
2526
+ drag_finish : $.noop,
2527
+ drag_check : function (data) { return { after : false, before : false, inside : true }; }
2528
+ },
2529
+ _fn : {
2530
+ dnd_prepare : function () {
2531
+ if(!r || !r.length) { return; }
2532
+ this.data.dnd.off = r.offset();
2533
+ if(this._get_settings().core.rtl) {
2534
+ this.data.dnd.off.right = this.data.dnd.off.left + r.width();
2535
+ }
2536
+ if(this.data.dnd.foreign) {
2537
+ var a = this._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : r });
2538
+ this.data.dnd.after = a.after;
2539
+ this.data.dnd.before = a.before;
2540
+ this.data.dnd.inside = a.inside;
2541
+ this.data.dnd.prepared = true;
2542
+ return this.dnd_show();
2543
+ }
2544
+ this.prepare_move(o, r, "before");
2545
+ this.data.dnd.before = this.check_move();
2546
+ this.prepare_move(o, r, "after");
2547
+ this.data.dnd.after = this.check_move();
2548
+ if(this._is_loaded(r)) {
2549
+ this.prepare_move(o, r, "inside");
2550
+ this.data.dnd.inside = this.check_move();
2551
+ }
2552
+ else {
2553
+ this.data.dnd.inside = false;
2554
+ }
2555
+ this.data.dnd.prepared = true;
2556
+ return this.dnd_show();
2557
+ },
2558
+ dnd_show : function () {
2559
+ if(!this.data.dnd.prepared) { return; }
2560
+ var o = ["before","inside","after"],
2561
+ r = false,
2562
+ rtl = this._get_settings().core.rtl,
2563
+ pos;
2564
+ if(this.data.dnd.w < this.data.core.li_height/3) { o = ["before","inside","after"]; }
2565
+ else if(this.data.dnd.w <= this.data.core.li_height*2/3) {
2566
+ o = this.data.dnd.w < this.data.core.li_height/2 ? ["inside","before","after"] : ["inside","after","before"];
2567
+ }
2568
+ else { o = ["after","inside","before"]; }
2569
+ $.each(o, $.proxy(function (i, val) {
2570
+ if(this.data.dnd[val]) {
2571
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
2572
+ r = val;
2573
+ return false;
2574
+ }
2575
+ }, this));
2576
+ if(r === false) { $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); }
2577
+
2578
+ pos = rtl ? (this.data.dnd.off.right - 18) : (this.data.dnd.off.left + 10);
2579
+ switch(r) {
2580
+ case "before":
2581
+ m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top - 6) + "px" }).show();
2582
+ if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top - 1) + "px" }).show(); }
2583
+ break;
2584
+ case "after":
2585
+ m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 6) + "px" }).show();
2586
+ if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 1) + "px" }).show(); }
2587
+ break;
2588
+ case "inside":
2589
+ m.css({ "left" : pos + ( rtl ? -4 : 4) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height/2 - 5) + "px" }).show();
2590
+ if(ml) { ml.hide(); }
2591
+ break;
2592
+ default:
2593
+ m.hide();
2594
+ if(ml) { ml.hide(); }
2595
+ break;
2596
+ }
2597
+ last_pos = r;
2598
+ return r;
2599
+ },
2600
+ dnd_open : function () {
2601
+ this.data.dnd.to2 = false;
2602
+ this.open_node(r, $.proxy(this.dnd_prepare,this), true);
2603
+ },
2604
+ dnd_finish : function (e) {
2605
+ if(this.data.dnd.foreign) {
2606
+ if(this.data.dnd.after || this.data.dnd.before || this.data.dnd.inside) {
2607
+ this._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : r, "p" : last_pos });
2608
+ }
2609
+ }
2610
+ else {
2611
+ this.dnd_prepare();
2612
+ this.move_node(o, r, last_pos, e[this._get_settings().dnd.copy_modifier + "Key"]);
2613
+ }
2614
+ o = false;
2615
+ r = false;
2616
+ m.hide();
2617
+ if(ml) { ml.hide(); }
2618
+ },
2619
+ dnd_enter : function (obj) {
2620
+ if(this.data.dnd.mto) {
2621
+ clearTimeout(this.data.dnd.mto);
2622
+ this.data.dnd.mto = false;
2623
+ }
2624
+ var s = this._get_settings().dnd;
2625
+ this.data.dnd.prepared = false;
2626
+ r = this._get_node(obj);
2627
+ if(s.check_timeout) {
2628
+ // do the calculations after a minimal timeout (users tend to drag quickly to the desired location)
2629
+ if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
2630
+ this.data.dnd.to1 = setTimeout($.proxy(this.dnd_prepare, this), s.check_timeout);
2631
+ }
2632
+ else {
2633
+ this.dnd_prepare();
2634
+ }
2635
+ if(s.open_timeout) {
2636
+ if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
2637
+ if(r && r.length && r.hasClass("jstree-closed")) {
2638
+ // if the node is closed - open it, then recalculate
2639
+ this.data.dnd.to2 = setTimeout($.proxy(this.dnd_open, this), s.open_timeout);
2640
+ }
2641
+ }
2642
+ else {
2643
+ if(r && r.length && r.hasClass("jstree-closed")) {
2644
+ this.dnd_open();
2645
+ }
2646
+ }
2647
+ },
2648
+ dnd_leave : function (e) {
2649
+ this.data.dnd.after = false;
2650
+ this.data.dnd.before = false;
2651
+ this.data.dnd.inside = false;
2652
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
2653
+ m.hide();
2654
+ if(ml) { ml.hide(); }
2655
+ if(r && r[0] === e.target.parentNode) {
2656
+ if(this.data.dnd.to1) {
2657
+ clearTimeout(this.data.dnd.to1);
2658
+ this.data.dnd.to1 = false;
2659
+ }
2660
+ if(this.data.dnd.to2) {
2661
+ clearTimeout(this.data.dnd.to2);
2662
+ this.data.dnd.to2 = false;
2663
+ }
2664
+ }
2665
+ },
2666
+ start_drag : function (obj, e) {
2667
+ o = this._get_node(obj);
2668
+ if(this.data.ui && this.is_selected(o)) { o = this._get_node(null, true); }
2669
+ var dt = o.length > 1 ? this._get_string("multiple_selection") : this.get_text(o),
2670
+ cnt = this.get_container();
2671
+ if(!this._get_settings().core.html_titles) { dt = dt.replace(/</ig,"&lt;").replace(/>/ig,"&gt;"); }
2672
+ $.vakata.dnd.drag_start(e, { jstree : true, obj : o }, "<ins class='jstree-icon'></ins>" + dt );
2673
+ if(this.data.themes) {
2674
+ if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }
2675
+ if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
2676
+ $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
2677
+ }
2678
+ this.data.dnd.cof = cnt.offset();
2679
+ this.data.dnd.cw = parseInt(cnt.width(),10);
2680
+ this.data.dnd.ch = parseInt(cnt.height(),10);
2681
+ this.data.dnd.active = true;
2682
+ }
2683
+ }
2684
+ });
2685
+ $(function() {
2686
+ var css_string = '' +
2687
+ '#vakata-dragged ins { display:block; text-decoration:none; width:16px; height:16px; margin:0 0 0 0; padding:0; position:absolute; top:4px; left:4px; ' +
2688
+ ' -moz-border-radius:4px; border-radius:4px; -webkit-border-radius:4px; ' +
2689
+ '} ' +
2690
+ '#vakata-dragged .jstree-ok { background:green; } ' +
2691
+ '#vakata-dragged .jstree-invalid { background:red; } ' +
2692
+ '#jstree-marker { padding:0; margin:0; font-size:12px; overflow:hidden; height:12px; width:8px; position:absolute; top:-30px; z-index:10001; background-repeat:no-repeat; display:none; background-color:transparent; text-shadow:1px 1px 1px white; color:black; line-height:10px; } ' +
2693
+ '#jstree-marker-line { padding:0; margin:0; line-height:0%; font-size:1px; overflow:hidden; height:1px; width:100px; position:absolute; top:-30px; z-index:10000; background-repeat:no-repeat; display:none; background-color:#456c43; ' +
2694
+ ' cursor:pointer; border:1px solid #eeeeee; border-left:0; -moz-box-shadow: 0px 0px 2px #666; -webkit-box-shadow: 0px 0px 2px #666; box-shadow: 0px 0px 2px #666; ' +
2695
+ ' -moz-border-radius:1px; border-radius:1px; -webkit-border-radius:1px; ' +
2696
+ '}' +
2697
+ '';
2698
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
2699
+ m = $("<div />").attr({ id : "jstree-marker" }).hide().html("&raquo;")
2700
+ .bind("mouseleave mouseenter", function (e) {
2701
+ m.hide();
2702
+ ml.hide();
2703
+ e.preventDefault();
2704
+ e.stopImmediatePropagation();
2705
+ return false;
2706
+ })
2707
+ .appendTo("body");
2708
+ ml = $("<div />").attr({ id : "jstree-marker-line" }).hide()
2709
+ .bind("mouseup", function (e) {
2710
+ if(r && r.length) {
2711
+ r.children("a").trigger(e);
2712
+ e.preventDefault();
2713
+ e.stopImmediatePropagation();
2714
+ return false;
2715
+ }
2716
+ })
2717
+ .bind("mouseleave", function (e) {
2718
+ var rt = $(e.relatedTarget);
2719
+ if(rt.is(".jstree") || rt.closest(".jstree").length === 0) {
2720
+ if(r && r.length) {
2721
+ r.children("a").trigger(e);
2722
+ m.hide();
2723
+ ml.hide();
2724
+ e.preventDefault();
2725
+ e.stopImmediatePropagation();
2726
+ return false;
2727
+ }
2728
+ }
2729
+ })
2730
+ .appendTo("body");
2731
+ $(document).bind("drag_start.vakata", function (e, data) {
2732
+ if(data.data.jstree) { m.show(); if(ml) { ml.show(); } }
2733
+ });
2734
+ $(document).bind("drag_stop.vakata", function (e, data) {
2735
+ if(data.data.jstree) { m.hide(); if(ml) { ml.hide(); } }
2736
+ });
2737
+ });
2738
+ })(jQuery);
2739
+ //*/
2740
+
2741
+ /*
2742
+ * jsTree checkbox plugin
2743
+ * Inserts checkboxes in front of every node
2744
+ * Depends on the ui plugin
2745
+ * DOES NOT WORK NICELY WITH MULTITREE DRAG'N'DROP
2746
+ */
2747
+ (function ($) {
2748
+ $.jstree.plugin("checkbox", {
2749
+ __init : function () {
2750
+ this.data.checkbox.noui = this._get_settings().checkbox.override_ui;
2751
+ if(this.data.ui && this.data.checkbox.noui) {
2752
+ this.select_node = this.deselect_node = this.deselect_all = $.noop;
2753
+ this.get_selected = this.get_checked;
2754
+ }
2755
+
2756
+ this.get_container()
2757
+ .bind("open_node.jstree create_node.jstree clean_node.jstree refresh.jstree", $.proxy(function (e, data) {
2758
+ this._prepare_checkboxes(data.rslt.obj);
2759
+ }, this))
2760
+ .bind("loaded.jstree", $.proxy(function (e) {
2761
+ this._prepare_checkboxes();
2762
+ }, this))
2763
+ .delegate( (this.data.ui && this.data.checkbox.noui ? "a" : "ins.jstree-checkbox") , "click.jstree", $.proxy(function (e) {
2764
+ e.preventDefault();
2765
+ if(this._get_node(e.target).hasClass("jstree-checked")) { this.uncheck_node(e.target); }
2766
+ else { this.check_node(e.target); }
2767
+ if(this.data.ui && this.data.checkbox.noui) {
2768
+ this.save_selected();
2769
+ if(this.data.cookies) { this.save_cookie("select_node"); }
2770
+ }
2771
+ else {
2772
+ e.stopImmediatePropagation();
2773
+ return false;
2774
+ }
2775
+ }, this));
2776
+ },
2777
+ defaults : {
2778
+ override_ui : false,
2779
+ two_state : false,
2780
+ real_checkboxes : false,
2781
+ checked_parent_open : true,
2782
+ real_checkboxes_names : function (n) { return [ ("check_" + (n[0].id || Math.ceil(Math.random() * 10000))) , 1]; }
2783
+ },
2784
+ __destroy : function () {
2785
+ this.get_container()
2786
+ .find("input.jstree-real-checkbox").removeClass("jstree-real-checkbox").end()
2787
+ .find("ins.jstree-checkbox").remove();
2788
+ },
2789
+ _fn : {
2790
+ _checkbox_notify : function (n, data) {
2791
+ if(data.checked) {
2792
+ this.check_node(n, false);
2793
+ }
2794
+ },
2795
+ _prepare_checkboxes : function (obj) {
2796
+ obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);
2797
+ if(obj === false) { return; } // added for removing root nodes
2798
+ var c, _this = this, t, ts = this._get_settings().checkbox.two_state, rc = this._get_settings().checkbox.real_checkboxes, rcn = this._get_settings().checkbox.real_checkboxes_names;
2799
+ obj.each(function () {
2800
+ t = $(this);
2801
+ c = t.is("li") && (t.hasClass("jstree-checked") || (rc && t.children(":checked").length)) ? "jstree-checked" : "jstree-unchecked";
2802
+ t.find("li").andSelf().each(function () {
2803
+ var $t = $(this), nm;
2804
+ $t.children("a" + (_this.data.languages ? "" : ":eq(0)") ).not(":has(.jstree-checkbox)").prepend("<ins class='jstree-checkbox'>&#160;</ins>").parent().not(".jstree-checked, .jstree-unchecked").addClass( ts ? "jstree-unchecked" : c );
2805
+ if(rc) {
2806
+ if(!$t.children(":checkbox").length) {
2807
+ nm = rcn.call(_this, $t);
2808
+ $t.prepend("<input type='checkbox' class='jstree-real-checkbox' id='" + nm[0] + "' name='" + nm[0] + "' value='" + nm[1] + "' />");
2809
+ }
2810
+ else {
2811
+ $t.children(":checkbox").addClass("jstree-real-checkbox");
2812
+ }
2813
+ if(c === "jstree-checked") {
2814
+ $t.children(":checkbox").attr("checked","checked");
2815
+ }
2816
+ }
2817
+ if(c === "jstree-checked" && !ts) {
2818
+ $t.find("li").addClass("jstree-checked");
2819
+ }
2820
+ });
2821
+ });
2822
+ if(!ts) {
2823
+ if(obj.length === 1 && obj.is("li")) { this._repair_state(obj); }
2824
+ if(obj.is("li")) { obj.each(function () { _this._repair_state(this); }); }
2825
+ else { obj.find("> ul > li").each(function () { _this._repair_state(this); }); }
2826
+ obj.find(".jstree-checked").parent().parent().each(function () { _this._repair_state(this); });
2827
+ }
2828
+ },
2829
+ change_state : function (obj, state) {
2830
+ obj = this._get_node(obj);
2831
+ var coll = false, rc = this._get_settings().checkbox.real_checkboxes;
2832
+ if(!obj || obj === -1) { return false; }
2833
+ state = (state === false || state === true) ? state : obj.hasClass("jstree-checked");
2834
+ if(this._get_settings().checkbox.two_state) {
2835
+ if(state) {
2836
+ obj.removeClass("jstree-checked").addClass("jstree-unchecked");
2837
+ if(rc) { obj.children(":checkbox").removeAttr("checked"); }
2838
+ }
2839
+ else {
2840
+ obj.removeClass("jstree-unchecked").addClass("jstree-checked");
2841
+ if(rc) { obj.children(":checkbox").attr("checked","checked"); }
2842
+ }
2843
+ }
2844
+ else {
2845
+ if(state) {
2846
+ coll = obj.find("li").andSelf();
2847
+ if(!coll.filter(".jstree-checked, .jstree-undetermined").length) { return false; }
2848
+ coll.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");
2849
+ if(rc) { coll.children(":checkbox").removeAttr("checked"); }
2850
+ }
2851
+ else {
2852
+ coll = obj.find("li").andSelf();
2853
+ if(!coll.filter(".jstree-unchecked, .jstree-undetermined").length) { return false; }
2854
+ coll.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");
2855
+ if(rc) { coll.children(":checkbox").attr("checked","checked"); }
2856
+ if(this.data.ui) { this.data.ui.last_selected = obj; }
2857
+ this.data.checkbox.last_selected = obj;
2858
+ }
2859
+ obj.parentsUntil(".jstree", "li").each(function () {
2860
+ var $this = $(this);
2861
+ if(state) {
2862
+ if($this.children("ul").children("li.jstree-checked, li.jstree-undetermined").length) {
2863
+ $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
2864
+ if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").removeAttr("checked"); }
2865
+ return false;
2866
+ }
2867
+ else {
2868
+ $this.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");
2869
+ if(rc) { $this.children(":checkbox").removeAttr("checked"); }
2870
+ }
2871
+ }
2872
+ else {
2873
+ if($this.children("ul").children("li.jstree-unchecked, li.jstree-undetermined").length) {
2874
+ $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
2875
+ if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").removeAttr("checked"); }
2876
+ return false;
2877
+ }
2878
+ else {
2879
+ $this.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");
2880
+ if(rc) { $this.children(":checkbox").attr("checked","checked"); }
2881
+ }
2882
+ }
2883
+ });
2884
+ }
2885
+ if(this.data.ui && this.data.checkbox.noui) { this.data.ui.selected = this.get_checked(); }
2886
+ this.__callback(obj);
2887
+ return true;
2888
+ },
2889
+ check_node : function (obj) {
2890
+ if(this.change_state(obj, false)) {
2891
+ obj = this._get_node(obj);
2892
+ if(this._get_settings().checkbox.checked_parent_open) {
2893
+ var t = this;
2894
+ obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });
2895
+ }
2896
+ this.__callback({ "obj" : obj });
2897
+ }
2898
+ },
2899
+ uncheck_node : function (obj) {
2900
+ if(this.change_state(obj, true)) { this.__callback({ "obj" : this._get_node(obj) }); }
2901
+ },
2902
+ check_all : function () {
2903
+ var _this = this,
2904
+ coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");
2905
+ coll.each(function () {
2906
+ _this.change_state(this, false);
2907
+ });
2908
+ this.__callback();
2909
+ },
2910
+ uncheck_all : function () {
2911
+ var _this = this,
2912
+ coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");
2913
+ coll.each(function () {
2914
+ _this.change_state(this, true);
2915
+ });
2916
+ this.__callback();
2917
+ },
2918
+
2919
+ is_checked : function(obj) {
2920
+ obj = this._get_node(obj);
2921
+ return obj.length ? obj.is(".jstree-checked") : false;
2922
+ },
2923
+ get_checked : function (obj, get_all) {
2924
+ obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
2925
+ return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-checked") : obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked");
2926
+ },
2927
+ get_unchecked : function (obj, get_all) {
2928
+ obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
2929
+ return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-unchecked") : obj.find("> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked");
2930
+ },
2931
+
2932
+ show_checkboxes : function () { this.get_container().children("ul").removeClass("jstree-no-checkboxes"); },
2933
+ hide_checkboxes : function () { this.get_container().children("ul").addClass("jstree-no-checkboxes"); },
2934
+
2935
+ _repair_state : function (obj) {
2936
+ obj = this._get_node(obj);
2937
+ if(!obj.length) { return; }
2938
+ var rc = this._get_settings().checkbox.real_checkboxes,
2939
+ a = obj.find("> ul > .jstree-checked").length,
2940
+ b = obj.find("> ul > .jstree-undetermined").length,
2941
+ c = obj.find("> ul > li").length;
2942
+ if(c === 0) { if(obj.hasClass("jstree-undetermined")) { this.change_state(obj, false); } }
2943
+ else if(a === 0 && b === 0) { this.change_state(obj, true); }
2944
+ else if(a === c) { this.change_state(obj, false); }
2945
+ else {
2946
+ obj.parentsUntil(".jstree","li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
2947
+ if(rc) { obj.parentsUntil(".jstree", "li").andSelf().children(":checkbox").removeAttr("checked"); }
2948
+ }
2949
+ },
2950
+ reselect : function () {
2951
+ if(this.data.ui && this.data.checkbox.noui) {
2952
+ var _this = this,
2953
+ s = this.data.ui.to_select;
2954
+ s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
2955
+ this.deselect_all();
2956
+ $.each(s, function (i, val) { _this.check_node(val); });
2957
+ this.__callback();
2958
+ }
2959
+ else {
2960
+ this.__call_old();
2961
+ }
2962
+ },
2963
+ save_loaded : function () {
2964
+ var _this = this;
2965
+ this.data.core.to_load = [];
2966
+ this.get_container_ul().find("li.jstree-closed.jstree-undetermined").each(function () {
2967
+ if(this.id) { _this.data.core.to_load.push("#" + this.id); }
2968
+ });
2969
+ }
2970
+ }
2971
+ });
2972
+ $(function() {
2973
+ var css_string = '.jstree .jstree-real-checkbox { display:none; } ';
2974
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
2975
+ });
2976
+ })(jQuery);
2977
+ //*/
2978
+
2979
+ /*
2980
+ * jsTree XML plugin
2981
+ * The XML data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
2982
+ */
2983
+ (function ($) {
2984
+ $.vakata.xslt = function (xml, xsl, callback) {
2985
+ var rs = "", xm, xs, processor, support;
2986
+ // TODO: IE9 no XSLTProcessor, no document.recalc
2987
+ if(document.recalc) {
2988
+ xm = document.createElement('xml');
2989
+ xs = document.createElement('xml');
2990
+ xm.innerHTML = xml;
2991
+ xs.innerHTML = xsl;
2992
+ $("body").append(xm).append(xs);
2993
+ setTimeout( (function (xm, xs, callback) {
2994
+ return function () {
2995
+ callback.call(null, xm.transformNode(xs.XMLDocument));
2996
+ setTimeout( (function (xm, xs) { return function () { $(xm).remove(); $(xs).remove(); }; })(xm, xs), 200);
2997
+ };
2998
+ })(xm, xs, callback), 100);
2999
+ return true;
3000
+ }
3001
+ if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor === "undefined") {
3002
+ xml = new DOMParser().parseFromString(xml, "text/xml");
3003
+ xsl = new DOMParser().parseFromString(xsl, "text/xml");
3004
+ // alert(xml.transformNode());
3005
+ // callback.call(null, new XMLSerializer().serializeToString(rs));
3006
+
3007
+ }
3008
+ if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor !== "undefined") {
3009
+ processor = new XSLTProcessor();
3010
+ support = $.isFunction(processor.transformDocument) ? (typeof window.XMLSerializer !== "undefined") : true;
3011
+ if(!support) { return false; }
3012
+ xml = new DOMParser().parseFromString(xml, "text/xml");
3013
+ xsl = new DOMParser().parseFromString(xsl, "text/xml");
3014
+ if($.isFunction(processor.transformDocument)) {
3015
+ rs = document.implementation.createDocument("", "", null);
3016
+ processor.transformDocument(xml, xsl, rs, null);
3017
+ callback.call(null, new XMLSerializer().serializeToString(rs));
3018
+ return true;
3019
+ }
3020
+ else {
3021
+ processor.importStylesheet(xsl);
3022
+ rs = processor.transformToFragment(xml, document);
3023
+ callback.call(null, $("<div />").append(rs).html());
3024
+ return true;
3025
+ }
3026
+ }
3027
+ return false;
3028
+ };
3029
+ var xsl = {
3030
+ 'nest' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
3031
+ '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
3032
+ '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/html" />' +
3033
+ '<xsl:template match="/">' +
3034
+ ' <xsl:call-template name="nodes">' +
3035
+ ' <xsl:with-param name="node" select="/root" />' +
3036
+ ' </xsl:call-template>' +
3037
+ '</xsl:template>' +
3038
+ '<xsl:template name="nodes">' +
3039
+ ' <xsl:param name="node" />' +
3040
+ ' <ul>' +
3041
+ ' <xsl:for-each select="$node/item">' +
3042
+ ' <xsl:variable name="children" select="count(./item) &gt; 0" />' +
3043
+ ' <li>' +
3044
+ ' <xsl:attribute name="class">' +
3045
+ ' <xsl:if test="position() = last()">jstree-last </xsl:if>' +
3046
+ ' <xsl:choose>' +
3047
+ ' <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
3048
+ ' <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
3049
+ ' <xsl:otherwise>jstree-leaf </xsl:otherwise>' +
3050
+ ' </xsl:choose>' +
3051
+ ' <xsl:value-of select="@class" />' +
3052
+ ' </xsl:attribute>' +
3053
+ ' <xsl:for-each select="@*">' +
3054
+ ' <xsl:if test="name() != \'class\' and name() != \'state\' and name() != \'hasChildren\'">' +
3055
+ ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
3056
+ ' </xsl:if>' +
3057
+ ' </xsl:for-each>' +
3058
+ ' <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' +
3059
+ ' <xsl:for-each select="content/name">' +
3060
+ ' <a>' +
3061
+ ' <xsl:attribute name="href">' +
3062
+ ' <xsl:choose>' +
3063
+ ' <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
3064
+ ' <xsl:otherwise>#</xsl:otherwise>' +
3065
+ ' </xsl:choose>' +
3066
+ ' </xsl:attribute>' +
3067
+ ' <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
3068
+ ' <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
3069
+ ' <xsl:for-each select="@*">' +
3070
+ ' <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
3071
+ ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
3072
+ ' </xsl:if>' +
3073
+ ' </xsl:for-each>' +
3074
+ ' <ins>' +
3075
+ ' <xsl:attribute name="class">jstree-icon ' +
3076
+ ' <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
3077
+ ' </xsl:attribute>' +
3078
+ ' <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
3079
+ ' <xsl:text>&#xa0;</xsl:text>' +
3080
+ ' </ins>' +
3081
+ ' <xsl:copy-of select="./child::node()" />' +
3082
+ ' </a>' +
3083
+ ' </xsl:for-each>' +
3084
+ ' <xsl:if test="$children or @hasChildren"><xsl:call-template name="nodes"><xsl:with-param name="node" select="current()" /></xsl:call-template></xsl:if>' +
3085
+ ' </li>' +
3086
+ ' </xsl:for-each>' +
3087
+ ' </ul>' +
3088
+ '</xsl:template>' +
3089
+ '</xsl:stylesheet>',
3090
+
3091
+ 'flat' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
3092
+ '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
3093
+ '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/xml" />' +
3094
+ '<xsl:template match="/">' +
3095
+ ' <ul>' +
3096
+ ' <xsl:for-each select="//item[not(@parent_id) or @parent_id=0 or not(@parent_id = //item/@id)]">' + /* the last `or` may be removed */
3097
+ ' <xsl:call-template name="nodes">' +
3098
+ ' <xsl:with-param name="node" select="." />' +
3099
+ ' <xsl:with-param name="is_last" select="number(position() = last())" />' +
3100
+ ' </xsl:call-template>' +
3101
+ ' </xsl:for-each>' +
3102
+ ' </ul>' +
3103
+ '</xsl:template>' +
3104
+ '<xsl:template name="nodes">' +
3105
+ ' <xsl:param name="node" />' +
3106
+ ' <xsl:param name="is_last" />' +
3107
+ ' <xsl:variable name="children" select="count(//item[@parent_id=$node/attribute::id]) &gt; 0" />' +
3108
+ ' <li>' +
3109
+ ' <xsl:attribute name="class">' +
3110
+ ' <xsl:if test="$is_last = true()">jstree-last </xsl:if>' +
3111
+ ' <xsl:choose>' +
3112
+ ' <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
3113
+ ' <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
3114
+ ' <xsl:otherwise>jstree-leaf </xsl:otherwise>' +
3115
+ ' </xsl:choose>' +
3116
+ ' <xsl:value-of select="@class" />' +
3117
+ ' </xsl:attribute>' +
3118
+ ' <xsl:for-each select="@*">' +
3119
+ ' <xsl:if test="name() != \'parent_id\' and name() != \'hasChildren\' and name() != \'class\' and name() != \'state\'">' +
3120
+ ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
3121
+ ' </xsl:if>' +
3122
+ ' </xsl:for-each>' +
3123
+ ' <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' +
3124
+ ' <xsl:for-each select="content/name">' +
3125
+ ' <a>' +
3126
+ ' <xsl:attribute name="href">' +
3127
+ ' <xsl:choose>' +
3128
+ ' <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
3129
+ ' <xsl:otherwise>#</xsl:otherwise>' +
3130
+ ' </xsl:choose>' +
3131
+ ' </xsl:attribute>' +
3132
+ ' <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
3133
+ ' <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
3134
+ ' <xsl:for-each select="@*">' +
3135
+ ' <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
3136
+ ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
3137
+ ' </xsl:if>' +
3138
+ ' </xsl:for-each>' +
3139
+ ' <ins>' +
3140
+ ' <xsl:attribute name="class">jstree-icon ' +
3141
+ ' <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
3142
+ ' </xsl:attribute>' +
3143
+ ' <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
3144
+ ' <xsl:text>&#xa0;</xsl:text>' +
3145
+ ' </ins>' +
3146
+ ' <xsl:copy-of select="./child::node()" />' +
3147
+ ' </a>' +
3148
+ ' </xsl:for-each>' +
3149
+ ' <xsl:if test="$children">' +
3150
+ ' <ul>' +
3151
+ ' <xsl:for-each select="//item[@parent_id=$node/attribute::id]">' +
3152
+ ' <xsl:call-template name="nodes">' +
3153
+ ' <xsl:with-param name="node" select="." />' +
3154
+ ' <xsl:with-param name="is_last" select="number(position() = last())" />' +
3155
+ ' </xsl:call-template>' +
3156
+ ' </xsl:for-each>' +
3157
+ ' </ul>' +
3158
+ ' </xsl:if>' +
3159
+ ' </li>' +
3160
+ '</xsl:template>' +
3161
+ '</xsl:stylesheet>'
3162
+ },
3163
+ escape_xml = function(string) {
3164
+ return string
3165
+ .toString()
3166
+ .replace(/&/g, '&amp;')
3167
+ .replace(/</g, '&lt;')
3168
+ .replace(/>/g, '&gt;')
3169
+ .replace(/"/g, '&quot;')
3170
+ .replace(/'/g, '&apos;');
3171
+ };
3172
+ $.jstree.plugin("xml_data", {
3173
+ defaults : {
3174
+ data : false,
3175
+ ajax : false,
3176
+ xsl : "flat",
3177
+ clean_node : false,
3178
+ correct_state : true,
3179
+ get_skip_empty : false,
3180
+ get_include_preamble : true
3181
+ },
3182
+ _fn : {
3183
+ load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_xml(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
3184
+ _is_loaded : function (obj) {
3185
+ var s = this._get_settings().xml_data;
3186
+ obj = this._get_node(obj);
3187
+ return obj == -1 || !obj || (!s.ajax && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
3188
+ },
3189
+ load_node_xml : function (obj, s_call, e_call) {
3190
+ var s = this.get_settings().xml_data,
3191
+ error_func = function () {},
3192
+ success_func = function () {};
3193
+
3194
+ obj = this._get_node(obj);
3195
+ if(obj && obj !== -1) {
3196
+ if(obj.data("jstree-is-loading")) { return; }
3197
+ else { obj.data("jstree-is-loading",true); }
3198
+ }
3199
+ switch(!0) {
3200
+ case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
3201
+ case ($.isFunction(s.data)):
3202
+ s.data.call(this, obj, $.proxy(function (d) {
3203
+ this.parse_xml(d, $.proxy(function (d) {
3204
+ if(d) {
3205
+ d = d.replace(/ ?xmlns="[^"]*"/ig, "");
3206
+ if(d.length > 10) {
3207
+ d = $(d);
3208
+ if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
3209
+ else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree-is-loading"); }
3210
+ if(s.clean_node) { this.clean_node(obj); }
3211
+ if(s_call) { s_call.call(this); }
3212
+ }
3213
+ else {
3214
+ if(obj && obj !== -1) {
3215
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
3216
+ obj.removeData("jstree-is-loading");
3217
+ if(s.correct_state) {
3218
+ this.correct_state(obj);
3219
+ if(s_call) { s_call.call(this); }
3220
+ }
3221
+ }
3222
+ else {
3223
+ if(s.correct_state) {
3224
+ this.get_container().children("ul").empty();
3225
+ if(s_call) { s_call.call(this); }
3226
+ }
3227
+ }
3228
+ }
3229
+ }
3230
+ }, this));
3231
+ }, this));
3232
+ break;
3233
+ case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
3234
+ if(!obj || obj == -1) {
3235
+ this.parse_xml(s.data, $.proxy(function (d) {
3236
+ if(d) {
3237
+ d = d.replace(/ ?xmlns="[^"]*"/ig, "");
3238
+ if(d.length > 10) {
3239
+ d = $(d);
3240
+ this.get_container().children("ul").empty().append(d.children());
3241
+ if(s.clean_node) { this.clean_node(obj); }
3242
+ if(s_call) { s_call.call(this); }
3243
+ }
3244
+ }
3245
+ else {
3246
+ if(s.correct_state) {
3247
+ this.get_container().children("ul").empty();
3248
+ if(s_call) { s_call.call(this); }
3249
+ }
3250
+ }
3251
+ }, this));
3252
+ }
3253
+ break;
3254
+ case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
3255
+ error_func = function (x, t, e) {
3256
+ var ef = this.get_settings().xml_data.ajax.error;
3257
+ if(ef) { ef.call(this, x, t, e); }
3258
+ if(obj !== -1 && obj.length) {
3259
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
3260
+ obj.removeData("jstree-is-loading");
3261
+ if(t === "success" && s.correct_state) { this.correct_state(obj); }
3262
+ }
3263
+ else {
3264
+ if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
3265
+ }
3266
+ if(e_call) { e_call.call(this); }
3267
+ };
3268
+ success_func = function (d, t, x) {
3269
+ d = x.responseText;
3270
+ var sf = this.get_settings().xml_data.ajax.success;
3271
+ if(sf) { d = sf.call(this,d,t,x) || d; }
3272
+ if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {
3273
+ return error_func.call(this, x, t, "");
3274
+ }
3275
+ this.parse_xml(d, $.proxy(function (d) {
3276
+ if(d) {
3277
+ d = d.replace(/ ?xmlns="[^"]*"/ig, "");
3278
+ if(d.length > 10) {
3279
+ d = $(d);
3280
+ if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
3281
+ else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree-is-loading"); }
3282
+ if(s.clean_node) { this.clean_node(obj); }
3283
+ if(s_call) { s_call.call(this); }
3284
+ }
3285
+ else {
3286
+ if(obj && obj !== -1) {
3287
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
3288
+ obj.removeData("jstree-is-loading");
3289
+ if(s.correct_state) {
3290
+ this.correct_state(obj);
3291
+ if(s_call) { s_call.call(this); }
3292
+ }
3293
+ }
3294
+ else {
3295
+ if(s.correct_state) {
3296
+ this.get_container().children("ul").empty();
3297
+ if(s_call) { s_call.call(this); }
3298
+ }
3299
+ }
3300
+ }
3301
+ }
3302
+ }, this));
3303
+ };
3304
+ s.ajax.context = this;
3305
+ s.ajax.error = error_func;
3306
+ s.ajax.success = success_func;
3307
+ if(!s.ajax.dataType) { s.ajax.dataType = "xml"; }
3308
+ if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
3309
+ if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
3310
+ $.ajax(s.ajax);
3311
+ break;
3312
+ }
3313
+ },
3314
+ parse_xml : function (xml, callback) {
3315
+ var s = this._get_settings().xml_data;
3316
+ $.vakata.xslt(xml, xsl[s.xsl], callback);
3317
+ },
3318
+ get_xml : function (tp, obj, li_attr, a_attr, is_callback) {
3319
+ var result = "",
3320
+ s = this._get_settings(),
3321
+ _this = this,
3322
+ tmp1, tmp2, li, a, lang;
3323
+ if(!tp) { tp = "flat"; }
3324
+ if(!is_callback) { is_callback = 0; }
3325
+ obj = this._get_node(obj);
3326
+ if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
3327
+ li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
3328
+ if(!is_callback && this.data.types && $.inArray(s.types.type_attr, li_attr) === -1) { li_attr.push(s.types.type_attr); }
3329
+
3330
+ a_attr = $.isArray(a_attr) ? a_attr : [ ];
3331
+
3332
+ if(!is_callback) {
3333
+ if(s.xml_data.get_include_preamble) {
3334
+ result += '<' + '?xml version="1.0" encoding="UTF-8"?' + '>';
3335
+ }
3336
+ result += "<root>";
3337
+ }
3338
+ obj.each(function () {
3339
+ result += "<item";
3340
+ li = $(this);
3341
+ $.each(li_attr, function (i, v) {
3342
+ var t = li.attr(v);
3343
+ if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {
3344
+ result += " " + v + "=\"" + escape_xml((" " + (t || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\"";
3345
+ }
3346
+ });
3347
+ if(li.hasClass("jstree-open")) { result += " state=\"open\""; }
3348
+ if(li.hasClass("jstree-closed")) { result += " state=\"closed\""; }
3349
+ if(tp === "flat") { result += " parent_id=\"" + escape_xml(is_callback) + "\""; }
3350
+ result += ">";
3351
+ result += "<content>";
3352
+ a = li.children("a");
3353
+ a.each(function () {
3354
+ tmp1 = $(this);
3355
+ lang = false;
3356
+ result += "<name";
3357
+ if($.inArray("languages", s.plugins) !== -1) {
3358
+ $.each(s.languages, function (k, z) {
3359
+ if(tmp1.hasClass(z)) { result += " lang=\"" + escape_xml(z) + "\""; lang = z; return false; }
3360
+ });
3361
+ }
3362
+ if(a_attr.length) {
3363
+ $.each(a_attr, function (k, z) {
3364
+ var t = tmp1.attr(z);
3365
+ if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {
3366
+ result += " " + z + "=\"" + escape_xml((" " + t || "").replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\"";
3367
+ }
3368
+ });
3369
+ }
3370
+ if(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
3371
+ result += ' icon="' + escape_xml(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + '"';
3372
+ }
3373
+ if(tmp1.children("ins").get(0).style.backgroundImage.length) {
3374
+ result += ' icon="' + escape_xml(tmp1.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","").replace(/'/ig,"").replace(/"/ig,"")) + '"';
3375
+ }
3376
+ result += ">";
3377
+ result += "<![CDATA[" + _this.get_text(tmp1, lang) + "]]>";
3378
+ result += "</name>";
3379
+ });
3380
+ result += "</content>";
3381
+ tmp2 = li[0].id || true;
3382
+ li = li.find("> ul > li");
3383
+ if(li.length) { tmp2 = _this.get_xml(tp, li, li_attr, a_attr, tmp2); }
3384
+ else { tmp2 = ""; }
3385
+ if(tp == "nest") { result += tmp2; }
3386
+ result += "</item>";
3387
+ if(tp == "flat") { result += tmp2; }
3388
+ });
3389
+ if(!is_callback) { result += "</root>"; }
3390
+ return result;
3391
+ }
3392
+ }
3393
+ });
3394
+ })(jQuery);
3395
+ //*/
3396
+
3397
+ /*
3398
+ * jsTree search plugin
3399
+ * Enables both sync and async search on the tree
3400
+ * DOES NOT WORK WITH JSON PROGRESSIVE RENDER
3401
+ */
3402
+ (function ($) {
3403
+ $.expr[':'].jstree_contains = function(a,i,m){
3404
+ return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
3405
+ };
3406
+ $.expr[':'].jstree_title_contains = function(a,i,m) {
3407
+ return (a.getAttribute("title") || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
3408
+ };
3409
+ $.jstree.plugin("search", {
3410
+ __init : function () {
3411
+ this.data.search.str = "";
3412
+ this.data.search.result = $();
3413
+ if(this._get_settings().search.show_only_matches) {
3414
+ this.get_container()
3415
+ .bind("search.jstree", function (e, data) {
3416
+ $(this).children("ul").find("li").hide().removeClass("jstree-last");
3417
+ data.rslt.nodes.parentsUntil(".jstree").andSelf().show()
3418
+ .filter("ul").each(function () { $(this).children("li:visible").eq(-1).addClass("jstree-last"); });
3419
+ })
3420
+ .bind("clear_search.jstree", function () {
3421
+ $(this).children("ul").find("li").css("display","").end().end().jstree("clean_node", -1);
3422
+ });
3423
+ }
3424
+ },
3425
+ defaults : {
3426
+ ajax : false,
3427
+ search_method : "jstree_contains", // for case insensitive - jstree_contains
3428
+ show_only_matches : false
3429
+ },
3430
+ _fn : {
3431
+ search : function (str, skip_async) {
3432
+ if($.trim(str) === "") { this.clear_search(); return; }
3433
+ var s = this.get_settings().search,
3434
+ t = this,
3435
+ error_func = function () { },
3436
+ success_func = function () { };
3437
+ this.data.search.str = str;
3438
+
3439
+ if(!skip_async && s.ajax !== false && this.get_container_ul().find("li.jstree-closed:not(:has(ul)):eq(0)").length > 0) {
3440
+ this.search.supress_callback = true;
3441
+ error_func = function () { };
3442
+ success_func = function (d, t, x) {
3443
+ var sf = this.get_settings().search.ajax.success;
3444
+ if(sf) { d = sf.call(this,d,t,x) || d; }
3445
+ this.data.search.to_open = d;
3446
+ this._search_open();
3447
+ };
3448
+ s.ajax.context = this;
3449
+ s.ajax.error = error_func;
3450
+ s.ajax.success = success_func;
3451
+ if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, str); }
3452
+ if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, str); }
3453
+ if(!s.ajax.data) { s.ajax.data = { "search_string" : str }; }
3454
+ if(!s.ajax.dataType || /^json/.exec(s.ajax.dataType)) { s.ajax.dataType = "json"; }
3455
+ $.ajax(s.ajax);
3456
+ return;
3457
+ }
3458
+ if(this.data.search.result.length) { this.clear_search(); }
3459
+ this.data.search.result = this.get_container().find("a" + (this.data.languages ? "." + this.get_lang() : "" ) + ":" + (s.search_method) + "(" + this.data.search.str + ")");
3460
+ this.data.search.result.addClass("jstree-search").parent().parents(".jstree-closed").each(function () {
3461
+ t.open_node(this, false, true);
3462
+ });
3463
+ this.__callback({ nodes : this.data.search.result, str : str });
3464
+ },
3465
+ clear_search : function (str) {
3466
+ this.data.search.result.removeClass("jstree-search");
3467
+ this.__callback(this.data.search.result);
3468
+ this.data.search.result = $();
3469
+ },
3470
+ _search_open : function (is_callback) {
3471
+ var _this = this,
3472
+ done = true,
3473
+ current = [],
3474
+ remaining = [];
3475
+ if(this.data.search.to_open.length) {
3476
+ $.each(this.data.search.to_open, function (i, val) {
3477
+ if(val == "#") { return true; }
3478
+ if($(val).length && $(val).is(".jstree-closed")) { current.push(val); }
3479
+ else { remaining.push(val); }
3480
+ });
3481
+ if(current.length) {
3482
+ this.data.search.to_open = remaining;
3483
+ $.each(current, function (i, val) {
3484
+ _this.open_node(val, function () { _this._search_open(true); });
3485
+ });
3486
+ done = false;
3487
+ }
3488
+ }
3489
+ if(done) { this.search(this.data.search.str, true); }
3490
+ }
3491
+ }
3492
+ });
3493
+ })(jQuery);
3494
+ //*/
3495
+
3496
+ /*
3497
+ * jsTree contextmenu plugin
3498
+ */
3499
+ (function ($) {
3500
+ $.vakata.context = {
3501
+ hide_on_mouseleave : false,
3502
+
3503
+ cnt : $("<div id='vakata-contextmenu' />"),
3504
+ vis : false,
3505
+ tgt : false,
3506
+ par : false,
3507
+ func : false,
3508
+ data : false,
3509
+ rtl : false,
3510
+ show : function (s, t, x, y, d, p, rtl) {
3511
+ $.vakata.context.rtl = !!rtl;
3512
+ var html = $.vakata.context.parse(s), h, w;
3513
+ if(!html) { return; }
3514
+ $.vakata.context.vis = true;
3515
+ $.vakata.context.tgt = t;
3516
+ $.vakata.context.par = p || t || null;
3517
+ $.vakata.context.data = d || null;
3518
+ $.vakata.context.cnt
3519
+ .html(html)
3520
+ .css({ "visibility" : "hidden", "display" : "block", "left" : 0, "top" : 0 });
3521
+
3522
+ if($.vakata.context.hide_on_mouseleave) {
3523
+ $.vakata.context.cnt
3524
+ .one("mouseleave", function(e) { $.vakata.context.hide(); });
3525
+ }
3526
+
3527
+ h = $.vakata.context.cnt.height();
3528
+ w = $.vakata.context.cnt.width();
3529
+ if(x + w > $(document).width()) {
3530
+ x = $(document).width() - (w + 5);
3531
+ $.vakata.context.cnt.find("li > ul").addClass("right");
3532
+ }
3533
+ if(y + h > $(document).height()) {
3534
+ y = y - (h + t[0].offsetHeight);
3535
+ $.vakata.context.cnt.find("li > ul").addClass("bottom");
3536
+ }
3537
+
3538
+ $.vakata.context.cnt
3539
+ .css({ "left" : x, "top" : y })
3540
+ .find("li:has(ul)")
3541
+ .bind("mouseenter", function (e) {
3542
+ var w = $(document).width(),
3543
+ h = $(document).height(),
3544
+ ul = $(this).children("ul").show();
3545
+ if(w !== $(document).width()) { ul.toggleClass("right"); }
3546
+ if(h !== $(document).height()) { ul.toggleClass("bottom"); }
3547
+ })
3548
+ .bind("mouseleave", function (e) {
3549
+ $(this).children("ul").hide();
3550
+ })
3551
+ .end()
3552
+ .css({ "visibility" : "visible" })
3553
+ .show();
3554
+ $(document).triggerHandler("context_show.vakata");
3555
+ },
3556
+ hide : function () {
3557
+ $.vakata.context.vis = false;
3558
+ $.vakata.context.cnt.attr("class","").css({ "visibility" : "hidden" });
3559
+ $(document).triggerHandler("context_hide.vakata");
3560
+ },
3561
+ parse : function (s, is_callback) {
3562
+ if(!s) { return false; }
3563
+ var str = "",
3564
+ tmp = false,
3565
+ was_sep = true;
3566
+ if(!is_callback) { $.vakata.context.func = {}; }
3567
+ str += "<ul>";
3568
+ $.each(s, function (i, val) {
3569
+ if(!val) { return true; }
3570
+ $.vakata.context.func[i] = val.action;
3571
+ if(!was_sep && val.separator_before) {
3572
+ str += "<li class='vakata-separator vakata-separator-before'></li>";
3573
+ }
3574
+ was_sep = false;
3575
+ str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
3576
+ if(val.icon && val.icon.indexOf("/") === -1) { str += " class='" + val.icon + "' "; }
3577
+ if(val.icon && val.icon.indexOf("/") !== -1) { str += " style='background:url(" + val.icon + ") center center no-repeat;' "; }
3578
+ str += ">&#160;</ins><a href='#' rel='" + i + "'>";
3579
+ if(val.submenu) {
3580
+ str += "<span style='float:" + ($.vakata.context.rtl ? "left" : "right") + ";'>&raquo;</span>";
3581
+ }
3582
+ str += val.label + "</a>";
3583
+ if(val.submenu) {
3584
+ tmp = $.vakata.context.parse(val.submenu, true);
3585
+ if(tmp) { str += tmp; }
3586
+ }
3587
+ str += "</li>";
3588
+ if(val.separator_after) {
3589
+ str += "<li class='vakata-separator vakata-separator-after'></li>";
3590
+ was_sep = true;
3591
+ }
3592
+ });
3593
+ str = str.replace(/<li class\='vakata-separator vakata-separator-after'\><\/li\>$/,"");
3594
+ str += "</ul>";
3595
+ $(document).triggerHandler("context_parse.vakata");
3596
+ return str.length > 10 ? str : false;
3597
+ },
3598
+ exec : function (i) {
3599
+ if($.isFunction($.vakata.context.func[i])) {
3600
+ // if is string - eval and call it!
3601
+ $.vakata.context.func[i].call($.vakata.context.data, $.vakata.context.par);
3602
+ return true;
3603
+ }
3604
+ else { return false; }
3605
+ }
3606
+ };
3607
+ $(function () {
3608
+ var css_string = '' +
3609
+ '#vakata-contextmenu { display:block; visibility:hidden; left:0; top:-200px; position:absolute; margin:0; padding:0; min-width:180px; background:#ebebeb; border:1px solid silver; z-index:10000; *width:180px; } ' +
3610
+ '#vakata-contextmenu ul { min-width:180px; *width:180px; } ' +
3611
+ '#vakata-contextmenu ul, #vakata-contextmenu li { margin:0; padding:0; list-style-type:none; display:block; } ' +
3612
+ '#vakata-contextmenu li { line-height:20px; min-height:20px; position:relative; padding:0px; } ' +
3613
+ '#vakata-contextmenu li a { padding:1px 6px; line-height:17px; display:block; text-decoration:none; margin:1px 1px 0 1px; } ' +
3614
+ '#vakata-contextmenu li ins { float:left; width:16px; height:16px; text-decoration:none; margin-right:2px; } ' +
3615
+ '#vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background:gray; color:white; } ' +
3616
+ '#vakata-contextmenu li ul { display:none; position:absolute; top:-2px; left:100%; background:#ebebeb; border:1px solid gray; } ' +
3617
+ '#vakata-contextmenu .right { right:100%; left:auto; } ' +
3618
+ '#vakata-contextmenu .bottom { bottom:-1px; top:auto; } ' +
3619
+ '#vakata-contextmenu li.vakata-separator { min-height:0; height:1px; line-height:1px; font-size:1px; overflow:hidden; margin:0 2px; background:silver; /* border-top:1px solid #fefefe; */ padding:0; } ';
3620
+ $.vakata.css.add_sheet({ str : css_string, title : "vakata" });
3621
+ $.vakata.context.cnt
3622
+ .delegate("a","click", function (e) { e.preventDefault(); })
3623
+ .delegate("a","mouseup", function (e) {
3624
+ if(!$(this).parent().hasClass("jstree-contextmenu-disabled") && $.vakata.context.exec($(this).attr("rel"))) {
3625
+ $.vakata.context.hide();
3626
+ }
3627
+ else { $(this).blur(); }
3628
+ })
3629
+ .delegate("a","mouseover", function () {
3630
+ $.vakata.context.cnt.find(".vakata-hover").removeClass("vakata-hover");
3631
+ })
3632
+ .appendTo("body");
3633
+ $(document).bind("mousedown", function (e) { if($.vakata.context.vis && !$.contains($.vakata.context.cnt[0], e.target)) { $.vakata.context.hide(); } });
3634
+ // modified by pär to fix problems with wordpress hotkeys
3635
+ if(false && typeof $.hotkeys !== "undefined") {
3636
+ $(document)
3637
+ .bind("keydown", "up", function (e) {
3638
+ if($.vakata.context.vis) {
3639
+ var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").prevAll("li:not(.vakata-separator)").first();
3640
+ if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").last(); }
3641
+ o.addClass("vakata-hover");
3642
+ e.stopImmediatePropagation();
3643
+ e.preventDefault();
3644
+ }
3645
+ })
3646
+ .bind("keydown", "down", function (e) {
3647
+ if($.vakata.context.vis) {
3648
+ var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").nextAll("li:not(.vakata-separator)").first();
3649
+ if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").first(); }
3650
+ o.addClass("vakata-hover");
3651
+ e.stopImmediatePropagation();
3652
+ e.preventDefault();
3653
+ }
3654
+ })
3655
+ .bind("keydown", "right", function (e) {
3656
+ if($.vakata.context.vis) {
3657
+ $.vakata.context.cnt.find(".vakata-hover").children("ul").show().children("li:not(.vakata-separator)").removeClass("vakata-hover").first().addClass("vakata-hover");
3658
+ e.stopImmediatePropagation();
3659
+ e.preventDefault();
3660
+ }
3661
+ })
3662
+ .bind("keydown", "left", function (e) {
3663
+ if($.vakata.context.vis) {
3664
+ $.vakata.context.cnt.find(".vakata-hover").children("ul").hide().children(".vakata-separator").removeClass("vakata-hover");
3665
+ e.stopImmediatePropagation();
3666
+ e.preventDefault();
3667
+ }
3668
+ })
3669
+ .bind("keydown", "esc", function (e) {
3670
+ $.vakata.context.hide();
3671
+ e.preventDefault();
3672
+ })
3673
+ .bind("keydown", "space", function (e) {
3674
+ $.vakata.context.cnt.find(".vakata-hover").last().children("a").click();
3675
+ e.preventDefault();
3676
+ });
3677
+ }
3678
+ });
3679
+
3680
+ $.jstree.plugin("contextmenu", {
3681
+ __init : function () {
3682
+ this.get_container()
3683
+ .delegate("a", "contextmenu.jstree", $.proxy(function (e) {
3684
+ e.preventDefault();
3685
+ if(!$(e.currentTarget).hasClass("jstree-loading")) {
3686
+ this.show_contextmenu(e.currentTarget, e.pageX, e.pageY);
3687
+ }
3688
+ }, this))
3689
+ .delegate("a", "click.jstree", $.proxy(function (e) {
3690
+ if(this.data.contextmenu) {
3691
+ $.vakata.context.hide();
3692
+ }
3693
+ }, this))
3694
+ .bind("destroy.jstree", $.proxy(function () {
3695
+ // TODO: move this to descruct method
3696
+ if(this.data.contextmenu) {
3697
+ $.vakata.context.hide();
3698
+ }
3699
+ }, this));
3700
+ $(document).bind("context_hide.vakata", $.proxy(function () { this.data.contextmenu = false; }, this));
3701
+ },
3702
+ defaults : {
3703
+ select_node : false, // requires UI plugin
3704
+ show_at_node : true,
3705
+ items : { // Could be a function that should return an object like this one
3706
+ "create" : {
3707
+ "separator_before" : false,
3708
+ "separator_after" : true,
3709
+ "label" : "Create",
3710
+ "action" : function (obj) { this.create(obj); }
3711
+ },
3712
+ "rename" : {
3713
+ "separator_before" : false,
3714
+ "separator_after" : false,
3715
+ "label" : "Rename",
3716
+ "action" : function (obj) { this.rename(obj); }
3717
+ },
3718
+ "remove" : {
3719
+ "separator_before" : false,
3720
+ "icon" : false,
3721
+ "separator_after" : false,
3722
+ "label" : "Delete",
3723
+ "action" : function (obj) { if(this.is_selected(obj)) { this.remove(); } else { this.remove(obj); } }
3724
+ },
3725
+ "ccp" : {
3726
+ "separator_before" : true,
3727
+ "icon" : false,
3728
+ "separator_after" : false,
3729
+ "label" : "Edit",
3730
+ "action" : false,
3731
+ "submenu" : {
3732
+ "cut" : {
3733
+ "separator_before" : false,
3734
+ "separator_after" : false,
3735
+ "label" : "Cut",
3736
+ "action" : function (obj) { this.cut(obj); }
3737
+ },
3738
+ "copy" : {
3739
+ "separator_before" : false,
3740
+ "icon" : false,
3741
+ "separator_after" : false,
3742
+ "label" : "Copy",
3743
+ "action" : function (obj) { this.copy(obj); }
3744
+ },
3745
+ "paste" : {
3746
+ "separator_before" : false,
3747
+ "icon" : false,
3748
+ "separator_after" : false,
3749
+ "label" : "Paste",
3750
+ "action" : function (obj) { this.paste(obj); }
3751
+ }
3752
+ }
3753
+ }
3754
+ }
3755
+ },
3756
+ _fn : {
3757
+ show_contextmenu : function (obj, x, y) {
3758
+ obj = this._get_node(obj);
3759
+ var s = this.get_settings().contextmenu,
3760
+ a = obj.children("a:visible:eq(0)"),
3761
+ o = false,
3762
+ i = false;
3763
+ if(s.select_node && this.data.ui && !this.is_selected(obj)) {
3764
+ this.deselect_all();
3765
+ this.select_node(obj, true);
3766
+ }
3767
+ if(s.show_at_node || typeof x === "undefined" || typeof y === "undefined") {
3768
+ o = a.offset();
3769
+ x = o.left;
3770
+ y = o.top + this.data.core.li_height;
3771
+ }
3772
+ i = obj.data("jstree") && obj.data("jstree").contextmenu ? obj.data("jstree").contextmenu : s.items;
3773
+ if($.isFunction(i)) { i = i.call(this, obj); }
3774
+ this.data.contextmenu = true;
3775
+ $.vakata.context.show(i, a, x, y, this, obj, this._get_settings().core.rtl);
3776
+ if(this.data.themes) { $.vakata.context.cnt.attr("class", "jstree-" + this.data.themes.theme + "-context"); }
3777
+ }
3778
+ }
3779
+ });
3780
+ })(jQuery);
3781
+ //*/
3782
+
3783
+ /*
3784
+ * jsTree types plugin
3785
+ * Adds support types of nodes
3786
+ * You can set an attribute on each li node, that represents its type.
3787
+ * According to the type setting the node may get custom icon/validation rules
3788
+ */
3789
+ (function ($) {
3790
+ $.jstree.plugin("types", {
3791
+ __init : function () {
3792
+ var s = this._get_settings().types;
3793
+ this.data.types.attach_to = [];
3794
+ this.get_container()
3795
+ .bind("init.jstree", $.proxy(function () {
3796
+ var types = s.types,
3797
+ attr = s.type_attr,
3798
+ icons_css = "",
3799
+ _this = this;
3800
+
3801
+ $.each(types, function (i, tp) {
3802
+ $.each(tp, function (k, v) {
3803
+ if(!/^(max_depth|max_children|icon|valid_children)$/.test(k)) { _this.data.types.attach_to.push(k); }
3804
+ });
3805
+ if(!tp.icon) { return true; }
3806
+ if( tp.icon.image || tp.icon.position) {
3807
+ if(i == "default") { icons_css += '.jstree-' + _this.get_index() + ' a > .jstree-icon { '; }
3808
+ else { icons_css += '.jstree-' + _this.get_index() + ' li[' + attr + '="' + i + '"] > a > .jstree-icon { '; }
3809
+ if(tp.icon.image) { icons_css += ' background-image:url(' + tp.icon.image + '); '; }
3810
+ if(tp.icon.position){ icons_css += ' background-position:' + tp.icon.position + '; '; }
3811
+ else { icons_css += ' background-position:0 0; '; }
3812
+ icons_css += '} ';
3813
+ }
3814
+ });
3815
+ if(icons_css !== "") { $.vakata.css.add_sheet({ 'str' : icons_css, title : "jstree-types" }); }
3816
+ }, this))
3817
+ .bind("before.jstree", $.proxy(function (e, data) {
3818
+ var s, t,
3819
+ o = this._get_settings().types.use_data ? this._get_node(data.args[0]) : false,
3820
+ d = o && o !== -1 && o.length ? o.data("jstree") : false;
3821
+ if(d && d.types && d.types[data.func] === false) { e.stopImmediatePropagation(); return false; }
3822
+ if($.inArray(data.func, this.data.types.attach_to) !== -1) {
3823
+ if(!data.args[0] || (!data.args[0].tagName && !data.args[0].jquery)) { return; }
3824
+ s = this._get_settings().types.types;
3825
+ t = this._get_type(data.args[0]);
3826
+ if(
3827
+ (
3828
+ (s[t] && typeof s[t][data.func] !== "undefined") ||
3829
+ (s["default"] && typeof s["default"][data.func] !== "undefined")
3830
+ ) && this._check(data.func, data.args[0]) === false
3831
+ ) {
3832
+ e.stopImmediatePropagation();
3833
+ return false;
3834
+ }
3835
+ }
3836
+ }, this));
3837
+ if(is_ie6) {
3838
+ this.get_container()
3839
+ .bind("load_node.jstree set_type.jstree", $.proxy(function (e, data) {
3840
+ var r = data && data.rslt && data.rslt.obj && data.rslt.obj !== -1 ? this._get_node(data.rslt.obj).parent() : this.get_container_ul(),
3841
+ c = false,
3842
+ s = this._get_settings().types;
3843
+ $.each(s.types, function (i, tp) {
3844
+ if(tp.icon && (tp.icon.image || tp.icon.position)) {
3845
+ c = i === "default" ? r.find("li > a > .jstree-icon") : r.find("li[" + s.type_attr + "='" + i + "'] > a > .jstree-icon");
3846
+ if(tp.icon.image) { c.css("backgroundImage","url(" + tp.icon.image + ")"); }
3847
+ c.css("backgroundPosition", tp.icon.position || "0 0");
3848
+ }
3849
+ });
3850
+ }, this));
3851
+ }
3852
+ },
3853
+ defaults : {
3854
+ // defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking)
3855
+ max_children : -1,
3856
+ // defines the maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking)
3857
+ max_depth : -1,
3858
+ // defines valid node types for the root nodes
3859
+ valid_children : "all",
3860
+
3861
+ // whether to use $.data
3862
+ use_data : false,
3863
+ // where is the type stores (the rel attribute of the LI element)
3864
+ type_attr : "rel",
3865
+ // a list of types
3866
+ types : {
3867
+ // the default type
3868
+ "default" : {
3869
+ "max_children" : -1,
3870
+ "max_depth" : -1,
3871
+ "valid_children": "all"
3872
+
3873
+ // Bound functions - you can bind any other function here (using boolean or function)
3874
+ //"select_node" : true
3875
+ }
3876
+ }
3877
+ },
3878
+ _fn : {
3879
+ _types_notify : function (n, data) {
3880
+ if(data.type && this._get_settings().types.use_data) {
3881
+ this.set_type(data.type, n);
3882
+ }
3883
+ },
3884
+ _get_type : function (obj) {
3885
+ obj = this._get_node(obj);
3886
+ return (!obj || !obj.length) ? false : obj.attr(this._get_settings().types.type_attr) || "default";
3887
+ },
3888
+ set_type : function (str, obj) {
3889
+ obj = this._get_node(obj);
3890
+ var ret = (!obj.length || !str) ? false : obj.attr(this._get_settings().types.type_attr, str);
3891
+ if(ret) { this.__callback({ obj : obj, type : str}); }
3892
+ return ret;
3893
+ },
3894
+ _check : function (rule, obj, opts) {
3895
+ obj = this._get_node(obj);
3896
+ var v = false, t = this._get_type(obj), d = 0, _this = this, s = this._get_settings().types, data = false;
3897
+ if(obj === -1) {
3898
+ if(!!s[rule]) { v = s[rule]; }
3899
+ else { return; }
3900
+ }
3901
+ else {
3902
+ if(t === false) { return; }
3903
+ data = s.use_data ? obj.data("jstree") : false;
3904
+ if(data && data.types && typeof data.types[rule] !== "undefined") { v = data.types[rule]; }
3905
+ else if(!!s.types[t] && typeof s.types[t][rule] !== "undefined") { v = s.types[t][rule]; }
3906
+ else if(!!s.types["default"] && typeof s.types["default"][rule] !== "undefined") { v = s.types["default"][rule]; }
3907
+ }
3908
+ if($.isFunction(v)) { v = v.call(this, obj); }
3909
+ if(rule === "max_depth" && obj !== -1 && opts !== false && s.max_depth !== -2 && v !== 0) {
3910
+ // also include the node itself - otherwise if root node it is not checked
3911
+ obj.children("a:eq(0)").parentsUntil(".jstree","li").each(function (i) {
3912
+ // check if current depth already exceeds global tree depth
3913
+ if(s.max_depth !== -1 && s.max_depth - (i + 1) <= 0) { v = 0; return false; }
3914
+ d = (i === 0) ? v : _this._check(rule, this, false);
3915
+ // check if current node max depth is already matched or exceeded
3916
+ if(d !== -1 && d - (i + 1) <= 0) { v = 0; return false; }
3917
+ // otherwise - set the max depth to the current value minus current depth
3918
+ if(d >= 0 && (d - (i + 1) < v || v < 0) ) { v = d - (i + 1); }
3919
+ // if the global tree depth exists and it minus the nodes calculated so far is less than `v` or `v` is unlimited
3920
+ if(s.max_depth >= 0 && (s.max_depth - (i + 1) < v || v < 0) ) { v = s.max_depth - (i + 1); }
3921
+ });
3922
+ }
3923
+ return v;
3924
+ },
3925
+ check_move : function () {
3926
+ if(!this.__call_old()) { return false; }
3927
+ var m = this._get_move(),
3928
+ s = m.rt._get_settings().types,
3929
+ mc = m.rt._check("max_children", m.cr),
3930
+ md = m.rt._check("max_depth", m.cr),
3931
+ vc = m.rt._check("valid_children", m.cr),
3932
+ ch = 0, d = 1, t;
3933
+
3934
+ if(vc === "none") { return false; }
3935
+ if($.isArray(vc) && m.ot && m.ot._get_type) {
3936
+ m.o.each(function () {
3937
+ if($.inArray(m.ot._get_type(this), vc) === -1) { d = false; return false; }
3938
+ });
3939
+ if(d === false) { return false; }
3940
+ }
3941
+ if(s.max_children !== -2 && mc !== -1) {
3942
+ ch = m.cr === -1 ? this.get_container().find("> ul > li").not(m.o).length : m.cr.find("> ul > li").not(m.o).length;
3943
+ if(ch + m.o.length > mc) { return false; }
3944
+ }
3945
+ if(s.max_depth !== -2 && md !== -1) {
3946
+ d = 0;
3947
+ if(md === 0) { return false; }
3948
+ if(typeof m.o.d === "undefined") {
3949
+ // TODO: deal with progressive rendering and async when checking max_depth (how to know the depth of the moved node)
3950
+ t = m.o;
3951
+ while(t.length > 0) {
3952
+ t = t.find("> ul > li");
3953
+ d ++;
3954
+ }
3955
+ m.o.d = d;
3956
+ }
3957
+ if(md - m.o.d < 0) { return false; }
3958
+ }
3959
+ return true;
3960
+ },
3961
+ create_node : function (obj, position, js, callback, is_loaded, skip_check) {
3962
+ if(!skip_check && (is_loaded || this._is_loaded(obj))) {
3963
+ var p = (typeof position == "string" && position.match(/^before|after$/i) && obj !== -1) ? this._get_parent(obj) : this._get_node(obj),
3964
+ s = this._get_settings().types,
3965
+ mc = this._check("max_children", p),
3966
+ md = this._check("max_depth", p),
3967
+ vc = this._check("valid_children", p),
3968
+ ch;
3969
+ if(typeof js === "string") { js = { data : js }; }
3970
+ if(!js) { js = {}; }
3971
+ if(vc === "none") { return false; }
3972
+ if($.isArray(vc)) {
3973
+ if(!js.attr || !js.attr[s.type_attr]) {
3974
+ if(!js.attr) { js.attr = {}; }
3975
+ js.attr[s.type_attr] = vc[0];
3976
+ }
3977
+ else {
3978
+ if($.inArray(js.attr[s.type_attr], vc) === -1) { return false; }
3979
+ }
3980
+ }
3981
+ if(s.max_children !== -2 && mc !== -1) {
3982
+ ch = p === -1 ? this.get_container().find("> ul > li").length : p.find("> ul > li").length;
3983
+ if(ch + 1 > mc) { return false; }
3984
+ }
3985
+ if(s.max_depth !== -2 && md !== -1 && (md - 1) < 0) { return false; }
3986
+ }
3987
+ return this.__call_old(true, obj, position, js, callback, is_loaded, skip_check);
3988
+ }
3989
+ }
3990
+ });
3991
+ })(jQuery);
3992
+ //*/
3993
+
3994
+ /*
3995
+ * jsTree HTML plugin
3996
+ * The HTML data store. Datastores are build by replacing the `load_node` and `_is_loaded` functions.
3997
+ */
3998
+ (function ($) {
3999
+ $.jstree.plugin("html_data", {
4000
+ __init : function () {
4001
+ // this used to use html() and clean the whitespace, but this way any attached data was lost
4002
+ this.data.html_data.original_container_html = this.get_container().find(" > ul > li").clone(true);
4003
+ // remove white space from LI node - otherwise nodes appear a bit to the right
4004
+ this.data.html_data.original_container_html.find("li").andSelf().contents().filter(function() { return this.nodeType == 3; }).remove();
4005
+ },
4006
+ defaults : {
4007
+ data : false,
4008
+ ajax : false,
4009
+ correct_state : true
4010
+ },
4011
+ _fn : {
4012
+ load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_html(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
4013
+ _is_loaded : function (obj) {
4014
+ obj = this._get_node(obj);
4015
+ return obj == -1 || !obj || (!this._get_settings().html_data.ajax && !$.isFunction(this._get_settings().html_data.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
4016
+ },
4017
+ load_node_html : function (obj, s_call, e_call) {
4018
+ var d,
4019
+ s = this.get_settings().html_data,
4020
+ error_func = function () {},
4021
+ success_func = function () {};
4022
+ obj = this._get_node(obj);
4023
+ if(obj && obj !== -1) {
4024
+ if(obj.data("jstree-is-loading")) { return; }
4025
+ else { obj.data("jstree-is-loading",true); }
4026
+ }
4027
+ switch(!0) {
4028
+ case ($.isFunction(s.data)):
4029
+ s.data.call(this, obj, $.proxy(function (d) {
4030
+ if(d && d !== "" && d.toString && d.toString().replace(/^[\s\n]+$/,"") !== "") {
4031
+ d = $(d);
4032
+ if(!d.is("ul")) { d = $("<ul />").append(d); }
4033
+ if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }
4034
+ else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree-is-loading"); }
4035
+ this.clean_node(obj);
4036
+ if(s_call) { s_call.call(this); }
4037
+ }
4038
+ else {
4039
+ if(obj && obj !== -1) {
4040
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
4041
+ obj.removeData("jstree-is-loading");
4042
+ if(s.correct_state) {
4043
+ this.correct_state(obj);
4044
+ if(s_call) { s_call.call(this); }
4045
+ }
4046
+ }
4047
+ else {
4048
+ if(s.correct_state) {
4049
+ this.get_container().children("ul").empty();
4050
+ if(s_call) { s_call.call(this); }
4051
+ }
4052
+ }
4053
+ }
4054
+ }, this));
4055
+ break;
4056
+ case (!s.data && !s.ajax):
4057
+ if(!obj || obj == -1) {
4058
+ this.get_container()
4059
+ .children("ul").empty()
4060
+ .append(this.data.html_data.original_container_html)
4061
+ .find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()
4062
+ .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
4063
+ this.clean_node();
4064
+ }
4065
+ if(s_call) { s_call.call(this); }
4066
+ break;
4067
+ case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
4068
+ if(!obj || obj == -1) {
4069
+ d = $(s.data);
4070
+ if(!d.is("ul")) { d = $("<ul />").append(d); }
4071
+ this.get_container()
4072
+ .children("ul").empty().append(d.children())
4073
+ .find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()
4074
+ .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
4075
+ this.clean_node();
4076
+ }
4077
+ if(s_call) { s_call.call(this); }
4078
+ break;
4079
+ case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
4080
+ obj = this._get_node(obj);
4081
+ error_func = function (x, t, e) {
4082
+ var ef = this.get_settings().html_data.ajax.error;
4083
+ if(ef) { ef.call(this, x, t, e); }
4084
+ if(obj != -1 && obj.length) {
4085
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
4086
+ obj.removeData("jstree-is-loading");
4087
+ if(t === "success" && s.correct_state) { this.correct_state(obj); }
4088
+ }
4089
+ else {
4090
+ if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
4091
+ }
4092
+ if(e_call) { e_call.call(this); }
4093
+ };
4094
+ success_func = function (d, t, x) {
4095
+ var sf = this.get_settings().html_data.ajax.success;
4096
+ if(sf) { d = sf.call(this,d,t,x) || d; }
4097
+ if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {
4098
+ return error_func.call(this, x, t, "");
4099
+ }
4100
+ if(d) {
4101
+ d = $(d);
4102
+ if(!d.is("ul")) { d = $("<ul />").append(d); }
4103
+ if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }
4104
+ else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree-is-loading"); }
4105
+ this.clean_node(obj);
4106
+ if(s_call) { s_call.call(this); }
4107
+ }
4108
+ else {
4109
+ if(obj && obj !== -1) {
4110
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
4111
+ obj.removeData("jstree-is-loading");
4112
+ if(s.correct_state) {
4113
+ this.correct_state(obj);
4114
+ if(s_call) { s_call.call(this); }
4115
+ }
4116
+ }
4117
+ else {
4118
+ if(s.correct_state) {
4119
+ this.get_container().children("ul").empty();
4120
+ if(s_call) { s_call.call(this); }
4121
+ }
4122
+ }
4123
+ }
4124
+ };
4125
+ s.ajax.context = this;
4126
+ s.ajax.error = error_func;
4127
+ s.ajax.success = success_func;
4128
+ if(!s.ajax.dataType) { s.ajax.dataType = "html"; }
4129
+ if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
4130
+ if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
4131
+ $.ajax(s.ajax);
4132
+ break;
4133
+ }
4134
+ }
4135
+ }
4136
+ });
4137
+ // include the HTML data plugin by default
4138
+ $.jstree.defaults.plugins.push("html_data");
4139
+ })(jQuery);
4140
+ //*/
4141
+
4142
+ /*
4143
+ * jsTree themeroller plugin
4144
+ * Adds support for jQuery UI themes. Include this at the end of your plugins list, also make sure "themes" is not included.
4145
+ */
4146
+ (function ($) {
4147
+ $.jstree.plugin("themeroller", {
4148
+ __init : function () {
4149
+ var s = this._get_settings().themeroller;
4150
+ this.get_container()
4151
+ .addClass("ui-widget-content")
4152
+ .addClass("jstree-themeroller")
4153
+ .delegate("a","mouseenter.jstree", function (e) {
4154
+ if(!$(e.currentTarget).hasClass("jstree-loading")) {
4155
+ $(this).addClass(s.item_h);
4156
+ }
4157
+ })
4158
+ .delegate("a","mouseleave.jstree", function () {
4159
+ $(this).removeClass(s.item_h);
4160
+ })
4161
+ .bind("init.jstree", $.proxy(function (e, data) {
4162
+ data.inst.get_container().find("> ul > li > .jstree-loading > ins").addClass("ui-icon-refresh");
4163
+ this._themeroller(data.inst.get_container().find("> ul > li"));
4164
+ }, this))
4165
+ .bind("open_node.jstree create_node.jstree", $.proxy(function (e, data) {
4166
+ this._themeroller(data.rslt.obj);
4167
+ }, this))
4168
+ .bind("loaded.jstree refresh.jstree", $.proxy(function (e) {
4169
+ this._themeroller();
4170
+ }, this))
4171
+ .bind("close_node.jstree", $.proxy(function (e, data) {
4172
+ this._themeroller(data.rslt.obj);
4173
+ }, this))
4174
+ .bind("delete_node.jstree", $.proxy(function (e, data) {
4175
+ this._themeroller(data.rslt.parent);
4176
+ }, this))
4177
+ .bind("correct_state.jstree", $.proxy(function (e, data) {
4178
+ data.rslt.obj
4179
+ .children("ins.jstree-icon").removeClass(s.opened + " " + s.closed + " ui-icon").end()
4180
+ .find("> a > ins.ui-icon")
4181
+ .filter(function() {
4182
+ return this.className.toString()
4183
+ .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
4184
+ .indexOf("ui-icon-") === -1;
4185
+ }).removeClass(s.item_open + " " + s.item_clsd).addClass(s.item_leaf || "jstree-no-icon");
4186
+ }, this))
4187
+ .bind("select_node.jstree", $.proxy(function (e, data) {
4188
+ data.rslt.obj.children("a").addClass(s.item_a);
4189
+ }, this))
4190
+ .bind("deselect_node.jstree deselect_all.jstree", $.proxy(function (e, data) {
4191
+ this.get_container()
4192
+ .find("a." + s.item_a).removeClass(s.item_a).end()
4193
+ .find("a.jstree-clicked").addClass(s.item_a);
4194
+ }, this))
4195
+ .bind("dehover_node.jstree", $.proxy(function (e, data) {
4196
+ data.rslt.obj.children("a").removeClass(s.item_h);
4197
+ }, this))
4198
+ .bind("hover_node.jstree", $.proxy(function (e, data) {
4199
+ this.get_container()
4200
+ .find("a." + s.item_h).not(data.rslt.obj).removeClass(s.item_h);
4201
+ data.rslt.obj.children("a").addClass(s.item_h);
4202
+ }, this))
4203
+ .bind("move_node.jstree", $.proxy(function (e, data) {
4204
+ this._themeroller(data.rslt.o);
4205
+ this._themeroller(data.rslt.op);
4206
+ }, this));
4207
+ },
4208
+ __destroy : function () {
4209
+ var s = this._get_settings().themeroller,
4210
+ c = [ "ui-icon" ];
4211
+ $.each(s, function (i, v) {
4212
+ v = v.split(" ");
4213
+ if(v.length) { c = c.concat(v); }
4214
+ });
4215
+ this.get_container()
4216
+ .removeClass("ui-widget-content")
4217
+ .find("." + c.join(", .")).removeClass(c.join(" "));
4218
+ },
4219
+ _fn : {
4220
+ _themeroller : function (obj) {
4221
+ var s = this._get_settings().themeroller;
4222
+ obj = !obj || obj == -1 ? this.get_container_ul() : this._get_node(obj).parent();
4223
+ obj
4224
+ .find("li.jstree-closed")
4225
+ .children("ins.jstree-icon").removeClass(s.opened).addClass("ui-icon " + s.closed).end()
4226
+ .children("a").addClass(s.item)
4227
+ .children("ins.jstree-icon").addClass("ui-icon")
4228
+ .filter(function() {
4229
+ return this.className.toString()
4230
+ .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
4231
+ .indexOf("ui-icon-") === -1;
4232
+ }).removeClass(s.item_leaf + " " + s.item_open).addClass(s.item_clsd || "jstree-no-icon")
4233
+ .end()
4234
+ .end()
4235
+ .end()
4236
+ .end()
4237
+ .find("li.jstree-open")
4238
+ .children("ins.jstree-icon").removeClass(s.closed).addClass("ui-icon " + s.opened).end()
4239
+ .children("a").addClass(s.item)
4240
+ .children("ins.jstree-icon").addClass("ui-icon")
4241
+ .filter(function() {
4242
+ return this.className.toString()
4243
+ .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
4244
+ .indexOf("ui-icon-") === -1;
4245
+ }).removeClass(s.item_leaf + " " + s.item_clsd).addClass(s.item_open || "jstree-no-icon")
4246
+ .end()
4247
+ .end()
4248
+ .end()
4249
+ .end()
4250
+ .find("li.jstree-leaf")
4251
+ .children("ins.jstree-icon").removeClass(s.closed + " ui-icon " + s.opened).end()
4252
+ .children("a").addClass(s.item)
4253
+ .children("ins.jstree-icon").addClass("ui-icon")
4254
+ .filter(function() {
4255
+ return this.className.toString()
4256
+ .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
4257
+ .indexOf("ui-icon-") === -1;
4258
+ }).removeClass(s.item_clsd + " " + s.item_open).addClass(s.item_leaf || "jstree-no-icon");
4259
+ }
4260
+ },
4261
+ defaults : {
4262
+ "opened" : "ui-icon-triangle-1-se",
4263
+ "closed" : "ui-icon-triangle-1-e",
4264
+ "item" : "ui-state-default",
4265
+ "item_h" : "ui-state-hover",
4266
+ "item_a" : "ui-state-active",
4267
+ "item_open" : "ui-icon-folder-open",
4268
+ "item_clsd" : "ui-icon-folder-collapsed",
4269
+ "item_leaf" : "ui-icon-document"
4270
+ }
4271
+ });
4272
+ $(function() {
4273
+ var css_string = '' +
4274
+ '.jstree-themeroller .ui-icon { overflow:visible; } ' +
4275
+ '.jstree-themeroller a { padding:0 2px; } ' +
4276
+ '.jstree-themeroller .jstree-no-icon { display:none; }';
4277
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
4278
+ });
4279
+ })(jQuery);
4280
+ //*/
4281
+
4282
+ /*
4283
+ * jsTree unique plugin
4284
+ * Forces different names amongst siblings (still a bit experimental)
4285
+ * NOTE: does not check language versions (it will not be possible to have nodes with the same title, even in different languages)
4286
+ */
4287
+ (function ($) {
4288
+ $.jstree.plugin("unique", {
4289
+ __init : function () {
4290
+ this.get_container()
4291
+ .bind("before.jstree", $.proxy(function (e, data) {
4292
+ var nms = [], res = true, p, t;
4293
+ if(data.func == "move_node") {
4294
+ // obj, ref, position, is_copy, is_prepared, skip_check
4295
+ if(data.args[4] === true) {
4296
+ if(data.args[0].o && data.args[0].o.length) {
4297
+ data.args[0].o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
4298
+ res = this._check_unique(nms, data.args[0].np.find("> ul > li").not(data.args[0].o), "move_node");
4299
+ }
4300
+ }
4301
+ }
4302
+ if(data.func == "create_node") {
4303
+ // obj, position, js, callback, is_loaded
4304
+ if(data.args[4] || this._is_loaded(data.args[0])) {
4305
+ p = this._get_node(data.args[0]);
4306
+ if(data.args[1] && (data.args[1] === "before" || data.args[1] === "after")) {
4307
+ p = this._get_parent(data.args[0]);
4308
+ if(!p || p === -1) { p = this.get_container(); }
4309
+ }
4310
+ if(typeof data.args[2] === "string") { nms.push(data.args[2]); }
4311
+ else if(!data.args[2] || !data.args[2].data) { nms.push(this._get_string("new_node")); }
4312
+ else { nms.push(data.args[2].data); }
4313
+ res = this._check_unique(nms, p.find("> ul > li"), "create_node");
4314
+ }
4315
+ }
4316
+ if(data.func == "rename_node") {
4317
+ // obj, val
4318
+ nms.push(data.args[1]);
4319
+ t = this._get_node(data.args[0]);
4320
+ p = this._get_parent(t);
4321
+ if(!p || p === -1) { p = this.get_container(); }
4322
+ res = this._check_unique(nms, p.find("> ul > li").not(t), "rename_node");
4323
+ }
4324
+ if(!res) {
4325
+ e.stopPropagation();
4326
+ return false;
4327
+ }
4328
+ }, this));
4329
+ },
4330
+ defaults : {
4331
+ error_callback : $.noop
4332
+ },
4333
+ _fn : {
4334
+ _check_unique : function (nms, p, func) {
4335
+ var cnms = [];
4336
+ p.children("a").each(function () { cnms.push($(this).text().replace(/^\s+/g,"")); });
4337
+ if(!cnms.length || !nms.length) { return true; }
4338
+ cnms = cnms.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
4339
+ if((cnms.length + nms.length) != cnms.concat(nms).sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",").length) {
4340
+ this._get_settings().unique.error_callback.call(null, nms, p, func);
4341
+ return false;
4342
+ }
4343
+ return true;
4344
+ },
4345
+ check_move : function () {
4346
+ if(!this.__call_old()) { return false; }
4347
+ var p = this._get_move(), nms = [];
4348
+ if(p.o && p.o.length) {
4349
+ p.o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
4350
+ return this._check_unique(nms, p.np.find("> ul > li").not(p.o), "check_move");
4351
+ }
4352
+ return true;
4353
+ }
4354
+ }
4355
+ });
4356
+ })(jQuery);
4357
+ //*/
4358
+
4359
+ /*
4360
+ * jsTree wholerow plugin
4361
+ * Makes select and hover work on the entire width of the node
4362
+ * MAY BE HEAVY IN LARGE DOM
4363
+ */
4364
+ (function ($) {
4365
+ $.jstree.plugin("wholerow", {
4366
+ __init : function () {
4367
+ if(!this.data.ui) { throw "jsTree wholerow: jsTree UI plugin not included."; }
4368
+ this.data.wholerow.html = false;
4369
+ this.data.wholerow.to = false;
4370
+ this.get_container()
4371
+ .bind("init.jstree", $.proxy(function (e, data) {
4372
+ this._get_settings().core.animation = 0;
4373
+ }, this))
4374
+ .bind("open_node.jstree create_node.jstree clean_node.jstree loaded.jstree", $.proxy(function (e, data) {
4375
+ this._prepare_wholerow_span( data && data.rslt && data.rslt.obj ? data.rslt.obj : -1 );
4376
+ }, this))
4377
+ .bind("search.jstree clear_search.jstree reopen.jstree after_open.jstree after_close.jstree create_node.jstree delete_node.jstree clean_node.jstree", $.proxy(function (e, data) {
4378
+ if(this.data.to) { clearTimeout(this.data.to); }
4379
+ this.data.to = setTimeout( (function (t, o) { return function() { t._prepare_wholerow_ul(o); }; })(this, data && data.rslt && data.rslt.obj ? data.rslt.obj : -1), 0);
4380
+ }, this))
4381
+ .bind("deselect_all.jstree", $.proxy(function (e, data) {
4382
+ this.get_container().find(" > .jstree-wholerow .jstree-clicked").removeClass("jstree-clicked " + (this.data.themeroller ? this._get_settings().themeroller.item_a : "" ));
4383
+ }, this))
4384
+ .bind("select_node.jstree deselect_node.jstree ", $.proxy(function (e, data) {
4385
+ data.rslt.obj.each(function () {
4386
+ var ref = data.inst.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt((($(this).offset().top - data.inst.get_container().offset().top + data.inst.get_container()[0].scrollTop) / data.inst.data.core.li_height),10)) + ")");
4387
+ // ref.children("a")[e.type === "select_node" ? "addClass" : "removeClass"]("jstree-clicked");
4388
+ ref.children("a").attr("class",data.rslt.obj.children("a").attr("class"));
4389
+ });
4390
+ }, this))
4391
+ .bind("hover_node.jstree dehover_node.jstree", $.proxy(function (e, data) {
4392
+ this.get_container().find(" > .jstree-wholerow .jstree-hovered").removeClass("jstree-hovered " + (this.data.themeroller ? this._get_settings().themeroller.item_h : "" ));
4393
+ if(e.type === "hover_node") {
4394
+ var ref = this.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt(((data.rslt.obj.offset().top - this.get_container().offset().top + this.get_container()[0].scrollTop) / this.data.core.li_height),10)) + ")");
4395
+ // ref.children("a").addClass("jstree-hovered");
4396
+ ref.children("a").attr("class",data.rslt.obj.children(".jstree-hovered").attr("class"));
4397
+ }
4398
+ }, this))
4399
+ .delegate(".jstree-wholerow-span, ins.jstree-icon, li", "click.jstree", function (e) {
4400
+ var n = $(e.currentTarget);
4401
+ if(e.target.tagName === "A" || (e.target.tagName === "INS" && n.closest("li").is(".jstree-open, .jstree-closed"))) { return; }
4402
+ n.closest("li").children("a:visible:eq(0)").click();
4403
+ e.stopImmediatePropagation();
4404
+ })
4405
+ .delegate("li", "mouseover.jstree", $.proxy(function (e) {
4406
+ e.stopImmediatePropagation();
4407
+ if($(e.currentTarget).children(".jstree-hovered, .jstree-clicked").length) { return false; }
4408
+ this.hover_node(e.currentTarget);
4409
+ return false;
4410
+ }, this))
4411
+ .delegate("li", "mouseleave.jstree", $.proxy(function (e) {
4412
+ if($(e.currentTarget).children("a").hasClass("jstree-hovered").length) { return; }
4413
+ this.dehover_node(e.currentTarget);
4414
+ }, this));
4415
+ if(is_ie7 || is_ie6) {
4416
+ $.vakata.css.add_sheet({ str : ".jstree-" + this.get_index() + " { position:relative; } ", title : "jstree" });
4417
+ }
4418
+ },
4419
+ defaults : {
4420
+ },
4421
+ __destroy : function () {
4422
+ this.get_container().children(".jstree-wholerow").remove();
4423
+ this.get_container().find(".jstree-wholerow-span").remove();
4424
+ },
4425
+ _fn : {
4426
+ _prepare_wholerow_span : function (obj) {
4427
+ obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);
4428
+ if(obj === false) { return; } // added for removing root nodes
4429
+ obj.each(function () {
4430
+ $(this).find("li").andSelf().each(function () {
4431
+ var $t = $(this);
4432
+ if($t.children(".jstree-wholerow-span").length) { return true; }
4433
+ $t.prepend("<span class='jstree-wholerow-span' style='width:" + ($t.parentsUntil(".jstree","li").length * 18) + "px;'>&#160;</span>");
4434
+ });
4435
+ });
4436
+ },
4437
+ _prepare_wholerow_ul : function () {
4438
+ var o = this.get_container().children("ul").eq(0), h = o.html();
4439
+ o.addClass("jstree-wholerow-real");
4440
+ if(this.data.wholerow.last_html !== h) {
4441
+ this.data.wholerow.last_html = h;
4442
+ this.get_container().children(".jstree-wholerow").remove();
4443
+ this.get_container().append(
4444
+ o.clone().removeClass("jstree-wholerow-real")
4445
+ .wrapAll("<div class='jstree-wholerow' />").parent()
4446
+ .width(o.parent()[0].scrollWidth)
4447
+ .css("top", (o.height() + ( is_ie7 ? 5 : 0)) * -1 )
4448
+ .find("li[id]").each(function () { this.removeAttribute("id"); }).end()
4449
+ );
4450
+ }
4451
+ }
4452
+ }
4453
+ });
4454
+ $(function() {
4455
+ var css_string = '' +
4456
+ '.jstree .jstree-wholerow-real { position:relative; z-index:1; } ' +
4457
+ '.jstree .jstree-wholerow-real li { cursor:pointer; } ' +
4458
+ '.jstree .jstree-wholerow-real a { border-left-color:transparent !important; border-right-color:transparent !important; } ' +
4459
+ '.jstree .jstree-wholerow { position:relative; z-index:0; height:0; } ' +
4460
+ '.jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { width:100%; } ' +
4461
+ '.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li, .jstree .jstree-wholerow a { margin:0 !important; padding:0 !important; } ' +
4462
+ '.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { background:transparent !important; }' +
4463
+ '.jstree .jstree-wholerow ins, .jstree .jstree-wholerow span, .jstree .jstree-wholerow input { display:none !important; }' +
4464
+ '.jstree .jstree-wholerow a, .jstree .jstree-wholerow a:hover { text-indent:-9999px; !important; width:100%; padding:0 !important; border-right-width:0px !important; border-left-width:0px !important; } ' +
4465
+ '.jstree .jstree-wholerow-span { position:absolute; left:0; margin:0px; padding:0; height:18px; border-width:0; padding:0; z-index:0; }';
4466
+ if(is_ff2) {
4467
+ css_string += '' +
4468
+ '.jstree .jstree-wholerow a { display:block; height:18px; margin:0; padding:0; border:0; } ' +
4469
+ '.jstree .jstree-wholerow-real a { border-color:transparent !important; } ';
4470
+ }
4471
+ if(is_ie7 || is_ie6) {
4472
+ css_string += '' +
4473
+ '.jstree .jstree-wholerow, .jstree .jstree-wholerow li, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow a { margin:0; padding:0; line-height:18px; } ' +
4474
+ '.jstree .jstree-wholerow a { display:block; height:18px; line-height:18px; overflow:hidden; } ';
4475
+ }
4476
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
4477
+ });
4478
+ })(jQuery);
4479
+ //*/
4480
+
4481
+ /*
4482
+ * jsTree model plugin
4483
+ * This plugin gets jstree to use a class model to retrieve data, creating great dynamism
4484
+ */
4485
+ (function ($) {
4486
+ var nodeInterface = ["getChildren","getChildrenCount","getAttr","getName","getProps"],
4487
+ validateInterface = function(obj, inter) {
4488
+ var valid = true;
4489
+ obj = obj || {};
4490
+ inter = [].concat(inter);
4491
+ $.each(inter, function (i, v) {
4492
+ if(!$.isFunction(obj[v])) { valid = false; return false; }
4493
+ });
4494
+ return valid;
4495
+ };
4496
+ $.jstree.plugin("model", {
4497
+ __init : function () {
4498
+ if(!this.data.json_data) { throw "jsTree model: jsTree json_data plugin not included."; }
4499
+ this._get_settings().json_data.data = function (n, b) {
4500
+ var obj = (n == -1) ? this._get_settings().model.object : n.data("jstree_model");
4501
+ if(!validateInterface(obj, nodeInterface)) { return b.call(null, false); }
4502
+ if(this._get_settings().model.async) {
4503
+ obj.getChildren($.proxy(function (data) {
4504
+ this.model_done(data, b);
4505
+ }, this));
4506
+ }
4507
+ else {
4508
+ this.model_done(obj.getChildren(), b);
4509
+ }
4510
+ };
4511
+ },
4512
+ defaults : {
4513
+ object : false,
4514
+ id_prefix : false,
4515
+ async : false
4516
+ },
4517
+ _fn : {
4518
+ model_done : function (data, callback) {
4519
+ var ret = [],
4520
+ s = this._get_settings(),
4521
+ _this = this;
4522
+
4523
+ if(!$.isArray(data)) { data = [data]; }
4524
+ $.each(data, function (i, nd) {
4525
+ var r = nd.getProps() || {};
4526
+ r.attr = nd.getAttr() || {};
4527
+ if(nd.getChildrenCount()) { r.state = "closed"; }
4528
+ r.data = nd.getName();
4529
+ if(!$.isArray(r.data)) { r.data = [r.data]; }
4530
+ if(_this.data.types && $.isFunction(nd.getType)) {
4531
+ r.attr[s.types.type_attr] = nd.getType();
4532
+ }
4533
+ if(r.attr.id && s.model.id_prefix) { r.attr.id = s.model.id_prefix + r.attr.id; }
4534
+ if(!r.metadata) { r.metadata = { }; }
4535
+ r.metadata.jstree_model = nd;
4536
+ ret.push(r);
4537
+ });
4538
+ callback.call(null, ret);
4539
+ }
4540
+ }
4541
+ });
4542
+ })(jQuery);
4543
+ //*/
4544
+
4545
+ })();
scripts/themes/wordpress/style.css CHANGED
@@ -40,7 +40,7 @@
40
  #vakata-dragged.jstree-wordpress ins { background:transparent !important; }
41
  #vakata-dragged.jstree-wordpress .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }
42
  #vakata-dragged.jstree-wordpress .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }
43
- #jstree-marker.jstree-wordpress { background:url("d.png") -41px -57px no-repeat !important; }
44
 
45
  .jstree-wordpress a.jstree-search { font-weight: bold; background-color: #FFEFBA; }
46
 
@@ -53,29 +53,39 @@
53
  #vakata-contextmenu.jstree-wordpress-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }
54
  #vakata-contextmenu.jstree-wordpress-context li ul { margin-left:-4px; }
55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  /* added by pär */
57
  .jstree-wordpress li {
58
- padding-top: 2px;
59
- padding-bottom: 2px;
60
  position: relative;
61
  }
62
  .jstree li.jstree-closed,
63
  .jstree li.jstree-open
64
  {
65
- padding-top: 4px;
66
- padding-bottom: 4px;
67
- }
68
- /*
69
- .jstree a:hover {
70
- background-color: #e7f4f9;
71
  }
72
- */
73
-
74
  .jstree li.hover a,
75
  .jstree li a.hover
76
  {
77
  background-color: #e7f4f9;
78
  }
79
-
80
-
81
- /* TODO: IE6 support - the `>` selectors */
40
  #vakata-dragged.jstree-wordpress ins { background:transparent !important; }
41
  #vakata-dragged.jstree-wordpress .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }
42
  #vakata-dragged.jstree-wordpress .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }
43
+ #jstree-marker.jstree-wordpress { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; }
44
 
45
  .jstree-wordpress a.jstree-search { font-weight: bold; background-color: #FFEFBA; }
46
 
53
  #vakata-contextmenu.jstree-wordpress-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }
54
  #vakata-contextmenu.jstree-wordpress-context li ul { margin-left:-4px; }
55
 
56
+
57
+ /* IE6 BEGIN */
58
+ .jstree-wordpress li,
59
+ .jstree-wordpress ins,
60
+ #vakata-dragged.jstree-wordpress .jstree-invalid,
61
+ #vakata-dragged.jstree-wordpress .jstree-ok,
62
+ #jstree-marker.jstree-default { _background-image:url("d.gif"); }
63
+ .jstree-wordpress .jstree-open ins { _background-position:-72px 0; }
64
+ .jstree-wordpress .jstree-closed ins { _background-position:-54px 0; }
65
+ .jstree-wordpress .jstree-leaf ins { _background-position:-36px 0; }
66
+ .jstree-wordpress a ins.jstree-icon { _background-position:-56px -19px; }
67
+ #vakata-contextmenu.jstree-wordpress-context ins { _display:none; }
68
+ #vakata-contextmenu.jstree-wordpress-context li { _zoom:1; }
69
+ .jstree-wordpress .jstree-undetermined a .jstree-checkbox { _background-position:-20px -19px; }
70
+ .jstree-wordpress .jstree-checked a .jstree-checkbox { _background-position:-38px -19px; }
71
+ .jstree-wordpress .jstree-unchecked a .jstree-checkbox { _background-position:-2px -19px; }
72
+ /* IE6 END */
73
+
74
+
75
  /* added by pär */
76
  .jstree-wordpress li {
77
+ /*padding-top: 2px;
78
+ padding-bottom: 2px;*/
79
  position: relative;
80
  }
81
  .jstree li.jstree-closed,
82
  .jstree li.jstree-open
83
  {
84
+ /* padding-top: 4px;
85
+ padding-bottom: 4px; */
 
 
 
 
86
  }
 
 
87
  .jstree li.hover a,
88
  .jstree li a.hover
89
  {
90
  background-color: #e7f4f9;
91
  }
 
 
 
styles/styles.css CHANGED
@@ -8,7 +8,13 @@
8
 
9
  .cms_tpv_wrapper {
10
  z-index: 10;
 
11
  }
 
 
 
 
 
12
  .cms_tpv_container {
13
  /* clear: both; */
14
  overflow: visible;
8
 
9
  .cms_tpv_wrapper {
10
  z-index: 10;
11
+ margin-right: 250px;
12
  }
13
+
14
+ .postbox .cms_tpv_wrapper {
15
+ width: auto;
16
+ }
17
+
18
  .cms_tpv_container {
19
  /* clear: both; */
20
  overflow: visible;