<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://petitplanet.wiki/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-BetterUpload.js</id>
	<title>MediaWiki:Gadget-BetterUpload.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://petitplanet.wiki/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-BetterUpload.js"/>
	<link rel="alternate" type="text/html" href="https://petitplanet.wiki/index.php?title=MediaWiki:Gadget-BetterUpload.js&amp;action=history"/>
	<updated>2026-04-16T04:15:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://petitplanet.wiki/index.php?title=MediaWiki:Gadget-BetterUpload.js&amp;diff=1130&amp;oldid=prev</id>
		<title>ReisuDesign: Created page with &quot;/* jshint undef: true, devel: true, typed: true, jquery: true, strict: true, eqeqeq: true, freeze: true, latedef: true, shadow: outer, varstmt: true, quotmark: single, esversion: 6, futurehostile: true *//* global importArticles */ mw.hook(&#039;dev.CCM.load&#039;).add((cmLoader) =&gt; { 	&#039;use strict&#039;; 	(window.dev = window.dev || {}).BetterUpload = window.dev.BetterUpload || { 		&#039;default&#039;: &#039;==Licensing==\n{{Fairuse}}&#039; 	}; 	 	// Double load protection and check we&#039;re in Special:Uploa...&quot;</title>
		<link rel="alternate" type="text/html" href="https://petitplanet.wiki/index.php?title=MediaWiki:Gadget-BetterUpload.js&amp;diff=1130&amp;oldid=prev"/>
		<updated>2025-11-12T13:45:55Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;span class=&quot;autocomment&quot;&gt;jshint undef: true, devel: true, typed: true, jquery: true, strict: true, eqeqeq: true, freeze: true, latedef: true, shadow: outer, varstmt: true, quotmark: single, esversion: 6, futurehostile: true: &lt;/span&gt;&lt;span class=&quot;autocomment&quot;&gt;global importArticles: &lt;/span&gt; mw.hook(&amp;#039;dev.CCM.load&amp;#039;).add((cmLoader) =&amp;gt; { 	&amp;#039;use strict&amp;#039;; 	(window.dev = window.dev || {}).BetterUpload = window.dev.BetterUpload || { 		&amp;#039;default&amp;#039;: &amp;#039;==Licensing==\n{{Fairuse}}&amp;#039; 	}; 	 	// Double load protection and check we&amp;#039;re in Special:Uploa...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* jshint&lt;br /&gt;
undef: true,&lt;br /&gt;
devel: true,&lt;br /&gt;
typed: true,&lt;br /&gt;
jquery: true,&lt;br /&gt;
strict: true,&lt;br /&gt;
eqeqeq: true,&lt;br /&gt;
freeze: true,&lt;br /&gt;
latedef: true,&lt;br /&gt;
shadow: outer,&lt;br /&gt;
varstmt: true,&lt;br /&gt;
quotmark: single,&lt;br /&gt;
esversion: 6,&lt;br /&gt;
futurehostile: true&lt;br /&gt;
*//* global&lt;br /&gt;
importArticles&lt;br /&gt;
*/&lt;br /&gt;
mw.hook(&amp;#039;dev.CCM.load&amp;#039;).add((cmLoader) =&amp;gt; {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
	(window.dev = window.dev || {}).BetterUpload = window.dev.BetterUpload || {&lt;br /&gt;
		&amp;#039;default&amp;#039;: &amp;#039;==Licensing==\n{{Fairuse}}&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	// Double load protection and check we&amp;#039;re in Special:Upload&lt;br /&gt;
	if (window.dev.BetterUpload._LOADED) { return; }&lt;br /&gt;
	else { window.dev.BetterUpload._LOADED = true; }&lt;br /&gt;
	&lt;br /&gt;
	// Load dependencies and cache&lt;br /&gt;
	let api = new mw.Api(),&lt;br /&gt;
		config = mw.config.values,&lt;br /&gt;
		urlParams = new URLSearchParams(window.location.search),&lt;br /&gt;
		cm,&lt;br /&gt;
	// Main class&lt;br /&gt;
	BU = {&lt;br /&gt;
		init: (curr) =&amp;gt; {&lt;br /&gt;
			let form = $(&amp;#039;#mw-upload-form&amp;#039;);&lt;br /&gt;
			// Override form submit&lt;br /&gt;
			form.on(&amp;#039;submit&amp;#039;, (event)=&amp;gt;{&lt;br /&gt;
				event.preventDefault();&lt;br /&gt;
				let rd = $(&amp;#039;#wpRedirectFile&amp;#039;),&lt;br /&gt;
					fn = $(&amp;#039;#wpDestFile&amp;#039;);&lt;br /&gt;
				if ( rd.length&amp;gt;0 &amp;amp;&amp;amp; rd.val().length&amp;gt;0 &amp;amp;&amp;amp; fn.val().length&amp;gt;0 ) {&lt;br /&gt;
					let openRD = ()=&amp;gt;{window.open( mw.config.get(&amp;#039;wgServer&amp;#039;)+mw.util.getUrl(&amp;#039;File:&amp;#039;+fn.val())+&amp;#039;?redirect=no&amp;#039;, &amp;#039;_self&amp;#039;);},&lt;br /&gt;
						rdContent = (window.dev.BetterUpload.redirectFormat||&amp;#039;#redirect [[File:%TARGET%]]&amp;#039;).replace(/%TARGET%/, rd.val());&lt;br /&gt;
					api.create(&amp;#039;File:&amp;#039;+fn.val(), {recreate: true}, rdContent).then(openRD);&lt;br /&gt;
					api.edit(&amp;#039;File:&amp;#039;+fn.val(), ()=&amp;gt;({ text: rdContent, comment: &amp;#039;Create redirect&amp;#039; })).then(openRD);&lt;br /&gt;
				} else {&lt;br /&gt;
					BU.saveEdit();&lt;br /&gt;
					BU.attemptUpload();&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
			if (document.querySelector(&amp;#039;input#wpUploadDescription&amp;#039;) &amp;amp;&amp;amp; document.querySelector(&amp;#039;label[for=&amp;quot;wpUploadDescription&amp;quot;]&amp;#039;)) {&lt;br /&gt;
				// Change reupload format&lt;br /&gt;
				document.querySelector(&amp;#039;label[for=&amp;quot;wpUploadDescription&amp;quot;]&amp;#039;).innerHTML = &amp;#039;Upload summary:&amp;#039;;&lt;br /&gt;
				document.querySelector(&amp;#039;label[for=&amp;quot;wpUploadDescription&amp;quot;]&amp;#039;).setAttribute(&amp;#039;for&amp;#039;, &amp;#039;wpUploadSummary&amp;#039;);&lt;br /&gt;
				document.querySelector(&amp;#039;input#wpUploadDescription&amp;#039;).setAttribute(&amp;#039;name&amp;#039;, &amp;#039;wpUploadSummary&amp;#039;);&lt;br /&gt;
				document.querySelector(&amp;#039;input#wpUploadDescription&amp;#039;).setAttribute(&amp;#039;id&amp;#039;, &amp;#039;wpUploadSummary&amp;#039;);&lt;br /&gt;
			} else {&lt;br /&gt;
				// Add upload comment field for new uploads&lt;br /&gt;
				let u_comm = $(&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;, {&lt;br /&gt;
					&amp;#039;class&amp;#039;: &amp;#039;mw-htmlform-field-HTMLTextField&amp;#039;,&lt;br /&gt;
					html: [&lt;br /&gt;
						$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
							&amp;#039;class&amp;#039;: &amp;#039;mw-label&amp;#039;,&lt;br /&gt;
							html: $(&amp;#039;&amp;lt;label&amp;gt;&amp;#039;, { &amp;#039;for&amp;#039;: &amp;#039;wpUploadSummary&amp;#039;, text: &amp;#039;Upload summary:&amp;#039; })&lt;br /&gt;
						}),&lt;br /&gt;
						$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
							&amp;#039;class&amp;#039;: &amp;#039;mw-input&amp;#039;,&lt;br /&gt;
							html: $(&amp;#039;&amp;lt;input&amp;gt;&amp;#039;, { &amp;#039;id&amp;#039;: &amp;#039;wpUploadSummary&amp;#039;, name: &amp;#039;wpUploadSummary&amp;#039;, size: &amp;#039;60&amp;#039; })&lt;br /&gt;
						})&lt;br /&gt;
					]&lt;br /&gt;
				});&lt;br /&gt;
				$(&amp;#039;.mw-htmlform-field-HTMLTextField:has(#wpDestFile)&amp;#039;).after(u_comm);&lt;br /&gt;
			}&lt;br /&gt;
			let def_Val = (curr!==null &amp;amp;&amp;amp; curr!==undefined) ? curr : (BU.detectFromDest() || window.dev.BetterUpload.default || &amp;#039;&amp;#039;);&lt;br /&gt;
			if (!document.querySelector(&amp;#039;.mw-htmlform-field-HTMLTextAreaField&amp;#039;)) {&lt;br /&gt;
				// Add page content field for reuploads&lt;br /&gt;
				let p_cont = $(&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;, {&lt;br /&gt;
					&amp;#039;class&amp;#039;: &amp;#039;mw-htmlform-field-HTMLTextAreaField&amp;#039;,&lt;br /&gt;
					html: [&lt;br /&gt;
						$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
							&amp;#039;class&amp;#039;: &amp;#039;mw-label&amp;#039;,&lt;br /&gt;
							html: $(&amp;#039;&amp;lt;label&amp;gt;&amp;#039;, { &amp;#039;for&amp;#039;: &amp;#039;wpUploadDescription&amp;#039;, text: &amp;#039;Page content:&amp;#039; })&lt;br /&gt;
						}),&lt;br /&gt;
						$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
							&amp;#039;class&amp;#039;: &amp;#039;mw-input&amp;#039;,&lt;br /&gt;
							html: $(&amp;#039;&amp;lt;textarea&amp;gt;&amp;#039;, {&lt;br /&gt;
								&amp;#039;id&amp;#039;: &amp;#039;wpUploadDescription&amp;#039;,&lt;br /&gt;
								name: &amp;#039;wpUploadDescription&amp;#039;,&lt;br /&gt;
								cols: &amp;#039;80&amp;#039;,&lt;br /&gt;
								rows: &amp;#039;8&amp;#039;,&lt;br /&gt;
								style: &amp;#039;font-family: Consolas, Eupheima UCAS, Ayuthaya, Menlo, monospace;&amp;#039;,&lt;br /&gt;
								val: def_Val&lt;br /&gt;
							})&lt;br /&gt;
						})&lt;br /&gt;
					]&lt;br /&gt;
				});&lt;br /&gt;
				$(&amp;#039;.mw-htmlform-field-HTMLTextField:has(#wpUploadSummary)&amp;#039;).after(p_cont);&lt;br /&gt;
			} else {&lt;br /&gt;
				// Change from summary to page content in new uploads&lt;br /&gt;
				document.querySelector(&amp;#039;.mw-htmlform-field-HTMLTextAreaField label[for=&amp;quot;wpUploadDescription&amp;quot;]&amp;#039;).innerHTML = &amp;#039;Page content:&amp;#039;;&lt;br /&gt;
				document.querySelector(&amp;#039;.mw-htmlform-field-HTMLTextAreaField textarea#wpUploadDescription&amp;#039;).addEventListener(&amp;#039;change&amp;#039;, BU.renderPreview);&lt;br /&gt;
				document.querySelector(&amp;#039;textarea#wpUploadDescription&amp;#039;).style[&amp;#039;font-family&amp;#039;] = &amp;#039;Consolas, Eupheima UCAS, Ayuthaya, Menlo, monospace&amp;#039;;&lt;br /&gt;
				document.querySelector(&amp;#039;textarea#wpUploadDescription&amp;#039;).value = def_Val;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			// Add quick redirecting option&lt;br /&gt;
			let rdField = $(&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;, {&lt;br /&gt;
				&amp;#039;class&amp;#039;: &amp;#039;mw-htmlform-field-RedirectSourceField&amp;#039;,&lt;br /&gt;
				html: [&lt;br /&gt;
					$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
						&amp;#039;class&amp;#039;: &amp;#039;mw-label&amp;#039;,&lt;br /&gt;
						html: $(&amp;#039;&amp;lt;label&amp;gt;&amp;#039;, { &amp;#039;for&amp;#039;: &amp;#039;wpRedirectFile&amp;#039;, text: &amp;#039;Redirect to:&amp;#039; })&lt;br /&gt;
					}),&lt;br /&gt;
					$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
						&amp;#039;class&amp;#039;: &amp;#039;mw-input&amp;#039;,&lt;br /&gt;
						html: $(&amp;#039;&amp;lt;input&amp;gt;&amp;#039;, { &amp;#039;id&amp;#039;: &amp;#039;wpRedirectFile&amp;#039;, name: &amp;#039;wpRedirectFile&amp;#039;, size: &amp;#039;60&amp;#039; })&lt;br /&gt;
					})&lt;br /&gt;
				]&lt;br /&gt;
			});&lt;br /&gt;
			$(&amp;#039;#mw-htmlform-source&amp;#039;).append(rdField);&lt;br /&gt;
			&lt;br /&gt;
			// Add preview container&lt;br /&gt;
			let pvField = $(&amp;#039;&amp;lt;fieldset&amp;gt;&amp;#039;, {&lt;br /&gt;
				html: [&lt;br /&gt;
					$(&amp;#039;&amp;lt;legend&amp;gt;&amp;#039;, { text: &amp;#039;Page Preview&amp;#039; }),&lt;br /&gt;
					$(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;, { &amp;#039;id&amp;#039;: &amp;#039;wpPagePreview&amp;#039; })&lt;br /&gt;
				]&lt;br /&gt;
			});&lt;br /&gt;
			$(&amp;#039;fieldset:has(&amp;gt;#mw-htmlform-description)&amp;#039;).after(pvField);&lt;br /&gt;
			&lt;br /&gt;
			// Remove useless things #wpLicense&lt;br /&gt;
			$(`&lt;br /&gt;
				fieldset:has(&amp;gt;#mw-htmlform-options),&lt;br /&gt;
				tr.mw-htmlform-field-Licenses,&lt;br /&gt;
				.mw-upload-editlicenses&lt;br /&gt;
			`).remove();&lt;br /&gt;
			&lt;br /&gt;
			cmLoader($(&amp;#039;#wpUploadDescription&amp;#039;));&lt;br /&gt;
			mw.hook(&amp;#039;dev.CCM.ready&amp;#039;).add((ccm)=&amp;gt;{&lt;br /&gt;
				cm = ccm;&lt;br /&gt;
				BU.renderPreview();&lt;br /&gt;
				BU.genPreloads();&lt;br /&gt;
				&lt;br /&gt;
				// try to preview every couple seconds&lt;br /&gt;
				let last;&lt;br /&gt;
				setInterval(() =&amp;gt; {&lt;br /&gt;
					let newtext = cm.view.state.sliceDoc();&lt;br /&gt;
					if (newtext !== last) {BU.renderPreview();}&lt;br /&gt;
					last = newtext;&lt;br /&gt;
				}, 1000);&lt;br /&gt;
			});&lt;br /&gt;
			&lt;br /&gt;
			// Update &amp;quot;default values&amp;quot; so that the base upload check for leaving the page doesnt have a stroke when nothing actually changed&lt;br /&gt;
			form.data(&amp;#039;origtext&amp;#039;, form.serialize());&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		pushCM: (txt, pos)=&amp;gt;{&lt;br /&gt;
			cm.view.dispatch({&lt;br /&gt;
				changes: {&lt;br /&gt;
					from: pos===null ? 0 : cm.view.state.selection.main.from,&lt;br /&gt;
					to: pos===null ? cm.view.state.doc.length : cm.view.state.selection.main.to,&lt;br /&gt;
					insert: txt&lt;br /&gt;
				},&lt;br /&gt;
				selection: {anchor: cm.view.state.selection.main.from + (pos||0)}&lt;br /&gt;
			});&lt;br /&gt;
			cm.view.focus();&lt;br /&gt;
&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// if this file is being uploaded to a specific destination specified in the URL,&lt;br /&gt;
		// iterate through preloads with a specified &amp;quot;pattern&amp;quot; field to attempt to detect one&lt;br /&gt;
		detectFromDest: () =&amp;gt; {&lt;br /&gt;
			if (!Array.isArray(window.dev.BetterUpload.preloads) || !urlParams.has(&amp;#039;wpDestFile&amp;#039;)) return;&lt;br /&gt;
			let filename = urlParams.get(&amp;#039;wpDestFile&amp;#039;).replace(/_/g, &amp;#039; &amp;#039;);&lt;br /&gt;
			let matched = window.dev.BetterUpload.preloads.find((preload) =&amp;gt; {&lt;br /&gt;
				if (preload.pattern&lt;br /&gt;
					&amp;amp;&amp;amp; &amp;#039;string&amp;#039; === typeof preload.pattern&lt;br /&gt;
					&amp;amp;&amp;amp; new RegExp(preload.pattern).test(filename)&lt;br /&gt;
				) { return true; }&lt;br /&gt;
				else { return false; }&lt;br /&gt;
			});&lt;br /&gt;
			if (matched &amp;amp;&amp;amp; matched.preload) {&lt;br /&gt;
				return matched.preload;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		genPreloads: () =&amp;gt; {&lt;br /&gt;
			if (Array.isArray(window.dev.BetterUpload.preloads) &amp;amp;&amp;amp; window.dev.BetterUpload.preloads.length&amp;gt;0) {&lt;br /&gt;
				$(&amp;#039;.mw-htmlform-field-Preloads&amp;#039;).remove(); // remove any to avoid double-loading&lt;br /&gt;
				let pl_row = $(&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;, {&lt;br /&gt;
					&amp;#039;class&amp;#039;: &amp;#039;mw-htmlform-field-Preloads&amp;#039;,&lt;br /&gt;
					html: [&lt;br /&gt;
						$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
							&amp;#039;class&amp;#039;: &amp;#039;mw-label&amp;#039;,&lt;br /&gt;
							html: $(&amp;#039;&amp;lt;label&amp;gt;&amp;#039;, { &amp;#039;for&amp;#039;: &amp;#039;wpPreload&amp;#039;, text: &amp;#039;Preloads:&amp;#039; })&lt;br /&gt;
						}),&lt;br /&gt;
						$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
							&amp;#039;class&amp;#039;: &amp;#039;mw-input&amp;#039;,&lt;br /&gt;
							html: $(&amp;#039;&amp;lt;select&amp;gt;&amp;#039;, {&lt;br /&gt;
								&amp;#039;id&amp;#039;: &amp;#039;wpPreload&amp;#039;,&lt;br /&gt;
								name: &amp;#039;wpPreload&amp;#039;,&lt;br /&gt;
								html: $(&amp;#039;&amp;lt;option&amp;gt;&amp;#039;, { value: &amp;#039;None&amp;#039;, title: &amp;#039;None&amp;#039;, selected: &amp;#039;&amp;#039;, text: &amp;#039;None selected&amp;#039; })&lt;br /&gt;
							})&lt;br /&gt;
						})&lt;br /&gt;
					]&lt;br /&gt;
				});&lt;br /&gt;
				$(&amp;#039;.mw-htmlform-field-HTMLTextAreaField&amp;#039;).after(pl_row);&lt;br /&gt;
				let pl_list = pl_row.find(&amp;#039;select&amp;#039;).get(0);&lt;br /&gt;
				let pl_opts = pl_list;&lt;br /&gt;
				window.dev.BetterUpload.preloads.forEach((setting, num) =&amp;gt; {&lt;br /&gt;
					if (setting._group===&amp;#039;0&amp;#039;) {&lt;br /&gt;
						pl_opts = pl_list;&lt;br /&gt;
					} else if (setting._group) {&lt;br /&gt;
						pl_opts = document.createElement(&amp;#039;optgroup&amp;#039;);&lt;br /&gt;
						pl_opts.setAttribute(&amp;#039;label&amp;#039;, setting._group);&lt;br /&gt;
						pl_list.append(pl_opts);&lt;br /&gt;
					} else if (setting.name &amp;amp;&amp;amp; (setting.preload || setting.header)) {&lt;br /&gt;
						let option = document.createElement(&amp;#039;option&amp;#039;);&lt;br /&gt;
						if (setting.header) {&lt;br /&gt;
							option.setAttribute(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;);&lt;br /&gt;
							option.style.color = &amp;#039;GrayText&amp;#039;;&lt;br /&gt;
						} else if (setting.preload) {&lt;br /&gt;
							option.setAttribute(&amp;#039;value&amp;#039;, setting.name);&lt;br /&gt;
							option.setAttribute(&amp;#039;title&amp;#039;, setting.name);&lt;br /&gt;
						}&lt;br /&gt;
						option.innerHTML = setting.description || setting.name;&lt;br /&gt;
						option.setAttribute(&amp;#039;numref&amp;#039;, num);&lt;br /&gt;
						pl_opts.append(option);&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
				pl_list.addEventListener(&amp;#039;change&amp;#039;, (event) =&amp;gt; {&lt;br /&gt;
					let num = pl_list.selectedOptions[0].getAttribute(&amp;#039;numref&amp;#039;);&lt;br /&gt;
					let settings = window.dev.BetterUpload.preloads[num];&lt;br /&gt;
					if (settings &amp;amp;&amp;amp; settings.preload) {&lt;br /&gt;
						$(&amp;#039;.mw-htmlform-field-PreloadValues&amp;#039;).remove();&lt;br /&gt;
						if (settings.fillin &amp;amp;&amp;amp; /\$\(1\)\$/.test(settings.preload)) {&lt;br /&gt;
							let plv_row = $(&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;, {&lt;br /&gt;
								&amp;#039;class&amp;#039;: &amp;#039;mw-htmlform-field-PreloadValues&amp;#039;,&lt;br /&gt;
								html: [&lt;br /&gt;
									$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
										&amp;#039;class&amp;#039;: &amp;#039;mw-label&amp;#039;,&lt;br /&gt;
										html: $(&amp;#039;&amp;lt;label&amp;gt;&amp;#039;, { &amp;#039;for&amp;#039;: &amp;#039;wpPreloadValues&amp;#039;, text: &amp;#039;Values:&amp;#039;, style: &amp;#039;vertical-align: top;&amp;#039; })&lt;br /&gt;
									}),&lt;br /&gt;
									$(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;, {&lt;br /&gt;
										&amp;#039;class&amp;#039;: &amp;#039;mw-input&amp;#039;,&lt;br /&gt;
										html: $(&amp;#039;&amp;lt;select&amp;gt;&amp;#039;, {&lt;br /&gt;
											&amp;#039;id&amp;#039;: &amp;#039;wpPreloadValues&amp;#039;,&lt;br /&gt;
											name: &amp;#039;wpPreloadValues&amp;#039;,&lt;br /&gt;
											html: $(&amp;#039;&amp;lt;option&amp;gt;&amp;#039;, { value: &amp;#039;None&amp;#039;, title: &amp;#039;None&amp;#039;, selected: &amp;#039;&amp;#039;, text: &amp;#039;None selected&amp;#039; })&lt;br /&gt;
										})&lt;br /&gt;
									})&lt;br /&gt;
								]&lt;br /&gt;
							});&lt;br /&gt;
							pl_row.after(plv_row);&lt;br /&gt;
							let plv_list = plv_row.find(&amp;#039;select&amp;#039;).get(0);&lt;br /&gt;
							let plv_opts = plv_list;&lt;br /&gt;
							settings.fillin.forEach((value, index) =&amp;gt; {&lt;br /&gt;
								if (value._group===&amp;#039;0&amp;#039;) {&lt;br /&gt;
									plv_opts = plv_list;&lt;br /&gt;
								} else if (value._group) {&lt;br /&gt;
									plv_opts = document.createElement(&amp;#039;optgroup&amp;#039;);&lt;br /&gt;
									plv_opts.setAttribute(&amp;#039;label&amp;#039;, value._group);&lt;br /&gt;
									plv_list.append(plv_opts);&lt;br /&gt;
								} else {&lt;br /&gt;
									let option = document.createElement(&amp;#039;option&amp;#039;);&lt;br /&gt;
									let name = value.name || value.values.join(&amp;#039;, &amp;#039;);&lt;br /&gt;
									if (value.header) {&lt;br /&gt;
											option.setAttribute(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;);&lt;br /&gt;
											option.style.color = &amp;#039;GrayText&amp;#039;;&lt;br /&gt;
									} else if (value.preload) {&lt;br /&gt;
										option.setAttribute(&amp;#039;value&amp;#039;, name);&lt;br /&gt;
										option.setAttribute(&amp;#039;title&amp;#039;, name);&lt;br /&gt;
									}&lt;br /&gt;
									option.innerHTML = name;&lt;br /&gt;
									option.setAttribute(&amp;#039;numref&amp;#039;, index);&lt;br /&gt;
									plv_opts.append(option);&lt;br /&gt;
								}&lt;br /&gt;
							});&lt;br /&gt;
							plv_list.addEventListener(&amp;#039;change&amp;#039;, (event2) =&amp;gt; {&lt;br /&gt;
								let preloadNum = pl_list.selectedOptions[0].getAttribute(&amp;#039;numref&amp;#039;);&lt;br /&gt;
								let preloadSettings = window.dev.BetterUpload.preloads[preloadNum];&lt;br /&gt;
								let valnum = plv_list.selectedOptions[0].getAttribute(&amp;#039;numref&amp;#039;);&lt;br /&gt;
								let valsettings = preloadSettings.fillin[valnum];&lt;br /&gt;
								let newpreload = preloadSettings.preload;&lt;br /&gt;
								valsettings.values.forEach((rep, ind) =&amp;gt; {&lt;br /&gt;
									let regex = new RegExp(/\$\(/.source+(ind+1)+/\)\$/.source, &amp;#039;g&amp;#039;);&lt;br /&gt;
									if (regex.test(newpreload)) {&lt;br /&gt;
										newpreload = newpreload.replace(regex, rep);&lt;br /&gt;
									}&lt;br /&gt;
								});&lt;br /&gt;
								$(&amp;#039;#wpPreloadValuePreview&amp;#039;).remove();&lt;br /&gt;
								if (valsettings.reference) {&lt;br /&gt;
									let refPreview = $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;, { &amp;#039;id&amp;#039;: &amp;#039;wpPreloadValueRef&amp;#039;, name: &amp;#039;wpPreloadValueRef&amp;#039; });&lt;br /&gt;
									api.get({&lt;br /&gt;
										action: &amp;#039;parse&amp;#039;,&lt;br /&gt;
										text: valsettings.reference,&lt;br /&gt;
										prop: &amp;#039;text&amp;#039;,&lt;br /&gt;
										disablelimitreport: true,&lt;br /&gt;
										contentmodel: &amp;#039;wikitext&amp;#039;,&lt;br /&gt;
										pst: true&lt;br /&gt;
									}).then((data) =&amp;gt; {&lt;br /&gt;
										if (data &amp;amp;&amp;amp; data.parse &amp;amp;&amp;amp; data.parse.text &amp;amp;&amp;amp; data.parse.text[&amp;#039;*&amp;#039;]) {&lt;br /&gt;
											refPreview.html(data.parse.text[&amp;#039;*&amp;#039;]);&lt;br /&gt;
											$(plv_list).after(refPreview);&lt;br /&gt;
										}&lt;br /&gt;
									});&lt;br /&gt;
								}&lt;br /&gt;
								BU.pushCM(newpreload, null);&lt;br /&gt;
								BU.renderPreview();&lt;br /&gt;
							});&lt;br /&gt;
						}&lt;br /&gt;
						BU.pushCM(settings.preload, null);&lt;br /&gt;
						BU.renderPreview();&lt;br /&gt;
					} else { alert(&amp;#039;Invalid option.&amp;#039;); }&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		renderPreview: () =&amp;gt; {&lt;br /&gt;
			let filename = document.querySelector(&amp;#039;#wpDestFile&amp;#039;).value;&lt;br /&gt;
			let text = cm.view.state.sliceDoc();&lt;br /&gt;
			let params = {&lt;br /&gt;
				action: &amp;#039;parse&amp;#039;,&lt;br /&gt;
				text: text+&amp;#039;__noeditsection__&amp;#039;,&lt;br /&gt;
				prop: &amp;#039;text&amp;#039;,&lt;br /&gt;
				disablelimitreport: true,&lt;br /&gt;
				contentmodel: &amp;#039;wikitext&amp;#039;,&lt;br /&gt;
				pst: true&lt;br /&gt;
			};&lt;br /&gt;
			if (filename.length&amp;gt;0) {&lt;br /&gt;
				params.title = &amp;#039;File:&amp;#039; + filename;&lt;br /&gt;
			}&lt;br /&gt;
			api.get(params).then((data) =&amp;gt; {&lt;br /&gt;
				if (data &amp;amp;&amp;amp; data.parse &amp;amp;&amp;amp; data.parse.text &amp;amp;&amp;amp; data.parse.text[&amp;#039;*&amp;#039;]) {&lt;br /&gt;
					$(&amp;#039;#wpPagePreview&amp;#039;).html(data.parse.text[&amp;#039;*&amp;#039;]);&lt;br /&gt;
				}&lt;br /&gt;
			}).fail(console.log);&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		saveEdit: () =&amp;gt; {&lt;br /&gt;
			if (document.querySelector(&amp;#039;input#wpUploadSummary&amp;#039;)) {&lt;br /&gt;
				let filename = document.querySelector(&amp;#039;#wpDestFile&amp;#039;).value;&lt;br /&gt;
				let summary = document.querySelector(&amp;#039;input#wpUploadSummary&amp;#039;);&lt;br /&gt;
				let params = {&lt;br /&gt;
					action: &amp;#039;edit&amp;#039;,&lt;br /&gt;
					title: &amp;#039;File:&amp;#039;+filename,&lt;br /&gt;
					ignorewarnings: &amp;#039;1&amp;#039;,&lt;br /&gt;
					format: &amp;#039;json&amp;#039;,&lt;br /&gt;
					text: cm.view.state.sliceDoc(),&lt;br /&gt;
					recreate: 1,&lt;br /&gt;
					token: mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;)&lt;br /&gt;
				};&lt;br /&gt;
				if (summary &amp;amp;&amp;amp; summary.value.length&amp;gt;0) {&lt;br /&gt;
					params.summary = summary.value;&lt;br /&gt;
				}&lt;br /&gt;
				if (filename &amp;amp;&amp;amp; filename.length&amp;gt;0) {&lt;br /&gt;
					api.post(params);&lt;br /&gt;
				} else { alert(&amp;#039;Missing file or file name. Could not save page content.&amp;#039;); }&lt;br /&gt;
			} else {return;}&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		attemptUpload: () =&amp;gt; {&lt;br /&gt;
			let filename = document.querySelector(&amp;#039;#wpDestFile&amp;#039;).value;&lt;br /&gt;
			let file = document.querySelector(&amp;#039;#wpUploadFile&amp;#039;).files[0];&lt;br /&gt;
			let comment = document.querySelector(&amp;#039;input#wpUploadSummary&amp;#039;);&lt;br /&gt;
			let params = {&lt;br /&gt;
				token: mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;),&lt;br /&gt;
				filename: filename,&lt;br /&gt;
				ignorewarnings: &amp;#039;1&amp;#039;,&lt;br /&gt;
				format: &amp;#039;json&amp;#039;,&lt;br /&gt;
				text: cm.view.state.sliceDoc()&lt;br /&gt;
			};&lt;br /&gt;
			if (comment &amp;amp;&amp;amp; comment.value.length&amp;gt;0) {&lt;br /&gt;
				params.comment = comment.value;&lt;br /&gt;
			}&lt;br /&gt;
			if (file &amp;amp;&amp;amp; filename &amp;amp;&amp;amp; filename.length&amp;gt;0) {&lt;br /&gt;
				let handleResponse = (a, b) =&amp;gt; {&lt;br /&gt;
					let data = (typeof b === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; !Array.isArray(b) &amp;amp;&amp;amp; b !== null &amp;amp;&amp;amp; (b.error || b.upload)) ? b : a;&lt;br /&gt;
					if (!data) {&lt;br /&gt;
						console.log(&amp;#039;a&amp;#039;, a);&lt;br /&gt;
						console.log(&amp;#039;b&amp;#039;, b);&lt;br /&gt;
					}&lt;br /&gt;
					if (data.error) {&lt;br /&gt;
						console.log(&amp;#039;data&amp;#039;, data);&lt;br /&gt;
						let cont = document.querySelector(&amp;#039;.mw-message-box-error&amp;#039;);&lt;br /&gt;
						if (!cont) {&lt;br /&gt;
							let _temp = $(&amp;#039;&amp;lt;h2 class=&amp;quot;mw-message-box-error-header&amp;quot;&amp;gt;Upload Warning&amp;lt;/h2&amp;gt;&amp;lt;div class=&amp;quot;mw-message-box-error mw-message-box&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
							$(&amp;#039;#uploadtext&amp;#039;).after(_temp);&lt;br /&gt;
							cont = _temp[1];&lt;br /&gt;
						}&lt;br /&gt;
						cont.innerHTML = (data.error.info &amp;amp;&amp;amp; data.error.info.length&amp;gt;0) ? data.error.info : &amp;#039;Unknown error during upload.&amp;#039;;&lt;br /&gt;
					} else if (data.upload &amp;amp;&amp;amp; data.upload.result === &amp;#039;Success&amp;#039;) {&lt;br /&gt;
						let form = $(&amp;#039;#mw-upload-form&amp;#039;);&lt;br /&gt;
						form.data(&amp;#039;origtext&amp;#039;, form.serialize()); // So the form isnt annoying when leaving&lt;br /&gt;
						window.open(&lt;br /&gt;
							config.wgServer+mw.util.getUrl(&amp;#039;File:&amp;#039;+filename), // URI encoding required&lt;br /&gt;
							&amp;#039;_self&amp;#039; // load in current tab&lt;br /&gt;
						);&lt;br /&gt;
					} else {&lt;br /&gt;
						console.log(&amp;#039;data&amp;#039;, data);&lt;br /&gt;
						alert(&amp;#039;Unknown error on upload!&amp;#039;);&lt;br /&gt;
					}&lt;br /&gt;
				};&lt;br /&gt;
				api.upload(file, params).then(handleResponse, handleResponse);&lt;br /&gt;
			} else { alert(&amp;#039;Missing file or file name. Could not upload file.&amp;#039;); }&lt;br /&gt;
		},&lt;br /&gt;
		&lt;br /&gt;
		// Delay until element exists to run function&lt;br /&gt;
		waitFor: function(query, callback, extraDelay) {&lt;br /&gt;
			if (&amp;#039;function&amp;#039; === typeof callback &amp;amp;&amp;amp; &amp;#039;string&amp;#039; === typeof query) {&lt;br /&gt;
				extraDelay = extraDelay || 0;&lt;br /&gt;
				if (document.querySelector(query)) {&lt;br /&gt;
					setTimeout(callback, extraDelay);&lt;br /&gt;
				} else {&lt;br /&gt;
					// set up the mutation observer&lt;br /&gt;
					let observer = new MutationObserver(function (mutations, me) {&lt;br /&gt;
						if (document.querySelector(query)) {&lt;br /&gt;
							setTimeout(callback, extraDelay);&lt;br /&gt;
							me.disconnect(); // stop observing&lt;br /&gt;
							return;&lt;br /&gt;
						}&lt;br /&gt;
					});&lt;br /&gt;
					&lt;br /&gt;
					// start observing&lt;br /&gt;
					observer.observe(document, {&lt;br /&gt;
						childList: true,&lt;br /&gt;
						subtree: true&lt;br /&gt;
					});&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	let titles = [&lt;br /&gt;
		&amp;#039;MediaWiki:Gadget-BetterUpload.json&amp;#039;,			// Site-wide settings on MediaWiki json page&lt;br /&gt;
		&amp;#039;User:&amp;#039;+config.wgUserName+&amp;#039;/BetterUpload.json&amp;#039;	// User settings if any in &amp;quot;User:NAME/BetterUpload.json&amp;quot;&lt;br /&gt;
	];&lt;br /&gt;
	if (document.querySelector(&amp;#039;#wpDestFile&amp;#039;) &amp;amp;&amp;amp; document.querySelector(&amp;#039;#wpDestFile&amp;#039;).value.length&amp;gt;0) {&lt;br /&gt;
		titles.push(&amp;#039;File:&amp;#039;+document.querySelector(&amp;#039;#wpDestFile&amp;#039;).value); // File to check if doing a reupload&lt;br /&gt;
	}&lt;br /&gt;
	api.get({&lt;br /&gt;
		action: &amp;#039;query&amp;#039;,&lt;br /&gt;
		prop: &amp;#039;revisions&amp;#039;,&lt;br /&gt;
		titles: titles,&lt;br /&gt;
		rvprop: &amp;#039;content&amp;#039;,&lt;br /&gt;
		rvslots: &amp;#039;*&amp;#039;&lt;br /&gt;
	}).then((data) =&amp;gt; {&lt;br /&gt;
		let page = {user: -1, site: -1, curr: null};&lt;br /&gt;
		Object.keys(data.query.pages).forEach((id) =&amp;gt; {&lt;br /&gt;
			if (data.query.pages[id].ns === 8 &amp;amp;&amp;amp; data.query.pages[id].missing!==&amp;#039;&amp;#039;) {&lt;br /&gt;
				page.site = id;&lt;br /&gt;
			} else if (data.query.pages[id].ns === 2 &amp;amp;&amp;amp; data.query.pages[id].missing!==&amp;#039;&amp;#039;) {&lt;br /&gt;
				page.user = id;&lt;br /&gt;
			} else if (data.query.pages[id].ns === 6 &amp;amp;&amp;amp; data.query.pages[id].missing!==&amp;#039;&amp;#039;) {&lt;br /&gt;
				page.curr = data.query.pages[id].revisions[0].slots.main[&amp;#039;*&amp;#039;];&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		if (page.user !== -1) {&lt;br /&gt;
			window.dev.BetterUpload = JSON.parse(data.query.pages[page.user].revisions[0].slots.main[&amp;#039;*&amp;#039;]);&lt;br /&gt;
		} else if (page.site !== -1) {&lt;br /&gt;
			window.dev.BetterUpload = JSON.parse(data.query.pages[page.site].revisions[0].slots.main[&amp;#039;*&amp;#039;]);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		let setInit = () =&amp;gt; {&lt;br /&gt;
			if (new URL(location.href).searchParams.has(&amp;#039;wpForReUpload&amp;#039;)) { // Special:Upload?wpForReUpload=1&lt;br /&gt;
				BU.init(page.curr);&lt;br /&gt;
			} else { // Special:Upload&lt;br /&gt;
				BU.init();&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
		if (document.querySelector(&amp;#039;#wpUploadDescription&amp;#039;)) {&lt;br /&gt;
			setInit();&lt;br /&gt;
		} else {&lt;br /&gt;
			// set up the mutation observer&lt;br /&gt;
			let observer = new MutationObserver((_, me) =&amp;gt; {&lt;br /&gt;
				if (document.querySelector(&amp;#039;#wpUploadDescription&amp;#039;)) {&lt;br /&gt;
					me.disconnect(); // stop observing&lt;br /&gt;
					BU.init();&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
			// start observing&lt;br /&gt;
			observer.observe(document, {&lt;br /&gt;
				childList: true,&lt;br /&gt;
				subtree: true&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Start the process if in the right page&lt;br /&gt;
if (mw.config.values.wgCanonicalSpecialPageName === &amp;#039;Upload&amp;#039;) {&lt;br /&gt;
	mw.loader.using(&amp;#039;mediawiki.api&amp;#039;).then(()=&amp;gt;{&lt;br /&gt;
		importArticles({&lt;br /&gt;
			type: &amp;#039;script&amp;#039;,&lt;br /&gt;
			articles: [ &amp;#039;u:dev:MediaWiki:CustomCodeMirror.js&amp;#039; ]&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
</feed>