ميډياويکي:Gadget-Twinkle.js

د ويکيسيند لخوا

يادښت: د غوره توبونو د خوندي کولو وروسته، خپل د کتنمل (بروزر) ساتل شوې حافظه تازه کړی.

  • فايرفاکس/ سفري: په دې کتنمل کې د Reload د ټکوهلو په وخت د Shift تڼۍ نيولې وساتی، او يا هم Ctrl-F5 يا Ctrl-Rتڼۍ کېښکاږۍ (په Apple Mac کمپيوټر باندې ⌘-R کېښکاږۍ)
  • گووگل کروم: په دې کتنمل کې د Ctrl-Shift-R تڼۍ کېښکاږۍ (د مک لپاره ⌘-Shift-R)
  • انټرنټ اېکسپلورر: په دې کتنمل کې د Refresh د ټکوهلو په وخت کې د 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>

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%';
	}
	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 = userIsInGroup( 'autoconfirmed' ) || 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 && 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 SimpleWindow( 600, 400 );
	Window.setTitle( "برچسب آي‌پي مشترک" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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 ) ) {
				Status.warn( 'info', 'يافت شد {{' + Twinkle.shared.standardList[i].value + '}} در بحث کاربر...لغو درخواست' );
				found = true;
			}
		}

		if( found ) {
			return;
		}

		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
	};

	SimpleWindow.setButtonsEnabled( false );
	Status.init( e.target );

	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "برچسب زده شد، براي بارگيري صفحه بحث چند لحظه صبر بفرمائيد...";

	var wikipedia_page = new Wikipedia.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( Wikipedia.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 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 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 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: [ 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.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 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 {
					Status.info( 'info', 'يافت شد، {{' + params.tags[i] +
						'}} به مقاله افزوده شد...به جز' );
				}
			}

			if( params.group && groupableTags.length >= 3 ) {
				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 {
					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 'ويکي\u200cسازي':
						var wreason = prompt('به‌طور اختياري مي‌توانيد دليل خود را مبني بر اينکه چرا نياز به ويکي‌سازي بيش‌تري است، بيان کنيد.   \n' +
							"اگر نمي‌دانيد، فقط کليک تأييد را کليک کنيد. براي گذاشتن  {{ويکي‌سازي}}  لغو را فشار دهيد.", "");
						if (wreason === null) {
							continue;
						} else if (wreason !== "") {
							currentTag += '|دليل=' + wreason;
						}
						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;
	}

	SimpleWindow.setButtonsEnabled( false );
	Status.init( form );

	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "برچسب زده شد، براي بارگيري صفحه بحث چند لحظه صبر بفرمائيد...";
	if (Twinkle.tag.mode === 'redirect') {
		Wikipedia.actionCompleted.followRedirect = false;
	}

	var wikipedia_page = new Wikipedia.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 SimpleWindow( 600, 350 );
	Window.setTitle( "بازبحث" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "درباره {{بازبحث}}", "الگو:بازبحث" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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 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;
	}

	SimpleWindow.setButtonsEnabled( false );
	Status.init( e.target );

	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "برچسب زده شد، براي بارگيري صفحه بحث چند لحظه صبر بفرمائيد...";

	var talkpage = new Wikipedia.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( QueryString.exists( 'friendlywelcome' ) ) {
		if( QueryString.get( 'friendlywelcome' ) === 'auto' ) {
			Twinkle.welcome.auto();
		} else {
			Twinkle.welcome.semiauto();
		}
	} else {
		Twinkle.welcome.normal();
	}
};

Twinkle.welcome.auto = function() {
	if( 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( 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 + '&' + QueryString.create( { 'friendlywelcome': Twinkle.getFriendlyPref('quickWelcomeMode')==='auto'?'auto':'norm' } ) + '&' + 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 + '&' + QueryString.create( { 'friendlywelcome': Twinkle.getFriendlyPref('quickWelcomeMode')==='auto'?'auto':'norm' } ) + '&' + 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() {
	Status.init( document.getElementById('bodyContent') );

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

	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "خوش‌آمدگويي انجام شد، براي بارگيري صفحه بحث چند لحظه صبر بفرمائيد...";

	var wikipedia_page = new Wikipedia.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 SimpleWindow( 600, 400 );
	Window.setTitle( "Welcome user" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "خوش‌آمدگويي", "وو:خوش" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

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

	form.append( {
			type: 'input',
			name: 'article',
			label: 'پيوند مقاله‌ها (درصورتي که از الگو استفاده کرده‌اند)',
			value:( QueryString.exists( 'vanarticle' ) ? 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' ) {
			Status.info( 'Warning', 'User talk page not empty; aborting automatic welcome' );
			Wikipedia.actionCompleted.event();
			return;
		}
		
		var text = '';
		Status.info( 'info', 'در حال افزودن الگو خوش‌آمدگويي به  ' +
			( Twinkle.getFriendlyPref('topWelcomes') ? 'top' : 'bottom' ) +
			' صفحه? بحث کاربر' );
		if( !Twinkle.getFriendlyPref('topWelcomes') ) {
			text += oldText + '\n';
		}
		
		if( Twinkle.welcome.headingHash[ params.value ] && Twinkle.getFriendlyPref('insertHeadings') ) {
			Status.info( 'info', 'در حال ساخت عنوان جديد براي خوش‌آمدگويي' );
			// strip section header markers from pref, to preserve backwards compatibility
			text += "== " + Twinkle.getFriendlyPref('welcomeHeading').replace(/^\s*=+\s*(.*?)\s*=+$\s*/, "$1") + " ==\n";
		}
		
		Status.info( 'info', ' در حال افزودن {{' + params.value + '}} الگوي خوش‌آمدگويي' );
		text += '{{جا:' + params.value;
		
		if( Twinkle.welcome.artHash[ params.value ] ) {
			if( Twinkle.getFriendlyPref('insertUsername') && params.value.substring(2,0) !== 'W-' ) {
				Status.info( 'Notice', 'در حال افزودن نام کاربري شما به الگو' );
				text += '|' + mw.config.get('wgUserName');
			}
			
			if( params.article ) {
				Status.info( 'info', 'درحال افزودن پيوند مقاله به الگو' );
				text += '|art=' + params.article;
			}
		} else if( Twinkle.welcome.vandalHash[ params.value ] ) {
			if( params.article ) {
				Status.info( 'info', 'درحال افزودن پيوند مقاله به الگو' );
			}
			text += '|' + params.article;
			
			if( Twinkle.getFriendlyPref('insertUsername') ) {
				Status.info( 'info', 'در حال افزودن نام کاربري شما به الگو' );
				text += '|' + mw.config.get('wgUserName');
			}
		} else if( Twinkle.getFriendlyPref('insertUsername') ) {
			Status.info( 'info', 'در حال افزودن نام کاربري شما به الگو' );
			text += '|' + mw.config.get('wgUserName');
		} 
		
		text += '}}';
		
		if( !Twinkle.welcome.signatureHash[ params.value ] && Twinkle.getFriendlyPref('insertSignature') ) {
			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'
	};

	SimpleWindow.setButtonsEnabled( false );
	Status.init( e.target.form );

	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "خوش‌آمدگويي انجام شد، براي بارگيري صفحه بحث چند لحظه صبر بفرمائيد...";

	var wikipedia_page = new Wikipedia.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 = 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 SimpleWindow( 600, 500 );
	Window.setTitle( "گزارش يا شکايت از کاربر" ); //Backronym
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "خرابکاري", "وو:خرابکاري" );
	Window.addFooterLink( "بازرسي کاربر", "وو:دبک" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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 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: QueryString.exists( 'vanarticle' ) ? 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: QueryString.exists( 'vanarticlerevid' ) ? QueryString.get( 'vanarticlerevid' ) : '',
				disabled: !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: QueryString.exists( 'vanarticlegoodrevid' ) ? QueryString.get( 'vanarticlegoodrevid' ) : '',
				disabled: !QueryString.exists( 'vanarticle' ) || 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: 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 QuickForm.element( { 
				type: 'field',
				label: 'سوءاستفاده از نام کاربري را گزارش کن',
				name: 'work_area'
			} );
		work_area.append ( { 
				type:'header', 
				label:'نوع نام کاربري نامناسب',
				tooltip: 'Wikipedia does not allow usernames that are misleading, promotional, offensive or disruptive. Domain names and e-mail addresses are likewise prohibited. These criteria apply to both usernames and signatures. Usernames that are inappropriate in another language, or that represent an inappropriate name with misspellings and substitutions, or do so indirectly or by implication, are still considered inappropriate.'
			} );
		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 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 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

			SimpleWindow.setButtonsEnabled( false );
			Status.init( form );

			Wikipedia.actionCompleted.redirect = "ويکي\u200cپديا:تابلوي اعلانات مديران";
			Wikipedia.actionCompleted.notice = "گزارش داده شد";

			var aivPage = new Wikipedia.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*{{' + ( isIPAddress( uid ) ? 'آي‌پي خرابکار' : 'خرابکار' ) + '|' + (/\=/.test( uid ) ? '1=' : '' ) + uid + '}} &ndash; ' + reason );
				aivPage.append();
			} );
			break;
			
		// Report inappropriate username
		case 'username':
			types = form.getChecked( 'arvtype' );
			if( !types.length ) {
				alert( 'You must specify at least one breached violation' );
				return;
			}
			types = types.map( function( v ) { return v.toLowerCaseFirstChar(); } );

			if ( types.length <= 2 ) {
				types = types.join( ' and ' );
			} else {
				types = [ types.slice( 0, -1 ).join( ', ' ), types.slice( -1 ) ].join( ' and ' );
			}
			var article = 'a';
			if ( /[aeiouwyh]/.test( types[0] ) ) { // non 100% correct, but whatever, inlcuding 'h' for Cockney
				article = 'an';
			}
                        reason = "== [[کاربر:"+ uid +"]] ==\n" ;
			reason += "*{{user-uaa|1=" + uid + "}}\n" ;
			if (comment !== '' ) {
				reason += comment.toUpperCaseFirstChar() + ". ";
			}
			reason += "~~~~";
			reason = reason.replace(/\r?\n/g, "\n");  // indent newlines

			SimpleWindow.setButtonsEnabled( false );
			Status.init( form );

			Wikipedia.actionCompleted.redirect = "ويکي\u200cپديا:تابلوي اعلانات مديران/نام\u200cهاي کاربري نامناسب";
			Wikipedia.actionCompleted.notice = "گزارش داده شد";

			var uaaPage = new Wikipedia.page( 'ويکي\u200cپديا:تابلوي اعلانات مديران/نام\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(); });

			SimpleWindow.setButtonsEnabled( false );
			Status.init( form );
			Twinkle.arv.processSock( sockParameters );
			break;

	}
};

Twinkle.arv.processSock = function( params ) {
	Wikipedia.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 Wikipedia.page( 'User talk:' + params.uid, 'اطلاع‌رساني به کاربر مظنون به زاپاس‌بازي' );
		masterTalkPage.setFollowRedirect( true );
		masterTalkPage.setEditSummary( notifyEditSummary );
		masterTalkPage.setAppendText( notifyText );
		masterTalkPage.append();

		var statusIndicator = new 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 + ' (completed)' );
			}
		};
		
		var socks = params.sockpuppets;

		// notify each puppet account
		for( var i = 0; i < socks.length; ++i ) {
			var sockTalkPage = new Wikipedia.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 "* {{" + ( isIPAddress( v ) ? "checkip" : "checkuser" ) + "|1=" + v + "}}";
			} ).join( "\n" ) + "\n|evidence=" + params.evidence + " \n";
		
	if ( params.checkuser ) {
		text += "|checkuser=yes";
	}
	text += "}}";

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

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

	var spiPage = new Wikipedia.page( reportpage, 'بازيابي صفحه بحث' );
	spiPage.setFollowRedirect( true );
	spiPage.setEditSummary( 'يک گزارش براي  [[ويژه:مشارکت‌ها/' + params.uid + '|' + params.uid + ']] افزوده‌شد.'+ Twinkle.getPref('summaryAd') );
	spiPage.setAppendText( text );
	spiPage.append();
	
	Wikipedia.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( 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 SimpleWindow( 800, 400 );
	Window.setTitle( "حذف صفحه پيوندهاي موجود در اين صفحه" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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(QueryString.exists( 'from' ) )
		{
			gapnamespace = QueryString.get( 'namespace' );
			gapprefix = QueryString.get( 'from' ).toUpperCaseFirstChar();
		}
		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 Wikipedia.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' );
	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) {
	Wikipedia.actionCompleted.notice = 'وضعيت';
	Wikipedia.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;
	}
	SimpleWindow.setButtonsEnabled( false );
	Status.init( event.target );
	if( !pages ) {
		Status.error( 'Error', 'چيزي براي حذف نبود و لغو شد' );
		return;
	}

	function toCall( work ) {
		if( work.length === 0 &&  Twinkle.batchdelete.currentDeleteCounter <= 0 && Twinkle.batchdelete.currentUnlinkCounter <= 0 ) {
			window.clearInterval( Twinkle.batchdelete.currentdeletor );
			Wikipedia.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 Wikipedia.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') );
	Wikipedia.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': userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
			};
			wikipedia_api = new Wikipedia.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': userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
				};
				wikipedia_api = new Wikipedia.api( 'دريافت تغييرمسيرها', query, Twinkle.batchdelete.callbacks.deleteRedirectsMain );
				wikipedia_api.params = self.params;
				wikipedia_api.post();
			}

			var wikipedia_page = new Wikipedia.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 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 + ' (completed)' );
				Wikipedia.removeCheckpoint();
			}
		};


		Wikipedia.addCheckpoint();
		if( snapshot.snapshotLength === 0 ) {
			statusIndicator.info( '100% (completed)' );
			Wikipedia.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 Wikipedia.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 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 + ' (completed)' );
				--Twinkle.batchdelete.currentUnlinkCounter;
				Wikipedia.removeCheckpoint();
			}
		};

		Wikipedia.addCheckpoint();
		if( snapshot.snapshotLength === 0 ) {
			statusIndicator.info( '100% (completed)' );
			--Twinkle.batchdelete.currentUnlinkCounter;
			Wikipedia.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 Wikipedia.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() } );
			Wikipedia.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() } );
			Wikipedia.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( 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 SimpleWindow( 800, 400 );
	Window.setTitle( "حفاظت فله‌اي" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "سياست حفاظت", "وو:حفاظت" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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': QueryString.exists('namespace') ? QueryString.get( 'namespace' ) : document.getElementById('namespace').value,
			'gapprefix': QueryString.exists('from') ? QueryString.get( 'from' ).replace('+', ' ').toUpperCaseFirstChar() : document.getElementById('nsfrom').value.toUpperCaseFirstChar(),
			'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);
	Status.init(statusdiv);
	Window.display();

	var statelem = new Status("دريافت فهرست صفحه‌ها");

	var wikipedia_api = new Wikipedia.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;
	}

	SimpleWindow.setButtonsEnabled(false);
	Status.init( event.target );

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

	var toCall = function twinklebatchprotectToCall( work ) {
		if( work.length === 0 && Twinkle.batchprotect.currentProtectCounter <= 0 ) {
			Status.info( 'work done' );
			window.clearInterval( Twinkle.batchprotect.currentprotector );
			Twinkle.batchprotect.currentprotector = Twinkle.batchprotect.currentProtectCounter = 0;
			Wikipedia.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 Wikipedia.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') );
	Wikipedia.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 Wikipedia.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 {
			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( userIsInGroup( 'sysop' ) ) {
		$(twAddPortletLink("#", "واگرداني حذف", "tw-batch-undel", "واگرداني همه? حذف‌ها", "")).click(Twinkle.batchundelete.callback);
	}
};

Twinkle.batchundelete.callback = function twinklebatchundeleteCallback() {
	var Window = new SimpleWindow( 800, 400 );
	var form = new 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 Wikipedia.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' );
	Status.init( root );
	Window.setContent( root );
	Window.display();
};
Twinkle.batchundelete.currentUndeleteCounter = 0;
Twinkle.batchundelete.currentundeletor = 0;
Twinkle.batchundelete.callback.evaluate = function( event ) {
	Wikipedia.actionCompleted.notice = 'وضعيت';
	Wikipedia.actionCompleted.postfix = 'بازگرداني حذف انجام شد';

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

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

	var work = pages.chunk( Twinkle.getPref('batchUndeleteChunks') );
	Wikipedia.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 ) {
			Status.info( 'work done' );
			window.clearInterval( Twinkle.batchundelete.currentundeletor );
			Wikipedia.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 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 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 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 SimpleWindow( 800, 400 );
		Window.setTitle( "Close AFC" );
		Window.setScriptName( "توينکل" );
		Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

		var form = new 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 SimpleWindow( 800, 400 );
		Window.setTitle( "Close AFD" );
		Window.setScriptName( "توينکل" );
		Window.addFooterLink( "جمع‌بندي نظرخواهي", "وو:حذف" );
		Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

		var form = new 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 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 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 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;
			}

			SimpleWindow.setButtonsEnabled( false );
			Status.init( form );
			var page = Wikipedia.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 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;

			SimpleWindow.setButtonsEnabled( false );
			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 Wikipedia.api( 'دريافت تغييرمسيرها', query, Twinkle.closer.callbacks.afd.deleteRedirectsMain );
					wikipedia_api.params = params;
					wikipedia_api.post();

					// and now, delete!

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

			}

			wp_page = Wikipedia.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 Wikipedia.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 Wikipedia.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 && !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 && !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"));
		}
	}
};

// Wikipedia.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 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 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 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 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 && !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 && !userIsInGroup("sysop"))) {
			return true;  // continue: skip impossibilities
		}
		$(section.preferences).each(function(prefkey, pref) {
			if (!pref.adminOnly || userIsInGroup("sysop")) {
				Twinkle.config.resetPref(pref, section.inFriendlyConfig);
			}
		});
		return true;
	});
	return false;  // stop link from scrolling page
};

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

	Wikipedia.actionCompleted.notice = "ذخيره";

	var userjs = "User:" + mw.config.get("wgUserName") + "/twinkleoptions.js";
	var wikipedia_page = new Wikipedia.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 && !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 || 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)) {
							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>";
	Status.root.appendChild(noticebox);
	var noticeclear = document.createElement("br");
	noticeclear.style.clear = "both";
	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( userIsInGroup( 'sysop' ) ) {
		$(twAddPortletLink("#", "حذف پرونده‌هاي استفاده شده", "tw-deli", "حذف پروندهاي پيوند شده در اين صفحه", "")).click(Twinkle.delimages.callback);
	}
};

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

	var form = new 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 Wikipedia.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' );
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;
	}

	SimpleWindow.setButtonsEnabled( false );
	Status.init( event.target );

	function toCall( work ) {
		if( work.length === 0 && Twinkle.delimages.currentDeleteCounter <= 0 && Twinkle.delimages.currentUnlinkCounter <= 0 ) {
			window.clearInterval( Twinkle.delimages.currentdeletor );
			Wikipedia.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 Wikipedia.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') );
	Wikipedia.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': userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
			};
			var wikipedia_api = new Wikipedia.api( 'دريافت پيوندها', query, Twinkle.delimages.callbacks.unlinkImageInstancesMain );
			wikipedia_api.params = self.params;
			wikipedia_api.post();
		}
		if( self.params.delete_image ) {

			var imagepage = new Wikipedia.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 Wikipedia.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 || ! 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 SimpleWindow( 800, 400 );
		Window.setTitle( "پاکسازي حذف زمان‌دار" );
		Window.setScriptName( "توينکل" );
		Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

		var form = new 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 Wikipedia.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' );
			SimpleWindow.setButtonsEnabled( true );

			Status.init( root );
			Window.setContent( root );
			Window.display();
	},

	callback_commit = function(event) {
		var pages = event.target.getChecked( 'pages' );
		Status.init( event.target );
		function toCall( work ) {
			if( work.length === 0 ) {
				Status.info( 'work done' );
				window.clearInterval( currentDeletor );
				Wikipedia.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 Wikipedia.api( 'چک کردن آيا ' + page + ' وجود دارد', query, callback_check );
					wikipedia_api.params = { page:page, reason: concerns[page] };
					wikipedia_api.post();
				}
			}
		}
		var work = pages.chunk( Twinkle.getPref('proddeleteChunks') );
		Wikipedia.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': userIsInGroup( 'sysop' ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
		};
		var wikipedia_api = new Wikipedia.api( 'دريافت تغييرمسيرها', query, callback_deleteRedirects );
		wikipedia_api.params = self.params;
		wikipedia_api.post();

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

		page = new Wikipedia.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 Wikipedia.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?' + QueryString.create( query ), 'آخرين تغيير', 'tw-lastdiff', 'نمايش آخرين تغيير' );

	// Show additional tabs only on diff pages
	if (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?' + 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
	};
	Status.init( document.getElementById('bodyContent') );
	var wikipedia_api = new Wikipedia.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?' + 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( 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( 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 + '&' + QueryString.create( { 'twinklerevert': 'norm' } ) );
					current.appendChild( tmpNode );
					current.appendChild( document.createTextNode(' ') );
					tmpNode = revVandNode.cloneNode( true );
					tmpNode.firstChild.setAttribute( 'href', href + '&' + 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 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 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');

	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 Wikipedia.api( 'جمع‌آوري اطلاعات براي نسخه‌هاي قبلي', query, Twinkle.fluff.callbacks.main );
	wikipedia_api.params = params;
	wikipedia_api.post();
};

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

	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 Wikipedia.api( 'جمع‌آوري اطلاعات براي نسخه‌هاي قبلي', query, Twinkle.fluff.callbacks.toRevision.main );
	wikipedia_api.params = { rev: oldrev };
	wikipedia_api.post();
};

Twinkle.fluff.userIpLink = function( user ) {
	return (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
			};

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

			var wikipedia_api = new Wikipedia.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 ) {
			Status.error( 'Error', [ 'اکثر اطلاعات بازگرداني از سرور دريافت مي‌شود, ', htmlNode( 'strong', lastrevid ), ', کمتر از يک آي‌دي براي ويرايش نمايش داده مي‌شود اين به معني حذف ويرايش قبلي است, سرور تاخير دارد, يا اطلاعات اشتباه دريافت شده است. در اين لحظه کار متوقف گست.' ] );
			return;
		}
		var index = 1;
		if( self.params.revid !== lastrevid  ) {
			Status.warn( 'Warning', [ 'Latest revision ', htmlNode( 'strong', lastrevid ), ' doesn\'t equal our revision ', htmlNode( 'strong', self.params.revid ) ] );
			if( lastuser === self.params.user ) {
				switch( self.params.type ) {
				case 'vand':
					Status.info( 'info', [ 'آخرين نسخه ويرايش شده توسط ', htmlNode( 'strong', self.params.user ) , '. با توجه به خرابکاري بودن آن را واگرداني مي‌کنيم' ]);
					break;
				case 'agf':
					Status.warn( 'Warning', [ 'آخرين ويرايش انجام شده توسط ', htmlNode( 'strong', self.params.user ) , '. به عنوان وو:فحن در نظر مي‌گيريم و آن را واگرداني نمي‌کنيم تا بعدا درست گردد.' ]);
					return;
				default:
					Status.warn( 'Notice', [ 'آخرين ويرايش انجام شده توسط ', 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) {
				Status.info( 'info', [ 'آخرين ويرايش انجام شده توسط ', htmlNode( 'strong', lastuser ), '، ربات پرچم‌دار است و نسخه? قبلي آن خرابکاري کاربر ديگري است، درنتيجه آن را واگرداني مي‌کنيم' ] );
				index = 2;
			} else {
				Status.error( 'Error', [ 'آخرين ويرايش توسط ', htmlNode( 'strong', lastuser ), ' انجام شده‌است، ممکن است واگرداني شده باشد، واگرداني متوقف شد.'] );
				return;
			}

		}

		if( Twinkle.fluff.whiteList.indexOf( self.params.user ) !== -1  ) {
			switch( self.params.type ) {
			case 'vand':
				Status.info( 'Notice', [ 'واگرداني خرابکاري بر روي ', htmlNode( 'strong', self.params.user ), '. با توجه به اينکه ربات پرچم‌دار است در نظر مي‌گيريم که شما قصد واگرداني خرابکاري کاربر قبلي را داشته‌ايد.' ] );
				index = 2;
				vandal = revs[1].getAttribute( 'user' );
				self.params.user = revs[1].getAttribute( 'user' );
				break;
			case 'agf':
				Status.warn( 'Notice', [ 'واگرداني با فرض حسن نيت بر روي ', htmlNode( 'strong', self.params.user ), '. اين ويرايش يک ربات پرچم‌دار است و درست نيست ويرايش آن را واگرداني کنيد. در نتيجه درخواست واگرداني لغو شد.' ] );
				return;
			case 'norm':
				/* falls through */
			default:
				var cont = confirm( 'واگرداني با خلاصه درخواست شده‌است ولي بيشتر ويرايش‌ها توسط ربات پرچم‌دار انجام شده‌است. (' + self.params.user + ').آيا قصد داريد که واگرداني را به نسخه قبلي انجام دهيد؟' );
				if( cont ) {
					Status.info( 'info', [ 'واگرداني با خلاصه بر روي  ', htmlNode( 'strong', self.params.user ), ' انجام مي‌گيرد براي تائيد.چون ويرايش ربات پرچم‌دار است واگرداني را بر روي نسخه? قبلي انجام مي‌دهيم.' ] );
					index = 2;
					self.params.user = revs[1].getAttribute( 'user' );
				} else {
					Status.warn( 'info', [ 'واگرداني با خلاصه انتخاب شده است', 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( [ 'نسخه? قبلي يافت نشد. شايد ', htmlNode( 'strong', self.params.user ), ' تنها مشارکت‌کننده است، يا کاربر ويرايش‌هاي بيشتري را در  ' + Twinkle.getPref('revertMaxRevisions') + ' پشت سرهم انجام داده‌است.' ] );
			return;
		}

		if( ! count ) {
			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 + 'نسخه? پشت سرهم ويرايش کرده‌است. آيا قصد واگرداني همه آنها را داريد؟') ) {
				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( [ 'نسخه? ', htmlNode( 'strong', self.params.goodid ), ' ويرايش شده در ', htmlNode( 'strong', count ), ' نسخه? قبل به وسيله? ', 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 ) {
			Status.info( 'info', [ 'بازکردن بحث کاربر و بازکردن پنجره? ويرايش ', 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?' + QueryString.create( query ), '_tab' );
				break;
			case 'blank':
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + 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?' + 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
		};

		Wikipedia.actionCompleted.redirect = self.params.pagename;
		Wikipedia.actionCompleted.notice = "ويرايش انجام شد";

		var wikipedia_api = new Wikipedia.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 = ': ' + stringToAdd.toUpperCaseFirstChar();
		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 ( 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 SimpleWindow( 600, 300 );
	Window.setTitle( "File for dated speedy deletion" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "سياست‌نامه حذف سريع", "وو:حذف سريع" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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 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
	};
	SimpleWindow.setButtonsEnabled( false );
	Status.init( event.target );

	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "برچسب زده شد";

	// Tagging image
	var wikipedia_page = new Wikipedia.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') + "}} ~~~~" ) );
		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 Wikipedia.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( 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 SimpleWindow( 1200, 650 );
	Window.setTitle( "Image traverse" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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';
	Wikipedia.actionCompleted.event = function() {}; // just avoid it
	var wikipedia_api = new Wikipedia.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();

	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 = wgScriptPath + '/index.php?' + 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 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 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 Wikipedia.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 Wikipedia.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 Wikipedia.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 );
		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 Wikipedia.api( 'دريافت پيوند پرونده‌ها', query, Twinkle.imagetraverse.callbacks.unlinkImageInstancesMain );
			wikipedia_api.params = params;

			wikipedia_api.post();
		}
		var imagepage = new Wikipedia.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 Wikipedia.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') || Wikipedia.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 SimpleWindow( 800, 410 );
	Window.setTitle( "واگرداني و خنثي‌سازي" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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 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 Wikipedia.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 Wikipedia.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 Wikipedia.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.
	};

	SimpleWindow.setButtonsEnabled( false );
	Status.init( form );

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

	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "برچسب زده شد";

	var wikipedia_page = new Wikipedia.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 ( 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 SimpleWindow( 620, 530 );
	Window.setTitle( userIsInGroup( 'sysop' ) ? "محافظت، درخواست محافظت، برچسب محافظت" : "درخواست محافظت، برچسب محافظت" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "سياست حفاظت از صفحات", "وو:محافظت" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new QuickForm( Twinkle.protect.callback.evaluate );
	var actionfield = form.append( {
			type: 'field',
			label: 'نوع عمل'
		} );
	if( 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' + (userIsInGroup('sysop') ? ' instead of doing the protection by yourself.' : '.'),
					checked: !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
	Wikipedia.actionCompleted.postfix = false;  // avoid Action: completed notice
	if (userIsInGroup('sysop')) {
		var query = {
			action: 'query',
			prop: 'info',
			inprop: 'protection',
			titles: mw.config.get('wgPageName')
		};
		Status.init($('div[name="currentprot"] span').last()[0]);
		var statelem = new Status("وضعيت سطح محافظت");
		var wpapi = new Wikipedia.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 = $pr.attr('type').toUpperCaseFirstChar() + ": " + $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() { Wikipedia.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 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 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 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 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 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) {
			Status.init($('div[name="currentprot"] span').last()[0]);
			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 Wikipedia.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;
			}

			SimpleWindow.setButtonsEnabled( false );
			Status.init( form );

			Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
			Wikipedia.actionCompleted.notice = "محافظت انجام شد";

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

			if (actiontype === 'tag') {
				SimpleWindow.setButtonsEnabled( false );
				Status.init( form );
				Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
				Wikipedia.actionCompleted.followRedirect = false;
				Wikipedia.actionCompleted.notice = "برچسب زده شد";
			}

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

			var protectedPage = new Wikipedia.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
			};

			SimpleWindow.setButtonsEnabled( false );
			Status.init( form );

			rppName = 'ويکي‌واژه:درخواست محافظت صفحه';

			// Updating data for the action completed event
			Wikipedia.actionCompleted.redirect = rppName;
			Wikipedia.actionCompleted.notice = "نظرخواهي ساخته شد، درحال تغييرمسير به صفحه? نظرخواهي";

			var rppPage = new Wikipedia.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 += "'''" + words.toUpperCaseFirstChar() + ( 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 ( 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(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 SimpleWindow( Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight') );
		dialog = Twinkle.speedy.dialog;
		dialog.setTitle( "يک مورد را براي حذف انتخاب نماييد" );
		dialog.setScriptName( "توينکل" );
		dialog.addFooterLink( "سياست حذف سريع", "وو:حذف سريع" );
		dialog.addFooterLink( "راهنماي توينکل", "وو:توينکل" );
	}

	var form = new QuickForm( callbackfunc, 'change' );
	if( firstTime && 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: !userIsInGroup( 'sysop' ) || Twinkle.getPref('deleteSysopDefaultToTag'),
						disabled: 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: 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 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 (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 (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: '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: '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: '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: '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: 'دليل ديگر' + (userIsInGroup('sysop') ? ' (انتخاب معيار ديگر)': ' using {'+'{db}} template'),
			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 Wikipedia.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*$/, "")) {
				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 Wikipedia.page( 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(){
						Wikipedia.actionCompleted.redirect = null;
						Twinkle.speedy.dialog.close();
						Twinkle.unlink.callback("حذف پرونده‌ها به کمک پيوندها  " + mw.config.get('wgPageName'));
					}
				});
				$bigtext = $('<span/>', {
					'text': 'براي پيوندهاي يتيم و حذف پرونده هاي استفاده شده',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
				});
				Status.info($bigtext[0], $link[0]);
			} else if (params.normalized !== 'f8') {
				$link = $('<a/>', {
					'href': '#',
					'text': 'اينجا را براي رفتن به ابزار حذف پيوندها کليک کنيد',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' },
					'click': function(){
						Wikipedia.actionCompleted.redirect = null;
						Twinkle.speedy.dialog.close();
						Twinkle.unlink.callback(" برداشتن پيوندهاي داده شده به اين صفحه " + mw.config.get('wgPageName'));
					}
				});
				$bigtext = $('<span/>', {
					'text': 'براي پيوندهاي يتيم',
					'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
				});
				Status.info($bigtext[0], $link[0]);
			}

			// open talk page of first contributor
			if( params.openusertalk ) {
				thispage = new Wikipedia.page( mw.config.get('wgPageName') );  // a necessary evil, in order to clear incorrect 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 Wikipedia.api( 'دريافت فهرست تغييرمسيرها...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
					new 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 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?' + QueryString.create( query ), '_tab' );
				break;
			case 'blank':
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + 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?' + 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 + ' (completed)' );
					Wikipedia.removeCheckpoint();
				}
			};

			Wikipedia.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 Wikipedia.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( [ 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 Wikipedia.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) {
						Status.warn("Notifying initial contributor: this user created their own user talk page; skipping notification"); 
						return;
					}

					var usertalkpage = new Wikipedia.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 Wikipedia.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 (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
	};
	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
	};

	Status.init( e.target.form );

	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "برچسب زده شد";

	var wikipedia_page = new Wikipedia.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, 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 SimpleWindow( 800, 400 );
	Window.setTitle( "برداشتن پيوندهاي به اين صفحه" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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': userIsInGroup( 'sysop' ) ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
			'iulimit': 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': 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 Wikipedia.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
	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 Status((imageusage ? 'Unlinking instances of file usage' : 'برداشتن پيوندها'), '0%');
		var total = pages.length;  // removing doubling of this number - no apparent reason for it

		Wikipedia.addCheckpoint();

		if( !pages.length ) {
			statusIndicator.info( '100% (completed)' );
			Wikipedia.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 Wikipedia.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);
	}

	SimpleWindow.setButtonsEnabled( false );
	Status.init( event.target );
	Wikipedia.addCheckpoint();
	if (backlinks) {
		processunlink(backlinks, false);
	}
	if (imageusage) {
		processunlink(imageusage, true);
	}
	Wikipedia.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(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(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);
			Wikipedia.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);
			Wikipedia.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 + ' (completed)' );
			Wikipedia.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 SimpleWindow( 600, 440 );
	Window.setTitle( "Warn/notify user" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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 || ( 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( 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:( QueryString.exists( 'vanarticle' ) ? 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 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 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);
		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 Wikipedia.api("بارگيري...", query, Twinkle.warn.callbacks.previewRender, new 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 ) ) ) {
				Status.info( 'info', 'خالي‌سازي صفحه بحص بر اساس ترجيحات و ساخت عنوان تاريخ‌دار' );
				text = "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
			} else if( !headerRe.exec( text ) ) {
				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 ) ) {
				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') && isIPAddress( mw.config.get('wgTitle') ) ) {
			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
	};

	SimpleWindow.setButtonsEnabled( false );
	Status.init( e.target );

	Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
	Wikipedia.actionCompleted.notice = "هشدار داده شد، براي بارگيري صفحه بحث چند لحظه صبر بفرمائيد...";

	var wikipedia_page = new Wikipedia.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') && !Wikipedia.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 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);
		Status.root.appendChild(p);
		// only need to print the rationale once
		Twinkle.xfd.currentRationale = null;
	}
};

Twinkle.xfd.callback = function twinklexfdCallback() {
	var Window = new SimpleWindow( 600, 350 );
	Window.setTitle( "نظرخواهي براي حذف (نبح)" );
	Window.setScriptName( "توينکل" );
	Window.addFooterLink( "راهنماي توينکل", "وو:توينکل" );

	var form = new 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 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:'?', 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' } );
		afd_category.append( { type:'option', label:'غيرقابل طبقه‌بندي', value:'I' } );
		afd_category.append( { type:'option', label:'مواردي که طبقه‌بندي نشده‌اند', value:'U' } );

		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 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;

			Status.info( "صفحه? بحث بعدي", "[[" + apiobj.params.discussionpage + "]]" );

			// Updating data for the action completed event
			Wikipedia.actionCompleted.redirect = apiobj.params.discussionpage;
			Wikipedia.actionCompleted.notice = "نظرخواهي انجام شد، درحال تغييرمسير به صفحه نظرخواهي";

			// Tagging article
			var wikipedia_page = new Wikipedia.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 Wikipedia.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 Wikipedia.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 Wikipedia.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 Wikipedia.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;
	}

	SimpleWindow.setButtonsEnabled( false );
	Status.init( e.target );

	Twinkle.xfd.currentRationale = reason;
	Status.onError(Twinkle.xfd.printRationale);

	if( !type ) {
		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': userIsInGroup( 'sysop' ) ? 5000 : 500
		};
		wikipedia_api = new Wikipedia.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 (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>