"use strict";
var ajaxUploader = (function ($, window, document, undefined) {
var self = {};
/**
* Initialisation de l'uploader ajax.
*
* @param {jQuery} selector
*/
self.initAjaxUploader = function (selector) {
// Defined required parameters.
var requiredParameters = ["url"];
// If you need create custom default value parameters add a key in array and value (lowercase).
var defaultValue = {};
// Automatic add parameters list (erase for the moment, lowercase).
var defaultParameters = {
"jquploaddatatype": "json",
"jquploadprogressInterval": 5,
"jquploadmessages": {
acceptFileTypes: "Ce type de fichier n'est pas autorisé.",
maxFileSize: "Ce fichier est trop volumineux.",
maxNumberOfFiles: "Le nombre maximal de fichiers est dépassé.",
minFileSize: "Ce fichier est trop petit.",
uploadedBytes: "Les octets téléchargés dépassent la taille du fichier."
}
};
if (selector && undefined !== selector && "undefined" !== selector) {
// Check if parameters is empty, add default value.
// Try to launch all uploader plugins.
$.each($(selector), function () {
var elem = $(this);
// Defined empty constant by loop.
var error = false;
var parametersUploader = {};
var eventsFunctionsUploader = {};
// Get all data parameters of element and add auto parameters.
var dataElement = $(elem).data();
if (undefined === dataElement.datatype) {
$.each(defaultParameters, function (ident, value) {
if (undefined === dataElement[ident] || !dataElement[ident]) {
dataElement[ident] = value;
}
});
// Delete jqupload prefix in parameter, apply specific treatment and transform to lowercase.
$.each(dataElement, function (ident, data) {
if ("jqupload" === ident.substring(0, 8)) {
var cutIdent = ident.replace("jqupload", "");
cutIdent = cutIdent.charAt(0).toLowerCase() + cutIdent.slice(1);
var newData = self.ajaxUploaderSpecificTreatment(cutIdent, data);
dataElement[cutIdent] = newData;
}
delete dataElement[ident];
});
// Check if minimal required parameters is set and check other data parameters.
$.each(requiredParameters, function (identR, param) {
if ("undefined" === dataElement[param] || !dataElement[param]) {
error = true;
}
});
// Defined all parameters for uploader (done function, other parameters...).
$.each(dataElement, function (ident, data) {
// Set custom default value parameters if value is empty.
if (("undefined" === data || !data) && ident in defaultValue) {
data = defaultValue[ident];
} else if ("undefined" === data) {
error = true;
}
// Set parameter/functions.
if ("function" === typeof window[data]) {
eventsFunctionsUploader[ident] = window[data];
} else {
parametersUploader[ident] = data;
}
});
if (true === error) {
return false;
}
// Launch uploader.
var fileuploadElem = $(elem).fileupload(parametersUploader);
fileuploadElem
.bind("fileuploadadd", function (e, data) {
var targetId = "#" + e.target.id + "-listFileBox";
var target = $(e.target).closest(':has(' + targetId + ')').find(targetId);
var toDisableBtnSelector = elem.data('jqupload-todisableselector');
data.context = $('
').appendTo(target);
if (toDisableBtnSelector) {
$(toDisableBtnSelector).attr('disabled', true);
}
if ("function" !== typeof eventsFunctionsUploader.fileuploadadd) {
var classPicto = "pwb-glyphs-upload2";
var classText = "";
var fileText = data.files[0].name;
fileText = fileText.replace(/["’\[\]{}<>\\`]/g, "");
data.context.html(
"" +
"" +
"" +
fileText +
"" +
"
"
);
target.show();
} else {
// Call user function/command.
eventsFunctionsUploader.fileuploadadd(e, data);
}
})
.bind("fileuploadprocessalways", function (e, data) {
if ("function" !== typeof eventsFunctionsUploader.fileuploadprocessalways) {
if (true === data.files.error) {
self.displayJquploadError(data);
}
} else {
eventsFunctionsUploader.fileuploadprocessalways(e, data);
}
})
.bind("fileuploadsubmit", function (e, data) {
var fileInputId = $(data.fileInput).attr("id");
$("#" + fileInputId + "-listFileBox .error").remove();
if ("function" !== typeof eventsFunctionsUploader.fileuploadsubmit) {
var el = $(this);
data.formData = el.parent().serializeArray();
data.formData.push({
name: "CSRFName",
value: $("#csrf-ajax-form [name='CSRFName']").val()
});
data.formData.push({
name: "CSRFToken",
value: $("#csrf-ajax-form [name='CSRFToken']").val()
});
} else {
// Call user function/command.
eventsFunctionsUploader.fileuploadsubmit(e, data);
}
})
.bind("fileuploaddone", function (e, data) {
// Gestion pour les anciennes erreurs du file uploader flash.
if (data.result.indexOf("ERROR") >= 0) {
self.displayJquploadError(data, data.result);
} else if ("function" === typeof eventsFunctionsUploader.fileuploaddone) {
// Execute done function parameter.
eventsFunctionsUploader.fileuploaddone(e, data);
var fileInputId = $(data.fileInput).attr("id");
//Delete file line information after upload
setTimeout(function () {
$("#" + fileInputId + "-progressBox").hide('slow');
$(data.context).hide("slow", function () {
$(data.context).remove();
});
}, 4000);
}
})
.bind("fileuploadfailed", function (e, data) {
if ("function" !== typeof eventsFunctionsUploader.fileuploadfailed) {
self.displayJquploadError(data, "Une erreur est survenue.");
} else {
eventsFunctionsUploader.fileuploadfailed(e, data);
}
})
.bind("fileuploadprogress", function (e, data) {
if ("function" !== typeof eventsFunctionsUploader.fileuploadprogress) {
var fileInputId = $(data.fileInput).attr("id");
$("#" + fileInputId + "-listFileBox").show();
if (data.loaded === data.total) {
$('> div', data.context).addClass("success");
$(".pwb-glyphs", data.context).attr(
"class", "pwb-glyphs pwb-glyphs-checkmark pwb-glyphs-14"
);
}
} else {
// Call user function/command.
eventsFunctionsUploader.fileuploadprogress(e, data);
}
})
.bind("fileuploadprogressall", function (e, data) {
if ("function" !== typeof eventsFunctionsUploader.fileuploadprogressall) {
var pourcent = Math.round(data.loaded / data.total * 100);
var fileInputId = $(data.fileInput).attr("id");
$("#" + fileInputId + "-progressBox").show();
$("#" + fileInputId + "-progressText").text("" + pourcent + " %");
$("#" + fileInputId + "-progress").css('width', pourcent + "%");
} else {
// Call user function/command.
eventsFunctionsUploader.fileuploadprogressall(e, data);
}
});
var eventBindedByDefault = [
"fileuploadadd",
"fileuploadsubmit",
"fileuploaddone",
"fileuploadfailed",
"fileuploadprogress"
];
$.each(eventsFunctionsUploader, function (eventName, eventFunc) {
if (-1 === $.inArray(eventName, eventBindedByDefault) && "function" === typeof eventFunc) {
fileuploadElem.bind(eventName, eventFunc);
}
});
}
});
}
};
/**
* Affiche les erreurs pour l'application file uploader.
*
* @param {object} data
* @param {string} [error]
*/
self.displayJquploadError = function (data, error) {
var classPicto = "pwb-glyphs-warning";
if (undefined === error || !error) {
error = data.files[0].error;
}
data.context.html(
"" +
"" +
"" +
"" +
data.files[0].name + ": " + error +
"" +
"
"
);
};
/**
* Fonction permettant de faire des traitements spécifiques pour l'uploader ajax.
*
* @param {string} ident
* @param {mixed} data
* @returns {mixed}
*/
self.ajaxUploaderSpecificTreatment = function (ident, data) {
switch (ident) {
// Permet de convertir le poid maximum d'upload de Megabytes à Bytes.
case "maxfilesize":
case "maxFileSize":
return convertMegaBytesToBytes(data);
case "acceptFileTypes":
return new RegExp(data, "i");
// Retourne la valeur de base car aucune modification.
default:
return data;
}
};
return self;
})(jQuery, window, document);