User:CLT20RecordsUpdateBot/Source/CLT20RecordsUpdateBot UI.js

function setCSSProperty(element, name, value) { // Parse the style attribute var styleAttr = element.getAttribute('style'); // Prevent a missing style attribute throwing an exception if ( ! styleAttr ) { element.setAttribute('style', name + ': ' + value); return; }

var styleProperties = styleAttr.split(/\s*;\s*/); for ( var i = 0; i < styleProperties.length; i++ ) { var stylePropRegex = /^([a-z0-9\-]+)\s*\:\s*(.*)\s*$/i; var stylePropParts = stylePropRegex.exec(styleProperties[i]); styleProperties[stylePropParts[1]] = stylePropParts[2]; delete styleProperties[i]; }   styleProperties[name] = value; // Change it back to an indexed array var i = 0; for ( var propName in styleProperties ) { styleProperties[i] = propName + ': ' + styleProperties[propName]; i++; delete styleProperties[propName]; }   element.setAttribute('style', styleProperties.join('; ')); } // Show the edit failed box if the backup file exists var backupFileRequest = new XMLHttpRequest; backupFileRequest.open('GET', 'edit_failed_backup.txt', false); backupFileRequest.send; if ( backupFileRequest.status == 200 ) { setCSSProperty(document.getElementById('lasteditfailed'), 'display', 'block'); } function selectAllOptions { var checkboxes = document.getElementById('optionstable').getElementsByTagName('input'); for ( var i = 0; i < checkboxes.length; i++ ) { checkboxes[i].checked = true; } } function deselectAllOptions { var checkboxes = document.getElementById('optionstable').getElementsByTagName('input'); for ( var i = 0; i < checkboxes.length; i++ ) { checkboxes[i].checked = false; } } function submitForm { var checkboxes = document.getElementById('optionstable').getElementsByTagName('input'); var statusBox = document.getElementById('status'); var statsToUpdate = []; for ( var i = 0; i < checkboxes.length; i++ ) { if ( checkboxes[i].checked === true ) { statsToUpdate.push(checkboxes[i].getAttribute('name')) }   }    if ( statsToUpdate.length == 0 ) { alert('No stats selected to update'); return; }   // Change the status box setCSSProperty(statusBox, 'border-color', '#FFB700'); setCSSProperty(statusBox, 'background-color', '#FFFFBB'); statusBox.getElementsByTagName('td')[1].innerHTML = 'Updating... 0 of ' + statsToUpdate.length + ' completed (0 succeeded, 0 failed)'; statusBox.getElementsByTagName('td')[0].getElementsByTagName('img')[0].setAttribute('src', 'Images/Ambox_clock_yellow.svg'); // Remove any unselected checkboxes for ( var i = 0; i < checkboxes.length; i++ ) { if ( checkboxes[i].checked === false ) { setCSSProperty(checkboxes[i].parentNode.parentNode, 'display', 'none'); }   }    // Disable the form buttons for ( var i = 0; i < document.getElementById('formbuttons').getElementsByTagName('input').length; i++ ) { document.getElementById('formbuttons').getElementsByTagName('input')[i].disabled = true; }   // Hide the last edit failed box if any setCSSProperty(document.getElementById('lasteditfailed'), 'display', 'none'); // Send the request to update.php var updateXHR = new XMLHttpRequest; updateXHR.onreadystatechange = function { if ( updateXHR.readyState == 4 ) { // Run the update status function for the last time updateStatus; updateErrors; clearInterval(updateStatusInterval); // If the PHP script terminates befor the updating starts, it is most likely an error if ( statsUpdateCounters.totalCountValue == 0 ) { setCSSProperty(statusBox, 'border-color', '#FF0000'); setCSSProperty(statusBox, 'background-color', '#FF8585'); statusBox.getElementsByTagName('td')[1].innerHTML = 'Failed before update' + (updateXHR.responseText ? (' Error: ' + updateXHR.responseText) : ''); statusBox.getElementsByTagName('td')[0].getElementsByTagName('img')[0].setAttribute('src', 'Images/Crystal_128_error.svg'); }           else if ( updateXHR.responseText.charAt(0) == '#' ) {  // Edit successful var revisionIDRegex = /#(\d+)\|(\d+)/; var revisionIDs = revisionIDRegex.exec(updateXHR.responseText); setCSSProperty(statusBox, 'border-color', '#00CC00'); setCSSProperty(statusBox, 'background-color', '#85FF85'); var statusMsg = statusBox.getElementsByTagName('td')[1]; statusMsg.innerHTML = statusMsg.innerHTML.replace(/Committing edit\.\.\./, 'Edit successful (diff)'); statusBox.getElementsByTagName('td')[0].getElementsByTagName('img')[0].setAttribute('src', 'Images/Dialog-apply.svg'); }           else {  // Edit failed setCSSProperty(statusBox, 'border-color', '#FF0000'); setCSSProperty(statusBox, 'background-color', '#FF8585'); var statusMsg = statusBox.getElementsByTagName('td')[1]; statusMsg.innerHTML = statusMsg.innerHTML.replace(/Committing edit\.\.\./, 'Edit failed'); statusMsg.innerHTML += (updateXHR.responseText ? (' Error: ' + updateXHR.responseText) : ''); statusBox.getElementsByTagName('td')[0].getElementsByTagName('img')[0].setAttribute('src', 'Images/Crystal_128_error.svg'); }       }    }    updateXHR.open('GET', 'update.php?stats=' + statsToUpdate.join('|'), true); updateXHR.send; var statsUpdateCounters = { 'totalCountValue': 0, 'successCountValue': 0, 'failedCountValue': 0, set totalCount(x) { this.totalCountValue = x;           var statusMsg = statusBox.getElementsByTagName('td')[1]; statusMsg.innerHTML = statusMsg.innerHTML.replace(/\d+ (of \d+ completed)/, x + ' $1'); if ( x == statsToUpdate.length ) { statusMsg.innerHTML = statusMsg.innerHTML.replace(/Updating\.\.\. \d+ of \d+ completed \((.*?)\)/, 'All ' + x + ' updates completed ($1) Committing edit...'); }       },        set successCount(x) { this.successCountValue = x;           var statusMsg = statusBox.getElementsByTagName('td')[1]; statusMsg.innerHTML = statusMsg.innerHTML.replace(/\d+ succeeded\,/, x + ' succeeded,'); },       set failedCount(x) { this.failedCountValue = x;           var statusMsg = statusBox.getElementsByTagName('td')[1]; statusMsg.innerHTML = statusMsg.innerHTML.replace(/\d+ failed\)/, x + ' failed)'); },   }    function updateStatus { var statusXHR = new XMLHttpRequest statusXHR.open('GET', 'status.txt', false); statusXHR.send; if ( statusXHR.responseText == '' || ! (statusXHR.status == 200 || statusXHR.status == 304) ) { return; }       var statusTable = statusXHR.responseText.split('\r\n'); statusTable.pop; // Remove the last empty element caused by a trailing newline statusTable = statusTable.map(           function(value, key, array) {                return value.split('|');            }        ); statsUpdateCounters.totalCount = statusTable.length; statsUpdateCounters.successCount = statusTable.filter(           function(value, key, array) {                return value[1] == 1;            }        ).length; statsUpdateCounters.failedCount = statusTable.filter(           function(value, key, array) {                return value[1] == 0;            }        ).length; function markStatAsSuccess(name) { var statRow = document.getElementById('stats__' + name); statRow.setAttribute('class', 'success'); statRow.getElementsByTagName('td')[1].innerHTML = 'Success'; }       function markStatAsFailed(name) { var statRow = document.getElementById('stats__' + name); statRow.setAttribute('class', 'failed'); statRow.getElementsByTagName('td')[1].innerHTML = 'Failed'; }       for ( var i = 0; i < statusTable.length; i++ ) { if ( statusTable[i][1] == 0 ) { markStatAsFailed(statusTable[i][0]); }           else { markStatAsSuccess(statusTable[i][0]); }       }    }    function updateErrors { var errorsXHR = new XMLHttpRequest; errorsXHR.open('GET', 'error_log.txt', false); errorsXHR.send; if ( errorsXHR.responseText == '' || ! (errorsXHR.status == 200 || errorsXHR.status == 304) ) { return; }       var errors = errorsXHR.responseText.split('\r\n'); errors.pop; errors = errors.map(           function(value, key, array) {                return value.split('|');            }        ); var errorTable = document.getElementById('errortable'); function addErrorMessage(type, message, file, line) { var newRow = document.createElement('tr'); newRow.innerHTML = ' ' + type + ' ' + message + '  ' + file  + '  ' + line + ' '; errorTable.appendChild(newRow); }       // Clear the error table before filling it        while ( errorTable.getElementsByTagName('tr').length > 1 ) { errorTable.removeChild(errorTable.getElementsByTagName('tr')[1]); // Do not remove the header row }       for ( var i = 0; i < errors.length; i++ ) { addErrorMessage(errors[i][0], errors[i][1].replace(/&#124;/g, '|').replace(/&amp;/g, '&'), errors[i][2], errors[i][3]); }   }    var updateStatusInterval = setInterval(        function {            updateStatus;            updateErrors;        }, 5000); } function resumeEdit { setCSSProperty(document.getElementById('lasteditfailed'), 'display', 'none'); var statusBox = document.getElementById('status'); setCSSProperty(statusBox, 'border-color', '#FFB700'); setCSSProperty(statusBox, 'background-color', '#FFFFBB'); statusBox.getElementsByTagName('td')[0].getElementsByTagName('img')[0].setAttribute('src', 'Images/Ambox_clock_yellow.svg'); statusBox.getElementsByTagName('td')[1].innerHTML = 'Resuming...'; for ( var i = 0; i < document.getElementById('formbuttons').getElementsByTagName('input').length; i++ ) { document.getElementById('formbuttons').getElementsByTagName('input')[i].disabled = true; }   // Send the request var updateXHR = new XMLHttpRequest; updateXHR.onreadystatechange = function { if ( updateXHR.readyState == 4 ) { if ( updateXHR.responseText.charAt(0) == '#' ) { // Edit successful var revisionIDRegex = /#(\d+)\|(\d+)/; var revisionIDs = revisionIDRegex.exec(updateXHR.responseText); setCSSProperty(statusBox, 'border-color', '#00CC00'); setCSSProperty(statusBox, 'background-color', '#85FF85'); var statusMsg = statusBox.getElementsByTagName('td')[1]; statusMsg.innerHTML = statusMsg.innerHTML = 'Edit successful (diff)'; statusBox.getElementsByTagName('td')[0].getElementsByTagName('img')[0].setAttribute('src', 'Images/Dialog-apply.svg'); }           else {  // Edit failed setCSSProperty(statusBox, 'border-color', '#FF0000'); setCSSProperty(statusBox, 'background-color', '#FF8585'); var statusMsg = statusBox.getElementsByTagName('td')[1]; statusMsg.innerHTML = statusMsg.innerHTML = 'Edit failed' + (updateXHR.responseText ? (' Error: ' + updateXHR.responseText) : ''); statusBox.getElementsByTagName('td')[0].getElementsByTagName('img')[0].setAttribute('src', 'Images/Crystal_128_error.svg'); }       }    }    updateXHR.open('GET', 'update.php?resume=1', true); updateXHR.send; function updateErrors { var errorsXHR = new XMLHttpRequest; errorsXHR.open('GET', 'error_log.txt', false); errorsXHR.send; if ( errorsXHR.responseText == '' || ! (errorsXHR.status == 200 || errorsXHR.status == 304) ) { return; }       var errors = errorsXHR.responseText.split('\r\n'); errors.pop; errors = errors.map(           function(value, key, array) {                return value.split('|');            }        ); var errorTable = document.getElementById('errortable'); function addErrorMessage(type, message, file, line) { var newRow = document.createElement('tr'); newRow.innerHTML = ' ' + type + ' ' + message + '  ' + file  + '  ' + line + ' '; errorTable.appendChild(newRow); }       while ( errorTable.getElementsByTagName('tr').length > 1 ) { errorTable.removeChild(errorTable.getElementsByTagName('tr')[1]); // Do not remove the header row }       for ( var i = 0; i < errors.length; i++ ) { addErrorMessage(errors[i][0], errors[i][1].replace(/&#124;/g, '|').replace(/&amp;/g, '&'), errors[i][2], errors[i][3]); }

}   setInterval(        function {            updateErrors;        }, 5000 ); }