export = {}
--Δεν περιέχουν frame άρα δεν μπορούν να κληθούν από Πρότυπα ή σελίδες.

local Lf = {} --τοπικές συναρτήσεις
local Ld = {} --τοπικές μεταβλητές, μπορούν να έχουν τα ίδια ονόματα με τις συναρτήσεις
--lc = {} για τοπικό πίνακα δεδομένων μέσα στις συναρτήσεις
Ld['δεδομένα'] =mw.loadData("Module:Ημερολόγια/Δεδομένα")
Ld['ημέρες'] = Ld['δεδομένα']['ημέρες']
Ld['μήνες'] = Ld['δεδομένα']['μήνες']

--local framehere = mw.getCurrentFrame()

export.testtable = function(monthnum)
	local b = export['πίνακας μήνα'] (monthnum) 
	--return framehere:preprocess(b)
	return b
end

--επιστρέφει το ποια ημέρα της εβδομάδας είναι
--χρειάζεται ημέρα του μήνα, αριθμό του μήνα και έτος
--αρχίζει από Κυριακή
export['ημέρα της εβδομάδας'] = function(daynum, monthnum, yearnum) 
    local dd = daynum
    local mm = monthnum
    local yy = yearnum
    local mmx = mm
 
    if (mm == 1) then  mmx = 13; yy = yy-1  end
    if (mm == 2) then  mmx = 14; yy = yy-1  end
 
    local val8 = dd + (mmx*2) +  math.floor(((mmx+1)*3)/5)   + yy + math.floor(yy/4)  - math.floor(yy/100)  + math.floor(yy/400) + 2
    local val9 = math.floor(val8/7)
    local dw = val8-(val9*7) 
 
    if (dw < 2 ) then
        dw = dw + 6
    else
        dw = dw - 1
    end
    return dw
end

--επιστρέφει ένα σωστό αριθμό από το 1 μέχρι το 12
--για την περίπτωση που έχουμε ξεπεράσει (κυκλικά)
--το πάνω ή το κάτω όριο 
--(μία φορά μόνο, δηλαδή από 13-23 ή από -11 μέχρι 0)
export['κανονικός αριθμός μήνα'] = function(monthnum)
    if monthnum > 12 then return monthnum - 12 end
    if monthnum < 1 then return monthnum + 12 end  
    return monthnum
end

--κονσόλα
-- δείγμα δίσεκτου (2000)
--   =p['είναι δίσεκτο'](2000)
--δείγμα κανονικού (2100)
--   =p['είναι δίσεκτο'](2100)
export['είναι δίσεκτο'] = function(yearnum)
    local yearnum = tonumber(yearnum)
    return (yearnum % 4 == 0 and (yearnum % 100 ~= 0 or yearnum % 400 == 0))
end

--επιστρέφει τον αριθμό των ημερών από την πρώτη πρώτου για δίσεκτα έτη
--για να βρείτε τον αριθμό έτους 365 ημερών κάντε τις ανάλογες πράξεις
--(αν είναι <60 δεν κάνουμε τίποτε, αλλιώς αφαιρούμε 1)
export['ημέρα έτους 366'] = function( daynum, monthnum)
	local b0 =  os.time{year=1996,month=1,day=0 }
	local b1 =  os.time{year=1996,month=tonumber(monthnum),day=tonumber(daynum)}
	local b2 = os.difftime(b1, b0) / (24 * 60 * 60)
    return math.floor(b2)
end

--επιστρέφει πίνακα time με την ημερομηνία για το δίσεκτο 1966
export['ημερομηνία έτους 366'] = function(daynum)
    return os.date('*t', os.time{year=1996,month=1,day=daynum })
end

--επιστρέφει ή για τα 20, 30, 40 κλπ.
export['η'] = function(daymonthnum)
    local h = "η"
    local intpart, fracpart = math.modf(tonumber(daymonthnum) / 10)
    if tonumber(fracpart) == 0 and tonumber(intpart) > 1 then h = "ή" end
    --mw.log("mw.log Lf['η']               ===#" .. intpart .. "#" .. fracpart .. "#" .. h)
    return h
end

--επιστρέφει α για 2 και 22, αλλιώς ότι και export['η']
export['α'] = function(daymonthnum)
    local n = tonumber(daymonthnum)
    if n == 2 or n == 22 then return "α" end
    return export['η'](n)
end

--*******************************************************************************************************
--επιστρέφει τους μήνες στη σειρά όπως εμφανίζονται στο λήμμα κάθε μήνα
--δεν χρειάζεται bold γιατί η παραπομπή στο ίδιο λήμμα το κάνει bold
export['μήνες στη σειρά'] = function()
    local lc = {}
	lc['γραμμή'] = '<center>'
	for xcounter = 1,11 do
		lc['γραμμή'] = lc['γραμμή'] .. '[[' .. Ld['μήνες'][xcounter]['όνομα'] .. ']] | '
	end
	lc['γραμμή'] = lc['γραμμή'] .. '[[' .. Ld['μήνες'][12]['όνομα'] .. ']]' .. '</center>'
	return lc['γραμμή'] 
end

--επιστρέφει τους 5 μήνες στη σειρά όπως εμφανίζονται στο λήμμα κάθε ημερομηνίας
export['μήνες στη σειρά 5']  = function (monthnum)
    local lc = {}
	lc['γραμμή'] = '<center>'
	lc['μήνας'] = tonumber(monthnum)
    lc['παραπομπή'] = {}
    for xcounter = -2,2 do
        lc['παραπομπή'][xcounter + 3] = '[[' .. Ld['μήνες'][export['κανονικός αριθμός μήνα'](lc['μήνας'] + xcounter)]['όνομα'] .. ']]' 
    end
    lc['παραπομπή'][3] = "'''" .. lc['παραπομπή'][3] .. "'''"
	lc['γραμμή'] = lc['γραμμή'] .. table.concat( lc['παραπομπή'], " | ") .. '</center>'
    return lc['γραμμή']
end

--επιστρέφει τις ημέρες στη σειρά όπως εμφανίζονται στο λήμμα κάθε μήνα
export['ημέρες στη σειρά'] = function(monthnum)
    local lc = {}
	lc['γραμμή'] = '<center>'
	lc['μήνας'] = tonumber(monthnum)
	lc['γενική μήνα'] = Ld['μήνες'][lc['μήνας']]['γεν']
    lc['ημέρες μήνα'] = Ld['μήνες'][lc['μήνας']]['ημ']
    
	for xcounter = 1, lc['ημέρες μήνα']-1 do
		lc['γραμμή'] = lc['γραμμή'] .. '[[' .. xcounter .. ' ' .. lc['γενική μήνα'] .. '|' .. xcounter .. ']] | '
	end
    lc['τέλος'] = '[[' .. lc['ημέρες μήνα'] .. ' ' .. lc['γενική μήνα'] .. '|' .. lc['ημέρες μήνα'] .. ']]'
    if lc['μήνας'] == 2 then lc['τέλος'] = "''" .. lc['τέλος'] .. "''" end
    lc['γραμμή'] = lc['γραμμή'] .. lc['τέλος'] .. '</center>'
	return lc['γραμμή']
end


--επιστρέφει τον πίνακα για το τρέχον έτος
--για συγκεκριμένο μήνα
export['πίνακας μήνα'] = function(monthnum)
    local lc = {}
    lc['ημέρες'] = {}--local currentdays = {}
    lc['αριθμός'] = 0 --local tmpnum = 0
    lc['αριθμός μήνα'] = tonumber(monthnum) --local monthnum = tonumber(monthnum)
    lc['όνομα μήνα'] = Ld['μήνες'][lc['αριθμός μήνα']]['όνομα'] --local monthname = Ld['μήνες'][monthnum]['όνομα']
    lc['μήνας στη γενική'] = Ld['μήνες'][lc['αριθμός μήνα']]['γεν'] --local monthg = Ld['μήνες'][monthnum]['γεν']
    lc['έτος'] = os.date('*t').year --local etos = os.date('*t').year
    lc['πρώτη ημέρα'] = export['ημέρα της εβδομάδας'] (1, lc['αριθμός μήνα'], lc['έτος']) --firstday
    
    if lc['πρώτη ημέρα'] == 7 then
    	lc['πρώτη ημέρα'] = 1
	else
		lc['πρώτη ημέρα'] = lc['πρώτη ημέρα'] + 1
	end
	
    lc['ημέρες μήνα'] = Ld['μήνες'][lc['αριθμός μήνα']]['ημ'] --local monthdays = Ld['μήνες'][monthnum]['ημ'] 
    --φέρνει 29 για το φλεβάρη
    if lc['αριθμός μήνα'] == 2 and (not export['είναι δίσεκτο'](lc['έτος'])) then lc['ημέρες μήνα'] = 28 end
    for xcounter = 1,7 do
        if lc['πρώτη ημέρα'] > xcounter then 
            lc['ημέρες'][xcounter] = '|colspan="1"| &nbsp;'
        else
            lc['αριθμός'] = (xcounter - lc['πρώτη ημέρα'] + 1)
            lc['ημέρες'][xcounter] = '| [[' .. lc['αριθμός'] .. ' ' .. lc['μήνας στη γενική'] .. '|' .. lc['αριθμός'] ..']]'
        end
    end
    for xcounter = 8,28 do
        lc['αριθμός'] = (xcounter - lc['πρώτη ημέρα'] + 1)
        lc['ημέρες'][xcounter] = '| [[' .. lc['αριθμός'] .. ' ' .. lc['μήνας στη γενική'] .. '|' .. lc['αριθμός'] ..']]'
    end
    for xcounter = 29,35 do
        if lc['ημέρες μήνα'] + lc['πρώτη ημέρα'] > xcounter then 
            lc['αριθμός'] = (xcounter - lc['πρώτη ημέρα'] + 1)
            lc['ημέρες'][xcounter] = '| [[' .. lc['αριθμός'] .. ' ' .. lc['μήνας στη γενική'] .. '|' .. lc['αριθμός'] ..']]'
        else
            lc['ημέρες'][xcounter] = '|colspan="1"| &nbsp;'
        end
    end
 
    lc['πίνακας'] = [=[{| class="toccolours" style="float:right; margin-left: 1em; text-align:center;"
|- style="background:#ccccff;"
|colspan="7"|'''[[]=] ..  lc['όνομα μήνα']  ..  [=[]]''' 
|- style="background:#ccccff;"
|width="14%"| Κυρ.
|width="14%"| Δευτ.
|width="14%"| Τρ.
|width="14%"| Τετ.
|width="14%"| Πεμ.
|width="14%"| Παρ.
|width="14%"| Σαβ.
|-]=]
    lc['ημέρες για εμφάνιση'] = 0 --local daytoshow = 0
    for ycounter = 1,5 do
        for xcounter = 1,7 do
            --if ycounter < 2 then
                --daytoshow = xcounter
            --else
            lc['ημέρες για εμφάνιση'] = (((ycounter - 1 ) * 7) + xcounter)
            --mw.log(type(lc['ημέρες για εμφάνιση']))
            lc['πίνακας'] = lc['πίνακας'] .. '\n' .. lc['ημέρες'][lc['ημέρες για εμφάνιση']] .. '\n'
        end
        lc['πίνακας'] = lc['πίνακας'] .. '\n' .. '|-'
        --αν έχει 28 ημέρες και τις έχεις ήδη δείξει βγες
        if (lc['ημέρες μήνα'] + lc['πρώτη ημέρα']) < 29 and (lc['ημέρες για εμφάνιση'] > 27) then break end
    end
    lc['πίνακας'] = lc['πίνακας'] .. [=[
 
|colspan="7"| &nbsp;
|- style="background:#ccccff"
|colspan="7"| [[]=] .. lc['έτος'] .. ']]\n' .. [=[
|}]=]
    return lc['πίνακας']	
end

export['γραμμή ορισμού'] = function(dayofyear)
    local lc = {}
    lc['ημέρα του έτους'] = dayofyear
    lc['προηγούμενη'] = export['ημερομηνία έτους 366'](lc['ημέρα του έτους']-1)
    lc['τρέχουσα'] = export['ημερομηνία έτους 366'](lc['ημέρα του έτους'])
    lc['επόμενη'] = export['ημερομηνία έτους 366'](lc['ημέρα του έτους']+1)
    lc['υπολείπονται'] = 365 - lc['ημέρα του έτους']
    -- η ημέρα του μήνα υπολογίζεται με βάση τα δίσεκτα έτη
    --οπότε στις ημέρες μετά την 59η θα πρέπει να χρησιμοποιούμε "προηγούμενους" αριθμούς...
    lc['γραμμή ορισμού'] = "<center>H '''" .. lc['τρέχουσα']['day'] .. export['α'](lc['τρέχουσα']['day'])  .. ' ' .. Ld['μήνες'][lc['τρέχουσα']['month']]['γεν'] .. "''' είναι η "
    --mw.log(Ld['τρίτη γραμμή'])
    lc['η'] = export['η'](lc['ημέρα του έτους'])
    if lc['ημέρα του έτους'] < 59  then
        lc['γραμμή ορισμού'] = lc['γραμμή ορισμού'] .. lc['ημέρα του έτους'] .. lc['η'] .. " μέρα του έτους κατά το [[Γρηγοριανό Hμερολόγιο]]. Υπολείπονται "
        lc['γραμμή ορισμού'] = lc['γραμμή ορισμού'] .. lc['υπολείπονται'] .. ' ημέρες (' .. lc['υπολείπονται'] + 1 .. ' σε δίσεκτα έτη).' 
    elseif lc['ημέρα του έτους'] == 59 then
        lc['γραμμή ορισμού'] = lc['γραμμή ορισμού'] .. "59η μέρα του έτους κατά το [[Γρηγοριανό Hμερολόγιο]]. Υπολείπονται 306 ημέρες (307 σε δίσεκτα έτη)."
    elseif lc['ημέρα του έτους'] == 60 then
        lc['γραμμή ορισμού'] = lc['γραμμή ορισμού'] .. "60ή ημέρα του δίσεκτου έτους κατά το [[Γρηγοριανό Hμερολόγιο]]. Υπολείπονται 306 ημέρες. "
        lc['γραμμή ορισμού'] = lc['γραμμή ορισμού'] .. "Τα έτη που έχουν 29 μέρες στον [[Φεβρουάριος|Φεβρουάριο]] είναι εξ ορισμού [[Δίσεκτο έτος|δίσεκτα]]."
    elseif lc['ημέρα του έτους'] == 61 then
        lc['έξτρα'] = export['ημερομηνία έτους 366'](lc['ημέρα του έτους']-2)
        lc['γραμμή ορισμού'] = lc['γραμμή ορισμού'] .. "60ή ημέρα του έτους κατά το [[Γρηγοριανό Hμερολόγιο]] (61η σε δίσεκτα έτη). Υπολείπονται 305 ημέρες."
    else
        lc['η2'] = export['η'](lc['ημέρα του έτους']-1)  
        lc['γραμμή ορισμού'] = lc['γραμμή ορισμού'] .. lc['ημέρα του έτους']-1 .. lc['η2'] .. " μέρα του έτους κατά το [[Γρηγοριανό Hμερολόγιο]] ("
        lc['γραμμή ορισμού'] = lc['γραμμή ορισμού'] .. lc['ημέρα του έτους'] .. lc['η'] .. ' σε δίσεκτα έτη). Υπολείπονται ' .. lc['υπολείπονται'] + 1 .. ' ημέρες.' 
    end
    lc['γραμμή ορισμού'] = lc['γραμμή ορισμού'] .. '</center>'
    return lc['γραμμή ορισμού']
end

--επιστρέφει τις ημέρες στη σειρά όπως εμφανίζονται στο λήμμα κάθε ημερομηνίας
--(3 ή 4 ανάλογα)
export['ημέρες στη σειρά 34'] = function(dayofyear)
    local lc = {}
    lc['ημέρα του έτους'] = dayofyear
	lc['γραμμή'] = '<center>'
    lc['προηγούμενη'] = export['ημερομηνία έτους 366'](lc['ημέρα του έτους']-1)
    lc['τρέχουσα'] = export['ημερομηνία έτους 366'](lc['ημέρα του έτους'])
    lc['επόμενη'] = export['ημερομηνία έτους 366'](lc['ημέρα του έτους']+1)
	
	lc['παραπομπές'] = {}
	lc['παραπομπές'][1] = "[[" .. lc['προηγούμενη']['day'] .. ' ' .. Ld['μήνες'][lc['προηγούμενη']['month']]['γεν'] .. "]]"
	lc['παραπομπές'][2] = "'''[[" .. lc['τρέχουσα']['day'] .. ' ' .. Ld['μήνες'][lc['τρέχουσα']['month']]['γεν'] .. "]]'''"
	lc['παραπομπές'][3] = "[[" .. lc['επόμενη']['day'] .. ' ' .. Ld['μήνες'][lc['επόμενη']['month']]['γεν'] .. "]]"
	if lc['ημέρα του έτους'] == 61 then
		lc['εξτρά'] = export['ημερομηνία έτους 366'](lc['ημέρα του έτους']-2)
		table.insert( lc['παραπομπές'], 1, "[[" .. lc['εξτρά']['day'] .. ' ' .. Ld['μήνες'][lc['εξτρά']['month']]['γεν'] .. "]]" )
		lc['παραπομπές'][2] = "''" .. lc['παραπομπές'][2]  .. "''"
	elseif lc['ημέρα του έτους'] == 59 then
		lc['εξτρά'] = export['ημερομηνία έτους 366'](lc['ημέρα του έτους']+2)
		table.insert( lc['παραπομπές'], "[[" .. lc['εξτρά']['day'] .. ' ' .. Ld['μήνες'][lc['εξτρά']['month']]['γεν'] .. "]]" )
		lc['παραπομπές'][3] = "''" .. lc['παραπομπές'][3]  .. "''"
	end
	lc['γραμμή'] = lc['γραμμή'] .. table.concat( lc['παραπομπές'], " | ") .. '</center>'
	return lc['γραμμή']
end
return export