میڈیاویکی:Gadget-twinklearv-2022.js

تفصیل کے لیے کھولیں کے بٹن پر کلک کریں یاددہانی: محفوظ کرنے کے بعد تازہ ترین تبدیلیوں کو دیکھنے کے لیے آپ کو اپنے براؤزر کا کیش صاف کرنا ہوگا۔

  • فائرفاکس/ سفاری: جب Reload پر کلک کریں تو Shift دبا کر رکھیں، یا Ctrl-F5 یا Ctrl-R دبائیں (Mac پر R- )
  • گوگل کروم: Ctrl-Shift-R دبائیں (Mac پر Shift-R-⌘)
  • انٹرنیٹ ایکسپلورر: جب Refresh پر کلک کریں تو Ctrl یا Ctrl-F5 دبائیں
  • اوپیرا: Tools → Preferences میں جائیں اور کیش صاف کریں

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinklearv.js: ARV module
 ****************************************
 * Mode of invocation:     Tab ("شکایت")
 * Active on:              Any page with relevant user name (userspace, contribs, etc.)
 */

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 ? (Morebits.ip.isRange(username) ? 'کی آئی پی' : '') + 'کی حدود' : 'صارف';

	Twinkle.addPortletLink(function() {
		Twinkle.arv.callback(username, isIP);
	}, 'شکایت', 'tw-arv', 'منتظمین سے ' + userType + ' کی شکایت کریں');
};

Twinkle.arv.callback = function (uid, isIP) {
	var Window = new Morebits.simpleWindow(600, 500);
	Window.setTitle('شکایت کریں'); // Backronym
	Window.setScriptName('پلک');
	Window.addFooterLink('انتظامی مداخلت کا طریقۂ کار', 'ویکیپیڈیا:تخریب کاری کے وقت انتظامی مداخلت کا طریقۂ کار');
	Window.addFooterLink('نامناسب صارف نام', 'وپ:دیوان خاص');
	Window.addFooterLink('کھاتوں کی جانچ پڑتال', 'وپ:دیوان خاص');
	Window.addFooterLink('ترجیحات شکایت', 'وپ:پلک/ترجیحات#شکایت');
	Window.addFooterLink('رہنمائے پلک', ':en:WP:TW/DOC#arv');
	Window.addFooterLink('آپ کے تاثرات', 'تبادلۂ خیال ویکیپیڈیا:پلک');

	var form = new Morebits.quickForm(Twinkle.arv.callback.evaluate);
	var categories = form.append({
		type: 'select',
		name: 'category',
		label: 'شکایت کی نوعیت:',
		event: Twinkle.arv.callback.changeCategory
	});
	categories.append({
		type: 'option',
		label: 'تخریب کاری',
		value: 'تخریب'
	});
	categories.append({
		type: 'option',
		label: 'نامناسب صارف نام',
		value: 'نام',
		disabled: isIP
	});
	categories.append({
		type: 'option',
		label: 'کٹھ پتلی باز',
		value: 'پڑتال'
	});
	categories.append({
		type: 'option',
		label: 'کٹھ پتلی',
		value: 'پتلی'
	});
	categories.append({
		type: 'option',
		label: 'ترمیمی جنگ',
		value: 'تامجنگ',
		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: 'دائرہ کار',
		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("پابندی کی صورت حال دیکھی جا رہی ہے", 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 ? (Morebits.ip.isRange(uid) ? 'حدود' : 'پتے ') + 'پر' : 'اس کھاتے پر');
			// Start and end differ, range blocked
			message += block.rangestart !== block.rangeend ? ' رینج بلاک کے تحت' : '';
			message += (block.partial ? ' جزوی طور پر ' : ' پہلے ہی سے ') + 'پابندی عائد ہے۔';
			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 'تخریب':
		/* falls through */
		default:
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'تخریب کاری کی شکایت کریں',
				name: 'work_area'
			});
			work_area.append({
				type: 'input',
				name: 'page',
				label: 'متعلقہ صفحہ کا ربط:',
				tooltip: 'شکایت میں کسی صفحے کا ربط نہ دینا چاہیں تو اسے خالی چھوڑ دیں',
				value: mw.util.getParamValue('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: 'تخریب کاری کے وقت متعلقہ صفحے کے نسخہ کا شناختی نمبر (آئی ڈی):',
				tooltip: 'فرق کا ربط نہ دینا ہو تو اِسے خالی چھوڑ دیں',
				value: mw.util.getParamValue('vanarticlerevid') || '',
				disabled: !mw.util.getParamValue('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: 'تخریب کاری سے قبل متعلقہ صفحے کے آخری نسخہ کا شناختی نمبر (آئی ڈی):',
				tooltip: 'سابقہ نسخہ کے فرق کا ربط درج نہ کرنا چاہیں تو اسے خالی چھوڑ دیں',
				value: mw.util.getParamValue('vanarticlegoodrevid') || '',
				disabled: !mw.util.getParamValue('vanarticle') || mw.util.getParamValue('vanarticlerevid')
			});
			work_area.append({
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'آخری انتباہ کے بعد تخریب کاری (درجہ 4 یا 5)',
						value: 'final'
					},
					{
						label: 'پابندی ختم کرنے کے بعد تخریب کاری (1 دن کے اندر)',
						value: 'postblock'
					},
					{
						label: 'بظاہر تخریب کاری کے لیے بنایا گیا کھاتہ',
						value: 'vandalonly',
						disabled: mw.util.isIPAddress(root.uid.value, true)
					},
					{
						label: 'محض اشتہار باز کھاتہ',
						value: 'promoonly',
						disabled: mw.util.isIPAddress(root.uid.value, true)
					},
					{
						label: 'بظاہر فاضل کار روبہ یا مشتبہ کھاتہ',
						value: 'spambot'
					}
				]
			});
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'تبصرہ:'
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
		case 'نام':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'نامناسب صارف نام کی شکایت کریں',
				name: 'work_area'
			});
			work_area.append({
				type: 'header',
				label: 'نامناسب صارف ناموں کی قسم(یں)',
				tooltip: 'ویکیپیڈیا میں گمراہ کن، تشہیری، توہین آمیز یا تفرقہ انگیز صارف ناموں کی قطعاً گنجائش نہیں ہے۔ نیز اس طرح کے برقی ڈاک پتوں اور ڈومین ناموں کی بھی اجازت نہیں۔ یہ اصول و ضوابط صارف نام اور دستخطوں دونوں کے لیے مقرر کیے گئے ہیں۔ ایسے صارف نام جو کسی دوسری زبان میں نامناسب سمجھے جاتے ہوں یا غلط ہجے اور املا کے ذریعہ انھیں نامناسب معنی پہنائے گئے ہوں یا بالواسطہ اور ضمنی طور پر نامناسب معنی پیدا ہوتے ہوں، ان سب کی اجازت نہیں ہوگی۔'
			});
			work_area.append({
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'گمراہ کن صارف نام',
						value: 'گمراہ کن',
						tooltip: 'گمراہ کن صارف نام حقائق کو کسی دوسری شکل میں پیش کرتے ہیں۔ مثلاً یہ تاثر پیدا ہو کہ اس صارف نام کا حامل منتظم ہے یا روبہ کھاتہ ہے۔'
					},
					{
						label: 'تشہیری صارف نام',
						value: 'تشہیری',
						tooltip: 'تشہیری صارف نام کسی ویب سائٹ، ادارہ، تنظیم، تحریک یا حلقے کی تشہیر پر مشتمل ہوتے ہیں۔  براہ کرم اس نوع کے صارف ناموں کی شکایت اس وقت تک نہ کریں جب تک وہ صارف اپنے نام سے متعلق کوئی تشہیری ترمیم نہ کرے۔'
					},
					{
						label: 'مشترک صارف نام',
						value: 'مشترک',
						tooltip: 'ایسے صارف نام  جنھیں ایک سے زائد صارفین مشترکہ طور پر استعمال کریں (مثلاً کمپنیاں اور ادارے وغیرہ) ان کی گنجائش نہیں ہے۔ البتہ اگر کوئی صارف نام کسی کمپنی یا ادارے وغیرہ کے نام پر رکھا گیا ہو لیکن اس امر کا یقین ہو کہ یہ کھاتہ ایک ہی شخص کے زیر استعمال ہے تو اس کی اجازت ہے۔'
					},
					{
						label: 'اہانت آمیز صارف نام',
						value: 'اہانت آمیز',
						tooltip: 'توہین آمیز نام ویکی ہم آہنگی میں رخنے ڈال کر یہاں ترمیم کاری کو مشکل بناتے ہیں۔'
					},
					{
						label: 'تفرقہ انگیز صارف نام',
						value: 'تفرقہ انگیز',
						tooltip: 'تفرقہ انگیز نام ذاتی حملوں پر مشتمل ہوتے ہیں جن کا مقصد ویکی فضا کو خراب کرنا ہوتا ہے۔'
					}
				]
			});
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'تبصرہ:'
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;

		case 'پتلی':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'مشکوک جرابی کٹھ پتلی کی شکایت',
				name: 'work_area'
			});
			work_area.append(
				{
					type: 'input',
					name: 'sockmaster',
					label: 'کٹھ پتلی باز',
					tooltip: 'جرابی کٹھ پتلی باز کا صارف نام «صارف:» سابقے کے بغیر درج کریں'
				}
			);
			work_area.append({
				type: 'textarea',
				label: 'وجہ:',
				name: 'reasons',
				tooltip: 'وجوہات درج کریں۔'
			});
			work_area.append({
				type: 'textarea',
				label: 'ثبوت:',
				name: 'evidence',
				tooltip: 'اپنے ثبوت درج کریں۔ اور ایسا ثبوت پیش کریں جس سے یہ واضح ہو کہ غالباً یہ صارفین کئی کھاتے استعمال کر رہے ہیں۔ عموماً ایسے ثبوت صفحوں کے تاریخچوں، ترمیموں اور ان معلومات پر مشتمل ہوتے ہیں جن سے اولاً یہ ثابت ہوجائے کہ یہ تمام کارروائیاں ایک ہی صارف کی ہیں، ثانیاً یہ کارروائیاں خلل انداز ہو رہی ہیں۔ براہ کرم محض متعلقہ معاملے کے لیے فیصلہ کن ثبوت اور معلومات فراہم کریں اور غیر متعلقہ امور، گفتگو اور روابط سے گریز کریں۔'
			});
			work_area.append({
				type: 'checkbox',
				list: [
					{
						label: 'صارف جانچ کی درخواست',
						name: 'checkuser',
						tooltip: 'صارف پڑتال ایک آلہ ہے جس کے ذریعہ جرابی کٹھ پتلی کے الزام سے متعلق تکنیکی ثبوت حاصل کیے جاتے ہیں۔ اسے بغیر مناسب وجہ کے استعمال نہیں کیا جاتا، لہذا اس مناسب وجہ کو آپ لازماً بیان کریں۔ اور اس بات کا خیال رکھیں کہ آپ کے فراہم کردہ ثبوت صارف پڑتال کے استعمال کا جواز فراہم کر سکیں۔'
					}
				]
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
		case 'کٹھ پتلی باز':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'مشکوک جرابی کٹھ پتلی باز کی شکایت کریں',
				name: 'work_area'
			});
			work_area.append(
				{
					type: 'dyninput',
					name: 'sockpuppet',
					label: 'کٹھ پتلیاں',
					sublabel: 'کٹھ پتلی:',
					tooltip: 'کٹھ پتلی کا صارف نام بغیر «صارف:» سابقہ کے درج کریں',
					min: 2
				});
			work_area.append({
				type: 'textarea',
				label: 'وجہ:',
				name: 'reasons',
				tooltip: 'وجوہات درج کریں۔'
			});
			work_area.append({
				type: 'textarea',
				label: 'ثبوت:',
				name: 'evidence',
				tooltip: 'اپنے ثبوت درج کریں۔ اور ایسا ثبوت پیش کریں جس سے یہ واضح ہو جائے کہ غالباً یہ صارفین کئی کھاتے استعمال کر رہے ہیں۔ عموماً ایسے ثبوت صفحوں کے تاریخچوں، ترمیموں اور ان معلومات پر مشتمل ہوتے ہیں جن سے اولاً یہ ثابت ہوجائے کہ یہ تمام کارروائیاں ایک ہی صارف کی ہیں، ثانیاً یہ کارروائیاں خلل انداز ہو رہی ہیں۔ براہ کرم محض متعلقہ معاملے کے لیے فیصلہ کن ثبوت اور معلومات فراہم کریں اور غیر متعلقہ امور، گفتگو اور روابط سے گریز کریں۔'
			});
			work_area.append({
				type: 'checkbox',
				list: [ {
					label: 'صارف جانچ کی درخواست',
					name: 'checkuser',
					tooltip: 'صارف پڑتال ایک آلہ ہے جس کے ذریعہ جرابی کٹھ پتلی کے الزام سے متعلق تکنیکی ثبوت حاصل کیے جاتے ہیں۔ اسے بغیر مناسب وجہ کے استعمال نہیں کیا جاتا، لہذا اس مناسب وجہ کو آپ لازماً بیان کریں۔ اور اس بات کا خیال رکھیں کہ آپ کے فراہم کردہ ثبوت صارف پڑتال کے استعمال کا جواز فراہم کر سکیں۔'
				} ]
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
		case 'تام۳':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'ترمیمی جنگ کی شکایت کریں',
				name: 'work_area'
			});
			work_area.append({
				type: 'input',
				name: 'page',
				label: 'صفحہ',
				tooltip: 'جن صفحات کی شکایت کی جا رہی ہے'
			});
			work_area.append({
				type: 'button',
				name: 'load',
				label: 'لوڈ کریں',
				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">کچھ نہیں ملا</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 += '(مخفی تبصرہ)';
									} 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: 'فرق کا ربط مع اضافی گفتگو: '
								});
								$free_entry.append($free_label).append($free_input).appendTo($field);
							}
						}).fail(function() {
							$('<span class="entry">آے پی آئی کی ناکامی؛ صفحہ دوبارہ لوڈ کر کے از سر نو کوشش کریں</span>').appendTo($field);
						});
					};

					// warnings
					var uid = root.uid.value;
					getAN3Entries('warnings', mw.config.get('wgUserName'), 'تبادلۂ خیال صارف:' + 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: 'صارف کی واپس پھیری گئی ترامیم (آخری اڑتالیس گھنٹوں میں)',
				tooltip: 'ان ترامیم کو منتخب کریں جو آپ کے خیال میں واپس پھیری گئی ہیں'
			});
			work_area.append({
				type: 'field',
				name: 'warnings',
				label: 'متعلقہ صارف کو دیے گئے انتباہات',
				tooltip: 'شکایت کرنے سے قبل متعلقہ صارف کو لازماً متنبہ کریں'
			});
			work_area.append({
				type: 'field',
				name: 'resolves',
				label: 'مصالحت کی کوششیں',
				tooltip: 'پہلے آپ اس معاملے کو صارف کے تبادلہ خیال پر حل کرنے کی کوشش کریں'
			});

			work_area.append({
				type: 'textarea',
				label: 'تبصرہ:',
				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 'تخریب':
			/* falls through */
		default:
			types = form.getChecked('arvtype');
			if (!types.length && comment === '') {
				alert('وجہ درج کریں');
				return;
			}

			types = types.map(function(v) {
				switch (v) {
					case 'final':
						return 'آخری انتباہ کے بعد تخریب کاری';
					case 'postblock':
						return 'پابندی ختم کرنے کے معاً بعد تخریب کاری';
					case 'vandalonly':
						return 'کھاتے کی کارروائیوں سے معلوم ہوتا ہے کہ اسے تخریب کاری ہی کے لیے بنایا گیا ہے';
					case 'promoonly':
						return 'اس کھاتے کو محض اشتہاری مقاصد کے لیے استعمال کیا جا رہا ہے';
					case 'spambot':
						return 'بظاہر فاضل کار روبہ یا مشتبہ کھاتہ';
					default:
						return 'نامعلوم وجہ';
				}
			}).join('؛ ');


			if (form.page.value !== '') {
				// Allow links to redirects, files, and categories
				reason = 'در {{رجوع مکرر نہیں|:' + form.page.value + '}}';

				if (form.badid.value !== '') {
					reason += ' ({{diff|' + form.page.value + '|' + form.badid.value + '|' + form.goodid.value + '|diff}})';
				}
				reason += ':';
			}

			if (types) {
				reason += ' ' + types;
			}
			if (comment !== '') {
				reason += (reason === '' ? '' : '۔ ') + comment;
			}
			reason = reason.trim();
			if (!/[.?؟!;؛]$/.test(reason)) {
				reason += '۔';
			}
			reason += '~~~~';
			reason = reason.replace(/\r?\n/g, '\n*:');  // indent newlines

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

			Morebits.wiki.actionCompleted.redirect = 'ویکیپیڈیا:دیوان خاص';
			Morebits.wiki.actionCompleted.notice = 'شکایت درج کر دی گئی';

			var aivPage = new Morebits.wiki.page('ویکیپیڈیا:دیوان خاص', 'شکایت درج کی جا رہی ہے');
//			aivPage.setPageSection(1); Localized [Removed due to different structure on وپ:دیوان خاص]
			aivPage.setFollowRedirect(true);

			aivPage.load(function() {
				var text = aivPage.getPageText();
				var $aivLink = '<a target="_blank" href="/wiki/وپ:دیوان_خاص">وپ:دیوان_خاص</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('شکایت پہلے سے موجود ہے، لہذا نئی شکایت درج نہیں ہو سکتی');
					Morebits.status.printUserText(reason, 'البتہ آپ کے درج کردہ تبصرے ذیل میں موجود ہیں، اگر انہیں دستی طور پر موجودہ شکایت کے تحت درج کرنا چاہیں تو ' + $aivLink + ' میں کر سکتے ہیں:');
					return;
				}

				// then check for any bot reports
				
				/* no bot report noticeboard on urwiki
				
				var tb2Page = new Morebits.wiki.page('Wikipedia:Administrator intervention against vandalism/TB2', 'Checking bot reports');
				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('The user ' + uid + ' has already been reported by a bot. Do you wish to make the report anyway?')) {
							tb2statelem.info('Proceeded despite bot report');
						} else {
							tb2statelem.error('Report from a bot is already present, stopping');
							Morebits.status.printUserText(reason, 'The comments you typed are provided below, in case you wish to manually post them at ' + $aivLink + ':');
							return;
						}
					} else {
						tb2statelem.info('No conflicting bot reports');
					}
				
				no bot report noticeboard on urwiki */

					aivPage.getStatusElement().status('نئی شکایت درج کی جا رہی ہے۔۔۔');
					aivPage.setEditSummary('صارف [[خاص:شراکتیں/' + uid + '|' + uid + ']] کی شکایت۔');
					aivPage.setChangeTags(Twinkle.changeTags);
					aivPage.setAppendText('\n\n== صارف ' + uid + ' کی تخریب کاری ==\n*{{' + (mw.util.isIPAddress(uid, true) ? 'تخریب کار آئی پی' : 'تخریب کار صارف') + '|' + (/=/.test(uid) ? '1=' : '') + uid + '}}\n\n: ' + reason); // Indent reason
					aivPage.append();
//				}); 
				
			});
			break;

		// Report inappropriate username
		case 'نام':
			types = form.getChecked('arvtype').map(Morebits.string.toLowerCaseFirstChar);

			var hasShared = types.indexOf('مشترک') > -1;
			if (hasShared) {
				types.splice(types.indexOf('مشترک'), 1);
			}

			if (types.length <= 2) {
				types = types.join(' و ');
			} else {
				types = [ types.slice(0, -1).join('، '), types.slice(-1) ].join(' و ');
			}
			/* var article = 'ایک';
			 if (/[aeiouwyh]/.test(types[0] || '')) { // non 100% correct, but whatever, including 'h' for Cockney
				article = 'an';
			} */
			reason = '== [[صارف:' + uid +  ']] ==\n*{{user-uaa|1=' + uid + '}}\n\n ';
			if (types.length || hasShared) {
				reason += 'صارف نام کی حکمت عملی کی خلاف ورزی اس طرح ' + types +
					(hasShared ? ' کہ یہ صارف نام مشترکہ استعمال میں ہے۔ ' : '۔ ');
			}
			if (comment !== '') {
				reason += Morebits.string.toUpperCaseFirstChar(comment) + '۔ ';
			}
			reason += '~~~~';
			reason = reason.replace(/\r?\n/g, '\n*:');  // indent newlines

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

			Morebits.wiki.actionCompleted.redirect = 'ویکیپیڈیا:انتظامی توجہ درکار صارف نام';
			Morebits.wiki.actionCompleted.notice = 'شکایت درج کر دی گئی';

			var uaaPage = new Morebits.wiki.page('ویکیپیڈیا:انتظامی توجہ درکار صارف نام', 'شکایت درج کی جا رہی ہے');
			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('اس صارف کی شکایت کی جا چکی ہے۔');
					var $uaaLink = '<a target="_blank" href="/wiki/ویکیپیڈیا:انتظامی_توجہ_درکار_صارف_نام">ویکیپیڈیا:انتظامی_توجہ_درکار_صارف_نام</a>';
					Morebits.status.printUserText(reason, 'البتہ آپ کے درج کردہ تبصرے ذیل میں موجود ہیں، اگر انہیں دستی طور پر موجودہ شکایت کے تحت درج کرنا چاہیں تو ' + $uaaLink + ' پر کر سکتے ہیں:');
					return;
				}
				uaaPage.getStatusElement().status('نئی شکایت درج کی جا رہی ہے۔۔۔');
				uaaPage.setEditSummary('صارف [[خاص:شراکتیں/' + uid + '|' + uid + ']] کی شکایت کا اندراج');
				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;

		// WP:SPI
		case 'کٹھ پتلی باز':
			/* falls through */
		case 'کٹھ پتلی':
			var sockParameters = {
				evidence: form.evidence.value.trim(),
				reasons: form.reasons.value.trim(),
				checkuser: form.checkuser.checked
			};

			var puppetReport = form.category.value === 'کٹھ پتلی';
			if (puppetReport && !form.sockmaster.value.trim()) {
				alert('آپ نے اس کٹھ پتلی کے مالک کے کھاتے کا نام درج نہیں کیا۔ اسی کھاتے کو کٹھ پتلی باز کا کھاتہ سمجھ لیں۔');
				return;
			} else if (!puppetReport && !form.sockpuppet[0].value.trim()) {
				alert('آپ نے اس کٹھ پتلی باز کے کسی کٹھ پتلی کھاتے کا نام درج نہیں کیا۔ اسی کھاتے کو کٹھ پتلی سمجھ لیں۔');
				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 'تامجنگ':
			var diffs = $.map($('input:checkbox[name=s_diffs]:checked', form), function(o) {
				return $(o).data('revinfo');
			});

			if (diffs.length < 3 && !confirm('آپ نے 3 سے کم توہین آمیز ترمیمیں منتخب کی ہیں۔ کیا آپ اس صورت میں شکایت درج کرنا چاہتے ہیں؟')) {
				return;
			}

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

			if (!warnings.length && !confirm('آپ نے ان ترمیمیوں کو منتخب نہیں کیا جن میں متعلقہ صارف کو انتباہ دیا گیا ہے۔ کیا آپ اسی طرح شکایت درج کرنا چاہتے ہیں؟')) {
				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('آپ نے ان ترمیمیوں کو منتخب نہیں کیا جن میں متعلقہ صارف سے صلح صفائی اور معاملہ حل کرنے کی کوشش کی گئی ہے۔ کیا آپ اسی طرح شکایت درج کرنا چاہتے ہیں؟')) {
					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 = /خاص:فرق\/(\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"

	// prepare the SPI report
	var text = '\n{{جا:SPI report|' +
		params.sockpuppets.map(function(sock, index) {
			return 'کٹھ پتلی' + mw.language.convertNumber((index + 1)) + '=' + sock;
		}).join('|') + '\n|evidence=' + params.evidence + ' \n' +
		'|reason=' + params.reasons;

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

	var reportpage = 'ویکیپیڈیا:صارف جانچ کی درخواست/' + params.uid;

	Morebits.wiki.actionCompleted.redirect = reportpage;
	Morebits.wiki.actionCompleted.notice = 'شکایت درج کر دی گئی';

	var spiPage = new Morebits.wiki.page(reportpage, 'تبادلۂ خیال صفحہ اخذ کیا جا رہا ہے');
	spiPage.setFollowRedirect(true);
	spiPage.setEditSummary('صارف [[خاص:شراکتیں/' + params.uid + '|' + params.uid + ']] کی نئی شکایت درج کی گئی۔');
	spiPage.setChangeTags(Twinkle.changeTags);
	spiPage.setAppendText(text);
	spiPage.setWatchlist(Twinkle.getPref('spiWatchReport'));
	spiPage.append();

	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 '(مخفی تبصرہ)';
			}
			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 = '{{فرق2|' + 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 = new Morebits.date(first.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (م ع و) سے ' + new Morebits.date(last.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (م ع و) تک پے در پے ترامیم';
				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') + ' (م ع و)}} ' + 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 + '}} میں پے در پے ترامیم';
			} 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') + ' (م ع و) ' + page.title + '}} میں' + hasHiddenComment(rev);
				} else { // diff and oldid are nonconsecutive
					rev = page.revisions[0];
					var revLatest = page.revisions[revCount - 1];
					var label = new Morebits.date(rev.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (م ع و) سے ' + new Morebits.date(revLatest.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (م ع و) تک ' + page.title + ' میں پے در پے ترامیم';
					resolvetext += '\n# {{diff|oldid=' + rev.revid + '|diff=' + revLatest.revid + '|label=' + label + '}}\n';
				}
			}
		}

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

		if (comment) {
			comment += '~~~~';
		}

		var text = '\n\n' + '{{جا:تامجنگ کی شکایت|diffs=' + difftext + '|warnings=' + warningtext + '|resolves=' + resolvetext + '|pagename=' + params.page + '|orig=' + origtext + '|comment=' + comment + '|uid=' + params.uid + '}}';

		var reportpage = 'ویکیپیڈیا:تختۂ اعلانات برائے منتظمین/ترمیمی جنگ';

		Morebits.wiki.actionCompleted.redirect = reportpage;
		Morebits.wiki.actionCompleted.notice = 'شکایت درج کر لی گئی';

		var an3Page = new Morebits.wiki.page(reportpage, 'تبادلہ خیال صفحہ اخذ کیا جا رہا ہے');
		an3Page.setFollowRedirect(true);
		an3Page.setEditSummary('صارف [[خاص:شراکتیں/' + params.uid + '|' + params.uid + ']] کی نئی شکایت درج کی گئی۔');
		an3Page.setChangeTags(Twinkle.changeTags);
		an3Page.setAppendText(text);
		an3Page.append();

		// notify user

		var notifyText = '\n\n{{جا:تامجنگ کی اطلاع|1=' + mw.util.wikiUrlencode(params.uid) + '|auto=1}}~~~~';

		var talkPage = new Morebits.wiki.page('تبادلۂ خیال صارف:' + params.uid, 'ترمیمی جنگجو کو مطلع کیا جا رہا ہے');
		talkPage.setFollowRedirect(true);
		talkPage.setEditSummary('دیوان خاص کی بابت اطلاع دی جا رہی ہے');
		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>