1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-06 06:38:00 +02:00

plupload upgraded to v2.3.6

This commit is contained in:
Cameron
2018-11-23 13:24:14 -08:00
parent 0adf60f9e7
commit 96647b445e
19 changed files with 3241 additions and 2576 deletions

View File

@@ -37,7 +37,7 @@ if($_GET['action'] == 'youtube' )
} }
// TODO use library manager // TODO use library manager
e107::js('core', 'plupload/plupload.full.js', 'jquery', 2); e107::js('core', 'plupload/plupload.full.min.js', 'jquery', 2);
e107::css('core', 'plupload/jquery.plupload.queue/css/jquery.plupload.queue.css', 'jquery'); e107::css('core', 'plupload/jquery.plupload.queue/css/jquery.plupload.queue.css', 'jquery');
e107::js('core', 'plupload/jquery.plupload.queue/jquery.plupload.queue.min.js', 'jquery', 2); e107::js('core', 'plupload/jquery.plupload.queue/jquery.plupload.queue.min.js', 'jquery', 2);
e107::js('core', 'core/mediaManager.js',"jquery",5); e107::js('core', 'core/mediaManager.js',"jquery",5);

View File

@@ -911,6 +911,16 @@ console.log('Bbcode: '+bbcode);
} }
}, },
init: { init: {
BeforeUpload: function(e,file)
{
},
BeforeChunkUpload: function(uploader, file, post, currentBlob, currentOffset)
{
//console.log(file);
// currentBlob.name=file.name;
},
FilesAdded: function (up, files) FilesAdded: function (up, files)
{ {

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 111 B

View File

@@ -73,7 +73,7 @@ used as it is.
@param {Boolean} [settings.rename=false] Enable ability to rename files in the queue. @param {Boolean} [settings.rename=false] Enable ability to rename files in the queue.
@param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure. @param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure.
*/ */
;(function($, o) { ;(function($, plupload) {
var uploaders = {}; var uploaders = {};
function _(str) { function _(str) {
@@ -198,7 +198,7 @@ used as it is.
$('span.plupload_total_status', target).html(uploader.total.percent + '%'); $('span.plupload_total_status', target).html(uploader.total.percent + '%');
$('div.plupload_progress_bar', target).css('width', uploader.total.percent + '%'); $('div.plupload_progress_bar', target).css('width', uploader.total.percent + '%');
$('span.plupload_upload_status', target).html( $('span.plupload_upload_status', target).html(
o.sprintf(_('Uploaded %d/%d files'), uploader.total.uploaded, uploader.files.length) plupload.sprintf(_('Uploaded %d/%d files'), uploader.total.uploaded, uploader.files.length)
); );
} }
@@ -247,7 +247,7 @@ used as it is.
if (uploader.total.queued === 0) { if (uploader.total.queued === 0) {
$('span.plupload_add_text', target).html(_('Add Files')); $('span.plupload_add_text', target).html(_('Add Files'));
} else { } else {
$('span.plupload_add_text', target).html(o.sprintf(_('%d files queued'), uploader.total.queued)); $('span.plupload_add_text', target).html(plupload.sprintf(_('%d files queued'), uploader.total.queued));
} }
$('a.plupload_start', target).toggleClass('plupload_disabled', uploader.files.length == (uploader.total.uploaded + uploader.total.failed)); $('a.plupload_start', target).toggleClass('plupload_disabled', uploader.files.length == (uploader.total.uploaded + uploader.total.failed));
@@ -279,6 +279,11 @@ used as it is.
if (!settings.unique_names && settings.rename) { if (!settings.unique_names && settings.rename) {
target.on('click', '#' + id + '_filelist div.plupload_file_name span', function(e) { target.on('click', '#' + id + '_filelist div.plupload_file_name span', function(e) {
var targetSpan = $(e.target), file, parts, name, ext = ""; var targetSpan = $(e.target), file, parts, name, ext = "";
var fileContainer = targetSpan.closest('li');
if (!fileContainer.hasClass('plupload_delete')) {
return;
}
// Get file name and split out name and extension // Get file name and split out name and extension
file = up.getFile(targetSpan.parents('li')[0].id); file = up.getFile(targetSpan.parents('li')[0].id);
@@ -425,4 +430,4 @@ used as it is.
return uploaders[$(this[0]).attr('id')]; return uploaders[$(this[0]).attr('id')];
} }
}; };
})(jQuery, mOxie); })(jQuery, plupload);

File diff suppressed because one or more lines are too long

View File

@@ -330,6 +330,10 @@
display: block; display: block;
} }
.plupload_files_queued .plupload_droptext {
display: none;
}
.plupload_buttons, .plupload_upload_status {float: left} .plupload_buttons, .plupload_upload_status {float: left}
.plupload_message { .plupload_message {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -408,10 +408,14 @@ $.widget("ui.plupload", {
} }
this.filelist.on('click', function(e) { this.filelist.on('click', function(e) {
if ($(e.target).hasClass('plupload_action_icon')) { var me = $(e.target), fileContainer;
self.removeFile($(e.target).closest('.plupload_file').attr('id')); if (me.hasClass('plupload_action_icon')) {
fileContainer = me.closest('.plupload_file');
if (fileContainer.hasClass('plupload_delete')) {
self.removeFile(fileContainer.attr('id'));
e.preventDefault(); e.preventDefault();
} }
}
}); });
uploader = this.uploader = uploaders[id] = new plupload.Uploader($.extend(this.options, options)); uploader = this.uploader = uploaders[id] = new plupload.Uploader($.extend(this.options, options));
@@ -454,19 +458,19 @@ $.widget("ui.plupload", {
switch (err.code) { switch (err.code) {
case plupload.FILE_EXTENSION_ERROR: case plupload.FILE_EXTENSION_ERROR:
details = o.sprintf(_("File: %s"), err.file.name); details = plupload.sprintf(_("File: %s"), err.file.name);
break; break;
case plupload.FILE_SIZE_ERROR: case plupload.FILE_SIZE_ERROR:
details = o.sprintf(_("File: %s, size: %d, max file size: %d"), err.file.name, plupload.formatSize(err.file.size), plupload.formatSize(plupload.parseSize(up.getOption('filters').max_file_size))); details = plupload.sprintf(_("File: %s, size: %d, max file size: %d"), err.file.name, plupload.formatSize(err.file.size), plupload.formatSize(plupload.parseSize(up.getOption('filters').max_file_size)));
break; break;
case plupload.FILE_DUPLICATE_ERROR: case plupload.FILE_DUPLICATE_ERROR:
details = o.sprintf(_("%s already present in the queue."), err.file.name); details = plupload.sprintf(_("%s already present in the queue."), err.file.name);
break; break;
case self.FILE_COUNT_ERROR: case self.FILE_COUNT_ERROR:
details = o.sprintf(_("Upload element accepts only %d file(s) at a time. Extra files were stripped."), up.getOption('filters').max_file_count || 0); details = plupload.sprintf(_("Upload element accepts only %d file(s) at a time. Extra files were stripped."), up.getOption('filters').max_file_count || 0);
break; break;
case plupload.IMAGE_FORMAT_ERROR : case plupload.IMAGE_FORMAT_ERROR :
@@ -479,7 +483,7 @@ $.widget("ui.plupload", {
/* // This needs a review /* // This needs a review
case plupload.IMAGE_DIMENSIONS_ERROR : case plupload.IMAGE_DIMENSIONS_ERROR :
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); details = plupload.sprintf(_('Resoultion out of boundaries! <b>%s</b> runtime supports images only up to %wx%hpx.'), up.runtime, up.features.maxWidth, up.features.maxHeight);
break; */ break; */
case plupload.HTTP_ERROR: case plupload.HTTP_ERROR:
@@ -864,7 +868,7 @@ $.widget("ui.plupload", {
up.disableBrowse(); up.disableBrowse();
} }
$('.plupload_upload_status', this.element).html(o.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length)); $('.plupload_upload_status', this.element).html(plupload.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length));
$('.plupload_header_content', this.element).addClass('plupload_header_content_bw'); $('.plupload_header_content', this.element).addClass('plupload_header_content_bw');
} }
else if (plupload.STOPPED === up.state) { else if (plupload.STOPPED === up.state) {
@@ -895,9 +899,12 @@ $.widget("ui.plupload", {
if (up.total.queued === 0) { if (up.total.queued === 0) {
$('.ui-button-text', this.browse_button).html(_('Add Files')); $('.ui-button-text', this.browse_button).html(_('Add Files'));
} else { } else {
$('.ui-button-text', this.browse_button).html(o.sprintf(_('%d files queued'), up.total.queued)); $('.ui-button-text', this.browse_button).html(plupload.sprintf(_('%d files queued'), up.total.queued));
} }
// have a helper class on a container expressing whether it has files queued or not
this.container.toggleClass('plupload_files_queued', up.files.length);
up.refresh(); up.refresh();
}, },
@@ -978,7 +985,7 @@ $.widget("ui.plupload", {
.html(plupload.formatSize(up.total.size)) .html(plupload.formatSize(up.total.size))
.end() .end()
.find('.plupload_upload_status') .find('.plupload_upload_status')
.html(o.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length)); .html(plupload.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length));
}, },
@@ -1058,7 +1065,8 @@ $.widget("ui.plupload", {
function preloadThumb(file, cb) { function preloadThumb(file, cb) {
var img = new o.Image(); var img = new o.image.Image();
var resolveUrl = o.core.utils.Url.resolveUrl;
img.onload = function() { img.onload = function() {
var thumb = $('#' + file.id + ' .plupload_file_thumb', self.filelist); var thumb = $('#' + file.id + ' .plupload_file_thumb', self.filelist);
@@ -1066,9 +1074,10 @@ $.widget("ui.plupload", {
width: self.options.thumb_width, width: self.options.thumb_width,
height: self.options.thumb_height, height: self.options.thumb_height,
crop: true, crop: true,
fit: true,
preserveHeaders: false, preserveHeaders: false,
swf_url: o.resolveUrl(self.options.flash_swf_url), swf_url: resolveUrl(self.options.flash_swf_url),
xap_url: o.resolveUrl(self.options.silverlight_xap_url) xap_url: resolveUrl(self.options.silverlight_xap_url)
}); });
}; };
@@ -1143,7 +1152,7 @@ $.widget("ui.plupload", {
} }
$.each(files, function(i, file) { $.each(files, function(i, file) {
var ext = o.Mime.getFileExtension(file.name) || 'none'; var ext = o.core.utils.Mime.getFileExtension(file.name) || 'none';
html += file_html.replace(/\{(\w+)\}/g, function($0, $1) { html += file_html.replace(/\{(\w+)\}/g, function($0, $1) {
switch ($1) { switch ($1) {
@@ -1198,7 +1207,7 @@ $.widget("ui.plupload", {
} }
// ugly fix for IE6 - make content area stretchable // ugly fix for IE6 - make content area stretchable
if (o.Env.browser === 'IE' && o.Env.version < 7) { if (plupload.ua.browser === 'IE' && plupload.ua.version < 7) {
this.content.attr('style', 'height:expression(document.getElementById("' + this.id + '_container' + '").clientHeight - ' + (view === 'list' ? 132 : 102) + ')'); this.content.attr('style', 'height:expression(document.getElementById("' + this.id + '_container' + '").clientHeight - ' + (view === 'list' ? 132 : 102) + ')');
} }
@@ -1270,14 +1279,20 @@ $.widget("ui.plupload", {
var self = this; var self = this;
this.filelist.dblclick(function(e) { this.filelist.dblclick(function(e) {
var nameSpan = $(e.target), nameInput, file, parts, name, ext = ""; var nameInput, fileContainer, file, parts, name, ext = "";
var nameSpan = $(e.target);
if (!nameSpan.hasClass('plupload_file_name_wrapper')) { if (!nameSpan.hasClass('plupload_file_name_wrapper')) {
return; return;
} }
fileContainer = nameSpan.closest('.plupload_file');
if (!fileContainer.hasClass('plupload_delete')) {
return;
}
// Get file name and split out name and extension // Get file name and split out name and extension
file = self.uploader.getFile(nameSpan.closest('.plupload_file')[0].id); file = self.uploader.getFile(fileContainer[0].id);
name = file.name; name = file.name;
parts = /^(.+)(\.[^.]+)$/.exec(name); parts = /^(.+)(\.[^.]+)$/.exec(name);
if (parts) { if (parts) {
@@ -1340,4 +1355,4 @@ $.widget("ui.plupload", {
} }
}); });
} (window, document, plupload, mOxie, jQuery)); } (window, document, plupload, moxie, jQuery));

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
/** /**
* Plupload - multi-runtime File Uploader * Plupload - multi-runtime File Uploader
* v2.1.9 * v2.3.6
* *
* Copyright 2013, Moxiecode Systems AB * Copyright 2013, Moxiecode Systems AB
* Released under GPL License. * Released under GPL License.
@@ -8,8 +8,23 @@
* License: http://www.plupload.com/license * License: http://www.plupload.com/license
* Contributing: http://www.plupload.com/contributing * Contributing: http://www.plupload.com/contributing
* *
* Date: 2016-05-15 * Date: 2017-11-03
*/ */
;(function (global, factory) {
var extract = function() {
var ctx = {};
factory.apply(ctx, arguments);
return ctx.plupload;
};
if (typeof define === "function" && define.amd) {
define("plupload", ['./moxie'], extract);
} else if (typeof module === "object" && module.exports) {
module.exports = extract(require('./moxie'));
} else {
global.plupload = extract(global.moxie);
}
}(this || window, function(moxie) {
/** /**
* Plupload.js * Plupload.js
* *
@@ -20,13 +35,12 @@
* Contributing: http://www.plupload.com/contributing * Contributing: http://www.plupload.com/contributing
*/ */
/*global mOxie:true */ ;(function(exports, o, undef) {
;(function(window, o, undef) { var delay = window.setTimeout;
var fileFilters = {};
var delay = window.setTimeout var u = o.core.utils;
, fileFilters = {} var Runtime = o.runtime.Runtime;
;
// convert plupload features to caps acceptable by mOxie // convert plupload features to caps acceptable by mOxie
function normalizeCaps(settings) { function normalizeCaps(settings) {
@@ -65,14 +79,18 @@ function normalizeCaps(settings) {
}); });
} else if (features === true) { } else if (features === true) {
// check settings for required features // check settings for required features
if (settings.chunk_size > 0) { if (settings.chunk_size && settings.chunk_size > 0) {
caps.slice_blob = true; caps.slice_blob = true;
} }
if (settings.resize.enabled || !settings.multipart) { if (!plupload.isEmptyObj(settings.resize) || settings.multipart === false) {
caps.send_binary_string = true; caps.send_binary_string = true;
} }
if (settings.http_method) {
caps.use_http_method = settings.http_method;
}
plupload.each(settings, function(value, feature) { plupload.each(settings, function(value, feature) {
resolve(feature, !!value, true); // strict check resolve(feature, !!value, true); // strict check
}); });
@@ -94,7 +112,7 @@ var plupload = {
* @static * @static
* @final * @final
*/ */
VERSION : '2.1.9', VERSION : '2.3.6',
/** /**
* The state of the queue before it has started and after it has finished * The state of the queue before it has started and after it has finished
@@ -196,7 +214,8 @@ var plupload = {
INIT_ERROR : -500, INIT_ERROR : -500,
/** /**
* File size error. If the user selects a file that is too large it will be blocked and an error of this type will be triggered. * File size error. If the user selects a file that is too large or is empty it will be blocked and
* an error of this type will be triggered.
* *
* @property FILE_SIZE_ERROR * @property FILE_SIZE_ERROR
* @static * @static
@@ -250,6 +269,15 @@ var plupload = {
*/ */
IMAGE_DIMENSIONS_ERROR : -702, IMAGE_DIMENSIONS_ERROR : -702,
/**
* Expose whole moxie (#1469).
*
* @property moxie
* @type Object
* @final
*/
moxie: o,
/** /**
* Mime type lookup table. * Mime type lookup table.
* *
@@ -257,12 +285,12 @@ var plupload = {
* @type Object * @type Object
* @final * @final
*/ */
mimeTypes : o.mimes, mimeTypes : u.Mime.mimes,
/** /**
* In some cases sniffing is the only way around :( * In some cases sniffing is the only way around :(
*/ */
ua: o.ua, ua: u.Env,
/** /**
* Gets the true type of the built-in object (better version of typeof). * Gets the true type of the built-in object (better version of typeof).
@@ -273,7 +301,7 @@ var plupload = {
* @param {Object} o Object to check. * @param {Object} o Object to check.
* @return {String} Object [[Class]] * @return {String} Object [[Class]]
*/ */
typeOf: o.typeOf, typeOf: u.Basic.typeOf,
/** /**
* Extends the specified object with another object. * Extends the specified object with another object.
@@ -284,7 +312,7 @@ var plupload = {
* @param {Object..} obj Multiple objects to extend with. * @param {Object..} obj Multiple objects to extend with.
* @return {Object} Same as target, the extended object. * @return {Object} Same as target, the extended object.
*/ */
extend : o.extend, extend : u.Basic.extend,
/** /**
* Generates an unique ID. This is 99.99% unique since it takes the current time and 5 random numbers. * Generates an unique ID. This is 99.99% unique since it takes the current time and 5 random numbers.
@@ -297,7 +325,7 @@ var plupload = {
* @static * @static
* @return {String} Virtually unique id. * @return {String} Virtually unique id.
*/ */
guid : o.guid, guid : u.Basic.guid,
/** /**
* Get array of DOM Elements by their ids. * Get array of DOM Elements by their ids.
@@ -331,7 +359,7 @@ var plupload = {
@param {String} id Identifier of the DOM Element @param {String} id Identifier of the DOM Element
@return {Node} @return {Node}
*/ */
get: o.get, get: u.Dom.get,
/** /**
* Executes the callback function for each item in array/object. If you return false in the * Executes the callback function for each item in array/object. If you return false in the
@@ -342,7 +370,7 @@ var plupload = {
* @param {Object} obj Object to iterate. * @param {Object} obj Object to iterate.
* @param {function} callback Callback function to execute for each item. * @param {function} callback Callback function to execute for each item.
*/ */
each : o.each, each : u.Basic.each,
/** /**
* Returns the absolute x, y position of an Element. The position will be returned in a object with x, y fields. * Returns the absolute x, y position of an Element. The position will be returned in a object with x, y fields.
@@ -353,7 +381,7 @@ var plupload = {
* @param {Element} root Optional root element to stop calculations at. * @param {Element} root Optional root element to stop calculations at.
* @return {object} Absolute position of the specified element object with x, y fields. * @return {object} Absolute position of the specified element object with x, y fields.
*/ */
getPos : o.getPos, getPos : u.Dom.getPos,
/** /**
* Returns the size of the specified node in pixels. * Returns the size of the specified node in pixels.
@@ -363,7 +391,7 @@ var plupload = {
* @param {Node} node Node to get the size of. * @param {Node} node Node to get the size of.
* @return {Object} Object with a w and h property. * @return {Object} Object with a w and h property.
*/ */
getSize : o.getSize, getSize : u.Dom.getSize,
/** /**
* Encodes the specified string. * Encodes the specified string.
@@ -389,7 +417,7 @@ var plupload = {
* @param {Object} obj Object with length field. * @param {Object} obj Object with length field.
* @return {Array} Array object containing all items. * @return {Array} Array object containing all items.
*/ */
toArray : o.toArray, toArray : u.Basic.toArray,
/** /**
* Find an element in array and return its index if present, otherwise return -1. * Find an element in array and return its index if present, otherwise return -1.
@@ -400,7 +428,21 @@ var plupload = {
* @param {Array} array * @param {Array} array
* @return {Int} Index of the element, or -1 if not found * @return {Int} Index of the element, or -1 if not found
*/ */
inArray : o.inArray, inArray : u.Basic.inArray,
/**
Recieve an array of functions (usually async) to call in sequence, each function
receives a callback as first argument that it should call, when it completes. Finally,
after everything is complete, main callback is called. Passing truthy value to the
callback as a first argument will interrupt the sequence and invoke main callback
immediately.
@method inSeries
@static
@param {Array} queue Array of functions to call in sequence
@param {Function} cb Main callback that is called in the end, or in case of error
*/
inSeries: u.Basic.inSeries,
/** /**
* Extends the language pack object with new items. * Extends the language pack object with new items.
@@ -410,7 +452,7 @@ var plupload = {
* @param {Object} pack Language pack items to add. * @param {Object} pack Language pack items to add.
* @return {Object} Extended language pack object. * @return {Object} Extended language pack object.
*/ */
addI18n : o.addI18n, addI18n : o.core.I18n.addI18n,
/** /**
* Translates the specified string by checking for the english string in the language pack lookup. * Translates the specified string by checking for the english string in the language pack lookup.
@@ -420,7 +462,15 @@ var plupload = {
* @param {String} str String to look for. * @param {String} str String to look for.
* @return {String} Translated string or the input string if it wasn't found. * @return {String} Translated string or the input string if it wasn't found.
*/ */
translate : o.translate, translate : o.core.I18n.translate,
/**
* Pseudo sprintf implementation - simple way to replace tokens with specified values.
*
* @param {String} str String with tokens
* @return {String} String with replaced tokens
*/
sprintf : u.Basic.sprintf,
/** /**
* Checks if object is empty. * Checks if object is empty.
@@ -430,7 +480,7 @@ var plupload = {
* @param {Object} obj Object to check. * @param {Object} obj Object to check.
* @return {Boolean} * @return {Boolean}
*/ */
isEmptyObj : o.isEmptyObj, isEmptyObj : u.Basic.isEmptyObj,
/** /**
* Checks if specified DOM element has specified class. * Checks if specified DOM element has specified class.
@@ -440,7 +490,7 @@ var plupload = {
* @param {Object} obj DOM element like object to add handler to. * @param {Object} obj DOM element like object to add handler to.
* @param {String} name Class name * @param {String} name Class name
*/ */
hasClass : o.hasClass, hasClass : u.Dom.hasClass,
/** /**
* Adds specified className to specified DOM element. * Adds specified className to specified DOM element.
@@ -450,7 +500,7 @@ var plupload = {
* @param {Object} obj DOM element like object to add handler to. * @param {Object} obj DOM element like object to add handler to.
* @param {String} name Class name * @param {String} name Class name
*/ */
addClass : o.addClass, addClass : u.Dom.addClass,
/** /**
* Removes specified className from specified DOM element. * Removes specified className from specified DOM element.
@@ -460,7 +510,7 @@ var plupload = {
* @param {Object} obj DOM element like object to add handler to. * @param {Object} obj DOM element like object to add handler to.
* @param {String} name Class name * @param {String} name Class name
*/ */
removeClass : o.removeClass, removeClass : u.Dom.removeClass,
/** /**
* Returns a given computed style of a DOM element. * Returns a given computed style of a DOM element.
@@ -470,7 +520,7 @@ var plupload = {
* @param {Object} obj DOM element like object. * @param {Object} obj DOM element like object.
* @param {String} name Style you want to get from the DOM element * @param {String} name Style you want to get from the DOM element
*/ */
getStyle : o.getStyle, getStyle : u.Dom.getStyle,
/** /**
* Adds an event handler to the specified object and store reference to the handler * Adds an event handler to the specified object and store reference to the handler
@@ -483,7 +533,7 @@ var plupload = {
* @param {Function} callback Function to call when event occurs. * @param {Function} callback Function to call when event occurs.
* @param {String} (optional) key that might be used to add specifity to the event record. * @param {String} (optional) key that might be used to add specifity to the event record.
*/ */
addEvent : o.addEvent, addEvent : u.Events.addEvent,
/** /**
* Remove event handler from the specified object. If third argument (callback) * Remove event handler from the specified object. If third argument (callback)
@@ -495,7 +545,7 @@ var plupload = {
* @param {String} name Name of event listener to remove. * @param {String} name Name of event listener to remove.
* @param {Function|String} (optional) might be a callback or unique key to match. * @param {Function|String} (optional) might be a callback or unique key to match.
*/ */
removeEvent: o.removeEvent, removeEvent: u.Events.removeEvent,
/** /**
* Remove all kind of events from the specified object * Remove all kind of events from the specified object
@@ -505,7 +555,7 @@ var plupload = {
* @param {Object} obj DOM element to remove event listeners from. * @param {Object} obj DOM element to remove event listeners from.
* @param {String} (optional) unique key to match, when removing events. * @param {String} (optional) unique key to match, when removing events.
*/ */
removeAllEvents: o.removeAllEvents, removeAllEvents: u.Events.removeAllEvents,
/** /**
* Cleans the specified name from national characters (diacritics). The result will be a name with only a-z, 0-9 and _. * Cleans the specified name from national characters (diacritics). The result will be a name with only a-z, 0-9 and _.
@@ -551,7 +601,7 @@ var plupload = {
* @param {Object} items Name/value object to serialize as a querystring. * @param {Object} items Name/value object to serialize as a querystring.
* @return {String} String with url + serialized query string items. * @return {String} String with url + serialized query string items.
*/ */
buildUrl : function(url, items) { buildUrl: function(url, items) {
var query = ''; var query = '';
plupload.each(items, function(value, name) { plupload.each(items, function(value, name) {
@@ -617,7 +667,7 @@ var plupload = {
* @param {String|Number} size String to parse or number to just pass through. * @param {String|Number} size String to parse or number to just pass through.
* @return {Number} Size in bytes. * @return {Number} Size in bytes.
*/ */
parseSize : o.parseSizeStr, parseSize : u.Basic.parseSizeStr,
/** /**
@@ -634,7 +684,7 @@ var plupload = {
var up, runtime; var up, runtime;
up = new plupload.Uploader(config); up = new plupload.Uploader(config);
runtime = o.Runtime.thatCan(up.getOption().required_features, runtimes || config.runtimes); runtime = Runtime.thatCan(up.getOption().required_features, runtimes || config.runtimes);
up.destroy(); up.destroy();
return runtime; return runtime;
}, },
@@ -709,6 +759,19 @@ plupload.addFileFilter('prevent_duplicates', function(value, file, cb) {
cb(true); cb(true);
}); });
plupload.addFileFilter('prevent_empty', function(value, file, cb) {
if (value && !file.size && file.size !== undef) {
this.trigger('Error', {
code : plupload.FILE_SIZE_ERROR,
message : plupload.translate('File size error.'),
file : file
});
cb(false);
} else {
cb(true);
}
});
/** /**
@class Uploader @class Uploader
@@ -716,18 +779,18 @@ plupload.addFileFilter('prevent_duplicates', function(value, file, cb) {
@param {Object} settings For detailed information about each option check documentation. @param {Object} settings For detailed information about each option check documentation.
@param {String|DOMElement} settings.browse_button id of the DOM element or DOM element itself to use as file dialog trigger. @param {String|DOMElement} settings.browse_button id of the DOM element or DOM element itself to use as file dialog trigger.
@param {String} settings.url URL of the server-side upload handler.
@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. @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.
@param {Boolean} [settings.send_chunk_number=true] Whether to send chunks and chunk numbers, or total and offset bytes.
@param {String|DOMElement} [settings.container] id of the DOM element or DOM element itself that will be used to wrap uploader structures. Defaults to immediate parent of the `browse_button` element. @param {String|DOMElement} [settings.container] id of the DOM element or DOM element itself that will be used to wrap uploader structures. Defaults to immediate parent of the `browse_button` element.
@param {String|DOMElement} [settings.drop_element] id of the DOM element or DOM element itself to use as a drop zone for Drag-n-Drop. @param {String|DOMElement} [settings.drop_element] id of the DOM element or DOM element itself to use as a drop zone for Drag-n-Drop.
@param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message. @param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message.
@param {Object} [settings.filters={}] Set of file type filters. @param {Object} [settings.filters={}] Set of file type filters.
@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`
@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`. @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`.
@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`
@param {Boolean} [settings.filters.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`. @param {Boolean} [settings.filters.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
@param {Boolean} [settings.filters.prevent_empty=true] Do not let empty files into the queue (IE10 is known to hang for example when trying to upload such). Dispatches `plupload.FILE_SIZE_ERROR`.
@param {String} [settings.flash_swf_url] URL of the Flash swf. @param {String} [settings.flash_swf_url] URL of the Flash swf.
@param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs. @param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs.
@param {String} [settings.http_method="POST"] HTTP method to use during upload (only PUT or POST allowed).
@param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event. @param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event.
@param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message. @param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message.
@param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload. @param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload.
@@ -740,8 +803,11 @@ plupload.addFileFilter('prevent_duplicates', function(value, file, cb) {
@param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally. @param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally.
@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. @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.
@param {String} [settings.silverlight_xap_url] URL of the Silverlight xap. @param {String} [settings.silverlight_xap_url] URL of the Silverlight xap.
@param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files. @param {Boolean} [settings.send_chunk_number=true] Whether to send chunks and chunk numbers, or total and offset bytes.
@param {Boolean} [settings.send_file_name=true] Whether to send file name as additional argument - 'name' (required for chunked uploads and some other cases where file name cannot be sent via normal ways). @param {Boolean} [settings.send_file_name=true] Whether to send file name as additional argument - 'name' (required for chunked uploads and some other cases where file name cannot be sent via normal ways).
@param {String} settings.url URL of the server-side upload handler.
@param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files.
*/ */
plupload.Uploader = function(options) { plupload.Uploader = function(options) {
/** /**
@@ -848,6 +914,18 @@ plupload.Uploader = function(options) {
@param {plupload.File} file File that is currently being uploaded. @param {plupload.File} file File that is currently being uploaded.
*/ */
/**
* Fires just before a chunk is uploaded. This event enables you to override settings
* on the uploader instance before the chunk is uploaded.
*
* @event BeforeChunkUpload
* @param {plupload.Uploader} uploader Uploader instance sending the event.
* @param {plupload.File} file File to be uploaded.
* @param {Object} args POST params to be sent.
* @param {Blob} chunkBlob Current blob.
* @param {offset} offset Current offset.
*/
/** /**
Fires when file chunk is uploaded. Fires when file chunk is uploaded.
@@ -949,6 +1027,8 @@ plupload.Uploader = function(options) {
function calc() { function calc() {
var i, file; var i, file;
var loaded;
var loadedDuringCurrentSession = 0;
// Reset stats // Reset stats
total.reset(); total.reset();
@@ -963,7 +1043,13 @@ plupload.Uploader = function(options) {
// Since we cannot predict file size after resize, we do opposite and // Since we cannot predict file size after resize, we do opposite and
// interpolate loaded amount to match magnitude of total // interpolate loaded amount to match magnitude of total
total.loaded += file.loaded * file.origSize / file.size; loaded = file.loaded * file.origSize / file.size;
if (!file.completeTimestamp || file.completeTimestamp > startTime) {
loadedDuringCurrentSession += loaded;
}
total.loaded += loaded;
} else { } else {
total.size = undef; total.size = undef;
} }
@@ -981,7 +1067,7 @@ plupload.Uploader = function(options) {
if (total.size === undef) { if (total.size === undef) {
total.percent = files.length > 0 ? Math.ceil(total.uploaded / files.length * 100) : 0; total.percent = files.length > 0 ? Math.ceil(total.uploaded / files.length * 100) : 0;
} else { } else {
total.bytesPerSec = Math.ceil(total.loaded / ((+new Date() - startTime || 1) / 1000.0)); total.bytesPerSec = Math.ceil(loadedDuringCurrentSession / ((+new Date() - startTime || 1) / 1000.0));
total.percent = total.size > 0 ? Math.ceil(total.loaded / total.size * 100) : 0; total.percent = total.size > 0 ? Math.ceil(total.loaded / total.size * 100) : 0;
} }
} }
@@ -996,17 +1082,6 @@ plupload.Uploader = function(options) {
} }
function runtimeCan(file, cap) {
if (file.ruid) {
var info = o.Runtime.getInfo(file.ruid);
if (info) {
return info.can(cap);
}
}
return false;
}
function bindEventListeners() { function bindEventListeners() {
this.bind('FilesAdded FilesRemoved', function(up) { this.bind('FilesAdded FilesRemoved', function(up) {
up.trigger('QueueChanged'); up.trigger('QueueChanged');
@@ -1056,7 +1131,7 @@ plupload.Uploader = function(options) {
if (settings.browse_button) { if (settings.browse_button) {
plupload.each(settings.browse_button, function(el) { plupload.each(settings.browse_button, function(el) {
queue.push(function(cb) { queue.push(function(cb) {
var fileInput = new o.FileInput(plupload.extend({}, options, { var fileInput = new o.file.FileInput(plupload.extend({}, options, {
accept: settings.filters.mime_types, accept: settings.filters.mime_types,
name: settings.file_data_name, name: settings.file_data_name,
multiple: settings.multi_selection, multiple: settings.multi_selection,
@@ -1065,10 +1140,10 @@ plupload.Uploader = function(options) {
})); }));
fileInput.onready = function() { fileInput.onready = function() {
var info = o.Runtime.getInfo(this.ruid); var info = Runtime.getInfo(this.ruid);
// for backward compatibility // for backward compatibility
o.extend(self.features, { plupload.extend(self.features, {
chunks: info.can('slice_blob'), chunks: info.can('slice_blob'),
multipart: info.can('send_multipart'), multipart: info.can('send_multipart'),
multi_selection: info.can('select_multiple') multi_selection: info.can('select_multiple')
@@ -1087,17 +1162,17 @@ plupload.Uploader = function(options) {
if (!disabled) { if (!disabled) {
if (settings.browse_button_hover) { if (settings.browse_button_hover) {
if ('mouseenter' === e.type) { if ('mouseenter' === e.type) {
o.addClass(el, settings.browse_button_hover); plupload.addClass(el, settings.browse_button_hover);
} else if ('mouseleave' === e.type) { } else if ('mouseleave' === e.type) {
o.removeClass(el, settings.browse_button_hover); plupload.removeClass(el, settings.browse_button_hover);
} }
} }
if (settings.browse_button_active) { if (settings.browse_button_active) {
if ('mousedown' === e.type) { if ('mousedown' === e.type) {
o.addClass(el, settings.browse_button_active); plupload.addClass(el, settings.browse_button_active);
} else if ('mouseup' === e.type) { } else if ('mouseup' === e.type) {
o.removeClass(el, settings.browse_button_active); plupload.removeClass(el, settings.browse_button_active);
} }
} }
} }
@@ -1121,15 +1196,15 @@ plupload.Uploader = function(options) {
if (settings.drop_element) { if (settings.drop_element) {
plupload.each(settings.drop_element, function(el) { plupload.each(settings.drop_element, function(el) {
queue.push(function(cb) { queue.push(function(cb) {
var fileDrop = new o.FileDrop(plupload.extend({}, options, { var fileDrop = new o.file.FileDrop(plupload.extend({}, options, {
drop_zone: el drop_zone: el
})); }));
fileDrop.onready = function() { fileDrop.onready = function() {
var info = o.Runtime.getInfo(this.ruid); var info = Runtime.getInfo(this.ruid);
// for backward compatibility // for backward compatibility
o.extend(self.features, { plupload.extend(self.features, {
chunks: info.can('slice_blob'), chunks: info.can('slice_blob'),
multipart: info.can('send_multipart'), multipart: info.can('send_multipart'),
dragdrop: info.can('drag_and_drop') dragdrop: info.can('drag_and_drop')
@@ -1155,7 +1230,7 @@ plupload.Uploader = function(options) {
} }
o.inSeries(queue, function() { plupload.inSeries(queue, function() {
if (typeof(cb) === 'function') { if (typeof(cb) === 'function') {
cb(inited); cb(inited);
} }
@@ -1163,8 +1238,8 @@ plupload.Uploader = function(options) {
} }
function resizeImage(blob, params, cb) { function resizeImage(blob, params, runtimeOptions, cb) {
var img = new o.Image(); var img = new o.image.Image();
try { try {
img.onload = function() { img.onload = function() {
@@ -1176,22 +1251,25 @@ plupload.Uploader = function(options) {
!params.crop !params.crop
) { ) {
this.destroy(); this.destroy();
return cb(blob); cb(blob);
} } else {
// otherwise downsize // otherwise downsize
img.downsize(params.width, params.height, params.crop, params.preserve_headers); img.downsize(params.width, params.height, params.crop, params.preserve_headers);
}
}; };
img.onresize = function() { img.onresize = function() {
cb(this.getAsBlob(blob.type, params.quality)); var resizedBlob = this.getAsBlob(blob.type, params.quality);
this.destroy(); this.destroy();
cb(resizedBlob);
}; };
img.onerror = function() { img.bind('error runtimeerror', function() {
this.destroy();
cb(blob); cb(blob);
}; });
img.load(blob); img.load(blob, runtimeOptions);
} catch(ex) { } catch(ex) {
cb(blob); cb(blob);
} }
@@ -1225,6 +1303,10 @@ plupload.Uploader = function(options) {
} }
break; break;
case 'http_method':
settings[option] = value.toUpperCase() === 'PUT' ? 'PUT' : 'POST';
break;
case 'unique_names': case 'unique_names':
settings[option] = value; settings[option] = value;
if (value) { if (value) {
@@ -1248,7 +1330,11 @@ plupload.Uploader = function(options) {
// if file format filters are being updated, regenerate the matching expressions // if file format filters are being updated, regenerate the matching expressions
if (value.mime_types) { if (value.mime_types) {
settings.filters.mime_types.regexp = (function(filters) { if (plupload.typeOf(value.mime_types) === 'string') {
value.mime_types = o.core.utils.Mime.mimes2extList(value.mime_types);
}
value.mime_types.regexp = (function(filters) {
var extensionsRegExp = []; var extensionsRegExp = [];
plupload.each(filters, function(filter) { plupload.each(filters, function(filter) {
@@ -1262,17 +1348,20 @@ plupload.Uploader = function(options) {
}); });
return new RegExp('(' + extensionsRegExp.join('|') + ')$', 'i'); return new RegExp('(' + extensionsRegExp.join('|') + ')$', 'i');
}(settings.filters.mime_types)); }(value.mime_types));
settings.filters.mime_types = value.mime_types;
} }
break; break;
case 'resize': case 'resize':
if (init) { if (value) {
plupload.extend(settings.resize, value, { settings.resize = plupload.extend({
enabled: true preserve_headers: true,
}); crop: false
}, value);
} else { } else {
settings.resize = value; settings.resize = false;
} }
break; break;
@@ -1329,7 +1418,7 @@ plupload.Uploader = function(options) {
initControls.call(self, settings, function(inited) { initControls.call(self, settings, function(inited) {
if (inited) { if (inited) {
self.runtime = o.Runtime.getInfo(getRUID()).type; self.runtime = Runtime.getInfo(getRUID()).type;
self.trigger('Init', { runtime: self.runtime }); self.trigger('Init', { runtime: self.runtime });
self.trigger('PostInit'); self.trigger('PostInit');
} else { } else {
@@ -1357,13 +1446,20 @@ plupload.Uploader = function(options) {
function onUploadFile(up, file) { function onUploadFile(up, file) {
var url = up.settings.url var url = up.settings.url;
, chunkSize = up.settings.chunk_size var chunkSize = up.settings.chunk_size;
, retries = up.settings.max_retries var retries = up.settings.max_retries;
, features = up.features var features = up.features;
, offset = 0 var offset = 0;
, blob var blob;
;
var runtimeOptions = {
runtime_order: up.settings.runtimes,
required_caps: up.settings.required_features,
preferred_caps: preferred_caps,
swf_url: up.settings.flash_swf_url,
xap_url: up.settings.silverlight_xap_url
};
// make sure we start at a predictable offset // make sure we start at a predictable offset
if (file.loaded) { if (file.loaded) {
@@ -1388,7 +1484,7 @@ plupload.Uploader = function(options) {
} }
function uploadNextChunk() { function uploadNextChunk() {
var chunkBlob, formData, args = {}, curChunkSize; var chunkBlob, args = {}, curChunkSize;
// make sure that file wasn't cancelled and upload is not stopped in general // make sure that file wasn't cancelled and upload is not stopped in general
if (file.status !== plupload.UPLOADING || up.state === plupload.STOPPED) { if (file.status !== plupload.UPLOADING || up.state === plupload.STOPPED) {
@@ -1420,7 +1516,15 @@ plupload.Uploader = function(options) {
} }
} }
xhr = new o.XMLHttpRequest(); if (up.trigger('BeforeChunkUpload', file, args, chunkBlob, offset)) {
uploadChunk(args, chunkBlob, curChunkSize);
}
}
function uploadChunk(args, chunkBlob, curChunkSize) {
var formData;
xhr = new o.xhr.XMLHttpRequest();
// Do we have upload progress support // Do we have upload progress support
if (xhr.upload) { if (xhr.upload) {
@@ -1432,7 +1536,7 @@ plupload.Uploader = function(options) {
xhr.onload = function() { xhr.onload = function() {
// check if upload made itself through // check if upload made itself through
if (xhr.status >= 400) { if (xhr.status < 200 || xhr.status >= 400) {
handleError(); handleError();
return; return;
} }
@@ -1455,7 +1559,7 @@ plupload.Uploader = function(options) {
}); });
// stock Android browser doesn't fire upload progress events, but in chunking mode we can fake them // stock Android browser doesn't fire upload progress events, but in chunking mode we can fake them
if (o.Env.browser === 'Android Browser') { if (plupload.ua.browser === 'Android Browser') {
// doesn't harm in general, but is not required anywhere else // doesn't harm in general, but is not required anywhere else
up.trigger('UploadProgress', file); up.trigger('UploadProgress', file);
} }
@@ -1476,6 +1580,7 @@ plupload.Uploader = function(options) {
up.trigger('UploadProgress', file); up.trigger('UploadProgress', file);
file.status = plupload.DONE; file.status = plupload.DONE;
file.completeTimestamp = +new Date();
up.trigger('FileUploaded', file, { up.trigger('FileUploaded', file, {
response : xhr.responseText, response : xhr.responseText,
@@ -1494,19 +1599,18 @@ plupload.Uploader = function(options) {
xhr.onloadend = function() { xhr.onloadend = function() {
this.destroy(); this.destroy();
xhr = null;
}; };
// Build multipart request // Build multipart request
if (up.settings.multipart && features.multipart) { if (up.settings.multipart && features.multipart) {
xhr.open("post", url, true); xhr.open(up.settings.http_method, url, true);
// Set custom headers // Set custom headers
plupload.each(up.settings.headers, function(value, name) { plupload.each(up.settings.headers, function(value, name) {
xhr.setRequestHeader(name, value); xhr.setRequestHeader(name, value);
}); });
formData = new o.FormData(); formData = new o.xhr.FormData();
// Add multipart params // Add multipart params
plupload.each(plupload.extend(args, up.settings.multipart_params), function(value, name) { plupload.each(plupload.extend(args, up.settings.multipart_params), function(value, name) {
@@ -1515,42 +1619,34 @@ plupload.Uploader = function(options) {
// Add file and send it // Add file and send it
formData.append(up.settings.file_data_name, chunkBlob); formData.append(up.settings.file_data_name, chunkBlob);
xhr.send(formData, { xhr.send(formData, runtimeOptions);
runtime_order: up.settings.runtimes,
required_caps: up.settings.required_features,
preferred_caps: preferred_caps,
swf_url: up.settings.flash_swf_url,
xap_url: up.settings.silverlight_xap_url
});
} else { } else {
// if no multipart, send as binary stream // if no multipart, send as binary stream
url = plupload.buildUrl(up.settings.url, plupload.extend(args, up.settings.multipart_params)); url = plupload.buildUrl(up.settings.url, plupload.extend(args, up.settings.multipart_params));
xhr.open("post", url, true); xhr.open(up.settings.http_method, url, true);
xhr.setRequestHeader('Content-Type', 'application/octet-stream'); // Binary stream header
// Set custom headers // Set custom headers
plupload.each(up.settings.headers, function(value, name) { plupload.each(up.settings.headers, function(value, name) {
xhr.setRequestHeader(name, value); xhr.setRequestHeader(name, value);
}); });
xhr.send(chunkBlob, { // do not set Content-Type, if it was defined previously (see #1203)
runtime_order: up.settings.runtimes, if (!xhr.hasRequestHeader('Content-Type')) {
required_caps: up.settings.required_features, xhr.setRequestHeader('Content-Type', 'application/octet-stream'); // Binary stream header
preferred_caps: preferred_caps, }
swf_url: up.settings.flash_swf_url,
xap_url: up.settings.silverlight_xap_url xhr.send(chunkBlob, runtimeOptions);
});
} }
} }
blob = file.getSource(); blob = file.getSource();
// Start uploading chunks // Start uploading chunks
if (up.settings.resize.enabled && runtimeCan(blob, 'send_binary_string') && !!~o.inArray(blob.type, ['image/jpeg', 'image/png'])) { if (!plupload.isEmptyObj(up.settings.resize) && plupload.inArray(blob.type, ['image/jpeg', 'image/png']) !== -1) {
// Resize if required // Resize if required
resizeImage.call(this, blob, up.settings.resize, function(resizedBlob) { resizeImage(blob, up.settings.resize, runtimeOptions, function(resizedBlob) {
blob = resizedBlob; blob = resizedBlob;
file.size = resizedBlob.size; file.size = resizedBlob.size;
uploadNextChunk(); uploadNextChunk();
@@ -1607,6 +1703,7 @@ plupload.Uploader = function(options) {
// Set failed status if an error occured on a file // Set failed status if an error occured on a file
else if (err.code === plupload.HTTP_ERROR) { else if (err.code === plupload.HTTP_ERROR) {
err.file.status = plupload.FAILED; err.file.status = plupload.FAILED;
err.file.completeTimestamp = +new Date();
calcFile(err.file); calcFile(err.file);
// Upload next file but detach it from the error event // Upload next file but detach it from the error event
@@ -1653,26 +1750,24 @@ plupload.Uploader = function(options) {
// Default settings // Default settings
settings = { settings = {
runtimes: o.Runtime.order,
max_retries: 0,
chunk_size: 0, chunk_size: 0,
multipart: true,
multi_selection: true,
file_data_name: 'file', file_data_name: 'file',
flash_swf_url: 'js/Moxie.swf',
silverlight_xap_url: 'js/Moxie.xap',
filters: { filters: {
mime_types: [], mime_types: [],
max_file_size: 0,
prevent_duplicates: false, prevent_duplicates: false,
max_file_size: 0 prevent_empty: true
},
resize: {
enabled: false,
preserve_headers: true,
crop: false
}, },
flash_swf_url: 'js/Moxie.swf',
http_method: 'POST',
max_retries: 0,
multipart: true,
multi_selection: true,
resize: false,
runtimes: Runtime.order,
send_file_name: true, send_file_name: true,
send_chunk_number: true send_chunk_number: true,
silverlight_xap_url: 'js/Moxie.xap'
}; };
@@ -1770,7 +1865,7 @@ plupload.Uploader = function(options) {
if (self.getOption(el) === null) { if (self.getOption(el) === null) {
err = { err = {
code : plupload.INIT_ERROR, code : plupload.INIT_ERROR,
message : plupload.translate("'%' specified, but cannot be found.") message : plupload.sprintf(plupload.translate("%s specified, but cannot be found."), el)
} }
return false; return false;
} }
@@ -1784,7 +1879,7 @@ plupload.Uploader = function(options) {
if (!settings.browse_button && !settings.drop_element) { if (!settings.browse_button && !settings.drop_element) {
return self.trigger('Error', { return self.trigger('Error', {
code : plupload.INIT_ERROR, code : plupload.INIT_ERROR,
message : plupload.translate("You must specify either 'browse_button' or 'drop_element'.") message : plupload.translate("You must specify either browse_button or drop_element.")
}); });
} }
@@ -1800,7 +1895,7 @@ plupload.Uploader = function(options) {
} }
if (inited) { if (inited) {
self.runtime = o.Runtime.getInfo(getRUID()).type; self.runtime = Runtime.getInfo(getRUID()).type;
self.trigger('Init', { runtime: self.runtime }); self.trigger('Init', { runtime: self.runtime });
self.trigger('PostInit'); self.trigger('PostInit');
} else { } else {
@@ -1935,7 +2030,7 @@ plupload.Uploader = function(options) {
function filterFile(file, cb) { function filterFile(file, cb) {
var queue = []; var queue = [];
o.each(self.settings.filters, function(rule, name) { plupload.each(self.settings.filters, function(rule, name) {
if (fileFilters[name]) { if (fileFilters[name]) {
queue.push(function(cb) { queue.push(function(cb) {
fileFilters[name].call(self, rule, file, function(res) { fileFilters[name].call(self, rule, file, function(res) {
@@ -1944,19 +2039,19 @@ plupload.Uploader = function(options) {
}); });
} }
}); });
o.inSeries(queue, cb); plupload.inSeries(queue, cb);
} }
/** /**
* @method resolveFile * @method resolveFile
* @private * @private
* @param {o.File|o.Blob|plupload.File|File|Blob|input[type="file"]} file * @param {moxie.file.File|moxie.file.Blob|plupload.File|File|Blob|input[type="file"]} file
*/ */
function resolveFile(file) { function resolveFile(file) {
var type = o.typeOf(file); var type = plupload.typeOf(file);
// o.File // moxie.file.File
if (file instanceof o.File) { if (file instanceof o.file.File) {
if (!file.ruid && !file.isDetached()) { if (!file.ruid && !file.isDetached()) {
if (!ruid) { // weird case if (!ruid) { // weird case
return false; return false;
@@ -1966,8 +2061,8 @@ plupload.Uploader = function(options) {
} }
resolveFile(new plupload.File(file)); resolveFile(new plupload.File(file));
} }
// o.Blob // moxie.file.Blob
else if (file instanceof o.Blob) { else if (file instanceof o.file.Blob) {
resolveFile(file.getSource()); resolveFile(file.getSource());
file.destroy(); file.destroy();
} }
@@ -1993,18 +2088,18 @@ plupload.Uploader = function(options) {
}); });
} }
// native File or blob // native File or blob
else if (o.inArray(type, ['file', 'blob']) !== -1) { else if (plupload.inArray(type, ['file', 'blob']) !== -1) {
resolveFile(new o.File(null, file)); resolveFile(new o.file.File(null, file));
} }
// input[type="file"] // input[type="file"]
else if (type === 'node' && o.typeOf(file.files) === 'filelist') { else if (type === 'node' && plupload.typeOf(file.files) === 'filelist') {
// if we are dealing with input[type="file"] // if we are dealing with input[type="file"]
o.each(file.files, resolveFile); plupload.each(file.files, resolveFile);
} }
// mixed array of any supported types (see above) // mixed array of any supported types (see above)
else if (type === 'array') { else if (type === 'array') {
fileName = null; // should never happen, but unset anyway to avoid funny situations fileName = null; // should never happen, but unset anyway to avoid funny situations
o.each(file, resolveFile); plupload.each(file, resolveFile);
} }
} }
@@ -2013,7 +2108,7 @@ plupload.Uploader = function(options) {
resolveFile(file); resolveFile(file);
if (queue.length) { if (queue.length) {
o.inSeries(queue, function() { plupload.inSeries(queue, function() {
// if any files left after filtration, trigger FilesAdded // if any files left after filtration, trigger FilesAdded
if (filesAdded.length) { if (filesAdded.length) {
self.trigger("FilesAdded", filesAdded); self.trigger("FilesAdded", filesAdded);
@@ -2039,11 +2134,12 @@ plupload.Uploader = function(options) {
}, },
/** /**
* Removes part of the queue and returns the files removed. This will also trigger the FilesRemoved and QueueChanged events. * Removes part of the queue and returns the files removed. This will also trigger the
* FilesRemoved and QueueChanged events.
* *
* @method splice * @method splice
* @param {Number} start (Optional) Start index to remove from. * @param {Number} [start=0] Start index to remove from.
* @param {Number} length (Optional) Lengh of items to remove. * @param {Number} [length] Number of files to remove (defaults to number of files in the queue).
* @return {Array} Array of files that was removed. * @return {Array} Array of files that was removed.
*/ */
splice : function(start, length) { splice : function(start, length) {
@@ -2164,7 +2260,7 @@ plupload.Uploader = function(options) {
}); });
}; };
plupload.Uploader.prototype = o.EventTarget.instance; plupload.Uploader.prototype = o.core.EventTarget.instance;
/** /**
* Constructs a new file instance. * Constructs a new file instance.
@@ -2207,13 +2303,22 @@ plupload.File = (function() {
*/ */
type: file.type || '', type: file.type || '',
/**
* Relative path to the file inside a directory
*
* @property relativePath
* @type String
* @default ''
*/
relativePath: file.relativePath || '',
/** /**
* File size in bytes (may change after client-side manupilation). * File size in bytes (may change after client-side manupilation).
* *
* @property size * @property size
* @type Number * @type Number
*/ */
size: file.size || file.fileSize, size: file.fileSize || file.size,
/** /**
* Original file size in bytes. * Original file size in bytes.
@@ -2221,7 +2326,7 @@ plupload.File = (function() {
* @property origSize * @property origSize
* @type Number * @type Number
*/ */
origSize: file.size || file.fileSize, origSize: file.fileSize || file.size,
/** /**
* Number of bytes uploaded of the files total size. * Number of bytes uploaded of the files total size.
@@ -2256,6 +2361,15 @@ plupload.File = (function() {
*/ */
lastModifiedDate: file.lastModifiedDate || (new Date()).toLocaleString(), // Thu Aug 23 2012 19:40:00 GMT+0400 (GET) lastModifiedDate: file.lastModifiedDate || (new Date()).toLocaleString(), // Thu Aug 23 2012 19:40:00 GMT+0400 (GET)
/**
* Set when file becomes plupload.DONE or plupload.FAILED. Is used to calculate proper plupload.QueueProgress.bytesPerSec.
* @private
* @property completeTimestamp
* @type {Number}
*/
completeTimestamp: 0,
/** /**
* Returns native window.File object, when it's available. * Returns native window.File object, when it's available.
* *
@@ -2264,7 +2378,7 @@ plupload.File = (function() {
*/ */
getNative: function() { getNative: function() {
var file = this.getSource().getSource(); var file = this.getSource().getSource();
return o.inArray(o.typeOf(file), ['blob', 'file']) !== -1 ? file : null; return plupload.inArray(plupload.typeOf(file), ['blob', 'file']) !== -1 ? file : null;
}, },
/** /**
@@ -2376,6 +2490,8 @@ plupload.File = (function() {
}; };
}; };
window.plupload = plupload; exports.plupload = plupload;
}(window, mOxie)); }(this, moxie));
}));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long