This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| yivalkes:calendar [2026/04/13 09:36] – created mangotrain | yivalkes:calendar [2026/04/27 04:52] (current) – mangotrain | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====Year==== | + | < |
| + | <!-- Hi fellow cheesebrain ;> --> | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | /* Force the calendar icon to white and the popup to dark mode */ | ||
| + | # | ||
| + | color-scheme: | ||
| + | } | ||
| + | # | ||
| + | filter: invert(1); | ||
| + | cursor: pointer; | ||
| + | } | ||
| + | </ | ||
| - | While the year used to be based off the moon cycles (Yadellna or moon year), this has changed | + | <div id=" |
| + | <strong style=" | ||
| + | <div id=" | ||
| + | <div id=" | ||
| + | </ | ||
| - | There are 8 months leading up to solstices, equinoxes, and points in between. | + | <div id=" |
| + | <span style=" | ||
| + | <div style=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | <div id=" | ||
| + | </ | ||
| + | </ | ||
| - | Each month is composed of 8 regular weeks of 5 days, plus 4 to 6 celebratory days, along with the holiday proper. | + | ====== Year ====== |
| - | The day in the month is referred | + | While the year used to be based off the moon cycles (**Yadellna** or moon year), this has changed in preference |
| - | This strange arrangement is made to preserve the week number at the single digit level, so that for example if one person simply says "Day 1", it basically | + | ====== Calendar Structure ====== |
| + | |||
| + | There are **8 months** leading up to solstices, equinoxes, and points in between. | ||
| + | |||
| + | Each month is composed of: | ||
| + | * 8 regular weeks of 5 days | ||
| + | * 4 to 6 celebratory days (**Levannas**) | ||
| + | * The holiday proper (**Sharenden**) | ||
| + | |||
| + | ====== Day and Week Logic ====== | ||
| + | |||
| + | The day in the month is referred to as **Morning-Day-Week**, | ||
| + | |||
| + | * The first day of the week is actually **10** | ||
| + | * The first week is **1** | ||
| + | * Combining these gives us **11** for the very first day | ||
| + | |||
| + | The 2nd day of the week is **20**, which would mean that the day following day 11 is actually 21, then 31, 41, 51, to end up to 12, 22, 32, and so on. | ||
| + | |||
| + | This strange arrangement is made to preserve the week number at the single digit level. For example, if one person simply says "Day 1", it basically | ||
| ^ Month ^ First day ^ 2nd day ^ 3rd day ^ 4th day ^ 5th day ^ | ^ Month ^ First day ^ 2nd day ^ 3rd day ^ 4th day ^ 5th day ^ | ||
| + | ^ Wilaf ^ Nemf ^ Doof ^ Leffe ^ Tshof ^ Bamf ^ | ||
| ^ Week 1 | 11 | 21 | 31 | 41 | 51 | | ^ Week 1 | 11 | 21 | 31 | 41 | 51 | | ||
| + | ^ Nenar | Nenarla / Shaalen / Nennelen | Binnelen | Lennelen | Gunnelen | Baniineren | | ||
| ^ Week 2 | 12 | 22 | 32 | 42 | 52 | | ^ Week 2 | 12 | 22 | 32 | 42 | 52 | | ||
| + | ^ Doolar | Doolarla / Dootslen / NeDoolen | BiDoolen | LeDoolen | KuDoolen | PanDoolen | | ||
| ^ Week 3 | 13 | 23 | 33 | 43 | 53 | | ^ Week 3 | 13 | 23 | 33 | 43 | 53 | | ||
| + | ^ Lelar | Lelarla / Nitslen / NeLaaren | BiLaaren | Lilleren | GuuLaren | Banarlen | | ||
| ^ Week 4 | 14 | 24 | 34 | 44 | 54 | | ^ Week 4 | 14 | 24 | 34 | 44 | 54 | | ||
| + | ^ Goolar | Goolarla / Tsoorelen / NeRuulen | BiRuulen * | LeRuulen | KuRuulen | Banoorlen | | ||
| ^ Week 5 | 15 | 25 | 35 | 45 | 55 | | ^ Week 5 | 15 | 25 | 35 | 45 | 55 | | ||
| + | ^ Bammar | Bammarla / Sheenelen / NeVameng | BiVameng | LeVameng | KuVameng | FaVameng * | | ||
| ^ Week 6 | 16 | 26 | 36 | 46 | 56 | | ^ Week 6 | 16 | 26 | 36 | 46 | 56 | | ||
| + | ^ Duulelar | Duulelarla / NeDuuleren | BiDuuleren | LeDuuleren | KuDuuleren | PaDuuleren | | ||
| ^ Week 7 | 17 | 27 | 37 | 47 | 57 | | ^ Week 7 | 17 | 27 | 37 | 47 | 57 | | ||
| + | ^ Niraar | Niraarla / NeNirlen | BiNirlen | LeNirlen | KuNirlen | PanNirlen / NeBellen | | ||
| ^ Last week | 10 | 20 | 30 | 40 | 50 | | ^ Last week | 10 | 20 | 30 | 40 | 50 | | ||
| + | ^ Barell | Barella / | BiGiilen | LeLiilen | GuWiilen | BaNiilen | | ||
| ^ Levannas | (6) 5 | 4 | 3 | 2 | 1/0 | | ^ Levannas | (6) 5 | 4 | 3 | 2 | 1/0 | | ||
| - | + | ^ Levannas | (Lenduley) Lembami | Lenko' | |
| + | |||
| + | * BiRuulen is a great day for beating things, like dusty cloths or aging leather. | ||
| + | |||
| + | * Favameng is a great day for silly jokes. | ||
| + | |||
| + | |||
| + | < | ||
| + | < | ||
| + | (function() { | ||
| + | function calculateYivalkes(targetDate) { | ||
| + | const currentYear = targetDate.getFullYear(); | ||
| + | const holidayDefinitions = [ | ||
| + | { name: " | ||
| + | { name: " | ||
| + | { name: "Orakk (Spring-Summer Cusp)", | ||
| + | { name: " | ||
| + | { name: " | ||
| + | { name: " | ||
| + | { name: " | ||
| + | { name: " | ||
| + | ]; | ||
| + | |||
| + | let allHolidays = []; | ||
| + | [-1, 0, 1].forEach(yearOffset => { | ||
| + | holidayDefinitions.forEach(def => { | ||
| + | const parts = def.date.split(' | ||
| + | allHolidays.push({ | ||
| + | name: def.name, | ||
| + | month: def.month, | ||
| + | monthName: def.monthName, | ||
| + | dateObj: new Date(currentYear + yearOffset, parseInt(parts[1]) - 1, parseInt(parts[2])) | ||
| + | }); | ||
| + | }); | ||
| + | }); | ||
| + | |||
| + | allHolidays.sort((a, | ||
| + | let nextHolidayIndex = allHolidays.findIndex(h => h.dateObj >= targetDate); | ||
| + | let nextHoliday = allHolidays[nextHolidayIndex]; | ||
| + | let prevHoliday = allHolidays[nextHolidayIndex - 1]; | ||
| + | |||
| + | const msPerDay = 1000 * 60 * 60 * 24; | ||
| + | const D = Math.floor((targetDate - prevHoliday.dateObj) / msPerDay); | ||
| + | const daysLeft = Math.floor((nextHoliday.dateObj - targetDate) / msPerDay); | ||
| + | |||
| + | let displayDate = ""; | ||
| + | if (daysLeft === 0) { | ||
| + | displayDate = " | ||
| + | } else if (D <= 40) { | ||
| + | let weekNum = Math.ceil(D / 5); | ||
| + | let dayInWeek = D - (weekNum - 1) * 5; | ||
| + | let weekChar = weekNum === 8 ? " | ||
| + | displayDate = "Day " + dayInWeek.toString() + weekChar + " of " + nextHoliday.month; | ||
| + | } else { | ||
| + | displayDate = " | ||
| + | } | ||
| + | return { date: displayDate, | ||
| + | } | ||
| + | |||
| + | const today = new Date(new Date().toLocaleString(" | ||
| + | today.setHours(0, | ||
| + | const currentRes = calculateYivalkes(today); | ||
| + | document.getElementById(' | ||
| + | document.getElementById(' | ||
| + | |||
| + | const picker = document.getElementById(' | ||
| + | const resultSpan = document.getElementById(' | ||
| + | picker.addEventListener(' | ||
| + | if (!e.target.value) return; | ||
| + | const parts = e.target.value.split(' | ||
| + | const selectedDate = new Date(parts[0], | ||
| + | const res = calculateYivalkes(selectedDate); | ||
| + | resultSpan.innerHTML = res.date; | ||
| + | }); | ||
| + | })(); | ||
| + | </ | ||
| + | </ | ||