Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.
Module documentation[view][edit][history][purge]
This documentation is transcluded from Module:Infobox/past location/doc. Changes can be proposed in the talk page.
Function list
L 20 — methodtable.getInfobox
L 46 — renderHistoryData
L 60 — renderCoord
L 158 — methodtable.setHistoryData
L 184 — methodtable.setCategories
L 216 — methodtable.setCargoData
L 217 — processDate
L 224 — processCoord
L 231 — storePast
L 257 — methodtable.setFrame
L 264 — Past.new
L 278 — Past.main

require( 'strict' )

local Past = {}
local hatnote = require( 'Module:Hatnote' )._hatnote
local status = require( 'Module:Status' ).get_status
local common = require( 'Module:Infobox/common' )
local tabber = require( 'Module:Tabber' ).renderTabber
local cargo = mw.ext.cargo

local metatable = {}
local methodtable = {}

metatable.__index = methodtable

local config = {
	placeholder_image = 'Amusement Park Placeholder.svg'
}

--- Creates the infobox
function methodtable.getInfobox( self )
	--- All this so it won't blow up if owner or park are unknown
	local header
	local badge
	if (badge ~= nil) then
		if (self.frameArgs[ 'park' ] ~= nil) then
			header = badge .. self.frameArgs[ 'park' ]
		elseif (self.frameArgs[ 'owner' ] ~= nil) then
			header = badge .. self.frameArgs[ 'owner' ]
		else
			header = badge .. 'Unknown'
		end
	elseif (self.frameArgs[ 'park' ] ~= nil) then
		header = self.frameArgs[ 'park' ]
	elseif (self.frameArgs[ 'owner' ] ~= nil) then
		header = self.frameArgs[ 'owner' ]
	else
		header = 'Unknown'
	end
	
	local infobox = require( 'Module:Infobox' ):new( {
		placeholderImage = config.placeholder_image,
		collapsible = true,
		title = header,
	} )
	
	local function renderHistoryData( history )
		if #history == 1 then return nil end
		local content = {}
		for _, item in ipairs( history ) do
			table.insert( content, infobox:renderItem( {
				label = item.name,
				data = item.from == item.to and item.from or item.from .. ' - ' .. item.to,
				row = true,
				spacebetween = true
			} ))
		end
		return content
	end
	
	local function renderCoord( coordLat, coordLong )
		if (coordLat == nil or coordLong == nil) then
			return nil
		end
		return require( 'Module:Coordinates' )._coord({string.format("%.6f", coordLat), string.format("%.6f", coordLong)})
	end

	local country = self.frameArgs[ 'country' ]
	
	local location = self.frameArgs[ 'location' ]
	if (location == 'ship') then
		location = 'Cruise Ship'
	end
	if (self.frameArgs[ 'state' ] ~= nil) then
		location = string.gsub(location, ', ' .. self.frameArgs[ 'state' ], '')
		location = location .. ', [[' .. self.frameArgs[ 'state' ] .. ']]'	
	end
	
	if (country ~= nil) then
		if location ~= nil then
			location = string.gsub(location, ', ' .. self.frameArgs[ 'country' ], '')
			location = location .. ', [[' .. self.frameArgs[ 'country' ] .. ']]'
		end
		badge = '[[File:'.. country .. '.svg|link='.. country .. '|45px]]'
	end

	local contents = {}
	table.insert( contents, infobox:renderItem( {
		label = 'Location',
		data = location,
		row = true,
		spacebetween = true
	}))
	table.insert( contents, infobox:renderItem( {
		label = 'Name',
		data = self.frameArgs[ 'name' ],
		row = true,
		spacebetween = true
	}))
	table.insert( contents, infobox:renderItem( {
		label = 'Owner',
		data = self.frameArgs[ 'owner' ],
		row = true,
		spacebetween = true
	}))
	table.insert( contents, infobox:renderItem( {
		label = 'Coordinates',
		data = renderCoord(self.frameArgs['coord_lat'], self.frameArgs['coord_long']),
		row = true,
		spacebetween = true
	}))
	table.insert( contents, infobox:renderItem( {
		label = 'Section',
		data = common.get_section(self.frameArgs[ 'section' ],self.frameArgs[ 'subsection' ]),
		row = true,
		spacebetween = true
	}))
	table.insert( contents, infobox:renderItem( {
		label = 'Opened',
		data = self.frameArgs[ 'opened' ],
		row = true,
		spacebetween = true
	}))
	table.insert( contents, infobox:renderItem( {
		label = 'Closed',
		data = self.frameArgs[ 'closed' ],
		row = true,
		spacebetween = true
	}))
	table.insert( contents, infobox:renderItem( {
		label = 'Cost',
		data = self.frameArgs[ 'cost' ],
		row = true,
		spacebetween = true
	}))
	table.insert( contents, infobox:renderItem( {
		label = 'Replaced',
		data = self.frameArgs[ 'replaced' ],
		row = true,
		spacebetween = true
	}))
	table.insert( contents, infobox:renderItem( {
		label = 'Replacement',
		data = self.frameArgs[ 'replacement' ],
		row = true,
		spacebetween = true
	}))

	infobox:renderSection( {
		class = 'infobox__section',
		content = contents,
		col = 1
	} )
	
	local pageName = self.frameArgs['mapName'] ~= nil and self.frameArgs['mapName'] or mw.title.getCurrentTitle().text
	return infobox:renderInfobox( )
end

function methodtable.setHistoryData( self, name )
	local data = {}
	for i = 50, 1, -1 do
		local item = self.frameArgs[ name .. i ]
		if item then
			local itemFrom = self.frameArgs[ name .. i .. 'From' ]
			local itemTo = self.frameArgs[ name .. i .. 'To' ]
			itemFrom = itemFrom ~= nil and itemFrom or 'unknown'
			itemTo = itemTo ~= nil and itemTo or 'unknown'
			
			table.insert( data, {
				name = item,
				from = itemFrom,
				to = itemTo
			} )
		end
	end
	if #data == 0 and self.frameArgs[ name ] then
		table.insert( data, {
				name = self.frameArgs[ name ]
			} )
	end
	self[name .. 'History'] = data
end

--- Sets the main categories for this object
function methodtable.setCategories( self )
	if config.set_categories == false or mw.title.getCurrentTitle().namespace ~= 0 then
		return
	end
	
	if (self.frameArgs[ 'operator' ] ~= nil) then
		table.insert( self.categories, '[[Category:Past location boxes using the "operator" parameter]]' )
	end
	local country = self.frameArgs['country']
	if country then
		if country == 'USA' then
			local state = self.frameArgs['state']
			if state then
				if state == 'Georgia' then
					table.insert( self.categories, '[[Category:Amusement parks in Georgia (state)]]' )
				else
					table.insert( self.categories, string.format( '[[Category:Amusement parks in %s]]', state ) )
				end
			else
				table.insert( self.categories, '[[Category:Amusement parks in the United States]]' )
			end
		elseif country == 'ship' then
			table.insert( self.categories, '[[Category:Ships]]' )
		else
			local countryHandler = require( 'Module:Country handler' ).country
			table.insert( self.categories, string.format( '[[Category:Amusement parks in %s]]', countryHandler(country) ) )
		end
	end

end

--- Sets the cargo store for this object
function methodtable.setCargoData( self )
	local function processDate(date)
		if date ~= nil and (string.sub(date, 1, 2) == 'c.' or string.sub(date, -1) == 's') then 
			return nil
		end	
		return date
	end
	
	local function processCoord(coordLat, coordLong)
		if (coordLat ~= nil and coordLong ~= nil) then
			return string.format('%s, %s', coordLat, coordLong)
		end
		return nil
	end

	local function storePast()
	    local table = 'Roller_Coaster_Past_Locations'
	    local args = {
			Location = self.frameArgs['name'],
			Location = self.frameArgs['location'],
			Country = self.frameArgs['country'],
			State = self.frameArgs['state'],
			Park = self.frameArgs['park'],
			Opened = processDate(self.frameArgs['opened']),
			Closed = processDate(self.frameArgs['closed']),
			Operator = self.frameArgs['operator'],
			Section = self.frameArgs['section'],
			Cost = self.frameArgs['cost'],
			Replaced = self.frameArgs['replaced'],
			Replacement = self.frameArgs['replacement'],
			Construction = self.frameArgs['construction'],
			Ordering = self.frameArgs['Ordering'],
			PastCoord = processCoord(self.frameArgs['coord_lat'], self.frameArgs['coord_long'])
	    }
	    cargo.store( table, args )
	end
	storePast()
end

--- Set the frame and load args
--- @param frame table
function methodtable.setFrame( self, frame )
	self.currentFrame = frame
	self.frameArgs = require( 'Module:Arguments' ).getArgs( frame )
end


--- New Instance
function Past.new( self )
    local instance = {
        categories = {}
    }
    
    setmetatable( instance, metatable )

    return instance
end

--- "Main" entry point for templates that saves the API Data and outputs the infobox
---
--- @param frame table Invocation frame
--- @return string
function Past.main( frame )
	local instance = Past:new()
	instance:setFrame( frame )
	instance:setCategories()
	instance:setCargoData()
	local infobox = instance:getInfobox()

	return infobox .. table.concat( instance.categories )
end


return Past