ایشلدن:Alp Er Tunqa/Gadget-Twinkle.js

ویکی‌پدیادان، آچیق بیلیک‌لیک‌دن

' 'قئید:' یازدیق‌دان سونرا دییشیک‌لیک‌لری گؤرمک اوچون براوزئرینیزین کئش یادداشیندا تمیزلمه‌نیز لازیم اولا بیلر.

  • 'فایرفاکس / سافاری:Shift دویمه‌سینه باسین "یئنی‌دن یوکله"-ا داخیل اولون یا دا Ctrl-F5 یا Ctrl-R ائدین (ماج اوچون ⌘-R).
  • 'گووگل کروم:'Ctrl+Shift+R باسین. (ماج اوچون ⌘-Shift-R)
  • 'اینترنت ایکسپئلور: کلید Ctrl باسین یئنی‌لئ 'یئ داخیل اولون یا دا Ctrl-F5 ائدین.
  • 'اوپئرا:' آلت‌لری → سئچیملر 'دن اؤنبئللیغی Tools → Preferences تمیزلیین.
/**
 * +-------------------------------------------------------------------------+
 * |                  === WARNING: GLOBAL GADGET FILE ===                    |
 * |                Changes to this page affect many users.                  |
 * |           Please discuss changes at [[وپ:توینکل]] before editing.         |
 * +-------------------------------------------------------------------------+
 *
 * Imported from github [https://github.com/azatoth/twinkle]
 * To update this script from github, you must have a local repository set up. Then
 * follow the instructions at [https://github.com/azatoth/twinkle/blob/master/README.md].
 *
 * ----- -----
 *
 * This is AzaToth's Twinkle, the popular script sidekick for newbies, admins, and
 * every Wikipedian in between. Visit [[وپ:توینکل]] for more information.
 */

//<nowiki>

/**
 * **************** Namespace ****************
 */

var Namespace = {
	MAIN:           0,
	TALK:           1,
	USER:           2,
	USER_TALK:      3,
	PROJECT:        4,
	PROJECT_TALK:   5,
	IMAGE:          6,
	IMAGE_TALK:     7,
	FILE:           6,
	FILE_TALK:      7,
	MEDIAWIKI:      8,
	MEDIAWIKI_TALK: 9,
	TEMPLATE:       10,
	TEMPLATE_TALK:  11,
	HELP:           12,
	HELP_TALK:      13,
	CATEGORY:       14,
	CATEGORY_TALK:  15,
	PORTAL:         100,
	PORTAL_TALK:    101,
	BOOK:           108,
	BOOK_TALK:      109,
	MEDIA:          -2,
	SPECIAL:        -1,

	"":             0,
	WIKIPEDIA:      4,
	WIKIPEDIA_TALK: 5,
	WP:             4,
	WT:             5
};



var Twinkle = {};
window.Twinkle = Twinkle;  // allow global access

// for use by custom modules (normally empty)
Twinkle.initCallbacks = [];
Twinkle.addInitCallback = function twinkleAddInitCallback(func) {
	Twinkle.initCallbacks.push(func);
};

Twinkle.defaultConfig = {};
/**
 * Twinkle.defaultConfig.twinkle and Twinkle.defaultConfig.friendly
 *
 * This holds the default set of preferences used by Twinkle. (The |friendly| object holds preferences stored in the FriendlyConfig object.)
 * It is important that all new preferences added here, especially admin-only ones, are also added to
 * |Twinkle.config.sections| in twinkleconfig.js, so they are configurable via the Twinkle preferences panel.
 * For help on the actual preferences, see the comments in twinkleconfig.js.
 */
Twinkle.defaultConfig.twinkle = {
	 // General
	summaryAd: " ([[وپ:توینکل|توینکل]])",
	deletionSummaryAd: " ([[وپ:توینکل|توینکل]])",
	protectionSummaryAd: " ([[وپ:توینکل|توینکل]])",
	userTalkPageMode: "window",
	dialogLargeFont: false,
	 // Fluff (revert and rollback)
	openTalkPage: [ "agf", "norm", "vand" ],
	openTalkPageOnAutoRevert: false,
	markRevertedPagesAsMinor: [ "vand" ],
	watchRevertedPages: [ "agf", "norm", "vand", "torev" ],
	offerReasonOnNormalRevert: true,
	confirmOnFluff: false,
	showRollbackLinks: [ "diff", "others" ],
	 // DI (twinkleimage)
	notifyUserOnDeli: true,
	deliWatchPage: "default",
	deliWatchUser: "default",
	 // PROD
	watchProdPages: true,
	prodReasonDefault: "معیار",
	logProdPages: true,
	prodLogPageName: "فهرست صفحه‌های حذف زمان‌دار",
	 // CSD
	speedyPromptOnG7: false,
	watchSpeedyPages: [ "g3", "g5", "g10", "g11", "g12" ],
	markSpeedyPagesAsPatrolled: true,
	// these next two should probably be identical by default
	notifyUserOnSpeedyDeletionNomination:    [ "db", "g1", "g2", "g3", "g4", "g10", "g11", "g12", "a1", "a2", "a3", "a5", "a7", "a9", "a10", "f1", "f2", "f3", "f7", "f9", "f10", "u3", "t2", "t3", "p1", "p2" ],
	welcomeUserOnSpeedyDeletionNotification: [ "db", "g1", "g2", "g3", "g4", "g10", "g11", "g12", "a1", "a2", "a3", "a5", "a7", "a9", "a10", "f1", "f2", "f3", "f7", "f9", "f10", "u3", "t2", "t3", "p1", "p2" ],
	promptForSpeedyDeletionSummary: [ "db", "g1", "g2", "g3", "g4", "g6", "g7", "g8", "g10", "g11", "g12", "a1", "a2", "a3", "a5", "a7", "a9", "a10", "f2", "f4", "f7", "f8", "f10", "t2", "t3", "p1", "p2" ],
	openUserTalkPageOnSpeedyDelete: [ "db", "g1", "g2", "g3", "g4", "g5", "g10", "g11", "g12", "a1", "a3", "a7", "a9", "a10", "f3", "f7", "f9", "u3", "t2", "p1" ],
	deleteTalkPageOnDelete: true,
	deleteSysopDefaultToTag: false,
	speedyWindowHeight: 500,
	speedyWindowWidth: 800,
	logSpeedyNominations: false,
	speedyLogPageName: "تئزلیکله سیلینه‌جک صفحه‌لرین لیستی",
	noLogOnSpeedyNomination: [ "u1" ],
	 // Unlink
	unlinkNamespaces: [ "0", "100" ],
	 // Warn
	defaultWarningGroup: "1",
	showSharedIPNotice: true,
	watchWarnings: true,
	blankTalkpageOnIndefBlock: false,
	 // XfD
	xfdWatchDiscussion: "default",
	xfdWatchList: "no",
	xfdWatchPage: "default",
	xfdWatchUser: "default",
	 // Hidden preferences
	revertMaxRevisions: 50,
	batchdeleteChunks: 50,
	batchDeleteMinCutOff: 5,
	batchMax: 5000,
	batchProtectChunks: 50,
	batchProtectMinCutOff: 5,
	batchundeleteChunks: 50,
	batchUndeleteMinCutOff: 5,
	deliChunks: 500,
	deliMax: 5000,
	proddeleteChunks: 50
};

// now some skin dependent config.
if (mw.config.get("skin") === 'vector') {
	Twinkle.defaultConfig.twinkle.portletArea = 'right-navigation';
	Twinkle.defaultConfig.twinkle.portletId   = 'p-twinkle';
	Twinkle.defaultConfig.twinkle.portletName = 'توینکل';
	Twinkle.defaultConfig.twinkle.portletType = 'menu';
	Twinkle.defaultConfig.twinkle.portletNext = 'p-veiws';
} else {
	Twinkle.defaultConfig.twinkle.portletArea =  null;
	Twinkle.defaultConfig.twinkle.portletId   = 'p-cactions';
	Twinkle.defaultConfig.twinkle.portletName = null;
	Twinkle.defaultConfig.twinkle.portletType = null;
	Twinkle.defaultConfig.twinkle.portletNext = null;
}

Twinkle.defaultConfig.friendly = {
	 // Tag
	groupByDefault: true,
	watchTaggedPages: true,
	markTaggedPagesAsMinor: false,
	markTaggedPagesAsPatrolled: true,
	tagArticleSortOrder: "cat",
	customTagList: [],
	 // Welcome
	topWelcomes: false,
	watchWelcomes: true,
	welcomeHeading: "Welcome",
	insertHeadings: true,
	insertUsername: true,
	insertSignature: true,  // sign welcome templates, where appropriate
	markWelcomesAsMinor: true,
	quickWelcomeMode: "norm",
	quickWelcomeTemplate: "welcome",
	maskTemplateInSummary: true,
	customWelcomeList: [],
	 // Talkback
	markTalkbackAsMinor: true,
	insertTalkbackSignature: true,  // always sign talkback templates
	talkbackHeading: "یئنیدن دانیشما",
	adminNoticeHeading: "خبر وئرمک",
	 // Shared
	markSharedIPAsMinor: true
};

Twinkle.getPref = function twinkleGetPref(name) {
	var result;
	if (typeof(Twinkle.prefs) === "object" && typeof(Twinkle.prefs.twinkle) === "object") {
		// look in Twinkle.prefs (twinkleoptions.js)
		result = Twinkle.prefs.twinkle[name];
	} else if (typeof(window.TwinkleConfig) === "object") {
		// look in TwinkleConfig
		result = window.TwinkleConfig[name];
	}

	if (typeof(result) === "undefined") {
		return Twinkle.defaultConfig.twinkle[name];
	}
	return result;
};

Twinkle.getFriendlyPref = function twinkleGetFriendlyPref(name) {
	var result;
	if (typeof(Twinkle.prefs) === "object" && typeof(Twinkle.prefs.friendly) === "object") {
		// look in Twinkle.prefs (twinkleoptions.js)
		result = Twinkle.prefs.friendly[name];
	} else if (typeof(window.FriendlyConfig) === "object") {
		// look in FriendlyConfig
		result = window.FriendlyConfig[name];
	}

	if (typeof(result) === "undefined") {
		return Twinkle.defaultConfig.friendly[name];
	}
	return result;
};



/**
 * **************** twAddPortlet() ****************
 *
 * Adds a portlet menu to one of the navigation areas on the page.
 */
function twAddPortlet( navigation, id, text, type, nextnodeid )
{
	//sanity checks, and get required DOM nodes
	var root = document.getElementById( navigation );
	if ( !root ) {
		return null;
	}

	var item = document.getElementById( id );
	if (item) {
		if (item.parentNode && item.parentNode === root) {
			return item;
		}
		return null;
	}

	var nextnode;
	if (nextnodeid) {
		nextnode = document.getElementById(nextnodeid);
	}

	//verify/normalize input
	type = (skin === "vector" && type === "menu" && (navigation === "left-navigation" || navigation === "right-navigation")) ? "menu" : "";
	var outerDivClass;
	var innerDivClass;
	switch (skin)
	{
		case "vector":
			if (navigation !== "portal" && navigation !== "left-navigation" && navigation !== "right-navigation") {
				navigation = "mw-panel";
			}
			outerDivClass = (navigation === "mw-panel") ? "portal" : (type === "menu" ? "vectorMenu extraMenu" : "vectorTabs extraMenu");
			innerDivClass = (navigation === "mw-panel") ? 'body' : (type === 'menu' ? 'menu':'');
			break;
		case "modern":
			if (navigation !== "mw_portlets" && navigation !== "mw_contentwrapper") {
				navigation = "mw_portlets";
			}
			outerDivClass = "portlet";
			innerDivClass = "pBody";
			break;
		default:
			navigation = "column-one";
			outerDivClass = "portlet";
			innerDivClass = "pBody";
			break;
	}

	//Build the DOM elements.
	var outerDiv = document.createElement( 'div' );
	outerDiv.className = outerDivClass+" emptyPortlet";
	outerDiv.id = id;
	if (type === "menu") {
		// fix drop-down arrow image in Vector skin
		outerDiv.style.backgroundImage = 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAQCAMAAAAlM38UAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA9QTFRFsbGxmpqa3d3deXl58/n79CzHcQAAAAV0Uk5T/////wD7tg5TAAAAMklEQVR42mJgwQoYBkqYiZEZAhiZUFRDxWGicEPA4nBRhNlAcYQokpVMDEwD6kuAAAMAyGMFQVv5ldcAAAAASUVORK5CYII=")';
		outerDiv.style.backgroundPosition = 'right 60%';
                outerDiv.style.backgroundRepeat = 'no-repeat';
	}
	if ( nextnode && nextnode.parentNode === root ) {
		root.insertBefore( outerDiv, nextnode );
	} else {
		root.appendChild( outerDiv );
	}

	var h5 = document.createElement( 'h5' );
	if (type === 'menu') {
		var a = document.createElement( 'a' );
		a.href = "#";
		span = document.createElement( 'span' );
		span.appendChild( document.createTextNode( text ) );
		a.appendChild( span );
		h5.appendChild( a );
	} else {
		h5.appendChild( document.createTextNode( text ) );
	}
	outerDiv.appendChild( h5 );

	var innerDiv = document.createElement( 'div' ); //not strictly necessary with type vectorTabs, or other skins.
	innerDiv.className = innerDivClass;
	outerDiv.appendChild(innerDiv);

	var ul = document.createElement( 'ul' );
	innerDiv.appendChild( ul );

	return outerDiv;
}


/**
 * **************** twAddPortletLink() ****************
 * Builds a portlet menu if it doesn't exist yet, and add the portlet link.
 */
function twAddPortletLink( href, text, id, tooltip, accesskey, nextnode )
{
	if (Twinkle.getPref("portletArea") !== null) {
		twAddPortlet(Twinkle.getPref("portletArea"), Twinkle.getPref("portletId"), Twinkle.getPref("portletName"), Twinkle.getPref("portletType"), Twinkle.getPref("portletNext"));
	}
	return mw.util.addPortletLink( Twinkle.getPref("portletId"), href, text, id, tooltip, accesskey, nextnode );
}

// check if account is experienced enough for more advanced functions
var twinkleUserAuthorized = Morebits.userIsInGroup( 'autoconfirmed' ) || Morebits.userIsInGroup( 'confirmed' );

/*
 ****************************************
 *** friendlyshared.js: Shared IP tagging module
 ****************************************
 * Mode of invocation:     Tab ("Shared")
 * Active on:              Existing IP user talk pages
 * Config directives in:   FriendlyConfig
 */

Twinkle.shared = function friendlyshared() {
	if( mw.config.get('wgNamespaceNumber') === 3 && Morebits.isIPAddress(mw.config.get('wgTitle')) ) {
		var username = mw.config.get('wgTitle').split( '/' )[0].replace( /\"/, "\\\""); // only first part before any slashes
		$(twAddPortletLink("#", "Shared IP", "friendly-shared", "اورتاق آی‌پی اتیکتی", "")).click(function() { Twinkle.shared.callback(username); });
	}
};

Twinkle.shared.callback = function friendlysharedCallback( uid ) {
	var Window = new Morebits.simpleWindow( 600, 400 );
	Window.setTitle( "اوْرتاق آی‌پی اتیکتی" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.shared.callback.evaluate );

	form.append( { type:'header', label:'Shared IP address templates' } );
	form.append( { type: 'radio', name: 'shared', list: Twinkle.shared.standardList,
		event: function( e ) {
			Twinkle.shared.callback.change_shared( e );
			e.stopPropagation();
		} } );

	var org = form.append( { type:'field', label:'Fill in IP address owner/operator, hostname and contact information (if applicable) and hit \"Submit\"' } );
	org.append( {
			type: 'input',
			name: 'organization',
			label: 'سیستمین آدی',
			disabled: true,
			tooltip: 'Some of these templates support an optional parameter for the organization name that owns/operates the IP address.  The organization name can be entered here for those templates, including wikimarkup if necessary. '
		}
	);
	org.append( {
			type: 'input',
			name: 'host',
			label: 'نام میزبان',
			disabled: true,
			tooltip: 'These templates support an optional parameter for the host name.  The host name (for example, proxy.example.com) can be entered here and will be linked by the template. '
		}
	);
	org.append( {
			type: 'input',
			name: 'contact',
			label: 'اطلاعات تماس (اگر سوال شد)',
			disabled: true,
			tooltip: 'Some of these templates support an optional parameter for the organization\'s contact information.  Use this parameter only if the organization has specifically request that it be added.  This contact information can be entered here for those templates, including wikimarkup if necessary.'
		}
	);
	
	form.append( { type:'submit' } );

	var result = form.render();
	Window.setContent( result );
	Window.display();
};

Twinkle.shared.standardList = [
	{
		label: '{{اوْرتاق آی‌پی}}: standard shared IP address template',
		value: 'shared IP',
		tooltip: 'IP user talk page template that shows helpful information to IP users and those wishing to warn, block or ban them'
	},
	{ 
		label: '{{mobileIP}}: shared IP address template modified for mobile phone companies and their customers',
		value: 'mobileIP'
	}
];

Twinkle.shared.callback.change_shared = function friendlytagCallbackChangeShared(e) {
	if( e.target.value === 'shared IP edu' ) {
		e.target.form.contact.disabled = false;
	} else {
		e.target.form.contact.disabled = true;
	}
	e.target.form.organization.disabled=false;
	e.target.form.host.disabled=false;
};

Twinkle.shared.callbacks = {
	main: function( pageobj ) {
		var params = pageobj.getCallbackParameters();
		var pageText = pageobj.getPageText();
		var found = false;
		var text = '{{';

		for( var i=0; i < Twinkle.shared.standardList.length; i++ ) {
			tagRe = new RegExp( '(\\{\\{' + Twinkle.shared.standardList[i].value + '(\\||\\}\\}))', 'im' );
			if( tagRe.exec( pageText ) ) {
				Morebits.status.warn( 'info', 'یافت شد {{' + Twinkle.shared.standardList[i].value + '}} در بحث کاربر...لغو درخواست' );
				found = true;
			}
		}

		if( found ) {
			return;
		}

		Morebits.status.info( 'info', 'افزودن الگو آی‌پی مشترک در بالای بحث کاربر' );
		text += params.value + '|' + params.organization;
		if( params.value === 'shared IP edu' && params.contact !== '') {
			text += '|' + params.contact;
		}
		if( params.host !== '' ) {
			text += '|host=' + params.host;
		}
		text += '}}\n\n';

		var summaryText = 'الگوی {{[[الگو:' + params.value + '|' + params.value + ']]}} افزوده شد.';
		pageobj.setPageText(text + pageText);
		pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
		pageobj.setMinorEdit(Twinkle.getFriendlyPref('markSharedIPAsMinor'));
		pageobj.setCreateOption('recreate');
		pageobj.save();
	}
};

Twinkle.shared.callback.evaluate = function friendlysharedCallbackEvaluate(e) {
	var shared = e.target.getChecked( 'shared' );
	if( !shared || shared.length <= 0 ) {
		alert( 'You must select a shared IP address template to use!' );
		return;
	}
	
	var value = shared[0];
	
	if( e.target.organization.value === '') {
		alert( 'You must input an organization for the {{' + value + '}} template!' );
		return;
	}
	
	var params = {
		value: value,
		organization: e.target.organization.value,
		host: e.target.host.value,
		contact: e.target.contact.value
	};

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

	Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
	Morebits.wiki.actionCompleted.notice = "اتیکت وۇرولدو، دانیشیق صفحه‌سی یئنیلنمه‌سی اۆچون نئچه لحظه دؤزون...";

	var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "User talk page modification");
	wikipedia_page.setFollowRedirect(true);
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.load(Twinkle.shared.callbacks.main);
};

/*
 ****************************************
 *** friendlytag.js: Tag module ("اتیکتلر")
 ****************************************
 * Config directives in:   FriendlyConfig
 */

Twinkle.tag = function friendlytag() {
	// redirect tagging
	if( Morebits.wiki.isPageRedirect() ) {
		Twinkle.tag.mode = 'redirect';
		$(twAddPortletLink("#", "اتیکتلر", "friendly-tag", "داشیما اتیکتی", "")).click(Twinkle.tag.callback);
	}
	// file tagging
	else if( mw.config.get('wgNamespaceNumber') === 6 && !document.getElementById("mw-sharedupload") && document.getElementById("mw-imagepage-section-filehistory") ) {
		Twinkle.tag.mode = 'file';
		$(twAddPortletLink("#", "اتیکتلر", "friendly-tag", "فایلا ساخلاما اتیکتینی آرتیر", "")).click(Twinkle.tag.callback);
	}
	// article tagging
	else if( mw.config.get('wgNamespaceNumber') === 0 && mw.config.get('wgCurRevisionId') ) {
		Twinkle.tag.mode = 'article';
		$(twAddPortletLink("#", "اتیکتلر", "friendly-tag", "مقاله‌یه ساخلاما اتیکتینی آرتیر", "")).click(Twinkle.tag.callback);
	}
	// tagging of draft articles
	else if( ((mw.config.get('wgNamespaceNumber') === 2 && mw.config.get('wgPageName').indexOf("/") !== -1) || /^Wikipedia\:Articles[ _]for[ _]creation\//.exec(mw.config.get('wgPageName')) ) && mw.config.get('wgCurRevisionId') ) {
		Twinkle.tag.mode = 'draft';
		$(twAddPortletLink("#", "اتیکتلر", "friendly-tag", "افرودن برچسب بازبینی به چرک‌نویس مقاله", "")).click(Twinkle.tag.callback);
	}
};

Twinkle.tag.callback = function friendlytagCallback( uid ) {
	var Window = new Morebits.simpleWindow( 630, (Twinkle.tag.mode === "article") ? 450 : 400 );
	Window.setScriptName( "توینکل" );
	// anyone got a good policy/guideline/info page/instructional page link??
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.tag.callback.evaluate );

	switch( Twinkle.tag.mode ) {
		case 'article':
			Window.setTitle( "مقاله ساخلاما اتیکتی" );

			form.append( {
					type: 'checkbox',
					list: [
						{
							label: 'جمع‌آوری در {{چند موضوع}} در صورت امکان',
							value: 'group',
							name: 'group',
							tooltip: 'در صورت افزودن بیشتر از سه برچسب که از {{چند موضوع}} پشتیبانی می‌کنند و انتخاب این گزینهتمام برچسب‌ها در الگوی {{چند موضوع}}نمایش داده می‌شوند.',
							checked: Twinkle.getFriendlyPref('groupByDefault')
						}
					]
				}
			);

			form.append({
				type: 'select',
				name: 'sortorder',
				label: 'لیسته باخ',
				tooltip: 'شما می‌توانید ترتیب نمایش توینکل را در ترجیحات توینکل تنظیم نمایید ([[وپ:توینکل/ترجیحات]]).',
				event: Twinkle.tag.updateSortOrder,
				list: [
					{ type: 'option', value: 'cat', label: 'موضوعا گؤره', selected: Twinkle.getFriendlyPref('tagArticleSortOrder') === 'cat' },
					{ type: 'option', value: 'alpha', label: 'الفبایا گؤره', selected: Twinkle.getFriendlyPref('tagArticleSortOrder') === 'alpha' }
				]
			});

			form.append( { type: 'div', id: 'tagWorkArea' } );

			if( Twinkle.getFriendlyPref('customTagList').length ) {
				form.append( { type: 'header', label: 'برچسب دلخواه' } );
				form.append( { type: 'checkbox', name: 'articleTags', list: Twinkle.getFriendlyPref('customTagList') } );
			}
			break;

		case 'file':
			Window.setTitle( "فایل ساخلاما اتیکتی" );

			// TODO: perhaps add custom tags TO list of checkboxes

			form.append({ type: 'header', label: 'کوپی‌رایت پوزونتوسو' });
			form.append({ type: 'checkbox', name: 'imageTags', list: Twinkle.tag.file.licenseList } );

			form.append({ type: 'header', label: 'آریتما اتیکتلری' } );
			form.append({ type: 'checkbox', name: 'imageTags', list: Twinkle.tag.file.cleanupList } );

			form.append({ type: 'header', label: 'فایل کیفیت اتیکتلری' } );
			form.append({ type: 'checkbox', name: 'imageTags', list: Twinkle.tag.file.qualityList } );

			form.append({ type: 'header', label: 'ویکی‌انبارآ باغلی اتیکتلر' });
			form.append({ type: 'checkbox', name: 'imageTags', list: Twinkle.tag.file.commonsList } );

			form.append({ type: 'header', label: 'یئرینه قویما اتیکتلری' });
			form.append({ type: 'checkbox', name: 'imageTags', list: Twinkle.tag.file.replacementList } );
			break;

		case 'redirect':
			Window.setTitle( "یوللاندیرما اتیکتلری" );

			form.append({ type: 'header', label:'ایملایی یوخسا قرامر غلطلر اتیکتلری' });
			form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.tag.spellingList });

			form.append({ type: 'header', label:'شابلونلارین آیری آدی' });
			form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.tag.alternativeList });

			form.append({ type: 'header', label:'Miscellaneous and administrative redirect templates' });
			form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.tag.administrativeList });
			break;

		case 'draft':
			Window.setTitle( "قارالاما دفتری اتیکتی" );

			form.append({ type: 'header', label:'قارلاما دفترینی اتیکتله' });
			form.append({ type: 'checkbox', name: 'draftTags', list: Twinkle.tag.draftList });
			break;

		default:
			alert("Twinkle.tag: unknown mode " + Twinkle.tag.mode);
			break;
	}

	form.append( { type:'submit' } );

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

	if (Twinkle.tag.mode === "article") {
		// fake a change event on the sort dropdown, to initialize the tag list
		var evt = document.createEvent("Event");
		evt.initEvent("change", true, true);
		result.sortorder.dispatchEvent(evt);
	}
};

Twinkle.tag.checkedTags = [];

Twinkle.tag.updateSortOrder = function(e) {
	var sortorder = e.target.value;
	var $workarea = $(e.target.form).find("div#tagWorkArea");

	Twinkle.tag.checkedTags = e.target.form.getChecked("articleTags");
	if (!Twinkle.tag.checkedTags) {
		Twinkle.tag.checkedTags = [];
	}

	// function to generate a checkbox, with appropriate subgroup if needed
	var makeCheckbox = function(tag, description) {
		var checkbox = { value: tag, label: "{{" + tag + "}}: " + description };
		if (Twinkle.tag.checkedTags.indexOf(tag) !== -1) {
			checkbox.checked = true;
		}
		if (tag === "globalize") {
			checkbox.subgroup = {
				name: 'globalize',
				type: 'select',
				list: [
					{ label: "{{جهانی}}: article may not represent a worldwide view of the subject", value: "globalize" },
					{
						label: "Region-specific {{جهانی}} subtemplates",
						list: [
							{ label: "{{جهانی}}: article deals primarily with the Australian viewpoint", value: "globalize/Australia" },
							{ label: "{{جهانی}}: article deals primarily with the viewpoint of Western countries", value: "globalize/West" }
						]
					}
				]
			};
		} else if (tag === "notability") {
			checkbox.subgroup = {
				name: 'notability',
				type: 'select',
				list: [
					{ label: "{{notability}}: article\'s subject may not meet the general notability guideline", value: "none" },
					{ label: "{{notability|Web}}: notability guideline for web content", value: "Web" }
				]
			};
		}
		return checkbox;
	};

	// categorical sort order
	if (sortorder === "cat") {
		var div = new Morebits.quickForm.element({
			type: "div",
			id: "tagWorkArea"
		});

		// function to iterate through the tags and create a checkbox for each one
		var doCategoryCheckboxes = function(subdiv, array) {
			var checkboxes = [];
			$.each(array, function(k, tag) {
				var description = Twinkle.tag.article.tags[tag];
				checkboxes.push(makeCheckbox(tag, description));
			});
			subdiv.append({
				type: "checkbox",
				name: "articleTags",
				list: checkboxes
			});
		};

		var i = 0;
		// go through each category and sub-category and append lists of checkboxes
		$.each(Twinkle.tag.article.tagCategories, function(title, content) {
			div.append({ type: "header", id: "tagHeader" + i, label: title });
			var subdiv = div.append({ type: "div", id: "tagSubdiv" + i++ });
			if ($.isArray(content)) {
				doCategoryCheckboxes(subdiv, content);
			} else {
				$.each(content, function(subtitle, subcontent) {
					subdiv.append({ type: "div", label: [ Morebits.htmlNode("b", subtitle) ] });
					doCategoryCheckboxes(subdiv, subcontent);
				});
			}
		});

		var rendered = div.render();
		$workarea.replaceWith(rendered);
		var $rendered = $(rendered);
		$rendered.find("h5").css({ 'font-size': '110%', 'margin-top': '1em' });
		$rendered.find("div").filter(":has(span.Morebits.quickFormDescription)").css({ 'margin-top': '0.4em' });
	}
	// alphabetical sort order
	else {
		var checkboxes = [];
		$.each(Twinkle.tag.article.tags, function(tag, description) {
			checkboxes.push(makeCheckbox(tag, description));
		});
		var tags = new Morebits.quickForm.element({
			type: "checkbox",
			name: "articleTags",
			list: checkboxes
		});
		$workarea.empty().append(tags.render());
	}
};


// Tags for ARTICLES start here

Twinkle.tag.article = {};

// A list of all article tags, in alphabetical order
// To ensure tags appear in the default "categorized" view, add them to the tagCategories hash below.

Twinkle.tag.article.tags = {

"ویکی\u200cلشدیرمک":"ویکی‌لشدیریلمه‌لی مقاله‌لره گؤره.",
"یقپ":"یازی قوراللارینی پوزان مقاله‌لر اوچون..",
"لحن":"ویژهٔ مقاله‌هایی که لحن مناسبی ندارند.",
"طفره\u200cآمیز":"ویژهٔ مواردی که محتوای مقاله نامفهوم بوده و موضوع مشخصی را به درستی دنبال نمی‌کند.",
"نامفهوم":"متن مقاله نامفهوم است.",
"طرفداری":"ویژهٔ مقاله‌هایی که سیاست بی‌طرفی را زیر پا می‌گذارند.",
"درستی":"برای هنگامی که در درستی مطلب تردید وجود دارد.",
"سرشناسی":"ویژهٔ مقاله‌هایی که موضوع آن‌ها از سرشناسی کافی بر خوردار نیست.",
"قایناقسیز":"هنگامی که مقاله‌ای بی‌منبع رها شده باشد.",
"بهبود منبع":"هنگامی که در یک مقاله به خوبی منبع‌دهی نشده باشد.",
"منبع نامعتبر":"هنگامی که منابع یک مقاله از اعتبار کافی برخوردار نباشد.",
"نقض حق تکثیر":"اگر در مقاله‌ای حق تکثیر زیر پا گذاشته شده باشد.",
"حق تکثیر مشکوک":"برای مقاله‌هایی که گمان آن می‌رود که حق تکثیر در آن‌ها زیر پا گذاشته شده باشد.",
"عنوان مقاله":"ویژهٔ مواردی که عنوان مقاله نیازمند منبع است و در درستی نام مقاله شک وجود دارد.",
"رکلام":"ویژهٔ مقاله‌هایی که محتوای تبلیغاتی دارند",
"خودستایی":"ویژهٔ مقاله‌هایی که تعارض منافع دارد یا محتوای آن به تعریف و تمجید از موضوع پرداخته‌است",
"جا:ویرایش/روز":"ویژهٔ مواردی که کاربر برای جلوگیری از تعارض ویرایشی این برچسب را در بالای مقاله قرار می‌دهد و زمانی را درخواست می‌کند.",
"رویداد روز":"ویژهٔ مقاله‌هایی که درباره رویداد یک روز یا یک دوره خاص هستند و کاربران در حال  افزودن اطلاعات جدید به مقاله هستند",
"جعبه اطلاعات-نیاز":"برای مقاله‌هایی که نیازمند جعبهٔ اطلاعات هستند.",
"میان‌ویکی-نیاز":"ویژهٔ مقاله‌هایی که به افزودن میان‌ویکی نیاز دارند.",
"رده-نیاز":"ویژهٔ مقاله‌هایی که به رده‌بندی نیاز دارند.",
"مختصات-نیاز":"ویژهٔ مقاله‌هایی که به مختصات نیاز دارند.",
"عنوان مترادف-نیاز":"ویژهٔ مواردی که نیاز به انتقال نام مقاله به عنوان فارسی هست",
"ترجمه-نیاز":"هنگامی که در متن مقاله عبارت‌های زیادی مربوط به زبان‌های دیگر باشد و مقاله نیازمند ترجمهٔ آن‌ها باشد.",
"اصلاح ترجمه":"برای موردهایی که به خوبی ترجمه نشده‌اند یا نام آن‌ها هنوز به زبان بیگانه‌است.",
"عکس-نیاز":"ویژهٔ بخش‌هایی که برای درک بهتر به عکس نیاز دارند ولی هم اکنون از آن بی‌بهره‌اند.",
"بازنویسی":"ویژهٔ مقاله‌هایی که برای رعایت حق تکثیر و عدم کپی‌کاری نیاز به بازنویسی دارند. یا ترجمه‌هایی که مفهوم را درست نمی‌رسانند.",
"فارسی‌سازی نشانه":"ویژهٔ موردهایی که نشانه‌گذاری آن‌ها فارسی نیست.",
"تصویر نرم‌افزار-نیاز":"ویژهٔ بخش‌هایی که برای درک بهتر به تصویر نیاز دارند ولی هم اکنون از آن بی‌بهره‌اند",
"نقشه-نیاز":"ویژهٔ بخش‌هایی که برای درک بهتر به نقشه نیاز دارند ولی هم اکنون از آن بی‌بهره‌اند.",
"پرچم-نیاز":"ویژهٔ بخش‌هایی که برای بیان بهتر به پرچم نیاز دارند ولی هم اکنون از آن بی‌بهره‌اند.",
"جدول-نیاز":"ویژهٔ بخش‌هایی که برای بیان بهتر به جدول نیاز دارند ولی هم اکنون از آن بی‌بهره‌اند.",
"نمودار-نیاز":"ویژهٔ بخش‌هایی که برای بیان بهتر به نمودار نیاز دارند ولی هم اکنون از آن بی‌بهره‌اند.",
"آمار-نیاز":"ویژهٔ بخش‌هایی که برای بیان بهتر به آمار نیاز دارند ولی هم اکنون از آن بی‌بهره‌اند.",
"سیستم متریک-نیاز":"ویژهٔ مقاله‌هایی که در آنها از یکاهای اندازه‌گیری با استانداردهای غیر متریک مثلا استاندارد امپراتوری یا استانداردهای قدیمی استفاده شده‌است و نیاز به واحدهای متریک احساس می‌گردد.",
"به روز-نیاز":"ویژهٔ مقاله‌هایی که نیاز به اطلاعات به‌روز دارند مانند جمعیت، تورم، مساحت، مرگ، آثار جدید، جایزه‌های جدید و سایر موارد.",
"کد شابک کتاب-نیاز":"ویژهٔ مقاله‌هایی که در بخش منابع نام کتاب ذکر شده‌است ولی کد شابک آن ذکر نگردیده‌است."


};

// A list of tags in order of category
// Tags should be in alphabetical order within the categories
// Add new categories with discretion - the list is long enough as is!

Twinkle.tag.article.tagCategories = {
	"برچسب‌های تمیزکاری و نگهداری": {
		"عومومی آریتما": [
			"یقپ",
			"ویکی\u200cلشدیرمک",
			"لحن",
			"طفره\u200cآمیز",
			"نامفهوم"
		],
		"محتویات نامناسب": [
			"مقاله باشلیغی",
			"طرف ساخلاما",
			"رکلام",
			"آدلیملیق"
		],
		"قایناقلار": [
			"دوْغرولوق",
			"قایناقسیز",
			"بهبود منبع",
			"منبع نامعتبر",
			"حق تکثیر مشکوک"
		],
		"باشقا": [
			"خودستایی",
                       "ادغام به",
                       "ادغام از",
                       "ادغام تاریخچه",
			"جا:ویرایش/روز",
			"رویداد روز"
		]

	},
	"نیاز به": {
		"موارد اصلی": [
			"جعبه اطلاعات-نیاز",
			"میان‌ویکی-نیاز",
			"رده-نیاز",
			"مختصات-نیاز",
			"عنوان مترادف-نیاز",
			"ترجمه-نیاز",
			"اصلاح ترجمه",
			"عکس-نیاز",
			"بازنویسی",
			"فارسی‌سازی نشانه"
		],
		"بهبود کیفیت مقاله": [
			"تصویر نرم‌افزار-نیاز",
			"نقشه-نیاز",
			"پرچم-نیاز",
			"جدول-نیاز",
			"نمودار-نیاز",
			"آمار-نیاز",
			"سیستم متریک-نیاز",
			"به روز-نیاز",
			"کد شابک کتاب-نیاز",
		]
        }
};

// Tags for REDIRECTS start here

Twinkle.tag.spellingList = [
	{
		label: '{{R from abbreviation}}: تغییرمسیر از یک عنوان مخفف',
		value: 'R from abbreviation' 
	},
	{
		label: '{{R from other capitalisation}}: redirect from a title with another method of capitalisation',
		value: 'R from other capitalisation'
	}
];

Twinkle.tag.alternativeList = [
	{
		label: '{{R from alternative name}}: redirect from a title that is another name, a pseudonym, a nickname, or a synonym',
		value: 'R from alternative name' 
	},
	{
		label: '{{R from title without diacritics}}: redirect to the article title with diacritical marks (accents, umlauts, etc.)',
		value: 'R from title without diacritics'
	}
];

Twinkle.tag.administrativeList = [
	{
		label: '{{R from merge}}: تغییرمسیر از یک صفحه ادغام شده به منظور نگهداری از تاریخچه‌ ویرایشش',
		value: 'R from merge' 
	},
	{
		label: '{{R from school}}: تغییرمسیر از نوشتاری مربوط به ویکی‌پروژه مدرسه که اطلاعات بسیاری کمی داشته',
		value: 'R from school'
	}
];

// maintenance tags for FILES start here

Twinkle.tag.file = {};

Twinkle.tag.file.licenseList = [
	{ label: '{{Bsr}}: source info consists of bare image URL/generic base URL only', value: 'Bsr'},
	{ label: '{{Non-free reduce}}: تصویر با کیفیت کاسته نشده (یا کلیپ صوتی بسیار بلند و ...)', value: 'Non-free reduce'},
	{ label: '{{Non-free reduced}}:  استفاده منصفانه از رسانه که کوچک شده است (نسخه‌های قدیمی نیازمند حذف)', value: 'Non-free reduced'}
];

Twinkle.tag.file.cleanupList = [
	{ label: '{{Artifacts}}: PNG contains residual compression artifacts', value: 'Artifacts'},
	{ label: '{{باید PNG باشد}}: GIF یا JPEG باید فشرده سازی شود', value: 'باید PNG باشد'},
	{
		label: '{{Should be SVG}}: پی‌ان‌جی، جی‌آی‌اف یا جی‌پگ باید به گرافیک برداری تبدیل شود', value: 'باید اس‌وی‌جی باشد',
		subgroup: {
			name: 'svgCategory',
			type: 'select',
			list: [
				{ label: '{{Should be SVG|other}}', value: 'other' },
				{ label: '{{Should be SVG|symbol}}: miscellaneous symbols, icons, etc.', value: 'symbol' }
			]
		}
	},
	{ label: '{{باید متن باشد}}: نگاره باید به صورت متن، جدول یا متن ریاضی نشانه گذاری شود', value: 'باید متن باشد'}
];

Twinkle.tag.file.qualityList = [
	{ label: '{{Image-blownout}}', value: 'Image-blownout'},
	{ label: '{{کیفیت پایین - شیمی}}: disputed chemical structures', value: 'Low quality chem'}
];

Twinkle.tag.file.commonsList = [
	{ label: '{{انتقال به انبار}}: free media that should be copied to Commons', value: 'Move to Commons' },
	{ label: '{{Shadows Commons}}: پرونده‌های گوناگون تحت همان نام در انبار موجود است', value: 'Shadows Commons'}
];

Twinkle.tag.file.replacementList = [
	{ label: '{{منسوخ}}: نسخه پیشرفته تر در دسترس است', value: 'منسوخ'},
	{ label: '{{نسخه SVG در دسترس است}}', value: 'نسخهٔ SVG در دسترس است'}
];


// Tags for DRAFT ARTICLES start here

Twinkle.tag.draftList = [
	{ label: '{{پیش‌نویس مقاله}}: برچسب‌زدن به مقاله برای درخواست بازبینی', value: 'new unreviewed article'}
];


// Contains those article tags that can be grouped into {{چند موضوع}}.
// This list includes synonyms.
Twinkle.tag.groupHash = [
	'advert',
	'wikify'
];

Twinkle.tag.callbacks = {
	main: function( pageobj ) {
		var params = pageobj.getCallbackParameters();
		var tagRe, tagText = '', summaryText = 'افزودن';
		var tags = [], groupableTags = [];

		// Remove tags that become superfluous with this action
		var pageText = pageobj.getPageText().replace(/\{\{\s*(New unreviewed article|Userspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");

		var i;
		if( Twinkle.tag.mode !== 'redirect' ) {
			// Check for preexisting tags and separate tags into groupable and non-groupable arrays
			for( i = 0; i < params.tags.length; i++ ) {
				tagRe = new RegExp( '(\\{\\{' + params.tags[i] + '(\\||\\}\\}))', 'im' );
				if( !tagRe.exec( pageText ) ) {
					if( Twinkle.tag.groupHash.indexOf(params.tags[i]) !== -1 && 
							(params.tags[i] !== 'globalize' || params.globalizeSubcategory === 'globalize' ) &&
							(params.tags[i] !== 'notability' || params.notabilitySubcategory === 'none' )) {
						// don't add to multipleissues for globalize/notability subcats
						groupableTags = groupableTags.concat( params.tags[i] );
					} else {
						tags = tags.concat( params.tags[i] );
					}
				} else {
					Morebits.status.info( 'info', 'تاپیلدی، {{' + params.tags[i] +
						'}} به مقاله افزوده شد...به جز' );
				}
			}

			if( params.group && groupableTags.length >= 3 ) {
				Morebits.status.info( 'info', 'دسته‌بندی برچسب‌هی پشتیبانی کننده از  {{چند موضوع}}' );

				groupableTags.sort();
				tagText += '{{چند موضوع';
				summaryText += ' {{[[الگو:چند موضوع|چند موضوع]]}} با موارد';
				for( i = 0; i < groupableTags.length; i++ ) {
					tagText += '|' + groupableTags[i] +
						'={{جا:CURRENTMONTHNAME}} {{جا:CURRENTYEAR}}';

					if( i === (groupableTags.length - 1) ) {
						summaryText += ' و';
					} else if ( i < (groupableTags.length - 1) && i > 0 ) {
						summaryText += '،';
					}
					summaryText += ' ' + groupableTags[i];
				}
				tagText += '}}\n';
			} else {
				tags = tags.concat( groupableTags );
			}
		} else {
			// Check for pre-existing tags
			for( i = 0; i < params.tags.length; i++ ) {
				tagRe = new RegExp( '(\\{\\{' + params.tags[i] + '(\\||\\}\\}))', 'im' );
				if( !tagRe.exec( pageText ) ) {
					tags = tags.concat( params.tags[i] );
				} else {
					Morebits.status.info( 'info', ' تاپیلدی.{{' + params.tags[i] +
						'}} بر روی تغییرمسیرها...در حال برداشتن' );
				}
			}
		}

		tags.sort();
		for( i = 0; i < tags.length; i++ ) {
			var currentTag = "";
			if( tags[i] === 'uncategorized' || tags[i] === 'cat improve' ) {
				pageText += '\n\n{{' + tags[i] +
					'|تاریخ={{جا:CURRENTMONTHNAME}} {{جا:CURRENTYEAR}}}}';
			} else {
				if( tags[i] === 'globalize' ) {
					currentTag += '{{' + params.globalizeSubcategory;
				} else {
					currentTag += ( Twinkle.tag.mode === 'redirect' ? '\n' : '' ) + '{{' + tags[i];
				}

				if( tags[i] === 'notability' && params.notabilitySubcategory !== 'none' ) {
					currentTag += '|' + params.notabilitySubcategory;
				}

				// prompt for other parameters, based on the tag
				switch( tags[i] ) {
					case 'تمیزکاری':
						var reason = prompt('شما می‌توانید دلیلتان را برای تمیزکاری مقاله بیان کنید  \n' +
							"اگر نمی‌دانید، فقط تأیید را کلیک کنید.  برای گذشتن {{یقپ}} لغو را فشار دهید.", "");
						if (reason === null) {
							continue;
						} else if (reason !== "") {
							currentTag += '|دلیل=' + reason;
						}
						break;
					

                                       case 'نقض حق تکثیر':
						var url = prompt('لطفا نشانی را با اطمینان از همخوانی با منبع اصلی، جای‌گذاری کنید.  \n' +
							"اگر نمی‌دانید، فقط تأیید را کلیک کنید.  برای گذشتن  {{نقض حق تکثیر}} لغو را کلیک کنید.", "");
						if (url === null) {
							continue;
						} else if (url !== "") {
							currentTag += '|نشانی=' + url;
						}
						break;
					case 'ترجمه-نیاز':
						var langname = prompt('لطفا نام زبان مقاله‌ای که فکر می‌کنید با آن نوشته شده‌است را وارد کنید.  \n' +
							"اگر نمی‌دانید، فقط تأیید را بفشارید.  برای گذشتن {{ترجمه-نیاز}}  لغو را کلیک کنید.", "");
						if (langname === null) {
							continue;
						} else if (langname !== "") {
							currentTag += '|1=' + langname;
						}
						break;
					case 'rough translation':
						var roughlang = prompt('لطفا نام زبان مقاله‌ای که فکر می‌کنید از آن ترجمه شده‌است را وارد کنید.  \n' +
							"اگر نمی‌دانید، فقط دکمهٔ تأیید را کلیک کنید.  برای گذشتن {{rough translation}} لغو را فشار دهید.", "");
						if (roughlang === null) {
							continue;
						} else if (roughlang !== "") {
							currentTag += '|1=' + roughlang;
						}
						break;
					case 'expert-subject':
						var wikiproject = prompt('لطفا نام ویکی‌پروژه‌ای که ممکن است بتواند در جذب نیروی متخصص همکاری کند را وارد کنید.  \n' +
							"اگر نمی‌دانید، فقط دکمهٔ تأیید را کلیک کنید. برای گذاشتن {{expert-subject}}  لغو را کلیک کنید.", "");
						if (wikiproject === null) {
							continue;
						} else if (wikiproject !== "") {
							currentTag += '|1=' + wikiproject;
						}
						break;
					case 'ادغام به':
					case 'ادغام از':
					case 'ادغام تاریخچه':
						var param = prompt('لطفا نام مقاله/مقالاتی که مستلزم ادغام هستند را وارد کنید.  \n' +
							"برای تشخیص مقالات متعدد، از (|) استفاده کنید.  \n" +
							"این اطلاعات ضروری است.  هنگامی که کار انجام شد، دکمهٔ تأیید را کلیک کنید، یا برای گذشتن از آن، کلید لغو را کلیک کنید.", "");

						if (param === null) {
							continue;
						} else if (param !== "") {
							currentTag += '|' + param;
						}
						break;
					default:
						break;
				}

				currentTag += Twinkle.tag.mode === 'redirect' ? '}}' : '|تاریخ={{جا:CURRENTMONTHNAME}} {{جا:CURRENTYEAR}}}}\n';
				tagText += currentTag;
			}

			if ( i > 0 || groupableTags.length > 3 ) {
				if( i === (tags.length - 1) ) {
					summaryText += ' و ';
				} else if ( i < (tags.length - 1) ) {
					summaryText += '،';
				}
			}

			summaryText += ' {{[[الگو:';
			if( tags[i] === 'globalize' ) {
				summaryText += params.globalizeSubcategory + '|' + params.globalizeSubcategory;
			} else {
				summaryText += tags[i] + '|' + tags[i];
			}
			summaryText += ']]}}';
		}

		if( Twinkle.tag.mode === 'redirect' ) {
			pageText += tagText;
		} else {
			// smartly insert the new tags after any hatnotes. Regex is a bit more
			// complicated than it'd need to be, to allow templates as parameters,
			// and to handle whitespace properly.
			pageText = pageText.replace(/^\s*(?:((?:\s*\{\{\s*(?:about|correct title|همچنین ببینید|تغییرمسیر|دیگر کاربردها|کاربردهای دیگر|اشتباه نشود|اصلی|dablink|درباره|distinguish|تغییرمسیر۲|for|other\s?(?:hurricaneuses|people|persons|places|uses(?:of)?)|redirect(?:-acronym)?|see\s?(?:also|wiktionary)|selfref|the)\d*\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\})+(?:\s*\n)?)\s*)?/i,
				"$1" + tagText);
		}
		summaryText += Twinkle.getPref('summaryAd');

		pageobj.setPageText(pageText);
		pageobj.setEditSummary(summaryText);
		pageobj.setWatchlist(Twinkle.getFriendlyPref('watchTaggedPages'));
		pageobj.setMinorEdit(Twinkle.getFriendlyPref('markTaggedPagesAsMinor'));
		pageobj.setCreateOption('nocreate');
		pageobj.save();

		if( Twinkle.getFriendlyPref('markTaggedPagesAsPatrolled') ) {
			pageobj.patrol();
		}
	},

	file: function friendlytagCallbacksFile(pageobj) {
		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();
		var summary = "افزودن ";

		// Add maintenance tags
		if (params.tags.length) {

			var tagtext = "", currentTag;
			$.each(params.tags, function(k, tag) {
				currentTag = "{{" + (tag === "Do not move to Commons_reason" ? "Do not move to Commons" : tag);

				var input;
				switch (tag) {
					case "جا:ncd":
						/* falls through */
					case "Keep local":
						input = prompt( "{{" + (tag === "جا:ncd" ? "نوبت ویکی‌انبار" : tag) +
							"}} - نام تصویر را در ویکی‌انبار ذکر نمائید (در صورتی که با نام تصویر موجود در ویکی‌فا تفاوت دارد)، بدون پیشوند پرونده یا File:", "" );
						if (input === null) {
							return true;  // continue
						} else if (input !== "") {
							currentTag += '|1=' + input;
						}
						break;
					case "Rename media":
						input = prompt( "{{Rename media}} - Enter the new name for the image (optional):", "" );
						if (input === null) {
							return true;  // continue
						} else if (input !== "") {
							currentTag += "|1=" + input;
						}
						input = prompt( "{{Rename media}} - Enter the reason for the rename (optional):", "" );
						if (input === null) {
							return true;  // continue
						} else if (input !== "") {
							currentTag += "|2=" + input;
						}
						break;
					case "Cleanup image":
						/* falls through */
					case "Cleanup SVG":
						input = prompt( "{{" + tag + "}} - Enter the reason for cleanup (required). To skip the tag, click Cancel:", "" );
						if (input === null) {
							return true;  // continue
						} else if (input !== "") {
							currentTag += "|1=" + input;
						}
						break;
					case "Image-Poor-Quality":
						input = prompt( "{{Image-Poor-Quality}} - Enter the reason why this image is so bad (required). To skip the tag, click Cancel:", "" );
						if (input === null) {
							return true;  // continue
						} else if (input !== "") {
							currentTag += "|1=" + input;
						}
						break;
					case "Low quality chem":
						input = prompt( "{{Low quality chem}} - Enter the reason why the diagram is disputed (required). To skip the tag, click Cancel:", "" );
						if (input === null) {
							return true;  // continue
						} else if (input !== "") {
							currentTag += "|1=" + input;
						}
						break;
					case "PNG version available":
						/* falls through */
					case "SVG version available":
						/* falls through */
					case "Obsolete":
						/* falls through */
					case "Redundant":
						input = prompt( "{{" + tag + "}} - Enter the name of the file which replaces this one (required). To skip the tag, click Cancel:", "" );
						if (input === null) {
							return true;  // continue
						} else if (input !== "") {
							currentTag += "|1=" + input;
						}
						break;
					case "Do not move to Commons_reason":
						input = prompt( "{{نگاره آمریکا مغایر با ویکی‌انبار}} - Enter the reason why this image should not be moved to Commons (required). To skip the tag, click Cancel:", "" );
						if (input === null) {
							return true;  // continue
						} else if (input !== "") {
							currentTag += "|دلیل=" + input;
						}
						break;
					case "Non-free reduced":
						currentTag += "|تاریخ={{جا:date}}";
						break;
					default:
						break;  // don't care
				}

				if (tag === "Should be SVG") {
					currentTag += "|" + params.svgSubcategory;
				}

				currentTag += "}}\n";

				tagtext += currentTag;
				summary += "{{" + tag + "}}, ";

				return true;  // continue
			});

			if (!tagtext) {
				pageobj.getStatusElement().warn("ایشلدن ایستکدن وازگئچدی، هئچ بیر ایش ائدیلمه‌دی!");
				return;
			}

			text = tagtext + text;
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary(summary.substring(0, summary.length - 2) + Twinkle.getPref('summaryAd'));
		pageobj.setWatchlist(Twinkle.getFriendlyPref('watchTaggedPages'));
		pageobj.setMinorEdit(Twinkle.getFriendlyPref('markTaggedPagesAsMinor'));
		pageobj.setCreateOption('nocreate');
		pageobj.save();

		if( Twinkle.getFriendlyPref('markTaggedPagesAsPatrolled') ) {
			pageobj.patrol();
		}
	}
};

Twinkle.tag.callback.evaluate = function friendlytagCallbackEvaluate(e) {
	var form = e.target;
	var params = {};

	switch (Twinkle.tag.mode) {
		case 'article':
			params.tags = form.getChecked( 'articleTags' );
			params.group = form.group.checked;
			params.globalizeSubcategory = form["articleTags.globalize"] ? form["articleTags.globalize"].value : null;
			params.notabilitySubcategory = form["articleTags.notability"] ? form["articleTags.notability"].value : null;
			break;
		case 'file':
			params.svgSubcategory = form["imageTags.svgCategory"] ? form["imageTags.svgCategory"].value : null;
			params.tags = form.getChecked( 'imageTags' );
			break;
		case 'redirect':
			params.tags = form.getChecked( 'redirectTags' );
			break;
		case 'draft':
			params.tags = form.getChecked( 'draftTags' );
			Twinkle.tag.mode = 'article';
			break;
		default:
			alert("Twinkle.tag: unknown mode " + Twinkle.tag.mode);
			break;
	}

	if( !params.tags.length ) {
		alert( 'You must select at least one tag!' );
		return;
	}

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

	Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
	Morebits.wiki.actionCompleted.notice = "اتیکت وۇرولدو، دانیشیق صفحه‌سی یئنیلنمه‌سی اۆچون نئچه لحظه دؤزون...";
	if (Twinkle.tag.mode === 'redirect') {
		Morebits.wiki.actionCompleted.followRedirect = false;
	}

	var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "برچسب‌زدن " + Twinkle.tag.mode);
	wikipedia_page.setCallbackParameters(params);
	switch (Twinkle.tag.mode) {
		case 'article':
			/* falls through */
		case 'redirect':
			wikipedia_page.load(Twinkle.tag.callbacks.main);
			return;
		case 'file':
			wikipedia_page.load(Twinkle.tag.callbacks.file);
			return;
		default:
			alert("Twinkle.tag: unknown mode " + Twinkle.tag.mode);
			break;
	}
};

/*
 ****************************************
 *** friendlytalkback.js: Talkback module
 ****************************************
 * Mode of invocation:     Tab ("بازبحث")
 * Active on:              Existing user talk pages
 * Config directives in:   FriendlyConfig
 */

Twinkle.talkback = function friendlytalkback() {
	if( mw.config.get('wgNamespaceNumber') === 3 ) {
		var username = mw.config.get('wgTitle').split( '/' )[0].replace( /\"/, "\\\""); // only first part before any slashes
		$(twAddPortletLink("#", "بازبحث", "friendly-talkback", "ادامه بحث", "")).click(function() { Twinkle.talkback.callback(username); });
	}
};

Twinkle.talkback.callback = function friendlytalkbackCallback( uid ) {
	if( uid === mw.config.get('wgUserName') ){
		alert( 'استفاده از بازبحث برای بحث خودتان مناسب نیست!' );
		return;
	}

	var Window = new Morebits.simpleWindow( 600, 350 );
	Window.setTitle( "بازبحث" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "درباره {{بازبحث}}", "الگو:بازبحث" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.talkback.callback.evaluate );

	form.append( { type: 'radio', name: 'tbtarget',
				list: [ {
						label: 'دانیشیق صفحه‌م',
						value: 'mytalk',
						checked: 'true' },
					{
						label: 'باشقا ایشلدنین دانیشیغی',
						value: 'usertalk' },
					{
						label: "ویکی‌پدیا:ایداره‌چیلر بیلدیری تابلوسو",
						value: 'an' },
					{
						label: 'آیری صفحه',
						value: 'other' } ],
				event: Twinkle.talkback.callback.change_target
			} );

	form.append( {
			type: 'field',
			label: 'ایش یئری',
			name: 'work_area'
		} );

	form.append( { type:'submit' } );

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

	// We must init the
	var evt = document.createEvent( "Event" );
	evt.initEvent( 'change', true, true );
	result.tbtarget[0].dispatchEvent( evt );
};

Twinkle.talkback.prev_page = '';
Twinkle.talkback.prev_section = '';
Twinkle.talkback.prev_message = '';

Twinkle.talkback.callback.change_target = function friendlytagCallbackChangeTarget(e) {
	var value = e.target.values;
	var root = e.target.form;
	var old_area;

	if(root.section) {
		Twinkle.talkback.prev_section = root.section.value;
	}
	if(root.message) {
		Twinkle.talkback.prev_message = root.message.value;
	}
	if(root.page) {
		Twinkle.talkback.prev_page = root.page.value;
	}

	for( var i = 0; i < root.childNodes.length; ++i ) {
		var node = root.childNodes[i];
		if (node instanceof Element && node.getAttribute( 'name' ) === 'work_area' ) {
			old_area = node;
			break;
		}
	}
	var work_area = new Morebits.quickForm.element( { 
			type: 'field',
			label: 'اطلاعات بازبحث',
			name: 'work_area'
		} );

	switch( value ) {
		case 'mytalk':
			/* falls through */
		default:
			work_area.append( { 
					type:'input',
					name:'section',
					label:'پیوند بخش (اختیاری)',
					tooltip:'The section heading on your talk page where you left a message. Leave empty for no section to be linked.',
					value: Twinkle.talkback.prev_section
				} );
			break;
		case 'usertalk':
			work_area.append( { 
					type:'input',
					name:'page',
					label:'کاربر',
					tooltip:'The username of the user on whose talk page you left a message.',
					value: Twinkle.talkback.prev_page
				} );
			
			work_area.append( { 
					type:'input',
					name:'section',
					label:'پیوند بخش (اختیاری)',
					tooltip:'The section heading on the page where you left a message. Leave empty for no section to be linked.',
					value: Twinkle.talkback.prev_section
				} );
			break;
		case 'an':
			var noticeboard = work_area.append( {
					type: 'select',
					name: 'noticeboard',
					label: 'بیلدیریلر تابلوسو:'
				} );
			noticeboard.append( {
					type: 'option',
					label: "وپ:ابت (ایداره‌چیلر بیلدیری تابلوسو)",
					value: "ویکی‌پدیا:ایداره‌چیلر بیلدیری تابلوسو"
				} );
			noticeboard.append( {
					type: 'option',
					label: 'وپ:ابت (ویکی‌پدیا:ایداره‌چیلر بیلدیری تابلوسو/۳ قایتاریش پوزونتوسو)',
					selected: true,
					value: "ویکی‌پدیا:ایداره‌چیلر بیلدیری تابلوسو/۳ قایتاریش پوزونتوسو"
				} );
			work_area.append( {
					type:'input',
					name:'section',
					label:'پیوند بخش',
					tooltip:'The heading of the relevant AN or ANI thread.',
					value: Twinkle.talkback.prev_section
				} );
			break;
		case 'other':
			work_area.append( { 
					type:'input',
					name:'page',
					label:'صفحه‌نین آدی',
					tooltip:'The full page name where you left the message.  For example: "Wikipedia talk:Twinkle".',
					value: Twinkle.talkback.prev_page
				} );
			
			work_area.append( { 
					type:'input',
					name:'section',
					label:'پیوند بخش (اختیاری)',
					tooltip:'The section heading on the page where you left a message. Leave empty for no section to be linked.',
					value: Twinkle.talkback.prev_section
				} );
			break;
	}

	if (value !== "an") {
		work_area.append( { type:'textarea', label:'آیری پیام (ایستگه باغلی):', name:'message', tooltip:'An additional message that you would like to leave below the talkback template.  Your signature will be added to the end of the message if you leave one.' } );
	}

	work_area = work_area.render();
	root.replaceChild( work_area, old_area );
	if (root.message) {
		root.message.value = Twinkle.talkback.prev_message;
	}
};

Twinkle.talkback.callback.evaluate = function friendlytalkbackCallbackEvaluate(e) {
	var tbtarget = e.target.getChecked( 'tbtarget' )[0];
	var page = null;
	var section = e.target.section.value;
	if( tbtarget === 'usertalk' || tbtarget === 'other' ) {
		page = e.target.page.value;
		
		if( tbtarget === 'usertalk' ) {
			if( !page ) {
				alert( 'You must specify the username of the user whose talk page you left a message on.' );
				return;
			}
		} else {
			if( !page ) {
				alert( 'You must specify the full page name when your message is not on a user talk page.' );
				return;
			}
		}
	} else if (tbtarget === "an") {
		page = e.target.noticeboard.value;
	}

	var message;
	if (e.target.message) {
		message = e.target.message.value;
	}

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

	Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
	Morebits.wiki.actionCompleted.notice = "اتیکت وۇرولدو، دانیشیق صفحه‌سی یئنیلنمه‌سی اۆچون نئچه لحظه دؤزون...";

	var talkpage = new Morebits.wiki.page(mw.config.get('wgPageName'), "افزودن بازبحث");
	var tbPageName = (tbtarget === 'mytalk') ? mw.config.get('wgUserName') : page;

	var text;
	if ( tbtarget === "an" ) {
		text = "\n== " + Twinkle.getFriendlyPref('adminNoticeHeading') + " ==\n{{جا:ANI-notice|زیرعنوان=";
		text += section + "|تابلو=" + tbPageName + "}} ~~~~";

		talkpage.setEditSummary("اطلاع‌رسانی درباره بحث وپ:تام" + Twinkle.getPref('summaryAd'));
	} else {
		//clean talkback heading: strip section header markers, were erroneously suggested in the documentation
		text = '\n==' + Twinkle.getFriendlyPref('talkbackHeading').replace(/^\s*=+\s*(.*?)\s*=+$\s*/, "$1") + '==\n{{بازبحث|';
		text += tbPageName;

		if( section ) {
			text += '|' + section;
		}

		text += '|ts=~~~~~}}';

		if( message ) {
			text += '\n' + message + '  ~~~~';
		} else if( Twinkle.getFriendlyPref('insertTalkbackSignature') ) {
			text += '\n~~~~';
		}

		talkpage.setEditSummary("بازبحث ([[" + (tbtarget === 'other' ? '' : 'بحث کاربر:') + tbPageName +
			(section ? ('#' + section) : '') + "]])" + Twinkle.getPref('summaryAd'));
	}

	talkpage.setAppendText(text);
	talkpage.setCreateOption('recreate');
	talkpage.setMinorEdit(Twinkle.getFriendlyPref('markTalkbackAsMinor'));
	talkpage.setFollowRedirect(true);
	talkpage.append();
};

/*
 ****************************************
 *** friendlywelcome.js: Welcome module
 ****************************************
 * Mode of invocation:     Tab ("Wel"), or from links on diff pages
 * Active on:              Existing user talk pages, diff pages
 * Config directives in:   FriendlyConfig
 */

Twinkle.welcome = function friendlywelcome() {
	if( Morebits.queryString.exists( 'friendlywelcome' ) ) {
		if( Morebits.queryString.get( 'friendlywelcome' ) === 'auto' ) {
			Twinkle.welcome.auto();
		} else {
			Twinkle.welcome.semiauto();
		}
	} else {
		Twinkle.welcome.normal();
	}
};

Twinkle.welcome.auto = function() {
	if( Morebits.queryString.get( 'action' ) !== 'edit' ) {
		// userpage not empty, aborting auto-welcome
		return;
	}

	Twinkle.welcome.welcomeUser();
};

Twinkle.welcome.semiauto = function() {
	Twinkle.welcome.callback( mw.config.get( 'wgTitle' ).split( '/' )[0].replace( /\"/, "\\\"") );
};

Twinkle.welcome.normal = function() {
	if( Morebits.queryString.exists( 'diff' ) ) {
		// check whether the contributors' talk pages exist yet
		var $oList = $("div#mw-diff-otitle2 span.mw-usertoollinks a.new:contains(talk)").first();
		var $nList = $("div#mw-diff-ntitle2 span.mw-usertoollinks a.new:contains(talk)").first();

		if( $oList.length > 0 || $nList.length > 0 ) {
			var spanTag = function( color, content ) {
				var span = document.createElement( 'span' );
				span.style.color = color;
				span.appendChild( document.createTextNode( content ) );
				return span;
			};

			var welcomeNode = document.createElement('strong');
			var welcomeLink = document.createElement('a');
			welcomeLink.appendChild( spanTag( 'Black', '[' ) );
			welcomeLink.appendChild( spanTag( 'Goldenrod', 'welcome' ) );
			welcomeLink.appendChild( spanTag( 'Black', ']' ) );
			welcomeNode.appendChild(welcomeLink);

			if( $oList.length > 0 ) {
				var oHref = $oList.attr("href");

				var oWelcomeNode = welcomeNode.cloneNode( true );
				oWelcomeNode.firstChild.setAttribute( 'href', oHref + '&' + Morebits.queryString.create( { 'friendlywelcome': Twinkle.getFriendlyPref('quickWelcomeMode')==='auto'?'auto':'norm' } ) + '&' + Morebits.queryString.create( { 'vanarticle': mw.config.get( 'wgPageName' ).replace(/_/g, ' ') } ) );
				$oList[0].parentNode.parentNode.appendChild( document.createTextNode( ' ' ) );
				$oList[0].parentNode.parentNode.appendChild( oWelcomeNode );
			}

			if( $nList.length > 0 ) {
				var nHref = $nList.attr("href");

				var nWelcomeNode = welcomeNode.cloneNode( true );
				nWelcomeNode.firstChild.setAttribute( 'href', nHref + '&' + Morebits.queryString.create( { 'friendlywelcome': Twinkle.getFriendlyPref('quickWelcomeMode')==='auto'?'auto':'norm' } ) + '&' + Morebits.queryString.create( { 'vanarticle': mw.config.get( 'wgPageName' ).replace(/_/g, ' ') } ) );
				$nList[0].parentNode.parentNode.appendChild( document.createTextNode( ' ' ) );
				$nList[0].parentNode.parentNode.appendChild( nWelcomeNode );
			}
		}
	}
	if( mw.config.get( 'wgNamespaceNumber' ) === 3 ) {
		var username = mw.config.get( 'wgTitle' ).split( '/' )[0].replace( /\"/, "\\\""); // only first part before any slashes
		$(twAddPortletLink("#", "خوش گلدینیز", "friendly-welcome", "خوش‌آمدگویی به کاربر", "")).click(function() { Twinkle.welcome.callback(username); });
	}
};

Twinkle.welcome.welcomeUser = function welcomeUser() {
	Morebits.status.init( document.getElementById('bodyContent') );

	var params = {
		value: Twinkle.getFriendlyPref('quickWelcomeTemplate'),
		article: Morebits.queryString.exists( 'vanarticle' ) ? Morebits.queryString.get( 'vanarticle' ) : '',
		mode: 'auto'
	};

	Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
	Morebits.wiki.actionCompleted.notice = "خوش‌آمدگویی انجام شد، دانیشیق صفحه‌سی یئنیلنمه‌سی اۆچون نئچه لحظه دؤزون...";

	var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "User talk page modification");
	wikipedia_page.setFollowRedirect(true);
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.load(Twinkle.welcome.callbacks.main);
};

Twinkle.welcome.callback = function friendlywelcomeCallback( uid ) {
	if( uid === mw.config.get('wgUserName') ){
		alert( 'You\'re very welcome! Very welcome indeed!' );
		return;
	}
	
	var Window = new Morebits.simpleWindow( 600, 400 );
	Window.setTitle( "Welcome user" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "خوش‌آمدگویی", "وپ:خوش" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.welcome.callback.evaluate, 'change' );

	form.append( {
			type: 'input',
			name: 'article',
			label: 'پیوند مقاله‌ها (درصورتی که از الگو استفاده کرده‌اند)',
			value:( Morebits.queryString.exists( 'vanarticle' ) ? Morebits.queryString.get( 'vanarticle' ) : '' ),
			tooltip: 'An article might be linked to the welcome if the template supports it. Leave empty for no artice to be linked.  Templates that support a linked article are marked with an asterisk.  Ignored for templates that do not support a linked article. ',
			event: function( event ) {
				event.stopPropagation();
			}
		} );

	form.append( { type:'header', label:'Simple templates' } );
	form.append( { type: 'radio', name: 'simple', list: Twinkle.welcome.standardList } );

	if( Twinkle.getFriendlyPref('customWelcomeList').length ) {
		form.append( { type:'header', label:'Custom templates' } );
		form.append( { type: 'radio', name: 'custom', list: Twinkle.getFriendlyPref('customWelcomeList') } );
	}

	form.append( { type:'header', label:'Welcoming committee templates' } );
	form.append( { type: 'radio', name: 'welcomingCommittee', list: Twinkle.welcome.welcomingCommitteeList } );

	form.append( { type:'header', label:'Potential problem user templates' } );
	form.append( { type: 'radio', name: 'problem', list: Twinkle.welcome.problemList } );

	form.append( { type:'header', label:'Anonymous user templates' } );
	form.append( { type: 'radio', name: 'anonymous', list: Twinkle.welcome.anonymousList } );

	var result = form.render();
	Window.setContent( result );
	Window.display();
};

Twinkle.welcome.standardList = [
	{
		label: '{{خوش گلدینیز}}: standard welcome*',
		value: 'Welcome'
	},
	{ 
		label: '{{قیسا خوش گلدینیز}}: قیسا خوش گلدینیز',
		value: 'Welcomeshort',
		tooltip: 'شامل عنوان بخش. '
	}
];

Twinkle.welcome.welcomingCommitteeList = [
	{ 
		label: '{{Wel}}: similar to {{خوش گلدینیز}}, but automatically identifies anonymous and registered users*',
		value: 'Wel',
		tooltip: 'این الگو بررسی می‌کند که آیا نام کاربری شامل هیچ حرفی هست یا نه. اگر شامل حرف باشد، {{Welcome-reg}} نمایش داده خواهد شد. اگر حرف نداشته باشد، {{Welcome-anon}} به نمایش در می‌آید.'

	},
	{ 
		label: '{{W-basic}}: standard template, similar to {{خوشامد}} with additional options',
		value: 'W-basic',
		tooltip: 'This template is similar to {{خوشامد}} but supports many different options.  Includes a signature.'
	}
];

Twinkle.welcome.problemList = [
	{ 
		label: '{{Welcomelaws}}: خوش‌آمد گویی همراه با توضیحات مربوط به زمین ماسه‌بازی، دیدگاه بی‌طرف، حق تکثیر',
		value: 'Welcomelaws'
	},
	{ 
		label: '{{Firstarticle}}: برای کسی که اولین مقاله‌اش، با راهنمای ایجاد مقالات تطبیق ندارد*',
		value: 'Firstarticle'
	}
];

Twinkle.welcome.anonymousList = [
	{
		label: '{{Welcome-anon}}: برای کاربران ناشناس; جهت گرفتن نام کاربری تشویق می‌کند*',
		value: 'Welcome-anon'
	},
	{
		label: '{{Welcomeanon2}}: مانند {{Welcome-anon}} به همراه توضیحات و راهنمایی ها*',
		value: 'Welcomeanon2',
		tooltip: 'شامل عنوان بخش. '
	}
];

// Set to true if template does not already have heading
Twinkle.welcome.headingHash = {
	'Welcome': true,
	'Welcomeshort': false,
};

// Set to true if template already has signature
Twinkle.welcome.signatureHash = {
	'Welcome': false,
	'Welcomeshort': false,
};

/* Set to true if template supports article
 * name from art template parameter 
 */
Twinkle.welcome.artHash = {
	'Welcome': true,
	'Welcomeshort': false,
};

/* Set to true if template supports article
 * name from vanarticle template parameter 
 */
Twinkle.welcome.vandalHash = {
	'Welcome': false,
	'Welcomeshort': false,
};

Twinkle.welcome.callbacks = {
	main: function( pageobj ) {
		var params = pageobj.getCallbackParameters();
		var oldText = pageobj.getPageText();
		
		// abort if mode is auto and form is not empty
		if( pageobj.exists() && params.mode === 'auto' ) {
			Morebits.status.info( 'Warning', 'User talk page not empty; aborting automatic welcome' );
			Morebits.wiki.actionCompleted.event();
			return;
		}
		
		var text = '';
		Morebits.status.info( 'info', 'در حال افزودن الگو خوش‌آمدگویی به  ' +
			( Twinkle.getFriendlyPref('topWelcomes') ? 'top' : 'bottom' ) +
			' صفحهٔ بحث کاربر' );
		if( !Twinkle.getFriendlyPref('topWelcomes') ) {
			text += oldText + '\n';
		}
		
		if( Twinkle.welcome.headingHash[ params.value ] && Twinkle.getFriendlyPref('insertHeadings') ) {
			Morebits.status.info( 'info', 'در حال ساخت عنوان جدید برای خوش‌آمدگویی' );
			// strip section header markers from pref, to preserve backwards compatibility
			text += "== " + Twinkle.getFriendlyPref('welcomeHeading').replace(/^\s*=+\s*(.*?)\s*=+$\s*/, "$1") + " ==\n";
		}
		
		Morebits.status.info( 'info', ' در حال افزودن {{' + params.value + '}} الگوی خوش‌آمدگویی' );
		text += '{{جا:' + params.value;
		
		if( Twinkle.welcome.artHash[ params.value ] ) {
			if( Twinkle.getFriendlyPref('insertUsername') && params.value.substring(2,0) !== 'W-' ) {
				Morebits.status.info( 'Notice', 'در حال افزودن نام کاربری شما به الگو' );
				text += '|' + mw.config.get('wgUserName');
			}
			
			if( params.article ) {
				Morebits.status.info( 'info', 'درحال افزودن پیوند مقاله به الگو' );
				text += '|art=' + params.article;
			}
		} else if( Twinkle.welcome.vandalHash[ params.value ] ) {
			if( params.article ) {
				Morebits.status.info( 'info', 'درحال افزودن پیوند مقاله به الگو' );
			}
			text += '|' + params.article;
			
			if( Twinkle.getFriendlyPref('insertUsername') ) {
				Morebits.status.info( 'info', 'در حال افزودن نام کاربری شما به الگو' );
				text += '|' + mw.config.get('wgUserName');
			}
		} else if( Twinkle.getFriendlyPref('insertUsername') ) {
			Morebits.status.info( 'info', 'در حال افزودن نام کاربری شما به الگو' );
			text += '|' + mw.config.get('wgUserName');
		} 
		
		text += '}}';
		
		if( !Twinkle.welcome.signatureHash[ params.value ] && Twinkle.getFriendlyPref('insertSignature') ) {
			Morebits.status.info( 'info', 'درحال افزودن امضا شما به خوش‌آمدگویی' );
			text += ' \n~~~~';
		}
		
		if( Twinkle.getFriendlyPref('topWelcomes') ) {
			text += '\n\n' + oldText;
		}
 
		var summaryText = "الگوی" + ( Twinkle.getFriendlyPref('maskTemplateInSummary') ? 'خوش‌آمدید' : ( '{{[[الگو:' + params.value + '|' + params.value + ']]}}' ) ) +
			" به بحث کاربر افزوده شد";
		pageobj.setPageText(text);
		pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
		pageobj.setMinorEdit(Twinkle.getFriendlyPref('markWelcomesAsMinor'));
		pageobj.setWatchlist(Twinkle.getFriendlyPref('watchWelcomes'));
		pageobj.setCreateOption('recreate');
		pageobj.save();
	}
};

Twinkle.welcome.callback.evaluate = function friendlywelcomeCallbackEvaluate(e) {
	// Ignore if a change to the text field triggered this event
	if( e.target.name === 'article' ) {
		return;
	}
	
	var params = {
		value: e.target.values,
		article: e.target.form.article.value,
		mode: 'manual'
	};

	Morebits.simpleWindow.setButtonsEnabled( false );
	Morebits.status.init( e.target.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.setFollowRedirect(true);
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.load(Twinkle.welcome.callbacks.main);
};

/*
 ****************************************
 *** twinklearv.js: ARV module
 ****************************************
 * Mode of invocation:     Tab ("ARV")
 * Active on:              Existing and non-existing user pages, user talk pages, contributions pages
 * Config directives in:   TwinkleConfig
 */

Twinkle.arv = function twinklearv() {
	if ( mw.config.get('wgNamespaceNumber') === 2 || mw.config.get('wgNamespaceNumber') === 3 || 
	    ( mw.config.get('wgNamespaceNumber') === -1 && mw.config.get('wgCanonicalSpecialPageName') === "Contributions" )) {

		// If we are on the contributions page, need to parse some then
		var username;
		if( mw.config.get('wgNamespaceNumber') === -1 && mw.config.get('wgCanonicalSpecialPageName') === "Contributions" ) {
			username = decodeURIComponent(/wiki\/Special:Log\/(.+)$/.exec($('div#contentSub a[title^="Special:Log"]').last().attr("href").replace(/_/g, "%20"))[1]);
		} else {
			username = mw.config.get('wgTitle').split( '/' )[0]; // only first part before any slashes
		}

		if ( !username ) {
			return;
		}

		var title = Morebits.isIPAddress( username ) ? 'Report IP to administrators' : 'Report user to administrators';
		
		if (twinkleUserAuthorized) {
			$(twAddPortletLink("#", "شیکایت", "tw-arv", title, "" )).click(function() { Twinkle.arv.callback(username.replace( /\"/g, "\\\"")); } );
		} else {
			$(twAddPortletLink("#", 'شیکایت', 'tw-arv', title, "" )).click(function() { alert("سیزین ایشلدن حسابینیز توینکلی ایشلتمگه تجروبه‌سیزدیر."); } );
		}
	}
};

Twinkle.arv.callback = function ( uid ) {
	if( uid === mw.config.get('wgUserName') ){
		alert( 'اؤزونوزدن شیکایت ائتمک ایسته‌ییرسینیزمی؟' );
		return;
	}

	var Window = new Morebits.simpleWindow( 600, 500 );
	Window.setTitle( "بۇ ایشلدندن شیکایت ائت" ); //Backronym
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "واندالیزم", "وپ:واندالیزم" );
	Window.addFooterLink( "بازرسی کاربر", "وپ:دبک" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.arv.callback.evaluate );
	var categories = form.append( {
			type: 'select',
			name: 'category',
			label: 'شیکایت نَدنی سئچین:: ',
			event: Twinkle.arv.callback.changeCategory
		} );
	/*categories.append( {
			type: 'option',
			label: 'خرابکاری (وپ:تام)',
			value: 'aiv'
		} );*/
	categories.append( {
			type: 'option',
			label: 'غئیر موناسیب آد (وپ:ایشلدن آدی)',
			value: 'username'
		} );
	categories.append( {
			type: 'option',
			label: 'بازرسی چند کاربر (وپ:دبک)',
			value: 'sock'
		} );
	categories.append( {
			type: 'option',
			label: 'بازرسی دو کاربر (وپ:دبک)',
			value: 'puppet'
		} );
	form.append( {
			type: 'field',
			label:'ایش یئری',
			name: 'work_area'
		} );
	form.append( { type:'submit' } );
	form.append( {
			type: 'hidden',
			name: 'uid',
			value: uid
		} );
	
	var result = form.render();
	Window.setContent( result );
	Window.display();

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

Twinkle.arv.callback.changeCategory = function (e) {
	var value = e.target.value;
	var root = e.target.form;
	var old_area;
	for( var i = 0; i < root.childNodes.length; ++i ) {
		var node = root.childNodes[i];
		if (node instanceof Element && node.getAttribute( 'name' ) === 'work_area') {
			old_area = node;
			break;
		}
	}
	var work_area = null;

	switch( value ) {
	case 'aiv':
		/* falls through */
	default:
		work_area = new Morebits.quickForm.element( { 
				type: 'field',
				label: 'کاربر را به خاطر خرابکاری معرفی کن',
				name: 'work_area'
			} );
		work_area.append( {
				type: 'input',
				name: 'page',
				label: 'صفحه پیوندداده‌شدهٔ اولیه: ',
				tooltip: 'Leave blank to not link to the page in the report',
				value: Morebits.queryString.exists( 'vanarticle' ) ? Morebits.queryString.get( 'vanarticle' ) : '',
				event: function(e) {
					var value = e.target.value;
					var root = e.target.form;
					if( value === '' ) {
						root.badid.disabled = root.goodid.disabled = true;
					} else {
						root.badid.disabled = false;
						root.goodid.disabled = root.badid.value === '';
					}
				}
			} );
		work_area.append( {
				type: 'input',
				name: 'badid',
				label: 'شناسه نسخه صفحه مورد نظر در زمان خرابکاری: ',
				tooltip: 'Leave blank for no diff link',
				value: Morebits.queryString.exists( 'vanarticlerevid' ) ? Morebits.queryString.get( 'vanarticlerevid' ) : '',
				disabled: !Morebits.queryString.exists( 'vanarticle' ),
				event: function(e) {
					var value = e.target.value;
					var root = e.target.form;
					root.goodid.disabled = value === '';
				}
			} );
		work_area.append( {
				type: 'input',
				name: 'goodid',
				label: 'شناسهٔ آخرین نسخهٔ صحیح صفحه مورد نظر قبل از خرابکاری: ',
				tooltip: 'Leave blank for diff link to previous revision',
				value: Morebits.queryString.exists( 'vanarticlegoodrevid' ) ? Morebits.queryString.get( 'vanarticlegoodrevid' ) : '',
				disabled: !Morebits.queryString.exists( 'vanarticle' ) || Morebits.queryString.exists( 'vanarticlerevid' )
			} );
		work_area.append( {
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{ 
						label: 'Vandalism after final (level 4 or 4im) warning given',
						value: 'final'
					},
					{ 
						label: 'Vandalism after recent (within 1 day) release of block',
						value: 'postblock'
					},
					{ 
						label: 'Evidently a vandalism-only account',
						value: 'vandalonly',
						disabled: Morebits.isIPAddress( root.uid.value )
					},
					{ 
						label: 'Account is evidently a spambot or a compromised account',
						value: 'spambot'
					},
					{ 
						label: 'Account is a promotion-only account',
						value: 'promoonly'
					}
				]
			} );
		work_area.append( {
				type: 'textarea',
				name: 'reason',
				label: 'Comment: '
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;
	case 'username':
		work_area = new Morebits.quickForm.element( { 
				type: 'field',
				label: 'غئیرموناسیب ایشلدن آدلاری بیلیندیر',
				name: 'work_area'
			} );
		work_area.append ( { 
				type:'header', 
				label:'معیار',
				tooltip: 'ویکی‌پدیا نام‌های گمراه‌کننده، تبلیغاتی، توهین‌آمیز و نفاق‌افکن را مجاز نمی‌داند. نام دامنه و نشانی ایمیل نیز ممنوع هستند. این معیار در هر دو مورد نام کاربری و امضا اعمال می‌شود. نام‌های کاربری که در زبان دیگری نامناسب هستند، در اینجا نیز نامناسب شمرده می‌شوند.'
			} );
		work_area.append( {
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'آلدادیجی ایشلدن آدلار',
						value: 'misleading',
						tooltip: 'ایشلدنه گؤره آیری‌لاری ایشتیباها سالان آدلار.'
					},
					{ 
						label: 'تبلیغاتی ایشلدن آدلار',
						value: 'promotional',
						tooltip: 'بیر شیرکت، تشکیلات، سایت، محصول و ... نی تبلیغ ائدن ایشلدن آدلاری'
					},
					{ 
						label: 'توهین‌لی ایشلدن آدلار',
						value: 'offensive',
						tooltip: 'دییشدیرنلرین بیر ساییسینا توهین نظره گلن ایشلدن آدلار.'
					},
					{ 
						label: ' تفرقه سالان ایشلدن آدلار',
						value: 'disruptive',
						tooltip: 'نیقاق و قاریشیقلیق سلان ایشلدن آدلار.'
					}
				]
			} );
		work_area.append( {
				type: 'textarea',
				name: 'reason',
				label: 'توضیح:'
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;

	case 'puppet':
		work_area = new Morebits.quickForm.element( { 
				type: 'field',
				label: 'گزارش زاپاس مشکوک',
				name: 'work_area'
			} );
		work_area.append(
			{
				type: 'input',
				name: 'sockmaster',
				label: 'زاپاس‌باز',
				tooltip: 'The username of the sockpuppeteer (sockmaster) without the User:-prefix'
			}
		);
		work_area.append( {
				type: 'textarea',
				label: 'مدرک:',
				name: 'evidence',
				tooltip: 'Enter your evidence. It should make clear that each of these users is likely to be abusing multiple accounts. Usually this means diffs, page histories or other information that justifies why the users are a) the same and b) disruptive. This should purely be evidence and information needed to judge the matter. Avoid all other discussion that is not evidence of sockpuppetry or other multiple account abuse.'
			} );
		work_area.append( {
				type: 'checkbox',
				list: [
					{
						label: 'درخواست بازرسی کاربر',
						name: 'checkuser',
						tooltip: 'CheckUser is a tool used to obtain technical evidence related to a sock-puppetry allegation. It will not be used without good cause, which you must clearly demonstrate. Make sure your evidence explains why CheckUser is appropriate.'
					},
					{
						label: 'اطلاع‌رسانی به کاربر مورد شکایت',
						name: 'notify',
						tooltip: 'Notification is not mandatory. In many cases, especially of chronic sockpuppeteers, notification may be counterproductive. However, especially in less egregious cases involving users who has not been reported before, notification may make the cases fairer and also appear to be fairer in the eyes of the accused. Use your judgment.'
					}
				]
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;
	case 'sock':
		work_area = new Morebits.quickForm.element( { 
				type: 'field',
				label: 'گزارش کاربر مشکوک به زاپاس‌بازی',
				name: 'work_area'
			} );
		work_area.append(
			{
				type: 'dyninput',
				name: 'sockpuppet',
				label: 'سوءاستفاده‌کنندگان از حساب‌های کاربری زاپاس',
				sublabel: 'زاپاس: ',
				tooltip: 'The username of the sockpuppet without the User:-prefix',
				min: 2
			}
		);
		work_area.append( {
				type: 'textarea',
				label: 'مدرک:',
				name: 'evidence',
				tooltip: 'Enter your evidence. It should make clear that each of these users is likely to be abusing multiple accounts. Usually this means diffs, page histories or other information that justifies why the users are a) the same and b) disruptive. This should purely be evidence and information needed to judge the matter. Avoid all other discussion that is not evidence of sockpuppetry or other multiple account abuse.'
			} );
		work_area.append( {
				type: 'checkbox',
				list: [ {
					label: 'درخواست بازرسی کاربر',
					name: 'checkuser',
					tooltip: 'CheckUser is a tool used to obtain technical evidence related to a sock-puppetry allegation. It will not be used without good cause, which you must clearly demonstrate. Make sure your evidence explains why CheckUser is appropriate.'
				}, {
					label: 'اطلاع‌رسانی به کاربرهای مورد شکایت',
					name: 'notify',
					tooltip: 'Notification is not mandatory. In many cases, especially of chronic sockpuppeteers, notification may be counterproductive. However, especially in less egregious cases involving users who has not been reported before, notification may make the cases fairer and also appear to be fairer in the eyes of the accused. Use your judgment.'
				} ]
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;
	}
};

Twinkle.arv.callback.evaluate = function(e) {

	var form = e.target;
	var reason = "";
	var comment = "";
	if ( form.reason ) {
		comment = form.reason.value;
	}
	var uid = form.uid.value;

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

		// Report user for vandalism
		case 'aiv':
			/* falls through */
		default:
			types = form.getChecked( 'arvtype' );
			if( !types.length && comment === '' ) {
				alert( 'You must specify some reason' );
				return;
			}

			types = types.map( function(v) {
					switch(v) {
						case 'final':
							return 'vandalism after final warning';
						case 'postblock':
							return 'vandalism after recent release of block';
						case 'spambot':
							return 'account is evidently a spambot or a compromised account';
						case 'vandalonly':
							return 'actions evidently indicate a vandalism-only account';
						case 'promoonly':
							return 'account is being used only for promotional purposes';
						default:
							return 'unknown reason';
					}
				} ).join( '; ' );


			if ( form.page.value !== '' ) {
			
				// add a leading : on linked page namespace to prevent transclusion
				reason = 'روی [[' + form.page.value.replace( /^(Image|Category|File|رده|پرونده|تصویر):/i, ':$1:' ) + ']]';

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

			if ( types ) {
				reason += " " + types;
			}
			if (comment !== "" ) {
				reason += (reason === "" ? "" : ". ") + comment;
			}
			reason += ". ~~~~";
			reason = reason.replace(/\r?\n/g, "\n");  // indent newlines

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

			Morebits.wiki.actionCompleted.redirect = "ویکی\u200cپدیا:ایداره‌چیلر بیلدیری تابلوسو";
			Morebits.wiki.actionCompleted.notice = "گزارش داده شد";

			var aivPage = new Morebits.wiki.page( 'ویکی\u200cپدیا:ایداره‌چیلر بیلدیری تابلوسو', 'شکایت نوشته شد' );
			aivPage.setPageSection( 1 );
			aivPage.setFollowRedirect( true );
			
			aivPage.load( function() {
				var text = aivPage.getPageText();

				// check if user has already been reported
				if (new RegExp( "\\{\\{\\s*(?:(?:آی‌پی)?خرابکار|کاربر)\\s*\\|\\s*(?:1=)?\\s*" + RegExp.escape( uid, true ) + "\\s*\\}\\}" ).test(text)) {
					aivPage.getStatusElement().info( 'Report already present, will not add a new one' );
					return;
				}
				aivPage.getStatusElement().status( 'افزودن گزارش...' );
				aivPage.setEditSummary( 'گزارش[[ویژه:مشارکت‌ها/' + uid + '|' + uid + ']].' + Twinkle.getPref('summaryAd') );
				aivPage.setAppendText( '\n*{{' + ( Morebits.isIPAddress( uid ) ? 'آی‌پی خرابکار' : 'خرابکار' ) + '|' + (/\=/.test( uid ) ? '1=' : '' ) + uid + '}} &ndash; ' + reason );
				aivPage.append();
			} );
			break;
			
		// Report inappropriate username
		case 'username':
			types = form.getChecked( 'arvtype' );
			if( !types.length ) {
				alert( 'باید حداقل یک گزینه را انتخاب کنید.' );
				return;
			}

			if ( types.length <= 2 ) {
				types = types.join( ' و ' );
			} else {
				types = [ types.slice( 0, -1 ).join( '، ' ), types.slice( -1 ) ].join( ' و ' );
			}
			var article = 'یک';
            reason = "== [[ایشلدن:"+ uid +"]] ==\n" ;
			reason += "*{{user-uaa|1=" + uid + "}}\n" ;
			if (comment !== '' ) {
				reason += Morebits.string.toUpperCaseFirstChar(comment) + ". ";
			}
			reason += "~~~~";
			reason = reason.replace(/\r?\n/g, "\n");  // indent newlines

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

			Morebits.wiki.actionCompleted.redirect = "ویکی\u200cپدیا:ایداره‌چیلر بیلدیری تابلوسو/غئیر موناسیب ایشلدن آدلاری";
			Morebits.wiki.actionCompleted.notice = "گزارش داده شد";

			var uaaPage = new Morebits.wiki.page( 'ویکی\u200cپدیا:ایداره‌چیلر بیلدیری تابلوسو/غئیر موناسیب ایشلدن آدلاری' );
			uaaPage.setFollowRedirect( true );

			uaaPage.load( function() {
				var text = uaaPage.getPageText();
				
				// check if user has already been reported
                               //نام الگوی گزارش user-uaa هست
				if (new RegExp( "\\{\\{\\s*user-uaa\\s*\\|\\s*(1\\s*=\\s*)?" + RegExp.escape(uid, true) + "\\s*(\\||\\})" ).test(text)) {
					uaaPage.getStatusElement().error( 'نام کاربر در آنجا موجود است' );
					return;
				}
				uaaPage.getStatusElement().status( 'افزودن گزارش جدید...' );
				uaaPage.setEditSummary( 'گزارش [[ویژه:مشارکت‌ها/' + uid + '|' + uid + ']].'+ Twinkle.getPref('summaryAd') );
				uaaPage.setPageText( text+'\n'+ reason)
				uaaPage.save();
			} );
			break;
			
		// WP:SPI
		case "sock":
			/* falls through */
		case "puppet":
			var sockParameters = {
				evidence: form.evidence.value.rtrim(), 
				checkuser: form.checkuser.checked, 
				notify: form.notify.checked
			};

			var puppetReport = form.category.value === "puppet";
			if (puppetReport && !(form.sockmaster.value.trim())) {
				if (!confirm("You have not entered a sockmaster account for this puppet. Do you want to report this account as a sockpuppeteer instead?")) {
					return;
				}
				puppetReport = false;
			}

			sockParameters.uid = puppetReport ? form.sockmaster.value.rtrim() : uid;
			sockParameters.sockpuppets = puppetReport ? [uid] : $.map( $('input:text[@name=sockpuppet]',form), function(o){ return $(o).val(); });

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

	}
};

Twinkle.arv.processSock = function( params ) {
	Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "عمل انجام شد."
	
	// notify all user accounts if requested
	if (params.notify && params.sockpuppets.length>0) {
	
		var notifyEditSummary = "اطلاع‌رسانی درباره درخواست بازرسی کاربر" + Twinkle.getPref('summaryAd');
		var notifyText = "\n\n{{جا:socksuspectnotice|1=" + params.uid + "}} ~~~~";
		
		// notify user's master account
		var masterTalkPage = new Morebits.wiki.page( 'User talk:' + params.uid, 'اطلاع‌رسانی به کاربر مظنون به زاپاس‌بازی' );
		masterTalkPage.setFollowRedirect( true );
		masterTalkPage.setEditSummary( notifyEditSummary );
		masterTalkPage.setAppendText( notifyText );
		masterTalkPage.append();

		var statusIndicator = new Morebits.status( 'اطلاع‌رسانی به کاربر مظنون به زاپاس‌بازی', '0%' );
		var total = params.sockpuppets.length;
		var current =   0;
		
		// display status of notifications as they progress
		var onSuccess = function( sockTalkPage ) {
			var now = parseInt( 100 * ++(current)/total, 10 ) + '%';
			statusIndicator.update( now );
			sockTalkPage.getStatusElement().unlink();
			if ( current >= total ) {
				statusIndicator.info( now + ' (کامل شد)' );
			}
		};
		
		var socks = params.sockpuppets;

		// notify each puppet account
		for( var i = 0; i < socks.length; ++i ) {
			var sockTalkPage = new Morebits.wiki.page( 'بحث کاربر:' + socks[i], "اطلاع‌رسانی برای " +  socks[i] );
			sockTalkPage.setFollowRedirect( true );
			sockTalkPage.setEditSummary( notifyEditSummary );
			sockTalkPage.setAppendText( notifyText );
			sockTalkPage.append( onSuccess );
		}
	}

	// prepare the SPI report
	var text = "\n\n{{جا:SPI report|socksraw=" +
		params.sockpuppets.map( function(v) { 
				return "* {{" + ( Morebits.isIPAddress( v ) ? "checkip" : "checkuser" ) + "|1=" + v + "}}";
			} ).join( "\n" ) + "\n|evidence=" + params.evidence + " \n";
		
	if ( params.checkuser ) {
		text += "|checkuser=yes";
	}
	text += "}}";

	var reportpage = 'ویکی‌پدیا:درخواست بازرسی کاربر/' + params.uid;

	Morebits.wiki.actionCompleted.redirect = reportpage;
	Morebits.wiki.actionCompleted.notice = "گزارش داده شد";

	var spiPage = new Morebits.wiki.page( reportpage, 'بازیابی صفحه بحث' );
	spiPage.setFollowRedirect( true );
	spiPage.setEditSummary( 'یک گزارش برای  [[ویژه:مشارکت‌ها/' + params.uid + '|' + params.uid + ']] افزوده‌شد.'+ Twinkle.getPref('summaryAd') );
	spiPage.setAppendText( text );
	spiPage.append();
	
	Morebits.wiki.removeCheckpoint();  // all page updates have been started
};

/*
 ****************************************
 *** twinklebatchdelete.js: Batch delete module (sysops only)
 ****************************************
 * Mode of invocation:     Tab ("D-batch")
 * Active on:              Existing and non-existing non-articles, and Special:PrefixIndex
 * Config directives in:   TwinkleConfig
 */


Twinkle.batchdelete = function twinklebatchdelete() {
	if( Morebits.userIsInGroup( 'sysop' ) && (mw.config.get( 'wgNamespaceNumber' ) > 0 || mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex') ) {
		$(twAddPortletLink("#", "حذف صفحه‌های پیوند شده", "tw-batch", "حذف صفحه‌های پیوند شده در این صفحه یا رده", "")).click(Twinkle.batchdelete.callback);
	}
};

Twinkle.batchdelete.unlinkCache = {};
Twinkle.batchdelete.callback = function twinklebatchdeleteCallback() {
	var Window = new Morebits.simpleWindow( 800, 400 );
	Window.setTitle( "حذف صفحه پیوندهای موجود در این صفحه" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.batchdelete.callback.evaluate );
	form.append( {
			type: 'checkbox',
			list: [
				{ 
					label: 'صفحه‌ها را حذف کن',
					name: 'delete_page',
					value: 'delete',
					checked: true
				},
				{
					label: 'پیوندهایی که به این صفحه هست را حذف کن',
					name: 'unlink_page',
					value: 'unlink',
					checked: true
				},
				{
					label: 'تغییرمسیرهای به این صفحه را حذف کن',
					name: 'delete_redirects',
					value: 'delete_redirects',
					checked: true
				}
			]
		} );
	form.append( {
			type: 'textarea',
			name: 'reason',
			label: 'دلیل: '
		} );

	var query;
	if( mw.config.get( 'wgNamespaceNumber' ) === Namespace.CATEGORY ) {

		query = {
			'action': 'query',
			'generator': 'categorymembers',
			'gcmtitle': mw.config.get( 'wgPageName' ),
			'gcmlimit' : Twinkle.getPref('batchMax'), // the max for sysops
			'prop': [ 'categories', 'revisions' ],
			'rvprop': [ 'size' ]
		};
	} else if( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex' ) {

		var gapnamespace, gapprefix;
		if(Morebits.queryString.exists( 'from' ) )
		{
			gapnamespace = Morebits.queryString.get( 'namespace' );
			gapprefix = Morebits.string.toUpperCaseFirstChar(Morebits.queryString.get( 'from' ));
		}
		else
		{
			var pathSplit = location.pathname.split('/');
			if (pathSplit.length < 3 || pathSplit[2] !== "Special:PrefixIndex") {
				return;
			}
			var titleSplit = pathSplit[3].split(':');
			gapnamespace = Namespace[titleSplit[0].toUpperCase()];
			if ( titleSplit.length < 2 || typeof(gapnamespace) === 'undefined' )
			{
				gapnamespace = Namespace.MAIN;
				gapprefix = pathSplit.splice(3).join('/');
			}
			else
			{
				pathSplit = pathSplit.splice(4);
				pathSplit.splice(0,0,titleSplit.splice(1).join(':'));
				gapprefix = pathSplit.join('/');
			}
		}

		query = {
			'action': 'query',
			'generator': 'allpages',
			'gapnamespace': gapnamespace ,
			'gapprefix': gapprefix,
			'gaplimit' : Twinkle.getPref('batchMax'), // the max for sysops
			'prop' : ['categories', 'revisions' ],
			'rvprop': [ 'size' ]
		};
	} else {
		query = {
			'action': 'query',
			'generator': 'links',
			'titles': mw.config.get( 'wgPageName' ),
			'gpllimit' : Twinkle.getPref('batchMax'), // the max for sysops
			'prop': [ 'categories', 'revisions' ],
			'rvprop': [ 'size' ]
		};
	}

	var wikipedia_api = new Morebits.wiki.api( 'دریافت صفحه‌ها', query, function( self ) {
			var xmlDoc = self.responseXML;
			var snapshot = xmlDoc.evaluate('//page[@ns != "' + Namespace.IMAGE + '" and not(@missing)]', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
			var list = [];
			for ( var i = 0; i < snapshot.snapshotLength; ++i ) {
				var object = snapshot.snapshotItem(i);
				var page = xmlDoc.evaluate( '@title', object, null, XPathResult.STRING_TYPE, null ).stringValue;
				var size = xmlDoc.evaluate( 'revisions/rev/@size', object, null, XPathResult.NUMBER_TYPE, null ).numberValue;

				var disputed = xmlDoc.evaluate( 'boolean(categories/cl[@title="رده:صفحه‌های نامزد حذف سریع"])', object, null, XPathResult.BOOLEAN_TYPE, null ).booleanValue;
				list.push( {label:page + ' (' + size + ' بایت)' + ( disputed ? ' (DISPUTED CSD)' : '' ), value:page, checked:!disputed });
			}
			self.params.form.append( {
					type: 'checkbox',
					name: 'pages',
					list: list
				} );
			self.params.form.append( { type:'submit' } );

			var result = self.params.form.render();
			self.params.Window.setContent( result );
		} );

	wikipedia_api.params = { form:form, Window:Window };
	wikipedia_api.post();
	var root = document.createElement( 'div' );
	Morebits.status.init( root );
	Window.setContent( root );
	Window.display();
};
/*</pre>
=== بخش ۲===
<pre>*/ 
Twinkle.batchdelete.currentDeleteCounter = 0;
Twinkle.batchdelete.currentUnlinkCounter = 0;
Twinkle.batchdelete.currentdeletor = 0;
Twinkle.batchdelete.callback.evaluate = function twinklebatchdeleteCallbackEvaluate(event) {
	Morebits.wiki.actionCompleted.notice = 'وضعیت';
	Morebits.wiki.actionCompleted.postfix = 'حذف انبوه تمام شد';
	mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' '));  // for queen/king/whatever and country!
	var pages = event.target.getChecked( 'pages' );
	var reason = event.target.reason.value;
	var delete_page = event.target.delete_page.checked;
	var unlink_page = event.target.unlink_page.checked;
	var delete_redirects = event.target.delete_redirects.checked;
	if( ! reason ) {
		return;
	}
	Morebits.simpleWindow.setButtonsEnabled( false );
	Morebits.status.init( event.target );
	if( !pages ) {
		Morebits.status.error( 'Error', 'چیزی برای حذف نبود و لغو شد' );
		return;
	}

	function toCall( work ) {
		if( work.length === 0 &&  Twinkle.batchdelete.currentDeleteCounter <= 0 && Twinkle.batchdelete.currentUnlinkCounter <= 0 ) {
			window.clearInterval( Twinkle.batchdelete.currentdeletor );
			Morebits.wiki.removeCheckpoint();
			return;
		} else if( work.length !== 0 && ( Twinkle.batchdelete.currentDeleteCounter <= Twinkle.getPref('batchDeleteMinCutOff') || Twinkle.batchdelete.currentUnlinkCounter <= Twinkle.getPref('batchDeleteMinCutOff')  ) ) {
			Twinkle.batchdelete.unlinkCache = []; // Clear the cache
			var pages = work.shift();
			Twinkle.batchdelete.currentDeleteCounter += pages.length;
			Twinkle.batchdelete.currentUnlinkCounter += pages.length;
			for( var i = 0; i < pages.length; ++i ) {
				var page = pages[i];
				var query = {
					'action': 'query',
					'titles': page
				};
				var wikipedia_api = new Morebits.wiki.api( 'چک کردن آیا ' + page + ' وجود دارد', query, Twinkle.batchdelete.callbacks.main );
				wikipedia_api.params = { page:page, reason:reason, unlink_page:unlink_page, delete_page:delete_page, delete_redirects:delete_redirects };
				wikipedia_api.post();
			}
		}
	}
	var work = pages.chunk( Twinkle.getPref('batchdeleteChunks') );
	Morebits.wiki.addCheckpoint();
	Twinkle.batchdelete.currentdeletor = window.setInterval( toCall, 1000, work );
};

Twinkle.batchdelete.callbacks = {
	main: function( self ) {
		var xmlDoc = self.responseXML;
		var normal = xmlDoc.evaluate( '//normalized/n/@to', xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;
		if( normal ) {
			self.params.page = normal;
		}
		var exists = xmlDoc.evaluate( 'boolean(//pages/page[not(@missing)])', xmlDoc, null, XPathResult.BOOLEAN_TYPE, null ).booleanValue;

		if( ! exists ) {
			self.statelem.error( "صفحه قبلاً حذف شده‌است!" );
			return;
		}

		var query, wikipedia_api;
		if( self.params.unlink_page ) {
			query = {
				'action': 'query',
				'list': 'صفحه‌هایی که به این مقاله یپوند داده‌اند',
				'blfilterredir': 'nonredirects',
				'blnamespace': [0, 100], // main space and portal space only
				'bltitle': self.params.page,
				'bllimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
			};
			wikipedia_api = new Morebits.wiki.api( 'جمع‌آوری پیوندها', query, Twinkle.batchdelete.callbacks.unlinkBacklinksMain );
			wikipedia_api.params = self.params;
			wikipedia_api.post();
		} else {
			--Twinkle.batchdelete.currentUnlinkCounter;
		}
		if( self.params.delete_page ) {
			if (self.params.delete_redirects)
			{
				query = {
					'action': 'query',
					'list': 'backlinks',
					'blfilterredir': 'redirects',
					'bltitle': self.params.page,
					'bllimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
				};
				wikipedia_api = new Morebits.wiki.api( 'دریافت تغییرمسیرها', query, Twinkle.batchdelete.callbacks.deleteRedirectsMain );
				wikipedia_api.params = self.params;
				wikipedia_api.post();
			}

			var wikipedia_page = new Morebits.wiki.page( self.params.page, 'حذف صفحه ' + self.params.page );
			wikipedia_page.setEditSummary(self.params.reason + Twinkle.getPref('deletionSummaryAd'));
			wikipedia_page.deletePage(function( apiobj ) { 
					--Twinkle.batchdelete.currentDeleteCounter;
					var link = document.createElement( 'a' );
					link.setAttribute( 'href', mw.util.getUrl(self.params.page) );
					link.setAttribute( 'title', self.params.page );
					link.appendChild( document.createTextNode( self.params.page ) );
					apiobj.statelem.info( [ 'انجام‌شد (' , link , ')' ] );
				} );	
		} else {
			--Twinkle.batchdelete.currentDeleteCounter;
		}
	},
	deleteRedirectsMain: function( self ) {
		var xmlDoc = self.responseXML;
		var snapshot = xmlDoc.evaluate('//backlinks/bl/@title', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );

		var total = snapshot.snapshotLength;

		if( snapshot.snapshotLength === 0 ) {
			return;
		}

		var statusIndicator = new Morebits.status('حذف تغییرمسیرها ' + self.params.page, '0%');

		var onsuccess = function( self ) {
			var obj = self.params.obj;
			var total = self.params.total;
			var now = parseInt( 100 * ++(self.params.current)/total, 10 ) + '%';
			obj.update( now );
			self.statelem.unlink();
			if( self.params.current >= total ) {
				obj.info( now + ' (کامل شد)' );
				Morebits.wiki.removeCheckpoint();
			}
		};


		Morebits.wiki.addCheckpoint();
		if( snapshot.snapshotLength === 0 ) {
			statusIndicator.info( '۱۰۰٪ (کامل شد)' );
			Morebits.wiki.removeCheckpoint();
			return;
		}

		var params = clone( self.params );
		params.current = 0;
		params.total = total;
		params.obj = statusIndicator;


		for ( var i = 0; i < snapshot.snapshotLength; ++i ) {
			var title = snapshot.snapshotItem(i).value;
			var wikipedia_page = new Morebits.wiki.page( title, "حذف " + title );
			wikipedia_page.setEditSummary('[[وپ:معیارهای حذف سریع|حذف سریع : تغییرمسیر به صفحه حذف شده "' + self.params.page + '"' + Twinkle.getPref('deletionSummaryAd'));
			wikipedia_page.setCallbackParameters(params);
			wikipedia_page.deletePage(onsuccess);
		}
	},
	unlinkBacklinksMain: function( self ) {
		var xmlDoc = self.responseXML;
		var snapshot = xmlDoc.evaluate('//backlinks/bl/@title', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );

		if( snapshot.snapshotLength === 0 ) {
			--Twinkle.batchdelete.currentUnlinkCounter;
			return;
		}

		var statusIndicator = new Morebits.status('برداشتن پیوند به ' + self.params.page, '0%');

		var total = snapshot.snapshotLength * 2;

		var onsuccess = function( self ) {
			var obj = self.params.obj;
			var total = self.params.total;
			var now = parseInt( 100 * ++(self.params.current)/total, 10 ) + '%';
			obj.update( now );
			self.statelem.unlink();
			if( self.params.current >= total ) {
				obj.info( now + ' (کامل شد)' );
				--Twinkle.batchdelete.currentUnlinkCounter;
				Morebits.wiki.removeCheckpoint();
			}
		};

		Morebits.wiki.addCheckpoint();
		if( snapshot.snapshotLength === 0 ) {
			statusIndicator.info( '۱۰۰٪ (کامل شد)' );
			--Twinkle.batchdelete.currentUnlinkCounter;
			Morebits.wiki.removeCheckpoint();
			return;
		}
		self.params.total = total;
		self.params.obj = statusIndicator;
		self.params.current =   0;

		for ( var i = 0; i < snapshot.snapshotLength; ++i ) {
			var title = snapshot.snapshotItem(i).value;
			var wikipedia_page = new Morebits.wiki.page( title, "Unlinking on " + title );
			var params = clone( self.params );
			params.title = title;
			params.onsuccess = onsuccess;
			wikipedia_page.setCallbackParameters(params);
			wikipedia_page.load(Twinkle.batchdelete.callbacks.unlinkBacklinks);
		}
	},
	unlinkBacklinks: function( pageobj ) {
		var params = pageobj.getCallbackParameters();
		if( ! pageobj.exists() ) {
			// we probably just deleted it, as a recursive backlink
			params.onsuccess( { params: params, statelem: pageobj.getStatusElement() } );
			Morebits.wiki.actionCompleted();
			return;
		}
		var text;

		if( params.title in Twinkle.batchdelete.unlinkCache ) {
			text = Twinkle.batchdelete.unlinkCache[ params.title ];
		} else {
			text = pageobj.getPageText();
		}
		var old_text = text;
		var wikiPage = new Mediawiki.Page( text );
		wikiPage.removeLink( params.page );

		text = wikiPage.getText();
		Twinkle.batchdelete.unlinkCache[ params.title ] = text;
		if( text === old_text ) {
			// Nothing to do, return
			params.onsuccess( { params: params, statelem: pageobj.getStatusElement() } );
			Morebits.wiki.actionCompleted();
			return;
		}
		pageobj.setEditSummary('حذف پیوندها به صفحه حذف شده' + self.params.page + Twinkle.getPref('deletionSummaryAd'));
		pageobj.setPageText(text);
		pageobj.setCreateOption('nocreate');
		pageobj.save(params.onsuccess);
	}
};
/*</pre>
=== بخش ۳===
<pre>*/ 
/*
 ****************************************
 *** twinklebatchprotect.js: Batch protect module (sysops only)
 ****************************************
 * Mode of invocation:     Tab ("P-batch")
 * Active on:              Existing project pages and user pages; existing and
 *                         non-existing categories; Special:PrefixIndex
 * Config directives in:   TwinkleConfig
 */


Twinkle.batchprotect = function twinklebatchprotect() {
	if( Morebits.userIsInGroup( 'sysop' ) && ((mw.config.get( 'wgArticleId' ) > 0 && (mw.config.get( 'wgNamespaceNumber' ) === 2 ||
		mw.config.get( 'wgNamespaceNumber' ) === 4)) || mw.config.get( 'wgNamespaceNumber' ) === 14 ||
		mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex') ) {
		$(twAddPortletLink("#", "محافظت صفحه‌های پیوند شده", "tw-pbatch", "محافظت صفحه‌های پیوند شده در این صفحه", "")).click(Twinkle.batchprotect.callback);
	}
};

Twinkle.batchprotect.unlinkCache = {};
Twinkle.batchprotect.callback = function twinklebatchprotectCallback() {
	var Window = new Morebits.simpleWindow( 800, 400 );
	Window.setTitle( "حفاظت فله‌ای" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "سیاست حفاظت", "وپ:حفاظت" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.batchprotect.callback.evaluate );
	form.append({
			type: 'checkbox',
			name: 'editmodify',
			event: Twinkle.protect.formevents.editmodify,
			list: [
				{
					label: 'تغییر سطح محافظت',
					value: 'editmodify',
					tooltip: 'Only for existing pages.',
					checked: true
				}
			]
		});
	var editlevel = form.append({
			type: 'select',
			name: 'editlevel',
			label: 'ویرایش حفاظت:',
			event: Twinkle.protect.formevents.editlevel
		});
	editlevel.append({
			type: 'option',
			label: 'همه',
			value: 'all'
		});
	editlevel.append({
			type: 'option',
			label: 'تأییدشده',
			value: 'autoconfirmed'
		});
	editlevel.append({
			type: 'option',
			label: 'مدیر',
			value: 'sysop',
			selected: true
		});
	form.append({
			type: 'select',
			name: 'editexpiry',
			label: 'سررسید:',
			event: function(e) {
				if (e.target.value === 'custom') {
					Twinkle.protect.doCustomExpiry(e.target);
				}
			},
			list: [
				{ label: '۱ ساعت', value: '1 hour' },
				{ label: '۲ ساعت', value: '2 hours' },
				{ label: '۳ ساعت', value: '3 hours' },
				{ label: '۶ ساعت', value: '6 hours' },
				{ label: '۱۲ ساعت', value: '12 hours' },
				{ label: '۱ روز', value: '1 day' },
				{ label: '۲ روز', selected: true, value: '2 days' },
				{ label: '۳ روز', value: '3 days' },
				{ label: '۴ روز', value: '4 days' },
				{ label: '۱ هفته', value: '1 week' },
				{ label: '۲ هفته', value: '2 weeks' },
				{ label: '۱ ماه', value: '1 month' },
				{ label: '۲ ماه', value: '2 months' },
				{ label: '۳ ماه', value: '3 months' },
				{ label: '۱ سال', value: '1 year' },
				{ label: 'بی‌پایان', value:'indefinite' },
				{ label: 'دیگر...', value: 'custom' }
			]
		});

	form.append({
			type: 'checkbox',
			name: 'movemodify',
			event: Twinkle.protect.formevents.movemodify,
			list: [
				{
					label: 'تنظیم محافظت انتقال',
					value: 'movemodify',
					tooltip: 'Only for existing pages.',
					checked: true
				}
			]
		});
	var movelevel = form.append({
			type: 'select',
			name: 'movelevel',
			label: 'حفاظت‌شده در برابر انتقال:',
			event: Twinkle.protect.formevents.movelevel
		});
	movelevel.append({
			type: 'option',
			label: 'همه',
			value: 'all'
		});
	movelevel.append({
			type: 'option',
			label: 'تأییدشده',
			value: 'autoconfirmed'
		});
	movelevel.append({
			type: 'option',
			label: 'مدیر',
			value: 'sysop',
			selected: true
		});
	form.append({
			type: 'select',
			name: 'moveexpiry',
			label: 'سررسید:',
			event: function(e) {
				if (e.target.value === 'custom') {
					Twinkle.protect.doCustomExpiry(e.target);
				}
			},
			list: [
				{ label: '۱ ساعت', value: '1 hour' },
				{ label: '۲ ساعت', value: '2 hours' },
				{ label: '۳ ساعت', value: '3 hours' },
				{ label: '۶ ساعت', value: '6 hours' },
				{ label: '۱۲ ساعت', value: '12 hours' },
				{ label: '۱ روز', value: '1 day' },
				{ label: '۲ روز', selected: true, value: '2 days' },
				{ label: '۳ روز', value: '3 days' },
				{ label: '۴ روز', value: '4 days' },
				{ label: '۱ هفته', value: '1 week' },
				{ label: '۲ هفته', value: '2 weeks' },
				{ label: '۱ ماه', value: '1 month' },
				{ label: '۲ ماه', value: '2 months' },
				{ label: '۳ ماه', value: '3 months' },
				{ label: '۱ سال', value: '1 year' },
				{ label: 'بی‌پایان', value:'indefinite' },
				{ label: 'دیگر...', value: 'custom' }
			]
		});

	form.append({
			type: 'checkbox',
			name: 'createmodify',
			event: function twinklebatchprotectFormCreatemodifyEvent(e) {
				e.target.form.createlevel.disabled = !e.target.checked;
				e.target.form.createexpiry.disabled = !e.target.checked || (e.target.form.createlevel.value === 'all');
				e.target.form.createlevel.style.color = e.target.form.createexpiry.style.color = (e.target.checked ? "" : "transparent");
			},
			list: [
				{
					label: 'Modify create protection',
					value: 'createmodify',
					tooltip: 'Only for pages that do not exist.',
					checked: true
				}
			]
		});
	var createlevel = form.append({
			type: 'select',
			name: 'createlevel',
			label: 'ایجاد حفاظت:',
			event: Twinkle.protect.formevents.createlevel
		});
	createlevel.append({
			type: 'option',
			label: 'همه (کاربران ثبت‌نام شده)',
			value: 'all'
		});
	createlevel.append({
			type: 'option',
			label: 'تأییدشده',
			value: 'autoconfirmed'
		});
	createlevel.append({
			type: 'option',
			label: 'مدیر',
			value: 'sysop',
			selected: true
		});
	form.append({
			type: 'select',
			name: 'createexpiry',
			label: 'سررسید:',
			event: function(e) {
				if (e.target.value === 'custom') {
					Twinkle.protect.doCustomExpiry(e.target);
				}
			},
			list: [
				{ label: '۱ ساعت', value: '1 hour' },
				{ label: '۲ ساعت', value: '2 hours' },
				{ label: '۳ ساعت', value: '3 hours' },
				{ label: '۶ ساعت', value: '6 hours' },
				{ label: '۱۲ ساعت', value: '12 hours' },
				{ label: '۱ روز', value: '1 day' },
				{ label: '۲ روز', selected: true, value: '2 days' },
				{ label: '۳ روز', value: '3 days' },
				{ label: '۴ روز', value: '4 days' },
				{ label: '۱ هفته', value: '1 week' },
				{ label: '۲ هفته', value: '2 weeks' },
				{ label: '۱ ماه', value: '1 month' },
				{ label: '۲ ماه', value: '2 months' },
				{ label: '۳ ماه', value: '3 months' },
				{ label: '۱ سال', value: '1 year' },
				{ label: 'بی‌پایان', value:'indefinite' },
				{ label: 'دیگر...', value: 'custom' }
			]
		});

	form.append( {
			type: 'textarea',
			name: 'reason',
			label: 'دلیل (جهت سیاهه محافظت): '
		} );

	var query;

	if( mw.config.get( 'wgNamespaceNumber' ) === 14 ) {  // categories
		query = {
			'action': 'query',
			'generator': 'categorymembers',
			'gcmtitle': mw.config.get( 'wgPageName' ),
			'gcmlimit' : Twinkle.getPref('batchMax'), // the max for sysops
			'prop': 'revisions',
			'rvprop': 'size'
		};
	} else if( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex' ) {
		query = {
			'action': 'query',
			'generator': 'allpages',
			'gapnamespace': Morebits.queryString.exists('namespace') ? Morebits.queryString.get( 'namespace' ) : document.getElementById('namespace').value,
			'gapprefix': Morebits.queryString.exists('from') ? Morebits.string.toUpperCaseFirstChar(Morebits.queryString.get( 'from' ).replace('+', ' ')) : Morebits.string.toUpperCaseFirstChar(document.getElementById('nsfrom').value),
			'gaplimit' : Twinkle.getPref('batchMax'), // the max for sysops
			'prop': 'revisions',
			'rvprop': 'size'
		};
	} else {
		query = {
			'action': 'query',
			'gpllimit' : Twinkle.getPref('batchMax'), // the max for sysops
			'generator': 'links',
			'titles': mw.config.get( 'wgPageName' ),
			'prop': 'revisions',
			'rvprop': 'size'
		};
	}

	var statusdiv = document.createElement("div");
	statusdiv.style.padding = '15px';  // just so it doesn't look broken
	Window.setContent(statusdiv);
	Morebits.status.init(statusdiv);
	Window.display();

	var statelem = new Morebits.status("دریافت فهرست صفحه‌ها");

	var wikipedia_api = new Morebits.wiki.api( 'بارگیری...', query, function(apiobj) {
			var xml = apiobj.responseXML;
			var $pages = $(xml).find('page');
			var list = [];
			$pages.each(function(index, page) {
				var $page = $(page);
				var title = $page.attr('title');
				var isRedir = $page.attr('redirect') === ""; // XXX ??
				var missing = $page.attr('missing') === ""; // XXX ??
				var size = $page.find('rev').attr('size');

				var metadata = [];
				if (missing) {
					metadata.push("page does not exist");
				} else {
					if (isRedir) {
						metadata.push("redirect");
					}
					metadata.push(size + " bytes");
				}
				list.push( { label: title + (metadata.length ? (' (' + metadata.join('; ') + ')') : '' ), value: title, checked: true });
			});
			form.append({ type: 'header', label: 'پیوندها' });
			form.append( {
					type: 'checkbox',
					name: 'pages',
					list: list
				} );
			form.append( { type:'submit' } );

			var result = form.render();
			Window.setContent( result );
		}, statelem );

	wikipedia_api.post();
};
/*</pre>
=== بخش ۴===
<pre>*/ 
Twinkle.batchprotect.currentProtectCounter = 0;
Twinkle.batchprotect.currentprotector = 0;
Twinkle.batchprotect.callback.evaluate = function twinklebatchprotectCallbackEvaluate(event) {
	var pages = event.target.getChecked( 'pages' );
	var reason = event.target.reason.value;
	var editmodify = event.target.editmodify.checked;
	var editlevel = event.target.editlevel.value;
	var editexpiry = event.target.editexpiry.value;
	var movemodify = event.target.movemodify.checked;
	var movelevel = event.target.movelevel.value;
	var moveexpiry = event.target.moveexpiry.value;
	var createmodify = event.target.createmodify.checked;
	var createlevel = event.target.createlevel.value;
	var createexpiry = event.target.createexpiry.value;

	if( ! reason ) {
		alert("You've got to give a reason, you rouge admin!")
		return;
	}

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

	if( !pages ) {
		Morebits.status.error( 'Error', 'چیزی برای محافظت نبود و لغو شد' );
		return;
	}

	var toCall = function twinklebatchprotectToCall( work ) {
		if( work.length === 0 && Twinkle.batchprotect.currentProtectCounter <= 0 ) {
			Morebits.status.info( 'work done' );
			window.clearInterval( Twinkle.batchprotect.currentprotector );
			Twinkle.batchprotect.currentprotector = Twinkle.batchprotect.currentProtectCounter = 0;
			Morebits.wiki.removeCheckpoint();
			return;
		} else if( work.length !== 0 && Twinkle.batchprotect.currentProtectCounter <= Twinkle.getPref('batchProtectMinCutOff') ) {
			var pages = work.shift();
			Twinkle.batchprotect.currentProtectCounter += pages.length;
			for( var i = 0; i < pages.length; ++i ) {
				var page = pages[i];
				var query = {
					'action': 'query',
					'titles': page
				};
				var wikipedia_api = new Morebits.wiki.api( 'چک کردن آیا ' + page + ' وجود دارد', query, Twinkle.batchprotect.callbacks.main );
				wikipedia_api.params = {
					page: page,
					reason: reason,
					editmodify: editmodify,
					editlevel: editlevel,
					editexpiry: editexpiry,
					movemodify: movemodify,
					movelevel: movelevel,
					moveexpiry: moveexpiry,
					createmodify: createmodify,
					createlevel: createlevel,
					createexpiry: createexpiry
				};
				wikipedia_api.post();
			}
		}
	};
	var work = pages.chunk( Twinkle.getPref('batchProtectChunks') );
	Morebits.wiki.addCheckpoint();
	Twinkle.batchprotect.currentprotector = window.setInterval( toCall, 1000, work );
};

Twinkle.batchprotect.callbacks = {
	main: function( apiobj ) {
		var xml = apiobj.responseXML;
		var normal = $(xml).find('normalized n').attr('to');
		if( normal ) {
			apiobj.params.page = normal;
		}

		var exists = ($(xml).find('page').attr('missing') !== "");

		var page = new Morebits.wiki.page(apiobj.params.page, "محافظت " + apiobj.params.page);
		if (exists && apiobj.params.editmodify) {
			page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);
		} else if (exists && apiobj.params.movemodify) {
			page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);
		} else if (!exists && apiobj.params.createmodify) {
			page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);
		} else {
			Morebits.status.warn("محافظت " + apiobj.params.page, "صفحهٔ " + (exists ? "وجود دارد." : "وجود ندارد") + "; کاری انجام نشد، درخواست لغو گردید");
			return;
		}

		page.setEditSummary(apiobj.params.reason);

		page.protect(function(pageobj) {
			--Twinkle.batchprotect.currentProtectCounter;
			var link = document.createElement( 'a' );
			link.setAttribute( 'href', mw.util.getUrl( apiobj.params.page ) );
			link.appendChild( document.createTextNode( apiobj.params.page ) );
			pageobj.getStatusElement().info( [ 'انجام شد (' , link , ')' ] );
		} );
	}
};
/*</pre>
=== بخش ۵===
<pre>*/ 
/*
 ****************************************
 *** twinklebatchundelete.js: Batch undelete module
 ****************************************
 * Mode of invocation:     Tab ("Und-batch")
 * Active on:              Existing and non-existing user pages (??? why?)
 * Config directives in:   TwinkleConfig
 */


Twinkle.batchundelete = function twinklebatchundelete() {
	if( mw.config.get('wgNamespaceNumber') != Namespace.USER ) {
		return;
	}
	if( Morebits.userIsInGroup( 'sysop' ) ) {
		$(twAddPortletLink("#", "واگردانی حذف", "tw-batch-undel", "واگردانی همهٔ حذف‌ها", "")).click(Twinkle.batchundelete.callback);
	}
};

Twinkle.batchundelete.callback = function twinklebatchundeleteCallback() {
	var Window = new Morebits.simpleWindow( 800, 400 );
	var form = new Morebits.quickForm( Twinkle.batchundelete.callback.evaluate );
	form.append( {
			type: 'textarea',
			name: 'reason',
			label: 'دلیل: '
		} );

	var query = {
		'action': 'query',
		'generator': 'links',
		'titles': mw.config.get('wgPageName'),
		'gpllimit' : Twinkle.getPref('batchMax') // the max for sysops
	};
	var wikipedia_api = new Morebits.wiki.api( 'دریافت صفحه‌ها', query, function( self ) {
			var xmlDoc = self.responseXML;
			var snapshot = xmlDoc.evaluate('//page[@missing]', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
			var list = [];
			for ( var i = 0; i < snapshot.snapshotLength; ++i ) {
				var object = snapshot.snapshotItem(i);
				var page = xmlDoc.evaluate( '@title', object, null, XPathResult.STRING_TYPE, null ).stringValue;
				list.push( {label:page, value:page, checked: true });
			}
			self.params.form.append( {
					type: 'checkbox',
					name: 'pages',
					list: list
				}
			);
			self.params.form.append( { type:'submit' } );

			var result = self.params.form.render();
			self.params.Window.setContent( result );


		}  );
	wikipedia_api.params = { form:form, Window:Window };
	wikipedia_api.post();
	var root = document.createElement( 'div' );
	Morebits.status.init( root );
	Window.setContent( root );
	Window.display();
};
Twinkle.batchundelete.currentUndeleteCounter = 0;
Twinkle.batchundelete.currentundeletor = 0;
Twinkle.batchundelete.callback.evaluate = function( event ) {
	Morebits.wiki.actionCompleted.notice = 'وضعیت';
	Morebits.wiki.actionCompleted.postfix = 'بازگردانی حذف انجام شد';

	var pages = event.target.getChecked( 'pages' );
	var reason = event.target.reason.value;
	if( ! reason ) {
		return;
	}
	Morebits.status.init( event.target );

	if( !pages ) {
		Morebits.status.error( 'Error', 'چیزی برای بازیابی نیود و لغو شد' );
		return;
	}

	var work = pages.chunk( Twinkle.getPref('batchUndeleteChunks') );
	Morebits.wiki.addCheckpoint();
	Twinkle.batchundelete.currentundeletor = window.setInterval( Twinkle.batchundelete.callbacks.main, 1000, work, reason );
};

Twinkle.batchundelete.callbacks = {
	main: function( work, reason ) {
		if( work.length === 0 && Twinkle.batchundelete.currentUndeleteCounter <= 0 ) {
			Morebits.status.info( 'work done' );
			window.clearInterval( Twinkle.batchundelete.currentundeletor );
			Morebits.wiki.removeCheckpoint();
			return;
		} else if( work.length !== 0 && Twinkle.batchundelete.currentUndeleteCounter <= Twinkle.getPref('batchUndeleteMinCutOff') ) {
			var pages = work.shift();
			Twinkle.batchundelete.currentUndeleteCounter += pages.length;
			for( var i = 0; i < pages.length; ++i ) {
				var title = pages[i];
				var query = { 
					'title': 'Special:Undelete',
					'target': title,
					'action': 'submit'
				};
				var wikipedia_wiki = new Morebits.wikipedia.wiki( "احیای " + title, query, Twinkle.batchundelete.callbacks.undeletePage, function( self ) { 
						--Twinkle.batchundelete.currentUndeleteCounter;
						var link = document.createElement( 'a' );
						link.setAttribute( 'href', mw.util.getUrl(self.params.title) );
						link.setAttribute( 'title', self.params.title );
						link.appendChild( document.createTextNode(self.params.title) );
						self.statelem.info( ['انجام شد (',link,')'] );

					});
				wikipedia_wiki.params = { title:title, reason: reason };
				wikipedia_wiki.get();

			}
		}
	},
	undeletePage: function( self ) {
		var form = self.responseXML.getElementById('undelete');
		var postData = {
			'wpComment': self.params.reason + '.' +  Twinkle.getPref('deletionSummaryAd'),
			'target': self.params.image,
			'wpEditToken': form.wpEditToken.value,
			'restore': 1
		};
		self.post( postData );

	}
};
/*</pre>
=== بخش ۶===
<pre>*/ 
/*
****************************************
*** twinklecloser.js: AFD/AFC closer module
****************************************
* Mode of invocation:     Link on AFD subpages (including daily log pages) and AFC daily log pages
* Active on:              The aforementioned pages
* Config directives in:   TwinkleConfig
*/

Twinkle.closer = function twinklecloser() {
	var closeable = false;
	var type;
	if( /ویکی‌پدیا:درخواست ساخت مقاله\/\d{4}-\d{2}-\d{2}/.test(mw.config.get('wgPageName')) ) {
		closeable = true;
		type = 'afc';
	} else if(  /ویکی‌پدیا:درخواست ساخت مقاله\//.test(mw.config.get('wgPageName')) ) {
		closeable = true;
		type = 'afd';
	}

	if( closeable ) {
		Twinkle.closer.mark( type );
	}
};

Twinkle.closer.mark = function twinklecloserMark( type ) {
	var sections;
	switch( type ) {
	case 'afc':
		sections = $('h2:has(span.editsection)');
		sections.each(function(index, section) {
			var query = new Morebits.queryString($(this).find('span.editsection a').attr('href').split( '?', 2 )[1]);
			var section_number = query.get('section');
			var closelink = $('<a/>', {
				'text': '[close]',
				'click': function(){Twinkle.closer.actions.afc(section_number);},
				'class': 'twinkle-closer-link twinkle-closer-link-afc',
				'css': { 'color': '#449922'	}
			}).prependTo(this);
		});
		break;
	case 'afd':
		sections = $('h3:has(span.editsection)');
		sections.each(function(index, section) {
			var $a = $(this).find('span.editsection a');
			var page =$a.attr('title');
			var query = new Morebits.queryString($a.attr('href').split( '?', 2 )[1]);
			var section_number = query.get('section');
			var closelink = $('<a/>', {
				'text': '[close]',
				'click': function(){Twinkle.closer.actions.afd(section_number, page);},
				'class': 'twinkle-closer-link twinkle-closer-link-afd',
				'css': { 'color': '#449922'	}
			}).prependTo(this);
		});
		break;
	default:
		alert("Twinkle.closer.mark: unknown closure type " + type);
		break;
	}
};

Twinkle.closer.actions = {
	afc: function twinklecloserActionsAfc( section ) {
		var Window = new Morebits.simpleWindow( 800, 400 );
		Window.setTitle( "Close AFC" );
		Window.setScriptName( "توینکل" );
		Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

		var form = new Morebits.quickForm( Twinkle.closer.callbacks.afc.evaluate );
		form.append ( {
			label: 'عمل: ',
			type: 'select',
			name: 'type',
			event: Twinkle.closer.callbacks.afc.submenu,
			list: [
				{
					label: 'Approved',
					value: 'approved'
				},
				{
					label: 'Denied',
					value: 'denied'
				},
				{
					label: 'Archive',
					value: 'archive'
				}
			]
		});
		form.append( {
			type: 'div',
			id: 'work_area'
		} );
		form.append( {
			type: 'hidden',
			name: 'section',
			value: section
		} );
		form.append( {
			type: 'hidden',
			name: 'page',
			value: page
		} );
		form.append( { type:'submit' } );

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

		// We must init the
		var evt = document.createEvent( "Event" );
		evt.initEvent( 'change', true, true );
		result.type.dispatchEvent( evt );
	},
	afd: function twinklecloserActionsAfd( section, page ) {
		var Window = new Morebits.simpleWindow( 800, 400 );
		Window.setTitle( "Close AFD" );
		Window.setScriptName( "توینکل" );
		Window.addFooterLink( "جمع‌بندی نظرخواهی", "وپ:حذف" );
		Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

		var form = new Morebits.quickForm( Twinkle.closer.callbacks.afd.evaluate );
		form.append ( {
			label: 'عمل: ',
			type: 'radio',
			name: 'type',
			list: [
				{
					label: 'Keep',
					value: 'keep'
				},
				{
					label: 'No consensus',
					value: 'no consensus'
				},
				{
					label: 'Merge',
					value: 'merge'
				},
				{
					label: 'Redirect',
					value: 'redirect',
					subgroup: {
						type: 'input',
						name: 'target',
						label: 'Target: ',
						tooltip: 'the name of the page to redirect to'
					}

				},
				{
					label: 'حذف',
					value: 'delete',
					subgroup: {
						type: 'checkbox',
						list: [
							{
								label: 'Delete? ',
								value: 'delete',
								name: 'del',
								tooltop: 'if we should delete the page on the fly',
								checked: true
							}
						]
					}
				}
			]
		});
		form.append( {
			type: 'textarea',
			name: 'reason',
			label: 'Reason:'
		} );

		form.append( {
			type: 'input',
			name: 'affected_page',
			label: 'صفحه‌های تحت تاثیر گرفته: ',
			value: page.replace( /.*\/(.*?)(\s\(.*?\))?/, "$1" )
		} );

		form.append( {
			type: 'div',
			id: 'work_area'
		} );

		form.append( {
			type: 'hidden',
			name: 'section',
			value: section
		} );
		form.append( {
			type: 'hidden',
			name: 'page',
			value: page
		} );
		form.append( { type:'submit' } );
		var result = form.render();
		Window.setContent( result );
		Window.display();
	}
};

Twinkle.closer.callbacks = {
	afc: {
		submenu: function(e) {
			var value = e.target.value;
			var root = e.target.form;
			var old_area = document.getElementById( 'work_area' );
			var work_area = null;
			switch( value ) {
			case 'archive':
				work_area = new Morebits.quickForm.element( {
					type: 'div',
					id: 'work_area'
				} );

				work_area.append( {
					type: 'checkbox',
					name: 'approved',
					list: [
						{
							label: 'Approved ',
							value: 'approved'
						}
					]
				} );

				work_area = work_area.render();
				old_area.parentNode.replaceChild( work_area, old_area );
				break;
			case 'approved':
				work_area = new Morebits.quickForm.element( {
					type: 'div',
					id: 'work_area'
				} );

				work_area.append( {
					type: 'input',
					name: 'article',
					label: 'Article ',
					tooltop: 'Leave empty if article was created as specified'
				} );

				work_area = work_area.render();
				old_area.parentNode.replaceChild( work_area, old_area );
				break;
			case 'denied':
				work_area = new Morebits.quickForm.element( {
					type: 'div',
					id: 'work_area'
				} );

				work_area.append( {
					type: 'select',
					name: 'reason',
					label: 'Reason ',
					list: [
						{
							label:'v',
							value:'v'
						},
						{
							label:'bio',
							value:'bio'
						},
						{
							label:'nn',
							value:'nn'
						},
						{
							label:'web',
							value:'web'
						},
						{
							label:'corp',
							value:'corp'
						},
						{
							label:'music',
							value:'music'
						},
						{
							label:'dict',
							value:'dict'
						},
						{
							label:'context',
							value:'context'
						},
						{
							label:'blank',
							value:'blank'
						},
						{
							label:'neo',
							value:'neo'
						},
						{
							label:'joke',
							value:'joke'
						},
						{
							label:'lang',
							value:'lang'
						},
						{
							label:'blp',
							value:'blp'
						},
						{
							label:'npov',
							value:'npov'
						},
						{
							label:'not',
							value:'not'
						}
					]
				} );
				work_area = work_area.render();
				old_area.parentNode.replaceChild( work_area, old_area );
				break;
			default:
				alert("Twinkle.closer.callbacks.afc.submenu: unknown outcome " + value);
				break;
			}
		},
		evaluate: function(e) {
			var form = e.target;
			var type = form.type.value;
			var section = form.section.value;
			var params = { type: type };
			switch( type ) {
			case 'approved':
				var article = form.article.value;
				params.tag = '{{جا:afc accept' + ( article ? '|' + article : '' ) + '}}';
				break;
			case 'denied':
				var reason = form.reason.value;
				params.tag = '{{جا:afc ' + reason + '}}';
				break;
			case 'archive':
				var approved = form.approved.checked;
				params.top = '{{جا:afc top' + ( approved ? '|approved' : '' ) + '}}';
				params.bottom = '{{جا:afc b}}';
				break;
			default:
				alert("Twinkle.closer.callbacks.afc.evaluate: unknown outcome " + type);
				break;
			}

			Morebits.simpleWindow.setButtonsEnabled( false );
			Morebits.status.init( form );
			var page = Morebits.wiki.page(mw.config.get('wgPageName'), "انجام دادن");
			page.setPageSection(section);
			page.setCallbackParameters(params);
			page.load(Twinkle.closer.callbacks.afc.edit);
		},
		edit: function( pageobj ) {
			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();
			var statelem = pageobj.getStatusElement();
			var summary;

			switch( params.type ) {
			case 'approved':
				text += params.tag + '~~~~';
				summary = 'Approving article.';
				break;
			case 'denied':
				text += params.tag + '~~~~';
				summary = 'Denying article.';
				break;
			case 'archive':
				text = text.replace( /^(==.*?==)\n/, "$1\n" + params.top  );
				text += params.bottom;
				summary = 'Archiving.';
				break;
			default:
				alert("Twinkle.closer.callbacks.afc.edit: unknown outcome " + params.type);
				break;
			}
			pageobj.setPageText(text);
			pageobj.setEditSummary(summary + Twinkle.getPref('summaryAd'));
			pageobj.setCreateOption('nocreate');
			pageobj.save();
		}
	},
	afd: {
		submenu: function(e) {
			var value = e.target.value;
			var root = e.target.form;
			var old_area = document.getElementById( 'work_area' );
			var	work_area = new Morebits.quickForm.element( {
				type: 'div',
				id: 'work_area'
			} );
			switch( value ) {
			case 'keep':
			case 'no consensus':
				// nothing
				break;
			case 'redirect':
				work_area.append( {
					type: 'input',
					name: 'target',
					label: 'Target: ',
					tooltip: 'the name of the page to redirect to'
				} );
				break;
			case 'merge':
				// merge must be done manually
				break;
			case 'delete':
				work_area.append( {
					type: 'checkbox',
					list: [
						{
							label: 'Delete? ',
							value: 'delete',
							name: 'del',
							tooltop: 'if we should delete the page on the fly',
							checked: true
						}
					]
				} );
				break;
			default:
				alert("Twinkle.closer.callbacks.afd.submenu: unknown outcome " + value);
				break;
			}

			work_area = work_area.render();
			old_area.parentNode.replaceChild( work_area, old_area );
		},
		evaluate: function(e) {
			var form = e.target;
			var reason = form.reason.value;
			var type = form.type.value;
			var section = form.section.value;
			var page = form.page.value;
			var affected_page = form.affected_page.value;
			var params = { type: type, page: page, reason: reason, affected_page: affected_page };
			var label, wp_page;
			switch( type ) {
			case 'keep':
				label = "Keep";
				break;
			case 'no consensus':
				label = "No consensus";
				break;
			case 'redirect':
				label = "Redirect";
				var target = form.target.value;
				break;
			case 'merge':
				label = "Merge";
				break;
			case 'delete':
				label = "Delete";
				var del = form.del.checked;
				break;
			default:
				alert("Twinkle.closer.callbacks.afd.evaluate: unknown outcome " + type);
				break;
			}
			params.label = label;

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

			if( type === 'delete' ) {
				if( del ) {
					// Start by purging redirect
					var query = {
						'action': 'query',
						'list': 'backlinks',
						'blfilterredir': 'redirects',
						'bltitle': affected_page,
						'bllimit': 5000
					};
					var wikipedia_api = new Morebits.wiki.api( 'دریافت تغییرمسیرها', query, Twinkle.closer.callbacks.afd.deleteRedirectsMain );
					wikipedia_api.params = params;
					wikipedia_api.post();

					// and now, delete!

					wp_page = Morebits.wiki.page(affected_page, 'حذف صفحه');
					wp_page.setEditSummary("حذف بر پایه نظرخواهی حذف (پیوند [[" + params.page + "]])." + Twinkle.getPref('deletionSummaryAd'));
					wp_page.deletePage();
				}

			}

			wp_page = Morebits.wiki.page(page, "درحال به روز کردن صفحه");
			wp_page.setPageSection(section);
			wp_page.setCallbackParameters(params);
			wp_page.load(Twinkle.closer.callbacks.afd.edit);
		},
		deleteRedirectsMain: function( self ) {
			var $doc = $(self.responseXML);
			$doc.find("backlinks bl").each(function(){
				var title = $(this).attr('title');
				var page = new Morebits.wiki.page(title, "حذف تغییرمسیرهای " + title);
				page.setEditSummary("حذف سریع , تغییرمسیر به صفحه \"" + self.params.affected_page + "\"." + Twinkle.getPref('deletionSummaryAd'));
				page.deletePage();
			});
		},
		edit: function( pageobj ) {
			var text = pageobj.getText();
			var params = pageobj.getCallbackParameters();
			pageobj.setEditSummary( "نتیجه جمع‌بندی بحث \"" + params.label + "\"" +  Twinkle.getPref('summaryAd') );
			pageobj.setPageText("{{جا:پیشنهاد حذف بالاp}}'''" + params.label + "''' " + params.reason + ". ~~~~n" + text + "\n{{جا:پیشنهاد حذف پایین}}");
			pageobj.save();
		}
	}
};
/*</pre>
=== بخش ۷===
<pre>*/ 
/*
 ****************************************
 *** twinkleconfig.js: Preferences module
 ****************************************
 * Mode of invocation:     Adds configuration form to ویکی‌پدیا:توینکل/ترجیحات and user 
                           subpages named "/Twinkle preferences", and adds ad box to the top of user 
                           subpages belonging to the currently logged-in user which end in '.js'
 * Active on:              What I just said.  Yeah.
 * Config directives in:   TwinkleConfig

 I, [[User:This, that and the other]], originally wrote this.  If the code is misbehaving, or you have any
 questions, don't hesitate to ask me.  (This doesn't at all imply [[ویکی‌پدیا:مالکیت مقاله‌ها]]ership - it's just meant to
 point you in the right direction.)  -- TTO
 */


Twinkle.config = {};

Twinkle.config.commonEnums = {
	watchlist: { yes: "به فهرست مشارکت‌ها بیافزای", no: "به فهرست مشارکت‌ها نیافزای", "default": "تبعیت از ترجیحات من ویکی‌پدیا" },
	talkPageMode: { window: "در یک پنجره، جایگزن بحث کاربرهای دیگر", tab: "در یک زبانه جدید", blank: "در پنجره جدید" }
};

Twinkle.config.commonSets = {
	csdCriteria: {
                db: "معیار ‌های دیگر ({{حذف سریع}})",
		g1: "ع۱", g2: "ع۱", g3: "ع۱۲", g4: "ع۳", g5: "ع۴", g6: "تغ۳", g7: "ع۶", g8: "تغ۳", g10: "ع۹", g11: "ع۱۰", g12: "ع۱۱",
		a1: "م۱", a2: "م۲", a3: "م۳", a5: "A5", a7: "م۷", a9: "ع۷", a10: "م۶",
		u1: "ع۶", u2: "ک۲", u3: "ک۳",
		f1: "ت۱", f2: "ع۱", f3: "ت۳", f7: "ت۶", f8: "پ۸", f9: "ع۱۱", f10: "ت۶",
		c1: "ر۱",
		t2: "ال۱", t3: "ال۲",
		r2: "تغ۲", r3: "تغ۳",
		p1: "د۱", p2: "د۲"  // db-multiple is not listed here because it is treated differently within twinklespeedy
	},
	csdCriteriaDisplayOrder: [
		"db",
		"g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g10", "g11", "g12",
		"a1", "a2", "a3", "a5", "a7", "a9", "a10",
		"u1", "u2", "u3",
		"f1", "f2", "f3", "f7", "f8", "f9", "f10",
		"c1",
		"t2", "t3",
		"r2", "r3",
		"p1", "p2"
	],
	csdCriteriaNotificationDisplayOrder: [
		"db",
		"g1", "g2", "g3", "g4", "g10", "g11", "g12",
		"a1", "a2", "a3", "a5", "a7", "a9", "a10",
		"u3",
		"f1", "f2", "f3", "f7", "f9", "f10",
		"c1",
		"t2", "t3",
		"r2", "r3",
		"p1", "p2"
	],
	csdAndDICriteria: {
                db: "معیار ‌های دیگر ({{حذف سریع}})",
		g1: "ع۱", g2: "ع۱", g3: "ع۱۲", g4: "ع۳", g5: "ع۴", g6: "تغ۳", g7: "ع۶", g8: "تغ۳", g10: "ع۹", g11: "ع۱۰", g12: "ع۱۱",
		a1: "م۱", a2: "م۲", a3: "م۳", a5: "A5", a7: "م۷", a9: "ع۷", a10: "م۶",
		u1: "ع۶", u2: "ک۲", u3: "ک۳",
		f1: "ت۱", f2: "ع۱", f3: "ت۳", f7: "ت۶", f8: "پ۸", f9: "ع۱۱", f10: "ت۶",
		c1: "ر۱",
		t2: "ال۱", t3: "ال۲",
		r2: "تغ۲", r3: "تغ۳",
		p1: "د۱", p2: "د۲"  // db-multiple is not listed here because it is treated differently within twinklespeedy
	},
	csdAndDICriteriaDisplayOrder: [
		"db",
		"g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g10", "g11", "g12",
		"a1", "a2", "a3", "a5", "a7", "a9", "a10",
		"u1", "u2", "u3",
		"f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11",
		"c1",
		"t2", "t3",
		"r2", "r3",
		"p1", "p2"
	],
	namespacesNoSpecial: {
		"0": "مقاله",
		"1": "بحث (مقاله)",
		"2": "کاربر",
		"3": "بحث کاربر",
		"4": "ویکی‌پدیا",
		"5": "بحث ویکی‌پدیا",
		"6": "پرونده",
		"7": "بحث پرونده",
		"8": "مدیاویکی",
		"9": "بحث مدیاویکی",
		"10": "الگو",
		"11": "بحث الگو",
		"12": "راهنما",
		"13": "بحث راهنما",
		"14": "رده",
		"15": "بحث رده",
		"100": "درگاه",
		"101": "بحث درگاه",
		"108": "کتاب",
		"109": "بحث کتاب"
	}
};
/*</pre>
=== بخش ۸===
<pre>*/ 
/**
 * Section entry format:
 *
 */

Twinkle.config.sections = [
{
	title: "عمومی",
	preferences: [
		// TwinkleConfig.summaryAd (string)
		// Text to be appended to the edit summary of edits made using Twinkle
		{
			name: "summaryAd",
			label: "\"افزودن\" متن به خلاصهٔ ویرایش‌های توینکل",
			helptip: "The summary ad should start with a space, and be kept short.",
			type: "string"
		},

		// TwinkleConfig.deletionSummaryAd (string)
		// Text to be appended to the edit summary of deletions made using Twinkle
		{
			name: "deletionSummaryAd",
			label: "خلاصهٔ ویرایش برای حذف استفاده شود",
			helptip: "Normally the same as the edit summary ad above.",
			adminOnly: true,
			type: "string"
		},

		// TwinkleConfig.protectionSummaryAd (string)
		// Text to be appended to the edit summary of page protections made using Twinkle
		{
			name: "protectionSummaryAd",
			label: "خلاصهٔ ویرایش برای محافظت صفحه استفاده شود.",
			helptip: "Normally the same as the edit summary ad above.",
			adminOnly: true,
			type: "string"
		},

		// TwinkleConfig.userTalkPageMode may take arguments:
		// 'window': open a new window, remember the opened window
		// 'tab': opens in a new tab, if possible.
		// 'blank': force open in a new window, even if such a window exists
		{
			name: "userTalkPageMode",
			label: "نحوهٔ باز شدن صفحهٔ نظرخواهی یا بحث",
			type: "enum",
			enumValues: Twinkle.config.commonEnums.talkPageMode
		},

		// TwinkleConfig.dialogLargeFont (boolean)
		{
			name: "dialogLargeFont",
			label: "در پنجره‌های توینکل از فونت بزرگتری استفاده کن",
			type: "boolean"
		}
	]
},

{
	title: "حذف نگاره",
	preferences: [
		// TwinkleConfig.notifyUserOnDeli (boolean)
		// If the user should be notified after placing a file deletion tag
		{
			name: "notifyUserOnDeli",
			label: "انتخاب \"اطلاع‌رسانی به بارگذار\" جعبه پیش‌فرض",
			type: "boolean"
		},

		// TwinkleConfig.deliWatchPage (string)
		// The watchlist setting of the page tagged for deletion. Either "yes", "no", or "default". Default is "default" (Duh).
		{
			name: "deliWatchPage",
			label: "صفحه نگاره را پس از برچسب‌زدن به فهرست پی‌گیری‌های من بیفزای",
			type: "enum",
			enumValues: Twinkle.config.commonEnums.watchlist
		},

		// TwinkleConfig.deliWatchUser (string)
		// The watchlist setting of the user talk page if a notification is placed. Either "yes", "no", or "default". Default is "default" (Duh).
		{
			name: "deliWatchUser",
			label: "صفحهٔ بحث بارگذار اولیه را در زمان اطلاع‌رسانی به فهرست پی‌گیری بیفزای",
			type: "enum",
			enumValues: Twinkle.config.commonEnums.watchlist
		}
	]
},

{
	title: "حذف زمان‌دار",
	preferences: [
		// TwinkleConfig.watchProdPages (boolean)
		// If, when applying prod template to page, to watch the page
		{
			name: "watchProdPages",
			label: "مقاله را پس از برچسب زدن به فهرست پی‌گیری‌های من بیفزای",
			type: "boolean"
		},

		// TwinkleConfig.prodReasonDefault (string)
		// The prefilled PROD reason.
		{
			name: "prodReasonDefault",
			label: "معیار پیشنهاد حذف را بنویسید",
			type: "string"
		},

		{
			name: "logProdPages",
			label: "نگهداری فهرست صفحه‌هایی که شما نامزد حذف زمان‌دار کردید در صفحهٔ زیر کاربری شما",
			helptip: "Since non-admins do not have access to their deleted contributions, the userspace log offers a good way to keep track of all pages you tag for PROD using Twinkle.",
			type: "boolean"
		},
		{
			name: "prodLogPageName",
			label: "محل نگهداری فهرست صفحه‌های نامزد شده برای حذف زمان‌دار توسط شما",
			helptip: "i.e. User:<i>username</i>/<i>subpage name</i>. Only works if you turn on the PROD userspace log.",
			type: "string"
		}
	]
},

{
	title: "واگردانی و خنثی‌سازی",  // twinklefluff module
	preferences: [
		// TwinkleConfig.openTalkPage (array)
		// What types of actions that should result in opening of talk page
		{
			name: "openTalkPage",
			label: "صفحهٔ بحث کاربر را پس از این واگردانی‌ها باز کن",
			type: "set",
			setValues: { agf: "واگردانی فحن", norm: "واگردانی با خلاصه", vand: "واگردانی خرابکاری", torev: "\"واگردانی به این نسخه\"" }
		},

		// TwinkleConfig.openTalkPageOnAutoRevert (bool)
		// Defines if talk page should be opened when calling revert from contrib page, because from there, actions may be multiple, and opening talk page not suitable. If set to true, openTalkPage defines then if talk page will be opened.
		{
			name: "openTalkPageOnAutoRevert",
			label: "باز کردن صفحه بحث کاربر زمانی که در مشارکت‌های کاربر «گشت نشده» وجود داشت",
			helptip: "Often, you may be rolling back many pages at a time from a vandal's contributions page, so it would be unsuitable to open the user talk page. Hence, this option is off by default. When this is on, the desired options must be enabled in the previous setting for this to work.",
			type: "boolean"
		},

		// TwinkleConfig.markRevertedPagesAsMinor (array)
		// What types of actions that should result in marking edit as minor
		{
			name: "markRevertedPagesAsMinor",
			label: "چنین واگردانی‌هایی را با ویرایش جزئی نشانه‌گذاری نمایید",
			type: "set",
			setValues: { agf: "واگردانی فحن", norm: "واگردانی با خلاصه", vand: "واگردانی خرابکاری", torev: "\"واگردانی به این نسخه\"" }
		},

		// TwinkleConfig.watchRevertedPages (array)
		// What types of actions that should result in forced addition to watchlist
		{
			name: "watchRevertedPages",
			label: "صفحه‌ها را به دلیل این نوع واگردانی‌ها به فهرست پیگیری‌ها بیفزایید",
			type: "set",
			setValues: { agf: "واگردانی فحن", norm: "واگردانی با خلاصه", vand: "واگردانی خرابکاری", torev: "\"واگردانی به این نسخه\"" }
		},

		// TwinkleConfig.offerReasonOnNormalRevert (boolean)
		// If to offer a prompt for extra summary reason for normal reverts, default to true
		{
			name: "offerReasonOnNormalRevert",
			label: "درخواست دلیل برای واگردانی‌های معمولی",
			helptip: "\"Normal\" rollbacks are the ones that are invoked from the middle [rollback] link.",
			type: "boolean"
		},

		{
			name: "confirmOnFluff",
			label: "پیام تأیید قبل از واگردانی تهیه شود",
			helptip: "For users of pen or touch devices, and chronically indecisive people.",
			type: "boolean"
		},

		// TwinkleConfig.showRollbackLinks (array)
		// Where Twinkle should show rollback links (diff, others, mine, contribs)
		// Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
		{
			name: "showRollbackLinks",
			label: "نمایش پیوندهای واگردانی در این صفحه‌ها",
			type: "set",
			setValues: { diff: "تغییرات صفحه‌ها", others: "مشارکت‌های کاربرهای دیگر", mine: "مشارکت‌های من" }
		}
	]
},

{
	title: "برچسب آی‌پی مشترک",
	inFriendlyConfig: true,
	preferences: [
		{
			name: "markSharedIPAsMinor",
			label: "آی پی مشترک را با ویرایش جزئی نشانه‌گذاری نمایید",
			type: "boolean"
		}
	]
},

{
	title: "حذف سریع",
	preferences: [
		// TwinkleConfig.speedyPromptOnG7 (boolean)
		{
			name: "speedyPromptOnG7",
			label: "درخواست دلیل برای برچسب ع۷ (درخواست نویسنده)",
			type: "boolean"
		},

		// TwinkleConfig.watchSpeedyPages (array)
		// Whether to add speedy tagged pages to watchlist
		{
			name: "watchSpeedyPages",
			label: "صفحه را پس از برچسب‌زدن به دلایل زیر به فهرست پیگیری‌ها بیفزایید",
			type: "set",
			setValues: Twinkle.config.commonSets.csdCriteria,
			setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
		},

		// TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
		// If, when applying speedy template to page, to mark the page as patrolled (if the page was reached from NewPages)
		{
			name: "markSpeedyPagesAsPatrolled",
			label: "به صفحه پس از برچسب‌زدن برچسب گشت بزن (اگر امکان دارد)",
			helptip: "Due to technical limitations, pages are only marked as patrolled when they are reached via Special:NewPages.",
			type: "boolean"
		},

		// TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
		// What types of actions should result that the author of the page being notified of nomination
		{
			name: "notifyUserOnSpeedyDeletionNomination",
			label: "تنها زمانی ایجاد کننده صفحه را آگاه سازید که تحت این معیارها برچسب زده‌اید",
			helptip: "Even if you choose to notify from the CSD screen, the notification will only take place for those criteria selected here.",
			type: "set",
			setValues: Twinkle.config.commonSets.csdCriteria,
			setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
		},

		// TwinkleConfig.welcomeUserOnSpeedyDeletionNotification (array of strings)
		// On what types of speedy deletion notifications shall the user be welcomed
		// with a "firstarticle" notice if his talk page has not yet been created.
		{
			name: "welcomeUserOnSpeedyDeletionNotification",
			label: "هنگام برچسب‌زدن با این معیارها، در کنار آگاه‌سازی سازندهٔ صفحه، به وی خوشامدگویی شود:",
			helptip: "The welcome is issued only if the user is notified about the deletion, and only if their talk page does not already exist. The template used is {{<a href=\"" + mw.util.getUrl("Template:Firstarticle") + "\">firstarticle</a>}}.",
			type: "set",
			setValues: Twinkle.config.commonSets.csdCriteria,
			setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
		},

		// TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
		{
			name: "promptForSpeedyDeletionSummary",
			label: "اجازه ویرایش خلاصه حذف وقتی حذف کردن تحت این معیارها باشد",
			adminOnly: true,
			type: "set",
			setValues: Twinkle.config.commonSets.csdAndDICriteria,
			setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
		},

		// TwinkleConfig.openUserTalkPageOnSpeedyDelete (array of strings)
		// What types of actions that should result user talk page to be opened when speedily deleting (admin only)
		{
			name: "openUserTalkPageOnSpeedyDelete",
			label: "صفحهٔ بحث کاربر را پس از پاک کردن به دلیل‌های زیر باز کن",
			adminOnly: true,
			type: "set",
			setValues: Twinkle.config.commonSets.csdAndDICriteria,
			setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
		},

		// TwinkleConfig.deleteTalkPageOnDelete (boolean)
		// If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
		{
			name: "deleteTalkPageOnDelete",
			label: "انتخاب  \"همچنین صفحه بحث را هم حذف کن\" جعبه پیش‌فرض",
			adminOnly: true,
			type: "boolean"
		},

		// TwinkleConfig.deleteSysopDefaultToTag (boolean)
		// Make the CSD screen default to "tag" instead of "delete" (admin only)
		{
			name: "deleteSysopDefaultToTag",
			label: "پیش‌فرض خذف سریع برای حذف",
			adminOnly: true,
			type: "boolean"
		},

		// TwinkleConfig.speedyWindowWidth (integer)
		// Defines the width of the Twinkle SD window in pixels
		{
			name: "speedyWindowWidth",
			label: "عرض پنجره حذف سریع (پیکسل)",
			type: "integer"
		},

		// TwinkleConfig.speedyWindowWidth (integer)
		// Defines the width of the Twinkle SD window in pixels
		{
			name: "speedyWindowHeight",
			label: "ارتفاع پنجره حذف سریع (پیکسل)",
			helptip: "If you have a big monitor, you might like to increase this.",
			type: "integer"
		},

		{
			name: "logSpeedyNominations",
			label: "فهرست کردن نام صفحه‌هایی که شما آنها را برای حذف سریع نامزد کردید ",
			helptip: "Since non-admins do not have access to their deleted contributions, the userspace log offers a good way to keep track of all pages you nominate for CSD using Twinkle. Files tagged using DI are also added to this log.",
			type: "boolean"
		},
		{
			name: "speedyLogPageName",
			label: "محل فهرست کردن صفحه‌های حذف سریع در زیرصفحهٔ کاربری شما",
			helptip: "i.e. User:<i>username</i>/<i>subpage name</i>. Only works if you turn on the CSD userspace log.",
			type: "string"
		},
		{
			name: "noLogOnSpeedyNomination",
			label: "هنگام برچسب‌زدن با این معیارها، ثبتی در فضای کاربری ساخته نشود:",
			type: "set",
			setValues: Twinkle.config.commonSets.csdAndDICriteria,
			setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
		}
	]
},

{
	title: "برچسب",
	inFriendlyConfig: true,
	preferences: [
		{
			name: "watchTaggedPages",
			label: "صفحه را پس از برچسب‌زدن به فهرست پیگیری‌ها بیفزایید",
			type: "boolean"
		},
		{
			name: "markTaggedPagesAsMinor",
			label: "افزودن برچسب‌ها را با ویرایش جزئی نشانه‌گذاری نمایید",
			type: "boolean"
		},
		{
			name: "markTaggedPagesAsPatrolled",
			label: "به صفحه پس از برچسب‌زدن برچسب گشت بزن (اگر امکان دارد)",
			helptip: "Due to technical limitations, pages are only marked as patrolled when they are reached via Special:NewPages.",
			type: "boolean"
		},
		{
			name: "groupByDefault",
			label: "جعبهٔ \"گروه‌بندی در {{چند موضوع}}\" به صورت پیش‌فرض انتخاب شده باشد",
			type: "boolean"
		},
		{
			name: "tagArticleSortOrder",
			label: "ترتیب نمایش پیش‌فرض برای برچسب‌های مقالات",
			type: "enum",
			enumValues: { "cat": "موضوعا گؤره", "alpha": "الفبایا گؤره" }
		},
		{
			name: "customTagList",
			label: "نمایش برچسب‌های سفارشی نگهداری مقاله",
			helptip: "These appear as additional options at the bottom of the list of tags. For example, you could add new maintenance tags which have not yet been added to Twinkle's defaults.",
			type: "customList",
			customListValueTitle: "نام الگو (بدون براکت)",
			customListLabelTitle: "متنی که در پنجره برچسب مشاهده می‌شود"
		}
	]
},

{
	title: "بازبحث",
	inFriendlyConfig: true,
	preferences: [
		{
			name: "markTalkbackAsMinor",
			label: "بازبحث‌ها را با ویرایش جزئی نشانه‌گذاری نمایید",
			type: "boolean"
		},
		{
			name: "insertTalkbackSignature",
			label: "قرار دادن امضا داخل بازبحث‌ها",
			type: "boolean"
		},
		{
			name: "talkbackHeading",
			label: "افزودن بخش برای بازبحث‌ها",
			type: "string"
		},
		{
			name: "adminNoticeHeading",
			label: "بخش سربرگ برای استفاده مدیران برای اطلاع‌رسانی‌‌ها",
			type: "string"
		}
	]
},

{
	title: "باغلانتی کس",
	preferences: [
		// TwinkleConfig.unlinkNamespaces (array)
		// In what namespaces unlink should happen, default in 0 (article) and 100 (portal)
		{
			name: "unlinkNamespaces",
			label: "حذف کردن پیوندها از صفحات در این فضای نام",
			helptip: "Avoid selecting any talk namespaces, as Twinkle might end up unlinking on talk archives (a big no-no).",
			type: "set",
			setValues: Twinkle.config.commonSets.namespacesNoSpecial
		}
	]
},
/*
{
	title: "Warn user",
	preferences: [
		// TwinkleConfig.defaultWarningGroup (int)
		// if true, watch the page which has been dispatched an warning or notice, if false, default applies
		{
			name: "defaultWarningGroup",
			label: "سطح هشدار پیش‌فرض",
			type: "enum",
			enumValues: { "1": "Level 1", "2": "Level 2", "3": "Level 3", "4": "Level 4", "5": "Level 4im", "6": "Single-issue notices", "7": "Single-issue warnings", "8": "Block (admin only)" }
		},

		// TwinkleConfig.showSharedIPNotice may take arguments:
		// true: to show shared ip notice if an IP address
		// false: to not print the notice
		{
			name: "showSharedIPNotice",
			label: "افزودن توجه اضافی در صفحه‌های بحث آی‌پی‌های مشترک",
			helptip: "Notice used is {{<a href='" + mw.util.getUrl("Template:SharedIPAdvice") + "'>SharedIPAdvice</a>}}",
			type: "boolean"
		},

		// TwinkleConfig.watchWarnings (boolean)
		// if true, watch the page which has been dispatched an warning or notice, if false, default applies
		{
			name: "watchWarnings",
			label: "صفحهٔ بحث کاربر را پس از تذکر به فهرست پیگیری‌ها اضافه کن",
			type: "boolean"
		},

		// TwinkleConfig.blankTalkpageOnIndefBlock (boolean)
		// if true, blank the talk page when issuing an indef block notice (per [[ویکی‌پدیا:نام کاربری]])
		{
			name: "blankTalkpageOnIndefBlock",
			label: "صفحه بحث کاربر را به هنگام بی‌پایان بستن خالی کن",
			helptip: "See <a href=\"" + mw.util.getUrl("WP:UW#Indefinitely blocked users") + "\">WP:UW</a> for more information.",
			adminOnly: true,
			type: "boolean"
		}
	]
},

{
	title: "Welcome user",
	inFriendlyConfig: true,
	preferences: [
		{
			name: "topWelcomes",
			label: "پیام خوش‌آمدگویی را در بالای محتویات کنونی صفحه بحث کاربر قرار دهید",
			type: "boolean"
		},
		{
			name: "watchWelcomes",
			label: "صفحه‌های بحث کاربران را پس از خوش‌آمدگویی به فهرست پیگیری‌ها بیفزایید",
			helptip: "Doing so adds to the personal element of welcoming a user - you will be able to see how they are coping as a newbie, and possibly help them.",
			type: "boolean"
		},
		{
			name: "insertHeadings",
			label: "افزودن بخش پیش از خوشامدگویی‌ها",
			type: "boolean"
		},
		{
			name: "welcomeHeading",
			label: "افزودن بخش برای خوش‌آمدگویی‌ها",
			helptip: "Only has an effect if headings are enabled, and the heading is not part of the template.",
			type: "string"
		},
		{
			name: "insertUsername",
			label: "نام کاربریتان را زمانی که امکان دارد به الگو اضافه کنید",
			helptip: "Some welcome templates have an opening sentence like \"Hi, I'm &lt;username&gt;. Welcome\" etc. If you turn off this option, these templates will not display your username in that way.",
			type: "boolean"
		},
		{
			name: "insertSignature",
			label: "پس از خوش‌آمدگویی امضا کنید",
			helptip: "Strongly recommended.",
			type: "boolean"
		},
		{
			name: "markWelcomesAsMinor",
			label: "خوش‌آمدگویی‌ها را با ویرایش جزئی نشانه‌گذاری نمایید",
			type: "boolean"
		},
		{
			name: "maskTemplateInSummary",
			label: "حذف نام الگوی خوشامدگویی در خلاصه ویرایش",
			helptip: "The names of some of the templates (e.g. \"welcome-anon-vandal\") may be viewed by the user as attacks, so it is better to leave them out of the edit summary",
			type: "boolean"
		},
		{
			name: "quickWelcomeMode",
			label: "Clicking the \"welcome\" link on a diff page will",
			helptip: "If you choose to welcome automatically, the template you specify below will be used.",
			type: "enum",
			enumValues: { auto: "welcome automatically", norm: "prompt you to select a template" }
		},
		{
			name: "quickWelcomeTemplate",
			label: "الگویی که هنگام خوش‌آمدگویی خودکار باید مورد استفاده قرار گیرد",
			helptip: "Enter the name of a welcome template, without the curly brackets. A link to the given article will be added.",
			type: "string"
		},
		{
			name: "customWelcomeList",
			label: "نمایش الگوهای سفارشی خوشامدگویی",
			helptip: "You can add other welcome templates, or user subpages that are welcome templates (prefixed with \"User:\"). Don't forget that these templates are substituted onto user talk pages.",
			type: "customList",
			customListValueTitle: "Template name (no curly brackets)",
			customListLabelTitle: "Text to show in Welcome dialog"
		}
	]
},
*/
//غیر فعال سازی در ترجیحات
{
	title: "نظرخواهی حذف وپ:نبح",
	preferences: [
		// TwinkleConfig.xfdWatchPage (string)
		// The watchlist setting of the page being nominated for XfD. Either "yes" (add to watchlist), "no" (don't
		// add to watchlist), or "default" (use setting from preferences). Default is "default" (duh).
		{
			name: "xfdWatchPage",
			label: "صفحهٔ مقاله نامزد شده، را به فهرست پیگیری‌ها بیفزای",
			type: "enum",
			enumValues: Twinkle.config.commonEnums.watchlist
		},

		// TwinkleConfig.xfdWatchDiscussion (string)
		// The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
		// or the list page for the other processes.
		// Either "yes" (add to watchlist), "no" (don't add to watchlist), or "default" (use setting from preferences). Default is "default" (duh).
		{
			name: "xfdWatchDiscussion",
			label: "صفحهٔ نظرخواهی حذف را به فهرست پیگیری‌ها بیفزای",
			helptip: "This refers to the discussion subpage (for AfD and MfD) or the daily log page (for TfD, CfD, RfD and FfD)",
			type: "enum",
			enumValues: Twinkle.config.commonEnums.watchlist
		},

		// TwinkleConfig.xfdWatchList (string)
		// The watchlist setting of the XfD list page, *if* the discussion is on a separate page. Either "yes" (add to watchlist), "no" (don't
		// add to watchlist), or "default" (use setting from preferences). Default is "no" (Hehe. Seriously though, who wants to watch it?
		// Sorry in advance for any false positives.).
		{
			name: "xfdWatchList",
			label: "افزودن سیاهه یا فهرست صفحه، به صورت روزانه به پیگیری‌های من (هرجا که ممکن بود)",
			helptip: "This only applies for AfD and MfD, where the discussions are transcluded onto a daily log page (for AfD) or the main MfD page (for MfD).",
			type: "enum",
			enumValues: Twinkle.config.commonEnums.watchlist
		},

		// TwinkleConfig.xfdWatchUser (string)
		// The watchlist setting of the user if he receives a notification. Either "yes" (add to watchlist), "no" (don't
		// add to watchlist), or "default" (use setting from preferences). Default is "default" (duh).
		{
			name: "xfdWatchUser",
			label: "صفحهٔ بحث کاربر را (پس از تذکر) به فهرست پیگیری‌ها بیفزای",
			type: "enum",
			enumValues: Twinkle.config.commonEnums.watchlist
		}
	]
},

{
	title: "Hidden",
	hidden: true,
	preferences: [
		// twinkle.header.js: portlet setup
		{
			name: "portletArea",
			type: "string"
		},
		{
			name: "portletId",
			type: "string"
		},
		{
			name: "portletName",
			type: "string"
		},
		{
			name: "portletType",
			type: "string"
		},
		{
			name: "portletNext",
			type: "string"
		},
		// twinklefluff.js: defines how many revision to query maximum, maximum possible is 50, default is 50
		{
			name: "revertMaxRevisions",
			type: "integer"
		},
		// twinklebatchdelete.js: How many pages should be processed at a time
		{
			name: "batchdeleteChunks",
			type: "integer"
		},
		// twinklebatchdelete.js: How many pages left in the process of being completed should allow a new batch to be initialized
		{
			name: "batchDeleteMinCutOff",
			type: "integer"
		},
		// twinklebatchdelete.js: How many pages should be processed maximum
		{
			name: "batchMax",
			type: "integer"
		},
		// twinklebatchprotect.js: How many pages should be processed at a time
		{
			name: "batchProtectChunks",
			type: "integer"
		},
		// twinklebatchprotect.js: How many pages left in the process of being completed should allow a new batch to be initialized
		{
			name: "batchProtectMinCutOff",
			type: "integer"
		},
		// twinklebatchundelete.js: How many pages should be processed at a time
		{
			name: "batchundeleteChunks",
			type: "integer"
		},
		// twinklebatchundelete.js: How many pages left in the process of being completed should allow a new batch to be initialized
		{
			name: "batchUndeleteMinCutOff",
			type: "integer"
		},
		// twinkledelimages.js: How many files should be processed at a time
		{
			name: "deliChunks",
			type: "integer"
		},
		// twinkledelimages.js: How many files should be processed maximum
		{
			name: "deliMax",
			type: "integer"
		},
		// twinkledeprod.js: How many pages should be processed at a time
		{
			name: "proddeleteChunks",
			type: "integer"
		}
	]
}

]; // end of Twinkle.config.sections
/*</pre>
=== بخش ۹===
<pre>*/ 
//{
//			name: "",
//			label: "",
//			type: ""
//		},


Twinkle.config.init = function twinkleconfigInit() {

	if ((mw.config.get("wgPageName") === "ویکی‌پدیا:توینکل/ترجیحات" ||
	    (mw.config.get("wgNamespaceNumber") === 2 && mw.config.get("wgTitle").lastIndexOf("/Twinkle preferences") === (mw.config.get("wgTitle").length - 20))) &&
	    mw.config.get("wgAction") === "view") {
		// create the config page at ویکی‌پدیا:توینکل/ترجیحات, and at user subpages (for testing purposes)

		if (!document.getElementById("twinkle-config")) {
			return;  // maybe the page is misconfigured, or something - but any attempt to modify it will be pointless
		}

		// set style (the url() CSS function doesn't seem to work from wikicode - ?!)
		document.getElementById("twinkle-config-titlebar").style.backgroundImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB%2FqqA%2BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEhQTFRFr73ZobTPusjdsMHZp7nVwtDhzNbnwM3fu8jdq7vUt8nbxtDkw9DhpbfSvMrfssPZqLvVztbno7bRrr7W1d%2Fs1N7qydXk0NjpkW7Q%2BgAAADVJREFUeNoMwgESQCAAAMGLkEIi%2FP%2BnbnbpdB59app5Vdg0sXAoMZCpGoFbK6ciuy6FX4ABAEyoAef0BXOXAAAAAElFTkSuQmCC)";

		var contentdiv = document.getElementById("twinkle-config-content");
		contentdiv.textContent = "";  // clear children

		// let user know about possible conflict with monobook.js/vector.js file
		// (settings in that file will still work, but they will be overwritten by twinkleoptions.js settings)
		var contentnotice = document.createElement("p");
		// I hate innerHTML, but this is one thing it *is* good for...
		contentnotice.innerHTML = "<b>قبل از ویرایش ترجیحات توینکل</b> مطمئن شوید که هر گونه اسکریپت قدیمی <code>TwinkleConfig</code> و <code>FriendlyConfig</code> از <a href=\"" + mw.util.getUrl("Special:MyPage/skin.js") + "\" title=\"Special:MyPage/skin.js\"> جاوااسکریپت‌های کاربریتان راحذف یا پاکسازی کرده‌اید.</a>.";
		contentdiv.appendChild(contentnotice);

		// look and see if the user does in fact have any old settings in their skin JS file
		var skinjs = new Morebits.wiki.page("User:" + mw.config.get("wgUserName") + "/" + mw.config.get("skin") + ".js");
		skinjs.setCallbackParameters(contentnotice);
		skinjs.load(Twinkle.config.legacyPrefsNotice);

		// start a table of contents
		var toctable = document.createElement("table");
		toctable.className = "toc";
		toctable.style.marginLeft = "0.4em";
		var toctr = document.createElement("tr");
		var toctd = document.createElement("td");
		// create TOC title
		var toctitle = document.createElement("div");
		toctitle.id = "toctitle";
		var toch2 = document.createElement("h2");
		toch2.textContent = "محتویات ";
		toctitle.appendChild(toch2);
		// add TOC show/hide link
		var toctoggle = document.createElement("span");
		toctoggle.className = "toctoggle";
		toctoggle.appendChild(document.createTextNode("["));
		var toctogglelink = document.createElement("a");
		toctogglelink.className = "internal";
		toctogglelink.setAttribute("href", "#tw-tocshowhide");
		toctogglelink.textContent = "مخفی";
		toctoggle.appendChild(toctogglelink);
		toctoggle.appendChild(document.createTextNode("]"));
		toctitle.appendChild(toctoggle);
		toctd.appendChild(toctitle);
		// create item container: this is what we add stuff to
		var tocul = document.createElement("ul");
		toctogglelink.addEventListener("click", function twinkleconfigTocToggle() {
			var $tocul = $(tocul);
			$tocul.toggle();
			if ($tocul.find(":visible").length) {
				toctogglelink.textContent = "مخفی";
			} else {
				toctogglelink.textContent = "نمایش";
			}
		}, false);
		toctd.appendChild(tocul);
		toctr.appendChild(toctd);
		toctable.appendChild(toctr);
		contentdiv.appendChild(toctable);

		var tocnumber = 1;

		var contentform = document.createElement("form");
		contentform.setAttribute("action", "javascript:void(0)");  // was #tw-save - changed to void(0) to work around Chrome issue
		contentform.addEventListener("submit", Twinkle.config.save, true);
		contentdiv.appendChild(contentform);

		var container = document.createElement("table");
		container.style.width = "100%";
		contentform.appendChild(container);

		$(Twinkle.config.sections).each(function(sectionkey, section) {
			if (section.hidden || (section.adminOnly && !Morebits.userIsInGroup("sysop"))) {
				return true;  // i.e. "continue" in this context
			}

			var configgetter;  // retrieve the live config values
			if (section.inFriendlyConfig) {
				configgetter = Twinkle.getFriendlyPref;
			} else {
				configgetter = Twinkle.getPref;
			}

			// add to TOC
			var tocli = document.createElement("li");
			tocli.className = "toclevel-1";
			var toca = document.createElement("a");
			toca.setAttribute("href", "#twinkle-config-section-" + tocnumber.toString());
			toca.appendChild(document.createTextNode(section.title));
			tocli.appendChild(toca);
			tocul.appendChild(tocli);

			var row = document.createElement("tr");
			var cell = document.createElement("td");
			cell.setAttribute("colspan", "3");
			var heading = document.createElement("h4");
			heading.style.borderBottom = "1px solid gray";
			heading.style.marginTop = "0.2em";
			heading.id = "twinkle-config-section-" + (tocnumber++).toString();
			heading.appendChild(document.createTextNode(section.title));
			cell.appendChild(heading);
			row.appendChild(cell);
			container.appendChild(row);

			var rowcount = 1;  // for row banding

			// add each of the preferences to the form
			$(section.preferences).each(function(prefkey, pref) {
				if (pref.adminOnly && !Morebits.userIsInGroup("sysop")) {
					return true;  // i.e. "continue" in this context
				}

				row = document.createElement("tr");
				row.style.marginBottom = "0.2em";
				// create odd row banding
				if (rowcount++ % 2 === 0) {
					row.style.backgroundColor = "rgba(128, 128, 128, 0.1)";
				}
				cell = document.createElement("td");

				var label, input;
				switch (pref.type) {

					case "boolean":  // create a checkbox
						cell.setAttribute("colspan", "2");

						label = document.createElement("label");
						input = document.createElement("input");
						input.setAttribute("type", "checkbox");
						input.setAttribute("id", pref.name);
						input.setAttribute("name", pref.name);
						if (configgetter(pref.name) === true) {
							input.setAttribute("checked", "checked");
						}
						label.appendChild(input);
						label.appendChild(document.createTextNode(" " + pref.label));
						cell.appendChild(label);
						break;

					case "string":  // create an input box
					case "integer":
						// add label to first column
						cell.style.textAlign = "right";
						cell.style.paddingRight = "0.5em";
						label = document.createElement("label");
						label.setAttribute("for", pref.name);
						label.appendChild(document.createTextNode(pref.label + ":"));
						cell.appendChild(label);
						row.appendChild(cell);

						// add input box to second column
						cell = document.createElement("td");
						cell.style.paddingRight = "1em";
						input = document.createElement("input");
						input.setAttribute("type", "text");
						input.setAttribute("id", pref.name);
						input.setAttribute("name", pref.name);
						if (pref.type === "integer") {
							input.setAttribute("size", 6);
							input.setAttribute("type", "number");
							input.setAttribute("step", "1");  // integers only
						}
						if (configgetter(pref.name)) {
							input.setAttribute("value", configgetter(pref.name));
						}
						cell.appendChild(input);
						break;

					case "enum":  // create a combo box
						// add label to first column
						// note: duplicates the code above, under string/integer
						cell.style.textAlign = "right";
						cell.style.paddingRight = "0.5em";
						label = document.createElement("label");
						label.setAttribute("for", pref.name);
						label.appendChild(document.createTextNode(pref.label + ":"));
						cell.appendChild(label);
						row.appendChild(cell);

						// add input box to second column
						cell = document.createElement("td");
						cell.style.paddingRight = "1em";
						input = document.createElement("select");
						input.setAttribute("id", pref.name);
						input.setAttribute("name", pref.name);
						$.each(pref.enumValues, function(enumvalue, enumdisplay) {
							var option = document.createElement("option");
							option.setAttribute("value", enumvalue);
							if (configgetter(pref.name) == enumvalue) {
								option.setAttribute("selected", "selected");
							}
							option.appendChild(document.createTextNode(enumdisplay));
							input.appendChild(option);
						});
						cell.appendChild(input);
						break;

					case "set":  // create a set of check boxes
						// add label first of all
						cell.setAttribute("colspan", "2");
						label = document.createElement("label");  // not really necessary to use a label element here, but we do it for consistency of styling
						label.appendChild(document.createTextNode(pref.label + ":"));
						cell.appendChild(label);

						var checkdiv = document.createElement("div");
						checkdiv.style.paddingLeft = "1em";
						var worker = function(itemkey, itemvalue) {
							var checklabel = document.createElement("label");
							checklabel.style.marginRight = "0.7em";
							checklabel.style.display = "inline-block";
							var check = document.createElement("input");
							check.setAttribute("type", "checkbox");
							check.setAttribute("id", pref.name + "_" + itemkey);
							check.setAttribute("name", pref.name + "_" + itemkey);
							if (configgetter(pref.name) && configgetter(pref.name).indexOf(itemkey) !== -1) {
								check.setAttribute("checked", "checked");
							}
							// cater for legacy integer array values for unlinkNamespaces (this can be removed a few years down the track...)
							if (pref.name === "unlinkNamespaces") {
								if (configgetter(pref.name) && configgetter(pref.name).indexOf(parseInt(itemkey, 10)) !== -1) {
									check.setAttribute("checked", "checked");
								}
							}
							checklabel.appendChild(check);
							checklabel.appendChild(document.createTextNode(itemvalue));
							checkdiv.appendChild(checklabel);
						};
						if (pref.setDisplayOrder) {
							// add check boxes according to the given display order
							$.each(pref.setDisplayOrder, function(itemkey, item) {
								worker(item, pref.setValues[item]);
							});
						} else {
							// add check boxes according to the order it gets fed to us (probably strict alphabetical)
							$.each(pref.setValues, worker);
						}
						cell.appendChild(checkdiv);
						break;

					case "customList":
						// add label to first column
						cell.style.textAlign = "right";
						cell.style.paddingRight = "0.5em";
						label = document.createElement("label");
						label.setAttribute("for", pref.name);
						label.appendChild(document.createTextNode(pref.label + ":"));
						cell.appendChild(label);
						row.appendChild(cell);

						// add button to second column
						cell = document.createElement("td");
						cell.style.paddingRight = "1em";
						var button = document.createElement("button");
						button.setAttribute("id", pref.name);
						button.setAttribute("name", pref.name);
						button.setAttribute("type", "button");
						button.addEventListener("click", Twinkle.config.listDialog.display, false);
						// use jQuery data on the button to store the current config value
						$(button).data({
							value: configgetter(pref.name),
							pref: pref,
							inFriendlyConfig: section.inFriendlyConfig
						});
						button.appendChild(document.createTextNode("ویرایش موردها"));
						cell.appendChild(button);
						break;

					default:
						alert("twinkleconfig: unknown data type for preference " + pref.name);
						break;
				}
				row.appendChild(cell);

				// add help tip
				cell = document.createElement("td");
				cell.style.fontSize = "90%";

				cell.style.color = "gray";
				if (pref.helptip) {
					cell.innerHTML = pref.helptip;
				}
				// add reset link (custom lists don't need this, as their config value isn't displayed on the form)
				if (pref.type !== "customList") {
					var resetlink = document.createElement("a");
					resetlink.setAttribute("href", "#tw-reset");
					resetlink.setAttribute("id", "twinkle-config-reset-" + pref.name);
					resetlink.addEventListener("click", Twinkle.config.resetPrefLink, false);
					if (resetlink.style.styleFloat) {  // IE (inc. IE9)
						resetlink.style.styleFloat = "right";
					} else {  // standards
						resetlink.style.cssFloat = "right";
					}
					resetlink.style.margin = "0 0.6em";
					resetlink.appendChild(document.createTextNode("پیش‌فرض"));
					cell.appendChild(resetlink);
				}
				row.appendChild(cell);

				container.appendChild(row);
				return true;
			});
			return true;
		});

		var footerbox = document.createElement("div");
		footerbox.setAttribute("id", "twinkle-config-buttonpane");
		footerbox.style.backgroundColor = "#BCCADF";
		footerbox.style.padding = "0.5em";
		var button = document.createElement("button");
		button.setAttribute("id", "twinkle-config-submit");
		button.setAttribute("type", "submit");
		button.appendChild(document.createTextNode("ذخیره تغییرات"));
		footerbox.appendChild(button);
		var footerspan = document.createElement("span");
		footerspan.className = "plainlinks";
		footerspan.style.marginLeft = "2.4em";
		footerspan.style.fontSize = "90%";
		var footera = document.createElement("a");
		footera.setAttribute("href", "#tw-reset-all");
		footera.setAttribute("id", "twinkle-config-resetall");
		footera.addEventListener("click", Twinkle.config.resetAllPrefs, false);
		footera.appendChild(document.createTextNode("بازگردانی به پیش‌فرض"));
		footerspan.appendChild(footera);
		footerbox.appendChild(footerspan);
		contentform.appendChild(footerbox);

		// since all the section headers exist now, we can try going to the requested anchor
		if (location.hash) {
			location.hash = location.hash;
		}

	} else if (mw.config.get("wgNamespaceNumber") === 2) {

		var box = document.createElement("div");
		box.setAttribute("id", "twinkle-config-headerbox");
		box.style.border = "1px #f60 solid";
		box.style.background = "#fed";
		box.style.padding = "0.6em";
		box.style.margin = "0.5em auto";
		box.style.textAlign = "center";

		var link;
		if (mw.config.get("wgTitle") === mw.config.get("wgUserName") + "/twinkleoptions.js") {
			// place "why not try the preference panel" notice
			box.style.fontWeight = "bold";
			box.style.width = "80%";
			box.style.borderWidth = "2px";

			if (mw.config.get("wgArticleId") > 0) {  // page exists
				box.appendChild(document.createTextNode("این صفحه شامل تنظیمات توینکل برای شما است. شما می‌توانید از "));
			} else {  // page does not exist
				box.appendChild(document.createTextNode("شما می‌توانید تنظیمات مطلوبتان را در ترجیحات توینکل انجام دهید."));
			}
			link = document.createElement("a");
			link.setAttribute("href", mw.util.getUrl("ویکی‌پدیا:توینکل/ترجیحات") );
			link.appendChild(document.createTextNode("صفحهٔ ترجیحات توینکل"));
			box.appendChild(link);
			box.appendChild(document.createTextNode(" برای ویرایش آن استفاده نمایید یا به صورت دستی آن را ویرایش کنید."));
			$(box).insertAfter($("#contentSub"));

		} else if (mw.config.get("wgTitle").indexOf(mw.config.get("wgUserName")) === 0 && mw.config.get("wgTitle").lastIndexOf(".js") == mw.config.get("wgTitle").length - 3) {
			// place "Looking for Twinkle options?" notice
			box.style.width = "60%";

			box.appendChild(document.createTextNode("می‌توانید توینکل را شخصی‌سازی کنید."));
			link = document.createElement("a");
			link.setAttribute("href", mw.util.getUrl("ویکی‌پدیا:توینکل/ترجیحات") );
			link.appendChild(document.createTextNode("صفحهٔ ترجیحات توینکل"));
			box.appendChild(link);
			box.appendChild(document.createTextNode("."));
			$(box).insertAfter($("#contentSub"));
		}
	}
};

// Morebits.wiki.page callback from init code
Twinkle.config.legacyPrefsNotice = function twinkleconfigLegacyPrefsNotice(pageobj) {
	var text = pageobj.getPageText();
	var contentnotice = pageobj.getCallbackParameters();
	if (text.indexOf("TwinkleConfig") !== -1 || text.indexOf("FriendlyConfig") !== -1) {
		contentnotice.innerHTML = '<table class="plainlinks ombox ombox-content"><tr><td class="mbox-image">' +
			'<img alt="" src="//upload.wikimedia.org/wikipedia/en/3/38/Imbox_content.png" /></td>' +
			'<td class="mbox-text"><p><big><b>Before modifying your settings here,</b> you must remove your old Twinkle and Friendly settings from your personal skin JavaScript.</big></p>' +
			'<p>To do this, you can <a href="' + mw.config.get("wgScript") + '?title=User:' + encodeURIComponent(mw.config.get("wgUserName")) + '/' + mw.config.get("skin") + '.js&action=edit" target="_tab"><b>edit your personal JavaScript</b></a>, removing all lines of code that refer to <code>TwinkleConfig</code> and <code>FriendlyConfig</code>.</p>' +
			'</td></tr></table>';
	} else {
		$(contentnotice).remove();
	}
};

// custom list-related stuff
/*</pre>
=== بخش ۱۰===
<pre>*/ 
Twinkle.config.listDialog = {};

Twinkle.config.listDialog.addRow = function twinkleconfigListDialogAddRow(dlgtable, value, label) {
	var contenttr = document.createElement("tr");
	// "remove" button
	var contenttd = document.createElement("td");
	var removeButton = document.createElement("button");
	removeButton.setAttribute("type", "button");
	removeButton.addEventListener("click", function() { $(contenttr).remove(); }, false);
	removeButton.textContent = "حذف";
	contenttd.appendChild(removeButton);
	contenttr.appendChild(contenttd);

	// value input box
	contenttd = document.createElement("td");
	var input = document.createElement("input");
	input.setAttribute("type", "text");
	input.className = "twinkle-config-customlist-value";
	input.style.width = "97%";
	if (value) {
		input.setAttribute("value", value);
	}
	contenttd.appendChild(input);
	contenttr.appendChild(contenttd);

	// label input box
	contenttd = document.createElement("td");
	input = document.createElement("input");
	input.setAttribute("type", "text");
	input.className = "twinkle-config-customlist-label";
	input.style.width = "98%";
	if (label) {
		input.setAttribute("value", label);
	}
	contenttd.appendChild(input);
	contenttr.appendChild(contenttd);

	dlgtable.appendChild(contenttr);
};

Twinkle.config.listDialog.display = function twinkleconfigListDialogDisplay(e) {
	var $prefbutton = $(e.target);
	var curvalue = $prefbutton.data("value");
	var curpref = $prefbutton.data("pref");

	var dialog = new Morebits.simpleWindow(720, 400);
	dialog.setTitle(curpref.label);
	dialog.setScriptName("ترجیحات توینکل");

	var dialogcontent = document.createElement("div");
	var dlgtable = document.createElement("table");
	dlgtable.className = "wikitable";
	dlgtable.style.margin = "1.4em 1em";
	dlgtable.style.width = "auto";

	var dlgtbody = document.createElement("tbody");

	// header row
	var dlgtr = document.createElement("tr");
	// top-left cell
	var dlgth = document.createElement("th");
	dlgth.style.width = "5%";
	dlgtr.appendChild(dlgth);
	// value column header
	dlgth = document.createElement("th");
	dlgth.style.width = "35%";
	dlgth.textContent = (curpref.customListValueTitle ? curpref.customListValueTitle : "Value");
	dlgtr.appendChild(dlgth);
	// label column header
	dlgth = document.createElement("th");
	dlgth.style.width = "60%";
	dlgth.textContent = (curpref.customListLabelTitle ? curpref.customListLabelTitle : "Label");
	dlgtr.appendChild(dlgth);
	dlgtbody.appendChild(dlgtr);

	// content rows
	var gotRow = false;
	$.each(curvalue, function(k, v) {
		gotRow = true;
		Twinkle.config.listDialog.addRow(dlgtbody, v.value, v.label);
	});
	// if there are no values present, add a blank row to start the user off
	if (!gotRow) {
		Twinkle.config.listDialog.addRow(dlgtbody);
	}

	// final "add" button
	var dlgtfoot = document.createElement("tfoot");
	dlgtr = document.createElement("tr");
	var dlgtd = document.createElement("td");
	dlgtd.setAttribute("colspan", "3");
	var addButton = document.createElement("button");
	addButton.style.minWidth = "8em";
	addButton.setAttribute("type", "button");
	addButton.addEventListener("click", function(e) {
		Twinkle.config.listDialog.addRow(dlgtbody);
	}, false);
	addButton.textContent = "افزودن";
	dlgtd.appendChild(addButton);
	dlgtr.appendChild(dlgtd);
	dlgtfoot.appendChild(dlgtr);

	dlgtable.appendChild(dlgtbody);
	dlgtable.appendChild(dlgtfoot);
	dialogcontent.appendChild(dlgtable);

	// buttonpane buttons: [Save changes] [Reset] [Cancel]
	var button = document.createElement("button");
	button.setAttribute("type", "submit");  // so Morebits.simpleWindow puts the button in the button pane
	button.addEventListener("click", function(e) {
		Twinkle.config.listDialog.save($prefbutton, dlgtbody);
		dialog.close();
	}, false);
	button.textContent = "ذخیره تغییرات";
	dialogcontent.appendChild(button);
	button = document.createElement("button");
	button.setAttribute("type", "submit");  // so Morebits.simpleWindow puts the button in the button pane
	button.addEventListener("click", function(e) {
		Twinkle.config.listDialog.reset($prefbutton, dlgtbody);
	}, false);
	button.textContent = "پیش‌فرض";
	dialogcontent.appendChild(button);
	button = document.createElement("button");
	button.setAttribute("type", "submit");  // so Morebits.simpleWindow puts the button in the button pane
	button.addEventListener("click", function(e) {
		dialog.close();  // the event parameter on this function seems to be broken
	}, false);
	button.textContent = "لغو";
	dialogcontent.appendChild(button);

	dialog.setContent(dialogcontent);
	dialog.display();
};

// Resets the data value, re-populates based on the new (default) value, then saves the
// old data value again (less surprising behaviour)
Twinkle.config.listDialog.reset = function twinkleconfigListDialogReset(button, tbody) {
	// reset value on button
	var $button = $(button);
	var curpref = $button.data("pref");
	var oldvalue = $button.data("value");
	Twinkle.config.resetPref(curpref, $button.data("inFriendlyConfig"));

	// reset form
	var $tbody = $(tbody);
	$tbody.find("tr").slice(1).remove();  // all rows except the first (header) row
	// add the new values
	var curvalue = $button.data("value");
	$.each(curvalue, function(k, v) {
		Twinkle.config.listDialog.addRow(tbody, v.value, v.label);
	});

	// save the old value
	$button.data("value", oldvalue);
};

Twinkle.config.listDialog.save = function twinkleconfigListDialogSave(button, tbody) {
	var result = [];
	var current = {};
	$(tbody).find('input[type="text"]').each(function(inputkey, input) {
		if ($(input).hasClass("twinkle-config-customlist-value")) {
			current = { value: input.value };
		} else {
			current.label = input.value;
			// exclude totally empty rows
			if (current.value || current.label) {
				result.push(current);
			}
		}
	});
	$(button).data("value", result);
};

// reset/restore defaults

Twinkle.config.resetPrefLink = function twinkleconfigResetPrefLink(e) {
	var wantedpref = e.target.id.substring(21); // "twinkle-config-reset-" prefix is stripped

	// search tactics
	$(Twinkle.config.sections).each(function(sectionkey, section) {
		if (section.hidden || (section.adminOnly && !Morebits.userIsInGroup("sysop"))) {
			return true;  // continue: skip impossibilities
		}

		var foundit = false;

		$(section.preferences).each(function(prefkey, pref) {
			if (pref.name !== wantedpref) {
				return true;  // continue
			}
			Twinkle.config.resetPref(pref, section.inFriendlyConfig);
			foundit = true;
			return false;  // break
		});

		if (foundit) {
			return false;  // break
		}
	});
	return false;  // stop link from scrolling page
};

Twinkle.config.resetPref = function twinkleconfigResetPref(pref, inFriendlyConfig) {
	switch (pref.type) {

		case "boolean":
			document.getElementById(pref.name).checked = (inFriendlyConfig ?
				Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]);
			break;

		case "string":
		case "integer":
		case "enum":
			document.getElementById(pref.name).value = (inFriendlyConfig ?
				Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]);
			break;

		case "set":
			$.each(pref.setValues, function(itemkey, itemvalue) {
				if (document.getElementById(pref.name + "_" + itemkey)) {
					document.getElementById(pref.name + "_" + itemkey).checked = ((inFriendlyConfig ?
						Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]).indexOf(itemkey) !== -1);
				}
			});
			break;

		case "customList":
			$(document.getElementById(pref.name)).data("value", (inFriendlyConfig ?
				Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]));
			break;

		default:
			alert("twinkleconfig: unknown data type for preference " + pref.name);
			break;
	}
};

Twinkle.config.resetAllPrefs = function twinkleconfigResetAllPrefs() {
	// no confirmation message - the user can just refresh/close the page to abort
	$(Twinkle.config.sections).each(function(sectionkey, section) {
		if (section.hidden || (section.adminOnly && !Morebits.userIsInGroup("sysop"))) {
			return true;  // continue: skip impossibilities
		}
		$(section.preferences).each(function(prefkey, pref) {
			if (!pref.adminOnly || Morebits.userIsInGroup("sysop")) {
				Twinkle.config.resetPref(pref, section.inFriendlyConfig);
			}
		});
		return true;
	});
	return false;  // stop link from scrolling page
};

Twinkle.config.save = function twinkleconfigSave(e) {
	Morebits.status.init( document.getElementById("twinkle-config-content") );

	Morebits.wiki.actionCompleted.notice = "ذخیره";

	var userjs = "User:" + mw.config.get("wgUserName") + "/twinkleoptions.js";
	var wikipedia_page = new Morebits.wiki.page(userjs, "ذخیره ترجیحات در " + userjs);
	wikipedia_page.setCallbackParameters(e.target);
	wikipedia_page.load(Twinkle.config.writePrefs);

	return false;
};

// The JSON stringify method in the following code was excerpted from
// http://www.JSON.org/json2.js
// version of 2011-02-23

// Douglas Crockford, the code's author, has released it into the Public Domain.
// See http://www.JSON.org/js.html

var JSON;
if (!JSON) {
	JSON = {};
}

(function() {
	var escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
		gap,
		indent = '  ',  // hardcoded indent
		meta = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' };

	function quote(string) {
		escapable.lastIndex = 0;
		return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
			var c = meta[a];
			return typeof c === 'string' ? c :	'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
		}) + '"' : '"' + string + '"';
	}

	function str(key, holder) {
		var i, k, v, length, mind = gap, partial, value = holder[key];

		if (value && typeof value === 'object' && typeof value.toJSON === 'function') {
			value = value.toJSON(key);
		}

		switch (typeof value) {
		case 'string':
			return quote(value);
		case 'number':
			return isFinite(value) ? String(value) : 'null';
		case 'boolean':
		case 'null':
			return String(value);
		case 'object':
			if (!value) {
				return 'null';
			}
			gap += indent;
			partial = [];
			if (Object.prototype.toString.apply(value) === '[object Array]') {
				length = value.length;
				for (i = 0; i < length; i += 1) {
					partial[i] = str(i, value) || 'null';
				}
				v = partial.length === 0 ? '[]' : gap ?
					'[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
					'[' + partial.join(',') + ']';
				gap = mind;
				return v;
			}
			for (k in value) {
				if (Object.prototype.hasOwnProperty.call(value, k)) {
					v = str(k, value);
					if (v) {
						partial.push(quote(k) + (gap ? ': ' : ':') + v);
					}
				}
			}
			v = partial.length === 0 ? '{}' : gap ?
				'{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
				'{' + partial.join(',') + '}';
			gap = mind;
			return v;
		default:
			throw new Error( "JSON.stringify: اطلاعات نامعلوم" );
		}
	}

	if (typeof JSON.stringify !== 'function') {
		JSON.stringify = function (value, ignoredParam1, ignoredParam2) {
			ignoredParam1 = ignoredParam2;  // boredom
			gap = '';
			return str('', {'': value});
		};
	}
}());

Twinkle.config.writePrefs = function twinkleconfigWritePrefs(pageobj) {
	var form = pageobj.getCallbackParameters();
	var statelem = pageobj.getStatusElement();

	// this is the object which gets serialized into JSON
	var newConfig = {
		twinkle: {},
		friendly: {}
	};

	// keeping track of all preferences that we encounter
	// any others that are set in the user's current config are kept
	// this way, preferences that this script doesn't know about are not lost
	// (it does mean obsolete prefs will never go away, but... ah well...)
	var foundTwinklePrefs = [], foundFriendlyPrefs = [];

	// a comparison function is needed later on
	// it is just enough for our purposes (i.e. comparing strings, numbers, booleans,
	// arrays of strings, and arrays of { value, label })
	// and it is not very robust: e.g. compare([2], ["2"]) === true, and
	// compare({}, {}) === false, but it's good enough for our purposes here
	var compare = function(a, b) {
		if (Object.prototype.toString.apply(a) === "[object Array]") {
			if (a.length !== b.length) {
				return false;
			}
			var asort = a.sort(), bsort = b.sort();
			for (var i = 0; asort[i]; i++) {
				// comparison of the two properties of custom lists
				if ((typeof asort[i] === "object") && (asort[i].label !== bsort[i].label ||
					asort[i].value !== bsort[i].value)) {
					return false;
				} else if (asort[i].toString() !== bsort[i].toString()) { 
					return false;
				}
			}
			return true;
		} else {
			return a === b;
		}
	};

	$(Twinkle.config.sections).each(function(sectionkey, section) {
		if (section.adminOnly && !Morebits.userIsInGroup("sysop")) {
			return;  // i.e. "continue" in this context
		}

		// reach each of the preferences from the form
		$(section.preferences).each(function(prefkey, pref) {
			var userValue;  // = undefined

			// only read form values for those prefs that have them
			if (!section.hidden && (!pref.adminOnly || Morebits.userIsInGroup("sysop"))) {
				switch (pref.type) {

					case "boolean":  // read from the checkbox
						userValue = form[pref.name].checked;
						break;

					case "string":  // read from the input box or combo box
					case "enum":
						userValue = form[pref.name].value;
						break;

					case "integer":  // read from the input box
						userValue = parseInt(form[pref.name].value, 10);
						if (isNaN(userValue)) {
							Morebits.status.warn("ذخیره", "مقدارهای داده‌شده" + pref.name + " (" + pref.value + ") نادرست بود.  The save will continue, but the invalid data value will be skipped.");
							userValue = null;
						}
						break;

					case "set":  // read from the set of check boxes
						userValue = [];
						if (pref.setDisplayOrder) {
							// read only those keys specified in the display order
							$.each(pref.setDisplayOrder, function(itemkey, item) {
								if (form[pref.name + "_" + item].checked) {
									userValue.push(item);
								}
							});
						} else {
							// read all the keys in the list of values
							$.each(pref.setValues, function(itemkey, itemvalue) {
								if (form[pref.name + "_" + itemkey].checked) {
									userValue.push(itemkey);
								}
							});
						}
						break;

					case "customList":  // read from the jQuery data stored on the button object
						userValue = $(form[pref.name]).data("value");
						break;

					default:
						alert("twinkleconfig: unknown data type for preference " + pref.name);
						break;
				}
			}

			// only save those preferences that are *different* from the default
			if (section.inFriendlyConfig) {
				if (typeof userValue !== "undefined" && !compare(userValue, Twinkle.defaultConfig.friendly[pref.name])) {
					newConfig.friendly[pref.name] = userValue;
				}
				foundFriendlyPrefs.push(pref.name);
			} else {
				if (typeof userValue !== "undefined" && !compare(userValue, Twinkle.defaultConfig.twinkle[pref.name])) {
					newConfig.twinkle[pref.name] = userValue;
				}
				foundTwinklePrefs.push(pref.name);
			}
		});
	});

	if (Twinkle.prefs) {
		$.each(Twinkle.prefs.twinkle, function(tkey, tvalue) {
			if (foundTwinklePrefs.indexOf(tkey) === -1) {
				newConfig.twinkle[tkey] = tvalue;
			}
		});
		$.each(Twinkle.prefs.friendly, function(fkey, fvalue) {
			if (foundFriendlyPrefs.indexOf(fkey) === -1) {
				newConfig.friendly[fkey] = fvalue;
			}
		});
	}

	var text =
		"// twinkleoptions.js: personal Twinkle preferences file\n" +
		"//\n" +
		"// NOTE: The easiest way to change your Twinkle preferences is by using the\n" +
		"// Twinkle preferences panel, at [[" + mw.config.get("wgPageName") + "]].\n" +
		"//\n" +
		"// This file is AUTOMATICALLY GENERATED.  Any changes you make (aside from\n" +
		"// changing the configuration parameters in a valid-JavaScript way) will be\n" +
		"// overwritten the next time you click \"save\" in the Twinkle preferences\n" +
		"// panel.  If modifying this file, make sure to use correct JavaScript.\n" +
		"\n" +
		"window.Twinkle.prefs = ";
	text += JSON.stringify(newConfig, null, 2);
	text +=
		";\n" +
		"\n" +
		"// End of twinkleoptions.js\n";

	pageobj.setPageText(text);
	pageobj.setEditSummary("ذخیره ترجیحات توینکل: ویرایش خودکار به وسیلهٔ [[" + mw.config.get("wgPageName") + "]] ([[وپ:توینکل|توینکل]])");
	pageobj.setCreateOption("recreate");
	pageobj.save(Twinkle.config.saveSuccess);
};

Twinkle.config.saveSuccess = function twinkleconfigSaveSuccess(pageobj) {
	pageobj.getStatusElement().info("با موفقیت انجام شد");

	var noticebox = document.createElement("div");
	noticebox.className = "successbox";
	noticebox.style.fontSize = "100%";
	noticebox.style.marginTop = "2em";
	noticebox.innerHTML = "<p><b>ترجیحات توینکل شما ذخیره شدند.</b></p><p>برای مشاهده تغییرات نیاز به <b>خالی‌کردن کاشه مرورگر هست.</b> (see <a href=\"" + mw.util.getUrl("ویکی\u200cپدیا:دورزدن حافظه نهان") + "\" title=\"ویکی‌پدیا:دورزدن حافظه نهان\">ویکی\u200cپدیا:دورزدن حافظه نهان</a> برای اطلاعات بیشتر).</p>";
	Morebits.status.root.appendChild(noticebox);
	var noticeclear = document.createElement("br");
	noticeclear.style.clear = "both";
	Morebits.status.root.appendChild(noticeclear);
};
/*</pre>
=== بخش ۱۱===
<pre>*/ 
/*
****************************************
*** twinkledelimages.js: Batch deletion of images (sysops only)
****************************************
* Mode of invocation:     Tab ("Deli-batch")
* Active on:              Existing non-special pages
* Config directives in:   TwinkleConfig
*/

Twinkle.delimages = function twinkledeli() {
	if( mw.config.get( 'wgNamespaceNumber' ) < 0 || !mw.config.get( 'wgCurRevisionId' ) ) {
		return;
	}
	if( Morebits.userIsInGroup( 'sysop' ) ) {
		$(twAddPortletLink("#", "حذف پرونده‌های استفاده شده", "tw-deli", "حذف پروندهای پیوند شده در این صفحه", "")).click(Twinkle.delimages.callback);
	}
};

Twinkle.delimages.unlinkCache = {};
Twinkle.delimages.callback = function twinkledeliCallback() {
	var Window = new Morebits.simpleWindow( 800, 400 );
	Window.setTitle( "حذف پرونده‌های استفاده شده" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.delimages.callback.evaluate );
	form.append( {
		type: 'checkbox',
		list: [
			{
				label: 'حذف پرونده‌ها',
				name: 'delete_image',
				value: 'delete',
				checked: true
			},
			{
				label: 'پیوندهای داده‌شده به این پرونده را حذف کن',
				name: 'unlink_image',
				value: 'unlink',
				checked: true
			}
		]
	} );
	form.append( {
		type: 'textarea',
		name: 'reason',
		label: 'دلیل: '
	} );
	var query;
	if( mw.config.get( 'wgNamespaceNumber' ) === Namespace.CATEGORY ) {
		query = {
			'action': 'query',
			'generator': 'categorymembers',
			'gcmtitle': mw.config.get( 'wgPageName' ),
			'gcmnamespace': Namespace.IMAGE,
			'gcmlimit' : Twinkle.getPref('deliMax'), 
			'prop': [ 'imageinfo', 'categories', 'revisions' ],
			'grvlimit': 1,
			'grvprop': [ 'user' ]
		};
	} else {
		query = {
			'action': 'query',
			'generator': 'images',
			'titles': mw.config.get( 'wgPageName' ),
			'prop': [ 'imageinfo', 'categories', 'revisions' ],
			'gimlimit': 'max'
		};
	}
	var wikipedia_api = new Morebits.wiki.api( 'دریافت پرونده‌ها', query, function( self ) {
		var xmlDoc = self.responseXML;
		var images = $(xmlDoc).find('page[imagerepository="local"]');
		var list = [];

		$.each(images, function() {
			var $self = $(this);
			var image = $self.attr('title');
			var user = $self.find('imageinfo ii').attr('user');
			var last_edit = $self.find('revisions rev').attr('user');
			var disputed = $self.find('categories cl[title="Category:Contested candidates for speedy deletion"]').length > 0;
			list.push( {
				'label': image + ' - نویسنده: ' + user + ', آخرین ویرایش از: ' + last_edit + (disputed ? ' DISPUTED': ''),
				'value': image,
				'checked': !disputed
			});
		});

		self.params.form.append( {
			type: 'checkbox',
			name: 'images',
			list: list
		}
	);
	self.params.form.append( { type:'submit' } );

	var result = self.params.form.render();
	self.params.Window.setContent( result );


}  );

wikipedia_api.params = { form:form, Window:Window };
wikipedia_api.post();
var root = document.createElement( 'div' );
Morebits.status.init( root );
Window.setContent( root );
Window.display();
};

Twinkle.delimages.currentDeleteCounter = 0;
Twinkle.delimages.currentUnlinkCounter = 0;
Twinkle.delimages.currentdeletor = 0;
Twinkle.delimages.callback.evaluate = function twinkledeliCallbackEvaluate(event) {
	mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' '));  // for queen/king/whatever and country!
	var images = event.target.getChecked( 'images' );
	var reason = event.target.reason.value;
	var delete_image = event.target.delete_image.checked;
	var unlink_image = event.target.unlink_image.checked;
	if( ! reason ) {
		return;
	}

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

	function toCall( work ) {
		if( work.length === 0 && Twinkle.delimages.currentDeleteCounter <= 0 && Twinkle.delimages.currentUnlinkCounter <= 0 ) {
			window.clearInterval( Twinkle.delimages.currentdeletor );
			Morebits.wiki.removeCheckpoint();
			return;
		} else if( work.length !== 0 && Twinkle.delimages.currentDeleteCounter <= Twinkle.getPref('batchDeleteMinCutOff') && Twinkle.delimages.currentUnlinkCounter <= Twinkle.getPref('batchDeleteMinCutOff') ) {
			Twinkle.delimages.unlinkCache = []; // Clear the cache
			var images = work.shift();
			Twinkle.delimages.currentDeleteCounter = images.length;
			Twinkle.delimages.currentUnlinkCounter = images.length;
			var i;
			for( i = 0; i < images.length; ++i ) {
				var image = images[i];
				var query = {
					'action': 'query',
					'titles': image
				};
				var wikipedia_api = new Morebits.wiki.api( 'چک کردن آیا ' + image + ' وجود دارد', query, Twinkle.delimages.callbacks.main );
				wikipedia_api.params = { image:image, reason:reason, unlink_image:unlink_image, delete_image:delete_image };
				wikipedia_api.post();
			}
		}
	}
	var work = images.chunk( Twinkle.getPref('deliChunks') );
	Morebits.wiki.addCheckpoint();
	Twinkle.delimages.currentdeletor = window.setInterval( toCall, 1000, work );
};
Twinkle.delimages.callbacks = {
	main: function( self ) {
		var xmlDoc = self.responseXML;
		var $data = $(xmlDoc);

		var normal = $data.find('normalized n').attr('to');

		if( normal ) {
			self.params.image = normal;
		}

		var exists = $data.find('pages page[title="'+self.params.image.replace( /"/g, '\\"')+'"]:not([missing])').length > 0;

		if( ! exists ) {
			self.statelem.error( "صفحه قبلاً حذف شده‌است." );
			return;
		}
		if( self.params.unlink_image ) {
			var query = {
				'action': 'query',
				'list': 'imageusage',
				'iutitle': self.params.image,
				'iulimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
			};
			var wikipedia_api = new Morebits.wiki.api( 'دریافت پیوندها', query, Twinkle.delimages.callbacks.unlinkImageInstancesMain );
			wikipedia_api.params = self.params;
			wikipedia_api.post();
		}
		if( self.params.delete_image ) {

			var imagepage = new Morebits.wiki.page( self.params.image, 'حذف نگاره');
			imagepage.setEditSummary( "حذف به علت \"" + self.params.reason + "\"." + Twinkle.getPref('deletionSummaryAd'));
			imagepage.deletePage();
		}
	},
	unlinkImageInstancesMain: function( self ) {
		var xmlDoc = self.responseXML;
		var instances = [];
		$(xmlDoc).find('imageusage iu').each(function(){
			instances.push($(this).attr('title'));
		});
		if( instances.length === 0 ) {
			--twinklebatchdelete.currentUnlinkCounter;
			return;
		}

		$.each( instances, function(k,title) {
			page = new Morebits.wiki.page(title, "Unlinking instances on " + title);
			page.setFollowRedirect(true);
			page.setCallbackParameters({'image': self.params.image, 'reason': self.params.reason});
			page.load(Twinkle.delimages.callbacks.unlinkImageInstances);

		});
	},
	unlinkImageInstances: function( self ) {
		var params = self.getCallbackParameters();
		var statelem = self.getStatusElement();

		var image = params.image.replace( /^(?:Image|پرونده|تصویر|File):/, '' );
		var old_text = self.getPageText();
		var wikiPage = new Mediawiki.Page( old_text );
		wikiPage.commentOutImage( image , 'Commented out because image was deleted' );
		var text = wikiPage.getText();

		if( text === old_text ) {
			statelem.error( 'خطا در حذف پیوند نگاره ' + image +' از  ' + self.getPageName() );
			return;
		}
		self.setPageText(text);
		self.setEditSummary('حذف پرونده به کار رفته ' + image + " که به علت مقابل حذف شده‌است \"" + params.reason + "\")" + "; " + Twinkle.getPref('deletionSummaryAd'));
		self.setCreateOption('nocreate');
		self.save();
	}
};
/*</pre>
=== بخش ۱۲===
<pre>*/ 
/*
****************************************
*** twinkledeprod.js: Batch deletion of expired PRODs (sysops only)
****************************************
* Mode of invocation:     Tab ("Deprod")
* Active on:              Categories whose name starts with "Category:Proposed deletion as of"
* Config directives in:   TwinkleConfig
*/

;(function(){
	Twinkle.deprod = function() {
		if( mw.config.get( 'wgNamespaceNumber' ) !== Namespace.CATEGORY || ! Morebits.userIsInGroup( 'sysop' ) || !((/^رده:صفحه\u200cهای_حذف_زمان\u200cدار_در/).test(mw.config.get( 'wgPageName' ))) ) {
			return;
		}
		$(twAddPortletLink( "#", "پاکسازی ردهٔ منقضی حذف زمان‌دار", "مدیر محترم! لطفاً مقاله‌هایی که دارای برچسب حذف زمان‌دار منقضی شده هستند، را حذف نمائید", "")).click(callback);
	};

	var unlinkCache = {},
	concerns = {},
	currentDeleteCounter = 0,
	currentUnlinkCounter = 0,
	currentDeletor = null,

	callback = function() {
		var Window = new Morebits.simpleWindow( 800, 400 );
		Window.setTitle( "پاکسازی حذف زمان‌دار" );
		Window.setScriptName( "توینکل" );
		Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

		var form = new Morebits.quickForm( callback_commit );

		var query = {
			'action': 'query',
			'generator': 'categorymembers',
			'gcmtitle': mw.config.get( 'wgPageName' ),
			'gcmlimit' : 5000, // the max for sysops
			'prop': [ 'categories', 'revisions' ],
			'rvprop': [ 'content' ]
		};

		var wikipedia_api = new Morebits.wiki.api( 'دریافت صفحه‌ها', query, function( self ) {
			var $doc = $(self.responseXML);
			var $pages = $doc.find("page[ns!=\""+Namespace.IMAGE+"\"]");
			var list = [];
			var re = new RegExp("{{Proposed deletion");
				$pages.each(function() {
					var $self = $(this);
					var page = $self.attr('title');
					var content = $self.find('revisions rev').text();
					var concern = '';
					var res = re.exec(content);
					if( res ) {
						var parsed = Mediawiki.Template.parse( content, res.index );
						concern = parsed.parameters.concern || '';
					}
					list.push( {label:page + ' (' + concern + ')' , value:page, checked:concern !== '' });
					concerns[page] = concern;

				});
				self.params.form.append({
					'type': 'checkbox',
					'name': 'pages',
					'list': list
				});
				self.params.form.append({
					'type': 'submit'
				});
				self.params.Window.setContent(  self.params.form.render() );
			});

			wikipedia_api.params = { form:form, Window:Window };
			wikipedia_api.post();
			var root = document.createElement( 'div' );
			Morebits.simpleWindow.setButtonsEnabled( true );

			Morebits.status.init( root );
			Window.setContent( root );
			Window.display();
	},

	callback_commit = function(event) {
		var pages = event.target.getChecked( 'pages' );
		Morebits.status.init( event.target );
		function toCall( work ) {
			if( work.length === 0 ) {
				Morebits.status.info( 'work done' );
				window.clearInterval( currentDeletor );
				Morebits.wiki.removeCheckpoint();
				return;
			} else if( currentDeleteCounter <= 0 || currentUnlinkCounter <= 0 ) {
				unlinkCache = []; // Clear the cache
				var pages = work.pop(), i;
				for( i = 0; i < pages.length; ++i ) {
					var page = pages[i];
					var query = {
						'action': 'query',
						'prop': 'revisions',
						'rvprop': [ 'content' ],
						'rvlimit': 1,
						'titles': page
					};
					var wikipedia_api = new Morebits.wiki.api( 'چک کردن آیا ' + page + ' وجود دارد', query, callback_check );
					wikipedia_api.params = { page:page, reason: concerns[page] };
					wikipedia_api.post();
				}
			}
		}
		var work = pages.chunk( Twinkle.getPref('proddeleteChunks') );
		Morebits.wiki.addCheckpoint();
		currentDeletor = window.setInterval( toCall, 1000, work );
	},
	callback_check = function( self ) {
		var $doc  = $(self.responseXML);
		var normal = $doc.find('normalized n').attr('to');
		if( normal ) {
			self.params.page = normal;
		}
		var exists = $doc.find('pages page:not([missing])').length > 0;

		if( ! exists ) {
			self.statelem.error( "صفحه قبلاً حذف شده‌است." );
			return;
		}

		var query = {
			'action': 'query',
			'list': 'backlinks',
			'blfilterredir': 'redirects',
			'bltitle': self.params.page,
			'bllimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
		};
		var wikipedia_api = new Morebits.wiki.api( 'دریافت تغییرمسیرها', query, callback_deleteRedirects );
		wikipedia_api.params = self.params;
		wikipedia_api.post();

		var page = new Morebits.wiki.page('بحث:' + self.params.page, "حذف صفحهٔ بحث");
		page.setEditSummary("حذف به دلیل پایان یافتن [[وپ:حذف زمان‌دار|حذف زمان‌دار]]، دلیل ارائه شده:" + Twinkle.getPref('deletionSummaryAd'));
		page.deletePage();

		page = new Morebits.wiki.page(self.params.page, "حذف مقاله");
		page.setEditSummary("حذف به علت پایان یافتن  [[وپ:حذف زمان‌دار|حذف زمان‌دار]]; دلیل ارائه شده: " + self.params.reason + "." + Twinkle.getPref('deletionSummaryAd'));
		page.deletePage();


	},
	callback_deleteRedirects = function( self ) {
		$doc = $(self.responseXML);
		$doc.find("backlinks bl").each(function(){
			var title = $(this).attr('title');
			var page = new Morebits.wiki.page(title, "حذف تغییرمسیرها به این صفحه " + title);
			page.setEditSummary("حذف سریع به علت تغییرمسیر به صفحهٔ حذف‌شده \"" + self.params.page + "\"." + Twinkle.getPref('deletionSummaryAd'));
			page.deletePage();
		});
	};
}());
/*</pre>
=== بخش ۱۳===
<pre>*/ 
/*
 ****************************************
 *** twinklediff.js: Diff module
 ****************************************
 * Mode of invocation:     Tab on non-diff pages ("آخرین"); tabs on diff pages ("از", "از ویرایش من", "موجود")
 * Active on:              Existing non-special pages
 * Config directives in:   TwinkleConfig
 */

Twinkle.diff = function twinklediff() { 
	if( mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId') ) {
		return;
	}

	var query = {
		'title': mw.config.get('wgPageName'),
		'diff': 'cur',
		'oldid': 'prev'
	};

	twAddPortletLink( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query ), 'سون دَییشیکلیک', 'tw-lastdiff', 'سوْن دَییشیکلیکلره باخ' );

	// Show additional tabs only on diff pages
	if (Morebits.queryString.exists('diff')) {
		$(twAddPortletLink("#", 'از', 'tw-since', 'Show difference between last diff and the revision made by previous user' )).click(function(){Twinkle.diff.evaluate(false);});
		$(twAddPortletLink("#", 'از ویرایش من', 'tw-sincemine', 'نمایش تغییرات آخرین ویرایش من تا آخرین ویرایش صفحه' )).click(function(){Twinkle.diff.evaluate(true);});

		var oldid = /oldid=(.+)/.exec($('div#mw-diff-ntitle1 strong a').first().attr("href"))[1];
		query = {
			'title': mw.config.get('wgPageName'),
			'diff': 'cur',
			'oldid' : oldid
		};
		twAddPortletLink( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query ), 'همین ویرایش', 'tw-curdiff', 'نمایش تغییرات از این ویرایش تا آخرین ویرایش' );
	}
};

Twinkle.diff.evaluate = function twinklediffEvaluate(me) {
	var ntitle = getElementsByClassName( document.getElementById('bodyContent'), 'td' , 'diff-ntitle' )[0];

	var user;
	if( me ) {
		user = mw.config.get('wgUserName');
	} else {
		var node = document.getElementById( 'mw-diff-ntitle2' );
		if( ! node ) {
			// nothing to do?
			return;
		}
		user = $(node).find('a').first().text();
	}
	var query = {
		'prop': 'revisions',
		'action': 'query',
		'titles': mw.config.get('wgPageName'),
		'rvlimit': 1, 
		'rvprop': [ 'ids', 'user' ],
		'rvstartid': mw.config.get('wgCurRevisionId') - 1, // i.e. not the current one
		'rvuser': user
	};
	Morebits.status.init( document.getElementById('bodyContent') );
	var wikipedia_api = new Morebits.wiki.api( 'دریافت اطلاعات مشارکت‌های ', query, Twinkle.diff.callbacks.main );
	wikipedia_api.params = { user: user };
	wikipedia_api.post();
};

Twinkle.diff.callbacks = {
	main: function( self ) {
		var xmlDoc = self.responseXML;
		var revid = $(xmlDoc).find('rev').attr('revid');

		if( ! revid ) {
			self.statelem.error( 'ویرایش قبلی یافت نشد یا ' + self.params.user + ' تنها مشارکت‌کننده بود و دستور لغو شد.' );
			return;
		}
		var query = {
			'title': mw.config.get('wgPageName'),
			'oldid': revid,
			'diff': mw.config.get('wgCurRevisionId')
		};
		window.location = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query );
	}
};
/*</pre>
=== بخش ۱۴===
<pre>*/ 
/*
 ****************************************
 *** twinklefluff.js: Revert/rollback module
 ****************************************
 * Mode of invocation:     Links on history, contributions, and diff pages
 * Active on:              Diff pages, history pages, contributions pages
 * Config directives in:   TwinkleConfig
 */

/**
 Twinklefluff revert and antivandalism utility
 */

Twinkle.fluff = {
	auto: function() {
		if( parseInt( Morebits.queryString.get('oldid'), 10) !== mw.config.get('wgCurRevisionId') ) {
			// not latest revision
			alert("Can't rollback, page has changed in the meantime.");
			return;
		}

		var ntitle = getElementsByClassName( document.getElementById('bodyContent'), 'td' , 'diff-ntitle' )[0];
		vandal = ntitle.getElementsByTagName('a')[3].firstChild.nodeValue;

		Twinkle.fluff.revert( Morebits.queryString.get( 'twinklerevert' ), vandal, true );
	},
	normal: function() {

		var spanTag = function( color, content ) {
			var span = document.createElement( 'span' );
			span.style.color = color;
			span.appendChild( document.createTextNode( content ) );
			return span;
		};

		if( mw.config.get('wgNamespaceNumber') === -1 && mw.config.get('wgCanonicalSpecialPageName') === "Contributions" ) {
			//Get the username these contributions are for
			username = decodeURIComponent(/wiki\/Special:Log\/(.+)$/.exec($('div#contentSub a[title^="Special:Log"]').last().attr("href").replace(/_/g, "%20"))[1]);
			if( Twinkle.getPref('showRollbackLinks').indexOf('contribs') !== -1 || 
				( mw.config.get('wgUserName') !== username && Twinkle.getPref('showRollbackLinks').indexOf('others') !== -1 ) || 
				( mw.config.get('wgUserName') === username && Twinkle.getPref('showRollbackLinks').indexOf('mine') !== -1 ) ) {
				var list = $("div#bodyContent ul li:has(span.mw-uctop)");

				var revNode = document.createElement('strong');
				var revLink = document.createElement('a');
				revLink.appendChild( spanTag( 'Black', '[' ) );
				revLink.appendChild( spanTag( 'SteelBlue', 'rollback' ) );
				revLink.appendChild( spanTag( 'Black', ']' ) );
				revNode.appendChild(revLink);

				var revVandNode = document.createElement('strong');
				var revVandLink = document.createElement('a');
				revVandLink.appendChild( spanTag( 'Black', '[' ) );
				revVandLink.appendChild( spanTag( 'Red', 'vandalism' ) );
				revVandLink.appendChild( spanTag( 'Black', ']' ) );
				revVandNode.appendChild(revVandLink);

				list.each(function(key, current) {
					var href = $(current).children("a:eq(1)").attr("href");
					current.appendChild( document.createTextNode(' ') );
					var tmpNode = revNode.cloneNode( true );
					tmpNode.firstChild.setAttribute( 'href', href + '&' + Morebits.queryString.create( { 'twinklerevert': 'norm' } ) );
					current.appendChild( tmpNode );
					current.appendChild( document.createTextNode(' ') );
					tmpNode = revVandNode.cloneNode( true );
					tmpNode.firstChild.setAttribute( 'href', href + '&' + Morebits.queryString.create( { 'twinklerevert': 'vand' } ) );
					current.appendChild( tmpNode );
				});
			}
		} else {
                        
			if( mw.config.get('wgCanonicalSpecialPageName') === "Special:Undelete" ) {
				//You can't rollback deleted pages!
				return;
			}

			var body = document.getElementById('bodyContent');

			var firstRev = $("div.firstrevisionheader").length;
			if( firstRev ) {
				// we have first revision here, nothing to do.
				return;
			}

			var otitle, ntitle;
			try {
				var otitle1 = document.getElementById('mw-diff-otitle1'); 
				var ntitle1 = document.getElementById('mw-diff-ntitle1'); 
				if (!otitle1 || !ntitle1) {
					return;
				}
				otitle = otitle1.parentNode;
				ntitle = ntitle1.parentNode;
			} catch( e ) {
				// no old, nor new title, nothing to do really, return;
				return;
			}

			var old_rev_url = $("div#mw-diff-otitle1 strong a").attr("href");

			// Lets first add a [edit this revision] link
			var query = new Morebits.queryString( old_rev_url.split( '?', 2 )[1] );

			var oldrev = query.get('oldid');

			var revertToRevision = document.createElement('div');
			revertToRevision.setAttribute( 'id', 'tw-revert-to-orevision' );
			revertToRevision.style.fontWeight = 'bold';

			var revertToRevisionLink = revertToRevision.appendChild( document.createElement('a') );
			revertToRevisionLink.href = "#";
			$(revertToRevisionLink).click(function(){
				Twinkle.fluff.revertToRevision(oldrev);
			});
			revertToRevisionLink.appendChild( spanTag( 'Black', '[' ) );
			revertToRevisionLink.appendChild( spanTag( 'SaddleBrown', 'بازگردانی این نسخه' ) );
			revertToRevisionLink.appendChild( spanTag( 'Black', ']' ) );

			otitle.insertBefore( revertToRevision, otitle.firstChild );

			if( document.getElementById('differences-nextlink') ) {
				// Not latest revision
				curVersion = false;

				var new_rev_url = $("div#mw-diff-ntitle1 strong a").attr("href");
				query = new Morebits.queryString( new_rev_url.split( '?', 2 )[1] );
				var newrev = query.get('oldid');
				revertToRevision = document.createElement('div');
				revertToRevision.setAttribute( 'id', 'tw-revert-to-nrevision' );
				revertToRevision.style.fontWeight = 'bold';
				revertToRevisionLink = revertToRevision.appendChild( document.createElement('a') );
				revertToRevisionLink.href = "#";
				$(revertToRevisionLink).click(function(){
					Twinkle.fluff.revertToRevision(newrev);
				});
				revertToRevisionLink.appendChild( spanTag( 'Black', '[' ) );
				revertToRevisionLink.appendChild( spanTag( 'SaddleBrown', 'بازگردانی این نسخه' ) );
				revertToRevisionLink.appendChild( spanTag( 'Black', ']' ) );
				ntitle.insertBefore( revertToRevision, ntitle.firstChild );

				return;
			}
			if( Twinkle.getPref('showRollbackLinks').indexOf('diff') != -1 ) {
				var vandal = $("#mw-diff-ntitle2 a").first().text();

				var revertNode = document.createElement('div');
				revertNode.setAttribute( 'id', 'tw-revert' );

				var agfNode = document.createElement('strong');
				var vandNode = document.createElement('strong');
				var normNode = document.createElement('strong');

				var agfLink = document.createElement('a');
				var vandLink = document.createElement('a');
				var normLink = document.createElement('a');

				agfLink.href = "#"; 
				vandLink.href = "#"; 
				normLink.href = "#"; 
				$(agfLink).click(function(){
					Twinkle.fluff.revert('agf', vandal);
				});
				$(vandLink).click(function(){
					Twinkle.fluff.revert('vand', vandal);
				});
				$(normLink).click(function(){
					Twinkle.fluff.revert('norm', vandal);
				});

				agfLink.appendChild( spanTag( 'Black', '[' ) );
				agfLink.appendChild( spanTag( 'DarkOliveGreen', 'واگردانی (فحن)' ) );
				agfLink.appendChild( spanTag( 'Black', ']' ) );

				vandLink.appendChild( spanTag( 'Black', '[' ) );
				vandLink.appendChild( spanTag( 'Red', 'واگردانی (واندالیزم)' ) );
				vandLink.appendChild( spanTag( 'Black', ']' ) );

				normLink.appendChild( spanTag( 'Black', '[' ) );
				normLink.appendChild( spanTag( 'SteelBlue', 'واگردانی (خلاصه)' ) );
				normLink.appendChild( spanTag( 'Black', ']' ) );

				agfNode.appendChild(agfLink);
				vandNode.appendChild(vandLink);
				normNode.appendChild(normLink);

				revertNode.appendChild( agfNode );
				revertNode.appendChild( document.createTextNode(' || ') );
				revertNode.appendChild( normNode );
				revertNode.appendChild( document.createTextNode(' || ') );
				revertNode.appendChild( vandNode );

				ntitle.insertBefore( revertNode, ntitle.firstChild );
			}
		}
	}
};

Twinkle.fluff.revert = function revertPage( type, vandal, autoRevert, rev, page ) {

	var pagename = page || mw.config.get('wgPageName');
	var revid = rev || mw.config.get('wgCurRevisionId');

	Morebits.status.init( document.getElementById('bodyContent') );
	var params = {
		type: type,
		user: vandal,
		pagename: pagename,
		revid: revid,
		autoRevert: !!autoRevert
	};
	var query = {
		'action': 'query',
		'prop': ['info', 'revisions'],
		'titles': pagename,
		'rvlimit': 50, // max possible
		'rvprop': [ 'ids', 'timestamp', 'user', 'comment' ],
		'intoken': 'edit'
	};
	var wikipedia_api = new Morebits.wiki.api( 'جمع‌آوری اطلاعات برای نسخه‌های قبلی', query, Twinkle.fluff.callbacks.main );
	wikipedia_api.params = params;
	wikipedia_api.post();
};

Twinkle.fluff.revertToRevision = function revertToRevision( oldrev ) {

	Morebits.status.init( document.getElementById('bodyContent') );

	var query = {
		'action': 'query',
		'prop': ['info',  'revisions'],
		'titles': mw.config.get('wgPageName'),
		'rvlimit': 1,
		'rvstartid': oldrev,
		'rvprop': [ 'ids', 'timestamp', 'user', 'comment' ],
		'intoken': 'edit',
		'format': 'xml'
	};
	var wikipedia_api = new Morebits.wiki.api( 'جمع‌آوری اطلاعات برای نسخه‌های قبلی', query, Twinkle.fluff.callbacks.toRevision.main );
	wikipedia_api.params = { rev: oldrev };
	wikipedia_api.post();
};

Twinkle.fluff.userIpLink = function( user ) {
	return (Morebits.isIPAddress(user) ? "[[Special:Contributions/" : "[[User:" ) + user + "|" + user + "]]";
};

Twinkle.fluff.callbacks = {
	toRevision: {
		main: function( self ) {
			var xmlDoc = self.responseXML;

			var lastrevid = parseInt( $(xmlDoc).find('page').attr('lastrevid'), 10);
			var touched = $(xmlDoc).find('page').attr('touched');
			var starttimestamp = $(xmlDoc).find('page').attr('starttimestamp');
			var edittoken = $(xmlDoc).find('page').attr('edittoken');
			var revertToRevID = $(xmlDoc).find('rev').attr('revid');
			var revertToUser = $(xmlDoc).find('rev').attr('user');

			if (revertToRevID !== self.params.rev) {
				self.statitem.error( 'نسخهٔ ویرایش به‌دست‌آمده با مورد درخواستی متفاوت است و دستور لغو شد' );
				return;
			}

			var optional_summary = prompt( "لطفاً دلیل واگردانی را بیان کنید:", "" );
			if (optional_summary === null)
			{
				self.statelem.error( 'توسط کاربر لغو شد.' );
				return;
			}
			var summary = "به نسخهٔ " + revertToRevID + " ویرایش " + revertToUser + " واگردانده شد" + (optional_summary ? ": " + optional_summary : '') + "." +
				Twinkle.getPref('summaryAd');
		
			var query = { 
				'action': 'edit',
				'title': mw.config.get('wgPageName'),
				'summary': summary,
				'token': edittoken,
				'undo': lastrevid,
				'undoafter': revertToRevID,
				'basetimestamp': touched,
				'starttimestamp': starttimestamp,
				'watchlist': Twinkle.getPref('watchRevertedPages').indexOf( self.params.type ) !== -1 ? 'watch' : undefined,
				'minor': Twinkle.getPref('markRevertedPagesAsMinor').indexOf( self.params.type ) !== -1  ? true : undefined
			};

			Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
			Morebits.wiki.actionCompleted.notice = "واگردانی انجام شد";

			var wikipedia_api = new Morebits.wiki.api( 'ذخیره‌سازی مطالب واگردانی‌شده', query, null/*Twinkle.fluff.callbacks.toRevision.complete*/, self.statelem);
			wikipedia_api.params = self.params;
			wikipedia_api.post();

		},
		complete: function (self) {
		}
	},
	main: function( self ) {
		var xmlDoc = self.responseXML;

		var lastrevid = parseInt( $(xmlDoc).find('page').attr('lastrevid'), 10);
		var touched = $(xmlDoc).find('page').attr('touched');
		var starttimestamp = $(xmlDoc).find('page').attr('starttimestamp');
		var edittoken = $(xmlDoc).find('page').attr('edittoken');
		var lastuser = $(xmlDoc).find('rev').attr('user');

		var revs = $(xmlDoc).find('rev');

		if( revs.length < 1 ) {
			self.statelem.error( 'یک ویرایش یافت شد و امکان بازگردانی وجود ندارد' );
			return;
		}
		var top = revs[0];
		if( lastrevid < self.params.revid ) {
			Morebits.status.error( 'Error', [ 'اکثر اطلاعات بازگردانی از سرور دریافت می‌شود, ', Morebits.htmlNode( 'strong', lastrevid ), ', کمتر از یک آی‌دی برای ویرایش نمایش داده می‌شود این به معنی حذف ویرایش قبلی است, سرور تاخیر دارد, یا اطلاعات اشتباه دریافت شده است. در این لحظه کار متوقف گست.' ] );
			return;
		}
		var index = 1;
		if( self.params.revid !== lastrevid  ) {
			Morebits.status.warn( 'Warning', [ 'Latest revision ', Morebits.htmlNode( 'strong', lastrevid ), ' doesn\'t equal our revision ', htmlNode( 'strong', self.params.revid ) ] );
			if( lastuser === self.params.user ) {
				switch( self.params.type ) {
				case 'vand':
					Morebits.status.info( 'info', [ 'آخرین نسخه ویرایش شده توسط ', Morebits.htmlNode( 'strong', self.params.user ) , '. با توجه به خرابکاری بودن آن را واگردانی می‌کنیم' ]);
					break;
				case 'agf':
					Morebits.status.warn( 'Warning', [ 'آخرین ویرایش انجام شده توسط ', Morebits.htmlNode( 'strong', self.params.user ) , '. به عنوان وپ:فحن در نظر می‌گیریم و آن را واگردانی نمی‌کنیم تا بعدا درست گردد.' ]);
					return;
				default:
					Morebits.status.warn( 'Notice', [ 'آخرین ویرایش انجام شده توسط ', Morebits.htmlNode( 'strong', self.params.user ) , '، واگردانی متوقف می‌گردد' ] );
					return;
				}
			}
			else if(self.params.type === 'vand' && 
					Twinkle.fluff.whiteList.indexOf( top.getAttribute( 'user' ) ) !== -1 && revs.length > 1 &&
					revs[1].getAttribute( 'pageId' ) === self.params.revid) {
				Morebits.status.info( 'info', [ 'آخرین ویرایش انجام شده توسط ', Morebits.htmlNode( 'strong', lastuser ), '، ربات پرچم‌دار است و نسخهٔ قبلی آن خرابکاری کاربر دیگری است، درنتیجه آن را واگردانی می‌کنیم' ] );
				index = 2;
			} else {
				Morebits.status.error( 'Error', [ 'آخرین ویرایش توسط ', Morebits.htmlNode( 'strong', lastuser ), ' انجام شده‌است، ممکن است واگردانی شده باشد، واگردانی متوقف شد.'] );
				return;
			}

		}

		if( Twinkle.fluff.whiteList.indexOf( self.params.user ) !== -1  ) {
			switch( self.params.type ) {
			case 'vand':
				Morebits.status.info( 'Notice', [ 'واگردانی خرابکاری بر روی ', Morebits.htmlNode( 'strong', self.params.user ), '. با توجه به اینکه ربات پرچم‌دار است در نظر می‌گیریم که شما قصد واگردانی خرابکاری کاربر قبلی را داشته‌اید.' ] );
				index = 2;
				vandal = revs[1].getAttribute( 'user' );
				self.params.user = revs[1].getAttribute( 'user' );
				break;
			case 'agf':
				Morebits.status.warn( 'Notice', [ 'واگردانی با فرض حسن نیت بر روی ', Morebits.htmlNode( 'strong', self.params.user ), '. این ویرایش یک ربات پرچم‌دار است و درست نیست ویرایش آن را واگردانی کنید. در نتیجه درخواست واگردانی لغو شد.' ] );
				return;
			case 'norm':
				/* falls through */
			default:
				var cont = confirm( 'واگردانی با خلاصه درخواست شده‌است ولی بیشتر ویرایش‌ها توسط ربات پرچم‌دار انجام شده‌است. (' + self.params.user + ').آیا قصد دارید که واگردانی را به نسخه قبلی انجام دهید؟' );
				if( cont ) {
					Morebits.status.info( 'info', [ 'واگردانی با خلاصه بر روی  ', Morebits.htmlNode( 'strong', self.params.user ), ' انجام می‌گیرد برای تائید.چون ویرایش ربات پرچم‌دار است واگردانی را بر روی نسخهٔ قبلی انجام می‌دهیم.' ] );
					index = 2;
					self.params.user = revs[1].getAttribute( 'user' );
				} else {
					Morebits.status.warn( 'info', [ 'واگردانی با خلاصه انتخاب شده است', Morebits.htmlNode( 'strong', self.params.user ), ' انجام می‌گیرد برای تائید.چون ویرایش ربات پرچم‌دار است واگردانی را بر روی نسخه قبلی انجام می‌دهیم.' ] );
				}
				break;
			}
		}
		var found = false;
		var count = 0;

		for( var i = index; i < revs.length; ++i ) {
			++count;
			if( revs[i].getAttribute( 'user' ) != self.params.user ) {
				found = i;
				break;
			}
		}

		if( ! found ) {
			self.statelem.error( [ 'نسخهٔ قبلی یافت نشد. شاید ', Morebits.htmlNode( 'strong', self.params.user ), ' تنها مشارکت‌کننده است، یا کاربر ویرایش‌های بیشتری را در  ' + Twinkle.getPref('revertMaxRevisions') + ' پشت سرهم انجام داده‌است.' ] );
			return;
		}

		if( ! count ) {
			Morebits.status.error( 'Error', "این مقاله قبلاً واگردانی شده‌است در نتیجه واگردانی لغو می‌گردد." );
			return;
		}

		var good_revision = revs[ found ];
		var userHasAlreadyConfirmedAction = false;
		if (self.params.type !== 'vand' && count > 1) {
			if ( !confirm( 'کاربر:'+ self.params.user+' در این صفحه '+ count + 'نسخهٔ پشت سرهم ویرایش کرده‌است. آیا قصد واگردانی همه آنها را دارید؟') ) {
				Morebits.status.info( 'Notice', 'توقف واگردانی به درخواست کاربر' );
				return;
			}
			userHasAlreadyConfirmedAction = true;
		}

		self.params.count = count;

		self.params.goodid = good_revision.getAttribute( 'revid' );
		self.params.gooduser = good_revision.getAttribute( 'user' );

		self.statelem.status( [ 'نسخهٔ ', Morebits.htmlNode( 'strong', self.params.goodid ), ' ویرایش شده در ', Morebits.htmlNode( 'strong', count ), ' نسخهٔ قبل به وسیلهٔ ', Morebits.htmlNode( 'strong', self.params.gooduser ) ] );

		var summary, extra_summary, userstr, gooduserstr;
		switch( self.params.type ) {
		case 'agf':
			extra_summary = prompt( "پیام به صورت اختیاری برای ویرایشگر:", "" );
			if (extra_summary === null)
			{
				self.statelem.error( 'به وسیلهٔ کاربر لغو شد.' );
				return;
			}
			userHasAlreadyConfirmedAction = true;

			userstr = self.params.user;
			summary = "[[ویکی‌پدیا:فرض حسن نیت|با فرض حسن نیت]] ویرایش [[Special:Contributions/" + userstr + "|" + userstr + "]] ([[بحث کاربر:" + 
				userstr + "|بحث]]) واگردانی شد"+ Twinkle.fluff.formatSummaryPostfix(extra_summary) + Twinkle.getPref('summaryAd');
			break;

		case 'vand':

			userstr = self.params.user;
			gooduserstr = self.params.gooduser;
			summary = self.params.count + (self.params.count > 1 ? ' ویرایش' : ' ویرایش') + " [[وپ:خرابکاری|خرابکارانهٔ]] [[Special:Contributions/" +
				userstr + "|" + userstr + "]] ([[بحث کاربر:" + userstr + "|بحث]]) به آخرین ویرایش " +
				gooduserstr + " واگردانی شد." + Twinkle.getPref('summaryAd');
			break;

		case 'norm':
			/* falls through */
		default:
			if( Twinkle.getPref('offerReasonOnNormalRevert') ) {
				extra_summary = prompt( "پیام اختیاری برای ویرایش خلاصهٔ ویرایش:", "" );
				if (extra_summary === null)
				{
					self.statelem.error( 'به وسیلهٔ کاربر لغو شد.' );
					return;
				}
				userHasAlreadyConfirmedAction = true;
			}

			userstr = self.params.user;
			summary = self.params.count + (self.params.count > 1 ? ' ویرایش' : ' ویرایش') + "  [[Special:Contributions/" + 
				userstr + "|" + userstr + "]] ([[بحث کاربر:" + userstr + "|بحث]])" +
				" واگردانی شد" + Twinkle.fluff.formatSummaryPostfix(extra_summary) + Twinkle.getPref('summaryAd');
			break;
		}

		if (Twinkle.getPref('confirmOnFluff') && !userHasAlreadyConfirmedAction && !confirm("واگردانی: آیا مطمئن هستید؟")) {
			self.statelem.error( 'به وسیلهٔ کاربر لغو شد.' );
			return;
		}

		var query;
		if( (!self.params.autoRevert || Twinkle.getPref('openTalkPageOnAutoRevert')) && 
				Twinkle.getPref('openTalkPage').indexOf( self.params.type ) !== -1 &&
				mw.config.get('wgUserName') !== self.params.user ) {
			Morebits.status.info( 'info', [ 'بازکردن بحث کاربر و بازکردن پنجرهٔ ویرایش ', Morebits.htmlNode( 'strong', self.params.user ) ] );
			
			query = {
				'title': 'User talk:' + self.params.user,
				'action': 'edit',
				'preview': 'yes',
				'vanarticle': self.params.pagename.replace(/_/g, ' '),
				'vanarticlerevid': self.params.revid,
				'vanarticlegoodrevid': self.params.goodid,
				'type': self.params.type,
				'count': self.params.count
			};

			switch( Twinkle.getPref('userTalkPageMode') ) {
			case 'tab':
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query ), '_tab' );
				break;
			case 'blank':
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query ), '_blank', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
				break;
			case 'window':
				/* falls through */
			default:
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query ), 'twinklewarnwindow', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
				break;
			}
		}
		
		query = {
			'action': 'edit',
			'title': self.params.pagename,
			'summary': summary,
			'token': edittoken,
			'undo': lastrevid,
			'undoafter': self.params.goodid,
			'basetimestamp': touched,
			'starttimestamp': starttimestamp,
			'watchlist' :  Twinkle.getPref('watchRevertedPages').indexOf( self.params.type ) != -1 ? 'watch' : undefined,
			'minor': Twinkle.getPref('markRevertedPagesAsMinor').indexOf( self.params.type ) != -1  ? true : undefined
		};

		Morebits.wiki.actionCompleted.redirect = self.params.pagename;
		Morebits.wiki.actionCompleted.notice = "ویرایش انجام شد";

		var wikipedia_api = new Morebits.wiki.api( 'ذخیره‌سازی مطالب واگردانی‌شده', query, Twinkle.fluff.callbacks.complete, self.statelem);
		wikipedia_api.params = self.params;
		wikipedia_api.post();

	},
	complete: function (self) {
		self.statelem.info("done");
	}
};

Twinkle.fluff.formatSummaryPostfix = function(stringToAdd) {
	if (stringToAdd) {
		stringToAdd = ': ' + Morebits.string.toUpperCaseFirstChar(stringToAdd);
		if (stringToAdd.search(/[.?!;]$/) == -1) {
			stringToAdd = stringToAdd + '.';
		}
		return stringToAdd;
	}
	else {
		return '.';
	}
};

Twinkle.fluff.init = function twinklefluffinit() {
	if (twinkleUserAuthorized)
	{
		// a list of usernames, usually only bots, that vandalism revert is jumped over, that is
		// if vandalism revert was chosen on such username, then it's target is on the revision before.
		// This is for handeling quick bots that makes edits seconds after the original edit is made.
		// This only affect vandalism rollback, for good faith rollback, it will stop, indicating a bot 
		// has no faith, and for normal rollback, it will rollback that edit.
		Twinkle.fluff.whiteList = [
			'AnomieBOT',
			'ClueBot NG',
			'SineBot'
		];

		if ( Morebits.queryString.exists( 'twinklerevert' ) ) {
			Twinkle.fluff.auto();
		} else {
			Twinkle.fluff.normal();
		}
	}
};
/*</pre>
=== بخش ۱۵===
<pre>*/ 
/*
 ****************************************
 *** twinkleimage.js: Image CSD module
 ****************************************
 * Mode of invocation:     Tab ("DI")
 * Active on:              File pages with a corresponding file which is local (not on Commons)
 * Config directives in:   TwinkleConfig
 */

Twinkle.image = function twinkleimage() {
	if (mw.config.get('wgNamespaceNumber') === 6 &&
	    !document.getElementById("mw-sharedupload") &&
	    document.getElementById("mw-imagepage-section-filehistory"))
	{
		if(twinkleUserAuthorized) {
			$(twAddPortletLink("#", "حذف مدت‌دار", "tw-di", "پیشنهاد برای حذف مدت‌دار", "")).click(Twinkle.image.callback);
		} else {
			$(twAddPortletLink("#", "حذف مدت‌دار", "tw-di", "پیشنهاد برای حذف مدت‌دار", "")).click(function(){
				alert("سیزین ایشلدن حسابینیز توینکلی ایشلتمک اوچون تجروبه‌سیزدیر");
			});
		}
	}
};

Twinkle.image.callback = function twinkleimageCallback() {
	var Window = new Morebits.simpleWindow( 600, 300 );
	Window.setTitle( "File for dated speedy deletion" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "سیاست‌نامه حذف سریع", "وپ:حذف سریع" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.image.callback.evaluate );
	form.append( {
			type: 'checkbox',
			list: [
				{
					label: 'یوکله‌ینه بیلیندیر',
					value: 'notify',
					name: 'notify',
					tooltip: "Uncheck this if you are planning to make multiple nominations from the same user, and don't want to overload their talk page with too many notifications.",
					checked: Twinkle.getPref('notifyUserOnDeli')
				}
			]
		}
	);
	var field = form.append( {
			type: 'field',
			label: 'نوع عملی که می‌خواهید انجام دهید'
		} );
	field.append( {
			type: 'radio',
			name: 'type',
			event: Twinkle.image.callback.choice,
			list: [
				{
					label: 'بدون منبع (CSD F4)',
					value: 'no source',
					checked: true,
					tooltip: 'رسانه هیچ‌گونه اطلاعاتی دربارهٔ منبع ندارد.'
				},
				{
					label: 'بدون اجازه‌نامه (CSD F4)',
					value: 'no license',
					tooltip: 'رسانه اطلاعی دربارهٔ اجازه‌نامه استفاده‌اش ندارد'
				},
				{
					label: 'بدون منبع و اجازه‌نامه (CSD F4)',
					value: 'no source no license',
					tooltip: 'Image or media has neither information on source nor its copyright status'
				},
				{
					label: 'استفادهٔ منصفانه یتیم (CSD F5)',
					value: 'orphaned fair use',
					tooltip: 'Image or media is unlicensed for use on Wikipedia and allowed only under a claim of fair use per Wikipedia:Non-free content, but it is not used in any articles'
				},
				{
					label: 'دارای حق‌تکثیر و یتیم (CSD F6)',
					value: 'no fair use rationale',
					tooltip: 'Image or media is claimed to be used under Wikipedia\'s fair use policy but has no explanation as to why it is permitted under the policy'
				},
				{
					label: 'محل اختلاف در نحوهٔ استفادهٔ منصفانه (CSD F7)',
					value: 'disputed fair use rationale',
					tooltip: 'Image or media has a fair use rationale that is disputed'
				},
				{
					label: 'استفادهٔ منصفانه‌ای که امکان جایگزین آزاد وجود دارد (CSD F7)',
					value: 'replaceable fair use',
					tooltip: 'Image or media may fail Wikipedia\'s first non-free content criterion ([[ویکی‌پدیا:معیارهای محتوای غیر آزاد|معیارهای محتوای غیر آزاد]]) in that it illustrates a subject for which a free image might reasonably be found or created that adequately provides the same information'
				},
				{
					label: 'شواهدی دال بر وجود مجوز نیست (CSD F11)',
					value: 'no permission',
					tooltip: 'Image or media does not have proof that the author agreed to licence the file'
				}
			]
		} );
	form.append( {
			type: 'div',
			label: 'ایش یئری',
			name: 'work_area'
		} );
	form.append( { type:'submit' } );

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

	// We must init the parameters
	var evt = document.createEvent( "Event" );
	evt.initEvent( 'change', true, true );
	result.type[0].dispatchEvent( evt );
};

Twinkle.image.callback.choice = function twinkleimageCallbackChoose(event) {
	var value = event.target.values;
	var root = event.target.form;
	var work_area = new Morebits.quickForm.element( {
			type: 'div',
			name: 'work_area'
		} );

	switch( value ) {
		case 'no source no license':
		case 'no source':
			work_area.append( {
					type: 'checkbox',
					name: 'non_free',
					list: [
						{
							label: 'غیرآزاد',
							tooltip: 'Image is licensed under a fair use claim'
						}
					]
				} );
			break;
		case 'no permission':
			work_area.append( {
					type: 'input',
					name: 'source',
					label: 'قایناق: '
				} );
			break;
		case 'disputed fair use rationale':
			work_area.append( {
					type: 'textarea',
					name: 'reason',
					label: 'اهمیت: '
				} );
			break;
		case 'orphaned fair use':
			work_area.append( {
					type: 'input',
					name: 'replacement',
					label: 'جایگزین: '
				} );
			break;
		case 'replaceable fair use':
			work_area.append( {
					type: 'checkbox',
					name: 'old_image',
					list: [
						{
							label: 'قدیمی عکس',
							tooltip: 'Image was uploaded before 2006-07-13'
						}
					]
				} );
			break;
		default:
			break;
	}

	root.replaceChild( work_area.render(), $(root).find('div[name="work_area"]')[0] );
};

Twinkle.image.callback.evaluate = function twinkleimageCallbackEvaluate(event) {
	var type, non_free, source, reason, replacement, old_image;
	mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' '));  // for queen/king/whatever and country!

	var notify = event.target.notify.checked;
	var types = event.target.type;
	for( var i = 0; i < types.length; ++i ) {
		if( types[i].checked ) {
			type = types[i].values;
			break;
		}
	}
	if( event.target.non_free ) {
		non_free = event.target.non_free.checked;
	}
	if( event.target.source ) {
		source = event.target.source.value;
	}
	if( event.target.reason ) {
		reason = event.target.reason.value;
	}
	if( event.target.replacement ) {
		replacement = event.target.replacement.value;
	}
	if( event.target.old_image ) {
		old_image = event.target.old_image.checked;
	}

	var csdcrit;
	switch( type ) {
		case 'no source no license':
		case 'no source':
		case 'no license':
			csdcrit = "F4";
			break;
		case 'orphaned fair use':
			csdcrit = "F5";
			break;
		case 'no fair use rationale':
			csdcrit = "F6";
			break;
		case 'disputed fair use rationale':
		case 'replaceable fair use':
			csdcrit = "F7";
			break;
		case 'no permission':
			csdcrit = "F11";
			break;
		default:
			throw new Error( "Twinkle.image.callback.evaluate: unknown criterion" );
	}

	var lognomination = Twinkle.getPref('logSpeedyNominations') && Twinkle.getPref('noLogOnSpeedyNomination').indexOf(csdcrit) === -1;

	var params = {
		'type': type,
		'normalized': csdcrit,
		'non_free': non_free,
		'source': source,
		'reason': reason,
		'replacement': replacement,
		'old_image': old_image,
		'lognomination': lognomination
	};
	Morebits.simpleWindow.setButtonsEnabled( false );
	Morebits.status.init( event.target );

	Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
	Morebits.wiki.actionCompleted.notice = "اتیکت وۇرولدو";

	// Tagging image
	var wikipedia_page = new Morebits.wiki.page( mw.config.get('wgPageName'), 'برچسب حذف به پرونده‌ها' );
	wikipedia_page.setCallbackParameters( params );
	wikipedia_page.load( Twinkle.image.callbacks.taggingImage );

	// Notifying uploader
	if( notify ) {
		wikipedia_page.lookupCreator(Twinkle.image.callbacks.userNotification);
	} else {
		// add to CSD log if desired
		if (lognomination) {
			params.fromDI = true;
			Twinkle.speedy.callbacks.user.addToLog(params, null);
		}
		// No auto-notification, display what was going to be added.
		var noteData = document.createElement( 'pre' );
		noteData.appendChild( document.createTextNode( "{{جا:di-" + type + "-notice|1=" + mw.config.get('wgTitle') + "}} ~~~~" ) );
		Morebits.status.info( 'Notification', [ 'Following/similar data should be posted to the original uploader:', document.createElement( 'br' ),  noteData ] );
	}
};

Twinkle.image.callbacks = {
	taggingImage: function(pageobj) {
		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		var tag = "{{جا:di-" + params.type + "|تاریخ={{جا:#time:j F Y}}";
		switch( params.type ) {
			case 'no source no license':
			case 'no source':
				tag += params.non_free ? "|non-free=yes" : "";
				break;
			case 'no permission':
				tag += params.source ? "|قایناق=" + params.source : "";
				break;
			case 'disputed fair use rationale':
				tag += params.reason ? "|اهمیت=" + params.reason : "";
				break;
			case 'orphaned fair use':
				tag += params.replacement ? "|جایگزین=" + params.replacement : "";
				break;
			case 'replaceable fair use':
				tag += params.old_image ? "|قدیمی عکس=yes" : "";
				break;
			default:
				break;  // doesn't matter
		}
		tag += "}}\n";

		pageobj.setPageText(tag + text);
                pageobj.setEditSummary("این پرونده کاندید حذف شده‌است، برپایه " + params.normalized + " (" + params.type + ")." + Twinkle.getPref('summaryAd'));
		switch (Twinkle.getPref('deliWatchPage')) {
			case 'yes':
				pageobj.setWatchlist(true);
				break;
			case 'no':
				pageobj.setWatchlistFromPreferences(false);
				break;
			default:
				pageobj.setWatchlistFromPreferences(true);
				break;
		}
		pageobj.setCreateOption('nocreate');
		pageobj.save();
	},
	userNotification: function(pageobj) {
		var params = pageobj.getCallbackParameters();
		var initialContrib = pageobj.getCreator();
		var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "صفحه‌نی یارادانا بیلیندیردی. (" + initialContrib + ")");
		var notifytext = "\n{{جا:di-" + params.type + "-notice|1=" + mw.config.get('wgTitle');
		if (params.type === 'no permission') {
			notifytext += params.source ? "|source=" + params.source : "";
		}
		notifytext += "}} ~~~~";
		usertalkpage.setAppendText(notifytext);
		usertalkpage.setEditSummary("اطلاع‌رسانی: برچسب حذف  [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
		usertalkpage.setCreateOption('recreate');
		switch (Twinkle.getPref('deliWatchUser')) {
			case 'yes':
				usertalkpage.setWatchlist(true);
				break;
			case 'no':
				usertalkpage.setWatchlistFromPreferences(false);
				break;
			default:
				usertalkpage.setWatchlistFromPreferences(true);
				break;
		}
		usertalkpage.setFollowRedirect(true);
		usertalkpage.append();

		// add this nomination to the user's userspace log, if the user has enabled it
		if (params.lognomination) {
			params.fromDI = true;
			Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
		}
	}
};
/*</pre>
=== بخش ۱۶===
<pre>*/ 
/*
 ****************************************
 *** twinkleimagetraverse.js: Image traverse module (sysops only)
 ****************************************
 * Mode of invocation:     Tab ("Traverse")
 * Active on:              Categories
 * Config directives in:   TwinkleConfig
 */

Twinkle.imagetraverse = function twinkleimagetraverse() {
	if( Morebits.userIsInGroup( 'sysop' ) && mw.config.get('wgNamespaceNumber') == Namespace.CATEGORY ) {
		$(twAddPortletLink("#", "Traverse", "tw-imagetraverse", "Traverse category", "")).click(Twinkle.imagetraverse.callback);
	}
};

Twinkle.imagetraverse.basequery = {
	'action': 'query',
	'generator': 'categorymembers',
	'gcmtitle': mw.config.get('wgPageName'),
	'gcmnamespace': Namespace.IMAGE,
	'gcmlimit' : 1, 
	'prop': [ 'imageinfo', 'categories', 'revisions' ],
	'rvlimit': 20,
	'iihistory': true,
	'rvprop': [ 'user', 'size', 'flags', 'ids', 'comment', 'timestamp' ],
	'iiprop': [ 'timestamp', 'user', 'url', 'size', 'comment' ]
};
Twinkle.imagetraverse.callback = function() {
	var Window = new Morebits.simpleWindow( 1200, 650 );
	Window.setTitle( "Image traverse" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.imagetraverse.callback.evaluate );
	form.append( {
			type: 'button',
			label: 'پرش',
			event: Twinkle.imagetraverse.callbacks.skip
		} );
	form.append( {
			type: 'button',
			label: 'سیلمه',
			event: Twinkle.imagetraverse.callbacks.deleteMain
		} );
	form.append( {
			type: 'input',
			label: 'نَدن',
			name: 'reason',
			value: 'Speedy deleted',
			size: 80
		} );
	form.append( {
			type: 'checkbox',
			list: [
				{
					label: 'Remove image instances to the image',
					name: 'unlink',
					value: 'unlink',
					checked: true
				}
			]
		} );
	var root = document.createElement( 'table' );

	root.style.background = 'transparent';
	root.style.height = '780px';
	var row = root.appendChild( document.createElement( 'tr' ) );
	var options = row.appendChild(  document.createElement( 'td' ) );
	options.setAttribute( 'colspan', 2 );
	var rendered = form.render();
	options.appendChild( rendered );

	rendered.root = root;

	
	options.style.borderBottom = '1px solid gray';
	options.style.height = '80px';
	row = root.appendChild( document.createElement( 'tr' ) );
	var oview = row.appendChild(  document.createElement( 'td' ) );
	var ohistbox = row.appendChild(  document.createElement( 'td' ) );
	ohistbox.style.width = '250px';
	ohistbox.style.verticalAlign = 'top';
	var histbox = ohistbox.appendChild(  document.createElement( 'div' ) );
	histbox.style.overflow = 'auto';
	histbox.style.height = '500px';
	oview.style.verticalAlign = 'top';
	var view = oview.appendChild(  document.createElement( 'div' ) );
	view.style.height = '500px';
	view.style.overflow = 'auto';
	row = root.appendChild( document.createElement( 'tr' ) );
	var ostatus = row.appendChild(  document.createElement( 'td' ) );
	ostatus.style.borderTop = '1px solid gray';
	ostatus.setAttribute( 'colspan', 2 );
	var status = ostatus.appendChild(  document.createElement( 'div' ) );
	ostatus.style.verticalAlign = 'top';
	status.style.height = '180px';
	status.style.overflow = 'auto';
	Morebits.wiki.actionCompleted.event = function() {}; // just avoid it
	var wikipedia_api = new Morebits.wiki.api( 'دریافت پرونده‌ها', Twinkle.imagetraverse.basequery, Twinkle.imagetraverse.callbacks.main );
	wikipedia_api.params = { root:root, view:view, histbox:histbox, status:status, Window:Window };
	root.params = wikipedia_api.params;
	wikipedia_api.post();

	Morebits.status.init( status );
	Window.setContent( root );
	Window.display();
};

Twinkle.imagetraverse.callback.evaluate = function() {
};

function make_wikilink( page, title, oldid, diff ) {
	var query = {
		'title': page,
		'diff': diff,
		'oldid': oldid
	};
	var url = mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query );
	var a = document.createElement( 'a' );
	a.setAttribute( 'href', url );
	a.setAttribute( 'title', page );
	a.appendChild( document.createTextNode( title ) );
	return a;
}

Twinkle.imagetraverse.callbacks = {
	main: function( self ) {
		var xmlDoc = self.responseXML;

		var image = xmlDoc.evaluate( '//pages/page/@title', xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;

		if( !image ) {
			alert( 'آرتیق عکس یوخدور' );
			return;
		}
		var next = xmlDoc.evaluate( '//query-continue/categorymembers/@gcmcontinue', xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;
		var pagehistory = xmlDoc.evaluate( '//pages/page/revisions/rev', xmlDoc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
		var filehistory = xmlDoc.evaluate( '//pages/page/imageinfo/ii', xmlDoc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
		var categories = xmlDoc.evaluate( '//pages/page/categories/cl', xmlDoc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );

		var pagehistorylist = document.createElement( 'ul' );
		var filehistorylist = document.createElement( 'ul' );
		var categorylist = document.createElement( 'ul' );

		var entry = document.createElement( 'li' );

		var i, cur, tmp, link;
		for( i = 0; i < pagehistory.snapshotLength; ++i ) {
			cur = pagehistory.snapshotItem(i);
			tmp = entry.cloneNode(false);
			tmp.appendChild( make_wikilink( image, cur.getAttribute( 'timestamp' ), cur.getAttribute( 'revid' ) ) );
			tmp.appendChild( document.createTextNode( ' ' ) );
			tmp.appendChild( make_wikilink( 'User:' + cur.getAttribute( 'user' ), cur.getAttribute( 'user' ) ) );
			tmp.appendChild( document.createTextNode( ' (' + ( new Morebits.bytes( cur.getAttribute( 'size' ) ) ).toString() + ') (' ) );
			tmp.appendChild( document.createElement( 'em' ) ).appendChild(document.createTextNode( cur.getAttribute( 'comment' ) ) );
			tmp.appendChild( document.createTextNode( ')' ) );
			pagehistorylist.appendChild( tmp );
		}
		
		for( i = 0; i < filehistory.snapshotLength; ++i ) {
			cur = filehistory.snapshotItem(i);
			tmp = entry.cloneNode(false);
			link = document.createElement( 'a' );
			link.setAttribute( 'href', cur.getAttribute( 'url' ) );
			link.appendChild( document.createTextNode( cur.getAttribute( 'timestamp' ) ) );
			tmp.appendChild( link );
			tmp.appendChild( document.createTextNode( ' ' ) );
			tmp.appendChild( make_wikilink( 'User:' + cur.getAttribute( 'user' ), cur.getAttribute( 'user' ) ) );
			tmp.appendChild( document.createTextNode( ' (' + ( new Morebits.bytes( cur.getAttribute( 'size' ) ) ).toString() + ') (' ) );
			tmp.appendChild( document.createElement( 'em' ) ).appendChild(document.createTextNode( cur.getAttribute( 'comment' ) ) );
			tmp.appendChild( document.createTextNode( ')' ) );
			filehistorylist.appendChild( tmp );
		}

		for( i = 0; i < categories.snapshotLength; ++i ) {
			cur = categories.snapshotItem(i);
			tmp = entry.cloneNode(false);
			tmp.appendChild( make_wikilink( cur.getAttribute( 'title' ), cur.getAttribute( 'title' ).replace( /Category:/, '' ).replace( /رده:/, '' ) ) );
			categorylist.appendChild( tmp );
		}
		self.params.next = next;
		self.params.image = image;
		var hist = self.params.histbox;
		while( hist.hasChildNodes() ) {
			hist.removeChild( hist.lastChild );
		}
		hist.appendChild( document.createElement( 'h2' ) ).appendChild( document.createTextNode( 'Image usage' ) );
		var placeholder = hist.appendChild( document.createElement( 'div' ));
		placeholder.appendChild( document.createTextNode( 'دریافت اطلاعات ...' ) );
		self.params.imageusageplaceholder = placeholder;
		hist.appendChild( document.createElement( 'h2' ) ).appendChild( document.createTextNode( 'Page history' ) );
		hist.appendChild( pagehistorylist );
		hist.appendChild( document.createElement( 'h2' ) ).appendChild( document.createTextNode( 'File history' ) );
		hist.appendChild( filehistorylist );
		hist.appendChild( document.createElement( 'h2' ) ).appendChild( document.createTextNode( 'Categories' ) );
		hist.appendChild( categorylist );

		var query = {
			'action': 'parse',
			'title': image,
			'text': '{{ویکی‌پدیا:توینکل/الگو|' + image.replace(/^File:/, '').replace(/^پرونده:/, '') + '}}',
			'prop': 'text'
		};
		var wikipedia_api = new Morebits.wiki.api( 'Rendering', query, Twinkle.imagetraverse.callbacks.render1 );
		wikipedia_api.params = self.params;
		wikipedia_api.post();
	},
	render1: function( self ) {
		var xmlDoc = self.responseXML;
		var html = xmlDoc.evaluate( '//parse/text', xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;
		self.params.view.innerHTML = html; // gah!

		// add instance usage
		var query = {
			'action': 'query',
			'list': 'imageusage',
			'iutitle': self.params.image,
			'iulimit': 20,
			'iufilterredir': 'nonredirects'
		};
		var wikipedia_api = new Morebits.wiki.api( 'Rendering', query, Twinkle.imagetraverse.callbacks.render2 );
		wikipedia_api.params = self.params;
		wikipedia_api.post();
	},
	render2: function( self ) {
		var xmlDoc = self.responseXML;
		var usage = xmlDoc.evaluate( '//imageusage/iu', xmlDoc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );

		var usagelist = document.createElement( 'ul' );

		var entry = document.createElement( 'li' );

		for( var i = 0; i < usage.snapshotLength; ++i ) {
			var cur = usage.snapshotItem(i);
			var tmp = entry.cloneNode(false);
			tmp.appendChild( make_wikilink( cur.getAttribute( 'title' ), cur.getAttribute( 'title' ) ) );
			usagelist.appendChild( tmp );
		}
		var hist = self.params.histbox;
		hist.replaceChild( usagelist, self.params.imageusageplaceholder );

	},
	next: function( params ) {
		Twinkle.imagetraverse.basequery.gcmcontinue = params.next;
		var wikipedia_api = new Morebits.wiki.api( 'دریافت پرونده‌ها', Twinkle.imagetraverse.basequery, Twinkle.imagetraverse.callbacks.main );
		wikipedia_api.params = params;
		wikipedia_api.post();
	},
	skip: function( event ) {
		var form = event.target.form;
		var params = form.root.params;
		Twinkle.imagetraverse.callbacks.next( params );
		Morebits.status.info( 'Skipped', params.image );
	},
	deleteMain: function( event ) {
		var form = event.target.form;
		var params = form.root.params;
		params.reason = form.reason.value;

		var query;
		if( form.unlink.checked ) {
			query = {
				'action': 'query',
				'list': 'imageusage',
				'titles': params.image,
				'iulimit': 5000,
				'iufilterredir': 'nonredirects'
			};
			var wikipedia_api = new Morebits.wiki.api( 'دریافت پیوند پرونده‌ها', query, Twinkle.imagetraverse.callbacks.unlinkImageInstancesMain );
			wikipedia_api.params = params;

			wikipedia_api.post();
		}
		var imagepage = new Morebits.wiki.page( params.image, 'عکس سیلمه');
		imagepage.setEditSummary( "حذف به علت \"" + params.reason + "\"." + Twinkle.getPref('deletionSummaryAd'));
		imagepage.setCallbackParameters({'image': params.image});
		imagepage.deletePage();
	},
	unlinkImageInstancesMain: function( self ) {
		var xmlDoc = self.responseXML;
		var instances = [];
		$(xmlDoc).find('imageusage iu').each(function(){
			instances.push($(this).attr('title'));
		});
		if( instances.length === 0 ) {
			return;
		}

		$.each( instances, function(k,title) {
			page = new Morebits.wiki.page(title, "Unlinking instances on " + title);
			page.setFollowRedirect(true);
			page.setCallbackParameters({'image': self.params.image, 'reason': self.params.reason});
			page.load(Twinkle.imagetraverse.callbacks.unlinkImageInstances);

		});
	},
	unlinkImageInstances: function( self ) {
		var params = self.getCallbackParameters();
		var statelem = self.getStatusElement();

		var image = params.image.replace( /^(?:[iI]mage|پرونده|[fF]ile):/, '' );
		var old_text = self.getPageText();
		var wikiPage = new Mediawiki.Page( old_text );
		wikiPage.commentOutImage( image , 'Commented out because image was deleted' );
		var text = wikiPage.getText();

		if( text === old_text ) {
			statelem.error( 'خطا در پیوند نگاره' + image +' از ' + self.getPageName() );
			return;
		}
		self.setPageText(text);
		self.setEditSummary('حذف پرونده‌ موجود ' + image + " که به علت مقابل حذف شده‌است \"" + params.reason + "\")" + "; " + Twinkle.getPref('deletionSummaryAd'));
		self.setCreateOption('nocreate');
		self.save();
	}
};
/*</pre>
=== بخش ۱۷===
<pre>*/ 
/*
 ****************************************
 *** twinkleprod.js: PROD module
 ****************************************
 * Mode of invocation:     Tab ("حذف زمان‌دار")
 * Active on:              Existing articles which are not redirects
 * Config directives in:   TwinkleConfig
 */

Twinkle.prod = function twinkleprod() {
	if( mw.config.get('wgNamespaceNumber') !== 0 || !mw.config.get('wgCurRevisionId') || Morebits.wiki.isPageRedirect() ) {
		return;
	}
	if (twinkleUserAuthorized) {
		$(twAddPortletLink("#", "حذف زمان‌دار", "tw-prod", "حذف زمان‌دار", "")).click(Twinkle.prod.callback);
	} else {
		$(twAddPortletLink("#", 'حذف زمان‌دار', 'tw-prod', 'حذف زمان‌دار', '')).click(function() {
			alert("حساب کاربری شما برای استفاده از توینکل کم تجربه است.");
		});
	}
};

Twinkle.prod.callback = function twinkleprodCallback() {
	Twinkle.prod.defaultReason = Twinkle.getPref('prodReasonDefault');

	var Window = new Morebits.simpleWindow( 800, 410 );
	Window.setTitle( "واگردانی و خنثی‌سازی" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.prod.callback.evaluate );
	
	var field = form.append( {
			type: 'field',
			label: 'نوع حذف زمان‌دار'
		} );
	field.append( {
			type: 'radio',
			name: 'prodtype',
			event: Twinkle.prod.callback.prodtypechanged,
			list: [
				{
					label: 'حذف زمان‌دار',
					value: 'prod',
					checked: true,
					tooltip: 'حذف زماندرا برای [[ویکی‌پدیا:درگاه|درگاه]]'
				},
				{
					label: 'پیشنهاد حذف برای [[وپ:زندگان|مقالهٔ افرادزندهٔ]] بدون منبع',
					value: 'prod',
					tooltip: 'حذف زمان‌دار برای مقاله‌هایی که [[ویکی‌پدیا:زندگی‌نامه زندگان|زندگی‌نامهٔ زندگان]] هستند و هیچ منبعی ندارند.'
				}
			]
		} );

	form.append( {
			type: 'field',
			label:'ایش یئری',
			name: 'work_area'
		} );

	form.append( { type:'submit', label:'حذف زمان‌دار' } );	

	var result = form.render();
	Window.setContent( result );
	Window.display();
	
	// fake a change event on the first prod type radio, to initialize the type-dependent controls
	var evt = document.createEvent( "Event" );
	evt.initEvent( 'change', true, true );
	result.prodtype[0].dispatchEvent( evt );
};

Twinkle.prod.callback.prodtypechanged = function(event) {
  //prepare frame for prod type dependant controls
	var field = new Morebits.quickForm.element( {
			type: 'field',
			label: 'معیارلار',
			name: 'work_area'
		} );
	// create prod type dependant controls
	switch( event.target.values )
	{
		case 'prod':
			field.append( {
					type: 'checkbox',
					list: [
						{
							label: 'درصورت امکان به سازنده صفحه اطلاع بده',
							value: 'notify',
							name: 'notify',
							tooltip: "A notification template will be placed on the creator's talk page if this is true.",
							checked: true
						}
					]
				}
			);
			field.append( {
					type: 'textarea',
					name: 'reason',
					label: 'دلیل پیشنهاد برای حذف زمان‌دار:',
					value: Twinkle.prod.defaultReason
				} );
			break;

		case 'prodblp':
		  // first, remember the prod value that the user entered in the textarea, in case he wants to switch back. We can abuse the config field for that.
		  if (event.target.form.reason) {
				Twinkle.prod.defaultReason = event.target.form.reason.value;
			}
		
			field.append( {
					type: 'checkbox',
					list: [
						{
							label: 'درصورت امکان اطلاع‌رسانی به سازنده صفحه',
							value: 'notify',
							name: 'notify',
							tooltip: 'سازنده مقاله باید از پیشنهاد حذف آگاه باشد',
							checked: true,
							disabled: true
						}
					]
				}
			);
			//temp warning, can be removed down the line once BLPPROD is more established. Amalthea, May 2010.
			var boldtext = document.createElement('b');
			boldtext.appendChild(document.createTextNode('توجه داشته باشید که این برچسب برای مقاله‌هایی که در مورد افراد زنده هست و هیچ منبعی ندارند، کاربرد دارد در صورت داشتن منبع، مقاله را در [[وپ:نبح]] پیشنهاد دهید.'));
			field.append({
				type: 'div',
				label: boldtext
			});
			if (mw.config.get('wgArticleId') < 26596183)
			{
				field.append({
					type: 'header',
					label: 'به نظر می‌رسد که این مقاله قبل از ژانویهٔ ۲۰۱۲ ساخته شده‌است. لطفاً از روش‌های دیگر حذف استفاده نمائید.'
				});
			}
			break;
			
		default:
			break;
	}

	event.target.form.replaceChild( field.render(), $(event.target.form).find('fieldset[name="work_area"]')[0] );
};

Twinkle.prod.callbacks = {
	main: function(pageobj) {
		var statelem = pageobj.getStatusElement();

		if( !pageobj.exists() ) {
			statelem.error( "صفحه قاباقجا سیلینیبدیر." );
			return;
		}
		
		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		var tag_re = /(\{\{(?:db-?|delete|[aitcmrs]fd|md1)[^{}]*?\|?[^{}]*?\}\})/i;
		if( tag_re.test( text ) ) {
			statelem.warn( 'درخواست حذف قبلاً داده شده‌است!' );
			return;
		}

		// Remove tags that become superfluous with this action
		text = text.replace(/\{\{\s*(New unreviewed article|حذف سریع|Userspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");

		var prod_re = /\{\{\s*(?:dated prod|dated prod blp|Prod blp\/dated|حذف زماندار|حذف زمان\u200cدار|حذف سریع|حذف زمان‌دار|Proposed deletion\/dated)\s*\|(?:\{\{[^\{\}]*\}\}|[^\}\{])*\}\}/i;
		var summaryText;
		if( !prod_re.test( text ) ) {
			// Notification to first contributor
			if( params.usertalk ) {
				var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
				thispage.setCallbackParameters(params);
				thispage.lookupCreator(Twinkle.prod.callbacks.userNotification);
			}
			// If not notifying, log this PROD
			else if( Twinkle.getPref('logProdPages') ) {
				Twinkle.prod.callbacks.addToLog(params, null);
			}

			summaryText = "درخواست برای [[وپ:حذف زمان‌دار|حذف زمان‌دار]].";
			text = "{{جا:prod" + (params.blp ? " blp" : ("|1=" + params.reason)) + "}}\n" + text;
		}
		else {  // already tagged for PROD, so try endorsing it
			var prod2_re = /\{\{(?:Proposed deletion endorsed|حذف زمان\u200cدار|حذف زمان دار|حذف زماندار|حذف زمان‌دار|prod-?2).*?\}\}/;
			if( prod2_re.test( text ) ) {
				statelem.warn( 'Page already tagged with {{حذف زمان‌دار}} and {{prod-2}} templates, aborting procedure' );
				return;
			}
			var confirmtext = "A {{حذف زمان‌دار}} tag was already found on this article. \nWould you like to add a {{prod-2}} (PROD endorsement) tag with your explanation?";
			if (params.blp) {
				confirmtext = "A non-BLP {{حذف زمان‌دار}} tag was found on this article.  \nWould you like to add a {{prod-2}} (PROD endorsement) tag with explanation \"unsourced BLP\"?";
			}
			if( !confirm( confirmtext ) ) {
				statelem.warn( 'Aborted per user request' );
				return;
			}

			summaryText = "Endorsing proposed deletion per [[WP:" + (params.blp ? "BLP" : "") + "PROD]].";
			text = text.replace( prod_re, text.match( prod_re ) + "\n{{prod-2|1=" + (params.blp ? "این مقاله دربارهٔ [[ویکی‌پدیا:زندگی‌نامه زندگان|زندگی‌نامهٔ زندگان]] است." : params.reason) + "}}\n" );

			if( Twinkle.getPref('logProdPages') ) {
				params.logEndorsing = true;
				Twinkle.prod.callbacks.addToLog(params);
			}
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
		pageobj.setWatchlist(Twinkle.getPref('watchProdPages'));
		pageobj.setCreateOption('nocreate');
		pageobj.save();
	},

	userNotification: function(pageobj) {
		var params = pageobj.getCallbackParameters();
		var initialContrib = pageobj.getCreator();
		var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "اطلاع‌رسانی به سازنده مقاله  (" + initialContrib + ")");
		var notifytext = "\n{{جا:prodwarning" + (params.blp ? "BLP" : "") + "|1=" + mw.config.get('wgPageName') + "|اهمیت=" + params.reason + "}} ~~~~";
		usertalkpage.setAppendText(notifytext);
		usertalkpage.setEditSummary("اطلاع‌رسانی: حذف زمان‌دار [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
		usertalkpage.setCreateOption('recreate');
		usertalkpage.setFollowRedirect(true);
		usertalkpage.append();
		if (Twinkle.getPref('logProdPages')) {
			params.logInitialContrib = initialContrib;
			Twinkle.prod.callbacks.addToLog(params);
		}
	},

	addToLog: function(params) {
		var wikipedia_page = new Morebits.wiki.page("User:" + mw.config.get('wgUserName') + "/" + Twinkle.getPref('prodLogPageName'), "افزودن متن به فهرست زیر صفحهٔ کاربری");
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.prod.callbacks.saveLog);
	},

	saveLog: function(pageobj) {
		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		// add blurb if log page doesn't exist
		if (!pageobj.exists()) {
			text =
				"در این فهرست مواردی را که شما برای حذف زمان‌دار به کمک توینکل درخواست داده‌اید، را مشاهده می‌کنید\n\n" +
				"اگر قصد ندارید که این فهرست برای شما ذخیره گردد از [[وپ:توینکل/ترجیحات|ترجیحات توینکل]] آن را غیر فعال نمائید. ";
		}

		// create monthly header
		var date = new Date();
		var headerRe = new RegExp("^==+\\s*" + date.getUTCMonthName() + "\\s+" + date.getUTCFullYear() + "\\s*==+", "m");
		if (!headerRe.exec(text)) {
			text += "\n\n=== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ===";
		}

		var summarytext;
		if (params.logEndorsing) {
			text += "\n# [[" + mw.config.get('wgPageName') + " : endorsed " + (params.blp ? "BLP " : "") + "PROD. ~~~~~";
			if (params.reason) {
				text += "\n#* '''دلیل''': " + params.reason + "\n";
			}
			summarytext = "تایید حذف زمان‌دار [[" + mw.config.get('wgPageName') + "]].";
		} else {
			text += "\n# [[" + mw.config.get('wgPageName') + "]] : " + (params.blp ? "BLP " : "") + "حذف زمان‌دار";
			if (params.logInitialContrib) {
				text += "، اطلاع‌رسانی به {{کاربر|" + params.logInitialContrib + "}}";
			}
			text += " ~~~~~\n";
			if (!params.blp) {
				text += "#* '''دلیل''': " + params.reason + "\n";
			}
			summarytext = "حذف زمان‌دار [[" + mw.config.get('wgPageName') + "]].";
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary(summarytext + Twinkle.getPref('summaryAd'));
		pageobj.setCreateOption("recreate");
		pageobj.save();
	}
};

Twinkle.prod.callback.evaluate = function twinkleprodCallbackEvaluate(e) {
	mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' '));  // for queen/king/whatever and country!
	var form = e.target;
	var prodtype;

	var prodtypes = form.prodtype;
	for( var i = 0; i < prodtypes.length; i++ )
	{
		if( !prodtypes[i].checked ) {
			continue;
		}
		prodtype = prodtypes[i].values;
		break;
	}

	var params = {
		usertalk: form.notify.checked,
		blp: prodtype=='prodblp',
		reason: prodtype=='prodblp' ? '' : form.reason.value  // using an empty string here as fallback will help with prod-2.
	};

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

	if (prodtype === 'prodblp' && mw.config.get('wgArticleId') < 26596183)
	{
		if (!confirm( "برای استفاده از حذف زمان‌دار فقط مواردی که بعد از اجماع ساخته می‌شوند شامل این قانون هستند. آیا مطمئنید که این مقاله بعد از تاریخ اجماع ساخته شده‌است؟" ))
		{
			Morebits.status.warn( 'Notice', 'Aborting per user input.' );
			return;
		}
	}

	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.setFollowRedirect(true);  // for NPP, and also because redirects are ineligible for PROD
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.load(Twinkle.prod.callbacks.main);
};
/*</pre>
=== بخش ۱۸===
<pre>*/ 
/*
 ****************************************
 *** twinkleprotect.js: Protect/RPP module
 ****************************************
 * Mode of invocation:     Tab ("PP"/"RPP")
 * Active on:              Non-special pages
 * Config directives in:   TwinkleConfig
 */

// Note: a lot of code in this module is re-used/called by batchprotect.

Twinkle.protect = function twinkleprotect() {
	if ( mw.config.get('wgNamespaceNumber') < 0 ) {
		return;
	}

	if ( Morebits.userIsInGroup( 'sysop' ) ) {
		$(twAddPortletLink("#", "قوْروما ایستگی", "tw-rpp", "صفحه‌لر قوْروماسی", "")).click(Twinkle.protect.callback);
	} else if (twinkleUserAuthorized) {
		$(twAddPortletLink("#", "قوْروما ایستگی", "tw-rpp", "صفحه‌لر قوْروما ایستگی", "")).click(Twinkle.protect.callback);
	} else {
		$(twAddPortletLink("#", 'قوْروما ایستگی', 'tw-rpp', ' صفحه‌لر قوْروما ایستگی', '')).click(function() {
			alert("سیزین ایشلدن حسابینیز توینکلی ایشلتمگه تجروبه‌سیزدیر.");
		});
	}
};

Twinkle.protect.callback = function twinkleprotectCallback() {
	var Window = new Morebits.simpleWindow( 620, 530 );
	Window.setTitle( Morebits.userIsInGroup( 'sysop' ) ? "قوْروما، قوْروما ایستگی، قوْروما اتیکتی" : "قوْروما ایستگی، قوْروما اتیکتی" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "قوروما سیاستی", "وپ:قیفیل" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.protect.callback.evaluate );
	var actionfield = form.append( {
			type: 'field',
			label: 'عمل نوعو'
		} );
	if( Morebits.userIsInGroup( 'sysop' ) ) {
		actionfield.append( {
				type: 'radio',
				name: 'actiontype',
				event: Twinkle.protect.callback.changeAction,
				list: [
					{
						label: 'صفحه‌نی قوْرو',
						value: 'protect',
						tooltip: 'صفحه قوْرونماسی',
						checked: true
					}
				]
			} );
	}
	actionfield.append( {
			type: 'radio',
			name: 'actiontype',
			event: Twinkle.protect.callback.changeAction,
			list: [
				{
					label: 'قوْروما ایستگی',
					value: 'request',
					tooltip: 'If you want to request protection via WP:RPP' + (Morebits.userIsInGroup('sysop') ? ' instead of doing the protection by yourself.' : '.'),
					checked: !Morebits.userIsInGroup('sysop')
				},
				{
					label: 'قوْروما شابلونو اوْلان صفحه‌لره اتیکت وۇر',
					value: 'tag',
					tooltip: 'بۇ آلتدن قوْروما شالونو اوْلان صفحه‌لره اتیکت آرتیرماق اۆچون ایشلتمک اوْلار.'
				}
			]
		} );

	form.append({ type: 'field', label: 'تنظیم', name: 'field_preset' });
	form.append({ type: 'field', label: '1', name: 'field1' });
	form.append({ type: 'field', label: '2', name: 'field2' });

	form.append( { type:'submit' } );

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

	// We must init the controls
	var evt = document.createEvent( "Event" );
	evt.initEvent( 'change', true, true );
	result.actiontype[0].dispatchEvent( evt );

	// reduce vertical height of dialog
	$('select[name="editlevel"], select[name="editexpiry"], select[name="moveexpiry"], select[name="movelevel"], select[name="createexpiry"], select[name="createlevel"]').
		parent().css({ display: 'inline-block', marginRight: '0.5em' });

	// get current protection level asynchronously
	Morebits.wiki.actionCompleted.postfix = false;  // avoid Action: completed notice
	if (Morebits.userIsInGroup('sysop')) {
		var query = {
			action: 'query',
			prop: 'info',
			inprop: 'protection',
			titles: mw.config.get('wgPageName')
		};
		Morebits.status.init($('div[name="currentprot"] span').last()[0]);
		var statelem = new Morebits.status("قوْروما سطحی وضعیتی");
		var wpapi = new Morebits.wiki.api("یئنی تاپما...", query, Twinkle.protect.callback.protectionLevel, statelem);
		wpapi.post();
	}
};

Twinkle.protect.protectionLevel = null;

Twinkle.protect.callback.protectionLevel = function twinkleprotectCallbackProtectionLevel(apiobj) {
	var xml = apiobj.getXML();
	var result = [];
	$(xml).find('pr').each(function(index, pr) {
		var $pr = $(pr);
		var boldnode = document.createElement('b');
		boldnode.textContent = Morebits.string.toUpperCaseFirstChar($pr.attr('type')) + ": " + $pr.attr('level');
		result.push(boldnode);
		if ($pr.attr('expiry') === 'infinity') {
			result.push(" (indefinite) ");
		} else {
			result.push(" (expires " + new Date($pr.attr('expiry')).toUTCString() + ") ");
		}
		if ($pr.attr('cascade') === '') {
			result.push("(cascading) ");
		}
	});
	if (!result.length) {
		var boldnode = document.createElement('b');
		boldnode.textContent = "قوْروماسیز";
		result.push(boldnode);
	}
	Twinkle.protect.protectionLevel = result;
	apiobj.statelem.info(result);
	window.setTimeout(function() { Morebits.wiki.actionCompleted.postfix = "ائدیلدی"; }, 500);  // restore actionCompleted message
};

Twinkle.protect.callback.changeAction = function twinkleprotectCallbackChangeAction(e) {
	var field_preset;
	var field1;
	var field2;

	switch (e.target.values) {
		case 'protect':
			field_preset = new Morebits.quickForm.element({ type: 'field', label: 'تنظیملر', name: 'field_preset' });
			field_preset.append({
					type: 'select',
					name: 'category',
					label: 'تنظیملری سئچ:',
					event: Twinkle.protect.callback.changePreset,
					list: (mw.config.get('wgArticleId') ? Twinkle.protect.protectionTypes : Twinkle.protect.protectionTypesCreate)
				});

			field2 = new Morebits.quickForm.element({ type: 'field', label: 'قوْروما تنظیملری', name: 'field2' });
			field2.append({ type: 'div', name: 'currentprot', label: ' ' });  // holds the current protection level, as filled out by the async callback
			// for existing pages
			if (mw.config.get('wgArticleId')) {
				field2.append({
						type: 'checkbox',
						name: 'editmodify',
						event: Twinkle.protect.formevents.editmodify,
						list: [
							{
								label: 'قوْروما سطحینی دَییشدیر',
								value: 'editmodify',
								tooltip: 'If this is turned off, the edit protection level, and expiry time, will be left as is.',
								checked: true
							}
						]
					});
				var editlevel = field2.append({
						type: 'select',
						name: 'editlevel',
						label: 'قوْروما دییشدیر:',
						event: Twinkle.protect.formevents.editlevel
					});
				editlevel.append({
						type: 'option',
						label: 'بوتون',
						value: 'all'
					});
				editlevel.append({
						type: 'option',
						label: 'تآیید اولونموش',
						value: 'autoconfirmed'
					});
				editlevel.append({
						type: 'option',
						label: 'ایداره‌چی',
						value: 'sysop',
						selected: true
					});
				field2.append({
						type: 'select',
						name: 'editexpiry',
						label: 'سونا چاتما:',
						event: function(e) {
							if (e.target.value === 'custom') {
								Twinkle.protect.doCustomExpiry(e.target);
							}
						},
						list: [
				                        { label: '۱ ساعات', value: '1 hour' },
				                        { label: '۲ ساعات', value: '2 hours' },
			   	                        { label: '۳ ساعات', value: '3 hours' },
				                        { label: '۶ ساعات', value: '6 hours' },
				                        { label: '۱۲ ساعات', value: '12 hours' },
				                        { label: '۱ گۆن', value: '1 day' },
				                        { label: '۲ گۆن', selected: true, value: '2 days' },
				                        { label: '۳ گۆن', value: '3 days' },
				                        { label: '۴ گۆن', value: '4 days' },
				                        { label: '۱ هفته', value: '1 week' },
				                        { label: '۲ هفته', value: '2 weeks' },
				                        { label: '۱ آی', value: '1 month' },
				                        { label: '۲ آی', value: '2 months' },
				                        { label: '۳ آی', value: '3 months' },
				                        { label: '۱ ایل', value: '1 year' },
				                        { label: 'سوْن‌سۇز', value:'indefinite' },
				                        { label: 'آیری...', value: 'custom' }
						]
					});
				field2.append({
						type: 'checkbox',
						name: 'movemodify',
						event: Twinkle.protect.formevents.movemodify,
						list: [
							{
								label: 'داشیما سطحینی دییشدیر',
								value: 'movemodify',
								tooltip: 'If this is turned off, the move protection level, and expiry time, will be left as is.',
								checked: true
							}
						]
					});
				var movelevel = field2.append({
						type: 'select',
						name: 'movelevel',
						label: 'داشیما قوْروماسی:',
						event: Twinkle.protect.formevents.movelevel
					});
				movelevel.append({
						type: 'option',
						label: 'بوتون',
						value: 'all'
					});
				movelevel.append({
						type: 'option',
						label: 'تأیید اولونموش',
						value: 'autoconfirmed'
					});
				movelevel.append({
						type: 'option',
						label: 'ایداره‌چی',
						value: 'sysop',
						selected: true
					});
				field2.append({
						type: 'select',
						name: 'moveexpiry',
						label: 'سونا چاتما:',
						event: function(e) {
							if (e.target.value === 'custom') {
								Twinkle.protect.doCustomExpiry(e.target);
							}
						},
						list: [
				                        { label: '۱ ساعات', value: '1 hour' },
				                        { label: '۲ ساعات', value: '2 hours' },
			   	                        { label: '۳ ساعات', value: '3 hours' },
				                        { label: '۶ ساعات', value: '6 hours' },
				                        { label: '۱۲ ساعات', value: '12 hours' },
				                        { label: '۱ گۆن', value: '1 day' },
				                        { label: '۲ گۆن', selected: true, value: '2 days' },
				                        { label: '۳ گۆن', value: '3 days' },
				                        { label: '۴ گۆن', value: '4 days' },
				                        { label: '۱ هفته', value: '1 week' },
				                        { label: '۲ هفته', value: '2 weeks' },
				                        { label: '۱ آی', value: '1 month' },
				                        { label: '۲ آی', value: '2 months' },
				                        { label: '۳ آی', value: '3 months' },
				                        { label: '۱ ایل', value: '1 year' },
				                        { label: 'سوْن‌سۇز', value:'indefinite' },
				                        { label: 'آیری...', value: 'custom' }
						]
					});
			} else {  // for non-existing pages
				var createlevel = field2.append({
						type: 'select',
						name: 'createlevel',
						label: 'یاراتما قوْروماسی:',
						event: Twinkle.protect.formevents.createlevel
					});
				createlevel.append({
						type: 'option',
						label: 'بۆتون (آد یازدیریلمیش ایشلدنلر)',
						value: 'all'
					});
				createlevel.append({
						type: 'option',
						label: 'تأیید اولونموش',
						value: 'autoconfirmed'
					});
				createlevel.append({
						type: 'option',
						label: 'ایداره‌چی',
						value: 'sysop',
						selected: true
					});
				field2.append({
						type: 'select',
						name: 'createexpiry',
						label: 'سوْنا چاتما:',
						event: function(e) {
							if (e.target.value === 'custom') {
								Twinkle.protect.doCustomExpiry(e.target);
							}
						},
						list: [
				                        { label: '۱ ساعات', value: '1 hour' },
				                        { label: '۲ ساعات', value: '2 hours' },
			   	                        { label: '۳ ساعات', value: '3 hours' },
				                        { label: '۶ ساعات', value: '6 hours' },
				                        { label: '۱۲ ساعات', value: '12 hours' },
				                        { label: '۱ گۆن', value: '1 day' },
				                        { label: '۲ گۆن', selected: true, value: '2 days' },
				                        { label: '۳ گۆن', value: '3 days' },
				                        { label: '۴ گۆن', value: '4 days' },
				                        { label: '۱ هفته', value: '1 week' },
				                        { label: '۲ هفته', value: '2 weeks' },
				                        { label: '۱ آی', value: '1 month' },
				                        { label: '۲ آی', value: '2 months' },
				                        { label: '۳ آی', value: '3 months' },
				                        { label: '۱ ایل', value: '1 year' },
				                        { label: 'سوْن‌سۇز', value:'indefinite' },
				                        { label: 'آیری...', value: 'custom' }
						]
					});
			}
			field2.append({
					type: 'textarea',
					name: 'protectReason',
					label: 'قوْروما دلیلی (لیستده):'
				});
			if (!mw.config.get('wgArticleId')) {  // tagging isn't relevant for non-existing pages
				break;
			}
			/* falls through */
		case 'tag':
			field1 = new Morebits.quickForm.element({ type: 'field', label: 'اتیکتلمه تنظیملری', name: 'field1' });
			field1.append( {
					type: 'select',
					name: 'tagtype',
					label: 'قوْروما شابلونو سئچ:',
					list: Twinkle.protect.protectionTags,
					event: Twinkle.protect.formevents.tagtype
				} );
			field1.append( {
					type: 'checkbox',
					list: [
						{
							name: 'small',
							label: 'آرتیر (small=yes)',
							tooltip: 'به کمک  |small=yes تنظیم الگو به صورت قفل دیده‌می‌شود',
							checked: true
						},
						{
							name: 'noinclude',
							label: 'قرار دادن الگو محافظت در میان <noinclude>',
							tooltip: 'Will wrap the protection template in &lt;noinclude&gt; tags, so that it won\'t transclude',
							checked: (mw.config.get('wgNamespaceNumber') === 10)
						}
					]
				} );
			break;

		case 'request':
			field_preset = new Morebits.quickForm.element({ type: 'field', label: 'قوْروما نوعو', name: 'field_preset' });
			field_preset.append({
					type: 'select',
					name: 'category',
					label: 'نَدنلر:',
					event: Twinkle.protect.callback.changePreset,
					list: (mw.config.get('wgArticleId') ? Twinkle.protect.protectionTypes : Twinkle.protect.protectionTypesCreate)
				});

			field1 = new Morebits.quickForm.element({ type: 'field', label: 'جزئیات', name: 'field1' });
			field1.append( {
					type: 'select',
					name: 'expiry',
					label: 'قوْروما مۆدتی: ',
					list: [
						{ label: 'موقت', value: 'temporary' },
						{ label: 'دایمی', value: 'indefinite' },
						{ label: '', سئچ: true, value: '' }
					]
				} );
			field1.append({
					type: 'textarea',
					name: 'reason',
					label: 'نَدن: '
				});
			break;
		default:
			alert("Something's afoot in twinkleprotect");
			break;
	}

	var oldfield;
	if (field_preset) {
		oldfield = $(e.target.form).find('fieldset[name="field_preset"]')[0];
		oldfield.parentNode.replaceChild(field_preset.render(), oldfield);
	} else {
		$(e.target.form).find('fieldset[name="field_preset"]').css('display', 'none');
	}
	if (field1) {
		oldfield = $(e.target.form).find('fieldset[name="field1"]')[0];
		oldfield.parentNode.replaceChild(field1.render(), oldfield);
	} else {
		$(e.target.form).find('fieldset[name="field1"]').css('display', 'none');
	}
	if (field2) {
		oldfield = $(e.target.form).find('fieldset[name="field2"]')[0];
		oldfield.parentNode.replaceChild(field2.render(), oldfield);
	} else {
		$(e.target.form).find('fieldset[name="field2"]').css('display', 'none');
	}

	if (e.target.values === 'protect') {
		// fake a change event on the preset dropdown
		var evt = document.createEvent( "Event" );
		evt.initEvent( 'change', true, true );
		e.target.form.category.dispatchEvent( evt );

		// re-add protection level text, if it's available
		if (Twinkle.protect.protectionLevel) {
			Morebits.status.init($('div[name="currentprot"] span').last()[0]);
			Morebits.status.info("قوْروما سطحی", Twinkle.protect.protectionLevel);
		}
	}
};

Twinkle.protect.formevents = {
	editmodify: function twinkleprotectFormEditmodifyEvent(e) {
		e.target.form.editlevel.disabled = !e.target.checked;
		e.target.form.editexpiry.disabled = !e.target.checked || (e.target.form.editlevel.value === 'all');
		e.target.form.editlevel.style.color = e.target.form.editexpiry.style.color = (e.target.checked ? "" : "transparent");
	},
	editlevel: function twinkleprotectFormEditlevelEvent(e) {
		e.target.form.editexpiry.disabled = (e.target.value === 'all');
	},
	movemodify: function twinkleprotectFormMovemodifyEvent(e) {
		e.target.form.movelevel.disabled = !e.target.checked;
		e.target.form.moveexpiry.disabled = !e.target.checked || (e.target.form.movelevel.value === 'all');
		e.target.form.movelevel.style.color = e.target.form.moveexpiry.style.color = (e.target.checked ? "" : "transparent");
	},
	movelevel: function twinkleprotectFormMovelevelEvent(e) {
		e.target.form.moveexpiry.disabled = (e.target.value === 'all');
	},
	createlevel: function twinkleprotectFormCreatelevelEvent(e) {
		e.target.form.createexpiry.disabled = (e.target.value === 'all');
	},
	tagtype: function twinkleprotectFormTagtypeEvent(e) {
		e.target.form.small.disabled = e.target.form.noinclude.disabled = (e.target.value === 'none') || (e.target.value === 'noop');
	}
};

Twinkle.protect.doCustomExpiry = function twinkleprotectDoCustomExpiry(target) {
	var custom = prompt('Enter a custom expiry time.  \nYou can use relative times, like "1 minute" or "19 days", or absolute timestamps, "yyyymmddhhmm" (e.g. "200602011406" is Feb 1, 2006, at 14:06 UTC).', '');
	if (custom) {
		var option = document.createElement('option');
		option.setAttribute('value', custom);
		option.textContent = custom;
		target.appendChild(option);
		target.value = custom;
	}
};

Twinkle.protect.protectionTypes = [
	{
		label: 'بۆتؤو قوْروما',
		list: [
			{ label: 'عومومی (بۆتؤو)', value: 'pp-protected'},
			{ label: 'مؤحتوا ایختلافی/دییشدیرمه ساواشی (بۆتؤو)', value: 'pp-dispute'},
			{ label: 'دایمی واندالیزم (بۆتؤو)', value: 'pp-vandalism'},
			{ label: 'چوخ ایشلنن شابلون (بۆتؤو)', value: 'pp-template'},
			{ label: 'باغلانمیش ایشلدن دانیشیغی (بۆتؤو)', value: 'pp-usertalk'}
		]
	},
	{
		label: 'یاریم قوْروما',
		list: [
			{ label: 'عومومی (یاریم)', value: 'pp-semi-protected'},
			{ label: 'دایمی واندالیزم (یاریم)', selected: true, value: 'pp-semi-vandalism'},
			{ label: 'دیریلر بیوقرافی پوزونتوسو (یاریم)', value: 'pp-semi-blp'},
			{ label: 'یدک(یاریم)', value: 'pp-semi-sock'},
			{ label: 'چوخ ایشلنن شابلون (یاریم)', value: 'pp-semi-template'},
			{ label: 'باغلانمیش ایشلدن دانیشیغی (یاریم)', value: 'pp-semi-usertalk'}
		]
	},
	{
		label: 'داشیما قوْروماسی',
		list: [
			{ label: 'عمومی (داشیما)', value: 'pp-move'},
			{ label: 'مؤحتو/داشیما ساواشی(داشیما)', value: 'pp-move-dispute'},
			{ label: 'داشیما واندالیزمی (داشیما)', value: 'pp-move-vandalism'},
			{ label: 'چوخ گؤروشلو (داشیما)', value: 'pp-move-indef'}
		]
	},
	{ label: 'قوْرونمامیش', value: 'قوْرونمامیش'}
];

Twinkle.protect.protectionTypesCreate = [
	{
		label: 'قوْروما',
		list: [
			{ label: 'عومومی ({{pp-create}})', value: 'pp-create'},
			{ label: 'توهینلی آد', value: 'pp-create-offensive'},
			{ label: 'تئز-تئز یاراتما', selected: true, value: 'pp-create-salt'},
			{ label: 'یئنی سیلینمیش دیریلر', value: 'pp-create-blp'}
		]
	},
	{ label: 'قوْرونمامیش', value: 'قوْرونمامیش'}
];

// NOTICE: keep this synched with [[MediaWiki:Protect-dropdown]]
Twinkle.protect.protectionPresetsInfo = {
	'pp-protected': {
		edit: 'sysop',
		move: 'sysop',
		reason: null
	},
	'pp-dispute': {
		edit: 'sysop',
		move: 'sysop',
		reason: '[[ویکی‌پدیا:قوْروما سیاستی|قوْروما سیاستی]]'
	},
	'pp-vandalism': {
		edit: 'sysop',
		move: 'sysop',
		reason: '[[وپ:واندالیزم|واندالیزم]] مداوم'
	},
	'pp-template': {
		edit: 'sysop',
		move: 'sysop',
		reason: '[[ویکی‌پدیا:الگوهای حساس|اهمیتلی شابلونلار]]'
	},
	'pp-usertalk': {
		edit: 'sysop',
		move: 'sysop',
		reason: '[[ویکی‌پدیا:قوْروما سیاستی|قوْروما سیاستی]]'
	},
	'pp-semi-vandalism': {
		edit: 'autoconfirmed',
		reason: '[[وپ:واندالیزم|واندالیزم]] مداوم',
		template: 'pp-vandalism'
	},
	'pp-semi-blp': {
		edit: 'autoconfirmed',
		reason: 'Violations of the [[ویکی‌پدیا:زندگی‌نامه زندگان|زندگی‌نامه زندگان]]'
	},
	'pp-semi-usertalk': {
		edit: 'autoconfirmed',
		move: 'sysop',
		reason: '[[ویکی‌پدیا:قوْروما سیاستی|قوْروما سیاستی]]'
	},
	'pp-semi-template': {
		edit: 'autoconfirmed',
		move: 'sysop',
		reason: '[[ویکی‌پدیا:الگوهای حساس|اهمیتلی شابلونلار]]',
		template: 'pp-template'
	},
	'pp-semi-sock': {
		edit: 'autoconfirmed',
		reason: 'Persistent [[ویکی‌پدیا:حساب زاپاس|یدک حساب]]'
	},
	'pp-semi-protected': {
		edit: 'autoconfirmed',
		reason: null,
		template: 'pp-protected'
	},
	'pp-move': {
		move: 'sysop',
		reason: null
	},
	'pp-move-dispute': {
		move: 'sysop',
		reason: '[[ویکی‌پدیا:قوْروما سیاستی]]'
	},
	'pp-move-vandalism': {
		move: 'sysop',
		reason: '[[ویکی‌پدیا:قوْروما سیاستی]]'
	},
	'pp-move-indef': {
		move: 'sysop',
		reason: '[[ویکی‌پدیا:قوْروما سیاستی]]'
	},
	'unprotect': {
		edit: 'all',
		move: 'all',
		create: 'all',
		reason: null,
		template: 'none'
	},
	'pp-create-offensive': {
		create: 'sysop',
		reason: '[[ویکی‌پدیا:قوْروما سیاستی]]'
	},
	'pp-create-salt': {
		create: 'sysop',
		reason: '[[ویکی‌پدیا:قوْروما سیاستی]]'
	},
	'pp-create-blp': {
		create: 'sysop',
		reason: '[[ویکی‌پدیا:زندگی‌نامه زندگان]]'
	},
	'pp-create': {
		create: 'sysop',
		reason: '{{pp-create}}'
	}
};

Twinkle.protect.protectionTags = [
	{
		label: 'هئچ (موجود قوْروما شابلونلارینی سیل)',
		value: 'none'
	},
	{
		label: 'هئچ (موجود قوْروما شابلونلارینی سیلمه)',
		value: 'noop'
	},
	{
		label: 'بۆتؤو قوْروما شابلونلاری',
		list: [
			{ label: '{{pp-dispute}}: باخیش ایختلافی/دییشدیرمه ساواشی', value: 'pp-dispute', selected: true},
			{ label: '{{pp-usertalk}}: باغلانمیش ایشلدن دانیشیغی', value: 'pp-usertalk'}
		]
	},
	{
		label: ' بۆتؤو قوْروما/یاریم شابلونلاری',
		list: [
			{ label: '{{pp-vandalism}}: خرابکاری', value: 'pp-vandalism'},
			{ label: '{{pp-template}}: الگوی حساس', value: 'pp-template'},
			{ label: '{{pp-protected}}: محافظت عمومی', value: 'pp-protected'}
		]
	},
	{
		label: 'ییاریم‌قوْروما شابلونلار',
		list: [
			{ label: '{{pp-semi-usertalk}}: باغلانمیش ایشلدن دانیشیغی', value: 'pp-semi-usertalk'},
			{ label: '{{pp-semi-sock}}: یدک حسابی سوایستفاده‌سی', value: 'pp-semi-sock'},
			{ label: '{{pp-semi-blp}}: دیریلر بیپقرافی‌سی پوزونتوسو', value: 'pp-semi-blp'},
			{ label: '{{pp-semi-indef}}: اۇزون چاغ', value: 'pp-semi-indef'}
		]
	},
	{
		label: 'داشیما قوْروماسی شابلونلاری',
		list: [
			{ label: '{{pp-move-dispute}}: اختلاف نظر/جنگ انتقالی', value: 'pp-move-dispute'},
			{ label: '{{pp-move-vandalism}}:خرابکاری در انتقال صفحه', value: 'pp-move-vandalism'},
			{ label: '{{pp-move-indef}}: اۇزون چاغ', value: 'pp-move-indef'},
			{ label: '{{pp-move}}: آیری', value: 'pp-move'}
		]
	}
];

Twinkle.protect.callback.changePreset = function twinkleprotectCallbackChangePreset(e) {
	var form = e.target.form;

	var actiontypes = form.actiontype;
	var actiontype;
	for( var i = 0; i < actiontypes.length; i++ )
	{
		if( !actiontypes[i].checked ) {
			continue;
		}
		actiontype = actiontypes[i].values;
		break;
	}

	if (actiontype === 'protect') {  // actually protecting the page
		var item = Twinkle.protect.protectionPresetsInfo[form.category.value];
		if (mw.config.get('wgArticleId')) {
			if (item.edit) {
				form.editmodify.checked = true;
				Twinkle.protect.formevents.editmodify({ target: form.editmodify });
				form.editlevel.value = item.edit;
				Twinkle.protect.formevents.editlevel({ target: form.editlevel });
			} else {
				form.editmodify.checked = false;
				Twinkle.protect.formevents.editmodify({ target: form.editmodify });
			}

			if (item.move) {
				form.movemodify.checked = true;
				Twinkle.protect.formevents.movemodify({ target: form.movemodify });
				form.movelevel.value = item.move;
				Twinkle.protect.formevents.movelevel({ target: form.movelevel });
			} else {
				form.movemodify.checked = false;
				Twinkle.protect.formevents.movemodify({ target: form.movemodify });
			}
		} else {
			if (item.create) {
				form.createlevel.value = item.create;
				Twinkle.protect.formevents.createlevel({ target: form.createlevel });
			}
		}

		var reasonField = (actiontype === "protect" ? form.protectReason : form.reason);
		if (item.reason) {
			reasonField.value = item.reason;
		} else {
			reasonField.value = '';
		}

		// sort out tagging options
		if (mw.config.get('wgArticleId')) {
			if( form.category.value === 'unprotect' ) {
				form.tagtype.value = 'none';
			} else {
				form.tagtype.value = (item.template ? item.template : form.category.value);
			}
			Twinkle.protect.formevents.tagtype({ target: form.tagtype });

			if( /template/.test( form.category.value ) ) {
				form.noinclude.checked = true;
				form.editexpiry.value = form.moveexpiry.value = "indefinite";
			} else {
				form.noinclude.checked = false;
			}
		}

	} else {  // RPP request
		if( form.category.value === 'unprotect' ) {
			form.expiry.value = '';
			form.expiry.disabled = true;
		} else {
			form.expiry.disabled = false;
		}
	}
};

Twinkle.protect.callback.evaluate = function twinkleprotectCallbackEvaluate(e) {
	var form = e.target;

	var actiontypes = form.actiontype;
	var actiontype;
	for( var i = 0; i < actiontypes.length; i++ )
	{
		if( !actiontypes[i].checked ) {
			continue;
		}
		actiontype = actiontypes[i].values;
		break;
	}

	if( actiontype === 'tag' || actiontype === 'protect' ) {
		tagparams = {
			tag: form.tagtype.value,
			reason: ((form.tagtype.value === 'pp-protected' || form.tagtype.value === 'pp-semi-protected' || form.tagtype.value === 'pp-move') && form.protectReason) ? form.protectReason.value : null,
			expiry: (actiontype === 'protect') ? (form.editmodify.checked ? form.editexpiry.value : (form.movemodify.checked ?
				form.moveexpiry.value : null)) : null,
			small: form.small.checked,
			noinclude: form.noinclude.checked
		};
	}

	switch (actiontype) {
		case 'protect':
			// protect the page
			var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'), " صفحه قوْروماسی");
			if (mw.config.get('wgArticleId')) {
				if (form.editmodify.checked) {
					thispage.setEditProtection(form.editlevel.value, form.editexpiry.value);
				}
				if (form.movemodify.checked) {
					thispage.setMoveProtection(form.movelevel.value, form.moveexpiry.value);
				}
			} else {
				thispage.setCreateProtection(form.createlevel.value, form.createexpiry.value);
			}
			if (form.protectReason.value) {
				thispage.setEditSummary(form.protectReason.value);
			} else {
				alert("You must enter a protect reason, which will be inscribed into the protection log.");
				return;
			}

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

			Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
			Morebits.wiki.actionCompleted.notice = "قوْروندو";

			thispage.protect();
			/* falls through */
		case 'tag':

			if (actiontype === 'tag') {
				Morebits.simpleWindow.setButtonsEnabled( false );
				Morebits.status.init( form );
				Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
				Morebits.wiki.actionCompleted.followRedirect = false;
				Morebits.wiki.actionCompleted.notice = "اتیکت وۇرولدو";
			}

			if (tagparams.tag === 'noop') {
				Morebits.status.info("Applying protection template", "nothing to do");
				break;
			}

			var protectedPage = new Morebits.wiki.page( mw.config.get('wgPageName'), 'صفحه‌نی اتیکتله');
			protectedPage.setCallbackParameters( tagparams );
			protectedPage.load( Twinkle.protect.callbacks.taggingPage );
			break;

		case 'request':
			// file request at RPP
			var typename, typereason;
			switch( form.category.value ) {
				case 'pp-dispute':
				case 'pp-vandalism':
				case 'pp-template':
				case 'pp-usertalk':
				case 'pp-protected':
					typename = 'بۆتؤو قوْروما';
					break;
				case 'pp-semi-vandalism':
				case 'pp-semi-usertalk':
				case 'pp-semi-template':
				case 'pp-semi-sock':
				case 'pp-semi-blp':
				case 'pp-semi-protected':
					typename = 'آی‌پی قوْروماسی';
					break;
				case 'pp-move':
				case 'pp-move-dispute':
				case 'pp-move-indef':
				case 'pp-move-vandalism':
					typename = 'داشیما قوْروماسی';
					break;
				case 'pp-create':
				case 'pp-create-offensive':
				case 'pp-create-blp':
				case 'pp-create-salt':
					typename = 'یاراتما قوْروماسی';
					break;
				case 'unprotect':
					/* falls through */
				default:
					typename = 'قوْرومادان چیخارتماق';
					break;
			}
			switch (form.category.value) {
				case 'pp-dispute':
					typereason = 'Content dispute/edit warring';
					break;
				case 'pp-vandalism':
				case 'pp-semi-vandalism':
					typereason = 'گئنیش واندالیزم';
					break;
				case 'pp-template':
				case 'pp-semi-template':
					typereason = 'اهمیتلی شابلون';
					break;
				case 'pp-usertalk':
				case 'pp-semi-usertalk':
					typereason = 'باغلانمیش ایشلدن الی ایله دانیشیق صفحه‌سی سوایستفاده‌سی';
					break;
				case 'pp-semi-sock':
					typereason = 'یدکچی';
					break;
				case 'pp-semi-blp':
					typereason = '[[ویکی‌پدیا:زندگی‌نامه زندگان|دیریلر]] مقاله‌سی واندالیزمی ';
					break;
				case 'pp-move-dispute':
					typereason = 'Page title dispute/move warring';
					break;
				case 'pp-move-vandalism':
					typereason = 'داشیما واندالیزمی';
					break;
				case 'pp-move-indef':
					typereason = 'چوخ گؤروشلو صفحه';
					break;
				case 'pp-create-offensive':
					typereason = 'موناسیب اوْلمایان آد';
					break;
				case 'pp-create-blp':
					typereason = 'قاباقجا سیلینمیش [[ویکی‌پدیا:زندگی‌نامه زندگان]]';
					break;
				case 'pp-create-salt':
					typereason = 'موداوم یاراتما';
					break;
				default:
					typereason = '';
					break;
			}

			var reason = typereason;
			if( form.reason.value !== '') {
				if ( typereason !== '' ) {
					reason += "\u00A0\u2013 ";  // U+00A0 NO-BREAK SPACE; U+2013 EN RULE
				}
				reason += form.reason.value;
			}
			if( reason !== '' && reason.charAt( reason.length - 1 ) !== '.' ) {
				reason += '.';
			}

			var rppparams = {
				reason: reason,
				typename: typename,
				category: form.category.value,
				expiry: form.expiry.value
			};

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

			rppName = 'ویکی‌پدیا:صفحه قوْروما ایستکلری';

			// Updating data for the action completed event
			Morebits.wiki.actionCompleted.redirect = rppName;
			Morebits.wiki.actionCompleted.notice = "ایستک یارادیلدی، ایستک صفحه‌سینه یوللاندیریلیر";

			var rppPage = new Morebits.wiki.page( rppName, 'قوْروما ایستکلری');
			rppPage.setFollowRedirect( true );
			rppPage.setCallbackParameters( rppparams );
			rppPage.load( Twinkle.protect.callbacks.fileRequest );
			break;
		default:
			alert("توینکل: بللی اوْلمایان ایستک");
			break;
	}
};

Twinkle.protect.callbacks = {
	taggingPage: function( protectedPage ) {
		var params = protectedPage.getCallbackParameters();
		var text = protectedPage.getPageText();
		var tag, summary;

		var oldtag_re = /\s*(?:<noinclude>)?\s*\{\{\s*(pp-[^{}]*?|protected|(?:t|v|s|p-|usertalk-v|usertalk-s|sb|move)protected(?:2)?|protected template|privacy protection)\s*?\}\}\s*(?:<\/noinclude>)?\s*/gi;

		text = text.replace( oldtag_re, '' );

		if ( params.tag !== 'none' ) {
			tag = params.tag;
			if( params.reason ) {
				tag += '|معیار=' + params.reason;
			}
			if( ['indefinite', 'infinite', 'never', null].indexOf(params.expiry) === -1 ) {
				tag += '|expiry={{جا:#time:F j, Y|' + (/^\s*\d+\s*$/.exec(params.expiry) ? params.expiry : '+' + params.expiry) + '}}';
			}
			if( params.small ) {
				tag += '|small=yes';
			}
		}

		if( params.tag === 'none' ) {
			summary = 'Removing protection template' + Twinkle.getPref('summaryAd');
		} else {
			if( params.noinclude ) {
				text = "<noinclude>{{" + tag + "}}</noinclude>" + text;
			} else {
				text = "{{" + tag + "}}\n" + text;
			}
			summary = "آرتیریلیر: {{" + params.tag + "}}" + Twinkle.getPref('summaryAd');
		}

		protectedPage.setEditSummary( summary );
		protectedPage.setPageText( text );
		protectedPage.setCreateOption( 'nocreate' );
		protectedPage.save();
	},

	fileRequest: function( rppPage ) {

		var params = rppPage.getCallbackParameters();
		var text = rppPage.getPageText();
		var statusElement = rppPage.getStatusElement();

		var ns2tag = {
			'0': 'مقاله',
			'1': 'lat',
			'2': 'lu',
			'3': 'lut',
			'4': 'lw',
			'5': 'lwt',
			'6': 'lf',
			'7': 'lft',
			'8': 'lm',
			'9': 'lmt',
			'10': 'lt',
			'11': 'ltt',
			'12': 'lh',
			'13': 'lht',
			'14': 'lc',
			'15': 'lct',
			'100': 'lp',
			'101': 'lpt',
			'108': 'lb',
			'109': 'lbt'
		};

		var rppRe = new RegExp( '===\\s*\\[\\[\\s*' + RegExp.escape( mw.config.get('wgTitle'), true ) + '\\s*\\]\\]\\s*===', 'm' );
		var tag = rppRe.exec( text );

		var rppLink = document.createElement('a');
		rppLink.setAttribute('href', mw.util.getUrl(rppPage.getPageName()) );
		rppLink.appendChild(document.createTextNode(rppPage.getPageName()));

		if ( tag ) {
			statusElement.error( [ 'قوْروما ایستگی برای این صفحه وجود  در', rppLink, 'وجود دارد. ایستگینیز سیلیندی.' ] );
			return;
		}

		var newtag = '=== [[' + mw.config.get('wgTitle') +  ']] ===' + "\n" + '{{' + ns2tag[ mw.config.get('wgNamespaceNumber') ] + '|' + mw.config.get('wgTitle') +  '}}'+ "\n";
		if( ( new RegExp( '^' + RegExp.escape( newtag ).replace( /\s+/g, '\\s*' ), 'm' ) ).test( text ) ) {
			statusElement.error( [ 'قوْروما ایستگی برای این صفحه وجود  در', rppLink, 'وجود دارد. درخواست شما لغو شد.' ] );
			return;
		}

		var words;
		switch( params.expiry ) {
		case 'temporary':
			words = "موقت ";
			break;
		case 'indefinite':
			words = "سوْن‌سۇز ";
			break;
		default:
			words = "";
			break;
		}

		words += params.typename;

		newtag += "'''" + Morebits.string.toUpperCaseFirstChar(words) + ( params.reason !== '' ? ":''' " + params.reason : ".'''" ) + " ~~~~";

		var reg;

		reg = /(\n==\s*قوْرومادان چیخارتماق ایستکلری\u200c\s*==\s*\n)/;
		if ( params.category === 'unprotect' ) {
		var originalTextLength = text.length;
		text = text.replace( reg, "$1" + newtag + "\n");
		} else {
		var originalTextLength = text.length;
		text = text.replace( reg, "\n"+ newtag + "\n"+"$1");
		}
		if (text.length === originalTextLength)
		{
			var linknode = document.createElement('a');
			linknode.setAttribute("href", mw.util.getUrl("وپ:توینکل/تعمیر") );
			linknode.appendChild(document.createTextNode('How to fix RPP'));
			statusElement.error( [ 'عنوان مورد نساز برای توینکل در وپ:تام/محافظت یافت نشد برای رفع مشکل به ', linknode, ' مراجعه نمایید.' ] );
			return;
		}
		statusElement.status( 'یئنی ایستک آرتیر...' );
		rppPage.setEditSummary( "ایستک  " + params.typename + ' [[' + mw.config.get('wgPageName').replace(/_/g, ' ') + ']].' + Twinkle.getPref('summaryAd') );
		rppPage.setPageText( text );
		rppPage.setCreateOption( 'recreate' );
		rppPage.save();
	}
};
/*</pre>
=== بخش ۱۹===
<pre>*/ 
/*
 ****************************************
 *** twinklespeedy.js: CSD module
 ****************************************
 * Mode of invocation:     Tab ("حذف سریع")
 * Active on:              Non-special, existing pages
 * Config directives in:   TwinkleConfig
 *
 */

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

	if ( Morebits.userIsInGroup( 'sysop' ) ) {
		$(twAddPortletLink("#", "حذف سریع", "tw-csd", "درخواست حذف سریع بر پایه وپ:محس", "")).click(Twinkle.speedy.callback);
	} else if (twinkleUserAuthorized) {
		$(twAddPortletLink("#", "حذف سریع", "tw-csd", "درخواست حذف سریع بر پایه وپ:محس", "")).click(Twinkle.speedy.callback);
	} else {
		$(twAddPortletLink("#", 'حذف سریع', 'tw-csd', 'درخواست حذف سریع بر پایه وپ:محس', '')).click(function() {
			alert("سیزین ایشلدن حسابینیز توینکلی ایشلتمگه تجروبه‌سیزدیر.");
		});
	}
};

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

Twinkle.speedy.dialog = null;
// Prepares the speedy deletion dialog and displays it

Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc, firstTime, content) {
	var dialog;
	if (!content)
	{
		Twinkle.speedy.dialog = new Morebits.simpleWindow( Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight') );
		dialog = Twinkle.speedy.dialog;
		dialog.setTitle( "بۇ صفحه نَدن سیلینمه‌لیدیر؟" );
		dialog.setScriptName( "توینکل" );
		dialog.addFooterLink( "سیاست حذف سریع", "وپ:حذف سریع" );
		dialog.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );
	}

	var form = new Morebits.quickForm( callbackfunc, 'change' );
	if( firstTime && Morebits.userIsInGroup( 'sysop' ) ) {
		form.append( {
				type: 'checkbox',
				list: [
					{
						label: 'فقط برچسب بزن، حذف نکن',
						value: 'tag_only',
						name: 'tag_only',
						tooltip: 'اگر قصد دارید به جای حذف صفخه را برچسب حذف بزنید',
						checked : Twinkle.getPref('deleteSysopDefaultToTag'),
						event: function( event ) {
							// enable/disable notify checkbox
							event.target.form.notify.disabled = !event.target.checked;
							event.target.form.notify.checked = event.target.checked;
							// enable/disable talk page checkbox
							if (event.target.form.talkpage) {
								event.target.form.talkpage.disabled = event.target.checked;
								event.target.form.talkpage.checked = !event.target.checked && Twinkle.getPref('deleteTalkPageOnDelete');
							}
							// enable/disable redirects checkbox
							event.target.form.redirects.disabled = event.target.checked;
							event.target.form.redirects.checked = !event.target.checked;
							// enable/disable multiple
							$(event.target.form).find('input[name="csd"][value="multiple"]')[0].disabled = !event.target.checked;
							event.stopPropagation();
						}
					}
				]
			} );
		form.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
			form.append( {
				type: 'checkbox',
				list: [
					{
						label: 'همچنین صفحه بحث',
						value: 'talkpage',
						name: 'talkpage',
						tooltip: "This option deletes the page's talk page in addition. If you choose the F8 (moved to Commons) criterion, this option is ignored and the talk page is *not* deleted.",
						checked: Twinkle.getPref('deleteTalkPageOnDelete'),
						disabled: Twinkle.getPref('deleteSysopDefaultToTag'),
						event: function( event ) {
							event.stopPropagation();
						}
					}
				]
			} );
		}
		form.append( {
				type: 'checkbox',
				list: [
					{
						label: 'همچنین همه تغییرمسیرها را نیز حذف کن',
						value: 'redirects',
						name: 'redirects',
						tooltip: "This option deletes all incoming redirects in addition. Avoid this option for procedural (e.g. move/merge) deletions.",
						checked: true,
						disabled: Twinkle.getPref('deleteSysopDefaultToTag'),
						event: function( event ) {
							event.stopPropagation();
						}
					}
				]
			} );
		form.append( { type: 'header', label: 'بخش مرتبط با برچسب' } );
	}

	// don't show this notification checkbox for db-multiple, as the value is ignored
	// XXX currently not possible to turn off notification when using db-multiple
	if (firstTime) {
		form.append( {
				type: 'checkbox',
				list: [
					{
						label: 'صفحه‌نی یارادانا خبر وئر',
						value: 'notify',
						name: 'notify',
						tooltip: "A notification template will be placed on the talk page of the creator, IF you have a notification enabled in your Twinkle preferences " +
							"for the criterion you choose AND this box is checked. The creator may be welcomed as well.",
						checked: !Morebits.userIsInGroup( 'sysop' ) || Twinkle.getPref('deleteSysopDefaultToTag'),
						disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'),
						event: function( event ) {
							event.stopPropagation();
						}
					}
				]
			}
		);
	} else {
		form.append( { type:'header', label: 'برچسب با {{حذف سریع}}: معیارها ' + (Twinkle.speedy.dbmultipleCriteria.length + 1) } );
	}

	if (firstTime) {
		form.append( { type: 'radio', name: 'csd',
			list: [
				{
					label: 'نئچه سیلینمه نَدنی واردیر',
					value: 'multiple',
					tooltip: 'به شما اجازه انتخاب چندین معیار می‌دهد',
					disabled: Morebits.userIsInGroup('sysop') && !Twinkle.getPref('deleteSysopDefaultToTag')
				}
			]
		} );
	} else if (Twinkle.speedy.dbmultipleCriteria.length > 0) {
		form.append( { type: 'radio', name: 'csd',
			list: [
				{
					label: 'معیار دیگری نیاز نیست برچسب را به مقاله بیافزای',
					value: 'multiple-finish'
				}
			]
		} );
	}

	var namespace = mw.config.get('wgNamespaceNumber');
	if (namespace % 2 === 1 && namespace !== 3) {  // talk pages, but not user talk pages
		form.append( { type: 'header', label: 'صفحه‌های بحث' } );
		form.append( { type: 'radio', name: 'csd', list: Twinkle.speedy.talkList } );
	}

	switch (namespace) {
		case 0:  // article
		case 1:  // talk
			form.append( { type: 'header', label: 'مقاله‌لر' } );
			form.append( { type: 'radio', name: 'csd', list: Twinkle.speedy.getArticleList(!firstTime) } );
			break;

		case 2:  // user
		case 3:  // user talk
			form.append( { type: 'header', label: 'صفحه‌های کاربری' } );
			form.append( { type: 'radio', name: 'csd', list: Twinkle.speedy.userList } );
			break;

		case 6:  // file
		case 7:  // file talk
			form.append( { type: 'header', label: 'پرونده‌ها' } );
			form.append( { type: 'radio', name: 'csd', list: Twinkle.speedy.getFileList(!firstTime) } );
			form.append( { type: 'div', label: 'Tagging for CSD F4 (no license), F5 (orphaned fair use), F6 (no fair use rationale), and F11 (no permission) can be done using Twinkle\'s "DI" tab.' } );
			break;

		case 10:  // template
		case 11:  // template talk
			form.append( { type: 'header', label: 'الگوها' } );
			form.append( { type: 'radio', name: 'csd', list: Twinkle.speedy.getTemplateList(!firstTime) } );
			break;

		case 14:  // category
		case 15:  // category talk
			form.append( { type: 'header', label: 'رده‌ها' } );
			form.append( { type: 'radio', name: 'csd', list: Twinkle.speedy.categoryList } );
			break;

		case 100:  // portal
		case 101:  // portal talk
			form.append( { type: 'header', label: 'درگاه‌ها' } );
			form.append( { type: 'radio', name: 'csd', list: Twinkle.speedy.getPortalList(!firstTime) } );
			break;

		default:
			break;
	}

	form.append( { type: 'header', label: 'عومومی موردلر' } );
	form.append( { type: 'radio', name: 'csd', list: Twinkle.speedy.getGeneralList(!firstTime) });

	form.append( { type: 'header', label: 'یوللاندیرمالار' } );
	form.append( { type: 'radio', name: 'csd', list: Twinkle.speedy.redirectList } );

	var result = form.render();
	if (dialog)
	{
		// render new dialog
		dialog.setContent( result );
		dialog.display();
	}
	else
	{
		// place the form content into the existing dialog box
		content.textContent = ''; // clear children
		content.appendChild(result);
	}
};

Twinkle.speedy.talkList = [
	{
		label: 'وپ:محس#ع۷ : صفحات بحث یتیم',
		value: 'talk',
		tooltip: 'This excludes any page that is useful to the project - in particular, user talk pages, talk page archives, and talk pages for files that exist on Wikimedia Commons.'
	}
];

// this is a function to allow for db-multiple filtering
Twinkle.speedy.getFileList = function twinklespeedyGetFileList(multiple) {
	var result = [];
	result.push({
		label: 'وپ:محس#پ۱ : موجود در ویکی‌انبار یا ویکی‌پدیا فارسی',
		value: 'redundantimage',
		tooltip: 'Any file that is a redundant copy, in the same file format and same or lower resolution, of something else on Morebits.wikipedia. Likewise, other media that is a redundant copy, in the same format and of the same or lower quality. This does not apply to files duplicated on Wikimedia Commons, because of licence issues; these should be tagged with {{جا:ncd|Image:newname.ext}} or {{جا:ncd}} instead'
	});
	result.push({
		label: 'وپ:محس#پ۲ : پرونده خراب یا خالی',
		value: 'noimage',
		tooltip: 'Before deleting this type of file, verify that the MediaWiki engine cannot read it by previewing a resized thumbnail of it. This also includes empty (i.e., no content) file description pages for Commons files'
	});
	if (!multiple) {
		result.push({
			label: 'وپ:محس#پ۲ : توضیحات نامربوط برای تصویری که در ویکی‌انبار بارگذاری شده‌است',
			value: 'fpcfail',
			tooltip: 'An image, hosted on Commons, but with tags or information on its English Wikipedia description page that are no longer needed. (For example, a failed featured picture candidate.)'
		});
	}
	result.push({
		label: 'وپ:محس#پ۳ : مجوز نادرست',
		value: 'noncom',
		tooltip: 'Files licensed as "for non-commercial use only", "non-derivative use" or "used with permission" that were uploaded on or after 2005-05-19, except where they have been shown to comply with the limited standards for the use of non-free content. This includes files licensed under a "Non-commercial Creative Commons License". Such files uploaded before 2005-05-19 may also be speedily deleted if they are not used in any articles'
	});
	if (Morebits.userIsInGroup('sysop')) {
		result.push({
			label: 'وپ:محس#پ۴ : فاقد اجازه‌نامه',
			value: 'unksource',
			tooltip: 'Files in category "Files with unknown source", "Files with unknown copyright status", or "Files with no copyright tag" that have been tagged with a template that places them in the category for more than seven days, regardless of when uploaded. Note, users sometimes specify their source in the upload summary, so be sure to check the circumstances of the file.'
		});
		result.push({
			label: 'وپ:محس#پ۵ : تصویر غیرآزاد استفاده نشده',
			value: 'unfree',
			tooltip: 'Files that are not under a free license or in the public domain that are not used in any article and that have been tagged with a template that places them in a dated subcategory of Category:Orphaned fairuse files for more than seven days. Reasonable exceptions may be made for file uploaded for an upcoming article. Use the "Orphaned fair use" option in Twinkle\'s DI module to tag files for forthcoming deletion.'
		});
		result.push({
			label: 'وپ:محس#پ۶ : عدم استفادهٔ منصفانه',
			value: 'norat',
			tooltip: 'Any file without a fair use rationale may be deleted seven days after it is uploaded.  Boilerplate fair use templates do not constitute a fair use rationale.  Files uploaded before 2006-05-04 should not be deleted immediately; instead, the uploader should be notified that a fair-use rationale is needed.  Files uploaded after 2006-05-04 can be tagged using the "No fair use rationale" option in Twinkle\'s DI module. Such files can be found in the dated subcategories of Category:Files with no fair use rationale.'
		});
	}
	result.push({
		label: 'وپ:محس#پ۶ : برچسب استفادهٔ منصفانهٔ نامعتبر',
		value: 'badfairuse',  // same as below
		tooltip: 'This is only for files with a clearly invalid fair-use tag, such as a {{لوگو}} tag on a photograph of a mascot. For cases that require a waiting period (replaceable images or otherwise disputed rationales), use the options on Twinkle\'s DI tab.'
	});
	if (!multiple) {
		result.push({
			label: 'وپ:محس#پ۷ : تصویر منصفانه از یک سازمان تجاری تهیه تصویر کپی شده است',
			value: 'badfairuse',  // same as above
			tooltip: 'Non-free images or media from a commercial source (e.g. , Associated Press, Getty), where the file itself is not the subject of sourced commentary, are considered an invalid claim of fair use and fail the strict requirements of WP:NFCC. '
		});
	}
	if (!multiple) {
		result.push({
			label: 'وپ:محس#پ۸ : تصویر با کیفیت بالاتر در ویکی‌انبار قرار دارد',
			value: 'nowcommons',
			tooltip: 'Provided the following conditions are met: 1: The file format of both images is the same. 2: The file\'s license and source status is beyond reasonable doubt, and the license is undoubtedly accepted at Commons. 3: All information on the file description page is present on the Commons file description page. That includes the complete upload history with links to the uploader\'s local user pages. 4: The file is not protected, and the file description page does not contain a request not to move it to Commons. 5: If the file is available on Commons under a different name than locally, all local references to the file must be updated to point to the title used at Commons. 6: For {{c-uploaded}} files: They may be speedily deleted as soon as they are off the Main Page'
		});
	}
	result.push({
		label: 'وپ:محس#پ۹ : نقض آشکار حق تکثیر',
		value: 'imgcopyvio',
		tooltip: 'The file was copied from a website or other source that does not have a license compatible with Wikipedia, and the uploader neither claims fair use nor makes a credible assertion of permission of free use. Sources that do not have a license compatible with Wikipedia include stock photo libraries such as Getty Images or Corbis. Non-blatant copyright infringements should be discussed at ویکی‌پدیا:Files for deletion'
	});
	result.push({
		label: 'وپ:محس#ت۶ : پروندهٔ بی‌استفاده',
		value: 'badfiletype',
		tooltip: 'Files uploaded that are neither image, sound, nor video files (e.g. .doc, .pdf, or .xls files) which are not used in any article and have no foreseeable encyclopedic use'
	});
	if (Morebits.userIsInGroup('sysop')) {
		result.push({
			label: 'وپ:محس#پ۴ : اثری از اجازه‌نامه نیست',
			value: 'nopermission',
			tooltip: 'If an uploader has specified a license and has named a third party as the source/copyright holder without providing evidence that this third party has in fact agreed, the item may be deleted seven days after notification of the uploader'
		});
	}
	result.push({
		label: 'وپ:محس#تغ۳ : صفحهٔ توضیح پرونده که به هیچ پرونده‌ای پیوند ندارد',
		value: 'imagepage',
		tooltip: 'This is only for use when the file doesn\'t exist at all. Corrupt files, and local description pages for files on Commons, should use F2; implausible redirects should use R3; and broken Commons redirects should use G6.'
	});
	return result;
};

Twinkle.speedy.getArticleList = function twinklespeedyGetArticleList(multiple) {
	var result = [];
	result.push({
		label: 'وپ:محس#م۱: مقاله خالی',
		value: 'nocontext',
		tooltip: 'Any article consisting only of links elsewhere (including hyperlinks, category tags and "see also" sections), a rephrasing of the title, and/or attempts to correspond with the person or group named by its title. This does not include disambiguation pages'
	});
	result.push({
		label: 'وپ:محس#م۲ : مقاله‌های ترجمه نشده',
		value: 'foreign',
		tooltip: 'If the article in question does not exist on another project, the template {{notenglish}} should be used instead. All articles in a non-English language that do not meet this criteria (and do not meet any other criteria for speedy deletion) should be listed at Pages Needing Translation (PNT) for review and possible translation'
	});
	result.push({
		label: 'وپ:محس#م۳: مقاله‌هایی که متن کافی برای شناساندن موضوع مقاله ندارند.',
		value: 'nocontent',
		tooltip: 'Example: "He is a funny man with a red car. He makes people laugh." This applies only to very short articles. Context is different from content, treated in A3, below.'
	});/*
	result.push({
		label: 'وپ:محس#م۴ : مقاله‌های تراویکی',
		value: 'transwiki',
		tooltip: 'Any article that has been discussed at Articles for Deletion (et al), where the outcome was to transwiki, and where the transwikification has been properly performed and the author information recorded. Alternately, any article that consists of only a dictionary definition, where the transwikification has been properly performed and the author information recorded'
	});*/
	result.push({
		label: 'وپ:محس#م۷ :فاقد سرشناسی- افراد، گروه‌ها، سازمان‌ها، وبگاه‌ها یا حیوان‌های تک ',
		value: 'a7',
		tooltip: 'مقاله‌ای دربارهٔ شخصی حقیقی، گروهی از مردم، گروه موسیقی، باشگاه، شرکت، محتوای وب یا حیوانی خاص که اهمیت موضوع را نشان نمی‌دهد.در صورت شک داشتن باید در وپ:نبح بیان گردد.'
	});/*
	if (!multiple) {
		result.push({
			label: 'وپ:محس#م۷ :شخص ناسرشناس',
			value: 'person',
			tooltip: 'An article about a real person that does not assert the importance or significance of its subject. If controversial, or if there has been a previous AfD that resulted in the article being kept, the article should be nominated for AfD instead'
		});
		result.push({
			label: 'وپ:محس#م۷ : گروه یا نوازنده/نوازندگان ناسرشناس',
			value: 'band',
			tooltip: 'مقاله در مورد یک گروه، خواننده، موسیقی‌دان، یا گروه موسیقی که اهمیت موضوع را نشان نمی‌دهد. '
		});
		result.push({
			label: 'وپ:محس#م۷ : باشگاه ناسرشناس',
			value: 'club',
			tooltip: 'مقاله در مورد یک انجمن که اهمیت موضوع را نشان نمی‌دهد. '
		});
		result.push({
			label: 'وپ:محس#م۷ : شرکت یا سازمان ناسرشناس',
			value: 'corp',
			tooltip: 'مقاله در مورد یک شرکت یا سازمان که اهمیت موضوع را نشان نمی‌دهد. '
		});
		result.push({
			label: 'وپ:محس#م۷ : سایت یا محتوای وب ناسرشناس',
			value: 'web',
			tooltip: 'مقاله در مورد یک وبگاه، بلاگ، فروم برخط، پادکست یا محتوای برخط مشابه که اهمیت موضوع را نشان نمی‌دهد. '
		});
		result.push({
			label: 'وپ:محس#م۷ : یک حیوان ناسرشناس',
			value: 'animal',
			tooltip: 'مقاله در مورد جانور که اهمیت موضوع را نشان نمی‌دهد. '
		});
	}
	result.push({
		label: 'وپ:محس#م۷ : اثر موسیقی ناسرشناس در صورتی که نواطنده آن مقاله ندارد',
		value: 'a9',
		tooltip: 'این مقاله درباره اثر موسیقی‌ای هست که خود نوازنده به علت عدم سرشناسی یا نبود منابع کافی مقاله ندارد'
	});*/
	if (!multiple) {
		result.push({
			label: 'وپ:محس#م۱۰ :مقالهٔ تکراری - مقالهٔ تازه ایجاد شده‌ای که دارای موضوعی تکراری و از پیش موجود است',
			value: 'a10',
			tooltip: 'A recently created article with no relevant page history that does not aim to expand upon, detail or improve information within any existing article(s) on the subject, and where the title is not a plausible redirect. This does not include content forks, split pages or any article that aims at expanding or detailing an existing one. '
		});
	}
	return result;
};

Twinkle.speedy.categoryList = [
	{
		label: 'وپ:محس#ر۱ : ردهٔ خالی',
		value: 'catempty',
		tooltip: '(دست کم چهار روز هیچ مقاله یا زیررده‌ای نداشته باشد) که تنها محتوای آن پیوندهایی به رده‌های مادر است. این شامل رده‌هایی که در WP:CFD یا WP:SFD در حال نظرخواهی‌اند یا رده‌های ابهام‌زدایی نمی‌شود. اگر رده به نسبت نو نیست، احتمالا در گذشته مقاله‌هایی داشته و بررسی‌های بیشتری لازم خواهد بود'
	},
	{
		label: 'وپ:محس#تغ۳ : رده مربوط به الگوهای پاک شده‌است',
		value: 'templatecat',
		tooltip: 'اگر الگویی شامل صفحات یک رده حذف شده‌است، آن رده نیز می‌تواند حذف شود. این مورد شامل رده‌هایی که هنوز مورد استفاده‌اند نمی‌شود. '
	}
];

Twinkle.speedy.userList = [
	{
		label: 'وپ:محس#ع۶ : درخواست کاربر',
		value: 'userreq',
		tooltip: 'Personal subpages, upon request by their user. In some rare cases there may be administrative need to retain the page. Also, sometimes, main user pages may be deleted as well. See ویکی‌پدیا:User page for full instructions and guidelines'
	},
	{
		label: 'وپ:محس#ک۲ : کاربر وجود ندارد',
		value: 'nouser',
		tooltip: 'صفحه‌های کاربری کاربرانی که وجود ندارند (ویژه:فهرست کاربران را بررسی کنید)'
	},
	{
		label: 'وپ:محس#ک۳ : نگارخانه‌های ناآزاد',
		value: 'gallery',
		tooltip: 'Galleries in the userspace which consist mostly of "fair use" or non-free files. Wikipedia\'s non-free content policy forbids users from displaying non-free files, even ones they have uploaded themselves, in userspace. It is acceptable to have free files, GFDL-files, Creative Commons and similar licenses along with public domain material, but not "fair use" files'
	}
];

Twinkle.speedy.getTemplateList = function twinklespeedyGetTemplateList(multiple) {
	var result = [];
	result.push({
		label: 'وپ:محس#ال۱ : الگو‌هایی که باعث تفسیر اشتباه از قوانین موجود می‌شوند.',
		value: 'policy',
		tooltip: 'This includes "speedy deletion" templates for issues that are not speedy deletion criteria and disclaimer templates intended to be used in articles'
	});
	if (!multiple) {
		result.push({
			label: 'وپ:محس#ال۲ : الگوهای بدون استفاده',
			value: 't3',
			tooltip: 'Templates that are either substantial duplications of another template or hardcoded instances of another template where the same functionality could be provided by that other template'
		});
	}
	return result;
};

Twinkle.speedy.getPortalList = function twinklespeedyGetPortalList(multiple) {
	var result = [];
	if (!multiple) {
		result.push({
			label: 'وپ:محس#د۱ : درگاهی که اگر مقاله بود، مشمول حذف سریع می‌شد',
			value: 'p1',
			tooltip: 'You must specify the article criterion that applies in this case (م۱, A3, م۷, or A10). '
		});
	}
	result.push({
		label: 'وپ:محس#د۲ : درگاه خالی',
		value: 'emptyportal',
		tooltip: 'Any Portal based on a topic for which there is not a non-stub header article, and at least three non-stub articles detailing subject matter that would be appropriate to discuss under the title of that Portal'
	});
	return result;
};

Twinkle.speedy.getGeneralList = function twinklespeedyGetGeneralList(multiple) {
	var result = [];
	if (!multiple) {
		result.push({
			label: 'دلیل دیگر' + (Morebits.userIsInGroup('sysop') ? ' (انتخاب معیار دیگر)': ' (انتخاب معیار دیگر)'),
			value: 'reason',
			tooltip: '{'+'{db}} is short for "delete because". At least one of the other deletion criteria must still apply to the page, and you should (must?) make mention of this in your rationale. This is not a "catch-all" for when you can\'t find any criteria that fit.'
		});
	}
	result.push({
		label: 'وپ:محس#ع۱ : صفحه نامفهوم ',
		value: 'nonsense',
		tooltip: 'This does not include poor writing, partisan screeds, obscene remarks, vandalism, fictional material, material not in English, poorly translated material, implausible theories, or hoaxes. In short, if you can understand it, ع۱ does not apply. '
	});
	result.push({
		label: 'وپ:محس#ع۲ : صفحه آزمایشی / تمرین',
		value: 'test',
		tooltip: 'A page created to test editing or other Wikipedia functions. Pages in the User namespace are not included, nor are valid but unused or duplicate templates (although criterion T3 may apply). '
	});
	result.push({
		label: 'وپ:محس#ع۳ : خرابکاری محض',
		value: 'vandalism',
		tooltip: 'Plain pure vandalism (including redirects left behind from pagemove vandalism)'
	});
	if (!multiple) {
		result.push({
			label: 'وپ:محس#ع۳ : گول زدن (تصویر غیرواقعی)',
			value: 'hoax',
			tooltip: 'مطلب فریب‌آمیز آشکار در حد خرابکاری'
		});
	}
	result.push({
		label: 'وپ:محس#ع۴ : ایجاد دوباره مطالبی که توسط نظرخواهی برای حذف، حذف شده‌اند',
		value: 'repost',
		tooltip: 'A copy, by any title, of a page that was deleted via an XfD process or Deletion review, provided that the copy is substantially identical to the deleted version. This clause does not apply to content that has been "userfied", to content undeleted as a result of Deletion review, or if the prior deletions were proposed or speedy deletions, although in this last case, other speedy deletion criteria may still apply'
	});
	result.push({
		label: 'وپ:محس#ع۵ : کاربر طرد شده',
		value: 'banned',
		tooltip: 'صفحات ساخته‌شده توسط کاربران بسته‌شده در حین قطع دسترسی'
	});
	if (!multiple) {
		result.push({
			label: 'وپ:محس#تغ۳ : ادغام تاریخچه',
			value: 'histmerge',
			tooltip: 'حذف موقت یک صفحه جهت ادغام تاریخچه‌های صفحه'
		});
		result.push({
			label: 'وپ:محس#تغ۳ : انتقال',
			value: 'move',
			tooltip: 'Making way for a noncontroversial move like reversing a redirect'
		});
		result.push({
			label: 'وپ:محس#تغ۳ : روند حذف',
			value: 'xfd',
			tooltip: 'An admin has closed a deletion discussion (at AfD, FfD, RfD, TfD, CfD, SfD, or MfD) as "delete", but they didn\'t actually delete the page.'
		});
		result.push({
			label: 'وپ:محس#تغ۳ : صفحه ابهام‌زدایی نالازم',
			value: 'disambig',
			tooltip: 'این تنها برای صفحه‌های ابهام‌زدایی یتیم که دارای یکی از این شرایط باشند به کار می‌رود: (۱) ابهام‌زدایی تنها دو مقاله‌ی موجود در ویکی‌پدیا یا کمتر که عنوانشان با "(ابهام‌زدایی)" پایان می‌پذیرد (یعنی موضوع اصلی دارند)، یا (۲) هیچ صفحه‌ای از ویکی‌پدیا را ابهام‌زدایی نمی‌کند، عنوانش مهم نیست.'
		});
		result.push({
			label: 'وپ:محس#تغ۳ : تغییرمسیر به یک صفحهٔ ابهام‌زدایی اشتباه',
			value: 'movedab',
			tooltip: 'این تنها برای تغییرمسیرها به صفحه‌های ابهام‌زدایی که با (ابهام‌زدایی) پایان می‌یابند و موضوع اصلی‌ای در آن‌ها نیست به کار می‌رود.'
		});
		result.push({
			label: 'وپ:محس#تغ۳ : انتقال با کپی و بارگذاری',
			value: 'copypaste',
			tooltip: 'This only applies for a copy-and-paste page move of another page that needs to be temporarily deleted to make room for a clean page move. '
		});
	}
	result.push({
		label: 'وپ:محس#تغ۳ : پاکسازی',
		value: 'g6',
		tooltip: 'Other non-controversial "housekeeping" tasks'
	});
	result.push({
		label: 'وپ:محس#ع۷ : کاربر خواستار حذف است یا کاربر صفحه را خالی کرد',
		value: 'author',
		tooltip: 'Any page for which deletion is requested by the original author in good faith, provided the page\'s only substantial content was added by its author. If the author blanks the page, this can also be taken as a deletion request.'
	});
	result.push({
		label: 'وپ:محس#تغ۳ : صفحات وابسته به صفحه‌ای ناموجود یا حذف‌شده',
		value: 'g8',
		tooltip: 'such as talk pages with no corresponding subject page; subpages with no parent page; file pages without a corresponding file; redirects to invalid targets, such as nonexistent targets, redirect loops, and bad titles; or categories populated by deleted or retargeted templates. This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons. '
	});
	if (!multiple) {
		result.push({
			label: 'وپ:محس#تغ۳ : زیرصفحه‌های فاقد صفحهٔ ریشه',
			value: 'subpage',
			tooltip: 'This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons. '
		});
	}
	result.push({
		label: 'وپ:محس#ع۱۰ : صفحه حمله',
		value: 'attack',
		tooltip: 'Pages that serve no purpose but to disparage their subject or some other entity (e.g., "John Q. Doe is an imbecile"). This includes a biography of a living person that is negative in tone and unsourced, where there is no NPOV version in the history to revert to. Administrators deleting such pages should not quote the content of the page in the deletion summary!'
	});
	if (!multiple) {
		result.push({
			label: 'وپ:محس#ع۹ : تماماً منفی، زندگی‌نامه بدون منبع',
			value: 'negublp',
			tooltip: 'زندگی‌نامه یک فرد زنده که کاملا بدون منبع و با لحن منفی نوشته شده‌است. هیچ نسخه بی‌طرفی در تاریخچه مقاله وجود ندارد تا بدان واگردانده شود. '
		});
	}
	result.push({
		label: 'وپ:محس#ع۱۱ : تبلیغات',
		value: 'spam',
		tooltip: 'Pages which exclusively promote a company, product, group, service, or person and which would need to be fundamentally rewritten in order to become encyclopedic. Note that an article about a company or a product which describes its subject from a neutral point of view does not qualify for this criterion; an article that is blatant advertising should have inappropriate content as well'
	});
	result.push({
		label: 'وپ:محس#ع۱۲ : نقض حق تکثیر',
		value: 'copyvio',
		tooltip: 'Either: (1) Material was copied from another website that does not have a license compatible with Wikipedia, or is photography from a stock photo seller (such as Getty Images or Corbis) or other commercial content provider; (2) There is no non-infringing content in the page history worth saving; or (3) The infringement was introduced at once by a single person rather than created organically on wiki and then copied by another website such as one of the many Wikipedia mirrors'
	});
	return result;
};

Twinkle.speedy.redirectList = [
	{
		label: 'وپ:محس#تغ۲ : تغییرمسیر از فضای‌نام اصلی به هر فضای‌نام دیگری بجز فضاهای نام رده:، الگو:، ویکی‌پدیا:، راهنما: و درگاه:',
		value: 'rediruser',
		tooltip: '(this does not include the Wikipedia shortcut pseudo-namespaces). If this was the result of a page move, consider waiting a day or two before deleting the redirect'
	},
	{
		label: 'وپ:محس#تغ۳ : تغییرمسیر دارای اشتباه املایی نامحتمل که به تازگی ساخته شده‌است',
		value: 'redirtypo',
		tooltip: 'However, redirects from common misspellings or misnomers are generally useful, as are redirects in other languages'
	},
	{
		label: 'وپ:محس#تغ۳ : تغییرمسیر به هدف‌های نامعتبر، مانند زمانی که صفحهٔ هدف موجود نیست یا تغییرمسیر حلقه‌ای',
		value: 'redirnone',
		tooltip: 'This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons. '
	}
];

Twinkle.speedy.normalizeHash = {
        'reason': 'db',
        'multiple': 'multiple',
        'multiple-finish': 'multiple-finish',
        'nonsense': 'ع۱',
        'test': 'ع۲',
        'vandalism': 'ع۳',
        'hoax': 'ع۳',
        'repost': 'ع۴',
        'banned': 'ع۵',
        'histmerge': 'ع۶',
        'move': 'ع۶',
        'xfd': 'ع۶',
        'disambig': 'ع۶',
        'movedab': 'ع۶',
        'copypaste': 'ع۶',
        'g6': 'ع۶',
        'author': 'ع۷',
        'g8': 'ع۸',
        'talk': 'ع۸',
        'subpage': 'ع۸',
        'redirnone': 'ع۸',
        'templatecat': 'ع۸',
        'attack': 'ع۱۰',
        'negublp': 'ع۱۰',
        'spam': 'ع۱۱',
        'copyvio': 'ع۱۲',
        'nocontext': 'م۱',
        'foreign': 'م۲',
        'nocontent': 'م۳',
        'transwiki': 'م۴',
        'a7': 'م۷',
        'person': 'م۷',
        'corp': 'م۷',
        'web': 'م۷',
        'band': 'م۷',
        'club': 'م۷',
        'animal': 'م۷',
        'a9': 'م۶',
        'a10': 'م۱۰',
        'rediruser': 'تغ۲',
        'redirtypo': 'تغ۳',
        'redundantimage': 'پ۱',
        'noimage': 'پ۲',
        'fpcfail': 'پ۲',
        'noncom': 'پ۳',
        'unksource': 'پ۴',
        'unfree': 'پ۵',
        'norat': 'پ۶',
        'badfairuse': 'پ۷',
        'nowcommons': 'پ۸',
        'imgcopyvio': 'پ۹',
        'badfiletype': 'پ۱۰',
        'nopermission': 'پ۱۱',
        'catempty': 'ر۱',
        'userreq': 'ک۱',
        'nouser': 'ک۲',
        'gallery': 'ک۳',
        'policy':'ال۱',
        't3': 'ال۲',
        'p1': 'د۱',
        'emptyportal': 'د۲'
};

// keep this synched with [[MediaWiki:Deletereason-dropdown]]
Twinkle.speedy.reasonHash = {
        'reason': '',
// General
        'nonsense': '[[وپ:محس#ع۱|عبارت‌های نامفهوم]]',
        'test': '[[وپ:محس#ع۲|صفحهٔ آزمایشی]]',
        'vandalism': '[[وپ:محس#ع۳|خرابکاری محض]]',
        'hoax': '[[وپ:محس#ع۳|کلک‌بازی و غلط‌انداز]]',
        'repost': '[[وپ:محس#ع۴|ایجاد دوباره محتوایی که قبلاً حذف شده]]',
        'banned': '[[وپ:محس#ع۵|ساختهٔ کاربر طردشده]]',
        'histmerge': '[[وپ:محس#ع۶|حذف موقت برای میسرسازی انتقال تاریخچه]]',
        'move': '[[وپ:محس#ع۶|میسرسازی انتقال]]',
        'xfd': '[[وپ:محس#ع۶|فرآیند حذف (نظرخواهی)]]',
        'disambig': '[[وپ:محس#ع۶|ابهام‌زدایی نالازم]]',
        'movedab': '[[وپ:محس#ع۶|صفحهٔ ابهام‌زدایی در جای اشتباه]]',
        'copypaste': '[[وپ:محس#ع۶|رونوشت‌برداری به جای انتقال]]',
        'g6': '[[وپ:محس#ع۶|تمیزکاری]]',
        'author': '[[وپ:محس#ع۷|درخواست از طرف نویسنده یا خالی‌کردن صفحه بدست پدیدآور]]',
        'g8': '[[وپ:محس#ع۸|متعلق به صفحه‌ای حذف‌شده یا ناموجود]]',
        'talk': '[[وپ:محس#ع۸|بحث یتیم]]',
        'subpage': '[[وپ:محس#ع۸|زیرصفحهٔ یتیم]]',
        'redirnone': '[[وپ:محس#ع۸|تغییرمسیر به صفحهٔ حذف‌شده یا ناموجود]]',
        'templatecat': '[[وپ:محس#ع۸|ردهٔ الگوی حذف‌شده یا تغییر ردهٔ الگو]]',
        'attack': '[[وپ:محس#ع۱۰|صفحهٔ حمله یا منفی بدون منبع]]',
        'negublp': '[[وپ:محس#ع۱۰|لحن کاملاً منفی و بی‌منبع در زندگی‌نامهٔ زندگان]]',
        'spam': '[[وپ:محس#ع۱۱|تبلیغات واضح]]',
        'copyvio': '[[وپ:محس#ع۱۲|نقض آشکار حق تکثیر]]',
// Articles
        'nocontext': '[[وپ:محس#م۱|مقالهٔ کوتاه، بدون محتوای لازم برای شناسایی موضوع]]',
        'foreign': '[[وپ:محس#م۲|مقاله به یک زبان خارجی است که در پروژه‌های دیگر موجود است]]',
        'nocontent': '[[وپ:محس#م۳|مقاله دارای مطالب کم‌ارزش یا بی‌معنا است]]',
        'transwiki': '[[وپ:محس#م۴|مقاله‌ای که به پروژه‌های دیگر منتقل شده‌است]]',
        'a7': '[[وپ:محس#م۷|عدم سرشناسی]]',
        'person': '[[وپ:محس#م۷|عدم سرشناسی (فرد حقیقی)]]',
        'web': '[[وپ:محس#م۷|عدم سرشناسی (محتوای وب)]',
        'corp': '[[وپ:محس#م۷|عدم سرشناسی (سازمان)]]',
        'club': '[[وپ:محس#م۷|عدم سرشناسی (کلوپ)]]',
        'band': '[[وپ:محس#م۷|عدم سرشناسی (باند، خواننده یا گروه موسیقی)]]',
        'animal': '[[وپ:محس#م۷|عدم سرشناسی (حیوان)]]',
        'a9': '[[وپ:محس#م۶|موسیقی ضبط‌شده بدست یک هنرمند بی‌مقاله، بدون نشانی از اهمیت یا سرشناسی]]',
        'a10': '[[وپ:محس#م۱۰|موضوع تکراری]]',
// Images and media
        'redundantimage': '[[وپ:محس#پ۱|تصویر همسان با تصویری دیگر]]',
        'noimage': '[[وپ:محس#پ۲|پروندهٔ خراب یا خالی، یا صفحهٔ توضیحات پرونده‌ای که در انبار است]]',
        'noncom': '[[وپ:محس#پ۳|تصویر با اجازه‌نامهٔ نامناسب]]',
        'unksource': '[[وپ:محس#پ۴|نداشتن اطلاعات مجوز]]',
        'unfree': '[[وپ:محس#پ۵|رسانهٔ استفاده‌نشدهٔ ناآزاد]]',
        'norat': '[[وپ:محس#پ۶|پروندهٔ ناآزاد بدون توضیح در مورد استفادهٔ منصفانه]]',
        'badfairuse': '[[وپ:محس#پ۷|ادعای نادرست در مورد استفادهٔ منصفانه]]',
        'nowcommons': '[[وپ:محس#پ۸|پرونده‌ای که همانند آن در ویکی‌انبار موجود است]]',
        'imgcopyvio': '[[وپ:محس#پ۹|نقض حق تکثیر پرونده]]',
        'badfiletype': '[[وپ:محس#پ۱۰|پروندهٔ رسانه‌ای غیر قابل استفاده]]',
        'nopermission': '[[وپ:محس#پ۱۱|نداشتن مدرک برای مجوز]]',
// Categories
        'catempty': '[[وپ:محس#ر۱|ردهٔ خالی]]',
// User pages
        'userreq': '[[وپ:محس#ک۱|درخواست کاربر]]',
        'nouser': '[[وپ:محس#ک۲|صفحه یا زیرصفحهٔ کاربری، مربوط به کاربری که وجود ندارد]]',
        'gallery': '[[وپ:محس#ک۳|گالری غیر آزاد]]',
// Templates
        'policy': '[[وپ:محس#ال۱|الگویی که آشکارا نمایش نادرستی از سیاست‌های کنونی است]]',
        't3': '[[وپ:محس#ال۲|الگوهای تکراری استفاده‌نشده]]',
// Portals
        'p1': '[[وپ:محس#د۱|درگاهی که به عنوان یک مقاله حذف سریع می‌شود]]',
        'emptyportal': '[[وپ:محس#د۲|درگاه کم‌مقاله]]',
// Redirects
        'rediruser': '[[وپ:محس#تغ۲|تغییرمسیر به فضای نام دیگر]]',
        'redirtypo': '[[وپ:محس#تغ۳|تغییرمسیر نامحتمل]]',
};

Twinkle.speedy.callbacks = {
	sysop: {
		main: function( params ) {
			var thispage = new Morebits.wiki.page( mw.config.get('wgPageName'), "حذف صفحه" );

			// delete page
			var reason;
			if (params.normalized === 'db') {
				reason = prompt("معیار حذف را که قصد دارید در سیاهه دیده شود را بنویسید:", "");
			} else {
				var presetReason = params.normalized.toUpperCase() + ": " + params.reason;
				if (Twinkle.getPref("promptForSpeedyDeletionSummary").indexOf(params.normalized) !== -1) {
					reason = prompt("معیار حذف را بنویسید یا دکمه تائید را کلیک کنید تا به صورت خودکار معیار نوشته شود", presetReason);
				} else {
					reason = presetReason;
				}
			}
			if (!reason || !reason.replace(/^\s*/, "").replace(/\s*$/, "")) {
				Morebits.status.error("درخواست دلیل", "به علت عدم وارد کردن دلیل درخواست شما انجام نشد.");
				return;
			}
			thispage.setEditSummary( reason + Twinkle.getPref('deletionSummaryAd') );
			thispage.deletePage();

			// delete talk page
			if (params.deleteTalkPage &&
			    params.normalized !== 'f8' &&
			    document.getElementById( 'ca-talk' ).className !== 'new') {
				var talkpage = new Morebits.wiki.page( Morebits.wikipedia.namespaces[ mw.config.get('wgNamespaceNumber') + 1 ] + ':' + mw.config.get('wgTitle'), "حذف صفحهٔ بحث" );
				talkpage.setEditSummary('بحث یتیم صفحهٔ [[' + mw.config.get('wgPageName') + "]]. " + Twinkle.getPref('deletionSummaryAd'));
				talkpage.deletePage();
			}

			// promote Unlink tool
			var $link, $bigtext;
			if( mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8' ) {
				$link = $('<a/>', {
					'href': '#',
					'text': 'اینجا را کلیک کنید تا پیوندهای داده‌شده به این نگاره برداشته شوند.',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' },
					'click': function(){
						Morebits.wiki.actionCompleted.redirect = null;
						Twinkle.speedy.dialog.close();
						Twinkle.unlink.callback("حذف پرونده‌ها به کمک پیوندها  " + mw.config.get('wgPageName'));
					}
				});
				$bigtext = $('<span/>', {
					'text': 'برای پیوندهای یتیم و حذف پرونده های استفاده شده',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
				});
				Morebits.status.info($bigtext[0], $link[0]);
			} else if (params.normalized !== 'f8') {
				$link = $('<a/>', {
					'href': '#',
					'text': 'اینجا را برای رفتن به ابزار حذف پیوندها کلیک کنید',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' },
					'click': function(){
						Morebits.wiki.actionCompleted.redirect = null;
						Twinkle.speedy.dialog.close();
						Twinkle.unlink.callback(" بۇ صفحه‌یه وئریلن لینکلری کس " + mw.config.get('wgPageName'));
					}
				});
				$bigtext = $('<span/>', {
					'text': 'برای پیوندهای یتیم',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
				});
				Morebits.status.info($bigtext[0], $link[0]);
			}

			// open talk page of first contributor
			if( params.openusertalk ) {
				thispage = new Morebits.wiki.page( mw.config.get('wgPageName') );  // a necessary evil, in order to clear incorrect Morebits.status.text
				thispage.setCallbackParameters( params );
				thispage.lookupCreator( Twinkle.speedy.callbacks.sysop.openUserTalkPage );
			}

			// delete redirects
			if (params.deleteRedirects) {
				var query = {
					'action': 'query',
					'list': 'backlinks',
					'blfilterredir': 'redirects',
					'bltitle': mw.config.get('wgPageName'),
					'bllimit': 5000  // 500 is max for normal users, 5000 for bots and sysops
				};
				var wikipedia_api = new Morebits.wiki.api( 'دریافت فهرست تغییرمسیرها...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
					new Morebits.status( 'درحال حذف تغییرمسیرها' ) );
				wikipedia_api.params = params;
				wikipedia_api.post();
			}
		},
		openUserTalkPage: function( pageobj ) {
			pageobj.getStatusElement().unlink();  // don't need it anymore
			var user = pageobj.getCreator();
			var statusIndicator = new Morebits.status('بازکردن بحث کاربر ' + user, 'بازکردن...');

			var query = {
				'title': 'User talk:' + user,
				'action': 'edit',
				'preview': 'yes',
				'vanarticle': mw.config.get('wgPageName').replace(/_/g, ' ')
			};
			switch( Twinkle.getPref('userTalkPageMode') ) {
			case 'tab':
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query ), '_tab' );
				break;
			case 'blank':
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query ), '_blank', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
				break;
			case 'window':
				/* falls through */
				default :
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + Morebits.queryString.create( query ), 'twinklewarnwindow', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
				break;
			}

			statusIndicator.info( 'انجام شد' );
		},
		deleteRedirectsMain: function( apiobj ) {
			var xmlDoc = apiobj.getXML();
			var $snapshot = $(xmlDoc).find('backlinks bl');

			var total = $snapshot.length;

			if( !total ) {
				return;
			}

			var statusIndicator = apiobj.statelem;
			statusIndicator.status("0%");

			var onsuccess = function( apiobj ) {
				var obj = apiobj.params.obj;
				var total = apiobj.params.total;
				var now = parseInt( 100 * ++(apiobj.params.current)/total, 10 ) + '%';
				obj.update( now );
				apiobj.statelem.unlink();
				if( apiobj.params.current >= total ) {
					obj.info( now + ' (کامل شد)' );
					Morebits.wiki.removeCheckpoint();
				}
			};

			Morebits.wiki.addCheckpoint();

			var params = clone( apiobj.params );
			params.current = 0;
			params.total = total;
			params.obj = statusIndicator;

			$snapshot.each(function(key, value) {
				var title = $(value).attr('title');
				var page = new Morebits.wiki.page(title, 'حذف تغییرمسیرها "' + title + '"');
				page.setEditSummary('حذف تغییرمسیر صفحهٔ حذف شده [[' + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('deletionSummaryAd'));
				page.deletePage(onsuccess);
			});
		}
	},





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

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

			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();

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

			// check for existing deletion tags
			var tag = /(?:\{\{\s*(db|delete|حذف سریع|db-.*?)(?:\s*\||\s*\}\}))/.exec( text );
			if( tag ) {
				statelem.error( [ Morebits.htmlNode( 'strong', tag[1] ) , " به صفحه افزوده شد." ] );
				return;
			}

			var xfd = /(?:\{\{([rsaiftcm]fd|md1)[^{}]*?\}\})/i.exec( text );
			if( xfd && !confirm( "برچسب حذف {{" + xfd[1] + "}} در صفحه موجود است. آیا می‌خواهید برچسب دیگری بزنید؟" ) ) {
				return;
			}

			var code, parameters, i;
			if (params.normalized === 'multiple')
			{
				code = "{{db-multiple";
				for (i in Twinkle.speedy.dbmultipleCriteria) {
					if (typeof Twinkle.speedy.dbmultipleCriteria[i] === 'string') {
						code += "|" + Twinkle.speedy.dbmultipleCriteria[i].toUpperCase();
					}
				}
				for (i in Twinkle.speedy.dbmultipleParameters) {
					if (typeof Twinkle.speedy.dbmultipleParameters[i] === 'string') {
						code += "|" + i + "=" + Twinkle.speedy.dbmultipleParameters[i];
					}
				}
				code += "}}";
				params.utparams = [];
			}
			else
			{
				parameters = Twinkle.speedy.getParameters(params.value, params.normalized, statelem);
				if (!parameters) {
					return;  // the user aborted
				}
				code = "{{جا:db-" + params.value;
				for (i in parameters) {
					if (typeof parameters[i] === 'string') {
						code += "|" + i + "=" + parameters[i];
					}
				}
				code += "}}";
				params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalized, parameters);
			}

			var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
			// patrol the page, if reached from Special:NewPages
			if( Twinkle.getPref('markSpeedyPagesAsPatrolled') ) {
				thispage.patrol();
			}

			// Notification to first contributor
			if (params.usertalk) {
				var callback = function(pageobj) {
					var initialContrib = pageobj.getCreator();

					// don't notify users when their user talk page is nominated
					if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
						Morebits.status.warn("Notifying initial contributor: this user created their own user talk page; skipping notification"); 
						return;
					}

					var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "اطلاع‌رسانی به کاربر سازنده (" + initialContrib + ")");
					var notifytext;

					// specialcase "db" and "db-multiple"
					switch (params.normalized)
					{
						case 'db':
							notifytext = "\n\n{{جا:db-reason-notice|1=" + mw.config.get('wgPageName');
							break;
						case 'multiple':
							notifytext = "\n\n{{جا:db-notice-multiple|1=" + mw.config.get('wgPageName');
							break;
						default:
							notifytext = "\n\n{{جا:db-csd-notice-custom|1=" + mw.config.get('wgPageName') + "|2=" + params.value;
							break;
					}
					for (var i in params.utparams) {
						if (typeof params.utparams[i] === 'string') {
							notifytext += "|" + i + "=" + params.utparams[i];
						}
					}
					notifytext += (params.welcomeuser ? "" : "|nowelcome=yes") + "}} ~~~~";

					usertalkpage.setAppendText(notifytext);
					usertalkpage.setEditSummary("اطلاع‌رسانی: حذف سریع  [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
					usertalkpage.setCreateOption('recreate');
					usertalkpage.setFollowRedirect(true);
					usertalkpage.append();

					// 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);
					}
				};
				thispage.lookupCreator(callback);
			}
			// 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);
			}

			// 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*(New unreviewed article|Userspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");

			// Generate edit summary for edit
			var editsummary;
			switch (params.normalized)
			{
				case 'db':
					editsummary = 'درخواست حذف سریع با معیار \"' + parameters["1"] + '\".';
					break;
				case 'multiple':
					editsummary = 'درخواست حذف سریع (';
					for (i in Twinkle.speedy.dbmultipleCriteria) {
						if (typeof Twinkle.speedy.dbmultipleCriteria[i] === 'string') {
							editsummary += Twinkle.speedy.dbmultipleCriteria[i].toUpperCase()+'، ';
						}
					}
					editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma
					editsummary += ').';
					break;
				case 'g6':
					if (params.value === 'histmerge') {
						editsummary = "درخواست ادغام تاریخچه با [[" + parameters["1"] + "]] ([[ویکی‌پدیا:معیارهای حذف سریع|معیار]]).";
						break;
					}
					/* falls through */
				default:
					editsummary = "درخواست حذف (" + params.normalized.toUpperCase() + ").";
					break;
			}

			pageobj.setPageText(code + ((params.normalized === 'g10' || Twinkle.speedy.dbmultipleCriteria.indexOf('g10') !== -1) ?
					'' : ("\n" + text) )); // cause attack pages to be blanked
			pageobj.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
			pageobj.setWatchlist(params.watch);
			pageobj.setCreateOption('nocreate');
			pageobj.save();
		},

		// note: this code is also invoked from twinkleimage
		// the params used are:
		//   for all: params.normalized
		//   for CSD: params.value
		//   for DI: params.fromDI = true, params.type
		addToLog: function(params, initialContrib) {
			var wikipedia_page = new Morebits.wiki.page("User:" + mw.config.get('wgUserName') + "/" + Twinkle.getPref('speedyLogPageName'), "افزودن متن به فهرست زیر صفحهٔ کاربری");
			params.logInitialContrib = initialContrib;
			wikipedia_page.setCallbackParameters(params);
			wikipedia_page.load(Twinkle.speedy.callbacks.user.saveLog);
		},

		saveLog: function(pageobj) {
			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();

			// add blurb if log page doesn't exist
			if (!pageobj.exists()) {
				text =
					"این یک فهرست از کلیهٔ سیاهه‌های  [[وپ:حذف سریع|حذف سریع]] که به وسیله این کاربر پیشنهاد شده‌اند [[وپ:توینکل]].\n\n" +
					"اگر قصد نگهداری این فهرست را ندارید، می‌توانید آن را از بخش [[وپ:توینکل/ترجیحات|ترجیحات توینکل]]" +
					" غیرفعال نمایید.\n";
				if (Morebits.userIsInGroup("sysop")) {
					text += "\nاین فهرست حذف‌های سریع انجام شده بدون استفاده از توینکل را شامل نمی‌شود.\n";
				}
			}

			// create monthly header
			var date = new Date();
			var headerRe = new RegExp("^==+\\s*" + date.getUTCMonthName() + "\\s+" + date.getUTCFullYear() + "\\s*==+", "m");
			if (!headerRe.exec(text)) {
				text += "\n\n=== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ===";
			}

			text += "\n# [[:" + mw.config.get('wgPageName') + "]]: ";
			if (params.fromDI) {
				text +=  params.normalized.toUpperCase() + " (" + params.type + ")";
			} else {
				switch (params.normalized)
				{
					case 'db':
						text += "{{الگو|حذف سریع}}";
						break;
					case 'multiple':
						text += "چند معیار (";
						for (var i in Twinkle.speedy.dbmultipleCriteria) {
							if (typeof Twinkle.speedy.dbmultipleCriteria[i] === 'string') {
								text +=  Twinkle.speedy.dbmultipleCriteria[i].toUpperCase() + '، ';
							}
						}
						text = text.substr(0, text.length - 2);  // remove trailing comma
						text += ')';
						break;
					default:
						text +=  params.normalized.toUpperCase() + "({{الگو|db-" + params.value + "}})";
						break;
				}
			}

			if (params.logInitialContrib) {
				text += "; اطلاع‌رسانی به {{user|" + params.logInitialContrib + "}}";
			}
			text += " ~~~~~\n";

			pageobj.setPageText(text);
			pageobj.setEditSummary("درخواست حذف سریع  [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
			pageobj.setCreateOption("recreate");
			pageobj.save();
		}
	}
};

// prompts user for parameters to be passed into the speedy deletion tag
Twinkle.speedy.getParameters = function twinklespeedyGetParameters(value, normalized, statelem)
{
	var parameters = [];
	switch( normalized ) {
		case 'db':
			var dbrationale = prompt('افرودن معیار اجباری است   \n\"این صفحه برای حذف سریع کاندید شده است چون:\"', "");
			if (!dbrationale || !dbrationale.replace(/^\s*/, "").replace(/\s*$/, ""))
			{
				statelem.error( 'شما باید یک دلیل بیان کنید به وسیله کاربر لغو شد.' );
				return null;
			}
			parameters["1"] = dbrationale;
			break;
		case 'u1':
			if (mw.config.get('wgNamespaceNumber') === 3 && !((/\//).test(mw.config.get('wgTitle'))))
			{
				var u1rationale = prompt('لطفا دلیل خود را بیان کنید چرا صفجه بحث کاربر باید حذف شود، بیان دلیل اجباری است:', "");
				if (!u1rationale || !u1rationale.replace(/^\s*/, "").replace(/\s*$/, ""))
				{
					statelem.error( 'شما باید یک دلیل بیان کنید به وسیله کاربر لغو شد.' );
					return null;
				}
				parameters.rationale = u1rationale;
			}
			break;
		case 'f8':
			var pagenamespaces = mw.config.get('wgPageName').replace( '_', ' ' );
			var filename = prompt( 'لطفاً نام پرونده در ویکی انبار را بنویسید:', pagenamespaces );
			if (filename === null)
			{
				statelem.error( 'به وسیله کاربر لغو شد.' );
				return null;
			}
			if (filename !== '' && filename !== pagenamespaces)
			{
				if (filename.indexOf("Image:") === 0 || filename.indexOf("File:") === 0)
				{
					parameters["1"] = filename;
				}
				else
				{
					statelem.error("پرونده حذف شده‌است. درخواست شما لغو شد.");
					return null;
				}
			}
			parameters.date = "~~~~~";
			break;
		case 'g4':
			var deldisc = prompt( 'لطفا نام یا پیوند به صفحه وپ:نبح را در صورت موجود بودن بنویسید.', "" );
			if (deldisc === null)
			{
				statelem.error( 'به وسیله کاربر لغو شد.' );
				return null;
			}
			if (deldisc !== "" && (deldisc.substring(0, 9) !== "Wikipedia" || deldisc.substring(0, 3) !== "WP:"))
			{
				statelem.error( 'صفحهٔ بحث یافت نشد. درخواست لغو شد.امکان ادامه کار وجود ندارد' );
				return null;
			}
			parameters["1"] = deldisc;
			break;
		case 'g5':
			var banneduser = prompt( 'لطفاً نام کاربر طرد شده را بنویسید:', "" );
			if (banneduser === null)
			{
				statelem.error( 'به وسیله کاربر لغو شد.' );
				return null;
			}
			parameters["1"] = banneduser;
			break;	
		case 'g6':
			switch( value ) {
				case 'histmerge':
					var mergetitle = prompt( 'لطفا نام صفحه‌ای را که می‌خواهید با آن ادغام شود را بنویسید:', "" );
					if (mergetitle === null)
					{
						statelem.error( 'به وسیله کاربر لغو شد.' );
						return null;
					}
					parameters["1"] = mergetitle;
					break;
				case 'move':
					var title = prompt( 'لطفا نام صفحه‌ای را که می‌خواهید به آن انتقال یابد را بنویسید:', "" );
					if (title === null)
					{
						statelem.error( 'به وسیله کاربر لغو شد.' );
						return null;
					}
					var reason = prompt( 'لطفا دلیل انتقال را بنویسید:', "" );
					if (reason === null)
					{
						statelem.error( 'به وسیله کاربر لغو شد.' );
						return null;
					}
					parameters["1"] = title;
					parameters["2"] = reason;
					break;
				case 'xfd':
					var votepage = prompt( 'لطفا نام بحثی را که با نام صفحهٔ اصلی آن متقاوت است را بنویسید:', "" );
					if (votepage === null)
					{
						statelem.error( 'به وسیله کاربر لغو شد.' );
						return null;
					}
					if (votepage === '')
					{
						var fullvotepage = prompt( 'For SfD discussions and pages where discussions are not where they are expected to be, please enter the full title of the discussion, including the namespace, here: (leave empty to skip):', "" );
						if (fullvotepage === null)
						{
						statelem.error( 'به وسیله کاربر لغو شد.' );
						return null;
						}
					}
					if (votepage !== '') {
						parameters.votepage = votepage;
					}
					if (fullvotepage !== '') {
						parameters.fullvotepage = fullvotepage;
					}
					if (confirm('نام صفحهٔ تغییرمسیری که نظرخواهی برای حذف آن شده است را بنویسید')) {
						parameters.redirect = "yes";
					}
					break;
				case 'copypaste':
					var copytitle = prompt( 'لطفا نام صفحهٔ کپی شده از خود ویکی‌پدیا را بنویسید:', "" );
					if (copytitle === null)
					{
						statelem.error( 'به وسیله کاربر لغو شد.' );
						return null;
					}
					parameters["1"] = copytitle;
					break;
				case 'g6':
					var g6rationale = prompt( 'لطفا در صورت دلخواه خود یک دلیل بیان نمایید. (اختیاری):', "" );
					if (g6rationale === null)
					{
						statelem.error( 'به وسیله کاربر لغو شد.' );
						return null;
					}
					if (g6rationale !== '')
					{
						parameters.rationale = g6rationale;
					}
					break;
				default:
					break;
			}
			break;
		case 'g7':
			if (Twinkle.getPref('speedyPromptOnG7'))
			{
				var g7rationale = prompt('بیان دلیل اختیاری است (مثلا پیوند به بحثی که نویسنده درخواست حذف داده است. - می‌توایند خالی رها کنید):', "");
				if (g7rationale === null)
				{
					statelem.error( 'به وسیله کاربر لغو شد.' );
					return null;
				}
				if (g7rationale !== '')
				{
					parameters.rationale = g7rationale;
				}
			}
			break;
		case 'f9':
		case 'g12':
			var url = prompt( 'لطفا نشانی اسنترنتی را بنویسید همراه با  "http://":', "" );
			if (url === null)
			{
				statelem.error( 'به وسیله کاربر لغو شد.' );
				return null;
			}
			parameters.url = url;
			break;
		case 'a2':
			var source = prompt('پیوند میان‌ویکی به ویکی دیگر را بنویسید (مثلاً, "fr:Bonjour"):', "");
			if (source === null)
			{
				statelem.error('به وسیله کاربر لغو شد.');
				return null;
			}
			parameters.source = source;
			break;
		case 'a10':
			var duptitle = prompt( 'نام مقالهٔ دوباره ساخته شده را بنویسید:', "" );
			if (duptitle === null)
			{
				statelem.error( 'به وسیله کاربر لغو شد.' );
				return null;
			}
			parameters.article = duptitle;
			break;
		case 'f1':
			var img = prompt( 'نام پرونده تکراری را بدون عبارت پروند: یا File:  بنویسید:', "" );
			if (img === null)
			{
				statelem.error( 'به وسیله کاربر لغو شد.' );
				return null;
			}
			parameters.filename = img;
			break;
		case 't3':
			var template = prompt( 'نام الگو تکراری را بنویسید. بدون پیشوند الگو:', "" );
			if (template === null)
			{
				statelem.error( 'به وسیله کاربر لغو شد.' );
				return null;
			}
			parameters["1"] = "~~~~~";
			parameters["2"] = template;
			break;
		case 'g10':
			parameters.blanked = 'yes';
			// it is actually blanked elsewhere in code, but setting the flag here
			break;
		case 'p1':
			var criterion = prompt( 'Enter the code of the article CSD criterion which this portal falls under:   \n\n(A1 = no context, A3 = no content, A7 = non-notable, A10 = duplicate)', "" );
			if (!criterion || !criterion.replace(/^\s*/, "").replace(/\s*$/, ""))
			{
				statelem.error( 'شماباید یک معیار را مشخص نمایید به وسیله کاربر لغو شد.' );
				return null;
			}
			parameters["1"] = criterion;
			break;
		default:
			break;
	}
	return parameters;
};

// function for processing talk page notification template parameters
Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters)
{
	var utparams = [];
	switch (normalized)
	{
		case 'db':
			utparams["2"] = parameters["1"];
			break;
		case 'a10':
			utparams.key1 = "article";
			utparams.value1 = parameters.article;
			break;
		default:
			break;
	}
	return utparams;
};

Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e)
{
	mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!

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

	var value = e.target.values;
	var normalized = Twinkle.speedy.normalizeHash[ value ];

	var params = {
		value: value,
		normalized: normalized,
		watch: Twinkle.getPref('watchSpeedyPages').indexOf( normalized ) !== -1,
		reason: Twinkle.speedy.reasonHash[ value ],
		openusertalk: Twinkle.getPref('openUserTalkPageOnSpeedyDelete').indexOf( normalized ) !== -1,
		deleteTalkPage: e.target.form.talkpage && e.target.form.talkpage.checked,
		deleteRedirects: e.target.form.redirects.checked
	};
	Morebits.status.init( e.target.form );

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

Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
	mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' '));  // for queen/king/whatever and country!
	var value = e.target.values;

	if (value === 'multiple')
	{
		e.target.form.style.display = "none"; // give the user a cue that the dialog is being changed
		setTimeout(function() {
			Twinkle.speedy.initDialog(Twinkle.speedy.callback.doMultiple, false, e.target.form.parentNode);
		}, 150);
		return;
	}

	if (value === 'multiple-finish') {
		value = 'multiple';
	}
	else
	{
		// clear these out, whatever the case, to avoid errors
		Twinkle.speedy.dbmultipleCriteria = [];
		Twinkle.speedy.dbmultipleParameters = [];
	}

	var normalized = Twinkle.speedy.normalizeHash[ value ];

	// for sysops only
	if (['f4', 'f5', 'f6', 'f11'].indexOf(normalized) !== -1) {
		alert("Tagging with F4, F5, F6, and F11 is not possible using the CSD module.  Try using DI instead, or unchecking \"Tag page only\" if you meant to delete the page.");
		return;
	}

	var i;

	// analyse each db-multiple criterion to determine whether to watch the page/notify the creator
	var watchPage = false;
	if (value === 'multiple')
	{
		for (i in Twinkle.speedy.dbmultipleCriteria)
		{
			if (typeof Twinkle.speedy.dbmultipleCriteria[i] === 'string' &&
				Twinkle.getPref('watchSpeedyPages').indexOf(Twinkle.speedy.dbmultipleCriteria[i]) !== -1)
			{
				watchPage = true;
				break;
			}
		}
	}
	else
	{
		watchPage = Twinkle.getPref('watchSpeedyPages').indexOf(normalized) !== -1;
	}

	var notifyuser = false;
	if (value === 'multiple')
	{
		for (i in Twinkle.speedy.dbmultipleCriteria)
		{
			if (typeof Twinkle.speedy.dbmultipleCriteria[i] === 'string' &&
				Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').indexOf(Twinkle.speedy.dbmultipleCriteria[i]) !== -1)
			{
				notifyuser = true;
				break;
			}
		}
	}
	else
	{
		notifyuser = (Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').indexOf(normalized) !== -1) && e.target.form.notify.checked;
	}

	var welcomeuser = false;
	if (notifyuser)
	{
		if (value === 'multiple')
		{
			for (i in Twinkle.speedy.dbmultipleCriteria)
			{
				if (typeof Twinkle.speedy.dbmultipleCriteria[i] === 'string' &&
					Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(Twinkle.speedy.dbmultipleCriteria[i]) !== -1)
				{
					welcomeuser = true;
					break;
				}
			}
		}
		else
		{
			welcomeuser = Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(normalized) !== -1;
		}
	}

	var csdlog = false;
	if (Twinkle.getPref('logSpeedyNominations') && value === 'multiple')
	{
		for (i in Twinkle.speedy.dbmultipleCriteria)
		{
			if (typeof Twinkle.speedy.dbmultipleCriteria[i] === 'string' &&
				Twinkle.getPref('noLogOnSpeedyNomination').indexOf(Twinkle.speedy.dbmultipleCriteria[i]) === -1)
			{
				csdlog = true;
				break;
			}
		}
	}
	else
	{
		csdlog = Twinkle.getPref('logSpeedyNominations') && Twinkle.getPref('noLogOnSpeedyNomination').indexOf(normalized) === -1;
	}

	var params = {
		value: value,
		normalized: normalized,
		watch: watchPage,
		usertalk: notifyuser,
		welcomeuser: welcomeuser,
		lognomination: csdlog
	};

	Morebits.status.init( e.target.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.setCallbackParameters(params);
	wikipedia_page.load(Twinkle.speedy.callbacks.user.main);
};

Twinkle.speedy.dbmultipleCriteria = [];
Twinkle.speedy.dbmultipleParameters = [];
Twinkle.speedy.callback.doMultiple = function twinklespeedyCallbackDoMultiple(e)
{
	var value = e.target.values;
	var normalized = Twinkle.speedy.normalizeHash[value];
	if (value !== 'multiple-finish')
	{
		if (Twinkle.speedy.dbmultipleCriteria.indexOf(normalized) !== -1)
		{
			alert('شما این معیار را انتخاب کرده اید لطفا مورد جدیدی را انتخاب نمایید.');
		}
		else
		{
			var parameters = Twinkle.speedy.getParameters(value, normalized, Morebits.status);
			if (parameters)
			{
				for (var i in parameters) {
					if (typeof parameters[i] === 'string') {
						Twinkle.speedy.dbmultipleParameters[i] = parameters[i];
					}
				}
				Twinkle.speedy.dbmultipleCriteria.push(normalized);
			}
		}
		e.target.form.style.display = "none"; // give the user a cue that the dialog is being changed
		setTimeout(function() {
			Twinkle.speedy.initDialog(Twinkle.speedy.callback.doMultiple, false, e.target.form.parentNode);
		}, 150);
	}
	else
	{
		Twinkle.speedy.callback.evaluateUser(e);
	}
};
/*</pre>
=== بخش ۲۰===
<pre>*/ 
/*
 ****************************************
 *** twinkleunlink.js: Unlink module
 ****************************************
 * Mode of invocation:     Tab ("Unlink")
 * Active on:              Non-special pages
 * Config directives in:   TwinkleConfig
 */

Twinkle.unlink = function twinkleunlink() {
	if( mw.config.get('wgNamespaceNumber') < 0 ) {
		return;
	}
	$(twAddPortletLink("#", "باغلانتی کس", "tw-unlink", "برداشتن پیوندهای به این صفحه", "")).click(function(){Twinkle.unlink.callback()}); //wrap call in function, callback expects a reason parameter.
};

Twinkle.unlink.getChecked2 = function twinkleunlinkGetChecked2( nodelist ) {
	if( !( nodelist instanceof NodeList ) && !( nodelist instanceof HTMLCollection ) ) {
		return nodelist.checked ? [ nodelist.values ] : [];
	}
	var result = [];
	for(var i  = 0; i < nodelist.length; ++i ) {
		if( nodelist[i].checked ) {
			result.push( nodelist[i].values );
		}
	}
	return result;
};

// the parameter is used when invoking unlink from admin speedy
Twinkle.unlink.callback = function(presetReason) {
	var Window = new Morebits.simpleWindow( 800, 400 );
	Window.setTitle( "برداشتن پیوندهای به این صفحه" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.unlink.callback.evaluate );
	form.append( {
		type: 'textarea',
		name: 'reason',
		label: 'دلیل: ',
		value: (presetReason ? presetReason : '')
	} );

	var query;
	if(mw.config.get('wgNamespaceNumber') === Namespace.IMAGE) {
		query = {
			'action': 'query',
			'list': [ 'backlinks', 'imageusage' ],
			'bltitle': mw.config.get('wgPageName'),
			'iutitle': mw.config.get('wgPageName'),
			'bllimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'iulimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'blnamespace': Twinkle.getPref('unlinkNamespaces') // Main namespace and portal namespace only, keep on talk pages.
		};
	} else {
		query = {
			'action': 'query',
			'list': 'backlinks',
			'bltitle': mw.config.get('wgPageName'),
			'blfilterredir': 'nonredirects',
			'bllimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'blnamespace': Twinkle.getPref('unlinkNamespaces') // Main namespace and portal namespace only, keep on talk pages.
		};
	}
	var wikipedia_api = new Morebits.wiki.api( 'دریافت پیوندهای بازگشتی', query, Twinkle.unlink.callbacks.display.backlinks );
	wikipedia_api.params = { form: form, Window: Window, image: mw.config.get('wgNamespaceNumber') === Namespace.IMAGE };
	wikipedia_api.post();

	var root = document.createElement( 'div' );
	root.style.padding = '15px';  // just so it doesn't look broken
	Morebits.status.init( root );
	wikipedia_api.statelem.status( "بارگیری..." );
	Window.setContent( root );
	Window.display();
};

Twinkle.unlink.callback.evaluate = function twinkleunlinkCallbackEvaluate(event) {
	mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' '));  // for queen/king/whatever and country!

	Twinkle.unlink.backlinksdone = 0;
	Twinkle.unlink.imageusagedone = 0;

	function processunlink(pages, imageusage) {
		var statusIndicator = new Morebits.status((imageusage ? 'Unlinking instances of file usage' : 'برداشتن پیوندها'), '0%');
		var total = pages.length;  // removing doubling of this number - no apparent reason for it

		Morebits.wiki.addCheckpoint();

		if( !pages.length ) {
			statusIndicator.info( '۱۰۰٪ (کامل شد)' );
			Morebits.wiki.removeCheckpoint();
			return;
		}

		// get an edit token
		var params = { reason: reason, imageusage: imageusage, globalstatus: statusIndicator, current: 0, total: total };
		for (var i = 0; i < pages.length; ++i)
		{
			var myparams = clone(params);
			var articlepage = new Morebits.wiki.page(pages[i], 'برداشتن پیوند از مقالهٔ "' + pages[i] + '"');
			articlepage.setCallbackParameters(myparams);
			articlepage.load(imageusage ? Twinkle.unlink.callbacks.unlinkImageInstances : Twinkle.unlink.callbacks.unlinkBacklinks);
		}
	}

	var reason = event.target.reason.value;
	var backlinks, imageusage;
	if( event.target.backlinks ) {
		backlinks = Twinkle.unlink.getChecked2(event.target.backlinks);
	}
	if( event.target.imageusage ) {
		imageusage = Twinkle.unlink.getChecked2(event.target.imageusage);
	}

	Morebits.simpleWindow.setButtonsEnabled( false );
	Morebits.status.init( event.target );
	Morebits.wiki.addCheckpoint();
	if (backlinks) {
		processunlink(backlinks, false);
	}
	if (imageusage) {
		processunlink(imageusage, true);
	}
	Morebits.wiki.removeCheckpoint();
};

Twinkle.unlink.backlinksdone = 0;
Twinkle.unlink.imageusagedone = 0;

Twinkle.unlink.callbacks = {
	display: {
		backlinks: function twinkleunlinkCallbackDisplayBacklinks(apiobj) {
			var xmlDoc = apiobj.responseXML;
			var havecontent = false;
			var list, namespaces, i;

			if( apiobj.params.image ) {
				var imageusage = $(xmlDoc).find('query imageusage iu');
				list = [];
				for ( i = 0; i < imageusage.length; ++i ) {
					var usagetitle = imageusage[i].getAttribute('title');
					list.push( { label: usagetitle, value: usagetitle, checked: true } );
				}
				if (!list.length)
				{
					apiobj.params.form.append( { type: 'div', label: 'No instances of file usage found.' } );
				}
				else
				{
					apiobj.params.form.append( { type:'header', label: 'موارد کاربرد پرونده' } );
					namespaces = [];
					$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
						namespaces.push(Morebits.wikipedia.namespacesFriendly[v]);
					});
					apiobj.params.form.append( {
						type: 'div',
						label: "فضای نام‌های انتخابی: " + namespaces.join(', '),
						tooltip: "شما می‌توانید این مورد را با تغییر دادن در ترجیحات تویکل تغییر دهید."
					});
					if ($(xmlDoc).find('query-continue').length) {
						apiobj.params.form.append( {
							type: 'div',
							label: "First " + list.length.toString() + " file usages shown."
						});
					}
					apiobj.params.form.append( {
						type: 'checkbox',
						name: 'imageusage',
						list: list
					} );
					havecontent = true;
				}
			}

			var backlinks = $(xmlDoc).find('query backlinks bl');
			if( backlinks.length > 0 ) {
				list = [];
				for ( i = 0; i < backlinks.length; ++i ) {
					var title = backlinks[i].getAttribute('title');
					list.push( { label: title, value: title, checked: true } );
				}
				apiobj.params.form.append( { type:'header', label: 'پیوندها به' } );
				namespaces = [];
				$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
					namespaces.push(Morebits.wikipedia.namespacesFriendly[v]);
				});
				apiobj.params.form.append( {
					type: 'div',
					label: "فضای نام انتخابی: " + namespaces.join(', '),
					tooltip: "You can change this with your Twinkle preferences, at [[WP:TWPREFS]]"
				});
				if ($(xmlDoc).find('query-continue').length) {
					apiobj.params.form.append( {
						type: 'div',
						label: "اولین " + list.length.toString() + " نمایش پیوندها به."
					});
				}
				apiobj.params.form.append( {
					type: 'checkbox',
					name: 'backlinks',
					list: list
				});
				havecontent = true;
			}
			else
			{
				apiobj.params.form.append( { type: 'div', label: 'بۇ صفحه‌یه لینک تاپیلمادی' } );
			}

			if (havecontent) {
				apiobj.params.form.append( { type:'submit' } );
			}

			var result = apiobj.params.form.render();
			apiobj.params.Window.setContent( result );
		}
	},
	unlinkBacklinks: function twinkleunlinkCallbackUnlinkBacklinks(pageobj) {
		var text, oldtext;
		text = oldtext = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		var wikiPage = new Mediawiki.Page(text);
		wikiPage.removeLink(mw.config.get('wgPageName'));
		text = wikiPage.getText();
		if (text === oldtext) {
			// Nothing to do, return
			Twinkle.unlink.callbacks.success(pageobj);
			Morebits.wiki.actionCompleted();
			return;
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary("حذف پیوندها به \"" + mw.config.get('wgPageName') + "\": " + params.reason + "." + Twinkle.getPref('summaryAd'));
		pageobj.setCreateOption('nocreate');
		pageobj.save(Twinkle.unlink.callbacks.success);
	},
	unlinkImageInstances: function twinkleunlinkCallbackUnlinkImageInstances(pageobj) {
		var text, oldtext;
		text = oldtext = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		var wikiPage = new Mediawiki.Page(text);
		wikiPage.commentOutImage(mw.config.get('wgTitle'), 'Commented out');
		text = wikiPage.getText();
		if (text === oldtext) {
			// Nothing to do, return
			Twinkle.unlink.callbacks.success(pageobj);
			Morebits.wiki.actionCompleted();
			return;
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary("توضیحی کردن استفاده از پرونده  \"" + mw.config.get('wgPageName') + "\": " + params.reason + "." + Twinkle.getPref('summaryAd'));
		pageobj.setCreateOption('nocreate');
		pageobj.save(Twinkle.unlink.callbacks.success);
	},
	success: function twinkleunlinkCallbackSuccess(pageobj) {
		var statelem = pageobj.getStatusElement();
		statelem.info('انجام شد');

		var params = pageobj.getCallbackParameters();
		var total = params.total;
		var now = parseInt( 100 * (params.imageusage ? ++(Twinkle.unlink.imageusagedone) : ++(Twinkle.unlink.backlinksdone))/total, 10 ) + '%';
		params.globalstatus.update( now );
		if((params.imageusage ? Twinkle.unlink.imageusagedone : Twinkle.unlink.backlinksdone) >= total) {
			params.globalstatus.info( now + ' (کامل شد)' );
			Morebits.wiki.removeCheckpoint();
		}
	}
};
/*</pre>
=== بخش ۲۱===
<pre>*/ 
/*
 ****************************************
 *** twinklewarn.js: Warn module
 ****************************************
 * Mode of invocation:     Tab ("Warn")
 * Active on:              User talk pages
 * Config directives in:   TwinkleConfig
 */

Twinkle.warn = function twinklewarn() {
	/*
         if( mw.config.get('wgNamespaceNumber') === 3 ) {
		if(twinkleUserAuthorized) {
			$(twAddPortletLink("#", "هشدار", "tw-warn", "Warn/notify user", "")).click(Twinkle.warn.callback);
		} else {
			$(twAddPortletLink("#", "هشدار", "tw-warn", "Warn/notify user", "")).click(function() {
				alert("سیزین ایشلدن حسابینیز توینکلی ایشلتمگه تجروبه‌سیزدیر.");
			});
		}
	} 
*/
//حذف بخش هشدار به کاربر به علت  نبود الگوها و نبود استفاده در ویکی‌فا

	// modify URL of talk page on rollback success pages
	if( mw.config.get('wgAction') === 'rollback' ) {
		var $vandalTalkLink = $("#mw-rollback-success .mw-usertoollinks a").first();
		$vandalTalkLink.css("font-weight", "bold");

		var extraParam = "vanarticle=" + mw.util.rawurlencode(mw.config.get("wgPageName").replace(/_/g, " "));
		var href = $vandalTalkLink.attr("href");
		if (href.indexOf("?") === -1) {
			$vandalTalkLink.attr("href", href + "?" + extraParam);
		} else {
			$vandalTalkLink.attr("href", href + "&" + extraParam);
		}
	}
};

Twinkle.warn.callback = function twinklewarnCallback() {
	if( mw.config.get('wgTitle').split( '/' )[0].replace( /\"/, "\\\"") === mw.config.get('wgUserName') ){
		alert( 'Fine, you\'ve been warned!' );
		return;
	}
	
	var Window = new Morebits.simpleWindow( 600, 440 );
	Window.setTitle( "Warn/notify user" );
	Window.setScriptName( "توینکل" );
	Window.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',
			event:Twinkle.warn.callback.change_category
		} );

	var defaultGroup = parseInt(Twinkle.getPref('defaultWarningGroup'), 10);
	main_group.append( { type:'option', label:'General note (1)', value:'level1', selected: ( defaultGroup === 1 || defaultGroup < 1 || ( Morebits.userIsInGroup( 'sysop' ) ? defaultGroup > 8 : defaultGroup > 7 ) ) } );
	main_group.append( { type:'option', label:'Caution (2)', value:'level2', selected: ( defaultGroup === 2 ) } );
	main_group.append( { type:'option', label:'Warning (3)', value:'level3', selected: ( defaultGroup === 3 ) } );
	main_group.append( { type:'option', label:'Final warning (4)', value:'level4', selected: ( defaultGroup === 4 ) } );
	main_group.append( { type:'option', label:'Only warning (4im)', value:'level4im', selected: ( defaultGroup === 5 ) } );
	main_group.append( { type:'option', label:'Single issue notices', value:'singlenotice', selected: ( defaultGroup === 6 ) } );
	main_group.append( { type:'option', label:'Single issue warnings', value:'singlewarn', selected: ( defaultGroup === 7 ) } );
	if( Morebits.userIsInGroup( 'sysop' ) ) {
		main_group.append( { type:'option', label:'Blocking', value:'block', selected: ( defaultGroup === 8 ) } );
	}

	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:( Morebits.queryString.exists( 'vanarticle' ) ? Morebits.queryString.get( 'vanarticle' ) : '' ),
			tooltip:'An article can be linked within the notice, perhaps because it was a revert to said article that dispatched this notice. Leave empty for no article to be linked. '
		} );

	var more = form.append( { type: 'field', name: 'reasonGroup', label: 'اطلاعات هشدار' } );
	more.append( { type:'textarea', label:'Optional message:', name:'reason', tooltip:'Perhaps a reason, or that a more detailed notice must be appended' } );

	var previewlink = document.createElement( 'a' );
	$(previewlink).click(function(){
		Twinkle.warn.callbacks.preview(result);  // |result| is defined below
	});
	previewlink.style.cursor = "pointer";
	previewlink.textContent = 'Preview';
	more.append( { type: 'div', name: 'warningpreview', label: [ previewlink ] } );

	more.append( { type:'submit', label:'Submit' } );

	var result = form.render();
	Window.setContent( result );
	Window.display();
	result.main_group.root = result;

	// 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 ". $summaryAd"
//   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.
Twinkle.warn.messages = {
	level1: {
		"uw-vandalism1": {
			label:"Vandalism",
			summary:"General note: Nonconstructive editing"
		},
		"uw-genre1": { 
			label:"تغییرات فله‌ای یا مکرر بدون اجماع یا منبعs", 
			summary:"General note: تغییرات فله‌ای یا مکرر بدون اجماع یا منبعs"
		}
	},
	level2: {
		"uw-vandalism2": { 
			label:"Vandalism", 
			summary:"Caution: Vandalism" 
		},
		"uw-genre2": { 
			label:"تغییرات فله‌ای یا مکرر بدون اجماع یا منبعs", 
			summary:"Caution: تغییرات فله‌ای یا مکرر بدون اجماع یا منبعs"
		}
	},
	level3: {
		"uw-vandalism3": { 
			label:"Vandalism", 
			summary:"Warning: Vandalism" 
		},
		"uw-test3": { 
			label:"Editing tests", 
			summary:"Warning: Editing tests" 
		},
		"uw-genre3": { 
			label:"تغییرات فله‌ای یا مکرر بدون اجماع یا منبع", 
			summary:"Warning: تغییرات فله‌ای یا مکرر بدون اجماع یا منبع"
		}

	},
	level4: {
		"uw-generic4": { 
			label:"هشدار عمومی (جهت دسته الگوهای از دست داده‌شده مرحله ۴)", 
			summary:"Final warning notice" 
		},
		"uw-vandalism4": { 
			label:"Vandalism", 
			summary:"Final warning: Vandalism" 
		},
		"uw-npa4": { 
			label:"حمله شخصی به کاربری خاص", 
			summary:"Final warning: حمله شخصی به کاربری خاص"
		}

	},
	level4im: {
		"uw-vandalism4im": { 
			label:"Vandalism", 
			summary:"Only warning: Vandalism" 
		},
		"uw-delete4im": { 
			label:"خالی کردن صفحه، حذف محتویات", 
			summary:"Only warning: خالی کردن صفحه، حذف محتویات" 
		},
		"uw-npa4im": { 
			label:"حمله شخصی به کاربری خاص", 
			summary:"Only warning: حمله شخصی به کاربری خاص"
		}
	},
	singlenotice: {
		"uw-2redirect": { 
			label:"ساختن تغییرمسیر دوتایی در اثر انتقال نادرست صفحه", 
			summary:"Notice: ساختن تغییرمسیر دوتایی در اثر انتقال نادرست صفحه" 
		},
		"uw-warn": { 
			label:"الگوهای هشدار کاربر را در هنگام واگردانی خرابکاری قرار دهید", 
			summary:"Notice: You can use user warning templates when reverting vandalism"
		}
	},
	singlewarn: {
		"uw-3rr": { 
			label:"نقض قانون سه برگردان",
			summary:"Warning: Violating the three-revert rule"
		},
		"uw-wrongsummary": { 
			label:"استفاده از خلاصه ویرایش‌های نادرست", 
			summary:"Warning: استفاده از خلاصه ویرایش‌های نادرست"
		}
	},
	block: {
		"uw-block": {
			label: "Block",
			summary: "You have been blocked from editing",
			pageParam: true,
			reasonParam: true  // allows editing of reason for generic templates
		},
		"uw-spamublock": {
			label: "کاربر اسپم‌کننده یا تبلیغاتی (بی‌پایان)",
			summary: "You have been indefinitely blocked from editing because your account is being used only for [[ویکی‌پدیا:هرزنامه]] and your username is a violation of the [[WP:U|username policy]]",
			indefinite: true
		}
	}
};

Twinkle.warn.prev_block_timer = null;
Twinkle.warn.prev_block_reason = null;
Twinkle.warn.prev_article = null;
Twinkle.warn.prev_reason = null;

Twinkle.warn.callback.change_category = function twinklewarnCallbackChangeCategory(e) {
	var value = e.target.value;
	var sub_group = e.target.root.sub_group;
	var messages = Twinkle.warn.messages[ value ];
	sub_group.main_group = value;
	var old_subvalue = sub_group.value;
	var old_subvalue_re;
	if( old_subvalue ) {
		old_subvalue = old_subvalue.replace(/\d*(im)?$/, '' );
		old_subvalue_re = new RegExp( RegExp.escape( old_subvalue ) + "(\\d*(?:im)?)$" );
	}

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

	for( var i in messages ) {
		var selected = false;
		if( old_subvalue && old_subvalue_re.test( i ) ) {
			selected = true;
		}
		var elem = new Morebits.quickForm.element( { type:'option', label:"{{" + i + "}}: " + messages[i].label, value:i, selected: selected } );
		
		sub_group.appendChild( elem.render() );
	}

	if( value === 'block' ) {
		// create the block-related fields
		var more = new Morebits.quickForm.element( { type: 'div', id: 'block_fields' } );
		more.append( {
			type: 'input',
			name: 'block_timer',
			label: 'مدت قطع دسترسی: ',
			tooltip: 'The period the blocking is due for, for example 24 hours, 2 weeks, indefinite etc... '
		} );
		more.append( {
			type: 'input',
			name: 'block_reason',
			label: '"شما به‌دلیل... قطع دسترسی شده‌اید" ',
			tooltip: 'An optional reason, to replace the default generic reason. Only available for the generic block templates. '
		} );
		e.target.root.insertBefore( more.render(), e.target.root.lastChild );

		// restore saved values of fields
		if(Twinkle.warn.prev_block_timer !== null) {
			e.target.root.block_timer.value = Twinkle.warn.prev_block_timer;
			Twinkle.warn.prev_block_timer = null;
		}
		if(Twinkle.warn.prev_block_reason !== null) {
			e.target.root.block_reason.value = Twinkle.warn.prev_block_reason;
			Twinkle.warn.prev_block_reason = null;
		}
		if(Twinkle.warn.prev_article === null) {
			Twinkle.warn.prev_article = e.target.root.article.value;
		}
		e.target.root.article.disabled = false;

		$(e.target.root.reason).parent().hide();
		$("div#twinklewarn-previewbox:visible").last().remove();
	} else if( e.target.root.block_timer ) {
		// hide the block-related fields
		if(!e.target.root.block_timer.disabled && Twinkle.warn.prev_block_timer === null) {
			Twinkle.warn.prev_block_timer = e.target.root.block_timer.value;
		}
		if(!e.target.root.block_reason.disabled && Twinkle.warn.prev_block_reason === null) {
			Twinkle.warn.prev_block_reason = e.target.root.block_reason.value;
		}
		$(e.target.root).find("#block_fields").remove();

		if(e.target.root.article.disabled && Twinkle.warn.prev_article !== null) {
			e.target.root.article.value = Twinkle.warn.prev_article;
			Twinkle.warn.prev_article = null;
		}
		e.target.root.article.disabled = false;

		$(e.target.root.reason).parent().show();
		$("div#twinklewarn-previewbox:visible").last().remove();
	}
};

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

	if( main_group === 'singlewarn' ) {
		if( value === 'uw-username' ) {
			if(Twinkle.warn.prev_article === null) {
				Twinkle.warn.prev_article = e.target.form.article.value;
			}
			e.target.form.article.disabled = true;
			e.target.form.article.value = '';
		} else if( e.target.form.article.disabled ) {
			if(Twinkle.warn.prev_article !== null) {
				e.target.form.article.value = Twinkle.warn.prev_article;
				Twinkle.warn.prev_article = null;
			}
			e.target.form.article.disabled = false;
		}
	} else if( main_group === 'block' ) {
		if( Twinkle.warn.messages.block[value].indefinite ) {
			if(Twinkle.warn.prev_block_timer === null) {
				Twinkle.warn.prev_block_timer = e.target.form.block_timer.value;
			}
			e.target.form.block_timer.disabled = true;
			e.target.form.block_timer.value = 'indefinite';
		} else if( e.target.form.block_timer.disabled ) {
			if(Twinkle.warn.prev_block_timer !== null) {
				e.target.form.block_timer.value = Twinkle.warn.prev_block_timer;
				Twinkle.warn.prev_block_timer = null;
			}
			e.target.form.block_timer.disabled = false;
		}

		if( Twinkle.warn.messages.block[value].pageParam ) {
			if(Twinkle.warn.prev_article !== null) {
				e.target.form.article.value = Twinkle.warn.prev_article;
				Twinkle.warn.prev_article = null;
			}
			e.target.form.article.disabled = false;
		} else if( !e.target.form.article.disabled ) {
			if(Twinkle.warn.prev_article === null) {
				Twinkle.warn.prev_article = e.target.form.article.value;
			}
			e.target.form.article.disabled = true;
			e.target.form.article.value = '';
		}

		if( Twinkle.warn.messages.block[value].reasonParam ) {
			if(Twinkle.warn.prev_block_reason !== null) {
				e.target.form.block_reason.value = Twinkle.warn.prev_block_reason;
				Twinkle.warn.prev_block_reason = null;
			}
			e.target.form.block_reason.disabled = false;
		} else if( !e.target.form.block_reason.disabled ) {
			if(Twinkle.warn.prev_block_reason === null) {
				Twinkle.warn.prev_block_reason = e.target.form.block_reason.value;
			}
			e.target.form.block_reason.disabled = true;
			e.target.form.block_reason.value = '';
		}
	}

	var $article = $(e.target.form.article);
	if (main_group === "singlewarn" && value === "uw-socksuspect") {
		$article.prev().hide();
		$article.before('<span id="tw-spi-article-username">Username of sock master, if known (without User:) </span>');
	} else {
		$("span#tw-spi-article-username").remove();
		$article.prev().show();
	}
};

Twinkle.warn.callbacks = {
	preview: function(form) {
		var templatename = form.sub_group.value;

		var previewdiv = $(form).find('div[name="warningpreview"]').last();
		if (!previewdiv.length) {
			return;  // just give up
		}
		previewdiv = previewdiv[0];

		var previewbox = $(form).find('div#twinklewarn-previewbox').last();
		if (!previewbox.length) {
			previewbox = document.createElement('div');
			previewbox.style.background = "white";
			previewbox.style.border = "2px inset";
			previewbox.style.marginTop = "0.4em";
			previewbox.style.padding = "0.2em 0.4em";
			previewbox.setAttribute('id', 'twinklewarn-previewbox');
			previewdiv.parentNode.appendChild(previewbox);
		} else {
			previewbox.show();
			previewbox = previewbox[0];
		}

		var statusspan = document.createElement('span');
		previewbox.appendChild(statusspan);
		Morebits.status.init(statusspan);
		
		var templatetext = '{{' + templatename;
		var linkedarticle = form.article.value;
		if (templatename in Twinkle.warn.messages.block) {
			if( linkedarticle && Twinkle.warn.messages.block[templatename].pageParam ) {
				templatetext += '|page=' + linkedarticle;
			}

			var blocktime = form.block_timer.value;
			if( /te?mp|^\s*$|min/.exec( blocktime ) || Twinkle.warn.messages.block[templatename].indefinite ) {
				; // nothing
			} else if( /indef|\*|max/.exec( blocktime ) ) {
				templatetext += '|indef=yes';
			} else {
				templatetext += '|time=' + blocktime;
			}

			var blockreason = form.block_reason.value;
			if( blockreason ) {
				templatetext += '|دلیل=' + blockreason;
			}

			templatetext += "|sig=true}}";
		} else {
			if (linkedarticle) {
				// add linked article for user warnings (non-block templates)
				templatetext += '|1=' + linkedarticle;
			}
			templatetext += '}}';

			// add extra message for non-block templates
			var reason = form.reason.value;
			if (reason) {
				templatetext += " ''" + reason + "''";
			}
		}

		var query = {
			action: 'parse',
			prop: 'text',
			pst: 'true',  // PST = pre-save transform; this makes substitution work properly
			text: templatetext,
			title: mw.config.get('wgPageName')
		};
		var wikipedia_api = new Morebits.wiki.api("بارگیری...", query, Twinkle.warn.callbacks.previewRender, new Morebits.status("Preview"));
		wikipedia_api.params = { previewbox: previewbox };
		wikipedia_api.post();
	},
	previewRender: function( apiobj ) {
		var params = apiobj.params;
		var xml = apiobj.getXML();
		var html = $(xml).find('text').text();
		if (!html) {
			apiobj.statelem.error("خطا در نمایش پیش‌نمایش");
			return;
		}
		params.previewbox.innerHTML = html;
		// fix vertical alignment
		$(params.previewbox).find(':not(img)').css('vertical-align', 'baseline');
	},
	main: function( pageobj ) {
		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();
		var messageData = Twinkle.warn.messages[params.main_group][params.sub_group];

		var history_re = /<!-- Template:(uw-.*?) -->.*?(\d{1,2}:\d{1,2}, \d{1,2} \w+ \d{4}) \(UTC\)/g;
		var history = {};
		var latest = { date:new Date( 0 ), type:'' };
		var current;

		while( ( current = history_re.exec( text ) ) ) {
			var current_date = new Date( current[2] + ' UTC' );
			if( !( current[1] in history ) ||  history[ current[1] ] < current_date ) {
				history[ current[1] ] = current_date;
			}
			if( current_date > latest.date ) {
				latest.date = current_date;
				latest.type = current[1];
			}
		}

		var date = new Date();

		if( params.sub_group in history ) {
			var temp_time = new Date( history[ params.sub_group ] );
			temp_time.setUTCHours( temp_time.getUTCHours() + 24 );

			if( temp_time > date ) {
				if( !confirm( "An identical " + params.sub_group + " has been issued in the last 24 hours.  \nWould you still like to add this warning/notice?" ) ) {
					pageobj.statelem.info( 'aborted per user request' );
					return;
				}
			}
		}

		latest.date.setUTCMinutes( latest.date.getUTCMinutes() + 1 ); // after long debate, one minute is max

		if( latest.date > date ) {
			if( !confirm( "A " + latest.type + " has been issued in the last minute.  \nWould you still like to add this warning/notice?" ) ) {
				pageobj.statelem.info( 'aborted per user request' );
				return;
			}
		}
		
		var mainheaderRe = new RegExp("==+\\s*Warnings\\s*==+");
		var headerRe = new RegExp( "^==+\\s*(?:" + date.getUTCMonthName() + '|' + date.getUTCMonthNameAbbrev() +  ")\\s+" + date.getUTCFullYear() + "\\s*==+", 'm' );

		if( text.length > 0 ) {
			text += "\n\n";
		}

		if( params.main_group === 'block' ) {
			var article = '', reason = '', time = null;
			
			if( Twinkle.getPref('blankTalkpageOnIndefBlock') && params.sub_group !== 'uw-lblock' && ( Twinkle.warn.messages.block[params.sub_group].indefinite || (/indef|\*|max/).exec( params.block_timer ) ) ) {
				Morebits.status.info( 'info', 'خالی‌سازی صفحه بحص بر اساس ترجیحات و ساخت عنوان تاریخ‌دار' );
				text = "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
			} else if( !headerRe.exec( text ) ) {
				Morebits.status.info( 'info', 'در حال ساخت عنوان تاریخ‌دار برای این ماه به عنوان هیچ' );
				text += "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
			}
			
			if( params.article && Twinkle.warn.messages.block[params.sub_group].pageParam ) {
				article = '|صفحه=' + params.article;
			}
			
			if( params.reason && Twinkle.warn.messages.block[params.sub_group].reasonParam ) {
				reason = '|دلیل=' + params.reason;
			}
			
			if( /te?mp|^\s*$|min/.exec( params.block_timer ) || Twinkle.warn.messages.block[params.sub_group].indefinite ) {
				time = '';
			} else if( /indef|\*|max/.exec( params.block_timer ) ) {
				time = '|indef=yes';
			} else {
				time = '|تاریخ=' + params.block_timer;
			}

			text += "{{جا:" + params.sub_group + article + time + reason + "|sig=true|subst=جا:}}";
		} else {
			if( !headerRe.exec( text ) ) {
				Morebits.status.info( 'info', 'در حال ساخت عنوان تاریخ‌دار برای این ماه به عنوان هیچ' );
				text += "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
			}

			switch( params.sub_group ) {
				case 'uw-username':
					text += "{{جا:" + params.sub_group + ( params.reason ? '|1=' + params.reason : '' ) + "|subst=جا:}} ~~~~";
					break;
				default:
					text += "{{جا:" + params.sub_group + ( params.article ? '|1=' + params.article : '' ) + "|subst=جا:}}" + (params.reason ? " ''" + params.reason + "'' ": ' ' ) + "~~~~";
					break;
			}
		}
		
		if ( Twinkle.getPref('showSharedIPNotice') && Morebits.isIPAddress( mw.config.get('wgTitle') ) ) {
			Morebits.status.info( 'info', 'درحال اطلاع‌رسانی به آی‌پی' );
			text +=  "\n{{جا:SharedIPAdvice}}";
		}

		var summary = messageData.summary;
		if ( messageData.suppressArticleInSummary !== true && params.article ) {
			if ( params.sub_group === "uw-socksuspect" ) {  // this template requires a username
				summary += " of [[User:" + params.article + "]]";
			} else {
				summary += " on [[" + params.article + "]]";
			}
		}
		summary += "." + Twinkle.getPref("summaryAd");

		pageobj.setPageText( text );
		pageobj.setEditSummary( summary );
		pageobj.setWatchlist( Twinkle.getPref('watchWarnings') );
		pageobj.save();
	}
};

Twinkle.warn.callback.evaluate = function twinklewarnCallbackEvaluate(e) {

	// First, check to make sure a reason was filled in if uw-username was selected
	
	if(e.target.sub_group.value === 'uw-username' && e.target.reason.value.trim() === '') {
		alert("You must supply a reason for the {{uw-username}} template.");
		return;
	}

	// Then, grab all the values provided by the form
	
	var params = {
		reason: e.target.block_reason ? e.target.block_reason.value : e.target.reason.value,
		main_group: e.target.main_group.value,
		sub_group: e.target.sub_group.value,
		article: e.target.article.value,  // .replace( /^(Image|Category):/i, ':$1:' ),  -- apparently no longer needed...
		block_timer: e.target.block_timer ? e.target.block_timer.value : null
	};

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

	Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
	Morebits.wiki.actionCompleted.notice = "هشدار داده شد، دانیشیق صفحه‌سی یئنیلنمه‌سی اۆچون نئچه لحظه دؤزون...";

	var wikipedia_page = new Morebits.wiki.page( mw.config.get('wgPageName'), 'User talk page modification' );
	wikipedia_page.setCallbackParameters( params );
	wikipedia_page.setFollowRedirect( true );
	wikipedia_page.load( Twinkle.warn.callbacks.main );
};
/*</pre>
=== بخش ۲۲===
<pre>*/ 
/*
 ****************************************
 *** twinklexfd.js: XFD module
 ****************************************
 * Mode of invocation:     Tab ("پیشنهاد حذف")
 * Active on:              Existing, non-special pages, except for file pages with no local (non-Commons) file which are not redirects
 * Config directives in:   TwinkleConfig
 */

Twinkle.xfd = function twinklexfd() {
	// Disable on:
	// * special pages
	// * non-existent pages
	// * files on Commons, whether there is a local page or not (unneeded local pages of files on Commons are eligible for CSD F2)
	// * file pages without actual files (these are eligible for CSD G8)
	if ( mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId') || (mw.config.get('wgNamespaceNumber') === 6 && (document.getElementById('mw-sharedupload') || (!document.getElementById('mw-imagepage-section-filehistory') && !Morebits.wiki.isPageRedirect()))) ) {
		return;
	}
	if (twinkleUserAuthorized) {
		$(twAddPortletLink("#", "پیشنهاد حذف", "tw-xfd", "نظرخواهی برای حذف", "")).click(Twinkle.xfd.callback);
	} else {
		$(twAddPortletLink("#", 'پیشنهاد حذف', 'tw-xfd', 'نظرخواهی برای حذف', '')).click(function() {
			alert("سیزین ایشلدن حسابینیز توینکلی ایشلتمگه تجروبه‌سیزدیر.");
		});
	}
};

Twinkle.xfd.num2order = function twinklexfdNum2order( num ) {
	switch( num ) {
	case 1: return '';
	case 2: return '2nd';
	case 3: return '3rd';
	default: return num + 'th';
	}
};

Twinkle.xfd.currentRationale = null;

// error callback on Morebits.status object
Twinkle.xfd.printRationale = function twinklexfdPrintRationale() {
	if (Twinkle.xfd.currentRationale) {
		var p = document.createElement("p");
		p.textContent = "Your deletion rationale is provided below, which you can copy and paste into a new XFD dialog if you wish to try again:";
		var pre = document.createElement("pre");
		pre.className = "toccolours";
		pre.style.marginTop = "0";
		pre.textContent = Twinkle.xfd.currentRationale;
		p.appendChild(pre);
		Morebits.status.root.appendChild(p);
		// only need to print the rationale once
		Twinkle.xfd.currentRationale = null;
	}
};

Twinkle.xfd.callback = function twinklexfdCallback() {
	var Window = new Morebits.simpleWindow( 600, 350 );
	Window.setTitle( "نظرخواهی برای حذف (نبح)" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "توینکل کؤمکی", "وپ:توینکل" );

	var form = new Morebits.quickForm( Twinkle.xfd.callback.evaluate );
	var categories = form.append( {
			type: 'select',
			name: 'category',
			label: 'محل بحث در مورد حذف:',
			tooltip: 'پس از فعال شدن، بر پایهٔ فضای نامی که در آن هستید، یک گزینهٔ پیش‌فرض انتخاب می‌شود. این پیش‌فرض باید مناسب‌ترین باشد',
			event: Twinkle.xfd.callback.change_category
		} );
	categories.append( {
			type: 'option',
			label: 'نبح (مقاله‌های نامزد حذف)',
			selected: mw.config.get('wgNamespaceNumber') === Namespace.MAIN,
			value: 'afd'
		} );
	form.append( {
			type: 'checkbox',
			list: [
				{
					label: 'ایمکانی وارسا مقاله‌نی یارادان ایلدنه ایطلاع وئر',
					value: 'notify',
					name: 'notify',
					tooltip: "A notification template will be placed on the creator's talk page if this is true.",
					checked: true
				}
			]
		}
	);
	form.append( {
			type: 'field',
			label:'ایش یئری',
			name: 'work_area'
		} );
	form.append( { type:'submit' } );

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

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

Twinkle.xfd.previousNotify = true;

Twinkle.xfd.callback.change_category = function twinklexfdCallbackChangeCategory(e) {
	var value = e.target.value;
	var form = e.target.form;
	var old_area;
	var childNodes = form.childNodes;
	for( var i = 0; i < childNodes.length; ++i ) {
		var node = childNodes[i];
		if (node instanceof Element &&
		    node.getAttribute( 'name' ) === 'work_area') {
			old_area = node;
			break;
		}
	}
	var work_area = null;

	var oldreasontextbox = form.getElementsByTagName('textarea')[0];
	var oldreason = (oldreasontextbox ? oldreasontextbox.value : '');

	switch( value ) {
	case 'afd':
		work_area = new Morebits.quickForm.element( {
				type: 'field',
				label: 'نظرخواهی برای حذف',
				name: 'work_area'
			} );
		work_area.append( {
				type: 'checkbox',
				list: [
						{
							label: 'قراردادن برچسب حذف در میان  <noinclude>',
							value: 'noinclude',
							name: 'noinclude',
							tooltip: 'قرار دادن برچسب حذف در میان  &lt;noinclude&gt; زیاد متداول نیست و برای جلوگیری از انتقال برچسب به صفحه‌های دیگر کاربرد دارد. '
						}
					]
		} );
		var afd_category = work_area.append( {
				type:'select',
				name:'xfdcat',
				label:'بو کاندیدلیک هانسی بۆلمه اوچون اولدوغونو بیلیندیرین:'
			} );

		afd_category.append( { type:'option', label:'هله‌لیک بؤلمه‌لندیریلمه‌ییب', value:'U', selected:true } );
		afd_category.append( { type:'option', label:'مدیا و موزیک', value:'M' } );
		afd_category.append( { type:'option', label:'تشکیلات، شیرکت یوخسا محصول', value:'O' } );
		afd_category.append( { type:'option', label:'بیوقرافی', value:'B' } );
		afd_category.append( { type:'option', label:'ایجتماعی', value:'S' } );
		afd_category.append( { type:'option', label:'وب یوخسا اینترنت', value:'W' } );
		afd_category.append( { type:'option', label:'اویونلار یوخسا ایدمانلار', value:'G' } );
		afd_category.append( { type:'option', label:'علم و تکنولوژی', value:'T' } );
		afd_category.append( { type:'option', label:'ناغیل و هونر', value:'F' } );
		afd_category.append( { type:'option', label:'یئرلر و داشیما', value:'P' } );

		work_area.append( {
				type: 'textarea',
				name: 'xfdreason',
				label: 'نَدن: ',
				value: oldreason
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;

	default:
		work_area = new Morebits.quickForm.element( {
				type: 'field',
				label: 'هئچ‌ شئی هرشئی اۆچون',
				name: 'work_area'
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;
	}

	// No creator notification for CFDS
	if (value === "cfds") {
		Twinkle.xfd.previousNotify = form.notify.checked;
		form.notify.checked = false;
		form.notify.disabled = true;
	} else {
		form.notify.checked = Twinkle.xfd.previousNotify;
		form.notify.disabled = false;
	}
};

Twinkle.xfd.callbacks = {
	afd: {
		main: function(apiobj) {
			var xmlDoc = apiobj.responseXML;
			var titles = $(xmlDoc).find('allpages p');

			// There has been no earlier entries with this prefix, just go on.
			if( titles.length <= 0 ) {
				apiobj.params.numbering = apiobj.params.number = '';
			} else {
				var number = 0;
                                if (mw.config.get('wgNamespaceNumber') === 6){
		                    var fapage=' متفرقه';
                                } else {
                                    var fapage='';
	                        }
				for( var i = 0; i < titles.length; ++i ) {
					var title = titles[i].getAttribute('title');
                                      
					// First, simple test, is there an instance with this exact name?
					if( title === 'ویکی\u200cپدیا:نظرخواهی برای حذف'+fapage+'/' + mw.config.get('wgPageName') ) {
						number = Math.max( number, 1 );
						continue;
					}

					var order_re = new RegExp( '^' +
						RegExp.escape( 'ویکی\u200cپدیا:نظرخواهی برای حذف'+fapage+'/'+ mw.config.get('wgPageName'), true ) +
						'\\s*\\(\\s*(\\d+)(?:(?:th|nd|rd|st) nom(?:ination)?)?\\s*\\)\\s*$');
					var match = order_re.exec( title );

					// No match; A non-good value
					if( !match ) {
						continue;
					}

					// A match, set number to the max of current
					number = Math.max( number, Number(match[1]) );
				}
				apiobj.params.number = Twinkle.xfd.num2order( parseInt( number, 10 ) + 1);
				apiobj.params.numbering = number > 0 ? ' (' + apiobj.params.number + ' nomination)' : '';
			}
                        if (mw.config.get('wgNamespaceNumber') === 6){
		                    var fapage=' متفرقه';
                        } else {
                                    var fapage='';
	                };
			apiobj.params.discussionpage = 'ویکی\u200cپدیا:نظرخواهی برای حذف'+fapage+'/'+ mw.config.get('wgPageName') + apiobj.params.numbering;

			Morebits.status.info( "صفحهٔ بحث بعدی", "[[" + apiobj.params.discussionpage + "]]" );

			// Updating data for the action completed event
			Morebits.wiki.actionCompleted.redirect = apiobj.params.discussionpage;
			Morebits.wiki.actionCompleted.notice = "نظرخواهی انجام شد، درحال تغییرمسیر به صفحه نظرخواهی";

			// Tagging article
			var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "افزودن برچسب حذف به مقاله");
			wikipedia_page.setFollowRedirect(true);  // should never be needed, but if the article is moved, we would want to follow the redirect
			wikipedia_page.setCallbackParameters(apiobj.params);
			wikipedia_page.load(Twinkle.xfd.callbacks.afd.taggingArticle);
		},
		// Tagging needs to happen before everything else: this means we can check if there is an AfD tag already on the page
		taggingArticle: function(pageobj) {
			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();
			var statelem = pageobj.getStatusElement();

			// Check for existing AfD tag, for the benefit of new page patrollers
			var textNoAfd = text.replace(/\{\{\s*(Article for deletion\/dated|تئز سیل|AfDM)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");
			if (text !== textNoAfd) {
				if (confirm("مقاله دارای برچسب حذف سریع است آیا قصد جایگزینی آن با نظرخواهی برای حذف دارید؟.  \nبا زدن دکمه تائید برچسب نظرخواهی برای حذف جایگزین می‌گردد.")) {
					text = textNoAfd;
				} else {
					statelem.error("مقاله برای نظرخواهی حذف پیشنهاد شده‌است درخواست شما لغو شد.");
					window.location.reload();
					return;
				}
			}
                        if (mw.config.get('wgNamespaceNumber') === 6){
		                    var fapage=' متفرقه';
                        } else {
                                    var fapage='';
	                };
			// Now we know we want to go ahead with it, trigger the other AJAX requests

			// Starting discussion page
			var wikipedia_page = new Morebits.wiki.page(params.discussionpage, "ساخت صفحهٔ نظرخواهی حذف");
			wikipedia_page.setCallbackParameters(params);
			wikipedia_page.load(Twinkle.xfd.callbacks.afd.discussionPage);

			// Today's list
			var date = new Date();
			wikipedia_page = new Morebits.wiki.page('ویکی\u200cپدیا:نظرخواهی برای حذف'+fapage , "افزودن به وپ:نبح");
			wikipedia_page.setFollowRedirect(true);
			wikipedia_page.setCallbackParameters(params);
			wikipedia_page.load(Twinkle.xfd.callbacks.afd.todaysList);

			// Notification to first contributor
			if (params.usertalk) {
				var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
				thispage.setCallbackParameters(params);
				thispage.lookupCreator(Twinkle.xfd.callbacks.afd.userNotification);
			}

			// Remove some tags that should always be removed on AfD.
			text = text.replace(/\{\{\s*(dated prod|حذف سریع|dated prod blp|Prod blp\/dated|حذف زمان‌دار|حذف زماندار|Proposed deletion\/dated|prod2|Proposed deletion endorsed|New unreviewed article|Userspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");
			// Then, test if there are speedy deletion-related templates on the article.
			var textNoSd = text.replace(/\{\{\s*(db(-\w*)?|delete|(?:hang|hold)[\- ]?on)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");
			if (text !== textNoSd && confirm("برچسب حذف سریع در مقاله یافت شده‌است آیا باید این برچسب جایگزین شود؟")) {
				text = textNoSd;
			}

			pageobj.setPageText((params.noinclude ? "<noinclude>{{" : "{{") + (params.number === '' ? "جا:پیشنهاد حذف" : ('جا:afdx|' +
				params.number )) + (params.noinclude ? "}}</noinclude>\n" : "}}\n") + text);
			pageobj.setEditSummary("نظرخواهی برای حذف در [[" + params.discussionpage + "]]." + Twinkle.getPref('summaryAd'));
			switch (Twinkle.getPref('xfdWatchPage')) {
				case 'yes':
					pageobj.setWatchlist(true);
					break;
				case 'no':
					pageobj.setWatchlistFromPreferences(false);
					break;
				default:
					pageobj.setWatchlistFromPreferences(true);
					break;
			}
			pageobj.setCreateOption('nocreate');
			pageobj.save();
		},
		discussionPage: function(pageobj) {
			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();
                        if (mw.config.get('wgNamespaceNumber') === 6){
		                    var fapage=' متفرقه';
                                } else {
                                    var fapage='';
	                };
			pageobj.setPageText("{{جا:نظرخواهی برای حذف۲"+fapage+"|صفحه=" + mw.config.get('wgPageName') + "|رده=" + params.xfdcat + "|متن=" + params.reason + " ~~~~}}\n");
			pageobj.setEditSummary("ایجاد صفحه نظرخواهی برای [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
			switch (Twinkle.getPref('xfdWatchDiscussion')) {
				case 'yes':
					pageobj.setWatchlist(true);
					break;
				case 'no':
					pageobj.setWatchlistFromPreferences(false);
					break;
				default:
					pageobj.setWatchlistFromPreferences(true);
					break;
			}
			pageobj.setCreateOption('createonly');
			pageobj.save();
			Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki
		},
		todaysList: function(pageobj) {
			var old_text = pageobj.getPageText() + "\n";  // MW strips trailing blanks, but we like them, so we add a fake one
			var params = pageobj.getCallbackParameters();
			var statelem = pageobj.getStatusElement();
                        if (mw.config.get('wgNamespaceNumber') === 6){
		                    var fapagetem='{{جا:پیشنهاد حذف۴|صفحه=';
                                } else {
                                    var fapagetem='{{جا:پیشنهاد حذف۳|صفحه=';
	                };
			var text = old_text.replace( /(<\!-- توینکل -->\n+)/, fapagetem + mw.config.get('wgPageName') + params.numbering + "}}\n$1");
                        
			if( text === old_text ) {
				statelem.error( 'دانیشیق آدرسی تاپیلمادی' );
				return;
			}
                        text = text.replace( /\}\}\n\n\{\{/, "\}\}\n\{\{");
			pageobj.setPageText(text);
			pageobj.setEditSummary("آرتیریلیر  [[" + params.discussionpage + "]]." + Twinkle.getPref('summaryAd'));
			switch (Twinkle.getPref('xfdWatchList')) {
				case 'yes':
					pageobj.setWatchlist(true);
					break;
				case 'no':
					pageobj.setWatchlistFromPreferences(false);
					break;
				default:
					pageobj.setWatchlistFromPreferences(true);
					break;
			}
			pageobj.setCreateOption('recreate');
			pageobj.save();
		},
		userNotification: function(pageobj) {
			var params = pageobj.getCallbackParameters();
			var initialContrib = pageobj.getCreator();
			var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "مقاله‌نی یارادان ایلدنه ایطلاع وئر (" + initialContrib + ")");
                        if (mw.config.get('wgNamespaceNumber') === 6){
		             var fapagetalktem='\n{{جا:AFDWarning2|1=';
                        } else {
                             var fapagetalktem='\n{{جا:AFDWarning|1=';
	                };
			var notifytext = fapagetalktem + mw.config.get('wgPageName') + ( params.numbering !== '' ? '|order=&#32;' + params.numbering : '' ) + "}} ~~~~";
			usertalkpage.setAppendText(notifytext);
			usertalkpage.setEditSummary("اطلاع‌رسانی: فهرست کردن در نظرخواهی برای حذف [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
			usertalkpage.setCreateOption('recreate');
			switch (Twinkle.getPref('xfdWatchUser')) {
				case 'yes':
					usertalkpage.setWatchlist(true);
					break;
				case 'no':
					usertalkpage.setWatchlistFromPreferences(false);
					break;
				default:
					usertalkpage.setWatchlistFromPreferences(true);
					break;
			}
			usertalkpage.setFollowRedirect(true);
			usertalkpage.append();
		}
	}
};

/*</pre>
=== بخش ۲۳===
<pre>*/ 

Twinkle.xfd.callback.evaluate = function(e) {
	mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' '));  // for queen/king/whatever and country!

	var type =  e.target.category.value;
	var usertalk = e.target.notify.checked;
	var reason = e.target.xfdreason.value;
	var xfdcat, xfdtarget, puf, noinclude, tfdinline, notifyuserspace;
	if( type === "afd" || type === "cfd" || type === "cfds" ) {
		xfdcat = e.target.xfdcat.value;
	}
	if( type === "cfd" || type === "cfds" ) {
		xfdtarget = e.target.xfdtarget.value;
	}
	if( type === 'ffd' ) {
		puf = e.target.puf.checked;
	}
	if( type === "afd" || type === "mfd" ) {
		noinclude = e.target.noinclude.checked;
	}
	if( type === 'tfd' ) {
		tfdinline = e.target.tfdinline.checked;
	}
	if( type === 'mfd' ) {
		notifyuserspace = e.target.notifyuserspace && e.target.notifyuserspace.checked;
	}

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

	Twinkle.xfd.currentRationale = reason;
	Morebits.status.onError(Twinkle.xfd.printRationale);

	if( !type ) {
		Morebits.status.error( 'Error', 'هئچ بیر عمل تاپیلمادی' );
		return;
	}

	var query, wikipedia_page, wikipedia_api, logpage, params;
	var date = new Date();
	switch( type ) {

	case 'afd': // AFD
		query = {
			'action': 'query',
			'list': 'allpages',
			'apprefix': 'Articles for deletion/' + mw.config.get('wgPageName'),
			'apnamespace': 4,
			'apfilterredir': 'nonredirects',
			'aplimit': Morebits.userIsInGroup( 'sysop' ) ? 5000 : 500
		};
		wikipedia_api = new Morebits.wiki.api( 'Tagging article with deletion tag', query, Twinkle.xfd.callbacks.afd.main );
		wikipedia_api.params = { usertalk:usertalk, reason:reason, noinclude:noinclude, xfdcat:xfdcat };
		wikipedia_api.post();
		break;
	default:
		alert("twinklexfd: unknown XFD discussion venue");
		break;
	}
};

/*</pre>
=== بخش ۲۳===
<pre>*/ 
/**
 * General initialization code
 */

var scriptpathbefore = mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=";
var scriptpathafter = "&action=raw&ctype=text/javascript&happy=yes";

// retrieve the user's Twinkle preferences
$.ajax({
	url: scriptpathbefore + "User:" + encodeURIComponent(mw.config.get('wgUserName')) + "/twinkleoptions.js" + scriptpathafter,
	dataType: 'text',
	error: function(){ jsMsg("Could not load twinkleoptions.js"); },
	success: function(optionsText){

		//quick pass if user has no options
		if ( optionsText === "" ) {
			return;
		}

		//twinkle options are basically a JSON object with some comments. Strip those:
		optionsText = optionsText.replace(/(?:^(?:\/\/[^\n]*\n)*\n*|(?:\/\/[^\n]*(?:\n|$))*$)/g, "");

		//first version of options had some boilerplate code to make it eval-able -- strip that too. This part may become obsolete down the line.
		if (optionsText.lastIndexOf("window.Twinkle.prefs = ", 0) === 0) {
			optionsText = optionsText.replace(/(?:^window.Twinkle.prefs = |;\n*$)/g, "");
		}

		try {
			var options = JSON.parse(optionsText);

			// Assuming that our options evolve, we will want to transform older versions:
			//if (options.optionsVersion === undefined) {
			// ...
			// options.optionsVersion = 1;
			//}
			//if (options.optionsVersion === 1) {
			// ...
			// options.optionsVersion = 2;
			//}
			// At the same time, twinkleconfig.js needs to be adapted to write a higher version number into the options.

			if( options ) {
				Twinkle.prefs = options;
			}
		}
		catch (e) {
			jsMsg("Could not parse twinkleoptions.js");
		}
	},
	complete: function(){
		$(document).ready(Twinkle.load);
	}
});

// Developers: you can import custom Twinkle modules here
// for example, mw.loader.load(scriptpathbefore + "User:UncleDouggie/morebits-test.js" + scriptpathafter);

Twinkle.load = function(){
	// Don't activate on special pages other than "Contributions" so that they load faster, especially the watchlist.
	// Also, Twinkle is incompatible with Internet Explorer versions 8 or lower, so don't load there either.
	if ( (mw.config.get('wgNamespaceNumber') === -1 && mw.config.get('wgCanonicalSpecialPageName') !== "Contributions") ||
		($.client.profile().name === 'msie' && $.client.profile().versionNumber < 9) ) {
		return;
	}

	// load the modules in the order that the tabs should appears
	// user/user talk-related
	Twinkle.arv();
	//Twinkle.warn();
	//Twinkle.welcome();
	Twinkle.shared();
	Twinkle.talkback();
	// deletion
	Twinkle.speedy();
	Twinkle.prod();
	Twinkle.xfd();
	Twinkle.image();
	// maintenance
	Twinkle.protect();
	Twinkle.tag();
	// misc. ones last
	Twinkle.diff();
	Twinkle.unlink();
	Twinkle.config.init();
	Twinkle.fluff.init();
	if (Morebits.userIsInGroup('sysop')) {
		//Twinkle.closer();  -- disabled for the moment, as it is disliked among Twinkle users -- TTO 2011-05-30
		Twinkle.delimages();
		Twinkle.deprod();
		Twinkle.batchdelete();
		Twinkle.batchprotect();
		Twinkle.imagetraverse();
		Twinkle.batchundelete();
	}
	// run the initialization callbacks for any custom modules
	$(Twinkle.initCallbacks).each(function(k, v) { v(); });
	Twinkle.addInitCallback = function(func) { func(); };

	// increates text size in Twinkle dialogs bigger, if so configured
	if (Twinkle.getPref("dialogLargeFont")) {
		mw.util.addCSS(".morebits-dialog-content, .morebits-dialog-footerlinks { font-size: 100% !important; } " +
			".morebits-dialog input, .morebits-dialog select, .morebits-dialog-content button { font-size: inherit !important; }");
	}
};

// </nowiki>