मीडियाविकि:Gadget-twinklearv.js

मुक्त ज्ञानकोश विकिपीडिया से

सूचना: यह पृष्ठ सुरक्षित करने बाद, परिवर्तनों को देखने लिए ब्राउज़र का कैश ख़ाली करने की आवश्यकता हो सकती है।

  • मोज़िला / फ़ायरफ़ॉक्स / सफ़ारी: shift hold करें जब आप reload क्लिक करते है, या Ctrl-Shift-R (अपल मैक में Cmd-Shift-R) दबाएँ;
  • गूगल क्रोम: Ctrl-shift-R (मैक में Cmd-Shift-R) दबाएँ
  • इंटरनेट एक्सप्लोरर: Ctrl hold करें जब आप refresh क्लिक करते हैं, या Ctrl-F5 क्लिक करते हैं;
  • कॉङ्करर: सिर्फ़ Reload बटन पर क्लिक करें, या F5 क्लिक करें;
  • ऑपरा सदस्य को Tools→Preferences में सम्पूर्ण कैश ख़ाली करने की ज़रूरत हो सकती है।
//<nowiki>


(function($){


/*
 ****************************************
 *** 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() {
	var username = mw.config.get('wgRelevantUserName');
	if ( !username ) {
		return;
	}

	var title = mw.util.isIPAddress( username ) ? 'आइपी के बारे में प्रबंधकों को रिपोर्ट करें' : 'सदस्य को रिपोर्ट करें';

	Twinkle.addPortletLink( function(){ Twinkle.arv.callback(username); }, "ARV", "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( "निर्देश:बर्बरता हेतु", "WP:GAIV" );
	Window.addFooterLink( "सदस्यनाम हेतु", "WP:UAAI" );
	Window.addFooterLink( "कठपुतली हेतु", "WP:SPI" );
	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: mw.util.getParamValue('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: 'यह दो संपादनों के मध्य अंतर देखते समय यूआरएल में दिख रहे oldid= का मान होता है।अंतर की कड़ी न जोड़ना चाहें तो खाली छोड़ दें।',
				value: mw.util.getParamValue('vanarticlerevid') || '',
				disabled: !mw.util.getParamValue('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: mw.util.getParamValue('vanarticlegoodrevid') || '',
				disabled: !mw.util.getParamValue('vanarticle') || mw.util.getParamValue('vanarticlerevid')
			} );
		work_area.append( {
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'अंतिम (4 बार) चेतावनी के बाद भी बर्बरता',
						value: 'final'
					},
					{
						label: 'हाल ही (1 दिन) में अवरोध की समाप्ति के बाद बर्बरता',
						value: 'postblock'
					},
					{
						label: 'स्पष्ट प्रतीत हो कि केवल-बर्बरता खाता है',
						value: 'vandalonly',
						disabled: mw.util.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: 'Wikipedia does not allow usernames that are misleading, promotional, offensive or disruptive. Domain names and email 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: 'Misleading usernames imply relevant, misleading things about the contributor. For example, misleading points of fact, an impression of undue authority, or usernames giving the impression of a bot account.'
					},
					{
						label: 'प्रचार सदस्यनाम',
						value: 'promotional',
						tooltip: 'Promotional usernames are advertisements for a company, website or group. Please do not report these names to UAA unless the user has also made promotional edits related to the name.'
					},
					{
						label: 'सदस्यनाम जिससे पता चले कि कई लोग खाता साझा कर रहे',
						value: 'shared',
						tooltip: 'Usernames that imply the likelihood of shared use (names of companies or groups, or the names of posts within organizations) are not permitted. Usernames are acceptable if they contain a company or group name but are clearly intended to denote an individual person, such as "Mark at WidgetsUSA", "Jack Smith at the XY Foundation", "WidgetFan87", etc.'
					},
					{
						label: 'मानहानिकर/आपत्तिजनक सदस्यनाम',
						value: 'offensive',
						tooltip: 'Offensive usernames make harmonious editing difficult or impossible.'
					},
					{
						label: 'विघटनकारी सदस्यनाम',
						value: 'disruptive',
						tooltip: 'Disruptive usernames include outright trolling or personal attacks, or otherwise show a clear intent to disrupt Wikipedia.'
					}
				]
			} );
		work_area.append( {
				type: 'textarea',
				name: 'reason',
				label: 'टिप्पणी:'
			} );
		work_area = work_area.render();
		old_area.parentNode.replaceChild( work_area, old_area );
		break;

	case 'puppet':
		work_area = new Morebits.quickForm.element( {
				type: 'field',
				label: 'संदिग्ध कठपुतली रिपोर्ट करें',
				name: 'work_area'
			} );
		work_area.append(
			{
				type: 'input',
				name: 'sockmaster',
				label: 'कठपुतली संचालक',
				tooltip: 'The username of the sockpuppeteer (sockmaster) without the User:-prefix'
			}
		);
		work_area.append( {
				type: 'textarea',
				label: 'प्रमाण:',
				name: 'evidence',
				tooltip: 'Enter your evidence. It should make clear that each of these users is likely to be abusing multiple accounts. Usually this means diffs, page histories or other information that justifies why the users are a) the same and b) disruptive. This should purely be evidence and information needed to judge the matter. Avoid all other discussion that is not evidence of sockpuppetry or other multiple account abuse.'
			} );
		work_area.append( {
				type: 'checkbox',
				list: [
					{
						label: 'चेकयूजर (कठपुतली जाँच) द्वारा प्रमाण हेतु अनुरोध करें',
						name: 'checkuser',
						tooltip: 'चेकयूजर (कठपुतली जाँच) मेटा पर कराई जा सकती है यदि पर्याप्त कारण उपलब्ध हों। ध्यान रहे कि यह बिना पर्याप्त कारणों के नहीं कराई जा सकती, अतः अपने संदेह को पर्याप्त और मज़बूत कारणों के साथ ही प्रस्तुत करें। '
					},
					{
						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+'" स्थित है: <a href="'+mw.config.get('wgScript')+'?diff='+rev.revid+'">'+moment(rev.timestamp).calendar()+'</a></span>').appendTo($diffs);
					}
				}).fail(function(data){
					console.log( 'एपीआइ विफल :(', data ); // eslint-disable-line no-console
				});
				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: 'सदस्य वार्ता:' + 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+'" स्थित है: <a href="'+mw.config.get('wgScript')+'?diff='+rev.revid+'">'+moment(rev.timestamp).calendar()+'</a></span>').appendTo($warnings);
					}
				}).fail(function(data){
					console.log( 'एपीआइ विफल :(', data ); // eslint-disable-line no-console
				});

				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+'" स्थित है: <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': 'अन्यत्र चर्चा के अवतरण अंतर: '
					});
					$free_entry.append($free_label).append($free_input).appendTo($resolves);

				}).fail(function(data){
					console.log( 'एपीआइ विफल :(', data ); // eslint-disable-line no-console
				});
			}
		} );
		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 = '[[' + 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*" + 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.setAppendText( '\n{{subst:VandalReportHeader}}\n*{{' + ( mw.util.isIPAddress( uid ) ? 'IPvandal' : 'vandal' ) + '|' + (/=/.test( uid ) ? '1=' : '' ) + uid + '}} &ndash; ' + reason );
				aivPage.append();
			} );
			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( ' 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, including 'h' for Cockney
				article = 'an';
			}
			reason = "*{{user-uaa|1=" + uid + "}} &ndash; ";
			if ( types.length || hasShared ) {
				reason += "सदस्यनाम नीति उल्लंघन का कारण " + article + " " + types + " username" +
					( 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*)?" + RegExp.escape(uid, true) + "\\s*(\\||\\})" ).test(text)) {
					uaaPage.getStatusElement().error( 'सदस्य पहले ही वहाँ सूचीबद्ध है ।' );
					Morebits.status.printUserText( reason, 'आपके द्वारा दी गई टिप्पणी निम्नवत है, यदि आप इसे मैनुअली उस पहले से मौजूद रिपोर्ट के नीचे दर्ज करना चाहें, कॉपी कर सकते हैं।' );
					return;
				}
				uaaPage.getStatusElement().status( 'नई रिपोर्ट जोड़ी जा रही...' );
				uaaPage.setEditSummary( '[[विशेष:योगदान/' + uid + '|' + uid + ']] के लिए रिपोर्ट जोड़ी जा रही।'+ Twinkle.getPref('summaryAd') );
				uaaPage.setPageText( text + "\n{{subst:UaaReportHeader}}\n\n" + reason );
				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())) {
				alert("आपने इस कठपुतली खाते के लिए कोई संचालक खाता नहीं दिया है। आप इसे कठपुतली संचालक खाते के रूप में नामांकित करने पर विचार करें।");
				return;
			} else if (!puppetReport && !(form.sockpuppet[0].value.trim())) {
				alert("आपने इस कठपुतली संचालक के लिए कोई अन्य संदिग्ध कठपुतली खाते नहीं दिए हैं। इसे किसी अन्य संचालक की कठपुतली रिपोर्ट करने पर विचार करें।");
				return;
			}

			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("आपने ने तीन से कम ऐसे आपत्तिजनक संपादन चुने हैं। फिर भी आप रिपोर्ट दर्ज करना चाहते हैं?")) {
				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( 'एपीआइ विफल :(', data ); // eslint-disable-line no-console
				});
			} 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|sockpuppet=" + params.uid + "|socksraw=" +
		params.sockpuppets.map( function(v) {
				return "* {{" + ( mw.util.isIPAddress( v ) ? "checkip" : "checkuser" ) + "|1=" + v + "}}";
			} ).join( "\n" ) + "\n|evidence=" + params.evidence + " \n";
	/*if ( params.checkuser ) {
		text += "|checkuser=no";
	}*/
	text += "}}";

	var reportpage = 'विकिपीडिया:प्रबन्धक सूचनापट';

	Morebits.wiki.actionCompleted.redirect = reportpage;
	Morebits.wiki.actionCompleted.notice = "रिपोर्ट प्रकृया पूर्ण हुई";

	var spiPage = new Morebits.wiki.page( reportpage, 'चर्चा पृष्ठ हासिल किया जा रहा' );
	spiPage.setFollowRedirect( true );
	spiPage.setEditSummary( '[[विशेष:योगदान/' + params.uid + '|' + params.uid + ']] के लिए नई रिपोर्ट जोड़ी जा रही।'+ Twinkle.getPref('summaryAd') );
	spiPage.setAppendText( text );
	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) {
			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( '[[विशेष:योगदान/' + 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( 'एपीआइ विफल रही :(', data ); // eslint-disable-line no-console
	});
};
})(jQuery);


//</nowiki>