MediaWiki:Gadget-twinklearv.js

Vikipedi, özgür ansiklopedi

Not: Sayfayı kaydettikten sonra değişiklikleri görebilmek için tarayıcınızın önbelleğinizi temizlemeniz gerekir. Google Chrome, Firefox, Microsoft Edge ve Safari: ⇧ Shift tuşuna basılı tutun ve Yeniden Yükle araç çubuğu düğmesine tıklayın. Ayrıntılar ve diğer tarayıcılara yönelik yönergeler için Vikipedi:Önbelleğinizi atlayın sayfasını inceleyin.

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinklearv.js: Raporlama modülü
 ****************************************
 * Çağırma modu:           Sekme ("Raporla")
 * Etkin olduğu yerler:    İlgili kullanıcı adına sahip herhangi bir sayfa (kullanıcı sayfası, katkılar, vb.)
 */

Twinkle.arv = function twinklearv() {
	var username = mw.config.get('wgRelevantUserName');
	if (!username || username === mw.config.get('wgUserName')) {
		return;
	}
	
	var isIP = mw.util.isIPAddress(username, true);
	// Ignore ranges wider than the CIDR limit
	if (Morebits.ip.isRange(username) && !Morebits.ip.validCIDR(username)) {
		return;
	}
	var userType = isIP ? 'IP' + (Morebits.ip.isRange(username) ? ' aralığını' : '') : 'kullanıcıyı';

	Twinkle.addPortletLink(function() {
		Twinkle.arv.callback(username, isIP);
	}, 'Raporla', 'tw-arv', userType + ' hizmetlilere raporla');
};

Twinkle.arv.callback = function (uid, isIP) {
	var Window = new Morebits.simpleWindow(600, 500);
	Window.setTitle('Gelişmiş Raporlama ve İnceleme'); // Backronym
	Window.setScriptName('Twinkle');
	//Window.addFooterLink('AIV guide', 'WP:GAIV');
	//Window.addFooterLink('UAA guide', 'WP:UAAI');
	//Window.addFooterLink('SPI guide', 'Wikipedia:Sockpuppet investigations/SPI/Guide to filing cases');
	Window.addFooterLink('Rapor tercihleri', 'VP:TWTER#arv');
	Window.addFooterLink('Twinkle yardım', 'VT:TW');
	//Window.addFooterLink('Give feedback', 'WT:TW');

	var form = new Morebits.quickForm(Twinkle.arv.callback.evaluate);
	var categories = form.append({
		type: 'select',
		name: 'category',
		label: 'Rapor türünü seçin:',
		event: Twinkle.arv.callback.changeCategory
	});
	categories.append({
		type: 'option',
		label: 'Vandalizm (VP:V)',
		value: 'aiv'
	});
	categories.append({
		type: 'option',
		label: 'Kullanıcı adı (VP:KET)', //(WP:UAA)
		value: 'username',
		disabled: isIP
	});
	categories.append({
		type: 'option',
		label: 'Kuklacı (VP:Dİ)',
		value: 'sock'
	});
	categories.append({
		type: 'option',
		label: 'Kukla (VP:Dİ)',
		value: 'puppet'
	});
	categories.append({
		type: 'option',
		label: 'Değişiklik savaşı (VP:Ş)',
		value: 'an3',
		disabled: Morebits.ip.isRange(uid) // rvuser template doesn't support ranges
	});
	form.append({
		type: 'div',
		label: '',
		style: 'color: red',
		id: 'twinkle-arv-blockwarning'
	});

	form.append({
		type: 'field',
		label: 'Work area',
		name: 'work_area'
	});
	form.append({ type: 'submit' });
	form.append({
		type: 'hidden',
		name: 'uid',
		value: uid
	});

	var result = form.render();
	Window.setContent(result);
	Window.display();
	
// Check if the user is blocked, update notice
	var query = {
		action: 'query',
		list: 'blocks',
		bkprop: 'range|flags',
		format: 'json'
	};
	if (isIP) {
		query.bkip = uid;
	} else {
		query.bkusers = uid;
	}
	new Morebits.wiki.api("Kullanıcının engel durumu kontrol ediliyor", query, function(apiobj) {
		var blocklist = apiobj.getResponse().query.blocks;
		if (blocklist.length) {
			// If an IP is blocked *and* rangeblocked, only use whichever is more recent
			var block = blocklist[0];
			var message = (isIP ? 'Bu IP ' + (Morebits.ip.isRange(uid) ? 'aralığı' : 'adresi') : 'Bu hesap');
			// Start and end differ, range blocked
			message += block.rangestart !== block.rangeend ? ' bir IP bloğunun parçası olarak' : '';
			message += (block.partial ? 'kısmen' : 'zaten') + ' engellenmiş.'
			if (block.partial) {
				$('#twinkle-arv-blockwarning').css('color', 'black'); // Less severe
			}
			$('#twinkle-arv-blockwarning').text(message);
		}
	}).post();

	// We must init the
	var evt = document.createEvent('Event');
	evt.initEvent('change', true, true);
	result.category.dispatchEvent(evt);
};

Twinkle.arv.callback.changeCategory = function (e) {
	var value = e.target.value;
	var root = e.target.form;
	var old_area = Morebits.quickForm.getElements(root, 'work_area')[0];
	var work_area = null;

	switch (value) {
		case 'aiv':
		/* falls through */
		default:
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Kullanıcıyı vandalizm yüzünden raporla',
				name: 'work_area'
			});
			work_area.append({
				type: 'input',
				name: 'page',
				label: 'Birincil bağlantılı sayfa:',
				tooltip: 'Raporda herhangi bir sayfaya bağlantı vermemek için boş bırakın',
				value: Twinkle.getPrefill('vanarticle') || '',
				event: function(e) {
					var value = e.target.value;
					var root = e.target.form;
					if (value === '') {
						root.badid.disabled = root.goodid.disabled = true;
					} else {
						root.badid.disabled = false;
						root.goodid.disabled = root.badid.value === '';
					}
				}
			});
			work_area.append({
				type: 'input',
				name: 'badid',
				label: 'Vandalizme uğramış sayfanın revizyon ID\'si:',
				tooltip: 'Revizyon ID\'si eklememek için boş bırakın',
				value: Twinkle.getPrefill('vanarticlerevid') || '',
				disabled: !Twinkle.getPrefill('vanarticle'),
				event: function(e) {
					var value = e.target.value;
					var root = e.target.form;
					root.goodid.disabled = value === '';
				}
			});
			work_area.append({
				type: 'input',
				name: 'goodid',
				label: 'Sayfanın vandalizmden önceki revizyon ID\'si:',
				tooltip: 'Önceki haline ait revizyon ID\'si eklememek için boş bırakın',
				value: Twinkle.getPrefill('vanarticlegoodrevid') || '',
				disabled: !Twinkle.getPrefill('vanarticle') || Twinkle.getPrefill('vanarticlerevid')
			});
			work_area.append({
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'Birden çok kez uyarılmasına (seviye 4 veya 4im) rağmen yapılan vandalizm',
						value: 'final'
					},
					{
						label: 'Engeli bittikten sonra (1 gün içinde) yapılan vandalizm',
						value: 'postblock'
					},
					{
						label: 'Sadece vandalizm amaçlı hesap',
						value: 'vandalonly',
						disabled: mw.util.isIPAddress(root.uid.value, true)
					},
					{
						label: 'Yalnızca reklam amaçlı hesap',
						value: 'promoonly',
						disabled: mw.util.isIPAddress(root.uid.value, true)
					},
					{
						label: 'Spambot veya şifresi ele geçirilmiş hesap',
						value: 'spambot'
					}
				]
			});
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'Yorum: '
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
		case 'username':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Kullanıcı adı ihlali raporla',
				name: 'work_area'
			});
			work_area.append({
				type: 'header',
				label: 'Uygunsuz kullanıcı adı türleri',
				tooltip: 'Vikipedi, yanıltıcı, tanıtım amaçlı veya rahatsız edici kullanıcı adlarına izin vermez. Alan adları ve e-posta adresleri de aynı şekilde yasaktır. Bu kriterler hem kullanıcı adları hem de imzaları için geçerlidir. Başka bir dilde uygunsuz olan veya yazım hataları ve değiştirmelerle uygunsuz bir adı temsil eden veya bunu dolaylı veya dolaylı olarak yapan kullanıcı adları da uygunsuz olarak kabul edilir.'
			});
			work_area.append({
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'Şaşırtıcı, yanlış yönlendirici, problem yaratıcı kullanıcı adı',
						value: 'Şaşırtıcı, yanlış yönlendirici, problem yaratıcı',
						tooltip: 'Diğer kullanıcılarla karıştırılabilecek adlar. Vikipedi\'de sık kullanılan yazılım veya toplulukla ilgili terimler veya Vikipedi\'de resmi bir pozisyonu ima eden adlar. "Hizmetli", "Sayfayı taşı", "Sistem denetçisi" vb.'
					},
					{
						label: 'Ticari marka içeren kullanıcı adı',
						value: 'Ticari marka içeren',
						tooltip: 'Ticari markalar ve özellikle spor kulüplerinin isimleri, kullanıcı adı olarak kullanılamaz.'
					},
					{
						label: 'Halen yaşayan ya da yeni ölmüş tanınmış kişi adı',
						value: 'Halen yaşayan ya da yeni ölmüş tanınmış kişiyi içeren',
						tooltip: '(örneğin, Şener Şen, Michael Jackson, vb.) Ancak, eğer siz gerçekten "o kişi" iseniz durum değişir ve bunu kullanıcı sayfanızda açıkça belirtilmesi beklenir.'
					},
					{
						label: 'Taciz edici veya karalayıcı kullanıcı adı',
						value: 'Taciz edici veya karalayıcı',
						tooltip: 'Hakaret, küfür vs. Veya diğer kullanıcıların kişisel bilgilerini (telefon numarası, cadde/sokak/adres şeklinde) ifşa eder nitelik.'
					},
					{
						label: 'Spam amaçlı veya reklam içeren kullanıcı adı',
						value: 'Spam amaçlı veya reklam içeren',
						tooltip: 'Belirli bir web sitesinin, şirketin vs. reklamını yapan kullanıcı adları bloke edilir.'
					}
				]
			});
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'Yorum:'
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;

		case 'puppet':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Şüpheli kuklayı raporla',
				name: 'work_area'
			});
			work_area.append(
				{
					type: 'input',
					name: 'sockmaster',
					label: 'Kuklacı',
					tooltip: 'Kuklacının kullanıcı adı "Kullanıcı:" ön eki olmadan'
				}
			);
			work_area.append({
				type: 'textarea',
				label: 'Deliller:',
				name: 'evidence',
				tooltip: 'Kanıtınızı girin. Bu kullanıcıların her birinin birden fazla hesabı suistimal edeceği açıkça belirtilmelidir. Genellikle bu, kullanıcıların neden a) aynı ve b) yıkıcı olduğunu doğrulayan farklı bilgiler, sayfa geçmişleri veya diğer bilgiler anlamına gelir. Bu sadece konuyu yargılamak için gerekli kanıt ve bilgi olmalıdır.'
			});
			work_area.append({
				type: 'checkbox',
				list: [
					/*{
						label: 'Denetçi İste',
						name: 'checkuser',
						tooltip: 'Denetçi , bir kuklacı iddiasıyla ilgili teknik kanıt elde etmek için kullanılan bir araçtır. Açıkça verilen kabul edilebilir bir dedil olmadan kullanılmayacaktır. Delilinizin aracın neden kullanılması gerektiğini açıkladığından emin olun.'
					}*/
				]
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
		case 'sock':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Şüpheli kuklacıyı bildir',
				name: 'work_area'
			});
			work_area.append(
				{
					type: 'dyninput',
					name: 'sockpuppet',
					label: 'Kuklalar',
					sublabel: 'Kukla:',
					tooltip: 'Kuklanın kullanıcı adı "Kullanıcı:" ön eki olmadan',
					min: 2
				});
			work_area.append({
				type: 'textarea',
				label: 'Deliller:',
				name: 'evidence',
				tooltip: 'Kanıtınızı girin. Bu kullanıcıların her birinin birden fazla hesabı suistimal edeceği açıkça belirtilmelidir. Genellikle bu, kullanıcıların neden a) aynı ve b) yıkıcı olduğunu doğrulayan farklı bilgiler, sayfa geçmişleri veya diğer bilgiler anlamına gelir. Bu sadece konuyu yargılamak için gerekli kanıt ve bilgi olmalıdır.'
			});
			work_area.append({
				type: 'checkbox',
				list: [ /*{
					label: 'Denetçi İste',
					name: 'checkuser',
					tooltip: 'Denetçi, bir kuklacı iddiasıyla ilgili teknik kanıt elde etmek için kullanılan bir araçtır. Açıkça verilen kabul edilebilir bir dedil olmadan kullanılmayacaktır. Delilinizin aracın neden kullanılması gerektiğini açıkladığından emin olun.'
				}*/ ]
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
		case 'an3':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Değişiklik savaşını raporla',
				name: 'work_area'
			});
			work_area.append({
				type: 'input',
				name: 'page',
				label: 'Sayfa',
				tooltip: 'Raporlanan sayfa'
			});
			work_area.append({
				type: 'button',
				name: 'load',
				label: 'Yükle',
				event: function(e) {
					var root = e.target.form;

					var date = new Morebits.date().subtract(48, 'hours'); // all since 48 hours

					// Run for each AN3 field
					var getAN3Entries = function(field, rvuser, titles) {
						var $field = $(root).find('[name=' + field + ']');
						$field.find('.entry').remove();

						new mw.Api().get({
							action: 'query',
							prop: 'revisions',
							format: 'json',
							rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
							rvlimit: 500, // intentionally limited
							rvend: date.toISOString(),
							rvuser: rvuser,
							indexpageids: true,
							titles: titles
						}).done(function(data) {
							var pageid = data.query.pageids[0];
							var page = data.query.pages[pageid];
							if (!page.revisions) {
								$('<span class="entry">Bulunamadı</span>').appendTo($field);
							} else {
								for (var i = 0; i < page.revisions.length; ++i) {
									var rev = page.revisions[i];
									var $entry = $('<div/>', {
										class: 'entry'
									});
									var $input = $('<input/>', {
										type: 'checkbox',
										name: 's_' + field,
										value: rev.revid
									});
									$input.data('revinfo', rev);
									$input.appendTo($entry);
									var comment = '<span>';
									// revdel/os
									if (typeof rev.commenthidden === 'string') {
										comment += '(yorum gizlendi)';
									} else {
										comment += '"' + rev.parsedcomment + '"';
									}
									comment += ' <a href="' + mw.config.get('wgScript') + '?diff=' + rev.revid + '">' + new Morebits.date(rev.timestamp).calendar() + '</a></span>';
									$entry.append(comment).appendTo($field);
								}
							}

							// add free form input for resolves
							if (field === 'resolves') {
								var $free_entry = $('<div/>', {
									class: 'entry'
								});
								var $free_input = $('<input/>', {
									type: 'text',
									name: 's_resolves_free'
								});

								var $free_label = $('<label/>', {
									for: 's_resolves_free',
									html: 'Ek tartışmalarla farkın URL bağlantısı: '
								});
								$free_entry.append($free_label).append($free_input).appendTo($field);
							}
						}).fail(function() {
							$('<span class="entry">API hatası, sayfayı yeniden yükleyin ve tekrar deneyin</span>').appendTo($field);
						});
					};

					// warnings
					var uid = root.uid.value;
					getAN3Entries('warnings', mw.config.get('wgUserName'), 'Kullanıcı mesaj:' + uid);

					// diffs and resolves require a valid page
					var page = root.page.value;
					if (page) {
						// diffs
						getAN3Entries('diffs', uid, page);

						// resolutions
						var t = new mw.Title(page);
						var talk_page = t.getTalkPage().getPrefixedText();
						getAN3Entries('resolves', mw.config.get('wgUserName'), talk_page);
					} else {
						$(root).find('[name=diffs]').find('.entry').remove();
						$(root).find('[name=resolves]').find('.entry').remove();
					}
				}
			});
			work_area.append({
				type: 'field',
				name: 'diffs',
				label: 'Kullanıcının geri almaları (son 48 saat içinde)',
				tooltip: 'Değişikliği geri aldığına inandığınız değişikliklerini seçin'
			});
			work_area.append({
				type: 'field',
				name: 'warnings',
				label: 'Konuyla alakalı verilen uyarılar',
				tooltip: 'Raporlamadan önce kullanıcıyı konuyla alakalı uyarmış olmalısınız'
			});
			work_area.append({
				type: 'field',
				name: 'resolves',
				label: 'Çözüm girişimleri',
				tooltip: 'Önce tartışma sayfasında sorunu çözmeye çalışmalısınız'
			});

			work_area.append({
				type: 'textarea',
				label: 'Yorum:',
				name: 'comment'
			});

			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
	}
};

Twinkle.arv.callback.evaluate = function(e) {
	var form = e.target;
	var reason = '';
	var comment = '';
	if (form.reason) {
		comment = form.reason.value;
	}
	var uid = form.uid.value;

	var types;
	switch (form.category.value) {

		// Report user for vandalism
		case 'aiv':
			/* falls through */
		default:
			types = form.getChecked('arvtype');
			if (!types.length && comment === '') {
				alert('Bir gerekçe belirtmelisiniz');
				return;
			}

			types = types.map(function(v) {
				switch (v) {
					case 'final':
						return 'birden çok kez uyarılmasına rağmen yapılan vandalizm';
					case 'postblock':
						return 'engeli bittikten sonra (1 gün içinde) yapılan vandalizm';
					case 'vandalonly':
						return 'sadece vandalizm amaçlı hesap';
					case 'promoonly':
						return 'hesap sadece reklam amaçlı kullanılıyor';
					case 'spambot':
						return 'spambot veya şifresi ele geçirilmiş hesap';
					default:
						return 'bilinmeyen gerekçe';
				}
			}).join('; ');

			if (form.page.value !== '') {
				// Allow links to redirects, files, and categories
				reason = '{{Yönlenme|:' + form.page.value + '}} üzerinde';
				if (form.badid.value !== '') {
					reason += ' ({{Fark|' + form.page.value + '|' + form.badid.value + '|' + form.goodid.value + '|fark}})';
				}
				reason += ':';
			}

			if (types) {
				reason += ' ' + types;
			}

			if (comment !== '') {
				var reasonEndsInPunctuationOrBlank = /([.?!;:]|^)$/.test(reason);
				reason += reasonEndsInPunctuationOrBlank ? '' : '.';
				var reasonIsBlank = reason === '';
				reason += reasonIsBlank ? '' : ' ';
				reason += comment;
			}

			reason = reason.trim();
			var reasonEndsInPunctuation = /[.?!;]$/.test(reason);
			if (!reasonEndsInPunctuation) {
				reason += '.';
			}

			reason += ' ~~~~';
			reason = reason.replace(/\r?\n/g, '\n*:');  // indent newlines

			Morebits.simpleWindow.setButtonsEnabled(false);
			Morebits.status.init(form);

			Morebits.wiki.actionCompleted.redirect = 'Vikipedi:Kullanıcı engelleme talepleri';
			Morebits.wiki.actionCompleted.notice = 'Raporlama tamamlandı';

			var aivPage = new Morebits.wiki.page('Vikipedi:Kullanıcı engelleme talepleri', 'Kullanıcı engelleme talebi işleniyor');
			// aivPage.setPageSection(1); // Türkçe Vikipedi'de section altına raporlamıyoruz
			aivPage.setFollowRedirect(true);

			aivPage.load(function() {
				var text = aivPage.getPageText();
				var $aivLink = '<a target="_blank" href="/wiki/VP:KET">VP:KET</a>';

				// check if user has already been reported
				if (new RegExp('\\{\\{\\s*(?:(?:[Ii][Pp])?[Vv]andal|[Uu]serlinks)\\s*\\|\\s*(?:1=)?\\s*' + Morebits.string.escapeRegExp(uid) + '\\s*\\}\\}').test(text)) {
					aivPage.getStatusElement().error('Rapor zaten mevcut, yeni bir tane eklenmiyor');
					Morebits.status.printUserText(reason, 'Yazdığınız yorumlar, bu kullanıcı için ' + $aivLink + ' sayfasındaki mevcut raporun altında manuel olarak bir yorum yapmak istemeniz durumunda aşağıda verilmiştir:');
					return;
				}

				// NOT: bot rapor sistemimiz yok. olursa da büyük ihtimal aynı sayfa içinde raporlayacağından yukarıdaki kod tarafından algılanır, bu yüzden burası bizim için gerekli değil
				// then check for any bot reports
				/*var tb2Page = new Morebits.wiki.page('Wikipedia:Administrator intervention against vandalism/TB2', 'Bot raporları kontrol ediliyor');
				tb2Page.load(function() {
					var tb2Text = tb2Page.getPageText();
					var tb2statelem = tb2Page.getStatusElement();

					if (new RegExp('\\{\\{\\s*(?:(?:[Ii][Pp])?[Vv]andal|[Uu]serlinks)\\s*\\|\\s*(?:1=)?\\s*' + Morebits.string.escapeRegExp(uid) + '\\s*\\}\\}').test(tb2Text)) {
						if (confirm( uid + ' kullanıcısı zaten bir bot tarafından raporlanmış. Yine de raporlamak istiyor musunuz?')) {
							tb2statelem.info('Bot raporuna rağmen devam edildi');
						} else {
							tb2statelem.error('Bir bottan gelen rapor zaten mevcut, durduruluyor');
							Morebits.status.printUserText(reason, $aivLink + 'adresinde manuel olarak yayınlamak istemeniz durumunda yazdığınız yorumlar aşağıda verilmiştir:');
							return;
						}
					} else {
						tb2statelem.info('Çakışan bot raporu yok');
					}*/

					aivPage.getStatusElement().status('Yeni rapor ekleniyor...');
					aivPage.setEditSummary('[[Special:Contributions/' + uid + '|' + uid + ']] raporlanıyor.');
					aivPage.setChangeTags(Twinkle.changeTags);
					aivPage.setAppendText('\n' + '{{kopyala:Vikipedi:Kullanıcı engelleme talepleri/Twinkle-şablon' + '|' + (/=/.test(uid) ? '1=' : '') + uid + '}} &ndash; ' + reason);
					// aivPage.setAppendText('\n*{{' + (mw.util.isIPAddress(uid, true) ? 'IPvandal' : 'vandal') + '|' + (/=/.test(uid) ? '1=' : '') + uid + '}} &ndash; ' + reason);
					aivPage.append();
				});
			// });
			break;

		// Uygunsuz kullanıcı adı bildirme
		case 'username':
			types = form.getChecked('arvtype').map(Morebits.string.toLowerCaseFirstChar);

			// generate human-readable string, e.g. "misleading and promotional username"
			if (types.length <= 2) {
				types = types.join(' ve ');
			} else {
				types = [ types.slice(0, -1).join(', '), types.slice(-1) ].join(' ve ');
			}

			// generate wikicode to place on [[WP:UAA]] page
			reason = '{{kopyala:Vikipedi:Kullanıcı engelleme talepleri/Twinkle-şablon|1=' + uid + '}} &ndash; ';
			if (types.length) {
				reason += 'Kullanıcı adı politikasının ihlali: ' + types + ' kullanıcı adı';
			}
			if (comment !== '') {
				reason += Morebits.string.toUpperCaseFirstChar(comment);
				var endsInPeriod = /\.$/.test(comment);
				if (!endsInPeriod) {
					reason += '.';
				}
				reason += ' ';
			}
			reason += '~~~~';
			reason = reason.replace(/\r?\n/g, '\n*:');  // indent newlines

			Morebits.simpleWindow.setButtonsEnabled(false);
			Morebits.status.init(form);

			Morebits.wiki.actionCompleted.redirect = 'Vikipedi:Kullanıcı engelleme talepleri';
			Morebits.wiki.actionCompleted.notice = 'Raporlama tamamlandı';

			var uaaPage = new Morebits.wiki.page('Vikipedi:Kullanıcı engelleme talepleri', 'Kullanıcı engelleme talebi işleniyor');
			uaaPage.setFollowRedirect(true);

			uaaPage.load(function() {
				var text = uaaPage.getPageText();

				// check if user has already been reported
				if (new RegExp('\\{\\{\\s*user-uaa\\s*\\|\\s*(1\\s*=\\s*)?' + Morebits.string.escapeRegExp(uid) + '\\s*(\\||\\})').test(text)) {
					uaaPage.getStatusElement().error('Kullanıcı zaten listelenmiş.');
					var $uaaLink = '<a target="_blank" href="/wiki/VP:KET">VP:KET</a>';
					Morebits.status.printUserText(reason, + $uaaLink + ' adresinde manuel olarak yayınlamak istemeniz durumunda yazdığınız yorumlar aşağıda verilmiştir.:');
					return;
				}
				uaaPage.getStatusElement().status('Yeni rapor ekleniyor...');
				uaaPage.setEditSummary('[[Special:Contributions/' + uid + '|' + uid + ']] raporlanıyor.');
				uaaPage.setChangeTags(Twinkle.changeTags);
				
				// Blank newline per [[Special:Permalink/996949310#Spacing]]; see also [[WP:LISTGAP]] and [[WP:INDENTGAP]]
				uaaPage.setPageText(text + '\n' + reason + '\n*');
				uaaPage.save();
			});
			break;

		// VP:Dİ
		case 'sock':
			/* falls through */
		case 'puppet':
			var sockParameters = {
				evidence: form.evidence.value.trim()//,
				//checkuser: form.checkuser.checked
			};

			var puppetReport = form.category.value === 'puppet';
			if (puppetReport && !form.sockmaster.value.trim()) {
				alert('Bu kukla için bir kuklacı hesabı girmediniz. Bunun yerine bu hesabı bir kuklacı olarak bildirmeyi düşünün.');
				return;
			} else if (!puppetReport && !form.sockpuppet[0].value.trim()) {
				alert('Bu kuklacı için bir kukla hesabı girmediniz. Bunun yerine bu hesabı bir kukla olarak bildirmeyi düşünün.');
				return;
			}

			sockParameters.uid = puppetReport ? form.sockmaster.value.trim() : uid;
			sockParameters.sockpuppets = puppetReport ? [uid] : Morebits.array.uniq($.map($('input:text[name=sockpuppet]', form), function(o) {
				return $(o).val() || null;
			}));

			Morebits.simpleWindow.setButtonsEnabled(false);
			Morebits.status.init(form);
			Twinkle.arv.processSock(sockParameters);
			break;

		case 'an3':
			var diffs = $.map($('input:checkbox[name=s_diffs]:checked', form), function(o) {
				return $(o).data('revinfo');
			});

			if (diffs.length < 3 && !confirm('Üçten az revizyon seçtiniz. Yine de raporlamak istiyor musunuz?')) {
				return;
			}

			var warnings = $.map($('input:checkbox[name=s_warnings]:checked', form), function(o) {
				return $(o).data('revinfo');
			});

			if (!warnings.length && !confirm('Kullanıcıyı uyardığınız herhangi bir değişiklik seçmediniz. Yine de raporlamak istiyor musunuz?')) {
				return;
			}

			var resolves = $.map($('input:checkbox[name=s_resolves]:checked', form), function(o) {
				return $(o).data('revinfo');
			});
			var free_resolves = $('input[name=s_resolves_free]').val();

			var an3_next = function(free_resolves) {
				if (!resolves.length && !free_resolves && !confirm('Sorunu çözmeye çalıştığınız herhangi bir değişiklik seçmediniz. Yine de raporlamak istiyor musunuz?')) {
					return;
				}

				var an3Parameters = {
					uid: uid,
					page: form.page.value.trim(),
					comment: form.comment.value.trim(),
					diffs: diffs,
					warnings: warnings,
					resolves: resolves,
					free_resolves: free_resolves
				};

				Morebits.simpleWindow.setButtonsEnabled(false);
				Morebits.status.init(form);
				Twinkle.arv.processAN3(an3Parameters);
			};

			if (free_resolves) {
				var query;
				var diff, oldid;
				var specialDiff = /Special:Diff\/(\d+)(?:\/(\S+))?/i.exec(free_resolves);
				if (specialDiff) {
					if (specialDiff[2]) {
						oldid = specialDiff[1];
						diff = specialDiff[2];
					} else {
						diff = specialDiff[1];
					}
				} else {
					diff = mw.util.getParamValue('diff', free_resolves);
					oldid = mw.util.getParamValue('oldid', free_resolves);
				}
				var title = mw.util.getParamValue('title', free_resolves);
				var diffNum = /^\d+$/.test(diff); // used repeatedly

				// rvdiffto in prop=revisions is deprecated, but action=compare doesn't return
				// timestamps ([[phab:T247686]]) so we can't rely on it unless necessary.
				// Likewise, we can't rely on a meaningful comment for diff=cur.
				// Additionally, links like Special:Diff/123/next, Special:Diff/123/456, or ?diff=next&oldid=123
				// would each require making use of rvdir=newer in the revisions API.
				// That requires a title parameter, so we have to use compare instead of revisions.
				if (oldid && (diff === 'cur' || (!title && (diff === 'next' || diffNum)))) {
					query = {
						action: 'compare',
						fromrev: oldid,
						prop: 'ids|title',
						format: 'json'
					};
					if (diffNum) {
						query.torev = diff;
					} else {
						query.torelative = diff;
					}
				} else {
					query = {
						action: 'query',
						prop: 'revisions',
						rvprop: 'ids|timestamp|comment',
						format: 'json',
						indexpageids: true
					};

					if (diff && oldid) {
						if (diff === 'prev') {
							query.revids = oldid;
						} else {
							query.titles = title;
							query.rvdir = 'newer';
							query.rvstartid = oldid;

							if (diff === 'next' && title) {
								query.rvlimit = 2;
							} else if (diffNum) {
								// Diffs may or may not be consecutive, no limit
								query.rvendid = diff;
							}
						}
					} else {
						// diff=next|prev|cur with no oldid
						// Implies title= exists otherwise it's not a valid diff link (well, it is, but to the Main Page)
						if (diff && /^\D+$/.test(diff)) {
							query.titles = title;
						} else {
							query.revids = diff || oldid;
						}
					}
				}

				new mw.Api().get(query).done(function(data) {
					var page;
					if (data.compare && data.compare.fromtitle === data.compare.totitle) {
						page = data;
					} else if (data.query) {
						var pageid = data.query.pageids[0];
						page = data.query.pages[pageid];
					} else {
						return;
					}
					an3_next(page);
				}).fail(function(data) {
					console.log('API failed :(', data); // eslint-disable-line no-console
				});
			} else {
				an3_next();
			}
			break;
	}
};

Twinkle.arv.processSock = function(params) {
	Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"

	// Denetçi isteği sayfa oluşturma
	var text = '===' + params.uid + '===\n* ' + 
	'{{' + (mw.util.isIPAddress(params.uid) ? 'checkip' : 'checkuser') + '|1=' + params.uid + '}}\n' +
		params.sockpuppets.map(function(v) {
			return '* {{' + (mw.util.isIPAddress(v, true) ? 'checkip' : 'checkuser') + '|1=' + v + '}}';
		}).join('\n') + '\n\'\'\'Kanıt:\'\'\' ' + params.evidence + ' ~~~~';

	/*if (params.checkuser) {
		text += '|checkuser=yes';
	}*/

	var reportpage = 'Vikipedi:Denetçi isteği/Dava/' + params.uid;

	Morebits.wiki.actionCompleted.redirect = reportpage;
	Morebits.wiki.actionCompleted.notice = 'Raporlama tamamlandı';
	
	var spiPage = new Morebits.wiki.page(reportpage, 'Tartışma sayfası alınıyor');
	spiPage.setFollowRedirect(true);
	spiPage.setEditSummary('[[Special:Contributions/' + params.uid + '|' + params.uid + ']] için yeni rapor ekleniyor.');
	spiPage.setChangeTags(Twinkle.changeTags);
	spiPage.setAppendText(text);
	spiPage.setWatchlist(Twinkle.getPref('spiWatchReport'));
	spiPage.append();

	// İsteğimizi VP:Dİ'ye ekleyelim
	var logPage = new Morebits.wiki.page("Vikipedi:Denetçi isteği", 'Denetçi istekleri sayfası alınıyor');
	logPage.load(function() {
		var logText = logPage.getPageText();
		var logStatusElement = logPage.getStatusElement();
		
		var reg = /({{\s*?Vikipedi:Denetçi isteği\/Başlık\s*?}})/;
		var originalTextLength = logText.length;
			logText = logText.replace(reg, '$1\n\{\{' + reportpage + '\}\}');
			if (logText.length === originalTextLength) {
				var linknode = document.createElement('a');
				linknode.setAttribute('href', mw.util.getUrl('Vikipedi:Twinkle/Dİ düzeltme'));
				linknode.appendChild(document.createTextNode('Denetçi isteği sayfası nasıl düzeltilir'));
				logStatusElement.error([ 'VP:Dİ\'de ilgili başlık bulunamadı. Bu sorunu çözmek için lütfen ', linknode, ' sayfasına bakın.' ]);
				return;
			}
			
		logStatusElement.status('İstek VP:Dİ sayfasına ekleniyor...');
			logPage.setEditSummary('[[Special:Contributions/' + params.uid + '|' + params.uid + ']] ile ilgili denetçi isteği ekleniyor.');
			logPage.setChangeTags(Twinkle.changeTags);
			logPage.setPageText(logText);
			logPage.setCreateOption('recreate');
			logPage.save();
	})

	Morebits.wiki.removeCheckpoint();  // all page updates have been started
};

Twinkle.arv.processAN3 = function(params) {
	// prepare the AN3 report
	var minid;
	for (var i = 0; i < params.diffs.length; ++i) {
		if (params.diffs[i].parentid && (!minid || params.diffs[i].parentid < minid)) {
			minid = params.diffs[i].parentid;
		}
	}

	new mw.Api().get({
		action: 'query',
		prop: 'revisions',
		format: 'json',
		rvprop: 'sha1|ids|timestamp|comment',
		rvlimit: 100, // intentionally limited
		rvstartid: minid,
		rvexcludeuser: params.uid,
		indexpageids: true,
		titles: params.page
	}).done(function(data) {
		Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"

		// In case an edit summary was revdel'd
		var hasHiddenComment = function(rev) {
			if (!rev.comment && typeof rev.commenthidden === 'string') {
				return '(comment hidden)';
			}
			return '"' + rev.comment + '"';

		};

		var orig;
		if (data.length) {
			var sha1 = data[0].sha1;
			for (var i = 1; i < data.length; ++i) {
				if (data[i].sha1 === sha1) {
					orig = data[i];
					break;
				}
			}

			if (!orig) {
				orig = data[0];
			}
		}

		var origtext = '';
		if (orig) {
			origtext = '{{diff2|' + orig.revid + '|' + orig.timestamp + '}} ' + hasHiddenComment(orig);
		}

		var grouped_diffs = {};

		var parentid, lastid;
		for (var j = 0; j < params.diffs.length; ++j) {
			var cur = params.diffs[j];
			if ((cur.revid && cur.revid !== parentid) || lastid === null) {
				lastid = cur.revid;
				grouped_diffs[lastid] = [];
			}
			parentid = cur.parentid;
			grouped_diffs[lastid].push(cur);
		}

		var difftext = $.map(grouped_diffs, function(sub) {
			var ret = '';
			if (sub.length >= 2) {
				var last = sub[0];
				var first = sub.slice(-1)[0];
				var label = 'Şu değişiklikten itibaren yapılan ardışık değişiklikler: ' + new Morebits.date(first.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)\'den ' + new Morebits.date(last.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)\'ye kadar';
				ret = '# {{diff|oldid=' + first.parentid + '|diff=' + last.revid + '|label=' + label + '}}\n';
			}
			ret += sub.reverse().map(function(v) {
				return (sub.length >= 2 ? '#' : '') + '# {{diff2|' + v.revid + '|' + new Morebits.date(v.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)}} ' + hasHiddenComment(v);
			}).join('\n');
			return ret;
		}).reverse().join('\n');
		var warningtext = params.warnings.reverse().map(function(v) {
			return '# ' + ' {{diff2|' + v.revid + '|' + new Morebits.date(v.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)}} ' + hasHiddenComment(v);
		}).join('\n');
		var resolvetext = params.resolves.reverse().map(function(v) {
			return '# ' + ' {{diff2|' + v.revid + '|' + new Morebits.date(v.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)}} ' + hasHiddenComment(v);
		}).join('\n');

		if (params.free_resolves) {
			var page = params.free_resolves;
			if (page.compare) {
				resolvetext += '\n# ' + ' {{diff|oldid=' + page.compare.fromrevid + '|diff=' + page.compare.torevid + '|label=' + page.compare.totitle + ' sayfasında ardışık düzenlemeler}}';
			} else if (page.revisions) {
				var revCount = page.revisions.length;
				var rev;
				if (revCount < 3) { // diff=prev or next
					rev = revCount === 1 ? page.revisions[0] : page.revisions[1];
					resolvetext += '\n# ' + ' {{diff2|' + rev.revid + '|' + new Morebits.date(rev.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC) on ' + page.title + '}} ' + hasHiddenComment(rev);
				} else { // diff and oldid are nonconsecutive
					rev = page.revisions[0];
					var revLatest = page.revisions[revCount - 1];
					var label = 'Şu değişiklikten itibaren yapılan ardışık değişiklikler: ' + new Morebits.date(rev.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)\'den ' + new Morebits.date(revLatest.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)\'e kadar ' + page.title + ' sayfasında';
					resolvetext += '\n# {{diff|oldid=' + rev.revid + '|diff=' + revLatest.revid + '|label=' + label + '}}\n';
				}
			}
		}

		var comment = params.comment.replace(/~*$/g, '').trim();

		if (comment) {
			comment += ' --~~~~';
		}
		if (!comment) {
			comment = 'Bildirimde bulunan kullanıcı yorum yapmamıştır. Eğer bildirimi siz yaptıysanız lütfen burayı doldurun. Bu mesaj Twinkle tarafından otomatik olarak eklenen bir yer tutucudur ve yorum işlevi görmemektedir. --~~~~';
		}

		var text = '\n\n' + '{{subst:3GD raporu|diffs=' + difftext + '|warnings=' + warningtext + '|resolves=' + resolvetext + '|pagename=' + params.page + '|orig=' + origtext + '|comment=' + comment + '|uid=' + params.uid + '}}';

		var reportpage = 'Vikipedi:Şikâyet';

		Morebits.wiki.actionCompleted.redirect = reportpage;
		Morebits.wiki.actionCompleted.notice = 'Raporlama tamamlandı';

		var an3Page = new Morebits.wiki.page(reportpage, 'Tartışma sayfası alınıyor');
		an3Page.setFollowRedirect(true);
		an3Page.setEditSummary('[[Special:Contributions/' + params.uid + '|' + params.uid + ']] için yeni rapor ekleniyor.');
		an3Page.setChangeTags(Twinkle.changeTags);
		an3Page.setAppendText(text);
		an3Page.append();

		// notify user
		var notifyText = '\n\n{{subst:değişiklik savaşı bildirimi|1=' + mw.util.wikiUrlencode(params.uid) + '}}--~~~~';

		var talkPage = new Morebits.wiki.page('Kullanıcı mesaj:' + params.uid, 'Bildirilen kullanıcıya haber veriliyor');
		talkPage.setFollowRedirect(true);
		talkPage.setEditSummary('Değişiklik savaşı raporu bildirimi.');
		talkPage.setChangeTags(Twinkle.changeTags);
		talkPage.setAppendText(notifyText);
		talkPage.append();
		Morebits.wiki.removeCheckpoint();  // all page updates have been started
	}).fail(function(data) {
		console.log('API failed :(', data); // eslint-disable-line no-console
	});
};

Twinkle.addInitCallback(Twinkle.arv, 'arv');
})(jQuery);


// </nowiki>