User:Mr.Z-man/closeAFD2a.js

// WARNING: This is an experimental version of User:Mr.Z-man/closeAFD2.js // Some features may be broken or only partially implemented. // Using this version is only recommended if you're actively developing it.

mw.loader.using( ['mediawiki.util', 'mediawiki.api', 'jquery.ui'], function {	if (mw.config.get('wgNamespaceNumber') == 4 && (mw.config.get('wgTitle').indexOf('Articles for deletion/') === 0 && mw.config.get('wgTitle').indexOf('Wikipedia:Articles for deletion/Log/20' == -1)) || (mw.config.get('wgTitle').indexOf('Miscellany for deletion/') === 0) ) {

CloseAFD = { relisting: false, action: false, speedy: false, NAC: false, api: false, actionmap: { 'delete':'delete', 'keep':'keep', 'nocon':'no consensus', 'merge':'merge to ', 'redir':'redirect to ', 'delandred':'delete and redirect to ' },			token: false, titles: [], wikitext: false, actionsStarted: { 'notdoneyet':0, 'afdpage':0, 'delete':0, 'edit':0, 'edittalk':0, 'redirects':0 },			actionsFinished: { 'notdoneyet':0, 'afdpage':0, 'delete':0, 'edit':0, 'edittalk':0, 'redirects':0 },			months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], debate: mw.config.get('wgTitle').substr(mw.config.get('wgTitle').indexOf('/')+1), type: '', namespaces: {}, ns_aliases: {}, logs: {} };		switch (mw.config.get('wgTitle').split('/')[0]) { case "Articles for deletion": CloseAFD.type = 'AFD'; break; case "Miscellany for deletion": CloseAFD.type = 'MFD'; break; }

$(document).ready( function {			mw.util.addPortletLink( 'p-cactions', '#', 'Close', 'ca-closeAFD', 'Close '+CloseAFD.type );			if (CloseAFD.type == 'AFD') { // Relisting is uncommon at MFD				mw.util.addPortletLink( 'p-cactions', '#', 'Relist', 'ca-relistAFD', 'Relist '+CloseAFD.type );				}		} ); if (jQuery.inArray( "sysop", mw.config.get('wgUserGroups') ) == -1) { CloseAFD.NAC = true; }		// Handler for the close link in the top bar CloseAFD.close = function { $( "#closeAFD-dialog" ).show.dialog( { title: "Closing "+mw.config.get('wgTitle'),				width:400,				buttons: [ { text: "Close "+CloseAFD.type, click: CloseAFD.startCloseAction }, 				{ text: "Cancel", click: function {					$( this ).dialog( "close" )				} }]			} ); // We get the token now just to make the code less convoluted later CloseAFD.api = new mw.Api; params = { 'action':'query', 'meta':'tokens|siteinfo', 'siprop':'namespaces|namespacealiases', 'type': 'csrf' }			CloseAFD.api.get(params) .done ( function (data) {				CloseAFD.token = data['query']['tokens']['csrftoken'];				var nsdata = data['query']['namespaces'];				for (var id in nsdata) {					CloseAFD.namespaces[nsdata[id]['id']] = nsdata[id];				}				for (var i=0; i<data['query']['namespacealiases'].length; i++) {					var a = data['query']['namespacealiases'][i];					CloseAFD.ns_aliases[a['*'].toLowerCase] = a['id'];				}			}) return false; }

// Handler for the relist link in the top bar CloseAFD.relist = function { CloseAFD.relisting = true $( "#closeAFD-relist-dialog" ).show.dialog( { title: "Relisting "+mw.config.get('wgTitle'),				width:600,				buttons: [ { text: "Relist", click: CloseAFD.startRelistAction }, 				{ text: "Cancel", click: function {					$( this ).dialog( "close" )				} }]			} ); $('#closeAFD-relist-number').val( $('.xfd_relist').length + 1 ); $('#closeAFD-relist-logs').text("Getting AfD logs..."); CloseAFD.api = new mw.Api; params = { 'action':'tokens', 'type':'edit' }			CloseAFD.api.get(params) .done ( function (data) {				CloseAFD.token = data['tokens']['edittoken'];			}) params = { 'action':'query', 'list':'embeddedin', 'eifilterredir':'nonredirects', 'einamespace':'4', 'eilimit':'500', 'eititle':mw.config.get('wgPageName') }			CloseAFD.api.get(params) .done ( function (data) {				var oldlogtitle = '';				for (var i=0; i');				var oldlog = $('').text("Old log: ")				var oll = $('').attr('href', mw.config.get('wgArticlePath').replace('$1', oldlogtitle.replace(/_/g, ' ')))				.text(oldlogtitle)				$(oldlog).append(oll)				$(logs).append(oldlog);				var newlog = $('').text("New log: ")				var nll = $('').attr('href', mw.config.get('wgArticlePath').replace('$1', newlogtitle.replace(/_/g, ' '))) .text(newlogtitle) $(newlog).append(nll) $(logs).append(newlog); $('#closeAFD-relist-logs').text(''); $('#closeAFD-relist-logs').append(logs); CloseAFD.logs['old'] = oldlogtitle; CloseAFD.logs['new'] = newlogtitle; })			.fail( function (error) { $('#closeAFD-relist-logs').css('color', 'red').text("Error: "+error); })			return false;		}		// Check if we're completely done		CloseAFD.checkDone = function {			if (CloseAFD.actionsStarted['notdoneyet'] == CloseAFD.actionsFinished['notdoneyet'] && CloseAFD.actionsStarted['afdpage'] == CloseAFD.actionsFinished['afdpage'] && CloseAFD.actionsStarted['delete'] == CloseAFD.actionsFinished['delete'] && CloseAFD.actionsStarted['edit'] == CloseAFD.actionsFinished['edit'] && CloseAFD.actionsStarted['edittalk'] == CloseAFD.actionsFinished['edittalk'] && CloseAFD.actionsStarted['redirects'] == CloseAFD.actionsFinished['redirects']) {				elem = $('#closeAFD-action5');				if (CloseAFD.relisting) {					elem = $('#closeAFD-relist-done');				}				$(elem).css('color', 'darkgreen').css('font-weight', 'bold').text("Done – ");				link = $("").attr('href', "//en.wikipedia.org/wiki/"+mw.config.get('wgPageName')+"?action=purge")				.text("Reload page").css('color', '#0645AD');				$(elem).append(link);			}

}		// Edit a page // pageid/title - page to edit // newxtext - new text for page // summary - edit summary // callback - function to call on success // errorElem - element to put an error message in		// incr - Variable to increment CloseAFD.edit = function(pageid, title, newtext, summary, callback, incr) { if (/^\s*$/.test(newtext)) { // making sure we don't accidentally blank the page if (CloseAFD.relisting) { $('#closeAFD-relist-error').css('color', 'red').text('Error when trying to edit "'+title+'"'); } else { $('#closeAFD-error').css('color', 'red').text('Error when trying to edit "'+title+'"') }				CloseAFD.actionsFinished[incr]++; CloseAFD.checkDone; return false; }			CloseAFD.actionsStarted[incr]++; editparams = {'action':'edit'}; if (pageid) { editparams['pageid'] = pageid; } else if (title) { editparams['title'] = title; }			editparams['text'] = newtext; editparams['summary'] = summary; editparams['token'] = CloseAFD.token; CloseAFD.api.post(editparams) .fail( function (error) {				if (CloseAFD.relisting) {					$('#closeAFD-relist-error').css('color', 'red').text("Error: "+error);				} else {					$('#closeAFD-error').css('color', 'red').text("Error: "+error);				}				CloseAFD.actionsFinished[incr]++;				CloseAFD.checkDone;			}) .done(function {				CloseAFD.actionsFinished[incr]++;				callback				CloseAFD.checkDone;			}) }		// Parameters same as .edit CloseAFD.deletePage = function(pageid, title, summary, callback, incr) { CloseAFD.actionsStarted[incr]++; delparams = {'action':'delete', 'reason':summary, 'token':CloseAFD.token };			if (pageid) { delparams['pageid'] = pageid; } else if (title) { delparams['title'] = title; }			CloseAFD.api.post(delparams) .fail( function (error) {				$('#closeAFD-error').css('color', 'red').text("Error: "+error);				CloseAFD.actionsFinished[incr]++;				CloseAFD.checkDone;			}) .done(function(data) {				CloseAFD.actionsFinished[incr]++;				callback(data)				CloseAFD.checkDone;			}) }		// Get the talk-space page for a given page // Returns an empty string if the page is already a talk page CloseAFD.getTalk = function(title) { if (title[0] == ':') { title = title.slice(1) }			var nsdetect = title.split(':'); if (nsdetect.length == 1) { // ns 0 return "Talk:"+title }			var poss = nsdetect[0].toLowerCase; for (var ns in CloseAFD.namespaces) { nsn = parseInt(ns) if (nsn == 0) { continue; }				nsinfo = CloseAFD.namespaces[ns]; if (poss == nsinfo['*'].toLowerCase || poss == nsinfo['canonical'].toLowerCase) { if (nsn < 0 || nsn % 2 == 1) { // Talk or special page return ''; }					newns = CloseAFD.namespaces[nsn+1]['*']; return title.replace(/^[a-z ]*\:(.*)$/i, newns+':$1') }			}			if (typeof CloseAFD.ns_aliases[poss] != 'undefined') { if (CloseAFD.ns_aliases[poss] %2 == 1) { return ''; // Alias for a talk NS				} newns = CloseAFD.namespaces[(CloseAFD.ns_aliases[poss] + 1).toString]['*'] return title.replace(/^[a-z ]*\:(.*)$/i, newns+':$1') }			return "Talk:"+title; // didn't match anything, must be ns 0 }		// This gets called when you click the Relist button CloseAFD.startRelistAction = function { $('#closeAFD-relist-comment').prop('disabled', true); $('#closeAFD-relist-number').prop('disabled', true); $('#closeAFD-relist-old-status').text('Getting logs...'); $('#closeAFD-relist-afd-status').text('Getting AfD page...'); params = { 'action':'query', 'prop':'revisions', 'rvprop':'content', 'titles':CloseAFD.logs['old']+'|'+CloseAFD.logs['new']+'|'+mw.config.get('wgPageName'), 'indexpageids':'1' }			CloseAFD.api.get(params) .done ( function (data) {				var oldlogtext = ;				var newlogtext = ;				var afdtext = '';				for (var i=0; i<data['query']['pageids'].length; i++) {					pageid = data['query']['pageids'][i];					title = data['query']['pages'][pageid]['title'];					if (title == CloseAFD.logs['old']) {						oldlogtext = data['query']['pages'][pageid]['revisions'][0]['*'];					} else if (title == CloseAFD.logs['new']) {						newlogtext = data['query']['pages'][pageid]['revisions'][0]['*'];					} else {						afdtext = data['query']['pages'][pageid]['revisions'][0]['*'];					}				}					// Check the old log first because it's the easiest way to ensure no one already relisted it				var t = RegExp.quote(mw.config.get('wgPageName').replace(/_/g, ' '))				var patt = new RegExp("", 'i' );				var res = patt.exec(oldlogtext)				if (res) {					$('#closeAFD-relist-old-status').css('color', 'red').text("AfD appears to be relisted already!"); $('#closeAFD-relist-afd-status').text(''); return false; }				// Now we also need to check that the AfD isn't closed if (afdtext.indexOf('xfd-closed') != -1) { $('#closeAFD-relist-afd-status').css('color', 'red').text("AFD is already closed!"); $('#closeAFD-relist-old-status').text(''); return false; }				// Okay, now we can actually make the edits $('#closeAFD-relist-old-status').text('Editing logs...'); $('#closeAFD-relist-afd-status').text('Editing AfD page...'); summary = "Relisting "+mw.config.get('wgPageName').replace(/_/g, ' ')+"" // New log: var newlogreg = new RegExp("", "i"); newlogtext = newlogtext.replace(newlogreg, "\n{"+"{"+mw.config.get('wgPageName').replace(/_/g, ' ')+"}}"); // Old log: var oldlogreg = new RegExp("(\\{\\{"+t+"\\}\\})", 'i' ); oldlogtext = oldlogtext.replace(oldlogreg, ""); // Afd page: var relistcomment = false; if ($('#closeAFD-relist-comment').val.length === 0) { relistcomment = $('#closeAFD-relist-comment').val; }				var relistnumber = $('#closeAFD-relist-number').val.toString; afdtext += '\n{'+'{subst:relist'; if (relistcomment) { if (relistcomment.indexOf(''+'~') == -1) { relistcomment += ' '+''; }					afdtext += '|'+relistcomment+'|'+relistnumber; } else { afdtext += '|2='+relistnumber; }				afdtext += '}}'; afdtext = afdtext.replace(/Wikipedia:Articles for deletion\/Log\/\d{4} \D{4,9} \d{1,2}#/i, CloseAFD.logs['new']+"#"); CloseAFD.edit('', CloseAFD.logs['new'], newlogtext, summary, function(data) {					$('#closeAFD-relist-new-status').css('color', 'darkgreen').text("New log updated");				}, 'edit') CloseAFD.edit('', CloseAFD.logs['old'], oldlogtext, summary, function(data) {					$('#closeAFD-relist-old-status').css('color', 'darkgreen').text("Old log updated");				}, 'edit') CloseAFD.edit('', mw.config.get('wgPageName'), afdtext, summary, function(data) {					$('#closeAFD-relist-afd-status').css('color', 'darkgreen').text("AfD page edited");				}, 'edit') })			.fail( function (error) { $('#closeAFD-relist-old-status').text(''); $('#closeAFD-relist-afd-status').css('color', 'red').text("Error: "+error); })					}		// This gets called when you click the Close button		CloseAFD.startCloseAction = function {			$( this ).dialog( "close" );			$( "#closeAFD-closestatus-dialog" ).show.dialog( { title: "Closing "+mw.config.get('wgTitle'), width:400, close: function( event, ui ) { CloseAFD.reset; } } );			var selected = $('input[name="closeAFD-action"]:checked');			if (typeof $(selected).val == "undefined") {				$( "#closeAFD-closestatus-dialog" ).dialog( "close" );				return false;			}			var patt = /closeAFD-([a-z]+)/;			CloseAFD.action = patt.exec($(selected).attr('id'))[1];			CloseAFD.speedy = $('#closeAFD-speedy').prop('checked');			// Get wikitext of AFD page			$('#closeAFD-AFDpage').text("Fetching "+CloseAFD.type+" page...");			var params = {				'action':'query',				'prop':'revisions',				'titles':mw.config.get('wgPageName'),				'rvprop':'timestamp|content'			}			CloseAFD.api.get(params)			.fail( function (error) { $('#closeAFD-error').text("Error: "+error); })			.done( function (data) { var pageid = mw.config.get('wgArticleId').toString; CloseAFD.wikitext = data['query']['pages'][pageid]['revisions'][0]['*'] // Check to make sure it's not already closed if (CloseAFD.wikitext.indexOf('xfd-closed') != -1) { $('#closeAFD-AFDpage').css('color', 'red').text("AFD is already closed!"); return false; }				// Get the articles involved var patt = null; if (CloseAFD.type == 'AFD') { patt = /\{\{la\|([^\}]+)\}\}/gi } else if (CloseAFD.type == 'MFD') { patt = /\{\{pagelinks\|([^\}]+)\}\}/gi }				var res = patt.exec(CloseAFD.wikitext); while (res != null) { CloseAFD.titles.push(res[1]); res = patt.exec(CloseAFD.wikitext) }				// Can't find any templates? Use the subpage if (CloseAFD.titles.length == 0) { CloseAFD.titles.push(CloseAFD.debate.replace(/ \(\w+ nomination\)/, '') ); }				// More than 1 title, verify we want them all if (CloseAFD.titles.length > 1) { CloseAFD.checkMultipleTitles; } else { CloseAFD.finishCloseAction; }			})		}		// If we find multiple titles check that we want to apply the result to all of them		CloseAFD.checkMultipleTitles = function {			$('#closeAFD-multititles').append($(' ').css('color', '#ED4200') .html('Note: There appear to be multiple articles nominated. Uncheck any you do not want the closing action(s) to apply to, then click "Continue" '));			for (var i=0; i'+				' '				$('#closeAFD-multititles').append(c);				var href = mw.config.get('wgArticlePath').replace('$1', CloseAFD.titles[i].replace(/_/g, ' '));				$('#closeAFD-tlabel-'+i.toString).append($('').attr('href', href).text(CloseAFD.titles[i]));			}			$('#closeAFD-multititles').append($(' '));			$('#closeAFD-multititles').append($('').css('color', 'darkblue').css('font-weight','bold').text('Continue').attr('id', 'closeAFD-multititles-ready').attr('href','#'));			$('#closeAFD-multititles').slideDown;			$('#closeAFD-multititles-ready').on('click', function { var num = 0; for (var i=0; i<CloseAFD.titles.length; i++) { if (!$('#closeAFD-title-'+i.toString).prop('checked') ) { CloseAFD.titles[i] = false; } else { num++ }				}				if (num == 0) { $( "#closeAFD-closestatus-dialog" ).dialog( "close" ); return false; }				$('#closeAFD-multititles').slideUp; CloseAFD.finishCloseAction; return false; })		}		// Now that we know what we want to do and where, actually do it		CloseAFD.finishCloseAction = function {			// Assemble the closing statement			var resultstr = "";			var summary = ;			if (CloseAFD.speedy) {				resultstr += 'speedy ';				summary += 'speedy '			}			if (CloseAFD.action != 'other') {				resultstr += CloseAFD.actionmap[CloseAFD.action];				summary += CloseAFD.actionmap[CloseAFD.action];				if (CloseAFD.action == 'merge' || CloseAFD.action == 'redir' || CloseAFD.action == 'delandred') {					resultstr += + $(;					summary += + $('';				}								} else {				resultstr += $("#closeAFD-other-action").val;				summary += $("#closeAFD-other-action").val;			}			var editsum = "Closing debate, result was "+summary			resultstr += ". ";			resultstr += $('#closeAFD-rationale').val;			if (CloseAFD.NAC) { resultstr += ' {'+'{subst:nac}}'; editsum+= ' (non-admin closure)'; }			resultstr += ' '+'\n'; // Remove the template and add the closing templates var newtext = CloseAFD.wikitext; if (CloseAFD.type == 'AFD') { newtext = newtext.replace(/\{\{REMOVE THIS TEMPLATE WHEN CLOSING THIS AfD\|\w+\}\}/, ''); newtext = '{'+'{subst:Afd top}}'+resultstr+newtext+'\n{{subst:Afd bottom}'+'}' } else if (CloseAFD.type == 'MFD') { newtext = '{'+'{subst:Mfd top}}'+resultstr+newtext+'\n{{subst:Mfd bottom}'+'}' }			$('#closeAFD-AFDpage').text("Saving "+mw.config.get('wgTitle')+'...'); CloseAFD.actionsStarted['notdoneyet'] = 1; CloseAFD.edit(mw.config.get('wgArticleId').toString, '', newtext, editsum, function (data) {				$('#closeAFD-AFDpage').css('color', 'darkgreen').text(mw.config.get('wgTitle')+" closed.");			}, 'afdpage'); // Get the nomination date var params = { 'action':'query', 'prop':'revisions', 'pageids':mw.config.get('wgArticleId'), 'rvprop':'timestamp', 'rvdir':'newer', 'rvlimit':'1' }			CloseAFD.api.get(params) .fail( function (error) {				$('#closeAFD-error').text("Error: "+error);			}) .done( function (result) {				timestamp = result['query']['pages'][mw.config.get('wgArticleId').toString]['revisions'][0]['timestamp'];				var d = new Date(timestamp);				var nomdate = d.getUTCDate.toString+' '+CloseAFD.months[d.getUTCMonth]+' '+d.getUTCFullYear.toString;				var d2 = new Date;				var curdate = d2.getUTCDate.toString+' '+CloseAFD.months[d2.getUTCMonth]+' '+d2.getUTCFullYear.toString;				// Set edit summary				var editsum = +mw.config.get('wgPageName').replace(/_/g, ' ')+' closed as '+summary				// Figure out which pages/talk pages exist				if (CloseAFD.action == 'delete' || CloseAFD.action == 'delandred') {					$('#closeAFD-action2').text('Finding page(s) to delete...');				} else {					$('#closeAFD-action1').text('Finding page(s) to edit...');				}				var tlist = ;				for (var i=0; i<CloseAFD.titles.length; i++) {					if (CloseAFD.titles[i]) { tlist += CloseAFD.titles[i]; t = CloseAFD.getTalk(CloseAFD.titles[i]) if (t != '') { tlist += t+'|'; }						if (i != (CloseAFD.titles.length-1)) { tlist+='|'; }					}				}				params = { 'action':'query', 'titles':tlist, 'indexpageids': '1', 'prop':'revisions', 'rvprop':'content', 'redirects':'1' }				CloseAFD.api.get(params) .fail( function (error) {					$('#closeAFD-error').text("Error: "+error);				}) .done( function (data) {					if (CloseAFD.action == 'delete' || CloseAFD.action == 'delandred') {						$('#closeAFD-action2').text('Deleting page(s)...');					} else {						$('#closeAFD-action1').text('Editing page(s)...');						$('#closeAFD-action3').text('Tagging talk page(s)...')					}				// Now figure out what to do with the article					switch(CloseAFD.action) { 					case 'delete':						// Delete the pages that exist						for (var i=0; i<data['query']['pageids'].length; i++) {							id = parseInt(data['query']['pageids'][i]);							if (id > 0) {								CloseAFD.deletePage(id, '', editsum, function { if (CloseAFD.actionsStarted['delete'] == CloseAFD.actionsFinished['delete']) { $('#closeAFD-action2').css('color', 'darkgreen').text("Page(s) deleted"); }								}, 'delete');							}						}						break;					case 'merge':					case 'keep':					case 'nocon':					case 'other':						var mtitles = []						for (var i=0; i<data['query']['pageids'].length; i++) {							var id = parseInt(data['query']['pageids'][i]);							var p = data['query']['pages'][id.toString];							if (p['ns'] % 2 == 1) { // Talk pages								var wikitext = 								if (parseInt(id) > 0) {									wikitext = p['revisions'][0]['*'];								}								CloseAFD.oldafd(p['title'], editsum, summary, wikitext, nomdate);							} else if (id > 0) {								var newtext = p['revisions'][0]['*'];								if (CloseAFD.type == 'AFD') {									newtext = newtext.replace(/\s*/, );								} else if (CloseAFD.type == 'MFD') {									newtext = newtext.replace(/?\{\{mfdx?(\|.*?)?\}\}(<\/noinclude>)?\s*?/i, ); //Standard templates									newtext = newtext.replace(/<span id=\"mfd\".*?\[\[Category:Miscellaneous pages for deletion\|\{\{PAGENAME\}\}\]\]\s*/i, ) // md1-inline }								if (CloseAFD.action == 'merge') { var target = $('#closeAFD-target').val; var mergetemplate = 'Afd-merge-to'; if (CloseAFD.type == 'MFD') { mergetemplate = 'Mfd-merge-to'; }									newtext = '{'+'{'+mergetemplate+'|'+target+'|'+CloseAFD.debate+'|'+curdate+'}}\n' + newtext CloseAFD.edit(id, '', newtext, editsum, function(data) {										if (CloseAFD.actionsStarted['edit'] == CloseAFD.actionsFinished['edit']) {											$('#closeAFD-action1').css('color', 'darkgreen').text("Merge tags added");										}									}, 'edit') mtitles.push(p['title']) } else { CloseAFD.edit(id, '', newtext, editsum, function(data) {										if (CloseAFD.actionsStarted['edit'] == CloseAFD.actionsFinished['edit']) {											$('#closeAFD-action1').css('color', 'darkgreen').text(CloseAFD.type+" tag(s) removed");										}									}, 'edit') }							} 						}						if (CloseAFD.action == 'merge') { CloseAFD.mergefrom(mtitles, editsum, curdate) }						break; case 'delandred': // START HERE FOR MFD WORK // Delete the non-talk pages for (var i=0; i<data['query']['pageids'].length; i++) { var id = parseInt(data['query']['pageids'][i]); var p = data['query']['pages'][id.toString]; if (p['ns'] == 0 && id > 0) { CloseAFD.deletePage(id, , editsum, function(data) {									var target = $('#closeAFD-target').val;									var templatedate = CloseAFD.months[d2.getUTCMonth]+' '+d2.getUTCFullYear.toString;									var text = '#REDIRECT '+target+'\n{'+'{uncategorized|date='+templatedate+'}}'									var title = data['delete']['title'];									CloseAFD.edit(, title, text, editsum, function(d) { if (CloseAFD.actionsStarted['edit'] == CloseAFD.actionsFinished['edit']) { $('#closeAFD-action1').css('color', 'darkgreen').text("Page(s) redirected"); }									}, 'edit')									if (CloseAFD.actionsStarted['delete'] == CloseAFD.actionsFinished['delete']) {										$('#closeAFD-action2').css('color', 'darkgreen').text("Page(s) deleted");									}								}, 'delete'); } else if (p['ns'] == 1) { var wikitext = '' if (p > 0) { wikitext = p['revisions'][0]['*']; }								CloseAFD.oldafd(p['title'], editsum, summary, wikitext, nomdate); }						}						break; case 'redir': var target = $('#closeAFD-target').val; var templatedate = CloseAFD.months[d2.getUTCMonth]+' '+d2.getUTCFullYear.toString; var text = '#REDIRECT '+target+'\n{'+'{uncategorized|date='+templatedate+'}}' for (var i=0; i<data['query']['pageids'].length; i++) { var id = parseInt(data['query']['pageids'][i]); var p = data['query']['pages'][id.toString]; if (p['ns'] == 1) { var wikitext = '' if (id > 0) { wikitext = p['revisions'][0]['*']; }								CloseAFD.oldafd(p['title'], editsum, summary, wikitext, nomdate); } else if (p['ns'] == 0) { CloseAFD.edit('', p['title'], text, editsum, function(data) {									if (CloseAFD.actionsStarted['edit'] == CloseAFD.actionsFinished['edit']) {										$('#closeAFD-action1').css('color', 'darkgreen').text("Page(s) redirected");									}								}, 'edit') } 						}						break; }					// Delete redirects if ($('#closeAFD-delredir').prop('checked')) { $('#closeAFD-action4').text('Finding redirect(s) to delete...'); for (var i=0; i<data['query']['pageids'].length; i++) { id = data['query']['pageids'][i]; t = data['query']['pages'][id]['title'] var total = 0 params = { 'action':'query', 'prop':'redirects', 'titles':t, 'rdlimit':'100', 'indexpageids':'1' }							CloseAFD.api.get(params) .fail( function (error) {								$('#closeAFD-error').css('color', 'red').text("Error: "+error);							}) .done(function(res) {								var pid = res['query']['pageids'][0];								if (res['query']['pages'][pid]['redirects']) {									var redirs = res['query']['pages'][pid]['redirects']									for (var j=0; j<redirs.length; j++) {										var pageid = redirs[j]['pageid'];										CloseAFD.deletePage(pageid, '', editsum, function { if (CloseAFD.actionsStarted['redirects'] == CloseAFD.actionsFinished['redirects']) { $('#closeAFD-action4').css('color', 'darkgreen').text("Redirect(s) deleted"); }										}, 'redirects');									}									total+=redirs.length;								}								if (total == 0 && i == data['query']['pageids'].length) {									$('#closeAFD-action4').css('color', 'darkgreen').text("No redirects to delete");								}							}) }						CloseAFD.actionsFinished['notdoneyet'] = 1; CloseAFD.checkDone; } else { CloseAFD.actionsFinished['notdoneyet'] = 1; CloseAFD.checkDone; }				});			});		}

// Add the Afd-merge-from template to the talk page of the target article CloseAFD.mergefrom = function(fromtitles, summary, date) { var target = $('#closeAFD-target').val t = 'Talk:'+target; var prepend = ''; for (var i=0; i<fromtitles.length; i++) { prepend+= '{'+'{Afd-merge from|'+fromtitles[i]+'|'+CloseAFD.debate+'|'+date+'}}\n' }			CloseAFD.actionsStarted['edittalk']++; editparams = {'action':'edit', 'title': t,				'summary': summary, 'prependtext': prepend, 'token': CloseAFD.token };					CloseAFD.api.post(editparams) .fail( function (error) {				$('#closeAFD-error').css('color', 'red').text("Error: "+error);				CloseAFD.actionsFinished['edittalk']++;				CloseAFD.checkDone;			}) .done(function {				CloseAFD.actionsFinished['edittalk']++;				if (CloseAFD.actionsStarted['edittalk'] == CloseAFD.actionsFinished['edittalk']) {					$('#closeAFD-action1').css('color', 'darkgreen').text("Merge tags added");				}				CloseAFD.checkDone;			}) }

// Add the oldafdmulti template to the talk page CloseAFD.oldafd = function(title, summary, action, wikitext, date) { var oldafdmulti = '' if (old) { newtext = wikitext.replace(patt, '\n'+oldafdmulti+'\n'); } else { // Talk page layout is too complicated to automate, so I'm not even going to try newtext = oldafdmulti+'\n'+wikitext; }			CloseAFD.edit('', title, newtext, summary, function(data) {				if (CloseAFD.actionsStarted['edittalk'] == CloseAFD.actionsFinished['edittalk']) {					$('#closeAFD-action3').css('color', 'darkgreen').text("Talk page(s) tagged");				}			}, 'edittalk') }		$(document).on('click', '#ca-closeAFD', CloseAFD.close); $(document).on('click', '#ca-relistAFD', CloseAFD.relist); CloseAFD.reset = function { $('#closeAFD-AFDpage').empty; $('#closeAFD-multititles').empty; $('#closeAFD-action1').empty; $('#closeAFD-action2').empty; $('#closeAFD-action3').empty; $('#closeAFD-action4').empty; $('#closeAFD-action5').empty; $('#closeAFD-error').empty; CloseAFD.titles = []; }		// HTML for closing dialog $('#bodyContent').before(' '+			' <input type="checkbox" name="closeAFD-speedy" id="closeAFD-speedy" /><label for="closeAFD-speedy">Speedy: '+			' '+			' <input type="radio" name="closeAFD-action" id="closeAFD-delete" /><label for="closeAFD-delete">Delete '+			'<input type="radio" name="closeAFD-action" id="closeAFD-keep" /><label for="closeAFD-keep">Keep '+			'<input type="radio" name="closeAFD-action" id="closeAFD-nocon" /><label for="closeAFD-nocon">No consensus '+			'<input type="radio" name="closeAFD-action" id="closeAFD-merge" /><label for="closeAFD-merge">Merge '+			' '+			'<input type="radio" name="closeAFD-action" id="closeAFD-redir" /><label for="closeAFD-redir">Redirect '+			' <input type="radio" name="closeAFD-action" id="closeAFD-delandred" /><label for="closeAFD-delandred">Delete & redirect '+			'<input type="radio" name="closeAFD-action" id="closeAFD-other" /><label for="closeAFD-other">Other: '+ '<input type="text" size=15 disabled=disabled id="closeAFD-other-action" /> '+			' '+			'<input type="checkbox" name="closeAFD-delredir" id="closeAFD-delredir" /><label for="closeAFD-delredir">Delete redirects '+ ' '+			'<label for="closeAFD-delredir">Target page: <input type="text" name="closeAFD-target" id="closeAFD-target" /> '+ ' Additional closing rationale (optional): '+ '<textarea id="closeAFD-rationale" rows=4 cols=100> '+ ' ');		$('#closeAFD-delrediropt').hide;		$('#closeAFD-targetopt').hide;		// HTML for closing status dialog		$('#bodyContent').before(' '+ ' '+		' '+		' '+		' '+		' '+		' '+		' '+		' '+		' ');		// HTML for relist dialog		$('#bodyContent').before(' '+ ' '+		' <ul><li><label for="closeAFD-relist-comment">Optional comments: '+ '<input style="width:70%" type="text" id="closeAFD-relist-comment"> </li>'+ '<li><label for="closeAFD-relist-number">Relist number: '+ '<input size="2" maxlength="1" type="text" id="closeAFD-relist-number"> </li></ul> '+ ' '+		' '+		' '+		' '+		' '+		' ');		// Hide deletion options from non-admins		if ( CloseAFD.NAC ) {			$(".closeAFD-nac").hide;		}		// Adjust visibility of delete redirects and target page options based on what close option is selected		$('input[name="closeAFD-action"]').change(function { if ((!CloseAFD.NAC) && ($('#closeAFD-delete').prop('checked') || $('#closeAFD-delandred').prop('checked') || $('#closeAFD-other').prop('checked'))) { $('#closeAFD-delrediropt').slideDown; if ($('#closeAFD-delete').prop('checked') ) { $('#closeAFD-delredir').prop('checked', true); } else { $('#closeAFD-delredir').prop('checked', false); }			} else { $('#closeAFD-delredir').prop('checked', false); $('#closeAFD-delrediropt').slideUp; }			if ($('#closeAFD-other').prop('checked') ) { $('#closeAFD-other-action').prop('disabled', false); } else { $('#closeAFD-other-action').prop('disabled', true); }			if ($('#closeAFD-merge').prop('checked') || $('#closeAFD-delandred').prop('checked') || $('#closeAFD-redir').prop('checked')) { $('#closeAFD-targetopt').slideDown; } else { $('#closeAFD-targetopt').slideUp; }		});	}	RegExp.quote = function(str) {		return (str+'').replace(/([.?*+^$[\]\\{}|-])/g, "\\$1");	}; })