Користувач:Andriy.v/Gadget-RenameClosure.js

/*
* @author Andriy.v
* for ukwiki only
*/

//<nowiki>
if (window.renameClosure === undefined) {
	window.renameClosure = {
			conclusions: [ { id: 'renamed', conclusion: 'Перейменовано на запропоновану назву'},
				{ id: 'not-renamed', conclusion: 'Не перейменовано'},
				{ id: 'alt-renamed', conclusion: 'Перейменовано на альтернативну назву'}
			],
		install: function() {
			var rc = this;
			var link = mw.util.addPortletLink('p-tb', '#', 'Підбити підсумок');
			$( link ).click( function ( e ) {
			e.preventDefault();
			rc.showDialog();
			});
		},
		showDialog: function () {
			var rc = this;
			if( $( '#rc-dialog' ).length === 0 ) {
				$( "#mw-content-text" ).append('<div id="rc-dialog" style="display:none;" title=\"Підбиття підсумку заявки на перейменування\"><p style=\"font-size:80%\">Цей інструмент дозволяє спростити процес підбиття підсумків заявок на сторінці <a href=\"//uk.wikipedia.org/wiki/Вікіпедія:Перейменування_статей\">Вікіпедія:Перейменування статей</a>.</p>Текст підсумку:<textarea id="rc-conclusion" rows="8" cols="100"></textarea><div id="rc-preview"></div><p style= "font-weight: bold; font-family: Georgia;">Вкажіть чи сторінку було перейменовано на запропоновану назву чи ні, або вкажіть у полі нижче нову назву, якщо вона не співпадає із запропонованою.</p><form id="rc-radiobox"></form></div>');
				$.each(this.conclusions, function() {
					if (this.id == 'alt-renamed') {
						$('#rc-radiobox').append('<input type="radio" name="rc-radio" id="rc-alt-renamed">' + this.conclusion + '<br/>');
						$('#rc-radiobox').append('<input id="RC-altrenamed" style="display:none; width:100%"><br/>');
					} else {
						$('#rc-radiobox').append('<input type="radio" name="rc-radio" id="' + this.id + '">' + this.conclusion + '<br/>');
					}
				});
				$('#rc-dialog input:radio').change(function(){
					if($(this).attr('id') == 'rc-alt-renamed'){
						$('#RC-altrenamed').show(500);
					} else {
						$('#RC-altrenamed').hide(500);						
					}
				});
			}
			mw.loader.using( 'jquery.ui', function() {
				$( '#rc-dialog' ).dialog({
					width: 700,
					buttons: {
						'Зберегти' : function() {
							rc.check();
						},
						'Попередній перегляд': function() {
							rc.preview();
						}
					}
				});
			});
			$('#rc-conclusion').focus();
		},
		nominatedPage: function() {
			var nominatedPage = mw.config.get( 'wgPageName' );
			nominatedPage = nominatedPage.replace(/_/g,' ');
			nominatedPage = nominatedPage.replace(/Вікіпедія:Перейменування статей\//,'');
			nominatedPage = nominatedPage.replace(/ → .+/,'');
			return nominatedPage;
		},
		newPage: function() {
			var newPage = mw.config.get( 'wgPageName' );
			newPage = newPage.replace(/_/g,' ');
			newPage = newPage.replace(/Вікіпедія:Перейменування статей\/.+ → /,'');
			return newPage;
		},
		preview: function () {
			var reason = $( '#rc-conclusion' ).val();
			var param = {
				action: 'parse',
				format: 'json',
				prop: 'text',
				text: reason
			};
			$.get(mw.util.wikiScript('api'), param).done(function(data) {
				$('#rc-preview').html(data.parse.text['*']);
			});
		},
		check: function () {
			window.conclusion = $( '#rc-conclusion' ).val();
			if( this.isEmpty( conclusion ) ) {
				$('#rc-dialog').append( '<p style="font-size:80%; color:red">"Введіть текст підсумку"</p>' );
				return 0;
				} else if($('#rc-dialog input:checked').attr('id') != 'rc-alt-renamed' && $('#rc-dialog input:checked').attr('id') != 'renamed' && $('#rc-dialog input:checked').attr('id') != 'not-renamed') {
					alert('Оберіть результат обговорення!');
					return;
					} else if($('#rc-dialog input:checked').attr('id') == 'rc-alt-renamed' && this.isEmpty($('#RC-altrenamed').val())) {
						alert('Введіть альтернативну назву!');
						$('RC-altrenamed').focus();
						return;
						} else if($('#rc-dialog input:checked').attr('id') == 'renamed') {
							window.talk = '{{перейменовано|' + this.nominatedPage() + '}}\n';
							window.target = this.newPage();
							this.renamePage(this.nominatedPage(),this.newPage());
							} else if($('#rc-dialog input:checked').attr('id') == 'not-renamed') {
								window.talk = '{{не перейменовано|' + this.newPage() + '}}\n';
								window.target = this.nominatedPage();
								this.addText();
								} else {
									window.talk = '{{перейменовано|' + this.nominatedPage() + '|link=' + mw.config.get( 'wgPageName' ).replace(/_/g,' ') +'}}\n';
									window.target = $('#RC-altrenamed').val();
									this.renamePage(this.nominatedPage(),$('#RC-altrenamed').val());
								}
		},
		addText: function (after_nom){
			var rc = this;
			var content;
			this.wait('Вставляється текст підсумку на підсторінці ВП:ПС');
			var page = mw.config.get( 'wgPageName' ).replace(/_/g,' ');
			new mw.Api().edit(page, function(revision) {
				return {
					text: revision.content + '\n\n==== Підсумок ====\n'+ window.conclusion + '--~~~~',
					summary: '[[user:Andriy.v/Gadget-RenameClosure.js|Script]]: підсумок',
					assert: 'user'
				};
			}).done( function () {
				if (after_nom == 1)
					rc.replacetemplate();
				else
					rc.deletemovetemplate();
			}).fail( function (error) {
				rc.editErrors(error, page);
			}) ;
		},
		renamePage: function(oldPage, newPage){
			var rc = this;
			$( "#mw-content-text" ).append('<div id="rc-dialog1" style="display:none;" title=\"Зачекайте, будь ласка...\"><p style="font-size: 120%; font-weight:bold;">Перейменовується номінована сторінка</p></div>');
			$('#rc-dialog1').dialog({
				modal: true,
				buttons: false
			});
			var params = {
				action: 'move',
				from: oldPage,
				to: newPage,
				reason: '[[user:Andriy.v/Gadget-RenameClosure.js|Script]]: відповідно до підсумку обговорення на [[' + mw.config.get( 'wgPageName' ).replace(/_/g,' ') + '|ВП:ПС]]',
				movetalk: '1',
				format: 'json'
			},
			api = new mw.Api();
			api.postWithToken( 'csrf', params ).done( function ( data ) {
				$('#rc-dialog1').dialog("close");
				rc.addText();
			}).fail(function(error) {
				switch (error) {
					case 'redirectexists':
					case 'articleexists': 
						if ($.inArray('sysop',mw.config.get('wgUserGroups')) > -1)
							rc.deletePage(oldPage, newPage);
						else
							rc.nominateToDelete(oldPage, newPage);
						break;
					default:
						alert('Не вдалось перейменувати сторінку і/або її сторінку обговорення');
						$('#rc-dialog1').dialog("close");
						break;
				}
			});
		},
		deletemovetemplate: function (){
			var rc = this;
			this.wait('Видалення шаблона Move зі сторінки '+ this.nominatedPage() );
			var page = window.target;
			new mw.Api().edit(page, function (revision) {
				return {
					text: revision.content.replace(/\{\{([Mm]ove|[Aa]na)\|[^}]+\}\}\n?/,''),
					summary: '[[user:Andriy.v/Gadget-RenameClosure.js|Script]]: видалення шаблона [[template:move|Move]]',
					assert: 'user',
				};
				})
				.done(function() {
					rc.addTalk();
					})
				.fail(function(error) {
					alert('Не вдалось вилучити шаблон Move з номінованої статті');
					rc.editErrors(error, page);
					rc.addTalk();
			});
		},
		addTalk: function() {
			var rc = this;
			this.wait('Вставляється шаблон на сторінку обговорення');
			var page = 'Обговорення:' + window.target;
			new mw.Api().edit(page, function(revision) {
				var text = revision.content;
				text = window.talk + text;
				return {
					text: text,
					summary: '[[user:Andriy.v/Gadget-RenameClosure.js|Script]]: вставка шаблона на сторінку обговорення',
					assert: 'user',
				};
			})
			.done(function() {
				rc.replacetemplate();
			})
			.fail(function() {
				new mw.Api().create(page, {
					summary: '[[user:Andriy.v/Gadget-RenameClosure.js|Script]]: вставка шаблона на сторінку обговорення',
					watchlist: 'nochange'
				}, window.talk)
				.done(function() {
					rc.replacetemplate();
				})
				.fail(function(error) {
					alert('Не вдалось додати шаблон до сторінки обговорення номінованої статті');
					rc.editErrors(error, page);
					rc.replacetemplate();
				});
			});
		},
		replacetemplate: function () {
			var rc = this;
			var nominatedPage = this.nominatedPage();
			var newPage = this.newPage();
			this.wait('Редагується шаблон обговорення на ВП:ПС');
			new mw.Api().edit('Вікіпедія:Перейменування статей', function(revision) {
				var text = revision.content.replace('\n{{Rename|' + nominatedPage + '|' + newPage + '}}','');
				return {
					text: text.replace('{{КК|/Архів|Архів}}<br/>','{{КК|/Архів|Архів}}<br/>\n{{Rename3|' + nominatedPage + '|' + newPage + '}}'),
					summary: '[[user:Andriy.v/Gadget-RenameClosure.js|Script]]: перенесення обговорення до завершених',
					assert: 'user',
				};
			})
			.done(function() {
				rc.success();
			})
			.fail(function(error) {
				alert('Не вдалось замінити шаблон обговорення на ВП:ПС');
				rc.editErrors(error, 'Вікіпедія:Перейменування статей');
				rc.success();
			});
		},
		deletePage: function(oldPage, newPage) {
			var rc = this;
			$( "#mw-content-text" ).append('<div id="rc-dialog-delete" style="display:none;" title=\"Увага! Перейменування потребує адміндії\"><p style= "font-weight: bold; font-family: Georgia;">Сторінка <a href=\"//uk.wikipedia.org/wiki/' + newPage.replace(' ','_') + '\">' + newPage + '</a>, на яку Ви перейменовуєте, вже існує і не є перенаправленням, або її історія редагувань має більш ніж один запис. Чи бажаєте її видалити та продовжити перейменування?</p><form id="rc-radiobox-delete"></form></div>');
			$('#rc-radiobox-delete').append('<input type="radio" name="rc-radio" id="rc-delete" checked="checked">Так, видалити і продовжити дію гаджета<br/>');
			$('#rc-radiobox-delete').append('<input type="radio" name="rc-radio" id="rc-stop">Ні, залишити і призупинити дію гаджета<br/>');
			$( '#rc-dialog-delete' ).dialog({
				width: 700,
				buttons: {
					'Підтвердити' : function() {
						if ($('#rc-dialog-delete input:checked').attr('id') == 'rc-delete') {
							var params = {
								action: 'delete',
								title: newPage,
								reason: '[[user:Andriy.v/Gadget-RenameClosure.js|Script]]: для звільнення шляху перейменування сторінки',
								format: 'json'
							},
							api = new mw.Api();
			
							api.postWithToken( 'csrf', params ).done( function ( data ) {
								$('#rc-dialog-delete').dialog("close");
								$('#rc-dialog1').dialog("close");
								rc.renamePage(oldPage, newPage);
							} );
						}
						else {
							$('#rc-dialog-delete').dialog("close");
							$('#rc-dialog1').dialog("close");
						}
					}
				}
			});
		},
		nominateToDelete: function(nominatedPage, newPage) {
			var rc = this;
			rc.wait("Сторінку " + newPage + " номіновується на вилучення");
			$( "#mw-content-text" ).append('<div id="rc-dialog-nomdelete" style="display:none;" title=\"Увага! Перейменування потребує адміндії\"><p style= "font-weight: bold; font-family: Georgia;">Сторінка <a href=\"//uk.wikipedia.org/wiki/' + this.newPage().replace(' ','_') + '\">' + this.newPage() + '</a>, на яку Ви перейменовуєте, вже існує і не є перенаправленням, або її історія редагувань має більш ніж один запис. Чи бажаєте її видалити та продовжити перейменування?</p><form id="rc-radiobox-nomdelete"></form></div>');
			$('#rc-radiobox-nomdelete').append('<input type="radio" name="rc-radio" id="rc-delete" checked="checked">Так, поставити на видалення<br/>');
			$('#rc-radiobox-nomdelete').append('<input type="radio" name="rc-radio" id="rc-stop">Ні, залишити<br/>');
			$( '#rc-dialog-nomdelete' ).dialog({
				width: 700,
				buttons: {
					'Підтвердити' : function() {
						if ($('#rc-dialog-nomdelete input:checked').attr('id') == 'rc-delete') {
							new mw.Api().edit(newPage, function(revision) {
								var text = "<noinclude>{{db-move|" + nominatedPage + "}}</noinclude>\n" + revision.content;
								return {
									text: text,
									summary: '[[user:Andriy.v/Gadget-RenameClosure.js|Script]]: номінація сторінки на вилучення',
									assert: 'user'
								};
							}).done(function () {
								rc.addText(1);
							});
						}
						else {
							$('#rc-dialog-nomdelete').dialog("close");
							$('#rc-dialog1').dialog("close");
						}
					}
				}
			});
		},
		success: function() {
			this.wait('Перезавантаження сторінки');
			setTimeout(function(){
				$( '#rc-dialog' ).dialog('close');
					location.reload(); },1000
				);			
		},
		wait: function(mes) {
			$('#rc-dialog').dialog("close");
			$('#rc-dialog').prop('title', 'Зачекайте, будь ласка...');
			$('#rc-dialog').html('<p style="font-size: 120%; font-weight:bold;">' + mes + '</p>');
			$('#rc-dialog').dialog({
				modal: true,
				buttons: false
			});
		},
		isEmpty: function( str ) {
			return (!/\S/.test(str));
		},
		editErrors: function(code, title) {
			switch(code) {
				case 'editconflict':
					alert('Конфлікт редагувань на сторінці ' + title + '. Відкиньте редагування, зроблені цим додатком за останні декілька секунд та спробуйте ще раз');
					break;
				case 'protectedpage':
					alert('Сторінка ' + title + ' захищена. Зв\'яжіться з адміністраторами на сторінці ВП:Запити до адміністраторів');
					break;
				case 'spamdetected':
					alert('При редагуванні сторінки ' + title + ' автоматичний фільтр визначив ваш текст, як спам');
					break;
				case 'blocked':
					alert('Ви заблоковані у цій вікі. Спробуйте, будь ласка, пізніше');
					break;
				case 'abusefilter-disallowed':
					alert('Автоматичний фільтр заборонив редагування сторінки ' + title);
					break;
				case 'notoken':
					alert('Неможливо отримати токен. Зверніться, будь ласка, у «Кнайпу (адміністрування)»');
					break;
				default:
					alert('Невідома помилка при редагуванні сторінки ' + title + '. Відкиньте редагування, зроблені цим додатком за останні декілька секунд та спробуйте пізніше');
					break;
			}
		}
	};
}

//</nowiki>
var PageName = mw.config.get( 'wgPageName' );
var closedTalk = $('#Підсумок');
$(document).ready(function () {
	if(PageName.indexOf("Вікіпедія:Перейменування_статей/") != -1 && !Boolean(closedTalk[0]) && ($.inArray('sysop',mw.config.get('wgUserGroups')) > -1 || $.inArray('editor',mw.config.get('wgUserGroups')) > -1 || $.inArray('autoreview',mw.config.get('wgUserGroups')) > -1)) {
		renameClosure.install();
	}
});