<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.doikayt.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js</id>
	<title>MediaWiki:Common.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.doikayt.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=MediaWiki:Common.js&amp;action=history"/>
	<updated>2026-07-21T19:48:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=MediaWiki:Common.js&amp;diff=31&amp;oldid=prev</id>
		<title>Admin: qwiki: system/common-js.md</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=MediaWiki:Common.js&amp;diff=31&amp;oldid=prev"/>
		<updated>2026-07-21T07:09:18Z</updated>

		<summary type="html">&lt;p&gt;qwiki: system/common-js.md&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:09, 21 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l191&quot;&gt;Line 191:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 191:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			}, 0 );&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			}, 0 );&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	} );&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}() );&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/* Inject a &quot;built at &amp;lt;commit&amp;gt;&quot; link into the wiki footer. The commit hash is&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   stored in MediaWiki:Doikayt-build-commit and written on every qwiki deploy. */&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;( function () {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	&#039;use strict&#039;;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	var GITHUB_REPO = &#039;https://github.com/doikayt/qwiki&#039;;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	new mw.Api().get( {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		action: &#039;query&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		titles: &#039;MediaWiki:Doikayt-build-commit&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		prop: &#039;revisions&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		rvprop: &#039;content&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		rvslots: &#039;main&#039;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	} ).then( function ( data ) {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		var pages = data.query.pages;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		var page  = pages[ Object.keys( pages )[ 0 ] ];&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		if ( !page.revisions ) { return; }&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		var commit = page.revisions[ 0 ].slots.main[ &#039;*&#039; ].trim();&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		if ( !commit ) { return; }&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		var short = commit.slice( 0, 7 );&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		var $link = $( &#039;&amp;lt;a&amp;gt;&#039; ).attr( {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			href:   GITHUB_REPO + &#039;/commit/&#039; + commit,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			target: &#039;_blank&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			rel:    &#039;noopener&#039;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		} ).text( &#039;built at &#039; + short );&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		$( &#039;#footer-info&#039; ).append(&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			$( &#039;&amp;lt;li&amp;gt;&#039; ).attr( &#039;id&#039;, &#039;footer-info-buildcommit&#039; ).append( $link )&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	} );&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	} );&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}() );&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}() );&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki:diff:1.41:old-25:rev-31:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.doikayt.org/index.php?title=MediaWiki:Common.js&amp;diff=25&amp;oldid=prev</id>
		<title>Admin: Created page with &quot;/* Point the site logo at the Doikayt Mobilization Labs homepage, opening    in a new tab so the wiki stays open in the background. */ ( function () { 	&#039;use strict&#039;;  	$( &#039;#p-logo a&#039; ).attr( { 		href: &#039;https://www.doikayt.org&#039;, 		target: &#039;_blank&#039;, 		rel: &#039;noopener&#039; 	} ); }() );  /* Replace PageForms OOUI tooltip buttons with a plain &lt;sup&gt;?&lt;/sup&gt; trigger    that shows the help text in a lightweight floating div on click. */ ( function () { 	&#039;use strict&#039;;  	mw.hook( &#039;pf.fo...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.doikayt.org/index.php?title=MediaWiki:Common.js&amp;diff=25&amp;oldid=prev"/>
		<updated>2026-07-21T02:10:45Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;span class=&quot;autocomment&quot;&gt;Point the site logo at the Doikayt Mobilization Labs homepage, opening    in a new tab so the wiki stays open in the background.: &lt;/span&gt; ( function () { 	&amp;#039;use strict&amp;#039;;  	$( &amp;#039;#p-logo a&amp;#039; ).attr( { 		href: &amp;#039;https://www.doikayt.org&amp;#039;, 		target: &amp;#039;_blank&amp;#039;, 		rel: &amp;#039;noopener&amp;#039; 	} ); }() );  &lt;span class=&quot;autocomment&quot;&gt;Replace PageForms OOUI tooltip buttons with a plain &amp;lt;sup&amp;gt;?&amp;lt;/sup&amp;gt; trigger    that shows the help text in a lightweight floating div on click.: &lt;/span&gt; ( function () { 	&amp;#039;use strict&amp;#039;;  	mw.hook( &amp;#039;pf.fo...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* Point the site logo at the Doikayt Mobilization Labs homepage, opening&lt;br /&gt;
   in a new tab so the wiki stays open in the background. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	$( &amp;#039;#p-logo a&amp;#039; ).attr( {&lt;br /&gt;
		href: &amp;#039;https://www.doikayt.org&amp;#039;,&lt;br /&gt;
		target: &amp;#039;_blank&amp;#039;,&lt;br /&gt;
		rel: &amp;#039;noopener&amp;#039;&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Replace PageForms OOUI tooltip buttons with a plain &amp;lt;sup&amp;gt;?&amp;lt;/sup&amp;gt; trigger&lt;br /&gt;
   that shows the help text in a lightweight floating div on click. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &amp;#039;pf.formSetupAfter&amp;#039; ).add( function () {&lt;br /&gt;
		$( &amp;#039;th[data-tooltip]&amp;#039; ).each( function () {&lt;br /&gt;
			var $th  = $( this );&lt;br /&gt;
			var safe = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).text( $th.attr( &amp;#039;data-tooltip&amp;#039; ) ).html();&lt;br /&gt;
&lt;br /&gt;
			var $trigger = $( &amp;#039;&amp;lt;sup class=&amp;quot;pf-tip&amp;quot;&amp;gt;?&amp;lt;/sup&amp;gt;&amp;#039; );&lt;br /&gt;
			var $popup   = $( &amp;#039;&amp;lt;div class=&amp;quot;pf-tip-popup&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
			                   .html( &amp;#039;&amp;lt;p&amp;gt;&amp;#039; + safe + &amp;#039;&amp;lt;/p&amp;gt;&amp;#039; )&lt;br /&gt;
			                   .hide();&lt;br /&gt;
&lt;br /&gt;
			$trigger.on( &amp;#039;click&amp;#039;, function ( e ) {&lt;br /&gt;
				e.stopPropagation();&lt;br /&gt;
				$( &amp;#039;.pf-tip-popup&amp;#039; ).not( $popup ).hide();&lt;br /&gt;
				$popup.toggle();&lt;br /&gt;
			} );&lt;br /&gt;
&lt;br /&gt;
			$th.css( &amp;#039;position&amp;#039;, &amp;#039;relative&amp;#039; ).append( $trigger ).append( $popup );&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		$( document ).on( &amp;#039;click.pf-tip&amp;#039;, function () {&lt;br /&gt;
			$( &amp;#039;.pf-tip-popup&amp;#039; ).hide();&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Probe the URL field on the Tool form for reachability on blur.&lt;br /&gt;
   Uses no-cors so any server response (any status code) counts as reachable;&lt;br /&gt;
   only genuine network failure (DNS, TLS, timeout) is flagged as unreachable. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// null = not yet checked, true = reachable, false = unreachable&lt;br /&gt;
	var probeResult = null;&lt;br /&gt;
	var probedUrl   = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	function getFullUrl() {&lt;br /&gt;
		var $protocol = $( &amp;#039;select[name=&amp;quot;Tool[protocol]&amp;quot;]&amp;#039; );&lt;br /&gt;
		var protocol  = $protocol.length ? $protocol.val().trim() : &amp;#039;https&amp;#039;;&lt;br /&gt;
		var domain    = $( &amp;#039;input[name=&amp;quot;Tool[url]&amp;quot;]&amp;#039; ).val().trim();&lt;br /&gt;
		return domain ? protocol + &amp;#039;://&amp;#039; + domain : &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showStatus( msg, color ) {&lt;br /&gt;
		$( &amp;#039;#pf-url-status&amp;#039; ).text( msg ).css( &amp;#039;color&amp;#039;, color );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function probe( url ) {&lt;br /&gt;
		if ( !url || url === probedUrl ) { return; }&lt;br /&gt;
		probedUrl   = url;&lt;br /&gt;
		probeResult = null;&lt;br /&gt;
		showStatus( &amp;#039;Checking…&amp;#039;, &amp;#039;gray&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
		var timeout = new Promise( function ( _, reject ) {&lt;br /&gt;
			setTimeout( function () { reject( new Error( &amp;#039;timeout&amp;#039; ) ); }, 8000 );&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		Promise.race( [&lt;br /&gt;
			fetch( url, { method: &amp;#039;HEAD&amp;#039;, mode: &amp;#039;no-cors&amp;#039;, cache: &amp;#039;no-cache&amp;#039; } ),&lt;br /&gt;
			timeout&lt;br /&gt;
		] ).then( function () {&lt;br /&gt;
			if ( url !== probedUrl ) { return; }&lt;br /&gt;
			probeResult = true;&lt;br /&gt;
			showStatus( &amp;#039;✓ Reachable&amp;#039;, &amp;#039;green&amp;#039; );&lt;br /&gt;
		} ).catch( function () {&lt;br /&gt;
			if ( url !== probedUrl ) { return; }&lt;br /&gt;
			probeResult = false;&lt;br /&gt;
			showStatus( &amp;#039;✗ Not reachable&amp;#039;, &amp;#039;red&amp;#039; );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$( function () {&lt;br /&gt;
		var $url = $( &amp;#039;input[name=&amp;quot;Tool[url]&amp;quot;]&amp;#039; );&lt;br /&gt;
		if ( !$url.length ) { return; }&lt;br /&gt;
&lt;br /&gt;
		$url.closest( &amp;#039;td&amp;#039; ).append(&lt;br /&gt;
			$( &amp;#039;&amp;lt;span&amp;gt;&amp;#039; ).attr( &amp;#039;id&amp;#039;, &amp;#039;pf-url-status&amp;#039; ).css( { marginLeft: &amp;#039;8px&amp;#039;, fontSize: &amp;#039;0.9em&amp;#039; } )&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		$url.on( &amp;#039;blur&amp;#039;, function () {&lt;br /&gt;
			probe( getFullUrl() );&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	// Clear previous error rows before each validation run&lt;br /&gt;
	mw.hook( &amp;#039;pf.formValidation&amp;#039; ).add( function () {&lt;br /&gt;
		$( &amp;#039;.pf-error-row&amp;#039; ).remove();&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &amp;#039;pf.formValidation&amp;#039; ).add( function ( args ) {&lt;br /&gt;
		var $url = $( &amp;#039;input[name=&amp;quot;Tool[url]&amp;quot;]&amp;#039; );&lt;br /&gt;
		if ( !$url.length ) { return; }&lt;br /&gt;
&lt;br /&gt;
		var domain = $url.val().trim();&lt;br /&gt;
		var msg = null;&lt;br /&gt;
&lt;br /&gt;
		if ( !domain ) {&lt;br /&gt;
			msg = &amp;#039;URL is required.&amp;#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			var url = getFullUrl();&lt;br /&gt;
			if ( probeResult === false ) {&lt;br /&gt;
				msg = &amp;#039;URL is not reachable. Please verify the address.&amp;#039;;&lt;br /&gt;
			} else if ( probeResult === null ) {&lt;br /&gt;
				showStatus( &amp;#039;Checking…&amp;#039;, &amp;#039;gray&amp;#039; );&lt;br /&gt;
				probe( url );&lt;br /&gt;
				msg = &amp;#039;Verifying URL reachability — please try saving again in a moment.&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( msg ) {&lt;br /&gt;
			args.numErrors++;&lt;br /&gt;
			$( &amp;#039;&amp;lt;tr class=&amp;quot;pf-error-row&amp;quot;&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039; )&lt;br /&gt;
				.find( &amp;#039;td&amp;#039; ).text( msg ).end()&lt;br /&gt;
				.insertAfter( $url.closest( &amp;#039;tr&amp;#039; ) );&lt;br /&gt;
			setTimeout( function () {&lt;br /&gt;
				var $e = $( &amp;#039;.pf-error-row&amp;#039; ).first();&lt;br /&gt;
				if ( $e.length ) { $e[ 0 ].scrollIntoView( { behavior: &amp;#039;smooth&amp;#039;, block: &amp;#039;nearest&amp;#039; } ); }&lt;br /&gt;
			}, 0 );&lt;br /&gt;
		}&lt;br /&gt;
		// probeResult === true: allow through&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Require at least one category before the Tool form can be submitted. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &amp;#039;pf.formValidation&amp;#039; ).add( function ( args ) {&lt;br /&gt;
		var $category = $( &amp;#039;[name=&amp;quot;Tool[category]&amp;quot;]&amp;#039; );&lt;br /&gt;
		if ( !$category.length ) { return; }&lt;br /&gt;
		if ( !( $category.val() || &amp;#039;&amp;#039; ).trim() ) {&lt;br /&gt;
			args.numErrors++;&lt;br /&gt;
			$( &amp;#039;&amp;lt;tr class=&amp;quot;pf-error-row&amp;quot;&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;Please select a category.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039; )&lt;br /&gt;
				.insertAfter( $category.closest( &amp;#039;tr&amp;#039; ) );&lt;br /&gt;
			setTimeout( function () {&lt;br /&gt;
				var $e = $( &amp;#039;.pf-error-row&amp;#039; ).first();&lt;br /&gt;
				if ( $e.length ) { $e[ 0 ].scrollIntoView( { behavior: &amp;#039;smooth&amp;#039;, block: &amp;#039;nearest&amp;#039; } ); }&lt;br /&gt;
			}, 0 );&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
/* Amount / pricing cross-validation. Two rules:&lt;br /&gt;
   1. pricing=free + non-zero amount → error (amount must be blank for free tools)&lt;br /&gt;
   2. pricing!=free + blank or zero amount → error (amount is required) */&lt;br /&gt;
( function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &amp;#039;pf.formValidation&amp;#039; ).add( function ( args ) {&lt;br /&gt;
		var $pricing = $( &amp;#039;[name=&amp;quot;Tool[pricing]&amp;quot;]&amp;#039; );&lt;br /&gt;
		var $amount  = $( &amp;#039;[name=&amp;quot;Tool[amount]&amp;quot;]&amp;#039; );&lt;br /&gt;
		if ( !$pricing.length || !$amount.length ) { return; }&lt;br /&gt;
&lt;br /&gt;
		var pricing = $pricing.val().trim();&lt;br /&gt;
		var amount  = ( $amount.val() || &amp;#039;&amp;#039; ).trim();&lt;br /&gt;
		var numericAmount = parseFloat( amount );&lt;br /&gt;
&lt;br /&gt;
		if ( pricing === &amp;#039;free&amp;#039; &amp;amp;&amp;amp; amount &amp;amp;&amp;amp; numericAmount &amp;gt; 0 ) {&lt;br /&gt;
			args.numErrors++;&lt;br /&gt;
			$( &amp;#039;&amp;lt;tr class=&amp;quot;pf-error-row&amp;quot;&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;Free tools must have a blank amount.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039; )&lt;br /&gt;
				.insertAfter( $amount.closest( &amp;#039;tr&amp;#039; ) );&lt;br /&gt;
			setTimeout( function () {&lt;br /&gt;
				var $e = $( &amp;#039;.pf-error-row&amp;#039; ).first();&lt;br /&gt;
				if ( $e.length ) { $e[ 0 ].scrollIntoView( { behavior: &amp;#039;smooth&amp;#039;, block: &amp;#039;nearest&amp;#039; } ); }&lt;br /&gt;
			}, 0 );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( pricing !== &amp;#039;free&amp;#039; &amp;amp;&amp;amp; ( !amount || numericAmount === 0 ) ) {&lt;br /&gt;
			args.numErrors++;&lt;br /&gt;
			$( &amp;#039;&amp;lt;tr class=&amp;quot;pf-error-row&amp;quot;&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;Amount is required when pricing is not free.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039; )&lt;br /&gt;
				.insertAfter( $amount.closest( &amp;#039;tr&amp;#039; ) );&lt;br /&gt;
			setTimeout( function () {&lt;br /&gt;
				var $e = $( &amp;#039;.pf-error-row&amp;#039; ).first();&lt;br /&gt;
				if ( $e.length ) { $e[ 0 ].scrollIntoView( { behavior: &amp;#039;smooth&amp;#039;, block: &amp;#039;nearest&amp;#039; } ); }&lt;br /&gt;
			}, 0 );&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>