;
(function($, window, document, undefined) {
window.addEventListener("dragover", function(e) {
e = e || event;
e.preventDefault();
}, false);
window.addEventListener("drop", function(e) {
e = e || event;
e.preventDefault();
}, false);
const compareMimeType = (mimeTypes, fileType, formatFile) => {
if (mimeTypes.length < 2 && mimeTypes[0] === "*") {
return true;
}
for (let index = 1; index < mimeTypes.length; index += 3) {
if (mimeTypes[index + 1] === "*" && fileType.search(new RegExp(mimeTypes[index])) != -1) {
return true;
} else if (mimeTypes[index + 1] && mimeTypes[index + 1] != "*" && fileType.search(new RegExp("\\*" + mimeTypes[index + 1] + "\\*")) != -1) {
return true;
} else if (mimeTypes[index + 1] && mimeTypes[index + 1] != "*" && fileType.search(new RegExp(mimeTypes[index + 1])) != -1) {
return true;
} else if (mimeTypes[index + 1] === "" && (fileType.search(new RegExp(mimeTypes[index])) != -1 || formatFile.search(new RegExp(mimeTypes[index])) != -1)) {
return true;
}
}
return false;
}
$.fn.imageuploadify = function(opts) {
const settings = $.extend({}, $.fn.imageuploadify.defaults, opts);
this.each(function() {
const self = this;
if (!$(self).attr("multiple")) {
return;
}
let accept = $(self).attr("accept") ? $(self).attr("accept").replace(/\s/g, "").split(",") : null;
let result = [];
accept.forEach((item) => {
let regexp;
if (item.search(/\//) != -1) {
regexp = new RegExp("([A-Za-z-.]*)\/([A-Za-z-*.]*)", "g");
} else {
regexp = new RegExp("\.([A-Za-z-]*)()", "g");
}
const r = regexp.exec(item);
result = result.concat(r);
});
let totalFiles = [];
let counter = 0;
let dragbox = $(`
Drag&Drop Your File(s)Here To Upload
`);
let overlay = dragbox.find(".imageuploadify-overlay");
let uploadIcon = dragbox.find(".imageuploadify-overlay i");
let imagesList = dragbox.find(".imageuploadify-images-list");
let addIcon = dragbox.find(".imageuploadify-images-list i");
let addMsg = dragbox.find(".imageuploadify-images-list span");
let button = dragbox.find(".imageuploadify-images-list button");
const retrieveFiles = (files) => {
for (let index = 0; index < files.length; ++index) {
if (!accept || compareMimeType(result, files[index].type, /(?:\.([^.]+))?$/.exec(files[index].name)[1])) {
const id = Math.random().toString(36).substr(2, 9);
readingFile(id, files[index]);
totalFiles.push({
id: id,
file: files[index]
});
}
}
}
const readingFile = (id, file) => {
const fReader = new FileReader();
const width = dragbox.width();
const boxesNb = Math.floor(width / 100);
const marginSize = Math.floor((width - (boxesNb * 100)) / (boxesNb + 1));
let container = $(`${file.name}${file.type}${file.size}
`);
let details = container.find(".imageuploadify-details");
let deleteBtn = container.find("button");
container.css("margin-left", marginSize + "px");
details.hover(function() {
$(this).css("opacity", "1");
}).mouseleave(function() {
$(this).css("opacity", "0");
});
if (file.type && file.type.search(/image/) != -1) {
fReader.onloadend = function(e) {
let image = $("");
image.attr("src", e.target.result);
container.append(image);
imagesList.append(container);
imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+4)").css("margin-left", marginSize + "px");
imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+3)").css("margin-right", marginSize + "px");
};
} else if (file.type) {
let type = "";
if (file.type.search(/audio/) != -1) {
type = "";
} else if (file.type.search(/video/) != -1) {
type = "";
}
fReader.onloadend = function(e) {
let span = $("" + type + "");
span.css("font-size", "5em");
container.append(span);
imagesList.append(container);
imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+4)").css("margin-left", marginSize + "px");
imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+3)").css("margin-right", marginSize + "px");
};
}
deleteBtn.on("click", function() {
$(this.parentElement).remove();
for (let index = 0; totalFiles.length > index; ++index) {
if (totalFiles[index].id === id) {
totalFiles.splice(index, 1);
break;
}
}
});
fReader.readAsDataURL(file);
};
const disableMouseEvents = () => {
overlay.css("display", "flex");
dragbox.css("border-color", "#3AA0FF");
button.css("pointer-events", "none");
addMsg.css("pointer-events", "none");
addIcon.css("pointer-events", "none");
imagesList.css("pointer-events", "none");
}
const enableMouseEvents = () => {
overlay.css("display", "none");
dragbox.css("border-color", "rgb(210, 210, 210)");
button.css("pointer-events", "initial");
addMsg.css("pointer-events", "initial");
addIcon.css("pointer-events", "initial");
imagesList.css("pointer-events", "initial");
}
button.mouseenter(function onMouseEnter(event) {
button.css("background", "#3AA0FF").css("color", "white");
}).mouseleave(function onMouseLeave() {
button.css("background", "white").css("color", "#3AA0FF");
});
button.on("click", function onClick(event) {
event.stopPropagation();
event.preventDefault();
$(self).click();
});
dragbox.on("dragenter", function onDragenter(event) {
event.stopPropagation();
event.preventDefault();
counter++;
disableMouseEvents();
});
dragbox.on("dragleave", function onDragLeave(event) {
event.stopPropagation();
event.preventDefault();
counter--;
if (counter === 0) {
enableMouseEvents();
}
});
dragbox.on("drop", function onDrop(event) {
event.stopPropagation();
event.preventDefault();
enableMouseEvents();
const files = event.originalEvent.dataTransfer.files;
retrieveFiles(files);
});
$(window).bind("resize", function(e) {
window.resizeEvt;
$(window).resize(function() {
clearTimeout(window.resizeEvt);
window.resizeEvt = setTimeout(function() {
const width = dragbox.width();
const boxesNb = Math.floor(width / 100);
const marginSize = Math.floor((width - (boxesNb * 100)) / (boxesNb + 1));
let containers = imagesList.find(".imageuploadify-container");
for (let index = 0; index < containers.length; ++index) {
$(containers[index]).css("margin-right", "0px");
$(containers[index]).css("margin-left", marginSize + "px");
}
imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+4)").css("margin-left", marginSize + "px");
imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+3)").css("margin-right", marginSize + "px");
}, 500);
});
})
$(self).on("change", function onChange() {
const files = this.files;
retrieveFiles(files);
});
$(self).closest("form").on("submit", function(event) {
event.stopPropagation();
event.preventDefault(event);
const inputs = this.querySelectorAll("input, textarea, select, button");
const formData = new FormData();
for (let index = 0; index < inputs.length; ++index) {
if (inputs[index].tagName === "SELECT" && inputs[index].hasAttribute("multiple")) {
const options = inputs[index].options;
for (let i = 0; options.length > i; ++i) {
if (options[i].selected) {
formData.append(inputs[index].getAttribute("name"), options[i].value);
}
}
} else if (!inputs[index].getAttribute("type") || ((inputs[index].getAttribute("type").toLowerCase()) !== "checkbox" && (inputs[index].getAttribute("type").toLowerCase()) !== "radio") || inputs[index].checked) {
formData.append(inputs[index].name, inputs[index].value);
} else if ($(inputs[index]).getAttribute("type") != "file") {
formData.append(inputs[index].name, inputs[index].value);
}
}
for (var i = 0; i < totalFiles.length; i++) {
formData.append(self.name, totalFiles[i].file);
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(e) {
if (xhr.status == 200 && xhr.readyState === XMLHttpRequest.DONE) {
window.location.replace(xhr.responseURL);
}
}
xhr.open("POST", $(this).attr("action"), true);
xhr.send(formData);
return false;
});
$(self).hide();
dragbox.insertAfter(this);
});
return this;
};
$.fn.imageuploadify.defaults = {};
}(jQuery, window, document));