# Module:Celestial object quadrangle

-- This module implements/replaces  
-- Template:Lunar quadrangle  
-- Template:Mars quadrangle  
-- Template:Venus quadrangle  
local p = {}  

local function moonquad(lat, lon)  
local function LQ(n)  
if n < 10 then  
return 'LQ0' .. n  
else  
return 'LQ' .. n  
end  
end  
-- Note: requires positive longitude coordinates  
if lat > 65 then  
return LQ(1)  
elseif lat > 30 then  
if lon >= 180 then  
return LQ(2 + math.floor( (lon - 180) / 60 ) )  
else  
return LQ(5 + math.floor( lon / 60 ) )  
end  
elseif lat >= 0 then  
if lon >= 180 then  
return LQ(8 + math.floor( (lon - 180) / 45 ) )  
else  
return LQ(12 + math.floor( lon / 45 ) )  
end  
elseif lat >= -30 then  
if lon >= 180 then  
return LQ(16 + math.floor( (lon - 180) / 45 ) )  
else  
return LQ(20 + math.floor( lon / 45 ) )  
end  
elseif lat >= -65 then  
if lon >= 180 then  
return LQ(24 + math.floor( (lon - 180) / 60 ) )  
else  
return LQ(27 + math.floor( lon / 60 ) )  
end  
else  
return LQ(30)  
end  

return 'Error'  
end  

local function marsquad(lat, lon)  
-- Note: requires positive longitude coordinates  
if lat > 65 then  
return 'Mare Boreum'  
elseif lat > 30 then  
if lon < 60 then return 'Ismenius Lacus'  
elseif lon < 120 then return 'Casius'  
elseif lon < 180 then return 'Cebrenia'  
elseif lon < 240 then return 'Diacria'  
elseif lon < 300 then return 'Arcadia'  
else return 'Mare Acidalium' end  
elseif lat >= 0 then  
if lon < 45 then return 'Arabia'  
elseif lon < 90 then return 'Syrtis Major'  
elseif lon < 135 then return 'Amenthes'  
elseif lon < 180 then return 'Elysium'  
elseif lon < 225 then return 'Amazonis'  
elseif lon < 270 then return 'Tharsis'  
elseif lon < 315 then return 'Lunae Palus'  
else return 'Oxia Palus' end  
elseif lat >= -30 then  
if lon < 45 then return 'Sinus Sabaeus'  
elseif lon < 90 then return 'Iapygia'  
elseif lon < 135 then return 'Mare Tyrrhenum'  
elseif lon < 180 then return 'Aeolis'  
elseif lon < 225 then return 'Memnonia'  
elseif lon < 270 then return 'Phoenicis Lacus'  
elseif lon < 315 then return 'Coprates'  
else return 'Margaritifer Sinus' end  
elseif lat >= -65 then  
if lon < 60 then return 'Noachis'  
elseif lon < 120 then return 'Hellas'  
elseif lon < 180 then return 'Eridania'  
elseif lon < 240 then return 'Phaethontis'  
elseif lon < 300 then return 'Thaumasia'  
else return 'Argyre' end  
else  
return 'Mare Australe'  
end  
end  

local function mercuryquad(lat, lon)  
-- Note: requires positive longitude coordinates  
if lat >= 66 then  
return 'Borealis'  
elseif lat >= 21 then  
if lon < 90 then return 'Hokusai'  
elseif lon < 180 then return 'Raditladi'  
elseif lon < 270 then return 'Shakespeare'  
else return 'Victoria' end  
elseif lat > -21 then  
if lon < 72 then return 'Derain'  
elseif lon < 144 then return 'Eminescu'  
elseif lon < 216 then return 'Tolstoj'  
elseif lon < 288 then return 'Beethoven'  
else return 'Kuiper' end  
elseif lat > -66 then  
if lon < 90 then return 'Debussy'  
elseif lon < 180 then return 'Neruda'  
elseif lon < 270 then return 'Michelangelo'  
else return 'Discovery' end  
else  
return 'Bach'  
end  

return 'Error'  
end  

local function venusquad(lat, lon)  
-- Note: requires positive longitude coordinates  
if lat > 57 then  
return 'Ishtar Terra'  
elseif lat >= 0 then  
if lon < 60 or lon >= 300 then return 'Sedna Planitia'  
elseif lon < 180 then return 'Niobe Planitia'  
else return 'Guinevere Planitia' end  
elseif lat >= -57 then  
if lon < 60 or lon >= 300 then return 'Lavinia Planitia'  
elseif lon < 180 then return 'Aphrodite Terra'  
else return 'Helen Planitia' end  
else  
return 'Lada Terra'  
end  
end  

local function quad_name(lat, lon, globe)  
-- lower case  
globe = globe:lower or ''  

-- convert to numbers  
lat = tonumber(lat) or ''  
lon = tonumber(lon) or ''  

-- get the quad name  
if lat ~= * and lon ~= * and globe ~= '' then  
if lon < 0 then lon = lon + 360 end  
if lon < 0 or lon > 360 then  
return 'Error'  
end  
if globe == 'mars' then  
return marsquad(lat, lon)  
elseif globe == 'mercury' then  
return mercuryquad(lat, lon)  
elseif globe == 'moon' then  
return moonquad(lat, lon)  
elseif globe == 'venus' then  
return venusquad(lat, lon)  
end  
end  

return 'Error'  
end  

function p.category  
local args = .args  
local res = quad_name(args['lat'] or *, args['lon'] or *, args['globe'] or '')  

if res ~= 'Error' then  
if args['nameonly'] and args['nameonly'] ~= '' then  
return res  
else  
return ''  
end  
end  

return '<span>Error</span>'  
end  

function p.name  
local args = .args  
local res = quad_name(args['lat'] or *, args['lon'] or *, args['globe'] or '')  

if res ~= 'Error' then  
return res  
end  
return '<span>Error</span>'  
end  

return p