میڈیاویکی:Gadget-twinkleblock.js

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

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


(function($){

var api = new mw.Api(), relevantUserName;

/*
 ****************************************
 *** twinkleblock.js: Block module
 ****************************************
 * Mode of invocation:     Tab ("پابندی لگائیں")
 * Active on:              any page with relevant user name (userspace, contribs, etc.)
 * Config directives in:   [soon to be TwinkleConfig]
 */

Twinkle.block = function twinkleblock() {
	// should show on Contributions pages, anywhere there's a relevant user
	if ( Morebits.userIsInGroup('sysop') && mw.config.get('wgRelevantUserName') ) {
		Twinkle.addPortletLink(Twinkle.block.callback, 'پابندی لگائیں', 'tw-block', 'متعلقہ صارف پر پابندی لگائیں' );
	}
};

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

	var Window = new Morebits.simpleWindow( 650, 530 );
	// need to be verbose about who we're blocking
	Window.setTitle( 'صارف ' + mw.config.get('wgRelevantUserName') + ' پر پابندی لگائیں یا اس کا سانچہ چسپاں کریں' );
	Window.setScriptName( 'پلک' );
	Window.addFooterLink( 'پابندی کے سانچے', 'سانچہ:صا-پابندی/دستاویز/پابندی_کے_سانچے' );
	Window.addFooterLink( 'پابندی لگانے کی حکمت عملی', 'وکی کتب:پابندی' );
	Window.addFooterLink( 'رہنمائے پلک', ':en:WP:TW/DOC#block' );

	Twinkle.block.currentBlockInfo = undefined;
	Twinkle.block.field_block_options = {};
	Twinkle.block.field_template_options = {};

	var form = new Morebits.quickForm( Twinkle.block.callback.evaluate );
	var actionfield = form.append( {
			type: 'field',
			label: 'کارروائی کا انتخاب'
		} );
	actionfield.append({
			type: 'checkbox',
			name: 'actiontype',
			event: Twinkle.block.callback.change_action,
			list: [
				{
					label: 'صارف پر پابندی لگائیں',
					value: 'block',
					tooltip: 'موجود اختیارات کی مدد سے متعلقہ صارف پر پابندی لگائیں۔',
					checked: true
				},
				{
					label: 'صارف کے تبادلۂ خیال صفحہ پر پابندی کا سانچہ لگائیں',
					value: 'template',
					tooltip: 'اگر پابندی لگانے والا منتظم ممنوع صارف کے تبادلۂ خیال صفحہ پر پابندی کا سانچہ لگانا بھول گیا ہو یا آپ ہی نے ابھی اس صارف پر پابندی عائد کی ہو اور اس کے تبادلۂ خیال صفحہ پر سانچہ نہ لگایا ہو تو مناسب سانچہ چسپاں کرنے کے لیے اس اختیار کو استعمال کر سکتے ہیں۔',
					checked: true
				}
			]
		});

	form.append({ type: 'field', label: 'متعینہ وجوہات', name: 'field_preset' });
	form.append({ type: 'field', label: 'سانچہ جاتی اختیارات', name: 'field_template_options' });
	form.append({ type: 'field', label: 'پابندی کے اختیارات', name: 'field_block_options' });

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

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

	Twinkle.block.fetchUserInfo(function() {
		// clean up preset data (defaults, etc.), done exactly once, must be before Twinkle.block.callback.change_action is called
		Twinkle.block.transformBlockPresets();

		// init the controls after user and block info have been fetched
		var evt = document.createEvent( 'Event' );
		evt.initEvent( 'change', true, true );
		result.actiontype[0].dispatchEvent( evt );
	});
};

Twinkle.block.fetchUserInfo = function twinkleblockFetchUserInfo(fn) {

	api.get({
		format: 'json',
		action: 'query',
		list: 'blocks|users|logevents',
		letype: 'block',
		lelimit: 1,
		bkusers: mw.config.get('wgRelevantUserName'),
		ususers: mw.config.get('wgRelevantUserName'),
		letitle: 'User:' + mw.config.get('wgRelevantUserName')
	})
	.then(function(data){
		var blockinfo = data.query.blocks[0],
			userinfo = data.query.users[0];

		Twinkle.block.isRegistered = !!userinfo.userid;
		relevantUserName = Twinkle.block.isRegistered ? 'User:' + mw.config.get('wgRelevantUserName') : mw.config.get('wgRelevantUserName');

		if (blockinfo) {
			// handle frustrating system of inverted boolean values
			blockinfo.disabletalk = blockinfo.allowusertalk === undefined;
			blockinfo.hardblock = blockinfo.anononly === undefined;
			Twinkle.block.currentBlockInfo = blockinfo;
		}

		Twinkle.block.hasBlockLog = !!data.query.logevents.length;

		if (typeof fn === 'function') return fn();
	}, function(msg) {
		Morebits.status.init($('div[name="currentblock"] span').last()[0]);
		Morebits.status.warn('صارف کی معلومات حاصل نہیں کی جا سکیں', msg);
	});
};

Twinkle.block.callback.saveFieldset = function twinkleblockCallbacksaveFieldset(fieldset) {
	Twinkle.block[$(fieldset).prop('name')] = {};
	$(fieldset).serializeArray().forEach(function(el) {
		Twinkle.block[$(fieldset).prop('name')][el.name] = el.value;
	});
};

Twinkle.block.callback.change_action = function twinkleblockCallbackChangeAction(e) {
	var field_preset, field_template_options, field_block_options, $form = $(e.target.form);

	Twinkle.block.callback.saveFieldset($('[name=field_block_options]'));
	Twinkle.block.callback.saveFieldset($('[name=field_template_options]'));

	if ($form.find('[name=actiontype][value=block]').is(':checked')) {
		field_preset = new Morebits.quickForm.element({ type: 'field', label: 'متعیہ وجوہات', name: 'field_preset' });
		field_preset.append({
				type: 'select',
				name: 'preset',
				label: 'وجہ منتخب کریں:',
				event: Twinkle.block.callback.change_preset,
				list: Twinkle.block.callback.filtered_block_groups()
			});

		field_block_options = new Morebits.quickForm.element({ type: 'field', label: 'پابندی کے اختیارات', name: 'field_block_options' });
		field_block_options.append({ type: 'div', name: 'hasblocklog', label: ' ' });
		field_block_options.append({ type: 'div', name: 'currentblock', label: ' ' });
		field_block_options.append({
				type: 'select',
				name: 'expiry_preset',
				label: 'مدت:',
				event: Twinkle.block.callback.change_expiry,
				list: [
					{ label: 'شخصی', value: 'custom', selected: true },
					{ label: 'دائمی', value: 'infinity' },
					{ label: '3 گھنٹے', value: '3 hours' },
					{ label: '12 گھنٹے', value: '12 hours' },
					{ label: '24 گھنٹے', value: '24 hours' },
					{ label: '31 گھنٹے', value: '31 hours' },
					{ label: '36 گھنٹے', value: '36 hours' },
					{ label: '48 گھنٹے', value: '48 hours' },
					{ label: '60 گھنٹے', value: '60 hours' },
					{ label: '72 گھنٹے', value: '72 hours' },
					{ label: '1 ہفتہ', value: '1 week' },
					{ label: '2 ہفتے', value: '2 weeks' },
					{ label: '1 مہینہ', value: '1 month' },
					{ label: '3 مہینے', value: '3 months' },
					{ label: '6 مہینے', value: '6 months' },
					{ label: '1 سال', value: '1 year' },
					{ label: '2 برس', value: '2 years' },
					{ label: '3 برس', value: '3 years' }
				]
			});
			field_block_options.append({
					type: 'input',
					name: 'expiry',
					label: 'شخصی مدت اختتام',
					tooltip: 'آپ اضافی وقتوں کو بھی استعمال کر سکتے ہیں، مثلاً «1 منٹ» یا «19 دن»، نیز مطلق وقت «yyyymmddhhmm» بھی درج کر سکتے ہیں (مثلاً: «200602011405» 1 فروری 2006ء 14:05 یوٹی سی ہوا)۔',
					value: Twinkle.block.field_block_options.expiry || Twinkle.block.field_template_options.template_expiry
				});
		var blockoptions = [
				{
					checked: Twinkle.block.field_block_options.nocreate,
					label: 'کھاتہ بنانے پر پابندی',
					name: 'nocreate',
					value: '1'
				},
				{
					checked: Twinkle.block.field_block_options.noemail,
					label: 'برقی خط بھیجنے پر پابندی',
					name: 'noemail',
					value: '1'
				},
				{
					checked: Twinkle.block.field_block_options.disabletalk,
					label: 'پابندی کے دوران میں اس صارف کو اس کے اپنے تبادلۂ خیال صفحہ پر ترمیم کرنے سے باز رکھیں',
					name: 'disabletalk',
					value: '1'
				}
			];

		if (Twinkle.block.isRegistered) {
			blockoptions.push({
					checked: Twinkle.block.field_block_options.autoblock,
					label: 'مستعمل آئی پی پتوں پر خودکار پابندی لگائیں (سخت پابندی)',
					name: 'autoblock',
					value: '1'
				});
		} else {
			blockoptions.push({
					checked: Twinkle.block.field_block_options.hardblock,
					label: 'داخل شدہ صارفین کو اس آئی پی پتے کے ذریعہ ترمیم کاری سے باز رکھیں (سخت پابندی)',
					name: 'hardblock',
					value: '1'
				});
		}

		blockoptions.push({
				checked: Twinkle.block.field_block_options.watchuser,
				label: 'صارف کے صارف اور تبادلۂ خیال صفحات کو زیر نظر کریں',
				name: 'watchuser',
				value: '1'
			});

		field_block_options.append({
				type: 'checkbox',
				name: 'blockoptions',
				list: blockoptions
			});
		field_block_options.append({
				type: 'textarea',
				label: 'وجہ (نوشتہ پابندی میں اندراج کے لیے):',
				name: 'reason',
				value: Twinkle.block.field_block_options.reason
			});

		if (Twinkle.block.currentBlockInfo) {
			field_block_options.append( { type: 'hidden', name: 'reblock', value: '1' } );
		}
	}

	if ($form.find('[name=actiontype][value=template]').is(':checked')) {
		field_template_options = new Morebits.quickForm.element({ type: 'field', label: 'سانچہ جاتی اختیارات', name: 'field_template_options' });
		field_template_options.append( {
				type: 'select',
				name: 'template',
				label: 'تبادلۂ خیال کا سانچہ منتخب کریں:',
				event: Twinkle.block.callback.change_template,
				list: Twinkle.block.callback.filtered_block_groups(true),
				value: Twinkle.block.field_template_options.template
			} );
		field_template_options.append( {
				type: 'input',
				name: 'article',
				display: 'none',
				label: 'مربوط مضمون',
				value: '',
				tooltip: 'اطلاع میں کسی مضمون کا ربط بھی درج کیا جا سکتا، خصوصاً اس وقت جب مضمون ہی خلل کا باعث ہو۔ ربط درج نہ کرنا ہو تو اسے خالی چھوڑ دیں۔'
			} );
		if (!$form.find('[name=actiontype][value=block]').is(':checked')) {
			field_template_options.append( {
				type: 'input',
				name: 'template_expiry',
				display: 'none',
				label: 'پابندی کی مدت: ',
				value: '',
				tooltip: 'صارف کی پابندی ختم ہونے کی مدت، مثلاً 24 گھنٹے، 2 ہفتے، دائمی وغیرہ۔۔۔'
			} );
		}
		field_template_options.append( {
			type: 'input',
			name: 'block_reason',
			label: '"آپ پر پابندی عائد کرنے کی وجہ۔۔۔" ',
			display: 'none',
			tooltip: 'وجہ درج کرنا اختیاری ہے، آپ کی درج کردہ وجہ عام ابتدائی وجہ کی جگہ پر رکھی جائے گی۔ یہ اختیار محض عام پاپندی کے سانچوں کے لیے دستیاب ہے۔',
			value: Twinkle.block.field_template_options.block_reason
		} );

		if ($form.find('[name=actiontype][value=block]').is(':checked')) {
			field_template_options.append( {
				type: 'checkbox',
				name: 'blank_duration',
				list: [
					{
						label: 'سانچہ میں مدت اختتام شامل نہ کریں',
						checked: Twinkle.block.field_template_options.blank_duration,
						tooltip: 'مدت شامل کرنے کی بجائے سانچہ میں یہ عبارت شامل کریں «آپ پر عارضی پابندی عائد کی گئی ہے، اس کی وجہ۔۔۔»'
					}
				]
			} );
		} else {
			field_template_options.append( {
				type: 'checkbox',
				name: 'notalk',
				list: [
					{
						label: 'تبادلۂ خیال تک رسائی ختم کریں',
						checked: Twinkle.block.field_template_options.notalk,
						tooltip: 'اس اختیار کو فعال کرنے پر سانچہ میں یہ اطلاع شامل ہو جائے گی کہ صارف کی تبادلۂ صفحہ تک رسائی کو ختم کر دیا گیا ہے۔'
					}
				]
			} );
		}

		var $previewlink = $( '<a id="twinkleblock-preivew-link">نمائش</a>' );
		$previewlink.off('click').on('click', function(){
			Twinkle.block.callback.preview($form[0]);
		});
		$previewlink.css({cursor: 'pointer'});
		field_template_options.append( { type: 'div', id: 'blockpreview', label: [ $previewlink[0] ] } );
		field_template_options.append( { type: 'div', id: 'twinkleblock-previewbox', style: 'display: none' } );
	}

	var oldfield;
	if (field_preset) {
		oldfield = $form.find('fieldset[name="field_preset"]')[0];
		oldfield.parentNode.replaceChild(field_preset.render(), oldfield);
	} else {
		$form.find('fieldset[name="field_preset"]').hide();
	}
	if (field_block_options) {
		oldfield = $form.find('fieldset[name="field_block_options"]')[0];
		oldfield.parentNode.replaceChild(field_block_options.render(), oldfield);
	} else {
		$form.find('fieldset[name="field_block_options"]').hide();
	}
	if (field_template_options) {
		oldfield = $form.find('fieldset[name="field_template_options"]')[0];
		oldfield.parentNode.replaceChild(field_template_options.render(), oldfield);
		e.target.form.root.previewer = new Morebits.wiki.preview($(e.target.form.root).find('#twinkleblock-previewbox').last()[0]);
	} else {
		$form.find('fieldset[name="field_template_options"]').hide();
	}

	if (Twinkle.block.hasBlockLog) {
		var $blockloglink = $( '<a target="_blank" href="' + mw.util.getUrl('Special:Log', {action: 'view', page: mw.config.get('wgRelevantUserName'), type: 'block'}) + '">نوشتہ پابندی</a>)' );

		Morebits.status.init($('div[name="hasblocklog"] span').last()[0]);
		Morebits.status.warn('اس صارف پر ماضی میں پابندی لگائی گئی تھی', $blockloglink[0]);
	}

	if (Twinkle.block.currentBlockInfo) {
		Morebits.status.init($('div[name="currentblock"] span').last()[0]);
		Morebits.status.warn(relevantUserName + ' پر پہلے ہی پابندی لگا دی گئی ہے', 'فراہم کردہ اختیارات کے ساتھ دوبارہ پابندی لگائیں');
		Twinkle.block.callback.update_form(e, Twinkle.block.currentBlockInfo);
	} else if ($form.find('[name=actiontype][value=template]').is(':checked')) {
		// make sure all the fields are correct based on defaults
		if ($form.find('[name=actiontype][value=block]').is(':checked')) {
			Twinkle.block.callback.change_preset(e);
		} else {
			Twinkle.block.callback.change_template(e);
		}
	}
};

/*
 * Keep alphabetized by key name, Twinkle.block.blockGroups establishes
 *    the order they will appear in the interface
 *
 * Block preset format, all keys accept only 'true' (omit for false) except where noted:
 * <title of block template> : {
 *   autoblock: <autoblock any IP addresses used (for registered users only)>
 *   disabletalk: <disable user from editing their own talk page while blocked>
 *   expiry: <string - expiry timestamp, can include relative times like "5 months", "2 weeks" etc, use "infinity" for indefinite>
 *   forAnonOnly: <show block option in the interface only if the relevant user is an IP>
 *   forRegisteredOnly: <show block option in the interface only if the relevant user is registered>
 *   label: <string - label for the option of the dropdown in the interface (keep brief)>
 *   noemail: prevent the user from sending email through Special:Emailuser
 *   pageParam: <set if the associated block template accepts a page parameter>
 *   prependReason: <string - prepends the value of 'reason' to the end of the existing reason, namely for when revoking talk page access>
 *   nocreate: <block account creation from the user's IP (for anonymous users only)>
 *   nonstandard: <template does not conform to stewardship of WikiProject User Warnings and may not accept standard parameters>
 *   reason: <string - block rationale, as would appear in the block log,
 *            and the edit summary for when adding block template, unless 'summary' is set>
 *   reasonParam: <set if the associated block template accepts a reason parameter>
 *   sig: <string - set to ~~~~ if block template does not accept "true" as the value, or set null to omit sig param altogether>
 *   summary: <string - edit summary for when adding block template to user's talk page, if not set, 'reason' is used>
 *   suppressArticleInSummary: <set to suppress showing the article name in the edit summary, as with attack pages>
 *   templateName: <string - name of template to use (instead of key name), entry will be omitted from the Templates list.
 *                  (e.g. use another template but with different block options)>
 *   useInitialOptions: <when preset is chosen, only change given block options, leave others as they were>
 *
 * WARNING: 'anononly' and 'allowusertalk' are enabled by default.
 *   To disable, set 'hardblock' and 'disabletalk', respectively
 */
Twinkle.block.blockPresetsInfo = {
	'anonblock' : {
		expiry: '31 گھنٹے',
		forAnonOnly: true,
		nocreate: true,
		nonstandard: true,
		reason: '{{anonblock}}',
		sig: '~~~~'
	},
	'anonblock - school' : {
		expiry: '36 گھنٹے',
		forAnonOnly: true,
		nocreate: true,
		nonstandard: true,
		reason: '{{anonblock}} <!-- Likely a school based on behavioral evidence -->',
		templateName: 'anonblock',
		sig: '~~~~'
	},
	'blocked proxy' : {
		expiry: '1 سال',
		forAnonOnly: true,
		nocreate: true,
		nonstandard: true,
		reason: '{{blocked proxy}}',
		sig: null
	},
	'CheckUser block' : {
		nonstandard: true,
		reason: '{{CheckUser block}}',
		sig: '~~~~'
	},
	'checkuserblock-account' : {
		nonstandard: true,
		reason: '{{checkuserblock-account}}',
		sig: '~~~~'
	},
	'checkuserblock-wide' : {
		nonstandard: true,
		reason: '{{checkuserblock-wide}}',
		sig: '~~~~'
	},
	'colocationwebhost' : {
		expiry: '1 سال',
		forAnonOnly: true,
		nonstandard: true,
		reason: '{{colocationwebhost}}',
		sig: null
	},
	'oversightblock' : {
		nonstandard: true,
		reason: '{{OversightBlock}}',
		sig: '~~~~'
	},
	'school block' : {
		forAnonOnly: true,
		nocreate: true,
		nonstandard: true,
		reason: '{{school block}}',
		sig: '~~~~'
	},
	// Placeholder for when we add support for rangeblocks
	// 'rangeblock' : {
	//   reason: '{{rangeblock}}',
	//   nocreate: true,
	//   nonstandard: true,
	//   forAnonOnly: true,
	//   sig: '~~~~'
	// },
	'tor' : {
		expiry: '1 سال',
		forAnonOnly: true,
		nonstandard: true,
		reason: '{{Tor}}',
		sig: null
	},
	'webhostblock' : {
		expiry: '1 سال',
		forAnonOnly: true,
		nonstandard: true,
		reason: '{{webhostblock}}',
		sig: null
	},
	// uw-prefixed
	'uw-3block' : {
		autoblock: true,
		expiry: '24 گھنٹے',
		nocreate: true,
		pageParam: true,
		reason: '[[:en:WP:Three-revert rule|سہ رد ترمیم قانون]] کی خلاف ورزی',
		summary: '[[:en:WP:3RR|سہ رد ترمیم قانون]] کی خلاف ورزی پر آپ پر پابندی لگائی دی گئی'
	},
	'uw-ablock' : {
		autoblock: true,
		expiry: '31 گھنٹے',
		forAnonOnly: true,
		nocreate: true,
		pageParam: true,
		reasonParam: true,
		summary: 'آپ کے آئی پی پتے پر پابندی عائد کر دی گئی',
		suppressArticleInSummary: true
	},
	'uw-adblock' : {
		autoblock: true,
		nocreate: true,
		pageParam: true,
		reason: 'ویکیپیڈیا کو [[وپ:فاضل|فاضل کاری]] یا [[وپ:نہیں|اشتہار بازی]] کے مقاصد کے لیے استعمال کرنا',
		summary: '[[وپ:نہیں|اشتہار بازی یا تشہیر]] کی بنا پر آپ پر پابندی لگا دی گئی'
	},
	'uw-aeblock' : {
		autoblock: true,
		nocreate: true,
		pageParam: true,
		reason: '[[وپ:مصالحت|مصالحت نفاذ]]',
		reasonParam: true,
		summary: 'آپ نے اپنی ترامیم کے ذریعہ مصالحت کے فیصلوں کی خلاف ورزی کی ہے اس لیے آپ پر پابندی  لگا دی گئی'
	},
	'uw-bioblock' : {
		autoblock: true,
		nocreate: true,
		pageParam: true,
		reason: '[[ویکیپیڈیا:بقید حیات شخصیات کی سوانح عمری|بقید حیات شخصیات کی سوانح عمریوں]] کی حکمت عملی کی خلاف ورزیاں',
		summary: 'ویکیپیڈیا کی [[وپ:بحش|بقید حیات شخصیات کی سوانح نگاری کے اصول و ضوابط]] کی خلاف ورزی کی بنا پر آپ پر پابندی لگا دی گئی'
	},
	'uw-block' : {
		autoblock: true,
		expiry: '24 گھنٹے',
		forRegisteredOnly: true,
		nocreate: true,
		pageParam: true,
		reasonParam: true,
		summary: 'آپ کی ترمیم کاری پر پابندی لگا دی گئی ہے',
		suppressArticleInSummary: true
	},
	'uw-blockindef' : {
		autoblock: true,
		expiry: 'infinity',
		forRegisteredOnly: true,
		nocreate: true,
		pageParam: true,
		reasonParam: true,
		summary: 'آپ کی ترمیم کاری پر دائمی پابندی لگا دی گئی ہے',
		suppressArticleInSummary: true
	},
	'uw-blocknotalk' : {
		disabletalk: true,
		pageParam: true,
		reasonParam: true,
		summary: 'آپ کی ترمیم کاری پر پابندی لگا دی گئی ہے نیز آپ کے اپنے تبادلۂ خیال صفحہ تک رسائی بھی ختم کر دی گئی ہے',
		suppressArticleInSummary: true
	},
	'uw-botblock': {
		forRegisteredOnly: true,
		pageParam: true,
		reason: '[[وپ:دار|بغیر منظوری]] کے [[وپ:روبہ جات|روبہ رانی]]',
		summary: '[[وپ:دار|بغیر منظوری]] کے [[وپ:روبہ|روبہ]] چلانے کی بنا پر آپ پر پابندی لگا دی گئی'
	},
	'uw-botublock': {
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		reason: '{{uw-botublock}} <!-- صارف نام سے کوئی روبہ معلوم ہوتا ہے، نرم پابندی -->',
		summary: 'آپ پر دائمی پابندی لگا دی گئی ہے، کیونکہ آپ کے [[وپ:ص|صارف نام]] سے ظاہر ہوتا ہے کہ یہ ایک ایسا [[وپ:روبہ|روبہ]] کھاتہ ہے جسے ابھی منظوری نہیں ملی۔'
	},
	'uw-causeblock' : {
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		reason: '{{uw-causeblock}} <!-- صارف نام کسی غیر منافع بخش ادارے کا نمائندہ معلوم ہوتا ہے، نرم پابندی -->',
		summary: 'آپ کی ترمیم کاری پر دائمی پابندی لگا دی گئی ہے، کیونکہ آپ کے [[وپ:ص|صارف نام]] سے ایسا تاثر ملتا ہے کہ یہ کسی حلقہ، گروہ، ادارہ، تنظیم یا ویب سائٹ کا نمائندہ ہے۔'
	},
	'uw-compblock': {
		autoblock: true,
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		nocreate: true,
		reason: 'مشکوک کھاتہ',
		summary: 'ایسا معلوم ہوتا ہے کہ آپ کا کھاتہ اب [[وپ:تحفظ|مشکوک ہاتھوں میں ہے]]، لہذا اس کھاتہ کی ترمیم کاری پر دائمی پابندی لگا دی گئی ہے۔]]'
	},
	'uw-copyrightblock' : {
		autoblock: true,
		expiry: '24 گھنٹے',
		nocreate: true,
		pageParam: true,
		reason: '[[وپ:کاپی رائٹ کی خلاف ورزیاں|کاپی رائٹ کی خلاف ورزیاں]]',
		summary: '[[وپ:کاپی رائٹ کی خلاف ورزیاں|کاپی رائٹ کی مستقل خلاف ورزی]] کی بنا پر آپ کی ترمیم کاری پر پابندی لگا دی گئی ہے۔'
	},
	'uw-dblock': {
		autoblock: true,
		nocreate: true,
		reason: 'مواد کی مستقل صفائی',
		pageParam: true,
		summary: 'مسلسل [[وپ:تخریب|تخریب کاری]] کی وجہ سے آپ پر پابندی عائد کر دی گئی ہے۔'
	},
	'uw-disruptblock' : {
		autoblock: true,
		nocreate: true,
		reason: '[[وپ:خلل انداز ترمیم کاری|خلل انداز ترمیم کاری]]',
		summary: '[[وپ:خلل |خلل انداز ترمیم کاری]] کی وجہ سے آپ پابندی لگا دی گئی۔'
	},
	'uw-efblock' : {
		autoblock: true,
		nocreate: true,
		reason: '[[وپ:مقطار غلط کاری|مقطار غلط کاری]] سے دانستہ چھیڑ چھاڑ',
		summary: '[[وپ:مقطار|مقطار غلط کاری]] کو برانگیختہ کرنے والی مسلسل ترمیم کاری کی وجہ سے آپ پر پابندی لگا دی گئی ہے'
	},
	'uw-ewblock' : {
		autoblock: true,
		expiry: '24 گھنٹے',
		nocreate: true,
		pageParam: true,
		reason: '[[وپ:ترمیمی جنگ|ترمیمی جنگ]]',
		summary: '[[وپ:جنگ|ترمیمی جنگ]] میں ملوث ہونے کے باعث مزید [[وپ:خلل|خلل انداز ترمیم کاری]] سے باز رکھنے کے لیے آپ پر پابندی لگا دی گئی۔'
	},
	'uw-hblock' : {
		autoblock: true,
		nocreate: true,
		pageParam: true,
		reason: '[[وپ:ذاتی حملے نہیں|ذاتی حملے]] یا [[وپ:ایذا دہی|ایذا دہی]]',
		summary: 'دیگر صارفین کو [[وپ:ایذا دہی|ایذا دینے]] کی کوشش کرنے کی وجہ سے آپ پر پابندی لگا دی گئی ہے۔'
	},
	'uw-ipevadeblock' : {
		forAnonOnly: true,
		nocreate: true,
		reason: '[[:en:WP:Blocking policy#Evasion of blocks|پابندی سے فرار]]',
		summary: 'آپ کے آئی پی پتے پر پابندی عائد کر دی گئی ہے کیونکہ اسے سابقہ پابندی سے فرار حاصل کرنے کے لیے استعمال کیا گیا ہے۔'
	},
	'uw-lblock' : {
		autoblock: true,
		expiry: 'لامحدود',
		nocreate: true,
		reason: '[[وپ:قانونی دھمکیاں نہیں|قانونی دھمکی]]',
		summary: '[[وپ:قانونی|قانونی دھمکیاں دینے یا قانونی اقدام]] کرنے کی وجہ سے آپ پر پابندی لگا دی گئی۔'
	},
	'uw-memorialblock': {
		forRegisteredOnly: true,
		expiry: 'لامحدود',
		reason: '{{uw-memorialblock}} <!-- صارف نام کسی کی یادگار معلوم ہوتا ہے، نرم پابندی -->',
		summary: 'آپ پر دائمی پابندی لگا دی گئی، کیونکہ آپ کے [[وپ:ص|صارف نام]] سے ظاہر ہوتا ہے کہ یہ کسی کی یادگار ہے یا کسی کو خراج تحسین پیش کرنے کے لیے بنایا گیا ہے۔'
	},
	'uw-myblock': {
		autoblock: true,
		nocreate: true,
		pageParam: true,
		reason: 'ویکیپیڈیا کا بطور [[وپ:نہیں|بلاگ، ویب ہوسٹ، سماجی ذرائع ابلاغ یا چوپال]] استعمال',
		summary: 'اپنے صارف صفحات یا مضامین کو [[وپ:نہیں|بلاگ، ویب ہوسٹ، سماجی ذرائع ابلاغ یا چوپال]] کے طرز پر استعمال کرنے کی وجہ سے آپ پر پابندی لگا دی گئی ہے۔'
	},
	'uw-nothereblock' : {
		autoblock: true,
		expiry: 'لامحدود',
		nocreate: true,
		reason: 'واضح طور پر [[وپ:یہاں نہیں|دائرۃ المعارف کے فروغ کے لیے یہاں نہیں ہے]]',
		forRegisteredOnly: true,
		summary: 'آپ پر پابندی لگا دی گئی، کیونکہ آپ کی کارروائیوں سے ایسا محسوس ہوا کہ آپ یہاں [[وپ:یہاں نہیں|دائرۃ المعارف کے فروغ کے لیے نہیں آئے ہیں]]۔'
	},
	'uw-npblock' : {
		autoblock: true,
		nocreate: true,
		pageParam: true,
		reason: '[[وپ:لغویات|لغویات]] یا نامناسب صفحات کی تخلیق',
		summary: '[[وپ:لغو|لغویات]] پھیلانے کے باعث آپ پر پابندی لگا دی گئی ہے۔'
	},
	'uw-pablock' : {
		autoblock: true,
		expiry: '31 گھنٹے',
		nocreate: true,
		reason: '[[وپ:ذاتی حملے نہیں|ذاتی حملہ]] یا [[وپ:ایذا دہی|ایذا دہی]]',
		summary: 'دیگر صارفین پر [[وپ:ذاتی حملے نہیں|ذاتی حملہ]] کے جرم میں آپ پر پابندی عائد کر دی گئی ہے۔'
	},
	'uw-sblock' : {
		autoblock: true,
		nocreate: true,
		reason: 'ویکیپیڈیا کا [[وپ:فاضل کاری|فاضل کاری]] کے لیے استعمال',
		summary: 'ویکیپیڈیا کو [[وپ:فاضل کاری|فاضل کاری]] مقاصد کے تحت استعمال کرنے کی بنا پر آپ پر پابندی عائد کر دی گئی ہے۔'
	},
	'uw-soablock' : {
		autoblock: true,
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		nocreate: true,
		pageParam: true,
		reason: 'محض [[وپ:فاضل کاری|فاضل کاری]] / [[وپ:ویکیپیڈیا کیا نہیں ہے|اشتہار بازی]] کا کھاتہ',
		summary: 'آپ کے کھاتے پر لامحدود مدت کے لیے پابندی لگا دی گئی ہے کیونکہ اسے محض [[وپ:فاضل کاری|فاضل کاری یا اشتہار بازی]] کے لیے استعمال کیا جا رہا تھا۔'
	},
	'uw-sockblock' : {
		autoblock: true,
		forRegisteredOnly: true,
		nocreate: true,
		reason: '[[وپ:جرابی کٹھ پتلی|متعدد کھاتوں]] کا غلط استعمال',
		summary: '[[وپ:جرابی کٹھ پتلی|متعدد کھاتوں کے غلط استعمال]] کی وجہ سے آپ پر پابندی لگا دی گئی ہے۔'
	},
	'uw-softerblock' : {
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		reason: '{{uw-softerblock}} <!-- اشتہاری صارف نام، نرم پابندی -->',
		summary: 'آپ پر لامحدود مدت کے لیے پابندی لگا دی گئی ہے کیونکہ آپ کا [[وپ:ص|صارف نام]] کسی گروہ، ادارہ یا تنظیم کا تاثر دے رہا تھا۔'
	},
	'uw-spamublock' : {
		autoblock: true,
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		nocreate: true,
		reason: '{{uw-spamublock}} <!-- اشتہاری صارف نام، اشتہار بازی پر مشتمل ترامیم -->',
		summary: 'آپ کے کھاتے پر لامحدود مدت کے لیے پابندی لگا دی گئی ہے کیونکہ اسے محض [[وپ:فاضل کاری|فاضل کاری یا اشتہار بازی]] کے لیے استعمال کیا جا رہا تھا، نیز آپ کا صارف نام بھی [[وپ:ص|ویکیپیڈیا کی صارف نام حکمت عملی]] کے مخالف ہے۔'
	},
	'uw-spoablock' : {
		autoblock: true,
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		nocreate: true,
		reason: '[[وپ:جرابی کٹھ پتلی|جرابی کٹھ پتلی]]',
		summary: 'اس کھاتے پر پابندی لگا دی گئی ہے کیونکہ اس [[وپ:جرابی کٹھ پتلی|جرابی کٹھ پتلی]] کو ویکیپیڈیا کی حکمت عملی کی خلاف ورزی کے لیے بنایا گیا تھا۔'
	},
	'uw-talkrevoked' : {
		disabletalk: true,
		reason: 'تبادلہ خیال صفحہ کی رسائی مسدود: پابندی کے دوران میں تبادلۂ خیال صفحہ کا نامناسب استعمال',
		prependReason: true,
		summary: 'آپ کے اپنے تبادلۂ خیال صفحہ پر آپ کی رسائی کو مسدود کر دیا گیا ہے۔',
		useInitialOptions: true
	},
	'uw-ublock' : {
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		reason: '{{uw-ublock}} <!-- صارف نام کی خلاف ورزی، نرم پابندی -->',
		reasonParam: true,
		summary: 'آپ کے کھاتے پر لامحدود وقت کے لیے پابندی لگا دی گئی ہے، کیونکہ آپ کا صارف نام [[وپ:ص|ویکیپیڈیا کی صارف نام حکمت عملی]] کی خلاف ورزی کر رہا تھا۔'
	},
	'uw-ublock-double': {
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		reason: '{{uw-ublock-double}} <!-- صارف نام دوسرے صارف سے بہت زیادہ مشابہت رکھتا ہے، نرم پابندی -->',
		summary: 'آپ کے کھاتے پر لامحدود وقت کے لیے پابندی لگا دی گئی ہے، کیونکہ آپ کا [[وپ:ص|صارف نام]] ویکیپیڈیا کے دوسرے صارف کے نام سے بہت مشابہ ہے۔'
	},
	'uw-ucblock' : {
		autoblock: true,
		expiry: '31 گھنٹے',
		nocreate: true,
		pageParam: true,
		reason: 'بلا حوالہ مواد کا مسلسل اندراج',
		summary: 'بلا حوالہ مواد کے مسلسل اندراج کے باعث آپ پر پابندی لگا دی گئی ہے۔'
	},
	'uw-uhblock' : {
		autoblock: true,
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		nocreate: true,
		reason: '{{uw-uhblock}} <!-- صارف نام کی خلاف ورزی، سخت پابندی -->',
		reasonParam: true,
		summary: 'آپ کے کھاتے پر لامحدود وقت کے لیے پابندی لگا دی گئی ہے، کیونکہ آپ کا صارف نام [[وپ:ص|ویکیپیڈیا کی صارف نام حکمت عملی]] کی واضح خلاف ورزی کر رہا تھا۔'
	},
	'uw-ublock-famous' : {
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		reason: '{{uw-ublock-famous}} <!-- صارف نام کسی مشہور شخصیت کی نمائندگی کرتا ہے، نرم پابندی -->',
		summary: 'آپ کے کھاتے پر لامحدود مدت کے لیے پابندی لگا دی گئی ہے کیونکہ آپ کا [[وپ:ص|صارف نام]] ایک معروف اور نامور شخصیت کے نام سے مشابہت رکھتا ہے۔'
	},
	'uw-uhblock-double': {
		autoblock: true,
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		nocreate: true,
		reason: '{{uw-ublock-double}} <!-- صارف نام دوسرے صارف سے بہت زیادہ مشابہت رکھتا ہے، سخت پابندی -->',
		summary: 'آپ کے کھاتے پر لامحدود وقت کے لیے پابندی لگا دی گئی ہے، کیونکہ آپ کا [[وپ:ص|صارف نام]] ویکیپیڈیا کے دوسرے معروف صارف کے نام سے بہت مشابہ ہے۔'
	},
	'uw-vaublock' : {
		autoblock: true,
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		nocreate: true,
		pageParam: true,
		reason: '{{uw-vaublock}} <!-- صارف نام کی خلاف ورزی، محض تخریب کاری کھاتہ -->',
		summary: 'آپ کی ترمیم کاری پر پابندی عائد کر دی گئی ہے کیونکہ آپ کا کھاتہ محض [[وپ:تخریب|تخریب کاری]] کے لیے استعمال کیا جا رہا تھا نیز آپ کا صارف نام بھی [[وپ:ص|ویکیپیڈیا کی صارف نام حکمت عملی]] کی واضح خلاف ورزی پر مشتمل ہے۔'
	},
	'uw-vblock' : {
		autoblock: true,
		expiry: '31 گھنٹے',
		nocreate: true,
		pageParam: true,
		reason: '[[وپ:تخریب کاری|تخریب کاری]]',
		summary: 'مستقل [[وپ:تخریب کاری|تخریب کاری]] کی بنا پر آپ کی ترمیم کاری پر پابندی لگا دی گئی ہے'
	},
	'uw-voablock' : {
		autoblock: true,
		expiry: 'لامحدود',
		forRegisteredOnly: true,
		nocreate: true,
		pageParam: true,
		reason: 'محض تخریب کار کھاتہ',
		summary: 'آپ کی ترمیم کاری پر پابندی عائد کر دی گئی ہے کیونکہ آپ کا کھاتہ محض [[وپ:تخریب|تخریب کاری]] کے لیے استعمال کیا جا رہا تھا۔'
	}
};

Twinkle.block.transformBlockPresets = function twinkleblockTransformBlockPresets() {
	// supply sensible defaults
	$.each(Twinkle.block.blockPresetsInfo, function(preset, settings) {
		settings.summary = settings.summary || settings.reason;
		settings.sig = settings.sig !== undefined ? settings.sig : 'yes';
		// despite this it's preferred that you use 'infinity' as the value for expiry
		settings.indefinite = settings.indefinite || settings.expiry === 'لامحدود' || settings.expiry === 'indefinite' || settings.expiry === 'never';

		if (!Twinkle.block.isRegistered && settings.indefinite) {
			settings.expiry = '31 گھنٹے';
		} else {
			settings.expiry = settings.expiry || '31 گھنٹے';
		}

		Twinkle.block.blockPresetsInfo[preset] = settings;
	});
};

// These are the groups of presets and defines the order in which they appear. For each list item:
//   label: <string, the description that will be visible in the dropdown>
//   value: <string, the key of a preset in blockPresetsInfo>
Twinkle.block.blockGroups = [
	{
		label: 'پابندی کی عام وجوہات',
		list: [
			{ label: 'پابندی نامعلوم', value: 'anonblock' },
			{ label: 'پابندی نامعلوم - غالباً اسکول', value: 'anonblock - school' },
			{ label: 'school block', value: 'school block' },
			{ label: 'عمومی پابندی (شخصی وجہ)', value: 'uw-block' }, // ends up being default for registered users
			{ label: 'عمومی پابندی (شخصی وجہ) – آئی پی', value: 'uw-ablock', selected: true }, // set only when blocking IP
			{ label: 'عمومی پابندی (شخصی وجہ) – دائمی', value: 'uw-blockindef' },
			{ label: 'خلل انداز ترمیم کاری', value: 'uw-disruptblock' },
			{ label: 'پابندی کے دوران میں تبادلۂ خیال صفحہ کا نامناسب استعمال', value: 'uw-talkrevoked' },
			{ label: 'دائرۃ المعارف کی ترقی کے لیے یہاں نہیں', value: 'uw-nothereblock' },
			{ label: 'بلا حوالہ مواد', value: 'uw-ucblock' },
			{ label: 'تخریب کاری', value: 'uw-vblock' },
			{ label: 'محض تخریب کاری کا کھاتہ', value: 'uw-voablock' }
		],
	},
	{
		label: 'توسیع شدہ وجوہات',
		list: [
			{ label: 'اشتہار بازی', value: 'uw-adblock' },
			{ label: 'مصالحت نفاذ', value: 'uw-aeblock' },
			{ label: 'پابندی سے فرار – آئی پی', value: 'uw-ipevadeblock' },
			{ label: 'بحش کی خلاف ورزیاں', value: 'uw-bioblock' },
			{ label: 'کاپی رائٹ کی خلاف ورزیاں', value: 'uw-copyrightblock' },
			{ label: 'نامناسب صفحات کی تخلیق', value: 'uw-npblock' },
			{ label: 'مقطار ترمیم کاری سے متعلق', value: 'uw-efblock' },
			{ label: 'ترمیم جنگ', value: 'uw-ewblock' },
			{ label: 'عمومی پابندی مع تبادلۂ خیال مسدود', value: 'uw-blocknotalk' },
			{ label: 'ایذا دہی', value: 'uw-hblock' },
			{ label: 'قانونی دھمکیاں', value: 'uw-lblock' },
			{ label: 'ذاتی حملہ یا ایذا دہی', value: 'uw-pablock' },
			{ label: 'ممکنہ طور پر مشکوک کھاتہ', value: 'uw-compblock' },
			{ label: 'مواد کی صفائی', value: 'uw-dblock' },
			{ label: 'جرابی کٹھ پتلی (مالک)', value: 'uw-sockblock' },
			{ label: 'جرابی کٹھ پتلی (کٹھ پتلی)', value: 'uw-spoablock' },
			{ label: 'سماجی ابلاغ کاری', value: 'uw-myblock' },
			{ label: 'فاضل کاری', value: 'uw-sblock' },
			{ label: 'محض فاضل کاری/اشتہار بازی کا کھاتہ', value: 'uw-soablock' },
			{ label: 'غیر مجاز روبہ', value: 'uw-botblock' },
			{ label: 'سہ رد ترمیم قانون کی خلاف ورزی', value: 'uw-3block' }
		]
	},
	{
		label: 'صارف نام کی خلاف ورزیاں',
		list: [
			{ label: 'روبہ کا صارف نام', value: 'uw-botublock' },
			{ label: 'کسی کا یادگار صارف نام، نرم پابندی', value: 'uw-memorialblock' },
			{ label: 'اشتہاری صارف نام، سخت پابندی', value: 'uw-spamublock' },
			{ label: 'اشتہاری صارف نام، نرم پابندی', value: 'uw-softerblock' },
			{ label: 'یکساں صارف نام، نرم پابندی', value: 'uw-ublock-double' },
			{ label: 'صارف نام کی خلاف ورزی، نرم پابندی', value: 'uw-ublock' },
			{ label: 'صارف نام کی خلاف ورزی، سخت پابندی', value: 'uw-uhblock' },
			{ label: 'کسی صارف سے مشابہ صارف نام، سخت پابندی', value: 'uw-uhblock-double' },
			{ label: 'صارف نام کسی مشہور شخصیت کا نمائندہ، نرم پابندی', value: 'uw-ublock-famous' },
			{ label: 'صارف نام منافع بخش تجارتی ادارے کا نمائندہ، نرم پابندی', value: 'uw-causeblock' },
			{ label: 'صارف نام کی خلاف ورزی، محض تخریب کار کھاتہ', value: 'uw-vaublock' }
		]
	},
	{
		label: 'دیگر وجوہات',
		list: [
			{ label: 'ممنوع پراکسی', value: 'blocked proxy' },
			{ label: 'صارف پڑتال پابندی', value: 'CheckUser block' },
			{ label: 'صارف پڑتال پابندی-کھاتہ', value: 'checkuserblock-account' },
			{ label: 'صارف پڑتال پابندی-وسیع', value: 'checkuserblock-wide' },
			{ label: 'ویب ہوسٹ میزبانی', value: 'colocationwebhost' },
			{ label: 'نگراں پابندی', value: 'oversightblock' },
			// { label: 'رینج پابندی', value: 'rangeblock' }, // placeholder for when we add support for rangeblocks
			{ label: 'ٹور', value: 'tor' },
			{ label: 'ویب ہوسٹ پابندی', value: 'webhostblock' }
		]
	}
];

Twinkle.block.callback.filtered_block_groups = function twinkleblockCallbackFilteredBlockGroups(show_template) {
	return $.map(Twinkle.block.blockGroups, function(blockGroup) {
		var list = $.map(blockGroup.list, function(blockPreset) {
				// only show uw-talkrevoked if reblocking
				if (!Twinkle.block.currentBlockInfo && blockPreset.value === "uw-talkrevoked") return;

				var blockSettings = Twinkle.block.blockPresetsInfo[blockPreset.value];
				var registrationRestrict = blockSettings.forRegisteredOnly ? Twinkle.block.isRegistered : (blockSettings.forAnonOnly ? !Twinkle.block.isRegistered : true);
				if (!(blockSettings.templateName && show_template) && registrationRestrict) {
					var templateName = blockSettings.templateName || blockPreset.value;
					return {
						label: (show_template ? '{{' + templateName + '}}: ' : '') + blockPreset.label,
						value: blockPreset.value,
						data: [{
							name: 'template-name',
							value: templateName
						}],
						selected: !!blockPreset.selected
					};
				}
			});
		if (list.length) return {
				label: blockGroup.label,
				list: list
			};
	});
};

Twinkle.block.callback.change_preset = function twinkleblockCallbackChangePreset(e) {
	var key = e.target.form.preset.value;
	if (!key) return;

	e.target.form.template.value = Twinkle.block.blockPresetsInfo[key].templateName || key;
	Twinkle.block.callback.update_form(e, Twinkle.block.blockPresetsInfo[key]);
	Twinkle.block.callback.change_template(e);
};

Twinkle.block.callback.change_expiry = function twinkleblockCallbackChangeExpiry(e) {
	var expiry = e.target.form.expiry;
	if (e.target.value === 'custom') {
		Morebits.quickForm.setElementVisibility(expiry.parentNode, true);
	} else {
		Morebits.quickForm.setElementVisibility(expiry.parentNode, false);
		expiry.value = e.target.value;
	}
};

Twinkle.block.callback.update_form = function twinkleblockCallbackUpdateForm(e, data) {
	var form = e.target.form, expiry = data.expiry;

	// don't override original expiry if useInitialOptions is set
	if (!data.useInitialOptions) {
		if (Date.parse(expiry)) {
			expiry = new Date(expiry).toGMTString();
			form.expiry_preset.value = 'custom';
		} else {
			form.expiry_preset.value = data.expiry || 'custom';
		}

		form.expiry.value = expiry;
		if (form.expiry_preset.value === 'custom') {
			Morebits.quickForm.setElementVisibility(form.expiry.parentNode, true);
		} else {
			Morebits.quickForm.setElementVisibility(form.expiry.parentNode, false);
		}
	}

	// boolean-flipped options, more at [[mw:API:Block]]
	data.disabletalk = data.disabletalk !== undefined ? data.disabletalk : false;
	data.hardblock = data.hardblock !== undefined ? data.hardblock : false;

	// disable autoblock if blocking a bot
	if (Twinkle.block.isRegistered && relevantUserName.search(/bot$/i) > 0) {
		data.autoblock = false;
	}

	$(form.field_block_options).find(':checkbox').each(function(i, el) {
		// don't override original options if useInitialOptions is set
		if (data.useInitialOptions && data[el.name] === undefined) return;

		var check = data[el.name] === '' || !!data[el.name];
		$(el).prop('checked', check);
	});

	if (data.prependReason && data.reason) {
		form.reason.value = data.reason + '; ' + form.reason.value;
	} else {
		form.reason.value = data.reason || '';
	}
};

Twinkle.block.callback.change_template = function twinkleblockcallbackChangeTemplate(e) {
	var form = e.target.form, value = form.template.value, settings = Twinkle.block.blockPresetsInfo[value];

	if (!$(form).find('[name=actiontype][value=block]').is(':checked')) {
		if (settings.indefinite || settings.nonstandard) {
			if (Twinkle.block.prev_template_expiry === null) {
				Twinkle.block.prev_template_expiry = form.template_expiry.value || '';
			}
			form.template_expiry.parentNode.style.display = 'none';
			form.template_expiry.value = 'indefinite';
		} else if ( form.template_expiry.parentNode.style.display === 'none' ) {
			if(Twinkle.block.prev_template_expiry !== null) {
				form.template_expiry.value = Twinkle.block.prev_template_expiry;
				Twinkle.block.prev_template_expiry = null;
			}
			form.template_expiry.parentNode.style.display = 'block';
		}
		if (Twinkle.block.prev_template_expiry) form.expiry.value = Twinkle.block.prev_template_expiry;
		Morebits.quickForm.setElementVisibility(form.notalk.parentNode, !settings.nonstandard);
	} else {
		Morebits.quickForm.setElementVisibility(
			form.blank_duration.parentNode,
			!settings.indefinite && !settings.nonstandard
		);
	}

	Morebits.quickForm.setElementVisibility(form.article.parentNode, !!settings.pageParam);
	Morebits.quickForm.setElementVisibility(form.block_reason.parentNode, !!settings.reasonParam);

	form.root.previewer.closePreview();
};
Twinkle.block.prev_template_expiry = null;
Twinkle.block.prev_block_reason = null;
Twinkle.block.prev_article = null;
Twinkle.block.prev_reason = null;

Twinkle.block.callback.preview = function twinkleblockcallbackPreview(form) {
	var params = {
		article: form.article.value,
		blank_duration: form.blank_duration ? form.blank_duration.checked : false,
		disabletalk: form.disabletalk.checked || (form.notalk ? form.notalk.checked : false),
		expiry: form.template_expiry ? form.template_expiry.value : form.expiry.value,
		hardblock: Twinkle.block.isRegistered ? form.autoblock.checked : form.hardblock.checked,
		indefinite: (/indef|infinity|never|\*|max/).test( form.template_expiry ? form.template_expiry.value : form.expiry.value ),
		reason: form.block_reason.value,
		template: form.template.value
	};

	var templateText = Twinkle.block.callback.getBlockNoticeWikitext(params);

	form.previewer.beginRender(templateText);
};

Twinkle.block.callback.evaluate = function twinkleblockCallbackEvaluate(e) {
	var $form = $(e.target),
		toBlock = $form.find('[name=actiontype][value=block]').is(':checked'),
		toWarn = $form.find('[name=actiontype][value=template]').is(':checked'),
		blockoptions = {}, templateoptions = {};

	Twinkle.block.callback.saveFieldset($form.find('[name=field_block_options]'));
	Twinkle.block.callback.saveFieldset($form.find('[name=field_template_options]'));

	blockoptions = Twinkle.block.field_block_options;

	templateoptions = Twinkle.block.field_template_options;
	templateoptions.disabletalk = !!(templateoptions.disabletalk || blockoptions.disabletalk);
	templateoptions.hardblock = !!blockoptions.hardblock;
	delete blockoptions.expiry_preset; // remove extraneous

	// use block settings as warn options where not supplied
	templateoptions.summary = templateoptions.summary || blockoptions.reason;
	templateoptions.expiry = templateoptions.template_expiry || blockoptions.expiry;

	if (toBlock) {
		if (!blockoptions.expiry) return alert('براہ کرم مدت اختتام درج کریں!');
		if (!blockoptions.reason) return alert('براہ کرم پابندی لگانے کی وجہ بیان کریں!');

		Morebits.simpleWindow.setButtonsEnabled( false );
		Morebits.status.init( e.target );
		var statusElement = new Morebits.status('پابندی لگائی جا رہی ہے');
		blockoptions.action = 'block';
		blockoptions.user = mw.config.get('wgRelevantUserName');

		// boolean-flipped options
		blockoptions.anononly = blockoptions.hardblock ? undefined : true;
		blockoptions.allowusertalk = blockoptions.disabletalk ? undefined : true;

		// fix for bug with block API, see [[phab:T68646]]
		if (blockoptions.expiry === 'infinity') blockoptions.expiry = 'infinite';

		// execute block
		api.getToken('block').then(function(token) {
			statusElement.status('جاری ہے۔۔۔');
			blockoptions.token = token;
			var mbApi = new Morebits.wiki.api( 'Executing block', blockoptions, function(data) {
				statusElement.info('مکمل');
				if (toWarn) Twinkle.block.callback.issue_template(templateoptions);
			});
			mbApi.post();
		}, function() {
			statusElement.error('بلاک ٹوکن کو اخذ کرنے میں ناکامی');
		});
	} else if (toWarn) {
		Morebits.simpleWindow.setButtonsEnabled( false );

		Morebits.status.init( e.target );
		Twinkle.block.callback.issue_template(templateoptions);
	} else {
		return alert('براہ کرم پلک کو کچھ کام دیں!');
	}
};

Twinkle.block.callback.issue_template = function twinkleblockCallbackIssueTemplate(formData) {
	var userTalkPage = 'User_talk:' + mw.config.get('wgRelevantUserName');

	var params = $.extend(formData, {
		messageData: Twinkle.block.blockPresetsInfo[formData.template],
		reason: Twinkle.block.field_template_options.block_reason,
		disabletalk: Twinkle.block.field_template_options.notalk
	});

	Morebits.wiki.actionCompleted.redirect = userTalkPage;
	Morebits.wiki.actionCompleted.notice = 'اقدامات مکمل، چند سیکنڈ میں صارف کا تبادلۂ خیال صفحہ لوڈ ہوگا';

	var wikipedia_page = new Morebits.wiki.page( userTalkPage, 'تبادلۂ خیال صارف میں ترمیم' );
	wikipedia_page.setCallbackParameters( params );
	wikipedia_page.setFollowRedirect( true );
	wikipedia_page.load( Twinkle.block.callback.main );
};

Twinkle.block.callback.getBlockNoticeWikitext = function(params) {
	var text = '{{', settings = Twinkle.block.blockPresetsInfo[params.template];

	if (!settings.nonstandard) {
		text += 'subst:'+params.template;
		if (params.article && settings.pageParam) text += '|page=' + params.article;

		if (!/te?mp|^\s*$|min/.exec(params.expiry)) {
			if (params.indefinite) {
				text += '|indef=yes';
			} else if(!params.blank_duration) {
				text += '|time=' + params.expiry;
			}
		}

		if (!Twinkle.block.isRegistered && !params.hardblock) {
			text += '|anon=yes';
		}

		if (params.reason) text += '|reason=' + params.reason;
		if (params.disabletalk) text += '|notalk=yes';
	} else {
		text += params.template;
	}

	if (settings.sig) text += '|sig=' + settings.sig;

	return text + '}}';
};

Twinkle.block.callback.main = function twinkleblockcallbackMain( pageobj ) {
	var text = pageobj.getPageText(),
		params = pageobj.getCallbackParameters(),
		messageData = params.messageData,
		date = new Date();

	var dateHeaderRegex = new RegExp( '^==+\\s*(?:' + date.getUTCMonthName() + '|' + date.getUTCMonthNameAbbrev() +
		')\\s+' + date.getUTCFullYear() + '\\s*==+', 'mg' );
	var dateHeaderRegexLast, dateHeaderRegexResult;
	while ((dateHeaderRegexLast = dateHeaderRegex.exec( text )) !== null) {
		dateHeaderRegexResult = dateHeaderRegexLast;
	}
	// If dateHeaderRegexResult is null then lastHeaderIndex is never checked. If it is not null but
	// \n== is not found, then the date header must be at the very start of the page. lastIndexOf
	// returns -1 in this case, so lastHeaderIndex gets set to 0 as desired.
	var lastHeaderIndex = text.lastIndexOf( '\n==' ) + 1;

	if ( text.length > 0 ) {
		text += '\n\n';
	}

	params.indefinite = (/indef|infinity|never|\*|max/).test( params.expiry );

	if ( Twinkle.getPref('blankTalkpageOnIndefBlock') && params.template !== 'uw-lblock' && params.indefinite ) {
		Morebits.status.info( 'اطلاع', 'ترجیحات کے مطابق تبادلۂ خیال صفحہ کو خالی کر کے تاریخ کے لیے درجہ دوم کی نئی سرخی بنائی جا رہی ہے' );
		text = '== ' + date.getUTCMonthName() + ' ' + date.getUTCFullYear() + ' ==\n';
	} else if( !dateHeaderRegexResult || dateHeaderRegexResult.index !== lastHeaderIndex ) {
		Morebits.status.info( 'اطلاع', 'چونکہ اس مہینے کے لیے کوئی سرخی نہیں ملی لہذا تاریخ کے لیے درجہ دوم کی نئی سرخی بنائی جائے گی' );
		text += '== ' + date.getUTCMonthName() + ' ' + date.getUTCFullYear() + ' ==\n';
	}

	params.expiry = typeof params.template_expiry !== "undefined" ? params.template_expiry : params.expiry;

	text += Twinkle.block.callback.getBlockNoticeWikitext(params);

	// build the edit summary
	var summary = messageData.summary;
	if ( messageData.suppressArticleInSummary !== true && params.article ) {
		summary += '[[' + params.article + ']] پر';
	}
	summary += '.' + Twinkle.getPref('summaryAd');

	pageobj.setPageText( text );
	pageobj.setEditSummary( summary );
	pageobj.setWatchlist( Twinkle.getPref('watchWarnings') );
	pageobj.save();
};

})(jQuery);

//</nowiki>