Utilizator:Anneto/Twinkle9.js

De la Wikipedia, enciclopedia liberă

Notă: După salvare, trebuie să treceți peste cache-ul browser-ului pentru a vedea modificările.

  • Mozilla, Google Chrome, Safari, Konqueror: țineți apăsat Shift în timp ce apăsați butonul Reload (sau apăsați Ctrl-Shift-R).
  • Internet Explorer: apăsați Ctrl-F5.
  • Opera: apăsați F5.
/**
 Twinklefluff revert and antivandalism utillity
 */
// If TwinkleConfig aint exist.
if( typeof( TwinkleConfig ) == 'undefined' ) {
    TwinkleConfig = {};
}
 <noinclude>[[Categorie:Utilizator:Anneto]]</noinclude>
/**
 TwinkleConfig.summaryAd (string)
 If ad should be added or not to summary, default [[WP:TWINKLE|TWINKLE]]
 */
if( typeof( TwinkleConfig.summaryAd ) == 'undefined' ) {
	TwinkleConfig.summaryAd = " ([[WP:TW|TW]])";
}
 
/**
 TwinkleConfig.revertMaxRevisions (int)
 defines how many revision to query maximum, maximum possible is 50, default is 50
 */
if( typeof( TwinkleConfig.revertMaxRevisions ) == 'undefined' ) {
	TwinkleConfig.revertMaxRevisions = 50;
}
 
/**
 TwinkleConfig.userTalkPageMode may take arguments:
 'window': open a new window, remember the opened window
 'tab': opens in a new tab, if possible.
 'blank': force open in a new window, even if a such window exist
 */
if( typeof( TwinkleConfig.userTalkPageMode ) == 'undefined' ) {
	TwinkleConfig.userTalkPageMode = 'window';
}
 
/**
 TwinkleConfig.openTalkPage (array)
 What types of actions that should result in opening of talk page
 */
if( typeof( TwinkleConfig.openTalkPage ) == 'undefined' ) {
	TwinkleConfig.openTalkPage = [ 'agf', 'norm', 'vand' ];
}
 
/**
 TwinkleConfig.openTalkPageOnAutoRevert (bool)
 Defines if talk page should be opened when canling revert from contrib page, this because from there, actions may be multiple, and opening talk page not suitable. If set to true, openTalkPage defines then if talk page will be opened.
 */
if( typeof( TwinkleConfig.openTalkPageOnAutoRevert ) == 'undefined' ) {
	TwinkleConfig.openTalkPageOnAutoRevert = false;
}
 
/**
 TwinkleConfig.markRevertedPagesAsMinor (array)
 What types of actions that should result in marking edit as minor
 */
if( typeof( TwinkleConfig.markRevertedPagesAsMinor ) == 'undefined' ) {
	TwinkleConfig.markRevertedPagesAsMinor = [ 'vand' ];
}
 
/**
 TwinkleConfig.watchRevertedPages (array)
 What types of actions that should result in forced addition to watchlist
 */
if( typeof( TwinkleConfig.watchRevertedPages ) == 'undefined' ) {
	TwinkleConfig.watchRevertedPages = [ 'agf', 'norm', 'vand', 'torev' ];
}
 
/**
 TwinkleConfig.offerReasonOnNormalRevert (boolean)
 If to offer a promt for extra summary reason for normal reverts, default to true
 */
if( typeof( TwinkleConfig.offerReasonOnNormalRevert ) == 'undefined' ) {
	TwinkleConfig.offerReasonOnNormalRevert = true;
}
 
/**
 TwinkleConfig.showRollbackLinks (array)
 Where Twinkle should show rollback links (diff, others, mine, contribs)
 */
if( typeof( TwinkleConfig.showRollbackLinks ) == 'undefined' ) {
	TwinkleConfig.showRollbackLinks = [ 'diff', 'others' ];
}
 
// a list of usernames, usually only bots, that vandalism revert is jumped over, that is
// if vandalism revert was chosen on such username, then it's target in on the revision before.
// This is for handeling quick bots that makes edits seconds after the original edit is made.
// This only affect vandalism rollback, for good faith rollback, it will stop, indicating a bot 
// has no faith, and for normal rollback, it will rollback that edit.
var WHITELIST = [
	'HagermanBot',
	'SineBot',
	'HBC AIV helperbot',
	'HBC AIV helperbot2',
	'HBC AIV helperbot3',
]
 
twinklefluff = {
	auto: function() {
		if( parseInt( QueryString.get('oldid'), 10) !== mw.config.get('wgCurRevisionId') ) {
			// not latest revision
			alert("Nu se poate reveni, pagina s-a modificat între timp.");
			return;
		}
 
		var ntitle = getElementsByClassName( document.getElementById('bodyContent'), 'td' , 'diff-ntitle' )[0];
		vandal = ntitle.getElementsByTagName('a')[3].firstChild.nodeValue;
 
		twinklefluff.revert( QueryString.get( 'twinklerevert' ), vandal, true );
	},
	normal: function() {
 
		var spanTag = function( color, content ) {
			var span = document.createElement( 'span' );
			span.style.color = color;
			span.appendChild( document.createTextNode( content ) );
			return span;
		};
 
		if( mw.config.get('wgNamespaceNumber') === -1 && mw.config.get('wgCanonicalSpecialPageName') === "Contributions" ) {
			//Get the username these contributions are for
			username = decodeURIComponent(/user=(.+)/.exec($('div#contentSub a[title="Special:Log"]').last().attr("href").replace(/\+/g, "%20"))[1]);
			if( Twinkle.getPref('showRollbackLinks').indexOf('contribs') !== -1 || 
				( mw.config.get('wgUserName') !== username && Twinkle.getPref('showRollbackLinks').indexOf('others') !== -1 ) || 
				( mw.config.get('wgUserName') === username && Twinkle.getPref('showRollbackLinks').indexOf('mine') !== -1 ) ) {
				var list = $("div#bodyContent ul li:has(span.mw-uctop)");
 
				var revNode = document.createElement('strong');
				var revLink = document.createElement('a');
				revLink.appendChild( spanTag( 'Black', '[' ) );
				revLink.appendChild( spanTag( 'SteelBlue', 'rollback' ) );
				revLink.appendChild( spanTag( 'Black', ']' ) );
				revNode.appendChild(revLink);
 
				var revVandNode = document.createElement('strong');
				var revVandLink = document.createElement('a');
				revVandLink.appendChild( spanTag( 'Black', '[' ) );
				revVandLink.appendChild( spanTag( 'Red', 'vandalism' ) );
				revVandLink.appendChild( spanTag( 'Black', ']' ) );
				revVandNode.appendChild(revVandLink);
 
				list.each(function(key, current) {
					var href = $(current).children("a:eq(1)").attr("href");
					current.appendChild( document.createTextNode(' ') );
					var tmpNode = revNode.cloneNode( true );
					tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'twinklerevert': 'norm' } ) );
					current.appendChild( tmpNode );
					current.appendChild( document.createTextNode(' ') );
					tmpNode = revVandNode.cloneNode( true );
					tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'twinklerevert': 'vand' } ) );
					current.appendChild( tmpNode );
				});
			}
		} else {
 
			if( mw.config.get('wgCanonicalSpecialPageName') === "Special:Undelete" ) {
				//You can't rollback deleted pages!
				return;
			}
 
			var body = document.getElementById('bodyContent');
 
			var firstRev = $("div.firstrevisionheader").length;
			if( firstRev ) {
				// we have first revision here, nothing to do.
				return;
			}
 
			var otitle, ntitle;
			try {
				var otitle1 = document.getElementById('mw-diff-otitle1'); 
				var ntitle1 = document.getElementById('mw-diff-ntitle1'); 
				if (!otitle1 || !ntitle1) {
					return;
				}
				otitle = otitle1.parentNode;
				ntitle = ntitle1.parentNode;
			} catch( e ) {
				// no old, nor new title, nothing to do really, return;
				return;
			}
 
			var old_rev_url = $("div#mw-diff-otitle1 strong a").attr("href");
 
			// Lets first add a [edit this revision] link
			var query = new QueryString( old_rev_url.split( '?', 2 )[1] );
 
			var oldrev = query.get('oldid');
 
			var revertToRevision = document.createElement('div');
			revertToRevision.setAttribute( 'id', 'tw-revert-to-orevision' );
			revertToRevision.style.fontWeight = 'bold';
 
			var revertToRevisionLink = revertToRevision.appendChild( document.createElement('a') );
			revertToRevisionLink.href = "#";
			$(revertToRevisionLink).click(function(){
				twinklefluff.revertToRevision(oldrev);
			});
			revertToRevisionLink.appendChild( spanTag( 'Black', '[' ) );
			revertToRevisionLink.appendChild( spanTag( 'SaddleBrown', 'restore this version' ) );
			revertToRevisionLink.appendChild( spanTag( 'Black', ']' ) );
 
			otitle.insertBefore( revertToRevision, otitle.firstChild );
 
			if( document.getElementById('differences-nextlink') ) {
				// Not latest revision
				curVersion = false;
 
				var new_rev_url = $("div#mw-diff-ntitle1 strong a").attr("href");
				query = new QueryString( new_rev_url.split( '?', 2 )[1] );
				var newrev = query.get('oldid');
				revertToRevision = document.createElement('div');
				revertToRevision.setAttribute( 'id', 'tw-revert-to-nrevision' );
				revertToRevision.style.fontWeight = 'bold';
				revertToRevisionLink = revertToRevision.appendChild( document.createElement('a') );
				revertToRevisionLink.href = "#";
				$(revertToRevisionLink).click(function(){
					twinklefluff.revertToRevision(newrev);
				});
				revertToRevisionLink.appendChild( spanTag( 'Black', '[' ) );
				revertToRevisionLink.appendChild( spanTag( 'SaddleBrown', 'restore this version' ) );
				revertToRevisionLink.appendChild( spanTag( 'Black', ']' ) );
				ntitle.insertBefore( revertToRevision, ntitle.firstChild );
 
				return;
			}
			if( Twinkle.getPref('showRollbackLinks').indexOf('diff') != -1 ) {
				var vandal = $("#mw-diff-ntitle2 a").first().text().replace("'", "\\'");
 
				var revertNode = document.createElement('div');
				revertNode.setAttribute( 'id', 'tw-revert' );
 
				var agfNode = document.createElement('strong');
				var vandNode = document.createElement('strong');
				var normNode = document.createElement('strong');
 
				var agfLink = document.createElement('a');
				var vandLink = document.createElement('a');
				var normLink = document.createElement('a');
 
				agfLink.href = "#"; 
				vandLink.href = "#"; 
				normLink.href = "#"; 
				$(agfLink).click(function(){
					twinklefluff.revert('agf', vandal);
				});
				$(vandLink).click(function(){
					twinklefluff.revert('vand', vandal);
				});
				$(normLink).click(function(){
					twinklefluff.revert('norm', vandal);
				});
 
				agfLink.appendChild( spanTag( 'Black', '[' ) );
				agfLink.appendChild( spanTag( 'DarkOliveGreen', 'revenire (BC)' ) );
				agfLink.appendChild( spanTag( 'Black', ']' ) );
 
				vandLink.appendChild( spanTag( 'Black', '[' ) );
				vandLink.appendChild( spanTag( 'Red', 'revenire (VANDAL)' ) );
				vandLink.appendChild( spanTag( 'Black', ']' ) );
 
				normLink.appendChild( spanTag( 'Black', '[' ) );
				normLink.appendChild( spanTag( 'SteelBlue', 'revenire' ) );
				normLink.appendChild( spanTag( 'Black', ']' ) );
 
				agfNode.appendChild(agfLink);
				vandNode.appendChild(vandLink);
				normNode.appendChild(normLink);
 
				revertNode.appendChild( agfNode );
				revertNode.appendChild( document.createTextNode(' || ') );
				revertNode.appendChild( normNode );
				revertNode.appendChild( document.createTextNode(' || ') );
				revertNode.appendChild( vandNode );
 
				ntitle.insertBefore( revertNode, ntitle.firstChild );
			}
		}
	}
}
 
twinklefluff.revert = function revertPage( type, vandal, rev, page ) {
 
	var pagename = page || mw.config.get('wgPageName');
	var revid = rev || mw.config.get('wgCurRevisionId');
 
	Status.init( document.getElementById('bodyContent') );
	var params = {
		type: type,
		user: vandal,
		pagename: pagename,
		revid: revid,
		autoRevert: !!autoRevert
	};
	var query = {
		'action': 'query',
		'prop': ['info', 'revisions'],
		'titles': pagename,
		'rvlimit': 50, // max possible
		'rvprop': [ 'ids', 'timestamp', 'user', 'comment' ],
		'intoken': 'edit'
	};
	var wikipedia_api = new Wikipedia.api( 'Aduc date despre versiunea anterioară', query, Twinkle.fluff.callbacks.main );
	wikipedia_api.params = params;
	wikipedia_api.post();
}
 
twinklefluff.revertToRevision = function revertToRevision( oldrev ) {
 
	Status.init( document.getElementById('bodyContent') );
 
	var query = {
		'action': 'query',
		'prop': ['info',  'revisions'],
		'titles': mw.config.get('wgPageName'),
		'rvlimit': 1,
		'rvstartid': oldrev,
		'rvprop': [ 'ids', 'timestamp', 'user', 'comment' ],
		'intoken': 'edit',
		'format': 'xml'
	};
	var wikipedia_api = new Wikipedia.api( 'Grabbing data of the earlier revision', query, Twinkle.fluff.callbacks.toRevision.main );
	wikipedia_api.params = { rev: oldrev };
	wikipedia_api.post();
}
 
twinklefluff.userIpLink = function( user ) {
	return (isIPAddress(user)?"[[Special:Contributions/":"[[Utilizator:")+user+"|"+user+"]]";
}
 
twinklefluff.callbacks = {
	toRevision: {
		main: function( self ) {
			var xmlDoc = self.responseXML;
			self.params.revision = xmlDoc.evaluate('//rev', xmlDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;
			var query = {
				'title': wgPageName,
				'action': 'submit'
			};
			var wikipedia_wiki = new Wikipedia.wiki( 'Restaurez versiunea', query, twinklefluff.callbacks.toRevision.reverting );
			wikipedia_wiki.params = self.params;
			wikipedia_wiki.get();
 
		},
		reverting: function( self ) {
			var form = self.responseXML.getElementById( 'editform' );
			var text = self.params.revision.textContent;
 
			if( !form ) {
				self.statelem.error( 'nu am putut găsi elementul "editform", întrerup procesul, aceasta poate indica un răspuns greşit de la server' );
				return;
			}
 
			var optional_summary = prompt( "Vă rog, dacă este posibil, să specificaţi un motiv pentru revenire" );
			if (optional_summary == null)
			{
				self.statelem.error( 'Revocat de utilizator.' );
				return;
			}
			var summary = sprintf( "Revenire la versiunea %d de către %s%s.%s",   
				self.params.revision.getAttribute( 'revid' ),
				self.params.revision.getAttribute( 'user' ),
				optional_summary ? "; " + optional_summary : '',
				TwinkleConfig.summaryAd
			);
			var postData = {
			    'oldid': self.params.revision.getAttribute( 'revid' ),
			    'baseRevId': self.params.revision.getAttribute( 'revid' ),
				'wpMinoredit': TwinkleConfig.markRevertedPagesAsMinor.indexOf( 'torev' ) != -1 ? '' : undefined, 
				'wpWatchthis': TwinkleConfig.watchRevertedPages.indexOf( 'torev' ) != -1 ? '' : form.wpWatchthis.checked ? '' : undefined,
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': '',
				'wpSummary': summary,
				'wpTextbox1': text
			};
			Wikipedia.actionCompleted.redirect = wgPageName;
			Wikipedia.actionCompleted.notice = "Revenire încheiată"
 
			self.post( postData );
		}
	},
	main: function( self ) {
 
		var xmlDoc = self.responseXML;
		var revs = xmlDoc.evaluate( '//rev', xmlDoc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
 
		if( revs.snapshotLength < 1 ) {
			self.statitem.error( 'Avem mai puţin de o versiune adiţională, deci este imposibil de revenit' );
			return;
		}
		var top = revs.snapshotItem(0);
		if( top.getAttribute( 'revid' ) < wgCurRevisionId ) {
			Status.error( 'Eroare', [ 'Numărul modificării primit ', htmlNode( 'strong', top.getAttribute('revid') ), ' este mai mic decât numărul modificării actuale, aceasta poate însemna că modificarea curentă a fost ştearsă, serverul are întârziere, sau că au fost recepţionate date incorecte. Opresc procesul în acest punct.' ] );
			return;
		}
		var index = 1;
		if( wgCurRevisionId != top.getAttribute('revid') ) {
			Status.warn( 'Warning', [ 'Latest revision ', htmlNode( 'strong', top.getAttribute('revid') ), ' doesn\'t equal our revision ', htmlNode( 'strong', wgCurRevisionId) ] );
			if( top.getAttribute( 'user' ) == self.params.user ) {
				switch( self.params.type ) {
				case 'vand':
					Status.info( 'Info', [ 'Ultima modificare a fost efectuată de ', htmlNode( 'strong', self.params.user ) , ', cum aţi ales vandalism, continuăm revenirea' ]); 
					break;
				case 'agf':
					Status.warn( 'Avertisment', [ 'Ultima modificare a fost efectuată de ', htmlNode( 'strong', self.params.user ) , ', cum aţi ales bună credinţă, opresc revenirea, poate problema a fost rezolvată.' ]); 
					return;
				default:
					Status.warn( 'Notificare', [ 'Ultima modificare a fost efectuată de ', htmlNode( 'strong', self.params.user ) , ', dar vom opri revenirea oricum.' ] ); 
					return;
				}
			}
			else if( 
				self.params.type == 'vand' && 
				WHITELIST.indexOf( top.getAttribute( 'user' ) ) != -1 && revs.snapshotLength > 1 &&
				revs.snapshotItem(1).getAttribute( 'pageId' ) == wgCurRevisionId 
			) {
				Status.info( 'Info', [ 'Ultima modificare a fost efectuată de ', htmlNode( 'strong', top.getAttribute( 'user' ) ), ', un robot de pe lista albă şi revizia de dinainte a fost efectuată de vandal, deci continuăm revenirea.' ] ); 
				index = 2;
			} else {
				Status.error( 'Eroare', [ 'Ultima modificare a fost efectuată de ', htmlNode( 'strong', top.getAttribute( 'user' ) ), ', deci s-ar putea să se fi revenit deja la o versiune corectă, opresc revenirea.'] ); 
				return;
			}
 
		}
 
		if( WHITELIST.indexOf( self.params.user ) != -1  ) {
			switch( self.params.type ) {
			case 'vand':
				Status.info( 'Info', [ 'Revenirea pentru vandalism a fost selectată pentru ', htmlNode( 'strong', self.params.user ), ', un robot de încredere, deci considerăm că doriţi să anulaţi vandalismul efectuat de utilizatorul de dinainte.' ] ); 
				index = 2;
				vandal = revs.snapshotItem(1).getAttribute( 'user' );
				self.params.user = revs.snapshotItem(1).getAttribute( 'user' );
				break;
			case 'agf':
				Status.warn( 'Notificare', [ 'Revenirea pentru rea credinţă a fost selectată pentru ', htmlNode( 'strong', self.params.user ), ', un robot de încredere, deci nu are niciun sens să anulăm modificarea pentru rea credinţă, opresc revenirea.' ] ); 
				return;
 
				break;
			case 'norm':
			default:
				var cont = confirm( 'Revenirea normală a fost selectată, dar modificarea aparţine utilizatorului (' + self.params.user + ') un robot de încredere, doriţi să anulaţi modificarea de dinainte în loc?' ); 
				if( cont ) {
					Status.info( 'Info', [ 'Revenirea normală a fost selectată pentru ', htmlNode( 'strong', self.params.user ), ', un robot de încredere, dar după cum aţi confirmat, vom anula modificarea de dinainte.' ] ); 
					index = 2;
					self.params.user = revs.snapshotItem(1).getAttribute( 'user' );
				} else {
					Status.warn( 'Notificare', [ 'Revenirea normală a fost selectată pentru ', htmlNode( 'strong', self.params.user ), ', un robot de încredere, dar după cum aţi confirmat, revenirea va continua.' ] ); 
				}
				break;
			}
		}
		var found = false;
		var count = 0;
 
		for( var i = index; i < revs.snapshotLength; ++i ) {
			++count;
			if( revs.snapshotItem(i).getAttribute( 'user' ) != self.params.user ) {
				found = i;
				break;
			}
		}
 
 
		if( ! found ) {
			self.statelem.error( [ 'Nicio modificare anterioară nu a fost găsită, probabil că ', htmlNode( 'strong', self.params.user ), ' este singurul contribuitor, sau că utilizatorul a efectuat mai mult de ' + TwinkleConfig.revertMaxRevisions + ' modificări în serie.' ] ); 
			return;
 
		}
 
		if( count == 0 ) {
			Status.error( 'Eroare', "Avem de revenit zero modificări. Cum nu are niciun sens, nu vom mai continua. Aceasta poate însemna că modificarea a fost deja anulată, dar numărul modificării este acelaşi." ); 
			return;
		}
 
		var good_revision = revs.snapshotItem( found );
 
		if( 
			self.params.type != 'vand' && 
			count > 1  && 
			!confirm( self.params.user + ' a efectuat ' + count + ' modificări în serie. Sunteţi sigur că doriţi să le anulaţi pe toate?' ) 
		) {
			Status.info( 'Notificare', 'Opresc revenire datorită dorinţei utilizatorului' ); 
			return;
		}
 
		self.params.count = count;
 
		self.params.goodid = good_revision.getAttribute( 'revid' );
		self.params.gooduser = good_revision.getAttribute( 'user' );
 
 
		self.statelem.status( [ ' revizia ', htmlNode( 'strong', good_revision.getAttribute( 'revid' ) ), ' care a fost efectuată ', htmlNode( 'strong', count ), ' modificări mai înainte de ', htmlNode( 'strong', good_revision.getAttribute( 'user' ) ) ] ); 
 
		var query = {
			'action': 'query',
			'prop': 'revisions',
			'titles': wgPageName,
			'rvlimit': 1,
			'rvprop': 'content',
			'rvstartid': good_revision.getAttribute( 'revid' )
		}
 
		var wikipedia_api = new Wikipedia.api( [ 'Aduc conţinutul pentru revenire ', htmlNode( 'strong', good_revision.getAttribute( 'revid' ) ) ], query, twinklefluff.callbacks.grabbing ); 
		wikipedia_api.params = self.params;
		wikipedia_api.post();
	},
	grabbing: function( self ) {
 
		xmlDoc = self.responseXML;
 
		self.params.content = xmlDoc.evaluate( '//rev[1]', xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;
 
		var query = {
			'title': wgPageName,
			'action': 'submit'
		};
		var wikipedia_wiki = new Wikipedia.wiki( 'Reverting page', query, twinklefluff.callbacks.reverting );
		wikipedia_wiki.params = self.params;
		wikipedia_wiki.get();
	},
	reverting: function( self ) {
		var doc = self.responseXML;
 
		var form = doc.getElementById( 'editform' );
		if( !form ) {
			self.statelem.error( 'nu am găsit elementul "editform", opresc procesul, aceasta poate indica un răspuns greşit de la server' ); 
			return;
		}
 
		var text = self.params.content;
		if( !text ) {
			self.statelem.error( 'nu am primit nicio modificare, ceva este greşit, opresc procesul!' ); 
			return;
		}
 
		var summary;
 
		switch( self.params.type ) {
		case 'agf':
			var extra_summary = prompt( "Un alt comentariu pentru descrierea modificării:" ); 
			if (extra_summary == null)
			{
				self.statelem.error( 'Revocat de utilizator.' ); 
				return;
			}
			summary = sprintf( "Anularea modificărilor de [[WP:BC|bună credinţă]] de către [[Special:Contributions/%s|%1$s]] ([[User talk:%1$s|discuție]])%s.%s", 
				self.params.user.replace("\\'", "'"), 
				extra_summary ? "; " + extra_summary.toUpperCaseFirstChar() : '',
				TwinkleConfig.summaryAd
			);
			break;
		case 'vand':
			summary = sprintf( "Anulare %d %s de către [[Special:Contributions/%s|%3$s]] ([[User talk:%3$s|discuție]]) identificate ca [[WP:VAND|vandalism]] şi revenire la ultima modificare de către %s.%s", 
				self.params.count, 
				self.params.count > 1 ? 'modificări': 'modificare', 
				self.params.user.replace("\\'", "'"),
				self.params.gooduser.replace("\\'", "'"),
				TwinkleConfig.summaryAd
			);
			break;
		case 'norm':
			if( TwinkleConfig.offerReasonOnNormalRevert ) {
				var extra_summary = prompt( "Un comentariu opţional pentru descrierea modificărilor:" );
				if (extra_summary == null)
				{
					self.statelem.error( 'Revocat de utilizator.' );
					return;
				}
			}
			summary = sprintf( "Anulare %d %s de către [[Special:Contributions/%s|%3$s]] ([[User talk:%3$s|discuţie]])%s.%s", 
				self.params.count, 
				self.params.count > 1 ? 'modificări': 'modificare', 
				self.params.user.replace("\\'", "'"),
				extra_summary ? "; " + extra_summary.toUpperCaseFirstChar() : '',
				TwinkleConfig.summaryAd 
			);
		}
 
		if( TwinkleConfig.openTalkPage.indexOf( self.params.type ) != -1 ) {
			Status.info( 'Info', [ 'Deschid pagina de discuţie a utilizatorului în modulul de modificare ', htmlNode( 'strong', self.params.user ) ] );
 
			var query = {
				'title': 'Discuție Utilizator:' + self.params.user,
				'action': 'edit',
				'preview': 'yes',
				'vanarticle': wgPageName.replace(/_/g, ' '),
				'vanarticlerevid': wgCurRevisionId,
				'vanarticlegoodrevid': self.params.goodid,
				'type': self.params.type,
				'count': self.params.count
			}
 
			switch( TwinkleConfig.userTalkPageMode ) {
			case 'tab':
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + QueryString.create( query ), '_tab' );
				break;
			case 'blank':
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + QueryString.create( query ), '_blank', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
				break;
			case 'window':
			default:
				window.open( mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?' + QueryString.create( query ), 'twinklewarnwindow', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
				break;
			}
		}
 
		var postData = {
		    'oldid': self.params.goodid,
		    'baseRevId': self.params.goodid,
			'wpMinoredit': TwinkleConfig.markRevertedPagesAsMinor.indexOf( self.params.type ) != -1  ? '' : undefined,
			'wpWatchthis': TwinkleConfig.watchRevertedPages.indexOf( self.params.type ) != -1 ? '' : form.wpWatchthis.checked ? '' : undefined,
			'wpStarttime': form.wpStarttime.value,
			'wpEdittime': form.wpEdittime.value,
			'wpAutoSummary': form.wpAutoSummary.value,
			'wpEditToken': form.wpEditToken.value,
			'wpSection': '',
			'wpSummary': summary,
			'wpTextbox1': text
		};
 
		Wikipedia.actionCompleted.redirect = wgPageName;
		Wikipedia.actionCompleted.notice = "Revenire încheiată"
 
		self.post( postData );
	}
}
 
$( function() {
	if (window.twinkleConfigExists)
	{
		if( QueryString.exists( 'twinklerevert' ) ) {
			twinklefluff.auto();
		} else {
			twinklefluff.normal();
		}
	}
});