{"version":3,"sources":["jsdelivr-header.js","/gh/valantish-sys/pieria-map@main/eortpc21.js"],"names":[],"mappings":"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","file":"/gh/valantish-sys/pieria-map@main/eortpc21.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /gh/valantish-sys/pieria-map@main/eortpc21.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(() => {\n    \"use strict\";\n\n    const CONFIG = Object.freeze({\n        weather: {\n            lat: 40.2711,\n            lon: 22.5044,\n            url: \"https://api.open-meteo.com/v1/forecast?latitude=40.2711&longitude=22.5044&hourly=temperature_2m,apparent_temperature,weather_code&timezone=auto&forecast_days=3\"\n        },\n        jsonUrl: 'https://cdn.jsdelivr.net/gh/valantish-sys/pieria-map@main/eortvasi3.json' \n    });\n  const DataEngineAPI = {\n        dictionaries: { fixedNames: {}, fixedHolidays: {}, worldDays: {} },\n        fetchData: async () => {\n            try {\n                // Σπάει την cache ανά 1 ώρα, προστατεύοντας το CDN\n                const cacheBuster = Math.floor(Date.now() / 3600000);\n                const response = await fetch(CONFIG.jsonUrl + \"?v=\" + cacheBuster);\n                \n                if (!response.ok) throw new Error(\"Σφάλμα HTTP\");\n                const data = await response.json();\n                \n                DataEngineAPI.dictionaries = {\n                    fixedNames: data.fixedNames || {},\n                    fixedHolidays: data.fixedHolidays || {},\n                    worldDays: data.worldDays || {}\n                };\n            } catch (e) {\n                console.warn(\"Το JSON με το Εορτολόγιο (Desktop) δεν φόρτωσε σωστά:\", e);\n            }\n        }\n    };\n\n    const Utils = {\n        getNthDayOfMonth: (year, month, dayOfWeek, n) => {\n            const firstDay = new Date(year, month - 1, 1).getDay();\n            const offset = (dayOfWeek - firstDay + 7) % 7;\n            return 1 + offset + (n - 1) * 7;\n        },\n        getLastDayOfMonth: (year, month, dayOfWeek) => {\n            const d = new Date(year, month, 0); \n            const offset = (d.getDay() - dayOfWeek + 7) % 7;\n            return d.getDate() - offset;\n        },\n        getOrthodoxEaster: (year) => {\n            const a = year % 19, b = year % 4, c = year % 7;\n            const d = (19 * a + 15) % 30;\n            const e = (2 * b + 4 * c + 6 * d + 6) % 7;\n            const easterDate = new Date(year, 2, 22);\n            easterDate.setDate(easterDate.getDate() + (d + e + 13));\n            return easterDate;\n        },\n        getDaysDiff: (date1, date2) => {\n            const utc1 = Date.UTC(date1.getFullYear(), date1.getMonth(), date1.getDate());\n            const utc2 = Date.UTC(date2.getFullYear(), date2.getMonth(), date2.getDate());\n            return Math.round((utc1 - utc2) / (1000 * 60 * 60 * 24));\n        }\n    };\n\n    const DateEngine = {\n        today: new Date(),\n        viewDate: new Date(), // ΝΕΟ: Η ημερομηνία που ελέγχει ο χρήστης\n        \n        init: function() {\n            // Υπολογισμοί με βάση το viewDate αντί για το today\n            this.y = this.viewDate.getFullYear();\n            this.m = this.viewDate.getMonth() + 1;\n            this.d = this.viewDate.getDate();\n            this.dateKey = `${this.m}-${this.d}`;\n            \n            this.easter = Utils.getOrthodoxEaster(this.y);\n            this.diffFromEaster = Utils.getDaysDiff(this.viewDate, this.easter);\n            this.isLeapYear = (this.y % 4 === 0 && this.y % 100 !== 0) || (this.y % 400 === 0);\n            this.isGeorgeMoved = (this.easter >= new Date(this.y, 3, 23));\n\n            this.calculateMovableWorldDays();\n        },\n        \n        // Συνάρτηση για αλλαγή ημέρας από τα βελάκια\n        changeDay: function(offset) {\n            this.viewDate.setDate(this.viewDate.getDate() + offset);\n            this.init(); \n        },\n        calculateMovableWorldDays: function() {\n            const y = this.y;\n            const eq = new Date(y, 2, 20);\n            const sleepOffset = ((eq.getDay() + 1) % 7) + 1;\n            const sleepDate = new Date(y, 2, 20 - sleepOffset);\n            const storytellingDay = Math.floor(20.25 - (y - 2000) * 0.0025);\n\n            this.movableDays = {\n                isSleepDay: (this.m === sleepDate.getMonth() + 1 && this.d === sleepDate.getDate()),\n                isStorytellingDay: (this.m === 3 && this.d === storytellingDay),\n                isMotherDay: (this.m === 5 && this.d === Utils.getNthDayOfMonth(y, 5, 0, 2)),\n                isFatherDay: (this.m === 6 && this.d === Utils.getNthDayOfMonth(y, 6, 0, 3)),\n                isSaferInternetDay: (this.m === 2 && this.d === Utils.getNthDayOfMonth(y, 2, 2, 2)),\n                isSmileDay: (this.m === 10 && this.d === Utils.getNthDayOfMonth(y, 10, 5, 1)),\n                isTrafficVictimsDay: (this.m === 11 && this.d === Utils.getNthDayOfMonth(y, 11, 0, 3)),\n                isVetDay: (this.m === 4 && this.d === Utils.getLastDayOfMonth(y, 4, 6)),\n                isProgrammerDay: (this.m === 9 && this.d === (this.isLeapYear ? 12 : 13)),\n                isCoastalCleanup: (this.m === 9 && this.d === Utils.getNthDayOfMonth(y, 9, 6, 3)),\n                isResearchersNight: (this.m === 9 && this.d === Utils.getLastDayOfMonth(y, 9, 5)),\n                isBirdwatch: (this.m === 10 && (this.d === Utils.getNthDayOfMonth(y, 10, 6, 1) || this.d === Utils.getNthDayOfMonth(y, 10, 0, 1))),\n                isHabitatArchDay: (this.m === 10 && this.d === Utils.getNthDayOfMonth(y, 10, 1, 1)),\n                isSightDay: (this.m === 10 && this.d === Utils.getNthDayOfMonth(y, 10, 4, 2)),\n                isPhilosophyDay: (this.m === 11 && this.d === Utils.getNthDayOfMonth(y, 11, 4, 3)),\n                isBuyNothingDay: (this.m === 11 && this.d === (Utils.getNthDayOfMonth(y, 11, 4, 4) + 1)),\n                isMaritimeDay: (this.m === 9 && this.d === Utils.getLastDayOfMonth(y, 9, 4)),\n               isLighthouseDay: (this.m === 8 && this.d === Utils.getNthDayOfMonth(y, 8, 0, 3)),\n                isHospiceDay: (this.m === 10 && this.d === Utils.getNthDayOfMonth(y, 10, 6, 2)),\n                isNoiseDay: (this.m === 4 && this.d === Utils.getLastDayOfMonth(y, 4, 3)),\n              isMarriageDay: (this.m === 2 && this.d === Utils.getNthDayOfMonth(y, 2, 0, 2)),\n                isMigratoryBirdDay: ((this.m === 5 || this.m === 10) && this.d === Utils.getNthDayOfMonth(y, this.m, 6, 2)),\n               isMacedonianStruggle: (this.m === 10 && this.d >= 14 && this.d <= 20 && new Date(y, 9, this.d).getDay() === 0),\n                isSummerTime: (this.m === 3 && this.d === Utils.getLastDayOfMonth(y, 3, 0)),\n                isWinterTime: (this.m === 10 && this.d === Utils.getLastDayOfMonth(y, 10, 0))\n            };\n        }\n    };\n\n    const HolidayEngine = {\n        getWorldDays: () => {\n            let days = [];\n            if (DataEngineAPI.dictionaries.worldDays[DateEngine.dateKey]) days.push(DataEngineAPI.dictionaries.worldDays[DateEngine.dateKey]);\n            const mov = DateEngine.movableDays;\n            if (mov.isSleepDay) days.push(\"💤 Παγκόσμια Ημέρα Ύπνου\");\n            if (mov.isStorytellingDay) days.push(\"📖 Παγκόσμια Ημέρα Αφήγησης\");\n            if (mov.isMotherDay) days.push(\"🌸 Γιορτή της Μητέρας\");\n            if (mov.isFatherDay) days.push(\"👔 Γιορτή του Πατέρα\");\n            if (mov.isSaferInternetDay) days.push(\"🔒 Ημέρα Ασφαλούς Διαδικτύου\");\n            if (mov.isSmileDay) days.push(\"😁 Παγκόσμια Ημέρα Χαμόγελου\");\n            if (mov.isTrafficVictimsDay) days.push(\"🚗 Παγκόσμια Ημέρα Μνήμης Θυμάτων Τροχαίων Ατυχημάτων\");\n            if (mov.isVetDay) days.push(\"⚕️ Παγκόσμια Ημέρα Κτηνιατρικής\");\n            if (mov.isProgrammerDay) days.push(\"💻 Παγκόσμια Ημέρα Προγραμματιστή\");\n            if (mov.isCoastalCleanup) days.push(\"🏖️ Παγκόσμια Ημέρα Εθελοντικού Καθαρισμού των Ακτών / 🐧 Παγκόσμια Ημέρα Ελεύθερου Λογισμικού\");\n            if (mov.isResearchersNight) days.push(\"🔬 Βραδιά του Ερευνητή\");\n            if (mov.isBirdwatch) days.push(\"🐦 Πανευρωπαϊκή Γιορτή των Πουλιών\");\n            if (mov.isHabitatArchDay) days.push(\"🏘️ Παγκόσμια Ημέρα Κατοικίας / 🏛️ Παγκόσμια Ημέρα Αρχιτεκτονικής\");\n            if (mov.isSightDay) days.push(\"👁️ Παγκόσμια Ημέρα Όρασης - Κατά της Τύφλωσης\");\n            if (mov.isPhilosophyDay) days.push(\"🤔 Παγκόσμια Ημέρα Φιλοσοφίας\");\n            if (mov.isBuyNothingDay) days.push(\"🛍️ Παγκόσμια Ημέρα Αγοραστικής Αποχής\");\n            if (mov.isMaritimeDay) days.push(\"⚓ Παγκόσμια Ναυτική Ημέρα\");\n            if (mov.isLighthouseDay) days.push(\"🗼 Παγκόσμια Ημέρα Φάρων\");\n            if (mov.isHospiceDay) days.push(\"🏥 Παγκόσμια Ημέρα Ξενώνων και Παρηγορητικής Φροντίδας\");\n            if (mov.isNoiseDay) days.push(\"🤫 Διεθνής Ημέρα κατά του Θορύβου\");\n          if (mov.isMarriageDay) days.push(\"💍 Παγκόσμια Ημέρα του Γάμου\");\n            if (mov.isMigratoryBirdDay) days.push(\"🦅 Παγκόσμια Ημέρα Αποδημητικών Πτηνών\");\n            if (mov.isSummerTime) days.push(\"⏰ Έναρξη Θερινής Ώρας (+1 ώρα)\");\n            if (mov.isWinterTime) days.push(\"⏰ Έναρξη Χειμερινής Ώρας (-1 ώρα)\");\n            if (mov.isBuyNothingDay) days.push(\"🛒 Black Friday\"); // (Η Black Friday πέφτει πάντα ακριβώς τη μέρα της Αγοραστικής Αποχής!)\n            return days;\n        },\n        getHolidays: () => {\n            let holidays = [];\n            const diff = DateEngine.diffFromEaster;\n            \n            // 1. Κινητές Γιορτές με βάση το Πάσχα (Αλυσίδα diff)\n            if (diff === -70) holidays.push(\"📖 Κυριακή Τελώνου και Φαρισαίου (Αρχή Τριωδίου)\");\n            else if (diff === -59) holidays.push(\"🍖 Τσικνοπέμπτη!\");\n            else if (diff === -57) holidays.push(\"🕯️ Α' Ψυχοσάββατο\");\n            else if (diff === -49) holidays.push(\"🎭 Κυριακή της Αποκριάς (Τυρινής)\");\n            else if (diff === -48) holidays.push(\"🪁 Καθαρά Δευτέρα (Αργία)\");\n            else if (diff === -42) holidays.push(\"⛪ Κυριακή της Ορθοδοξίας\");\n            else if (diff === -28) holidays.push(\"✝️ Κυριακή της Σταυροπροσκυνήσεως\");\n            else if (diff === -16) holidays.push(\"⛪ Παρασκευή του Ακαθίστου Ύμνου\");\n            else if (diff === -8) holidays.push(\"🌿 Σάββατο του Λαζάρου\");\n            else if (diff === -7) holidays.push(\"🌿 Κυριακή των Βαΐων\");\n            else if (diff === -2) holidays.push(\"⛪ Μεγάλη Παρασκευή (Ημιαργία)\");\n            else if (diff === 0) holidays.push(\"🕯️ Κυριακή του Πάσχα\");\n            else if (diff === 1) holidays.push(\"🥚 Δευτέρα του Πάσχα (Αργία)\");\n            else if (diff === 5) holidays.push(\"💧 Ζωοδόχου Πηγής\");\n            else if (diff === 39) holidays.push(\"⛪ Ανάληψη του Κυρίου\");\n            else if (diff === 48) holidays.push(\"🕯️ Β' Ψυχοσάββατο (προ Πεντηκοστής)\");\n            else if (diff === 49) holidays.push(\"🔥 Πεντηκοστή\");\n            else if (diff === 50) holidays.push(\"🕊️ Αγίου Πνεύματος (Αργία)\");\n            else if (diff === 56) holidays.push(\"⛪ Κυριακή των Αγίων Πάντων\");\n\n            // 2. Κινητές Γιορτές ανεξάρτητες από το Πάσχα\n            if (DateEngine.movableDays.isMacedonianStruggle) {\n                holidays.push(\"🇬🇷 Ημέρα Μακεδονικού Αγώνα\");\n            }\n\n            // 3. Σταθερές Γιορτές από το JSON\n            if (DataEngineAPI.dictionaries.fixedHolidays[DateEngine.dateKey]) {\n                holidays.push(DataEngineAPI.dictionaries.fixedHolidays[DateEngine.dateKey]);\n            }\n            \n            return holidays;\n        },\n        getNames: () => {\n            let namesArr = []; // Μαζεύουμε εδώ ΟΛΑ τα ονόματα για να μη χάνεται τίποτα\n\n            const diff = DateEngine.diffFromEaster;\n            const isGeorgeMoved = DateEngine.isGeorgeMoved; \n            \n            // ΝΕΟΣ ΚΑΝΟΝΑΣ: Ο Μάρκος μεταφέρεται αν το Πάσχα είναι από 24/4 και μετά\n            const isMarkMoved = (DateEngine.easter >= new Date(DateEngine.y, 3, 24)); \n\n            // 1. ΚΙΝΗΤΕΣ ΓΙΟΡΤΕΣ (χρησιμοποιούμε push αντί για return)\n            if (diff === -43) namesArr.push(\"Θεόδωρος, Θεοδώρα (Αγ. Θεοδώρων)\");\n            if (diff === -8) namesArr.push(\"Λάζαρος, Λάζος (Του Λαζάρου)\");\n            if (diff === -7) namesArr.push(\"Βάιος, Βαΐα, Δάφνη (Των Βαΐων)\");\n            if (diff === 0) namesArr.push(\"Αναστάσιος, Αναστασία, Λάμπρος, Πασχάλης\");\n            \n            if (diff === 1 && isGeorgeMoved) namesArr.push(\"Γιώργος, Γεωργία, Ελισάβετ\");\n            \n            if (diff === 2) {\n                let tuesdayNames = \"Ραφαήλ, Νικόλαος, Ειρήνη (Λέσβου)\";\n                if (isMarkMoved) tuesdayNames += \", Μάρκος\"; // Προστίθεται πλέον σωστά την Τρίτη του Πάσχα!\n                namesArr.push(tuesdayNames);\n            }\n            \n            if (diff === 5) namesArr.push(\"Ζωή, Πηγή, Ζωοδόχος (Ζωοδόχου Πηγής)\");\n            if (diff === 7) namesArr.push(\"Θωμάς (Του Θωμά)\");\n            if (diff === 50) namesArr.push(\"Τριάδα, Τριαντάφυλλος, Τριανταφυλλιά\");\n            if (diff === 56) namesArr.push(\"Πανταζής, Πάντος (Αγίων Πάντων)\");\n\n            // 2. ΣΤΑΘΕΡΕΣ ΠΟΥ ΜΕΤΑΚΙΝΟΥΝΤΑΙ (23, 24, 25 Απριλίου)\n            if (DateEngine.dateKey === \"4-23\" && !isGeorgeMoved) namesArr.push(\"Γιώργος, Γεωργία\");\n            if (DateEngine.dateKey === \"4-24\" && !isGeorgeMoved) namesArr.push(\"Ελισάβετ\");\n            if (DateEngine.dateKey === \"4-25\") {\n                namesArr.push(isMarkMoved ? \"Νίκη\" : \"Μάρκος, Νίκη\"); // Αν έφυγε ο Μάρκος, μένει η Νίκη στις 25/4\n            }\n\n            // 3. ΣΤΑΘΕΡΕΣ ΓΙΟΡΤΕΣ ΑΠΟ ΤΟ JSON (Πλέον θα διαβάζονται ΠΑΝΤΑ)\n            const fixedNames = DataEngineAPI.dictionaries.fixedNames[DateEngine.dateKey];\n            if (fixedNames) {\n                namesArr.push(fixedNames);\n            }\n\n            // 4. Επιστροφή όλων μαζί, ενωμένα με κόμμα (το filter αποφεύγει τυχόν κενά)\n            return namesArr.filter(Boolean).join(\", \");\n        },\n        getSchoolHolidays: () => {\n            const m = DateEngine.m;\n            const d = DateEngine.d;\n            const diff = DateEngine.diffFromEaster;\n            if ((m === 12 && d >= 24) || (m === 1 && d <= 7)) return \" \\u26C4\\uFE0F Σχολικές Διακοπές Χριστουγέννων\";\n            if (diff >= -8 && diff <= 7) return \" \\uD83D\\uDC30\\uFE0F Σχολικές Διακοπές Πάσχα\";\n            if ((m === 6 && d >= 16) || m === 7 || m === 8 || (m === 9 && d <= 10)) return \" \\u2600\\uFE0F Θερινές Σχολικές Διακοπές\";\n        }\n    };\nconst SearchEngine = {\n        index: [],\n        isBuiltForYear: null,\n        // ΠΡΟΣΘΗΚΗ: Αντικαθιστά και το τελικό \"ς\" με \"σ\"\n        normalize: (str) => str ? str.toLowerCase().normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\").replace(/ς/g, \"σ\") : \"\",\n        buildIndex: () => {\n            const y = DateEngine.viewDate.getFullYear();\n            if (SearchEngine.isBuiltForYear === y) return; // Το χτίζει μόνο 1 φορά!\n            \n            SearchEngine.index = [];\n            const originalDate = new Date(DateEngine.viewDate); \n            \n            // \"Ταξιδεύει\" αόρατα και στις 365 μέρες (ή 366 αν είναι δίσεκτο)\n            const daysInYear = DateEngine.isLeapYear ? 366 : 365;\n            for (let i = 0; i < daysInYear; i++) {\n                const testDate = new Date(y, 0, i + 1);\n                DateEngine.viewDate = testDate;\n                DateEngine.init();\n                \n                let terms = [];\n                const names = HolidayEngine.getNames(); if (names) terms.push(names);\n                const hols = HolidayEngine.getHolidays(); if (hols.length) terms.push(...hols);\n                const wds = HolidayEngine.getWorldDays(); if (wds.length) terms.push(...wds);\n                \n                const rawText = terms.join(\" | \").replace(/<\\/?[^>]+(>|$)/g, \"\"); // Αφαιρεί τυχόν HTML\n                if (rawText.trim()) {\n                    SearchEngine.index.push({\n                        targetDate: new Date(testDate),\n                        displayDate: testDate.toLocaleDateString('el-GR', { day: 'numeric', month: 'long' }),\n                        rawText: rawText,\n                        searchKey: SearchEngine.normalize(rawText)\n                    });\n                }\n            }\n            // Επαναφέρει το σύστημα εκεί που ήταν\n            DateEngine.viewDate = originalDate;\n            DateEngine.init();\n            SearchEngine.isBuiltForYear = y;\n        },\n        search: (query) => {\n            const q = SearchEngine.normalize(query);\n            if (!q || q.length < 2) return [];\n            return SearchEngine.index.filter(item => item.searchKey.includes(q)).slice(0, 8);\n        }\n    };\n    const WeatherEngine = {\n        fetchWithRetry: async (retries = 3) => {\n            try {\n                const response = await fetch(CONFIG.weather.url);\n                if (!response.ok) throw new Error(\"HTTP error\");\n                return await response.json();\n            } catch (error) {\n                if (retries > 0) {\n                    await new Promise(resolve => setTimeout(resolve, 2000));\n                    return WeatherEngine.fetchWithRetry(retries - 1);\n                }\n                throw error;\n            }\n        },\n        getDayTypeContent: (data, dayOffset) => {\n            const dDate = new Date(DateEngine.today);\ndDate.setDate(dDate.getDate() + dayOffset);\n            const m = dDate.getMonth() + 1;\n            const d = dDate.getDate();\n            const dayOfWeek = dDate.getDay();  \n          const realEaster = Utils.getOrthodoxEaster(dDate.getFullYear()); // Βρίσκει το πραγματικό Πάσχα του Καιρού\nconst diffFromEaster = Utils.getDaysDiff(dDate, realEaster);\n            const schoolHolidays = [\"10-28\", \"11-17\", \"11-25\", \"1-30\", \"3-25\", \"5-1\"];\n            const isHoliday = schoolHolidays.includes(`${m}-${d}`) || diffFromEaster === -48 || diffFromEaster === 50;\n\n           // ΣΩΣΤΗ ΙΕΡΑΡΧΙΑ: Πρώτα ελέγχει Αργίες/Γιορτές, και ΑΝ δεν είναι τίποτα από αυτά, τότε βγάζει \"Καλό Σ/Κ\"\n            if (isHoliday) return '<span class=\"sch-msg\">🇬🇷 Χρόνια</span><span class=\"sch-msg\">Πολλά!</span>';\n            if (diffFromEaster >= -8 && diffFromEaster <= 7) return '<span class=\"sch-msg\">🐰 Καλό</span><span class=\"sch-msg\">Πάσχα!</span>';\n            if ((m === 12 && d >= 24) || (m === 1 && d <= 7)) return '<span class=\"sch-msg\">🎄 Καλές</span><span class=\"sch-msg\">Γιορτές!</span>';\n            if ((m === 6 && d >= 16) || m === 7 || m === 8 || (m === 9 && d <= 10)) return '<span class=\"sch-msg\">🏖️ Καλό</span><span class=\"sch-msg\">Καλο-<br>καίρι!</span>';\n            if (dayOfWeek === 0 || dayOfWeek === 6) return '<span class=\"sch-msg\">🎈 Καλό</span><span class=\"sch-msg\">Σ/Κ!</span>';\n\n            const codes = {\n                0:\"☀️\", 1:\"🌤️\", 2:\"⛅\", 3:\"☁️\", 45:\"🌫️\", 48:\"🌫️\", 51:\"🌦️\", 53:\"🌦️\", 55:\"🌧️\",\n                61:\"🌧️\", 63:\"🌧️\", 65:\"🌧️\", 71:\"❄️\", 73:\"❄️\", 75:\"❄️\", 77:\"❄️\", 80:\"🌦️\",\n                81:\"🌧️\", 82:\"🌧️\", 95:\"⛈️\", 96:\"⛈️\", 99:\"⛈️\"\n            };\n            const baseIndex = dayOffset * 24;\n            const rainCodes = [51, 53, 55, 61, 63, 65, 80, 81, 82, 95, 96, 99];\n            const snowCodes = [71, 73, 75, 77];\n            let rainWarnings = [], snowWarnings = [];\n\n            [10, 11, 12, 13].forEach(hour => {\n                const code = data.hourly.weather_code[baseIndex + hour];\n                const timeLabel = hour === 10 ? \"09:40\" : hour === 11 ? \"11:30\" : hour === 12 ? \"12:25\" : \"13:15\";\n                if (rainCodes.includes(code)) rainWarnings.push(timeLabel);\n                if (snowCodes.includes(code)) snowWarnings.push(timeLabel);\n            });\n\n           let alertHtml = \"\";\n            if (snowWarnings.length > 0) {\n                const badges = snowWarnings.map(t => `<span class=\"snow-badge\">Διάλειμμα ${t}</span>`).join('');\n                alertHtml = `<div style=\"display:flex; flex-direction:column; align-items:center; margin-bottom:6px;\"><span class=\"sch-msg\" style=\"font-size:22px; margin-bottom:2px; animation: bounce 2s infinite; color:#1e6cff;\">❄️</span><span class=\"sch-msg\" style=\"font-size:9px; line-height:1; margin-bottom:4px; color:#1e6cff;\">ΧΙΟΝΟΠΤΩΣΗ ΣΤΑ ΔΙΑΛΕΙΜΜΑΤΑ:</span><div class=\"snow-list\">${badges}</div></div>`;\n            } else if (rainWarnings.length > 0) {\n                const badges = rainWarnings.map(t => `<span class=\"rain-badge\">Διάλειμμα ${t}</span>`).join('');\n                alertHtml = `<div style=\"display:flex; flex-direction:column; align-items:center; margin-bottom:6px;\"><span class=\"sch-msg\" style=\"font-size:20px; margin-bottom:2px; animation: bounce 2s infinite;\">☔</span><span class=\"sch-msg\" style=\"font-size:9px; line-height:1; margin-bottom:4px;\">ΒΡΟΧΗ ΣΤΑ ΔΙΑΛΕΙΜΜΑΤΑ:</span><div class=\"rain-list\">${badges}</div></div>`;\n            }\n\n            const getHourData = (h) => {\n                const temp = Math.round(data.hourly.temperature_2m[baseIndex + h]);\n                const icon = codes[data.hourly.weather_code[baseIndex + h]] || \"🌤️\";\n                return `${icon} ${temp}°`;\n            };\n\n            // ΠΡΟΣΘΗΚΗ: Το alertHtml μπαίνει στην αρχή, ώστε να εμφανίζονται και οι θερμοκρασίες\n            return `${alertHtml}\n                    <span class=\"sch-time\">🔔 09:40 ${getHourData(10)}</span>\n                    <span class=\"sch-time\">🔔 11:30 ${getHourData(11)}</span>\n                    <span class=\"sch-time\">🔔 12:25 ${getHourData(12)}</span>\n                    <span class=\"sch-time\" style=\"color:#a90e0e; margin-top:3px;\">🎒 13:15 ${getHourData(13)}</span>`;\n        }\n    };\n\n    const UIEngine = {\n        renderHeader: () => {\n            const hIcon = document.getElementById('dynamic-day-icon');\n            const hDate = document.getElementById('eort-date');\n \n            if(hIcon) hIcon.innerText = DateEngine.d;\n           if(hDate) {\n                const diffDays = Utils.getDaysDiff(DateEngine.viewDate, DateEngine.today);\n                let prefix = \"\";\n                \n                if (diffDays === 0) prefix = \"Σήμερα, \";\n                else if (diffDays === 1) prefix = \"Αύριο, \";\n                else if (diffDays === -1) prefix = \"Χθες, \";\n                else if (diffDays > 1) prefix = `Σε ${diffDays} μέρες, `;\n                else if (diffDays < -1) prefix = `Πριν ${Math.abs(diffDays)} μέρες, `;\n                \n                const baseDateStr = DateEngine.viewDate.toLocaleDateString('el-GR', { weekday: 'long', day: 'numeric', month: 'long' });\n                \n                // Ο ΚΑΝΟΝΑΣ ΤΩΝ 5 ΗΜΕΡΩΝ!\n                if (Math.abs(diffDays) >= 5) {\n                    hDate.innerHTML = `${prefix}${baseDateStr} <span class=\"return-to-today-badge\">(↺)</span>`;\n                    hDate.classList.add('is-returnable');\n                    hDate.title = \"Επιστροφή στο Σήμερα\";\n                } else {\n                    hDate.innerHTML = prefix + baseDateStr;\n                    hDate.classList.remove('is-returnable');\n                    hDate.title = \"\";\n                }\n            }\n          \n        },\n        renderHolidays: () => {\n            const worldDays = HolidayEngine.getWorldDays();\n            const wdDiv = document.getElementById('eort-world-day');\n            if(wdDiv) { wdDiv.innerHTML = worldDays.join(\" / \"); wdDiv.style.display = worldDays.length ? \"block\" : \"none\"; }\n\n            const holidays = HolidayEngine.getHolidays();\n            const hDiv = document.getElementById('eort-holiday');\n            if(hDiv) { hDiv.innerHTML = holidays.join(\"<br>\"); hDiv.style.display = holidays.length ? \"block\" : \"none\"; }\n\n            const names = HolidayEngine.getNames();\n            const nDiv = document.getElementById('eort-names');\n            if(nDiv) {\n                if (names) { nDiv.innerHTML = \"<b>Γιορτάζουν:</b><br>\" + names; nDiv.style.display = \"block\"; } \n                else { nDiv.style.display = \"none\"; }\n            }\n\n            const schoolStr = HolidayEngine.getSchoolHolidays();\n            const sDiv = document.getElementById('eort-school');\n            if(sDiv) { sDiv.innerText = schoolStr; sDiv.style.display = schoolStr ? \"block\" : \"none\"; }\n        },\n        renderWeather: async () => {\n            const container = document.getElementById('hub-weather-container');\n            if(!container) return;\n            try {\n                const data = await WeatherEngine.fetchWithRetry();\n                const codes = {\n                    0:\"☀️\", 1:\"🌤️\", 2:\"⛅\", 3:\"☁️\", 45:\"🌫️\", 48:\"🌫️\", 51:\"🌦️\", 53:\"🌦️\", 55:\"🌧️\",\n                    61:\"🌧️\", 63:\"🌧️\", 65:\"🌧️\", 71:\"❄️\", 73:\"❄️\", 75:\"❄️\", 77:\"❄️\", 80:\"🌦️\",\n                    81:\"🌧️\", 82:\"🌧️\", 95:\"⛈️\", 96:\"⛈️\", 99:\"⛈️\"\n                };\n                const daysArr = ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'];\n                let wHtml = '';\n\n                for(let i=0; i<3; i++) {\n                    const dDate = new Date();\n                    dDate.setDate(DateEngine.today.getDate() + i);\n                    const dName = (i===0) ? \"Σήμερα\" : (i===1 ? \"Αύριο\" : daysArr[dDate.getDay()]);\n                    const baseIndex = i * 24;\n                    const dayTemps = data.hourly.temperature_2m.slice(baseIndex, baseIndex + 24);\n                    const maxTemp = Math.round(Math.max(...dayTemps));\n                    const minTemp = Math.round(Math.min(...dayTemps));\n                    \n                    // ΝΕΟ: Αισθητή θερμοκρασία στις 08:00 το πρωί\n                    // Δυναμική Αίσθηση: Τρέχουσα ώρα για 'Σήμερα', 08:00 για τις επόμενες μέρες\nlet feelsLikeHour = 8;\nlet feelsLikeText = \"Αίσθηση 8πμ\";\n\nif (i === 0) {\n    feelsLikeHour = new Date().getHours(); // Παίρνει την τρέχουσα ώρα του υπολογιστή/κινητού\n    feelsLikeText = \"Αίσθηση\";\n}\nconst currentFeelsLike = Math.round(data.hourly.apparent_temperature[baseIndex + feelsLikeHour]);\n                    \n                    const mainCodeRaw = data.hourly.weather_code[baseIndex + 12];\n                    const mainCode = codes[mainCodeRaw] || \"🌤️\";\n                    const hoverContent = WeatherEngine.getDayTypeContent(data, i);\n\n                    // Δυναμικό Φόντο ανάλογα τον σημερινό καιρό (και ώρα)\n                    if (i === 0) {\n                        const widgetBox = document.getElementById('eortologio-widget-box');\n                        if (widgetBox) {\n                            // Προσθέσαμε και το bg-weather-night στην αφαίρεση\n                            widgetBox.classList.remove('bg-weather-sun', 'bg-weather-rain', 'bg-weather-snow', 'bg-weather-night');\n                            \n                            const currentHour = new Date().getHours();\n                            const isNight = (currentHour >= 20 || currentHour < 6);\n                            \n                            // Παίρνουμε τον καιρό της ΤΡΕΧΟΥΣΑΣ ώρας για το φόντο!\n                            const currentCode = data.hourly.weather_code[currentHour];\n\n                            if ([71,73,75,77].includes(currentCode)) {\n                                widgetBox.classList.add('bg-weather-snow');\n                            } else if ([51,53,55,61,63,65,80,81,82,95,96,99].includes(currentCode)) {\n                                widgetBox.classList.add('bg-weather-rain');\n                            } else if (isNight) {\n                                widgetBox.classList.add('bg-weather-night');\n                            } else {\n                                widgetBox.classList.add('bg-weather-sun');\n                            }\n                        } // Κλείσιμο if (widgetBox)\n\n                      \n                        // --- ΝΕΟ: ΕΞΥΠΝΟΣ ΣΥΜΒΟΥΛΟΣ (PC) ---\n                        const advisorBox = document.getElementById('smart-weather-advisor');\n                        if (advisorBox) {\n                            const hourNow = new Date().getHours();\n                            \n                            // 1. ΠΕΡΙΟΔΟΣ \"ΣΙΓΗΣ\" (02:00 έως 05:59 τα ξημερώματα)\n                            if (hourNow >= 2 && hourNow < 6) {\n                                advisorBox.style.display = 'none';\n                            } else {\n                                let hasRain = false, hasSnow = false;\n                                let checkTemp = 0;\n                                let msg = \"\", icon = \"\", borderColor = \"\", bgColor = \"\";\n                                \n                                // 2. ΛΕΙΤΟΥΡΓΙΑ \"ΣΗΜΕΡΑ\" (06:00 το πρωί έως 15:59 το απόγευμα)\n                                if (hourNow >= 6 && hourNow < 16) {\n                                    // Έλεγχος για βροχή/χιόνι ΜΟΝΙΜΑ από τις 06:00 έως τις 14:00 (2 το μεσημέρι)\n                                    for (let h = 6; h <= 14; h++) {\n                                        const code = data.hourly.weather_code[baseIndex + h];\n                                        if ([51,53,55,61,63,65,80,81,82,95,96,99].includes(code)) hasRain = true;\n                                        if ([71,73,75,77].includes(code)) hasSnow = true;\n                                    }\n\n                                    // Παίρνουμε την αισθητή θερμοκρασία ΑΚΡΙΒΩΣ για την τρέχουσα ώρα\n                                    checkTemp = data.hourly.apparent_temperature[baseIndex + hourNow];\n\n                                    if (hasSnow) {\n                                        icon = \"⛄\"; msg = \"Προσοχή για χιόνι! Ντύσου σαν κρεμμύδι 🧅!\"; \n                                        borderColor = \"#1e6cff\"; bgColor = \"rgba(30, 108, 255, 0.1)\";\n                                    } else if (hasRain) {\n                                        icon = \"☔\"; msg = \"Προσοχή για βροχή! Μην ξεχάσεις την ομπρέλα σου!\"; \n                                        borderColor = \"#3b82f6\"; bgColor = \"rgba(59, 130, 246, 0.1)\";\n                                    } else if (checkTemp < 7) {\n                                        icon = \"🧣\"; msg = \"Έχει παγωνιά έξω! Σκούφος και γάντια απαραίτητα!\"; \n                                        borderColor = \"#0ea5e9\"; bgColor = \"rgba(14, 165, 233, 0.1)\";\n                                    } else if (checkTemp > 21) {\n                                        icon = \"☀️\"; msg = \"Ζεστούλα έξω! Μην ξεχάσεις το παγούρι με το νερό σου!\"; \n                                        borderColor = \"#f59e0b\"; bgColor = \"rgba(245, 158, 11, 0.1)\";\n                                    } else {\n                                        icon = \"🌤️\"; msg = \"Ιδανικός καιρός αυτή τη στιγμή για παιχνίδι!\"; \n                                        borderColor = \"#10b981\"; bgColor = \"rgba(16, 185, 129, 0.1)\";\n                                    }\n                                } \n                                // 3. ΛΕΙΤΟΥΡΓΙΑ \"ΑΥΡΙΟ\" (16:00 το απόγευμα έως 01:59 το βράδυ)\n                                else {\n                                    // Έξυπνος κανόνας: Από 00:00 έως 01:59 έχει ήδη αλλάξει η μέρα ημερολογιακά.\n                                    // Άρα το \"Αύριο\" για το παιδί, είναι το \"Σήμερα\" για τον υπολογιστή (baseIndex).\n                                    // Ενώ από 16:00 έως 23:59 το \"Αύριο\" είναι ρεαλιστικά στην επόμενη μέρα (+24 ώρες).\n                                    const tomorrowIndex = (hourNow >= 16) ? baseIndex + 24 : baseIndex;\n\n                                    // Έλεγχος για βροχή/χιόνι για ΑΥΡΙΟ σταθερά από τις 06:00 έως τις 14:00 (Μόνιμη προειδοποίηση)\n                                    for (let h = 6; h <= 14; h++) {\n                                        const code = data.hourly.weather_code[tomorrowIndex + h];\n                                        if ([51,53,55,61,63,65,80,81,82,95,96,99].includes(code)) hasRain = true;\n                                        if ([71,73,75,77].includes(code)) hasSnow = true;\n                                    }\n                                    \n                                    // Παίρνουμε την αισθητή θερμοκρασία για ΑΥΡΙΟ ακριβώς στις 08:00 το πρωί\n                                    checkTemp = data.hourly.apparent_temperature[tomorrowIndex + 8];\n\n                                    if (hasSnow) {\n                                        icon = \"⛄\"; msg = \"Αύριο περιμένουμε χιόνι! Ετοίμασε ζεστά ρούχα 🧅!\"; \n                                        borderColor = \"#1e6cff\"; bgColor = \"rgba(30, 108, 255, 0.1)\";\n                                    } else if (hasRain) {\n                                        icon = \"☔\"; msg = \"Αύριο δίνει βροχή! Μην ξεχάσεις την ομπρέλα σου!\"; \n                                        borderColor = \"#3b82f6\"; bgColor = \"rgba(59, 130, 246, 0.1)\";\n                                    } else if (checkTemp < 7) {\n                                        icon = \"🧣\"; msg = \"Αύριο το πρωί θα έχει παγωνιά! Ετοίμασε σκούφο και γάντια!\"; \n                                        borderColor = \"#0ea5e9\"; bgColor = \"rgba(14, 165, 233, 0.1)\";\n                                    } else if (checkTemp > 21) {\n                                        icon = \"☀️\"; msg = \"Αύριο θα κάνει ζέστη! Μην ξεχάσεις το παγούρι σου!\"; \n                                        borderColor = \"#f59e0b\"; bgColor = \"rgba(245, 158, 11, 0.1)\";\n                                    } else {\n                                        icon = \"🌤️\"; msg = \"Αύριο φαίνεται ιδανικός καιρός για παιχνίδι!\"; \n                                        borderColor = \"#10b981\"; bgColor = \"rgba(16, 185, 129, 0.1)\";\n                                    }\n                                }\n                                \n                                // Εμφάνιση του κουτιού με τα δεδομένα\n                                advisorBox.innerHTML = `<span class=\"smart-advisor-icon\">${icon}</span> <div class=\"smart-advisor-text\">${msg}</div>`;\n                                advisorBox.style.borderLeftColor = borderColor;\n                                advisorBox.style.background = bgColor;\n                                advisorBox.style.display = 'flex';\n                            }\n                        }\n                    } // <-- ΤΕΛΟΣ του if (i === 0)\n                    wHtml += `\n                        <div class=\"c-day-card ${i===0 ? 'today' : ''}\">\n                            <div class=\"c-day-inner\">\n                                <div class=\"c-day-front\">\n                                    <span class=\"c-day-name\">${dName}</span>\n                                    <span class=\"c-day-icon\">${mainCode}</span>\n                                    <div class=\"c-day-temps\"><span class=\"c-max\">${maxTemp}°</span> <span>${minTemp}°</span></div>\n                                    <div style=\"font-size: 10px; color: #64748b; margin-top: 4px; font-weight: 700;\">${feelsLikeText}: <span style=\"color:#a90e0e;\">${currentFeelsLike}°</span></div>\n                                </div>\n                                <div class=\"c-day-back\">${hoverContent}</div>\n                            </div>\n                        </div>`;\n                }\n                container.innerHTML = wHtml;\n            } catch (error) {\n                container.innerHTML = \"<div style='font-size:10px;color:#888;width:100%;text-align:center;'>Η υπηρεσία καιρού είναι προσωρινά μη διαθέσιμη.</div>\";\n            }\n        }\n    };\n\n    const AppController = {\n        init: async () => { // <--- Έγινε async\n            const eortBox = document.getElementById(\"eortologio-widget-box\");\n            if (!eortBox) return;\n\n            // --- ΚΑΤΕΒΑΖΕΙ ΤΑ ΔΕΔΟΜΕΝΑ (Γιορτές/Ονόματα) ΑΠΟ ΤΟ JSON ---\n            await DataEngineAPI.fetchData();\n\n            DateEngine.init();\n            UIEngine.renderHeader();\n            UIEngine.renderHolidays();\n            UIEngine.renderWeather();\n         let isAnimating = false;\n            // --- ΝΕΟ: ΕΞΥΠΝΗ ΤΗΛΕΜΕΤΑΦΟΡΑ (Time Travel) ---\n            const animateToDate = (targetDate) => {\n              if (isAnimating) return;\n                const diff = Utils.getDaysDiff(targetDate, DateEngine.viewDate);\n                if (diff === 0) return;\n                isAnimating = true;\n                const outClass = diff > 0 ? 'anim-slide-out-left' : 'anim-slide-out-right';\n                const inClass = diff > 0 ? 'anim-slide-in-right' : 'anim-slide-in-left';\n                const elements = eortBox.querySelectorAll('#eort-date, .info-box');\n                elements.forEach(el => {\n                    el.classList.remove('anim-slide-in-right', 'anim-slide-in-left', 'anim-slide-out-left', 'anim-slide-out-right');\n                      if (el.style.display !== 'none' || el.id === 'eort-date') {\n                        el.classList.add(outClass);\n                    }\n                });\n\n                setTimeout(() => {\n                    DateEngine.viewDate = new Date(targetDate);\n                    DateEngine.init();\n                  SearchEngine.buildIndex();\n                    UIEngine.renderHeader();\n                    UIEngine.renderHolidays();\n                    \n\n                    elements.forEach(el => {\n                        el.classList.remove(outClass);\n                          if (el.style.display !== 'none' || el.id === 'eort-date') {\n                            el.classList.add(inClass);\n                        }\n                    });\n                  isAnimating = false;\n                }, 250); \n            };\n\n            const animateAndChangeDay = (offset) => {\n                const target = new Date(DateEngine.viewDate);\n                target.setDate(target.getDate() + offset);\n                animateToDate(target);\n            };\n\n           // --- PROGRESSIVE DISCLOSURE ΑΝΑΖΗΤΗΣΗΣ ---\n            const searchBox = document.getElementById('pc-eort-search-box');\n            \n            const revealSearch = () => {\n                if (searchBox && searchBox.style.display !== 'flex') {\n                    searchBox.style.display = 'flex';\n                    setTimeout(() => SearchEngine.buildIndex(), 100);\n                }\n            };\n\n            // Events Πλοήγησης (Εμφανίζουν και την αναζήτηση)\n            const prevBtn = document.getElementById('eort-prev-day');\n            const nextBtn = document.getElementById('eort-next-day');\n            if (prevBtn) prevBtn.addEventListener('click', () => { revealSearch(); animateAndChangeDay(-1); });\n            if (nextBtn) nextBtn.addEventListener('click', () => { revealSearch(); animateAndChangeDay(1); });\n\n            // --- ΚΛΙΚ ΣΤΗΝ ΗΜΕΡΟΜΗΝΙΑ ΓΙΑ ΕΠΙΣΤΡΟΦΗ ---\n            const dateEl = document.getElementById('eort-date');\n            if (dateEl) {\n                dateEl.addEventListener('click', () => {\n                    if (dateEl.classList.contains('is-returnable')) animateToDate(DateEngine.today);\n                });\n            }\n\n           // --- SWIPE ΓΙΑ PC & MOBILE ---\n            let touchStartX = 0;\n            let touchStartY = 0;\n            if (eortBox) {\n                eortBox.addEventListener('touchstart', (e) => {\n                    touchStartX = e.changedTouches[0].screenX;\n                    touchStartY = e.changedTouches[0].screenY;\n                }, { passive: true });\n                eortBox.addEventListener('touchend', (e) => {\n                    const diffX = touchStartX - e.changedTouches[0].screenX;\n                    const diffY = touchStartY - e.changedTouches[0].screenY;\n                    \n                    // Αλλαγή μέρας ΜΟΝΟ αν το οριζόντιο swipe είναι έντονο ΚΑΙ μεγαλύτερο από το κάθετο (scroll)\n                    if (Math.abs(diffX) > 40 && Math.abs(diffX) > Math.abs(diffY)) {\n                        revealSearch();\n                        if (diffX > 0) animateAndChangeDay(1); else animateAndChangeDay(-1); \n                    }\n                }, { passive: true });\n            }\n\n            // --- LOGIC ΑΝΑΖΗΤΗΣΗΣ ---\n            const searchIcon = document.getElementById('pc-eort-search-icon');\n            const searchInput = document.getElementById('pc-eort-search-input');\n            const searchResults = document.getElementById('pc-eort-search-results');\n            const groupWrap = document.querySelector('.eort-date-search-group');\n\n            if (searchIcon && searchInput && searchResults) {\n                // Click στο Φακό\n                searchIcon.addEventListener('click', (e) => {\n                    e.stopPropagation();\n                    searchBox.classList.toggle('active');\n                    if (searchBox.classList.contains('active')) {\n                        searchInput.focus();\n                        if (groupWrap) groupWrap.classList.add('searching');\n                    } else {\n                        searchInput.value = '';\n                        searchResults.classList.remove('show');\n                        if (groupWrap) groupWrap.classList.remove('searching');\n                    }\n                });\n\n                // Live Πληκτρολόγηση\n                searchInput.addEventListener('input', (e) => {\n                    const res = SearchEngine.search(e.target.value);\n                    if (e.target.value.length >= 2) {\n                        if (res.length > 0) {\n                            searchResults.innerHTML = res.map(r => \n                                `<div class=\"search-res-item\" data-time=\"${r.targetDate.getTime()}\">\n                                    <span class=\"search-res-date\">${r.displayDate}</span>\n                                    ${r.rawText.substring(0, 48)}${r.rawText.length > 48 ? '...' : ''}\n                                </div>`\n                            ).join('');\n                        } else {\n                            searchResults.innerHTML = '<div class=\"search-res-item\" style=\"color:#888; pointer-events:none;\">Δεν βρέθηκε κάτι...</div>';\n                        }\n                        searchResults.classList.add('show');\n                    } else {\n                        searchResults.classList.remove('show');\n                    }\n                });\n\n              // Κλικ στο αποτέλεσμα!\n                searchResults.addEventListener('click', (e) => {\n                    const item = e.target.closest('.search-res-item');\n                    if (item && item.getAttribute('data-time')) {\n                        const targetDate = new Date(parseInt(item.getAttribute('data-time')));\n                        searchBox.classList.remove('active');\n                        searchInput.value = '';\n                        searchInput.blur(); // ΠΡΟΣΘΗΚΗ: Αφαιρεί το focus / Κλείνει το πληκτρολόγιο\n                        searchResults.classList.remove('show');\n                        if (groupWrap) groupWrap.classList.remove('searching');\n                        \n                        animateToDate(targetDate); // Η τηλεμεταφορά!\n                    }\n                });\n\n                // Κλείσιμο κρυφής αναζήτησης αν πατήσει αλλού\n                document.addEventListener('click', (e) => {\n                    if (searchBox && !searchBox.contains(e.target) && searchBox.classList.contains('active')) {\n                        searchBox.classList.remove('active');\n                        searchInput.value = '';\n                        searchInput.blur(); // ΠΡΟΣΘΗΚΗ: Αφαιρεί το focus / Κλείνει το πληκτρολόγιο\n                        searchResults.classList.remove('show');\n                        if (groupWrap) groupWrap.classList.remove('searching');\n                    }\n                });\n            }\n            // --- ΤΕΛΟΣ ΠΡΟΣΘΗΚΗΣ SWIPE ---\n        }\n    };\n\n    if (document.readyState === \"loading\") {\n        document.addEventListener(\"DOMContentLoaded\", AppController.init);\n    } else {\n        AppController.init();\n      // Κουμπιά Επόμενη / Προηγούμενη Μέρα    \n    }\n})();\n"]}