function template(text, data) { var render; var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; var settings = { evaluate : /<%([\s\S]+?)%>/g, interpolate : /<%=([\s\S]+?)%>/g }; // Combine delimiters into one regular expression via alternation. var matcher = new RegExp([ (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source ].join('|') + '|$', 'g'); // Compile the template source, escaping string literals appropriately. var index = 0; var source = "__p+='"; text.replace(matcher, function(match, interpolate, evaluate, offset) { source += text.slice(index, offset) .replace(escaper, function(match) { return '\\' + escapes[match]; }); if (interpolate) { source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; } if (evaluate) { source += "';\n" + evaluate + "\n__p+='"; } index = offset + match.length; return match; }); source += "';\n"; source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + source + "return __p;\n"; try { render = new Function('obj', source); } catch (e) { e.source = source; throw e; } if (data) return render(data); var template = function(data) { return render.call(this, data); }; // Provide the compiled function source as a convenience for precompilation. template.source = 'function(obj){\n' + source + '}'; return template; } var tests = { filereader: typeof FileReader != 'undefined', dnd: 'draggable' in document.createElement('span'), formdata: !!window.FormData, progress: "upload" in new XMLHttpRequest }; var UploadTemplate = template( '
' + '' + '
' + '
' ); var oldOnReady = document.onreadystatechange; document.onreadystatechange = function() { if (document.readyState !== "complete") { return; } if (typeof oldOnReady === "function") { oldOnReady(); } if (document.title.indexOf("Attachments for ") == -1) { return; } for (key in tests) { if (tests[key] !== true) { return; } } document.getElementsByTagName("h2")[0].insertAdjacentHTML('afterend', UploadTemplate()); var holder = document.getElementById('dnd-upload'); holder.ondragover = function () { this.className = 'hover'; return false; }; holder.ondragend = function () { this.className = ''; return false; }; holder.ondrop = function (e) { this.className = ''; e.preventDefault(); readfiles(e.dataTransfer.files); } }; function createElement(tag, attributes, innerHTML) { var element = document.createElement(tag); for (key in attributes) { element.setAttribute(key, attributes[key]); } if (typeof innerHTML !== "undefined") { element.innerHTML = innerHTML; } return element; }; function postFile(file) { var size = file.size; var units = ['G', 'M', 'K', 'B']; var xhr = new XMLHttpRequest(); var formData = new FormData(); formData.append('ticket', document.getElementsByName("ticket")[0].value); formData.append('action', 'AttachFile'); formData.append('do', 'upload'); formData.append('file', file); if (document.getElementById("overwrite-check").checked) { formData.append('overwrite', '1'); } while (size >= 1024) { size = size / 1024 | 0; units.pop(); } var progress = createElement('progress', { min: 0, max: 100, value: 0 }); var progContainer = createElement('div', { "class": "progressbar" }); var sizeSpan = createElement("span", { "class": "size" }, size + units[units.length - 1]); var item = createElement('li'); progContainer.appendChild(progress); progContainer.appendChild(sizeSpan); item.appendChild(createElement('span', { "class": "filename" }, file.name)); item.appendChild(progContainer); document.getElementById("dnd-upload").appendChild(item); xhr.open('POST', window.location.pathname); xhr.onload = function() { progress.value = 100; }; xhr.upload.onprogress = function (event) { if (!event.lengthComputable) { return; } progress.value = (event.loaded / event.total * 100 | 0); } xhr.send(formData); } function readfiles(files) { for (var i = 0; i < files.length; i++) { postFile(files[i]); } }