Module:Sandbox/JFG/Launching explained

-- this module implements 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 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

"IST" then return "IST" --India elseif t

"YEKT" then return "Yekaterinburg Time" --Dombarovsky elseif t

"IRDT" then return "IRDT" --Semnan (DST) elseif t

"IRST" then return "IRST" --Semnan (Standard) elseif t

"MSK" then return "Moscow Time" --Plesetsk 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 9 --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

"IST" then return 5 --India elseif t

"YEKT" then return 5 --Dombarovsky elseif t

"IRDT" then return 4 --Semnan (DST) elseif t

"IRST" then return 3 --Semnan (Standard) elseif t

"MSK" then return 3 --Plesetsk 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