-- {{Pp|small=yes}} --
--
-- This module implements {{Infobox}}
--
 
local p = {}
local getArgs = require('Modul:Arguments').getArgs
local StringUtils = require('Modul:StringUtils')
local TableTools = require('Modul:TableTools')
local args = {}

local function containsEmbed(cellData)
	local check = { mw.ustring.find(cellData, "^%s*<%s*[Tt][Rr](%s*)([^<>]*)>%s*<%s*[Tt][DdHh](%s*)([^<>]*)>") }
	if check[1] == nil or (check[3] == "" and check[4] ~= "") or (check[5] == "" and check[6] ~= "") then return false end
	check = { mw.ustring.find(cellData, "</[Tt][DdHh]%s*>%s*</[Tt][Rr]%s*>%s*$") }
	if check[1] == nil then return false else return true end
end

p._infobox = function(origArgs)

	local child = origArgs["child"] or origArgs["embed"] or "no"
	local bodyclass = origArgs["bodyclass"] or "infocaseta"
	local antet = origArgs["antet"] or "default"
	local aboveclass = origArgs["aboveclass"] or antet
	local abovestyle = origArgs["abovestyle"] or ""
	local culoare_cadru = origArgs["culoare cadru"] or "F5F5DC"
	if mw.ustring.match(culoare_cadru, '^%x%x%x$') or mw.ustring.match(culoare_cadru, '^%x%x%x%x%x%x$') then culoare_cadru = StringUtils._prependIfMissing({culoare_cadru, '#'}) end
	local culoare_text = origArgs["culoare text"] or "000000"
	if mw.ustring.match(culoare_text, '^%x%x%x$') or mw.ustring.match(culoare_text, '^%x%x%x%x%x%x$') then culoare_text = StringUtils._prependIfMissing({culoare_text, '#'}) end
	local titlestyle = origArgs["titlestyle"] or ""
	local title = origArgs["title"] or origArgs["titlu"] or ""
	title = StringUtils._capitalize({title})
	local showtitle = origArgs["showtitle"] or "yes"
	local above = origArgs["above"] or ""
	local parentColSpanArg = origArgs['parent_colspan']
	local parentColSpan
	if parentColSpanArg and mw.ustring.gsub(parentColSpanArg, '%d+', '', 1) == '' then
		parentColSpan = tonumber(parentColSpanArg)
	else
		parentColSpan = 2
	end
	
	local wikidataEnabled = origArgs["wikidata"] or ""
	local enclose = origArgs["enclose"]
	
	if type(enclose) ~= "string" then enclose = "auto" end
	
	if enclose == "begin" then enclose = { true, false }
	elseif enclose == "end" then enclose = { false, true }
	elseif enclose == "both" then enclose = { true, true }
	elseif enclose == "none" or child == "yes" then enclose = { false, false }
	else enclose = { true, true }
	end
	
	local out = ""
	
	-- open box
	if enclose[1] then
		out = out .. "<table class=\"" .. bodyclass .. "\">"
	end
	
	if child ~= "yes" then
		-- caption
		if showtitle == "yes" then
			out = out .. tostring(mw.html.create('tr')
								:tag('td')
								:attr('colspan', tostring(parentColSpan))
								:addClass('antet ' .. aboveclass)
								:css('background-color', culoare_cadru)
								:css('color', culoare_text)
								:cssText(titlestyle)
								:wikitext(title)
								:allDone())
		end
		-- header
		if above ~= "" then
			local aboveTr = mw.html.create('tr'):tag('td')
				:attr('colspan', tostring(parentColSpan))
				:addClass(aboveclass)
				:css('text-align', 'center')
				:css('font-size', '125%')
				:css('font-weight', 'bold')
				:cssText(abovestyle)
				:wikitext(above):allDone()
			out = out .. tostring(aboveTr)
		end
	else
		if showtitle == "yes" and title ~= "" then
			local newTr = mw.html.create('tr'):tag('td')
				:attr('colspan', tostring(parentColSpan))
				:css('background-color', culoare_cadru)
				:css('color', culoare_text)
				:css('font-size', '125%')
				:css('font-weight', 'bold')
				:css('margin-bottom', '2')
				:css('text-align', 'center')
				:css('line-height', '1.2em')
				:cssText(titlestyle)
				:wikitext(title):allDone()
			out = out .. tostring(newTr)
		end
	end

	-- subheaders
	local subheaders = {}
	subheaders[1] = origArgs["subheader"] or origArgs["subheader1"] or ""
	local subhIndex = 2
	while (origArgs["subheader" .. tostring(subhIndex)] or "") ~= "" do
		subheaders[subhIndex] = origArgs["subheader" .. tostring(subhIndex)] or ""
		subhIndex = subhIndex + 1
	end
	local subheaderstyle = origArgs["subheaderstyle"] or ""
	local subheaderclass = origArgs["subheaderclass"] or ""
	for subHeaderIdx = 1,#subheaders do
		if subheaders[subHeaderIdx] ~= "" then
			local subhTr = mw.html.create('tr'):tag('td'):attr('colspan', tostring(parentColSpan))
				:addClass(subheaderclass)
				:css('text-align', 'center')
				:cssText(subheaderstyle)
				:wikitext(subheaders[subHeaderIdx]):allDone()
			out = out .. tostring(subhTr)
		end
	end
	
	-- images
	local imageIndices = TableTools.affixNums(origArgs, 'image')
	local images = {}
	local captions = {}
	if origArgs['image'] then
		table.insert(images, origArgs['image'] or '')
		table.insert(captions, origArgs['caption'] or '')
	end
	for _,imgIndex in ipairs(imageIndices) do
		table.insert(images, origArgs['image' .. tostring(imgIndex)])
		table.insert(captions, origArgs['caption' .. tostring(imgIndex)] or '')
	end

	local imageclass = origArgs["imageclass"]
	local imagestyle = origArgs["imagestyle"]
	local captionstyle = origArgs["captionstyle"]
	for i = 1,#images do
		if images[i] ~= "" then
			local imageRow = mw.html.create('tr')
			local imageTd = imageRow
				:tag('td'):attr('colspan', tostring(parentColSpan))
					:addClass(imageclass)
					:css('text-align', 'center')
					:cssText(imagestyle)
					:wikitext(images[i])
			if captions[i] ~= "" then
				imageTd:tag('br')
				imageTd:tag('div'):cssText('margin-top: 3px')
				imageTd:tag('span'):cssText(captionstyle)
					:wikitext(captions[i])
			end
			out = out .. tostring(imageRow)
		end
	end
	
	-- rows
	local labelstyle = origArgs["labelstyle"] or ""
	local datastyle = origArgs["datastyle"] or ""
	local headerstyle = origArgs["headerstyle"] or ""
	local elementIndex = 1
	local headers = {}
	local data = {}
	local labels = {}
	local classes = {}
	local styles = {}
	local lblstyles = {}
	local rowstyles = {}
	local rowclasses = {}
	local processingOrder = {}

	for k,v in pairs(origArgs) do
		local headerStart
		local headerEnd
		local labelStart
		local labelEnd
		local dataStart
		local dataEnd
		local styleStart
		local styleEnd
		local lblStyleStart
		local lblStyleEnd
		local rowstyleStart
		local rowstyleEnd
		headerStart, headerEnd = mw.ustring.find(k, "header")
		labelStart, labelEnd = mw.ustring.find(k, "label")
		dataStart, dataEnd = mw.ustring.find(k, "data")
		styleStart, styleEnd = mw.ustring.find(k, "style")
		lblStyleStart, lblStyleEnd = mw.ustring.find(k, "lblstyle")
		rowstyleStart, rowstyleEnd = mw.ustring.find(k, "rowstyle")
		
		local nr = ""
		if dataStart == 1 then
			nr = mw.ustring.sub(k, 1 + dataEnd, mw.ustring.len(k))
		elseif labelStart == 1 then
			nr = mw.ustring.sub(k, 1 + labelEnd, mw.ustring.len(k))
		elseif headerStart == 1 then
			nr = mw.ustring.sub(k, 1 + headerEnd, mw.ustring.len(k))
		elseif styleStart == 1 then
			nr = mw.ustring.sub(k, 1 + styleEnd, mw.ustring.len(k))
		elseif lblStyleStart == 1 then
			nr = mw.ustring.sub(k, 1 + lblStyleEnd, mw.ustring.len(k))
		elseif rowstyleStart == 1 then
			nr = mw.ustring.sub(k, 1 + rowstyleEnd, mw.ustring.len(k))
		end

		if nr ~= "" and processingOrder[nr] == nil and tonumber(nr) ~= nil then
			headers[elementIndex] = origArgs["header" .. nr] or ""
			labels[elementIndex] =  origArgs["label" .. nr] or ""
			data[elementIndex] = origArgs["data" .. nr] or ""
			classes[elementIndex] =  origArgs["class" .. nr] or ""
			styles[elementIndex] = origArgs["style" .. nr] or ""
			lblstyles[elementIndex] = origArgs["lblstyle" .. nr] or ""
			rowstyles[elementIndex] = origArgs["rowstyle" .. nr] or ""
			processingOrder[tonumber(nr)] = elementIndex
			elementIndex = elementIndex + 1
		end
	end

	local processingElement = 1
	while processingElement <= table.maxn(processingOrder) do
		elementIndex = processingOrder[processingElement]
		if elementIndex ~= nil then
			local crtHeader = headers[elementIndex]
			local crtData = data[elementIndex]
			local crtLabel = labels[elementIndex]
			local crtLblStyle = lblstyles[elementIndex]
			local crtClass = classes[elementIndex]
			local crtStyle = styles[elementIndex]
			local crtRowstyle = rowstyles[elementIndex]
			if crtHeader ~= "" then
				local headerTr = mw.html.create('tr')
					:cssText(crtRowstyle)
				local headerTh = headerTr:tag('th')
					:attr('colspan', tostring(parentColSpan))
					:css('text-align', 'center')
					:css('background-color', culoare_cadru)
					:css('color', culoare_text)
					:addClass(crtClass)
					:cssText(headerstyle)
					:wikitext(crtHeader)
				out = out .. tostring(headerTr)
			elseif crtLabel ~= "" then
				if crtData ~= "" then
					local dataAndLabelTr = mw.html.create('tr')
						:tag('th'):cssText(labelstyle):cssText(crtLblStyle)
							:wikitext(crtLabel):done()
						:tag('td')
							:attr('colspan', tostring(parentColSpan - 1))
							:addClass(crtClass)
							:cssText(datastyle):cssText(crtStyle)
							:wikitext(crtData):allDone()
					out = out .. tostring(dataAndLabelTr)
				end
			elseif crtData ~= "" then
				crtData = mw.getCurrentFrame():preprocess(crtData)
				if containsEmbed(crtData) then
					out = out .. crtData
				else
					local dataTr = mw.html.create('tr')
						:tag('td'):attr('colspan', tostring(parentColSpan))
							:addClass(crtClass)
							:css('text-align', 'center')
							:cssText(datastyle)
							:cssText(crtStyle)
							:wikitext(crtData):allDone()
					out = out .. tostring(dataTr)
				end
			end
		end
		processingElement = processingElement + 1
	end
	
	-- below
	local belowstyle = origArgs["belowstyle"] or ""
	local below = origArgs["below"] or ""
	if below ~= "" then
		out = out .. tostring(mw.html.create('tr')
								:tag('td')
									:attr('colspan', tostring(parentColSpan))
									:css('text-align', 'center')
									:cssText(belowstyle)
									:wikitext(below):allDone())
	end
	
	-- tnavbar
	local name = origArgs["name"] or ""
	local navbar = origArgs["navbar"]
	if name ~= "" and navbar ~= 'false' then
		local navBarTr = mw.html.create('tr'):tag('td')
			:css('text-align', 'right')
			:attr('colspan', tostring(parentColSpan))
			:wikitext(mw.getCurrentFrame():expandTemplate{title = "Tnavbar", args = { name }}):done()
		out = out .. tostring(navBarTr)
	end
	if child ~= "yes" then
		local doc = origArgs["doc"] or ""
		if doc ~= "" then
			local infodocTr = mw.html.create('tr'):wikitext(mw.getCurrentFrame():expandTemplate{title = "infodoc", args = {colspan = tostring(parentColSpan), culoare = culoare_cadru, link = doc, wikidata = wikidataEnabled }})
			out = out .. tostring(infodocTr)
		end
	end
	
	-- close box
	if enclose[2] then
		out = out .. "</table>" .. mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Modul:Infobox/styles.css'} } 
	end
	
	return out
end

p.infobox = function(frame)
	local origArgs = getArgs(frame)
	return p._infobox(origArgs)
end
return p