User:TheTVExpert/rmCloser.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
This user script seems to have a documentation page at User:TheTVExpert/rmCloser. |
//rmCloser
//<nowiki>
var rmCloser = {};
window.rmCloser = rmCloser;
$.when(
mw.loader.using([ 'mediawiki.api', 'ext.gadget.morebits', 'ext.gadget.libExtraUtil' ]),
$.ready
).then(function() {
if (document.getElementById("requestedmovetag") !== null && Morebits.pageNameNorm.indexOf("alk:") !== -1 && mw.config.get('wgCategories').includes('Requested moves') && !document.getElementById("wikiPreview") && mw.config.get('wgDiffOldId') == null) {
document.getElementById("requestedmovetag").innerHTML = "<button id='rmCloserClose'>Close</button><button id='rmCloserRelist'>Relist</button><button id='rmCloserNotify'>Notify WikiProjects</button><span id='rmCloserRelistOptions' style='display:none'><input id='rmCloserRelistComment' placeholder='Relisting comment' oninput='if(this.value.length>20){this.size=this.value.length} else{this.size=20}'/><br><button id='rmCloserConfirm'>Confirm relist</button><button id='rmCloserCancel'>Cancel relist</button></span>";
$('#rmCloserClose').click(rmCloser.callback);
$('#rmCloserRelist').click(rmCloser.confirmRelist);
$('#rmCloserConfirm').click(rmCloser.relist);
$('#rmCloserCancel').click(rmCloser.cancelRelist);
$('#rmCloserNotify').click(rmCloser.notify);
}
});
rmCloser.confirmRelist = function rmCloserConfirmRelist(e) {
if (e) e.preventDefault();
document.getElementById("rmCloserRelistOptions").style.display = "inline";
document.getElementById("rmCloserClose").style.display = "none";
document.getElementById("rmCloserRelist").style.display = "none";
document.getElementById("rmCloserNotify").style.display = "none";
};
rmCloser.cancelRelist = function rmCloserCancelRelist(e) {
if (e) e.preventDefault();
document.getElementById("rmCloserRelistOptions").style.display = "none";
document.getElementById("rmCloserClose").style.display = "inline";
document.getElementById("rmCloserRelist").style.display = "inline";
document.getElementById("rmCloserNotify").style.display = "inline";
};
rmCloser.advert = ' using [[User:TheTVExpert/rmCloser|rmCloser]]';
rmCloser.callback = function rmCloserCallback(e) {
if (e) e.preventDefault();
rmCloser.Window = new Morebits.simpleWindow(600, 450);
rmCloser.Window.setTitle( "Close requested move" );
rmCloser.Window.setScriptName('rmCloser');
rmCloser.Window.addFooterLink('RM Closing instruction', 'WP:RMCI');
rmCloser.Window.addFooterLink('Script documentation', 'User:TheTVExpert/rmCloser');
rmCloser.Window.addFooterLink('Give feedback', 'User talk:TheTVExpert/rmCloser');
var form = new Morebits.quickForm(rmCloser.evaluate);
var resultField = form.append({
type: 'field',
label: 'Result'
});
resultField.append({
type: 'radio',
name: 'result',
list: [
{
label: 'Moved',
value: 'moved',
event: function() {
document.getElementsByName('customResult')[0].style.display = 'none';
document.getElementsByName('customResult')[0].required = false;
}
},
{
label: 'Not moved',
value: 'not moved',
event: function() {
document.getElementsByName('customResult')[0].style.display = 'none';
document.getElementsByName('customResult')[0].required = false;
}
},
{
label: 'No consensus',
value: 'no consensus',
event: function() {
document.getElementsByName('customResult')[0].style.display = 'none';
document.getElementsByName('customResult')[0].required = false;
}
},
{
label: 'Custom',
value: 'custom',
event: function() {
document.getElementsByName('customResult')[0].style.display = 'inline';
document.getElementsByName('customResult')[0].required = true;
}
}
]
});
resultField.append({
type: 'input',
name: 'customResult'
});
var closingCommentField = form.append({
type: 'field',
label: 'Closing comment'
});
closingCommentField.append({
type: 'textarea',
name: 'closingComment'
});
form.append({ type: 'submit', label: 'Submit' });
var formResult = form.render();
rmCloser.Window.setContent(formResult);
rmCloser.Window.display();
document.getElementsByName('customResult')[0].style.display = 'none';
document.getElementsByName('result')[0].required = true;
};
rmCloser.evaluate = function(e) {
var form = e.target;
rmCloser.params = Morebits.quickForm.getInputData(form);
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(form);
var title_obj = mw.Title.newFromText(Morebits.pageNameNorm);
rmCloser.title = title_obj.getSubjectPage().toText();
rmCloser.talktitle = title_obj.getTalkPage().toText();
var result = rmCloser.params.result;
if(result == 'custom'){
result = rmCloser.params.customResult;
}
var closingComment = rmCloser.params.closingComment;
if(closingComment != ""){
closingComment = ' ' + closingComment;
closingComment = closingComment.replace(/\|/g, "{{!}}");
closingComment = closingComment.replace(/=/g, "{{=}}");
}
var talkpage = new Morebits.wiki.page(rmCloser.talktitle, 'Closing move.');
talkpage.load(function(talkpage) {
var text = talkpage.getPageText();
var templatesOnPage = extraJs.parseTemplates(text,false);
var oldMovesPresent = [];
var template;
for (var i = 0; i < templatesOnPage.length; i++) {
if (templatesOnPage[i].name.toLowerCase() == "old moves" || templatesOnPage[i].name.toLowerCase() == "old move") {
oldMovesPresent.push(templatesOnPage[i]);
} else if (templatesOnPage[i].name.toLowerCase() == "requested move/dated") {
template = templatesOnPage[i];
}
}
var templateFound = false;
var numberOfMoves = 0;
var line;
var templateIndex = -1;
var parsedDate;
var rmSection;
var nextSection = false;
var textToFind = text.split('\n');
for (var i = 0; i < textToFind.length; i++) {
line = textToFind[i];
if(templateFound == false){
if(/{{[Rr]equested move\/dated/.test(line)){
templateFound = true;
templateIndex = i;
}
} else if(templateFound == true){
if (/ \(UTC\)/.test(line)){
line = line.substring(line.indexOf("This is a contested technical request"));
parsedDate = line.match(/, ([0-9]{1,2} (January|February|March|April|May|June|July|August|September|October|November|December) [0-9]{4}) \(UTC\)/)[1];
break;
} else if(/→/.test(line)){
numberOfMoves++;
}
}
}
for (var i = templateIndex; i >= 0; i--) {
line = textToFind[i];
if (line.match(/^(==)[^=].+\1/)) {
rmSection = line.match(/^(==)[^=](.+)\1/)[2].trim();
break;
}
}
for (var i = templateIndex+1; i < textToFind.length; i++) {
line = textToFind[i];
if (line.match(/^(==)[^=].+\1/)) {
nextSection = true;
var escapedLine = line.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
var regex = new RegExp('(' + escapedLine + ')(?![\s\S]*(' + escapedLine + '))', 'm');
text = text.replace(regex, '{{subst:RM bottom}}\n\n' + line);
break;
}
}
var userGroupText = "";
if(Morebits.userIsInGroup('sysop')){
userGroupText = "";
} else if(Morebits.userIsInGroup('extendedmover')){
userGroupText = "|pmc=y";
} else{
userGroupText = "|nac=y";
}
text = text.replace(/{{[Rr]equested move\/dated\|.*\n?[^\[]*}}/, "{{subst:RM top|'''" + result + ".'''" + closingComment + userGroupText +"}}");
if (!nextSection) {
text += '\n{{subst:RM bottom}}';
}
var multiMove = false;
var moveSectionPlain = rmSection;
var date = parsedDate;
var from = '';
var destination;
for (var i = 0; i < template.parameters.length; i++) {
if (template.parameters[i].name == "multiple") {
multiMove = true;
} else if (template.parameters[i].name == "new1") {
destination = template.parameters[i].value;
break;
} else if (template.parameters[i].name == "1") {
destination = template.parameters[i].value;
}
}
if(destination == "?"){
destination = "";
}
var link = 'Special:Permalink/' + talkpage.getCurrentID() + '#' + moveSectionPlain;
var archives = text.match(/{{[Aa]rchives/);
if(archives == null){
archives = text.match(/{{[Aa]rchive box/);
if(archives == null){
archives = text.match(/{{[Aa]rchivebox/);
if(archives == null){
archives = text.match(/==.*==/);
}
}
}
if (oldMovesPresent.length == 0) {
if(result == "moved"){
from = '|from=' + rmCloser.title;
}
text = text.replace(archives[0], '{{old move'+ '|date=' + date + from + '|destination=' + destination + '|result=' + result + '|link=' + link +'}}\n\n' + archives[0]);
} else if (oldMovesPresent.length == 1) {
var isValidFormat = false;
var isListFormat = false;
var numOldMoves = 0;
for (var i = 0; i < oldMovesPresent[0].parameters.length; i++) {
var parameterName = oldMovesPresent[0].parameters[i].name;
parameterName = parameterName.toString();
if (parameterName == "list") {
isListFormat = true;
break;
} else if (parameterName == "result1") {
isValidFormat = true;
numOldMoves++;
} else if (parameterName.includes("result")) {
numOldMoves++;
}
}
if (isValidFormat && !isListFormat) {
var oldMovesText = oldMovesPresent[0].wikitext;
numOldMoves++;
if(result == "moved"){
from = '|from' + numOldMoves + '=' + rmCloser.title;
}
var newTextToAdd = '|date' + numOldMoves + '=' + date + from + '|destination' + numOldMoves + '=' + destination + '|result' + numOldMoves + '=' + result + '|link' + numOldMoves + '=' + link + '}}';
oldMovesText = oldMovesText.substring(0, oldMovesText.length-2) + newTextToAdd;
text = text.replace(oldMovesPresent[0].wikitext, oldMovesText);
} else if (isListFormat) {
if(result == "moved"){
from = '|from=' + rmCloser.title;
}
text = text.replace(archives[0], '{{old move'+ '|date=' + date + from + '|destination=' + destination + '|result=' + result + '|link=' + link +'}}\n\n' + archives[0]);
} else {
var oldMovesText = '{{' + oldMovesPresent[0].name;
for (var i = 0; i < oldMovesPresent[0].parameters.length; i++) {
if (oldMovesPresent[0].parameters[i].name == "date") {
oldMovesText += '|date1=' + oldMovesPresent[0].parameters[i].value;
} else if (oldMovesPresent[0].parameters[i].name == "from") {
oldMovesText += '|name1=' + oldMovesPresent[0].parameters[i].value;
} else if (oldMovesPresent[0].parameters[i].name == "destination") {
oldMovesText += '|destination1=' + oldMovesPresent[0].parameters[i].value;
} else if (oldMovesPresent[0].parameters[i].name == "result") {
oldMovesText += '|result1=' + oldMovesPresent[0].parameters[i].value;
} else if (oldMovesPresent[0].parameters[i].name == "link") {
oldMovesText += '|link1=' + oldMovesPresent[0].parameters[i].value;
} else {
oldMovesText += oldMovesPresent[0].parameters[i].wikitext;
}
}
if(result == "moved"){
from = '|from2=' + rmCloser.title;
}
var newTextToAdd = '|date2=' + date + from + '|destination2=' + destination + '|result2=' + result + '|link2=' + link + '}}';
oldMovesText += newTextToAdd;
text = text.replace(oldMovesPresent[0].wikitext, oldMovesText);
}
} else {
var oldMovesText = '{{Old moves';
var numOldMoves = 1;
for (var i = 0; i < oldMovesPresent.length; i++) {
for (var j = 0; j < oldMovesPresent[i].parameters.length; j++) {
if (oldMovesPresent[i].parameters[j].name == "date") {
oldMovesText += '|date' + numOldMoves + '=' + oldMovesPresent[i].parameters[j].value;
} else if (oldMovesPresent[i].parameters[j].name == "from") {
oldMovesText += '|name' + numOldMoves + '=' + oldMovesPresent[i].parameters[j].value;
} else if (oldMovesPresent[i].parameters[j].name == "destination") {
oldMovesText += '|destination' + numOldMoves + '=' + oldMovesPresent[i].parameters[j].value;
} else if (oldMovesPresent[i].parameters[j].name == "result") {
oldMovesText += '|result' + numOldMoves + '=' + oldMovesPresent[i].parameters[j].value;
} else if (oldMovesPresent[i].parameters[j].name == "link") {
oldMovesText += '|link' + numOldMoves + '=' + oldMovesPresent[i].parameters[j].value;
} else {
oldMovesText += oldMovesPresent[i].parameters[j].wikitext;
}
}
numOldMoves++;
}
if(result == "moved"){
from = '|from' + numOldMoves + '=' + rmCloser.title;
}
var newTextToAdd = '|date' + numOldMoves + '=' + date + from + '|destination' + numOldMoves + '=' + destination + '|result' + numOldMoves + '=' + result + '|link' + numOldMoves + '=' + link + '}}';
oldMovesText += newTextToAdd;
text = text.replace(oldMovesPresent[0].wikitext, oldMovesText);
for (var i = 1; i < oldMovesPresent.length; i++) {
text = text.replace(oldMovesPresent[i].wikitext, "");
}
}
talkpage.setPageText(text);
talkpage.setEditSummary('Closing requested move; ' + result + rmCloser.advert);
talkpage.save(Morebits.status.actionCompleted('Moved closed.'));
if(multiMove == true){
var otherDestinations = [];
var otherPages = [];
for(i=2; i<(numberOfMoves+1); i++){
var curr;
var dest;
for (var j = 0; j < template.parameters.length; j++) {
if (template.parameters[j].name == ("current" + i)) {
curr = template.parameters[j].value;
} else if (template.parameters[j].name == ("new" + i)) {
dest = template.parameters[j].value;
break;
}
}
if(curr != null && dest != null){
otherPages.push(curr);
otherDestinations.push(dest);
}
}
var pagesLeft = otherPages.length;
for(var j=0; j<otherPages.length; j++){
var otherTitle_obj = mw.Title.newFromText(otherPages[j]);
rmCloser.otherTalktitle = otherTitle_obj.getTalkPage().toText();
var otherPage = new Morebits.wiki.page(rmCloser.otherTalktitle, 'Adding {{old move}} to ' + rmCloser.otherTalktitle + '.');
otherPage.load(function(otherPage) {
var otherText = otherPage.getPageText();
var templatesOnOtherPage = extraJs.parseTemplates(otherText,false);
var otherOldMovesPresent = [];
for (var i = 0; i < templatesOnOtherPage.length; i++) {
if (templatesOnOtherPage[i].name.toLowerCase() == "old moves" || templatesOnOtherPage[i].name.toLowerCase() == "old move") {
otherOldMovesPresent.push(templatesOnOtherPage[i]);
}
}
var title = mw.Title.newFromText(otherPage.getPageName()).getSubjectPage().toText();
var OMcurr = otherPages[otherPages.indexOf(title)];
var OMdest = otherDestinations[otherPages.indexOf(title)];
var otherFrom = '';
if(OMdest == "?"){
OMdest == "";
}
var otherDestination = OMdest;
var otherArchives = otherText.match(/{{[Aa]rchives/);
if(otherArchives == null){
otherArchives = otherText.match(/{{[Aa]rchive box/);
if(otherArchives == null){
otherArchives = otherText.match(/{{[Aa]rchivebox/);
if(otherArchives == null){
otherArchives = otherText.match(/==.*==/);
}
}
}
if (otherOldMovesPresent.length == 0) {
if(result == "moved"){
otherFrom = '|from=' + OMcurr;
}
otherText = otherText.replace(otherArchives[0], '{{old move'+ '|date=' + date + otherFrom + '|destination=' + otherDestination + '|result=' + result + '|link=' + link +'}}\n\n' + otherArchives[0]);
} else if (otherOldMovesPresent.length == 1) {
var isValidFormat = false;
var isListFormat = false;
var numOldMoves = 0;
for (var i = 0; i < otherOldMovesPresent[0].parameters.length; i++) {
var parameterName = otherOldMovesPresent[0].parameters[i].name;
parameterName = parameterName.toString();
if (parameterName == "list") {
isListFormat = true;
break;
} else if (parameterName == "result1") {
isValidFormat = true;
numOldMoves++;
} else if (parameterName.includes("result")) {
numOldMoves++;
}
}
if (isValidFormat && !isListFormat) {
var oldMovesText = otherOldMovesPresent[0].wikitext;
numOldMoves++;
if(result == "moved"){
otherFrom = '|from' + numOldMoves + '=' + OMcurr;
}
var newTextToAdd = '|date' + numOldMoves + '=' + date + otherFrom + '|destination' + numOldMoves + '=' + otherDestination + '|result' + numOldMoves + '=' + result + '|link' + numOldMoves + '=' + link + '}}';
oldMovesText = oldMovesText.substring(0, oldMovesText.length-2) + newTextToAdd;
otherText = otherText.replace(otherOldMovesPresent[0].wikitext, oldMovesText);
} else if (isListFormat) {
if(result == "moved"){
otherFrom = '|from=' + OMcurr;
}
otherText = otherText.replace(otherArchives[0], '{{old move'+ '|date=' + date + otherFrom + '|destination=' + otherDestination + '|result=' + result + '|link=' + link +'}}\n\n' + otherArchives[0]);
} else {
var oldMovesText = '{{' + otherOldMovesPresent[0].name;
for (var i = 0; i < otherOldMovesPresent[0].parameters.length; i++) {
if (otherOldMovesPresent[0].parameters[i].name == "date") {
oldMovesText += '|date1=' + otherOldMovesPresent[0].parameters[i].value;
} else if (otherOldMovesPresent[0].parameters[i].name == "from") {
oldMovesText += '|name1=' + otherOldMovesPresent[0].parameters[i].value;
} else if (otherOldMovesPresent[0].parameters[i].name == "destination") {
oldMovesText += '|destination1=' + otherOldMovesPresent[0].parameters[i].value;
} else if (otherOldMovesPresent[0].parameters[i].name == "result") {
oldMovesText += '|result1=' + otherOldMovesPresent[0].parameters[i].value;
} else if (otherOldMovesPresent[0].parameters[i].name == "link") {
oldMovesText += '|link1=' + otherOldMovesPresent[0].parameters[i].value;
} else {
oldMovesText += otherOldMovesPresent[0].parameters[i].wikitext;
}
}
if(result == "moved"){
otherFrom = '|from2=' + OMcurr;
}
var newTextToAdd = '|date2=' + date + otherFrom + '|destination2=' + otherDestination + '|result2=' + result + '|link2=' + link + '}}';
oldMovesText += newTextToAdd;
otherText = otherText.replace(otherOldMovesPresent[0].wikitext, oldMovesText);
}
} else {
var oldMovesText = '{{Old moves';
var numOldMoves = 1;
for (var i = 0; i < otherOldMovesPresent.length; i++) {
for (var j = 0; j < otherOldMovesPresent[i].parameters.length; j++) {
if (otherOldMovesPresent[i].parameters[j].name == "date") {
oldMovesText += '|date' + numOldMoves + '=' + otherOldMovesPresent[i].parameters[j].value;
} else if (otherOldMovesPresent[i].parameters[j].name == "from") {
oldMovesText += '|name' + numOldMoves + '=' + otherOldMovesPresent[i].parameters[j].value;
} else if (otherOldMovesPresent[i].parameters[j].name == "destination") {
oldMovesText += '|destination' + numOldMoves + '=' + otherOldMovesPresent[i].parameters[j].value;
} else if (otherOldMovesPresent[i].parameters[j].name == "result") {
oldMovesText += '|result' + numOldMoves + '=' + otherOldMovesPresent[i].parameters[j].value;
} else if (otherOldMovesPresent[i].parameters[j].name == "link") {
oldMovesText += '|link' + numOldMoves + '=' + otherOldMovesPresent[i].parameters[j].value;
} else {
oldMovesText += otherOldMovesPresent[i].parameters[j].wikitext;
}
}
numOldMoves++;
}
if(result == "moved"){
otherFrom = '|from' + numOldMoves + '=' + OMcurr;
}
var newTextToAdd = '|date' + numOldMoves + '=' + date + otherFrom + '|destination' + numOldMoves + '=' + otherDestination + '|result' + numOldMoves + '=' + result + '|link' + numOldMoves + '=' + link + '}}';
oldMovesText += newTextToAdd;
otherText = otherText.replace(otherOldMovesPresent[0].wikitext, oldMovesText);
for (var i = 1; i < otherOldMovesPresent.length; i++) {
otherText = otherText.replace(otherOldMovesPresent[i].wikitext, "");
}
}
otherPage.setPageText(otherText);
otherPage.setEditSummary('Closing requested move; ' + result + rmCloser.advert);
otherPage.save(Morebits.status.actionCompleted('Moved closed.'));
pagesLeft--;
});
}
if(result == "moved"){
var waitInterval = setInterval(function(){
if(pagesLeft == 0){
rmCloser.movePages(rmCloser.title,destination,otherPages,otherDestinations,link);
clearInterval(waitInterval);
}
}, 500);
} else{
setTimeout(function(){ location.reload() }, 2000);
}
} else if(result == "moved"){
var emptyArray = [];
rmCloser.movePages(rmCloser.title,destination,emptyArray,emptyArray,link);
} else{
setTimeout(function(){ location.reload() }, 2000);
}
});
};
rmCloser.movePages = function rmCloserMovePages(curr1,dest1,currList,destList,link){
var numberToRemove = currList.length+1;
rmCloser.talktitle = mw.Title.newFromText(Morebits.pageNameNorm).getTalkPage().toText();
var pageAndSection = link;
var moveSummary = 'Moved per [[' + pageAndSection + ']]';
var rmtrReason = 'Per [[' + pageAndSection + ']].';
var form = new Morebits.quickForm();
form.append({
type: 'header',
label: 'Move pages'
});
form.append({
type: 'div',
className: 'rmCloserMovePages' + curr1,
label: curr1 + ' → ' + dest1
});
form.append({
type: 'button',
className: 'rmCloserMovePages' + curr1,
label: 'Move directly',
event: function() {
rmCloser.directMove(curr1,dest1,false,moveSummary);
for(var i=0; i<document.getElementsByClassName('rmCloserMovePages' + curr1).length; i++){
document.getElementsByClassName('rmCloserMovePages' + curr1)[i].style.display = 'none';
}
numberToRemove--;
}
});
if(!Morebits.userIsInGroup('sysop') && !Morebits.userIsInGroup('extendedmover')){
form.append({
type: 'button',
className: 'rmCloserMovePages' + curr1,
label: 'Submit technical request',
event: function() {
rmCloser.submitRMTR(curr1,dest1,rmtrReason);
for(var i=0; i<document.getElementsByClassName('rmCloserMovePages' + curr1).length; i++){
document.getElementsByClassName('rmCloserMovePages' + curr1)[i].style.display = 'none';
}
numberToRemove--;
}
});
} else{
form.append({
type: 'button',
className: 'rmCloserMovePages' + curr1,
label: 'Move directly without leaving a redirect',
event: function() {
rmCloser.directMove(curr1,dest1,true,moveSummary);
for(var i=0; i<document.getElementsByClassName('rmCloserMovePages' + curr1).length; i++){
document.getElementsByClassName('rmCloserMovePages' + curr1)[i].style.display = 'none';
}
numberToRemove--;
}
});
}
for(var i=0; i<currList.length; i++){
form.append({
type: 'div',
className: 'rmCloserMovePages' + currList[i],
label: currList[i] + ' → ' + destList[i]
});
form.append({
type: 'button',
className: 'rmCloserMovePages' + currList[i],
name: currList[i],
extra: destList[i],
label: 'Move directly',
event: function() {
rmCloser.directMove(this.name,this.extra,false,moveSummary);
for(var j=0; j<document.getElementsByClassName('rmCloserMovePages' + this.name).length; j++){
document.getElementsByClassName('rmCloserMovePages' + this.name)[j].style.display = 'none';
}
numberToRemove--;
}
});
if(!Morebits.userIsInGroup('sysop') && !Morebits.userIsInGroup('extendedmover')){
form.append({
type: 'button',
className: 'rmCloserMovePages' + currList[i],
name: currList[i],
extra: destList[i],
label: 'Submit technical request',
event: function() {
rmCloser.submitRMTR(this.name,this.extra,rmtrReason);
for(var j=0; j<document.getElementsByClassName('rmCloserMovePages' + this.name).length; j++){
document.getElementsByClassName('rmCloserMovePages' + this.name)[j].style.display = 'none';
}
numberToRemove--;
}
});
} else{
form.append({
type: 'button',
className: 'rmCloserMovePages' + currList[i],
name: currList[i],
extra: destList[i],
label: 'Move directly without leaving a redirect',
event: function() {
rmCloser.directMove(this.name,this.extra,true,moveSummary);
for(var j=0; j<document.getElementsByClassName('rmCloserMovePages' + this.name).length; j++){
document.getElementsByClassName('rmCloserMovePages' + this.name)[j].style.display = 'none';
}
numberToRemove--;
}
});
}
}
var formResult = form.render();
rmCloser.Window.setContent(formResult);
rmCloser.Window.display();
var moveInterval = setInterval(function(){
if(numberToRemove == 0){
rmCloser.Window.close();
clearInterval(moveInterval);
setTimeout(function(){ location.reload() }, 2000);
}
}, 500);
};
rmCloser.directMove = function rmCloserDirectMove(curr,dest,suppressRedirect,editSummary) {
var pageToMove = new Morebits.wiki.page(curr, 'Moving ' + curr + ' to ' + dest + '.');
pageToMove.setMoveDestination(dest);
pageToMove.setMoveSubpages(true);
pageToMove.setMoveTalkPage(true);
pageToMove.setMoveSuppressRedirect(suppressRedirect);
pageToMove.setEditSummary(editSummary + rmCloser.advert);
pageToMove.move(Morebits.status.actionCompleted('Moved.'));
};
rmCloser.submitRMTR = function rmCloserSubmitRMTR(curr,dest,reason) {
var rmtr = new Morebits.wiki.page('Wikipedia:Requested moves/Technical requests', 'Submitting request at WP:RM/TR');
rmtr.load(function(page) {
var text = rmtr.getPageText();
var textToFind = /\n{1,}(==== ?Requests to revert undiscussed moves ?====)/i;
var rmtrText = '{{subst:RMassist|1=' + curr + '|2=' + dest + '|reason=' + reason + '}}';
text = text.replace(textToFind, '\n' + rmtrText + '\n\n$1');
rmtr.setPageText(text);
rmtr.setEditSummary('Add request' + rmCloser.advert);
rmtr.save(Morebits.status.actionCompleted('Requested.'));
});
};
rmCloser.relist = function rmCloserRelist(e) {
if (e) e.preventDefault();
var title_obj = mw.Title.newFromText(Morebits.pageNameNorm);
rmCloser.talktitle = title_obj.getTalkPage().toText();
var talkpage = new Morebits.wiki.page(rmCloser.talktitle, 'Relisting.');
var relistingComment = document.getElementById('rmCloserRelistComment').value;
talkpage.load(function(talkpage) {
var text = talkpage.getPageText();
var templateFound = false;
var sig;
var line;
var templateIndex = -1;
var textToFind = text.split('\n');
for (var i = 0; i < textToFind.length; i++) {
line = textToFind[i];
if(templateFound == false){
if(/{{[Rr]equested move\/dated/.test(line)){
templateFound = true;
templateIndex = i;
}
} else if(templateFound == true){
if (/ \(UTC\)/.test(line)){
sig = line;
break;
}
}
}
text = text.replace(sig, sig + " {{subst:RM relist}}");
if(relistingComment != ''){
var nextSection = false;
for (var i = templateIndex+1; i < textToFind.length; i++) {
line = textToFind[i];
if (line.match(/^(==)[^=].+\1/)) {
nextSection = true;
var escapedLine = line.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
var regex = new RegExp('(' + escapedLine + ')(?![\s\S]*(' + escapedLine + '))', 'm');
text = text.replace(regex, ':<small>\'\'\'Relisting comment\'\'\': ' + relistingComment + ' ~~~~</small>\n\n' + line);
break;
}
}
if (!nextSection) {
text += '\n:<small>\'\'\'Relisting comment\'\'\': ' + relistingComment + ' ~~~~</small>';
}
}
talkpage.setPageText(text);
talkpage.setEditSummary('Relisted requested move' + rmCloser.advert);
talkpage.save(Morebits.status.actionCompleted('Relisted.'));
document.getElementById("requestedmovetag").innerHTML = "";
setTimeout(function(){ location.reload() }, 2000);
});
};
rmCloser.notify = function rmCloserNotify(e) {
if (e) e.preventDefault();
var wikiProjectTemplates = document.getElementsByClassName("wpb-project_link");
var wikiProjectNames = [];
var wikiProjects = [];
for(var i=0; i<wikiProjectTemplates.length; i++){
var wikiProjectName = wikiProjectTemplates[i].innerHTML;
var wikiProjectTalk = mw.Title.newFromText(wikiProjectTemplates[i].innerHTML).getTalkPage().toText();
if (!wikiProjectNames.includes(wikiProjectName)) {
wikiProjectNames.push(wikiProjectName);
wikiProjects.push(wikiProjectTalk);
}
}
var wikiProjectBannerShellHeaders = document.getElementsByClassName("wpb-header-combined");
for (var i=0; i<wikiProjectBannerShellHeaders.length; i++) {
var subprojectList = wikiProjectBannerShellHeaders[i];
if (subprojectList.hasChildNodes() && subprojectList.children.length > 2) {
subprojectList = subprojectList.children[2];
if (subprojectList.hasChildNodes() && subprojectList.children.length > 0) {
subprojectList = subprojectList.children;
for (var j=0; j<subprojectList.length; j++) {
var wikiProjectName = subprojectList[j].title;
var wikiProjectTalk = mw.Title.newFromText(subprojectList[j].title).getTalkPage().toText();
if (!wikiProjectNames.includes(wikiProjectName)) {
wikiProjectNames.push(wikiProjectName);
wikiProjects.push(wikiProjectTalk);
}
}
}
}
}
if(wikiProjects.length == 0){
mw.notify('No WikiProject banners found on this page');
} else{
var Window = new Morebits.simpleWindow(600, 450);
Window.setTitle( "Notify WikiProjects about requested move" );
Window.setScriptName('rmCloser');
Window.addFooterLink('Script documentation', 'User:TheTVExpert/rmCloser');
Window.addFooterLink('Give feedback', 'User talk:TheTVExpert/rmCloser');
var form = new Morebits.quickForm(rmCloser.notifyCheck);
form.append({
type: 'div',
label: 'WikiProjects with banners on this page:'
});
form.append({
type: 'checkbox',
name: 'wikiProject',
list: wikiProjects.map(function (wp) {
var wplabel = wikiProjectNames[wikiProjects.indexOf(wp)];
return { type: 'option', label: wplabel, value: wp };
})
});
if(wikiProjects[0] != 'none'){
form.append({ type: 'submit', label: 'Notify selected WikiProject(s)' });
}
var formResult = form.render();
Window.setContent(formResult);
Window.display();
}
};
rmCloser.notifyCheck = function(e) {
var form = e.target;
rmCloser.params = Morebits.quickForm.getInputData(form);
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(form);
var wikiProjectsToNotify = rmCloser.params.wikiProject;
if (wikiProjectsToNotify.length == 0) {
Morebits.status.error('Error', 'No WikiProjects selected');
} else {
var uniqueWikiProjects = [];
var wikiProjectCount = 0;
for (var i=0; i<wikiProjectsToNotify.length; i++) {
var talkpage = new Morebits.wiki.page(wikiProjectsToNotify[i], 'Checking ' + wikiProjectsToNotify[i] + '.');
talkpage.setFollowRedirect(true);
talkpage.load(function(talkpage) {
var wikiProjectToNotify = talkpage.getPageName();
if (!uniqueWikiProjects.includes(wikiProjectToNotify)) {
uniqueWikiProjects.push(wikiProjectToNotify);
}
wikiProjectCount++;
if (wikiProjectCount == wikiProjectsToNotify.length && uniqueWikiProjects.length > 0) {
rmCloser.notifyGetSection(uniqueWikiProjects);
}
});
}
}
};
rmCloser.notifyGetSection = function(wikiProjectsToNotify) {
var title_obj = mw.Title.newFromText(Morebits.pageNameNorm);
rmCloser.talktitle = title_obj.getTalkPage().toText();
var talkpage = new Morebits.wiki.page(rmCloser.talktitle, 'Getting section.');
talkpage.load(function(talkpage) {
var text = talkpage.getPageText();
var line;
var templateIndex = -1;
var rmSection;
var textToFind = text.split('\n');
for (var i = 0; i < textToFind.length; i++) {
line = textToFind[i];
if(/{{[Rr]equested move\/dated/.test(line)){
templateIndex = i;
break;
}
}
for (var i = templateIndex; i >= 0; i--) {
line = textToFind[i];
if (line.match(/^(==)[^=].+\1/)) {
rmSection = line.match(/^(==)[^=](.+)\1/)[2].trim();
break;
}
}
rmCloser.notifyEvaluate(wikiProjectsToNotify, rmSection);
});
};
rmCloser.notifyEvaluate = function(wikiProjectsToNotify, moveSection) {
var wikiProjectsNotified = [];
var wikiProjectCount = 0;
for (var j=0; j<wikiProjectsToNotify.length; j++) {
var talkpage = new Morebits.wiki.page(wikiProjectsToNotify[j], 'Notifying ' + wikiProjectsToNotify[j] + '.');
talkpage.setFollowRedirect(true);
talkpage.load(function(talkpage) {
var wikiProjectToNotify = talkpage.getPageName();
var text = talkpage.getPageText();
rmCloser.talktitle = mw.Title.newFromText(Morebits.pageNameNorm).getTalkPage().toText();
var pageAndSection = rmCloser.talktitle + "#" + moveSection;
var notified;
if(confirm("\"" + wikiProjectToNotify + "\" may have already been notified of the discussion. Do you wish to proceed?")){
text += "\n\n== Requested move at [[" + pageAndSection + "]] ==\n[[File:Information.svg|30px|left]] There is a requested move discussion at [[" + pageAndSection + "]] that may be of interest to members of this WikiProject. ~~~~";
talkpage.setPageText(text);
talkpage.setEditSummary('Notifying of [[' + pageAndSection + '\|requested move]]' + rmCloser.advert);
talkpage.save(Morebits.status.actionCompleted('Notified.'));
notified = true;
} else{
var cancelNotify = new Morebits.status('Error', 'Notification canceled', 'error');
notified = false;
}
if(notified){
wikiProjectsNotified.push(wikiProjectToNotify);
}
wikiProjectCount++;
if (wikiProjectCount == wikiProjectsToNotify.length && wikiProjectsNotified.length > 0) {
rmCloser.notifyListOnTalkPage(wikiProjectsNotified);
}
});
}
};
rmCloser.notifyListOnTalkPage = function(wikiProjectsNotified) {
var discussionPage = new Morebits.wiki.page(rmCloser.talktitle, 'Adding note about notification to requested move');
discussionPage.load(function(discussionPage) {
var discussionPageText = discussionPage.getPageText();
var templateFound = false;
var line;
var nextSection = false;
var textToFind = discussionPageText.split('\n');
for (var i = 0; i < textToFind.length; i++) {
line = textToFind[i];
if(templateFound == false){
if(/{{[Rr]equested move\/dated/.test(line)){
templateFound = true;
}
} else if(templateFound == true){
if (line.match(/^(==)[^=].+\1/)) {
nextSection = true;
var escapedLine = line.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
var regex = new RegExp('(' + escapedLine + ')(?![\s\S]*(' + escapedLine + '))', 'm');
if (wikiProjectsNotified.length == 1) {
var wikiProjectToNotify = wikiProjectsNotified[0];
discussionPageText = discussionPageText.replace(regex, ':<small>Note: [[' + wikiProjectToNotify + '|' + wikiProjectToNotify.slice(15) + ']] has been notified of this discussion. ~~~~</small>\n\n' + line);
} else {
var textToInsert = ':<small>Note: ';
for (var j=0; j<wikiProjectsNotified.length; j++) {
var wikiProjectToNotify = wikiProjectsNotified[j];
textToInsert += '[[' + wikiProjectToNotify + '|' + wikiProjectToNotify.slice(15) + ']]';
if (j == wikiProjectsNotified.length-2) {
if (wikiProjectsNotified.length == 2) {
textToInsert += ' and ';
} else {
textToInsert += ', and ';
}
} else if (j != wikiProjectsNotified.length-1) {
textToInsert += ', ';
}
}
textToInsert += ' have been notified of this discussion. ~~~~</small>\n\n';
discussionPageText = discussionPageText.replace(regex, textToInsert + line);
}
break;
}
}
}
if (!nextSection) {
if (wikiProjectsNotified.length == 1) {
var wikiProjectToNotify = wikiProjectsNotified[0];
discussionPageText+='\n:<small>Note: [[' + wikiProjectToNotify + '|' + wikiProjectToNotify.slice(15) + ']] has been notified of this discussion. ~~~~</small>';
} else {
discussionPageText += '\n:<small>Note: ';
for (var j=0; j<wikiProjectsNotified.length; j++) {
var wikiProjectToNotify = wikiProjectsNotified[j];
discussionPageText += '[[' + wikiProjectToNotify + '|' + wikiProjectToNotify.slice(15) + ']]';
if (j == wikiProjectsNotified.length-2) {
if (wikiProjectsNotified.length == 2) {
discussionPageText += ' and ';
} else {
discussionPageText += ', and ';
}
} else if (j != wikiProjectsNotified.length-1) {
discussionPageText += ', ';
}
}
discussionPageText += ' have been notified of this discussion. ~~~~</small>';
}
}
discussionPage.setPageText(discussionPageText);
discussionPage.setEditSummary('Added note about notifying WikiProject about requested move' + rmCloser.advert);
discussionPage.save(Morebits.status.actionCompleted('Note added.'));
setTimeout(function(){ location.reload() }, 2000);
});
};
//</nowiki>