Module:Launching

From Sarkarverse
Revision as of 18:26, 20 January 2014 by Frietjes (talk | contribs) (fix script error, feel free to fix this another way, but should fix Template:Launching/Delta (Canaveral) and others)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

-- this module implements Template:Lanuching local p = {}

p.ShowTemplate = function(frame) local showtemp = frame.args[1]:upper() local namespace = frame.args[2]:upper() local forcedips = frame.args[3]:upper()

if showtemp == "Y" or showtemp == "YES" then return true elseif forcedisp == "Y" or forcedisp == "YES" then return true elseif namespace == "" then return false else return true end end

p.ShowDate = function(frame) local Year = "" local Month = "" local Day = "" local Hour = "" local Minute = ""

if frame.args[3] == "" then return "in the near future" else Year = frame.args[3] end

if frame.args[2] == "" then return "in " .. Year else Month = p.MonthName(frame.args[2]) end

if frame.args[1] == "" then return "in " .. Month .. " " .. Year else Day = p.trim(frame.args[1]) end

local LTime = "" --Launch Time local ConvTime = "" --Converstion to local time

if frame.args[4]=="" or frame.args[5]=="" then lTime = "" else Hour = p.pad(frame.args[4]) Minute = p.pad(frame.args[5])

LTime = Hour .. ":" .. Minute .. " UTC on " ConvTime = p.ConvertTime(frame) end

local dateformat = frame.args[6]:lower()

--Display the date in the specified format local dString = "" local atLine = ""

if LTime == "" then atLine = "on" else atLine = "at" end

if dateformat == "mdy" then dString = atLine .. " " .. LTime .. Month .. " " .. Day .. ", " .. Year .. ConvTime else dString = atLine .. " " .. LTime .. Day .. " " .. Month .. " " .. Year .. ConvTime end


return dString --test end

p.GetOffset = function(frame) local DateNow = os.time() local DateThen = p.GetDate(frame)

return os.difftime(DateNow, DateThen) end

p.IsPassed = function(frame) local Offset = p.GetOffset(frame)

if Offset > 0 then return true else return false end end

p.TimeToLaunch = function(frame) if frame.args[1] == "" then return "in the near future" elseif frame.args[2] == "" then return "in the near future" else local Offset = p.GetOffset(frame)

local Min = -60 local Hour = Min * 60 local Day = Hour * 24 local Week = Day * 7 local FN = Day * 14 --Fortnight

local oMins = tostring(math.ceil(Offset/Min)) local oHours = tostring(math.ceil(Offset/Hour)) local oDays = tostring(math.ceil(Offset/Day)) local oWeeks = tostring(math.ceil(Offset/Week))

if Offset > 0 then return "imminently or may already be in progress" elseif Offset > Min then return "in the next minute" elseif Offset > Hour then return "in the next " .. oMins .. " minutes" elseif Offset > Day then return "in the next " .. oHours .. " hours" elseif Offset > FN then return "in the next " .. oDays .. " days" else return "in the next " .. oWeeks .. " weeks" end end end

p.GetDate = function(frame) local Year = 0 local Month = 0 local Day = 0 local Hour = 0 local Minute = 0

if frame.args[3] == "" then Year = tonumber(os.date("%Y")) --Assumes current year else Year = tonumber(frame.args[3]) --Get value of year end

if frame.args[2] == "" then Month = 1 Year = Year+1 --assume start of next year else Month = tonumber(frame.args[2]) end

local mLen = p.MonthLength(Month, Year)

if frame.args[3] == "" then Day = 1 Month = Month+1 else Day = tonumber(frame.args[1]) or 0 end

if frame.args[4] == "" then Hour = 0 Minute = 0 Day = Day + 1 --use end of day, 23:59:59.99... ~ 00:00 else Hour = tonumber(frame.args[4]) Minute = tonumber(frame.args[5]) end

if Day > mLen then Month = Month+1 Day = 1 end

if Month > 12 then Year = Year+1 Month = 1 end

local d = os.time{year=Year, month=Month, day=Day, hour=Hour, min=Minute} return d end


p.MonthName = function(IMonth) --Strip leading zeros local I = p.trim(IMonth)

--For some reason lua has not switch/select case statement if I == "1" then return "January" elseif I == "2" then return "February" elseif I == "3" then return "March" elseif I == "4" then return "April" elseif I == "5" then return "May" elseif I == "6" then return "June" elseif I == "7" then return "July" elseif I == "8" then return "August" elseif I == "9" then return "September" elseif I == "10" then return "October" elseif I == "11" then return "November" elseif I == "12" then return "December" else return IMonth end end

p.MonthLength = function(I, IYear) --Returns number of days in a month local FebLen = 28 if p.IsLeap(IYear) then FebLen = 29 end

--For some reason lua has not switch/select case statement if I == 1 then return 31 elseif I == 2 then return FebLen elseif I == 3 then return 31 elseif I == 4 then return 30 elseif I == 5 then return 31 elseif I == 6 then return 30 elseif I == 7 then return 31 elseif I == 8 then return 31 elseif I == 9 then return 30 elseif I == 10 then return 31 elseif I == 11 then return 30 elseif I == 12 then return 31 else return 31 end end

p.IsLeap = function(iYear) --Determines whether a year is a leap year or not if math.fmod(iYear,400)==0 then return true elseif math.fmod(iYear,100)==0 then return false elseif math.fmod(iYear, 4)==0 then return true else return false end end

p.trim = function(s) --Removes leading zeroes from value if s:sub(1,1)=="0" then return s:sub(2) else return s end end

p.pad = function(s) local sLen = string.len(s)

if sLen == 1 then return "0" .. s else return s end end


p.zonename = function(TimeZone) local t = TimeZone:upper()

if t == "UTC" then return "UTC" elseif t == "MHT" then return "MHT" --Kwajalein elseif t == "YAKT" then return "Yakutsk Time" --Vostochny elseif t == "JST" then return "JST" --Uchinoura, Tanegashima elseif t == "KST" then return "KST" --Tonghae, Sohae, Naro elseif t == "CST" then return "CST" --Jiuquan, Taiyuan, Xichang elseif t == "AAST" then return "Almaty Time" --Baikonur elseif t == "YEKT" then return "Yekaterinburg Time" --Dombarovsky elseif t == "IST" then return "IST" --India elseif t == "MSK" then return "Moscow Time" --Plesetsk elseif t == "IRDT" then return "IRDT" --Semnan (DST) elseif t == "IRST" then return "IRST" --Semnan (Standard) elseif t == "ISDT" then return "IDT" --Palmachim (DST) elseif t == "ISST" then return "IST" --Palmachim (Standard) elseif t == "GFT" then return "GFT" --Kourou elseif t == "BRT" then return "BRT" --Alcantara elseif t == "EDT" then return "EDT" --Canaveral, Wallops/MARS (DST) elseif t == "EST" then return "EST" --Canaveral, Wallops/MARS (Standard) elseif t == "PDT" then return "PDT" --Vandenberg (DST) elseif t == "PST" then return "PST" --Vandenberg (Standard) elseif t == "AKDT" then return "AKDT" --Kodiak (DST) elseif t == "AKST" then return "AKST" --Kodiak (Standard) elseif t == "HADT" then return "AKDT" --Barking Sands (DST) elseif t == "HAST" then return "AKST" --Barking Sands (Standard) elseif t == "SL" then return "UTC-10" --Sea Launch else return TimeZone end end

p.bigoffset = function(TimeZone) local t = TimeZone:upper()

if t == "UTC" then return 0 elseif t == "MHT" then return 12 --Kwajelein elseif t == "YAKT" then return 10 --Vostochny elseif t == "JST" then return 9 --Uchinoura, Tanegashima elseif t == "KST" then return 9 --Tonghae, Sohae, Naro elseif t == "CST" then return 8 --Jiuquan, Taiyuan, Xichang elseif t == "AAST" then return 6 --Baikonur elseif t == "YEKT" then return 6 --Dombarovsky elseif t == "IST" then return 5 --India elseif t == "MSK" then return 4 --Plesetsk elseif t == "IRDT" then return 4 --Semnan (DST) elseif t == "IRST" then return 3 --Semnan (Standard) elseif t == "ISDT" then return 3 --Palmachim (DST) elseif t == "ISST" then return 2 --Palmachim (Standard) elseif t == "GFT" then return -3 --Kourou elseif t == "BRT" then return -3 --Alcantara elseif t == "EDT" then return -4 --Canaveral, Wallops/MARS (DST) elseif t == "EST" then return -5 --Canaveral, Wallops/MARS (Standard) elseif t == "PDT" then return -7 --Vandenberg (DST) elseif t == "PST" then return -8 --Vandenberg (Standard) elseif t == "AKDT" then return -8 --Kodiak (DST) elseif t == "AKST" then return -9 --Kodiak (Standard) elseif t == "HADT" then return -9 --Barking Sands (DST) elseif t == "HAST" then return -10 --Barking Sands (Standard) elseif t == "SL" then return -10 --Sea Launch else return 0 end end

p.littleoffset = function(TimeZone) local t = TimeZone:upper()

if t == "UTC" then return 0 elseif t == "IST" then return 30 elseif t == "IRST" then return 30 elseif t == "IRDT" then return 30 else return 0 end end


p.use12hc = function(TimeZone) --12 hour clock local t = TimeZone:upper()

if t == "UTC" then return false elseif t == "MHT" then return true --Kwajalein elseif t == "IST" then return true --India elseif t == "EDT" then return true --Canaveral, Wallops/MARS (DST) elseif t == "EST" then return true --Canaveral, Wallops/MARS (Standard) elseif t == "PDT" then return true --Vandenberg elseif t == "PST" then return true --Vandenberg elseif t == "AKDT" then return true --Kodiak elseif t == "AKST" then return true --Kodiak elseif t == "HADT" then return true --Barking Sands elseif t == "HAST" then return true --Barking Sands else return false end end

p.ConvertTime = function(frame) local TimeZone = frame.args[7] local oLa = p.bigoffset(TimeZone) local oSm = p.littleoffset(TimeZone) local TName = p.zonename(TimeZone) local Use12HC = p.use12hc(TimeZone)

if oLa==0 and oSm==0 then return "" else local Year = tonumber(frame.args[3]) --Get value of year local Month = tonumber(frame.args[2]) --Get value of month local Day = tonumber(frame.args[1]) --Get value of day local Hour = tonumber(frame.args[4]) --Get value of hour local Minute = tonumber(frame.args[5]) --Get value of minute

local lMin = Minute + oSm local lHour = Hour + oLa local lDay = Day local lMonth = Month

if lMin < 0 then lMin = lMin + 60 lHour = lHour - 1 elseif lMin > 59 then lMin = lMin - 60 lHour = lHour + 1 end

if lHour < 0 then lHour = lHour + 24 lDay = lDay - 1 elseif lHour > 23 then lHour = lHour - 24 lDay = lDay + 1 end

local ThisMonthLength = p.MonthLength(lMonth, Year)

local LastMonthLength = 0 if lMonth == 1 then LastMonthLength = 31 else LastMonthLength = p.MonthLength(lMonth-1, Year) end

if lDay < 1 then lDay = LastMonthLength lMonth = lMonth - 1 elseif lDay > ThisMonthLength then lDay = 1 lMonth = lMonth + 1 end

if lMonth < 1 then lMonth = 12 elseif lMonth > 12 then lMonth = 1 end

local DayOffset = "" if lDay ~= Day then MyMonth = p.MonthName(tostring(lMonth))

local dateformat = frame.args[6]:lower()

if dateformat == "mdy" then DayOffset = " on " .. MyMonth .. " " .. tostring(lDay) --american format dates else DayOffset = " on " .. tostring(lDay) .. " " .. MyMonth --normal format dates end end

--handle am/pm local LocalTime = "" if Use12HC then local ap = " a.m." if lHour == 12 then ap = " p.m." elseif lHour == 0 then lHour = 12 elseif lHour > 12 then lHour = lHour -12 ap = " p.m." end

LocalTime = tostring(lHour) .. ":" .. p.pad(tostring(lMin)) .. ap else LocalTime = p.pad(tostring(lHour)) .. ":" .. p.pad(tostring(lMin)) end

local DispTime = LocalTime .. " " .. TName .. DayOffset return " (" .. DispTime .. ")" end end


return p