<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://www.explainxkcd.com/wiki/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Cat-a-lot.js</id>
		<title>MediaWiki:Gadget-Cat-a-lot.js - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://www.explainxkcd.com/wiki/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Cat-a-lot.js"/>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;action=history"/>
		<updated>2026-05-27T13:26:37Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://www.explainxkcd.com/wiki/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;diff=19156&amp;oldid=prev</id>
		<title>Waldir: test from commons</title>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;diff=19156&amp;oldid=prev"/>
				<updated>2012-11-22T17:34:52Z</updated>
		
		<summary type="html">&lt;p&gt;test from commons&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;
// Cat-A-Lot&lt;br /&gt;
// Changes category of multiple files&lt;br /&gt;
//&lt;br /&gt;
// Originally by Magnus Manske&lt;br /&gt;
// RegExes by Ilmari Karonen&lt;br /&gt;
// Completely rewritten by DieBuche&lt;br /&gt;
//&lt;br /&gt;
// Requires [[MediaWiki:Gadget-SettingsManager.js]] and [[MediaWiki:Gadget-SettingsUI.js]] (properly registered) for per-user-settings&lt;br /&gt;
//&lt;br /&gt;
// READ THIS PAGE IF YOU WANT TO TRANSLATE OR USE THIS ON ANOTHER SITE:&lt;br /&gt;
// http://commons.wikimedia.org/wiki/MediaWiki:Gadget-Cat-a-lot.js/translating&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
/*global jQuery:false, mediaWiki:false */&lt;br /&gt;
/*jshint curly:false*/&lt;br /&gt;
 &lt;br /&gt;
(function($, mw) {&lt;br /&gt;
'use strict';&lt;br /&gt;
 &lt;br /&gt;
var nsNumber = mw.config.get('wgNamespaceNumber'),&lt;br /&gt;
	catALot;&lt;br /&gt;
 &lt;br /&gt;
catALot = window.catALot = {&lt;br /&gt;
	apiUrl: mw.util.wikiScript('api'),&lt;br /&gt;
	searchmode: false,&lt;br /&gt;
	version: 3.3,&lt;br /&gt;
	setHeight: 450,&lt;br /&gt;
	settings: {},&lt;br /&gt;
	init: function() {&lt;br /&gt;
		this._initSettings();&lt;br /&gt;
		$(&amp;quot;body&amp;quot;).append('&amp;lt;div id=&amp;quot;cat_a_lot&amp;quot;&amp;gt;' + &lt;br /&gt;
			'&amp;lt;div id=&amp;quot;cat_a_lot_data&amp;quot;&amp;gt;&amp;lt;div&amp;gt;' + '&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cat_a_lot_searchcatname&amp;quot; placeholder=&amp;quot;' + this.i18n.enterName + '&amp;quot;/&amp;gt;' + '&amp;lt;/div&amp;gt;' + &lt;br /&gt;
				'&amp;lt;div id=&amp;quot;cat_a_lot_category_list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;' + &lt;br /&gt;
				'&amp;lt;div id=&amp;quot;cat_a_lot_mark_counter&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;' + &lt;br /&gt;
				'&amp;lt;div id=&amp;quot;cat_a_lot_selections&amp;quot;&amp;gt;' + this.i18n.select + &lt;br /&gt;
					' &amp;lt;a id=&amp;quot;cat_a_lot_select_all&amp;quot;&amp;gt;' + this.i18n.all + '&amp;lt;/a&amp;gt; / ' + &lt;br /&gt;
					'&amp;lt;a id=&amp;quot;cat_a_lot_select_none&amp;quot;&amp;gt;' + this.i18n.none + '&amp;lt;/a&amp;gt;' + &lt;br /&gt;
				'&amp;lt;/div&amp;gt;' +&lt;br /&gt;
				'&amp;lt;div id=&amp;quot;cat_a_lot_settings&amp;quot;&amp;gt;&amp;lt;a id=&amp;quot;cat_a_lot_config_settings&amp;quot;&amp;gt;' + this.i18n.configSettings + '&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;' + &lt;br /&gt;
			'&amp;lt;div id=&amp;quot;cat_a_lot_head&amp;quot;&amp;gt;' + '&amp;lt;a id=&amp;quot;cat_a_lot_toggle&amp;quot;&amp;gt;Cat-a-lot&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;');&lt;br /&gt;
 &lt;br /&gt;
		if (!this.searchmode) $('#cat_a_lot_selections').append('&amp;lt;br&amp;gt;&amp;lt;a id=&amp;quot;cat_a_lot_remove&amp;quot;&amp;gt;&amp;lt;b&amp;gt;' + this.i18n.removeFromCat + '&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;');&lt;br /&gt;
 &lt;br /&gt;
		if ('MediaWiki:Gadget-Cat-a-lot.js' === mw.util.getParamValue('withJS') &amp;amp;&amp;amp; !mw.util.getParamValue('withCSS')) {&lt;br /&gt;
			importStylesheet('MediaWiki:Gadget-Cat-a-lot.css');&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		var $searchName = $('#cat_a_lot_searchcatname'),&lt;br /&gt;
			reCat = new RegExp('^\\s*' + catALot.localizedRegex(14, 'Category') + ':', '');&lt;br /&gt;
 &lt;br /&gt;
		$searchName.keypress(function(e) {&lt;br /&gt;
			if (e.which === 13) {&lt;br /&gt;
				catALot.updateCats($.trim($(this).val()));&lt;br /&gt;
			}&lt;br /&gt;
		}).autocomplete({&lt;br /&gt;
			source: function(request, response) {&lt;br /&gt;
				catALot.doAPICall({&lt;br /&gt;
					action: 'opensearch',&lt;br /&gt;
					search: request.term,&lt;br /&gt;
					namespace: 14&lt;br /&gt;
				}, function(data) {&lt;br /&gt;
					if (data[1]) response($(data[1]).map(function(index, item) {&lt;br /&gt;
						return item.replace(reCat, '');&lt;br /&gt;
					}));&lt;br /&gt;
				});&lt;br /&gt;
			},&lt;br /&gt;
			open: function() {&lt;br /&gt;
				$(&amp;quot;.ui-autocomplete&amp;quot;).position({&lt;br /&gt;
					my: $('body').is('.rtl') ? &amp;quot;left bottom&amp;quot; : &amp;quot;right bottom&amp;quot;,&lt;br /&gt;
					at: $('body').is('.rtl') ? &amp;quot;left top&amp;quot; : &amp;quot;right top&amp;quot;,&lt;br /&gt;
					of: $('#cat_a_lot_searchcatname')&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
		}).bind('input keyup', function() {&lt;br /&gt;
			var oldVal = this.value,&lt;br /&gt;
				newVal = oldVal.replace(reCat, '');&lt;br /&gt;
			if (newVal !== oldVal) this.value = newVal;&lt;br /&gt;
		});&lt;br /&gt;
		if (this.searchmode) {&lt;br /&gt;
			$searchName.val(mw.util.getParamValue('search'));&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		$('#cat_a_lot_remove').click(function() {&lt;br /&gt;
			catALot.remove();&lt;br /&gt;
		});&lt;br /&gt;
		$('#cat_a_lot_select_all').click(function() {&lt;br /&gt;
			catALot.toggleAll(true);&lt;br /&gt;
		});&lt;br /&gt;
		$('#cat_a_lot_select_none').click(function() {&lt;br /&gt;
			catALot.toggleAll(false);&lt;br /&gt;
		});&lt;br /&gt;
		$('#cat_a_lot_toggle').click(function() {&lt;br /&gt;
			$(this).toggleClass('cat_a_lot_enabled');&lt;br /&gt;
			catALot.run();&lt;br /&gt;
		});&lt;br /&gt;
		$('#cat_a_lot_config_settings').click(function(e) {&lt;br /&gt;
			catALot.manageSettings();&lt;br /&gt;
		});&lt;br /&gt;
 &lt;br /&gt;
		this.localCatName = mw.config.get('wgFormattedNamespaces')[14];&lt;br /&gt;
	},&lt;br /&gt;
	findAllLabels: function() {&lt;br /&gt;
		// It's possible to allow any kind of pages as well but what happens if you click on &amp;quot;select all&amp;quot; and don't expect it&lt;br /&gt;
		if (this.searchmode) {&lt;br /&gt;
			this.labels = $('table.searchResultImage').find('tr&amp;gt;td:eq(1)');&lt;br /&gt;
			if (this.settings.editpages) {&lt;br /&gt;
				this.labels = this.labels.add('div.mw-search-result-heading');&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			this.labels = $('div.gallerytext').add($('div#mw-category-media').find('li[class!=&amp;quot;gallerybox&amp;quot;]'));&lt;br /&gt;
 &lt;br /&gt;
			if (this.settings.editpages) {&lt;br /&gt;
				var $pgs = $('div#mw-pages, div#mw-subcategories').find('li');&lt;br /&gt;
				this.labels = this.labels.add($pgs);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	getTitleFromLink: function(href) {&lt;br /&gt;
		try {&lt;br /&gt;
			return decodeURIComponent(href).match(/wiki\/(.+?)(?:#.+)?$/)[1].replace(/_/g, ' ');&lt;br /&gt;
		} catch (ex) {&lt;br /&gt;
			return '';&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	getMarkedLabels: function() {&lt;br /&gt;
		var marked = [];&lt;br /&gt;
		this.selectedLabels = this.labels.filter('.cat_a_lot_selected');&lt;br /&gt;
		this.selectedLabels.each(function() {&lt;br /&gt;
			var file = $(this).find('a[title]'),&lt;br /&gt;
				title = file.attr('title') || catALot.getTitleFromLink(file.attr('href')) || catALot.getTitleFromLink($(this).find('a').attr('href'));&lt;br /&gt;
 &lt;br /&gt;
			marked.push([title, $(this)]);&lt;br /&gt;
		});&lt;br /&gt;
		return marked;&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	updateSelectionCounter: function() {&lt;br /&gt;
		this.selectedLabels = this.labels.filter('.cat_a_lot_selected');&lt;br /&gt;
		$('#cat_a_lot_mark_counter').show().html(this.selectedLabels.length + this.i18n.filesSelected);&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	makeClickable: function() {&lt;br /&gt;
		this.findAllLabels();&lt;br /&gt;
		this.labels.catALotShiftClick(function() {&lt;br /&gt;
			catALot.updateSelectionCounter();&lt;br /&gt;
		}).addClass('cat_a_lot_label');&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	toggleAll: function(select) {&lt;br /&gt;
		this.labels.toggleClass('cat_a_lot_selected', select);&lt;br /&gt;
		this.updateSelectionCounter();&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	getSubCats: function() {&lt;br /&gt;
		var data = {&lt;br /&gt;
			action: 'query',&lt;br /&gt;
			list: 'categorymembers',&lt;br /&gt;
			cmtype: 'subcat',&lt;br /&gt;
			cmlimit: 50,&lt;br /&gt;
			cmtitle: 'Category:' + this.currentCategory&lt;br /&gt;
		};&lt;br /&gt;
 &lt;br /&gt;
		this.doAPICall(data, function(result) {&lt;br /&gt;
 &lt;br /&gt;
			var cats = result.query.categorymembers;&lt;br /&gt;
 &lt;br /&gt;
			catALot.subCats = [];&lt;br /&gt;
			for (var i = 0; i &amp;lt; cats.length; i++) {&lt;br /&gt;
				catALot.subCats.push(cats[i].title.replace(/^[^:]+:/, &amp;quot;&amp;quot;));&lt;br /&gt;
			}&lt;br /&gt;
			catALot.catCounter++;&lt;br /&gt;
			if (catALot.catCounter === 2) catALot.showCategoryList();&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	getParentCats: function() {&lt;br /&gt;
		var data = {&lt;br /&gt;
			action: 'query',&lt;br /&gt;
			prop: 'categories',&lt;br /&gt;
			titles: 'Category:' + this.currentCategory&lt;br /&gt;
		};&lt;br /&gt;
		this.doAPICall(data, function(result) {&lt;br /&gt;
			catALot.parentCats = [];&lt;br /&gt;
			var cats, pages = result.query.pages;&lt;br /&gt;
			if (pages[-1] &amp;amp;&amp;amp; pages[-1].missing === '') {&lt;br /&gt;
				catALot.catlist.html('&amp;lt;span id=&amp;quot;cat_a_lot_no_found&amp;quot;&amp;gt;' + catALot.i18n.catNotFound + '&amp;lt;/span&amp;gt;');&lt;br /&gt;
				document.body.style.cursor = 'auto';&lt;br /&gt;
 &lt;br /&gt;
				catALot.catlist.append('&amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;');&lt;br /&gt;
				catALot.createCatLinks(&amp;quot;→&amp;quot;, [catALot.currentCategory]);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			// there should be only one, but we don't know its ID&lt;br /&gt;
			for (var id in pages) {&lt;br /&gt;
				cats = pages[id].categories;&lt;br /&gt;
			}&lt;br /&gt;
			for (var i = 0; i &amp;lt; cats.length; i++) {&lt;br /&gt;
				catALot.parentCats.push(cats[i].title.replace(/^[^:]+:/, &amp;quot;&amp;quot;));&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			catALot.catCounter++;&lt;br /&gt;
			if (catALot.catCounter === 2) catALot.showCategoryList();&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	localizedRegex: function(namespaceNumber, fallback) {&lt;br /&gt;
		//Copied from HotCat. Thanks Lupo.&lt;br /&gt;
		var wikiTextBlank = '[\\t _\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]+';&lt;br /&gt;
		var wikiTextBlankRE = new RegExp(wikiTextBlank, 'g');&lt;br /&gt;
 &lt;br /&gt;
		var createRegexStr = function(name) {&lt;br /&gt;
				if (!name || name.length === 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
				var regex_name = &amp;quot;&amp;quot;;&lt;br /&gt;
				for (var i = 0; i &amp;lt; name.length; i++) {&lt;br /&gt;
					var initial = name.substr(i, 1);&lt;br /&gt;
					var ll = initial.toLowerCase();&lt;br /&gt;
					var ul = initial.toUpperCase();&lt;br /&gt;
					if (ll === ul) {&lt;br /&gt;
						regex_name += initial;&lt;br /&gt;
					} else {&lt;br /&gt;
						regex_name += '[' + ll + ul + ']';&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				return regex_name.replace(/([\\\^\$\.\?\*\+\(\)])/g, '\\$1').replace(wikiTextBlankRE, wikiTextBlank);&lt;br /&gt;
		};&lt;br /&gt;
 &lt;br /&gt;
		fallback = fallback.toLowerCase();&lt;br /&gt;
		var canonical = wgFormattedNamespaces[namespaceNumber].toLowerCase();&lt;br /&gt;
		var RegexString = createRegexStr(canonical);&lt;br /&gt;
		if (fallback &amp;amp;&amp;amp; canonical !== fallback) RegexString += '|' + createRegexStr(fallback);&lt;br /&gt;
		for (var catName in wgNamespaceIds) {&lt;br /&gt;
			if (typeof(catName) === 'string' &amp;amp;&amp;amp; catName.toLowerCase() !== canonical &amp;amp;&amp;amp; catName.toLowerCase() !== fallback &amp;amp;&amp;amp; wgNamespaceIds[catName] === namespaceNumber) {&lt;br /&gt;
				RegexString += '|' + createRegexStr(catName);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return RegexString;&lt;br /&gt;
	},&lt;br /&gt;
	regexBuilder: function(category) {&lt;br /&gt;
		var catname = this.localizedRegex(14, 'Category');&lt;br /&gt;
 &lt;br /&gt;
		// Build a regexp string for matching the given category:&lt;br /&gt;
		// trim leading/trailing whitespace and underscores&lt;br /&gt;
		category = category.replace(/^[\s_]+/, &amp;quot;&amp;quot;).replace(/[\s_]+$/, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
		// escape regexp metacharacters (= any ASCII punctuation except _)&lt;br /&gt;
		category = $.escapeRE(category);&lt;br /&gt;
 &lt;br /&gt;
		// any sequence of spaces and underscores should match any other&lt;br /&gt;
		category = category.replace(/[\s_]+/g, '[\\s_]+');&lt;br /&gt;
 &lt;br /&gt;
		// Make the first character case-insensitive:&lt;br /&gt;
		var first = category.substr(0, 1);&lt;br /&gt;
		if (first.toUpperCase() !== first.toLowerCase()) category = '[' + first.toUpperCase() + first.toLowerCase() + ']' + category.substr(1);&lt;br /&gt;
 &lt;br /&gt;
		// Compile it into a RegExp that matches MediaWiki category syntax (yeah, it looks ugly):&lt;br /&gt;
		// XXX: the first capturing parens are assumed to match the sortkey, if present, including the | but excluding the ]]&lt;br /&gt;
		return new RegExp('\\[\\[[\\s_]*' + catname + '[\\s_]*:[\\s_]*' + category + '[\\s_]*(\\|[^\\]]*(?:\\][^\\]]+)*)?\\]\\]', 'g');&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	getContent: function(file, targetcat, mode) {&lt;br /&gt;
 &lt;br /&gt;
		var data = {&lt;br /&gt;
			action: 'query',&lt;br /&gt;
			prop: 'info|revisions',&lt;br /&gt;
			rvprop: 'content|timestamp',&lt;br /&gt;
			intoken: 'edit',&lt;br /&gt;
			titles: file[0]&lt;br /&gt;
		};&lt;br /&gt;
 &lt;br /&gt;
		this.doAPICall(data, function(result) {&lt;br /&gt;
			catALot.editCategories(result, file, targetcat, mode);&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	// Remove {{Uncategorized}}. No need to replace it with anything.&lt;br /&gt;
	removeUncat: function(text) {&lt;br /&gt;
		return text.replace(/\{\{\s*[Uu]ncategorized\s*(\|?.*?)\}\}/, &amp;quot;&amp;quot;);&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	doCleanup: function(text) {&lt;br /&gt;
		if (this.settings.docleanup) {&lt;br /&gt;
			return text.replace(/\{\{\s*[Ch]eck categories\s*(\|?.*?)\}\}/, &amp;quot;&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			return text;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	editCategories: function(result, file, targetcat, mode) {&lt;br /&gt;
		var otext, starttimestamp, timestamp;&lt;br /&gt;
		if (!result) {&lt;br /&gt;
			//Happens on unstable wifi connections..&lt;br /&gt;
			this.connectionError.push(file[0]);&lt;br /&gt;
			this.updateCounter();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		var pages = result.query.pages;&lt;br /&gt;
 &lt;br /&gt;
		// there should be only one, but we don't know its ID&lt;br /&gt;
		for (var id in pages) {&lt;br /&gt;
			// The edittoken only changes between logins&lt;br /&gt;
			this.edittoken = pages[id].edittoken;&lt;br /&gt;
			otext = pages[id].revisions[0]['*'];&lt;br /&gt;
			starttimestamp = pages[id].starttimestamp;&lt;br /&gt;
			timestamp = pages[id].revisions[0].timestamp;&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
		var sourcecat = wgTitle;&lt;br /&gt;
		// Check if that file is already in that category&lt;br /&gt;
		if (mode !== &amp;quot;remove&amp;quot; &amp;amp;&amp;amp; this.regexBuilder(targetcat).test(otext)) {&lt;br /&gt;
 &lt;br /&gt;
			//If the new cat is already there, just remove the old one.&lt;br /&gt;
			if (mode === 'move') {&lt;br /&gt;
				mode = 'remove';&lt;br /&gt;
			} else {&lt;br /&gt;
				this.alreadyThere.push(file[0]);&lt;br /&gt;
				this.updateCounter();&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		var text = otext;&lt;br /&gt;
		var comment;&lt;br /&gt;
 &lt;br /&gt;
		// Fix text&lt;br /&gt;
		switch (mode) {&lt;br /&gt;
		case 'add':&lt;br /&gt;
			text += &amp;quot;\n[[&amp;quot; + this.localCatName + &amp;quot;:&amp;quot; + targetcat + &amp;quot;]]\n&amp;quot;;&lt;br /&gt;
			comment = this.i18n.summaryAdd + targetcat + &amp;quot;]]&amp;quot;;&lt;br /&gt;
			break;&lt;br /&gt;
		case 'copy':&lt;br /&gt;
			text = text.replace(this.regexBuilder(sourcecat), &amp;quot;[[&amp;quot; + this.localCatName + &amp;quot;:&amp;quot; + sourcecat + &amp;quot;$1]]\n[[&amp;quot; + this.localCatName + &amp;quot;:&amp;quot; + targetcat + &amp;quot;$1]]&amp;quot;);&lt;br /&gt;
			comment = this.i18n.summaryCopy + sourcecat + &amp;quot;]] &amp;quot; + this.i18n.to + targetcat + &amp;quot;]]&amp;quot;;&lt;br /&gt;
			//If category is added through template:&lt;br /&gt;
			if (otext === text) {&lt;br /&gt;
				text += &amp;quot;\n[[&amp;quot; + this.localCatName + &amp;quot;:&amp;quot; + targetcat + &amp;quot;]]&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		case 'move':&lt;br /&gt;
			text = text.replace(this.regexBuilder(sourcecat), &amp;quot;[[&amp;quot; + this.localCatName + &amp;quot;:&amp;quot; + targetcat + &amp;quot;$1]]&amp;quot;);&lt;br /&gt;
			comment = this.i18n.summaryMove + sourcecat + &amp;quot;]] &amp;quot; + this.i18n.to + targetcat + &amp;quot;]]&amp;quot;;&lt;br /&gt;
			break;&lt;br /&gt;
		case 'remove':&lt;br /&gt;
			text = text.replace(this.regexBuilder(sourcecat), &amp;quot;&amp;quot;);&lt;br /&gt;
			comment = this.i18n.summaryRemove + sourcecat + &amp;quot;]]&amp;quot;;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		if (text === otext) {&lt;br /&gt;
			this.notFound.push(file[0]);&lt;br /&gt;
			this.updateCounter();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		// Remove uncat after we checked whether we changed the text successfully.&lt;br /&gt;
		// Otherwise we might fail to do the changes, but still replace {{uncat}}&lt;br /&gt;
		if (mode !== 'remove') {&lt;br /&gt;
			text = this.doCleanup(this.removeUncat(text));&lt;br /&gt;
		}&lt;br /&gt;
		var data = {&lt;br /&gt;
			action: 'edit',&lt;br /&gt;
			summary: comment,&lt;br /&gt;
			title: file[0],&lt;br /&gt;
			text: text,&lt;br /&gt;
			starttimestamp: starttimestamp,&lt;br /&gt;
			basetimestamp: timestamp,&lt;br /&gt;
			watchlist: this.settings.watchlist,&lt;br /&gt;
			token: this.edittoken&lt;br /&gt;
		};&lt;br /&gt;
		if (this.settings.minor) data.minor = true;&lt;br /&gt;
 &lt;br /&gt;
		this.doAPICall(data, function(ret) {&lt;br /&gt;
			catALot.updateCounter();&lt;br /&gt;
		});&lt;br /&gt;
		this.markAsDone(file[1], mode, targetcat);&lt;br /&gt;
	},&lt;br /&gt;
	markAsDone: function(label, mode, targetcat) {&lt;br /&gt;
 &lt;br /&gt;
		label.addClass('cat_a_lot_markAsDone');&lt;br /&gt;
		switch (mode) {&lt;br /&gt;
		case 'add':&lt;br /&gt;
			label.append('&amp;lt;br&amp;gt;' + this.i18n.addedCat + ' ' + targetcat);&lt;br /&gt;
			break;&lt;br /&gt;
		case 'copy':&lt;br /&gt;
			label.append('&amp;lt;br&amp;gt;' + this.i18n.copiedCat + ' ' + targetcat);&lt;br /&gt;
			break;&lt;br /&gt;
		case 'move':&lt;br /&gt;
			label.append('&amp;lt;br&amp;gt;' + this.i18n.movedCat + ' ' + targetcat);&lt;br /&gt;
			break;&lt;br /&gt;
		case 'remove':&lt;br /&gt;
			label.append('&amp;lt;br&amp;gt;' + this.i18n.movedCat);&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	updateCounter: function() {&lt;br /&gt;
 &lt;br /&gt;
		this.counterCurrent++;&lt;br /&gt;
		if (this.counterCurrent &amp;gt; this.counterNeeded) this.displayResult();&lt;br /&gt;
		else this.domCounter.text(this.counterCurrent);&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	displayResult: function() {&lt;br /&gt;
 &lt;br /&gt;
		document.body.style.cursor = 'auto';&lt;br /&gt;
		$('.cat_a_lot_feedback').addClass('cat_a_lot_done');&lt;br /&gt;
		$('.ui-dialog-content').height('auto');&lt;br /&gt;
		var rep = this.domCounter.parent();&lt;br /&gt;
		rep.html('&amp;lt;h3&amp;gt;' + this.i18n.done + '&amp;lt;/h3&amp;gt;');&lt;br /&gt;
		rep.append(this.i18n.allDone + '&amp;lt;br /&amp;gt;');&lt;br /&gt;
 &lt;br /&gt;
		var close = $('&amp;lt;a&amp;gt;').append(this.i18n.returnToPage);&lt;br /&gt;
		close.click(function() {&lt;br /&gt;
			catALot.progressDialog.remove();&lt;br /&gt;
			catALot.toggleAll(false);&lt;br /&gt;
		});&lt;br /&gt;
		rep.append(close);&lt;br /&gt;
		if (this.alreadyThere.length) {&lt;br /&gt;
			rep.append(this.i18n.skippedAlready);&lt;br /&gt;
			rep.append(this.alreadyThere.join('&amp;lt;br&amp;gt;'));&lt;br /&gt;
		}&lt;br /&gt;
		if (this.notFound.length) {&lt;br /&gt;
			rep.append(this.i18n.skippedNotFound);&lt;br /&gt;
			rep.append(this.notFound.join('&amp;lt;br&amp;gt;'));&lt;br /&gt;
		}&lt;br /&gt;
		if (this.connectionError.length) {&lt;br /&gt;
			rep.append(this.i18n.skippedServer);&lt;br /&gt;
			rep.append(this.connectionError.join('&amp;lt;br&amp;gt;'));&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	moveHere: function(targetcat) {&lt;br /&gt;
		this.doSomething(targetcat, 'move');&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	copyHere: function(targetcat) {&lt;br /&gt;
		this.doSomething(targetcat, 'copy');&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	addHere: function(targetcat) {&lt;br /&gt;
		this.doSomething(targetcat, 'add');&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	remove: function() {&lt;br /&gt;
		this.doSomething('', 'remove');&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	doSomething: function(targetcat, mode) {&lt;br /&gt;
		var files = this.getMarkedLabels();&lt;br /&gt;
		if (files.length === 0) {&lt;br /&gt;
			alert(this.i18n.noneSelected);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		this.notFound = [];&lt;br /&gt;
		this.alreadyThere = [];&lt;br /&gt;
		this.connectionError = [];&lt;br /&gt;
		this.counterCurrent = 1;&lt;br /&gt;
		this.counterNeeded = files.length;&lt;br /&gt;
		this.showProgress();&lt;br /&gt;
		for (var i = 0; i &amp;lt; files.length; i++) {&lt;br /&gt;
			this.getContent(files[i], targetcat, mode);&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	doAPICall: function(params, callback) {&lt;br /&gt;
		params.format = 'json';&lt;br /&gt;
		var i = 0;&lt;br /&gt;
		var apiUrl = this.apiUrl;&lt;br /&gt;
		var handleError = function(jqXHR, textStatus, errorThrown) {&lt;br /&gt;
				if (window.console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
					console.log('Error: ', jqXHR, textStatus, errorThrown);&lt;br /&gt;
				}&lt;br /&gt;
				if (i &amp;lt; 4) {&lt;br /&gt;
					window.setTimeout(doCall, 300);&lt;br /&gt;
					i++;&lt;br /&gt;
				} else if (params.title) {&lt;br /&gt;
					this.connectionError.push(params.title);&lt;br /&gt;
					this.updateCounter();&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			};&lt;br /&gt;
		var doCall = function() {&lt;br /&gt;
				$.ajax({&lt;br /&gt;
					url: apiUrl,&lt;br /&gt;
					cache: false,&lt;br /&gt;
					dataType: 'json',&lt;br /&gt;
					data: params,&lt;br /&gt;
					type: 'POST',&lt;br /&gt;
					success: callback,&lt;br /&gt;
					error: handleError&lt;br /&gt;
				});&lt;br /&gt;
			};&lt;br /&gt;
		doCall();&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	createCatLinks: function(symbol, list) {&lt;br /&gt;
		list.sort();&lt;br /&gt;
		var domlist = this.catlist.find('ul');&lt;br /&gt;
		for (var i = 0; i &amp;lt; list.length; i++) {&lt;br /&gt;
			var li = $('&amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;');&lt;br /&gt;
 &lt;br /&gt;
			var link = $('&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;'),&lt;br /&gt;
				add, move, copy;&lt;br /&gt;
 &lt;br /&gt;
			link.text(list[i]);&lt;br /&gt;
			li.data('cat', list[i]);&lt;br /&gt;
			link.click(function() {&lt;br /&gt;
				catALot.updateCats($(this).parent().data('cat'));&lt;br /&gt;
			});&lt;br /&gt;
 &lt;br /&gt;
			if (this.searchmode) {&lt;br /&gt;
				add = $('&amp;lt;a class=&amp;quot;cat_a_lot_action&amp;quot;&amp;gt;&amp;lt;b&amp;gt;' + this.i18n.add + '&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;');&lt;br /&gt;
				add.click(function() {&lt;br /&gt;
					catALot.addHere($(this).parent().data('cat'));&lt;br /&gt;
				});&lt;br /&gt;
			} else {&lt;br /&gt;
				move = $('&amp;lt;a class=&amp;quot;cat_a_lot_move&amp;quot;&amp;gt;&amp;lt;b&amp;gt;' + this.i18n.move + '&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;');&lt;br /&gt;
				move.click(function() {&lt;br /&gt;
					catALot.moveHere($(this).parent().data('cat'));&lt;br /&gt;
				});&lt;br /&gt;
 &lt;br /&gt;
				copy = $('&amp;lt;a class=&amp;quot;cat_a_lot_action&amp;quot;&amp;gt;&amp;lt;b&amp;gt;' + this.i18n.copy + '&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;');&lt;br /&gt;
				copy.click(function() {&lt;br /&gt;
					catALot.copyHere($(this).parent().data('cat'));&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			li.append(symbol).append(' ').append(link);&lt;br /&gt;
 &lt;br /&gt;
			// Can't move to source category&lt;br /&gt;
			if (list[i] !== wgTitle &amp;amp;&amp;amp; this.searchmode) li.append(' ').append(add);&lt;br /&gt;
			else if (list[i] !== wgTitle &amp;amp;&amp;amp; !this.searchmode) li.append(' ').append(move).append(' ').append(copy);&lt;br /&gt;
 &lt;br /&gt;
			domlist.append(li);&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	getCategoryList: function() {&lt;br /&gt;
		this.catCounter = 0;&lt;br /&gt;
		this.getParentCats();&lt;br /&gt;
		this.getSubCats();&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	showCategoryList: function() {&lt;br /&gt;
		var thiscat = [this.currentCategory];&lt;br /&gt;
 &lt;br /&gt;
		this.catlist.empty();&lt;br /&gt;
		this.catlist.append('&amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;');&lt;br /&gt;
 &lt;br /&gt;
		this.createCatLinks(&amp;quot;↑&amp;quot;, this.parentCats);&lt;br /&gt;
		this.createCatLinks(&amp;quot;→&amp;quot;, thiscat);&lt;br /&gt;
		this.createCatLinks(&amp;quot;↓&amp;quot;, this.subCats);&lt;br /&gt;
 &lt;br /&gt;
		document.body.style.cursor = 'auto';&lt;br /&gt;
		//Reset width&lt;br /&gt;
		var cat = $('#cat_a_lot');&lt;br /&gt;
		cat.width('');&lt;br /&gt;
		cat.height('');&lt;br /&gt;
		cat.width(Math.min(cat.width() * 1.05, $(window).width() - 10));&lt;br /&gt;
		var list = $('#cat_a_lot_category_list');&lt;br /&gt;
		list.css({&lt;br /&gt;
			maxHeight: this.setHeight + 'px',&lt;br /&gt;
			height: ''&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	updateCats: function(newcat) {&lt;br /&gt;
		document.body.style.cursor = 'wait';&lt;br /&gt;
 &lt;br /&gt;
		this.currentCategory = newcat;&lt;br /&gt;
		this.catlist = $('#cat_a_lot_category_list');&lt;br /&gt;
		this.catlist.html('&amp;lt;div class=&amp;quot;cat_a_lot_loading&amp;quot;&amp;gt;' + this.i18n.loading + '&amp;lt;/div&amp;gt;');&lt;br /&gt;
		this.getCategoryList();&lt;br /&gt;
	},&lt;br /&gt;
	showProgress: function() {&lt;br /&gt;
		document.body.style.cursor = 'wait';&lt;br /&gt;
 &lt;br /&gt;
		this.progressDialog = $('&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;').html(this.i18n.editing + ' &amp;lt;span id=&amp;quot;cat_a_lot_current&amp;quot;&amp;gt;' + this.counterCurrent + '&amp;lt;/span&amp;gt; ' + this.i18n.of + this.counterNeeded).dialog({&lt;br /&gt;
			width: 450,&lt;br /&gt;
			height: 90,&lt;br /&gt;
			minHeight: 90,&lt;br /&gt;
			modal: true,&lt;br /&gt;
			resizable: false,&lt;br /&gt;
			draggable: false,&lt;br /&gt;
			closeOnEscape: false,&lt;br /&gt;
			dialogClass: &amp;quot;cat_a_lot_feedback&amp;quot;&lt;br /&gt;
		});&lt;br /&gt;
		$('.ui-dialog-titlebar').hide();&lt;br /&gt;
		this.domCounter = $('#cat_a_lot_current');&lt;br /&gt;
 &lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	run: function() {&lt;br /&gt;
		if ($('.cat_a_lot_enabled').length) {&lt;br /&gt;
			this.makeClickable();&lt;br /&gt;
			$(&amp;quot;#cat_a_lot_data&amp;quot;).show();&lt;br /&gt;
			$('#cat_a_lot').resizable({&lt;br /&gt;
				handles: 'n',&lt;br /&gt;
				alsoResize: '#cat_a_lot_category_list',&lt;br /&gt;
				resize: function(event, ui) {&lt;br /&gt;
					$(this).css({&lt;br /&gt;
						left: &amp;quot;&amp;quot;,&lt;br /&gt;
						top: &amp;quot;&amp;quot;&lt;br /&gt;
					});&lt;br /&gt;
					catALot.setHeight = $(this).height();&lt;br /&gt;
					$('#cat_a_lot_category_list').css({&lt;br /&gt;
						maxHeight: '',&lt;br /&gt;
						width: ''&lt;br /&gt;
					});&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
			$('#cat_a_lot_category_list').css({&lt;br /&gt;
				maxHeight: '450px'&lt;br /&gt;
			});&lt;br /&gt;
			if (this.searchmode) this.updateCats(&amp;quot;Pictures and images&amp;quot;);&lt;br /&gt;
			else this.updateCats(wgTitle);&lt;br /&gt;
 &lt;br /&gt;
		} else {&lt;br /&gt;
			$(&amp;quot;#cat_a_lot_data&amp;quot;).hide();&lt;br /&gt;
			$(&amp;quot;#cat_a_lot&amp;quot;).resizable(&amp;quot;destroy&amp;quot;);&lt;br /&gt;
			//Unbind click handlers&lt;br /&gt;
			this.labels.unbind('click.catALot');&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	manageSettings: function() {&lt;br /&gt;
		mw.loader.using(['ext.gadget.SettingsManager', 'ext.gadget.SettingsUI', 'jquery.ui.progressbar'], function() {&lt;br /&gt;
			catALot._manageSettings();&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	_manageSettings: function() {&lt;br /&gt;
		window.mw.libs.SettingsUI(this.defaults, &amp;quot;Cat-A-Lot&amp;quot;).show().done(function(s, verbose, loc, settingsOut, $dlg ) {&lt;br /&gt;
			var mustRestart = false,&lt;br /&gt;
				_restart = function() {&lt;br /&gt;
					if (!mustRestart) return;&lt;br /&gt;
					$('#cat_a_lot').remove();&lt;br /&gt;
					catALot.labels.unbind('click.catALot');&lt;br /&gt;
					catALot.init();&lt;br /&gt;
				},&lt;br /&gt;
				_saveToJS = function() {&lt;br /&gt;
				var opt = mw.libs.settingsManager.option({ &lt;br /&gt;
						optionName: 'catALotPrefs', &lt;br /&gt;
						value: catALot.settings,&lt;br /&gt;
						encloseSignature: 'catALot',&lt;br /&gt;
						encloseBlock:	'////////// Cat-A-Lot user preferences //////////\n',&lt;br /&gt;
						triggerSaveAt: /Cat.?A.?Lot/i,&lt;br /&gt;
						editSummary: catALot.i18n.prefSaveSummary&lt;br /&gt;
					}),&lt;br /&gt;
					oldHeight = $dlg.height(),&lt;br /&gt;
					$prog = $('&amp;lt;div&amp;gt;');&lt;br /&gt;
 &lt;br /&gt;
				$dlg.css('height', oldHeight).html('');&lt;br /&gt;
				$prog.css({&lt;br /&gt;
					'height': Math.round(oldHeight/8),&lt;br /&gt;
					'margin-top': Math.round((7*oldHeight)/16)&lt;br /&gt;
				}).appendTo($dlg);&lt;br /&gt;
 &lt;br /&gt;
				$dlg.parent().find('.ui-dialog-buttonpane button').button('option', 'disabled', true);&lt;br /&gt;
 &lt;br /&gt;
				opt.save().done(function(text, progress, opt) {&lt;br /&gt;
					$prog.progressbar({ value: progress });&lt;br /&gt;
					$prog.fadeOut(function() {&lt;br /&gt;
						$dlg.dialog('close');&lt;br /&gt;
						_restart();&lt;br /&gt;
					});&lt;br /&gt;
				}).progress(function(text, progress, opt) {&lt;br /&gt;
					$prog.progressbar({ value: progress });&lt;br /&gt;
					// TODO: Add &amp;quot;details&amp;quot; to progressbar&lt;br /&gt;
				}).fail(function(text) {&lt;br /&gt;
					$prog.addClass('ui-state-error');&lt;br /&gt;
					$dlg.prepend($('&amp;lt;p&amp;gt;').text(text));&lt;br /&gt;
				});&lt;br /&gt;
			};&lt;br /&gt;
			$.each(settingsOut, function(n, v) {&lt;br /&gt;
				if (v.forcerestart &amp;amp;&amp;amp; catALot.settings[v.name] !== v.value) {&lt;br /&gt;
					mustRestart = true;&lt;br /&gt;
				}&lt;br /&gt;
				catALot.settings[v.name] = v.value;&lt;br /&gt;
				window.catALotPrefs[v.name] = v.value;&lt;br /&gt;
			});&lt;br /&gt;
			switch (loc) {&lt;br /&gt;
				case 'page':&lt;br /&gt;
					$dlg.dialog('close');&lt;br /&gt;
					_restart();&lt;br /&gt;
					break;&lt;br /&gt;
				case 'account-publicly':&lt;br /&gt;
					_saveToJS();&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	_initSettings: function() {&lt;br /&gt;
		if (this.settings.watchlist) return;&lt;br /&gt;
		if (!window.catALotPrefs) window.catALotPrefs = {};&lt;br /&gt;
		$.each(this.defaults, function(n, v) {&lt;br /&gt;
			v.value = catALot.settings[v.name] = (window.catALotPrefs[v.name] || v['default']);&lt;br /&gt;
			v.label = catALot.i18n[v.label_i18n];&lt;br /&gt;
			if (v.select_i18n) {&lt;br /&gt;
				v.select = {};&lt;br /&gt;
				$.each(v.select_i18n, function(i18nk, val) {&lt;br /&gt;
					v.select[ catALot.i18n[i18nk] ] = val;&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	defaults: [{&lt;br /&gt;
		name: 'watchlist',&lt;br /&gt;
		'default': 'preferences',&lt;br /&gt;
		label_i18n: 'watchlistpref',&lt;br /&gt;
		select_i18n: {&lt;br /&gt;
			'watch_pref': 'preferences',&lt;br /&gt;
			'watch_nochange': 'nochange',&lt;br /&gt;
			'watch_watch': 'watch',&lt;br /&gt;
			'watch_unwatch': 'unwatch'&lt;br /&gt;
		}&lt;br /&gt;
	}, {&lt;br /&gt;
		name: 'minor',&lt;br /&gt;
		'default': false,&lt;br /&gt;
		label_i18n: 'minorpref'&lt;br /&gt;
	}, {&lt;br /&gt;
		name: 'editpages',&lt;br /&gt;
		'default': false,&lt;br /&gt;
		label_i18n: 'editpagespref',&lt;br /&gt;
		forcerestart: true&lt;br /&gt;
	}, {&lt;br /&gt;
		name: 'docleanup',&lt;br /&gt;
		'default': false,&lt;br /&gt;
		label_i18n: 'docleanuppref'&lt;br /&gt;
	}],&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	i18n: {&lt;br /&gt;
		// Preferences&lt;br /&gt;
		// new: added 2012-09-19. Please translate.&lt;br /&gt;
		// Use user language for i18n&lt;br /&gt;
		watchlistpref: &amp;quot;Watchlist preference concerning files edited with Cat-A-Lot&amp;quot;,&lt;br /&gt;
		watch_pref: &amp;quot;According to your general preferences&amp;quot;,&lt;br /&gt;
		watch_nochange: &amp;quot;Do not change watchstatus&amp;quot;,&lt;br /&gt;
		watch_watch: &amp;quot;Watch pages edited with Cat-A-Lot&amp;quot;,&lt;br /&gt;
		watch_unwatch: &amp;quot;Remove pages while editing with Cat-A-Lot from your watchlist&amp;quot;,&lt;br /&gt;
		minorpref: &amp;quot;Mark edits as minor (if you generally mark your edits as minor, this won't change anything)&amp;quot;,&lt;br /&gt;
		editpagespref: &amp;quot;Allow categorising pages (including categories) that are not files&amp;quot;,&lt;br /&gt;
		docleanuppref: &amp;quot;Remove {{Check categories}} and other minor cleanup&amp;quot;,&lt;br /&gt;
		configSettings: &amp;quot;Preferences&amp;quot;,&lt;br /&gt;
		// Use site language for i18n&lt;br /&gt;
		prefSaveSummary: &amp;quot;[[Help:Gadget-Cat-a-lot|Cat-a-lot]] is updating user preferences&amp;quot;,&lt;br /&gt;
 &lt;br /&gt;
		//Progress&lt;br /&gt;
		loading: 'Loading...',&lt;br /&gt;
		editing: 'Editing page',&lt;br /&gt;
		of: 'of ',&lt;br /&gt;
		skippedAlready: '&amp;lt;h5&amp;gt;The following pages were skipped, because the page was already in the category:&amp;lt;/h5&amp;gt;',&lt;br /&gt;
		skippedNotFound: '&amp;lt;h5&amp;gt;The following pages were skipped, because the old category could not be found:&amp;lt;/h5&amp;gt;',&lt;br /&gt;
		skippedServer: '&amp;lt;h5&amp;gt;The following pages couldn\'t be changed, since there were problems connecting to the server:&amp;lt;/h5&amp;gt;',&lt;br /&gt;
		allDone: 'All pages are processed.',&lt;br /&gt;
		done: 'Done!',&lt;br /&gt;
		addedCat: 'Added category',&lt;br /&gt;
		copiedCat: 'Copied to category',&lt;br /&gt;
		movedCat: 'Moved to category',&lt;br /&gt;
		removedCat: 'Removed from category',&lt;br /&gt;
		returnToPage: 'Return to page',&lt;br /&gt;
		catNotFound: 'Category not found.',&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
		//as in 17 files selected&lt;br /&gt;
		filesSelected: ' files selected.',&lt;br /&gt;
 &lt;br /&gt;
		//Actions&lt;br /&gt;
		copy: 'Copy',&lt;br /&gt;
		move: 'Move',&lt;br /&gt;
		add: 'Add',&lt;br /&gt;
		removeFromCat: 'Remove from this category',&lt;br /&gt;
		enterName: 'Enter category name',&lt;br /&gt;
		select: 'Select',&lt;br /&gt;
		all: 'all',&lt;br /&gt;
		none: 'none',&lt;br /&gt;
 &lt;br /&gt;
		noneSelected: 'No files selected!',&lt;br /&gt;
 &lt;br /&gt;
		//Summaries:&lt;br /&gt;
		summaryAdd: '[[Help:Cat-a-lot|Cat-a-lot]]: Adding [[Category:',&lt;br /&gt;
		summaryCopy: '[[Help:Cat-a-lot|Cat-a-lot]]: Copying from [[Category:',&lt;br /&gt;
		to: 'to [[Category:',&lt;br /&gt;
		summaryMove: '[[Help:Cat-a-lot|Cat-a-lot]]: Moving from [[Category:',&lt;br /&gt;
		summaryRemove: '[[Help:Cat-a-lot|Cat-a-lot]]: Removing from [[Category:'&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
if ((nsNumber === -1 &amp;amp;&amp;amp; mw.config.get('wgCanonicalSpecialPageName') === &amp;quot;Search&amp;quot;) || nsNumber === 14) {&lt;br /&gt;
	if (nsNumber === -1) {&lt;br /&gt;
		catALot.searchmode = true;&lt;br /&gt;
	}&lt;br /&gt;
	var loadingLocalizations = 1;&lt;br /&gt;
	var loadLocalization = function(lang, cb) {&lt;br /&gt;
		loadingLocalizations++;&lt;br /&gt;
		$.ajax({&lt;br /&gt;
			url: mw.util.wikiScript(),&lt;br /&gt;
			dataType: 'script',&lt;br /&gt;
			data: {&lt;br /&gt;
				title: 'MediaWiki:Gadget-Cat-a-lot.js/' + lang,&lt;br /&gt;
				action: 'raw',&lt;br /&gt;
				ctype: 'text/javascript',&lt;br /&gt;
				// Allow caching for 28 days&lt;br /&gt;
				maxage: 2419200,&lt;br /&gt;
				smaxage: 2419200&lt;br /&gt;
			},&lt;br /&gt;
			cache: true,&lt;br /&gt;
			success: cb,&lt;br /&gt;
			error: cb&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
	var maybeLaunch = function() {&lt;br /&gt;
		loadingLocalizations--;&lt;br /&gt;
		if (0 === loadingLocalizations) {&lt;br /&gt;
			mw.loader.using(['jquery.ui.dialog', 'jquery.ui.autocomplete'], function() {&lt;br /&gt;
				$(document).ready(function() {&lt;br /&gt;
					catALot.init();&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
 &lt;br /&gt;
	if (mw.config.get('wgUserLanguage') !== 'en') {&lt;br /&gt;
		loadLocalization(mw.config.get('wgUserLanguage'), maybeLaunch);&lt;br /&gt;
	}&lt;br /&gt;
	if (mw.config.get('wgContentLanguage') !== 'en') {&lt;br /&gt;
		loadLocalization(mw.config.get('wgContentLanguage'), maybeLaunch);&lt;br /&gt;
	}&lt;br /&gt;
	maybeLaunch();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
})(jQuery, mediaWiki);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 *  Derivative work of&lt;br /&gt;
 *  (replace &amp;quot;checkboxes&amp;quot; with cat-a-lot labels in your mind)&lt;br /&gt;
 */ &lt;br /&gt;
	/**&lt;br /&gt;
	 * jQuery checkboxShiftClick&lt;br /&gt;
	 *&lt;br /&gt;
	 * This will enable checkboxes to be checked or unchecked in a row by clicking one, holding shift and clicking another one&lt;br /&gt;
	 *&lt;br /&gt;
	 * @author Krinkle &amp;lt;krinklemail@gmail.com&amp;gt;&lt;br /&gt;
	 * @license GPL v2&lt;br /&gt;
	 */&lt;br /&gt;
( function ( $ ) {&lt;br /&gt;
	$.fn.catALotShiftClick = function ( cb ) {&lt;br /&gt;
		var prevCheckbox = null, $box = this;&lt;br /&gt;
		// When our boxes are clicked..&lt;br /&gt;
		$box.bind('click.catALot', function ( e ) {&lt;br /&gt;
 &lt;br /&gt;
			// Highlight last selected&lt;br /&gt;
			$('#cat_a_lot_last_selected').removeAttr('id');&lt;br /&gt;
			var $thisControl = $(e.target),&lt;br /&gt;
				method;&lt;br /&gt;
			if (!$thisControl.hasClass('cat_a_lot_label')) {&lt;br /&gt;
				$thisControl = $thisControl.parents('.cat_a_lot_label');&lt;br /&gt;
			}&lt;br /&gt;
			$thisControl.attr('id', 'cat_a_lot_last_selected').toggleClass('cat_a_lot_selected');&lt;br /&gt;
 &lt;br /&gt;
			// And one has been clicked before...&lt;br /&gt;
			if ( prevCheckbox !== null &amp;amp;&amp;amp; e.shiftKey ) {&lt;br /&gt;
				// Prevent selection&lt;br /&gt;
				e.preventDefault();&lt;br /&gt;
 &lt;br /&gt;
				method = $thisControl.hasClass('cat_a_lot_selected') ? 'addClass' : 'removeClass';&lt;br /&gt;
 &lt;br /&gt;
				// Check or uncheck this one and all in-between checkboxes&lt;br /&gt;
				$box.slice(&lt;br /&gt;
					Math.min( $box.index( prevCheckbox ), $box.index( $thisControl ) ),&lt;br /&gt;
					Math.max( $box.index( prevCheckbox ), $box.index( $thisControl ) ) + 1&lt;br /&gt;
				)[method]('cat_a_lot_selected');&lt;br /&gt;
 &lt;br /&gt;
				if ($.isFunction(cb)) cb();&lt;br /&gt;
			}&lt;br /&gt;
			// Either way, update the prevCheckbox variable to the one clicked now&lt;br /&gt;
			prevCheckbox = $thisControl;&lt;br /&gt;
 &lt;br /&gt;
		} );&lt;br /&gt;
		return $box;&lt;br /&gt;
	};&lt;br /&gt;
}( jQuery ) );&lt;br /&gt;
 &lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Waldir</name></author>	</entry>

	</feed>