RSFormPro.Restore = { // Progress variables progressUnit: 0, progressCount: 0, currentForm : 0, formsFound: 0, overwrite: 0, currentFormId: 0, keepId: 0, key: '', requestTimeOut: { Seconds : 0, Milliseconds: function(){ return RSFormPro.Restore.requestTimeOut.Seconds * 1000; } }, parseJSON: function(data) { if (typeof data != 'object') { // parse invalid data: var match = data.match(/{.*}/); if (match) { return jQuery.parseJSON(match[0]); } else { var serverError = ''; var matchedError = data.match(/error.*/); if (matchedError) { serverError = matchedError[0].replace(/(<([^>]+)>)/ig, '').substring(0, 255); } RSFormPro.Backup.showError(Joomla.JText._('RSFP_JSON_DECODING_ERROR').replace('%s', serverError)); return false; } } return jQuery.parseJSON(data); }, // Shows an error message if something goes wrong and stops the restore process. showError: function(message) { RSFormPro.Restore.clearError(); jQuery('.progressBar').css('background', '#b94a48'); return jQuery('.progressWrapper').after('<div class="alert alert-error"><strong>' + Joomla.JText._('RSFP_ERROR') + '</strong> ' + message + '</div>'); }, addToError: function(message) { jQuery('.alert-error').append('<br/>' + message); }, clearError: function() { jQuery('.alert').remove(); }, // Shows the current status (text) of the restore progress showStatus: function(message) { jQuery('.alert-info').remove(); return jQuery('.progressWrapper').after('<div class="alert alert-info"><strong>' + Joomla.JText._('RSFP_STATUS') + '</strong> ' + message + '</div>'); }, // Show the list of forms to be restored showList: function(metadata) { // build the metadata info var backupContainer = jQuery('#backup-info-container'); backupContainer.find('#backup-rsform-pro-version').text(metadata.metaInfo.version); backupContainer.find('#backup-joomla-version').text(metadata.metaInfo.cms); backupContainer.find('#backup-php-version').text(metadata.metaInfo.php); backupContainer.find('#backup-os').text(metadata.metaInfo.os); backupContainer.find('#backup-url').text(metadata.metaInfo.url); backupContainer.find('#backup-author').text(metadata.metaInfo.author); backupContainer.find('#backup-date').text(metadata.metaInfo.date); backupContainer.show(); // build the Forms List var forms = metadata.info; var contentsContainer = jQuery('#backup-contents-container'); var table = contentsContainer.find('tbody'); for (var i = 0; i < forms.length; i++) { var tr = jQuery("<tr>"); var title = jQuery("<td>"); var statusForm = jQuery("<td>", {"class":"center text-center", "id":'form-'+forms[i].id}); var submissionsForm = jQuery("<td>", {"class":"center text-center", "id":'submissions-'+ forms[i].id}); // add the title of the form title.append(forms[i].title + ' (' + forms[i].submissions + ')'); // add the columns to the row tr.append('<td>'+(i+1)+'</td>'); tr.append(title); tr.append(statusForm); tr.append(submissionsForm); // add the table row table.append(tr); } contentsContainer.show(); }, getFormSubmissions : function(FormId) { for (var i=0; i < RSFormPro.Restore.formsFound.length; i++) { if (FormId == RSFormPro.Restore.formsFound[i].id) { return RSFormPro.Restore.formsFound[i].submissions; } } }, // Helper to parse the JSON response based on several conditions parseResponse: function(data, textStatus, jqXHR){ if (data.status == 'error') { if (data.message == 'tmp-removed') { RSFormPro.Restore.addToError(Joomla.JText._('RSFP_TMP_FOLDER_REMOVED')); } else { RSFormPro.Restore.showError(data.message); RSFormPro.Restore.sendRequest('deleteTemporaryFiles',{'onerror':1}); } } else if (data.status == 'ok') { switch (data.step) { case 'next-xml-headers': RSFormPro.Restore.sendRequest('getInfo'); RSFormPro.Restore.showStatus(Joomla.JText._('RSFP_READING_METADATA_INFORMATION')); break; case 'list-info': RSFormPro.Restore.formsFound = data.metadata.info; // set the progress bar unit RSFormPro.Restore.progressUnit = 100 / RSFormPro.Restore.formsFound.length; // parse the first form if (RSFormPro.Restore.overwrite) { RSFormPro.Restore.sendRequest('overwriteForms'); RSFormPro.Restore.showStatus(Joomla.JText._('RSFP_REMOVING_OLD_FORMS')); } else { RSFormPro.Restore.sendRequest('parseForm', {'form':data.metadata.info[0].id, 'submissions':data.metadata.info[0].submissions, 'keepid':RSFormPro.Restore.keepId}); RSFormPro.Restore.showStatus(Joomla.JText._('RSFP_RESTORING_FORM_STRUCTURE').replace('%s', data.metadata.info[0].title)); // Add loader jQuery('#form-'+data.metadata.info[0].id).append('<span class="loading-small"></span>'); // increment the form counter RSFormPro.Restore.currentForm++; } RSFormPro.Restore.showList(data.metadata); break; case 'parse-form': if (RSFormPro.Restore.overwrite && RSFormPro.Restore.currentForm == 0) { RSFormPro.Restore.sendRequest('parseForm', {'form':RSFormPro.Restore.formsFound[0].id, 'submissions':RSFormPro.Restore.formsFound[0].submissions, 'keepid':RSFormPro.Restore.keepId}); RSFormPro.Restore.showStatus(Joomla.JText._('RSFP_RESTORING_FORM_STRUCTURE').replace('%s', RSFormPro.Restore.formsFound[0].title)); // Add loader jQuery('#form-'+RSFormPro.Restore.formsFound[0].id).append('<span class="loading-small"></span>'); // increment the form counter RSFormPro.Restore.currentForm++; } else { if (RSFormPro.Restore.currentForm == RSFormPro.Restore.formsFound.length) { RSFormPro.Restore.sendRequest('deleteTemporaryFiles'); RSFormPro.Restore.showStatus(Joomla.JText._('RSFP_DELETING_TEMPORARY_FOLDER')); } else { RSFormPro.Restore.sendRequest('parseForm', {'form':RSFormPro.Restore.formsFound[RSFormPro.Restore.currentForm].id, 'submissions':RSFormPro.Restore.formsFound[RSFormPro.Restore.currentForm].submissions, 'keepid':RSFormPro.Restore.keepId}); RSFormPro.Restore.showStatus(Joomla.JText._('RSFP_RESTORING_FORM_STRUCTURE').replace('%s', RSFormPro.Restore.formsFound[RSFormPro.Restore.currentForm].title)); // Add loader jQuery('#form-'+RSFormPro.Restore.formsFound[RSFormPro.Restore.currentForm].id).append('<span class="loading-small"></span>'); // increment the form counter RSFormPro.Restore.currentForm++; } } // set the checkmark for the structure of the form if there are no submissions if (data.form) { if (RSFormPro.Restore.getFormSubmissions(data.form) == 0) { jQuery('#form-'+ data.form +' .loading-small').remove(); jQuery('#form-'+ data.form).append('<span class="icon-checkmark-circle rsform_ok"></span>'); jQuery('#submissions-'+ data.form).append('--'); // move progress bar RSFormPro.Restore.progress(); } } // set the checkmark for the form submissions if they are done if (data.finished) { jQuery('#submissions-'+ data.form +' .loading-small').remove(); jQuery('#submissions-'+ data.form).append('<span class="icon-checkmark-circle rsform_ok"></span>'); // move progress bar RSFormPro.Restore.progress(); } break; case 'parse-submissions': case 'continue-submissions': if (data.formId) { RSFormPro.Restore.currentFormId = data.formId; // set the checkmark for the structure of the form if there are submissions jQuery('#form-'+ data.form +' .loading-small').remove(); jQuery('#form-'+ data.form).append('<span class="icon-checkmark-circle rsform_ok"></span>'); // put the loader for the submissions jQuery('#submissions-'+ data.form).append('<span class="loading-small"></span>'); } RSFormPro.Restore.sendRequest('parseSubmissions', {'form':data.form, 'formId': RSFormPro.Restore.currentFormId, 'file':data.file}); RSFormPro.Restore.showStatus(Joomla.JText._('RSFP_RESTORING_FORM_SUBMISSIONS').replace('%s', RSFormPro.Restore.formsFound[(RSFormPro.Restore.currentForm - 1)].title).replace('%d', data.file + 1)); break; case 'restore-done': RSFormPro.Restore.showStatus(Joomla.JText._('RSFP_RESTORE_COMPLETE')); jQuery('#viewForms').show(); jQuery('.progressWrapper').remove(); break; } } }, // Helper - sends a task request to index.php?option=com_rsform&controller=restore and passes the response to the parseResponse() function. sendRequest: function(task, data) { if (!data) { data = {}; } data['option'] = 'com_rsform'; data['controller'] = 'restore'; data['task'] = task; data['key'] = RSFormPro.Restore.key; data['overwrite'] = RSFormPro.Restore.overwrite; if (RSFormPro.Restore.requestTimeOut.Seconds > 0 && task !== 'decompress') { setTimeout(function(){RSFormPro.Restore.ajaxRequest(data)}, RSFormPro.Restore.requestTimeOut.Milliseconds()); } else { RSFormPro.Restore.ajaxRequest(data); } }, ajaxRequest : function(data) { jQuery.ajax({ converters: { "text json": RSFormPro.Restore.parseJSON }, type: "POST", url: 'index.php?option=com_rsform', data: data, success: RSFormPro.Restore.parseResponse, dataType: 'json' }); }, // Helper function to adjust the progress by a unit. progress: function(reset) { var bar = jQuery('.progressBar'); var current = RSFormPro.Restore.progressCount += RSFormPro.Restore.progressUnit; if (reset) { current = 0; RSFormPro.Restore.progressCount = 0; } if (current > 100) { current = 100; } bar.animate({'width': current + '%'}, { 'duration': 'fast', 'step': function(now, tween) { bar.html(Math.round(now) + '%'); } }); }, // Starts the restore process start: function() { RSFormPro.Restore.sendRequest('decompress'); RSFormPro.Restore.showStatus(Joomla.JText._('RSFP_DECOMPRESSING_ARCHIVE')); }, }