<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FTheThomanski%2FEsc</id>
	<title>Module:Sandbox/TheThomanski/Esc - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FTheThomanski%2FEsc"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/TheThomanski/Esc&amp;action=history"/>
	<updated>2026-05-12T00:19:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/TheThomanski/Esc&amp;diff=146297&amp;oldid=prev</id>
		<title>imported&gt;TheThomanski at 15:28, 16 July 2021</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/TheThomanski/Esc&amp;diff=146297&amp;oldid=prev"/>
		<updated>2021-07-16T15:28:14Z</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;----- Cell colors -----&lt;br /&gt;
local COL_FST = &amp;#039;gold&amp;#039;			-- 1st place&lt;br /&gt;
local COL_SND = &amp;#039;silver&amp;#039;		-- 2nd place&lt;br /&gt;
local COL_TRD = &amp;#039;#C96&amp;#039;			-- 3rd place&lt;br /&gt;
local COL_LST = &amp;#039;#FE8080&amp;#039;		-- Last place&lt;br /&gt;
local COL_SFQ = &amp;#039;navajowhite&amp;#039;	-- Semi-Final qualifier&lt;br /&gt;
local COL_BJQ = &amp;#039;paleturquoise&amp;#039;	-- Backup jury qualifier&lt;br /&gt;
local COL_DSQ = &amp;#039;#A4EAA9&amp;#039;		-- Disqualifed / withdrawn entry&lt;br /&gt;
&lt;br /&gt;
----- Text -----&lt;br /&gt;
local AQ         = &amp;#039;Automatic qualifier&amp;#039;&lt;br /&gt;
local NQ         = &amp;#039;Failed to qualify&amp;#039;&lt;br /&gt;
local NOSEMI     = &amp;#039;No semi-finals&amp;#039;&lt;br /&gt;
local NA         = &amp;#039;N/A&amp;#039;&lt;br /&gt;
local MILLSTREET = &amp;#039;Kvalifikacija za Millstreet&amp;#039;&lt;br /&gt;
local ESC1996Q   = &amp;#039;Eurovision Song Contest 1996#Qualifying round&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local amountOfEntries&lt;br /&gt;
local usedLanguages = {}&lt;br /&gt;
&lt;br /&gt;
function p.entry(f)		return main(f, &amp;#039;entry&amp;#039;)		end&lt;br /&gt;
function p.year(f)		return main(f, &amp;#039;year&amp;#039;)		end&lt;br /&gt;
function p.country(f)	return main(f, &amp;#039;country&amp;#039;)	end&lt;br /&gt;
function p.list(f)		return main(f, &amp;#039;list&amp;#039;)		end&lt;br /&gt;
&lt;br /&gt;
function main(f, reqOutput)&lt;br /&gt;
	local args = getArgs(f)&lt;br /&gt;
	local html = &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local contest = getContest(args[&amp;#039;cont&amp;#039;])&lt;br /&gt;
	local id      = args[&amp;#039;id&amp;#039;]&lt;br /&gt;
	local country = args[&amp;#039;cnty&amp;#039;]&lt;br /&gt;
	local year    = args[&amp;#039;y&amp;#039;]&lt;br /&gt;
	local show    = args[&amp;#039;s&amp;#039;]&lt;br /&gt;
	local entryNo = args[&amp;#039;no&amp;#039;]&lt;br /&gt;
	local sortMethod = &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	if not show    then show = &amp;#039;gf&amp;#039; end&lt;br /&gt;
	if not entryNo then entryNo = 1 end&lt;br /&gt;
	if show == &amp;#039;gf&amp;#039; then sortMethod = &amp;#039;draw&amp;#039; end&lt;br /&gt;
	&lt;br /&gt;
	local entries&lt;br /&gt;
	if reqOutput == &amp;#039;year&amp;#039; or reqOutput == &amp;#039;list&amp;#039; then	-- Get all entries from country&lt;br /&gt;
		entries = getAllEntriesFrom{contest=contest.id, from=&amp;#039;year&amp;#039;, year=year, show=show, sortMethod=sortMethod}&lt;br /&gt;
	elseif reqOutput == &amp;#039;country&amp;#039; then					-- Get all entries from year&lt;br /&gt;
		entries = getAllEntriesFrom{contest=contest.id, from=&amp;#039;country&amp;#039;, country=country}&lt;br /&gt;
	else end&lt;br /&gt;
	amountOfEntries = tableLen(entries)&lt;br /&gt;
	&lt;br /&gt;
	local function getEntryNo(entry)&lt;br /&gt;
		local entryNo = 1&lt;br /&gt;
		if entry.cntye then&lt;br /&gt;
			entryNo = entry.cntye&lt;br /&gt;
		end&lt;br /&gt;
		return entryNo&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if reqOutput == &amp;#039;entry&amp;#039; then&lt;br /&gt;
		if country and year then&lt;br /&gt;
			html = table.concat(createEntryRow{reqOutput=reqOutput, contest=contest, entryNo=entryNo, country=country, year=year})&lt;br /&gt;
		elseif id then&lt;br /&gt;
			entryNo = getEntryNo(getEntry{contest=contest, id=id})&lt;br /&gt;
			html = table.concat(createEntryRow{reqOutput=reqOutput, contest=contest, entryNo=entryNo, id=id})&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for _, entry in ipairs(entries) do&lt;br /&gt;
			entryNo = getEntryNo(entry)&lt;br /&gt;
			html = html .. table.concat(createEntryRow{reqOutput=reqOutput, contest=contest, show=show, entryNo=entryNo, country=entry.cnty, year=entry.y})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local row = 0&lt;br /&gt;
local spannedRows = {}&lt;br /&gt;
local spannedCols = {}&lt;br /&gt;
function createEntryRow(args)&lt;br /&gt;
	local html = {}&lt;br /&gt;
	local f    = mw.getCurrentFrame()&lt;br /&gt;
	&lt;br /&gt;
	local contest   = args.contest&lt;br /&gt;
	local year      = args.year&lt;br /&gt;
	local country   = args.country&lt;br /&gt;
	if country and country[&amp;#039;name&amp;#039;] then&lt;br /&gt;
		for i, name in ipairs(country[&amp;#039;name&amp;#039;]) do&lt;br /&gt;
			if name[2] then&lt;br /&gt;
				if contest.dates[tostring(year)] &amp;lt; name[2] then&lt;br /&gt;
					country = name[1]&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			country = name[1]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local id        = args.id&lt;br /&gt;
	local entryNo   = args.entryNo&lt;br /&gt;
	local reqOutput = args.reqOutput&lt;br /&gt;
	local show      = args.show&lt;br /&gt;
	&lt;br /&gt;
	local entry&lt;br /&gt;
	if country and year then&lt;br /&gt;
		entry = getEntry{contest=contest, country=country, year=year, entryNo=entryNo}&lt;br /&gt;
	elseif id then&lt;br /&gt;
		entry = getEntry{contest=contest, id=id}&lt;br /&gt;
	end&lt;br /&gt;
	if entry then&lt;br /&gt;
		row = row + 1&lt;br /&gt;
		spannedCols = {}&lt;br /&gt;
		&lt;br /&gt;
		local id = entry.id&lt;br /&gt;
		local year = f:expandTemplate{title = &amp;#039;Escyr&amp;#039;, args = {entry.y, entry.c.id}}&lt;br /&gt;
		local draw&lt;br /&gt;
		local sf_draw = insertZeroBeforeSingleDigit(entry.sf_d)&lt;br /&gt;
		local gf_draw = insertZeroBeforeSingleDigit(entry.gf_d)&lt;br /&gt;
		if not sf_draw then sf_draw = entry.sf_h end&lt;br /&gt;
		if not gf_draw then gf_draw = entry.gf_h end&lt;br /&gt;
		local pl, pt&lt;br /&gt;
		local sf_pl = entry.sf_pl&lt;br /&gt;
		local gf_pl = entry.gf_pl&lt;br /&gt;
		local sf_pt = entry.sf_pt&lt;br /&gt;
		local gf_pt = entry.gf_pt&lt;br /&gt;
		if show then&lt;br /&gt;
			if show == &amp;#039;gf&amp;#039; then&lt;br /&gt;
				draw = gf_draw&lt;br /&gt;
				pl   = gf_pl&lt;br /&gt;
				pt   = gf_pt&lt;br /&gt;
			else&lt;br /&gt;
				draw = sf_draw&lt;br /&gt;
				pl   = sf_pl&lt;br /&gt;
				pt   = sf_pt&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if sf_draw then&lt;br /&gt;
				if gf_draw then&lt;br /&gt;
					-- Took part in both semi-final and grand-final&lt;br /&gt;
					pl = gf_pl&lt;br /&gt;
					pt = gf_pt&lt;br /&gt;
					draw = gf_draw&lt;br /&gt;
				else&lt;br /&gt;
					-- Only took part in semi-final&lt;br /&gt;
					pl = sf_pl&lt;br /&gt;
					pt = sf_pt&lt;br /&gt;
					draw = sf_draw&lt;br /&gt;
				end&lt;br /&gt;
			elseif gf_draw then&lt;br /&gt;
				-- Only took part in grand final&lt;br /&gt;
				pl = gf_pl&lt;br /&gt;
				pt = gf_pt&lt;br /&gt;
				draw = gf_draw&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local flag&lt;br /&gt;
		if entry.cnty[&amp;#039;flag&amp;#039;] then&lt;br /&gt;
			for _, version in ipairs(entry.cnty[&amp;#039;flag&amp;#039;]) do&lt;br /&gt;
				if contest.dates[tostring(entry.y)] &amp;lt; version[2] then&lt;br /&gt;
					flag = version[1]&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		country = f:expandTemplate{title = &amp;#039;Esc&amp;#039;, args = {country, flag, y = entry.y}}&lt;br /&gt;
		local country_entry = getEntryNoFromCountry(contest, id)&lt;br /&gt;
		local artist = entry.art&lt;br /&gt;
		local song   = entry.song&lt;br /&gt;
		&lt;br /&gt;
		local lang = {}&lt;br /&gt;
		local function createLangLink(songLang)&lt;br /&gt;
			if songLang[2] then&lt;br /&gt;
				songLang = &amp;#039;[[&amp;#039; .. songLang[1] .. &amp;#039;|&amp;#039; .. songLang[2] .. &amp;#039;]]&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				songLang = &amp;#039;[[&amp;#039; .. songLang[1] .. &amp;#039;]]&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			return songLang&lt;br /&gt;
		end&lt;br /&gt;
		for _, songLang in ipairs(entry.lang) do&lt;br /&gt;
			if usedLanguages[1] then&lt;br /&gt;
				local found = false&lt;br /&gt;
				for _, usedLang in ipairs(usedLanguages) do&lt;br /&gt;
					if songLang[1] == usedLang then&lt;br /&gt;
						if songLang[2] then&lt;br /&gt;
							table.insert(lang, songLang[2])&lt;br /&gt;
						else&lt;br /&gt;
							table.insert(lang, songLang[1])&lt;br /&gt;
						end&lt;br /&gt;
						found = true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not found then&lt;br /&gt;
					table.insert(lang, createLangLink(songLang))&lt;br /&gt;
					table.insert(usedLanguages, songLang[1])&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(lang, createLangLink(songLang))&lt;br /&gt;
				table.insert(usedLanguages, songLang[1])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if reqOutput == &amp;#039;entry&amp;#039; then&lt;br /&gt;
			entryData	  = {artist, song}&lt;br /&gt;
			entryDataText = {&amp;#039;artist&amp;#039;, &amp;#039;song&amp;#039;}&lt;br /&gt;
			replaceNilValues(entryData, entryData)&lt;br /&gt;
		elseif reqOutput == &amp;#039;year&amp;#039; then&lt;br /&gt;
			entryData	  = {draw, country, artist, song, lang, pl, pt}&lt;br /&gt;
			entryDataText = {&amp;#039;draw&amp;#039;, &amp;#039;country&amp;#039;, &amp;#039;artist&amp;#039;, &amp;#039;song&amp;#039;, &amp;#039;lang&amp;#039;, &amp;#039;pl&amp;#039;, &amp;#039;pt&amp;#039;}&lt;br /&gt;
			replaceNilValues(entryData, entryData)&lt;br /&gt;
		elseif reqOutput == &amp;#039;country&amp;#039; then&lt;br /&gt;
			entryData	  = {year, artist, song, lang, gf_pl, gf_pt, sf_pl, sf_pt}&lt;br /&gt;
			entryDataText = {&amp;#039;year&amp;#039;, &amp;#039;artist&amp;#039;, &amp;#039;song&amp;#039;, &amp;#039;lang&amp;#039;, &amp;#039;gf_pl&amp;#039;, &amp;#039;gf_pt&amp;#039;, &amp;#039;sf_pl&amp;#039;, &amp;#039;sf_pt&amp;#039;}&lt;br /&gt;
			replaceNilValues(entryData, entryDataText)&lt;br /&gt;
		elseif reqOutput == &amp;#039;list&amp;#039; then&lt;br /&gt;
			entryData	  = {id, draw, country, country_entry, artist, song, lang, pl}&lt;br /&gt;
			entryDataText = {&amp;#039;id&amp;#039;, &amp;#039;draw&amp;#039;, &amp;#039;country&amp;#039;, &amp;#039;country_entry&amp;#039;, &amp;#039;artist&amp;#039;, &amp;#039;song&amp;#039;, &amp;#039;lang&amp;#039;, &amp;#039;pl&amp;#039;}&lt;br /&gt;
			replaceNilValues(entryData, entryData)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local function isNil(row)&lt;br /&gt;
			if entryData[row] == &amp;#039;nil_&amp;#039; .. row then&lt;br /&gt;
				return true&lt;br /&gt;
			else&lt;br /&gt;
				return false&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local tr = &amp;#039;&amp;lt;tr&amp;gt;\n&amp;#039; -- Default no row styling&lt;br /&gt;
		&lt;br /&gt;
		local rowStyling = &amp;#039;&amp;#039;&lt;br /&gt;
		if reqOutput == &amp;#039;year&amp;#039; then&lt;br /&gt;
			if (show == &amp;#039;gf&amp;#039;) and gf_pl == 1 then&lt;br /&gt;
				rowStyling = &amp;#039;font-weight:bold; background:&amp;#039; .. COL_FST .. &amp;#039;;&amp;#039;&lt;br /&gt;
			elseif (show == &amp;#039;sf&amp;#039; or show == &amp;#039;sf1&amp;#039; or show == &amp;#039;sf2&amp;#039;) and (gf_draw or entry.q) then&lt;br /&gt;
				if entry.jury then&lt;br /&gt;
					rowStyling = &amp;#039;font-weight:bold; background:&amp;#039; .. COL_BJQ .. &amp;#039;;&amp;#039;&lt;br /&gt;
				else&lt;br /&gt;
					rowStyling = &amp;#039;font-weight:bold; background:&amp;#039; .. COL_SFQ .. &amp;#039;;&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		tr = &amp;#039;&amp;lt;tr style=&amp;quot;&amp;#039; .. rowStyling .. &amp;#039;&amp;quot;&amp;gt;\n&amp;#039; &lt;br /&gt;
		&lt;br /&gt;
		table.insert(html, tr)&lt;br /&gt;
		&lt;br /&gt;
		if entryData then&lt;br /&gt;
			for i, data in ipairs(entryData) do&lt;br /&gt;
				if not getIndex(spannedRows, row) and not getIndex(spannedCols, entryDataText[i]) then&lt;br /&gt;
					local cellStyling = &amp;#039;&amp;#039;&lt;br /&gt;
					if type(data) == &amp;#039;string&amp;#039; and string.sub(data, 1, 4) == &amp;#039;nil_&amp;#039; then -- If the value is nil&lt;br /&gt;
						data = nil&lt;br /&gt;
						if reqOutput == &amp;#039;country&amp;#039; then&lt;br /&gt;
							local gf_pl = getIndex(entryDataText, &amp;#039;gf_pl&amp;#039;)&lt;br /&gt;
							local gf_pt = getIndex(entryDataText, &amp;#039;gf_pt&amp;#039;)&lt;br /&gt;
							local sf_pl = getIndex(entryDataText, &amp;#039;sf_pl&amp;#039;)&lt;br /&gt;
							local sf_pt = getIndex(entryDataText, &amp;#039;sf_pt&amp;#039;)&lt;br /&gt;
							local colspan = 1&lt;br /&gt;
							if not entry.id and entry.dq then&lt;br /&gt;
								if entryDataText[i] == &amp;#039;gf_pl&amp;#039; then&lt;br /&gt;
									if entry.y == 2020 then&lt;br /&gt;
										data = &amp;#039;Contest cancelled&amp;#039;&lt;br /&gt;
									else&lt;br /&gt;
										data = entry.dq&lt;br /&gt;
									end&lt;br /&gt;
									data = data .. &amp;#039; &amp;lt;b&amp;gt;X&amp;lt;/b&amp;gt;&amp;#039;&lt;br /&gt;
									colspan = 4&lt;br /&gt;
								else break end&lt;br /&gt;
							else&lt;br /&gt;
								if gf_pt and isNil(gf_pt) then -- If no gf points&lt;br /&gt;
									if not isNil(sf_pl) or not isNil(sf_pt) then&lt;br /&gt;
										if entryDataText[i] == &amp;#039;gf_pl&amp;#039; and gf_pl and isNil(gf_pl) then -- If no gf points and no gf placement&lt;br /&gt;
											data = NQ&lt;br /&gt;
											if contest.id == &amp;#039;esc&amp;#039; then&lt;br /&gt;
												if entry.y == 1993 then data = &amp;#039;[[&amp;#039; .. MILLSTREET .. &amp;#039;|&amp;#039; .. NQ .. &amp;#039;]] &amp;lt;b&amp;gt;X&amp;lt;/b&amp;gt;&amp;#039; end&lt;br /&gt;
												if entry.y == 1996 then data = &amp;#039;[[&amp;#039; .. ESC1996Q   .. &amp;#039;|&amp;#039; .. NQ .. &amp;#039;]] &amp;lt;b&amp;gt;X&amp;lt;/b&amp;gt;&amp;#039; end&lt;br /&gt;
											end&lt;br /&gt;
											colspan = 2&lt;br /&gt;
										end&lt;br /&gt;
									else&lt;br /&gt;
										if entryDataText[i] == &amp;#039;gf_pt&amp;#039; and not isNil(gf_pl) then  -- If no gf points but there is placement (e.g. ESC 1956)&lt;br /&gt;
											data = NA&lt;br /&gt;
										end&lt;br /&gt;
									end&lt;br /&gt;
								elseif not gf_pt then&lt;br /&gt;
									if entryDataText[i] == &amp;#039;gf_pl&amp;#039; and gf_pl and isNil(gf_pl) then -- If no gf points and no gf placement&lt;br /&gt;
										data = NQ&lt;br /&gt;
									end&lt;br /&gt;
								end&lt;br /&gt;
								if entryDataText[i] == &amp;#039;sf_pl&amp;#039; and sf_pl then&lt;br /&gt;
									if isNil(sf_pl) then -- if no semi results&lt;br /&gt;
										if contest.id == &amp;#039;esc&amp;#039; and entry.y == 1993 then&lt;br /&gt;
											data = f:expandTemplate{title = &amp;#039;Nowrap&amp;#039;, args = {&amp;#039;[[&amp;#039; .. MILLSTREET .. &amp;#039;]]&amp;#039;}}&lt;br /&gt;
											colspan = 2&lt;br /&gt;
										elseif contest.id == &amp;#039;esc&amp;#039; and entry.y &amp;gt;= 2004 then&lt;br /&gt;
											if (not isNil(gf_pl) and not isNil(gf_pt)) or entry.q then&lt;br /&gt;
												data = AQ&lt;br /&gt;
												colspan = 2&lt;br /&gt;
											end&lt;br /&gt;
										else&lt;br /&gt;
											data = NOSEMI&lt;br /&gt;
											colspan = 2&lt;br /&gt;
										end&lt;br /&gt;
									end&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							if data then&lt;br /&gt;
								cellStyling = f:expandTemplate{title = &amp;#039;N/a&amp;#039;}&lt;br /&gt;
							else&lt;br /&gt;
								data = &amp;#039;&amp;#039;&lt;br /&gt;
							end&lt;br /&gt;
							if colspan &amp;gt; 1 then&lt;br /&gt;
								cellStyling = cellStyling .. &amp;#039;; colspan=&amp;quot;&amp;#039; .. colspan .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
								if data == rowspanData then&lt;br /&gt;
									cellStyling = cellStyling .. &amp;#039;; rowspan=&amp;quot;&amp;#039; .. spannedRows .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
									--cellStyling = cellStyling .. &amp;#039;; colspan=&amp;quot;2&amp;quot;&amp;#039;&lt;br /&gt;
									table.insert(spannedRows, row + 1)&lt;br /&gt;
								else&lt;br /&gt;
									spannedRows = 1&lt;br /&gt;
								end&lt;br /&gt;
								table.insert(spannedCols, entryDataText[i + 1])&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						if not data then data = &amp;#039;&amp;#039; end&lt;br /&gt;
					elseif entryDataText[i] == &amp;#039;id&amp;#039; or entryDataText[i] == &amp;#039;country_entry&amp;#039; then&lt;br /&gt;
						cellStyling = &amp;#039;text-align:right&amp;#039;&lt;br /&gt;
						if show == &amp;#039;gf&amp;#039; and sf_draw then&lt;br /&gt;
							data = &amp;#039;&amp;lt;small&amp;gt;&amp;lt;i&amp;gt;&amp;#039; .. data .. &amp;#039;&amp;lt;/i&amp;gt;&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
						end&lt;br /&gt;
					elseif entryDataText[i] == &amp;#039;draw&amp;#039; then&lt;br /&gt;
						if (show == &amp;#039;gf&amp;#039; and not entry.gf_d and entry.gf_h) or (show == &amp;#039;sf1&amp;#039; or show == &amp;#039;sf2&amp;#039; or show == &amp;#039;sf&amp;#039; and not entry.gf_d and entry.gf_h) then&lt;br /&gt;
							if data == 1 then data = &amp;#039;&amp;lt;b&amp;gt;1st half&amp;lt;/b&amp;gt;&amp;#039; end&lt;br /&gt;
							if data == 2 then data = &amp;#039;&amp;lt;b&amp;gt;2nd half&amp;lt;/b&amp;gt;&amp;#039; end&lt;br /&gt;
						end&lt;br /&gt;
						cellStyling = &amp;#039;text-align:center&amp;#039;&lt;br /&gt;
					elseif entryDataText[i] == &amp;#039;year&amp;#039; then -- Year column&lt;br /&gt;
						cellStyling = &amp;#039;text-align:center&amp;#039;&lt;br /&gt;
					elseif entryDataText[i] == &amp;#039;song&amp;#039; then&lt;br /&gt;
						local title = song&lt;br /&gt;
						local og_title = &amp;#039;&amp;#039;&lt;br /&gt;
						if entry.tlang then -- If it&amp;#039;s a non-English song title&lt;br /&gt;
							if entry.og then -- If it&amp;#039;s a transliterated title&lt;br /&gt;
								title = f:expandTemplate{title = &amp;#039;Transl&amp;#039;, args = {entry.tlang, title, italics = &amp;#039;no&amp;#039;}}&lt;br /&gt;
								og_title = &amp;#039;&amp;lt;small&amp;gt;(&amp;#039; .. f:expandTemplate{title = &amp;#039;Lang&amp;#039;, args = {entry.tlang, entry.og, italics = &amp;#039;no&amp;#039;}} .. &amp;#039;)&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
							else&lt;br /&gt;
								title = f:expandTemplate{title = &amp;#039;Lang&amp;#039;, args = {entry.tlang, title, italics = &amp;#039;no&amp;#039;}}&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						data = &amp;#039;&amp;quot;&amp;#039; .. title .. &amp;#039;&amp;quot; &amp;#039; .. og_title&lt;br /&gt;
					elseif entryDataText[i] == &amp;#039;lang&amp;#039; then&lt;br /&gt;
						if type(data) == &amp;#039;table&amp;#039; then&lt;br /&gt;
							data = processTable(data)&lt;br /&gt;
						end&lt;br /&gt;
						if entry.langm then -- If there are &amp;#039;minor&amp;#039; languages&lt;br /&gt;
							local function createNote(lang)&lt;br /&gt;
								lang = createLangLink(lang)&lt;br /&gt;
								data = data .. f:expandTemplate{title = &amp;#039;Efn&amp;#039;, args = {&amp;#039;Contains words or phrases in &amp;#039; .. lang, name=lang}}&lt;br /&gt;
							end&lt;br /&gt;
							if type(entry.langm) == &amp;#039;table&amp;#039; then&lt;br /&gt;
								for _, v in ipairs(entry.langm) do&lt;br /&gt;
									createNote(v)&lt;br /&gt;
								end&lt;br /&gt;
							else&lt;br /&gt;
								createNote(langm)&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					elseif entryDataText[i] == &amp;#039;pl&amp;#039;	or entryDataText[i] == &amp;#039;pt&amp;#039;	or entryDataText[i] == &amp;#039;gf_pl&amp;#039; or entryDataText[i] == &amp;#039;gf_pt&amp;#039; or entryDataText[i] == &amp;#039;sf_pl&amp;#039; or entryDataText[i] == &amp;#039;sf_pt&amp;#039;	then&lt;br /&gt;
						cellStyling = &amp;#039;text-align:right;&amp;#039;&lt;br /&gt;
						if reqOutput == &amp;#039;list&amp;#039; or reqOutput == &amp;#039;country&amp;#039; then&lt;br /&gt;
							if reqOutput == &amp;#039;country&amp;#039; then&lt;br /&gt;
								if entryDataText[i] == &amp;#039;gf_pl&amp;#039; or entryDataText[i] == &amp;#039;gf_pt&amp;#039; then&lt;br /&gt;
									show = &amp;#039;gf&amp;#039;&lt;br /&gt;
								elseif entryDataText[i] == &amp;#039;sf_pl&amp;#039; or entryDataText[i] == &amp;#039;sf_pt&amp;#039; then&lt;br /&gt;
									semi = getSemi(contest, entry.id)&lt;br /&gt;
									if semi then&lt;br /&gt;
										show = semi&lt;br /&gt;
									end&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							if show then&lt;br /&gt;
								calcAmountOfEntries(contest.id, entry.y, show)&lt;br /&gt;
							end&lt;br /&gt;
							if ((entryDataText[i] == &amp;#039;sf_pl&amp;#039; or entryDataText[i] == &amp;#039;sf_pt&amp;#039;) and sf_pl == amountOfEntries) or&lt;br /&gt;
							   ((entryDataText[i] == &amp;#039;gf_pl&amp;#039; or entryDataText[i] == &amp;#039;gf_pt&amp;#039;) and gf_pl == amountOfEntries) or&lt;br /&gt;
							   ((entryDataText[i] == &amp;#039;pl&amp;#039; or entryDataText[i] == &amp;#039;pt&amp;#039;) and pl == amountOfEntries) then&lt;br /&gt;
								cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_LST .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
								--data = tostring(data) .. &amp;#039; ◁&amp;#039;&lt;br /&gt;
							else&lt;br /&gt;
								if show == &amp;#039;gf&amp;#039; or reqOutput == &amp;#039;country&amp;#039; then&lt;br /&gt;
									local pl = gf_pl&lt;br /&gt;
									if entryDataText[i] == &amp;#039;sf_pl&amp;#039; or entryDataText[i] == &amp;#039;sf_pt&amp;#039; then pl = sf_pl end&lt;br /&gt;
									if pl == 1 then cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_FST .. &amp;#039;&amp;quot;&amp;#039; end&lt;br /&gt;
									if pl == 2 then cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_SND .. &amp;#039;&amp;quot;&amp;#039; end&lt;br /&gt;
									if pl == 3 then cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_TRD .. &amp;#039;&amp;quot;&amp;#039; end&lt;br /&gt;
								elseif (show == &amp;#039;sf&amp;#039; or show == &amp;#039;sf1&amp;#039; or show == &amp;#039;sf2&amp;#039;) and (gf_pl or gf_pt) then&lt;br /&gt;
									if entry.jury then&lt;br /&gt;
										cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_BJQ ..  &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
										--data = tostring(data) .. &amp;#039; ‡&amp;#039;&lt;br /&gt;
									else&lt;br /&gt;
										cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_SFQ ..  &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
										--data = tostring(data) .. &amp;#039; †&amp;#039;&lt;br /&gt;
									end&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						if data == 0 then data = &amp;#039;&amp;lt;b&amp;gt;&amp;#039; .. data .. &amp;#039;&amp;lt;/b&amp;gt;&amp;#039; end -- Make digit bold if nul points&lt;br /&gt;
					end&lt;br /&gt;
					if reqOutput == &amp;#039;country&amp;#039; and entryDataText[i] ~= &amp;#039;year&amp;#039; and entryDataText[i] ~= &amp;#039;sf_pl&amp;#039; and entryDataText[i] ~= &amp;#039;sf_pt&amp;#039; then&lt;br /&gt;
						calcAmountOfEntries(contest.id, entry.y, &amp;#039;gf&amp;#039;)&lt;br /&gt;
						local x = amountOfEntries&lt;br /&gt;
						if gf_pl == 1 then cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_FST end&lt;br /&gt;
						if gf_pl == 2 then cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_SND end&lt;br /&gt;
						if gf_pl == 3 then cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_TRD end&lt;br /&gt;
						if gf_pl == x then cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_LST end&lt;br /&gt;
						if entry.dq or entry.nq then cellStyling = cellStyling .. &amp;#039; background:&amp;#039; .. COL_DSQ end&lt;br /&gt;
					end&lt;br /&gt;
					if i == 1 then&lt;br /&gt;
						cell      = &amp;#039;&amp;lt;th style=&amp;quot;&amp;#039; .. rowStyling .. cellStyling .. &amp;#039;&amp;quot; scope=&amp;quot;row&amp;quot;&amp;gt;\n&amp;#039;&lt;br /&gt;
						cellClose = &amp;#039;&amp;lt;/th&amp;gt;\n&amp;#039;&lt;br /&gt;
					else&lt;br /&gt;
						cell      = &amp;#039;&amp;lt;td style=&amp;quot;&amp;#039; .. rowStyling .. cellStyling .. &amp;#039;&amp;quot;&amp;gt;\n&amp;#039;&lt;br /&gt;
						cellClose = &amp;#039;&amp;lt;/td&amp;gt;\n&amp;#039;&lt;br /&gt;
					end&lt;br /&gt;
					table.insert(html, cell .. data .. &amp;#039;&amp;lt;/td&amp;gt;\n&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(html, &amp;#039;&amp;lt;/tr&amp;gt;\n&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getContest(x)&lt;br /&gt;
	local contests = mw.loadData(&amp;#039;Module:Sandbox/TheThomanski/Esc/data&amp;#039;).contests&lt;br /&gt;
	&lt;br /&gt;
	local reqContest = &amp;#039;esc&amp;#039; -- Default ESC&lt;br /&gt;
	if x then&lt;br /&gt;
		reqContest = string.lower(x)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result&lt;br /&gt;
	for _, contest in ipairs(contests) do -- For every contest do&lt;br /&gt;
		if contest.id == reqContest then&lt;br /&gt;
			result = contest&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEntry(args)&lt;br /&gt;
	local result&lt;br /&gt;
	local contest = args.contest&lt;br /&gt;
	local country = args.country -- Table, macedonia&lt;br /&gt;
	local year    = args.year&lt;br /&gt;
	local id      = args.id&lt;br /&gt;
	local entryNo = args.entryNo -- For multiple entries per country in a year (e.g. ESC 1956)&lt;br /&gt;
	if type(contest) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		contest = getContest(contest)&lt;br /&gt;
	end&lt;br /&gt;
	for _, entry in ipairs(contest.values) do -- For every entry in the contest do&lt;br /&gt;
		result = nil&lt;br /&gt;
		if country and year then&lt;br /&gt;
			if (hasValue(entry.cnty, country)) then -- If the entry is from the requested country&lt;br /&gt;
				if (entry.y == year) then -- If the entry is from the requested year&lt;br /&gt;
					result = entry&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif id then&lt;br /&gt;
			if (entry.id == tonumber(id)) then -- If the entry is the requested entry then&lt;br /&gt;
				result = entry&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if result then&lt;br /&gt;
			if entryNo and entryNo &amp;gt; 1 then&lt;br /&gt;
				entryNo = entryNo - 1&lt;br /&gt;
			else&lt;br /&gt;
				return result&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getAllEntriesFrom(args)&lt;br /&gt;
	local contest = getContest(args.contest)&lt;br /&gt;
	local entries = {}&lt;br /&gt;
	&lt;br /&gt;
	local draw = 1&lt;br /&gt;
	local q_d = 0&lt;br /&gt;
	local firstEntry = nil&lt;br /&gt;
	for i, entry in ipairs(contest.values) do -- For every entry in the contest do&lt;br /&gt;
		if args.from == &amp;#039;year&amp;#039; and entry.y == tonumber(args.year) then -- Get all entries from year&lt;br /&gt;
			if args.show then&lt;br /&gt;
				if	(args.show == &amp;#039;sf&amp;#039; and entry.sf_d and not entry.sf) or -- Get all entries from Semi-Final&lt;br /&gt;
					(args.show == &amp;#039;sf1&amp;#039; and entry.sf == 1) or -- Get all entries from Semi-Final 1&lt;br /&gt;
					(args.show == &amp;#039;sf2&amp;#039; and entry.sf == 2) or -- Get all entries from Semi-Final 2&lt;br /&gt;
					(args.show == &amp;#039;gf&amp;#039; and (entry.gf_d or entry.q)) -- Get all entries from Grand Final&lt;br /&gt;
				then&lt;br /&gt;
					if args.show == &amp;#039;gf&amp;#039; and args.sortMethod == &amp;#039;draw&amp;#039; and entry.id then&lt;br /&gt;
						local found = false&lt;br /&gt;
						local oldEntry = entry.id&lt;br /&gt;
						local newEntry = entry.id&lt;br /&gt;
						if firstEntry == nil then&lt;br /&gt;
							firstEntry = entry&lt;br /&gt;
						end&lt;br /&gt;
						local gf_d = entry.gf_d&lt;br /&gt;
						while not found do&lt;br /&gt;
							if entry.q then&lt;br /&gt;
								q_d = q_d + 1&lt;br /&gt;
								gf_d = q_d&lt;br /&gt;
							end&lt;br /&gt;
							if gf_d == draw then&lt;br /&gt;
								table.insert(entries, entry)&lt;br /&gt;
								draw = draw + 1&lt;br /&gt;
								found = true&lt;br /&gt;
							else&lt;br /&gt;
								newEntry = newEntry + 1&lt;br /&gt;
								entry = getEntry{contest=contest, id=newEntry}&lt;br /&gt;
								if not entry or entry.y ~= firstEntry.y then&lt;br /&gt;
									entry = firstEntry&lt;br /&gt;
									newEntry = entry.id&lt;br /&gt;
								end&lt;br /&gt;
								gf_d = entry.gf_d&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						table.insert(entries, entry)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(entries, entry)&lt;br /&gt;
			end&lt;br /&gt;
		elseif args.from == &amp;#039;country&amp;#039; and hasValue(entry.cnty, args.country) then -- Get all entries from country&lt;br /&gt;
			table.insert(entries, entry)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return entries&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEntryNoFromCountry(contest, id)&lt;br /&gt;
	if id then&lt;br /&gt;
		local entry = getEntry{contest=contest, id=id}&lt;br /&gt;
		local country = entry.cnty&lt;br /&gt;
		if country[&amp;#039;name&amp;#039;] then country = country[&amp;#039;name&amp;#039;][1][1] end&lt;br /&gt;
		local entries = getAllEntriesFrom{contest=contest.id, from=&amp;#039;country&amp;#039;, country=country}&lt;br /&gt;
		local extraEntries = {} -- For more than one entry in a year (e.g. ESC 1956)&lt;br /&gt;
		for i, v in ipairs(entries) do&lt;br /&gt;
			if extraEntries[v.y] then&lt;br /&gt;
				extraEntries[v.y] = extraEntries[v.y] + 1&lt;br /&gt;
			else&lt;br /&gt;
				extraEntries[v.y] = 0&lt;br /&gt;
			end&lt;br /&gt;
			if v.id == entry.id then&lt;br /&gt;
				local removal = 0&lt;br /&gt;
				for _, v in pairs(extraEntries) do&lt;br /&gt;
					removal = removal + v&lt;br /&gt;
				end&lt;br /&gt;
				local result = i - removal&lt;br /&gt;
				if entry.cntye then&lt;br /&gt;
					result = result .. &amp;#039; &amp;lt;small&amp;gt;(&amp;#039; .. entry.cntye .. &amp;#039;)&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
				return result&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getSemi(contest, id)&lt;br /&gt;
	local entry = getEntry{contest=contest, id=id}&lt;br /&gt;
	if entry then&lt;br /&gt;
		if entry.sf then&lt;br /&gt;
			return &amp;#039;sf&amp;#039; .. tostring(entry.sf)	&lt;br /&gt;
		elseif entry.sf_d then&lt;br /&gt;
			return &amp;#039;sf&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function replaceNilValues(entryData, entryDataText)&lt;br /&gt;
	local length = tableLen(entryDataText)&lt;br /&gt;
	for i = 1, length do&lt;br /&gt;
		if not entryData[i] then&lt;br /&gt;
			entryData[i] = &amp;#039;nil_&amp;#039; .. i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function calcAmountOfEntries(contest, year, show)&lt;br /&gt;
	amountOfEntries = tableLen(getAllEntriesFrom{contest=contest, from=&amp;#039;year&amp;#039;, year=year, show=show})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function insertZeroBeforeSingleDigit(x)&lt;br /&gt;
	if x then&lt;br /&gt;
		if x &amp;lt; 10 then&lt;br /&gt;
			x = &amp;#039;0&amp;#039; .. x&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return x&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getIndex(tab, reqV)&lt;br /&gt;
	if type(tab) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		for i, v in ipairs(tab) do&lt;br /&gt;
			if v == reqV then&lt;br /&gt;
				return i&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function processTable(tab)&lt;br /&gt;
	local str = &amp;#039;&amp;#039;&lt;br /&gt;
	if type(tab) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		for i, v in ipairs(tab) do&lt;br /&gt;
			str = str .. v&lt;br /&gt;
			if i ~= tableLen(tab) then&lt;br /&gt;
				str = str .. &amp;#039;, &amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return str&lt;br /&gt;
	else return tab end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tableLen(tab)&lt;br /&gt;
  local x = 0&lt;br /&gt;
  if tab then&lt;br /&gt;
	  for _ in pairs(tab) do&lt;br /&gt;
	  	x = x + 1&lt;br /&gt;
	  end&lt;br /&gt;
  end&lt;br /&gt;
  return x&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function hasValue(tab, val)&lt;br /&gt;
	if tab then&lt;br /&gt;
		if type(tab) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		    for _, v in pairs(tab) do&lt;br /&gt;
		        if v == val or (type(v) == &amp;#039;table&amp;#039; and hasValue(v, val)) then&lt;br /&gt;
		            return val&lt;br /&gt;
		        end&lt;br /&gt;
		    end&lt;br /&gt;
		elseif type(tab) == &amp;#039;string&amp;#039; then&lt;br /&gt;
    		if tab == val then&lt;br /&gt;
    			return val&lt;br /&gt;
    		end&lt;br /&gt;
    	end&lt;br /&gt;
	end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;TheThomanski</name></author>
	</entry>
</feed>