/*
* PekeUpload 2.0 - jQuery plugin
* written by Pedro Molina
*
* Copyright (c) Pedro Molina
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* Built for jQuery library
*
*/
(function($) {
$.fn.pekeUpload = function(options) {
// default configuration properties
var defaults = {
dragMode: false,
dragText: "Drag and Drop your files here",
bootstrap: false,
btnText: "Browse files...",
allowedExtensions: "",
invalidExtError: "Invalid File Type",
maxSize: 0,
sizeError: "Size of the file is greather than allowed",
showPreview: true,
showFilename: true,
showPercent: true,
showErrorAlerts: true,
errorOnResponse: "There has been an error uploading your file",
onSubmit: false,
url: "upload.php",
data: null,
limit: 0,
limitError: "You have reached the limit of files that you can upload",
delfiletext: "Remove from queue",
onFileError: function(file, error) {},
onFileSuccess: function(file, data) {}
};
var options = $.extend(defaults, options);
var pekeUpload = {
obj: $(this),
files: [],
uparea: null,
container: null,
uploadedfiles: 0,
hasErrors: false,
init: function() {
this.replacehtml();
this.uparea.on("click", function() {
pekeUpload.selectfiles();
});
///Handle events when drag
if (options.dragMode) {
this.handledragevents();
}
this.handlebuttonevents();
//Dismiss all warnings
$(document).on("click", ".pkwrncl", function() {
$(this).parent("div").remove();
});
//Bind event if is on Submit
if (options.onSubmit) {
this.handleFormSubmission();
}
},
replacehtml: function() {
var html = null;
switch (options.dragMode) {
case true:
switch (options.bootstrap) {
case true:
html = '
' + options.dragText + "
";
break;
case false:
html = '
' + options.dragText + "
";
break;
}
break;
case false:
switch (options.bootstrap) {
case true:
html = ' ' + options.btnText + "";
break;
case false:
html = '' + options.btnText + "";
break;
}
break;
}
this.obj.hide();
this.uparea = $(html).insertAfter(this.obj);
this.container = $('
";
break;
}
if (!c) {
this.container.append(html);
} else {
$(html).insertBefore(c);
}
},
validateFile: function(file) {
if (!this.checkExtension(file)) {
return options.invalidExtError;
}
if (!this.checkSize(file)) {
return options.sizeError;
}
return null;
},
checkExtension: function(file) {
if (options.allowedExtensions == "") {
return true;
}
var ext = file.name.split(".").pop().toLowerCase();
var allowed = options.allowedExtensions.split("|");
if ($.inArray(ext, allowed) == -1) {
return false;
} else {
return true;
}
},
checkSize: function(file) {
if (options.maxSize == 0) {
return true;
}
if (file.size > options.maxSize) {
return false;
} else {
return true;
}
},
addRow: function(file) {
var i = this.files.length - 1;
switch (options.bootstrap) {
case true:
var newRow = $('').appendTo(this.container);
if (options.showPreview) {
var prev = $('').appendTo(newRow);
this.previewFile(prev, file);
}
var finfo = $('').appendTo(newRow);
if (options.showFilename) {
finfo.append('
' + file.name + "
");
}
if (options.notAjax == false){
var progress = $('
').appendTo(finfo);
if (options.showPercent) {
progress.find("div.progress-bar").text("0%");
}
}
var dismiss = $('').appendTo(newRow);
$(''+options.delfiletext+'').appendTo(dismiss);
break;
case false:
var newRow = $('').appendTo(this.container);
if (options.showPreview) {
var prev = $('').appendTo(newRow);
this.previewFile(prev, file);
}
var finfo = $('').appendTo(newRow);
if (options.showFilename) {
finfo.append('
' + file.name + "
");
}
if (options.notAjax == false){
var progress = $('
').appendTo(finfo);
if (options.showPercent) {
progress.find("div.bar-pekeupload").text("0%");
}
}
var dismiss = $('').appendTo(newRow);
$(''+options.delfiletext+'').appendTo(dismiss);
break;
}
},
previewFile: function(container, file) {
var type = file.type.split("/")[0];
switch (type) {
case "image":
var fileUrl = window.URL.createObjectURL(file);
var prev = $('').appendTo(container);
break;
case "video":
var fileUrl = window.URL.createObjectURL(file);
var prev = $('').appendTo(container);
break;
case "audio":
var fileUrl = window.URL.createObjectURL(file);
var prev = $('').appendTo(container);
break;
default:
if (options.bootstrap) {
var prev = $('').appendTo(container);
} else {
var prev = $('').appendTo(container);
}
break;
}
},
upload: function(file, pos) {
var formData = new FormData();
formData.append(this.obj.attr("name"), file);
for (var key in options.data) {
formData.append(key, options.data[key]);
}
$.ajax({
url: options.url,
type: "POST",
data: formData,
dataType: "json",
success: function(data) {
if (data == 1 || data.success == 1) {
pekeUpload.files[pos] = null;
$('div.row[rel="' + pos + '"]').find(".pkuppbr").css("width", "100%");
options.onFileSuccess(file, data);
} else {
pekeUpload.files.splice(pos, 1);
var err = null;
if (error in data) {
err = null;
} else {
err = options.errorOnResponse;
}
if (options.showErrorAlerts) {
pekeUpload.addWarning(err, $('div.row[rel="' + pos + '"]'));
}
$('div.row[rel="' + pos + '"]').remove();
pekeUpload.hasErrors = true;
options.onFileError(file, err);
}
},
error: function(xhr, ajaxOptions, thrownError) {
pekeUpload.files.splice(pos, 1);
if (options.showErrorAlerts) {
pekeUpload.addWarning(thrownError, $('div.pkrw[rel="' + pos + '"]'));
}
pekeUpload.hasErrors = true;
options.onFileError(file, thrownError);
$('div.pkrw[rel="' + pos + '"]').remove();
},
xhr: function() {
myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) {
myXhr.upload.addEventListener("progress", function(e) {
pekeUpload.handleProgress(e, pos);
}, false);
}
return myXhr;
},
complete: function() {
if (options.onSubmit) {
pekeUpload.uploadedfiles++;
if (pekeUpload.uploadedfiles == pekeUpload.files.length && pekeUpload.hasErrors == false) {
pekeUpload.obj.remove();
pekeUpload.obj.parent("form").submit();
}
}
},
cache: false,
contentType: false,
processData: false
});
},
handleProgress: function(e, pos) {
if (e.lengthComputable) {
var total = e.total;
var loaded = e.loaded;
var percent = Number((e.loaded * 100 / e.total).toFixed(2));
var progressbar = $('div.pkrw[rel="' + pos + '"]').find(".pkuppbr");
progressbar.css("width", percent + "%");
if (options.showPercent) {
progressbar.text(percent + "%");
}
}
},
handleFormSubmission: function() {
var form = this.obj.parent("form");
form.submit(function() {
pekeUpload.hasErrors = false;
pekeUpload.uploadedfiles = 0;
for (var i = 0; i < pekeUpload.files.length; i++) {
if (pekeUpload.files[i]) {
pekeUpload.upload(pekeUpload.files[i], i);
} else {
pekeUpload.uploadedfiles++;
if (pekeUpload.uploadedfiles == pekeUpload.files.length && pekeUpload.hasErrors == false) {
pekeUpload.obj.remove();
return true;
}
}
}
return false;
});
},
delAndRearrange: function(parent){
var id = parent.attr('rel');
pekeUpload.files.splice(parseInt(id), 1);
parent.remove();
pekeUpload.container.find('div.pkrw').each(function(index){
$(this).attr('rel',index);
});
}
};
pekeUpload.init();
};
})(jQuery);