{"id":20469,"date":"2026-10-19T23:31:19","date_gmt":"2026-10-19T20:31:19","guid":{"rendered":"https:\/\/zeolife.gr\/?page_id=20469"},"modified":"2026-10-20T00:18:13","modified_gmt":"2026-10-19T21:18:13","slug":"foliar-spray-program-calculator","status":"publish","type":"page","link":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/","title":{"rendered":"Foliar Spray Program with Zeolite \u2014 Dosage Guide"},"content":{"rendered":"\n<!-- ==========================================================\n     Foliar Spray Program Guide (Zeolite \/ ZeTe + EM + EcoPlant + Diatomite) \u2014 EN\n     Path: \/en\/foliar-spray-program-calculator\/  (WPML translation of \/psekasmos-zeolithos-programma\/)\n     ----------------------------------------------------------\n     NO <style>\/<link> (AMP safe) \u2014 styling comes from the Customizer, \u00a716 .zlcalc.\n     JS stays here, in an IIFE. Root hook: id=\"zsCalc\".\n     WordPress-safe: no logical-AND, no \"less-than\" glued to a letter.\n     19\/10\/2026 \u2014 first EN version.\n     ========================================================== -->\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@graph\": [\n    {\n      \"@type\": \"WebApplication\",\n      \"name\": \"Foliar Spray Program Guide with Zeolite, ZeTe, EM, EcoPlant and Diatomite\",\n      \"alternateName\": \"Zeolite foliar spray dosage guide\",\n      \"url\": \"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/\",\n      \"description\": \"Interactive guide that builds a yearly program of 4 foliar sprays (pre-flowering, small fruit, large fruit, post-harvest) for olive, citrus, fruit trees, walnut\/pistachio and vineyard, with 20-micron zeolite or ZeTe, EM active microorganisms, EcoPlant\u00ae and diatomite. It calculates quantities per spray, per tank and per year and starts the program from the next spray based on today's date.\",\n      \"applicationCategory\": \"AgricultureApplication\",\n      \"operatingSystem\": \"Any (web)\",\n      \"inLanguage\": \"en\",\n      \"isAccessibleForFree\": true,\n      \"audience\": { \"@type\": \"Audience\", \"audienceType\": \"Farmers, Agronomists, Agricultural Cooperatives\" },\n      \"publisher\": { \"@type\": \"Organization\", \"name\": \"Zeolife\", \"url\": \"https:\/\/zeolife.gr\/en\/\" }\n    },\n    {\n      \"@type\": \"HowTo\",\n      \"name\": \"How to build a zeolite foliar spray program\",\n      \"step\": [\n        { \"@type\": \"HowToStep\", \"name\": \"Choose your crop\", \"text\": \"Olive, citrus, fruit trees, walnut\/pistachio or vineyard.\" },\n        { \"@type\": \"HowToStep\", \"name\": \"Enter the quantity\", \"text\": \"Number of trees or stremmata (1 stremma = 1,000 m\u00b2), litres of spray per tree (default 5 L) and optionally your tank size.\" },\n        { \"@type\": \"HowToStep\", \"name\": \"Choose the base\", \"text\": \"20-micron zeolite (2%) or ZeTe (15 kg in 500 L of water).\" },\n        { \"@type\": \"HowToStep\", \"name\": \"Add boosters\", \"text\": \"EM active microorganisms (1%), EcoPlant\u00ae (1%), 20-micron diatomite (4%, only at small and large fruit).\" },\n        { \"@type\": \"HowToStep\", \"name\": \"Spray order\", \"text\": \"First zeolite or ZeTe together with EcoPlant and EM, then diatomite (recommended order).\" },\n        { \"@type\": \"HowToStep\", \"name\": \"4-spray program\", \"text\": \"Pre-flowering, small fruit, large fruit and post-harvest \u2014 starting from the next spray.\" }\n      ]\n    }\n  ]\n}\n<\/script>\n\n<div class=\"zl zlcalc\" id=\"zsCalc\">\n<div class=\"progress\" aria-hidden=\"true\"><div class=\"progress-bar\" id=\"zsProgress\"><\/div><\/div>\n<div id=\"zsProgressSpacer\" aria-hidden=\"true\" style=\"height:0\"><\/div>\n<div class=\"intro\">\n  <h2>\ud83d\udca8 Zeolite Foliar Spray Program Guide<\/h2>\n  <p>Build your <strong>yearly program of 4 foliar sprays<\/strong> with 20-micron zeolite or ZeTe, EM active microorganisms, EcoPlant\u00ae and diatomite. The guide calculates <strong>quantities per spray, per tank and for the whole year<\/strong> and starts the program from your <strong>next spray<\/strong>, based on today&#8217;s date.<\/p>\n  <div class=\"badges\">\n    <span class=\"badge\">\ud83d\udccb 6-step guide<\/span>\n    <span class=\"badge\">4 sprays \/ year<\/span>\n    <span class=\"badge\">5 crops<\/span>\n    <span class=\"badge\">Dose per tank<\/span>\n    <span class=\"badge\">\ud83d\udcc5 .ics calendar<\/span>\n  <\/div>\n<\/div>\n\n<!-- STEP 1: CROP -->\n<div class=\"step active\" data-step=\"1\">\n  <h3><span class=\"step-num\">1<\/span>Choose your crop<\/h3>\n  <div class=\"options cols-3\">\n    <label class=\"option\"><input type=\"radio\" name=\"zsCrop\" value=\"olive\">\n      <span class=\"opt-title\">\ud83e\uded2 Olive<\/span>\n      <span class=\"opt-desc\">Evergreen \u00b7 4 sprays<\/span>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsCrop\" value=\"citrus\">\n      <span class=\"opt-title\">\ud83c\udf4a Citrus<\/span>\n      <span class=\"opt-desc\">Evergreen \u00b7 4 sprays<\/span>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsCrop\" value=\"fruit\">\n      <span class=\"opt-title\">\ud83c\udf4e Fruit trees<\/span>\n      <span class=\"opt-desc\">Apple, peach, cherry etc.<\/span>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsCrop\" value=\"nuts\">\n      <span class=\"opt-title\">\ud83c\udf30 Walnut \/ Pistachio<\/span>\n      <span class=\"opt-desc\">Walnut, pistachio, almond<\/span>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsCrop\" value=\"vineyard\">\n      <span class=\"opt-title\">\ud83c\udf47 Vineyard<\/span>\n      <span class=\"opt-desc\">Wine &#038; table grapes<\/span>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsCrop\" value=\"other\">\n      <span class=\"opt-title\">\u2795 Other crop<\/span>\n      <span class=\"opt-desc\">Not listed? Ask us<\/span>\n    <\/label>\n  <\/div>\n<\/div>\n\n<!-- STEP 2: QUANTITY -->\n<div class=\"step\" data-step=\"2\">\n  <h3><span class=\"step-num\">2<\/span>Quantity<\/h3>\n  <div id=\"zsQtyBox\">\n    <p style=\"color:var(--muted);font-style:italic;\">Choose a crop in Step 1 first.<\/p>\n  <\/div>\n<\/div>\n\n<!-- STEP 3: BASE -->\n<div class=\"step\" data-step=\"3\">\n  <h3><span class=\"step-num\">3<\/span>Spray base<\/h3>\n  <div class=\"options\">\n    <label class=\"option\"><input type=\"radio\" name=\"zsBase\" value=\"zeolite\">\n      <span class=\"opt-title\">\ud83e\udea8 Zeolite 20\u03bc<\/span>\n      <span class=\"opt-desc\">Greek Thracian, 20-micron powder \u00b7 2% dilution<\/span>\n      <span class=\"opt-info\">Clinoptilolite \u226585% from Thrace. Leaves a thin white film on leaves and fruit. Suitable for organic farming.<\/span>\n      <a class=\"opt-more\" href=\"https:\/\/shop.zeolife.gr\/en\/product\/greek-zeolite-20micron\/\" data-zs-more=\"https:\/\/shop.zeolife.gr\/en\/product\/greek-zeolite-20micron\/\">\u2139\ufe0f More in the eShop \u2192<\/a>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsBase\" value=\"zete\">\n      <span class=\"opt-title\">\ud83e\uddea ZeTe<\/span>\n      <span class=\"opt-desc\">Ready-to-use spray paste \u00b7 15 kg pail in 500 L of water<\/span>\n      <span class=\"opt-info\"><strong>Ingredients:<\/strong> Thracian zeolite (clinoptilolite), enriched with trace elements and minerals (silicon, potassium, calcium, iron, manganese, phosphorus). Leaves a thin protective film on the leaf.<\/span>\n      <a class=\"opt-more\" href=\"https:\/\/shop.zeolife.gr\/en\/product\/zete-15kg\/\" data-zs-more=\"https:\/\/shop.zeolife.gr\/en\/product\/zete-15kg\/\">\u2139\ufe0f More in the eShop \u2192<\/a>\n    <\/label>\n  <\/div>\n<\/div>\n\n<!-- STEP 4: ADD-ONS -->\n<div class=\"step\" data-step=\"4\">\n  <h3><span class=\"step-num\">4<\/span>Boosters (optional)<\/h3>\n  <div class=\"options cols-3\">\n    <label class=\"option\"><input type=\"checkbox\" name=\"zsAdd\" value=\"em\" checked>\n      <span class=\"opt-title\">\ud83e\udda0 EM active microorganisms<\/span>\n      <span class=\"opt-desc\">1% dilution<\/span>\n      <span class=\"opt-info\">Live cultures of beneficial microorganisms for foliage and soil. Spray them the same day you prepare the solution.<\/span>\n      <a class=\"opt-more\" href=\"https:\/\/shop.zeolife.gr\/en\/product\/active-microorganisms-em-active\/\" data-zs-more=\"https:\/\/shop.zeolife.gr\/en\/product\/active-microorganisms-em-active\/\">\u2139\ufe0f More in the eShop \u2192<\/a>\n    <\/label>\n    <label class=\"option\"><input type=\"checkbox\" name=\"zsAdd\" value=\"eco\" checked>\n      <span class=\"opt-title\">\ud83c\udf31 EcoPlant\u00ae<\/span>\n      <span class=\"opt-desc\">1% dilution<\/span>\n      <span class=\"opt-info\"><strong>Ingredients:<\/strong> fermentation liquid with N 2.1% \u00b7 P 2.2% \u00b7 K 1.4% \u00b7 Ca 4.1% \u00b7 Mg 1%, trace elements (Fe, Mn, Zn, B), amino acids and vitamins. Helps the plant absorb nutrients.<\/span>\n      <a class=\"opt-more\" href=\"https:\/\/shop.zeolife.gr\/en\/product\/ecoplant-5-litres-improver\/\" data-zs-more=\"https:\/\/shop.zeolife.gr\/en\/product\/ecoplant-5-litres-improver\/\">\u2139\ufe0f More in the eShop \u2192<\/a>\n    <\/label>\n    <label class=\"option\"><input type=\"checkbox\" name=\"zsAdd\" value=\"diat\" checked>\n      <span class=\"opt-title\">\u26aa Diatomite 20\u03bc<\/span>\n      <span class=\"opt-desc\">4% dilution \u00b7 only at small &#038; large fruit<\/span>\n      <span class=\"opt-info\"><strong>What it does:<\/strong> a natural insecticide. It kills crawling insects and mites mechanically, so they cannot build up resistance.<\/span>\n      <a class=\"opt-more\" href=\"https:\/\/shop.zeolife.gr\/en\/product\/greek-diatomite-20micron-20kg\/\" data-zs-more=\"https:\/\/shop.zeolife.gr\/en\/product\/greek-diatomite-20micron-20kg\/\">\u2139\ufe0f More in the eShop \u2192<\/a>\n    <\/label>\n  <\/div>\n  <p class=\"sublabel\">\ud83d\udca1 All materials can be combined. <strong>Diatomite<\/strong> goes <strong>only into the small- and large-fruit sprays<\/strong>, always <strong>after<\/strong> the zeolite or ZeTe, in a second pass.<\/p>\n<\/div>\n\n<!-- STEP 5: ORDER -->\n<div class=\"step\" data-step=\"5\">\n  <h3><span class=\"step-num\">5<\/span>Spray order<\/h3>\n  <div id=\"zsOrderBox\"><\/div>\n<\/div>\n\n<!-- STEP 6: PHASE NOW -->\n<div class=\"step\" data-step=\"6\">\n  <h3><span class=\"step-num\">6<\/span>Where is your crop right now?<\/h3>\n  <div class=\"options cols-5\" id=\"zsPhaseBox\">\n    <label class=\"option\"><input type=\"radio\" name=\"zsPhase\" value=\"auto\" checked>\n      <span class=\"opt-title\">\ud83d\udcc5 Automatic<\/span>\n      <span class=\"opt-desc\" id=\"zsAutoDesc\">Based on today&#8217;s date<\/span>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsPhase\" value=\"pre\">\n      <span class=\"opt-title\">\ud83c\udf38 Pre-flowering<\/span>\n      <span class=\"opt-desc\">Swollen buds<\/span>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsPhase\" value=\"small\">\n      <span class=\"opt-title\">\ud83d\udfe2 Small fruit<\/span>\n      <span class=\"opt-desc\">Fruit has just set<\/span>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsPhase\" value=\"large\">\n      <span class=\"opt-title\">\ud83d\udfe0 Large fruit<\/span>\n      <span class=\"opt-desc\">Fruit sizing<\/span>\n    <\/label>\n    <label class=\"option\"><input type=\"radio\" name=\"zsPhase\" value=\"post\">\n      <span class=\"opt-title\">\ud83c\udf42 Post-harvest<\/span>\n      <span class=\"opt-desc\">Leaves still on the tree<\/span>\n    <\/label>\n  <\/div>\n  <p class=\"sublabel\">\ud83d\udca1 Dates are indicative for Greece and the Mediterranean. If your area or variety is early or late, pick the phase you actually see in the field.<\/p>\n<\/div>\n\n<!-- STEP (conditional): OTHER CROP -->\n<div class=\"step\" id=\"zsOtherStep\" style=\"display:none\">\n  <button type=\"button\" class=\"btn btn-secondary\" id=\"zsOtherBack\" style=\"padding:.5rem 1.1rem;font-size:.9rem;margin-bottom:1rem\">\u2190 Back to the guide<\/button>\n  <h3><span class=\"step-num\">\u2795<\/span>Tell us about your crop<\/h3>\n  <p style=\"margin:.2rem 0 1rem;color:var(--muted)\">Tell us which crop you grow and we will build you a <strong>free<\/strong> spray program.<\/p>\n  <label class=\"qty-label\" for=\"zsOtherCrop\">Which crop?<\/label>\n  <input type=\"text\" id=\"zsOtherCrop\" class=\"qty-input\" placeholder=\"e.g. Kiwi, Pomegranate, Avocado\u2026\" autocomplete=\"off\">\n  <div class=\"wholesale-cta\" style=\"margin-top:1.25rem\">\n    <strong>\ud83d\udce9 Send us your request<\/strong>\n    <div class=\"wholesale-btns four\">\n      <a id=\"zsOtherWhatsapp\" href=\"https:\/\/wa.me\/306985838343\" target=\"_blank\" rel=\"noopener\">\ud83d\udcac WhatsApp<\/a>\n      <a href=\"viber:\/\/chat?number=306985838343\">\ud83d\udfe3 Viber<\/a>\n      <a id=\"zsOtherEmail\" href=\"mailto:info@zeolife.gr\">\u2709\ufe0f Email<\/a>\n      <a href=\"tel:+302311295520\">\ud83d\udcde +30 2311 29 55 20<\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"actions\" style=\"justify-content:center\">\n  <button type=\"button\" class=\"btn\" id=\"zsCalculate\" disabled=\"\">\ud83d\udccb Build my program<\/button>\n  <button type=\"button\" class=\"btn btn-secondary\" id=\"zsReset\">\ud83d\udd04 Reset<\/button>\n<\/div>\n\n<!-- RESULT -->\n<div class=\"result\" id=\"zsResult\">\n  <div class=\"print-only\" style=\"text-align:center;margin-bottom:1rem;padding-bottom:1rem;border-bottom:2px solid #2a9ca0;\">\n    <img decoding=\"async\" src=\"https:\/\/zeolife.gr\/wp-content\/uploads\/\/2019\/11\/logo-zeolife-hor.svg\" alt=\"Zeolife.gr\" data-no-lazy=\"1\" class=\"skip-lazy\" style=\"max-width:280px;height:auto;margin:0 auto 0.5rem;display:block;\">\n    <h2 style=\"color:#26231e;margin:0;font-size:1.2rem;\">Zeolite Foliar Spray Program<\/h2>\n    <p style=\"margin:0.3rem 0 0;font-size:0.9rem;color:#6b6a64;\"><a href=\"https:\/\/zeolife.gr\/en\/\">www.zeolife.gr<\/a> \u00b7 \u260e +30 2311 29 55 20 \u00b7 \u2709 info@zeolife.gr<\/p>\n    <p style=\"margin:0.3rem 0 0;font-size:0.8rem;color:#6b6a64;font-style:italic;\">Calculated on: <span id=\"zsPrintDate\"><\/span><\/p>\n  <\/div>\n  <h3>Your spray program<\/h3>\n  <div id=\"zsResultBody\"><\/div>\n<\/div>\n<\/div>\n<script>\n(function(){\n  \/\/ ===================== DATA =====================\n  \/\/ Phases: [month, day] start\/end (indicative for Greece). If end is before start, the window runs into the next year.\n  var crops = {\n    olive:    { name: 'Olive', icon: '\ud83e\uded2', unit: 'trees', unit1: 'tree', perStremma: 20, liters: 5, evergreen: true,\n                win: { pre: [[4,1],[5,10]], small: [[6,1],[6,30]], large: [[8,1],[9,30]], post: [[11,1],[1,31]] } },\n    citrus:   { name: 'Citrus', icon: '\ud83c\udf4a', unit: 'trees', unit1: 'tree', perStremma: 40, liters: 5, evergreen: true,\n                win: { pre: [[3,1],[3,31]], small: [[5,1],[6,30]], large: [[8,1],[9,30]], post: [[1,1],[2,28]] } },\n    fruit:    { name: 'Fruit trees', icon: '\ud83c\udf4e', unit: 'trees', unit1: 'tree', perStremma: 50, liters: 5, evergreen: false,\n                win: { pre: [[3,1],[4,15]], small: [[5,1],[5,31]], large: [[6,1],[7,31]], post: [[8,1],[10,31]] } },\n    nuts:     { name: 'Walnut \/ Pistachio', icon: '\ud83c\udf30', unit: 'trees', unit1: 'tree', perStremma: 15, liters: 5, evergreen: false,\n                win: { pre: [[4,1],[4,30]], small: [[5,1],[6,30]], large: [[7,1],[8,31]], post: [[9,1],[10,31]] } },\n    vineyard: { name: 'Vineyard', icon: '\ud83c\udf47', unit: 'vines', unit1: 'vine', perStremma: 250, liters: 0.4, evergreen: false,\n                win: { pre: [[5,1],[5,31]], small: [[6,1],[6,30]], large: [[7,1],[7,31]], post: [[9,1],[10,31]] } }\n  };\n  var stageOrder = ['pre', 'small', 'large', 'post'];\n  var stageInfo = {\n    pre:   { name: 'Pre-flowering', icon: '\ud83c\udf38',\n             tip: 'Spray when the buds have swollen but <strong>before the flowers open<\/strong>. \u26a0\ufe0f Never during full bloom, so pollination is not disturbed.' },\n    small: { name: 'Small fruit', icon: '\ud83d\udfe2',\n             tip: 'As soon as <strong>the fruit has set<\/strong>. The thin zeolite film protects the young fruit and the foliage.' },\n    large: { name: 'Large fruit', icon: '\ud83d\udfe0',\n             tip: 'During <strong>fruit sizing<\/strong>, before the big heatwaves. The white film reduces heat stress and sunburn.' },\n    post:  { name: 'Post-harvest', icon: '\ud83c\udf42',\n             tip: 'Right after the harvest, <strong>while the tree still has leaves<\/strong>. It strengthens the foliage and helps the tree recover before winter.' }\n  };\n  var monthsShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n  \/\/ Dilutions: quantity per litre of water\n  var RATE = { zeolite: 0.02, zete: 15 \/ 500, em: 0.01, eco: 0.01, diat: 0.04 };\n  \/\/ eShop products \u2014 EN IDs (prices only used to pick the cheapest pack combination)\n  var CART_URL = 'https:\/\/shop.zeolife.gr\/en\/cart\/';\n  var LANG = 'en';\n  var shop = {\n    zeolite: { name: 'Greek Thracian zeolite 20\u03bc', unit: 'kg', icon: '\ud83e\udea8',\n               packs: [ { id: 31731, size: 25, price: 29.90, label: '25 kg', url: 'https:\/\/shop.zeolife.gr\/en\/product\/greek-zeolite-20micron\/' },\n                        { id: 39132, size: 3, price: 13.50, label: '3 kg', url: 'https:\/\/shop.zeolife.gr\/en\/product\/greek-thracian-zeolite-up-to-0-02-mm-20-microns-ultra-fine-powder-3-kg\/' } ] },\n    zete:    { name: 'ZeTe \u2014 spray paste', unit: 'kg', icon: '\ud83e\uddea',\n               packs: [ { id: 35825, size: 15, price: 50.00, label: '15 kg pail', url: 'https:\/\/shop.zeolife.gr\/en\/product\/zete-15kg\/' } ] },\n    em:      { name: 'EM-Active \u2014 Active microorganisms', unit: 'L', icon: '\ud83e\udda0',\n               packs: [ { id: 33225, size: 25, price: 125.00, label: '25 litres', url: 'https:\/\/shop.zeolife.gr\/en\/product\/active-microorganisms-em-active\/' },\n                        { id: 38668, size: 5, price: 36.00, label: '5 litres', url: 'https:\/\/shop.zeolife.gr\/en\/product\/active-microorganisms-em-active\/' },\n                        { id: 38397, size: 1, price: 10.00, label: '1 litre', url: 'https:\/\/shop.zeolife.gr\/en\/product\/active-microorganisms-em-active\/' } ] },\n    eco:     { name: 'EcoPlant\u00ae \u2014 Organic soil improver', unit: 'L', icon: '\ud83c\udf31',\n               packs: [ { id: 41789, size: 20, price: 219.00, label: '20 litres', url: 'https:\/\/shop.zeolife.gr\/en\/product\/ecoplant-20-litres-soil-improver\/' },\n                        { id: 41787, size: 10, price: 115.00, label: '10 litres', url: 'https:\/\/shop.zeolife.gr\/en\/product\/ecoplant-10-litres-soil-improver\/' },\n                        { id: 40786, size: 5, price: 65.00, label: '5 litres', url: 'https:\/\/shop.zeolife.gr\/en\/product\/ecoplant-5-litres-improver\/' },\n                        { id: 36938, size: 1, price: 14.98, label: '1 litre', url: 'https:\/\/shop.zeolife.gr\/en\/product\/ecoplant-1-liter-improver\/' } ] },\n    diat:    { name: 'Greek diatomite 20\u03bc', unit: 'kg', icon: '\u26aa',\n               packs: [ { id: 33667, size: 20, price: 42.90, label: '20 kg', url: 'https:\/\/shop.zeolife.gr\/en\/product\/greek-diatomite-20micron-20kg\/' },\n                        { id: 33666, size: 0.5, price: 5.90, label: '500 g', url: 'https:\/\/shop.zeolife.gr\/en\/product\/greek-diatomite-20micron-500gr\/' } ] }\n  };\n  var matLabel = { zeolite: 'Zeolite 20\u03bc', zete: 'ZeTe', em: 'EM', eco: 'EcoPlant\u00ae', diat: 'Diatomite 20\u03bc' };\n  var matRateTxt = { zeolite: '2%', zete: '15 kg \/ 500 L', em: '1%', eco: '1%', diat: '4%' };\n\n  \/\/ Spray orders (when diatomite is used). p1 = what goes in the 1st pass together with the base.\n  var schemes = [\n    { p1: ['eco', 'em'] },\n    { p1: ['em'] },\n    { p1: [] },\n    { p1: ['eco'] }\n  ];\n\n  \/\/ ===================== ELEMENTS =====================\n  var calc = document.getElementById('zsCalc');\n  var steps = calc.querySelectorAll('.step:not(#zsOtherStep)');\n  var otherStep = document.getElementById('zsOtherStep');\n  var actionsRow = calc.querySelector('.actions');\n  var progressBar = document.getElementById('zsProgress');\n  var calcBtn = document.getElementById('zsCalculate');\n  var resetBtn = document.getElementById('zsReset');\n  var resultBox = document.getElementById('zsResult');\n  var resultBody = document.getElementById('zsResultBody');\n  var qtyBox = document.getElementById('zsQtyBox');\n  var orderBox = document.getElementById('zsOrderBox');\n  var lastPlan = null;\n\n  \/\/ ===================== HELPERS =====================\n  function getChecked(name) {\n    var el = calc.querySelector('input[name=\"' + name + '\"]:checked');\n    return el ? el.value : null;\n  }\n  function getAdds() {\n    var out = [];\n    calc.querySelectorAll('input[name=\"zsAdd\"]:checked').forEach(function(c) { out.push(c.value); });\n    return out;\n  }\n  function num(id) {\n    var el = document.getElementById(id);\n    if (!el) return 0;\n    var v = Number(String(el.value).replace(',', '.'));\n    if (!isFinite(v)) return 0;\n    return v;\n  }\n  function fmt(n, dec) {\n    var d = (dec === undefined) ? 1 : dec;\n    var r = Math.round(n * Math.pow(10, d)) \/ Math.pow(10, d);\n    return r.toLocaleString('en-GB', { maximumFractionDigits: d });\n  }\n  function fmtAmt(n, unit) {\n    if (unit === 'kg') {\n      if (1 > n) { return fmt(n * 1000, 0) + ' g'; }\n      return fmt(n, 1) + ' kg';\n    }\n    if (1 > n) { return fmt(n * 1000, 0) + ' ml'; }\n    return fmt(n, 1) + ' L';\n  }\n  function inList(arr, v) { return arr.indexOf(v) !== -1; }\n\n  \/\/ Cheapest pack combination (minimum cost, covers \u2265 need)\n  function bestPacks(need, packs) {\n    var best = null;\n    function rec(i, rem, counts, cost) {\n      if (i === packs.length) {\n        if (rem > 0.0001) return;\n        if (best === null) { best = { counts: counts.slice(), cost: cost }; return; }\n        if (best.cost > cost) { best = { counts: counts.slice(), cost: cost }; }\n        return;\n      }\n      var size = packs[i].size;\n      var hi = Math.ceil(Math.max(rem, 0) \/ size);\n      var lo = Math.max(0, Math.floor(Math.max(rem, 0) \/ size) - 1);\n      if (i === packs.length - 1) { lo = hi; }\n      for (var c = lo; hi >= c; c++) {\n        counts.push(c);\n        rec(i + 1, rem - c * size, counts, cost + c * packs[i].price);\n        counts.pop();\n      }\n    }\n    rec(0, need, [], 0);\n    return best;\n  }\n\n  \/\/ ===================== DATES =====================\n  function mkDate(y, md) { return new Date(y, md[0] - 1, md[1]); }\n  \/\/ Returns the phase window that ENDS after \"from\" (current or next one).\n  function windowAfter(w, from) {\n    for (var y = from.getFullYear() - 1; from.getFullYear() + 2 >= y; y++) {\n      var s = mkDate(y, w[0]);\n      var e = mkDate(y, w[1]);\n      if (s > e) { e = mkDate(y + 1, w[1]); }\n      if (e >= from) { return { start: s, end: e }; }\n    }\n    return null;\n  }\n  \/\/ The program: 4 sprays, starting from phase \"first\" (or automatically).\n  function buildSchedule(cropKey, phase, today) {\n    var w = crops[cropKey].win;\n    var startIdx = 0;\n    var firstWin = null;\n    if (phase === 'auto') {\n      var bestStart = null;\n      for (var i = 0; i !== stageOrder.length; i++) {\n        var win = windowAfter(w[stageOrder[i]], today);\n        var key = win.start > today ? win.start : today;\n        if (bestStart === null) { bestStart = key; startIdx = i; firstWin = win; }\n        else if (bestStart > key) { bestStart = key; startIdx = i; firstWin = win; }\n      }\n    } else {\n      startIdx = stageOrder.indexOf(phase);\n      firstWin = windowAfter(w[phase], today);\n      \/\/ If the user says \"I am in this phase now\", the spray is now.\n      firstWin = { start: today, end: today, now: true, manual: true };\n    }\n    var out = [];\n    var cursor = today;\n    for (var k = 0; k !== 4; k++) {\n      var st = stageOrder[(startIdx + k) % 4];\n      var wi;\n      if (k === 0) { wi = firstWin; }\n      else {\n        wi = windowAfter(w[st], cursor);\n        if (cursor > wi.start) {\n          \/\/ the window already started before the previous one \u2014 move to next year\n          wi = windowAfter(w[st], new Date(wi.end.getTime() + 86400000));\n        }\n      }\n      var isNow = false;\n      if (k === 0) {\n        if (wi.now) { isNow = true; }\n        else if (today >= wi.start) { isNow = true; }\n      }\n      out.push({ stage: st, start: wi.start, end: wi.end, now: isNow, manual: (k === 0) ? (wi.manual === true) : false });\n      cursor = new Date(wi.end.getTime() + 86400000);\n    }\n    return out;\n  }\n  function rangeLabel(s, e) {\n    var a = monthsShort[s.getMonth()];\n    var b = monthsShort[e.getMonth()];\n    if (s.getFullYear() === e.getFullYear()) {\n      if (a === b) return a + ' ' + s.getFullYear();\n      return a + ' \u2013 ' + b + ' ' + e.getFullYear();\n    }\n    return a + ' ' + s.getFullYear() + ' \u2013 ' + b + ' ' + e.getFullYear();\n  }\n\n  \/\/ ===================== STEP 2 =====================\n  function renderQty(cropKey) {\n    var c = crops[cropKey];\n    var h = '';\n    h += '<div class=\"options cols-2\" style=\"margin-bottom:.75rem\">';\n    h += '<label class=\"option\"><input type=\"radio\" name=\"zsQtyMode\" value=\"trees\" checked><span class=\"opt-title\">\ud83c\udf33 Number of ' + c.unit + '<\/span><span class=\"opt-desc\">I know how many ' + c.unit + ' I have<\/span><\/label>';\n    h += '<label class=\"option\"><input type=\"radio\" name=\"zsQtyMode\" value=\"stremma\"><span class=\"opt-title\">\ud83d\udcd0 Stremmata<\/span><span class=\"opt-desc\">1 stremma = 1,000 m\u00b2 \u00b7 uses planting density<\/span><\/label>';\n    h += '<\/div>';\n    h += '<div id=\"zsTreesRow\"><label class=\"qty-label\" for=\"zsTrees\">How many ' + c.unit + '?<\/label>';\n    h += '<input type=\"number\" id=\"zsTrees\" class=\"qty-input\" min=\"1\" step=\"1\" data-zl-step=\"10\" data-unit=\"' + c.unit + '\" placeholder=\"0\"><\/div>';\n    h += '<div id=\"zsStremmaRow\" class=\"hidden\"><div class=\"qty-row\">';\n    h += '<div><label class=\"qty-label\" for=\"zsStremma\">How many stremmata?<\/label><input type=\"number\" id=\"zsStremma\" class=\"qty-input\" min=\"0\" step=\"0.1\" data-zl-step=\"1\" data-unit=\"str.\" placeholder=\"0\"><\/div>';\n    h += '<div><label class=\"qty-label\" for=\"zsDensity\">' + c.unit.charAt(0).toUpperCase() + c.unit.slice(1) + ' per stremma<\/label><input type=\"number\" id=\"zsDensity\" class=\"qty-input\" min=\"1\" step=\"1\" data-zl-step=\"' + (c.perStremma > 100 ? 10 : 5) + '\" data-unit=\"\/str.\" value=\"' + c.perStremma + '\"><\/div>';\n    h += '<\/div><\/div>';\n    h += '<div class=\"qty-row\" style=\"margin-top:.75rem\">';\n    h += '<div><label class=\"qty-label\" for=\"zsLiters\">Litres of spray per ' + c.unit1 + ' (each pass)<\/label><input type=\"number\" id=\"zsLiters\" class=\"qty-input\" min=\"0.1\" step=\"0.1\" data-zl-step=\"' + (1 > c.liters ? 0.1 : 0.5) + '\" data-unit=\"L\" value=\"' + c.liters + '\"><\/div>';\n    h += '<div><label class=\"qty-label\" for=\"zsTank\">Sprayer tank (litres) <span style=\"font-weight:400;color:var(--muted)\">\u2014 optional<\/span><\/label><input type=\"number\" id=\"zsTank\" class=\"qty-input\" min=\"0\" step=\"10\" data-zl-step=\"100\" data-unit=\"L\" placeholder=\"0\"><\/div>';\n    h += '<\/div>';\n    if (cropKey === 'vineyard') {\n      h += '<p class=\"sublabel\">\ud83d\udca1 For vines we suggest about <strong>0.4 L per vine<\/strong> (\u2248 100 L per stremma). Spray until the foliage is evenly wet but not dripping.<\/p>';\n    } else {\n      h += '<p class=\"sublabel\">\ud83d\udca1 Spray <strong>at least 5 L per tree<\/strong>, until all the foliage is wet. Increase the litres for very large trees.<\/p>';\n    }\n    qtyBox.innerHTML = h;\n    qtyBox.querySelectorAll('input').forEach(function(inp) {\n      inp.addEventListener('input', updateProgress);\n      inp.addEventListener('change', function(e) {\n        if (e.target.name === 'zsQtyMode') {\n          var st = e.target.value === 'stremma';\n          document.getElementById('zsStremmaRow').classList.toggle('hidden', !st);\n          document.getElementById('zsTreesRow').classList.toggle('hidden', st);\n        }\n        updateProgress();\n      });\n    });\n  }\n  function treesCount() {\n    var mode = getChecked('zsQtyMode');\n    if (mode === 'stremma') { return Math.round(num('zsStremma') * num('zsDensity')); }\n    return Math.round(num('zsTrees'));\n  }\n\n  \/\/ ===================== STEP 5: ORDER =====================\n  function passesFor(p1sel, adds) {\n    var p1 = [], p2 = [];\n    adds.forEach(function(a) {\n      if (a === 'diat') return;\n      if (inList(p1sel, a)) { p1.push(a); } else { p2.push(a); }\n    });\n    return { p1: p1, p2: p2 };\n  }\n  function passText(base, list, first) {\n    var parts = [];\n    if (first) { parts.push(base === 'zete' ? 'ZeTe' : 'Zeolite'); }\n    else { parts.push('Diatomite'); }\n    list.forEach(function(a) { parts.push(matLabel[a]); });\n    return parts.join(' + ');\n  }\n  function renderOrder() {\n    var adds = getAdds();\n    var base = getChecked('zsBase') || 'zeolite';\n    var prev = getChecked('zsOrder');\n    var h = '';\n    if (!inList(adds, 'diat')) {\n      var all = passesFor(['em', 'eco'], adds);\n      h += '<div class=\"info-box\"><strong>\u2705 One pass<\/strong>Without diatomite, everything goes <strong>together in the same tank<\/strong>: ' + passText(base, all.p1, true) + '.<\/div>';\n      orderBox.innerHTML = h;\n      return;\n    }\n    var seen = {};\n    var opts = [];\n    schemes.forEach(function(sc) {\n      var ps = passesFor(sc.p1, adds);\n      var key = ps.p1.join(',') + '|' + ps.p2.join(',');\n      if (seen[key]) return;\n      seen[key] = true;\n      opts.push(ps);\n    });\n    var letters = ['A', 'B', 'C', 'D'];\n    h += '<div class=\"options\">';\n    opts.forEach(function(ps, i) {\n      var val = String(i);\n      var checked = (prev === null) ? (i === 0) : (prev === val);\n      h += '<label class=\"option\"><input type=\"radio\" name=\"zsOrder\" value=\"' + val + '\"' + (checked ? ' checked' : '') + '>';\n      h += '<span class=\"opt-title\">' + letters[i] + (i === 0 ? ' \u00b7 \u2b50 Recommended' : '') + '<\/span>';\n      h += '<span class=\"opt-desc\">\u2460 ' + passText(base, ps.p1, true) + ' \u2192 \u2461 ' + passText(base, ps.p2, false) + '<\/span><\/label>';\n    });\n    h += '<\/div>';\n    h += '<p class=\"sublabel\">The order applies to the <strong>small- and large-fruit<\/strong> sprays. Pre-flowering and post-harvest you spray in <strong>one pass<\/strong>, without diatomite. Pass \u2461 is sprayed <strong>once \u2460 has dried<\/strong> (same or next day). Each pass uses its own litres per ' + (crops[getChecked('zsCrop')] ? crops[getChecked('zsCrop')].unit1 : 'tree') + '.<\/p>';\n    orderBox.innerHTML = h;\n    orderBox.__opts = opts;\n    orderBox.querySelectorAll('input').forEach(function(r) { r.addEventListener('change', updateProgress); });\n    if (prev !== null) {\n      if (!orderBox.querySelector('input:checked')) {\n        var f = orderBox.querySelector('input');\n        if (f) { f.checked = true; }\n      }\n    }\n  }\n  function currentPasses() {\n    var adds = getAdds();\n    if (!inList(adds, 'diat')) {\n      return [passesFor(['em', 'eco'], adds).p1];\n    }\n    var opts = orderBox.__opts || [];\n    var idx = Number(getChecked('zsOrder') || 0);\n    var ps = opts[idx] || opts[0];\n    return [ps.p1, ps.p2];\n  }\n\n  \/\/ ===================== AUTOMATIC PHASE \u2014 DESCRIPTION =====================\n  function updateAutoDesc() {\n    var cropKey = getChecked('zsCrop');\n    var el = document.getElementById('zsAutoDesc');\n    if (!el) return;\n    if (!crops[cropKey]) { el.textContent = 'Based on today\\'s date'; return; }\n    var sch = buildSchedule(cropKey, 'auto', todayDate());\n    var f = sch[0];\n    el.textContent = 'Next: ' + stageName(cropKey, f.stage) + ' (' + rangeLabel(f.now ? todayDate() : f.start, f.end) + ')';\n  }\n  function stageName(cropKey, st) {\n    if (st === 'post') { if (cropKey === 'vineyard') return 'After grape harvest'; }\n    return stageInfo[st].name;\n  }\n  function todayDate() { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), d.getDate()); }\n\n  \/\/ ===================== PROGRESS =====================\n  function qtyValid() {\n    if (!crops[getChecked('zsCrop')]) return false;\n    if (0 >= treesCount()) return false;\n    if (0 >= num('zsLiters')) return false;\n    return true;\n  }\n  function updateProgress() {\n    var crop = getChecked('zsCrop');\n    if (crop === 'other') { return; }\n    var filled = 0;\n    if (crop) filled++;\n    if (qtyValid()) filled++;\n    if (getChecked('zsBase')) filled++;\n    if (getChecked('zsBase')) filled++;   \/\/ step 4: optional\n    if (getChecked('zsBase')) filled++;   \/\/ step 5: always has a default\n    if (getChecked('zsPhase')) { if (getChecked('zsBase')) filled++; }\n    progressBar.style.width = (filled \/ 6 * 100) + '%';\n    var activeIdx = 0;\n    if (crop) activeIdx = 1;\n    if (qtyValid()) activeIdx = 2;\n    if (getChecked('zsBase')) activeIdx = 5;\n    steps.forEach(function(s, i) {\n      var act = (i === activeIdx) || (i === activeIdx - 1);\n      if (activeIdx === 5) { act = (i >= 2); }\n      s.classList.toggle('active', act);\n    });\n    var ok = false;\n    if (crop) { if (qtyValid()) { if (getChecked('zsBase')) { ok = true; } } }\n    calcBtn.disabled = !ok;\n  }\n\n  \/\/ ===================== \"OTHER CROP\" =====================\n  function updateOtherLinks() {\n    var v = (document.getElementById('zsOtherCrop').value || '').trim();\n    var msg = 'Hello! I would like a zeolite spray program for my crop: ' + (v || '[crop]');\n    document.getElementById('zsOtherWhatsapp').href = 'https:\/\/wa.me\/306985838343?text=' + encodeURIComponent(msg);\n    document.getElementById('zsOtherEmail').href = 'mailto:info@zeolife.gr?subject=' + encodeURIComponent('Spray program' + (v ? ' \u2013 ' + v : '')) + '&body=' + encodeURIComponent(msg);\n  }\n  function enterOther() {\n    steps.forEach(function(s) { s.style.display = 'none'; });\n    actionsRow.style.display = 'none';\n    resultBox.classList.remove('show');\n    otherStep.style.display = '';\n    otherStep.classList.add('active');\n    progressBar.style.width = '100%';\n    updateOtherLinks();\n    otherStep.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  }\n  function exitOther() {\n    steps.forEach(function(s) { s.style.display = ''; });\n    actionsRow.style.display = '';\n    otherStep.style.display = 'none';\n  }\n\n  \/\/ ===================== CALCULATION =====================\n  function calculate(noScroll) {\n    var cropKey = getChecked('zsCrop');\n    var c = crops[cropKey];\n    var base = getChecked('zsBase');\n    var adds = getAdds();\n    var phase = getChecked('zsPhase') || 'auto';\n    var N = treesCount();\n    var Lp = num('zsLiters');\n    var tank = num('zsTank');\n    var W = N * Lp;                       \/\/ litres of water per pass\n    var passes = currentPasses();\n    var today = todayDate();\n    var sched = buildSchedule(cropKey, phase, today);\n\n    \/\/ Recipes: diatomite goes ONLY into the \"small fruit\" and \"large fruit\" sprays.\n    var hasDiat = inList(adds, 'diat');\n    function mkRecipe(pss) {\n      var out = [];\n      pss.forEach(function(list, i) {\n        var mats = [];\n        if (i === 0) { mats.push(base); } else { mats.push('diat'); }\n        list.forEach(function(a) { mats.push(a); });\n        out.push(mats);\n      });\n      return out;\n    }\n    var recDiat = mkRecipe(passes);\n    var noDiatList = [];\n    adds.forEach(function(a) { if (a !== 'diat') { noDiatList.push(a); } });\n    var recPlain = mkRecipe([noDiatList]);\n    function recipeFor(stage) {\n      if (hasDiat) { if (stage === 'small' || stage === 'large') { return recDiat; } }\n      return recPlain;\n    }\n    \/\/ Year totals (sum of the 4 sprays)\n    var yearTot = {};\n    var sprayCount = {};\n    sched.forEach(function(sx) {\n      var seen = {};\n      recipeFor(sx.stage).forEach(function(mats) {\n        mats.forEach(function(m) {\n          yearTot[m] = (yearTot[m] || 0) + W * RATE[m];\n          if (!seen[m]) { seen[m] = 1; sprayCount[m] = (sprayCount[m] || 0) + 1; }\n        });\n      });\n    });\n\n    var h = '';\n    \/\/ --- Summary ---\n    h += '<div class=\"summary-grid\">';\n    h += '<div class=\"summary-card\"><div class=\"label\">' + c.icon + ' Crop<\/div><div class=\"value\">' + fmt(N, 0) + ' ' + c.unit + '<\/div><div class=\"sub\">' + c.name + ' \u00b7 ' + fmt(Lp, 1) + ' L per ' + c.unit1 + '<\/div><\/div>';\n    if (recDiat.length === 2) {\n      h += '<div class=\"summary-card\"><div class=\"label\">\ud83d\udca7 Water per spray<\/div><div class=\"value\">' + fmt(W, 0) + ' \u2013 ' + fmt(W * 2, 0) + ' L<\/div><div class=\"sub\">' + fmt(W, 0) + ' L in 1 pass \u00b7 ' + fmt(W * 2, 0) + ' L at small & large fruit (2 passes)<\/div><\/div>';\n    } else {\n      h += '<div class=\"summary-card\"><div class=\"label\">\ud83d\udca7 Water per spray<\/div><div class=\"value\">' + fmt(W, 0) + ' L<\/div><div class=\"sub\">1 pass \u00b7 4 sprays a year<\/div><\/div>';\n    }\n    h += '<\/div>';\n\n    \/\/ --- Calendar ---\n    h += '<h4>\ud83d\udcc5 Your program \u2014 4 sprays<\/h4>';\n    h += '<div class=\"timeline\" style=\"grid-template-columns:repeat(4,1fr);\">';\n    sched.forEach(function(s, i) {\n      h += '<div class=\"year-card' + (i === 0 ? ' now' : '') + '\">';\n      h += '<div class=\"year-label\">' + (i + 1) + '. ' + stageInfo[s.stage].icon + ' ' + stageName(cropKey, s.stage) + '<\/div>';\n      h += '<div class=\"year-kg\" style=\"font-size:1.05rem\">' + (s.now ? 'Now' : rangeLabel(s.start, s.end)) + '<\/div>';\n      h += '<div class=\"year-sacks\">' + (s.now ? (s.manual ? 'as you told us' : 'until ' + monthsShort[s.end.getMonth()] + ' ' + s.end.getFullYear()) : '') + '<\/div>';\n      h += '<div class=\"year-percent\">' + (i === 0 ? '\u25b6 NEXT SPRAY' : 'Spray ' + (i + 1)) + (recipeFor(s.stage).length === 2 ? ' \u00b7 + diatomite' : '') + '<\/div>';\n      h += '<\/div>';\n    });\n    h += '<\/div>';\n    if (sched[0].stage === 'post') {\n      if (!sched[0].now) {\n        h += '<p class=\"sublabel\">\ud83c\udf42 Your next spray is <strong>' + (cropKey === 'vineyard' ? 'right after the grape harvest' : 'right after the harvest') + '<\/strong>, while ' + (cropKey === 'vineyard' ? 'the vines' : 'the tree') + ' still ' + (cropKey === 'vineyard' ? 'have' : 'has') + ' leaves.<\/p>';\n      }\n    }\n\n    \/\/ --- Recipes ---\n    function stagesUsing(rec) {\n      var names = [];\n      sched.forEach(function(sx) {\n        if (recipeFor(sx.stage) === rec) {\n          var nm = stageName(cropKey, sx.stage);\n          if (names.indexOf(nm) === -1) { names.push(nm); }\n        }\n      });\n      return names.join(' \u00b7 ');\n    }\n    function renderRecipe(rec) {\n      var out = '';\n      rec.forEach(function(mats, pi) {\n        out += '<table class=\"dose-table\">';\n        out += '<tr><th colspan=\"' + (tank > 0 ? 5 : 4) + '\">' + (rec.length === 2 ? (pi === 0 ? '\u2460 First pass' : '\u2461 Second pass \u2014 once \u2460 has dried') : '\u2460 One pass') + ' \u00b7 ' + fmt(W, 0) + ' L of water<\/th><\/tr>';\n        out += '<tr><th>Material<\/th><th>Dilution<\/th><th>Per 100 L<\/th>' + (tank > 0 ? '<th>Per ' + fmt(tank, 0) + ' L tank<\/th>' : '') + '<th>Pass total<\/th><\/tr>';\n        mats.forEach(function(m) {\n          var u = shop[m].unit;\n          out += '<tr><td>' + shop[m].icon + ' ' + matLabel[m] + '<\/td><td>' + matRateTxt[m] + '<\/td><td>' + fmtAmt(100 * RATE[m], u) + '<\/td>';\n          if (tank > 0) { out += '<td>' + fmtAmt(tank * RATE[m], u) + '<\/td>'; }\n          out += '<td><strong>' + fmtAmt(W * RATE[m], u) + '<\/strong><\/td><\/tr>';\n        });\n        out += '<\/table>';\n      });\n      if (tank > 0) {\n        var fills = Math.ceil(W \/ tank);\n        var each = rec.length === 2 ? ' for each pass' : '';\n        if (fills === 1) {\n          if (tank > W) { out += '<p class=\"sublabel\">\ud83d\ude9c <strong>One fill' + each + '<\/strong> is enough: use only ' + fmt(W, 0) + ' L of water with the amounts in the \"Pass total\" column.<\/p>'; }\n          else { out += '<p class=\"sublabel\">\ud83d\ude9c Exactly <strong>one fill<\/strong> of your ' + fmt(tank, 0) + ' L tank' + each + '.<\/p>'; }\n        } else {\n          out += '<p class=\"sublabel\">\ud83d\ude9c ' + fmt(W, 0) + ' L = <strong>' + fills + ' fills<\/strong> of your ' + fmt(tank, 0) + ' L tank' + each + (W % tank ? ' (the last one partial \u2014 keep the same ratio)' : '') + '.<\/p>';\n        }\n      }\n      return out;\n    }\n    if (hasDiat) {\n      h += '<h4>\ud83e\uddea Recipe: ' + stagesUsing(recPlain) + ' (without diatomite)<\/h4>';\n      h += renderRecipe(recPlain);\n      h += '<h4>\ud83e\uddea Recipe: ' + stagesUsing(recDiat) + ' (with diatomite)<\/h4>';\n      h += renderRecipe(recDiat);\n    } else {\n      h += '<h4>\ud83e\uddea Spray recipe (same for every spray)<\/h4>';\n      h += renderRecipe(recPlain);\n    }\n\n    \/\/ --- Mixing instructions ---\n    h += '<h4>\ud83e\udd63 Mixing order in the tank<\/h4>';\n    h += '<div class=\"info-box\"><strong>For each pass<\/strong><ol style=\"margin:.3rem 0 0 1.1rem;padding:0;line-height:1.7\">';\n    h += '<li>Fill the tank with <strong>half the water<\/strong> and switch on the agitator.<\/li>';\n    h += '<li>First mix the ' + (base === 'zete' ? '<strong>ZeTe<\/strong>' : '<strong>20\u03bc zeolite<\/strong>') + ' (or, in \u2461, the <strong>diatomite<\/strong>) with water in a bucket until it becomes a smooth slurry, then pour it into the tank.<\/li>';\n    h += '<li>Add <strong>EcoPlant\u00ae<\/strong> (if it is in this pass).<\/li>';\n    h += '<li>Add the <strong>EM active microorganisms<\/strong> last (if they are in this pass).<\/li>';\n    h += '<li>Top up with water and spray with <strong>continuous agitation<\/strong>, until all the foliage is evenly wet.<\/li>';\n    h += '<\/ol><\/div>';\n\n    \/\/ --- Per phase ---\n    h += '<h4>\ud83d\uddd3\ufe0f What to watch at each spray<\/h4>';\n    var tipsPlain = [];\n    sched.forEach(function(s, i) {\n      var tip = stageInfo[s.stage].tip;\n      if (s.stage === 'post') {\n        if (c.evergreen) { tip = 'Right after the harvest. In evergreens such as ' + c.name.toLowerCase() + ', this is one of the most important sprays: it strengthens the foliage that will carry the tree through winter and helps it recover.'; }\n        if (cropKey === 'vineyard') { tip = 'Right after the grape harvest, <strong>while the vines still have leaves<\/strong>. It strengthens the foliage and helps the vines recover before winter.'; }\n      }\n      tipsPlain[i] = tip.replace(\/<[^>]*>\/g, '');\n      var rx = recipeFor(s.stage);\n      tip += '<br><em>You spray: ' + rx.map(function(mats, pi) { return (rx.length === 2 ? (pi === 0 ? '\u2460 ' : '\u2461 ') : '') + mats.map(function(m) { return matLabel[m]; }).join(' + '); }).join(' \u2192 ') + '<\/em>';\n      h += '<div class=\"info-box\"' + (i === 0 ? ' style=\"background:#eef7e6;border-color:#d6e8c3;\"' : '') + '><strong>' + (i + 1) + '. ' + stageInfo[s.stage].icon + ' ' + stageName(cropKey, s.stage) + ' \u2014 ' + (s.now ? (s.manual ? 'now' : 'now (until ' + monthsShort[s.end.getMonth()] + ' ' + s.end.getFullYear() + ')') : rangeLabel(s.start, s.end)) + '<\/strong>' + tip + '<\/div>';\n    });\n\n    \/\/ --- Year totals & packs \u2192 eShop cart ---\n    h += '<h4>\ud83d\uded2 What you need for the whole year<\/h4>';\n    h += '<div class=\"zl-plist\" id=\"zsPlist\">';\n    var order = [base, 'eco', 'em', 'diat'];\n    order.forEach(function(m) {\n      if (!yearTot[m]) return;\n      var yearNeed = yearTot[m];\n      var p = shop[m];\n      var bp = bestPacks(yearNeed, p.packs);\n      var parts = [];\n      var items = [];\n      var units = 0;\n      bp.counts.forEach(function(cn, i) {\n        if (cn > 0) {\n          parts.push(cn + ' \u00d7 ' + p.packs[i].label);\n          items.push(p.packs[i].id + ':' + cn);\n          units += cn;\n        }\n      });\n      h += '<label class=\"zl-prow\"><input type=\"checkbox\" checked data-zs-mat=\"' + m + '\" data-zs-items=\"' + items.join(',') + '\" data-zs-units=\"' + units + '\">';\n      h += '<span><span class=\"zl-pn\">' + p.icon + ' ' + p.name + '<\/span>';\n      h += '<span class=\"zl-pr\">' + fmtAmt(W * RATE[m], p.unit) + ' \u00d7 ' + sprayCount[m] + ' sprays' + (m === 'diat' ? ' (small & large fruit)' : '') + ' = ' + fmtAmt(yearNeed, p.unit) + '<\/span><\/span>';\n      h += '<span class=\"zl-pq\">' + parts.join(' + ') + '<\/span><\/label>';\n    });\n    h += '<\/div>';\n    h += '<div class=\"zl-cartbox\"><p>Untick anything you already have. The rest goes into the <strong>shop.zeolife.gr<\/strong> cart with the right quantities. There you see final prices and discounts.<\/p>';\n    h += '<a class=\"cta-btn\" id=\"zsCartBtn\" href=\"' + CART_URL + '\"><span>\ud83d\uded2 Add to cart (<span id=\"zsCartCnt\">0<\/span>) \u2192<\/span><\/a><\/div>';\n\n    \/\/ --- Caution ---\n    h += '<div class=\"warning\"><strong>\u26a0\ufe0f Caution<\/strong><ul style=\"margin:.3rem 0 0 1.1rem;padding:0;line-height:1.7\">';\n    h += '<li><strong>Never during full bloom.<\/strong><\/li>';\n    h += '<li>Spray <strong>early in the morning or in the late afternoon<\/strong>, not in strong wind or when rain is expected.<\/li>';\n    if (inList(adds, 'em')) { h += '<li><strong>EM<\/strong> are live microorganisms: spray the solution the same day you prepare it.<\/li>'; }\n    if (inList(adds, 'diat')) { h += '<li><strong>Diatomite<\/strong> needs continuous agitation; wear a dust mask when you pour it into the bucket.<\/li>'; }\n    h += '<li>At the end, <strong>rinse well<\/strong> the tank, filters and nozzles.<\/li>';\n    h += '<\/ul><\/div>';\n\n    \/\/ --- Keep the program: email (+ reminders) \u00b7 calendar \u00b7 print ---\n    h += '<div class=\"zl-keep\" id=\"zsKeep\"><h4>\ud83d\udcec Keep your program<\/h4><p class=\"zl-keep-sub\">Choose how you want to keep it. You can use all three.<\/p>';\n    h += '<div class=\"zl-tiles\">';\n    h += '<button type=\"button\" class=\"zl-tile on\" data-zs-tile=\"mail\"><b>\u2709\ufe0f Email it to me<\/b><span>With reminders if you want<\/span><\/button>';\n    h += '<button type=\"button\" class=\"zl-tile\" data-zs-tile=\"ics\"><b>\ud83d\udcc5 Add to calendar<\/b><span>.ics file for phone, Google, Outlook<\/span><\/button>';\n    h += '<button type=\"button\" class=\"zl-tile\" data-zs-tile=\"print\"><b>\ud83d\udda8\ufe0f Print<\/b><span>Only the program, on A4<\/span><\/button>';\n    h += '<\/div>';\n    h += '<form class=\"zl-mail\" id=\"zsMail\" novalidate>';\n    h += '<label class=\"qty-label\" for=\"zsEmail\">Your email<\/label>';\n    h += '<input type=\"email\" id=\"zsEmail\" class=\"qty-input\" placeholder=\"e.g. john@gmail.com\" autocomplete=\"email\" required>';\n    h += '<input type=\"text\" name=\"website\" id=\"zsHp\" class=\"zl-hp\" tabindex=\"-1\" autocomplete=\"off\" aria-hidden=\"true\">';\n    h += '<label class=\"zl-chk\"><input type=\"checkbox\" id=\"zsRemind\" checked><span><strong>Remind me by email before each spray<\/strong> \u00b7 free, for 12 months<\/span><\/label>';\n    h += '<div class=\"zl-rem\" id=\"zsRemBox\"><div class=\"zl-rem-lead\">Send me the reminder <select id=\"zsLead\"><option value=\"3\">3 days<\/option><option value=\"5\" selected>5 days<\/option><option value=\"7\">7 days<\/option><\/select> before each spray.<\/div>';\n    h += '<div class=\"zl-dates\"><span class=\"zl-dates-h\">Spray dates \u2014 change them if you know your crop better:<\/span>';\n    sched.forEach(function(s, i) {\n      h += '<label class=\"zl-date\"><span>' + (i + 1) + '. ' + stageInfo[s.stage].icon + ' ' + stageName(cropKey, s.stage) + (recipeFor(s.stage).length === 2 ? ' <em>+ diatomite<\/em>' : '') + '<\/span><input type=\"date\" data-zs-date=\"' + i + '\" value=\"' + isoDate(s.now ? today : s.start) + '\"><\/label>';\n    });\n    h += '<\/div><span class=\"zl-small\">Stop with one click from any email. The dates are also used in the calendar file.<\/span><\/div>';\n    h += '<label class=\"zl-chk\"><input type=\"checkbox\" id=\"zsNews\"><span>I also want the weekly Zeolife newsletter (tips, offers).<\/span><\/label>';\n    h += '<label class=\"zl-chk\"><input type=\"checkbox\" id=\"zsConsent\"><span>I agree that my email is used only to send the program and the reminders. <a href=\"https:\/\/shop.zeolife.gr\/en\/privacy-policy\/\" target=\"_blank\" rel=\"noopener\">Privacy policy<\/a><\/span><\/label>';\n    h += '<div class=\"zl-mail-row\"><button type=\"submit\" class=\"btn\" id=\"zsSend\">\u2709\ufe0f Send me the program<\/button><\/div>';\n    h += '<p class=\"zl-status\" id=\"zsStatus\" role=\"status\" aria-live=\"polite\"><\/p>';\n    h += '<\/form><\/div>';\n\n    \/\/ --- Zeolite in the soil ---\n    var soilCrop = { olive: 'olive', citrus: 'fruit', fruit: 'fruit', nuts: 'walnut', vineyard: 'vineyard' }[cropKey] || '';\n    h += '<div class=\"zl-soil\"><div class=\"zl-soil-ill\" aria-hidden=\"true\">\ud83c\udf33<\/div><div><strong class=\"zl-soil-h\">\ud83c\udf3e Spraying protects the foliage. What about the soil?<\/strong>';\n    h += '<p>Zeolite in the soil keeps water and nutrients at the roots, all year round. See how much your <strong>' + fmt(N, 0) + ' ' + c.unit + '<\/strong> need \u2014 the guide opens with your crop already selected.<\/p><\/div>';\n    h += '<a class=\"btn btn-secondary\" href=\"https:\/\/zeolife.gr\/en\/zeolite-agriculture-dosage-calculator\/' + (soilCrop ? '?crop=' + soilCrop : '') + '\">Calculate for the soil \u2192<\/a><\/div>';\n\n    h += '<p class=\"disclaimer\"><strong>Note:<\/strong> Dates are indicative for Greece and depend on area, variety and weather. Dilutions: zeolite 2%, ZeTe 15 kg\/500 L, EM 1%, EcoPlant\u00ae 1%, diatomite 4% (only at small and large fruit). For organic certification or special cases, consult an agronomist. Zeolife technical support: +30 2311 29 55 20.<\/p>';\n\n    resultBody.innerHTML = h;\n    resultBox.classList.add('show');\n    lastPlan = { cropKey: cropKey, sched: sched, recipeFor: recipeFor, W: W, base: base, c: c, N: N, Lp: Lp, tank: tank, tips: tipsPlain, t0: Date.now() };\n    bindKeep();\n    calc.querySelectorAll('#zsPlist input').forEach(function(cb) { cb.addEventListener('change', function() { updateCart(); saveState(); }); });\n    var cartBtn = document.getElementById('zsCartBtn');\n    if (cartBtn) { cartBtn.addEventListener('click', function() { updateCart(); saveState(); }); }\n    updateCart();\n    saveState();\n    if (noScroll !== true) { resultBox.scrollIntoView({ behavior: 'smooth', block: 'start' }); }\n  }\n\n  \/\/ ===================== eSHOP CART & BACK LINK =====================\n  function backUrl() { return window.location.origin + window.location.pathname; }\n  function backQuery() { return 'zl_back=' + encodeURIComponent(backUrl()) + '&zl_lang=' + LANG; }\n  function updateCart() {\n    var btn = document.getElementById('zsCartBtn');\n    if (!btn) return;\n    var items = [];\n    var units = 0;\n    calc.querySelectorAll('#zsPlist input').forEach(function(cb) {\n      if (!cb.checked) return;\n      items.push(cb.getAttribute('data-zs-items'));\n      units += Number(cb.getAttribute('data-zs-units')) || 0;\n    });\n    var cnt = document.getElementById('zsCartCnt');\n    if (cnt) { cnt.textContent = String(units); }\n    if (units === 0) { btn.setAttribute('aria-disabled', 'true'); btn.href = CART_URL; return; }\n    btn.removeAttribute('aria-disabled');\n    btn.href = CART_URL + '?zl_cart=' + items.join(',') + '&' + backQuery();\n  }\n\n  \/\/ Choices are kept in this tab (sessionStorage), so the guide finds them again after the eShop.\n  var STATE_KEY = 'zsStateEn';\n  function store() { try { return window.sessionStorage; } catch (e) { return null; } }\n  function saveState() {\n    var st = store();\n    if (!st) return;\n    var o = { t: Date.now(), crop: getChecked('zsCrop'), mode: getChecked('zsQtyMode'), v: {}, base: getChecked('zsBase'), adds: getAdds(), order: getChecked('zsOrder'), phase: getChecked('zsPhase'), res: resultBox.classList.contains('show'), off: [], y: window.pageYOffset || 0 };\n    ['zsTrees', 'zsStremma', 'zsDensity', 'zsLiters', 'zsTank'].forEach(function(id) { var el = document.getElementById(id); if (el) { o.v[id] = el.value; } });\n    calc.querySelectorAll('#zsPlist input').forEach(function(cb) { if (!cb.checked) { o.off.push(cb.getAttribute('data-zs-mat')); } });\n    try { st.setItem(STATE_KEY, JSON.stringify(o)); } catch (e) {}\n  }\n  function clearState() { var st = store(); if (st) { try { st.removeItem(STATE_KEY); } catch (e) {} } }\n  function setRadio(name, val) {\n    if (val === null || val === undefined) return null;\n    var el = calc.querySelector('input[name=\"' + name + '\"][value=\"' + val + '\"]');\n    if (el) { el.checked = true; }\n    return el;\n  }\n  function restoreState() {\n    var st = store();\n    if (!st) return;\n    var o = null;\n    try { o = JSON.parse(st.getItem(STATE_KEY) || 'null'); } catch (e) { o = null; }\n    if (!o) return;\n    if (Date.now() - (o.t || 0) > 6 * 3600 * 1000) { clearState(); return; }\n    if (!crops[o.crop]) return;\n    if (!setRadio('zsCrop', o.crop)) return;\n    renderQty(o.crop);\n    if (setRadio('zsQtyMode', o.mode)) {\n      var stm = o.mode === 'stremma';\n      document.getElementById('zsStremmaRow').classList.toggle('hidden', !stm);\n      document.getElementById('zsTreesRow').classList.toggle('hidden', stm);\n    }\n    for (var id in o.v) { var el = document.getElementById(id); if (el) { el.value = o.v[id]; } }\n    setRadio('zsBase', o.base);\n    calc.querySelectorAll('input[name=\"zsAdd\"]').forEach(function(cb) { cb.checked = inList(o.adds || [], cb.value); });\n    renderOrder();\n    setRadio('zsOrder', o.order);\n    setRadio('zsPhase', o.phase || 'auto');\n    updateAutoDesc();\n    updateProgress();\n    if (o.res) {\n      if (!calcBtn.disabled) {\n        calculate(true);\n        calc.querySelectorAll('#zsPlist input').forEach(function(cb) { if (inList(o.off || [], cb.getAttribute('data-zs-mat'))) { cb.checked = false; } });\n        updateCart();\n      }\n    }\n    if (o.y) {\n      var go = function() { window.scrollTo(0, o.y); };\n      if (document.readyState === 'complete') { setTimeout(go, 80); } else { window.addEventListener('load', function() { setTimeout(go, 80); }); }\n    }\n  }\n\n  \/\/ ===================== KEEP THE PROGRAM: email & reminders (shop.zeolife.gr) =====================\n  var PLAN_API = 'https:\/\/shop.zeolife.gr\/wp-json\/zt\/v1\/spray-plan';\n  function isoDate(d) { return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()); }\n  function chosenDate(i) {\n    var el = calc.querySelector('input[data-zs-date=\"' + i + '\"]');\n    if (!el) return null;\n    var m = \/^(\\d{4})-(\\d{2})-(\\d{2})$\/.exec(el.value || '');\n    return m ? new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])) : null;\n  }\n  function packsFor(m, need) {\n    var p = shop[m];\n    var bp = bestPacks(need, p.packs);\n    var parts = [], items = [];\n    bp.counts.forEach(function(cn, i) { if (cn > 0) { parts.push(cn + ' \u00d7 ' + p.packs[i].label); items.push(p.packs[i].id + ':' + cn); } });\n    return { parts: parts, items: items };\n  }\n  function buildPayload() {\n    var P = lastPlan, c = P.c;\n    var stages = [];\n    var prev = '';\n    P.sched.forEach(function(s, i) {\n      var rec = P.recipeFor(s.stage);\n      var rows = [], need = {};\n      rec.forEach(function(mats, pi) {\n        mats.forEach(function(m) {\n          rows.push([pi + 1, shop[m].icon + ' ' + matLabel[m], matRateTxt[m], P.tank > 0 ? fmtAmt(P.tank * RATE[m], shop[m].unit) : '', fmtAmt(P.W * RATE[m], shop[m].unit)]);\n          need[m] = (need[m] || 0) + P.W * RATE[m];\n        });\n      });\n      var items = [];\n      for (var m in need) { items = items.concat(packsFor(m, need[m]).items); }\n      var d = chosenDate(i) || (s.now ? todayDate() : s.start);\n      var iso = isoDate(d);\n      if (prev) { if (prev > iso) { iso = prev; } }\n      prev = iso;\n      stages.push({ key: s.stage, name: stageName(P.cropKey, s.stage), icon: stageInfo[s.stage].icon, win: s.now ? (s.manual ? 'Now' : 'Now, until ' + monthsShort[s.end.getMonth()] + ' ' + s.end.getFullYear()) : rangeLabel(s.start, s.end), tip: P.tips[i] || '', date: iso, rows: rows, items: items.join(',') });\n    });\n    var year = [], yearl = [];\n    calc.querySelectorAll('#zsPlist input').forEach(function(cb) {\n      if (!cb.checked) return;\n      year.push(cb.getAttribute('data-zs-items'));\n      var lab = cb.parentNode.querySelector('.zl-pn'), q = cb.parentNode.querySelector('.zl-pq');\n      yearl.push((lab ? lab.textContent : '') + ': ' + (q ? q.textContent : ''));\n    });\n    var two = false;\n    P.sched.forEach(function(s) { if (P.recipeFor(s.stage).length === 2) { two = true; } });\n    return {\n      title: c.name, crop: P.cropKey, icon: c.icon, qty: fmt(P.N, 0) + ' ' + c.unit,\n      water: fmt(P.W, 0) + ' L per pass (' + fmt(P.Lp, 1) + ' L per ' + c.unit1 + ')' + (two ? ' \u00b7 2 passes in the sprays with diatomite' : ''),\n      tank: P.tank > 0 ? fmt(P.tank, 0) + ' L' : '',\n      guide: backUrl(), year: year.join(','), yearl: yearl, stages: stages\n    };\n  }\n  function setStatus(msg, kind) {\n    var st = document.getElementById('zsStatus');\n    if (!st) return;\n    st.textContent = msg;\n    st.className = 'zl-status' + (kind ? ' is-' + kind : '');\n  }\n  function sendPlan(e) {\n    e.preventDefault();\n    var em = document.getElementById('zsEmail');\n    var email = (em.value || '').trim();\n    if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(email)) { setStatus('Please enter a valid email.', 'err'); em.focus(); return; }\n    if (!document.getElementById('zsConsent').checked) { setStatus('Please tick the consent box so we can send you the program.', 'err'); return; }\n    var btn = document.getElementById('zsSend');\n    btn.disabled = true;\n    setStatus('Sending\u2026', '');\n    var body = new URLSearchParams();\n    body.append('email', email);\n    body.append('lang', LANG);\n    body.append('consent', '1');\n    body.append('remind', document.getElementById('zsRemind').checked ? '1' : '');\n    body.append('lead', document.getElementById('zsLead').value);\n    body.append('newsletter', document.getElementById('zsNews').checked ? '1' : '');\n    body.append('website', document.getElementById('zsHp').value);\n    body.append('tm', String(Date.now() - (lastPlan.t0 || Date.now())));\n    body.append('plan', JSON.stringify(buildPayload()));\n    fetch(PLAN_API, { method: 'POST', body: body })\n      .then(function(r) { return r.json().catch(function() { return { ok: false, message: '' }; }); })\n      .then(function(j) {\n        btn.disabled = false;\n        if (j.ok) { setStatus(j.message || 'Sent!', 'ok'); } else { setStatus(j.message || 'Something went wrong. Please try again or call us on +30 2311 29 55 20.', 'err'); }\n      })\n      .catch(function() { btn.disabled = false; setStatus('Could not connect. Please try again in a moment.', 'err'); });\n  }\n  function bindKeep() {\n    calc.querySelectorAll('[data-zs-tile]').forEach(function(t) {\n      t.addEventListener('click', function() {\n        var k = t.getAttribute('data-zs-tile');\n        if (k === 'ics') { downloadIcs(); return; }\n        if (k === 'print') { doPrint(); return; }\n        var on = !t.classList.contains('on');\n        t.classList.toggle('on', on);\n        document.getElementById('zsMail').style.display = on ? '' : 'none';\n      });\n    });\n    var rem = document.getElementById('zsRemind');\n    if (rem) { rem.addEventListener('change', function() { document.getElementById('zsRemBox').style.display = rem.checked ? '' : 'none'; }); }\n    calc.querySelectorAll('input[data-zs-date]').forEach(function(inp) {\n      inp.addEventListener('change', function() {\n        var all = calc.querySelectorAll('input[data-zs-date]');\n        for (var i = 1; i !== all.length; i++) {\n          if (all[i].value) { if (all[i - 1].value) { if (all[i - 1].value > all[i].value) { all[i].value = all[i - 1].value; } } }\n        }\n      });\n    });\n    var f = document.getElementById('zsMail');\n    if (f) { f.addEventListener('submit', sendPlan); }\n  }\n\n  \/\/ ===================== CALENDAR .ics =====================\n  function pad(n) { return (n > 9 ? '' : '0') + n; }\n  function icsDate(d) { return d.getFullYear() + pad(d.getMonth() + 1) + pad(d.getDate()); }\n  function icsEsc(s) { return String(s).replace(\/\\\\\/g, '\\\\\\\\').replace(\/,\/g, '\\\\,').replace(\/;\/g, '\\\\;').replace(\/\\n\/g, '\\\\n'); }\n  function downloadIcs() {\n    if (!lastPlan) return;\n    var c = crops[lastPlan.cropKey];\n    var lines = ['BEGIN:VCALENDAR', 'VERSION:2.0', 'PRODID:-\/\/Zeolife\/\/Spray Program\/\/EN', 'CALSCALE:GREGORIAN'];\n    var stamp = new Date();\n    function recipeTxt(rec) {\n      return rec.map(function(mats, i) {\n        return (rec.length === 2 ? (i === 0 ? '\u2460 ' : '\u2461 ') : '') + mats.map(function(m) { return matLabel[m] + ' ' + fmtAmt(lastPlan.W * RATE[m], shop[m].unit); }).join(' + ') + ' in ' + fmt(lastPlan.W, 0) + ' L of water';\n      }).join('\\n');\n    }\n    lastPlan.sched.forEach(function(s, i) {\n      var d = chosenDate(i) || (s.now ? todayDate() : s.start);\n      var end = new Date(d.getTime() + 86400000);\n      lines.push('BEGIN:VEVENT');\n      lines.push('UID:zeolife-spray-' + lastPlan.cropKey + '-' + i + '-' + icsDate(d) + '@zeolife.gr');\n      lines.push('DTSTAMP:' + icsDate(stamp) + 'T000000Z');\n      lines.push('DTSTART;VALUE=DATE:' + icsDate(d));\n      lines.push('DTEND;VALUE=DATE:' + icsDate(end));\n      lines.push('SUMMARY:' + icsEsc('\ud83d\udca8 Spray ' + (i + 1) + '\/4 \u2014 ' + stageName(lastPlan.cropKey, s.stage) + ' (' + c.name + ')'));\n      lines.push('DESCRIPTION:' + icsEsc('Window: ' + (s.manual ? 'now' : rangeLabel(s.start, s.end)) + '\\n' + recipeTxt(lastPlan.recipeFor(s.stage)) + '\\nGuide: https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/'));\n      lines.push('BEGIN:VALARM');\n      lines.push('ACTION:DISPLAY');\n      lines.push('DESCRIPTION:' + icsEsc('Zeolite spray \u2014 ' + stageName(lastPlan.cropKey, s.stage)));\n      lines.push('TRIGGER:-P2D');\n      lines.push('END:VALARM');\n      lines.push('END:VEVENT');\n    });\n    lines.push('END:VCALENDAR');\n    var blob = new Blob([lines.join('\\r\\n')], { type: 'text\/calendar;charset=utf-8' });\n    var a = document.createElement('a');\n    a.href = URL.createObjectURL(blob);\n    a.download = 'zeolife-spray-program.ics';\n    document.body.appendChild(a);\n    a.click();\n    setTimeout(function() { URL.revokeObjectURL(a.href); a.parentNode.removeChild(a); }, 1000);\n  }\n\n  \/\/ ===================== EVENTS =====================\n  calc.querySelectorAll('input[name=\"zsCrop\"]').forEach(function(r) {\n    r.addEventListener('change', function() {\n      if (r.value === 'other') { enterOther(); return; }\n      exitOther();\n      renderQty(r.value);\n      renderOrder();\n      updateAutoDesc();\n      updateProgress();\n    });\n  });\n  calc.querySelectorAll('input[name=\"zsBase\"], input[name=\"zsAdd\"]').forEach(function(r) {\n    r.addEventListener('change', function() { renderOrder(); updateProgress(); });\n  });\n  calc.querySelectorAll('input[name=\"zsPhase\"]').forEach(function(r) { r.addEventListener('change', updateProgress); });\n  var oc = document.getElementById('zsOtherCrop');\n  if (oc) { oc.addEventListener('input', updateOtherLinks); }\n  document.getElementById('zsOtherBack').addEventListener('click', function() {\n    var o = calc.querySelector('input[name=\"zsCrop\"][value=\"other\"]');\n    if (o) { o.checked = false; }\n    exitOther();\n    updateProgress();\n    steps[0].scrollIntoView({ behavior: 'smooth', block: 'start' });\n  });\n  calcBtn.addEventListener('click', function() { calculate(); });\n  resetBtn.addEventListener('click', function() {\n    calc.querySelectorAll('input[type=\"radio\"]').forEach(function(r) { r.checked = false; });\n    var au = calc.querySelector('input[name=\"zsPhase\"][value=\"auto\"]'); if (au) au.checked = true;\n    calc.querySelectorAll('input[name=\"zsAdd\"]').forEach(function(r) { r.checked = true; });\n    qtyBox.innerHTML = '<p style=\"color:var(--muted);font-style:italic;\">Choose a crop in Step 1 first.<\/p>';\n    orderBox.innerHTML = '';\n    exitOther();\n    resultBox.classList.remove('show');\n    lastPlan = null;\n    clearState();\n    updateAutoDesc();\n    updateProgress();\n    steps[0].scrollIntoView({ behavior: 'smooth', block: 'start' });\n  });\n  function doPrint() {\n    if (!resultBox.classList.contains('show')) { return; }\n    var d = document.getElementById('zsPrintDate');\n    if (d) { d.textContent = new Date().toLocaleDateString('en-GB', { day: '2-digit', month: 'long', year: 'numeric' }); }\n    window.print();\n  }\n\n  \/\/ ===================== STICKY PROGRESS BAR =====================\n  var progressEl = calc.querySelector('.progress');\n  var progressSpacer = document.getElementById('zsProgressSpacer');\n  var progFlowHeight = 0;\n  function zsMeasure() {\n    if (!progressEl) return;\n    var mb = parseFloat(window.getComputedStyle(progressEl).marginBottom) || 0;\n    progFlowHeight = progressEl.offsetHeight + mb;\n  }\n  function zsFixedTopBottom(el) {\n    if (!el) return 0;\n    var cs = window.getComputedStyle(el);\n    if (cs.position !== 'fixed') return 0;\n    if (cs.display === 'none') return 0;\n    if (cs.visibility === 'hidden') return 0;\n    var r = el.getBoundingClientRect();\n    if (r.height === 0) return 0;\n    if (r.top > 300) return 0;\n    if (0 >= r.bottom) return 0;\n    return r.bottom;\n  }\n  function zsTopOffset() {\n    var offset = 0;\n    var ab = zsFixedTopBottom(document.getElementById('wpadminbar'));\n    if (ab > offset) { offset = ab; }\n    var heads = document.querySelectorAll('.kadence-sticky-header');\n    for (var i = 0; i !== heads.length; i++) {\n      var hb = zsFixedTopBottom(heads[i]);\n      if (hb > offset) { offset = hb; }\n    }\n    return offset;\n  }\n  var zsPinned = false;\n  function zsUpdateSticky() {\n    if (!progressEl) return;\n    var offset = zsTopOffset();\n    var rect = calc.getBoundingClientRect();\n    var shouldPin = false;\n    if (offset >= rect.top) {\n      if (rect.bottom > (offset + 24)) { shouldPin = true; }\n    }\n    if (shouldPin) {\n      var s = progressEl.style;\n      s.position = 'fixed'; s.top = offset + 'px'; s.left = rect.left + 'px';\n      s.width = rect.width + 'px'; s.zIndex = '99999';\n      if (progressSpacer) progressSpacer.style.height = progFlowHeight + 'px';\n      zsPinned = true;\n    } else if (zsPinned) {\n      var s2 = progressEl.style;\n      s2.position = ''; s2.top = ''; s2.left = ''; s2.width = ''; s2.zIndex = '';\n      if (progressSpacer) progressSpacer.style.height = '0px';\n      zsPinned = false;\n    }\n  }\n  zsMeasure();\n  window.addEventListener('load', function() { zsMeasure(); zsUpdateSticky(); });\n  window.addEventListener('scroll', zsUpdateSticky, { passive: true });\n  window.addEventListener('resize', function() { zsMeasure(); zsUpdateSticky(); });\n  zsUpdateSticky();\n  calc.querySelectorAll('a[data-zs-more]').forEach(function(a) {\n    a.addEventListener('click', function(e) {\n      e.stopPropagation();\n      saveState();\n      a.href = a.getAttribute('data-zs-more') + '?' + backQuery();\n    });\n  });\n  window.addEventListener('pagehide', saveState);\n  updateAutoDesc();\n  updateProgress();\n  restoreState();\n})();\n<\/script>\n\n\n<!-- ==== ZL PRINT: \u03b5\u03ba\u03c4\u03c5\u03c0\u03ce\u03bd\u03b5\u03b9 \u039c\u039f\u039d\u039f \u03c4\u03bf \u03b1\u03c0\u03bf\u03c4\u03ad\u03bb\u03b5\u03c3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03bf\u03b4\u03b7\u03b3\u03bf\u03cd (\u03c7\u03c9\u03c1\u03af\u03c2 header\/\u03bc\u03b5\u03bd\u03bf\u03cd\/\u03c4\u03af\u03c4\u03bb\u03bf\/footer\/newsletter\/ZeoBot) ==== -->\n<script>\n(function(){\n  if (window.zlPrintOnlyResult) { return; }\n  window.zlPrintOnlyResult = true;\n  var zlHidden = null;\n  function zlHide(el) {\n    if (el.tagName === 'SCRIPT') { return; }\n    if (el.tagName === 'STYLE') { return; }\n    if (el.tagName === 'LINK') { return; }\n    zlHidden.push([el, el.style.getPropertyValue('display'), el.style.getPropertyPriority('display')]);\n    el.style.setProperty('display', 'none', 'important');\n  }\n  function zlStyle(el, prop, val) {\n    zlHidden.push([el, el.style.getPropertyValue(prop), el.style.getPropertyPriority(prop), prop]);\n    el.style.setProperty(prop, val, 'important');\n  }\n  function zlPrintPrep() {\n    if (zlHidden) { return; }\n    var res = document.querySelector('.zlcalc .result.show');\n    if (!res) { return; }\n    zlHidden = [];\n    var node = res;\n    while (node.parentElement) {\n      var parent = node.parentElement;\n      var sibs = parent.children;\n      for (var i = 0; i !== sibs.length; i++) {\n        if (sibs[i] !== node) { zlHide(sibs[i]); }\n      }\n      if (parent === document.body) { break; }\n      zlStyle(parent, 'margin', '0');\n      zlStyle(parent, 'padding', '0');\n      zlStyle(parent, 'border', '0');\n      zlStyle(parent, 'box-shadow', 'none');\n      zlStyle(parent, 'max-width', 'none');\n      node = parent;\n    }\n  }\n  function zlPrintRestore() {\n    if (!zlHidden) { return; }\n    for (var i = zlHidden.length - 1; i !== -1; i--) {\n      var h = zlHidden[i];\n      var prop = h[3] ? h[3] : 'display';\n      if (h[1]) { h[0].style.setProperty(prop, h[1], h[2]); } else { h[0].style.removeProperty(prop); }\n    }\n    zlHidden = null;\n  }\n  window.addEventListener('beforeprint', zlPrintPrep);\n  window.addEventListener('afterprint', zlPrintRestore);\n  if (window.matchMedia) {\n    var mq = window.matchMedia('print');\n    var onChange = function(e) { if (e.matches) { zlPrintPrep(); } else { zlPrintRestore(); } };\n    if (mq.addEventListener) { mq.addEventListener('change', onChange); } else if (mq.addListener) { mq.addListener(onChange); }\n  }\n})();\n<\/script>\n\n<!-- ==== ZL STEPPER: \u03ba\u03bf\u03c5\u03bc\u03c0\u03b9\u03ac \u2212 \/ + \u03c3\u03c4\u03b1 \u03b1\u03c1\u03b9\u03b8\u03bc\u03b7\u03c4\u03b9\u03ba\u03ac \u03c0\u03b5\u03b4\u03af\u03b1, \u03c7\u03c9\u03c1\u03af\u03c2 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03c4\u03b9\u03bc\u03ae\u03c2 \u03bc\u03b5 \u03c4\u03b7 \u03c1\u03bf\u03b4\u03ad\u03bb\u03b1 \u03c4\u03bf\u03c5 \u03c0\u03bf\u03bd\u03c4\u03b9\u03ba\u03b9\u03bf\u03cd ==== -->\n<script>\n(function () {\n  if (window.zlStepperInit) { return; }\n  window.zlStepperInit = 1;\n  var EN = String(document.documentElement.lang || '').indexOf('en') === 0;\n  function toNum(v) { var n = parseFloat(String(v === null ? '' : v).replace(',', '.')); return isNaN(n) ? null : n; }\n  function decs(n) { var p = String(n).split('.'); return p[1] ? p[1].length : 0; }\n  function fire(el) {\n    ['input', 'change'].forEach(function (t) {\n      var ev;\n      try { ev = new Event(t, { bubbles: true }); } catch (x) { ev = document.createEvent('Event'); ev.initEvent(t, true, true); }\n      el.dispatchEvent(ev);\n    });\n  }\n  function bump(inp, dir) {\n    if (inp.disabled) { return; }\n    if (inp.readOnly) { return; }\n    var st = toNum(inp.getAttribute('data-zl-step'));\n    if (!st) { st = toNum(inp.step); }\n    if (!st) { st = 1; }\n    var mn = toNum(inp.getAttribute('min'));\n    var mx = toNum(inp.getAttribute('max'));\n    var cur = toNum(inp.value);\n    var v;\n    if (cur === null) {\n      v = dir > 0 ? st : 0;\n      if (mn !== null) { v = Math.max(v, mn); }\n    } else {\n      var k = cur \/ st;\n      var kr = Math.round(k);\n      if (Math.abs(k - kr) > 1e-9) { k = dir > 0 ? Math.floor(k) : Math.ceil(k); } else { k = kr; }\n      v = (k + dir) * st;\n    }\n    if (mn !== null) { v = Math.max(v, mn); }\n    if (mx !== null) { v = Math.min(v, mx); }\n    v = parseFloat(v.toFixed(Math.min(6, decs(st))));\n    inp.value = String(v);\n    fire(inp);\n  }\n  function wrap(inp) {\n    if (inp.getAttribute('data-zl-stepper')) { return; }\n    if (inp.type !== 'number') { return; }\n    inp.setAttribute('data-zl-stepper', '1');\n    var st = toNum(inp.getAttribute('data-zl-step')) || toNum(inp.step) || 1;\n    if (!inp.getAttribute('inputmode')) { inp.setAttribute('inputmode', decs(st) ? 'decimal' : 'numeric'); }\n    var box = document.createElement('span');\n    box.className = 'zl-step';\n    var minus = document.createElement('button');\n    minus.type = 'button'; minus.className = 'zl-step-btn'; minus.textContent = '\u2212';\n    minus.setAttribute('aria-label', EN ? 'Decrease' : '\u039b\u03b9\u03b3\u03cc\u03c4\u03b5\u03c1\u03bf');\n    var plus = document.createElement('button');\n    plus.type = 'button'; plus.className = 'zl-step-btn'; plus.textContent = '+';\n    plus.setAttribute('aria-label', EN ? 'Increase' : '\u03a0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03bf');\n    inp.parentNode.insertBefore(box, inp);\n    box.appendChild(minus);\n    box.appendChild(inp);\n    var ph = inp.getAttribute('placeholder') || '';\n    if (ph.length > 8) { var w = Math.min(ph.length + 2, 22) + 'ch'; inp.style.setProperty('width', w, 'important'); inp.style.setProperty('flex-basis', w, 'important'); }\n    var u = inp.getAttribute('data-unit');\n    if (u) { var us = document.createElement('span'); us.className = 'zl-step-unit'; us.textContent = u; box.appendChild(us); }\n    box.appendChild(plus);\n    minus.addEventListener('click', function () { bump(inp, -1); });\n    plus.addEventListener('click', function () { bump(inp, 1); });\n    inp.addEventListener('wheel', function () { if (document.activeElement === inp) { inp.blur(); } }, { passive: true });\n  }\n  function scan(root) {\n    var list = root.querySelectorAll('input[type=\"number\"]');\n    for (var i = 0; i !== list.length; i++) { wrap(list[i]); }\n  }\n  function init() {\n    var roots = document.querySelectorAll('.zlcalc');\n    for (var i = 0; i !== roots.length; i++) {\n      (function (r) {\n        scan(r);\n        if (window.MutationObserver) { new MutationObserver(function () { scan(r); }).observe(r, { childList: true, subtree: true }); }\n      })(roots[i]);\n    }\n  }\n  if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udca8 Zeolite Foliar Spray Program Guide Build your yearly program of 4 foliar sprays with 20-micron zeolite or ZeTe, EM active microorganisms, EcoPlant\u00ae and diatomite. The guide calculates quantities per spray, per tank and for the whole year and starts the program from your next spray, based on today&#8217;s date. \ud83d\udccb 6-step guide 4 sprays&#8230;<\/p>\n","protected":false},"author":7,"featured_media":15438,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"content-type":"","_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-20469","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Foliar Spray Program with Zeolite \u2014 Dosage Guide | Zeolife<\/title>\n<meta name=\"description\" content=\"Foliar Spray Program with Zeolite \u2014 Dosage Guide - Greek Zeolite, Zeolite products and industrial minerals | Zeolife.gr\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Foliar Spray Program with Zeolite \u2014 Dosage Guide | Zeolife\" \/>\n<meta property=\"og:description\" content=\"Foliar Spray Program with Zeolite \u2014 Dosage Guide - Greek Zeolite, Zeolite products and industrial minerals | Zeolife.gr\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/\" \/>\n<meta property=\"og:site_name\" content=\"Greek Zeolite, Zeolite products and industrial minerals | Zeolife.gr\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/zeolifegr\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-19T21:18:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/zeolife.gr\/wp-content\/uploads\/2020\/05\/logo-square-color.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"1200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ZeolifeGr\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/foliar-spray-program-calculator\\\/\",\"url\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/foliar-spray-program-calculator\\\/\",\"name\":\"Foliar Spray Program with Zeolite \u2014 Dosage Guide | Zeolife\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/foliar-spray-program-calculator\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/foliar-spray-program-calculator\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/zeolife.gr\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/logo-square-color.jpg\",\"datePublished\":\"2026-10-19T20:31:19+00:00\",\"dateModified\":\"2026-10-19T21:18:13+00:00\",\"description\":\"Foliar Spray Program with Zeolite \u2014 Dosage Guide - Greek Zeolite, Zeolite products and industrial minerals | Zeolife.gr\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/foliar-spray-program-calculator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zeolife.gr\\\/en\\\/foliar-spray-program-calculator\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/foliar-spray-program-calculator\\\/#primaryimage\",\"url\":\"https:\\\/\\\/zeolife.gr\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/logo-square-color.jpg\",\"contentUrl\":\"https:\\\/\\\/zeolife.gr\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/logo-square-color.jpg\",\"width\":1200,\"height\":1200},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/foliar-spray-program-calculator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Foliar Spray Program with Zeolite \u2014 Dosage Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/\",\"name\":\"Greek Zeolite & Industrial Minerals \u2013 Applications & Information | Zeolife.gr\",\"description\":\"Applications and purchase of Greek zeolite, zeolite products and industrial minerals | Zeolife.gr\",\"publisher\":{\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/#organization\"},\"alternateName\":\"Greek Zeolite: Properties, Uses & Products | Zeolife.gr\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/#organization\",\"name\":\"Zeolite | Diatomite | Zeolife.gr\",\"alternateName\":\"Zeolife.gr\",\"url\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/zeolife.gr\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/icon-color-square.png\",\"contentUrl\":\"https:\\\/\\\/zeolife.gr\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/icon-color-square.png\",\"width\":1200,\"height\":1200,\"caption\":\"Zeolite | Diatomite | Zeolife.gr\"},\"image\":{\"@id\":\"https:\\\/\\\/zeolife.gr\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/zeolifegr\",\"https:\\\/\\\/x.com\\\/ZeolifeGr\",\"https:\\\/\\\/www.instagram.com\\\/zeolife.gr\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/zeolifegr\",\"https:\\\/\\\/www.pinterest.com\\\/zeolifegr\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCUR1v-vb6vutCU3uvnu98WQ\",\"https:\\\/\\\/zeolifegr.tumblr.com\\\/\",\"https:\\\/\\\/www.tiktok.com\\\/@zeolifegr\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Foliar Spray Program with Zeolite \u2014 Dosage Guide | Zeolife","description":"Foliar Spray Program with Zeolite \u2014 Dosage Guide - Greek Zeolite, Zeolite products and industrial minerals | Zeolife.gr","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/","og_locale":"en_US","og_type":"article","og_title":"Foliar Spray Program with Zeolite \u2014 Dosage Guide | Zeolife","og_description":"Foliar Spray Program with Zeolite \u2014 Dosage Guide - Greek Zeolite, Zeolite products and industrial minerals | Zeolife.gr","og_url":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/","og_site_name":"Greek Zeolite, Zeolite products and industrial minerals | Zeolife.gr","article_publisher":"https:\/\/www.facebook.com\/zeolifegr","article_modified_time":"2026-10-19T21:18:13+00:00","og_image":[{"width":1200,"height":1200,"url":"https:\/\/zeolife.gr\/wp-content\/uploads\/2020\/05\/logo-square-color.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@ZeolifeGr","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/","url":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/","name":"Foliar Spray Program with Zeolite \u2014 Dosage Guide | Zeolife","isPartOf":{"@id":"https:\/\/zeolife.gr\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/#primaryimage"},"image":{"@id":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/#primaryimage"},"thumbnailUrl":"https:\/\/zeolife.gr\/wp-content\/uploads\/2020\/05\/logo-square-color.jpg","datePublished":"2026-10-19T20:31:19+00:00","dateModified":"2026-10-19T21:18:13+00:00","description":"Foliar Spray Program with Zeolite \u2014 Dosage Guide - Greek Zeolite, Zeolite products and industrial minerals | Zeolife.gr","breadcrumb":{"@id":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/#primaryimage","url":"https:\/\/zeolife.gr\/wp-content\/uploads\/2020\/05\/logo-square-color.jpg","contentUrl":"https:\/\/zeolife.gr\/wp-content\/uploads\/2020\/05\/logo-square-color.jpg","width":1200,"height":1200},{"@type":"BreadcrumbList","@id":"https:\/\/zeolife.gr\/en\/foliar-spray-program-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zeolife.gr\/en\/"},{"@type":"ListItem","position":2,"name":"Foliar Spray Program with Zeolite \u2014 Dosage Guide"}]},{"@type":"WebSite","@id":"https:\/\/zeolife.gr\/en\/#website","url":"https:\/\/zeolife.gr\/en\/","name":"Greek Zeolite & Industrial Minerals \u2013 Applications & Information | Zeolife.gr","description":"Applications and purchase of Greek zeolite, zeolite products and industrial minerals | Zeolife.gr","publisher":{"@id":"https:\/\/zeolife.gr\/en\/#organization"},"alternateName":"Greek Zeolite: Properties, Uses & Products | Zeolife.gr","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zeolife.gr\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zeolife.gr\/en\/#organization","name":"Zeolite | Diatomite | Zeolife.gr","alternateName":"Zeolife.gr","url":"https:\/\/zeolife.gr\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zeolife.gr\/en\/#\/schema\/logo\/image\/","url":"https:\/\/zeolife.gr\/wp-content\/uploads\/2019\/11\/icon-color-square.png","contentUrl":"https:\/\/zeolife.gr\/wp-content\/uploads\/2019\/11\/icon-color-square.png","width":1200,"height":1200,"caption":"Zeolite | Diatomite | Zeolife.gr"},"image":{"@id":"https:\/\/zeolife.gr\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/zeolifegr","https:\/\/x.com\/ZeolifeGr","https:\/\/www.instagram.com\/zeolife.gr\/","https:\/\/www.linkedin.com\/in\/zeolifegr","https:\/\/www.pinterest.com\/zeolifegr\/","https:\/\/www.youtube.com\/channel\/UCUR1v-vb6vutCU3uvnu98WQ","https:\/\/zeolifegr.tumblr.com\/","https:\/\/www.tiktok.com\/@zeolifegr"]}]}},"taxonomy_info":[],"featured_image_src_large":["https:\/\/zeolife.gr\/wp-content\/uploads\/2020\/05\/logo-square-color.jpg",1200,1200,false],"author_info":{"display_name":"Chrysovalantis Chatzigeorgiou","author_link":"https:\/\/zeolife.gr\/en\/author\/valantis\/"},"comment_info":0,"_links":{"self":[{"href":"https:\/\/zeolife.gr\/en\/wp-json\/wp\/v2\/pages\/20469","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zeolife.gr\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/zeolife.gr\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/zeolife.gr\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/zeolife.gr\/en\/wp-json\/wp\/v2\/comments?post=20469"}],"version-history":[{"count":3,"href":"https:\/\/zeolife.gr\/en\/wp-json\/wp\/v2\/pages\/20469\/revisions"}],"predecessor-version":[{"id":20769,"href":"https:\/\/zeolife.gr\/en\/wp-json\/wp\/v2\/pages\/20469\/revisions\/20769"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/zeolife.gr\/en\/wp-json\/wp\/v2\/media\/15438"}],"wp:attachment":[{"href":"https:\/\/zeolife.gr\/en\/wp-json\/wp\/v2\/media?parent=20469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}