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

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

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

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinklewarn.js: Warn module
 ****************************************
 * Mode of invocation:     Tab ("انتباہ")
 * Active on:              Any page with relevant user name (userspace, contribs,
 *                         etc.) (not IP ranges), as well as the rollback success page
 */

Twinkle.warn = function twinklewarn() {

	// Users and IPs but not IP ranges
	if (mw.config.exists('wgRelevantUserName') && !Morebits.ip.isRange(mw.config.get('wgRelevantUserName'))) {
		Twinkle.addPortletLink(Twinkle.warn.callback, 'انتباہ', 'tw-warn', 'صارف کو انتباہ/اطلاع');
		if (Twinkle.getPref('autoMenuAfterRollback') &&
			mw.config.get('wgNamespaceNumber') === 3 &&
			mw.util.getParamValue('vanarticle') &&
			!mw.util.getParamValue('friendlywelcome') &&
			!mw.util.getParamValue('noautowarn')) {
			Twinkle.warn.callback();
		}
	}

	// Modify URL of talk page on rollback success pages, makes use of a
	// custom message box in [[MediaWiki:Rollback-success]]
	if (mw.config.get('wgAction') === 'rollback') {
		var $vandalTalkLink = $('#mw-rollback-success').find('.mw-usertoollinks a').first();
		if ($vandalTalkLink.length) {
			$vandalTalkLink.css('font-weight', 'bold');
			$vandalTalkLink.wrapInner($('<span/>').attr('title', 'اگر مناسب ہو تو صارف کو اس صفحہ میں اس کی ترامیم پر انتباہ دینے کے لیے آپ پلک استعمال کر سکتے ہیں۔'));

			// Can't provide vanarticlerevid as only wgCurRevisionId is provided
			var extraParam = 'vanarticle=' + mw.util.rawurlencode(Morebits.pageNameNorm);
			var href = $vandalTalkLink.attr('href');
			if (href.indexOf('?') === -1) {
				$vandalTalkLink.attr('href', href + '?' + extraParam);
			} else {
				$vandalTalkLink.attr('href', href + '&' + extraParam);
			}
		}
	}
};

// Used to close window when switching to ARV in autolevel
Twinkle.warn.dialog = null;

Twinkle.warn.callback = function twinklewarnCallback() {
	if (mw.config.get('wgRelevantUserName') === mw.config.get('wgUserName') &&
		!confirm('آپ اپنے آپ کو تنبیہ کر رہے ہیں! کیا آپ واقعی ایسا کرنا چاہتے ہیں؟')) {
		return;
	}

	var dialog;
	Twinkle.warn.dialog = new Morebits.simpleWindow(600, 440);
	dialog = Twinkle.warn.dialog;
	dialog.setTitle('صارف کو انتباہ/اطلاع دیں');
	dialog.setScriptName('پلک');
	dialog.addFooterLink('انتباہی درجہ کا انتخاب', ':en:WP:UWUL#Levels');
	dialog.addFooterLink('ترجیحات انتباہ', 'وپ:پلک/ترجیحات#صارف کو انتباہ');
	dialog.addFooterLink('رہنمائے پلک', ':en:WP:TW/DOC#warn');
	dialog.addFooterLink('آپ کے تاثرات', 'تبادلۂ خیال ویکیپیڈیا:پلک');

	var form = new Morebits.quickForm(Twinkle.warn.callback.evaluate);
	var main_select = form.append({
		type: 'field',
		label: 'براہ کرم انتباہ/اطلاع کی نوعیت منتخب کریں',
		tooltip: 'پہلے اصل انتباہی گروپ کا انتخاب کریں، بعد ازاں مخصوص انتباہ منتخب کریں۔'
	});

	var main_group = main_select.append({
		type: 'select',
		name: 'main_group',
		tooltip: 'اپنی پلک ترجیحات سے آپ اپنے مقررہ انتخاب کو طے کر سکتے ہیں',
		event: Twinkle.warn.callback.change_category
	});

	var defaultGroup = parseInt(Twinkle.getPref('defaultWarningGroup'), 10);
	main_group.append({ type: 'option', label: 'خودکار درجہ (1-4) کو منتخب کریں', value: 'autolevel', selected: defaultGroup === 11 });
	main_group.append({ type: 'option', label: '1: عمومی اطلاع', value: 'level1', selected: defaultGroup === 1 });
	main_group.append({ type: 'option', label: '2: احتیاط', value: 'level2', selected: defaultGroup === 2 });
	main_group.append({ type: 'option', label: '3: انتباہ', value: 'level3', selected: defaultGroup === 3 });
	main_group.append({ type: 'option', label: '4: آخری انتباہ', value: 'level4', selected: defaultGroup === 4 });
	main_group.append({ type: 'option', label: '5: حتمی انتباہ', value: 'level4im', selected: defaultGroup === 5 });
	if (Twinkle.getPref('combinedSingletMenus')) {
		main_group.append({ type: 'option', label: 'یک مشکلی پیغام', value: 'singlecombined', selected: defaultGroup === 6 || defaultGroup === 7 });
	} else {
		main_group.append({ type: 'option', label: 'یک مشکلی اطلاعات', value: 'singlenotice', selected: defaultGroup === 6 });
		main_group.append({ type: 'option', label: 'یک مشکلی انتباہات', value: 'singlewarn', selected: defaultGroup === 7 });
	}
	if (Twinkle.getPref('customWarningList').length) {
		main_group.append({ type: 'option', label: 'ذاتی انتباہات', value: 'custom', selected: defaultGroup === 9 });
	}
	main_group.append({ type: 'option', label: 'تمام انتباہی سانچے', value: 'kitchensink', selected: defaultGroup === 10 });

	main_select.append({ type: 'select', name: 'sub_group', event: Twinkle.warn.callback.change_subcategory }); // Will be empty to begin with.

	form.append({
		type: 'input',
		name: 'article',
		label: 'مربوط مضمون',
		value: mw.util.getParamValue('vanarticle') || '',
		tooltip: 'انتباہ کے ساتھ کسی صفحہ کا ربط بھی دیا جا سکتا ہے۔ اگر ربط نہ دینا ہو تو اسے خالی چھوڑ دیں۔'
	});

	form.append({
		type: 'div',
		label: '',
		style: 'color: red',
		id: 'twinkle-warn-warning-messages'
	});


	var more = form.append({ type: 'field', name: 'reasonGroup', label: 'معلومات انتباہ' });
	more.append({ type: 'textarea', label: 'اختیاری پیغام:', name: 'reason', tooltip: 'شاید کوئی وجہ یا انتباہ کے متن میں مزید تفصیلات کا اضافہ' });

	var previewlink = document.createElement('a');
	$(previewlink).click(function() {
		Twinkle.warn.callbacks.preview(result);  // |result| is defined below
	});
	previewlink.style.cursor = 'pointer';
	previewlink.textContent = 'نمائش';
	more.append({ type: 'div', id: 'warningpreview', label: [ previewlink ] });
	more.append({ type: 'div', id: 'twinklewarn-previewbox', style: 'display: none' });

	more.append({ type: 'submit', label: 'ارسال کریں' });

	var result = form.render();
	dialog.setContent(result);
	dialog.display();
	result.main_group.root = result;
	result.previewer = new Morebits.wiki.preview($(result).find('div#twinklewarn-previewbox').last()[0]);

	// Potential notices for staleness and missed reverts
	var vanrevid = mw.util.getParamValue('vanarticlerevid');
	if (vanrevid) {
		var message = '';
		var query = {};

		// If you tried reverting, check if *you* actually reverted
		if (!mw.util.getParamValue('noautowarn') && mw.util.getParamValue('vanarticle')) { // Via fluff link
			query = {
				action: 'query',
				titles: mw.util.getParamValue('vanarticle'),
				prop: 'revisions',
				rvstartid: vanrevid,
				rvlimit: 2,
				rvdir: 'newer',
				rvprop: 'user',
				format: 'json'
			};

			new Morebits.wiki.api('صفحہ میں آپ کے استرجع کی کامیابی دیکھی جا رہی ہے', query, function(apiobj) {
				var rev = apiobj.getResponse().query.pages[0].revisions;
				var revertUser = rev && rev[1].user;
				if (revertUser && revertUser !== mw.config.get('wgUserName')) {
					message += ' کسی دوسرے شخص نے استرجع کر کے شاید صارف کو انتباہ دے دیا ہے۔';
					$('#twinkle-warn-warning-messages').text('توجه:' + message);
				}
			}).post();
		}

		// Confirm edit wasn't too old for a warning
		var checkStale = function(vantimestamp) {
			var revDate = new Morebits.date(vantimestamp);
			if (vantimestamp && revDate.isValid()) {
				if (revDate.add(24, 'hours').isBefore(new Date())) {
					message += ' اس ترمیم کو چوبیس گھنٹے گذر چکے ہیں، شاید اب انتباہ دینا بے سود ہوگا۔';
					$('#twinkle-warn-warning-messages').text('اطلاع:' + message);
				}
			}
		};

		var vantimestamp = mw.util.getParamValue('vantimestamp');
		// Provided from a fluff module-based revert, no API lookup necessary
		if (vantimestamp) {
			checkStale(vantimestamp);
		} else {
			query = {
				action: 'query',
				prop: 'revisions',
				rvprop: 'timestamp',
				revids: vanrevid,
				format: 'json'
			};
			new Morebits.wiki.api('نسخہ کے اوقات اخذ کیے جا رہے ہیں', query, function(apiobj) {
				var rev = apiobj.getResponse().query.pages[0].revisions;
				vantimestamp = rev && rev[0].timestamp;
				checkStale(vantimestamp);
			}).post();
		}
	}


	// We must init the first choice (General Note);
	var evt = document.createEvent('Event');
	evt.initEvent('change', true, true);
	result.main_group.dispatchEvent(evt);
};

// This is all the messages that might be dispatched by the code
// Each of the individual templates require the following information:
//   label (required): A short description displayed in the dialog
//   summary (required): The edit summary used. If an article name is entered, the summary is postfixed with "on [[article]]", and it is always postfixed with "."
//   suppressArticleInSummary (optional): Set to true to suppress showing the article name in the edit summary. Useful if the warning relates to attack pages, or some such.
//   hideLinkedPage (optional): Set to true to hide the "Linked article" text box. Some warning templates do not have a linked article parameter.
//   hideReason (optional): Set to true to hide the "Reason" text box. Some warning templates do not have a reason parameter.
Twinkle.warn.messages = {
	levels: {
		'عمومی انتباہات': {
			'تخریب کاری': {
				level1: {
					label: 'تخریب کاری',
					summary: 'عمومی اطلاع: غیر تعمیری ترمیم'
				},
				level2: {
					label: 'تخریب کاری',
					summary: 'فہمائش: غیر تعمیری ترمیم'
				},
				level3: {
					label: 'تخریب کاری',
					summary: 'انتباہ: تخریب کاری'
				},
				level4: {
					label: 'تخریب کاری',
					summary: 'آخری انتباہ: تخریب کاری'
				},
				level4im: {
					label: 'تخریب کاری',
					summary: 'حتمی انتباہ: تخریب کاری'
				}
			},
			'uw-disruptive': {
				level1: {
					label: 'خلل انداز ترمیم',
					summary: 'عمومی اطلاع: غیر تعمیری ترمیم'
				},
				level2: {
					label: 'خلل انداز ترمیم',
					summary: 'فہمائش: غیر تعمیری ترمیم'
				},
				level3: {
					label: 'خلل انداز ترمیم',
					summary: 'انتباہ: خلل انداز ترمیم'
				}
			},
			'uw-test': {
				level1: {
					label: 'تجرباتی ترامیم',
					summary: 'عمومی اطلاع: تجرباتی ترامیم'
				},
				level2: {
					label: 'تجرباتی ترامیم',
					summary: 'فہمائش: تجرباتی ترامیم'
				},
				level3: {
					label: 'تجرباتی ترامیم',
					summary: 'انتباہ: تجرباتی ترامیم'
				}
			},
			'uw-delete': {
				level1: {
					label: 'حذف مندرجات',
					summary: 'عمومی اطلاع: حذف مندرجات'
				},
				level2: {
					label: 'حذف مندرجات',
					summary: 'فہمائش: حذف مندرجات'
				},
				level3: {
					label: 'حذف مندرجات',
					summary: 'انتباہ: حذف مندرجات'
				},
				level4: {
					label: 'حذف مندرجات',
					summary: 'آخری انتباہ: حذف مندرجات'
				},
				level4im: {
					label: 'حذف مندرجات',
					summary: 'حتمی انتباہ: حذف مندرجات'
				}
			},
			'uw-generic4': {
				level4: {
					label: 'عام انتباہ (سانچوں کے ان سلسلوں کے لیے جن میں درجہ 4 کا سانچہ نہیں ہے)',
					summary: 'آخری انتباہ'
				}
			}
		},
		'اسلوب تحریر': {
			'uw-biog': {
				level1: {
					label: 'بقید حیات شخصیات کے متعلق بدون حوالہ متنازع معلومات کا اندراج',
					summary: 'عمومی اطلاع: بقید حیات شخصیات کے متعلق بدون حوالہ متنازع معلومات کا اندراج'
				},
				level2: {
					label: 'بقید حیات شخصیات کے متعلق بدون حوالہ متنازع معلومات کا اندراج',
					summary: 'فہمائش: بقید حیات شخصیات کے متعلق بدون حوالہ متنازع معلومات کا اندراج'
				},
				level3: {
					label: 'بقید حیات شخصیات کے متعلق بدون حوالہ متنازع/ہتک آمیز معلومات کا اندراج',
					summary: 'انتباہ: بقید حیات شخصیات کے متعلق بدون حوالہ متنازع معلومات کا اندراج'
				},
				level4: {
					label: 'بقید حیات شخصیات کے متعلق بدون حوالہ ہتک آمیز معلومات کا اندراج',
					summary: 'آخری انتباہ: بقید حیات شخصیات کے متعلق بدون حوالہ متنازع معلومات کا اندراج'
				},
				level4im: {
					label: 'بقید حیات شخصیات کے متعلق بدون حوالہ ہتک آمیز معلومات کا اندراج',
					summary: 'حتمی انتباہ: بقید حیات شخصیات کے متعلق بدون حوالہ متنازع معلومات کا اندراج'
				}
			},
			'uw-defamatory': {
				level1: {
					label: 'ہتک آمیز مواد کا اندراج',
					summary: 'عمومی اطلاع: ہتک آمیز مواد کا اندراج'
				},
				level2: {
					label: 'ہتک آمیز مواد کا اندراج',
					summary: 'فہمائش: ہتک آمیز مواد کا اندراج'
				},
				level3: {
					label: 'ہتک آمیز مواد کا اندراج',
					summary: 'انتباہ: ہتک آمیز مواد کا اندراج'
				},
				level4: {
					label: 'ہتک آمیز مواد کا اندراج',
					summary: 'آخری انتباہ: ہتک آمیز مواد کا اندراج'
				},
				level4im: {
					label: 'ہتک آمیز مواد کا اندراج',
					summary: 'حتمی انتباہ: ہتک آمیز مواد کا اندراج'
				}
			},
			'uw-error': {
				level1: {
					label: 'غلط معلومات کا دانستہ اندراج',
					summary: 'عمومی اطلاع: غلط معلومات کا دانستہ اندراج'
				},
				level2: {
					label: 'غلط معلومات کا دانستہ اندراج',
					summary: 'فہمائش: غلط معلومات کا دانستہ اندراج'
				},
				level3: {
					label: 'غلط معلومات کا دانستہ اندراج',
					summary: 'انتباہ: غلط معلومات کا دانستہ اندراج'
				},
				level4: {
					label: 'غلط معلومات کا دانستہ اندراج',
					summary: 'آخری انتباہ: غلط معلومات کا دانستہ اندراج'
				}
			},
			'uw-genre': {
				level1: {
					label: 'اتفاق رائے یا حوالہ جات کے بغیر مختلف اصناف میں متواتر یا بڑے پیمانے پر تبدیلیاں',
					summary: 'عمومی اطلاع: اتفاق رائے یا حوالہ جات کے بغیر مختلف اصناف میں متواتر یا بڑے پیمانے پر تبدیلیاں'
				},
				level2: {
					label: 'اتفاق رائے یا حوالہ جات کے بغیر مختلف اصناف میں متواتر یا بڑے پیمانے پر تبدیلیاں',
					summary: 'فہمائش: اتفاق رائے یا حوالہ جات کے بغیر مختلف اصناف میں متواتر یا بڑے پیمانے پر تبدیلیاں'
				},
				level3: {
					label: 'اتفاق رائے یا حوالہ جات کے بغیر مختلف اصناف میں متواتر یا بڑے پیمانے پر تبدیلیاں',
					summary: 'انتباہ: اتفاق رائے یا حوالہ جات کے بغیر مختلف اصناف میں متواتر یا بڑے پیمانے پر تبدیلیاں'
				},
				level4: {
					label: 'اتفاق رائے یا حوالہ جات کے بغیر مختلف اصناف میں متواتر یا بڑے پیمانے پر تبدیلیاں',
					summary: 'آخری انتباہ: اتفاق رائے یا حوالہ جات کے بغیر مختلف اصناف میں متواتر یا بڑے پیمانے پر تبدیلیاں'
				}
			},
			'uw-image': {
				level1: {
					label: 'مضامین میں تصویروں سے متعلق تخریب کاری',
					summary: 'عمومی اطلاع: مضامین میں تصویروں سے متعلق تخریب کاری'
				},
				level2: {
					label: 'مضامین میں تصویروں سے متعلق تخریب کاری',
					summary: 'فہمائش: مضامین میں تصویروں سے متعلق تخریب کاری'
				},
				level3: {
					label: 'مضامین میں تصویروں سے متعلق تخریب کاری',
					summary: 'انتباہ: مضامین میں تصویروں سے متعلق تخریب کاری'
				},
				level4: {
					label: 'مضامین میں تصویروں سے متعلق تخریب کاری',
					summary: 'آخری انتباہ: مضامین میں تصویروں سے متعلق تخریب کاری'
				},
				level4im: {
					label: 'تصویروں سے متعلق تخریب کاری',
					summary: 'حتمی انتباہ: تصویروں سے متعلق تخریب کاری'
				}
			},
			'uw-joke': {
				level1: {
					label: 'مضامین میں نامناسب مزاح کا استعمال',
					summary: 'عمومی اطلاع: مضامین میں نامناسب مزاح کا استعمال'
				},
				level2: {
					label: 'مضامین میں نامناسب مزاح کا استعمال',
					summary: 'فہمائش: مضامین میں نامناسب مزاح کا استعمال'
				},
				level3: {
					label: 'مضامین میں نامناسب مزاح کا استعمال',
					summary: 'انتباہ: مضامین میں نامناسب مزاح کا استعمال'
				},
				level4: {
					label: 'مضامین میں نامناسب مزاح کا استعمال',
					summary: 'آخری انتباہ: مضامین میں نامناسب مزاح کا استعمال'
				},
				level4im: {
					label: 'نامناسب مزاح کا استعمال',
					summary: 'حتمی انتباہ: مضامین میں نامناسب مزاح کا استعمال'
				}
			},
			'uw-nor': {
				level1: {
					label: 'ذاتی تحقیقات کا اندراج',
					summary: 'عمومی اطلاع: ذاتی تحقیقات کا اندراج'
				},
				level2: {
					label: 'ذاتی تحقیقات کا اندراج',
					summary: 'فہمائش: ذاتی تحقیقات کا اندراج'
				},
				level3: {
					label: 'ذاتی تحقیقات کا اندراج',
					summary: 'انتباہ: ذاتی تحقیقات کا اندراج'
				},
				level4: {
					label: 'ذاتی تحقیقات کا اندراج',
					summary: 'آخری انتباہ: ذاتی تحقیقات کا اندراج'
				}
			},
			'uw-notcensored': {
				level1: {
					label: 'مندرجات کا احتساب',
					summary: 'عمومی اطلاع: مندرجات کا احتساب'
				},
				level2: {
					label: 'مندرجات کا احتساب',
					summary: 'فہمائش: مندرجات کا احتساب'
				},
				level3: {
					label: 'مندرجات کا احتساب',
					summary: 'انتباہ: مندرجات کا احتساب'
				}
			},
			'uw-own': {
				level1: {
					label: 'مضامین کی ملکیت',
					summary: 'عمومی اطلاع: مضامین کی ملکیت'
				},
				level2: {
					label: 'مضامین کی ملکیت',
					summary: 'فہمائش: مضامین کی ملکیت'
				},
				level3: {
					label: 'مضامین کی ملکیت',
					summary: 'انتباہ: مضامین کی ملکیت'
				},
				level4: {
					label: 'مضامین کی ملکیت',
					summary: 'آخری انتباہ: مضامین کی ملکیت'
				},
				level4im: {
					label: 'مضامین کی ملکیت',
					summary: 'حتمی انتباہ: مضامین کی ملکیت'
				}
			},
			'uw-subtle': {
				level1: {
					label: 'عسیر الفہم تخریب کاری',
					summary: 'عمومی اطلاع: امکانی طور پر غیر تعمیری ترمیم'
				},
				level2: {
					label: 'عسیر الفہم تخریب کاری',
					summary: 'فہمائش: غالباً غیر تعمیری ترمیم'
				},
				level3: {
					label: 'عسیر الفہم تخریب کاری',
					summary: 'انتباہ: عسیر الفہم تخریب کاری'
				},
				level4: {
					label: 'عسیر الفہم تخریب کاری',
					summary: 'آخری انتباہ: عسیر الفہم تخریب کاری'
				}
			},
			'uw-tdel': {
				level1: {
					label: 'انتظامی سانچوں کا حذف',
					summary: 'عمومی اطلاع: انتظامی سانچوں کا حذف'
				},
				level2: {
					label: 'انتظامی سانچوں کا حذف',
					summary: 'فہمائش: انتظامی سانچوں کا حذف'
				},
				level3: {
					label: 'انتظامی سانچوں کا حذف',
					summary: 'انتباہ: انتظامی سانچوں کا حذف'
				},
				level4: {
					label: 'انتظامی سانچوں کا حذف',
					summary: 'آخری انتباہ: انتظامی سانچوں کا حذف'
				}
			},
			'uw-unsourced': {
				level1: {
					label: 'بلا حوالہ یا غلط حوالوں پر مشتمل مواد کا اندراج',
					summary: 'عمومی اطلاع: بلا حوالہ یا غلط حوالوں پر مشتمل مواد کا اندراج'
				},
				level2: {
					label: 'بلا حوالہ یا غلط حوالوں پر مشتمل مواد کا اندراج',
					summary: 'فہمائش: بلا حوالہ یا غلط حوالوں پر مشتمل مواد کا اندراج'
				},
				level3: {
					label: 'بلا حوالہ یا غلط حوالوں پر مشتمل مواد کا اندراج',
					summary: 'انتباہ: بلا حوالہ یا غلط حوالوں پر مشتمل مواد کا اندراج'
				},
				level4: {
					label: 'بلا حوالہ یا غلط حوالوں پر مشتمل مواد کا اندراج',
					summary: 'آخری انتباہ: بلا حوالہ یا غلط حوالوں پر مشتمل مواد کا اندراج'
				}
			}
		},
		'اشتہاربازی اور فاضل کاری': {
			'uw-advert': {
				level1: {
					label: 'اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال',
					summary: 'عمومی اطلاع: اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال'
				},
				level2: {
					label: 'اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال',
					summary: 'فہمائش: اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال'
				},
				level3: {
					label: 'اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال',
					summary: 'انتباہ: اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال'
				},
				level4: {
					label: 'اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال',
					summary: 'آخری انتباہ: اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال'
				},
				level4im: {
					label: 'اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال',
					summary: 'حتمی انتباہ: اشتہار بازی یا تشہیر کے لیے ویکیپیڈیا کا استعمال'
				}
			},
			'uw-npov': {
				level1: {
					label: 'غیرجانبدارانہ نقطہ نظر کی خلاف ورزی',
					summary: 'عمومی اطلاع: غیرجانبدارانہ نقطہ نظر کی خلاف ورزی'
				},
				level2: {
					label: 'غیرجانبدارانہ نقطہ نظر کی خلاف ورزی',
					summary: 'فہمائش: غیرجانبدارانہ نقطہ نظر کی خلاف ورزی'
				},
				level3: {
					label: 'غیرجانبدارانہ نقطہ نظر کی خلاف ورزی',
					summary: 'انتباہ: غیرجانبدارانہ نقطہ نظر کی خلاف ورزی'
				},
				level4: {
					label: 'غیرجانبدارانہ نقطہ نظر کی خلاف ورزی',
					summary: 'آخری انتباہ: غیرجانبدارانہ نقطہ نظر کی خلاف ورزی'
				}
			},
			'uw-paid': {
				level1: {
					label: 'ویکیمیڈیا کے شرائط استعمال کے تحت بامعاوضہ ترمیم کاری',
					summary: 'عمومی اطلاع: ویکیمیڈیا کے شرائط استعمال کے تحت بامعاوضہ ترمیم کاری کے افشا کا مطالبہ'
				},
				level2: {
					label: 'ویکیمیڈیا کے شرائط استعمال کے تحت بامعاوضہ ترمیم کاری',
					summary: 'فہمائش: ویکیمیڈیا کے شرائط استعمال کے تحت بامعاوضہ ترمیم کاری کے افشا کا مطالبہ'
				},
				level3: {
					label: 'ویکیمیڈیا کے شرائط استعمال کے تحت بامعاوضہ ترمیم کاری',
					summary: 'انتباہ: ویکیمیڈیا کے شرائط استعمال کے تحت بامعاوضہ ترمیم کاری کے افشا کا مطالبہ'
				},
				level4: {
					label: 'ویکیمیڈیا کے شرائط استعمال کے تحت بامعاوضہ ترمیم کاری',
					summary: 'آخری انتباہ: ویکیمیڈیا کے شرائط استعمال کے تحت بامعاوضہ ترمیم کاری کے افشا کا مطالبہ'
				}
			},
			'uw-spam': {
				level1: {
					label: 'نامناسب بیرونی روابط کا اضافہ',
					summary: 'عمومی اطلاع: نامناسب بیرونی روابط کا اضافہ'
				},
				level2: {
					label: 'فاضل روابط کا اضافہ',
					summary: 'فہمائش: فاضل روابط کا اضافہ'
				},
				level3: {
					label: 'فاضل روابط کا اضافہ',
					summary: 'انتباہ: فاضل روابط کا اضافہ'
				},
				level4: {
					label: 'فاضل روابط کا اضافہ',
					summary: 'آخری انتباہ: فاضل روابط کا اضافہ'
				},
				level4im: {
					label: 'فاضل روابط کا اضافہ',
					summary: 'حتمی انتباہ: فاضل روابط کا اضافہ'
				}
			}
		},
		'صارفین کے تئیں رویہ': {
			'uw-agf': {
				level1: {
					label: 'نیک نیتی فرض نہ کرنا',
					summary: 'عمومی اطلاع: نیک نیتی فرض نہ کرنا'
				},
				level2: {
					label: 'نیک نیتی فرض نہ کرنا',
					summary: 'فہمائش: نیک نیتی فرض نہ کرنا'
				},
				level3: {
					label: 'نیک نیتی فرض نہ کرنا',
					summary: 'انتباہ: نیک نیتی فرض نہ کرنا'
				}
			},
			'uw-harass': {
				level1: {
					label: 'دوسرے صارفین کو تکلیف دینا',
					summary: 'عمومی اطلاع: دوسرے صارفین کو تکلیف دینا'
				},
				level2: {
					label: 'دوسرے صارفین کو تکلیف دینا',
					summary: 'فہمائش: دوسرے صارفین کو تکلیف دینا'
				},
				level3: {
					label: 'دوسرے صارفین کو تکلیف دینا',
					summary: 'انتباہ: دوسرے صارفین کو تکلیف دینا'
				},
				level4: {
					label: 'دوسرے صارفین کو تکلیف دینا',
					summary: 'آخری انتباہ: دوسرے صارفین کو تکلیف دینا'
				},
				level4im: {
					label: 'دوسرے صارفین کو تکلیف دینا',
					summary: 'حتمی انتباہ: دوسرے صارفین کو تکلیف دینا'
				}
			},
			'uw-npa': {
				level1: {
					label: 'کسی مخصوص صارف پر ذاتی حملہ کرنا',
					summary: 'عمومی اطلاع: کسی مخصوص صارف پر ذاتی حملہ کرنا'
				},
				level2: {
					label: 'کسی مخصوص صارف پر ذاتی حملہ کرنا',
					summary: 'فہمائش: کسی مخصوص صارف پر ذاتی حملہ کرنا'
				},
				level3: {
					label: 'کسی مخصوص صارف پر ذاتی حملہ کرنا',
					summary: 'انتباہ: کسی مخصوص صارف پر ذاتی حملہ کرنا'
				},
				level4: {
					label: 'کسی مخصوص صارف پر ذاتی حملہ کرنا',
					summary: 'آخری انتباہ: کسی مخصوص صارف پر ذاتی حملہ کرنا'
				},
				level4im: {
					label: 'کسی مخصوص صارف پر ذاتی حملہ کرنا',
					summary: 'حتمی انتباہ: کسی مخصوص صارف پر ذاتی حملہ کرنا'
				}
			},
			'uw-tempabuse': {
				level1: {
					label: 'پابندی یا انتباہ کے سانچوں کا نامناسب استعمال',
					summary: 'عمومی اطلاع: پابندی یا انتباہ کے سانچوں کا نامناسب استعمال'
				},
				level2: {
					label: 'پابندی یا انتباہ کے سانچوں کا نامناسب استعمال',
					summary: 'فہمائش: پابندی یا انتباہ کے سانچوں کا نامناسب استعمال'
				}
			}
		},
		'حذف کے سانچوں کا ازالہ': {
			'uw-afd': {
				level1: {
					label: '{{نبح}} کے سانچوں کا ازالہ',
					summary: 'عمومی اطلاع: {{نبح}} کے سانچوں کا ازالہ'
				},
				level2: {
					label: '{{نبح}} کے سانچوں کا ازالہ',
					summary: 'فہمائش: {{نبح}} کے سانچوں کا ازالہ'
				},
				level3: {
					label: '{{نبح}} کے سانچوں کا ازالہ',
					summary: 'انتباہ: {{نبح}} کے سانچوں کا ازالہ'
				},
				level4: {
					label: '{{نبح}} کے سانچوں کا ازالہ',
					summary: 'آخری انتباہ: {{نبح}} کے سانچوں کا ازالہ'
				}
			},
			'uw-blpprod': {
				level1: {
					label: '{{بحش محذ}} کے سانچوں کا ازالہ',
					summary: 'عمومی اطلاع: {{بحش محذ}} کے سانچوں کا ازالہ'
				},
				level2: {
					label: '{{بحش محذ}} کے سانچوں کا ازالہ',
					summary: 'فہمائش: {{بحش محذ}} کے سانچوں کا ازالہ'
				},
				level3: {
					label: '{{بحش محذ}} کے سانچوں کا ازالہ',
					summary: 'انتباہ: {{بحش محذ}} کے سانچوں کا ازالہ'
				},
				level4: {
					label: '{{بحش محذ}} کے سانچوں کا ازالہ',
					summary: 'حتمی انتباہ: {{بحش محذ}} کے سانچوں کا ازالہ'
				}
			},
			'uw-idt': {
				level1: {
					label: 'حذف فائل کے سانچوں کا ازالہ',
					summary: 'عمومی اطلاع: حذف فائل کے سانچوں کا ازالہ'
				},
				level2: {
					label: 'حذف فائل کے سانچوں کا ازالہ',
					summary: 'فہمائش: حذف فائل کے سانچوں کا ازالہ'
				},
				level3: {
					label: 'حذف فائل کے سانچوں کا ازالہ',
					summary: 'انتباہ: حذف فائل کے سانچوں کا ازالہ'
				},
				level4: {
					label: 'حذف فائل کے سانچوں کا ازالہ',
					summary: 'آخری انتباہ: حذف فائل کے سانچوں کا ازالہ'
				}
			},
			/* ذیل کے سانچوں کے سلسلہ کی اردو ویکیپیڈیا پر حاجت نہیں
			'uw-tfd': {
				level1: {
					label: 'Removing {{tfd}} templates',
					summary: 'General note: Removing {{tfd}} templates'
				},
				level2: {
					label: 'Removing {{tfd}} templates',
					summary: 'Caution: Removing {{tfd}} templates'
				},
				level3: {
					label: 'Removing {{tfd}} templates',
					summary: 'Warning: Removing {{tfd}} templates'
				},
				level4: {
					label: 'Removing {{tfd}} templates',
					summary: 'Final warning: Removing {{tfd}} templates'
				}
			}, */
			'uw-speedy': {
				level1: {
					label: 'فوری حذف کے سانچوں کا ازالہ',
					summary: 'عمومی اطلاع: فوری حذف کے سانچوں کا ازالہ'
				},
				level2: {
					label: 'فوری حذف کے سانچوں کا ازالہ',
					summary: 'فہمائش: فوری حذف کے سانچوں کا ازالہ'
				},
				level3: {
					label: 'فوری حذف کے سانچوں کا ازالہ',
					summary: 'انتباہ: فوری حذف کے سانچوں کا ازالہ'
				},
				level4: {
					label: 'فوری حذف کے سانچوں کا ازالہ',
					summary: 'آخری انتباہ: فوری حذف کے سانچوں کا ازالہ'
				}
			}
		},
		'مزید': {
			'uw-attempt': {
				level1: {
					label: 'مقطر غلط کاری کو متحرک کرنا',
					summary: 'عمومی اطلاع: مقطر غلط کاری کو متحرک کرنا'
				},
				level2: {
					label: 'مقطر غلط کاری کو متحرک کرنا',
					summary: 'فہمائش: مقطر غلط کاری کو متحرک کرنا'
				},
				level3: {
					label: 'مقطر غلط کاری کو متحرک کرنا',
					summary: 'انتباہ: مقطر غلط کاری کو متحرک کرنا'
				},
				level4: {
					label: 'مقطر غلط کاری کو متحرک کرنا',
					summary: 'آخری انتباہ: مقطر غلط کاری کو متحرک کرنا'
				},
				level4im: {
					label: 'مقطر غلط کاری کو متحرک کرنا',
					summary: 'حتمی انتباہ: مقطر غلط کاری کو متحرک کرنا'
				}
			},
			'uw-chat': {
				level1: {
					label: 'چوپال کی طرح تبادلۂ خیال صفحہ کا استعمال',
					summary: 'عمومی اطلاع: چوپال کی طرح تبادلۂ خیال صفحہ کا استعمال'
				},
				level2: {
					label: 'چوپال کی طرح تبادلۂ خیال صفحہ کا استعمال',
					summary: 'فہمائش: چوپال کی طرح تبادلۂ خیال صفحہ کا استعمال'
				},
				level3: {
					label: 'چوپال کی طرح تبادلۂ خیال صفحہ کا استعمال',
					summary: 'انتباہ: چوپال کی طرح تبادلۂ خیال صفحہ کا استعمال'
				},
				level4: {
					label: 'چوپال کی طرح تبادلۂ خیال صفحہ کا استعمال',
					summary: 'آخری انتباہ: چوپال کی طرح تبادلۂ خیال صفحہ کا استعمال'
				}
			},
			'uw-create': {
				level1: {
					label: 'نامناسب صفحات کی تخلیق',
					summary: 'عمومی اطلاع: نامناسب صفحات کی تخلیق'
				},
				level2: {
					label: 'نامناسب صفحات کی تخلیق',
					summary: 'فہمائش: نامناسب صفحات کی تخلیق'
				},
				level3: {
					label: 'نامناسب صفحات کی تخلیق',
					summary: 'انتباہ: نامناسب صفحات کی تخلیق'
				},
				level4: {
					label: 'نامناسب صفحات کی تخلیق',
					summary: 'آخری انتباہ: نامناسب صفحات کی تخلیق'
				},
				level4im: {
					label: 'نامناسب صفحات کی تخلیق',
					summary: 'حتمی انتباہ: نامناسب صفحات کی تخلیق'
				}
			},
			'uw-mos': {
				level1: {
					label: 'اسلوب نامہ',
					summary: 'عمومی اطلاع: مضمون کا اسلوب، زبان، تاریخ وغیرہ (اسلوب نامہ)'
				},
				level2: {
					label: 'اسلوب نامہ',
					summary: 'فہمائش: مضمون کا اسلوب، زبان، تاریخ وغیرہ (اسلوب نامہ)'
				},
				level3: {
					label: 'اسلوب نامہ',
					summary: 'انتباہ: مضمون کا اسلوب، زبان، تاریخ وغیرہ (اسلوب نامہ)'
				},
				level4: {
					label: 'اسلوب نامہ',
					summary: 'آخری انتباہ: مضمون کا اسلوب، زبان، تاریخ وغیرہ (اسلوب نامہ)'
				}
			},
			'uw-move': {
				level1: {
					label: 'عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی',
					summary: 'عمومی اطلاع: عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی'
				},
				level2: {
					label: 'عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی',
					summary: 'فہمائش: عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی'
				},
				level3: {
					label: 'عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی',
					summary: 'انتباہ: عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی'
				},
				level4: {
					label: 'عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی',
					summary: 'آخری انتباہ: عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی'
				},
				level4im: {
					label: 'عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی',
					summary: 'حتمی انتباہ: عناوین کے اصول یا اتفاق رائے کے خلاف صفحات کی منتقلی'
				}
			},
			'uw-tpv': {
				level1: {
					label: "دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات",
					summary: "عمومی اطلاع: دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات"
				},
				level2: {
					label: "دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات",
					summary: "فہمائش: دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات"
				},
				level3: {
					label: "دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات",
					summary: "انتباہ: دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات"
				},
				level4: {
					label: "دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات",
					summary: "آخری انتباہ: دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات"
				},
				level4im: {
					label: "دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات",
					summary: "حتمی انتباہ: دیگر صارفین کے تبادلۂ خیال صفحات پر نامناسب اقدامات"
				}
			},
			'uw-upload': {
				level1: {
					label: 'غیر موسوعی تصاویر کی اپلوڈنگ',
					summary: 'عمومی اطلاع: غیر موسوعی تصاویر کی اپلوڈنگ'
				},
				level2: {
					label: 'غیر موسوعی تصاویر کی اپلوڈنگ',
					summary: 'فہمائش: غیر موسوعی تصاویر کی اپلوڈنگ'
				},
				level3: {
					label: 'غیر موسوعی تصاویر کی اپلوڈنگ',
					summary: 'انتباہ: غیر موسوعی تصاویر کی اپلوڈنگ'
				},
				level4: {
					label: 'غیر موسوعی تصاویر کی اپلوڈنگ',
					summary: 'آخری انتباہ: غیر موسوعی تصاویر کی اپلوڈنگ'
				},
				level4im: {
					label: 'غیر موسوعی تصاویر کی اپلوڈنگ',
					summary: 'حتمی انتباہ: غیر موسوعی تصاویر کی اپلوڈنگ'
				}
			}
		}
	},

	singlenotice: {
		'uw-agf-sock': {
			label: 'متعدد کھاتوں کا استعمال (نیک نیتی سے)',
			summary: 'اطلاع: متعدد کھاتوں کا استعمال'
		},
		'uw-aiv': {
			label: 'دیوان خاص میں نامناسب امور کی شکایت',
			summary: 'اطلاع: دیوان خاص میں نامناسب امور کی شکایت'
		},
		'uw-autobiography': {
			label: 'خودنوشت',
			summary: 'اطلاع: خودنوشت'
		},
		'uw-badcat': {
			label: 'غلط زمروں کا اندراج',
			summary: 'اطلاع: غلط زمروں کا اندراج'
		},
		'uw-badlistentry': {
			label: 'فہرستوں میں نامناسب یا غلط اندراج',
			summary: 'اطلاع: فہرستوں میں نامناسب یا غلط اندراج'
		},
		'uw-bite': {
			label: 'نوواردوں کو تنگ کرنا',
			summary: 'اطلاع: نوواردوں کو تنگ کرنا',
			suppressArticleInSummary: true  // non-standard (user name, not article), and not necessary
		},
		'uw-blar': {
			label: 'مضمون کے تمام مندرجات کو حذف کرکے اسے رجوع مکرر بنانا',
			summary: 'اطلاع: مضمون کے تمام مندرجات کو حذف کرکے اسے رجوع مکرر بنانا',
			hideReason: true
		},
		'uw-coi': {
			label: 'مفادات کا تصادم',
			summary: 'اطلاع: مفادات کا تصادم',
			heading: 'مفادات کا تصادم'
		},
		'uw-controversial': {
			label: 'متنازع مواد کا اندراج',
			summary: 'اطلاع: متنازع مواد کا اندراج'
		},
		'uw-copying': {
			label: 'مندرجات کو کسی دوسرے صفحہ میں نقل کرنا',
			summary: 'اطلاع: مندرجات کو کسی دوسرے صفحہ میں نقل کرنا'
		},
		'uw-crystal': {
			label: 'غیر مصدقہ یا غیر حقیقی معلومات کا اضافہ',
			summary: 'اطلاع: غیر مصدقہ یا غیر حقیقی معلومات کا اضافہ'
		},
		'uw-c&pmove': {
			label: 'نقل و چسپاں کے ذریعہ منتقلی',
			summary: 'اطلاع: نقل و چسپاں کے ذریعہ منتقلی'
		},
		'uw-dab': {
			label: 'ضد ابہام صفحہ میں غلط ترمیم',
			summary: 'اطلاع: ضد ابہام صفحہ میں غلط ترمیم'
		},
		'uw-date': {
			label: 'تاریخوں کے فارمیٹ میں غیر ضروری تبدیلی',
			summary: 'اطلاع: تاریخوں کے فارمیٹ میں غیر ضروری تبدیلی'
		},
		'uw-deadlink': {
			label: 'مردہ ربط پر مشتمل درست مآخذ کا حذف',
			summary: 'اطلاع: مردہ ربط پر مشتمل درست مآخذ کا حذف'
		},
		'uw-displaytitle': {
			label: 'نمائش_عنوان کا غلط استعمال',
			summary: 'اطلاع: نمائش_عنوان کا غلط استعمال'
		},
		'uw-draftfirst': {
			label: 'صارفین اپنے صارف نام فضا کے تحت مضامین کا مسودہ لکھیں، اس میں فوری حذف کا خدشہ نہیں ہوتا',
			summary: 'اطلاع: [[معاونت:صارف نام فضا میں مسودہ|صارف نام فضا]] میں اپنے مضمون کا مسودہ لکھیں'
		},
		'uw-editsummary': {
			label: 'نووارد صارف خلاصۂ ترمیم کا استعمال نہیں کر رہا ہے',
			summary: 'اطلاع: خلاصۂ ترمیم کے استعمال سے گریز'
		},
		'uw-editsummary2': {
			label: 'تجربہ کار صارف خلاصۂ ترمیم کا استعمال نہیں کر رہا ہے',
			summary: 'اطلاع: خلاصۂ ترمیم کے استعمال سے گریز',
			hideLinkedPage: true,
			hideReason: true
		},
		'uw-elinbody': {
			label: 'مضمون کے متن میں بیرونی روابط کا اندراج',
			summary: 'اطلاع: بیرونی روابط کو بیرونی روابط کے قطعہ تک محدود رکھیں جو مضمون کے آخر میں ہوتا ہے'
		},
		'uw-urdu': {
			label: 'اثنائے گفتگو اردو زبان سے گریز',
			summary: 'اطلاع: اثنائے گفتگو اردو زبان سے گریز'
		},
		'uw-hasty': {
			label: 'فوری حذف کی ٹیگ کاری میں عجلت کا مظاہرہ',
			summary: 'اطلاع: مضامین میں حذف کا سانچہ لگانے سے قبل ان کے لکھنے والوں کو اصلاح و بہتری اور ترمیم و اضافہ کا وقت دیجیے'
		},
		'uw-islamhon': {
			label: 'القاب کا استعمال',
			summary: 'اطلاع: القاب کا استعمال'
		},
		'uw-linking': {
			label: 'سرخ یا نیلے روابط کا بے دریغ اور مکرر استعمال',
			summary: 'اطلاع: سرخ یا نیلے روابط کا بے دریغ اور مکرر استعمال'
		},
		'uw-minor': {
			label: 'معمولی ترمیم کے خانہ کا غلط استعمال',
			summary: 'اطلاع: معمولی ترمیم کے خانہ کا غلط استعمال'
		},
		'uw-noturduedit': {
			label: 'غیر اردو میں مضامین نویسی یا ترمیم',
			summary: 'اطلاع: غیر اردو میں مضامین نویسی یا ترمیم'
		},
		'uw-notvote': {
			label: 'ہماری بنیاد اتفاق آرا ہے، رائے دہی نہیں',
			summary: 'اطلاع: ہماری بنیاد اتفاق آرا ہے، رائے دہی نہیں'
		},
		'uw-plagiarism': {
			label: 'بغیر انتساب کے دائرہ عام سے مواد نقل کرنا',
			summary: 'اطلاع:بغیر انتساب کے دائرہ عام سے مواد نقل کرنا'
		},
		'هuw-preview': {
			label: 'غلطیوں سے بچنے کے لیے نمائش کا بٹن استعمال کریں',
			summary: 'اطلاع: غلطیوں سے بچنے کے لیے نمائش کا بٹن استعمال کریں'
		},
		'uw-redlink': {
			label: 'سرخ روابط کا بلا امتیاز ازالہ',
			summary: 'اطلاع: سرخ روابط کو ختم کرنے میں احتیاط برتیں'
		},
		'uw-selfrevert': {
			label: 'اپنی تجرباتی ترامیم کا استرجع',
			summary: 'اطلاع: اپنی تجرباتی ترامیم کا استرجع'
		},
		'uw-socialnetwork': {
			label: 'ویکیپیڈیا سماجی روابط کا ذریعہ نہیں ہے',
			summary: 'اطلاع: ویکیپیڈیا سماجی روابط کا ذریعہ نہیں ہے'
		},
		'uw-sofixit': {
			label: 'جری بنیں اور غلطیوں کی اصلاح خود کریں',
			summary: 'اطلاع: غلطیوں کی اصلاح میں آپ جرات کا مظاہرہ کر سکتے ہیں'
		},
		'uw-spoiler': {
			label: 'متعلقہ قطعوں میں اسپائلر الرٹ کا اضافہ یا اسپائلر کا حذف',
			summary: "اطلاع: ویکی مضامین میں موجود اسپائلر کو حذف یا نشان زد نہ کریں"
		},
		'uw-talkinarticle': {
			label: 'مضمون کے متن میں گفتگو',
			summary: 'اطلاع: مضمون کے متن میں گفتگو'
		},
		'uw-tilde': {
			label: 'پیغام کے آخر میں دستخط نہیں',
			summary: 'اطلاع: پیغام کے آخر میں دستخط نہیں'
		},
		'uw-toppost': {
			label: 'تبادلۂ خیال صفحات میں نیچے کی بجائے اوپر کی جانب نیا پیغام لکھنا',
			summary: 'اطلاع: تبادلۂ خیال صفحات میں نیچے کی بجائے اوپر کی جانب نیا پیغام لکھنا'
		},
		'uw-translation': {
			label: 'انتساب کے بغیر تراجم کا اضافہ',
			summary: 'اطلاع: انتساب کے بغیر تراجم کا اضافہ'
		},
		'uw-unattribcc': {
			label: 'انتساب کے بغیر مناسب اجازت نامہ کے حامل مآخذ سے نقل و چسپاں',
			summary: 'اطلاع: انتساب کے بغیر مناسب اجازت نامہ کے حامل مآخذ سے نقل و چسپاں'
		},
		'uw-userspace draft finish': {
			label: 'صارف نام فضا میں پرانا مسودہ',
			summary: 'اطلاع: صارف نام فضا میں پرانا مسودہ'
		},
		'uw-vgscope': {
			label: 'ویڈیو گیم کی قدم بہ قدم رہنمائی، رموز یا مکمل ہدایات کا اضافہ',
			summary: 'اطلاع: ویڈیو گیم کی قدم بہ قدم رہنمائی، رموز یا مکمل ہدایات کا اضافہ'
		},
		'uw-warn': {
			label: 'تخریب کاری کو واپس پھیرتے وقت انتباہِ صارف کا سانچہ استعمال کریں',
			summary: 'اطلاع: تخریب کاری کو واپس پھیرتے وقت آپ انتباہی سانچوں کو استعمال کر سکتے ہیں'
		},
		'uw-wrongsummary': {
			label: 'ناکافی یا نامناسب خلاصۂ ترمیم',
			summary: 'انتباہ: ناکافی یا نامناسب خلاصۂ ترمیم'
		}
	},

	singlewarn: {
		'uw-3rr': {
			label: 'استرجعات ثلاثہ کے اصول کی ممکنہ خلاف ورزی؛ صا-تج بھی ملاحظہ کریں',
			summary: 'انتباہ: استرجعات ثلاثہ کے اصول'
		},
		'uw-affiliate': {
			label: 'الحاقی فروخت کاری (ایفی لئیٹ مارکیٹنگ)',
			summary: 'انتباہ: الحاقی فروخت کاری (ایفی لئیٹ مارکیٹنگ)'
		},
		'uw-attack': {
			label: 'حملہ صفحات کی تخلیق',
			summary: 'انتباہ: حملہ صفحات کی تخلیق',
			suppressArticleInSummary: true
		},
		'uw-botun': {
			label: 'خودکار صارف نام',
			summary: 'انتباہ: خودکار صارف نام'
		},
		'uw-canvass': {
			label: 'ووٹ طلبی',
			summary: 'انتباہ: ووٹ طلبی'
		},
		'uw-copyright': {
			label: 'کاپی رائٹ کی خلاف ورزی',
			summary: 'انتباہ: کاپی رائٹ کی خلاف ورزی'
		},
		'uw-copyright-link': {
			label: 'کاپی رائٹ شدہ مواد کا ربط',
			summary: 'انتباہ: کاپی رائٹ شدہ مواد کا ربط'
		},
		'uw-copyright-new': {
			label: 'کاپی رائٹ کی خلاف ورزی (مع توضیحات برائے نووارد صارف)',
			summary: 'اطلاع: کاپی رائٹ کے مسائل سے گریز',
			heading: 'ویکیپیڈیا اور کاپی رائٹ'
		},
		'uw-copyright-remove': {
			label: 'مضامین سے کاپی رائٹ کی خلاف ورزی کے ٹیگ کا ازالہ',
			summary: 'انتباہ: کاپی رائٹ کی خلاف ورزی کے ٹیگ کا ازالہ'
		},
		'uw-efsummary': {
			label: 'مقطر غلط کاری کو متحرک کرنے والا خلاصۂ ترمیم',
			summary: 'انتباہ: مقطر غلط کاری کو متحرک کرنے والا خلاصۂ ترمیم'
		},
		'uw-ew': {
			label: 'ترمیمی جنگ (سخت ترین پیرایہ میں)',
			summary: 'انتباہ: ترمیمی جنگ'
		},
		'uw-ewsoft': {
			label: 'ترمیمی جنگ (نوواردوں کے لیے نرم لفظوں میں)',
			summary: 'انتباہ: ترمیمی جنگ'
		},
		'uw-hijacking': {
			label: 'مضامین پر قبضہ',
			summary: 'انتباہ: مضامین پر قبضہ'
		},
		'uw-hoax': {
			label: 'افسانہ طرازی',
			summary: 'انتباہ: افسانہ طرازی'
		},
		'uw-legal': {
			label: 'قانونی دھمکی',
			summary: 'انتباہ: قانونی دھمکی'
		},
		'uw-login': {
			label: 'لاگ ان کے بغیر ترمیم کاری',
			summary: 'انتباہ: لاگ ان کے بغیر ترمیم کاری'
		},
		'uw-multipleIPs': {
			label: 'متعدد آئی پی پتوں کا استعمال',
			summary: 'انتباہ: مختلف آئی پی پتوں سے تخریب کاری'
		},
		'uw-paraphrase': {
			label: 'اعادۂ مضمون',
			summary: 'انتباہ: اعادۂ مضمون'
		},
		'uw-pinfo': {
			label: 'نجی معلومات (غیر موسوعی)',
			summary: 'انتباہ: نجی معلومات'
		},
		'uw-salt': {
			label: 'محفوظ صفحات کی کسی دوسرے عنوان سے از سر نو تخلیق',
			summary: 'اطلاع: محفوظ صفحات کی کسی دوسرے عنوان سے از سر نو تخلیق'
		},
		'uw-socksuspect': {
			label: 'پتلی بازی',
			summary: 'انتباہ: آپ ایک مشکوک [[وپ:پتلی|پتلی]] ہے'  // of User:...
		},
		'uw-upv': {
			label: 'صارف صفحات میں تخریب کاری',
			summary: 'انتباہ: صارف صفحات میں تخریب کاری'
		},
		'uw-username': {
			label: 'خلاف اصول صارف نام',
			summary: 'انتباہ: شاید آپ کا نام ویکی اصولوں کے خلاف ہے',
			suppressArticleInSummary: true  // not relevant for this template
		},
		'uw-coi-username': {
			label: 'ویکی اصولوں کے خلاف صارف نام اور مفادات کا تصادم',
			summary: 'انتباہ: صارف نام اور مفادات کا تصادم',
			heading: 'آپ کا صارف نام'
		},
		'uw-userpage': {
			label: 'صارف صفحہ یا ذیلی صفحہ ویکی اصولوں کے خلاف ہے',
			summary: 'انتباہ: صارف صفحہ یا ذیلی صفحہ ویکی اصولوں کے خلاف ہے'
		}
	}
};

// to make local levels usable for Twinkle.warn.getTemplateProperty()
var localToGlobalLevels = {
	'/1': '1',
	'/2': '2',
	'/3': '3',
	'/4': '4',
	'/4/حتمی انتباہ': '4im'
};

var globalToLocalLevels = {
	'1': '/1',
	'2': '/2',
	'3': '/3',
	'4': '/4',
	'4im': '/4/حتمی انتباہ'
};

/**
 * Reads Twinkle.warn.messages and returns a specified template's property (such as label, summary,
 * suppressArticleInSummary, hideLinkedPage, or hideReason)
 */
Twinkle.warn.getTemplateProperty = function(templates, templateName, propertyName) {
	var result;
	var isNumberedTemplate = templateName.match(/(\/1|\/2|\/3|\/4|\/4\/حتمی انتباہ|1|2|3|4|4im)$/);
	if (isNumberedTemplate) {
		var unNumberedTemplateName = templateName.replace(/(?:\/1|1|\/2|2|\/3|3|\/4|4|\/4\/حتمی انتباہ|4im)$/, '');
		var level = localToGlobalLevels[isNumberedTemplate[0]];
		var numberedWarnings = {};
		$.each(templates.levels, function(key, val) {
			$.extend(numberedWarnings, val);
		});
		$.each(numberedWarnings, function(key) {
			if (key === unNumberedTemplateName) {
				result = numberedWarnings[key]['level' + level][propertyName];
			}
		});
	}

	// Non-level templates can also end in a number. So check this for all templates.
	var otherWarnings = {};
	$.each(templates, function(key, val) {
		if (key !== 'levels') {
			$.extend(otherWarnings, val);
		}
	});
	$.each(otherWarnings, function(key) {
		if (key === templateName) {
			result = otherWarnings[key][propertyName];
		}
	});

	return result;
};

// Used repeatedly below across menu rebuilds
Twinkle.warn.prev_article = null;
Twinkle.warn.prev_reason = null;
Twinkle.warn.talkpageObj = null;

Twinkle.warn.callback.change_category = function twinklewarnCallbackChangeCategory(e) {
	var value = e.target.value;
	var sub_group = e.target.root.sub_group;
	sub_group.main_group = value;
	var old_subvalue = sub_group.value;
	var old_subvalue_re;
	if (old_subvalue) {
		if (value === 'kitchensink') { // Exact match possible in kitchensink menu
			old_subvalue_re = new RegExp(mw.util.escapeRegExp(old_subvalue));
		} else {
			old_subvalue = old_subvalue.replace(/\/[1-4]*(\/حتمی انتباہ)?$/, '');
			old_subvalue_re = new RegExp(mw.util.escapeRegExp(old_subvalue) + '\/([1-4]*(?:\/حتمی انتباہ)?)$');
		}
	}

	while (sub_group.hasChildNodes()) {
		sub_group.removeChild(sub_group.firstChild);
	}

	var selected = false;
	// worker function to create the combo box entries
	var createEntries = function(contents, container, wrapInOptgroup, val) {
		val = typeof val !== 'undefined' ? val : value; // IE doesn't support default parameters
		// level2->2, singlewarn->''; also used to distinguish the
		// scaled levels from singlenotice, singlewarn, and custom
		var level = val.replace(/^\D+/g, '');
		// due to an apparent iOS bug, we have to add an option-group to prevent truncation of text
		// (search WT:TW archives for "Problem selecting warnings on an iPhone")
		if (wrapInOptgroup && $.client.profile().platform === 'iphone') {
			var wrapperOptgroup = new Morebits.quickForm.element({
				type: 'optgroup',
				label: 'دستیاب سانچے'
			});
			wrapperOptgroup = wrapperOptgroup.render();
			container.appendChild(wrapperOptgroup);
			container = wrapperOptgroup;
		}

		$.each(contents, function(itemKey, itemProperties) {
			// Skip if the current template doesn't have a version for the current level
			if (!!level && !itemProperties[val]) {
				return;
			}
			var key = typeof itemKey === 'string' ? itemKey : itemProperties.value;
			var template = key + level;

			var elem = new Morebits.quickForm.element({
				type: 'option',
				label: '{{' + template + '}}: ' + (level ? itemProperties[val].label : itemProperties.label),
				value: template
			});

			// Select item best corresponding to previous selection
			if (!selected && old_subvalue && old_subvalue_re.test(template)) {
				elem.data.selected = selected = true;
			}
			var elemRendered = container.appendChild(elem.render());
			$(elemRendered).data('messageData', itemProperties);
		});
	};
	var createGroup = function(warnGroup, label, wrapInOptgroup, val) {
		wrapInOptgroup = typeof wrapInOptgroup !== 'undefined' ? wrapInOptgroup : true;
		var optgroup = new Morebits.quickForm.element({
			type: 'optgroup',
			label: label
		});
		optgroup = optgroup.render();
		sub_group.appendChild(optgroup);
		createEntries(warnGroup, optgroup, wrapInOptgroup, val);
	};

	switch (value) {
		case 'singlenotice':
		case 'singlewarn':
			createEntries(Twinkle.warn.messages[value], sub_group, true);
			break;
		case 'singlecombined':
			var unSortedSinglets = $.extend({}, Twinkle.warn.messages.singlenotice, Twinkle.warn.messages.singlewarn);
			var sortedSingletMessages = {};
			Object.keys(unSortedSinglets).sort().forEach(function(key) {
				sortedSingletMessages[key] = unSortedSinglets[key];
			});
			createEntries(sortedSingletMessages, sub_group, true);
			break;
		case 'custom':
			createEntries(Twinkle.getPref('customWarningList'), sub_group, true);
			break;
		case 'kitchensink':
			['level1', 'level2', 'level3', 'level4', 'level4im'].forEach(function(lvl) {
				$.each(Twinkle.warn.messages.levels, function(levelGroupLabel, levelGroup) {
					createGroup(levelGroup, 'درجہ ' + mw.language.convertNumber(lvl.slice(5)) + ': ' + levelGroupLabel, true, lvl);
				});
			});
			createGroup(Twinkle.warn.messages.singlenotice, 'یک موضوعی اعلانات');
			createGroup(Twinkle.warn.messages.singlewarn, 'یک موضوعی انتباہات');
			createGroup(Twinkle.getPref('customWarningList'), 'شخصی انتباہات');
			break;
		case 'level1':
		case 'level2':
		case 'level3':
		case 'level4':
		case 'level4im':
			// Creates subgroup regardless of whether there is anything to place in it;
			// leaves "Removal of deletion tags" empty for 4im
			$.each(Twinkle.warn.messages.levels, function(groupLabel, groupContents) {
				createGroup(groupContents, groupLabel, false);
			});
			break;
		case 'autolevel':
			// Check user page to determine appropriate level
			var autolevelProc = function() {
				var wikitext = Twinkle.warn.talkpageObj.getPageText();
				// history not needed for autolevel
				var latest = Twinkle.warn.callbacks.dateProcessing(wikitext)[0];
				// Pseudo-params with only what's needed to parse the level i.e. no messageData
				var params = {
					sub_group: old_subvalue,
					article: e.target.root.article.value
				};
				var lvl = 'level' + Twinkle.warn.callbacks.autolevelParseWikitext(wikitext, params, latest)[1];

				// Identical to level1, etc. above but explicitly provides the level
				$.each(Twinkle.warn.messages.levels, function(groupLabel, groupContents) {
					createGroup(groupContents, groupLabel, false, lvl);
				});

				// Trigger subcategory change, add select menu, etc.
				Twinkle.warn.callback.postCategoryCleanup(e);
			};


			if (Twinkle.warn.talkpageObj) {
				autolevelProc();
			} else {
				var usertalk_page = new Morebits.wiki.page('تبادلۂ_خیال_صارف:' + mw.config.get('wgRelevantUserName'), 'سابقہ انتباہات لوڈ ہو رہے ہیں');
				usertalk_page.setFollowRedirect(true, false);
				usertalk_page.load(function(pageobj) {
					Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj
					autolevelProc();
				}, function() {
					// Catch and warn if the talkpage can't load,
					// most likely because it's a cross-namespace redirect
					// Supersedes the typical $autolevelMessage added in autolevelParseWikitext
					var $noTalkPageNode = $('<strong/>', {
						text: 'صارف کا تبادلۂ خیال صفحہ لوڈ نہیں ہو سکا، شاید یہ کسی دوسرے نام فضا کی جانب رجوع مکرر ہے۔ چنانچہ اس صارف کو کس سطح کا پیغام بھیجنا ہے، اس کا خودکار نظام اب کام نہیں کرے گا',
						id: 'twinkle-warn-autolevel-message',
						css: {color: 'red' }
					});
					$noTalkPageNode.insertBefore($('#twinkle-warn-warning-messages'));
					// If a preview was opened while in a different mode, close it
					// Should nullify the need to catch the error in preview callback
					e.target.root.previewer.closePreview();
				});
			}
			break;
		default:
			alert('پلک کے انتباہ ماڈیول میں نامعلوم انتباہی گروپ');
			break;
	}

	// Trigger subcategory change, add select menu, etc.
	// Here because of the async load for autolevel
	if (value !== 'autolevel') {
		// reset any autolevel-specific messages while we're here
		$('#twinkle-warn-autolevel-message').remove();

		Twinkle.warn.callback.postCategoryCleanup(e);
	}
};

Twinkle.warn.callback.postCategoryCleanup = function twinklewarnCallbackPostCategoryCleanup(e) {
	// clear overridden label on article textbox
	Morebits.quickForm.setElementTooltipVisibility(e.target.root.article, true);
	Morebits.quickForm.resetElementLabel(e.target.root.article);
	// Trigger custom label/change on main category change
	Twinkle.warn.callback.change_subcategory(e);

	// Use select2 to make the select menu searchable
	if (!Twinkle.getPref('oldSelect')) {
		$('select[name=sub_group]')
			.select2({
				width: '100%',
				matcher: Morebits.select2.matchers.optgroupFull,
				templateResult: Morebits.select2.highlightSearchMatches,
				language: {
					searching: Morebits.select2.queryInterceptor
				}
			})
			.change(Twinkle.warn.callback.change_subcategory);

		$('.select2-selection').keydown(Morebits.select2.autoStart).focus();

		mw.util.addCSS(
			// Increase height
			'.select2-container .select2-dropdown .select2-results > .select2-results__options { max-height: 350px; }' +

			// Reduce padding
			'.select2-results .select2-results__option { padding-top: 1px; padding-bottom: 1px; }' +
			'.select2-results .select2-results__group { padding-top: 1px; padding-bottom: 1px; } ' +

			// Adjust font size
			'.select2-container .select2-dropdown .select2-results { font-size: 13px; }' +
			'.select2-container .selection .select2-selection__rendered { font-size: 13px; }'
		);
	}
};

Twinkle.warn.callback.change_subcategory = function twinklewarnCallbackChangeSubcategory(e) {
	var selected_main_group = e.target.form.main_group.value;
	var selected_template = e.target.form.sub_group.value;

	// If template shouldn't have a linked article, hide the linked article label and text box
	var hideLinkedPage = Twinkle.warn.getTemplateProperty(Twinkle.warn.messages, selected_template, 'hideLinkedPage');
	if (hideLinkedPage) {
		e.target.form.article.value = '';
		Morebits.quickForm.setElementVisibility(e.target.form.article.parentElement, false);
	} else {
		Morebits.quickForm.setElementVisibility(e.target.form.article.parentElement, true);
	}

	// If template shouldn't have an optional message, hide the optional message label and text box
	var hideReason = Twinkle.warn.getTemplateProperty(Twinkle.warn.messages, selected_template, 'hideLinkedPage');
	if (hideReason) {
		e.target.form.reason.value = '';
		Morebits.quickForm.setElementVisibility(e.target.form.reason.parentElement, false);
	} else {
		Morebits.quickForm.setElementVisibility(e.target.form.reason.parentElement, true);
	}

	// Tags that don't take a linked article, but something else (often a username).
	// The value of each tag is the label next to the input field
	var notLinkedArticle = {
		'uw-agf-sock': 'دوسرے کھاتے کا صارف نام، اختیاری (صارف: سابقہ کے بغیر) ',
		'uw-bite': "اذیت خوردہ صارف کا نام (صارف: سابقہ کے بغیر) ",
		'uw-socksuspect': 'پتلی باز کا صارف نام، اگر معلوم ہو (صارف: سابقہ کے بغیر) ',
		'uw-username': 'صارف نام کے خلاف اصول ہونے کی وجہ',
		'uw-aiv': 'جس صارف کی شکایت کی گئی، اس کا صارف نام، اختیاری (صارف: سابقہ کے بغیر) '
	};

	var hasLevel = ['singlenotice', 'singlewarn', 'singlecombined', 'kitchensink'].indexOf(selected_main_group) !== -1;
	if (hasLevel) {
		if (notLinkedArticle[selected_template]) {
			if (Twinkle.warn.prev_article === null) {
				Twinkle.warn.prev_article = e.target.form.article.value;
			}
			e.target.form.article.notArticle = true;
			e.target.form.article.value = '';

			// change form labels according to the warning selected
			Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);
			Morebits.quickForm.overrideElementLabel(e.target.form.article, notLinkedArticle[selected_template]);
		} else if (e.target.form.article.notArticle) {
			if (Twinkle.warn.prev_article !== null) {
				e.target.form.article.value = Twinkle.warn.prev_article;
				Twinkle.warn.prev_article = null;
			}
			e.target.form.article.notArticle = false;
			Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, true);
			Morebits.quickForm.resetElementLabel(e.target.form.article);
		}
	}

	// add big red notice, warning users about how to use {{uw-[coi-]username}} appropriately
	$('#tw-warn-red-notice').remove();
	var $redWarning;
	if (selected_template === 'uw-username') {
		$redWarning = $("<div style='color: red;' id='tw-warn-red-notice'>{{uw-username}} کے سانچہ کو اصولوں کی <b>واضح</b> خلاف ورزی پر استعمال <b>نہیں</b> کرنا چاہیے۔ " +
			"بلکہ ایسی واضح خلاف ورزی کی صورت میں راست دیوان خاص سے رجوع کیجیے (پلک کی شکایت ٹیب کی مدد سے)۔ " +
			'{{uw-username}} کا استعمال فقط ان صورتوں میں ہوتا ہے جب متعلقہ صارف سے گفت و شنید مطلوب ہو۔</div>');
		$redWarning.insertAfter(Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup));
	} else if (selected_template === 'uw-coi-username') {
		$redWarning = $("<div style='color: red;' id='tw-warn-red-notice'>{{uw-coi-username}} کے سانچہ کو اصولوں کی <b>واضح</b> خلاف ورزی پر استعمال <b>نہیں</b> کرنا چاہیے۔ " +
			"بلکہ ایسی واضح خلاف ورزی کی صورت میں راست دیوان خاص سے رجوع کیجیے (پلک کی شکایت ٹیب کی مدد سے)۔ " +
			'{{uw-coi-username}} کا استعمال فقط ان صورتوں میں ہوتا ہے جب متعلقہ صارف سے گفت و شنید مطلوب ہو۔</div>');
		$redWarning.insertAfter(Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup));
	}
};

Twinkle.warn.callbacks = {
	getWarningWikitext: function(templateName, article, reason, isCustom) {
		var text = '{{جا:' + templateName;

		// add linked article for user warnings
		if (article) {
			// c&pmove has the source as the first parameter
			if (templateName === 'uw-c&pmove') {
				text += '|to=' + article;
			} else {
				text += '|1=' + article;
			}
		}
		if (reason && !isCustom) {
			// add extra message
			if (templateName === 'هبک-محس' || templateName === 'uw-csd' ||
				templateName === 'uw-probation' ||
				templateName === 'uw-userspacenoindex' || templateName === 'هبک-فضای کاربری نمایه‌نشده' ||
				templateName === 'uw-userpage' || templateName === 'هبک-صفحه کاربری') {
				text += "|3=''" + reason + "''";
			} else {
				text += "|2=''" + reason + "''";
			}
		}
		text += '}}';

		if (reason && isCustom) {
			// we assume that custom warnings lack a {{{2}}} parameter
			text += " ''" + reason + "''";
		}

		return text + '~~~~';
	},
	showPreview: function(form, templatename) {
		var input = Morebits.quickForm.getInputData(form);
		// Provided on autolevel, not otherwise
		templatename = templatename || input.sub_group;
		var linkedarticle = input.article;
		var templatetext;

		templatetext = Twinkle.warn.callbacks.getWarningWikitext(templatename, linkedarticle,
			input.reason, input.main_group === 'custom');

		form.previewer.beginRender(templatetext, 'تبادلۂ_خیال_صارف:' + mw.config.get('wgRelevantUserName')); // Force wikitext/correct username
	},
	// Just a pass-through unless the autolevel option was selected
	preview: function(form) {
		if (form.main_group.value === 'autolevel') {
			// Always get a new, updated talkpage for autolevel processing
			var usertalk_page = new Morebits.wiki.page('تبادلۂ_خیال_صارف:' + mw.config.get('wgRelevantUserName'), 'سابقہ انتباہات لوڈ ہو رہے ہیں');
			usertalk_page.setFollowRedirect(true, false);
			// Will fail silently if the talk page is a cross-ns redirect,
			// removal of the preview box handled when loading the menu
			usertalk_page.load(function(pageobj) {
				Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj

				var wikitext = pageobj.getPageText();
				// history not needed for autolevel
				var latest = Twinkle.warn.callbacks.dateProcessing(wikitext)[0];
				var params = {
					sub_group: form.sub_group.value,
					article: form.article.value,
					messageData: $(form.sub_group).find('option[value="' + $(form.sub_group).val() + '"]').data('messageData')
				};
				var template = Twinkle.warn.callbacks.autolevelParseWikitext(wikitext, params, latest)[0];
				Twinkle.warn.callbacks.showPreview(form, template);

				// If the templates have diverged, fake a change event
				// to reload the menu with the updated pageobj
				if (form.sub_group.value !== template) {
					var evt = document.createEvent('Event');
					evt.initEvent('change', true, true);
					form.main_group.dispatchEvent(evt);
				}
			});
		} else {
			Twinkle.warn.callbacks.showPreview(form);
		}
	},
	/**
	* Used in the main and autolevel loops to determine when to warn
	* about excessively recent, stale, or identical warnings.
	* @param {string} wikitext  The text of a user's talk page, from getPageText()
	* @returns {Object[]} - Array of objects: latest contains most recent
	* warning and date; history lists all prior warnings
	*/
	dateProcessing: function(wikitext) {
		var history_re = /<!--\s?(Template|سانچہ):([uU]w-.*?|صا-.*?)\s?-->.*?(\d{1,2}:\d{1,2}، \d{1,2} [ا-ی]+ \d{4}ء \(م ع و\))/g;
		var history = {};
		var latest = { date: new Morebits.date(0), type: '' };
		var current;

		while ((current = history_re.exec(wikitext)) !== null) {
			var template = current[1], current_date = new Morebits.date(current[2]);
			if (!(template in history) || history[template].isBefore(current_date)) {
				history[template] = current_date;
			}
			if (!latest.date.isAfter(current_date)) {
				latest.date = current_date;
				latest.type = template;
			}
		}
		return [latest, history];
	},
	/**
	* Main loop for deciding what the level should increment to. Most of
	* this is really just error catching and updating the subsequent data.
	* May produce up to two notices in a twinkle-warn-autolevel-messages div
	*
	* @param {string} wikitext  The text of a user's talk page, from getPageText() (required)
	* @param {Object} params  Params object: sub_group is the template (required);
	* article is the user-provided article (form.article) used to link ARV on recent level4 warnings;
	* messageData is only necessary if getting the full template, as it's
	* used to ensure a valid template of that level exists
	* @param {Object} latest  First element of the array returned from
	* dateProcessing. Provided here rather than processed within to avoid
	* repeated call to dateProcessing
	* @param {(Date|Morebits.date)} date  Date from which staleness is determined
	* @param {Morebits.status} statelem  Status element, only used for handling error in final execution
	*
	* @returns {Array} - Array that contains the full template and just the warning level
	*/
	autolevelParseWikitext: function(wikitext, params, latest, date, statelem) {
		var level; // undefined rather than '' means the isNaN below will return true
		if (/\d(?:im)?$/.test(latest.type) || /\/[1-4](?:\/حتمی انتباہ)?$/.test(latest.type)) { // level1-4im
			level = parseInt(
					mw.language.convertNumber(
						latest.type.replace(/.*((\d|\/[1-4]))(?:im|\/حتمی انتباہ)?$/, '$1'),
						true
					),
					10
				);
		} else if (latest.type) { // Non-numbered warning
			// Try to leverage existing categorization of
			// warnings, all but one are universally lowercased
			var loweredType = /uw-multipleIPs/i.test(latest.type) ? 'uw-multipleIPs' : latest.type.toLowerCase();
			// It would be nice to account for blocks, but in most
			// cases the hidden message is terminal, not the sig
			if (Twinkle.warn.messages.singlewarn[loweredType]) {
				level = 3;
			} else {
				level = 1; // singlenotice or not found
			}
		}

		var $autolevelMessage = $('<div/>', {id: 'twinkle-warn-autolevel-message'});

		if (isNaN(level)) { // No prior warnings found, this is the first
			level = 1;
		} else if (level > 4 || level < 1) { // Shouldn't happen
			var message = 'انتباہ کا درجہ نہیں معلوم ہو سکا، براہ کرم درجۂ انتباہ کا انتخاب بدست خود کریں';
			if (statelem) {
				statelem.error(message);
			} else {
				alert(message);
			}
			return;
		} else {
			date = date || new Date();
			var autoTimeout = new Morebits.date(latest.date.getTime()).add(parseInt(Twinkle.getPref('autolevelStaleDays'), 10), 'days');
			if (autoTimeout.isAfter(date)) {
				if (level === 4) {
					level = 4;
					// Basically indicates whether we're in the final Main evaluation or not,
					// and thus whether we can continue or need to display the warning and link
					if (!statelem) {
						var $link = $('<a/>', {
							href: '#',
							text: 'شکایت کا ٹیب کھولنے کے لیے یہاں کلک کریں۔',
							css: { fontWeight: 'bold' },
							click: function() {
								Morebits.wiki.actionCompleted.redirect = null;
								Twinkle.warn.dialog.close();
								Twinkle.arv.callback(mw.config.get('wgRelevantUserName'));
								$('input[name=page]').val(params.article); // Target page
								$('input[value=final]').prop('checked', true); // Vandalism after final
							}
						});
						var statusNode = $('<div/>', {
							text: mw.config.get('wgRelevantUserName') + ' کو حال ہی میں درجۂ چہارم کا انتباہ ملا ہے (' + latest.type + ') لہذا اب اس صارف کی شکایت کرنا بہتر ہوگا؛ ',
							css: {color: 'red' }
						});
						statusNode.append($link[0]);
						$autolevelMessage.append(statusNode);
					}
				} else { // Automatically increase severity
					level += 1;
				}
			} else { // Reset warning level if most-recent warning is too old
				level = 1;
			}
		}

		$autolevelMessage.prepend($('<div>صارف کو <span style="font-weight: bold;">درجہ ' + mw.language.convertNumber(level) + '</span> کا سانچہ بھیجا جائے گا۔</div>'));
		// Place after the stale and other-user-reverted (text-only) messages
		$('#twinkle-warn-autolevel-message').remove(); // clean slate
		$autolevelMessage.insertAfter($('#twinkle-warn-warning-messages'));

		var template = params.sub_group.replace(/(.*)(\d|[1-4])$/, '$1');
		// Validate warning level, falling back to the uw-generic series.
		// Only a few items are missing a level, and in all but a handful
		// of cases, the uw-generic series is explicitly used elsewhere per WP:UTM.
		if (params.messageData && !params.messageData['level' + level]) {
			template = 'uw-generic';
		}
		template += '/' + mw.language.convertNumber(level);

		return [template, level];
	},
	main: function(pageobj) {
		var text = pageobj.getPageText();
		var statelem = pageobj.getStatusElement();
		var params = pageobj.getCallbackParameters();
		var messageData = params.messageData;

		// JS somehow didn't get destructured assignment until ES6 so of course IE doesn't support it
		var warningHistory = Twinkle.warn.callbacks.dateProcessing(text);
		var latest = warningHistory[0];
		var history = warningHistory[1];

		var now = new Morebits.date(pageobj.getLoadTime());

		Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj, just in case
		if (params.main_group === 'autolevel') {
			// [template, level]
			var templateAndLevel = Twinkle.warn.callbacks.autolevelParseWikitext(text, params, latest, now, statelem);

			// Only if there's a change from the prior display/load
			if (params.sub_group !== templateAndLevel[0] && !confirm('صارف کو درجہ {{' + templateAndLevel[0] + '}}کا سانچہ بھیجا جائے گا؛ ٹھیک ہے؟')) {
				statelem.error('صارف کی درخواست پر کارروائی منسوخ کر دی گئی');
				return;
			}
			// Update params now that we've selected a warning
			params.sub_group = templateAndLevel[0];
			messageData = params.messageData['level' + mw.language.convertNumber(templateAndLevel[1], true)];
		} else if (params.sub_group in history) {
			if (new Morebits.date(history[params.sub_group]).add(1, 'day').isAfter(now)) {
				if (!confirm('صارف کو گذشتہ چوبیس گھنٹوں میں ' + params.sub_group + ' بھیجا جا چکا ہے۔  \nکیا آپ واقعی اطلاع / انتباہ بھیجنا چاہتے ہیں؟')) {
					statelem.error('صارف کی درخواست پر کارروائی منسوخ کر دی گئی');
					return;
				}
			}
		}

		latest.date.add(1, 'minute'); // after long debate, one minute is max

		if (latest.date.isAfter(now)) {
			if (!confirm('ابھی ایک منٹ پہلے ایک ' + latest.type + ' بھیجا جا چکا ہے۔  \nکیا آپ واقعی اطلاع / انتباہ بھیجنا چاہتے ہیں؟')) {
				statelem.error('صارف کی درخواست پر کارروائی منسوخ کر دی گئی');
				return;
			}
		}

		// build the edit summary
		// Function to handle generation of summary prefix for custom templates
		var customProcess = function(template) {
			template = template.split('|')[0];
			var prefix;
			switch (mw.language.convertNumber(template.substr(-1))) {
				case '1':
					prefix = 'عمومی اطلاع';
					break;
				case '2':
					prefix = 'فہمائش';
					break;
				case '3':
					prefix = 'انتباہ';
					break;
				case '4':
					prefix = 'آخری انتباہ ';
					break;
				case 'm':
					if (template.substr(-3) === '4im' || template.substr(-10) === 'حتمی انتباہ') {
						prefix = 'حتمی انتباہ';
						break;
					}
					// falls through
				default:
					prefix = 'اطلاع';
					break;
			}
			return prefix + ': ' + Morebits.string.toUpperCaseFirstChar(messageData.label);
		};

		var summary;
		if (params.main_group === 'custom') {
			summary = customProcess(params.sub_group);
		} else {
			// Normalize kitchensink to the 1-4im style
			if (params.main_group === 'kitchensink' && !/^D+$/.test(params.sub_group)) {
				var sub = params.sub_group.substr(-1);
				if (sub === 'm') {
					sub = params.sub_group.substr(-3);
				}
				if (sub === 'm') {
					sub = '4im';
				}
				// Don't overwrite uw-3rr, technically unnecessary
				if (/\d/.test(sub)) {
					params.main_group = 'level' + sub;
				}
				if (/[1-4]/.test(sub)) {
					params.main_group = 'level' + mw.language.convertNumber(sub, true);
				}
			}
			// singlet || level1-4im, no need to /^\D+$/.test(params.main_group)
			summary = messageData.summary || (messageData[params.main_group] && messageData[params.main_group].summary);
			// Not in Twinkle.warn.messages, assume custom template
			if (!summary) {
				summary = customProcess(params.sub_group);
			}
			if (messageData.suppressArticleInSummary !== true && params.article) {
				if (params.sub_group === 'uw-agf-sock' ||
						params.sub_group === 'هبک-فحن-زاپاس' ||
						params.sub_group === 'uw-socksuspect' ||
						params.sub_group === 'هبک-زاپاس مشکوک' ||
						params.sub_group === 'uw-aiv' ||
						params.sub_group === 'هبک-تام') {  // these templates require a username
					summary += ' برائے [[:صارف:' + params.article + ']]';
				} else {
					summary += ' در [[:' + params.article + ']]';
				}
			}
		}

		pageobj.setEditSummary(summary + '۔');
		pageobj.setChangeTags(Twinkle.changeTags);
		pageobj.setWatchlist(Twinkle.getPref('watchWarnings'));


		// Get actual warning text
		var warningText = Twinkle.warn.callbacks.getWarningWikitext(params.sub_group, params.article,
			params.reason, params.main_group === 'custom');
		if (Twinkle.getPref('showSharedIPNotice') && mw.util.isIPAddress(mw.config.get('wgTitle'))) {
			Morebits.status.info('اطلاع', 'مشترکہ آئی پی پتے کا اعلان چسپاں کیا جا رہا ہے');
			warningText += '\n{{جا:Shared IP advice}}';
		}

		var sectionExists = false, sectionNumber = 0;
		// Only check sections if there are sections or there's a chance we won't create our own
		if (!messageData.heading && text.length) {
			// Get all sections
			var sections = text.match(/^(==*).+\1/gm);
			if (sections && sections.length !== 0) {
				// Find the index of the section header in question
				var dateHeaderRegex = now.monthHeaderRegex();
				sectionNumber = 0;
				// Find this month's section among L2 sections, preferring the bottom-most
				sectionExists = sections.reverse().some(function(sec, idx) {
					return /^(==)[^=].+\1/m.test(sec) && dateHeaderRegex.test(sec) && typeof (sectionNumber = sections.length - 1 - idx) === 'number';
				});
			}
		}

		if (sectionExists) { // append to existing section
			pageobj.setPageSection(sectionNumber + 1);
			pageobj.setAppendText('\n\n' + warningText);
			pageobj.append();
		} else {
			if (messageData.heading) { // create new section
				pageobj.setNewSectionTitle(messageData.heading);
			} else {
				Morebits.status.info('اطلاع', 'چونکہ اس تبادلۂ خیال صفحہ میں اس ماہ کا قطعہ نہیں ملا، اس لیے اس کا نیا قطعہ بنایا جائے گا');
				pageobj.setNewSectionTitle(now.monthHeader(0));
			}
			pageobj.setNewSectionText(warningText);
			pageobj.newSection();
		}
	}
};

Twinkle.warn.callback.evaluate = function twinklewarnCallbackEvaluate(e) {
	var userTalkPage = 'تبادلۂ_خیال_صارف:' + mw.config.get('wgRelevantUserName');

	// reason, main_group, sub_group, article
	var params = Morebits.quickForm.getInputData(e.target);

	// Check that a reason was filled in if uw-username was selected
	if (params.sub_group === 'uw-username' && !params.article) {
		alert('سانچہ {{uw-username}} استعمال کرنے کے لیے وجہ بیان کرنا لازمی ہے۔');
		return;
	}

	// The autolevel option will already know by now if a user talk page
	// is a cross-namespace redirect (via !!Twinkle.warn.talkpageObj), so
	// technically we could alert an error here, but the user will have
	// already ignored the bold red error above.  Moreover, they probably
	// *don't* want to actually issue a warning, so the error handling
	// after the form is submitted is probably preferable

	// Find the selected <option> element so we can fetch the data structure
	var $selectedEl = $(e.target.sub_group).find('option[value="' + $(e.target.sub_group).val() + '"]');
	params.messageData = $selectedEl.data('messageData');

	Morebits.simpleWindow.setButtonsEnabled(false);
	Morebits.status.init(e.target);

	Morebits.wiki.actionCompleted.redirect = userTalkPage;
	Morebits.wiki.actionCompleted.notice = 'انتباہ مکمل، چند سیکنڈ میں صفحہ تازہ ہو جائے گا';

	var wikipedia_page = new Morebits.wiki.page(userTalkPage, 'صارف کے تبادلۂ خیال صفحہ میں ترمیم کی جا رہی ہے');
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.setFollowRedirect(true, false);
	wikipedia_page.load(Twinkle.warn.callbacks.main);
};

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


// </nowiki>