var onceOnlyGoddammit = false; var slxModules = {}; var slxTries = {}; var slxCurrent = false; var slxTimer = false; function slxRunInstall() { if (onceOnlyGoddammit) return; onceOnlyGoddammit = true; $('.install-btn').prop('disabled', true); var first = false; $('.id-col').each(function () { var id = $(this).text(); slxModules[id] = 'IDLE'; slxTries[id] = 0; if (first === false) { first = id; } }); if (first !== false) { slxRun(first); } } function makeCallback(callback, userData) { return function (firstParam) { callback(this, userData, firstParam); }; } function slxRun(moduleName) { var dest = $('#mod-' + moduleName); if (dest.length !== 1 || typeof slxModules[moduleName] === 'undefined') { alert('No such module: ' + moduleName); return; } if (slxModules[moduleName] === 'IDLE' || slxModules[moduleName] === 'UPDATE_RETRY') { if (slxTries[moduleName]++ > 3) return; slxModules[moduleName] = 'WORKING'; dest.text('Working.....'); slxCancelTimer(); slxCurrent = moduleName; $.post('install.php', {module: moduleName}, makeCallback(slxDone, moduleName), 'json') .always(makeCallback(slxTrigger, moduleName)); slxTimer = window.setTimeout(slxWatchdog, 5000); } } var slxDone = function (elem, moduleName, jsonReply) { if (!jsonReply) { jsonReply = {}; } if (!jsonReply.status) { jsonReply.status = 'UPDATE_FAILED'; jsonReply.message = 'Unknown/no status code received from server'; } var status = jsonReply.status; if (jsonReply.message) { status = status + ' (' + jsonReply.message + ')'; } slxModules[moduleName] = jsonReply.status; $('#mod-' + moduleName).text(status); if (jsonReply.status === 'UPDATE_DONE') { $('#mod-' + moduleName).css('color', '#0c0'); } if (jsonReply.status === 'UPDATE_FAILED') { $('#mod-' + moduleName).css('color', '#c00'); } if (jsonReply.status === 'UPDATE_RETRY') { $('#mod-' + moduleName).css('color', '#c50'); } } var slxTrigger = function (elem, moduleName) { //alert('always: ' + moduleName + ', status: ' + slxModules[moduleName] + ', current: ' + slxCurrent); if (slxModules[moduleName] === 'WORKING') { slxModules[moduleName] = 'UPDATE_FAILED'; $('#mod-' + moduleName).text('UPDATE_FAILED (No response from server)').css('color', '#c00'); } if (slxCurrent === moduleName) { slxCurrent = false; slxRunNext(moduleName); } } function slxRunNext(lastModule) { var next = false; var first = false; for (var key in slxModules) { if (!slxModules.hasOwnProperty(key)) continue; // if (slxTries[key] < 3 && (slxModules[key] === 'IDLE' || slxModules[key] === 'UPDATE_RETRY')) { if (next === true) { next = key; break; } if (first === false) { first = key; } } if (next === false && key === lastModule) { next = true; } } if (next === false || next === true) { next = first; } if (next !== false) { slxRun(next); } else { slxCancelTimer(); setTimeout(function() { alert('Done.'); }, 10); } } function slxCancelTimer() { if (slxTimer !== false) { window.clearTimeout(slxTimer); slxTimer = false; } } var slxWatchdog = function() { slxTimer = false; slxRunNext(slxCurrent); }