<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.endmyopia.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="https://wiki.endmyopia.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklebatchprotect.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;action=history"/>
	<updated>2026-05-06T20:37:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=8601&amp;oldid=prev</id>
		<title>NottNott: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=8601&amp;oldid=prev"/>
		<updated>2020-06-12T10:46:06Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:46, 12 June 2020&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key jakeendmy_mw1720-mwnr_:diff::1.12:old-8600:rev-8601 --&gt;
&lt;/table&gt;</summary>
		<author><name>NottNott</name></author>
	</entry>
	<entry>
		<id>https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=8600&amp;oldid=prev</id>
		<title>en&gt;Amorymeltzer: Repo at ffe5bbed: Use Morebits.date .calendar to format protection confirmations/notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=8600&amp;oldid=prev"/>
		<updated>2020-04-25T17:26:45Z</updated>

		<summary type="html">&lt;p&gt;Repo at ffe5bbed: Use Morebits.date .calendar to format protection confirmations/notes&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;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect = function twinklebatchprotect() {&lt;br /&gt;
	if (Morebits.userIsSysop &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, 'P-batch', 'tw-pbatch', 'Protect pages linked from this page');&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(600, 400);&lt;br /&gt;
	Window.setTitle('Batch protection');&lt;br /&gt;
	Window.setScriptName('Twinkle');&lt;br /&gt;
	Window.addFooterLink('Protection policy', 'WP:PROT');&lt;br /&gt;
	Window.addFooterLink('Twinkle help', 'WP:TW/DOC#protect');&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: 'Extended confirmed',&lt;br /&gt;
		value: 'extendedconfirmed'&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: 'Extended confirmed',&lt;br /&gt;
		value: 'extendedconfirmed'&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 ? '' : 'transparent';&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: 'Extended confirmed',&lt;br /&gt;
		value: 'extendedconfirmed'&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: 'header',&lt;br /&gt;
		label: ''  // horizontal rule&lt;br /&gt;
	});&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: 'input',&lt;br /&gt;
		name: 'reason',&lt;br /&gt;
		label: 'Reason: ',&lt;br /&gt;
		size: 60,&lt;br /&gt;
		tooltip: 'For the protection log and page history.'&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	var query = {&lt;br /&gt;
		'action': 'query',&lt;br /&gt;
		'prop': 'revisions|info',&lt;br /&gt;
		'rvprop': 'size',&lt;br /&gt;
		'inprop': 'protection'&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	if (mw.config.get('wgNamespaceNumber') === 14) {  // categories&lt;br /&gt;
		query.generator = 'categorymembers';&lt;br /&gt;
		query.gcmtitle = mw.config.get('wgPageName');&lt;br /&gt;
		query.gcmlimit = Twinkle.getPref('batchMax');&lt;br /&gt;
	} else if (mw.config.get('wgCanonicalSpecialPageName') === 'Prefixindex') {&lt;br /&gt;
		query.generator = 'allpages';&lt;br /&gt;
		query.gapnamespace = mw.util.getParamValue('namespace') || $('select[name=namespace]').val();&lt;br /&gt;
		query.gapprefix = mw.util.getParamValue('prefix') || $('input[name=prefix]').val();&lt;br /&gt;
		query.gaplimit = Twinkle.getPref('batchMax');&lt;br /&gt;
	} else {&lt;br /&gt;
		query.generator = 'links';&lt;br /&gt;
		query.titles = mw.config.get('wgPageName');&lt;br /&gt;
		query.gpllimit = Twinkle.getPref('batchMax');&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var statusdiv = document.createElement('div');&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('Grabbing list of pages');&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') === ''; // XXX ??&lt;br /&gt;
			var missing = $page.attr('missing') === ''; // XXX ??&lt;br /&gt;
			var size = $page.find('rev').attr('size');&lt;br /&gt;
			var $editProt;&lt;br /&gt;
&lt;br /&gt;
			var metadata = [];&lt;br /&gt;
			if (missing) {&lt;br /&gt;
				metadata.push('page does not exist');&lt;br /&gt;
				$editProt = $page.find('pr[type=&amp;quot;create&amp;quot;][level=&amp;quot;sysop&amp;quot;]');&lt;br /&gt;
			} else {&lt;br /&gt;
				if (isRedir) {&lt;br /&gt;
					metadata.push('redirect');&lt;br /&gt;
				}&lt;br /&gt;
				metadata.push(size + ' bytes');&lt;br /&gt;
				$editProt = $page.find('pr[type=&amp;quot;edit&amp;quot;][level=&amp;quot;sysop&amp;quot;]');&lt;br /&gt;
			}&lt;br /&gt;
			if ($editProt.length &amp;gt; 0) {&lt;br /&gt;
				metadata.push('fully' + (missing ? ' create' : '') + ' protected' +&lt;br /&gt;
				($editProt.attr('expiry') === 'infinity' ? ' indefinitely' : ', expires ' + new Morebits.date($editProt.attr('expiry')).calendar('utc') + ' (UTC)'));&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			list.push({ label: title + (metadata.length ? ' (' + metadata.join('; ') + ')' : ''), value: title, checked: true, style: $editProt.length &amp;gt; 0 ? 'color:red' : '' });&lt;br /&gt;
		});&lt;br /&gt;
		form.append({ type: 'header', label: 'Pages to protect' });&lt;br /&gt;
		form.append({&lt;br /&gt;
			type: 'button',&lt;br /&gt;
			label: 'Select All',&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		form.append({&lt;br /&gt;
			type: 'button',&lt;br /&gt;
			label: 'Deselect All',&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);&lt;br /&gt;
			}&lt;br /&gt;
		});&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;
&lt;br /&gt;
		Morebits.checkboxShiftClickSupport(Morebits.quickForm.getElements(result, 'pages'));&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;
	Morebits.wiki.actionCompleted.notice = 'Batch protection is now complete';&lt;br /&gt;
&lt;br /&gt;
	var form = event.target;&lt;br /&gt;
&lt;br /&gt;
	var numProtected = $(Morebits.quickForm.getElements(form, 'pages')).filter(function(index, element) {&lt;br /&gt;
		return element.checked &amp;amp;&amp;amp; element.nextElementSibling.style.color === 'red';&lt;br /&gt;
	}).length;&lt;br /&gt;
	if (numProtected &amp;gt; 0 &amp;amp;&amp;amp; !confirm('You are about to act on ' + numProtected + ' fully protected page(s). Are you sure?')) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var pages = form.getChecked('pages');&lt;br /&gt;
	var reason = form.reason.value;&lt;br /&gt;
	var editmodify = form.editmodify.checked;&lt;br /&gt;
	var editlevel = form.editlevel.value;&lt;br /&gt;
	var editexpiry = form.editexpiry.value;&lt;br /&gt;
	var movemodify = form.movemodify.checked;&lt;br /&gt;
	var movelevel = form.movelevel.value;&lt;br /&gt;
	var moveexpiry = form.moveexpiry.value;&lt;br /&gt;
	var createmodify = form.createmodify.checked;&lt;br /&gt;
	var createlevel = form.createlevel.value;&lt;br /&gt;
	var createexpiry = form.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(form);&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 batchOperation = new Morebits.batchOperation('Applying protection settings');&lt;br /&gt;
	batchOperation.setOption('chunkSize', Twinkle.getPref('batchProtectChunks'));&lt;br /&gt;
	batchOperation.setOption('preserveIndividualStatusLines', true);&lt;br /&gt;
	batchOperation.setPageList(pages);&lt;br /&gt;
	batchOperation.run(function(pageName) {&lt;br /&gt;
		var query = {&lt;br /&gt;
			'action': 'query',&lt;br /&gt;
			'titles': pageName&lt;br /&gt;
		};&lt;br /&gt;
		var wikipedia_api = new Morebits.wiki.api('Checking if page ' + pageName + ' exists', query,&lt;br /&gt;
			Twinkle.batchprotect.callbacks.main, null, batchOperation.workerFailure);&lt;br /&gt;
		wikipedia_api.params = {&lt;br /&gt;
			page: pageName,&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;
			batchOperation: batchOperation&lt;br /&gt;
		};&lt;br /&gt;
		wikipedia_api.post();&lt;br /&gt;
	});&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') !== '';&lt;br /&gt;
&lt;br /&gt;
		var page = new Morebits.wiki.page(apiobj.params.page, 'Protecting ' + 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('Protecting ' + apiobj.params.page, 'page ' + (exists ? 'exists' : 'does not exist') + '; nothing to do, skipping');&lt;br /&gt;
			apiobj.params.batchOperation.workerFailure(apiobj);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		page.setEditSummary(apiobj.params.reason);&lt;br /&gt;
		page.protect(apiobj.params.batchOperation.workerSuccess, apiobj.params.batchOperation.workerFailure);&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>en&gt;Amorymeltzer</name></author>
	</entry>
</feed>