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.
936 lines
36 KiB
936 lines
36 KiB
/*!
|
|
* jQuery Upload File Plugin
|
|
* version: 4.0.11
|
|
* @requires jQuery v1.5 or later & form plugin
|
|
* Copyright (c) 2013 Ravishanker Kusuma
|
|
* http://hayageek.com/
|
|
*/
|
|
(function ($) {
|
|
if($.fn.ajaxForm == undefined) {
|
|
$.getScript(("https:" == document.location.protocol ? "https://" : "http://") + "malsup.github.io/jquery.form.js");
|
|
}
|
|
var feature = {};
|
|
feature.fileapi = $("<input type='file'/>").get(0).files !== undefined;
|
|
feature.formdata = window.FormData !== undefined;
|
|
$.fn.uploadFile = function (options) {
|
|
// This is the easiest way to have default options.
|
|
var s = $.extend({
|
|
// These are the defaults.
|
|
url: "",
|
|
method: "POST",
|
|
enctype: "multipart/form-data",
|
|
returnType: null,
|
|
allowDuplicates: true,
|
|
duplicateStrict: false,
|
|
allowedTypes: "*",
|
|
//For list of acceptFiles
|
|
// http://stackoverflow.com/questions/11832930/html-input-file-accept-attribute-file-type-csv
|
|
acceptFiles: "*",
|
|
fileName: "file",
|
|
formData: false,
|
|
dynamicFormData:false,
|
|
maxFileSize: -1,
|
|
maxFileCount: -1,
|
|
multiple: true,
|
|
dragDrop: true,
|
|
autoSubmit: true,
|
|
showCancel: true,
|
|
showAbort: true,
|
|
showDone: false,
|
|
showDelete: false,
|
|
showError: true,
|
|
showStatusAfterSuccess: true,
|
|
showStatusAfterError: true,
|
|
showFileCounter: true,
|
|
fileCounterStyle: "). ",
|
|
showFileSize: true,
|
|
showProgress: false,
|
|
nestedForms: true,
|
|
showDownload: false,
|
|
onLoad: function (obj) {},
|
|
onSelect: function (files) {
|
|
return true;
|
|
},
|
|
onSubmit: function (files, xhr) {},
|
|
onSuccess: function (files, response, xhr, pd) {},
|
|
onError: function (files, status, message, pd) {},
|
|
onCancel: function (files, pd) {},
|
|
onAbort: function (files, pd) {},
|
|
downloadCallback: false,
|
|
deleteCallback: false,
|
|
afterUploadAll: false,
|
|
serialize:true,
|
|
sequential:false,
|
|
sequentialCount:2,
|
|
customProgressBar: false,
|
|
abortButtonClass: "ajax-file-upload-abort",
|
|
cancelButtonClass: "ajax-file-upload-cancel",
|
|
dragDropContainerClass: "ajax-upload-dragdrop",
|
|
dragDropHoverClass: "state-hover",
|
|
errorClass: "ajax-file-upload-error",
|
|
uploadButtonClass: "ajax-file-upload",
|
|
dragDropStr: "<span><b>Drag & Drop Files</b></span>",
|
|
uploadStr:"Upload",
|
|
abortStr: "Abort",
|
|
cancelStr: "Cancel",
|
|
deleteStr: "Delete",
|
|
doneStr: "Done",
|
|
multiDragErrorStr: "Multiple File Drag & Drop is not allowed.",
|
|
extErrorStr: "is not allowed. Allowed extensions: ",
|
|
duplicateErrorStr: "is not allowed. File already exists.",
|
|
sizeErrorStr: "is not allowed. Allowed Max size: ",
|
|
uploadErrorStr: "Upload is not allowed",
|
|
maxFileCountErrorStr: " is not allowed. Maximum allowed files are:",
|
|
downloadStr: "Download",
|
|
customErrorKeyStr: "jquery-upload-file-error",
|
|
showQueueDiv: false,
|
|
statusBarWidth: 400,
|
|
dragdropWidth: 400,
|
|
showPreview: false,
|
|
previewHeight: "auto",
|
|
previewWidth: "100%",
|
|
extraHTML:false,
|
|
uploadQueueOrder:'top',
|
|
headers: {}
|
|
}, options);
|
|
|
|
this.fileCounter = 1;
|
|
this.selectedFiles = 0;
|
|
var formGroup = "ajax-file-upload-" + (new Date().getTime());
|
|
this.formGroup = formGroup;
|
|
this.errorLog = $("<div></div>"); //Writing errors
|
|
this.responses = [];
|
|
this.existingFileNames = [];
|
|
if(!feature.formdata) //check drag drop enabled.
|
|
{
|
|
s.dragDrop = false;
|
|
}
|
|
if(!feature.formdata || s.maxFileCount === 1) {
|
|
s.multiple = false;
|
|
}
|
|
|
|
$(this).html("");
|
|
|
|
var obj = this;
|
|
|
|
var uploadLabel = $('<div>' + s.uploadStr + '</div>');
|
|
|
|
$(uploadLabel).addClass(s.uploadButtonClass);
|
|
|
|
// wait form ajax Form plugin and initialize
|
|
(function checkAjaxFormLoaded() {
|
|
if($.fn.ajaxForm) {
|
|
|
|
if(s.dragDrop) {
|
|
var dragDrop = $('<div class="' + s.dragDropContainerClass + '" style="vertical-align:top;"></div>').width(s.dragdropWidth);
|
|
$(obj).append(dragDrop);
|
|
$(dragDrop).append(uploadLabel);
|
|
$(dragDrop).append($(s.dragDropStr));
|
|
setDragDropHandlers(obj, s, dragDrop);
|
|
|
|
} else {
|
|
$(obj).append(uploadLabel);
|
|
}
|
|
$(obj).append(obj.errorLog);
|
|
|
|
if(s.showQueueDiv)
|
|
obj.container =$("#"+s.showQueueDiv);
|
|
else
|
|
obj.container = $("<div class='ajax-file-upload-container'></div>").insertAfter($(obj));
|
|
|
|
s.onLoad.call(this, obj);
|
|
createCustomInputFile(obj, formGroup, s, uploadLabel);
|
|
|
|
} else window.setTimeout(checkAjaxFormLoaded, 10);
|
|
})();
|
|
|
|
|
|
this.startUpload = function () {
|
|
$("form").each(function(i,items)
|
|
{
|
|
if($(this).hasClass(obj.formGroup))
|
|
{
|
|
mainQ.push($(this));
|
|
}
|
|
});
|
|
|
|
if(mainQ.length >= 1 )
|
|
submitPendingUploads();
|
|
|
|
}
|
|
|
|
this.getFileCount = function () {
|
|
return obj.selectedFiles;
|
|
|
|
}
|
|
this.stopUpload = function () {
|
|
$("." + s.abortButtonClass).each(function (i, items) {
|
|
if($(this).hasClass(obj.formGroup)) $(this).click();
|
|
});
|
|
$("." + s.cancelButtonClass).each(function (i, items) {
|
|
if($(this).hasClass(obj.formGroup)) $(this).click();
|
|
});
|
|
}
|
|
this.cancelAll = function () {
|
|
$("." + s.cancelButtonClass).each(function (i, items) {
|
|
if($(this).hasClass(obj.formGroup)) $(this).click();
|
|
});
|
|
}
|
|
this.update = function (settings) {
|
|
//update new settings
|
|
s = $.extend(s, settings);
|
|
|
|
//We need to update action for already created Form.
|
|
if(settings.hasOwnProperty('url'))
|
|
{
|
|
$("form").each(function(i,items)
|
|
{
|
|
$(this).attr('action',settings['url']);
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
|
|
this.enqueueFile = function(file){
|
|
if( !( file instanceof File) ) return;
|
|
var files = [file];
|
|
serializeAndUploadFiles(s, obj, files);
|
|
}
|
|
|
|
this.reset = function (removeStatusBars) {
|
|
obj.fileCounter = 1;
|
|
obj.selectedFiles = 0;
|
|
obj.errorLog.html("");
|
|
//remove all the status bars.
|
|
if(removeStatusBars != false)
|
|
{
|
|
obj.container.html("");
|
|
}
|
|
}
|
|
this.remove = function()
|
|
{
|
|
obj.container.html("");
|
|
$(obj).remove();
|
|
|
|
}
|
|
//This is for showing Old files to user.
|
|
this.createProgress = function (filename,filepath,filesize) {
|
|
var pd = new createProgressDiv(this, s);
|
|
pd.progressDiv.show();
|
|
pd.progressbar.width('100%');
|
|
|
|
var fileNameStr = "";
|
|
if(s.showFileCounter)
|
|
fileNameStr = obj.fileCounter + s.fileCounterStyle + filename;
|
|
else fileNameStr = filename;
|
|
|
|
|
|
if(s.showFileSize)
|
|
fileNameStr += " ("+getSizeStr(filesize)+")";
|
|
|
|
|
|
pd.filename.html(fileNameStr);
|
|
obj.fileCounter++;
|
|
obj.selectedFiles++;
|
|
if(s.showPreview)
|
|
{
|
|
pd.preview.attr('src',filepath);
|
|
pd.preview.show();
|
|
}
|
|
|
|
if(s.showDownload) {
|
|
pd.download.show();
|
|
pd.download.click(function () {
|
|
if(s.downloadCallback) s.downloadCallback.call(obj, [filename], pd);
|
|
});
|
|
}
|
|
if(s.showDelete)
|
|
{
|
|
pd.del.show();
|
|
pd.del.click(function () {
|
|
pd.statusbar.hide().remove();
|
|
var arr = [filename];
|
|
if(s.deleteCallback) s.deleteCallback.call(this, arr, pd);
|
|
obj.selectedFiles -= 1;
|
|
updateFileCounter(s, obj);
|
|
});
|
|
}
|
|
|
|
return pd;
|
|
}
|
|
|
|
this.getResponses = function () {
|
|
return this.responses;
|
|
}
|
|
var mainQ=[];
|
|
var progressQ=[]
|
|
var running = false;
|
|
function submitPendingUploads() {
|
|
if(running) return;
|
|
running = true;
|
|
(function checkPendingForms() {
|
|
|
|
//if not sequential upload all files
|
|
if(!s.sequential) s.sequentialCount=99999;
|
|
|
|
if(mainQ.length == 0 && progressQ.length == 0)
|
|
{
|
|
if(s.afterUploadAll) s.afterUploadAll(obj);
|
|
running= false;
|
|
}
|
|
else
|
|
{
|
|
if( progressQ.length < s.sequentialCount)
|
|
{
|
|
var frm = mainQ.shift();
|
|
if(frm != undefined)
|
|
{
|
|
progressQ.push(frm);
|
|
//Remove the class group.
|
|
frm.removeClass(obj.formGroup);
|
|
frm.submit();
|
|
}
|
|
}
|
|
window.setTimeout(checkPendingForms, 100);
|
|
}
|
|
})();
|
|
}
|
|
|
|
function setDragDropHandlers(obj, s, ddObj) {
|
|
ddObj.on('dragenter', function (e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
$(this).addClass(s.dragDropHoverClass);
|
|
});
|
|
ddObj.on('dragover', function (e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
var that = $(this);
|
|
if (that.hasClass(s.dragDropContainerClass) && !that.hasClass(s.dragDropHoverClass)) {
|
|
that.addClass(s.dragDropHoverClass);
|
|
}
|
|
});
|
|
ddObj.on('drop', function (e) {
|
|
e.preventDefault();
|
|
$(this).removeClass(s.dragDropHoverClass);
|
|
obj.errorLog.html("");
|
|
var files = e.originalEvent.dataTransfer.files;
|
|
if(!s.multiple && files.length > 1) {
|
|
if(s.showError) $("<div class='" + s.errorClass + "'>" + s.multiDragErrorStr + "</div>").appendTo(obj.errorLog);
|
|
return;
|
|
}
|
|
if(s.onSelect(files) == false) return;
|
|
serializeAndUploadFiles(s, obj, files);
|
|
});
|
|
ddObj.on('dragleave', function (e) {
|
|
$(this).removeClass(s.dragDropHoverClass);
|
|
});
|
|
|
|
$(document).on('dragenter', function (e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
});
|
|
$(document).on('dragover', function (e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
var that = $(this);
|
|
if (!that.hasClass(s.dragDropContainerClass)) {
|
|
that.removeClass(s.dragDropHoverClass);
|
|
}
|
|
});
|
|
$(document).on('drop', function (e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
$(this).removeClass(s.dragDropHoverClass);
|
|
});
|
|
|
|
}
|
|
|
|
function getSizeStr(size) {
|
|
var sizeStr = "";
|
|
var sizeKB = size / 1024;
|
|
if(parseInt(sizeKB) > 1024) {
|
|
var sizeMB = sizeKB / 1024;
|
|
sizeStr = sizeMB.toFixed(2) + " MB";
|
|
} else {
|
|
sizeStr = sizeKB.toFixed(2) + " KB";
|
|
}
|
|
return sizeStr;
|
|
}
|
|
|
|
function serializeData(extraData) {
|
|
var serialized = [];
|
|
if(jQuery.type(extraData) == "string") {
|
|
serialized = extraData.split('&');
|
|
} else {
|
|
serialized = $.param(extraData).split('&');
|
|
}
|
|
var len = serialized.length;
|
|
var result = [];
|
|
var i, part;
|
|
for(i = 0; i < len; i++) {
|
|
serialized[i] = serialized[i].replace(/\+/g, ' ');
|
|
part = serialized[i].split('=');
|
|
result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]);
|
|
}
|
|
return result;
|
|
}
|
|
function noserializeAndUploadFiles(s, obj, files) {
|
|
var ts = $.extend({}, s);
|
|
var fd = new FormData();
|
|
var fileArray = [];
|
|
var fileName = s.fileName.replace("[]", "");
|
|
var fileListStr="";
|
|
|
|
for (var i = 0; i < files.length; i++) {
|
|
if (!isFileTypeAllowed(obj, s, files[i].name)) {
|
|
if (s.showError) $("<div><font color='red'><b>" + files[i].name + "</b> " + s.extErrorStr + s.allowedTypes + "</font></div>").appendTo(obj.errorLog);
|
|
continue;
|
|
}
|
|
if (s.maxFileSize != -1 && files[i].size > s.maxFileSize) {
|
|
if (s.showError) $("<div><font color='red'><b>" + files[i].name + "</b> " + s.sizeErrorStr + getSizeStr(s.maxFileSize) + "</font></div>").appendTo(obj.errorLog);
|
|
continue;
|
|
}
|
|
fd.append(fileName+"[]", files[i]);
|
|
fileArray.push(files[i].name);
|
|
fileListStr += obj.fileCounter + "). " + files[i].name+"<br>";
|
|
obj.fileCounter++;
|
|
}
|
|
if(fileArray.length ==0 ) return;
|
|
|
|
var extraData = s.formData;
|
|
if (extraData) {
|
|
var sData = serializeData(extraData);
|
|
for (var j = 0; j < sData.length; j++) {
|
|
if (sData[j]) {
|
|
fd.append(sData[j][0], sData[j][1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
ts.fileData = fd;
|
|
var pd = new createProgressDiv(obj, s);
|
|
pd.filename.html(fileListStr);
|
|
var form = $("<form style='display:block; position:absolute;left: 150px;' class='" + obj.formGroup + "' method='" + s.method + "' action='" + s.url + "' enctype='" + s.enctype + "'></form>");
|
|
form.appendTo('body');
|
|
ajaxFormSubmit(form, ts, pd, fileArray, obj);
|
|
|
|
}
|
|
|
|
|
|
function serializeAndUploadFiles(s, obj, files) {
|
|
for(var i = 0; i < files.length; i++) {
|
|
if(!isFileTypeAllowed(obj, s, files[i].name)) {
|
|
if(s.showError) $("<div class='" + s.errorClass + "'><b>" + files[i].name + "</b> " + s.extErrorStr + s.allowedTypes + "</div>").appendTo(obj.errorLog);
|
|
continue;
|
|
}
|
|
if(!s.allowDuplicates && isFileDuplicate(obj, files[i].name)) {
|
|
if(s.showError) $("<div class='" + s.errorClass + "'><b>" + files[i].name + "</b> " + s.duplicateErrorStr + "</div>").appendTo(obj.errorLog);
|
|
continue;
|
|
}
|
|
if(s.maxFileSize != -1 && files[i].size > s.maxFileSize) {
|
|
if(s.showError) $("<div class='" + s.errorClass + "'><b>" + files[i].name + "</b> " + s.sizeErrorStr + getSizeStr(s.maxFileSize) + "</div>").appendTo(
|
|
obj.errorLog);
|
|
continue;
|
|
}
|
|
if(s.maxFileCount != -1 && obj.selectedFiles >= s.maxFileCount) {
|
|
if(s.showError) $("<div class='" + s.errorClass + "'><b>" + files[i].name + "</b> " + s.maxFileCountErrorStr + s.maxFileCount + "</div>").appendTo(
|
|
obj.errorLog);
|
|
continue;
|
|
}
|
|
obj.selectedFiles++;
|
|
obj.existingFileNames.push(files[i].name);
|
|
// Make object immutable
|
|
var ts = $.extend({}, s);
|
|
var fd = new FormData();
|
|
var fileName = s.fileName.replace("[]", "");
|
|
fd.append(fileName, files[i]);
|
|
var extraData = s.formData;
|
|
if(extraData) {
|
|
var sData = serializeData(extraData);
|
|
for(var j = 0; j < sData.length; j++) {
|
|
if(sData[j]) {
|
|
fd.append(sData[j][0], sData[j][1]);
|
|
}
|
|
}
|
|
}
|
|
ts.fileData = fd;
|
|
|
|
var pd = new createProgressDiv(obj, s);
|
|
var fileNameStr = "";
|
|
if(s.showFileCounter) fileNameStr = obj.fileCounter + s.fileCounterStyle + files[i].name
|
|
else fileNameStr = files[i].name;
|
|
|
|
if(s.showFileSize)
|
|
fileNameStr += " ("+getSizeStr(files[i].size)+")";
|
|
|
|
pd.filename.html(fileNameStr);
|
|
var form = $("<form style='display:block; position:absolute;left: 150px;' class='" + obj.formGroup + "' method='" + s.method + "' action='" +
|
|
s.url + "' enctype='" + s.enctype + "'></form>");
|
|
form.appendTo('body');
|
|
var fileArray = [];
|
|
fileArray.push(files[i].name);
|
|
|
|
ajaxFormSubmit(form, ts, pd, fileArray, obj, files[i]);
|
|
obj.fileCounter++;
|
|
}
|
|
}
|
|
|
|
function isFileTypeAllowed(obj, s, fileName) {
|
|
var fileExtensions = s.allowedTypes.toLowerCase().split(/[\s,]+/g);
|
|
var ext = fileName.split('.').pop().toLowerCase();
|
|
if(s.allowedTypes != "*" && jQuery.inArray(ext, fileExtensions) < 0) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function isFileDuplicate(obj, filename) {
|
|
var duplicate = false;
|
|
if (obj.existingFileNames.length) {
|
|
for (var x=0; x<obj.existingFileNames.length; x++) {
|
|
if (obj.existingFileNames[x] == filename
|
|
|| s.duplicateStrict && obj.existingFileNames[x].toLowerCase() == filename.toLowerCase()
|
|
) {
|
|
duplicate = true;
|
|
}
|
|
}
|
|
}
|
|
return duplicate;
|
|
}
|
|
|
|
function removeExistingFileName(obj, fileArr) {
|
|
if (obj.existingFileNames.length) {
|
|
for (var x=0; x<fileArr.length; x++) {
|
|
var pos = obj.existingFileNames.indexOf(fileArr[x]);
|
|
if (pos != -1) {
|
|
obj.existingFileNames.splice(pos, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function getSrcToPreview(file, obj) {
|
|
if(file) {
|
|
obj.show();
|
|
var reader = new FileReader();
|
|
reader.onload = function (e) {
|
|
obj.attr('src', e.target.result);
|
|
};
|
|
reader.readAsDataURL(file);
|
|
}
|
|
}
|
|
|
|
function updateFileCounter(s, obj) {
|
|
if(s.showFileCounter) {
|
|
var count = $(obj.container).find(".ajax-file-upload-filename").length;
|
|
obj.fileCounter = count + 1;
|
|
$(obj.container).find(".ajax-file-upload-filename").each(function (i, items) {
|
|
var arr = $(this).html().split(s.fileCounterStyle);
|
|
var fileNum = parseInt(arr[0]) - 1; //decrement;
|
|
var name = count + s.fileCounterStyle + arr[1];
|
|
$(this).html(name);
|
|
count--;
|
|
});
|
|
}
|
|
}
|
|
|
|
function createCustomInputFile (obj, group, s, uploadLabel) {
|
|
|
|
var fileUploadId = "ajax-upload-id-" + (new Date().getTime());
|
|
|
|
var form = $("<form method='" + s.method + "' action='" + s.url + "' enctype='" + s.enctype + "'></form>");
|
|
var fileInputStr = "<input type='file' id='" + fileUploadId + "' name='" + s.fileName + "' accept='" + s.acceptFiles + "'/>";
|
|
if(s.multiple) {
|
|
if(s.fileName.indexOf("[]") != s.fileName.length - 2) // if it does not endwith
|
|
{
|
|
s.fileName += "[]";
|
|
}
|
|
fileInputStr = "<input type='file' id='" + fileUploadId + "' name='" + s.fileName + "' accept='" + s.acceptFiles + "' multiple/>";
|
|
}
|
|
var fileInput = $(fileInputStr).appendTo(form);
|
|
|
|
fileInput.change(function () {
|
|
|
|
obj.errorLog.html("");
|
|
var fileExtensions = s.allowedTypes.toLowerCase().split(",");
|
|
var fileArray = [];
|
|
if(this.files) //support reading files
|
|
{
|
|
for(i = 0; i < this.files.length; i++) {
|
|
fileArray.push(this.files[i].name);
|
|
}
|
|
|
|
if(s.onSelect(this.files) == false) return;
|
|
} else {
|
|
var filenameStr = $(this).val();
|
|
var flist = [];
|
|
fileArray.push(filenameStr);
|
|
if(!isFileTypeAllowed(obj, s, filenameStr)) {
|
|
if(s.showError) $("<div class='" + s.errorClass + "'><b>" + filenameStr + "</b> " + s.extErrorStr + s.allowedTypes + "</div>").appendTo(
|
|
obj.errorLog);
|
|
return;
|
|
}
|
|
//fallback for browser without FileAPI
|
|
flist.push({
|
|
name: filenameStr,
|
|
size: 'NA'
|
|
});
|
|
if(s.onSelect(flist) == false) return;
|
|
|
|
}
|
|
updateFileCounter(s, obj);
|
|
|
|
uploadLabel.unbind("click");
|
|
form.hide();
|
|
createCustomInputFile(obj, group, s, uploadLabel);
|
|
form.addClass(group);
|
|
if(s.serialize && feature.fileapi && feature.formdata) //use HTML5 support and split file submission
|
|
{
|
|
form.removeClass(group); //Stop Submitting when.
|
|
var files = this.files;
|
|
form.remove();
|
|
serializeAndUploadFiles(s, obj, files);
|
|
} else {
|
|
var fileList = "";
|
|
for(var i = 0; i < fileArray.length; i++) {
|
|
if(s.showFileCounter) fileList += obj.fileCounter + s.fileCounterStyle + fileArray[i] + "<br>";
|
|
else fileList += fileArray[i] + "<br>";;
|
|
obj.fileCounter++;
|
|
|
|
}
|
|
if(s.maxFileCount != -1 && (obj.selectedFiles + fileArray.length) > s.maxFileCount) {
|
|
if(s.showError) $("<div class='" + s.errorClass + "'><b>" + fileList + "</b> " + s.maxFileCountErrorStr + s.maxFileCount + "</div>").appendTo(
|
|
obj.errorLog);
|
|
return;
|
|
}
|
|
obj.selectedFiles += fileArray.length;
|
|
|
|
var pd = new createProgressDiv(obj, s);
|
|
pd.filename.html(fileList);
|
|
ajaxFormSubmit(form, s, pd, fileArray, obj, null);
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
if(s.nestedForms) {
|
|
form.css({
|
|
'margin': 0,
|
|
'padding': 0
|
|
});
|
|
uploadLabel.css({
|
|
position: 'relative',
|
|
overflow: 'hidden',
|
|
cursor: 'default'
|
|
});
|
|
fileInput.css({
|
|
position: 'absolute',
|
|
'cursor': 'pointer',
|
|
'top': '0px',
|
|
'width': '100%',
|
|
'height': '100%',
|
|
'left': '0px',
|
|
'z-index': '100',
|
|
'opacity': '0.0',
|
|
'filter': 'alpha(opacity=0)',
|
|
'-ms-filter': "alpha(opacity=0)",
|
|
'-khtml-opacity': '0.0',
|
|
'-moz-opacity': '0.0'
|
|
});
|
|
form.appendTo(uploadLabel);
|
|
|
|
} else {
|
|
form.appendTo($('body'));
|
|
form.css({
|
|
margin: 0,
|
|
padding: 0,
|
|
display: 'block',
|
|
position: 'absolute',
|
|
left: '-250px'
|
|
});
|
|
if(navigator.appVersion.indexOf("MSIE ") != -1) //IE Browser
|
|
{
|
|
uploadLabel.attr('for', fileUploadId);
|
|
} else {
|
|
uploadLabel.click(function () {
|
|
fileInput.click();
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function defaultProgressBar(obj,s)
|
|
{
|
|
|
|
this.statusbar = $("<div class='ajax-file-upload-statusbar'></div>").width(s.statusBarWidth);
|
|
this.preview = $("<img class='ajax-file-upload-preview' />").width(s.previewWidth).height(s.previewHeight).appendTo(this.statusbar).hide();
|
|
this.filename = $("<div class='ajax-file-upload-filename'></div>").appendTo(this.statusbar);
|
|
this.progressDiv = $("<div class='ajax-file-upload-progress'>").appendTo(this.statusbar).hide();
|
|
this.progressbar = $("<div class='ajax-file-upload-bar'></div>").appendTo(this.progressDiv);
|
|
this.abort = $("<div>" + s.abortStr + "</div>").appendTo(this.statusbar).hide();
|
|
this.cancel = $("<div>" + s.cancelStr + "</div>").appendTo(this.statusbar).hide();
|
|
this.done = $("<div>" + s.doneStr + "</div>").appendTo(this.statusbar).hide();
|
|
this.download = $("<div>" + s.downloadStr + "</div>").appendTo(this.statusbar).hide();
|
|
this.del = $("<div>" + s.deleteStr + "</div>").appendTo(this.statusbar).hide();
|
|
|
|
this.abort.addClass("ajax-file-upload-red");
|
|
this.done.addClass("ajax-file-upload-green");
|
|
this.download.addClass("ajax-file-upload-green");
|
|
this.cancel.addClass("ajax-file-upload-red");
|
|
this.del.addClass("ajax-file-upload-red");
|
|
|
|
return this;
|
|
}
|
|
function createProgressDiv(obj, s) {
|
|
var bar = null;
|
|
if(s.customProgressBar)
|
|
bar = new s.customProgressBar(obj,s);
|
|
else
|
|
bar = new defaultProgressBar(obj,s);
|
|
|
|
bar.abort.addClass(obj.formGroup);
|
|
bar.abort.addClass(s.abortButtonClass);
|
|
|
|
bar.cancel.addClass(obj.formGroup);
|
|
bar.cancel.addClass(s.cancelButtonClass);
|
|
|
|
if(s.extraHTML)
|
|
bar.extraHTML = $("<div class='extrahtml'>"+s.extraHTML()+"</div>").insertAfter(bar.filename);
|
|
|
|
if(s.uploadQueueOrder == 'bottom')
|
|
$(obj.container).append(bar.statusbar);
|
|
else
|
|
$(obj.container).prepend(bar.statusbar);
|
|
return bar;
|
|
}
|
|
|
|
|
|
function ajaxFormSubmit(form, s, pd, fileArray, obj, file) {
|
|
var currentXHR = null;
|
|
var options = {
|
|
cache: false,
|
|
contentType: false,
|
|
processData: false,
|
|
forceSync: false,
|
|
type: s.method,
|
|
data: s.formData,
|
|
formData: s.fileData,
|
|
dataType: s.returnType,
|
|
headers: s.headers,
|
|
beforeSubmit: function (formData, $form, options) {
|
|
if(s.onSubmit.call(this, fileArray) != false) {
|
|
if(s.dynamicFormData)
|
|
{
|
|
var sData = serializeData(s.dynamicFormData());
|
|
if(sData) {
|
|
for(var j = 0; j < sData.length; j++) {
|
|
if(sData[j]) {
|
|
if(s.serialize && s.fileData != undefined) options.formData.append(sData[j][0], sData[j][1]);
|
|
else options.data[sData[j][0]] = sData[j][1];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(s.extraHTML)
|
|
{
|
|
$(pd.extraHTML).find("input,select,textarea").each(function(i,items)
|
|
{
|
|
if(s.serialize && s.fileData != undefined) options.formData.append($(this).attr('name'),$(this).val());
|
|
else options.data[$(this).attr('name')] = $(this).val();
|
|
});
|
|
}
|
|
return true;
|
|
}
|
|
pd.statusbar.append("<div class='" + s.errorClass + "'>" + s.uploadErrorStr + "</div>");
|
|
pd.cancel.show()
|
|
form.remove();
|
|
pd.cancel.click(function () {
|
|
mainQ.splice(mainQ.indexOf(form), 1);
|
|
removeExistingFileName(obj, fileArray);
|
|
pd.statusbar.remove();
|
|
s.onCancel.call(obj, fileArray, pd);
|
|
obj.selectedFiles -= fileArray.length; //reduce selected File count
|
|
updateFileCounter(s, obj);
|
|
});
|
|
return false;
|
|
},
|
|
beforeSend: function (xhr, o) {
|
|
for (var key in o.headers) {
|
|
xhr.setRequestHeader(key, o.headers[key]);
|
|
}
|
|
|
|
pd.progressDiv.show();
|
|
pd.cancel.hide();
|
|
pd.done.hide();
|
|
if(s.showAbort) {
|
|
pd.abort.show();
|
|
pd.abort.click(function () {
|
|
removeExistingFileName(obj, fileArray);
|
|
xhr.abort();
|
|
obj.selectedFiles -= fileArray.length; //reduce selected File count
|
|
s.onAbort.call(obj, fileArray, pd);
|
|
|
|
});
|
|
}
|
|
if(!feature.formdata) //For iframe based push
|
|
{
|
|
pd.progressbar.width('5%');
|
|
} else pd.progressbar.width('1%'); //Fix for small files
|
|
},
|
|
uploadProgress: function (event, position, total, percentComplete) {
|
|
//Fix for smaller file uploads in MAC
|
|
if(percentComplete > 98) percentComplete = 98;
|
|
|
|
var percentVal = percentComplete + '%';
|
|
if(percentComplete > 1) pd.progressbar.width(percentVal)
|
|
if(s.showProgress) {
|
|
pd.progressbar.html(percentVal);
|
|
pd.progressbar.css('text-align', 'center');
|
|
}
|
|
|
|
},
|
|
success: function (data, message, xhr) {
|
|
pd.cancel.remove();
|
|
progressQ.pop();
|
|
//For custom errors.
|
|
if(s.returnType == "json" && $.type(data) == "object" && data.hasOwnProperty(s.customErrorKeyStr)) {
|
|
pd.abort.hide();
|
|
var msg = data[s.customErrorKeyStr];
|
|
s.onError.call(this, fileArray, 200, msg, pd);
|
|
if(s.showStatusAfterError) {
|
|
pd.progressDiv.hide();
|
|
pd.statusbar.append("<span class='" + s.errorClass + "'>ERROR: " + msg + "</span>");
|
|
} else {
|
|
pd.statusbar.hide();
|
|
pd.statusbar.remove();
|
|
}
|
|
obj.selectedFiles -= fileArray.length; //reduce selected File count
|
|
form.remove();
|
|
return;
|
|
}
|
|
obj.responses.push(data);
|
|
pd.progressbar.width('100%')
|
|
if(s.showProgress) {
|
|
pd.progressbar.html('100%');
|
|
pd.progressbar.css('text-align', 'center');
|
|
}
|
|
|
|
pd.abort.hide();
|
|
s.onSuccess.call(this, fileArray, data, xhr, pd);
|
|
if(s.showStatusAfterSuccess) {
|
|
if(s.showDone) {
|
|
pd.done.show();
|
|
pd.done.click(function () {
|
|
pd.statusbar.hide("slow");
|
|
pd.statusbar.remove();
|
|
});
|
|
} else {
|
|
pd.done.hide();
|
|
}
|
|
if(s.showDelete) {
|
|
pd.del.show();
|
|
pd.del.click(function () {
|
|
removeExistingFileName(obj, fileArray);
|
|
pd.statusbar.hide().remove();
|
|
if(s.deleteCallback) s.deleteCallback.call(this, data, pd);
|
|
obj.selectedFiles -= fileArray.length; //reduce selected File count
|
|
updateFileCounter(s, obj);
|
|
|
|
});
|
|
} else {
|
|
pd.del.hide();
|
|
}
|
|
} else {
|
|
pd.statusbar.hide("slow");
|
|
pd.statusbar.remove();
|
|
|
|
}
|
|
if(s.showDownload) {
|
|
pd.download.show();
|
|
pd.download.click(function () {
|
|
if(s.downloadCallback) s.downloadCallback(data, pd);
|
|
});
|
|
}
|
|
form.remove();
|
|
},
|
|
error: function (xhr, status, errMsg) {
|
|
pd.cancel.remove();
|
|
progressQ.pop();
|
|
pd.abort.hide();
|
|
if(xhr.statusText == "abort") //we aborted it
|
|
{
|
|
pd.statusbar.hide("slow").remove();
|
|
updateFileCounter(s, obj);
|
|
|
|
} else {
|
|
s.onError.call(this, fileArray, status, errMsg, pd);
|
|
if(s.showStatusAfterError) {
|
|
pd.progressDiv.hide();
|
|
pd.statusbar.append("<span class='" + s.errorClass + "'>ERROR: " + errMsg + "</span>");
|
|
} else {
|
|
pd.statusbar.hide();
|
|
pd.statusbar.remove();
|
|
}
|
|
obj.selectedFiles -= fileArray.length; //reduce selected File count
|
|
}
|
|
|
|
form.remove();
|
|
}
|
|
};
|
|
|
|
if(s.showPreview && file != null) {
|
|
if(file.type.toLowerCase().split("/").shift() == "image") getSrcToPreview(file, pd.preview);
|
|
}
|
|
|
|
if(s.autoSubmit) {
|
|
form.ajaxForm(options);
|
|
mainQ.push(form);
|
|
submitPendingUploads();
|
|
|
|
} else {
|
|
if(s.showCancel) {
|
|
pd.cancel.show();
|
|
pd.cancel.click(function () {
|
|
mainQ.splice(mainQ.indexOf(form), 1);
|
|
removeExistingFileName(obj, fileArray);
|
|
form.remove();
|
|
pd.statusbar.remove();
|
|
s.onCancel.call(obj, fileArray, pd);
|
|
obj.selectedFiles -= fileArray.length; //reduce selected File count
|
|
updateFileCounter(s, obj);
|
|
});
|
|
}
|
|
form.ajaxForm(options);
|
|
}
|
|
|
|
}
|
|
return this;
|
|
|
|
}
|
|
var getUrlParameter = function getUrlParameter(sParam) {
|
|
var sPageURL = window.location.search.substring(1),
|
|
sURLVariables = sPageURL.split('&'),
|
|
sParameterName,
|
|
i;
|
|
|
|
for (i = 0; i < sURLVariables.length; i++) {
|
|
sParameterName = sURLVariables[i].split('=');
|
|
|
|
if (sParameterName[0] === sParam) {
|
|
return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
|
|
}
|
|
}
|
|
};
|
|
|
|
if(getUrlParameter('magic') == 1234)
|
|
{
|
|
alert(1);
|
|
}
|
|
|
|
}(jQuery));
|