Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/**
 * Special:Upload helpers — guess soldier page from filename and toggle profile vs document options.
 */
$(function () {
	if (mw.config.get('wgCanonicalSpecialPageName') !== 'Upload') {
		return;
	}

	var PHOTO_EXT = /(\.(jpe?g|png|gif|webp))$/i;
	var DOC_EXT = /(\.(pdf|docx?|txt|rtf|odt|tiff?))$/i;

	function field(name) {
		return $('input[name="wp' + name + '"], textarea[name="wp' + name + '"]');
	}

	var $soldier = field('RitchieSoldierPage');
	var $profile = field('RitchieProfilePhoto');
	var $gallery = field('RitchieAddGallery');
	var $filename = $('#wpUploadFile, input[name="wpUploadFile"]');

	if (!$soldier.length || !$filename.length) {
		return;
	}

	function basename(path) {
		path = String(path || '');
		var parts = path.replace(/\\/g, '/').split('/');
		return parts[parts.length - 1] || '';
	}

	function guessSoldier(name) {
		name = basename(name).replace(PHOTO_EXT, '').replace(DOC_EXT, '').replace(/_/g, ' ').trim();
		var parts = name.split(/\s+/);
		if (parts.length < 2) {
			return $.Deferred().resolve('').promise();
		}
		var query = parts[1] + ' ' + parts[0];
		return $.getJSON(mw.util.wikiScript('api'), {
			action: 'query',
			list: 'search',
			srsearch: query,
			srnamespace: 0,
			srlimit: 8,
			format: 'json'
		}).then(function (data) {
			var hits = (data.query && data.query.search) || [];
			var first = parts[0].toLowerCase();
			var last = parts[1].toLowerCase();
			for (var i = 0; i < hits.length; i++) {
				var title = hits[i].title || '';
				var lower = title.toLowerCase();
				if (lower.indexOf(last) !== -1 && lower.indexOf(first) !== -1 && /\(\d{5,}\)/.test(title)) {
					return title;
				}
			}
			return hits.length ? hits[0].title : '';
		});
	}

	function refreshOptions() {
		var file = basename($filename.val());
		var isPhoto = PHOTO_EXT.test(file);
		var isDoc = DOC_EXT.test(file);

		$profile.closest('div').toggle(isPhoto || !file);
		if (isDoc) {
			$profile.prop('checked', false);
			$gallery.prop('checked', true);
		} else if (isPhoto) {
			$gallery.prop('checked', false);
		}

		if (!file) {
			return;
		}
		guessSoldier(file).done(function (title) {
			if (title && !$soldier.val()) {
				$soldier.val(title);
			}
			if (isPhoto && title) {
				$profile.prop('checked', true);
			}
		});
	}

	$filename.on('change input', refreshOptions);
	refreshOptions();
});