/** This file is part of KCFinder project
*
* @desc Upload files using drag and drop
* @package KCFinder
* @version 3.12
* @author Pavel Tzonkov
* @copyright 2010-2014 KCFinder Project
* @license http://opensource.org/licenses/GPL-3.0 GPLv3
* @license http://opensource.org/licenses/LGPL-3.0 LGPLv3
* @link http://kcfinder.sunhater.com
*/
_.initDropUpload = function() {
if (!_.access.files.upload)
return;
var files = $('#files'),
folders = $('#folders').find('div.folder > a'),
i, dlg, filesSize, uploaded, errors,
precheck = function(e) {
filesSize = uploaded = 0; errors = [];
var fs = e.dataTransfer.files;
for (i = 0; i < fs.length; i++)
filesSize += fs[i].size;
dlg = $('<div><div class="info count"> </div><div class="bar count"></div><div class="info size"> </div><div class="bar size"></div><div class="info errors"> </div></div>');
dlg.find('.bar.count').progressbar({max: fs.length, value: 0});
dlg.find('.bar.size').progressbar({max: filesSize, value: 0});
dlg.find('.info').css('padding', "5px 0").first().css('paddingTop', 0);
dlg.find('.info').last().css('paddingBottom', 0);
dlg = _.dialog(_.label("Uploading files"), dlg, {
closeOnEscape: false,
buttons: []
});
dlg.parent().css('paddingBottom', 0).find('.ui-dialog-titlebar button').css('visibility', 'hidden').get(0).disabled = true;
return true;
},
localOptions = {
param: "upload[]",
maxFilesize: _.dropUploadMaxFilesize,
begin: function(xhr, currentFile, count) {
dlg.find('.info.count').html(_.label("Uploading file {current} of {count}", {
current: currentFile,
count: count
}));
dlg.find('.info.size').html(_.label("Uploaded {uploaded} of {total}", {
uploaded: _.humanSize(uploaded),
total: _.humanSize(filesSize)
}));
dlg.find('.info.errors').html(_.label("Errors:") + " " + errors.length);
dlg.find('.bar.count').progressbar({value: currentFile});
dlg.find('.bar.size').progressbar({value: uploaded});
},
success: function(xhr, currentFile, count) {
uploaded += xhr.file.size;
var response = xhr.responseText;
if (response.substr(0, 1) != "/")
errors.push($.$.htmlData(response));
},
error: function(xhr, currentFile, count) {
uploaded += xhr.file.size;
errors.push($.$.htmlData(xhr.file.name + ": " + _.label("Failed to upload {filename}!", {
filename: xhr.file.name
})));
},
abort: function(xhr, currentFile, filesCount) {
uploaded += xhr.file.size;
errors.push($.$.htmlData(xhr.file.name + ": " + _.label("Failed to upload {filename}!", {
filename: xhr.file.name
})));
},
filesizeCallback: function(xhr, currentFile, filesCount) {
uploaded += xhr.file.size;
errors.push($.$.htmlData(xhr.file.name + ": " + _.label("The uploaded file exceeds {size} bytes.", {
size: _.dropUploadMaxFilesize
})));
},
finish: function() {
_.refresh();
dlg.find('.bar.size').progressbar({value: uploaded});
dlg.find('.info.size').html(_.label("Uploaded: {uploaded} of {total}", {
uploaded: _.humanSize(uploaded),
total: _.humanSize(filesSize)
}));
dlg.find('.info.errors').html(_.label("Errors:") + " " + errors.length);
var err = errors;
setTimeout(function() {
dlg.dialog('destroy').detach();
if (err.length)
_.alert(err.join('<br />'));
}, 500);
}
},
remoteOptions = {
ajax: {
success: function(data) {
_.refresh();
if (data.error) {
_.alert(data.error)
return;
}
},
error: function() {
_.refresh();
_.alert(_.label("Unknown error."));
},
abort: function() {
_.refresh();
}
}
},
url = "&dir=" + encodeURIComponent(_.dir);
files.shDropUpload($.extend(localOptions, {
url: _.getURL('upload') + url,
precheck: function(e) {
if (!$('#folders span.current').first().parent().data('writable')) {
_.alert(_.label("Cannot write to upload folder."));
return false;
}
return precheck(e);
}
}), $.extend(true, remoteOptions, {
ajax: {
url: _.getURL('dragUrl') + url
}
}));
folders.each(function() {
var folder = this,
url = "&dir=" + encodeURIComponent($(folder).data('path'));
$(folder).shDropUpload($.extend(localOptions, {
url: _.getURL('upload') + url,
precheck: function(e) {
if (!$(folder).data('writable')) {
_.alert(_.label("Cannot write to upload folder."));
return false;
}
return precheck(e);
}
}), $.extend(true, remoteOptions, {
ajax: {
url: _.getURL('dragUrl') + url
}
}));
});
};