/* jshint browser:true, jquery:true */ $(function() { var uploadInput = $('#upload-input'), uploadBtn = $('#upload-btn'), uploadFiles = $('#upload-filelist'); var btnContent = ""; if (!$.hasFileAPI()) { $('#no-file-api').show(); uploadBtn.hide(); } uploadBtn.cabinet(uploadInput); uploadBtn.on('dragenter', function(e) { if (this === e.target) { $(this).addClass('drop'); btnContent = $(this).html(); $(this).html('Drop it here~'); } }); uploadBtn.on('drop', function(e) { $(this).trigger('dragleave'); }); uploadBtn.on('dragleave', function(e) { node = e.target; do { if (node === this) { $(this).removeClass('drop'); $(this).html(btnContent); break; } } while (node = node.parentNode); }); var MAX_SIZE = (function(node) { var max = node.attr('data-max-size') || '120MiB'; var num = parseInt(/([0-9,]+).*/.exec(max)[1].replace(',', '')); var unit = /(?:([KMGTPEZY])(i)?B|([BKMGTPEZY]))/.exec(max) || ["B", "", ""]; var oneUnit = Math.pow( (unit[2] === "i" ? 1024 : 1000), 'BKMGTPEZY'.indexOf(unit[1]) ); return num * oneUnit; })(uploadInput); var createRow = function(filename, size, extra) { var rowItem = $('
  • '), rowName = $(''), rowProg = $('
    '), rowSize = $(''), rowUrl = $(''); rowItem.addClass(extra || ''); $('
    ').appendTo(rowProg); rowItem.attr('data-filename', escape(filename)); rowName.text(filename); rowSize.text(size); rowItem.append(rowName, rowProg, rowSize, rowUrl); return rowItem; }; uploadBtn.on('change', function(e) { uploadFiles.empty().removeClass('error completed'); var files = uploadInput[0].filelist; files.forEach(function(file) { createRow(file.name, file.humanSize).appendTo(uploadFiles); }); var totalRow = createRow('', files.humanSize, 'total'); totalRow.appendTo(uploadFiles); if (files.size > MAX_SIZE) { uploadFiles.addClass('error'); $('.file-name', totalRow).html('onii-chan y-your upload is t-too big…'); return; } var up = files.upload("upload.php"); var eachRow = function(files, fn) { var hits = {}; files.forEach(function(file) { ++hits[file.name] || (hits[file.name] = 0); var row = $($('li[data-filename="' + escape(file.name) + '"]')[hits[file.name] || 0]); fn.call(row, row, file, files); }); }; var totalName = $('.file-name', totalRow); up.on('uploadprogress', function(e, files) { eachRow(files, function(row, file, files) { $('.progress-inner', row).width((file.percentUploaded * 100) + '%'); }); $('.progress-inner', totalRow).width((files.percentUploaded * 100) + '%'); }); up.on('uploadcomplete', function(e) { $('.progress-inner').width('100%'); totalName.text('Grabbing URLs...'); }); up.on('load', function(e, res) { switch (e.target.status) { case 200: var res = JSON.parse(res); if (!res.success) { uploadFiles.addClass('error'); $('.file-name', totalRow).text('Something went wrong; try again later.'); break; } eachRow(res.files, function(row, file, files) { var link = $(''); link.attr('href', file.url) .attr('target', '_BLANK') .text(file.url.replace("http://", "").replace("https://", "")); $('.file-url', row).append(link); }); uploadFiles.addClass('completed'); totalName.text('Done!'); break; case 413: uploadFiles.addClass('error completed'); // Terrible work-around, but necessary since otherwise the '…' entity is left decoded totalName.html($('
    ').html('onii-chan, y-your upload is t-too big…').text()); break; default: uploadFiles.addClass('error completed'); totalName.text('Something went wrong; try again later.'); } }); up.upload(); }); });