User:Beetstra/Gadget-Spam-blacklist-Handler.js

/** * Support for quick handling of reports on User:XLinkBot/RevertList/MediaWiki talk:Spam blacklist/MediaWiki talk:Spam whitelist and in the WikiProject Spam/Local/ -tree at en.wikipedia. * See m:User:Erwin/SBHandler for more information. * Tested in Firefox/Chrome. * * Author: m:User:Erwin, October 2008 - February 2009 * License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0) * * Version history: * * - This tool uses code from DelReqHandler at Commons. *  Author: Commons:User:Lupo, October 2007 - January 2008 *  License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0) * * - Script adapted to account for change in section edit links -- m:user:billinghurst 2013-05 * * - User sDrewth reported the script is broken. -- 2013-11-27 * * - Cleaned up to pass JSHint, and migratedB use of (now deprecated) legacy wikibits tof *  jQuery and newer MediaWiki core built-in javascript libraries. --Krinkle 2013-11-28 * * - ported to en.wikipedia, adapted which pages to handle  --Beetstra 2015-04-25 */ /*jshint unused:true, eqnull:true, browser:true, white:true, indent:4 */ /*global mw, $ */ /*global BLHandlerAddComment, BLHandlerRemComment, BLHandlerCloseComment, BLHandlerRevComment, BLHandlerDecComment */ // (function {    // Guard against double inclusions    if (typeof window.BLHandler !== 'undefined') {        return;    }

var conf = mw.config.get([       'wgUserGroups',        'wgPageName',        'wgServer',        'wgScriptPath',        'wgUserName'    ]);

if ((conf.wgPageName.substr(0, 33) !== 'Wikipedia:WikiProject_Spam/Local/') && (conf.wgPageName !== 'User_talk:XLinkBot/RevertList') && (conf.wgPageName !== 'Wikipedia_talk:WikiProject_Spam') && (conf.wgPageName !== 'MediaWiki_talk:Spam-blacklist') && (conf.wgPageName !== 'Special:SpamBlackList')) { return; }

var action, fakesource, urls, params, logtitle, tprevid, log_text, summary;

var BLrequest; var BLdebug;

var BLlist; var BLlog;

var BLUtils = { // userIsInGroup (from Commons:MediaWiki:Utilities.js) UserIsInGroup: function (group) { if (conf.wgUserGroups) { if (!group || group.length === 0) { group = '*'; }               for (var i = 0; i < conf.wgUserGroups.length; i++) { if (conf.wgUserGroups[i] === group) { return true; }               }            }            return false; },

// setEditSummary (from Commons:MediaWiki:Utilities.js) setEditSummary: function (text) { if (document.editform == null || document.editform.wpSummary == null) { return; }           var summary = document.editform.wpSummary.value; if (summary == null || summary.length === 0) { document.editform.wpSummary.value = text; } else if (summary.substr(-3) === '*/ ' || summary.substr(-2) === '*/') { document.editform.wpSummary.value += text; } else { document.editform.wpSummary.value += '; ' + text; }       },

// makeRawLink (from Commons:MediaWiki:Utilities.js) makeRawLink: function (name, url, target) { var link = document.createElement('a'); link.setAttribute('href', url); if (target) { link.setAttribute('target', target); }           link.appendChild(document.createTextNode(name)); return link; },

// The following function is defined in several places, and unfortunately, it is defined // wrongly in some places. (For instance, in en:User:Lupin/popups.js: it should use       // decodeURIComponent, not decodeURI!!!) Make sure we've got the right version here: getParamValue: function (paramName) { var cmdRe = new RegExp('[&?]' + paramName + '=([^&]*)'); var m = cmdRe.exec(document.location.href); if (m) { try { return decodeURIComponent(m[1]); } catch (someError) {} }           return null; }   };

/**** Enable the whole shebang only for sysops and stewards. */   var BLHandler; if (BLUtils.UserIsInGroup('sysop') || BLUtils.UserIsInGroup('steward')) {

BLHandler = {

/*--           User:XLinkBot/RevertList requests closing: add "[add]", "[remove]", "[reverted]" and "[decline]" links to            the left of the section edit links of a request. --*/

rl_close_add: 'rl_close_add', rl_close_rem: 'rl_close_rem', rrl_close_add: 'rrl_close_add', rrl_close_rem: 'rrl_close_rem', rl_close_na: 'rl_close_na', rl_close_rev: 'rl_close_rev', rl_close_dec: 'rl_close_dec', rl_add: 'addRL', rl_rem: 'remRL', rrl_add: 'addRefRL', rrl_rem: 'remRefRL', bl_close_add: 'bl_close_add', bl_close_rem: 'bl_close_rem', bl_close_na: 'bl_close_na', bl_close_rev: 'bl_close_rev', bl_close_dec: 'bl_close_dec', bl_deferwhite_dec: 'bl_deferwhite_dec', bl_stale_dec: 'bl_stale_dec', bl_NR_dec: 'bl_NR_dec', bl_BFR_dec: 'bl_BFR_dec', bl_meta_add: 'bl_meta_add', bl_meta_done: 'bl_meta_done', bl_meta_rem: 'bl_meta_rem', bl_add: 'addBL', bl_rem: 'remBL', bl_ublock_dec: 'UBlock',

BLcloseRequestLinks: function { function addRequestLinks(name, href, before, parent) { parent.insertBefore(document.createTextNode('['), before); parent.insertBefore(BLUtils.makeRawLink(name, href), before); parent.insertBefore(document.createTextNode(']'), before); }

var param = BLUtils.getParamValue('fakeaction'); fakesource = BLUtils.getParamValue('fakesource'); var wpAction = BLUtils.getParamValue('action'); var edit_lks, anchors, ignore; var anchor, href, orig_bracket, title, lk_name1, lk_action1, lk_action2; if (param == null) { if (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/') { edit_lks = $('span.mw-editsection').toArray; if (edit_lks.length === 0) { return; }                       i = edit_lks.length - 1; anchors = edit_lks[i].getElementsByTagName('a'); if (anchors != null && anchors.length > 0) { anchor = anchors[0]; href  = anchor.getAttribute('href'); if (href.indexOf('&section=') > 0) { orig_bracket = edit_lks[i].firstChild; addRequestLinks('close', href + '&fakesource=localreport&fakeaction=' + BLHandler.bl_close_na, orig_bracket, edit_lks[i]); addRequestLinks('reverted', href + '&fakesource=localreport&fakeaction=' + BLHandler.bl_close_rev, orig_bracket, edit_lks[i]); addRequestLinks('add BL', href + '&fakesource=localreport&fakeaction=' + BLHandler.bl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('add RL', href + '&fakesource=localreport&fakeaction=' + BLHandler.rl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('add RefRL', href + '&fakesource=localreport&fakeaction=' + BLHandler.rrl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('defer meta', href + '&fakesource=localreport&fakeaction=' + BLHandler.bl_meta_add, orig_bracket, edit_lks[i]); addRequestLinks('meta done', href + '&fakesource=localreport&fakeaction=' + BLHandler.bl_meta_done, orig_bracket, edit_lks[i]); }                       }                    } else if (conf.wgPageName === 'User_talk:XLinkBot/RevertList') { // We're on User_talk:XLinkBot/RevertList edit_lks = $('span.mw-editsection').toArray; if (edit_lks.length === 0) { return; }                       for (i = 0; i < edit_lks.length; i++) { // Set to true if the addition or removal section is found ignore = false; // Find the A within: anchors = edit_lks[i].getElementsByTagName('a'); if (anchors != null && anchors.length > 0) { anchor = anchors[0]; href = anchor.getAttribute('href'); title = anchor.getAttribute('title'); if (title.indexOf('additions') > 0 ) { ignore = true; lk_name1 = 'add RL'; } else if (title.indexOf('removals') > 0) { ignore = true; lk_name1 = 'rem RL'; } else if (title.indexOf('problems') > 0) { lk_name1 = null; lk_action1 = null; }                               if (href.indexOf('User_talk:XLinkBot/RevertList') > 0 && href.indexOf('&section=') > 0 && lk_name1 != null && !ignore) { orig_bracket = edit_lks[i].firstChild; if (lk_name1 == 'add RL') { addRequestLinks('add RL', href + '&fakesource=revertlist&fakeaction=' + BLHandler.rl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('add RefRL', href + '&fakesource=revertlist&fakeaction=' + BLHandler.rrl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('add BL', href + '&fakesource=revertlist&fakeaction=' + BLHandler.bl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('decline', href + '&fakesource=revertlist&fakeaction=' + BLHandler.bl_close_dec, orig_bracket, edit_lks[i]); addRequestLinks('decline', href + '&fakesource=revertlist&fakeaction=' + BLHandler.bl_ublock_dec, orig_bracket, edit_lks[i]); addRequestLinks('NR', href + '&fakesource=revertlist&fakeaction=' + BLHandler.bl_NR_dec, orig_bracket, edit_lks[i]); addRequestLinks('stale', href + '&fakesource=revertlist&fakeaction=' + BLHandler.bl_stale_dec, orig_bracket, edit_lks[i]); }									if (lk_name1 == 'rem RL') { addRequestLinks('rem RL', href + '&fakesource=revertlist&fakeaction=' + BLHandler.rl_close_rem, orig_bracket, edit_lks[i]); addRequestLinks('rem RefRL', href + '&fakesource=revertlist&fakeaction=' + BLHandler.rrl_close_rem, orig_bracket, edit_lks[i]); addRequestLinks('bad faith', href + '&fakesource=revertlist&fakeaction=' + BLHandler.bl_BFR_dec, orig_bracket, edit_lks[i]); addRequestLinks('decline', href + '&fakesource=revertlist&fakeaction=' + BLHandler.bl_close_dec, orig_bracket, edit_lks[i]); addRequestLinks('NR', href + '&fakesource=revertlist&fakeaction=' + BLHandler.bl_NR_dec, orig_bracket, edit_lks[i]); addRequestLinks('stale', href + '&fakesource=revertlist&fakeaction=' + BLHandler.bl_stale_dec, orig_bracket, edit_lks[i]); }                               }                            }                        }                    } else if (conf.wgPageName === 'MediaWiki_talk:Spam-blacklist') { // We're on MediaWiki_talk:Spam-blacklist edit_lks = $('span.mw-editsection').toArray; if (edit_lks.length === 0) { return; }                       for (i = 0; i < edit_lks.length; i++) { // Set to true if the addition or removal section is found ignore = false; // Find the A within: anchors = edit_lks[i].getElementsByTagName('a'); if (anchors != null && anchors.length > 0) { anchor = anchors[0]; href = anchor.getAttribute('href'); title = anchor.getAttribute('title'); if (title.indexOf('additions') > 0 ) { ignore = true; lk_name1 = 'add BL'; } else if (title.indexOf('removals') > 0) { ignore = true; lk_name1 = 'rem BL'; } else if (title.indexOf('Instructions') > 0) { lk_name1 = null; lk_action1 = null; }                               if (href.indexOf('MediaWiki_talk:Spam-blacklist') > 0 && href.indexOf('&section=') > 0 && lk_name1 != null && !ignore) { orig_bracket = edit_lks[i].firstChild; if (lk_name1 == 'add BL') { addRequestLinks('add BL', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('add RL', href + '&fakesource=blacklist&fakeaction=' + BLHandler.rl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('add RefRL', href + '&fakesource=blacklist&fakeaction=' + BLHandler.rrl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('defer meta', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_meta_add, orig_bracket, edit_lks[i]); addRequestLinks('decline', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_close_dec, orig_bracket, edit_lks[i]); addRequestLinks('user block', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_ublock_dec, orig_bracket, edit_lks[i]); addRequestLinks('NR', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_NR_dec, orig_bracket, edit_lks[i]); addRequestLinks('stale', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_stale_dec, orig_bracket, edit_lks[i]); addRequestLinks('meta done', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_meta_done, orig_bracket, edit_lks[i]); }                                    if (lk_name1 == 'rem BL') { addRequestLinks('rem BL', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_close_rem, orig_bracket, edit_lks[i]); addRequestLinks('deferwhite', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_deferwhite_dec, orig_bracket, edit_lks[i]); addRequestLinks('defer meta', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_meta_rem, orig_bracket, edit_lks[i]); addRequestLinks('decline', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_close_dec, orig_bracket, edit_lks[i]); addRequestLinks('bad faith', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_BFR_dec, orig_bracket, edit_lks[i]); addRequestLinks('NR', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_NR_dec, orig_bracket, edit_lks[i]); addRequestLinks('stale', href + '&fakesource=blacklist&fakeaction=' + BLHandler.bl_stale_dec, orig_bracket, edit_lks[i]); }                               }                            }                        }                    } else if (conf.wgPageName === 'Wikipedia_talk:WikiProject_Spam') { // We're on Wikipedia_talk:WikiProject_Spam edit_lks = $('span.mw-editsection').toArray; if (edit_lks.length === 0) { return; }                       for (i = 0; i < edit_lks.length; i++) { // Set to true if the addition or removal section is found ignore = false; // Find the A within: anchors = edit_lks[i].getElementsByTagName('a'); if (anchors != null && anchors.length > 0) { anchor = anchors[0]; lk_name1 = 'add BL'; href = anchor.getAttribute('href'); title = anchor.getAttribute('title'); if (href.indexOf('Wikipedia_talk:WikiProject_Spam') > 0 && href.indexOf('&section=') > 0 && lk_name1 != null && !ignore) { orig_bracket = edit_lks[i].firstChild; addRequestLinks('add BL', href + '&fakesource=wpspam&fakeaction=' + BLHandler.bl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('add RL', href + '&fakesource=wpspam&fakeaction=' + BLHandler.rl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('add RefRL', href + '&fakesource=wpspam&fakeaction=' + BLHandler.rrl_close_add, orig_bracket, edit_lks[i]); addRequestLinks('defer meta', href + '&fakesource=wpspam&fakeaction=' + BLHandler.bl_meta_add, orig_bracket, edit_lks[i]); addRequestLinks('user blocked', href + '&fakesource=wpspam&fakeaction=' + BLHandler.bl_ublock_dec, orig_bracket, edit_lks[i]); addRequestLinks('meta done', href + '&fakesource=wpspam&fakeaction=' + BLHandler.bl_meta_done, orig_bracket, edit_lks[i]); }                           }                        }                    }

} else if (param != null) { // We're on a request page var summary = null; action = null; var $textbox = $( '#wpTextbox1' ); var text = $textbox.textSelection( 'getContents'); urls = []; var i, m, url; var append;

//Only do anything if we're editing a section. if (document.getElementsByName('wpSection') == null) { return; }

// Get URLs text = text.replace(/([Ll]ink[Ss]ummary[Ll]ive|[Ll]ink\s[Ss]ummary\s[Ll]ive)/g,'LinkSummary'); if (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/') { url = conf.wgPageName.substr(33); urls.push('\\b' + url.replace(/\./g, '\\.') + '\\b'); BLrequest = conf.wgPageName;

// Close report if (param == BLHandler.rl_close_add || param == BLHandler.bl_close_add ) { //FIXME: use regex? text = text.replace("open}}", "added}}"); text = text.replace("Open}}", "added}}"); text = text.replace("stale}}", "added}}"); text = text.replace("Stale}}", "added}}"); text = text.replace("closed}}", "added}}"); text = text.replace("Closed}}", "added}}"); text = text.replace("close}}", "added}}"); text = text.replace("Close}}", "added}}"); } else if (param == BLHandler.bl_close_na || param == BLHandler.bl_close_rev || param == BLHandler.bl_meta_add || param == BLHandler.bl_meta_done) { text = text.replace("open}}", "closed}}"); text = text.replace("Open}}", "closed}}"); text = text.replace("stale}}", "closed}}"); text = text.replace("Stale}}", "closed}}"); }                   } else if (conf.wgPageName == 'User_talk:XLinkBot/RevertList') { var reurl = /\{\{([Bb][Ll][Rr]equest[Rr]egex)\|(.*?)\}\}/g; m = text.match(reurl); if (m != null) { for (i = 0; i < m.length; i++) { url = m[i].substr(m[i].indexOf('|') + 1, m[i].length - m[i].indexOf('|') - 3); // Can't simply refer to the group url = url.replace(/^regex\=/,''); urls.push(url); }                       } else { reurl = /\{\{([Bb][Ll][Rr]equest[Ll]ink)\|(.*?)\}\}/g; m = text.match(reurl); if (m != null) { for (i = 0; i < m.length; i++) { url = m[i].substr(m[i].indexOf('|') + 1, m[i].length - m[i].indexOf('|') - 3); // Can't simply refer to the group url = url.replace(/^link\=/,''); url = url.replace(/^http:\/\/\:/,''); url = url.replace(/\s/g, ''); url = url.replace(/\&/g, '\\&'); url = url.replace(/\//g,'\\/'); url = url.replace(/\?/g,'\\?'); url = '\\b' + url.replace(/\./g, '\\.') + '\\b' url = url.replace(/\\\/\\b/g,'\\/'); url = url.replace(/\$\\b/,'$'); urls.push(url); }                       	} else { reurl = /\{\{([Ll]ink[Ss]ummary|[Xx][Ww]iki[Ss]ummary|[Ll]ink[Ss]ummary[Ll]ive|[Xx][Ww]iki\s[Ss]ummary|[Ll]ink\s[Ss]ummary\s[Ll]ive|[Ll]ink[Tt]rack|[Ll]ink\s[Tt]rack|[Ll]ink\s[Ss]ummary|[Ss]pam[Ll]ink)\|(.*?)\}\}/g; m = text.match(reurl); if (m != null) { for (i = 0; i < m.length; i++) { url = m[i].substr(m[i].indexOf('|') + 1, m[i].length - m[i].indexOf('|') - 3); // Can't simply refer to the group urls.push('\\b' + url.replace(/\./g, '\\.') + '\\b'); }       	                	}                        	}                        }        	                                        BLrequest = text.match(/^\=.*?\=$/m); if (BLrequest && BLrequest.length > 0) { BLrequest = BLrequest[0].substr(2, BLrequest[0].length - 4);  // User_talk:XLinkBot/RevertList uses level 2 ('== sectionname ==') BLrequest2 = BLrequest.match(/^\=.*?\=$/m); if (BLrequest2 && BLrequest2.length > 0) { BLrequest = BLrequest.substr(1, BLrequest.length - 2);  // User_talk:XLinkBot/RevertList uses level 2 ('== sectionname ==') }                           if (BLrequest.substr(0,1) == ' ') { BLrequest = BLrequest.substr(1, 256); // try to strip initial space }                           if (BLrequest.substr(0,1) == ' ') { BLrequest = BLrequest.substr(1, 256); // try to strip initial space }                           if (BLrequest.substr(0,1) == ' ') { BLrequest = BLrequest.substr(1, 256); // try to strip initial space }              	        } else { BLrequest = ''; }

if (urls ===  && BLrequest !== ) { m = BLrequest.match(/(?:www\.|)[^\s]*?\.[a-zA-Z]{2,3}/g); for (i = 0; i < m.length; i++) { if (m[i].substr(0, 4) === 'www.') { urls.push('\\b' + m[i].substr(4).replace(/\./g, '\\.') + '\\b'); } else { urls.push('\\b' + m[i].replace(/\./g, '\\.') + '\\b'); }                           }                        }                    } else if (conf.wgPageName == 'MediaWiki_talk:Spam-blacklist') { var reurl = /\{\{([Bb][Ll][Rr]equest[Rr]egex)\|(.*?)\}\}/g; m = text.match(reurl); if (m != null) { for (i = 0; i < m.length; i++) { url = m[i].substr(m[i].indexOf('|') + 1, m[i].length - m[i].indexOf('|') - 3); // Can't simply refer to the group url = url.replace(/^regex\=/,''); urls.push(url); }                       } else { reurl = /\{\{([Bb][Ll][Rr]equest[Ll]ink)\|(.*?)\}\}/g; m = text.match(reurl); if (m != null) { for (i = 0; i < m.length; i++) { url = m[i].substr(m[i].indexOf('|') + 1, m[i].length - m[i].indexOf('|') - 3); // Can't simply refer to the group url = url.replace(/^link\=/,''); url = url.replace(/^http:\/\/\:/,''); url = url.replace(/\s/g, ''); url = url.replace(/\&/g, '\\&'); url = url.replace(/\//g,'\\/'); url = url.replace(/\?/g,'\\?'); url = '\\b' + url.replace(/\./g, '\\.') + '\\b' url = url.replace(/\\\/\\b/g,'\\/'); url = url.replace(/\$\\b/,'$'); urls.push(url); }                       	} else { reurl = /\{\{([Ll]ink[Ss]ummary|[Xx][Ww]iki[Ss]ummary|[Ll]ink[Ss]ummary[Ll]ive|[Xx][Ww]iki\s[Ss]ummary|[Ll]ink\s[Ss]ummary\s[Ll]ive|[Ll]ink[Tt]rack|[Ll]ink\s[Tt]rack|[Ll]ink\s[Ss]ummary|[Ss]pam[Ll]ink)\|(.*?)\}\}/g; m = text.match(reurl); if (m != null) { for (i = 0; i < m.length; i++) { url = m[i].substr(m[i].indexOf('|') + 1, m[i].length - m[i].indexOf('|') - 3); // Can't simply refer to the group urls.push('\\b' + url.replace(/\./g, '\\.') + '\\b'); }       	                	}                        	}                        }                        BLrequest = text.match(/^\=.*?\=$/m); if (BLrequest && BLrequest.length > 0) { BLrequest = BLrequest[0].substr(2, BLrequest[0].length - 4); // MediaWiki_talk:Spam-blacklist uses level 2 ('== sectionname ==') BLrequest2 = BLrequest.match(/^\=.*?\=$/m); if (BLrequest2 && BLrequest2.length >0) { BLrequest = BLrequest.substr(1, BLrequest.length - 2);  // User_talk:XLinkBot/RevertList uses level 2 ('== sectionname ==') }                           if (BLrequest.substr(0,1) == ' ') { BLrequest = BLrequest.substr(1, 256); // try to strip initial space }                           if (BLrequest.substr(0,1) == ' ') { BLrequest = BLrequest.substr(1, 256); // try to strip initial space }                           if (BLrequest.substr(0,1) == ' ') { BLrequest = BLrequest.substr(1, 256); // try to strip initial space }                       } else { BLrequest = ''; }

if (urls ===  && BLrequest !== ) { m = BLrequest.match(/(?:www\.|)[^\s]*?\.[a-zA-Z]{2,3}/g); for (i = 0; i < m.length; i++) { if (m[i].substr(0, 4) === 'www.') { urls.push('\\b' + m[i].substr(4).replace(/\./g, '\\.') + '\\b'); } else { urls.push('\\b' + m[i].replace(/\./g, '\\.') + '\\b'); }                           }                        }                    } else if (conf.wgPageName == 'Wikipedia_talk:WikiProject_Spam') { var reurl = /\{\{([Bb][Ll][Rr]equest[Rr]egex)\|(.*?)\}\}/g; m = text.match(reurl); if (m != null) { for (i = 0; i < m.length; i++) { url = m[i].substr(m[i].indexOf('|') + 1, m[i].length - m[i].indexOf('|') - 3); // Can't simply refer to the group url = url.replace(/^regex\=/,''); urls.push(url); }                       } else { reurl = /\{\{([Bb][Ll][Rr]equest[Ll]ink)\|(.*?)\}\}/g; m = text.match(reurl); if (m != null) { for (i = 0; i < m.length; i++) { url = m[i].substr(m[i].indexOf('|') + 1, m[i].length - m[i].indexOf('|') - 3); // Can't simply refer to the group url = url.replace(/^link\=/,''); url = url.replace(/^http:\/\/\:/,''); url = url.replace(/\s/g, ''); url = url.replace(/\&/g, '\\&'); url = url.replace(/\//g,'\\/'); url = url.replace(/\?/g,'\\?'); url = '\\b' + url.replace(/\./g, '\\.') + '\\b' url = url.replace(/\\\/\\b/g,'\\/'); url = url.replace(/\$\\b/,'$'); urls.push(url); }                       	} else { reurl = /\{\{([Ll]ink[Ss]ummary|[Xx][Ww]iki[Ss]ummary|[Ll]ink[Ss]ummary[Ll]ive|[Xx][Ww]iki\s[Ss]ummary|[Ll]ink\s[Ss]ummary\s[Ll]ive|[Ll]ink[Tt]rack|[Ll]ink\s[Tt]rack|[Ll]ink\s[Ss]ummary|[Ss]pam[Ll]ink)\|(.*?)\}\}/g; m = text.match(reurl); if (m != null) { for (i = 0; i < m.length; i++) { url = m[i].substr(m[i].indexOf('|') + 1, m[i].length - m[i].indexOf('|') - 3); // Can't simply refer to the group urls.push('\\b' + url.replace(/\./g, '\\.') + '\\b'); }       	                	}                        	}                        }        	                                        BLrequest = text.match(/^\=.*?\=$/m);   ////// help BL                        if (BLrequest && BLrequest.length > 0) {  ////// help BL                            BLrequest = BLrequest[0].substr(2, BLrequest[0].length - 4);   // Wikipedia_talk:WikiProject_Spam uses level 2 ('== sectionname ==') BLrequest2 = BLrequest.match(/^\=.*?\=$/m); if (BLrequest2 && BLrequest2.length >0) { BLrequest = BLrequest.substr(1, BLrequest.length - 2);  // User_talk:XLinkBot/RevertList uses level 2 ('== sectionname ==') }                           if (BLrequest.substr(0,1) == ' ') { BLrequest = BLrequest.substr(1, 256); // try to strip initial space }                           if (BLrequest.substr(0,1) == ' ') { BLrequest = BLrequest.substr(1, 256); // try to strip initial space }                           if (BLrequest.substr(0,1) == ' ') { BLrequest = BLrequest.substr(1, 256); // try to strip initial space }                       } else { BLrequest = '';   ////// help BL                        }

if (urls ===  && BLrequest !== ) { m = BLrequest.match(/(?:www\.|)[^\s]*?\.[a-zA-Z]{2,3}/g);   ////// help BL                            for (i = 0; i < m.length; i++) { if (m[i].substr(0, 4) === 'www.') { urls.push('\\b' + m[i].substr(4).replace(/\./g, '\\.') + '\\b'); } else { urls.push('\\b' + m[i].replace(/\./g, '\\.') + '\\b'); }                           }                        }                    }

var copyWarn = document.getElementById('editpage-copywarn'); copyWarn.innerHTML = copyWarn.innerHTML + ' BLHandler \n '; BLdebug = document.getElementById('BLdebug'); if (param == BLHandler.rl_close_add) { summary = "Added to RevertList (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if (signeduser == null) { append = (typeof BLHandlerAddComment !== 'undefined' ? BLHandlerAddComment : ': to User:XLinkBot/RevertList. --~'); } else { append = (typeof BLHandlerAddComment !== 'undefined' ? BLHandlerAddComment : ': to User:XLinkBot/RevertList. --~'); }                       action = BLHandler.rl_add; } else if (param == BLHandler.rl_close_rem) { summary = "Removed from RevertList (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if (signeduser == null) { append = (typeof BLHandlerRemComment !== 'undefined' ? BLHandlerRemComment : ': from User:XLinkBot/RevertList. --~'); } else { append = (typeof BLHandlerRemComment !== 'undefined' ? BLHandlerRemComment : ': from User:XLinkBot/RevertList. --~'); }                       action = BLHandler.rl_rem; } else if (param == BLHandler.rrl_close_add) { summary = "Added to RevertReferencesList (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if (signeduser == null) { append = (typeof BLHandlerAddComment !== 'undefined' ? BLHandlerAddComment : ': to User:XLinkBot/RevertReferencesList. --~'); } else { append = (typeof BLHandlerAddComment !== 'undefined' ? BLHandlerAddComment : ': to User:XLinkBot/RevertReferencesList. --~'); }                       action = BLHandler.rrl_add; } else if (param == BLHandler.rrl_close_rem) { summary = "Removed from RevertReferencesList (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if (signeduser == null) { append = (typeof BLHandlerRemComment !== 'undefined' ? BLHandlerRemComment : ': from User:XLinkBot/RevertReferencesList. --~'); } else { append = (typeof BLHandlerRemComment !== 'undefined' ? BLHandlerRemComment : ': from User:XLinkBot/RevertReferencesList. --~'); }                       action = BLHandler.rrl_rem; } else if (param == BLHandler.bl_stale_dec) { summary = "Marked stale (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':. --~'); } else { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ': . --~'); }                   } else if (param == BLHandler.bl_meta_add) { summary = "Defer to meta (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':, cross-wiki problem. --~'); } else { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':, cross-wiki problem. --~'); }                   } else if (param == BLHandler.bl_meta_done) { summary = "Handled on meta (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':Handled on meta. --~'); } else { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ': Handled on meta. --~'); }                   } else if (param == BLHandler.bl_meta_rem) { summary = "Defer to meta (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':Not blacklisted locally, to request global removal, or  to ask for local whitelisting of specific links. --~'); } else { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ': not blacklisted locally, to request global removal, or  to ask for local whitelisting of specific links. --~'); }                   } else if (param == BLHandler.bl_NR_dec) { summary = "No response (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':, no response from requester. --~'); } else { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':, no response from requester. --~'); }                   } else if (param == BLHandler.bl_BFR_dec) { summary = "Thrown out - bad faith request (using SBHandler)"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':, bad faith request. --~'); } else { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':, bad faith request. --~'); }                   } else if (param == BLHandler.rl_close_na) { summary = "Closed using SBHandler"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':. --~'); } else { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ': . --~'); }                   } else if (param == BLHandler.rl_close_rev) { summary = "Reverted using SBHandler"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ': . --~'); } else { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':. --~'); }                   } else if (param == BLHandler.rl_close_dec) { summary = "Declined [Uu]sing SBHandler"; var matchregex = /\[\[user\:(.*?)[\|\]]/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerDecComment !== 'undefined' ? BLHandlerDecComment : ':. --~'); } else { append = (typeof BLHandlerDecComment !== 'undefined' ? BLHandlerDecComment : ': . --~'); }                   } else if (param == BLHandler.bl_ublock_dec) { summary = "Declined [Uu]sing SBHandler (user(s) blocked)"; var matchregex = /\[\[user\:(.*?)[\|\]]/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerDecComment !== 'undefined' ? BLHandlerDecComment : ':, user(s) blocked instead. --~'); } else { append = (typeof BLHandlerDecComment !== 'undefined' ? BLHandlerDecComment : ':, user(s) blocked instead. --~'); }                   } else if (param == BLHandler.bl_close_add) { summary = "Added to Blacklist using SBHandler"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerAddComment !== 'undefined' ? BLHandlerAddComment : ': to MediaWiki:Spam-blacklist. --~'); } else { append = (typeof BLHandlerAddComment !== 'undefined' ? BLHandlerAddComment : ': to MediaWiki:Spam-blacklist. --~'); }                       action = BLHandler.bl_add; } else if (param == BLHandler.bl_close_rem) { summary = "Removed from BlackList using SBHandler"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRemComment !== 'undefined' ? BLHandlerRemComment : ': from MediaWiki:Spam-blacklist. --~'); } else { append = (typeof BLHandlerRemComment !== 'undefined' ? BLHandlerRemComment : ': from MediaWiki:Spam-blacklist. --~'); }                       action = BLHandler.bl_rem; } else if (param == BLHandler.bl_close_na) { summary = "Closed using SBHandler"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerCloseComment !== 'undefined' ? BLHandlerCloseComment : ':. --~'); } else { append = (typeof BLHandlerCloseComment !== 'undefined' ? BLHandlerCloseComment : ': . --~'); }                   } else if (param == BLHandler.bl_close_rev) { summary = "Reverted using SBHandler"; var signeduser = text.match(matchregex); var matchregex = /\[\\/; if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ':. --~'); } else { append = (typeof BLHandlerRevComment !== 'undefined' ? BLHandlerRevComment : ': . --~'); }                   } else if (param == BLHandler.bl_close_dec) { summary = "Declined using SBHandler"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerDecComment !== 'undefined' ? BLHandlerDecComment : ':. --~'); } else { append = (typeof BLHandlerDecComment !== 'undefined' ? BLHandlerDecComment : ': . --~'); }                   } else if (param == BLHandler.bl_deferwhite_dec) { summary = "Deferred to WhiteList using SBHandler"; var matchregex = /\[\\/; var signeduser = text.match(matchregex); if ((signeduser == null) | (conf.wgPageName.substr(0, 33) === 'Wikipedia:WikiProject_Spam/Local/')) { append = (typeof BLHandlerDecComment !== 'undefined' ? BLHandlerDecComment : ':, for specific links on this domain. --~'); } else { append = (typeof BLHandlerDecComment !== 'undefined' ? BLHandlerDecComment : ':, for specific links on this domain. --~'); }                   }                    if (summary != null) { if (wpAction == 'edit') { BLUtils.setEditSummary(summary); var $textbox = $( '#wpTextbox1' ); mytext = $textbox.textSelection( 'getContents'); $textbox.textSelection( 'setContents', mytext+'\n'+append); }						if (action != null && urls !== '') { BLdebug.innerHTML += 'Action: ' + action + '; ';                           BLdebug.innerHTML += 'Domains: ' + urls.join(', ') + '; ';                           var editform = document.getElementById('editform'); editform.action += '&fakeaction=' + param + '&fakesource=' + fakesource;

// Remove save button var wpSave = document.getElementById('wpSave'); wpSave.parentNode.removeChild(wpSave);

//Add save link: wpSave = document.createElement('span'); wpSave.setAttribute('id', 'wpSave'); if (action == BLHandler.bl_rem) { wpSave.innerHTML = 'Save and remove domains from blacklist '; } else if (action == BLHandler.bl_add) { wpSave.innerHTML = 'Save and add domains to blacklist '; } else if (action == BLHandler.rl_rem) { wpSave.innerHTML = 'Save and remove domains from revertlist '; } else if (action == BLHandler.rl_add) { wpSave.innerHTML = 'Save and add domains to revertlist '; } else if (action == BLHandler.rrl_rem) { wpSave.innerHTML = 'Save and remove domains from reverteferenceslist '; } else if (action == BLHandler.rrl_add) { wpSave.innerHTML = 'Save and add domains to revertreferenceslist '; }

var wpPreview = document.getElementById('wpPreview'); wpPreview.parentNode.insertBefore(wpSave, wpPreview); }                       // Don't close the window to allow adding a comment. if (text.scrollHeight > text.clientHeight) { text.scrollTop = text.scrollHeight - text.clientHeight; }						$textbox.textSelection( 'setContents', text+'\n'+append); if(text)text.focus; }               }            },

HandlerSaveRequest: function { BLdebug.innerHTML += '<span style=\"font-weight:bold;\">Saving request… ';               var summary = document.getElementById('wpSummary').value; var $textbox = $( '#wpTextbox1' ); var text = $textbox.textSelection( 'getContents'); var section = document.getElementsByName('wpSection')[0].value; var minor = document.getElementById('wpMinoredit'); if (minor.checked) { minor = '&minor=1'; } else { minor = '&notminor=1'; }               var watch = document.getElementById('wpWatchthis'); if (watch.checked) { watch = '&watchlist=watch'; } else { watch = '&watchlist=unwatch'; }               if (section !== '') { section = '&section=' + encodeURIComponent(section); }               var edittoken = mw.user.tokens.get('csrfToken'); var query = 'format=xml'; var params = 'action=edit&title=' + encodeURIComponent(conf.wgPageName) + '&summary=' + encodeURIComponent(summary) + '&text=' + encodeURIComponent(text) + section + minor + watch + '&token=' + encodeURIComponent(edittoken); BLHandler.BLpostRequest(query, BLHandler.BLsetLocation, params, true); },

BLsetLocation: function (request) { var xml = request.responseXML; var location = conf.wgServer + conf.wgScriptPath + '/index.php' + '?title=Special:SpamBlackList' + '&action=' + action + '&fakesource=' + fakesource + '&urls=' + urls.join('|') + '&request=' + BLrequest; if (xml != null) { var edits = xml.getElementsByTagName('edit'); if (edits.length === 0) { BLdebug.innerHTML = '<div style=\"font-weight:bold;\">Saving might have failed. Please close the request yourself. ' +                           'Use <a href="' + location +                            '" title="Special:SpamBlackList">Special:SpamBlackList</a>' + //                           ' to add/remove the domains to/from the revertlist. Params: ' + params + ' Response: ' + request.responseText + ' '; ' to add/remove the domains to/from the Spam-blacklist. Params: ' + params + ' Response: ' + request.responseText + ' '; return; }                   var result = edits[0].getAttribute('result'); BLHandler.oldid = edits[0].getAttribute('newrevid'); if (result != 'Success') { BLdebug.innerHTML = '<div style=\"font-weight:bold;\">Saving failed. Please close the request yourself. ' +                           'Use <a href="' + location +                            '" title="Special:SpamBlackList">Special:SpamBlackList</a>' + //                           ' to add/remove the domains to/from the revertlist. Params: ' + params + ' Response: ' + request.responseText + ' '; ' to add/remove the domains to/from the Spam-blacklist. Params: ' + params + ' Response: ' + request.responseText + ' '; return; } else { window.location = location; }               } else { BLdebug.innerHTML += '<div style=\"font-weight:bold;\">ERROR: ' + request.status + ' Please close the request yourself. ' +                       'Use <a href="' + location +                        '" title="Special:SpamBlackList">Special:SpamBlackList</a>' + //                       ' to add/remove the domains to/from the revertlist. Params: ' + params + ' Response: ' + request.responseText + ' '; ' to add/remove the domains to/from the Spam-blacklist. Params: ' + params + ' Response: ' + request.responseText + ' '; return; }           },

/*--           Add to revertlist or blacklist. --*/           edittoken: '', text: '', request: '', urls: '', action: '', timestamp: '', oldid: '', custom: false,

BLWrapper: function { BLHandler.action = BLUtils.getParamValue('action'); BLHandler.fakesource = BLUtils.getParamValue('fakesource'); BLHandler.urls = BLUtils.getParamValue('urls'); BLHandler.request = BLUtils.getParamValue('request'); if (BLHandler.request.substr(0,1) == ' ') { BLHandler.request = BLHandler.request.substr(1, 256); // try to strip initial space }				if (BLHandler.request.substr(0,1) == ' ') { BLHandler.request = BLHandler.request.substr(1, 256); // try to strip initial space }				if (BLHandler.request.substr(0,1) == ' ') { BLHandler.request = BLHandler.request.substr(1, 256); // try to strip initial space }               var header = document.getElementsByTagName('h1')[0]; var content = document.getElementById('bodyContent');

if (BLHandler.action == BLHandler.rl_add || BLHandler.action == BLHandler.rl_rem) { document.title = 'User:XLinkBot/RevertList'; header.innerHTML = 'User:XLinkBot/RevertList'; content.innerHTML = '<h3 id=\"siteSub\">en.wikipedia blacklist tool. ' +						' Use this tool to add domains to the <a href=\"//en.wikipedia.org/wiki/User:XLinkBot/RevertList\" title=\"User:XLinkBot/RevertList\">User:XLinkBot/RevertList</a>, or remove them, and log the change. Note that it does not escape paths. <span style=\"font-weight:bold;\">Do not use this tool unless you have a basic understanding of regex. You still need to confirm the changes. Do not assume that the proposed edit is correct. ';				} else if (BLHandler.action == BLHandler.bl_add || BLHandler.action == BLHandler.bl_rem) { document.title = 'MediaWiki:Spam-blacklist'; header.innerHTML = 'MediaWiki:Spam-blacklist'; content.innerHTML = '<h3 id=\"siteSub\">en.wikipedia blacklist tool. ' +						' Use this tool to add domains to the <a href=\"//en.wikipedia.org/wiki/MediaWiki:Spam-blacklist\" title=\"MediaWiki:Spam-blacklist\">MediaWiki:Spam-blacklist</a>, or remove them, and log the change. Note that it does not escape paths. <span style=\"font-weight:bold;\">Do not use this tool unless you have a basic understanding of regex. You still need to confirm the changes. Do not assume that the proposed edit is correct. ';				} else if (BLHandler.action == BLHandler.rrl_add || BLHandler.action == BLHandler.rrl_rem) { document.title = 'User:XLinkBot/RevertReferencesList'; header.innerHTML = 'User:XLinkBot/RevertReferencesList'; content.innerHTML = '<h3 id=\"siteSub\">en.wikipedia blacklist tool. ' +						' Use this tool to add domains to the <a href=\"//en.wikipedia.org/wiki/User:XLinkBot/RevertReferencesList\" title=\"User:XLinkBot/RevertReverencesList\">User:XLinkBot/RevertReferencesList</a>, or remove them, and log the change. Note that it does not escape paths. <span style=\"font-weight:bold;\">Do not use this tool unless you have a basic understanding of regex. You still need to confirm the changes. Do not assume that the proposed edit is correct. ';				}

if ((BLHandler.action == BLHandler.bl_add || BLHandler.action == BLHandler.bl_rem) && BLHandler.urls != null && BLHandler.urls !== '' && BLHandler.request != null) { content.innerHTML += '<div id=\"RLstatus\" style=\"font-style: italic; border: 1px solid; padding: 5px; float:right;\">' + '<span id=\"Sthrobber\" style=\"text-align:center; font-weight:bold; float:right;\">' + '<img src=\"//upload.wikimedia.org/wikipedia/commons/d/d2/Spinning_wheel_throbber.gif\" alt=\"Loading\">' + 'Loading… ' + '<br clear=\"all\" />' + ' <br clear=\"all\" />' + ' RevertList <div id=\"RLlist\"> ' + ' Log <div id=\"RLlog\"> '; BLlist = document.getElementById("RLlist"); BLlog = document.getElementById("RLlog"); edittoken = mw.user.tokens.get('csrfToken'); BLHandler.BLgetRequest('action=query&prop=info&titles=MediaWiki:Spam-blacklist&token=' + encodeURIComponent(edittoken), BLHandler.BLgetRL, true); } else if ((BLHandler.action == BLHandler.rl_add || BLHandler.action == BLHandler.rl_rem) && BLHandler.urls != null && BLHandler.urls !== '' && BLHandler.request != null) { content.innerHTML += '<div id=\"RLstatus\" style=\"font-style: italic; border: 1px solid; padding: 5px; float:right;\">' + '<span id=\"Sthrobber\" style=\"text-align:center; font-weight:bold; float:right;\">' + '<img src=\"//upload.wikimedia.org/wikipedia/commons/d/d2/Spinning_wheel_throbber.gif\" alt=\"Loading\">' + 'Loading… ' + '<br clear=\"all\" />' + ' <br clear=\"all\" />' + ' RevertList <div id=\"RLlist\"> ' + ' Log <div id=\"RLlog\"> '; BLlist = document.getElementById("RLlist"); BLlog = document.getElementById("RLlog"); edittoken = mw.user.tokens.get('csrfToken'); BLHandler.BLgetRequest('action=query&prop=info&titles=User:XLinkBot/RevertList&token=' + encodeURIComponent(edittoken), BLHandler.BLgetRL, true); } else if ((BLHandler.action == BLHandler.rrl_add || BLHandler.action == BLHandler.rrl_rem) && BLHandler.urls != null && BLHandler.urls !== '' && BLHandler.request != null) { content.innerHTML += '<div id=\"RLstatus\" style=\"font-style: italic; border: 1px solid; padding: 5px; float:right;\">' + '<span id=\"Sthrobber\" style=\"text-align:center; font-weight:bold; float:right;\">' + '<img src=\"//upload.wikimedia.org/wikipedia/commons/d/d2/Spinning_wheel_throbber.gif\" alt=\"Loading\">' + 'Loading… ' + '<br clear=\"all\" />' + ' <br clear=\"all\" />' + ' RevertList <div id=\"RLlist\"> ' + ' Log <div id=\"RLlog\"> '; BLlist = document.getElementById("RLlist"); BLlog = document.getElementById("RLlog"); edittoken = mw.user.tokens.get('csrfToken'); BLHandler.BLgetRequest('action=query&prop=info&titles=User:XLinkBot/RevertReferencesList&token=' + encodeURIComponent(edittoken), BLHandler.BLgetRL, true); } else { content.innerHTML += '<p style=\"font-style:italic\">This tool can only be used in conjunction with <a href=\"//en.wikipedia.org/wiki/Wikipedia:WikiProject_Spam/Local/\" title=\"Wikipedia:WikiProject_Spam/Local/\">COIBot\'s spam reports</a> to add or remove domains. ';               }            },

// Get the current text and oldid of User:XLinkBot/RevertList or of MediaWiki:Spam-blacklist BLgetRL: function (request) { var xml = request.responseXML; if (xml != null) { var pages = xml.getElementsByTagName('page'); BLHandler.edittoken = mw.user.tokens.get('csrfToken'); if (BLHandler.action == BLHandler.rl_add || BLHandler.action == BLHandler.rl_rem) { BLHandler.BLgetRequest('action=query&prop=revisions&titles=User:XLinkBot/RevertList&rvprop=ids|timestamp|user|comment|content', BLHandler.BLparseRL, true); } else if (BLHandler.action == BLHandler.rrl_add || BLHandler.action == BLHandler.rrl_rem) { BLHandler.BLgetRequest('action=query&prop=revisions&titles=User:XLinkBot/RevertReferencesList&rvprop=ids|timestamp|user|comment|content', BLHandler.BLparseRL, true); } else if (BLHandler.action == BLHandler.bl_add || BLHandler.action == BLHandler.bl_rem) { BLHandler.BLgetRequest('action=query&prop=revisions&titles=MediaWiki:Spam-blacklist&rvprop=ids|timestamp|user|comment|content', BLHandler.BLparseRL, true); }               }            },

// Add/remove domains from the text BLparseRL: function (request) { var xml = request.responseXML; if (xml == null) { BLlist.innerHTML += '<div style=\"font-weight:bold;\">ERROR: ' + request.status + ' Aborting. ';                   return; }               var revs = xml.getElementsByTagName('rev'); BLHandler.timestamp = revs[0].getAttribute('timestamp'); BLHandler.text = revs[0].textContent; var oldlength = BLHandler.text.length; document.getElementById('SgetRL').style.color = 'black';

if ((BLHandler.action == BLHandler.rl_add) || (BLHandler.action == BLHandler.rrl_add) || (BLHandler.action == BLHandler.bl_add)) { urls = BLHandler.urls.replace(/\|/g, '\n'); if (BLHandler.text.length > 1000) { var lastchars = BLHandler.text.substr(-1000); BLHandler.text = BLHandler.text.substr(0, BLHandler.text.length - 1000); if (lastchars.indexOf('## blhandler_end') > 0) { lastchars = lastchars.replace('## blhandler_end', urls + '\n## blhandler_end'); } else { BLlist.innerHTML += '<div style=\"font-weight:bold;\">ERROR: Could not find marker. Aborting. ';                           return; }                       BLHandler.text += lastchars; } else { if (BLHandler.text.indexOf('## blhandler_end') > 0) { BLHandler.text = BLHandler.text.replace('## blhandler_end', urls + '\n## blhandler_end'); } else { BLlist.innerHTML += '<div style=\"font-weight:bold;\">ERROR: Could not find marker. Please add \"## blhandler_end\" on a single line below the blacklist\'s entry\'s and try again. ';                           return; }                   }                } else if ((BLHandler.action == BLHandler.rl_rem) || (BLHandler.action == BLHandler.rrl_rem) || (BLHandler.action == BLHandler.bl_rem)) { urls = BLHandler.urls.split('|'); for (var i = 0; i < urls.length; i++) { BLHandler.text = BLHandler.text.replace(urls[i] + '\n', ''); }               }                //Check if the length changed, if not assume nothing changed. if (oldlength == BLHandler.text.length) { BLlist.innerHTML += '<div style=\"font-weight:bold;\">ERROR: The length of the old and new text are the same. This shouldn\'t happen. Aborting. ';                   return; }               document.getElementById('SaddRL').style.color = 'black'; if (BLHandler.action === BLHandler.rl_add || BLHandler.action === BLHandler.rl_rem) { params = 'action=query&prop=revisions&titles=User:XLinkBot/RevertList&rvdifftotext=' + encodeURIComponent(BLHandler.text); } else if (BLHandler.action === BLHandler.rrl_add || BLHandler.action === BLHandler.rrl_rem) { params = 'action=query&prop=revisions&titles=User:XLinkBot/RevertReferencesList&rvdifftotext=' + encodeURIComponent(BLHandler.text); } else if (BLHandler.action === BLHandler.bl_add || BLHandler.action === BLHandler.bl_rem) { params = 'action=query&prop=revisions&titles=MediaWiki:Spam-blacklist&rvdifftotext=' + encodeURIComponent(BLHandler.text); }               BLHandler.BLpostRequest('format=xml', BLHandler.HandlerParseDiff, params, true); },

// Parse and show the proposed edit HandlerParseDiff: function (request) { var xml = request.responseXML; if (xml != null) { document.getElementById('SgetC').style.color = 'black'; var diffSource = xml.getElementsByTagName('diff'); var summary; if (diffSource[0].childNodes[0].nodeValue) { urls = BLHandler.urls.split('|');

if ((BLHandler.action == BLHandler.rl_add) || (BLHandler.action == BLHandler.rrl_add) || (BLHandler.action == BLHandler.bl_add)) { summary = 'Adding '; } else { summary = 'Removing '; }

if (urls.length > 1) { summary += urls.length + ' domains '; } else { summary += urls[0] + ' '; }

if (BLHandler.fakesource === 'localreport') { summary += 'per ' + BLHandler.request + '.'; } else if (BLHandler.fakesource === 'revertlist') { summary += 'per User talk:XLinkBot/RevertList.'; } else if (BLHandler.fakesource === 'blacklist') { summary += 'per MediaWiki talk:Spam-blacklist.'; } else if (BLHandler.fakesource === 'wpspam') { summary += 'per Wikipedia talk:WikiProject Spam.'; }                       BLlist.innerHTML += ' ' + ' <div id=\"BLform\">' + '<input type=\"text\" value=\"' + summary + '\" id=\"summary\" maxlength=\"200\" size=\"60\" >  <button onclick=\"BLHandler.HandlerSubmitEdit\">Confirm changes <button onclick=\"BLHandler.HandlerEditList\">Edit changes ';

document.getElementById('SparseRL').style.color = 'black'; } else { BLlist.innerHTML += '<div style=\"font-weight:bold;\">ERROR: Could not show diff. Aborting. ';                       return; }               } else { BLlist.innerHTML += '<div style=\"font-weight:bold;\">ERROR: ' + request.status + ' Aborting. ';                   return; }           },

// Add a text area to change the revertlist or the blacklist yourself

HandlerEditList: function { var BLform = document.getElementById('BLform'); BLform.innerHTML = '<textarea name=\"wpTextbox1\" id=\"wpTextbox1\" cols=\"80\" rows=\"25\" accesskey=\",\">' + BLHandler.text + ' ' +                 BLform.innerHTML; },

// Submit the edit to User:XLinkBot/RevertList or MediaWiki:Spam-blacklist HandlerSubmitEdit: function { var wpTextbox = document.getElementById('wpTextbox1'); if (wpTextbox != null) { BLHandler.text = wpTextbox.value; BLHandler.custom = true; //We can't simply log the change. User needs to do that. }               document.getElementById('SconfirmRL').style.color = 'black'; summary = document.getElementById('summary').value; summary += ' Using BlackList/ReverList Handler.'; var query = 'format=xml';

if (BLHandler.action == BLHandler.rl_add || BLHandler.action == BLHandler.rl_rem) { params = 'action=edit&title=User:XLinkBot/RevertList&summary=' + encodeURIComponent(summary) + '&text=' + encodeURIComponent(BLHandler.text) + '&basetimestamp=' + BLHandler.timestamp +  '&token=' + encodeURIComponent(BLHandler.edittoken); } else if (BLHandler.action == BLHandler.rrl_add || BLHandler.action == BLHandler.rrl_rem) { params = 'action=edit&title=User:XLinkBot/RevertReferencesList&summary=' + encodeURIComponent(summary) + '&text=' + encodeURIComponent(BLHandler.text) + '&basetimestamp=' + BLHandler.timestamp +  '&token=' + encodeURIComponent(BLHandler.edittoken); } else if (BLHandler.action == BLHandler.bl_add || BLHandler.action == BLHandler.bl_rem) { params = 'action=edit&title=MediaWiki:Spam-blacklist&summary=' + encodeURIComponent(summary) + '&text=' + encodeURIComponent(BLHandler.text) + '&basetimestamp=' + BLHandler.timestamp +  '&token=' + encodeURIComponent(BLHandler.edittoken); }

BLHandler.BLpostRequest(query, BLHandler.BLLWrapper, params, true); },

// Start logging procedure BLLWrapper: function (request) { var xml = request.responseXML; if (xml != null) { var edits = xml.getElementsByTagName('edit'); if (edits.length === 0) { BLlist.innerHTML = '<div style=\"font-weight:bold;\">Saving might have failed. Please check if it succeeded and log the edit yourself if necessary. ';                       return; }                   var result = edits[0].getAttribute('result'); BLHandler.oldid = edits[0].getAttribute('newrevid'); if (result !== 'Success') { if (BLHandler.action == BLHandler.rl_add || BLHandler.action == BLHandler.rl_rem) { BLlist.innerHTML = '<div style=\"font-weight:bold;\">Saving failed. Please revertlist the domains yourself. ';						} else if (BLHandler.action == BLHandler.rrl_add || BLHandler.action == BLHandler.rrl_rem) { BLlist.innerHTML = '<div style=\"font-weight:bold;\">Saving failed. Please revertreferenceslist the domains yourself. ';						} else if (BLHandler.action == BLHandler.bl_add || BLHandler.action == BLHandler.bl_rem) { BLlist.innerHTML = '<div style=\"font-weight:bold;\">Saving failed. Please blacklist the domains yourself. ';						}                       return; } else { document.getElementById('SsaveRL').style.color = 'black'; if (BLHandler.action == BLHandler.rl_add || BLHandler.action == BLHandler.rl_rem) { BLlist.innerHTML = ' RevertList has been updated, <a href=\"' + conf.wgServer + conf.wgScriptPath + '/index.php?oldid=' + BLHandler.oldid + '&diff=prev\" title=\"diff\">diff</a>. ';						} else if (BLHandler.action == BLHandler.rrl_add || BLHandler.action == BLHandler.rrl_rem) { BLlist.innerHTML = ' RevertReferencesList has been updated, <a href=\"' + conf.wgServer + conf.wgScriptPath + '/index.php?oldid=' + BLHandler.oldid + '&diff=prev\" title=\"diff\">diff</a>. ';						} else if (BLHandler.action == BLHandler.bl_add || BLHandler.action == BLHandler.bl_rem) { BLlist.innerHTML = ' Blacklist has been updated, <a href=\"' + conf.wgServer + conf.wgScriptPath + '/index.php?oldid=' + BLHandler.oldid + '&diff=prev\" title=\"diff\">diff</a>. ';						}                   }

} else { BLlist.innerHTML += '<div style=\"font-weight:bold;\">ERROR: ' + request.status + ' Aborting. ';                   return; }

var d = new Date; var m = d.getMonth + 1; if (m < 10) { m = '0' + m;               } var y = d.getFullYear; if (BLHandler.action == BLHandler.rl_add || BLHandler.action == BLHandler.rl_rem) { logtitle = 'User:XLinkBot/RevertList_requests/log' ; } else if (BLHandler.action == BLHandler.rrl_add || BLHandler.action == BLHandler.rrl_rem) { logtitle = 'User:XLinkBot/RevertList_requests/log' ; } else if (BLHandler.action == BLHandler.bl_add || BLHandler.action == BLHandler.bl_rem) { logtitle = 'MediaWiki_talk:Spam-blacklist/log/'+ y;				}

if (BLHandler.fakesource === 'localreport') { BLHandler.BLgetRequest('action=query&prop=revisions&titles=' + logtitle + '&rvprop=ids|timestamp|user|comment|content', BLHandler.BLparseL, true); } else if (BLHandler.fakesource === 'revertlist') { BLHandler.BLgetRequest('action=query&prop=revisions&titles=User_talk:XLinkBot/RevertList&rvprop=ids|timestamp|user|comment|content', BLHandler.BLparseTRL, true); } else if (BLHandler.fakesource === 'blacklist') { BLHandler.BLgetRequest('action=query&prop=revisions&titles=MediaWiki_talk:Spam-blacklist&rvprop=ids|timestamp|user|comment|content', BLHandler.BLparseTRL, true); } else if (BLHandler.fakesource === 'wpspam') { BLHandler.BLgetRequest('action=query&prop=revisions&titles=Wikipedia_talk:WikiProject_Spam&rvprop=ids|timestamp|user|comment|content', BLHandler.BLparseTRL, true); }           },

// Get current oldid of User_talk:XLinkBot/RevertList, because that's the location of the request. BLparseTRL: function (request) { var xml = request.responseXML; if (xml != null) { var revs = xml.getElementsByTagName('rev'); tprevid = revs[0].getAttribute('revid'); } else { BLlog.innerHTML += '<div style=\"font-weight:bold;\">ERROR: ' + request.status + ' . Please log the edit yourself. ';                   return; }

BLHandler.BLgetRequest('action=query&prop=revisions&titles=' + logtitle + '&rvprop=ids|timestamp|user|comment|content', BLHandler.BLparseL, true); },

// Add/remove domains to/from log BLparseL: function (request) { var xml = request.responseXML; if (xml != null) { document.getElementById('SgetL').style.color = 'black'; var revs = xml.getElementsByTagName('rev'); if (revs.length === 0) { BLlog.innerHTML += '<div style=\"font-weight:bold;\">ERROR: Could not get log. It probably does not exist yet. Please create <a href="//en.wikipedia.org/wiki/' + logtitle + '" title="' + logtitle + '">' + logtitle + '</a> and log the edit yourself. ';                       return; }                   BLHandler.timestamp = revs[0].getAttribute('timestamp'); BLHandler.text = revs[0].textContent; } else { BLlog.innerHTML += '<div style=\"font-weight:bold;\">ERROR: ' + request.status + ' Please log the edit yourself. ';                   return; }

var rldiff; if ((BLHandler.action == BLHandler.rl_add) || (BLHandler.action == BLHandler.rrl_add) || (BLHandler.action == BLHandler.bl_add)) { rldiff = ''; } else { rldiff = ''; }

urls = BLHandler.urls.split('|'); var r = BLHandler.request; if (BLHandler.fakesource === 'localreport') { r =  + r + ; } else if (BLHandler.fakesource === 'revertlist') { r = ''; } else if (BLHandler.fakesource === 'blacklist') { r = ''; } else if (BLHandler.fakesource === 'wpspam') { r = ''; }

var spaces = '                                       ';

if (urls.length == 1) { log_text = ' ' + urls[0] + spaces.substr(0, 39 - urls[0].length) + '# ' + conf.wgUserName + ' # ' + rldiff + '; see ' + r;               } else { log_text = ' #:                                    ' + conf.wgUserName + ' # ' + rldiff + '; see ' + r;                   for (var i = 0; i < urls.length; i++) { log_text += '\n  ' + urls[i]; }               }

// User needs to confirm log edit if (BLHandler.custom) { BLlog.innerHTML += ' The following text will be added to the log. You need to update this to reflect the changes you made to the proposed edit. ' +                     '<textarea name=\"wpTextbox1\" id=\"wpTextbox1\" cols=\"80\" rows=\"10\" accesskey=\",\">' + log_text + ' ' +                     '<button onclick=\"BLHandler.BLsubmitL\">Confirm changes '; } else { BLHandler.BLsubmitL; }           },

BLsubmitL: function { var wpTextbox = document.getElementById('wpTextbox1'); if (wpTextbox != null) { BLHandler.text += '\n' + wpTextbox.value; } else { BLHandler.text += '\n' + log_text; }               document.getElementById('SaddL').style.color = 'black'; var query = 'format=xml'; var params = 'action=edit&title=' + encodeURIComponent(logtitle) + '&summary=' + encodeURIComponent(summary) + '&text=' + encodeURIComponent(BLHandler.text) + '&token=' + encodeURIComponent(BLHandler.edittoken); BLHandler.BLpostRequest(query, BLHandler.BLLEnd, params, true); },

// Confirm results BLLEnd: function (request) { var xml = request.responseXML;

if (xml != null) { var edits = xml.getElementsByTagName('edit'); if (edits.length === 0) { BLlist.innerHTML = '<div style=\"font-weight:bold;\">Saving might have failed. Please check if it succeeded and log the edit yourself if necessary. ';                       return; }                   var result = edits[0].getAttribute('result'); var oldid = edits[0].getAttribute('newrevid'); if (result !== 'Success') { BLlog.innerHTML = ' Saving failed. Please log the edit yourself. ';                       return; } else { document.getElementById('SsaveL').style.color = 'black'; document.getElementById('Sthrobber').innerHTML = ''; if ((BLHandler.action == BLHandler.rl_add) || (BLHandler.action == BLHandler.rl_add)) { BLlog.innerHTML = ' Log has been updated, <a href=\"' + conf.wgServer + conf.wgScriptPath + '/index.php?oldid=' + oldid + '&diff=prev\" title=\"diff\">diff</a>.<p style=\"font-style:italic\">Thanks for helping with the Spam revertlist! ';						} else if ((BLHandler.action == BLHandler.rrl_add) || (BLHandler.action == BLHandler.rrl_add)) { BLlog.innerHTML = ' Log has been updated, <a href=\"' + conf.wgServer + conf.wgScriptPath + '/index.php?oldid=' + oldid + '&diff=prev\" title=\"diff\">diff</a>.<p style=\"font-style:italic\">Thanks for helping with the Spam revertlist! ';						} else { BLlog.innerHTML = ' Log has been updated, <a href=\"' + conf.wgServer + conf.wgScriptPath + '/index.php?oldid=' + oldid + '&diff=prev\" title=\"diff\">diff</a>.<p style=\"font-style:italic\">Thanks for helping with the Spam blacklist!. ';						}                   }                }	            },

BLgetRequest: function (query, callback, api) { var url; if (api) { url = conf.wgServer + conf.wgScriptPath + '/api.php?format=xml&' + query; } else { url = conf.wgServer + conf.wgScriptPath + '/index.php?' + query; }

$.ajax({                   url: url,                    type: 'GET',                    headers: {                        'Pragma': 'cache=yes',                        'Cache-Control': 'no-transform'                    }                }).done(function (data, textStatus, jqXHR) {                    callback(jqXHR);                }); },

BLpostRequest: function (query, callback, params, api) { var url; if (api) { url = conf.wgServer + conf.wgScriptPath + '/api.php?' + query; } else { url = conf.wgServer + conf.wgScriptPath + '/index.php?' + query; }

$.ajax({                   url: url,                    type: 'POST',                    headers: {                        'Content-type': 'application/x-www-form-urlencoded',                        'Content-length': params.length,                        'Pragma': 'cache=yes',                        'Cache-Control': 'no-transform'                    },                    data: params                }).done(function (data, textStatus, jqXHR) {                    callback(jqXHR);                }); },

BLsetupHandler: function { if (conf.wgPageName == 'Special:SpamBlackList') { BLHandler.BLWrapper; } else { BLHandler.BLcloseRequestLinks; }           }

};       // End of BLHandler object

$(BLHandler.BLsetupHandler);

}   // End of if-sysop check

// Export global variables window.BLHandler = BLHandler; window.BLrequest = BLrequest;

}); // //