<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://ml.sayahna.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklebatchprotect.js</id>
	<title>MediaWiki:Gadget-twinklebatchprotect.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://ml.sayahna.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklebatchprotect.js"/>
	<link rel="alternate" type="text/html" href="http://ml.sayahna.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;action=history"/>
	<updated>2026-04-30T21:10:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.5</generator>
	<entry>
		<id>http://ml.sayahna.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=8153&amp;oldid=prev</id>
		<title>Cvr: 1 revision</title>
		<link rel="alternate" type="text/html" href="http://ml.sayahna.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=8153&amp;oldid=prev"/>
		<updated>2014-05-03T06:14:34Z</updated>

		<summary type="html">&lt;p&gt;1 revision&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 06:14, 3 May 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Cvr</name></author>
		
	</entry>
	<entry>
		<id>http://ml.sayahna.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=8152&amp;oldid=prev</id>
		<title>Amalthea: v2.0-646-g981a645: warn: Add {{Template:uw-inline-el|uw-inline-el}}; batchprotect: Add templateeditor protection level; Migrate from deprecated wikiGetlink to getUrl; arv: AIV reports can end in ? ! ;</title>
		<link rel="alternate" type="text/html" href="http://ml.sayahna.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=8152&amp;oldid=prev"/>
		<updated>2013-11-19T10:15:06Z</updated>

		<summary type="html">&lt;p&gt;v2.0-646-g981a645: warn: Add {{Template:uw-inline-el|uw-inline-el}}; batchprotect: Add templateeditor protection level; Migrate from deprecated wikiGetlink to getUrl; arv: AIV reports can end in ? ! ;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&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;
 *** twinklebatchprotect.js: Batch protect module (sysops only)&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;P-batch&amp;quot;)&lt;br /&gt;
 * Active on:              Existing project pages and user pages; existing and&lt;br /&gt;
 *                         non-existing categories; Special:PrefixIndex&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect = function twinklebatchprotect() {&lt;br /&gt;
	if( Morebits.userIsInGroup( 'sysop' ) &amp;amp;&amp;amp; ((mw.config.get( 'wgArticleId' ) &amp;gt; 0 &amp;amp;&amp;amp; (mw.config.get( 'wgNamespaceNumber' ) === 2 ||&lt;br /&gt;
		mw.config.get( 'wgNamespaceNumber' ) === 4)) || mw.config.get( 'wgNamespaceNumber' ) === 14 ||&lt;br /&gt;
		mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex') ) {&lt;br /&gt;
		Twinkle.addPortletLink( Twinkle.batchprotect.callback, &amp;quot;P-batch&amp;quot;, &amp;quot;tw-pbatch&amp;quot;, &amp;quot;Protect pages linked from this page&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect.unlinkCache = {};&lt;br /&gt;
Twinkle.batchprotect.callback = function twinklebatchprotectCallback() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 800, 400 );&lt;br /&gt;
	Window.setTitle( &amp;quot;Batch protection&amp;quot; );&lt;br /&gt;
	Window.setScriptName( &amp;quot;Twinkle&amp;quot; );&lt;br /&gt;
	//Window.addFooterLink( &amp;quot;Protection templates&amp;quot;, &amp;quot;Template:Protection templates&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Protection policy&amp;quot;, &amp;quot;WP:PROT&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Twinkle help&amp;quot;, &amp;quot;WP:TW/DOC#protect&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.batchprotect.callback.evaluate );&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: 'checkbox',&lt;br /&gt;
			name: 'editmodify',&lt;br /&gt;
			event: Twinkle.protect.formevents.editmodify,&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: 'Modify edit protection',&lt;br /&gt;
					value: 'editmodify',&lt;br /&gt;
					tooltip: 'Only for existing pages.',&lt;br /&gt;
					checked: true&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
	var editlevel = form.append({&lt;br /&gt;
			type: 'select',&lt;br /&gt;
			name: 'editlevel',&lt;br /&gt;
			label: 'Edit protection:',&lt;br /&gt;
			event: Twinkle.protect.formevents.editlevel&lt;br /&gt;
		});&lt;br /&gt;
	editlevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'All',&lt;br /&gt;
			value: 'all'&lt;br /&gt;
		});&lt;br /&gt;
	editlevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'Autoconfirmed',&lt;br /&gt;
			value: 'autoconfirmed'&lt;br /&gt;
		});&lt;br /&gt;
	editlevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'Template editor',&lt;br /&gt;
			value: 'templateeditor'&lt;br /&gt;
		});&lt;br /&gt;
	editlevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'Sysop',&lt;br /&gt;
			value: 'sysop',&lt;br /&gt;
			selected: true&lt;br /&gt;
		});&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: 'select',&lt;br /&gt;
			name: 'editexpiry',&lt;br /&gt;
			label: 'Expires:',&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				if (e.target.value === 'custom') {&lt;br /&gt;
					Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			list: [&lt;br /&gt;
				{ label: '1 hour', value: '1 hour' },&lt;br /&gt;
				{ label: '2 hours', value: '2 hours' },&lt;br /&gt;
				{ label: '3 hours', value: '3 hours' },&lt;br /&gt;
				{ label: '6 hours', value: '6 hours' },&lt;br /&gt;
				{ label: '12 hours', value: '12 hours' },&lt;br /&gt;
				{ label: '1 day', value: '1 day' },&lt;br /&gt;
				{ label: '2 days', selected: true, value: '2 days' },&lt;br /&gt;
				{ label: '3 days', value: '3 days' },&lt;br /&gt;
				{ label: '4 days', value: '4 days' },&lt;br /&gt;
				{ label: '1 week', value: '1 week' },&lt;br /&gt;
				{ label: '2 weeks', value: '2 weeks' },&lt;br /&gt;
				{ label: '1 month', value: '1 month' },&lt;br /&gt;
				{ label: '2 months', value: '2 months' },&lt;br /&gt;
				{ label: '3 months', value: '3 months' },&lt;br /&gt;
				{ label: '1 year', value: '1 year' },&lt;br /&gt;
				{ label: 'indefinite', value:'indefinite' },&lt;br /&gt;
				{ label: 'Custom...', value: 'custom' }&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: 'checkbox',&lt;br /&gt;
			name: 'movemodify',&lt;br /&gt;
			event: Twinkle.protect.formevents.movemodify,&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: 'Modify move protection',&lt;br /&gt;
					value: 'movemodify',&lt;br /&gt;
					tooltip: 'Only for existing pages.',&lt;br /&gt;
					checked: true&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
	var movelevel = form.append({&lt;br /&gt;
			type: 'select',&lt;br /&gt;
			name: 'movelevel',&lt;br /&gt;
			label: 'Move protection:',&lt;br /&gt;
			event: Twinkle.protect.formevents.movelevel&lt;br /&gt;
		});&lt;br /&gt;
	movelevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'All',&lt;br /&gt;
			value: 'all'&lt;br /&gt;
		});&lt;br /&gt;
	movelevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'Autoconfirmed',&lt;br /&gt;
			value: 'autoconfirmed'&lt;br /&gt;
		});&lt;br /&gt;
	movelevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'Template editor',&lt;br /&gt;
			value: 'templateeditor'&lt;br /&gt;
		});&lt;br /&gt;
	movelevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'Sysop',&lt;br /&gt;
			value: 'sysop',&lt;br /&gt;
			selected: true&lt;br /&gt;
		});&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: 'select',&lt;br /&gt;
			name: 'moveexpiry',&lt;br /&gt;
			label: 'Expires:',&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				if (e.target.value === 'custom') {&lt;br /&gt;
					Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			list: [&lt;br /&gt;
				{ label: '1 hour', value: '1 hour' },&lt;br /&gt;
				{ label: '2 hours', value: '2 hours' },&lt;br /&gt;
				{ label: '3 hours', value: '3 hours' },&lt;br /&gt;
				{ label: '6 hours', value: '6 hours' },&lt;br /&gt;
				{ label: '12 hours', value: '12 hours' },&lt;br /&gt;
				{ label: '1 day', value: '1 day' },&lt;br /&gt;
				{ label: '2 days', selected: true, value: '2 days' },&lt;br /&gt;
				{ label: '3 days', value: '3 days' },&lt;br /&gt;
				{ label: '4 days', value: '4 days' },&lt;br /&gt;
				{ label: '1 week', value: '1 week' },&lt;br /&gt;
				{ label: '2 weeks', value: '2 weeks' },&lt;br /&gt;
				{ label: '1 month', value: '1 month' },&lt;br /&gt;
				{ label: '2 months', value: '2 months' },&lt;br /&gt;
				{ label: '3 months', value: '3 months' },&lt;br /&gt;
				{ label: '1 year', value: '1 year' },&lt;br /&gt;
				{ label: 'indefinite', value:'indefinite' },&lt;br /&gt;
				{ label: 'Custom...', value: 'custom' }&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: 'checkbox',&lt;br /&gt;
			name: 'createmodify',&lt;br /&gt;
			event: function twinklebatchprotectFormCreatemodifyEvent(e) {&lt;br /&gt;
				e.target.form.createlevel.disabled = !e.target.checked;&lt;br /&gt;
				e.target.form.createexpiry.disabled = !e.target.checked || (e.target.form.createlevel.value === 'all');&lt;br /&gt;
				e.target.form.createlevel.style.color = e.target.form.createexpiry.style.color = (e.target.checked ? &amp;quot;&amp;quot; : &amp;quot;transparent&amp;quot;);&lt;br /&gt;
			},&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: 'Modify create protection',&lt;br /&gt;
					value: 'createmodify',&lt;br /&gt;
					tooltip: 'Only for pages that do not exist.',&lt;br /&gt;
					checked: true&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
	var createlevel = form.append({&lt;br /&gt;
			type: 'select',&lt;br /&gt;
			name: 'createlevel',&lt;br /&gt;
			label: 'Create protection:',&lt;br /&gt;
			event: Twinkle.protect.formevents.createlevel&lt;br /&gt;
		});&lt;br /&gt;
	createlevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'All',&lt;br /&gt;
			value: 'all'&lt;br /&gt;
		});&lt;br /&gt;
	createlevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'Autoconfirmed',&lt;br /&gt;
			value: 'autoconfirmed'&lt;br /&gt;
		});&lt;br /&gt;
	createlevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'Template editor',&lt;br /&gt;
			value: 'templateeditor'&lt;br /&gt;
		});&lt;br /&gt;
	createlevel.append({&lt;br /&gt;
			type: 'option',&lt;br /&gt;
			label: 'Sysop',&lt;br /&gt;
			value: 'sysop',&lt;br /&gt;
			selected: true&lt;br /&gt;
		});&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: 'select',&lt;br /&gt;
			name: 'createexpiry',&lt;br /&gt;
			label: 'Expires:',&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				if (e.target.value === 'custom') {&lt;br /&gt;
					Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			list: [&lt;br /&gt;
				{ label: '1 hour', value: '1 hour' },&lt;br /&gt;
				{ label: '2 hours', value: '2 hours' },&lt;br /&gt;
				{ label: '3 hours', value: '3 hours' },&lt;br /&gt;
				{ label: '6 hours', value: '6 hours' },&lt;br /&gt;
				{ label: '12 hours', value: '12 hours' },&lt;br /&gt;
				{ label: '1 day', value: '1 day' },&lt;br /&gt;
				{ label: '2 days', value: '2 days' },&lt;br /&gt;
				{ label: '3 days', value: '3 days' },&lt;br /&gt;
				{ label: '4 days', value: '4 days' },&lt;br /&gt;
				{ label: '1 week', value: '1 week' },&lt;br /&gt;
				{ label: '2 weeks', value: '2 weeks' },&lt;br /&gt;
				{ label: '1 month', value: '1 month' },&lt;br /&gt;
				{ label: '2 months', value: '2 months' },&lt;br /&gt;
				{ label: '3 months', value: '3 months' },&lt;br /&gt;
				{ label: '1 year', value: '1 year' },&lt;br /&gt;
				{ label: 'indefinite', selected: true, value: 'indefinite' },&lt;br /&gt;
				{ label: 'Custom...', value: 'custom' }&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: 'textarea',&lt;br /&gt;
			name: 'reason',&lt;br /&gt;
			label: 'Reason (for protection log): '&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
	var query;&lt;br /&gt;
&lt;br /&gt;
	if( mw.config.get( 'wgNamespaceNumber' ) === 14 ) {  // categories&lt;br /&gt;
		query = {&lt;br /&gt;
			'action': 'query',&lt;br /&gt;
			'generator': 'categorymembers',&lt;br /&gt;
			'gcmtitle': mw.config.get( 'wgPageName' ),&lt;br /&gt;
			'gcmlimit' : Twinkle.getPref('batchMax'), // the max for sysops&lt;br /&gt;
			'prop': 'revisions',&lt;br /&gt;
			'rvprop': 'size'&lt;br /&gt;
		};&lt;br /&gt;
	} else if( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex' ) {&lt;br /&gt;
		query = {&lt;br /&gt;
			'action': 'query',&lt;br /&gt;
			'generator': 'allpages',&lt;br /&gt;
			'gapnamespace': Morebits.queryString.exists('namespace') ? Morebits.queryString.get( 'namespace' ) : document.getElementById('namespace').value,&lt;br /&gt;
			'gapprefix': Morebits.queryString.exists('from') ? Morebits.string.toUpperCaseFirstChar(Morebits.queryString.get( 'from' ).replace('+', ' ')) :&lt;br /&gt;
				Morebits.string.toUpperCaseFirstChar(document.getElementById('nsfrom').value),&lt;br /&gt;
			'gaplimit' : Twinkle.getPref('batchMax'), // the max for sysops&lt;br /&gt;
			'prop': 'revisions',&lt;br /&gt;
			'rvprop': 'size'&lt;br /&gt;
		};&lt;br /&gt;
	} else {&lt;br /&gt;
		query = {&lt;br /&gt;
			'action': 'query',&lt;br /&gt;
			'gpllimit' : Twinkle.getPref('batchMax'), // the max for sysops&lt;br /&gt;
			'generator': 'links',&lt;br /&gt;
			'titles': mw.config.get( 'wgPageName' ),&lt;br /&gt;
			'prop': 'revisions',&lt;br /&gt;
			'rvprop': 'size'&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var statusdiv = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	statusdiv.style.padding = '15px';  // just so it doesn'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;
&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api( 'loading...', query, function(apiobj) {&lt;br /&gt;
			var xml = apiobj.responseXML;&lt;br /&gt;
			var $pages = $(xml).find('page');&lt;br /&gt;
			var list = [];&lt;br /&gt;
			$pages.each(function(index, page) {&lt;br /&gt;
				var $page = $(page);&lt;br /&gt;
				var title = $page.attr('title');&lt;br /&gt;
				var isRedir = $page.attr('redirect') === &amp;quot;&amp;quot;; // XXX ??&lt;br /&gt;
				var missing = $page.attr('missing') === &amp;quot;&amp;quot;; // XXX ??&lt;br /&gt;
				var size = $page.find('rev').attr('size');&lt;br /&gt;
&lt;br /&gt;
				var metadata = [];&lt;br /&gt;
				if (missing) {&lt;br /&gt;
					metadata.push(&amp;quot;page does not exist&amp;quot;);&lt;br /&gt;
				} else {&lt;br /&gt;
					if (isRedir) {&lt;br /&gt;
						metadata.push(&amp;quot;redirect&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
					metadata.push(size + &amp;quot; bytes&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
				list.push( { label: title + (metadata.length ? (' (' + metadata.join('; ') + ')') : '' ), value: title, checked: true });&lt;br /&gt;
			});&lt;br /&gt;
			form.append({ type: 'header', label: 'Pages to protect' });&lt;br /&gt;
			form.append( {&lt;br /&gt;
					type: 'checkbox',&lt;br /&gt;
					name: 'pages',&lt;br /&gt;
					list: list&lt;br /&gt;
				} );&lt;br /&gt;
			form.append( { type:'submit' } );&lt;br /&gt;
&lt;br /&gt;
			var result = form.render();&lt;br /&gt;
			Window.setContent( result );&lt;br /&gt;
		}, statelem );&lt;br /&gt;
&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect.currentProtectCounter = 0;&lt;br /&gt;
Twinkle.batchprotect.currentprotector = 0;&lt;br /&gt;
Twinkle.batchprotect.callback.evaluate = function twinklebatchprotectCallbackEvaluate(event) {&lt;br /&gt;
	var pages = event.target.getChecked( 'pages' );&lt;br /&gt;
	var reason = event.target.reason.value;&lt;br /&gt;
	var editmodify = event.target.editmodify.checked;&lt;br /&gt;
	var editlevel = event.target.editlevel.value;&lt;br /&gt;
	var editexpiry = event.target.editexpiry.value;&lt;br /&gt;
	var movemodify = event.target.movemodify.checked;&lt;br /&gt;
	var movelevel = event.target.movelevel.value;&lt;br /&gt;
	var moveexpiry = event.target.moveexpiry.value;&lt;br /&gt;
	var createmodify = event.target.createmodify.checked;&lt;br /&gt;
	var createlevel = event.target.createlevel.value;&lt;br /&gt;
	var createexpiry = event.target.createexpiry.value;&lt;br /&gt;
&lt;br /&gt;
	if( ! reason ) {&lt;br /&gt;
		alert(&amp;quot;You've got to give a reason, you rouge admin!&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled(false);&lt;br /&gt;
	Morebits.status.init( event.target );&lt;br /&gt;
&lt;br /&gt;
	if( !pages ) {&lt;br /&gt;
		Morebits.status.error( 'Error', 'Nothing to protect, aborting' );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var toCall = function twinklebatchprotectToCall( work ) {&lt;br /&gt;
		if( work.length === 0 &amp;amp;&amp;amp; Twinkle.batchprotect.currentProtectCounter &amp;lt;= 0 ) {&lt;br /&gt;
			Morebits.status.info( 'work done' );&lt;br /&gt;
			window.clearInterval( Twinkle.batchprotect.currentprotector );&lt;br /&gt;
			Twinkle.batchprotect.currentprotector = Twinkle.batchprotect.currentProtectCounter = 0;&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		} else if( work.length !== 0 &amp;amp;&amp;amp; Twinkle.batchprotect.currentProtectCounter &amp;lt;= Twinkle.getPref('batchProtectMinCutOff') ) {&lt;br /&gt;
			var pages = work.shift();&lt;br /&gt;
			Twinkle.batchprotect.currentProtectCounter += 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;
					'action': 'query',&lt;br /&gt;
					'titles': page&lt;br /&gt;
				};&lt;br /&gt;
				var wikipedia_api = new Morebits.wiki.api( 'Checking if page ' + page + ' exists', query, Twinkle.batchprotect.callbacks.main );&lt;br /&gt;
				wikipedia_api.params = {&lt;br /&gt;
					page: page,&lt;br /&gt;
					reason: reason,&lt;br /&gt;
					editmodify: editmodify,&lt;br /&gt;
					editlevel: editlevel,&lt;br /&gt;
					editexpiry: editexpiry,&lt;br /&gt;
					movemodify: movemodify,&lt;br /&gt;
					movelevel: movelevel,&lt;br /&gt;
					moveexpiry: moveexpiry,&lt;br /&gt;
					createmodify: createmodify,&lt;br /&gt;
					createlevel: createlevel,&lt;br /&gt;
					createexpiry: createexpiry&lt;br /&gt;
				};&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('batchProtectChunks') );&lt;br /&gt;
	Morebits.wiki.addCheckpoint();&lt;br /&gt;
	Twinkle.batchprotect.currentprotector = window.setInterval( toCall, 1000, work );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect.callbacks = {&lt;br /&gt;
	main: function( apiobj ) {&lt;br /&gt;
		var xml = apiobj.responseXML;&lt;br /&gt;
		var normal = $(xml).find('normalized n').attr('to');&lt;br /&gt;
		if( normal ) {&lt;br /&gt;
			apiobj.params.page = normal;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var exists = ($(xml).find('page').attr('missing') !== &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		var page = new Morebits.wiki.page(apiobj.params.page, &amp;quot;Protecting &amp;quot; + apiobj.params.page);&lt;br /&gt;
		var takenAction = false;&lt;br /&gt;
		if (exists &amp;amp;&amp;amp; apiobj.params.editmodify) {&lt;br /&gt;
			page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);&lt;br /&gt;
			takenAction = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (exists &amp;amp;&amp;amp; apiobj.params.movemodify) {&lt;br /&gt;
			page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);&lt;br /&gt;
			takenAction = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (!exists &amp;amp;&amp;amp; apiobj.params.createmodify) {&lt;br /&gt;
			page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);&lt;br /&gt;
			takenAction = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (!takenAction) {&lt;br /&gt;
			Morebits.status.warn(&amp;quot;Protecting &amp;quot; + apiobj.params.page, &amp;quot;page &amp;quot; + (exists ? &amp;quot;exists&amp;quot; : &amp;quot;does not exist&amp;quot;) + &amp;quot;; nothing to do, skipping&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		page.setEditSummary(apiobj.params.reason);&lt;br /&gt;
&lt;br /&gt;
		page.protect(function(pageobj) {&lt;br /&gt;
			--Twinkle.batchprotect.currentProtectCounter;&lt;br /&gt;
			var link = document.createElement( 'a' );&lt;br /&gt;
			link.setAttribute( 'href', mw.util.getUrl( apiobj.params.page ) );&lt;br /&gt;
			link.appendChild( document.createTextNode( apiobj.params.page ) );&lt;br /&gt;
			pageobj.getStatusElement().info( [ 'completed (' , link , ')' ] );&lt;br /&gt;
		} );&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>Amalthea</name></author>
		
	</entry>
</feed>