Files
Phraseanet/resources/www/prod/js/jquery.Upload.js
2015-12-02 17:35:36 +01:00

255 lines
7.1 KiB
JavaScript

;
var p4 = p4 || {};
;
(function (p4, $) {
/**
* UPLOADER MANAGER
*/
var UploaderManager = function (options) {
var options = options || {};
if (false === ("container" in options)) {
throw "missing container parameter";
}
else if (!options.container.jquery) {
throw "container parameter must be a jquery dom element";
}
if (false === ("settingsBox" in options)) {
throw "missing settingBox parameter";
}
else if (!options.settingsBox.jquery) {
throw "container parameter must be a jquery dom element";
}
if (false === ("uploadBox" in options)) {
throw "missing uploadBox parameter";
}
else if (!options.uploadBox.jquery) {
throw "container parameter must be a jquery dom element";
}
if (false === ("downloadBox" in options)) {
throw "missing downloadBox parameter";
}
else if (!options.downloadBox.jquery) {
throw "container parameter must be a jquery dom element";
}
this.recordClass = options.recordClass || 'upload-record';
this.options = options;
this.options.uploadBox.wrapInner('<ul class="thumbnails" />');
this.options.uploadBox = this.options.uploadBox.find('ul:first');
this.options.downloadBox.wrapInner('<ul class="thumbnails" />');
this.options.downloadBox = this.options.downloadBox.find('ul:first');
if ($.isFunction($.fn.sortable)) {
this.options.uploadBox.sortable();
}
this.uploadIndex = 0;
this.Queue = new Queue();
this.Formater = new Formater();
this.Preview = new Preview();
};
UploaderManager.prototype = {
setOptions: function (options) {
return $.extend(this.options, options);
},
getContainer: function () {
return this.options.container;
},
getUploadBox: function () {
return this.options.uploadBox;
},
getSettingsBox: function () {
return this.options.settingsBox;
},
getDownloadBox: function () {
return this.options.downloadBox;
},
clearUploadBox: function () {
this.getUploadBox().empty();
this.uploadIndex = 0;
this.Queue.clear();
},
getDatas: function () {
return this.Queue.all();
},
getData: function (index) {
return this.Queue.get(index);
},
addData: function (data) {
this.uploadIndex++;
data.uploadIndex = this.uploadIndex;
this.Queue.set(this.uploadIndex, data);
},
removeData: function (index) {
this.Queue.remove(index);
},
addAttributeToData: function (indexOfData, attribute, value) {
var data = this.getData(indexOfData);
if ($.type(attribute) === "string") {
data[attribute] = value;
this.Queue.set(indexOfData, data);
}
},
getUploadIndex: function () {
return this.uploadIndex;
},
hasData: function () {
return !this.Queue.isEmpty();
},
countData: function () {
return this.Queue.getLength();
}
};
/**
* PREVIEW
*
* Dependency : loadImage function
* @see https://github.com/blueimp/JavaScript-Load-Image
*
* Options
* maxWidth: (int) Max width of preview
* maxHeight: (int) Max height of preview
* minWidth: (int) Min width of preview
* minHeight: (int) Min height of preview
* canva: (boolean) render preview as canva if supported by the navigator
*/
var Preview = function () {
this.options = {
fileType: /^image\/(gif|jpeg|png|jpg)$/,
maxSize: 5242880 // 5MB
};
};
Preview.prototype = {
setOptions: function (options) {
this.options = $.extend(this.options, options);
},
getOptions: function () {
return this.options;
},
render: function (file, callback) {
if (typeof loadImage === 'function' && this.options.fileType.test(file.type)) {
if ($.type(this.options.maxSize) !== 'number' || file.size < this.options.maxSize) {
var options = {
maxWidth: this.options.maxWidth || 150,
maxHeight: this.options.maxHeight || 75,
minWidth: this.options.minWidth || 80,
minHeight: this.options.minHeight || 40,
canvas: this.options.canva || true
};
loadImage(file, callback, options);
}
}
}
};
/**
* FORMATER
*/
var Formater = function () {
};
Formater.prototype = {
size: function (bytes) {
if (typeof bytes !== 'number') {
throw bytes + ' is not a number';
}
if (bytes >= 1073741824) {
return (bytes / 1073741824).toFixed(2) + ' GB';
}
if (bytes >= 1048576) {
return (bytes / 1048576).toFixed(2) + ' MB';
}
return (bytes / 1024).toFixed(2) + ' KB';
},
bitrate: function (bits) {
if (typeof bits !== 'number') {
throw bits + ' is not a number';
}
// 1 byte = 8 bits
var bytes = (bits >> 3);
if (bytes >= (1 << 30)) {
return (bytes / (1 << 30)).toFixed(2) + ' Go/s';
}
if (bytes >= (1 << 20)) {
return (bytes / (1 << 20)).toFixed(2) + ' Mo/s';
}
if (bytes >= (1 << 10)) {
return (bytes / (1 << 10)).toFixed(2) + ' Ko/s';
}
return bytes + ' o/s';
},
pourcent: function (current, total) {
return (current / total * 100).toFixed(2);
}
};
/**
* QUEUE
*/
var Queue = function () {
this.list = {};
};
Queue.prototype = {
all: function () {
return this.list;
},
set: function (id, item) {
this.list[id] = item;
return this;
},
get: function (id) {
if (!this.list[id]) {
throw 'Unknown ID' + id;
}
return this.list[id];
},
remove: function (id) {
delete this.list[id];
},
getLength: function () {
var count = 0;
for (var k in this.list) {
if (this.list.hasOwnProperty(k)) {
++count;
}
}
return count;
},
isEmpty: function () {
return this.getLength() === 0;
},
clear: function () {
var $this = this;
$.each(this.list, function (k) {
$this.remove(k);
});
}
};
p4.UploaderManager = UploaderManager;
})(p4, jQuery);