User:Magicknight94/twinklefluff.js

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 TWINKLE */ if( typeof( TwinkleConfig.summaryAd ) == 'undefined' ) { TwinkleConfig.summaryAd = " (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( 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( 'Current revision' ) != 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="Đặc biệt:Nhật trình"][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"], "(mới nhất)")]', 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(/^(Thảo luận )?Thành viên:/, '').replace("'", "\\'");

var revNode = document.createElement('strong'); var revLink = document.createElement('a'); revLink.appendChild( spanTag( 'Black', ' [' ) ); revLink.appendChild( spanTag( 'SteelBlue', 'lùi tất cả' ) ); 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', 'phá hoại' ) ); 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[2]/@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 == "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( '//div[@id="mw-diff-otitle1"]//strong/a/@href', document, 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-orevision' ); 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', 'phục hồi phiên bản này' ) ); revertToRevisionLink.appendChild( spanTag( 'Black', ']' ) );

otitle.insertBefore( revertToRevision, otitle.firstChild );

if( document.getElementById('differences-nextlink') ) { // Not latest revision curVersion = false;

var new_rev_url = document.evaluate( '//div[@id="mw-diff-ntitle1"]//strong/a/@href', document, null, XPathResult.STRING_TYPE, null ).stringValue; var query = new QueryString( new_rev_url.split( '?', 2 )[1] ); var newrev = query.get( 'oldid' ); var revertToRevision = document.createElement('div'); revertToRevision.setAttribute( 'id', 'tw-revert-to-nrevision' ); revertToRevision.style.fontWeight = 'bold'; var revertToRevisionLink = revertToRevision.appendChild( document.createElement('a') ); revertToRevisionLink.href = "javascript:twinklefluff.revertToRevision('" + newrev + "')"; revertToRevisionLink.appendChild( spanTag( 'Black', '[' ) ); revertToRevisionLink.appendChild( spanTag( 'SaddleBrown', 'phục hồi phiên bản này' ) ); revertToRevisionLink.appendChild( spanTag( 'Black', ']' ) ); ntitle.insertBefore( revertToRevision, ntitle.firstChild );

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', 'lùi toàn bộ (sửa sai)' ) ); agfLink.appendChild( spanTag( 'Black', ']' ) );

vandLink.appendChild( spanTag( 'Black', '[' ) ); vandLink.appendChild( spanTag( 'Red', 'lùi toàn bộ (phá hoại)' ) ); vandLink.appendChild( spanTag( 'Black', ']' ) );

normLink.appendChild( spanTag( 'Black', '[' ) ); normLink.appendChild( spanTag( 'SteelBlue', 'lùi toàn bộ' ) ); 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( 'Đang lấy dữ liệu của các phiên bản trước', 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( 'Đang lấy dữ liệu của phiên bản trước', 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( 'Đang lùi trang', 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( 'không thể lấy yếu tố "editform", đang hủy, chứng tỏ máy chủ dường như phản hồi thất bại' ); return; }

var optional_summary = prompt( "Xin vui lòng ghi lý do lùi lại, nếu có thể" ); if (optional_summary == null) {               self.statelem.error( 'Thành viên hủy.' ); return; }           var summary = sprintf( "Lùi về phiên bản %d của %2$s%s.%s",                self.params.revision.getAttribute( 'revid' ),                self.params.revision.getAttribute( 'user' ),                optional_summary ? "; " + 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 = "Lùi lại hoàn tất"

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( 'Chúng ta có ít hơn một phiên bản khác, nên không thể lùi lại' ); return; }       var top = revs.snapshotItem(0); if( top.getAttribute( 'revid' ) < wgCurRevisionId ) { Status.error( 'Có lỗi', [ 'Mã phiên bản mới nhất nhận được ', htmlNode( 'strong', top.getAttribute('revid') ), ' ít hơn mã phiên bản hiện hành, đây có thể do phiên bản hiện hành đã bị xóa, máy chủ bị trễ, hoặc nhận phải dữ liệu lỗi. Sẽ dừng thực hiện tại đây.' ] ); return; }       var index = 1; if( wgCurRevisionId != top.getAttribute('revid') ) { Status.warn( 'Cảnh báo', [ 'Phiên bản mới nhất ', htmlNode( 'strong', top.getAttribute('revid') ), ' không bằng phiên bản của chúng ta ', htmlNode( 'strong', wgCurRevisionId) ] ); if( top.getAttribute( 'user' ) == self.params.user ) { switch( self.params.type ) { case 'vand': Status.info( 'Thông báo', [ 'Phiên bản mới nhất do ', htmlNode( 'strong', self.params.user ), ' thực hiện, vì chúng ta xem đó là phá hoại, chúng ta sẽ lùi tiếp' ]); break; case 'agf': Status.warn( 'Cảnh báo', [ 'Phiên bản mới nhất do ', htmlNode( 'strong', self.params.user ), ' thực hiện, vì chúng ta xem đó là sửa đổi tốt, chúng ta dừng lùi, vì có vẻ vấn đề đã được giải quyết.' ]); return; default: Status.warn( 'Chú ý', [ 'Phiên bản mới nhất do ', htmlNode( 'strong', self.params.user ), ' thực hiện, nhưng chúng ta sẽ vẫn dừng lùi.' ] ); return; }           }            else if(                self.params.type == 'vand' &&                WHITELIST.indexOf( top.getAttribute( 'user' ) ) != -1 && revs.snapshotLength > 1 &&                revs.snapshotItem(1).getAttribute( 'pageId' ) == wgCurRevisionId            ) { Status.info( 'Thông báo', [ 'Phiên bản mới nhất do ', htmlNode( 'strong', top.getAttribute( 'user' ) ), ', một tài khoản robot đáng tin cậy, thực hiện, và phiên bản trước đó lại do tên phá hoại sửa đổi, vì thế chúng ta lùi tiếp.' ] ); index = 2; } else { Status.error( 'Có lỗi', [ 'Phiên bản mới nhất do ', htmlNode( 'strong', top.getAttribute( 'user' ) ), ' thực hiện, vì thế có vẻ chúng đã được lùi rồi, dừng việc lùi tại đây.'] ); return; }

}

if( WHITELIST.indexOf( self.params.user ) != -1 ) { switch( self.params.type ) { case 'vand': Status.info( 'Thông báo', [ 'Việc lùi sửa đổi phá hoại thực hiện với tài khoản ', htmlNode( 'strong', self.params.user ), ', vì đây là robot trong danh sách trắng, chúng tôi đoán bạn muốn lùi phá hoại của thành viên sửa đổi trước đó.' ] ); index = 2; vandal = revs.snapshotItem(1).getAttribute( 'user' ); self.params.user = revs.snapshotItem(1).getAttribute( 'user' ); break; case 'agf': Status.warn( 'Chú ý', [ 'Lùi sửa đổi nhầm lẫn được thực hiện với tài khoản ', htmlNode( 'strong', self.params.user ), ', vì đây là robot trong danh sách trắng, không có lý do nào để lùi sửa đổi dạng nhầm lẫn cả, dừng việc lùi sửa đổi.' ] ); return;

break; case 'norm': default: var cont = confirm( 'Bạn đã chọn lùi thông thường, nhưng thành viên trên cùng (' + self.params.user + ') là một robot trong danh sách trắng, bạn có muốn lùi phiên bản trước đó?' ); if( cont ) { Status.info( 'Thông báo', [ 'Lùi thông thường được thực hiện với tài khoản ', htmlNode( 'strong', self.params.user ), ', vì đây là robot trong danh sách trắng, và theo xác nhận của bạn, chúng tôi sẽ lùi phiên bản trước đó.' ] ); index = 2; self.params.user = revs.snapshotItem(1).getAttribute( 'user' ); } else { Status.warn( 'Chú ý', [ 'Lùi thông thường được thực hiện với tài khoản ', htmlNode( 'strong', self.params.user ), ', đây là robot trong danh sách trắng, nhưng theo xác nhận của bạn, sẽ thực hiện lùi phiên bản trên cùng.' ] ); }               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( [ 'Không tìm thấy phiên bản trước, có lẽ ', htmlNode( 'strong', self.params.user ), ' là người đóng góp duy nhất, hoặc người này đã thực hiện hơn ' + TwinkleConfig.revertMaxRevisions + ' sửa đổi liên tục.' ] ); return;

}

if( count == 0 ) { Status.error( 'Có lỗi', "Chúng tôi được yêu cầu lùi không phiên bản. Vì nó chẳng có ý nghĩa gì, chúng tôi sẽ dừng lùi lại. Đó có thể do sửa đổi đã được lùi rồi, nhưng mã phiên bản vẫn y như cũ." ); return; }

var good_revision = revs.snapshotItem( found );

if(           self.params.type != 'vand' &&            count > 1  &&            !confirm( self.params.user + ' đã thực hiện ' + count + ' sửa đổi liên tục. Bạn có chắc muốn lùi tất cả chúng?' )       ) { Status.info( 'Chú ý', 'Đang dừng lùi sửa theo yêu cầu thành viên' ); return; }

self.params.count = count;

self.params.goodid = good_revision.getAttribute( 'revid' ); self.params.gooduser = good_revision.getAttribute( 'user' );

self.statelem.status( [ ' phiên bản ', htmlNode( 'strong', good_revision.getAttribute( 'revid' ) ), ' được hiện cách ', htmlNode( 'strong', count ), ' phiên bản về trước của ', 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( [ 'Đang lấy nội dung của phiên bản ', 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( 'Đang lùi trang', 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( 'không thể lấy yếu tố "editform", đang hủy, có thể do máy chủ không trả về được' ); return; }

var text = self.params.content; if( !text ) { self.statelem.error( 'chúng tôi không nhận được phiên bản nào cả, có gì đó bị sai, thoát!' ); return; }

var summary;

switch( self.params.type ) { case 'agf': var extra_summary = prompt( "Ghi chú khác cho tóm lược sửa đổi:" ); if (extra_summary == null) {               self.statelem.error( 'Thành viên hủy.' ); return; }           summary = sprintf( "Đã lùi sửa đổi nhầm lẫn cả %1$s%s.%s",                self.params.user.replace("\\'", "'"),                extra_summary ? "; " + extra_summary.toUpperCaseFirstChar : '',                TwinkleConfig.summaryAd            ); break; case 'vand': summary = sprintf( "Đã lùi %d %s của %3$s được xác định là phá hoại đến phiên bản cuối của %4$s.%s",               self.params.count,                self.params.count > 1 ? 'sửa đổi': 'sửa đổi',                self.params.user.replace("\\'", "'"),                self.params.gooduser.replace("\\'", "'"),                TwinkleConfig.summaryAd            ); break; case 'norm': if( TwinkleConfig.offerReasonOnNormalRevert ) { var extra_summary = prompt( "Ghi chú khác cho tóm lược sửa đổi:" ); if (extra_summary == null) {                   self.statelem.error( 'Thành viên hủy.' ); return; }           }            summary = sprintf( "Đã lùi %d %s của %3$s%s.%s",                self.params.count,                self.params.count > 1 ? 'sửa đổi': 'sửa đổi',                self.params.user.replace("\\'", "'"),                extra_summary ? "; " + extra_summary.toUpperCaseFirstChar : '',                TwinkleConfig.summaryAd            ); }

if( TwinkleConfig.openTalkPage.indexOf( self.params.type ) != -1 ) { Status.info( 'Thông báo', [ 'Thông mở mẫu soạn thảo trang thảo luận thành viên của thành viên ', htmlNode( 'strong', self.params.user ) ] ); var query = { 'title': 'User talk:' + 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( wgServer + wgScriptPath + '/index.php?' + QueryString.create( query ), '_tab' ); break; case 'blank': window.open( wgServer + 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( wgServer + 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 = "Đã hoàn tất lùi sửa đổi"

self.post( postData ); } }

addOnloadHook( function {       if( QueryString.exists( 'twinklerevert' ) ) {            twinklefluff.auto;        } else {            twinklefluff.normal;        }    } );

} //twinkleConfigExists