{"id":6,"date":"2026-05-25T19:44:40","date_gmt":"2026-05-25T16:44:40","guid":{"rendered":"https:\/\/holygaia.com\/?page_id=6"},"modified":"2026-08-13T16:06:53","modified_gmt":"2026-08-13T13:06:53","slug":"aquarium-volume-and-chemicals-calculator","status":"publish","type":"page","link":"https:\/\/holygaia.com\/?page_id=6","title":{"rendered":"Tools"},"content":{"rendered":"\n<h2 class=\"wp-block-heading has-text-align-center\">Aquarium Volume \/ Chemicals Calculator<\/h2>\n\n\n\n<div class=\"aq-calc-container\">\n    <div class=\"aq-calc-grid\">\n        \n        <!-- LEFT SIDE: DOSAGE CALCULATOR -->\n        <div class=\"aq-card dosage-card\">\n            <h3>Product Dosage<\/h3>\n            <div class=\"product-selection-row\">\n                <div class=\"input-group main-product-group\">\n                    <label for=\"calculator-select\">Select Product:<\/label>\n                    <select id=\"calculator-select\" onchange=\"updateProductVariants()\">\n                        <option value=\"custom\">Calculate Your Own<\/option>\n                        <option value=\"apg_fix\">APG Fix (Algae Treatment)<\/option>\n                        <option value=\"apg_fix_lite\">APG Fix Lite (Algae Treatment)<\/option>\n                        <option value=\"aquadene_gen_aid\">AQUADENE General Aid 3<\/option>\n                        <option value=\"aquadene_gill_parasite\">AQUADENE Gill, Fungus, Parasite<\/option>\n                        <option value=\"fluval_bio\">FLUVAL Biological Enhancer<\/option>\n                        <option value=\"accr\">FRITZ A.C.C.R.<\/option>\n                        <option value=\"fritzzyme\">FRITZ Zyme<\/option>\n                        <option value=\"sea_salt\">Sea Salt Medication (Quarantine Tank)<\/option>\n                        <option value=\"seachem_nitrogen\">Seachem Flourish Nitrogen<\/option>\n                        <option value=\"seachem_phosphorus\">Seachem Flourish Phosphorus<\/option>\n                        <option value=\"seachem_potassium\">Seachem Flourish Potassium<\/option>\n                        <option value=\"seachem_prime\">Seachem Prime<\/option>\n                        <option value=\"methylblue\">SeaStar METHYL BLUE<\/option>\n                        <option value=\"algumin\">Tetra AlguMin<\/option>\n                        <option value=\"aquasafe\">Tetra AquaSafe<\/option>\n                        <option value=\"crystalwater\">Tetra Crystal Water<\/option>\n                        <option value=\"easybalance\">Tetra EasyBalance<\/option>\n                        <option value=\"plantamin\">Tetra PlantaMin<\/option>\n                        <option value=\"antychlor\">Tropical ANTYCHLOR<\/option>\n                        <option value=\"tropica_capsules\">Tropica PLANT CARE Nutrition Capsules<\/option>\n                        <option value=\"tropica_specialised\">Tropica PLANT CARE Specialised Nutrition<\/option>\n                        <option value=\"ph_buffer\">Waterlife pH 6.5 BUFFER<\/option>\n                    <\/select>\n                <\/div>\n                <div id=\"variant-select-container\" class=\"input-group variant-product-group\" style=\"display: none;\">\n                    <label for=\"variant-select\">Usage Option:<\/label>\n                    <select id=\"variant-select\" onchange=\"updateDosage()\">\n                        <!-- Options will be dynamically populated -->\n                    <\/select>\n                <\/div>\n            <\/div>\n\n            <div id=\"dosage-inputs\" style=\"margin-top: 20px;\">\n                <div id=\"custom-fields\">\n                    <div class=\"input-group\">\n                        <label>Bottle Dose (ml):<\/label>\n                        <input type=\"number\" id=\"bottle-ml\" value=\"5\" oninput=\"updateDosage()\">\n                    <\/div>\n                    <div class=\"input-group\">\n                        <label>Per (Liters):<\/label>\n                        <input type=\"number\" id=\"bottle-liters\" value=\"10\" oninput=\"updateDosage()\">\n                    <\/div>\n                <\/div>\n                \n                <div id=\"fixed-info\" style=\"display:none; font-style: italic; color: #666; margin-bottom: 10px;\">\n                    <span id=\"product-ratio\"><\/span>\n                <\/div>\n\n                <div class=\"result-box dose-highlight\">\n                    <strong>Your Required Dose:<\/strong>\n                    <div class=\"result-value\"><span id=\"final-dose\">58.8<\/span> <span id=\"dose-unit\">ml<\/span><\/div>\n                    <div id=\"dose-breakdown\" style=\"font-size: 0.85em; color: #555; margin-top:5px; border-top: 1px solid #c8e6c9; padding-top: 5px;\"><\/div>\n                <\/div>\n                \n                <!-- DYNAMIC WARNING NOTES -->\n                <div id=\"apg-fix-note\" class=\"calc-note\" style=\"display:none; color: #d32f2f; margin-top: 10px; border-top: 1px solid #ffcdd2; padding-top: 8px;\">\n                    <strong style=\"color: #b71c1c;\">\u26a0\ufe0f WARNING:<\/strong> NOT safe for Mosses. Ensure strong water aeration. For sensitive fish\/shrimp, use half dosage (<span id=\"apg-fix-half\">0.0<\/span> ml).\n                <\/div>\n\n                <div id=\"apg-lite-note\" class=\"calc-note\" style=\"display:none; color: #e65100; margin-top: 10px; border-top: 1px solid #ffe0b2; padding-top: 8px;\">\n                    <strong style=\"color: #e65100;\">\ud83c\udf3f MOSS SAFE:<\/strong> Safe to use with Mosses. Ensure strong water aeration. For sensitive fish\/shrimp, use half dosage (<span id=\"apg-lite-half\">0.0<\/span> ml).\n                <\/div>\n\n                <div id=\"algumin-note\" class=\"calc-note\" style=\"display:none; color: #e65100; margin-top: 10px; border-top: 1px solid #ffe0b2; padding-top: 8px;\">\n                    <strong style=\"color: #e65100;\">\u26a0\ufe0f SHRIMP CAUTION:<\/strong> Use half-dosage (<span id=\"algumin-half\">0.0<\/span> ml) if shrimplets\/sensitive dwarf shrimp are present.\n                <\/div>\n\n                <div id=\"aquadene-gen-note\" class=\"calc-note\" style=\"display:none; color: #d32f2f; margin-top: 10px; border-top: 1px solid #ffcdd2; padding-top: 8px;\">\n                    <strong style=\"color: #b71c1c;\">\u26a0\ufe0f HIGH RISK:<\/strong> Can harm shrimplets &#038; snails. Remove carbon filter. Use half-dose (<span id=\"aquadene-gen-half\">0.0<\/span> ml) in a hospital tank.\n                <\/div>\n\n                <div id=\"aquadene-gill-note\" class=\"calc-note\" style=\"display:none; color: #d32f2f; margin-top: 10px; border-top: 1px solid #ffcdd2; padding-top: 8px;\">\n                    <strong style=\"color: #b71c1c;\">\u274c DEADLY TO PLANTS &#038; INVERTS:<\/strong> Do NOT use in main tank! Treat fish in isolated hospital tank only. Remove all live plants, snails, &#038; shrimp!\n                <\/div>\n\n                <div id=\"sea-salt-note\" class=\"calc-note\" style=\"display:none; color: #d32f2f; margin-top: 10px; border-top: 1px solid #ffcdd2; padding-top: 8px;\">\n                    <strong style=\"color: #b71c1c;\">\u274c DEADLY TO PLANTS &#038; INVERTS:<\/strong> Use pure non-iodized salt in ISOLATED hospital tanks\/baths only. Never dose directly into planted\/shrimp main tanks!\n                <\/div>\n\n                <p id=\"seachem-prime-note\" class=\"calc-note\" style=\"display:none; color: #2e7d32; margin-top: 10px; text-align: center;\">\n                    * For emergency high ammonia\/nitrite toxicity, Prime may be safely dosed up to 5x (<span id=\"prime-5x\">0.0<\/span> ml).\n                <\/p>\n\n                <p id=\"fritzzyme-note\" class=\"calc-note\" style=\"display:none; color: #d32f2f; margin-top: 10px; text-align: center;\">\n                    * For a large livestock load, Dosage may be safely increased 10x (<span id=\"fritzzyme-10x\">0.0<\/span> ml).\n                <\/p>\n\n                <p id=\"buffer-note\" class=\"calc-note\" style=\"display:none; color: #d32f2f; margin-top: 10px; font-weight: 600; text-align: center;\">\n                    * Check pH parameters every 30 mins after administration.\n                <\/p>\n            <\/div>\n        <\/div>\n\n        <!-- RIGHT SIDE: VOLUME CALCULATOR -->\n        <div class=\"aq-card volume-card\">\n            <h3>Aquarium Volume<\/h3>\n            <div id=\"dimensions-row\" class=\"input-row\">\n                <div class=\"input-group\">\n                    <label>Length (cm):<\/label>\n                    <input type=\"number\" id=\"aq-length\" value=\"120\" oninput=\"calculateVolume()\">\n                <\/div>\n                <div class=\"input-group\">\n                    <label>Width (cm):<\/label>\n                    <input type=\"number\" id=\"aq-width\" value=\"35\" oninput=\"calculateVolume()\">\n                <\/div>\n                <div class=\"input-group\">\n                    <label>Height (cm):<\/label>\n                    <input type=\"number\" id=\"aq-height\" value=\"40\" oninput=\"calculateVolume()\">\n                <\/div>\n            <\/div>\n            \n            <div id=\"fill-level-container\" class=\"input-group fill-level\">\n                <label>Fill Level (%):<\/label>\n                <input type=\"number\" id=\"aq-fill\" value=\"70\" min=\"1\" max=\"100\" oninput=\"calculateVolume()\">\n                <p class=\"calc-note\">*Please account for the Substrate \/ Gravel too not just the unfilled gap to the lid of the Aquarium<\/p>\n            <\/div>\n\n            <!-- Checkbox Option -->\n            <div class=\"input-group checkbox-group\">\n                <label class=\"checkbox-label\">\n                    <input type=\"checkbox\" id=\"manual-checkbox\" onchange=\"toggleManualVolume()\">\n                    Enter Volume Manually\n                <\/label>\n            <\/div>\n\n            <!-- Manual Inputs Row -->\n            <div id=\"manual-volume-row\" class=\"manual-input-row\" style=\"display: none;\">\n                <div class=\"input-group\">\n                    <label>Your Volume:<\/label>\n                    <input type=\"number\" id=\"manual-volume-input\" value=\"100\" oninput=\"calculateVolume()\">\n                <\/div>\n                <div class=\"input-group\">\n                    <label>Unit:<\/label>\n                    <select id=\"manual-volume-unit\" onchange=\"calculateVolume()\">\n                        <option value=\"liters\">Liters<\/option>\n                        <option value=\"gallons\">Gallons (US)<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n            \n            <div class=\"result-box volume-result\" style=\"margin-bottom: 15px;\">\n                <strong>Net Water Volume:<\/strong>\n                <div class=\"result-value\"><span id=\"total-liters\">117.6<\/span> Liters<\/div>\n                <div style=\"font-size: 0.85em; color: #555; margin-top:5px;\">\n                    Total Capacity: <span id=\"raw-liters\">168.0<\/span> L<br>\n                    Est. Weight: <span id=\"total-kg\">117.6<\/span> KG\n                <\/div>\n            <\/div>\n\n            <!-- Generate Report Button -->\n            <button type=\"button\" class=\"aq-btn-report\" onclick=\"generateFullReport()\">\ud83d\udccb Generate Full Dosage Report<\/button>\n        <\/div>\n\n    <\/div>\n\n    <!-- FULL DOSAGE REPORT CONTAINER -->\n    <div id=\"full-report-section\" class=\"aq-card report-card\" style=\"display: none;\">\n        <h3>Full Dosage Report (<span id=\"report-volume-heading\">0.0<\/span> L Net Volume)<\/h3>\n        <div class=\"table-responsive\">\n            <table class=\"report-table\">\n                <thead>\n                    <tr>\n                        <th>Product \/ Brand Name<\/th>\n                        <th>Application Stage \/ Type<\/th>\n                        <th>Standard Dose<\/th>\n                        <th>Safety Notes &#038; Warnings<\/th>\n                    <\/tr>\n                <\/thead>\n                <tbody id=\"report-table-body\">\n                    <!-- Javascript will append rows dynamically here -->\n                <\/tbody>\n            <\/table>\n        <\/div>\n    <\/div>\n<\/div>\n\n<style>\n    .aq-calc-container { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; max-width: 950px; margin: 20px auto; color: #333; line-height: 1.5; }\n    .aq-calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 25px; margin-bottom: 25px; }\n    \n    @media (max-width: 768px) { \n        .aq-calc-grid { grid-template-columns: 1fr; } \n        .volume-card { order: 1; }\n        .dosage-card { order: 2; }\n    }\n    \n    .aq-card { background: #ffffff; padding: 25px; border-radius: 12px; border: 1px solid #e0e0e0; box-shadow: 0 4px 6px rgba(0,0,0,0.05); }\n    .aq-card h3 { margin: 0 0 20px 0; color: #1e88e5; font-size: 1.25rem; text-transform: uppercase; letter-spacing: 1px; border-bottom: 2px solid #e3f2fd; padding-bottom: 10px; }\n    \n    .product-selection-row { display: flex; flex-wrap: wrap; gap: 15px; }\n    .main-product-group { flex: 2 1 200px; }\n    .variant-product-group { flex: 1 1 150px; }\n    \n    .input-row { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; transition: opacity 0.2s; }\n    .manual-input-row { display: grid; grid-template-columns: 2fr 1fr; gap: 10px; margin-bottom: 18px; }\n    .input-group { margin-bottom: 18px; }\n    .input-group label { display: block; font-size: 0.85rem; margin-bottom: 6px; font-weight: 600; color: #555; }\n    .input-group input, .aq-card select { width: 100%; padding: 10px; border: 2px solid #eee; border-radius: 6px; font-size: 1rem; transition: border-color 0.2s, background-color 0.2s; }\n    .input-group input:focus, .aq-card select:focus { border-color: #1e88e5; outline: none; }\n    \n    .input-group input:disabled, .aq-card select:disabled { background-color: #f5f5f5; color: #999; border-color: #e8e8e8; cursor: not-allowed; }\n    \n    .fill-level { background: #fff8e1; padding: 12px; border-radius: 6px; border: 1px solid #ffe082; transition: opacity 0.2s; }\n    .calc-note { font-size: 0.75rem; margin: 8px 0 0 0; line-height: 1.3; font-style: italic; }\n\n    .checkbox-group { margin: 12px 0; }\n    .checkbox-label { display: inline-flex !important; align-items: center; font-weight: normal !important; cursor: pointer; font-size: 0.9rem; color: #444; }\n    .checkbox-label input[type=\"checkbox\"] { width: auto; margin-right: 8px; cursor: pointer; }\n\n    .result-box { margin-top: 20px; padding: 20px; border-radius: 8px; text-align: center; }\n    .dose-highlight { background: #e8f5e9; border: 1px solid #c8e6c9; }\n    .volume-result { background: #e3f2fd; border: 1px solid #bbdefb; }\n    .result-value { font-size: 2rem; font-weight: 800; color: #2e7d32; margin-top: 5px; }\n    .volume-result .result-value { color: #1565c0; }\n\n    .aq-btn-report { width: 100%; padding: 12px; background: #1e88e5; color: #fff; border: none; border-radius: 6px; font-size: 1rem; font-weight: bold; cursor: pointer; transition: background 0.2s; display: block; text-align: center; box-shadow: 0 2px 4px rgba(30,136,229,0.3); }\n    .aq-btn-report:hover { background: #1565c0; }\n    \n    .report-card { border: 1px solid #b3e5fc; background: #fafafa; }\n    .report-card h3 { color: #0288d1; border-bottom: 2px solid #b3e5fc; }\n    .table-responsive { overflow-x: auto; margin-top: 15px; }\n    .report-table { width: 100%; border-collapse: collapse; text-align: left; font-size: 0.9rem; }\n    .report-table th, .report-table td { padding: 10px 12px; border-bottom: 1px solid #e0e0e0; }\n    .report-table th { background: #e1f5fe; color: #0277bd; font-weight: bold; }\n    .report-table tr:hover { background: #f1f8ff; }\n    .text-warning-bold { color: #c62828; font-weight: 600; }\n    .text-safe-bold { color: #2e7d32; font-weight: 600; }\n<\/style>\n\n<script>\n    const presets = {\n        custom: { name: \"Custom Product\", multi: false, unit: \"ml\" },\n        apg_fix: { name: \"APG Fix (Algae Treatment)\", multi: false, ml: 5, liters: 50, unit: \"ml\", note: \"\u274c NOT safe for mosses! Use half-dose for shrimplets\/fry.\" },\n        apg_fix_lite: { name: \"APG Fix Lite (Algae Treatment)\", multi: false, ml: 10, liters: 100, unit: \"ml\", note: \"\ud83c\udf3f Moss safe. Use half-dose for shrimplets\/fry.\" },\n        aquadene_gen_aid: { name: \"AQUADENE General Aid 3\", multi: false, ml: 5, liters: 30, unit: \"ml\", note: \"\u26a0\ufe0f High Risk: Can harm shrimplets & snails. Use half-dose in hospital tank.\" },\n        aquadene_gill_parasite: { name: \"AQUADENE Gill, Fungus, Parasite\", multi: false, ml: 5, liters: 30, unit: \"ml\", note: \"\u274c DEADLY to plants, snails, & shrimp! Treat isolated fish in hospital tank only.\" },\n        fluval_bio: {\n            name: \"FLUVAL Biological Enhancer\",\n            multi: true,\n            unit: \"ml\",\n            note: \"\u2705 100% Invert, Fry, & Plant Safe.\",\n            variants: [\n                { id: \"day1\", label: \"Day 1\", ml: 25, liters: 40 },\n                { id: \"day2\", label: \"Day 2\", ml: 10, liters: 40 },\n                { id: \"day3\", label: \"Day 3\", ml: 10, liters: 40 },\n                { id: \"maintenance\", label: \"Maintenance\", ml: 7, liters: 40 }\n            ]\n        },\n        accr: { name: \"FRITZ A.C.C.R.\", multi: false, ml: 5, liters: 38, unit: \"ml\", note: \"\u2705 Safe for all livestock & plants. Binds heavy metals & chlorine.\" },\n        fritzzyme: {\n            name: \"FRITZ Zyme\",\n            multi: true,\n            unit: \"ml\",\n            note: \"\u2705 Safe for all livestock. \ud83d\udd34 May be increased up to 10x for heavy loads.\",\n            variants: [\n                { id: \"new\", label: \"New System\", ml: 118, liters: 38 },\n                { id: \"est\", label: \"Established System\", ml: 30, liters: 38 }\n            ]\n        },\n        sea_salt: {\n            name: \"Sea Salt Medication (Quarantine)\",\n            multi: true,\n            unit: \"grams\",\n            note: \"\u274c DEADLY to plants, snails, & shrimp! Use pure non-iodized salt in quarantine tank only.\",\n            variants: [\n                { id: \"low\", label: \"Low (Mild Stress Relief: 1g\/L)\", ml: 1, liters: 1 },\n                { id: \"med\", label: \"Medium (Therapeutic Bath: 2g\/L)\", ml: 2, liters: 1 },\n                { id: \"dip\", label: \"Short Dip (15-30 min max: 10g\/L)\", ml: 10, liters: 1 }\n            ]\n        },\n        seachem_nitrogen: { name: \"Seachem Flourish Nitrogen\", multi: false, ml: 2.5, liters: 160, unit: \"ml\", note: \"\u2705 100% Invert, Fry, & Plant Safe. Nitrogen supplement (15,000 mg\/L).\" },\n        seachem_phosphorus: { name: \"Seachem Flourish Phosphorus\", multi: false, ml: 2.5, liters: 80, unit: \"ml\", note: \"\u2705 100% Invert, Fry, & Plant Safe. Soluble phosphate supplement (4,500 mg\/L).\" },\n        seachem_potassium: { name: \"Seachem Flourish Potassium\", multi: false, ml: 5, liters: 125, unit: \"ml\", note: \"\u2705 100% Invert, Fry, & Plant Safe. Prevents pinholes in leaves (50,000 mg\/L).\" },\n        seachem_prime: { name: \"Seachem Prime\", multi: false, ml: 5, liters: 200, unit: \"ml\", note: \"\u2705 100% Invert, Fry, & Plant Safe. Detoxifies Ammonia, Nitrite, Nitrate & Chlorine. (Up to 5x dose for emergencies).\" },\n        methylblue: { name: \"SeaStar METHYL BLUE\", multi: false, ml: 10, liters: 100, unit: \"ml\", note: \"\u274c DEADLY to shrimplets, snails, & bio-filter bacteria!\" },\n        algumin: {\n            name: \"Tetra AlguMin\",\n            multi: true,\n            unit: \"ml\",\n            note: \"\u26a0\ufe0f Moderate Risk: Use half dose for shrimplets. Monitor delicate mosses\/Vallisneria.\",\n            variants: [\n                { id: \"active\", label: \"Active Treatment (5ml\/10L)\", ml: 5, liters: 10 },\n                { id: \"prev\", label: \"Preventive Care (5ml\/20L)\", ml: 5, liters: 20 }\n            ]\n        },\n        aquasafe: { name: \"Tetra AquaSafe\", multi: false, ml: 5, liters: 10, unit: \"ml\", note: \"\u2705 100% Invert, Fry, & Plant Safe. Protects fish mucous membranes.\" },\n        crystalwater: { name: \"Tetra Crystal Water\", multi: false, ml: 2.5, liters: 10, unit: \"ml\", note: \"\u26a0\ufe0f Use caution: Rapid particle clumping can affect shrimplets.\" },\n        easybalance: { name: \"Tetra EasyBalance\", multi: false, ml: 2.5, liters: 10, unit: \"ml\", note: \"\u2705 100% Invert & Plant Safe. Reduces nitrates & stabilizes pH.\" },\n        plantamin: {\n            name: \"Tetra PlantaMin\",\n            multi: true,\n            unit: \"ml\",\n            note: \"\u2705 100% Invert & Plant Safe. Contains safe, ultra-trace micronutrients.\",\n            variants: [\n                { id: \"setup\", label: \"Initial Setup (5ml\/10L)\", ml: 5, liters: 10 },\n                { id: \"maint\", label: \"Monthly Maintenance (5ml\/20L)\", ml: 5, liters: 20 }\n            ]\n        },\n        antychlor: { name: \"Tropical ANTYCHLOR\", multi: false, ml: 10, liters: 100, unit: \"ml\", note: \"\u2705 Safe for all livestock & plants. Fast chlorine neutralizer.\" },\n        tropica_capsules: { name: \"Tropica PLANT CARE Nutrition Capsules\", multi: false, ml: 0, liters: 0, unit: \"Capsules\", note: \"\u2705 100% Invert & Plant Safe. Buried in substrate near plant roots (re-dose every 1-2 months).\" },\n        tropica_specialised: { name: \"Tropica PLANT CARE Specialised Nutrition\", multi: false, ml: 6, liters: 50, unit: \"ml\", note: \"\u2705 100% Invert, Fry, & Plant Safe. Macro & Micro liquid fertilizer (1 pump = 2ml).\" },\n        ph_buffer: { name: \"Waterlife pH 6.5 BUFFER\", multi: false, ml: 2, liters: 100, unit: \"Teaspoons\", note: \"\u26a0\ufe0f Monitor pH parameters closely every 30 mins after dosing.\" }\n    };\n\n    function toggleManualVolume() {\n        const isManual = document.getElementById('manual-checkbox').checked;\n        document.getElementById('aq-length').disabled = isManual;\n        document.getElementById('aq-width').disabled = isManual;\n        document.getElementById('aq-height').disabled = isManual;\n        document.getElementById('aq-fill').disabled = isManual;\n        document.getElementById('dimensions-row').style.opacity = isManual ? \"0.4\" : \"1\";\n        document.getElementById('fill-level-container').style.opacity = isManual ? \"0.4\" : \"1\";\n        document.getElementById('manual-volume-row').style.display = isManual ? \"grid\" : \"none\";\n        calculateVolume();\n    }\n\n    function calculateVolume() {\n        const isManual = document.getElementById('manual-checkbox').checked;\n        let rawVolume = 0;\n        let netVolume = 0;\n\n        if (isManual) {\n            const manualVal = parseFloat(document.getElementById('manual-volume-input').value) || 0;\n            const unit = document.getElementById('manual-volume-unit').value;\n            netVolume = (unit === 'gallons') ? manualVal * 3.78541 : manualVal;\n            rawVolume = NaN; \n        } else {\n            const L = parseFloat(document.getElementById('aq-length').value) || 0;\n            const W = parseFloat(document.getElementById('aq-width').value) || 0;\n            const H = parseFloat(document.getElementById('aq-height').value) || 0;\n            const fill = parseFloat(document.getElementById('aq-fill').value) || 0;\n            rawVolume = (L * W * H) \/ 1000;\n            netVolume = rawVolume * (fill \/ 100);\n        }\n        \n        document.getElementById('raw-liters').innerText = isNaN(rawVolume) ? \"N\/A\" : rawVolume.toFixed(1);\n        document.getElementById('total-liters').innerText = netVolume.toFixed(1);\n        document.getElementById('total-kg').innerText = netVolume.toFixed(1);\n        \n        updateDosage();\n        \n        if (document.getElementById('full-report-section').style.display === 'block') {\n            generateFullReport();\n        }\n    }\n\n    function updateProductVariants() {\n        const productType = document.getElementById('calculator-select').value;\n        const variantContainer = document.getElementById('variant-select-container');\n        const variantSelect = document.getElementById('variant-select');\n        const customFields = document.getElementById('custom-fields');\n        const productRatio = document.getElementById('product-ratio');\n        const product = presets[productType];\n        \n        productRatio.innerText = \"\";\n        customFields.style.display = (productType === 'custom') ? 'block' : 'none';\n\n        if (product && product.multi) {\n            variantSelect.innerHTML = \"\";\n            product.variants.forEach((v, index) => {\n                const opt = document.createElement('option');\n                opt.value = v.id;\n                opt.innerText = v.label;\n                if (index === 0) opt.selected = true;\n                variantSelect.appendChild(opt);\n            });\n            variantContainer.style.display = 'block';\n        } else {\n            variantContainer.style.display = 'none';\n        }\n        updateDosage();\n    }\n\n    function updateDosage() {\n        const productType = document.getElementById('calculator-select').value;\n        const variantId = document.getElementById('variant-select').value;\n        const netVolume = parseFloat(document.getElementById('total-liters').innerText) || 0;\n        \n        const fixedInfo = document.getElementById('fixed-info');\n        const ratioLabel = document.getElementById('product-ratio');\n        const breakdownDiv = document.getElementById('dose-breakdown');\n        const doseUnitSpan = document.getElementById('dose-unit');\n        \n        const apgFixNote = document.getElementById('apg-fix-note');\n        const apgFixHalf = document.getElementById('apg-fix-half');\n        const apgLiteNote = document.getElementById('apg-lite-note');\n        const apgLiteHalf = document.getElementById('apg-lite-half');\n        const alguminNote = document.getElementById('algumin-note');\n        const alguminHalf = document.getElementById('algumin-half');\n        const aquadeneGenNote = document.getElementById('aquadene-gen-note');\n        const aquadeneGenHalf = document.getElementById('aquadene-gen-half');\n        const aquadeneGillNote = document.getElementById('aquadene-gill-note');\n        const seaSaltNote = document.getElementById('sea-salt-note');\n        const primeNote = document.getElementById('seachem-prime-note');\n        const prime5xSpan = document.getElementById('prime-5x');\n        const fritzzymeNote = document.getElementById('fritzzyme-note');\n        const fritzzyme10xSpan = document.getElementById('fritzzyme-10x');\n        const bufferNote = document.getElementById('buffer-note');\n        \n        const product = presets[productType];\n        let bottleMl = 0, bottleL = 1;\n        let ratioLabelText = \"\";\n        let displayUnit = \"ml\";\n\n        if (productType === 'custom') {\n            bottleMl = parseFloat(document.getElementById('bottle-ml').value) || 0;\n            bottleL = parseFloat(document.getElementById('bottle-liters').value) || 1;\n            ratioLabelText = `Custom Product (${bottleMl}ml\/${bottleL}L)`;\n            fixedInfo.style.display = 'block';\n        } else if (product && product.multi) {\n            fixedInfo.style.display = 'block';\n            displayUnit = product.unit;\n            if (variantId) {\n                const activeVariant = product.variants.find(v => v.id === variantId);\n                if (activeVariant) {\n                    bottleMl = activeVariant.ml;\n                    bottleL = activeVariant.liters;\n                    ratioLabelText = `${product.name}: ${activeVariant.label}`;\n                }\n            }\n        } else if (product) {\n            fixedInfo.style.display = 'block';\n            bottleMl = product.ml;\n            bottleL = product.liters;\n            ratioLabelText = product.label || product.name;\n            displayUnit = product.unit;\n        } else {\n            fixedInfo.style.display = 'none';\n        }\n\n        if (productType !== 'custom') ratioLabel.innerText = ratioLabelText;\n        doseUnitSpan.innerText = displayUnit;\n\n        if (productType === 'tropica_capsules') {\n            document.getElementById('final-dose').innerText = \"1 \/ 10-15cm\";\n            breakdownDiv.innerHTML = \"Place 1 capsule near root zone in substrate every 10-15cm\";\n        } else {\n            const dose = bottleL > 0 ? (bottleMl \/ bottleL) * netVolume : 0;\n            document.getElementById('final-dose').innerText = dose.toFixed(1);\n\n            let mathUnitAbbr = \"ml\";\n            if (displayUnit === \"Teaspoons\") mathUnitAbbr = \"tsp\";\n            if (displayUnit === \"grams\") mathUnitAbbr = \"g\";\n\n            if (productType !== 'custom' && productType !== \"\") {\n                if (productType === 'tropica_specialised') {\n                    const pumps = (dose \/ 2).toFixed(1);\n                    breakdownDiv.innerHTML = `(${bottleMl} ${mathUnitAbbr} \/ ${bottleL} L) &times; ${netVolume.toFixed(1)} L = ${dose.toFixed(1)} ${mathUnitAbbr} (approx. ${pumps} pumps)`;\n                } else {\n                    breakdownDiv.innerHTML = `(${bottleMl} ${mathUnitAbbr} \/ ${bottleL} L) &times; ${netVolume.toFixed(1)} L = ${dose.toFixed(1)} ${mathUnitAbbr}`;\n                }\n            } else {\n                breakdownDiv.innerHTML = \"\";\n            }\n\n            if (productType === 'apg_fix') apgFixHalf.innerText = (dose \/ 2).toFixed(1);\n            if (productType === 'apg_fix_lite') apgLiteHalf.innerText = (dose \/ 2).toFixed(1);\n            if (productType === 'algumin') alguminHalf.innerText = (dose \/ 2).toFixed(1);\n            if (productType === 'aquadene_gen_aid') aquadeneGenHalf.innerText = (dose \/ 2).toFixed(1);\n            if (productType === 'seachem_prime') prime5xSpan.innerText = (dose * 5).toFixed(1);\n            if (productType === 'fritzzyme') fritzzyme10xSpan.innerText = (dose * 10).toFixed(1);\n        }\n\n        apgFixNote.style.display = (productType === 'apg_fix') ? 'block' : 'none';\n        apgLiteNote.style.display = (productType === 'apg_fix_lite') ? 'block' : 'none';\n        alguminNote.style.display = (productType === 'algumin') ? 'block' : 'none';\n        aquadeneGenNote.style.display = (productType === 'aquadene_gen_aid') ? 'block' : 'none';\n        aquadeneGillNote.style.display = (productType === 'aquadene_gill_parasite') ? 'block' : 'none';\n        seaSaltNote.style.display = (productType === 'sea_salt') ? 'block' : 'none';\n        primeNote.style.display = (productType === 'seachem_prime') ? 'block' : 'none';\n        fritzzymeNote.style.display = (productType === 'fritzzyme') ? 'block' : 'none';\n        bufferNote.style.display = (productType === 'ph_buffer') ? 'block' : 'none';\n    }\n\n    \/\/ GENERATE FULL REPORT LOGIC\n    function generateFullReport() {\n        const netVolume = parseFloat(document.getElementById('total-liters').innerText) || 0;\n        document.getElementById('report-volume-heading').innerText = netVolume.toFixed(1);\n        \n        const tbody = document.getElementById('report-table-body');\n        tbody.innerHTML = \"\"; \n\n        const sortedKeys = [\n            'apg_fix', 'apg_fix_lite', 'aquadene_gen_aid', 'aquadene_gill_parasite', \n            'fluval_bio', 'accr', 'fritzzyme', 'sea_salt', 'seachem_nitrogen', \n            'seachem_phosphorus', 'seachem_potassium', 'seachem_prime', 'methylblue', \n            'algumin', 'aquasafe', 'crystalwater', 'easybalance', 'plantamin', \n            'antychlor', 'tropica_capsules', 'tropica_specialised', 'ph_buffer'\n        ];\n\n        sortedKeys.forEach(key => {\n            const p = presets[key];\n            \n            if (key === 'tropica_capsules') {\n                const row = document.createElement('tr');\n                row.innerHTML = `\n                    <td><strong>${p.name}<\/strong><\/td>\n                    <td style=\"font-style: italic;\">Substrate Root Zone<\/td>\n                    <td><strong>1 Cap \/ 10-15cm<\/strong><\/td>\n                    <td><small>${p.note}<\/small><\/td>\n                `;\n                tbody.appendChild(row);\n            } else if (p.multi) {\n                p.variants.forEach((v, index) => {\n                    const dose = (v.ml \/ v.liters) * netVolume;\n                    const row = document.createElement('tr');\n                    \n                    if (index === 0) {\n                        const cellName = document.createElement('td');\n                        cellName.rowSpan = p.variants.length;\n                        cellName.innerHTML = `<strong>${p.name}<\/strong>`;\n                        row.appendChild(cellName);\n                    }\n                    \n                    const cellStage = document.createElement('td');\n                    cellStage.innerText = v.label;\n                    row.appendChild(cellStage);\n                    \n                    const cellDose = document.createElement('td');\n                    const mathAbbr = (p.unit === \"grams\") ? \"g\" : \"ml\";\n                    cellDose.innerHTML = `<strong>${dose.toFixed(1)}<\/strong> ${mathAbbr}`;\n                    row.appendChild(cellDose);\n                    \n                    const cellNote = document.createElement('td');\n                    if (key === 'fritzzyme') {\n                        cellNote.innerHTML = `<span class=\"text-safe-bold\">10x Load Dose: ${(dose * 10).toFixed(1)} ml<\/span><br><small>${p.note}<\/small>`;\n                    } else if (key === 'algumin') {\n                        cellNote.innerHTML = `<span class=\"text-warning-bold\">Shrimp Safe Half Dose: ${(dose \/ 2).toFixed(1)} ml<\/span><br><small>${p.note}<\/small>`;\n                    } else {\n                        cellNote.innerHTML = `<small>${p.note || '-'}<\/small>`;\n                    }\n                    row.appendChild(cellNote);\n                    tbody.appendChild(row);\n                });\n            } else {\n                const dose = (p.ml \/ p.liters) * netVolume;\n                const row = document.createElement('tr');\n                \n                const cellName = document.createElement('td');\n                cellName.innerHTML = `<strong>${p.name}<\/strong>`;\n                row.appendChild(cellName);\n                \n                const cellStage = document.createElement('td');\n                cellStage.style.fontStyle = \"italic\";\n                cellStage.innerText = \"Standard Application\";\n                row.appendChild(cellStage);\n                \n                const cellDose = document.createElement('td');\n                const mathAbbr = (p.unit === \"Teaspoons\") ? \"tsp\" : \"ml\";\n                cellDose.innerHTML = `<strong>${dose.toFixed(1)}<\/strong> ${mathAbbr}`;\n                row.appendChild(cellDose);\n                \n                const cellNote = document.createElement('td');\n                if (key.startsWith('apg_fix') || key === 'aquadene_gen_aid') {\n                    cellNote.innerHTML = `<span class=\"text-warning-bold\">Half Dose: ${(dose \/ 2).toFixed(1)} ml<\/span><br><small>${p.note}<\/small>`;\n                } else if (key === 'seachem_prime') {\n                    cellNote.innerHTML = `<span class=\"text-safe-bold\">5x Emergency Dose: ${(dose * 5).toFixed(1)} ml<\/span><br><small>${p.note}<\/small>`;\n                } else if (key === 'tropica_specialised') {\n                    const pumps = (dose \/ 2).toFixed(1);\n                    cellNote.innerHTML = `<span class=\"text-safe-bold\">Pump Equivalent: ~${pumps} pumps<\/span><br><small>${p.note}<\/small>`;\n                } else {\n                    cellNote.innerHTML = `<small>${p.note || '-'}<\/small>`;\n                }\n                row.appendChild(cellNote);\n                tbody.appendChild(row);\n            }\n        });\n\n        document.getElementById('full-report-section').style.display = 'block';\n        document.getElementById('full-report-section').scrollIntoView({ behavior: 'smooth' });\n    }\n\n    window.onload = calculateVolume;\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Aquarium Volume \/ Chemicals Calculator Product Dosage Select Product: Calculate Your OwnAPG Fix (Algae Treatment)APG Fix Lite (Algae Treatment)AQUADENE General Aid 3AQUADENE Gill, Fungus, ParasiteFLUVAL Biological EnhancerFRITZ A.C.C.R.FRITZ ZymeSea Salt Medication (Quarantine Tank)Seachem Flourish NitrogenSeachem Flourish PhosphorusSeachem Flourish PotassiumSeachem PrimeSeaStar METHYL BLUETetra AlguMinTetra AquaSafeTetra Crystal WaterTetra EasyBalanceTetra PlantaMinTropical ANTYCHLORTropica PLANT CARE Nutrition CapsulesTropica PLANT CARE [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/holygaia.com\/index.php?rest_route=\/wp\/v2\/pages\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/holygaia.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/holygaia.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/holygaia.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/holygaia.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6"}],"version-history":[{"count":10,"href":"https:\/\/holygaia.com\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions"}],"predecessor-version":[{"id":186,"href":"https:\/\/holygaia.com\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions\/186"}],"wp:attachment":[{"href":"https:\/\/holygaia.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}