{"id":3087,"date":"2026-05-22T10:28:11","date_gmt":"2026-05-22T08:28:11","guid":{"rendered":"https:\/\/legrandtravel.gr\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/"},"modified":"2026-05-22T12:52:30","modified_gmt":"2026-05-22T10:52:30","slug":"%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82","status":"publish","type":"page","link":"https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/","title":{"rendered":"\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3087\" class=\"elementor elementor-3087 elementor-3081\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2ec109c e-ecs-flex e-flex e-con-boxed e-con e-parent\" data-id=\"2ec109c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ecs_container_type&quot;:&quot;flex&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b193bbb elementor-widget elementor-widget-shortcode\" data-id=\"b193bbb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">    <div class=\"lgf-wrap\">\n        <div class=\"lgf-header\">\n            <span class=\"lgf-icon\">\u2708<\/span>\n            <h2 id=\"lgf-title\">Greek Airports Flights<\/h2>\n            <select id=\"lgf-lang\" class=\"lgf-lang\">\n                <option value=\"en\" selected>\ud83c\uddec\ud83c\udde7 EN<\/option>\n                <option value=\"gr\">\ud83c\uddec\ud83c\uddf7 GR<\/option>\n                <option value=\"de\">\ud83c\udde9\ud83c\uddea DE<\/option>\n            <\/select>\n        <\/div>\n\n        <!-- Quick Flight Lookup -->\n        <div class=\"lgf-quick-lookup\">\n            <input type=\"text\" id=\"lgf-quick-search\" placeholder=\"\ud83d\udd0d Quick flight lookup (e.g. A3 432, FR 7392)...\" \/>\n            <button id=\"lgf-quick-btn\">Find<\/button>\n        <\/div>\n\n        <!-- Status Dashboard -->\n        <div class=\"lgf-dashboard\" id=\"lgf-dashboard\" style=\"display:none;\"><\/div>\n\n        <!-- Weather -->\n        <div class=\"lgf-weather\" id=\"lgf-weather\"><\/div>\n\n        <div class=\"lgf-controls\">\n            <label data-i18n=\"airport\">Airport:\n                <select id=\"lgf-airport\">\n                    <option value=\"HER\" selected>Heraklion (HER)<\/option>\n                    <option value=\"ATH\">Athens (ATH)<\/option>\n                    <option value=\"SKG\">Thessaloniki (SKG)<\/option>\n                    <option value=\"RHO\">Rhodes (RHO)<\/option>\n                    <option value=\"CFU\">Corfu (CFU)<\/option>\n                    <option value=\"KGS\">Kos (KGS)<\/option>\n                    <option value=\"JMK\">Mykonos (JMK)<\/option>\n                    <option value=\"JTR\">Santorini (JTR)<\/option>\n                    <option value=\"ZTH\">Zakynthos (ZTH)<\/option>\n                    <option value=\"EFL\">Kefalonia (EFL)<\/option>\n                    <option value=\"CHQ\">Chania (CHQ)<\/option>\n                    <option value=\"MJT\">Mytilene (MJT)<\/option>\n                    <option value=\"SMI\">Samos (SMI)<\/option>\n                    <option value=\"KVA\">Kavala (KVA)<\/option>\n                    <option value=\"PVK\">Preveza (PVK)<\/option>\n                    <option value=\"AOK\">Karpathos (AOK)<\/option>\n                    <option value=\"JSI\">Skiathos (JSI)<\/option>\n                    <option value=\"VOL\">Volos (VOL)<\/option>\n                    <option value=\"IOA\">Ioannina (IOA)<\/option>\n                    <option value=\"KZI\">Kozani (KZI)<\/option>\n                <\/select>\n            <\/label>\n\n            <div class=\"lgf-tabs\">\n                <button class=\"lgf-tab active\" data-tab=\"departures\" data-i18n=\"departures\">Departures<\/button>\n                <button class=\"lgf-tab\" data-tab=\"arrivals\" data-i18n=\"arrivals\">Arrivals<\/button>\n            <\/div>\n\n            <input type=\"text\" id=\"lgf-search\" placeholder=\"Search flight, airline, city...\" \/>\n\n            <button id=\"lgf-refresh\" class=\"lgf-refresh-btn\" title=\"Refresh\">\u21bb<\/button>\n\n            <span class=\"lgf-updated\" id=\"lgf-updated\"><\/span>\n        <\/div>\n\n        <div id=\"lgf-content\">\n            <div class=\"lgf-loading\">\u23f3 Loading...<\/div>\n        <\/div>\n\n        <p class=\"lgf-source\" data-i18n=\"source\">Source: AeroDataBox | Data is indicative | Auto-refresh every 5 min<\/p>\n    <\/div>\n\n    <!-- Modal for quick lookup result -->\n    <div class=\"lgf-modal\" id=\"lgf-modal\" style=\"display:none;\">\n        <div class=\"lgf-modal-content\">\n            <button class=\"lgf-modal-close\" id=\"lgf-modal-close\">\u00d7<\/button>\n            <div id=\"lgf-modal-body\"><\/div>\n        <\/div>\n    <\/div>\n\n    <style>\n        .lgf-wrap { font-family: sans-serif; max-width: 100%; margin: 0 auto; }\n        .lgf-header { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }\n        .lgf-header h2 { margin: 0; font-size: 1.5em; flex: 1; }\n        .lgf-icon { font-size: 1.8em; }\n        .lgf-lang { padding: 5px 10px; border-radius: 4px; border: 1px solid #ccc; font-size: 0.9em; background: #fff; }\n\n        .lgf-quick-lookup { display: flex; gap: 6px; margin-bottom: 14px; }\n        .lgf-quick-lookup input { flex: 1; padding: 12px 16px; border: 2px solid #1a3c6e; border-radius: 8px; font-size: 1em; }\n        .lgf-quick-lookup button { padding: 12px 24px; background: #1a3c6e; color: #fff; border: none; border-radius: 8px; font-size: 0.95em; font-weight: 600; cursor: pointer; }\n        .lgf-quick-lookup button:hover { background: #2c5191; }\n\n        .lgf-dashboard { display: flex; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; }\n        .lgf-dash-card { flex: 1; min-width: 140px; padding: 12px 14px; border-radius: 8px; background: #fff; border: 1px solid #eee; display: flex; align-items: center; gap: 10px; }\n        .lgf-dash-card.good { background: #f0fdf4; border-color: #86efac; }\n        .lgf-dash-card.warn { background: #fffbeb; border-color: #fcd34d; }\n        .lgf-dash-card.bad  { background: #fef2f2; border-color: #fca5a5; }\n        .lgf-dash-icon { font-size: 1.8em; }\n        .lgf-dash-num { font-size: 1.6em; font-weight: 700; line-height: 1; }\n        .lgf-dash-label { font-size: 0.75em; color: #666; }\n\n        .lgf-weather { display: none; align-items: center; gap: 14px; padding: 10px 14px; background: linear-gradient(90deg, #f0f7ff, #fafbff); border-radius: 8px; margin-bottom: 14px; font-size: 0.9em; }\n        .lgf-weather.shown { display: flex; flex-wrap: wrap; }\n        .lgf-weather-now { font-size: 1.4em; font-weight: 600; color: #1a3c6e; }\n        .lgf-weather-icon { font-size: 1.8em; }\n        .lgf-weather-meta { color: #666; font-size: 0.88em; }\n        .lgf-weather-fc { display: flex; gap: 8px; margin-left: auto; flex-wrap: wrap; }\n        .lgf-weather-day { text-align: center; padding: 4px 8px; background: rgba(255,255,255,0.7); border-radius: 6px; min-width: 60px; }\n        .lgf-weather-day-name { font-size: 0.75em; color: #888; }\n        .lgf-weather-day-temp { font-weight: 600; font-size: 0.88em; }\n\n        .lgf-controls { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 16px; padding: 12px; background: #f5f7fa; border-radius: 8px; }\n        .lgf-controls label { font-size: 0.9em; font-weight: 600; }\n        .lgf-controls select { margin-left: 6px; padding: 6px 10px; border: 1px solid #ccc; border-radius: 4px; font-size: 0.95em; }\n        .lgf-controls input[type=\"text\"] { padding: 7px 12px; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9em; min-width: 200px; flex: 1; max-width: 250px; }\n        .lgf-tabs { display: flex; gap: 4px; }\n        .lgf-tab { padding: 7px 16px; border: 1px solid #ccc; background: #fff; cursor: pointer; border-radius: 4px; font-size: 0.9em; font-weight: 600; }\n        .lgf-tab.active { background: #1a3c6e; color: #fff; border-color: #1a3c6e; }\n        .lgf-refresh-btn { padding: 7px 12px; border: 1px solid #ccc; background: #fff; cursor: pointer; border-radius: 4px; font-size: 1.1em; font-weight: 600; }\n        .lgf-refresh-btn:hover { background: #1a3c6e; color: #fff; }\n        .lgf-refresh-btn.spinning { animation: lgfspin 0.8s linear infinite; }\n        @keyframes lgfspin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n        .lgf-updated { margin-left: auto; font-size: 0.8em; color: #888; }\n        .lgf-loading { padding: 30px; text-align: center; color: #888; }\n        .lgf-table-wrap { overflow-x: auto; }\n        .lgf-table { width: 100%; border-collapse: collapse; font-size: 0.92em; }\n        .lgf-table th { background: #1a3c6e; color: #fff; padding: 10px 12px; text-align: left; white-space: nowrap; }\n        .lgf-table td { padding: 9px 12px; border-bottom: 1px solid #eee; vertical-align: middle; }\n        .lgf-table tbody tr:hover { background: #f5f8ff; }\n        .lgf-number { font-weight: 600; }\n\n        .lgf-countdown { display: inline-block; padding: 2px 8px; border-radius: 6px; font-size: 0.78em; font-weight: 600; margin-top: 2px; }\n        .lgf-cd-far  { background: #def7ec; color: #057a55; }\n        .lgf-cd-near { background: #fef3c7; color: #92400e; }\n        .lgf-cd-soon { background: #fde8e8; color: #c81e1e; animation: lgfpulse 1.5s infinite; }\n        @keyframes lgfpulse { 0%,100% { opacity: 1; } 50% { opacity: 0.6; } }\n\n        .lgf-airline-cell { display: flex; align-items: center; gap: 8px; }\n        .lgf-airline-logo { width: 28px; height: 28px; object-fit: contain; border-radius: 4px; background: #fff; padding: 2px; border: 1px solid #eee; flex-shrink: 0; }\n        .lgf-airline-name { font-size: 0.9em; color: #555; }\n        .lgf-city { display: flex; align-items: center; gap: 6px; }\n        .lgf-flag { font-size: 1.2em; }\n        .lgf-city-iata { color: #888; font-size: 0.85em; }\n        .lgf-status { display: inline-block; padding: 3px 10px; border-radius: 12px; font-size: 0.78em; font-weight: 600; white-space: nowrap; }\n        .lgf-status-expected   { background: #e8f0fe; color: #1a56db; }\n        .lgf-status-departed   { background: #def7ec; color: #057a55; }\n        .lgf-status-landed     { background: #def7ec; color: #057a55; }\n        .lgf-status-cancelled  { background: #fde8e8; color: #c81e1e; }\n        .lgf-status-delayed    { background: #fef3c7; color: #92400e; }\n        .lgf-status-unknown    { background: #f3f3f3; color: #888; }\n        .lgf-empty { padding: 30px; text-align: center; color: #888; background: #f9f9f9; border-radius: 8px; }\n        .lgf-error { padding: 16px; color: #c81e1e; background: #fde8e8; border-radius: 8px; }\n        .lgf-source { font-size: 0.75em; color: #aaa; margin-top: 10px; text-align: right; }\n\n        .lgf-actions { display: flex; gap: 4px; }\n        .lgf-action-btn { width: 26px; height: 26px; border: 1px solid #ddd; background: #fff; border-radius: 4px; cursor: pointer; font-size: 0.9em; display:flex; align-items:center; justify-content:center; padding: 0; }\n        .lgf-action-btn:hover { background: #1a3c6e; color: #fff; border-color: #1a3c6e; }\n\n        \/* Modal *\/\n        .lgf-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.6); z-index: 99999; display: flex; align-items: center; justify-content: center; padding: 20px; }\n        .lgf-modal-content { background: #fff; border-radius: 12px; max-width: 500px; width: 100%; padding: 24px; position: relative; max-height: 90vh; overflow-y: auto; }\n        .lgf-modal-close { position: absolute; top: 10px; right: 14px; background: none; border: none; font-size: 1.8em; cursor: pointer; color: #666; }\n        .lgf-modal-flight-num { font-size: 1.6em; font-weight: 700; color: #1a3c6e; }\n        .lgf-modal-route { font-size: 1.15em; margin: 10px 0 16px; color: #444; }\n        .lgf-modal-row { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #f0f0f0; }\n        .lgf-modal-row-label { color: #888; font-size: 0.9em; }\n        .lgf-modal-row-val { font-weight: 600; font-size: 0.95em; }\n        .lgf-modal-actions { display: flex; gap: 8px; margin-top: 16px; flex-wrap: wrap; }\n        .lgf-modal-btn { flex: 1; min-width: 120px; padding: 10px 14px; border-radius: 6px; border: none; cursor: pointer; font-weight: 600; font-size: 0.9em; }\n        .lgf-modal-btn.primary { background: #1a3c6e; color: #fff; }\n        .lgf-modal-btn.wa { background: #25D366; color: #fff; }\n        .lgf-modal-btn.copy { background: #f0f0f0; color: #333; }\n\n        @media (max-width: 700px) {\n            .lgf-table th:nth-child(5), .lgf-table td:nth-child(5),\n            .lgf-table th:nth-child(6), .lgf-table td:nth-child(6) { display: none; }\n            .lgf-airline-name { display: none; }\n            .lgf-dash-card { flex: 1 1 calc(50% - 5px); min-width: 0; }\n        }\n    <\/style>\n\n    <script>\n    (function() {\n        var WORKER_URL = 'https:\/\/flights-proxy.high-beach-hotels.workers.dev';\n        var DEFAULT_IATA = 'HER';\n        var currentIata = DEFAULT_IATA;\n        var currentTab = 'departures';\n        var currentLang = 'en';\n        var currentSearch = '';\n        var currentData = null;\n        var autoRefreshTimer = null;\n        var countdownTimer = null;\n        var allAirportsData = {}; \/\/ cache \u03b3\u03b9\u03b1 quick lookup\n\n        var ALL_IATAS = ['HER','ATH','SKG','RHO','CFU','KGS','JMK','JTR','ZTH','EFL','CHQ','MJT','SMI','KVA','PVK','AOK','JSI','VOL','IOA','KZI'];\n\n        var I18N = {\n            en: {\n                airport: 'Airport:', departures: 'Departures', arrivals: 'Arrivals',\n                source: 'Source: AeroDataBox | Data is indicative | Auto-refresh every 5 min',\n                flight: 'Flight', airline: 'Airline', destination: 'Destination', origin: 'Origin',\n                time: 'Time', term: 'Term.', gate: 'Gate', status: 'Status',\n                loading: 'Loading...', noflights: 'No flights found.', updated: 'Updated:',\n                search: 'Search flight, airline, city...',\n                title: 'Greek Airports Flights',\n                quicksearch: '\ud83d\udd0d Quick flight lookup (e.g. A3 432, FR 7392)...',\n                find: 'Find', notfound: 'Flight not found in any Greek airport today.',\n                ontime: 'On time', delayed: 'Delayed', cancelled: 'Cancelled', total: 'Total flights',\n                statuses: { Expected:'Expected', Departed:'Departed', Landed:'Landed', Cancelled:'Cancelled', Delayed:'Delayed', 'Check-in':'Check-in', Boarding:'Boarding', Unknown:'Unknown' },\n                weather: { feels:'Feels like', wind:'Wind', humidity:'Humidity' },\n                cd: { in:'in', soon:'Boarding now!', departed:'Departed', d:'d', h:'h', m:'min' },\n                modal: { route:'Route', scheduled:'Scheduled', revised:'Revised', terminal:'Terminal', gate:'Gate', status:'Status', aircraft:'Aircraft', share:'Share on WhatsApp', track:'Track live', copy:'Copy info', copied:'Copied!' }\n            },\n            gr: {\n                airport: '\u0391\u03b5\u03c1\u03bf\u03b4\u03c1\u03cc\u03bc\u03b9\u03bf:', departures: '\u0391\u03bd\u03b1\u03c7\u03c9\u03c1\u03ae\u03c3\u03b5\u03b9\u03c2', arrivals: '\u0391\u03c6\u03af\u03be\u03b5\u03b9\u03c2',\n                source: '\u03a0\u03b7\u03b3\u03ae: AeroDataBox | \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b5\u03bd\u03b4\u03b5\u03b9\u03ba\u03c4\u03b9\u03ba\u03ac | \u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03b1\u03bd\u03b1\u03bd\u03ad\u03c9\u03c3\u03b7 \u03ba\u03ac\u03b8\u03b5 5 \u03bb\u03b5\u03c0\u03c4\u03ac',\n                flight: '\u03a0\u03c4\u03ae\u03c3\u03b7', airline: '\u0391\u03b5\u03c1\u03bf\u03c0\u03bf\u03c1\u03b9\u03ba\u03ae', destination: '\u03a0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2', origin: '\u03a0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7',\n                time: '\u038f\u03c1\u03b1', term: '\u03a4\u03ad\u03c1\u03bc.', gate: 'Gate', status: '\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7',\n                loading: '\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...', noflights: '\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03c0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2.', updated: '\u0395\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03b8\u03b7\u03ba\u03b5:',\n                search: '\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03c0\u03c4\u03ae\u03c3\u03b7\u03c2, \u03b1\u03b5\u03c1\u03bf\u03c0\u03bf\u03c1\u03b9\u03ba\u03ae\u03c2, \u03c0\u03cc\u03bb\u03b7\u03c2...',\n                title: '\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ce\u03bd \u0391\u03b5\u03c1\u03bf\u03b4\u03c1\u03bf\u03bc\u03af\u03c9\u03bd',\n                quicksearch: '\ud83d\udd0d \u0393\u03c1\u03ae\u03b3\u03bf\u03c1\u03b7 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03c0\u03c4\u03ae\u03c3\u03b7\u03c2 (\u03c0.\u03c7. A3 432, FR 7392)...',\n                find: '\u0395\u03cd\u03c1\u03b5\u03c3\u03b7', notfound: '\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c0\u03c4\u03ae\u03c3\u03b7 \u03c3\u03b5 \u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03cc \u03b1\u03b5\u03c1\u03bf\u03b4\u03c1\u03cc\u03bc\u03b9\u03bf \u03c3\u03ae\u03bc\u03b5\u03c1\u03b1.',\n                ontime: '\u03a3\u03c4\u03b7\u03bd \u03ce\u03c1\u03b1', delayed: '\u039a\u03b1\u03b8\u03c5\u03c3\u03c4\u03b5\u03c1\u03ae\u03c3\u03b5\u03b9\u03c2', cancelled: '\u0391\u03ba\u03c5\u03c1\u03ce\u03c3\u03b5\u03b9\u03c2', total: '\u03a3\u03c5\u03bd\u03bf\u03bb\u03b9\u03ba\u03ad\u03c2 \u03c0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2',\n                statuses: { Expected:'\u0391\u03bd\u03b1\u03bc\u03ad\u03bd\u03b5\u03c4\u03b1\u03b9', Departed:'\u0391\u03bd\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03b5', Landed:'\u03a0\u03c1\u03bf\u03c3\u03b3\u03b5\u03b9\u03ce\u03b8\u03b7\u03ba\u03b5', Cancelled:'\u0391\u03ba\u03c5\u03c1\u03ce\u03b8\u03b7\u03ba\u03b5', Delayed:'\u039a\u03b1\u03b8\u03c5\u03c3\u03c4\u03ad\u03c1\u03b7\u03c3\u03b7', 'Check-in':'Check-in', Boarding:'\u0395\u03c0\u03b9\u03b2\u03af\u03b2\u03b1\u03c3\u03b7', Unknown:'\u0386\u03b3\u03bd\u03c9\u03c3\u03c4\u03b7' },\n                weather: { feels:'\u0391\u03af\u03c3\u03b8\u03b7\u03c3\u03b7', wind:'\u0386\u03bd\u03b5\u03bc\u03bf\u03c2', humidity:'\u03a5\u03b3\u03c1\u03b1\u03c3\u03af\u03b1' },\n                cd: { in:'\u03c3\u03b5', soon:'\u0395\u03c0\u03b9\u03b2\u03af\u03b2\u03b1\u03c3\u03b7 \u03c4\u03ce\u03c1\u03b1!', departed:'\u0388\u03c6\u03c5\u03b3\u03b5', d:'\u03bc', h:'\u03c9', m:'\u03bb' },\n                modal: { route:'\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae', scheduled:'\u03a0\u03c1\u03bf\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7', revised:'\u0391\u03bd\u03b1\u03b8\u03b5\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03b7', terminal:'\u03a4\u03b5\u03c1\u03bc\u03b1\u03c4\u03b9\u03ba\u03cc\u03c2', gate:'Gate', status:'\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7', aircraft:'\u0391\u03b5\u03c1\u03bf\u03c3\u03ba\u03ac\u03c6\u03bf\u03c2', share:'\u039a\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c3\u03b5 WhatsApp', track:'Live tracking', copy:'\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03b9\u03ce\u03bd', copied:'\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c6\u03b7\u03ba\u03b5!' }\n            },\n            de: {\n                airport: 'Flughafen:', departures: 'Abfl\u00fcge', arrivals: 'Ank\u00fcnfte',\n                source: 'Quelle: AeroDataBox | Daten sind unverbindlich | Auto-Aktualisierung alle 5 Min',\n                flight: 'Flug', airline: 'Fluglinie', destination: 'Ziel', origin: 'Herkunft',\n                time: 'Zeit', term: 'Term.', gate: 'Gate', status: 'Status',\n                loading: 'Laden...', noflights: 'Keine Fl\u00fcge gefunden.', updated: 'Aktualisiert:',\n                search: 'Flug, Fluglinie, Stadt suchen...',\n                title: 'Fl\u00fcge griechischer Flugh\u00e4fen',\n                quicksearch: '\ud83d\udd0d Schnelle Flugsuche (z.B. A3 432, FR 7392)...',\n                find: 'Suchen', notfound: 'Flug heute auf keinem griechischen Flughafen gefunden.',\n                ontime: 'P\u00fcnktlich', delayed: 'Versp\u00e4tet', cancelled: 'Storniert', total: 'Fl\u00fcge insgesamt',\n                statuses: { Expected:'Erwartet', Departed:'Abgeflogen', Landed:'Gelandet', Cancelled:'Storniert', Delayed:'Versp\u00e4tet', 'Check-in':'Check-in', Boarding:'Boarding', Unknown:'Unbekannt' },\n                weather: { feels:'Gef\u00fchlt', wind:'Wind', humidity:'Feuchtigkeit' },\n                cd: { in:'in', soon:'Boarding jetzt!', departed:'Abgeflogen', d:'T', h:'Std', m:'Min' },\n                modal: { route:'Strecke', scheduled:'Geplant', revised:'Aktualisiert', terminal:'Terminal', gate:'Gate', status:'Status', aircraft:'Flugzeug', share:'Auf WhatsApp teilen', track:'Live verfolgen', copy:'Info kopieren', copied:'Kopiert!' }\n            }\n        };\n\n        var AIRPORT_COORDS = {\n            HER:[35.34,25.18,'Heraklion'], ATH:[37.94,23.95,'Athens'], SKG:[40.52,22.97,'Thessaloniki'], RHO:[36.40,28.09,'Rhodes'],\n            CFU:[39.60,19.91,'Corfu'], KGS:[36.79,27.09,'Kos'], JMK:[37.43,25.35,'Mykonos'], JTR:[36.40,25.48,'Santorini'],\n            ZTH:[37.75,20.88,'Zakynthos'], EFL:[38.12,20.50,'Kefalonia'], CHQ:[35.53,24.15,'Chania'], MJT:[39.05,26.60,'Mytilene'],\n            SMI:[37.69,26.91,'Samos'], KVA:[40.91,24.62,'Kavala'], PVK:[38.93,20.77,'Preveza'], AOK:[35.42,27.15,'Karpathos'],\n            JSI:[39.18,23.50,'Skiathos'], VOL:[39.22,22.79,'Volos'], IOA:[39.69,20.82,'Ioannina'], KZI:[40.29,21.84,'Kozani']\n        };\n\n        function t() { return I18N[currentLang]; }\n\n        function flagEmoji(cc) {\n            if (!cc || cc.length !== 2) return '';\n            var code = cc.toUpperCase();\n            return String.fromCodePoint(code.charCodeAt(0) + 127397) + String.fromCodePoint(code.charCodeAt(1) + 127397);\n        }\n\n        function applyTranslations() {\n            var T = t();\n            document.getElementById('lgf-title').textContent = T.title;\n            document.getElementById('lgf-search').placeholder = T.search;\n            document.getElementById('lgf-quick-search').placeholder = T.quicksearch;\n            document.getElementById('lgf-quick-btn').textContent = T.find;\n            document.querySelectorAll('[data-i18n]').forEach(function(el) {\n                var key = el.getAttribute('data-i18n');\n                if (key === 'airport') el.firstChild.textContent = T.airport + ' ';\n                else if (T[key]) el.textContent = T[key];\n            });\n        }\n\n        function statusLabel(status) {\n            var s = (status || '').toLowerCase();\n            var T = t();\n            if (s.indexOf('depart') >= 0)   return { label: T.statuses.Departed, cls: 'lgf-status-departed', raw:'departed' };\n            if (s.indexOf('land') >= 0)     return { label: T.statuses.Landed, cls: 'lgf-status-landed', raw:'landed' };\n            if (s.indexOf('expect') >= 0)   return { label: T.statuses.Expected, cls: 'lgf-status-expected', raw:'expected' };\n            if (s.indexOf('cancel') >= 0)   return { label: T.statuses.Cancelled, cls: 'lgf-status-cancelled', raw:'cancelled' };\n            if (s.indexOf('delay') >= 0)    return { label: T.statuses.Delayed, cls: 'lgf-status-delayed', raw:'delayed' };\n            if (s.indexOf('check') >= 0)    return { label: T.statuses['Check-in'], cls: 'lgf-status-expected', raw:'expected' };\n            if (s.indexOf('board') >= 0)    return { label: T.statuses.Boarding, cls: 'lgf-status-expected', raw:'expected' };\n            return { label: status || T.statuses.Unknown, cls: 'lgf-status-unknown', raw:'unknown' };\n        }\n\n        function formatTime(str) {\n            if (!str) return '-';\n            var m = str.match(\/T?(\\d{2}:\\d{2})\/) || str.match(\/(\\d{2}:\\d{2})\/);\n            return m ? m[1] : '-';\n        }\n\n        function parseUTC(str) {\n            if (!str) return null;\n            var d = new Date(str.replace(' ', 'T').replace(\/([+-]\\d{2}:\\d{2}|Z)?$\/, function(m) {\n                return m || 'Z';\n            }));\n            return isNaN(d.getTime()) ? null : d;\n        }\n\n        function airlineLogo(iata) {\n            if (!iata) return '';\n            return 'https:\/\/images.kiwi.com\/airlines\/64\/' + iata + '.png';\n        }\n\n        function weatherIcon(code) {\n            if (code === 0) return '\u2600\ufe0f';\n            if (code <= 3) return '\u26c5';\n            if (code <= 48) return '\ud83c\udf2b\ufe0f';\n            if (code <= 67) return '\ud83c\udf27\ufe0f';\n            if (code <= 77) return '\u2744\ufe0f';\n            if (code <= 82) return '\ud83c\udf26\ufe0f';\n            if (code <= 99) return '\u26c8\ufe0f';\n            return '\ud83c\udf24\ufe0f';\n        }\n\n        \/\/ === COUNTDOWN ===\n        function countdownText(targetUtcStr) {\n            var target = parseUTC(targetUtcStr);\n            if (!target) return null;\n            var diff = target.getTime() - Date.now();\n            var T = t();\n            if (diff < -300000) return { txt: T.cd.departed, cls: 'lgf-cd-far' }; \/\/ \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03b1\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03b1\u03c1\u03b5\u03bb\u03b8\u03cc\u03bd\n            if (diff < 0) return { txt: T.cd.soon, cls: 'lgf-cd-soon' };\n            var mins = Math.floor(diff \/ 60000);\n            var hrs  = Math.floor(mins \/ 60);\n            var days = Math.floor(hrs \/ 24);\n            var cls = hrs >= 2 ? 'lgf-cd-far' : (hrs >= 1 ? 'lgf-cd-near' : 'lgf-cd-soon');\n            var parts = [];\n            if (days > 0) parts.push(days + T.cd.d);\n            if (hrs % 24 > 0) parts.push((hrs % 24) + T.cd.h);\n            parts.push((mins % 60) + T.cd.m);\n            return { txt: T.cd.in + ' ' + parts.join(' '), cls: cls };\n        }\n\n        function updateCountdowns() {\n            document.querySelectorAll('.lgf-countdown[data-utc]').forEach(function(el) {\n                var cd = countdownText(el.getAttribute('data-utc'));\n                if (cd) {\n                    el.textContent = cd.txt;\n                    el.className = 'lgf-countdown ' + cd.cls;\n                }\n            });\n        }\n\n        \/\/ === STATUS DASHBOARD ===\n        function renderDashboard() {\n            if (!currentData) return;\n            var T = t();\n            var flights = (currentData.departures || []).concat(currentData.arrivals || []);\n            var total = 0, ontime = 0, delayed = 0, cancelled = 0;\n            flights.forEach(function(f) {\n                var s = (f.status || '').toLowerCase();\n                if (s.indexOf('cancel') >= 0) { cancelled++; total++; }\n                else if (s.indexOf('delay') >= 0) { delayed++; total++; }\n                else if (s.indexOf('expect') >= 0 || s.indexOf('depart') >= 0 || s.indexOf('land') >= 0) { ontime++; total++; }\n            });\n\n            var totalCls = 'good';\n            if (cancelled > 0) totalCls = 'bad';\n            else if (delayed >= 3) totalCls = 'warn';\n\n            var html =\n                '<div class=\"lgf-dash-card ' + totalCls + '\"><span class=\"lgf-dash-icon\">\u2708\ufe0f<\/span><div><div class=\"lgf-dash-num\">' + total + '<\/div><div class=\"lgf-dash-label\">' + T.total + '<\/div><\/div><\/div>' +\n                '<div class=\"lgf-dash-card good\"><span class=\"lgf-dash-icon\">\u2705<\/span><div><div class=\"lgf-dash-num\">' + ontime + '<\/div><div class=\"lgf-dash-label\">' + T.ontime + '<\/div><\/div><\/div>' +\n                '<div class=\"lgf-dash-card ' + (delayed > 0 ? 'warn' : '') + '\"><span class=\"lgf-dash-icon\">\u23f1\ufe0f<\/span><div><div class=\"lgf-dash-num\">' + delayed + '<\/div><div class=\"lgf-dash-label\">' + T.delayed + '<\/div><\/div><\/div>' +\n                '<div class=\"lgf-dash-card ' + (cancelled > 0 ? 'bad' : '') + '\"><span class=\"lgf-dash-icon\">\ud83d\udeab<\/span><div><div class=\"lgf-dash-num\">' + cancelled + '<\/div><div class=\"lgf-dash-label\">' + T.cancelled + '<\/div><\/div><\/div>';\n\n            var dashEl = document.getElementById('lgf-dashboard');\n            dashEl.innerHTML = html;\n            dashEl.style.display = 'flex';\n        }\n\n        \/\/ === WEATHER ===\n        function loadWeather() {\n            var coords = AIRPORT_COORDS[currentIata];\n            if (!coords) return;\n            var url = 'https:\/\/api.open-meteo.com\/v1\/forecast?latitude=' + coords[0] + '&longitude=' + coords[1] +\n                '&current=temperature_2m,apparent_temperature,relative_humidity_2m,wind_speed_10m,weather_code' +\n                '&daily=temperature_2m_max,temperature_2m_min,weather_code&forecast_days=4&timezone=auto';\n\n            fetch(url)\n                .then(function(r) { return r.json(); })\n                .then(function(data) {\n                    var T = t();\n                    var c = data.current;\n                    var d = data.daily;\n                    var dayNames = { en: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],\n                                     gr: ['\u039a\u03c5\u03c1','\u0394\u03b5\u03c5','\u03a4\u03c1\u03b9','\u03a4\u03b5\u03c4','\u03a0\u03b5\u03bc','\u03a0\u03b1\u03c1','\u03a3\u03b1\u03b2'],\n                                     de: ['So','Mo','Di','Mi','Do','Fr','Sa'] };\n\n                    var html = '<span class=\"lgf-weather-icon\">' + weatherIcon(c.weather_code) + '<\/span>' +\n                        '<div><div class=\"lgf-weather-now\">' + Math.round(c.temperature_2m) + '\u00b0C<\/div>' +\n                        '<div class=\"lgf-weather-meta\">' + T.weather.feels + ' ' + Math.round(c.apparent_temperature) + '\u00b0C \u00b7 ' +\n                        T.weather.wind + ' ' + Math.round(c.wind_speed_10m) + ' km\/h \u00b7 ' +\n                        T.weather.humidity + ' ' + c.relative_humidity_2m + '%<\/div><\/div>' +\n                        '<div class=\"lgf-weather-fc\">';\n\n                    for (var i = 1; i < d.time.length; i++) {\n                        var date = new Date(d.time[i]);\n                        var dn = dayNames[currentLang][date.getDay()];\n                        html += '<div class=\"lgf-weather-day\">' +\n                            '<div class=\"lgf-weather-day-name\">' + dn + '<\/div>' +\n                            '<div>' + weatherIcon(d.weather_code[i]) + '<\/div>' +\n                            '<div class=\"lgf-weather-day-temp\">' + Math.round(d.temperature_2m_max[i]) + '\u00b0\/' + Math.round(d.temperature_2m_min[i]) + '\u00b0<\/div>' +\n                            '<\/div>';\n                    }\n                    html += '<\/div>';\n\n                    var wEl = document.getElementById('lgf-weather');\n                    wEl.innerHTML = html;\n                    wEl.classList.add('shown');\n                })\n                .catch(function() {});\n        }\n\n        \/\/ === QUICK LOOKUP (search across all airports) ===\n        function findFlightAcrossAirports(flightNum, callback) {\n            var normalized = flightNum.toUpperCase().replace(\/\\s+\/g, '').trim();\n            \/\/ \u03a0\u03c1\u03ce\u03c4\u03b1 \u03c8\u03ac\u03c7\u03bd\u03b5\u03b9 \u03c3\u03c4\u03b1 \u03ae\u03b4\u03b7 \u03c6\u03bf\u03c1\u03c4\u03c9\u03bc\u03ad\u03bd\u03b1 \u03b1\u03b5\u03c1\u03bf\u03b4\u03c1\u03cc\u03bc\u03b9\u03b1\n            for (var iata in allAirportsData) {\n                var data = allAirportsData[iata];\n                var found = searchInData(data, normalized, iata);\n                if (found) { callback(found); return; }\n            }\n            \/\/ \u0391\u03bd \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03c4\u03bf cache, \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03b5\u03b9 \u03c4\u03b1 \u03b1\u03b5\u03c1\u03bf\u03b4\u03c1\u03cc\u03bc\u03b9\u03b1 \u03ad\u03bd\u03b1-\u03ad\u03bd\u03b1\n            var idx = 0;\n            function tryNext() {\n                if (idx >= ALL_IATAS.length) { callback(null); return; }\n                var iata = ALL_IATAS[idx++];\n                if (allAirportsData[iata]) { tryNext(); return; }\n                fetch(WORKER_URL + '\/?iata=' + iata)\n                    .then(function(r) { return r.json(); })\n                    .then(function(data) {\n                        allAirportsData[iata] = data;\n                        var found = searchInData(data, normalized, iata);\n                        if (found) callback(found);\n                        else tryNext();\n                    })\n                    .catch(function() { tryNext(); });\n            }\n            tryNext();\n        }\n\n        function searchInData(data, normalized, iata) {\n            var allFlights = [\n                { type: 'departure', list: data.departures || [] },\n                { type: 'arrival', list: data.arrivals || [] }\n            ];\n            for (var i = 0; i < allFlights.length; i++) {\n                var category = allFlights[i];\n                for (var j = 0; j < category.list.length; j++) {\n                    var f = category.list[j];\n                    if ((f.number || '').toUpperCase().replace(\/\\s+\/g, '') === normalized) {\n                        return { flight: f, type: category.type, atIata: iata };\n                    }\n                }\n            }\n            return null;\n        }\n\n        function showFlightModal(result) {\n            var T = t();\n            var f = result.flight;\n            var isDep = result.type === 'departure';\n            var movement = isDep ? f.arrival : f.departure;\n            var ownTime  = isDep ? f.departure : f.arrival;\n\n            var thisAirport = AIRPORT_COORDS[result.atIata] ? AIRPORT_COORDS[result.atIata][2] + ' (' + result.atIata + ')' : result.atIata;\n            var otherName = (movement && movement.airport) ? movement.airport.name : '-';\n            var otherIata = (movement && movement.airport && movement.airport.iata) ? movement.airport.iata : '';\n            var otherCC = (movement && movement.airport && movement.airport.countryCode) ? movement.airport.countryCode : '';\n            var otherFull = otherName + (otherIata ? ' (' + otherIata + ')' : '');\n\n            var route = isDep ? (thisAirport + ' \u2192 ' + flagEmoji(otherCC) + ' ' + otherFull)\n                              : (flagEmoji(otherCC) + ' ' + otherFull + ' \u2192 ' + thisAirport);\n\n            var sched = ownTime && ownTime.scheduledTime ? formatTime(ownTime.scheduledTime.local) : '-';\n            var revised = ownTime && ownTime.revisedTime ? formatTime(ownTime.revisedTime.local) : null;\n            var terminal = (ownTime && ownTime.terminal) || (movement && movement.terminal) || '-';\n            var gate = (ownTime && ownTime.gate) || (movement && movement.gate) || '-';\n            var st = statusLabel(f.status);\n            var aircraft = (f.aircraft && f.aircraft.model) ? f.aircraft.model : '-';\n            var airline = (f.airline && f.airline.name) ? f.airline.name : '';\n            var flightNum = (f.number || '-').replace(\/\\s+\/g, '');\n\n            var html = '<div class=\"lgf-modal-flight-num\">\u2708 ' + f.number + (airline ? ' \u00b7 ' + airline : '') + '<\/div>' +\n                '<div class=\"lgf-modal-route\">' + route + '<\/div>' +\n                '<div class=\"lgf-modal-row\"><span class=\"lgf-modal-row-label\">' + T.modal.scheduled + '<\/span><span class=\"lgf-modal-row-val\">' + sched + '<\/span><\/div>';\n            if (revised && revised !== sched) {\n                html += '<div class=\"lgf-modal-row\"><span class=\"lgf-modal-row-label\">' + T.modal.revised + '<\/span><span class=\"lgf-modal-row-val\" style=\"color:#c81e1e\">' + revised + '<\/span><\/div>';\n            }\n            html += '<div class=\"lgf-modal-row\"><span class=\"lgf-modal-row-label\">' + T.modal.terminal + '<\/span><span class=\"lgf-modal-row-val\">' + terminal + '<\/span><\/div>' +\n                '<div class=\"lgf-modal-row\"><span class=\"lgf-modal-row-label\">' + T.modal.gate + '<\/span><span class=\"lgf-modal-row-val\">' + gate + '<\/span><\/div>' +\n                '<div class=\"lgf-modal-row\"><span class=\"lgf-modal-row-label\">' + T.modal.status + '<\/span><span class=\"lgf-modal-row-val\"><span class=\"lgf-status ' + st.cls + '\">' + st.label + '<\/span><\/span><\/div>' +\n                '<div class=\"lgf-modal-row\"><span class=\"lgf-modal-row-label\">' + T.modal.aircraft + '<\/span><span class=\"lgf-modal-row-val\">' + aircraft + '<\/span><\/div>';\n\n            \/\/ Countdown\n            var cdUtc = ownTime && ownTime.revisedTime ? ownTime.revisedTime.utc : (ownTime && ownTime.scheduledTime ? ownTime.scheduledTime.utc : null);\n            if (cdUtc) {\n                var cd = countdownText(cdUtc);\n                if (cd) html += '<div style=\"text-align:center; margin-top:14px;\"><span class=\"lgf-countdown ' + cd.cls + '\" style=\"font-size:1em; padding:6px 14px;\">' + cd.txt + '<\/span><\/div>';\n            }\n\n            \/\/ Share text\n            var shareText = '\u2708\ufe0f ' + f.number + ' ' + (airline ? '(' + airline + ') ' : '') +\n                            (isDep ? 'departing from ' : 'arriving at ') + thisAirport +\n                            (isDep ? ' to ' : ' from ') + otherFull +\n                            ' at ' + (revised || sched) +\n                            ' \u00b7 Status: ' + st.label +\n                            (terminal !== '-' ? ' \u00b7 Terminal ' + terminal : '') +\n                            (gate !== '-' ? ' \u00b7 Gate ' + gate : '') +\n                            '\\n\\nTrack: https:\/\/www.flightradar24.com\/' + flightNum;\n\n            html += '<div class=\"lgf-modal-actions\">' +\n                '<button class=\"lgf-modal-btn primary\" onclick=\"window.open(\\'https:\/\/www.flightradar24.com\/' + flightNum + '\\',\\'_blank\\')\">\ud83d\udccd ' + T.modal.track + '<\/button>' +\n                '<button class=\"lgf-modal-btn wa\" onclick=\"window.open(\\'https:\/\/wa.me\/?text=\\' + encodeURIComponent(' + JSON.stringify(shareText) + '),\\'_blank\\')\">\ud83d\udcac ' + T.modal.share + '<\/button>' +\n                '<button class=\"lgf-modal-btn copy\" id=\"lgf-copy-btn\">\ud83d\udccb ' + T.modal.copy + '<\/button>' +\n                '<\/div>';\n\n            document.getElementById('lgf-modal-body').innerHTML = html;\n            document.getElementById('lgf-modal').style.display = 'flex';\n\n            document.getElementById('lgf-copy-btn').addEventListener('click', function() {\n                navigator.clipboard.writeText(shareText).then(function() {\n                    var btn = document.getElementById('lgf-copy-btn');\n                    var orig = btn.textContent;\n                    btn.textContent = '\u2713 ' + T.modal.copied;\n                    setTimeout(function() { btn.textContent = orig; }, 2000);\n                });\n            });\n        }\n\n        \/\/ === RENDER MAIN TABLE ===\n        function render() {\n            var content = document.getElementById('lgf-content');\n            var T = t();\n            if (!currentData) {\n                content.innerHTML = '<div class=\"lgf-loading\">\u23f3 ' + T.loading + '<\/div>';\n                return;\n            }\n\n            var flights = currentData[currentTab] || [];\n\n            \/\/ \u03a6\u03b9\u03bb\u03c4\u03c1\u03ac\u03c1\u03b5\u03b9 \u03c0\u03b1\u03bb\u03b9\u03ad\u03c2 \u03c0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2\n            var now = new Date();\n            var cutoff = now.getTime() - 20 * 60 * 1000;\n            flights = flights.filter(function(f) {\n                var isDep = currentTab === 'departures';\n                var ownTime = isDep ? f.departure : f.arrival;\n                if (!ownTime) return true;\n                var timeStr = (ownTime.revisedTime && ownTime.revisedTime.utc) ||\n                              (ownTime.scheduledTime && ownTime.scheduledTime.utc);\n                if (!timeStr) return true;\n                var flightTime = parseUTC(timeStr);\n                if (!flightTime) return true;\n                var status = (f.status || '').toLowerCase();\n                if ((status.indexOf('depart') >= 0 || status.indexOf('land') >= 0) &&\n                    flightTime.getTime() < cutoff) return false;\n                if (flightTime.getTime() < now.getTime() - 2 * 60 * 60 * 1000) return false;\n                return true;\n            });\n\n            if (currentSearch) {\n                var q = currentSearch.toLowerCase();\n                flights = flights.filter(function(f) {\n                    var isDep = currentTab === 'departures';\n                    var mv = isDep ? f.arrival : f.departure;\n                    var city = (mv && mv.airport && mv.airport.name) ? mv.airport.name.toLowerCase() : '';\n                    var iata = (mv && mv.airport && mv.airport.iata) ? mv.airport.iata.toLowerCase() : '';\n                    var num  = (f.number || '').toLowerCase();\n                    var air  = (f.airline && f.airline.name) ? f.airline.name.toLowerCase() : '';\n                    return city.indexOf(q) >= 0 || iata.indexOf(q) >= 0 || num.indexOf(q) >= 0 || air.indexOf(q) >= 0;\n                });\n            }\n\n            if (flights.length === 0) {\n                content.innerHTML = '<div class=\"lgf-empty\">' + T.noflights + '<\/div>';\n                return;\n            }\n\n            var isDep = currentTab === 'departures';\n            var cityHeader = isDep ? T.destination : T.origin;\n\n            var html = '<div class=\"lgf-table-wrap\"><table class=\"lgf-table\"><thead><tr>' +\n                '<th>' + T.flight + '<\/th>' +\n                '<th>' + T.airline + '<\/th>' +\n                '<th>' + cityHeader + '<\/th>' +\n                '<th>' + T.time + '<\/th>' +\n                '<th>' + T.term + '<\/th>' +\n                '<th>' + T.gate + '<\/th>' +\n                '<th>' + T.status + '<\/th>' +\n                '<th><\/th>' +\n                '<\/tr><\/thead><tbody>';\n\n            flights.forEach(function(f, idx) {\n                var movement = isDep ? f.arrival : f.departure;\n                var ownTime  = isDep ? f.departure : f.arrival;\n\n                var cityName = (movement && movement.airport) ? (movement.airport.name || '-') : '-';\n                var cityIata = (movement && movement.airport) ? (movement.airport.iata || '') : '';\n                var cityCC   = (movement && movement.airport) ? (movement.airport.countryCode || '') : '';\n                var flag     = flagEmoji(cityCC);\n                var timeStr  = ownTime && ownTime.scheduledTime ? formatTime(ownTime.scheduledTime.local) : '-';\n                var revised  = ownTime && ownTime.revisedTime ? formatTime(ownTime.revisedTime.local) : null;\n                var utcRef   = ownTime && ownTime.revisedTime ? ownTime.revisedTime.utc : (ownTime && ownTime.scheduledTime ? ownTime.scheduledTime.utc : null);\n                var terminal = (ownTime && ownTime.terminal) || (movement && movement.terminal) || '-';\n                var gate     = (ownTime && ownTime.gate) || (movement && movement.gate) || '-';\n                var st       = statusLabel(f.status);\n                var airline  = (f.airline && f.airline.name) ? f.airline.name : '';\n                var airIata  = (f.airline && f.airline.iata) ? f.airline.iata : '';\n                var logoUrl  = airlineLogo(airIata);\n                var flightNum = (f.number || '-').replace(\/\\s+\/g, '');\n                var timeDisp = timeStr;\n                if (revised && revised !== timeStr) {\n                    timeDisp = '<span style=\"text-decoration:line-through;color:#999;\">' + timeStr + '<\/span> <strong>' + revised + '<\/strong>';\n                }\n\n                var cdHtml = '';\n                if (utcRef && st.raw !== 'departed' && st.raw !== 'landed' && st.raw !== 'cancelled') {\n                    var cd = countdownText(utcRef);\n                    if (cd) cdHtml = '<br><span class=\"lgf-countdown ' + cd.cls + '\" data-utc=\"' + utcRef + '\">' + cd.txt + '<\/span>';\n                }\n\n                html += '<tr data-flight-idx=\"' + idx + '\">' +\n                    '<td class=\"lgf-number\">' + (f.number || '-') + '<\/td>' +\n                    '<td><div class=\"lgf-airline-cell\">' +\n                        (logoUrl ? '<img decoding=\"async\" class=\"lgf-airline-logo\" src=\"' + logoUrl + '\" alt=\"\" onerror=\"this.style.display=\\'none\\'\"\/>' : '') +\n                        '<span class=\"lgf-airline-name\">' + airline + '<\/span>' +\n                    '<\/div><\/td>' +\n                    '<td><div class=\"lgf-city\">' +\n                        (flag ? '<span class=\"lgf-flag\">' + flag + '<\/span>' : '') +\n                        '<span>' + cityName + (cityIata ? ' <span class=\"lgf-city-iata\">(' + cityIata + ')<\/span>' : '') + '<\/span>' +\n                    '<\/div><\/td>' +\n                    '<td>' + timeDisp + cdHtml + '<\/td>' +\n                    '<td>' + terminal + '<\/td>' +\n                    '<td>' + gate + '<\/td>' +\n                    '<td><span class=\"lgf-status ' + st.cls + '\">' + st.label + '<\/span><\/td>' +\n                    '<td><div class=\"lgf-actions\">' +\n                        '<button class=\"lgf-action-btn lgf-info-btn\" data-flight-idx=\"' + idx + '\" title=\"Details\">\u2139<\/button>' +\n                        '<button class=\"lgf-action-btn lgf-fr24-btn\" onclick=\"event.stopPropagation();window.open(\\'https:\/\/www.flightradar24.com\/' + flightNum + '\\',\\'_blank\\')\" title=\"Track\">\ud83d\udccd<\/button>' +\n                    '<\/div><\/td>' +\n                    '<\/tr>';\n            });\n\n            html += '<\/tbody><\/table><\/div>';\n            content.innerHTML = html;\n\n            \/\/ Bind info buttons\n            content.querySelectorAll('.lgf-info-btn').forEach(function(btn) {\n                btn.addEventListener('click', function(e) {\n                    e.stopPropagation();\n                    var idx = parseInt(btn.getAttribute('data-flight-idx'));\n                    showFlightModal({ flight: flights[idx], type: currentTab === 'departures' ? 'departure' : 'arrival', atIata: currentIata });\n                });\n            });\n\n            var nowTime = new Date();\n            document.getElementById('lgf-updated').textContent =\n                T.updated + ' ' + String(nowTime.getHours()).padStart(2,'0') + ':' + String(nowTime.getMinutes()).padStart(2,'0');\n        }\n\n        function loadFlights(force) {\n            var content = document.getElementById('lgf-content');\n            content.innerHTML = '<div class=\"lgf-loading\">\u23f3 ' + t().loading + ' ' + currentIata + '...<\/div>';\n\n            var cacheKey = 'lgf_' + currentIata;\n            if (!force) {\n                try {\n                    var cached = localStorage.getItem(cacheKey);\n                    if (cached) {\n                        var obj = JSON.parse(cached);\n                        if (Date.now() - obj.ts < 300000) {\n                            currentData = obj.data;\n                            allAirportsData[currentIata] = obj.data;\n                            render();\n                            renderDashboard();\n                            return;\n                        }\n                    }\n                } catch(e) {}\n            }\n\n            fetch(WORKER_URL + '\/?iata=' + currentIata)\n                .then(function(r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })\n                .then(function(data) {\n                    currentData = data;\n                    allAirportsData[currentIata] = data;\n                    try { localStorage.setItem(cacheKey, JSON.stringify({ ts: Date.now(), data: data })); } catch(e) {}\n                    render();\n                    renderDashboard();\n                })\n                .catch(function(err) {\n                    content.innerHTML = '<div class=\"lgf-error\">\u26a0\ufe0f Error: ' + err.message + '<\/div>';\n                });\n        }\n\n        function startAutoRefresh() {\n            if (autoRefreshTimer) clearInterval(autoRefreshTimer);\n            autoRefreshTimer = setInterval(function() { loadFlights(true); loadWeather(); }, 300000);\n        }\n\n        function startCountdownTimer() {\n            if (countdownTimer) clearInterval(countdownTimer);\n            countdownTimer = setInterval(updateCountdowns, 60000);\n        }\n\n        \/\/ Event listeners\n        document.getElementById('lgf-lang').addEventListener('change', function(e) {\n            currentLang = e.target.value;\n            applyTranslations();\n            render();\n            renderDashboard();\n            loadWeather();\n        });\n\n        document.getElementById('lgf-airport').addEventListener('change', function(e) {\n            currentIata = e.target.value;\n            document.getElementById('lgf-weather').classList.remove('shown');\n            loadFlights();\n            loadWeather();\n        });\n\n        document.querySelectorAll('.lgf-tab').forEach(function(btn) {\n            btn.addEventListener('click', function() {\n                document.querySelectorAll('.lgf-tab').forEach(function(b) { b.classList.remove('active'); });\n                btn.classList.add('active');\n                currentTab = btn.getAttribute('data-tab');\n                render();\n            });\n        });\n\n        document.getElementById('lgf-search').addEventListener('input', function(e) {\n            currentSearch = e.target.value.trim();\n            render();\n        });\n\n        document.getElementById('lgf-refresh').addEventListener('click', function() {\n            var b = document.getElementById('lgf-refresh');\n            b.classList.add('spinning');\n            \/\/ Clear all airport cache for quick lookup\n            allAirportsData = {};\n            loadFlights(true);\n            loadWeather();\n            setTimeout(function() { b.classList.remove('spinning'); }, 1000);\n        });\n\n        \/\/ Quick Lookup\n        function doQuickLookup() {\n            var val = document.getElementById('lgf-quick-search').value.trim();\n            if (!val) return;\n            var btn = document.getElementById('lgf-quick-btn');\n            var origText = btn.textContent;\n            btn.textContent = '\u23f3';\n            btn.disabled = true;\n\n            findFlightAcrossAirports(val, function(result) {\n                btn.textContent = origText;\n                btn.disabled = false;\n                if (result) {\n                    showFlightModal(result);\n                } else {\n                    alert(t().notfound);\n                }\n            });\n        }\n        document.getElementById('lgf-quick-btn').addEventListener('click', doQuickLookup);\n        document.getElementById('lgf-quick-search').addEventListener('keypress', function(e) {\n            if (e.key === 'Enter') doQuickLookup();\n        });\n\n        \/\/ Modal close\n        document.getElementById('lgf-modal-close').addEventListener('click', function() {\n            document.getElementById('lgf-modal').style.display = 'none';\n        });\n        document.getElementById('lgf-modal').addEventListener('click', function(e) {\n            if (e.target.id === 'lgf-modal') document.getElementById('lgf-modal').style.display = 'none';\n        });\n\n        loadFlights();\n        loadWeather();\n        startAutoRefresh();\n        startCountdownTimer();\n    })();\n    <\/script>\n    \n\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-3087","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.5 (Yoast SEO v27.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 - Le Grand Travel<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/\" \/>\n<meta property=\"og:locale\" content=\"el_GR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2\" \/>\n<meta property=\"og:url\" content=\"https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/\" \/>\n<meta property=\"og:site_name\" content=\"Le Grand Travel\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/LeGrandTravel\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-22T10:52:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/legrandtravel.gr\/wp-content\/uploads\/2022\/12\/Le-Grand-Tourism-Enterprises.png\" \/>\n\t<meta property=\"og:image:width\" content=\"477\" \/>\n\t<meta property=\"og:image:height\" content=\"170\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\\\/\",\"url\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\\\/\",\"name\":\"\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 - Le Grand Travel\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/#website\"},\"datePublished\":\"2026-05-22T08:28:11+00:00\",\"dateModified\":\"2026-05-22T10:52:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\\\/#breadcrumb\"},\"inLanguage\":\"el\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/#website\",\"url\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/\",\"name\":\"Le Grand Travel\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/#organization\"},\"alternateName\":\"LE GRAND TOURISM ENTERPRISES\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"el\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/#organization\",\"name\":\"Le Grand Tourism Enterprises SA\",\"url\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"el\",\"@id\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/legrandtravel.gr\\\/wp-content\\\/uploads\\\/Le-Grand-40-Aniversary.png\",\"contentUrl\":\"https:\\\/\\\/legrandtravel.gr\\\/wp-content\\\/uploads\\\/Le-Grand-40-Aniversary.png\",\"width\":726,\"height\":170,\"caption\":\"Le Grand Tourism Enterprises SA\"},\"image\":{\"@id\":\"https:\\\/\\\/legrandtravel.gr\\\/el\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/LeGrandTravel\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 - Le Grand Travel","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/","og_locale":"el_GR","og_type":"article","og_title":"\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2","og_url":"https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/","og_site_name":"Le Grand Travel","article_publisher":"https:\/\/www.facebook.com\/LeGrandTravel\/","article_modified_time":"2026-05-22T10:52:30+00:00","og_image":[{"width":477,"height":170,"url":"https:\/\/legrandtravel.gr\/wp-content\/uploads\/2022\/12\/Le-Grand-Tourism-Enterprises.png","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/","url":"https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/","name":"\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 - Le Grand Travel","isPartOf":{"@id":"https:\/\/legrandtravel.gr\/el\/#website"},"datePublished":"2026-05-22T08:28:11+00:00","dateModified":"2026-05-22T10:52:30+00:00","breadcrumb":{"@id":"https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/#breadcrumb"},"inLanguage":"el","potentialAction":[{"@type":"ReadAction","target":["https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/legrandtravel.gr\/el\/%cf%80%cf%84%ce%ae%cf%83%ce%b5%ce%b9%cf%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/legrandtravel.gr\/el\/"},{"@type":"ListItem","position":2,"name":"\u03a0\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2"}]},{"@type":"WebSite","@id":"https:\/\/legrandtravel.gr\/el\/#website","url":"https:\/\/legrandtravel.gr\/el\/","name":"Le Grand Travel","description":"","publisher":{"@id":"https:\/\/legrandtravel.gr\/el\/#organization"},"alternateName":"LE GRAND TOURISM ENTERPRISES","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/legrandtravel.gr\/el\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"el"},{"@type":"Organization","@id":"https:\/\/legrandtravel.gr\/el\/#organization","name":"Le Grand Tourism Enterprises SA","url":"https:\/\/legrandtravel.gr\/el\/","logo":{"@type":"ImageObject","inLanguage":"el","@id":"https:\/\/legrandtravel.gr\/el\/#\/schema\/logo\/image\/","url":"https:\/\/legrandtravel.gr\/wp-content\/uploads\/Le-Grand-40-Aniversary.png","contentUrl":"https:\/\/legrandtravel.gr\/wp-content\/uploads\/Le-Grand-40-Aniversary.png","width":726,"height":170,"caption":"Le Grand Tourism Enterprises SA"},"image":{"@id":"https:\/\/legrandtravel.gr\/el\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/LeGrandTravel\/"]}]}},"_links":{"self":[{"href":"https:\/\/legrandtravel.gr\/el\/wp-json\/wp\/v2\/pages\/3087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/legrandtravel.gr\/el\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/legrandtravel.gr\/el\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/legrandtravel.gr\/el\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/legrandtravel.gr\/el\/wp-json\/wp\/v2\/comments?post=3087"}],"version-history":[{"count":3,"href":"https:\/\/legrandtravel.gr\/el\/wp-json\/wp\/v2\/pages\/3087\/revisions"}],"predecessor-version":[{"id":3128,"href":"https:\/\/legrandtravel.gr\/el\/wp-json\/wp\/v2\/pages\/3087\/revisions\/3128"}],"wp:attachment":[{"href":"https:\/\/legrandtravel.gr\/el\/wp-json\/wp\/v2\/media?parent=3087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}