joomla_test/media/com_joomlaupdate/update.js
2020-01-02 22:20:31 +07:00

201 lines
4.8 KiB
JavaScript

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<br/>\n<pre>\n" + message + "\n</pre>";
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();
});