وحدة:ملعب/Mr. Ibrahem/cy

من ويكيبيديا، الموسوعة الحرة
اذهب إلى: تصفح، ‏ ابحث

خطأ لوا: too many expensive function calls.

local p = {}
flag_table = {}
wiki = string.match(mw.site.server, "%a+")
if wiki == "www" then
	wiki = "fr"
	onwikidata = true
else
	onwikidata = false	
end

-- Classes declared as global --
-- Class of a cycling race. Class is: 1.UWT, 2.UWT, 1.HC, ... add new classes, no problem
class = { "Q22231106", "Q22231107", "Q22231108", "Q22231109", "Q22231110", "Q22231111", "Q22231112",
	"Q22231113", "Q22231114", "Q22231115", "Q22231116", "Q22231117", "Q22231118", "Q22231119", "Q23015458", "Q23005601", "Q23005603" } 
class_2x = {"Q22231107", "Q23005603", "Q22231115", "Q22231109", "Q22231112", "Q22231113", "Q22231117"} --multi stage races
class_sort={["Q22231106"]='01', ["Q22231107"]='01', ["Q23005601"]='01', ["Q23005603"]='01', ["Q22231115"]='01', -- 1.UWT, 2.UWT, 1.WWT, 2.WWT, 2.Ncup
		["Q22231114"]='02', ["Q22231109"]='03', ["Q22231108"]='04', ["Q22231112"]='05', ["Q22231110"]='06', -- 1.Ncup, 2.HC, 1.HC, 2.1, 1.1
		["Q22231113"]='07', ["Q22231117"]='07', ["Q22231111"]='08', ["Q22231116"]='08', ["Q22231119"]='09', --2.2, 2.2U, 1.2, 1.2U, CN
		
		["Q22231118"]='13', ["Q23015458"]='15' } 
stages = {'Q18131152', 'Q20646667', 'Q20646670', 'Q20680270', 'Q20646668', 'Q20679712', 'Q2348250', 'Q2266066', 'Q485321'}
	-- UCI Europe Tour,..., UCI ProTour, UCI World Calendar, UCI WorldTour, UCI Women’s WorldTour, UCI Women's Road World Rankings
UCI_Circuits = {'Q1194340', 'Q1063423', 'Q1063430', 'Q268357', 'Q1039648', 'Q1329578', 'Q12270097', 'Q635366', 'Q21075974', 'Q1693153'}




available, translations = pcall( require, "Module:Cycling race/lang" ) 
if available == true and type( translations.list ) == "function" then available_list = true else available_list = false end 
if available == true and type( translations.lang_priority ) == "table" then available_lang_priority = true else available_lang_priority = false end 

local textalign = "left"
local floattable = "left"
local floatinfobox = "right"
if wiki == "ar" or wiki == "fa" or wiki == "ur"	then 
	textalign = "right" 
	floattable = "right" 
	floatinfobox = "left" 
end

function Race_reference(entity)
	-- Allow to display the reference below the classifications --
	local bases={
	{"ProCyclingStats", "P2327", "http://www.procyclingstats.com/race.php?id="},
	{"Cycling Quotient", "P2648", "http://www.cqranking.com/men/asp/gen/race.asp?raceid="},
	{"Cycling Archives", "P2330", "http://www.siteducyclisme.net/ritfiche.php?ritid="},
	{"Cycling Quotient", "P2708", "http://www.cqranking.com/women/asp/gen/race.asp?raceid="}
	}
	local linklist =''
	local a,b
	for i, base in pairs(bases) do
		a, b =pcall(fooA, 'value', entity, base[2], 1) --  --
		if  a==true and b~=nil then
			if linklist=='' then
				linklist=linklist..'['..base[3]..b.." "..base[1]..']'
			else
				linklist=linklist..", "..'['..base[3]..b.." "..base[1]..']'
			end
		end
	end
	return linklist
end

function Calendar_translate(wiki, x) 
	local l10nDef = { }	
	l10nDef["ar"] = { "تقويم الاتحاد الدولي للدراجات", "التاريخ", "#", "السباق", "البلد", "الصنف", "الفائز", "الثاني", "الثالث", "متصدر الترتيب العام", "طواف العالم للدراجات للنساء", "", "طواف العالم للدراجات" , "طواف أوروبا للدراجات" , "طواف آسيا للدراجات" , "طواف أمريكا للدراجات" , "طواف أفريقيا للدراجات" , "طواف أوقيانوسيا للدراجات", "بطولات وطنية", "سباق الطريق", "سباق فردي ضد الساعة" }


	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["fr"] end  -- default
	return l10n[x]	
end 
function p.calendar(frame)
	----- function to display calendar óf any competition -----
	----- based on victories function -----
	----- author: psemdel -----
	local countryflagonlytemp, numberingtemp, displayclasstemp,onlywinnertemp
	local displayteamtemp, displayleadertemp
    local headertemp={}
    local data_typetemp={}
    local ll=1

	if frame.args[1] ~= nil then 
		calendarID=	string.gsub(frame.args[1], "%c", "") 
	end
	--date
	headertemp[ll]=2
	data_typetemp[ll] = ''
	ll=ll+1
	
	if frame.args[2] ~= nil then
		if tonumber(frame.args[2]) ==1 then
			numberingtemp =true
			headertemp[ll]=3
			data_typetemp[ll] = ''
			ll=ll+1
		else
			numberingtemp =false	
		end
	else
		numberingtemp=false
	end

	if frame.args[3] ~= nil then
		if tonumber(frame.args[3]) ==1 then
			countryflagonlytemp =false
		else
			countryflagonlytemp =true
		end
	else
		countryflagonlytemp=true
	end
	-- country --
	headertemp[ll]=5
	data_typetemp[ll] = ''
	ll=ll+1

	--race--
	headertemp[ll]=4
	data_typetemp[ll] = ''
	ll=ll+1

	if frame.args[4] ~= nil then
		if tonumber(frame.args[4]) ==1 then
			displayclasstemp =true
			headertemp[ll]=6
			data_typetemp[ll] = ''
			ll=ll+1
		else
			displayclasstemp =false	
		end
	else
		displayclasstemp =false	
	end

	if frame.args[5] ~= nil then
		if tonumber(frame.args[5]) ==1 then
			onlywinnertemp =false
			headertemp[ll]=7
			data_typetemp[ll] = ''
			ll=ll+1
			headertemp[ll]=8
			data_typetemp[ll] = ''
			ll=ll+1
			headertemp[ll]=9
			data_typetemp[ll] = ''
			ll=ll+1
		else
			onlywinnertemp =true
			headertemp[ll]=7
			data_typetemp[ll] = ''
			ll=ll+1
		end
	else
		onlywinnertemp=true
		headertemp[ll]=7
		data_typetemp[ll] = ''
		ll=ll+1
	end
	
	if frame.args[6] ~= nil then
		if tonumber(frame.args[6]) ==1 then
			displayleadertemp=true
			headertemp[ll]=10
			data_typetemp[ll] = ''
			ll=ll+1
		else
			displayleadertemp =false	
		end
	else
		displayleadertemp =false
	end

	if frame.args[7] ~= nil then
		if tonumber(frame.args[7]) ==1 then
			displayteamtemp =true
		else
			displayteamtemp =false	
		end
	else
		displayteamtemp =false
	end

	local s = {
		header_function = Calendar_translate, -- translations are in function victories_translate
		header_1 = 12, -- translation 1 in function victories_translate is printed in the upper part of the table header
		header_2 = headertemp,-- translations 2, 3, 4, 5, 6 in function victories_translate are printed in this order 
										-- in the lower part of the table header. The second value 3 in {4, 3} tells where the icon will go.
		country_column = 2,
		flag_column = 2, 
		data_sort_type = data_typetemp, -- see https://meta.wikimedia.org/wiki/Help:Sorting
		item = calendarID,
		property = 'P527',
		no_country = {},
		country = true,
		countryflagonly=countryflagonlytemp,
		error_message = 0,
		country = true,
		only_winner = onlywinnertemp, 
		numbering = numberingtemp,
		error_message = 0,
	    displayed_class =nil,
	    displayteam=displayteamtemp,
	    displayclass=displayclasstemp,
	    leadercolumn=displayleadertemp,
		
	}
	return tableA(s, calendar_main(s))
end

function p.WWTcalendar(frame)
	----- function to display UCI women calendar of one year ----
	----- based on victories function -----
	----- author: psemdel -----
	local year

	if frame.args[1] ~= nil then 
		year=	string.gsub(frame.args[1], "%c", "") 
	else
		year = "2018"
	end
	if  year == "2018" then calendarID="Q41787783"
	elseif  year == "2017" then calendarID="Q27431192" 
	elseif  year == "2016" then calendarID="Q21034783"
	end	--else nil

	local s = {
		header_function = Calendar_translate, -- translations are in function victories_translate
		header_1 = 11, -- translation 1 in function victories_translate is printed in the upper part of the table header
		
		header_2 = {2, 3,5, 4, 7, 8, 9, 10},-- translations 2, 3, 4, 5, 6 in function victories_translate are printed in this order 
 					-- in the lower part of the table header. The second value 3 in {4, 3} tells where the icon will go.
		country_column = 2,
		flag_column = 2, 
		data_sort_type ={'', 'unsortable', '', '', '','',''},   -- -- see https://meta.wikimedia.org/wiki/Help:Sorting
		item = calendarID,
		property = 'P527',
		no_country = {},
		country = true,
		countryflagonly=true,
		only_winner = false, 
		numbering = true,
		error_message = 0,
	    displayed_class = {"Q23005601","Q23005603"},
	    displayteam=false,
	    displayclass=false,
	    leadercolumn=true
	}
	return tableA(s, calendar_main(s))
end


function p.WTcalendar(frame)
	----- function to display UCI calendar of one year ----
	----- based on WWTcalendar function -----
	----- author: Mr. Ibrahem -----
	local calendarID = ""
	--frame = frame:getParent()
	UCI = {}
	UCI["world"] = { -- Q635366
		['2018'] = 'Q42317185',['2017'] = 'Q21857932',['2016'] = 'Q20970765', 
		['2015'] = 'Q18192726',['2014'] = 'Q14979277',['2013'] = 'Q1031504', 
		['2012'] = 'Q849059', ['2011'] = 'Q849092'
		}
	UCI["europe"] = { -- Q1194340	
		['2018'] = 'Q44497477',['2017'] = 'Q27915850',['2016'] = 'Q21029681',
		['2015'] = 'Q18342122',['2014'] = 'Q15041668',['2013'] = 'Q1280387',
		['2012'] = 'Q961709',['2010–11'] = 'Q751208',['2009–10'] = 'Q212197',
		['2008–09'] = 'Q1811548',['2007–08'] = 'Q1788011',['2006–07'] = 'Q1780660',
		['2005–06'] = 'Q1455600',['2005'] = 'Q1431816'
		}
	UCI["asia"] = { -- Q1063423
		['2018'] = 'Q42204070',['2017'] = 'Q27679728',['2016'] = 'Q21622227',
		['2015'] = 'Q18341318',['2013–14'] = 'Q15041671',['2012–13'] = 'Q1606048',
		['2011–12'] = 'Q2117797',['2010–11'] = 'Q633349',['2009–10'] = 'Q630798',
		['2008–09'] = 'Q565160',['2007–08'] = 'Q1506934',['2006–07'] = 'Q966011',
		['2005–06'] = 'Q459817',['2005'] = 'Q469479',
		}
	UCI["america"] = { -- Q1063430
		['2018'] = 'Q42199340',['2017'] = 'Q27704415',['2016'] = 'Q21621040',['2015'] = 'Q18413668',
		['2013–14'] = 'Q15041669',['2012–13'] = 'Q129177',['2011–12'] = 'Q1239608',['2010–11'] = 'Q1849269',
		['2009–10'] = 'Q1303982',['2008–09'] = 'Q1536927',['2007–08'] = 'Q31716',['2006–07'] = 'Q31714',
		['2005–06'] = 'Q1429246',['2005'] = 'Q1431880',
		}
	UCI["africa"] = { -- Q268357
		['2018'] = 'Q42202027', ['2017'] = 'Q27679848', ['2016'] = 'Q21622217',
		['2015'] = 'Q18342124', ['2013–14'] = 'Q15041670',
		['2012–13'] = 'Q327399', ['2011–12'] = 'Q2296721',['2010–11'] = 'Q1386870',
		['2009–10'] = 'Q2067266', ['2008–09'] = 'Q1812465',['2007–08'] = 'Q676684',
		['2006–07'] = 'Q1436886', ['2005–06'] = 'Q1758917',['2005'] = 'Q1759404',
		}
	UCI["oceania"] = { -- Q1039648
		['2018'] = 'Q42205000', ['2017'] = 'Q27887426', ['2016'] = 'Q21559636',
		['2015'] = 'Q18413671', ['2014'] = 'Q15246814', ['2013'] = 'Q129134',
		['2011–12'] = 'Q1591132', ['2011'] = 'Q2298207', ['2009–10'] = 'Q665283',
		['2008–09'] = 'Q964517', ['2007–08'] = 'Q1788621', ['2006–07'] = 'Q1473640',
		['2005–06'] = 'Q1429165', ['2005'] = 'Q937636',
		}
	header_1_tab = {["world"]=13 ,["europe"]=14 ,["asia"]=15,["america"]=16 ,["africa"]=17 ,["oceania"]=18}
	header_1_number = 12
	for key, v in pairs(UCI) do
		if calendarID == "" and frame.args[key] then
			--mw.log("find arg " .. key)
			year = frame.args[key]
			year = string.gsub( year , "%c", "") 
			if v[year] then 
				calendarID = v[year]
				header_1_number = header_1_tab[key]
			end
		end
	end
	--mw.log("find calendarID " .. calendarID)
	local s = {
		header_function = Calendar_translate, -- translations are in function victories_translate
		header_1 = header_1_number, -- translation 12 in function victories_translate is empty
		
		header_2 = {2, 3,5, 4, 7, 8, 9, 10},-- translations 2, 3, 4, 5, 6 in function victories_translate are printed in this order 
 					-- in the lower part of the table header. The second value 3 in {4, 3} tells where the icon will go.
		country_column = 2,
		flag_column = 2, 
		data_sort_type ={'', 'unsortable', '', '', '','',''},   -- -- see https://meta.wikimedia.org/wiki/Help:Sorting
		item = calendarID,
		property = 'P527',
		no_country = {},
		country = true,
		countryflagonly=true,
		only_winner = false, 
		numbering = true,
		error_message = 0,
	    displayed_class = {
			"Q23005603", -- 
			"Q22231110", -- 1.1
			"Q22231109", -- 2.HC
			"Q22231111", -- 1.2
			"Q22231108", -- 1.HC
			"Q22231106", -- 1.UWT
			"Q22231107", -- 2.UWT
			"Q22231113", -- 2.2
			"Q22231112", -- 2.1
			"Q22231113", -- 2.2
			"Q22231109", -- 2.HC
			"Q22231118", -- CC
			},
	    displayteam=false,
	    displayclass=false,
	    leadercolumn=true
	}
	return tableA(s, calendar_main(s))
end

function p.womenucicalendar(frame)
	----- function to display UCI women calendar of one year ----
	----- based on victories function -----
	----- author: psemdel -----
	local year

	if frame.args[1] ~= nil then 
		year=	string.gsub(frame.args[1], "%c", "") 
	else
		year = "2018"
	end
	if  year == "2018" then calendarID="Q47005682"
	elseif  year == "2017" then calendarID="Q27765666" 
	elseif  year == "2016" then calendarID="Q22696468"
	elseif  year == "2015" then calendarID="Q18348936" 
	elseif  year == "2014" then calendarID="Q15831496" 	
	elseif  year == "2013" then calendarID="Q6425932"
	elseif  year == "2012" then calendarID="Q2466796" 
	elseif  year == "2011" then calendarID="Q2466792" 
	elseif  year == "2010" then calendarID="Q2933831" 
	elseif  year == "2009" then calendarID="Q2933830" 
	elseif  year == "2008" then calendarID="Q2933828" 
	elseif  year == "2007" then calendarID="Q3650627" 	
	elseif  year == "2006" then calendarID="Q16154659" 	
	end	--else nil

	local s = {
		header_function = Calendar_translate, -- translations are in function victories_translate
		header_1 = 1, -- translation 1 in function victories_translate is printed in the upper part of the table header
		
		header_2 = {2, 5, 4, 6, 7},-- translations 2, 3, 4, 5, 6 in function victories_translate are printed in this order 
 					-- in the lower part of the table header. The second value 3 in {4, 3} tells where the icon will go.
		country_column = 2,
		flag_column = 2, 
		data_sort_type ={'', 'unsortable', '', '', '','',''},   -- -- see https://meta.wikimedia.org/wiki/Help:Sorting
		item = calendarID,
		property = 'P527',
		no_country = {},
		country = true,
		countryflagonly=true,
		only_winner = true, 
		numbering = false,
		error_message = 0,
	    displayed_class = {"Q22231109","Q22231110","Q22231111","Q22231112","Q22231113";"Q22231118"},
	    displayteam=true,
	    displayclass=true,
	    leadercolumn=false
	}
	return tableA(s, calendar_main(s))
end

function calendar_main(s)--Display the UCI women calendar of one year, function similar to listofwinners
	local calendarID=s.item
	local h = {}
	local country = s.country
	local countryflagonly= s.countryflagonly
	local sortkey, sortkey_class
	local tBody = ''
	local tableBody, sortindex = {}, {}
	local a1, b1, c1
	local timeofrace
    local displayed_class
    local displayteam
    local numbering
    
    if displayed_class==nil then
    	displayed_class=class
    else
    	displayed_class=s.displayed_class
    end
    displayteam=s.displayteam
    displayclass=s.displayclass
    numbering=s.numbering
 ----- Test if everything is fine -----
	_, _, s.item = string.find(s.item, "(%w+)")
	local entity = mw.wikibase.getEntityObject( s.item )
	
	pcall(function() test = entity.claims[s.property][1].mainsnak.snaktype end)
	if test == 'somevalue' or test == 'novalue' then s.error_message = 2 return '' end	
	
	if pcall(function() test = entity.claims[s.property][1].mainsnak.datavalue.value['numeric-id'] end)
	then else s.error_message = 1  return ''
	end
	
	for _, value in pairs(s.no_country) do -- get data if country should be printed in this wiki
	   	if value == wiki then country = false end
	end
	
	--------- Definition local functions ------
	function fn_date(h,entity_race) --write all the end of the race
		local i
		sortkey=''
		--first look for end date
		for _,property in ipairs({"P582"}) do 
			-- give time dates, when property 'point in time', 'start time' or 'end time' is used
			d1, e1, f1 = pcall(fooA, 'time', entity_race, property, 1)
			if d1 == true and h['endtime'] == '' then i = 1 
				while d1 == true and c1 == 'deprecated' do
					i = i + 1
					d1, e1, f1 = pcall(fooA, 'time', entity_race, property, i)
				end
				local _, _, y, m, d = string.find(e1, "(%d+)%p(%d+)%p(%d+)")
				if m ~= '00' and d =='00' then h['time'] = mw.language.getContentLanguage():formatDate("M", '+'..y.."-"..m.."-31")
				elseif m == '00' and d =='00' then h['endtime'] = ''
				else h['endtime'] = func_date (e1, 'small')
				end
				break
			end
  		end
		for _,property in ipairs({"P585","P580"}) do 
			-- give time dates, when property 'point in time', 'start time' or 'end time' is used
			a1, b1, c1 = pcall(fooA, 'time', entity_race, property, 1)
			if a1 == true and h['time'] == '' then i = 1 
				while a1 == true and c1 == 'deprecated' do
					i = i + 1
					a1, b1, c1 = pcall(fooA, 'time', entity_race, property, i)
				end
				local _, _, y, m, d = string.find(b1, "(%d+)%p(%d+)%p(%d+)")
				if m ~= '00' and d =='00' 
				then 
					sortkey = y..m..'32' h['time'] = mw.language.getContentLanguage():formatDate("M", '+'..y.."-"..m.."-31")
						if wiki == "ar" then sortkey = y..m..'32' h['time'] = mw.language.getContentLanguage():formatDate("F", '+'..y.."-"..m.."-31") end
					elseif m == '00' and d =='00' then sortkey = y..'12'..'32' h['time'] = ''
				else sortkey = y..m..d
					if h['endtime']=='' then  --if no end date then show the month
						h['time'] = func_date (b1, 'small')
					else  --otherwise only day
						h['time'] = func_date (b1, 'onlyday')--d
					end
				end
				timeofrace = b1
				break
			end
  		end
  		if h['endtime']=='' then
			return '<td data-sort-value="'..sortkey..  '" style="text-align:right;padding:0 0.5em">'..h['time'].. '</td>'
		else
			return '<td data-sort-value="'..sortkey..  '" style="text-align:right;padding:0 0.5em">'..h['time'].."-"..h['endtime'].. '</td>'
		end
	end

	local function fn2_country()
	a,b = timeStartEnd(h['raceID'], "P17", 'numeric-id', timeofrace)
	h['countryID'] = 'Q'..b 
		if available_list == true and country == true then
			if type( translations.list ) == "function" then h['countryName'] = translations.list('Q'..b) h['countryID'] = 'Q'..b end
			if h['countryName'] == '' then
				local country = mw.wikibase.getEntityObject( 'Q'..b )
				h['countryName'] = country:getLabel('ar') or country:getLabel('en') .. ' (en)'
			end
		end
	--no stage in UCI calendar
	end

	local function fn_country(h)
		local str
		if available_list==true and country == true then
			fn2_country()
			if countryflagonly==true then
				h['countryName'] = '' --go to the case only flag
			end
			if h['countryID'] ~= '' and h['countryName'] ~= '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em">'..flag(h['countryID'], timeofrace).. ' '.. h['countryName'].. '</td>'
			elseif h['countryID'] == '' and h['countryName'] ~= '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em">'.. '   '.. h['countryName'].. '</td>'
			elseif h['countryID'] ~= '' and h['countryName'] == '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em">'..flag(h['countryID'], timeofrace).. '</td>'
			elseif h['countryID'] ~= '' and h['countryName'] ~= '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em">'.. '   '.. '</td>'		
			end
		else str = ''
		end
		return str
	end

	local function fn_race(h)
		local str, a, b, a1, b1, a2, b2, a3, b3
		local label_x = ''
		local entity_x1
		local Sitelink_x, Sitelink_x0, Sitelink_x1, Sitelink_x2 = '', '', ''
		local entity_race = mw.wikibase.getEntityObject( h['raceID'] )
		local entity_type, entity_num = '', 0 
		local level = -1
		local link
		local multi_stage = false
		a, b = pcall(fooA, 'numeric-id', entity_race, 'P31', 1)
		--no stage race
		if a == true then
			-- test for 'no stage item' - item
			a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P31', 1) -- first value for P31
			a2, b2 = pcall(fooA, 'numeric-id', entity_race, 'P31', 2) -- second value for P31
			if a1 == true and a2 == true then -- for two values
				if "Q"..b1 == "Q22231119" or "Q"..b1 == "Q23015458" or "Q"..b1=="Q22231118" then entity_num = 2 entity_type = 'championship' end
				if "Q"..b2 == "Q22231119" or "Q"..b2 == "Q23015458" or "Q"..b2=="Q22231118" then entity_num = 1 entity_type = 'championship' end					
				if entity_type == '' then
					for i=1,#class do -- #class = number of elements in class
						if "Q"..b1 == class[i] then 
							for ii=1,#class_2x do
   								if "Q"..b1 == class_2x[ii] then multi_stage = "Q"..b1 break end 
   							end
   							entity_num = 2 entity_type = 'no stage item' break
   						end
						if "Q"..b2 == class[i] then
							for ii=1,#class_2x do
   								if "Q"..b2 == class_2x[ii] then multi_stage = "Q"..b2 break end
   							end
   							entity_num = 1 entity_type = 'no stage item' break
   						end
					end
				end
			end

			-- else A
			if entity_type == '' and a1 == true and a2 == false then -- for one value
				entity_type = 'else A' 
			end
			-- else B

		end

		if entity_type == 'else A' then
			local entity_l
			a1, b1 = pcall(fooA, 'text', entity_race, 'P1448', 1) -- show the "official name"
			if a1 == true then	
				local lang_WD, text_WD
				for _,v in pairs(entity_race.claims["P1448"]) do
					lang_WD = v.mainsnak.datavalue.value.language
					text_WD = v.mainsnak.datavalue.value.text
					if lang_WD == wiki or lang_WD == 'en' or lang_WD == 'fr' then label_x =text_WD break end
				end 			
			end		

			if label_x == '' then 
				a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P31', 1)
				if a1 == true then 
					entity_l = mw.wikibase.getEntityObject( 'Q'..b1 )
					label_x = entity_l:getLabel( ) or
					entity_l:getLabel( 'en' ) or
					entity_l:getLabel( 'de' ) or
					entity_l:getLabel( 'fr' ) or ''	
				
				end
			end
			if entity_l~= nil then Sitelink_x1 = entity_l:getSitelink(wiki..'wiki')	end		
			if entity_race~= nil then Sitelink_x0 = entity_race:getSitelink(wiki..'wiki') end
			if Sitelink_x0 ~= nil then Sitelink_x = Sitelink_x0	level = 0				
			elseif Sitelink_x1 ~= nil then Sitelink_x = Sitelink_x1 level = 1
			end
		end

		if entity_type == 'no stage item' then 
			a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P31', entity_num)
			if a1 == true then 
				entity_l = mw.wikibase.getEntityObject( 'Q'..b1 )
				label_x = entity_l:getLabel( ) or
					entity_l:getLabel( 'en' ) or
					entity_l:getLabel( 'de' ) or
					entity_l:getLabel( 'fr' ) or ''	
			end
			if entity_l~= nil then Sitelink_x1 = entity_l:getSitelink(wiki..'wiki')	end		
			if entity_race~= nil then Sitelink_x0 = entity_race:getSitelink(wiki..'wiki') end
			if Sitelink_x0 ~= nil then Sitelink_x = Sitelink_x0	level = 0				
			elseif Sitelink_x1 ~= nil then Sitelink_x = Sitelink_x1 level = 1
			end
		end

		if entity_type == 'championship' then 
			a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P31', entity_num)
			if a1 == true then
				entity_l = mw.wikibase.getEntityObject( 'Q'..b1 )
				a2, b2 = pcall(fooA, 'text', entity_l, 'P2561', 1) -- show the "name"
				if a2 == true then
					local lang_WD, text_WD
					for _,v in pairs(entity_l.claims["P2561"]) do
						lang_WD = v.mainsnak.datavalue.value.language
						text_WD = v.mainsnak.datavalue.value.text
						if wiki == lang_WD then label_x =text_WD break end
					end
				end
				if label_x == '' then						
					label_x = entity_l:getLabel( ) or
					entity_l:getLabel( 'en' ) or
					entity_l:getLabel( 'de' ) or
					entity_l:getLabel( 'fr' ) or ''	
				end
			end

			a1, b1 = pcall(fooA, 'numeric-id', entity_l, 'P361', 1)
			if a1 == true then 
				entity_x = mw.wikibase.getEntityObject( 'Q'..b1 )
				if entity_x ~= nil then 
					Sitelink_x = entity_x:getSitelink(wiki..'wiki')
					if Sitelink_x~=nil then link = '[['..Sitelink_x..'|'.. label_x.. ']]' else link = label_x end						
					if wiki == 'ar' then 
						Sitelink_x = entity_x:getSitelink('arwiki')
						if Sitelink_x~=nil then link = '[['..Sitelink_x..'|'.. label_x.. ']]' 
						else link = mw.getCurrentFrame():expandTemplate{ title = 'Ill-WD2', args = {id='Q'..b1,en='true'} }
						end 
					end				
				end
			end
		end

		if level == -1 and link == nil then
			local Sitelink = ''
			local entity_k = mw.wikibase.getEntityObject( h['raceID'] )
			Sitelink = entity_k:getSitelink(wiki..'wiki')
			if Sitelink ~= '' and Sitelink ~= nil then				
				link = '[['..Sitelink..'|'..label_x..']]'
			end
		end
	mw.log(multi_stage, entity_type)
		if level >= 0 and link == nil and Sitelink_x ~= '' then
			--change for calendar, no need for "general classification,..."
			if onwikidata == true then link = '[[:fr:'..Sitelink_x..'|'..label_x..']]'
			else 
				link = '[['..Sitelink_x..'|'..label_x..']]'
			end
		end
		if link == nil then link = label_x end
	
		if available_list==true and country == true then str =  '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..link.. '</td>'
		else
			fn2_country()
			if h['countryID'] ~= '' then str = '<td style="text-align:'.. textalign ..';padding:0 0.5em">'.. flag(h['countryID'], timeofrace).. ' '.. link.. '</td>'
			else str = '<td style="text-align:'.. textalign ..';padding:0 2.3em">'..link.. '</td>'
			end
		end		
	return str
	end	--end fn
	
	local function fn_classtester(h)
		local entity_race = mw.wikibase.getEntityObject( h['raceID'] )
		local display=false
		local a, b, c, d

		a, b = pcall(fooA, 'numeric-id', entity_race, 'P31', 1) -- first value for P31
		c, d = pcall(fooA, 'numeric-id', entity_race, 'P31', 2) -- second value for P31
		if a == true and c == true then -- for two values
			for i=1,#class do -- #class = number of elements in class
				if "Q"..b == displayed_class[i] then display=true break end
				if "Q"..d == displayed_class[i] then display=true break end
			end
		elseif  a == true then
			for i=1,#class do -- #class = number of elements in class
				if "Q"..b == displayed_class[i] then display=true break end
			end
		elseif c==true then
			for i=1,#class do -- #class = number of elements in class
				if "Q"..d == displayed_class[i] then display=true break end
			end	
		end
		return display
	end

	local function fn_class(h)
		local entity_race = mw.wikibase.getEntityObject( h['raceID'] )
		local entity_type, entity_num = '', 0 
		local class_text = ''
		local link = ''
		local Sitelink
		sortkey_class = ''
		
		a, b = pcall(fooA, 'numeric-id', entity_race, 'P31', 1)
		if a == true then
		end		

		local a, b, c, d, e, f
		a, b = pcall(fooA, 'numeric-id', entity_race, 'P31', 1) -- first value for P31
		c, d = pcall(fooA, 'numeric-id', entity_race, 'P31', 2) -- second value for P31
		if a == true and c == true then -- for two values
			for i=1,#class do -- #class = number of elements in class
				if "Q"..d == class[i] then class_text = mw.wikibase.label('Q'..d) sortkey_class = class_sort['Q'..d] break end
			end
		end
	
		link = class_text
		if link ~= '' then 
			a, b = pcall(fooA, 'numeric-id', entity_race, 'P361', 1) -- first value for P361
			if a == true then entity_circuit = mw.wikibase.getEntityObject('Q'..b) end
		end

		if link ~= '' then 
			e, f = pcall(fooA, 'numeric-id', entity_circuit, 'P31', 1)
			if e == true then 
				for i=1,#UCI_Circuits do -- abcd
					if "Q"..f == UCI_Circuits[i] then
						if onwikidata == true then 
							Sitelink = entity_circuit:getSitelink('frwiki')
							if Sitelink~= nil then link = '[[:fr:'..Sitelink..'|'..link..']]' end
						else
							Sitelink = entity_circuit:getSitelink(wiki..'wiki')
							if Sitelink~=nil then link = '[['..Sitelink..'|'..link..']]' end
						end
						break 
					end
				end
			end
		end
		return '<td data-sort-value="'..sortkey_class.. '" style="text-align:center;padding:0 0.5em">'..link.. '</td>'
	end--end fn class
	
	local function fn_rider(h,entity_race,order,displayteam)
		local qual 
		local winner= ''
		local winner_flag=''
		local propertyID
		
		if order==1 or order==nil then
			propertyID=20882667
		elseif order==2 then
			propertyID=20882668
		elseif order==3 then
			propertyID=20882669
		elseif order==4 then
			propertyID=47640757
		end

		a, b = pcall(fooC, 'numeric-id', entity_race, 'P1346', 1, 'P642', 1)
		if a == true then 
			winner = '' winner_flag = ''
			for k, v in ipairs(entity_race.claims["P1346"]) do
				for kk, vv in ipairs(v.qualifiers['P642']) do 
					if vv.datavalue.value['numeric-id'] == propertyID then -- overall winner general classification
						winner = 'Q'.. v.mainsnak.datavalue.value['numeric-id']
					end
				end
			end
			if winner ~= '' then
				local a, b = timeStartEnd(winner, "P27", 'numeric-id', timeofrace)
			   	if a == true then 
			   		winner_flag = flag('Q'..b, timeofrace).. ' '		
				end
			end
		end
	
		if winner ~= '' then
			local winner_team = false
			local entity_winner = mw.wikibase.getEntityObject( winner )
			a, b = pcall(fooA, 'numeric-id', entity_winner, 'P31', 1) -- looking if winner is a person
			if a == true and b ~= 5 then winner_team = true end			
			
			if winner_team == false then 
				if displayteam==false or displayteam==nil then
					return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..winner_flag.. WPlink(winner).. '</td>' 
				else
					local team
					a, b = timeStartEnd(winner, 'P54', 'numeric-id', timeofrace)  --winner  'Q4505812'
					if a == true and b~=nil then
						--teamOftheWinner = mw.wikibase.getEntity( 'Q'..b )
				--		g.team[rank] = national_team:getLabel('ar') or g.country[rank].. s
						team = WPlink('Q'..b, 'team', timeofrace)
						return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..winner_flag.. WPlink(winner).." ("..team..")".. '</td>' 
					else	
						return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..winner_flag.. WPlink(winner).. '</td>' 
					end
				end
			else 
				winner_flag = ''
				local a, b = timeStartEnd(winner, "P17", 'numeric-id', timeofrace) -- flag of team
			   	if a == true then 
			   		winner_flag = flag('Q'..b, timeofrace).. ' '		
				end			
				return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..winner_flag ..WPlink(winner, 'team', timeofrace).. '</td>' 
			end
		else return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..''.. '</td>'
		end
	end
	
	----- Begin of the main part of the code
	if calendarID ~= nil then
		local entity = mw.wikibase.getEntity(calendarID)
		local WDlink_on
		local WPcontent = {}
		local num = 0
		local kk=0

		if pcall(fooA, 'numeric-id', entity, 'P527', 1) == true then 
			for k, v1 in pairs(entity.claims['P527']) do	
				kk=kk+1
				--For all races in the UCI calendar--
				h['time'] = '' 	h['countryID'] = '' h['countryName'] = '' h['endtime'] = ''
				h['raceID'] = 'Q'.. v1.mainsnak.datavalue.value['numeric-id'] 
				h['item1ID'] = h['raceID']	h['item2ID'] = '' h['item3ID'] = ''
				local entity_race = mw.wikibase.getEntityObject( h['raceID'] )
				
				---- Create a row ----
				tBody = '<tr style= "line-height: 1.8em; padding: 5px;">'
				if fn_classtester(h)==true then 
					tBody = tBody..fn_date(h,entity_race)
					if numbering==true then
						tBody = tBody..'<td style="text-align:center;padding:0 0.5em">'..tostring(kk).. '</td>'
					end
					tBody = tBody..fn_country(h)
					tBody = tBody..fn_race(h)
					if displayclass==true then
						tBody = tBody..fn_class(h)
					end
					if s.only_winner==false then
						tBody = tBody..fn_rider(h,entity_race,1,displayteam)
						tBody = tBody..fn_rider(h,entity_race,2,displayteam)
						tBody = tBody..fn_rider(h,entity_race,3,displayteam)
					else
						tBody = tBody..fn_rider(h,entity_race,1,displayteam)
					end
					if s.leadercolumn==true then
						tBody = tBody..fn_rider(h,entity_race,4,displayteam)
					end
					tBody = tBody.. '</tr>'
					---- Add the row to the table
					table.insert(sortindex, sortkey)
					table.insert(tableBody, tBody)
				end
			end
		end -- for k, v1
	return table.concat (tableBody) 
	end -- no calendar
end

function p.nationalchampionships(frame)
	local calendarID = ""
	local mode = ""
	Frame = frame:getParent()
	tabl = {}
	tabl[1] = { -- frame.args[1]
		['2018'] = 'Q47088675', ['2017'] = 'Q28005879', ['2016'] = 'Q22021840',
		['2015'] = 'Q19296998', ['2014'] = 'Q15621925', ['2013'] = 'Q3339162',
		['2012'] = 'Q1333003', ['2011'] = 'Q1143844', ['2010'] = 'Q1568490',
		['2009'] = 'Q263224', ['2008'] = 'Q826505', ['2007'] = 'Q43286248',
		['2006'] = 'Q43286261', ['2005'] = 'Q1335357', ['2004'] = 'Q43286272',
		['2003'] = 'Q43286289', ['2002'] = 'Q43286297', ['2001'] = 'Q43286309'
	}
	for key, v in pairs(tabl) do
		if calendarID == "" and frame.args[key] or Frame.args[key] then
			--mw.log("find arg " .. key)
			year = frame.args[key] or Frame.args[key]
			year = string.gsub( year , "%c", "") 
			modetemp=key
			if v[year] then 
				calendarID = v[year]
			end
		end
	end

	local s = {
		header_function = Calendar_translate, -- translations are in function victories_translate
		header_1 = 19, -- translation 1 in function victories_translate is printed in the upper part of the table header
		
		header_2 = {5, 20, 21},-- translations 2, 3, 4, 5, 6 in function victories_translate are printed in this order 
 					-- in the lower part of the table header. The second value 3 in {4, 3} tells where the icon will go.
		country_column = 1,
		flag_column = 1, 
		data_sort_type ={'', '', ''},   -- -- see https://meta.wikimedia.org/wiki/Help:Sorting
		item = calendarID,
		property = 'P527',
		mode=modetemp,
		no_country = {},
		error_message = 0,
	    displayteam=true
	}
	return tableA(s, nationalchampionships_main(s))
end

function nationalchampionships_main(s)--Display the UCI women calendar of one year, function similar to listofwinners
	local calendarID=s.item
	local h = {}
	local sortkey, sortkey_class
	local tBody = ''
	local tableBody, sortindex = {}, {}
	local a1, b1, c1
	local timeofrace
    local displayteam
    local country=true --otherwise makes no sence

    displayteam=s.displayteam
 ----- Test if everything is fine -----
	_, _, s.item = string.find(s.item, "(%w+)")
	local entity = mw.wikibase.getEntityObject(s.item )
	
	pcall(function() test = entity.claims[s.property][1].mainsnak.snaktype end)
	if test == 'somevalue' or test == 'novalue' then s.error_message = 2 return '' end	
	
	if pcall(function() test = entity.claims[s.property][1].mainsnak.datavalue.value['numeric-id'] end)
	then else s.error_message = 1  return ''
	end
	
	for _, value in pairs(s.no_country) do -- get data if country should be printed in this wiki
	   	if value == wiki then country = false end
	end
	
	--------- Definition local functions ------
	function fn_date(h,entity_race) --only to get timeofrace
		local i
		sortkey=''
		for _,property in ipairs({"P585","P580"}) do 
			-- give time dates, when property 'point in time', 'start time' or 'end time' is used
			a1, b1, c1 = pcall(fooA, 'time', entity_race, property, 1)
			if a1 == true then
				timeofrace = b1
			end
		end
	end

	local function fn2_country()
		local entity=mw.wikibase.getEntityObject(h['raceID'])  
		a, b = pcall(fooA, 'numeric-id', entity, 'P17', 1)
		--a,b = pcall(timeStartEnd(h['raceID'], "P17", 'numeric-id', timeofrace))
		h['countryID'] =''
		if a==true then
			h['countryID'] = 'Q'..b 
			if available_list == true and country == true then
				if type( translations.list ) == "function" then h['countryName'] = translations.list('Q'..b) h['countryID'] = 'Q'..b end
				if h['countryName'] == '' then
					local country = mw.wikibase.getEntityObject( 'Q'..b )
					h['countryName'] = country:getLabel() or country:getLabel('en') .. ' (en)'
				end
			end
		end
	--no stage in UCI calendar
	end

	local function fn_country(h)
		local str
		if available_list==true and country == true then
			fn2_country()
			if h['countryID'] ~= '' and h['countryName'] ~= '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em data-sort-value="'..h['countryName'].. '>'..flag(h['countryID'], timeofrace).. ' '.. h['countryName'].. '</td>'
			elseif h['countryID'] == '' and h['countryName'] ~= '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em data-sort-value="'..h['countryName'].. '>'.. '   '.. h['countryName'].. '</td>'
			elseif h['countryID'] ~= '' and h['countryName'] == '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em data-sort-value="'..'0'.. '>'..flag(h['countryID'], timeofrace).. '</td>'
			elseif h['countryID'] ~= '' and h['countryName'] ~= '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em data-sort-value="'..h['countryName'].. '>'.. '   '.. '</td>'		
			end
		else str = '<td>'..''..'</td>'
		end
		return str
	end

	local function fn_rider(h,entity_race,displayteam)
		local qual 
		local winner= ''
		local winner_flag=''
		local propertyID=20882667

		a, b = pcall(fooC, 'numeric-id', entity_race, 'P1346', 1, 'P642', 1)
		if a == true then 
			winner = '' winner_flag = ''
			for k, v in ipairs(entity_race.claims["P1346"]) do
				for kk, vv in ipairs(v.qualifiers['P642']) do 
					if vv.datavalue.value['numeric-id'] == propertyID then -- overall winner general classification
						winner = 'Q'.. v.mainsnak.datavalue.value['numeric-id']
					end
				end
			end
			--no need for winner flag, it is clear
		end
	
		if winner ~= '' then
			local winner_team = false
			local entity_winner = mw.wikibase.getEntityObject( winner )
			a, b = pcall(fooA, 'numeric-id', entity_winner, 'P31', 1) -- looking if winner is a person
			if a == true and b ~= 5 then winner_team = true end			
			
			if winner_team == false then 
				if displayteam==false or displayteam==nil then
					return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'.. WPlink(winner,'rider',timeofrace).. '</td>' 
				else
					local team
					a, b = timeStartEnd(winner, 'P54', 'numeric-id', timeofrace)  --winner  'Q4505812'
					if a == true and b~=nil then
						--teamOftheWinner = mw.wikibase.getEntity( 'Q'..b )
				--		g.team[rank] = national_team:getLabel() or g.country[rank].. s
						team = WPlink('Q'..b, 'team', timeofrace)
						return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'.. WPlink(winner, 'rider',timeofrace).." ("..team..")".. '</td>' 
					else	
						return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'.. WPlink(winner,'rider',timeofrace).. '</td>' 
					end
				end
			else 
				return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..WPlink(winner, 'team', timeofrace).. '</td>' 
			end
		else return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..''.. '</td>'
		end
	end
	
	if calendarID ~= nil then
		local entity = mw.wikibase.getEntity(calendarID)
		local WDlink_on
		local WPcontent = {}
		local num = 0
		local kk=0

		if pcall(fooA, 'numeric-id', entity, 'P527', 1) == true then 
			--for each country
			for k, v1 in pairs(entity.claims['P527']) do	
				kk=kk+1
				--For all races in the UCI calendar--
				championshipID = 'Q'.. v1.mainsnak.datavalue.value['numeric-id'] 
				local entity_championship = mw.wikibase.getEntityObject( championshipID )
				h['raceID']=championshipID
				
				if pcall(fooA, 'numeric-id', entity_championship, 'P527', 1) == true then 
					--look for the correct races
					h['countryID'] = '' h['countryName'] = '' 
					tRoadrace=''
					tITT=''
					for j, w1 in pairs(entity_championship.claims['P527']) do	
						tempID = 'Q'.. w1.mainsnak.datavalue.value['numeric-id'] 
						temp = mw.wikibase.getEntityObject( tempID )
						templabel= temp:getLabel('fr')
						if templabel~=nil then
							templabelmod=mw.ustring.gsub( templabel, '-', 'x' )
							testMenRoadrace=string.find( templabel, 'Course en ligne masculine aux' )
							testMenITT=string.find( templabelmod, 'Contrexlaxmontre masculin aux' )
							testWomenRoadrace=string.find( templabel, 'Course en ligne féminine aux' )
							testWomenITT=string.find( templabelmod, 'Contrexlaxmontre féminin aux' )
						end
						if s.mode=="women" then
							if testWomenRoadrace ~= nil then
								 entityRoadrace=temp
								 h['time'] = ''
								 fn_date(h,entityRoadrace) --get the date only
								 tRoadrace=fn_rider(h,entityRoadrace,displayteam)
							end
							if testWomenITT ~= nil then
								entityITT=temp
								h['time'] = ''
								fn_date(h,entityITT) --get the date only
								tITT=fn_rider(h,entityITT,displayteam)
							end
						else--men
							if testMenRoadrace ~= nil then
								 entityRoadrace=temp
								 h['time'] = ''
								 fn_date(h,entityRoadrace) --get the date only
								 tRoadrace=fn_rider(h,entityRoadrace,displayteam)
							end
							if testMenITT ~= nil then
								entityITT=temp
								h['time'] = ''
								fn_date(h,entityITT) --get the date only
								tITT=fn_rider(h,entityITT,displayteam)
							end
						end
							
						if fn_country(h)==nil then
							tBody='<td></td>'..tRoadrace..tITT --
						else
							tBody=fn_country(h)..tRoadrace..tITT	
						end
					end
				end --this championship
				tBody = tBody.. '</tr>'
				---- Add the row to the table
				table.insert(sortindex, sortkey)
				table.insert(tableBody, tBody)
			end
		end
	return table.concat (tableBody)
	end -- no calendar
end
function victories_translate(wiki, x) 
	local l10nDef = { }	
	l10nDef["ar"] = {"التصنيف العام", "سجل الفوز", "التاريخ", "السباق", "البلد", "الصنف", "الفائز"}
	l10nDef["fr"] = {"Classement général", "Victoires", "Date", "Course", "Pays", "Classe", "Vainqueur"}
	l10nDef["en"] = {"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner"}
	l10nDef["de"] = {"Gesamtwertung", "Siege", "Datum", "Rennen", "Staat", "Klasse", "Sieger"}
	l10nDef["da"] = {"Samlede stilling", "Sejre", "Dato", "Løb", "Land", "Klasse", "Vinder"}
	l10nDef["es"] = {"Clasificación general", "Victorias", "Fecha", "Carrera", "País", "Clase", "Ganador"}
	l10nDef["ja"] = {"General classification", "Victories", "開催日", "レース", "国", "国", "勝者"}
	l10nDef["lv"] = {"Kopvērtējums", "Uzvaras", "Datums", "Sacensības", "Valsts", "Kategorija", "Uzvarētājs"}
	l10nDef["mk"] = {"General classification", "Victories", "Датум", "Трка", "Земја", "Класа", "Победник"}
	l10nDef["no"] = {"Sammenlagt", "Seire", "Dato", "Ritt", "Land", "Klasse", "Vinner"}
	l10nDef["ru"] = {"Генеральная классификация", "Победы", "Дата", "Гонка", "Страна", "Класс", "Победитель"}
	
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["fr"] end  -- default
	return l10n[x]	
end 

function func_error_message(wiki,x) 
	local l10nDef = { }	
	l10nDef["en"] = {'Property <1> is missing in item "<2>" (<3>)'}
	l10nDef["ar"] = {'الخاصية <1> غير موجودة في العنصر "<2>" (<3>)'}
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["en"] end  -- default
	return l10n[x]	
end

function p.victories(frame)
	local s = {
		header_function = victories_translate, -- translations are in function victories_translate
		header_1 = 2, -- translation 1 in function victories_translate is printed in the upper part of the table header
		header_2 = {3, 4, 5, 6, 7},-- translations 2, 3, 4, 5, 6 in function victories_translate are printed in this order 
										-- in the lower part of the table header. The second value 3 in {4, 3} tells where the icon will go.
		data_type = {'date', 'race', 'country', 'class', 'rider'},
		country_column = 3,
		flag_column = 2, 
		data_sort_type = {'', 'unsortable', '', '', ''}, -- see https://meta.wikimedia.org/wiki/Help:Sorting
		item = frame.args[1],
		property = 'P2522',
		no_country = {},
		error_message = 0
	}
	return tableA(s, victory_main(s, Qnumber))
end

function victory_main(s, Qnumber)
	local s = s
	local h = {} -- time, raceID, countryID, countryName
	local test
	
	 _, _, s.item = string.find(s.item, "(%w+)")
	local entity = mw.wikibase.getEntityObject( s.item )
	
	pcall(function() test = entity.claims[s.property][1].mainsnak.snaktype end)
	if test == 'somevalue' or test == 'novalue' then s.error_message = 2 return '' end	

	if pcall(function() test = entity.claims[s.property][1].mainsnak.datavalue.value['numeric-id'] end)
	then else s.error_message = 1  return ''
	end

	local country = true
	for _, value in pairs(s.no_country) do -- get data if country should be printed in this wiki
		if value == wiki then country = false end
	end
	local sortkey, sortkey_class
	local tBody = ''
	local tableBody, sortindex = {}, {}
	local a1, b1, c1
	local timeofrace

	for l, m in pairs(entity.claims[s.property]) do -- look into all statements
		h['time'] = '' 	h['countryID'] = '' h['countryName'] = ''
		h['raceID'] = 'Q'.. m.mainsnak.datavalue.value['numeric-id'] 
		h['item1ID'] = h['raceID']	h['item2ID'] = '' h['item3ID'] = ''
		local entity_race = mw.wikibase.getEntityObject( h['raceID'] )

		local function fn2_country()
			local raceID
			local a, b = timeStartEnd(h['raceID'], "P17", 'numeric-id', timeofrace)
			if a == true then 
				h['countryID'] = 'Q'..b 
				if available_list == true and country == true then
					if type( translations.list ) == "function" then h['countryName'] = translations.list('Q'..b) h['countryID'] = 'Q'..b end
					if h['countryName'] == '' then
						local country = mw.wikibase.getEntityObject( 'Q'..b )
						h['countryName'] = country:getLabel('ar') or country:getLabel('en') .. ' (en)'
					end
				end
			else --go from stage item to race item
				a, b = pcall(fooA, 'numeric-id', entity_race, 'P361', 1)
				if a == true then h['item2ID'] = 'Q'..b end
				if a == false then 
					a, b = pcall(fooA, 'numeric-id', entity_race, 'P31', 1) 
					if a == true then h['item3ID'] = 'Q'..b end
				end
				if a == true then 
					local a, b = timeStartEnd('Q'..b, "P17", 'numeric-id', timeofrace)
					if a == true then h['countryID'] = 'Q'..b 
						if available_list == true and country == true then
							if type( translations.list ) == "function" then h['countryName'] = translations.list('Q'..b) end
							if h['countryName'] == '' then
								local country = mw.wikibase.getEntityObject( 'Q'..b )
								h['countryName'] = country:getLabel('ar') or country:getLabel('en') .. ' (en)'
							end
						end
					end
				end
			end
		end

		local function fn_date(h)
			local i
			sortkey=''
			for _,property in ipairs({"P585","P582", "P580"}) do 
				-- give time dates, when property 'point in time', 'start time' or 'end time' is used
				a1, b1, c1 = pcall(fooA, 'time', entity_race, property, 1)
				if a1 == true and h['time'] == '' then i = 1 
					while a1 == true and c1 == 'deprecated' do
						i = i + 1
						a1, b1, c1 = pcall(fooA, 'time', entity_race, property, i)
					end
					local _, _, y, m, d = string.find(b1, "(%d+)%p(%d+)%p(%d+)")
					if m ~= '00' and d =='00' 
					then 
						sortkey = y..m..'32' h['time'] = mw.language.getContentLanguage():formatDate("M", '+'..y.."-"..m.."-31")
						if wiki == "ar" then sortkey = y..m..'32' h['time'] = mw.language.getContentLanguage():formatDate("F", '+'..y.."-"..m.."-31") end
					elseif m == '00' and d =='00' then sortkey = y..'12'..'32' h['time'] = ''
					else sortkey = y..m..d  h['time'] = func_date (b1, 'small')
					end
					timeofrace = b1
					break
				end
			end
		return '<td data-sort-value="'..sortkey..  '" style="text-align:right;padding:0 0.5em">'.. h['time'].. '</td>'
		end

		local function fn_race(h)
			local str, a, b, a1, b1, a2, b2, a3, b3
			local label_x = ''
			local entity_x1
			local Sitelink_x, Sitelink_x0, Sitelink_x1, Sitelink_x2 = '', '', ''
			local entity_race = mw.wikibase.getEntityObject( h['raceID'] )
			local entity_type, entity_num = '', 0 
			local level = -1
			local link
			local multi_stage = false
			a, b = pcall(fooA, 'numeric-id', entity_race, 'P31', 1)
			if a == true then
				-- test for stage item
				for i=1,#stages do
					if "Q"..b == stages[i] then entity_type = 'stage item' end -- stage article
				end
				
				-- test for 'no stage item' - item
				a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P31', 1) -- first value for P31
				a2, b2 = pcall(fooA, 'numeric-id', entity_race, 'P31', 2) -- second value for P31
				if a1 == true and a2 == true then -- for two values
					if "Q"..b1 == "Q22231119" or "Q"..b1 == "Q23015458" or "Q"..b1=="Q22231118" then entity_num = 2 entity_type = 'championship' end
					if "Q"..b2 == "Q22231119" or "Q"..b2 == "Q23015458" or "Q"..b2=="Q22231118" then entity_num = 1 entity_type = 'championship' end					
					if entity_type == '' then
						for i=1,#class do -- #class = number of elements in class
							if "Q"..b1 == class[i] then 
								for ii=1,#class_2x do
	   								if "Q"..b1 == class_2x[ii] then multi_stage = "Q"..b1 break end 
	   							end
	   							entity_num = 2 entity_type = 'no stage item' break
	   						end
							if "Q"..b2 == class[i] then
								for ii=1,#class_2x do
	   								if "Q"..b2 == class_2x[ii] then multi_stage = "Q"..b2 break end
	   							end
	   							entity_num = 1 entity_type = 'no stage item' break
	   						end
						end
					end
				end

				-- else A
				if entity_type == '' and a1 == true and a2 == false then -- for one value
					entity_type = 'else A' 
				end
				-- else B

			end
		
	------------------------------------------------------

			if entity_type == 'else A' then
				local entity_l
				a1, b1 = pcall(fooA, 'text', entity_race, 'P1448', 1) -- show the "official name"
				if a1 == true then	
					local lang_WD, text_WD
					for _,v in pairs(entity_race.claims["P1448"]) do
						lang_WD = v.mainsnak.datavalue.value.language
						text_WD = v.mainsnak.datavalue.value.text
						if lang_WD == wiki or lang_WD == 'en' or lang_WD == 'fr' then label_x =text_WD break end
					end 			
				end		

				if label_x == '' then 
					a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P31', 1)
					if a1 == true then 
						entity_l = mw.wikibase.getEntityObject( 'Q'..b1 )
						label_x = entity_l:getLabel('ar') or
						entity_l:getLabel( 'en' ) or
						entity_l:getLabel( 'de' ) or
						entity_l:getLabel( 'fr' ) or ''	
					
					end
				end
				if entity_l ~= nil then Sitelink_x1 = ( entity_l:getSitelink('arwiki') or  entity_l:getSitelink('enwiki')) 	end	
				if entity_race ~= nil then Sitelink_x0 = ( entity_race:getSitelink('arwiki') or  entity_race:getSitelink('enwiki')) 	end
				if Sitelink_x0 ~= nil then Sitelink_x = Sitelink_x0	level = 0				
				elseif Sitelink_x1 ~= nil then Sitelink_x = Sitelink_x1 level = 1
				end
			end
			
	------------------------------------------------------

			if entity_type == 'no stage item' then 
				a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P31', entity_num)
				if a1 == true then 
					entity_l = mw.wikibase.getEntityObject( 'Q'..b1 )
					label_x = entity_l:getLabel('ar') or
						entity_l:getLabel( 'en' ) or
						entity_l:getLabel( 'de' ) or
						entity_l:getLabel( 'fr' ) or ''	
				end
				if entity_l~= nil then Sitelink_x1 = ( entity_l:getSitelink('arwiki') or  entity_l:getSitelink('enwiki'))	end		
				if entity_race~= nil then Sitelink_x0 = ( entity_race:getSitelink('arwiki') or  entity_race:getSitelink('enwiki')) end
				if Sitelink_x0 ~= nil then Sitelink_x = Sitelink_x0	level = 0				
				elseif Sitelink_x1 ~= nil then Sitelink_x = Sitelink_x1 level = 1
				end
			end

	------------------------------------------------------

			if entity_type == 'championship' then 
				mw.log(entity_type)
				a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P31', entity_num)
				if a1 == true then
					entity_l = mw.wikibase.getEntityObject( 'Q'..b1 )
					a2, b2 = pcall(fooA, 'text', entity_l, 'P2561', 1) -- show the "name"
					if a2 == true then
						local lang_WD, text_WD
						for _,v in pairs(entity_l.claims["P2561"]) do
							lang_WD = v.mainsnak.datavalue.value.language
							text_WD = v.mainsnak.datavalue.value.text
							if wiki == lang_WD then label_x =text_WD break end
						end
					end
					if label_x == '' then						
						label_x = entity_l:getLabel( ) or
						entity_l:getLabel( 'en' ) or
						entity_l:getLabel( 'de' ) or
						entity_l:getLabel( 'fr' ) or ''	
					end
				end
				a1, b1 = pcall(fooA, 'numeric-id', entity_l, 'P361', 1)
				if a1 == true then 
					entity_x = mw.wikibase.getEntityObject( 'Q'..b1 )
					if entity_x ~= nil then 
						Sitelink_x = entity_x:getSitelink(wiki..'wiki')
						if Sitelink_x~=nil then link = '[['..Sitelink_x..'|'.. label_x.. ']]' else link = label_x end						
						if wiki == 'ar' then 
							Sitelink_x = entity_x:getSitelink('arwiki')
							if Sitelink_x~=nil then link = '[['..Sitelink_x..'|'.. label_x.. ']]' 
							else link = mw.getCurrentFrame():expandTemplate{ title = 'Ill-WD2', args = {id='Q'..b1,target='en',label=label_x} }
							end	
						end				
					end
				end
			end
		
	------------------------------------------------------

			if entity_type == 'stage item' then
				local entity_l
				a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P361', 1)
				if a1 == true then 
					entity_x1 = mw.wikibase.getEntityObject( 'Q'..b1 )
					a2, b2 = pcall(fooA, 'numeric-id', entity_x1, 'P31', 1)
						if a2 == true then
							local is_class = false
							for i=1,#class do
								if "Q"..b2 == class[i] then is_class = true break end
							end
							if is_class == false then entity_l = mw.wikibase.getEntityObject( 'Q'..b2 )
							else
								a3, b3 = pcall(fooA, 'numeric-id', "Q"..b2, 'P31', 2)
								if a3 == true then entity_l = mw.wikibase.getEntityObject( 'Q'..b3 ) end
							end
						end	
						label_x = entity_l:getLabel('ar') or
							entity_l:getLabel( 'en' ) or
							entity_l:getLabel( 'de' ) or
							entity_l:getLabel( 'fr' ) or ''			
				end
				entity_stage = mw.wikibase.getEntityObject( 'Q18131152' )
				entity_prolog = mw.wikibase.getEntityObject( 'Q485321' )			

				local comma = ", "			
				if wiki == 'fr' then 
					for _,v in ipairs({"^Trois", "^Quatre", "^Boucles"}) do  -- ^ match only at the beginning
						local i, _ = mw.ustring.find(label_x , v)
						if i ~= nil then comma = " des " end
					end
					for _,v in ipairs({"^Triptyque", "^Tour", "^Grand Prix", "^Circuit", "^Mémorial", "^Trophée"}) do
						local i, _ = mw.ustring.find(label_x , v)
						if i ~= nil then comma = " du " end
					end
					for _,v in ipairs({"^Ronde", "^Semaine", "^Classica", "^Flèche", "^Course", "^Classique"}) do
						local i, _ = mw.ustring.find(label_x , v)
						if i ~= nil then comma = " de la " end
					end
					for _,v in ipairs({"^Étoile"}) do
						local i, _ = mw.ustring.find(label_x , v)
						if i ~= nil then comma = " de l'" end
					end
				end
			
				a, b = pcall(fooA, 'value', entity_race, 'P1545', 1)		
				if a == false then b = '?' end
				if b ~= '0' then
					local l10nDef = {["ar"]="مرحلة"}
					local stage_label = l10nDef[wiki]
					if stage_label == nil 
						then 
							stage_label = entity_stage:getLabel(wiki) or entity_stage:getLabel('fr') 
							if wiki == "ar" then stage_label = entity_stage:getLabel(wiki) or entity_stage:getLabel('en')  end
					end
					local substage = ' '
					local i,j = string.find(b, "%a+")
					local k,l = string.find(b, "%d+")
					local value1, value2
					value2 = string.sub(b, k, l)
					if i ~= nil then value1 = string.sub(b, i, j) end
					if value1 ~= nil then substage = value1..' ' b = value2 end
	
					if entity_l~= nil then Sitelink_x2 = entity_l:getSitelink(wiki..'wiki') end
					if entity_x1~=nil then Sitelink_x1 = entity_x1:getSitelink(wiki..'wiki') end
					if entity_race~=nil then Sitelink_x0 = entity_race:getSitelink(wiki..'wiki') end
					if Sitelink_x0 ~= nil then Sitelink_x = Sitelink_x0	level = 0
					elseif Sitelink_x1 ~= nil then Sitelink_x = Sitelink_x1 level = 1
					elseif Sitelink_x2 ~= nil then Sitelink_x = Sitelink_x2 level = 2
					end
	
					if wiki=="de" or wiki=="da" or wiki=="fo" or wiki=="no" then --label_x = label_x.. ', '.. b.. '. '.. stage_label
						if level == 1 or level == 2 then link = '[['..Sitelink_x..'|'.. label_x.. ']]' ..', '.. b.. '. '.. substage.. stage_label end
						if level == 0 then link = '[['..Sitelink_x.. '|'.. label_x.. ', '.. b.. '. '.. substage.. stage_label.. ']]' end
						if level == -1 then link = label_x.. ', '.. b.. '. '.. substage.. stage_label end					
					elseif wiki=='en' or wiki=='br' then label_x = label_x.. ', '.. stage_label.. ' '.. b
					
					elseif wiki=='ar' then 
						label_x = label_x  .. '، ' .. stage_label .. ' '.. b
						if entity_l~= nil then Sitelink_x2 = (entity_l:getSitelink('arwiki') or entity_l:getSitelink('enwiki')) end
						if entity_x1~=nil then Sitelink_x1 = (entity_x1:getSitelink('arwiki') or entity_x1:getSitelink('enwiki')) end
						if entity_race~=nil then Sitelink_x0 = (entity_race:getSitelink('arwiki') or entity_race:getSitelink('enwiki'))  end

					elseif wiki == 'fr' then
						if level == 1 or level == 2 then  
							if b == '1' then link = b.. '<sup>re</sup>'.. substage.. stage_label.. comma.. '[[:fr:'..Sitelink_x..'#1re.C2.A0.C3.A9tape'..'|'.. label_x.. ']]' 
							else link = b.. '<sup>e</sup>'.. substage.. stage_label.. comma.. '[[:fr:'..Sitelink_x..'#'.. b.. 'e.C2.A0.C3.A9tape'..'|'.. label_x..']]' 
							end
						end
						if level == 0 then 
							if b == '1' then link = '[[:fr:'..Sitelink_x.. '|'.. b.. '<sup>re</sup>'.. substage.. stage_label.. comma.. label_x.. ']]' 
							else link = '[[:fr:'..Sitelink_x.. '|'.. b.. '<sup>e</sup>'.. substage.. stage_label.. comma.. label_x..']]' 
							end						
						end
						if level == -1 then
							if b == '1' then link = b.. '<sup>re</sup>'.. substage.. stage_label.. comma.. label_x
							else link = b.. '<sup>e</sup>'.. substage.. stage_label.. comma.. label_x
							end						
						end
						
					elseif wiki == "lb" then
						if level == 1 or level == 2 then
							if b == '1' then link = b.. '<sup>re</sup>'.. substage.. stage_label.. comma.. '[[:'..wiki..':'..Sitelink_x..'#1re.C2.A0.C3.A9tape'..'|'.. label_x.. ']]' 
							else link = b.. '<sup>e</sup>'.. substage.. stage_label.. comma.. '[[:'..wiki..':'..Sitelink_x..'#'.. b.. 'e.C2.A0.C3.A9tape'..'|'.. label_x..']]' 
							end
						end
						if level == 0 then 
							if b == '1' then link = '[[:'..wiki..':'..Sitelink_x.. '|'.. b.. '<sup>re</sup>'.. substage.. stage_label.. comma.. label_x.. ']]' 
							else link = '[[:'..wiki..':'..Sitelink_x.. '|'.. b.. '<sup>e</sup>'.. substage.. stage_label.. comma.. label_x..']]' 
							end
						end
						if level == -1 then
							if b == '1' then link = b.. '<sup>re</sup>'.. substage.. stage_label.. comma.. label_x
							else link = b.. '<sup>e</sup>'.. substage.. stage_label.. comma.. label_x
							end
						end
					elseif wiki=="ca" then label_x = b.. 'a '.. stage_label.. ' del '.. label_x
					elseif wiki=="es" then label_x = b.. "<sup>a</sup> ".. stage_label.. ', '.. label_x
					else label_x = stage_label.. ' '.. b..', '.. label_x 
					end
				else -- Prolog
					if entity_l~= nil then Sitelink_x2 = entity_l:getSitelink(wiki..'wiki') end
					if entity_x1~=nil then Sitelink_x1 = entity_x1:getSitelink(wiki..'wiki') end
					if entity_race~=nil then Sitelink_x0 = entity_race:getSitelink(wiki..'wiki') end
					if Sitelink_x0 ~= nil then Sitelink_x = Sitelink_x0	level = 0				
					elseif Sitelink_x1 ~= nil then Sitelink_x = Sitelink_x1 level = 1
					elseif Sitelink_x2 ~= nil then Sitelink_x = Sitelink_x2 level = 2
					end	
					
					local l10nDef = { ["fr"]="Prologue", ["ar"]="المقدمة", ["en"]="Prologue", ["br"]="Prolog", ["ca"]="Pròleg", ["cs"]="Prolog", ["de"]="Prolog", ["da"]="Prolog", ["eo"]="Prologo",
					["es"]="Prólogo", ["eu"]="Aitzinetapa", ["fi"]="Prologi", ["fo"]="Forteinur", ["hu"]="Prolog", ["it"]="Prologo", ["ja"]="プロローグ", ["la"]="Incipit prologus", ["lb"]="Prolog", ["lv"]="Prologs",
					["mk"]="Пролог",  ["nl"]="Proloog", ["no"]="Prolog", ["pl"]="Prologu", ["pt"]="Prólogo", ["ro"]="Prolog", ["ru"]="Пролог", ["sk"]="Prológ", ["sv"]="Prolog" }
					local prolog_label 
					prolog_label = l10nDef[wiki]
					if prolog_label == nil then
						prolog_label = entity_prolog:getLabel('ar') or entity_prolog:getLabel('en') or entity_prolog:getLabel('fr') or
						entity_prolog:getLabel('de')
						prolog_label = mw.ustring.gsub(prolog_label, "^(%a)",function (x) return mw.ustring.upper(x) end)
					end

					if wiki=="de" or wiki=="da" or wiki=="fo" or wiki=="no" then 
						-- label_x = label_x.. ', '.. prolog_label
						if level >= 0 then link = '[['..Sitelink_x.. '|'.. label_x.. ']]'.. ', '.. prolog_label end
					elseif wiki == 'en' then label_x = label_x.. ', '.. prolog_label
					elseif wiki == 'ar' then label_x = label_x.. '، '.. prolog_label
					elseif wiki == 'fr' then
						if level > 0 then link = prolog_label.. comma.. '[[:fr:'..Sitelink_x..'#'..prolog_label.. '|'.. label_x.. ']]' end
						if level == 0 then link = '[[:fr:'..Sitelink_x..'#'..prolog_label.. '|'.. prolog_label.. comma.. label_x.. ']]' end
						if level == -1 then link = prolog_label.. comma.. label_x end
					elseif wiki == 'lb' then
						if level > 0 then link = prolog_label.. comma.. '[[:'..wiki..':'..Sitelink_x..'#'..prolog_label.. '|'.. label_x.. ']]' end
						if level == 0 then link = '[[:'..wiki..':'..Sitelink_x..'#'..prolog_label.. '|'.. prolog_label.. comma.. label_x.. ']]' end
						if level == -1 then link = prolog_label.. comma.. label_x end
					else label_x = prolog_label.. ', '.. label_x 
					end
				end
			end

			------------------------------------------------------
			
			if level == -1 and link == nil then
				local Sitelink = ''
				local entity_k = mw.wikibase.getEntityObject( h['raceID'] )
				Sitelink = entity_k:getSitelink(wiki..'wiki')
				if Sitelink ~= '' and Sitelink ~= nil then				
					link = '[['..Sitelink..'|'..label_x..']]'
				end
			end
			mw.log(multi_stage, entity_type)
			if level >= 0 and link == nil and Sitelink_x ~= '' then
				if multi_stage ~= false then
					if onwikidata == true then link = victories_translate(wiki,1).. ', '.. '[[:fr:'..Sitelink_x..'|'..label_x..']]'
					else 
						if wiki == 'fr' then link = victories_translate(wiki,1).. ', '.. '[['..Sitelink_x..'|'..label_x..']]'
						else link = '[['..Sitelink_x..'|'..label_x..']]'.. ', '.. victories_translate(wiki,1) end				
					end			
				else
					if onwikidata == true then link = '[[:fr:'..Sitelink_x..'|'..label_x..']]'
					else 
						link = '[['..Sitelink_x..'|'..label_x..']]'
					end
				end
			end
			if link == nil then link = label_x end
		
			if available_list==true and country == true then str =  '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..link.. '</td>'
			else
				fn2_country()
				if h['countryID'] ~= '' then str = '<td style="text-align:'.. textalign ..';padding:0 0.5em">'.. flag(h['countryID'], timeofrace).. ' '.. link.. '</td>'
				else str = '<td style="text-align:'.. textalign ..';padding:0 2.3em">'..link.. '</td>'
				end
			end		
		return str
		end	
	
		local function fn_country(h)
			local str
			if available_list==true and country == true then
				fn2_country()
				if h['countryID'] ~= '' and h['countryName'] ~= '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em">'..flag(h['countryID'], timeofrace).. ' '.. h['countryName'].. '</td>'
				elseif h['countryID'] == '' and h['countryName'] ~= '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em">'.. '   '.. h['countryName'].. '</td>'
				elseif h['countryID'] ~= '' and h['countryName'] == '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em">'..flag(h['countryID'], timeofrace).. '</td>'
				elseif h['countryID'] ~= '' and h['countryName'] ~= '' then str = '<td style="text-align:' .. textalign .. ';padding:0 0.5em">'.. '   '.. '</td>'		
				end
			else str = ''
			end
		return str
		end

		local function fn_class(h)
			local entity_race = mw.wikibase.getEntityObject( h['raceID'] )
			local entity_type, entity_num = '', 0 
			local class_text = ''
			local link = ''
			local Sitelink
			sortkey_class = ''
			
			a, b = pcall(fooA, 'numeric-id', entity_race, 'P31', 1)
			if a == true then
				-- test for stage item
				for i=1,#stages do
					if "Q"..b == stages[i] then entity_type = 'stage item' end
				end
			end		

		if entity_type == 'stage item' then 
			local a1, b1
			a1, b1 = pcall(fooA, 'numeric-id', entity_race, 'P361', 1)
			if a1 == true then
				local a, b, c, d
				local entity = mw.wikibase.getEntityObject( 'Q'..b1 )
				a, b = pcall(fooA, 'numeric-id', entity, 'P31', 1) -- first value for P31
				c, d = pcall(fooA, 'numeric-id', entity, 'P31', 2) -- second value for P31
				if a == true and c == true then -- for two values
					for i=1,#class do -- #class = number of elements in class
						if "Q"..d == class[i] then class_text = mw.wikibase.label('Q'..d) sortkey_class = class_sort['Q'..d] break end
					end -- for i
				end -- if a
			end
			link = class_text
			if link ~= '' then 
				a, b = pcall(fooA, 'numeric-id', entity_race, 'P361', 1) -- first value for P361
				if a == true then 
					entity_II = mw.wikibase.getEntityObject('Q'..b)
					c, d = pcall(fooA, 'numeric-id', entity_II, 'P361', 1) -- first value for P361
					if c == true then entity_circuit = mw.wikibase.getEntityObject('Q'..d) end
				end
			end
		else -- not a stage item
			local a, b, c, d, e, f
			a, b = pcall(fooA, 'numeric-id', entity_race, 'P31', 1) -- first value for P31
			c, d = pcall(fooA, 'numeric-id', entity_race, 'P31', 2) -- second value for P31
			if a == true and c == true then -- for two values
				for i=1,#class do -- #class = number of elements in class
					if "Q"..d == class[i] then class_text = mw.wikibase.label('Q'..d) sortkey_class = class_sort['Q'..d] break end
					if "Q"..b == class[i] then class_text = mw.wikibase.label('Q'..b) sortkey_class = class_sort['Q'..b] break end
				end
			end
		
			link = class_text
			if link ~= '' then 
				a, b = pcall(fooA, 'numeric-id', entity_race, 'P361', 1) -- first value for P361
				if a == true then entity_circuit = mw.wikibase.getEntityObject('Q'..b) end
			end
		end

		if link ~= '' then 
			e, f = pcall(fooA, 'numeric-id', entity_circuit, 'P31', 1)
			if e == true then 
				for i=1,#UCI_Circuits do -- abcd
					if "Q"..f == UCI_Circuits[i] then
						if onwikidata == true then 
							Sitelink = entity_circuit:getSitelink('frwiki')
							if Sitelink~= nil then link = '[[:fr:'..Sitelink..'|'..link..']]' end
						else
							Sitelink = entity_circuit:getSitelink(wiki..'wiki')
							if Sitelink~=nil then link = '[['..Sitelink..'|'..link..']]' end
						end
						break 
					end
				end
			end
		end
		return '<td data-sort-value="'..sortkey_class.. '" style="text-align:center;padding:0 0.5em">'..link.. '</td>'
		end

		local function fn_rider(h)
			local qual 
			local winner= ''
			local winner_flag=''

			a, b = pcall(fooC, 'numeric-id', entity_race, 'P1346', 1, 'P642', 1)
			if a == true then 
				winner = '' winner_flag = ''
				for k, v in ipairs(entity_race.claims["P1346"]) do
					for kk, vv in ipairs(v.qualifiers['P642']) do 
						if vv.datavalue.value['numeric-id'] == 20882667 then -- overall winner general classification
							winner = 'Q'.. v.mainsnak.datavalue.value['numeric-id']
						end
						if vv.datavalue.value['numeric-id'] == 20882747 then  -- stagewinner
							if winner == '' then winner = 'Q'.. v.mainsnak.datavalue.value['numeric-id'] end
						end
					end
				end
			winner_flag = ''
			local a, b = timeStartEnd(winner, "P27", 'numeric-id', timeofrace)
			if a == true then 
				winner_flag = flag('Q'..b, timeofrace).. ' '		
			end
		end

		if winner ~= '' then
			local winner_team = false
			local entity_winner = mw.wikibase.getEntityObject( winner )
			a, b = pcall(fooA, 'numeric-id', entity_winner, 'P31', 1) -- looking if winner is a person
			if a == true and b ~= 5 then winner_team = true end			
			
			if winner_team == false then return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..winner_flag.. WPlink(winner).. '</td>' 
			else 
			winner_flag = ''
			local a, b = timeStartEnd(winner, "P17", 'numeric-id', timeofrace) -- flag of team
		   	if a == true then 
		   		winner_flag = flag('Q'..b, timeofrace).. ' '		
			end			
				return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..winner_flag ..WPlink(winner, 'team', timeofrace).. '</td>' 
			end
		else return '<td style="text-align:'.. textalign ..';padding:0 0.5em">'..''.. '</td>'
		end
		end

		tBody = '<tr style= "line-height: 1.8em; padding: 5px;">' -- start the table row
		for k,v in ipairs({fn_date(h), fn_race(h), fn_country(h), fn_class(h), fn_rider(h)}) do
			tBody = tBody.. v 
		end
		tBody = tBody.. '</tr>' -- end the table row

		local number = table.getn(tableBody)
		--Insertion sort
		if number == 0 then
			table.insert(sortindex, sortkey)
			table.insert(tableBody, tBody)	
		elseif sortkey >= sortindex[number] then
			table.insert(sortindex, sortkey)
			table.insert(tableBody, tBody)
		else
			for i=number,2,-1 do 
				if sortkey >= sortindex[i] then 
					table.insert(sortindex, i+1, sortkey)
					table.insert(tableBody, i+1, tBody)
					break
				end
			end		
		end
	end
	return table.concat (tableBody)
end

function tableA(s, tableBody)
	local s = s
	local tableBody = tableBody
	local available_list = available_list
	local entity = mw.wikibase.getEntityObject( s.item )

	local error_message = ''
	if s.error_message == 1 then
		error_message = func_error_message(wiki, 1)
		error_message = mw.ustring.gsub(error_message, "<1>", s.property)
		error_message = mw.ustring.gsub(error_message, "<2>", mw.wikibase.label( s.item ))
		error_message = mw.ustring.gsub(error_message, "<3>", s.item)		
			error_message = ' [[File:Exclam icon.svg|24px|'.. error_message .. ']]' 
	end

	local tableHeader2_size = table.getn(s.header_2)
	local tableStart = '<table border="0" cellspacing="0" cellpadding="0" class="sortable"><tr><th colspan="' .. tostring(tableHeader2_size + 1) .. '"' ..
		' style="padding:2px 2px; text-align:center; background-color:#FFDF80; line-height: 1.8em;">'
	local tableHeader1 = '<span style="float:left">[[File:Wikidata-logo S.svg|24px|link=d:'.. s.item.. '#'.. s.property..']]'.. error_message .. '</span>' .. 
		s.header_function (wiki, s.header_1) .. '</th></tr>'
	local tableHeader2 = '<tr>'

	local country = true
	for _, value in pairs(s.no_country) do -- get data if country should be printed in this wiki
    	if value == wiki then country = false end
	end

	for i,k in ipairs(s.header_2) do
		if i == s.country_column then
			if available_list==true and country == true then 
			tableHeader2 = tableHeader2.. '<th style="text-align:center;padding:2px 20px 2px 2px;white-space:nowrap">'.. s.header_function (wiki, k) .. '</th>' end 
		end
		if i ~= s.country_column then
			if s.data_sort_type[i] == 'unsortable' then tableHeader2 = tableHeader2.. '<th class="unsortable" style="text-align:center;padding:2px 20px 2px 2px;white-space:nowrap">' .. s.header_function (wiki, k) .. '</th>'
			else tableHeader2 = tableHeader2.. '<th style="text-align:center;padding:2px 20px 2px 2px;white-space:nowrap">' .. s.header_function (wiki, k) .. '</th>'
			end
		end
	end

	tableHeader2 = tableHeader2 .. '</tr>'
	
	local tableEnd = '</table>'	
	
	return '<table style="border:1px solid rgb(200,200,200)"><tr><td>' .. tableStart .. tableHeader1 .. tableHeader2 .. tableBody .. tableEnd .. '</td></tr></table>'
end

function stageinfobox_translate(x) 
	-- This function permits to translate fields of the infobox for stages. Take the line below, give a Wikipedia (ex : mk), and translate all fields. By default, English values are taken.
 	local l10nDef = { }
	l10nDef["ar"] = {"تفاصيل السباق", "سباق", "نوع", "تاريخ", "تاريخ", "مسافة", "بلد", "بلدان", "نقطة البداية", "نقطة النهاية", "الدراجين في البداية", 
	"الدراجين في النهاية", "متوسط السرعة", "الكلفة", "نتائج المرحلة", "الفائز", "الثاني", "الثالث", "متمرس", 
	"التصنيف العام بعد المرحلة", "القائد", "الثاني", "الثالث", 
	"التصنيفات الثانوية بعد المرحلة", "النقاط", "الجبل", "سباقات السرعة", "شاب", "تصنيف القتال", "ممتزجة", "سباقات السرعة", "الانتظام", 
	"فريق", "فريق حسب النقاط", "صورة", "أسطورة", "بطاقة", "عرض الاقسام", "توثيق"
	, "سيما كوبي", "سيما بانتاني", "أزوري دي إيطاليا", "فوجا بيناريلو"}
	l10nDef["en"] = {"Race details", "Race", "Type", "Date", "Dates", "Distance", "Country", "Countries", "Journey origin", "Lieu d'arrivée", "Starting riders", 
	"Arriving riders", "Average speed", "Cost", "Stage results", "Winner", "Second", "Third", "Combative", 
	"General classification after stage", "Leader", "Second", "Third", 
	"Secondary classifications after stage", "Points", "Mountain", "Sprints", "Young", "Combativity", "Combinated", "Intermediate sprints", "Regularity", 
	"Team", "Team by points", 
	"Image", "Legend", "Card", "Sectional view", "Documentation", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Fuga Pinarello"}
	
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["fr"] end  -- default
	return l10n[x]	
end 

function jersey(wiki, winner_classification, item, timeofrace)
	local jersey, jersey_name = '', ''
	local jerseyWPID = ''
	local starttime, endtime = '', '+2500'
	local a1, b1

	-- 1. Item of race, e.g. Tour de France = 'Q33881'
	-- 2. type of winner, names are the ones in variable t_s
	-- 3. and 4. start and end time. '+2500' means year 2500. Always beginning with a '+'
	-- 5. item of the jersey
	-- 6. item of the Wikipedia article of that jersey
	
	local data={{'Q33881', 'montagne', '+1975', '+2500', 'Q25265958', 'Q927157'}, -- Tour de France
				{'Q33881', 'leader', '+1919', '+2500', 'Q24257871', 'Q738903'}, 
				{'Q33881', 'points', '+1953', '+1967', 'Q24645209', 'Q175399'}, -- Jersey green.svg
				{'Q33881', 'points', '+1968', '+1968', 'Q26919974', 'Q175399'},	-- 	Jersey red.svg	
				{'Q33881', 'points', '+1969', '+2500', 'Q24645209', 'Q175399'}, -- Jersey green.svg
				{'Q33881', 'jeune', '+1975', '+2500', 'Q24645383', 'Q2254180'}, -- Jersey white.svg
				{'Q33881', 'winner_fighting', '+2003', '+2500', 'Q27644113', 'Q2094179'}, -- Jersey red number.svg
				{'Q33881', 'winner_fighting2', '+2003', '+2500', 'Q27644113', 'Q2094179'}, -- Jersey red number.svg				
				{'Q33881', 'equipe', '+2006', '+2500', 'Q27644112', 'Q1436680'},	-- Jersey yellow number.svg
				
				{'Q33861', 'leader', '+1931', '+2500', 'Q24257763', 'Q1164275'}, -- Giro d'Italia, Jersey pink.svg
				{'Q33861', 'points', '+1967', '+1968', 'Q26919974', 'Q641083'}, -- Jersey red.svg
				{'Q33861', 'points', '+1969', '+2009', 'Q26945272', 'Q641083'}, -- Jersey violet.svg
				{'Q33861', 'points', '+2010', '+2016', 'Q26919974', 'Q641083'}, -- Jersey red.svg	
				{'Q33861', 'points', '+2017', '+2500', 'Q26945272', 'Q641083'}, -- Jersey violet.svg
				{'Q33861', 'montagne', '+1974', '+2011', 'Q24645209', 'Q641060'}, -- Jersey green.svg
				{'Q33861', 'montagne', '+2012', '+2500', 'Q24687409', 'Q641060'}, -- Jersey blue.svg
				{'Q33861', 'jeune', '+1976', '+2500', 'Q24645383', 'Q641662'}, -- Jersey white.svg
				
				{'Q33937', 'leader', '+1935', '+1936', 'Q24258056', 'Q3278226'}, -- Vuelta a España, Jersey orange.svg
				{'Q33937', 'leader', '+1941', '+1941', 'Q26696171', 'Q640430'}, -- Jersey white.svg
				{'Q33937', 'leader', '+1942', '+1942', 'Q24258056', 'Q3278226'}, -- Jersey orange.svg
				{'Q33937', 'leader', '+1945', '+1945', 'Q24257872', 'Q2534046'}, -- Jersey red.svg
				{'Q33937', 'leader', '+1946', '+1950', 'Q26696171', 'Q640430'}, -- Jersey white.svg
				{'Q33937', 'leader', '+1955', '+1976', 'Q24257871', 'Q738903'}, -- Jersey yellow.svg
				{'Q33937', 'leader', '+1977', '+1977', 'Q24258056', 'Q3278226'}, -- Jersey orange.svg
				{'Q33937', 'leader', '+1978', '+1998', 'Q24257871', 'Q738903'}, -- Jersey yellow.svg
				{'Q33937', 'leader', '+1999', '+2009', 'Q24257991', 'Q27665179'}, -- Jersey gold.svg
				{'Q33937', 'leader', '+2010', '+2500', 'Q24257872', 'Q2534046'}, -- Jersey red.svg
				{'Q33937', 'points', '+1945', '+1986', 'Q24687409', 'Q2746711'}, -- Jersey blue.svg
				{'Q33937', 'points', '+1987', '+1989', 'Q24645209', 'Q11638007'}, -- Jersey green.svg
				{'Q33937', 'points', '+1990', '+2009', 'Q24687409', 'Q2746711'}, -- Jersey blue.svg
				{'Q33937', 'points', '+2010', '+2500', 'Q24645209', 'Q11638007'}, -- Jersey green.svg
				{'Q33937', 'montagne', '+1935', '+1985', 'Q27670182', 'Q11638007'}, -- Jersey green.svg
				{'Q33937', 'montagne', '+1986', '+1986', 'Q27670174', 'Q3278226'}, -- Jersey orange.svg
				{'Q33937', 'montagne', '+1987', '+1987', 'Q27670178', 'Q2534046'}, -- Jersey red.svg
				{'Q33937', 'montagne', '+1988', '+1989', 'Q27670105', 'Q27670115'}, -- Jersey blackdots.png
				{'Q33937', 'montagne', '+1990', '+2005', 'Q27670182', 'Q11638007'}, -- Jersey green.svg
				{'Q33937', 'montagne', '+2006', '+2008', 'Q27670174', 'Q3278226'}, -- Jersey orange.svg
				{'Q33937', 'montagne', '+2009', '+2009', 'Q27670126', 'Q27670163'}, -- Jersey granate.svg
				{'Q33937', 'montagne', '+2010', '+2500', 'Q25265959', 'Q27670167'}, -- Jersey bluedots.svg
				
				{'Q2091354', 'leader', '+2011', '+2500', 'Q24257871', 'Q30020298'}, -- Tour of Norway, Jersey yellow.svg
				{'Q2091354', 'points', '+2011', '+2500', 'Q24645209', 'Q30020298'}, -- Jersey green.svg
				{'Q2091354', 'montagne', '+2011', '+2015', 'Q25265958', 'Q30020298'}, -- Jersey polkadot.svg
				{'Q2091354', 'montagne', '+2016', '+2500', 'Q27670174', 'Q30020298'}, -- Jersey orange.svg
				{'Q2091354', 'jeune', '+2011', '+2500', 'Q24645383', 'Q30020298'}, -- Jersey white.svg
				{'Q2091354', 'winner_fighting', '+2017', '+2500', 'Q29957114', 'Q30020298'}, -- MaillotCyan.PNG
				{'Q128713', 'leader', '+2013', '+2500', 'Q24257871', 'Q30020299'}, -- Tour des Fjords, Jersey yellow.svg
				{'Q128713', 'points', '+2013', '+2014', 'Q24645209', 'Q30020299'}, -- Jersey green.svg
				{'Q128713', 'points', '+2015', '+2500', 'Q24687409', 'Q30020299'}, -- Jersey blue.svg
				{'Q128713', 'montagne', '+2013', '+2500', 'Q25265958', 'Q30020299'}, -- Jersey polkadot.svg
				{'Q128713', 'jeune', '+2013', '+2500', 'Q24645383', 'Q30020299'}, -- Jersey white.svg
				{'Q128713', 'winner_fighting', '+2015', '+2015', 'Q30035038', 'Q30020299'}, -- Jersey green.svg
				{'Q128713', 'winner_fighting', '+2016', '+2500', 'Q30035039', 'Q30020299'}, -- Jersey orange.svg
				{'Q128961', 'leader', '+2013', '+2500', 'Q24687408', 'Q30020300'}, -- Arctic Race of Norway, Jersey blue.svg
				{'Q128961', 'points', '+2013', '+2500', 'Q24645209', 'Q30020300'}, -- Jersey green.svg
				{'Q128961', 'montagne', '+2013', '+2014', 'Q27670178', 'Q30020300'}, -- Jersey red.svg
				{'Q128961', 'montagne', '+2015', '+2500', 'Q27670174', 'Q30020300'}, -- Jersey orange.svg
				{'Q128961', 'jeune', '+2013', '+2500', 'Q24645383', 'Q30020300'}, -- Jersey white.svg
				{'Q128961', 'winner_fighting', '+2014', '+2500', 'Q27644113', 'Q30020300'}, -- Jersey red number.svg
				{'Q17619325', 'leader', '+2014', '+2014', 'Q24257871', 'Q30020302'}, -- Ladies Tour of Norway, Jersey yellow.svg
				{'Q17619325', 'leader', '+2015', '+2016', 'Q26945272', 'Q30020302'}, -- Jersey violet.svg
				{'Q17619325', 'leader', '+2017', '+2500', 'Q24257871', 'Q30020302'}, -- Jersey yellow.svg
				{'Q17619325', 'points', '+2014', '+2500', 'Q24645209', 'Q30020302'}, -- Jersey green.svg
				{'Q17619325', 'montagne', '+2014', '+2500', 'Q25265958', 'Q30020302'}, -- Jersey polkadot.svg
				{'Q17619325', 'jeune', '+2014', '+2500', 'Q24645383', 'Q30020302'}, -- Jersey white.svg
				{'Q17619325', 'winner_fighting', '+2016', '+2500', 'Q30035039', 'Q30020302'}} -- Jersey orange.svg
			
	--timeofrace = '+1968-07-01T00:00:00Z'
	timeofrace = string.sub(timeofrace, string.find(timeofrace,  "+%d%d%d%d"))
	for k, v in pairs(item) do	
		for key, value in pairs(data) do
			if v == value[1] then
				if winner_classification == value[2] then
					if (timeofrace >= value[3]) and (timeofrace <= value[4]) then
						jersey = value[5]
						jerseyWPID = value[6]
					end
				end
			end
		end
	end

	if jersey~='' then --and (timeofrace > starttime) and (timeofrace < endtime) then 
		local entity_jersey = mw.wikibase.getEntity(jersey)
			jersey = entity_jersey.claims['P18'][1].mainsnak.datavalue.value
			jersey_name = entity_jersey:getLabel(wiki) or entity_jersey:getLabel('en') or ''
		if jerseyWPID~= '' then 
			local entity = mw.wikibase.getEntity( jerseyWPID )
			local Sitelink = entity:getSitelink(wiki..'wiki') -- link to WParticle
			if Sitelink~= nil then jerseyWPID = wiki..':'..Sitelink else jerseyWPID = '' end
		end
		return jersey, jersey_name, jerseyWPID
	else return '', '', ''
	end
end

function p.stageinfobox(frame)
	local vvv= ''
	local tab
	local entityId = frame.args[1]
	local lang = mw.language.getContentLanguage()
	local timeofrace
	local a1, b1, c1, a2, b2, a3, b3
	local jerseyWPID, jersey_name
	local t_g = {show=true, name='', icon='', picture='', caption='', course= '', race={}, is_a='', startplace='', endplace='', time='', 
		length='', length_unit='', speed='', speed_unit='', nr_participants_start="", nr_participants_end='', country={}, 
		series_ordinal_previous="", series_ordinal_next="", map='', sectional_view='',previous="", next=""}
	local t_s = {order={'results', 'classement_gen', 'classement_annex'},
		results={show=false, header=15, order = {'first','second','third','winner_fighting','winner_fighting2','cima_coppi','cima_pantani'},
			-- name rider, stageinfobox_translate number, gender, jersey, team name, time, time gap, points, speed, rank
			first={"", 16, "", '', "", "", '', '', '', ''},
			second={"", 17, "", '', '', "", '', '', '', ''},
			third={"", 18, "", '', '', "", '', '', '', ''},
			winner_fighting={"", 19, "", '', '', '', '', '', '', ''},
			winner_fighting2={"", 19, "", '', '', '', '', '', '', ''}, -- two winner_fighting possible
			cima_coppi={"", 40, "", '', '', '', '', '', '', ''},
			cima_pantani={"", 41, "", '', '', '', '', '', '', ''}},
		
		classement_gen={show=false, header=20, order = {"leader", "deuxieme", "troisieme"},
			-- name rider, stageinfobox_translate number, gender, jersey, team name, time, time gap, points, speed, rank
			leader={"", 21, "", '', "", "", '', '', '', ''},
			deuxieme={"", 22, "", '', '', "", '', '', '', ''},
			troisieme={"", 23, "", '', '', "", '', '', '', ''}},

		classement_annex={show=false, header=24, order={"points","montagne","sprints","jeune","super_combatif","combine",
			"stage_volantes","regularite","azzurri_ditalia","fuga_pinarello","equipe","equipe_points"},
			-- name rider, stageinfobox_translate number, gender, jersey, team name, time, time gap, points, speed, rank
			points={"", 25, "", '', "", '', "", '', '', ''},
			montagne={"", 26, "", '', '', '', "", '', '', ''},
			sprints={"", 27, "", '', '', '', "", '', '', ''},
			jeune={"", 28, "", '', '', '', '', '', '', ''},
			super_combatif={"", 29, "", '', "", "", '', '', '', ''},
			combine={"", 30, "", '', '', "", '', '', '', ''},
			stage_volantes={"",31,'','','','','','', '', ''},
			regularite={"",32,'','','','','','', '', ''},
			azzurri_ditalia={"",42,'','','','','','', '', ''},
			fuga_pinarello={"",43,'','','','','','', '', ''},
			equipe={"", 33, "", '', '', "", '', '', '', ''},
			equipe_points={"", 34, "", '', '', '', '', '', '', ''}}
		}

	if type( entityId ) ~= 'string' then error( 'parameter must be a string') end
	if not entityId:match( 'Q%d+' ) then error ( 'parameter must be a valid Wikidata item (ex: Q42)' ) end
	local entity = mw.wikibase.getEntity( entityId )

	if entity:getLabel('ar') ~= nil then t_g.name = entity:getLabel('ar')
	else t_g.name = entity:getLabel('ar') or entity:getLabel('en') or '' end
	if wiki == 'fr' and t_g.name ~= '' then t_g.name= mw.ustring.gsub(t_g.name, "^(%d+)([re]+)", "%1<sup>%2</sup> ") end
	t_g.name= mw.ustring.gsub(t_g.name, "^(%a)",function (x) return mw.ustring.upper(x) end) 
	
	a1, b1 = pcall(fooA, 'numeric-id', entity, 'P31', 1) -- If stage is a "stage" or a timetrial stage
	if a1 == true and b1~=18131152 then t_g.is_a = 'Q'.. b1 end

	if t_g.is_a=='Q2266066' or t_g.is_a=='Q2348250' or t_g.is_a=='Q485321' then t_g.icon = " [[File:Cycling (track) pictogram.svg|35px]]" 
	else t_g.icon = " [[File:Cycling (road) pictogram.svg|35px]]" end 

	a1, b1 = pcall(fooA, 'value', entity, 'P18', 1) -- picture, legende
	if a1 == true and t_g.picture == "" then 
		local v
		t_g.picture = b1
		if pcall(foo3, entity, "P18", 1, "P2096", 1) then
			for _, v in pairs(entity.claims["P18"]) do
				pcall(function()
					for num=1,#v.qualifiers["P2096"] do	-- find right language
						if v.qualifiers["P2096"][num].datavalue.value.language == lang:getCode() then
							t_g.caption = v.qualifiers["P2096"][num].datavalue.value.text end
					end
				end) 
			end
		end
	end

	-- Function that give the starting place of a race 
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', 1) 
	if a1 == true and t_g.startplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', i) 
		end   
		t_g.startplace = "Q" .. b1 
	end	
	-- Function that give the finishing place of a race
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', 1) 
	if a1 == true and t_g.endplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', i) 
		end   
		t_g.endplace = "Q" .. b1 
	end	

-- This function give a format to dates when P585 (date) is used in a single day race
	a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', 1) 
	if a1 == true and t_g.time == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', i) 
		end  		
		t_g.time = func_date (b1, 'long') 
		timeofrace = b1
	end

	-- Function that give the number of cyclists at the beginning and at the finishing of a race
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', 1) 
	if a1 == true and t_g.nr_participants_start == "" and t_g.nr_participants_end == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', i) 
		end 
		local v
		for _, v in pairs(entity.claims["P1132"]) do
			if pcall(function()
		   		if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 529711 then
				t_g.nr_participants_start = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
				end
			) then else t_g.nr_participants_start = "" end
			if pcall(function()
				if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 12769393 then
				t_g.nr_participants_end = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
			end
			) then else t_g.nr_participants_end = "" end
		end	
	end 

-- This function permits to display an unity (the kilometer) for a distance, with exceptions for macedionan, russian and japanese 
	-- that have other symbols 
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', 1) 
	if a1 == true and t_g.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', i) 
		end   
		t_g.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P3157', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t_g.length_unit = 'km'
			if  wiki == "ar" then t_g.length_unit = 'كم' end
		end
	end

	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', 1) 
	if a1 == true and t_g.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', i) 
		end   
		t_g.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P2043', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t_g.length_unit = 'km'
			if  wiki == "ar" then t_g.length_unit = 'كم' end
		end
	end
	-- This function permits to display an unity (the kilometer per hour) for an average speed, with exceptions for macedionan, russian and japanese 
	-- that have other symbols
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', 1) 
	if a1 == true and t_g.speed == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', i) 
		end 
		t_g.speed = b1
		a1, b1 = pcall(fooA, 'unit', entity, 'P2052', 1)
		if b1 == "http://www.wikidata.org/entity/Q180154" then
			t_g.speed_unit = 'km/h'
			if  wiki == "ar" then t_g.speed_unit = 'كم/س' end	
		end
	end	-- if a1

	a1, b1 = pcall(fooA, 'numeric-id', entity, 'P17', 1) -- This function gives countries where the race take place
	if a1 == true then
		for i, v in pairs(entity.claims["P17"]) do
   			t_g.country[i] = "Q" .. v.mainsnak.datavalue.value["numeric-id"]
   		end
 	end

	a1, b1 = pcall(fooA, 'value', entity, 'P242', 1) -- locator map image
	if a1 == true and t_g.map == "" then t_g.map = b1 end
	a1, b1 = pcall(fooA, 'value', entity, 'P2713', 1) -- sectional view
	if a1 == true and t_g.sectional_view == "" then t_g.sectional_view = b1 end	

	a1, b1 = pcall(fooA, 'numeric-id', entity, 'P155', 1) 
	if a1 == true and t_g.previous == "" then 
		t_g.previous = "Q"..b1 
		a2, b2 = pcall(fooA, 'value', mw.wikibase.getEntity( t_g.previous ), 'P1545', 1)
		if a2 == true then t_g.series_ordinal_previous = b2 end		
	end	
	a1, b1 = pcall(fooA, 'numeric-id', entity, 'P156', 1) 
	if a1 == true and t_g.next == "" then 
		t_g.next = "Q"..b1 
		a2, b2 = pcall(fooA, 'value', mw.wikibase.getEntity( t_g.next ), 'P1545', 1)
		if a2 == true then t_g.series_ordinal_next = b2 end		
	end

	local t_P642 = {[20882747]={'results', 'first'}, [20882748]={'results', 'second'}, [20882749]={'results', 'third'}, [21686770]={'results', 'winner_fighting'},
			[2250962]={'results', 'cima_coppi'}, [10452933]={'results', 'cima_pantani'},
			[20882763]={'classement_gen', 'leader'}, [20882764]={'classement_gen', 'deuxieme'}, [20882765]={'classement_gen', 'troisieme'},
			[20883213]={'classement_annex', 'montagne'}, [20883140]={'classement_annex', 'jeune'}, [20883008]={'classement_annex', 'points'}, 
			[20883329]={'classement_annex', 'sprints'}, [20893984]={'classement_annex', 'super_combatif'}, [20965880]={'classement_annex', 'combine'}, 
			[27104688]={'classement_annex', 'stage_volantes'}, [27104684]={'classement_annex', 'regularite'}, [20882922]={'classement_annex', 'equipe'}, 
			[27104271]={'classement_annex', 'equipe_points'},
			[20882667]={'classement_gen', 'leader'}, [20882668]={'classement_gen', 'deuxieme'}, [20882669]={'classement_gen', 'troisieme'},
			[20883212]={'classement_annex', 'montagne'}, [20883139]={'classement_annex', 'jeune'}, [20883007]={'classement_annex', 'points'}, 
			[20883328]={'classement_annex', 'sprints'}, [20893983]={'classement_annex', 'super_combatif'}, [20893979]={'classement_annex', 'combine'}, 
			[27067359]={'classement_annex', 'stage_volantes'}, [27067170]={'classement_annex', 'regularite'}, 
			[27907747]={'classement_annex', 'azzurri_ditalia'}, [27907748]={'classement_annex', 'azzurri_ditalia'}, 			
			[27907714]={'classement_annex', 'fuga_pinarello'}, [27907715]={'classement_annex', 'fuga_pinarello'}, 
			[20882921]={'classement_annex', 'equipe'}, [27104269]={'classement_annex', 'equipe_points'}
			}

	a1, b1 = pcall(fooA, 'numeric-id', entity, "P1346", 1)
	if a1 == true then
		local deprecated, qual, id, id_team, id_time, id_time_gap, id_speed, id_points_a, id_points_b
		for k, v in pairs(entity.claims["P1346"]) do
			id_team, id_speed, id_time, id_time_gap, id_points_a, id_points_b = '', '', '', '', '', ''
			a, b = pcall(fooC, 'numeric-id', entity, 'P1346', k, 'P54', 1)
			if a == true then id_team = 'Q'..b  end

			if pcall(function() 
				id=v.mainsnak.datavalue.value['numeric-id'] -- id = rider id
				deprecated = entity.claims["P1346"][k].rank
				end) then
			else id=nil end
			if id ~= nil then
				--timeofrace = "+2016-03-00T00:00:00Z"
				-- function timeStartEnd finds the team of the rider at the time (timeofrace) of the race
				if id_team == '' and timeofrace ~= nil and timeofrace ~= '' then
					a, b = timeStartEnd('Q'..id, 'P54', 'numeric-id', timeofrace)
					if a == true and b ~= nil then id_team = 'Q' .. b end
				end

				-- looks into race item if the winner has a P54 statement for beeng a member of a national team
				pcall(function()
					for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P54']) do
						id_team = national_team(  'Q'..id, timeofrace, entity, 'P1346', k) -- timeofrace -> startOfSeason ?????
						if id_team == nil then id_team = '' end
					end
				end)

		   		pcall(function() -- for property 'race time'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P2781']) do
			   			id_time = tonumber(v.datavalue.value.amount)
					end
				end)

	   			pcall(function() -- for property 'time gap'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P2911']) do
	   					id_time_gap = tonumber(v.datavalue.value.amount)
					end
				end)

		   		pcall(function() -- for property 'speed'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P2052']) do
			   			id_speed = tonumber(v.datavalue.value.amount)
					end
				end)

				pcall(function() -- for property 'points for'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P1358']) do
		   				id_points_a = tonumber(v.datavalue.value.amount)
					end
				end)

				pcall(function() -- for property 'number of points/goals/set scored'
					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P1351']) do
		   				id_points_b = tonumber(v.datavalue.value.amount)
					end
				end)

				-- looks into race item if the winner has a P642 statement for showing the type of winner (points, mountain, ..)
				pcall(function()
					for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P642']) do
						qual=vv.datavalue.value['numeric-id']

						if id~=nil and qual~=nil and v.rank~='deprecated' then
							if qual==21686770 and t_s['results']['winner_fighting'][1] ~= '' then t_P642[qual][2] = 'winner_fighting2' end
							pcall(function() -- inserts WD data into table t_s
								t_s[t_P642[qual][1]][t_P642[qual][2]][1]='Q'..id
								t_s[t_P642[qual][1]][t_P642[qual][2]][5]=id_team
								t_s[t_P642[qual][1]][t_P642[qual][2]][10]=deprecated
								if id_time~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][6]=id_time end
								if id_time_gap~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][7]=id_time_gap end
								if id_points_a~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][8]=id_points_a end
								if id_points_b~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][8]=id_points_b end
								if id_speed~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][9]=id_speed end
							end)
							if qual==27104271 and t_s.classement_annex.equipe_points[1]=='' then t_s.classement_annex.equipe_points[1]='Q'..id end
							if qual==20882922 and t_s.classement_annex.equipe[1]=='' then t_s.classement_annex.equipe[1]='Q'..id end

							a1, b1 = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject('Q'..id), 'P21', 1)  -- detect gender
							if a1 == true then
								if b1 == 6581097 then t_s[t_P642[qual][1]][t_P642[qual][2]][3] = 'm' -- men
								elseif b1 == 6581072 then t_s[t_P642[qual][1]][t_P642[qual][2]][3] = 'f' -- female
								end
							else t_s[t_P642[qual][1]][t_P642[qual][2]][3] = 'f' -- female
							end
	 					end
					end
				end)
			end
		end
	end
	local rank, deprecated
	local order = {'first', 'second', 'third'}
	local property = 'P2417'
	a1, b1 = pcall(fooA, 'numeric-id', entity, property, 1)
	if a1 == true then
	for k, _ in pairs(entity.claims[property]) do -- look into P2417, stage classification
		for _, v in pairs(entity.claims[property][k].qualifiers['P1352']) do -- for property 'rank'
			rank = tonumber(v.datavalue.value.amount)
			deprecated = entity.claims[property][k].rank
		end
		if rank == 1 or rank == 2 or rank == 3 then
			t_s.results[order[rank]][10] = deprecated
			if t_s.results[order[rank]][1] == '' or t_s.results[order[rank]][10] == 'normal'  then -- name or rider / team		
				t_s.results[order[rank]][1] = 'Q' .. entity.claims[property][k].mainsnak.datavalue.value['numeric-id']
				if t_s.results[order[rank]][7] == '' and t_s.results[order[rank]][6] == '' then
		   			pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2911']) do -- for property 'time gap'
		   					t_s.results[order[rank]][7] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				if t_s.results[order[rank]][7] == '' and t_s.results[order[rank]][6] == '' then
		   			pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2781']) do -- for property 'race time'
		   					t_s.results[order[rank]][6] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				if t_s.results[order[rank]][9] == '' then
	   				pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2052']) do -- for property 'speed'
		   					t_s.results[order[rank]][9] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				a1, b1 = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(t_s.results[order[rank]][1]), 'P21', 1)  -- detect gender
				if a1 == true then
					if b1 == 6581097 then t_s.results[order[rank]][3] = 'm' -- men
					elseif b1 == 6581072 then t_s.results[order[rank]][3] = 'f' -- female
					end
				else t_s.results[order[rank]][3] = 'f' -- female
				end
			end
		end
	end
	end
	order = {'leader', 'deuxieme', 'troisieme'}
	property = 'P2321'
	a1, b1 = pcall(fooA, 'numeric-id', entity, property, 1)
	if a1 == true then
	for k, _ in pairs(entity.claims[property]) do -- look into P2321, stage classification
		for _, v in pairs(entity.claims[property][k].qualifiers['P1352']) do -- for property 'rank'
			rank = tonumber(v.datavalue.value.amount)
			deprecated = entity.claims[property][k].rank
		end
		if rank == 1 or rank == 2 or rank == 3 then
			t_s.classement_gen[order[rank]][10] = deprecated
			if t_s.classement_gen[order[rank]][1] == '' or t_s.classement_gen[order[rank]][10] == 'normal'  then -- name or rider / team
				t_s.classement_gen[order[rank]][1] = 'Q' .. entity.claims[property][k].mainsnak.datavalue.value['numeric-id']
				if t_s.classement_gen[order[rank]][7] == '' and t_s.classement_gen[order[rank]][6] == '' then
	   				pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2911']) do -- for property 'time gap'
		   					t_s.classement_gen[order[rank]][7] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				if t_s.classement_gen[order[rank]][7] == '' and t_s.classement_gen[order[rank]][6] == '' then
	   				pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2781']) do -- for property 'race time'
		   					t_s.classement_gen[order[rank]][6] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				if t_s.classement_gen[order[rank]][9] == '' then
	   				pcall(function()
						for _, v in pairs(entity.claims[property][k].qualifiers['P2052']) do -- for property 'speed'
		   					t_s.classement_gen[order[rank]][9] = tonumber(v.datavalue.value.amount)
						end
					end)
				end
				a1, b1 = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(t_s.classement_gen[order[rank]][1]), 'P21', 1)  -- detect gender
				if a1 == true then
					if b1 == 6581097 then t_s.classement_gen[order[rank]][3] = 'm' -- men
					elseif b1 == 6581072 then t_s.classement_gen[order[rank]][3] = 'f' -- female
					end
				else t_s.classement_gen[order[rank]][3] = 'f' -- female
				end
			end
		end
	end
	end

    if t_g.length ~= "" then
    	t_g.length, _ = string.gsub(t_g.length, "[+]", "") -- delets "+" sign
    	t_g.length = lang:formatNum(tonumber(t_g.length)) -- formats t_g.length in the way it is done in the local Wiki
    	if wiki == 'fo' then t_g.length = string.gsub(t_g.length, "%.", ",") end
    end
    if t_g.speed ~= "" then
    	t_g.speed, _ = string.gsub(t_g.speed, "[+]", "")
    	t_g.speed = lang:formatNum(tonumber(t_g.speed))
    	if wiki == 'fo' then t_g.speed = string.gsub(t_g.speed, "%.", ",") end
    end

	local a, b
   	local span1, span2 = "<span style='color:#3366CC'>&#x25C0; </span>", "<span style='color:#3366CC'> &#x25B6;</span>"

	if t_g.series_ordinal_previous ~= '' then
		a, _ = string.gsub(t_g.series_ordinal_previous, "%a", "") -- 20, not 20a
		if string.find(t_g.series_ordinal_previous, "%a") then b = string.sub(t_g.series_ordinal_previous, string.find(t_g.series_ordinal_previous, "%a"))
		else b = "" end
		local label_previous = stageLink(t_g.series_ordinal_previous, a, b)
		if t_g.series_ordinal_previous == "0" then label_previous = func_prologue() end
		if mw.wikibase.sitelink( t_g.previous ) ~= nil then
   			local k = transform(t_g.previous,'Q', timeofrace)
			local i, _ = string.find(k, "|")
			local j, _ = string.find(k, "]")
			if i ~= nil and j ~= nil then
				t_g.previous = string.sub(k, 1, i) .. span1 .. label_previous .. string.sub(k, j)
			else t_g.previous = span1 .. label_previous end
		else t_g.previous = span1 .. label_previous end
    	if wiki == 'www' then t_g.previous = span1 .. label_previous end
    else t_g.previous = ''
	end

	if t_g.series_ordinal_next~= '' then
		a, _ = string.gsub(t_g.series_ordinal_next, "%a", "") -- 20, not 20a
		if string.find(t_g.series_ordinal_next, "%a") then b = string.sub(t_g.series_ordinal_next, string.find(t_g.series_ordinal_next, "%a"))
		else b = "" end
		local label_next = stageLink(t_g.series_ordinal_next, a, b)
		if t_g.series_ordinal_next == "0" then label_next = func_prologue() end
		if mw.wikibase.sitelink( t_g.next ) ~= nil then
   			local k = transform(t_g.next,'Q', timeofrace)
			local i, _ = string.find(k, "|")
			local j, _ = string.find(k, "]")
			if i ~= nil and j ~= nil then
				t_g.next = string.sub(k, 1, i) .. label_next.. span2 .. string.sub(k, j)
			else t_g.next = label_next.. span2 end
		else t_g.next = label_next.. span2 end
    	if wiki == 'www' then t_g.next = label_next .. span2 end
    else t_g.next = ''
	end

	if t_g.course== '' then
		a1, b1 = pcall(fooA, 'value', entity, 'P1545', 1)
		if a1 == true then
			a, _ = string.gsub(b1, "%a", "") -- 20, not 20a
			if string.find(b1, "%a") then b = string.sub(b1, string.find(b1, "%a")) else b = "" end
			local label = stageLink(b1, a, b)
			if b1 == "0" then label = func_prologue() end
    		t_g.course = label
			a2, b2 = pcall(fooA, 'numeric-id', entity, 'P361', 1)
			if a2 == true then
				t_g.course = t_g.course .. ', '.. WPlink('Q'..b2,'pure')
				--t_g.race = 'Q'..b2
				
				local entity_race = mw.wikibase.getEntity('Q'..b2) 
				a3, b3 = pcall(fooA, 'numeric-id', entity_race, 'P31', 1) 
 				if a3 == true then 
					for k, v in pairs(entity_race.claims["P31"]) do	
						t_g.race[k] = 'Q'..v.mainsnak.datavalue.value["numeric-id"] 
					end
				end
			end
    	end
	end

	if t_s.results.first[1]~='' or t_s.results.second[1]~='' or t_s.results.third[1]~='' or t_s.results.winner_fighting[1]
		then t_s.results.show = true end
	if t_s.classement_gen.leader[1]~='' or t_s.classement_gen.deuxieme[1]~='' or t_s.classement_gen.troisieme[1]~='' 
		then t_s.classement_gen.show = true end
	if t_s.classement_annex.points[1]~='' or t_s.classement_annex.montagne[1]~='' or t_s.classement_annex.sprints[1]~='' or t_s.classement_annex.jeune[1]~='' or 
		t_s.classement_annex.super_combatif[1]~='' or t_s.classement_annex.combine[1]~='' or t_s.classement_annex.stage_volantes[1]~='' or 
		t_s.classement_annex.regularite[1]~='' or t_s.classement_annex.azzurri_ditalia[1]~='' or t_s.classement_annex.fuga_pinarello[1]~='' or 
		t_s.classement_annex.equipe[1]~='' or t_s.classement_annex.equipe_points[1]~='' then t_s.classement_annex.show = true end		

	function stage_icon(x)
 		if x=='Q20646667' then return "[[File:Plainstage.svg|20px]] " end
 		if x=='Q20646670' then return "[[File:Hillystage.svg|20px]] " end
  		if x=='Q20680270' then return "[[File:Mediummountainstage.svg|20px]] " end
  		if x=='Q20646668' then return "[[File:Mountainstage.svg|20px]] " end
  		if x=='Q20679712' then return "[[File:Mountain Time Trial Stage.svg|20px]] " end
		if x=='Q2348250' then return "[[File:Team Time Trial Stage.svg|20px]] " end
   		if x=='Q2266066' then return "[[File:Time Trial.svg|20px]] " end
   		if x=='Q485321'  then return "[[File:Time Trial.svg|20px]] " end
   		return ''
	end

	local width= '320px' -- size standard 320px, special 340px
	if t_s.classement_annex.show == true and (wiki == 'no' or wiki == '..') then width= '340px' end
	
 	tab = "<table border='0' cellpadding='4' cellspacing='0' style='float:"..floatinfobox.."; max-width:"..width.."; border:1px solid rgb(200,200,200);"
    tab = tab .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px; clear:left; "
    tab = tab .. "text-align:" .. textalign .. "; font-size:85%; line-height:1.6em;'>"
	tab = tab .. "<tr><td colspan='2' style='border-bottom:5px solid white; font-size:175%; background:#FFE7A0; text-align:center'>"
	tab = tab .. "<table style='width:100%'><tr><td>" .. t_g.name .."</td><td>" .. t_g.icon .. "</td></tr></table></td></tr>"
	
	if t_g.picture ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. t_g.picture .."|center|300px]]</td></tr>" end
	if t_g.picture ~= "" and t_g.caption ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center; font-size:80%'>"..t_g.caption.."</td></tr>" end
	if t_g.course~="" or t_g.is_a~="" or t_g.time~="" or t_g.length~="" or t_g.startplace~="" or t_g.endplace~="" then 
		tab=tab.."<tr><td colspan='2' style='background-color:#FFE7A0; text-align:center'>'''"..stageinfobox_translate(1).."'''</td></tr>" end
	if t_g.course ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(2).."'''</td><td>" .. t_g.course .. "</td></tr>" end	
	if t_g.is_a ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(3).."'''</td><td>" ..stage_icon(t_g.is_a).. WPlink(t_g.is_a,'pure').. "</td></tr>" end	
	if t_g.time~="" then tab = tab.."<tr><td>'''"..stageinfobox_translate(4).."'''</td><td>" .. t_g.time.."</td></tr>" end	
	if wiki ~= 'en' then  -- As default show only kilometers, but if 'en.wiki' show kilometers and miles
		if t_g.length ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(6).."'''</td><td>"..t_g.length.." "..t_g.length_unit.."</td></tr>" end	
	else
		if t_g.length ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(6).."'''</td><td>"..t_g.length.." "..t_g.length_unit.." ("..miles.." mi)".."</td></tr>" end	
	end		
	
	if t_g.startplace ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(9).."'''</td><td>" .. WPlink(t_g.startplace,'pure').. "</td></tr>" end	
	if t_g.endplace ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(10).."'''</td><td>" .. WPlink(t_g.endplace,'pure').. "</td></tr>" end
	if t_g.country ~= nil then for i=1,#t_g.country do t_g.country[i] = flag(t_g.country[i], timeofrace).." ".. WPlink( t_g.country[i],'pure') end end
	if t_g.country[1] ~= nil then tab = tab.."<tr><td style= 'vertical-align:top'>'''"
		if #t_g.country == 1 then tab = tab..stageinfobox_translate(7).."'''</td><td>" else tab = tab..stageinfobox_translate(8).."'''</td><td>" end
		for i=1,#t_g.country-1 do tab = tab .. t_g.country[i].."<br>" end tab = tab .. t_g.country[#t_g.country].."</td></tr>" end	
	if t_g.nr_participants_start ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(11).."'''</td><td>" .. t_g.nr_participants_start .. "</td></tr>" end
	if t_g.nr_participants_end ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(12).."'''</td><td>" .. t_g.nr_participants_end .. "</td></tr>" end	
	if wiki ~= 'en' then --As default show only kilometers/hour, but if 'en.wiki' show kilometers/hour and miles/hour
		if t_g.speed ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(13).."'''</td><td>" .. t_g.speed .. " "..t_g.speed_unit.."</td></tr>" end		
	else
		if t_g.speed ~= "" then tab = tab.."<tr><td>'''"..stageinfobox_translate(13).."'''</td><td>" .. t_g.speed .. " "..t_g.speed_unit.." ("..miles_h.." mi/h)".."</td></tr>" end	
	end		

	for _, value_order in ipairs(t_s.order) do 
		if t_s[value_order].show == true then -- if a section of the stageinfobox should be shown
			tab=tab.."<tr><td colspan='2'>"
			tab=tab.."<table border='0' cellpadding='0' cellspacing='0' style='width:100%'>"
			tab=tab.."<tr><td colspan='3' style='border-bottom:5px solid #fff2cc; background-color:#FFE7A0; text-align:center'>'''"..
				stageinfobox_translate(t_s[value_order].header).."'''</td></tr>"

			for key, value in ipairs(t_s[value_order].order) do
				if t_s[value_order][value][1]~="" then
					a1, jersey_name, jerseyWPID  = jersey(wiki, value, t_g.race, timeofrace)
					if a1~='' then t_s[value_order][value][4] = a1 end
					if t_s[value_order][value][9] ~= '' then 
						t_s[value_order][value][9] = '('.. lang:formatNum(t_s[value_order][value][9])..unit(5)..')'
						if wiki == 'fo' then t_s[value_order][value][9] = string.gsub(t_s[value_order][value][9], "%.", ",") end
					end
					if t_s[value_order][value][8] ~= '' then
						if t_s[value_order][value][8] > 1 then t_s[value_order][value][8] = t_s[value_order][value][8]..unit(7)
						else t_s[value_order][value][8] = t_s[value_order][value][8]..unit(6) end end
					local title, k =mw.ustring.gsub(stageinfobox_translate(t_s[value_order][value][2]), " ", "&nbsp;") 
					if k > 0 then title=mw.ustring.gsub(title, "&nbsp;", "<br>", 1) end --&#32;
					if t_s[value_order][value][5]=="" and t_s[value_order][value][9] =="" then
						tab=tab.."<tr style='vertical-align:top;'><td style='width:1%;background-color:#fff2cc;text-align:" .. textalign .. ";padding:0 2px 0 2px;white-space:nowrap'>'''"
					else tab=tab.."<tr style='vertical-align:top;'><td rowspan='2' style='width:1%;background-color:#fff2cc;text-align:" .. textalign .. ";padding:0 2px 0 2px;white-space:nowrap'>'''"
					end
					if value_order~='classement_annex' and t_s[value_order][value][2]~=40 and t_s[value_order][value][2]~=41 then -- Cima Coppi, Cima Pantani with a line break
						if t_s[value_order][value][4] == "" then 
							if (value_order=='results') and (value=='winner_fighting' or value=='winner_fighting2' or value=='cima_coppi' or value=='cima_pantanii') then 
								tab=tab..stageinfobox_translate(t_s[value_order][value][2])
							else tab=tab..number(t_s[value_order][value][3], key, wiki) end
						else 
							if jerseyWPID=='' then tab=tab.."[[File:"..t_s[value_order][value][4].."|20px|"..title.."]]"
							else tab=tab.."[[File:"..t_s[value_order][value][4].."|20px|"..title.."|link="..jerseyWPID.."]]" end
						end
					else 
						if t_s[value_order][value][4] == "" then tab=tab..title
						else 
							if jerseyWPID=='' then 
								if jersey_name ~= '' then tab=tab.."[[File:"..t_s[value_order][value][4].."|20px|"..jersey_name.."]]" .. title
								else tab=tab.."[[File:"..t_s[value_order][value][4].."|20px]]" .. title end
							else tab=tab.."[[File:"..t_s[value_order][value][4].."|20px|link="..jerseyWPID.."]]" .. title end end
					end  
					if t_s[value_order][value][10] == 'deprecated' then 
						tab=tab.. "'''</td><td style='padding:0 0.5em 0 0.5em'>".. '<s>' .. transform(t_s[value_order][value][1],'f', timeofrace) .. '</s>'
					else tab=tab.. "'''</td><td style='padding:0 0.5em 0 0.5em'>".. transform(t_s[value_order][value][1],'f', timeofrace) end
					tab=tab.."</td><td style='text-align:right;font-size:85%;white-space:nowrap'>" 
					if t_s[value_order][value][6]~='' then tab=tab.. calculate_time(wiki,t_s[value_order][value][6]) end
					if t_s[value_order][value][7]~='' then tab=tab..'+ '.. calculate_time(wiki,t_s[value_order][value][7]) end
					tab= tab.. t_s[value_order][value][8]..  "</td></tr>"
				end

				if t_s[value_order][value][5]~="" and t_s[value_order][value][9] ~="" then -- team row
					tab=tab.."<tr><td colspan='2'>"
					tab = tab.. "<table border='0' cellpadding='0' cellspacing='0' style='width:100%'>"
					tab = tab.. "<tr><td style='width:100%;text-align:" .. textalign .. ";padding-left:2px'>("..transform(t_s[value_order][value][5],'t', timeofrace)..
						")</td><td style='font-size:85%;vertical-align:top;white-space:nowrap'>"..t_s[value_order][value][9] .. "</td></tr></table></td></tr>"
				else
					if t_s[value_order][value][5]~="" or t_s[value_order][value][9] ~="" then -- team row
						tab=tab.."<tr><td colspan='2' style='text-align:" .. textalign .. ";padding-left:2px'>"
						if t_s[value_order][value][5] ~= '' then tab=tab..'('..transform(t_s[value_order][value][5],'t', timeofrace)..')' end
						tab = tab..  '<span style="float:right;font-size:85%;">'.. t_s[value_order][value][9].."</span></td></tr>"
					end					
				end
			end
			tab=tab.. "</table></td></tr>"
		end
	end 

	if t_g.map ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. t_g.map .."|center|300px]]".."</td></tr>" end
	if t_g.sectional_view ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. t_g.sectional_view .."|center|300px]]".."</td></tr>" end	
	tab = tab.."<tr><td>"..t_g.previous.."</td><td style='text-align:right'>" .. t_g.next .. "</td></tr>"
	local s = "d:Wikidata:WikiProject Cycling/Documentation/stageinfobox"
	tab = tab .. "<tr><td colspan='2' style='text-align:right; border-top:3px solid #FFDF80; font-size:75%'>".. --infobox_bottom(1) 
		"[[" .. s .. "|" .. stageinfobox_translate(39).. "]] [[File:Wikidata-logo S.svg|24px|link=d:".. frame.args[1]  .. "]]" 
	tab = tab .. "</td></tr>"
	tab= tab.."</table>"
	return tab
end

function transform(q_number, command, timeofrace) 
	-- transforms Q/q-number into flag / WPlink / WDlink
	local wd = " [[File:Wikidata-logo S.svg|24px|link=d:"	
	if not string.find(q_number, "^Q%d+") then return q_number end -- test if q_number is an item
	if command == "Q" then return WPlink( q_number ) end -- find variables with an item as value
	if command == 'q' then -- with WDitem icon
		--look into P27 (country of citizenship) to get the Qnumber of that country
		a, b = timeStartEnd(q_number, "P27", 'numeric-id', timeofrace)
		if a == true then return flag('Q'..b, timeofrace).." "..WPlink( q_number )..wd..q_number.."]]"
		else
			--look into P17 (country) to get the Qnumber of that country
			a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( q_number ), 'P17', 1)
			if a == true then return flag("Q"..b, timeofrace).." "..WPlink( q_number )..wd..q_number.."]]" 
			else return WPlink( q_number )..wd..q_number.."]]" end
		end
	end
	if command == "f" then -- no WDitem icon
		--look into P27 (country of citizenship) to get the Qnumber of that country
		a, b = timeStartEnd(q_number, "P27", 'numeric-id', timeofrace)
		if a == true then return flag('Q'..b, timeofrace).." "..WPlink( q_number )
		else	
			--look into P17 (country) to get the Qnumber of that country
			a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( q_number ), 'P17', 1)
			if a == true then return flag("Q"..b, timeofrace).." "..WPlink( q_number, 'team', timeofrace ) 
			else return WPlink( q_number, 'team', timeofrace ) end
		end
	end	
	if command == "c" then return WPlink( q_number, "Q22348500" ) end -- find "class"-items
	if command == "t" then return WPlink( q_number, 'team', timeofrace ) end
	if command =="2t" then return q_number end		
	return q_number
end

function p.listofteams(frame)
	local entity = mw.wikibase.getEntityObject( frame.args[1] )
	local mt = {}
	local tempID, k, u, v, v1, w, new, teamcategory, entity2, len, len2

	local startOfSeason = '' --'+2016-01-01T00:00:00Z'
	pcall(function() startOfSeason = entity.claims["P580"][1].mainsnak.datavalue.value.time end)
	if startOfSeason == '' then
		if pcall(function() startOfSeason = entity.claims["P585"][1].mainsnak.datavalue.value.time end) then
		else
			local Sitelink =  entity:getSitelink(wiki .. 'wiki') or entity:getSitelink('enwiki') or entity:getSitelink('frwiki') or entity:getSitelink('dewiki') or ''
			if Sitelink == '' then return '> Wikidata is missing data about the start time (P580) and end time (P582) of the season'
			else startOfSeason = '+'..string.match(Sitelink, '%d%d%d%d' ) ..'-01-01T00:00:00Z'
			end
		end
	end
	
	v = ''
	mt[1] = {}
	mt[1][1], mt[1][2], mt[1][3] = '', 0, ''
	local mu = {}
	local a, b
	local cache = {}
	if pcall(fooA, 'numeric-id', entity, 'P1923', 1) == true then
		for k, v1 in pairs(entity.claims['P1923']) do
			if v1.mainsnak and v1.mainsnak.datavalue and v1.mainsnak.datavalue.value and v1.mainsnak.datavalue.value['numeric-id'] then
				new = true
				teamcategory, tempID, len = '', '', 0
				tempID = 'Q'.. v1.mainsnak.datavalue.value['numeric-id']
				entity2 = mw.wikibase.getEntityObject( tempID )
				cache[tempID] = entity2
				a, b = pcall(fooA, 'numeric-id', entity2, 'P31', 1) 
				if a == true then teamcategory = 'Q'..b	else new = false end
		
				for w in pairs(mt) do
					len = table.getn(mt[w])
					if mt[w][1] == teamcategory then new=false mt[w][2]=mt[w][2]+1 len=len+1 mt[w][len]=tempID len2=len-2 end
				end
				if new == true then
					local size = table.getn(mt)
					mt[size+1] = {}
					mt[size+1][1] = teamcategory
					mt[size+1][2] = 1
					mt[size+1][3] = tempID
				end
			end
		end
	end -- if pcall(fooA
	local list = { -- c:d:e  c = singular team type, d = plural team type, e = print order of the team types
		["Q6154783"] = "4:5:1", -- WorldTeam
		["Q20638319"] = "6:7:2", -- ProTeam
		["Q382927"] = "8:9:3", -- UCI Professional Continental Team
		["Q1756006"] = "10:11:4", -- UCI Continental Team
		["Q23726798"] = "12:13:6", -- national cycling team
		["Q20738667"] = "12:13:6", -- national cycling team U23
		["Q28492441"] = "12:13:6", -- équipe cycliste nationale de marque
		["Q20639848"] = "14:15:7", -- club cycling team
		["Q20639847"] = "16:17:8", -- professional cycling team
		["Q20652655"] = "18:19:9", -- amateur cycling team
		["Q20653563"] = "20:21:10", -- Groupe Sportif I
		["Q20653564"] = "22:23:11", -- Groupe Sportif II
		["Q20653566"] = "24:25:12", -- Groupe Sportif III
		["Q2466826"] = "28:29:5", -- UCI Women’s Team
		["Q26849121"] = "30:31:13" -- Women's amateur cycling team	
		}
	local a, b, c, d, e, ii, jj
	for i=1, table.getn(mt) do
		mu[i] = {}
		mu[i]['index']= 100 mu[i]['val'] = ''
		if mt[i][1] ~= '' then
			if list[mt[i][1]] ~= nil then
				_, _, c, d, e = string.find(list[mt[i][1]], "(%d+):(%d+):(%d+)")
				mu[i]['index'] = tonumber( e )
				if mt[i][2] == 1 then mu[i]['val'] = mu[i]['val'] .. '<span style="font-size:1.2em;font-weight:bold">'..headoftableIII(tonumber( c ))..'</span>'
				else mu[i]['val'] = mu[i]['val'] .. '<span style="font-size:1.2em;font-weight:bold">'..headoftableIII(tonumber( d )).. '</span>'
				end
			else -- fall back headings (ProTeam, ...) in case no value in function headoftableIII
				mu[i]['val'] = mu[i]['val'] .. '<span style="font-size:1.2em;font-weight:bold;text-transform: capitalize;">' .. WPlink(mt[i][1])..'</span>'
			end
			-- Set parameter to show team counter in front of each category
			local showcounter = 2
			if mt[i][2] >= showcounter then mu[i]['val'] = mu[i]['val'] .. ' <small>('..mt[i][2]..')</small>' end
	
			mu[i]['val'] = mu[i]['val'].. '<ol>'
			for w in pairs(mt[i]) do
				if w > 2 then
					mu[i]['val'] = mu[i]['val'] .. '<li style="text-indent:0em;width:20em;display:inline-block;">'
					a, b = pcall(fooA, 'numeric-id', cache[mt[i][w]], 'P17', 1) 
					if a == true then mu[i]['val'] = mu[i]['val'].. flag('Q'..b, startOfSeason).. ' ' end
					if mt[i][1] ~= 'Q23726798' and mt[i][1] ~= 'Q20738667' then mu[i]['val'] = mu[i]['val'].. WPlink_entity(cache[mt[i][w]],'team', startOfSeason).. '</li>'
					else
						national_team = cache[mt[i][w]] 
						-- calculate s for national team item
						a, b = pcall(fooA, 'numeric-id', national_team, 'P31', 1) -- test if country
						if a == true and b == 20738667 then -- Q20738667 = national cycling team U23
							if wiki == 'fr' then s =  ' espoirs' else s = ' U23' end 
							if wiki == 'mk' then s = ' под 23 години' end
							if wiki == 'ar' then s = ' تحت 23' end
						elseif a == true and b == 23726798 then s = '' end -- Q23726798 = national cycling team
	
						a, b = pcall(fooA, 'numeric-id', national_team, 'P17', 1) -- test if country
						if a == true then
							local nation = mw.wikibase.getEntityObject( 'Q'..b )
							nationality = nation:getLabel('ar') or nation:getLabel('en') or nation:getLabel('fr') or nation:getLabel('de')
						end
						
						if nationality and national_team:getSitelink() == nil then
							team = nationality.. s
						else
							team = WPlink_entity(cache[mt[i][w]], 'team', startOfSeason)
							ii, jj = mw.ustring.find(team, "|")
							if ii ~= nil and jj ~= nil then
			 					jj=jj+1
	  							team = mw.ustring.sub(team,1,ii).. nationality..s.. ']]'
							end
						end
						mu[i]['val'] = mu[i]['val'] ..  team ..'</li>'
					end
				end
			end
			mu[i]['val'] = mu[i]['val'] .. '</ol>'
		end --if mt[i][1] ~= ''
	end
	
	table.sort(mu, function(a,b) return a.index<b.index end)
	
	for i=1, table.getn(mu) do
		if mu[i].val ~= nil then v = v .. mu[i].val end
	end
	v = v .. '<table border="0" cellspacing="0" cellpadding="0" style="line-height:0em;width:20em;margin:0.5em 0em;border-top:2px solid #FFDF80;"><tr><th>'..
	'<span style="float:right">[[File:Wikidata-logo S.svg|24px|link=d:'.. frame.args[1].. '#P1923]]</span></th></tr></table>'
	
	return '<table style="max-width:95%; padding:0.5em; margin-right:1em; border:1px solid rgb(200,200,200)"><tr><td>'..v.. '</td></tr></table>'
end

function WPlink_entity(entity, ...) 
	local link=''
	local Sitelink = entity:getSitelink() -- link to WParticle
	local Sitelink2 = Sitelink
	local Label = entity:getLabel('ar') or ''
	local Label_fr = entity:getLabel( 'fr' ) or ''
	local a, b
	local official_name = ""

	if arg[1] == 'team' then -- add '(team of the winner)'
		a, b = timeStartEnd_entity(entity, 'P1448', 'text', arg[2]) --officialName(entity) 
		local a1, b1 = pcall(fooA, 'numeric-id', entity, 'P361', 1)
		if a1== true then 
			entity = mw.wikibase.getEntity( 'Q'..b1 ) 		
			local a2, b2 = timeStartEnd_entity(entity, 'P1448', 'text', arg[2]) 
			if a2== true then a = a2 b = b2	end

			Sitelink2 = entity:getSitelink() -- link to WParticle		
		end
		if a == true then official_name = b end
		
		if available_lang_priority == false then
			a, b = pcall(fooA, 'text', entity, 'P1448', 2) -- test if more then two official names
			if a == true then
				a, b = timeStartEnd_entity(entity, 'P1448', 'text', arg[2]) --officialName(entity) 
				if a == true then official_name = b end
			else
				a, b = pcall(fooA, 'text', entity, 'P1448', 1) 
				if a == true then official_name = b end	
			end
		end
				
		if Sitelink ~= nil then 
			if official_name == nil then 
				link = "[[".. Sitelink.. "|".. mw.text.trim(mw.ustring.gsub(Sitelink,"%b()","").. ' ').. "]]" 
			else
				if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia"
					local i, _ = mw.ustring.find(Sitelink, ",")
					if i ~= nil then Sitelink = mw.ustring.sub(Sitelink, 1, i-1) end
				end
				link = link .. '[['.. Sitelink.. "|".. official_name.. ']]'
			end
		end
		if link == '' and Sitelink2 ~= nil then -- code goes from season item to team item
			if official_name == nil then
				link = "[[".. Sitelink2.. "|".. mw.text.trim(mw.ustring.gsub(Sitelink2,"%b()","").. ' ').. "]]" 	
			else
				if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia"
					local i, _ = mw.ustring.find(Sitelink2, ",")
					if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink2, 1, i-1) end
				end		
				link = link .. '[['.. Sitelink2.."|".. official_name.. ']]' 
			end		
		end

		if Sitelink == nil and Sitelink2 == nil then 
			if official_name ~='' then link = official_name else link = entity:getLabel('ar') end
			if link == nil then link = "(label missing)" end
		end	

	end -- end arg[1]
	return link
end

function timeStartEnd_entity(entity, property, mode, timeofrace)
-- mode = 'numeric-id', property = 'P54', Qid = 'Q123'
--local entity = 	mw.wikibase.getEntity(Qid)
local a, b = pcall(fooA, mode, entity, property, 1)
local starttime, endtime
local available_lang_priority = available_lang_priority

if a == true then
	local timeStartEnd = {}
	local num = 1
	local v
	for _, v in pairs(entity.claims[property]) do
		if pcall(function () local test = v.mainsnak.datavalue.value[mode] end) then -- test if not 'unnown value' 
			if pcall(function () starttime = v.qualifiers["P580"][1].datavalue.value.time end) then
   				starttime = v.qualifiers["P580"][1].datavalue.value.time
				local _,_,year,m,d = string.find(starttime,"(%d+)-(%d+)-(%d+)")
				if m == '00' and d == '00' then starttime = '+'..year..'-01-01T00:00:00Z' end
			end
			if pcall(function () endtime = v.qualifiers["P582"][1].datavalue.value.time end) then
				endtime = v.qualifiers["P582"][1].datavalue.value.time
				local _,_,year,m,d = string.find(endtime,"(%d+)-(%d+)-(%d+)")
				if m == '00' and d == '00' then endtime = '+'..year..'-12-31T00:00:00Z' end
				if m == '01' and d == '01' then endtime = '+'..year..'-12-31T00:00:00Z' end
			end
  			if v.qualifiers then
 				if (not v.qualifiers["P580"] or starttime <= timeofrace)
 					and
 					(not v.qualifiers["P582"] or endtime >= timeofrace)
 				then
 					if available_lang_priority == true and property == "P1448" then
 						local test = false
						pcall(function () if type( v.qualifiers["P1448"])=='table' then test=true end end)
						if test == false then
							timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
						else
							local lang_module, lang_WD
							local language= ''
							local zaehler
							for i,j in ipairs(translations.lang_priority) do
									lang_module = j
									for number in pairs(v.qualifiers["P1448"]) do
										lang_WD = v.qualifiers["P1448"][number].datavalue.value.language
										if lang_WD == lang_module then zaehler = number break end
									end -- for number in pairs
								if lang_WD == lang_module then language = lang_WD   break end
								end -- for i,j
							if language~='' then -- a WD translation matching translations.lang_priority exist
									local t = v.qualifiers["P1448"][zaehler].datavalue.value.text
									timeStartEnd[num] = t
	 							else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]--  no matching between lang module and "official name" qualifier
								end -- if language~=''
						end --  test if official name qualifier exist
 					else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
					end -- if property == "P1448"
  					num = num + 1
 				end
 			else
 				timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
 				num = num + 1
 			end
		end
 	end
	return a, timeStartEnd[1]
else return false, '' end
end

function getSquadTableColumn(x)
	local l10nDef = { } -- note (in the table), note (below the table)
	l10nDef["ar"] = {"المتسابق", "تاريخ الولادة", "الفريق السابق", "ملاحظة", "ملاحظة", "البلد", "Team roster"}
	l10nDef["en"] = {"Rider", "Date of birth", "Previous team", "note", "note", "Country", "Team roster"}
	
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["en"] end  -- default
	return l10n[x]
end

function infobox_translate(x)
	-- This function permits to translate fields of the infobox, take the line below, give a Wikipedia (ex : mk), and translate all fields. By default, English values are taken.
	-- l10nDef["//??.wikipedia.org"] = {"RACE DETAILS", "COURSE", "COMPETITION", "COMPETITIONS", "STAGES", "DATE", "DATES", "DISTANCE", "COUNTRY", "COUNTRIES", 
	-- "JOURNEY ORIGIN", "JOURNEY DESTINATION", "TEAMS", "STARTING RIDERS", "ARRIVING RIDERS", "AVERAGE SPEED", "COST", "PALMARES", "WINNER", "SECOND", "THIRD", 
	-- "POINTS", "MOUNTAINS", "SPRINTS", "YOUTH", "COMBATIVITY", "COMBINATION", "TEAM", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentation", 
	-- "METAS VOLANTES", "REGULARIDAD", "TEAM POINTS"}
 	local l10nDef = { }
	l10nDef["ar"] = {"تفاصيل السباق", "سلسلة", "منافسة", "مسابقات", "مراحل", "التاريخ", "التواريخ", "المسافات", "البلد", "البلدان",
	"نقطة البداية", "نقطة النهاية", "الفرق", "عدد المتسابقين في البداية", "عدد المتسابقين في النهاية", "متوسط السرعة", "الكلفة", "المنصة", "الفائز", "الثاني", 
	"الثالث", "حسب النقاط", "تسلق الجبل", "سباقات السرعة", "أفضل شاب", "تصنيف القتال", "مجموعة", "الفريق", "صورة", "تعليق", "خريطة", "مميز 1", "مميز 2", "توثيق", "سباقات السرعة", "انتظام", "نقاط الفريق", "فوجا بيناريلو", "أزوري دي إيطاليا"}
	l10nDef["en"] = {"Race details", "Course", "Competition", "Competitions", "Stages", "Date", "Dates", "Distance", "Country", "Countries",
	"Journey origin", "Journey destination", "Teams", "Starting riders", "Arriving riders", "Average speed", "Cost", "Palmares", "Winner", "Second", 
	"Third", "Points", "Mountains", "Sprints", "Youth", "Combativity", "Combination", "Team", "Picture", "Caption", "Map", "Special 1", "Special 2", 
	"Documentation", "Intermediate sprints", "Regularidad", "Team points", "Fuga Pinarello", "Azzurri d'Italia"}
	
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["en"] end  -- default
	return l10n[x]
end 

function unit(x)
	local l10nDef = { } 
	l10nDef["ar"] = {"", " س ", " دقيقة ", " ث", ' كم/س', " نقطة", " نقطة"}
	l10nDef["fr"] = {"en", " h ", " min ", " s", ' km/h', " pt", " pts"}
	l10nDef["br"] = {"", "e ", "' ", '"', ' km/h', " pt", " pts"}
	l10nDef["da"] = {"", "t ", "' ", '"', ' km/t', " point", " point"}
	l10nDef["de"] = {"", " h ", " min ", " s", ' km/h', " P.", " P."}
	l10nDef["en"] = {"", "h ", "' ", '"', ' km/h', " pt", " pts"}    
	l10nDef["es"] = {"", " h ", " min ", " s", ' km/h',  " pt&nbsp;&nbsp;", " pts"}
	l10nDef["eu"] = {"", " h ", " min ", " s", ' km/h', " pt", " pt"}
	l10nDef["fo"] = {"", "t ", "' ", '"', ' km/t', " pt", " pts"}
	l10nDef["fi"] = {"", ".", ".", "", ' km/h', " pt", " pts"}
	l10nDef["hu"] = {"", " óra ", ":", "", ' km/h', " pt", " pts"}
	l10nDef["it"] = {"", "h", "'", '"', ' km/h', " pt", " pts"}
	l10nDef["ja"] = {"", "時間", "分", '秒', 'km/h', "ポイント", "ポイント"}
	l10nDef["lb"] = {"", " h ", " min ", " s", ' km/h', " pt", " pts"}
	l10nDef["mk"] = {"", "ч ", "' ", "", ' км/ч', " pt", " pts"}
	l10nDef["nl"] = {"", "u", "'", '"', ' km/u', " pt", " pts"}
	l10nDef["no"] = {"", "t ", "' ", '"', ' km/t', " poeng", " poeng"}
	l10nDef["pt"] = {"", "h", "m", "s", ' km/h', " pt", " pts"}
	l10nDef["ru"] = {"", "ч ", "' ", "", ' км/ч', " очко", " очков"}

	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["en"] end  -- default for lv,cs,en,ca,ro,pt,pl,sv
	return l10n[x]
end

function number(gender, b, wiki)
	local str
	if b=="" then return "" end
	str = b .. ". "
	if wiki == "ca" then 
		if b==1 then str = b.."r" end
		if b==2 then str = b.."n" end
		if b==3 then str = b.."r" end
		if b==4 then str = b.."t" end	
		if b>4  then str = b.."è" end
	end
	if wiki=="es" then str = b..".º" end
	if wiki=="fr" then 
		if b==1  then
			if gender == 'm' then str="1<sup>er</sup>"
			elseif gender == 'f' or gender == 'n' then str="1<sup>re</sup>"
			else str="1<sup>e</sup>" end
		else str=b.."<sup>e</sup>" end
	end
	if wiki=="nl" then str=b.."e" end
	if wiki=="ru" then str=b.."-й" end
	if wiki=="eo" then str=b.."-a" end
	return str
end

function calculate_time(wiki, t)
	local time = tonumber(t)
	local h, m, s = 0, 0, 0
	local str = ''
	
	if time == nil then return '' end
	if time < 60 then s = time 
	elseif time < 3600 then m = math.modf(time/60) s = time - m*60
	else h = math.modf(time/3600) m = math.modf((time - h*3600)/60)  s = time - h*3600 - m*60
	end
	
	if h>0 then str = str..mw.ustring.format ('%i'..unit(2), h) end
	if m>=0 and h>0 then str = str.. mw.ustring.format('%02i'..unit(3), m) end
	if m>0 and h==0 then str = str.. mw.ustring.format('%i'..unit(3), m) end
	if s>=0 and (h>0 or m>0) then str = str.. mw.ustring.format('%02i'..unit(4), s) end
	if s>=0 and h==0 and m==0 then str = str.. mw.ustring.format('%i'..unit(4), s) end
	return str --time..': '..h..' '..m..' '..s
end

function p.pointsclassification(frame)
	local s = {
		header_function = headoftableII, -- translations are in function headoftaböleII
		header_1 = 10, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header
		item = string.gsub(frame.args[1], "%c", ""),
		property = 'P3494', -- property to use for this table
		team_classification = false, -- it is not a team classification table, its a rider classification table
		background = 'color' -- there is a background color for the first row
		}
	return new_classification(frame, s)
end

function p.teamsclassificationbytime(frame)
	local s = {
		header_function = headoftableII, -- translations are in function headoftaböleII
		header_1 = 14, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {3, 2, 4}, -- translations 3, 2, 4 in function headoftableII are printed in this order in the lower part of the table header
		item = frame.args[1],
		property = 'P3497', -- property to use for this table
		team_classification = true, -- it is a team classification table, its not a rider classification table
		background = 'strong' -- there is no background color for the first row, but the first row is formated strong
		}
	return new_classification(frame, s)
end

function p.teamsclassificationbypoints(frame)
	local s = {
		header_function = headoftableII, -- translations are in function headoftaböleII
		header_1 = 15, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {3, 2, 7}, -- translations 3, 2, 7 in function headoftableII are printed in this order in the lower part of the table header
		item = frame.args[1],
		property = 'P3496', -- property to use for this table
		team_classification = true, -- it is a team classification table, its not a rider classification table
		background = 'strong' -- there is no background color for the first row, but the first row is formated strong
		}
	return new_classification(frame, s)
end

function p.stageclassification(frame)
	if frame.args[2]~= nil then
		display_reftemp=tonumber(frame.args[2])
	else
		display_reftemp=0
	end
	local s = {
		header_function = headoftableII, -- translations are in function headoftaböleII
		header_1 = 8, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 4 in function headoftableII are printed in this order in the lower part of the table header
		item = frame.args[1],
		property = 'P2417', -- property to use for this table
		team_classification = false, -- it is not a team classification table, its a rider classification table
		background = false, -- there is no background color for the first row
		display_ref=display_reftemp
		}
	return new_classification(frame, s)
end

function p.generalclassification(frame)
	if frame.args[2]~= nil then
		display_reftemp=tonumber(frame.args[2])
	else
		display_reftemp=0
	end
	local s = {
		header_function = headoftableII, -- translations are in function headoftaböleII
		header_1 = 9, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 4 in function headoftableII are printed in this order in the lower part of the table header
		item = frame.args[1],
		property = 'P2321', -- property to use for this table
		team_classification = false, -- it is not a team classification table, its a rider classification table
		background = 'color', -- there is a background color for the first row
		display_ref=display_reftemp
		}
	return new_classification(frame, s)
end

function p.teamtimetrialclassification(frame)
	if frame.args[2]~= nil then
		display_reftemp=tonumber(frame.args[2])
	else
		display_reftemp=0
	end

	local s = {
		header_function = headoftableII, -- translations are in function headoftaböleII
		header_1 = 8, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {3, 2, 4, 5, 6}, -- translations 3, 2, 4, 5, 6 in function headoftableII are printed in this order in the lower part of the table header
		item = frame.args[1],
		property = 'P2417', -- property to use for this table
		team_classification = true, -- it is a team classification table, its not a rider classification table
		background = false, -- there is no background color for the first row
		display_ref=display_reftemp
		}
	return new_classification(frame, s)
end

function p.mountainsclassification(frame)
	local s = {
		header_function = headoftableII, -- translations are in function headoftableII
		header_1 = 11, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header
		item = string.gsub(frame.args[1], "%c", ""),
		property = 'P4320', -- property to use for this table
		team_classification = false, -- it is not a team classification table, its a rider classification table
		background = 'color' -- there is a background color for the first row
		}
	return new_classification(frame, s)
end

function p.sprintsclassification(frame)
	local s = {
		header_function = headoftableII, -- translations are in function headoftableII
		header_1 = 12, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header
		item = string.gsub(frame.args[1], "%c", ""),
		property = 'P4322', -- property to use for this table
		team_classification = false, -- it is not a team classification table, its a rider classification table
		background = 'color' -- there is a background color for the first row
		}
	return new_classification(frame, s)
end

function p.bestyoungclassification(frame)
	local s = {
		header_function = headoftableII, -- translations are in function headoftableII
		header_1 = 13, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header
		item = string.gsub(frame.args[1], "%c", ""),
		property = 'P4323', -- property to use for this table
		team_classification = false, -- it is not a team classification table, its a rider classification table
		background = 'color' -- there is a background color for the first row
		}
	return new_classification(frame, s)
end

function p.u23classification(frame)
	local s = {
		header_function = headoftableII, -- translations are in function headoftableII
		header_1 = 18, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header
		item = string.gsub(frame.args[1], "%c", ""),
		property = 'P4323', -- property to use for this table (same as best young classification)
		team_classification = false, -- it is not a team classification table, its a rider classification table
		background = 'color' -- there is a background color for the first row
		}
	return new_classification(frame, s)
end

function p.combinationclassification(frame)
local s = {
		header_function = headoftableII, -- translations are in function headoftableII
		header_1 = 16, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header
		item = string.gsub(frame.args[1], "%c", ""),
		property = 'P4324', -- property to use for this table
		team_classification = false, -- it is not a team classification table, its a rider classification table
		background = 'color' -- there is a background color for the first row
		}
	return new_classification(frame, s)
end

function p.combativeclassification(frame)
	local s = {
		header_function = headoftableII, -- translations are in function headoftableII
		header_1 = 17, -- translation 10 in function headoftableII is printed in the upper part of the table header
		header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header
		item = string.gsub(frame.args[1], "%c", ""),
		property = 'P4321', -- property to use for this table
		team_classification = false, -- it is not a team classification table, its a rider classification table
		background = 'color' -- there is a background color for the first row
		}
	return new_classification(frame, s)
end


function new_classification(frame, s)
	local country = true
	local showgap = false
	
	if wiki == 'da' then country = false end -- those wikis do not want to show the country column as standard
	if wiki == 'es' then country = false end -- those wikis do not want to show the country column as standard
	local s = s
	local h = {
		rider={1, "", "", "", '', ""}, -- rank, rider ID, riderGender, nationality ID, flag ID, team ID
		jersey={""}, -- lots of jerseyID
		value={'', '', '', ''} -- points, time, time_gap, speed
		}
	local available_list = available_list
	local entity = mw.wikibase.getEntityObject( s.item )
	
	--[=[ It is possible to give the classification tables in the article commands to change the standard behaviour. They could look like this:
	{{Cycling race/teamsclassificationbytime|Q18574623|newline=false|country=true}}
	{{Cycling race/teamsclassificationbytime|Q18574623|country= false|newline=false}}
	{{Cycling race/teamsclassificationbypoints|Q18574623|newline =true|country=true}}
	{{Cycling race/teamsclassificationbypoints|Q18574623|newline= true}}
	{{Cycling race/teamsclassificationbypoints|Q18574623|newline = false|country=false}}
	{{Cycling race/teamsclassificationbytime|Q18574623|newline=true|country=true}}
	
	One additional parameter is "newline" with the values "true" or "false". "newline" says, if there is a line brake after the table. Standard is 
	no line break after the tables stageclassification and teamtimetrialclassification. 
	The second parameter is "country" with the values "true" or "false". "country" tells the module to print the country column or not. 
	Most wikis have as standard to print the country columns, some wikis prefer as standard not to show the country column. A few lines above, 
	the command "if wiki == 'da' then country = false end" tells that daWiki do not want to see the country colums as standard. You can add your wiki
	here in, if you do not want to see them as standard. With the new parameter editors are able to tell the module in the article what to do.  
	]=]

	local function jersey(h)
		local jersey
		local jersey_name
		local jersey_string = ' '
		
		jerseys = {
		['Q24257871'] = {file = 'Jersey yellow.svg', 
			name_ar = 'قميص أصفر لمتصدر الترتيب العام',
			name_fr = 'maillot jaune de leader du classement général',
			name_es = 'maillot amarillo de líder de la clasificación general',
			name_ru = 'жёлтая майка лидера генеральной классификации'
			},	
		['Q24645209'] = {file = 'Jersey green.svg', 
			name_ar = 'قميص أخضر لمتصدر ترتيب النقاط',
			name_fr = 'maillot vert de leader du classement par points',
			name_es = 'maillot verde de líder de la clasificación por puntos',
			name_ca = 'mallot verd del líder de la classificació per punts',
			name_ru = 'зелёная майка лидера очковой классификации'
			},
		['Q24645383'] = {file = 'Jersey white.svg', 
			name_ar = 'قميص أبيض لمتصدر ترتيب الشباب',
			name_fr = 'maillot blanc de leader du classement du meilleur jeune',
			name_es = 'maillot blanco de líder de la clasificación de los jóvenes',
		    name_ru = 'белая майка лидера молодёжной классификации',
			name_de = 'weißes Trikot des Führenden der Nachwuchswertung'
			},
		}	

			if type(h) == 'table' and h[1] ~= '' then mw.log(h[1])
				for i,k in ipairs(h) do 
					if jerseys[h[i]] ~= nil then mw.log('>')
						jersey = 'File:'.. jerseys[h[i]].file
						local name
						name = 'name_'..wiki
						jersey_name = jerseys[h[i]][name] or jerseys[h[i]]['name_en'] or jerseys[h[i]]['name_fr'] or '' 
						if jersey_name~='' then jersey_string = jersey_string .. '[['..jersey..'|20px|'..jersey_name..']]'
						else jersey_string = jersey_string .. '[['..jersey..'|20px]]'
						end
					else
						local entity_jersey = mw.wikibase.getEntity(h[i])
						pcall(function()
							jersey = 'File:'.. entity_jersey.claims['P18'][1].mainsnak.datavalue.value
							jersey_name = entity_jersey:getLabel('ar') or entity_jersey:getLabel( 'en' ) or entity_jersey:getLabel( 'fr' ) or ''
							if jersey_name~='' then jersey_string = jersey_string .. '[['..jersey..'|20px|'..jersey_name..']]'
							else jersey_string = jersey_string .. '[['..jersey..'|20px]]'
							end
						end)
					end
				end
				return jersey_string
			else return ''
			end
		end -- function end

	local startOfSeason = '' --'+2016-01-01T00:00:00Z'
	pcall(function() startOfSeason = entity.claims["P580"][1].mainsnak.datavalue.value.time end)
	if startOfSeason == '' then
		if pcall(function() startOfSeason = entity.claims["P585"][1].mainsnak.datavalue.value.time end) then
		else
			local Sitelink = entity:getSitelink(wiki .. 'wiki') or entity:getSitelink('enwiki') or entity:getSitelink('frwiki') or entity:getSitelink('dewiki') or '' 
			if Sitelink == '' then return '> Wikidata is missing data about the start time (P580) and end time (P582) of the season'
			else startOfSeason = '+'..string.match(Sitelink, '%d%d%d%d' ) ..'-01-01T00:00:00Z' 
			end
		end
	end

	local v = ''
	local plus = ''
	local localFrame
	local tableHeader2_size = table.getn(s.header_2)
	local tableHeader2 = '|-\n'
	
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name
		then localFrame = frame:getParent() else localFrame = frame end
	if localFrame.args[1] ~= nil then localFrame.args[1] = string.gsub(localFrame.args[1], "%c", "") end

	if localFrame.args.country ~= nil then -- switch country column on or off in the article
		if localFrame.args.country == 'true' then country = true end
		if localFrame.args.country == 'false' then country = false end
	end

	local tableStyle, tableNewline
	if localFrame.args.newline == 'false' then -- parameter newline in WP article is 'false'
		tableStyle = "float:"..floattable.."; margin-right:0.5em; border:1px solid rgb(200,200,200)"
		tableNewline = ''
	end
	if localFrame.args.newline == 'true' then -- parameter newline in WP article is 'true'
		tableStyle = ""--border:1px solid rgb(200,200,200)" 
		tableNewline = 'left'--'<br style="clear:left;">'    -- clear:left
	end
	if localFrame.args.newline == nil then -- no second parameter, compatible to the old code
		if s.property == 'P2417' then --stageclassification
			tableStyle = "float:"..floattable.."; margin-right:0.5em; border:1px solid rgb(200,200,200)"
			tableNewline = ''
		else
			tableStyle = ""--"border:1px solid rgb(200,200,200)" 
			tableNewline = 'left'--'<br style="clear:left;">' -- everything else      -- clear:left
		end 
	end
	
	local tableStart = '{{بداية نتيجة سباق ركوب الدراجات|style='.. tableStyle.. '|colspan='.. tostring(tableHeader2_size + 1) .. ''
	
	if s.team_classification == true or s.property == 'P3497' then
		tableStart = tableStart .. '|teams=t'
	end
	if s.header_2[5] ~= 6 then -- for table teamtimetrialclassification, dont adds speed
		tableStart = tableStart .. '|speed=f'
	end	
	--if (s.header_2[4] ~=4) or (s.property ~= 'P3497') or (s.header_2[4] ~= 5) then --  dont adds gap
		--tableStart = tableStart .. '|gap=f'
	--end	
	if s.property == 'P3494' or  s.property == 'P3496' -- points
		then tableStart = tableStart .. '|points=t'
	end
	
	local tableHeader1 = '|title=' .. 
				--..'<span style="float:right">[[File:Wikidata-logo S.svg|24px|link=d:'
				--..s.item.. '#'.. s.property..']]</span>'
				s.header_function ( s.header_1)  ..
				'|d='.. s.item .. '|property='.. s.property  ..
				'}}\n'

	for i,k in ipairs(s.header_2) do
		if i==1 then tableHeader2 = tableHeader2.. '!  colspan="2" nowrap style="text-align:center;padding:2px 2px"|'.. s.header_function ( k) end
		if i==2 and available_list==true and country == true then tableHeader2 = tableHeader2.. '\n! nowrap style="text-align:center;padding:2px 2px"|'.. s.header_function ( k) end
		if i>=3 then
			if i ~= tableHeader2_size then tableHeader2 = tableHeader2.. '\n! nowrap style="text-align:center;padding:2px 2px"|'.. s.header_function ( k).. '\n'
			else tableHeader2 = tableHeader2..'\n!  nowrap style="text-align:center;padding:2px 2px"|'.. s.header_function ( k) .. '\n'
			end
		end
	end
	tableHeader2 = tableHeader2 .. '\n'

	local tableBody = ''
	--pcall(function()
		local t_Body = {}
		local bg_color=""
		local nr_jersey

	--##################
			if entity.claims[s.property] then 
				for l, m in pairs(entity.claims[s.property]) do -- look into all statements
				h.rider[1]=''
				--if m.mainsnak["snaktype"] == 'value' then
					local rank
					pcall(function()
						for _, v in pairs(m.qualifiers['P1352']) do -- for property 'rank'
							rank = tonumber(v.datavalue.value.amount) break
						end
						h.rider[1] = rank
						end)
					local riderID = 'Q'.. m.mainsnak.datavalue.value['numeric-id']
					if s.team_classification == false then
						h.rider[2] = WPlink(riderID, 'pure')
						h.rider[6] = national_team(riderID, startOfSeason, entity, s.property, l)
					end

					a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject( riderID ), 'P21', 1)
					if a == true then 
						if b == 6581097 then h.rider[3] = 'm' end -- men
						if b == 6581072 then h.rider[3] = 'f' end -- female
					else h.rider[3] = 'n' -- for teams
					end
				--end
				pcall(function() -- for property 'points' P1358
					for _, v in pairs(m.qualifiers['P1358']) do h.value[1] = tonumber(v.datavalue.value.amount)	end
				end)

				pcall(function() -- for property 'race time' P2781
					for _, v in pairs(m.qualifiers['P2781']) do	h.value[2] = tonumber(v.datavalue.value.amount)	end
				end)

				pcall(function() -- for property 'time gap' P2911
					for _, v in pairs(m.qualifiers['P2911']) do	h.value[3] = tonumber(v.datavalue.value.amount)	end
					plus = '+ '
				end) 

				pcall(function() -- for property 'speed' P2052
					for _, v in pairs(m.qualifiers['P2052']) do h.value[4] = tonumber(v.datavalue.value.amount) end
				end)

				pcall(function() -- for property 'distinctive jersey'
					h.jersey= {''}
					nr_jersey = 1
					for _, v in pairs(m.qualifiers['P2912']) do
						h.jersey[nr_jersey] = 'Q'..v.datavalue.value['numeric-id']
						nr_jersey = nr_jersey + 1
					end
				end)

				if s.team_classification == true then
					h.rider[6] = transform(riderID, 't', startOfSeason)
				end

				if s.team_classification == false then
					local a, b = timeStartEnd(riderID, "P27", 'numeric-id', startOfSeason)
					if a == true then
						h.rider[5] = flag('Q'..b, startOfSeason)
						if available_list == true and country == true then
							if type( translations.list ) == "function" then h.rider[4] = translations.list('Q'..b) end
							if h.rider[4] == '' then
								local country = mw.wikibase.getEntityObject( 'Q'..b )
								h.rider[4] = country:getLabel('ar') or country:getLabel('en') .. ' (en)'
							end
						end
					end
				end
				if s.team_classification == true then
					local a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject( riderID ), 'P17', 1)
					if a == true then
						a, b = timeStartEnd(riderID, "P17", 'numeric-id', startOfSeason)
						if a == true then
							h.rider[5] = flag('Q'..b, startOfSeason)
							if available_list == true and country == true then
								if type( translations.list ) == "function" then h.rider[4] = translations.list('Q'..b) end
								if h.rider[4] == '' then
									local country = mw.wikibase.getEntityObject( 'Q'..b )
									h.rider[4] = country:getLabel('ar') or country:getLabel('en') .. ' (en)'
								end
							end
						end
					end
				end
			
				-- ##############################
				--local tBody = '|-'
				local tBody = '{{نتيجة سباق ركوب الدراجات'
				-- find the right background color if a rider has more then one jersey
				-- see Wikidata:WikiProject Cycling/Kit to translate/Jerseys
				if h.jersey[1] ~= '' then
					local num = 1 -- loop for more then one jersey per rider
					while h.jersey[num] ~= nil and h.jersey[num] ~= '' do
						if h.jersey[num] == "Q24257871" then bg_color="#FFFF99" break end -- Jersey yellow.svg (General)
						if h.jersey[num] == "Q24257763" then bg_color="#FFC0CB" -- Jersey pink.svg
							if wiki == "ca" then bg_color="lightpink" end
						break end
						if h.jersey[num] == "Q24257872" then bg_color="#FF8666" break end -- Jersey red.svg (General)
						if h.jersey[num] == "Q24687408" then bg_color="#99CBFF" break end -- Jersey blue.svg (General)
						if h.jersey[num] == "Q24258056" then bg_color="#FFD030" break end -- Jersey orange.svg (General)
						if h.jersey[num] == "Q26696171" then bg_color="#FFFFFF" break end -- Jersey white.svg (General)
						if h.jersey[num] == "Q24258125" then bg_color="#BFFF80" break end -- Jersey green 2.svg (General)
						if h.jersey[num] == "Q24257991" then bg_color="#FFD030" break end -- Jersey gold.svg (General)
						if h.jersey[num] == "Q24645208" then bg_color="#90EE90" break end -- Jersey green.svg (General)
						if h.jersey[num] == "Q26945271" then bg_color="#90EE90" break end -- MaillotVolta.png (General)
						if h.jersey[num] == "Q26945272" then bg_color="#BF80FF" break end -- Jersey violet.svg (General)
						if h.jersey[num] == "Q29982321" then bg_color="#FFFF99" break end -- Jersey combined.svg (General)
						if h.jersey[num] == "Q29594434" then bg_color="#87CEEB" break end -- MaillotCyan.PNG (General)
						if h.jersey[num] == "Q30132459" then bg_color="#FFFF99" break end -- Jersey yellow-bluebar.svg (General)
						if h.jersey[num] == "Q24645209" then bg_color="#90EE90" break end -- Jersey green.svg (Points)
						if h.jersey[num] == "Q25831179" then bg_color="#FFFFFF" break end -- Jersey white.svg (Points)
						if h.jersey[num] == "Q26919974" then bg_color="#FF8666" break end -- Jersey red.svg (Points)
						if h.jersey[num] == "Q24687409" then bg_color="#99CBFF" break end -- Jersey blue.svg (Points)
						if h.jersey[num] == "Q25265938" then bg_color="#BF80FF" break end -- Jersey violet.svg (Points)
						if h.jersey[num] == "Q27114205" then bg_color="#C0C0C0" break end -- Jersey black.svg (Points)
						if h.jersey[num] == "Q28546656" then bg_color="#FFFF99" break end -- Jersey yellow.svg (Points)
						if h.jersey[num] == "Q28820618" then bg_color="#87CEEB" break end -- MaillotCyan.PNG (Points)
						if h.jersey[num] == "Q29982764" then bg_color="#FFD030" break end -- Jersey orange.svg (Points)
						if h.jersey[num] == "Q43276992" then bg_color="#FFC0CB" break end -- Jersey pink.svg (Points)
						if h.jersey[num] == "Q47945989" then bg_color="#6495ED" break end -- Jersey dark blue.svg (Points)	
						if h.jersey[num] == "Q25265958" then bg_color="#FFC0CB" break end -- Jersey polkadot.svg (Mountain)
						if h.jersey[num] == "Q25265959" then bg_color="#E0FFFF" break end -- Jersey blue dotted.png (Mountain)
						if h.jersey[num] == "Q25265960" then bg_color="#FFC0CB" break end -- Jersey climbing Dauphine.png (Mountain)
						if h.jersey[num] == "Q27670178" then bg_color="#FF8666" break end -- Jersey red.svg (Mountain)
						if h.jersey[num] == "Q27670182" then bg_color="#90EE90" break end -- Jersey green.svg (Mountain)
						if h.jersey[num] == "Q27670174" then bg_color="#FFD030" break end -- Jersey orange.svg (Mountain)
						if h.jersey[num] == "Q24790519" then bg_color="#C0C0C0" break end -- Jersey grey.svg (Mountain)
						if h.jersey[num] == "Q27670105" then bg_color="#C0C0C0" break end -- Jersey blackdots.png (Mountain)
						if h.jersey[num] == "Q28604413" then bg_color="#99CBFF" break end -- Jersey blue.svg (Mountain)
						if h.jersey[num] == "Q25266023" then bg_color="#F5DEB3" break end -- Jersey brown.svg (Mountain)
						if h.jersey[num] == "Q27670126" then bg_color="#FF8666" break end -- Jersey granate.svg (Mountain)
						if h.jersey[num] == "Q25831602" then bg_color="#FF69B4" break end -- Jersey rosa.svg (Mountain)
						if h.jersey[num] == "Q29168665" then bg_color="#FFC0CB" break end -- Jersey pink.svg (Mountain)
						if h.jersey[num] == "Q29823248" then bg_color="#FFFFFF" break end -- Jersey white.svg (Mountain)
						if h.jersey[num] == "Q28820591" then bg_color="#F5DEB3" break end -- Jersey red green.svg (Mountain)
						if h.jersey[num] == "Q36859499" then bg_color="#CCFFCC" break end -- Jersey greendots.svg (Mountain)
						if h.jersey[num] == "Q33060977" then bg_color="#C0C0C0" break end -- Jersey black.svg (Mountain)
						if h.jersey[num] == "Q26858731" then bg_color="#FFFFFF" break end -- Jersey white.svg (Combinated)
						if h.jersey[num] == "Q28823004" then bg_color="#FFFF99" break end -- Jersey combined.svg (Combinated)
						if h.jersey[num] == "Q28604421" then bg_color="#FFD030" break end -- Jersey orange.svg (Combinated)
						if h.jersey[num] == "Q43098388" then bg_color="#99CBFF" break end -- Jersey blue.svg (Combinated)
						if h.jersey[num] == "Q24790627" then bg_color="#FF8666" break end -- Jersey red.svg (Sprints)
						if h.jersey[num] == "Q25831754" then bg_color="#99CBFF" break end -- Jersey blue.svg (Sprints)
						if h.jersey[num] == "Q26806427" then bg_color="#90EE90" break end -- Jersey green.svg (Sprints)
						if h.jersey[num] == "Q27478100" then bg_color="#C0C0C0" break end -- Jersey black.svg (Sprints)
						if h.jersey[num] == "Q28060932" then bg_color="#BF80FF" break end -- Jersey violet.svg (Sprints)
						if h.jersey[num] == "Q28483869" then bg_color="#FFFF99" break end -- Jersey yellow.svg (Sprints)
						if h.jersey[num] == "Q33134180" then bg_color="#FF69B4" break end -- Jersey rosa.svg (Sprints)
						if h.jersey[num] == "Q42532690" then bg_color="#E0FFFF" break end -- Jersey light blue.svg (Sprints)
						if h.jersey[num] == "Q43278032" then bg_color="#FFC0CB" break end -- Jersey polkadot.svg (Sprints)
						if h.jersey[num] == "Q47513277" then bg_color="#FFFFFF" break end -- Jersey white.svg (Sprints)					
						if h.jersey[num] == "Q24645383" then bg_color="#FFFFFF" break end -- Jersey white.svg (Best young)
						if h.jersey[num] == "Q26919967" then bg_color="#90EE90" break end -- Jersey green.svg (Best young)
						if h.jersey[num] == "Q26209148" then bg_color="#99CBFF" break end -- Jersey blue.svg (Best young)
						if h.jersey[num] == "Q26696523" then bg_color="#FFD030" break end -- Jersey orange.svg (Best young)
						if h.jersey[num] == "Q29229790" then bg_color="#BF80FF" break end -- Jersey violet.svg (Best young)
						if h.jersey[num] == "Q29982765" then bg_color="#FFC0CB" break end -- Jersey pink.svg (Best young)
						if h.jersey[num] == "Q33134078" then bg_color="#FF8666" break end -- Jersey red.svg (Best young)
						if h.jersey[num] == "Q38929482" then bg_color="#FFFF99" break end -- Jersey yellow.svg (Best young)
						if h.jersey[num] == "Q33026698" then bg_color="#FF8666" break end -- Jersey red.svg (Best young)
						if h.jersey[num] == "Q26953919" then bg_color="#8FBC8F" break end -- Jersey dark green.svg (Combativity)
						if h.jersey[num] == "Q29957114" then bg_color="#87CEEB" break end -- MaillotCyan.PNG (Combativity)
						if h.jersey[num] == "Q25265995" then bg_color="#F5DEB3" break end -- Jersey red green.svg (Combativity)
						if h.jersey[num] == "Q29594765" then bg_color="#C0C0C0" break end -- Jersey black.svg (Combativity)
						if h.jersey[num] == "Q30035039" then bg_color="#FFD030" break end -- Jersey orange.svg (Combativity)
						if h.jersey[num] == "Q30035038" then bg_color="#90EE90" break end -- Jersey green.svg (Combativity)
						if h.jersey[num] == "Q48691401" then bg_color="#F2BC38" break end -- Jersey Goldenrod.svg (Combativity)					
						num = num + 1
					end
				end 
				local tBodystyle = '|style='
				if l == 1 and s.background == 'color' then
					tBodystyle = tBodystyle ..'font-weight:bold;' 		-- winner is formated bold
					if h.jersey[1] ~= '' and bg_color ~= nil then 		-- background color of winner depending on jersey
						tBodystyle = tBodystyle ..'background-color:'..bg_color..''
					else tBodystyle = tBodystyle ..'' end
				end

				if l == 1 and s.background == 'strong' then
					tBodystyle = tBodystyle ..'font-weight:bold;' 		-- winner is formated bold
				end

				tBody =  
					tBody .. '|'.. 
					number(h.rider[3], h.rider[1], wiki).. '|'				--riderGender
				if s.team_classification == false then
					if h.rider[6]==nil then h.rider[6]='' end
					if available_list==false 
					then tBody = 
						tBody..
						h.rider[5].. ' '..				--flag ID
						h.rider[2].. 					--rider ID 
						jersey(h.jersey)..
						'|'.. h.rider[6]				--team ID
					else
						if country == true 
						--rank, rider ID, riderGender, nationality ID, flag ID, team ID
						then tBody = 
							tBody.. 
							h.rider[2].. 				--rider ID 
							jersey(h.jersey)..'|'.. 
							h.rider[5]..' '.. 			--flag ID
							h.rider[4].. '|'.. 			--nationality ID
							h.rider[6]					--team ID
						else tBody = 
							tBody.. 
							h.rider[5].. ' '.. 			--flag ID
							h.rider[2].. 				--rider ID 
							jersey(h.jersey)..
							'|'.. h.rider[6] 			--team ID
						end
					end
				else
					if available_list==false 
					then tBody = 
						tBody.. 
						h.rider[5].. ' '..  			--flag ID
						WPlink(riderID, 'team', startOfSeason).. 
						jersey(h.jersey)
					else
						if country == true 
						then tBody = 
							tBody.. 
							WPlink(riderID, 'team', startOfSeason).. 
							jersey(h.jersey).. 
							'|'.. h.rider[5].. ' '.. 	--flag ID
							h.rider[4] 					--nationality ID
						else tBody =
							tBody.. 
							h.rider[5].. ' '.. 			--flag ID
							WPlink(riderID, 'team', startOfSeason).. 
							jersey(h.jersey) 
							end
					end
				end
				tBody = tBody.. '' --.. '\n'

				if s.header_2[4]==4 then -- for table stageclassification, generalclassification, adds time and time gap
					if l == 1 
					then   -- points, time, time_gap, speed
						tBody = tBody.. '|'.. 
						calculate_time(wiki, h.value[2]).. ''		--time	
					else 
						tBody = tBody.. '|'.. 
						plus.. 
						calculate_time(wiki, h.value[3]).. '' 		-- time_gap
						--showgap = true
					end
				end

				if s.header_2[4] == 7 then -- for table pointsclassification, adds points
					tBody = 
						tBody.. '|'.. 
						h.value[1]									-- points
						--.. '<span style="font-size:80%">'
					if type(h.value[1]) == "number" then if h.value[1] > 1 then tBody = tBody..unit(7) else tBody = tBody..unit(6) end end 
					--tBody = tBody.. '</span>' .. '' 
				end

				if s.header_2[3] == 4 then
					if s.property == 'P2417' then -- for table teamtimetrialclassification, adds time
					--	showgap = true
						tBody = tBody.. '| '.. 
								calculate_time(wiki, h.value[2]) .. '' 		--  time
					end
				end
				if s.property == 'P3497' then -- for table teambytimeclassification, adds time and time gap
					if l == 1 
					then 
						tBody = tBody ..'| ' ..  
								calculate_time(wiki, h.value[2]) 		--  time
								.. ''--'\n'
						tBodystyle = tBodystyle .. 'text-align:right;padding:0 0.2em 0 0.2em'
					else 
						tBody = tBody.. '| '.. 
								plus.. 
								calculate_time(wiki, h.value[3]) .. ''		-- time_gap
						--showgap = true
					end				
				end
				if tBodystyle ~= '|style=' then
					tBody = tBody .. 
							tBodystyle
				end
				if s.property == 'P3496' then -- for table teambypointsclassification, adds points
					tBody = tBody.. '| '.. 
							h.value[1]					-- points
							--.. '<span style="font-size:80%">'
					if type(h.value[1]) == "number" 
					then if h.value[1] > 1 
						then tBody = 
							tBody..
							unit(7) 
						else tBody = 
							tBody..
							unit(6) 
						end 
					end 
					--tBody = tBody.. '</span>' .. '' 				
				end

				if s.header_2[4] == 5 then -- for table teamtimetrialclassification, adds time gap
					showgap = true
					tBody = tBody.. '|'
					if l > 1 then tBody = tBody.. plus end
					tBody = tBody.. 
							calculate_time(wiki, h.value[3]) .. ''			--  time_gap
				end
				if s.header_2[5] == 6 then -- for table teamtimetrialclassification, adds speed
					tBody = tBody.. '|'
					if type(h.value[4]) == "number" then 
							tBody = 
								tBody.. 
								mw.ustring.format('%.3f', h.value[4]).. 		-- speed
								unit( 5)
								--'<span style="font-size:80%">'..  unit( 5).. '</span>'.. ''	
					end
				end	

				if rank ~= nil then	t_Body[rank] = tBody.. '}}\n' end -- sort table row into the right row
			end

		--##################
		end

	
		for _, m in pairs(t_Body) do 
			tableBody = tableBody .. m
		end
	--end)
	if showgap == true 	then tableStart  = tableStart  .. '|showgap=t'	end

			-- ##############################
	local tableEnd = '{{نهاية نتيجة سباق ركوب الدراجات'
	
	if tableNewline ~= '' 
		then
			tableEnd = tableEnd .. '|clear=' .. tableNewline .. '}}'
		else
			tableEnd = tableEnd .. '}}'
	end
						--'|-\n|}'
	--if showgap == true 	then tableStart  = tableStart  .. '|showgap=t'	end
	--return '{| style="'.. tableStyle.. '" \n |\n'..
		--tableStart.. tableHeader1.. tableHeader2.. tableBody.. tableEnd.. '\n|}'.. tableNewline
	return --'{{بداية نتيجة سباق ركوب الدراجات|style='.. tableStyle.. '}}\n'..
		tableStart ..
		tableHeader1 ..
		--tableHeader2 ..
		tableBody .. 
		tableEnd -- .. '\n'
		--.. '{{نهاية نتيجة سباق ركوب الدراجات}}' 
		--.. tableNewline
end

function references(entity, property, var1)
	local ref1, ref2, ref2b, ref3, ref4 = "", " ", "", "", ""
	local url, ref
	local lang = mw.language.getContentLanguage()
	local a, b

	if onwikidata then lang = mw.getLanguage('fr') end

	a, b = pcall(fooB, 'value', entity, property, var1, 1, 'P854', 1) -- url
	if a == true then ref1 = b end
	a, b = pcall(fooB, 'text', entity, property, var1, 1, 'P1476', 1) -- Originaltitel der webpage, "language": "fr"
	if a == true then 
		ref2 = b 
		ref2b= entity.claims[property][var1].references[1].snaks['P1476'][1].datavalue.value.language or ''
		if ref2b == wiki then ref2b = '' else ref2b = '(' .. ref2b .. ') ' end
	end
	a, b = pcall(fooB, 'time', entity, property, var1, 1, 'P577', 1) -- publication date
	if a == true then
		local _, _, year, m, d = string.find(b,"(%d+)-(%d+)-(%d+)")
		if d ~= '00' and m ~= '00' then
			if wiki == "de" then ref3 = ', ' .. lang:formatDate( "j. F Y", b) 
			elseif wiki == "ar" then ref3 = ', ' .. lang:formatDate( "j F Y", b) .. '.' 
			elseif wiki == "en" then ref3 = ', ' .. lang:formatDate( "Y F, j", b) .. '.' 
			elseif wiki == "fr" then ref3 = ', ' .. lang:formatDate( "j F Y", b)
			else ref3 = ', ' .. func_date (b, 'long') .. '.'  --lang:formatDate( "j n Y", b) .. '.' 
			end
		elseif d == '00' and m ~= '00' then
			d = '01'
			if wiki == "de" then ref3 = ', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d ) 
			elseif wiki == "ar" then ref3 =', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )..'.'
			elseif wiki == "en" then ref3 =', ' .. lang:formatDate( "Y F", year..'-'..m..'-'..d )..'.'
			elseif wiki == "fr" then ref3 =', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )				
			else ref3 = ', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )..'.'
			end
		else ref3 = year 
		end
	end
	a, b = pcall(fooB, 'time', entity, property, var1, 1, 'P813', 1) -- Retrieved
	if a == true then 
		if wiki == "de" then ref4 = ", (abgerufen am " .. lang:formatDate( "j. F Y", b).. ')'
		elseif wiki == "ar" then ref4 = " Retrieved " .. lang:formatDate( "j F Y", b) .. '.'
		elseif wiki == "en" then ref4 = " Retrieved " .. lang:formatDate( "Y F, j", b) .. '.'
		elseif wiki == "fr" then ref4 = " (consulté le " .. lang:formatDate( "j F Y", b) .. ')'
		else ref4 = " Retrieved " .. func_date (b, 'long').. '.' --lang:formatDate( "j n Y", b) .. '.'
		end
	end

	if ref1~='' then --and ref2~='' then
		local _, start = string.find( ref1, '//' ) 
		local ende, _ = string.find( ref1, '/', start + 1 )
		local s = string.sub(ref1, start + 1, ende - 1) 
		local s2 = string.gsub(s, "www.", "")
		if wiki == "fr" then 
		-- fr: "(en) « Lloyd Mondory ... EPO », sur velonews.competitor.com (consulté le 30 april 2016), 30 octobre 2015." 
			if ref2~=' ' then url= ', sur <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end
			ref = ref2b .. '« ['.. ref1.. ' '.. ref2.. '] »' .. url .. ref4 .. ref3 ..'.'
		elseif wiki == "en" then 
		-- en: "Inflation ... recession", Pittsburgh Post-Gazette, October 16, 2009. Retrieved 2010-01-21.
			if ref2~=' ' then url= ', <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end
			ref = '"['.. ref1.. ' '.. ref2.. '"]'.. ref2b .. url .. ref3 .. ref4			
		elseif wiki == "de" then 
			if ref2~=' ' then url= ' In: <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end			
			ref = '<span style="font-style:italic;">['.. ref1.. ' '.. ref2.. '.]</span> '.. url.. ref3 .. ref4 ..'.'
		else 
			if ref2~=' ' then url= ' <span style="font-style:italic;">' .. s2 .. '</span>' else url='' end			
			ref = ref2b .. '['.. ref1.. ' '.. ref2.. '] ' .. url.. ref3 .. ref4 
		end
	return ref or ''
	else return ''
	end 
end

function p.winnertable(frame)
	local t = {is_a="", class="", stage="", starttime="", endtime="", time="", date="", dates="", length="", length_unit="", 
	startplace="", endplace="", nr_teams="", nr_participants_start="", nr_participants_end="", speed="", speed_unit="", cost="", cost_unit="", 
	first="", first_team="", second="", second_team="", third="", third_team="", winner_point="", winner_point_team="", winner_mountain="", winner_mountain_team="", 
	winner_sprint="", winner_sprint_team="", winner_young="", winner_young_team="", winner_fighting="", winner_fighting_team="", winner_combination="", 
	winner_combination_team="", winner_metas_volantes="", winner_metas_volantes_team="", winner_regularity="", winner_regularity_team="", 
	winner_fuga_pinarello="", winner_fuga_pinarello_team="", winner_azzurri_ditalia="", winner_azzurri_ditalia_team="", winner_team="", 
	winner_team_points="", previous="", next=""}
	local ref = {stage="", starttime="", endtime="", time="", date="", dates="", length="", nr_participants_start="", nr_participants_end="", 
	speed="", speed_unit="", cost="", first="", second="", third="", winner_point="", winner_mountain="", winner_sprint="", winner_young="", 
	winner_fighting="", winner_metas_volantes="", winner_regularity="", winner_combination="", winner_fuga_pinarello="", winner_azzurri_ditalia="", 
	winner_team="", winner_team_points=""}
	local tt = {icon="", picture="", caption="", name="", nr="", map="" }
	local ttt = {tour={}, country={}}
	local tttt = {special_1a="", special_1b="", special_2a="", special_2b=""}
	
	local entity = ""
	local y, m, d = "", "", ""
	local y2, m2, d2 = "", "", ""
	local a, b, c, k, num, i
	local entityId = frame.args[1]
	local lang = mw.language.getContentLanguage()
	local wiki = string.match(mw.site.server, "%a+")
	local results = false
	local a1, b1, c1, a2, b2, c2
	local timeofrace


	if type( entityId ) ~= 'string' then error( 'parameter must be a string') end
	if not entityId:match( 'Q%d+' ) then error ( 'parameter must be a valid Wikidata item (ex: Q42)' ) end
	local entity = mw.wikibase.getEntity( entityId )

	local localFrame 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end

	if localFrame.args[infobox_translate(29)] then tt.picture = localFrame.args[infobox_translate(29)] end 
	if localFrame.args[infobox_translate(30)] then tt.caption = localFrame.args[infobox_translate(30)] end 
	if localFrame.args[infobox_translate(31)] then tt.map = localFrame.args[infobox_translate(31)] end 

	if  entity:getLabel('ar') ~= nil then tt.name = entity:getLabel('ar')
	else
		if entity:getLabel( 'fr' ) ~= nil then tt.name = entity:getLabel( 'fr' ).. " (fr)"
		else tt.name = "Wikidata doesn´t know" end 
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P641', 1) 
	if a == true then -- icon for road bicycle racing, Q3609 (road bicycle racing)
		if b == 3609 then tt.icon = " [[File:Cycling (road) pictogram.svg|35px]]" end 
	end
	a, b = pcall(fooA, 'value', entity, 'P18', 1) 
	if a == true and tt.picture == "" then 
		local v
		tt.picture = b
		if pcall(foo3, entity, "P18", 1, "P2096", 1) then
			for _, v in pairs(entity.claims["P18"]) do
				for num=1,#v.qualifiers["P2096"] do
					if v.qualifiers["P2096"][num].datavalue.value.language == lang:getCode() then
					tt.caption = v.qualifiers["P2096"][num].datavalue.value.text end
				end
			end
		end
	end
	
	-- For FR Wiki and Wikidata, exception that permit to display 1er, 2e... for the edition number ; 
	-- for RU Wiki, -й is written after the value of P393
	a, b = pcall(fooA, 'value', entity, 'P393', 1)
	if a == true and tt.nr == "" then
		tt.nr = b .. ". "
		if wiki == "fr" or wiki == "www" then
			if b == 1  then tt.nr = "1<sup>re</sup> " else tt.nr = b .."<sup>e</sup> " end end
		if wiki == "nl" then tt.nr = b .."e " end
		if wiki == "ru" then tt.nr = b .."-й " end
		if wiki == "eo" then tt.nr = b .."-a " end
		if wiki == "cs" then tt.nr = b ..". " end
		if wiki == "hu" then tt.nr = b .."-ik " end
	end
	-- Class of a cycling race. Class is: 1.UWT, 2.UWT, 1.HC, ... add new classes, no problem
	local class = { "Q22231106", "Q22231107", "Q22231108", "Q22231109", "Q22231110", "Q22231111", "Q22231112",
		"Q22231113", "Q22231114", "Q22231115", "Q22231116", "Q22231117", "Q22231118", "Q22231119", "Q23015458", "Q23005601", "Q23005603" } 
	a, b = pcall(fooA, 'numeric-id', entity, 'P31', 1) -- first value for P31
	c, d = pcall(fooA, 'numeric-id', entity, 'P31', 2) -- second value for P31
	if a == true and c == true then -- for two values
		for i=1,#class do -- #class = number of elements in class
   			if "Q"..b == class[i] then t.class = "c"..b t.is_a = "Q"..d break end
   			if "Q"..d == class[i] then t.class = "c"..d t.is_a = "Q"..b break end  		
   		end
 	else -- if there is only one value, assume it is not a class
		if a == true or c == true then t.is_a = "Q"..b end
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P361', 1) -- Competition of the cycling race : UCI World Tour 2016, UCI Europe Tour 2016...
	if a == true then --ttt.tour = "Q" .. b end
		local i, v
		for i, v in pairs(entity.claims["P361"]) do
			ttt.tour[i] = "T" .. v.mainsnak.datavalue.value["numeric-id"]
		end
	end

	if t.stage == "" then
		if pcall(function() -- This function count the number of value for P527 to determine the number of stages
			t.stage = table.getn(entity.claims["P527"])
		end
		) then else t.stage = "" end
	end

	a1, b1, c1 = pcall(fooA, 'time', entity, 'P580', 1) 
	if a1 == true and t.starttime == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P580', i) 
		end  
		--b1 = "+2015-07-04T00:00:00Z"
		_, _, y, m, d = string.find(b1, "(%d+)-(%d+)-(%d+)")  
	end
	a2, b2, c2 = pcall(fooA, 'time', entity, 'P582', 1) 
	if a2 == true and t.endtime == "" then i = 1
		while a2 == true and c2 == 'deprecated' do 
			i = i + 1 
			a2, b2, c2 = pcall(fooA, 'time', entity, 'P582', i) 
		end  
		--b2 = "+2015-07-05T00:00:00Z"
		_, _, y2, m2, d2 = string.find(b2, "(%d+)-(%d+)-(%d+)")
	end
	if a1 == true and t.starttime == "" then 
		if y ~= y2 then t.starttime = lang:formatDate( "j F Y", b1 ) 
		elseif m ~= m2 then t.starttime = lang:formatDate( "j F", b1 )
		else t.starttime = lang:formatDate( "j", b1 )
		end
		if wiki == "ar" then 
			if y ~= y2 then t.starttime = lang:formatDate( "d F Y", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "d F", b1 )	
			else t.starttime = lang:formatDate( "d F", b1 )
			end	end		

		if wiki == "en" then 
			if y ~= y2 then t.starttime = lang:formatDate( "F d, Y", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "F d", b1 )	
			else t.starttime = lang:formatDate( "F d", b1 )
			end	end			
	end -- if a1
	if a2 == true and t.endtime == "" then 
		t.endtime = lang:formatDate( "j F Y", b2 ) 
		timeofrace = b2
		if wiki == "ar" then
			if y ~= y2 then t.endtime = lang:formatDate( "d F Y", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "d F Y", b2 )	
			else t.endtime = lang:formatDate( "d، Y", b2 )	
			end	end	
		if wiki == "en" then
			if y ~= y2 then t.endtime = lang:formatDate( "F d, Y", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "F d, Y", b2 )	
			else t.endtime = lang:formatDate( "d, Y", b2 )	
			end	end	
			
	end -- if a2

-- This function give a format to dates when P585 (date) is used in a single day race
	a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', 1) 
	if a1 == true and t.time == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', i) 
		end  		
		t.time = func_date (b1,  'long') 
		timeofrace = b1
	end

	-- This function permits to display an unity (the kilometer) for a distance, with exceptions for macedionan, russian and japanese 
	-- that have other symbols 
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', 1) 
	if a1 == true and t.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', i) 
		end   
		t.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P3157', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t.length_unit = 'km'
			if  wiki == "ar" then t.length_unit = 'كم' end
		end
	end

	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', 1) 
	if a1 == true and t.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', i) 
		end   
		t.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P2043', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t.length_unit = 'km'
			if  wiki == "ar" then t.length_unit = 'كم' end
		end
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P17', 1) -- This function gives countries where the race take place
	if a == true then --and ttt.country == "" then ttt.country = "Q" .. b end
		local i, v
		for i, v in pairs(entity.claims["P17"]) do
   			ttt.country[i] = "C" .. v.mainsnak.datavalue.value["numeric-id"]
   		end
 	end			
	-- Function that give the starting place of a race 
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', 1) 
	if a1 == true and t.startplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', i) 
		end   
		t.startplace = "Q" .. b1 
	end	
	-- Function that give the finishing place of a race
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', 1) 
	if a1 == true and t.endplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', i) 
		end   
		t.endplace = "Q" .. b1 
	end	
	-- This function counts the number of value for P1923 (participating teams) and give the number of team that participate at the race
    if pcall(function() 
         t.nr_teams = table.getn(entity.claims["P1923"])
         end        	
      ) then else t.nr_teams = "" end   

	-- Function that give the number of cyclists at the beginning and at the finishing of a race
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', 1) 
	if a1 == true and t.nr_participants_start == "" and t.nr_participants_end == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', i) 
		end 
		local v
		for _, v in pairs(entity.claims["P1132"]) do
			if pcall(function()
		   		if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 529711 then
				t.nr_participants_start = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
				end
			) then else t.nr_participants_start = "" end
			if pcall(function()
				if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 12769393 then
				t.nr_participants_end = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
			end
			) then else t.nr_participants_end = "" end
		end	-- for 	
	end -- if a1

	-- This function permits to display an unity (the kilometer per hour) for an average speed, with exceptions for macedionan, russian and japanese 
	-- that have other symbols
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', 1) 
	if a1 == true and t.speed == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', i) 
		end 
		t.speed = b1
		a1, b1 = pcall(fooA, 'unit', entity, 'P2052', 1)
		if b1 == "http://www.wikidata.org/entity/Q180154" then
			t.speed_unit = 'km/h'
			if  wiki == "ar" then t.speed_unit = 'كم/س' end	
		end
	end	-- if a1
 	-- This function permits to display an unity for the cost of a cycling race
	a, b = pcall(fooA, 'amount', entity, 'P2130', 1)
	if a == true and t.cost == "" then 
		t.cost = b 
		a, b = pcall(fooA, 'unit', entity, 'P2130', 1)
		if b == "http://www.wikidata.org/entity/Q4916" then t.cost_unit = '€' end	
		if b == "http://www.wikidata.org/entity/Q4917" then t.cost_unit = '$' end	
	end

	a, b = pcall(fooA, 'value', entity, 'P242', 1) -- locator map image
	if a == true and tt.map == "" then tt.map = b end
	a, b = pcall(fooA, 'numeric-id', entity, 'P155', 1) 
	if a == true and t.previous == "" then t.previous = "Q"..b end	
	a, b = pcall(fooA, 'numeric-id', entity, 'P156', 1) 
	if a == true and t.next == "" then t.next = "Q"..b end
	
	local note, qual, id, id_team
	-- By entering a value just below, the Wikipedia added will have Wikidata logos associated with cyclists in the infobox	
	if wiki == "www" or wiki == "mk" or wiki == "ja" or wiki == "ru" then note = 'q' 
	elseif wiki == "www" then note = 'م' 
	else note = 'f' end 
	note = 'f'
	-- By entering a value just below, the Wikipedia added will show the team of the winner
	if pcall(foo3, entity, "P1346", 1, "P642", 1) then
		local k, v, vv
		for k, v in pairs(entity.claims["P1346"]) do
			id_team = '' 
			--id_team = 't26973671'
			a, b = pcall(fooC, 'numeric-id', entity, 'P1346', k, 'P54', 1)
			if a == true then id_team = 't'..b end
		
			if pcall(function() id=v.mainsnak.datavalue.value['numeric-id'] end) then else id=nil end -- id = rider id
			if id ~= nil then
				--timeofrace = "+2016-03-00T00:00:00Z" 
				-- function timeStartEnd finds the team of the rider at the time (timeofrace) of the race
				if id_team == '' and timeofrace ~= nil and timeofrace ~= '' then 
					a, b = timeStartEnd('Q'..id, 'P54', 'numeric-id', timeofrace) 
					if a == true and b ~= nil then id_team = 't' .. b end
				end
			end
--			pcall(function() id=v.mainsnak.datavalue.value['numeric-id'] end) -- rider ID
			
			-- looks into race item if the winner has a P54 statement for beeng a member of a national team 
			pcall(function() 			
				for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P54']) do 
					id_team = '2t'.. ' ('.. national_team(  'Q'..id, timeofrace, entity, 'P1346', k).. ')' 
				end
			end)

			-- looks into race item if the winner has a P642 statement for showing the type of winner (points, mountain, ..)
			pcall(function() 			
				for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P642']) do 
					qual=vv.datavalue.value['numeric-id']

		if id~=nil and qual~=nil and v.rank~='deprecated' then 
			if qual == 20882667 and t.first=="" then t.first=note..id t.first_team=id_team ref.first=references(entity,"P1346",k) results=true end
			if qual == 20882668 and t.second=="" then t.second=note..id t.second_team=id_team ref.second=references(entity,"P1346",k) results=true end
			if qual == 20882669 and t.third=="" then t.third=note..id t.third_team=id_team ref.third=references(entity,"P1346",k) results=true end
			if qual == 20883007 and t.winner_point=="" then t.winner_point=note..id t.winner_point_team=id_team ref.winner_point=references(entity,"P1346",k) results=true end
			if qual == 20883212 and t.winner_mountain=="" then t.winner_mountain=note..id t.winner_mountain_team=id_team ref.winner_mountain=references(entity,"P1346",k) results=true end   			
  			if qual == 20883328 and t.winner_sprint=="" then t.winner_sprint=note..id t.winner_sprint_team=id_team ref.winner_sprint=references(entity,"P1346",k) results=true end
			if qual == 20883139 and t.winner_young=="" then t.winner_young=note..id t.winner_young_team=id_team ref.winner_young=references(entity,"P1346",k) results=true end  
			if qual == 20893983 and t.winner_fighting=="" then t.winner_fighting=note..id t.winner_fighting_team=id_team ref.winner_fighting=references(entity,"P1346",k) results=true end
			if qual == 27067359 and t.winner_metas_volantes=="" then t.winner_metas_volantes=note..id t.winner_metas_volantes_team=id_team ref.winner_metas_volantes=references(entity,"P1346",k) results=true end
			if qual == 27067170 and t.winner_regularity=="" then t.winner_regularity=note..id t.winner_regularity_team=id_team ref.winner_regularity=references(entity,"P1346",k) results=true end
			if qual == 20893979 and t.winner_combination=="" then t.winner_combination=note..id t.winner_combination_team=id_team ref.winner_combination=references(entity,"P1346",k) results=true end
			if qual == 27907715 and t.winner_fuga_pinarello=="" then t.winner_fuga_pinarello=note..id t.winner_fuga_pinarello_team=id_team ref.winner_fuga_pinarello=references(entity,"P1346",k) results=true end
			if qual == 27907747 and t.winner_azzurri_ditalia=="" then t.winner_azzurri_ditalia=note..id t.winner_azzurri_ditalia_team=id_team ref.winner_azzurri_ditalia=references(entity,"P1346",k) results=true end
			if qual == 20882921 and t.winner_team == "" then
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( 'Q'..id ), 'P31', 1)
				if a == true and (b == 20738667 or b == 23726798) then -- test if 'national cycling team U23' or 'national cycling team'
					t.winner_team = '2t' .." "..national_team(  'Q'..id, timeofrace, entity, 'P1346', k)
				else
					t.winner_team = note .. id ref.winner_team=references(entity,"P1346",k) results = true
				end
			end
			if qual == 27104269 and t.winner_team_points == "" then t.winner_team_points = note .. id ref.winner_team_points=references(entity,"P1346",k) results = true end
 		end
				end
			end) 
		end	-- for
	end  -- end if pcall

	-- code for references
	local list = {} -- list[1][1] = value from ref.first, list [1][2] = 'first'
	local k
	for k in pairs(ref) do 
		if ref[k]~='' then table.insert(list, {ref[k], k}) end 
	end
	local w, ww 	
	num = #list
	for w=num,1,-1 do
		for ww=1,w do
			if w ~= ww then 
				if list[w][1] == list[ww][1] then list[w][1] = frame:extensionTag{name='ref', args={name=entityId..ww}} break end	
			else list[w][1] = frame:extensionTag{name='ref', content=list[w][1], args={name=entityId..ww}} end 
		end
	end
	for i=1,num do 
		ref[ list[i][2] ] = list[i][1] --list[num+1-i][1] 
	end

	-- transform Q/q-number into flag / WPlink / WDlink
	local k
	local team = true
	local wd = " [[File:Wikidata-logo S.svg|24px|link=d:"	

	for k in pairs(ttt) do -- "^C" ttt.country, "^T" ttt.tour
		if ttt[k][1]~=nil and string.find(ttt[k][1], "^C") then for i=1,#ttt[k] do ttt[k][i] = string.gsub(ttt[k][i], "C", "Q") ttt[k][i] = flag(ttt[k][i], timeofrace).." ".. WPlink( ttt[k][i] ) end end
		if ttt[k][1]~=nil and string.find(ttt[k][1], "^T") then for i=1,#ttt[k] do ttt[k][i] = string.gsub(ttt[k][i], "T", "Q") ttt[k][i] = WPlink( ttt[k][i], 'race') end end
	end	
	for k in pairs(t) do 
		if string.find(t[k], "^Q") then --t[k], k = startplace, endplace, ... find variables with an item as value
			if pcall(foo1, t[k]) then t[k] = WPlink( t[k] )	end
		end
		if string.find(t[k], "^q") then -- find variables with an item as value (in section Résultats)
			t[k] = mw.ustring.upper( t[k] )
			--look into P27 (country of citizenship) to get the Qnumber of that country
			a, b = timeStartEnd(t[k], "P27", 'numeric-id', timeofrace)
			if a == true and pcall(foo1, t[k]) then t[k] = flag('Q'..b, timeofrace).." "..WPlink( t[k] )..ref[k]..wd..t[k].."]]"
			else
				--look into P17 (country) to get the Qnumber of that country
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( t[k] ), 'P17', 1)
				if a == true and pcall(foo1, t[k]) then t[k] = flag("Q"..b, timeofrace).." "..WPlink( t[k] )..ref[k]..wd..t[k].."]]" end
			end
		end
		if string.find(t[k], "^f") then -- no WDitem, frWP
			t[k] = string.gsub(t[k], "f", "Q")
			--look into P27 (country of citizenship) to get the Qnumber of that country
			a, b = timeStartEnd(t[k], "P27", 'numeric-id', timeofrace)
			if a == true and pcall(foo1, t[k]) then t[k] = flag('Q'..b, timeofrace).." "..WPlink( t[k] )..ref[k]
			else	
				--look into P17 (country) to get the Qnumber of that country
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( t[k] ), 'P17', 1)
				if a == true and pcall(foo1, t[k]) then t[k] = flag("Q"..b, timeofrace).." "..WPlink( t[k], 'team', timeofrace )..ref[k] else t[k] = WPlink( t[k], 'team', timeofrace )..ref[k] end
			end
		end	
		if string.find(t[k], "^c") then -- find "class"-items, first asci = "c"
			t[k] = string.gsub(t[k], "c", "Q")
			if pcall(foo1, t[k]) then t[k] = WPlink( t[k], "Q22348500" ) end
		end
		if string.find(t[k], "^t") then 
			t[k] = string.gsub(t[k], "t", "Q")
			--timeofrace = "+2008-04-09T00:00:00Z"
			if pcall(foo1, t[k]) then t[k] = " (" .. WPlink( t[k], 'team', timeofrace ) .. ")" end
		end
		if string.find(t[k], "^2t") then t[k] = string.gsub(t[k], "2t", "") end		
	end

    --local nl ="&#10;"
    -- local tooltip = infobox_bottom(2) .. nl .. mw.text.encode( property(1) .. ' (P393)' ) .. nl .. mw.text.encode( property(2) ..' (P17)')
    
    if t.length ~= "" then 
    	t.length, _ = string.gsub(t.length, "[+]", "") -- delets "+" sign from t.length 
    	t.length = lang:formatNum(tonumber(t.length)) -- formats t.length in the way it is done in the local Wiki
    	if wiki == 'fo' then t.length = string.gsub(t.length, "%.", ",") end
    end    
    if t.speed ~= "" then 
    	t.speed, _ = string.gsub(t.speed, "[+]", "")
    	t.speed = lang:formatNum(tonumber(t.speed))
    	if wiki == 'fo' then t.speed = string.gsub(t.speed, "%.", ",") end
    end
    if t.cost ~= "" then 
    	t.cost, _ = string.gsub(t.cost, "[+]", "")
    	t.cost = lang:formatNum(tonumber(t.cost))
    	if wiki == 'fo' then t.cost = string.gsub(t.cost, "%.", ",") end
    end
    
   	local span1, span2 = "<span style='color:#3366CC'>&#x25C0; </span>", "<span style='color:#3366CC'> &#x25B6;</span>"
    local k = t.previous
	local i, _ = string.find(k, "|")
	local j, _ = string.find(k, "]")
	if i ~= nil and j ~= nil then 
		t.previous = string.sub(k, 1, i) .. span1 .. (string.match(string.sub(k, i+1, j-1), "%d%d%d%d") or '') .. string.sub(k, j) 
	else 
		if string.find(k, "%d%d%d%d") == nil then t.previous = '' else t.previous = string.sub(k, string.find(k, "%d%d%d%d")) end
		if t.previous ~= "" then t.previous = span1 .. t.previous end 
	end

	k = t.next
	i, _ = string.find(k, "|")
	j, _ = string.find(k, "]")
	if i ~= nil and j ~= nil then 
		t.next = string.sub(k, 1, i) .. (string.match(string.sub(k, i+1, j-1), "%d%d%d%d") or '') .. span2 .. string.sub(k,j) 
	else 
		if string.find(k, "%d%d%d%d") == nil then t.next = "" else t.next = string.sub(k, string.find(k, "%d%d%d%d")) end
		if t.next ~= "" then t.next = t.next .. span2 end 
	end

	tt.caption = string.gsub(tt.caption, "{{(%w+)}}", function (n) return frame:expandTemplate{ title = n }  end)
	-- for overwriting Wikidata content with data in Wikipedia articles. numbers are from function infobox_translate
	local z = {stage=5, date=6, dates=7, length=8, startplace=11, endplace=12, nr_teams=13, nr_participants_start=14, nr_participants_end=15, 
	speed=16, cost=17, first=19, second=20, third=21, winner_point=22, winner_mountain=23, winner_sprint=24, winner_young=25, winner_fighting=26, 
	winner_combination=27, winner_team=28, winner_team_points=37, winner_metas_volantes=35, winner_regularity=36, winner_fuga_pinarello=38,
	winner_azzurri_ditalia=39}

 	tab = "{| class='wikitable' cellpadding='4' cellspacing='0'; border:1px solid rgb(200,200,200);" --float:rgiht; 
    tab = tab .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px; ; "--clear:left
    tab = tab .. "text-align:right; font-size:95%; line-height:1.6em;\n"
	--if results then tab = tab.."|- \n| colspan='2' style='border-bottom:5px solid white; background-color:#FFDF80; text-align:center' | '''"..infobox_translate(18).."'''\n" end
	if results then tab = tab.."|+ '''"..infobox_translate(18).."'''\n" end
	tab = tab.."|- \n! '''الترتيب'''!! الفائز \n"

	if t.first ~= "" then tab = tab.."|- \n| '''"..infobox_translate(19).."'''||" .. t.first .. "\n" end
	if t.second ~= "" then tab = tab.."|- \n| '''"..infobox_translate(20).."'''||" .. t.second .. "\n" end
	if t.third ~= "" then tab = tab.."|- \n| '''"..infobox_translate(21).."'''||" .. t.third .. "\n" end
	if t.winner_point ~= "" then tab = tab.."|- \n| '''"..infobox_translate(22).."'''||" .. t.winner_point .. "\n" end
	if t.winner_mountain ~= "" then tab = tab.."|- \n| '''"..infobox_translate(23).."'''||" .. t.winner_mountain .. "\n" end
	if t.winner_sprint ~= "" then tab = tab.."|- \n| '''"..infobox_translate(24).."'''||" .. t.winner_sprint .. "\n" end
	if t.winner_young ~= "" then tab = tab.."|- \n| '''"..infobox_translate(25).."'''||" .. t.winner_young .. "\n" end
	if t.winner_fighting ~= "" then tab = tab.."|- \n| '''"..infobox_translate(26).."'''||" .. t.winner_fighting .. "\n" end
	if t.winner_metas_volantes ~= "" then tab = tab.."|- \n| '''"..infobox_translate(35).."'''||" .. t.winner_metas_volantes .. "\n" end
	if t.winner_regularity ~= "" then tab = tab.."|- \n| '''"..infobox_translate(36).."'''||" .. t.winner_regularity .. "\n" end
	if t.winner_fuga_pinarello ~= "" then tab = tab.."|- \n| '''"..infobox_translate(38).."'''||" .. t.winner_fuga_pinarello .. "\n" end
	if t.winner_azzurri_ditalia ~= "" then tab = tab.."|- \n| '''"..infobox_translate(39).."'''||" .. t.winner_azzurri_ditalia .. "\n" end
	if t.winner_combination ~= "" then tab = tab.."|- \n| '''"..infobox_translate(27).."'''||" .. t.winner_combination .. "\n" end
	if t.winner_team ~= "" then tab = tab.."|- \n| '''"..infobox_translate(28).."'''||" .. t.winner_team .. "\n" end
	if t.winner_team_points ~= "" then tab = tab.."|- \n| '''"..infobox_translate(37).."'''||" .. t.winner_team_points .. "\n" end

	--tab = tab.."<tr><td style='text-align:right'>"..t.previous.."</td><td style='text-align:left'>" .. t.next .. "\n"
	--tab = tab.."|- \n| "..t.previous.."</td><td style='text-align:right'>" .. t.next .. "\n"
	local s = "d:Wikidata:WikiProject Cycling/Documentation/infobox"
	--tab = tab .. "|- \n| colspan='2' style='text-align:left; border-top:0px solid #FFDF80; font-size:75%' | " .. "[[" .. s .. "|" .. infobox_translate(34) .. "]] [[File:Wikidata-logo S.svg|24px|link=d:".. frame.args[1]  .. "]]" --infobox_bottom(1) 
	tab= tab.."\n|}"
	return tab
end

function p.infobox(frame)
	local t = {is_a="", class="", stage="", starttime="", endtime="", time="", date="", dates="", length="", length_unit="", 
	startplace="", endplace="", nr_teams="", nr_participants_start="", nr_participants_end="", speed="", speed_unit="", cost="", cost_unit="", 
	first="", first_team="", second="", second_team="", third="", third_team="", winner_point="", winner_point_team="", winner_mountain="", winner_mountain_team="", 
	winner_sprint="", winner_sprint_team="", winner_young="", winner_young_team="", winner_fighting="", winner_fighting_team="", winner_combination="", 
	winner_combination_team="", winner_metas_volantes="", winner_metas_volantes_team="", winner_regularity="", winner_regularity_team="", 
	winner_fuga_pinarello="", winner_fuga_pinarello_team="", winner_azzurri_ditalia="", winner_azzurri_ditalia_team="", winner_team="", 
	winner_team_points="", previous="", next=""}
	local ref = {stage="", starttime="", endtime="", time="", date="", dates="", length="", nr_participants_start="", nr_participants_end="", 
	speed="", speed_unit="", cost="", first="", second="", third="", winner_point="", winner_mountain="", winner_sprint="", winner_young="", 
	winner_fighting="", winner_metas_volantes="", winner_regularity="", winner_combination="", winner_fuga_pinarello="", winner_azzurri_ditalia="", 
	winner_team="", winner_team_points=""}
	local tt = {icon="", picture="", caption="", name="", nr="", map="" }
	local ttt = {tour={}, country={}}
	local tttt = {special_1a="", special_1b="", special_2a="", special_2b=""}
	
	local entity = ""
	local y, m, d = "", "", ""
	local y2, m2, d2 = "", "", ""
	local a, b, c, k, num, i
	local entityId = frame.args[1]
	local lang = mw.language.getContentLanguage()
	local results = false
	local a1, b1, c1, a2, b2, c2
	local timeofrace

	if type( entityId ) ~= 'string' then error( 'parameter must be a string') end
	if not entityId:match( 'Q%d+' ) then error ( 'parameter must be a valid Wikidata item (ex: Q42)' ) end
	local entity = mw.wikibase.getEntity( entityId )

	local localFrame 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end

	if localFrame.args[infobox_translate(2)] then tt.nr = localFrame.args[infobox_translate(2)] end 
	if localFrame.args[infobox_translate(29)] then tt.picture = localFrame.args[infobox_translate(29)] end 
	if localFrame.args[infobox_translate(30)] then tt.caption = localFrame.args[infobox_translate(30)] end 
	if localFrame.args[infobox_translate(31)] then tt.map = localFrame.args[infobox_translate(31)] end 
	
	if entity:getLabel('ar') ~= nil then tt.name = entity:getLabel('ar')
	else
		if wiki == "ar" and entity:getLabel( 'en' ) ~= nil then tt.name = entity:getLabel( 'en' )
		elseif entity:getLabel( 'fr' ) ~= nil then tt.name = entity:getLabel( 'fr' ).. " (fr)"
		else tt.name = "Wikidata doesn´t know" end
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P641', 1) 
	if a == true then -- icon for road bicycle racing, Q3609 (road bicycle racing)
		if b == 3609 then tt.icon = " [[File:Cycling (road) pictogram.svg|35px]]" end 
	end
	a, b = pcall(fooA, 'value', entity, 'P18', 1) 
	if a == true and tt.picture == "" then 
		local v
		tt.picture = b
		if pcall(foo3, entity, "P18", 1, "P2096", 1) then
			for _, v in pairs(entity.claims["P18"]) do
				for num=1,#v.qualifiers["P2096"] do
					if v.qualifiers["P2096"][num].datavalue.value.language == lang:getCode() then
					tt.caption = v.qualifiers["P2096"][num].datavalue.value.text end
				end
			end
		end
	end
	
	-- For FR Wiki and Wikidata, exception that permit to display 1er, 2e... for the edition number ; 
	-- for RU Wiki, -й is written after the value of P393
	a, b = pcall(fooA, 'value', entity, 'P393', 1)
	if a == true and tt.nr == "" then
		tt.nr = b .. ". "
		if wiki == "fr" then
			if b == 1  then tt.nr = "1<sup>re</sup> " else tt.nr = b .."<sup>e</sup> " end end
		if wiki == "nl" then tt.nr = b .."e " end
		if wiki == "ru" then tt.nr = b .."-й " end
		if wiki == "eo" then tt.nr = b .."-a " end
		if wiki == "cs" then tt.nr = b ..". " end
		if wiki == "hu" then tt.nr = b .."-ik " end
	end
	-- Class of a cycling race. Class is: 1.UWT, 2.UWT, 1.HC, ... add new classes, no problem
	local class = { "Q22231106", "Q22231107", "Q22231108", "Q22231109", "Q22231110", "Q22231111", "Q22231112",
		"Q22231113", "Q22231114", "Q22231115", "Q22231116", "Q22231117", "Q22231118", "Q22231119", "Q23015458", "Q23005601", "Q23005603" } 
	a, b = pcall(fooA, 'numeric-id', entity, 'P31', 1) -- first value for P31
	c, d = pcall(fooA, 'numeric-id', entity, 'P31', 2) -- second value for P31
	if a == true and c == true then -- for two values
		for i=1,#class do -- #class = number of elements in class
   			if "Q"..b == class[i] then t.class = "c"..b t.is_a = "Q"..d break end
   			if "Q"..d == class[i] then t.class = "c"..d t.is_a = "Q"..b break end  		
   		end
 	else -- if there is only one value, assume it is not a class
		if a == true or c == true then t.is_a = "Q"..b end
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P361', 1) -- Competition of the cycling race : UCI World Tour 2016, UCI Europe Tour 2016...
	if a == true then --ttt.tour = "Q" .. b end
		local i, v
		for i, v in pairs(entity.claims["P361"]) do
			ttt.tour[i] = "T" .. v.mainsnak.datavalue.value["numeric-id"]
		end
	end

	if t.stage == "" then
		if pcall(function() -- This function count the number of value for P527 to determine the number of stages
			t.stage = table.getn(entity.claims["P527"])
		end
		) then else t.stage = "" end
	end

	a1, b1, c1 = pcall(fooA, 'time', entity, 'P580', 1) 
	if a1 == true and t.starttime == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P580', i) 
		end  
		--b1 = "+2015-07-04T00:00:00Z"
		_, _, y, m, d = string.find(b1, "(%d+)-(%d+)-(%d+)")  
	end
	a2, b2, c2 = pcall(fooA, 'time', entity, 'P582', 1) 
	if a2 == true and t.endtime == "" then i = 1
		while a2 == true and c2 == 'deprecated' do 
			i = i + 1 
			a2, b2, c2 = pcall(fooA, 'time', entity, 'P582', i) 
		end  
		--b2 = "+2015-07-05T00:00:00Z"
		_, _, y2, m2, d2 = string.find(b2, "(%d+)-(%d+)-(%d+)")
	end
	if a1 == true and t.starttime == "" then 
		if y ~= y2 then t.starttime = lang:formatDate( "j F Y", b1 ) 
		elseif m ~= m2 then t.starttime = lang:formatDate( "j F", b1 )
		else t.starttime = lang:formatDate( "j", b1 )
		end
		if wiki == "ar" then 
			if y ~= y2 then t.starttime = lang:formatDate( "d F Y", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "d F", b1 )	
			else t.starttime = lang:formatDate( "d F", b1 )
			end	end			
		if wiki == "en" then 
			if y ~= y2 then t.starttime = lang:formatDate( "F d, Y", b1 ) 		
			elseif m ~= m2 then t.starttime = lang:formatDate( "F d", b1 )	
			else t.starttime = lang:formatDate( "F d", b1 )
			end	end				
	end -- if a1
	if a2 == true and t.endtime == "" then 
		t.endtime = lang:formatDate( "j F Y", b2 ) 
		timeofrace = b2
		if wiki == "ar" then
			if y ~= y2 then t.endtime = lang:formatDate( "d F Y", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "d F Y", b2 )	
			else t.endtime = lang:formatDate( "d، Y", b2 )	
			end	end	
		if wiki == "br" then t.endtime = lang:formatDate( "j", b2 ) .." a viz ".. lang:formatDate( "F Y", b2 ) end
		if wiki == "ca" or wiki == "es" then t.endtime = lang:formatDate( "j", b2 ) .." de ".. lang:formatDate( "F", b2 ) .." de ".. lang:formatDate( "Y", b2 ) end
		if wiki == "cs" then t.endtime = lang:formatDate( "j. xg Y", b2 ) end
		if wiki == "de" or wiki == "da" or wiki == "fi" or wiki == "fo" or wiki == "no" then t.endtime = lang:formatDate( "j. F Y", b2 ) end
		if wiki == "en" then
			if y ~= y2 then t.endtime = lang:formatDate( "F d, Y", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "F d, Y", b2 )	
			else t.endtime = lang:formatDate( "d, Y", b2 )	
			end	end	
		if wiki == "eo" then t.endtime = lang:formatDate( "j", b2 ) .."-a de ".. lang:formatDate( "F Y", b2 ) end		
		if wiki == "eu" then t.endtime = lang:formatDate( "Y", b2 ) ..".eko ".. lang:formatDate( "F", b2 ) .."k ".. lang:formatDate( "j", b2 ) end
		if wiki == "hu" then t.endtime = lang:formatDate( "Y", b2 ) ..". ".. lang:formatDate( "F j", b2 ) .."." end
		if wiki == "ja" then 
			if y ~= y2 then t.endtime = lang:formatDate( "Y年m月d日", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "m月d日", b2 )	
			else t.endtime = lang:formatDate( "d日", b2 )	
			end	end	
		if wiki == "lv" then 
			if y ~= y2 then t.endtime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", b2 ) 		
			elseif m ~= m2 then t.endtime = lang:formatDate( "j. F", b2 )	
			else t.endtime = lang:formatDate( "j. F", b2 )	
			end	end
		if wiki == "pl" then 
			local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}
			t.endtime = lang:formatDate( "j ", b2 ) .. date_pl[tonumber(lang:formatDate( "n", b2 ))] .. lang:formatDate( " Y", b2 ) end				
	end -- if a2

-- This function give a format to dates when P585 (date) is used in a single day race
	a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', 1) 
	if a1 == true and t.time == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', i) 
		end  		
		t.time = func_date (b1,  'long') 
		timeofrace = b1
	end

	-- This function permits to display an unity (the kilometer) for a distance, with exceptions for macedionan, russian and japanese 
	-- that have other symbols 
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', 1) 
	if a1 == true and t.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P3157', i) 
		end   
		t.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P3157', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t.length_unit = 'km'
			if  wiki == "ar" then t.length_unit = 'كم' end
			if  wiki == "mk" then t.length_unit = 'км' end
			if  wiki == "ru" then t.length_unit = 'км' end
			if  wiki == "ja" then t.length_unit = 'キロメートル' end
		end
	end

	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', 1) 
	if a1 == true and t.length == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2043', i) 
		end   
		t.length = b1
		a1, b1, _ = pcall(fooA, 'unit', entity, 'P2043', 1)
		if b1 == "http://www.wikidata.org/entity/Q828224" then
			t.length_unit = 'km'
			if  wiki == "ar" then t.length_unit = 'كم' end
			if  wiki == "mk" then t.length_unit = 'км' end
			if  wiki == "ru" then t.length_unit = 'км' end
			if  wiki == "ja" then t.length_unit = 'キロメートル' end
		end
	end

	a, b = pcall(fooA, 'numeric-id', entity, 'P17', 1) -- This function gives countries where the race take place
	if a == true then --and ttt.country == "" then ttt.country = "Q" .. b end
		local i, v
		for i, v in pairs(entity.claims["P17"]) do
   			ttt.country[i] = "C" .. v.mainsnak.datavalue.value["numeric-id"]
   		end
 	end			
	-- Function that give the starting place of a race 
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', 1) 
	if a1 == true and t.startplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', i) 
		end   
		t.startplace = "Q" .. b1 
	end	
	-- Function that give the finishing place of a race
	a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', 1) 
	if a1 == true and t.endplace == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', i) 
		end   
		t.endplace = "Q" .. b1 
	end	
	-- This function counts the number of value for P1923 (participating teams) and give the number of team that participate at the race
    if pcall(function() 
         t.nr_teams = table.getn(entity.claims["P1923"])
         end        	
      ) then else t.nr_teams = "" end   

	-- Function that give the number of cyclists at the beginning and at the finishing of a race
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', 1) 
	if a1 == true and t.nr_participants_start == "" and t.nr_participants_end == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', i) 
		end 
		local v
		for _, v in pairs(entity.claims["P1132"]) do
			if pcall(function()
		   		if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 529711 then
				t.nr_participants_start = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
				end
			) then else t.nr_participants_start = "" end
			if pcall(function()
				if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 12769393 then
				t.nr_participants_end = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end
			end
			) then else t.nr_participants_end = "" end
		end	-- for 	
	end -- if a1

	-- This function permits to display an unity (the kilometer per hour) for an average speed, with exceptions for macedionan, russian and japanese 
	-- that have other symbols
	a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', 1) 
	if a1 == true and t.speed == "" then i = 1
		while a1 == true and c1 == 'deprecated' do 
			i = i + 1 
			a1, b1, c1 = pcall(fooA, 'amount', entity, 'P2052', i) 
		end 
		t.speed = b1
		a1, b1 = pcall(fooA, 'unit', entity, 'P2052', 1)
		if b1 == "http://www.wikidata.org/entity/Q180154" then
			t.speed_unit = 'km/h'
			if  wiki == "ar" then t.speed_unit = 'كم/س' end
		end
	end	-- if a1
 	-- This function permits to display an unity for the cost of a cycling race
	a, b = pcall(fooA, 'amount', entity, 'P2130', 1)
	if a == true and t.cost == "" then 
		t.cost = b 
		a, b = pcall(fooA, 'unit', entity, 'P2130', 1)
		if b == "http://www.wikidata.org/entity/Q4916" then t.cost_unit = '€' end	
		if b == "http://www.wikidata.org/entity/Q4917" then t.cost_unit = '$' end	
	end

	a, b = pcall(fooA, 'value', entity, 'P242', 1) -- locator map image
	if a == true and tt.map == "" then tt.map = b end
	a, b = pcall(fooA, 'numeric-id', entity, 'P155', 1) 
	if a == true and t.previous == "" then t.previous = "Q"..b end	
	a, b = pcall(fooA, 'numeric-id', entity, 'P156', 1) 
	if a == true and t.next == "" then t.next = "Q"..b end
	
	local note, qual, id, id_team
	-- By entering a value just below, the Wikipedia added will have Wikidata logos associated with cyclists in the infobox	
	if wiki == "mk" or wiki == "ja" then note = 'q' 
	else note = 'f'
	end 
	-- By entering a value just below, the Wikipedia added will show the team of the winner
	if pcall(foo3, entity, "P1346", 1, "P642", 1) then
		local k, v, vv
		for k, v in pairs(entity.claims["P1346"]) do
			id_team = '' 
			--id_team = 't26973671'
			a, b = pcall(fooC, 'numeric-id', entity, 'P1346', k, 'P54', 1)
			if a == true then id_team = 't'..b end
		
			if pcall(function() id=v.mainsnak.datavalue.value['numeric-id'] end) then else id=nil end -- id = rider id
			if id ~= nil then
				--timeofrace = "+2016-03-00T00:00:00Z" 
				-- function timeStartEnd finds the team of the rider at the time (timeofrace) of the race
				if id_team == '' and timeofrace ~= nil and timeofrace ~= '' then 
					a, b = timeStartEnd('Q'..id, 'P54', 'numeric-id', timeofrace) 
					if a == true and b ~= nil then id_team = 't' .. b end
				end
			end
--			pcall(function() id=v.mainsnak.datavalue.value['numeric-id'] end) -- rider ID
			
			-- looks into race item if the winner has a P54 statement for beeng a member of a national team 
			pcall(function() 			
				for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P54']) do 
					id_team = '2t'.. ' ('.. national_team(  'Q'..id, timeofrace, entity, 'P1346', k).. ')' 
				end
			end)

			-- looks into race item if the winner has a P642 statement for showing the type of winner (points, mountain, ..)
			pcall(function() 			
				for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P642']) do 
					qual=vv.datavalue.value['numeric-id']
					if id~=nil then
						if qual~=nil and v.rank~='deprecated' then
							if qual == 20882667 and t.first=="" then t.first=note..id t.first_team=id_team ref.first=references(entity,"P1346",k) results=true end
							if qual == 20882668 and t.second=="" then t.second=note..id t.second_team=id_team ref.second=references(entity,"P1346",k) results=true end
							if qual == 20882669 and t.third=="" then t.third=note..id t.third_team=id_team ref.third=references(entity,"P1346",k) results=true end
							if qual == 20883007 and t.winner_point=="" then t.winner_point=note..id t.winner_point_team=id_team ref.winner_point=references(entity,"P1346",k) results=true end
							if qual == 20883212 and t.winner_mountain=="" then t.winner_mountain=note..id t.winner_mountain_team=id_team ref.winner_mountain=references(entity,"P1346",k) results=true end   			
							if qual == 20883328 and t.winner_sprint=="" then t.winner_sprint=note..id t.winner_sprint_team=id_team ref.winner_sprint=references(entity,"P1346",k) results=true end
							if qual == 20883139 and t.winner_young=="" then t.winner_young=note..id t.winner_young_team=id_team ref.winner_young=references(entity,"P1346",k) results=true end  
							if qual == 20893983 and t.winner_fighting=="" then t.winner_fighting=note..id t.winner_fighting_team=id_team ref.winner_fighting=references(entity,"P1346",k) results=true end
							if qual == 27067359 and t.winner_metas_volantes=="" then t.winner_metas_volantes=note..id t.winner_metas_volantes_team=id_team ref.winner_metas_volantes=references(entity,"P1346",k) results=true end
							if qual == 27067170 and t.winner_regularity=="" then t.winner_regularity=note..id t.winner_regularity_team=id_team ref.winner_regularity=references(entity,"P1346",k) results=true end
							if qual == 20893979 and t.winner_combination=="" then t.winner_combination=note..id t.winner_combination_team=id_team ref.winner_combination=references(entity,"P1346",k) results=true end
							if qual == 27907715 and t.winner_fuga_pinarello=="" then t.winner_fuga_pinarello=note..id t.winner_fuga_pinarello_team=id_team ref.winner_fuga_pinarello=references(entity,"P1346",k) results=true end
							if qual == 27907747 and t.winner_azzurri_ditalia=="" then t.winner_azzurri_ditalia=note..id t.winner_azzurri_ditalia_team=id_team ref.winner_azzurri_ditalia=references(entity,"P1346",k) results=true end
							if qual == 20882921 and t.winner_team == "" then
								a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( 'Q'..id ), 'P31', 1)
								if a == true and (b == 20738667 or b == 23726798) then -- test if 'national cycling team U23' or 'national cycling team'
									t.winner_team = '2t' .." "..national_team('Q'..id, timeofrace, entity, 'P1346', k)
								else
									t.winner_team = note .. id ref.winner_team=references(entity,"P1346",k) results = true
								end
							end
							if qual == 27104269 and t.winner_team_points == "" then t.winner_team_points = note .. id ref.winner_team_points=references(entity,"P1346",k) results = true end
						end
					else
						a, b = pcall(fooC, 'numeric-id', entity, 'P1346', k, 'P828', 1)		-- "has cause" (P828) to be nil?
						c, d = pcall(fooC, 'numeric-id', entity, 'P1346', k, 'P1013', 1)	-- "criterion used"(P1013) to be nil?
						if qual~=nil and a == true and b == 1229261							-- has cause:disqualification
						and c == true and d == 45123627 then								-- criterion used:declared deserted
							if qual == 20882667 and t.first=="" then t.first=note..d results=true end
							if qual == 20882668 and t.second=="" then t.second=note..d results=true end
							if qual == 20882669 and t.third=="" then t.third=note..d results=true end
							if qual == 20883007 and t.winner_point=="" then t.winner_point=note..d results=true end
							if qual == 20883212 and t.winner_mountain=="" then t.winner_mountain=note..d results=true end
							if qual == 20883328 and t.winner_sprint=="" then t.winner_sprint=note..d results=true end
							if qual == 20883139 and t.winner_young=="" then t.winner_young=note..d results=true end
							if qual == 20893983 and t.winner_fighting=="" then t.winner_fighting=note..d results=true end
							if qual == 27067359 and t.winner_metas_volantes=="" then t.winner_metas_volantes=note..d results=true end
							if qual == 27067170 and t.winner_regularity=="" then t.winner_regularity=note..d results=true end
							if qual == 20893979 and t.winner_combination=="" then t.winner_combination=note..d results=true end
							if qual == 27907715 and t.winner_fuga_pinarello=="" then t.winner_fuga_pinarello=note..d results=true end
							if qual == 27907747 and t.winner_azzurri_ditalia=="" then t.winner_azzurri_ditalia=note..d results=true end
							if qual == 20882921 and t.winner_team=="" then t.winner_team=note..d results=true end
							if qual == 27104269 and t.winner_team_points=="" then t.winner_team_points=note..d results=true end
			 			end 
			 		end
				end -- for _, vv
			end) 
		end	-- for
	end  -- end if pcall

	-- code for references
	local list = {} -- list[1][1] = value from ref.first, list [1][2] = 'first'
	local k
	for k in pairs(ref) do 
		if ref[k]~='' then table.insert(list, {ref[k], k}) end 
	end
	local w, ww 	
	num = #list
	for w=num,1,-1 do
		for ww=1,w do
			if w ~= ww then 
				if list[w][1] == list[ww][1] then list[w][1] = frame:extensionTag{name='ref', args={name=entityId..ww}} break end	
			else list[w][1] = frame:extensionTag{name='ref', content=list[w][1], args={name=entityId..ww}} end 
		end
	end
	for i=1,num do 
		ref[ list[i][2] ] = list[i][1] --list[num+1-i][1] 
	end

	-- transform Q/q-number into flag / WPlink / WDlink
	local k
	local team = true
	local wd = " [[File:Wikidata-logo S.svg|24px|link=d:"	

	for k in pairs(ttt) do -- "^C" ttt.country, "^T" ttt.tour
		if ttt[k][1]~=nil and string.find(ttt[k][1], "^C") then for i=1,#ttt[k] do ttt[k][i] = string.gsub(ttt[k][i], "C", "Q") ttt[k][i] = flag(ttt[k][i], timeofrace).." ".. WPlink( ttt[k][i] ) end end
		if ttt[k][1]~=nil and string.find(ttt[k][1], "^T") then for i=1,#ttt[k] do ttt[k][i] = string.gsub(ttt[k][i], "T", "Q") ttt[k][i] = WPlink( ttt[k][i], 'race') end end
	end	
	for k in pairs(t) do 
		if string.find(t[k], "^Q") then --t[k], k = startplace, endplace, ... find variables with an item as value
			if pcall(foo1, t[k]) then t[k] = WPlink( t[k] )	end
		end
		if string.find(t[k], "^q") then -- find variables with an item as value (in section Résultats)
			t[k] = mw.ustring.upper( t[k] )
			--look into P27 (country of citizenship) to get the Qnumber of that country
			a, b = timeStartEnd(t[k], "P27", 'numeric-id', timeofrace)
			if a == true and pcall(foo1, t[k]) then t[k] = flag('Q'..b, timeofrace).." "..WPlink( t[k] )..ref[k]..wd..t[k].."]]"
			else
				--look into P17 (country) to get the Qnumber of that country
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( t[k] ), 'P17', 1)
				if a == true and pcall(foo1, t[k]) then t[k] = flag("Q"..b, timeofrace).." "..WPlink( t[k] )..ref[k]..wd..t[k].."]]" end
			end
		end
		if string.find(t[k], "^f") then -- no WDitem, frWP
			t[k] = string.gsub(t[k], "f", "Q")
			--look into P27 (country of citizenship) to get the Qnumber of that country
			a, b = timeStartEnd(t[k], "P27", 'numeric-id', timeofrace)
			if a == true and pcall(foo1, t[k]) then t[k] = flag('Q'..b, timeofrace).." "..WPlink( t[k] )..ref[k]
			else	
				--look into P17 (country) to get the Qnumber of that country
				a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( t[k] ), 'P17', 1)
				if a == true and pcall(foo1, t[k]) then t[k] = flag("Q"..b, timeofrace).." "..WPlink( t[k], 'team', timeofrace )..ref[k] else t[k] = WPlink( t[k], 'team', timeofrace )..ref[k] end
			end
		end	
		if string.find(t[k], "^c") then -- find "class"-items, first asci = "c"
			t[k] = string.gsub(t[k], "c", "Q")
			if pcall(foo1, t[k]) then t[k] = WPlink( t[k], "Q22348500" ) end
		end
		if string.find(t[k], "^t") then 
			t[k] = string.gsub(t[k], "t", "Q")
			--timeofrace = "+2008-04-09T00:00:00Z"
			if pcall(foo1, t[k]) then t[k] = " (" .. WPlink( t[k], 'team', timeofrace ) .. ")" end
		end
		if string.find(t[k], "^2t") then t[k] = string.gsub(t[k], "2t", "") end		
	end

    --local nl ="&#10;"
    -- local tooltip = infobox_bottom(2) .. nl .. mw.text.encode( property(1) .. ' (P393)' ) .. nl .. mw.text.encode( property(2) ..' (P17)')
    
	local miles
	local miles_h
    if t.length ~= "" then 
		if wiki == 'en' then  -- To show distance in kilometers and miles
			miles = math.modf(10*t.length/1.609344)/10
			miles = lang:formatNum(tonumber(miles)) -- formats t_g.miles in the way it is done in the local Wiki
		end
		t.length, _ = string.gsub(t.length, "[+]", "") -- delets "+" sign from t.length 
    	t.length = lang:formatNum(tonumber(t.length)) -- formats t.length in the way it is done in the local Wiki
    	if wiki == 'fo' then t.length = string.gsub(t.length, "%.", ",") end
    end
    if t.speed ~= "" then 
		if wiki == 'en' then  -- To show speed in kilometers per hour and miles per hour
			miles_h = math.modf(1000*t.speed/1.609344)/1000
			miles_h = lang:formatNum(tonumber(miles_h)) -- formats t_g.miles in the way it is done in the local Wiki
		end
    	t.speed, _ = string.gsub(t.speed, "[+]", "")
    	t.speed = lang:formatNum(tonumber(t.speed))
    	if wiki == 'fo' then t.speed = string.gsub(t.speed, "%.", ",") end
    end
	
    if t.cost ~= "" then 
    	t.cost, _ = string.gsub(t.cost, "[+]", "")
    	t.cost = lang:formatNum(tonumber(t.cost))
    	if wiki == 'fo' then t.cost = string.gsub(t.cost, "%.", ",") end
    end
    
   	local span1, span2 = "<span style='color:#3366CC'>&#x25C0; </span>", "<span style='color:#3366CC'> &#x25B6;</span>"
    local k = t.previous
	local i, _ = string.find(k, "|")
	local j, _ = string.find(k, "]")
	if i ~= nil and j ~= nil then 
		t.previous = string.sub(k, 1, i) .. span1 .. (string.match(string.sub(k, i+1, j-1), "%d%d%d%d") or '') .. string.sub(k, j) 
	else 
		if string.find(k, "%d%d%d%d") == nil then t.previous = '' else t.previous = string.sub(k, string.find(k, "%d%d%d%d")) end
		if t.previous ~= "" then t.previous = span1 .. t.previous end 
	end

	k = t.next
	i, _ = string.find(k, "|")
	j, _ = string.find(k, "]")
	if i ~= nil and j ~= nil then 
		t.next = string.sub(k, 1, i) .. (string.match(string.sub(k, i+1, j-1), "%d%d%d%d") or '') .. span2 .. string.sub(k,j) 
	else 
		if string.find(k, "%d%d%d%d") == nil then t.next = "" else t.next = string.sub(k, string.find(k, "%d%d%d%d")) end
		if t.next ~= "" then t.next = t.next .. span2 end 
	end

	tt.caption = string.gsub(tt.caption, "{{(%w+)}}", function (n) return frame:expandTemplate{ title = n }  end)
	-- for overwriting Wikidata content with data in Wikipedia articles. numbers are from function infobox_translate
	local z = {stage=5, date=6, dates=7, length=8, startplace=11, endplace=12, nr_teams=13, nr_participants_start=14, nr_participants_end=15, 
	speed=16, cost=17, first=19, second=20, third=21, winner_point=22, winner_mountain=23, winner_sprint=24, winner_young=25, winner_fighting=26, 
	winner_combination=27, winner_team=28, winner_team_points=37, winner_metas_volantes=35, winner_regularity=36, winner_fuga_pinarello=38,
	winner_azzurri_ditalia=39}
	
	local i, k, s
	for i,k in pairs(z) do
		s = localFrame.args[mw.ustring.gsub(infobox_translate(k), "&#173;", "")] -- filter soft hyphen out
		if s~="" and s~=nil then
			t[i] = s
			if i=="length" then t.length_unit="" end
			if i=="speed" then t.speed_unit="" end
			if i=="cost" then t.cost_unit="" end
		else
			if k>=19 and k<=27 then t[i] = t[i].. t[i..'_team'] end
			if k>=35 and k<=36 then t[i] = t[i].. t[i..'_team'] end
			if k>=38 and k<=39 then t[i] = t[i].. t[i..'_team'] end
		end
	end

	if localFrame.args[infobox_translate(32)]~="" and localFrame.args[infobox_translate(32)]~=nil then
	i, k = string.find(localFrame.args[infobox_translate(32)] , ":")
		tttt.special_1a = string.sub(localFrame.args[infobox_translate(32)], 1, i-1)
		tttt.special_1b = string.sub(localFrame.args[infobox_translate(32)], k+1)
	end
	if localFrame.args[infobox_translate(33)]~="" and localFrame.args[infobox_translate(33)]~=nil then
	i, k = string.find(localFrame.args[infobox_translate(33)] , ":")
		tttt.special_2a = string.sub(localFrame.args[infobox_translate(33)], 1, i-1)
		tttt.special_2b = string.sub(localFrame.args[infobox_translate(33)], k+1)
	end

	if wiki == "fi" then
		if t.starttime ~= "" then t.starttime = mw.ustring.gsub(t.starttime, "%a+", "%0ta") end
		if t.endtime ~= "" then t.endtime = mw.ustring.gsub(t.endtime, "%a+", "%0ta") end
		if t.time ~= "" then t.time = mw.ustring.gsub(t.time, "%a+", "%0ta") end
	end

 	tab = "<table cellpadding='4' cellspacing='0' style='float:"..floatinfobox.."; width:300px; border:1px solid rgb(200,200,200);"
    tab = tab .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px; clear:left; "
    tab = tab .. "text-align:" .. textalign .. "; font-size:85%; line-height:1.6em;'>"
	if wiki == "eo" then tab = "<table style='width:23em; border:1px solid rgb(200,200,200);"
    	tab = tab .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px;"
    	tab = tab .. "text-align:" .. textalign .. "; font-size:85%; line-height:1.6em;' class='infobox' >"
    end
	tab = tab .. "<tr><td colspan='2' style='border-bottom:5px solid white; font-size:175%; background:#FFDF80; text-align:center'>"
	tab = tab .. "<table style='width:100%'><tr><td>" .. tt.name .."</td><td>" .. tt.icon .. "</td></tr></table></td></tr>"
	if tt.picture ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. tt.picture .."|center|300px]]</td></tr>" end
	if tt.picture ~= "" and tt.caption ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center; font-size:80%'>"..tt.caption.."</td></tr>" end
	tab = tab .. "<tr><td colspan='2' style='background-color:#FFDF80; text-align:center'>'''"..infobox_translate(1).."'''</td></tr>"
	if tt.nr ~= "" and t.is_a ~= "" then tab = tab.."<tr><td style='width:40%'>'''"..infobox_translate(2).."'''</td><td>" .. tt.nr .. " " .. t.is_a .. "</td></tr>" end
	if ttt.tour[1] ~= nil then tab = tab.."<tr><td style= 'vertical-align:top'>'''"
		if #ttt.tour == 1 then tab = tab..infobox_translate(3).."'''</td><td>" else tab = tab..infobox_translate(4).."'''</td><td>" end	
		for i=1,#ttt.tour do tab = tab .. ttt.tour[i] if i == 1 then tab = tab .. " " ..t.class end tab = tab .. "<br>" end
		tab = tab.."</td></tr>" end		
	if t.stage ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(5).."'''</td><td>" .. t.stage.."</td></tr>" end	
	if (t.starttime~="" or t.endtime~="") and t.date=="" and t.dates=="" then tab = tab.."<tr><td>'''"..infobox_translate(7).."'''</td><td>" .. t.starttime.." – " ..t.endtime .."</td></tr>" end
	--if t.endtime ~= "" then tab = tab.."<tr><td>".."Date de fin".."</td><td>" .. t.endtime .. "</td></tr>" end	
	if t.time~="" and t.date=="" and t.dates=="" then tab = tab.."<tr><td>'''"..infobox_translate(6).."'''</td><td>" .. t.time.."</td></tr>" end	
	if t.date~="" then tab = tab.."<tr><td>'''"..infobox_translate(6).."'''</td><td>" .. t.date.."</td></tr>" end
	if t.dates~="" then tab = tab.."<tr><td>'''"..infobox_translate(7).."'''</td><td>" .. t.dates.."</td></tr>" end	
	if wiki ~= 'en' then --As default show only kilometers, but if 'en.wiki' show kilometers and miles
		if t.length ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(8).."'''</td><td>" .. t.length.." "..t.length_unit.."</td></tr>" end	
	else
		if t.length ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(8).."'''</td><td>" .. t.length.." "..t.length_unit.." ("..miles.." mi)".."</td></tr>" end	
	end	
	if ttt.country[1] ~= nil then tab = tab.."<tr><td style= 'vertical-align:top'>'''"
		if #ttt.country == 1 then tab = tab..infobox_translate(9).."'''</td><td>" else tab = tab..infobox_translate(10).."'''</td><td>" end
		for i=1,#ttt.country-1 do tab = tab .. ttt.country[i].."<br>" end tab = tab .. ttt.country[#ttt.country].."</td></tr>" end	
	if t.startplace ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(11).."'''</td><td>" .. t.startplace .. "</td></tr>" end	
	if t.endplace ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(12).."'''</td><td>" .. t.endplace .. "</td></tr>" end
	if t.nr_teams ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(13).."'''</td><td>" .. t.nr_teams .. "</td></tr>" end
	if t.nr_participants_start ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(14).."'''</td><td>" .. t.nr_participants_start .. "</td></tr>" end
	if t.nr_participants_end ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(15).."'''</td><td>" .. t.nr_participants_end .. "</td></tr>" end	
	if wiki ~= 'en' then --As default show only kilometers/hour, but if 'en.wiki' show kilometers/hour and miles/hour
		if t.speed ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(16).."'''</td><td>" .. t.speed .. " "..t.speed_unit.."</td></tr>" end	
	else
		if t.speed ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(16).."'''</td><td>" .. t.speed .. " "..t.speed_unit.." ("..miles_h.." mi/h)".."</td></tr>" end
	end
	if t.cost ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(17).."'''</td><td>" .. t.cost .. " "..t.cost_unit.. "</td></tr>" end	
	if tttt.special_1a ~= "" then tab = tab.."<tr><td>'''"..tttt.special_1a.."'''</td><td>" .. tttt.special_1b.. "</td></tr>" end	
	if tttt.special_2a ~= "" then tab = tab.."<tr><td>'''"..tttt.special_2a.."'''</td><td>" .. tttt.special_2b.. "</td></tr>" end
	
	if results then tab = tab.."<tr><td colspan='2' style='border-bottom:5px solid white; background-color:#FFDF80; text-align:center'>'''"..infobox_translate(18).."'''</td></tr>" end
	if t.first ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(19).."'''</td><td>" .. t.first .. "</td></tr>" end
	if t.second ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(20).."'''</td><td>" .. t.second .. "</td></tr>" end
	if t.third ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(21).."'''</td><td>" .. t.third .. "</td></tr>" end
	if t.winner_point ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(22).."'''</td><td>" .. t.winner_point .. "</td></tr>" end
	if t.winner_mountain ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(23).."'''</td><td>" .. t.winner_mountain .. "</td></tr>" end
	if t.winner_sprint ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(24).."'''</td><td>" .. t.winner_sprint .. "</td></tr>" end
	if t.winner_young ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(25).."'''</td><td>" .. t.winner_young .. "</td></tr>" end
	if t.winner_fighting ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(26).."'''</td><td>" .. t.winner_fighting .. "</td></tr>" end
	if t.winner_metas_volantes ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(35).."'''</td><td>" .. t.winner_metas_volantes .. "</td></tr>" end
	if t.winner_regularity ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(36).."'''</td><td>" .. t.winner_regularity .. "</td></tr>" end
	if t.winner_fuga_pinarello ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(38).."'''</td><td>" .. t.winner_fuga_pinarello .. "</td></tr>" end
	if t.winner_azzurri_ditalia ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(39).."'''</td><td>" .. t.winner_azzurri_ditalia .. "</td></tr>" end
	if t.winner_combination ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(27).."'''</td><td>" .. t.winner_combination .. "</td></tr>" end
	if t.winner_team ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(28).."'''</td><td>" .. t.winner_team .. "</td></tr>" end
	if t.winner_team_points ~= "" then tab = tab.."<tr><td>'''"..infobox_translate(37).."'''</td><td>" .. t.winner_team_points .. "</td></tr>" end
	if tt.map ~= "" then tab = tab .. "<tr><td colspan='2' style='text-align:center'>".." [[File:".. tt.map .."|center|300px]]".."</td></tr>" end
	
	tab = tab.."<tr><td style='text-align:right'>"..t.previous.."</td><td style='text-align:left'>" .. t.next .. "</td></tr>"
	local s = "d:Wikidata:WikiProject Cycling/Documentation/infobox"
	tab = tab .. "<tr><td colspan='2' style='text-align:left; border-top:3px solid #FFDF80; font-size:75%'>" .. "[[" .. s .. "|" .. infobox_translate(34) .. "]] [[File:Wikidata-logo S.svg|24px|link=d:".. frame.args[1]  .. "]]" --infobox_bottom(1) 
	--tab = tab .. "<span style='float:right' title='".. tooltip .. "'>[[File:High-contrast-help-browser.svg|10px|right|link=]]</span>"	
	tab = tab .. "</td></tr>"
	tab= tab.."</table>"
	return tab
end

function national_team(riderID, startOfSeason, entity, property, k)
	-- property: statement where the rider is the value
	-- k: loop
	local national_team, team, nationality, teamID
	-- national team for U23 or older riders
	if pcall(function()
		local i,j, s 
		for _, v in pairs(entity.claims[property][k].qualifiers['P54']) do -- for property 'member of sports team'
			teamID = 'Q'.. v.datavalue.value['numeric-id'] break
		end
	
		national_team = mw.wikibase.getEntity( teamID )
		-- calculate s for national team item
		a, b = pcall(fooA, 'numeric-id', national_team, 'P31', 1) -- test if country
		if a == true and b == 20738667 then -- Q20738667 = national cycling team U23
			if wiki == 'fr' then s =  ' espoirs' else s = ' U23' end
			if wiki == 'mk' then s = ' под 23 години' end
			if wiki == 'ar' then s = ' تحت 23' end
		elseif a == true and (b == 1194951 or b == 23726798) then s = '' end 
			-- Q1194951 = national sports team, Q23726798 = national cycling team
	
		a, b = timeStartEnd(riderID, "P27", 'numeric-id', startOfSeason)
		if a == true then
			local nation = mw.wikibase.getEntityObject( 'Q'..b )
			nationality = nation:getLabel('ar') or nation:getLabel('en') .. ' (en)'
			if national_team:getSitelink() == nil then
				team = nationality.. s
			else
				team = "[[".. national_team:getSitelink().. "|".. nationality.. s.. ']]'
			end
		end

		a, b = timeStartEnd(riderID, "P17", 'numeric-id', startOfSeason)
		if a == true then --team = 'abc'.. b --riderID
			local nation = mw.wikibase.getEntityObject( 'Q'..b )
			nationality = nation:getLabel('ar') or nation:getLabel('en') .. ' (en)'
			if national_team:getSitelink() == nil then
				team = nationality.. s
			else
				team = "[[".. national_team:getSitelink().. "|".. nationality.. s.. ']]'
			end	
		end
	end) then 
	else 
		--standard team
		pcall(function()
		a, b = timeStartEnd(riderID, 'P54', 'numeric-id', startOfSeason)
		if a == true then
			national_team = mw.wikibase.getEntity( 'Q'..b )
	--		g.team[rank] = national_team:getLabel('ar') or g.country[rank].. s
			team = WPlink('Q'..b, 'team', startOfSeason)
		end
		-- guest team
		if teamID ~= nil then team = WPlink(teamID, 'team') end
		end)
	end
	
	return team
end

function func_date (date, mode)
	--	local date = '+2016-05-20'
	--	local mode = 'small'
	local function standard(datum) 
		if mode=='long' then return mw.language.getContentLanguage():formatDate("j F Y", datum) end 
		if mode=='small' then return mw.language.getContentLanguage():formatDate("j M", datum) end 	
		if mode=='onlyday' then return mw.language.getContentLanguage():formatDate("j", datum) end
	end
	local function ar(datum) 
		local lang = mw.getLanguage('ar') 
		if mode=='long' then return mw.getLanguage('ar'):formatDate("d F Y", datum) end 
		if mode=='small' then return mw.getLanguage('ar'):formatDate("d F", datum) end	
		if mode=='onlyday' then return mw.getLanguage('ar'):formatDate("d", datum) end
		end
	local function br(datum) 
		local lang = mw.getLanguage('br') 
		if mode=='long' then return lang:formatDate("j", datum ) .." a viz ".. lang:formatDate("F Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum ) .." a viz ".. lang:formatDate("M", datum) end 
		if mode=='onlyday' then return lang:formatDate("j", datum ) end 
	end	
	local function ca(datum, language) 
		local lang = mw.getLanguage(language) 
		if mode=='long' then return lang:formatDate("j", datum) .." de ".. lang:formatDate("F", datum) .." de ".. lang:formatDate("Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum) .." de ".. lang:formatDate("M", datum) end 
		if mode=='onlyday' then return lang:formatDate("j", datum) end 
	end
	local function cs(datum)
		local lang = mw.getLanguage('cs') 		
		if mode=='long' then return lang:formatDate("j. xg Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum)  ..". xg ".. lang:formatDate("M", datum) end 
		if mode=='onlyday' then return lang:formatDate("j", datum) end 	
	end
	local function de(datum, language) 
		if mode=='long' then return mw.getLanguage(language):formatDate("j. F Y", datum) end 
		if mode=='small' then return mw.getLanguage(language):formatDate("j. M", datum) end 
		if mode=='onlyday' then return mw.getLanguage(language):formatDate("j.", datum) end 
	end		
	local function eo(datum) 
		local lang = mw.getLanguage('eo') 
		if mode=='long' then return lang:formatDate("j", datum) .."-a de ".. lang:formatDate("F Y", datum) end 
		if mode=='small' then return lang:formatDate("j", datum) .."-a de ".. lang:formatDate("M", datum) end 
		if mode=='onlyday' then return lang:formatDate("j", datum) end 
	end	
	local function en(datum) 
		if mode=='long' then return mw.getLanguage('en'):formatDate("F d, Y", datum) end 
		if mode=='small' then return mw.getLanguage('en'):formatDate("M d", datum) end 	
		if mode=='onlyday' then return mw.getLanguage('en'):formatDate("d", datum) end 	
		end
	local function eu(datum) 
		local lang = mw.getLanguage('eu') 
		if mode=='long' then return lang:formatDate( "Y", datum) ..".eko ".. lang:formatDate("F", datum) .."k ".. lang:formatDate("j", datum) end 
		if mode=='small' then return lang:formatDate( "M", datum) .."k ".. lang:formatDate("j", datum) end 	
		if mode=='onlyday' then return lang:formatDate("j", datum) end 	
	end
	local function fi(datum) -- may be different
		if mode=='long' then return mw.ustring.gsub(mw.getLanguage('fi'):formatDate("j. F Y", date), "%a+", "%0ta") end 
		if mode=='small' then return mw.getLanguage('fi'):formatDate("j. M", date) end
		if mode=='onlyday' then return mw.getLanguage('fi'):formatDate("j.", date) end
	end 
	local function hu(datum) 
		local lang = mw.getLanguage('hu') 
		if mode=='long' then return lang:formatDate( "Y", datum) ..". ".. lang:formatDate("F", datum) .." ".. lang:formatDate("j", datum)..". " end
		if mode=='small' then return lang:formatDate( "M", datum) ..". ".. lang:formatDate("j", datum) end 
		if mode=='onlyday' then return lang:formatDate("j", datum) end 
	end
	local function ja(datum) 
		if mode=='long' then return mw.getLanguage('ja'):formatDate("Y年m月d日", datum) end 
		if mode=='small' then return mw.getLanguage('ja'):formatDate("m月d日", datum) end	
		if mode=='onlyday' then return mw.getLanguage('ja'):formatDate("d日", datum) end	
	end	
	local function lv(datum)
		local lang = mw.getLanguage('lv') 
		if mode=='long' then return lang:formatDate("Y.", datum)  .." gada ".. lang:formatDate("j. F", datum) end 
		if mode=='small' then return lang:formatDate("j. M", datum) end
		if mode=='onlyday' then return lang:formatDate("j.", datum) end 
	end 	
	local function pl(datum) 
		local lang = mw.getLanguage('pl') 
		local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}
		if mode=='long' then return lang:formatDate("j ", datum) .. date_pl[tonumber(lang:formatDate("n", datum))] .. lang:formatDate(" Y", datum) end 
		if mode=='small' then return lang:formatDate("j M", datum) end 	
		if mode=='onlyday' then return lang:formatDate("j", datum) end 	
	end		

	local x = {['']=standard(date), ['ar']=ar(date),  ['br']=br(date), ['ca']=ca(date,'ca'), ['cs']=cs(date), ['da']=de(date,'da'), ['de']=de(date,'de'), ['en']=en(date), ['eo']=eo(date), 
		['es']=ca(date,'es'), ['eu']=eu(date), ['fi']=fi(date), ['fo']=de(date,'fo'), ['hu']=hu(date), ['ja']=ja(date), ['lv']=lv(date), ['no']=de(date,'no'), ['pl']=pl(date)}

	return x[wiki] or x['']
end

function p.teamroster(frame)
	local formatter = require ('Module:ملعب/Mr. Ibrahem/teamroster')
	local fun = formatter['teamroster']
	return fun(frame)
end

function timeStartEnd(Qid, property, mode, timeofrace)
	-- mode = 'numeric-id', property = 'P54', Qid = 'Q123'
	local entity = 	mw.wikibase.getEntity(Qid)
	local a, b = pcall(fooA, mode, entity, property, 1)
	local starttime, endtime
	local available_lang_priority = available_lang_priority
	
	if a == true then
		local timeStartEnd = {}
		local num = 1
		local v
		for _, v in pairs(entity.claims[property]) do
			if pcall(function () local test = v.mainsnak.datavalue.value[mode] end) then -- test if not 'unnown value' 
				if pcall(function () starttime = v.qualifiers["P580"][1].datavalue.value.time end) then
	   				starttime = v.qualifiers["P580"][1].datavalue.value.time
					local _,_,year,m,d = string.find(starttime,"(%d+)-(%d+)-(%d+)")
					if m == '00' and d == '00' then starttime = '+'..year..'-01-01T00:00:00Z' end
				end
				if pcall(function () endtime = v.qualifiers["P582"][1].datavalue.value.time end) then
					endtime = v.qualifiers["P582"][1].datavalue.value.time
					local _,_,year,m,d = string.find(endtime,"(%d+)-(%d+)-(%d+)")
					if m == '00' and d == '00' then endtime = '+'..year..'-12-31T00:00:00Z' end
					if m == '01' and d == '01' then endtime = '+'..year..'-12-31T00:00:00Z' end
				end
	  			if v.qualifiers then
	 				if (not v.qualifiers["P580"] or starttime <= timeofrace)
	 					and
	 					(not v.qualifiers["P582"] or endtime >= timeofrace)
	 				then
	 					if available_lang_priority == true and property == "P1448" then
	 						local test = false
							pcall(function () if type( v.qualifiers["P1448"])=='table' then test=true end end)
							if test == false then
								timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
							else
								local lang_module, lang_WD
								local language= ''
								local zaehler
								for i,j in ipairs(translations.lang_priority) do
										lang_module = j
										for number in pairs(v.qualifiers["P1448"]) do
											lang_WD = v.qualifiers["P1448"][number].datavalue.value.language
											if lang_WD == lang_module then zaehler = number break end
										end -- for number in pairs
									if lang_WD == lang_module then language = lang_WD   break end
									end -- for i,j
								if language~='' then -- a WD translation matching translations.lang_priority exist
										local t = v.qualifiers["P1448"][zaehler].datavalue.value.text
										timeStartEnd[num] = t
		 							else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]--  no matching between lang module and "official name" qualifier
									end -- if language~=''
							end --  test if official name qualifier exist
	 					else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
						end -- if property == "P1448"
	  					num = num + 1
	 				end
	 			else
	 				timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
	 				num = num + 1
	 			end
			end
	 	end
		return a, timeStartEnd[1]
	else return false, '' end
end

function black_list(wiki, Label)
	-- List of Wikipedia articles with the same lemma as the non existing rider article. Those lemmas are printed as text "black" in the tables, 
	-- not "blue" or "red". This way there will be no false wikilinks at the WhatLinksHere entry. List should be updated maybe once a year. 
	local black_list = {}
	if wiki=='de' then black_list={ ["Ryan Anderson"]=true, ["Chris Butler"]=true, ["Josef Černý"]=true, ["Brad Evans"]=true, ["Robert Fontaine"]=true, 
		["Carlos Giménez"]=true, ["George Harper"]=true, ["Mathias Jørgensen"]=true, ["Luis Lemus"]=true, ["David Lozano"]=true, ["Jan Maas"]=true, 
		["James McLaughlin"]=true, ["Nikolaj Michajlow"]=true, ["Antonio Molina"]=true, ["Ben O'Connor"]=true, ["Andrea Peron"]=true, ["Cristian Rodríguez"]=true, 
		["Nick Schultz"]=true, ["Adam Stachowiak"]=true, ["Michel Vermote"]=true, ["Johannes Weber"]=true, ["Martin Weiss"]=true, ["Christopher Williams"]=true, 
		["Samuel Williams"]=true, ["Peter Williams"]=true, ['Stephen Williams']=true, ["Michael Woods"]=true, ["Michael Wright"] = true, ["Edoardo Zardini"]=true, 
		["Georg Zimmermann"]=true } end
	if wiki=='en' then black_list={ ["Tiago da Silva"]=true, ["Jan Maas"]=true, ["Alexander Meier"]=true, ["James McLaughlin"]=true, ["Andrea Nencini"]=true, 
		["Johannes Weber"]=true } end
	if wiki=='fr' then black_list={['Pierre Barbier']=true, ['Jessica Cutler']=true, ['Fernanda da Silva']=true, ['Guillaume Delvaux']=true, ['Willy De Waele']=true, 
		['Jules Dubois']=true, ['Jean Dupont']=true, ['Robert Fontaine']=true, ['René Fournier']=true, ['Pierre Gauthier']=true, ['Marc Goossens']=true, 
		['Claude Guyot']=true, ['Amy Hill']=true, ['Liang Hongyu']=true, ['Marcus Johansson']=true, ['Mathias Jørgensen']=true, ['José Mendoza']=true, 
		['Daniel Müller']=true, ['Henri Parmentier']=true, ['Jean Raynal']=true, ['Pascal Robert']=true, ['Jean-Yves Roy']=true, ['Michael Shermer']=true, 
		['Juris Silovs']=true, ['Jacques Simon']=true, ['Guy Thomas']=true, ['Ryan Thomas']=true, ['Hans Vonk']=true, ['Jan Wijnants']=true } end
	return black_list[Label]
end

function WPlink(Qnumber, ...) 
	local link=''
	local entity = mw.wikibase.getEntity( Qnumber )
	local Sitelink = entity:getSitelink() -- link to WParticle
	local Sitelink2 = Sitelink
	local Label = entity:getLabel('ar') or ''
	local Label_fr = entity:getLabel( 'fr' ) or ''
	local a, b
	local official_name = ""
	
	if arg[1] == nil then 	
		if pcall(foo1, Qnumber) then 
			if Sitelink ~= nil then 
				if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia"
					if Sitelink~=nil then
						local i, _ = mw.ustring.find(Sitelink, ",")
						if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink, 1, i-1) end
					end
				end
				link = "[[" .. Sitelink .. "|" .. mw.text.trim(mw.ustring.gsub(Sitelink2, "%b()", "")..' ') .. "]]"	
				if wiki == "de" then -- ru riders get label as alias, to shorten the name
					local a, b = pcall(fooA, 'numeric-id', entity, 'P27', 1) 
					if a == true and (b==159 or b==184 or b==212 or b==232) then link = "[[" .. Sitelink .. "|" .. Label .. "]]" end
				end
			elseif Label ~= '' then 
				if wiki == 'ar' then
					local title = mw.title.new(Label)
					if title and title.exists 
						then link = Label 
				else link = mw.getCurrentFrame():expandTemplate{ title = 'Ill-WD2', args = {id=Qnumber,target='en',label=Label } }--"[[" .. Label.. "]]" 
					end
					
				else
					if black_list(wiki, Label) == true then 
						link = Label -- function black_list: articles that are printed as text, not wikilinks
					else -- detect if there is a different local article with the same name
						local title = mw.title.new(Label)
						if title and title.exists then link = Label else link = "[[" .. Label.. "]]" end
					end
				end
			else link = Label end 
		else return "unknown ID in function WPlink" end
	if link == '' then 
			link = entity:getLabel('fr') or entity:getLabel('en') or entity:getLabel('de') or ''
			if wiki == "ar" then link = entity:getLabel('ar') or entity:getLabel('en') or entity:getLabel('fr') or entity:getLabel('de') or '' end
			if link ~= '' then link = mw.ustring.gsub(link, "%b()", "")
			else link =  "(label missing)" end  
		end
	end -- if arg[1] == nil
	if arg[1] == 'team' then -- add '(team of the winner)'
		a, b = timeStartEnd(Qnumber, 'P1448', 'text', arg[2]) --officialName(entity) 
		local a1, b1 = pcall(fooA, 'numeric-id', entity, 'P361', 1)
		if a1== true then 
			local a2, b2 = timeStartEnd('Q'..b1, 'P1448', 'text', arg[2]) 
			if a2== true then a = a2 b = b2	end
			entity = mw.wikibase.getEntity( 'Q'..b1 ) 
			Sitelink2 = entity:getSitelink() -- link to WParticle		
		end
		if a == true then official_name = b end
		
		if available_lang_priority == false then
			a, b = pcall(fooA, 'text', entity, 'P1448', 2) -- test if more then two official names
			if a == true then
				a, b = timeStartEnd(Qnumber, 'P1448', 'text', arg[2]) --officialName(entity) 
				if a == true then official_name = b end
			else
				a, b = pcall(fooA, 'text', entity, 'P1448', 1) 
				if a == true then official_name = b end	
			end
		end
				
		if Sitelink ~= nil then 
			if official_name == nil then 
				link = "[[".. Sitelink.. "|".. mw.text.trim(mw.ustring.gsub(Sitelink,"%b()","").. ' ') .. "]]" 
			else
				if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia"
					local i, _ = mw.ustring.find(Sitelink, ",")
					if i ~= nil then Sitelink = mw.ustring.sub(Sitelink, 1, i-1) end
				end
				link = link .. '[['.. Sitelink.. "|".. official_name.. ']]'
			end
		end
		if link == '' and Sitelink2 ~= nil then -- code goes from season item to team item
			if official_name == nil or official_name == '' then
				link = "[[".. Sitelink2.. "|".. mw.text.trim(mw.ustring.gsub(Sitelink2,"%b()","").. ' ') .. "]]" 	
			else
				if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia"
					local i, _ = mw.ustring.find(Sitelink2, ",")
					if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink2, 1, i-1) end
				end		
				link = link .. '[['.. Sitelink2.."|".. official_name.. ']]' 
			end		
		end

		if Sitelink == nil and Sitelink2 == nil then 
			if official_name ~='' then link = official_name else link = entity:getLabel('ar') end
			if link == nil then link = "(label missing)" end
		end	
	
	-- mw.log('Sitelink=', Sitelink, 'Sitelink2=', Sitelink2, 'official_name=',  official_name) 
	end -- end arg[1]
	if arg[1] == 'pure' then
		if pcall(foo1, Qnumber) then
			if wiki == "en" then --delete string ", ..." from e.g. "Unley, South Australia"
				if Sitelink~=nil then
					local i, _ = mw.ustring.find(Sitelink, ",")
					if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink, 1, i-1) end
				end
			end		
			if Sitelink ~= nil then link = "[[" .. Sitelink .. "|" .. mw.text.trim(mw.ustring.gsub(Sitelink2, "%b()", "")..' ') .. "]]"	
			elseif wiki == 'ar' then
				local title = mw.title.new(Label)
				if title and title.exists 
					then link = Label 
				else link = mw.getCurrentFrame():expandTemplate{ title = 'Ill-WD2', args = {id=Qnumber,target='en',label=Label } }--"[[" .. Label.. "]]" 
				end
			else link = mw.ustring.gsub(Label, "^(%a)", function (x) return mw.ustring.upper(x) end)		
			end 
		end
	end
	if arg[1] == 'race' then -- for infobox "Competitions"
		local a, b = pcall(fooA, 'numeric-id', entity, 'P31', 1)
		if a == true and b == 1137352 then
			local entity_race = mw.wikibase.getEntity( 'Q' .. b )
			local Label_race = entity_race:getLabel('ar') or ''
			local Sitelink_race = entity_race:getSitelink() or ''
			if Label_race ~= '' and Sitelink ~= nil then link = '[[' .. Sitelink .. '|' .. Label_race .. ']]'
			elseif Sitelink ~= nil then link = '[[' .. Sitelink .. ']]'
			else if Sitelink_race ~= '' then link = '[[' .. Sitelink_race ..'|' .. mw.text.trim(mw.ustring.gsub(Sitelink_race, "%b()", "") .. ' ') .. ']]'
				else link = Label_race or Label end
			end
			if onwikidata == true then link = '[['..entity:getSitelink( 'frwiki')..'|'..entity_race:getLabel('fr')..']]' end
	
		else if Sitelink ~= nil then link = "[[".. Sitelink.. "]]" else link = Label end
		end
	end
	if arg[1] == "Q22348500" then -- add weblink from item "Q22348500" if available
		local Sitelink_claas = mw.wikibase.getEntity( 'Q22348500' ):getSitelink() 	
		if pcall(foo1, Qnumber) then --Sitelink_claas
			if Sitelink == nil then 
				if Sitelink_claas ~= nil then link = "[[" .. Sitelink_claas .. "|" .. Label .. "]]" 
				elseif entity:getLabel( 'ar' )~=nil then link = entity:getLabel( 'ar' )
				elseif entity:getLabel( 'fr' )~=nil then link = entity:getLabel( 'fr' )
				elseif entity:getLabel( 'en' )~=nil then link = entity:getLabel( 'en' )
				elseif entity:getLabel( 'de' )~=nil then link = entity:getLabel( 'de' )				
				else link = Label 
				end 
			end
		end
	end
	return link
end

function getMissingLabelTrackingCategory()
	local l10nDef = { }
	l10nDef["//cs.wikipedia.org"] = '[[Kategorie:Údržba:Doplnit štítek na Wikidatech]]'
	l10nDef["//lv.wikipedia.org"] = '[[Category:Vikidatos trūkst nosaukuma latviešu valodā]]'

	local l10n = l10nDef[mw.site.server]
	if not l10n then
    	l10n = ''
	end
	return l10n
end 

function changetemplate () -- for eoWiki
	local frame = mw.getCurrentFrame()
	local n = frame:expandTemplate {title="sxangxu sxablonon2", args = {["sxablono"] = "Cycling race/infobox"}}
	return n			
end

function fooA (mode,entity,property,var)
	local snak	
	if mode=="value" then snak=entity.claims[property][var].mainsnak.datavalue.value 
	else snak=entity.claims[property][var].mainsnak.datavalue.value[mode]
	end
	return snak, entity.claims[property][var].rank
end

function fooB (mode, entity_var, property, var1, var2, ref, var3)
	local snak 
	if mode == 'value' then snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value 
	else snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value[mode]
	end
	return snak
end

function fooC (mode, entity_var, property, var1, quali, var2)
	local snak
	if mode == 'value' then snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value 
	else snak = entity_var.claims[property][var1].qualifiers[quali][var2].datavalue.value[mode]
	end
	return snak
end

function foo1 (arg)
	local entity = mw.wikibase.getEntity( arg ) 
end

function foo2 (entity_var, property, var)
	local snak = entity_var.claims[property][var].mainsnak.datavalue.value.amount 
end

function foo3 (entity_var, property, var1, quali, var2) 
	local snak = entity_var.claims[property][var1].qualifiers[quali][var2].datavalue.value.amount 
end

function winner (wiki, t, winner_id)
	local number = t.number
	local winner_id = winner_id
	local tt = {}
	for num=1,number do table.insert(tt, "") end
	local WDlink_on
	local winner

	-- WDlink_on is used to decide if a Wikidata flag will be shown
	if wiki == "mk" or wiki == "ja" or wiki == "ru" then WDlink_on = true else WDlink_on = false end
	for num=1,number do
		local entity_race = mw.wikibase.getEntityObject(t.race[num][1])
		if pcall(fooA, 'numeric-id', entity_race, 'P1346', 1) == true then		--if exist "winner" (P1346)
		for k, v1 in pairs(entity_race.claims['P1346']) do						
			if pcall(fooA, 'value', entity_race, 'P1346', k, 'P642', 1) == true then	-- Check if "winner" (P1346) is not void due some "of" (P642)
				if pcall(fooC, 'numeric-id', entity_race, 'P1346', k, 'P642', 1) == true 
					and v1.qualifiers.P642[1].datavalue.value['numeric-id'] == winner_id then
		    		local time_var, a, b
	    			winner = "Q"..v1.mainsnak.datavalue.value['numeric-id']
					-- get date of the race, e.g. "+2016-01-01T00:00:00Z"
					-- P585 (point in time for a single day race) or P580 (start time for a stage race)
					a, b = pcall(fooA, 'time', entity_race, 'P585', 1)
					if a == true then time_var = b
					else
						a, b = pcall(fooA, 'time', entity_race, 'P580', 1)
						if a == true then time_var = b end
					end

					-- get nationality of the winner, nationality could have changed, therefore look for qualifiers p580 and p582
					a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( winner ), 'P27', 1) -- standard: only one nationality
					if a == true then
						tt[num] = flag("Q"..b, time_var) .. " " .. WPlink(winner) .. " "
						if WDlink_on == true then tt[num] = tt[num].. wdLink(winner) end
					else if WDlink_on == true then tt[num] = "  " .. wdLink(winner) else tt[num] = "" end
					end

					-- if person has more than one nationality calculate tt[num] again
					a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( winner ), 'P27', 2)
					if a == true then
						local _, bb = timeStartEnd(winner, "P27", 'numeric-id', time_var)
						tt[num] = flag('Q'..bb, time_var) .. " " .. WPlink(winner) .. " "
						if WDlink_on == true then tt[num] = tt[num].. wdLink(winner) end
					end
				end -- if v1.
			-- If "winner (P1346)"" is nil, check if still "of" has "numeric-id" and if "has cause" (P828)" for "disqualification"
			else	
				if pcall(fooC, 'numeric-id', entity_race, 'P1346', k, 'P642', 1) == true			-- if exist "of" (P642)
					and v1.qualifiers.P642[1].datavalue.value['numeric-id'] == winner_id			-- if "of" is a winner_id (winner, second or third)
					and pcall(fooC, 'numeric-id', entity_race, 'P1346', k, 'P828', 1) == true		-- if exist "has cause" (P828)
					and v1.qualifiers.P828[1].datavalue.value['numeric-id'] == 1229261 then			-- if cause is "discualification" (Q1229261)
			 		if pcall(fooC, 'numeric-id', entity_race, 'P1346', k, 'P1013', 1) == true then	-- if exist "criterion used" (P1013)
						local criterion = v1.qualifiers.P1013[1].datavalue.value['numeric-id']		-- if criterion is "declared desert" (Q45123627)
			 			if criterion == 45123627 then				-- if criterion is "declared desert" (Q45123627), add others if you want
							tt[num] = WPlink("Q"..criterion)
			 			end
			 		end
				end	
			end
		end -- for k, v1
		end -- if
	end -- for num=
	return tt
end

function p.listofwinners(frame)
	local t = {number, race={}, year={}, vainqueur, second, troisieme}
	frame.args[1] =	string.gsub(frame.args[1], "%c", "")
	local entity = mw.wikibase.getEntity( frame.args[1] )
	local WDlink_on
	local WPcontent = {}
	
	local localFrame 
	if string.match(frame:getParent():getTitle(), '%P+') == mw.site.namespaces.Template.name 
	then localFrame = frame:getParent() else localFrame = frame end
	if localFrame.args[1] ~= nil then localFrame.args[1] = string.gsub(localFrame.args[1], "%c", "") end 
--[=[ 
It is possible to give the table listofwinners in the article commands. It could look like this:
{{Cycling race/listofwinners|Q18574623
| above row 1: '''[[aaa bbb ccc]]''' xxx 
}}
"above row x" inserts a new row above row x into the table. Content is what is behind the ":". 
]=]
	if localFrame.args[2] ~= nil then
		for num,var in pairs(localFrame.args) do
			if num > 1 and mw.ustring.find(mw.ustring.lower(localFrame.args[num]), 'row') then
				local _, _, key1, val = mw.ustring.find(localFrame.args[num], "([^:]+)%s*:%s*(%C+)")
				local _, _, key01, key11, key12 = mw.ustring.find(key1, "(%a+)%s*(%a+)%s*(%d+)")
				key12 = tonumber(key12) key11 = mw.ustring.lower(key01..key11)
				if key11 == 'aboverow' then WPcontent[key12] = val end
			end
		end
	end

	-- WDlink_on is used to decide if a Wikidata flag will be shown
	if wiki == "mk" or wiki == "ja" or wiki == "ru" then WDlink_on = true else WDlink_on = false end

	local num = 0
	if pcall(fooA, 'numeric-id', entity, 'P527', 1) == true then 
	for k, v1 in pairs(entity.claims['P527']) do
		local year, race, entity_race, a, b 
		race = 'Q'..v1.mainsnak.datavalue.value['numeric-id'] -- Qnumbers of the parts of a tour
		entity_race = mw.wikibase.getEntityObject(race)

		-- P585(point in time for a single day race) or P580(start time for a stage race)
		a, b = pcall(fooA, 'time', entity_race, 'P585', 1) 
		if a == true then year = b 
		else 
			a, b = pcall(fooA, 'time', entity_race, 'P580', 1)
			if a == true then year = b end
		end

		if year ~= nil then _, _, year, _, _ = string.find(year, "(%d+)-(%d+)-(%d+)") end
		table.insert(t.race, { race, year} )
	--	table.sort(t.race, function(a,b) return a[2] < b[2] end) -- t.race is sorted after year
		num = num + 1
	end
	end -- for k, v1
	t.number = num

	for num=1, t.number do -- build year column with link to wikipedia article and to wikidata item
		local sitelink = mw.wikibase.sitelink( t.race[num][1] )
		if sitelink == nil and t.race[num] and t.race[num][2]
		then 
			sitelink = t.race[num][2] 
		else 
			if t.race[num] and t.race[num][2] then
				sitelink = "[[" .. sitelink .. "|" .. t.race[num][2] .. "]]"
			else
				sitelink = "[[" .. sitelink .. "]]"
			end
		end
		if WDlink_on == false then table.insert(t.year, sitelink) else table.insert(t.year, sitelink.. " " .. wdLink(t.race[num][1]) ) end
	end 
	
	t.vainqueur = winner(wiki, t, 20882667) -- build vainqueur column
	t.second = winner(wiki, t, 20882668) -- build second column
	t.troisieme = winner(wiki, t, 20882669) -- build troisiem column

	local table_first = "<table cellpadding='4' cellspacing='0' style='border:1px solid rgb(200,200,200); color:black;"..
		"margin:0 0 0.5em 0; background-color:rgb(255, 255, 255); padding:5px; clear:left; "..
		"text-align:" .. textalign .. "; vertical-align:top; font-size:85%; line-height:1.6em;'>"
	local table_proto = "<tr style='background:#FFDF80; text-align:center'><th>"
	if WDlink_on == false then table_proto = table_proto .. '<span style="float:left">[[File:Wikidata-logo S.svg|24px|link=d:'.. frame.args[1].. '#P527]]</span>' end    
	table_proto = table_proto.. headoftableIV(1).. "</th><th>".. headoftableIV(2).. "</th><th>".. headoftableIV(3).. "</th><th>".. headoftableIV(4).. "</th></tr>"
	local table_center, table_last = "", "</table>"

	for var=1, t.number do 
		if type(WPcontent) == 'table' and WPcontent[var] ~= nil then table_center = table_center.. 
			"<tr><td colspan='4' style='text-align:center'>".. WPcontent[var].. "</td></tr>" end		

		table_center = table_center .. "<tr><td style='text-align:center'>".. (t.year[var] or '').."</td>"
		table_center = table_center .. "<td>"..t.vainqueur[var].."</td>" 
		table_center = table_center .. "<td>"..t.second[var].."</td>" 
		table_center = table_center .. "<td>"..t.troisieme[var].."</td></tr>" 
	end
	return table_first .. table_proto .. table_center .. table_last 
end

function p.listofstages(frame)
	local formatter = require ('Module:ملعب/Mr. Ibrahem/cyy')
	local fun = formatter['listofstages']
	return fun(frame)
end

function func_prologue() -- returns the word "Prologue"
	local l10nDef = { ["fr"]="Prologue", ["ar"]="المقدمة", ["en"]="Prologue", ["br"]="Prolog", ["ca"]="Pròleg", ["cs"]="Prolog", ["de"]="Prolog", ["da"]="Prolog", ["eo"]="Prologo",
	["es"]="Prólogo", ["eu"]="Aitzinetapa", ["fi"]="Prologi", ["fo"]="Forteinur", ["hu"]="Prolog", ["it"]="Prologo", ["ja"]="プロローグ", ["la"]="Incipit prologus", ["lb"]="Prolog", ["lv"]="Prologs",
	["mk"]="Пролог",  ["nl"]="Proloog", ["no"]="Prolog", ["pl"]="Prologu", ["pt"]="Prólogo", ["ro"]="Prolog", ["ru"]="Пролог", ["sk"]="Prológ", ["sv"]="Prolog" }

	if l10nDef[wiki] ~= nil then return l10nDef[wiki] else return l10nDef["en"] end -- if no translation, show en translation
end

function stageLink(x, a, b) -- x= 10a: a = 10, b = a. x = 5: a = 5, b = "" 
	local l10nDef = {["fr"]="étape", ["en"]="stage", ["ar"]="مرحلة", ["br"]="Tennad", ["ca"]="etapa", ["cs"]="etapa", ["de"]="Etappe", ["da"]="etape", ["eo"]="Etapo",
	["es"]="etapa", ["eu"]="Etapa", ["fi"]="Etappi", ["fo"]="teinur", ["hu"]="Szakasz", ["it"]="Tappa", ["ja"]="ステージ", ["la"]="Statio", ["lb"]="etapp", 
	["lv"]="Posms", ["mk"]="Етапа", ["nl"]="Etappe", ["no"]="etappe", ["pl"]="Etap", ["pt"]="Etapa", ["ro"]="Etapa", ["ru"]="Этап", ["sk"]="Etapa", 
	["sv"]="Etapp" }		                

	local word1, word2
	word2=l10nDef[wiki]
	if word2 == nil then word2=l10nDef["en"] end -- if no translation, show en translation
	local word = word2

-- fr: {{1re}} étape, {{2e}} étape
	if wiki=="fr" or wiki=="lb" then
		if b == "" then -- series_ordinal without character
			if a == "1" then word1 = "1<sup>re</sup> "..word else word1 = a.."<sup>e</sup> "..word end -- table text = {{1re}} étape, {{2ae}} étape,
			if a == "1" then word2 = "#1re "..word else word2 = "#"..a.."e  "..word end --text of section header = #1re étape, #2e étape
			return word1, word2
		end
		if b ~= "" then -- series_ordinal with character: instead of eg "1a re" it is "1re a"
			if a == "1" then word1 = "1<sup>re</sup> "..b.." "..word else word1 = a.."<sup>e</sup> "..b.." "..word end -- table text = {{1re}} étape, {{2ae}} étape,
			if a == "1" then word2 = "#1re "..b.." "..word else word2 = "#"..a.."e"..b.." "..word end --text of section header = #1re étape, #2e étape
			return word1, word2
		end
	end
	if wiki=="de" or wiki=="da" or wiki=="fo" or wiki=="no" then return a..". "..b.." "..word, "#"..a..". "..b.." "..word end
	if wiki=="ca" then return a.."a "..b.." "..word, "#"..a..". "..b.." "..word end
	if wiki=="es" then return a.."<sup>a</sup> "..b.." "..word, "#"..a..". "..b.." "..word end

	-- default
	word1 = x                  -- table text = 1, 2a, 3
	word2 = "#"..word.." ".. x -- text of section header = #Etappe 2a, #Stage 4
	return word1, word2 
end

function func_month(x) 
	local l10nDef = { }
	l10nDef["ar"] = {"يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"}
	l10nDef["en"] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
		
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["en"] end  -- default
	return l10n[x]
end
function headoftable(x) -- En-tête du tableau listant les étapes
	local l10nDef={ }
	l10nDef["ar"]={"المرحلة", "التاريخ", "الدورة", "المسافة (كم)", "الفائز بالمرحلة", "القائد العام"}
	l10nDef["en"]={"Stage", "Date", "Course", "Distance - km (mi)", "Stage winner", "Overall leader"}
	
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["en"] end  -- default
	return l10n[x]
end 

function headoftableII(x) -- En-têtes des tableaux générant les classements
	local l10nDef = { }
	l10nDef["ar"] = {"العداء", "البلد", "الفريق", "الوقت", "إزاحة الوقت", "السرعة", "النقاط", "تصنيف الفرق ضد الساعة", "التصنيف العام", "تصنيف النقاط", "تصنيف الجبال", "تصنيف أفضل عداء", "تصنيف أفضل شاب", "تصنيف الفرق حسب الوقت", "ترتيب الفرق حسب النقاط", "تصنيف المجموعة", "تصنيف أفضل مقاتل", "التصنيف تحت 23"}
	l10nDef["en"] = {"Rider", "Country", "Team", "Time", "Time Gap", "Speed", "Points", "Stage classification", "General classification", "Points classification", "Mountains classification", "Sprints classification", "Best young classification", "Teams classification", "Points classification for teams", "Combination classification", "Combative classification", "U23 classification"}
	
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["en"] end  -- default
	return l10n[x]
end

function headoftableIII(x) -- En-tête du tableau listant les équipes participantes (P1923)
	local l10nDef = { }
	l10nDef["ar"] = {"اسم الفريق", "البلد", "الرمز", "فريق عالمي", "فرق عالمية", "فريق برو", "فرق برو", "فريق قاري محترف", "فرق قارية محترفة", "فريق قاري", "فرق قارية", "فريق وطني", "فرق وطنية", "فريق إقليمي ونادي", "فرق إقليمية وأندية", "فريق دراجات محترف", "فرق دراجات محترفة", "فريق هواة دراجات", "فرق هواة دراجات", "مجموعة رياضية أولى", "مجموعات رياضية أولى", "مجموعة رياضية ثانية", "مجموعات رياضية ثانية", "مجموعة رياضية ثالثة", "مجموعات رياضية ثالثة", "فريق مختلط", "فرق مختلطة", "فريق إناث محترف", "فرق إناث محترفة", "فريق هواة دراجات إناث", "فرق هواة دراجات إناث"}
	l10nDef["en"] = {"Team name", "Country", "Code", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professional continental team", "Professional continental teams", "Continental team", "Continental teams", "National team", "National teams", "Regional and club team", "Regional and club teams", "Professional cycling team", "Professional cycling teams", "Amateur cycling team", "Amateur cycling teams", "Groupe sportif I", "Groupes sportifs I", "Groupe sportif II", "Groupes sportifs II", "Groupe sportif III", "Groupes sportifs III", "Mixt team", "Mixt teams", "Professional woman team", "Professional women teams", "Women's amateur cycling team", "Women's amateur cycling teams"}
	
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["en"] end  -- default
	return l10n[x]
end

function headoftableIV(x) -- En-tête du tableau du palmarès d'une course cycliste
	local l10nDef = { }
	l10nDef["ar"] = {"السنة", "الفائز", "الثاني", "الثالث"}
	l10nDef["en"] = {"Year", "Winner", "Second", "Third"}
	
	return l10nDef[wiki][x]
end 

function typeofstage(x, typ)
 	--  plain, hilly, inter, ... must be "" or "any text"
 	--  l10nDef[""] = {plain = "", hilly="", inter='', mount='', time_prologue='', time_team='', time_indiv='', uphill='', rest=''}
	local l10nDef = { }
	l10nDef["ar"] = {plain = "مرحلة مستوية", hilly="مرحلة التلال", inter='مرحلة متوسطة', mount='مرحلة جبلية', time_prologue='مرحلة سباق ضد الساعة', time_team='مرحلة سباق الفرق ضد الساعة', time_indiv='مرحلة سباق فردي ضد الساعة', uphill='مرحلة تسلق الجبل ضد الساعة', rest='يوم راحة'}
	l10nDef["en"] = {plain = "plain stage", hilly="hilly stage", inter='intermediate stage', mount='mountain stage', time_prologue='time trial stage', time_team='team time trial stage', time_indiv='individual time trial stage', uphill='uphill time trial stage', rest='rest day'}
	
	local l10n = l10nDef[wiki]
	if not l10n then l10n = l10nDef["en"] end  -- default

 	if x=='plain stage' then return "[[File:Plainstage.svg|border|right|20px|"..l10n.plain.."]]" end
 	if x=='hilly stage' then return "[[File:Hillystage.svg|border|right|20px|"..l10n.hilly.."]]" end
  	if x=='intermediate stage' then return "[[File:Mediummountainstage.svg|right|border|20px|"..l10n.inter.."]]" end
  	if x=='mountain stage' then return "[[File:Mountainstage.svg|border|right|20px|"..l10n.mount.."]]" end
  	if x=='uphill time trial stage' then return "[[File:Mountain Time Trial Stage.svg|border|right|20px|"..l10n.uphill.."]]" end
   	if x=='rest day' then return "[[File:Stage rest day.svg|border|right|20px|"..l10n.rest.."]]" end
   	if x=='time trial stage' then 
   		if typ==2348250 then return "[[File:Team Time Trial Stage.svg|right|20px|"..l10n.time_team.."]]" end
   		if typ==2266066 then return "[[File:Time Trial.svg|right|20px|"..l10n.time_indiv.."]]" end
   		if typ==485321  then return "[[File:Time Trial.svg|right|20px|"..l10n.time_prologue.."]]" end
    end	
end

function wdLink (id)
	return "[[File:Wikidata-logo S.svg|24px|link=d:" .. id .. "]]"
end

function flag (x, date)
	local year,m,d
	if date==nil then date = '+'..os.date('%Y-%m-%d') end 	
	local flag1 = { -- Q..a current flag, Q..b, Q..c older flag. date: "+2016", "+2016-01-30", ..
	Q29a={"{{رمز علم|ESP}}","+1982",""},
	Q29b={"{{رمز علم|ESP|1977}}","+1977","+1981"},
	Q30= "{{رمز علم|USA}}",
	Q31= "{{رمز علم|BEL}}",
	Q38a={"{{رمز علم|ITA}}","+1947",""},
	Q38b={"{{رمز علم|ITA|1861}}","+1861","+1946"},
	Q39="{{رمز علم|SUI}}",
	Q55= "{{رمز علم|NED}}",
	Q142="{{رمز علم|FRA}}",
	Q145="{{رمز علم|GBR}}",
	Q183a={"{{رمز علم|GER}}","+1949-05-23",""},
	Q183b={"{{رمز علم|GER|1935}}","+1935","+1945"},
	Q183c={"{{رمز علم|ألمانيا النازية|1933n}}","+1933","+1935"},
	Q183d={"[[File:Flag of Germany (3-2 aspect ratio).svg|border|20px|GER]]","+1919","+1933"},
	Q183e={"{{صورة علم|الإمبراطورية الألمانية}}","+1866","+1918"},
	Q218a={"{{رمز علم|ROU}}","+1989-12-27",""},
	Q218b={"{{رمز علم|ROU|1965}}","+1965","+1989-12-26"},
	Q218c={"{{رمز علم|ROU|1952}}","+1952","+1965"},
	Q218d={"{{رمز علم|ROU|1948}}","+1948","+1952"},
	Q218e={"{{رمز علم|ROU}}","+1867-07-01","+1948"},
	Q224a={"{{رمز علم|CRO}}","+1990-12-21",""},
	Q224b={"{{رمز علم|CRO|1990}}","+1990-06-27","+1990-12-21"}
	}

	if flag1[x..'a']~=nil and date>=flag1[x..'a'][2] and flag1[x..'a'][3]=='' then return flag1[x..'a'][1] end
	if flag1[x..'b']~=nil and date>=flag1[x..'b'][2] and date<=flag1[x..'b'][3] then return flag1[x..'b'][1] end
	if flag1[x..'c']~=nil and date>=flag1[x..'c'][2] and date<=flag1[x..'c'][3] then return flag1[x..'c'][1] end
	if flag1[x..'d']~=nil and date>=flag1[x..'d'][2] and date<=flag1[x..'d'][3] then return flag1[x..'d'][1] end
	if flag1[x..'e']~=nil and date>=flag1[x..'e'][2] and date<=flag1[x..'e'][3] then return flag1[x..'e'][1] end	
	if flag1[x]~=nil then return flag1[x] end	

	local flag2 = { Q16={'Q80110','CAN'}, Q17={'Q43175','JPN'}, Q20={'Q83149','NOR'}, Q27={'Q82205','IRL'}, Q32={'Q133022','LUX'}, Q33={'Q47891','FIN'},
	Q34={'Q81286','SWE'}, Q35={'Q60149','DEN'}, Q36={'Q42436','POL'}, Q37={'Q81477','LTU'}, Q39={'Q124020','SUI'}, Q77={'Q171103','URU'},  
	Q96={'Q122462','MEX'}, Q145={'Q83278','GBR'}, Q159={'Q16611','RUS'}, Q191={'Q81471','EST'}, Q211={'Q130449','LAT'}, Q212={'Q127974','UKR'}, 
	Q213={'Q127155','CZE'}, Q214={'Q160861','SVK'}, Q232={'Q131650','KAZ'}, Q262={'Q83392','DZA'}, Q408={'Q81676','AUS'}, Q414={'Q130774','ARG'}, 
	Q664={'Q160260','NZL'}, Q717={'Q165538','VEN'}, Q739={'Q160425','COL'} }  	

	local xx
	if flag_table[x] ~= nil then return flag_table[x] end

	if flag2[x]~=nil then xx = x x = flag2[x] end -- transform x to new x 
	if type(x)=='table' and pcall(foo1,x[1]) then -- for transformed x
		local entity=mw.wikibase.getEntity(x[1])
		local a,b=pcall(fooA,'value',entity,'P18',1) -- P18 (image)
		if a==true then 
			flag_table[xx] = "{{صورة رمز علم|"..b.."|size=20px|alt="..x[2].."}}" 		
			return "{{صورة رمز علم|"..b.."|size=20px|alt="..x[2].."}}" 
		end 
	end
	if type(x)=='string' and pcall(foo1,x) then -- reading the flag data from untransformed items, e.g. Q29 
		local entity = mw.wikibase.getEntity( x ) 
		local flags = entity.claims["P41"]
		local possible_flag = {}
		local num = 1
		if pcall(fooA, 'numeric-id', entity, 'P41', 1) then
		local v
		for _, v in pairs(flags) do
			if v.qualifiers then
				if (not v.qualifiers["P580"] or v.qualifiers["P580"][1].datavalue.value.time <= date)
					and (not v.qualifiers["P582"] or v.qualifiers["P582"][1].datavalue.value.time >= date)
				then possible_flag[num]=v.mainsnak.datavalue.value num=num+1 end
			else possible_flag[num]=v.mainsnak.datavalue.value num=num+1 end
		end	
		local file="{{صورة رمز علم|"..possible_flag[1].."|size=20px" 
		local a2,b2=pcall(fooA,'value',entity,'P984',1) -- P984 (country code by the International Olympic Committee)				
		if a2==true then file=file.."|alt="..b2.."}}" else file=file.."}}" end 
		flag_table[x] = file		
		return file
		end	
	end 
	return " "
end 


return p