This module is intended for processing of date strings.

Please do not modify this code without applying the changes first at Module:Date/sandbox and testing 
at Module:Date/sandbox/testcases and Module talk:Date/sandbox/testcases.

Authors and maintainers:

]]

 
local p = {}

-- =======================================
-- === Dependencies ======================
-- =======================================
--local i18n = require('Module:I18n/date')		-- get localized translations of date formats
--local Fallback = require('Module:Fallback')			-- get fallback functions
local yesno = require('Module:Yesno')

local i18n = {
	DateLang = {
		['ko'] = 'ko-form'
	DateFormat = {
		['ko-form'] = {
		YMD ='Y년 F j일',		
		YM ='Y년 F',		
		Y ='Y',

--
Date
 
This function is the core part of the ISOdate template. 
 
Usage:
 
Parameters:
 year,month,day,hour,minute,second: broken down date-time component strings
 lang: The language to display it in
 case: Language format  for some languages
 class: CSS class for the  node, use "" for no metadata at all

 Error Handling:

function p.Date(frame)
	return p._Date	
end

function p._Date	
	-- make sure inputs are in the right format
	if #datevec<6 then 
		for i=#datevec,6,1 do datevec[i]='' end 
	end
	if not trim_year then trim_year = '100-999' end

	-- if language is not provided than look up users language
	-- WARNING: This step should be done by the template as it does not seem to work as well here (cache issues?)
	if not lang or not mw.language.isValidCode( lang ) then
		lang = 'ko'
	end
	
	-- Just in case someone broke the internationalization code than fix the english defaults
	if i18n.DateLang['ko'] == nil then
		i18n.DateLang['ko'] = 'ko-form'
	end	
	if i18n.DateFormat['ko-form'] == nil then
		i18n.DateFormat['ko-form'] = {
		YMD ='Y년 F j일',		
		YM ='Y년 F',		
		Y ='Y',
	end

	-- create datecode based on which variables are provided and check for out of bound values
	local maxval = {9999, 12, 31} -- max values for year, month, ...
	local c = {'Y', 'M', 'D'}
	local datecode = '' -- a string signifying which combination of variables was provided
	local datenum = {} -- date-time encoded as a vector = [year, month, ... , second]
	for i, v in ipairs( datevec ) do
		if v~=nil and v~='' then
			datecode = datecode .. c[i]
			datenum[i] = tonumber(v)
			if datenum[i]==nil and i==2 then
				-- month is not a number -> check if it is a month name in English
				v = mw.language.new('en'):formatDate
				datenum[i] = tonumber(v)
			end
			if datenum[i]==nil or datenum[i]>maxval[i] then
				-- Some numbers are out of range -> abort and return the empty string
				return ''
			end
		end
	end
	
	-- create time stamp string (for example 2000-02-20 02:20:20) based on which variables were provided
	local timeStamp
	if datecode:sub=='YMD' then
		timeStamp = string.format
		datecode = 'YMD' -- 'YMD', 'YMDHMS' and 'YMDHM' are the only supported format starting with 'YMD'. All others will be converted to 'YMD'
	elseif datecode == 'YM' then
		timeStamp = string.format
	elseif datecode:sub=='Y' then
		timeStamp = string.format
		datecode = 'Y' 
	else
		return '' -- format not supported
	end

	-- ==========================================================
	-- === Create Date String using in chosen language
	-- ==========================================================
	
	-- which form should the date take? 
	-- Use Fallback module to handle rare languages which are more likely to use different for than default EN form
	local langDateForm = 'ko-form'
	
	-- Look up country specific format input to function
	local dFormat = i18n.DateFormat[langDateForm][datecode]
	
	-- Lua only date formating using parser function (new)
		-- prefered call which gives "Lua error: too many language codes requested." on the Module talk:Date/sandbox/testcases page
		--local datestr = mw.language.new(lang):formatDate 
	local datestr = mw.getCurrentFrame:callParserFunction
	
	-- If year<1000 than either keep it padded to the length of 4 digits or trim it
	-- decide if the year will stay padded with zeros (for years in 0-999 range)
	if datenum[1]~= nil and datenum[1]<1000 then
		local trim = yesno
		if trim == nil then
			local YMin, YMax = trim_year:match( '(%d+)-(%d+)' )
			trim = (YMin~=nil and datenum[1]>=tonumber(YMin) and datenum[1]<=tonumber(YMax)) 
		end
	
		-- If the date form isn't the Thai solar calendar, don't zero pad years in the range of 100-999. 
		-- If at some point support for Islamic/Hebrew/Japanese years is added, they may need to be skipped as well. 
		if trim then
			--local yearStr1 = mw.language.new(lang):formatDate
			local yearStr1 = mw.getCurrentFrame:callParserFunction
			--local yearStr1 = datestr:match( '%d%d%d%d' ) -- 4 digits in a row (in any language) - that must be a year
			local yearStr2 = yearStr1
			local zeroStr = mw.ustring.sub
			for i=1,3 do -- trim leading zeros
				if mw.ustring.sub==zeroStr then
					yearStr2 = mw.ustring.sub
				else
					break
				end
			end
			datestr = datestr:gsub
			--datestr = string.format('%s ', datestr, yearStr1, yearStr2 )
		end
	end
	
	return datestr
end