You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

188 lines
5.4 KiB

var Upload = {
xhr : null,
attached : [],
failed : [],
get : null,
name : null,
file : null,
init : function() {
if (Upload.file) {
Upload_ajaxSend({
name: Upload.name,
size: Upload.file.size,
type: Upload.file.type
});
}
},
attach : function(func) {
if (typeof(func) === "function") {
this.attached.push(func);
}
},
fail : function(func) {
if (typeof(func) === "function") {
this.failed.push(func);
}
},
launchAttached : function() {
for(var i = 0; i < Upload.attached.length; i++) {
Upload.attached[i]({
name: Upload.name,
size: Upload.file.size,
type: Upload.file.type,
uri: Upload.get
});
}
},
launchFailed : function(evt) {
for(var i = 0; i < Upload.failed.length; i++) {
Upload.failed[i](evt);
}
},
preview : function() {
var file = document.getElementById('file').files[0];
Upload.name = file.name;
Upload.check(file);
},
check : function(file) {
if (!file.type.match(/image.*/)) {
console.log("Not a picture !");
Upload.prepare(file);
} else {
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function (ev) {
MovimUtils.getOrientation(file, function(orientation) {
Upload.compress(ev.target.result, file, orientation);
});
};
};
},
compress : function(src, file, orientation) {
var image = new Image();
image.onload = function()
{
var limit = 1440;
var width = image.naturalWidth;
var height = image.naturalHeight;
var ratio = Math.min(limit / width, limit / height);
if (ratio < 1 || file.size > SMALL_PICTURE_LIMIT) {
if (ratio < 1) {
width = Math.round(width*ratio);
height = Math.round(height*ratio);
}
var canvas = document.createElement('canvas');
if ([5,6,7,8].indexOf(orientation) > -1) {
canvas.width = height;
canvas.height = width;
} else {
canvas.width = width;
canvas.height = height;
}
ctx = canvas.getContext("2d");
switch (orientation) {
case 2: ctx.transform(-1, 0, 0, 1, width, 0); break;
case 3: ctx.transform(-1, 0, 0, -1, width, height ); break;
case 4: ctx.transform(1, 0, 0, -1, 0, height ); break;
case 5: ctx.transform(0, 1, 1, 0, 0, 0); break;
case 6: ctx.transform(0, 1, -1, 0, height , 0); break;
case 7: ctx.transform(0, -1, -1, 0, height , width); break;
case 8: ctx.transform(0, -1, 1, 0, 0, width); break;
default: ctx.transform(1, 0, 0, 1, 0, 0);
}
ctx.drawImage(image, 0, 0, width, height);
if (typeof canvas.toBlob == 'function') {
if (file.type != 'image/jpeg') {
Upload.name += '.jpg';
}
canvas.toBlob(
function (blob) {
Upload.prepare(blob);
},
'image/jpeg',
0.85
);
} else {
Upload.prepare(file);
}
} else {
Upload.prepare(file);
}
}
image.src = src;
},
prepare : function(file) {
Upload.file = file;
var preview = document.querySelector('#upload img.preview_picture');
// If the preview system is there
if (preview) {
if (Upload.file.type.match(/image.*/)) {
preview.src = URL.createObjectURL(Upload.file);
} else {
preview.src = '';
}
}
},
request : function(get, put) {
Upload.get = get;
Upload.xhr = new XMLHttpRequest();
Upload.xhr.upload.addEventListener('progress', function(evt) {
var percent = Math.floor(evt.loaded/evt.total*100);
var progress = document.querySelector('#dialog ul li p');
if (progress) progress.innerHTML = percent + '%';
}, false);
Upload.xhr.onreadystatechange = function() {
if (Upload.xhr.readyState == 4
&& (Upload.xhr.status >= 200 && Upload.xhr.status < 400)) {
Dialog.clear();
Upload.launchAttached();
}
if (Upload.xhr.readyState == 4
&& (Upload.xhr.status >= 400 || Upload.xhr.status == 0)
&& Upload.file != null) {
Upload.launchFailed();
Upload_ajaxFailed();
}
}
Upload.xhr.open("PUT", put, true);
Upload.xhr.setRequestHeader('Content-Type', 'text/plain');
if (Upload.file != null) {
Upload.xhr.send(Upload.file);
}
},
abort : function() {
if (Upload.xhr) Upload.xhr.abort();
}
}