User:Gary/wikicup viewer.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/*
	Wikicup Viewer
	
	TODO Highlight cells based on who has the most for each type.
*/
function wikicupSorter()
{
	if (mw.config.get('wgPageName') != 'Wikipedia:WikiCup') return false;

	mw.util.addCSS('.wikicup-failing td { background-color: #fee; }\
		.wikicup-passing td { background-color: #efe; }\
		.wikicup-self td { background-color: #ffe; }\
		.key-table { float: left; }\
		.viewer-information { float: left; margin-left: 2.5em; background-color: #eee; padding: 10px; }\
		.viewer-information-header { font-weight: bold; font-size: 1.25em; }\
	');
	
	// Script might be broken during the transition periods between rounds
	var today = new Date();
	var thisYear = today.getFullYear();
	
	// Round 1
	var topContestants = 64;
	var topWildcards = 0;
	
	function setCutoff(date, contestants, wildcards)
	{
		if (today >= new Date(thisYear + '-' + date)) topContestants = contestants, topWildcards = wildcards;
	}
	
	setCutoff('03-01', 2, 16); // Round 2
	setCutoff('05-01', 2, 8); // Round 3
	setCutoff('07-01', 2, 4); // Round 4
	setCutoff('09-01', 1, 0); // Round 5
	
	var score = $('.headerSort[abbr=Score]').click().click();
	var username = mw.config.get('wgUserName');
	
	// Self: #ffe, passing: #efe, failing: #fee
	score.each(function()
	{
		var contestantCount = 0;
		$(this).parent().parent().next().children().each(function()
		{
			var contestant = $(this);
			contestant.addClass('wikicup-contestant');
			if (contestant.text().match(username)) contestant.addClass('wikicup-self');
			
			if (contestantCount < topContestants) contestant.addClass('wikicup-passing'); // Passing
			else contestant.addClass('wikicup-failing'); // Failing

			contestantCount++;
		});
	});

	// Now do the wildcards
	var failingScores = [];
	$('.wikicup-failing').each(function()
	{
		failingScores.push([$(this), $(this).children(':last').text()]);
	});

	// Sort failing scores by score
	failingScores.sort(function (a, b)
	{
		if (parseInt(a[1]) < parseInt(b[1])) return 1;
		else if (parseInt(a[1]) == parseInt(b[1])) return 0;
		else return -1;
	});
	
	var wildcards = failingScores.slice(0, topWildcards);
	var minWildcardScore;
	
	if (wildcards.length >= 1) minWildcardScore = parseInt(wildcards[wildcards.length - 1][1]);
	else minWildcardScore = 'Unknown';
	
	for (var i = 0; i < wildcards.length; i++)
	{
		wildcards[i][0].addClass('wikicup-passing');
	}
	
	/*
		Extra data to add next to the Key for the page
	*/
	var keyTable = $('#Key').parent().next();
	keyTable.addClass('key-table');
	keyTable.after('<div class="viewer-information"><span class="viewer-information-header">WikiCup Viewer information</span><ul><li><strong>Minimum score required as a wildcard:</strong> ' + minWildcardScore + ' points</li></ul></div><div style="clear: left;"></div>');
}

addOnloadHook(wikicupSorter); // addOnloadHook necessary to allow table to be sortable first