<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://horizonffxi.wiki/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ANavbox</id>
	<title>Module:Navbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://horizonffxi.wiki/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ANavbox"/>
	<link rel="alternate" type="text/html" href="https://horizonffxi.wiki/w/index.php?title=Module:Navbox&amp;action=history"/>
	<updated>2026-04-05T11:58:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://horizonffxi.wiki/w/index.php?title=Module:Navbox&amp;diff=8295&amp;oldid=prev</id>
		<title>Hugin: Hugin moved page Module:Test to Module:Navbox without leaving a redirect</title>
		<link rel="alternate" type="text/html" href="https://horizonffxi.wiki/w/index.php?title=Module:Navbox&amp;diff=8295&amp;oldid=prev"/>
		<updated>2023-05-09T03:02:43Z</updated>

		<summary type="html">&lt;p&gt;Hugin moved page &lt;a href=&quot;/w/index.php?title=Module:Test&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:Test (page does not exist)&quot;&gt;Module:Test&lt;/a&gt; to &lt;a href=&quot;/Module:Navbox&quot; title=&quot;Module:Navbox&quot;&gt;Module:Navbox&lt;/a&gt; without leaving a redirect&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 03:02, 9 May 2023&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key horizon_wiki:diff::1.12:old-8294:rev-8295 --&gt;
&lt;/table&gt;</summary>
		<author><name>Hugin</name></author>
	</entry>
	<entry>
		<id>https://horizonffxi.wiki/w/index.php?title=Module:Navbox&amp;diff=8294&amp;oldid=prev</id>
		<title>Hugin: Created page with &quot;-------------------------------------------------------------------- --&lt;pre&gt; Navbox Module -- -- * Fully CSS styled (inline styles possible but not default) -- * Supports unlimited rows -- -- By User:Tjcool007 from layton.fandom.com --------------------------------------------------------------------  local p = {}  local args = {} -- Arguments passed to template local navbox -- Actual navbox  --local working = {} local rownums, skiprows = {}, {} local hasrows, alt, hasDa...&quot;</title>
		<link rel="alternate" type="text/html" href="https://horizonffxi.wiki/w/index.php?title=Module:Navbox&amp;diff=8294&amp;oldid=prev"/>
		<updated>2023-05-09T02:59:31Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-------------------------------------------------------------------- --&amp;lt;pre&amp;gt; Navbox Module -- -- * Fully CSS styled (inline styles possible but not default) -- * Supports unlimited rows -- -- By User:Tjcool007 from layton.fandom.com --------------------------------------------------------------------  local p = {}  local args = {} -- Arguments passed to template local navbox -- Actual navbox  --local working = {} local rownums, skiprows = {}, {} local hasrows, alt, hasDa...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--------------------------------------------------------------------&lt;br /&gt;
--&amp;lt;pre&amp;gt; Navbox Module&lt;br /&gt;
--&lt;br /&gt;
-- * Fully CSS styled (inline styles possible but not default)&lt;br /&gt;
-- * Supports unlimited rows&lt;br /&gt;
--&lt;br /&gt;
-- By User:Tjcool007 from layton.fandom.com&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local args = {} -- Arguments passed to template&lt;br /&gt;
local navbox -- Actual navbox&lt;br /&gt;
&lt;br /&gt;
--local working = {}&lt;br /&gt;
local rownums, skiprows = {}, {}&lt;br /&gt;
local hasrows, alt, hasData, isChild = false, false, false, false&lt;br /&gt;
local activeSection, sections, cimage, cimageleft&lt;br /&gt;
local colspan, rowspan&lt;br /&gt;
&lt;br /&gt;
local showText, hideText = &amp;#039;Show&amp;#039;, &amp;#039;Hide&amp;#039;&lt;br /&gt;
&lt;br /&gt;
local langCode = mw.getContentLanguage():getCode()&lt;br /&gt;
local localization = {} --localized strings table&lt;br /&gt;
localization[&amp;#039;bn&amp;#039;] = {show = &amp;#039;দেখান&amp;#039;, hide = &amp;#039;লুকান&amp;#039;}&lt;br /&gt;
localization[&amp;#039;de&amp;#039;] = {show = &amp;#039;Ausklappen&amp;#039;, hide = &amp;#039;Einklappen&amp;#039;}&lt;br /&gt;
localization[&amp;#039;en&amp;#039;] = {show = &amp;#039;Show&amp;#039;, hide = &amp;#039;Hide&amp;#039;}&lt;br /&gt;
localization[&amp;#039;es&amp;#039;] = {show = &amp;#039;Mostrar&amp;#039;, hide = &amp;#039;Ocultar&amp;#039;}&lt;br /&gt;
localization[&amp;#039;hi&amp;#039;] = {show = &amp;#039;दिखाएँ&amp;#039;, hide = &amp;#039;छिपाएँ&amp;#039;}&lt;br /&gt;
localization[&amp;#039;ja&amp;#039;] = {show = &amp;#039;表示&amp;#039;, hide = &amp;#039;隠す&amp;#039;}&lt;br /&gt;
localization[&amp;#039;ru&amp;#039;] = {show = &amp;#039;показать&amp;#039;, hide = &amp;#039;скрыть&amp;#039;}&lt;br /&gt;
localization[&amp;#039;zh&amp;#039;] = {show = &amp;#039;显示&amp;#039;, hide = &amp;#039;隐藏&amp;#039;}&lt;br /&gt;
if localization[langCode] then&lt;br /&gt;
    showText = localization[langCode][&amp;#039;show&amp;#039;]&lt;br /&gt;
    hideText = localization[langCode][&amp;#039;hide&amp;#039;]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
-- Title&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--- Processes the VDE links in the title&lt;br /&gt;
--&lt;br /&gt;
-- @param titlecell The table cell of the title&lt;br /&gt;
local function processVde( titlecell )&lt;br /&gt;
	if not args.template then return end&lt;br /&gt;
&lt;br /&gt;
	titlecell:wikitext(&amp;#039;&amp;lt;span class=&amp;quot;navbox-vde&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		.. mw.getCurrentFrame():expandTemplate({&lt;br /&gt;
			title = &amp;#039;vdelinks&amp;#039;,&lt;br /&gt;
			args = { args.template, [&amp;#039;type&amp;#039;] = &amp;#039;navbox&amp;#039; }&lt;br /&gt;
		}) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Processes the main title row&lt;br /&gt;
local function processTitle()&lt;br /&gt;
	local titlerow = mw.html.create(&amp;#039;tr&amp;#039;):addClass(&amp;#039;navbox-title&amp;#039;)&lt;br /&gt;
	local titlecell = mw.html.create(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;,colspan):attr(&amp;#039;scope&amp;#039;,&amp;#039;col&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if not pcall( processVde, titlecell ) then&lt;br /&gt;
		titlecell:wikitext( &amp;#039;&amp;lt;b class=&amp;quot;navbox-vde error&amp;quot; title=&amp;quot;Missing Template:Vdelinks&amp;quot;&amp;gt;!!!&amp;lt;/b&amp;gt;&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	titlecell:wikitext( args.title or &amp;#039;{{{title}}}&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	-- Padding&lt;br /&gt;
	local hasTemplate = args.template ~= nil&lt;br /&gt;
	local hasState = not args.state or args.state ~= &amp;#039;plain&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	if hasTemplate ~= hasState then&lt;br /&gt;
		if hasTemplate then&lt;br /&gt;
			titlecell:addClass(&amp;#039;navbox-title-padright&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			titlecell:addClass(&amp;#039;navbox-title-padleft&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.titleclass then titlerow:addClass( args.titleclass ) end&lt;br /&gt;
	if args.titlestyle then titlecell:cssText( args.titlestyle ) end&lt;br /&gt;
&lt;br /&gt;
	titlerow:node(titlecell)&lt;br /&gt;
	navbox:node(titlerow)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _addGutter( parent, incRowspan )&lt;br /&gt;
	parent:tag(&amp;#039;tr&amp;#039;):addClass(&amp;#039;navbox-gutter&amp;#039;):tag(&amp;#039;td&amp;#039;):attr(&amp;#039;colspan&amp;#039;,2)&lt;br /&gt;
&lt;br /&gt;
	if incRowspan then&lt;br /&gt;
		rowspan = rowspan + 1&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
-- Above/Below&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--- Processes the above and below rows&lt;br /&gt;
--&lt;br /&gt;
-- @param rowtype Either &amp;#039;above&amp;#039; or &amp;#039;below&amp;#039;&lt;br /&gt;
local function processAboveBelow( rowtype )&lt;br /&gt;
	if not args[rowtype] then return end&lt;br /&gt;
&lt;br /&gt;
	local abrow = mw.html.create(&amp;#039;tr&amp;#039;):addClass(&amp;#039;navbox-&amp;#039;..rowtype)&lt;br /&gt;
	local abcell = mw.html.create(&amp;#039;td&amp;#039;):attr(&amp;#039;colspan&amp;#039;,colspan):wikitext( args[rowtype] )&lt;br /&gt;
&lt;br /&gt;
	if args[rowtype .. &amp;#039;class&amp;#039;] then abrow:addClass( args[rowtype .. &amp;#039;class&amp;#039;] ) end&lt;br /&gt;
	if args[rowtype .. &amp;#039;style&amp;#039;] then abcell:cssText( args[rowtype .. &amp;#039;style&amp;#039;] ) end&lt;br /&gt;
&lt;br /&gt;
	abrow:node( abcell )&lt;br /&gt;
	_addGutter( navbox )&lt;br /&gt;
	navbox:node( abrow )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
-- Main Rows&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--- Processes the images&lt;br /&gt;
local function _processImage(row, imgtype)&lt;br /&gt;
	if not args[imgtype] then return end&lt;br /&gt;
&lt;br /&gt;
	local iclass = imgtype == &amp;#039;image&amp;#039; and &amp;#039;navbox-image-right&amp;#039; or &amp;#039;navbox-image-left&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local imagecell = mw.html.create(&amp;#039;td&amp;#039;):addClass(&amp;#039;navbox-image&amp;#039;):addClass(iclass)&lt;br /&gt;
&lt;br /&gt;
	local image = args[imgtype]&lt;br /&gt;
	if image:sub(1,1) ~= &amp;#039;[&amp;#039; then&lt;br /&gt;
		local width = args[imgtype .. &amp;#039;width&amp;#039;] or &amp;#039;100px&amp;#039;&lt;br /&gt;
		imagecell:css(&amp;#039;width&amp;#039;,width):wikitext(&amp;#039;[&amp;#039;..&amp;#039;[&amp;#039; .. image  .. &amp;#039;|&amp;#039; .. width .. &amp;#039;|link=&amp;#039; .. (args[imgtype .. &amp;#039;link&amp;#039;] or &amp;#039;&amp;#039;) .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		imagecell:css(&amp;#039;width&amp;#039;,&amp;#039;0%&amp;#039;):wikitext(image)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args[imgtype .. &amp;#039;class&amp;#039;] then imagecell:addClass( args[imgtype .. &amp;#039;class&amp;#039;] ) end&lt;br /&gt;
	if args[imgtype .. &amp;#039;style&amp;#039;] then imagecell:cssText( args[imgtype .. &amp;#039;style&amp;#039;] ) end&lt;br /&gt;
&lt;br /&gt;
	row:node( imagecell )&lt;br /&gt;
	if imgtype == &amp;#039;image&amp;#039; then&lt;br /&gt;
		cimage = imagecell&lt;br /&gt;
	else&lt;br /&gt;
		cimageleft = imagecell&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Closes the currently active section (if any)&lt;br /&gt;
local function _closeCurrentSection()&lt;br /&gt;
	if not activeSection then return end&lt;br /&gt;
&lt;br /&gt;
	local row = mw.html.create(&amp;#039;tr&amp;#039;):addClass(&amp;#039;navbox-section-row&amp;#039;)&lt;br /&gt;
	local cell = mw.html.create(&amp;#039;td&amp;#039;):attr(&amp;#039;colspan&amp;#039;,2)&lt;br /&gt;
&lt;br /&gt;
	if not hasrows then&lt;br /&gt;
		_processImage(row,&amp;#039;imageleft&amp;#039;)	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	cell:node(sections[activeSection])&lt;br /&gt;
	row:node(cell)&lt;br /&gt;
&lt;br /&gt;
	local firstRow = false&lt;br /&gt;
	if not hasrows then&lt;br /&gt;
		firstRow = true&lt;br /&gt;
		hasrows = true&lt;br /&gt;
		_processImage(row,&amp;#039;image&amp;#039;)	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	_addGutter(navbox,not firstRow)&lt;br /&gt;
	navbox:node(row)	&lt;br /&gt;
	rowspan = rowspan + 1&lt;br /&gt;
&lt;br /&gt;
	activeSection = false&lt;br /&gt;
	hasData = false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Handles alternating rows&lt;br /&gt;
--&lt;br /&gt;
-- @return Alternatingly returns true or false. Always returns false if alternating rows&lt;br /&gt;
--         are disabled with &amp;quot;alternaterows = no&amp;quot;&lt;br /&gt;
local function _alternateRow()&lt;br /&gt;
	if args.alternaterows == &amp;#039;no&amp;#039; then return false end&lt;br /&gt;
	if alt then&lt;br /&gt;
		alt = false&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		alt = true&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Process a single Header &amp;quot;row&amp;quot;&lt;br /&gt;
--&lt;br /&gt;
-- @param num Number of the row to be processed&lt;br /&gt;
local function processHeader(num)&lt;br /&gt;
	if not args[&amp;#039;header&amp;#039;..num] then return end&lt;br /&gt;
&lt;br /&gt;
	_closeCurrentSection()&lt;br /&gt;
&lt;br /&gt;
	local subtable = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;navbox-section&amp;#039;)&lt;br /&gt;
	local headerrow = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	local header = mw.html.create(&amp;#039;th&amp;#039;):addClass(&amp;#039;navbox-header&amp;#039;):attr(&amp;#039;colspan&amp;#039;,2):attr(&amp;#039;scope&amp;#039;,&amp;#039;col&amp;#039;):wikitext( args[&amp;#039;header&amp;#039;..num] )&lt;br /&gt;
&lt;br /&gt;
	local collapseme = args[&amp;#039;state&amp;#039;..num] or false&lt;br /&gt;
	local state = false&lt;br /&gt;
&lt;br /&gt;
	if collapseme then&lt;br /&gt;
		-- Look at this one&lt;br /&gt;
		if collapseme ~= &amp;#039;plain&amp;#039; then&lt;br /&gt;
			state = collapseme == &amp;#039;expanded&amp;#039; and &amp;#039;expanded&amp;#039; or &amp;#039;collapsed&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Look at default &lt;br /&gt;
		local collapseall = args.defaultstate or false&lt;br /&gt;
		if collapseall then&lt;br /&gt;
			state = collapseall == &amp;#039;expanded&amp;#039; and &amp;#039;expanded&amp;#039; or &amp;#039;collapsed&amp;#039;	&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if state then&lt;br /&gt;
		subtable:addClass(&amp;#039;mw-collapsible&amp;#039;):attr(&amp;#039;data-expandtext&amp;#039;,args[&amp;#039;expandtext&amp;#039;..num] or args[&amp;#039;defaultexpandtext&amp;#039;] or showText):attr(&amp;#039;data-collapsetext&amp;#039;,args[&amp;#039;collapsetext&amp;#039;..num] or args[&amp;#039;defaultcollapsetext&amp;#039;] or hideText)&lt;br /&gt;
		if state == &amp;#039;collapsed&amp;#039; then&lt;br /&gt;
			subtable:addClass(&amp;#039;mw-collapsed&amp;#039;)	&lt;br /&gt;
		end&lt;br /&gt;
		header:addClass(&amp;#039;navbox-header-collapsible&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.headerclass then headerrow:addClass( args.headerclass ) end&lt;br /&gt;
	if args.headerstyle then header:cssText( args.headerstyle ) end&lt;br /&gt;
&lt;br /&gt;
	headerrow:node(header)	&lt;br /&gt;
	subtable:node(headerrow)&lt;br /&gt;
&lt;br /&gt;
	sections[num] = subtable&lt;br /&gt;
	activeSection = num&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Processes a single list row&lt;br /&gt;
--&lt;br /&gt;
-- @param num Number of the row to be processed&lt;br /&gt;
local function processList(num)	&lt;br /&gt;
	if not args[&amp;#039;list&amp;#039;..num] then return end&lt;br /&gt;
&lt;br /&gt;
	local row = mw.html.create(&amp;#039;tr&amp;#039;):addClass(&amp;#039;navbox-row&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if not hasrows and not activeSection then&lt;br /&gt;
		_processImage(row, &amp;#039;imageleft&amp;#039;)	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listcell = mw.html.create(&amp;#039;td&amp;#039;):addClass(&amp;#039;navbox-list&amp;#039;)&lt;br /&gt;
	local hlistcell = listcell:tag(&amp;#039;div&amp;#039;):addClass(&amp;#039;hlist&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local data = args[&amp;#039;list&amp;#039;..num]&lt;br /&gt;
	&lt;br /&gt;
	if data:sub(1,1) == &amp;#039;*&amp;#039; then&lt;br /&gt;
		-- Add newlines to support lists properly&lt;br /&gt;
		hlistcell&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext( data )&lt;br /&gt;
			:newline()&lt;br /&gt;
	else&lt;br /&gt;
		hlistcell:wikitext( data )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local altRow = _alternateRow()&lt;br /&gt;
	if altRow then&lt;br /&gt;
		row:addClass( args.altrowclass or &amp;#039;alt&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
		local listclass = args.altlistclass or args.listclass or false&lt;br /&gt;
		if listclass then listcell:addClass( listclass ) end&lt;br /&gt;
&lt;br /&gt;
		local liststyle = args.altliststyle or args.liststyle or false&lt;br /&gt;
		if liststyle then listcell:cssText( liststyle ) end&lt;br /&gt;
	else&lt;br /&gt;
		if args.rowclass then row:addClass( args.rowclass ) end&lt;br /&gt;
		if args.listclass then listcell:addClass( args.listclass ) end&lt;br /&gt;
		if args.liststyle then listcell:cssText( args.liststyle ) end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;#039;group&amp;#039;..num] then&lt;br /&gt;
		local groupcell = mw.html.create(&amp;#039;th&amp;#039;):addClass(&amp;#039;navbox-group&amp;#039;):attr(&amp;#039;scope&amp;#039;,&amp;#039;row&amp;#039;):wikitext( args[&amp;#039;group&amp;#039;..num] )&lt;br /&gt;
&lt;br /&gt;
		if altRow then&lt;br /&gt;
			local groupclass = args.altgroupclass or args.groupclass or false&lt;br /&gt;
			if groupclass then groupcell:addClass( groupclass ) end&lt;br /&gt;
 &lt;br /&gt;
			local groupstyle = args.altgroupstyle or args.groupstyle or false&lt;br /&gt;
			if groupstyle then groupcell:cssText( groupstyle ) end&lt;br /&gt;
		else	&lt;br /&gt;
			if args.groupclass then groupcell:addClass( args.groupclass ) end&lt;br /&gt;
			if args.groupstyle then groupcell:cssText( args.groupstyle ) end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		row:node( groupcell )&lt;br /&gt;
	else&lt;br /&gt;
		listcell:attr(&amp;#039;colspan&amp;#039;,2):addClass(&amp;#039;no-group&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	row:node( listcell )&lt;br /&gt;
&lt;br /&gt;
	local firstRow = false&lt;br /&gt;
	if not hasrows and not activeSection then&lt;br /&gt;
		firstRow = true&lt;br /&gt;
		hasrows = true&lt;br /&gt;
		_processImage(row, &amp;#039;image&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if activeSection then&lt;br /&gt;
		local parent = sections[activeSection]&lt;br /&gt;
		if not isChild or not firstRow then&lt;br /&gt;
			_addGutter(parent)&lt;br /&gt;
		end&lt;br /&gt;
		parent:node(row)&lt;br /&gt;
		hasData = true&lt;br /&gt;
	else&lt;br /&gt;
		if not isChild or not firstRow then&lt;br /&gt;
			_addGutter(navbox,not firstRow)&lt;br /&gt;
		end&lt;br /&gt;
		navbox:node( row )&lt;br /&gt;
		rowspan = rowspan + 1&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Processes all rows&lt;br /&gt;
local function processRows()&lt;br /&gt;
	sections = {}&lt;br /&gt;
	for i=1,#rownums do&lt;br /&gt;
		local num = rownums[i]&lt;br /&gt;
		if not skiprows[num] then&lt;br /&gt;
			processHeader(num)&lt;br /&gt;
			processList(num)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	_closeCurrentSection()&lt;br /&gt;
 &lt;br /&gt;
	if cimageleft then&lt;br /&gt;
		cimageleft:attr(&amp;#039;rowspan&amp;#039;,rowspan)		&lt;br /&gt;
	end&lt;br /&gt;
	if cimage then&lt;br /&gt;
		cimage:attr(&amp;#039;rowspan&amp;#039;,rowspan)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
-- ARGUMENTS PREPROCESSOR&lt;br /&gt;
-- * Extracts arguments from frame and stores them in args table&lt;br /&gt;
-- * At the same time, checks for valid row numbers&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--- Preprocessor for the arguments.&lt;br /&gt;
-- Will fill up the args table with the parameters from the frame grouped by their type.&lt;br /&gt;
--&lt;br /&gt;
-- @param frame The frame passed to the Module.&lt;br /&gt;
local function preProcessArgs(frame)&lt;br /&gt;
	local tmp = {}&lt;br /&gt;
&lt;br /&gt;
	if frame == mw.getCurrentFrame() then&lt;br /&gt;
		tmp = frame:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		tmp = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Storage tables&lt;br /&gt;
	local nums = {}&lt;br /&gt;
&lt;br /&gt;
	-- Loop over all the args&lt;br /&gt;
	for k,v in pairs(tmp) do&lt;br /&gt;
		-- Skip empty args, which are useless&lt;br /&gt;
		if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			local cat,num = tostring(k):match(&amp;#039;^(%a+)([1-9]%d*)$&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
			if cat == &amp;#039;header&amp;#039; or cat == &amp;#039;list&amp;#039; then&lt;br /&gt;
				nums[num] = true&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			args[k] = v -- Simple copy&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	colspan = args.image and 3 or 2&lt;br /&gt;
	if args.imageleft then colspan = colspan + 1 end&lt;br /&gt;
	rowspan = 0&lt;br /&gt;
&lt;br /&gt;
	if args.alternaterows == &amp;#039;swap&amp;#039; then&lt;br /&gt;
		alt = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(nums) do&lt;br /&gt;
		rownums[#rownums+1] = tonumber(k)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.sort(rownums)&lt;br /&gt;
&lt;br /&gt;
	-- Calculate skip rows&lt;br /&gt;
	local cSection, cSkip&lt;br /&gt;
	local showall = args.showall&lt;br /&gt;
	for i=1,#rownums do&lt;br /&gt;
		local num = rownums[i]&lt;br /&gt;
		if args[&amp;#039;header&amp;#039;..num] then&lt;br /&gt;
			cSection = true&lt;br /&gt;
			cSkip = false&lt;br /&gt;
			local showme = args[&amp;#039;show&amp;#039;..num]&lt;br /&gt;
			if showme == &amp;#039;no&amp;#039; then&lt;br /&gt;
				cSkip = true&lt;br /&gt;
			elseif showme == &amp;#039;auto&amp;#039; or (showme ~= &amp;#039;yes&amp;#039; and showall ~= &amp;#039;yes&amp;#039;) then&lt;br /&gt;
				if not args[&amp;#039;list&amp;#039;..num] then&lt;br /&gt;
					local nextNum = rownums[i+1]&lt;br /&gt;
					cSkip = not nextNum or args[&amp;#039;header&amp;#039;..nextNum] -- If next has a header -&amp;gt; skip&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if cSection and cSkip then&lt;br /&gt;
			skiprows[num] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
-- MAIN FUNCTIONS&lt;br /&gt;
------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--- Processes the arguments to create the navbox.&lt;br /&gt;
--&lt;br /&gt;
-- @return A string with HTML that is the navbox.&lt;br /&gt;
local function _navbox()&lt;br /&gt;
	-- Create the root HTML element&lt;br /&gt;
	local trim = function(s)&lt;br /&gt;
		return s and mw.ustring.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;) or &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local border = args.border or trim(args[1])  or &amp;#039;&amp;#039;&lt;br /&gt;
	isChild = (border == &amp;#039;child&amp;#039; or border == &amp;#039;subgroup&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if isChild then&lt;br /&gt;
		navbox = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;navbox-subgroup&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		navbox = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;navbox&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		if args.state ~= &amp;#039;plain&amp;#039; then&lt;br /&gt;
			navbox:addClass(&amp;#039;mw-collapsible&amp;#039;):attr(&amp;#039;data-expandtext&amp;#039;,args[&amp;#039;expandtext&amp;#039;] or args[&amp;#039;defaultexpandtext&amp;#039;] or showText):attr(&amp;#039;data-collapsetext&amp;#039;,args[&amp;#039;collapsetext&amp;#039;] or args[&amp;#039;defaultcollapsetext&amp;#039;] or hideText)&lt;br /&gt;
			if args.state == &amp;#039;collapsed&amp;#039; then&lt;br /&gt;
				navbox:addClass(&amp;#039;mw-collapsed&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
 	if args.bodyclass then navbox:addClass(args.bodyclass) end&lt;br /&gt;
	if args.bodystyle then navbox:cssText(args.bodystyle) end&lt;br /&gt;
&lt;br /&gt;
	-- Process...&lt;br /&gt;
	if not isChild then&lt;br /&gt;
		processTitle()&lt;br /&gt;
		processAboveBelow(&amp;#039;above&amp;#039;)&lt;br /&gt;
		processRows()&lt;br /&gt;
		processAboveBelow(&amp;#039;below&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		return tostring(navbox)&lt;br /&gt;
	else&lt;br /&gt;
		processRows()&lt;br /&gt;
&lt;br /&gt;
		local wrapper = mw.html.create(&amp;#039;&amp;#039;)&lt;br /&gt;
		wrapper:wikitext(&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
		wrapper:node(navbox)&lt;br /&gt;
		wrapper:wikitext(&amp;#039;&amp;lt;div class=&amp;quot;hlist&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
		return tostring(wrapper)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Main module entry point.&lt;br /&gt;
-- To be called with {{#invoke:navbox|main}} or directly from another module.&lt;br /&gt;
--&lt;br /&gt;
-- @param frame The frame passed to the module via the #invoke. If called from another&lt;br /&gt;
--              module directly, this should be a table with the parameter definition.&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	-- Save the arguments in a local variable so other functions can use them.&lt;br /&gt;
	preProcessArgs(frame)&lt;br /&gt;
 &lt;br /&gt;
	return _navbox()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Hugin</name></author>
	</entry>
</feed>