User:LOL/mmarecmethod.js

var mma = mma || {};

mma.getFights = function(src) {

var fights = [];

var srcLeft = src.indexOf('

');

if (srcLeft === -1) {

window.alert('Invalid page');

return;

}

var srcRight = src.indexOf('', srcLeft);

if (srcRight === -1) {

window.alert('Invalid page');

return;

}

var i = srcLeft;

while ((i = src.indexOf(' -1) {

var row = [];

var k = i;

for (var j = 0; j < 7; j++) {

k = src.indexOf('

var l = src.indexOf('>', k);

k = src.indexOf('', l);

row[j] = mma.removeTags(src.substring(l + 1, k))

.replace(/(^\s+|\s+$)/g, '');

}

fights.push({opponent: row[1], date: row[4], data: row});

}

return fights;

};

mma.recmethod = function() {

var columns = [

{name: 'Method', sherdogIndex: 2, templateIndex: 3},

{name: 'Round', sherdogIndex: 5, templateIndex: 6},

{name: 'Time', sherdogIndex: 6, templateIndex: 7}

];

for (var i in columns) {

columns[i].index = -1;

columns[i].regex = new RegExp('.+?\\b' + columns[i].name

+ '\\b');

}

var tb = document.getElementById('wpTextbox1');

var tableStart = tb.value.indexOf('\n

');

var tableEnd = tb.value.indexOf('\n

', tableStart);

if (tableStart === -1 || tableEnd === -1) {

tableStart = tb.value.indexOf('-start}}');

tableEnd = tb.value.indexOf('-end}}');

if (tableStart === -1 || tableEnd === -1) {

tableStart = tb.value.indexOf('{{MMA record start}}');

tableEnd = tb.value.indexOf('{{end}}', tableStart);

if (tableStart === -1 || tableEnd === -1) {

window.alert('Record table not found.');

} else {

for (var i in columns) {

columns[i].index = columns[i].templateIndex;

}

}

}

}

var i = tableStart;

if (columns[0].index === -1) {

// Find the lines that look like a column heading

var count = 0; // Number of cells seen in this row so far

while (i > -1) {

var i1 = tb.value.indexOf('\n|', i + 1);

var i2 = tb.value.indexOf('\n!', i + 1);

if (i1 === -1) {

i1 = tableEnd;

}

if (i2 === -1) {

i2 = tableEnd;

if (i1 === i2) {

// No more cells found in source

break;

}

}

i = Math.min(i1, i2);

if (tb.value[i + 2] === '-') {

count = 0;

} else {

for (var j = 0; j < columns.length; j++) {

if (columns[j].regex.test(tb.value.substring(i, tb.value.indexOf('\n', i + 1)))) {

columns[j].index = count;

break;

}

}

count++;

}

}

}

for (var i in columns) {

if (columns[i].index === -1) {

window.alert('"' + columns[i].name + '" column not found.');

return;

}

}

window.alert('Debug: Found Method/Round/Time at index ' + columns[0].index

+ '/' + columns[1].index + '/' + columns[2].index);

var xmlhttp;

if (window.XMLHttpRequest) {

xmlhttp = new XMLHttpRequest();

} else {

xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');

}

xmlhttp.onreadystatechange = function() {

if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {

// Get fight data from external site

var src = xmlhttp.responseText;

var fights = mma.getFights(src);

var fightIndex = 0;

var count = 0;

var i = tableStart;

while ((i = tb.value.indexOf('\n|', i + 1)) > -1 && i < tableEnd) {

if (tb.value[i + 2] === '-') {

count = 0;

} else {

for (var j = 0; j < columns.length; j++) {

if (count === columns[j].index) {

var contentStart = i + 2; // Immediately after pipe

var endLine = tb.value.indexOf('\n', i + 1);

var content = tb.value.substring(contentStart, endLine);

if (/^[^\|\[\{\n]+\|/.test(content)) {

// Evil hack for "align=center|"

contentStart = tb.value.indexOf('|',

contentStart) + 1;

content = tb.value.substring(contentStart, endLine);

}

content = content.replace(/(^\s+|\s+$)/g, '');

if (fightIndex > 0 || content.length > 0

&& !/\{\{ *[Nn]\/A *\}\}/.test(content)) {

// Ignore empty cell -- probably future fight=

if (mma.removeWikilinks(content).toLowerCase()

!== fights[fightIndex].data[columns[j]

.sherdogIndex].toLowerCase()) {

if (window.confirm('For the '

+ columns[j].name

+ ' of the bout vs. '

+ fights[fightIndex].opponent

+ ' on '

+ fights[fightIndex].date

+ ':\nChange "' + content + '" to "'

+ fights[fightIndex].data[columns[j].sherdogIndex]

+ '"?')) {

tb.value = tb.value.substring(0, contentStart)

+ ' ' + fights[fightIndex].data[columns[j].sherdogIndex]

+ tb.value.substring(endLine);

}

}

if (j + 1 === columns.length) {

fightIndex++;

}

}

break;

}

}

count++;

}

}

window.alert('MMA record method script finished.');

}

};

var url = window.prompt('Enter the URL of the fighter\'s Sherdog profile',

'http://www.sherdog.com/fighter/');

xmlhttp.open('GET', url, true);

xmlhttp.send();

};

mma.removeTags = function(s) {

return s.replace(/<[^>]+>/g, '');

};

mma.removeWikilinks = function(s) {

return s.replace(/\[\[([^\[\]\|]+)\]\]/g, '$1')

.replace(/\[\[[^\[\]\|]+\|([^\[\]\|]+)\]\]/g, '$1');

};

addOnloadHook(function() {

if (document.forms.editform) {

mw.util.addPortletLink('p-tb', 'javascript:mma.recmethod()', 'MMA record method', 't-mmarecmethod', 'Synchronize method column with Sherdog in record tables', , );

}

});