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

از ویکی‌پدیا، دانشنامهٔ آزاد

نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاک‌سازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاک‌سازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکی‌پدیا:میانگیر مرورگرتان را خالی کنید را ببینید.

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinklewarn.js: Warn module
 ****************************************
 * Mode of invocation:     Tab ("Warn")
 * 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('راهنمای توینکل', 'وپ:توینکل/توضیحات#هشدار');
	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: 'انتخاب سطح خودکار (۱-۴)', value: 'autolevel', selected: defaultGroup === 11 });
	main_group.append({ type: 'option', label: '۱: یادداشت عمومی', value: 'level1', selected: defaultGroup === 1 });
	main_group.append({ type: 'option', label: '۲: اخطار', value: 'level2', selected: defaultGroup === 2 });
	main_group.append({ type: 'option', label: '۳: هشدار', value: 'level3', selected: defaultGroup === 3 });
	main_group.append({ type: 'option', label: '۴: آخرین هشدار', value: 'level4', selected: defaultGroup === 4 });
	main_group.append({ type: 'option', label: '۴م: تنها هشدار', 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: 'تنها هشدار: خرابکاری'
				}
			},
			'هبک-اخلالگرانه': {
				level1: {
					label: 'ویرایش اخلالگرانه',
					summary: 'یادداشت عمومی: ویرایش غیرسازنده'
				},
				level2: {
					label: 'ویرایش اخلالگرانه',
					summary: 'اخطار: ویرایش غیرسازنده'
				},
				level3: {
					label: 'ویرایش اخلالگرانه',
					summary: 'هشدار: ویرایش اخلالگرانه'
				}
			},
			'هبک-آزمایشی': {
				level1: {
					label: 'ویرایش‌های آزمایشی',
					summary: 'یادداشت عمومی: ویرایش‌های آزمایشی'
				},
				level2: {
					label: 'ویرایش‌های آزمایشی',
					summary: 'اخطار: ویرایش‌های آزمایشی'
				},
				level3: {
					label: 'ویرایش‌های آزمایشی',
					summary: 'هشدار: ویرایش‌های آزمایشی'
				}
			},
			'هبک-حذف': {
				level1: {
					label: 'حذف محتوا، خالی کردن',
					summary: 'یادداشت عمومی: حذف محتوا، خالی کردن'
				},
				level2: {
					label: 'حذف محتوا، خالی کردن',
					summary: 'اخطار: حذف محتوا، خالی کردن'
				},
				level3: {
					label: 'حذف محتوا، خالی کردن',
					summary: 'هشدار: حذف محتوا، خالی کردن'
				},
				level4: {
					label: 'حذف محتوا، خالی کردن',
					summary: 'آخرین هشدار: حذف محتوا، خالی کردن'
				},
				level4im: {
					label: 'حذف محتوا، خالی کردن',
					summary: 'تنها هشدار: حذف محتوا، خالی کردن'
				}
			},
			'هبک-عمومی': {
				level4: {
					label: 'هشدار عمومی (برای مجموعه الگوهایی که فاقد سطح ۴ هستند)',
					summary: 'آخرین اعلان هشدار'
				}
			}
		},
		'رفتار در مقاله‌ها': {
			'هبک-زندگی‌نامه': {
				level1: {
					label: 'افزودن اطلاعات بحث‌برانگیز بدون منبع دربارهٔ افراد زنده',
					summary: 'یادداشت عمومی: افزودن اطلاعات بحث‌برانگیز بدون منبع دربارهٔ افراد زنده'
				},
				level2: {
					label: 'افزودن اطلاعات بحث‌برانگیز بدون منبع دربارهٔ افراد زنده',
					summary: 'اخطار: افزودن اطلاعات بحث‌برانگیز بدون منبع دربارهٔ افراد زنده'
				},
				level3: {
					label: 'افزودن اطلاعات بحث‌برانگیز/افتراآمیز بدون منبع دربارهٔ افراد زنده',
					summary: 'هشدار: افزودن اطلاعات بحث‌برانگیز بدون منبع دربارهٔ افراد زنده'
				},
				level4: {
					label: 'افزودن اطلاعات افتراآمیز بدون منبع دربارهٔ افراد زنده',
					summary: 'آخرین هشدار: افزودن اطلاعات بحث‌برانگیز بدون منبع دربارهٔ افراد زنده'
				},
				level4im: {
					label: 'افزودن اطلاعات افتراآمیز بدون منبع دربارهٔ افراد زنده',
					summary: 'تنها هشدار: افزودن اطلاعات بحث‌برانگیز بدون منبع دربارهٔ افراد زنده'
				}
			},
			'هبک-افتراآمیز': {
				level1: {
					label: 'افزودن محتوای افتراآمیز',
					summary: 'یادداشت عمومی: افزودن محتوای افتراآمیز'
				},
				level2: {
					label: 'افزودن محتوای افتراآمیز',
					summary: 'اخطار: افزودن محتوای افتراآمیز'
				},
				level3: {
					label: 'افزودن محتوای افتراآمیز',
					summary: 'هشدار: افزودن محتوای افتراآمیز'
				},
				level4: {
					label: 'افزودن محتوای افتراآمیز',
					summary: 'آخرین هشدار: افزودن محتوای افتراآمیز'
				},
				level4im: {
					label: 'افزودن محتوای افتراآمیز',
					summary: 'تنها هشدار: افزودن محتوای افتراآمیز'
				}
			},
			'هبک-غلط': {
				level1: {
					label: 'وارد کردن عمدی اطلاعات غلط',
					summary: 'یادداشت عمومی: وارد کردن اطلاعات غلط'
				},
				level2: {
					label: 'وارد کردن عمدی اطلاعات غلط',
					summary: 'اخطار: وارد کردن اطلاعات غلط'
				},
				level3: {
					label: 'وارد کردن عمدی اطلاعات غلط',
					summary: 'هشدار: وارد کردن عمدی اطلاعات غلط'
				},
				level4: {
					label: 'وارد کردن عمدی اطلاعات غلط',
					summary: 'آخرین هشدار: وارد کردن عمدی اطلاعات غلط'
				}
			},
			'هبک-ژانر': {
				level1: {
					label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا منبع',
					summary: 'یادداشت عمومی: تغییر مکرر یا عمده در ژانرها بدون اجماع یا منبع'
				},
				level2: {
					label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا منبع',
					summary: 'اخطار: تغییر مکرر یا عمده در ژانرها بدون اجماع یا منبع'
				},
				level3: {
					label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا منبع',
					summary: 'هشدار: تغییر مکرر یا عمده در ژانرها بدون اجماع یا منبع'
				},
				level4: {
					label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا منبع',
					summary: 'آخرین هشدار: تغییر مکرر یا عمده در ژانرها بدون اجماع یا منبع'
				}
			},
			'هبک-تصویر': {
				level1: {
					label: 'خرابکاری مرتبط با تصاویر در مقاله‌ها',
					summary: 'یادداشت عمومی: خرابکاری مرتبط با تصاویر در مقاله‌ها'
				},
				level2: {
					label: 'خرابکاری مرتبط با تصاویر در مقاله‌ها',
					summary: 'اخطار: خرابکاری مرتبط با تصاویر در مقاله‌ها'
				},
				level3: {
					label: 'خرابکاری مرتبط با تصاویر در مقاله‌ها',
					summary: 'هشدار: خرابکاری مرتبط با تصاویر در مقاله‌ها'
				},
				level4: {
					label: 'خرابکاری مرتبط با تصاویر در مقاله‌ها',
					summary: 'آخرین هشدار: خرابکاری مرتبط با تصاویر در مقاله‌ها'
				},
				level4im: {
					label: 'خرابکاری مرتبط با تصاویر',
					summary: 'تنها هشدار: خرابکاری مرتبط با تصاویر'
				}
			},
			'هبک-شوخی': {
				level1: {
					label: 'استفاده از شوخی نامناسب در مقاله‌ها',
					summary: 'یادداشت عمومی: شوخی نامناسب در مقاله‌ها'
				},
				level2: {
					label: 'استفاده از شوخی نامناسب در مقاله‌ها',
					summary: 'اخطار: استفاده از شوخی نامناسب در مقاله‌ها'
				},
				level3: {
					label: 'استفاده از شوخی نامناسب در مقاله‌ها',
					summary: 'هشدار: استفاده از شوخی نامناسب در مقاله‌ها'
				},
				level4: {
					label: 'استفاده از شوخی نامناسب در مقاله‌ها',
					summary: 'آخرین هشدار: استفاده از شوخی نامناسب در مقاله‌ها'
				},
				level4im: {
					label: 'استفاده از شوخی نامناسب',
					summary: 'تنها هشدار: استفاده از شوخی نامناسب'
				}
			},
			'هبک-تدام': {
				level1: {
					label: 'افزودن تحقیق دست اول، شامل ترکیب منتشرنشده از منابع',
					summary: 'یادداشت عمومی: افزودن تحقیق دست اول، شامل ترکیب منتشرنشده از منابع'
				},
				level2: {
					label: 'افزودن تحقیق دست اول، شامل ترکیب منتشرنشده از منابع',
					summary: 'اخطار: افزودن تحقیق دست اول، شامل ترکیب منتشرنشده از منابع'
				},
				level3: {
					label: 'افزودن تحقیق دست اول، شامل ترکیب منتشرنشده از منابع',
					summary: 'هشدار: افزودن تحقیق دست اول، شامل ترکیب منتشرنشده از منابع'
				},
				level4: {
					label: 'افزودن تحقیق دست اول، شامل ترکیب منتشرنشده از منابع',
					summary: 'آخرین هشدار: افزودن تحقیق دست اول، شامل ترکیب منتشرنشده از منابع'
				}
			},
			'هبک-سانسور': {
				level1: {
					label: 'سانسور کردن محتوا',
					summary: 'یادداشت عمومی: سانسور کردن محتوا'
				},
				level2: {
					label: 'سانسور کردن محتوا',
					summary: 'اخطار: سانسور کردن محتوا'
				},
				level3: {
					label: 'سانسور کردن محتوا',
					summary: 'هشدار: سانسور کردن محتوا'
				}
			},
			'هبک-مالکیت': {
				level1: {
					label: 'مالکیت مقاله‌ها',
					summary: 'یادداشت عمومی: مالکیت مقاله‌ها'
				},
				level2: {
					label: 'مالکیت مقاله‌ها',
					summary: 'اخطار: مالکیت مقاله‌ها'
				},
				level3: {
					label: 'مالکیت مقاله‌ها',
					summary: 'هشدار: مالکیت مقاله‌ها'
				},
				level4: {
					label: 'مالکیت مقاله‌ها',
					summary: 'آخرین هشدار: مالکیت مقاله‌ها'
				},
				level4im: {
					label: 'مالکیت مقاله‌ها',
					summary: 'تنها هشدار: مالکیت مقاله‌ها'
				}
			},
			'هبک-مبهم': {
				level1: {
					label: 'خرابکاری آب‌زیرکاهانه',
					summary: 'یادداشت عمومی: ویرایش احتمالاً غیرسازنده'
				},
				level2: {
					label: 'خرابکاری آب‌زیرکاهانه',
					summary: 'اخطار: ویرایش مشابه ویرایش غیرسازنده'
				},
				level3: {
					label: 'خرابکاری آب‌زیرکاهانه',
					summary: 'هشدار: خرابکاری آب‌زیرکاهانه'
				},
				level4: {
					label: 'خرابکاری آب‌زیرکاهانه',
					summary: 'آخرین هشدار: خرابکاری آب‌زیرکاهانه'
				}
			},
			'هبک-حذف الگو': {
				level1: {
					label: 'حذف الگوهای نگهداری',
					summary: 'یادداشت عمومی: حذف الگوهای نگهداری'
				},
				level2: {
					label: 'حذف الگوهای نگهداری',
					summary: 'اخطار: حذف الگوهای نگهداری'
				},
				level3: {
					label: 'حذف الگوهای نگهداری',
					summary: 'هشدار: حذف الگوهای نگهداری'
				},
				level4: {
					label: 'حذف الگوهای نگهداری',
					summary: 'آخرین هشدار: حذف الگوهای نگهداری'
				}
			},
			'هبک-بدون منبع': {
				level1: {
					label: 'افزودن مطالب بدون منبع یا با منبع ضعیف',
					summary: 'یادداشت عمومی: افزودن مطالب بدون منبع یا با منبع ضعیف'
				},
				level2: {
					label: 'افزودن مطالب بدون منبع یا با منبع ضعیف',
					summary: 'اخطار: افزودن مطالب بدون منبع یا با منبع ضعیف'
				},
				level3: {
					label: 'افزودن مطالب بدون منبع یا با منبع ضعیف',
					summary: 'هشدار: افزودن مطالب بدون منبع یا با منبع ضعیف'
				},
				level4: {
					label: 'افزودن مطالب بدون منبع یا با منبع ضعیف',
					summary: 'آخرین هشدار: افزودن مطالب بدون منبع یا با منبع ضعیف'
				}
			}
		},
		'تبلیغات و هرزنگاری': {
			'هبک-تبلیغ': {
				level1: {
					label: 'استفاده از ویکی‌پدیا برای تبلیغات یا ترویج',
					summary: 'یادداشت عمومی: استفاده از ویکی‌پدیا برای تبلیغات یا ترویج'
				},
				level2: {
					label: 'استفاده از ویکی‌پدیا برای تبلیغات یا ترویج',
					summary: 'اخطار: استفاده از ویکی‌پدیا برای تبلیغات یا ترویج'
				},
				level3: {
					label: 'استفاده از ویکی‌پدیا برای تبلیغات یا ترویج',
					summary: 'هشدار: استفاده از ویکی‌پدیا برای تبلیغات یا ترویج'
				},
				level4: {
					label: 'استفاده از ویکی‌پدیا برای تبلیغات یا ترویج',
					summary: 'آخرین هشدار: استفاده از ویکی‌پدیا برای تبلیغات یا ترویج'
				},
				level4im: {
					label: 'استفاده از ویکی‌پدیا برای تبلیغات یا ترویج',
					summary: 'تنها هشدار: استفاده از ویکی‌پدیا برای تبلیغات یا ترویج'
				}
			},
			'هبک-دبط': {
				level1: {
					label: 'عدم پایبندی به دیدگاه بی‌طرف',
					summary: 'یادداشت عمومی: عدم پایبندی به دیدگاه بی‌طرف'
				},
				level2: {
					label: 'عدم پایبندی به دیدگاه بی‌طرف',
					summary: 'اخطار: عدم پایبندی به دیدگاه بی‌طرف'
				},
				level3: {
					label: 'عدم پایبندی به دیدگاه بی‌طرف',
					summary: 'هشدار: عدم پایبندی به دیدگاه بی‌طرف'
				},
				level4: {
					label: 'عدم پایبندی به دیدگاه بی‌طرف',
					summary: 'آخرین هشدار: عدم پایبندی به دیدگاه بی‌طرف'
				}
			},
			'هبک-مزد': {
				level1: {
					label: 'ویرایش در برابر دستمزد بدون فاش‌سازی طبق شرایط استفادهٔ ویکی‌مدیا',
					summary: 'یادداشت عمومی: الزام به فاش‌سازی ویرایش در برابر دستمزد طبق شرایط استفادهٔ ویکی‌مدیا'
				},
				level2: {
					label: 'ویرایش در برابر دستمزد بدون فاش‌سازی طبق شرایط استفادهٔ ویکی‌مدیا',
					summary: 'اخطار: الزام به فاش‌سازی ویرایش در برابر دستمزد طبق شرایط استفادهٔ ویکی‌مدیا'
				},
				level3: {
					label: 'ویرایش در برابر دستمزد بدون فاش‌سازی طبق شرایط استفادهٔ ویکی‌مدیا',
					summary: 'هشدار: الزام به فاش‌سازی ویرایش در برابر دستمزد طبق شرایط استفادهٔ ویکی‌مدیا'
				},
				level4: {
					label: 'ویرایش در برابر دستمزد بدون فاش‌سازی طبق شرایط استفادهٔ ویکی‌مدیا',
					summary: 'آخرین هشدار: الزام به فاش‌سازی ویرایش در برابر دستمزد طبق شرایط استفادهٔ ویکی‌مدیا'
				}
			},
			'هبک-هرزنامه': {
				level1: {
					label: 'افزودن پیوندهای بیرونی نامناسب',
					summary: 'یادداشت عمومی: افزودن پیوندهای بیرونی نامناسب'
				},
				level2: {
					label: 'افزودن پیوندهای هرز',
					summary: 'اخطار: افزودن پیوندهای هرز'
				},
				level3: {
					label: 'افزودن پیوندهای هرز',
					summary: 'هشدار: افزودن پیوندهای هرز'
				},
				level4: {
					label: 'افزودن پیوندهای هرز',
					summary: 'آخرین هشدار: افزودن پیوندهای هرز'
				},
				level4im: {
					label: 'افزودن پیوندهای هرز',
					summary: 'تنها هشدار: افزودن پیوندهای هرز'
				}
			}
		},
		'رفتار با سایر ویرایشگران': {
			'هبک-فحن': {
				level1: {
					label: 'نداشتن فرض حسن نیت',
					summary: 'یادداشت عمومی: نداشتن فرض حسن نیت'
				},
				level2: {
					label: 'نداشتن فرض حسن نیت',
					summary: 'اخطار: نداشتن فرض حسن نیت'
				},
				level3: {
					label: 'نداشتن فرض حسن نیت',
					summary: 'هشدار: نداشتن فرض حسن نیت'
				}
			},
			'هبک-آزار': {
				level1: {
					label: 'آزار و اذیت کاربران دیگر',
					summary: 'یادداشت عمومی: آزار و اذیت کاربران دیگر'
				},
				level2: {
					label: 'آزار و اذیت کاربران دیگر',
					summary: 'اخطار: آزار و اذیت کاربران دیگر'
				},
				level3: {
					label: 'آزار و اذیت کاربران دیگر',
					summary: 'هشدار: آزار و اذیت کاربران دیگر'
				},
				level4: {
					label: 'آزار و اذیت کاربران دیگر',
					summary: 'آخرین هشدار: آزار و اذیت کاربران دیگر'
				},
				level4im: {
					label: 'آزار و اذیت کاربران دیگر',
					summary: 'تنها هشدار: آزار و اذیت کاربران دیگر'
				}
			},
			'هبک-حمله': {
				level1: {
					label: 'حملهٔ شخصی به یک ویرایشگر خاص',
					summary: 'یادداشت عمومی: حملهٔ شخصی به یک ویرایشگر خاص'
				},
				level2: {
					label: 'حملهٔ شخصی به یک ویرایشگر خاص',
					summary: 'اخطار: حملهٔ شخصی به یک ویرایشگر خاص'
				},
				level3: {
					label: 'حملهٔ شخصی به یک ویرایشگر خاص',
					summary: 'هشدار: حملهٔ شخصی به یک ویرایشگر خاص'
				},
				level4: {
					label: 'حملهٔ شخصی به یک ویرایشگر خاص',
					summary: 'آخرین هشدار: حملهٔ شخصی به یک ویرایشگر خاص'
				},
				level4im: {
					label: 'حملهٔ شخصی به یک ویرایشگر خاص',
					summary: 'تنها هشدار: حملهٔ شخصی به یک ویرایشگر خاص'
				}
			},
			'هبک-سوءاستفاده الگو': {
				level1: {
					label: 'استفادهٔ نادرست از الگو هشدا یا قطع دسترسی',
					summary: 'یادداشت عمومی: استفادهٔ نادرست از الگو هشدا یا قطع دسترسی'
				},
				level2: {
					label: 'استفادهٔ نادرست از الگو هشدا یا قطع دسترسی',
					summary: 'اخطار: استفادهٔ نادرست از الگو هشدا یا قطع دسترسی'
				}
			}
		},
		'برداشتن برچسب‌های حذف': {
			'هبک-نبح': {
				level1: {
					label: 'برداشتن الگوهای {{نبح}}',
					summary: 'یادداشت عمومی: برداشتن الگوهای {{نبح}}'
				},
				level2: {
					label: 'برداشتن الگوهای {{نبح}}',
					summary: 'اخطار: برداشتن الگوهای {{نبح}}'
				},
				level3: {
					label: 'برداشتن الگوهای {{نبح}}',
					summary: 'هشدار: برداشتن الگوهای {{نبح}}'
				},
				level4: {
					label: 'برداشتن الگوهای {{نبح}}',
					summary: 'آخرین هشدار: برداشتن الگوهای {{نبح}}'
				}
			},
			/* عدم اقبال کافی از برچسب حذف زمان‌دار زندگی‌نامه زندگان در ویکی فارسی
			'uw-blpprod': {
				level1: {
					label: 'Removing {{blp prod}} templates',
					summary: 'General note: Removing {{blp prod}} templates'
				},
				level2: {
					label: 'Removing {{blp prod}} templates',
					summary: 'Caution: Removing {{blp prod}} templates'
				},
				level3: {
					label: 'Removing {{blp prod}} templates',
					summary: 'Warning: Removing {{blp prod}} templates'
				},
				level4: {
					label: 'Removing {{blp prod}} templates',
					summary: 'Final warning: Removing {{blp prod}} templates'
				}
			}, */
			'هبک-بحپ': {
				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'
				}
			}, */
			'هبک-حس': {
				level1: {
					label: 'برداشتن برچسب‌های حذف سریع',
					summary: 'یادداشت عمومی: برداشتن برچسب‌های حذف سریع'
				},
				level2: {
					label: 'برداشتن برچسب‌های حذف سریع',
					summary: 'اخطار: برداشتن برچسب‌های حذف سریع'
				},
				level3: {
					label: 'برداشتن برچسب‌های حذف سریع',
					summary: 'هشدار: برداشتن برچسب‌های حذف سریع'
				},
				level4: {
					label: 'برداشتن برچسب‌های حذف سریع',
					summary: 'آخرین هشدار: برداشتن برچسب‌های حذف سریع'
				}
			}
		},
		'سایر': {
			'هبک-تلاش': {
				level1: {
					label: 'فعال کردن پالایهٔ ویرایش',
					summary: 'یادداشت عمومی: فعال کردن پالایهٔ ویرایش'
				},
				level2: {
					label: 'فعال کردن پالایهٔ ویرایش',
					summary: 'اخطار: فعال کردن پالایهٔ ویرایش'
				},
				level3: {
					label: 'فعال کردن پالایهٔ ویرایش',
					summary: 'هشدار: فعال کردن پالایهٔ ویرایش'
				},
				level4: {
					label: 'فعال کردن پالایهٔ ویرایش',
					summary: 'آخرین هشدار: فعال کردن پالایهٔ ویرایش'
				},
				level4im: {
					label: 'فعال کردن پالایهٔ ویرایش',
					summary: 'تنها هشدار: فعال کردن پالایهٔ ویرایش'
				}
			},
			'هبک-گپ‌زنی': {
				level1: {
					label: 'استفاده از صفحهٔ بحث به‌عنوان انجمن',
					summary: 'یادداشت عمومی: استفاده از صفحهٔ بحث به‌عنوان انجمن'
				},
				level2: {
					label: 'استفاده از صفحهٔ بحث به‌عنوان انجمن',
					summary: 'اخطار: استفاده از صفحهٔ بحث به‌عنوان انجمن'
				},
				level3: {
					label: 'استفاده از صفحهٔ بحث به‌عنوان انجمن',
					summary: 'هشدار: استفاده از صفحهٔ بحث به‌عنوان انجمن'
				},
				level4: {
					label: 'استفاده از صفحهٔ بحث به‌عنوان انجمن',
					summary: 'آخرین هشدار: استفاده از صفحهٔ بحث به‌عنوان انجمن'
				}
			},
			'هبک-ایجاد': {
				level1: {
					label: 'ایجاد صفحه‌های نامناسب',
					summary: 'یادداشت عمومی: ایجاد صفحه‌های نامناسب'
				},
				level2: {
					label: 'ایجاد صفحه‌های نامناسب',
					summary: 'اخطار: ایجاد صفحه‌های نامناسب'
				},
				level3: {
					label: 'ایجاد صفحه‌های نامناسب',
					summary: 'هشدار: ایجاد صفحه‌های نامناسب'
				},
				level4: {
					label: 'ایجاد صفحه‌های نامناسب',
					summary: 'آخرین هشدار: ایجاد صفحه‌های نامناسب'
				},
				level4im: {
					label: 'ایجاد صفحه‌های نامناسب',
					summary: 'تنها هشدار: ایجاد صفحه‌های نامناسب'
				}
			},
			'هبک-شیوه‌نامه': {
				level1: {
					label: 'شیوه‌نامه',
					summary: 'یادداشت عمومی: قالب‌بندی، تاریخ، زبان و غیره (شیوه‌نامه)'
				},
				level2: {
					label: 'شیوه‌نامه',
					summary: 'اخطار: قالب‌بندی، تاریخ، زبان و غیره (شیوه‌نامه)'
				},
				level3: {
					label: 'شیوه‌نامه',
					summary: 'هشدار: قالب‌بندی، تاریخ، زبان و غیره (شیوه‌نامه)'
				},
				level4: {
					label: 'شیوه‌نامه',
					summary: 'آخرین هشدار: قالب‌بندی، تاریخ، زبان و غیره (شیوه‌نامه)'
				}
			},
			'هبک-انتقال': {
				level1: {
					label: 'انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع',
					summary: 'یادداشت عمومی: انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع'
				},
				level2: {
					label: 'انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع',
					summary: 'اخطار: انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع'
				},
				level3: {
					label: 'انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع',
					summary: 'هشدار: انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع'
				},
				level4: {
					label: 'انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع',
					summary: 'آخرین هشدار: انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع'
				},
				level4im: {
					label: 'انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع',
					summary: 'تنها هشدار: انتقال صفحه‌ها بر خلاف قواعد نام‌گذاری و اجماع'
				}
			},
			'هبک-خصب': {
				level1: {
					label: "دست بردن در پیام‌های دیگران در صفحه‌های بحث",
					summary: "یادداشت عمومی: دست بردن در پیام‌های دیگران در صفحه‌های بحث"
				},
				level2: {
					label: "دست بردن در پیام‌های دیگران در صفحه‌های بحث",
					summary: "اخطار: دست بردن در پیام‌های دیگران در صفحه‌های بحث"
				},
				level3: {
					label: "دست بردن در پیام‌های دیگران در صفحه‌های بحث",
					summary: "هشدار: دست بردن در پیام‌های دیگران در صفحه‌های بحث"
				},
				level4: {
					label: "دست بردن در پیام‌های دیگران در صفحه‌های بحث",
					summary: "آخرین هشدار: دست بردن در پیام‌های دیگران در صفحه‌های بحث"
				},
				level4im: {
					label: "دست بردن در پیام‌های دیگران در صفحه‌های بحث",
					summary: "تنها هشدار: دست بردن در پیام‌های دیگران در صفحه‌های بحث"
				}
			},
			'هبک-بارگذاری': {
				level1: {
					label: 'بارگذاری تصاویر غیردانشنامه‌ای',
					summary: 'یادداشت عمومی: بارگذاری تصاویر غیردانشنامه‌ای'
				},
				level2: {
					label: 'بارگذاری تصاویر غیردانشنامه‌ای',
					summary: 'اخطار: بارگذاری تصاویر غیردانشنامه‌ای'
				},
				level3: {
					label: 'بارگذاری تصاویر غیردانشنامه‌ای',
					summary: 'هشدار: بارگذاری تصاویر غیردانشنامه‌ای'
				},
				level4: {
					label: 'بارگذاری تصاویر غیردانشنامه‌ای',
					summary: 'آخرین هشدار: بارگذاری تصاویر غیردانشنامه‌ای'
				},
				level4im: {
					label: 'بارگذاری تصاویر غیردانشنامه‌ای',
					summary: 'تنها هشدار: بارگذاری تصاویر غیردانشنامه‌ای'
				}
			}
		}
	},

	singlenotice: {
		'هبک-فحن-زاپاس': {
			label: 'استفاده از چند حساب کاربری (با فرض حسن نیت)',
			summary: 'اعلان: استفاده از چند حساب کاربری'
		},
		'هبک-تام': {
			label: 'گزارش نادرست در تام',
			summary: 'اعلان: گزارش نادرست در تام'
		},
		'هبک-خودزندگی‌نامه': {
			label: 'ایجاد خودزندگی‌نامه',
			summary: 'اعلان: ایجاد خودزندگی‌نامه'
		},
		'هبک-رده بد': {
			label: 'افزودن رده‌های نادرست',
			summary: 'اعلان: افزودن رده‌های نادرست'
		},
		'هبک-مدخل بد فهرست': {
			label: 'افزودن مدخل‌های نامناسب به فهرست‌ها',
			summary: 'اعلان: افزودن مدخل‌های نامناسب به فهرست‌ها'
		},
		'هبک-چماق': {
			label: 'استقبال از یک تازه‌وارد با «چماق»',
			summary: 'اعلان: «چماق زدن» بر سر تازه‌واردان',
			suppressArticleInSummary: true  // non-standard (user name, not article), and not necessary
		},
		'هبک-تعارض': {
			label: 'تعارض منافع',
			summary: 'اعلان: تعارض منافع',
			heading: 'مهار کردن تعارض منافع'
		},
		'هبک-بحث‌برانگیز': {
			label: 'معرفی محتوای بحث‌برانگیز',
			summary: 'اعلان: معرفی محتوای بحث‌برانگیز'
		},
		'هبک-کپی‌کاری': {
			label: 'کپی کردن متن به صفحه‌ای دیگر',
			summary: 'اعلان: کپی کردن متن به صفحه‌ای دیگر'
		},
		'هبک-بلورین': {
			label: 'افزودن اطلاعات نظری یا تأییدنشده',
			summary: 'اعلان: افزودن اطلاعات نظری یا تأییدنشده'
		},
		'هبک-انتقال با کپی': {
			label: 'انتقال با کپی',
			summary: 'اعلان: انتقال با کپی'
		},
		'هبک-ابهام‌زدایی': {
			label: 'ویرایش نادرست در یک صفحهٔ ابهام‌زدایی',
			summary: 'اعلان: ویرایش نادرست در یک صفحهٔ ابهام‌زدایی'
		},
		'هبک-تاریخ': {
			label: 'تغییر نالازم در قالب تاریخ‌ها',
			summary: 'اعلان: تغییر نالازم در قالب تاریخ‌ها'
		},
		'هبک-پیوند مرده': {
			label: 'حذف منابع قابل قبولی که حاوی پیوند مرده هستند',
			summary: 'اعلان: حذف منابع قابل قبولی که حاوی پیوند مرده هستند'
		},
		'هبک-عنوان‌ظاهری': {
			label: 'استفادهٔ نادرست از عنوان‌ظاهری',
			summary: 'اعلان: استفادهٔ نادرست از عنوان‌ظاهری'
		},
		'هبک-اول پیش‌نویس': {
			label: 'توصیه به کاربر برای ایجاد پیش‌نویس در فضای کاربری بدون احتمال حذف سریع',
			summary: 'اعلان: پیش‌نویس مقالهٔ خود را در [[راهنما:پیش‌نویس فضای کاربری|فضای کاربری]] تهیه کنید'
		},
		'هبک-خلاصه ویرایش': {
			label: 'کاربر تازه‌واردی که از خلاصه ویرایش استفاده نمی‌کند',
			summary: 'اعلان: عدم استفاده از خلاصه ویرایش'
		},
		'هبک-خلاصه ویرایش۲': {
			label: 'کاربر باتجربه‌ای که از خلاصه ویرایش استفاده نمی‌کند',
			summary: 'اعلان: عدم استفاده از خلاصه ویرایش',
			hideLinkedPage: true,
			hideReason: true
		},
		'هبک-پب در بدنه': {
			label: 'افزودن پیوندهای بیرون به بدنهٔ یک مقاله',
			summary: 'اعلان: پیوندهای بیرون را در بخش پیوند به بیرون در انتهای مقاله‌ها قرار دهید'
		},
		'هبک-فارسی': {
			label: 'عدم استفاده از زبان فارسی در تعامل با دیگران',
			summary: 'اعلان: عدم استفاده از زبان فارسی در تعامل با دیگران'
		},
		'هبک-عجولانه': {
			label: 'افزودن عجولانهٔ برچسب‌های حذف سریع',
			summary: 'اعلان: پیش از برچسب زدن مقاله‌ها برای حذف سریع، زمان کافی برای گسترش مقاله را در اختیار ایجادکنندهٔ آن‌ها قرار دهید'
		},
		'هبک-القاب اسلامی': {
			label: 'استفاده از القاب احترام‌آمیز اسلامی',
			summary: 'اعلان: استفاده از القاب احترام‌آمیز اسلامی'
		},
		'هبک-ایتالیک': {
			label: 'ایتالیک کردن نام کتاب‌ها، فیلم‌ها، آلبوم‌ها، مجله‌ها، مجموعه‌های تلویزیونی و غیره در مقاله‌ها',
			summary: 'اعلان: ایتالیک کردن نام کتاب‌ها، فیلم‌ها، آلبوم‌ها، مجله‌ها، مجموعه‌های تلویزیونی و غیره در مقاله‌ها'
		},
		'هبک-زبان': {
			label: 'تغییر نالازم زبان بین فارسی ایران و فارسی افغانستان',
			summary: 'اعلان: تغییر نالازم زبان بین فارسی ایران و فارسی افغانستان',
			heading: 'گونه‌های ملی زبان فارسی'
		},
		'هبک-پیونددهی': {
			label: 'افزودن افراطی پیوندهای قرمز یا پیوندهای آبی تکراری',
			summary: 'اعلان: افزودن افراطی پیوندهای قرمز یا پیوندهای آبی تکراری'
		},
		'هبک-جزئی': {
			label: 'استفادهٔ نادرست از گزینهٔ ویرایش جزئی',
			summary: 'اعلان: استفادهٔ نادرست از گزینهٔ ویرایش جزئی'
		},
		'هبک-غیرفارسی': {
			label: 'ایجاد مقاله‌های غیرفارسی',
			summary: 'اعلان: ایجاد مقاله‌های غیرفارسی'
		},
		'هبک-ویرایش غیرفارسی': {
			label: 'افزودن محتوای غیرفارسی به مقاله‌ها',
			summary: 'اعلان: افزودن محتوای غیرفارسی به مقاله‌ها'
		},
		'هبک-رأی نیست': {
			label: 'ملاک ما اجماع است، و نه رأی‌گیری',
			summary: 'اعلان: ملاک ما اجماع است، و نه رأی‌گیری'
		},
		'هبک-سرقت ادبی': {
			label: 'کپی‌کاری از منابع تحت مالکیت عمومی بدون انتساب',
			summary: 'اعلان: کپی‌کاری از منابع تحت مالکیت عمومی بدون انتساب'
		},
		'هبک-پیش‌نمایش': {
			label: 'برای جلوگیری از اشتباه، از دکمهٔ پیش‌نمایش استفاده کنید',
			summary: 'اعلان: برای جلوگیری از اشتباه، از دکمهٔ پیش‌نمایش استفاده کنید'
		},
		'هبک-پیوند قرمز': {
			label: 'حذف بی‌رویهٔ پیوندهای قرمز',
			summary: 'اعلان: هنگام حذف پیوندهای قرمز دقت کنید'
		},
		'هبک-خودوگ': {
			label: 'واگردانی ویرایش‌های آزمایشی خود',
			summary: 'اعلان: واگردانی ویرایش‌های آزمایشی خود'
		},
		'هبک-شبکه اجتماعی': {
			label: 'ویکی‌پدیا یک شبکهٔ اجتماعی نیست',
			summary: 'اعلان: ویکی‌پدیا یک شبکهٔ اجتماعی نیست'
		},
		'هبک-پس انجامش دهید': {
			label: 'جسور باشید و اشکالات را خودتان برطرف کنید',
			summary: 'اعلان: می‌توانید جسور باشید و اشکالات را خودتان برطرف کنید'
		},
		'هبک-لوث': {
			label: 'افزودن هشدار لوث شدن یا حذف محتوای لوث‌کننده در بخش‌های متناسب',
			summary: "اعلان: محتوای «لوث‌کننده» (اسپویلر) در مقاله‌های ویکی‌پدیا را حذف یا علامت‌گذاری نکنید"
		},
		'هبک-بحث در مقاله': {
			label: 'بحث در متن مقاله',
			summary: 'اعلان: بحث در متن مقاله'
		},
		'هبک-مدک': {
			label: 'امضا نکردن پیام‌ها',
			summary: 'اعلان: امضا نکردن پیام‌ها'
		},
		'هبک-پیام در بالا': {
			label: 'ارسال پیام در بالای صفحه‌های بحث',
			summary: 'اعلان: ارسال پیام در بالای صفحه‌های بحث'
		},
		'هبک-عدم انتساب کک': {
			label: 'کپی کردن از منابع دارای اجازه‌نامهٔ سازگار بدون انتساب',
			summary: 'اعلان: کپی کردن از منابع دارای اجازه‌نامهٔ سازگار بدون انتساب'
		},
		'هبک-پایان پیش‌نویس کاربری': {
			label: 'پیش‌نویس رها شده در فضای کاربری',
			summary: 'اعلان: پیش‌نویس رها شده در فضای کاربری'
		},
		'هبک-پوشش بازی ویدئویی': {
			label: 'افزودن راهنمای گام به گام، رمزهای تقلب یا دستوراعمل‌های بازی‌های ویدئویی',
			summary: 'اعلان: افزودن راهنمای گام به گام، رمزهای تقلب یا دستوراعمل‌های بازی‌های ویدئویی'
		},
		'هبک-هشدار': {
			label: 'هنگام واگردانی خرابکاری، از الگوهای هشدار به کاربر استفاده کنید',
			summary: 'اعلان: هنگام واگردانی خرابکاری می‌توانید از الگوهای هشدار به کاربر استفاده کنید'
		},
		'هبک-خلاصه اشتباه': {
			label: 'استفاده از خلاصه ویرایش‌های ناکافی یا نامناسب',
			summary: 'هشدار: استفاده از خلاصه ویرایش‌های ناکافی یا نامناسب'
		}
	},

	singlewarn: {
		'هبک-۳ب': {
			label: 'نقض احتمالی قاعدهٔ سه برگردان؛ همچنین هبک-سو را ببینید',
			summary: 'هشدار: قاعدهٔ سه برگردان'
		},
		'هبک-وابسته': {
			label: 'بازاریابی آشناسازی',
			summary: 'هشدار: بازاریابی آشناسازی'
		},
		'هبک-حمله': {
			label: 'ساخت صفحه‌های حمله',
			summary: 'هشدار: ساخت صفحه‌های حمله',
			suppressArticleInSummary: true
		},
		'هبک-نام‌ربات': {
			label: 'نام کاربری ربات',
			summary: 'هشدار: نام کاربری ربات'
		},
		'هبک-جارزنی': {
			label: 'جارزنی',
			summary: 'هشدار: جارزنی'
		},
		'هبک-حق تکثیر': {
			label: 'نقض حق تکثیر',
			summary: 'هشدار: نقض حق تکثیر'
		},
		'هبک-حق تکثیر-پیوند': {
			label: 'پیوند دادن به محتوای دارای حق تکثیر',
			summary: 'هشدار: پیوند دادن به محتوای دارای حق تکثیر'
		},
		'هبک-حق تکثیر-جدید': {
			label: 'نقض حق تکثیر (همراه با توضیح برای کاربران جدید)',
			summary: 'اعلان: دوری جستن از مشکلات مرتبط با حق تکثیر',
			heading: 'ویکی‌پدیا و حق تکثیر'
		},
		'هبک-حق تکثیر-حذف': {
			label: 'حذف برچسب حذف نقض حق تکثیر از مقاله‌ها',
			summary: 'هشدار: برداشت برچسب‌های حق تکثیر'
		},
		'هبک-خلاصه پالایه': {
			label: 'خلاصه ویرایشی که پالایهٔ ویرایش را فعال کرده است',
			summary: 'هشدار: خلاصه ویرایشی که پالایهٔ ویرایش را فعال کرده است'
		},
		'هبک-جو': {
			label: 'جنگ ویرایشی (جمله‌بندی محکم‌تر)',
			summary: 'هشدار: جنگ ویرایشی'
		},
		'هبک-جونرم': {
			label: 'جنگ ویرایشی (جمبه‌بندی نرم‌تر برای تازه‌واردان)',
			summary: 'هشدار: جنگ ویرایشی'
		},
		'هبک-ربودن': {
			label: 'ربودن مقاله‌ها',
			summary: 'هشدار: ربودن مقاله‌ها'
		},
		'هبک-کلک': {
			label: 'کلک‌زنی',
			summary: 'هشدار: کلک‌زنی'
		},
		'هبک-قانونی': {
			label: 'تهدید قانونی',
			summary: 'هشدار: تهدید قانونی'
		},
		'هبک-ورود': {
			label: 'ویرایش بدون ورود به حساب کاربری',
			summary: 'هشدار: ویرایش بدون ورود به حساب کاربری'
		},
		'هبک-چند آی‌پی': {
			label: 'استفاده از چند نشانی آی‌پی',
			summary: 'هشدار: خرابکاری با استفاده از چند نشانی آی‌پی'
		},
		'هبک-نقل بیان': {
			label: 'نقل بیان نزدیک',
			summary: 'هشدار: نقل بیان نزدیک'
		},
		'هبک-اطلاعات شخصی': {
			label: 'اطلاعات شخصی (اوتینگ)',
			summary: 'هشدار: اطلاعات شخصی'
		},
		'هبک-نمک': {
			label: 'ایجاد مجدد صفحهٔ محافظت شده در برابر ایجاد با عنوانی متفاوت',
			summary: 'اعلان: ایجاد مجدد صفحهٔ محافظت شده در برابر ایجاد با عنوانی متفاوت'
		},
		'هبک-زاپاس مشکوک': {
			label: 'زاپاس‌بازی',
			summary: 'هشدار: شما مشکوک به [[وپ:زاپاس|زاپاس‌بازی]] هستید'  // of User:...
		},
		'هبک-خصک': {
			label: 'خرابکاری در صفحه‌های کاربری',
			summary: 'هشدار: خرابکاری در صفحه‌های کاربری'
		},
		'هبک-نام کاربری': {
			label: 'نام کاربری ناقض سیاست نام کاربری',
			summary: 'هشدار: نام کاربری شما ممکن است در تضاد با سیاست ویکی‌پدیا باشد',
			suppressArticleInSummary: true  // not relevant for this template
		},
		'هبک-تم-نام کاربری': {
			label: 'نام کاربری در تضاد با سیاست و دارای تعارض منافع',
			summary: 'هشدار: نام کاربری و تعارض منافع',
			heading: 'نام حساب کاربری شما'
		},
		'هبک-صفحه کاربری': {
			label: 'صفحه یا زیرصفحهٔ کاربری در تضاد با سیاست',
			summary: 'هشدار: صفحه یا زیرصفحهٔ کاربری در تضاد با سیاست'
		}
	}
};

// to make local levels usable for Twinkle.warn.getTemplateProperty()
var localToGlobalLevels = {
	'/۱': '1',
	'/۲': '2',
	'/۳': '3',
	'/۴': '4',
	'/۴/تنها هشدار': '4im'
};

var globalToLocalLevels = {
	'1': '/۱',
	'2': '/۲',
	'3': '/۳',
	'4': '/۴',
	'4im': '/۴/تنها هشدار'
};

/**
 * 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|4im)$/);
	if (isNumberedTemplate) {
		var unNumberedTemplateName = templateName.replace(/(?:\/۱|1|\/۲|2|\/۳|3|\/۴|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(/\/[۱-۴]*(\/تنها هشدار)?$/, '');
			old_subvalue_re = new RegExp(mw.util.escapeRegExp(old_subvalue) + '\/([۱-۴]*(?:\/تنها هشدار)?)$');
		}
	}

	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 === '4im' ? '/۴/تنها هشدار' : (!!level ? '/' + mw.language.convertNumber(level) : '')); // Localized [Added condition to add "/"]

			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 = {
		'هبک-فحن-زاپاس': 'نام کاربری حساب دیگر، اختیاری (بدون کاربر:) ',
		'هبک-چماق': "نام کاربر «چماق‌خورده» (بدون کاربر:) ",
		'هبک-زاپاس مشکوک': 'نام کاربری زاپاس‌باز، در صورت وجود (بدون کاربر:) ',
		'هبک-نام کاربری': 'دلیل نقض سیاست توسط نام کاربری',
		'هبک-تام': 'نام کاربری که گزارش شده، اختیاری (بدون کاربر:) '
	};

	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 === 'هبک-نام کاربری') {
		$redWarning = $("<div style='color: red;' id='tw-warn-red-notice'>{{هبک-نام کاربری}} <b>نباید</b> برای موارد نقض <b>آشکار</b> سیاست به‌کار رود. " +
			"موارد نقض آشکار باید به‌طور مستقیم در تامنام گزارش شوند (با استفاده از زبانهٔ گبپ توینکل). " +
			'{{هبک-نام کاربری}} تنها باید در موارد لب‌مرزی استفاده شود تا بتوان با کاربر وارد گفتگو شد.</div>');
		$redWarning.insertAfter(Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup));
	} else if (selected_template === 'هبک-تم-نام کاربری') {
		$redWarning = $("<div style='color: red;' id='tw-warn-red-notice'>{{هبک-تم-نام کاربری}} <b>نباید</b> برای موارد نقض <b>آشکار</b> سیاست نام کاربری به‌کار رود. " +
			"موارد نقض آشکار را باید به‌طور مستقیم در تامنام گزارش کرد (با استفاده از زبانهٔ گبپ توینکل). " +
			'{{هبک-تم-نام کاربری}} تنها باید در موارد لب‌مرزس استفاده شود تا بتوان با کاربر وارد گفتگو شد.</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 === 'هبک-انتقال با کپی') {
				text += '|به=' + 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 = /^\D+<!--\s?(Template|الگو):([uU]w-.*?|هبک-.*?)\s?-->.*?([۰-۹]{1,2} [ا-ی]+ [۰-۹]{4}، ساعت [۰-۹]{1,2}:[۰-۹]{1,2} \(UTC\))/g; //localized
		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) || /\/[۱-۴](?:\/تنها هشدار)?$/.test(latest.type)) { // level1-4im
			level = parseInt(
					mw.language.convertNumber(
						latest.type.replace(/.*((\d|\/[۱-۴]))(?: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) ? 'هبک-چند آی‌پی' : 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');
		// 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 = 'هبک-عمومی';
		}
		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 '۱':
					prefix = 'یادداشت عمومی';
					break;
				case '۲':
					prefix = 'اخطار';
					break;
				case '۳':
					prefix = 'هشدار';
					break;
				case '۴':
					prefix = 'آخرین هشدار';
					break;
				case 'ر':
					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 === 'ر') {
					sub = '4im';
				}
				// Don't overwrite uw-3rr, technically unnecessary
				if (/\d/.test(sub)) {
					params.main_group = 'level' + sub;
				}
				if (/[۱-۴]/.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{{جا:آگاهی آی‌پی مشترک}}';
		}

		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 === 'هبک-نام کاربری' && !params.article) {
		alert('برای استفاده از الگوی {{هبک-نام کاربری}} حتماً باید دلیلی ارائه دهید.');
		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>