var selectedCell = '
✖
'
+ ''
+ 'Spoiler
';
var selectedFiles = [];
var selectedDiv;
var selectedDivQr;
function addSelectedFile(file) {
// console.log('upload:::addSelectedFile - file', file)
var cell = document.createElement('div');
cell.setAttribute('class', 'selectedCell');
cell.innerHTML = selectedCell;
var nameLabel = cell.getElementsByClassName('nameLabel')[0];
nameLabel.innerHTML = file.name;
var removeButton = cell.getElementsByClassName('removeButton')[0];
removeButton.onclick = function() {
var index = selectedFiles.indexOf(file);
// consider this optimization
//selectedDiv.removeChild(cell);
selectedDiv.removeChild(selectedDiv.childNodes[index]);
if(selectedDivQr){
selectedDivQr.removeChild(selectedDivQr.childNodes[index]);
}
selectedFiles.splice(selectedFiles.indexOf(file), 1);
};
selectedFiles.push(file);
if(selectedDivQr){
var clonedCell = cell.cloneNode(true);
clonedCell.getElementsByClassName('removeButton')[0].onclick = removeButton.onclick;
selectedDivQr.appendChild(clonedCell);
}
selectedDiv.appendChild(cell);
}
function clearSelectedFiles() {
selectedFiles = [];
while (selectedDiv.firstChild) {
selectedDiv.removeChild(selectedDiv.firstChild);
}
if(selectedDivQr) {
while (selectedDivQr.firstChild) {
selectedDivQr.removeChild(selectedDivQr.firstChild);
}
}
}
function setDragAndDrop(qr) {
var fileInput = document.getElementById('files')
if(!qr){
fileInput.style.display = 'none';
document.getElementById('dragAndDropDiv').style.display = 'block';
}
var drop = document.getElementById(qr ? 'dropzoneQr'
: 'dropzone');
drop.onclick = function() {
fileInput.click();
};
var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
if (iOS) {
console.log('iOS detected, enabling workaround')
var lastFileCount = 0
setInterval(function() {
// console.log('scanning for file selection', fileInput.files.length, 'files')
if (fileInput.files.length > lastFileCount) {
console.log('detected new file')
for (var i = 0; i < fileInput.files.length; i++) {
addSelectedFile(fileInput.files[i]);
}
}
lastFileCount = fileInput.files.length
}, 1000)
} else {
fileInput.onchange = function() {
for (var i = 0; i < fileInput.files.length; i++) {
addSelectedFile(fileInput.files[i]);
}
// what's this about?
fileInput.type = "text";
fileInput.type = "file";
};
}
if(!qr){
selectedDiv = document.getElementById('selectedDiv');
} else {
selectedDivQr = document.getElementById('selectedDivQr');
}
drop.addEventListener('dragover', function handleDragOver(event) {
event.stopPropagation();
event.preventDefault();
event.dataTransfer.dropEffect = 'copy';
}, false);
drop.addEventListener('drop', function handleFileSelect(evt) {
evt.stopPropagation();
evt.preventDefault();
for (var i = 0; i < evt.dataTransfer.files.length; i++) {
addSelectedFile(evt.dataTransfer.files[i])
}
}, false);
}
function checkExistance(file, callback) {
// console.log('upload:::checkExistance - file', file)
var reader = new FileReader();
reader.onloadend = function(e) {
var mime = file.type;
var md5 = SparkMD5.ArrayBuffer.hash(reader.result);
var identifier = md5 + '-' + mime.replace('/', '');
localRequest('/checkFileIdentifier.js?identifier=' + identifier,
function requested(error, response) {
if (error) {
console.log(error);
callback();
} else {
var exists = JSON.parse(response);
if (exists) {
callback(md5, mime);
} else {
callback(null, reader.result);
}
}
});
};
reader.readAsArrayBuffer(file);
}
function getFilestToUpload(callback, currentIndex, files) {
// console.log('upload:::getFilestToUpload - files', files, 'currentIndex', currentIndex)
currentIndex = currentIndex || 0;
files = files || [];
// console.log('upload:::getFilestToUpload - files', files.length, 'currentIndex', currentIndex)
if (currentIndex < selectedFiles.length) {
var spoiled = selectedDiv.getElementsByClassName('spoilerCheckBox')[currentIndex].checked;
var file = selectedFiles[currentIndex];
checkExistance(file, function checked(md5, mime) {
if (md5) {
files.push({
name : selectedFiles[currentIndex].name,
spoiler : spoiled,
md5 : md5,
mime : mime
});
getFilestToUpload(callback, ++currentIndex, files)
} else {
// the c version is going to be faster than JS
var reader = new FileReader();
reader.onloadend = function(e) {
files.push({
name : selectedFiles[currentIndex].name,
content : reader.result,
spoiler : spoiled
});
getFilestToUpload(callback, ++currentIndex, files)
};
reader.readAsDataURL(selectedFiles[currentIndex]);
}
});
} else {
callback(files);
}
}