<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-QQ.js</id>
	<title>MediaWiki:Gadget-QQ.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-QQ.js"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-QQ.js&amp;action=history"/>
	<updated>2026-05-30T08:20:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-QQ.js&amp;diff=475137&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-QQ.js&amp;diff=475137&amp;oldid=prev"/>
		<updated>2025-11-04T17:55:03Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:55, 4 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-QQ.js&amp;diff=475136&amp;oldid=prev</id>
		<title>wikt&gt;Fenakhay at 07:28, 20 September 2025</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-QQ.js&amp;diff=475136&amp;oldid=prev"/>
		<updated>2025-09-20T07:28:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;use strict&amp;#039;; &lt;br /&gt;
// {{documentation}} &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*jshint shadow:true, scripturl:true, undef:true, latedef:true, unused:true, loopfunc:true */&lt;br /&gt;
/*globals mw, jQuery */&lt;br /&gt;
function el(tag, child, attr, events) {&lt;br /&gt;
	var node = document.createElement(tag);&lt;br /&gt;
 &lt;br /&gt;
	if (child) {&lt;br /&gt;
		if (typeof child !== &amp;#039;object&amp;#039;)&lt;br /&gt;
			child = [child];&lt;br /&gt;
		for (var i = 0; i &amp;lt; child.length; ++i) {&lt;br /&gt;
			var ch = child[i];&lt;br /&gt;
			if ((ch === void(null)) || (ch === null))&lt;br /&gt;
				continue;&lt;br /&gt;
			else if (typeof ch !== &amp;#039;object&amp;#039;)&lt;br /&gt;
				ch = document.createTextNode(String(ch));&lt;br /&gt;
			node.appendChild(ch);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if (attr) for (var key in attr) {&lt;br /&gt;
		node.setAttribute(key, String(attr[key]));&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if (events) for (var key in events) {&lt;br /&gt;
		node.addEventListener(key, events[key], false);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	return node;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var backends = {&lt;br /&gt;
	gbooks: {&lt;br /&gt;
		name: &amp;quot;Google Books&amp;quot;,&lt;br /&gt;
		enabled: true,&lt;br /&gt;
		&lt;br /&gt;
		addResults: function (data, callback) {&lt;br /&gt;
			function makeResult(item) {&lt;br /&gt;
				var m;&lt;br /&gt;
				&lt;br /&gt;
				var texttype;&lt;br /&gt;
				if (item.volumeInfo.printType.includes(&amp;#039;BOOK&amp;#039;))&lt;br /&gt;
					texttype = &amp;quot;book&amp;quot;;&lt;br /&gt;
				else if (item.volumeInfo.printType.includes(&amp;#039;MAGAZINE&amp;#039;))&lt;br /&gt;
					texttype = &amp;quot;journal&amp;quot;&lt;br /&gt;
				else&lt;br /&gt;
					texttype = &amp;quot;text&amp;quot;;&lt;br /&gt;
				&lt;br /&gt;
				&lt;br /&gt;
				var lang;&lt;br /&gt;
				if (item.volumeInfo.language) {&lt;br /&gt;
					lang = item.volumeInfo.language.replace(&amp;#039;iw&amp;#039;, &amp;#039;he&amp;#039;); // hardcoded exceptions can be added here&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				var year, month, day;&lt;br /&gt;
				if (item.volumeInfo.publishedDate) {&lt;br /&gt;
					if (m = /(\d{4})-?(\d{2})?-?(\d{2})?/.exec(item.volumeInfo.publishedDate)) {&lt;br /&gt;
						year = m[1];&lt;br /&gt;
						month = m[2];&lt;br /&gt;
						day = m[3];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				var page;&lt;br /&gt;
				if (item.volumeInfo.previewLink) {&lt;br /&gt;
					var url = new URL(item.volumeInfo.previewLink);&lt;br /&gt;
					var pg = url.searchParams.get(&amp;quot;pg&amp;quot;);&lt;br /&gt;
					if (pg) {&lt;br /&gt;
						var m = /PA(\d+)/.exec(pg);&lt;br /&gt;
						if (m) {&lt;br /&gt;
							page = m[1];&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				var idents = {};&lt;br /&gt;
				if (item.volumeInfo.industryIdentifiers) {&lt;br /&gt;
					for (var i = 0; i &amp;lt; item.volumeInfo.industryIdentifiers.length; ++i) {&lt;br /&gt;
						var ident = item.volumeInfo.industryIdentifiers[i];&lt;br /&gt;
						idents[ident.type] = ident.identifier;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				var isbn = idents.ISBN_13 || idents.ISBN_10;&lt;br /&gt;
				&lt;br /&gt;
				return {&lt;br /&gt;
					generateCitation: function () {&lt;br /&gt;
						var result = &amp;quot;* {{quote-&amp;quot;;&lt;br /&gt;
						&lt;br /&gt;
						result += texttype;&lt;br /&gt;
						&lt;br /&gt;
						if (lang)&lt;br /&gt;
							result += &amp;quot;|&amp;quot; + lang;&lt;br /&gt;
						&lt;br /&gt;
						if (month &amp;amp;&amp;amp; day)&lt;br /&gt;
							result += &amp;quot;|date=&amp;quot; + year + &amp;quot;-&amp;quot; + month + &amp;quot;-&amp;quot; + day;&lt;br /&gt;
						else if (month)&lt;br /&gt;
							result += &amp;quot;|year=&amp;quot; + year + &amp;quot;|month=&amp;quot; + month;&lt;br /&gt;
						else if (year)&lt;br /&gt;
							result += &amp;quot;|year=&amp;quot; + year;&lt;br /&gt;
						&lt;br /&gt;
						if (item.volumeInfo.authors) {&lt;br /&gt;
							result += &amp;quot;|author=&amp;quot; + item.volumeInfo.authors[0];&lt;br /&gt;
							&lt;br /&gt;
							if (item.volumeInfo.authors.length &amp;gt; 1) {&lt;br /&gt;
								for (var i = 1; i &amp;lt; item.volumeInfo.authors.length; i++) {&lt;br /&gt;
									var n = i + 1;&lt;br /&gt;
									result += &amp;quot;|author&amp;quot; + n + &amp;quot;=&amp;quot; + item.volumeInfo.authors[i];&lt;br /&gt;
								}&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
						if (item.volumeInfo.title) {&lt;br /&gt;
							result += &amp;quot;|title=&amp;quot; + item.volumeInfo.title;&lt;br /&gt;
							if (item.volumeInfo.subtitle)&lt;br /&gt;
								result += &amp;quot;: &amp;quot; + item.volumeInfo.subtitle;&lt;br /&gt;
						}&lt;br /&gt;
						&lt;br /&gt;
						if (item.volumeInfo.publisher)&lt;br /&gt;
							result += &amp;quot;|publisher=&amp;quot; + item.volumeInfo.publisher;&lt;br /&gt;
							&lt;br /&gt;
						if (isbn)&lt;br /&gt;
							result += &amp;quot;|isbn=&amp;quot; + isbn;&lt;br /&gt;
							&lt;br /&gt;
						if (page)&lt;br /&gt;
							result += &amp;quot;|page=&amp;quot; + page;&lt;br /&gt;
						&lt;br /&gt;
						if (item.searchInfo &amp;amp;&amp;amp; item.searchInfo.textSnippet) {&lt;br /&gt;
							var text = item.searchInfo.textSnippet.replace(/&amp;lt;.*?&amp;gt;/g, &amp;#039;&amp;#039;)&lt;br /&gt;
							.replace(/\n/g, &amp;quot; &amp;quot;)&lt;br /&gt;
							.replace(/&amp;amp;nbsp;\.\.\./g, &amp;quot;{{nb...}}&amp;quot;)&lt;br /&gt;
							.replace(/&amp;amp;#39;/g, &amp;quot;&amp;#039;&amp;quot;)&lt;br /&gt;
							.replace(/&amp;amp;quot;/g, &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
							result += &amp;quot;\n|text=&amp;quot; + text + &amp;quot;}}\n&amp;quot;;&lt;br /&gt;
						} else {&lt;br /&gt;
							result += &amp;quot;}}\n&amp;quot;;&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
						return result;&lt;br /&gt;
					},&lt;br /&gt;
					&lt;br /&gt;
					populateNode: function (node, checkbox) {&lt;br /&gt;
						node.appendChild(el(&amp;#039;label&amp;#039;, [&lt;br /&gt;
							checkbox,&lt;br /&gt;
							year ? el(&amp;#039;strong&amp;#039;, year) : el(&amp;#039;i&amp;#039;, &amp;quot;date unknown&amp;quot;),&lt;br /&gt;
							item.volumeInfo.authors &amp;amp;&amp;amp; &amp;quot;, &amp;quot;,&lt;br /&gt;
							item.volumeInfo.authors &amp;amp;&amp;amp; item.volumeInfo.authors.join(&amp;quot;, &amp;quot;),&lt;br /&gt;
							&amp;quot;, &amp;quot;,&lt;br /&gt;
							el(&amp;#039;cite&amp;#039;, [&lt;br /&gt;
								item.volumeInfo.title,&lt;br /&gt;
								item.volumeInfo.subtitle &amp;amp;&amp;amp; el(&amp;#039;small&amp;#039;, [&amp;quot;: &amp;quot;, item.volumeInfo.subtitle])&lt;br /&gt;
							]),&lt;br /&gt;
						]));&lt;br /&gt;
&lt;br /&gt;
						node.appendChild(el(&amp;#039;span&amp;#039;, [&lt;br /&gt;
							item.volumeInfo.publisher &amp;amp;&amp;amp; el(&amp;#039;span&amp;#039;, [&lt;br /&gt;
								&amp;quot;, &amp;quot;,&lt;br /&gt;
								item.volumeInfo.publisher,&lt;br /&gt;
							], { &amp;#039;class&amp;#039;: &amp;#039;publisher&amp;#039; }),&lt;br /&gt;
							isbn &amp;amp;&amp;amp; el(&amp;#039;span&amp;#039;, [&lt;br /&gt;
								&amp;quot; (&amp;quot;,&lt;br /&gt;
								el(&amp;#039;a&amp;#039;, [&amp;quot;ISBN &amp;quot; + isbn], {&lt;br /&gt;
									&amp;#039;href&amp;#039;: mw.util.getUrl(&amp;#039;Special:BookSources/&amp;#039; + isbn)&lt;br /&gt;
								}),&lt;br /&gt;
								&amp;quot;)&amp;quot;&lt;br /&gt;
							], { &amp;#039;class&amp;#039;: &amp;#039;isbn&amp;#039; }),&lt;br /&gt;
							page &amp;amp;&amp;amp; el(&amp;#039;span&amp;#039;, [&lt;br /&gt;
								&amp;quot;, page &amp;quot;,&lt;br /&gt;
								page,&lt;br /&gt;
							], { &amp;#039;class&amp;#039;: &amp;#039;page&amp;#039; }),&lt;br /&gt;
							&lt;br /&gt;
							item.volumeInfo.previewLink &amp;amp;&amp;amp; el(&amp;#039;small&amp;#039;, [&lt;br /&gt;
								&amp;quot; [&amp;quot;,&lt;br /&gt;
								el(&amp;#039;a&amp;#039;, &amp;quot;view&amp;quot;, {&lt;br /&gt;
									&amp;#039;href&amp;#039;: item.volumeInfo.previewLink&lt;br /&gt;
								}),&lt;br /&gt;
								&amp;quot;]&amp;quot;&lt;br /&gt;
							]),&lt;br /&gt;
							&lt;br /&gt;
							item.volumeInfo.infoLink &amp;amp;&amp;amp; el(&amp;#039;small&amp;#039;, [&lt;br /&gt;
								&amp;quot; [&amp;quot;,&lt;br /&gt;
								el(&amp;#039;a&amp;#039;, &amp;quot;info&amp;quot;, {&lt;br /&gt;
									&amp;#039;href&amp;#039;: item.volumeInfo.infoLink&lt;br /&gt;
								}),&lt;br /&gt;
								&amp;quot;]&amp;quot;&lt;br /&gt;
							]),&lt;br /&gt;
							&lt;br /&gt;
							el(&amp;#039;small&amp;#039;, [&lt;br /&gt;
								&amp;quot; [&amp;quot;,&lt;br /&gt;
								el(&amp;#039;a&amp;#039;, &amp;quot;raw&amp;quot;, {&lt;br /&gt;
									&amp;#039;href&amp;#039;: &amp;#039;javascript:void(0);&amp;#039;&lt;br /&gt;
								}, {&lt;br /&gt;
									&amp;#039;click&amp;#039;: function () {&lt;br /&gt;
										alert(JSON.stringify(item, null, &amp;#039;  &amp;#039;));&lt;br /&gt;
									}&lt;br /&gt;
								}),&lt;br /&gt;
								&amp;quot;]&amp;quot;&lt;br /&gt;
							])&lt;br /&gt;
						]));&lt;br /&gt;
						&lt;br /&gt;
						if (item.searchInfo &amp;amp;&amp;amp; item.searchInfo.textSnippet) {&lt;br /&gt;
							var uiQuote = el(&amp;#039;blockquote&amp;#039;);&lt;br /&gt;
							uiQuote.innerHTML = item.searchInfo.textSnippet.replace(/&amp;lt;br&amp;gt;/g, &amp;quot; &amp;quot;);&lt;br /&gt;
							node.appendChild(uiQuote);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (!data.items) {&lt;br /&gt;
				this.uiStatus.textContent = &amp;quot;no more results&amp;quot;;&lt;br /&gt;
				this.uiStatus.style.display = &amp;#039;&amp;#039;;&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			for (var i = 0; i &amp;lt; data.items.length; ++i) {&lt;br /&gt;
				if (data.items[i].searchInfo &amp;amp;&amp;amp; data.items[i].searchInfo.textSnippet) {&lt;br /&gt;
					if (!/&amp;lt;b&amp;gt;/.test(data.items[i].searchInfo.textSnippet))&lt;br /&gt;
						continue; // bogus result&lt;br /&gt;
				}&lt;br /&gt;
				callback(makeResult(data.items[i]));&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			this.uiMore.style.display = &amp;#039;&amp;#039;;&lt;br /&gt;
			this.uiStatus.textContent = &amp;quot;&amp;quot;;&lt;br /&gt;
			this.data.startIndex += data.items.length;&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		populateTab: function (tab) {&lt;br /&gt;
			var that = this;&lt;br /&gt;
&lt;br /&gt;
			this.uiResults = el(&amp;#039;ul&amp;#039;);&lt;br /&gt;
			this.uiStatus = el(&amp;#039;div&amp;#039;);&lt;br /&gt;
			this.uiMore = el(&amp;#039;a&amp;#039;, [&amp;quot;more results&amp;quot;], {&lt;br /&gt;
				&amp;#039;href&amp;#039;: &amp;#039;javascript:void(0);&amp;#039;&lt;br /&gt;
			}, {&lt;br /&gt;
				&amp;#039;click&amp;#039;: function () {&lt;br /&gt;
					that.uiStatus.textContent = &amp;quot;please wait...&amp;quot;;&lt;br /&gt;
					this.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
					jQuery.ajax({&lt;br /&gt;
						url: location.protocol + &amp;#039;//www.googleapis.com/books/v1/volumes&amp;#039;,&lt;br /&gt;
						dataType: &amp;#039;jsonp&amp;#039;,&lt;br /&gt;
						data: that.data&lt;br /&gt;
					}).done(function (data) {&lt;br /&gt;
						that.addResults(data, that.callback);&lt;br /&gt;
					});&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
			&lt;br /&gt;
			tab.appendChild(this.uiResults);&lt;br /&gt;
			tab.appendChild(this.uiStatus);&lt;br /&gt;
			tab.appendChild(this.uiMore);&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		search: function (terms, options, callback) {&lt;br /&gt;
			var that = this;&lt;br /&gt;
			while (this.uiResults.firstChild)&lt;br /&gt;
				this.uiResults.removeChild(this.uiResults.firstChild);&lt;br /&gt;
&lt;br /&gt;
			this.data = {&lt;br /&gt;
				q: terms,&lt;br /&gt;
				startIndex: 0,&lt;br /&gt;
				maxResults: 20&lt;br /&gt;
				// orderBy: &amp;#039;newest&amp;#039; // reverse chronological order; no option for plain chronological order, unforutnately&lt;br /&gt;
			};&lt;br /&gt;
			this.callback = callback;&lt;br /&gt;
			this.uiMore.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
			this.uiStatus.textContent = &amp;quot;please wait...&amp;quot;;&lt;br /&gt;
			jQuery.ajax({&lt;br /&gt;
				url: location.protocol + &amp;#039;//www.googleapis.com/books/v1/volumes&amp;#039;,&lt;br /&gt;
				dataType: &amp;#039;jsonp&amp;#039;,&lt;br /&gt;
				data: this.data&lt;br /&gt;
			}).done(function (data) {&lt;br /&gt;
				that.addResults(data, callback);&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var uiQuery, uiTitle, uiBackends, uiTabs, uiTabLabels, uiCitationsTab, uiCitations, uiCurTab, uiCurTabLabel, uiForm;&lt;br /&gt;
var uiMain = el(&amp;#039;div&amp;#039;, [&lt;br /&gt;
	uiTitle = el(&amp;#039;div&amp;#039;, [&lt;br /&gt;
		el(&amp;#039;strong&amp;#039;, &amp;quot;Quiet Quentin&amp;quot;),&lt;br /&gt;
		el(&amp;#039;a&amp;#039;, &amp;quot;hide&amp;quot;, {&lt;br /&gt;
			&amp;#039;href&amp;#039;: &amp;#039;javascript:void(0);&amp;#039;,&lt;br /&gt;
			&amp;#039;class&amp;#039;: &amp;#039;hide-link&amp;#039;&lt;br /&gt;
		}, {&lt;br /&gt;
			&amp;#039;click&amp;#039;: function () {&lt;br /&gt;
				uiMain.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
		})&lt;br /&gt;
	], { &amp;#039;class&amp;#039;: &amp;#039;title&amp;#039; }),&lt;br /&gt;
	uiForm = el(&amp;#039;form&amp;#039;, [&lt;br /&gt;
		el(&amp;#039;fieldset&amp;#039;, [&lt;br /&gt;
			el(&amp;#039;legend&amp;#039;, &amp;quot;Search for attestations&amp;quot;),&lt;br /&gt;
			uiQuery = el(&amp;#039;input&amp;#039;, null, {&lt;br /&gt;
				&amp;#039;type&amp;#039;: &amp;#039;text&amp;#039;,&lt;br /&gt;
				&amp;#039;placeholder&amp;#039;: &amp;quot;term&amp;quot;,&lt;br /&gt;
				&amp;#039;class&amp;#039;: &amp;#039;search-terms&amp;#039;,&lt;br /&gt;
				&amp;#039;value&amp;#039;: (function () {&lt;br /&gt;
					var m;&lt;br /&gt;
					if ([0, 1, 114].indexOf(mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;)) !== -1) // main, Talk, Citations&lt;br /&gt;
						return &amp;#039;&amp;quot;&amp;#039; + mw.config.get(&amp;#039;wgTitle&amp;#039;) + &amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
					if (mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) === 100)&lt;br /&gt;
						if (m = /[^/]+\/(.*)/.exec(mw.config.get(&amp;#039;wgTitle&amp;#039;)))&lt;br /&gt;
							return m[1];&lt;br /&gt;
					if (mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;#039;Search&amp;#039;)&lt;br /&gt;
						return &amp;#039;&amp;quot;&amp;#039; + document.getElementById(&amp;#039;searchText&amp;#039;).value + &amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
					return &amp;#039;&amp;#039;;&lt;br /&gt;
				})()&lt;br /&gt;
			}),&lt;br /&gt;
			el(&amp;#039;input&amp;#039;, null, {&lt;br /&gt;
				&amp;#039;type&amp;#039;: &amp;#039;submit&amp;#039;,&lt;br /&gt;
				&amp;#039;value&amp;#039;: &amp;quot;search&amp;quot;&lt;br /&gt;
			}), el(&amp;#039;br&amp;#039;),&lt;br /&gt;
			uiBackends = el(&amp;#039;div&amp;#039;, [&lt;br /&gt;
				el(&amp;#039;strong&amp;#039;, &amp;quot;Backends&amp;quot;), &amp;quot;: &amp;quot;&lt;br /&gt;
			])&lt;br /&gt;
		])&lt;br /&gt;
	], {&lt;br /&gt;
		&amp;#039;action&amp;#039;: &amp;#039;javascript:void(0);&amp;#039;&lt;br /&gt;
	}, {&lt;br /&gt;
		&amp;#039;submit&amp;#039;: function () {&lt;br /&gt;
			var hasAny = false;&lt;br /&gt;
			for (var key in backends) {&lt;br /&gt;
				hasAny = (function (backend) {&lt;br /&gt;
					if (!backend.enabled) {&lt;br /&gt;
						backend.uiTabLabel.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
						return hasAny;&lt;br /&gt;
					} else {&lt;br /&gt;
						backend.uiTabLabel.style.display = &amp;#039;&amp;#039;;&lt;br /&gt;
						if (!hasAny) {&lt;br /&gt;
							uiCurTab.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
							uiCurTabLabel.classList.remove(&amp;#039;active&amp;#039;);&lt;br /&gt;
							uiCurTab = backend.uiTab;&lt;br /&gt;
							uiCurTabLabel = backend.uiTabLabel;&lt;br /&gt;
							uiCurTab.style.display = &amp;#039;&amp;#039;;&lt;br /&gt;
							uiCurTabLabel.classList.add(&amp;#039;active&amp;#039;);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					backend.results = [];&lt;br /&gt;
&lt;br /&gt;
					if (backend.enabled) {&lt;br /&gt;
						backend.search(uiQuery.value, null, function (result) {&lt;br /&gt;
							backend.results.push(result);&lt;br /&gt;
&lt;br /&gt;
							var node = el(&amp;#039;li&amp;#039;);&lt;br /&gt;
							var checkbox = el(&amp;#039;small&amp;#039;, [&lt;br /&gt;
								&amp;quot;[&amp;quot;,&lt;br /&gt;
								el(&amp;#039;a&amp;#039;, &amp;quot;pick&amp;quot;, {&lt;br /&gt;
									&amp;#039;href&amp;#039;: &amp;#039;javascript:void(0)&amp;#039;,&lt;br /&gt;
									&amp;#039;class&amp;#039;: &amp;#039;take-link&amp;#039;&lt;br /&gt;
								}, {&lt;br /&gt;
									click: function () {&lt;br /&gt;
										if (result.taken) {&lt;br /&gt;
											result.taken = false;&lt;br /&gt;
											node.classList.remove(&amp;#039;taken&amp;#039;);&lt;br /&gt;
										} else {&lt;br /&gt;
											result.taken = true;&lt;br /&gt;
											node.classList.add(&amp;#039;taken&amp;#039;);&lt;br /&gt;
										}&lt;br /&gt;
									}&lt;br /&gt;
								}),&lt;br /&gt;
								&amp;quot; | &amp;quot;,&lt;br /&gt;
								el(&amp;#039;a&amp;#039;, &amp;quot;collapse&amp;quot;, { &amp;#039;href&amp;#039;: &amp;#039;javascript:void(0)&amp;#039; }, {&lt;br /&gt;
									click: function () {&lt;br /&gt;
										node.classList.toggle(&amp;#039;struck&amp;#039;);&lt;br /&gt;
									}&lt;br /&gt;
								}),&lt;br /&gt;
								&amp;quot;] &amp;quot;&lt;br /&gt;
							]);&lt;br /&gt;
							result.populateNode(node, checkbox);&lt;br /&gt;
							backend.uiResults.appendChild(node);&lt;br /&gt;
						});&lt;br /&gt;
						&lt;br /&gt;
						return true;&lt;br /&gt;
					}&lt;br /&gt;
				})(backends[key]);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (hasAny) {&lt;br /&gt;
				uiTabs.style.display = &amp;#039;&amp;#039;;&lt;br /&gt;
				uiTabLabels.style.display = &amp;#039;&amp;#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				alert(&amp;quot;No backends chosen&amp;quot;);&lt;br /&gt;
				uiTabs.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
				uiTabLabels.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}),&lt;br /&gt;
	uiTabLabels = el(&amp;#039;ul&amp;#039;, null, {&lt;br /&gt;
		&amp;#039;class&amp;#039;: &amp;#039;tab-labels&amp;#039;,&lt;br /&gt;
		&amp;#039;style&amp;#039;: &amp;#039;display: none;&amp;#039;&lt;br /&gt;
	}),&lt;br /&gt;
	uiTabs = el(&amp;#039;div&amp;#039;, null, {&lt;br /&gt;
		&amp;#039;class&amp;#039;: &amp;#039;tabs&amp;#039;,&lt;br /&gt;
		&amp;#039;style&amp;#039;: &amp;#039;display: none;&amp;#039;&lt;br /&gt;
	})&lt;br /&gt;
], {&lt;br /&gt;
	&amp;#039;class&amp;#039;: &amp;#039;kephir-qq&amp;#039;,&lt;br /&gt;
	&amp;#039;style&amp;#039;: &amp;#039;display: none; position: fixed;&amp;#039;&lt;br /&gt;
});&lt;br /&gt;
jQuery(uiMain).draggable({&lt;br /&gt;
	handle: uiTitle&lt;br /&gt;
}).resizable({&lt;br /&gt;
	alsoResize: uiTabs&lt;br /&gt;
});&lt;br /&gt;
document.body.appendChild(uiMain);&lt;br /&gt;
&lt;br /&gt;
var positions = JSON.parse(localStorage.QQ_positions || &amp;quot;{}&amp;quot;);&lt;br /&gt;
var size = JSON.parse(localStorage.QQ_size || &amp;quot;{}&amp;quot;);&lt;br /&gt;
$(function () {&lt;br /&gt;
    var d = $(&amp;quot;.kephir-qq&amp;quot;).attr(&amp;quot;id&amp;quot;, function (i) {&lt;br /&gt;
        return &amp;quot;draggable_&amp;quot; + i&lt;br /&gt;
    })&lt;br /&gt;
    $.each(positions, function (id, pos) {&lt;br /&gt;
        $(&amp;quot;#&amp;quot; + id).css(pos)&lt;br /&gt;
    })&lt;br /&gt;
    $.each(size, function (id, siz) {&lt;br /&gt;
        $(&amp;quot;#&amp;quot; + id).css(siz)&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    d.draggable({&lt;br /&gt;
        stop: function (event, ui) {&lt;br /&gt;
            positions[this.id] = ui.position&lt;br /&gt;
            localStorage.QQ_positions = JSON.stringify(positions)&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
    d.resizable({&lt;br /&gt;
        stop: function (event, ui) {&lt;br /&gt;
            size[this.id] = ui.size&lt;br /&gt;
            localStorage.QQ_size = JSON.stringify(size)&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var uiCitationsHash;&lt;br /&gt;
&lt;br /&gt;
function regenerateCitations() {&lt;br /&gt;
	var result = [];&lt;br /&gt;
&lt;br /&gt;
	for (var key in backends) {&lt;br /&gt;
		var results = backends[key].results;&lt;br /&gt;
		for (var j = 0; j &amp;lt; results.length; ++j) {&lt;br /&gt;
			if (results[j].taken)&lt;br /&gt;
				result.push(results[j].generateCitation());&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	result = result.join(&amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if (uiCitationsHash.checked) {&lt;br /&gt;
		result = result.replace(/^\*/mg, &amp;#039;#*&amp;#039;).replace(/#*$/, &amp;#039;&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	uiCitations.value = result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uiTabs.appendChild(uiCurTab = uiCitationsTab = el(&amp;#039;div&amp;#039;, [&lt;br /&gt;
	uiCitations = el(&amp;#039;textarea&amp;#039;, null, {&lt;br /&gt;
		&amp;#039;rows&amp;#039;: 20,&lt;br /&gt;
		&amp;#039;cols&amp;#039;: 80&lt;br /&gt;
	}), el(&amp;#039;br&amp;#039;),&lt;br /&gt;
	el(&amp;#039;label&amp;#039;, [&lt;br /&gt;
		uiCitationsHash = el(&amp;#039;input&amp;#039;, null, { &amp;#039;type&amp;#039;: &amp;#039;checkbox&amp;#039; }, {&lt;br /&gt;
			&amp;#039;change&amp;#039;: function () {&lt;br /&gt;
				regenerateCitations();&lt;br /&gt;
			}&lt;br /&gt;
		}),&lt;br /&gt;
		&amp;quot;Put # before each line&amp;quot;&lt;br /&gt;
	])&lt;br /&gt;
], { &amp;#039;style&amp;#039;: &amp;#039;display: none&amp;#039; }));&lt;br /&gt;
&lt;br /&gt;
uiTabLabels.appendChild(uiCurTabLabel = el(&amp;#039;li&amp;#039;, [&lt;br /&gt;
	el(&amp;#039;a&amp;#039;, &amp;quot;Picked citations&amp;quot;, {&lt;br /&gt;
		&amp;#039;href&amp;#039;: &amp;#039;javascript:void(0);&amp;#039;&lt;br /&gt;
	}, {&lt;br /&gt;
		&amp;#039;click&amp;#039;: function () {&lt;br /&gt;
			regenerateCitations();&lt;br /&gt;
			&lt;br /&gt;
			uiCurTab.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
			uiCurTabLabel.classList.remove(&amp;#039;active&amp;#039;);&lt;br /&gt;
			uiCurTab = uiCitationsTab;&lt;br /&gt;
			uiCurTabLabel = this;&lt;br /&gt;
			uiCurTab.style.display = &amp;#039;&amp;#039;;&lt;br /&gt;
			uiCurTabLabel.classList.add(&amp;#039;active&amp;#039;);&lt;br /&gt;
		}	&lt;br /&gt;
	})&lt;br /&gt;
], { &amp;#039;class&amp;#039;: &amp;#039;citations-tab&amp;#039; }));&lt;br /&gt;
&lt;br /&gt;
for (var key in backends) {&lt;br /&gt;
	(function (backend) {&lt;br /&gt;
		uiBackends.appendChild(el(&amp;#039;label&amp;#039;, [&lt;br /&gt;
			el(&amp;#039;input&amp;#039;, null, {&lt;br /&gt;
				&amp;#039;type&amp;#039;: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
				&amp;#039;checked&amp;#039;: backend.enabled ? &amp;#039;checked&amp;#039; : &amp;#039;&amp;#039;&lt;br /&gt;
			}, {&lt;br /&gt;
				&amp;#039;change&amp;#039;: function () {&lt;br /&gt;
					backend.enabled = this.checked;&lt;br /&gt;
				}&lt;br /&gt;
			}),&lt;br /&gt;
			backend.name&lt;br /&gt;
		]));&lt;br /&gt;
		&lt;br /&gt;
		backend.uiTab = el(&amp;#039;div&amp;#039;, [], {&lt;br /&gt;
			&amp;#039;style&amp;#039;: &amp;#039;display: none;&amp;#039;&lt;br /&gt;
		});&lt;br /&gt;
		backend.uiTabLabel = el(&amp;#039;li&amp;#039;, [&lt;br /&gt;
			el(&amp;#039;a&amp;#039;, backend.name, { &amp;#039;href&amp;#039;: &amp;#039;javascript:void(0);&amp;#039; }, {&lt;br /&gt;
				&amp;#039;click&amp;#039;: function () {&lt;br /&gt;
					uiCurTab.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
					uiCurTabLabel.classList.remove(&amp;#039;active&amp;#039;);&lt;br /&gt;
					uiCurTab = backend.uiTab;&lt;br /&gt;
					uiCurTabLabel = backend.uiTabLabel;&lt;br /&gt;
					uiCurTab.style.display = &amp;#039;&amp;#039;;&lt;br /&gt;
					uiCurTabLabel.classList.add(&amp;#039;active&amp;#039;);&lt;br /&gt;
				}	&lt;br /&gt;
			})&lt;br /&gt;
		]);&lt;br /&gt;
		backend.populateTab(backend.uiTab);&lt;br /&gt;
		uiTabs.appendChild(backend.uiTab);&lt;br /&gt;
		uiTabLabels.appendChild(backend.uiTabLabel);&lt;br /&gt;
	})(backends[key]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var link = mw.util.addPortletLink(mw.config.get(&amp;#039;skin&amp;#039;) === &amp;#039;vector&amp;#039; ? &amp;#039;p-views&amp;#039; : &amp;#039;p-cactions&amp;#039;,&lt;br /&gt;
	&amp;#039;javascript:void(0);&amp;#039;, &amp;#039;QQ&amp;#039;, &amp;#039;p-kephir-qq&amp;#039;, &amp;quot;search for attestations&amp;quot;, &amp;#039;9&amp;#039;&lt;br /&gt;
);&lt;br /&gt;
link.addEventListener(&amp;#039;click&amp;#039;, function () {&lt;br /&gt;
	uiMain.style.display = &amp;#039;&amp;#039;;&lt;br /&gt;
	uiQuery.focus();&lt;br /&gt;
}, false);&lt;/div&gt;</summary>
		<author><name>wikt&gt;Fenakhay</name></author>
	</entry>
</feed>