<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant-TW">
	<id>https://tnfshwiki.tfcis.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Cat-a-lot.js</id>
	<title>MediaWiki:Gadget-Cat-a-lot.js - 修訂歷史</title>
	<link rel="self" type="application/atom+xml" href="https://tnfshwiki.tfcis.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Cat-a-lot.js"/>
	<link rel="alternate" type="text/html" href="https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;action=history"/>
	<updated>2026-04-07T20:53:26Z</updated>
	<subtitle>本 Wiki 上此頁面的修訂歷史</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;diff=5669&amp;oldid=prev</id>
		<title>Xiplus 於 2016年8月5日 (五) 13:08</title>
		<link rel="alternate" type="text/html" href="https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;diff=5669&amp;oldid=prev"/>
		<updated>2016-08-05T13:08:39Z</updated>

		<summary type="html">&lt;p&gt;&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;zh-Hant-TW&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上個修訂&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;於 2016年8月5日 (五) 21:08 的修訂&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;行 378：&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;行 378：&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		findAllVariants: function( category ) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		findAllVariants: function( category ) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			var result = [],&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			var result = [],&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				baseUrl = &#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/w&lt;/del&gt;/api.php?action=parse&amp;amp;text=&#039; + encodeURIComponent(category) + &#039;&amp;amp;title=temp&amp;amp;format=json&amp;amp;variant=&#039;;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				baseUrl = &#039;/api.php?action=parse&amp;amp;text=&#039; + encodeURIComponent(category) + &#039;&amp;amp;title=temp&amp;amp;format=json&amp;amp;variant=&#039;;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if ( this._variantCache[category] !== undefined ) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if ( this._variantCache[category] !== undefined ) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return this._variantCache[category];&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return this._variantCache[category];&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;!-- diff cache key tnfshwiki-tnfshwiki_:diff:wikidiff2:1.12:old-5584:rev-5669:1.13.0 --&gt;
&lt;/table&gt;</summary>
		<author><name>Xiplus</name></author>
	</entry>
	<entry>
		<id>https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;diff=5584&amp;oldid=prev</id>
		<title>Xiplus：​已匯入 1 筆修訂</title>
		<link rel="alternate" type="text/html" href="https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;diff=5584&amp;oldid=prev"/>
		<updated>2016-08-05T11:53:56Z</updated>

		<summary type="html">&lt;p&gt;已匯入 1 筆修訂&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;zh-Hant-TW&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上個修訂&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;於 2016年8月5日 (五) 19:53 的修訂&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key tnfshwiki-tnfshwiki_:diff:wikidiff2:1.12:old-5583:rev-5584:1.13.0 --&gt;
&lt;/table&gt;</summary>
		<author><name>Xiplus</name></author>
	</entry>
	<entry>
		<id>https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;diff=5583&amp;oldid=prev</id>
		<title>zhwiki&gt;PhiLiP 於 2015年9月10日 (四) 17:41</title>
		<link rel="alternate" type="text/html" href="https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-Cat-a-lot.js&amp;diff=5583&amp;oldid=prev"/>
		<updated>2015-09-10T17:41:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新頁面&lt;/b&gt;&lt;/p&gt;&lt;div&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;
 * &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*global jQuery:false, mediaWiki:false, alert:false, importStylesheet:false */&lt;br /&gt;
/*jshint curly:false, unused:true, unused:true, forin:false, smarttabs:true, loopfunc:true, browser:true */&lt;br /&gt;
&lt;br /&gt;
( function( $, mw ) {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	var nsNumber = mw.config.get( &amp;#039;wgNamespaceNumber&amp;#039; ),&lt;br /&gt;
		nsCat = 14,&lt;br /&gt;
		currentCat = mw.config.get( &amp;#039;wgTitle&amp;#039; ),&lt;br /&gt;
		formattedNS = mw.config.get( &amp;#039;wgFormattedNamespaces&amp;#039; ),&lt;br /&gt;
		nsIDs = mw.config.get( &amp;#039;wgNamespaceIds&amp;#039; ),&lt;br /&gt;
		catALot;&lt;br /&gt;
&lt;br /&gt;
	var msgs = {&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;
		&amp;#039;cat-a-lot-watchlistpref&amp;#039;: &amp;quot;Watchlist preference concerning files edited with Cat-A-Lot&amp;quot;,&lt;br /&gt;
		&amp;#039;cat-a-lot-watch_pref&amp;#039;: &amp;quot;According to your general preferences&amp;quot;,&lt;br /&gt;
		&amp;#039;cat-a-lot-watch_nochange&amp;#039;: &amp;quot;Do not change watchstatus&amp;quot;,&lt;br /&gt;
		&amp;#039;cat-a-lot-watch_watch&amp;#039;: &amp;quot;Watch pages edited with Cat-A-Lot&amp;quot;,&lt;br /&gt;
		&amp;#039;cat-a-lot-watch_unwatch&amp;#039;: &amp;quot;Remove pages while editing with Cat-A-Lot from your watchlist&amp;quot;,&lt;br /&gt;
		&amp;#039;cat-a-lot-minorpref&amp;#039;: &amp;quot;Mark edits as minor (if you generally mark your edits as minor, this won&amp;#039;t change anything)&amp;quot;,&lt;br /&gt;
		&amp;#039;cat-a-lot-editpagespref&amp;#039;: &amp;quot;Allow categorising pages (including categories) that are not files&amp;quot;,&lt;br /&gt;
		&amp;#039;cat-a-lot-docleanuppref&amp;#039;: &amp;quot;Remove {{Check categories}} and other minor cleanup&amp;quot;,&lt;br /&gt;
		&amp;#039;cat-a-lot-subcatcountpref&amp;#039;: &amp;quot;Sub-categories to show at most&amp;quot;,&lt;br /&gt;
		&amp;#039;cat-a-lot-config-settings&amp;#039;: &amp;quot;Preferences&amp;quot;,&lt;br /&gt;
		// Use site language for i18n&lt;br /&gt;
		&amp;#039;cat-a-lot-pref-save-summary&amp;#039;: &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;
		&amp;#039;cat-a-lot-loading&amp;#039;: &amp;#039;Loading...&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-editing&amp;#039;: &amp;#039;Editing page&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-of&amp;#039;: &amp;#039;of &amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-skipped-already&amp;#039;: &amp;#039;The following {{PLURAL:$1|page was|$1 pages were}} skipped, because the page was already in the category:&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-skipped-not-found&amp;#039;: &amp;#039;The following {{PLURAL:$1|page was|$1 pages were}} skipped, because the old category could not be found:&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-skipped-server&amp;#039;: &amp;#039;The following {{PLURAL:$1|page|$1 pages}} couldn\&amp;#039;t be changed, since there were problems connecting to the server:&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-all-done&amp;#039;: &amp;#039;All pages are processed.&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-done&amp;#039;: &amp;#039;Done!&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-added-cat&amp;#039;: &amp;#039;Added category $1&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-copied-cat&amp;#039;: &amp;#039;Copied to category $1&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-moved-cat&amp;#039;: &amp;#039;Moved to category $1&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-removed-cat&amp;#039;: &amp;#039;Removed from category $1&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-return-to-page&amp;#039;: &amp;#039;Return to page&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-cat-not-found&amp;#039;: &amp;#039;Category not found.&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		//as in 17 files selected&lt;br /&gt;
		&amp;#039;cat-a-lot-files-selected&amp;#039;: &amp;#039;{{PLURAL:$1|One file|$1 files}} selected.&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
		//Actions&lt;br /&gt;
		&amp;#039;cat-a-lot-copy&amp;#039;: &amp;#039;Copy&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-move&amp;#039;: &amp;#039;Move&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-add&amp;#039;: &amp;#039;Add&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-remove-from-cat&amp;#039;: &amp;#039;Remove from this category&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-enter-name&amp;#039;: &amp;#039;Enter category name&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-select&amp;#039;: &amp;#039;Select&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-all&amp;#039;: &amp;#039;all&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-none&amp;#039;: &amp;#039;none&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
		&amp;#039;cat-a-lot-none-selected&amp;#039;: &amp;#039;No files selected!&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
		//Summaries:&lt;br /&gt;
		&amp;#039;cat-a-lot-summary-add&amp;#039;: &amp;#039;[[Help:Cat-a-lot|Cat-a-lot]]: Adding [[Category:$1]]&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-summary-copy&amp;#039;: &amp;#039;[[Help:Cat-a-lot|Cat-a-lot]]: Copying from [[Category:$1]] to [[Category:$2]]&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-summary-move&amp;#039;: &amp;#039;[[Help:Cat-a-lot|Cat-a-lot]]: Moving from [[Category:$1]] to [[Category:$2]]&amp;#039;,&lt;br /&gt;
		&amp;#039;cat-a-lot-summary-remove&amp;#039;: &amp;#039;[[Help:Cat-a-lot|Cat-a-lot]]: Removing from [[Category:$1]]&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
	mw.messages.set( msgs );&lt;br /&gt;
	&lt;br /&gt;
	function msg( /*params*/ ) {&lt;br /&gt;
		var args = Array.prototype.slice.call( arguments, 0 );&lt;br /&gt;
		args[0] = &amp;#039;cat-a-lot-&amp;#039; + args[0];&lt;br /&gt;
		return mw.message.apply( mw.message, args ).parse();&lt;br /&gt;
	}&lt;br /&gt;
	function msgPlain( key ) {&lt;br /&gt;
		return mw.message( &amp;#039;cat-a-lot-&amp;#039; + key ).plain();&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// There is only one cat-a-lot on one page&lt;br /&gt;
	var $removeLink,&lt;br /&gt;
		$body, $container, $dataContainer, $searchInputContainer, $searchInput, $resultList, $markCounter,&lt;br /&gt;
		$selections, $selectAll, $selectNone, $settingsWrapper, $settingsLink, $head, $link;&lt;br /&gt;
		&lt;br /&gt;
	catALot = window.catALot = {&lt;br /&gt;
		apiUrl: mw.util.wikiScript( &amp;#039;api&amp;#039; ),&lt;br /&gt;
		searchmode: false,&lt;br /&gt;
		version: 3.5,&lt;br /&gt;
		setHeight: 450,&lt;br /&gt;
		settings: {},&lt;br /&gt;
		_variantCache: {},&lt;br /&gt;
		init: function() {&lt;br /&gt;
			this._initSettings();&lt;br /&gt;
&lt;br /&gt;
			$body = $( document.body );&lt;br /&gt;
			$container = $( &amp;#039;&amp;lt;div id=&amp;quot;cat_a_lot&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				.appendTo( $body );&lt;br /&gt;
			$dataContainer = $( &amp;#039;&amp;lt;div id=&amp;quot;cat_a_lot_data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				.appendTo( $container );&lt;br /&gt;
			$searchInputContainer = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
				.appendTo( $dataContainer );&lt;br /&gt;
			$searchInput = $( &amp;#039;&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cat_a_lot_searchcatname&amp;quot; /&amp;gt;&amp;#039; )&lt;br /&gt;
				.attr( &amp;#039;placeholder&amp;#039;, msgPlain( &amp;#039;enter-name&amp;#039; ) )&lt;br /&gt;
				.appendTo( $searchInputContainer );&lt;br /&gt;
			$resultList = $( &amp;#039;&amp;lt;div id=&amp;quot;cat_a_lot_category_list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				.appendTo( $dataContainer );&lt;br /&gt;
			$markCounter = $( &amp;#039;&amp;lt;div id=&amp;quot;cat_a_lot_mark_counter&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				.appendTo( $dataContainer );&lt;br /&gt;
			$selections = $( &amp;#039;&amp;lt;div id=&amp;quot;cat_a_lot_selections&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				.text( msgPlain( &amp;#039;select&amp;#039; ) )&lt;br /&gt;
				.appendTo( $dataContainer );&lt;br /&gt;
			$selectAll = $( &amp;#039;&amp;lt;a id=&amp;quot;cat_a_lot_select_all&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039; )&lt;br /&gt;
				.text( msgPlain( &amp;#039;all&amp;#039; ) )&lt;br /&gt;
				.appendTo( $selections.append(&amp;#039; &amp;#039;) );&lt;br /&gt;
			$selectNone = $( &amp;#039;&amp;lt;a id=&amp;quot;cat_a_lot_select_none&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039; )&lt;br /&gt;
				.text( msgPlain( &amp;#039;none&amp;#039; ) )&lt;br /&gt;
				.appendTo( $selections.append(&amp;#039; • &amp;#039;) );&lt;br /&gt;
			$settingsWrapper = $( &amp;#039;&amp;lt;div id=&amp;quot;cat_a_lot_settings&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				.appendTo( $dataContainer );&lt;br /&gt;
			$settingsLink = $( &amp;#039;&amp;lt;a id=&amp;quot;cat_a_lot_config_settings&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039; )&lt;br /&gt;
				.text( msgPlain( &amp;#039;config-settings&amp;#039; ) )&lt;br /&gt;
				.appendTo( $settingsWrapper );&lt;br /&gt;
			$head = $( &amp;#039;&amp;lt;div id=&amp;quot;cat_a_lot_head&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				.appendTo( $container );&lt;br /&gt;
			$link = $( &amp;#039;&amp;lt;a id=&amp;quot;cat_a_lot_toggle&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039; )&lt;br /&gt;
				.text( &amp;#039;Cat-a-lot&amp;#039; )&lt;br /&gt;
				.appendTo( $head );&lt;br /&gt;
&lt;br /&gt;
			if ( !this.searchmode ) {&lt;br /&gt;
				$removeLink = $( &amp;#039;&amp;lt;a id=&amp;quot;cat_a_lot_remove&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039; )&lt;br /&gt;
					.html( msg( &amp;#039;remove-from-cat&amp;#039; ) )&lt;br /&gt;
					.appendTo( $selections )&lt;br /&gt;
					.click( function() {&lt;br /&gt;
						catALot.remove();&lt;br /&gt;
					} );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( ( &amp;#039;MediaWiki:Gadget-Cat-a-lot.js&amp;#039; === mw.util.getParamValue( &amp;#039;withJS&amp;#039; ) &amp;amp;&amp;amp;&lt;br /&gt;
				!mw.util.getParamValue( &amp;#039;withCSS&amp;#039; ) ) ||&lt;br /&gt;
				mw.loader.getState(&amp;#039;ext.gadget.Cat-a-lot&amp;#039;) === &amp;#039;registered&amp;#039; ) {&lt;br /&gt;
					importStylesheet( &amp;#039;MediaWiki:Gadget-Cat-a-lot.css&amp;#039; );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var reCat = new RegExp( &amp;#039;^\\s*&amp;#039; + catALot.localizedRegex( nsCat, &amp;#039;Category&amp;#039; ) + &amp;#039;:&amp;#039;, &amp;#039;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
			$searchInput.keypress( function( e ) {&lt;br /&gt;
					if ( e.which === 13 ) {&lt;br /&gt;
						catALot.updateCats( $.trim( $( this )&lt;br /&gt;
							.val() ) );&lt;br /&gt;
					}&lt;br /&gt;
				} )&lt;br /&gt;
				.bind( &amp;#039;input keyup&amp;#039;, function() {&lt;br /&gt;
					var oldVal = this.value,&lt;br /&gt;
						newVal = oldVal.replace( reCat, &amp;#039;&amp;#039; );&lt;br /&gt;
					if ( newVal !== oldVal ) this.value = newVal;&lt;br /&gt;
				} );&lt;br /&gt;
			if ( this.searchmode ) {&lt;br /&gt;
				$searchInput.val( mw.util.getParamValue( &amp;#039;search&amp;#039; ) );&lt;br /&gt;
			}&lt;br /&gt;
			function initAutocomplete() {&lt;br /&gt;
				if ( catALot.autoCompleteIsEnabled ) return;&lt;br /&gt;
				catALot.autoCompleteIsEnabled = true;&lt;br /&gt;
&lt;br /&gt;
				$searchInput.autocomplete( {&lt;br /&gt;
					source: function( request, response ) {&lt;br /&gt;
						catALot.doAPICall( {&lt;br /&gt;
							action: &amp;#039;opensearch&amp;#039;,&lt;br /&gt;
							search: request.term,&lt;br /&gt;
							namespace: nsCat&lt;br /&gt;
						}, function( data ) {&lt;br /&gt;
							if ( data[ 1 ] ) response( $( data[ 1 ] )&lt;br /&gt;
								.map( function( index, item ) {&lt;br /&gt;
									return item.replace( reCat, &amp;#039;&amp;#039; );&lt;br /&gt;
								} ) );&lt;br /&gt;
						} );&lt;br /&gt;
					},&lt;br /&gt;
					open: function() {&lt;br /&gt;
						$( &amp;quot;.ui-autocomplete&amp;quot; )&lt;br /&gt;
							.position( {&lt;br /&gt;
								my: $( &amp;#039;body&amp;#039; )&lt;br /&gt;
									.is( &amp;#039;.rtl&amp;#039; ) ? &amp;quot;left bottom&amp;quot; : &amp;quot;right bottom&amp;quot;,&lt;br /&gt;
								at: $( &amp;#039;body&amp;#039; )&lt;br /&gt;
									.is( &amp;#039;.rtl&amp;#039; ) ? &amp;quot;left top&amp;quot; : &amp;quot;right top&amp;quot;,&lt;br /&gt;
								of: $searchInput&lt;br /&gt;
							} );&lt;br /&gt;
					},&lt;br /&gt;
					appendTo: &amp;#039;#cat_a_lot&amp;#039;&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$selectAll&lt;br /&gt;
				.click( function() {&lt;br /&gt;
					catALot.toggleAll( true );&lt;br /&gt;
				} );&lt;br /&gt;
			$selectNone&lt;br /&gt;
				.click( function() {&lt;br /&gt;
					catALot.toggleAll( false );&lt;br /&gt;
				} );&lt;br /&gt;
			$link&lt;br /&gt;
				.click( function() {&lt;br /&gt;
					$( this ).toggleClass( &amp;#039;cat_a_lot_enabled&amp;#039; );&lt;br /&gt;
					// Load autocomplete on demand&lt;br /&gt;
					mw.loader.using( [&amp;#039;jquery.ui.autocomplete&amp;#039;], initAutocomplete );&lt;br /&gt;
					catALot.run();&lt;br /&gt;
				} );&lt;br /&gt;
			$settingsLink&lt;br /&gt;
				.click( function() {&lt;br /&gt;
					catALot.manageSettings();&lt;br /&gt;
				} );&lt;br /&gt;
&lt;br /&gt;
			this.localCatName = formattedNS[ nsCat ];&lt;br /&gt;
		},&lt;br /&gt;
		findAllLabels: function() {&lt;br /&gt;
			// It&amp;#039;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&amp;#039;t expect it&lt;br /&gt;
			if ( this.searchmode ) {&lt;br /&gt;
				this.labels = $( &amp;#039;table.searchResultImage&amp;#039; )&lt;br /&gt;
					.find( &amp;#039;tr&amp;gt;td:eq(1)&amp;#039; );&lt;br /&gt;
				if ( this.settings.editpages ) {&lt;br /&gt;
					this.labels = this.labels.add( &amp;#039;div.mw-search-result-heading&amp;#039; );&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				this.labels = $( &amp;#039;div.gallerytext&amp;#039; )&lt;br /&gt;
					.add( $( &amp;#039;div#mw-category-media&amp;#039; )&lt;br /&gt;
						.find( &amp;#039;li[class!=&amp;quot;gallerybox&amp;quot;]&amp;#039; ) );&lt;br /&gt;
&lt;br /&gt;
				if ( this.settings.editpages ) {&lt;br /&gt;
					var $pgs = $( &amp;#039;div#mw-pages, div#mw-subcategories&amp;#039; )&lt;br /&gt;
						.find( &amp;#039;li&amp;#039; );&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 )&lt;br /&gt;
					.match( /wiki\/(.+?)(?:#.+)?$/ )[ 1 ].replace( /_/g, &amp;#039; &amp;#039; );&lt;br /&gt;
			} catch ( ex ) {&lt;br /&gt;
				return &amp;#039;&amp;#039;;&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( &amp;#039;.cat_a_lot_selected&amp;#039; );&lt;br /&gt;
			this.selectedLabels.each( function() {&lt;br /&gt;
				var file = $( this )&lt;br /&gt;
					.find( &amp;#039;a[title]&amp;#039; ),&lt;br /&gt;
					title = file.attr( &amp;#039;title&amp;#039; ) || catALot.getTitleFromLink( file.attr( &amp;#039;href&amp;#039; ) ) || catALot.getTitleFromLink( $( this )&lt;br /&gt;
						.find( &amp;#039;a&amp;#039; )&lt;br /&gt;
						.attr( &amp;#039;href&amp;#039; ) );&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( &amp;#039;.cat_a_lot_selected&amp;#039; );&lt;br /&gt;
			$markCounter&lt;br /&gt;
				.show()&lt;br /&gt;
				.html( msg( &amp;#039;files-selected&amp;#039;, this.selectedLabels.length ) );&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;
				} )&lt;br /&gt;
				.addClass( &amp;#039;cat_a_lot_label&amp;#039; );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		toggleAll: function( select ) {&lt;br /&gt;
			this.labels.toggleClass( &amp;#039;cat_a_lot_selected&amp;#039;, 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: &amp;#039;query&amp;#039;,&lt;br /&gt;
				list: &amp;#039;categorymembers&amp;#039;,&lt;br /&gt;
				cmtype: &amp;#039;subcat&amp;#039;,&lt;br /&gt;
				cmlimit: this.settings.subcatcount,&lt;br /&gt;
				cmtitle: &amp;#039;Category:&amp;#039; + 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;
		getParentCats: function() {&lt;br /&gt;
			var data = {&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				prop: &amp;#039;categories&amp;#039;,&lt;br /&gt;
				titles: &amp;#039;Category:&amp;#039; + 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 === &amp;#039;&amp;#039; ) {&lt;br /&gt;
					$resultList.html( &amp;#039;&amp;lt;span id=&amp;quot;cat_a_lot_no_found&amp;quot;&amp;gt;&amp;#039; + msg( &amp;#039;cat-not-found&amp;#039; ) + &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; );&lt;br /&gt;
					document.body.style.cursor = &amp;#039;auto&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
					$resultList.append( &amp;#039;&amp;lt;table&amp;gt;&amp;lt;/table&amp;gt;&amp;#039; );&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&amp;#039;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 = &amp;#039;[\\t _\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]+&amp;#039;;&lt;br /&gt;
			var wikiTextBlankRE = new RegExp( wikiTextBlank, &amp;#039;g&amp;#039; );&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 += &amp;#039;[&amp;#039; + ll + ul + &amp;#039;]&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				return regex_name.replace( /([\\\^\$\.\?\*\+\(\)])/g, &amp;#039;\\$1&amp;#039; )&lt;br /&gt;
					.replace( wikiTextBlankRE, wikiTextBlank );&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			fallback = fallback.toLowerCase();&lt;br /&gt;
			var canonical = formattedNS[ namespaceNumber ].toLowerCase();&lt;br /&gt;
			var RegexString = createRegexStr( canonical );&lt;br /&gt;
			if ( fallback &amp;amp;&amp;amp; canonical !== fallback ) RegexString += &amp;#039;|&amp;#039; + createRegexStr( fallback );&lt;br /&gt;
			for ( var catName in nsIDs ) {&lt;br /&gt;
				if ( typeof( catName ) === &amp;#039;string&amp;#039; &amp;amp;&amp;amp; catName.toLowerCase() !== canonical &amp;amp;&amp;amp; catName.toLowerCase() !== fallback &amp;amp;&amp;amp; nsIDs[ catName ] === namespaceNumber ) {&lt;br /&gt;
					RegexString += &amp;#039;|&amp;#039; + createRegexStr( catName );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return ( &amp;#039;(?:&amp;#039; + RegexString + &amp;#039;)&amp;#039; );&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		findAllVariants: function( category ) {&lt;br /&gt;
			var result = [],&lt;br /&gt;
				baseUrl = &amp;#039;/w/api.php?action=parse&amp;amp;text=&amp;#039; + encodeURIComponent(category) + &amp;#039;&amp;amp;title=temp&amp;amp;format=json&amp;amp;variant=&amp;#039;;&lt;br /&gt;
			if ( this._variantCache[category] !== undefined ) {&lt;br /&gt;
				return this._variantCache[category];&lt;br /&gt;
			}&lt;br /&gt;
			$.each( [&amp;#039;zh-hans&amp;#039;, &amp;#039;zh-hant&amp;#039;, &amp;#039;zh-cn&amp;#039;, &amp;#039;zh-tw&amp;#039;, &amp;#039;zh-hg&amp;#039;, &amp;#039;zh-mo&amp;#039;], function( idx, variant ) {&lt;br /&gt;
				var r = ( $( $.ajax( { url: baseUrl + variant, async: false } )&lt;br /&gt;
					      .responseJSON.parse.text[&amp;#039;*&amp;#039;] )&lt;br /&gt;
					      .get( 0 ).textContent );&lt;br /&gt;
				if ( result.indexOf( r ) === -1 ) {&lt;br /&gt;
					result.push( r );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			this._variantCache[category] = result;&lt;br /&gt;
			return result;&lt;br /&gt;
		},&lt;br /&gt;
		regexBuilder: function( category ) {&lt;br /&gt;
			var variants,&lt;br /&gt;
				catname = this.localizedRegex( nsCat, &amp;#039;Category&amp;#039; );&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; )&lt;br /&gt;
				.replace( /[\s_]+$/, &amp;quot;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
			// Find all variants&lt;br /&gt;
			variants = this.findAllVariants( category );&lt;br /&gt;
&lt;br /&gt;
			// escape regexp metacharacters (= any ASCII punctuation except _)&lt;br /&gt;
			category = [];&lt;br /&gt;
			$.each( variants, function( idx, variant ) {&lt;br /&gt;
				variant = mw.RegExp.escape( variant );&lt;br /&gt;
				// any sequence of spaces and underscores should match any other&lt;br /&gt;
				variant = variant.replace( /[\s_]+/g, &amp;#039;[\\s_]+&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
				// Make the first character case-insensitive:&lt;br /&gt;
				var first = variant.substr( 0, 1 );&lt;br /&gt;
				if ( first.toUpperCase() !== first.toLowerCase() ) {&lt;br /&gt;
					variant = &amp;#039;[&amp;#039; + first.toUpperCase() + first.toLowerCase() + &amp;#039;]&amp;#039; + variant.substr( 1 );&lt;br /&gt;
				}&lt;br /&gt;
				category.push( variant );&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( &amp;#039;\\[\\[[\\s_]*&amp;#039; + catname + &amp;#039;[\\s_]*:[\\s_]*(?:&amp;#039; + category.join( &amp;#039;|&amp;#039; ) + &amp;#039;)[\\s_]*(\\|[^\\]]*(?:\\][^\\]]+)*)?\\]\\]&amp;#039;, &amp;#039;g&amp;#039; );&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: &amp;#039;query&amp;#039;,&lt;br /&gt;
				prop: &amp;#039;info|revisions&amp;#039;,&lt;br /&gt;
				rvprop: &amp;#039;content|timestamp&amp;#039;,&lt;br /&gt;
				intoken: &amp;#039;edit&amp;#039;,&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&amp;#039;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 ][ &amp;#039;*&amp;#039; ];&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 = currentCat;&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 )&lt;br /&gt;
				.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 === &amp;#039;move&amp;#039; ) {&lt;br /&gt;
					mode = &amp;#039;remove&amp;#039;;&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 &amp;#039;add&amp;#039;:&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 = msgPlain( &amp;#039;summary-add&amp;#039; ).replace( &amp;#039;$1&amp;#039;, targetcat );&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;copy&amp;#039;:&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 = msgPlain( &amp;#039;summary-copy&amp;#039; ).replace( &amp;#039;$1&amp;#039;, sourcecat ).replace( &amp;#039;$2&amp;#039;, targetcat );&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 &amp;#039;move&amp;#039;:&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 = msgPlain( &amp;#039;summary-move&amp;#039; ).replace( &amp;#039;$1&amp;#039;, sourcecat ).replace( &amp;#039;$2&amp;#039;, targetcat );&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;remove&amp;#039;:&lt;br /&gt;
					text = text.replace( this.regexBuilder( sourcecat ), &amp;quot;&amp;quot; );&lt;br /&gt;
					comment = msgPlain( &amp;#039;summary-remove&amp;#039; ).replace( &amp;#039;$1&amp;#039;, sourcecat );&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 !== &amp;#039;remove&amp;#039; ) {&lt;br /&gt;
				text = this.doCleanup( this.removeUncat( text ) );&lt;br /&gt;
			}&lt;br /&gt;
			var data = {&lt;br /&gt;
				action: &amp;#039;edit&amp;#039;,&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() {&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( &amp;#039;cat_a_lot_markAsDone&amp;#039; );&lt;br /&gt;
			switch ( mode ) {&lt;br /&gt;
				case &amp;#039;add&amp;#039;:&lt;br /&gt;
					label.append( &amp;#039;&amp;lt;br&amp;gt;&amp;#039; + msg( &amp;#039;added-cat&amp;#039;, targetcat ) );&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;copy&amp;#039;:&lt;br /&gt;
					label.append( &amp;#039;&amp;lt;br&amp;gt;&amp;#039; + msg( &amp;#039;copied-cat&amp;#039;, targetcat ) );&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;move&amp;#039;:&lt;br /&gt;
					label.append( &amp;#039;&amp;lt;br&amp;gt;&amp;#039; + msg( &amp;#039;moved-cat&amp;#039;, targetcat ) );&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;remove&amp;#039;:&lt;br /&gt;
					label.append( &amp;#039;&amp;lt;br&amp;gt;&amp;#039; + msg( &amp;#039;removed-cat&amp;#039; ) );&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 = &amp;#039;auto&amp;#039;;&lt;br /&gt;
			$( &amp;#039;.cat_a_lot_feedback&amp;#039; )&lt;br /&gt;
				.addClass( &amp;#039;cat_a_lot_done&amp;#039; );&lt;br /&gt;
			$( &amp;#039;.ui-dialog-content&amp;#039; )&lt;br /&gt;
				.height( &amp;#039;auto&amp;#039; );&lt;br /&gt;
			var rep = this.domCounter.parent();&lt;br /&gt;
			rep.html( &amp;#039;&amp;lt;h3&amp;gt;&amp;#039; + msg( &amp;#039;done&amp;#039; ) + &amp;#039;&amp;lt;/h3&amp;gt;&amp;#039; );&lt;br /&gt;
			rep.append( msg( &amp;#039;all-done&amp;#039; ) + &amp;#039;&amp;lt;br /&amp;gt;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
			var close = $( &amp;#039;&amp;lt;a&amp;gt;&amp;#039; )&lt;br /&gt;
				.text( msgPlain( &amp;#039;return-to-page&amp;#039; ) );&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( &amp;#039;&amp;lt;h5&amp;gt;&amp;#039; + msg( &amp;#039;skipped-already&amp;#039;, this.alreadyThere.length ) + &amp;#039;&amp;lt;/h5&amp;gt;&amp;#039; );&lt;br /&gt;
				rep.append( this.alreadyThere.join( &amp;#039;&amp;lt;br&amp;gt;&amp;#039; ) );&lt;br /&gt;
			}&lt;br /&gt;
			if ( this.notFound.length ) {&lt;br /&gt;
				rep.append( &amp;#039;&amp;lt;h5&amp;gt;&amp;#039; + msg( &amp;#039;skipped-not-found&amp;#039;, this.notFound.length ) + &amp;#039;&amp;lt;/h5&amp;gt;&amp;#039; );&lt;br /&gt;
				rep.append( this.notFound.join( &amp;#039;&amp;lt;br&amp;gt;&amp;#039; ) );&lt;br /&gt;
			}&lt;br /&gt;
			if ( this.connectionError.length ) {&lt;br /&gt;
				rep.append( &amp;#039;&amp;lt;h5&amp;gt;&amp;#039; + msg( &amp;#039;skipped-server&amp;#039;, this.connectionError.length ) + &amp;#039;&amp;lt;/h5&amp;gt;&amp;#039; );&lt;br /&gt;
				rep.append( this.connectionError.join( &amp;#039;&amp;lt;br&amp;gt;&amp;#039; ) );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		moveHere: function( targetcat ) {&lt;br /&gt;
			this.doSomething( targetcat, &amp;#039;move&amp;#039; );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		copyHere: function( targetcat ) {&lt;br /&gt;
			this.doSomething( targetcat, &amp;#039;copy&amp;#039; );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		addHere: function( targetcat ) {&lt;br /&gt;
			this.doSomething( targetcat, &amp;#039;add&amp;#039; );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		remove: function() {&lt;br /&gt;
			this.doSomething( &amp;#039;&amp;#039;, &amp;#039;remove&amp;#039; );&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( msgPlain( &amp;#039;none-selected&amp;#039; ) );&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;
			mw.loader.using( [&amp;#039;jquery.ui.dialog&amp;#039;, &amp;#039;mediawiki.RegExp&amp;#039;], function() {&lt;br /&gt;
				catALot.showProgress();&lt;br /&gt;
				for ( var i = 0; i &amp;lt; files.length; i++ ) {&lt;br /&gt;
					catALot.getContent( files[ i ], targetcat, mode );&lt;br /&gt;
				}	&lt;br /&gt;
			} );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		doAPICall: function( params, callback ) {&lt;br /&gt;
			params.format = &amp;#039;json&amp;#039;;&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; $.isFunction( window.console.log ) ) {&lt;br /&gt;
					window.console.log( &amp;#039;Error: &amp;#039;, 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: &amp;#039;json&amp;#039;,&lt;br /&gt;
					data: params,&lt;br /&gt;
					type: &amp;#039;POST&amp;#039;,&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 = $resultList.find( &amp;#039;table&amp;#039; );&lt;br /&gt;
			for ( var i = 0; i &amp;lt; list.length; i++ ) {&lt;br /&gt;
				var $tr = $( &amp;#039;&amp;lt;tr&amp;gt;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
				var $link = $( &amp;#039;&amp;lt;a&amp;gt;&amp;#039; ),&lt;br /&gt;
					$add, $move, $copy;&lt;br /&gt;
&lt;br /&gt;
				$link.text( list[ i ] );&lt;br /&gt;
				$tr.data( &amp;#039;cat&amp;#039;, list[ i ] );&lt;br /&gt;
				$link.click( function() {&lt;br /&gt;
					catALot.updateCats( $( this ).closest(&amp;#039;tr&amp;#039;).data( &amp;#039;cat&amp;#039; ) );&lt;br /&gt;
				} );&lt;br /&gt;
&lt;br /&gt;
				if ( this.searchmode ) {&lt;br /&gt;
					$add = $( &amp;#039;&amp;lt;a class=&amp;quot;cat_a_lot_action&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039; )&lt;br /&gt;
						.text( msgPlain( &amp;#039;add&amp;#039; ) )&lt;br /&gt;
						.click( function() {&lt;br /&gt;
							catALot.addHere( $( this ).closest(&amp;#039;tr&amp;#039;).data( &amp;#039;cat&amp;#039; ) );&lt;br /&gt;
						} );&lt;br /&gt;
				} else {&lt;br /&gt;
					$move = $( &amp;#039;&amp;lt;a class=&amp;quot;cat_a_lot_move&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039; )&lt;br /&gt;
						.text( msgPlain( &amp;#039;move&amp;#039; ) )&lt;br /&gt;
						.click( function() {&lt;br /&gt;
							catALot.moveHere( $( this ).closest(&amp;#039;tr&amp;#039;).data( &amp;#039;cat&amp;#039; ) );&lt;br /&gt;
						} );&lt;br /&gt;
&lt;br /&gt;
					$copy = $( &amp;#039;&amp;lt;a class=&amp;quot;cat_a_lot_action&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039; )&lt;br /&gt;
						.text( msgPlain( &amp;#039;copy&amp;#039; ) )&lt;br /&gt;
						.click( function() {&lt;br /&gt;
							catALot.copyHere( $( this ).closest(&amp;#039;tr&amp;#039;).data( &amp;#039;cat&amp;#039; ) );&lt;br /&gt;
						} );&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				$tr.append( $(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;).text( symbol ) )&lt;br /&gt;
					.append( $(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;).append( $link ) );&lt;br /&gt;
&lt;br /&gt;
				// Can&amp;#039;t move to source category&lt;br /&gt;
				if ( list[ i ] !== currentCat &amp;amp;&amp;amp; this.searchmode ) {&lt;br /&gt;
					$tr.append( $(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;).append( $add ) );&lt;br /&gt;
				} else if ( list[ i ] !== currentCat &amp;amp;&amp;amp; !this.searchmode ) {&lt;br /&gt;
					$tr.append( $(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;).append( $move ),  $(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;).append( $copy ) );&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				domlist.append( $tr );&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;
			$resultList.empty();&lt;br /&gt;
			$resultList.append( &amp;#039;&amp;lt;table&amp;gt;&amp;lt;/table&amp;gt;&amp;#039; );&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 = &amp;#039;auto&amp;#039;;&lt;br /&gt;
			//Reset width&lt;br /&gt;
			$container.width( &amp;#039;&amp;#039; );&lt;br /&gt;
			$container.height( &amp;#039;&amp;#039; );&lt;br /&gt;
			$container.width( Math.min( $container.width() * 1.1 + 15, $( window ).width() - 10 ) );&lt;br /&gt;
&lt;br /&gt;
			$resultList.css( {&lt;br /&gt;
				maxHeight: this.setHeight + &amp;#039;px&amp;#039;,&lt;br /&gt;
				height: &amp;#039;&amp;#039;&lt;br /&gt;
			} );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		updateCats: function( newcat ) {&lt;br /&gt;
			document.body.style.cursor = &amp;#039;wait&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			this.currentCategory = newcat;&lt;br /&gt;
			$resultList.html( &amp;#039;&amp;lt;div class=&amp;quot;cat_a_lot_loading&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; ).text( msgPlain( &amp;#039;loading&amp;#039; ) );&lt;br /&gt;
			this.getCategoryList();&lt;br /&gt;
		},&lt;br /&gt;
		showProgress: function() {&lt;br /&gt;
			document.body.style.cursor = &amp;#039;wait&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			this.progressDialog = $( &amp;#039;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				.html( msg( &amp;#039;editing&amp;#039; ) + &amp;#039; &amp;lt;span id=&amp;quot;cat_a_lot_current&amp;quot;&amp;gt;&amp;#039; + this.counterCurrent + &amp;#039;&amp;lt;/span&amp;gt; &amp;#039; + msg( &amp;#039;of&amp;#039; ) + this.counterNeeded )&lt;br /&gt;
				.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;
			$( &amp;#039;.ui-dialog-titlebar&amp;#039; )&lt;br /&gt;
				.hide();&lt;br /&gt;
			this.domCounter = $( &amp;#039;#cat_a_lot_current&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		run: function() {&lt;br /&gt;
			if ( $( &amp;#039;.cat_a_lot_enabled&amp;#039; ).length ) {&lt;br /&gt;
				this.makeClickable();&lt;br /&gt;
				$dataContainer&lt;br /&gt;
					.show();&lt;br /&gt;
				$container&lt;br /&gt;
					.resizable( {&lt;br /&gt;
						handles: &amp;#039;n&amp;#039;,&lt;br /&gt;
						alsoResize: &amp;#039;#cat_a_lot_category_list&amp;#039;,&lt;br /&gt;
						resize: function() {&lt;br /&gt;
							$( this )&lt;br /&gt;
								.css( {&lt;br /&gt;
									left: &amp;#039;&amp;#039;,&lt;br /&gt;
									top: &amp;#039;&amp;#039;&lt;br /&gt;
								} );&lt;br /&gt;
							catALot.setHeight = $( this )&lt;br /&gt;
								.height();&lt;br /&gt;
							$resultList&lt;br /&gt;
								.css( {&lt;br /&gt;
									maxHeight: &amp;#039;&amp;#039;,&lt;br /&gt;
									width: &amp;#039;&amp;#039;&lt;br /&gt;
								} );&lt;br /&gt;
						}&lt;br /&gt;
					} );&lt;br /&gt;
				$resultList&lt;br /&gt;
					.css( {&lt;br /&gt;
						maxHeight: &amp;#039;450px&amp;#039;&lt;br /&gt;
					} );&lt;br /&gt;
				if ( this.searchmode ) this.updateCats( &amp;quot;Pictures and images&amp;quot; );&lt;br /&gt;
				else this.updateCats( currentCat );&lt;br /&gt;
&lt;br /&gt;
			} else {&lt;br /&gt;
				$dataContainer&lt;br /&gt;
					.hide();&lt;br /&gt;
				$container&lt;br /&gt;
					.resizable( &amp;quot;destroy&amp;quot; );&lt;br /&gt;
				//Unbind click handlers&lt;br /&gt;
				this.labels.unbind( &amp;#039;click.catALot&amp;#039; );&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		manageSettings: function() {&lt;br /&gt;
			mw.loader.using( [ &amp;#039;ext.gadget.SettingsManager&amp;#039;, &amp;#039;ext.gadget.SettingsUI&amp;#039;, &amp;#039;jquery.ui.progressbar&amp;#039; ], 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; )&lt;br /&gt;
				.show()&lt;br /&gt;
				.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;
&lt;br /&gt;
							$container.remove();&lt;br /&gt;
							catALot.labels.unbind( &amp;#039;click.catALot&amp;#039; );&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: &amp;#039;catALotPrefs&amp;#039;,&lt;br /&gt;
									value: catALot.settings,&lt;br /&gt;
									encloseSignature: &amp;#039;catALot&amp;#039;,&lt;br /&gt;
									encloseBlock: &amp;#039;////////// Cat-A-Lot user preferences //////////\n&amp;#039;,&lt;br /&gt;
									triggerSaveAt: /Cat.?A.?Lot/i,&lt;br /&gt;
									editSummary: msgPlain( &amp;#039;pref-save-summary&amp;#039; )&lt;br /&gt;
								} ),&lt;br /&gt;
								oldHeight = $dlg.height(),&lt;br /&gt;
								$prog = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
							$dlg.css( &amp;#039;height&amp;#039;, oldHeight )&lt;br /&gt;
								.html( &amp;#039;&amp;#039; );&lt;br /&gt;
							$prog.css( {&lt;br /&gt;
									&amp;#039;height&amp;#039;: Math.round( oldHeight / 8 ),&lt;br /&gt;
									&amp;#039;margin-top&amp;#039;: Math.round( ( 7 * oldHeight ) / 16 )&lt;br /&gt;
								} )&lt;br /&gt;
								.appendTo( $dlg );&lt;br /&gt;
&lt;br /&gt;
							$dlg.parent()&lt;br /&gt;
								.find( &amp;#039;.ui-dialog-buttonpane button&amp;#039; )&lt;br /&gt;
								.button( &amp;#039;option&amp;#039;, &amp;#039;disabled&amp;#039;, true );&lt;br /&gt;
&lt;br /&gt;
							opt.save()&lt;br /&gt;
								.done( function( text, progress ) {&lt;br /&gt;
									$prog.progressbar( {&lt;br /&gt;
										value: progress&lt;br /&gt;
									} );&lt;br /&gt;
									$prog.fadeOut( function() {&lt;br /&gt;
										$dlg.dialog( &amp;#039;close&amp;#039; );&lt;br /&gt;
										_restart();&lt;br /&gt;
									} );&lt;br /&gt;
								} )&lt;br /&gt;
								.progress( function( text, progress ) {&lt;br /&gt;
									$prog.progressbar( {&lt;br /&gt;
										value: progress&lt;br /&gt;
									} );&lt;br /&gt;
									// TODO: Add &amp;quot;details&amp;quot; to progressbar&lt;br /&gt;
								} )&lt;br /&gt;
								.fail( function( text ) {&lt;br /&gt;
									$prog.addClass( &amp;#039;ui-state-error&amp;#039; );&lt;br /&gt;
									$dlg.prepend( $( &amp;#039;&amp;lt;p&amp;gt;&amp;#039; )&lt;br /&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 &amp;#039;page&amp;#039;:&lt;br /&gt;
							$dlg.dialog( &amp;#039;close&amp;#039; );&lt;br /&gt;
							_restart();&lt;br /&gt;
							break;&lt;br /&gt;
						case &amp;#039;account-publicly&amp;#039;:&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[ &amp;#039;default&amp;#039; ] );&lt;br /&gt;
				v.label = msgPlain( 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[ msgPlain( i18nk ) ] = val;&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
		},&lt;br /&gt;
		defaults: [ {&lt;br /&gt;
			name: &amp;#039;watchlist&amp;#039;,&lt;br /&gt;
			&amp;#039;default&amp;#039;: &amp;#039;preferences&amp;#039;,&lt;br /&gt;
			label_i18n: &amp;#039;watchlistpref&amp;#039;,&lt;br /&gt;
			select_i18n: {&lt;br /&gt;
				&amp;#039;watch_pref&amp;#039;: &amp;#039;preferences&amp;#039;,&lt;br /&gt;
				&amp;#039;watch_nochange&amp;#039;: &amp;#039;nochange&amp;#039;,&lt;br /&gt;
				&amp;#039;watch_watch&amp;#039;: &amp;#039;watch&amp;#039;,&lt;br /&gt;
				&amp;#039;watch_unwatch&amp;#039;: &amp;#039;unwatch&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		}, {&lt;br /&gt;
			name: &amp;#039;minor&amp;#039;,&lt;br /&gt;
			&amp;#039;default&amp;#039;: false,&lt;br /&gt;
			label_i18n: &amp;#039;minorpref&amp;#039;&lt;br /&gt;
		}, {&lt;br /&gt;
			name: &amp;#039;editpages&amp;#039;,&lt;br /&gt;
			&amp;#039;default&amp;#039;: true,&lt;br /&gt;
			label_i18n: &amp;#039;editpagespref&amp;#039;,&lt;br /&gt;
			forcerestart: true&lt;br /&gt;
		}, {&lt;br /&gt;
			name: &amp;#039;docleanup&amp;#039;,&lt;br /&gt;
			&amp;#039;default&amp;#039;: false,&lt;br /&gt;
			label_i18n: &amp;#039;docleanuppref&amp;#039;&lt;br /&gt;
		}, {&lt;br /&gt;
			name: &amp;#039;subcatcount&amp;#039;,&lt;br /&gt;
			&amp;#039;default&amp;#039;: 50,&lt;br /&gt;
			&amp;#039;min&amp;#039;: 5,&lt;br /&gt;
			&amp;#039;max&amp;#039;: 500,&lt;br /&gt;
			label_i18n: &amp;#039;subcatcountpref&amp;#039;,&lt;br /&gt;
			forcerestart: true&lt;br /&gt;
		} ]&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	if ( ( nsNumber === -1 &amp;amp;&amp;amp; mw.config.get( &amp;#039;wgCanonicalSpecialPageName&amp;#039; ) === &amp;quot;Search&amp;quot; ) || nsNumber === nsCat ) {&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;
			switch ( lang ) {&lt;br /&gt;
				case &amp;#039;zh-hk&amp;#039;:&lt;br /&gt;
				case &amp;#039;zh-mo&amp;#039;:&lt;br /&gt;
				case &amp;#039;zh-tw&amp;#039;:&lt;br /&gt;
					lang = &amp;#039;zh-hant&amp;#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;zh&amp;#039;:&lt;br /&gt;
				case &amp;#039;zh-cn&amp;#039;:&lt;br /&gt;
				case &amp;#039;zh-my&amp;#039;:&lt;br /&gt;
				case &amp;#039;zh-sg&amp;#039;:&lt;br /&gt;
					lang = &amp;#039;zh-hans&amp;#039;;&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
			$.ajax( {&lt;br /&gt;
				url: &amp;#039;//commons.wikimedia.org/w/index.php&amp;#039;,&lt;br /&gt;
				dataType: &amp;#039;script&amp;#039;,&lt;br /&gt;
				data: {&lt;br /&gt;
					title: &amp;#039;MediaWiki:Gadget-Cat-a-lot.js/&amp;#039; + lang,&lt;br /&gt;
					action: &amp;#039;raw&amp;#039;,&lt;br /&gt;
					ctype: &amp;#039;text/javascript&amp;#039;,&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;
			&lt;br /&gt;
			function init() {&lt;br /&gt;
				$( document ).ready( function() {&lt;br /&gt;
						catALot.init();&lt;br /&gt;
					} );&lt;br /&gt;
			}&lt;br /&gt;
			if ( 0 === loadingLocalizations ) {&lt;br /&gt;
				mw.loader.using( [ &amp;#039;user&amp;#039; ], init, init );&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		if ( mw.config.get( &amp;#039;wgUserLanguage&amp;#039; ) !== &amp;#039;en&amp;#039; ) {&lt;br /&gt;
			loadLocalization( mw.config.get( &amp;#039;wgUserLanguage&amp;#039; ), maybeLaunch );&lt;br /&gt;
		}&lt;br /&gt;
		if ( mw.config.get( &amp;#039;wgContentLanguage&amp;#039; ) !== &amp;#039;en&amp;#039; ) {&lt;br /&gt;
			loadLocalization( mw.config.get( &amp;#039;wgContentLanguage&amp;#039; ), 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,&lt;br /&gt;
			$box = this;&lt;br /&gt;
		// When our boxes are clicked..&lt;br /&gt;
		$box.bind( &amp;#039;click.catALot&amp;#039;, function( e ) {&lt;br /&gt;
&lt;br /&gt;
			// Highlight last selected&lt;br /&gt;
			$( &amp;#039;#cat_a_lot_last_selected&amp;#039; )&lt;br /&gt;
				.removeAttr( &amp;#039;id&amp;#039; );&lt;br /&gt;
			var $thisControl = $( e.target ),&lt;br /&gt;
				method;&lt;br /&gt;
			if ( !$thisControl.hasClass( &amp;#039;cat_a_lot_label&amp;#039; ) ) {&lt;br /&gt;
				$thisControl = $thisControl.parents( &amp;#039;.cat_a_lot_label&amp;#039; );&lt;br /&gt;
			}&lt;br /&gt;
			$thisControl.attr( &amp;#039;id&amp;#039;, &amp;#039;cat_a_lot_last_selected&amp;#039; )&lt;br /&gt;
				.toggleClass( &amp;#039;cat_a_lot_selected&amp;#039; );&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( &amp;#039;cat_a_lot_selected&amp;#039; ) ? &amp;#039;addClass&amp;#039; : &amp;#039;removeClass&amp;#039;;&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 ]( &amp;#039;cat_a_lot_selected&amp;#039; );&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;
			if ( $.isFunction( cb ) ) cb();&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>zhwiki&gt;PhiLiP</name></author>
	</entry>
</feed>