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

آزاد دائرۃ المعارف، ویکیپیڈیا سے

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

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

//<nowiki>


(function($){


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

Twinkle.arv = function twinklearv() {
	var username = mw.config.get('wgRelevantUserName');
	if ( !username ) {
		return;
	}

	var title = Morebits.isIPAddress( username ) ? 'منتظمین کی خدمت میں اس آئی پی کی شکایت کریں' : 'منتظمین کی خدمت میں اس صارف کی شکایت کریں';

	Twinkle.addPortletLink( function(){ Twinkle.arv.callback(username); }, "شکایت کریں", "tw-arv", title );
};

Twinkle.arv.callback = function ( uid ) {
	if ( uid === mw.config.get('wgUserName') ) {
		alert( 'کیا آپ واقعی اپنی شکایت کرنا چاہتے ہیں؟' );
		return;
	}

	var Window = new Morebits.simpleWindow( 600, 500 );
	Window.setTitle( "اندراج شکایت اور جانچ پڑتال کی درخواست" ); //Backronym
	Window.setScriptName( "پلک" );
	Window.addFooterLink( "رہنما برائے انتظامی مداخلت بوقت تخریب کاری", ":en:WP:GAIV" );
	Window.addFooterLink( "انتظامی توجہ درکار صارف ناموں کے متعلق ہدایات", "WP:UAAI" );
	Window.addFooterLink( "صارف جانچ کا تعارف", "وپ:صجد" );
	Window.addFooterLink( "رہنمائے پلک", "WP:TW/DOC#arv" );

	var form = new Morebits.quickForm( Twinkle.arv.callback.evaluate );
	var categories = form.append( {
			type: 'select',
			name: 'category',
			label: 'شکایت کی قسم منتخب کریں: ',
			event: Twinkle.arv.callback.changeCategory
		} );
	categories.append( {
			type: 'option',
			label: 'تخریب کاری (وپ:تام)',
			value: 'aiv'
		} );
	categories.append( {
			type: 'option',
			label: 'صارف نام (وپ:تامنام)',
			value: 'username'
		} );
	categories.append( {
			type: 'option',
			label: 'جرابی کٹھ پتلی باز (وپ:صجد)',
			value: 'sock'
		} );
	categories.append( {
			type: 'option',
			label: 'جرابی کٹھ پتلی (وپ:صجد)',
			value: 'puppet'
		} );
	categories.append( {
			type: 'option',
			label: 'ترمیمی جنگ (وپ:تامجنگ)',
			value: 'an3'
		} );
	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 = Morebits.quickForm.getElements(root, "work_area")[0];
	var work_area = null;

	switch( value ) {
	case 'aiv':
		/* falls through */
	default:
		work_area = new Morebits.quickForm.element( {
				type: 'field',
				label: 'صارف کی تخریب کاری کی شکایت کریں',
				name: 'work_area'
			} );
		work_area.append( {
				type: 'input',
				name: 'page',
				label: 'متعلقہ صفحہ کا ربط: ',
				tooltip: 'شکایت میں کسی صفحے کا ربط نہ دینا چاہیں تو اسے خالی چھوڑ دیں',
				value: Morebits.queryString.exists( 'vanarticle' ) ? Morebits.queryString.get( 'vanarticle' ) : '',
				event: function(e) {
					var value = e.target.value;
					var root = e.target.form;
					if( value === '' ) {
						root.badid.disabled = root.goodid.disabled = true;
					} else {
						root.badid.disabled = false;
						root.goodid.disabled = root.badid.value === '';
					}
				}
			} );
		work_area.append( {
				type: 'input',
				name: 'badid',
				label: 'تخریب کاری کے وقت متعلقہ صفحے کے نسخہ کا شناختی نمبر (آئی ڈی): ',
				tooltip: 'فرق کا ربط نہ دینا ہو تو اسے خالی چھوڑ دیں',
				value: Morebits.queryString.exists( 'vanarticlerevid' ) ? Morebits.queryString.get( 'vanarticlerevid' ) : '',
				disabled: !Morebits.queryString.exists( 'vanarticle' ),
				event: function(e) {
					var value = e.target.value;
					var root = e.target.form;
					root.goodid.disabled = value === '';
				}
			} );
		work_area.append( {
				type: 'input',
				name: 'goodid',
				label: 'تخریب کاری سے قبل متعلقہ صفحے کے آخری نسخہ کا شناختی نمبر (آئی ڈی): ',
				tooltip: 'سابقہ نسخہ کے فرق ربط کے لیے اسے خالی چھوڑ دیں',
				value: Morebits.queryString.exists( 'vanarticlegoodrevid' ) ? Morebits.queryString.get( 'vanarticlegoodrevid' ) : '',
				disabled: !Morebits.queryString.exists( 'vanarticle' ) || Morebits.queryString.exists( 'vanarticlerevid' )
			} );
		work_area.append( {
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'آخری انتباہ کے بعد تخریب کاری (سطح 4 یا سطح 4 آخری تک)',
						value: 'final'
					},
					{
						label: 'پابندی ختم کرنے کے بعد تخریب کاری (1 دن کے اندر)',
						value: 'postblock'
					},
					{
						label: 'بظاہر تخریب کاری کے لیے بنایا گیا کھاتہ',
						value: 'vandalonly',
						disabled: Morebits.isIPAddress( root.uid.value )
					},
					{
						label: 'بظاہر فاضل کار روبہ یا مشتبہ کھاتہ',
						value: 'spambot'
					},
					{
						label: 'محض اشتہار باز کھاتہ',
						value: 'promoonly'
					}
				]
			} );
		work_area.append( {
				type: 'textarea',
				name: 'reason',
				label: 'تبصرہ: '
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;
	case 'username':
		work_area = new Morebits.quickForm.element( {
				type: 'field',
				label: 'صارف نام کی خلاف ورزی کی شکایت کریں',
				name: 'work_area'
			} );
		work_area.append ( {
				type: 'header',
				label: 'نامناسب صارف نام',
				tooltip: 'ویکیپیڈیا میں گمراہ کن، تشہیری، توہین آمیز یا تفرقہ انگیز صارف ناموں کی قطعاً گنجائش نہیں ہے۔ نیز اس طرح کے برقی ڈاک پتوں اور ڈومین ناموں کی بھی اجازت نہیں۔ یہ اصول و ضوابط صارف نام اور دستخطوں دونوں کے لیے مقرر کیے گئے ہیں۔ ایسے صارف نام جو کسی دوسری زبان میں نامناسب سمجھے جاتے ہوں یا غلط ہجے اور املا کے ذریعہ اسے نامناسب معنی پہنائے گئے ہوں یا بالواسطہ اور ضمنی طور پر نامناسب معنی پیدا ہوتے ہوں، ان سب کی اجازت نہیں ہوگی۔'
			} );
		work_area.append( {
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'گمراہ کن صارف نام',
						value: 'گمراہ کن',
						tooltip: 'گمراہ کن صارف نام حقائق کو کسی دوشری شکل میں پیش کرتے ہیں۔'
					},
					{
						label: 'تشہیری صارف نام',
						value: 'تشہیری',
						tooltip: 'تشہیری صارف نام کسی ویب سائٹ، ادارہ، تنظیم، تحریک یا حلقے کی تشہیر پر مشتمل ہوتے ہیں۔'
					},
					{
						label: 'مشترکہ صارف نام',
						value: 'مشترکہ',
						tooltip: 'ایسے صارف نام  جنہیں ایک سے زائد صارفین مشترکہ طور پر استعمال کریں (مثلاً کمپنیاں اور ادارے وغیرہ) کی گنجائش نہیں ہے۔ البتہ اگر کوئی صارف نام کسی کمپنی یا ادارے وغیرہ کے نام پر رکھا گیا ہو لیکن اس امر کا یقین ہو کہ یہ کھاتہ ایک ہی شخص کے زیر استعمال ہے تو اس کی اجازت ہے۔'
					},
					{
						label: 'توہین آمیز صارف نام',
						value: 'توہین آمیز',
						tooltip: 'توہین آمیز نام ویکی ہم آہنگی میں رخنے ڈال کر یہاں ترمیم کاری کو مشکل بناتا ہے۔ '
					},
					{
						label: 'تفرقہ انگیز صارف نام',
						value: 'تفرقہ انگیز',
						tooltip: 'تفرقہ انگیز نام ذاتی حملوں پر مشتمل ہوتے ہیں جس کا مقڈ ویکی ماحول کو خراب کرنا ہوتا ہے۔'
					}
				]
			} );
		work_area.append( {
				type: 'textarea',
				name: 'reason',
				label: 'تبصرہ:'
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;

	case 'puppet':
		work_area = new Morebits.quickForm.element( {
				type: 'field',
				label: 'مشکوک جرابی کٹھ پتلی کی شکایت',
				name: 'work_area'
			} );
		work_area.append(
			{
				type: 'input',
				name: 'sockmaster',
				label: 'جرابی کٹھ پتلی باز',
				tooltip: 'جرابی کٹھ پتلی باز کا صارف نام «صارف:»سابقے کے بغیر ہوتا ہے'
			}
		);
		work_area.append( {
				type: 'textarea',
				label: 'ثبوت:',
				name: 'evidence',
				tooltip: 'اپنے ثبوت درج کریں۔ اور ایسا ثبوت پیش کریں جس سے یہ واضح ہو جائے کہ غالباً یہ صارفین کئی کھاتے استعمال کر رہے ہیں۔ عموماً ایسے ثبوت صفحوں کے تاریخچوں، ترمیموں اور ان معلومات پر مشتمل ہوتے ہیں جن سے اولاً یہ ثابت ہوجائے کہ یہ تمام کارروائیاں ایک ہی صارف کی ہیں، ثانیاً یہ کارروائیاں خلل انداز ہو رہی ہیں۔ براہ کرم محض متعلقہ معاملے کے لیے فیصلہ کن ثبوت اور معلومات فراہم کریں اور غیر متعلقہ امور، گفتگو اور روابط سے گریز کریں۔'
			} );
		work_area.append( {
				type: 'checkbox',
				list: [
					{
						label: 'صارف جانچ کی درخواست',
						name: 'checkuser',
						tooltip: 'صارف پڑتال ایک آلہ ہے جس کے ذریعہ جرابی کٹھ پتلی کے الزام سے متعلق تکنیکی ثبوت حاصل کیے جاتے ہیں۔ اسے بغیر مناسب وجہ کے استعمال نہیں کیا جاتا، لہذا اس مناسب وجہ کو آپ لازماً بیان کریں۔ اس بات کا خیال رکھیں کہ آپ کے فراہم کردہ ثبوت صارف پڑتال کے استعمال کا جواز فراہم کر سکیں۔'
					},
					{
						label: 'جن صارفین کی شکایت کی گئی ہے انہیں اطلاع دیں',
						name: 'notify',
						tooltip: 'اطلاع دینا لازمی نہیں۔ اکثر حالات میں، بالخصوص جرابی کٹھ پتلی کی شکایت کی اطلاع دینے سے الٹے نتائج پیدا ہونے کے امکان ہیں۔ تاہم اگر صارفین پر لگائے گئے الزام سنگین نہیں ہیں نیز اس سے قبل ان کی شکایت کبھی نہیں ہوئی تو انہیں اطلاع دینا انصاف کا تقاضا ہو سکتا ہے بالخصوص ملزم کی نگاہ میں اطلاع رسانی کا یہ عمل منصفانہ ہوگا۔ خیر آپ خود فیصلہ کر لیں کہ کیا کرنا چاہیے۔'
					}
				]
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;
	case 'sock':
		work_area = new Morebits.quickForm.element( {
				type: 'field',
				label: 'مشکوک جرابی کٹھ پتلی باز کی شکایت کریں',
				name: 'work_area'
			} );
		work_area.append(
			{
				type: 'dyninput',
				name: 'sockpuppet',
				label: 'جرابی کٹھ پتلیاں',
				sublabel: 'جراب: ',
				tooltip: 'جرابی کٹھ پتلی باز کا صارف نام «صارف:»سابقے کے بغیر ہوتا ہے',
				min: 2
			} );
		work_area.append( {
				type: 'textarea',
				label: 'ثبوت:',
				name: 'evidence',
				tooltip: 'اپنے ثبوت درج کریں۔ اور ایسا ثبوت پیش کریں جس سے یہ واضح ہو جائے کہ غالباً یہ صارفین کئی کھاتے استعمال کر رہے ہیں۔ عموماً ایسے ثبوت صفحوں کے تاریخچوں، ترمیموں اور ان معلومات پر مشتمل ہوتے ہیں جن سے اولاً یہ ثابت ہوجائے کہ یہ تمام کارروائیاں ایک ہی صارف کی ہیں، ثانیاً یہ کارروائیاں خلل انداز ہو رہی ہیں۔ براہ کرم محض متعلقہ معاملے کے لیے فیصلہ کن ثبوت اور معلومات فراہم کریں اور غیر متعلقہ امور، گفتگو اور روابط سے گریز کریں۔'
			} );
		work_area.append( {
				type: 'checkbox',
				list: [ {
					label: 'صارف جانچ کی درخواست',
					name: 'checkuser',
					tooltip: 'صارف پڑتال ایک آلہ ہے جس کے ذریعہ جرابی کٹھ پتلی کے الزام سے متعلق تکنیکی ثبوت حاصل کیے جاتے ہیں۔ اسے بغیر مناسب وجہ کے استعمال نہیں کیا جاتا، لہذا اس مناسب وجہ کو آپ لازماً بیان کریں۔ اس بات کا خیال رکھیں کہ آپ کے فراہم کردہ ثبوت صارف پڑتال کے استعمال کا جواز فراہم کر سکیں۔'
				}, {
					label: 'جن صارفین کی شکایت کی گئی ہے انہیں اطلاع دیں',
					name: 'notify',
					tooltip: 'اطلاع دینا لازمی نہیں۔ اکثر حالات میں، بالخصوص جرابی کٹھ پتلی کی شکایت کی اطلاع دینے سے الٹے نتائج پیدا ہونے کے امکان ہیں۔ تاہم اگر صارفین پر لگائے گئے الزام سنگین نہیں ہیں نیز اس سے قبل ان کی شکایت کبھی نہیں ہوئی تو انہیں اطلاع دینا انصاف کا تقاضا ہو سکتا ہے بالخصوص ملزم کی نگاہ میں اطلاع رسانی کا یہ عمل منصفانہ ہوگا۔ خیر آپ خود فیصلہ کر لیں کہ کیا کرنا چاہیے۔'
				} ]
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
        break;
	case 'an3':
		work_area = new Morebits.quickForm.element( {
			type: 'field',
			label: 'ترمیمی جنگ کی شکایت',
			name: 'work_area'
		} );

		work_area.append( {
			type: 'input',
			name: 'page',
			label: 'صفحہ',
			tooltip: 'جن صفحات کی شکایت کی جا رہی ہے'
		} );
		work_area.append( {
			type: 'button',
			name: 'load',
			label: 'لوڈ کریں',
			event: function(e) {
				var root = e.target.form;
				var value = root.page.value;
				var uid = root.uid.value;
				var $diffs = $(root).find('[name=diffs]');
				$diffs.find('.entry').remove();

				var date = new Date();
				date.setHours(-36); // all since 36 hours

				var api = new mw.Api();
				api.get({
					action: 'query',
					prop: 'revisions',
					format: 'json',
					rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
					rvlimit: 500,
					rvend: date.toISOString(),
					rvuser: uid,
					indexpageids: true,
					redirects: true,
					titles: value
				}).done(function(data){
					var pageid = data.query.pageids[0];
					var page = data.query.pages[pageid];
					if(!page.revisions) {
						return;
					}
					for(var i = 0; i < page.revisions.length; ++i) {
						var rev = page.revisions[i];
						var $entry = $('<div/>', {
							'class': 'entry'
						});
						var $input = $('<input/>', {
							'type': 'checkbox',
							'name': 's_diffs',
							'value': rev.revid
						});
						$input.data('revinfo',rev);
						$input.appendTo($entry);
						$entry.append('<span>"'+rev.parsedcomment+'" at <a href="'+mw.config.get('wgScript')+'?diff='+rev.revid+'">'+moment(rev.timestamp).calendar()+'</a></span>').appendTo($diffs);
					}
				}).fail(function(data){
					console.log( 'API failed :(', data );
				});
				var $warnings = $(root).find('[name=warnings]');
				$warnings.find('.entry').remove();

				api.get({
					action: 'query',
					prop: 'revisions',
					format: 'json',
					rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
					rvlimit: 500,
					rvend: date.toISOString(),
					rvuser: mw.config.get('wgUserName'),
					indexpageids: true,
					redirects: true,
					titles: 'User talk:' + uid
				}).done(function(data){
					var pageid = data.query.pageids[0];
					var page = data.query.pages[pageid];
					if(!page.revisions) {
						return;
					}
					for(var i = 0; i < page.revisions.length; ++i) {
						var rev = page.revisions[i];
						var $entry = $('<div/>', {
							'class': 'entry'
						});
						var $input = $('<input/>', {
							'type': 'checkbox',
							'name': 's_warnings',
							'value': rev.revid
						});
						$input.data('revinfo',rev);
						$input.appendTo($entry);
						$entry.append('<span>"'+rev.parsedcomment+'" at <a href="'+mw.config.get('wgScript')+'?diff='+rev.revid+'">'+moment(rev.timestamp).calendar()+'</a></span>').appendTo($warnings);
					}
				}).fail(function(data){
					console.log( 'API failed :(', data );
				});

				var $resolves = $(root).find('[name=resolves]');
				$resolves.find('.entry').remove();

				var t = new mw.Title(value);
				var ns = t.getNamespaceId();
				var talk_page = (new mw.Title(t.getMain(), ns%2? ns : ns+1)).getPrefixedText();

				api.get({
					action: 'query',
					prop: 'revisions',
					format: 'json',
					rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
					rvlimit: 500,
					rvend: date.toISOString(),
					rvuser: mw.config.get('wgUserName'),
					indexpageids: true,
					redirects: true,
					titles: talk_page
				}).done(function(data){
					var pageid = data.query.pageids[0];
					var page = data.query.pages[pageid];
					if(!page.revisions) {
						return;
					}
					for(var i = 0; i < page.revisions.length; ++i) {
						var rev = page.revisions[i];
						var $entry = $('<div/>', {
							'class': 'entry'
						});
						var $input = $('<input/>', {
							'type': 'checkbox',
							'name': 's_resolves',
							'value': rev.revid
						});
						$input.data('revinfo',rev);
						$input.appendTo($entry);
						$entry.append('<span>"'+rev.parsedcomment+'" at <a href="'+mw.config.get('wgScript')+'?diff='+rev.revid+'">'+moment(rev.timestamp).calendar()+'</a></span>').appendTo($resolves);
					}

					// add free form input
					var $free_entry = $('<div/>', {
						'class': 'entry'
					});
					var $free_input = $('<input/>', {
						'type': 'text',
						'name': 's_resolves_free'
					});

					var $free_label = $('<label/>', {
						'for': 's_resolves_free',
						'html': 'Diff to additional discussions: '
					});
					$free_entry.append($free_label).append($free_input).appendTo($resolves);

				}).fail(function(data){
					console.log( 'API failed :(', data );
				});
			}
		} );
		work_area.append( {
			type: 'field',
			name: 'diffs',
			label: 'صارف کی واپس پھیری گئی ترامیم',
			tooltip: 'ان ترامیم کو منتخب کریں جو آپ کے خیال میں واپس پھیری گئی ہیں'
		} );
		work_area.append( {
			type: 'field',
			name: 'warnings',
			label: 'متعلقہ صارف کو دیے گئے انتباہات',
			tooltip: 'شکایت کرنے سے قبل متعلقہ صارف کو لازماً متنبہ کریں'
		} );
		work_area.append( {
			type: 'field',
			name: 'resolves',
			label: 'مصالحت کی کوششیں',
			tooltip: 'پہلے آپ اس معاملے کو صارف کے تبادلہ خیال پر حل کرنے کی کوشش کریں'
		} );

		work_area.append( {
			type: 'textarea',
			label: 'تبصرہ:',
			name: 'comment'
		} );

		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( 'وجہ درج کریں' );
				return;
			}

			types = types.map( function(v) {
					switch(v) {
						case 'final':
							return 'آخری انتباہ کے بعد تخریب کاری';
						case 'postblock':
							return 'پابندی ختم کرنے کے بعد فوری تخریب کاری';
						case 'spambot':
							return 'بظاہر فاضل کار روبہ یا مشتبہ کھاتہ';
						case 'vandalonly':
							return 'کھاتے کی کارروائیوں سے معلوم ہوتا ہے کہ اسے تخریب کاری ہی کے لیے بنایا گیاہے';
						case 'promoonly':
							return 'اس کھاتے کو محض اشتہاری مقاصد کے لیے استعمال کیا جا رہا ہے';
						default:
							return 'نامعلوم وجہ';
					}
				} ).join( '؛ ' );


			if ( form.page.value !== '' ) {
			
				// add a leading : on linked page namespace to prevent transclusion
				reason = "== تخریب کاری کی شکایت ==\n[[صارف:" + uid + "|" + uid + "]] ";
				reason += 'نے [[' + form.page.value.replace( /^(Image|Category|File):/i, ':$1:' ) + ']] میں تخریب کاری کی';

				if ( form.badid.value !== '' ) {
					reason += ' ({{diff|' + form.page.value + '|' + form.badid.value + '|' + form.goodid.value + '|فرق کا ربط}})';
				}
				reason += ':';
			}

			if ( types ) {
				reason += " " + types;
			}
			if (comment !== "" ) {
				reason += (reason === "" ? "" : ". ") + comment;
			}
			reason = reason.trim();
			if (reason.search(/[.؟!؛،]$/) ===-1) {
				reason += ".";
			}
			reason += " ~~~~";
			reason = reason.replace(/\r?\n/g, "\n*:");  // indent newlines

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

			Morebits.wiki.actionCompleted.redirect = "ویکیپیڈیا:تختۂ اعلانات برائے منتظمین";
			Morebits.wiki.actionCompleted.notice = "شکایت درج کر دی گئی";

			var aivPage = new Morebits.wiki.page( 'ویکیپیڈیا:تختۂ اعلانات برائے منتظمین', 'شکایت درج کی جا رہی ہے' );
			// aivPage.setPageSection( 1 );
			aivPage.setFollowRedirect( true );
			
			aivPage.load( function() {
				var text = aivPage.getPageText();

				// check if user has already been reported
				if (new RegExp( "\\{\\{\\s*(?:(?:[Ii][Pp])?[Vv]andal|[Uu]serlinks)\\s*\\|\\s*(?:1=)?\\s*" + window.RegExp.escape( uid, true ) + "\\s*\\}\\}" ).test(text)) {
					aivPage.getStatusElement().error( 'شکایت پہلے سے موجود ہے، لہذا نئی شکایت درج نہیں ہو سکتی' );
					Morebits.status.printUserText( reason, 'البتہ آپ کے درج کردہ تبصرے ذیل میں موجود ہیں، اگر انہیں دستی طور پر موجودہ شکایت کے تحت درج کرنا چاہیں تو کر سکتے ہیں:' );
					return;
				}
				aivPage.getStatusElement().status( 'نئی شکایت درج کی جا رہی ہے۔۔۔' );
				aivPage.setEditSummary( 'صارف [[خاص:شراکتیں/' + uid + '|' + uid + ']] کی شکایت کا اندراج' + Twinkle.getPref('summaryAd') );
				aivPage.setPageText( text + "\n" + reason);  // add at bottom
				aivPage.save();
			} );
			break;
			
		// Report inappropriate username
		case 'username':
			types = form.getChecked( 'arvtype' ).map( Morebits.string.toLowerCaseFirstChar );
			
			var hasShared = types.indexOf( 'shared' ) > -1;
			if ( hasShared ) {
				types.splice( types.indexOf( 'shared' ), 1 );
			}

			if ( types.length <= 2 ) {
				types = types.join( ' و ' );
			} else {
				types = [ types.slice( 0, -1 ).join( '، ' ), types.slice( -1 ) ].join( ' و ' );
			}
			/* 
			var article = 'ایک';
			if ( /[aeiouwyh]/.test( types[0] || '' ) ) { // non 100% correct, but whatever, including 'h' for Cockney
				article = 'ایک';
			}
			*/
			reason = "== [[صارف:"+ uid +"]] ==\n*{{user-uaa|1=" + uid + "}}\n";
			if ( types.length || hasShared ) {
				reason += "صارف نام کی حکمت عملی کی خلاف ورزی اس طرح " + types +
					( hasShared ? " کہ یہ صارف نام مشترکہ استعمال میں ہے " : ". " );
			}
			if ( comment !== '' ) {
				reason += Morebits.string.toUpperCaseFirstChar(comment) + ". ";
			}
			reason += "~~~~";
			reason = reason.replace(/\r?\n/g, "\n");  // indent newlines

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

			Morebits.wiki.actionCompleted.redirect = "ویکیپیڈیا:انتظامی توجہ درکار صارف نام";
			Morebits.wiki.actionCompleted.notice = "شکایت درج کر دی گئی";

			var uaaPage = new Morebits.wiki.page( 'ویکیپیڈیا:انتظامی توجہ درکار صارف نام', 'شکایت درج کی جا رہی ہے' );
			uaaPage.setFollowRedirect( true );

			uaaPage.load( function() {
				var text = uaaPage.getPageText();
				
				// check if user has already been reported
				if (new RegExp( "\\{\\{\\s*user-uaa\\s*\\|\\s*(1\\s*=\\s*)?" + window.RegExp.escape(uid, true) + "\\s*(\\||\\})" ).test(text)) {
					uaaPage.getStatusElement().error( 'صارف کا نام پہلے سے درج فہرست۔' );
					Morebits.status.printUserText( reason, 'البتہ آپ کے درج کردہ تبصرے ذیل میں موجود ہیں، اگر انہیں دستی طور پر موجودہ شکایت کے تحت درج کرنا چاہیں تو کر سکتے ہیں:' );
					return;
				}
				uaaPage.getStatusElement().status( 'نئی شکایت درج کی جا رہی ہے۔۔۔' );
				uaaPage.setEditSummary( 'صارف [[Special:Contributions/' + uid + '|' + uid + ']] کی شکایت کا اندراج'+ Twinkle.getPref('summaryAd') );
				uaaPage.setPageText( text + "\n" + reason);  // add at top
				uaaPage.save();
			} );
			break;
			
		// WP:SPI
		case "sock":
			/* falls through */
		case "puppet":
			var sockParameters = {
				evidence: form.evidence.value.trim(),
				checkuser: form.checkuser.checked,
				notify: form.notify.checked
			};

			var puppetReport = form.category.value === "puppet";
			if (puppetReport && !(form.sockmaster.value.trim())) {
				if (!confirm("آپ نے اس کٹھ پتلی کے جرابی کٹھ پتلی باز کے کھاتے کا نام درج نہیں کیا ہے۔ کیا آپ اس کھاتے کی بطور جرابی کٹھ پتلی باز شکایت درج کرنا چاہتے ہیں؟")) {
					return;
				}
				puppetReport = false;
			}

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

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

		case 'an3':
			var diffs = $.map( $('input:checkbox[name=s_diffs]:checked',form), function(o){ return $(o).data('revinfo'); });

			if (diffs.length < 3 && !confirm("آپ نے توہین آمیز ترمیمیں 3 سے کم منتخب کی ہیں۔ کیا آپ اس صورت میں شکایت درج کرنا چاہتے ہیں؟")) {
				return;
			}

			var warnings = $.map( $('input:checkbox[name=s_warnings]:checked',form), function(o){ return $(o).data('revinfo'); });

			if(!warnings.length && !confirm("آپ نے ان ترمیمیوں کو منتخب نہیں کیا جن میں متعلقہ صارف کو انتباہ دیا گیا ہے۔ کیا آپ اس صورت میں شکایت درج کرنا چاہتے ہیں؟")) {
				return;
			}

			var resolves = $.map( $('input:checkbox[name=s_resolves]:checked',form), function(o){ return $(o).data('revinfo'); });
			var free_resolves = $('input[name=s_resolves_free]').val();

			var an3_next = function(free_resolves) {
				if(!resolves.length && !free_resolves && !confirm("آپ نے ان ترمیمیوں کو منتخب نہیں کیا جن میں متعلقہ صارف سے صلح صفائی اور معاملہ حل کرنے کی کوشش کی گئی ہے۔ کیا آپ اس صورت میں شکایت درج کرنا چاہتے ہیں؟")) {
					return;
				}

				var an3Parameters = {
					'uid': uid,
					'page': form.page.value.trim(),
					'comment': form.comment.value.trim(),
					'diffs': diffs,
					'warnings': warnings,
					'resolves': resolves,
					'free_resolves': free_resolves
				};

				Morebits.simpleWindow.setButtonsEnabled( false );
				Morebits.status.init( form );
				Twinkle.arv.processAN3( an3Parameters );
			};

			if(free_resolves) {
				var oldid=mw.util.getParamValue('oldid',free_resolves);
				var api = new mw.Api();
				api.get({
					action: 'query',
					prop: 'revisions',
					format: 'json',
					rvprop: 'ids|timestamp|comment',
					indexpageids: true,
					revids: oldid
				}).done(function(data){
					var pageid = data.query.pageids[0];
					var page = data.query.pages[pageid];
					an3_next(page);
				}).fail(function(data){
					console.log( 'API failed :(', data );
				});
			} else {
				an3_next();
			}
			break;
	}
};

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

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

		// notify each puppet account
		for( var i = 0; i < socks.length; ++i ) {
			var sockTalkPage = new Morebits.wiki.page( 'تبادلۂ خیال صارف:' + socks[i], "اطلاع برائے " +  socks[i] );
			sockTalkPage.setFollowRedirect( true );
			sockTalkPage.setEditSummary( notifyEditSummary );
			sockTalkPage.setAppendText( notifyText );
			sockTalkPage.append( onSuccess );
		}
	}

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

	var reportpage = 'ویکیپیڈیا:صارف جانچ کی درخواست/' + params.uid;

	Morebits.wiki.actionCompleted.redirect = reportpage;
	Morebits.wiki.actionCompleted.notice = "شکایت درج کر دی گئی";

	var spiPage = new Morebits.wiki.page( reportpage, 'تبادلۂ خیال صفحہ اخذ کیا جا رہا ہے' );
	spiPage.setFollowRedirect( true );
	spiPage.setEditSummary( 'صارف [[Special:Contributions/' + params.uid + '|' + params.uid + ']] کی نئی شکایت درج کی گئی'+ Twinkle.getPref('summaryAd') );
	spiPage.setAppendText( text );
	switch( Twinkle.getPref( 'spiWatchReport' ) ) {
		case 'yes':
			spiPage.setWatchlist( true );
			break;
		case 'no':
			spiPage.setWatchlistFromPreferences( false );
			break;
		default:
			spiPage.setWatchlistFromPreferences( true );
			break;
	}
	spiPage.append();
	
	Morebits.wiki.removeCheckpoint();  // all page updates have been started
};

Twinkle.arv.processAN3 = function( params ) {
	// prepare the AN3 report
	var minid;
	for(var i = 0; i < params.diffs.length; ++i) {
		if( params.diffs[i].parentid && (!minid || params.diffs[i].parentid < minid)) {
			minid = params.diffs[i].parentid;
		}
	}

	var api = new mw.Api();
	api.get({
		action: 'query',
		prop: 'revisions',
		format: 'json',
		rvprop: 'sha1|ids|timestamp|comment',
		rvlimit: 100,
		rvstartid: minid,
		rvexcludeuser: params.uid,
		indexpageids: true,
		redirects: true,
		titles: params.page
	}).done(function(data){
		Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"
		var orig;
		if(data.length) {
			var sha1 = data[0].sha1;
			for(var i = 1; i < data.length; ++i) {
				if(data[i].sha1 == sha1) {
					orig = data[i];
					break;
				}
			}

			if(!orig) {
				orig = data[0];
			}
		}

		var origtext = "";
		if(orig) {
			origtext = '{{diff2|' + orig.revid + '|' + orig.timestamp + '}} "' + orig.comment + '"';
		}

		var grouped_diffs = {};

		var parentid, lastid;
		for(var j = 0; j < params.diffs.length; ++j) {
			var cur = params.diffs[j];
			if( cur.revid && cur.revid != parentid || lastid === null ) {
				lastid = cur.revid;
				grouped_diffs[lastid] = [];
			}
			parentid = cur.parentid;
			grouped_diffs[lastid].push(cur);
		}

		var difftext = $.map(grouped_diffs, function(sub, index){
			var ret = "";
			if(sub.length >= 2) {
				var last = sub[0];
				var first = sub.slice(-1)[0];
				var label = "لگاتار ترامیم از " + moment(first.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + " تا " + moment(last.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]');
				ret = "# {{diff|oldid="+first.parentid+"|diff="+last.revid+"|label="+label+"}}\n";
			}
			ret += sub.reverse().map(function(v){
				return (sub.length >= 2 ? '#' : '') + '# {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
			}).join("\n");
			return ret;
		}).reverse().join("\n");
		var warningtext = params.warnings.reverse().map(function(v){
			return '# ' + ' {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
		}).join("\n");
		var resolvetext = params.resolves.reverse().map(function(v){
			return '# ' + ' {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
		}).join("\n");

		if(params.free_resolves) {
			var page = params.free_resolves;
			var rev = page.revisions[0];
			resolvetext += "\n# " + ' {{diff2|' + rev.revid + '|' + moment(rev.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + ' در ' + page.title +  '}} "' + rev.comment + '"';
		}

		var comment = params.comment.replace(/~*$/g, '').trim();

		if(comment) {
			comment += " ~~~~";
		}

		var text = "\n\n"+'{{subst:AN3 report|diffs='+difftext+'|warnings='+warningtext+'|resolves='+resolvetext+'|pagename='+params.page+'|orig='+origtext+'|comment='+comment+'|uid='+params.uid+'}}';

		var reportpage = 'ویکیپیڈیا:تختۂ اعلانات برائے منتظمین/ترمیمی جنگ';

		Morebits.wiki.actionCompleted.redirect = reportpage;
		Morebits.wiki.actionCompleted.notice = "درخواست درج کر دی گئی";

		var an3Page = new Morebits.wiki.page( reportpage, 'تبادلہ خیال صفحہ اخذ کیا جا رہا ہے' );
		an3Page.setFollowRedirect( true );
		an3Page.setEditSummary( 'صارف [[Special:Contributions/' + params.uid + '|' + params.uid + ']] کی نئی شکایت درج کی گئی'+ Twinkle.getPref('summaryAd') );
		an3Page.setAppendText( text );
		an3Page.append();

		// notify user

		var notifyEditSummary = "ترمیمی جنگ سے متعلق تختہ اعلانات پر جاری گفتگو کی اطلاع" + Twinkle.getPref('summaryAd');
		var notifyText = "\n\n{{subst:an3-notice|1=" + mw.util.wikiUrlencode(params.uid) + "|auto=1}} ~~~~";

		var talkPage = new Morebits.wiki.page( 'تبادلۂ خیال صارف:' + params.uid, 'ترمیمی جنگجو کو مطلع کیا جا رہا ہے' );
		talkPage.setFollowRedirect( true );
		talkPage.setEditSummary( notifyEditSummary );
		talkPage.setAppendText( notifyText );
		talkPage.append();
		Morebits.wiki.removeCheckpoint();  // all page updates have been started
	}).fail(function(data){
		console.log( 'API failed :(', data );
	});
};
})(jQuery);


//</nowiki>