{"id":1250,"date":"2026-01-16T19:54:05","date_gmt":"2026-01-17T01:54:05","guid":{"rendered":"https:\/\/project.arhaero.ru\/?page_id=1250"},"modified":"2026-02-03T11:47:19","modified_gmt":"2026-02-03T17:47:19","slug":"%d1%80%d0%b5%d0%b3%d1%83%d0%bb%d1%8f%d1%80%d0%bd%d1%8b%d0%b5-%d1%80%d0%b5%d0%b9%d1%81%d1%8b","status":"publish","type":"page","link":"https:\/\/project.arhaero.ru\/?page_id=1250","title":{"rendered":"\u0420\u0415\u0413\u0423\u041b\u042f\u0420\u041d\u042b\u0415 \u0420\u0415\u0419\u0421\u042b"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1250\" class=\"elementor elementor-1250\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-33a2bd0 e-flex e-con-boxed e-con e-parent\" data-id=\"33a2bd0\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5f287c5 elementor-widget elementor-widget-html\" data-id=\"5f287c5\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"seasonal-flight-widget-cards\">\r\n    \r\n<style>\r\n    \/* ========================================= *\/\r\n    \/* 1. \u0411\u0410\u0417\u041e\u0412\u042b\u0415 \u0421\u0422\u0418\u041b\u0418 *\/\r\n    \/* ========================================= *\/\r\n    #seasonal-flight-widget-cards {\r\n        font-family: Arial, Helvetica, sans-serif;\r\n        width: 100%; \r\n        max-width: 1200px; \r\n        margin: 0 auto; \r\n        color: #333;\r\n    }\r\n\r\n    #seasonal-flight-widget-cards * {\r\n        box-sizing: border-box;\r\n        outline: none;\r\n    }\r\n\r\n    \/* ========================================= *\/\r\n    \/* 2. \u041a\u041d\u041e\u041f\u041a\u0418 (\u0422\u0410\u0411\u042b) - \u0418\u0421\u041f\u0420\u0410\u0412\u041b\u0415\u041d\u041e *\/\r\n    \/* ========================================= *\/\r\n    .tabs-container {\r\n        display: flex;\r\n        justify-content: center;\r\n        gap: 15px;\r\n        margin-bottom: 25px;\r\n        align-items: flex-end; \/* \u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043d\u0438\u0437\u0443, \u0447\u0442\u043e\u0431\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u043e\u0441\u043b\u0430 \u0432\u0432\u0435\u0440\u0445 *\/\r\n        min-height: 60px; \/* \u0420\u0435\u0437\u0435\u0440\u0432 \u043c\u0435\u0441\u0442\u0430 \u043f\u043e\u0434 \u043f\u0440\u044b\u0436\u043e\u043a \u043a\u043d\u043e\u043f\u043a\u0438 *\/\r\n    }\r\n\r\n    .tab-btn {\r\n        border: none;\r\n        cursor: pointer;\r\n        font-family: Arial, Helvetica, sans-serif;\r\n        line-height: 1;\r\n        \r\n        \/* \u0426\u0412\u0415\u0422 \u0422\u0415\u041a\u0421\u0422\u0410 \u0411\u0415\u041b\u042b\u0419 (FIX: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e !important) *\/\r\n        color: #ffffff !important; \r\n        font-weight: 700;\r\n        font-size: 16px; \r\n        padding: 12px 30px;\r\n        \r\n        \/* \u0426\u0412\u0415\u0422 \u0424\u041e\u041d\u0410 *\/\r\n        background: #14234D; \r\n        \r\n        border-radius: 30px; \r\n        box-shadow: 0 4px 6px rgba(0,0,0,0.1);\r\n        transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); \/* \u0411\u043e\u043b\u0435\u0435 \u043f\u043b\u0430\u0432\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f *\/\r\n        \r\n        \/* \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u043a\u043e\u044f (\u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430) *\/\r\n        transform: translateY(0);\r\n    }\r\n\r\n    .tab-btn:hover { \r\n        opacity: 1;\r\n        transform: translateY(-2px); \/* \u041b\u0435\u0433\u043a\u0438\u0439 \u043f\u043e\u0434\u044a\u0435\u043c \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 *\/\r\n    }\r\n\r\n    \/* \u0410\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 - \u0412\u042b\u0428\u0415 \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 *\/\r\n    .tab-btn.active {\r\n        background: #14234D; \r\n        opacity: 1;\r\n        \/* FIX: \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0448\u0435 *\/\r\n        transform: translateY(-6px); \r\n        \/* FIX: \u0422\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 *\/\r\n        box-shadow: 0 10px 20px rgba(0,0,0,0.25); \r\n    }\r\n\r\n    \/* ========================================= *\/\r\n    \/* 3. \u0421\u0415\u0422\u041a\u0410 \u0413\u041e\u0420\u041e\u0414\u041e\u0412 (GRID) *\/\r\n    \/* ========================================= *\/\r\n    #grid-view {\r\n        display: grid;\r\n        grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\r\n        gap: 20px;\r\n        width: 100%;\r\n        animation: fadeIn 0.5s ease;\r\n    }\r\n\r\n    .city-card {\r\n        position: relative;\r\n        height: 320px;\r\n        border-radius: 15px;\r\n        overflow: hidden;\r\n        cursor: pointer;\r\n        box-shadow: 0 5px 15px rgba(0,0,0,0.15);\r\n        transition: transform 0.3s ease;\r\n        background-color: #eee;\r\n    }\r\n\r\n    .city-card:hover { transform: translateY(-5px); }\r\n\r\n    .card-img {\r\n        width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s ease;\r\n    }\r\n    .city-card:hover .card-img { transform: scale(1.05); }\r\n\r\n    .card-overlay {\r\n        position: absolute; bottom: 0; left: 0; width: 100%; height: 60%;\r\n        background: linear-gradient(to top, rgba(0,0,0,0.8) 0%, transparent 100%);\r\n        display: flex; align-items: flex-end; padding: 20px;\r\n    }\r\n    .card-title {\r\n        color: white; font-weight: 800; font-size: 20px;\r\n        text-shadow: 1px 1px 4px rgba(0,0,0,0.8);\r\n    }\r\n\r\n    \/* ========================================= *\/\r\n    \/* 4. \u0422\u0410\u0411\u041b\u041e \u0420\u0410\u0421\u041f\u0418\u0421\u0410\u041d\u0418\u042f *\/\r\n    \/* ========================================= *\/\r\n    #schedule-view {\r\n        display: none; width: 100%; animation: fadeIn 0.3s ease;\r\n    }\r\n\r\n    .back-btn {\r\n        display: inline-block;\r\n        background: #14234D; \/* \u0422\u0415\u041c\u041d\u041e-\u0421\u0418\u041d\u0418\u0419 *\/\r\n        color: #ffffff !important; \/* \u0411\u0415\u041b\u042b\u0419 \u0422\u0415\u041a\u0421\u0422 *\/\r\n        padding: 10px 30px;\r\n        border-radius: 30px;\r\n        border: none;\r\n        font-weight: bold;\r\n        cursor: pointer;\r\n        margin-bottom: 20px;\r\n        transition: all 0.3s;\r\n        box-shadow: 0 4px 6px rgba(0,0,0,0.1);\r\n    }\r\n    .back-btn:hover { \r\n        transform: translateY(-2px);\r\n        box-shadow: 0 6px 10px rgba(0,0,0,0.2);\r\n    }\r\n\r\n    .day-board {\r\n        border-radius: 20px;\r\n        overflow: hidden;\r\n        background: #FFFFFF; \/* \u0411\u0435\u043b\u044b\u0439 \u0444\u043e\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 *\/\r\n        display: flex;\r\n        flex-direction: column;\r\n        box-shadow: 0 15px 40px rgba(0,0,0,0.1);\r\n        padding-bottom: 15px;\r\n    }\r\n\r\n    .day-header {\r\n        background: #FFFFFF;\r\n        padding: 20px 10px; \r\n        font-size: 22px; \r\n        font-weight: 900;\r\n        color: #000; \/* \u0427\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 *\/\r\n        text-transform: uppercase;\r\n        text-align: center;\r\n        border-bottom: 1px solid #e0e0e0;\r\n        margin-bottom: 10px;\r\n    }\r\n\r\n    .flight-board {\r\n        padding: 0 15px; \r\n        display: flex;\r\n        flex-direction: column;\r\n        gap: 10px; \/* \u041e\u0442\u0441\u0442\u0443\u043f \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 *\/\r\n    }\r\n\r\n    \/* --- PC STYLES (\u0422\u0430\u0431\u043b\u0438\u0446\u0430) --- *\/\r\n    .seasonal-grid-layout {\r\n        display: grid;\r\n        grid-template-columns: 1.5fr 0.8fr 1fr 1.2fr 0.8fr 0.8fr; \r\n        gap: 0;\r\n        align-items: center;\r\n    }\r\n\r\n    .pc-header-row {\r\n        text-align: center; padding: 0 10px 10px 10px;\r\n    }\r\n    .pc-header-row div {\r\n        font-size: 14px; \r\n        font-weight: 700; \r\n        color: #000; \/* \u0427\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 *\/\r\n        opacity: 0.6;\r\n        text-transform: none;\r\n    }\r\n\r\n    .flight-row-wrapper {\r\n        background: #F1F1F1; \/* \u0421\u0412\u0415\u0422\u041b\u041e-\u0421\u0415\u0420\u042b\u0419 \u0424\u041e\u041d \u0421\u0422\u0420\u041e\u041a\u0418 *\/\r\n        border-radius: 15px; \/* \u0417\u0410\u041a\u0420\u0423\u0413\u041b\u0415\u041d\u041d\u042b\u0415 \u041a\u0420\u0410\u042f *\/\r\n        overflow: hidden;\r\n        min-height: auto; \r\n        transition: background 0.2s;\r\n        margin: 0;\r\n        cursor: default;\r\n    }\r\n\r\n    .pc-row-content {\r\n        padding: 0; \r\n        height: 50px; \/* \u0427\u0443\u0442\u044c \u0432\u044b\u0448\u0435 *\/\r\n    }\r\n    .pc-row-content > div {\r\n        font-size: 15px; \r\n        font-weight: 700; \r\n        color: #000; \/* \u0427\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 *\/\r\n        padding: 0 5px; \r\n        text-align: center; height: 100%;\r\n        display: flex; align-items: center; justify-content: center;\r\n        line-height: 1;\r\n    }\r\n\r\n    \/* --- MOBILE STYLES --- *\/\r\n    .mob-row-content { display: none; }\r\n    \r\n    .mob-main-line {\r\n        display: grid;\r\n        grid-template-columns: 1.5fr 1fr 1fr 40px; \r\n        align-items: center;\r\n        padding: 10px; \r\n        cursor: pointer;\r\n        min-height: 50px; \r\n    }\r\n    \r\n    .mob-cell {\r\n        text-align: center;\r\n        font-size: 13px; \r\n        font-weight: 700; \r\n        color: #000;\r\n        display: flex; align-items: center; justify-content: center;\r\n        line-height: 1.1;\r\n        padding: 0 3px;\r\n    }\r\n    \r\n    .mob-cell-days { \r\n        font-weight: normal; \r\n        text-transform: lowercase; \r\n        color: #555;\r\n    }\r\n\r\n    .mob-chevron {\r\n        width: 10px; height: 10px;\r\n        border-top: 2px solid #555; border-right: 2px solid #555;\r\n        transform: rotate(135deg);\r\n        transition: transform 0.3s ease;\r\n        margin: auto;\r\n    }\r\n    \r\n    .flight-row-wrapper.expanded { \r\n        background: #e0e0e0; \/* \u0427\u0443\u0442\u044c \u0442\u0435\u043c\u043d\u0435\u0435 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 *\/\r\n    }\r\n    .flight-row-wrapper.expanded .mob-chevron { transform: rotate(-45deg); border-color: #000; }\r\n\r\n    .mob-expanded-details {\r\n        display: none;\r\n        background: rgba(0,0,0,0.03);\r\n        border-top: 1px dashed #bbb;\r\n        padding: 0;\r\n    }\r\n    \r\n    .flight-row-wrapper.expanded .mob-expanded-details {\r\n        display: block; animation: fadeIn 0.3s ease;\r\n    }\r\n\r\n    .mob-detail-row {\r\n        display: flex; justify-content: space-between;\r\n        padding: 10px 20px;\r\n        font-size: 13px; color: #333;\r\n        border-bottom: 1px solid rgba(0,0,0,0.05);\r\n    }\r\n    .mob-detail-row:last-child { border-bottom: none; }\r\n    .mob-label { color: #777; font-weight: normal; }\r\n    .mob-value { font-weight: 800; color: #000; }\r\n\r\n    .status-msg { text-align: center; padding: 40px; color: #777; font-weight: bold; }\r\n    @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\r\n\r\n    \/* ========================================= *\/\r\n    \/* 5. \u0410\u0414\u0410\u041f\u0422\u0418\u0412\u041d\u041e\u0421\u0422\u042c *\/\r\n    \/* ========================================= *\/\r\n    @media (max-width: 900px) {\r\n        .pc-header-row, .pc-row-content { display: none !important; }\r\n        .mob-row-content { display: block; }\r\n        .flight-row-wrapper { cursor: pointer; }\r\n    }\r\n\r\n    @media (max-width: 600px) {\r\n        #grid-view {\r\n            grid-template-columns: repeat(2, 1fr);\r\n            gap: 12px;\r\n            padding: 0 5px;\r\n        }\r\n        .city-card { height: 280px; border-radius: 12px; }\r\n        .card-title { font-size: 16px; }\r\n        .card-overlay { padding: 15px; height: 50%; }\r\n        .tabs-container { gap: 10px; margin-bottom: 20px; }\r\n        .tab-btn { font-size: 14px; padding: 10px 20px; }\r\n    }\r\n<\/style>\r\n\r\n    <!-- 1. \u041a\u041d\u041e\u041f\u041a\u0418 \u0422\u0418\u041f\u0410 -->\r\n    <div class=\"tabs-container\">\r\n        <button id=\"btn-dep\" class=\"tab-btn active\" onclick=\"window.flightWidget.switchType('departures')\">\u0412\u044b\u043b\u0435\u0442<\/button>\r\n        <button id=\"btn-arr\" class=\"tab-btn\" onclick=\"window.flightWidget.switchType('arrivals')\">\u041f\u0440\u0438\u043b\u0435\u0442<\/button>\r\n    <\/div>\r\n\r\n    <!-- 2. \u0413\u0420\u0418\u0414 \u0413\u041e\u0420\u041e\u0414\u041e\u0412 -->\r\n    <div id=\"grid-view\">\r\n        <div class=\"status-msg\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445...<\/div>\r\n    <\/div>\r\n\r\n    <!-- 3. \u0422\u0410\u0411\u041b\u041e \u0420\u0410\u0421\u041f\u0418\u0421\u0410\u041d\u0418\u042f -->\r\n    <div id=\"schedule-view\">\r\n        <button class=\"back-btn\" onclick=\"window.flightWidget.goBack()\">\u2190 \u041a \u0441\u043f\u0438\u0441\u043a\u0443 \u0433\u043e\u0440\u043e\u0434\u043e\u0432<\/button>\r\n        \r\n        <div class=\"day-board\">\r\n            <div id=\"detail-city-title\" class=\"day-header\">\u0413\u041e\u0420\u041e\u0414<\/div>\r\n            \r\n            <div class=\"flight-board\">\r\n                <!-- \u0428\u0430\u043f\u043a\u0430 (\u0442\u043e\u043b\u044c\u043a\u043e \u041f\u041a) -->\r\n                <div class=\"pc-header-row seasonal-grid-layout\">\r\n                    <div>\u041f\u0435\u0440\u0438\u043e\u0434<\/div>\r\n                    <div>\u0422\u0438\u043f \u0412\u0421<\/div>\r\n                    <div>\u0420\u0435\u0439\u0441<\/div>\r\n                    <div>\u0414\u043d\u0438 \u043d\u0435\u0434\u0435\u043b\u0438<\/div>\r\n                    <div>\u0412\u044b\u043b\u0435\u0442<\/div>\r\n                    <div>\u041f\u0440\u0438\u0431\u044b\u0442\u0438\u0435<\/div>\r\n                <\/div>\r\n\r\n                <!-- \u0421\u0442\u0440\u043e\u043a\u0438 -->\r\n                <div id=\"detail-rows-container\" style=\"display: flex; flex-direction: column; gap: 10px;\">\r\n                    <!-- JS INJECTION -->\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n        window.flightWidget = (function() { \r\n            const cityImages = {\r\n                \"\u041c\u043e\u0441\u043a\u0432\u0430\": \"https:\/\/project.arhaero.ru\/wp-content\/uploads\/2026\/01\/view-moscow-kremlin-1.png\", \r\n                \"\u041c\u043e\u0441\u043a\u0432\u0430(\u0428\u0420\u041c)\": \"https:\/\/project.arhaero.ru\/wp-content\/uploads\/2026\/01\/view-moscow-kremlin-1.png\", \r\n                \"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\": \"https:\/\/project.arhaero.ru\/wp-content\/uploads\/2026\/01\/saint-isaac-s-cathedral-st-petersburg-1.png\",\r\n                \"\u0421.\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\": \"https:\/\/project.arhaero.ru\/wp-content\/uploads\/2026\/01\/saint-isaac-s-cathedral-st-petersburg-1.png\",\r\n                \"\u0421.\u041f\u0415\u0422\u0415\u0420\u0411\u0423\u0420\u0413\": \"https:\/\/project.arhaero.ru\/wp-content\/uploads\/2026\/01\/saint-isaac-s-cathedral-st-petersburg-1.png\",\r\n                \"\u041c\u0443\u0440\u043c\u0430\u043d\u0441\u043a\": \"https:\/\/project.arhaero.ru\/wp-content\/uploads\/2026\/01\/vertical-shot-winter-landscape-with-northern-lights-reflection-frozen-lake-tromso-1.png\",\r\n                \"\u041a\u0430\u043b\u0438\u043d\u0438\u043d\u0433\u0440\u0430\u0434\": \"https:\/\/project.arhaero.ru\/wp-content\/uploads\/2026\/01\/\u041a\u0410\u041b\u0418\u041d\u0418\u041d\u0413\u0420\u0410\u0414.png\",\r\n                \"\u041d\u0430\u0440\u044c\u044f\u043d-\u041c\u0430\u0440\": \"https:\/\/project.arhaero.ru\/wp-content\/uploads\/2026\/01\/\u041d\u0410\u0420\u042c\u042f\u041d-\u041c\u0410\u0420.png\",\r\n                \"\u0421\u043e\u0447\u0438\": \"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/2\/2a\/Sochi_Marine_Station.jpg\/640px-Sochi_Marine_Station.jpg\",\r\n                \"\u0415\u043a\u0430\u0442\u0435\u0440\u0438\u043d\u0431\u0443\u0440\u0433\": \"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/9\/98\/Yekaterinburg_City_Administration_building.jpg\/640px-Yekaterinburg_City_Administration_building.jpg\",\r\n                \"\u0410\u043c\u0434\u0435\u0440\u043c\u0430-2\": \"https:\/\/project.arhaero.ru\/wp-content\/uploads\/2026\/01\/NovayaZeml-1.png\",\r\n                \"\u0410\u043d\u0442\u0430\u043b\u044c\u044f\": \"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/2\/26\/Antalya_Old_Harbour.jpg\/640px-Antalya_Old_Harbour.jpg\",\r\n                \"\u041a\u0430\u0437\u0430\u043d\u044c\": \"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/0\/05\/Kazan_Kremlin_view.jpg\/640px-Kazan_Kremlin_view.jpg\",\r\n                \"\u041c\u0438\u043d\u0441\u043a\": \"\",\r\n                \"DEFAULT\": \"https:\/\/via.placeholder.com\/400x300?text=\u041d\u0435\u0442+\u0424\u043e\u0442\u043e\" \r\n            };\r\n\r\n            let currentType = 'departures'; \r\n            let flightsData = { arrivals: [], departures: [] };\r\n            \r\n            const filePaths = {\r\n                arrivals: '\/wp-content\/uploads\/flights\/arrival.csv',\r\n                departures: '\/wp-content\/uploads\/flights\/departure.csv'\r\n            };\r\n\r\n            function getCityPriority(cityName) {\r\n                const city = cityName.toLowerCase();\r\n                if (city.includes('\u043c\u043e\u0441\u043a\u0432\u0430')) return 1;\r\n                if (city.includes('\u043f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433') || city.includes('\u0441\u043f\u0431') || city === '\u0441.\u043f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433') return 2;\r\n                if (city.includes('\u0430\u043d\u0442\u0430\u043b\u044c\u044f') || city.includes('\u0430\u043d\u0442\u0430\u043b\u0438\u044f')) return 3;\r\n                if (city.includes('\u043c\u0443\u0440\u043c\u0430\u043d\u0441\u043a')) return 4;\r\n                if (city.includes('\u043d\u0430\u0440\u044c\u044f\u043d')) return 5;\r\n                if (city.includes('\u0430\u043c\u0434\u0435\u0440\u043c\u0430')) return 6;\r\n                return 100;\r\n            }\r\n\r\n            function calculateDuration(timeFrom, timeTo) {\r\n                if (!timeFrom || !timeTo) return '-';\r\n                let [h1, m1] = timeFrom.split(':').map(Number);\r\n                let [h2, m2] = timeTo.split(':').map(Number);\r\n                let startMin = h1 * 60 + m1;\r\n                let endMin = h2 * 60 + m2;\r\n                if (endMin < startMin) endMin += 24 * 60;\r\n                let diff = endMin - startMin;\r\n                let hours = Math.floor(diff \/ 60);\r\n                let mins = diff % 60;\r\n                return `${hours}\u0447 ${mins}\u043c\u0438\u043d`;\r\n            }\r\n\r\n            async function loadCSV(fileType) {\r\n                try {\r\n                    const filePath = filePaths[fileType];\r\n                    const timestamp = new Date().getTime();\r\n                    const response = await fetch(`${filePath}?t=${timestamp}`);\r\n                    if (!response.ok) return [];\r\n                    const buffer = await response.arrayBuffer();\r\n                    let text = '';\r\n                    try {\r\n                        const decoder1251 = new TextDecoder('windows-1251');\r\n                        text = decoder1251.decode(buffer);\r\n                    } catch (e1) {\r\n                        text = new TextDecoder('utf-8').decode(buffer);\r\n                    }\r\n                    return mergeDuplicateFlights(parseCSV(text));\r\n                } catch (e) { return []; }\r\n            }\r\n            \r\n            function parseCSV(csvText) {\r\n                const rows = csvText.split('\\n');\r\n                if (rows.length < 2) return [];\r\n                const result = [];\r\n                for (let i = 1; i < rows.length; i++) {\r\n                    const row = rows[i].trim();\r\n                    if (!row) continue;\r\n                    let cells = [], currentCell = '', inQuotes = false;\r\n                    for (let j = 0; j < row.length; j++) {\r\n                        const char = row[j];\r\n                        if (char === '\"') inQuotes = !inQuotes;\r\n                        else if (char === ',' && !inQuotes) {\r\n                            cells.push(currentCell.trim());\r\n                            currentCell = '';\r\n                        } else currentCell += char;\r\n                    }\r\n                    cells.push(currentCell.trim());\r\n                    while (cells.length < 8) cells.push('');\r\n                    \r\n                    result.push({\r\n                        AIRPORT: cells[0] || '',\r\n                        DATE_FROM: cells[1] || '',\r\n                        DATE_TO: cells[2] || '',\r\n                        CRAFT: cells[3] || '',\r\n                        FLIGHT: cells[4] || '',\r\n                        FREQ: cells[5] || '',\r\n                        TIME_FROM: cells[6] || '',\r\n                        TIME_TO: cells[7] || ''\r\n                    });\r\n                }\r\n                return result;\r\n            }\r\n            \r\n            function mergeDuplicateFlights(flights) {\r\n                const flightMap = new Map();\r\n                const mergedFlights = [];\r\n                flights.forEach(flight => {\r\n                    const key = `${flight.AIRPORT}|${flight.DATE_FROM}|${flight.DATE_TO}|${flight.CRAFT}|${flight.FREQ}|${flight.TIME_FROM}|${flight.TIME_TO}`;\r\n                    if (!flightMap.has(key)) flightMap.set(key, []);\r\n                    flightMap.get(key).push(flight);\r\n                });\r\n                flightMap.forEach((flightGroup) => {\r\n                    if (flightGroup.length === 1) mergedFlights.push(flightGroup[0]);\r\n                    else {\r\n                        const fv = flightGroup.filter(f => f.FLIGHT.startsWith('FV'));\r\n                        const su = flightGroup.filter(f => f.FLIGHT.startsWith('SU'));\r\n                        const other = flightGroup.filter(f => !f.FLIGHT.startsWith('FV') && !f.FLIGHT.startsWith('SU'));\r\n                        fv.forEach(fvFlight => {\r\n                            const num = fvFlight.FLIGHT.substring(2);\r\n                            const matchSu = su.find(s => s.FLIGHT.substring(2) === num);\r\n                            if (matchSu) {\r\n                                mergedFlights.push({ ...fvFlight, FLIGHT: `FV${num} \/ SU${num}` });\r\n                                const suIdx = su.indexOf(matchSu);\r\n                                if (suIdx > -1) su.splice(suIdx, 1);\r\n                            } else { mergedFlights.push(fvFlight); }\r\n                        });\r\n                        su.forEach(s => mergedFlights.push(s));\r\n                        other.forEach(o => mergedFlights.push(o));\r\n                    }\r\n                });\r\n                return mergedFlights;\r\n            }\r\n\r\n            function groupFlightsByCity(flights) {\r\n                const grouped = {};\r\n                flights.forEach(flight => {\r\n                    let city = (flight.AIRPORT || '\u0411\u0435\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f').replace(\/\"\/g, ''); \r\n                    if (!grouped[city]) grouped[city] = [];\r\n                    grouped[city].push(flight);\r\n                });\r\n                Object.keys(grouped).forEach(city => {\r\n                    grouped[city].sort((a, b) => {\r\n                         const tA = (a.TIME_FROM || '00:00').split(':').map(Number);\r\n                         const tB = (b.TIME_FROM || '00:00').split(':').map(Number);\r\n                         return (tA[0]*60 + tA[1]) - (tB[0]*60 + tB[1]);\r\n                    });\r\n                });\r\n                return grouped;\r\n            }\r\n\r\n            \/\/ === \u0412\u0418\u0417\u0423\u0410\u041b\u0418\u0417\u0410\u0426\u0418\u042f ===\r\n\r\n            function renderGrid() {\r\n                const container = document.getElementById('grid-view');\r\n                container.innerHTML = '';\r\n                const rawFlights = flightsData[currentType];\r\n                if (!rawFlights || rawFlights.length === 0) {\r\n                    container.innerHTML = '<div class=\"status-msg\">\u041d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0440\u0435\u0439\u0441\u0430\u0445<\/div>';\r\n                    return;\r\n                }\r\n                const grouped = groupFlightsByCity(rawFlights);\r\n                \r\n                \/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\r\n                const sortedCities = Object.keys(grouped).sort((a, b) => {\r\n                    const priorityA = getCityPriority(a);\r\n                    const priorityB = getCityPriority(b);\r\n                    if (priorityA !== priorityB) return priorityA - priorityB;\r\n                    return a.localeCompare(b, 'ru');\r\n                });\r\n\r\n                sortedCities.forEach(city => {\r\n                    let imageUrl = cityImages.DEFAULT;\r\n                    if (cityImages[city]) imageUrl = cityImages[city];\r\n                    else {\r\n                        for (const key in cityImages) {\r\n                            if (city.includes(key) && key !== 'DEFAULT') {\r\n                                imageUrl = cityImages[key];\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    const card = document.createElement('div');\r\n                    card.className = 'city-card';\r\n                    card.onclick = () => openSchedule(city, grouped[city]);\r\n                    card.innerHTML = `\r\n                        <img decoding=\"async\" src=\"${imageUrl}\" alt=\"${city}\" class=\"card-img\">\r\n                        <div class=\"card-overlay\">\r\n                            <div class=\"card-title\">${city}<\/div>\r\n                        <\/div>\r\n                    `;\r\n                    container.appendChild(card);\r\n                });\r\n            }\r\n\r\n            function openSchedule(cityName, flights) {\r\n                document.getElementById('grid-view').style.display = 'none';\r\n                document.getElementById('schedule-view').style.display = 'block';\r\n                document.getElementById('seasonal-flight-widget-cards').scrollIntoView({ behavior: 'smooth' });\r\n\r\n                document.getElementById('detail-city-title').textContent = cityName;\r\n                renderScheduleRows(flights);\r\n            }\r\n\r\n            function renderScheduleRows(flights) {\r\n                const rowsContainer = document.getElementById('detail-rows-container');\r\n                rowsContainer.innerHTML = '';\r\n                \r\n                flights.forEach(f => {\r\n                    const rowWrapper = document.createElement('div');\r\n                    rowWrapper.className = 'flight-row-wrapper';\r\n                    \r\n                    rowWrapper.onclick = function() {\r\n                        if (window.innerWidth <= 900) {\r\n                            this.classList.toggle('expanded');\r\n                        }\r\n                    };\r\n\r\n                    const duration = calculateDuration(f.TIME_FROM, f.TIME_TO);\r\n\r\n                    rowWrapper.innerHTML = `\r\n                        <!-- PC \u0412\u0435\u0440\u0441\u0438\u044f -->\r\n                        <div class=\"pc-row-content seasonal-grid-layout\">\r\n                            <div>${f.DATE_FROM} - ${f.DATE_TO}<\/div>\r\n                            <div>${f.CRAFT}<\/div>\r\n                            <div style=\"font-weight:700;\">${f.FLIGHT}<\/div>\r\n                            <div style=\"text-transform:lowercase;\">${f.FREQ}<\/div>\r\n                            <div style=\"font-size: 18px;\">${f.TIME_FROM}<\/div>\r\n                            <div style=\"font-size: 18px;\">${f.TIME_TO}<\/div>\r\n                        <\/div>\r\n\r\n                        <!-- Mobile \u0412\u0435\u0440\u0441\u0438\u044f -->\r\n                        <div class=\"mob-row-content\">\r\n                            <!-- \u0421\u0432\u0435\u0440\u043d\u0443\u0442\u043e -->\r\n                            <div class=\"mob-main-line\">\r\n                                <div class=\"mob-cell mob-cell-date\">${f.DATE_FROM}<br>${f.DATE_TO}<\/div>\r\n                                <div class=\"mob-cell mob-cell-flight\">${f.FLIGHT}<\/div>\r\n                                <div class=\"mob-cell mob-cell-days\">${f.FREQ}<\/div>\r\n                                <div class=\"mob-chevron\"><\/div>\r\n                            <\/div>\r\n                            <!-- \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e -->\r\n                            <div class=\"mob-expanded-details\">\r\n                                <div class=\"mob-detail-row\">\r\n                                    <span class=\"mob-label\">\u0422\u0438\u043f \u0412\u0421:<\/span>\r\n                                    <span class=\"mob-value\">${f.CRAFT}<\/span>\r\n                                <\/div>\r\n                                <div class=\"mob-detail-row\">\r\n                                    <span class=\"mob-label\">\u0412\u044b\u043b\u0435\u0442:<\/span>\r\n                                    <span class=\"mob-value\">${f.TIME_FROM}<\/span>\r\n                                <\/div>\r\n                                <div class=\"mob-detail-row\">\r\n                                    <span class=\"mob-label\">\u041f\u0440\u0438\u043b\u0435\u0442:<\/span>\r\n                                    <span class=\"mob-value\">${f.TIME_TO}<\/span>\r\n                                <\/div>\r\n                                <div class=\"mob-detail-row\">\r\n                                    <span class=\"mob-label\">\u0412\u0440\u0435\u043c\u044f \u0432 \u043f\u0443\u0442\u0438:<\/span>\r\n                                    <span class=\"mob-value\">${duration}<\/span>\r\n                                <\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    `;\r\n                    rowsContainer.appendChild(rowWrapper);\r\n                });\r\n            }\r\n\r\n            function goBack() {\r\n                document.getElementById('schedule-view').style.display = 'none';\r\n                document.getElementById('grid-view').style.display = 'grid';\r\n            }\r\n\r\n            function switchType(type) {\r\n                currentType = type;\r\n                const btnDep = document.getElementById('btn-dep');\r\n                const btnArr = document.getElementById('btn-arr');\r\n                \r\n                if (type === 'departures') {\r\n                    btnDep.classList.add('active');\r\n                    btnArr.classList.remove('active');\r\n                } else {\r\n                    btnDep.classList.remove('active');\r\n                    btnArr.classList.add('active');\r\n                }\r\n                \r\n                \/\/ \u0421\u0431\u0440\u043e\u0441 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438\r\n                document.getElementById('schedule-view').style.display = 'none';\r\n                document.getElementById('grid-view').style.display = 'grid';\r\n                \r\n                renderGrid(); \r\n            }\r\n\r\n            async function init() {\r\n                try {\r\n                    const [dep, arr] = await Promise.all([\r\n                        loadCSV('departures'),\r\n                        loadCSV('arrivals')\r\n                    ]);\r\n                    flightsData.departures = dep;\r\n                    flightsData.arrivals = arr;\r\n                    renderGrid();\r\n                } catch (e) {\r\n                    document.getElementById('grid-view').innerHTML = '<div class=\"status-msg\">\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/div>';\r\n                }\r\n            }\r\n            return { init, switchType, goBack };\r\n        })();\r\n\r\n        if (document.readyState === 'loading') {\r\n            document.addEventListener('DOMContentLoaded', () => window.flightWidget.init());\r\n        } else {\r\n            window.flightWidget.init();\r\n        }\r\n    <\/script>\r\n<\/div>\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":"<p>\u0412\u044b\u043b\u0435\u0442 \u041f\u0440\u0438\u043b\u0435\u0442 \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445&#8230; \u2190 \u041a \u0441\u043f\u0438\u0441\u043a\u0443 \u0433\u043e\u0440\u043e\u0434\u043e\u0432 \u0413\u041e\u0420\u041e\u0414 \u041f\u0435\u0440\u0438\u043e\u0434 \u0422\u0438\u043f \u0412\u0421 \u0420\u0435\u0439\u0441 \u0414\u043d\u0438 \u043d\u0435\u0434\u0435\u043b\u0438 \u0412\u044b\u043b\u0435\u0442 \u041f\u0440\u0438\u0431\u044b\u0442\u0438\u0435<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-1250","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/project.arhaero.ru\/index.php?rest_route=\/wp\/v2\/pages\/1250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/project.arhaero.ru\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/project.arhaero.ru\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/project.arhaero.ru\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/project.arhaero.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1250"}],"version-history":[{"count":61,"href":"https:\/\/project.arhaero.ru\/index.php?rest_route=\/wp\/v2\/pages\/1250\/revisions"}],"predecessor-version":[{"id":2556,"href":"https:\/\/project.arhaero.ru\/index.php?rest_route=\/wp\/v2\/pages\/1250\/revisions\/2556"}],"wp:attachment":[{"href":"https:\/\/project.arhaero.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}