<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://rbo.sandiegozoo.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>RBO - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://rbo.sandiegozoo.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://rbo.sandiegozoo.org/index.php/Special:Contributions/Admin"/>
	<updated>2026-04-06T16:47:09Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.2</generator>
	<entry>
		<id>https://rbo.sandiegozoo.org/index.php?title=Main_Page&amp;diff=112</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://rbo.sandiegozoo.org/index.php?title=Main_Page&amp;diff=112"/>
		<updated>2012-06-29T21:10:16Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''SAFARI PARK'''&lt;br /&gt;
&lt;br /&gt;
[[Caravan Safari Adventure]]&lt;br /&gt;
&lt;br /&gt;
[[Caravan Safari Deluxe]]&lt;br /&gt;
&lt;br /&gt;
[[Flightline Safari]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SAN DIEGO ZOO'''&lt;br /&gt;
&lt;br /&gt;
[[Zoo Backstage Pass]]&lt;br /&gt;
&lt;br /&gt;
[[Zoo Inside Look]]&lt;br /&gt;
&lt;br /&gt;
[[Zoo Junior Inside Look]]&lt;br /&gt;
&lt;br /&gt;
[[NOTE: Please allow suffient time for travel to the Safari Park, parking, and to find Check In location inside park. Allow additional time for busy summer and holiday periods.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadgets-definition&amp;diff=85</id>
		<title>MediaWiki:Gadgets-definition</title>
		<link rel="alternate" type="text/html" href="https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadgets-definition&amp;diff=85"/>
		<updated>2012-02-03T00:42:07Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;* HotCat Category Assistant|HotCat.js * wikEd GUI Editor|wikEd.js * Navigation_popups|popups.js|navpop.css&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* HotCat Category Assistant|HotCat.js&lt;br /&gt;
* wikEd GUI Editor|wikEd.js&lt;br /&gt;
* Navigation_popups|popups.js|navpop.css&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-wikEd.js&amp;diff=84</id>
		<title>MediaWiki:Gadget-wikEd.js</title>
		<link rel="alternate" type="text/html" href="https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-wikEd.js&amp;diff=84"/>
		<updated>2012-02-03T00:37:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;// install Wikipedia:User:Cacycle/wikEd in-browser text editor importScriptURI('//en.wikipedia.org/w/index.php?title=User:Cacycle/wikEd.js' + '&amp;amp;action=raw&amp;amp;ctype=text/javas...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// install [[Wikipedia:User:Cacycle/wikEd]] in-browser text editor&lt;br /&gt;
importScriptURI('//en.wikipedia.org/w/index.php?title=User:Cacycle/wikEd.js'&lt;br /&gt;
+ '&amp;amp;action=raw&amp;amp;ctype=text/javascript');&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-navpop.css&amp;diff=82</id>
		<title>MediaWiki:Gadget-navpop.css</title>
		<link rel="alternate" type="text/html" href="https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-navpop.css&amp;diff=82"/>
		<updated>2012-02-03T00:35:32Z</updated>

		<summary type="html">&lt;p&gt;Admin: moved MediaWiki:Gadget-navpop.js to MediaWiki:Gadget-navpop.css&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;a.popupMoreLink {&lt;br /&gt;
    display: block;&lt;br /&gt;
	text-align: right;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
ins.popupDiff {&lt;br /&gt;
	background: #afe;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
del.popupDiff {&lt;br /&gt;
	background: #ffe6e6;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#selectionPreview {&lt;br /&gt;
	/* overflow: auto; max-height: 16ex; */&lt;br /&gt;
	border: 2px solid #ddd;&lt;br /&gt;
	background-color: #eef;&lt;br /&gt;
	padding: 6px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.navpopup {&lt;br /&gt;
	border: solid #ffbe20 1px;&lt;br /&gt;
	background-color: #fffaef;&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
	font-size: 8pt;&lt;br /&gt;
	/* opacity: 0.9; */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Configure Drag bar color */&lt;br /&gt;
.popupDrag {&lt;br /&gt;
	background-color: #ffbe20;&lt;br /&gt;
	height: 5px;&lt;br /&gt;
	margin-top: -5px;&lt;br /&gt;
	margin-bottom: 5px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.popupDragHandle {&lt;br /&gt;
	cursor: move;&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* menu magic - many thanks to [[User: Zocky]]! */&lt;br /&gt;
 &lt;br /&gt;
/* popups */&lt;br /&gt;
.popup_menu li {&lt;br /&gt;
	margin: 3px;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu {&lt;br /&gt;
	display: none;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	left: 0;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
	list-style-type: none;&lt;br /&gt;
	/* top: 1.6ex; */&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
	width: 10em;&lt;br /&gt;
	background: white;&lt;br /&gt;
	border: solid 1px grey;&lt;br /&gt;
	padding: 0.5em !important;&lt;br /&gt;
	margin-left: -6px;&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
	border-width: 1px 1px 1px 6px;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu a {&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu_row a {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu_row {&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	/* border: solid 1px red; */&lt;br /&gt;
}&lt;br /&gt;
.popup_drop {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
.popup_drop: hover .popup_menu,&lt;br /&gt;
.popup_drop .popup_menu: hover {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	background: White;&lt;br /&gt;
	padding: 2px 2px 2px 2px;&lt;br /&gt;
}&lt;br /&gt;
.popup_drop: hover {&lt;br /&gt;
	background: #ccf;&lt;br /&gt;
	color: #44f;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* other colours, styles and so on */&lt;br /&gt;
.popup_menu a: hover {&lt;br /&gt;
	background: #ccf;&lt;br /&gt;
	color: #44f;&lt;br /&gt;
}&lt;br /&gt;
.popup_mainlink {&lt;br /&gt;
	font-size: 140%;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.popup_change_title_link {&lt;br /&gt;
	color: #152;&lt;br /&gt;
}&lt;br /&gt;
.popup_diff_dates {&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	background: none;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu_item {&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	/* border: solid 1px green; */&lt;br /&gt;
}&lt;br /&gt;
.popup_menu_item a {&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
.popup_history_row_even {&lt;br /&gt;
	background: #eee;&lt;br /&gt;
}&lt;br /&gt;
.popup_history_date {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 120%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* disable interwiki styling */&lt;br /&gt;
.popupPreview a.extiw,&lt;br /&gt;
.popupPreview a.extiw: active {&lt;br /&gt;
	color: #36b;&lt;br /&gt;
	background: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.popupPreview a.external {&lt;br /&gt;
	color: #36b;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * this can be used in the content area to switch off&lt;br /&gt;
 * special external link styling&lt;br /&gt;
 */&lt;br /&gt;
.popupPreview .plainlinks a {&lt;br /&gt;
	background: none !important;&lt;br /&gt;
	padding: 0 !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-navpop.js&amp;diff=83</id>
		<title>MediaWiki:Gadget-navpop.js</title>
		<link rel="alternate" type="text/html" href="https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-navpop.js&amp;diff=83"/>
		<updated>2012-02-03T00:35:32Z</updated>

		<summary type="html">&lt;p&gt;Admin: moved MediaWiki:Gadget-navpop.js to MediaWiki:Gadget-navpop.css&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[MediaWiki:Gadget-navpop.css]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-HotCat.js&amp;diff=81</id>
		<title>MediaWiki:Gadget-HotCat.js</title>
		<link rel="alternate" type="text/html" href="https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-HotCat.js&amp;diff=81"/>
		<updated>2012-02-03T00:08:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;/*  This imports the latest version of HotCat from Commons.  HotCat is a gadget to make changes to categories much easier.  Full documentation can be found at http://commons.w...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
 This imports the latest version of HotCat from Commons.&lt;br /&gt;
 HotCat is a gadget to make changes to categories much easier.&lt;br /&gt;
 Full documentation can be found at http://commons.wikimedia.org/wiki/Help:Gadget-HotCat&lt;br /&gt;
*/&lt;br /&gt;
 window.hotcat_translations_from_commons = false;&lt;br /&gt;
 mw.loader.load( window.location.protocol + '//commons.wikimedia.org/w/index.php?title=MediaWiki:Gadget-HotCat.js&amp;amp;action=raw&amp;amp;ctype=text/javascript' );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-navpop.css&amp;diff=80</id>
		<title>MediaWiki:Gadget-navpop.css</title>
		<link rel="alternate" type="text/html" href="https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-navpop.css&amp;diff=80"/>
		<updated>2012-02-02T23:33:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;a.popupMoreLink {     display: block; 	text-align: right; 	cursor: pointer; }   ins.popupDiff { 	background: #afe; }   del.popupDiff { 	background: #ffe6e6; }   #selectionPreview...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;a.popupMoreLink {&lt;br /&gt;
    display: block;&lt;br /&gt;
	text-align: right;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
ins.popupDiff {&lt;br /&gt;
	background: #afe;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
del.popupDiff {&lt;br /&gt;
	background: #ffe6e6;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#selectionPreview {&lt;br /&gt;
	/* overflow: auto; max-height: 16ex; */&lt;br /&gt;
	border: 2px solid #ddd;&lt;br /&gt;
	background-color: #eef;&lt;br /&gt;
	padding: 6px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.navpopup {&lt;br /&gt;
	border: solid #ffbe20 1px;&lt;br /&gt;
	background-color: #fffaef;&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
	font-size: 8pt;&lt;br /&gt;
	/* opacity: 0.9; */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Configure Drag bar color */&lt;br /&gt;
.popupDrag {&lt;br /&gt;
	background-color: #ffbe20;&lt;br /&gt;
	height: 5px;&lt;br /&gt;
	margin-top: -5px;&lt;br /&gt;
	margin-bottom: 5px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.popupDragHandle {&lt;br /&gt;
	cursor: move;&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* menu magic - many thanks to [[User: Zocky]]! */&lt;br /&gt;
 &lt;br /&gt;
/* popups */&lt;br /&gt;
.popup_menu li {&lt;br /&gt;
	margin: 3px;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu {&lt;br /&gt;
	display: none;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	left: 0;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
	list-style-type: none;&lt;br /&gt;
	/* top: 1.6ex; */&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
	width: 10em;&lt;br /&gt;
	background: white;&lt;br /&gt;
	border: solid 1px grey;&lt;br /&gt;
	padding: 0.5em !important;&lt;br /&gt;
	margin-left: -6px;&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
	border-width: 1px 1px 1px 6px;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu a {&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu_row a {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu_row {&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	/* border: solid 1px red; */&lt;br /&gt;
}&lt;br /&gt;
.popup_drop {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
.popup_drop: hover .popup_menu,&lt;br /&gt;
.popup_drop .popup_menu: hover {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	background: White;&lt;br /&gt;
	padding: 2px 2px 2px 2px;&lt;br /&gt;
}&lt;br /&gt;
.popup_drop: hover {&lt;br /&gt;
	background: #ccf;&lt;br /&gt;
	color: #44f;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* other colours, styles and so on */&lt;br /&gt;
.popup_menu a: hover {&lt;br /&gt;
	background: #ccf;&lt;br /&gt;
	color: #44f;&lt;br /&gt;
}&lt;br /&gt;
.popup_mainlink {&lt;br /&gt;
	font-size: 140%;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.popup_change_title_link {&lt;br /&gt;
	color: #152;&lt;br /&gt;
}&lt;br /&gt;
.popup_diff_dates {&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	background: none;&lt;br /&gt;
}&lt;br /&gt;
.popup_menu_item {&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	/* border: solid 1px green; */&lt;br /&gt;
}&lt;br /&gt;
.popup_menu_item a {&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
.popup_history_row_even {&lt;br /&gt;
	background: #eee;&lt;br /&gt;
}&lt;br /&gt;
.popup_history_date {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 120%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* disable interwiki styling */&lt;br /&gt;
.popupPreview a.extiw,&lt;br /&gt;
.popupPreview a.extiw: active {&lt;br /&gt;
	color: #36b;&lt;br /&gt;
	background: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.popupPreview a.external {&lt;br /&gt;
	color: #36b;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * this can be used in the content area to switch off&lt;br /&gt;
 * special external link styling&lt;br /&gt;
 */&lt;br /&gt;
.popupPreview .plainlinks a {&lt;br /&gt;
	background: none !important;&lt;br /&gt;
	padding: 0 !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-popups.js&amp;diff=79</id>
		<title>MediaWiki:Gadget-popups.js</title>
		<link rel="alternate" type="text/html" href="https://rbo.sandiegozoo.org/index.php?title=MediaWiki:Gadget-popups.js&amp;diff=79"/>
		<updated>2012-02-02T23:32:38Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;var popupVersion=&amp;quot;en:MediaWiki:Gadget-popups.js &amp;quot; + /*/{{subst:Selfsubst/now string|js|/*/ &amp;quot;2011-10-02 02:52:58 (UTC)&amp;quot; /*/}}/*/; // STARTFILE: main.js // ************************...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;var popupVersion=&amp;quot;en:MediaWiki:Gadget-popups.js &amp;quot; + /*/{{subst:Selfsubst/now string|js|/*/ &amp;quot;2011-10-02 02:52:58 (UTC)&amp;quot; /*/}}/*/;&lt;br /&gt;
// STARTFILE: main.js&lt;br /&gt;
// **********************************************************************&lt;br /&gt;
// **                                                                  **&lt;br /&gt;
// **             changes to this file affect many users.              **&lt;br /&gt;
// **           please discuss on the talk page before editing         **&lt;br /&gt;
// **                                                                  **&lt;br /&gt;
// **********************************************************************&lt;br /&gt;
// **                                                                  **&lt;br /&gt;
// ** if you do edit this file, be sure that your editor recognizes it **&lt;br /&gt;
// ** as utf8, or the weird and wonderful characters in the namespaces **&lt;br /&gt;
// **   below will be completely broken. You can check with the show   **&lt;br /&gt;
// **            changes button before submitting the edit.            **&lt;br /&gt;
// **                      test: مدیا מיוחד Мэдыя                      **&lt;br /&gt;
// **                                                                  **&lt;br /&gt;
// **********************************************************************&lt;br /&gt;
 &lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Globals&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
// Trying to shove as many of these as possible into the pg (popup globals) object&lt;br /&gt;
function pg(){}; // dummy to stop errors&lt;br /&gt;
window.pg = {&lt;br /&gt;
	re: {},               // regexps&lt;br /&gt;
	ns: {},               // namespaces&lt;br /&gt;
	string: {},           // translatable strings&lt;br /&gt;
	wiki: {},             // local site info&lt;br /&gt;
	misc: {},             // YUCK PHOOEY&lt;br /&gt;
	option: {},           // options, see newOption etc&lt;br /&gt;
	optionDefault: {},    // default option values&lt;br /&gt;
	flag: {},             // misc flags&lt;br /&gt;
	cache: {},            // page and image cache&lt;br /&gt;
	structures: {},       // navlink structures&lt;br /&gt;
	timer: {},            // all sorts of timers (too damn many)&lt;br /&gt;
	counter: {},          // .. and all sorts of counters&lt;br /&gt;
	current: {},          // state info&lt;br /&gt;
	endoflist: null&lt;br /&gt;
};&lt;br /&gt;
window.pop = {          // wrap various functions in here&lt;br /&gt;
	init: {},&lt;br /&gt;
	util: {},&lt;br /&gt;
	endoflist: null&lt;br /&gt;
};&lt;br /&gt;
function popupsReady() {&lt;br /&gt;
	if (!window.pg) { return false; }&lt;br /&gt;
	if (!pg.flag) { return false; }&lt;br /&gt;
	if (!pg.flag.finishedLoading) { return false; }&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/// Local Variables: ///&lt;br /&gt;
/// mode:c ///&lt;br /&gt;
/// End: ///&lt;br /&gt;
// ENDFILE: main.js&lt;br /&gt;
// STARTFILE: actions.js&lt;br /&gt;
function setupTooltips(container, remove, force, popData) {&lt;br /&gt;
	log('setupTooltips, container='+container+', remove='+remove);&lt;br /&gt;
	if (!container) {&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		// the main initial call&lt;br /&gt;
		if (getValueOf('popupOnEditSelection') &amp;amp;&amp;amp; window.doSelectionPopup &amp;amp;&amp;amp; document &amp;amp;&amp;amp; document.editform &amp;amp;&amp;amp; document.editform.wpTextbox1) {&lt;br /&gt;
			document.editform.wpTextbox1.onmouseup=doSelectionPopup;&lt;br /&gt;
		}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
		// article/content is a structure-dependent thing&lt;br /&gt;
		container = defaultPopupsContainer();&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if (!remove &amp;amp;&amp;amp; !force &amp;amp;&amp;amp; container.ranSetupTooltipsAlready) { return; }&lt;br /&gt;
	container.ranSetupTooltipsAlready = !remove;&lt;br /&gt;
 &lt;br /&gt;
	var anchors;&lt;br /&gt;
	anchors=container.getElementsByTagName('A');&lt;br /&gt;
	setupTooltipsLoop(anchors, 0, 250, 100, remove, popData);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function defaultPopupsContainer() {&lt;br /&gt;
    if (getValueOf('popupOnlyArticleLinks')) {&lt;br /&gt;
	    return document.getElementById('article') ||&lt;br /&gt;
		    document.getElementById('content') || &lt;br /&gt;
		    document.getElementById('mw_content') || document;&lt;br /&gt;
    }&lt;br /&gt;
    return  document;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setupTooltipsLoop(anchors,begin,howmany,sleep, remove, popData) {&lt;br /&gt;
	log(simplePrintf('setupTooltipsLoop(%s,%s,%s,%s,%s)', arguments));&lt;br /&gt;
	var finish=begin+howmany;&lt;br /&gt;
	var loopend = min(finish, anchors.length);&lt;br /&gt;
	var j=loopend - begin;&lt;br /&gt;
	log ('setupTooltips: anchors.length=' + anchors.length + ', begin=' + begin +&lt;br /&gt;
	     ', howmany=' + howmany + ', loopend=' + loopend + ', remove=' + remove);&lt;br /&gt;
	var doTooltip= remove ? removeTooltip : addTooltip;&lt;br /&gt;
	// try a faster (?) loop construct&lt;br /&gt;
	if (j &amp;gt; 0) {&lt;br /&gt;
		do {&lt;br /&gt;
			var a=anchors[loopend - j];&lt;br /&gt;
			if (!a || !a.href) {&lt;br /&gt;
				log('got null anchor at index ' + loopend - j);&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
			doTooltip(a, popData);&lt;br /&gt;
		} while (--j);&lt;br /&gt;
	}&lt;br /&gt;
	if (finish &amp;lt; anchors.length) {&lt;br /&gt;
		setTimeout(function() {&lt;br /&gt;
				setupTooltipsLoop(anchors,finish,howmany,sleep,remove,popData);},&lt;br /&gt;
			sleep);&lt;br /&gt;
	} else {&lt;br /&gt;
		if ( !remove &amp;amp;&amp;amp; ! getValueOf('popupTocLinks')) { rmTocTooltips(); }&lt;br /&gt;
		pg.flag.finishedLoading=true;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// eliminate popups from the TOC&lt;br /&gt;
// This also kills any onclick stuff that used to be going on in the toc&lt;br /&gt;
function rmTocTooltips() {&lt;br /&gt;
	var toc=document.getElementById('toc');&lt;br /&gt;
	if (toc) {&lt;br /&gt;
		var tocLinks=toc.getElementsByTagName('A');&lt;br /&gt;
		var tocLen = tocLinks.length;&lt;br /&gt;
		for (j=0; j&amp;lt;tocLen; ++j) {&lt;br /&gt;
			removeTooltip(tocLinks[j], true);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function addTooltip(a, popData) {&lt;br /&gt;
	if ( !isPopupLink(a) ) { return; }&lt;br /&gt;
	a.onmouseover=mouseOverWikiLink;&lt;br /&gt;
	a.onmouseout= mouseOutWikiLink;&lt;br /&gt;
	a.onmousedown = killPopup;&lt;br /&gt;
	a.hasPopup = true;&lt;br /&gt;
	a.popData = popData;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function removeTooltip(a) {&lt;br /&gt;
	if ( !a.hasPopup ) { return; }&lt;br /&gt;
	a.onmouseover = null;&lt;br /&gt;
	a.onmouseout = null;&lt;br /&gt;
	if (a.originalTitle) { a.title = a.originalTitle; }&lt;br /&gt;
	a.hasPopup=false;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function removeTitle(a) {&lt;br /&gt;
	if (a.originalTitle) { return; }&lt;br /&gt;
	a.originalTitle=a.title;&lt;br /&gt;
	a.title='';&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function restoreTitle(a) {&lt;br /&gt;
	if ( a.title || !a.originalTitle ) { return; }&lt;br /&gt;
	a.title = a.originalTitle;&lt;br /&gt;
	a.originalTitle='';&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function registerHooks(np) {&lt;br /&gt;
	var popupMaxWidth=getValueOf('popupMaxWidth');&lt;br /&gt;
 &lt;br /&gt;
	if (typeof popupMaxWidth == 'number') {&lt;br /&gt;
		var setMaxWidth = function () {&lt;br /&gt;
			np.mainDiv.style.maxWidth = popupMaxWidth + 'px';&lt;br /&gt;
			np.maxWidth = popupMaxWidth;&lt;br /&gt;
 &lt;br /&gt;
            try {&lt;br /&gt;
				// hack for IE&lt;br /&gt;
				// see http://www.svendtofte.com/code/max_width_in_ie/&lt;br /&gt;
				// use setExpression as documented here on msdn: http://tinyurl dot com/dqljn&lt;br /&gt;
 &lt;br /&gt;
				if (np.mainDiv.style.setExpression) {&lt;br /&gt;
					np.mainDiv.style.setExpression(&lt;br /&gt;
						'width', 'document.body.clientWidth &amp;gt; ' +&lt;br /&gt;
						popupMaxWidth + ' ? &amp;quot;' +popupMaxWidth + 'px&amp;quot;: &amp;quot;auto&amp;quot;');&lt;br /&gt;
				}&lt;br /&gt;
            }&lt;br /&gt;
            catch (errors) {&lt;br /&gt;
            	errlog( &amp;quot;Running on IE8 are we not?: &amp;quot; + errors );&lt;br /&gt;
            }&lt;br /&gt;
		};&lt;br /&gt;
		np.addHook(setMaxWidth, 'unhide', 'before');&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if (window.addPopupShortcuts &amp;amp;&amp;amp; window.rmPopupShortcuts) {&lt;br /&gt;
	    np.addHook(addPopupShortcuts, 'unhide', 'after');&lt;br /&gt;
	    np.addHook(rmPopupShortcuts, 'hide', 'before');&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function mouseOverWikiLink(evt) {&lt;br /&gt;
	if (!window.popupsReady || !window.popupsReady()) { return; }&lt;br /&gt;
	if (!evt &amp;amp;&amp;amp; window.event) {evt=window.event};&lt;br /&gt;
	return mouseOverWikiLink2(this, evt);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function footnoteTarget(a) {&lt;br /&gt;
	var aTitle=Title.fromAnchor(a);&lt;br /&gt;
	// We want &amp;quot;.3A&amp;quot; rather than &amp;quot;%3A&amp;quot; or &amp;quot;?&amp;quot; here, so use the anchor property directly&lt;br /&gt;
	var anch = aTitle.anchor;&lt;br /&gt;
	if ( ! /^(cite_note-|_note-|endnote)/.test(anch) ) { return false;	}&lt;br /&gt;
 &lt;br /&gt;
	var lTitle=Title.fromURL(location.href);&lt;br /&gt;
	if ( lTitle.toString(true) != aTitle.toString(true) ) {	return false; }&lt;br /&gt;
 &lt;br /&gt;
	var el=document.getElementById(anch);&lt;br /&gt;
	while ( el &amp;amp;&amp;amp; typeof el.nodeName == 'string') {&lt;br /&gt;
		var nt = el.nodeName.toLowerCase();&lt;br /&gt;
		if ( nt == 'li' ) { return el; }&lt;br /&gt;
		else if ( nt == 'body' ) { return false; }&lt;br /&gt;
		else if ( el.parentNode ) { el=el.parentNode; }&lt;br /&gt;
		else { return false; }&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function footnotePreview(x, navpop) {&lt;br /&gt;
	setPopupHTML('&amp;lt;hr&amp;gt;' + x.innerHTML, 'popupPreview',  navpop.idNumber,&lt;br /&gt;
		     getValueOf('popupSubpopups') ? function() {&lt;br /&gt;
		setupTooltips(document.getElementById('popupPreview' + navpop.idNumber));&lt;br /&gt;
	} : null);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// var modid=0;&lt;br /&gt;
// if(!window.opera) { window.opera={postError: console.log}; }&lt;br /&gt;
 &lt;br /&gt;
function modifierKeyHandler(a) {&lt;br /&gt;
	return function(evt) {&lt;br /&gt;
		//		opera.postError('modifierKeyHandler called' + (++modid));&lt;br /&gt;
		//		opera.postError(''+evt + modid);&lt;br /&gt;
		//		for (var i in evt) {&lt;br /&gt;
		//			opera.postError('' + modid + ' ' + i + ' ' + evt[i]);&lt;br /&gt;
		//		}&lt;br /&gt;
		//		opera.postError(''+evt.ctrlKey + modid);&lt;br /&gt;
		var mod=getValueOf('popupModifier');&lt;br /&gt;
		if (!mod) { return true; }&lt;br /&gt;
 &lt;br /&gt;
		if (!evt &amp;amp;&amp;amp; window.event) {evt=window.event};&lt;br /&gt;
		//		opera.postError('And now....'+modid);&lt;br /&gt;
		//		opera.postError(''+evt+modid);&lt;br /&gt;
		//		opera.postError(''+evt.ctrlKey+modid);&lt;br /&gt;
 &lt;br /&gt;
		var modPressed = modifierPressed(evt);&lt;br /&gt;
		var action = getValueOf('popupModifierAction');&lt;br /&gt;
 &lt;br /&gt;
		// FIXME: probable bug - modifierPressed should be modPressed below?&lt;br /&gt;
		if ( action == 'disable' &amp;amp;&amp;amp; modifierPressed ) { return true; }&lt;br /&gt;
		if ( action == 'enable' &amp;amp;&amp;amp; !modifierPressed ) { return true; }&lt;br /&gt;
 &lt;br /&gt;
		mouseOverWikiLink2(a, evt);&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function modifierPressed(evt) {&lt;br /&gt;
		var mod=getValueOf('popupModifier');&lt;br /&gt;
		if (!mod) { return false; }&lt;br /&gt;
 &lt;br /&gt;
		if (!evt &amp;amp;&amp;amp; window.event) {evt=window.event};&lt;br /&gt;
//		opera.postError('And now....'+modid);&lt;br /&gt;
//		opera.postError(''+evt+modid);&lt;br /&gt;
//		opera.postError(''+evt.ctrlKey+modid);&lt;br /&gt;
 &lt;br /&gt;
		return ( evt &amp;amp;&amp;amp; mod &amp;amp;&amp;amp; evt[mod.toLowerCase() + 'Key'] );&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function dealWithModifier(a,evt) {&lt;br /&gt;
	if (!getValueOf('popupModifier')) { return false; }&lt;br /&gt;
	var action = getValueOf('popupModifierAction');&lt;br /&gt;
	if ( action == 'enable' &amp;amp;&amp;amp; !modifierPressed(evt) ||&lt;br /&gt;
	     action == 'disable' &amp;amp;&amp;amp; modifierPressed(evt) ) {&lt;br /&gt;
		// if the modifier is needed and not pressed, listen for it until&lt;br /&gt;
		// we mouseout of this link.&lt;br /&gt;
		restoreTitle(a);&lt;br /&gt;
		var addHandler='addEventListener';&lt;br /&gt;
		var rmHandler='removeEventListener';&lt;br /&gt;
		var on='';&lt;br /&gt;
		if (!document.addEventListener) {&lt;br /&gt;
			addHandler='attachEvent';&lt;br /&gt;
			rmHandler='detachEvent';&lt;br /&gt;
			on='on';&lt;br /&gt;
		}&lt;br /&gt;
		if (!document[addHandler]) { // forget it&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		a.modifierKeyHandler=modifierKeyHandler(a);&lt;br /&gt;
 &lt;br /&gt;
		switch (action) {&lt;br /&gt;
		case 'enable':&lt;br /&gt;
			document[addHandler](on+'keydown', a.modifierKeyHandler, false);&lt;br /&gt;
			a[addHandler](on+'mouseout', function() {&lt;br /&gt;
					document[rmHandler](on+'keydown',&lt;br /&gt;
							    a.modifierKeyHandler, false);&lt;br /&gt;
				}, true);&lt;br /&gt;
			break;&lt;br /&gt;
		case 'disable':&lt;br /&gt;
			document[addHandler](on+'keyup', a.modifierKeyHandler, false);&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function mouseOverWikiLink2(a, evt) {&lt;br /&gt;
	if (dealWithModifier(a,evt)) { return; }&lt;br /&gt;
	if ( getValueOf('removeTitles') ) { removeTitle(a); }&lt;br /&gt;
	if ( a==pg.current.link &amp;amp;&amp;amp; a.navpopup &amp;amp;&amp;amp; a.navpopup.isVisible() ) { return; }&lt;br /&gt;
	pg.current.link=a;&lt;br /&gt;
 &lt;br /&gt;
	if (getValueOf('simplePopups') &amp;amp;&amp;amp; pg.option.popupStructure===null) {&lt;br /&gt;
		// reset *default value* of popupStructure&lt;br /&gt;
		setDefault('popupStructure', 'original');&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	var article=(new Title()).fromAnchor(a);&lt;br /&gt;
	// set global variable (ugh) to hold article (wikipage)&lt;br /&gt;
	pg.current.article = article;&lt;br /&gt;
 &lt;br /&gt;
	if (!a.navpopup) {&lt;br /&gt;
		// FIXME: this doesn't behave well if you mouse out of a popup&lt;br /&gt;
		// directly into a link with the same href&lt;br /&gt;
		if (pg.current.linksHash[a.href] &amp;amp;&amp;amp; false) {&lt;br /&gt;
			a.navpopup = pg.current.linksHash[a.href];&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			a.navpopup=newNavpopup(a, article);&lt;br /&gt;
			pg.current.linksHash[a.href] = a.navpopup;&lt;br /&gt;
			pg.current.links.push(a);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (a.navpopup.pending===null || a.navpopup.pending!==0) {&lt;br /&gt;
		// either fresh popups or those with unfinshed business are redone from scratch&lt;br /&gt;
		simplePopupContent(a, article);&lt;br /&gt;
	}&lt;br /&gt;
	a.navpopup.showSoonIfStable(a.navpopup.delay);&lt;br /&gt;
 &lt;br /&gt;
	getValueOf('popupInitialWidth');&lt;br /&gt;
 &lt;br /&gt;
	clearInterval(pg.timer.checkPopupPosition);&lt;br /&gt;
	pg.timer.checkPopupPosition=setInterval(checkPopupPosition, 600);&lt;br /&gt;
 &lt;br /&gt;
	if(getValueOf('simplePopups')) {&lt;br /&gt;
		if (getValueOf('popupPreviewButton') &amp;amp;&amp;amp; !a.simpleNoMore) {&lt;br /&gt;
			var d=document.createElement('div');&lt;br /&gt;
			d.className='popupPreviewButtonDiv';&lt;br /&gt;
			var s=document.createElement('span');&lt;br /&gt;
			d.appendChild(s);&lt;br /&gt;
			s.className='popupPreviewButton';&lt;br /&gt;
			s['on' + getValueOf('popupPreviewButtonEvent')] = function() {&lt;br /&gt;
				a.simpleNoMore=true;&lt;br /&gt;
				nonsimplePopupContent(a,article);&lt;br /&gt;
			}&lt;br /&gt;
			s.innerHTML=popupString('show preview');&lt;br /&gt;
			setPopupHTML(d, 'popupPreview', a.navpopup.idNumber);&lt;br /&gt;
		}&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if (a.navpopup.pending!==0 ) {&lt;br /&gt;
	    nonsimplePopupContent(a, article);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// simplePopupContent: the content that is shown even when simplePopups is true&lt;br /&gt;
function simplePopupContent(a, article) {&lt;br /&gt;
	/* FIXME hack */ a.navpopup.hasPopupMenu=false;&lt;br /&gt;
	a.navpopup.setInnerHTML(popupHTML(a));&lt;br /&gt;
	fillEmptySpans({navpopup:a.navpopup});&lt;br /&gt;
 &lt;br /&gt;
	if (getValueOf('popupDraggable'))&lt;br /&gt;
	{&lt;br /&gt;
		var dragHandle = getValueOf('popupDragHandle') || null;&lt;br /&gt;
		if (dragHandle &amp;amp;&amp;amp; dragHandle != 'all') {&lt;br /&gt;
			dragHandle += a.navpopup.idNumber;&lt;br /&gt;
		}&lt;br /&gt;
		setTimeout(function(){a.navpopup.makeDraggable(dragHandle);}, 150);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if (getValueOf('popupRedlinkRemoval') &amp;amp;&amp;amp; a.className=='new') {&lt;br /&gt;
		setPopupHTML('&amp;lt;br&amp;gt;'+popupRedlinkHTML(article), 'popupRedlink', a.navpopup.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function debugData(navpopup) {&lt;br /&gt;
	if(getValueOf('popupDebugging') &amp;amp;&amp;amp; navpopup.idNumber) {&lt;br /&gt;
		setPopupHTML('idNumber='+navpopup.idNumber + ', pending=' + navpopup.pending,&lt;br /&gt;
			     'popupError', navpopup.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function newNavpopup(a, article) {&lt;br /&gt;
	var navpopup = new Navpopup();&lt;br /&gt;
	navpopup.fuzz=5;&lt;br /&gt;
	navpopup.delay=getValueOf('popupDelay')*1000;&lt;br /&gt;
	// increment global counter now&lt;br /&gt;
	navpopup.idNumber = ++pg.idNumber;&lt;br /&gt;
	navpopup.parentAnchor = a;&lt;br /&gt;
	navpopup.parentPopup = (a.popData &amp;amp;&amp;amp; a.popData.owner);&lt;br /&gt;
	navpopup.article = article;&lt;br /&gt;
	registerHooks(navpopup);&lt;br /&gt;
	return navpopup;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function nonsimplePopupContent(a, article) {&lt;br /&gt;
	var diff=null, history=null;&lt;br /&gt;
	var params=parseParams(a.href);&lt;br /&gt;
	var oldid=(typeof params.oldid=='undefined' ? null : params.oldid);&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if(getValueOf('popupPreviewDiffs') &amp;amp;&amp;amp; window.loadDiff) {&lt;br /&gt;
		diff=params.diff;&lt;br /&gt;
	}&lt;br /&gt;
	if(getValueOf('popupPreviewHistory')) {&lt;br /&gt;
		history=(params.action=='history');&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	a.navpopup.pending=0;&lt;br /&gt;
	var x;&lt;br /&gt;
 &lt;br /&gt;
	if (x=footnoteTarget(a)) {&lt;br /&gt;
		footnotePreview(x, a.navpopup);&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	} else if ( diff || diff === 0 ) {&lt;br /&gt;
		loadDiff(article, oldid, diff, a.navpopup);&lt;br /&gt;
	} else if ( history ) {&lt;br /&gt;
		loadAPIPreview('history', article, a.navpopup);&lt;br /&gt;
	} else if ( pg.re.contribs.test(a.href) ) {&lt;br /&gt;
		loadAPIPreview('contribs', article, a.navpopup);&lt;br /&gt;
	} else if ( pg.re.backlinks.test(a.href) ) {&lt;br /&gt;
		loadAPIPreview('backlinks', article, a.navpopup);&lt;br /&gt;
    } else if ( // FIXME should be able to get all preview combinations with options&lt;br /&gt;
		article.namespace()==pg.ns.image &amp;amp;&amp;amp;&lt;br /&gt;
		( getValueOf('imagePopupsForImages') || ! anchorContainsImage(a) )&lt;br /&gt;
		) {&lt;br /&gt;
		loadAPIPreview('imagepagepreview', article, a.navpopup);&lt;br /&gt;
		loadImage(article, a.navpopup);&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	} else {&lt;br /&gt;
		if (article.namespace() == pg.ns.category &amp;amp;&amp;amp;&lt;br /&gt;
				getValueOf('popupCategoryMembers')) {&lt;br /&gt;
			loadAPIPreview('category', article, a.navpopup);&lt;br /&gt;
		} else if ((article.namespace() == pg.ns.user || article.namespace() == pg.ns.usertalk) &amp;amp;&amp;amp;&lt;br /&gt;
				getValueOf('popupUserInfo')) {&lt;br /&gt;
			loadAPIPreview('userinfo', article, a.navpopup);&lt;br /&gt;
		}&lt;br /&gt;
		startArticlePreview(article, oldid, a.navpopup);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function pendingNavpopTask(navpop) {&lt;br /&gt;
	if (navpop &amp;amp;&amp;amp; navpop.pending===null) { navpop.pending=0; }&lt;br /&gt;
	++navpop.pending;&lt;br /&gt;
	debugData(navpop);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function completedNavpopTask(navpop) {&lt;br /&gt;
	if (navpop &amp;amp;&amp;amp; navpop.pending) { --navpop.pending; }&lt;br /&gt;
	debugData(navpop);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function startArticlePreview(article, oldid, navpop) {&lt;br /&gt;
	navpop.redir=0;&lt;br /&gt;
	loadPreview(article, oldid, navpop);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function loadPreview(article, oldid, navpop) {&lt;br /&gt;
	pendingNavpopTask(navpop);&lt;br /&gt;
	if (!navpop.redir) { navpop.originalArticle=article; }&lt;br /&gt;
	if (!navpop.visible &amp;amp;&amp;amp; getValueOf('popupLazyDownloads')) {&lt;br /&gt;
		var id=(navpop.redir) ? 'DOWNLOAD_PREVIEW_REDIR_HOOK' : 'DOWNLOAD_PREVIEW_HOOK';&lt;br /&gt;
		navpop.addHook(function() {&lt;br /&gt;
				getWiki(article, insertPreview, oldid, navpop);&lt;br /&gt;
				return true; }, 'unhide', 'before', id);&lt;br /&gt;
	} else {&lt;br /&gt;
		getWiki(article, insertPreview, oldid, navpop);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function loadPreviewFromRedir(redirMatch, navpop) {&lt;br /&gt;
	// redirMatch is a regex match&lt;br /&gt;
	var target = new Title().fromWikiText(redirMatch[2]);&lt;br /&gt;
	// overwrite (or add) anchor from original target&lt;br /&gt;
	// mediawiki does overwrite; eg [[User:Lupin/foo3#Done]]&lt;br /&gt;
	if ( navpop.article.anchor ) { target.anchor = navpop.article.anchor; }&lt;br /&gt;
	var trailingRubbish=redirMatch[4];&lt;br /&gt;
	navpop.redir++;&lt;br /&gt;
	navpop.redirTarget=target;&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if (window.redirLink) {&lt;br /&gt;
		var warnRedir = redirLink(target, navpop.article);&lt;br /&gt;
		setPopupHTML(warnRedir, 'popupWarnRedir', navpop.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	navpop.article=target;&lt;br /&gt;
	fillEmptySpans({redir: true, redirTarget: target, navpopup:navpop});&lt;br /&gt;
	return loadPreview(target, null,  navpop);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function insertPreview(download) {&lt;br /&gt;
	if (!download.owner) { return; }&lt;br /&gt;
 &lt;br /&gt;
	var redirMatch = pg.re.redirect.exec(download.data);&lt;br /&gt;
	if (download.owner.redir===0 &amp;amp;&amp;amp; redirMatch) {&lt;br /&gt;
		completedNavpopTask(download.owner);&lt;br /&gt;
		loadPreviewFromRedir(redirMatch, download.owner);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if (download.owner.visible || !getValueOf('popupLazyPreviews')) {&lt;br /&gt;
	    insertPreviewNow(download);&lt;br /&gt;
	} else {&lt;br /&gt;
		var id=(download.owner.redir) ? 'PREVIEW_REDIR_HOOK' : 'PREVIEW_HOOK';&lt;br /&gt;
		download.owner.addHook( function(){insertPreviewNow(download); return true;},&lt;br /&gt;
					'unhide', 'after', id );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function insertPreviewNow(download) {&lt;br /&gt;
	if (!download.owner) { return; }&lt;br /&gt;
	var wikiText=download.data;&lt;br /&gt;
	var navpop=download.owner;&lt;br /&gt;
	completedNavpopTask(navpop);&lt;br /&gt;
	var art=navpop.redirTarget || navpop.originalArticle;&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	makeFixDabs(wikiText, navpop);&lt;br /&gt;
	if (getValueOf('popupSummaryData') &amp;amp;&amp;amp; window.getPageInfo) {&lt;br /&gt;
		var info=getPageInfo(wikiText, download);&lt;br /&gt;
		setPopupTrailer(getPageInfo(wikiText, download), navpop.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	var imagePage='';&lt;br /&gt;
	if (art.namespace()==pg.ns.image) { imagePage=art.toString(); }&lt;br /&gt;
	else { imagePage=getValidImageFromWikiText(wikiText); }&lt;br /&gt;
	if(imagePage) { loadImage(Title.fromWikiText(imagePage), navpop); }&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	if (getValueOf('popupPreviews')) { insertArticlePreview(download, art, navpop); }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function insertArticlePreview(download, art, navpop) {&lt;br /&gt;
	if (download &amp;amp;&amp;amp; typeof download.data == typeof ''){&lt;br /&gt;
		if (art.namespace()==pg.ns.template &amp;amp;&amp;amp; getValueOf('popupPreviewRawTemplates')) {&lt;br /&gt;
			// FIXME compare/consolidate with diff escaping code for wikitext&lt;br /&gt;
			var h='&amp;lt;hr&amp;gt;&amp;lt;tt&amp;gt;' + download.data.entify().split('\\n').join('&amp;lt;br&amp;gt;\\n') + '&amp;lt;/tt&amp;gt;';&lt;br /&gt;
			setPopupHTML(h, 'popupPreview', navpop.idNumber);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			var p=prepPreviewmaker(download.data, art, navpop);&lt;br /&gt;
			p.showPreview();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function prepPreviewmaker(data, article, navpop) {&lt;br /&gt;
	// deal with tricksy anchors&lt;br /&gt;
	var d=anchorize(data, article.anchorString());&lt;br /&gt;
	var urlBase=joinPath([pg.wiki.articlebase, article.urlString()]);&lt;br /&gt;
	var p=new Previewmaker(d, urlBase, navpop);&lt;br /&gt;
	return p;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
// Try to imitate the way mediawiki generates HTML anchors from section titles&lt;br /&gt;
function anchorize(d, anch) {&lt;br /&gt;
	if (!anch) { return d; }&lt;br /&gt;
	var anchRe=RegExp('=+\\s*' + literalizeRegex(anch).replace(/[_ ]/g, '[_ ]') + '\\s*=+');&lt;br /&gt;
	var match=d.match(anchRe);&lt;br /&gt;
	if(match &amp;amp;&amp;amp; match.length &amp;gt; 0 &amp;amp;&amp;amp; match[0]) { return d.substring(d.indexOf(match[0])); }&lt;br /&gt;
 &lt;br /&gt;
	// now try to deal with == foo [[bar|baz]] boom == -&amp;gt; #foo_baz_boom&lt;br /&gt;
	var lines=d.split('\n');&lt;br /&gt;
	for (var i=0; i&amp;lt;lines.length; ++i) {&lt;br /&gt;
		lines[i]=lines[i].replace(RegExp('[[]{2}([^|\\]]*?[|])?(.*?)[\\]]{2}', 'g'), '$2')&lt;br /&gt;
			.replace(/'''([^'])/g, '$1').replace(RegExp(&amp;quot;''([^'])&amp;quot;, 'g'), '$1');&lt;br /&gt;
		if (lines[i].match(anchRe)) {&lt;br /&gt;
			return d.split('\n').slice(i).join('\n').replace(RegExp('^[^=]*'), '');&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return d;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function killPopup() {&lt;br /&gt;
	if (getValueOf('popupShortcutKeys') &amp;amp;&amp;amp; window.rmPopupShortcuts) { rmPopupShortcuts(); }&lt;br /&gt;
	if (!pg) { return; }&lt;br /&gt;
	pg.current.link &amp;amp;&amp;amp; pg.current.link.navpopup &amp;amp;&amp;amp; pg.current.link.navpopup.banish();&lt;br /&gt;
	pg.current.link=null;&lt;br /&gt;
	abortAllDownloads();&lt;br /&gt;
	if (pg.timer.checkPopupPosition !== null) {&lt;br /&gt;
		clearInterval(pg.timer.checkPopupPosition);&lt;br /&gt;
		pg.timer.checkPopupPosition=null;&lt;br /&gt;
	}&lt;br /&gt;
	return true; // preserve default action&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: actions.js&lt;br /&gt;
// STARTFILE: domdrag.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview&lt;br /&gt;
   The {@link Drag} object, which enables objects to be dragged around.&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;pre&amp;gt;&lt;br /&gt;
   *************************************************&lt;br /&gt;
   dom-drag.js&lt;br /&gt;
   09.25.2001&lt;br /&gt;
   www.youngpup.net&lt;br /&gt;
   **************************************************&lt;br /&gt;
   10.28.2001 - fixed minor bug where events&lt;br /&gt;
   sometimes fired off the handle, not the root.&lt;br /&gt;
   *************************************************&lt;br /&gt;
   Pared down, some hooks added by [[User:Lupin]]&lt;br /&gt;
 &lt;br /&gt;
   Copyright Aaron Boodman.&lt;br /&gt;
   Saying stupid things daily since March 2001.&lt;br /&gt;
   &amp;lt;/pre&amp;gt;&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Drag object. This is used to make various DOM elements draggable.&lt;br /&gt;
   @constructor&lt;br /&gt;
*/&lt;br /&gt;
function Drag () {&lt;br /&gt;
	/**&lt;br /&gt;
	   Condition to determine whether or not to drag. This function should take one parameter, an Event.&lt;br /&gt;
	   To disable this, set it to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
	   @type Function&lt;br /&gt;
	*/&lt;br /&gt;
	this.startCondition = null;&lt;br /&gt;
	/**&lt;br /&gt;
	   Hook to be run when the drag finishes. This is passed the final coordinates of&lt;br /&gt;
	   the dragged object (two integers, x and y). To disables this, set it to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
	   @type Function&lt;br /&gt;
	*/&lt;br /&gt;
	this.endHook = null;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Gets an event in a cross-browser manner.&lt;br /&gt;
   @param {Event} e&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.fixE = function(e) {&lt;br /&gt;
	if (typeof e == 'undefined') { e = window.event; }&lt;br /&gt;
	if (typeof e.layerX == 'undefined') { e.layerX = e.offsetX; }&lt;br /&gt;
	if (typeof e.layerY == 'undefined') { e.layerY = e.offsetY; }&lt;br /&gt;
	return e;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Initialises the Drag instance by telling it which object you want to be draggable, and what you want to drag it by.&lt;br /&gt;
   @param {DOMElement} o The &amp;quot;handle&amp;quot; by which &amp;lt;code&amp;gt;oRoot&amp;lt;/code&amp;gt; is dragged.&lt;br /&gt;
   @param {DOMElement} oRoot The object which moves when &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; is dragged, or &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; if omitted.&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.init = function(o, oRoot) {&lt;br /&gt;
	var dragObj      = this;&lt;br /&gt;
	this.obj = o;&lt;br /&gt;
	o.onmousedown    = function(e) { dragObj.start.apply( dragObj, [e]); };&lt;br /&gt;
	o.dragging       = false;&lt;br /&gt;
	o.popups_draggable      = true;&lt;br /&gt;
	o.hmode          = true;&lt;br /&gt;
	o.vmode          = true;&lt;br /&gt;
 &lt;br /&gt;
	o.root = oRoot &amp;amp;&amp;amp; oRoot !== null ? oRoot : o ;&lt;br /&gt;
 &lt;br /&gt;
	if (isNaN(parseInt(o.root.style.left, 10))) { o.root.style.left   = &amp;quot;0px&amp;quot;; }&lt;br /&gt;
	if (isNaN(parseInt(o.root.style.top,  10))) { o.root.style.top    = &amp;quot;0px&amp;quot;; }&lt;br /&gt;
 &lt;br /&gt;
	o.root.onthisStart  = function(){};&lt;br /&gt;
	o.root.onthisEnd    = function(){};&lt;br /&gt;
	o.root.onthis       = function(){};&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Starts the drag.&lt;br /&gt;
   @private&lt;br /&gt;
   @param {Event} e&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.start = function(e) {&lt;br /&gt;
	var o = this.obj; // = this;&lt;br /&gt;
	e = this.fixE(e);&lt;br /&gt;
	if (this.startCondition &amp;amp;&amp;amp; !this.startCondition(e)) { return; }&lt;br /&gt;
	var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom, 10);&lt;br /&gt;
	var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right,  10);&lt;br /&gt;
	o.root.onthisStart(x, y);&lt;br /&gt;
 &lt;br /&gt;
	o.lastMouseX    = e.clientX;&lt;br /&gt;
	o.lastMouseY    = e.clientY;&lt;br /&gt;
 &lt;br /&gt;
	var dragObj      = this;&lt;br /&gt;
	o.onmousemoveDefault    = document.onmousemove;&lt;br /&gt;
	o.dragging              = true;&lt;br /&gt;
	document.onmousemove    = function(e) { dragObj.drag.apply( dragObj, [e] ); };&lt;br /&gt;
	document.onmouseup      = function(e) { dragObj.end.apply( dragObj, [e] ); };&lt;br /&gt;
	return false;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Does the drag.&lt;br /&gt;
   @param {Event} e&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.drag = function(e) {&lt;br /&gt;
	e = this.fixE(e);&lt;br /&gt;
	var o = this.obj;&lt;br /&gt;
 &lt;br /&gt;
	var ey    = e.clientY;&lt;br /&gt;
	var ex    = e.clientX;&lt;br /&gt;
	var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom, 10);&lt;br /&gt;
	var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right,  10 );&lt;br /&gt;
	var nx, ny;&lt;br /&gt;
 &lt;br /&gt;
	nx = x + ((ex - o.lastMouseX) * (o.hmode ? 1 : -1));&lt;br /&gt;
	ny = y + ((ey - o.lastMouseY) * (o.vmode ? 1 : -1));&lt;br /&gt;
 &lt;br /&gt;
	this.obj.root.style[o.hmode ? &amp;quot;left&amp;quot; : &amp;quot;right&amp;quot;] = nx + &amp;quot;px&amp;quot;;&lt;br /&gt;
	this.obj.root.style[o.vmode ? &amp;quot;top&amp;quot; : &amp;quot;bottom&amp;quot;] = ny + &amp;quot;px&amp;quot;;&lt;br /&gt;
	this.obj.lastMouseX    = ex;&lt;br /&gt;
	this.obj.lastMouseY    = ey;&lt;br /&gt;
 &lt;br /&gt;
	this.obj.root.onthis(nx, ny);&lt;br /&gt;
	return false;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Ends the drag.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.end = function()  {&lt;br /&gt;
	document.onmousemove=this.obj.onmousemoveDefault;&lt;br /&gt;
	document.onmouseup   = null;&lt;br /&gt;
	this.obj.dragging    = false;&lt;br /&gt;
	if (this.endHook) {&lt;br /&gt;
		this.endHook( parseInt(this.obj.root.style[this.obj.hmode ? &amp;quot;left&amp;quot; : &amp;quot;right&amp;quot;], 10),&lt;br /&gt;
			      parseInt(this.obj.root.style[this.obj.vmode ? &amp;quot;top&amp;quot; : &amp;quot;bottom&amp;quot;], 10));&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
// ENDFILE: domdrag.js&lt;br /&gt;
// STARTFILE: structures.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
pg.structures.original={};&lt;br /&gt;
pg.structures.original.popupLayout=function () {&lt;br /&gt;
	return ['popupError', 'popupImage', 'popupTopLinks', 'popupTitle',&lt;br /&gt;
		'popupData', 'popupOtherLinks',&lt;br /&gt;
		'popupRedir', ['popupWarnRedir', 'popupRedirTopLinks',&lt;br /&gt;
			       'popupRedirTitle', 'popupRedirData', 'popupRedirOtherLinks'],&lt;br /&gt;
		'popupMiscTools', ['popupRedlink'],&lt;br /&gt;
		'popupPrePreviewSep', 'popupPreview', 'popupSecondPreview', 'popupPreviewMore', 'popupPostPreview', 'popupFixDab'];&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupRedirSpans=function () {&lt;br /&gt;
	return ['popupRedir', 'popupWarnRedir', 'popupRedirTopLinks',&lt;br /&gt;
		'popupRedirTitle', 'popupRedirData', 'popupRedirOtherLinks'];&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupTitle=function (x) {&lt;br /&gt;
	log ('defaultstructure.popupTitle');&lt;br /&gt;
	if (!getValueOf('popupNavLinks')) {&lt;br /&gt;
		return navlinkStringToHTML('&amp;lt;b&amp;gt;&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;',x.article,x.params);&lt;br /&gt;
	}&lt;br /&gt;
	return '';&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupTopLinks=function (x) {&lt;br /&gt;
	log ('defaultstructure.popupTopLinks');&lt;br /&gt;
	if (getValueOf('popupNavLinks')) { return navLinksHTML(x.article, x.hint, x.params); }&lt;br /&gt;
	return '';&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupImage=function(x) {&lt;br /&gt;
	log ('original.popupImage, x.article='+x.article+', x.navpop.idNumber='+x.navpop.idNumber);&lt;br /&gt;
	return imageHTML(x.article, x.navpop.idNumber);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupRedirTitle=pg.structures.original.popupTitle;&lt;br /&gt;
pg.structures.original.popupRedirTopLinks=pg.structures.original.popupTopLinks;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function copyStructure(oldStructure, newStructure) {&lt;br /&gt;
	pg.structures[newStructure]={};&lt;br /&gt;
	for (var prop in pg.structures[oldStructure]) {&lt;br /&gt;
		pg.structures[newStructure][prop]=pg.structures[oldStructure][prop];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
copyStructure('original', 'nostalgia');&lt;br /&gt;
pg.structures.nostalgia.popupTopLinks=function(x)  {&lt;br /&gt;
	var str='';&lt;br /&gt;
	str += '&amp;lt;b&amp;gt;&amp;lt;&amp;lt;mainlink|shortcut= &amp;gt;&amp;gt;&amp;lt;/b&amp;gt;';&lt;br /&gt;
 &lt;br /&gt;
	// user links&lt;br /&gt;
	// contribs - log - count - email - block&lt;br /&gt;
	// count only if applicable; block only if popupAdminLinks&lt;br /&gt;
	str += 'if(user){&amp;lt;br&amp;gt;&amp;lt;&amp;lt;contribs|shortcut=c&amp;gt;&amp;gt;';&lt;br /&gt;
	str+='if(wikimedia){*&amp;lt;&amp;lt;count|shortcut=#&amp;gt;&amp;gt;}';&lt;br /&gt;
	str+='if(ipuser){}else{*&amp;lt;&amp;lt;email|shortcut=E&amp;gt;&amp;gt;}if(admin){*&amp;lt;&amp;lt;block|shortcut=b&amp;gt;&amp;gt;}}';&lt;br /&gt;
 &lt;br /&gt;
	// editing links&lt;br /&gt;
	// talkpage   -&amp;gt; edit|new - history - un|watch - article|edit&lt;br /&gt;
	// other page -&amp;gt; edit - history - un|watch - talk|edit|new&lt;br /&gt;
	var editstr='&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;';&lt;br /&gt;
	var editOldidStr='if(oldid){&amp;lt;&amp;lt;editOld|shortcut=e&amp;gt;&amp;gt;|&amp;lt;&amp;lt;revert|shortcut=v|rv&amp;gt;&amp;gt;|&amp;lt;&amp;lt;edit|cur&amp;gt;&amp;gt;}else{'&lt;br /&gt;
	+ editstr + '}'&lt;br /&gt;
	var historystr='&amp;lt;&amp;lt;history|shortcut=h&amp;gt;&amp;gt;';&lt;br /&gt;
	var watchstr='&amp;lt;&amp;lt;unwatch|unwatchShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;watch|shortcut=w|watchThingy&amp;gt;&amp;gt;';&lt;br /&gt;
 &lt;br /&gt;
	str+='&amp;lt;br&amp;gt;if(talk){' +&lt;br /&gt;
		editOldidStr+'|&amp;lt;&amp;lt;new|shortcut=+&amp;gt;&amp;gt;' + '*' + historystr+'*'+watchstr + '*' +&lt;br /&gt;
		'&amp;lt;b&amp;gt;&amp;lt;&amp;lt;article|shortcut=a&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;|&amp;lt;&amp;lt;editArticle|edit&amp;gt;&amp;gt;' +&lt;br /&gt;
		'}else{' + // not a talk page&lt;br /&gt;
		editOldidStr + '*' + historystr + '*' + watchstr + '*' +&lt;br /&gt;
		'&amp;lt;b&amp;gt;&amp;lt;&amp;lt;talk|shortcut=t&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;|&amp;lt;&amp;lt;editTalk|edit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;newTalk|shortcut=+|new&amp;gt;&amp;gt;'&lt;br /&gt;
		+ '}';&lt;br /&gt;
 &lt;br /&gt;
	// misc links&lt;br /&gt;
	str += '&amp;lt;br&amp;gt;&amp;lt;&amp;lt;whatLinksHere|shortcut=l&amp;gt;&amp;gt;*&amp;lt;&amp;lt;relatedChanges|shortcut=r&amp;gt;&amp;gt;';&lt;br /&gt;
	str += 'if(admin){&amp;lt;br&amp;gt;}else{*}&amp;lt;&amp;lt;move|shortcut=m&amp;gt;&amp;gt;';&lt;br /&gt;
 &lt;br /&gt;
	// admin links&lt;br /&gt;
	str += 'if(admin){*&amp;lt;&amp;lt;unprotect|unprotectShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protect|shortcut=p&amp;gt;&amp;gt;*' +&lt;br /&gt;
	'&amp;lt;&amp;lt;undelete|undeleteShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;delete|shortcut=d&amp;gt;&amp;gt;}';&lt;br /&gt;
	return navlinkStringToHTML(str, x.article, x.params);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.nostalgia.popupRedirTopLinks=pg.structures.nostalgia.popupTopLinks;&lt;br /&gt;
 &lt;br /&gt;
/** -- fancy -- **/&lt;br /&gt;
copyStructure('original', 'fancy');&lt;br /&gt;
pg.structures.fancy.popupTitle=function (x) {&lt;br /&gt;
	return navlinkStringToHTML('&amp;lt;font size=+0&amp;gt;&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;&amp;lt;/font&amp;gt;',x.article,x.params);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.fancy.popupTopLinks=function(x) {&lt;br /&gt;
	var hist='&amp;lt;&amp;lt;history|shortcut=h|hist&amp;gt;&amp;gt;|&amp;lt;&amp;lt;lastEdit|shortcut=/|last&amp;gt;&amp;gt;if(mainspace_en){|&amp;lt;&amp;lt;editors|shortcut=E|eds&amp;gt;&amp;gt;}';&lt;br /&gt;
	var watch='&amp;lt;&amp;lt;unwatch|unwatchShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;watch|shortcut=w|watchThingy&amp;gt;&amp;gt;';&lt;br /&gt;
	var move='&amp;lt;&amp;lt;move|shortcut=m|move&amp;gt;&amp;gt;';&lt;br /&gt;
	return navlinkStringToHTML('if(talk){' +&lt;br /&gt;
				   '&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;|&amp;lt;&amp;lt;new|shortcut=+|+&amp;gt;&amp;gt;*' + hist + '*' +&lt;br /&gt;
				   '&amp;lt;&amp;lt;article|shortcut=a&amp;gt;&amp;gt;|&amp;lt;&amp;lt;editArticle|edit&amp;gt;&amp;gt;' + '*' + watch + '*' + move +&lt;br /&gt;
				   '}else{&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;*' + hist +&lt;br /&gt;
				   '*&amp;lt;&amp;lt;talk|shortcut=t|&amp;gt;&amp;gt;|&amp;lt;&amp;lt;editTalk|edit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;newTalk|shortcut=+|new&amp;gt;&amp;gt;' +&lt;br /&gt;
				   '*' + watch + '*' + move+'}&amp;lt;br&amp;gt;', x.article, x.params);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.fancy.popupOtherLinks=function(x) {&lt;br /&gt;
	var admin='&amp;lt;&amp;lt;unprotect|unprotectShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protect|shortcut=p&amp;gt;&amp;gt;*&amp;lt;&amp;lt;undelete|undeleteShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;delete|shortcut=d|del&amp;gt;&amp;gt;';&lt;br /&gt;
	var user='&amp;lt;&amp;lt;contribs|shortcut=c&amp;gt;&amp;gt;if(wikimedia){|&amp;lt;&amp;lt;count|shortcut=#|#&amp;gt;&amp;gt;}';&lt;br /&gt;
	user+='if(ipuser){|&amp;lt;&amp;lt;arin&amp;gt;&amp;gt;}else{*&amp;lt;&amp;lt;email|shortcut=E|'+&lt;br /&gt;
	popupString('email')+'&amp;gt;&amp;gt;}if(admin){*&amp;lt;&amp;lt;block|shortcut=b&amp;gt;&amp;gt;}';&lt;br /&gt;
 &lt;br /&gt;
	var normal='&amp;lt;&amp;lt;whatLinksHere|shortcut=l|links here&amp;gt;&amp;gt;*&amp;lt;&amp;lt;relatedChanges|shortcut=r|related&amp;gt;&amp;gt;';&lt;br /&gt;
	return navlinkStringToHTML('&amp;lt;br&amp;gt;if(user){' + user + '*}if(admin){'+admin+'if(user){&amp;lt;br&amp;gt;}else{*}}' + normal,&lt;br /&gt;
				   x.article, x.params);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.fancy.popupRedirTitle=pg.structures.fancy.popupTitle;&lt;br /&gt;
pg.structures.fancy.popupRedirTopLinks=pg.structures.fancy.popupTopLinks;&lt;br /&gt;
pg.structures.fancy.popupRedirOtherLinks=pg.structures.fancy.popupOtherLinks;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/** -- fancy2 -- **/&lt;br /&gt;
// hack for [[User:MacGyverMagic]]&lt;br /&gt;
copyStructure('fancy', 'fancy2');&lt;br /&gt;
pg.structures.fancy2.popupTopLinks=function(x) { // hack out the &amp;lt;br&amp;gt; at the end and put one at the beginning&lt;br /&gt;
	return '&amp;lt;br&amp;gt;'+pg.structures.fancy.popupTopLinks(x).replace(RegExp('&amp;lt;br&amp;gt;$','i'),'');&lt;br /&gt;
};&lt;br /&gt;
pg.structures.fancy2.popupLayout=function () { // move toplinks to after the title&lt;br /&gt;
	return ['popupError', 'popupImage', 'popupTitle', 'popupData', 'popupTopLinks', 'popupOtherLinks',&lt;br /&gt;
		'popupRedir', ['popupWarnRedir', 'popupRedirTopLinks', 'popupRedirTitle', 'popupRedirData', 'popupRedirOtherLinks'],&lt;br /&gt;
		'popupMiscTools', ['popupRedlink'],&lt;br /&gt;
		'popupPrePreviewSep', 'popupPreview', 'popupSecondPreview', 'popupPreviewMore', 'popupPostPreview', 'popupFixDab'];&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/** -- menus -- **/&lt;br /&gt;
copyStructure('original', 'menus');&lt;br /&gt;
pg.structures.menus.popupLayout=function () {&lt;br /&gt;
	return ['popupError', 'popupImage', 'popupTopLinks', 'popupTitle', 'popupOtherLinks',&lt;br /&gt;
		'popupRedir', ['popupWarnRedir', 'popupRedirTopLinks', 'popupRedirTitle', 'popupRedirData', 'popupRedirOtherLinks'],&lt;br /&gt;
		'popupData', 'popupMiscTools', ['popupRedlink'],&lt;br /&gt;
		'popupPrePreviewSep', 'popupPreview', 'popupSecondPreview', 'popupPreviewMore', 'popupPostPreview', 'popupFixDab'];&lt;br /&gt;
};&lt;br /&gt;
function toggleSticky(uid) {&lt;br /&gt;
	var popDiv=document.getElementById('navpopup_maindiv'+uid);&lt;br /&gt;
	if (!popDiv) { return; }&lt;br /&gt;
	if (!popDiv.navpopup.sticky) { popDiv.navpopup.stick(); }&lt;br /&gt;
	else {&lt;br /&gt;
		popDiv.navpopup.unstick();&lt;br /&gt;
		popDiv.navpopup.hide();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
pg.structures.menus.popupTopLinks = function (x, shorter) {&lt;br /&gt;
	// FIXME maybe this stuff should be cached&lt;br /&gt;
	var s=[];&lt;br /&gt;
	var dropdiv='&amp;lt;div class=&amp;quot;popup_drop&amp;quot;&amp;gt;';&lt;br /&gt;
	var enddiv='&amp;lt;/div&amp;gt;';&lt;br /&gt;
	var endspan='&amp;lt;/span&amp;gt;';&lt;br /&gt;
	var hist='&amp;lt;&amp;lt;history|shortcut=h&amp;gt;&amp;gt;';&lt;br /&gt;
	if (!shorter) { hist = '&amp;lt;menurow&amp;gt;' + hist +&lt;br /&gt;
			'|&amp;lt;&amp;lt;historyfeed|rss&amp;gt;&amp;gt;if(mainspace_en){|&amp;lt;&amp;lt;editors|shortcut=E&amp;gt;&amp;gt;}&amp;lt;/menurow&amp;gt;'; }&lt;br /&gt;
	var lastedit='&amp;lt;&amp;lt;lastEdit|shortcut=/|show last edit&amp;gt;&amp;gt;';&lt;br /&gt;
	var jsHistory='&amp;lt;&amp;lt;lastContrib|last set of edits&amp;gt;&amp;gt;&amp;lt;&amp;lt;sinceMe|changes since mine&amp;gt;&amp;gt;';&lt;br /&gt;
	var linkshere='&amp;lt;&amp;lt;whatLinksHere|shortcut=l|what links here&amp;gt;&amp;gt;';&lt;br /&gt;
	var related='&amp;lt;&amp;lt;relatedChanges|shortcut=r|related changes&amp;gt;&amp;gt;';&lt;br /&gt;
	var search='&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;search|shortcut=s&amp;gt;&amp;gt;if(wikimedia){|&amp;lt;&amp;lt;globalsearch|shortcut=g|global&amp;gt;&amp;gt;}' +&lt;br /&gt;
	'|&amp;lt;&amp;lt;google|shortcut=G|web&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;';&lt;br /&gt;
	var watch='&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;unwatch|unwatchShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;watch|shortcut=w|watchThingy&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;';&lt;br /&gt;
	var protect='&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;unprotect|unprotectShort&amp;gt;&amp;gt;|' +&lt;br /&gt;
	'&amp;lt;&amp;lt;protect|shortcut=p&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protectlog|log&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;';&lt;br /&gt;
	var del='&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;undelete|undeleteShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;delete|shortcut=d&amp;gt;&amp;gt;|' +&lt;br /&gt;
	'&amp;lt;&amp;lt;deletelog|log&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;';&lt;br /&gt;
	var move='&amp;lt;&amp;lt;move|shortcut=m|move page&amp;gt;&amp;gt;';&lt;br /&gt;
	var nullPurge='&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;nullEdit|shortcut=n|null edit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;purge|shortcut=P&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;';&lt;br /&gt;
	var viewOptions='&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;view|shortcut=v&amp;gt;&amp;gt;|&amp;lt;&amp;lt;render|shortcut=S&amp;gt;&amp;gt;|&amp;lt;&amp;lt;raw&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;';&lt;br /&gt;
	var editRow='if(oldid){' +&lt;br /&gt;
	'&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;|&amp;lt;&amp;lt;editOld|shortcut=e|this&amp;amp;nbsp;revision&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;' +&lt;br /&gt;
	'&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;revert|shortcut=v&amp;gt;&amp;gt;|&amp;lt;&amp;lt;undo&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;' + '}else{&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;}';&lt;br /&gt;
	var markPatrolled='if(rcid){&amp;lt;&amp;lt;markpatrolled|mark patrolled&amp;gt;&amp;gt;}';&lt;br /&gt;
	var newTopic='if(talk){&amp;lt;&amp;lt;new|shortcut=+|new topic&amp;gt;&amp;gt;}';&lt;br /&gt;
	var protectDelete='if(admin){' + protect + del + '}';&lt;br /&gt;
 &lt;br /&gt;
	if (getValueOf('popupActionsMenu')) {&lt;br /&gt;
		s.push( '&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;*' + dropdiv + menuTitle('actions'));&lt;br /&gt;
	} else {&lt;br /&gt;
		s.push( dropdiv + '&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;');&lt;br /&gt;
	}&lt;br /&gt;
	s.push( '&amp;lt;menu&amp;gt;')&lt;br /&gt;
	s.push( editRow + markPatrolled + newTopic + hist + lastedit )&lt;br /&gt;
	if (!shorter) { s.push(jsHistory); }&lt;br /&gt;
	s.push( move + linkshere + related)&lt;br /&gt;
	if (!shorter) { s.push(nullPurge + search); }&lt;br /&gt;
	if (!shorter) { s.push(viewOptions); }&lt;br /&gt;
	s.push('&amp;lt;hr&amp;gt;' + watch + protectDelete);&lt;br /&gt;
	s.push('&amp;lt;hr&amp;gt;' +&lt;br /&gt;
	       'if(talk){&amp;lt;&amp;lt;article|shortcut=a|view article&amp;gt;&amp;gt;&amp;lt;&amp;lt;editArticle|edit article&amp;gt;&amp;gt;}' +&lt;br /&gt;
	       'else{&amp;lt;&amp;lt;talk|shortcut=t|talk page&amp;gt;&amp;gt;&amp;lt;&amp;lt;editTalk|edit talk&amp;gt;&amp;gt;' +&lt;br /&gt;
	       '&amp;lt;&amp;lt;newTalk|shortcut=+|new topic&amp;gt;&amp;gt;}&amp;lt;/menu&amp;gt;' + enddiv);&lt;br /&gt;
 &lt;br /&gt;
	// user menu starts here&lt;br /&gt;
	var email='&amp;lt;&amp;lt;email|shortcut=E|email user&amp;gt;&amp;gt;';&lt;br /&gt;
	var contribs=	'if(wikimedia){&amp;lt;menurow&amp;gt;}&amp;lt;&amp;lt;contribs|shortcut=c|contributions&amp;gt;&amp;gt;if(wikimedia){&amp;lt;/menurow&amp;gt;}' +&lt;br /&gt;
	'if(admin){&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;deletedContribs&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;}';&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	s.push('if(user){*' + dropdiv + menuTitle('user'));&lt;br /&gt;
	s.push('&amp;lt;menu&amp;gt;'); +&lt;br /&gt;
	s.push('&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;userPage|shortcut=u|user&amp;amp;nbsp;page&amp;gt;&amp;gt;|&amp;lt;&amp;lt;userSpace|space&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;');&lt;br /&gt;
	s.push('&amp;lt;&amp;lt;userTalk|shortcut=t|user talk&amp;gt;&amp;gt;&amp;lt;&amp;lt;editUserTalk|edit user talk&amp;gt;&amp;gt;' +&lt;br /&gt;
	       '&amp;lt;&amp;lt;newUserTalk|shortcut=+|leave comment&amp;gt;&amp;gt;');&lt;br /&gt;
	if(!shorter) { s.push( 'if(ipuser){&amp;lt;&amp;lt;arin&amp;gt;&amp;gt;}else{' + email + '}') }&lt;br /&gt;
	else { s.push( 'if(ipuser){}else{' + email + '}') }&lt;br /&gt;
	s.push('&amp;lt;hr&amp;gt;' + contribs + '&amp;lt;&amp;lt;userlog|shortcut=L|user log&amp;gt;&amp;gt;');&lt;br /&gt;
	s.push('if(wikimedia){&amp;lt;&amp;lt;count|shortcut=#|edit counter&amp;gt;&amp;gt;}');&lt;br /&gt;
	s.push('if(admin){&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;unblock|unblockShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;block|shortcut=b|block user&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;}');&lt;br /&gt;
	s.push('&amp;lt;&amp;lt;blocklog|shortcut=B|block log&amp;gt;&amp;gt;' + getValueOf('popupExtraUserMenu'));&lt;br /&gt;
	s.push('&amp;lt;/menu&amp;gt;'  + enddiv + '}');&lt;br /&gt;
 &lt;br /&gt;
	// popups menu starts here&lt;br /&gt;
	if (getValueOf('popupSetupMenu') &amp;amp;&amp;amp; !x.navpop.hasPopupMenu /* FIXME: hack */) {&lt;br /&gt;
		x.navpop.hasPopupMenu=true;&lt;br /&gt;
		s.push('*' + dropdiv + menuTitle('popupsMenu') + '&amp;lt;menu&amp;gt;');&lt;br /&gt;
		s.push('&amp;lt;&amp;lt;togglePreviews|toggle previews&amp;gt;&amp;gt;');&lt;br /&gt;
		s.push('&amp;lt;&amp;lt;purgePopups|reset&amp;gt;&amp;gt;');&lt;br /&gt;
		s.push('&amp;lt;&amp;lt;disablePopups|disable&amp;gt;&amp;gt;');&lt;br /&gt;
		s.push('&amp;lt;/menu&amp;gt;'+enddiv);&lt;br /&gt;
	}&lt;br /&gt;
	return navlinkStringToHTML(s.join(''), x.article, x.params);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
function menuTitle(s) {&lt;br /&gt;
	return '&amp;lt;a href=&amp;quot;#&amp;quot; noPopup=1&amp;gt;' + popupString(s) + '&amp;lt;/a&amp;gt;';&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
pg.structures.menus.popupRedirTitle=pg.structures.menus.popupTitle;&lt;br /&gt;
pg.structures.menus.popupRedirTopLinks=pg.structures.menus.popupTopLinks;&lt;br /&gt;
 &lt;br /&gt;
copyStructure('menus', 'shortmenus');&lt;br /&gt;
pg.structures.shortmenus.popupTopLinks=function(x) {&lt;br /&gt;
	return pg.structures.menus.popupTopLinks(x,true);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.shortmenus.popupRedirTopLinks=pg.structures.shortmenus.popupTopLinks;&lt;br /&gt;
 &lt;br /&gt;
copyStructure('shortmenus', 'dabshortmenus');&lt;br /&gt;
pg.structures.dabshortmenus.popupLayout=function () {&lt;br /&gt;
	return ['popupError', 'popupImage', 'popupTopLinks', 'popupTitle', 'popupOtherLinks',&lt;br /&gt;
		'popupRedir', ['popupWarnRedir', 'popupRedirTopLinks', 'popupRedirTitle', 'popupRedirData', 'popupRedirOtherLinks'],&lt;br /&gt;
		'popupData', 'popupMiscTools', ['popupRedlink'], 'popupFixDab',&lt;br /&gt;
		'popupPrePreviewSep', 'popupPreview', 'popupSecondPreview', 'popupPreviewMore', 'popupPostPreview'];&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
copyStructure('menus', 'dabmenus');&lt;br /&gt;
pg.structures.dabmenus.popupLayout=pg.structures.dabshortmenus.popupLayout;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
pg.structures.lite={};&lt;br /&gt;
pg.structures.lite.popupLayout=function () {&lt;br /&gt;
	return ['popupTitle', 'popupPreview' ];&lt;br /&gt;
};&lt;br /&gt;
pg.structures.lite.popupTitle=function (x) {&lt;br /&gt;
	log (x.article + ': structures.lite.popupTitle');&lt;br /&gt;
	//return navlinkStringToHTML('&amp;lt;b&amp;gt;&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;',x.article,x.params);&lt;br /&gt;
	return '&amp;lt;div&amp;gt;&amp;lt;span class=&amp;quot;popup_mainlink&amp;quot;&amp;gt;&amp;lt;b&amp;gt;' + x.article.toString() + '&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;';&lt;br /&gt;
};&lt;br /&gt;
// ENDFILE: structures.js&lt;br /&gt;
// STARTFILE: autoedit.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function getParamValue(paramName, h) {&lt;br /&gt;
	if (typeof h == 'undefined' ) { h = document.location.href; }&lt;br /&gt;
	var cmdRe=RegExp('[&amp;amp;?]'+paramName+'=([^&amp;amp;]*)');&lt;br /&gt;
	var m=cmdRe.exec(h);&lt;br /&gt;
	if (m) {&lt;br /&gt;
		try {&lt;br /&gt;
			return decodeURIComponent(m[1]);&lt;br /&gt;
		} catch (someError) {}&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function substitute(data,cmdBody) {&lt;br /&gt;
	// alert('sub\nfrom: '+cmdBody.from+'\nto: '+cmdBody.to+'\nflags: '+cmdBody.flags);&lt;br /&gt;
	var fromRe=RegExp(cmdBody.from, cmdBody.flags);&lt;br /&gt;
	return data.replace(fromRe, cmdBody.to);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function execCmds(data, cmdList) {&lt;br /&gt;
	for (var i=0; i&amp;lt;cmdList.length; ++i) {&lt;br /&gt;
		data=cmdList[i].action(data, cmdList[i]);&lt;br /&gt;
	}&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function parseCmd(str) {&lt;br /&gt;
	// returns a list of commands&lt;br /&gt;
	if (!str.length) { return []; }&lt;br /&gt;
	var p=false;&lt;br /&gt;
	switch (str.charAt(0)) {&lt;br /&gt;
	case 's':&lt;br /&gt;
		p=parseSubstitute(str);&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	if (p) { return [p].concat(parseCmd(p.remainder)); }&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function unEscape(str, sep) {&lt;br /&gt;
	return str.split('\\\\').join('\\').split('\\'+sep).join(sep).split('\\n').join('\n');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function parseSubstitute(str) {&lt;br /&gt;
	// takes a string like s/a/b/flags;othercmds and parses it&lt;br /&gt;
 &lt;br /&gt;
	var from,to,flags,tmp;&lt;br /&gt;
 &lt;br /&gt;
	if (str.length&amp;lt;4) { return false; }&lt;br /&gt;
	var sep=str.charAt(1);&lt;br /&gt;
	str=str.substring(2);&lt;br /&gt;
 &lt;br /&gt;
	tmp=skipOver(str,sep);&lt;br /&gt;
	if (tmp) { from=tmp.segment; str=tmp.remainder; }&lt;br /&gt;
	else { return false; }&lt;br /&gt;
 &lt;br /&gt;
	tmp=skipOver(str,sep);&lt;br /&gt;
	if (tmp) { to=tmp.segment; str=tmp.remainder; }&lt;br /&gt;
	else { return false; }&lt;br /&gt;
 &lt;br /&gt;
	flags='';&lt;br /&gt;
	if (str.length) {&lt;br /&gt;
		tmp=skipOver(str,';') || skipToEnd(str, ';');&lt;br /&gt;
		if (tmp) {flags=tmp.segment; str=tmp.remainder; }&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	return {action: substitute, from: from, to: to, flags: flags, remainder: str};&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function skipOver(str,sep) {&lt;br /&gt;
	var endSegment=findNext(str,sep);&lt;br /&gt;
	if (endSegment&amp;lt;0) { return false; }&lt;br /&gt;
	var segment=unEscape(str.substring(0,endSegment), sep);&lt;br /&gt;
	return {segment: segment, remainder: str.substring(endSegment+1)};&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function skipToEnd(str,sep) {&lt;br /&gt;
	return {segment: str, remainder: ''};&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function findNext(str, ch) {&lt;br /&gt;
	for (var i=0; i&amp;lt;str.length; ++i) {&lt;br /&gt;
		if (str.charAt(i)=='\\') { i+=2; }&lt;br /&gt;
		if (str.charAt(i)==ch) { return i; }&lt;br /&gt;
	}&lt;br /&gt;
	return -1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setCheckbox(param, box) {&lt;br /&gt;
	var val=getParamValue(param);&lt;br /&gt;
	if (val!==null) {&lt;br /&gt;
		switch (val) {&lt;br /&gt;
		case '1': case 'yes': case 'true':&lt;br /&gt;
			box.checked=true;&lt;br /&gt;
			break;&lt;br /&gt;
		case '0': case 'no':  case 'false':&lt;br /&gt;
			box.checked=false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function autoEdit() {&lt;br /&gt;
	if (!setupPopups.completed) { setupPopups(); }&lt;br /&gt;
	if (!document.editform || !window.wgEnableAPI || !wgEnableAPI ) { return false; }&lt;br /&gt;
	if (window.autoEdit.alreadyRan) { return false; }&lt;br /&gt;
	window.autoEdit.alreadyRan=true;&lt;br /&gt;
	var cmdString=getParamValue('autoedit');&lt;br /&gt;
	if (cmdString) {&lt;br /&gt;
		try {&lt;br /&gt;
			var editbox=document.editform.wpTextbox1;&lt;br /&gt;
		} catch (dang) { return; }&lt;br /&gt;
		var cmdList=parseCmd(cmdString);&lt;br /&gt;
		var input=editbox.value;&lt;br /&gt;
		var output=execCmds(input, cmdList);&lt;br /&gt;
		editbox.value=output;&lt;br /&gt;
		// wikEd user script compatibility&lt;br /&gt;
		if (typeof(wikEdUseWikEd) != 'undefined') {&lt;br /&gt;
			if (wikEdUseWikEd == true) {&lt;br /&gt;
				WikEdUpdateFrame();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	setCheckbox('autominor', document.editform.wpMinoredit);&lt;br /&gt;
	setCheckbox('autowatch', document.editform.wpWatchthis);&lt;br /&gt;
 &lt;br /&gt;
	var rvid = getParamValue('autorv');&lt;br /&gt;
	if (rvid) {&lt;br /&gt;
		var url=pg.wiki.apiwikibase + '?action=query&amp;amp;format=json&amp;amp;prop=revisions&amp;amp;revids='+rvid;&lt;br /&gt;
		startDownload(url, null, autoEdit2);&lt;br /&gt;
	} else { autoEdit2(); }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function autoEdit2(d) {&lt;br /&gt;
	var summary=getParamValue('autosummary');&lt;br /&gt;
	var summaryprompt=getParamValue('autosummaryprompt');&lt;br /&gt;
	var summarynotice='';&lt;br /&gt;
	if (d &amp;amp;&amp;amp; d.data &amp;amp;&amp;amp; getParamValue('autorv')) {&lt;br /&gt;
		var s = getRvSummary(summary, d.data);&lt;br /&gt;
		if (s===false) {&lt;br /&gt;
			summaryprompt=true;&lt;br /&gt;
			summarynotice=popupString('Failed to get revision information, please edit manually.\n\n');&lt;br /&gt;
			summary = simplePrintf(summary, [getParamValue('autorv'), '(unknown)', '(unknown)']);&lt;br /&gt;
		} else { summary = s; }&lt;br /&gt;
	}&lt;br /&gt;
	if (summaryprompt) {&lt;br /&gt;
		var txt= summarynotice +&lt;br /&gt;
			popupString('Enter a non-empty edit summary or press cancel to abort');&lt;br /&gt;
		var response=prompt(txt, summary);&lt;br /&gt;
		if (response) { summary=response; }&lt;br /&gt;
		else { return; }&lt;br /&gt;
	}&lt;br /&gt;
	if (summary) { document.editform.wpSummary.value=summary; }&lt;br /&gt;
	// Attempt to avoid possible premature clicking of the save button&lt;br /&gt;
	// (maybe delays in updates to the DOM are to blame?? or a red herring)&lt;br /&gt;
	setTimeout(autoEdit3, 100);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function autoClickToken() {&lt;br /&gt;
    return document.cookie.substr(document.cookie.indexOf(&amp;quot;session=&amp;quot;)+8,4);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function autoEdit3() {&lt;br /&gt;
    if( getParamValue('actoken') != autoClickToken()) return;&lt;br /&gt;
 &lt;br /&gt;
	var btn=getParamValue('autoclick');&lt;br /&gt;
	if (btn) {&lt;br /&gt;
		if (document.editform &amp;amp;&amp;amp; document.editform[btn]) {&lt;br /&gt;
			var button=document.editform[btn];&lt;br /&gt;
			var msg=tprintf('The %s button has been automatically clicked. Please wait for the next page to load.',&lt;br /&gt;
					[ button.value ]);&lt;br /&gt;
			bannerMessage(msg);&lt;br /&gt;
			document.title='('+document.title+')';&lt;br /&gt;
			button.click();&lt;br /&gt;
		} else {&lt;br /&gt;
			alert(tprintf('Could not find button %s. Please check the settings in your javascript file.',&lt;br /&gt;
				      [ btn ]));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function bannerMessage(s) {&lt;br /&gt;
	var headings=document.getElementsByTagName('h1');&lt;br /&gt;
	if (headings) {&lt;br /&gt;
		var div=document.createElement('div');&lt;br /&gt;
		div.innerHTML='&amp;lt;font size=+1&amp;gt;&amp;lt;b&amp;gt;' + s + '&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;';&lt;br /&gt;
		headings[0].parentNode.insertBefore(div, headings[0]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getRvSummary(template, json) {&lt;br /&gt;
	try {&lt;br /&gt;
	    var o=getJsObj(json);&lt;br /&gt;
	    var edit = anyChild(o.query.pages).revisions[0];&lt;br /&gt;
	} catch (badness) {return false;}&lt;br /&gt;
	var timestamp = edit.timestamp.split(/[A-Z]/g).join(' ').replace(/^ *| *$/g, '');&lt;br /&gt;
	return simplePrintf(template, [edit.revid, timestamp, edit.user]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: autoedit.js&lt;br /&gt;
// STARTFILE: downloader.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview&lt;br /&gt;
   {@link Downloader}, a xmlhttprequest wrapper, and helper functions.&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Downloader&lt;br /&gt;
   @constructor&lt;br /&gt;
   @class The Downloader class. Create a new instance of this class to download stuff.&lt;br /&gt;
   @param {String} url The url to download. This can be omitted and supplied later.&lt;br /&gt;
*/&lt;br /&gt;
function Downloader(url) {&lt;br /&gt;
	// Source: http://jibbering.com/2002/4/httprequest.html&lt;br /&gt;
	/** xmlhttprequest object which we're wrapping */&lt;br /&gt;
	this.http = false;&lt;br /&gt;
 &lt;br /&gt;
	/*@cc_on @*/&lt;br /&gt;
	/*@if (@_jscript_version &amp;gt;= 5)&lt;br /&gt;
	// JScript gives us Conditional compilation,&lt;br /&gt;
	// we can cope with old IE versions.&lt;br /&gt;
	// and security blocked creation of the objects.&lt;br /&gt;
	try {&lt;br /&gt;
	this.http = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;
	} catch (e) {&lt;br /&gt;
	try {&lt;br /&gt;
	this.http = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
	} catch (E) {&lt;br /&gt;
	// this.http = false;&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
	@end @*/&lt;br /&gt;
 &lt;br /&gt;
	if (! this.http &amp;amp;&amp;amp; typeof XMLHttpRequest!='undefined') { this.http = new XMLHttpRequest(); }&lt;br /&gt;
	/**&lt;br /&gt;
	    The url to download&lt;br /&gt;
	    @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.url = url;&lt;br /&gt;
	/**&lt;br /&gt;
	    A universally unique ID number&lt;br /&gt;
	    @type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.id=null;&lt;br /&gt;
	/**&lt;br /&gt;
	    Modification date, to be culled from the incoming headers&lt;br /&gt;
	    @type Date&lt;br /&gt;
	    @private&lt;br /&gt;
	*/&lt;br /&gt;
	this.lastModified = null;&lt;br /&gt;
	/**&lt;br /&gt;
	    What to do when the download completes successfully&lt;br /&gt;
	    @type Function&lt;br /&gt;
	    @private&lt;br /&gt;
	*/&lt;br /&gt;
	this.callbackFunction = null;&lt;br /&gt;
	/**&lt;br /&gt;
	    What to do on failure&lt;br /&gt;
	    @type Function&lt;br /&gt;
	    @private&lt;br /&gt;
	*/&lt;br /&gt;
	this.onFailure = null;&lt;br /&gt;
	/**&lt;br /&gt;
	    Flag set on &amp;lt;code&amp;gt;abort&amp;lt;/code&amp;gt;&lt;br /&gt;
	    @type boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.aborted = false;&lt;br /&gt;
	/**&lt;br /&gt;
	   HTTP method. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html for possibilities.&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.method='GET';&lt;br /&gt;
	/**&lt;br /&gt;
	    Async flag.&lt;br /&gt;
	    @type boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.async=true;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
new Downloader();&lt;br /&gt;
 &lt;br /&gt;
/** Submits the http request. */&lt;br /&gt;
Downloader.prototype.send = function (x) {&lt;br /&gt;
	if (!this.http) { return null; }&lt;br /&gt;
	return this.http.send(x);&lt;br /&gt;
};&lt;br /&gt;
/** Aborts the download, setting the &amp;lt;code&amp;gt;aborted&amp;lt;/code&amp;gt; field to true.  */&lt;br /&gt;
Downloader.prototype.abort = function () {&lt;br /&gt;
	if (!this.http) { return null; }&lt;br /&gt;
	this.aborted=true;&lt;br /&gt;
	return this.http.abort();&lt;br /&gt;
};&lt;br /&gt;
/** Returns the downloaded data. */&lt;br /&gt;
Downloader.prototype.getData = function () {if (!this.http) { return null; } return this.http.responseText;};&lt;br /&gt;
/** Prepares the download. */&lt;br /&gt;
Downloader.prototype.setTarget = function () {&lt;br /&gt;
	if (!this.http) { return null; }&lt;br /&gt;
	this.http.open(this.method, this.url, this.async);&lt;br /&gt;
};&lt;br /&gt;
/** Gets the state of the download. */&lt;br /&gt;
Downloader.prototype.getReadyState=function () {if (!this.http) { return null; } return this.http.readyState;};&lt;br /&gt;
 &lt;br /&gt;
pg.misc.downloadsInProgress = { };&lt;br /&gt;
 &lt;br /&gt;
/** Starts the download.&lt;br /&gt;
    Note that setTarget {@link Downloader#setTarget} must be run first&lt;br /&gt;
*/&lt;br /&gt;
Downloader.prototype.start=function () {&lt;br /&gt;
	if (!this.http) { return; }&lt;br /&gt;
	pg.misc.downloadsInProgress[this.id] = this;&lt;br /&gt;
	this.http.send(null);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/** Gets the 'Last-Modified' date from the download headers.&lt;br /&gt;
    Should be run after the download completes.&lt;br /&gt;
    Returns &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; on failure.&lt;br /&gt;
    @return {Date}&lt;br /&gt;
*/&lt;br /&gt;
Downloader.prototype.getLastModifiedDate=function () {&lt;br /&gt;
	if(!this.http) { return null; }&lt;br /&gt;
	var lastmod=null;&lt;br /&gt;
	try {&lt;br /&gt;
		lastmod=this.http.getResponseHeader('Last-Modified');&lt;br /&gt;
	} catch (err) {}&lt;br /&gt;
	if (lastmod) { return new Date(lastmod); }&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/** Sets the callback function.&lt;br /&gt;
    @param {Function} f callback function, called as &amp;lt;code&amp;gt;f(this)&amp;lt;/code&amp;gt; on success&lt;br /&gt;
*/&lt;br /&gt;
Downloader.prototype.setCallback = function (f) {&lt;br /&gt;
	if(!this.http) { return; }&lt;br /&gt;
	this.http.onreadystatechange = f;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
Downloader.prototype.getStatus = function() { if (!this.http) { return null; } return this.http.status; };&lt;br /&gt;
 &lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// helper functions&lt;br /&gt;
 &lt;br /&gt;
/** Creates a new {@link Downloader} and prepares it for action.&lt;br /&gt;
    @param {String} url The url to download&lt;br /&gt;
    @param {integer} id The ID of the {@link Downloader} object&lt;br /&gt;
    @param {Function} callback The callback function invoked on success&lt;br /&gt;
    @return {String/Downloader} the {@link Downloader} object created, or 'ohdear' if an unsupported browser&lt;br /&gt;
*/&lt;br /&gt;
function newDownload(url, id, callback, onfailure) {&lt;br /&gt;
	var d=new Downloader(url);&lt;br /&gt;
	if (!d.http) { return 'ohdear'; }&lt;br /&gt;
	d.id=id;&lt;br /&gt;
	d.setTarget();&lt;br /&gt;
	if (!onfailure) {&lt;br /&gt;
		onfailure=2;&lt;br /&gt;
	}&lt;br /&gt;
	var f = function () {&lt;br /&gt;
		if (d.getReadyState() == 4) {&lt;br /&gt;
			delete pg.misc.downloadsInProgress[this.id];&lt;br /&gt;
			try {&lt;br /&gt;
				if ( d.getStatus() == 200 ) {&lt;br /&gt;
					d.data=d.getData();&lt;br /&gt;
					d.lastModified=d.getLastModifiedDate();&lt;br /&gt;
					callback(d);&lt;br /&gt;
				} else if (typeof onfailure == typeof 1) {&lt;br /&gt;
					if (onfailure &amp;gt; 0) {&lt;br /&gt;
						// retry&lt;br /&gt;
						newDownload(url, id, callback, onfailure - 1);&lt;br /&gt;
					}&lt;br /&gt;
				} else if (typeof onfailure == 'function') {&lt;br /&gt;
					onfailure(d,url,id,callback);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (somerr) { /* ignore it */ }&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	d.setCallback(f);&lt;br /&gt;
	return d;&lt;br /&gt;
}&lt;br /&gt;
/** Simulates a download from cached data.&lt;br /&gt;
    The supplied data is put into a {@link Downloader} as if it had downloaded it.&lt;br /&gt;
    @param {String} url The url.&lt;br /&gt;
    @param {integer} id The ID.&lt;br /&gt;
    @param {Function} callback The callback, which is invoked immediately as &amp;lt;code&amp;gt;callback(d)&amp;lt;/code&amp;gt;,&lt;br /&gt;
    where &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; is the new {@link Downloader}.&lt;br /&gt;
    @param {String} data The (cached) data.&lt;br /&gt;
    @param {Date} lastModified The (cached) last modified date.&lt;br /&gt;
*/&lt;br /&gt;
function fakeDownload(url, id, callback, data, lastModified, owner) {&lt;br /&gt;
	var d=newDownload(url,callback);&lt;br /&gt;
	d.owner=owner;&lt;br /&gt;
	d.id=id; d.data=data;&lt;br /&gt;
	d.lastModified=lastModified;&lt;br /&gt;
	return callback(d);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Starts a download.&lt;br /&gt;
   @param {String} url The url to download&lt;br /&gt;
   @param {integer} id The ID of the {@link Downloader} object&lt;br /&gt;
   @param {Function} callback The callback function invoked on success&lt;br /&gt;
   @return {String/Downloader} the {@link Downloader} object created, or 'ohdear' if an unsupported browser&lt;br /&gt;
*/&lt;br /&gt;
function startDownload(url, id, callback) {&lt;br /&gt;
	var d=newDownload(url, id, callback);&lt;br /&gt;
	if (typeof d == typeof '' ) { return d; }&lt;br /&gt;
	d.start();&lt;br /&gt;
	return d;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Aborts all downloads which have been started.&lt;br /&gt;
*/&lt;br /&gt;
function abortAllDownloads() {&lt;br /&gt;
	for ( var x in pg.misc.downloadsInProgress ) {&lt;br /&gt;
		try {&lt;br /&gt;
			pg.misc.downloadsInProgress[x].aborted=true;&lt;br /&gt;
			pg.misc.downloadsInProgress[x].abort();&lt;br /&gt;
			delete pg.misc.downloadsInProgress[x];&lt;br /&gt;
		} catch (e) { }&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: downloader.js&lt;br /&gt;
// STARTFILE: livepreview.js&lt;br /&gt;
// TODO: location is often not correct (eg relative links in previews)&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * InstaView - a Mediawiki to HTML converter in JavaScript&lt;br /&gt;
 * Version 0.6.1&lt;br /&gt;
 * Copyright (C) Pedro Fayolle 2005-2006&lt;br /&gt;
 * http://en.wikipedia.org/wiki/User:Pilaf&lt;br /&gt;
 * Distributed under the BSD license&lt;br /&gt;
 *&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 *&lt;br /&gt;
 * 0.6.1&lt;br /&gt;
 * - Fixed problem caused by \r characters&lt;br /&gt;
 * - Improved inline formatting parser&lt;br /&gt;
 *&lt;br /&gt;
 * 0.6&lt;br /&gt;
 * - Changed name to InstaView&lt;br /&gt;
 * - Some major code reorganizations and factored out some common functions&lt;br /&gt;
 * - Handled conversion of relative links (i.e. [[/foo]])&lt;br /&gt;
 * - Fixed misrendering of adjacent definition list items&lt;br /&gt;
 * - Fixed bug in table headings handling&lt;br /&gt;
 * - Changed date format in signatures to reflect Mediawiki's&lt;br /&gt;
 * - Fixed handling of [[:Image:...]]&lt;br /&gt;
 * - Updated MD5 function (hopefully it will work with UTF-8)&lt;br /&gt;
 * - Fixed bug in handling of links inside images&lt;br /&gt;
 *&lt;br /&gt;
 * To do:&lt;br /&gt;
 * - Better support for &amp;lt;math&amp;gt;&lt;br /&gt;
 * - Full support for &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 * - Parser-based (as opposed to RegExp-based) inline wikicode handling (make it one-pass and bullet-proof)&lt;br /&gt;
 * - Support for templates (through AJAX)&lt;br /&gt;
 * - Support for coloured links (AJAX)&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
var Insta = {}&lt;br /&gt;
 &lt;br /&gt;
function setupLivePreview() {&lt;br /&gt;
 &lt;br /&gt;
    // options&lt;br /&gt;
    Insta.conf =&lt;br /&gt;
	{&lt;br /&gt;
	    baseUrl: '',&lt;br /&gt;
 &lt;br /&gt;
	    user: {},&lt;br /&gt;
 &lt;br /&gt;
	    wiki: {&lt;br /&gt;
		lang: pg.wiki.lang,&lt;br /&gt;
		interwiki: pg.wiki.interwiki,&lt;br /&gt;
		default_thumb_width: 180&lt;br /&gt;
	    },&lt;br /&gt;
 &lt;br /&gt;
	    paths: {&lt;br /&gt;
		articles: pg.wiki.articlePath + '/',&lt;br /&gt;
		// Only used for Insta previews with images. (not in popups)&lt;br /&gt;
		math: '/math/',&lt;br /&gt;
		images: '//upload.wikimedia.org/wikipedia/en/', // FIXME ( window.getImageUrlStart ? getImageUrlStart(pg.wiki.hostname) : ''),&lt;br /&gt;
		images_fallback: '//upload.wikimedia.org/wikipedia/commons/',&lt;br /&gt;
		magnify_icon: 'skins/common/images/magnify-clip.png'&lt;br /&gt;
	    },&lt;br /&gt;
 &lt;br /&gt;
	    locale: {&lt;br /&gt;
		user: pg.ns.user,&lt;br /&gt;
		image: pg.ns.image,&lt;br /&gt;
		category: pg.ns.category,&lt;br /&gt;
		// shouldn't be used in popup previews, i think&lt;br /&gt;
		months: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
    // options with default values or backreferences&lt;br /&gt;
    with (Insta.conf) {&lt;br /&gt;
	user.name = user.name || 'Wikipedian'&lt;br /&gt;
	user.signature = '[['+locale.user+':'+user.name+'|'+user.name+']]'&lt;br /&gt;
	//paths.images = '//upload.wikimedia.org/wikipedia/' + wiki.lang + '/'&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // define constants&lt;br /&gt;
    Insta.BLOCK_IMAGE = new RegExp('^\\[\\[(?:File|Image|'+Insta.conf.locale.image+&lt;br /&gt;
				       '):.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)', 'i');&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Insta.dump = function(from, to)&lt;br /&gt;
{&lt;br /&gt;
	if (typeof from == 'string') from = document.getElementById(from)&lt;br /&gt;
	if (typeof to == 'string') to = document.getElementById(to)&lt;br /&gt;
	to.innerHTML = this.convert(from.value)&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Insta.convert = function(wiki)&lt;br /&gt;
{&lt;br /&gt;
	var	ll = (typeof wiki == 'string')? wiki.replace(/\r/g,'').split(/\n/): wiki, // lines of wikicode&lt;br /&gt;
		o='',	// output&lt;br /&gt;
		p=0,	// para flag&lt;br /&gt;
		$r	// result of passing a regexp to $()&lt;br /&gt;
 &lt;br /&gt;
	// some shorthands&lt;br /&gt;
	function remain() { return ll.length }&lt;br /&gt;
	function sh() { return ll.shift() } // shift&lt;br /&gt;
	function ps(s) { o+=s } // push&lt;br /&gt;
 &lt;br /&gt;
	function f() // similar to C's printf, uses ? as placeholders, ?? to escape question marks&lt;br /&gt;
	{&lt;br /&gt;
		var i=1,a=arguments,f=a[0],o='',c,p&lt;br /&gt;
		for (;i&amp;lt;a.length; i++) if ((p=f.indexOf('?'))+1) {&lt;br /&gt;
			// allow character escaping&lt;br /&gt;
			i -= c=f.charAt(p+1)=='?'?1:0&lt;br /&gt;
			o += f.substring(0,p)+(c?'?':a[i])&lt;br /&gt;
			f=f.substr(p+1+c)&lt;br /&gt;
		} else break;&lt;br /&gt;
		return o+f&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function html_entities(s) { return s.replace(/&amp;amp;/g,&amp;quot;&amp;amp;amp;&amp;quot;).replace(/&amp;lt;/g,&amp;quot;&amp;amp;lt;&amp;quot;).replace(/&amp;gt;/g,&amp;quot;&amp;amp;gt;&amp;quot;) }&lt;br /&gt;
 &lt;br /&gt;
	function max(a,b) { return (a&amp;gt;b)?a:b }&lt;br /&gt;
	function min(a,b) { return (a&amp;lt;b)?a:b }&lt;br /&gt;
 &lt;br /&gt;
	// return the first non matching character position between two strings&lt;br /&gt;
	function str_imatch(a, b)&lt;br /&gt;
	{&lt;br /&gt;
		for (var i=0, l=min(a.length, b.length); i&amp;lt;l; i++) if (a.charAt(i)!=b.charAt(i)) break&lt;br /&gt;
		return i&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// compare current line against a string or regexp&lt;br /&gt;
	// if passed a string it will compare only the first string.length characters&lt;br /&gt;
	// if passed a regexp the result is stored in $r&lt;br /&gt;
	function $(c) { return (typeof c == 'string') ? (ll[0].substr(0,c.length)==c) : ($r = ll[0].match(c)) }&lt;br /&gt;
 &lt;br /&gt;
	function $$(c) { return ll[0]==c } // compare current line against a string&lt;br /&gt;
	function _(p) { return ll[0].charAt(p) } // return char at pos p&lt;br /&gt;
 &lt;br /&gt;
	function endl(s) { ps(s); sh() }&lt;br /&gt;
 &lt;br /&gt;
	function parse_list()&lt;br /&gt;
	{&lt;br /&gt;
		var prev='';&lt;br /&gt;
 &lt;br /&gt;
		while (remain() &amp;amp;&amp;amp; $(/^([*#:;]+)(.*)$/)) {&lt;br /&gt;
 &lt;br /&gt;
			var l_match = $r&lt;br /&gt;
 &lt;br /&gt;
			sh()&lt;br /&gt;
 &lt;br /&gt;
			var ipos = str_imatch(prev, l_match[1])&lt;br /&gt;
 &lt;br /&gt;
			// close uncontinued lists&lt;br /&gt;
			for (var i=prev.length-1; i &amp;gt;= ipos; i--) {&lt;br /&gt;
 &lt;br /&gt;
				var pi = prev.charAt(i)&lt;br /&gt;
 &lt;br /&gt;
				if (pi=='*') ps('&amp;lt;/ul&amp;gt;')&lt;br /&gt;
				else if (pi=='#') ps('&amp;lt;/ol&amp;gt;')&lt;br /&gt;
				// close a dl only if the new item is not a dl item (:, ; or empty)&lt;br /&gt;
				else switch (l_match[1].charAt(i)) { case'':case'*':case'#': ps('&amp;lt;/dl&amp;gt;') }&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			// open new lists&lt;br /&gt;
			for (var i=ipos; i&amp;lt;l_match[1].length; i++) {&lt;br /&gt;
 &lt;br /&gt;
				var li = l_match[1].charAt(i)&lt;br /&gt;
 &lt;br /&gt;
				if (li=='*') ps('&amp;lt;ul&amp;gt;')&lt;br /&gt;
				else if (li=='#') ps('&amp;lt;ol&amp;gt;')&lt;br /&gt;
				// open a new dl only if the prev item is not a dl item (:, ; or empty)&lt;br /&gt;
				else switch(prev.charAt(i)) { case'':case'*':case'#': ps('&amp;lt;dl&amp;gt;') }&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			switch (l_match[1].charAt(l_match[1].length-1)) {&lt;br /&gt;
 &lt;br /&gt;
				case '*': case '#':&lt;br /&gt;
					ps('&amp;lt;li&amp;gt;' + parse_inline_nowiki(l_match[2])); break&lt;br /&gt;
 &lt;br /&gt;
				case ';':&lt;br /&gt;
					ps('&amp;lt;dt&amp;gt;')&lt;br /&gt;
 &lt;br /&gt;
					var dt_match&lt;br /&gt;
 &lt;br /&gt;
					// handle ;dt :dd format&lt;br /&gt;
					if (dt_match = l_match[2].match(/(.*?)(:.*?)$/)) {&lt;br /&gt;
 &lt;br /&gt;
						ps(parse_inline_nowiki(dt_match[1]))&lt;br /&gt;
						ll.unshift(dt_match[2])&lt;br /&gt;
 &lt;br /&gt;
					} else ps(parse_inline_nowiki(l_match[2]))&lt;br /&gt;
 &lt;br /&gt;
					break&lt;br /&gt;
 &lt;br /&gt;
				case ':':&lt;br /&gt;
					ps('&amp;lt;dd&amp;gt;' + parse_inline_nowiki(l_match[2]))&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			prev=l_match[1]&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		// close remaining lists&lt;br /&gt;
		for (var i=prev.length-1; i&amp;gt;=0; i--)&lt;br /&gt;
			ps(f('&amp;lt;/?&amp;gt;', (prev.charAt(i)=='*')? 'ul': ((prev.charAt(i)=='#')? 'ol': 'dl')))&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function parse_table()&lt;br /&gt;
	{&lt;br /&gt;
		endl(f('&amp;lt;table?&amp;gt;', $(/^\{\|( .*)$/)? $r[1]: ''))&lt;br /&gt;
 &lt;br /&gt;
		for (;remain();) if ($('|')) switch (_(1)) {&lt;br /&gt;
			case '}': endl('&amp;lt;/table&amp;gt;'); return&lt;br /&gt;
			case '-': endl(f('&amp;lt;tr ?&amp;gt;', $(/\|-*(.*)/)[1])); break&lt;br /&gt;
			default: parse_table_data()&lt;br /&gt;
		}&lt;br /&gt;
		else if ($('!')) parse_table_data()&lt;br /&gt;
		else sh()&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function parse_table_data()&lt;br /&gt;
	{&lt;br /&gt;
		var td_line, match_i&lt;br /&gt;
 &lt;br /&gt;
		// 1: &amp;quot;|+&amp;quot;, '|' or '+'&lt;br /&gt;
		// 2: ??&lt;br /&gt;
		// 3: attributes ??&lt;br /&gt;
		// TODO: finish commenting this regexp&lt;br /&gt;
		var td_match = sh().match(/^(\|\+|\||!)((?:([^[|]*?)\|(?!\|))?(.*))$/)&lt;br /&gt;
 &lt;br /&gt;
		if (td_match[1] == '|+') ps('&amp;lt;caption');&lt;br /&gt;
		else ps('&amp;lt;t' + ((td_match[1]=='|')?'d':'h'))&lt;br /&gt;
 &lt;br /&gt;
		if (typeof td_match[3] != 'undefined') {&lt;br /&gt;
 &lt;br /&gt;
			ps(' ' + td_match[3])&lt;br /&gt;
			match_i = 4&lt;br /&gt;
 &lt;br /&gt;
		} else match_i = 2&lt;br /&gt;
 &lt;br /&gt;
		ps('&amp;gt;')&lt;br /&gt;
 &lt;br /&gt;
		if (td_match[1] != '|+') {&lt;br /&gt;
 &lt;br /&gt;
			// use || or !! as a cell separator depending on context&lt;br /&gt;
			// NOTE: when split() is passed a regexp make sure to use non-capturing brackets&lt;br /&gt;
			td_line = td_match[match_i].split((td_match[1] == '|')? '||': /(?:\|\||!!)/)&lt;br /&gt;
 &lt;br /&gt;
			ps(parse_inline_nowiki(td_line.shift()))&lt;br /&gt;
 &lt;br /&gt;
			while (td_line.length) ll.unshift(td_match[1] + td_line.pop())&lt;br /&gt;
 &lt;br /&gt;
		} else ps(td_match[match_i])&lt;br /&gt;
 &lt;br /&gt;
		var tc = 0, td = []&lt;br /&gt;
 &lt;br /&gt;
		for (;remain(); td.push(sh()))&lt;br /&gt;
		if ($('|')) {&lt;br /&gt;
			if (!tc) break // we're at the outer-most level (no nested tables), skip to td parse&lt;br /&gt;
			else if (_(1)=='}') tc--&lt;br /&gt;
		}&lt;br /&gt;
		else if (!tc &amp;amp;&amp;amp; $('!')) break&lt;br /&gt;
		else if ($('{|')) tc++&lt;br /&gt;
 &lt;br /&gt;
		if (td.length) ps(Insta.convert(td))&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function parse_pre()&lt;br /&gt;
	{&lt;br /&gt;
		ps('&amp;lt;pre&amp;gt;')&lt;br /&gt;
		do endl(parse_inline_nowiki(ll[0].substring(1)) + &amp;quot;\n&amp;quot;); while (remain() &amp;amp;&amp;amp; $(' '))&lt;br /&gt;
		ps('&amp;lt;/pre&amp;gt;')&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function parse_block_image()&lt;br /&gt;
	{&lt;br /&gt;
		ps(parse_image(sh()))&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function parse_image(str)&lt;br /&gt;
	{&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		// get what's in between &amp;quot;[[Image:&amp;quot; and &amp;quot;]]&amp;quot;&lt;br /&gt;
		var tag = str.substring(str.indexOf(':') + 1, str.length - 2);&lt;br /&gt;
 &lt;br /&gt;
		var width;&lt;br /&gt;
		var attr = [], filename, caption = '';&lt;br /&gt;
		var thumb=0, frame=0, center=0;&lt;br /&gt;
		var align='';&lt;br /&gt;
 &lt;br /&gt;
		if (tag.match(/\|/)) {&lt;br /&gt;
			// manage nested links&lt;br /&gt;
			var nesting = 0;&lt;br /&gt;
			var last_attr;&lt;br /&gt;
			for (var i = tag.length-1; i &amp;gt; 0; i--) {&lt;br /&gt;
				if (tag.charAt(i) == '|' &amp;amp;&amp;amp; !nesting) {&lt;br /&gt;
					last_attr = tag.substr(i+1);&lt;br /&gt;
					tag = tag.substring(0, i);&lt;br /&gt;
					break;&lt;br /&gt;
				} else switch (tag.substr(i-1, 2)) {&lt;br /&gt;
					case ']]':&lt;br /&gt;
						nesting++;&lt;br /&gt;
						i--;&lt;br /&gt;
						break;&lt;br /&gt;
					case '[[':&lt;br /&gt;
						nesting--;&lt;br /&gt;
						i--;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			attr = tag.split(/\s*\|\s*/);&lt;br /&gt;
			attr.push(last_attr);&lt;br /&gt;
			filename = attr.shift();&lt;br /&gt;
 &lt;br /&gt;
			var w_match;&lt;br /&gt;
 &lt;br /&gt;
			for (;attr.length; attr.shift())&lt;br /&gt;
			if (w_match = attr[0].match(/^(\d*)(?:[px]*\d*)?px$/)) width = w_match[1]&lt;br /&gt;
			else switch(attr[0]) {&lt;br /&gt;
				case 'thumb':&lt;br /&gt;
				case 'thumbnail':&lt;br /&gt;
					thumb=true;&lt;br /&gt;
				case 'frame':&lt;br /&gt;
					frame=true;&lt;br /&gt;
					break;&lt;br /&gt;
				case 'none':&lt;br /&gt;
				case 'right':&lt;br /&gt;
				case 'left':&lt;br /&gt;
					center=false;&lt;br /&gt;
					align=attr[0];&lt;br /&gt;
					break;&lt;br /&gt;
				case 'center':&lt;br /&gt;
					center=true;&lt;br /&gt;
					align='none';&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					if (attr.length == 1) caption = attr[0];&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
		} else filename = tag;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
		var o='';&lt;br /&gt;
 &lt;br /&gt;
		if (frame) {&lt;br /&gt;
 &lt;br /&gt;
			if (align=='') align = 'right';&lt;br /&gt;
 &lt;br /&gt;
			o += f(&amp;quot;&amp;lt;div class='thumb t?'&amp;gt;&amp;quot;, align);&lt;br /&gt;
 &lt;br /&gt;
			if (thumb) {&lt;br /&gt;
				if (!width) width = Insta.conf.wiki.default_thumb_width;&lt;br /&gt;
 &lt;br /&gt;
				o += f(&amp;quot;&amp;lt;div style='width:?px;'&amp;gt;?&amp;quot;, 2+width*1, make_image(filename, caption, width)) +&lt;br /&gt;
					f(&amp;quot;&amp;lt;div class='thumbcaption'&amp;gt;&amp;lt;div class='magnify' style='float:right'&amp;gt;&amp;lt;a href='?' class='internal' title='Enlarge'&amp;gt;&amp;lt;img src='?'&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;?&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
						Insta.conf.paths.articles + Insta.conf.locale.image + ':' + filename,&lt;br /&gt;
						Insta.conf.paths.magnify_icon,&lt;br /&gt;
						parse_inline_nowiki(caption)&lt;br /&gt;
					)&lt;br /&gt;
			} else {&lt;br /&gt;
				o += '&amp;lt;div&amp;gt;' + make_image(filename, caption) + f(&amp;quot;&amp;lt;div class='thumbcaption'&amp;gt;?&amp;lt;/div&amp;gt;&amp;quot;, parse_inline_nowiki(caption))&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			o += '&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';&lt;br /&gt;
 &lt;br /&gt;
		} else if (align != '') {&lt;br /&gt;
			o += f(&amp;quot;&amp;lt;div class='float?'&amp;gt;&amp;lt;span&amp;gt;?&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;, align, make_image(filename, caption, width));&lt;br /&gt;
		} else {&lt;br /&gt;
			return make_image(filename, caption, width);&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		return center? f(&amp;quot;&amp;lt;div class='center'&amp;gt;?&amp;lt;/div&amp;gt;&amp;quot;, o): o;&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function parse_inline_nowiki(str)&lt;br /&gt;
	{&lt;br /&gt;
		var start, lastend=0&lt;br /&gt;
		var substart=0, nestlev=0, open, close, subloop;&lt;br /&gt;
		var html='';&lt;br /&gt;
 &lt;br /&gt;
		while (-1 != (start = str.indexOf('&amp;lt;nowiki&amp;gt;', substart))) {&lt;br /&gt;
			html += parse_inline_wiki(str.substring(lastend, start));&lt;br /&gt;
			start += 8;&lt;br /&gt;
			substart = start;&lt;br /&gt;
			subloop = true;&lt;br /&gt;
			do {&lt;br /&gt;
				open = str.indexOf('&amp;lt;nowiki&amp;gt;', substart);&lt;br /&gt;
				close = str.indexOf('&amp;lt;/nowiki&amp;gt;', substart);&lt;br /&gt;
				if (close&amp;lt;=open || open==-1) {&lt;br /&gt;
					if (close==-1) {&lt;br /&gt;
						return html + html_entities(str.substr(start));&lt;br /&gt;
					}&lt;br /&gt;
					substart = close+9;&lt;br /&gt;
					if (nestlev) {&lt;br /&gt;
						nestlev--;&lt;br /&gt;
					} else {&lt;br /&gt;
						lastend = substart;&lt;br /&gt;
						html += html_entities(str.substring(start, lastend-9));&lt;br /&gt;
						subloop = false;&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					substart = open+8;&lt;br /&gt;
					nestlev++;&lt;br /&gt;
				}&lt;br /&gt;
			} while (subloop)&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		return html + parse_inline_wiki(str.substr(lastend));&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function make_image(filename, caption, width)&lt;br /&gt;
	{&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		// uppercase first letter in file name&lt;br /&gt;
		filename = filename.charAt(0).toUpperCase() + filename.substr(1);&lt;br /&gt;
		// replace spaces with underscores&lt;br /&gt;
		filename = filename.replace(/ /g, '_');&lt;br /&gt;
 &lt;br /&gt;
		caption = strip_inline_wiki(caption);&lt;br /&gt;
 &lt;br /&gt;
		var md5 = hex_md5(filename);&lt;br /&gt;
 &lt;br /&gt;
		var source = md5.charAt(0) + '/' + md5.substr(0,2) + '/' + filename;&lt;br /&gt;
 &lt;br /&gt;
		if (width) width = &amp;quot;width='&amp;quot; + width + &amp;quot;px'&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
		var img = f(&amp;quot;&amp;lt;img onerror=\&amp;quot;this.onerror=null;this.src='?'\&amp;quot; src='?' ? ?&amp;gt;&amp;quot;, Insta.conf.paths.images_fallback + source, Insta.conf.paths.images + source, (caption!='')? &amp;quot;alt='&amp;quot; + caption + &amp;quot;'&amp;quot; : '', width);&lt;br /&gt;
 &lt;br /&gt;
		return f(&amp;quot;&amp;lt;a class='image' ? href='?'&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, (caption!='')? &amp;quot;title='&amp;quot; + caption + &amp;quot;'&amp;quot; : '', Insta.conf.paths.articles + Insta.conf.locale.image + ':' + filename, img);&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function parse_inline_images(str)&lt;br /&gt;
	{&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		var start, substart=0, nestlev=0;&lt;br /&gt;
		var loop, close, open, wiki, html;&lt;br /&gt;
 &lt;br /&gt;
		while (-1 != (start=str.indexOf('[[', substart))) {&lt;br /&gt;
			if(str.substr(start+2).match(RegExp('^(Image|File|' + Insta.conf.locale.image + '):','i'))) {&lt;br /&gt;
				loop=true;&lt;br /&gt;
				substart=start;&lt;br /&gt;
				do {&lt;br /&gt;
					substart+=2;&lt;br /&gt;
					close=str.indexOf(']]',substart);&lt;br /&gt;
					open=str.indexOf('[[',substart);&lt;br /&gt;
					if (close&amp;lt;=open||open==-1) {&lt;br /&gt;
						if (close==-1) return str;&lt;br /&gt;
						substart=close;&lt;br /&gt;
						if (nestlev) {&lt;br /&gt;
							nestlev--;&lt;br /&gt;
						} else {&lt;br /&gt;
							wiki=str.substring(start,close+2);&lt;br /&gt;
							html=parse_image(wiki);&lt;br /&gt;
							str=str.replace(wiki,html);&lt;br /&gt;
							substart=start+html.length;&lt;br /&gt;
							loop=false;&lt;br /&gt;
						}&lt;br /&gt;
					} else {&lt;br /&gt;
						substart=open;&lt;br /&gt;
						nestlev++;&lt;br /&gt;
					}&lt;br /&gt;
				} while (loop)&lt;br /&gt;
 &lt;br /&gt;
			} else break;&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
		return str;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// the output of this function doesn't respect the FILO structure of HTML&lt;br /&gt;
	// but since most browsers can handle it I'll save myself the hassle&lt;br /&gt;
	function parse_inline_formatting(str)&lt;br /&gt;
	{&lt;br /&gt;
		var em,st,i,li,o='';&lt;br /&gt;
		while ((i=str.indexOf(&amp;quot;''&amp;quot;,li))+1) {&lt;br /&gt;
			o += str.substring(li,i);&lt;br /&gt;
			li=i+2;&lt;br /&gt;
			if (str.charAt(i+2)==&amp;quot;'&amp;quot;) {&lt;br /&gt;
				li++;&lt;br /&gt;
				st=!st;&lt;br /&gt;
				o+=st?'&amp;lt;strong&amp;gt;':'&amp;lt;/strong&amp;gt;';&lt;br /&gt;
			} else {&lt;br /&gt;
				em=!em;&lt;br /&gt;
				o+=em?'&amp;lt;em&amp;gt;':'&amp;lt;/em&amp;gt;';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return o+str.substr(li);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	function parse_inline_wiki(str)&lt;br /&gt;
	{&lt;br /&gt;
		var aux_match;&lt;br /&gt;
 &lt;br /&gt;
		str = parse_inline_images(str);&lt;br /&gt;
		str = parse_inline_formatting(str);&lt;br /&gt;
 &lt;br /&gt;
		// math&lt;br /&gt;
		while (aux_match = str.match(/&amp;lt;(?:)math&amp;gt;(.*?)&amp;lt;\/math&amp;gt;/i)) {&lt;br /&gt;
			var math_md5 = hex_md5(aux_match[1]);&lt;br /&gt;
			str = str.replace(aux_match[0], f(&amp;quot;&amp;lt;img src='?.png'&amp;gt;&amp;quot;, Insta.conf.paths.math+math_md5));&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		// Build a Mediawiki-formatted date string&lt;br /&gt;
		var date = new Date;&lt;br /&gt;
		var minutes = date.getUTCMinutes();&lt;br /&gt;
		if (minutes &amp;lt; 10) minutes = '0' + minutes;&lt;br /&gt;
		var date = f(&amp;quot;?:?, ? ? ? (UTC)&amp;quot;, date.getUTCHours(), minutes, date.getUTCDate(), Insta.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear());&lt;br /&gt;
 &lt;br /&gt;
		// text formatting&lt;br /&gt;
		return str.&lt;br /&gt;
			// signatures&lt;br /&gt;
			replace(/~{5}(?!~)/g, date).&lt;br /&gt;
			replace(/~{4}(?!~)/g, Insta.conf.user.name+' '+date).&lt;br /&gt;
			replace(/~{3}(?!~)/g, Insta.conf.user.name).&lt;br /&gt;
 &lt;br /&gt;
			// [[:Category:...]], [[:Image:...]], etc...&lt;br /&gt;
			replace(RegExp('\\[\\[:((?:'+Insta.conf.locale.category+'|Image|File|'+Insta.conf.locale.image+'|'+Insta.conf.wiki.interwiki+'):[^|]*?)\\]\\](\w*)','gi'), &amp;quot;&amp;lt;a href='&amp;quot;+Insta.conf.paths.articles+&amp;quot;$1'&amp;gt;$1$2&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
			// remove straight category and interwiki tags&lt;br /&gt;
			replace(RegExp('\\[\\[(?:'+Insta.conf.locale.category+'|'+Insta.conf.wiki.interwiki+'):.*?\\]\\]','gi'),'').&lt;br /&gt;
 &lt;br /&gt;
			// [[:Category:...|Links]], [[:Image:...|Links]], etc...&lt;br /&gt;
			replace(RegExp('\\[\\[:((?:'+Insta.conf.locale.category+'|Image|File|'+Insta.conf.locale.image+'|'+Insta.conf.wiki.interwiki+'):.*?)\\|([^\\]]+?)\\]\\](\\w*)','gi'), &amp;quot;&amp;lt;a href='&amp;quot;+Insta.conf.paths.articles+&amp;quot;$1'&amp;gt;$2$3&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
 &lt;br /&gt;
			// [[/Relative links]]&lt;br /&gt;
			replace(/\[\[(\/[^|]*?)\]\]/g, f(&amp;quot;&amp;lt;a href='?$1'&amp;gt;$1&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.baseUrl)).&lt;br /&gt;
 &lt;br /&gt;
			// [[/Replaced|Relative links]]&lt;br /&gt;
			replace(/\[\[(\/.*?)\|(.+?)\]\]/g, f(&amp;quot;&amp;lt;a href='?$1'&amp;gt;$2&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.baseUrl)).&lt;br /&gt;
 &lt;br /&gt;
			// [[Common links]]&lt;br /&gt;
			replace(/\[\[([^|]*?)\]\](\w*)/g, f(&amp;quot;&amp;lt;a href='?$1'&amp;gt;$1$2&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.paths.articles)).&lt;br /&gt;
 &lt;br /&gt;
			// [[Replaced|Links]]&lt;br /&gt;
			replace(/\[\[(.*?)\|([^\]]+?)\]\](\w*)/g, f(&amp;quot;&amp;lt;a href='?$1'&amp;gt;$2$3&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.paths.articles)).&lt;br /&gt;
 &lt;br /&gt;
			// [[Stripped:Namespace|Namespace]]&lt;br /&gt;
			replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|\]\]/g, f(&amp;quot;&amp;lt;a href='?$1$2$3'&amp;gt;$2&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.paths.articles)).&lt;br /&gt;
 &lt;br /&gt;
			// External links&lt;br /&gt;
			replace(/\[(https?|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)\]/g, &amp;quot;&amp;lt;a class='external' href='$1:$2$3'&amp;gt;$4&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
			replace(/\[http:\/\/(.*?)\]/g, &amp;quot;&amp;lt;a class='external' href='http://$1'&amp;gt;[#]&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
			replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)\]/g, &amp;quot;&amp;lt;a class='external' href='$1:$2$3'&amp;gt;$1:$2$3&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
			replace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\/*)([^ $]*[^.,!?;: $])/g, &amp;quot;$1&amp;lt;a class='external' href='$2:$3$4'&amp;gt;$2:$3$4&amp;lt;/a&amp;gt;&amp;quot;).&lt;br /&gt;
 &lt;br /&gt;
			replace('__NOTOC__','').&lt;br /&gt;
			replace('__NOEDITSECTION__','');&lt;br /&gt;
	}&lt;br /&gt;
/*&lt;br /&gt;
*/&lt;br /&gt;
	function strip_inline_wiki(str)&lt;br /&gt;
	{&lt;br /&gt;
		return str&lt;br /&gt;
			.replace(/\[\[[^\]]*\|(.*?)\]\]/g,'$1')&lt;br /&gt;
			.replace(/\[\[(.*?)\]\]/g,'$1')&lt;br /&gt;
			.replace(/''(.*?)''/g,'$1');&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// begin parsing&lt;br /&gt;
	for (;remain();) if ($(/^(={1,6})(.*)\1(.*)$/)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		endl(f('&amp;lt;h?&amp;gt;?&amp;lt;/h?&amp;gt;?', $r[1].length, parse_inline_nowiki($r[2]), $r[1].length, $r[3]))&lt;br /&gt;
 &lt;br /&gt;
	} else if ($(/^[*#:;]/)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_list()&lt;br /&gt;
 &lt;br /&gt;
	} else if ($(' ')) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_pre()&lt;br /&gt;
 &lt;br /&gt;
	} else if ($('{|')) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_table()&lt;br /&gt;
 &lt;br /&gt;
	} else if ($(/^----+$/)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		endl('&amp;lt;hr&amp;gt;')&lt;br /&gt;
 &lt;br /&gt;
	} else if ($(Insta.BLOCK_IMAGE)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_block_image()&lt;br /&gt;
 &lt;br /&gt;
	} else {&lt;br /&gt;
 &lt;br /&gt;
		// handle paragraphs&lt;br /&gt;
		if ($$('')) {&lt;br /&gt;
			if (p = (remain()&amp;gt;1 &amp;amp;&amp;amp; ll[1]==(''))) endl('&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;')&lt;br /&gt;
		} else {&lt;br /&gt;
			if(!p) {&lt;br /&gt;
				ps('&amp;lt;p&amp;gt;')&lt;br /&gt;
				p=1&lt;br /&gt;
			}&lt;br /&gt;
			ps(parse_inline_nowiki(ll[0]) + ' ')&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		sh();&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	return o&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
window.wiki2html=function(txt,baseurl) {&lt;br /&gt;
    Insta.conf.baseUrl=baseurl;&lt;br /&gt;
    return Insta.convert(txt);&lt;br /&gt;
};&lt;br /&gt;
// ENDFILE: livepreview.js&lt;br /&gt;
// STARTFILE: pageinfo.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function popupFilterPageSize(data) {&lt;br /&gt;
	return formatBytes(data.length);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function popupFilterCountLinks(data) {&lt;br /&gt;
	var num=countLinks(data);&lt;br /&gt;
	return String(num) + '&amp;amp;nbsp;' + ((num!=1)?popupString('wikiLinks'):popupString('wikiLink'));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function popupFilterCountImages(data) {&lt;br /&gt;
	var num=countImages(data);&lt;br /&gt;
	return String(num) + '&amp;amp;nbsp;' + ((num!=1)?popupString('images'):popupString('image'));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function popupFilterCountCategories(data) {&lt;br /&gt;
	var num=countCategories(data);&lt;br /&gt;
	return String(num) + '&amp;amp;nbsp;' + ((num!=1)?popupString('categories'):popupString('category'));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function popupFilterLastModified(data,download) {&lt;br /&gt;
	var lastmod=download.lastModified;&lt;br /&gt;
	var now=new Date();&lt;br /&gt;
	var age=now-lastmod;&lt;br /&gt;
	if (lastmod &amp;amp;&amp;amp; getValueOf('popupLastModified')) {&lt;br /&gt;
		return (tprintf('%s old', [formatAge(age)])).replace(RegExp(' ','g'), '&amp;amp;nbsp;');&lt;br /&gt;
	}&lt;br /&gt;
	return '';&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function formatAge(age) {&lt;br /&gt;
	// coerce into a number&lt;br /&gt;
	var a=0+age, aa=a;&lt;br /&gt;
 &lt;br /&gt;
	var seclen  = 1000;&lt;br /&gt;
	var minlen  = 60*seclen;&lt;br /&gt;
	var hourlen = 60*minlen;&lt;br /&gt;
	var daylen  = 24*hourlen;&lt;br /&gt;
	var weeklen = 7*daylen;&lt;br /&gt;
 &lt;br /&gt;
	var numweeks = (a-a%weeklen)/weeklen; a = a-numweeks*weeklen; var sweeks = addunit(numweeks, 'week');&lt;br /&gt;
	var numdays  = (a-a%daylen)/daylen;   a = a-numdays*daylen;   var sdays  = addunit(numdays, 'day');&lt;br /&gt;
	var numhours = (a-a%hourlen)/hourlen; a = a-numhours*hourlen; var shours = addunit(numhours,'hour');&lt;br /&gt;
	var nummins  = (a-a%minlen)/minlen;   a = a-nummins*minlen;   var smins  = addunit(nummins, 'minute');&lt;br /&gt;
	var numsecs  = (a-a%seclen)/seclen;   a = a-numsecs*seclen;   var ssecs  = addunit(numsecs, 'second');&lt;br /&gt;
 &lt;br /&gt;
	if (aa &amp;gt; 4*weeklen) { return sweeks; }&lt;br /&gt;
	if (aa &amp;gt; weeklen)   { return sweeks + ' ' + sdays; }&lt;br /&gt;
	if (aa &amp;gt; daylen)    { return sdays  + ' ' + shours; }&lt;br /&gt;
	if (aa &amp;gt; 6*hourlen) { return shours; }&lt;br /&gt;
	if (aa &amp;gt; hourlen)   { return shours + ' ' + smins; }&lt;br /&gt;
	if (aa &amp;gt; 10*minlen) { return smins; }&lt;br /&gt;
	if (aa &amp;gt; minlen)    { return smins  + ' ' + ssecs; }&lt;br /&gt;
	return ssecs;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function addunit(num,str) { return '' + num + ' ' + ((num!=1) ? popupString(str+'s') : popupString(str)) ;}&lt;br /&gt;
 &lt;br /&gt;
function runPopupFilters(list, data, download) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (list[i] &amp;amp;&amp;amp; typeof list[i] == 'function') {&lt;br /&gt;
			var s=list[i](data, download, download.owner.article);&lt;br /&gt;
			if (s) { ret.push(s); }&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getPageInfo(data, download) {&lt;br /&gt;
	if (!data || data.length === 0) { return popupString('Empty page'); }&lt;br /&gt;
 &lt;br /&gt;
	var popupFilters=getValueOf('popupFilters') || [];&lt;br /&gt;
	var extraPopupFilters = getValueOf('extraPopupFilters') || [];&lt;br /&gt;
	var pageInfoArray = runPopupFilters(popupFilters.concat(extraPopupFilters), data, download);&lt;br /&gt;
 &lt;br /&gt;
	var pageInfo=pageInfoArray.join(', ');&lt;br /&gt;
	if (pageInfo !== '' ) { pageInfo = upcaseFirst(pageInfo); }&lt;br /&gt;
	return pageInfo;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
// this could be improved!&lt;br /&gt;
function countLinks(wikiText) { return wikiText.split('[[').length - 1; }&lt;br /&gt;
 &lt;br /&gt;
// if N = # matches, n = # brackets, then&lt;br /&gt;
// String.parenSplit(regex) intersperses the N+1 split elements&lt;br /&gt;
// with Nn other elements. So total length is&lt;br /&gt;
// L= N+1 + Nn = N(n+1)+1. So N=(L-1)/(n+1).&lt;br /&gt;
 &lt;br /&gt;
function countImages(wikiText) {&lt;br /&gt;
	return (wikiText.parenSplit(pg.re.image).length - 1) / (pg.re.imageBracketCount + 1);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function countCategories(wikiText) {&lt;br /&gt;
	return (wikiText.parenSplit(pg.re.category).length - 1) / (pg.re.categoryBracketCount + 1);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function popupFilterStubDetect(data, download, article)     {&lt;br /&gt;
	var counts=stubCount(data, article);&lt;br /&gt;
	if (counts.real) { return popupString('stub'); }&lt;br /&gt;
	if (counts.sect) { return popupString('section stub'); }&lt;br /&gt;
	return '';&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function popupFilterDisambigDetect(data, download, article) {&lt;br /&gt;
	if (getValueOf('popupOnlyArticleDabStub') &amp;amp;&amp;amp; article.namespace()) { return ''; }&lt;br /&gt;
	return (isDisambig(data, article)) ? popupString('disambig') : '';&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function formatBytes(num) {&lt;br /&gt;
	return (num &amp;gt; 949) ? (Math.round(num/100)/10+popupString('kB')) : (num +'&amp;amp;nbsp;' + popupString('bytes')) ;&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: pageinfo.js&lt;br /&gt;
// STARTFILE: titles.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview Defines the {@link Title} class, and associated crufty functions.&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; deals with article titles and their various&lt;br /&gt;
   forms.  {@link Stringwrapper} is the parent class of&lt;br /&gt;
   &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt;, which exists simply to make things a little&lt;br /&gt;
   neater.&lt;br /&gt;
 &lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Stringwrapper.&lt;br /&gt;
   @constructor&lt;br /&gt;
 &lt;br /&gt;
   @class the Stringwrapper class. This base class is not really&lt;br /&gt;
   useful on its own; it just wraps various common string operations.&lt;br /&gt;
*/&lt;br /&gt;
function Stringwrapper() {&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for this.toString().indexOf()&lt;br /&gt;
	   @param {String} x&lt;br /&gt;
	   @type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.indexOf=function(x){return this.toString().indexOf(x);};&lt;br /&gt;
	/**&lt;br /&gt;
	   Returns this.value.&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.toString=function(){return this.value;};&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for {@link String#parenSplit} applied to this.toString()&lt;br /&gt;
	   @param {RegExp} x&lt;br /&gt;
	   @type Array&lt;br /&gt;
	*/&lt;br /&gt;
	this.parenSplit=function(x){return this.toString().parenSplit(x);};&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for this.toString().substring()&lt;br /&gt;
	   @param {String} x&lt;br /&gt;
	   @param {String} y (optional)&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.substring=function(x,y){&lt;br /&gt;
		if (typeof y=='undefined') { return this.toString().substring(x); }&lt;br /&gt;
		return this.toString().substring(x,y);&lt;br /&gt;
	};&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for this.toString().split()&lt;br /&gt;
	   @param {String} x&lt;br /&gt;
	   @type Array&lt;br /&gt;
	*/&lt;br /&gt;
	this.split=function(x){return this.toString().split(x);};&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for this.toString().replace()&lt;br /&gt;
	   @param {String} x&lt;br /&gt;
	   @param {String} y&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.replace=function(x,y){ return this.toString().replace(x,y); };&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Creates a new &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt;.&lt;br /&gt;
   @constructor&lt;br /&gt;
 &lt;br /&gt;
   @class The Title class. Holds article titles and converts them into&lt;br /&gt;
   various forms. Also deals with anchors, by which we mean the bits&lt;br /&gt;
   of the article URL after a # character, representing locations&lt;br /&gt;
   within an article.&lt;br /&gt;
 &lt;br /&gt;
   @param {String} value The initial value to assign to the&lt;br /&gt;
   article. This must be the canonical title (see {@link&lt;br /&gt;
   Title#value}. Omit this in the constructor and use another function&lt;br /&gt;
   to set the title if this is unavailable.&lt;br /&gt;
*/&lt;br /&gt;
function Title(val) {&lt;br /&gt;
	/**&lt;br /&gt;
	   The canonical article title. This must be in UTF-8 with no&lt;br /&gt;
	   entities, escaping or nasties. Also, underscores should be&lt;br /&gt;
	   replaced with spaces.&lt;br /&gt;
	   @type String&lt;br /&gt;
	   @private&lt;br /&gt;
	*/&lt;br /&gt;
	this.value=null;&lt;br /&gt;
	/**&lt;br /&gt;
	   The canonical form of the anchor. This should be exactly as&lt;br /&gt;
	   it appears in the URL, i.e. with the .C3.0A bits in.&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.anchor='';&lt;br /&gt;
 &lt;br /&gt;
	this.setUtf(val);&lt;br /&gt;
}&lt;br /&gt;
Title.prototype=new Stringwrapper();&lt;br /&gt;
/**&lt;br /&gt;
   Returns the canonical representation of the article title, optionally without anchor.&lt;br /&gt;
   @param {boolean} omitAnchor&lt;br /&gt;
   @fixme Decide specs for anchor&lt;br /&gt;
   @return String The article title and the anchor.&lt;br /&gt;
*/&lt;br /&gt;
Title.prototype.toString=function(omitAnchor) {&lt;br /&gt;
	return this.value + ( (!omitAnchor &amp;amp;&amp;amp; this.anchor) ? '#' + this.anchorString() : '' );&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.anchorString=function() {&lt;br /&gt;
	if (!this.anchor) { return ''; }&lt;br /&gt;
	var split=this.anchor.parenSplit(/((?:[.][0-9A-F]{2})+)/);&lt;br /&gt;
	var len=split.length;&lt;br /&gt;
	for (var j=1; j&amp;lt;len; j+=2) {&lt;br /&gt;
		// FIXME s/decodeURI/decodeURIComponent/g ?&lt;br /&gt;
		split[j]=decodeURIComponent(split[j].split('.').join('%')).split('_').join(' ');&lt;br /&gt;
	}&lt;br /&gt;
	return split.join('');&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.urlAnchor=function() {&lt;br /&gt;
	var split=this.anchor.parenSplit('/((?:[%][0-9A-F]{2})+)/');&lt;br /&gt;
	var len=split.length;&lt;br /&gt;
	for (var j=1; j&amp;lt;len; j+=2) {&lt;br /&gt;
		split[j]=split[j].split('%').join('.');&lt;br /&gt;
	}&lt;br /&gt;
	return split.join('');&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.anchorFromUtf=function(str) {&lt;br /&gt;
	this.anchor=encodeURIComponent(str.split(' ').join('_'))&lt;br /&gt;
	.split('%3A').join(':').split(&amp;quot;'&amp;quot;).join('%27').split('%').join('.');&lt;br /&gt;
};&lt;br /&gt;
Title.fromURL=function(h) {&lt;br /&gt;
	return new Title().fromURL(h);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.fromURL=function(h) {&lt;br /&gt;
	if (typeof h != 'string') {&lt;br /&gt;
		this.value=null;&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// NOTE : playing with decodeURI, encodeURI, escape, unescape,&lt;br /&gt;
	// we seem to be able to replicate the IE borked encoding&lt;br /&gt;
 &lt;br /&gt;
	// IE doesn't do this new-fangled utf-8 thing.&lt;br /&gt;
	// and it's worse than that.&lt;br /&gt;
	// IE seems to treat the query string differently to the rest of the url&lt;br /&gt;
	// the query is treated as bona-fide utf8, but the first bit of the url is pissed around with&lt;br /&gt;
 &lt;br /&gt;
	// we fix up &amp;amp; for all browsers, just in case.&lt;br /&gt;
	var splitted=h.split('?');&lt;br /&gt;
	splitted[0]=splitted[0].split('&amp;amp;').join('%26');&lt;br /&gt;
 &lt;br /&gt;
	if (pg.flag.linksLikeIE6) {&lt;br /&gt;
		splitted[0]=encodeURI(decode_utf8(splitted[0]));&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	h=splitted.join('?');&lt;br /&gt;
 &lt;br /&gt;
	var contribs=pg.re.contribs.exec(h);&lt;br /&gt;
	if (contribs !== null) {&lt;br /&gt;
		if (contribs[1]=='title=') { contribs[3]=contribs[3].split('+').join(' '); }&lt;br /&gt;
		var u=new Title(contribs[3]);&lt;br /&gt;
		this.setUtf(this.decodeNasties(pg.ns.user + ':' + u.stripNamespace()));&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	var email=pg.re.email.exec(h);&lt;br /&gt;
	if (email !== null) {&lt;br /&gt;
		this.setUtf(this.decodeNasties(pg.ns.user + ':' + new Title(email[3]).stripNamespace()));&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	var backlinks=pg.re.backlinks.exec(h);&lt;br /&gt;
	if (backlinks) {&lt;br /&gt;
		this.setUtf(this.decodeNasties(new Title(backlinks[3])));&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// no more special cases to check --&lt;br /&gt;
	// hopefully it's not a disguised user-related or specially treated special page&lt;br /&gt;
	var m=pg.re.main.exec(h);&lt;br /&gt;
	if(m===null) { this.value=null; }&lt;br /&gt;
	else {&lt;br /&gt;
        var fromBotInterface = /[?](.+[&amp;amp;])?title=/.test(h);&lt;br /&gt;
        if (fromBotInterface) {&lt;br /&gt;
            m[2]=m[2].split('+').join('_');&lt;br /&gt;
        }&lt;br /&gt;
        var extracted = m[2] + (m[3] ? '#' + m[3] : '');&lt;br /&gt;
        if (pg.flag.isSafari &amp;amp;&amp;amp; /%25[0-9A-Fa-f]{2}/.test(extracted)) {&lt;br /&gt;
            // Fix Safari issue&lt;br /&gt;
            // Safari sometimes encodes % as %25 in UTF-8 encoded strings like %E5%A3 -&amp;gt; %25E5%25A3.&lt;br /&gt;
            this.setUtf(decodeURIComponent(unescape(extracted)));&lt;br /&gt;
        } else {&lt;br /&gt;
            this.setUtf(this.decodeNasties(extracted));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
	return this;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.decodeNasties=function(txt) {&lt;br /&gt;
	var ret= this.decodeEscapes(decodeURI(txt));&lt;br /&gt;
	ret = ret.replace(/[_ ]*$/, '');&lt;br /&gt;
	return ret;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.decodeEscapes=function(txt) {&lt;br /&gt;
	var split=txt.parenSplit(/((?:[%][0-9A-Fa-f]{2})+)/);&lt;br /&gt;
	var len=split.length;&lt;br /&gt;
	for (var i=1; i&amp;lt;len; i=i+2) {&lt;br /&gt;
		// FIXME is decodeURIComponent better?&lt;br /&gt;
		split[i]=unescape(split[i]);&lt;br /&gt;
	}&lt;br /&gt;
	return split.join('');&lt;br /&gt;
};&lt;br /&gt;
Title.fromAnchor=function(a) {&lt;br /&gt;
	return new Title().fromAnchor(a);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.fromAnchor=function(a) {&lt;br /&gt;
	if (!a) { this.value=null; return this; }&lt;br /&gt;
	return this.fromURL(a.href);&lt;br /&gt;
};&lt;br /&gt;
Title.fromWikiText=function(txt) {&lt;br /&gt;
	return new Title().fromWikiText(txt);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.fromWikiText=function(txt) {&lt;br /&gt;
	// FIXME - testing needed&lt;br /&gt;
	if (!pg.flag.linksLikeIE6) { txt=myDecodeURI(txt); }&lt;br /&gt;
	this.setUtf(txt);&lt;br /&gt;
	return this;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.hintValue=function(){&lt;br /&gt;
	if(!this.value) { return ''; }&lt;br /&gt;
	return safeDecodeURI(this.value);&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
Title.prototype.toUserName=function(withNs) {&lt;br /&gt;
	if (this.namespace() != pg.ns.user &amp;amp;&amp;amp; this.namespace() != pg.ns.usertalk) {&lt;br /&gt;
		this.value=null;&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	this.value = (withNs ? pg.ns.user + ':' : '') + this.stripNamespace().split('/')[0];&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.userName=function(withNs) {&lt;br /&gt;
	var t=(new Title(this.value));&lt;br /&gt;
	t.toUserName(withNs);&lt;br /&gt;
	if (t.value) { return t; }&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.toTalkPage=function() {&lt;br /&gt;
	// convert article to a talk page, or if we can't return null&lt;br /&gt;
	// or, in other words, return null if this ALREADY IS a talk page&lt;br /&gt;
	// and return the corresponding talk page otherwise&lt;br /&gt;
	if (this.value===null) { return null; }&lt;br /&gt;
	var talkRegex=namespaceListToRegex(pg.ns.talkList);&lt;br /&gt;
	if (talkRegex.exec(this.value)) { this.value=null; return null;}&lt;br /&gt;
 &lt;br /&gt;
	var nsReg=namespaceListToRegex(pg.ns.withTalkList);&lt;br /&gt;
	var splitted=this.value.parenSplit(nsReg);&lt;br /&gt;
	if (splitted.length&amp;lt;2) {&lt;br /&gt;
		this.value= (pg.ns.talkList[0]+':'+this.value).split(' ').join('_');&lt;br /&gt;
		return this.value;&lt;br /&gt;
	}&lt;br /&gt;
	for (var i=0; i&amp;lt; pg.ns.withTalkList.length; ++i) {&lt;br /&gt;
		if (splitted[1]==pg.ns.withTalkList[i]) {&lt;br /&gt;
			splitted[1]=pg.ns.talkList[i];&lt;br /&gt;
			this.value=splitted.join(':').substring(1).split(' ').join('_');&lt;br /&gt;
			return this.value;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	this.value=null;&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
Title.prototype.namespace=function() {&lt;br /&gt;
	var n=this.value.indexOf(':');&lt;br /&gt;
	if (n&amp;lt;0) { return ''; }&lt;br /&gt;
	var list=pg.ns.list;&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (upcaseFirst(list[i]) == this.value.substring(0,n)) { return list[i]; }&lt;br /&gt;
	}&lt;br /&gt;
	return '';&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
Title.prototype.talkPage=function() {&lt;br /&gt;
	var t=new Title(this.value);&lt;br /&gt;
	t.toTalkPage();&lt;br /&gt;
	if (t.value) { return t; }&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.isTalkPage=function() {&lt;br /&gt;
	if (this.talkPage()===null) { return true; }&lt;br /&gt;
	return false;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.toArticleFromTalkPage=function() {&lt;br /&gt;
	var talkRegex=namespaceListToRegex(pg.ns.talkList);&lt;br /&gt;
	var splitted=this.value.parenSplit(talkRegex);&lt;br /&gt;
	if (splitted.length &amp;lt; 2 || splitted[0].length &amp;gt; 0) { this.value=null; return null; }&lt;br /&gt;
	if (splitted[1]==pg.ns.talkList[0]) {&lt;br /&gt;
		splitted[1]='';&lt;br /&gt;
		this.value=splitted.join(':').substring(2).split(' ').join('_');&lt;br /&gt;
		return this.value;&lt;br /&gt;
	}&lt;br /&gt;
	for (var i=1; i&amp;lt; pg.ns.talkList.length; ++i) {&lt;br /&gt;
		if (splitted[1]==pg.ns.talkList[i] || splitted[1]==pg.ns.talkList[i].split(' ').join('_')) {&lt;br /&gt;
			splitted[1]=pg.ns.withTalkList[i];&lt;br /&gt;
			this.value= splitted.join(':').substring(1).split(' ').join('_');&lt;br /&gt;
			return this.value;&lt;br /&gt;
		    }&lt;br /&gt;
	}&lt;br /&gt;
	this.value=null;&lt;br /&gt;
	return this.value;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.articleFromTalkPage=function() {&lt;br /&gt;
	var t=new Title(this.value);&lt;br /&gt;
	t.toArticleFromTalkPage();&lt;br /&gt;
	if (t.value) { return t; }&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.articleFromTalkOrArticle=function() {&lt;br /&gt;
	var t=new Title(this.value);&lt;br /&gt;
	if ( t.toArticleFromTalkPage() ) { return t; }&lt;br /&gt;
	return this;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.isIpUser=function() {&lt;br /&gt;
	return pg.re.ipUser.test(this.userName());&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
Title.prototype.stripNamespace=function(){ // returns a string, not a Title&lt;br /&gt;
	var n=this.value.indexOf(':');&lt;br /&gt;
	if (n&amp;lt;0) { return this.value; }&lt;br /&gt;
	var list=pg.ns.list;&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (upcaseFirst(list[i]) == this.value.substring(0,n)) { return this.value.substring(n+1); }&lt;br /&gt;
	}&lt;br /&gt;
	return this.value;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.setUtf=function(value){&lt;br /&gt;
	if (!value) { this.value=''; return; }&lt;br /&gt;
	var anch=value.indexOf('#');&lt;br /&gt;
	if(anch &amp;lt; 0) { this.value=value.split('_').join(' '); this.anchor=''; return; }&lt;br /&gt;
	this.value=value.substring(0,anch).split('_').join(' ');&lt;br /&gt;
	this.anchor=value.substring(anch+1);&lt;br /&gt;
	this.ns=null; // wait until namespace() is called&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.setUrl=function(urlfrag) {&lt;br /&gt;
	var anch=urlfrag.indexOf('#');&lt;br /&gt;
	this.value=safeDecodeURI(urlfrag.substring(0,anch));&lt;br /&gt;
	this.anchor=value.substring(anch+1);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.append=function(x){&lt;br /&gt;
	this.setUtf(this.value + x);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.urlString=function(x) {&lt;br /&gt;
	x || ( x={} );&lt;br /&gt;
	var v=this.toString(true);&lt;br /&gt;
	if (!x.omitAnchor &amp;amp;&amp;amp; this.anchor) { v+= '#' + this.urlAnchor(); }&lt;br /&gt;
	if (!x.keepSpaces) { v=v.split(' ').join('_'); }&lt;br /&gt;
	return encodeURI(v).split('&amp;amp;').join('%26').split('?').join('%3F').split('+').join('%2B');&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.removeAnchor=function() {&lt;br /&gt;
	return new Title(this.toString(true));&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.toUrl=function() {&lt;br /&gt;
	return pg.wiki.titlebase + this.urlString();&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function paramValue(param, url) {&lt;br /&gt;
	var s=url.parenSplit(RegExp('[?&amp;amp;]' + literalizeRegex(param) + '=([^?&amp;amp;]*)'));&lt;br /&gt;
	if (!url) { return null; }&lt;br /&gt;
	return s[1] || null;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function parseParams(url) {&lt;br /&gt;
	var ret={};&lt;br /&gt;
	if (url.indexOf('?')==-1) { return ret; }&lt;br /&gt;
	var s=url.split('?').slice(1).join();&lt;br /&gt;
	var t=s.split('&amp;amp;');&lt;br /&gt;
	for (var i=0; i&amp;lt;t.length; ++i) {&lt;br /&gt;
		var z=t[i].split('=');&lt;br /&gt;
		z.push(null);&lt;br /&gt;
		ret[z[0]]=z[1];&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// all sorts of stuff here&lt;br /&gt;
// FIXME almost everything needs to be rewritten&lt;br /&gt;
 &lt;br /&gt;
function oldidFromAnchor(a) { return paramValue('oldid', a.href); }&lt;br /&gt;
//function diffFromAnchor(a) { return paramValue('diff', a.href); }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function wikiMarkupToAddressFragment (str) { // for images&lt;br /&gt;
	var ret = safeDecodeURI(str);&lt;br /&gt;
	ret = ret.split(' ').join('_');&lt;br /&gt;
	ret = encodeURI(ret);&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// (a) myDecodeURI (first standard decodeURI, then pg.re.urlNoPopup)&lt;br /&gt;
// (b) change spaces to underscores&lt;br /&gt;
// (c) encodeURI (just the straight one, no pg.re.urlNoPopup)&lt;br /&gt;
 &lt;br /&gt;
function myDecodeURI (str) {&lt;br /&gt;
	var ret;&lt;br /&gt;
	// FIXME decodeURIComponent??&lt;br /&gt;
	try { ret=decodeURI(str.toString()); }&lt;br /&gt;
	catch (summat) { return str; }&lt;br /&gt;
	for (var i=0; i&amp;lt;pg.misc.decodeExtras.length; ++i) {&lt;br /&gt;
		var from=pg.misc.decodeExtras[i].from;&lt;br /&gt;
		var to=pg.misc.decodeExtras[i].to;&lt;br /&gt;
		ret=ret.split(from).join(to);&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function safeDecodeURI(str) { var ret=myDecodeURI(str); return ret || str; }&lt;br /&gt;
 &lt;br /&gt;
///////////&lt;br /&gt;
// TESTS //&lt;br /&gt;
///////////&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function isIpUser(user) {return pg.re.ipUser.test(user);}&lt;br /&gt;
 &lt;br /&gt;
function isDisambig(data, article) {&lt;br /&gt;
	if (!getValueOf('popupAllDabsStubs') &amp;amp;&amp;amp; article.namespace()) { return false; }&lt;br /&gt;
	return ! article.isTalkPage() &amp;amp;&amp;amp; pg.re.disambig.test(data);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function stubCount(data, article) {&lt;br /&gt;
	if (!getValueOf('popupAllDabsStubs') &amp;amp;&amp;amp; article.namespace()) { return false; }&lt;br /&gt;
	var sectStub=0;&lt;br /&gt;
	var realStub=0;&lt;br /&gt;
	if (pg.re.stub.test(data)) {&lt;br /&gt;
		var s=data.parenSplit(pg.re.stub);&lt;br /&gt;
		for (var i=1; i&amp;lt;s.length; i=i+2) {&lt;br /&gt;
			if (s[i]) { ++sectStub; }&lt;br /&gt;
			else { ++realStub; }&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return { real: realStub, sect: sectStub };&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function isValidImageName(str){ // extend as needed...&lt;br /&gt;
	return ( str.indexOf('{') == -1 );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function isInStrippableNamespace(article) {&lt;br /&gt;
	return ( findInArray( pg.ns.nonArticleList, article.namespace() ) &amp;gt; -1 );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function isInMainNamespace(article) { return !isInStrippableNamespace(article); }&lt;br /&gt;
 &lt;br /&gt;
function anchorContainsImage(a) {&lt;br /&gt;
	// iterate over children of anchor a&lt;br /&gt;
	// see if any are images&lt;br /&gt;
	if (a===null) { return false; }&lt;br /&gt;
	kids=a.childNodes;&lt;br /&gt;
	for (var i=0; i&amp;lt;kids.length; ++i) { if (kids[i].nodeName=='IMG') { return true; } }&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
function isPopupLink(a) {&lt;br /&gt;
	// NB for performance reasons, TOC links generally return true&lt;br /&gt;
	// they should be stripped out later&lt;br /&gt;
 &lt;br /&gt;
	if (!markNopopupSpanLinks.done) { markNopopupSpanLinks(); }&lt;br /&gt;
	if (a.inNopopupSpan || a.className=='sortheader') { return false; }&lt;br /&gt;
 &lt;br /&gt;
	// FIXME is this faster inline?&lt;br /&gt;
	if (a.onmousedown || a.getAttribute('nopopup')) { return false; }&lt;br /&gt;
	var h=a.href;&lt;br /&gt;
	if (!pg.re.basenames.test(h)) { return false; }&lt;br /&gt;
	if ( !pg.re.urlNoPopup.test(h) ) { return true;	}&lt;br /&gt;
	return (&lt;br /&gt;
		(pg.re.email.test(h) || pg.re.contribs.test(h) || pg.re.backlinks.test(h)) &amp;amp;&amp;amp;&lt;br /&gt;
		h.indexOf('&amp;amp;limit=') == -1 );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function markNopopupSpanLinks() {&lt;br /&gt;
	if( !getValueOf('popupOnlyArticleLinks'))&lt;br /&gt;
		fixVectorMenuPopups();&lt;br /&gt;
 &lt;br /&gt;
	var s=getElementsByClassName(document, '*', &amp;quot;nopopups&amp;quot;)&lt;br /&gt;
	for (var i=0; i&amp;lt;s.length; ++i) {&lt;br /&gt;
		var as=s[i].getElementsByTagName('a');&lt;br /&gt;
		for (var j=0; j&amp;lt;as.length; ++j) {&lt;br /&gt;
			as[j].inNopopupSpan=true;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	markNopopupSpanLinks.done=true;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function fixVectorMenuPopups() {&lt;br /&gt;
	var vmenus = getElementsByClassName( document, 'div', 'vectorMenu');&lt;br /&gt;
	for( i= 0; vmenus &amp;amp;&amp;amp; i&amp;lt; vmenus.length; i++ ) {&lt;br /&gt;
		var h5 = vmenus[i].getElementsByTagName('h5')[0];&lt;br /&gt;
		if( h5) var a = h5.getElementsByTagName('a')[0];&lt;br /&gt;
		if( a ) a.inNopopupSpan=true;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: titles.js&lt;br /&gt;
// STARTFILE: cookies.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Cookie handling&lt;br /&gt;
// from http://www.quirksmode.org/js/cookies.html&lt;br /&gt;
 &lt;br /&gt;
var Cookie= {&lt;br /&gt;
	create: function(name,value,days)&lt;br /&gt;
	{&lt;br /&gt;
		var expires;&lt;br /&gt;
		if (days)&lt;br /&gt;
		{&lt;br /&gt;
			var date = new Date();&lt;br /&gt;
			date.setTime(date.getTime()+(days*24*60*60*1000));&lt;br /&gt;
			expires = &amp;quot;; expires=&amp;quot;+date.toGMTString();&lt;br /&gt;
		}&lt;br /&gt;
		else { expires = &amp;quot;&amp;quot;; }&lt;br /&gt;
		document.cookie = name+&amp;quot;=&amp;quot;+value+expires+&amp;quot;; path=/&amp;quot;;&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	read: function(name)&lt;br /&gt;
	{&lt;br /&gt;
		var nameEQ = name + &amp;quot;=&amp;quot;;&lt;br /&gt;
		var ca = document.cookie.split(';');&lt;br /&gt;
		for(var i=0;i &amp;lt; ca.length;i++)&lt;br /&gt;
		{&lt;br /&gt;
			var c = ca[i];&lt;br /&gt;
			while (c.charAt(0)==' ') { c = c.substring(1,c.length); }&lt;br /&gt;
			if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); }&lt;br /&gt;
		}&lt;br /&gt;
		return null;&lt;br /&gt;
	},&lt;br /&gt;
 &lt;br /&gt;
	erase: function(name)&lt;br /&gt;
	{&lt;br /&gt;
		Cookie.create(name,&amp;quot;&amp;quot;,-1);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: cookies.js&lt;br /&gt;
// STARTFILE: getpage.js&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Wiki-specific downloading&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
// Schematic for a getWiki call&lt;br /&gt;
//&lt;br /&gt;
//   getWiki-&amp;gt;-getPageWithCaching&lt;br /&gt;
//                    |&lt;br /&gt;
//       false        |          true&lt;br /&gt;
// getPage&amp;lt;-[findPictureInCache]-&amp;gt;-onComplete(a fake download)&lt;br /&gt;
//   \.&lt;br /&gt;
//     (async)-&amp;gt;addPageToCache(download)-&amp;gt;-onComplete(download)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/** @todo {document}&lt;br /&gt;
    @param {Title} article&lt;br /&gt;
    @param {Function} onComplete&lt;br /&gt;
    @param {integer} oldid&lt;br /&gt;
    @param {Navapopup} owner&lt;br /&gt;
*/&lt;br /&gt;
function getWiki(article, onComplete, oldid, owner) {&lt;br /&gt;
	// set ctype=text/css to get around opera gzip bug&lt;br /&gt;
	var url = pg.wiki.titlebase + article.removeAnchor().urlString() +&lt;br /&gt;
	    '&amp;amp;action=raw&amp;amp;ctype=text/css';&lt;br /&gt;
	if (oldid || oldid===0 || oldid==='0') { url += '&amp;amp;oldid='+oldid; }&lt;br /&gt;
	url += '&amp;amp;maxage=0&amp;amp;smaxage=0';&lt;br /&gt;
 &lt;br /&gt;
	getPageWithCaching(url, onComplete, owner);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// check cache to see if page exists&lt;br /&gt;
 &lt;br /&gt;
function getPageWithCaching(url, onComplete, owner) {&lt;br /&gt;
	log('getPageWithCaching, url='+url);&lt;br /&gt;
	var i=findInPageCache(url);&lt;br /&gt;
	if (i &amp;gt; -1) {&lt;br /&gt;
		var d=fakeDownload(url, owner.idNumber, onComplete,&lt;br /&gt;
				   pg.cache.pages[i].data, pg.cache.pages[i].lastModified,&lt;br /&gt;
				   owner);&lt;br /&gt;
	} else {&lt;br /&gt;
		var d=getPage(url, onComplete, owner);&lt;br /&gt;
		if (d &amp;amp;&amp;amp; owner &amp;amp;&amp;amp; owner.addDownload) {&lt;br /&gt;
			owner.addDownload(d);&lt;br /&gt;
			d.owner=owner;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getPage(url, onComplete, owner) {&lt;br /&gt;
	log('getPage');&lt;br /&gt;
	var callback= function (d) { if (!d.aborted) {addPageToCache(d); onComplete(d);} };&lt;br /&gt;
	return startDownload(url, owner.idNumber, callback);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function findInPageCache(url) {&lt;br /&gt;
	for (var i=0; i&amp;lt;pg.cache.pages.length; ++i) {&lt;br /&gt;
		if (url==pg.cache.pages[i].url) { return i; }&lt;br /&gt;
	}&lt;br /&gt;
	return -1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function addPageToCache(download) {&lt;br /&gt;
	log('addPageToCache '+download.url);&lt;br /&gt;
	var page = {url: download.url, data: download.data, lastModified: download.lastModified};&lt;br /&gt;
	return pg.cache.pages.push(page);&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: getpage.js&lt;br /&gt;
// STARTFILE: md5-2.2alpha.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message&lt;br /&gt;
 * Digest Algorithm, as defined in RFC 1321.&lt;br /&gt;
 * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005&lt;br /&gt;
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet&lt;br /&gt;
 * Distributed under the BSD License&lt;br /&gt;
 * See http://pajhome.org.uk/crypt/md5 for more info.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Configurable variables. You may need to tweak these to be compatible with&lt;br /&gt;
 * the server-side, but the defaults work in most cases.&lt;br /&gt;
 */&lt;br /&gt;
var hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase	     */&lt;br /&gt;
var b64pad  = &amp;quot;&amp;quot;; /* base-64 pad character. &amp;quot;=&amp;quot; for strict RFC compliance   */&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * These are the functions you'll usually want to call&lt;br /&gt;
 * They take string arguments and return either hex or base-64 encoded strings&lt;br /&gt;
 */&lt;br /&gt;
function hex_md5(s)    { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }&lt;br /&gt;
function b64_md5(s)    { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }&lt;br /&gt;
function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }&lt;br /&gt;
function hex_hmac_md5(k, d)&lt;br /&gt;
  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }&lt;br /&gt;
function b64_hmac_md5(k, d)&lt;br /&gt;
  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }&lt;br /&gt;
function any_hmac_md5(k, d, e)&lt;br /&gt;
  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Perform a simple self-test to see if the VM is working&lt;br /&gt;
 */&lt;br /&gt;
function md5_vm_test()&lt;br /&gt;
{&lt;br /&gt;
  return hex_md5(&amp;quot;abc&amp;quot;) == &amp;quot;900150983cd24fb0d6963f7d28e17f72&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Calculate the MD5 of a raw string&lt;br /&gt;
 */&lt;br /&gt;
function rstr_md5(s)&lt;br /&gt;
{&lt;br /&gt;
  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Calculate the HMAC-MD5, of a key and some data (raw strings)&lt;br /&gt;
 */&lt;br /&gt;
function rstr_hmac_md5(key, data)&lt;br /&gt;
{&lt;br /&gt;
  var bkey = rstr2binl(key);&lt;br /&gt;
  if(bkey.length &amp;gt; 16) bkey = binl_md5(bkey, key.length * 8);&lt;br /&gt;
 &lt;br /&gt;
  var ipad = Array(16), opad = Array(16);&lt;br /&gt;
  for(var i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
  {&lt;br /&gt;
    ipad[i] = bkey[i] ^ 0x36363636;&lt;br /&gt;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);&lt;br /&gt;
  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to a hex string&lt;br /&gt;
 */&lt;br /&gt;
function rstr2hex(input)&lt;br /&gt;
{&lt;br /&gt;
  var hex_tab = hexcase ? &amp;quot;0123456789ABCDEF&amp;quot; : &amp;quot;0123456789abcdef&amp;quot;;&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  var x;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length; i++)&lt;br /&gt;
  {&lt;br /&gt;
    x = input.charCodeAt(i);&lt;br /&gt;
    output += hex_tab.charAt((x &amp;gt;&amp;gt;&amp;gt; 4) &amp;amp; 0x0F)&lt;br /&gt;
	   +  hex_tab.charAt( x	       &amp;amp; 0x0F);&lt;br /&gt;
  }&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to a base-64 string&lt;br /&gt;
 */&lt;br /&gt;
function rstr2b64(input)&lt;br /&gt;
{&lt;br /&gt;
  var tab = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&amp;quot;;&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  var len = input.length;&lt;br /&gt;
  for(var i = 0; i &amp;lt; len; i += 3)&lt;br /&gt;
  {&lt;br /&gt;
    var triplet = (input.charCodeAt(i) &amp;lt;&amp;lt; 16)&lt;br /&gt;
		| (i + 1 &amp;lt; len ? input.charCodeAt(i+1) &amp;lt;&amp;lt; 8 : 0)&lt;br /&gt;
		| (i + 2 &amp;lt; len ? input.charCodeAt(i+2)	    : 0);&lt;br /&gt;
    for(var j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
    {&lt;br /&gt;
      if(i * 8 + j * 6 &amp;gt; input.length * 8) output += b64pad;&lt;br /&gt;
      else output += tab.charAt((triplet &amp;gt;&amp;gt;&amp;gt; 6*(3-j)) &amp;amp; 0x3F);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to an arbitrary string encoding&lt;br /&gt;
 */&lt;br /&gt;
function rstr2any(input, encoding)&lt;br /&gt;
{&lt;br /&gt;
  var divisor = encoding.length;&lt;br /&gt;
  var remainders = Array();&lt;br /&gt;
  var i, q, x, quotient;&lt;br /&gt;
 &lt;br /&gt;
  /* Convert to an array of 16-bit big-endian values, forming the dividend */&lt;br /&gt;
  var dividend = Array(input.length / 2);&lt;br /&gt;
  for(i = 0; i &amp;lt; dividend.length; i++)&lt;br /&gt;
  {&lt;br /&gt;
    dividend[i] = (input.charCodeAt(i * 2) &amp;lt;&amp;lt; 8) | input.charCodeAt(i * 2 + 1);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  /*&lt;br /&gt;
   * Repeatedly perform a long division. The binary array forms the dividend,&lt;br /&gt;
   * the length of the encoding is the divisor. Once computed, the quotient&lt;br /&gt;
   * forms the dividend for the next step. We stop when the dividend is zero.&lt;br /&gt;
   * All remainders are stored for later use.&lt;br /&gt;
   */&lt;br /&gt;
  while(dividend.length &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    quotient = Array();&lt;br /&gt;
    x = 0;&lt;br /&gt;
    for(i = 0; i &amp;lt; dividend.length; i++)&lt;br /&gt;
    {&lt;br /&gt;
      x = (x &amp;lt;&amp;lt; 16) + dividend[i];&lt;br /&gt;
      q = Math.floor(x / divisor);&lt;br /&gt;
      x -= q * divisor;&lt;br /&gt;
      if(quotient.length &amp;gt; 0 || q &amp;gt; 0)&lt;br /&gt;
	quotient[quotient.length] = q;&lt;br /&gt;
    }&lt;br /&gt;
    remainders[remainders.length] = x;&lt;br /&gt;
    dividend = quotient;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  /* Convert the remainders to the output string */&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(i = remainders.length - 1; i &amp;gt;= 0; i--)&lt;br /&gt;
    output += encoding.charAt(remainders[i]);&lt;br /&gt;
 &lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Encode a string as utf-8.&lt;br /&gt;
 * For efficiency, this assumes the input is valid utf-16.&lt;br /&gt;
 */&lt;br /&gt;
function str2rstr_utf8(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  var i = -1;&lt;br /&gt;
  var x, y;&lt;br /&gt;
 &lt;br /&gt;
  while(++i &amp;lt; input.length)&lt;br /&gt;
  {&lt;br /&gt;
    /* Decode utf-16 surrogate pairs */&lt;br /&gt;
    x = input.charCodeAt(i);&lt;br /&gt;
    y = i + 1 &amp;lt; input.length ? input.charCodeAt(i + 1) : 0;&lt;br /&gt;
    if(0xD800 &amp;lt;= x &amp;amp;&amp;amp; x &amp;lt;= 0xDBFF &amp;amp;&amp;amp; 0xDC00 &amp;lt;= y &amp;amp;&amp;amp; y &amp;lt;= 0xDFFF)&lt;br /&gt;
    {&lt;br /&gt;
      x = 0x10000 + ((x &amp;amp; 0x03FF) &amp;lt;&amp;lt; 10) + (y &amp;amp; 0x03FF);&lt;br /&gt;
      i++;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /* Encode output as utf-8 */&lt;br /&gt;
    if(x &amp;lt;= 0x7F)&lt;br /&gt;
      output += String.fromCharCode(x);&lt;br /&gt;
    else if(x &amp;lt;= 0x7FF)&lt;br /&gt;
      output += String.fromCharCode(0xC0 | ((x &amp;gt;&amp;gt;&amp;gt; 6 ) &amp;amp; 0x1F),&lt;br /&gt;
				    0x80 | ( x	       &amp;amp; 0x3F));&lt;br /&gt;
    else if(x &amp;lt;= 0xFFFF)&lt;br /&gt;
      output += String.fromCharCode(0xE0 | ((x &amp;gt;&amp;gt;&amp;gt; 12) &amp;amp; 0x0F),&lt;br /&gt;
				    0x80 | ((x &amp;gt;&amp;gt;&amp;gt; 6 ) &amp;amp; 0x3F),&lt;br /&gt;
				    0x80 | ( x	       &amp;amp; 0x3F));&lt;br /&gt;
    else if(x &amp;lt;= 0x1FFFFF)&lt;br /&gt;
      output += String.fromCharCode(0xF0 | ((x &amp;gt;&amp;gt;&amp;gt; 18) &amp;amp; 0x07),&lt;br /&gt;
				    0x80 | ((x &amp;gt;&amp;gt;&amp;gt; 12) &amp;amp; 0x3F),&lt;br /&gt;
				    0x80 | ((x &amp;gt;&amp;gt;&amp;gt; 6 ) &amp;amp; 0x3F),&lt;br /&gt;
				    0x80 | ( x	       &amp;amp; 0x3F));&lt;br /&gt;
  }&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Encode a string as utf-16&lt;br /&gt;
 */&lt;br /&gt;
function str2rstr_utf16le(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length; i++)&lt;br /&gt;
    output += String.fromCharCode( input.charCodeAt(i)	      &amp;amp; 0xFF,&lt;br /&gt;
				  (input.charCodeAt(i) &amp;gt;&amp;gt;&amp;gt; 8) &amp;amp; 0xFF);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function str2rstr_utf16be(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length; i++)&lt;br /&gt;
    output += String.fromCharCode((input.charCodeAt(i) &amp;gt;&amp;gt;&amp;gt; 8) &amp;amp; 0xFF,&lt;br /&gt;
				   input.charCodeAt(i)	      &amp;amp; 0xFF);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to an array of little-endian words&lt;br /&gt;
 * Characters &amp;gt;255 have their high-byte silently ignored.&lt;br /&gt;
 */&lt;br /&gt;
function rstr2binl(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = Array(input.length &amp;gt;&amp;gt; 2);&lt;br /&gt;
  for(var i = 0; i &amp;lt; output.length; i++)&lt;br /&gt;
    output[i] = 0;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length * 8; i += 8)&lt;br /&gt;
    output[i&amp;gt;&amp;gt;5] |= (input.charCodeAt(i / 8) &amp;amp; 0xFF) &amp;lt;&amp;lt; (i%32);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Convert an array of little-endian words to a string&lt;br /&gt;
 */&lt;br /&gt;
function binl2rstr(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length * 32; i += 8)&lt;br /&gt;
    output += String.fromCharCode((input[i&amp;gt;&amp;gt;5] &amp;gt;&amp;gt;&amp;gt; (i % 32)) &amp;amp; 0xFF);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Calculate the MD5 of an array of little-endian words, and a bit length.&lt;br /&gt;
 */&lt;br /&gt;
function binl_md5(x, len)&lt;br /&gt;
{&lt;br /&gt;
  /* append padding */&lt;br /&gt;
  x[len &amp;gt;&amp;gt; 5] |= 0x80 &amp;lt;&amp;lt; ((len) % 32);&lt;br /&gt;
  x[(((len + 64) &amp;gt;&amp;gt;&amp;gt; 9) &amp;lt;&amp;lt; 4) + 14] = len;&lt;br /&gt;
 &lt;br /&gt;
  var a =  1732584193;&lt;br /&gt;
  var b = -271733879;&lt;br /&gt;
  var c = -1732584194;&lt;br /&gt;
  var d =  271733878;&lt;br /&gt;
 &lt;br /&gt;
  for(var i = 0; i &amp;lt; x.length; i += 16)&lt;br /&gt;
  {&lt;br /&gt;
    var olda = a;&lt;br /&gt;
    var oldb = b;&lt;br /&gt;
    var oldc = c;&lt;br /&gt;
    var oldd = d;&lt;br /&gt;
 &lt;br /&gt;
    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);&lt;br /&gt;
    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);&lt;br /&gt;
    c = md5_ff(c, d, a, b, x[i+ 2], 17,	 606105819);&lt;br /&gt;
    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);&lt;br /&gt;
    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);&lt;br /&gt;
    d = md5_ff(d, a, b, c, x[i+ 5], 12,	 1200080426);&lt;br /&gt;
    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);&lt;br /&gt;
    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);&lt;br /&gt;
    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,	 1770035416);&lt;br /&gt;
    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);&lt;br /&gt;
    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);&lt;br /&gt;
    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);&lt;br /&gt;
    a = md5_ff(a, b, c, d, x[i+12], 7 ,	 1804603682);&lt;br /&gt;
    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);&lt;br /&gt;
    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);&lt;br /&gt;
    b = md5_ff(b, c, d, a, x[i+15], 22,	 1236535329);&lt;br /&gt;
 &lt;br /&gt;
    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);&lt;br /&gt;
    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);&lt;br /&gt;
    c = md5_gg(c, d, a, b, x[i+11], 14,	 643717713);&lt;br /&gt;
    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);&lt;br /&gt;
    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);&lt;br /&gt;
    d = md5_gg(d, a, b, c, x[i+10], 9 ,	 38016083);&lt;br /&gt;
    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);&lt;br /&gt;
    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);&lt;br /&gt;
    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,	 568446438);&lt;br /&gt;
    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);&lt;br /&gt;
    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);&lt;br /&gt;
    b = md5_gg(b, c, d, a, x[i+ 8], 20,	 1163531501);&lt;br /&gt;
    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);&lt;br /&gt;
    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);&lt;br /&gt;
    c = md5_gg(c, d, a, b, x[i+ 7], 14,	 1735328473);&lt;br /&gt;
    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);&lt;br /&gt;
 &lt;br /&gt;
    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);&lt;br /&gt;
    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);&lt;br /&gt;
    c = md5_hh(c, d, a, b, x[i+11], 16,	 1839030562);&lt;br /&gt;
    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);&lt;br /&gt;
    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);&lt;br /&gt;
    d = md5_hh(d, a, b, c, x[i+ 4], 11,	 1272893353);&lt;br /&gt;
    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);&lt;br /&gt;
    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);&lt;br /&gt;
    a = md5_hh(a, b, c, d, x[i+13], 4 ,	 681279174);&lt;br /&gt;
    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);&lt;br /&gt;
    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);&lt;br /&gt;
    b = md5_hh(b, c, d, a, x[i+ 6], 23,	 76029189);&lt;br /&gt;
    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);&lt;br /&gt;
    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);&lt;br /&gt;
    c = md5_hh(c, d, a, b, x[i+15], 16,	 530742520);&lt;br /&gt;
    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);&lt;br /&gt;
 &lt;br /&gt;
    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);&lt;br /&gt;
    d = md5_ii(d, a, b, c, x[i+ 7], 10,	 1126891415);&lt;br /&gt;
    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);&lt;br /&gt;
    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);&lt;br /&gt;
    a = md5_ii(a, b, c, d, x[i+12], 6 ,	 1700485571);&lt;br /&gt;
    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);&lt;br /&gt;
    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);&lt;br /&gt;
    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);&lt;br /&gt;
    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,	 1873313359);&lt;br /&gt;
    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);&lt;br /&gt;
    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);&lt;br /&gt;
    b = md5_ii(b, c, d, a, x[i+13], 21,	 1309151649);&lt;br /&gt;
    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);&lt;br /&gt;
    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);&lt;br /&gt;
    c = md5_ii(c, d, a, b, x[i+ 2], 15,	 718787259);&lt;br /&gt;
    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);&lt;br /&gt;
 &lt;br /&gt;
    a = safe_add(a, olda);&lt;br /&gt;
    b = safe_add(b, oldb);&lt;br /&gt;
    c = safe_add(c, oldc);&lt;br /&gt;
    d = safe_add(d, oldd);&lt;br /&gt;
  }&lt;br /&gt;
  return Array(a, b, c, d);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * These functions implement the four basic operations the algorithm uses.&lt;br /&gt;
 */&lt;br /&gt;
function md5_cmn(q, a, b, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);&lt;br /&gt;
}&lt;br /&gt;
function md5_ff(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn((b &amp;amp; c) | ((~b) &amp;amp; d), a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
function md5_gg(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn((b &amp;amp; d) | (c &amp;amp; (~d)), a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
function md5_hh(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
function md5_ii(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally&lt;br /&gt;
 * to work around bugs in some JS interpreters.&lt;br /&gt;
 */&lt;br /&gt;
function safe_add(x, y)&lt;br /&gt;
{&lt;br /&gt;
  var lsw = (x &amp;amp; 0xFFFF) + (y &amp;amp; 0xFFFF);&lt;br /&gt;
  var msw = (x &amp;gt;&amp;gt; 16) + (y &amp;gt;&amp;gt; 16) + (lsw &amp;gt;&amp;gt; 16);&lt;br /&gt;
  return (msw &amp;lt;&amp;lt; 16) | (lsw &amp;amp; 0xFFFF);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Bitwise rotate a 32-bit number to the left.&lt;br /&gt;
 */&lt;br /&gt;
function bit_rol(num, cnt)&lt;br /&gt;
{&lt;br /&gt;
  return (num &amp;lt;&amp;lt; cnt) | (num &amp;gt;&amp;gt;&amp;gt; (32 - cnt));&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: md5-2.2alpha.js&lt;br /&gt;
// STARTFILE: parensplit.js&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// parenSplit&lt;br /&gt;
 &lt;br /&gt;
// String.prototype.parenSplit should do what ECMAscript says&lt;br /&gt;
// String.prototype.split does, interspersing paren matches between&lt;br /&gt;
// the split elements&lt;br /&gt;
 &lt;br /&gt;
if (String('abc'.split(/(b)/))!='a,b,c') {&lt;br /&gt;
	// broken String.split, e.g. konq, IE&lt;br /&gt;
	String.prototype.parenSplit=function (re) {&lt;br /&gt;
		re=nonGlobalRegex(re);&lt;br /&gt;
		var s=this;&lt;br /&gt;
		var m=re.exec(s);&lt;br /&gt;
		var ret=[];&lt;br /&gt;
		while (m &amp;amp;&amp;amp; s) {&lt;br /&gt;
			// without the following loop, we have&lt;br /&gt;
			// 'ab'.parenSplit(/a|(b)/) != 'ab'.split(/a|(b)/)&lt;br /&gt;
			for(var i=0; i&amp;lt;m.length; ++i) {&lt;br /&gt;
				if (typeof m[i]=='undefined') m[i]='';&lt;br /&gt;
			}&lt;br /&gt;
			ret.push(s.substring(0,m.index));&lt;br /&gt;
			ret = ret.concat(m.slice(1));&lt;br /&gt;
			s=s.substring(m.index + m[0].length);&lt;br /&gt;
			m=re.exec(s);&lt;br /&gt;
		}&lt;br /&gt;
		ret.push(s);&lt;br /&gt;
		return ret;&lt;br /&gt;
	};&lt;br /&gt;
} else {&lt;br /&gt;
	String.prototype.parenSplit=function (re) { return this.split(re); };&lt;br /&gt;
	String.prototype.parenSplit.isNative=true;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function nonGlobalRegex(re) {&lt;br /&gt;
	var s=re.toString();&lt;br /&gt;
	flags='';&lt;br /&gt;
	for (var j=s.length; s.charAt(j) != '/'; --j) {&lt;br /&gt;
		if (s.charAt(j) != 'g') { flags += s.charAt(j); }&lt;br /&gt;
	}&lt;br /&gt;
	var t=s.substring(1,j);&lt;br /&gt;
	return RegExp(t,flags);&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: parensplit.js&lt;br /&gt;
// STARTFILE: tools.js&lt;br /&gt;
// IE madness with encoding&lt;br /&gt;
// ========================&lt;br /&gt;
//&lt;br /&gt;
// suppose throughout that the page is in utf8, like wikipedia&lt;br /&gt;
//&lt;br /&gt;
// if a is an anchor DOM element and a.href should consist of&lt;br /&gt;
//&lt;br /&gt;
// http://host.name.here/wiki/foo?bar=baz&lt;br /&gt;
//&lt;br /&gt;
// then IE gives foo as &amp;quot;latin1-encoded&amp;quot; utf8; we have foo = decode_utf8(decodeURI(foo_ie))&lt;br /&gt;
// but IE gives bar=baz correctly as plain utf8&lt;br /&gt;
//&lt;br /&gt;
// ---------------------------------&lt;br /&gt;
//&lt;br /&gt;
// IE's xmlhttp doesn't understand utf8 urls. Have to use encodeURI here.&lt;br /&gt;
//&lt;br /&gt;
// ---------------------------------&lt;br /&gt;
//&lt;br /&gt;
// summat else&lt;br /&gt;
 &lt;br /&gt;
// Source: http://aktuell.de.selfhtml.org/artikel/javascript/utf8b64/utf8.htm&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function encode_utf8(rohtext) {&lt;br /&gt;
	// dient der Normalisierung des Zeilenumbruchs&lt;br /&gt;
	rohtext = rohtext.replace(/\r\n/g,&amp;quot;\n&amp;quot;);&lt;br /&gt;
	var utftext = &amp;quot;&amp;quot;;&lt;br /&gt;
	for(var n=0; n&amp;lt;rohtext.length; n++)&lt;br /&gt;
	{&lt;br /&gt;
		// ermitteln des Unicodes des  aktuellen Zeichens&lt;br /&gt;
		var c=rohtext.charCodeAt(n);&lt;br /&gt;
		// alle Zeichen von 0-127 =&amp;gt; 1byte&lt;br /&gt;
		if (c&amp;lt;128)&lt;br /&gt;
			utftext += String.fromCharCode(c);&lt;br /&gt;
		// alle Zeichen von 127 bis 2047 =&amp;gt; 2byte&lt;br /&gt;
		else if((c&amp;gt;127) &amp;amp;&amp;amp; (c&amp;lt;2048)) {&lt;br /&gt;
			utftext += String.fromCharCode((c&amp;gt;&amp;gt;6)|192);&lt;br /&gt;
			utftext += String.fromCharCode((c&amp;amp;63)|128);}&lt;br /&gt;
		// alle Zeichen von 2048 bis 66536 =&amp;gt; 3byte&lt;br /&gt;
		else {&lt;br /&gt;
			utftext += String.fromCharCode((c&amp;gt;&amp;gt;12)|224);&lt;br /&gt;
			utftext += String.fromCharCode(((c&amp;gt;&amp;gt;6)&amp;amp;63)|128);&lt;br /&gt;
			utftext += String.fromCharCode((c&amp;amp;63)|128);}&lt;br /&gt;
	}&lt;br /&gt;
	return utftext;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getJsObj(json) {&lt;br /&gt;
	try {&lt;br /&gt;
		var json_ret = eval('(' + json + ')');&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		errlog('Something went wrong with getJsobj, json='+json);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	if( json_ret['warnings'] ) {&lt;br /&gt;
		for( var w=0; w &amp;lt; json_ret['warnings'].length; w++ ) {&lt;br /&gt;
			log( json_ret['warnings'][w]['*'] );&lt;br /&gt;
		}&lt;br /&gt;
	} else if ( json_ret['error'] ) {&lt;br /&gt;
		errlog( json_ret['error'].code + ': ' + json_ret['error'].info );&lt;br /&gt;
	}&lt;br /&gt;
	return json_ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function anyChild(obj) {&lt;br /&gt;
	for (var p in obj) {&lt;br /&gt;
		return obj[p];&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
function decode_utf8(utftext) {&lt;br /&gt;
	var plaintext = &amp;quot;&amp;quot;; var i=0, c=0, c1=0, c2=0;&lt;br /&gt;
	// while-Schleife, weil einige Zeichen uebersprungen werden&lt;br /&gt;
	while(i&amp;lt;utftext.length)&lt;br /&gt;
	{&lt;br /&gt;
		c = utftext.charCodeAt(i);&lt;br /&gt;
		if (c&amp;lt;128) {&lt;br /&gt;
			plaintext += String.fromCharCode(c);&lt;br /&gt;
			i++;}&lt;br /&gt;
		else if((c&amp;gt;191) &amp;amp;&amp;amp; (c&amp;lt;224)) {&lt;br /&gt;
			c2 = utftext.charCodeAt(i+1);&lt;br /&gt;
			plaintext += String.fromCharCode(((c&amp;amp;31)&amp;lt;&amp;lt;6) | (c2&amp;amp;63));&lt;br /&gt;
			i+=2;}&lt;br /&gt;
		else {&lt;br /&gt;
			c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2);&lt;br /&gt;
			plaintext += String.fromCharCode(((c&amp;amp;15)&amp;lt;&amp;lt;12) | ((c2&amp;amp;63)&amp;lt;&amp;lt;6) | (c3&amp;amp;63));&lt;br /&gt;
			i+=3;}&lt;br /&gt;
	}&lt;br /&gt;
	return plaintext;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function upcaseFirst(str) {&lt;br /&gt;
	if (typeof str != typeof '' || str=='') return '';&lt;br /&gt;
	return str.charAt(0).toUpperCase() + str.substring(1);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function findInArray(arr, foo) {&lt;br /&gt;
	if (!arr || !arr.length) { return -1; }&lt;br /&gt;
	var len=arr.length;&lt;br /&gt;
	for (var i=0; i&amp;lt;len; ++i) { if (arr[i]==foo) { return i; } }&lt;br /&gt;
	return -1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function nextOne (array, value) {&lt;br /&gt;
	// NB if the array has two consecutive entries equal&lt;br /&gt;
	//    then this will loop on successive calls&lt;br /&gt;
	var i=findInArray(array, value);&lt;br /&gt;
	if (i&amp;lt;0) { return null; }&lt;br /&gt;
	return array[i+1];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function literalizeRegex(str){&lt;br /&gt;
	return str.replace(RegExp('([-.|()\\+?*^${}\\[\\]])', 'g'), '\\$1');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
String.prototype.entify=function() {&lt;br /&gt;
	//var shy='&amp;amp;shy;';&lt;br /&gt;
	return this.split('&amp;amp;').join('&amp;amp;amp;').split('&amp;lt;').join('&amp;amp;lt;').split('&amp;gt;').join('&amp;amp;gt;'/*+shy*/).split('&amp;quot;').join('&amp;amp;quot;');&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
function findThis(array, value) {&lt;br /&gt;
	if (typeof array.length == 'undefined') { return null; }&lt;br /&gt;
	for (var i=0; i&amp;lt;array.length; ++i) {&lt;br /&gt;
		if (array[i]==value) { return i; }&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function removeNulls(list) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (list[i]) {&lt;br /&gt;
			ret.push(list[i]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
function joinPath(list) {&lt;br /&gt;
	return removeNulls(list).join('/');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function simplePrintf(str, subs) {&lt;br /&gt;
	if (!str || !subs) { return str; }&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	var s=str.parenSplit(/(%s|\$[0-9]+)/);&lt;br /&gt;
	var i=0;&lt;br /&gt;
	do {&lt;br /&gt;
		ret.push(s.shift());&lt;br /&gt;
		if ( !s.length ) { break; }&lt;br /&gt;
		var cmd=s.shift();&lt;br /&gt;
		if (cmd == '%s') {&lt;br /&gt;
			if ( i &amp;lt; subs.length ) { ret.push(subs[i]); } else { ret.push(cmd); }&lt;br /&gt;
			++i;&lt;br /&gt;
		} else {&lt;br /&gt;
			var j=parseInt( cmd.replace('$', ''), 10 ) - 1;&lt;br /&gt;
			if ( j &amp;gt; -1 &amp;amp;&amp;amp; j &amp;lt; subs.length ) { ret.push(subs[j]); } else { ret.push(cmd); }&lt;br /&gt;
		}&lt;br /&gt;
	} while (s.length &amp;gt; 0);&lt;br /&gt;
	return ret.join('');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function max(a,b){return a&amp;lt;b ? b : a;}&lt;br /&gt;
function min(a,b){return a&amp;gt;b ? b : a;}&lt;br /&gt;
 &lt;br /&gt;
function isString(x) { return (typeof x === 'string' || x instanceof String); }&lt;br /&gt;
//function isNumber(x) { return (typeof x === 'number' || x instanceof Number); }&lt;br /&gt;
function isRegExp(x) { return x instanceof RegExp; }&lt;br /&gt;
function isArray (x) { return x instanceof Array; }&lt;br /&gt;
function isObject(x) { return x instanceof Object; }&lt;br /&gt;
function isFunction(x) {&lt;br /&gt;
    return !isRegExp(x) &amp;amp;&amp;amp; (typeof x === 'function' || x instanceof Function);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function repeatString(s,mult) {&lt;br /&gt;
	var ret='';&lt;br /&gt;
	for (var i=0; i&amp;lt;mult; ++i) { ret += s; }&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function zeroFill(s, min) {&lt;br /&gt;
	min = min || 2;&lt;br /&gt;
	var t=s.toString();&lt;br /&gt;
	return repeatString('0', min - t.length) + t;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function map(f, o) {&lt;br /&gt;
	if (isArray(o)) { return map_array(f,o); }&lt;br /&gt;
	return map_object(f,o);&lt;br /&gt;
}&lt;br /&gt;
function map_array(f,o) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;o.length; ++i) {&lt;br /&gt;
		ret.push(f(o[i]));&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
function map_object(f,o) {&lt;br /&gt;
	var ret={};&lt;br /&gt;
	for (var i in o) { ret[o]=f(o[i]); }&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: tools.js&lt;br /&gt;
// STARTFILE: dab.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Dab-fixing code&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function retargetDab(newTarget, oldTarget, friendlyCurrentArticleName, titleToEdit) {&lt;br /&gt;
	log('retargetDab: newTarget='+newTarget + ' oldTarget=' + oldTarget);&lt;br /&gt;
	return changeLinkTargetLink(&lt;br /&gt;
	{newTarget: newTarget,&lt;br /&gt;
			text: newTarget.split(' ').join('&amp;amp;nbsp;'),&lt;br /&gt;
			hint: tprintf('disambigHint', [newTarget]),&lt;br /&gt;
			summary: simplePrintf(&lt;br /&gt;
				    getValueOf('popupFixDabsSummary'), [friendlyCurrentArticleName, newTarget ]),&lt;br /&gt;
			clickButton: 'wpDiff', minor: true, oldTarget: oldTarget,&lt;br /&gt;
			watch: getValueOf('popupWatchDisambiggedPages'),&lt;br /&gt;
			title: titleToEdit});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function listLinks(wikitext, oldTarget, titleToEdit) {&lt;br /&gt;
	// mediawiki strips trailing spaces, so we do the same&lt;br /&gt;
	// testcase: http://en.wikipedia.org/w/index.php?title=Radial&amp;amp;oldid=97365633&lt;br /&gt;
	var reg=RegExp('\\[\\[([^|]*?) *(\\||\\]\\])', 'gi');&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	var splitted=wikitext.parenSplit(reg);&lt;br /&gt;
	// ^[a-z]+ should match interwiki links, hopefully (case-insensitive)&lt;br /&gt;
	// and ^[a-z]* should match those and [[:Category...]] style links too&lt;br /&gt;
	var omitRegex=RegExp('^[a-z]*:|^[Ss]pecial:|^[Ii]mage|^[Cc]ategory');&lt;br /&gt;
	var friendlyCurrentArticleName= oldTarget.toString();&lt;br /&gt;
	var wikPos = getValueOf('popupDabWiktionary');&lt;br /&gt;
 &lt;br /&gt;
	for (var i=1; i&amp;lt;splitted.length; i=i+3) {&lt;br /&gt;
		if (typeof splitted[i] == typeof 'string' &amp;amp;&amp;amp; splitted[i].length&amp;gt;0 &amp;amp;&amp;amp; !omitRegex.test(splitted[i])) {&lt;br /&gt;
			ret.push( retargetDab(splitted[i], oldTarget, friendlyCurrentArticleName, titleToEdit) );&lt;br /&gt;
		} /* if */&lt;br /&gt;
	} /* for loop */&lt;br /&gt;
 &lt;br /&gt;
	ret = rmDupesFromSortedList(ret.sort());&lt;br /&gt;
 &lt;br /&gt;
	if (wikPos) {&lt;br /&gt;
		var wikTarget='wiktionary:' +&lt;br /&gt;
			friendlyCurrentArticleName.replace( RegExp('^(.+)\\s+[(][^)]+[)]\\s*$'), '$1' );&lt;br /&gt;
 &lt;br /&gt;
		var meth;&lt;br /&gt;
		if (wikPos.toLowerCase() == 'first') { meth = 'unshift'; }&lt;br /&gt;
		else { meth = 'push'; }&lt;br /&gt;
 &lt;br /&gt;
		ret[meth]( retargetDab(wikTarget, oldTarget, friendlyCurrentArticleName, titleToEdit) );&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	ret.push(changeLinkTargetLink(&lt;br /&gt;
	{ newTarget: null,&lt;br /&gt;
			text: popupString('remove this link').split(' ').join('&amp;amp;nbsp;'),&lt;br /&gt;
			hint: popupString(&amp;quot;remove all links to this disambig page from this article&amp;quot;),&lt;br /&gt;
			clickButton: &amp;quot;wpDiff&amp;quot;, oldTarget: oldTarget,&lt;br /&gt;
			summary: simplePrintf(getValueOf('popupRmDabLinkSummary'), [friendlyCurrentArticleName]),&lt;br /&gt;
			watch: getValueOf('popupWatchDisambiggedPages'),&lt;br /&gt;
			title: titleToEdit&lt;br /&gt;
			}));&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function rmDupesFromSortedList(list) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (ret.length===0 || list[i]!=ret[ret.length-1]) { ret.push(list[i]); }&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function makeFixDab(data, navpop) {&lt;br /&gt;
	// grab title from parent popup if there is one; default exists in changeLinkTargetLink&lt;br /&gt;
	var titleToEdit=(navpop.parentPopup &amp;amp;&amp;amp; navpop.parentPopup.article.toString());&lt;br /&gt;
	var list=listLinks(data, navpop.originalArticle, titleToEdit);&lt;br /&gt;
	if (list.length===0) { log('listLinks returned empty list'); return null; }&lt;br /&gt;
	var html='&amp;lt;hr&amp;gt;' + popupString('Click to disambiguate this link to:') + '&amp;lt;br&amp;gt;';&lt;br /&gt;
	html+=list.join(', ');&lt;br /&gt;
	return html;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function makeFixDabs(wikiText, navpop) {&lt;br /&gt;
	if (getValueOf('popupFixDabs') &amp;amp;&amp;amp; isDisambig(wikiText, navpop.article) &amp;amp;&amp;amp;&lt;br /&gt;
	    Title.fromURL(location.href).namespace() != pg.ns.special &amp;amp;&amp;amp;&lt;br /&gt;
	    navpop.article.talkPage() ) {&lt;br /&gt;
		setPopupHTML(makeFixDab(wikiText, navpop), 'popupFixDab', navpop.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function popupRedlinkHTML(article) {&lt;br /&gt;
	return changeLinkTargetLink(&lt;br /&gt;
		{ newTarget: null, text: popupString('remove this link').split(' ').join('&amp;amp;nbsp;'),&lt;br /&gt;
			hint: popupString(&amp;quot;remove all links to this page from this article&amp;quot;),&lt;br /&gt;
			clickButton: &amp;quot;wpDiff&amp;quot;,&lt;br /&gt;
			oldTarget: article.toString(),&lt;br /&gt;
			summary: simplePrintf(getValueOf('popupRedlinkSummary'), [article.toString()])});&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: dab.js&lt;br /&gt;
// STARTFILE: htmloutput.js&lt;br /&gt;
 &lt;br /&gt;
function appendPopupContent(obj, elementId, popupId, onSuccess) {&lt;br /&gt;
	return setPopupHTML(obj, elementId, popupId, onSuccess, true);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// this has to use a timer loop as we don't know if the DOM element exists when we want to set the text&lt;br /&gt;
function setPopupHTML (str, elementId, popupId, onSuccess, append) {&lt;br /&gt;
	if (elementId=='popupPreview') {&lt;br /&gt;
	}&lt;br /&gt;
	if (typeof popupId === 'undefined') {&lt;br /&gt;
		//console.error('popupId is not defined in setPopupHTML, html='+str.substring(0,100));&lt;br /&gt;
		popupId = pg.idNumber;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	var popupElement=document.getElementById(elementId+popupId);&lt;br /&gt;
	if (popupElement) {&lt;br /&gt;
		if (!append) { popupElement.innerHTML=''; }&lt;br /&gt;
		if (isString(str)) {&lt;br /&gt;
			popupElement.innerHTML+=str;&lt;br /&gt;
		} else {&lt;br /&gt;
			popupElement.appendChild(str);&lt;br /&gt;
		}&lt;br /&gt;
		if (onSuccess) { onSuccess(); }&lt;br /&gt;
		setTimeout(checkPopupPosition, 100);&lt;br /&gt;
		return true;&lt;br /&gt;
	} else {&lt;br /&gt;
		// call this function again in a little while...&lt;br /&gt;
		setTimeout(function(){&lt;br /&gt;
				setPopupHTML(str,elementId,popupId,onSuccess);&lt;br /&gt;
			}, 600);&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function setPopupTrailer(str,id) {return setPopupHTML(str, 'popupData', id);}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function fillEmptySpans(args) { return fillEmptySpans2(args); }&lt;br /&gt;
 &lt;br /&gt;
// args.navpopup is mandatory&lt;br /&gt;
// optional: args.redir, args.redirTarget&lt;br /&gt;
// FIXME: ye gods, this is ugly stuff&lt;br /&gt;
function fillEmptySpans2(args) { // if redir is present and true then redirTarget is mandatory&lt;br /&gt;
	var redir=true;&lt;br /&gt;
	if (typeof args != 'object' || typeof args.redir == 'undefined' || !args.redir) { redir=false; }&lt;br /&gt;
	var a=args.navpopup.parentAnchor;&lt;br /&gt;
 &lt;br /&gt;
	var article, hint=null, oldid=null, params={};&lt;br /&gt;
	if (redir &amp;amp;&amp;amp; typeof args.redirTarget == typeof {}) {&lt;br /&gt;
		article=args.redirTarget;&lt;br /&gt;
		//hint=article.hintValue();&lt;br /&gt;
	} else {&lt;br /&gt;
		article=(new Title()).fromAnchor(a);&lt;br /&gt;
		hint=a.originalTitle || article.hintValue();&lt;br /&gt;
		params=parseParams(a.href);&lt;br /&gt;
		oldid=(getValueOf('popupHistoricalLinks')) ? params.oldid : null;&lt;br /&gt;
		rcid=params.rcid;&lt;br /&gt;
	}&lt;br /&gt;
	var x={ article:article, hint: hint, oldid: oldid, rcid: rcid, navpop:args.navpopup, params:params };&lt;br /&gt;
 &lt;br /&gt;
	var structure=pg.structures[getValueOf('popupStructure')];&lt;br /&gt;
	if (typeof structure != 'object') {&lt;br /&gt;
		setPopupHTML('popupError', 'Unknown structure (this should never happen): '+&lt;br /&gt;
			     pg.option.popupStructure, args.navpopup.idNumber);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	var spans=flatten(pg.misc.layout);&lt;br /&gt;
	var numspans = spans.length;&lt;br /&gt;
	var redirs=pg.misc.redirSpans;&lt;br /&gt;
 &lt;br /&gt;
	for (var i=0; i&amp;lt;numspans; ++i) {&lt;br /&gt;
		var f=findThis(redirs, spans[i]);&lt;br /&gt;
		//log('redir='+redir+', f='+f+', spans[i]='+spans[i]);&lt;br /&gt;
		if ( (f!==null &amp;amp;&amp;amp; !redir) || (f===null &amp;amp;&amp;amp; redir) ) {&lt;br /&gt;
			//log('skipping this set of the loop');&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		var structurefn=structure[spans[i]];&lt;br /&gt;
		var setfn = setPopupHTML;&lt;br /&gt;
		if (getValueOf('popupActiveNavlinks') &amp;amp;&amp;amp; &lt;br /&gt;
		    (spans[i].indexOf('popupTopLinks')==0 || spans[i].indexOf('popupRedirTopLinks')==0)&lt;br /&gt;
			    ) {&lt;br /&gt;
			setfn = setPopupTipsAndHTML;&lt;br /&gt;
		}&lt;br /&gt;
		switch (typeof structurefn) {&lt;br /&gt;
		case 'function':&lt;br /&gt;
			//log('running '+spans[i]+'({article:'+x.article+', hint:'+x.hint+', oldid: '+x.oldid+'})');&lt;br /&gt;
			setfn(structurefn(x), spans[i], args.navpopup.idNumber);&lt;br /&gt;
			break;&lt;br /&gt;
		case 'string':&lt;br /&gt;
			setfn(structurefn, spans[i], args.navpopup.idNumber);&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			errlog('unknown thing with label '+spans[i]);&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// flatten an array&lt;br /&gt;
function flatten(list, start) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	if (typeof start == 'undefined') { start=0; }&lt;br /&gt;
	for (var i=start; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (typeof list[i] == typeof []) {&lt;br /&gt;
			return ret.concat(flatten(list[i])).concat(flatten(list, i+1));&lt;br /&gt;
		}&lt;br /&gt;
		else { ret.push(list[i]); }&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Generate html for whole popup&lt;br /&gt;
function popupHTML (a) {&lt;br /&gt;
	getValueOf('popupStructure');&lt;br /&gt;
	var structure=pg.structures[pg.option.popupStructure];&lt;br /&gt;
	if (typeof structure != 'object') {&lt;br /&gt;
		//return 'Unknown structure: '+pg.option.popupStructure;&lt;br /&gt;
		// override user choice&lt;br /&gt;
		pg.option.popupStructure=pg.optionDefault.popupStructure;&lt;br /&gt;
		return popupHTML(a);&lt;br /&gt;
	}&lt;br /&gt;
	if (typeof structure.popupLayout != 'function') { return 'Bad layout'; }&lt;br /&gt;
	pg.misc.layout=structure.popupLayout();&lt;br /&gt;
	if (typeof structure.popupRedirSpans == 'function') { pg.misc.redirSpans=structure.popupRedirSpans(); }&lt;br /&gt;
	else { pg.misc.redirSpans=[]; }&lt;br /&gt;
	return makeEmptySpans(pg.misc.layout, a.navpopup);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function makeEmptySpans (list, navpop) {&lt;br /&gt;
	var ret='';&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (typeof list[i] == typeof '') {&lt;br /&gt;
		    ret += emptySpanHTML(list[i], navpop.idNumber, 'div');&lt;br /&gt;
		} else if (typeof list[i] == typeof [] &amp;amp;&amp;amp; list[i].length &amp;gt; 0 ) {&lt;br /&gt;
			ret = ret.parenSplit(RegExp('(&amp;lt;/[^&amp;gt;]*?&amp;gt;$)')).join(makeEmptySpans(list[i], navpop));&lt;br /&gt;
		} else if (typeof list[i] == typeof {} &amp;amp;&amp;amp; list[i].nodeType ) {&lt;br /&gt;
			ret += emptySpanHTML(list[i].name, navpop.idNumber, list[i].nodeType);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function emptySpanHTML(name, id, tag, classname) {&lt;br /&gt;
	tag = tag || 'span';&lt;br /&gt;
	if (!classname) { classname = emptySpanHTML.classAliases[name]; }&lt;br /&gt;
	classname = classname || name;&lt;br /&gt;
	if (name == getValueOf('popupDragHandle')) { classname += ' popupDragHandle'; }&lt;br /&gt;
	return simplePrintf('&amp;lt;%s id=&amp;quot;%s&amp;quot; class=&amp;quot;%s&amp;quot;&amp;gt;&amp;lt;/%s&amp;gt;', [tag, name + id, classname, tag]);&lt;br /&gt;
}&lt;br /&gt;
emptySpanHTML.classAliases={ 'popupSecondPreview': 'popupPreview' };&lt;br /&gt;
 &lt;br /&gt;
// generate html for popup image&lt;br /&gt;
// &amp;lt;a id=&amp;quot;popupImageLinkn&amp;quot;&amp;gt;&amp;lt;img id=&amp;quot;popupImagen&amp;quot;&amp;gt;&lt;br /&gt;
// where n=idNumber&lt;br /&gt;
function imageHTML(article, idNumber) {&lt;br /&gt;
	return simplePrintf('&amp;lt;a id=&amp;quot;popupImageLink$1&amp;quot;&amp;gt;' +&lt;br /&gt;
			    '&amp;lt;img align=&amp;quot;right&amp;quot; valign=&amp;quot;top&amp;quot; id=&amp;quot;popupImg$1&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;' +&lt;br /&gt;
			    '&amp;lt;/a&amp;gt;', [ idNumber ]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function popTipsSoonFn(id, when, popData) {&lt;br /&gt;
	when || ( when=250 );&lt;br /&gt;
	var popTips=function(){ setupTooltips(document.getElementById(id), false, true, popData); };&lt;br /&gt;
	return function() { setTimeout( popTips, when, popData ); };&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setPopupTipsAndHTML(html, divname, idnumber, popData) {&lt;br /&gt;
	setPopupHTML(html, divname, idnumber,&lt;br /&gt;
		     getValueOf('popupSubpopups') ? &lt;br /&gt;
		     popTipsSoonFn(divname + idnumber, null, popData) : &lt;br /&gt;
		     null);&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: htmloutput.js&lt;br /&gt;
// STARTFILE: mouseout.js&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// fuzzy checks&lt;br /&gt;
 &lt;br /&gt;
function fuzzyCursorOffMenus(x,y, fuzz, parent) {&lt;br /&gt;
	if (!parent) { return null; }&lt;br /&gt;
	var uls=parent.getElementsByTagName('ul');&lt;br /&gt;
	for (var i=0; i&amp;lt;uls.length; ++i) {&lt;br /&gt;
		if (uls[i].className=='popup_menu') {&lt;br /&gt;
			if (uls[i].offsetWidth &amp;gt; 0) return false;&lt;br /&gt;
		} // else {document.title+='.';}&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function checkPopupPosition () { // stop the popup running off the right of the screen&lt;br /&gt;
	// FIXME avoid pg.current.link&lt;br /&gt;
	pg.current.link &amp;amp;&amp;amp; pg.current.link.navpopup &amp;amp;&amp;amp;&lt;br /&gt;
	    pg.current.link.navpopup.limitHorizontalPosition();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function mouseOutWikiLink () {&lt;br /&gt;
	if (!window.popupsReady || !window.popupsReady()) { return; }&lt;br /&gt;
	//console ('mouseOutWikiLink');&lt;br /&gt;
	var a=this;&lt;br /&gt;
	if (a.navpopup==null) return;&lt;br /&gt;
	if ( ! a.navpopup.isVisible() ) {&lt;br /&gt;
		a.navpopup.banish();&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Navpopup.tracker.addHook(posCheckerHook(a.navpopup));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function posCheckerHook(navpop) {&lt;br /&gt;
	return function() {&lt;br /&gt;
		if (!navpop.isVisible()) { return true; /* remove this hook */ }&lt;br /&gt;
		if (Navpopup.tracker.dirty) {&lt;br /&gt;
		    return false;&lt;br /&gt;
		}&lt;br /&gt;
		var x=Navpopup.tracker.x, y=Navpopup.tracker.y;&lt;br /&gt;
		var mouseOverNavpop = navpop.isWithin(x,y,navpop.fuzz, navpop.mainDiv) ||&lt;br /&gt;
		    !fuzzyCursorOffMenus(x,y,navpop.fuzz, navpop.mainDiv);&lt;br /&gt;
 &lt;br /&gt;
		// FIXME it'd be prettier to do this internal to the Navpopup objects&lt;br /&gt;
		var t=getValueOf('popupHideDelay');&lt;br /&gt;
		if (t) { t = t * 1000; }&lt;br /&gt;
		if (!t) {&lt;br /&gt;
			if(!mouseOverNavpop) {&lt;br /&gt;
			    navpop.banish();&lt;br /&gt;
			    return true; /* remove this hook */&lt;br /&gt;
			}&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		// we have a hide delay set&lt;br /&gt;
		var d=+(new Date());&lt;br /&gt;
		if ( !navpop.mouseLeavingTime ) {&lt;br /&gt;
			navpop.mouseLeavingTime = d;&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		if ( mouseOverNavpop ) {&lt;br /&gt;
			navpop.mouseLeavingTime=null;&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		if (d - navpop.mouseLeavingTime &amp;gt; t) {&lt;br /&gt;
			navpop.mouseLeavingTime=null;&lt;br /&gt;
			navpop.banish(); return true; /* remove this hook */&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function runStopPopupTimer(navpop) {&lt;br /&gt;
	// at this point, we should have left the link but remain within the popup&lt;br /&gt;
	// so we call this function again until we leave the popup.&lt;br /&gt;
	if (!navpop.stopPopupTimer) {&lt;br /&gt;
		navpop.stopPopupTimer=setInterval(posCheckerHook(navpop), 500);&lt;br /&gt;
		navpop.addHook(function(){clearInterval(navpop.stopPopupTimer);},&lt;br /&gt;
			       'hide', 'before');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: mouseout.js&lt;br /&gt;
// STARTFILE: previewmaker.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview&lt;br /&gt;
   Defines the {@link Previewmaker} object, which generates short previews from wiki markup.&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Previewmaker&lt;br /&gt;
   @constructor&lt;br /&gt;
   @class The Previewmaker class. Use an instance of this to generate short previews from Wikitext.&lt;br /&gt;
   @param {String} wikiText The Wikitext source of the page we wish to preview.&lt;br /&gt;
   @param {String} baseUrl The url we should prepend when creating relative urls.&lt;br /&gt;
   @param {Navpopup} owner The navpop associated to this preview generator&lt;br /&gt;
*/&lt;br /&gt;
function Previewmaker(wikiText, baseUrl, owner) {&lt;br /&gt;
	/** The wikitext which is manipulated to generate the preview. */&lt;br /&gt;
	this.originalData=wikiText;&lt;br /&gt;
	this.setData();&lt;br /&gt;
	this.baseUrl=baseUrl;&lt;br /&gt;
	this.owner=owner;&lt;br /&gt;
	this.maxCharacters=getValueOf('popupMaxPreviewCharacters');&lt;br /&gt;
	this.maxSentences=getValueOf('popupMaxPreviewSentences');&lt;br /&gt;
}&lt;br /&gt;
Previewmaker.prototype.setData=function() {&lt;br /&gt;
	var maxSize=max(10000, 2*this.maxCharacters);&lt;br /&gt;
	this.data=this.originalData.substring(0,maxSize);&lt;br /&gt;
};&lt;br /&gt;
/** Remove HTML comments&lt;br /&gt;
    @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killComments = function () {&lt;br /&gt;
	// this also kills trailing spaces and one trailing newline, eg [[diamyo]]&lt;br /&gt;
	this.data=this.data.replace(RegExp('&amp;lt;!--[\\s\\S]*?--&amp;gt; *\\n?', 'g'), '');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killDivs = function () {&lt;br /&gt;
	// say goodbye, divs (can be nested, so use * not *?)&lt;br /&gt;
	this.data=this.data.replace(RegExp('&amp;lt; *div[^&amp;gt;]* *&amp;gt;[\\s\\S]*?&amp;lt; */ *div *&amp;gt;',&lt;br /&gt;
					   'gi'), '');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killGalleries = function () {&lt;br /&gt;
	this.data=this.data.replace(RegExp('&amp;lt; *gallery[^&amp;gt;]* *&amp;gt;[\\s\\S]*?&amp;lt; */ *gallery *&amp;gt;',&lt;br /&gt;
					   'gi'), '');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.kill = function(opening, closing, subopening, subclosing, repl) {&lt;br /&gt;
	var oldk=this.data;&lt;br /&gt;
	var k=this.killStuff(this.data, opening, closing, subopening, subclosing, repl);&lt;br /&gt;
	while (k.length &amp;lt; oldk.length) {&lt;br /&gt;
		oldk=k;&lt;br /&gt;
		k=this.killStuff(k, opening, closing, subopening, subclosing, repl);&lt;br /&gt;
	}&lt;br /&gt;
	this.data=k;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killStuff = function (txt, opening, closing, subopening, subclosing, repl) {&lt;br /&gt;
	var op=this.makeRegexp(opening);&lt;br /&gt;
	var cl=this.makeRegexp(closing, '^');&lt;br /&gt;
	var sb=subopening ? this.makeRegexp(subopening, '^') : null;&lt;br /&gt;
	var sc=subclosing ? this.makeRegexp(subclosing, '^') : cl;&lt;br /&gt;
	if (!op || !cl) {&lt;br /&gt;
	    alert('Navigation Popups error: op or cl is null! something is wrong.');&lt;br /&gt;
	    return;&lt;br /&gt;
	}&lt;br /&gt;
	if (!op.test(txt)) { return txt; }&lt;br /&gt;
	var ret='';&lt;br /&gt;
	var opResult = op.exec(txt);&lt;br /&gt;
	ret = txt.substring(0,opResult.index);&lt;br /&gt;
	txt=txt.substring(opResult.index+opResult[0].length);&lt;br /&gt;
	var depth = 1;&lt;br /&gt;
	while (txt.length &amp;gt; 0) {&lt;br /&gt;
		var removal=0;&lt;br /&gt;
		if (depth==1 &amp;amp;&amp;amp; cl.test(txt)) {&lt;br /&gt;
			depth--;&lt;br /&gt;
			removal=cl.exec(txt)[0].length;&lt;br /&gt;
		} else if (depth &amp;gt; 1 &amp;amp;&amp;amp; sc.test(txt)) {&lt;br /&gt;
			depth--;&lt;br /&gt;
			removal=sc.exec(txt)[0].length;&lt;br /&gt;
		}else if (sb &amp;amp;&amp;amp; sb.test(txt)) {&lt;br /&gt;
			depth++;&lt;br /&gt;
			removal=sb.exec(txt)[0].length;&lt;br /&gt;
		}&lt;br /&gt;
		if ( !removal ) { removal = 1; }&lt;br /&gt;
		txt=txt.substring(removal);&lt;br /&gt;
		if (depth==0) { break; }&lt;br /&gt;
	}&lt;br /&gt;
	return ret + (repl || '') + txt;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.makeRegexp = function (x, prefix, suffix) {&lt;br /&gt;
	prefix = prefix || '';&lt;br /&gt;
	suffix = suffix || '';&lt;br /&gt;
	var reStr='';&lt;br /&gt;
	var flags='';&lt;br /&gt;
	if (isString(x)) {&lt;br /&gt;
		reStr=prefix + literalizeRegex(x) + suffix;&lt;br /&gt;
	} else if (isRegExp(x)) {&lt;br /&gt;
		var s=x.toString().substring(1);&lt;br /&gt;
		var sp=s.split('/');&lt;br /&gt;
		flags=sp[sp.length-1];&lt;br /&gt;
		sp[sp.length-1]='';&lt;br /&gt;
		s=sp.join('/');&lt;br /&gt;
		s=s.substring(0,s.length-1);&lt;br /&gt;
		reStr= prefix + s + suffix;&lt;br /&gt;
	} else {&lt;br /&gt;
		log ('makeRegexp failed');&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	log ('makeRegexp: got reStr=' + reStr + ', flags=' + flags);&lt;br /&gt;
	return RegExp(reStr, flags);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killBoxTemplates = function () {&lt;br /&gt;
 &lt;br /&gt;
	// taxobox removal... in fact, there's a saudiprincebox_begin, so let's be more general&lt;br /&gt;
	// also, have float_begin, ... float_end&lt;br /&gt;
	this.kill(RegExp('[{][{][^{}\\s|]*?(float|box)[_ ](begin|start)', 'i'),	/[}][}]\s*/, '{{');&lt;br /&gt;
 &lt;br /&gt;
	// infoboxes etc&lt;br /&gt;
	// from [[User:Zyxw/popups.js]]: kill frames too&lt;br /&gt;
	this.kill(RegExp('[{][{][^{}\\s|]*?(infobox|elementbox|frame)[_ ]', 'i'), /[}][}]\s*/, '{{');&lt;br /&gt;
 &lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killTemplates = function () {&lt;br /&gt;
	this.kill('{{', '}}', '{', '}', ' ');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killTables = function () {&lt;br /&gt;
	// tables are bad, too&lt;br /&gt;
	// this can be slow, but it's an inprovement over a browser hang&lt;br /&gt;
	// torture test: [[Comparison_of_Intel_Central_Processing_Units]]&lt;br /&gt;
	this.kill('{|', /[|]}\s*/, '{|');&lt;br /&gt;
	this.kill(/&amp;lt;table.*?&amp;gt;/i, /&amp;lt;\/table.*?&amp;gt;/i, /&amp;lt;table.*?&amp;gt;/i);&lt;br /&gt;
	// remove lines starting with a pipe for the hell of it (?)&lt;br /&gt;
	this.data=this.data.replace(RegExp('^[|].*$', 'mg'), '');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killImages = function () {&lt;br /&gt;
	// images and categories are a nono&lt;br /&gt;
	this.kill(RegExp('[[][[]\\s*(Image|File|' + pg.ns.image + '|' + pg.ns.category + ')\\s*:', 'i'),&lt;br /&gt;
		  /\]\]\s*/, '[', ']');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killHTML = function () {&lt;br /&gt;
	// kill &amp;lt;ref ...&amp;gt;...&amp;lt;/ref&amp;gt;&lt;br /&gt;
	this.kill(/&amp;lt;ref\b[^/&amp;gt;]*?&amp;gt;/i, /&amp;lt;\/ref&amp;gt;/i);&lt;br /&gt;
 &lt;br /&gt;
	// let's also delete entire lines starting with &amp;lt;. it's worth a try.&lt;br /&gt;
	this.data=this.data.replace(RegExp('(^|\\n) *&amp;lt;.*', 'g'), '\n');&lt;br /&gt;
 &lt;br /&gt;
	// and those pesky html tags, but not &amp;lt;nowiki&amp;gt; or &amp;lt;blockquote&amp;gt;&lt;br /&gt;
	var splitted=this.data.parenSplit(/(&amp;lt;.*?&amp;gt;)/);&lt;br /&gt;
	var len=splitted.length;&lt;br /&gt;
	for (var i=1; i&amp;lt;len; i=i+2) {&lt;br /&gt;
		switch (splitted[i]) {&lt;br /&gt;
		case '&amp;lt;nowiki&amp;gt;':&lt;br /&gt;
		case '&amp;lt;/nowiki&amp;gt;':&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			if (! /^&amp;lt; *\/? *blockquote\b/i.test(splitted[i])) {&lt;br /&gt;
				splitted[i]='';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	this.data=splitted.join('');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killChunks = function() { // heuristics alert&lt;br /&gt;
	// chunks of italic text? you crazy, man?&lt;br /&gt;
	var italicChunkRegex=new RegExp&lt;br /&gt;
	(&amp;quot;((^|\\n)\\s*:*\\s*''[^']([^']|'''|'[^']){20}(.|\\n[^\\n])*''[.!?\\s]*\\n)+&amp;quot;, 'g');&lt;br /&gt;
	// keep stuff separated, though, so stick in \n (fixes [[Union Jack]]?&lt;br /&gt;
	this.data=this.data.replace(italicChunkRegex, '\n');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.mopup = function () {&lt;br /&gt;
	// we simply *can't* be doing with horizontal rules right now&lt;br /&gt;
	this.data=this.data.replace(RegExp('^-{4,}','mg'),'');&lt;br /&gt;
 &lt;br /&gt;
	// no indented lines&lt;br /&gt;
	this.data=this.data.replace(RegExp('(^|\\n) *:[^\\n]*','g'), '');&lt;br /&gt;
 &lt;br /&gt;
	// replace __TOC__, __NOTOC__ and whatever else there is&lt;br /&gt;
	// this'll probably do&lt;br /&gt;
	this.data=this.data.replace(RegExp('^__[A-Z_]*__ *$', 'gmi'),'');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.firstBit = function () {&lt;br /&gt;
	// dont't be givin' me no subsequent paragraphs, you hear me?&lt;br /&gt;
	/// first we &amp;quot;normalize&amp;quot; section headings, removing whitespace after, adding before&lt;br /&gt;
	var d=this.data;&lt;br /&gt;
 &lt;br /&gt;
	if (getValueOf('popupPreviewCutHeadings')) {&lt;br /&gt;
		this.data=this.data.replace(RegExp('\\s*(==+[^=]*==+)\\s*', 'g'), '\n\n$1 ');&lt;br /&gt;
		/// then we want to get rid of paragraph breaks whose text ends badly&lt;br /&gt;
		this.data=this.data.replace(RegExp('([:;]) *\\n{2,}', 'g'), '$1\n');&lt;br /&gt;
 &lt;br /&gt;
		this.data=this.data.replace(RegExp('^[\\s\\n]*'), '');&lt;br /&gt;
		stuff=(RegExp('^([^\\n]|\\n[^\\n\\s])*')).exec(this.data);&lt;br /&gt;
		if (stuff) { d = stuff[0]; }&lt;br /&gt;
		if (!getValueOf('popupPreviewFirstParOnly')) { d = this.data; }&lt;br /&gt;
 &lt;br /&gt;
		/// now put \n\n after sections so that bullets and numbered lists work&lt;br /&gt;
		d=d.replace(RegExp('(==+[^=]*==+)\\s*', 'g'), '$1\n\n');&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	// superfluous sentences are RIGHT OUT.&lt;br /&gt;
	// note: exactly 1 set of parens here needed to make the slice work&lt;br /&gt;
	d = d.parenSplit(RegExp('([!?.]+[&amp;quot;'+&amp;quot;'&amp;quot;+']*\\s)','g'));&lt;br /&gt;
	// leading space is bad, mmkay?&lt;br /&gt;
	d[0]=d[0].replace(RegExp('^\\s*'), '');&lt;br /&gt;
 &lt;br /&gt;
	var notSentenceEnds=RegExp('([^.][a-z][.] *[a-z]|etc|sic|Dr|Mr|Mrs|Ms|St|no|op|cit|\\[[^\\]]*|\\s[A-Zvclm])$', 'i');&lt;br /&gt;
	d = this.fixSentenceEnds(d, notSentenceEnds);&lt;br /&gt;
 &lt;br /&gt;
	this.fullLength=d.join('').length;&lt;br /&gt;
	var maxChars=getValueOf('popupMaxPreviewCharacters') + this.extraCharacters;&lt;br /&gt;
	var n=this.maxSentences;&lt;br /&gt;
	var dd=this.firstSentences(d,n); &lt;br /&gt;
 &lt;br /&gt;
	do {&lt;br /&gt;
		dd=this.firstSentences(d,n); --n;&lt;br /&gt;
	} while ( dd.length &amp;gt; this.maxCharacters &amp;amp;&amp;amp; n != 0 );&lt;br /&gt;
 &lt;br /&gt;
	this.data = dd;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.fixSentenceEnds = function(strs, reg) {&lt;br /&gt;
	// take an array of strings, strs&lt;br /&gt;
	// join strs[i] to strs[i+1] &amp;amp; strs[i+2] if strs[i] matches regex reg&lt;br /&gt;
 &lt;br /&gt;
	var abbrevRe=/\b[a-z][^a-z]*$/i;&lt;br /&gt;
 &lt;br /&gt;
	for (var i=0; i&amp;lt;strs.length-2; ++i) {&lt;br /&gt;
		if (reg.test(strs[i])) {&lt;br /&gt;
			a=[];&lt;br /&gt;
			for (var j=0; j&amp;lt;strs.length; ++j) {&lt;br /&gt;
				if (j&amp;lt;i)   a[j]=strs[j];&lt;br /&gt;
				if (j==i)  a[i]=strs[i]+strs[i+1]+strs[i+2];&lt;br /&gt;
				if (j&amp;gt;i+2) a[j-2]=strs[j];&lt;br /&gt;
			}&lt;br /&gt;
			return this.fixSentenceEnds(a,reg);&lt;br /&gt;
		}&lt;br /&gt;
		// BUGGY STUFF - trying to fix up [[S. C. Johnson &amp;amp; Son]] preview&lt;br /&gt;
		if (false &amp;amp;&amp;amp; abbrevRe.test(strs[i])) {&lt;br /&gt;
			var j=i, buf='';&lt;br /&gt;
			do {&lt;br /&gt;
				buf=buf+strs[i]+strs[i+1];&lt;br /&gt;
				i=i+2;&lt;br /&gt;
			} while (i&amp;lt;strs.length-2 &amp;amp;&amp;amp; abbrevRe.test(strs[i]));&lt;br /&gt;
			strs[i]=buf+strs[i];&lt;br /&gt;
			var a=(j?strs.slice(0,j-1):[]).concat(strs.slice(i));&lt;br /&gt;
			return this.fixSentenceEnds(a,reg);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return strs;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.firstSentences = function(strs, howmany) {&lt;br /&gt;
	var t=strs.slice(0, 2*howmany);&lt;br /&gt;
	return t.join('');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killBadWhitespace = function() {&lt;br /&gt;
	// also cleans up isolated '''', eg [[Suntory Sungoliath]]&lt;br /&gt;
	this.data=this.data.replace(RegExp('^ *\'+ *$', 'gm'), '');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Runs the various methods to generate the preview.&lt;br /&gt;
   The preview is stored in the &amp;lt;code&amp;gt;html&amp;lt;/html&amp;gt; field.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.makePreview = function() {&lt;br /&gt;
	if (this.owner.article.namespace()!=pg.ns.template &amp;amp;&amp;amp;&lt;br /&gt;
				this.owner.article.namespace()!=pg.ns.image ) {&lt;br /&gt;
		this.killComments();&lt;br /&gt;
		this.killDivs();&lt;br /&gt;
		this.killGalleries();&lt;br /&gt;
		this.killBoxTemplates();&lt;br /&gt;
 &lt;br /&gt;
		if (getValueOf('popupPreviewKillTemplates')) {&lt;br /&gt;
			this.killTemplates();&lt;br /&gt;
		} else {&lt;br /&gt;
			this.killMultilineTemplates();&lt;br /&gt;
		}&lt;br /&gt;
		this.killTables();&lt;br /&gt;
		this.killImages();&lt;br /&gt;
		this.killHTML();&lt;br /&gt;
		this.killChunks();&lt;br /&gt;
		this.mopup();&lt;br /&gt;
 &lt;br /&gt;
		this.firstBit();&lt;br /&gt;
		this.killBadWhitespace();&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		this.killHTML();&lt;br /&gt;
	}&lt;br /&gt;
	this.html=wiki2html(this.data, this.baseUrl); // needs livepreview&lt;br /&gt;
	this.fixHTML();&lt;br /&gt;
	this.stripLongTemplates();&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.esWiki2HtmlPart = function(data) {&lt;br /&gt;
  var reLinks = /(?:\[\[([^|\]]*)(?:\|([^|\]]*))*]]([a-z]*))/gi; //match a wikilink&lt;br /&gt;
  reLinks.lastIndex = 0; //reset regex&lt;br /&gt;
 &lt;br /&gt;
  var match;&lt;br /&gt;
  var result = &amp;quot;&amp;quot;;&lt;br /&gt;
  var postfixIndex = 0;&lt;br /&gt;
  while ((match = reLinks.exec(data)) != null) //match all wikilinks&lt;br /&gt;
  {&lt;br /&gt;
    //FIXME: the way that link is built here isn't perfect. It is clickable, but popups preview won't recognize it in some cases.&lt;br /&gt;
    result += escapeQuotesHTML(data.substring(postfixIndex, match.index)) + &lt;br /&gt;
              &amp;quot;&amp;lt;a href='&amp;quot;+Insta.conf.paths.articles+match[1]+&amp;quot;'&amp;gt;&amp;quot;+escapeQuotesHTML((match[2]?match[2]:match[1])+match[3])+&amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
    postfixIndex = reLinks.lastIndex;&lt;br /&gt;
  }&lt;br /&gt;
  //append the rest&lt;br /&gt;
  result += escapeQuotesHTML(data.substring(postfixIndex));&lt;br /&gt;
 &lt;br /&gt;
  return result;&lt;br /&gt;
};&lt;br /&gt;
Previewmaker.prototype.editSummaryPreview=function() {&lt;br /&gt;
	var reAes   = /\/\* *(.*?) *\*\//g; //match the first section marker&lt;br /&gt;
	reAes.lastIndex = 0; //reset regex&lt;br /&gt;
 &lt;br /&gt;
	var match;&lt;br /&gt;
 &lt;br /&gt;
	match = reAes.exec(this.data);&lt;br /&gt;
	if (match)&lt;br /&gt;
	{&lt;br /&gt;
		//we have a section link. Split it, process it, combine it.&lt;br /&gt;
		var prefix = this.data.substring(0,match.index-1);&lt;br /&gt;
		var section = match[1];&lt;br /&gt;
		var postfix = this.data.substring(reAes.lastIndex);&lt;br /&gt;
 &lt;br /&gt;
		var start = &amp;quot;&amp;lt;span class='autocomment'&amp;gt;&amp;quot;;&lt;br /&gt;
		var end = &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
		if (prefix.length&amp;gt;0) start = this.esWiki2HtmlPart(prefix) + &amp;quot; &amp;quot; + start + &amp;quot;- &amp;quot;;&lt;br /&gt;
		if (postfix.length&amp;gt;0) end = &amp;quot;: &amp;quot; + end + this.esWiki2HtmlPart(postfix);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
		var t=new Title().fromURL(this.baseUrl);&lt;br /&gt;
		t.anchorFromUtf(section);&lt;br /&gt;
		var sectionLink = Insta.conf.paths.articles + t.toString(true).split(&amp;quot;'&amp;quot;).join('%27') + '#' + t.anchor.split(&amp;quot;'&amp;quot;).join('%27');&lt;br /&gt;
		return start + &amp;quot;&amp;lt;a href='&amp;quot;+sectionLink+&amp;quot;'&amp;gt;&amp;amp;rarr;&amp;lt;/a&amp;gt; &amp;quot;+escapeQuotesHTML(section) + end;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	//else there's no section link, htmlify the whole thing.&lt;br /&gt;
	return this.esWiki2HtmlPart(this.data);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
/** Test function for debugging preview problems one step at a time.&lt;br /&gt;
 */&lt;br /&gt;
function previewSteps(txt) {&lt;br /&gt;
	try {&lt;br /&gt;
		txt=txt || document.editform.wpTextbox1.value;&lt;br /&gt;
	} catch (err) {&lt;br /&gt;
		if (pg.cache.pages.length &amp;gt; 0) {&lt;br /&gt;
			txt=pg.cache.pages[pg.cache.pages.length-1].data;&lt;br /&gt;
		} else {&lt;br /&gt;
			alert('provide text or use an edit page');&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	txt=txt.substring(0,10000);&lt;br /&gt;
	var base=pg.wiki.articlebase + Title.fromURL(document.location.href).urlString();&lt;br /&gt;
	var p=new Previewmaker(txt, base, pg.current.link.navpopup);&lt;br /&gt;
	if (this.owner.article.namespace() != pg.ns.template) {&lt;br /&gt;
		p.killComments(); if (!confirm('done killComments(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		p.killDivs(); if (!confirm('done killDivs(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		p.killGalleries(); if (!confirm('done killGalleries(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		p.killBoxTemplates(); if (!confirm('done killBoxTemplates(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
 &lt;br /&gt;
		if (getValueOf('popupPreviewKillTemplates')) {&lt;br /&gt;
			p.killTemplates(); if (!confirm('done killTemplates(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		} else {&lt;br /&gt;
			p.killMultilineTemplates(); if (!confirm('done killMultilineTemplates(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		p.killTables(); if (!confirm('done killTables(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		p.killImages(); if (!confirm('done killImages(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		p.killHTML(); if (!confirm('done killHTML(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		p.killChunks(); if (!confirm('done killChunks(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		p.mopup(); if (!confirm('done mopup(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
 &lt;br /&gt;
		p.firstBit(); if (!confirm('done firstBit(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
		p.killBadWhitespace(); if (!confirm('done killBadWhitespace(). Continue?\n---\n' + p.data)) { return; }&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	p.html=wiki2html(p.data, base); // needs livepreview&lt;br /&gt;
	p.fixHTML(); if (!confirm('done fixHTML(). Continue?\n---\n' + p.html)) { return; }&lt;br /&gt;
	p.stripLongTemplates(); if (!confirm('done stripLongTemplates(). Continue?\n---\n' + p.html)) { return; }&lt;br /&gt;
	alert('finished preview - end result follows.\n---\n' + p.html);&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Works around a quoting bug in livepreview.&lt;br /&gt;
   &amp;lt;code&amp;gt;wiki2html('[[Foo\'s &amp;quot;bar&amp;quot;]]')&amp;lt;/code&amp;gt; gives @literal{&amp;lt;a href='Foo's &amp;quot;bar&amp;quot;'&amp;gt;}&lt;br /&gt;
   which doesn't do very well. We change this into @literal{&amp;lt;a href=&amp;quot;Foo's %22bar%22&amp;quot;&amp;gt;}&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.fixHTML = function() {&lt;br /&gt;
	if(!this.html) return;&lt;br /&gt;
	// all links seem to have potential issues with quotation marks&lt;br /&gt;
	var splitted=this.html.parenSplit(/href='([^&amp;gt;]*)'/g);&lt;br /&gt;
	var ret='';&lt;br /&gt;
	for (var i=0; i&amp;lt;splitted.length; ++i) {&lt;br /&gt;
		if(i%2==0) { ret += splitted[i]; continue; }&lt;br /&gt;
		if(i%2==1) { ret += 'href=&amp;quot;' + splitted[i].split('&amp;quot;').join('%22') + '&amp;quot;'; }&lt;br /&gt;
	}&lt;br /&gt;
	// fix question marks in wiki links&lt;br /&gt;
	// maybe this'll break some stuff :-(&lt;br /&gt;
	ret=ret.replace(RegExp('\(&amp;lt;a href=&amp;quot;' + pg.wiki.articlePath + '/[^&amp;quot;]*\)[?]\(.*?&amp;quot;\)', 'g'), '$1%3F$2');&lt;br /&gt;
	// FIXME fix up % too&lt;br /&gt;
	this.html=ret;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Generates the preview and displays it in the current popup.&lt;br /&gt;
 &lt;br /&gt;
   Does nothing if the generated preview is invalid or consists of whitespace only.&lt;br /&gt;
   Also activates wikilinks in the preview for subpopups if the popupSubpopups option is true.&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.showPreview = function () {&lt;br /&gt;
	this.makePreview();&lt;br /&gt;
	if (typeof this.html != typeof '') return;&lt;br /&gt;
	if (RegExp('^\\s*$').test(this.html)) return;&lt;br /&gt;
	setPopupHTML('&amp;lt;hr&amp;gt;', 'popupPrePreviewSep', this.owner.idNumber);&lt;br /&gt;
	setPopupTipsAndHTML(this.html, 'popupPreview', this.owner.idNumber, { owner: this.owner });&lt;br /&gt;
	var more = (this.fullLength &amp;gt; this.data.length) ? this.moreLink() : '';&lt;br /&gt;
	setPopupHTML(more, 'popupPreviewMore', this.owner.idNumber);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.moreLink=function() {&lt;br /&gt;
	var a=document.createElement('a');&lt;br /&gt;
	a.className='popupMoreLink';&lt;br /&gt;
	a.innerHTML=popupString('more...');&lt;br /&gt;
	var savedThis=this;&lt;br /&gt;
	a.onclick=function() {&lt;br /&gt;
		savedThis.maxCharacters+=2000;&lt;br /&gt;
		savedThis.maxSentences+=20;&lt;br /&gt;
		savedThis.setData();&lt;br /&gt;
		savedThis.showPreview();&lt;br /&gt;
	}&lt;br /&gt;
	return a;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.stripLongTemplates = function() {&lt;br /&gt;
	// operates on the HTML!&lt;br /&gt;
	this.html=this.html.replace(RegExp('^.{0,1000}[{][{][^}]*?(&amp;lt;(p|br)( /)?&amp;gt;\\s*){2,}([^{}]*?[}][}])?', 'gi'), '');&lt;br /&gt;
	this.html=this.html.split('\n').join(' '); // workaround for &amp;lt;pre&amp;gt; templates&lt;br /&gt;
	this.html=this.html.replace(RegExp('[{][{][^}]*&amp;lt;pre&amp;gt;[^}]*[}][}]','gi'), '');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killMultilineTemplates = function() {&lt;br /&gt;
	this.kill('{{{', '}}}');&lt;br /&gt;
	this.kill(RegExp('\\s*[{][{][^{}]*\\n'), '}}', '{{');&lt;br /&gt;
};&lt;br /&gt;
// ENDFILE: previewmaker.js&lt;br /&gt;
// STARTFILE: querypreview.js&lt;br /&gt;
function loadAPIPreview(queryType, article, navpop) {&lt;br /&gt;
	var art=new Title(article).urlString();&lt;br /&gt;
	var url=pg.wiki.apiwikibase + '?format=json&amp;amp;action=query&amp;amp;';&lt;br /&gt;
	var htmlGenerator=function(a,d){alert('invalid html generator');};&lt;br /&gt;
	switch (queryType) {&lt;br /&gt;
	case 'history':&lt;br /&gt;
		url += 'meta=userinfo&amp;amp;uiprop=options&amp;amp;titles=' + art + '&amp;amp;prop=revisions&amp;amp;rvlimit=' +&lt;br /&gt;
			getValueOf('popupHistoryPreviewLimit');&lt;br /&gt;
		htmlGenerator=APIhistoryPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case 'category':&lt;br /&gt;
		url += 'list=categorymembers&amp;amp;cmtitle=' + art;&lt;br /&gt;
		htmlGenerator=APIcategoryPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case 'userinfo':&lt;br /&gt;
		var usernameart = encodeURIComponent( new Title( article ).userName() );&lt;br /&gt;
		url += 'list=users&amp;amp;usprop=blockinfo|groups|editcount|registration&amp;amp;ususers=' + usernameart;&lt;br /&gt;
		htmlGenerator=APIuserInfoPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case 'contribs':&lt;br /&gt;
	    var usernameart = encodeURIComponent( new Title( article ).userName() );&lt;br /&gt;
		url += 'list=usercontribs&amp;amp;meta=userinfo&amp;amp;uiprop=options&amp;amp;ucuser=' + usernameart +&lt;br /&gt;
			'&amp;amp;uclimit=' + getValueOf('popupContribsPreviewLimit');&lt;br /&gt;
		htmlGenerator=APIcontribsPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case 'imagepagepreview':&lt;br /&gt;
		var trail='';&lt;br /&gt;
		if (getValueOf('popupImageLinks')) { trail = '&amp;amp;list=imageusage&amp;amp;iutitle=' + art; }&lt;br /&gt;
		url += 'titles=' + art + '&amp;amp;prop=revisions|imageinfo&amp;amp;rvprop=content' + trail;&lt;br /&gt;
		htmlGenerator=APIimagepagePreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case 'backlinks':&lt;br /&gt;
		url += 'list=backlinks&amp;amp;bltitle=' + art;&lt;br /&gt;
		htmlGenerator=APIbacklinksPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	pendingNavpopTask(navpop);&lt;br /&gt;
	if( !window.wgEnableAPI || !wgEnableAPI ) {&lt;br /&gt;
		/* The API is not available */&lt;br /&gt;
		htmlGenerator=function(a,d){&lt;br /&gt;
			return 'This function of navigation popups now requires a MediaWiki ' + &lt;br /&gt;
			'installation with the &amp;lt;a href=&amp;quot;//www.mediawiki.org/wiki/API&amp;quot;&amp;gt;API&amp;lt;/a&amp;gt; enabled.'; };&lt;br /&gt;
	}&lt;br /&gt;
	var callback=function(d){&lt;br /&gt;
	    log( &amp;quot;callback of API functions was hit&amp;quot; );&lt;br /&gt;
		showAPIPreview(queryType, htmlGenerator(article,d,navpop), navpop.idNumber, navpop, d);&lt;br /&gt;
	};&lt;br /&gt;
	var go = function(){&lt;br /&gt;
	    getPageWithCaching(url, callback, navpop);&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	if (navpop.visible || !getValueOf('popupLazyDownloads')) { go(); }&lt;br /&gt;
	else { navpop.addHook(go, 'unhide', 'before', 'DOWNLOAD_'+queryType+'_QUERY_DATA'); }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function linkList(list) {&lt;br /&gt;
	list.sort(function(x,y) { return (x==y ? 0 : (x&amp;lt;y ? -1 : 1)); });&lt;br /&gt;
	var buf=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		buf.push(wikiLink({article: new Title(list[i]),&lt;br /&gt;
				   text:    list[i].split(' ').join('&amp;amp;nbsp;'),&lt;br /&gt;
				   action:  'view'}));&lt;br /&gt;
	}&lt;br /&gt;
	return buf.join(', ');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getTimeOffset(tz) {&lt;br /&gt;
	if( tz ) {&lt;br /&gt;
		if( tz.indexOf('|') &amp;gt; -1 ) {&lt;br /&gt;
			// New format&lt;br /&gt;
			return parseInt(tz.split('|')[1],10);&lt;br /&gt;
		} else if ( tz.indexOf(':') &amp;gt; -1 ) {&lt;br /&gt;
			// Old format&lt;br /&gt;
			return( parseInt(tz,10)*60 + parseInt(tz.split(':')[1],10) );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function editPreviewTable(article, h, reallyContribs, timeOffset) {&lt;br /&gt;
	var html=['&amp;lt;table&amp;gt;'];&lt;br /&gt;
	var day=null;&lt;br /&gt;
	var curart=article;&lt;br /&gt;
	for (var i=0; i&amp;lt;h.length; ++i) {&lt;br /&gt;
		if (reallyContribs) { &lt;br /&gt;
		    var page=h[i]['title']; curart = new Title(page);&lt;br /&gt;
		}&lt;br /&gt;
		var minor=typeof h[i]['minor']=='undefined' ? '' : '&amp;lt;b&amp;gt;m &amp;lt;/b&amp;gt;';&lt;br /&gt;
		var editDate=adjustDate(getDateFromTimestamp(h[i].timestamp), timeOffset);&lt;br /&gt;
		var thisDay = dayFormat(editDate);&lt;br /&gt;
		var thisTime = timeFormat(editDate);&lt;br /&gt;
		if (thisDay==day) { thisDay=''; }&lt;br /&gt;
		else { day=thisDay; }&lt;br /&gt;
		if (thisDay) {&lt;br /&gt;
			html.push( '&amp;lt;tr&amp;gt;&amp;lt;td colspan=3&amp;gt;&amp;lt;span class=&amp;quot;popup_history_date&amp;quot;&amp;gt;' +&lt;br /&gt;
				  thisDay+'&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;' );&lt;br /&gt;
		}&lt;br /&gt;
		html.push('&amp;lt;tr class=&amp;quot;popup_history_row_' + ( (i%2) ? 'odd' : 'even') + '&amp;quot;&amp;gt;');&lt;br /&gt;
		html.push('&amp;lt;td&amp;gt;(&amp;lt;a href=&amp;quot;' + pg.wiki.titlebase + new Title(curart).urlString() +&lt;br /&gt;
			'&amp;amp;diff=prev&amp;amp;oldid=' + h[i]['revid'] + '&amp;quot;&amp;gt;' + popupString('last') + '&amp;lt;/a&amp;gt;)&amp;lt;/td&amp;gt;');&lt;br /&gt;
		html.push('&amp;lt;td&amp;gt;' +&lt;br /&gt;
			'&amp;lt;a href=&amp;quot;' + pg.wiki.titlebase + new Title(curart).urlString() +&lt;br /&gt;
			'&amp;amp;oldid=' + h[i]['revid'] + '&amp;quot;&amp;gt;' + thisTime + '&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;');&lt;br /&gt;
		var col3url='', col3txt='';&lt;br /&gt;
		if (!reallyContribs) {&lt;br /&gt;
			var user=h[i]['user'];&lt;br /&gt;
			col3url=pg.wiki.titlebase + pg.ns.user + ':' + new Title(user).urlString();&lt;br /&gt;
			col3txt=escapeQuotesHTML(user);&lt;br /&gt;
		} else {&lt;br /&gt;
			col3url=pg.wiki.titlebase + curart.urlString();&lt;br /&gt;
			col3txt=escapeQuotesHTML(page);&lt;br /&gt;
		}&lt;br /&gt;
		html.push('&amp;lt;td&amp;gt;' + (reallyContribs ? minor : '') +&lt;br /&gt;
			'&amp;lt;a href=&amp;quot;' + col3url + '&amp;quot;&amp;gt;' + col3txt + '&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;');&lt;br /&gt;
		var comment='';&lt;br /&gt;
		var c=h[i].comment || h[i]['*'];&lt;br /&gt;
		if (c) {&lt;br /&gt;
			comment=new Previewmaker(c, new Title(curart).toUrl()).editSummaryPreview();&lt;br /&gt;
		}&lt;br /&gt;
		html.push('&amp;lt;td&amp;gt;' + (!reallyContribs ? minor : '') + comment + '&amp;lt;/td&amp;gt;');&lt;br /&gt;
		html.push('&amp;lt;/tr&amp;gt;');&lt;br /&gt;
		html=[html.join('')];&lt;br /&gt;
	}&lt;br /&gt;
	html.push('&amp;lt;/table&amp;gt;');&lt;br /&gt;
	return html.join('');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getDateFromTimestamp(t) {&lt;br /&gt;
	var s=t.split(/[^0-9]/);&lt;br /&gt;
	switch(s.length) {&lt;br /&gt;
	case 0: return null;&lt;br /&gt;
	case 1: return new Date(s[0]);&lt;br /&gt;
	case 2: return new Date(s[0], s[1]-1);&lt;br /&gt;
	case 3: return new Date(s[0], s[1]-1, s[2]);&lt;br /&gt;
	case 4: return new Date(s[0], s[1]-1, s[2], s[3]);&lt;br /&gt;
	case 5: return new Date(s[0], s[1]-1, s[2], s[3], s[4]);&lt;br /&gt;
	case 6: return new Date(s[0], s[1]-1, s[2], s[3], s[4], s[5]);&lt;br /&gt;
	default: return new Date(s[0], s[1]-1, s[2], s[3], s[4], s[5], s[6]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function adjustDate(d, offset) {&lt;br /&gt;
	// offset is in minutes&lt;br /&gt;
	var o=offset * 60 * 1000;&lt;br /&gt;
	return new Date( +d + o);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function dayFormat(editDate, utc) {&lt;br /&gt;
	if (utc) { return map(zeroFill, [editDate.getUTCFullYear(), editDate.getUTCMonth()+1, editDate.getUTCDate()]).join('-'); }&lt;br /&gt;
	return map(zeroFill, [editDate.getFullYear(), editDate.getMonth()+1, editDate.getDate()]).join('-');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function timeFormat(editDate, utc) {&lt;br /&gt;
	if (utc) { return map(zeroFill, [editDate.getUTCHours(), editDate.getUTCMinutes(), editDate.getUTCSeconds()]).join(':'); }&lt;br /&gt;
	return map(zeroFill, [editDate.getHours(), editDate.getMinutes(), editDate.getSeconds()]).join(':');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function showAPIPreview(queryType, html, id, navpop, download) {&lt;br /&gt;
    // DJ: done&lt;br /&gt;
	var target='popupPreview';&lt;br /&gt;
	switch (queryType) {&lt;br /&gt;
	case 'imagelinks':&lt;br /&gt;
	case 'category':&lt;br /&gt;
	case 'userinfo':&lt;br /&gt;
		target='popupPostPreview'; break;&lt;br /&gt;
	}&lt;br /&gt;
	setPopupTipsAndHTML(html, target, id);&lt;br /&gt;
	completedNavpopTask(navpop);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function APIbacklinksPreviewHTML(article, download, navpop) {&lt;br /&gt;
    try {&lt;br /&gt;
	    var jsObj=getJsObj(download.data);&lt;br /&gt;
   	    var list=jsObj.query.backlinks;&lt;br /&gt;
	} catch (someError) { return 'backlinksPreviewHTML went wonky'; }&lt;br /&gt;
	var html=[];&lt;br /&gt;
	if (!list) { return popupString('No backlinks found'); }&lt;br /&gt;
	for ( i in list ) {&lt;br /&gt;
		var t=new Title(list[i]['title']);&lt;br /&gt;
		html.push('&amp;lt;a href=&amp;quot;' + pg.wiki.titlebase + t.urlString() + '&amp;quot;&amp;gt;' + t + '&amp;lt;/a&amp;gt;');&lt;br /&gt;
	}&lt;br /&gt;
	html=html.join(', ');&lt;br /&gt;
	if (jsObj['query-continue'] &amp;amp;&amp;amp; jsObj['query-continue'].backlinks &amp;amp;&amp;amp; jsObj['query-continue'].backlinks.blcontinue) {&lt;br /&gt;
		html += popupString(' and more');&lt;br /&gt;
	}&lt;br /&gt;
	return html;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function APIsharedImagePagePreviewHTML(obj) {&lt;br /&gt;
	log( &amp;quot;APIsharedImagePagePreviewHTML&amp;quot; );&lt;br /&gt;
	var popupid = obj['requestid'];&lt;br /&gt;
	if( obj['query'] &amp;amp;&amp;amp; obj['query']['pages'] )&lt;br /&gt;
	{&lt;br /&gt;
		var page=anyChild(obj['query']['pages']);&lt;br /&gt;
		var content=(page &amp;amp;&amp;amp; page.revisions ) ? page.revisions[0]['*'] : null;&lt;br /&gt;
		if( content ) &lt;br /&gt;
		{&lt;br /&gt;
			/* Not entirely safe, but the best we can do */&lt;br /&gt;
			var p=new Previewmaker(content, pg.current.link.navpopup.article, pg.current.link.navpopup);&lt;br /&gt;
			p.makePreview();&lt;br /&gt;
			setPopupHTML( p.html, &amp;quot;popupSecondPreview&amp;quot;, popupid );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function APIimagepagePreviewHTML(article, download, navpop) {&lt;br /&gt;
	try {&lt;br /&gt;
	    var jsObj=getJsObj(download.data);&lt;br /&gt;
		var page=anyChild(jsObj.query.pages);&lt;br /&gt;
		var content=(page &amp;amp;&amp;amp; page.revisions ) ? page.revisions[0]['*'] : null;&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		return 'API imagepage preview failed :(';&lt;br /&gt;
	}&lt;br /&gt;
	var ret='';&lt;br /&gt;
	if (content) {&lt;br /&gt;
		var p=prepPreviewmaker(content, article, navpop);&lt;br /&gt;
		p.makePreview();&lt;br /&gt;
		if (p.html) { ret += '&amp;lt;hr&amp;gt;' + p.html; }&lt;br /&gt;
	}&lt;br /&gt;
	if (content!==null &amp;amp;&amp;amp; getValueOf('popupSummaryData')) {&lt;br /&gt;
		var info=getPageInfo(content, download);&lt;br /&gt;
		log(info);&lt;br /&gt;
		setPopupTrailer(info, navpop.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
	if (page &amp;amp;&amp;amp; page.imagerepository == &amp;quot;shared&amp;quot; ) {&lt;br /&gt;
		var art=new Title(article).urlString();&lt;br /&gt;
		var shared_url =  pg.wiki.apicommonsbase + '?format=json&amp;amp;callback=APIsharedImagePagePreviewHTML' +&lt;br /&gt;
							'&amp;amp;requestid=' + navpop.idNumber +&lt;br /&gt;
							'&amp;amp;action=query&amp;amp;prop=revisions&amp;amp;rvprop=content&amp;amp;titles=' + art;&lt;br /&gt;
		ret = ret +'&amp;lt;hr&amp;gt;' + popupString( 'Image from Commons') +&lt;br /&gt;
				': &amp;lt;a href=&amp;quot;' + pg.wiki.commonsbase + '?title=' + art + '&amp;quot;&amp;gt;' +&lt;br /&gt;
				popupString( 'Description page') + '&amp;lt;/a&amp;gt;';&lt;br /&gt;
		importScriptURI( shared_url );&lt;br /&gt;
	}&lt;br /&gt;
	showAPIPreview('imagelinks', APIimagelinksPreviewHTML(article,download), navpop.idNumber, download);&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function APIimagelinksPreviewHTML(article, download) {&lt;br /&gt;
	try {&lt;br /&gt;
		var jsobj=getJsObj(download.data);&lt;br /&gt;
		var list=jsobj.query.imageusage;&lt;br /&gt;
		if (!list) { return popupString('No image links found'); }&lt;br /&gt;
	} catch(someError) { return 'Image links preview generation failed :('; }&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i &amp;lt; list.length; i++) {&lt;br /&gt;
		ret.push(list[i]['title']);&lt;br /&gt;
	}&lt;br /&gt;
	if (ret.length === 0) { return popupString('No image links found'); }&lt;br /&gt;
	return '&amp;lt;h2&amp;gt;' + popupString('File links') + '&amp;lt;/h2&amp;gt;' + linkList(ret);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function APIcategoryPreviewHTML(article, download) {&lt;br /&gt;
    try{&lt;br /&gt;
        var jsobj=getJsObj(download.data);&lt;br /&gt;
        var list=jsobj.query.categorymembers;&lt;br /&gt;
    } catch(someError) { return 'Category preview failed :('; }&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var p=0; p &amp;lt; list.length; p++) { &lt;br /&gt;
	   ret.push(list[p]['title']); &lt;br /&gt;
	}&lt;br /&gt;
	if (ret.length === 0) { return popupString('Empty category'); }&lt;br /&gt;
	ret = '&amp;lt;h2&amp;gt;' + tprintf('Category members (%s shown)', [ret.length]) + '&amp;lt;/h2&amp;gt;' +linkList(ret);&lt;br /&gt;
	if (jsobj['query-continue'] &amp;amp;&amp;amp; jsobj['query-continue'].categorymembers &amp;amp;&amp;amp; jsobj['query-continue'].categorymembers.cmcontinue) {&lt;br /&gt;
		ret += popupString(' and more');&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function APIuserInfoPreviewHTML(article, download) {&lt;br /&gt;
	try{&lt;br /&gt;
		var jsobj=getJsObj(download.data);&lt;br /&gt;
		var user=anyChild(jsobj.query.users);&lt;br /&gt;
	} catch(someError) { return 'Userinfo preview failed :('; }&lt;br /&gt;
	if (!user || user.invalid == '') {&lt;br /&gt;
		return '&amp;lt;hr&amp;gt;' + popupString( 'Invalid or IP user');&lt;br /&gt;
	} else if (user.missing == '') {&lt;br /&gt;
		return '&amp;lt;hr&amp;gt;' + popupString( 'Not a registered username');&lt;br /&gt;
	}&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	if( user.blockedby )&lt;br /&gt;
		ret.push('&amp;lt;b&amp;gt;' + popupString('BLOCKED') + '&amp;lt;/b&amp;gt;');&lt;br /&gt;
	for( var i=0; (user.groups &amp;amp;&amp;amp; i &amp;lt; user.groups.length); i++)&lt;br /&gt;
	{&lt;br /&gt;
		ret.push( user.groups[i] );&lt;br /&gt;
	}&lt;br /&gt;
	if( user.editcount || user.registration )&lt;br /&gt;
		ret.push( (user.editcount?user.editcount:'') + popupString(' edits since: ') + (user.registration?dayFormat(getDateFromTimestamp(user.registration)):'') );&lt;br /&gt;
	ret = '&amp;lt;hr&amp;gt;' + ret.join( ', ' );&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function APIcontribsPreviewHTML(article, download, navpop) {&lt;br /&gt;
    return APIhistoryPreviewHTML(article, download, navpop, true);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function APIhistoryPreviewHTML(article, download, navpop, reallyContribs) {&lt;br /&gt;
    try {&lt;br /&gt;
		var jsobj=getJsObj(download.data);&lt;br /&gt;
		var tz=jsobj.query.userinfo.options.timecorrection;&lt;br /&gt;
		if( reallyContribs )&lt;br /&gt;
		    var edits=jsobj.query.usercontribs;&lt;br /&gt;
		else &lt;br /&gt;
		    var edits=anyChild(jsobj.query.pages)['revisions'];&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		return 'History preview failed :-(';&lt;br /&gt;
	}&lt;br /&gt;
	var timeOffset = getTimeOffset(tz);&lt;br /&gt;
	Cookie.create('popTz', timeOffset, 1);&lt;br /&gt;
 &lt;br /&gt;
	var ret=editPreviewTable(article, edits, reallyContribs, timeOffset);&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: querypreview.js&lt;br /&gt;
// STARTFILE: debug.js&lt;br /&gt;
////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Debugging functions&lt;br /&gt;
////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
function log(){}; // dummy to stop errors&lt;br /&gt;
function setupDebugging() {&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if (window.popupDebug) { // popupDebug is set from .version&lt;br /&gt;
		window.log=function(x) { //if(gMsg!='')gMsg += '\n'; gMsg+=time() + ' ' + x; };&lt;br /&gt;
			window.console.log(x);&lt;br /&gt;
		}&lt;br /&gt;
		window.errlog=function(x) {&lt;br /&gt;
			window.console.error(x);&lt;br /&gt;
		}&lt;br /&gt;
		log('Initializing logger');&lt;br /&gt;
	} else {&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
		window.log = function(x) {};&lt;br /&gt;
		window.errlog = function(x) {};&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: debug.js&lt;br /&gt;
// STARTFILE: images.js&lt;br /&gt;
 &lt;br /&gt;
// load image of type Title.&lt;br /&gt;
function loadImage(image, navpop) {&lt;br /&gt;
	if (typeof image.stripNamespace != 'function') { alert('loadImages bad'); }&lt;br /&gt;
    // API call to retrieve image info.&lt;br /&gt;
 &lt;br /&gt;
	if (!getValueOf('popupImages') || !window.wgEnableAPI || !wgEnableAPI) return;&lt;br /&gt;
	if (!isValidImageName(image)) return false;&lt;br /&gt;
 &lt;br /&gt;
	var art=image.urlString();&lt;br /&gt;
 &lt;br /&gt;
	var url=pg.wiki.apiwikibase + '?format=json&amp;amp;action=query';&lt;br /&gt;
	url += '&amp;amp;prop=imageinfo&amp;amp;iiprop=url|mime&amp;amp;iiurlwidth=' + getValueOf('popupImageSizeLarge');;&lt;br /&gt;
	url += '&amp;amp;titles=' + art;&lt;br /&gt;
 &lt;br /&gt;
	pendingNavpopTask(navpop);&lt;br /&gt;
	var callback=function(d){&lt;br /&gt;
		popupsInsertImage(navpop.idNumber, navpop, d);&lt;br /&gt;
	};&lt;br /&gt;
	var go = function(){&lt;br /&gt;
	    getPageWithCaching(url, callback, navpop);&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	if (navpop.visible || !getValueOf('popupLazyDownloads')) { go(); }&lt;br /&gt;
	else { navpop.addHook(go, 'unhide', 'after', 'DOWNLOAD_IMAGE_QUERY_DATA'); }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function popupsInsertImage(id, navpop, download) {&lt;br /&gt;
	log( &amp;quot;popupsInsertImage&amp;quot;);&lt;br /&gt;
	try {&lt;br /&gt;
		var jsObj=getJsObj(download.data);&lt;br /&gt;
		var imagepage=anyChild(jsObj.query.pages);&lt;br /&gt;
		var imageinfo = imagepage.imageinfo[0];&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		log( &amp;quot;popupsInsertImage failed :(&amp;quot; );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	var popupImage = document.getElementById(&amp;quot;popupImg&amp;quot;+id);&lt;br /&gt;
	if (!popupImage) {&lt;br /&gt;
		log( &amp;quot;could not find insertion point for image&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	popupImage.width=getValueOf('popupImageSize');&lt;br /&gt;
	popupImage.style.display='inline';&lt;br /&gt;
 &lt;br /&gt;
	// Set the source for the image.&lt;br /&gt;
	if( imageinfo.thumburl )&lt;br /&gt;
		popupImage.src=imageinfo.thumburl;&lt;br /&gt;
	else if( imageinfo.mime.indexOf(&amp;quot;image&amp;quot;) == 0 ){&lt;br /&gt;
		popupImage.src=imageinfo.url;&lt;br /&gt;
		log( &amp;quot;a thumb could not be found, using original image&amp;quot; );&lt;br /&gt;
	} else log( &amp;quot;fullsize imagethumb, but not sure if it's an image&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	var a=document.getElementById(&amp;quot;popupImageLink&amp;quot;+id);&lt;br /&gt;
	if (a === null) { return null; }&lt;br /&gt;
 &lt;br /&gt;
    // Determine the action of the surrouding imagelink.&lt;br /&gt;
	switch (getValueOf('popupThumbAction')) {&lt;br /&gt;
	case 'imagepage':&lt;br /&gt;
		if (pg.current.article.namespace()!=pg.ns.image) {&lt;br /&gt;
			a.href=imageinfo.descriptionurl;&lt;br /&gt;
			// FIXME: unreliable pg.idNumber&lt;br /&gt;
			popTipsSoonFn('popupImage' + id)();&lt;br /&gt;
			break;&lt;br /&gt;
		} // else fall through&lt;br /&gt;
	case 'sizetoggle':&lt;br /&gt;
		a.onclick=toggleSize;&lt;br /&gt;
		a.title=popupString('Toggle image size');&lt;br /&gt;
		return;&lt;br /&gt;
	case 'linkfull':&lt;br /&gt;
		a.href = imageinfo.url;&lt;br /&gt;
		a.title=popupString('Open full-size image');&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Toggles the image between inline small and navpop fullwidth.&lt;br /&gt;
// It's the same image, no actual sizechange occurs, only display width.&lt;br /&gt;
function toggleSize() {&lt;br /&gt;
	var imgContainer=this;&lt;br /&gt;
	if (!imgContainer) { alert('imgContainer is null :/'); return;}&lt;br /&gt;
	img=imgContainer.firstChild;&lt;br /&gt;
	if (!img) { alert('img is null :/'); return;}&lt;br /&gt;
	if (!img.style.width || img.style.width=='') { img.style.width='100%'; }&lt;br /&gt;
	else { img.style.width=''; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Returns one title of an image from wikiText.&lt;br /&gt;
function getValidImageFromWikiText(wikiText) {&lt;br /&gt;
	// nb in pg.re.image we're interested in the second bracketed expression&lt;br /&gt;
	// this may change if the regex changes :-(&lt;br /&gt;
	//var match=pg.re.image.exec(wikiText);&lt;br /&gt;
	var matched=null;&lt;br /&gt;
	var match;&lt;br /&gt;
	// strip html comments, used by evil bots :-(&lt;br /&gt;
	var t = removeMatchesUnless(wikiText, RegExp('(&amp;lt;!--[\\s\\S]*?--&amp;gt;)'), 1,&lt;br /&gt;
				    RegExp('^&amp;lt;!--[^[]*popup', 'i'));&lt;br /&gt;
 &lt;br /&gt;
	while ( match = pg.re.image.exec(t) ) {&lt;br /&gt;
		// now find a sane image name - exclude templates by seeking {&lt;br /&gt;
		var m = match[2] || match[6];&lt;br /&gt;
		if ( isValidImageName(m) ) {&lt;br /&gt;
			matched=m;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	pg.re.image.lastIndex=0;&lt;br /&gt;
	if (!matched) { return null; }&lt;br /&gt;
	return pg.ns.image+':'+upcaseFirst(matched);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function removeMatchesUnless(str, re1, parencount, re2) {&lt;br /&gt;
    var split=str.parenSplit(re1);&lt;br /&gt;
    var c=parencount + 1;&lt;br /&gt;
    for (var i=0; i&amp;lt;split.length; ++i) {&lt;br /&gt;
	if ( i%c === 0 || re2.test(split[i]) ) { continue; }&lt;br /&gt;
	split[i]='';&lt;br /&gt;
    }&lt;br /&gt;
    return split.join('');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: images.js&lt;br /&gt;
// STARTFILE: namespaces.js&lt;br /&gt;
// Set up namespaces and other non-strings.js localization&lt;br /&gt;
// (currently that means redirs too)&lt;br /&gt;
 &lt;br /&gt;
// Put the right namespace list into pg.ns.list, based on pg.wiki.lang&lt;br /&gt;
// Default to english if nothing seems to fit&lt;br /&gt;
function setNamespaceList() {&lt;br /&gt;
	var m=&amp;quot;Media&amp;quot;;&lt;br /&gt;
	var list = [m, &amp;quot;Special&amp;quot;, &amp;quot;Talk&amp;quot;, &amp;quot;User&amp;quot;, &amp;quot;User talk&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia talk&amp;quot;, &amp;quot;File&amp;quot;, &amp;quot;File talk&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;, &amp;quot;Portal&amp;quot;, &amp;quot;Portal talk&amp;quot;];&lt;br /&gt;
	var nsIndex = { '': 0, 'Special': 1,&lt;br /&gt;
			'Talk': 2, 'User': 3, 'User talk': 4, 'Wikipedia': 5,&lt;br /&gt;
			'Wikipedia talk': 6, 'Image': 7, 'File': 7, 'Image talk': 8, 'File talk' : 8, 'MediaWiki': 9,&lt;br /&gt;
			'MediaWiki talk': 10, 'Template': 11, 'Template talk': 12,&lt;br /&gt;
			'Help': 13, 'Help talk': 14, 'Category': 15, 'Category talk':16,&lt;br /&gt;
			'Portal': 17, 'Portal talk': 18};&lt;br /&gt;
	var nsLists = {&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		&amp;quot;af&amp;quot;: [m, &amp;quot;Spesiaal&amp;quot;, &amp;quot;Bespreking&amp;quot;, &amp;quot;Gebruiker&amp;quot;, &amp;quot;Gebruikerbespreking&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipediabespreking&amp;quot;, &amp;quot;Beeld&amp;quot;, &amp;quot;Beeldbespreking&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWikibespreking&amp;quot;, &amp;quot;Sjabloon&amp;quot;, &amp;quot;Sjabloonbespreking&amp;quot;, &amp;quot;Hulp&amp;quot;, &amp;quot;Hulpbespreking&amp;quot;, &amp;quot;Kategorie&amp;quot;, &amp;quot;Kategoriebespreking&amp;quot;],&lt;br /&gt;
		&amp;quot;als&amp;quot;: [m, &amp;quot;Spezial&amp;quot;, &amp;quot;Diskussion&amp;quot;, &amp;quot;Benutzer&amp;quot;, &amp;quot;Benutzer Diskussion&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia Diskussion&amp;quot;, &amp;quot;Bild&amp;quot;, &amp;quot;Bild Diskussion&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki Diskussion&amp;quot;, &amp;quot;Vorlage&amp;quot;, &amp;quot;Vorlage Diskussion&amp;quot;, &amp;quot;Hilfe&amp;quot;, &amp;quot;Hilfe Diskussion&amp;quot;, &amp;quot;Kategorie&amp;quot;, &amp;quot;Kategorie Diskussion&amp;quot;],&lt;br /&gt;
		&amp;quot;ar&amp;quot;: [&amp;quot;ملف&amp;quot;, &amp;quot;خاص&amp;quot;, &amp;quot;نقاش&amp;quot;, &amp;quot;مستخدم&amp;quot;, &amp;quot;نقاش المستخدم&amp;quot;, &amp;quot;ويكيبيديا&amp;quot;, &amp;quot;نقاش ويكيبيديا&amp;quot;, &amp;quot;صورة&amp;quot;, &amp;quot;نقاش الصورة&amp;quot;, &amp;quot;ميدياويكي&amp;quot;, &amp;quot;نقاش ميدياويكي&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;نقاش Template&amp;quot;, &amp;quot;مساعدة&amp;quot;, &amp;quot;نقاش المساعدة&amp;quot;, &amp;quot;تصنيف&amp;quot;, &amp;quot;نقاش التصنيف&amp;quot;],&lt;br /&gt;
		&amp;quot;ast&amp;quot;: [m, &amp;quot;Especial&amp;quot;, &amp;quot;Discusión&amp;quot;, &amp;quot;Usuariu&amp;quot;, &amp;quot;Usuariu discusión&amp;quot;, &amp;quot;Uiquipedia&amp;quot;, &amp;quot;Uiquipedia discusión&amp;quot;, &amp;quot;Imaxen&amp;quot;, &amp;quot;Imaxen discusión&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki discusión&amp;quot;, &amp;quot;Plantilla&amp;quot;, &amp;quot;Plantilla discusión&amp;quot;, &amp;quot;Ayuda&amp;quot;, &amp;quot;Ayuda discusión&amp;quot;, &amp;quot;Categoría&amp;quot;, &amp;quot;Categoría discusión&amp;quot;],&lt;br /&gt;
		&amp;quot;be&amp;quot;: [&amp;quot;Мэдыя&amp;quot;, &amp;quot;Спэцыяльныя&amp;quot;, &amp;quot;Абмеркаваньне&amp;quot;, &amp;quot;Удзельнік&amp;quot;, &amp;quot;Гутаркі ўдзельніка&amp;quot;, &amp;quot;Вікіпэдыя&amp;quot;, &amp;quot;Абмеркаваньне Вікіпэдыя&amp;quot;, &amp;quot;Выява&amp;quot;, &amp;quot;Абмеркаваньне выявы&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Абмеркаваньне MediaWiki&amp;quot;, &amp;quot;Шаблён&amp;quot;, &amp;quot;Абмеркаваньне шаблёну&amp;quot;, &amp;quot;Дапамога&amp;quot;, &amp;quot;Абмеркаваньне дапамогі&amp;quot;, &amp;quot;Катэгорыя&amp;quot;, &amp;quot;Абмеркаваньне катэгорыі&amp;quot;],&lt;br /&gt;
		&amp;quot;bg&amp;quot;: [&amp;quot;Медия&amp;quot;, &amp;quot;Специални&amp;quot;, &amp;quot;Беседа&amp;quot;, &amp;quot;Потребител&amp;quot;, &amp;quot;Потребител беседа&amp;quot;, &amp;quot;Уикипедия&amp;quot;, &amp;quot;Уикипедия беседа&amp;quot;, &amp;quot;Картинка&amp;quot;, &amp;quot;Картинка беседа&amp;quot;, &amp;quot;МедияУики&amp;quot;, &amp;quot;МедияУики беседа&amp;quot;, &amp;quot;Шаблон&amp;quot;, &amp;quot;Шаблон беседа&amp;quot;, &amp;quot;Помощ&amp;quot;, &amp;quot;Помощ беседа&amp;quot;, &amp;quot;Категория&amp;quot;, &amp;quot;Категория беседа&amp;quot;],&lt;br /&gt;
		&amp;quot;bm&amp;quot;: [m, &amp;quot;Special&amp;quot;, &amp;quot;Discuter&amp;quot;, &amp;quot;Utilisateur&amp;quot;, &amp;quot;Discussion Utilisateur&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Discussion Wikipedia&amp;quot;, &amp;quot;Image&amp;quot;, &amp;quot;Discussion Image&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Discussion MediaWiki&amp;quot;, &amp;quot;Modèle&amp;quot;, &amp;quot;Discussion Modèle&amp;quot;, &amp;quot;Aide&amp;quot;, &amp;quot;Discussion Aide&amp;quot;, &amp;quot;Catégorie&amp;quot;, &amp;quot;Discussion Catégorie&amp;quot;],&lt;br /&gt;
		&amp;quot;bn&amp;quot;: [&amp;quot;বিশেষ&amp;quot;, &amp;quot;আলাপ&amp;quot;, &amp;quot;ব্যবহারকারী&amp;quot;, &amp;quot;ব্যবহারকারী আলাপ&amp;quot;, &amp;quot;উইকিপেডিয়া&amp;quot;, &amp;quot;উইকিপেডিয়া আলাপ&amp;quot;, &amp;quot;চিত্র&amp;quot;, &amp;quot;চিত্র আলাপ&amp;quot;, &amp;quot;MediaWik i আলাপ&amp;quot;, m, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;br&amp;quot;: [m, &amp;quot;Dibar&amp;quot;, &amp;quot;Kaozeal&amp;quot;, &amp;quot;Implijer&amp;quot;, &amp;quot;Kaozeadenn Implijer&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Kaozeadenn Wikipedia&amp;quot;, &amp;quot;Skeudenn&amp;quot;, &amp;quot;Kaozeadenn Skeudenn&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Kaozeadenn MediaWiki&amp;quot;, &amp;quot;Patrom&amp;quot;, &amp;quot;Kaozeadenn Patrom&amp;quot;, &amp;quot;Skoazell&amp;quot;, &amp;quot;Kaozeadenn Skoazell&amp;quot;, &amp;quot;Rummad&amp;quot;, &amp;quot;Kaozeadenn Rummad&amp;quot;],&lt;br /&gt;
		&amp;quot;ca&amp;quot;: [m, &amp;quot;Especial&amp;quot;, &amp;quot;Discussió&amp;quot;, &amp;quot;Usuari&amp;quot;, &amp;quot;Usuari Discussió&amp;quot;, &amp;quot;Viquipèdia&amp;quot;, &amp;quot;Viquipèdia Discussió&amp;quot;, &amp;quot;Imatge&amp;quot;, &amp;quot;Imatge Discussió&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki Discussió&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template Discussió&amp;quot;, &amp;quot;Ajuda&amp;quot;, &amp;quot;Ajuda Discussió&amp;quot;, &amp;quot;Categoria&amp;quot;, &amp;quot;Categoria Discussió&amp;quot;],&lt;br /&gt;
		&amp;quot;cs&amp;quot;: [&amp;quot;Média&amp;quot;, &amp;quot;Speciální&amp;quot;, &amp;quot;Diskuse&amp;quot;, &amp;quot;Wikipedista&amp;quot;, &amp;quot;Wikipedista diskuse&amp;quot;, &amp;quot;Wikipedie&amp;quot;, &amp;quot;Wikipedie diskuse&amp;quot;, &amp;quot;Soubor&amp;quot;, &amp;quot;Soubor diskuse&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki diskuse&amp;quot;, &amp;quot;Šablona&amp;quot;, &amp;quot;Šablona diskuse&amp;quot;, &amp;quot;Nápověda&amp;quot;, &amp;quot;Nápověda diskuse&amp;quot;, &amp;quot;Kategorie&amp;quot;, &amp;quot;Kategorie diskuse&amp;quot;],&lt;br /&gt;
		&amp;quot;csb&amp;quot;: [m, &amp;quot;Specjalnô&amp;quot;, &amp;quot;Diskùsëjô&amp;quot;, &amp;quot;Brëkòwnik&amp;quot;, &amp;quot;Diskùsëjô brëkòwnika&amp;quot;, &amp;quot;Wiki&amp;quot;, &amp;quot;Diskùsëjô Wiki&amp;quot;, &amp;quot;Òbrôzk&amp;quot;, &amp;quot;Diskùsëjô òbrôzków&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Diskùsëjô MediaWiki&amp;quot;, &amp;quot;Szablóna&amp;quot;, &amp;quot;Diskùsëjô Szablónë&amp;quot;, &amp;quot;Pòmòc&amp;quot;, &amp;quot;Diskùsëjô Pòmòcë&amp;quot;, &amp;quot;Kategòrëjô&amp;quot;, &amp;quot;Diskùsëjô Kategòrëji&amp;quot;],&lt;br /&gt;
		&amp;quot;cv&amp;quot;: [&amp;quot;Медиа&amp;quot;, &amp;quot;Ятарлă&amp;quot;, &amp;quot;Сӳтсе явасси&amp;quot;, &amp;quot;Хутшăнакан&amp;quot;, &amp;quot;Хутшăнаканăн канашлу страници&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;Ӳкерчĕк&amp;quot;, &amp;quot;Ӳкерчĕке сӳтсе явмалли&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki сӳтсе явмалли&amp;quot;, &amp;quot;Шаблон&amp;quot;, &amp;quot;Шаблона сӳтсе явмалли&amp;quot;, &amp;quot;Пулăшу&amp;quot;, &amp;quot;Пулăшăва сӳтсе явмалли&amp;quot;, &amp;quot;Категори&amp;quot;, &amp;quot;Категорине сӳтсе явмалли&amp;quot;],&lt;br /&gt;
		&amp;quot;cy&amp;quot;: [m, &amp;quot;Arbennig&amp;quot;, &amp;quot;Sgwrs&amp;quot;, &amp;quot;Defnyddiwr&amp;quot;, &amp;quot;Sgwrs Defnyddiwr&amp;quot;, &amp;quot;Wicipedia&amp;quot;, &amp;quot;Sgwrs Wicipedia&amp;quot;, &amp;quot;Delwedd&amp;quot;, &amp;quot;Sgwrs Delwedd&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Sgwrs MediaWiki&amp;quot;, &amp;quot;Nodyn&amp;quot;, &amp;quot;Sgwrs Nodyn&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;da&amp;quot;: [m, &amp;quot;Speciel&amp;quot;, &amp;quot;Diskussion&amp;quot;, &amp;quot;Bruger&amp;quot;, &amp;quot;Brugerdiskussion&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia-diskussion&amp;quot;, &amp;quot;Billede&amp;quot;, &amp;quot;Billeddiskussion&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki-diskussion&amp;quot;, &amp;quot;Skabelon&amp;quot;, &amp;quot;Skabelondiskussion&amp;quot;, &amp;quot;Hjælp&amp;quot;, &amp;quot;Hjælpdiskussion&amp;quot;, &amp;quot;Kategori&amp;quot;, &amp;quot;Kategoridiskussion&amp;quot;, &amp;quot;Portal&amp;quot;, &amp;quot;Portaldiskussion&amp;quot;],&lt;br /&gt;
		&amp;quot;de&amp;quot;: [m, &amp;quot;Spezial&amp;quot;, &amp;quot;Diskussion&amp;quot;, &amp;quot;Benutzer&amp;quot;, &amp;quot;Benutzer Diskussion&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia Diskussion&amp;quot;, &amp;quot;Bild&amp;quot;, &amp;quot;Bild Diskussion&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki Diskussion&amp;quot;, &amp;quot;Vorlage&amp;quot;, &amp;quot;Vorlage Diskussion&amp;quot;, &amp;quot;Hilfe&amp;quot;, &amp;quot;Hilfe Diskussion&amp;quot;, &amp;quot;Kategorie&amp;quot;, &amp;quot;Kategorie Diskussion&amp;quot;, &amp;quot;Portal&amp;quot;, &amp;quot;Portal Diskussion&amp;quot;],&lt;br /&gt;
		&amp;quot;el&amp;quot;: [&amp;quot;Μέσον&amp;quot;, &amp;quot;Ειδικό&amp;quot;, &amp;quot;Συζήτηση&amp;quot;, &amp;quot;Χρήστης&amp;quot;, &amp;quot;Συζήτηση χρήστη&amp;quot;, &amp;quot;Βικιπαίδεια&amp;quot;, &amp;quot;Βικιπαίδεια συζήτηση&amp;quot;, &amp;quot;Εικόνα&amp;quot;, &amp;quot;Συζήτηση εικόνας&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Πρότυπο&amp;quot;, &amp;quot;Συζήτηση προτύπου&amp;quot;, &amp;quot;Βοήθεια&amp;quot;, &amp;quot;Συζήτηση βοήθειας&amp;quot;, &amp;quot;Κατηγορία&amp;quot;, &amp;quot;Συζήτηση κατηγορίας&amp;quot;],&lt;br /&gt;
		&amp;quot;eo&amp;quot;: [m, &amp;quot;Speciala&amp;quot;, &amp;quot;Diskuto&amp;quot;, &amp;quot;Vikipediisto&amp;quot;, &amp;quot;Vikipediista diskuto&amp;quot;, &amp;quot;Vikipedio&amp;quot;, &amp;quot;Vikipedio diskuto&amp;quot;, &amp;quot;Dosiero&amp;quot;, &amp;quot;Dosiera diskuto&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki diskuto&amp;quot;, &amp;quot;Ŝablono&amp;quot;, &amp;quot;Ŝablona diskuto&amp;quot;, &amp;quot;Helpo&amp;quot;, &amp;quot;Helpa diskuto&amp;quot;, &amp;quot;Kategorio&amp;quot;, &amp;quot;Kategoria diskuto&amp;quot;],&lt;br /&gt;
		&amp;quot;es&amp;quot;: [m, &amp;quot;Especial&amp;quot;, &amp;quot;Discusión&amp;quot;, &amp;quot;Usuario&amp;quot;, &amp;quot;Usuario Discusión&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia Discusión&amp;quot;, &amp;quot;Imagen&amp;quot;, &amp;quot;Imagen Discusión&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki Discusión&amp;quot;, &amp;quot;Plantilla&amp;quot;, &amp;quot;Plantilla Discusión&amp;quot;, &amp;quot;Ayuda&amp;quot;, &amp;quot;Ayuda Discusión&amp;quot;, &amp;quot;Categoría&amp;quot;, &amp;quot;Categoría Discusión&amp;quot;],&lt;br /&gt;
		&amp;quot;et&amp;quot;: [&amp;quot;Meedia&amp;quot;, &amp;quot;Eri&amp;quot;, &amp;quot;Arutelu&amp;quot;, &amp;quot;Kasutaja&amp;quot;, &amp;quot;Kasutaja arutelu&amp;quot;, &amp;quot;Vikipeedia&amp;quot;, &amp;quot;Vikipeedia arutelu&amp;quot;, &amp;quot;Pilt&amp;quot;, &amp;quot;Pildi arutelu&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki arutelu&amp;quot;, &amp;quot;Mall&amp;quot;, &amp;quot;Malli arutelu&amp;quot;, &amp;quot;Juhend&amp;quot;, &amp;quot;Juhendi arutelu&amp;quot;, &amp;quot;Kategooria&amp;quot;, &amp;quot;Kategooria arutelu&amp;quot;],&lt;br /&gt;
		&amp;quot;eu&amp;quot;: [m, &amp;quot;Aparteko&amp;quot;, &amp;quot;Eztabaida&amp;quot;, &amp;quot;Lankide&amp;quot;, &amp;quot;Lankide eztabaida&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia eztabaida&amp;quot;, &amp;quot;Irudi&amp;quot;, &amp;quot;Irudi eztabaida&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki eztabaida&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;fa&amp;quot;: [&amp;quot;مدیا&amp;quot;, &amp;quot;ویژه&amp;quot;, &amp;quot;بحث&amp;quot;, &amp;quot;کاربر&amp;quot;, &amp;quot;بحث کاربر&amp;quot;, &amp;quot;ویکی‌پدیا&amp;quot;, &amp;quot;بحث ویکی‌پدیا&amp;quot;, &amp;quot;تصویر&amp;quot;, &amp;quot;بحث تصویر&amp;quot;, &amp;quot;مدیاویکی&amp;quot;, &amp;quot;بحث مدیاویکی&amp;quot;, &amp;quot;الگو&amp;quot;, &amp;quot;بحث الگو&amp;quot;, &amp;quot;راهنما&amp;quot;, &amp;quot;بحث راهنما&amp;quot;, &amp;quot;رده&amp;quot;, &amp;quot;بحث رده&amp;quot;],&lt;br /&gt;
		&amp;quot;fi&amp;quot;: [m, &amp;quot;Toiminnot&amp;quot;, &amp;quot;Keskustelu&amp;quot;, &amp;quot;Käyttäjä&amp;quot;, &amp;quot;Keskustelu käyttäjästä&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Keskustelu Wikipediasta&amp;quot;, &amp;quot;Kuva&amp;quot;, &amp;quot;Keskustelu kuvasta&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Malline&amp;quot;, &amp;quot;Keskustelu mallineesta&amp;quot;, &amp;quot;Ohje&amp;quot;, &amp;quot;Keskustelu ohjeesta&amp;quot;, &amp;quot;Luokka&amp;quot;, &amp;quot;Keskustelu luokasta&amp;quot;],&lt;br /&gt;
		&amp;quot;fo&amp;quot;: [&amp;quot;Miðil&amp;quot;, &amp;quot;Serstakur&amp;quot;, &amp;quot;Kjak&amp;quot;, &amp;quot;Brúkari&amp;quot;, &amp;quot;Brúkari kjak&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia kjak&amp;quot;, &amp;quot;Mynd&amp;quot;, &amp;quot;Mynd kjak&amp;quot;, &amp;quot;MidiaWiki&amp;quot;, &amp;quot;MidiaWiki kjak&amp;quot;, &amp;quot;Fyrimynd&amp;quot;, &amp;quot;Fyrimynd kjak&amp;quot;, &amp;quot;Hjálp&amp;quot;, &amp;quot;Hjálp kjak&amp;quot;, &amp;quot;Bólkur&amp;quot;, &amp;quot;Bólkur kjak&amp;quot;],&lt;br /&gt;
		&amp;quot;fr&amp;quot;: [m, &amp;quot;Spécial&amp;quot;, &amp;quot;Discuter&amp;quot;, &amp;quot;Utilisateur&amp;quot;, &amp;quot;Discussion Utilisateur&amp;quot;, &amp;quot;Wikipédia&amp;quot;, &amp;quot;Discussion Wikipédia&amp;quot;, &amp;quot;Image&amp;quot;, &amp;quot;Discussion Image&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Discussion MediaWiki&amp;quot;, &amp;quot;Modèle&amp;quot;, &amp;quot;Discussion Modèle&amp;quot;, &amp;quot;Aide&amp;quot;, &amp;quot;Discussion Aide&amp;quot;, &amp;quot;Catégorie&amp;quot;, &amp;quot;Discussion Catégorie&amp;quot;, &amp;quot;Portail&amp;quot;, &amp;quot;Discussion Portail&amp;quot;],&lt;br /&gt;
		&amp;quot;fur&amp;quot;: [m, &amp;quot;Speciâl&amp;quot;, &amp;quot;Discussion&amp;quot;, &amp;quot;Utent&amp;quot;, &amp;quot;Discussion utent&amp;quot;, &amp;quot;Vichipedie&amp;quot;, &amp;quot;Discussion Vichipedie&amp;quot;, &amp;quot;Figure&amp;quot;, &amp;quot;Discussion figure&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Discussion MediaWiki&amp;quot;, &amp;quot;Model&amp;quot;, &amp;quot;Discussion model&amp;quot;, &amp;quot;Jutori&amp;quot;, &amp;quot;Discussion jutori&amp;quot;, &amp;quot;Categorie&amp;quot;, &amp;quot;Discussion categorie&amp;quot;],&lt;br /&gt;
		&amp;quot;fy&amp;quot;: [m, &amp;quot;Wiki&amp;quot;, &amp;quot;Oerlis&amp;quot;, &amp;quot;Meidogger&amp;quot;, &amp;quot;Meidogger oerlis&amp;quot;, &amp;quot;Wikipedy&amp;quot;, &amp;quot;Wikipedy oerlis&amp;quot;, &amp;quot;Ofbyld&amp;quot;, &amp;quot;Ofbyld oerlis&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki oerlis&amp;quot;, &amp;quot;Berjocht&amp;quot;, &amp;quot;Berjocht oerlis&amp;quot;, &amp;quot;Hulp&amp;quot;, &amp;quot;Hulp oerlis&amp;quot;, &amp;quot;Kategory&amp;quot;, &amp;quot;Kategory oerlis&amp;quot;],&lt;br /&gt;
		&amp;quot;ga&amp;quot;: [&amp;quot;Meán&amp;quot;, &amp;quot;Speisialta&amp;quot;, &amp;quot;Plé&amp;quot;, &amp;quot;Úsáideoir&amp;quot;, &amp;quot;Plé úsáideora&amp;quot;, &amp;quot;Vicipéid&amp;quot;, &amp;quot;Plé Vicipéide&amp;quot;, &amp;quot;Íomhá&amp;quot;, &amp;quot;Plé íomhá&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Plé MediaWiki&amp;quot;, &amp;quot;Teimpléad&amp;quot;, &amp;quot;Plé teimpléid&amp;quot;, &amp;quot;Cabhair&amp;quot;, &amp;quot;Plé cabhrach&amp;quot;, &amp;quot;Catagóir&amp;quot;, &amp;quot;Plé catagóire&amp;quot;],&lt;br /&gt;
		&amp;quot;gu&amp;quot;: [m, &amp;quot;Special&amp;quot;, &amp;quot;Talk&amp;quot;, &amp;quot;User&amp;quot;, &amp;quot;User talk&amp;quot;, &amp;quot;વિકિપીડિયા&amp;quot;, &amp;quot;વિકિપીડિયા talk&amp;quot;, &amp;quot;Image&amp;quot;, &amp;quot;Image talk&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;he&amp;quot;: [m, &amp;quot;מיוחד&amp;quot;, &amp;quot;שיחה&amp;quot;, &amp;quot;משתמש&amp;quot;, &amp;quot;שיחת משתמש&amp;quot;, &amp;quot;ויקיפדיה&amp;quot;, &amp;quot;שיחת ויקיפדיה&amp;quot;, &amp;quot;תמונה&amp;quot;, &amp;quot;שיחת תמונה&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;שיחת MediaWiki&amp;quot;, &amp;quot;תבנית&amp;quot;, &amp;quot;שיחת תבנית&amp;quot;, &amp;quot;עזרה&amp;quot;, &amp;quot;שיחת עזרה&amp;quot;, &amp;quot;קטגוריה&amp;quot;, &amp;quot;שיחת קטגוריה&amp;quot;],&lt;br /&gt;
		&amp;quot;hi&amp;quot;: [m, &amp;quot;विशेष&amp;quot;, &amp;quot;वार्ता&amp;quot;, &amp;quot;सदस्य&amp;quot;, &amp;quot;सदस्य वार्ता&amp;quot;, &amp;quot;विकिपीडिया&amp;quot;, &amp;quot;विकिपीडिया वार्ता&amp;quot;, &amp;quot;चित्र&amp;quot;, &amp;quot;चित्र वार्ता&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;श्रेणी&amp;quot;, &amp;quot;श्रेणी वार्ता&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;],&lt;br /&gt;
		&amp;quot;hr&amp;quot;: [&amp;quot;Mediji&amp;quot;, &amp;quot;Posebno&amp;quot;, &amp;quot;Razgovor&amp;quot;, &amp;quot;Suradnik&amp;quot;, &amp;quot;Razgovor sa suradnikom&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Razgovor Wikipedia&amp;quot;, &amp;quot;Slika&amp;quot;, &amp;quot;Razgovor o slici&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki razgovor&amp;quot;, &amp;quot;Predložak&amp;quot;, &amp;quot;Razgovor o predlošku&amp;quot;, &amp;quot;Pomoć&amp;quot;, &amp;quot;Razgovor o pomoći&amp;quot;, &amp;quot;Kategorija&amp;quot;, &amp;quot;Razgovor o kategoriji&amp;quot;],&lt;br /&gt;
		&amp;quot;hu&amp;quot;: [ &amp;quot;Média&amp;quot;, &amp;quot;Speciális&amp;quot;, &amp;quot;Vita&amp;quot;, &amp;quot;Szerkesztő&amp;quot;, &amp;quot;Szerkesztővita&amp;quot;, &amp;quot;Wikipédia&amp;quot;, &amp;quot;Wikipédia-vita&amp;quot;, &amp;quot;Kép&amp;quot;, &amp;quot;Képvita&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki-vita&amp;quot;, &amp;quot;Sablon&amp;quot;, &amp;quot;Sablonvita&amp;quot;, &amp;quot;Segítség&amp;quot;, &amp;quot;Segítségvita&amp;quot;, &amp;quot;Kategória&amp;quot;, &amp;quot;Kategóriavita&amp;quot;, &amp;quot;Portál&amp;quot;, &amp;quot;Portálvita&amp;quot;],&lt;br /&gt;
		&amp;quot;ia&amp;quot;: [m, &amp;quot;Special&amp;quot;, &amp;quot;Discussion&amp;quot;, &amp;quot;Usator&amp;quot;, &amp;quot;Discussion Usator&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Discussion Wikipedia&amp;quot;, &amp;quot;Imagine&amp;quot;, &amp;quot;Discussion Imagine&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Discussion MediaWiki&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;id&amp;quot;: [m, &amp;quot;Istimewa&amp;quot;, &amp;quot;Bicara&amp;quot;, &amp;quot;Pengguna&amp;quot;, &amp;quot;Bicara Pengguna&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Pembicaraan Wikipedia&amp;quot;, &amp;quot;Gambar&amp;quot;, &amp;quot;Pembicaraan Gambar&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Pembicaraan MediaWiki&amp;quot;, &amp;quot;Templat&amp;quot;, &amp;quot;Pembicaraan Templat&amp;quot;, &amp;quot;Bantuan&amp;quot;, &amp;quot;Pembicaraan Bantuan&amp;quot;, &amp;quot;Kategori&amp;quot;, &amp;quot;Pembicaraan Kategori&amp;quot;],&lt;br /&gt;
		&amp;quot;is&amp;quot;: [&amp;quot;Miðill&amp;quot;, &amp;quot;Kerfissíða&amp;quot;, &amp;quot;Spjall&amp;quot;, &amp;quot;Notandi&amp;quot;, &amp;quot;Notandaspjall&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipediaspjall&amp;quot;, &amp;quot;Mynd&amp;quot;, &amp;quot;Myndaspjall&amp;quot;, &amp;quot;Melding&amp;quot;, &amp;quot;Meldingarspjall&amp;quot;, &amp;quot;Snið&amp;quot;, &amp;quot;Sniðaspjall&amp;quot;, &amp;quot;Hjálp&amp;quot;, &amp;quot;Hjálparspjall&amp;quot;, &amp;quot;Flokkur&amp;quot;, &amp;quot;Flokkaspjall&amp;quot;],&lt;br /&gt;
		&amp;quot;it&amp;quot;: [m, &amp;quot;Speciale&amp;quot;, &amp;quot;Discussione&amp;quot;, &amp;quot;Utente&amp;quot;, &amp;quot;Discussioni utente&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Discussioni Wikipedia&amp;quot;, &amp;quot;File&amp;quot;, &amp;quot;Discussioni file&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Discussioni MediaWiki&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Discussioni template&amp;quot;, &amp;quot;Aiuto&amp;quot;, &amp;quot;Discussioni aiuto&amp;quot;, &amp;quot;Categoria&amp;quot;, &amp;quot;Discussioni categoria&amp;quot;, &amp;quot;Portale&amp;quot;, &amp;quot;Discussioni portale&amp;quot;, &amp;quot;Progetto&amp;quot;, &amp;quot;Discussioni progetto&amp;quot;],&lt;br /&gt;
		&amp;quot;ja&amp;quot;: [m, &amp;quot;特別&amp;quot;, &amp;quot;ノート&amp;quot;, &amp;quot;利用者&amp;quot;, &amp;quot;利用者‐会話&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia‐ノート&amp;quot;, &amp;quot;画像&amp;quot;, &amp;quot;画像‐ノート&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki‐ノート&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template‐ノート&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help‐ノート&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category‐ノート&amp;quot;],&lt;br /&gt;
		&amp;quot;ka&amp;quot;: [&amp;quot;მედია&amp;quot;, &amp;quot;სპეციალური&amp;quot;, &amp;quot;განხილვა&amp;quot;, &amp;quot;მომხმარებელი&amp;quot;, &amp;quot;მომხმარებელი განხილვა&amp;quot;, &amp;quot;ვიკიპედია&amp;quot;, &amp;quot;ვიკიპედია განხილვა&amp;quot;, &amp;quot;სურათი&amp;quot;, &amp;quot;სურათი განხილვა&amp;quot;, &amp;quot;მედიავიკი&amp;quot;, &amp;quot;მედიავიკი განხილვა&amp;quot;, &amp;quot;თარგი&amp;quot;, &amp;quot;თარგი განხილვა&amp;quot;, &amp;quot;დახმარება&amp;quot;, &amp;quot;დახმარება განხილვა&amp;quot;, &amp;quot;კატეგორია&amp;quot;, &amp;quot;კატეგორია განხილვა&amp;quot;],&lt;br /&gt;
		&amp;quot;ko&amp;quot;: [m, &amp;quot;특수기능&amp;quot;, &amp;quot;토론&amp;quot;, &amp;quot;사용자&amp;quot;, &amp;quot;사용자토론&amp;quot;, &amp;quot;위키백과&amp;quot;, &amp;quot;위키백과토론&amp;quot;, &amp;quot;그림&amp;quot;, &amp;quot;그림토론&amp;quot;, &amp;quot;분류&amp;quot;, &amp;quot;분류토론&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;],&lt;br /&gt;
		&amp;quot;ku&amp;quot;: [&amp;quot;Medya&amp;quot;, &amp;quot;Taybet&amp;quot;, &amp;quot;Nîqaş&amp;quot;, &amp;quot;Bikarhêner&amp;quot;, &amp;quot;Bikarhêner nîqaş&amp;quot;, &amp;quot;Wîkîpediya&amp;quot;, &amp;quot;Wîkîpediya nîqaş&amp;quot;, &amp;quot;Wêne&amp;quot;, &amp;quot;Wêne nîqaş&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki nîqaş&amp;quot;, &amp;quot;Şablon&amp;quot;, &amp;quot;Şablon nîqaş&amp;quot;, &amp;quot;Alîkarî&amp;quot;, &amp;quot;Alîkarî nîqaş&amp;quot;, &amp;quot;Kategorî&amp;quot;, &amp;quot;Kategorî nîqaş&amp;quot;],&lt;br /&gt;
		&amp;quot;la&amp;quot;: [&amp;quot;Specialis&amp;quot;, &amp;quot;Disputatio&amp;quot;, &amp;quot;Usor&amp;quot;, &amp;quot;Disputatio Usoris&amp;quot;, &amp;quot;Vicipaedia&amp;quot;, &amp;quot;Disputatio Vicipaediae&amp;quot;, &amp;quot;Imago&amp;quot;, &amp;quot;Disputatio Imaginis&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Disputatio MediaWiki&amp;quot;, &amp;quot;Formula&amp;quot;, &amp;quot;Disputatio Formulae&amp;quot;, &amp;quot;Auxilium&amp;quot;, &amp;quot;Disputatio Auxilii&amp;quot;, &amp;quot;Categoria&amp;quot;, &amp;quot;Disputatio Categoriae&amp;quot;, m],&lt;br /&gt;
		&amp;quot;li&amp;quot;: [m, &amp;quot;Speciaal&amp;quot;, &amp;quot;Euverlik&amp;quot;, &amp;quot;Gebroeker&amp;quot;, &amp;quot;Euverlik gebroeker&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Euverlik Wikipedia&amp;quot;, &amp;quot;Aafbeilding&amp;quot;, &amp;quot;Euverlik afbeelding&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Euverlik MediaWiki&amp;quot;, &amp;quot;Sjabloon&amp;quot;, &amp;quot;Euverlik sjabloon&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Euverlik help&amp;quot;, &amp;quot;Kategorie&amp;quot;, &amp;quot;Euverlik kategorie&amp;quot;],&lt;br /&gt;
		&amp;quot;lt&amp;quot;: [&amp;quot;Medija&amp;quot;, &amp;quot;Specialus&amp;quot;, &amp;quot;Aptarimas&amp;quot;, &amp;quot;Naudotojas&amp;quot;, &amp;quot;Naudotojo aptarimas&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia aptarimas&amp;quot;, &amp;quot;Vaizdas&amp;quot;, &amp;quot;Vaizdo aptarimas&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki aptarimas&amp;quot;, &amp;quot;Šablonas&amp;quot;, &amp;quot;Šablono aptarimas&amp;quot;, &amp;quot;Pagalba&amp;quot;, &amp;quot;Pagalbos aptarimas&amp;quot;, &amp;quot;Kategorija&amp;quot;, &amp;quot;Kategorijos aptarimas&amp;quot;],&lt;br /&gt;
		&amp;quot;mk&amp;quot;: [&amp;quot;Медија&amp;quot;, &amp;quot;Специјални&amp;quot;, &amp;quot;Разговор&amp;quot;, &amp;quot;Корисник&amp;quot;, &amp;quot;Корисник разговор&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia разговор&amp;quot;, &amp;quot;Слика&amp;quot;, &amp;quot;Слика разговор&amp;quot;, &amp;quot;МедијаВики&amp;quot;, &amp;quot;МедијаВики разговор&amp;quot;, &amp;quot;Шаблон&amp;quot;, &amp;quot;Шаблон разговор&amp;quot;, &amp;quot;Помош&amp;quot;, &amp;quot;Помош разговор&amp;quot;, &amp;quot;Категорија&amp;quot;, &amp;quot;Категорија разговор&amp;quot;],&lt;br /&gt;
		&amp;quot;ms&amp;quot;: [m, &amp;quot;Istimewa&amp;quot;, &amp;quot;Perbualan&amp;quot;, &amp;quot;Pengguna&amp;quot;, &amp;quot;Perbualan Pengguna&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Perbualan Wikipedia&amp;quot;, &amp;quot;Imej&amp;quot;, &amp;quot;Imej Perbualan&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki Perbualan&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;mt&amp;quot;: [m, &amp;quot;Special&amp;quot;, &amp;quot;Talk&amp;quot;, &amp;quot;User&amp;quot;, &amp;quot;User talk&amp;quot;, &amp;quot;Wikipedija&amp;quot;, &amp;quot;Wikipedija talk&amp;quot;, &amp;quot;Image&amp;quot;, &amp;quot;Image talk&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;nap&amp;quot;: [m, &amp;quot;Speciale&amp;quot;, &amp;quot;Discussione&amp;quot;, &amp;quot;Utente&amp;quot;, &amp;quot;Discussioni utente&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Discussioni Wikipedia&amp;quot;, &amp;quot;Immagine&amp;quot;, &amp;quot;Discussioni immagine&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Discussioni MediaWiki&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Discussioni template&amp;quot;, &amp;quot;Aiuto&amp;quot;, &amp;quot;Discussioni aiuto&amp;quot;, &amp;quot;Categoria&amp;quot;, &amp;quot;Discussioni categoria&amp;quot;],&lt;br /&gt;
		&amp;quot;nds&amp;quot;: [m, &amp;quot;Spezial&amp;quot;, &amp;quot;Diskuschoon&amp;quot;, &amp;quot;Bruker&amp;quot;, &amp;quot;Bruker Diskuschoon&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia Diskuschoon&amp;quot;, &amp;quot;Bild&amp;quot;, &amp;quot;Bild Diskuschoon&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki Diskuschoon&amp;quot;, &amp;quot;Vörlaag&amp;quot;, &amp;quot;Vörlaag Diskuschoon&amp;quot;, &amp;quot;Hülp&amp;quot;, &amp;quot;Hülp Diskuschoon&amp;quot;, &amp;quot;Kategorie&amp;quot;, &amp;quot;Kategorie Diskuschoon&amp;quot;],&lt;br /&gt;
		&amp;quot;nl&amp;quot;: [m, &amp;quot;Speciaal&amp;quot;, &amp;quot;Overleg&amp;quot;, &amp;quot;Gebruiker&amp;quot;, &amp;quot;Overleg gebruiker&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Overleg Wikipedia&amp;quot;, &amp;quot;Afbeelding&amp;quot;, &amp;quot;Overleg afbeelding&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Overleg MediaWiki&amp;quot;, &amp;quot;Sjabloon&amp;quot;, &amp;quot;Overleg sjabloon&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Overleg help&amp;quot;, &amp;quot;Categorie&amp;quot;, &amp;quot;Overleg categorie&amp;quot;],&lt;br /&gt;
		&amp;quot;nn&amp;quot;: [&amp;quot;Filpeikar&amp;quot;, &amp;quot;Spesial&amp;quot;, &amp;quot;Diskusjon&amp;quot;, &amp;quot;Brukar&amp;quot;, &amp;quot;Brukardiskusjon&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia-diskusjon&amp;quot;, &amp;quot;Fil&amp;quot;, &amp;quot;Fildiskusjon&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki-diskusjon&amp;quot;, &amp;quot;Mal&amp;quot;, &amp;quot;Maldiskusjon&amp;quot;, &amp;quot;Hjelp&amp;quot;, &amp;quot;Hjelpdiskusjon&amp;quot;, &amp;quot;Kategori&amp;quot;, &amp;quot;Kategoridiskusjon&amp;quot;],&lt;br /&gt;
		&amp;quot;no&amp;quot;: [&amp;quot;Medium&amp;quot;, &amp;quot;Spesial&amp;quot;, &amp;quot;Diskusjon&amp;quot;, &amp;quot;Bruker&amp;quot;, &amp;quot;Brukerdiskusjon&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia-diskusjon&amp;quot;, &amp;quot;Bilde&amp;quot;, &amp;quot;Bildediskusjon&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki-diskusjon&amp;quot;, &amp;quot;Mal&amp;quot;, &amp;quot;Maldiskusjon&amp;quot;, &amp;quot;Hjelp&amp;quot;, &amp;quot;Hjelpdiskusjon&amp;quot;, &amp;quot;Kategori&amp;quot;, &amp;quot;Kategoridiskusjon&amp;quot;],&lt;br /&gt;
		&amp;quot;nv&amp;quot;: [m, &amp;quot;Special&amp;quot;, &amp;quot;Naaltsoos baa yinísht'į́&amp;quot;, &amp;quot;Choinish'įįhí&amp;quot;, &amp;quot;Choinish'įįhí baa yinísht'į́&amp;quot;, &amp;quot;Wikiibíídiiya&amp;quot;, &amp;quot;Wikiibíídiiya baa yinísht'į́&amp;quot;, &amp;quot;E'elyaaígíí&amp;quot;, &amp;quot;E'elyaaígíí baa yinísht'į́&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki baa yinísht'į́&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Aná'álwo'&amp;quot;, &amp;quot;Aná'álwo' baa yinísht'į́&amp;quot;, &amp;quot;T'ááłáhági át'éego&amp;quot;, &amp;quot;T'ááłáhági át'éego baa yinísht'į́&amp;quot;],&lt;br /&gt;
		&amp;quot;oc&amp;quot;: [&amp;quot;Especial&amp;quot;, &amp;quot;Discutir&amp;quot;, &amp;quot;Utilisator&amp;quot;, &amp;quot;Discutida Utilisator&amp;quot;, &amp;quot;Oiquipedià&amp;quot;, &amp;quot;Discutida Oiquipedià&amp;quot;, &amp;quot;Image&amp;quot;, &amp;quot;Discutida Image&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, m, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;os&amp;quot;: [m, &amp;quot;Сæрмагонд&amp;quot;, &amp;quot;Дискусси&amp;quot;, &amp;quot;Архайæг&amp;quot;, &amp;quot;Архайæджы дискусси&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;Ныв&amp;quot;, &amp;quot;Нывы тыххæй дискусси&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Дискусси MediaWiki&amp;quot;, &amp;quot;Шаблон&amp;quot;, &amp;quot;Шаблоны тыххæй дискусси&amp;quot;, &amp;quot;Æххуыс&amp;quot;, &amp;quot;Æххуысы тыххæй дискусси&amp;quot;, &amp;quot;Категори&amp;quot;, &amp;quot;Категорийы тыххæй дискусси&amp;quot;],&lt;br /&gt;
		&amp;quot;pa&amp;quot;: [&amp;quot;ਮੀਡੀਆ&amp;quot;, &amp;quot;ਖਾਸ&amp;quot;, &amp;quot;ਚਰਚਾ&amp;quot;, &amp;quot;ਮੈਂਬਰ&amp;quot;, &amp;quot;ਮੈਂਬਰ ਚਰਚਾ&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia ਚਰਚਾ&amp;quot;, &amp;quot;ਤਸਵੀਰ&amp;quot;, &amp;quot;ਤਸਵੀਰ ਚਰਚਾ&amp;quot;, &amp;quot;ਮੀਡੀਆਵਿਕਿ&amp;quot;, &amp;quot;ਮੀਡੀਆਵਿਕਿ ਚਰਚਾ&amp;quot;, &amp;quot;ਨਮੂਨਾ&amp;quot;, &amp;quot;ਨਮੂਨਾ ਚਰਚਾ&amp;quot;, &amp;quot;ਮਦਦ&amp;quot;, &amp;quot;ਮਦਦ ਚਰਚਾ&amp;quot;, &amp;quot;ਸ਼੍ਰੇਣੀ&amp;quot;, &amp;quot;ਸ਼੍ਰੇਣੀ ਚਰਚਾ&amp;quot;],&lt;br /&gt;
		&amp;quot;pl&amp;quot;: [m, &amp;quot;Specjalna&amp;quot;, &amp;quot;Dyskusja&amp;quot;, &amp;quot;Wikipedysta&amp;quot;, &amp;quot;Dyskusja wikipedysty&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Dyskusja Wikipedii&amp;quot;, &amp;quot;Plik&amp;quot;, &amp;quot;Dyskusja pliku&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Dyskusja MediaWiki&amp;quot;, &amp;quot;Szablon&amp;quot;, &amp;quot;Dyskusja szablonu&amp;quot;, &amp;quot;Pomoc&amp;quot;, &amp;quot;Dyskusja pomocy&amp;quot;, &amp;quot;Kategoria&amp;quot;, &amp;quot;Dyskusja kategorii&amp;quot;, &amp;quot;Portal&amp;quot;, &amp;quot;Dyskusja portalu&amp;quot;,&amp;quot;Wikiprojekt&amp;quot;,&amp;quot;Dyskusja Wikiprojektu&amp;quot;],&lt;br /&gt;
		&amp;quot;pt&amp;quot;: [m, &amp;quot;Especial&amp;quot;, &amp;quot;Discussão&amp;quot;, &amp;quot;Usuário&amp;quot;, &amp;quot;Usuário Discussão&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia Discussão&amp;quot;, &amp;quot;Imagem&amp;quot;, &amp;quot;Imagem Discussão&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki Discussão&amp;quot;, &amp;quot;Predefinição&amp;quot;, &amp;quot;Predefinição Discussão&amp;quot;, &amp;quot;Ajuda&amp;quot;, &amp;quot;Ajuda Discussão&amp;quot;, &amp;quot;Categoria&amp;quot;, &amp;quot;Categoria Discussão&amp;quot;],&lt;br /&gt;
		&amp;quot;ro&amp;quot;: [m, &amp;quot;Special&amp;quot;, &amp;quot;Discuţie&amp;quot;, &amp;quot;Utilizator&amp;quot;, &amp;quot;Discuţie Utilizator&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Discuţie Wikipedia&amp;quot;, &amp;quot;Imagine&amp;quot;, &amp;quot;Discuţie Imagine&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Discuţie MediaWiki&amp;quot;, &amp;quot;Format&amp;quot;, &amp;quot;Discuţie Format&amp;quot;, &amp;quot;Ajutor&amp;quot;, &amp;quot;Discuţie Ajutor&amp;quot;, &amp;quot;Categorie&amp;quot;, &amp;quot;Discuţie Categorie&amp;quot;],&lt;br /&gt;
		&amp;quot;ru&amp;quot;: [&amp;quot;Медиа&amp;quot;, &amp;quot;Служебная&amp;quot;, &amp;quot;Обсуждение&amp;quot;, &amp;quot;Участник&amp;quot;, &amp;quot;Обсуждение участника&amp;quot;, &amp;quot;Википедия&amp;quot;, &amp;quot;Обсуждение Википедии&amp;quot;, &amp;quot;Изображение&amp;quot;, &amp;quot;Обсуждение изображения&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Обсуждение MediaWiki&amp;quot;, &amp;quot;Шаблон&amp;quot;, &amp;quot;Обсуждение шаблона&amp;quot;, &amp;quot;Справка&amp;quot;, &amp;quot;Обсуждение справки&amp;quot;, &amp;quot;Категория&amp;quot;, &amp;quot;Обсуждение категории&amp;quot;],&lt;br /&gt;
		&amp;quot;sc&amp;quot;: [&amp;quot;Speciale&amp;quot;, &amp;quot;Contièndha&amp;quot;, &amp;quot;Utente&amp;quot;, &amp;quot;Utente discussioni&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia discussioni&amp;quot;, &amp;quot;Immàgini&amp;quot;, &amp;quot;Immàgini contièndha&amp;quot;, m, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;sk&amp;quot;: [&amp;quot;Médiá&amp;quot;, &amp;quot;Špeciálne&amp;quot;, &amp;quot;Diskusia&amp;quot;, &amp;quot;Redaktor&amp;quot;, &amp;quot;Diskusia s redaktorom&amp;quot;, &amp;quot;Wikipédia&amp;quot;, &amp;quot;Diskusia k Wikipédii&amp;quot;, &amp;quot;Obrázok&amp;quot;, &amp;quot;Diskusia k obrázku&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Diskusia k MediaWiki&amp;quot;, &amp;quot;Šablóna&amp;quot;, &amp;quot;Diskusia k šablóne&amp;quot;, &amp;quot;Pomoc&amp;quot;, &amp;quot;Diskusia k pomoci&amp;quot;, &amp;quot;Kategória&amp;quot;, &amp;quot;Diskusia ku kategórii&amp;quot;],&lt;br /&gt;
		&amp;quot;sl&amp;quot;: [m, &amp;quot;Posebno&amp;quot;, &amp;quot;Pogovor&amp;quot;, &amp;quot;Uporabnik&amp;quot;, &amp;quot;Uporabniški pogovor&amp;quot;, &amp;quot;Wikipedija&amp;quot;, &amp;quot;Pogovor k Wikipediji&amp;quot;, &amp;quot;Slika&amp;quot;, &amp;quot;Pogovor k sliki&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki talk&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;sq&amp;quot;: [m, &amp;quot;Speciale&amp;quot;, &amp;quot;Diskutim&amp;quot;, &amp;quot;Përdoruesi&amp;quot;, &amp;quot;Përdoruesi diskutim&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia diskutim&amp;quot;, &amp;quot;Figura&amp;quot;, &amp;quot;Figura diskutim&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki diskutim&amp;quot;, &amp;quot;Stampa&amp;quot;, &amp;quot;Stampa diskutim&amp;quot;, &amp;quot;Ndihmë&amp;quot;, &amp;quot;Ndihmë diskutim&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;sr&amp;quot;: [m, &amp;quot;Посебно&amp;quot;, &amp;quot;Разговор&amp;quot;, &amp;quot;Корисник&amp;quot;, &amp;quot;Разговор са корисником&amp;quot;, &amp;quot;Википедија&amp;quot;, &amp;quot;Разговор о Википедији&amp;quot;, &amp;quot;Слика&amp;quot;, &amp;quot;Разговор о слици&amp;quot;, &amp;quot;МедијаВики&amp;quot;, &amp;quot;Разговор о МедијаВикију&amp;quot;, &amp;quot;Шаблон&amp;quot;, &amp;quot;Разговор о шаблону&amp;quot;, &amp;quot;Помоћ&amp;quot;, &amp;quot;Разговор о помоћи&amp;quot;, &amp;quot;Категорија&amp;quot;, &amp;quot;Разговор о категорији&amp;quot;, &amp;quot;Портал&amp;quot;, &amp;quot;Разговор о порталу&amp;quot;],&lt;br /&gt;
		&amp;quot;sv&amp;quot;: [m, &amp;quot;Special&amp;quot;, &amp;quot;Diskussion&amp;quot;, &amp;quot;Användare&amp;quot;, &amp;quot;Användardiskussion&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipediadiskussion&amp;quot;, &amp;quot;Bild&amp;quot;, &amp;quot;Bilddiskussion&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki diskussion&amp;quot;, &amp;quot;Mall&amp;quot;, &amp;quot;Malldiskussion&amp;quot;, &amp;quot;Hjälp&amp;quot;, &amp;quot;Hjälp diskussion&amp;quot;, &amp;quot;Kategori&amp;quot;, &amp;quot;Kategoridiskussion&amp;quot;],&lt;br /&gt;
		&amp;quot;ta&amp;quot;: [&amp;quot;ஊடகம்&amp;quot;, &amp;quot;சிறப்பு&amp;quot;, &amp;quot;பேச்சு&amp;quot;, &amp;quot;பயனர்&amp;quot;, &amp;quot;பயனர் பேச்சு&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia பேச்சு&amp;quot;, &amp;quot;படிமம்&amp;quot;, &amp;quot;படிமப் பேச்சு&amp;quot;, &amp;quot;மீடியாவிக்கி&amp;quot;, &amp;quot;மீடியாவிக்கி பேச்சு&amp;quot;, &amp;quot;வார்ப்புரு&amp;quot;, &amp;quot;வார்ப்புரு பேச்சு&amp;quot;, &amp;quot;உதவி&amp;quot;, &amp;quot;உதவி பேச்சு&amp;quot;, &amp;quot;பகுப்பு&amp;quot;, &amp;quot;பகுப்பு பேச்சு&amp;quot;],&lt;br /&gt;
		&amp;quot;th&amp;quot;: [m, &amp;quot;พิเศษ&amp;quot;, &amp;quot;พูดคุย&amp;quot;, &amp;quot;ผู้ใช้&amp;quot;, &amp;quot;คุยเกี่ยวกับผู้ใช้&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia talk&amp;quot;, &amp;quot;ภาพ&amp;quot;, &amp;quot;คุยเกี่ยวกับภาพ&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;คุยเกี่ยวกับ MediaWiki&amp;quot;, &amp;quot;Template&amp;quot;, &amp;quot;Template talk&amp;quot;, &amp;quot;Help&amp;quot;, &amp;quot;Help talk&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;Category talk&amp;quot;],&lt;br /&gt;
		&amp;quot;tlh&amp;quot;: [&amp;quot;Doch&amp;quot;, &amp;quot;le'&amp;quot;, &amp;quot;ja'chuq&amp;quot;, &amp;quot;lo'wI'&amp;quot;, &amp;quot;lo'wI' ja'chuq&amp;quot;, &amp;quot;wIqIpe'DIya&amp;quot;, &amp;quot;wIqIpe'DIya ja'chuq&amp;quot;, &amp;quot;nagh beQ&amp;quot;, &amp;quot;nagh beQ ja'chuq&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki ja'chuq&amp;quot;, &amp;quot;chen'ay'&amp;quot;, &amp;quot;chen'ay' ja'chuq&amp;quot;, &amp;quot;QaH&amp;quot;, &amp;quot;QaH ja'chuq&amp;quot;, &amp;quot;Segh&amp;quot;, &amp;quot;Segh ja'chuq&amp;quot;],&lt;br /&gt;
		&amp;quot;tr&amp;quot;: [m, &amp;quot;Özel&amp;quot;, &amp;quot;Tartışma&amp;quot;, &amp;quot;Kullanıcı&amp;quot;, &amp;quot;Kullanıcı mesaj&amp;quot;, &amp;quot;Vikipedi&amp;quot;, &amp;quot;Vikipedi tartışma&amp;quot;, &amp;quot;Resim&amp;quot;, &amp;quot;Resim tartışma&amp;quot;, &amp;quot;MedyaViki&amp;quot;, &amp;quot;MedyaViki tartışma&amp;quot;, &amp;quot;Şablon&amp;quot;, &amp;quot;Şablon tartışma&amp;quot;, &amp;quot;Yardım&amp;quot;, &amp;quot;Yardım tartışma&amp;quot;, &amp;quot;Kategori&amp;quot;, &amp;quot;Kategori tartışma&amp;quot;],&lt;br /&gt;
		&amp;quot;tt&amp;quot;: [m, &amp;quot;Maxsus&amp;quot;, &amp;quot;Bäxäs&amp;quot;, &amp;quot;Äğzä&amp;quot;, &amp;quot;Äğzä bäxäse&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia bäxäse&amp;quot;, &amp;quot;Räsem&amp;quot;, &amp;quot;Räsem bäxäse&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki bäxäse&amp;quot;, &amp;quot;Ürnäk&amp;quot;, &amp;quot;Ürnäk bäxäse&amp;quot;, &amp;quot;Yärdäm&amp;quot;, &amp;quot;Yärdäm bäxäse&amp;quot;, &amp;quot;Törkem&amp;quot;, &amp;quot;Törkem bäxäse&amp;quot;],&lt;br /&gt;
		&amp;quot;uk&amp;quot;: [&amp;quot;Медіа&amp;quot;, &amp;quot;Спеціальні&amp;quot;, &amp;quot;Обговорення&amp;quot;, &amp;quot;Користувач&amp;quot;, &amp;quot;Обговорення користувача&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Обговорення Wikipedia&amp;quot;, &amp;quot;Зображення&amp;quot;, &amp;quot;Обговорення зображення&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Обговорення MediaWiki&amp;quot;, &amp;quot;Шаблон&amp;quot;, &amp;quot;Обговорення шаблону&amp;quot;, &amp;quot;Довідка&amp;quot;, &amp;quot;Обговорення довідки&amp;quot;, &amp;quot;Категорія&amp;quot;, &amp;quot;Обговорення категорії&amp;quot;],&lt;br /&gt;
		&amp;quot;vi&amp;quot;: [&amp;quot;Phương tiện&amp;quot;, &amp;quot;Đặc biệt&amp;quot;, &amp;quot;Thảo luận&amp;quot;, &amp;quot;Thành viên&amp;quot;, &amp;quot;Thảo luận Thành viên&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Thảo luận Wikipedia&amp;quot;, &amp;quot;Hình&amp;quot;, &amp;quot;Thảo luận Hình&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;Thảo luận MediaWiki&amp;quot;, &amp;quot;Tiêu bản&amp;quot;, &amp;quot;Thảo luận Tiêu bản&amp;quot;, &amp;quot;Trợ giúp&amp;quot;, &amp;quot;Thảo luận Trợ giúp&amp;quot;, &amp;quot;Thể loại&amp;quot;, &amp;quot;Thảo luận Thể loại&amp;quot;],&lt;br /&gt;
		&amp;quot;wa&amp;quot;: [m, &amp;quot;Sipeciås&amp;quot;, &amp;quot;Copene&amp;quot;, &amp;quot;Uzeu&amp;quot;, &amp;quot;Uzeu copene&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia copene&amp;quot;, &amp;quot;Imådje&amp;quot;, &amp;quot;Imådje copene&amp;quot;, &amp;quot;MediaWiki&amp;quot;, &amp;quot;MediaWiki copene&amp;quot;, &amp;quot;Modele&amp;quot;, &amp;quot;Modele copene&amp;quot;, &amp;quot;Aidance&amp;quot;, &amp;quot;Aidance copene&amp;quot;, &amp;quot;Categoreye&amp;quot;, &amp;quot;Categoreye copene&amp;quot;]&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
	pg.ns.list = nsLists[pg.wiki.lang] || list;&lt;br /&gt;
	pg.ns.index = nsIndex;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function namespaceListToRegex(list) {return RegExp('^('+list.join('|').split(' ').join('[ _]')+'):');};&lt;br /&gt;
// function setNamespaceList is ugly as sin, moved to later in the code&lt;br /&gt;
 &lt;br /&gt;
function setNamespaces() {&lt;br /&gt;
	setNamespaceList();&lt;br /&gt;
	pg.ns.withTalkList=[null]; // NB root (article) corresponds with this entry, null&lt;br /&gt;
	pg.ns.talkList=[pg.ns.list[2]];&lt;br /&gt;
 &lt;br /&gt;
	// if the number of namespaces changes then this will have to be changed&lt;br /&gt;
	// maybe the easiest way is to specify the arrays by hand as in the comments following the loop&lt;br /&gt;
 &lt;br /&gt;
	for (var i=3; i+1&amp;lt;pg.ns.list.length; i=i+2) {&lt;br /&gt;
		pg.ns.withTalkList.push(pg.ns.list[i]);&lt;br /&gt;
		pg.ns.talkList.push(pg.ns.list[i+1]);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// ALERT! SILLY HARDCODED VALUES FOLLOW!&lt;br /&gt;
	pg.ns.special   = pg.ns.list[pg.ns.index.Special];&lt;br /&gt;
	pg.ns.image     = pg.ns.list[pg.ns.index.File];&lt;br /&gt;
	pg.ns.user      = pg.ns.list[pg.ns.index.User];&lt;br /&gt;
	pg.ns.usertalk  = pg.ns.list[pg.ns.index['User talk']];&lt;br /&gt;
	pg.ns.category  = pg.ns.list[pg.ns.index.Category];&lt;br /&gt;
	pg.ns.template  = pg.ns.list[pg.ns.index.Template];&lt;br /&gt;
	pg.ns.nonArticleList=pg.ns.list.slice(0,2).concat(pg.ns.list.slice(2));&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function setRedirs() {&lt;br /&gt;
	var r='redirect';&lt;br /&gt;
	var R='REDIRECT';&lt;br /&gt;
	var redirLists={&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		'ar':  [ R, 'تحويل' ],&lt;br /&gt;
		'be':  [ r, 'перанакіраваньне' ],&lt;br /&gt;
		'bg':  [ r, 'пренасочване', 'виж' ],&lt;br /&gt;
		'bs':  [ r, 'Preusmjeri', 'preusmjeri', 'PREUSMJERI' ],&lt;br /&gt;
		'cs':  [ R, 'PŘESMĚRUJ' ],&lt;br /&gt;
		'cy':  [ r, 'ail-cyfeirio' ],&lt;br /&gt;
		'et':  [ r, 'suuna' ],&lt;br /&gt;
		'ga':  [ r, 'athsheoladh' ],&lt;br /&gt;
		'he':  [ R, 'הפניה' ],&lt;br /&gt;
		'hu':  [ R, 'ÁTIRÁNYÍTÁS' ],&lt;br /&gt;
		'is':  [ r, 'tilvísun', 'TILVÍSUN' ],&lt;br /&gt;
		'it':  [ R, 'RINVIA', 'Rinvia'],&lt;br /&gt;
		'mk':  [ r, 'пренасочување', 'види' ],&lt;br /&gt;
		'nds': [ r, 'wiederleiden' ],&lt;br /&gt;
		'nn':  [ r, 'omdiriger' ],&lt;br /&gt;
		'pl':  [ R, 'PATRZ', 'PRZEKIERUJ', 'TAM' ],&lt;br /&gt;
		'pt':  [ R, 'redir' ],&lt;br /&gt;
		'ru':  [ R, 'ПЕРЕНАПРАВЛЕНИЕ', 'ПЕРЕНАПР' ],&lt;br /&gt;
		'sk':  [ r, 'presmeruj' ],&lt;br /&gt;
		'sr':  [ r, 'Преусмери', 'преусмери', 'ПРЕУСМЕРИ', 'Preusmeri', 'preusmeri', 'PREUSMERI' ],&lt;br /&gt;
		'tt':  [ 'yünältü' ],&lt;br /&gt;
		'vi':  [ r, 'đổi' ] // no comma&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
	var redirList=redirLists[ pg.wiki.lang ] || [r, R];&lt;br /&gt;
	// Mediawiki is very tolerant about what comes after the #redirect at the start&lt;br /&gt;
	pg.re.redirect=RegExp('^\\s*[#](' + redirList.join('|') + ').*?\\[{2}([^\\|\\]]*)(|[^\\]]*)?\\]{2}\\s*(.*)', 'i');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setInterwiki() {&lt;br /&gt;
	if (pg.wiki.wikimedia) {&lt;br /&gt;
		pg.wiki.interwiki='aa|ab|af|ak|als|am|an|ang|ar|arc|arz|as|ast|av|ay|az|ba|be|ber|bg|bh|bi|bm|bn|bdf|bo|br|bs|ca|ce|ceb|ch|cho|chr|chy|co|commons|cr|cs|csb|cu|cv|cy|da|de|dsb|dv|dz|el|en|eo|es|et|eu|fa|ff|fi|fiu-vro|fj|fo|fr|fur|fy|ga|gd|gil|gl|gn|got|gu|gv|ha|haw|he|hi|ho|hr|hsb|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|ilo|io|is|it|iu|ja|jbo|jv|ka|kg|ki|kj|kk|kl|km|kn|ko|kr|ks|ksh|ku|kv|kw|ky|la|lad|lan|lb|lg|li|ln|lmo|lo|lt|lu|lv|map-bms|mg|mh|mi|mk|ml|mn|mo|mr|ms|mt|stq|mus|my|na|nah|nap|nb|nd|nds|nds-nl|ne|new|ng|nl|nn|no|nr|nv|ny|oc|oj|om|or|os|pa|pam|pi|pl|pms|ps|pt|qu|rm|rn|ro|roa-rup|ru|rw|sa|sc|scn|sco|sd|se|sg|sh|si|simple|sk|sl|sm|smg|sn|so|sq|sr|ss|st|stq|su|sv|sw|szl|ta|te|tg|th|ti|tk|tl|tlh|tn|to|tpi|tr|ts|tt|tum|tw|ty|ug|uk|ur|uz|ve|vi|vk|vo|wa|war|wen|wo|xh|yi|yo|za|zh|zh-min-nan|zh-yue|zu';&lt;br /&gt;
		pg.re.interwiki=RegExp('^'+pg.wiki.interwiki+':');&lt;br /&gt;
	} else {&lt;br /&gt;
		pg.wiki.interwiki=null;&lt;br /&gt;
		pg.re.interwiki=RegExp('^$');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function nsRe(label) {&lt;br /&gt;
	var l=upcaseFirst(label);&lt;br /&gt;
	return nsRegexString(pg.ns.list[pg.ns.index[l]], l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function nsReImage() {&lt;br /&gt;
	var str = pg.ns.list[pg.ns.index[&amp;quot;File&amp;quot;]];&lt;br /&gt;
	return '(?:' + str + '|' + encodeURI(str) + '|' + upcaseFirst(str) + '|Image|' + upcaseFirst('Image') + ')';&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function nsRegexString(str, extra) {&lt;br /&gt;
	return '(?:' + str + '|' + encodeURI(str) + (extra ? '|' + extra : '') + ')';&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function nsRegex(str, extra) {&lt;br /&gt;
	return RegExp(nsRegexString(str, extra));&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: namespaces.js&lt;br /&gt;
// STARTFILE: selpop.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function getEditboxSelection() {&lt;br /&gt;
	// see http://www.webgurusforum.com/8/12/0&lt;br /&gt;
	try {&lt;br /&gt;
		var editbox=document.editform.wpTextbox1;&lt;br /&gt;
	} catch (dang) { return; }&lt;br /&gt;
	// IE, Opera&lt;br /&gt;
	if (document.selection) { return document.selection.createRange().text; }&lt;br /&gt;
	// Mozilla&lt;br /&gt;
	var selStart = editbox.selectionStart;&lt;br /&gt;
	var selEnd = editbox.selectionEnd;&lt;br /&gt;
	return (editbox.value).substring(selStart, selEnd);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function doSelectionPopup() {&lt;br /&gt;
	// popup if the selection looks like [[foo|anything afterwards at all&lt;br /&gt;
	// or [[foo|bar]]text without ']]'&lt;br /&gt;
	// or [[foo|bar]]&lt;br /&gt;
	var sel=getEditboxSelection();&lt;br /&gt;
	var open=sel.indexOf('[[');&lt;br /&gt;
	var pipe=sel.indexOf('|');&lt;br /&gt;
	var close=sel.indexOf(']]');&lt;br /&gt;
	if (open == -1 || ( pipe == -1 &amp;amp;&amp;amp; close == -1) ) { return; }&lt;br /&gt;
	if (pipe != -1 &amp;amp;&amp;amp; open &amp;gt; pipe || close != -1 &amp;amp;&amp;amp; open &amp;gt; close) { return; }&lt;br /&gt;
	if (getValueOf('popupOnEditSelection')=='boxpreview') {&lt;br /&gt;
		return doSeparateSelectionPopup(sel);&lt;br /&gt;
	}&lt;br /&gt;
	var article=new Title(sel.substring(open+2, (pipe &amp;lt; 0) ? close : pipe)).urlString();&lt;br /&gt;
	if (close &amp;gt; 0 &amp;amp;&amp;amp; sel.substring(close+2).indexOf('[[') &amp;gt;= 0) { &lt;br /&gt;
		return; &lt;br /&gt;
	}&lt;br /&gt;
	var a=document.createElement('a');&lt;br /&gt;
	a.href=pg.wiki.titlebase + article;&lt;br /&gt;
	mouseOverWikiLink2(a);&lt;br /&gt;
	if (a.navpopup) {&lt;br /&gt;
		a.navpopup.addHook(function(){runStopPopupTimer(a.navpopup);}, 'unhide', 'after');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function doSeparateSelectionPopup(str) {&lt;br /&gt;
	var div=document.getElementById('selectionPreview');&lt;br /&gt;
	if (!div) {&lt;br /&gt;
		div = document.createElement('div');&lt;br /&gt;
		div.id='selectionPreview';&lt;br /&gt;
		try { var box=document.editform.wpTextbox1; }&lt;br /&gt;
		catch (oopsie) { return; }&lt;br /&gt;
		box.parentNode.insertBefore(div, box);&lt;br /&gt;
	}&lt;br /&gt;
	div.innerHTML=wiki2html(str);&lt;br /&gt;
	div.ranSetupTooltipsAlready = false;&lt;br /&gt;
	popTipsSoonFn('selectionPreview')();&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: selpop.js&lt;br /&gt;
// STARTFILE: navpopup.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview  Defines two classes: {@link Navpopup} and {@link Mousetracker}.&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;code&amp;gt;Navpopup&amp;lt;/code&amp;gt; describes popups: when they appear, where, what&lt;br /&gt;
   they look like and so on.&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;code&amp;gt;Mousetracker&amp;lt;/code&amp;gt; &amp;quot;captures&amp;quot; the mouse using&lt;br /&gt;
   &amp;lt;code&amp;gt;document.onmousemove&amp;lt;/code&amp;gt;.&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Mousetracker.&lt;br /&gt;
   @constructor&lt;br /&gt;
   @class The Mousetracker class. This monitors mouse movements and manages associated hooks.&lt;br /&gt;
*/&lt;br /&gt;
function Mousetracker() {&lt;br /&gt;
	/**&lt;br /&gt;
	   Interval to regularly run the hooks anyway, in milliseconds.&lt;br /&gt;
	   @type Integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.loopDelay=400;&lt;br /&gt;
 &lt;br /&gt;
	/**&lt;br /&gt;
	   Timer for the loop.&lt;br /&gt;
	   @type Timer&lt;br /&gt;
	*/&lt;br /&gt;
	this.timer=null;&lt;br /&gt;
 &lt;br /&gt;
	/**&lt;br /&gt;
	   Flag - are we switched on?&lt;br /&gt;
	   @type Boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.active=false;&lt;br /&gt;
	/**&lt;br /&gt;
	   Flag - are we probably inaccurate, i.e. not reflecting the actual mouse position?&lt;br /&gt;
	*/&lt;br /&gt;
	this.dirty=true;&lt;br /&gt;
	/**&lt;br /&gt;
	   Array of hook functions.&lt;br /&gt;
	   @private&lt;br /&gt;
	   @type Array&lt;br /&gt;
	*/&lt;br /&gt;
	this.hooks=[];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Adds a hook, to be called when we get events.&lt;br /&gt;
   @param {Function} f A function which is called as&lt;br /&gt;
   &amp;lt;code&amp;gt;f(x,y)&amp;lt;/code&amp;gt;. It should return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when it&lt;br /&gt;
   wants to be removed, and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.addHook = function (f) {&lt;br /&gt;
	this.hooks.push(f);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Runs hooks, passing them the x&lt;br /&gt;
   and y coords of the mouse.  Hook functions that return true are&lt;br /&gt;
   passed to {@link Mousetracker#removeHooks} for removal.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.runHooks = function () {&lt;br /&gt;
	if (!this.hooks || !this.hooks.length) { return; }&lt;br /&gt;
	//log('Mousetracker.runHooks; we got some hooks to run');&lt;br /&gt;
	var remove=false;&lt;br /&gt;
	var removeObj={};&lt;br /&gt;
	// this method gets called a LOT -&lt;br /&gt;
	// pre-cache some variables&lt;br /&gt;
	var x=this.x, y=this.y, len = this.hooks.length;&lt;br /&gt;
 &lt;br /&gt;
	for (var i=0; i&amp;lt;len; ++i) {&lt;br /&gt;
		//~ run the hook function, and remove it if it returns true&lt;br /&gt;
		if (this.hooks[i](x, y)===true) {&lt;br /&gt;
			remove=true;&lt;br /&gt;
			removeObj[i]=true;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (remove) { this.removeHooks(removeObj); }&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Removes hooks.&lt;br /&gt;
   @private&lt;br /&gt;
   @param {Object} removeObj An object whose keys are the index&lt;br /&gt;
   numbers of functions for removal, with values that evaluate to true&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.removeHooks = function(removeObj) {&lt;br /&gt;
	var newHooks=[];&lt;br /&gt;
	var len = this.hooks.length;&lt;br /&gt;
	for (var i=0; i&amp;lt;len; ++i) {&lt;br /&gt;
		if (! removeObj[i]) { newHooks.push(this.hooks[i]); }&lt;br /&gt;
	}&lt;br /&gt;
	this.hooks=newHooks;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Event handler for mouse wiggles.&lt;br /&gt;
   We simply grab the event, set x and y and run the hooks.&lt;br /&gt;
   This makes the cpu all hot and bothered :-(&lt;br /&gt;
   @private&lt;br /&gt;
   @param {Event} e Mousemove event&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.track=function (e) {&lt;br /&gt;
	//~ Apparently this is needed in IE.&lt;br /&gt;
	e = e || window.event;&lt;br /&gt;
	var x, y;&lt;br /&gt;
	if (e) {&lt;br /&gt;
		if (e.pageX) { x=e.pageX; y=e.pageY; }&lt;br /&gt;
		else if (typeof e.clientX!='undefined') {&lt;br /&gt;
			var left, top, docElt = window.document.documentElement;&lt;br /&gt;
 &lt;br /&gt;
			if (docElt) { left=docElt.scrollLeft; }&lt;br /&gt;
			left = left || window.document.body.scrollLeft || window.document.scrollLeft || 0;&lt;br /&gt;
 &lt;br /&gt;
			if (docElt) { top=docElt.scrollTop; }&lt;br /&gt;
			top = top || window.document.body.scrollTop || window.document.scrollTop || 0;&lt;br /&gt;
 &lt;br /&gt;
			x=e.clientX + left;&lt;br /&gt;
			y=e.clientY + top;&lt;br /&gt;
		} else { return; }&lt;br /&gt;
		this.setPosition(x,y);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Sets the x and y coordinates stored and takes appropriate action,&lt;br /&gt;
   running hooks as appropriate.&lt;br /&gt;
   @param {Integer} x, y Screen coordinates to set&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
Mousetracker.prototype.setPosition=function(x,y) {&lt;br /&gt;
	this.x = x;&lt;br /&gt;
	this.y = y;&lt;br /&gt;
	if (this.dirty || this.hooks.length === 0) { this.dirty=false; return; }&lt;br /&gt;
	if (typeof this.lastHook_x != 'number') { this.lastHook_x = -100; this.lastHook_y=-100; }&lt;br /&gt;
	var diff = (this.lastHook_x - x)*(this.lastHook_y - y);&lt;br /&gt;
	diff = (diff &amp;gt;= 0) ? diff : -diff;&lt;br /&gt;
	if ( diff &amp;gt; 1 ) {&lt;br /&gt;
		this.lastHook_x=x;&lt;br /&gt;
		this.lastHook_y=y;&lt;br /&gt;
		if (this.dirty) { this.dirty = false; }&lt;br /&gt;
		else { this.runHooks(); }&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Sets things in motion, unless they are already that is, registering an event handler on &amp;lt;code&amp;gt;document.onmousemove&amp;lt;/code&amp;gt;.&lt;br /&gt;
   A half-hearted attempt is made to preserve the old event handler if there is one.&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.enable = function () {&lt;br /&gt;
	if (this.active) { return; }&lt;br /&gt;
	this.active=true;&lt;br /&gt;
	//~ Save the current handler for mousemove events. This isn't too&lt;br /&gt;
	//~ robust, of course.&lt;br /&gt;
	this.savedHandler=document.onmousemove;&lt;br /&gt;
	//~ Gotta save @tt{this} again for the closure, and use apply for&lt;br /&gt;
	//~ the member function.&lt;br /&gt;
	var savedThis=this;&lt;br /&gt;
	document.onmousemove=function (e) {savedThis.track.apply(savedThis, [e]);};&lt;br /&gt;
	if (this.loopDelay) { this.timer = setInterval(function() { //log('loop delay in mousetracker is working');&lt;br /&gt;
								    savedThis.runHooks();}, this.loopDelay); }&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Disables the tracker, removing the event handler.&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.disable = function () {&lt;br /&gt;
	if (!this.active) { return; }&lt;br /&gt;
	if (typeof this.savedHandler=='function') {&lt;br /&gt;
		document.onmousemove=this.savedHandler;&lt;br /&gt;
	} else { delete document.onmousemove; }&lt;br /&gt;
	if (this.timer) { clearInterval(this.timer); }&lt;br /&gt;
	this.active=false;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Navpopup.&lt;br /&gt;
   Gets a UID for the popup and&lt;br /&gt;
   @param init Contructor object. If &amp;lt;code&amp;gt;init.draggable&amp;lt;/code&amp;gt; is true or absent, the popup becomes draggable.&lt;br /&gt;
   @constructor&lt;br /&gt;
   @class The Navpopup class. This generates popup hints, and does some management of them.&lt;br /&gt;
*/&lt;br /&gt;
function Navpopup(init) {&lt;br /&gt;
	//alert('new Navpopup(init)');&lt;br /&gt;
	/** UID for each Navpopup instance.&lt;br /&gt;
	    Read-only.&lt;br /&gt;
	    @type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.uid=Navpopup.uid++;&lt;br /&gt;
	/**&lt;br /&gt;
	   Read-only flag for current visibility of the popup.&lt;br /&gt;
	   @type boolean&lt;br /&gt;
	   @private&lt;br /&gt;
	*/&lt;br /&gt;
	this.visible=false;&lt;br /&gt;
	/** Flag to be set when we want to cancel a previous request to&lt;br /&gt;
	    show the popup in a little while.&lt;br /&gt;
	    @private&lt;br /&gt;
	    @type boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.noshow=false;&lt;br /&gt;
	/** Categorised list of hooks.&lt;br /&gt;
	    @see #runHooks&lt;br /&gt;
	    @see #addHook&lt;br /&gt;
	    @private&lt;br /&gt;
	    @type Object&lt;br /&gt;
	*/&lt;br /&gt;
	this.hooks={&lt;br /&gt;
		'create': [],&lt;br /&gt;
		'unhide': [],&lt;br /&gt;
		'hide': []&lt;br /&gt;
	};&lt;br /&gt;
	/** list of unique IDs of hook functions, to avoid duplicates&lt;br /&gt;
	    @private&lt;br /&gt;
	*/&lt;br /&gt;
	this.hookIds={};&lt;br /&gt;
	/** List of downloads associated with the popup.&lt;br /&gt;
	    @private&lt;br /&gt;
	    @type Array&lt;br /&gt;
	*/&lt;br /&gt;
	this.downloads=[];&lt;br /&gt;
	/** Number of uncompleted downloads.&lt;br /&gt;
	    @type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.pending=null;&lt;br /&gt;
	/** Tolerance in pixels when detecting whether the mouse has left the popup.&lt;br /&gt;
	    @type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.fuzz=5;&lt;br /&gt;
	/** Flag to toggle running {@link #limitHorizontalPosition} to regulate the popup's position.&lt;br /&gt;
	    @type boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.constrained=true;&lt;br /&gt;
	/** The popup width in pixels.&lt;br /&gt;
	    @private&lt;br /&gt;
	    @type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.width=0;&lt;br /&gt;
	/** The popup width in pixels.&lt;br /&gt;
	    @private&lt;br /&gt;
	    @type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.height=0;&lt;br /&gt;
	/** The main content DIV element.&lt;br /&gt;
	    @type HTMLDivElement&lt;br /&gt;
	*/&lt;br /&gt;
	this.mainDiv=null;&lt;br /&gt;
	this.createMainDiv();&lt;br /&gt;
 &lt;br /&gt;
//	if (!init || typeof init.popups_draggable=='undefined' || init.popups_draggable) {&lt;br /&gt;
//		this.makeDraggable(true);&lt;br /&gt;
//	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   A UID for each Navpopup. This constructor property is just a counter.&lt;br /&gt;
   @type integer&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.uid=0;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Retrieves the {@link #visible} attribute, indicating whether the popup is currently visible.&lt;br /&gt;
   @type boolean&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.isVisible=function() {&lt;br /&gt;
	return this.visible;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Repositions popup using CSS style.&lt;br /&gt;
   @private&lt;br /&gt;
   @param {integer} x x-coordinate (px)&lt;br /&gt;
   @param {integer} y y-coordinate (px)&lt;br /&gt;
   @param {boolean} noLimitHor Don't call {@link #limitHorizontalPosition}&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.reposition= function (x,y, noLimitHor) {&lt;br /&gt;
	log ('reposition('+x+','+y+','+noLimitHor+')');&lt;br /&gt;
	if (typeof x != 'undefined' &amp;amp;&amp;amp; x!==null) { this.left=x; }&lt;br /&gt;
	if (typeof y != 'undefined' &amp;amp;&amp;amp; y!==null) { this.top=y; }&lt;br /&gt;
	if (typeof this.left != 'undefined' &amp;amp;&amp;amp; typeof this.top != 'undefined') {&lt;br /&gt;
		this.mainDiv.style.left=this.left + 'px';&lt;br /&gt;
		this.mainDiv.style.top=this.top + 'px';&lt;br /&gt;
	}&lt;br /&gt;
	if (!noLimitHor) { this.limitHorizontalPosition(); }&lt;br /&gt;
	//console.log('navpop'+this.uid+' - (left,top)=(' + this.left + ',' + this.top + '), css=('&lt;br /&gt;
	//+ this.mainDiv.style.left + ',' + this.mainDiv.style.top + ')');&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Prevents popups from being in silly locations. Hopefully.&lt;br /&gt;
   Should not be run if {@link #constrained} is true.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.limitHorizontalPosition=function() {&lt;br /&gt;
	if (!this.constrained || this.tooWide) { return; }&lt;br /&gt;
	this.updateDimensions();&lt;br /&gt;
	var x=this.left;&lt;br /&gt;
	var w=this.width;&lt;br /&gt;
	var cWidth=document.body.clientWidth;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
//	log('limitHorizontalPosition: x='+x+&lt;br /&gt;
//		    ', this.left=' + this.left +&lt;br /&gt;
//		    ', this.width=' + this.width +&lt;br /&gt;
//		    ', cWidth=' + cWidth);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	if ( (x+w) &amp;gt;= cWidth ||&lt;br /&gt;
	     ( x &amp;gt; 0 &amp;amp;&amp;amp; this.maxWidth &amp;amp;&amp;amp; this.width &amp;lt; this.maxWidth &amp;amp;&amp;amp; this.height &amp;gt; this.width&lt;br /&gt;
	       &amp;amp;&amp;amp; x &amp;gt; cWidth - this.maxWidth ) ) {&lt;br /&gt;
		// This is a very nasty hack. There has to be a better way!&lt;br /&gt;
		// We find the &amp;quot;natural&amp;quot; width of the div by positioning it at the far left&lt;br /&gt;
		// then reset it so that it should be flush right (well, nearly)&lt;br /&gt;
		this.mainDiv.style.left='-10000px';&lt;br /&gt;
		this.mainDiv.style.width = this.maxWidth + 'px';&lt;br /&gt;
		var naturalWidth=parseInt(this.mainDiv.offsetWidth, 10);&lt;br /&gt;
		var newLeft=cWidth - naturalWidth - 1;&lt;br /&gt;
		if (newLeft &amp;lt; 0) { newLeft = 0; this.tooWide=true; } // still unstable for really wide popups?&lt;br /&gt;
		log ('limitHorizontalPosition: moving to ('+newLeft + ','+ this.top+');' + ' naturalWidth=' + naturalWidth + ', clientWidth=' + cWidth);&lt;br /&gt;
		this.reposition(newLeft, null, true);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Counter indicating the z-order of the &amp;quot;highest&amp;quot; popup.&lt;br /&gt;
   We start the z-index at 1000 so that popups are above everything&lt;br /&gt;
   else on the screen.&lt;br /&gt;
   @private&lt;br /&gt;
   @type integer&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.highest=1000;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Brings popup to the top of the z-order.&lt;br /&gt;
   We increment the {@link #highest} property of the contructor here.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.raise = function () {&lt;br /&gt;
	this.mainDiv.style.zIndex=Navpopup.highest + 1;&lt;br /&gt;
	++Navpopup.highest;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Shows the popup provided {@link #noshow} is not true.&lt;br /&gt;
   Updates the position, brings the popup to the top of the z-order and unhides it.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.show = function () {&lt;br /&gt;
	//document.title+='s';&lt;br /&gt;
	if (this.noshow) { return; }&lt;br /&gt;
	//document.title+='t';&lt;br /&gt;
	this.reposition();&lt;br /&gt;
	this.raise();&lt;br /&gt;
	this.unhide();&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Runs the {@link #show} method in a little while, unless we're&lt;br /&gt;
   already visible.&lt;br /&gt;
   @param {integer} time Delay in milliseconds&lt;br /&gt;
   @see #showSoonIfStable&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.showSoon = function (time) {&lt;br /&gt;
	if (this.visible) { return; }&lt;br /&gt;
	this.noshow=false;&lt;br /&gt;
	//~ We have to save the value of @tt{this} so that the closure below&lt;br /&gt;
	//~ works.&lt;br /&gt;
	var savedThis=this;&lt;br /&gt;
	//this.start_x = Navpopup.tracker.x;&lt;br /&gt;
	//this.start_y = Navpopup.tracker.y;&lt;br /&gt;
	setTimeout(function () {&lt;br /&gt;
		if (Navpopup.tracker.active) {&lt;br /&gt;
			savedThis.reposition.apply(savedThis, [Navpopup.tracker.x + 2, Navpopup.tracker.y + 2]);&lt;br /&gt;
		}&lt;br /&gt;
		//~ Have to use apply to invoke his member function here&lt;br /&gt;
		savedThis.show.apply(savedThis, []);&lt;br /&gt;
	}, time);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Checks to see if the mouse pointer has&lt;br /&gt;
   stabilised (checking every &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;/2 milliseconds) and runs the&lt;br /&gt;
   {@link #show} method if it has. This method makes {@link #showSoon} redundant.&lt;br /&gt;
   @param {integer} time The minimum time (ms) before the popup may be shown.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.showSoonIfStable = function (time) {&lt;br /&gt;
	log ('showSoonIfStable, time='+time);&lt;br /&gt;
	if (this.visible) { return; }&lt;br /&gt;
	this.noshow = false;&lt;br /&gt;
 &lt;br /&gt;
	//~ initialize these variables so that we never run @tt{show} after&lt;br /&gt;
	//~ just half the time&lt;br /&gt;
	this.stable_x = -10000; this.stable_y = -10000;&lt;br /&gt;
 &lt;br /&gt;
	var stableShow = function() {&lt;br /&gt;
		log('stableShow called');&lt;br /&gt;
		var new_x = Navpopup.tracker.x, new_y = Navpopup.tracker.y;&lt;br /&gt;
		var dx = savedThis.stable_x - new_x, dy = savedThis.stable_y - new_y;&lt;br /&gt;
		var fuzz2 = 0; // savedThis.fuzz * savedThis.fuzz;&lt;br /&gt;
		//document.title += '[' + [savedThis.stable_x,new_x, savedThis.stable_y,new_y, dx, dy, fuzz2].join(',') + '] ';&lt;br /&gt;
		if ( dx * dx &amp;lt;= fuzz2 &amp;amp;&amp;amp; dy * dy &amp;lt;= fuzz2 ) {&lt;br /&gt;
			log ('mouse is stable');&lt;br /&gt;
			clearInterval(savedThis.showSoonStableTimer);&lt;br /&gt;
			savedThis.reposition.apply(savedThis, [new_x + 2, new_y + 2]);&lt;br /&gt;
			savedThis.show.apply(savedThis, []);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		savedThis.stable_x = new_x; savedThis.stable_y = new_y;&lt;br /&gt;
	};&lt;br /&gt;
	var savedThis = this;&lt;br /&gt;
	this.showSoonStableTimer = setInterval(stableShow, time/2);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Makes the popup unhidable until we call {@link #unstick}.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.stick=function() {&lt;br /&gt;
	this.noshow=false;&lt;br /&gt;
	this.sticky=true;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Allows the popup to be hidden.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.unstick=function() {&lt;br /&gt;
	this.sticky=false;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Sets the {@link #noshow} flag and hides the popup. This should be called&lt;br /&gt;
   when the mouse leaves the link before&lt;br /&gt;
   (or after) it's actually been displayed.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.banish = function () {&lt;br /&gt;
	log ('banish called');&lt;br /&gt;
	// hide and prevent showing with showSoon in the future&lt;br /&gt;
	this.noshow=true;&lt;br /&gt;
	if (this.showSoonStableTimer) {&lt;br /&gt;
		log('clearing showSoonStableTimer');&lt;br /&gt;
		clearInterval(this.showSoonStableTimer);&lt;br /&gt;
	}&lt;br /&gt;
	this.hide();&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Runs hooks added with {@link #addHook}.&lt;br /&gt;
   @private&lt;br /&gt;
   @param {String} key Key name of the {@link #hooks} array - one of 'create', 'unhide', 'hide'&lt;br /&gt;
   @param {String} when Controls exactly when the hook is run: either 'before' or 'after'&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.runHooks = function (key, when) {&lt;br /&gt;
	if (!this.hooks[key]) { return; }&lt;br /&gt;
	var keyHooks=this.hooks[key];&lt;br /&gt;
	var len=keyHooks.length;&lt;br /&gt;
	for (var i=0; i&amp;lt; len; ++i) {&lt;br /&gt;
		if (keyHooks[i] &amp;amp;&amp;amp; keyHooks[i].when == when) {&lt;br /&gt;
			if (keyHooks[i].hook.apply(this, [])) {&lt;br /&gt;
				// remove the hook&lt;br /&gt;
				if (keyHooks[i].hookId) {&lt;br /&gt;
					delete this.hookIds[keyHooks[i].hookId];&lt;br /&gt;
				}&lt;br /&gt;
				keyHooks[i]=null;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Adds a hook to the popup. Hook functions are run with &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; set to refer to the Navpopup instance, and no arguments.&lt;br /&gt;
   @param {Function} hook The hook function. Functions that return true are deleted.&lt;br /&gt;
   @param {String} key Key name of the {@link #hooks} array - one of 'create', 'unhide', 'hide'&lt;br /&gt;
   @param {String} when Controls exactly when the hook is run: either 'before' or 'after'&lt;br /&gt;
   @param {String} uid A truthy string identifying the hook function; if it matches another hook in this position, it won't be added again.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.addHook = function ( hook, key, when, uid ) {&lt;br /&gt;
	when = when || 'after';&lt;br /&gt;
	if (!this.hooks[key]) { return; }&lt;br /&gt;
	// if uid is specified, don't add duplicates&lt;br /&gt;
	var hookId=null;&lt;br /&gt;
	if (uid) {&lt;br /&gt;
		hookId=[key,when,uid].join('|');&lt;br /&gt;
		if (this.hookIds[hookId]) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		this.hookIds[hookId]=true;&lt;br /&gt;
	}&lt;br /&gt;
	this.hooks[key].push( {hook: hook, when: when, hookId: hookId} );&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Creates the main DIV element, which contains all the actual popup content.&lt;br /&gt;
   Runs hooks with key 'create'.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.createMainDiv = function () {&lt;br /&gt;
	if (this.mainDiv) { return; }&lt;br /&gt;
	this.runHooks('create', 'before');&lt;br /&gt;
	var mainDiv=document.createElement('div');&lt;br /&gt;
 &lt;br /&gt;
	var savedThis=this;&lt;br /&gt;
	mainDiv.onclick=function(e) {savedThis.onclickHandler(e);};&lt;br /&gt;
	mainDiv.className=(this.className) ? this.className : 'navpopup_maindiv';&lt;br /&gt;
	mainDiv.id=mainDiv.className + this.uid;&lt;br /&gt;
 &lt;br /&gt;
	mainDiv.style.position='absolute';&lt;br /&gt;
	mainDiv.style.display='none';&lt;br /&gt;
	mainDiv.className='navpopup';&lt;br /&gt;
 &lt;br /&gt;
	// easy access to javascript object through DOM functions&lt;br /&gt;
	mainDiv.navpopup=this;&lt;br /&gt;
 &lt;br /&gt;
	this.mainDiv=mainDiv;&lt;br /&gt;
	document.body.appendChild(mainDiv);&lt;br /&gt;
	this.runHooks('create', 'after');&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Calls the {@link #raise} method.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.onclickHandler=function(e) {&lt;br /&gt;
	this.raise();&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Makes the popup draggable, using a {@link Drag} object.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.makeDraggable=function(handleName) {&lt;br /&gt;
	if (!this.mainDiv) { this.createMainDiv(); }&lt;br /&gt;
	var drag=new Drag();&lt;br /&gt;
	if (!handleName) {&lt;br /&gt;
	    drag.startCondition=function(e) {&lt;br /&gt;
		try { if (!e.shiftKey) { return false; } } catch (err) { return false; }&lt;br /&gt;
		return true;&lt;br /&gt;
	    };&lt;br /&gt;
	}&lt;br /&gt;
	var dragHandle = document.getElementById(handleName) || this.mainDiv;&lt;br /&gt;
	var np=this;&lt;br /&gt;
	drag.endHook=function(x,y) {&lt;br /&gt;
		Navpopup.tracker.dirty=true;&lt;br /&gt;
		np.reposition(x,y);&lt;br /&gt;
	};&lt;br /&gt;
	drag.init(dragHandle,this.mainDiv);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/** Hides the popup using CSS. Runs hooks with key 'hide'.&lt;br /&gt;
    Sets {@link #visible} appropriately.     {@link #banish} should be called externally instead of this method.&lt;br /&gt;
 &lt;br /&gt;
    @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.hide = function () {&lt;br /&gt;
	this.runHooks('hide', 'before');&lt;br /&gt;
	this.abortDownloads();&lt;br /&gt;
	if (this.sticky) { return; }&lt;br /&gt;
	if (typeof this.visible != 'undefined' &amp;amp;&amp;amp; this.visible) {&lt;br /&gt;
		this.mainDiv.style.display='none';&lt;br /&gt;
		this.visible=false;&lt;br /&gt;
	}&lt;br /&gt;
	this.runHooks('hide', 'after');&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/** Shows the popup using CSS. Runs hooks with key 'unhide'.&lt;br /&gt;
    Sets {@link #visible} appropriately.   {@link #show} should be called externally instead of this method.&lt;br /&gt;
    @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.unhide = function () {&lt;br /&gt;
	this.runHooks('unhide', 'before');&lt;br /&gt;
	if (typeof this.visible != 'undefined' &amp;amp;&amp;amp; !this.visible) {&lt;br /&gt;
		this.mainDiv.style.display='inline';&lt;br /&gt;
		this.visible=true;&lt;br /&gt;
	}&lt;br /&gt;
	this.runHooks('unhide', 'after');&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Sets the &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; attribute of the main div containing the popup content.&lt;br /&gt;
   @param {String} html The HTML to set.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.setInnerHTML = function (html) {&lt;br /&gt;
	this.mainDiv.innerHTML = html;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Updates the {@link #width} and {@link #height} attributes with the CSS properties.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.updateDimensions = function () {&lt;br /&gt;
	this.width=parseInt(this.mainDiv.offsetWidth, 10);&lt;br /&gt;
	this.height=parseInt(this.mainDiv.offsetHeight, 10);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Checks if the point (x,y) is within {@link #fuzz} of the&lt;br /&gt;
   {@link #mainDiv}.&lt;br /&gt;
   @param {integer} x x-coordinate (px)&lt;br /&gt;
   @param {integer} y y-coordinate (px)&lt;br /&gt;
   @type boolean&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.isWithin = function(x,y) {&lt;br /&gt;
	//~ If we're not even visible, no point should be considered as&lt;br /&gt;
	//~ being within the popup.&lt;br /&gt;
	if (!this.visible) { return false; }&lt;br /&gt;
	this.updateDimensions();&lt;br /&gt;
	var fuzz=this.fuzz || 0;&lt;br /&gt;
	//~ Use a simple box metric here.&lt;br /&gt;
	return (x+fuzz &amp;gt;= this.left &amp;amp;&amp;amp; x-fuzz &amp;lt;= this.left + this.width &amp;amp;&amp;amp;&lt;br /&gt;
		y+fuzz &amp;gt;= this.top  &amp;amp;&amp;amp; y-fuzz &amp;lt;= this.top  + this.height);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   Adds a download to {@link #downloads}.&lt;br /&gt;
   @param {Downloader} download&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.addDownload=function(download) {&lt;br /&gt;
	if (!download) { return; }&lt;br /&gt;
	this.downloads.push(download);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Aborts the downloads listed in {@link #downloads}.&lt;br /&gt;
   @see Downloader#abort&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.abortDownloads=function() {&lt;br /&gt;
	for(var i=0; i&amp;lt;this.downloads.length; ++i) {&lt;br /&gt;
		var d=this.downloads[i];&lt;br /&gt;
		if (d &amp;amp;&amp;amp; d.abort) { d.abort(); }&lt;br /&gt;
	}&lt;br /&gt;
	this.downloads=[];&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
   A {@link Mousetracker} instance which is a property of the constructor (pseudo-global).&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.tracker=new Mousetracker();&lt;br /&gt;
// ENDFILE: navpopup.js&lt;br /&gt;
// STARTFILE: diff.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Javascript Diff Algorithm&lt;br /&gt;
 *  By John Resig (http://ejohn.org/) and [[:en:User:Lupin]]&lt;br /&gt;
 *&lt;br /&gt;
 * More Info:&lt;br /&gt;
 *  http://ejohn.org/projects/javascript-diff-algorithm/&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
function delFmt(x) {&lt;br /&gt;
	if (!x.length) { return ''; }&lt;br /&gt;
	return &amp;quot;&amp;lt;del class='popupDiff'&amp;gt;&amp;quot; + x.join('') +&amp;quot;&amp;lt;/del&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function insFmt(x) {&lt;br /&gt;
	if (!x.length) { return ''; }&lt;br /&gt;
	return &amp;quot;&amp;lt;ins class='popupDiff'&amp;gt;&amp;quot; + x.join('') +&amp;quot;&amp;lt;/ins&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function countCrossings(a, b, i, eject) {&lt;br /&gt;
	// count the crossings on the edge starting at b[i]&lt;br /&gt;
	if (!b[i].row &amp;amp;&amp;amp; b[i].row !== 0) { return -1; }&lt;br /&gt;
	var count=0;&lt;br /&gt;
	for (var j=0; j&amp;lt;a.length; ++j) {&lt;br /&gt;
		if (!a[j].row &amp;amp;&amp;amp; a[j].row !== 0) { continue; }&lt;br /&gt;
		if ( (j-b[i].row)*(i-a[j].row) &amp;gt; 0) {&lt;br /&gt;
			if(eject) { return true; }&lt;br /&gt;
			count++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function shortenDiffString(str, context) {&lt;br /&gt;
	var re=RegExp('(&amp;lt;del[\\s\\S]*?&amp;lt;/del&amp;gt;|&amp;lt;ins[\\s\\S]*?&amp;lt;/ins&amp;gt;)');&lt;br /&gt;
	var splitted=str.parenSplit(re);&lt;br /&gt;
	var ret=[''];&lt;br /&gt;
	for (var i=0; i&amp;lt;splitted.length; i+=2) {&lt;br /&gt;
		if (splitted[i].length &amp;lt; 2*context) {&lt;br /&gt;
			ret[ret.length-1] += splitted[i];&lt;br /&gt;
			if (i+1&amp;lt;splitted.length) { ret[ret.length-1] += splitted[i+1]; }&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			if (i &amp;gt; 0) { ret[ret.length-1] += splitted[i].substring(0,context); }&lt;br /&gt;
			if (i+1 &amp;lt; splitted.length) {&lt;br /&gt;
			    ret.push(splitted[i].substring(splitted[i].length-context) +&lt;br /&gt;
				     splitted[i+1]);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	while (ret.length &amp;gt; 0 &amp;amp;&amp;amp; !ret[0]) { ret = ret.slice(1); }&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function diffString( o, n, simpleSplit ) {&lt;br /&gt;
	var splitRe=RegExp('([[]{2}|[\]]{2}|[{]{2,3}|[}]{2,3}|[|]|=|[*:]+|\\s|\\b)');&lt;br /&gt;
 &lt;br /&gt;
	o=o.entify(); n=n.entify();&lt;br /&gt;
	var out, i;&lt;br /&gt;
	if (simpleSplit) { out = diff( o.split(/\b/), n.split(/\b/) ); }&lt;br /&gt;
	else { out = diff( o.parenSplit(splitRe), n.parenSplit(splitRe) ); }&lt;br /&gt;
	var str = &amp;quot;&amp;quot;;&lt;br /&gt;
	var acc=[]; // accumulator for prettier output&lt;br /&gt;
 &lt;br /&gt;
	// crossing pairings -- eg 'A B' vs 'B A' -- cause problems, so let's iron them out&lt;br /&gt;
	// this doesn't always do things optimally but it should be fast enough&lt;br /&gt;
	var maxOutputPair=0;&lt;br /&gt;
	for (i=0; i&amp;lt;out.n.length; ++i) {&lt;br /&gt;
	    if ( out.n[i].paired ) {&lt;br /&gt;
		if( maxOutputPair &amp;gt; out.n[i].row ) {&lt;br /&gt;
		    // tangle - delete pairing&lt;br /&gt;
		    out.o[ out.n[i].row ]=out.o[ out.n[i].row ].text;&lt;br /&gt;
		    out.n[i]=out.n[i].text;&lt;br /&gt;
		}&lt;br /&gt;
		if (maxOutputPair &amp;lt; out.n[i].row) { maxOutputPair = out.n[i].row; }&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// output the stuff preceding the first paired old line&lt;br /&gt;
	for (i=0; i&amp;lt;out.o.length &amp;amp;&amp;amp; !out.o[i].paired; ++i) { acc.push( out.o[i] ); }&lt;br /&gt;
	str += delFmt(acc); acc=[];&lt;br /&gt;
 &lt;br /&gt;
	// main loop&lt;br /&gt;
	for ( i = 0; i &amp;lt; out.n.length; ++i ) {&lt;br /&gt;
		// output unpaired new &amp;quot;lines&amp;quot;&lt;br /&gt;
		while ( i &amp;lt; out.n.length &amp;amp;&amp;amp; !out.n[i].paired ) { acc.push( out.n[i++] ); }&lt;br /&gt;
		str += insFmt(acc); acc=[];&lt;br /&gt;
		if ( i &amp;lt; out.n.length ) { // this new &amp;quot;line&amp;quot; is paired with the (out.n[i].row)th old &amp;quot;line&amp;quot;&lt;br /&gt;
			str += out.n[i].text;&lt;br /&gt;
			// output unpaired old rows starting after this new line's partner&lt;br /&gt;
			var m = out.n[i].row + 1;&lt;br /&gt;
			while ( m &amp;lt; out.o.length &amp;amp;&amp;amp; !out.o[m].paired ) { acc.push ( out.o[m++] ); }&lt;br /&gt;
			str += delFmt(acc); acc=[];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return str;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// see http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Object&lt;br /&gt;
// FIXME: use obj.hasOwnProperty instead of this kludge!&lt;br /&gt;
window.jsReservedProperties=RegExp('^(constructor|prototype|__((define|lookup)[GS]etter)__' +&lt;br /&gt;
				   '|eval|hasOwnProperty|propertyIsEnumerable' +&lt;br /&gt;
				   '|to(Source|String|LocaleString)|(un)?watch|valueOf)$');&lt;br /&gt;
function diffBugAlert(word) {&lt;br /&gt;
	if (!diffBugAlert.list[word]) {&lt;br /&gt;
		diffBugAlert.list[word]=1;&lt;br /&gt;
		alert('Bad word: '+word+'\n\nPlease report this bug.');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
diffBugAlert.list={};&lt;br /&gt;
 &lt;br /&gt;
function makeDiffHashtable(src) {&lt;br /&gt;
	var ret={};&lt;br /&gt;
	for ( var i = 0; i &amp;lt; src.length; i++ ) {&lt;br /&gt;
		if ( jsReservedProperties.test(src[i]) ) { src[i] += '&amp;lt;!-- --&amp;gt;'; }&lt;br /&gt;
		if ( !ret[ src[i] ] ) {	ret[ src[i] ] = []; }&lt;br /&gt;
		try { ret[ src[i] ].push( i ); } catch (err) { diffBugAlert(src[i]); }&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function diff( o, n ) {&lt;br /&gt;
 &lt;br /&gt;
	// pass 1: make hashtable ns with new rows as keys&lt;br /&gt;
	var ns = makeDiffHashtable(n);&lt;br /&gt;
 &lt;br /&gt;
	// pass 2: make hashtable os with old rows as keys&lt;br /&gt;
	var os = makeDiffHashtable(o);&lt;br /&gt;
 &lt;br /&gt;
	// pass 3: pair unique new rows and matching unique old rows&lt;br /&gt;
	var i;&lt;br /&gt;
	for ( i in ns ) {&lt;br /&gt;
		if ( ns[i].length == 1 &amp;amp;&amp;amp; os[i] &amp;amp;&amp;amp; os[i].length == 1 ) {&lt;br /&gt;
			n[ ns[i][0] ] = { text: n[ ns[i][0] ], row: os[i][0], paired: true };&lt;br /&gt;
			o[ os[i][0] ] = { text: o[ os[i][0] ], row: ns[i][0], paired: true };&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// pass 4: pair matching rows immediately following paired rows (not necessarily unique)&lt;br /&gt;
	for ( i = 0; i &amp;lt; n.length - 1; i++ ) {&lt;br /&gt;
		if ( n[i].paired &amp;amp;&amp;amp; ! n[i+1].paired &amp;amp;&amp;amp; n[i].row + 1 &amp;lt; o.length &amp;amp;&amp;amp; ! o[ n[i].row + 1 ].paired &amp;amp;&amp;amp;&lt;br /&gt;
		     n[i+1] == o[ n[i].row + 1 ] ) {&lt;br /&gt;
			n[i+1] = { text: n[i+1], row: n[i].row + 1, paired: true };&lt;br /&gt;
			o[n[i].row+1] = { text: o[n[i].row+1], row: i + 1, paired: true };&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// pass 5: pair matching rows immediately preceding paired rows (not necessarily unique)&lt;br /&gt;
	for ( i = n.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
		if ( n[i].paired &amp;amp;&amp;amp; ! n[i-1].paired &amp;amp;&amp;amp; n[i].row &amp;gt; 0 &amp;amp;&amp;amp; ! o[ n[i].row - 1 ].paired &amp;amp;&amp;amp;&lt;br /&gt;
		     n[i-1] == o[ n[i].row - 1 ] ) {&lt;br /&gt;
			n[i-1] = { text: n[i-1], row: n[i].row - 1, paired: true };&lt;br /&gt;
			o[n[i].row-1] = { text: o[n[i].row-1], row: i - 1, paired: true };&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	return { o: o, n: n };&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: diff.js&lt;br /&gt;
// STARTFILE: init.js&lt;br /&gt;
function setSiteInfo() {&lt;br /&gt;
	if (window.popupLocalDebug) {&lt;br /&gt;
		pg.wiki.hostname = 'en.wikipedia.org';&lt;br /&gt;
	} else {&lt;br /&gt;
		pg.wiki.hostname = location.hostname; // use in preference to location.hostname for flexibility (?)&lt;br /&gt;
	}&lt;br /&gt;
	pg.wiki.wikimedia=RegExp('(wiki([pm]edia|source|books|news|quote|versity)|wiktionary|mediawiki)[.]org').test(pg.wiki.hostname);&lt;br /&gt;
	pg.wiki.wikia=RegExp('[.]wikia[.]com$', 'i').test(pg.wiki.hostname);&lt;br /&gt;
	pg.wiki.isLocal=RegExp('^localhost').test(pg.wiki.hostname);&lt;br /&gt;
	pg.wiki.commons=( pg.wiki.wikimedia &amp;amp;&amp;amp; pg.wiki.hostname != 'commons.wikimedia.org') ? 'commons.wikimedia.org' : null;&lt;br /&gt;
	pg.wiki.lang = wgContentLanguage;&lt;br /&gt;
	var port = location.port ? ':' + location.port : '';&lt;br /&gt;
	pg.wiki.sitebase = pg.wiki.hostname + port;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setTitleBase() {&lt;br /&gt;
	var protocol = ( window.popupLocalDebug ? 'http:' : location.protocol );&lt;br /&gt;
	pg.wiki.articlePath = wgArticlePath.replace(/\/\$1/, &amp;quot;&amp;quot;);   // as in http://some.thing.com/wiki/Article&lt;br /&gt;
	pg.wiki.botInterfacePath = wgScript;&lt;br /&gt;
	pg.wiki.APIPath = wgScriptPath +&amp;quot;/api.php&amp;quot;;&lt;br /&gt;
	// default mediawiki setting is paths like http://some.thing.com/articlePath/index.php?title=foo&lt;br /&gt;
 &lt;br /&gt;
	var titletail = pg.wiki.botInterfacePath + '?title=';&lt;br /&gt;
	//var titletail2 = joinPath([pg.wiki.botInterfacePath, 'wiki.phtml?title=']);&lt;br /&gt;
 &lt;br /&gt;
	// other sites may need to add code here to set titletail depending on how their urls work&lt;br /&gt;
 &lt;br /&gt;
	pg.wiki.titlebase   = protocol + '//' + pg.wiki.sitebase + titletail;&lt;br /&gt;
	//pg.wiki.titlebase2  = protocol + '//' + joinPath([pg.wiki.sitebase, titletail2]);&lt;br /&gt;
	pg.wiki.wikibase    = protocol + '//' + pg.wiki.sitebase + pg.wiki.botInterfacePath;&lt;br /&gt;
	pg.wiki.apiwikibase = protocol + '//' + pg.wiki.sitebase + pg.wiki.APIPath;&lt;br /&gt;
	pg.wiki.articlebase = protocol + '//' + pg.wiki.sitebase + pg.wiki.articlePath;&lt;br /&gt;
	pg.wiki.commonsbase = protocol + '//' + pg.wiki.commons  + pg.wiki.botInterfacePath;&lt;br /&gt;
	pg.wiki.apicommonsbase = protocol + '//' + pg.wiki.commons  + pg.wiki.APIPath;&lt;br /&gt;
	pg.re.basenames = RegExp( '^(' +&lt;br /&gt;
				  map( literalizeRegex, [ pg.wiki.titlebase, //pg.wiki.titlebase2,&lt;br /&gt;
							  pg.wiki.articlebase ]).join('|') + ')' );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Global regexps&lt;br /&gt;
 &lt;br /&gt;
function setMainRegex() {&lt;br /&gt;
	var reStart='[^:]*://';&lt;br /&gt;
	var preTitles = joinPath([literalizeRegex(wgScriptPath), '(?:index[.]php|wiki[.]phtml)[?]title=']);&lt;br /&gt;
	// slightly ugly hack when pg.wiki.articlePath is empty&lt;br /&gt;
	preTitles += '|' + literalizeRegex( ( pg.wiki.articlePath ? pg.wiki.articlePath + '/': ''));&lt;br /&gt;
 &lt;br /&gt;
	var reEnd='(' + preTitles + ')([^&amp;amp;?#]*)[^#]*(?:#(.+))?';&lt;br /&gt;
	pg.re.main = RegExp(reStart + literalizeRegex(pg.wiki.sitebase) + reEnd);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setRegexps() {&lt;br /&gt;
	setMainRegex();&lt;br /&gt;
	var sp=nsRe('Special');&lt;br /&gt;
	pg.re.urlNoPopup=RegExp('((title=|/)' + sp +  '(?:%3A|:)|section=[0-9])') ;&lt;br /&gt;
	pg.re.contribs  =RegExp('(title=|/)'  + sp + '(?:%3A|:)Contributions' + '(&amp;amp;target=|/|/' + pg.ns.user+':)(.*)') ;&lt;br /&gt;
	pg.re.email     =RegExp('(title=|/)'  + sp + '(?:%3A|:)Emailuser'     + '(&amp;amp;target=|/|/(?:' + pg.ns.user+':)?)(.*)') ;&lt;br /&gt;
	pg.re.backlinks =RegExp('(title=|/)'  + sp + '(?:%3A|:)Whatlinkshere' + '(&amp;amp;target=|/)([^&amp;amp;]*)');&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	var im=nsReImage();&lt;br /&gt;
	// note: tries to get images in infobox templates too, e.g. movie pages, album pages etc&lt;br /&gt;
	//                      (^|\[\[)image: *([^|\]]*[^|\] ]) *&lt;br /&gt;
	//                      (^|\[\[)image: *([^|\]]*[^|\] ])([^0-9\]]*([0-9]+) *px)?&lt;br /&gt;
	//                                                        $4 = 120 as in 120px&lt;br /&gt;
	pg.re.image = RegExp('(^|\\[\\[)' + im + ': *([^|\\]]*[^|\\] ])' +&lt;br /&gt;
			     '([^0-9\\]]*([0-9]+) *px)?|(?:\\n *[|]?|[|]) *' +&lt;br /&gt;
			     '(' + getValueOf('popupImageVarsRegexp') + ')' +&lt;br /&gt;
			     ' *= *(?:\\[\\[ *)?(?:' + im + ':)?' +&lt;br /&gt;
			     '([^|]*?)(?:\\]\\])? *[|]? *\\n', 'img') ;&lt;br /&gt;
	pg.re.imageBracketCount = 6;&lt;br /&gt;
 &lt;br /&gt;
	pg.re.category = RegExp('\\[\\[' +nsRe('Category') +&lt;br /&gt;
				': *([^|\\]]*[^|\\] ]) *', 'i');&lt;br /&gt;
	pg.re.categoryBracketCount = 1;&lt;br /&gt;
 &lt;br /&gt;
	pg.re.ipUser=RegExp('('+nsRe('User')+':)?' +&lt;br /&gt;
			    '((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}' +&lt;br /&gt;
			    '(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])');&lt;br /&gt;
 &lt;br /&gt;
	pg.re.stub= RegExp(getValueOf('popupStubRegexp'), 'im');&lt;br /&gt;
	pg.re.disambig=RegExp(getValueOf('popupDabRegexp'), 'im');&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	// FIXME replace with general parameter parsing function, this is daft&lt;br /&gt;
	pg.re.oldid=RegExp('[?&amp;amp;]oldid=([^&amp;amp;]*)');&lt;br /&gt;
	pg.re.diff=RegExp('[?&amp;amp;]diff=([^&amp;amp;]*)');&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// miscellany&lt;br /&gt;
 &lt;br /&gt;
function setupCache() {&lt;br /&gt;
	// page caching&lt;br /&gt;
	pg.cache.pages = [];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setMisc() {&lt;br /&gt;
	pg.current.link=null;&lt;br /&gt;
	pg.current.links=[];&lt;br /&gt;
	pg.current.linksHash={};&lt;br /&gt;
 &lt;br /&gt;
	setupCache();&lt;br /&gt;
 &lt;br /&gt;
	pg.timer.checkPopupPosition=null;&lt;br /&gt;
	pg.counter.loop=0;&lt;br /&gt;
 &lt;br /&gt;
	// ids change with each popup: popupImage0, popupImage1 etc&lt;br /&gt;
	pg.idNumber=0;&lt;br /&gt;
 &lt;br /&gt;
	// for myDecodeURI&lt;br /&gt;
	pg.misc.decodeExtras = [&lt;br /&gt;
		{from: '%2C', to: ',' },&lt;br /&gt;
		{from: '_',   to: ' ' },&lt;br /&gt;
		{from: '%24', to: '$'},&lt;br /&gt;
		{from: '%26',   to: '&amp;amp;' } // no ,&lt;br /&gt;
		];&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function leadingInteger(s){&lt;br /&gt;
	var n=s.match(/^(\d*)/)[1];&lt;br /&gt;
	if (n) { return +n; }&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setBrowserHacks() {&lt;br /&gt;
	var useOriginal=false;&lt;br /&gt;
	// browser-specific hacks&lt;br /&gt;
	if (typeof window.opera != 'undefined') {&lt;br /&gt;
		//if (leadingInteger(opera.version()) &amp;lt; 9)&lt;br /&gt;
		{ useOriginal=true; } // v9 beta still seems to have buggy css&lt;br /&gt;
		setDefault('popupNavLinkSeparator', ' &amp;amp;#183; ');&lt;br /&gt;
	} else if (navigator.appName=='Konqueror') {&lt;br /&gt;
		setDefault('popupNavLinkSeparator', ' &amp;amp;bull; ');&lt;br /&gt;
		pg.flag.isKonq=true;&lt;br /&gt;
	} else if ( navigator.vendor &amp;amp;&amp;amp; navigator.vendor.toLowerCase().indexOf('apple computer')===0) {&lt;br /&gt;
		pg.flag.isSafari=true;&lt;br /&gt;
		var webkit=+navigator.userAgent.replace(RegExp('^.*AppleWebKit[/](\\d+).*', 'i'), '$1');&lt;br /&gt;
		if (webkit &amp;lt; 420) { useOriginal=true; }&lt;br /&gt;
	} else if (navigator.appName.indexOf(&amp;quot;Microsoft&amp;quot;)!=-1) {&lt;br /&gt;
		setDefault('popupNavLinkSeparator', ' &amp;amp;#183; ');&lt;br /&gt;
		useOriginal=true;&lt;br /&gt;
		var ver=+navigator.userAgent.replace(RegExp('^.*MSIE (\\d+).*'), '$1');&lt;br /&gt;
		pg.flag.isIE=true;&lt;br /&gt;
		pg.flag.IEVersion=ver;&lt;br /&gt;
	}&lt;br /&gt;
	if ((pg.flag.isIE &amp;amp;&amp;amp; pg.flag.IEVersion &amp;lt; 7) || pg.flag.isKonq || (pg.flag.isSafari &amp;amp;&amp;amp; webkit &amp;lt; 420)) {&lt;br /&gt;
		pg.flag.linksLikeIE6=true;&lt;br /&gt;
	}&lt;br /&gt;
	if (useOriginal &amp;amp;&amp;amp; pg.structures.original) {&lt;br /&gt;
		setDefault('popupStructure','original');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setupPopups() {&lt;br /&gt;
	// NB translatable strings should be set up first (strings.js)&lt;br /&gt;
	// basics&lt;br /&gt;
	setupDebugging();&lt;br /&gt;
	setSiteInfo();&lt;br /&gt;
	setTitleBase();&lt;br /&gt;
	setOptions(); // see options.js&lt;br /&gt;
 &lt;br /&gt;
	// namespaces etc&lt;br /&gt;
	setNamespaces();&lt;br /&gt;
	setInterwiki();&lt;br /&gt;
 &lt;br /&gt;
	// regexps&lt;br /&gt;
	setRegexps();&lt;br /&gt;
	setRedirs();&lt;br /&gt;
 &lt;br /&gt;
	// other stuff&lt;br /&gt;
	setBrowserHacks();&lt;br /&gt;
	setMisc();&lt;br /&gt;
	setupLivePreview();&lt;br /&gt;
 &lt;br /&gt;
	// main deal here&lt;br /&gt;
	setupTooltips();&lt;br /&gt;
	Navpopup.tracker.enable();&lt;br /&gt;
 &lt;br /&gt;
	setupPopups.completed = true;&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: init.js&lt;br /&gt;
// STARTFILE: navlinks.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// navlinks... let the fun begin&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
function defaultNavlinkSpec() {&lt;br /&gt;
	var str='';&lt;br /&gt;
	str += '&amp;lt;b&amp;gt;&amp;lt;&amp;lt;mainlink|shortcut= &amp;gt;&amp;gt;&amp;lt;/b&amp;gt;';&lt;br /&gt;
	if (getValueOf('popupLastEditLink')) {&lt;br /&gt;
		str += '*&amp;lt;&amp;lt;lastEdit|shortcut=/&amp;gt;&amp;gt;|&amp;lt;&amp;lt;lastContrib&amp;gt;&amp;gt;|&amp;lt;&amp;lt;sinceMe&amp;gt;&amp;gt;if(oldid){|&amp;lt;&amp;lt;oldEdit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;diffCur&amp;gt;&amp;gt;}';&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// user links&lt;br /&gt;
	// contribs - log - count - email - block&lt;br /&gt;
	// count only if applicable; block only if popupAdminLinks&lt;br /&gt;
	str += 'if(user){&amp;lt;br&amp;gt;&amp;lt;&amp;lt;contribs|shortcut=c&amp;gt;&amp;gt;*&amp;lt;&amp;lt;userlog|shortcut=L|log&amp;gt;&amp;gt;';&lt;br /&gt;
	str+='if(ipuser){*&amp;lt;&amp;lt;arin&amp;gt;&amp;gt;}if(wikimedia){*&amp;lt;&amp;lt;count|shortcut=#&amp;gt;&amp;gt;}';&lt;br /&gt;
	str+='if(ipuser){}else{*&amp;lt;&amp;lt;email|shortcut=E&amp;gt;&amp;gt;}if(admin){*&amp;lt;&amp;lt;block|shortcut=b&amp;gt;&amp;gt;|&amp;lt;&amp;lt;blocklog|log&amp;gt;&amp;gt;}}';&lt;br /&gt;
 &lt;br /&gt;
	// editing links&lt;br /&gt;
	// talkpage   -&amp;gt; edit|new - history - un|watch - article|edit&lt;br /&gt;
	// other page -&amp;gt; edit - history - un|watch - talk|edit|new&lt;br /&gt;
	var editstr='&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;';&lt;br /&gt;
	var editOldidStr='if(oldid){&amp;lt;&amp;lt;editOld|shortcut=e&amp;gt;&amp;gt;|&amp;lt;&amp;lt;revert|shortcut=v|rv&amp;gt;&amp;gt;|&amp;lt;&amp;lt;edit|cur&amp;gt;&amp;gt;}else{' + editstr + '}'&lt;br /&gt;
		var historystr='&amp;lt;&amp;lt;history|shortcut=h&amp;gt;&amp;gt;if(mainspace_en){|&amp;lt;&amp;lt;editors|shortcut=E|&amp;gt;&amp;gt;}';&lt;br /&gt;
	var watchstr='&amp;lt;&amp;lt;unwatch|unwatchShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;watch|shortcut=w|watchThingy&amp;gt;&amp;gt;';&lt;br /&gt;
 &lt;br /&gt;
	str+='&amp;lt;br&amp;gt;if(talk){' +&lt;br /&gt;
		editOldidStr+'|&amp;lt;&amp;lt;new|shortcut=+&amp;gt;&amp;gt;' + '*' + historystr+'*'+watchstr + '*' +&lt;br /&gt;
		'&amp;lt;b&amp;gt;&amp;lt;&amp;lt;article|shortcut=a&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;|&amp;lt;&amp;lt;editArticle|edit&amp;gt;&amp;gt;' +&lt;br /&gt;
		'}else{' + // not a talk page&lt;br /&gt;
		editOldidStr + '*' + historystr + '*' + watchstr + '*' +&lt;br /&gt;
		'&amp;lt;b&amp;gt;&amp;lt;&amp;lt;talk|shortcut=t&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;|&amp;lt;&amp;lt;editTalk|edit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;newTalk|shortcut=+|new&amp;gt;&amp;gt;'&lt;br /&gt;
		+ '}';&lt;br /&gt;
 &lt;br /&gt;
	// misc links&lt;br /&gt;
	str += '&amp;lt;br&amp;gt;&amp;lt;&amp;lt;whatLinksHere|shortcut=l&amp;gt;&amp;gt;*&amp;lt;&amp;lt;relatedChanges|shortcut=r&amp;gt;&amp;gt;*&amp;lt;&amp;lt;move|shortcut=m&amp;gt;&amp;gt;';&lt;br /&gt;
 &lt;br /&gt;
	// admin links&lt;br /&gt;
	str += 'if(admin){&amp;lt;br&amp;gt;&amp;lt;&amp;lt;unprotect|unprotectShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protect|shortcut=p&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protectlog|log&amp;gt;&amp;gt;*' +&lt;br /&gt;
		'&amp;lt;&amp;lt;undelete|undeleteShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;delete|shortcut=d&amp;gt;&amp;gt;|&amp;lt;&amp;lt;deletelog|log&amp;gt;&amp;gt;}';&lt;br /&gt;
	return str;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function navLinksHTML (article, hint, params) { //oldid, rcid) {&lt;br /&gt;
	var str = '&amp;lt;span class=&amp;quot;popupNavLinks&amp;quot;&amp;gt;' + defaultNavlinkSpec() + '&amp;lt;/span&amp;gt;';&lt;br /&gt;
	// BAM&lt;br /&gt;
	return navlinkStringToHTML(str, article, params);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function expandConditionalNavlinkString(s,article,z,recursionCount) {&lt;br /&gt;
	var oldid=z.oldid, rcid=z.rcid, diff=z.diff;&lt;br /&gt;
	// nested conditionals (up to 10 deep) are ok, hopefully! (work from the inside out)&lt;br /&gt;
	if (typeof recursionCount!=typeof 0) { recursionCount=0; }&lt;br /&gt;
	var conditionalSplitRegex=RegExp(&lt;br /&gt;
		//(1     if    \\(    (2    2)    \\)      {(3    3)}  (4   else      {(5     5)}  4)1)&lt;br /&gt;
		'(;?\\s*if\\s*\\(\\s*([\\w]*)\\s*\\)\\s*\\{([^{}]*)\\}(\\s*else\\s*\\{([^{}]*?)\\}|))', 'i');&lt;br /&gt;
	var splitted=s.parenSplit(conditionalSplitRegex);&lt;br /&gt;
	// $1: whole conditional&lt;br /&gt;
	// $2: test condition&lt;br /&gt;
	// $3: true expansion&lt;br /&gt;
	// $4: else clause (possibly empty)&lt;br /&gt;
	// $5: false expansion (possibly null)&lt;br /&gt;
	var numParens=5;&lt;br /&gt;
	var ret = splitted[0];&lt;br /&gt;
	for (var i=1; i&amp;lt;splitted.length; i=i+numParens+1) {&lt;br /&gt;
 &lt;br /&gt;
		var testString=splitted[i+2-1];&lt;br /&gt;
		var trueString=splitted[i+3-1];&lt;br /&gt;
		var falseString=splitted[i+5-1];&lt;br /&gt;
		if (typeof falseString=='undefined' || !falseString) { falseString=''; }&lt;br /&gt;
		var testResult=null;&lt;br /&gt;
 &lt;br /&gt;
		switch (testString) {&lt;br /&gt;
		case 'user':&lt;br /&gt;
			testResult=(article.userName())?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case 'talk':&lt;br /&gt;
			testResult=(article.talkPage())?false:true; // talkPage converts _articles_ to talkPages&lt;br /&gt;
			break;&lt;br /&gt;
		case 'admin':&lt;br /&gt;
			testResult=getValueOf('popupAdminLinks')?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case 'oldid':&lt;br /&gt;
			testResult=(typeof oldid != 'undefined' &amp;amp;&amp;amp; oldid)?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case 'rcid':&lt;br /&gt;
			testResult=(typeof rcid != 'undefined' &amp;amp;&amp;amp; rcid)?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case 'ipuser':&lt;br /&gt;
			testResult=(article.isIpUser())?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case 'mainspace_en':&lt;br /&gt;
			testResult=isInMainNamespace(article) &amp;amp;&amp;amp;&lt;br /&gt;
				pg.wiki.hostname=='en.wikipedia.org';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'wikimedia':&lt;br /&gt;
			testResult=(pg.wiki.wikimedia) ? true : false;&lt;br /&gt;
			break;&lt;br /&gt;
		case 'diff':&lt;br /&gt;
			testResult=(typeof diff != 'undefined' &amp;amp;&amp;amp; diff)?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		switch(testResult) {&lt;br /&gt;
		case null: ret+=splitted[i];  break;&lt;br /&gt;
		case true: ret+=trueString;   break;&lt;br /&gt;
		case false: ret+=falseString; break;&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		// append non-conditional string&lt;br /&gt;
		ret += splitted[i+numParens];&lt;br /&gt;
	}&lt;br /&gt;
	if (conditionalSplitRegex.test(ret) &amp;amp;&amp;amp; recursionCount &amp;lt; 10) {&lt;br /&gt;
		return expandConditionalNavlinkString(ret,article,z,recursionCount+1);&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function navlinkStringToArray(s, article, params) {&lt;br /&gt;
	s=expandConditionalNavlinkString(s,article,params);&lt;br /&gt;
	var splitted=s.parenSplit(RegExp('&amp;lt;&amp;lt;(.*?)&amp;gt;&amp;gt;'));&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;splitted.length; ++i) {&lt;br /&gt;
		if (i%2) { // i odd, so s is a tag&lt;br /&gt;
			var t=new navlinkTag();&lt;br /&gt;
			var ss=splitted[i].split('|');&lt;br /&gt;
			t.id=ss[0];&lt;br /&gt;
			for (var j=1; j&amp;lt;ss.length; ++j) {&lt;br /&gt;
				var sss=ss[j].split('=');&lt;br /&gt;
				if (sss.length&amp;gt;1) {&lt;br /&gt;
					t[sss[0]]=sss[1];&lt;br /&gt;
				}&lt;br /&gt;
				else { // no assignment (no &amp;quot;=&amp;quot;), so treat this as a title (overwriting the last one)&lt;br /&gt;
					t.text=popupString(sss[0]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			t.article=article;&lt;br /&gt;
			var oldid=params.oldid, rcid=params.rcid, diff=params.diff;&lt;br /&gt;
			if (typeof oldid != 'undefined' &amp;amp;&amp;amp; oldid != null) { t.oldid=oldid; }&lt;br /&gt;
			if (typeof rcid != 'undefined' &amp;amp;&amp;amp; rcid != null) { t.rcid=rcid; }&lt;br /&gt;
			if (typeof diff != 'undefined' &amp;amp;&amp;amp; diff != null) { t.diff=diff; }&lt;br /&gt;
			if (!t.text &amp;amp;&amp;amp; t.id != 'mainlink') { t.text=popupString(t.id); }&lt;br /&gt;
			ret.push(t);&lt;br /&gt;
		}&lt;br /&gt;
		else { // plain HTML&lt;br /&gt;
			ret.push(splitted[i]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function navlinkSubstituteHTML(s) {&lt;br /&gt;
	return s.split('*').join(getValueOf('popupNavLinkSeparator'))&lt;br /&gt;
		.split('&amp;lt;menurow&amp;gt;').join('&amp;lt;li class=&amp;quot;popup_menu_row&amp;quot;&amp;gt;')&lt;br /&gt;
		.split('&amp;lt;/menurow&amp;gt;').join('&amp;lt;/li&amp;gt;')&lt;br /&gt;
		.split('&amp;lt;menu&amp;gt;').join('&amp;lt;ul class=&amp;quot;popup_menu&amp;quot;&amp;gt;')&lt;br /&gt;
		.split('&amp;lt;/menu&amp;gt;').join('&amp;lt;/ul&amp;gt;');&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function navlinkDepth(magic,s) {&lt;br /&gt;
	return s.split('&amp;lt;' + magic + '&amp;gt;').length - s.split('&amp;lt;/' + magic + '&amp;gt;').length;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
// navlinkString: * becomes the separator&lt;br /&gt;
//                &amp;lt;&amp;lt;foo|bar=baz|fubar&amp;gt;&amp;gt; becomes a foo-link with attribute bar='baz'&lt;br /&gt;
//                                      and visible text 'fubar'&lt;br /&gt;
//                if(test){...} and if(test){...}else{...} work too (nested ok)&lt;br /&gt;
 &lt;br /&gt;
function navlinkStringToHTML(s,article,params) {&lt;br /&gt;
	//limitAlert(navlinkStringToHTML, 5, 'navlinkStringToHTML\n' + article + '\n' + (typeof article));&lt;br /&gt;
	var p=navlinkStringToArray(s,article,params);&lt;br /&gt;
	var html='';&lt;br /&gt;
	var menudepth = 0; // nested menus not currently allowed, but doesn't do any harm to code for it&lt;br /&gt;
	var menurowdepth = 0;&lt;br /&gt;
	var wrapping = null;&lt;br /&gt;
	for (var i=0; i&amp;lt;p.length; ++i) {&lt;br /&gt;
		if (typeof p[i] == typeof '') {&lt;br /&gt;
			html+=navlinkSubstituteHTML(p[i]);&lt;br /&gt;
			menudepth += navlinkDepth('menu', p[i]);&lt;br /&gt;
			menurowdepth += navlinkDepth('menurow', p[i]);&lt;br /&gt;
//			if (menudepth === 0) {&lt;br /&gt;
//				tagType='span';&lt;br /&gt;
//			} else if (menurowdepth === 0) {&lt;br /&gt;
//				tagType='li';&lt;br /&gt;
//			} else {&lt;br /&gt;
//				tagType = null;&lt;br /&gt;
//			}&lt;br /&gt;
		} else if (typeof p[i].type != 'undefined' &amp;amp;&amp;amp; p[i].type=='navlinkTag') {&lt;br /&gt;
			if (menudepth &amp;gt; 0 &amp;amp;&amp;amp; menurowdepth === 0) {&lt;br /&gt;
				html += '&amp;lt;li class=&amp;quot;popup_menu_item&amp;quot;&amp;gt;' + p[i].html() + '&amp;lt;/li&amp;gt;';&lt;br /&gt;
			} else {&lt;br /&gt;
				html+=p[i].html();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return html;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function navlinkTag() {&lt;br /&gt;
	this.type='navlinkTag';&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
navlinkTag.prototype.html=function () {&lt;br /&gt;
	this.getNewWin();&lt;br /&gt;
	this.getPrintFunction();&lt;br /&gt;
	var html='';&lt;br /&gt;
	var opening, closing;&lt;br /&gt;
	var tagType='span';&lt;br /&gt;
	if (!tagType) {&lt;br /&gt;
		opening = ''; closing = '';&lt;br /&gt;
	} else {&lt;br /&gt;
		opening = '&amp;lt;' + tagType + ' class=&amp;quot;popup_' + this.id + '&amp;quot;&amp;gt;';&lt;br /&gt;
		closing = '&amp;lt;/' + tagType + '&amp;gt;';&lt;br /&gt;
	}&lt;br /&gt;
	if (typeof this.print!='function') {&lt;br /&gt;
		errlog ('Oh dear - invalid print function for a navlinkTag, id='+this.id);&lt;br /&gt;
	} else {&lt;br /&gt;
		html=this.print(this);&lt;br /&gt;
		if (typeof html != typeof '') {html='';}&lt;br /&gt;
		else if (typeof this.shortcut!='undefined') html=addPopupShortcut(html, this.shortcut);&lt;br /&gt;
	}&lt;br /&gt;
	return opening + html + closing;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
navlinkTag.prototype.getNewWin=function() {&lt;br /&gt;
	getValueOf('popupLinksNewWindow');&lt;br /&gt;
	if (typeof pg.option.popupLinksNewWindow[this.id] === 'undefined') { this.newWin=null; }&lt;br /&gt;
	this.newWin=pg.option.popupLinksNewWindow[this.id];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
navlinkTag.prototype.getPrintFunction=function() { //think about this some more&lt;br /&gt;
	// this.id and this.article should already be defined&lt;br /&gt;
	if (typeof this.id!=typeof '' || typeof this.article!=typeof {} ) { return; }&lt;br /&gt;
	var html='';&lt;br /&gt;
	var a,t;&lt;br /&gt;
 &lt;br /&gt;
	this.noPopup=1;&lt;br /&gt;
	switch (this.id) {&lt;br /&gt;
	case 'contribs': case 'history': case 'whatLinksHere':&lt;br /&gt;
	case 'userPage': case 'monobook': case 'userTalk':&lt;br /&gt;
	case 'talk': case 'article': case 'lastEdit':&lt;br /&gt;
		this.noPopup=null;&lt;br /&gt;
	}&lt;br /&gt;
	switch (this.id) {&lt;br /&gt;
	case 'email':     case 'contribs':  case 'block':     case 'unblock':&lt;br /&gt;
	case 'userlog':   case 'userSpace': case 'deletedContribs':&lt;br /&gt;
		this.article=this.article.userName();&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	switch (this.id) {&lt;br /&gt;
	case 'userTalk': case 'newUserTalk': case 'editUserTalk':&lt;br /&gt;
	case 'userPage': case 'monobook': case 'editMonobook': case 'blocklog':&lt;br /&gt;
		this.article=this.article.userName(true);&lt;br /&gt;
	// fall through; no break&lt;br /&gt;
	case 'pagelog': case 'deletelog': case 'protectlog':&lt;br /&gt;
	delete this.oldid;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if (this.id=='editMonobook' || this.id=='monobook') { this.article.append('/monobook.js'); }&lt;br /&gt;
 &lt;br /&gt;
	if (this.id != 'mainlink') {&lt;br /&gt;
		// FIXME anchor handling should be done differently with Title object&lt;br /&gt;
		this.article=this.article.removeAnchor();&lt;br /&gt;
		// if (typeof this.text=='undefined') this.text=popupString(this.id);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	switch (this.id) {&lt;br /&gt;
	case 'undelete':       this.print=specialLink; this.specialpage='Undelete'; this.sep='/'; break;&lt;br /&gt;
	case 'whatLinksHere':  this.print=specialLink; this.specialpage='Whatlinkshere'; break;&lt;br /&gt;
	case 'relatedChanges': this.print=specialLink; this.specialpage='Recentchangeslinked'; break;&lt;br /&gt;
	case 'move':           this.print=specialLink; this.specialpage='Movepage'; break;&lt;br /&gt;
	case 'contribs':       this.print=specialLink; this.specialpage='Contributions'; break;&lt;br /&gt;
	case 'deletedContribs':this.print=specialLink; this.specialpage='Deletedcontributions'; break;&lt;br /&gt;
	case 'email':          this.print=specialLink; this.specialpage='Emailuser'; break;&lt;br /&gt;
	case 'block':          this.print=specialLink; this.specialpage='Blockip'; this.sep='&amp;amp;ip='; break;&lt;br /&gt;
	case 'unblock':        this.print=specialLink; this.specialpage='Ipblocklist'; this.sep='&amp;amp;action=unblock&amp;amp;ip='; break;&lt;br /&gt;
	case 'userlog':        this.print=specialLink; this.specialpage='Log'; this.sep='&amp;amp;user='; break;&lt;br /&gt;
	case 'blocklog':       this.print=specialLink; this.specialpage='Log'; this.sep='&amp;amp;type=block&amp;amp;page='; break;&lt;br /&gt;
	case 'pagelog':        this.print=specialLink; this.specialpage='Log'; this.sep='&amp;amp;page='; break;&lt;br /&gt;
	case 'protectlog':     this.print=specialLink; this.specialpage='Log'; this.sep='&amp;amp;type=protect&amp;amp;page='; break;&lt;br /&gt;
	case 'deletelog':      this.print=specialLink; this.specialpage='Log'; this.sep='&amp;amp;type=delete&amp;amp;page='; break;&lt;br /&gt;
	case 'userSpace':      this.print=specialLink; this.specialpage='PrefixIndex'; this.sep='&amp;amp;namespace=2&amp;amp;prefix='; break;&lt;br /&gt;
	case 'search':         this.print=specialLink; this.specialpage='Search'; this.sep='&amp;amp;fulltext=Search&amp;amp;search='; break;&lt;br /&gt;
	case 'history': case 'historyfeed': case 'unwatch': case 'watch':&lt;br /&gt;
	case 'unprotect': case 'protect':&lt;br /&gt;
	this.print=wikiLink; this.action=this.id; break;&lt;br /&gt;
 &lt;br /&gt;
	case 'delete':&lt;br /&gt;
	this.print=wikiLink; this.action='delete';&lt;br /&gt;
	if (this.article.namespace()==pg.ns.image) {&lt;br /&gt;
	    var img=this.article.stripNamespace();&lt;br /&gt;
	    this.action+='&amp;amp;image='+img;&lt;br /&gt;
	}&lt;br /&gt;
	break;&lt;br /&gt;
 &lt;br /&gt;
	case 'markpatrolled':&lt;br /&gt;
	case 'edit': // editOld should keep the oldid, but edit should not.&lt;br /&gt;
	delete this.oldid; // fall through&lt;br /&gt;
	case 'view': case 'purge': case 'render':&lt;br /&gt;
	this.print=wikiLink;&lt;br /&gt;
	this.action=this.id; break;&lt;br /&gt;
	case 'raw':&lt;br /&gt;
	this.print=wikiLink; this.action='raw&amp;amp;ctype=text/css'; break;&lt;br /&gt;
	case 'new':&lt;br /&gt;
	this.print=wikiLink; this.action='edit&amp;amp;section=new'; break;&lt;br /&gt;
	case 'mainlink':&lt;br /&gt;
	if (typeof this.text=='undefined') { this.text=this.article.toString().entify(); }&lt;br /&gt;
	if (getValueOf('popupSimplifyMainLink') &amp;amp;&amp;amp; isInStrippableNamespace(this.article)) {&lt;br /&gt;
	    var s=this.text.split('/'); this.text=s[s.length-1];&lt;br /&gt;
	    if (this.text=='' &amp;amp;&amp;amp; s.length &amp;gt; 1) { this.text=s[s.length-2]; }&lt;br /&gt;
	}&lt;br /&gt;
	this.print=titledWikiLink;&lt;br /&gt;
	if (typeof this.title=='undefined' &amp;amp;&amp;amp; pg.current.link &amp;amp;&amp;amp; typeof pg.current.link.href != 'undefined') {&lt;br /&gt;
	    this.title=safeDecodeURI((pg.current.link.originalTitle)?pg.current.link.originalTitle:this.article);&lt;br /&gt;
	    if (typeof this.oldid != 'undefined' &amp;amp;&amp;amp; this.oldid) {&lt;br /&gt;
		this.title=tprintf('Revision %s of %s', [this.oldid, this.title]);&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
	this.action='view'; break;&lt;br /&gt;
	case 'userPage':&lt;br /&gt;
	case 'article':&lt;br /&gt;
	case 'monobook':&lt;br /&gt;
	case 'editMonobook':&lt;br /&gt;
	case 'editArticle':&lt;br /&gt;
	delete this.oldid;&lt;br /&gt;
	//alert(this.id+'\n'+this.article + '\n'+ typeof this.article);&lt;br /&gt;
	this.article=this.article.articleFromTalkOrArticle();&lt;br /&gt;
	//alert(this.id+'\n'+this.article + '\n'+ typeof this.article);&lt;br /&gt;
	this.print=wikiLink;&lt;br /&gt;
	if (this.id.indexOf('edit')==0) {&lt;br /&gt;
	    this.action='edit';&lt;br /&gt;
	} else { this.action='view';}&lt;br /&gt;
	break;&lt;br /&gt;
	case 'userTalk':&lt;br /&gt;
	case 'talk':&lt;br /&gt;
	this.article=this.article.talkPage();&lt;br /&gt;
	delete this.oldid;&lt;br /&gt;
	this.print=wikiLink;&lt;br /&gt;
	this.action='view'; break;&lt;br /&gt;
	case 'arin':&lt;br /&gt;
	this.print=arinLink; break;&lt;br /&gt;
	case 'count':&lt;br /&gt;
	this.print=editCounterLink; break;&lt;br /&gt;
	case 'google':&lt;br /&gt;
	this.print=googleLink; break;&lt;br /&gt;
	case 'editors':&lt;br /&gt;
	this.print=editorListLink; break;&lt;br /&gt;
	case 'globalsearch':&lt;br /&gt;
	this.print=globalSearchLink; break;&lt;br /&gt;
	case 'lastEdit':&lt;br /&gt;
	this.print=titledDiffLink;&lt;br /&gt;
	this.title=popupString('Show the last edit');&lt;br /&gt;
	this.from='prev'; this.to='cur'; break;&lt;br /&gt;
	case 'oldEdit':&lt;br /&gt;
	this.print=titledDiffLink;&lt;br /&gt;
	this.title=popupString('Show the edit made to get revision') + ' ' + this.oldid;&lt;br /&gt;
	this.from='prev'; this.to=this.oldid; break;&lt;br /&gt;
	case 'editOld':&lt;br /&gt;
	this.print=wikiLink; this.action='edit'; break;&lt;br /&gt;
	case 'undo':&lt;br /&gt;
	this.print=wikiLink; this.action='edit&amp;amp;undo='; break;&lt;br /&gt;
	case 'markpatrolled':&lt;br /&gt;
	this.print=wikiLink; this.action='markpatrolled';&lt;br /&gt;
	case 'revert':&lt;br /&gt;
	this.print=wikiLink; this.action='revert'; break;&lt;br /&gt;
	case 'nullEdit':&lt;br /&gt;
	this.print=wikiLink; this.action='nullEdit'; break;&lt;br /&gt;
	case 'diffCur':&lt;br /&gt;
	this.print=titledDiffLink;&lt;br /&gt;
	this.title=tprintf('Show changes since revision %s', [this.oldid]);&lt;br /&gt;
	this.from=this.oldid; this.to='cur'; break;&lt;br /&gt;
	case 'editUserTalk':&lt;br /&gt;
	case 'editTalk':&lt;br /&gt;
	delete this.oldid;&lt;br /&gt;
	this.article=this.article.talkPage();&lt;br /&gt;
	this.action='edit'; this.print=wikiLink; break;&lt;br /&gt;
	case 'newUserTalk':&lt;br /&gt;
	case 'newTalk':&lt;br /&gt;
	this.article=this.article.talkPage();&lt;br /&gt;
	this.action='edit&amp;amp;section=new'; this.print=wikiLink; break;&lt;br /&gt;
	case 'lastContrib':&lt;br /&gt;
	case 'sinceMe':&lt;br /&gt;
	this.print=magicHistoryLink;&lt;br /&gt;
	break;&lt;br /&gt;
	case 'togglePreviews':&lt;br /&gt;
	this.text=popupString(pg.option.simplePopups ? 'enable previews' : 'disable previews');&lt;br /&gt;
	case 'disablePopups': case 'purgePopups':&lt;br /&gt;
	this.print=popupMenuLink;&lt;br /&gt;
	break;&lt;br /&gt;
	default:&lt;br /&gt;
	this.print=function () {return 'Unknown navlink type: '+this.id+''};&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
//&lt;br /&gt;
//  end navlinks&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: navlinks.js&lt;br /&gt;
// STARTFILE: shortcutkeys.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function popupHandleKeypress(evt) {&lt;br /&gt;
	var keyCode = window.event ? window.event.keyCode : ( evt.keyCode ? evt.keyCode : evt.which);&lt;br /&gt;
	if (!keyCode || !pg.current.link || !pg.current.link.navpopup) { return; }&lt;br /&gt;
	if (keyCode==27) { // escape&lt;br /&gt;
		killPopup();&lt;br /&gt;
		return false; // swallow keypress&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	var letter=String.fromCharCode(keyCode);&lt;br /&gt;
	var links=pg.current.link.navpopup.mainDiv.getElementsByTagName('A');&lt;br /&gt;
	var startLink=0;&lt;br /&gt;
	var i,j;&lt;br /&gt;
 &lt;br /&gt;
	if (popupHandleKeypress.lastPopupLinkSelected) {&lt;br /&gt;
		for (i=0; i&amp;lt;links.length; ++i) {&lt;br /&gt;
			if (links[i]==popupHandleKeypress.lastPopupLinkSelected) { startLink=i; }&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for (j=0; j&amp;lt;links.length; ++j) {&lt;br /&gt;
		i=(startLink + j + 1) % links.length;&lt;br /&gt;
		if (links[i].getAttribute('popupkey')==letter) {&lt;br /&gt;
			if (evt &amp;amp;&amp;amp; evt.preventDefault) evt.preventDefault();&lt;br /&gt;
			links[i].focus();&lt;br /&gt;
			popupHandleKeypress.lastPopupLinkSelected=links[i];&lt;br /&gt;
			return false; // swallow keypress&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// pass keypress on&lt;br /&gt;
	if (document.oldPopupOnkeypress) { return document.oldPopupOnkeypress(evt); }&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function addPopupShortcuts() {&lt;br /&gt;
	if (document.onkeypress!=popupHandleKeypress) {&lt;br /&gt;
		document.oldPopupOnkeypress=document.onkeypress;&lt;br /&gt;
	}&lt;br /&gt;
	document.onkeypress=popupHandleKeypress;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function rmPopupShortcuts() {&lt;br /&gt;
	popupHandleKeypress.lastPopupLinkSelected=null;&lt;br /&gt;
	try {&lt;br /&gt;
		if (document.oldPopupOnkeypress &amp;amp;&amp;amp; document.oldPopupOnkeypress==popupHandleKeypress) {&lt;br /&gt;
			// panic&lt;br /&gt;
			document.onkeypress=null; //function () {};&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		document.onkeypress=document.oldPopupOnkeypress;&lt;br /&gt;
	} catch (nasties) { /* IE goes here */ }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function addLinkProperty(html, property) {&lt;br /&gt;
	// take &amp;quot;&amp;lt;a href=...&amp;gt;...&amp;lt;/a&amp;gt; and add a property&lt;br /&gt;
	// not sophisticated at all, easily broken&lt;br /&gt;
	var i=html.indexOf('&amp;gt;');&lt;br /&gt;
	if (i&amp;lt;0) { return html; }&lt;br /&gt;
	return html.substring(0,i) + ' ' + property + html.substring(i);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function addPopupShortcut(html, key) {&lt;br /&gt;
	if (!getValueOf('popupShortcutKeys')) { return html; }&lt;br /&gt;
	var ret= addLinkProperty(html, 'popupkey=&amp;quot;'+key+'&amp;quot;');&lt;br /&gt;
	if (key==' ') { key=popupString('spacebar'); }&lt;br /&gt;
	return ret.replace(RegExp('^(.*?)(title=&amp;quot;)(.*?)(&amp;quot;.*)$', 'i'),'$1$2$3 ['+key+']$4');&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: shortcutkeys.js&lt;br /&gt;
// STARTFILE: diffpreview.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function loadDiff(article, oldid, diff, navpop) {&lt;br /&gt;
	navpop.diffData={};&lt;br /&gt;
	var oldRev, newRev;&lt;br /&gt;
	switch (diff) {&lt;br /&gt;
	case 'cur':&lt;br /&gt;
		switch ( oldid ) {&lt;br /&gt;
		case null:&lt;br /&gt;
		case '':&lt;br /&gt;
		case 'prev':&lt;br /&gt;
			// eg newmessages diff link&lt;br /&gt;
			oldRev='0&amp;amp;direction=prev';&lt;br /&gt;
			newRev=0;&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			oldRev = oldid;&lt;br /&gt;
			newRev = 0;&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case 'prev':&lt;br /&gt;
		oldRev = ( oldid || 0 ) + '&amp;amp;direction=prev'; newRev = oldid; break;&lt;br /&gt;
	case 'next':&lt;br /&gt;
		oldRev = oldid; newRev = oldid + '&amp;amp;direction=next';&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
		oldRev = oldid || 0; newRev = diff || 0; break;&lt;br /&gt;
	}&lt;br /&gt;
	oldRev = oldRev || 0;&lt;br /&gt;
	newRev = newRev || 0;&lt;br /&gt;
 &lt;br /&gt;
	var go = function() {&lt;br /&gt;
		pendingNavpopTask(navpop);&lt;br /&gt;
		getWiki(article, doneDiffNew, newRev, navpop);&lt;br /&gt;
 &lt;br /&gt;
		pendingNavpopTask(navpop);&lt;br /&gt;
		getWiki(article, doneDiffOld, oldRev, navpop);&lt;br /&gt;
 &lt;br /&gt;
		var tz = Cookie.read('popTz');&lt;br /&gt;
		if ( (window.wgEnableAPI || wgEnableAPI) &amp;amp;&amp;amp; getValueOf('popupAdjustDiffDates') &amp;amp;&amp;amp; tz===null) {&lt;br /&gt;
		    pendingNavpopTask(navpop);&lt;br /&gt;
		    getPageWithCaching(pg.wiki.apiwikibase + '?format=json&amp;amp;action=query&amp;amp;meta=userinfo&amp;amp;uiprop=options',&lt;br /&gt;
				       function(d) {&lt;br /&gt;
					       completedNavpopTask(navpop);&lt;br /&gt;
					       setTimecorrectionCookie(d);&lt;br /&gt;
					       if (diffDownloadsComplete(navpop)) { insertDiff(navpop); }&lt;br /&gt;
				       },  navpop);&lt;br /&gt;
		}&lt;br /&gt;
		return true; // remove hook once run&lt;br /&gt;
	}&lt;br /&gt;
	if (navpop.visible || !getValueOf('popupLazyDownloads')) { go(); }&lt;br /&gt;
	else { navpop.addHook(go, 'unhide', 'before', 'DOWNLOAD_DIFFS'); }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setTimecorrectionCookie(d) {&lt;br /&gt;
	try {&lt;br /&gt;
		var jsobj=getJsObj(d.data);&lt;br /&gt;
		var tz=jsobj.query.userinfo.options.timecorrection;&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		logerr( 'setTimecorretion failed' );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
    Cookie.create( 'popTz', getTimeOffset(tz), 1);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function doneDiff(download, isOld) {&lt;br /&gt;
	if (!download.owner || !download.owner.diffData) { return; }&lt;br /&gt;
	var navpop=download.owner;&lt;br /&gt;
	var label= (isOld) ? 'Old' : 'New';&lt;br /&gt;
	var otherLabel=(isOld) ? 'New' : 'Old';&lt;br /&gt;
	navpop.diffData[label]=download;&lt;br /&gt;
	completedNavpopTask(download.owner);&lt;br /&gt;
	if (diffDownloadsComplete(navpop)) { insertDiff(navpop); }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function diffDownloadsComplete(navpop) {&lt;br /&gt;
	if ( Cookie.read('popTz')===null) { return false; }&lt;br /&gt;
	return navpop.diffData.Old &amp;amp;&amp;amp; navpop.diffData.New;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function doneDiffNew(download) { doneDiff(download, false); }&lt;br /&gt;
function doneDiffOld(download) { doneDiff(download, true);  }&lt;br /&gt;
 &lt;br /&gt;
function rmBoringLines(a,b,context) {&lt;br /&gt;
 &lt;br /&gt;
	if (typeof context == 'undefined') { context=2; }&lt;br /&gt;
	// this is fairly slow... i think it's quicker than doing a word-based diff from the off, though&lt;br /&gt;
	var aa=[], aaa=[];&lt;br /&gt;
	var bb=[], bbb=[];&lt;br /&gt;
	var i, j;&lt;br /&gt;
 &lt;br /&gt;
	// first, gather all disconnected nodes in a and all crossing nodes in a and b&lt;br /&gt;
	for (i=0; i&amp;lt;a.length; ++i ) {&lt;br /&gt;
		if(!a[i].paired) { aa[i]=1; }&lt;br /&gt;
		else if (countCrossings(b,a,i, true)) {&lt;br /&gt;
			aa[i]=1;&lt;br /&gt;
			bb[ a[i].row ] = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// pick up remaining disconnected nodes in b&lt;br /&gt;
	for (i=0; i&amp;lt;b.length; ++i ) {&lt;br /&gt;
		if (bb[i]==1) { continue; }&lt;br /&gt;
		if(!b[i].paired) { bb[i]=1; }&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// another pass to gather context: we want the neighbours of included nodes which are not yet included&lt;br /&gt;
	// we have to add in partners of these nodes, but we don't want to add context for *those* nodes in the next pass&lt;br /&gt;
	for (i=0; i&amp;lt;b.length; ++i) {&lt;br /&gt;
		if ( bb[i] == 1 ) {&lt;br /&gt;
			for (j=max(0,i-context); j &amp;lt; min(b.length, i+context); ++j) {&lt;br /&gt;
				if ( !bb[j] ) { bb[j] = 1; aa[ b[j].row ] = 0.5; }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	for (i=0; i&amp;lt;a.length; ++i) {&lt;br /&gt;
		if ( aa[i] == 1 ) {&lt;br /&gt;
			for (j=max(0,i-context); j &amp;lt; min(a.length, i+context); ++j) {&lt;br /&gt;
				if ( !aa[j] ) { aa[j] = 1; bb[ a[j].row ] = 0.5; }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	for (i=0; i&amp;lt;bb.length; ++i) {&lt;br /&gt;
		if (bb[i] &amp;gt; 0) { // it's a row we need&lt;br /&gt;
			if (b[i].paired) { bbb.push(b[i].text); } // joined; partner should be in aa&lt;br /&gt;
			else {&lt;br /&gt;
				bbb.push(b[i]);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for (i=0; i&amp;lt;aa.length; ++i) {&lt;br /&gt;
		if (aa[i] &amp;gt; 0) { // it's a row we need&lt;br /&gt;
			if (a[i].paired) { aaa.push(a[i].text); } // joined; partner should be in aa&lt;br /&gt;
			else {&lt;br /&gt;
				aaa.push(a[i]);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	return { a: aaa, b: bbb};&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function stripOuterCommonLines(a,b,context) {&lt;br /&gt;
	var i=0;&lt;br /&gt;
	while (i&amp;lt;a.length &amp;amp;&amp;amp; i &amp;lt; b.length &amp;amp;&amp;amp; a[i]==b[i]) { ++i; }&lt;br /&gt;
	var j=a.length-1; var k=b.length-1;&lt;br /&gt;
	while ( j&amp;gt;=0 &amp;amp;&amp;amp; k&amp;gt;=0 &amp;amp;&amp;amp; a[j]==b[k] ) { --j; --k; }&lt;br /&gt;
 &lt;br /&gt;
	return { a: a.slice(max(0,i - 1 - context), min(a.length+1, j + context+1)),&lt;br /&gt;
			    b: b.slice(max(0,i - 1 - context), min(b.length+1, k + context+1)) };&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function insertDiff(navpop) {&lt;br /&gt;
	// for speed reasons, we first do a line-based diff, discard stuff that seems boring, then do a word-based diff&lt;br /&gt;
	// FIXME: sometimes this gives misleading diffs as distant chunks are squashed together&lt;br /&gt;
	var oldlines=navpop.diffData.Old.data.split('\n');&lt;br /&gt;
	var newlines=navpop.diffData.New.data.split('\n');&lt;br /&gt;
	var inner=stripOuterCommonLines(oldlines,newlines,getValueOf('popupDiffContextLines'));&lt;br /&gt;
	oldlines=inner.a; newlines=inner.b;&lt;br /&gt;
	var truncated=false;&lt;br /&gt;
	getValueOf('popupDiffMaxLines');&lt;br /&gt;
	if (oldlines.length &amp;gt; pg.option.popupDiffMaxLines || newlines.length &amp;gt; pg.option.popupDiffMaxLines) {&lt;br /&gt;
		// truncate&lt;br /&gt;
		truncated=true;&lt;br /&gt;
		inner=stripOuterCommonLines(oldlines.slice(0,pg.option.popupDiffMaxLines),&lt;br /&gt;
					    newlines.slice(0,pg.option.popupDiffMaxLines),&lt;br /&gt;
					    pg.option.popupDiffContextLines);&lt;br /&gt;
		oldlines=inner.a; newlines=inner.b;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	var lineDiff=diff(oldlines, newlines);&lt;br /&gt;
	var lines2=rmBoringLines(lineDiff.o, lineDiff.n);&lt;br /&gt;
	var oldlines2=lines2.a; var newlines2=lines2.b;&lt;br /&gt;
 &lt;br /&gt;
	var simpleSplit = !String.prototype.parenSplit.isNative;&lt;br /&gt;
	var html='&amp;lt;hr&amp;gt;';&lt;br /&gt;
	if (getValueOf('popupDiffDates')) {&lt;br /&gt;
		html += diffDatesTable(navpop.diffData.Old, navpop.diffData.New);&lt;br /&gt;
		html += '&amp;lt;hr&amp;gt;';&lt;br /&gt;
	}&lt;br /&gt;
	html += shortenDiffString(&lt;br /&gt;
		diffString(oldlines2.join('\n'), newlines2.join('\n'), simpleSplit),&lt;br /&gt;
		getValueOf('popupDiffContextCharacters') ).join('&amp;lt;hr&amp;gt;');&lt;br /&gt;
	setPopupTipsAndHTML(html.split('\n').join('&amp;lt;br&amp;gt;') +&lt;br /&gt;
		     (truncated ? '&amp;lt;hr&amp;gt;&amp;lt;b&amp;gt;'+popupString('Diff truncated for performance reasons')+'&amp;lt;/b&amp;gt;' : '') ,&lt;br /&gt;
			    'popupPreview', navpop.idNumber);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function diffDatesTable( oldDl, newDl ) {&lt;br /&gt;
	var html='&amp;lt;table class=&amp;quot;popup_diff_dates&amp;quot;&amp;gt;';&lt;br /&gt;
	html += diffDatesTableRow( newDl, tprintf('New revision'));&lt;br /&gt;
	html += diffDatesTableRow( oldDl, tprintf('Old revision'));&lt;br /&gt;
	html += '&amp;lt;/table&amp;gt;';&lt;br /&gt;
	return html;&lt;br /&gt;
}&lt;br /&gt;
function diffDatesTableRow( dl, label ) {&lt;br /&gt;
	var txt='';&lt;br /&gt;
	if (!dl) {&lt;br /&gt;
		txt=popupString('Something went wrong :-(');&lt;br /&gt;
	} else if (!dl.lastModified) {&lt;br /&gt;
		txt= (/^\s*$/.test(dl.data)) ?&lt;br /&gt;
			popupString('Empty revision, maybe non-existent') : popupString('Unknown date');&lt;br /&gt;
	} else {&lt;br /&gt;
		var datePrint=getValueOf('popupDiffDatePrinter');&lt;br /&gt;
		if (typeof dl.lastModified[datePrint] == 'function') {&lt;br /&gt;
			if (getValueOf('popupAdjustDiffDates')) {&lt;br /&gt;
				var off;&lt;br /&gt;
				if (off=Cookie.read('popTz')) {&lt;br /&gt;
					var d2=adjustDate(dl.lastModified, off);&lt;br /&gt;
					txt = dayFormat(d2, true) + ' ' + timeFormat(d2, true);&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				txt = dl.lastModified[datePrint]();&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			txt = tprintf('Invalid %s %s', ['popupDiffDatePrinter', datePrint]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	var revlink = generalLink({url: dl.url.replace(/&amp;amp;.*?(oldid=[0-9]+(?:&amp;amp;direction=[^&amp;amp;]*)?).*/, '&amp;amp;$1'),&lt;br /&gt;
				   text: label, title: label});&lt;br /&gt;
	return simplePrintf('&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;%s&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;%s&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;', [ revlink, txt ]);&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: diffpreview.js&lt;br /&gt;
// STARTFILE: links.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
/////////////////////&lt;br /&gt;
// LINK GENERATION //&lt;br /&gt;
/////////////////////&lt;br /&gt;
 &lt;br /&gt;
// titledDiffLink --&amp;gt; titledWikiLink --&amp;gt; generalLink&lt;br /&gt;
// wikiLink       --&amp;gt; titledWikiLink --&amp;gt; generalLink&lt;br /&gt;
// editCounterLink --&amp;gt; generalLink&lt;br /&gt;
 &lt;br /&gt;
function titledDiffLink(l) { // article, text, title, from, to) {&lt;br /&gt;
	return titledWikiLink({article: l.article, action: l.to + '&amp;amp;oldid=' + l.from,&lt;br /&gt;
				newWin: l.newWin,&lt;br /&gt;
				noPopup: l.noPopup,&lt;br /&gt;
				text: l.text, title: l.title,&lt;br /&gt;
				/* hack: no oldid here */&lt;br /&gt;
				actionName: 'diff'});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function wikiLink(l) {&lt;br /&gt;
	//{article:article, action:action, text:text, oldid, newid}) {&lt;br /&gt;
	if (! (typeof l.article == typeof {}&lt;br /&gt;
	       &amp;amp;&amp;amp; typeof l.action == typeof '' &amp;amp;&amp;amp; typeof l.text==typeof '')) return null;&lt;br /&gt;
	if (typeof l.oldid == 'undefined') { l.oldid=null; }&lt;br /&gt;
	var savedOldid = l.oldid;&lt;br /&gt;
	if (!/^(edit|view|revert|render)$|^raw/.test(l.action)) { l.oldid=null; }&lt;br /&gt;
	var hint=popupString(l.action + 'Hint'); // revertHint etc etc etc&lt;br /&gt;
	var oldidData=[l.oldid, safeDecodeURI(l.article)];&lt;br /&gt;
	var revisionString = tprintf('revision %s of %s', oldidData);&lt;br /&gt;
	log('revisionString='+revisionString);&lt;br /&gt;
	switch (l.action) {&lt;br /&gt;
	case 'edit&amp;amp;section=new': hint = popupString('newSectionHint');  break;&lt;br /&gt;
	case 'edit&amp;amp;undo=':&lt;br /&gt;
		if (l.diff &amp;amp;&amp;amp; l.diff != 'prev' &amp;amp;&amp;amp; savedOldid ) {&lt;br /&gt;
		  l.action += l.diff + '&amp;amp;undoafter=' + savedOldid;&lt;br /&gt;
		} else if (savedOldid) {&lt;br /&gt;
		  l.action += savedOldid;&lt;br /&gt;
		}&lt;br /&gt;
		hint = popupString('undoHint');&lt;br /&gt;
		break;&lt;br /&gt;
	case 'raw&amp;amp;ctype=text/css': hint=popupString('rawHint'); break;&lt;br /&gt;
	case 'revert':&lt;br /&gt;
	    if (!window.wgEnableAPI || !wgEnableAPI) {&lt;br /&gt;
	    	alert( 'This function of navigation popups now requires a MediaWiki ' + &lt;br /&gt;
			'installation with the API enabled.');&lt;br /&gt;
			break;&lt;br /&gt;
	    }&lt;br /&gt;
		var p=parseParams(pg.current.link.href);&lt;br /&gt;
		l.action='edit&amp;amp;autoclick=wpSave&amp;amp;actoken=' + autoClickToken() + '&amp;amp;autosummary=' + revertSummary(l.oldid, p.diff);&lt;br /&gt;
		if (p.diff=='prev') {&lt;br /&gt;
			l.action += '&amp;amp;direction=prev';&lt;br /&gt;
			revisionString = tprintf('the revision prior to revision %s of %s', oldidData);&lt;br /&gt;
		}&lt;br /&gt;
		if (getValueOf('popupRevertSummaryPrompt')) { l.action += '&amp;amp;autosummaryprompt=true'; }&lt;br /&gt;
		if (getValueOf('popupMinorReverts')) { l.action += '&amp;amp;autominor=true'; }&lt;br /&gt;
		log('revisionString is now '+revisionString);&lt;br /&gt;
		break;&lt;br /&gt;
	case 'nullEdit':&lt;br /&gt;
		l.action='edit&amp;amp;autoclick=wpSave&amp;amp;actoken=' + autoClickToken() + '&amp;amp;autosummary=null';&lt;br /&gt;
		break;&lt;br /&gt;
	case 'historyfeed':&lt;br /&gt;
		l.action='history&amp;amp;feed=rss';&lt;br /&gt;
		break;&lt;br /&gt;
	case 'markpatrolled':&lt;br /&gt;
		l.action='markpatrolled&amp;amp;rcid='+l.rcid;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if (hint) {&lt;br /&gt;
		if (l.oldid) {&lt;br /&gt;
			hint = simplePrintf(hint, [revisionString]);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			hint = simplePrintf(hint, [safeDecodeURI(l.article)]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		hint = safeDecodeURI(l.article + '&amp;amp;action=' + l.action) + (l.oldid) ? '&amp;amp;oldid='+l.oldid : '';&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	return titledWikiLink({article: l.article, action: l.action, text: l.text, newWin:l.newWin,&lt;br /&gt;
				title: hint, oldid: l.oldid, noPopup: l.noPopup});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function revertSummary(oldid, diff) {&lt;br /&gt;
	var ret='';&lt;br /&gt;
	if (diff == 'prev') {&lt;br /&gt;
		ret=getValueOf('popupQueriedRevertToPreviousSummary');&lt;br /&gt;
	} else { ret = getValueOf('popupQueriedRevertSummary'); }&lt;br /&gt;
	return ret + '&amp;amp;autorv=' + oldid;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function titledWikiLink(l) {&lt;br /&gt;
	// possible properties of argument:&lt;br /&gt;
	// article, action, text, title, oldid, actionName, className, noPopup&lt;br /&gt;
	// oldid = null is fine here&lt;br /&gt;
 &lt;br /&gt;
	// article and action are mandatory args&lt;br /&gt;
 &lt;br /&gt;
	if (typeof l.article == 'undefined' || typeof l.action=='undefined') {&lt;br /&gt;
		errlog('got undefined article or action in titledWikiLink');&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	var base = pg.wiki.titlebase +  l.article.urlString();&lt;br /&gt;
	var url=base;&lt;br /&gt;
 &lt;br /&gt;
	if (typeof l.actionName=='undefined' || !l.actionName) { l.actionName='action'; }&lt;br /&gt;
 &lt;br /&gt;
	// no need to add &amp;amp;action=view, and this confuses anchors&lt;br /&gt;
	if (l.action != 'view') { url = base + '&amp;amp;' + l.actionName + '=' + l.action; }&lt;br /&gt;
 &lt;br /&gt;
	if (typeof l.oldid!='undefined' &amp;amp;&amp;amp; l.oldid) { url+='&amp;amp;oldid='+l.oldid; }&lt;br /&gt;
 &lt;br /&gt;
	var cssClass=pg.misc.defaultNavlinkClassname;&lt;br /&gt;
	if (typeof l.className!='undefined' &amp;amp;&amp;amp; l.className) { cssClass=l.className; }&lt;br /&gt;
 &lt;br /&gt;
	return generalNavLink({url: url, newWin: l.newWin,&lt;br /&gt;
				title: (typeof l.title != 'undefined') ? l.title : null,&lt;br /&gt;
				text: (typeof l.text!='undefined')?l.text:null,&lt;br /&gt;
				className: cssClass, noPopup:l.noPopup});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getLastContrib(wikipage, newWin) {&lt;br /&gt;
	getHistoryInfo(wikipage, function(x){processLastContribInfo(x,{page: wikipage, newWin: newWin})});&lt;br /&gt;
}&lt;br /&gt;
function processLastContribInfo(info, stuff) {&lt;br /&gt;
	if(!info.edits || !info.edits.length) { alert('Popups: an odd thing happened. Please retry.'); return; }&lt;br /&gt;
	if(!info.firstNewEditor) {&lt;br /&gt;
		alert(tprintf('Only found one editor: %s made %s edits', [info.edits[0].editor,info.edits.length]));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	var newUrl=pg.wiki.titlebase + new Title(stuff.page).urlString() + '&amp;amp;diff=cur&amp;amp;oldid='+info.firstNewEditor.oldid;&lt;br /&gt;
	displayUrl(newUrl, stuff.newWin);&lt;br /&gt;
}&lt;br /&gt;
function getDiffSinceMyEdit(wikipage, newWin) {&lt;br /&gt;
	getHistoryInfo(wikipage, function(x){processDiffSinceMyEdit(x,{page: wikipage, newWin: newWin})});&lt;br /&gt;
}&lt;br /&gt;
function processDiffSinceMyEdit(info, stuff) {&lt;br /&gt;
	if(!info.edits || !info.edits.length) { alert('Popups: something fishy happened. Please try again.'); return; }&lt;br /&gt;
	var friendlyName=stuff.page.split('_').join(' ');&lt;br /&gt;
	if(!info.myLastEdit) {&lt;br /&gt;
		alert(tprintf('Couldn\'t find an edit by %s\nin the last %s edits to\n%s',&lt;br /&gt;
			      [info.userName, getValueOf('popupHistoryLimit'), friendlyName]));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if(info.myLastEdit.index==0) {&lt;br /&gt;
		alert(tprintf(&amp;quot;%s seems to be the last editor to the page %s&amp;quot;, [info.userName, friendlyName]));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	var newUrl=pg.wiki.titlebase + new Title(stuff.page).urlString() + '&amp;amp;diff=cur&amp;amp;oldid='+ info.myLastEdit.oldid;&lt;br /&gt;
	displayUrl(newUrl, stuff.newWin);&lt;br /&gt;
}&lt;br /&gt;
function displayUrl(url, newWin){&lt;br /&gt;
	if(newWin) { window.open(url); }&lt;br /&gt;
	else { document.location=url; }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function purgePopups() {&lt;br /&gt;
	processAllPopups(true);&lt;br /&gt;
	setupCache(); // deletes all cached items (not browser cached, though...)&lt;br /&gt;
	pg.option={};&lt;br /&gt;
	abortAllDownloads();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function processAllPopups(nullify, banish) {&lt;br /&gt;
	for (var i=0; i&amp;lt;pg.current.links.length; ++i) {&lt;br /&gt;
		if (!pg.current.links[i].navpopup) { continue; }&lt;br /&gt;
		(nullify || banish) &amp;amp;&amp;amp; pg.current.links[i].navpopup.banish();&lt;br /&gt;
		pg.current.links[i].simpleNoMore=false;&lt;br /&gt;
		nullify &amp;amp;&amp;amp; (pg.current.links[i].navpopup=null);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function disablePopups(){&lt;br /&gt;
	processAllPopups(false, true);&lt;br /&gt;
	setupTooltips(null, true);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function togglePreviews() {&lt;br /&gt;
	processAllPopups(true, true);&lt;br /&gt;
	pg.option.simplePopups=!pg.option.simplePopups;&lt;br /&gt;
	abortAllDownloads();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function magicHistoryLink(l) {&lt;br /&gt;
	// FIXME use onclick change href trick to sort this out instead of window.open&lt;br /&gt;
 &lt;br /&gt;
	var jsUrl='', title='';&lt;br /&gt;
	switch(l.id) {&lt;br /&gt;
	case 'lastContrib':&lt;br /&gt;
		jsUrl=simplePrintf('javascript:getLastContrib(\'%s\',%s)',&lt;br /&gt;
			[l.article.toString(true).split(&amp;quot;'&amp;quot;).join(&amp;quot;\\'&amp;quot;), l.newWin]);&lt;br /&gt;
		title=popupString('lastContribHint');&lt;br /&gt;
		break;&lt;br /&gt;
	case 'sinceMe':&lt;br /&gt;
		jsUrl=simplePrintf('javascript:getDiffSinceMyEdit(\'%s\',%s)',&lt;br /&gt;
			[l.article.toString(true).split(&amp;quot;'&amp;quot;).join(&amp;quot;\\'&amp;quot;), l.newWin]);&lt;br /&gt;
		title=popupString('sinceMeHint');&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	return generalNavLink({url: jsUrl, newWin: false, // can't have new windows with JS links, I think&lt;br /&gt;
				title: title, text: l.text, noPopup: l.noPopup});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function popupMenuLink(l) {&lt;br /&gt;
	var jsUrl=simplePrintf('javascript:%s()', [l.id]);&lt;br /&gt;
	var title=popupString(simplePrintf('%sHint', [l.id]));&lt;br /&gt;
	return generalNavLink({url: jsUrl, newWin:false, title:title, text:l.text, noPopup:l.noPopup});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function specialLink(l) {&lt;br /&gt;
	// properties: article, specialpage, text, sep&lt;br /&gt;
	if (typeof l.specialpage=='undefined'||!l.specialpage) return null;&lt;br /&gt;
	var base = pg.wiki.titlebase +  pg.ns.special+':'+l.specialpage;&lt;br /&gt;
	if (typeof l.sep == 'undefined' || l.sep===null) l.sep='&amp;amp;target=';&lt;br /&gt;
	var article=l.article.urlString({keepSpaces: l.specialpage=='Search'});&lt;br /&gt;
	var hint=popupString(l.specialpage+'Hint');&lt;br /&gt;
	switch (l.specialpage) {&lt;br /&gt;
	case 'Log':&lt;br /&gt;
	    switch (l.sep) {&lt;br /&gt;
	    case '&amp;amp;user=': hint=popupString('userLogHint'); break;&lt;br /&gt;
	    case '&amp;amp;type=block&amp;amp;page=': hint=popupString('blockLogHint'); break;&lt;br /&gt;
	    case '&amp;amp;page=': hint=popupString('pageLogHint'); break;&lt;br /&gt;
	    case '&amp;amp;type=protect&amp;amp;page=': hint=popupString('protectLogHint'); break;&lt;br /&gt;
	    case '&amp;amp;type=delete&amp;amp;page=': hint=popupString('deleteLogHint'); break;&lt;br /&gt;
	    default: log('Unknown log type, sep=' + l.sep); hint='Missing hint (FIXME)';&lt;br /&gt;
	    }&lt;br /&gt;
	    break;&lt;br /&gt;
	case 'PrefixIndex': article += '/'; break;&lt;br /&gt;
	}&lt;br /&gt;
	if (hint) hint = simplePrintf(hint, [safeDecodeURI(l.article)]);&lt;br /&gt;
	else hint = safeDecodeURI(l.specialpage+':'+l.article) ;&lt;br /&gt;
 &lt;br /&gt;
	var url = base + l.sep + article;&lt;br /&gt;
	return generalNavLink({url: url, title: hint, text: l.text, newWin:l.newWin, noPopup:l.noPopup});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function generalLink(l) {&lt;br /&gt;
	// l.url, l.text, l.title, l.newWin, l.className, l.noPopup&lt;br /&gt;
	if (typeof l.url=='undefined') return null;&lt;br /&gt;
 &lt;br /&gt;
	// only quotation marks in the url can screw us up now... I think&lt;br /&gt;
	var url=l.url.split('&amp;quot;').join('%22');&lt;br /&gt;
 &lt;br /&gt;
	var ret='&amp;lt;a href=&amp;quot;' + url + '&amp;quot;';&lt;br /&gt;
	if (typeof l.title!='undefined' &amp;amp;&amp;amp; l.title) { ret += ' title=&amp;quot;' + l.title + '&amp;quot;'; }&lt;br /&gt;
	if (l.noPopup) { ret += ' noPopup=1'; }&lt;br /&gt;
	var newWin;&lt;br /&gt;
	if (typeof l.newWin=='undefined' || l.newWin===null) { newWin=getValueOf('popupNewWindows'); }&lt;br /&gt;
	else { newWin=l.newWin; }&lt;br /&gt;
	if (newWin) { ret += ' target=&amp;quot;_blank&amp;quot;'; }&lt;br /&gt;
	if (typeof l.className!='undefined'&amp;amp;&amp;amp;l.className) { ret+=' class=&amp;quot;'+l.className+'&amp;quot;'; }&lt;br /&gt;
	ret += '&amp;gt;';&lt;br /&gt;
	if (typeof l.text==typeof '') { ret+= l.text; }&lt;br /&gt;
	ret +='&amp;lt;/a&amp;gt;';&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function appendParamsToLink(linkstr, params) {&lt;br /&gt;
	var sp=linkstr.parenSplit(RegExp('(href=&amp;quot;[^&amp;quot;]+?)&amp;quot;', 'i'));&lt;br /&gt;
	if (sp.length&amp;lt;2) return null;&lt;br /&gt;
	var ret=sp.shift() + sp.shift();&lt;br /&gt;
	ret += '&amp;amp;' + params + '&amp;quot;';&lt;br /&gt;
	ret += sp.join('');&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function changeLinkTargetLink(x) { // newTarget, text, hint, summary, clickButton, minor, title (optional) {&lt;br /&gt;
	if (x.newTarget) {&lt;br /&gt;
		log ('changeLinkTargetLink: newTarget=' + x.newTarget);&lt;br /&gt;
	}&lt;br /&gt;
	// optional: oldTarget (in wikitext)&lt;br /&gt;
	// if x.newTarget omitted or null, remove the link&lt;br /&gt;
 &lt;br /&gt;
	//x.text=encodeURI(x.text);  // this buggers things up on zh.wikipedia.org and doesn't seem necessary&lt;br /&gt;
	x.clickButton=encodeURI(x.clickButton);&lt;br /&gt;
 &lt;br /&gt;
	// FIXME: first character of page title as well as namespace should be case insensitive&lt;br /&gt;
	// eg [[category:foo]] and [[Category:Foo]] are equivalent&lt;br /&gt;
	// this'll break if charAt(0) is nasty&lt;br /&gt;
	var cA=literalizeRegex(x.oldTarget);&lt;br /&gt;
	var chs=cA.charAt(0).toUpperCase();&lt;br /&gt;
	chs='['+chs + chs.toLowerCase()+']';&lt;br /&gt;
	var currentArticleRegexBit=encodeURIComponent(chs+cA.substring(1));&lt;br /&gt;
	currentArticleRegexBit=currentArticleRegexBit&lt;br /&gt;
		.split(RegExp('[_ ]+', 'g')).join('[_ ]+')&lt;br /&gt;
		.split( &amp;quot;%20&amp;quot; ).join('[_ ]+')&lt;br /&gt;
		.split('\\(').join('(?:%2528|\\()')&lt;br /&gt;
		.split('\\)').join('(?:%2529|\\))');&lt;br /&gt;
	// leading and trailing space should be ignored, and anchor bits optional:&lt;br /&gt;
	currentArticleRegexBit = '\\s*(' + currentArticleRegexBit + '(?:#[^\\[\\|]*)?)\\s*';&lt;br /&gt;
	// e.g. Computer (archaic) -&amp;gt; \s*([Cc]omputer[_ ](?:%2528|\()archaic(?:%2528|\)))\s*&lt;br /&gt;
 &lt;br /&gt;
	// autoedit=s~\[\[([Cc]ad)\]\]~[[Computer-aided%20design|$1]]~g;s~\[\[([Cc]AD)[|]~[[Computer-aided%20design|~g&lt;br /&gt;
 &lt;br /&gt;
	var title=x.title || wgPageName.split('_').join(' ');&lt;br /&gt;
	var lk=titledWikiLink({article: new Title(title), newWin:x.newWin,&lt;br /&gt;
						action:  'edit',&lt;br /&gt;
						text:    x.text,&lt;br /&gt;
						title:   x.hint,&lt;br /&gt;
						className: 'popup_change_title_link'&lt;br /&gt;
						});&lt;br /&gt;
	var cmd='';&lt;br /&gt;
	if (x.newTarget) {&lt;br /&gt;
		// escape '&amp;amp;' and other nasties&lt;br /&gt;
		var t=encodeURIComponent(x.newTarget);&lt;br /&gt;
		var s=encodeURIComponent(literalizeRegex(x.newTarget));&lt;br /&gt;
		cmd += 's~\\[\\['+currentArticleRegexBit+'\\]\\]~[['+t+'|$1]]~g;';&lt;br /&gt;
		cmd += 's~\\[\\['+currentArticleRegexBit+'[|]~[['+t+'|~g;';&lt;br /&gt;
		cmd += 's~\\[\\['+s + '\\|' + s + '\\]\\]~[[' + t + ']]~g';&lt;br /&gt;
	} else {&lt;br /&gt;
		cmd += 's~\\[\\['+currentArticleRegexBit+'\\]\\]~$1~g;';&lt;br /&gt;
		cmd += 's~\\[\\['+currentArticleRegexBit+'[|](.*?)\\]\\]~$2~g';&lt;br /&gt;
	}&lt;br /&gt;
	cmd += '&amp;amp;autoclick='+x.clickButton + '&amp;amp;actoken=' + autoClickToken();&lt;br /&gt;
	cmd += ( x.minor == null ) ? '' : '&amp;amp;autominor='+x.minor;&lt;br /&gt;
	cmd += ( x.watch == null ) ? '' : '&amp;amp;autowatch='+x.watch;&lt;br /&gt;
	cmd += '&amp;amp;autosummary='+encodeURIComponent(x.summary);&lt;br /&gt;
	return appendParamsToLink(lk, 'autoedit='+cmd);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function redirLink(redirMatch, article) {&lt;br /&gt;
	// NB redirMatch is in wikiText&lt;br /&gt;
	var ret='';&lt;br /&gt;
 &lt;br /&gt;
	if (getValueOf('popupAppendRedirNavLinks') &amp;amp;&amp;amp; getValueOf('popupNavLinks')) {&lt;br /&gt;
		ret += '&amp;lt;hr&amp;gt;';&lt;br /&gt;
		if (getValueOf('popupFixRedirs') &amp;amp;&amp;amp; typeof autoEdit != 'undefined' &amp;amp;&amp;amp; autoEdit) {&lt;br /&gt;
			log('redirLink: newTarget=' + redirMatch);&lt;br /&gt;
			ret += addPopupShortcut(&lt;br /&gt;
				changeLinkTargetLink(&lt;br /&gt;
				{newTarget: redirMatch, text: popupString('Redirects'),&lt;br /&gt;
					hint: popupString('Fix this redirect'),&lt;br /&gt;
						summary: simplePrintf(getValueOf('popupFixRedirsSummary'),&lt;br /&gt;
								      [article.toString(), redirMatch ]),&lt;br /&gt;
						oldTarget: article.toString(),&lt;br /&gt;
						clickButton: getValueOf('popupRedirAutoClick'), minor: true,&lt;br /&gt;
						watch: getValueOf('popupWatchRedirredPages')})&lt;br /&gt;
				, 'R');&lt;br /&gt;
			ret += popupString(' to ');&lt;br /&gt;
		}&lt;br /&gt;
		else ret += popupString('Redirects') + popupString(' to ');&lt;br /&gt;
		return ret;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	else return '&amp;lt;br&amp;gt; ' + popupString('Redirects') + popupString(' to ') +&lt;br /&gt;
		     titledWikiLink({article: new Title().fromWikiText(redirMatch), action: 'view',  /* FIXME: newWin */&lt;br /&gt;
						      text: safeDecodeURI(redirMatch), title: popupString('Bypass redirect')});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function arinLink(l) {&lt;br /&gt;
	if (!saneLinkCheck(l)) { return null; }&lt;br /&gt;
	if ( ! l.article.isIpUser() || ! pg.wiki.wikimedia) return null;&lt;br /&gt;
 &lt;br /&gt;
	var uN=l.article.userName();&lt;br /&gt;
 &lt;br /&gt;
	return generalNavLink({url:'http://ws.arin.net/cgi-bin/whois.pl?queryinput=' + encodeURIComponent(uN), newWin:l.newWin,&lt;br /&gt;
				title: tprintf('Look up %s in ARIN whois database', [uN]),&lt;br /&gt;
				text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function toolDbName(cookieStyle) {&lt;br /&gt;
	var ret = wgDBname;&lt;br /&gt;
	if (!cookieStyle) { ret+= '_p'; }&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function saneLinkCheck(l) {&lt;br /&gt;
	if (typeof l.article != typeof {} || typeof l.text != typeof '') { return false; }&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
function editCounterLink(l) {&lt;br /&gt;
	if(!saneLinkCheck(l)) return null;&lt;br /&gt;
	if (! pg.wiki.wikimedia) return null;&lt;br /&gt;
	var uN=l.article.userName();&lt;br /&gt;
	var tool=getValueOf('popupEditCounterTool');&lt;br /&gt;
	var url;&lt;br /&gt;
	var soxredToolUrl='http://toolserver.org/~soxred93/count/index.php?name=$1&amp;amp;lang=$2&amp;amp;wiki=$3';&lt;br /&gt;
	var kateToolUrl='http://toolserver.org/~$3/cgi-bin/Tool1/wannabe_kate?username=$1&amp;amp;site=en.wikipedia.org&amp;amp;$2';&lt;br /&gt;
 &lt;br /&gt;
	switch(tool) {&lt;br /&gt;
	case 'custom':&lt;br /&gt;
		url=simplePrintf(getValueOf('popupEditCounterUrl'), [ encodeURIComponent(uN), toolDbName() ]);&lt;br /&gt;
		break;&lt;br /&gt;
	case 'kate':&lt;br /&gt;
	case 'interiot':&lt;br /&gt;
		url=simplePrintf(kateToolUrl, [ encodeURIComponent(uN), toolDbName(), tool ]);&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
	    var theWiki=pg.wiki.hostname.split('.');&lt;br /&gt;
		url=simplePrintf(soxredToolUrl, [ encodeURIComponent(uN), theWiki[0], theWiki[1] ]);&lt;br /&gt;
	}&lt;br /&gt;
	return generalNavLink({url:url, title: tprintf('editCounterLinkHint', [uN]),&lt;br /&gt;
				newWin:l.newWin, text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function globalSearchLink(l) {&lt;br /&gt;
	if(!saneLinkCheck(l)) return null;&lt;br /&gt;
 &lt;br /&gt;
	var base='http://vs.aka-online.de/cgi-bin/globalwpsearch.pl?timeout=120&amp;amp;search=';&lt;br /&gt;
	var article=l.article.urlString({keepSpaces:true});&lt;br /&gt;
 &lt;br /&gt;
	return generalNavLink({url:base + article, newWin:l.newWin,&lt;br /&gt;
				title: tprintf('globalSearchHint', [safeDecodeURI(l.article)]),&lt;br /&gt;
				text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function googleLink(l) {&lt;br /&gt;
	if(!saneLinkCheck(l)) return null;&lt;br /&gt;
 &lt;br /&gt;
	var base='http://www.google.com/search?q=';&lt;br /&gt;
	var article=l.article.urlString({keepSpaces:true});&lt;br /&gt;
 &lt;br /&gt;
	return generalNavLink({url:base + '%22' + article + '%22', newWin:l.newWin,&lt;br /&gt;
				title: tprintf('googleSearchHint', [safeDecodeURI(l.article)]),&lt;br /&gt;
				text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function editorListLink(l) {&lt;br /&gt;
	if(!saneLinkCheck(l)) return null;&lt;br /&gt;
	var article= l.article.articleFromTalkPage() || l.article;&lt;br /&gt;
	var base='http://toolserver.org/~tim/cgi-bin/contribution-counter?page=';&lt;br /&gt;
	return generalNavLink({url:base+article.urlString(),&lt;br /&gt;
				title: tprintf('editorListHint', [article]),&lt;br /&gt;
				newWin:l.newWin, text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function generalNavLink(l) {&lt;br /&gt;
	l.className = (l.className==null) ? 'popupNavLink' : l.className;&lt;br /&gt;
	return generalLink(l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// magic history links&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
function getHistoryInfo(wikipage, whatNext) {&lt;br /&gt;
	log('getHistoryInfo');&lt;br /&gt;
	getHistory(wikipage, whatNext ? function(d){whatNext(processHistory(d));} : processHistory);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// FIXME eliminate pg.idNumber ... how? :-(&lt;br /&gt;
 &lt;br /&gt;
function getHistory(wikipage, onComplete) {&lt;br /&gt;
	log('getHistory');&lt;br /&gt;
	if( !window.wgEnableAPI || !wgEnableAPI ) {&lt;br /&gt;
		alert( 'This function of navigation popups now requires a MediaWiki ' + &lt;br /&gt;
			'installation with the API enabled.');&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	var url = pg.wiki.apiwikibase + '?format=json&amp;amp;action=query&amp;amp;prop=revisions&amp;amp;titles=' +&lt;br /&gt;
			new Title(wikipage).urlString() + '&amp;amp;rvlimit=' + getValueOf('popupHistoryLimit');&lt;br /&gt;
	log('getHistory: url='+url);&lt;br /&gt;
	return startDownload(url, pg.idNumber+'history', onComplete);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function processHistory(download) {&lt;br /&gt;
	var jsobj = getJsObj(download.data);&lt;br /&gt;
	try {&lt;br /&gt;
		window.x=jsobj;&lt;br /&gt;
		var p=jsobj['query']['pages']&lt;br /&gt;
		for (var pageid in p) {&lt;br /&gt;
			var revisions=p[pageid]['revisions'];&lt;br /&gt;
			// we only get the first one&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		log('Something went wrong with JSON business');&lt;br /&gt;
		return finishProcessHistory([]);&lt;br /&gt;
	}&lt;br /&gt;
	var edits=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;revisions.length; ++i) {&lt;br /&gt;
		edits.push({ oldid: revisions[i]['revid'], editor: revisions[i]['user'] });&lt;br /&gt;
	}&lt;br /&gt;
	log('processed ' + edits.length + ' edits');&lt;br /&gt;
	return finishProcessHistory(edits, wgUserName);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function finishProcessHistory(edits, userName) {&lt;br /&gt;
	var histInfo={};&lt;br /&gt;
 &lt;br /&gt;
	histInfo.edits=edits;&lt;br /&gt;
	histInfo.userName=userName;&lt;br /&gt;
 &lt;br /&gt;
	for (var i=0; i&amp;lt;edits.length; ++i) {&lt;br /&gt;
		if (typeof histInfo.myLastEdit == 'undefined' &amp;amp;&amp;amp; userName &amp;amp;&amp;amp; edits[i].editor==userName) {&lt;br /&gt;
			histInfo.myLastEdit={index: i, oldid: edits[i].oldid, previd: (i==0 ? null : edits[i-1].oldid)};&lt;br /&gt;
		}&lt;br /&gt;
		if (typeof histInfo.firstNewEditor == 'undefined' &amp;amp;&amp;amp; edits[i].editor != edits[0].editor) {&lt;br /&gt;
			histInfo.firstNewEditor={index:i, oldid:edits[i].oldid, previd: (i==0 ? null : edits[i-1].oldid)};&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	//pg.misc.historyInfo=histInfo;&lt;br /&gt;
	return histInfo;&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: links.js&lt;br /&gt;
// STARTFILE: options.js&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// options&lt;br /&gt;
 &lt;br /&gt;
// check for cookies and existing value, else use default&lt;br /&gt;
function defaultize(x) {&lt;br /&gt;
	var val=null;&lt;br /&gt;
	if (x!='popupCookies') {&lt;br /&gt;
		defaultize('popupCookies');&lt;br /&gt;
		if (pg.option.popupCookies &amp;amp;&amp;amp; (val=Cookie.read(x))) {&lt;br /&gt;
			pg.option[x]=val;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (pg.option[x]===null || typeof pg.option[x]=='undefined') {&lt;br /&gt;
		if (typeof window[x] != 'undefined' ) pg.option[x]=window[x];&lt;br /&gt;
		else pg.option[x]=pg.optionDefault[x];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function newOption(x, def) {&lt;br /&gt;
	pg.optionDefault[x]=def;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setDefault(x, def) {&lt;br /&gt;
	return newOption(x, def);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getValueOf(varName) {&lt;br /&gt;
	defaultize(varName);&lt;br /&gt;
	return pg.option[varName];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function useDefaultOptions() { // for testing&lt;br /&gt;
	for (var p in pg.optionDefault) {&lt;br /&gt;
		pg.option[p]=pg.optionDefault[p];&lt;br /&gt;
		if (typeof window[p]!='undefined') { delete window[p]; }&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function setOptions() {&lt;br /&gt;
	// user-settable parameters and defaults&lt;br /&gt;
	var userIsSysop = false;&lt;br /&gt;
	if ( wgUserGroups ) {&lt;br /&gt;
		for ( var g = 0; g &amp;lt; wgUserGroups.length; ++g ) {&lt;br /&gt;
			if ( wgUserGroups[g] == &amp;quot;sysop&amp;quot; )&lt;br /&gt;
				userIsSysop = true&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	// Basic options&lt;br /&gt;
	newOption('popupDelay',               0.5);&lt;br /&gt;
	newOption('popupHideDelay',           0.5);&lt;br /&gt;
	newOption('simplePopups',             false);&lt;br /&gt;
	newOption('popupStructure',           'shortmenus');   // see later - default for popupStructure is 'original' if simplePopups is true&lt;br /&gt;
	newOption('popupActionsMenu',         true);&lt;br /&gt;
	newOption('popupSetupMenu',           true);&lt;br /&gt;
	newOption('popupAdminLinks',          userIsSysop);&lt;br /&gt;
	newOption('popupShortcutKeys',        false);&lt;br /&gt;
	newOption('popupHistoricalLinks',     true);&lt;br /&gt;
	newOption('popupOnlyArticleLinks',    true);&lt;br /&gt;
	newOption('removeTitles',             true);&lt;br /&gt;
	newOption('popupMaxWidth',            350);&lt;br /&gt;
	newOption('popupInitialWidth',        false); // integer or false&lt;br /&gt;
	newOption('popupSimplifyMainLink',    true);&lt;br /&gt;
	newOption('popupAppendRedirNavLinks', true);&lt;br /&gt;
	newOption('popupTocLinks',            false);&lt;br /&gt;
	newOption('popupSubpopups',           true);&lt;br /&gt;
	newOption('popupDragHandle',          false /* 'popupTopLinks'*/);&lt;br /&gt;
	newOption('popupLazyPreviews',        true);&lt;br /&gt;
	newOption('popupLazyDownloads',       true);&lt;br /&gt;
	newOption('popupAllDabsStubs',        false);&lt;br /&gt;
	newOption('popupDebugging',           false);&lt;br /&gt;
	newOption('popupAdjustDiffDates',     true);&lt;br /&gt;
	newOption('popupActiveNavlinks',      true);&lt;br /&gt;
	newOption('popupModifier',            false); // ctrl, shift, alt or meta&lt;br /&gt;
	newOption('popupModifierAction',      'enable'); // or 'disable'&lt;br /&gt;
	newOption('popupDraggable',           true);&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	// images&lt;br /&gt;
	newOption('popupImages',                 true);&lt;br /&gt;
	newOption('imagePopupsForImages',        true);&lt;br /&gt;
	newOption('popupNeverGetThumbs',         false);&lt;br /&gt;
	//newOption('popupImagesToggleSize',       true);&lt;br /&gt;
	newOption('popupThumbAction',            'imagepage'); //'sizetoggle');&lt;br /&gt;
	newOption('popupImageSize',              60);&lt;br /&gt;
	newOption('popupImageSizeLarge',         200);&lt;br /&gt;
 &lt;br /&gt;
	// redirs, dabs, reversion&lt;br /&gt;
	newOption('popupFixRedirs',             false);&lt;br /&gt;
	newOption('popupRedirAutoClick',        'wpDiff');&lt;br /&gt;
	newOption('popupFixDabs',               false);&lt;br /&gt;
	newOption('popupRevertSummaryPrompt',   false);&lt;br /&gt;
	newOption('popupMinorReverts',          false);&lt;br /&gt;
	newOption('popupRedlinkRemoval',        false);&lt;br /&gt;
	newOption('popupWatchDisambiggedPages', null);&lt;br /&gt;
	newOption('popupWatchRedirredPages',    null);&lt;br /&gt;
	newOption('popupDabWiktionary',         'last');&lt;br /&gt;
 &lt;br /&gt;
	// navlinks&lt;br /&gt;
	newOption('popupNavLinks',          true);&lt;br /&gt;
	newOption('popupNavLinkSeparator',  ' &amp;amp;sdot; ');&lt;br /&gt;
	newOption('popupLastEditLink',      true);&lt;br /&gt;
	newOption('popupEditCounterTool',   'soxred');&lt;br /&gt;
	newOption('popupEditCounterUrl',    '');&lt;br /&gt;
	newOption('popupExtraUserMenu',     '');&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	// previews etc&lt;br /&gt;
	newOption('popupPreviews',             true);&lt;br /&gt;
	newOption('popupSummaryData',          true);&lt;br /&gt;
	newOption('popupMaxPreviewSentences',  5);&lt;br /&gt;
	newOption('popupMaxPreviewCharacters', 600);&lt;br /&gt;
	newOption('popupLastModified',         true);&lt;br /&gt;
	newOption('popupPreviewKillTemplates', true);&lt;br /&gt;
	newOption('popupPreviewRawTemplates',  true);&lt;br /&gt;
	newOption('popupPreviewFirstParOnly',  true);&lt;br /&gt;
	newOption('popupPreviewCutHeadings',   true);&lt;br /&gt;
	newOption('popupPreviewButton',        false);&lt;br /&gt;
	newOption('popupPreviewButtonEvent',   'click');&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	// diffs&lt;br /&gt;
	newOption('popupPreviewDiffs',          true);&lt;br /&gt;
	newOption('popupDiffMaxLines',          100);&lt;br /&gt;
	newOption('popupDiffContextLines',      2);&lt;br /&gt;
	newOption('popupDiffContextCharacters', 40);&lt;br /&gt;
	newOption('popupDiffDates',             true);&lt;br /&gt;
	newOption('popupDiffDatePrinter',       'toLocaleString');&lt;br /&gt;
 &lt;br /&gt;
	// edit summaries. God, these are ugly.&lt;br /&gt;
	newOption('popupFixDabsSummary',           popupString('defaultpopupFixDabsSummary') );&lt;br /&gt;
	newOption('popupExtendedRevertSummary',    popupString('defaultpopupExtendedRevertSummary') );&lt;br /&gt;
	newOption('popupTimeOffset',               null);&lt;br /&gt;
	newOption('popupRevertSummary',            popupString('defaultpopupRevertSummary') );&lt;br /&gt;
	newOption('popupRevertToPreviousSummary',  popupString('defaultpopupRevertToPreviousSummary') );&lt;br /&gt;
	newOption('popupQueriedRevertSummary',            popupString('defaultpopupQueriedRevertSummary') );&lt;br /&gt;
	newOption('popupQueriedRevertToPreviousSummary',  popupString('defaultpopupQueriedRevertToPreviousSummary') );&lt;br /&gt;
	newOption('popupFixRedirsSummary',         popupString('defaultpopupFixRedirsSummary') );&lt;br /&gt;
	newOption('popupRedlinkSummary',           popupString('defaultpopupRedlinkSummary') );&lt;br /&gt;
	newOption('popupRmDabLinkSummary',         popupString('defaultpopupRmDabLinkSummary') );&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	// misc&lt;br /&gt;
	newOption('popupCookies',             false);&lt;br /&gt;
	newOption('popupHistoryLimit',        50);&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	newOption('popupFilters',             [popupFilterStubDetect,     popupFilterDisambigDetect,&lt;br /&gt;
					       popupFilterPageSize,       popupFilterCountLinks,&lt;br /&gt;
					       popupFilterCountImages,    popupFilterCountCategories,&lt;br /&gt;
					       popupFilterLastModified]);&lt;br /&gt;
	newOption('extraPopupFilters',        []);&lt;br /&gt;
	newOption('popupOnEditSelection', 'cursor');&lt;br /&gt;
	newOption('popupPreviewHistory',      true);&lt;br /&gt;
	newOption('popupImageLinks',          true);&lt;br /&gt;
	newOption('popupCategoryMembers',     true);&lt;br /&gt;
	newOption('popupUserInfo',            true);&lt;br /&gt;
	newOption('popupHistoryPreviewLimit', 25);&lt;br /&gt;
	newOption('popupContribsPreviewLimit',25);&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	// new windows&lt;br /&gt;
	newOption('popupNewWindows',     false);&lt;br /&gt;
	newOption('popupLinksNewWindow', {'lastContrib': true, 'sinceMe': true});&lt;br /&gt;
 &lt;br /&gt;
	// regexps&lt;br /&gt;
	newOption('popupDabRegexp', '([{][{]\\s*disambig|disambig\\s*[}][}]|disamb\\s*[}][}]|dab\\s*[}][}])|[{][{]\\s*(((geo|hn|road?|school|number)dis)|[234][lc][acw]|shipindex)(\\s*[|][^}]*)?\\s*[}][}]|is a .*disambiguation.*page');&lt;br /&gt;
	newOption('popupStubRegexp', '(sect)?stub[}][}]|This .*-related article is a .*stub');&lt;br /&gt;
	newOption('popupImageVarsRegexp', 'image|image_(?:file|skyline|name|flag|seal)|cover|badge|logo');&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: options.js&lt;br /&gt;
// STARTFILE: strings.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Translatable strings&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
// See instructions at&lt;br /&gt;
// http://en.wikipedia.org/wiki/Wikipedia:Tools/Navigation_popups/Translation&lt;br /&gt;
 &lt;br /&gt;
pg.string = {&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// summary data, searching etc.&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	'article': 'article',&lt;br /&gt;
	'category': 'category',&lt;br /&gt;
	'categories': 'categories',&lt;br /&gt;
	'image': 'image',&lt;br /&gt;
	'images': 'images',&lt;br /&gt;
	'stub': 'stub',&lt;br /&gt;
	'section stub': 'section stub',&lt;br /&gt;
	'Empty page': 'Empty page',&lt;br /&gt;
	'kB': 'kB',&lt;br /&gt;
	'bytes': 'bytes',&lt;br /&gt;
	'day': 'day',&lt;br /&gt;
	'days': 'days',&lt;br /&gt;
	'hour': 'hour',&lt;br /&gt;
	'hours': 'hours',&lt;br /&gt;
	'minute': 'minute',&lt;br /&gt;
	'minutes': 'minutes',&lt;br /&gt;
	'second': 'second',&lt;br /&gt;
	'seconds': 'seconds',&lt;br /&gt;
	'week': 'week',&lt;br /&gt;
	'weeks': 'weeks',&lt;br /&gt;
	'search': 'search',&lt;br /&gt;
	'SearchHint': 'Find English Wikipedia articles containing %s',&lt;br /&gt;
	'web': 'web',&lt;br /&gt;
	'global': 'global',&lt;br /&gt;
	'globalSearchHint': 'Search across Wikipedias in different languages for %s',&lt;br /&gt;
	'googleSearchHint': 'Google for %s',&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// article-related actions and info&lt;br /&gt;
	// (some actions also apply to user pages)&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	'actions': 'actions',         ///// view articles and view talk&lt;br /&gt;
	'popupsMenu': 'popups',&lt;br /&gt;
	'togglePreviewsHint': 'Toggle preview generation in popups on this page',&lt;br /&gt;
	'enable previews': 'enable previews',&lt;br /&gt;
	'disable preview': 'disable previews',&lt;br /&gt;
	'toggle previews': 'toggle previews',&lt;br /&gt;
	'show preview': 'show preview',&lt;br /&gt;
	'reset': 'reset',&lt;br /&gt;
	'more...': 'more...',&lt;br /&gt;
	'disable': 'disable popups',&lt;br /&gt;
	'disablePopupsHint': 'Disable popups on this page. Reload page to re-enable.',&lt;br /&gt;
	'historyfeedHint': 'RSS feed of recent changes to this page',&lt;br /&gt;
	'purgePopupsHint': 'Reset popups, clearing all cached popup data.',&lt;br /&gt;
	'PopupsHint': 'Reset popups, clearing all cached popup data.',&lt;br /&gt;
	'spacebar': 'space',&lt;br /&gt;
	'view': 'view',&lt;br /&gt;
	'view article': 'view article',&lt;br /&gt;
	'viewHint': 'Go to %s',&lt;br /&gt;
	'talk': 'talk',&lt;br /&gt;
	'talk page': 'talk page',&lt;br /&gt;
	'this&amp;amp;nbsp;revision': 'this&amp;amp;nbsp;revision',&lt;br /&gt;
	'revision %s of %s': 'revision %s of %s',&lt;br /&gt;
	'Revision %s of %s': 'Revision %s of %s',&lt;br /&gt;
	'the revision prior to revision %s of %s': 'the revision prior to revision %s of %s',&lt;br /&gt;
	'Toggle image size': 'Click to toggle image size',&lt;br /&gt;
	'del': 'del',                 ///// delete, protect, move&lt;br /&gt;
	'delete': 'delete',&lt;br /&gt;
	'deleteHint': 'Delete %s',&lt;br /&gt;
	'undeleteShort': 'un',&lt;br /&gt;
	'UndeleteHint': 'Show the deletion history for %s',&lt;br /&gt;
	'protect': 'protect',&lt;br /&gt;
	'protectHint': 'Restrict editing rights to %s',&lt;br /&gt;
	'unprotectShort': 'un',&lt;br /&gt;
	'unprotectHint': 'Allow %s to be edited by anyone again',&lt;br /&gt;
	'move': 'move',&lt;br /&gt;
	'move page': 'move page',&lt;br /&gt;
	'MovepageHint': 'Change the title of %s',&lt;br /&gt;
	'edit': 'edit',               ///// edit articles and talk&lt;br /&gt;
	'edit article': 'edit article',&lt;br /&gt;
	'editHint': 'Change the content of %s',&lt;br /&gt;
	'edit talk': 'edit talk',&lt;br /&gt;
	'new': 'new',&lt;br /&gt;
	'new topic': 'new topic',&lt;br /&gt;
	'newSectionHint': 'Start a new section on %s',&lt;br /&gt;
	'null edit': 'null edit',&lt;br /&gt;
	'nullEditHint': 'Submit an edit to %s, making no changes ',&lt;br /&gt;
	'hist': 'hist',               ///// history, diffs, editors, related&lt;br /&gt;
	'history': 'history',&lt;br /&gt;
	'historyHint': 'List the changes made to %s',&lt;br /&gt;
	'last': 'last',&lt;br /&gt;
	'lastEdit': 'lastEdit',&lt;br /&gt;
	'mark patrolled': 'mark patrolled',&lt;br /&gt;
	'markpatrolledHint': 'Mark this edit as patrolled',&lt;br /&gt;
	'show last edit': 'most recent edit',&lt;br /&gt;
	'Show the last edit': 'Show the effects of the most recent change',&lt;br /&gt;
	'lastContrib': 'lastContrib',&lt;br /&gt;
	'last set of edits': 'latest edits',&lt;br /&gt;
	'lastContribHint': 'Show the net effect of changes made by the last editor',&lt;br /&gt;
	'cur': 'cur',&lt;br /&gt;
	'diffCur': 'diffCur',&lt;br /&gt;
	'Show changes since revision %s': 'Show changes since revision %s',&lt;br /&gt;
	'%s old': '%s old', // as in 4 weeks old&lt;br /&gt;
	'oldEdit': 'oldEdit',&lt;br /&gt;
	'purge': 'purge',&lt;br /&gt;
	'purgeHint': 'Demand a fresh copy of %s',&lt;br /&gt;
	'raw': 'source',&lt;br /&gt;
	'rawHint': 'Download the source of %s',&lt;br /&gt;
	'render': 'simple',&lt;br /&gt;
	'renderHint': 'Show a plain HTML version of %s',&lt;br /&gt;
	'Show the edit made to get revision': 'Show the edit made to get revision',&lt;br /&gt;
	'sinceMe': 'sinceMe',&lt;br /&gt;
	'changes since mine': 'diff my edit',&lt;br /&gt;
	'sinceMeHint': 'Show changes since my last edit',&lt;br /&gt;
	'Couldn\'t find an edit by %s\nin the last %s edits to\n%s': 'Couldn\'t find an edit by %s\nin the last %s edits to\n%s',&lt;br /&gt;
	'eds': 'eds',&lt;br /&gt;
	'editors': 'editors',&lt;br /&gt;
	'editorListHint': 'List the users who have edited %s',&lt;br /&gt;
	'related': 'related',&lt;br /&gt;
	'relatedChanges': 'relatedChanges',&lt;br /&gt;
	'related changes': 'related changes',&lt;br /&gt;
	'RecentchangeslinkedHint': 'Show changes in articles related to %s',&lt;br /&gt;
	'editOld': 'editOld',          ///// edit old version, or revert&lt;br /&gt;
	'rv': 'rv',&lt;br /&gt;
	'revert': 'revert',&lt;br /&gt;
	'revertHint': 'Revert to %s',&lt;br /&gt;
	'defaultpopupRedlinkSummary': 'Removing link to empty page [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]',&lt;br /&gt;
	'defaultpopupFixDabsSummary': 'Disambiguate [[%s]] to [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]',&lt;br /&gt;
	'defaultpopupFixRedirsSummary': 'Redirect bypass from [[%s]] to [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]',&lt;br /&gt;
	'defaultpopupExtendedRevertSummary': 'Revert to revision dated %s by %s, oldid %s using [[:en:Wikipedia:Tools/Navigation_popups|popups]]',&lt;br /&gt;
	'defaultpopupRevertToPreviousSummary': 'Revert to the revision prior to revision %s using [[:en:Wikipedia:Tools/Navigation_popups|popups]]',&lt;br /&gt;
	'defaultpopupRevertSummary': 'Revert to revision %s using [[:en:Wikipedia:Tools/Navigation_popups|popups]]',&lt;br /&gt;
	'defaultpopupQueriedRevertToPreviousSummary': 'Revert to the revision prior to revision $1 dated $2 by $3 using [[:en:Wikipedia:Tools/Navigation_popups|popups]]',&lt;br /&gt;
	'defaultpopupQueriedRevertSummary': 'Revert to revision $1 dated $2 by $3 using [[:en:Wikipedia:Tools/Navigation_popups|popups]]',&lt;br /&gt;
	'defaultpopupRmDabLinkSummary': 'Remove link to dab page [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]',&lt;br /&gt;
	'Redirects': 'Redirects', // as in Redirects to ...&lt;br /&gt;
	' to ': ' to ',           // as in Redirects to ...&lt;br /&gt;
	'Bypass redirect': 'Bypass redirect',&lt;br /&gt;
	'Fix this redirect': 'Fix this redirect',&lt;br /&gt;
	'disambig': 'disambig',          ///// add or remove dab etc.&lt;br /&gt;
	'disambigHint': 'Disambiguate this link to [[%s]]',&lt;br /&gt;
	'Click to disambiguate this link to:': 'Click to disambiguate this link to:',&lt;br /&gt;
	'remove this link': 'remove this link',&lt;br /&gt;
	'remove all links to this page from this article': 'remove all links to this page from this article',&lt;br /&gt;
	'remove all links to this disambig page from this article': 'remove all links to this disambig page from this article',&lt;br /&gt;
	'mainlink': 'mainlink',          ///// links, watch, unwatch&lt;br /&gt;
	'wikiLink': 'wikiLink',&lt;br /&gt;
	'wikiLinks': 'wikiLinks',&lt;br /&gt;
	'links here': 'links here',&lt;br /&gt;
	'whatLinksHere': 'whatLinksHere',&lt;br /&gt;
	'what links here': 'what links here',&lt;br /&gt;
	'WhatlinkshereHint': 'List the pages that are hyperlinked to %s',&lt;br /&gt;
	'unwatchShort': 'un',&lt;br /&gt;
	'watchThingy': 'watch',  // called watchThingy because {}.watch is a function&lt;br /&gt;
	'watchHint': 'Add %s to my watchlist',&lt;br /&gt;
	'unwatchHint': 'Remove %s from my watchlist',&lt;br /&gt;
	'Only found one editor: %s made %s edits': 'Only found one editor: %s made %s edits',&lt;br /&gt;
	'%s seems to be the last editor to the page %s': '%s seems to be the last editor to the page %s',&lt;br /&gt;
	'rss': 'rss',&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// diff previews&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	'Diff truncated for performance reasons': 'Diff truncated for performance reasons',&lt;br /&gt;
	'Old revision': 'Old revision',&lt;br /&gt;
	'New revision': 'New revision',&lt;br /&gt;
	'Something went wrong :-(': 'Something went wrong :-(',&lt;br /&gt;
	'Empty revision, maybe non-existent': 'Empty revision, maybe non-existent',&lt;br /&gt;
	'Unknown date': 'Unknown date',&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// other special previews&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	'Empty category': 'Empty category',&lt;br /&gt;
	'Category members (%s shown)': 'Category members (%s shown)',&lt;br /&gt;
	'No image links found': 'No image links found',&lt;br /&gt;
	'File links': 'File links',&lt;br /&gt;
	'No image found': 'No image found',&lt;br /&gt;
	'Image from Commons': 'Image from Commons',&lt;br /&gt;
	'Description page': 'Description page',&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// user-related actions and info&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	'user': 'user',               ///// user page, talk, email, space&lt;br /&gt;
	'user&amp;amp;nbsp;page': 'user&amp;amp;nbsp;page',&lt;br /&gt;
	'user talk': 'user talk',&lt;br /&gt;
	'edit user talk': 'edit user talk',&lt;br /&gt;
	'leave comment': 'leave comment',&lt;br /&gt;
	'email': 'email',&lt;br /&gt;
	'email user': 'email user',&lt;br /&gt;
	'EmailuserHint': 'Send an email to %s',&lt;br /&gt;
	'space': 'space', // short form for userSpace link&lt;br /&gt;
	'PrefixIndexHint': 'Show pages in the userspace of %s',&lt;br /&gt;
	'count': 'count',             ///// contributions, log&lt;br /&gt;
	'edit counter': 'edit counter',&lt;br /&gt;
	'editCounterLinkHint': 'Count the contributions made by %s',&lt;br /&gt;
	'contribs': 'contribs',&lt;br /&gt;
	'contributions': 'contributions',&lt;br /&gt;
	'deletedContribs': 'deleted contributions',&lt;br /&gt;
	'DeletedcontributionsHint': 'List deleted edits made by %s',&lt;br /&gt;
	'ContributionsHint': 'List the contributions made by %s',&lt;br /&gt;
	'log': 'log',&lt;br /&gt;
	'user log': 'user log',&lt;br /&gt;
	'userLogHint': 'Show %s\'s user log',&lt;br /&gt;
	'arin': 'ARIN lookup',             ///// ARIN lookup, block user or IP&lt;br /&gt;
	'Look up %s in ARIN whois database': 'Look up %s in the ARIN whois database',&lt;br /&gt;
	'unblockShort': 'un',&lt;br /&gt;
	'block': 'block',&lt;br /&gt;
	'block user': 'block user',&lt;br /&gt;
	'IpblocklistHint': 'Unblock %s',&lt;br /&gt;
	'BlockipHint': 'Prevent %s from editing',&lt;br /&gt;
	'block log': 'block log',&lt;br /&gt;
	'blockLogHint': 'Show the block log for %s',&lt;br /&gt;
	'protectLogHint': 'Show the protection log for %s',&lt;br /&gt;
	'pageLogHint': 'Show the page log for %s',&lt;br /&gt;
	'deleteLogHint': 'Show the deletion log for %s',&lt;br /&gt;
	'Invalid %s %s': 'The option %s is invalid: %s',&lt;br /&gt;
	'No backlinks found': 'No backlinks found',&lt;br /&gt;
	' and more': ' and more',&lt;br /&gt;
	'undo': 'undo',&lt;br /&gt;
	'undoHint': 'undo this edit',&lt;br /&gt;
	'Download preview data': 'Download preview data',&lt;br /&gt;
	'Invalid or IP user': 'Invalid or IP user',&lt;br /&gt;
	'Not a registered username': 'Not a registered username',&lt;br /&gt;
	'BLOCKED': 'BLOCKED',&lt;br /&gt;
	' edits since: ': ' edits since: ',&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// Autoediting&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	'Enter a non-empty edit summary or press cancel to abort': 'Enter a non-empty edit summary or press cancel to abort',&lt;br /&gt;
	'Failed to get revision information, please edit manually.\n\n': 'Failed to get revision information, please edit manually.\n\n',&lt;br /&gt;
	'The %s button has been automatically clicked. Please wait for the next page to load.': 'The %s button has been automatically clicked. Please wait for the next page to load.',&lt;br /&gt;
	'Could not find button %s. Please check the settings in your javascript file.': 'Could not find button %s. Please check the settings in your javascript file.',&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// Popups setup&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	'Open full-size image': 'Open full-size image',&lt;br /&gt;
	'zxy': 'zxy'&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function popupString(str) {&lt;br /&gt;
	if (typeof popupStrings != 'undefined' &amp;amp;&amp;amp; popupStrings &amp;amp;&amp;amp; popupStrings[str]) { return popupStrings[str]; }&lt;br /&gt;
	if (pg.string[str]) { return pg.string[str]; }&lt;br /&gt;
	return str;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function tprintf(str,subs) {&lt;br /&gt;
	if (typeof subs != typeof []) { subs = [subs]; }&lt;br /&gt;
	return simplePrintf(popupString(str), subs);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: strings.js&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Run things&lt;br /&gt;
////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
hookEvent('load', setupPopups);&lt;br /&gt;
hookEvent('load', autoEdit);&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
</feed>