plupload-rails 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +34 -35
  3. data/lib/plupload/rails/version.rb +2 -2
  4. data/vendor/assets/images/jquery.plupload.queue/backgrounds.gif +0 -0
  5. data/vendor/assets/images/jquery.plupload.queue/buttons-disabled.png +0 -0
  6. data/vendor/assets/images/jquery.plupload.queue/buttons.png +0 -0
  7. data/vendor/assets/images/jquery.plupload.queue/delete.gif +0 -0
  8. data/vendor/assets/images/jquery.plupload.queue/done.gif +0 -0
  9. data/vendor/assets/images/jquery.plupload.queue/error.gif +0 -0
  10. data/vendor/assets/images/jquery.plupload.queue/throbber.gif +0 -0
  11. data/vendor/assets/images/jquery.plupload.queue/transp50.png +0 -0
  12. data/vendor/assets/images/jquery.ui.plupload/loading.gif +0 -0
  13. data/vendor/assets/images/jquery.ui.plupload/plupload.png +0 -0
  14. data/vendor/assets/javascripts/jquery.plupload.queue.js +27 -17
  15. data/vendor/assets/javascripts/jquery.ui.plupload.js +308 -217
  16. data/vendor/assets/javascripts/moxie.js +906 -661
  17. data/vendor/assets/javascripts/plupload.dev.js +727 -537
  18. data/vendor/assets/javascripts/plupload/i18n/ar.js +2 -0
  19. data/vendor/assets/javascripts/plupload/i18n/bs.js +1 -0
  20. data/vendor/assets/javascripts/plupload/i18n/ca.js +2 -0
  21. data/vendor/assets/javascripts/plupload/i18n/cs.js +1 -0
  22. data/vendor/assets/javascripts/plupload/i18n/cy.js +1 -0
  23. data/vendor/assets/javascripts/plupload/i18n/da.js +1 -0
  24. data/vendor/assets/javascripts/plupload/i18n/de.js +2 -1
  25. data/vendor/assets/javascripts/plupload/i18n/el.js +1 -0
  26. data/vendor/assets/javascripts/plupload/i18n/en.js +1 -0
  27. data/vendor/assets/javascripts/plupload/i18n/es.js +2 -1
  28. data/vendor/assets/javascripts/plupload/i18n/et.js +1 -0
  29. data/vendor/assets/javascripts/plupload/i18n/fa.js +1 -0
  30. data/vendor/assets/javascripts/plupload/i18n/fi.js +1 -0
  31. data/vendor/assets/javascripts/plupload/i18n/fr.js +2 -1
  32. data/vendor/assets/javascripts/plupload/i18n/he.js +2 -0
  33. data/vendor/assets/javascripts/plupload/i18n/hr.js +1 -0
  34. data/vendor/assets/javascripts/plupload/i18n/hu.js +2 -1
  35. data/vendor/assets/javascripts/plupload/i18n/hy.js +1 -0
  36. data/vendor/assets/javascripts/plupload/i18n/id.js +2 -0
  37. data/vendor/assets/javascripts/plupload/i18n/it.js +1 -0
  38. data/vendor/assets/javascripts/plupload/i18n/ja.js +1 -0
  39. data/vendor/assets/javascripts/plupload/i18n/ka.js +1 -0
  40. data/vendor/assets/javascripts/plupload/i18n/kk.js +2 -0
  41. data/vendor/assets/javascripts/plupload/i18n/ko.js +1 -0
  42. data/vendor/assets/javascripts/plupload/i18n/lt.js +1 -0
  43. data/vendor/assets/javascripts/plupload/i18n/lv.js +2 -1
  44. data/vendor/assets/javascripts/plupload/i18n/nl.js +1 -0
  45. data/vendor/assets/javascripts/plupload/i18n/pl.js +1 -0
  46. data/vendor/assets/javascripts/plupload/i18n/pt_BR.js +1 -0
  47. data/vendor/assets/javascripts/plupload/i18n/ro.js +2 -1
  48. data/vendor/assets/javascripts/plupload/i18n/ru.js +2 -1
  49. data/vendor/assets/javascripts/plupload/i18n/sk.js +1 -0
  50. data/vendor/assets/javascripts/plupload/i18n/sr.js +1 -0
  51. data/vendor/assets/javascripts/plupload/i18n/sv.js +1 -0
  52. data/vendor/assets/javascripts/plupload/i18n/th_TH.js +1 -0
  53. data/vendor/assets/javascripts/plupload/i18n/tr.js +1 -0
  54. data/vendor/assets/javascripts/plupload/i18n/uk_UA.js +1 -0
  55. data/vendor/assets/javascripts/plupload/i18n/zh_CN.js +1 -0
  56. data/vendor/assets/javascripts/plupload/i18n/zh_TW.js +2 -0
  57. data/vendor/assets/misc/Moxie.swf +0 -0
  58. data/vendor/assets/misc/Moxie.xap +0 -0
  59. data/vendor/assets/stylesheets/{jquery.plupload.queue.scss → jquery.plupload.queue.css.erb} +15 -11
  60. data/vendor/assets/stylesheets/{jquery.ui.plupload.scss → jquery.ui.plupload.css.erb} +3 -3
  61. metadata +18 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4edc4a0e6b78a167279855c9048c01f6f5bb29ca
4
- data.tar.gz: 1474250f54c612c5f2802262119812cc8482cb3e
3
+ metadata.gz: f0a4b034445c763d70d1ac0ed530bd21f3847bca
4
+ data.tar.gz: 4183a59bcb2e0edd678057a3852c7c12418379ca
5
5
  SHA512:
6
- metadata.gz: 7b2178e38ff94c99e6cdb75bb3b93ca37e292388ca8b2b47716e32344c2f4a0af42ad904881d7668316ed46557644fa748e841ccd02a003f0fd9481e5c3faf5b
7
- data.tar.gz: f4693bd8457cb245978b2376eeb5962f61aca930567525224675966fae25bf2d98780b016ab2c07c7415e76ca8c75a707ecb7e909ae4c856c23312c95f0ae351
6
+ metadata.gz: 2dadab599c2c00f1fb5a5ff0fabf8dda446011e9ad939eb4b69144ddbfa31f0a5f0b4ac3407bf1e926860cf516b05b9ed3b89b9bcac626a846fa64128e99a623
7
+ data.tar.gz: 35557515d0e32c73fdcc0c662d226fb0faa66b6735fcc91df8a8d9771445bab23dcd2c1c10b9d001f9e5ed3ce968f642b7fff1189adb749d7bd2975c63ec9489
data/README.md CHANGED
@@ -9,9 +9,9 @@ Install
9
9
 
10
10
  Just add it got your Gemfile:
11
11
 
12
-
13
- gem 'plupload-rails'
14
-
12
+ ```ruby
13
+ gem 'plupload-rails'
14
+ ```
15
15
 
16
16
  Quick Start
17
17
  --
@@ -31,45 +31,44 @@ Add to your application.js:
31
31
  //= require jquery.plupload.queue
32
32
 
33
33
 
34
- Add to your application.scss:
35
-
36
- @import "jquery.plupload.queue";
34
+ Add to your application stylesheet:
37
35
 
36
+ //= require jquery.plupload.queue
38
37
 
39
- Alternatively (if you're not using SASS or SCSS), add the require to your application.css:
40
-
41
- = require jquery.plupload.queue
42
38
 
43
39
  Simple example Haml for your views:
44
40
 
45
- div#uploader
46
- :javascript
47
- $(function(){
48
- $("#uploader").pluploadQueue({
49
- runtimes: 'gears,flash,silverlight,browserplus,html5',
50
- url: '#{images_path}',
51
- multipart_params: {
52
- '#{request_forgery_protection_token}': '#{form_authenticity_token}',
53
- '#{Rails.application.config.session_options[:key]}': '#{request.session_options[:id]}'
54
- }
55
- });
56
- });
41
+ ```haml
42
+ div#uploader
43
+ :javascript
44
+ $(function(){
45
+ $("#uploader").pluploadQueue({
46
+ runtimes: 'gears,flash,silverlight,browserplus,html5',
47
+ url: '#{images_path}',
48
+ multipart_params: {
49
+ '#{request_forgery_protection_token}': '#{form_authenticity_token}',
50
+ '#{Rails.application.config.session_options[:key]}': '#{request.session_options[:id]}'
51
+ }
52
+ });
53
+ });
54
+ ```
57
55
 
58
56
  And the same in ERB:
59
57
 
60
- <script>
61
- $(function(){
62
- $("#uploader").pluploadQueue({
63
- runtimes: 'html5,flash,silverlight',
64
- url: '<%= sink_hole_path %>',
65
- multipart_params: {
66
- '<%= request_forgery_protection_token %>': '<%= form_authenticity_token %>',
67
- '<%= Rails.application.config.session_options[:key] %>': '<%= request.session_options[:id] %>'
68
- }
69
- });
70
- });
71
- </script>
72
-
58
+ ```erb
59
+ <script>
60
+ $(function(){
61
+ $("#uploader").pluploadQueue({
62
+ runtimes: 'html5,flash,silverlight',
63
+ url: '<%= sink_hole_path %>',
64
+ multipart_params: {
65
+ '<%= request_forgery_protection_token %>': '<%= form_authenticity_token %>',
66
+ '<%= Rails.application.config.session_options[:key] %>': '<%= request.session_options[:id] %>'
67
+ }
68
+ });
69
+ });
70
+ </script>
71
+ ```
73
72
 
74
73
  Updating
75
74
  --
@@ -81,4 +80,4 @@ License
81
80
 
82
81
  Dual licensed under the [GPLv2 license](GPL-LICENSE.txt) and the [MIT license](MIT-LICENSE.txt). Plupload itself (including the JS, CSS, images, the Silverlight and Flash components) is licensed under GPLv2, unless you have acquired a [commercial license](http://plupload.com/license.php).
83
82
 
84
- Copyright © 2011-2013 Corin Langosch and contributors
83
+ Copyright © 2011-2013 [Corin Langosch](http://www.corinlangosch.com) and contributors
@@ -1,6 +1,6 @@
1
1
  module Plupload
2
- VERSION = "2.0.0"
2
+ VERSION = "2.1.1"
3
3
  module Rails
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
5
5
  end
6
6
  end
File without changes
File without changes
File without changes
File without changes
@@ -39,7 +39,7 @@ used as it is.
39
39
  var uploader = $('#uploader').pluploadQueue();
40
40
 
41
41
  uploader.bind('FilesAdded', function() {
42
-
42
+
43
43
  // Autostart
44
44
  setTimeout(uploader.start, 1); // "detach" from the main thread
45
45
  });
@@ -73,7 +73,7 @@ used as it is.
73
73
  @param {Boolean} [settings.rename=false] Enable ability to rename files in the queue.
74
74
  @param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure.
75
75
  */
76
- (function($) {
76
+ (function($, o) {
77
77
  var uploaders = {};
78
78
 
79
79
  function _(str) {
@@ -154,11 +154,18 @@ used as it is.
154
154
  contents_bak = target.html();
155
155
  renderUI(id, target);
156
156
 
157
- uploader = new plupload.Uploader($.extend({
157
+ settings = $.extend({
158
158
  dragdrop : true,
159
159
  browse_button : id + '_browse',
160
160
  container : id
161
- }, settings));
161
+ }, settings);
162
+
163
+ // Enable drag/drop (see PostInit handler as well)
164
+ if (settings.dragdrop) {
165
+ settings.drop_element = id + '_filelist';
166
+ }
167
+
168
+ uploader = new plupload.Uploader(settings);
162
169
 
163
170
  uploaders[id] = uploader;
164
171
 
@@ -183,7 +190,7 @@ used as it is.
183
190
 
184
191
  var icon = $('#' + file.id).attr('class', actionClass).find('a').css('display', 'block');
185
192
  if (file.hint) {
186
- icon.attr('title', file.hint);
193
+ icon.attr('title', file.hint);
187
194
  }
188
195
  }
189
196
 
@@ -191,7 +198,7 @@ used as it is.
191
198
  $('span.plupload_total_status', target).html(uploader.total.percent + '%');
192
199
  $('div.plupload_progress_bar', target).css('width', uploader.total.percent + '%');
193
200
  $('span.plupload_upload_status', target).html(
194
- _('Uploaded %d/%d files').replace(/%d\/%d/, uploader.total.uploaded+'/'+uploader.files.length)
201
+ o.sprintf(_('Uploaded %d/%d files'), uploader.total.uploaded, uploader.files.length)
195
202
  );
196
203
  }
197
204
 
@@ -208,7 +215,7 @@ used as it is.
208
215
 
209
216
  inputHTML += '<input type="hidden" name="' + id + '_' + inputCount + '_name" value="' + plupload.xmlEncode(file.name) + '" />';
210
217
  inputHTML += '<input type="hidden" name="' + id + '_' + inputCount + '_status" value="' + (file.status == plupload.DONE ? 'done' : 'failed') + '" />';
211
-
218
+
212
219
  inputCount++;
213
220
 
214
221
  $('#' + id + '_count').val(inputCount);
@@ -240,7 +247,7 @@ used as it is.
240
247
  if (uploader.total.queued === 0) {
241
248
  $('span.plupload_add_text', target).html(_('Add Files'));
242
249
  } else {
243
- $('span.plupload_add_text', target).html(_('%d files queued').replace(/%d/, uploader.total.queued));
250
+ $('span.plupload_add_text', target).html(o.sprintf(_('%d files queued'), uploader.total.queued));
244
251
  }
245
252
 
246
253
  $('a.plupload_start', target).toggleClass('plupload_disabled', uploader.files.length == (uploader.total.uploaded + uploader.total.failed));
@@ -301,12 +308,6 @@ used as it is.
301
308
  });
302
309
  }
303
310
 
304
-
305
- // Enable drag/drop (see PostInit handler as well)
306
- if (up.settings.dragdrop) {
307
- up.settings.drop_element = id + '_filelist';
308
- }
309
-
310
311
  $('#' + id + '_container').attr('title', 'Using runtime: ' + res.runtime);
311
312
 
312
313
  $('a.plupload_start', target).click(function(e) {
@@ -342,7 +343,7 @@ used as it is.
342
343
  if (err.code == plupload.FILE_EXTENSION_ERROR) {
343
344
  alert(_("Error: Invalid file extension:") + " " + file.name);
344
345
  }
345
-
346
+
346
347
  file.hint = message;
347
348
  $('#' + file.id).attr('class', 'plupload_failed').find('a').css('display', 'block').attr('title', message);
348
349
  }
@@ -385,7 +386,16 @@ used as it is.
385
386
  }
386
387
  });
387
388
 
388
- uploader.bind('QueueChanged', updateList);
389
+ uploader.bind('FilesAdded', updateList);
390
+
391
+ uploader.bind('FilesRemoved', function() {
392
+ // since the whole file list is redrawn for every change in the queue
393
+ // we need to scroll back to the file removal point to avoid annoying
394
+ // scrolling to the bottom bug (see #926)
395
+ var scrollTop = $('#' + id + '_filelist').scrollTop();
396
+ updateList();
397
+ $('#' + id + '_filelist').scrollTop(scrollTop);
398
+ });
389
399
 
390
400
  uploader.bind('FileUploaded', function(up, file) {
391
401
  handleStatus(file);
@@ -411,4 +421,4 @@ used as it is.
411
421
  return uploaders[$(this[0]).attr('id')];
412
422
  }
413
423
  };
414
- })(jQuery);
424
+ })(jQuery, mOxie);
@@ -12,7 +12,7 @@
12
12
  * jquery.ui.widget.js
13
13
  * jquery.ui.button.js
14
14
  * jquery.ui.progressbar.js
15
- *
15
+ *
16
16
  * Optionally:
17
17
  * jquery.ui.sortable.js
18
18
  */
@@ -22,11 +22,11 @@
22
22
  /**
23
23
  jQuery UI based implementation of the Plupload API - multi-runtime file uploading API.
24
24
 
25
- To use the widget you must include _jQuery_ and _jQuery UI_ bundle (including `ui.core`, `ui.widget`, `ui.button`,
25
+ To use the widget you must include _jQuery_ and _jQuery UI_ bundle (including `ui.core`, `ui.widget`, `ui.button`,
26
26
  `ui.progressbar` and `ui.sortable`).
27
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
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
30
  _jQuery UI_ widget factory, there are some specifics. See examples below for more details.
31
31
 
32
32
  @example
@@ -58,7 +58,7 @@ _jQuery UI_ widget factory, there are some specifics. See examples below for mor
58
58
  @example
59
59
  // Subscribing to the events...
60
60
  // ... on initialization:
61
- $('#uploader').plupload({
61
+ $('#uploader').plupload({
62
62
  ...
63
63
  viewchanged: function(event, args) {
64
64
  // stuff ...
@@ -98,10 +98,10 @@ _jQuery UI_ widget factory, there are some specifics. See examples below for mor
98
98
  @param {Boolean} [settings.dragdrop=true] Enable ability to add file to the queue by drag'n'dropping them from the desktop.
99
99
  @param {Boolean} [settings.rename=false] Enable ability to rename files in the queue.
100
100
  @param {Boolean} [settings.sortable=false] Enable ability to sort files in the queue, changing their uploading priority.
101
- @param {Object} [settings.buttons] Control the visibility of functional buttons.
101
+ @param {Object} [settings.buttons] Control the visibility of functional buttons.
102
102
  @param {Boolean} [settings.buttons.browse=true] Display browse button.
103
103
  @param {Boolean} [settings.buttons.start=true] Display start button.
104
- @param {Boolean} [settings.buttons.stop=true] Display stop button.
104
+ @param {Boolean} [settings.buttons.stop=true] Display stop button.
105
105
  @param {Object} [settings.views] Control various views of the file queue.
106
106
  @param {Boolean} [settings.views.list=true] Enable list view.
107
107
  @param {Boolean} [settings.views.thumbs=false] Enable thumbs view.
@@ -110,7 +110,7 @@ _jQuery UI_ widget factory, there are some specifics. See examples below for mor
110
110
  @param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure.
111
111
  @param {Number} [settings.max_file_count=0] Limit the number of files user is able to upload in one go, autosets _multiple_queues_ to _false_ (default is 0 - no limit).
112
112
  */
113
- (function(window, document, plupload, $) {
113
+ (function(window, document, plupload, o, $) {
114
114
 
115
115
  /**
116
116
  Dispatched when the widget is initialized and ready.
@@ -195,13 +195,13 @@ Dispatched when error of some kind is detected.
195
195
  @param {Enum} status Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
196
196
  */
197
197
 
198
- var uploaders = {};
199
-
198
+ var uploaders = {};
199
+
200
200
  function _(str) {
201
201
  return plupload.translate(str) || str;
202
202
  }
203
203
 
204
- function renderUI(obj) {
204
+ function renderUI(obj) {
205
205
  obj.id = obj.attr('id');
206
206
 
207
207
  obj.html(
@@ -213,8 +213,8 @@ function renderUI(obj) {
213
213
  '<div class="plupload_header_title">' + _('Select files') + '</div>' +
214
214
  '<div class="plupload_header_text">' + _('Add files to the upload queue and click the start button.') + '</div>' +
215
215
  '<div class="plupload_view_switch">' +
216
- '<input type="radio" id="'+obj.id+'_view_list" name="view_mode_'+obj.id+'" checked="checked" /> <label class="plupload_button" for="'+obj.id+'_view_list" data-view="list">' + _('List') + '</label>' +
217
- '<input type="radio" id="'+obj.id+'_view_thumbs" name="view_mode_'+obj.id+'" /> <label class="plupload_button" for="'+obj.id+'_view_thumbs" data-view="thumbs">' + _('Thumbnails') + '</label>' +
216
+ '<input type="radio" id="'+obj.id+'_view_list" name="view_mode_'+obj.id+'" checked="checked" /><label class="plupload_button" for="'+obj.id+'_view_list" data-view="list">' + _('List') + '</label>' +
217
+ '<input type="radio" id="'+obj.id+'_view_thumbs" name="view_mode_'+obj.id+'" /><label class="plupload_button" for="'+obj.id+'_view_thumbs" data-view="thumbs">' + _('Thumbnails') + '</label>' +
218
218
  '</div>' +
219
219
  '</div>' +
220
220
  '</div>' +
@@ -233,7 +233,7 @@ function renderUI(obj) {
233
233
  '<ul class="plupload_filelist_content"> </ul>' +
234
234
  '<div class="plupload_clearer">&nbsp;</div>' +
235
235
  '</div>' +
236
-
236
+
237
237
  '<table class="plupload_filelist plupload_filelist_footer ui-widget-header">' +
238
238
  '<tr>' +
239
239
  '<td class="plupload_cell plupload_file_name">' +
@@ -269,22 +269,20 @@ function renderUI(obj) {
269
269
  $.widget("ui.plupload", {
270
270
 
271
271
  widgetEventPrefix: '',
272
-
273
- imgs: {},
274
-
272
+
275
273
  contents_bak: '',
276
-
274
+
277
275
  options: {
278
276
  browse_button_hover: 'ui-state-hover',
279
277
  browse_button_active: 'ui-state-active',
280
-
278
+
281
279
  // widget specific
282
- dragdrop : true,
280
+ dragdrop : true,
283
281
  multiple_queues: true, // re-use widget by default
284
282
  buttons: {
285
283
  browse: true,
286
284
  start: true,
287
- stop: true
285
+ stop: true
288
286
  },
289
287
  views: {
290
288
  list: true,
@@ -297,9 +295,9 @@ $.widget("ui.plupload", {
297
295
  rename: false,
298
296
  max_file_count: 0 // unlimited
299
297
  },
300
-
298
+
301
299
  FILE_COUNT_ERROR: -9001,
302
-
300
+
303
301
  _create: function() {
304
302
  var id = this.element.attr('id');
305
303
  if (!id) {
@@ -307,30 +305,30 @@ $.widget("ui.plupload", {
307
305
  this.element.attr('id', id);
308
306
  }
309
307
  this.id = id;
310
-
308
+
311
309
  // backup the elements initial state
312
310
  this.contents_bak = this.element.html();
313
311
  renderUI(this.element);
314
-
312
+
315
313
  // container, just in case
316
- this.container = $('.plupload_container', this.element).attr('id', id + '_container');
314
+ this.container = $('.plupload_container', this.element).attr('id', id + '_container');
317
315
 
318
316
  this.content = $('.plupload_content', this.element);
319
-
317
+
320
318
  if ($.fn.resizable) {
321
- this.container.resizable({
319
+ this.container.resizable({
322
320
  handles: 's',
323
321
  minHeight: 300
324
322
  });
325
323
  }
326
-
324
+
327
325
  // list of files, may become sortable
328
326
  this.filelist = $('.plupload_filelist_content', this.container)
329
327
  .attr({
330
328
  id: id + '_filelist',
331
329
  unselectable: 'on'
332
330
  });
333
-
331
+
334
332
 
335
333
  // buttons
336
334
  this.browse_button = $('.plupload_add', this.container).attr('id', id + '_browse');
@@ -338,22 +336,22 @@ $.widget("ui.plupload", {
338
336
  this.stop_button = $('.plupload_stop', this.container).attr('id', id + '_stop');
339
337
  this.thumbs_switcher = $('#' + id + '_view_thumbs');
340
338
  this.list_switcher = $('#' + id + '_view_list');
341
-
339
+
342
340
  if ($.ui.button) {
343
341
  this.browse_button.button({
344
342
  icons: { primary: 'ui-icon-circle-plus' },
345
343
  disabled: true
346
344
  });
347
-
345
+
348
346
  this.start_button.button({
349
347
  icons: { primary: 'ui-icon-circle-arrow-e' },
350
348
  disabled: true
351
349
  });
352
-
350
+
353
351
  this.stop_button.button({
354
352
  icons: { primary: 'ui-icon-circle-close' }
355
353
  });
356
-
354
+
357
355
  this.list_switcher.button({
358
356
  text: false,
359
357
  icons: { secondary: "ui-icon-grip-dotted-horizontal" }
@@ -364,21 +362,21 @@ $.widget("ui.plupload", {
364
362
  icons: { secondary: "ui-icon-image" }
365
363
  });
366
364
  }
367
-
365
+
368
366
  // progressbar
369
- this.progressbar = $('.plupload_progress_container', this.container);
370
-
367
+ this.progressbar = $('.plupload_progress_container', this.container);
368
+
371
369
  if ($.ui.progressbar) {
372
370
  this.progressbar.progressbar();
373
371
  }
374
-
372
+
375
373
  // counter
376
374
  this.counter = $('.plupload_count', this.element)
377
375
  .attr({
378
376
  id: id + '_count',
379
377
  name: id + '_count'
380
378
  });
381
-
379
+
382
380
  // initialize uploader instance
383
381
  this._initUploader();
384
382
  },
@@ -387,7 +385,7 @@ $.widget("ui.plupload", {
387
385
  var self = this
388
386
  , id = this.id
389
387
  , uploader
390
- , options = {
388
+ , options = {
391
389
  container: id + '_buttons',
392
390
  browse_button: id + '_browse'
393
391
  }
@@ -400,51 +398,48 @@ $.widget("ui.plupload", {
400
398
  options.drop_element = this.id + '_dropbox';
401
399
  }
402
400
 
401
+ uploader = this.uploader = uploaders[id] = new plupload.Uploader($.extend(this.options, options));
402
+
403
403
  if (self.options.views.thumbs) {
404
- if (o.typeOf(self.options.required_features) === 'string') {
405
- self.options.required_features += ",display_media";
406
- } else {
407
- self.options.required_features = "display_media";
408
- }
404
+ uploader.settings.required_features.display_media = true;
409
405
  }
410
406
 
411
- uploader = this.uploader = uploaders[id] = new plupload.Uploader($.extend(this.options, options));
412
407
 
413
- uploader.bind('Error', function(up, err) {
408
+ uploader.bind('Error', function(up, err) {
414
409
  var message, details = "";
415
410
 
416
411
  message = '<strong>' + err.message + '</strong>';
417
-
412
+
418
413
  switch (err.code) {
419
414
  case plupload.FILE_EXTENSION_ERROR:
420
415
  details = o.sprintf(_("File: %s"), err.file.name);
421
416
  break;
422
-
417
+
423
418
  case plupload.FILE_SIZE_ERROR:
424
- details = o.sprintf(_("File: %f, size: %s, max file size: %m"), err.file.name, err.file.size, plupload.parseSize(self.options.max_file_size));
419
+ details = o.sprintf(_("File: %s, size: %d, max file size: %d"), err.file.name, err.file.size, plupload.parseSize(self.options.max_file_size));
425
420
  break;
426
421
 
427
422
  case plupload.FILE_DUPLICATE_ERROR:
428
423
  details = o.sprintf(_("%s already present in the queue."), err.file.name);
429
424
  break;
430
-
425
+
431
426
  case self.FILE_COUNT_ERROR:
432
427
  details = o.sprintf(_("Upload element accepts only %d file(s) at a time. Extra files were stripped."), self.options.max_file_count);
433
428
  break;
434
-
429
+
435
430
  case plupload.IMAGE_FORMAT_ERROR :
436
431
  details = _("Image format either wrong or not supported.");
437
- break;
438
-
432
+ break;
433
+
439
434
  case plupload.IMAGE_MEMORY_ERROR :
440
435
  details = _("Runtime ran out of available memory.");
441
436
  break;
442
-
437
+
443
438
  /* // This needs a review
444
439
  case plupload.IMAGE_DIMENSIONS_ERROR :
445
440
  details = o.sprintf(_('Resoultion out of boundaries! <b>%s</b> runtime supports images only up to %wx%hpx.'), up.runtime, up.features.maxWidth, up.features.maxHeight);
446
441
  break; */
447
-
442
+
448
443
  case plupload.HTTP_ERROR:
449
444
  details = _("Upload URL might be wrong or doesn't exist.");
450
445
  break;
@@ -464,8 +459,8 @@ $.widget("ui.plupload", {
464
459
  }
465
460
  });
466
461
 
467
-
468
- uploader.bind('PostInit', function(up) {
462
+
463
+ uploader.bind('PostInit', function(up) {
469
464
  // all buttons are optional, so they can be disabled and hidden
470
465
  if (!self.options.buttons.browse) {
471
466
  self.browse_button.button('disable').hide();
@@ -473,17 +468,17 @@ $.widget("ui.plupload", {
473
468
  } else {
474
469
  self.browse_button.button('enable');
475
470
  }
476
-
471
+
477
472
  if (!self.options.buttons.start) {
478
473
  self.start_button.button('disable').hide();
479
- }
480
-
474
+ }
475
+
481
476
  if (!self.options.buttons.stop) {
482
477
  self.stop_button.button('disable').hide();
483
478
  }
484
-
479
+
485
480
  if (!self.options.unique_names && self.options.rename) {
486
- self._enableRenaming();
481
+ self._enableRenaming();
487
482
  }
488
483
 
489
484
  if (self.options.dragdrop && up.features.dragdrop) {
@@ -491,7 +486,7 @@ $.widget("ui.plupload", {
491
486
  }
492
487
 
493
488
  self._enableViewSwitcher();
494
-
489
+
495
490
  self.start_button.click(function(e) {
496
491
  if (!$(this).button('option', 'disabled')) {
497
492
  self.start();
@@ -506,8 +501,8 @@ $.widget("ui.plupload", {
506
501
 
507
502
  self._trigger('ready', null, { up: up });
508
503
  });
509
-
510
-
504
+
505
+
511
506
  // check if file count doesn't exceed the limit
512
507
  if (self.options.max_file_count) {
513
508
  self.options.multiple_queues = false; // one go only
@@ -516,10 +511,10 @@ $.widget("ui.plupload", {
516
511
  var selectedCount = selectedFiles.length
517
512
  , extraCount = up.files.length + selectedCount - self.options.max_file_count
518
513
  ;
519
-
514
+
520
515
  if (extraCount > 0) {
521
516
  selectedFiles.splice(selectedCount - extraCount, extraCount);
522
-
517
+
523
518
  up.trigger('Error', {
524
519
  code : self.FILE_COUNT_ERROR,
525
520
  message : _('File count error.')
@@ -527,14 +522,24 @@ $.widget("ui.plupload", {
527
522
  }
528
523
  });
529
524
  }
530
-
531
- // uploader internal events must run first
525
+
526
+ // uploader internal events must run first
532
527
  uploader.init();
533
528
 
529
+ uploader.bind('FileFiltered', function(up, file) {
530
+ self._addFiles(file);
531
+ });
532
+
534
533
  uploader.bind('FilesAdded', function(up, files) {
535
- self._addFiles(files);
536
534
  self._trigger('selected', null, { up: up, files: files } );
537
535
 
536
+ // re-enable sortable
537
+ if (self.options.sortable && $.ui.sortable) {
538
+ self._enableSortingList();
539
+ }
540
+
541
+ self._trigger('updatelist', null, { filelist: self.filelist });
542
+
538
543
  if (self.options.autostart) {
539
544
  // set a little delay to make sure that QueueChanged triggered by the core has time to complete
540
545
  setTimeout(function() {
@@ -542,48 +547,43 @@ $.widget("ui.plupload", {
542
547
  }, 10);
543
548
  }
544
549
  });
545
-
550
+
546
551
  uploader.bind('FilesRemoved', function(up, files) {
547
552
  self._trigger('removed', null, { up: up, files: files } );
548
553
  });
549
-
550
- uploader.bind('QueueChanged', function() {
551
- self._handleState();
552
- self._updateTotalProgress();
553
- });
554
-
555
- uploader.bind('StateChanged', function() {
554
+
555
+ uploader.bind('QueueChanged StateChanged', function() {
556
556
  self._handleState();
557
557
  });
558
-
558
+
559
559
  uploader.bind('UploadFile', function(up, file) {
560
560
  self._handleFileStatus(file);
561
561
  });
562
-
562
+
563
563
  uploader.bind('FileUploaded', function(up, file) {
564
564
  self._handleFileStatus(file);
565
565
  self._trigger('uploaded', null, { up: up, file: file } );
566
566
  });
567
-
567
+
568
568
  uploader.bind('UploadProgress', function(up, file) {
569
569
  self._handleFileStatus(file);
570
570
  self._updateTotalProgress();
571
571
  self._trigger('progress', null, { up: up, file: file } );
572
572
  });
573
-
573
+
574
574
  uploader.bind('UploadComplete', function(up, files) {
575
- self._addFormFields();
575
+ self._addFormFields();
576
576
  self._trigger('complete', null, { up: up, files: files } );
577
577
  });
578
578
  },
579
579
 
580
-
580
+
581
581
  _setOption: function(key, value) {
582
582
  var self = this;
583
583
 
584
- if (key == 'buttons' && typeof(value) == 'object') {
584
+ if (key == 'buttons' && typeof(value) == 'object') {
585
585
  value = $.extend(self.options.buttons, value);
586
-
586
+
587
587
  if (!value.browse) {
588
588
  self.browse_button.button('disable').hide();
589
589
  self.uploader.disableBrowse(true);
@@ -591,24 +591,24 @@ $.widget("ui.plupload", {
591
591
  self.browse_button.button('enable').show();
592
592
  self.uploader.disableBrowse(false);
593
593
  }
594
-
594
+
595
595
  if (!value.start) {
596
596
  self.start_button.button('disable').hide();
597
597
  } else {
598
598
  self.start_button.button('enable').show();
599
599
  }
600
-
600
+
601
601
  if (!value.stop) {
602
602
  self.stop_button.button('disable').hide();
603
603
  } else {
604
- self.start_button.button('enable').show();
604
+ self.start_button.button('enable').show();
605
605
  }
606
606
  }
607
-
608
- self.uploader.settings[key] = value;
607
+
608
+ self.uploader.settings[key] = value;
609
609
  },
610
610
 
611
-
611
+
612
612
  /**
613
613
  Start upload. Triggers `start` event.
614
614
 
@@ -619,7 +619,7 @@ $.widget("ui.plupload", {
619
619
  this._trigger('start', null, { up: this.uploader });
620
620
  },
621
621
 
622
-
622
+
623
623
  /**
624
624
  Stop upload. Triggers `stop` event.
625
625
 
@@ -652,7 +652,7 @@ $.widget("ui.plupload", {
652
652
  this.uploader.disableBrowse(true);
653
653
  },
654
654
 
655
-
655
+
656
656
  /**
657
657
  Retrieve file by it's unique id.
658
658
 
@@ -662,18 +662,18 @@ $.widget("ui.plupload", {
662
662
  */
663
663
  getFile: function(id) {
664
664
  var file;
665
-
665
+
666
666
  if (typeof id === 'number') {
667
- file = this.uploader.files[id];
667
+ file = this.uploader.files[id];
668
668
  } else {
669
- file = this.uploader.getFile(id);
669
+ file = this.uploader.getFile(id);
670
670
  }
671
671
  return file;
672
672
  },
673
673
 
674
674
  /**
675
675
  Return array of files currently in the queue.
676
-
676
+
677
677
  @method getFiles
678
678
  @return {Array} Array of files in the queue represented by plupload.File objects
679
679
  */
@@ -681,7 +681,7 @@ $.widget("ui.plupload", {
681
681
  return this.uploader.files;
682
682
  },
683
683
 
684
-
684
+
685
685
  /**
686
686
  Remove the file from the queue.
687
687
 
@@ -695,7 +695,7 @@ $.widget("ui.plupload", {
695
695
  this._removeFiles(file);
696
696
  },
697
697
 
698
-
698
+
699
699
  /**
700
700
  Clear the file queue.
701
701
 
@@ -739,12 +739,12 @@ $.widget("ui.plupload", {
739
739
  */
740
740
  notify: function(type, message) {
741
741
  var popup = $(
742
- '<div class="plupload_message">' +
742
+ '<div class="plupload_message">' +
743
743
  '<span class="plupload_message_close ui-icon ui-icon-circle-close" title="'+_('Close')+'"></span>' +
744
744
  '<p><span class="ui-icon"></span>' + message + '</p>' +
745
745
  '</div>'
746
746
  );
747
-
747
+
748
748
  popup
749
749
  .addClass('ui-state-' + (type === 'error' ? 'error' : 'highlight'))
750
750
  .find('p .ui-icon')
@@ -752,14 +752,14 @@ $.widget("ui.plupload", {
752
752
  .end()
753
753
  .find('.plupload_message_close')
754
754
  .click(function() {
755
- popup.remove();
755
+ popup.remove();
756
756
  })
757
757
  .end();
758
-
758
+
759
759
  $('.plupload_header', this.container).append(popup);
760
760
  },
761
761
 
762
-
762
+
763
763
  /**
764
764
  Destroy the widget, the uploader, free associated resources and bring back original html.
765
765
 
@@ -767,29 +767,29 @@ $.widget("ui.plupload", {
767
767
  */
768
768
  destroy: function() {
769
769
  this._removeFiles([].slice.call(this.uploader.files));
770
-
770
+
771
771
  // destroy uploader instance
772
772
  this.uploader.destroy();
773
773
 
774
774
  // unbind all button events
775
775
  $('.plupload_button', this.element).unbind();
776
-
776
+
777
777
  // destroy buttons
778
778
  if ($.ui.button) {
779
779
  $('.plupload_add, .plupload_start, .plupload_stop', this.container)
780
780
  .button('destroy');
781
781
  }
782
-
782
+
783
783
  // destroy progressbar
784
784
  if ($.ui.progressbar) {
785
- this.progressbar.progressbar('destroy');
785
+ this.progressbar.progressbar('destroy');
786
786
  }
787
-
787
+
788
788
  // destroy sortable behavior
789
789
  if ($.ui.sortable && this.options.sortable) {
790
790
  $('tbody', this.filelist).sortable('destroy');
791
791
  }
792
-
792
+
793
793
  // restore the elements initial state
794
794
  this.element
795
795
  .empty()
@@ -798,19 +798,19 @@ $.widget("ui.plupload", {
798
798
 
799
799
  $.Widget.prototype.destroy.apply(this);
800
800
  },
801
-
802
-
801
+
802
+
803
803
  _handleState: function() {
804
804
  var up = this.uploader;
805
-
805
+
806
806
  if (up.state === plupload.STARTED) {
807
807
  $(this.start_button).button('disable');
808
-
808
+
809
809
  $([])
810
810
  .add(this.stop_button)
811
811
  .add('.plupload_started')
812
812
  .removeClass('plupload_hidden');
813
-
813
+
814
814
  $('.plupload_upload_status', this.element).html(o.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length));
815
815
  $('.plupload_header_content', this.element).addClass('plupload_header_content_bw');
816
816
  } else if (up.state === plupload.STOPPED) {
@@ -818,7 +818,7 @@ $.widget("ui.plupload", {
818
818
  .add(this.stop_button)
819
819
  .add('.plupload_started')
820
820
  .addClass('plupload_hidden');
821
-
821
+
822
822
  if (this.options.multiple_queues) {
823
823
  $('.plupload_header_content', this.element).removeClass('plupload_header_content_bw');
824
824
  } else {
@@ -847,22 +847,22 @@ $.widget("ui.plupload", {
847
847
 
848
848
  up.refresh();
849
849
  },
850
-
851
-
850
+
851
+
852
852
  _handleFileStatus: function(file) {
853
853
  var self = this, actionClass, iconClass;
854
-
854
+
855
855
  // since this method might be called asynchronously, file row might not yet be rendered
856
856
  if (!$('#' + file.id).length) {
857
- return;
857
+ return;
858
858
  }
859
859
 
860
860
  switch (file.status) {
861
- case plupload.DONE:
861
+ case plupload.DONE:
862
862
  actionClass = 'plupload_done';
863
863
  iconClass = 'ui-icon ui-icon-circle-check';
864
864
  break;
865
-
865
+
866
866
  case plupload.FAILED:
867
867
  actionClass = 'ui-state-error plupload_failed';
868
868
  iconClass = 'ui-icon ui-icon-alert';
@@ -876,17 +876,17 @@ $.widget("ui.plupload", {
876
876
  case plupload.UPLOADING:
877
877
  actionClass = 'ui-state-highlight plupload_uploading';
878
878
  iconClass = 'ui-icon ui-icon-circle-arrow-w';
879
-
879
+
880
880
  // scroll uploading file into the view if its bottom boundary is out of it
881
881
  var scroller = $('.plupload_scroll', this.container)
882
882
  , scrollTop = scroller.scrollTop()
883
883
  , scrollerHeight = scroller.height()
884
884
  , rowOffset = $('#' + file.id).position().top + $('#' + file.id).height()
885
885
  ;
886
-
886
+
887
887
  if (scrollerHeight < rowOffset) {
888
888
  scroller.scrollTop(scrollTop + rowOffset - scrollerHeight);
889
- }
889
+ }
890
890
 
891
891
  // Set file specific progress
892
892
  $('#' + file.id)
@@ -897,7 +897,7 @@ $.widget("ui.plupload", {
897
897
  .css('width', file.percent + '%')
898
898
  .end()
899
899
  .find('.plupload_file_size')
900
- .html(plupload.formatSize(file.size));
900
+ .html(plupload.formatSize(file.size));
901
901
  break;
902
902
  }
903
903
  actionClass += ' ui-state-default plupload_file';
@@ -914,16 +914,16 @@ $.widget("ui.plupload", {
914
914
  e.preventDefault();
915
915
  });
916
916
  },
917
-
918
-
917
+
918
+
919
919
  _updateTotalProgress: function() {
920
920
  var up = this.uploader;
921
921
 
922
922
  // Scroll to end of file list
923
923
  this.filelist[0].scrollTop = this.filelist[0].scrollHeight;
924
-
924
+
925
925
  this.progressbar.progressbar('value', up.total.percent);
926
-
926
+
927
927
  this.element
928
928
  .find('.plupload_total_status')
929
929
  .html(up.total.percent + '%')
@@ -936,14 +936,145 @@ $.widget("ui.plupload", {
936
936
  },
937
937
 
938
938
 
939
+ _displayThumbs: function() {
940
+ var self = this
941
+ , tw, th // thumb width/height
942
+ , cols
943
+ , num = 0 // number of simultaneously visible thumbs
944
+ , thumbs = [] // array of thumbs to preload at any given moment
945
+ , loading = false
946
+ ;
947
+
948
+ if (!this.options.views.thumbs) {
949
+ return;
950
+ }
951
+
952
+
953
+ function onLast(el, eventName, cb) {
954
+ var timer;
955
+
956
+ el.on(eventName, function() {
957
+ clearTimeout(timer);
958
+ timer = setTimeout(function() {
959
+ clearTimeout(timer);
960
+ cb();
961
+ }, 300);
962
+ });
963
+ }
964
+
965
+
966
+ // calculate number of simultaneously visible thumbs
967
+ function measure() {
968
+ if (!tw || !th) {
969
+ var wrapper = $('.plupload_file:eq(0)', self.filelist);
970
+ tw = wrapper.outerWidth(true);
971
+ th = wrapper.outerHeight(true);
972
+ }
973
+
974
+ var aw = self.content.width(), ah = self.content.height();
975
+ cols = Math.floor(aw / tw);
976
+ num = cols * (Math.ceil(ah / th) + 1);
977
+ }
978
+
979
+
980
+ function pickThumbsToLoad() {
981
+ // calculate index of virst visible thumb
982
+ var startIdx = Math.floor(self.content.scrollTop() / th) * cols;
983
+ // get potentially visible thumbs that are not yet visible
984
+ thumbs = $('.plupload_file', self.filelist)
985
+ .slice(startIdx, startIdx + num)
986
+ .filter(':not(.plupload_file_thumb_loaded)')
987
+ .get();
988
+ }
989
+
990
+
991
+ function init() {
992
+ function mpl() {
993
+ if (self.view_mode !== 'thumbs') {
994
+ return;
995
+ }
996
+ measure();
997
+ pickThumbsToLoad();
998
+ lazyLoad();
999
+ }
1000
+
1001
+ if ($.fn.resizable) {
1002
+ onLast(self.container, 'resize', mpl);
1003
+ }
1004
+
1005
+ onLast(self.window, 'resize', mpl);
1006
+ onLast(self.content, 'scroll', mpl);
1007
+
1008
+ self.element.on('viewchanged selected', mpl);
1009
+
1010
+ mpl();
1011
+ }
1012
+
1013
+
1014
+ function preloadThumb(file, cb) {
1015
+ var img = new o.Image();
1016
+
1017
+ img.onload = function() {
1018
+ var thumb = $('#' + file.id + ' .plupload_file_thumb', self.filelist).html('');
1019
+ this.embed(thumb[0], {
1020
+ width: 100,
1021
+ height: 60,
1022
+ crop: true,
1023
+ swf_url: o.resolveUrl(self.options.flash_swf_url),
1024
+ xap_url: o.resolveUrl(self.options.silverlight_xap_url)
1025
+ });
1026
+ };
1027
+
1028
+ img.bind("embedded error", function() {
1029
+ $('#' + file.id, self.filelist).addClass('plupload_file_thumb_loaded');
1030
+ this.destroy();
1031
+ setTimeout(cb, 1); // detach, otherwise ui might hang (in SilverLight for example)
1032
+ });
1033
+
1034
+ img.load(file.getSource());
1035
+ }
1036
+
1037
+
1038
+ function lazyLoad() {
1039
+ if (self.view_mode !== 'thumbs' || loading) {
1040
+ return;
1041
+ }
1042
+
1043
+ pickThumbsToLoad();
1044
+ if (!thumbs.length) {
1045
+ return;
1046
+ }
1047
+
1048
+ loading = true;
1049
+
1050
+ preloadThumb(self.getFile($(thumbs.shift()).attr('id')), function() {
1051
+ loading = false;
1052
+ lazyLoad();
1053
+ });
1054
+ }
1055
+
1056
+ // this has to run only once to measure structures and bind listeners
1057
+ this.element.on('selected', function onselected() {
1058
+ self.element.off('selected', onselected);
1059
+ init();
1060
+ });
1061
+ },
1062
+
1063
+
939
1064
  _addFiles: function(files) {
940
- var self = this, file_html, queue = [];
1065
+ var self = this, file_html;
941
1066
 
942
1067
  file_html = '<li class="plupload_file ui-state-default" id="%id%">' +
943
- '<div class="plupload_file_thumb"> </div>' +
944
- '<div class="plupload_file_name" title="%name%"><span class="plupload_file_namespan">%name%</span></div>' +
1068
+ '<div class="plupload_file_thumb">' +
1069
+ '<div class="plupload_file_dummy ui-widget-content"><span class="ui-state-disabled">%ext%</span></div>' +
1070
+ '</div>' +
1071
+ '<div class="plupload_file_name" title="%name%"><span class="plupload_file_namespan">%name%</span></div>' +
945
1072
  '<div class="plupload_file_action"><div class="ui-icon"> </div></div>' +
946
1073
  '<div class="plupload_file_size">%size% </div>' +
1074
+ '<div class="plupload_file_status">' +
1075
+ '<div class="plupload_file_progress ui-widget-header" style="width: 0%"> </div>' +
1076
+ '<span class="plupload_file_percent">%percent% </span>' +
1077
+ '</div>' +
947
1078
  '<div class="plupload_file_fields"> </div>' +
948
1079
  '</li>';
949
1080
 
@@ -951,66 +1082,21 @@ $.widget("ui.plupload", {
951
1082
  files = [files];
952
1083
  }
953
1084
 
954
- // destroy sortable if enabled
955
- if ($.ui.sortable && this.options.sortable) {
956
- $('tbody', self.filelist).sortable('destroy');
957
- }
958
-
959
- // loop over files to add
960
1085
  $.each(files, function(i, file) {
1086
+ var ext = o.Mime.getFileExtension(file.name) || 'none';
961
1087
 
962
1088
  self.filelist.append(file_html.replace(/%(\w+)%/g, function($0, $1) {
963
1089
  if ('size' === $1) {
964
1090
  return plupload.formatSize(file.size);
1091
+ } else if ('ext' === $1) {
1092
+ return ext;
965
1093
  } else {
966
1094
  return file[$1] || '';
967
1095
  }
968
1096
  }));
969
1097
 
970
- if (self.options.views.thumbs) {
971
- queue.push(function(cb) {
972
- var img = new o.Image();
973
-
974
- img.onload = function() {
975
- this.embed($('#' + file.id + ' .plupload_file_thumb', self.filelist)[0], {
976
- width: 100,
977
- height: 60,
978
- crop: true,
979
- swf_url: mOxie.resolveUrl(self.options.flash_swf_url),
980
- xap_url: mOxie.resolveUrl(self.options.silverlight_xap_url)
981
- });
982
- };
983
-
984
- img.onembedded = function() {
985
- $('#' + file.id + ' .plupload_file_thumb', self.filelist).addClass('plupload_file_thumb_loaded');
986
- this.destroy();
987
- setTimeout(cb, 1); // detach, otherwise ui might hang (in SilverLight for example)
988
- };
989
-
990
- img.onerror = function() {
991
- var ext = file.name.match(/\.([^\.]{1,7})$/);
992
- $('#' + file.id + ' .plupload_file_thumb', self.filelist)
993
- .html('<div class="plupload_file_dummy ui-widget-content"><span class="ui-state-disabled">' + (ext ? ext[1] : 'none') + '</span></div>');
994
- this.destroy();
995
- setTimeout(cb, 1);
996
- };
997
- img.load(file.getSource());
998
- });
999
- }
1000
-
1001
1098
  self._handleFileStatus(file);
1002
1099
  });
1003
-
1004
- if (queue.length) {
1005
- o.inSeries(queue);
1006
- }
1007
-
1008
- // re-enable sortable
1009
- if (this.options.sortable && $.ui.sortable) {
1010
- this._enableSortingList();
1011
- }
1012
-
1013
- this._trigger('updatelist', null, { filelist: this.filelist });
1014
1100
  },
1015
1101
 
1016
1102
 
@@ -1023,25 +1109,21 @@ $.widget("ui.plupload", {
1023
1109
 
1024
1110
  // destroy sortable if enabled
1025
1111
  if ($.ui.sortable && this.options.sortable) {
1026
- $('tbody', self.filelist).sortable('destroy');
1112
+ $('tbody', self.filelist).sortable('destroy');
1027
1113
  }
1028
1114
 
1029
1115
  $.each(files, function(i, file) {
1030
- if (file.imgs && file.imgs.length) {
1031
- $.each(file.imgs, function(ii, img) {
1032
- img.destroy();
1033
- });
1034
- file.imgs = [];
1035
- }
1036
- $('#' + file.id).remove();
1116
+ $('#' + file.id).toggle("highlight", function() {
1117
+ this.remove();
1118
+ });
1037
1119
  up.removeFile(file);
1038
1120
  });
1039
1121
 
1040
-
1122
+
1041
1123
  if (up.files.length) {
1042
1124
  // re-initialize sortable
1043
1125
  if (this.options.sortable && $.ui.sortable) {
1044
- this._enableSortingList();
1126
+ this._enableSortingList();
1045
1127
  }
1046
1128
  }
1047
1129
 
@@ -1071,20 +1153,20 @@ $.widget("ui.plupload", {
1071
1153
 
1072
1154
  this.counter.val(this.uploader.files.length);
1073
1155
  },
1074
-
1156
+
1075
1157
 
1076
1158
  _viewChanged: function(view) {
1077
1159
  // update or write a new cookie
1078
1160
  if (this.options.views.remember && $.cookie) {
1079
1161
  $.cookie('plupload_ui_view', view, { expires: 7, path: '/' });
1080
- }
1081
-
1162
+ }
1163
+
1082
1164
  // ugly fix for IE6 - make content area stretchable
1083
- if (mOxie.Env.browser === 'IE' && mOxie.Env.version < 7) {
1165
+ if (o.Env.browser === 'IE' && o.Env.version < 7) {
1084
1166
  this.content.attr('style', 'height:expression(document.getElementById("' + this.id + '_container' + '").clientHeight - ' + (view === 'list' ? 133 : 103) + ');');
1085
1167
  }
1086
1168
 
1087
- this.container.removeClass('plupload_view_list plupload_view_thumbs').addClass('plupload_view_' + view);
1169
+ this.container.removeClass('plupload_view_list plupload_view_thumbs').addClass('plupload_view_' + view);
1088
1170
  this.view_mode = view;
1089
1171
  this._trigger('viewchanged', null, { view: view });
1090
1172
  },
@@ -1140,9 +1222,14 @@ $.widget("ui.plupload", {
1140
1222
  switcher.show();
1141
1223
  this._viewChanged(this.options.views.active);
1142
1224
  }
1143
- },
1144
-
1145
1225
 
1226
+ // initialize thumb viewer if requested
1227
+ if (this.options.views.thumbs) {
1228
+ this._displayThumbs();
1229
+ }
1230
+ },
1231
+
1232
+
1146
1233
  _enableRenaming: function() {
1147
1234
  var self = this;
1148
1235
 
@@ -1152,7 +1239,7 @@ $.widget("ui.plupload", {
1152
1239
  if (!nameSpan.hasClass('plupload_file_namespan')) {
1153
1240
  return;
1154
1241
  }
1155
-
1242
+
1156
1243
  // Get file name and split out name and extension
1157
1244
  file = self.uploader.getFile(nameSpan.closest('.plupload_file')[0].id);
1158
1245
  name = file.name;
@@ -1182,35 +1269,39 @@ $.widget("ui.plupload", {
1182
1269
  })[0].focus();
1183
1270
  });
1184
1271
  },
1185
-
1186
-
1272
+
1273
+
1187
1274
  _enableSortingList: function() {
1188
- var self = this, filelist = $('.plupload_filelist_content', this.element);
1189
-
1190
- if ($('.plupload_file', filelist).length < 2) {
1191
- return;
1275
+ var self = this;
1276
+
1277
+ if ($('.plupload_file', this.filelist).length < 2) {
1278
+ return;
1192
1279
  }
1193
1280
 
1194
- filelist.sortable({
1281
+ // destroy sortable if enabled
1282
+ $('tbody', this.filelist).sortable('destroy');
1283
+
1284
+ // enable
1285
+ this.filelist.sortable({
1195
1286
  items: '.plupload_delete',
1196
-
1287
+
1197
1288
  cancel: 'object, .plupload_clearer',
1198
1289
 
1199
1290
  stop: function() {
1200
1291
  var files = [];
1201
-
1292
+
1202
1293
  $.each($(this).sortable('toArray'), function(i, id) {
1203
1294
  files[files.length] = self.uploader.getFile(id);
1204
- });
1205
-
1295
+ });
1296
+
1206
1297
  files.unshift(files.length);
1207
1298
  files.unshift(0);
1208
-
1209
- // re-populate files array
1210
- Array.prototype.splice.apply(self.uploader.files, files);
1299
+
1300
+ // re-populate files array
1301
+ Array.prototype.splice.apply(self.uploader.files, files);
1211
1302
  }
1212
- });
1303
+ });
1213
1304
  }
1214
1305
  });
1215
1306
 
1216
- } (window, document, plupload, jQuery));
1307
+ } (window, document, plupload, mOxie, jQuery));