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

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

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

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinklespeedy.js: CSD module
 ****************************************
 * Mode of invocation:     Tab ("CSD")
 * Active on:              Non-special, existing pages
 *
 * NOTE FOR DEVELOPERS:
 *   If adding a new criterion, add it to the appropriate places at the top of
 *   twinkleconfig.js.  Also check out the default values of the CSD preferences
 *   in twinkle.js, and add your new criterion to those if you think it would be
 *   good.
 */

Twinkle.speedy = function twinklespeedy() {
	// Disable on:
	// * special pages
	// * non-existent pages
	if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
		return;
	}

	Twinkle.addPortletLink(Twinkle.speedy.callback, 'حذف سریع', 'tw-csd', (Morebits.userIsSysop || Morebits.userIsEliminator) ? 'حذف صفحه طبق وپ:محس' : 'درخواست حذف صفحه طبق وپ:محس');
};

// This function is run when the CSD tab/header link is clicked
Twinkle.speedy.callback = function twinklespeedyCallback() {
	Twinkle.speedy.initDialog((Morebits.userIsSysop || Morebits.userIsEliminator) ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
};

// Used by unlink feature
Twinkle.speedy.dialog = null;
// Used throughout
Twinkle.speedy.hasCSD = !!$('#delete-reason').length;

//localized keys to use in user nomination log and for local tag names
Twinkle.speedy.localKeys = {
	reason: 'دلیل', talk: 'بحث', redundantimage: 'تصویر تکراری', noimage: 'تصویر خالی',	fpcfail: 'توضیحات نالازم پرونده',
	noncom: 'غیرتجاری',	unksource: 'منبع ناشناخته',	f5: 'پ۵', norat: 'منصفانه بدون توضیح', badfairuse: 'منصفانه نادرست',
	commons: 'موجود در انبار', imgcopyvio: 'نقض حق تکثیر تصویر', badfiletype: 'نوع بد پرونده', nopermission: 'بدون اجازه',
	imagepage: 'صفحه پرونده', nocontext: 'بدون زمینه', foreign: 'خارجی', nocontent: 'بدون محتوا', transwiki: 'بیناویکی',
	a7: 'م۷', person: 'شخص', band: 'گروه موسیقی', club: 'باشگاه', corp: 'سازمان', web: 'وب', animal: 'حیوان', event: 'رویداد',
	a9: 'م۹', a10: 'م۱۰', madeup: 'ساختگی', catempty: 'رده خالی', templatecat: 'رده الگو', redirnone: 'تغییرمسیر به هیچ',
	userreq: 'درخواست کاربر', nouser: 'کاربر ناموجود', notwebhost: 'میزبان وب نیست', spamuser: 'نام تبلیغاتی', afc: 'مبا',
	policy: 'سیاست', duplicatetemplate: 'الگوی تکراری', p1: 'پ۱', emptyportal: 'درگاه خالی', nonsense: 'نامفهوم', test: 'آزمایشی',
	vandalism: 'خرابکاری', hoax: 'کلک', repost: 'ساخت دوباره', banned: 'طرد شده', move: 'انتقال', xfd: 'نبح', copypaste: 'کپی',
	g6: 'ع۶', author: 'ایجادکننده', g8: 'ع۸', subpage: 'زیرصفحه', attack: 'حمله', negublp: 'زندگی‌نامه منفی', spam: 'هرز',
	copyvio: 'نقض حق تکثیر', disambig: 'ابهام‌زدایی', rediruser: 'تغییرمسیر کاربر', redirtypo: 'تغییرمسیر نامحتمل',
	redircom: 'تغییرمسیر انبار', movedab: 'انتقال ابهام‌زدایی' , significance: 'اهمیت', notability: 'سرشناسی', bio: 'زندگی‌نامه',
	csd: 'محس', inc: 'شرکت', invented: 'ساخته ذهن'
};

// Prepares the speedy deletion dialog and displays it
Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) {
	var dialog;
	Twinkle.speedy.dialog = new Morebits.simpleWindow(Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight'));
	dialog = Twinkle.speedy.dialog;
	dialog.setTitle('معیار حذف سریع را انتخاب کنید');
	dialog.setScriptName('توینکل');
	dialog.addFooterLink('سیاست حذف سریع', 'وپ:محس');
	dialog.addFooterLink('ترجیحات محس', 'وپ:توینکل/ترجیحات#speedy');
	dialog.addFooterLink('راهنمای توینکل', 'وپ:توینکل/توضیحات#speedy');
	dialog.addFooterLink('ارائهٔ بازخورد', 'بوپ:توینکل');

	var form = new Morebits.quickForm(callbackfunc, Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null);
	if (Morebits.userIsSysop || Morebits.userIsEliminator) {
		form.append({
			type: 'checkbox',
			list: [
				{
					label: 'فقط برچسب بزن، حذف نکن',
					value: 'tag_only',
					name: 'tag_only',
					tooltip: 'اگر فقط قصد دارید به صفحه برچسب بزنید، نه این که آن را حذف سریع کنید، این گزینه را انتخاب کنید',
					checked: !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')),
					event: function(event) {
						var cForm = event.target.form;
						var cChecked = event.target.checked;
						// enable talk page checkbox
						if (cForm.talkpage) {
							cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete');
						}
						// enable redirects checkbox
						cForm.redirects.checked = !cChecked;
						// enable delete multiple
						cForm.delmultiple.checked = false;
						// enable notify checkbox
						cForm.notify.checked = cChecked;
						// enable deletion notification checkbox
						cForm.warnusertalk.checked = !cChecked && !Twinkle.speedy.hasCSD;
						// enable multiple
						cForm.multiple.checked = false;
						// enable requesting creation protection
						cForm.salting.checked = false;

						Twinkle.speedy.callback.modeChanged(cForm);

						event.stopPropagation();
					}
				}
			]
		});

		var deleteOptions = form.append({
			type: 'div',
			name: 'delete_options'
		});
		deleteOptions.append({
			type: 'header',
			label: 'گزینه‌های مرتبط با حذف'
		});
		if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) {  // hide option for user pages, to avoid accidentally deleting user talk page
			deleteOptions.append({
				type: 'checkbox',
				list: [
					{
						label: 'صفحهٔ بحث هم حذف شود',
						value: 'talkpage',
						name: 'talkpage',
						tooltip: "این گزینه صفحهٔ بحث را هم حذف می‌کند. اگر معیار پ۸ (پروندهٔ موجود در انبار) را انتخاب کنید، این گزینه نادیده گرفته می‌شود و صفحهٔ بحث حذف *نمی‌شود*.",
						checked: Twinkle.getPref('deleteTalkPageOnDelete'),
						event: function(event) {
							event.stopPropagation();
						}
					}
				]
			});
		}
		deleteOptions.append({
			type: 'checkbox',
			list: [
				{
					label: 'تمام تغییرمسیرها نیز حذف شوند',
					value: 'redirects',
					name: 'redirects',
					tooltip: 'این گزینه تمام تغییرمسیرهای ورودی به صفحه را نیز حذف می‌کند. از این گزینه برای حذف‌هایی که جهت انتقال یا ادغام صفحه هستند استفاده نکنید.',
					checked: Twinkle.getPref('deleteRedirectsOnDelete'),
					event: function (event) {
						event.stopPropagation();
					}
				},
				{
					label: 'حذف بر اساس چند معیار',
					value: 'delmultiple',
					name: 'delmultiple',
					tooltip: 'اگر این گزینه را انتخاب کنید، می‌توانید بیش از یک معیار را به عنوان دلیل حذف صفحه برگزینید. برای مثال، ترکیب معیار ع۱۱ و م۷ برای حذف مقاله‌ها رایج است.',
					event: function(event) {
						Twinkle.speedy.callback.modeChanged(event.target.form);
						event.stopPropagation();
					}
				},
				{
					label: 'آگاه کردن سازندهٔ صفحه از حذف آن',
					value: 'warnusertalk',
					name: 'warnusertalk',
					tooltip: 'یک الگوی آگاه‌سازی روی صفحهٔ بحث کاربری که صفحه را ایجاد کرده قرار داده می‌شود، به شرط آن که در ترجیحات توینکل، آگاه‌سازی را برای این معیار فعال کرده باشید ' +
						'و این گزینه را هم تیک زده باشید. ممکن است برای سازندهٔ مقاله پیام خوشامدی هم فرستاده شود.',
					checked: !Twinkle.speedy.hasCSD,
					event: function(event) {
						event.stopPropagation();
					}
				}
			]
		});
	}

	var tagOptions = form.append({
		type: 'div',
		name: 'tag_options'
	});

	if (Morebits.userIsSysop || Morebits.userIsEliminator) {
		tagOptions.append({
			type: 'header',
			label: 'گزینه‌های مرتبط با برچسب زدن'
		});
	}

	tagOptions.append({
		type: 'checkbox',
		list: [
			{
				label: 'آگاه کردن سازندهٔ صفحه در صورت امکان',
				value: 'notify',
				name: 'notify',
				tooltip: 'یک الگوی آگاه‌سازی روی صفحهٔ بحث کاربری که صفحه را ایجاد کرده قرار می‌گیرد، به شرط آن که در ترجیحات توینکل، آگاه‌سازی را برای این معیار فعال کرده باشید ' +
						'و این گزینه را هم تیک بزنید. ممکن است برای سازندهٔ صفحه پیام خوشامدی هم فرستاده شود.',
				checked: !Morebits.userIsSysop || !Morebits.userIsEliminator || !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')),
				event: function(event) {
					event.stopPropagation();
				}
			},
			{
				label: 'برای محافظت در برابر ایجاد (نمک) نیز برچسب بزن',
				value: 'salting',
				name: 'salting',
				tooltip: 'اگر این گزینه را انتخاب کنید، کنار برچسب حذف سریع یک برچسب {{نمک}} هم قرار داده می‌شود تا از مدیران درخواست شود که صفحه پس از حذف، در برابر ایجاد هم محافظت شود. فقط در صورتی این گزینه را استفاده کنید که صفحه بارها ایجاد شده باشد.',
				event: function(event) {
					event.stopPropagation();
				}
			},
			{
				label: 'برچسب زدن با چند معیار',
				value: 'multiple',
				name: 'multiple',
				tooltip: 'اگر این گزینه را انتخاب کنید، می‌توانید بیش از یک معیار را به عنوان دلیل حذف صفحه برگزینید. برای مثال، ترکیب معیار ع۱۱ و م۷ برای حذف مقاله‌ها رایج است.',
				event: function(event) {
					Twinkle.speedy.callback.modeChanged(event.target.form);
					event.stopPropagation();
				}
			}
		]
	});

	form.append({
		type: 'div',
		id: 'prior-deletion-count',
		style: 'font-style: italic'
	});

	form.append({
		type: 'div',
		name: 'work_area',
		label: 'راه‌اندازی پودمان حذف سریع ناموفق بود. لطفاً دوباره تلاش کنید یا در [[وپ:فنی]] گزارش کنید.'
	});

	if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
		form.append({ type: 'submit', className: 'tw-speedy-submit' }); // Renamed in modeChanged
	}

	var result = form.render();
	dialog.setContent(result);
	dialog.display();

	Twinkle.speedy.callback.modeChanged(result);

	// Check for prior deletions.  Just once, upon init
	Twinkle.speedy.callback.priorDeletionCount();
};

Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) {
	var namespace = mw.config.get('wgNamespaceNumber');

	// first figure out what mode we're in
	var mode = {
		isSysop: !!form.tag_only && !form.tag_only.checked,
		isMultiple: form.tag_only && !form.tag_only.checked ? form.delmultiple.checked : form.multiple.checked,
		isRadioClick: Twinkle.getPref('speedySelectionStyle') === 'radioClick'
	};

	if (mode.isSysop) {
		$('[name=delete_options]').show();
		$('[name=tag_options]').hide();
		$('button.tw-speedy-submit').text('حذف صفحه');
	} else {
		$('[name=delete_options]').hide();
		$('[name=tag_options]').show();
		$('button.tw-speedy-submit').text('برچسب زدن به صفحه');
	}

	var work_area = new Morebits.quickForm.element({
		type: 'div',
		name: 'work_area'
	});

	if (mode.isMultiple && mode.isRadioClick) {
		var evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';

		work_area.append({
			type: 'div',
			label: 'پس از پایان کار روی '
		});
		work_area.append({
			type: 'button',
			name: 'submit-multiple',
			label: mode.isSysop ? 'حذف صفحه' : 'برچسب زدن به صفحه',
			event: function(event) {
				Twinkle.speedy.callback[evaluateType](event);
				event.stopPropagation();
			}
		});
		work_area.append({
			type: 'div',
			label: ' کیلک کنید'
		});
	}

	var appendList = function(headerLabel, csdList) {
		work_area.append({ type: 'header', label: headerLabel });
		work_area.append({ type: mode.isMultiple ? 'checkbox' : 'radio', name: 'csd', list: Twinkle.speedy.generateCsdList(csdList, mode) });
	};

	if (mode.isSysop && !mode.isMultiple) {
		appendList('دلیل سفارشی', Twinkle.speedy.customRationale);
	}

	if (namespace % 2 === 1 && namespace !== 3) {
		// show db-talk on talk pages, but not user talk pages
		appendList('صفحه‌های بحث', Twinkle.speedy.talkList);
	}

	if (!Morebits.isPageRedirect()) {
		switch (namespace) {
			case 0:  // article
			case 1:  // talk
				appendList('مقاله‌ها', Twinkle.speedy.articleList);
				break;

			case 2:  // user
			case 3:  // user talk
				appendList('صفحه‌های کاربری', Twinkle.speedy.userList);
				break;

			case 6:  // file
			case 7:  // file talk
				appendList('پرونده‌ها', Twinkle.speedy.fileList);
				if (!mode.isSysop) {
					work_area.append({ type: 'div', label: 'افزودن برچسب برای معیارهای پ۴ (بدون مجوز)، پ۵ (پروندهٔ غیر آزاد استفاده نشده)، پ۶ (فاقد دلیل برای استفادهٔ منصفانه) و پ۱۱ (بدون مدرک برای مجوز) با استفاده از زبانهٔ «تصاویر» در توینکل ممکن است.' });
				}
				break;
				
			case 10:  // template
			case 11:  // template talk
				appendList('الگوها', Twinkle.speedy.templateList);
				break;
				
			case 14:  // category
			case 15:  // category talk
				appendList('رده‌ها', Twinkle.speedy.categoryList);
				break;

			case 100:  // portal
			case 101:  // portal talk
				appendList('درگاه‌ها', Twinkle.speedy.portalList);
				break;

			default:
				break;
		}
	} else {
		if (namespace === 2 || namespace === 3) {
			appendList('صفحه‌های کاربری', Twinkle.speedy.userList);
		}
		appendList('تغییرمسیرها', Twinkle.speedy.redirectList);
	}

	var generalCriteria = Twinkle.speedy.generalList;

	// custom rationale lives under general criteria when tagging
	if (!mode.isSysop) {
		generalCriteria = Twinkle.speedy.customRationale.concat(generalCriteria);
	}
	appendList('معیارهای عمومی', generalCriteria);

	var old_area = Morebits.quickForm.getElements(form, 'work_area')[0];
	form.replaceChild(work_area.render(), old_area);

	// if sysop, check if CSD is already on the page and fill in custom rationale
	if (mode.isSysop && Twinkle.speedy.hasCSD) {
		var customOption = $('input[name=csd][value=reason]')[0];
		if (customOption) {
			if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
				// force listeners to re-init
				customOption.click();
				customOption.parentNode.appendChild(customOption.subgroup);
			}
			customOption.subgroup.querySelector('input').value = decodeURIComponent($('#delete-reason').text()).replace(/\+/g, ' ');
		}
	}
};

Twinkle.speedy.callback.priorDeletionCount = function () {
	var query = {
		action: 'query',
		format: 'json',
		list: 'logevents',
		letype: 'delete',
		leaction: 'delete/delete', // Just pure page deletion, no redirect overwrites or revdel
		letitle: mw.config.get('wgPageName'),
		leprop: '', // We're just counting we don't actually care about the entries
		lelimit: 5  // A little bit goes a long way
	};

	new Morebits.wiki.api('در حال بررسی حذف‌های پیشین', query, function(apiobj) {
		var response = apiobj.getResponse();
		var delCount = response.query.logevents.length;
		if (delCount) {
			var message = mw.language.convertNumber(delCount) + ' بار حذف در گذشته';
			if (delCount > 1) {
//				message += 's';
				if (response.continue) {
					message = 'بیش از ' + message;
				}

				// 3+ seems problematic
				if (delCount >= 3) {
					$('#prior-deletion-count').css('color', 'red');
				}
			}

			// Provide a link to page logs (CSD templates have one for sysops)
			var link = Morebits.htmlNode('a', '(سیاهه‌ها)');
			link.setAttribute('href', mw.util.getUrl('ویژه:سیاهه‌ها', {page: mw.config.get('wgPageName')}));
			link.setAttribute('target', '_blank');

			$('#prior-deletion-count').text(message + ' '); // Space before log link
			$('#prior-deletion-count').append(link);
		}
	}).post();
};


Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) {

	var pageNamespace = mw.config.get('wgNamespaceNumber');

	var openSubgroupHandler = function(e) {
		$(e.target.form).find('input').prop('disabled', true);
		$(e.target.form).children().css('color', 'gray');
		$(e.target).parent().css('color', 'black').find('input').prop('disabled', false);
		$(e.target).parent().find('input:text')[0].focus();
		e.stopPropagation();
	};
	var submitSubgroupHandler = function(e) {
		var evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
		Twinkle.speedy.callback[evaluateType](e);
		e.stopPropagation();
	};

	return $.map(list, function(critElement) {
		var criterion = $.extend({}, critElement);

		if (mode.isMultiple) {
			if (criterion.hideWhenMultiple) {
				return null;
			}
			if (criterion.hideSubgroupWhenMultiple) {
				criterion.subgroup = null;
			}
		} else {
			if (criterion.hideWhenSingle) {
				return null;
			}
			if (criterion.hideSubgroupWhenSingle) {
				criterion.subgroup = null;
			}
		}

		if (mode.isSysop) {
			if (criterion.hideWhenSysop) {
				return null;
			}
			if (criterion.hideSubgroupWhenSysop) {
				criterion.subgroup = null;
			}
		} else {
			if (criterion.hideWhenUser) {
				return null;
			}
			if (criterion.hideSubgroupWhenUser) {
				criterion.subgroup = null;
			}
		}

		if (Morebits.isPageRedirect() && criterion.hideWhenRedirect) {
			return null;
		}

		if (criterion.showInNamespaces && criterion.showInNamespaces.indexOf(pageNamespace) < 0) {
			return null;
		}
		if (criterion.hideInNamespaces && criterion.hideInNamespaces.indexOf(pageNamespace) > -1) {
			return null;
		}

		if (criterion.subgroup && !mode.isMultiple && mode.isRadioClick) {
			if (Array.isArray(criterion.subgroup)) {
				criterion.subgroup = criterion.subgroup.concat({
					type: 'button',
					name: 'submit',
					label: mode.isSysop ? 'حذف صفحه' : 'برچسب زدن به صفحه',
					event: submitSubgroupHandler
				});
			} else {
				criterion.subgroup = [
					criterion.subgroup,
					{
						type: 'button',
						name: 'submit',  // ends up being called "csd.submit" so this is OK
						label: mode.isSysop ? 'حذف صفحه' : 'برچسب زدن به صفحه',
						event: submitSubgroupHandler
					}
				];
			}
			// FIXME: does this do anything?
			criterion.event = openSubgroupHandler;
		}

		return criterion;
	});
};

Twinkle.speedy.customRationale = [
	{
		label: 'معیار سفارشی' + ((Morebits.userIsSysop || Morebits.userIsEliminator) ? ' (دلیل سفارشی برای حذف)' : ' با استفاده از الگوی {{حذف سریع}}'),
		value: 'reason',
		tooltip: 'دست کم یکی از معیارهای حذف سریع باید برای صفحه مصداق داشته باشد، و شما این را باید در دلیلی که می‌نویسید ذکر کنید. این گزینه برای آن نیست که وقتی دلیل حذف را بین گزینه‌های دیگر نیافتید از آن استفاده کنید.',
		subgroup: {
			name: 'reason_1',
			type: 'input',
			label: 'معیار:',
			size: 60
		},
		hideWhenMultiple: true
	}
];

Twinkle.speedy.talkList = [
	{
		label: 'ع۸: صفحهٔ بحث یتیم',
		value: 'talk',
		tooltip: 'این معیار شامل صفحه‌های بحثی که برای پروژه مفید باشند نمی‌شود؛ به‌خصوص صفحه‌های بحث کاربر، بایگانی‌های صفحه‌های بحث، و صفحهٔ بحث پرونده‌هایی که در ویکی‌انبار موجود هستند.'
	}
];

Twinkle.speedy.fileList = [
	{
		label: 'پ۱: پروندهٔ تکراری',
		value: 'redundantimage',
		tooltip: 'هر پرونده‌ای که تکراری باشد، قالبش با نسخهٔ دیگر یکی باشد و کیفیتش از آن کمتر یا با آن یکسان باشد. به‌طور مشابه، سایر رسانه‌هایی که تکراری باشند و کیفیت آن‌ها با نسخهٔ دیگر یکسان یا کمتر از آن باشد. این معیار بر پرونده‌هایی که نسخهٔ تکراری آن‌ها به‌دلیل مشکل اجازه‌نامه در ویکی‌انبار قرار دارد، اعمال نمی‌شود؛ چنین پرونده‌هایی باید در عوض با {{جا:موجود در انبار تاریخ‌دار|Image:newname.ext}} یا {{جا:موجود در انبار تاریخ‌دار}} برچسب بخورند',
		subgroup: {
			name: 'redundantimage_filename',
			type: 'input',
			label: 'نام پرونده‌ای که این پرونده تکرارش کرده‌است:',
			tooltip: 'پیشوند «پرونده:» را می‌توانید ننویسید.'
		}
	},
	{
		label: 'پ۲: تصاویر خراب، ناموجود یا خالی',
		value: 'noimage',
		tooltip: 'پیش از حذف چنین تصاویری مطمئن شوید که مدیاویکی قادر به خواندن تصویر و نمایش یک نسخهٔ کوچک‌تر از آن تصویر نیست. این معیار شامل صفحه‌های توضیحات پروندهٔ خالی (بدون محتوا) برای پرونده‌های موجود در ویکی‌انبار نیز می‌شود.'
	},
	{
		label: 'پ۲: صفحهٔ توضیحات نالازم برای پرونده‌ای که در ویکی‌انبار است',
		value: 'fpcfail',
		tooltip: 'تصویری که در ویکی‌انبار است اما صفحه‌ای در ویکی‌پدیا دارد که حاوی اطلاعات و برچسب‌هایی است که دیگر لازم نیستند. (برای مثال، نامزدی ناموفق نگارهٔ برگزیده.)',
		hideWhenMultiple: true
	},
	{
		label: 'پ۳: اجازه‌نامهٔ نامناسب',
		value: 'noncom',
		tooltip: 'پرونده‌ای که با مجوز «فقط استفادهٔ غیرتجاری»، «اثر اشتقاقی ممنوع»، یا «استفاده فقط با اخذ مجوز» منتشر شده‌است و در ۱۹ مهٔ ۲۰۰۵ یا پس از آن بارگذاری شده؛ به‌جز در مواردی که مطابقت آن با استانداردهای محدود استفاده از محتوای غیرآزاد محرز باشد. این شامل تصاویری که مجوز «کرییتیو کامانز برای استفادهٔ غیرتجاری» دارند نیز می‌شود. چنین پرونده‌هایی که پیش از ۱۹ مهٔ ۲۰۰۵ بارگذاری شده‌اند نیز در صورتی که در هیچ مقاله‌ای به‌کار نرفته باشند، می‌توانند حذف سریع شوند.'
	},
	{
		label: 'پ۴: فاقد اطلاعات لازم در مورد اجازه‌نامه',
		value: 'unksource',
		tooltip: 'پرونده‌هایی که در ردهٔ «تصویرهای با منبع نامعلوم» یا «تصاویر با وضعیت حق تکثیر نامعلوم» یا نظایر آن قرار دارند و صرف نظر از زمان بارگذاری، با الگویی برچسب خورده‌اند که آن‌ها را برای مدتی بیش از هفت روز در ردهٔ مذکور قرار داده‌اند. توجه کنید که گاهی کاربران منبع اثر را در خلاصه ویرایش می‌نویسند پس حتماً تاریخچه را از این نظر بررسی کنید.',
		hideWhenUser: true
	},
	{
		label: 'پ۵: پرونده‌های غیرآزاد استفاده‌نشده',
		value: 'f5',
		tooltip: 'پرونده‌هایی که مجوز آزاد ندارند یا در مالکیت عمومی نیستند و در هیچ مقاله‌ای استفاده نشده‌اند و تنها کاربردشان در مقاله‌ای بوده که حذف شده‌است و بعید است که در مقاله‌ای دیگر استفاده شوند. استثناهای معقول عبارتند از پرونده‌هایی که برای یک مقاله که به زودی ساخته می‌شود بارگذاری شده‌اند. برای تصاویر غیرآزاد استفاده نشدهٔ دیگر، از برچسب «استفاده منصفانهٔ یتیم» در زبانهٔ «تصاویر» توینکل استفاده کنید.',
		hideWhenUser: true
	},
	{
		label: 'پ۶: فقدان توضیح در مورد استفادهٔ منصفانه',
		value: 'norat',
		tooltip: 'هر پروندهٔ فاقد دلیل برای استفادهٔ منصفانه را می‌توان هفت روز پس از بارگذاری آن حذف کرد.  پرونده‌های بارگذاره‌شده پیش از ۴ مهٔ ۲۰۰۶ نباید حذف سریع شوند؛ در عوض باید کاربر بارگذار از لزوم ارائه دلیل برای استفادهٔ منصفانه آگاه شود.  پرونده‌های بارگذاری‌شده پس از ۴ مهٔ ۲۰۰۶ را می‌توان بااستفاده از گزینهٔ «فقدان توضیح در مورد استفادهٔ منصفانه» در زبانهٔ «تصاویر» توینکل برچسب‌گذاری کرد. این پرونده‌ها را می‌توان در رده:پرونده‌های ویکی‌پدیا که دلیل استفاده منصفانه ندارند پیدا کرد.',
		hideWhenUser: true
	},
	{
		label: 'پ۷: استفادهٔ منصفانه از رسانه‌ای از یک آژانس تصویر تجاری که با موضوع مورد تفسیر منبع مرتبط نیست',
		value: 'badfairuse',
		tooltip: 'تصاویر یا رسانه‌های غیر آزاد از یک منبع تجاری (مثلاً آسوشید پرس یا گتی ایمجز)، در جایی که خود پرونده موضوع مورد تفسیر منبع نیست، به‌عنوان ادعای نامعتبر استفادهٔ منصفانه در نظر گرفته می‌شوند و معیارهای سخت‌گیرانهٔ وپ:ملاک منصفانه را احراز نخواهند کرد. در مواردی که نیازمند مهلت هستند (مانند معیارهای نامعتبر یا مورد اختلاف یا تصاویر قابل جایگزینی)، از گزینه‌های موجود در زبانهٔ «تصاویر» توینکل استفاده کنید.',
		subgroup: {
			name: 'badfairuse_rationale',
			type: 'input',
			label: 'توضیحات اختیاری:',
			size: 60
		},
		hideWhenMultiple: true
	},
	{
		label: 'پ۸: تصاویری که همانند آن‌ها در ویکی‌انبار موجود است',
		value: 'commons',
		tooltip: 'مواردی که دارای این شرایط باشند، مشمول این معیار می‌شوند: ۱: فرمت هر دو تصویر با هم یکسان است. ۲: مجوز پرونده(ها) به‌طور منطقی مورد تردید است و مجوز بدون تردید در ویکی‌انبار مورد تأیید قرار گرفته‌است. ۳: تمامی اطلاعات موجود در صفحهٔ توضیحات پرونده در ویکی‌انبار نیز موجود است. این شامل تاریخچهٔ کامل بارگذاری به‌همراه پبوند به صفحهٔ کاربری محلی بارگذار می‌شود. ۴: پرونده حفاظت نشده است و صفحهٔ توضیحات پرونده دربردارندهٔ درخواست عدم انتقال به ویکی‌انبار نیست. ۵: اگر پرونده با نامی در ویکی‌انبار موجود است که با نام آن در ویکی محلی متفاوت است، هدف تمامی ارجاعات محلی به پرونده باید به عنوان مورد استفاده در انبار تغییر یابند. ۶: برای پرونده‌های {{بارگذاری شده از انبار}}: این پرونده‌ها باید به محض این که از صفحهٔ اصلی برداشته‌شدند، حذف سریع شوند',
		subgroup: {
			name: 'commons_filename',
			type: 'input',
			label: 'نام پرونده در انبار:',
			value: Morebits.pageNameNorm,
			tooltip: 'اگر نام تصویر در انبار با نامش در این‌جا یکسان است، می‌توانید خالی بگذارید. درج پیشوند «File:» اختیاری است؛ اما از پیشوند «پرونده:» استفاده نکنید.'
		},
		hideWhenMultiple: true
	},
	{
		label: 'پ۹: نقض آشکار حق تکثیر',
		value: 'imgcopyvio',
		tooltip: 'پرونده از یک وبگاه یا منبع دیگر کپی شده است که فاقد مجوز سازگار با ویکی‌پدیا است و بارگذار نه مدعی استفادهٔ منصفانه است، و نه ادعای باورپذیری مبنی بر داشتن اجازهٔ استفادهٔ آزاد از پرونده را دارد. منابعی که فاقد مجوز سازگار با ویکی‌پدیا هستند شامل بایگانی‌های عکس‌های آرشیوی مانند گتی ایمجز یا کوربیس می‌شوند. مواردی که شامل نقض غیر آشکار حق تکثیر باشند، باید برای نظرخواهی به ویکی‌پدیا:نظرخواهی برای حذف بروند',
		subgroup: [
			{
				name: 'imgcopyvio_url',
				type: 'input',
				label: 'پیوند به نشانی نقض حق تکثیر، شامل پیشوند "http://".  اگر نقض حق تکثیر از یک منبع غیر اینترنتی رخ داده‌است و قادر به ارائهٔ نشانی نیستید، باید از جعبهٔ استدلال حذف استفاده کنید.',
				size: 60
			},
			{
				name: 'imgcopyvio_rationale',
				type: 'input',
				label: 'استدلال حذف برای نقض حق تکثیر غیر اینترنتی:',
				size: 60
			}
		]
	},
	{
		label: 'پ۱۰: پروندهٔ غیررسانه‌ای بدون استفاده',
		value: 'badfiletype',
		tooltip: 'پرونده‌های بارگذاری‌شده‌ای که تصویر، صوت یا ویدئو نیستند (مانند پرونده‌های دارای پسوند .doc، .pdf، یا .xls) که در هیچ مقاله‌ای استفاده نشده‌اند و هیچ کاربرد دانشنامه‌ای دیگری برای آن‌ها قابل تصور نیست.'
	},
	{
		label: 'پ۱۱: بدون مدرک در مورد مجوز',
		value: 'nopermission',
		tooltip: 'اگر یک بارگذار مجوزی را مشخص کرده و از یک شخص ثالث، بدون ارائهٔ مدرکی مبنی بر موافقت آن شخص ثالث به‌عنوان منبع/دارنده حق تکثیر نام برده است، آن آیتم باید هفت روز پس از ارسال آگاه‌سازی به بارگذار حذف شود',
		hideWhenUser: true
	},
	{
		label: 'ع۸: صفحهٔ توضیحات پرونده بدون صفحهٔ پروندهٔ متناظر',
		value: 'imagepage',
		tooltip: 'این معیار تنها در مواردی استفاده می‌شود که پرونده به هیچ عنوان موجود نباشد. برای پرونده‌های خراب و صفحه‌های توضیحات محلی برای پرونده‌های موجود در انبار، باید از پ۲ استفاده کرد؛ برای تغییرمسیرهای نامحتمل باید از ت۳ استفاده کرد؛ و برای تغییرمسیرهای شکسته از انبار باید از ت۴ استفاده کرد.'
	}
];

Twinkle.speedy.articleList = [
	{
		label: 'م۱: بدون بافت مشخص. مقاله‌های فاقد زمینهٔ کافی برای شناسایی موضوع مقاله.',
		value: 'nocontext',
		tooltip: 'نمونه: «او صاحب یک شرکت بزرگ است و خیلی کارش درست است.» این معیار تنها باید برای مقاله‌های بسیار کوتاه استفاده شود. نداشتن بافت مشخص را نباید با بدون محتوا بودن (م۳) اشتباه گرفت.'
	},
	{
		label: 'م۲: مقالات غیرفارسی که در پروژه‌های دیگر ویکی‌مدیا وجود دارند',
		value: 'foreign',
		tooltip: 'اگر مقالهٔ مورد نظر در پروژه‌های دیگر موجود نیست، باید از الگوی {{اصلاح ترجمه}} استفاده کرد. تمام مقاله‌های غرفارسی که مشمول این معیار نمی‌شوند (و مشمول هیچ یک از معیارهای دیگر حذف سریع نیز نیستند) باید برای بازبینی و ترجمهٔ احتمالی در صفحه‌های نیازمند ترجمه (صنت) فهرست شوند',
		subgroup: {
			name: 'foreign_source',
			type: 'input',
			label: 'پیوند میان‌ویکی به مقاله در زبان دیگر:',
			tooltip: 'برای مثال، fr:Bonjour'
		}
	},
	{
		label: 'م۳: بدون محتوا',
		value: 'nocontent',
		tooltip: 'مقاله‌هایی که تنها شامل مجموعه‌ای از پیوندها (از جمله پیوند به بیرون، برچسب رده و جستارهای وابسته)، بازنویسی عنوان مقاله و/یا تلاش برای برقراری ارتباط با فرد یا گروه مربوط به نام مقاله باشد. این معیار شامل صفحه‌های ابهام‌زدایی نمی‌شود'
	},
	{
		label: 'م۵: انتقال به ویکی دیگر',
		value: 'transwiki',
		tooltip: 'هر مقاله‌ای که به نظرخواهی برای حذف رفته، نتیجهٔ نظرخواهی انتقال به ویکی‌دیگر بوده، انتقال به ویکی دیگر به‌درستی انجام شده و اطلاعات نگارنده نیز ثبت شده‌است. در مقابل، هر مقاله‌ای که تنها شامل یک معنای لغت‌نامه‌وار بوده، انتقال به ویکی دیگر به‌درستی انجام شده و اطلاعات نگارنده نیز ثبت شده‌است',
		subgroup: {
			name: 'transwiki_location',
			type: 'input',
			label: 'پیوند به جایی که صفحه به آن منتقل شده است:',
			tooltip: 'برای مثال، https://fa.wiktionary.org/wiki/توینکل یا [[wikt:توینکل]]'
		}
	},
	{
		label: 'م۷: فاقد توضیح در مورد اهمیت (افراد، گروه‌ها، شرکت‌ها، محتوای وب، حیوان‌های تک، یا رویدادهای سازمان‌یافته)',
		value: 'a7',
		tooltip: 'مقاله‌ای دربارهٔ اشخاص حقیقی، دسته‌ای از افراد، گروه، باشگاه، شرکت، محتوای وب، حیوان تک، سفر یا حزب که به‌طور مشخص دلیل اهمیت موضوع را نشان نمی‌دهد. در صورت بحث‌برانگیز بودن، یا در صورتی که در یک نظرخواهی قبلاً  اجماع بر ماندن مقاله بوده‌است، مقاله باید در عوض به نظرخواهی برای حذف برود',
		hideWhenSingle: true
	},
	{
		label: 'م۷: فاقد توضیح در مورد اهمیت (شخص)',
		value: 'person',
		tooltip: 'مقاله‌ای دربارهٔ یک شخص حقیقی که به‌طور مشخص دلیل اهمیت موضوع را نشان نمی‌دهد. در صورت بحث‌برانگیز بودن، یا در صورتی که در یک نظرخواهی قبلاً  اجماع بر ماندن مقاله بوده‌است، مقاله باید در عوض به نظرخواهی برای حذف برود',
		hideWhenMultiple: true
	},
	{
		label: 'م۷: فاقد توضیح در مورد اهمیت (موسیقی‌دان یا گروه موسیقی)',
		value: 'band',
		tooltip: 'مقاله‌ای دربارهٔ یک گروه موسیقی، خواننده یا موسیقی‌دان که به‌طور مشخص دلیل اهمیت موضوع را نشان نمی‌دهد.',
		hideWhenMultiple: true
	},
	{
		label: 'م۷: فاقد توضیح در مورد اهمیت (باشگاه، انجمن یا گروه)',
		value: 'club',
		tooltip: 'مقاله‌ای دربارهٔ یک باشگاه، انجمن یا گروه که به‌طور مشخص دلیل اهمیت موضوع را نشان نمی‌دهد',
		hideWhenMultiple: true
	},
	{
		label: 'م۷: فاقد توضیح در مورد اهمیت (شرکت یا سازمان)',
		value: 'corp',
		tooltip: 'مقاله‌ای دربارهٔ یک شرکت یا سازمان که به‌طور مشخص دلیل اهمیت موضوع را نشان نمی‌دهد',
		hideWhenMultiple: true
	},
	{
		label: 'م۷: فاقد توضیح در مورد اهمیت (وبگاه یا محتوای وب)',
		value: 'web',
		tooltip: 'مقاله‌ای دربارهٔ یک وبگاه، وب‌نوشت، انجمن برخط، وب‌کامیک، پادکست یا سایر محتوای مشابه وب که به‌طور مشخص دلیل اهمیت موضوع را نشان نمی‌دهد',
		hideWhenMultiple: true
	},
	{
		label: 'م۷: فاقد توضیح در مورد اهمیت (حیوان تک)',
		value: 'animal',
		tooltip: 'مقاله‌ای دربارهٔ یک حیوان تک (مانند یک حیوان خانگی) که به‌طور مشخص دلیل اهمیت موضوع را نشان نمی‌دهد',
		hideWhenMultiple: true
	},
	{
		label: 'م۷: فاقد توضیح در مورد اهمیت (رویداد سازمان‌یافته)',
		value: 'event',
		tooltip: 'مقاله‌ای دربارهٔ یک رویداد سازمان‌دهی‌شده (تور کنسرت، مأموریت، همایش، مهمانی و غیره) که به‌طور مشخص دلیل اهمیت موضوع را نشان نمی‌دهد',
		hideWhenMultiple: true
	},
	{
		label: 'م۹: موسیقی ضبط‌شدهٔ غیرقابل توجه که مقالهٔ هنرمند خالق آن نیز موجود نیست',
		value: 'a9',
		tooltip: 'مقاله‌ای دربارهٔ یک موسیقی ضبط‌شده که دلیل اهمیت موضوع را نشان نمی‌دهد و مقالهٔ هنرمند خالق آن نیز تاکنون ایجاد نشده یا حذف شده است'
	},
	{
		label: 'م۱۰: مقالهٔ تازه‌ساز که موضوعی از پیش موجود را تکرار می‌کند',
		value: 'a10',
		tooltip: 'مقاله‌ای که اخیراً ایجاد شده و تاریخچهٔ کوتاهی دارد و یکی از محتوای موجود در دانشنامه را دوباره تکرار کرده و اطلاعات آن را گسترش یا بهبود نداده، و عنوان آن تغییرمسیر محتمل نیست. این معیار شامل صفحات تفکیک‌شده یا هرگونه مقاله‌ای که حاصل تفکیک، گسترش یا بازآرایی یک مقالهٔ قدیمی‌تر است، نمی‌شود.',
		subgroup: {
			name: 'a10_article',
			type: 'input',
			label: 'مقاله‌ای که تکرار شده:'
		}
	},
	{
		label: 'م۱۱: مشخصاً ساختهٔ ذهن نویسنده است و هیچ ادعایی در مورد مهم بودنش وجود ندارد',
		value: 'madeup',
		tooltip: 'مقاله‌ای که به سادگی نشان می‌دهد که موضوع آن، توسط سازندهٔ مقاله یا کسی که او را شخصاً می‌شناسد، اختراع یا ابداع یا کشف شده و به صورت معتبر نشان نمی‌دهد که چرا موضوع آن مهم یا قابل توجه است'
	}
];

Twinkle.speedy.categoryList = [
	{
		label: 'ر۱: ردهٔ خالی',
		value: 'catempty',
		tooltip: 'رده‌هایی که برای چهار روز متوالی هیچ زیررده‌ای نداشته باشند و هیچ مقاله‌ای هم در آن رده‌ها قرار نگیرد. این معیار بر رده‌هایی که به وپ:نبح رفته‌اند، رده‌های ابهام‌زدایی و سایر استثناهای واضح، اعمال نمی‌شود. اگر رده به تازگی ایجاد نشده باشد، امکان دارد قبلاً شامل مقالاتی بوده باشد، و بررسی‌های بیشتری لازم خواهد بود'
	},
	{
		label: 'ع۸: رده‌های که توسط یک الگوی حذف‌شده یا تغییر هدف یافته پر می‌شده‌اند',
		value: 'templatecat',
		tooltip: 'رده‌هایی که به‌طور مؤثر خالی هستند، زیرا الگو(ها)یی که قبلاً صفحه‌ها را در رده قرار می‌داد‌ه‌اند، حذف شده(اند).رده‌هایی که هنوز مورد استفادهٔ الگوها هستند مشمول این معیار نمی‌شوند .',
		subgroup: {
			name: 'templatecat_rationale',
			type: 'input',
			label: 'توضیح اختیاری:',
			size: 60
		}
	},
	{
		label: 'ع۸: تغییرمسیر به هدف ناموجود',
		value: 'redirnone',
		tooltip: 'این معیار شامل هر صفحه‌ای که برای پروژه مفید باشد، نمی‌شود؛ به‌ویژه: نظرخواهی‌های حذف که جای دیگری فهرست نشده‌اند، صفحه‌های کاربری و بحث کاربر، بایگانی‌های صفحه‌های بحث، تغییرمسیرهای محتمل که می‌توان هدف آن‌ها را به صفحه‌ای معتبر تغییر داد و صفحه‌های پرونده یا بحث پرونده‌ای که در ویکی‌انبار موجود هستند.',
		hideWhenMultiple: true
	}
];

Twinkle.speedy.userList = [
	{
		label: 'ک۱: درخواست کاربر',
		value: 'userreq',
		tooltip: 'زیرصفحه‌های شخصی، مطابق با درخواست کاربر صاحب صفحه. در برخی موارد نادر، ممکن است ماندن صفحه به دلایل مدیریتی لازم باشد. همچنین در بعضی مواقع، صفحه‌های اصلی کاربری نیز می‌توانند حذف شوند. برای مشاهدهٔ رهنمودها و راه‌کارهای کامل، ویکی‌پدیا:صفحه‌های کاربری را ببینید',
		subgroup: mw.config.get('wgNamespaceNumber') === 3 && mw.config.get('wgTitle').indexOf('/') === -1 ? {
			name: 'userreq_rationale',
			type: 'input',
			label: 'استدلال (اجباری) در توضیح دلیل حذف این صفحهٔ بحث کاربر:',
			tooltip: 'صفحه‌های بحث کاربری تنها در شرایطی بسیار استثنائی حذف می‌شوند. وپ:حذف بحث را ببینید.',
			size: 60
		} : null,
		hideSubgroupWhenMultiple: true
	},
	{
		label: 'ک۲: کاربر ناموجود',
		value: 'nouser',
		tooltip: 'صفحه‌های کاربری حساب‌هایی که ایجاد نشده‌اند (ویژه:فهرست کاربران را بررسی کنید)'
	},
	{
		label: 'ک۵: نقض آشکار «وپ:میزبان وب نیست»',
		value: 'notwebhost',
		tooltip: 'صفحه‌هایی در فضای کاربری شامل نوشته‌ها، اطلاعات، گفتگوها و/یا فعالیت‌هایی که مطابقت چندانی با اهداف ویکی‌پدیا ندارند و صاحب صفحه در خارج از فضای کاربری ویرایشی نداشته یا ویرایش‌های بسیار کمی دارد. به‌استثناء پیش‌نویس‌های قابل پذیرش و صفحه‌هایی که تناقضی با «وپ:کاربر هست» ندارند.',
		hideWhenRedirect: true
	},
	{
		label: 'ع۱۱: صفحهٔ کاربری تبلیغاتی با نام کاربری تبلیغاتی',
		value: 'spamuser',
		tooltip: 'صفحهٔ کاربری تبلیغاتی با نام کاربری که ترویج‌دهندهٔ موضوع مورد اشارهٔ تبلیغات است یا نشانهٔ ارتباط کاربر با آن است. دقت کنید که صرف داشتن یک صفحه دربارهٔ یک شرکت یا محصول در فضای کاربری یک کاربر، دلیلی برای حذف آن صفحه نیست. اگر صفحهٔ کاربری تبلیغاتی است، اما نام کاربری چنین نیست، در عوض از برچسب ع۱۱ استفاده کنید.',
		hideWhenMultiple: true,
		hideWhenRedirect: true
	},
	{
		label: 'ع۱۳: درخواست‌های پیش‌نویس مبا یا پیش‌نویس خالی که برای بیشتر از ۶ ماه رها شده‌است',
		value: 'afc',
		tooltip: 'هرگونه درخواست پیش‌نویس ردشده یا ارسال‌نشدهٔ مبا یا یک پیش‌نویس خالی که بیش از ۶ ماه است که ویرایش نشده‌است (به‌استثناء ویرایش‌های ربات).',
		hideWhenMultiple: true,
		hideWhenRedirect: true
	}
];

Twinkle.speedy.templateList = [
	{
		label: 'ال۲. نمایش نادرست ویکی‌پدیا:سیاست‌ها و رهنمودها',
		value: 'policy',
		tooltip: 'شامل الگوهای «حذف سریع» برای مشکلاتی که مشمول معیارهای حذف سریع نیستند و الگوهای تکذیب‌نامه که برای استفاده در مقاله‌ها ایجاد شده‌اند',
		subgroup: {
			name: 'policy_rationale',
			type: 'input',
			label: 'توضیح اختیاری: ',
			size: 60
		},
		hideSubgroupWhenSysop: true
	},
	{
		label: 'ال۳. الگوهای تکراری و دارای کدنویسی سخت',
		value: 'duplicatetemplate',
		tooltip: 'الگوهایی که بخش بزرگی از آن‌ها رونوشت‌برداری از یک الگوی دیگر است یا نمونه‌هایی با کدنویسی سخت از الگوی دیگری هستند که می‌تواند کار مشابهی را انجام دهد',
		subgroup: {
			name: 'duplicatetemplate_2',
			type: 'input',
			label: 'الگویی که این الگو مازاد آن است: ',
			tooltip: 'به استفاده از پیشوند «الگو:» نیازی نیست.'
		},
		hideWhenMultiple: true
	}
];

Twinkle.speedy.portalList = [
	{
		label: 'د۱: هر درگاهی که اگر مقاله می‌بود، با معیارهای حذف سریع مقاله‌ها حذف می‌شد',
		value: 'p1',
		tooltip: 'لازم است که یک معیار حذف مقاله که در این مورد صادق است را مشخص کنید (م۱، م۳، م۷, یا م۱۰).',
		subgroup: {
			name: 'p1_criterion',
			type: 'input',
			label: 'معیار مقاله‌ای که در این مورد صادق است:'
		}
	},
	{
		label: 'د۲: درگاه کم‌مقاله (کمتر از سه مقالهٔ غیر خرد)',
		value: 'emptyportal',
		tooltip: 'هر درگاهی که برای موضوع اصلی آن تنها یک مقالهٔ سرآیند خُرد وجود داشته باشد یا تعداد مقالات غیر خردی که به موضوع درگاه می‌پردازند و برای عنوان درگاه مناسب هستند، کمتر از سه مقاله باشد'
	}
];

Twinkle.speedy.generalList = [
	{
		label: 'ع۱: عبارت‌های نامفهوم. صفحه‌هایی که حاوی متنی کاملاً بی‌ربط یا بیهوده هستند و محتوا یا تاریخچهٔ آن‌ها قابل اعتنا نیست.',
		value: 'nonsense',
		tooltip: 'این معیار شامل نوشتار ضعیف، نوشته‌های طرفدارانه، نوشته‌های تحریک‌آمیز یا توهین‌آمیز، شایعات، نوشته‌های تخیلی و ترجمه‌های بد نمی‌شود. به اختصار، اگر می‌شود فهمیدش، ع۱ قابل اعمال نیست.',
		hideInNamespaces: [ 2 ] // Not applicable in userspace
	},
	{
		label: 'ع۲: صفحهٔ آزمایشی',
		value: 'test',
		tooltip: 'صفحه‌های ایجاد شده برای ویرایش‌های آزمایشی یا آشنایی با سایر عملکردهای ویکی‌پدیا. این معیار شامل صفحه‌های موجود در فضای نام کاربر یا الگوهای بدون کاربرد یا تکراری، اما معتبر نمی‌شود.',
		hideInNamespaces: [ 2 ] // Not applicable in userspace
	},
	{
		label: 'ع۳: خرابکاری محض',
		value: 'vandalism',
		tooltip: 'خرابکاری محض و آشکار (از جمله تغییرمسیرهایی که در حین انتقال خرابکارانهٔ صفحه‌ها ایجاد شده‌اند)'
	},
	{
		label: 'ع۳: کلک‌زنی آشکار',
		value: 'hoax',
		tooltip: 'کلک‌زنی آشکار و واضح، در حد خرابکاری',
		hideWhenMultiple: true
	},
	{
		label: 'ع۴: ساخت دوبارهٔ صفحه‌ای که بر پایهٔ نظرخواهیِ حذف حذف شده‌است',
		value: 'repost',
		tooltip: 'رونوشت‌هایی از یک صفحهٔ حذف‌شده که بنا بر تازه‌ترین نظرخواهی حذفش حذف گردیده‌است و نسخهٔ جدید آن به اندازهٔ کافی با آن یکسان است، ولو در هر عنوان دیگری. این معیار به محتوایی که مشخصاً برای بهبود به فضای نام کاربری یا پیش‌نویس منتقل شده است، یا مطالب احیاشده از راه بررسی حذف یا حذف‌شده از راه حذف زمان‌دار یا حذف سریع (هرچند در مورد حذف سریع امکان دارد معیار حذف سریع قبلی یا دیگر معیارهای حذف سریع قابل استفاده باشند) اعمال نمی‌شود',
		subgroup: {
			name: 'repost_xfd',
			type: 'input',
			label: 'صفحهٔ نظرخواهی برای حذف:',
			tooltip: 'حتما باید با «ویکی‌پدیا:» آغاز شود',
			size: 60
		}
	},
	{
		label: 'ع۵: ساختهٔ کاربر تحریم‌شده یا بسته‌شده',
		value: 'banned',
		tooltip: 'صفحه‌هایی که توسط کاربران تحریم‌شده یا بسته‌شده و با دور زدن تحریم یا قطع دسترسی ساخته می‌شوند و دیگران هیچ ویرایش عمده‌ای (ویرایشی که جزئی نباشد و منجر به تغییر اساسی صفحه شده باشد) در آن‌ها نکرده‌اند',
		subgroup: {
			name: 'banned_user',
			type: 'input',
			label: 'نام کاربر طرد شده (در صورتی که مشخص است):',
			tooltip: 'نباید با «کاربر:» آغاز شود'
		}
	},
	{
		label: 'ع۶: انتقال',
		value: 'move',
		tooltip: 'ممکن کردن انتقالی بحث‌نابرانگیز نظیر معکوسی کردن یک تغییرمسیر',
		subgroup: [
			{
				name: 'move_page',
				type: 'input',
				label: 'صفحه‌ای که باید به اینجا منتقل شود:'
			},
			{
				name: 'move_reason',
				type: 'input',
				label: 'دلیل:',
				size: 60
			}
		],
		hideWhenMultiple: true
	},
	{
		label: 'ع۶: نبح',
		value: 'xfd',
		tooltip: 'نظرخواهی برای حذف با «حذف شود» جمع‌بندی شده ولی صفحه حذف نشده‌است.',
		subgroup: {
			name: 'xfd_fullvotepage',
			type: 'input',
			label: 'صفحه‌ای که گفتگو پیرامون حذف در آن انجام شده:',
			tooltip: 'باید با «ویکی‌پدیا:» آغاز شود',
			size: 40
		},
		hideWhenMultiple: true
	},
	{
		label: 'ع۶: انتقال از طریق کپی پیست',
		value: 'copypaste',
		tooltip: 'این معیار تنها به انتقال حاصل از کپی‌کردن محتوای یک صفحهٔ دیگر، که نیازمند حذف دائمی جهت بازکردن فضا برای انتقال صحیح آن صفحه است، اعمال می‌شود.',
		subgroup: {
			name: 'copypaste_sourcepage',
			type: 'input',
			label: 'صفحهٔ اولیه که محتوایش به اینجا کپی شده:'
		},
		hideWhenMultiple: true
	},
	{
		label: 'ع۶: تمیزکاری روزانه و نگهداری',
		value: 'g6',
		tooltip: 'سایر وظایف نگهداری روزانه',
		subgroup: {
			name: 'g6_rationale',
			type: 'input',
			label: 'معیار:',
			size: 60
		}
	},
	{
		label: 'ع۷: ایجادکنندهٔ صفحه درخواست حذف داده یا صفحه را خالی کرده است',
		value: 'author',
		tooltip: 'این معیار تنها در صورتی اعمال می‌شود که درخواست با حسن نیت مطرح شده باشد و مشخص باشد که محتوای اصلی صفحه و صفحهٔ بحث وابسته به آن تنها اثر یک نویسنده است. خالی کردن صفحه (پاک کردن تمام نوشته‌ها) توسط نویسندهٔ اصلی را هم می‌توان درخواست حذف تلقی کرد.',
		subgroup: {
			name: 'author_rationale',
			type: 'input',
			label: 'توضیحات اختیاری:',
			tooltip: 'می‌تواند شامل صفحه‌ای باشد که نویسندهٔ صفحه در آن درخواست حذف داده‌است.',
			size: 60
		},
		hideSubgroupWhenSysop: true
	},
	{
		label: 'ع۸: صفحه‌های وابسته به صفحه‌ای حذف‌شده یا ناموجود',
		value: 'g8',
		tooltip: 'مانند صفحه‌های بحثی که مقاله‌شان وجود نداشته باشد، زیرصفحه‌های بدون صفحه مادر، صفحه‌های پروندهٔ فاقد پرونده، تغییرمسیرهایی که هدف معتبری ندارند، تغییرمسیرهای حلقه‌ای یا رده‌های مربوط به الگوهای حذف‌شده یا تغییر هدف یافته. این معیار شامل صفحه‌هایی که برای پروژه مفید هستند، و به‌ویژه نظرخواهی‌های حذفی که جای دیگری فهرست نشده‌اند، صفحه‌های کاربری و صفحه‌های بحث کاربری، بایگانی بحث‌ها، تغییرمسیرهای محتملی که بتوان آن‌ها را به هدف‌های معتبری تغییر داد، و صفحهٔ پرونده یا بحث پرونده مربوط به تصویری که در ویکی‌انبار بارگذاری شده است، نمی‌شود.',
		subgroup: {
			name: 'g8_rationale',
			type: 'input',
			label: 'توضیحات اختیاری:',
			size: 60
		},
		hideSubgroupWhenSysop: true
	},
	{
		label: 'ع۸: زیرصفحه‌های فاقد صفحهٔ مادر',
		value: 'subpage',
		tooltip: 'این معیار شامل صفحه‌هایی که برای پروژه مفید هستند، و به‌ویژه نظرخواهی‌های حذفی که جای دیگری فهرست نشده‌اند، صفحه‌های کاربری و صفحه‌های بحث کاربری، بایگانی بحث‌ها، تغییرمسیرهای محتملی که بتوان آن‌ها را به هدف‌های معتبری تغییر داد، و صفحهٔ پرونده یا بحث پرونده مربوط به تصویری که در ویکی‌انبار بارگذاری شده است، نمی‌شود.',
		hideWhenMultiple: true,
		hideInNamespaces: [ 0, 6, 8 ]  // hide in main, file, and mediawiki-spaces
	},
	{
		label: 'ع۱۰: صفحهٔ حمله',
		value: 'attack',
		tooltip: 'صفحه‌هایی که تنها هدف از ایجادشان حمله به یک شخص یا سازمان یا نظایر آن باشد (مثل ایجاد مقاله‌ای با عنوان فلانی یک احمق است). این معیار همچنین شامل صفحه‌های زندگی‌نامه افراد زنده نیز می‌شود؛ به شرطی که لحنی منفی داشته باشند، منبع کافی نداشته باشند و نسخهٔ بی‌طرفانه‌ای در تاریخچهٔ آن‌ها برای واگردانی موجود نباشد. مدیرانی که چنین صفحه‌هایی را حذف می‌کنند نباید محتوای صفحه را در خلاصهٔ حذف درج کنند!'
	},
	{
		label: 'ع۱۰: زندگی‌نامهٔ کاملاً منفی و بدون منبع افراد زنده',
		value: 'negublp',
		tooltip: 'صفحه‌های زندگی‌نامهٔ افراد زنده که لحنی منفی داشته باشند، منبع کافی نداشته باشند و نسخهٔ بی‌طرفانه‌ای در تاریخچهٔ آن‌ها برای واگردانی موجود نباشد.',
		hideWhenMultiple: true
	},
	{
		label: 'ع۱۱: تبلیغات آشکار یا آگهی',
		value: 'spam',
		tooltip: 'صفحه‌هایی که منحصراً به تبلیغ برای یک شرکت، محصول، گروه، خدمات، یا شخص می‌پردازند و برای دانشنامه‌ای شدن، نیازمند بازنویسی عمده هستند. دقت کنید که اگر یک مقاله موضوعش را از دیدگاهی بی‌طرف توصیف کند، برای این معیار مناسب نیست؛ مقاله‌ای که شامل تبلیغات آشکار است، باید دربردارندهٔ محتوای نامناسب نیز باشد'
	},
	{
		label: 'ع۱۲: نقض آشکار حق تکثیر',
		value: 'copyvio',
		tooltip: 'هر یک از این موارد: (۱) نقض حق تکثیر در یک نوبت و توسط یک نفر انجام شده باشد (پس توجه داشته باشید در مواردی که صفحه‌ای در ویکی‌پدیا و با مشارکت ویرایشگران ایجاد می‌شود، بعداً توسط یک وبسایت دیگر کپی می‌شود، در صورتی که به ٱن وبسایت برخورد کردید، اشتباهاً تصور نکنید که مقاله از آن‌جا به ویکی‌پدیا کپی شده‌است؛ (۲) نسخهٔ دیگری در تاریخچهٔ مقاله نباشد که ناقض حق تکثیر نبوده ارزش نگهداری داشته باشد؛ (۳) کسی که محتوا (اعم از متن یا تصویر) را بارگذاری می‌کند، شواهدی از مجاز بودن تکثیر محتوا ارائه نکند، یا ادعای وی مشکوک به نظر برسد؛ یا (۴) متن مقاله از جایی کپی شده باشد که اجازه نامهٔ انتشار آن با ویکی‌پدیا سازگاری نداشته باشد',
		subgroup: [
			{
				name: 'copyvio_url',
				type: 'input',
				label: 'نشانی (در صورت وجود):',
				tooltip: 'اگر محتوا از یک منبع برخط کپی شده‌است، نشانی وبگاه را اینجا قرار دهید و پروتکل‌های «http://» یا «https://» را هم از نشانی حذف نکنید.',
				size: 60
			},
			{
				name: 'copyvio_url2',
				type: 'input',
				label: 'نشانی بیشتر:',
				tooltip: 'اختیاری. باید با «http://» یا «https://» آغاز شود',
				size: 60
			},
			{
				name: 'copyvio_url3',
				type: 'input',
				label: 'نشانی بیشتر:',
				tooltip: 'اختیاری. باید با «http://» یا «https://» آغاز شود',
				size: 60
			}
		]
	},
	{
		label: 'ع۱۳: صفحه‌ای در فضای نام پیش‌نویس یا درخواست مبا در فضای کاربری که برای بیش از ۶ ماه ویرایش نشده است',
		value: 'afc',
		tooltip: 'هرگونه درخواست ردشده یا ارسال‌نشدهٔ مبا در فضای کاربری یا هرگونه صفحهٔ غیر تغییرمسیر در فضای نام پیش‌نویس که در شش ماه گذشته ویرایش نشده‌است. پیش‌نویس‌های خالی در هریک از این فضاهای نام را نیز شامل می‌شود.',
		hideWhenRedirect: true,
		showInNamespaces: [2, 118]  // user, draft namespaces only
	},
	{
		label: 'ع۱۴: صفحهٔ ابهام‌زدایی نالازم',
		value: 'disambig',
		tooltip: 'این معیار به صفحه‌های ابهام‌زدایی اعمال می‌شود که ۱) عنوانشان با «(ابهام‌زدایی)» پایان می‌یابد ولی فقط یک صفحهٔ موجود در ویکی‌پدیا را ابهام‌زدایی می‌کنند؛ یا ۲) بدون توجه به عنوان، هیچ صفحهٔ موجود در ویکی‌پدیا را ابهام‌زدایی نمی‌کنند.  این معیار عمچنین به تغییرمسیرهای یتیم نظیر «فلان  (ابهام‌زدایی)» که صفحهٔ هدف آن‌ها یک صفحهٔ ابهام‌زدایی یا صفحه‌ای مشابه ابهام‌زدایی نیست (مانند مقاله‌های مجموعه نمایه یا فهرست‌ها) نیز اعمال می‌شود.'  
	}
];

Twinkle.speedy.redirectList = [
	{
		label: 'ت۲: تغییرمسیر از فضای نام اصلی به فضای نام دیگری به‌جز فضاهای نام رده:، الگو:، ویکی‌پدیا:،راهنما:، و درگاه:.',
		value: 'rediruser',
		tooltip: 'این معیار شامل میانبرهای شبه فضای نام‌ها (مانند میانبرهایی که با «وپ:» آغاز می‌شوند) نمی‌شود. اگر این تغییرمسیر برجای مانده از یک انتقال است، پیش از حذف تغییرمسیر یک یا دو روز صبر کنید',
		showInNamespaces: [ 0 ]
	},
	{
		label: 'ت۳: تغییرمسیر تازه‌ساز نامحتمل از یک غلط املائی یا نام بی‌مسما',
		value: 'redirtypo',
		tooltip: 'تغییرمسیرها از غلط املایی یا عنوان بی‌مسمای رایج عموماً مفیدند، همان‌طور که تغییرمسیرها از زبانی دیگر نیز گاهی مفیدند'
	},
	{
		label: 'ت۴: تغییرمسیر در فضای نام پرونده که نام آن با نام یک صفحه در ویکی‌انبار یکسان است',
		value: 'redircom',
		tooltip: 'هیچ صفحه‌ای نباید به این تغییرمسیر پیوند داشته باشد (مگر آن که هدف از پیوندها به‌وضوح ارجاع به پرونده یا تغییرمسیر در ویکی‌انبار باشد).',
		showInNamespaces: [ 6 ]
	},
	{
		label: 'ع۶: تغییرمسیر به صفحهٔ ابهام‌زدایی قرار گرفته در جای اشتباه',
		value: 'movedab',
		tooltip: 'این معیار تنها بر تغییرمسیرها به صفحه‌های ابهام‌زدایی که عنوانشان با (ابهام‌زدایی) پایان می‌یابد و کاربرد اصلی برای آن موجود نیست، اعمال می‌شود.',
		hideWhenMultiple: true
	},
	{
		label: 'ع۸: تغییرمسیر به صفحهٔ حذف‌شده یا ناموجود',
		value: 'redirnone',
		tooltip: 'این معیار شامل صفحه‌هایی که برای پروژه مفید هستند، و به‌ویژه نظرخواهی‌های حذفی که جای دیگری فهرست نشده‌اند، صفحه‌های کاربری و صفحه‌های بحث کاربری، بایگانی بحث‌ها، تغییرمسیرهای محتملی که بتوان آن‌ها را به هدف‌های معتبری تغییر داد، و صفحهٔ پرونده یا بحث پرونده مربوط به تصویری که در ویکی‌انبار بارگذاری شده است، نمی‌شود.',
		hideWhenMultiple: true
	}
];

Twinkle.speedy.normalizeHash = {
	reason: 'حذف سریع',
	nonsense: 'ع۱',
	test: 'ع۲',
	vandalism: 'ع۳',
	hoax: 'ع۳',
	repost: 'ع۴',
	banned: 'ع۵',
	move: 'ع۶',
	xfd: 'ع۶',
	movedab: 'ع۶',
	copypaste: 'ع۶',
	g6: 'ع۶',
	author: 'ع۷',
	g8: 'ع۸',
	talk: 'ع۸',
	subpage: 'ع۸',
	redirnone: 'ع۸',
	templatecat: 'ع۸',
	imagepage: 'ع۸',
	attack: 'ع۱۰',
	negublp: 'ع۱۰',
	spam: 'ع۱۱',
	spamuser: 'ع۱۱',
	copyvio: 'ع۱۲',
	afc: 'ع۱۳',
	disambig: 'ع۱۴',
	nocontext: 'م۱',
	foreign: 'م۲',
	nocontent: 'م۳',
	transwiki: 'م۵',
	a7: 'م۷',
	person: 'م۷',
	corp: 'م۷',
	web: 'م۷',
	band: 'م۷',
	club: 'م۷',
	animal: 'م۷',
	event: 'م۷',
	a9: 'م۹',
	a10: 'م۱۰',
	madeup: 'م۱۱',
	rediruser: 'ت۲',
	redirtypo: 'ت۳',
	redircom: 'ت۴',
	redundantimage: 'پ۱',
	noimage: 'پ۲',
	fpcfail: 'پ۲',
	noncom: 'پ۳',
	unksource: 'پ۴',
	unfree: 'پ۵',
	f5: 'پ۵',
	norat: 'پ۶',
	badfairuse: 'پ۷',
	commons: 'پ۸',
	imgcopyvio: 'پ۹',
	badfiletype: 'پ۱۰',
	nopermission: 'پ۱۱',
	catempty: 'ر۱',
	userreq: 'ک۱',
	nouser: 'ک۲',
	notwebhost: 'ک۵',
	p1: 'د۱',
	emptyportal: 'د۲',
	// local template criteria
	policy: 'ال۲',
	duplicatetemplate: 'ال۳'
};

Twinkle.speedy.callbacks = {
	getTemplateCodeAndParams: function(params) {
		var code, parameters, i;
		if (params.normalizeds.length > 1) {
			code = '{{حس-چندگانه';
			params.utparams = {};
			$.each(params.normalizeds, function(index, norm) {
				code += '|' + norm.toUpperCase();
				parameters = params.templateParams[index] || [];
				for (var i in parameters) {
					if (typeof parameters[i] === 'string' && !parseInt(i, 10)) {  // skip numeric parameters - {{db-multiple}} doesn't understand them
						code += '|' + i + '=' + parameters[i];
					}
				}
				$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters));
			});
			code += '}}';
		} else {
			parameters = params.templateParams[0] || [];
			code = '{{db-' + params.values[0];
			for (i in parameters) {
				if (typeof parameters[i] === 'string') {
					code += '|' + i + '=' + parameters[i];
				}
			}
			if (params.usertalk) {
				code += '|help=off';
			}
			code += '}}';
			params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
		}

		return [code, params.utparams];
	},

	parseWikitext: function(wikitext, callback) {
		var query = {
			action: 'parse',
			prop: 'text',
			pst: 'true',
			text: wikitext,
			contentmodel: 'wikitext',
			title: mw.config.get('wgPageName'),
			disablelimitreport: true,
			format: 'json'
		};

		var statusIndicator = new Morebits.status('در حال ساخت خلاصهٔ حذف');
		var api = new Morebits.wiki.api('در حال تجزیهٔ برچسب حذف سریع', query, function(apiobj) {
			var reason = decodeURIComponent($(apiobj.getResponse().parse.text).find('#delete-reason').text()).replace(/\+/g, ' ');
			if (!reason) {
				statusIndicator.warn('ناتوان در تولید خلاصه از الگوی حذف');
			} else {
				statusIndicator.info('complete');
			}
			callback(reason);
		}, statusIndicator);
		api.post();
	},

	noteToCreator: function(pageobj) {
		var params = pageobj.getCallbackParameters();
		var initialContrib = pageobj.getCreator();

		// disallow notifying yourself
		if (initialContrib === mw.config.get('wgUserName')) {
			Morebits.status.warn('شما (' + initialContrib + ') این صفحه را ایجاد کرده‌اید؛ در حال چشم‌پوشی از آگاه‌سازی کاربر');
			initialContrib = null;

		// don't notify users when their user talk page is nominated/deleted
		} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
			Morebits.status.warn('آگاه‌سازی مشارکت‌کنندهٔ اولیه: این کاربر صفحهٔ بحث کاربری خود را ایجاد کرده است؛ در حال چشم‌پوشی از آگاه‌سازی');
			initialContrib = null;

		// quick hack to prevent excessive unwanted notifications, per request. Should actually be configurable on recipient page...
		} else if ((initialContrib === 'Dexbot' || initialContrib === 'HujiBot' || initialContrib === 'پیام به کاربر جدید') && params.normalizeds[0] === 'پ۲') {
			Morebits.status.warn('آگاه‌سازی مشارکت‌کننده اولیه: این صفحه به‌صورت رویه‌ای توسط یک ربات ایجاد شده است؛ در حال چشم‌پوشی از آگاه‌سازی');
			initialContrib = null;

		// Check for already existing tags
		} else if (Twinkle.speedy.hasCSD && params.warnUser && !confirm('صفحه از پیش برچسب مرتبط با حذف را در خود دارد و بنابراین احتمالاً ایجادکننده قبلاً آگاه‌سازی شده‌است.  آیا می‌خواهید کاربر را از این حذف نیز باخبر کنید؟')) {
			Morebits.status.info('آگاه‌سازی مشارکت‌کنندهٔ اولیه', 'توسط کاربر لغو شد؛ در حال صرف نظر از آگاه‌سازی.');
			initialContrib = null;
		}

		if (initialContrib) {
			var usertalkpage = new Morebits.wiki.page('بحث کاربر:' + initialContrib, 'آگاه‌سازی مشارکت‌کنندهٔ اولیه (' + initialContrib + ')'),
				notifytext, i, editsummary;

			// special cases: "db" and "db-multiple"
			if (params.normalizeds.length > 1) {
				notifytext = '\n{{جا:حس-' + (params.warnUser ? 'حذف‌شده' : 'آگاه‌سازی') + '-چندگانه|1=' + Morebits.pageNameNorm;
				var count = 2;
				$.each(params.normalizeds, function(index, norm) {
					notifytext += '|' + count++ + '=' + norm.toUpperCase();
				});
			} else if (params.normalizeds[0] === 'حذف سریع') {
				notifytext = '\n{{جا:حس-دلیل-' + (params.warnUser ? 'حذف‌شده' : 'آگاه‌سازی') + '|1=' + Morebits.pageNameNorm;
			} else {
				notifytext = '\n{{جا:حس-محس-' + (params.warnUser ? 'حذف‌شده' : 'آگاه‌سازی') + '-سفارشی|1=';
				if (params.values[0] === 'copypaste') {
					notifytext += params.templateParams[0].sourcepage;
				} else {
					notifytext += Morebits.pageNameNorm;
				}
				notifytext += '|2=' + Twinkle.speedy.localKeys[params.values[0]];
			}

			for (i in params.utparams) {
				if (typeof params.utparams[i] === 'string') {
					notifytext += '|' + i + '=' + params.utparams[i];
				}
			}
			notifytext += (params.welcomeuser ? '' : '|nowelcome=yes') + '}} ~~~~';

			editsummary = 'آگاه‌سازی: ' + (params.warnUser ? '' : 'نامزدی') + ' حذف سریع';
			if (params.normalizeds.indexOf('ع۱۰') === -1) {  // no article name in summary for G10 taggings
				editsummary += ' [[:' + Morebits.pageNameNorm + ']].';
			} else {
				editsummary += ' یک صفحهٔ حمله.';
			}

			usertalkpage.setAppendText(notifytext);
			usertalkpage.setEditSummary(editsummary);
			usertalkpage.setChangeTags(Twinkle.changeTags);
			usertalkpage.setCreateOption('recreate');
			usertalkpage.setWatchlist(Twinkle.getPref('watchSpeedyUser'));
			usertalkpage.setFollowRedirect(true, false);
			usertalkpage.append(function onNotifySuccess() {
				// add this nomination to the user's userspace log, if the user has enabled it
				if (params.lognomination) {
					Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
				}
			}, function onNotifyError() {
				// if user could not be notified, log nomination without mentioning that notification was sent
				if (params.lognomination) {
					Twinkle.speedy.callbacks.user.addToLog(params, null);
				}
			});
		} else if (params.lognomination) {
			// log nomination even if the user notification wasn't sent
			Twinkle.speedy.callbacks.user.addToLog(params, null);
		}
	},

	sysop: {
		main: function(params) {
			var reason;
			if (!params.normalizeds.length && params.normalizeds[0] === 'حذف سریع') {
				reason = prompt('خلاصهٔ حذف را که در سیاههٔ حذف درج خواهد شد، برای استفاده وارد کنید:', '');
				Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
			} else {
				var code = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params)[0];
				Twinkle.speedy.callbacks.parseWikitext(code, function(reason) {
					if (params.promptForSummary) {
						reason = prompt('خلاصهٔ حذف را برای استفاده وارد کنید یا برای تأیید خلاصهٔ تولیدشده به‌صورت خودکار، روی OK کلیک کنید.', reason);
					}
					Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
				});
			}
		},
		deletePage: function(reason, params) {
			var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'), 'در حال حذف صفحه');

			if (reason === null) {
				return Morebits.status.error('در حال درخواست برای دلیل', 'توسط کاربر لغو شد');
			} else if (!reason || !reason.replace(/^\s*/, '').replace(/\s*$/, '')) {
				return Morebits.status.error('در حال درخواست برای دلیل', "شما دلیلی ارائه ندادید.  نمی‌دانم... چرا مدیران شیطنت می‌کنند... من تسلیمم...");
			}

			var deleteMain = function(callback) {
				thispage.setEditSummary(reason);
				thispage.setChangeTags(Twinkle.changeTags);
				thispage.setWatchlist(params.watch);
				thispage.deletePage(function() {
					thispage.getStatusElement().info('done');
					typeof callback === 'function' && callback();
					Twinkle.speedy.callbacks.sysop.deleteTalk(params);
				});
			};

			// look up initial contributor. If prompting user for deletion reason, just display a link.
			// Otherwise open the talk page directly
			if (params.warnUser) {
				thispage.setCallbackParameters(params);
				thispage.lookupCreation(function(pageobj) {
					deleteMain(function() {
						Twinkle.speedy.callbacks.noteToCreator(pageobj);
					});
				});
			} else {
				deleteMain();
			}
		},
		deleteTalk: function(params) {
			// delete talk page
			if (params.deleteTalkPage &&
					params.normalized !== 'پ۸' &&
					!document.getElementById('ca-talk').classList.contains('new')) {
				var talkpage = new Morebits.wiki.page(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle'), 'در حال حذف صفحهٔ بحث');
				talkpage.setEditSummary('[[وپ:محس#ع۸|ع۸]]: بحث صفحهٔ حذف‌شدهٔ «' + Morebits.pageNameNorm + '»');
				talkpage.setChangeTags(Twinkle.changeTags);
				talkpage.deletePage();
				// this is ugly, but because of the architecture of wiki.api, it is needed
				// (otherwise success/failure messages for the previous action would be suppressed)
				window.setTimeout(function() {
					Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
				}, 1800);
			} else {
				Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
			}
		},
		deleteRedirects: function(params) {
			// delete redirects
			if (params.deleteRedirects) {
				var query = {
					action: 'query',
					titles: mw.config.get('wgPageName'),
					prop: 'redirects',
					rdlimit: 'max', // 500 is max for normal users, 5000 for bots and sysops
					format: 'json'
				};
				var wikipedia_api = new Morebits.wiki.api('در حال دریافت فهرست تغییرمسیرها...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
					new Morebits.status('در حال حذف تغییرمسیرها'));
				wikipedia_api.params = params;
				wikipedia_api.post();
			}

			// promote Unlink tool
			var $link, $bigtext;
			if (mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'پ۸') {
				$link = $('<a/>', {
					href: '#',
					text: 'برای رفتن به ابزار پیوندزدایی اینجا کلیک کنید',
					css: { fontSize: '130%', fontWeight: 'bold' },
					click: function() {
						Morebits.wiki.actionCompleted.redirect = null;
						Twinkle.speedy.dialog.close();
						Twinkle.unlink.callback('در حال حذف کاربردها و/یا پیوندها به پروندهٔ حذف‌شدهٔ ' + Morebits.pageNameNorm);
					}
				});
				$bigtext = $('<span/>', {
					text: 'برای زدودن پیوندهای ورودی و حذف کاربردهای پرونده',
					css: { fontSize: '130%', fontWeight: 'bold' }
				});
				Morebits.status.info($bigtext[0], $link[0]);
			} else if (params.normalized !== 'پ۸') {
				$link = $('<a/>', {
					href: '#',
					text: 'برای رفتن به ابزار پیوندزدایی اینجا کلیک کنید',
					css: { fontSize: '130%', fontWeight: 'bold' },
					click: function() {
						Morebits.wiki.actionCompleted.redirect = null;
						Twinkle.speedy.dialog.close();
						Twinkle.unlink.callback('حذف پیوندها به صفحهٔ حذف‌شدهٔ ' + Morebits.pageNameNorm);
					}
				});
				$bigtext = $('<span/>', {
					text: 'برای زدودن پیوندهای ورودی',
					css: { fontSize: '130%', fontWeight: 'bold' }
				});
				Morebits.status.info($bigtext[0], $link[0]);
			}
		},
		deleteRedirectsMain: function(apiobj) {
			var response = apiobj.getResponse();
			var snapshot = response.query.pages[0].redirects || [];
			var total = snapshot.length;
			var statusIndicator = apiobj.statelem;

			if (!total) {
				statusIndicator.status('تغییرمسیری یافت نشد');
				return;
			}

			statusIndicator.status('0%');

			var current = 0;
			var onsuccess = function(apiobjInner) {
				var now = mw.language.convertNumber(parseInt(100 * ++current / total, 10)) + '٪';
				statusIndicator.update(now);
				apiobjInner.statelem.unlink();
				if (current >= total) {
					statusIndicator.info(now + ' (کامل شد)');
					Morebits.wiki.removeCheckpoint();
				}
			};

			Morebits.wiki.addCheckpoint();

			snapshot.forEach(function(value) {
				var title = value.title;
				var page = new Morebits.wiki.page(title, 'در حال حذف تغییرمسیر «' + title + '»');
				page.setEditSummary('[[وپ:محس#ع۸|ع۸]]: تغییرمسیر به صفحهٔ حذف‌شدهٔ «' + Morebits.pageNameNorm + '»');
				page.setChangeTags(Twinkle.changeTags);
				page.deletePage(onsuccess);
			});
		}
	},

	user: {
		main: function(pageobj) {
			var statelem = pageobj.getStatusElement();

			if (!pageobj.exists()) {
				statelem.error("به‌نظر می‌رسد که صفحه موجود نیست؛ ممکن است که پیش از این حذف شده باشد");
				return;
			}

			var params = pageobj.getCallbackParameters();

			// given the params, builds the template and also adds the user talk page parameters to the params that were passed in
			// returns => [<string> wikitext, <object> utparams]
			var buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params),
				code = buildData[0];
			params.utparams = buildData[1];

			// Set the correct value for |ts= parameter in {{db-g13}}
			if (params.normalizeds.indexOf('ع۱۳') !== -1) {
				code = code.replace('$TIMESTAMP', pageobj.getLastEditTime());
			}

			// Tag if possible, post on talk if not
			if (pageobj.canEdit() && ['wikitext', 'Scribunto', 'javascript', 'css', 'sanitized-css'].indexOf(pageobj.getContentModel()) !== -1) {
				var text = pageobj.getPageText();

				statelem.status('در حال بررسی برچسب‌های موجود در صفحه...');

				// check for existing deletion tags
				var tag = /(?:\{\{\s*(حذف سریع|حذف|حس-.*?|db-.*?)(?:\s*\||\s*\}\}))/.exec(text);
				// This won't make use of the db-multiple template but it probably should
				if (tag && !confirm('الگوی حذف سریع {{' + tag[1] + '}} از پیش در صفحه موجود است.  آیا می‌خواهید الگوی حذف سریع دیگری به صفحه اضافه کنید؟')) {
					return;
				}

				var xfd = /\{\{((?:article for deletion|نظرخواهی برای حذف|proposed deletion|حذف زمان‌دار|حذف زماندار|prod blp|template for discussion)\/تاریخ‌دار|[cfm]fd\b)/i.exec(text) || /#invoke:(RfD)/.exec(text);
				if (xfd && !confirm('الگوی حذف {{' + xfd[1] + '}} در صفحه یافت شد. آیا همچنان می‌خواهید الگوی حذف سریع را به صفحه اضافه کنید؟')) {
					return;
				}

				// curate/patrol the page
				if (Twinkle.getPref('markSpeedyPagesAsPatrolled')) {
					pageobj.triage();
				}

				// Wrap SD template in noinclude tags if we are in template space.
				// Won't work with userboxes in userspace, or any other transcluded page outside template space
				if (mw.config.get('wgNamespaceNumber') === 10) {  // Template:
					code = '<noinclude>' + code + '</noinclude>';
				}

				// Remove tags that become superfluous with this action
				text = text.replace(/\{\{\s*([Uu]serspace draft|پیش‌نویس صفحه کاربری)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, '');
				if (mw.config.get('wgNamespaceNumber') === 6) {
					// remove "move to Commons" tag - deletion-tagged files cannot be moved to Commons
					text = text.replace(/\{\{نامزد ?(mtc|(copy |move |انتقال به |)?to ?(commons|انبار|ویکی‌انبار)|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, '');
				}

				if (params.requestsalt) {
					if (params.normalizeds.indexOf('ع۱۰') === -1) {
						code += '\n{{نمک}}';
					} else {
						code = '{{نمک}}\n' + code;
					}
				}

				if (mw.config.get('wgPageContentModel') === 'Scribunto') {
					// Scribunto isn't parsed like wikitext, so CSD templates on modules need special handling to work
					var equals = '';
					while (code.indexOf(']' + equals + ']') !== -1) {
						equals += '=';
					}
					code = "require('Module:Module wikitext')._addText([" + equals + '[' + code + ']' + equals + ']);';
				} else if (['javascript', 'css', 'sanitized-css'].indexOf(mw.config.get('wgPageContentModel')) !== -1) {
					// Likewise for JS/CSS pages
					code = '/* ' + code + ' */';
				}

				// Generate edit summary for edit
				var editsummary;
				if (params.normalizeds.length > 1) {
					editsummary = 'درخواست حذف سریع (';
					$.each(params.normalizeds, function(index, norm) {
						editsummary += '[[وپ:محس#' + norm.toUpperCase() + '|محس ' + norm.toUpperCase() + ']], ';
					});
					editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma
					editsummary += ').';
				} else if (params.normalizeds[0] === 'حذف سریع') {
					editsummary = 'درخواست [[وپ:محس|حذف سریع]] با معیار «' + params.templateParams[0]['1'] + '».';
				} else {
					editsummary = 'درخواست حذف سریع ([[وپ:محس#' + params.normalizeds[0].toUpperCase() + '|محس ' + params.normalizeds[0].toUpperCase() + ']]).';
				}

				// Blank attack pages
				if (params.normalizeds.indexOf('ع۱۰') !== -1) {
					text = code;
				} else {
					// Insert tag after short description or any hatnotes
					var wikipage = new Morebits.wikitext.page(text);
					text = wikipage.insertAfterTemplates(code + '\n', Twinkle.hatnoteRegex).getText();
				}


				pageobj.setPageText(text);
				pageobj.setEditSummary(editsummary);
				pageobj.setWatchlist(params.watch);
				pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
			} else { // Attempt to place on talk page
				var talkName = new mw.Title(pageobj.getPageName()).getTalkPage().toText();
				if (talkName !== pageobj.getPageName()) {
					if (params.requestsalt) {
						code += '\n{{نمک}}';
					}

					pageobj.getStatusElement().warn('ناتوان در ویرایش صفحه، در حال قرار دادن برچسب در صفحهٔ بحث');

					var talk_page = new Morebits.wiki.page(talkName, 'قرار دادن خودکار برچسب در صفحهٔ بحث');
					talk_page.setNewSectionTitle(pageobj.getPageName() + ' بر پایهٔ درخواست، نامزد حذف سریع شده است');
					talk_page.setNewSectionText(code + '\n\nمن قادر به برچسب زدن به صفحهٔ ' + pageobj.getPageName() + ' نبودم؛ لطفاً آن را حذف کنید. ~~~~');
					talk_page.setCreateOption('recreate');
					talk_page.setFollowRedirect(true);
					talk_page.setWatchlist(params.watch);
					talk_page.setChangeTags(Twinkle.changeTags);
					talk_page.setCallbackParameters(params);
					talk_page.newSection(Twinkle.speedy.callbacks.user.tagComplete);
				} else {
					pageobj.getStatusElement().error('صفحه محافظت شده و جایی برای قرار دادن درخواست ویرایش وجود ندارد؛ در حال صرف نظر');
				}
			}
		},

		tagComplete: function(pageobj) {
			var params = pageobj.getCallbackParameters();

			// Notification to first contributor, will also log nomination to the user's userspace log
			if (params.usertalk) {
				var thispage = new Morebits.wiki.page(Morebits.pageNameNorm);
				thispage.setCallbackParameters(params);
				thispage.lookupCreation(Twinkle.speedy.callbacks.noteToCreator);
			// or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name
			} else if (params.lognomination) {
				Twinkle.speedy.callbacks.user.addToLog(params, null);
			}
		},

		addToLog: function(params, initialContrib) {
			var usl = new Morebits.userspaceLogger(Twinkle.getPref('speedyLogPageName'));
			
			usl.initialText =
				"این صفحه شامل سیاهه‌ای از تمام نامزدی‌های [[وپ:محس|حذف سریع]] انجام‌شده توسط این کاربر با استفاده از پودمان حذف سریع [[وپ:توینکل|توینکل]] است.\n\n" +
				'اگر دیگر مایل به نگهداری این سیاهه نیستید، می‌توانید از طریق [[ویکی‌پدیا:توینکل/ترجیحات|پنل ترجیحات]] آن را غیرفعال کنید و ' +
				'این صفحه را تحت معیار [[وپ:محس#ک۱|محس ک۱]] نامزد حذف کنید.' +
				((Morebits.userIsSysop || Morebits.userIsEliminator) ? '\n\nاین سیاهه، حذف‌های سریع کاملی که با توینکل انجام شده‌اند را رهگیری نمی‌کند.' : '');

			var formatParamLog = function(normalize, csdparam, input) {
				if ((normalize === 'ع۴' && csdparam === 'xfd') ||
					(normalize === 'ع۶' && csdparam === 'page') ||
					(normalize === 'ع۶' && csdparam === 'fullvotepage') ||
					(normalize === 'ع۶' && csdparam === 'sourcepage') ||
					(normalize === 'م۲' && csdparam === 'source') ||
					(normalize === 'م۱۰' && csdparam === 'article') ||
					(normalize === 'پ۱' && csdparam === 'filename')) {
					input = '[[:' + input + ']]';
				} else if (normalize === 'ع۵' && csdparam === 'user') {
					input = '[[:کاربر:' + input + ']]';
				} else if (normalize === 'ع۱۲' && csdparam.lastIndexOf('url', 0) === 0 && input.lastIndexOf('http', 0) === 0) {
					input = '[' + input + ' ' + input + ']';
				} else if (normalize === 'پ۸' && csdparam === 'filename') {
					input = '[[commons:' + input + '|' + input + ']] (انبار)';
				} else if (normalize === 'پ۱' && csdparam === 'criterion') {
					input = '[[وپ:محس#' + input + ']]';
				}
				return ' {' + Twinkle.speedy.localKeys.csdparam + ' ' + normalize + ': ' + input + '}'; // Twinkle.speedy.localKeys added to localize csdparam
			};

			var extraInfo = '';

			// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
			var fileLogLink = mw.config.get('wgNamespaceNumber') === 6 ? ' ([{{نشانی‌کامل:ویژه:سیاهه‌ها|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} سیاهه])' : '';

			var editsummary = 'ثبت سیاههٔ نامزدی حذف سریع';
			var appendText = '# [[:' + Morebits.pageNameNorm;

			if (params.normalizeds.indexOf('ع۱۰') === -1) {  // no article name in log for G10 taggings
				appendText += ']]' + fileLogLink + ': ';
				editsummary += ' برای [[:' + Morebits.pageNameNorm + ']].';
			} else {
				appendText += '|این]] صفحهٔ حمله' + fileLogLink + ': ';
				editsummary += ' برای یک صفحهٔ حمله.';
			}
			if (params.normalizeds.length > 1) {
				appendText += 'با چندین معیار (';
				$.each(params.normalizeds, function(index, norm) {
					appendText += '[[وپ:محس#' + norm.toUpperCase() + '|' + norm.toUpperCase() + ']]، ';
				});
				appendText = appendText.substr(0, appendText.length - 2);  // remove trailing comma
				appendText += ')';
			} else if (params.normalizeds[0] === 'حذف سریع') {
				appendText += '{{الگو|حس-دلیل}}';
			} else {
				appendText += '[[وپ:محس#' + params.normalizeds[0].toUpperCase() + '|محس ' + params.normalizeds[0].toUpperCase() + ']] ({{الگو|حس-' + Twinkle.speedy.localKeys[params.values[0]] + '}})';
			}

			// If params is "empty" it will still be full of empty arrays, but ask anyway
			if (params.templateParams) {
				// Treat custom rationale individually
				if (params.normalizeds[0] && params.normalizeds[0] === 'حذف سریع') {
					extraInfo += formatParamLog('سفارشی', 'معیار', params.templateParams[0]['1']);
				} else {
					params.templateParams.forEach(function(item, index) {
						var keys = Object.keys(item);
						if (keys[0] !== undefined && keys[0].length > 0) {
							// Second loop required since some items (G12, F9) may have multiple keys
							keys.forEach(function(key, keyIndex) {
								if (keys[keyIndex] === 'blanked' || keys[keyIndex] === 'ts') {
									return true; // Not worth logging
								}
								extraInfo += formatParamLog(params.normalizeds[index].toUpperCase(), Twinkle.speedy.localKeys[keys[keyIndex]] ? Twinkle.speedy.localKeys[keys[keyIndex]] : keys[keyIndex], item[key]);
							});
						}
					});
				}
			}

			if (params.requestsalt) {
				appendText += '؛ درخواست حفاظت در برابر ایجاد داده شد ([[وپ:نمک|نمک‌سود کردن]])';
			}
			if (extraInfo) {
				appendText += '؛ اطلاعات اضافی:' + extraInfo;
			}
			if (initialContrib) {
				appendText += ' {{userv|1=' + initialContrib + '}} آگاه شد';
			}
			appendText += ' — ~~~~~\n';

			usl.changeTags = Twinkle.changeTags;
			usl.log(appendText, editsummary);
		}
	}
};

// validate subgroups in the form passed into the speedy deletion tag
Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) {
	var parameters = [];

	$.each(values, function(index, value) {
		var currentParams = [];
		switch (value) {
			case 'reason':
				if (form['csd.reason_1']) {
					var dbrationale = form['csd.reason_1'].value;
					if (!dbrationale || !dbrationale.trim()) {
						alert('دلیل سفارشی:  لطفاً یک دلیل وارد کنید.');
						parameters = null;
						return false;
					}
					currentParams['1'] = dbrationale;
				}
				break;

			case 'userreq':  // U1
				if (form['csd.userreq_rationale']) {
					var u1rationale = form['csd.userreq_rationale'].value;
					if (mw.config.get('wgNamespaceNumber') === 3 && !(/\//).test(mw.config.get('wgTitle')) &&
							(!u1rationale || !u1rationale.trim())) {
						alert('محس ک۱:  لطفاً هنگام نامزد کردن صفحه‌های بحث کاربری یک دلیل ارائه کنید.');
						parameters = null;
						return false;
					}
					currentParams.rationale = u1rationale;
				}
				break;

			case 'repost':  // G4
				if (form['csd.repost_xfd']) {
					var deldisc = form['csd.repost_xfd'].value;
					if (deldisc) {
						if (!new RegExp('^:?' + Morebits.namespaceRegex(4) + ':', 'i').test(deldisc)) {
							alert('محس ع۴:  نام صفحهٔ نظرخواهی برای حذف در صورت ارائه باید با «ویکی‌پدیا:» آغاز شود.');
							parameters = null;
							return false;
						}
						currentParams.xfd = deldisc;
					}
				}
				break;

			case 'banned':  // G5
				if (form['csd.banned_user'] && form['csd.banned_user'].value) {
					currentParams.user = form['csd.banned_user'].value.replace(/^\s*کاربر:/i, '');
				}
				break;

			case 'move':  // G6
				if (form['csd.move_page'] && form['csd.move_reason']) {
					var movepage = form['csd.move_page'].value,
						movereason = form['csd.move_reason'].value;
					if (!movepage || !movepage.trim()) {
						alert('محس ع۶ (انتقال):  لطفاً نام صفحه‌ای که باید به اینجا منتقل شود را وارد کنید.');
						parameters = null;
						return false;
					}
					if (!movereason || !movereason.trim()) {
						alert('محس ع۶ (انتقال):  لطفاً دلیل انتقال را مشخص کنید.');
						parameters = null;
						return false;
					}
					currentParams.page = movepage;
					currentParams.reason = movereason;
				}
				break;

			case 'xfd':  // G6
				if (form['csd.xfd_fullvotepage']) {
					var xfd = form['csd.xfd_fullvotepage'].value;
					if (xfd) {
						if (!new RegExp('^:?' + Morebits.namespaceRegex(4) + ':', 'i').test(xfd)) {
							alert('محس ع۶ (نبح):  نام صفحهٔ نظرخواهی برای حذف در صورت ارائه باید با «ویکی‌پدیا:» آغاز شود.');
							parameters = null;
							return false;
						}
						currentParams.fullvotepage = xfd;
					}
				}
				break;

			case 'copypaste':  // G6
				if (form['csd.copypaste_sourcepage']) {
					var copypaste = form['csd.copypaste_sourcepage'].value;
					if (!copypaste || !copypaste.trim()) {
						alert('محس ع۶ (کپی):  لطفاً نام صفحهٔ مبدأ را وارد کنید.');
						parameters = null;
						return false;
					}
					currentParams.sourcepage = copypaste;
				}
				break;

			case 'g6':  // G6
				if (form['csd.g6_rationale'] && form['csd.g6_rationale'].value) {
					currentParams.rationale = form['csd.g6_rationale'].value;
				}
				break;

			case 'author':  // G7
				if (form['csd.author_rationale'] && form['csd.author_rationale'].value) {
					currentParams.rationale = form['csd.author_rationale'].value;
				}
				break;

			case 'g8':  // G8
				if (form['csd.g8_rationale'] && form['csd.g8_rationale'].value) {
					currentParams.rationale = form['csd.g8_rationale'].value;
				}
				break;

			case 'templatecat':  // G8
				if (form['csd.templatecat_rationale'] && form['csd.templatecat_rationale'].value) {
					currentParams.rationale = form['csd.templatecat_rationale'].value;
				}
				break;

			case 'attack':  // G10
				currentParams.blanked = 'yes';
				// it is actually blanked elsewhere in code, but setting the flag here
				break;

			case 'copyvio':  // G12
				if (form['csd.copyvio_url'] && form['csd.copyvio_url'].value) {
					currentParams.url = form['csd.copyvio_url'].value;
				}
				if (form['csd.copyvio_url2'] && form['csd.copyvio_url2'].value) {
					currentParams.url2 = form['csd.copyvio_url2'].value;
				}
				if (form['csd.copyvio_url3'] && form['csd.copyvio_url3'].value) {
					currentParams.url3 = form['csd.copyvio_url3'].value;
				}
				break;

			case 'afc':  // G13
				currentParams.ts = '$TIMESTAMP'; // to be replaced by the last revision timestamp when page is saved
				break;

			case 'redundantimage':  // F1
				if (form['csd.redundantimage_filename']) {
					var redimage = form['csd.redundantimage_filename'].value;
					if (!redimage || !redimage.trim()) {
						alert('محس پ۱:  نام نام پروندهٔ دیگر را مشخص کنید.');
						parameters = null;
						return false;
					}
					currentParams.filename = new RegExp('^\\s*' + Morebits.namespaceRegex(6) + ':', 'i').test(redimage) ? redimage : 'پرونده:' + redimage;
				}
				break;

			case 'badfairuse':  // F7
				if (form['csd.badfairuse_rationale'] && form['csd.badfairuse_rationale'].value) {
					currentParams.rationale = form['csd.badfairuse_rationale'].value;
				}
				break;

			case 'commons':  // F8
				if (form['csd.commons_filename']) {
					var filename = form['csd.commons_filename'].value;
					if (filename && filename.trim() && filename !== Morebits.pageNameNorm) {
						currentParams.filename = new RegExp('^\\s*' + Morebits.namespaceRegex(6) + ':', 'i').test(filename) ? filename : 'پرونده:' + filename;
					}
				}
				break;

			case 'imgcopyvio':  // F9
				if (form['csd.imgcopyvio_url'] && form['csd.imgcopyvio_rationale']) {
					var f9url = form['csd.imgcopyvio_url'].value;
					var f9rationale = form['csd.imgcopyvio_rationale'].value;
					if ((!f9url || !f9url.trim()) && (!f9rationale || !f9rationale.trim())) {
						alert('محس پ۹: هنگام نامزد کرد یک پرونده با پ۹، باید یک نشانی وب یا یک دلیل (یا هردو) را وارد کنید.');
						parameters = null;
						return false;
					}
					if (form['csd.imgcopyvio_url'].value) {
						currentParams.url = f9url;
					}
					if (form['csd.imgcopyvio_rationale'].value) {
						currentParams.rationale = f9rationale;
					}
				}
				break;

			case 'foreign':  // A2
				if (form['csd.foreign_source']) {
					var foreignlink = form['csd.foreign_source'].value;
					if (!foreignlink || !foreignlink.trim()) {
						alert('محس م۲:  لطفاً یک پیوند میان‌ویکی به مقاله‌ای که این مقاله از آن کپی شده را وارد کنید.');
						parameters = null;
						return false;
					}
					currentParams.source = foreignlink;
				}
				break;

			case 'transwiki':  // A5
				if (form['csd.transwiki_location'] && form['csd.transwiki_location'].value) {
					currentParams.location = form['csd.transwiki_location'].value;
				}
				break;

			case 'a10':  // A10
				if (form['csd.a10_article']) {
					var duptitle = form['csd.a10_article'].value;
					if (!duptitle || !duptitle.trim()) {
						alert('محس م۱۰:  لطفاً نام مقاله‌ای که در اینجا تکرار شده را مشخص کنید.');
						parameters = null;
						return false;
					}
					currentParams.article = duptitle;
				}
				break;

			case 'p1':  // P1
				if (form['csd.p1_criterion']) {
					var criterion = form['csd.p1_criterion'].value;
					if (!criterion || !criterion.trim()) {
						alert('محس د۱:  لطفاً فقط یک معیار را تعیین کنید.');
						parameters = null;
						return false;
					}
					currentParams.criterion = criterion;
				}
				break;

			default:
				break;
		}
		parameters.push(currentParams);
	});
	return parameters;
};

// Function for processing talk page notification template parameters
// key1/value1: for {{db-criterion-[notice|deleted]}} (via {{db-csd-[notice|deleted]-custom}})
// utparams.param: for {{db-[notice|deleted]-multiple}}
Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) {
	var utparams = [];

	// Special cases
	if (normalized === 'حذف سریع') {
		utparams['2'] = parameters['1'];
	} else if (normalized === 'ع۶') {
		utparams.key1 = 'to';
		utparams.value1 = Morebits.pageNameNorm;
	} else if (normalized === 'ع۱۲') {
		['url', 'url2', 'url3'].forEach(function(item, idx) {
			if (parameters[item]) {
				idx++;
				utparams['key' + idx] = item;
				utparams['value' + idx] = utparams[item] = parameters[item];
			}
		});
	} else {
		// Handle the rest
		var param;
		switch (normalized) {
			case 'ع۴':
				param = 'xfd';
				break;
			case 'م۲':
				param = 'source';
				break;
			case 'م۵':
				param = 'location';
				break;
			case 'م۱۰':
				param = 'article';
				break;
			case 'پ۹':
				param = 'url';
				break;
			case 'د۱':
				param = 'criterion';
				break;
			default:
				break;
		}
		// No harm in providing a usertalk template with the others' parameters
		if (param && parameters[param]) {
			utparams.key1 = param;
			utparams.value1 = utparams[param] = parameters[param];
		}
	}
	return utparams;
};

/**
 * @param {Event} e
 * @returns {Array}
 */
Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) {
	var values = (e.target.form ? e.target.form : e.target).getChecked('csd');
	if (values.length === 0) {
		alert('لطفاً یک معیار را انتخاب کنید!');
		return null;
	}
	return values;
};

Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) {
	var form = e.target.form ? e.target.form : e.target;

	if (e.target.type === 'checkbox' || e.target.type === 'text' ||
			e.target.type === 'select') {
		return;
	}

	var tag_only = form.tag_only;
	if (tag_only && tag_only.checked) {
		Twinkle.speedy.callback.evaluateUser(e);
		return;
	}

	var values = Twinkle.speedy.resolveCsdValues(e);
	if (!values) {
		return;
	}
	var templateParams = Twinkle.speedy.getParameters(form, values);
	if (!templateParams) {
		return;
	}

	var normalizeds = values.map(function(value) {
		return Twinkle.speedy.normalizeHash[value];
	});

	// analyse each criterion to determine whether to watch the page, prompt for summary, or notify the creator
	var watchPage, promptForSummary;
	normalizeds.forEach(function(norm) {
		if (Twinkle.getPref('watchSpeedyPages').indexOf(norm) !== -1) {
			watchPage = Twinkle.getPref('watchSpeedyExpiry');
		}
		if (Twinkle.getPref('promptForSpeedyDeletionSummary').indexOf(norm) !== -1) {
			promptForSummary = true;
		}
	});

	var warnusertalk = form.warnusertalk.checked && normalizeds.some(function (norm, index) {
		return Twinkle.getPref('warnUserOnSpeedyDelete').indexOf(norm) !== -1 &&
			!(norm === 'ع۶' && values[index] !== 'copypaste');
	});

	var welcomeuser = warnusertalk && normalizeds.some(function (norm) {
		return Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1;
	});

	var params = {
		values: values,
		normalizeds: normalizeds,
		watch: watchPage,
		deleteTalkPage: form.talkpage && form.talkpage.checked,
		deleteRedirects: form.redirects.checked,
		warnUser: warnusertalk,
		welcomeuser: welcomeuser,
		promptForSummary: promptForSummary,
		templateParams: templateParams
	};

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

	Twinkle.speedy.callbacks.sysop.main(params);
};

Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
	var form = e.target.form ? e.target.form : e.target;

	if (e.target.type === 'checkbox' || e.target.type === 'text' ||
			e.target.type === 'select') {
		return;
	}

	var values = Twinkle.speedy.resolveCsdValues(e);
	if (!values) {
		return;
	}
	var templateParams = Twinkle.speedy.getParameters(form, values);
	if (!templateParams) {
		return;
	}

	// var multiple = form.multiple.checked;

	var normalizeds = values.map(function(value) {
		return Twinkle.speedy.normalizeHash[value];
	});

	// analyse each criterion to determine whether to watch the page/notify the creator
	var watchPage = normalizeds.some(function(csdCriteria) {
		return Twinkle.getPref('watchSpeedyPages').indexOf(csdCriteria) !== -1;
	}) && Twinkle.getPref('watchSpeedyExpiry');

	var notifyuser = form.notify.checked && normalizeds.some(function(norm, index) {
		return Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').indexOf(norm) !== -1 &&
			!(norm === 'ع۶' && values[index] !== 'copypaste');
	});
	var welcomeuser = notifyuser && normalizeds.some(function(norm) {
		return Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1;
	});
	var csdlog = Twinkle.getPref('logSpeedyNominations') && normalizeds.some(function(norm) {
		return Twinkle.getPref('noLogOnSpeedyNomination').indexOf(norm) === -1;
	});

	var params = {
		values: values,
		normalizeds: normalizeds,
		watch: watchPage,
		usertalk: notifyuser,
		welcomeuser: welcomeuser,
		lognomination: csdlog,
		requestsalt: form.salting.checked,
		templateParams: templateParams
	};

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

	Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
	Morebits.wiki.actionCompleted.notice = 'برچسب زدن کامل شد';

	var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'در حال برچسب زدن به صفحه');
	wikipedia_page.setChangeTags(Twinkle.changeTags); // Here to apply to triage
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.load(Twinkle.speedy.callbacks.user.main);
};

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


// </nowiki>