{"id":220,"date":"2026-01-10T09:57:47","date_gmt":"2026-01-10T07:57:47","guid":{"rendered":"https:\/\/meteopatras.eu\/new\/?page_id=220"},"modified":"2026-06-14T09:15:23","modified_gmt":"2026-06-14T06:15:23","slug":"history-data","status":"publish","type":"page","link":"https:\/\/meteopatras.eu\/new\/history-data\/","title":{"rendered":"\u0399\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ac \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1"},"content":{"rendered":"<style>\r\n#mp-hw-v12-56469 {\r\n  --mp-bg: #07111f;\r\n  --mp-bg-2: #0b2137;\r\n  --mp-card: rgba(255,255,255,.075);\r\n  --mp-card-2: rgba(255,255,255,.105);\r\n  --mp-border: rgba(255,255,255,.14);\r\n  --mp-text: #eef7ff;\r\n  --mp-muted: rgba(238,247,255,.72);\r\n  --mp-accent: #35c2ff;\r\n  --mp-accent-2: #80e0ff;\r\n  --mp-green: #39d98a;\r\n  --mp-yellow: #ffd166;\r\n  --mp-orange: #ff9b54;\r\n  --mp-red: #ff5c7a;\r\n  --mp-radius: 22px;\r\n  color: var(--mp-text);\r\n  font-family: inherit;\r\n}\r\n#mp-hw-v12-56469 * { box-sizing: border-box; }\r\n#mp-hw-v12-56469 .mp-wrap {\r\n  background:\r\n    radial-gradient(circle at top left, rgba(53,194,255,.24), transparent 34%),\r\n    radial-gradient(circle at bottom right, rgba(57,217,138,.15), transparent 32%),\r\n    linear-gradient(135deg, var(--mp-bg), #0a1424 62%, #07111f);\r\n  border: 1px solid var(--mp-border);\r\n  border-radius: 28px;\r\n  overflow: hidden;\r\n  box-shadow: 0 18px 55px rgba(0,0,0,.28);\r\n}\r\n#mp-hw-v12-56469 .mp-hero,\r\n#mp-hw-v12-56469 .mp-controls,\r\n#mp-hw-v12-56469 .mp-content { padding: 26px 28px; }\r\n#mp-hw-v12-56469 .mp-hero { border-bottom: 1px solid var(--mp-border); }\r\n#mp-hw-v12-56469 .mp-kicker {\r\n  display: inline-flex; align-items: center; gap: 8px;\r\n  padding: 7px 12px; border-radius: 999px;\r\n  background: rgba(53,194,255,.13); border: 1px solid rgba(53,194,255,.27);\r\n  color: var(--mp-accent-2); font-size: 13px; font-weight: 800; margin-bottom: 14px;\r\n}\r\n#mp-hw-v12-56469 h2 { margin: 0 0 10px; color: #fff; font-size: clamp(25px, 3vw, 38px); line-height: 1.12; }\r\n#mp-hw-v12-56469 .mp-subtitle { margin: 0; max-width: 940px; color: var(--mp-muted); line-height: 1.65; font-size: 16px; }\r\n#mp-hw-v12-56469 .mp-info {\r\n  margin-top: 18px; padding: 16px 18px; border-radius: 18px;\r\n  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.12);\r\n}\r\n#mp-hw-v12-56469 .mp-info h3 { margin: 0 0 8px; color: #fff; font-size: 18px; line-height: 1.25; }\r\n#mp-hw-v12-56469 .mp-info p { margin: 0 0 10px; color: var(--mp-muted); line-height: 1.62; font-size: 15px; }\r\n#mp-hw-v12-56469 .mp-info ul { margin: 0; padding-left: 20px; display: grid; gap: 6px; color: rgba(238,247,255,.78); line-height: 1.48; font-size: 14px; }\r\n#mp-hw-v12-56469 .mp-info strong { color: #fff; }\r\n#mp-hw-v12-56469 .mp-search-row {\r\n  display: grid; grid-template-columns: minmax(220px, 1fr) auto auto; gap: 10px; align-items: end;\r\n}\r\n#mp-hw-v12-56469 label { display: block; margin: 0 0 7px; color: rgba(238,247,255,.86); font-size: 13px; font-weight: 900; }\r\n#mp-hw-v12-56469 input {\r\n  width: 100%; min-height: 48px; padding: 12px 14px; border-radius: 15px;\r\n  border: 1px solid rgba(255,255,255,.17); background: rgba(255,255,255,.085);\r\n  color: #fff; outline: none; font: inherit;\r\n}\r\n#mp-hw-v12-56469 input:focus { border-color: rgba(53,194,255,.75); box-shadow: 0 0 0 4px rgba(53,194,255,.12); }\r\n#mp-hw-v12-56469 input::placeholder { color: rgba(238,247,255,.48); }\r\n#mp-hw-v12-56469 .mp-btn {\r\n  min-height: 48px; border: 0; border-radius: 15px; padding: 11px 16px;\r\n  cursor: pointer; font: inherit; font-weight: 900; transition: transform .18s ease, filter .18s ease, opacity .18s ease;\r\n}\r\n#mp-hw-v12-56469 .mp-btn:hover { transform: translateY(-1px); filter: brightness(1.04); }\r\n#mp-hw-v12-56469 .mp-btn:disabled { opacity: .58; cursor: not-allowed; transform: none; }\r\n#mp-hw-v12-56469 .mp-primary { color: #04101c; background: linear-gradient(135deg, #35c2ff, #80e0ff); }\r\n#mp-hw-v12-56469 .mp-secondary { color: #fff; background: rgba(255,255,255,.085); border: 1px solid rgba(255,255,255,.18); }\r\n#mp-hw-v12-56469 .mp-status {\r\n  margin-top: 14px; padding: 12px 14px; border-radius: 16px; line-height: 1.5;\r\n  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.12); color: var(--mp-muted); font-size: 14px;\r\n}\r\n#mp-hw-v12-56469 .mp-status.is-error { color: #fff; background: rgba(255,92,122,.14); border-color: rgba(255,92,122,.35); }\r\n#mp-hw-v12-56469 .mp-status.is-ok { color: #fff; background: rgba(57,217,138,.12); border-color: rgba(57,217,138,.30); }\r\n#mp-hw-v12-56469 .mp-results { display: grid; gap: 9px; margin-top: 14px; }\r\n#mp-hw-v12-56469 .mp-place {\r\n  width: 100%; text-align: left; padding: 12px 14px; border-radius: 16px; cursor: pointer;\r\n  border: 1px solid rgba(255,255,255,.13); background: rgba(255,255,255,.07); color: #fff; font: inherit;\r\n}\r\n#mp-hw-v12-56469 .mp-place:hover { border-color: rgba(53,194,255,.55); background: rgba(53,194,255,.10); }\r\n#mp-hw-v12-56469 .mp-place strong { display: block; margin-bottom: 3px; }\r\n#mp-hw-v12-56469 .mp-place span { display: block; color: var(--mp-muted); font-size: 13px; }\r\n#mp-hw-v12-56469 .mp-current-location {\r\n  margin-bottom: 16px; padding: 17px; border-radius: var(--mp-radius);\r\n  background: rgba(255,255,255,.075); border: 1px solid rgba(255,255,255,.13);\r\n}\r\n#mp-hw-v12-56469 .mp-current-location h3 { margin: 0 0 6px; color: #fff; font-size: 22px; }\r\n#mp-hw-v12-56469 .mp-current-location p { margin: 0; color: var(--mp-muted); line-height: 1.55; }\r\n#mp-hw-v12-56469 .mp-custom {\r\n  display: grid; grid-template-columns: minmax(160px, .65fr) minmax(160px, .65fr) auto; gap: 10px; align-items: end;\r\n  margin: 0 0 16px; padding: 15px; border-radius: var(--mp-radius);\r\n  background: rgba(255,255,255,.055); border: 1px solid rgba(255,255,255,.12);\r\n}\r\n#mp-hw-v12-56469 .mp-sections { display: grid; gap: 16px; }\r\n#mp-hw-v12-56469 .mp-section {\r\n  padding: 17px; border-radius: var(--mp-radius); background: rgba(255,255,255,.065);\r\n  border: 1px solid rgba(255,255,255,.12);\r\n}\r\n#mp-hw-v12-56469 .mp-section-head { display: flex; justify-content: space-between; gap: 14px; align-items: flex-start; margin-bottom: 14px; }\r\n#mp-hw-v12-56469 .mp-section h4 { margin: 0 0 5px; color: #fff; font-size: 20px; }\r\n#mp-hw-v12-56469 .mp-section p { margin: 0; color: var(--mp-muted); line-height: 1.5; font-size: 14px; }\r\n#mp-hw-v12-56469 .mp-section-actions {\r\n  display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 9px; flex: 0 0 auto;\r\n}\r\n#mp-hw-v12-56469 .mp-badge {\r\n  white-space: nowrap; padding: 7px 11px; border-radius: 999px; font-size: 12px; font-weight: 900;\r\n  color: var(--mp-accent-2); background: rgba(53,194,255,.10); border: 1px solid rgba(53,194,255,.24);\r\n}\r\n#mp-hw-v12-56469 .mp-cards { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 11px; margin-bottom: 14px; }\r\n#mp-hw-v12-56469 .mp-card {\r\n  position: relative; overflow: hidden; min-height: 108px; padding: 14px; border-radius: 18px;\r\n  background: var(--mp-card); border: 1px solid rgba(255,255,255,.12);\r\n}\r\n#mp-hw-v12-56469 .mp-card:after { content: \"\"; position: absolute; right: -28px; bottom: -38px; width: 105px; height: 105px; border-radius: 50%; background: rgba(53,194,255,.16); }\r\n#mp-hw-v12-56469 .mp-card.hot:after { background: rgba(255,92,122,.24); }\r\n#mp-hw-v12-56469 .mp-card.warm:after { background: rgba(255,209,102,.24); }\r\n#mp-hw-v12-56469 .mp-card.mild:after { background: rgba(57,217,138,.22); }\r\n#mp-hw-v12-56469 .mp-card.cold:after { background: rgba(76,154,255,.24); }\r\n#mp-hw-v12-56469 .mp-card.rain:after { background: rgba(53,194,255,.25); }\r\n#mp-hw-v12-56469 .mp-card.wind:after { background: rgba(255,255,255,.18); }\r\n#mp-hw-v12-56469 .mp-card-label, #mp-hw-v12-56469 .mp-card-value, #mp-hw-v12-56469 .mp-card-note { position: relative; z-index: 1; }\r\n#mp-hw-v12-56469 .mp-card-label { color: var(--mp-muted); font-size: 12px; font-weight: 900; margin-bottom: 8px; }\r\n#mp-hw-v12-56469 .mp-card-value { color: #fff; font-size: 24px; line-height: 1.1; font-weight: 950; }\r\n#mp-hw-v12-56469 .mp-card-note { margin-top: 7px; color: rgba(238,247,255,.64); font-size: 12px; line-height: 1.35; }\r\n#mp-hw-v12-56469 .mp-chart-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 14px; }\r\n#mp-hw-v12-56469 .mp-chart {\r\n  min-height: 210px; padding: 12px; border-radius: 18px; background: rgba(0,0,0,.13); border: 1px solid rgba(255,255,255,.10);\r\n}\r\n#mp-hw-v12-56469 .mp-chart-head { display: flex; justify-content: space-between; gap: 10px; align-items: center; margin: 0 0 8px; }\r\n#mp-hw-v12-56469 .mp-chart-title { color: rgba(238,247,255,.88); font-weight: 900; font-size: 13px; line-height: 1.25; }\r\n#mp-hw-v12-56469 .mp-export {\r\n  flex: 0 0 auto; min-height: 30px; padding: 6px 10px; border-radius: 999px;\r\n  border: 1px solid rgba(53,194,255,.35); background: rgba(53,194,255,.12);\r\n  color: var(--mp-accent-2); cursor: pointer; font: inherit; font-size: 12px; font-weight: 900;\r\n}\r\n#mp-hw-v12-56469 .mp-export:hover { background: rgba(53,194,255,.20); }\r\n#mp-hw-v12-56469 svg { display: block; width: 100%; height: 165px; overflow: visible; }\r\n#mp-hw-v12-56469 .mp-axis { stroke: rgba(255,255,255,.12); stroke-width: 1; }\r\n#mp-hw-v12-56469 .mp-line-temp { fill: none; stroke: var(--mp-accent); stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; }\r\n#mp-hw-v12-56469 .mp-line-wind { fill: none; stroke: var(--mp-yellow); stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; }\r\n#mp-hw-v12-56469 .mp-bar { fill: rgba(53,194,255,.58); }\r\n#mp-hw-v12-56469 .mp-chart-note { margin-top: 7px; color: rgba(238,247,255,.62); font-size: 12px; }\r\n#mp-hw-v12-56469 .mp-table-wrap { overflow: auto; border-radius: 18px; border: 1px solid rgba(255,255,255,.12); background: rgba(255,255,255,.045); }\r\n#mp-hw-v12-56469 table { width: 100%; min-width: 860px; border-collapse: collapse; }\r\n#mp-hw-v12-56469 th, #mp-hw-v12-56469 td { padding: 10px 11px; border-bottom: 1px solid rgba(255,255,255,.085); text-align: left; white-space: nowrap; font-size: 13px; }\r\n#mp-hw-v12-56469 th { color: rgba(238,247,255,.78); background: rgba(255,255,255,.075); font-weight: 950; }\r\n#mp-hw-v12-56469 tr:hover td { background: rgba(53,194,255,.055); }\r\n#mp-hw-v12-56469 .mp-source {\r\n  margin-top: 14px; padding: 14px; border-radius: 16px; color: rgba(238,247,255,.70);\r\n  background: rgba(255,255,255,.055); border: 1px solid rgba(255,255,255,.11); font-size: 13px; line-height: 1.55;\r\n}\r\n#mp-hw-v12-56469 .mp-source a { color: var(--mp-accent-2); font-weight: 900; }\r\n@media (max-width: 1080px) {\r\n  #mp-hw-v12-56469 .mp-search-row { grid-template-columns: 1fr 1fr; }\r\n  #mp-hw-v12-56469 .mp-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n}\r\n@media (max-width: 760px) {\r\n  #mp-hw-v12-56469 .mp-hero,\r\n  #mp-hw-v12-56469 .mp-controls,\r\n  #mp-hw-v12-56469 .mp-content { padding-left: 16px; padding-right: 16px; }\r\n  #mp-hw-v12-56469 .mp-search-row,\r\n  #mp-hw-v12-56469 .mp-custom,\r\n  #mp-hw-v12-56469 .mp-chart-grid { grid-template-columns: 1fr; }\r\n  #mp-hw-v12-56469 .mp-cards { grid-template-columns: 1fr; }\r\n  #mp-hw-v12-56469 .mp-section-head { display: block; }\r\n  #mp-hw-v12-56469 .mp-section-actions { justify-content: flex-start; margin-top: 10px; }\r\n  #mp-hw-v12-56469 .mp-badge { display: inline-flex; }\r\n}\r\n<\/style>\r\n\r\n<div id=\"mp-hw-v12-56469\" class=\"mp-hw-v12\" data-config=\"{&quot;ajaxUrl&quot;:&quot;https:\\\/\\\/meteopatras.eu\\\/new\\\/wp-admin\\\/admin-ajax.php&quot;,&quot;nonce&quot;:&quot;45ed7ff917&quot;,&quot;minDate&quot;:&quot;1940-01-01&quot;,&quot;patras&quot;:{&quot;name&quot;:&quot;\\u03a0\\u03ac\\u03c4\\u03c1\\u03b1&quot;,&quot;admin1&quot;:&quot;\\u0394\\u03c5\\u03c4\\u03b9\\u03ba\\u03ae \\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1&quot;,&quot;country&quot;:&quot;\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1&quot;,&quot;latitude&quot;:38.246600000000001,&quot;longitude&quot;:21.7346,&quot;timezone&quot;:&quot;Europe\\\/Athens&quot;}}\">\r\n  <div class=\"mp-wrap\">\r\n    <div class=\"mp-hero\">\r\n      <div class=\"mp-kicker\">\ud83c\udf0d \u0399\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ac \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b1\u03bd\u03ac \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1<\/div>\r\n      <h2>\u0399\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ac \u039c\u03b5\u03c4\u03b5\u03c9\u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03ba\u03ac \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1<\/h2>\r\n      <p class=\"mp-subtitle\">\r\n        \u0394\u03b5\u03af\u03c4\u03b5 \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ac \u03bc\u03b5\u03c4\u03b5\u03c9\u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03ba\u03ac \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b3\u03b9\u03b1 \u03bf\u03c0\u03bf\u03b9\u03b1\u03b4\u03ae\u03c0\u03bf\u03c4\u03b5 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03ae \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1 \u03b8\u03ad\u03c3\u03b7 \u03c3\u03b1\u03c2. \u0397 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03b5\u03b9 \u03b1\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b1 \u03c4\u03bf\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03bc\u03ae\u03bd\u03b1 \u03ba\u03b1\u03b9 \u03c4\u03bf \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd \u03ad\u03c4\u03bf\u03c2 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae\u03c2, \u03b5\u03bd\u03ce \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03b5\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b4\u03b9\u03ba\u03ae \u03c3\u03b1\u03c2 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf \u03b1\u03c0\u03cc \u03c4\u03bf 1940 \u03ba\u03b1\u03b9 \u03bc\u03b5\u03c4\u03ac.\r\n      <\/p>\r\n      <div class=\"mp-info\">\r\n        <h3>\u03a4\u03b9 \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03b9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf;<\/h3>\r\n        <p>\r\n          \u03a4\u03bf \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03bf\u03cd \u03ba\u03b1\u03b9\u03c1\u03bf\u03cd \u03c3\u03ac\u03c2 \u03b2\u03bf\u03b7\u03b8\u03ac \u03bd\u03b1 \u03b1\u03bd\u03b1\u03b6\u03b7\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c0\u03b1\u03bb\u03b1\u03b9\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03ba\u03b1\u03b9\u03c1\u03b9\u03ba\u03ad\u03c2 \u03c3\u03c5\u03bd\u03b8\u03ae\u03ba\u03b5\u03c2 \u03b3\u03b9\u03b1 \u03c0\u03cc\u03bb\u03b5\u03b9\u03c2, \u03c7\u03c9\u03c1\u03b9\u03ac \u03ba\u03b1\u03b9 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ad\u03c2 \u03c3\u03c4\u03b7\u03bd \u0395\u03bb\u03bb\u03ac\u03b4\u03b1 \u03ae \u03c3\u03c4\u03bf \u03b5\u03be\u03c9\u03c4\u03b5\u03c1\u03b9\u03ba\u03cc, \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03c4\u03b9\u03c2 \u03c3\u03c5\u03bd\u03c4\u03b5\u03c4\u03b1\u03b3\u03bc\u03ad\u03bd\u03b5\u03c2 \u03c4\u03b7\u03c2 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2 \u03c0\u03bf\u03c5 \u03b5\u03c0\u03b9\u03bb\u03ad\u03b3\u03b5\u03c4\u03b5.\r\n        <\/p>\r\n        <ul>\r\n          <li><strong>\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae:<\/strong> \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd \u03ad\u03c4\u03bf\u03c2 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03c3\u03ae\u03bc\u03b5\u03c1\u03b1.<\/li>\r\n          <li><strong>\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2:<\/strong> \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03b9\u03ce\u03bd \u03b1\u03c0\u03cc \u03c4\u03bf 1940 \u03ba\u03b1\u03b9 \u03bc\u03b5\u03c4\u03ac, \u03cc\u03c0\u03bf\u03c5 \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1.<\/li>\r\n          <li><strong>\u039a\u03b1\u03b9\u03c1\u03b9\u03ba\u03ad\u03c2 \u03c0\u03b1\u03c1\u03ac\u03bc\u03b5\u03c4\u03c1\u03bf\u03b9:<\/strong> \u03b8\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1, \u03b2\u03c1\u03bf\u03c7\u03cc\u03c0\u03c4\u03c9\u03c3\u03b7, \u03c5\u03b3\u03c1\u03b1\u03c3\u03af\u03b1, \u03ac\u03bd\u03b5\u03bc\u03bf\u03c2, \u03c1\u03b9\u03c0\u03ad\u03c2 \u03b1\u03bd\u03ad\u03bc\u03bf\u03c5, \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b1\u03bd\u03ad\u03bc\u03bf\u03c5 \u03ba\u03b1\u03b9 \u03b1\u03c4\u03bc\u03bf\u03c3\u03c6\u03b1\u03b9\u03c1\u03b9\u03ba\u03ae \u03c0\u03af\u03b5\u03c3\u03b7.<\/li>\r\n          <li><strong>\u039f\u03c0\u03c4\u03b9\u03ba\u03ae \u03b1\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7:<\/strong> \u03ba\u03ac\u03c1\u03c4\u03b5\u03c2 \u03c3\u03cd\u03bd\u03bf\u03c8\u03b7\u03c2, \u03b3\u03c1\u03b1\u03c6\u03ae\u03bc\u03b1\u03c4\u03b1 \u03ba\u03b1\u03b9 \u03c0\u03af\u03bd\u03b1\u03ba\u03b5\u03c2 \u03b3\u03b9\u03b1 \u03b3\u03c1\u03ae\u03b3\u03bf\u03c1\u03b7 \u03c3\u03cd\u03b3\u03ba\u03c1\u03b9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ce\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd.<\/li>\r\n        <\/ul>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"mp-controls\">\r\n      <div class=\"mp-search-row\">\r\n        <div>\r\n          <label>\u03a4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1<\/label>\r\n          <input type=\"search\" data-mp=\"query\" placeholder=\"\u03c0.\u03c7. \u03a0\u03ac\u03c4\u03c1\u03b1, \u0391\u03b8\u03ae\u03bd\u03b1, \u039a\u03b1\u03bb\u03ac\u03b2\u03c1\u03c5\u03c4\u03b1, London\" autocomplete=\"off\">\r\n        <\/div>\r\n        <button type=\"button\" class=\"mp-btn mp-primary\" data-action=\"search\">\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7<\/button>\r\n        <button type=\"button\" class=\"mp-btn mp-secondary\" data-action=\"geo\">\u03a7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2 \u03bc\u03bf\u03c5<\/button>\r\n      <\/div>\r\n\r\n      <div class=\"mp-status\" data-mp=\"status\">\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf\u03c5...<\/div>\r\n      <div class=\"mp-results\" data-mp=\"results\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"mp-content\" data-mp=\"content\" hidden>\r\n      <div class=\"mp-current-location\" data-mp=\"location\"><\/div>\r\n\r\n      <div class=\"mp-custom\">\r\n        <div>\r\n          <label>\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2 \u03b1\u03c0\u03cc<\/label>\r\n          <input type=\"date\" data-mp=\"custom-start\" min=\"1940-01-01\">\r\n        <\/div>\r\n        <div>\r\n          <label>\u0388\u03c9\u03c2<\/label>\r\n          <input type=\"date\" data-mp=\"custom-end\" min=\"1940-01-01\">\r\n        <\/div>\r\n        <button type=\"button\" class=\"mp-btn mp-primary\" data-action=\"custom\">\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5<\/button>\r\n      <\/div>\r\n\r\n      <div class=\"mp-sections\">\r\n        <section class=\"mp-section\" data-section=\"previous\"><\/section>\r\n        <section class=\"mp-section\" data-section=\"ytd\"><\/section>\r\n        <section class=\"mp-section\" data-section=\"custom\" hidden><\/section>\r\n      <\/div>\r\n\r\n      <div class=\"mp-source\">\r\n        \u03a4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03c0\u03c1\u03bf\u03ad\u03c1\u03c7\u03bf\u03bd\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc \u03c4\u03bf <a href=\"https:\/\/open-meteo.com\/\" target=\"_blank\" rel=\"noopener\">Open\u2011Meteo<\/a> \u03ba\u03b1\u03b9 \u03b2\u03b1\u03c3\u03af\u03b6\u03bf\u03bd\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ac \u03bc\u03b5\u03c4\u03b5\u03c9\u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03ba\u03ac \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \/ reanalysis \u03b3\u03b9\u03b1 \u03c4\u03b9\u03c2 \u03c3\u03c5\u03bd\u03c4\u03b5\u03c4\u03b1\u03b3\u03bc\u03ad\u03bd\u03b5\u03c2 \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7\u03c2 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2. \u038c\u03c4\u03b1\u03bd \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 \u03b7 \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1 \u03b8\u03ad\u03c3\u03b7, \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae\u03c2 \u03b5\u03bd\u03c4\u03bf\u03c0\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03bc\u03ad\u03c3\u03c9 <a href=\"https:\/\/www.openstreetmap.org\/\" target=\"_blank\" rel=\"noopener\">OpenStreetMap<\/a> \/ Nominatim. \u03a4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03b4\u03b5\u03bd \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03b8\u03b9\u03c3\u03c4\u03bf\u03cd\u03bd \u03c4\u03b9\u03c2 \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03b9\u03ba\u03ad\u03c2 \u03bc\u03b5\u03c4\u03c1\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c0\u03b9\u03ba\u03bf\u03cd \u03bc\u03b5\u03c4\u03b5\u03c9\u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03ba\u03bf\u03cd \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03cd.\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(rootId) {\r\n  'use strict';\r\n\r\n  var root = document.getElementById(rootId);\r\n  if (!root || root.dataset.ready === '1') return;\r\n  root.dataset.ready = '1';\r\n\r\n  var cfg = {};\r\n  try { cfg = JSON.parse(root.getAttribute('data-config') || '{}'); } catch (e) { cfg = {}; }\r\n\r\n  var state = {\r\n    place: null,\r\n    busy: false,\r\n    exports: {},\r\n    exportCounter: 0\r\n  };\r\n\r\n  var q = function(sel) { return root.querySelector(sel); };\r\n  var els = {\r\n    query: q('[data-mp=\"query\"]'),\r\n    status: q('[data-mp=\"status\"]'),\r\n    results: q('[data-mp=\"results\"]'),\r\n    content: q('[data-mp=\"content\"]'),\r\n    location: q('[data-mp=\"location\"]'),\r\n    customStart: q('[data-mp=\"custom-start\"]'),\r\n    customEnd: q('[data-mp=\"custom-end\"]'),\r\n    previous: q('[data-section=\"previous\"]'),\r\n    ytd: q('[data-section=\"ytd\"]'),\r\n    custom: q('[data-section=\"custom\"]')\r\n  };\r\n\r\n  function pad(n) { return String(n).padStart(2, '0'); }\r\n  function iso(d) { return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()); }\r\n  function parseISO(s) {\r\n    var p = String(s || '').split('-').map(Number);\r\n    if (p.length !== 3 || p.some(isNaN)) return null;\r\n    return new Date(p[0], p[1] - 1, p[2]);\r\n  }\r\n  function addDays(d, days) { var x = new Date(d); x.setDate(x.getDate() + days); return x; }\r\n  function fmtDate(s) {\r\n    if (\/^\\d{4}-\\d{2}$\/.test(String(s))) {\r\n      var parts = s.split('-');\r\n      return parts[1] + '\/' + parts[0];\r\n    }\r\n    var d = parseISO(s);\r\n    return d ? d.toLocaleDateString('el-GR', { day: '2-digit', month: '2-digit', year: 'numeric' }) : (s || '\u2014');\r\n  }\r\n  function escapeHTML(v) {\r\n    return String(v == null ? '' : v).replace(\/[&<>\"']\/g, function(c) {\r\n      return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'}[c];\r\n    });\r\n  }\r\n  function n(v) { var x = Number(v); return Number.isFinite(x) ? x : null; }\r\n  function clean(arr) { return arr.map(n).filter(function(v) { return v !== null; }); }\r\n  function avg(arr) { var a = clean(arr); return a.length ? a.reduce(function(x,y){return x+y;},0) \/ a.length : null; }\r\n  function sum(arr) { var a = clean(arr); return a.length ? a.reduce(function(x,y){return x+y;},0) : null; }\r\n  function max(arr) { var a = clean(arr); return a.length ? Math.max.apply(null, a) : null; }\r\n  function min(arr) { var a = clean(arr); return a.length ? Math.min.apply(null, a) : null; }\r\n  function fmt(v, digits, suffix) {\r\n    var x = n(v);\r\n    if (x === null) return '\u2014';\r\n    return x.toLocaleString('el-GR', { minimumFractionDigits: digits, maximumFractionDigits: digits }) + (suffix ? ' ' + suffix : '');\r\n  }\r\n  function setStatus(msg, type) {\r\n    els.status.textContent = msg;\r\n    els.status.classList.remove('is-error', 'is-ok');\r\n    if (type === 'error') els.status.classList.add('is-error');\r\n    if (type === 'ok') els.status.classList.add('is-ok');\r\n  }\r\n  function setBusy(on) {\r\n    state.busy = !!on;\r\n    root.querySelectorAll('button').forEach(function(btn) { btn.disabled = !!on; });\r\n  }\r\n  function beaufort(kmh) {\r\n    var v = n(kmh);\r\n    if (v === null) return '\u2014';\r\n    if (v < 1) return '0 Bf';\r\n    if (v <= 5) return '1 Bf';\r\n    if (v <= 11) return '2 Bf';\r\n    if (v <= 19) return '3 Bf';\r\n    if (v <= 28) return '4 Bf';\r\n    if (v <= 38) return '5 Bf';\r\n    if (v <= 49) return '6 Bf';\r\n    if (v <= 61) return '7 Bf';\r\n    if (v <= 74) return '8 Bf';\r\n    if (v <= 88) return '9 Bf';\r\n    if (v <= 102) return '10 Bf';\r\n    if (v <= 117) return '11 Bf';\r\n    return '12 Bf';\r\n  }\r\n  function compass(deg) {\r\n    var d = n(deg);\r\n    if (d === null) return '\u2014';\r\n    var dirs = ['\u0392', '\u0392\u0391', '\u0391', '\u039d\u0391', '\u039d', '\u039d\u0394', '\u0394', '\u0392\u0394'];\r\n    return dirs[Math.round(d \/ 45) % 8];\r\n  }\r\n  function tempClass(t) {\r\n    var x = n(t);\r\n    if (x === null) return '';\r\n    if (x <= 7) return 'cold';\r\n    if (x <= 25) return 'mild';\r\n    if (x <= 31) return 'warm';\r\n    return 'hot';\r\n  }\r\n  function todayLocal() {\r\n    var d = new Date();\r\n    d.setHours(0,0,0,0);\r\n    return d;\r\n  }\r\n  function yesterdayLocal() { return addDays(todayLocal(), -1); }\r\n  function previousMonthRange() {\r\n    var t = todayLocal();\r\n    var first = new Date(t.getFullYear(), t.getMonth() - 1, 1);\r\n    var last = new Date(t.getFullYear(), t.getMonth(), 0);\r\n    return { start: iso(first), end: iso(last), label: '\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2' };\r\n  }\r\n  function ytdRange() {\r\n    var y = yesterdayLocal();\r\n    var start = new Date(y.getFullYear(), 0, 1);\r\n    return { start: iso(start), end: iso(y), label: '\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03ad\u03c4\u03bf\u03c2 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae\u03c2' };\r\n  }\r\n  function defaultCustomRange() {\r\n    var y = yesterdayLocal();\r\n    var start = new Date(y.getFullYear(), 0, 1);\r\n    els.customStart.value = iso(start);\r\n    els.customEnd.value = iso(y);\r\n    els.customStart.max = iso(y);\r\n    els.customEnd.max = iso(y);\r\n    els.customStart.min = cfg.minDate || '1940-01-01';\r\n    els.customEnd.min = cfg.minDate || '1940-01-01';\r\n  }\r\n  function validateRange(start, end) {\r\n    var s = parseISO(start), e = parseISO(end), minD = parseISO(cfg.minDate || '1940-01-01'), maxD = yesterdayLocal();\r\n    if (!s || !e) throw new Error('\u03a3\u03c5\u03bc\u03c0\u03bb\u03b7\u03c1\u03ce\u03c3\u03c4\u03b5 \u03c3\u03c9\u03c3\u03c4\u03ac \u03c4\u03b9\u03c2 \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b5\u03c2.');\r\n    if (s > e) throw new Error('\u0397 \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u201c\u0391\u03c0\u03cc\u201d \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03bc\u03b5\u03c4\u03ac \u03c4\u03b7\u03bd \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u201c\u0388\u03c9\u03c2\u201d.');\r\n    if (s < minD) throw new Error('\u03a4\u03bf \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03cc \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03be\u03b5\u03ba\u03b9\u03bd\u03ac \u03b1\u03c0\u03cc 01\/01\/1940.');\r\n    if (e > maxD) throw new Error('\u0397 \u03c4\u03b5\u03bb\u03b9\u03ba\u03ae \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u03ae \u03bc\u03b5\u03bb\u03bb\u03bf\u03bd\u03c4\u03b9\u03ba\u03ae.');\r\n    return Math.round((e - s) \/ 86400000) + 1;\r\n  }\r\n\r\n  async function ajax(action, params) {\r\n    var body = new URLSearchParams();\r\n    body.append('action', 'mp_hw_v12_' + action);\r\n    body.append('nonce', cfg.nonce || '');\r\n    Object.keys(params || {}).forEach(function(k) { body.append(k, params[k]); });\r\n\r\n    var res = await fetch(cfg.ajaxUrl, {\r\n      method: 'POST',\r\n      credentials: 'same-origin',\r\n      headers: { 'Content-Type': 'application\/x-www-form-urlencoded; charset=UTF-8' },\r\n      body: body.toString()\r\n    });\r\n\r\n    var json = null;\r\n    try { json = await res.json(); } catch (e) {}\r\n    if (!res.ok || !json || !json.success) {\r\n      var msg = json && json.data && json.data.message ? json.data.message : '\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 \u03bc\u03b5 \u03c4\u03bf WordPress AJAX.';\r\n      throw new Error(msg);\r\n    }\r\n    return json.data;\r\n  }\r\n\r\n  function rowsFromWeather(data) {\r\n    var d = data && data.daily ? data.daily : {};\r\n    var times = Array.isArray(d.time) ? d.time : [];\r\n    return times.map(function(time, i) {\r\n      return {\r\n        date: time,\r\n        tmean: d.temperature_2m_mean ? d.temperature_2m_mean[i] : null,\r\n        tmax: d.temperature_2m_max ? d.temperature_2m_max[i] : null,\r\n        tmin: d.temperature_2m_min ? d.temperature_2m_min[i] : null,\r\n        humidity: d.relative_humidity_2m_mean ? d.relative_humidity_2m_mean[i] : null,\r\n        rain: d.precipitation_sum ? d.precipitation_sum[i] : null,\r\n        windMean: d.wind_speed_10m_mean ? d.wind_speed_10m_mean[i] : null,\r\n        windMax: d.wind_speed_10m_max ? d.wind_speed_10m_max[i] : null,\r\n        gust: d.wind_gusts_10m_max ? d.wind_gusts_10m_max[i] : null,\r\n        windDir: d.wind_direction_10m_dominant ? d.wind_direction_10m_dominant[i] : null,\r\n        pressure: d.pressure_msl_mean ? d.pressure_msl_mean[i] : null\r\n      };\r\n    });\r\n  }\r\n\r\n  function aggregateMonthly(rows) {\r\n    var groups = {};\r\n    rows.forEach(function(r) {\r\n      var key = String(r.date).slice(0, 7);\r\n      if (!groups[key]) groups[key] = [];\r\n      groups[key].push(r);\r\n    });\r\n    return Object.keys(groups).sort().map(function(key) {\r\n      var g = groups[key];\r\n      return {\r\n        date: key,\r\n        isMonthly: true,\r\n        tmean: avg(g.map(function(r){return r.tmean;})),\r\n        tmax: max(g.map(function(r){return r.tmax;})),\r\n        tmin: min(g.map(function(r){return r.tmin;})),\r\n        humidity: avg(g.map(function(r){return r.humidity;})),\r\n        rain: sum(g.map(function(r){return r.rain;})),\r\n        windMean: avg(g.map(function(r){return r.windMean;})),\r\n        windMax: max(g.map(function(r){return r.windMax;})),\r\n        gust: max(g.map(function(r){return r.gust;})),\r\n        windDir: avg(g.map(function(r){return r.windDir;})),\r\n        pressure: avg(g.map(function(r){return r.pressure;}))\r\n      };\r\n    });\r\n  }\r\n\r\n  function stats(rows) {\r\n    return {\r\n      tmean: avg(rows.map(function(r){return r.tmean;})),\r\n      tmax: max(rows.map(function(r){return r.tmax;})),\r\n      tmin: min(rows.map(function(r){return r.tmin;})),\r\n      humidity: avg(rows.map(function(r){return r.humidity;})),\r\n      rain: sum(rows.map(function(r){return r.rain;})),\r\n      wind: max(rows.map(function(r){return r.windMax;})),\r\n      gust: max(rows.map(function(r){return r.gust;})),\r\n      pressure: avg(rows.map(function(r){return r.pressure;}))\r\n    };\r\n  }\r\n\r\n  function renderCards(rows) {\r\n    var s = stats(rows);\r\n    var cards = [\r\n      ['\u039c\u03ad\u03c3\u03b7 \u03b8\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1', fmt(s.tmean, 1, '\u00b0C'), '\u039c\u03ad\u03c3\u03bf\u03c2 \u03cc\u03c1\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5', tempClass(s.tmean)],\r\n      ['\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03b7 \/ \u0395\u03bb\u03ac\u03c7\u03b9\u03c3\u03c4\u03b7', fmt(s.tmax, 1, '\u00b0C') + ' \/ ' + fmt(s.tmin, 1, '\u00b0C'), '\u0391\u03ba\u03c1\u03b1\u03af\u03b5\u03c2 \u03c4\u03b9\u03bc\u03ad\u03c2 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5', tempClass(s.tmax)],\r\n      ['\u03a3\u03cd\u03bd\u03bf\u03bb\u03bf \u03b2\u03c1\u03bf\u03c7\u03cc\u03c0\u03c4\u03c9\u03c3\u03b7\u03c2', fmt(s.rain, 1, 'mm'), '\u0386\u03b8\u03c1\u03bf\u03b9\u03c3\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5', 'rain'],\r\n      ['\u039c\u03ad\u03c3\u03b7 \u03c5\u03b3\u03c1\u03b1\u03c3\u03af\u03b1', fmt(s.humidity, 0, '%'), '\u039c\u03ad\u03c3\u03bf\u03c2 \u03cc\u03c1\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5', ''],\r\n      ['\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf\u03c2 \u03ac\u03bd\u03b5\u03bc\u03bf\u03c2', fmt(s.wind, 0, 'km\/h'), beaufort(s.wind), 'wind'],\r\n      ['\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03b7 \u03c1\u03b9\u03c0\u03ae', fmt(s.gust, 0, 'km\/h'), beaufort(s.gust), 'wind'],\r\n      ['\u039c\u03ad\u03c3\u03b7 \u03c0\u03af\u03b5\u03c3\u03b7', fmt(s.pressure, 1, 'hPa'), '\u03a3\u03c4\u03b7 \u03bc\u03ad\u03c3\u03b7 \u03c3\u03c4\u03ac\u03b8\u03bc\u03b7 \u03b8\u03ac\u03bb\u03b1\u03c3\u03c3\u03b1\u03c2', ''],\r\n      ['\u0395\u03b3\u03b3\u03c1\u03b1\u03c6\u03ad\u03c2', String(rows.length), rows.length > 370 ? '\u0397\u03bc\u03b5\u03c1\u03ae\u03c3\u03b9\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1, \u03bc\u03b7\u03bd\u03b9\u03b1\u03af\u03b1 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae' : '\u0397\u03bc\u03b5\u03c1\u03ae\u03c3\u03b9\u03b5\u03c2 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ad\u03c2', '']\r\n    ];\r\n    return '<div class=\"mp-cards\">' + cards.map(function(c) {\r\n      return '<div class=\"mp-card ' + escapeHTML(c[3]) + '\">' +\r\n        '<div class=\"mp-card-label\">' + escapeHTML(c[0]) + '<\/div>' +\r\n        '<div class=\"mp-card-value\">' + escapeHTML(c[1]) + '<\/div>' +\r\n        '<div class=\"mp-card-note\">' + escapeHTML(c[2]) + '<\/div>' +\r\n      '<\/div>';\r\n    }).join('') + '<\/div>';\r\n  }\r\n\r\n  function pointsForLine(values, w, h, padY) {\r\n    var nums = values.map(n);\r\n    var valid = nums.filter(function(v){return v !== null;});\r\n    if (!valid.length) return '';\r\n    var mn = Math.min.apply(null, valid), mx = Math.max.apply(null, valid);\r\n    if (mn === mx) { mn -= 1; mx += 1; }\r\n    return nums.map(function(v, i) {\r\n      if (v === null) return null;\r\n      var x = values.length === 1 ? w \/ 2 : (i \/ (values.length - 1)) * w;\r\n      var y = padY + (1 - ((v - mn) \/ (mx - mn))) * (h - padY * 2);\r\n      return x.toFixed(1) + ',' + y.toFixed(1);\r\n    }).filter(Boolean).join(' ');\r\n  }\r\n\r\n  function makeExportKey() {\r\n    state.exportCounter += 1;\r\n    return 'mp_export_' + state.exportCounter;\r\n  }\r\n\r\n  function chartCaption(title, monthly) {\r\n    var view = monthly ? '\u03bc\u03b7\u03bd\u03b9\u03b1\u03af\u03b1 \u03c3\u03cd\u03bd\u03bf\u03c8\u03b7' : '\u03b7\u03bc\u03b5\u03c1\u03ae\u03c3\u03b9\u03b1 \u03b1\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7';\r\n    if (title === '\u0398\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1 \u03bc\u03ad\u03c3\u03b7') return '\u0395\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03b9 \u03c4\u03b7 \u03bc\u03b5\u03c4\u03b1\u03b2\u03bf\u03bb\u03ae \u03c4\u03b7\u03c2 \u03bc\u03ad\u03c3\u03b7\u03c2 \u03b8\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1\u03c2 \u03c3\u03b5 ' + view + ' \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae.';\r\n    if (title === '\u0392\u03c1\u03bf\u03c7\u03cc\u03c0\u03c4\u03c9\u03c3\u03b7') return '\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03b6\u03b5\u03b9 \u03c4\u03bf \u03c3\u03cd\u03bd\u03bf\u03bb\u03bf \u03b2\u03c1\u03bf\u03c7\u03cc\u03c0\u03c4\u03c9\u03c3\u03b7\u03c2 \u03b1\u03bd\u03ac ' + (monthly ? '\u03bc\u03ae\u03bd\u03b1' : '\u03b7\u03bc\u03ad\u03c1\u03b1') + ' \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf.';\r\n    if (title === '\u0386\u03bd\u03b5\u03bc\u03bf\u03c2 \u03bc\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf\u03c2') return '\u0394\u03b5\u03af\u03c7\u03bd\u03b5\u03b9 \u03c4\u03b7 \u03bc\u03ad\u03b3\u03b9\u03c3\u03c4\u03b7 \u03ad\u03bd\u03c4\u03b1\u03c3\u03b7 \u03b1\u03bd\u03ad\u03bc\u03bf\u03c5 \u03b1\u03bd\u03ac ' + (monthly ? '\u03bc\u03ae\u03bd\u03b1' : '\u03b7\u03bc\u03ad\u03c1\u03b1') + ', \u03c3\u03b5 km\/h.';\r\n    if (title === '\u03a0\u03af\u03b5\u03c3\u03b7 \u03bc\u03ad\u03c3\u03b7') return '\u0391\u03c0\u03b5\u03b9\u03ba\u03bf\u03bd\u03af\u03b6\u03b5\u03b9 \u03c4\u03b7 \u03bc\u03ad\u03c3\u03b7 \u03b1\u03c4\u03bc\u03bf\u03c3\u03c6\u03b1\u03b9\u03c1\u03b9\u03ba\u03ae \u03c0\u03af\u03b5\u03c3\u03b7 \u03c3\u03c4\u03b7 \u03bc\u03ad\u03c3\u03b7 \u03c3\u03c4\u03ac\u03b8\u03bc\u03b7 \u03b8\u03ac\u03bb\u03b1\u03c3\u03c3\u03b1\u03c2.';\r\n    return '\u0393\u03c1\u03ac\u03c6\u03b7\u03bc\u03b1 \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ce\u03bd \u03bc\u03b5\u03c4\u03b5\u03c9\u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03ba\u03ce\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1.';\r\n  }\r\n\r\n  function chartHeader(title) {\r\n    return '<div class=\"mp-chart-head\"><div class=\"mp-chart-title\">' + escapeHTML(title) + '<\/div><\/div>';\r\n  }\r\n\r\n  function renderLineChart(ctxInfo, title, rows, field, cls, unit) {\r\n    var values = rows.map(function(r){ return r[field]; });\r\n    var pts = pointsForLine(values, 520, 150, 12);\r\n    var valid = clean(values);\r\n    var note = valid.length ? '\u0395\u03bb\u03ac\u03c7\u03b9\u03c3\u03c4\u03bf: ' + fmt(Math.min.apply(null, valid), 1, unit) + ' \u00b7 \u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf: ' + fmt(Math.max.apply(null, valid), 1, unit) : '\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1.';\r\n    return '<div class=\"mp-chart\">' + chartHeader(title) +\r\n      '<svg viewBox=\"0 0 520 150\" preserveAspectRatio=\"none\" role=\"img\" aria-label=\"' + escapeHTML(title) + '\">' +\r\n        '<line class=\"mp-axis\" x1=\"0\" y1=\"138\" x2=\"520\" y2=\"138\"><\/line>' +\r\n        '<line class=\"mp-axis\" x1=\"0\" y1=\"12\" x2=\"520\" y2=\"12\"><\/line>' +\r\n        (pts ? '<polyline class=\"' + escapeHTML(cls) + '\" points=\"' + escapeHTML(pts) + '\"><\/polyline>' : '') +\r\n      '<\/svg><div class=\"mp-chart-note\">' + escapeHTML(note) + '<\/div><\/div>';\r\n  }\r\n\r\n  function renderBarChart(ctxInfo, title, rows, field, unit) {\r\n    var values = rows.map(function(r){ return n(r[field]) || 0; });\r\n    var mx = Math.max.apply(null, values.concat([1]));\r\n    var count = values.length;\r\n    var gap = count > 80 ? 1 : 2;\r\n    var barW = Math.max(1, (520 - gap * (count - 1)) \/ Math.max(count, 1));\r\n    var bars = values.map(function(v, i) {\r\n      var h = mx ? (v \/ mx) * 126 : 0;\r\n      var x = i * (barW + gap);\r\n      var y = 138 - h;\r\n      return '<rect class=\"mp-bar\" x=\"' + x.toFixed(1) + '\" y=\"' + y.toFixed(1) + '\" width=\"' + barW.toFixed(1) + '\" height=\"' + h.toFixed(1) + '\" rx=\"1\"><\/rect>';\r\n    }).join('');\r\n    var note = '\u03a3\u03cd\u03bd\u03bf\u03bb\u03bf: ' + fmt(sum(values), 1, unit);\r\n    return '<div class=\"mp-chart\">' + chartHeader(title) +\r\n      '<svg viewBox=\"0 0 520 150\" preserveAspectRatio=\"none\" role=\"img\" aria-label=\"' + escapeHTML(title) + '\">' +\r\n        '<line class=\"mp-axis\" x1=\"0\" y1=\"138\" x2=\"520\" y2=\"138\"><\/line>' + bars +\r\n      '<\/svg><div class=\"mp-chart-note\">' + escapeHTML(note) + '<\/div><\/div>';\r\n  }\r\n\r\n  function roundRect(ctx, x, y, w, h, r) {\r\n    var rr = Math.min(r, w \/ 2, h \/ 2);\r\n    ctx.beginPath();\r\n    ctx.moveTo(x + rr, y);\r\n    ctx.arcTo(x + w, y, x + w, y + h, rr);\r\n    ctx.arcTo(x + w, y + h, x, y + h, rr);\r\n    ctx.arcTo(x, y + h, x, y, rr);\r\n    ctx.arcTo(x, y, x + w, y, rr);\r\n    ctx.closePath();\r\n  }\r\n\r\n  function drawText(ctx, text, x, y, maxWidth, lineHeight) {\r\n    var words = String(text || '').split(' ');\r\n    var line = '';\r\n    var yy = y;\r\n    words.forEach(function(word) {\r\n      var test = line ? line + ' ' + word : word;\r\n      if (ctx.measureText(test).width > maxWidth && line) {\r\n        ctx.fillText(line, x, yy);\r\n        line = word;\r\n        yy += lineHeight;\r\n      } else {\r\n        line = test;\r\n      }\r\n    });\r\n    if (line) ctx.fillText(line, x, yy);\r\n    return yy + lineHeight;\r\n  }\r\n\r\n  function drawFittedText(ctx, text, x, y, maxWidth, startSize, minSize, weight) {\r\n    var size = startSize;\r\n    var value = String(text || '\u2014');\r\n    do {\r\n      ctx.font = String(weight || 900) + ' ' + size + 'px Segoe UI, Arial, sans-serif';\r\n      if (ctx.measureText(value).width <= maxWidth || size <= minSize) break;\r\n      size -= 1;\r\n    } while (size > minSize);\r\n    ctx.fillText(value, x, y);\r\n    return size;\r\n  }\r\n\r\n  function drawChartCanvas(ctx, payload, x, y, w, h) {\r\n    var rows = payload.rows || [];\r\n    var values = rows.map(function(r){ return payload.kind === 'bar' ? (n(r[payload.field]) || 0) : n(r[payload.field]); });\r\n    var valid = values.filter(function(v){ return v !== null; });\r\n    var bottom = y + h - 24;\r\n    var top = y + 24;\r\n\r\n    ctx.strokeStyle = 'rgba(255,255,255,.16)';\r\n    ctx.lineWidth = 2;\r\n    ctx.beginPath(); ctx.moveTo(x, bottom); ctx.lineTo(x + w, bottom); ctx.stroke();\r\n    ctx.beginPath(); ctx.moveTo(x, top); ctx.lineTo(x + w, top); ctx.stroke();\r\n\r\n    if (!valid.length) return;\r\n\r\n    if (payload.kind === 'bar') {\r\n      var mx = Math.max.apply(null, valid.concat([1]));\r\n      var gap = values.length > 90 ? 3 : 7;\r\n      var barW = Math.max(3, (w - gap * (values.length - 1)) \/ Math.max(values.length, 1));\r\n      ctx.fillStyle = payload.color || '#2f96c2';\r\n      values.forEach(function(v, i) {\r\n        var val = n(v) || 0;\r\n        var bh = mx ? (val \/ mx) * (bottom - top) : 0;\r\n        var bx = x + i * (barW + gap);\r\n        var by = bottom - bh;\r\n        roundRect(ctx, bx, by, barW, Math.max(1, bh), Math.min(6, barW \/ 2));\r\n        ctx.fill();\r\n      });\r\n      return;\r\n    }\r\n\r\n    var mn = Math.min.apply(null, valid);\r\n    var maxv = Math.max.apply(null, valid);\r\n    if (mn === maxv) { mn -= 1; maxv += 1; }\r\n    ctx.strokeStyle = payload.color || '#35c2ff';\r\n    ctx.lineWidth = 7;\r\n    ctx.lineCap = 'round';\r\n    ctx.lineJoin = 'round';\r\n    ctx.beginPath();\r\n    var started = false;\r\n    values.forEach(function(v, i) {\r\n      if (v === null) return;\r\n      var px = x + (values.length === 1 ? w \/ 2 : (i \/ (values.length - 1)) * w);\r\n      var py = top + (1 - ((v - mn) \/ (maxv - mn))) * (bottom - top);\r\n      if (!started) { ctx.moveTo(px, py); started = true; } else { ctx.lineTo(px, py); }\r\n    });\r\n    ctx.stroke();\r\n  }\r\n\r\n  function slugText(text) {\r\n    return String(text || 'chart').toLowerCase()\r\n      .normalize('NFD').replace(\/[\u0300-\u036f]\/g, '')\r\n      .replace(\/[^a-z0-9\u03b1-\u03c9\u03ac\u03ad\u03ae\u03af\u03cc\u03cd\u03ce\u03ca\u03cb\u0390\u03b0]+\/gi, '-')\r\n      .replace(\/^-+|-+$\/g, '') || 'chart';\r\n  }\r\n\r\n  function tidyPlaceLabel(text) {\r\n    var t = String(text || '').trim();\r\n    if (!t) return '';\r\n    t = t.replace(\/^\u0394\u03b7\u03bc\u03bf\u03c4\u03b9\u03ba\u03ae\\s+\u0395\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1\\s+\/i, '');\r\n    t = t.replace(\/^Municipal\\s+Unit\\s+of\\s+\/i, '');\r\n    t = t.replace(\/^\u0394\u03ae\u03bc\u03bf\u03c2\\s+\/i, '');\r\n    t = t.replace(\/^Municipality\\s+of\\s+\/i, '');\r\n    return t;\r\n  }\r\n\r\n  function exportLocationLabel(place) {\r\n    var parts = [];\r\n    var name = tidyPlaceLabel(place && place.name);\r\n    var admin = tidyPlaceLabel(place && place.admin1);\r\n    var country = tidyPlaceLabel(place && place.country);\r\n    if (name) parts.push(name);\r\n    if (admin && parts.indexOf(admin) === -1) parts.push(admin);\r\n    if (country && parts.indexOf(country) === -1) parts.push(country);\r\n    return parts.join(' \u2022 ') || '\u0395\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1';\r\n  }\r\n\r\n  function drawExportCard(ctx, card, x, y, w, h, accent) {\r\n    var bg = ctx.createLinearGradient(x, y, x, y + h);\r\n    bg.addColorStop(0, 'rgba(255,255,255,.085)');\r\n    bg.addColorStop(1, 'rgba(255,255,255,.045)');\r\n    ctx.fillStyle = bg;\r\n    roundRect(ctx, x, y, w, h, 22);\r\n    ctx.fill();\r\n\r\n    ctx.strokeStyle = 'rgba(255,255,255,.115)';\r\n    ctx.lineWidth = 2;\r\n    ctx.stroke();\r\n\r\n    ctx.fillStyle = accent || '#35c2ff';\r\n    roundRect(ctx, x + 20, y + 17, 76, 5, 3);\r\n    ctx.fill();\r\n\r\n    ctx.fillStyle = 'rgba(238,247,255,.82)';\r\n    ctx.font = '800 16px Segoe UI, Arial, sans-serif';\r\n    drawText(ctx, card.label, x + 20, y + 43, w - 40, 18);\r\n\r\n    ctx.fillStyle = '#ffffff';\r\n    drawFittedText(ctx, card.value, x + 20, y + 78, w - 40, 34, 26, 900);\r\n\r\n    ctx.fillStyle = 'rgba(238,247,255,.66)';\r\n    ctx.font = '500 15px Segoe UI, Arial, sans-serif';\r\n    drawText(ctx, card.note, x + 20, y + h - 18, w - 40, 17);\r\n  }\r\n\r\n  function exportCards(rows) {\r\n    var s = stats(rows);\r\n    return [\r\n      { label: '\u039c\u03ad\u03c3\u03b7 \u03b8\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1', value: fmt(s.tmean, 1, '\u00b0C'), note: '\u039c\u03ad\u03c3\u03bf\u03c2 \u03cc\u03c1\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5', accent: 'rgba(57,217,138,.22)' },\r\n      { label: '\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03b7 \/ \u0395\u03bb\u03ac\u03c7\u03b9\u03c3\u03c4\u03b7', value: fmt(s.tmax, 1, '\u00b0C') + ' \/ ' + fmt(s.tmin, 1, '\u00b0C'), note: '\u0391\u03ba\u03c1\u03b1\u03af\u03b5\u03c2 \u03c4\u03b9\u03bc\u03ad\u03c2 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5', accent: n(s.tmax) !== null && s.tmax >= 32 ? 'rgba(255,92,122,.24)' : 'rgba(255,209,102,.22)' },\r\n      { label: '\u03a3\u03cd\u03bd\u03bf\u03bb\u03bf \u03b2\u03c1\u03bf\u03c7\u03cc\u03c0\u03c4\u03c9\u03c3\u03b7\u03c2', value: fmt(s.rain, 1, 'mm'), note: '\u0386\u03b8\u03c1\u03bf\u03b9\u03c3\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5', accent: 'rgba(53,194,255,.25)' },\r\n      { label: '\u039c\u03ad\u03c3\u03b7 \u03c5\u03b3\u03c1\u03b1\u03c3\u03af\u03b1', value: fmt(s.humidity, 0, '%'), note: '\u039c\u03ad\u03c3\u03bf\u03c2 \u03cc\u03c1\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5', accent: 'rgba(53,194,255,.20)' },\r\n      { label: '\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf\u03c2 \u03ac\u03bd\u03b5\u03bc\u03bf\u03c2', value: fmt(s.wind, 0, 'km\/h'), note: beaufort(s.wind), accent: 'rgba(255,255,255,.18)' },\r\n      { label: '\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03b7 \u03c1\u03b9\u03c0\u03ae', value: fmt(s.gust, 0, 'km\/h'), note: beaufort(s.gust), accent: 'rgba(255,255,255,.18)' },\r\n      { label: '\u039c\u03ad\u03c3\u03b7 \u03c0\u03af\u03b5\u03c3\u03b7', value: fmt(s.pressure, 1, 'hPa'), note: '\u03a3\u03c4\u03b7 \u03bc\u03ad\u03c3\u03b7 \u03c3\u03c4\u03ac\u03b8\u03bc\u03b7 \u03b8\u03ac\u03bb\u03b1\u03c3\u03c3\u03b1\u03c2', accent: 'rgba(53,194,255,.20)' },\r\n      { label: '\u0395\u03b3\u03b3\u03c1\u03b1\u03c6\u03ad\u03c2', value: String(rows.length), note: rows.length > 370 ? '\u0397\u03bc\u03b5\u03c1\u03ae\u03c3\u03b9\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1, \u03bc\u03b7\u03bd\u03b9\u03b1\u03af\u03b1 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae' : '\u0397\u03bc\u03b5\u03c1\u03ae\u03c3\u03b9\u03b5\u03c2 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ad\u03c2', accent: 'rgba(53,194,255,.20)' }\r\n    ];\r\n  }\r\n\r\n  function drawExportChart(ctx, cfgChart, rows, x, y, w, h) {\r\n    var box = ctx.createLinearGradient(x, y, x, y + h);\r\n    box.addColorStop(0, 'rgba(255,255,255,.055)');\r\n    box.addColorStop(1, 'rgba(255,255,255,.03)');\r\n    ctx.fillStyle = box;\r\n    roundRect(ctx, x, y, w, h, 24);\r\n    ctx.fill();\r\n    ctx.strokeStyle = 'rgba(255,255,255,.11)';\r\n    ctx.lineWidth = 2;\r\n    ctx.stroke();\r\n\r\n    ctx.fillStyle = '#ffffff';\r\n    ctx.font = '800 18px Segoe UI, Arial, sans-serif';\r\n    ctx.fillText(cfgChart.title, x + 22, y + 30);\r\n\r\n    var values = rows.map(function(r){ return cfgChart.kind === 'bar' ? (n(r[cfgChart.field]) || 0) : n(r[cfgChart.field]); });\r\n    var valid = values.filter(function(v){ return v !== null; });\r\n    var chartX = x + 22;\r\n    var chartY = y + 43;\r\n    var chartW = w - 44;\r\n    var chartH = h - 68;\r\n    var top = chartY + 6;\r\n    var bottom = chartY + chartH - 10;\r\n\r\n    ctx.strokeStyle = 'rgba(255,255,255,.08)';\r\n    ctx.lineWidth = 1.5;\r\n    [top, top + (bottom - top) \/ 2, bottom].forEach(function(lineY) {\r\n      ctx.beginPath();\r\n      ctx.moveTo(chartX, lineY);\r\n      ctx.lineTo(chartX + chartW, lineY);\r\n      ctx.stroke();\r\n    });\r\n\r\n    if (valid.length) {\r\n      if (cfgChart.kind === 'bar') {\r\n        var mx = Math.max.apply(null, valid.concat([1]));\r\n        var count = Math.max(values.length, 1);\r\n        var gap = count > 180 ? 1 : (count > 120 ? 1.5 : (count > 90 ? 2 : (count > 60 ? 3 : 5)));\r\n        var barW = Math.max(1.1, (chartW - gap * (count - 1)) \/ count);\r\n        ctx.fillStyle = cfgChart.color;\r\n        values.forEach(function(v, i) {\r\n          var val = n(v) || 0;\r\n          var bh = mx ? (val \/ mx) * (bottom - top) : 0;\r\n          var bx = chartX + i * (barW + gap);\r\n          var by = bottom - bh;\r\n          roundRect(ctx, bx, by, barW, Math.max(1, bh), Math.min(4, barW \/ 2));\r\n          ctx.fill();\r\n        });\r\n      } else {\r\n        var mn = Math.min.apply(null, valid);\r\n        var maxv = Math.max.apply(null, valid);\r\n        if (mn === maxv) { mn -= 1; maxv += 1; }\r\n        ctx.strokeStyle = cfgChart.color;\r\n        ctx.lineWidth = 4.5;\r\n        ctx.lineCap = 'round';\r\n        ctx.lineJoin = 'round';\r\n        ctx.beginPath();\r\n        var started = false;\r\n        values.forEach(function(v, i) {\r\n          if (v === null) return;\r\n          var px = chartX + (values.length === 1 ? chartW \/ 2 : (i \/ (values.length - 1)) * chartW);\r\n          var py = top + (1 - ((v - mn) \/ (maxv - mn))) * (bottom - top);\r\n          if (!started) { ctx.moveTo(px, py); started = true; } else { ctx.lineTo(px, py); }\r\n        });\r\n        ctx.stroke();\r\n      }\r\n    }\r\n\r\n    ctx.fillStyle = 'rgba(238,247,255,.68)';\r\n    ctx.font = '500 14px Segoe UI, Arial, sans-serif';\r\n    var note = '';\r\n    if (valid.length && cfgChart.kind === 'bar') {\r\n      note = '\u03a3\u03cd\u03bd\u03bf\u03bb\u03bf: ' + fmt(sum(values), 1, cfgChart.unit);\r\n    } else if (valid.length) {\r\n      note = '\u0395\u03bb\u03ac\u03c7\u03b9\u03c3\u03c4\u03bf: ' + fmt(Math.min.apply(null, valid), 1, cfgChart.unit) + ' \u00b7 \u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf: ' + fmt(Math.max.apply(null, valid), 1, cfgChart.unit);\r\n    } else {\r\n      note = '\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1.';\r\n    }\r\n    drawText(ctx, note, x + 22, y + h - 16, w - 44, 16);\r\n  }\r\n\r\n  function drawPill(ctx, text, x, y, w, h) {\r\n    var g = ctx.createLinearGradient(x, y, x + w, y + h);\r\n    g.addColorStop(0, 'rgba(53,194,255,.14)');\r\n    g.addColorStop(1, 'rgba(128,224,255,.08)');\r\n    ctx.fillStyle = g;\r\n    roundRect(ctx, x, y, w, h, h \/ 2);\r\n    ctx.fill();\r\n    ctx.strokeStyle = 'rgba(53,194,255,.30)';\r\n    ctx.lineWidth = 2;\r\n    ctx.stroke();\r\n\r\n    ctx.fillStyle = '#86e6ff';\r\n    ctx.font = '800 18px Segoe UI, Arial, sans-serif';\r\n    ctx.textAlign = 'center';\r\n    ctx.fillText(text, x + w \/ 2, y + h \/ 2 + 7);\r\n    ctx.textAlign = 'left';\r\n  }\r\n\r\n  function exportSectionImage(key) {\r\n    var payload = state.exports[key];\r\n    if (!payload || payload.type !== 'section') {\r\n      setStatus('\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b5\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03b5\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2.', 'error');\r\n      return;\r\n    }\r\n\r\n    var rows = payload.rows || [];\r\n    var viewRows = payload.viewRows || rows;\r\n    if (!rows.length || !viewRows.length) {\r\n      setStatus('\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b3\u03b9\u03b1 \u03b5\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2.', 'error');\r\n      return;\r\n    }\r\n\r\n    var canvas = document.createElement('canvas');\r\n    canvas.width = 1920;\r\n    canvas.height = 1080;\r\n    var ctx = canvas.getContext('2d');\r\n\r\n    var bg = ctx.createLinearGradient(0, 0, canvas.width, canvas.height);\r\n    bg.addColorStop(0, '#081a2a');\r\n    bg.addColorStop(.5, '#0b2032');\r\n    bg.addColorStop(1, '#0d2a2b');\r\n    ctx.fillStyle = bg;\r\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n    var glow1 = ctx.createRadialGradient(1500, 160, 10, 1500, 160, 500);\r\n    glow1.addColorStop(0, 'rgba(53,194,255,.12)');\r\n    glow1.addColorStop(1, 'rgba(53,194,255,0)');\r\n    ctx.fillStyle = glow1;\r\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n    var glow2 = ctx.createRadialGradient(260, 900, 10, 260, 900, 420);\r\n    glow2.addColorStop(0, 'rgba(57,217,138,.10)');\r\n    glow2.addColorStop(1, 'rgba(57,217,138,0)');\r\n    ctx.fillStyle = glow2;\r\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n    ctx.fillStyle = 'rgba(255,255,255,.045)';\r\n    roundRect(ctx, 42, 42, 1836, 996, 36);\r\n    ctx.fill();\r\n    ctx.strokeStyle = 'rgba(255,255,255,.12)';\r\n    ctx.lineWidth = 2;\r\n    ctx.stroke();\r\n\r\n    var place = state.place || {};\r\n    var placeLabel = exportLocationLabel(place);\r\n    var placeName = tidyPlaceLabel(place.name) || '\u0395\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1';\r\n    var period = fmtDate(payload.range.start) + ' \u2013 ' + fmtDate(payload.range.end);\r\n    var projection = payload.monthly ? '\u039c\u03b7\u03bd\u03b9\u03b1\u03af\u03b1 \u03c3\u03cd\u03bd\u03bf\u03c8\u03b7 \u03bc\u03b5\u03b3\u03ac\u03bb\u03b7\u03c2 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5' : '\u0397\u03bc\u03b5\u03c1\u03ae\u03c3\u03b9\u03b1 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ce\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd';\r\n\r\n    ctx.fillStyle = '#86e6ff';\r\n    ctx.font = '800 30px Segoe UI, Arial, sans-serif';\r\n    ctx.fillText('MeteoPatras', 84, 98);\r\n\r\n    ctx.fillStyle = 'rgba(238,247,255,.62)';\r\n    ctx.font = '500 16px Segoe UI, Arial, sans-serif';\r\n    ctx.fillText('\u0399\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ac \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03ba\u03b1\u03b9\u03c1\u03bf\u03cd', 84, 124);\r\n\r\n    drawPill(ctx, period, 1492, 72, 314, 42);\r\n    drawPill(ctx, '\u03a0\u03b7\u03b3\u03ae: Open-Meteo', 1492, 126, 314, 38);\r\n\r\n    ctx.fillStyle = '#ffffff';\r\n    ctx.font = '900 42px Segoe UI, Arial, sans-serif';\r\n    drawText(ctx, payload.title, 84, 185, 980, 44);\r\n\r\n    ctx.fillStyle = 'rgba(238,247,255,.80)';\r\n    ctx.font = '600 24px Segoe UI, Arial, sans-serif';\r\n    drawText(ctx, placeLabel, 84, 228, 980, 28);\r\n\r\n    ctx.fillStyle = 'rgba(238,247,255,.62)';\r\n    ctx.font = '500 19px Segoe UI, Arial, sans-serif';\r\n    drawText(ctx, projection, 84, 260, 980, 22);\r\n\r\n    var cards = exportCards(rows);\r\n    var cardX = 84, cardY = 288, cardW = 412, cardH = 116, gapX = 18, gapY = 16;\r\n    cards.forEach(function(card, i) {\r\n      var col = i % 4;\r\n      var row = Math.floor(i \/ 4);\r\n      drawExportCard(ctx, card, cardX + col * (cardW + gapX), cardY + row * (cardH + gapY), cardW, cardH, card.accent);\r\n    });\r\n\r\n    var chartConfigs = [\r\n      { title: '\u0398\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1 \u03bc\u03ad\u03c3\u03b7', kind: 'line', field: 'tmean', unit: '\u00b0C', color: '#35c2ff' },\r\n      { title: '\u0392\u03c1\u03bf\u03c7\u03cc\u03c0\u03c4\u03c9\u03c3\u03b7', kind: 'bar', field: 'rain', unit: 'mm', color: 'rgba(53,194,255,.72)' },\r\n      { title: '\u0386\u03bd\u03b5\u03bc\u03bf\u03c2 \u03bc\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf\u03c2', kind: 'line', field: 'windMax', unit: 'km\/h', color: '#ffd166' },\r\n      { title: '\u03a0\u03af\u03b5\u03c3\u03b7 \u03bc\u03ad\u03c3\u03b7', kind: 'line', field: 'pressure', unit: 'hPa', color: '#35c2ff' }\r\n    ];\r\n\r\n    var chartX = 84, chartY = 554, chartW = 842, chartH = 158, chartGapX = 24, chartGapY = 18;\r\n    chartConfigs.forEach(function(c, i) {\r\n      var col = i % 2;\r\n      var row = Math.floor(i \/ 2);\r\n      drawExportChart(ctx, c, viewRows, chartX + col * (chartW + chartGapX), chartY + row * (chartH + chartGapY), chartW, chartH);\r\n    });\r\n\r\n    ctx.fillStyle = 'rgba(255,255,255,.05)';\r\n    roundRect(ctx, 84, 914, 1752, 88, 22);\r\n    ctx.fill();\r\n    ctx.strokeStyle = 'rgba(255,255,255,.10)';\r\n    ctx.lineWidth = 2;\r\n    ctx.stroke();\r\n\r\n    ctx.fillStyle = '#ffffff';\r\n    ctx.font = '800 18px Segoe UI, Arial, sans-serif';\r\n    ctx.fillText('\u03a4\u03b9 \u03b4\u03b5\u03af\u03c7\u03bd\u03b5\u03b9 \u03b7 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1', 110, 941);\r\n\r\n    ctx.fillStyle = 'rgba(238,247,255,.78)';\r\n    ctx.font = '500 15px Segoe UI, Arial, sans-serif';\r\n    var bullets = [\r\n      '\u2022 \u03a3\u03cd\u03bd\u03bf\u03c8\u03b7 \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ce\u03bd \u03bc\u03b5\u03c4\u03b5\u03c9\u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03ba\u03ce\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b3\u03b9\u03b1 ' + placeName + ' \u03ba\u03b1\u03b9 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03c7\u03c1\u03bf\u03bd\u03b9\u03ba\u03ae \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf.',\r\n      '\u2022 \u03a0\u03b5\u03c1\u03b9\u03bb\u03b1\u03bc\u03b2\u03ac\u03bd\u03b5\u03b9 \u03b8\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1, \u03b2\u03c1\u03bf\u03c7\u03cc\u03c0\u03c4\u03c9\u03c3\u03b7, \u03c5\u03b3\u03c1\u03b1\u03c3\u03af\u03b1, \u03ac\u03bd\u03b5\u03bc\u03bf, \u03c1\u03b9\u03c0\u03ad\u03c2 \u03ba\u03b1\u03b9 \u03b1\u03c4\u03bc\u03bf\u03c3\u03c6\u03b1\u03b9\u03c1\u03b9\u03ba\u03ae \u03c0\u03af\u03b5\u03c3\u03b7.',\r\n      '\u2022 \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1: Open-Meteo reanalysis. \u0397 \u03bf\u03bd\u03bf\u03bc\u03b1\u03c3\u03af\u03b1 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2, \u03cc\u03c4\u03b1\u03bd \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 GPS, \u03c0\u03c1\u03bf\u03ad\u03c1\u03c7\u03b5\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc OpenStreetMap \/ Nominatim.'\r\n    ];\r\n    var yy = 965;\r\n    bullets.forEach(function(b) {\r\n      yy = drawText(ctx, b, 110, yy, 1688, 17);\r\n    });\r\n\r\n    var link = document.createElement('a');\r\n    link.href = canvas.toDataURL('image\/png');\r\n    link.download = 'meteopatras-' + slugText(placeName) + '-' + slugText(payload.title) + '-' + slugText(payload.range.start) + '-' + slugText(payload.range.end) + '.png';\r\n    document.body.appendChild(link);\r\n    link.click();\r\n    link.remove();\r\n\r\n    setStatus('\u0397 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1 PNG \u03c4\u03b7\u03c2 \u03b5\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03ae\u03b8\u03b7\u03ba\u03b5 \u03c3\u03b5 HD \u03c0\u03bf\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1.', 'ok');\r\n  }\r\n\r\n  function renderTable(rows, monthly) {\r\n    var headDate = monthly ? '\u039c\u03ae\u03bd\u03b1\u03c2' : '\u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1';\r\n    return '<div class=\"mp-table-wrap\"><table><thead><tr>' +\r\n      '<th>' + headDate + '<\/th><th>\u0398\u03b5\u03c1\u03bc. \u03bc\u03ad\u03c3\u03b7<\/th><th>\u0398\u03b5\u03c1\u03bc. \u03bc\u03ad\u03b3.<\/th><th>\u0398\u03b5\u03c1\u03bc. \u03b5\u03bb\u03ac\u03c7.<\/th><th>\u03a5\u03b3\u03c1\u03b1\u03c3\u03af\u03b1<\/th><th>\u0392\u03c1\u03bf\u03c7\u03ae<\/th><th>\u0386\u03bd\u03b5\u03bc\u03bf\u03c2 \u03bc\u03ad\u03b3.<\/th><th>\u03a1\u03b9\u03c0\u03ae<\/th><th>\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7<\/th><th>\u03a0\u03af\u03b5\u03c3\u03b7<\/th>' +\r\n      '<\/tr><\/thead><tbody>' + rows.map(function(r) {\r\n        var dir = n(r.windDir) === null ? '\u2014' : fmt(r.windDir, 0, '\u00b0') + ' (' + compass(r.windDir) + ')';\r\n        return '<tr>' +\r\n          '<td>' + escapeHTML(fmtDate(r.date)) + '<\/td>' +\r\n          '<td>' + escapeHTML(fmt(r.tmean, 1, '\u00b0C')) + '<\/td>' +\r\n          '<td>' + escapeHTML(fmt(r.tmax, 1, '\u00b0C')) + '<\/td>' +\r\n          '<td>' + escapeHTML(fmt(r.tmin, 1, '\u00b0C')) + '<\/td>' +\r\n          '<td>' + escapeHTML(fmt(r.humidity, 0, '%')) + '<\/td>' +\r\n          '<td>' + escapeHTML(fmt(r.rain, 1, 'mm')) + '<\/td>' +\r\n          '<td>' + escapeHTML(fmt(r.windMax, 0, 'km\/h')) + ' \u00b7 ' + escapeHTML(beaufort(r.windMax)) + '<\/td>' +\r\n          '<td>' + escapeHTML(fmt(r.gust, 0, 'km\/h')) + ' \u00b7 ' + escapeHTML(beaufort(r.gust)) + '<\/td>' +\r\n          '<td>' + escapeHTML(dir) + '<\/td>' +\r\n          '<td>' + escapeHTML(fmt(r.pressure, 1, 'hPa')) + '<\/td>' +\r\n        '<\/tr>';\r\n      }).join('') + '<\/tbody><\/table><\/div>';\r\n  }\r\n\r\n  function renderSection(el, title, range, rows, loadingText) {\r\n    if (!rows) {\r\n      el.hidden = false;\r\n      el.innerHTML = '<div class=\"mp-section-head\"><div><h4>' + escapeHTML(title) + '<\/h4><p>' + escapeHTML(loadingText || '\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...') + '<\/p><\/div><div class=\"mp-section-actions\"><span class=\"mp-badge\">' + escapeHTML(fmtDate(range.start)) + ' \u2013 ' + escapeHTML(fmtDate(range.end)) + '<\/span><\/div><\/div>';\r\n      return;\r\n    }\r\n\r\n    var monthly = rows.length > 370;\r\n    var viewRows = monthly ? aggregateMonthly(rows) : rows;\r\n    var chartCtx = { sectionTitle: title, range: range, monthly: monthly };\r\n    var sectionKey = makeExportKey();\r\n\r\n    state.exports[sectionKey] = {\r\n      type: 'section',\r\n      title: title,\r\n      range: range,\r\n      rows: rows,\r\n      viewRows: viewRows,\r\n      monthly: monthly\r\n    };\r\n\r\n    el.hidden = false;\r\n    el.innerHTML = '<div class=\"mp-section-head\"><div><h4>' + escapeHTML(title) + '<\/h4><p>' +\r\n      escapeHTML((monthly ? '\u039c\u03b5\u03b3\u03ac\u03bb\u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2: \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03bc\u03b7\u03bd\u03b9\u03b1\u03af\u03b1 \u03c3\u03cd\u03bd\u03bf\u03c8\u03b7 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c0\u03b1\u03c1\u03b1\u03bc\u03ad\u03bd\u03b5\u03b9 \u03b3\u03c1\u03ae\u03b3\u03bf\u03c1\u03b7 \u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1.' : '\u0397\u03bc\u03b5\u03c1\u03ae\u03c3\u03b9\u03b1 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03ce\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd.')) +\r\n      '<\/p><\/div><div class=\"mp-section-actions\"><span class=\"mp-badge\">' + escapeHTML(fmtDate(range.start)) + ' \u2013 ' + escapeHTML(fmtDate(range.end)) + '<\/span>' +\r\n      '<button type=\"button\" class=\"mp-export\" data-action=\"export\" data-export-key=\"' + escapeHTML(sectionKey) + '\">\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c3\u03b5 PNG<\/button><\/div><\/div>' +\r\n      renderCards(rows) +\r\n      '<div class=\"mp-chart-grid\">' +\r\n        renderLineChart(chartCtx, '\u0398\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1 \u03bc\u03ad\u03c3\u03b7', viewRows, 'tmean', 'mp-line-temp', '\u00b0C') +\r\n        renderBarChart(chartCtx, '\u0392\u03c1\u03bf\u03c7\u03cc\u03c0\u03c4\u03c9\u03c3\u03b7', viewRows, 'rain', 'mm') +\r\n        renderLineChart(chartCtx, '\u0386\u03bd\u03b5\u03bc\u03bf\u03c2 \u03bc\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf\u03c2', viewRows, 'windMax', 'mp-line-wind', 'km\/h') +\r\n        renderLineChart(chartCtx, '\u03a0\u03af\u03b5\u03c3\u03b7 \u03bc\u03ad\u03c3\u03b7', viewRows, 'pressure', 'mp-line-temp', 'hPa') +\r\n      '<\/div>' +\r\n      renderTable(viewRows, monthly);\r\n  }\r\n\r\n  function renderLocation(place, weather) {\r\n    var loc = [place.admin1, place.country].filter(Boolean).join(', ');\r\n    var elev = weather && n(weather.elevation) !== null ? ' \u00b7 \u03a5\u03c8\u03cc\u03bc\u03b5\u03c4\u03c1\u03bf grid: ' + fmt(weather.elevation, 0, 'm') : '';\r\n    els.location.innerHTML = '<h3>' + escapeHTML(place.name || '\u0395\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1') + '<\/h3><p>' +\r\n      escapeHTML(loc || '\u03a3\u03c5\u03bd\u03c4\u03b5\u03c4\u03b1\u03b3\u03bc\u03ad\u03bd\u03b5\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7') + ' \u00b7 ' + escapeHTML(Number(place.latitude).toFixed(4)) + ', ' + escapeHTML(Number(place.longitude).toFixed(4)) + elev + '<\/p>';\r\n  }\r\n\r\n  async function fetchArchive(place, range) {\r\n    validateRange(range.start, range.end);\r\n    var data = await ajax('archive', {\r\n      lat: place.latitude,\r\n      lon: place.longitude,\r\n      start: range.start,\r\n      end: range.end,\r\n      tz: place.timezone || 'auto'\r\n    });\r\n    var weather = data.weather || {};\r\n    var rows = rowsFromWeather(weather);\r\n    if (!rows.length) throw new Error('\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7\u03bd \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf.');\r\n    return { weather: weather, rows: rows };\r\n  }\r\n\r\n  async function loadPlace(place) {\r\n    if (!place || !Number.isFinite(Number(place.latitude)) || !Number.isFinite(Number(place.longitude))) {\r\n      setStatus('\u0397 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b5\u03c2 \u03c3\u03c5\u03bd\u03c4\u03b5\u03c4\u03b1\u03b3\u03bc\u03ad\u03bd\u03b5\u03c2.', 'error');\r\n      return;\r\n    }\r\n\r\n    state.place = place;\r\n    els.results.innerHTML = '';\r\n    els.content.hidden = false;\r\n    els.custom.hidden = true;\r\n    renderLocation(place, null);\r\n\r\n    var prev = previousMonthRange();\r\n    var ytd = ytdRange();\r\n\r\n    setBusy(true);\r\n    setStatus('\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b3\u03b9\u03b1 ' + (place.name || '\u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1') + '...', '');\r\n    renderSection(els.previous, '\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2', prev, null, '\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c5 \u03bc\u03ae\u03bd\u03b1...');\r\n    renderSection(els.ytd, '\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03ad\u03c4\u03bf\u03c2 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae\u03c2', ytd, null, '\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd\u03c4\u03bf\u03c2 \u03ad\u03c4\u03bf\u03c5\u03c2...');\r\n\r\n    try {\r\n      var prevData = await fetchArchive(place, prev);\r\n      renderLocation(place, prevData.weather);\r\n      renderSection(els.previous, '\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2', prev, prevData.rows);\r\n\r\n      var ytdData = await fetchArchive(place, ytd);\r\n      renderSection(els.ytd, '\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03ad\u03c4\u03bf\u03c2 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae\u03c2', ytd, ytdData.rows);\r\n\r\n      setStatus('\u03a4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03c6\u03bf\u03c1\u03c4\u03ce\u03b8\u03b7\u03ba\u03b1\u03bd \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03ce\u03c2. \u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03ac\u03bb\u03bb\u03b7\u03c2 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae\u03c2 \u03ae \u03bd\u03b1 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03b5\u03c4\u03b5 \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf \u03b1\u03c0\u03cc \u03c4\u03bf 1940 \u03ba\u03b1\u03b9 \u03bc\u03b5\u03c4\u03ac.', 'ok');\r\n    } catch (err) {\r\n      setStatus(err.message || '\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd.', 'error');\r\n    } finally {\r\n      setBusy(false);\r\n    }\r\n  }\r\n\r\n  async function doSearch() {\r\n    var query = (els.query.value || '').trim();\r\n    if (query.length < 2) { setStatus('\u0393\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03bf\u03c5\u03bb\u03ac\u03c7\u03b9\u03c3\u03c4\u03bf\u03bd 2 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b5\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1.', 'error'); return; }\r\n\r\n    setBusy(true);\r\n    setStatus('\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2...', '');\r\n    els.results.innerHTML = '';\r\n\r\n    try {\r\n      var data = await ajax('geocode', { q: query });\r\n      var places = data.results || [];\r\n      if (!places.length) throw new Error('\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03bc\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1.');\r\n      els.results.innerHTML = places.map(function(p, i) {\r\n        var admin = [p.admin1, p.country].filter(Boolean).join(', ');\r\n        return '<button type=\"button\" class=\"mp-place\" data-action=\"pick\" data-index=\"' + i + '\"><strong>' + escapeHTML(p.name) + '<\/strong><span>' + escapeHTML(admin || '\u0386\u03b3\u03bd\u03c9\u03c3\u03c4\u03b7 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae') + ' \u00b7 ' + escapeHTML(Number(p.latitude).toFixed(4)) + ', ' + escapeHTML(Number(p.longitude).toFixed(4)) + '<\/span><\/button>';\r\n      }).join('');\r\n      root._mpPlaces = places;\r\n      setStatus('\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03b7 \u03c3\u03c9\u03c3\u03c4\u03ae \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03b1\u03c0\u03cc \u03c4\u03b1 \u03b1\u03c0\u03bf\u03c4\u03b5\u03bb\u03ad\u03c3\u03bc\u03b1\u03c4\u03b1.', 'ok');\r\n    } catch (err) {\r\n      setStatus(err.message || '\u0394\u03b5\u03bd \u03bf\u03bb\u03bf\u03ba\u03bb\u03b7\u03c1\u03ce\u03b8\u03b7\u03ba\u03b5 \u03b7 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7.', 'error');\r\n    } finally {\r\n      setBusy(false);\r\n    }\r\n  }\r\n\r\n\r\n  async function reverseGeocodePlace(lat, lon) {\r\n    var fallback = {\r\n      name: '\u0397 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03bc\u03bf\u03c5',\r\n      admin1: '',\r\n      country: '',\r\n      latitude: Number(lat),\r\n      longitude: Number(lon),\r\n      timezone: 'auto'\r\n    };\r\n\r\n    try {\r\n      var data = await ajax('reverse', { lat: lat, lon: lon });\r\n      if (data && data.place && Number.isFinite(Number(data.place.latitude)) && Number.isFinite(Number(data.place.longitude))) {\r\n        return data.place;\r\n      }\r\n    } catch (err) {\r\n      \/\/ \u0391\u03bd \u03c4\u03bf reverse geocoding \u03b4\u03b5\u03bd \u03b1\u03c0\u03b1\u03bd\u03c4\u03ae\u03c3\u03b5\u03b9, \u03c4\u03bf \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03b6\u03b5\u03b9 \u03ba\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03b9\u03c2 \u03c3\u03c5\u03bd\u03c4\u03b5\u03c4\u03b1\u03b3\u03bc\u03ad\u03bd\u03b5\u03c2.\r\n    }\r\n\r\n    return fallback;\r\n  }\r\n\r\n  function useGeolocation(auto) {\r\n    if (!navigator.geolocation) {\r\n      if (auto) { loadPlace(cfg.patras); return; }\r\n      setStatus('\u039f browser \u03b4\u03b5\u03bd \u03c5\u03c0\u03bf\u03c3\u03c4\u03b7\u03c1\u03af\u03b6\u03b5\u03b9 \u03b5\u03bd\u03c4\u03bf\u03c0\u03b9\u03c3\u03bc\u03cc \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2.', 'error');\r\n      return;\r\n    }\r\n\r\n    setBusy(true);\r\n    setStatus(auto ? '\u03a0\u03c1\u03bf\u03c3\u03c0\u03ac\u03b8\u03b5\u03b9\u03b1 \u03b5\u03bd\u03c4\u03bf\u03c0\u03b9\u03c3\u03bc\u03bf\u03cd \u03c4\u03b7\u03c2 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2 \u03c3\u03b1\u03c2. \u0391\u03bd \u03b4\u03b5\u03bd \u03b4\u03bf\u03b8\u03b5\u03af \u03ac\u03b4\u03b5\u03b9\u03b1, \u03b8\u03b1 \u03b5\u03bc\u03c6\u03b1\u03bd\u03b9\u03c3\u03c4\u03b5\u03af \u03b7 \u03a0\u03ac\u03c4\u03c1\u03b1.' : '\u0396\u03b7\u03c4\u03b5\u03af\u03c4\u03b1\u03b9 \u03ac\u03b4\u03b5\u03b9\u03b1 \u03b3\u03b9\u03b1 \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2 \u03c3\u03b1\u03c2...', '');\r\n\r\n    navigator.geolocation.getCurrentPosition(async function(pos) {\r\n      var lat = Number(pos.coords.latitude);\r\n      var lon = Number(pos.coords.longitude);\r\n\r\n      setStatus('\u0395\u03bd\u03c4\u03bf\u03c0\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03b7 \u03b8\u03ad\u03c3\u03b7 \u03c3\u03b1\u03c2. \u0393\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03bf\u03bd\u03cc\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae\u03c2...', '');\r\n      var place = await reverseGeocodePlace(lat, lon);\r\n\r\n      setBusy(false);\r\n      loadPlace(place);\r\n    }, function() {\r\n      setBusy(false);\r\n      if (auto) {\r\n        setStatus('\u0394\u03b5\u03bd \u03b4\u03cc\u03b8\u03b7\u03ba\u03b5 \u03ae \u03b4\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b7 \u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1. \u0395\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b1 \u03b7 \u03a0\u03ac\u03c4\u03c1\u03b1.', '');\r\n        loadPlace(cfg.patras);\r\n      } else {\r\n        setStatus('\u0394\u03b5\u03bd \u03b4\u03cc\u03b8\u03b7\u03ba\u03b5 \u03ac\u03b4\u03b5\u03b9\u03b1 \u03ae \u03b4\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03c2 \u03bf \u03b5\u03bd\u03c4\u03bf\u03c0\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2.', 'error');\r\n      }\r\n    }, { enableHighAccuracy: false, timeout: 9000, maximumAge: 10 * 60 * 1000 });\r\n  }\r\n\r\n  async function loadCustom() {\r\n    if (!state.place) { setStatus('\u03a0\u03c1\u03ce\u03c4\u03b1 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1.', 'error'); return; }\r\n    var range = { start: els.customStart.value, end: els.customEnd.value };\r\n    try { validateRange(range.start, range.end); } catch (err) { setStatus(err.message, 'error'); return; }\r\n\r\n    setBusy(true);\r\n    setStatus('\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7\u03c2 \u03c0\u03b5\u03c1\u03b9\u03cc\u03b4\u03bf\u03c5...', '');\r\n    renderSection(els.custom, '\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2', range, null, '\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd...');\r\n\r\n    try {\r\n      var data = await fetchArchive(state.place, range);\r\n      renderSection(els.custom, '\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2', range, data.rows);\r\n      setStatus('\u0397 \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2 \u03c6\u03bf\u03c1\u03c4\u03ce\u03b8\u03b7\u03ba\u03b5 \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03ce\u03c2.', 'ok');\r\n    } catch (err) {\r\n      setStatus(err.message || '\u0394\u03b5\u03bd \u03c6\u03bf\u03c1\u03c4\u03ce\u03b8\u03b7\u03ba\u03b5 \u03b7 \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2.', 'error');\r\n    } finally {\r\n      setBusy(false);\r\n    }\r\n  }\r\n\r\n  root.addEventListener('click', function(ev) {\r\n    var btn = ev.target.closest('[data-action]');\r\n    if (!btn || !root.contains(btn)) return;\r\n\r\n    var action = btn.getAttribute('data-action');\r\n    if (action === 'export') {\r\n      exportSectionImage(btn.getAttribute('data-export-key'));\r\n      return;\r\n    }\r\n    if (state.busy) return;\r\n\r\n    if (action === 'search') doSearch();\r\n    if (action === 'geo') useGeolocation(false);\r\n    if (action === 'custom') loadCustom();\r\n    if (action === 'pick') {\r\n      var idx = Number(btn.getAttribute('data-index'));\r\n      var places = root._mpPlaces || [];\r\n      if (places[idx]) loadPlace(places[idx]);\r\n    }\r\n  });\r\n\r\n  els.query.addEventListener('keydown', function(ev) {\r\n    if (ev.key === 'Enter') {\r\n      ev.preventDefault();\r\n      if (!state.busy) doSearch();\r\n    }\r\n  });\r\n\r\n  defaultCustomRange();\r\n  els.query.value = '\u03a0\u03ac\u03c4\u03c1\u03b1';\r\n  setStatus('\u0388\u03c4\u03bf\u03b9\u03bc\u03bf. \u03a6\u03bf\u03c1\u03c4\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03b1\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b1 \u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ae, \u03b1\u03bd \u03b4\u03b5\u03bd \u03b4\u03bf\u03b8\u03b5\u03af \u03ac\u03b4\u03b5\u03b9\u03b1, \u03b7 \u03a0\u03ac\u03c4\u03c1\u03b1.', '');\r\n  setTimeout(function() { useGeolocation(true); }, 300);\r\n})(\"mp-hw-v12-56469\");\r\n<\/script>\r\n\t\t\t\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-220","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/meteopatras.eu\/new\/wp-json\/wp\/v2\/pages\/220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/meteopatras.eu\/new\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/meteopatras.eu\/new\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/meteopatras.eu\/new\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/meteopatras.eu\/new\/wp-json\/wp\/v2\/comments?post=220"}],"version-history":[{"count":0,"href":"https:\/\/meteopatras.eu\/new\/wp-json\/wp\/v2\/pages\/220\/revisions"}],"wp:attachment":[{"href":"https:\/\/meteopatras.eu\/new\/wp-json\/wp\/v2\/media?parent=220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}