")}),u.init(),u.bind("StateChanged",function(){u.state===plupload.STARTED?(e("li.plupload_delete a,div.plupload_buttons",a).hide(),u.disableBrowse(!0),e("span.plupload_upload_status,div.plupload_progress,a.plupload_stop",a).css("display","block"),e("span.plupload_upload_status",a).html("Uploaded "+u.total.uploaded+"/"+u.files.length+" files"),s.multiple_queues&&e("span.plupload_total_status,span.plupload_total_file_size",a).show()):(p(),e("a.plupload_stop,div.plupload_progress",a).hide(),e("a.plupload_delete",a).css("display","block"),s.multiple_queues&&u.total.uploaded+u.total.failed==u.files.length&&(e(".plupload_buttons,.plupload_upload_status",a).css("display","inline"),u.disableBrowse(!1),e(".plupload_start",a).addClass("plupload_disabled"),e("span.plupload_total_status,span.plupload_total_file_size",a).hide()))}),u.bind("FilesAdded",p),u.bind("FilesRemoved",function(){var t=e("#"+f+"_filelist").scrollTop();p(),e("#"+f+"_filelist").scrollTop(t)}),u.bind("FileUploaded",function(e,t){c(t)}),u.bind("UploadProgress",function(t,n){e("#"+n.id+" div.plupload_file_status",a).html(n.percent+"%"),c(n),h()}),s.setup&&s.setup(u)}),this):n[e(this[0]).attr("id")]}})(jQuery,mOxie);
--------------------------------------------------------------------------------
/src/main/webapp/static/plupload/js/jquery.ui.plupload/css/jquery.ui.plupload.css:
--------------------------------------------------------------------------------
1 | /*
2 | Plupload
3 | ------------------------------------------------------------------- */
4 |
5 | .plupload_wrapper * {
6 | box-sizing: content-box;
7 | }
8 |
9 | .plupload_button {
10 | cursor: pointer;
11 | outline: none;
12 | }
13 |
14 | .plupload_wrapper {
15 | font: normal 11px Verdana,sans-serif;
16 | width: 100%;
17 | min-width: 520px;
18 | line-height: 12px;
19 | }
20 |
21 | .plupload_container {
22 | _height: 300px;
23 | min-height: 300px;
24 | position: relative;
25 | }
26 |
27 | .plupload_filelist_footer {border-width: 1px 0 0 0}
28 | .plupload_file {border-width: 0 0 1px 0}
29 | .plupload_container .plupload_header {border-width: 0 0 1px 0; position: relative;}
30 |
31 | .plupload_delete .ui-icon,
32 | .plupload_done .ui-icon,
33 | .plupload_failed .ui-icon {
34 | cursor:pointer;
35 | }
36 |
37 | .plupload_header_content {
38 | height: 56px;
39 | padding: 0 160px 0 60px;
40 | position: relative;
41 | }
42 |
43 | .plupload_logo {
44 | width: 40px;
45 | height: 40px;
46 | background: url('../img/plupload.png') no-repeat 0 0;
47 | position: absolute;
48 | top: 8px;
49 | left: 8px;
50 | }
51 |
52 | .plupload_header_content_bw .plupload_logo {
53 | background-position: -40px 0;
54 | }
55 |
56 | .plupload_header_title {
57 | font: normal 18px sans-serif;
58 | line-height: 19px;
59 | padding: 6px 0 3px;
60 | }
61 |
62 | .plupload_header_text {
63 | font: normal 12px sans-serif;
64 | }
65 |
66 | .plupload_view_switch {
67 | position: absolute;
68 | right: 16px;
69 | bottom: 8px;
70 | margin: 0;
71 | display: none;
72 | }
73 |
74 | .plupload_view_switch .ui-button {
75 | margin-right: -0.31em;
76 | }
77 |
78 | .plupload_content {
79 | position: absolute;
80 | top: 86px;
81 | bottom: 44px;
82 | left: 0;
83 | right: 0;
84 | overflow-y: auto;
85 | width: 100%;
86 | }
87 |
88 | .plupload_filelist {
89 | border-collapse: collapse;
90 | border-left: none;
91 | border-right: none;
92 | margin: 0;
93 | padding: 0;
94 | width: 100%;
95 | -moz-user-select: none;
96 | -webkit-user-select: none;
97 | user-select: none;
98 | }
99 |
100 | .plupload_filelist_content {
101 | padding: 0;
102 | margin: 0;
103 | }
104 |
105 | .plupload_cell {padding: 8px 6px;}
106 |
107 | .plupload_file {
108 | list-style: none;
109 | display: block;
110 | position: relative;
111 | overflow: hidden;
112 | line-height: 12px;
113 | }
114 |
115 | .plupload_file_thumb {
116 | position: relative;
117 | background-image: none;
118 | background-color: #eee;
119 | }
120 |
121 | .plupload_file_loading .plupload_file_thumb {
122 | background: #eee url(../img/loading.gif) center no-repeat;
123 | }
124 |
125 | .plupload_file_name {
126 | overflow: hidden;
127 | text-overflow: ellipsis;
128 | white-space: nowrap;
129 | }
130 |
131 | .plupload_filelist_header {
132 | border-top: none;
133 | }
134 |
135 | .plupload_filelist_footer {
136 | position: absolute;
137 | bottom: 0;
138 | left: 0;
139 | right: 0;
140 | }
141 |
142 | .plupload_buttons {
143 | position: relative;
144 | }
145 |
146 | /* list view */
147 | .plupload_view_list .plupload_file {
148 | border-left: none;
149 | border-right: none;
150 | border-top: none;
151 | height: 29px;
152 | width: 100% !important;
153 | /* fix IE6 vertical white-space bug */
154 | _float: left;
155 | _clear: left;
156 | }
157 |
158 | .plupload_view_list div.plupload_file_size,
159 | .plupload_view_list div.plupload_file_status,
160 | .plupload_view_list div.plupload_file_action {
161 | padding: 8px 6px;
162 | position: absolute;
163 | top: 0;
164 | right: 0;
165 | }
166 |
167 | .plupload_view_list div.plupload_file_name {
168 | margin-right: 156px;
169 | padding: 8px 6px;
170 | _width: 75%;
171 | }
172 |
173 | .plupload_view_list div.plupload_file_size {
174 | right: 28px;
175 | }
176 |
177 | .plupload_view_list div.plupload_file_status {
178 | right: 82px;
179 | }
180 |
181 | .plupload_view_list .plupload_file_rename {
182 | margin-left: -2px;
183 | }
184 |
185 | .plupload_view_list .plupload_file_size,
186 | .plupload_view_list .plupload_file_status,
187 | .plupload_filelist_footer .plupload_file_size,
188 | .plupload_filelist_footer .plupload_file_status {
189 | text-align: right;
190 | width: 52px;
191 | }
192 |
193 | .plupload_view_list .plupload_file_thumb {
194 | position: absolute;
195 | top: -999px;
196 | }
197 |
198 | .plupload_view_list .plupload_file_progress {
199 | display: none;
200 | }
201 |
202 |
203 | /* thumbs view */
204 | .plupload_view_thumbs .plupload_content {
205 | top: 57px;
206 | }
207 |
208 | .plupload_view_thumbs .plupload_filelist_header {
209 | display: none;
210 | }
211 |
212 | .plupload_view_thumbs .plupload_file {
213 | padding: 6px;
214 | margin: 10px;
215 | border: 1px solid #fff;
216 | float: left;
217 | }
218 |
219 | .plupload_view_thumbs .plupload_file_thumb,
220 | .plupload_view_thumbs .plupload_file_dummy {
221 | text-align: center;
222 | overflow: hidden;
223 | }
224 |
225 | .plupload_view_thumbs .plupload_file_dummy {
226 | font-size: 21px;
227 | font-weight: bold;
228 | text-transform: lowercase;
229 | overflow: hidden;
230 | border: none;
231 | position: absolute;
232 | top: 0;
233 | left: 0;
234 | width: 100%;
235 | height: 100%;
236 | }
237 |
238 | .plupload_view_thumbs div.plupload_file_action {
239 | position: absolute;
240 | top: 0;
241 | right: 0;
242 | }
243 |
244 | .plupload_view_thumbs div.plupload_file_name {
245 | padding: 0;
246 | font-weight: bold;
247 | }
248 |
249 | .plupload_view_thumbs .plupload_file_rename {
250 | padding: 1px 0;
251 | width: 100% !important;
252 | }
253 |
254 | .plupload_view_thumbs div.plupload_file_size {
255 | font-size: 0.8em;
256 | font-weight: normal;
257 | }
258 |
259 | .plupload_view_thumbs div.plupload_file_status {
260 | position: relative;
261 | height: 3px;
262 | overflow: hidden;
263 | text-indent: -999px;
264 | margin-bottom: 3px;
265 | }
266 |
267 | .plupload_view_thumbs div.plupload_file_progress {
268 | border: none;
269 | height: 100%;
270 | }
271 |
272 | .plupload .ui-sortable-helper,
273 | .plupload .ui-sortable .plupload_file {
274 | cursor:move;
275 | }
276 |
277 | .plupload_file_action {width: 16px;}
278 | .plupload_file_name {
279 | overflow: hidden;
280 | padding-left: 10px;
281 | }
282 |
283 | .plupload_file_rename {
284 | border: none;
285 | font: normal 11px Verdana, sans-serif;
286 | padding: 1px 2px;
287 | line-height: 11px;
288 | height: 11px;
289 | }
290 |
291 | .plupload_progress {width: 60px;}
292 | .plupload_progress_container {padding: 1px;}
293 |
294 |
295 | /* Floats */
296 |
297 | .plupload_right {float: right;}
298 | .plupload_left {float: left;}
299 | .plupload_clear,.plupload_clearer {clear: both;}
300 | .plupload_clearer, .plupload_progress_bar {
301 | display: block;
302 | font-size: 0;
303 | line-height: 0;
304 | }
305 | .plupload_clearer {height: 0;}
306 |
307 | /* Misc */
308 | .plupload_hidden {display: none !important;}
309 |
310 | .plupload_droptext {
311 | position: absolute;
312 | top: 0;
313 | left: 0;
314 | right: 0;
315 | bottom: 0;
316 | background: transparent;
317 | text-align: center;
318 | vertical-align: middle;
319 | border: 0;
320 | line-height: 160px;
321 | display: none;
322 | }
323 |
324 | .plupload_dropbox .plupload_droptext {
325 | display: block;
326 | }
327 |
328 | .plupload_buttons, .plupload_upload_status {float: left}
329 |
330 | .plupload_message {
331 | position: absolute;
332 | top: -1px;
333 | left: -1px;
334 | height: 100%;
335 | width: 100%;
336 | }
337 |
338 | .plupload_message p {
339 | padding:0.7em;
340 | margin:0;
341 | }
342 |
343 | .plupload_message strong {
344 | font-weight: bold;
345 | }
346 |
347 | plupload_message i {
348 | font-style: italic;
349 | }
350 |
351 | .plupload_message p span.ui-icon {
352 | float: left;
353 | margin-right: 0.3em;
354 | }
355 |
356 | .plupload_header_content .ui-state-error,
357 | .plupload_header_content .ui-state-highlight {
358 | border:none;
359 | }
360 |
361 | .plupload_message_close {
362 | position:absolute;
363 | top:5px;
364 | right:5px;
365 | cursor:pointer;
366 | }
367 |
368 | .plupload .ui-sortable-placeholder {
369 | height:35px;
370 | }
371 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
203 |
--------------------------------------------------------------------------------
/src/main/webapp/static/plupload/js/jquery.ui.plupload/jquery.ui.plupload.min.js:
--------------------------------------------------------------------------------
1 | ;(function(e,t,n,r,i){function o(e){return n.translate(e)||e}function u(e){e.id=e.attr("id"),e.html('
'+o("Select files")+"
"+'
'+o("Add files to the upload queue and click the start button.")+"
")}var s={};i.widget("ui.plupload",{widgetEventPrefix:"",contents_bak:"",options:{browse_button_hover:"ui-state-hover",browse_button_active:"ui-state-active",filters:{},buttons:{browse:!0,start:!0,stop:!0},views:{list:!0,thumbs:!1,active:"list",remember:!0},thumb_width:100,thumb_height:60,multiple_queues:!0,dragdrop:!0,autostart:!1,sortable:!1,rename:!1},FILE_COUNT_ERROR:-9001,_create:function(){var e=this.element.attr("id");e||(e=n.guid(),this.element.attr("id",e)),this.id=e,this.contents_bak=this.element.html(),u(this.element),this.container=i(".plupload_container",this.element).attr("id",e+"_container"),this.content=i(".plupload_content",this.element),i.fn.resizable&&this.container.resizable({handles:"s",minHeight:300}),this.filelist=i(".plupload_filelist_content",this.container).attr({id:e+"_filelist",unselectable:"on"}),this.browse_button=i(".plupload_add",this.container).attr("id",e+"_browse"),this.start_button=i(".plupload_start",this.container).attr("id",e+"_start"),this.stop_button=i(".plupload_stop",this.container).attr("id",e+"_stop"),this.thumbs_switcher=i("#"+e+"_view_thumbs"),this.list_switcher=i("#"+e+"_view_list"),i.ui.button&&(this.browse_button.button({icons:{primary:"ui-icon-circle-plus"},disabled:!0}),this.start_button.button({icons:{primary:"ui-icon-circle-arrow-e"},disabled:!0}),this.stop_button.button({icons:{primary:"ui-icon-circle-close"}}),this.list_switcher.button({text:!1,icons:{secondary:"ui-icon-grip-dotted-horizontal"}}),this.thumbs_switcher.button({text:!1,icons:{secondary:"ui-icon-image"}})),this.progressbar=i(".plupload_progress_container",this.container),i.ui.progressbar&&this.progressbar.progressbar(),this.counter=i(".plupload_count",this.element).attr({id:e+"_count",name:e+"_count"}),this._initUploader()},_initUploader:function(){var e=this,t=this.id,u,a={container:t+"_buttons",browse_button:t+"_browse"};i(".plupload_buttons",this.element).attr("id",t+"_buttons"),e.options.dragdrop&&(this.filelist.parent().attr("id",this.id+"_dropbox"),a.drop_element=this.id+"_dropbox"),this.filelist.on("click",function(t){i(t.target).hasClass("plupload_action_icon")&&(e.removeFile(i(t.target).closest(".plupload_file").attr("id")),t.preventDefault())}),u=this.uploader=s[t]=new n.Uploader(i.extend(this.options,a)),e.options.views.thumbs&&(u.settings.required_features.display_media=!0),e.options.max_file_count&&n.extend(u.getOption("filters"),{max_file_count:e.options.max_file_count}),n.addFileFilter("max_file_count",function(t,n,r){t<=this.files.length-(this.total.uploaded+this.total.failed)?(e.browse_button.button("disable"),this.disableBrowse(),this.trigger("Error",{code:e.FILE_COUNT_ERROR,message:o("File count error."),file:n}),r(!1)):r(!0)}),u.bind("Error",function(t,i){var s,u="";s=""+i.message+"";switch(i.code){case n.FILE_EXTENSION_ERROR:u=r.sprintf(o("File: %s"),i.file.name);break;case n.FILE_SIZE_ERROR:u=r.sprintf(o("File: %s, size: %d, max file size: %d"),i.file.name,n.formatSize(i.file.size),n.formatSize(n.parseSize(t.getOption("filters").max_file_size)));break;case n.FILE_DUPLICATE_ERROR:u=r.sprintf(o("%s already present in the queue."),i.file.name);break;case e.FILE_COUNT_ERROR:u=r.sprintf(o("Upload element accepts only %d file(s) at a time. Extra files were stripped."),t.getOption("filters").max_file_count||0);break;case n.IMAGE_FORMAT_ERROR:u=o("Image format either wrong or not supported.");break;case n.IMAGE_MEMORY_ERROR:u=o("Runtime ran out of available memory.");break;case n.HTTP_ERROR:u=o("Upload URL might be wrong or doesn't exist.")}s+=" "+u+"",e._trigger("error",null,{up:t,error:i}),i.code===n.INIT_ERROR?setTimeout(function(){e.destroy()},1):e.notify("error",s)}),u.bind("PostInit",function(t){e.options.buttons.browse?e.browse_button.button("enable"):(e.browse_button.button("disable").hide(),t.disableBrowse(!0)),e.options.buttons.start||e.start_button.button("disable").hide(),e.options.buttons.stop||e.stop_button.button("disable").hide(),!e.options.unique_names&&e.options.rename&&e._enableRenaming(),e.options.dragdrop&&t.features.dragdrop&&e.filelist.parent().addClass("plupload_dropbox"),e._enableViewSwitcher(),e.start_button.click(function(t){i(this).button("option","disabled")||e.start(),t.preventDefault()}),e.stop_button.click(function(t){e.stop(),t.preventDefault()}),e._trigger("ready",null,{up:t})}),u.init(),u.bind("FileFiltered",function(t,n){e._addFiles(n)}),u.bind("FilesAdded",function(t,n){e._trigger("selected",null,{up:t,files:n}),e.options.sortable&&i.ui.sortable&&e._enableSortingList(),e._trigger("updatelist",null,{filelist:e.filelist}),e.options.autostart&&setTimeout(function(){e.start()},10)}),u.bind("FilesRemoved",function(t,n){i.ui.sortable&&e.options.sortable&&i("tbody",e.filelist).sortable("destroy"),i.each(n,function(e,t){i("#"+t.id).toggle("highlight",function(){i(this).remove()})}),t.files.length&&e.options.sortable&&i.ui.sortable&&e._enableSortingList(),e._trigger("updatelist",null,{filelist:e.filelist}),e._trigger("removed",null,{up:t,files:n})}),u.bind("QueueChanged StateChanged",function(){e._handleState()}),u.bind("UploadFile",function(t,n){e._handleFileStatus(n)}),u.bind("FileUploaded",function(t,n){e._handleFileStatus(n),e._trigger("uploaded",null,{up:t,file:n})}),u.bind("UploadProgress",function(t,n){e._handleFileStatus(n),e._updateTotalProgress(),e._trigger("progress",null,{up:t,file:n})}),u.bind("UploadComplete",function(t,n){e._addFormFields(),e._trigger("complete",null,{up:t,files:n})})},_setOption:function(e,t){var n=this;e=="buttons"&&typeof t=="object"&&(t=i.extend(n.options.buttons,t),t.browse?(n.browse_button.button("enable").show(),n.uploader.disableBrowse(!1)):(n.browse_button.button("disable").hide(),n.uploader.disableBrowse(!0)),t.start?n.start_button.button("enable").show():n.start_button.button("disable").hide(),t.stop?n.start_button.button("enable").show():n.stop_button.button("disable").hide()),n.uploader.settings[e]=t},start:function(){this.uploader.start(),this._trigger("start",null,{up:this.uploader})},stop:function(){this.uploader.stop(),this._trigger("stop",null,{up:this.uploader})},enable:function(){this.browse_button.button("enable"),this.uploader.disableBrowse(!1)},disable:function(){this.browse_button.button("disable"),this.uploader.disableBrowse(!0)},getFile:function(e){var t;return typeof e=="number"?t=this.uploader.files[e]:t=this.uploader.getFile(e),t},getFiles:function(){return this.uploader.files},removeFile:function(e){n.typeOf(e)==="string"&&(e=this.getFile(e)),this.uploader.removeFile(e)},clearQueue:function(){this.uploader.splice()},getUploader:function(){return this.uploader},refresh:function(){this.uploader.refresh()},notify:function(e,t){var n=i('
',n.typeOf(e)!=="array"&&(e=[e]),i.each(e,function(e,i){var u=r.Mime.getFileExtension(i.name)||"none";o+=s.replace(/%(\w+)%/g,function(e,r){switch(r){case"thumb_width":case"thumb_height":return t.options[r];case"size":return n.formatSize(i.size);case"ext":return u;default:return i[r]||""}})}),t.filelist.append(o)},_addFormFields:function(){var e=this;i(".plupload_file_fields",this.filelist).html(""),n.each(this.uploader.files,function(t,r){var s="",o=e.id+"_"+r;t.target_name&&(s+=''),s+='',s+='',i("#"+t.id).find(".plupload_file_fields").html(s)}),this.counter.val(this.uploader.files.length)},_viewChanged:function(e){this.options.views.remember&&i.cookie&&i.cookie("plupload_ui_view",e,{expires:7,path:"/"}),r.Env.browser==="IE"&&r.Env.version<7&&this.content.attr("style",'height:expression(document.getElementById("'+this.id+"_container"+'").clientHeight - '+(e==="list"?132:102)+")"),this.container.removeClass("plupload_view_list plupload_view_thumbs").addClass("plupload_view_"+e),this.view_mode=e,this._trigger("viewchanged",null,{view:e})},_enableViewSwitcher:function(){var e=this,t,r=i(".plupload_view_switch",this.container),s,o;n.each(["list","thumbs"],function(t){e.options.views[t]||r.find('[for="'+e.id+"_view_"+t+'"], #'+e.id+"_view_"+t).remove()}),s=r.find(".plupload_button"),s.length===1?(r.hide(),t=s.eq(0).data("view"),this._viewChanged(t)):i.ui.button&&s.length>1?(this.options.views.remember&&i.cookie&&(t=i.cookie("plupload_ui_view")),~n.inArray(t,["list","thumbs"])||(t=this.options.views.active),r.show().buttonset().find(".ui-button").click(function(n){t=i(this).data("view"),e._viewChanged(t),n.preventDefault()}),o=r.find('[for="'+e.id+"_view_"+t+'"]'),o.length&&o.trigger("click")):(r.show(),this._viewChanged(this.options.views.active)),this.options.views.thumbs&&this._displayThumbs()},_enableRenaming:function(){var e=this;this.filelist.dblclick(function(t){var n=i(t.target),r,s,o,u,a="";if(!n.hasClass("plupload_file_name_wrapper"))return;s=e.uploader.getFile(n.closest(".plupload_file")[0].id),u=s.name,o=/^(.+)(\.[^.]+)$/.exec(u),o&&(u=o[1],a=o[2]),r=i('').width(n.width()).insertAfter(n.hide()),r.val(u).blur(function(){n.show().parent().scrollLeft(0).end().next().remove()}).keydown(function(e){var t=i(this);i.inArray(e.keyCode,[13,27])!==-1&&(e.preventDefault(),e.keyCode===13&&(s.name=t.val()+a,n.html(s.name)),t.blur())})[0].focus()})},_enableSortingList:function(){var e=this;if(i(".plupload_file",this.filelist).length<2)return;i("tbody",this.filelist).sortable("destroy"),this.filelist.sortable({items:".plupload_delete",cancel:"object, .plupload_clearer",stop:function(){var t=[];i.each(i(this).sortable("toArray"),function(n,r){t[t.length]=e.uploader.getFile(r)}),t.unshift(t.length),t.unshift(0),Array.prototype.splice.apply(e.uploader.files,t)}})}})})(window,document,plupload,mOxie,jQuery);
--------------------------------------------------------------------------------
/src/main/webapp/static/plupload/js/jquery.plupload.queue/jquery.plupload.queue.js:
--------------------------------------------------------------------------------
1 | /**
2 | * jquery.plupload.queue.js
3 | *
4 | * Copyright 2009, Moxiecode Systems AB
5 | * Released under GPL License.
6 | *
7 | * License: http://www.plupload.com/license
8 | * Contributing: http://www.plupload.com/contributing
9 | */
10 |
11 | /* global jQuery:true, alert:true */
12 |
13 | /**
14 | jQuery based implementation of the Plupload API - multi-runtime file uploading API.
15 |
16 | To use the widget you must include _jQuery_. It is not meant to be extended in any way and is provided to be
17 | used as it is.
18 |
19 | @example
20 |
21 |
22 |
Your browser doesn't have Flash, Silverlight or HTML5 support.
23 |
24 |
25 |
36 |
37 | @example
38 | // Retrieving a reference to plupload.Uploader object
39 | var uploader = $('#uploader').pluploadQueue();
40 |
41 | uploader.bind('FilesAdded', function() {
42 |
43 | // Autostart
44 | setTimeout(uploader.start, 1); // "detach" from the main thread
45 | });
46 |
47 | @class pluploadQueue
48 | @constructor
49 | @param {Object} settings For detailed information about each option check documentation.
50 | @param {String} settings.url URL of the server-side upload handler.
51 | @param {Number|String} [settings.chunk_size=0] Chunk size in bytes to slice the file into. Shorcuts with b, kb, mb, gb, tb suffixes also supported. `e.g. 204800 or "204800b" or "200kb"`. By default - disabled.
52 | @param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message.
53 | @param {Array} [settings.filters=[]] Set of file type filters, each one defined by hash of title and extensions. `e.g. {title : "Image files", extensions : "jpg,jpeg,gif,png"}`. Dispatches `plupload.FILE_EXTENSION_ERROR`
54 | @param {String} [settings.flash_swf_url] URL of the Flash swf.
55 | @param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs.
56 | @param {Number|String} [settings.max_file_size] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
57 | @param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event.
58 | @param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message.
59 | @param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload.
60 | @param {Boolean} [settings.multi_selection=true] Enable ability to select multiple files at once in file dialog.
61 | @param {Boolean} [settings.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
62 | @param {String|Object} [settings.required_features] Either comma-separated list or hash of required features that chosen runtime should absolutely possess.
63 | @param {Object} [settings.resize] Enable resizng of images on client-side. Applies to `image/jpeg` and `image/png` only. `e.g. {width : 200, height : 200, quality : 90, crop: true}`
64 | @param {Number} [settings.resize.width] If image is bigger, it will be resized.
65 | @param {Number} [settings.resize.height] If image is bigger, it will be resized.
66 | @param {Number} [settings.resize.quality=90] Compression quality for jpegs (1-100).
67 | @param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally.
68 | @param {String} [settings.runtimes="html5,flash,silverlight,html4"] Comma separated list of runtimes, that Plupload will try in turn, moving to the next if previous fails.
69 | @param {String} [settings.silverlight_xap_url] URL of the Silverlight xap.
70 | @param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files.
71 |
72 | @param {Boolean} [settings.dragdrop=true] Enable ability to add file to the queue by drag'n'dropping them from the desktop.
73 | @param {Boolean} [settings.rename=false] Enable ability to rename files in the queue.
74 | @param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure.
75 | */
76 | ;(function($, o) {
77 | var uploaders = {};
78 |
79 | function _(str) {
80 | return plupload.translate(str) || str;
81 | }
82 |
83 | function renderUI(id, target) {
84 | // Remove all existing non plupload items
85 | target.contents().each(function(i, node) {
86 | node = $(node);
87 |
88 | if (!node.is('.plupload')) {
89 | node.remove();
90 | }
91 | });
92 |
93 | target.prepend(
94 | '
' +
95 | '
' +
96 | '
' +
97 | '
' +
98 | '
' +
99 | '
' + _('Select files') + '
' +
100 | '
' + _('Add files to the upload queue and click the start button.') + '
');
362 | }
363 | });
364 |
365 | uploader.init();
366 |
367 | uploader.bind('StateChanged', function() {
368 | if (uploader.state === plupload.STARTED) {
369 | $('li.plupload_delete a,div.plupload_buttons', target).hide();
370 | uploader.disableBrowse(true);
371 |
372 | $('span.plupload_upload_status,div.plupload_progress,a.plupload_stop', target).css('display', 'block');
373 | $('span.plupload_upload_status', target).html('Uploaded ' + uploader.total.uploaded + '/' + uploader.files.length + ' files');
374 |
375 | if (settings.multiple_queues) {
376 | $('span.plupload_total_status,span.plupload_total_file_size', target).show();
377 | }
378 | } else {
379 | updateList();
380 | $('a.plupload_stop,div.plupload_progress', target).hide();
381 | $('a.plupload_delete', target).css('display', 'block');
382 |
383 | if (settings.multiple_queues && uploader.total.uploaded + uploader.total.failed == uploader.files.length) {
384 | $(".plupload_buttons,.plupload_upload_status", target).css("display", "inline");
385 | uploader.disableBrowse(false);
386 |
387 | $(".plupload_start", target).addClass("plupload_disabled");
388 | $('span.plupload_total_status,span.plupload_total_file_size', target).hide();
389 | }
390 | }
391 | });
392 |
393 | uploader.bind('FilesAdded', updateList);
394 |
395 | uploader.bind('FilesRemoved', function() {
396 | // since the whole file list is redrawn for every change in the queue
397 | // we need to scroll back to the file removal point to avoid annoying
398 | // scrolling to the bottom bug (see #926)
399 | var scrollTop = $('#' + id + '_filelist').scrollTop();
400 | updateList();
401 | $('#' + id + '_filelist').scrollTop(scrollTop);
402 | });
403 |
404 | uploader.bind('FileUploaded', function(up, file) {
405 | handleStatus(file);
406 | });
407 |
408 | uploader.bind("UploadProgress", function(up, file) {
409 | // Set file specific progress
410 | $('#' + file.id + ' div.plupload_file_status', target).html(file.percent + '%');
411 |
412 | handleStatus(file);
413 | updateTotalProgress();
414 | });
415 |
416 | // Call setup function
417 | if (settings.setup) {
418 | settings.setup(uploader);
419 | }
420 | });
421 |
422 | return this;
423 | } else {
424 | // Get uploader instance for specified element
425 | return uploaders[$(this[0]).attr('id')];
426 | }
427 | };
428 | })(jQuery, mOxie);
429 |
--------------------------------------------------------------------------------
/src/main/webapp/static/plupload/js/jquery.ui.plupload/jquery.ui.plupload.js:
--------------------------------------------------------------------------------
1 | /**
2 | * jquery.ui.plupload.js
3 | *
4 | * Copyright 2013, Moxiecode Systems AB
5 | * Released under GPL License.
6 | *
7 | * License: http://www.plupload.com/license
8 | * Contributing: http://www.plupload.com/contributing
9 | *
10 | * Depends:
11 | * jquery.ui.core.js
12 | * jquery.ui.widget.js
13 | * jquery.ui.button.js
14 | * jquery.ui.progressbar.js
15 | *
16 | * Optionally:
17 | * jquery.ui.sortable.js
18 | */
19 |
20 | /* global jQuery:true */
21 |
22 | /**
23 | jQuery UI based implementation of the Plupload API - multi-runtime file uploading API.
24 |
25 | To use the widget you must include _jQuery_ and _jQuery UI_ bundle (including `ui.core`, `ui.widget`, `ui.button`,
26 | `ui.progressbar` and `ui.sortable`).
27 |
28 | In general the widget is designed the way that you do not usually need to do anything to it after you instantiate it.
29 | But! You still can intervenue, to some extent, in case you need to. Although, due to the fact that widget is based on
30 | _jQuery UI_ widget factory, there are some specifics. See examples below for more details.
31 |
32 | @example
33 |
34 |
35 |
Your browser doesn't have Flash, Silverlight or HTML5 support.
36 |
37 |
38 |
50 |
51 | @example
52 | // Invoking methods:
53 | $('#uploader').plupload(options);
54 |
55 | // Display welcome message in the notification area
56 | $('#uploader').plupload('notify', 'info', "This might be obvious, but you need to click 'Add Files' to add some files.");
57 |
58 | @example
59 | // Subscribing to the events...
60 | // ... on initialization:
61 | $('#uploader').plupload({
62 | ...
63 | viewchanged: function(event, args) {
64 | // stuff ...
65 | }
66 | });
67 | // ... or after initialization
68 | $('#uploader').on("viewchanged", function(event, args) {
69 | // stuff ...
70 | });
71 |
72 | @class UI.Plupload
73 | @constructor
74 | @param {Object} settings For detailed information about each option check documentation.
75 | @param {String} settings.url URL of the server-side upload handler.
76 | @param {Number|String} [settings.chunk_size=0] Chunk size in bytes to slice the file into. Shorcuts with b, kb, mb, gb, tb suffixes also supported. `e.g. 204800 or "204800b" or "200kb"`. By default - disabled.
77 | @param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message.
78 | @param {Object} [settings.filters={}] Set of file type filters.
79 | @param {Array} [settings.filters.mime_types=[]] List of file types to accept, each one defined by title and list of extensions. `e.g. {title : "Image files", extensions : "jpg,jpeg,gif,png"}`. Dispatches `plupload.FILE_EXTENSION_ERROR`
80 | @param {String|Number} [settings.filters.max_file_size=0] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
81 | @param {Boolean} [settings.filters.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
82 | @param {Number} [settings.filters.max_file_count=0] Limit the number of files that can reside in the queue at the same time (default is 0 - no limit).
83 | @param {String} [settings.flash_swf_url] URL of the Flash swf.
84 | @param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs.
85 | @param {Number|String} [settings.max_file_size] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
86 | @param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event.
87 | @param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message.
88 | @param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload.
89 | @param {Boolean} [settings.multi_selection=true] Enable ability to select multiple files at once in file dialog.
90 | @param {Boolean} [settings.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
91 | @param {String|Object} [settings.required_features] Either comma-separated list or hash of required features that chosen runtime should absolutely possess.
92 | @param {Object} [settings.resize] Enable resizng of images on client-side. Applies to `image/jpeg` and `image/png` only. `e.g. {width : 200, height : 200, quality : 90, crop: true}`
93 | @param {Number} [settings.resize.width] If image is bigger, it will be resized.
94 | @param {Number} [settings.resize.height] If image is bigger, it will be resized.
95 | @param {Number} [settings.resize.quality=90] Compression quality for jpegs (1-100).
96 | @param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally.
97 | @param {String} [settings.runtimes="html5,flash,silverlight,html4"] Comma separated list of runtimes, that Plupload will try in turn, moving to the next if previous fails.
98 | @param {String} [settings.silverlight_xap_url] URL of the Silverlight xap.
99 | @param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files.
100 |
101 | @param {Boolean} [settings.autostart=false] Whether to auto start uploading right after file selection.
102 | @param {Boolean} [settings.dragdrop=true] Enable ability to add file to the queue by drag'n'dropping them from the desktop.
103 | @param {Boolean} [settings.rename=false] Enable ability to rename files in the queue.
104 | @param {Boolean} [settings.sortable=false] Enable ability to sort files in the queue, changing their uploading priority.
105 | @param {Object} [settings.buttons] Control the visibility of functional buttons.
106 | @param {Boolean} [settings.buttons.browse=true] Display browse button.
107 | @param {Boolean} [settings.buttons.start=true] Display start button.
108 | @param {Boolean} [settings.buttons.stop=true] Display stop button.
109 | @param {Object} [settings.views] Control various views of the file queue.
110 | @param {Boolean} [settings.views.list=true] Enable list view.
111 | @param {Boolean} [settings.views.thumbs=false] Enable thumbs view.
112 | @param {String} [settings.views.default='list'] Default view.
113 | @param {Boolean} [settings.views.remember=true] Whether to remember the current view (requires jQuery Cookie plugin).
114 | @param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure.
115 | */
116 | ;(function(window, document, plupload, o, $) {
117 |
118 | /**
119 | Dispatched when the widget is initialized and ready.
120 |
121 | @event ready
122 | @param {plupload.Uploader} uploader Uploader instance sending the event.
123 | */
124 |
125 | /**
126 | Dispatched when file dialog is closed.
127 |
128 | @event selected
129 | @param {plupload.Uploader} uploader Uploader instance sending the event.
130 | @param {Array} files Array of selected files represented by plupload.File objects
131 | */
132 |
133 | /**
134 | Dispatched when file dialog is closed.
135 |
136 | @event removed
137 | @param {plupload.Uploader} uploader Uploader instance sending the event.
138 | @param {Array} files Array of removed files represented by plupload.File objects
139 | */
140 |
141 | /**
142 | Dispatched when upload is started.
143 |
144 | @event start
145 | @param {plupload.Uploader} uploader Uploader instance sending the event.
146 | */
147 |
148 | /**
149 | Dispatched when upload is stopped.
150 |
151 | @event stop
152 | @param {plupload.Uploader} uploader Uploader instance sending the event.
153 | */
154 |
155 | /**
156 | Dispatched during the upload process.
157 |
158 | @event progress
159 | @param {plupload.Uploader} uploader Uploader instance sending the event.
160 | @param {plupload.File} file File that is being uploaded (includes loaded and percent properties among others).
161 | @param {Number} size Total file size in bytes.
162 | @param {Number} loaded Number of bytes uploaded of the files total size.
163 | @param {Number} percent Number of percentage uploaded of the file.
164 | */
165 |
166 | /**
167 | Dispatched when file is uploaded.
168 |
169 | @event uploaded
170 | @param {plupload.Uploader} uploader Uploader instance sending the event.
171 | @param {plupload.File} file File that was uploaded.
172 | @param {Enum} status Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
173 | */
174 |
175 | /**
176 | Dispatched when upload of the whole queue is complete.
177 |
178 | @event complete
179 | @param {plupload.Uploader} uploader Uploader instance sending the event.
180 | @param {Array} files Array of uploaded files represented by plupload.File objects
181 | */
182 |
183 | /**
184 | Dispatched when the view is changed, e.g. from `list` to `thumbs` or vice versa.
185 |
186 | @event viewchanged
187 | @param {plupload.Uploader} uploader Uploader instance sending the event.
188 | @param {String} type Current view type.
189 | */
190 |
191 | /**
192 | Dispatched when error of some kind is detected.
193 |
194 | @event error
195 | @param {plupload.Uploader} uploader Uploader instance sending the event.
196 | @param {String} error Error message.
197 | @param {plupload.File} file File that was uploaded.
198 | @param {Enum} status Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
199 | */
200 |
201 | var uploaders = {};
202 |
203 | function _(str) {
204 | return plupload.translate(str) || str;
205 | }
206 |
207 | function renderUI(obj) {
208 | obj.id = obj.attr('id');
209 |
210 | obj.html(
211 | '
' +
212 | '
' +
213 | '
' +
214 | '
' +
215 | '
' +
216 | '
' + _("Select files") + '
' +
217 | '
' + _("Add files to the upload queue and click the start button.") + '