From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

//<nowiki>

//Credits to Equazcion, Evad37, and Abelmoschus Esculentus

//Date: 6 Mar 2019

//Forked from [[User:Abelmoschus Esculentus/DiscussionCloser.js]

//Maintained by DannyS712

var DiscussionCloser_config = {

	name: '[[User:DannyS712/DiscussionCloser|DiscussionCloser]]',

	version: '1.7.3',

	debug: false

};

var DiscussionCloser_ending = ' (' + DiscussionCloser_config.name + ' v.' + DiscussionCloser_config.version + ')';



/* HELPER FUNCTIONS */

function dc_make_bottom(template){

	var bottom;

	switch (template) {

		case "atop":

		case "atopr":

		case "atopy":

		case "atopg":

		case "subst:RMT":

			bottom = "abot";

			break;

		case "hat":

			bottom = "hab";

			break;

		default:

			bottom = "closed rfc bottom";

			break;

	}

	bottom = "{{" + bottom + "}}";

	return bottom;

}

function alreadyClosed ( content ){

	content = content.toLowerCase();

	if (content.includes('{{atop') ||

		content.includes('{{hat') ||

		content.includes('{{abot') ||

		content.includes('{{archive') ||

		content.includes('{{rfctop') ||

		content.includes('{{rfc bottom') ||

		content.includes('{{archive bottom') ||

		content.includes('{{hidden archive bottom') ||

		content.includes('<!-- template:rm top -->')

	) return true;

	return false;

}

function dc_radio(i) {

	$('#DC-e').val("");

	if (i == 1) {

		$('#DC-e').prop('disabled', false);

	}

	if (i == 2) {

		$('#DC-e').prop('disabled', true);

	}

}



/* MAIN FUNCTIONs */



function dc_init(){

	if ((($('#ca-addsection').length > 0) ||

				(mw.config.get('wgPageName') == 'Wikipedia:Administrators\'_noticeboard/Edit_warring') ||

				(mw.config.get('wgPageName') == 'Wikipedia:In_the_news/Candidates')) &&

			(mw.config.get('wgAction') == 'view')) {

		dc_run();

	}

}



function dc_run() {

	$('span.mw-headline').each(function(index, value){

		var editSectionUrl = $(this).parent().find('.mw-editsection a:first').attr('href');

		var sectionReg = /&section=(.*)/;

		var sectionRaw = sectionReg.exec(editSectionUrl);

		if ((sectionRaw !== null) && (sectionRaw1].indexOf('T') < 0)){

			var section = parseInt(sectionRaw1]);

			var sectionLevel = false;

			switch ($(this).parent().prop("tagName")) {

				case 'H2':

					sectionLevel = 'h2';

					break;

				case 'H3':

					sectionLevel = 'h3';

					break;

				case 'H4':

					sectionLevel = 'h4';

					break;

				default:

					break;

			}

			if (sectionLevel && sectionLevel !== false) {

				$(this).parent(sectionLevel).append(' <div style="font-size:.6em;font-weight:bold;float:right"> | <a id="' + section + 

					'" class="closeLink">' + 'Close' + '</a></div>');

				$(this).parent(sectionLevel).find('a.closeLink').click(function(){

					$('body').prepend('<div id="DC-modal">'+

						'<div id="DC-interface">'+

						'<h4 id="DC-interface-header"></h4>'+

						'<hr>'+

						'<div id="DC-interface-content"></div>'+

						'<hr>'+

						'<div id="DC-interface-footer"></div>'+

						'</div>'+

						'</div>');

					$("#DC-interface-header, #DC-interface-content, #DC-interface-footer").empty();

					$("#DC-interface-header").text("Discussion Closer");

					$("#DC-interface-content").append(

						$('<div class="DC-bottom">').append(

							$('<label>').attr({'id':'DC-label'}).text('Options: '),

							$('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio1','value':'atop','checked':'true','onchange':'dc_radio(1)'}),

							$('<label>').text('Generic (blue) '),

							$('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio2','value':'atopg','onchange':'dc_radio(1)'}),

							$('<label>').text('Generic (green) '),

							$('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio3','value':'atopy','onchange':'dc_radio(1)'}),

							$('<label>').text('Generic (yellow) '),

							$('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio4','value':'atopr','onchange':'dc_radio(1)'}),

							$('<label>').text('Generic (red) '),

							$('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio5','value':'closed rfc top','onchange':'dc_radio(2)'}),

							$('<label>').text('RfC '),

							$('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio6','value':'hat','onchange':'dc_radio(2)'}),

							$('<label>').text('Hidden archive '),

							$('<input>').attr({'type':'radio', 'name':'DC-radio','id':'DC-radio7','value':'subst:RMT','onchange':'dc_radio(2)'}),

							$('<label>').text('Requested move ')

						),

						$('<div class="DC-bottom">').append(

							$('<label>').text('Status (optional): '),

							$('<input>').attr({'type':'text','name':'DC-e','id':'DC-e'})

						),

						$('<div class="DC-bottom">').append(

							$('<label>').text('Closing comment:'),

							$('<textarea>').css({'resize':'none'}).attr({'name':'DC-com','id':'DC-com','rows':'17','cols':'30'})

						),

						$('<div class="DC-bottom">').append(

							$('<label>').text('Edit summary ("Closing discussion" if left blank): '),

							$('<input>').attr({'type':'text','name':'DC-es','id':'DC-es'})

						),

						$('<div class="DC-bottom">').attr('id','DC-prevt'),

						$('<div class="DC-bottom">').attr('id','DC-prevdiv'),

						$('<button>').attr('id', 'DC-closeprev').text('Close preview').hide()

					);

					$("#DC-interface-footer").append(

						$('<button>').attr({'name':'DC-done', 'id':'DC-done'}).text('Close discussion'),

						$('<button>').attr({'name':'DC-prev', 'id':'DC-prev'}).text('Preview'),

						$('<button>').attr('id', 'DC-cancel').text('Cancel'),

						$('<label>').attr('id','DC-loading').text(' Loading preview...').hide()

					);

					document.getElementById("DC-modal").addEventListener( "keydown", function ( key ) {

						if( key.ctrlKey && ( key.keyCode == 10 || key.keyCode == 13 ) ) {

							document.getElementById("DC-done").click();

						}

						else if ( key.keyCode == 27 ){

							document.getElementById("DC-cancel").click();

						}

		    		});

					$('#DC-cancel').click(function() {

						$('#DC-modal').remove();

					});

					$('#DC-prev').click(function() {

						$('#DC-loading').show();

						var template = $("input[name=DC-radio]:checked").val();

						var status = $('#DC-e').val();

						var comment = $('#DC-com').val();

						var request = {

							action:"query", 

							titles: mw.config.get('wgPageName'), 

							rvsection: section,

							prop: "revisions|info", 

							intoken: "edit", 

							rvprop: "content",

							indexpageids: 1,

							dataType: "xml",

							format: "xml"

						};

						var bottom = dc_make_bottom( template );

						$.get(mw.config.get("wgScriptPath")+"/api.php", request, function(response){

							var contentSection = '\r\r' + $(response).find('rev').text();

							var discussiontext = contentSection.substring(contentSection.substring(3,contentSection.length).indexOf('\n')+3, contentSection.length);

							var title = contentSection.substring(2, contentSection.length - discussiontext.length);

							var wikitext = title + '\n{{'+template+'\n| status = '+status+'\n| result = '+comment+'\n}}'+discussiontext+'\n'+bottom;

							var sectiontitle = title.replace('==', '').replace('==', '').replace('\n', '').replace('/r','').trim();

							var sectiontitle2 = sectiontitle.replace(/ /g, '_');

							if (template === "closed rfc top") {

								wikitext = wikitext.replace(/(\r|\n)?{{rfc[^\}]*}}/g, '')

													.replace(/(\r|\n)?<!--\s\[\[User:DoNotArchiveUntil\]\][^->]*-->{{[^C]+ClueBot\sIII\/DoNotArchiveUntil\|\d*}}/g, '');

							} else if (template === "subst:RMT"){

								wikitext = wikitext.replace(/{{requested move\/dated\|[^}]*?}}\n?/i, '');

							}

							jQuery.ajax({

								url:mw.util.wikiScript('api'),

								dataType:'json',

								type:'POST',

								data:{

									format:'json',

									action:'parse',

									pst:1,

									text:wikitext,

									title:mw.config.get('wgPageName'),

									prop:'text'

								}

							}).done(function(r) {

								if(!r.parse || !r.parse.text || !r.parse.text'*']){

									alert('Error previewing.');

								}

								$('#DC-loading').hide();

								$('#DC-prevt').html('<hr>Preview:<br>');

								$('#DC-prevdiv').html(r.parse.text'*'+'<br />').css({'display':'block','background-color':'white'});

								$('#DC-closeprev').show();

								$('#DC-closeprev').click(function() {

									$('#DC-prevt').empty();

									$('#DC-prevdiv').empty().css({'display':'','background-color':'','border-color':'',"border-width":"", "border-style":""});

									$('#DC-closeprev').hide();

								});

							});

						});

					});

					$('#DC-done').click(function() {

						var template = $("input[name=DC-radio]:checked").val();

						var status = $('#DC-e').val();

						var editsummary = $('#DC-es').val();

						if (editsummary === "") {

							editsummary = "Closing discussion";

						}

						var comment = $('#DC-com').val();

						$('#DC-done').remove();

						$('#DC-prev').remove();

						$('#DC-cancel').remove();

        				$('#DC-interface-content').empty();

        				$("#DC-interface-content").text('Retrieving information...');

						var request = {

							action:"query", 

							titles: mw.config.get('wgPageName'), 

							rvsection: section,

							prop: "revisions|info", 

							intoken: "edit", 

							rvprop: "content",

							indexpageids: 1,

							dataType: "xml",

							format: "xml"

						};

						$("#DC-interface-content").append('<b>Done!</b><br>Closing discussion...');

						var bottom = dc_make_bottom( template );

						$.get(mw.config.get("wgScriptPath")+"/api.php", request, function(response){

			                var contentSection = '\r\r' + $(response).find('rev').text();

			                var discussiontext = contentSection.substring(contentSection.substring(3,contentSection.length).indexOf('\n')+3, contentSection.length);

			                var title = contentSection.substring(2, contentSection.length - discussiontext.length);

							var wikitext = title + '\n{{'+template+'\n| status = '+status+'\n| result = '+comment+'\n}}\n\n'+discussiontext+'\n'+bottom;

							var sectiontitle = title.replace(/=/g, '').replace('\n', '').replace('/r','').trim();

							var sectiontitle2 = sectiontitle.replace(/ /g, '_');

							if (template === "closed rfc top") {

								wikitext = wikitext.replace(/(\r|\n)?{{rfc[^\}]*}}/g, '')

													.replace(/(\r|\n)?<!--\s\[\[User:DoNotArchiveUntil\]\][^->]*-->{{[^C]+ClueBot\sIII\/DoNotArchiveUntil\|\d*}}/g, '');

							} else if (template === "subst:RMT" ){

								wikitext = wikitext.replace(/\n?{{requested move\/dated\|[^}]*?}}\n?\n?/i, '');

							}

							var request2 = {

								action:"edit", 

								section: section, 

								title: mw.config.get('wgPageName'), 

								text: wikitext,

								summary: '/* ' + sectiontitle + ' */ ' + editsummary + DiscussionCloser_ending,

								token: mw.user.tokens.get("csrfToken")

							};

							var willClose = true;

							if (alreadyClosed( contentSection )) {

								willClose = confirm('The discussion may have already been closed. Continue?');

							}

							if (!willClose) {

								$("#DC-interface-content").append('<b>Aborted by user</b><br><b>Finished!</b>');

								$('#DC-interface-footer').append(

									$('<button>').attr('id', 'DC-close').text('Done')

								);

								$('#DC-close').click(function() {

									$('#DC-modal').remove();

									window.location.href = '/info/en/?search='+mw.config.get('wgPageName')+'#'+sectiontitle2;

									window.location.reload();

								});

							}

							else {

								$.when(

									$.post(mw.config.get("wgScriptPath")+"/api.php", request2, function(response2){

								}).done(function() {

									$("#DC-interface-content").append('<b>Done!</b><br><b>Finished!</b>');

									$('#DC-interface-footer').append(

										$('<button>').attr('id', 'DC-close').text('Done')

									);

									$('#DC-close').click(function() {

										$('#DC-modal').remove();

										window.location.href = '/info/en/?search='+mw.config.get('wgPageName')+'#'+sectiontitle2;

										window.location.reload();

									});

								}));

							}

						});

					});

				});

			}

		}

	});

}

mw.loader.using(['mediawiki.util', 'mediawiki.api', 'mediawiki.Title'], function() {

	mw.loader.load('//en.wikipedia.org/?title=User:DannyS712/DiscussionCloser.css&action=raw&ctype=text/css', 'text/css'); // Import stylesheet

	dc_init();

});

//</nowiki>