<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://informatiestandaarden.test-nictiz.nl/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklebatchdelete.js</id>
	<title>MediaWiki:Gadget-twinklebatchdelete.js - Bewerkingsoverzicht</title>
	<link rel="self" type="application/atom+xml" href="https://informatiestandaarden.test-nictiz.nl/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklebatchdelete.js"/>
	<link rel="alternate" type="text/html" href="https://informatiestandaarden.test-nictiz.nl/index.php?title=MediaWiki:Gadget-twinklebatchdelete.js&amp;action=history"/>
	<updated>2026-04-23T18:35:35Z</updated>
	<subtitle>Bewerkingsoverzicht voor deze pagina op de wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://informatiestandaarden.test-nictiz.nl/index.php?title=MediaWiki:Gadget-twinklebatchdelete.js&amp;diff=3305&amp;oldid=prev</id>
		<title>Ahenket: 1 versie: Twinkle</title>
		<link rel="alternate" type="text/html" href="https://informatiestandaarden.test-nictiz.nl/index.php?title=MediaWiki:Gadget-twinklebatchdelete.js&amp;diff=3305&amp;oldid=prev"/>
		<updated>2013-07-19T18:37:38Z</updated>

		<summary type="html">&lt;p&gt;1 versie: Twinkle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nieuwe pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinklebatchdelete.js: Batch delete module (sysops only)&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;D-batch&amp;quot;)&lt;br /&gt;
 * Active on:              Existing and non-existing non-articles, and Special:PrefixIndex&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete = function twinklebatchdelete() {&lt;br /&gt;
	if( Morebits.userIsInGroup( &amp;#039;sysop&amp;#039; ) &amp;amp;&amp;amp; (mw.config.get( &amp;#039;wgNamespaceNumber&amp;#039; ) &amp;gt; 0 || mw.config.get( &amp;#039;wgCanonicalSpecialPageName&amp;#039; ) === &amp;#039;Prefixindex&amp;#039;) ) {&lt;br /&gt;
		Twinkle.addPortletLink( Twinkle.batchdelete.callback, &amp;quot;D-batch&amp;quot;, &amp;quot;tw-batch&amp;quot;, &amp;quot;Delete pages found in this category/on this page&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.unlinkCache = {};&lt;br /&gt;
Twinkle.batchdelete.callback = function twinklebatchdeleteCallback() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 800, 400 );&lt;br /&gt;
	Window.setTitle( &amp;quot;Batch deletion&amp;quot; );&lt;br /&gt;
	Window.setScriptName( &amp;quot;Twinkle&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Twinkle help&amp;quot;, &amp;quot;WP:TW/DOC#batchdelete&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.batchdelete.callback.evaluate );&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: &amp;#039;Delete pages&amp;#039;,&lt;br /&gt;
					name: &amp;#039;delete_page&amp;#039;,&lt;br /&gt;
					value: &amp;#039;delete&amp;#039;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					label: &amp;#039;Remove backlinks to the page&amp;#039;,&lt;br /&gt;
					name: &amp;#039;unlink_page&amp;#039;,&lt;br /&gt;
					value: &amp;#039;unlink&amp;#039;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					label: &amp;#039;Delete redirects to deleted pages&amp;#039;,&lt;br /&gt;
					name: &amp;#039;delete_redirects&amp;#039;,&lt;br /&gt;
					value: &amp;#039;delete_redirects&amp;#039;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		} );&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &amp;#039;textarea&amp;#039;,&lt;br /&gt;
			name: &amp;#039;reason&amp;#039;,&lt;br /&gt;
			label: &amp;#039;Reason: &amp;#039;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
	var query;&lt;br /&gt;
	if( mw.config.get( &amp;#039;wgNamespaceNumber&amp;#039; ) === 14 ) {  // Category:&lt;br /&gt;
&lt;br /&gt;
		query = {&lt;br /&gt;
			&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
			&amp;#039;generator&amp;#039;: &amp;#039;categorymembers&amp;#039;,&lt;br /&gt;
			&amp;#039;gcmtitle&amp;#039;: mw.config.get( &amp;#039;wgPageName&amp;#039; ),&lt;br /&gt;
			&amp;#039;gcmlimit&amp;#039; : Twinkle.getPref(&amp;#039;batchMax&amp;#039;), // the max for sysops&lt;br /&gt;
			&amp;#039;prop&amp;#039;: [ &amp;#039;categories&amp;#039;, &amp;#039;revisions&amp;#039; ],&lt;br /&gt;
			&amp;#039;rvprop&amp;#039;: [ &amp;#039;size&amp;#039; ]&lt;br /&gt;
		};&lt;br /&gt;
	} else if( mw.config.get( &amp;#039;wgCanonicalSpecialPageName&amp;#039; ) === &amp;#039;Prefixindex&amp;#039; ) {&lt;br /&gt;
&lt;br /&gt;
		var gapnamespace, gapprefix;&lt;br /&gt;
		if(Morebits.queryString.exists( &amp;#039;from&amp;#039; ) )&lt;br /&gt;
		{&lt;br /&gt;
			gapnamespace = Morebits.queryString.get( &amp;#039;namespace&amp;#039; );&lt;br /&gt;
			gapprefix = Morebits.string.toUpperCaseFirstChar( Morebits.queryString.get( &amp;#039;from&amp;#039; ) );&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			var pathSplit = location.pathname.split(&amp;#039;/&amp;#039;);&lt;br /&gt;
			if (pathSplit.length &amp;lt; 3 || pathSplit[2] !== &amp;quot;Special:PrefixIndex&amp;quot;) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			var titleSplit = pathSplit[3].split(&amp;#039;:&amp;#039;);&lt;br /&gt;
			gapnamespace = mw.config.get(&amp;quot;wgNamespaceIds&amp;quot;)[titleSplit[0].toLowerCase()];&lt;br /&gt;
			if ( titleSplit.length &amp;lt; 2 || typeof gapnamespace === &amp;#039;undefined&amp;#039; )&lt;br /&gt;
			{&lt;br /&gt;
				gapnamespace = 0;  // article namespace&lt;br /&gt;
				gapprefix = pathSplit.splice(3).join(&amp;#039;/&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				pathSplit = pathSplit.splice(4);&lt;br /&gt;
				pathSplit.splice(0,0,titleSplit.splice(1).join(&amp;#039;:&amp;#039;));&lt;br /&gt;
				gapprefix = pathSplit.join(&amp;#039;/&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		query = {&lt;br /&gt;
			&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
			&amp;#039;generator&amp;#039;: &amp;#039;allpages&amp;#039;,&lt;br /&gt;
			&amp;#039;gapnamespace&amp;#039;: gapnamespace ,&lt;br /&gt;
			&amp;#039;gapprefix&amp;#039;: gapprefix,&lt;br /&gt;
			&amp;#039;gaplimit&amp;#039; : Twinkle.getPref(&amp;#039;batchMax&amp;#039;), // the max for sysops&lt;br /&gt;
			&amp;#039;prop&amp;#039; : [&amp;#039;categories&amp;#039;, &amp;#039;revisions&amp;#039; ],&lt;br /&gt;
			&amp;#039;rvprop&amp;#039;: [ &amp;#039;size&amp;#039; ]&lt;br /&gt;
		};&lt;br /&gt;
	} else {&lt;br /&gt;
		query = {&lt;br /&gt;
			&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
			&amp;#039;generator&amp;#039;: &amp;#039;links&amp;#039;,&lt;br /&gt;
			&amp;#039;titles&amp;#039;: mw.config.get( &amp;#039;wgPageName&amp;#039; ),&lt;br /&gt;
			&amp;#039;gpllimit&amp;#039; : Twinkle.getPref(&amp;#039;batchMax&amp;#039;), // the max for sysops&lt;br /&gt;
			&amp;#039;prop&amp;#039;: [ &amp;#039;categories&amp;#039;, &amp;#039;revisions&amp;#039; ],&lt;br /&gt;
			&amp;#039;rvprop&amp;#039;: [ &amp;#039;size&amp;#039; ]&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var statusdiv = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
	statusdiv.style.padding = &amp;#039;15px&amp;#039;;  // just so it doesn&amp;#039;t look broken&lt;br /&gt;
	Window.setContent(statusdiv);&lt;br /&gt;
	Morebits.status.init(statusdiv);&lt;br /&gt;
	Window.display();&lt;br /&gt;
&lt;br /&gt;
	var statelem = new Morebits.status(&amp;quot;Grabbing list of pages&amp;quot;);&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api( &amp;#039;loading...&amp;#039;, query, function( self ) {&lt;br /&gt;
			var xmlDoc = self.responseXML;&lt;br /&gt;
			var snapshot = xmlDoc.evaluate(&amp;#039;//page[@ns != &amp;quot;6&amp;quot; and not(@missing)]&amp;#039;, xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );  // 6 = File: namespace&lt;br /&gt;
			var list = [];&lt;br /&gt;
			for ( var i = 0; i &amp;lt; snapshot.snapshotLength; ++i ) {&lt;br /&gt;
				var object = snapshot.snapshotItem(i);&lt;br /&gt;
				var page = xmlDoc.evaluate( &amp;#039;@title&amp;#039;, object, null, XPathResult.STRING_TYPE, null ).stringValue;&lt;br /&gt;
				var size = xmlDoc.evaluate( &amp;#039;revisions/rev/@size&amp;#039;, object, null, XPathResult.NUMBER_TYPE, null ).numberValue;&lt;br /&gt;
&lt;br /&gt;
				var disputed = xmlDoc.evaluate( &amp;#039;boolean(categories/cl[@title=&amp;quot;Category:Contested candidates for speedy deletion&amp;quot;])&amp;#039;, object, null, XPathResult.BOOLEAN_TYPE, null ).booleanValue;&lt;br /&gt;
				list.push( {label:page + &amp;#039; (&amp;#039; + size + &amp;#039; bytes)&amp;#039; + ( disputed ? &amp;#039; (DISPUTED CSD)&amp;#039; : &amp;#039;&amp;#039; ), value:page, checked:!disputed });&lt;br /&gt;
			}&lt;br /&gt;
			self.params.form.append( {&lt;br /&gt;
					type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
					name: &amp;#039;pages&amp;#039;,&lt;br /&gt;
					list: list&lt;br /&gt;
				} );&lt;br /&gt;
			self.params.form.append( { type:&amp;#039;submit&amp;#039; } );&lt;br /&gt;
&lt;br /&gt;
			var result = self.params.form.render();&lt;br /&gt;
			self.params.Window.setContent( result );&lt;br /&gt;
		}, statelem );&lt;br /&gt;
&lt;br /&gt;
	wikipedia_api.params = { form:form, Window:Window };&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.currentDeleteCounter = 0;&lt;br /&gt;
Twinkle.batchdelete.currentUnlinkCounter = 0;&lt;br /&gt;
Twinkle.batchdelete.currentdeletor = 0;&lt;br /&gt;
Twinkle.batchdelete.callback.evaluate = function twinklebatchdeleteCallbackEvaluate(event) {&lt;br /&gt;
	Morebits.wiki.actionCompleted.notice = &amp;#039;Status&amp;#039;;&lt;br /&gt;
	Morebits.wiki.actionCompleted.postfix = &amp;#039;batch deletion is now complete&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	var pages = event.target.getChecked( &amp;#039;pages&amp;#039; );&lt;br /&gt;
	var reason = event.target.reason.value;&lt;br /&gt;
	var delete_page = event.target.delete_page.checked;&lt;br /&gt;
	var unlink_page = event.target.unlink_page.checked;&lt;br /&gt;
	var delete_redirects = event.target.delete_redirects.checked;&lt;br /&gt;
	if( ! reason ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
	Morebits.status.init( event.target );&lt;br /&gt;
	if( !pages ) {&lt;br /&gt;
		Morebits.status.error( &amp;#039;Error&amp;#039;, &amp;#039;nothing to delete, aborting&amp;#039; );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function toCall( work ) {&lt;br /&gt;
		if( work.length === 0 &amp;amp;&amp;amp;  Twinkle.batchdelete.currentDeleteCounter &amp;lt;= 0 &amp;amp;&amp;amp; Twinkle.batchdelete.currentUnlinkCounter &amp;lt;= 0 ) {&lt;br /&gt;
			window.clearInterval( Twinkle.batchdelete.currentdeletor );&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		} else if( work.length !== 0 &amp;amp;&amp;amp; ( Twinkle.batchdelete.currentDeleteCounter &amp;lt;= Twinkle.getPref(&amp;#039;batchDeleteMinCutOff&amp;#039;) || Twinkle.batchdelete.currentUnlinkCounter &amp;lt;= Twinkle.getPref(&amp;#039;batchDeleteMinCutOff&amp;#039;)  ) ) {&lt;br /&gt;
			Twinkle.batchdelete.unlinkCache = []; // Clear the cache&lt;br /&gt;
			var pages = work.shift();&lt;br /&gt;
			Twinkle.batchdelete.currentDeleteCounter += pages.length;&lt;br /&gt;
			Twinkle.batchdelete.currentUnlinkCounter += pages.length;&lt;br /&gt;
			for( var i = 0; i &amp;lt; pages.length; ++i ) {&lt;br /&gt;
				var page = pages[i];&lt;br /&gt;
				var query = {&lt;br /&gt;
					&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
					&amp;#039;titles&amp;#039;: page&lt;br /&gt;
				};&lt;br /&gt;
				var wikipedia_api = new Morebits.wiki.api( &amp;#039;Checking if page &amp;#039; + page + &amp;#039; exists&amp;#039;, query, Twinkle.batchdelete.callbacks.main );&lt;br /&gt;
				wikipedia_api.params = { page:page, reason:reason, unlink_page:unlink_page, delete_page:delete_page, delete_redirects:delete_redirects };&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	var work = Morebits.array.chunk( pages, Twinkle.getPref(&amp;#039;batchdeleteChunks&amp;#039;) );&lt;br /&gt;
	Morebits.wiki.addCheckpoint();&lt;br /&gt;
	Twinkle.batchdelete.currentdeletor = window.setInterval( toCall, 1000, work );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.callbacks = {&lt;br /&gt;
	main: function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
		var normal = xmlDoc.evaluate( &amp;#039;//normalized/n/@to&amp;#039;, xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;&lt;br /&gt;
		if( normal ) {&lt;br /&gt;
			self.params.page = normal;&lt;br /&gt;
		}&lt;br /&gt;
		var exists = xmlDoc.evaluate( &amp;#039;boolean(//pages/page[not(@missing)])&amp;#039;, xmlDoc, null, XPathResult.BOOLEAN_TYPE, null ).booleanValue;&lt;br /&gt;
&lt;br /&gt;
		if( ! exists ) {&lt;br /&gt;
			self.statelem.error( &amp;quot;It seems that the page doesn&amp;#039;t exist, perhaps it has already been deleted&amp;quot; );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query, wikipedia_api;&lt;br /&gt;
		if( self.params.unlink_page ) {&lt;br /&gt;
			query = {&lt;br /&gt;
				&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
				&amp;#039;list&amp;#039;: &amp;#039;backlinks&amp;#039;,&lt;br /&gt;
				&amp;#039;blfilterredir&amp;#039;: &amp;#039;nonredirects&amp;#039;,&lt;br /&gt;
				&amp;#039;blnamespace&amp;#039;: [0, 100], // main space and portal space only&lt;br /&gt;
				&amp;#039;bltitle&amp;#039;: self.params.page,&lt;br /&gt;
				&amp;#039;bllimit&amp;#039;: Morebits.userIsInGroup( &amp;#039;sysop&amp;#039; ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
			};&lt;br /&gt;
			wikipedia_api = new Morebits.wiki.api( &amp;#039;Grabbing backlinks&amp;#039;, query, Twinkle.batchdelete.callbacks.unlinkBacklinksMain );&lt;br /&gt;
			wikipedia_api.params = self.params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
		} else {&lt;br /&gt;
			--Twinkle.batchdelete.currentUnlinkCounter;&lt;br /&gt;
		}&lt;br /&gt;
		if( self.params.delete_page ) {&lt;br /&gt;
			if (self.params.delete_redirects)&lt;br /&gt;
			{&lt;br /&gt;
				query = {&lt;br /&gt;
					&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
					&amp;#039;list&amp;#039;: &amp;#039;backlinks&amp;#039;,&lt;br /&gt;
					&amp;#039;blfilterredir&amp;#039;: &amp;#039;redirects&amp;#039;,&lt;br /&gt;
					&amp;#039;bltitle&amp;#039;: self.params.page,&lt;br /&gt;
					&amp;#039;bllimit&amp;#039;: Morebits.userIsInGroup( &amp;#039;sysop&amp;#039; ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
				};&lt;br /&gt;
				wikipedia_api = new Morebits.wiki.api( &amp;#039;Grabbing redirects&amp;#039;, query, Twinkle.batchdelete.callbacks.deleteRedirectsMain );&lt;br /&gt;
				wikipedia_api.params = self.params;&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page( self.params.page, &amp;#039;Deleting page &amp;#039; + self.params.page );&lt;br /&gt;
			wikipedia_page.setEditSummary(self.params.reason + Twinkle.getPref(&amp;#039;deletionSummaryAd&amp;#039;));&lt;br /&gt;
			wikipedia_page.deletePage(function( apiobj ) {&lt;br /&gt;
					--Twinkle.batchdelete.currentDeleteCounter;&lt;br /&gt;
					var link = document.createElement( &amp;#039;a&amp;#039; );&lt;br /&gt;
					link.setAttribute( &amp;#039;href&amp;#039;, mw.util.wikiGetlink(self.params.page) );&lt;br /&gt;
					link.setAttribute( &amp;#039;title&amp;#039;, self.params.page );&lt;br /&gt;
					link.appendChild( document.createTextNode( self.params.page ) );&lt;br /&gt;
					apiobj.statelem.info( [ &amp;#039;completed (&amp;#039; , link , &amp;#039;)&amp;#039; ] );&lt;br /&gt;
				} );&lt;br /&gt;
		} else {&lt;br /&gt;
			--Twinkle.batchdelete.currentDeleteCounter;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	deleteRedirectsMain: function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
		var snapshot = xmlDoc.evaluate(&amp;#039;//backlinks/bl/@title&amp;#039;, xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );&lt;br /&gt;
&lt;br /&gt;
		var total = snapshot.snapshotLength;&lt;br /&gt;
&lt;br /&gt;
		if( snapshot.snapshotLength === 0 ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var statusIndicator = new Morebits.status(&amp;#039;Deleting redirects for &amp;#039; + self.params.page, &amp;#039;0%&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		var onsuccess = function( self ) {&lt;br /&gt;
			var obj = self.params.obj;&lt;br /&gt;
			var total = self.params.total;&lt;br /&gt;
			var now = parseInt( 100 * ++(self.params.current)/total, 10 ) + &amp;#039;%&amp;#039;;&lt;br /&gt;
			obj.update( now );&lt;br /&gt;
			self.statelem.unlink();&lt;br /&gt;
			if( self.params.current &amp;gt;= total ) {&lt;br /&gt;
				obj.info( now + &amp;#039; (completed)&amp;#039; );&lt;br /&gt;
				Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		Morebits.wiki.addCheckpoint();&lt;br /&gt;
		if( snapshot.snapshotLength === 0 ) {&lt;br /&gt;
			statusIndicator.info( &amp;#039;100% (completed)&amp;#039; );&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var params = $.extend({}, self.params);&lt;br /&gt;
		params.current = 0;&lt;br /&gt;
		params.total = total;&lt;br /&gt;
		params.obj = statusIndicator;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		for ( var i = 0; i &amp;lt; snapshot.snapshotLength; ++i ) {&lt;br /&gt;
			var title = snapshot.snapshotItem(i).value;&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page( title, &amp;quot;Deleting &amp;quot; + title );&lt;br /&gt;
			wikipedia_page.setEditSummary(&amp;#039;[[WP:CSD#G8|G8]]: Redirect to deleted page &amp;quot;&amp;#039; + self.params.page + &amp;#039;&amp;quot;&amp;#039; + Twinkle.getPref(&amp;#039;deletionSummaryAd&amp;#039;));&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.deletePage(onsuccess);&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	unlinkBacklinksMain: function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
		var snapshot = xmlDoc.evaluate(&amp;#039;//backlinks/bl/@title&amp;#039;, xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );&lt;br /&gt;
&lt;br /&gt;
		if( snapshot.snapshotLength === 0 ) {&lt;br /&gt;
			--Twinkle.batchdelete.currentUnlinkCounter;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var statusIndicator = new Morebits.status(&amp;#039;Unlinking backlinks to &amp;#039; + self.params.page, &amp;#039;0%&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		var total = snapshot.snapshotLength * 2;&lt;br /&gt;
&lt;br /&gt;
		var onsuccess = function( self ) {&lt;br /&gt;
			var obj = self.params.obj;&lt;br /&gt;
			var total = self.params.total;&lt;br /&gt;
			var now = parseInt( 100 * ++(self.params.current)/total, 10 ) + &amp;#039;%&amp;#039;;&lt;br /&gt;
			obj.update( now );&lt;br /&gt;
			self.statelem.unlink();&lt;br /&gt;
			if( self.params.current &amp;gt;= total ) {&lt;br /&gt;
				obj.info( now + &amp;#039; (completed)&amp;#039; );&lt;br /&gt;
				--Twinkle.batchdelete.currentUnlinkCounter;&lt;br /&gt;
				Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		Morebits.wiki.addCheckpoint();&lt;br /&gt;
		if( snapshot.snapshotLength === 0 ) {&lt;br /&gt;
			statusIndicator.info( &amp;#039;100% (completed)&amp;#039; );&lt;br /&gt;
			--Twinkle.batchdelete.currentUnlinkCounter;&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		self.params.total = total;&lt;br /&gt;
		self.params.obj = statusIndicator;&lt;br /&gt;
		self.params.current =   0;&lt;br /&gt;
&lt;br /&gt;
		for ( var i = 0; i &amp;lt; snapshot.snapshotLength; ++i ) {&lt;br /&gt;
			var title = snapshot.snapshotItem(i).value;&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page( title, &amp;quot;Unlinking on &amp;quot; + title );&lt;br /&gt;
			var params = $.extend( {}, self.params );&lt;br /&gt;
			params.title = title;&lt;br /&gt;
			params.onsuccess = onsuccess;&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.batchdelete.callbacks.unlinkBacklinks);&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	unlinkBacklinks: function( pageobj ) {&lt;br /&gt;
		var params = pageobj.getCallbackParameters();&lt;br /&gt;
		if( ! pageobj.exists() ) {&lt;br /&gt;
			// we probably just deleted it, as a recursive backlink&lt;br /&gt;
			params.onsuccess( { params: params, statelem: pageobj.getStatusElement() } );&lt;br /&gt;
			Morebits.wiki.actionCompleted();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		var text;&lt;br /&gt;
&lt;br /&gt;
		if( params.title in Twinkle.batchdelete.unlinkCache ) {&lt;br /&gt;
			text = Twinkle.batchdelete.unlinkCache[ params.title ];&lt;br /&gt;
		} else {&lt;br /&gt;
			text = pageobj.getPageText();&lt;br /&gt;
		}&lt;br /&gt;
		var old_text = text;&lt;br /&gt;
		var wikiPage = new Morebits.wikitext.page( text );&lt;br /&gt;
		wikiPage.removeLink( params.page );&lt;br /&gt;
&lt;br /&gt;
		text = wikiPage.getText();&lt;br /&gt;
		Twinkle.batchdelete.unlinkCache[ params.title ] = text;&lt;br /&gt;
		if( text === old_text ) {&lt;br /&gt;
			// Nothing to do, return&lt;br /&gt;
			params.onsuccess( { params: params, statelem: pageobj.getStatusElement() } );&lt;br /&gt;
			Morebits.wiki.actionCompleted();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		pageobj.setEditSummary(&amp;#039;Removing link(s) to deleted page &amp;#039; + self.params.page + Twinkle.getPref(&amp;#039;deletionSummaryAd&amp;#039;));&lt;br /&gt;
		pageobj.setPageText(text);&lt;br /&gt;
		pageobj.setCreateOption(&amp;#039;nocreate&amp;#039;);&lt;br /&gt;
		pageobj.save(params.onsuccess);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ahenket</name></author>
	</entry>
</feed>