//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>