var joomlaupdate_error_callback = dummy_error_handler; var joomlaupdate_stat_inbytes = 0; var joomlaupdate_stat_outbytes = 0; var joomlaupdate_stat_files = 0; var joomlaupdate_stat_percent = 0; var joomlaupdate_factory = null; var joomlaupdate_progress_bar = null; /** * An extremely simple error handler, dumping error messages to screen * * @param error The error message string */ function dummy_error_handler(error) { alert("ERROR:\n"+error); } /** * Performs an AJAX request and returns the parsed JSON output. * * @param data An object with the query data, e.g. a serialized form * @param successCallback A function accepting a single object parameter, called on success * @param errorCallback A function accepting a single string parameter, called on failure */ function doAjax(data, successCallback, errorCallback) { var json = JSON.stringify(data); if ( joomlaupdate_password.length > 0 ) { json = AesCtr.encrypt( json, joomlaupdate_password, 128 ); } var post_data = 'json='+encodeURIComponent(json); var structure = { onSuccess: function(msg, responseXML) { // Initialize var junk = null; var message = ""; // Get rid of junk before the data var valid_pos = msg.indexOf('###'); if ( valid_pos == -1 ) { // Valid data not found in the response msg = 'Invalid AJAX data:\n' + msg; if (joomlaupdate_error_callback != null) { joomlaupdate_error_callback(msg); } return; } else if( valid_pos != 0 ) { // Data is prefixed with junk junk = msg.substr(0, valid_pos); message = msg.substr(valid_pos); } else { message = msg; } message = message.substr(3); // Remove triple hash in the beginning // Get of rid of junk after the data var valid_pos = message.lastIndexOf('###'); message = message.substr(0, valid_pos); // Remove triple hash in the end // Decrypt if required if ( joomlaupdate_password.length > 0 ) { try { var data = JSON.parse(message); } catch(err) { message = AesCtr.decrypt(message, joomlaupdate_password, 128); } } try { var data = JSON.parse(message); } catch(err) { var msg = err.message + "\n
\n
\n" + message + "\n
"; if (joomlaupdate_error_callback != null) { joomlaupdate_error_callback(msg); } return; } // Call the callback function successCallback(data); }, onFailure: function(req) { var message = 'AJAX Loading Error: '+req.statusText; if (joomlaupdate_error_callback != null) { joomlaupdate_error_callback(msg); } } }; var ajax_object = null; structure.url = joomlaupdate_ajax_url; ajax_object = new Request(structure); ajax_object.send(post_data); } /** * Pings the update script (making sure its executable!!) * @return */ function pingUpdate() { // Reset variables joomlaupdate_stat_files = 0; joomlaupdate_stat_inbytes = 0; joomlaupdate_stat_outbytes = 0; // Do AJAX post var post = {task : 'ping'}; doAjax(post, function(data){ startUpdate(data); }); } /** * Starts the update * @return */ function startUpdate() { // Reset variables joomlaupdate_stat_files = 0; joomlaupdate_stat_inbytes = 0; joomlaupdate_stat_outbytes = 0; var post = { task : 'startRestore' }; doAjax(post, function(data){ processUpdateStep(data); }); } /** * Steps through the update * @param data * @return */ function processUpdateStep(data) { if (data.status == false) { if (joomlaupdate_error_callback != null) { joomlaupdate_error_callback(data.message); } } else { if (data.done) { joomlaupdate_factory = data.factory; window.location = joomlaupdate_return_url; } else { // Add data to variables joomlaupdate_stat_inbytes += data.bytesIn; joomlaupdate_stat_percent = (joomlaupdate_stat_inbytes * 100) / joomlaupdate_totalsize; // Create progress bar once if (joomlaupdate_progress_bar == null) { joomlaupdate_progress_bar = new Fx.ProgressBar(document.id('progress')); } joomlaupdate_progress_bar.set(joomlaupdate_stat_percent); joomlaupdate_stat_outbytes += data.bytesOut; joomlaupdate_stat_files += data.files; // Display data document.getElementById('extpercent').innerHTML = new Number(joomlaupdate_stat_percent).formatPercentage(1); document.getElementById('extbytesin').innerHTML = new Number(joomlaupdate_stat_inbytes).format(); document.getElementById('extbytesout').innerHTML = new Number(joomlaupdate_stat_outbytes).format(); document.getElementById('extfiles').innerHTML = new Number(joomlaupdate_stat_files).format(); // Do AJAX post post = { task: 'stepRestore', factory: data.factory }; doAjax(post, function(data){ processUpdateStep(data); }); } } } window.addEvent('domready', function() { pingUpdate(); var el = $$('div.joomlaupdate_spinner'); el.set('spinner', {class: 'joomlaupdate_spinner'}); el.spin(); });