jQuery(document).ready(function($){ $('form').submit(function(e) { e.preventDefault(); var resultWrapper, result, resultHeader, resultBody, resultContent; $('#results').append(resultWrapper = $('
') ) ) ) ); function formatText(text) { var result = ""; for(var line of text.split("\n")) { var parts = line.split("\r"); result += parts[parts.length - 1] + "\n"; } return result; } $.ajax({ 'url': $('form').attr('action'), 'method': $('form').attr('method'), 'data': (function() { var data = {}; $('form input, form select').each(function(){ data[$(this).attr('name')] = $(this).val(); }); return data; })(), 'processData': true, 'contentType': 'application/x-www-form-urlencoded; charset=UTF-8', 'xhr': function() { var xhr = new XMLHttpRequest(); xhr.addEventListener('progress', function(e) { resultContent.text(formatText(e.target.response)); }, false); return xhr; }, 'success': function(data) { resultContent.text(formatText(data)); result .removeClass('bg-warning') if(data.indexOf('exit code: 0') == -1) { result .addClass('bg-danger') .append($('').text('There was an error while processing your request!')); return; } var anyLink = false; for(regex of [ /Destination: ([^\n\r$]*)/g, / ([^ ]+) has already been downloaded and merged/g ]) { var match; while (match = regex.exec(data)) { if(anyLink) { resultBody.append($('
')); } resultBody.append($('') .addClass('btn btn-sm btn-primary') .attr('href', 'files/' + match[1]) .text(match[1]) ); anyLink = true; } } if(anyLink) { result .addClass('bg-success'); } else { result .addClass('bg-danger') .append($('').text('Did not find any downloadable file!')); } }, 'error': function(jqXHR, textStatus, errorThrown) { resultContent.text(formatText(jqXHR.responseText)); result .removeClass('alert-warning') .addClass('alert-danger') .append($('
').text('Request failed!')); }, 'complete': function() { resultHeader.prepend($('') .html('×') .addClass('float-right btn btn-sm btn-danger') .attr('href', '#') .click(function(e) { e.preventDefault(); resultWrapper.remove(); }) ) } }); $('form input').val(''); }); });