Karber:Mirzali/Twinkle/Dewriya.js

Note: After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold down Shift while clicking Reload, or press Ctrl-Shift-R (Cmd-Shift-R on Apple Mac); IE: hold Ctrl while clicking Refresh, or press Ctrl-F5; Konqueror:: simply click the Reload button, or press F5; Opera users may need to completely clear their cache in Tools→Preferences.

if (twinkleConfigExists)
{
 
/**
 Twinklefluff revert and antivandalism utillity
 */
// If TwinkleConfig aint exist.
if( typeof( TwinkleConfig ) == 'undefined' ) {
	TwinkleConfig = {};
}
 
/**
 TwinkleConfig.summaryAd (string)
 If ad should be added or not to summary, default [[WP:TWINKLE|TWINKLE]]
 */
if( typeof( TwinkleConfig.summaryAd ) == 'undefined' ) {
	TwinkleConfig.summaryAd = " ([[VP:TW|Twinkle]])";
}
 
/**
 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, remmenber 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 = [ '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 = [ '' ];
}
 
/**
 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( QueryString.get( 'oldid' ) != wgCurRevisionId ) {
			// not latest revision
			return;
		}
 
		var ntitle = getElementsByClassName( document.getElementById('bodyContent'), 'td' , 'diff-ntitle' )[0];
		if( ntitle.getElementsByTagName('a')[0].firstChild.nodeValue.indexOf( 'Mevcut sürüm' ) != 0 ) {
			// not latest revision
			return;
		}
 
		vandal = ntitle.getElementsByTagName('a')[3].firstChild.nodeValue;
 
		if( !TwinkleConfig.openTalkPageOnAutoRevert ) {
			TwinkleConfig.openTalkPage = [];
		}
 
		return twinklefluff.revert( QueryString.get( 'twinklerevert' ), vandal );
	},
	normal: function() {
 
		var spanTag = function( color, content ) {
			var span = document.createElement( 'span' );
			span.style.color = color;
			span.appendChild( document.createTextNode( content ) );
			return span;
		}
 
		if( wgNamespaceNumber == -1 && wgCanonicalSpecialPageName == "Contributions" ) {
			//Get the username these contributions are for
			username = document.evaluate( 'substring-after(//div[@id="contentSub"]//a[@title="Özel:Kayıt"][last()]/@href, "user=")', document, null, XPathResult.STRING_TYPE, null).stringValue;
			if( TwinkleConfig.showRollbackLinks.indexOf('contribs') != -1 || ( wgUserName != username && TwinkleConfig.showRollbackLinks.indexOf('others') != -1 ) || ( wgUserName == username && TwinkleConfig.showRollbackLinks.indexOf('mine') != -1 ) ) {
				var list = document.evaluate( '//div[@id="bodyContent"]//ul/li[contains(span[@class="mw-uctop"], " (top)")]', document, null,  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
				var vandal = document.evaluate( '//div[@id="contentSub"]/a[1]/@title', document, null, XPathResult.STRING_TYPE, null ).stringValue.replace(/^Kullanıcı( mesaj)?:/ , '').replace("'", "\\'");
 
				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);
 
				for(var i = 0; i < list.snapshotLength; ++i ) {
					var current = list.snapshotItem(i);
 
					var href = document.evaluate( 'a[3]/@href', current, null, XPathResult.STRING_TYPE, null ).stringValue;
					var tmpNode = revNode.cloneNode( true );
					tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'twinklerevert': 'norm' } ) );
					current.appendChild( tmpNode );
					var tmpNode = revVandNode.cloneNode( true );
					tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'twinklerevert': 'vand' } ) );
					current.appendChild( tmpNode );
				}
			}
		} else {
 
			if( wgCanonicalSpecialPageName == "Special:Undelete" ) {
				//You can't rollback deleted pages!
				return;
			}
 
 
			var body = document.getElementById('bodyContent');
 
			var firstRev = document.evaluate( 'boolean(/div[@class="firstrevisionheader"])', body, null, XPathResult.BOOLEAN_TYPE, null ).booleanValue;
			if( firstRev ) {
				// we have first revision here, nothing to do.
				return;
			}
 
			try {
				var otitle1 = document.getElementById('mw-diff-otitle1'); 
				var ntitle1 = document.getElementById('mw-diff-ntitle1'); 
				if (!otitle1 || !ntitle1) return;
				var otitle = otitle1.parentNode;
				var ntitle = ntitle1.parentNode;
			} catch( e ) {
				// no old, nor new title, nothing to do really, return;
				return;
			}
 
			var old_rev_url = document.evaluate( '//strong/a/@href',  document.getElementById('mw-diff-ntitle2'), null, XPathResult.STRING_TYPE, null ).stringValue;
 
			// 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-revision' );
			revertToRevision.style.fontWeight = 'bold';
 
			var revertToRevisionLink = revertToRevision.appendChild( document.createElement('a') );
			revertToRevisionLink.href = "javascript:twinklefluff.revertToRevision('" + oldrev + "')";
			revertToRevisionLink.appendChild( spanTag( 'Black', '[' ) );
			revertToRevisionLink.appendChild( spanTag( 'SaddleBrown', 'bu sürümü geri getir' ) );
			revertToRevisionLink.appendChild( spanTag( 'Black', ']' ) );
 
			otitle.insertBefore( revertToRevision, otitle.firstChild );
 
			if( document.getElementById('differences-nextlink') ) {
				// Not latest revision
				curVersion = false;
				return;
			}
			if( TwinkleConfig.showRollbackLinks.indexOf('diff') != -1 ) {
				vandal = document.evaluate( 'a', document.getElementById('mw-diff-ntitle2') , null, XPathResult.STRING_TYPE, null ).stringValue.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 = "javascript:twinklefluff.revert('agf' , '" + vandal + "')"; 
				vandLink.href = "javascript:twinklefluff.revert('vand' , '" + vandal + "')"; 
				normLink.href = "javascript:twinklefluff.revert('norm' , '" + vandal + "')"; 
 
				agfLink.appendChild( spanTag( 'Black', '[' ) );
				agfLink.appendChild( spanTag( 'DarkOliveGreen', 'geri (İNV)' ) );
				agfLink.appendChild( spanTag( 'Black', ']' ) );
 
				vandLink.appendChild( spanTag( 'Black', '[' ) );
				vandLink.appendChild( spanTag( 'Red', 'geri (VANDAL)' ) );
				vandLink.appendChild( spanTag( 'Black', ']' ) );
 
				normLink.appendChild( spanTag( 'Black', '[' ) );
				normLink.appendChild( spanTag( 'SteelBlue', 'geri' ) );
				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 ) {
 
	wgPageName = page || wgPageName;
	wgCurRevisionId = rev || wgCurRevisionId;
 
	Status.init( document.getElementById('bodyContent') );
	var params = {
		type: type,
		user: vandal
	}
	var query = {
		'action': 'query',
		'prop': 'revisions',
		'titles': wgPageName,
		'rvlimit': 50, // max possible
		'rvprop': [ 'ids', 'timestamp', 'user', 'comment' ]
	}
	var wikipedia_api = new Wikipedia.api( 'Önceki sürüm verileri alınıyor', query, twinklefluff.callbacks.main );
	wikipedia_api.params = params;
	wikipedia_api.post();
}
 
twinklefluff.revertToRevision = function revertToRevision( oldrev ) {
 
	Status.init( document.getElementById('bodyContent') );
 
	var query = {
		'action': 'query',
		'prop': 'revisions',
		'titles': wgPageName,
		'rvlimit': 1,
		'rvstartid': oldrev,
		'rvprop': [ 'ids', 'timestamp', 'user', 'comment', 'content' ],
		'format': 'xml'
	}
 
	var wikipedia_api = new Wikipedia.api( 'Önceki sürüm verileri alınıyor', query, twinklefluff.callbacks.toRevision.main );
	wikipedia_api.params = { rev: oldrev };
	wikipedia_api.post();
}
 
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( 'Sayfa geri alınıyor', 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( '"editform" bileşeni alınamıyor, bunun nedeni sunucunun cevap vermemesi olabilir' );
				return;
			}
 
			var optional_summary = prompt( "Eğer mümkünse, lütfen geri alma işlemi için bir gerekçe girin" );
			if (optional_summary == null)
			{
				self.statelem.error( 'Kullanıcı tarafından iptal edildi.' );
				return;
			}
			var summary = sprintf( "[[Special:Contributions/%2$s|%2$s]] adlı kullanıcıya ait olan %1$s sayılı sürüm geri getirildi. %3$s %4$s", 
				self.params.revision.getAttribute( 'revid' ),
				self.params.revision.getAttribute( 'user' ),
				optional_summary ? "Gerekçe: " + optional_summary : '',
				TwinkleConfig.summaryAd
			);
			var postData = {
				'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 = "Geri alma tamamlandı"
 
			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( 'Başka bir sürüm yok, bu yüzden geri almak imkansız' );
			return;
		}
		var top = revs.snapshotItem(0);
		if( top.getAttribute( 'revid' ) < wgCurRevisionId ) {
			Status.error( 'Error', [ 'Alınan son sürüm sayısı ', htmlNode( 'strong', top.getAttribute('revid') ), ', mevcut sürüm sayısından daha küçük. Bunun nedeni mevcut sürümün silinmiş olması, sunucuda gecikme olması ya da bozuk veri alınmış olması olabilir. Bu noktada işlem durdurulacak.' ] );
			return;
		}
		var index = 1;
		if( wgCurRevisionId != top.getAttribute('revid') ) {
			Status.warn( 'Uyarı', [ 'Son sürüm olan ', htmlNode( 'strong', top.getAttribute('revid') ), ', bizim sürümümüze eş değil ', htmlNode( 'strong', wgCurRevisionId) ] );
			if( top.getAttribute( 'user' ) == self.params.user ) {
				switch( self.params.type ) {
				case 'vand':
					Status.info( 'Bilgi', [ 'Son sürümün sahibi ', htmlNode( 'strong', self.params.user ) , '. Vandalizm olduğunu varsaydığımız için geri alma işlemine devam ediyoruz' ]);
					break;
				case 'agf':
					Status.warn( 'Uyarı', [ 'Son sürümün sahibi ', htmlNode( 'strong', self.params.user ) , '. İyi niyet varsaydığımız için geri alma işlemine son veriyoruz, zira problem çözülmüş olabilir.' ]);
					return;
				default:
					Status.warn( 'Bildirim', [ 'Son sürümün sahibi ', htmlNode( 'strong', self.params.user ) , ', ancak yine de geri alma işlemi durdurulacak.' ] );
					return;
				}
			}
			else if( 
				self.params.type == 'vand' && 
				WHITELIST.indexOf( top.getAttribute( 'user' ) ) != -1 && revs.snapshotLength > 1 &&
				revs.snapshotItem(1).getAttribute( 'pageId' ) == wgCurRevisionId 
			) {
				Status.info( 'Bilgi', [ 'Son sürümün sahibi ', htmlNode( 'strong', top.getAttribute( 'user' ) ), ', güvenilir bir bot ve öncesindeki sürümün sahibi bir vandal, bu nedenle geri alma işlemine devam ediyoruz.' ] );
				index = 2;
			} else {
				Status.error( 'Hata', [ 'Son sürümün sahibi ', htmlNode( 'strong', top.getAttribute( 'user' ) ), ', yani daha önce geri alınmış olabilir, geri alma işlemine son veriliyor.'] );
				return;
			}
 
		}
 
		if( WHITELIST.indexOf( self.params.user ) != -1  ) {
			switch( self.params.type ) {
			case 'vand':
				Status.info( 'Bilgi', [ 'Vandalism revert was chosen on ', htmlNode( 'strong', self.params.user ), ', as this is a whitelisted bot, we assume you wanted to revert vandalism made by the previous user instead.' ] );
				index = 2;
				vandal = revs.snapshotItem(1).getAttribute( 'user' );
				self.params.user = revs.snapshotItem(1).getAttribute( 'user' );
				break;
			case 'agf':
				Status.warn( 'Bildirim', [ 'Good faith revert was chosen on ', htmlNode( 'strong', self.params.user ), ', as this is a whitelisted bot, it makes no sense at all to revert it as a good faith edit, will stop reverting.' ] );
				return;
 
				break;
			case 'norm':
			default:
				var cont = confirm( 'Normal geri alma seçildi, ancak son kullanıcı olan (' + self.params.user + ') beyaz listeye alınmış bir bot. Bunun yerine öncesindeki sürümü geri almak ister misiniz?' );
				if( cont ) {
					Status.info( 'Bilgi', [ 'Normal revert was chosen on ', htmlNode( 'strong', self.params.user ), ', as this is a whitelisted bot, and per confirm, we\'ll revert the previous revision instead.' ] );
					index = 2;
					self.params.user = revs.snapshotItem(1).getAttribute( 'user' );
				} else {
					Status.warn( 'Bildirim', [ 'Normal revert was chosen on ', htmlNode( 'strong', self.params.user ), ', this is a whitelisted bot, but per confirmation, revert on top revision will proceed.' ] );
				}
				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( [ 'Önceki bir sürüm bulunamadı. Bunun nedeni ', htmlNode( 'strong', self.params.user ), ' adlı kullanıcının tek değişiklik yapan kullanıcı olması ya da arka arkaya ' + TwinkleConfig.revertMaxRevisions + ' değişiklikten fazlasına sahip olması olabilir.' ] );
			return;
 
		}
 
		if( count == 0 ) {
			Status.error( 'Hata', "Geri alınabilecek sürüm sayısı sıfırdı. Bu çok mantıksız olacağı için, geri alma işlemi bu seferlik durdurulacak. Değişiklik önceden geri alınmış olmasına rağmen sürüm sayısı halen aynı olabilir." );
			return;
		}
 
		var good_revision = revs.snapshotItem( found );
 
		if( 
			self.params.type != 'vand' && 
			count > 1  && 
			!confirm( self.params.user + ' adlı kullanıcı arka arkaya ' + count + ' değişiklik yaptı. Tamamını geri almak istediğinizden emin misiniz?' ) 
		) {
			Status.info( 'Bildirim', 'Stopping reverting per user input' );
			return;
		}
 
		self.params.count = count;
 
		self.params.goodid = good_revision.getAttribute( 'revid' );
		self.params.gooduser = good_revision.getAttribute( 'user' );
 
 
		self.statelem.status( [ '', htmlNode( 'strong', good_revision.getAttribute( 'user' ) ), ' adlı kullanıcıya ait olan ', htmlNode( 'strong', count ), ' sürüm önceki ', htmlNode( 'strong', good_revision.getAttribute( 'revid' ) ), ' sayılı sürüm ' ] );
 
		var query = {
			'action': 'query',
			'prop': 'revisions',
			'titles': wgPageName,
			'rvlimit': 1,
			'rvprop': 'content',
			'rvstartid': good_revision.getAttribute( 'revid' )
		}
 
		var wikipedia_api = new Wikipedia.api( [ 'Getting content for revision ', 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( 'Sayfa geri alınıyor', 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( '"editform" bileşeni alınamıyor, bunun nedeni sunucunun cevap vermemesi olabilir' );
			return;
		}
 
		var text = self.params.content;
		if( !text ) {
			self.statelem.error( 'sürüm bulunamadı, bir şeyler yanlış, iptal ediliyor!' );
			return;
		}
 
		var summary;
 
		switch( self.params.type ) {
		case 'agf':
			var extra_summary = prompt( "Değişiklik özeti için isteğe bağlı bir not:" );
			if (extra_summary == null)
			{
				self.statelem.error( 'Kullanıcı tarafından iptal edildi.' );
				return;
			}
			summary = sprintf( "[[Special:Contributions/%s|%1$s]] tarafından gerçekleştirilen [[VP:İNV|iyi niyetli]] değişiklik geri alındı. %s.%s", 
				self.params.user.replace("\\'", "'"), 
				extra_summary ? "Gerekçe: " + extra_summary.toUpperCaseFirstChar() : '',
				TwinkleConfig.summaryAd
			);
			break;
		case 'vand':
			summary = sprintf( "[[Special:Contributions/%3$s|%3$s]] adlı kullanıcının [[VP:V|vandalizm]] amaçlı %d %s geri alınarak, [[Kullanıcı:%4$s|%4$s]] adlı kullanıcının sürümüne dönüldü.%5$s", 
				self.params.count, 
				self.params.count > 1 ? 'değişikliği': 'değişikliği',
                                self.params.user.replace("\\'", "'"),
				self.params.gooduser.replace("\\'", "'"),
				TwinkleConfig.summaryAd
			);
			break;
		case 'norm':
			if( TwinkleConfig.offerReasonOnNormalRevert ) {
				var extra_summary = prompt( "Değişiklik özeti için isteğe bağlı bir not:" );
				if (extra_summary == null)
				{
					self.statelem.error( 'Kullanıcı tarafından iptal edildi.' );
					return;
				}
			}
			summary = sprintf( "[[Special:Contributions/%3$s|%3$s]] tarafından gerçekleştirilen %1$s %2$s geri alındı. %4$s %5$s", 
				self.params.count, 
				self.params.count > 1 ? 'değişiklik': 'değişiklik',
				self.params.user.replace("\\'", "'"),
				extra_summary ? " Gerekçe: " + extra_summary.toUpperCaseFirstChar() : '',
				TwinkleConfig.summaryAd 
			);
		}
 
		if( TwinkleConfig.openTalkPage.indexOf( self.params.type ) != -1 ) {
			Status.info( 'Bilgi', [ 'Kullanıcı mesaj sayfası değişiklik penceresi açılıyor: ', htmlNode( 'strong', self.params.user ) ] );
 
			var query = {
				'title': 'Kullanıcı mesaj:' + 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 = {
			'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 = "Geri alma işlemi tamamlandı"
 
		self.post( postData );
	}
}
}
 
$( function() {
		if( QueryString.exists( 'twinklerevert' ) ) {
			twinklefluff.auto();
		} else {
			twinklefluff.normal();
		}
	}
);