{"id":119,"date":"2026-05-03T22:57:53","date_gmt":"2026-05-03T22:57:53","guid":{"rendered":"https:\/\/tech.bluntly.me\/?page_id=119"},"modified":"2026-05-24T18:37:47","modified_gmt":"2026-05-24T18:37:47","slug":"aquarium-calculators","status":"publish","type":"page","link":"https:\/\/tech.bluntly.me\/index.php\/aquarium-calculators\/","title":{"rendered":"Aquarium Calculators"},"content":{"rendered":"\n<div class=\"aq-calc-container\">\n    <div class=\"aq-calc-grid\">\n        \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=\"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=\"methylblue\">SeaStar METHYL BLUE<\/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=\"antychlor\">Tropical ANTYCHLOR<\/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                        <\/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                <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        <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            <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            <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\">\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        <\/div>\n\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; }\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 { color: #795548; font-size: 0.7rem; margin: 8px 0 0 0; line-height: 1.2; 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<\/style>\n\n<script>\n    \/\/ Internal dataset restructured alphabetically\n    const presets = {\n        custom: { multi: false, unit: \"ml\" },\n        fluval_bio: {\n            multi: true,\n            unit: \"ml\",\n            variants: [\n                { id: \"day1\", label: \"Day 1 (25ml\/40L)\", ml: 25, liters: 40 },\n                { id: \"day2\", label: \"Day 2 (10ml\/40L)\", ml: 10, liters: 40 },\n                { id: \"day3\", label: \"Day 3 (10ml\/40L)\", ml: 10, liters: 40 },\n                { id: \"maintenance\", label: \"Maintenance (7ml\/40L)\", ml: 7, liters: 40 }\n            ]\n        },\n        accr: { multi: false, ml: 5, liters: 38, unit: \"ml\", label: \"FRITZ A.C.C.R.: 5ml per 38L\" },\n        fritzzyme: {\n            multi: true,\n            unit: \"ml\",\n            variants: [\n                { id: \"new\", label: \"New System (118ml\/38L)\", ml: 118, liters: 38 },\n                { id: \"est\", label: \"Established System (30ml\/38L)\", ml: 30, liters: 38 }\n            ]\n        },\n        methylblue: { multi: false, ml: 10, liters: 100, unit: \"ml\", label: \"SeaStar METHYL BLUE: 10ml per 100L\" },\n        aquasafe: { multi: false, ml: 5, liters: 10, unit: \"ml\", label: \"Tetra AquaSafe: 5ml per 10L\" },\n        crystalwater: { multi: false, ml: 2.5, liters: 10, unit: \"ml\", label: \"Tetra Crystal Water: 2.5ml per 10L\" },\n        easybalance: { multi: false, ml: 2.5, liters: 10, unit: \"ml\", label: \"Tetra EasyBalance: 2.5ml per 10L\" },\n        antychlor: { multi: false, ml: 10, liters: 100, unit: \"ml\", label: \"Tropical ANTYCHLOR: 10ml per 100L\" },\n        ph_buffer: { multi: false, ml: 2, liters: 100, unit: \"Teaspoons\", label: \"Waterlife pH 6.5 BUFFER: 2 tsp per 100L\" }\n    };\n\n    function toggleManualVolume() {\n        const isManual = document.getElementById('manual-checkbox').checked;\n        \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        \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        \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            \n            if (unit === 'gallons') {\n                netVolume = manualVal * 3.78541; \n            } else {\n                netVolume = manualVal; \n            }\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            \n            rawVolume = (L * W * H) \/ 1000;\n            netVolume = rawVolume * (fill \/ 100);\n        }\n        \n        if (isNaN(rawVolume)) {\n            document.getElementById('raw-liters').innerText = \"N\/A\";\n        } else {\n            document.getElementById('raw-liters').innerText = rawVolume.toFixed(1);\n        }\n        \n        document.getElementById('total-liters').innerText = netVolume.toFixed(1);\n        document.getElementById('total-kg').innerText = netVolume.toFixed(1);\n        \n        updateDosage(); \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        \n        const product = presets[productType];\n        productRatio.innerText = \"\";\n        \n        if (productType === 'custom') {\n            customFields.style.display = 'block';\n        } else {\n            customFields.style.display = 'none';\n        }\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\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 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        \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 = (productType === 'fritzzyme' ? 'FRITZ Zyme: ' : 'FLUVAL Bio: ') + 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;\n            displayUnit = product.unit;\n        } else {\n            fixedInfo.style.display = 'none';\n        }\n\n        if (productType !== 'custom') {\n           ratioLabel.innerText = ratioLabelText;\n        }\n\n        doseUnitSpan.innerText = displayUnit;\n\n        const dose = bottleL > 0 ? (bottleMl \/ bottleL) * netVolume : 0;\n        document.getElementById('final-dose').innerText = dose.toFixed(1);\n\n        const mathUnitAbbr = (displayUnit === \"Teaspoons\") ? \"tsp\" : \"ml\";\n\n        if (productType !== 'custom' && productType !== \"\") {\n            breakdownDiv.innerHTML = `(${bottleMl} ${mathUnitAbbr} \/ ${bottleL} L) &times; ${netVolume.toFixed(1)} L = ${dose.toFixed(1)} ${mathUnitAbbr}`;\n        } else {\n            breakdownDiv.innerHTML = \"\";\n        }\n\n        fritzzymeNote.style.display = (productType === 'fritzzyme') ? 'block' : 'none';\n        if (productType === 'fritzzyme') {\n            fritzzyme10xSpan.innerText = (dose * 10).toFixed(1);\n        }\n        \n        bufferNote.style.display = (productType === 'ph_buffer') ? 'block' : 'none';\n    }\n\n    window.onload = calculateVolume;\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Product Dosage Select Product: Calculate Your OwnFLUVAL Biological EnhancerFRITZ A.C.C.R.FRITZ ZymeSeaStar METHYL BLUETetra AquaSafeTetra Crystal WaterTetra EasyBalanceTropical ANTYCHLORWaterlife pH 6.5 BUFFER Usage Option: Bottle Dose (ml): Per (Liters): Your Required Dose: 58.8 ml * For a large livestock load, Dosage may be safely increased 10x (0.0 ml) * Check pH parameters every 30 mins after&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_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-119","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/tech.bluntly.me\/index.php\/wp-json\/wp\/v2\/pages\/119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tech.bluntly.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tech.bluntly.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tech.bluntly.me\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tech.bluntly.me\/index.php\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":9,"href":"https:\/\/tech.bluntly.me\/index.php\/wp-json\/wp\/v2\/pages\/119\/revisions"}],"predecessor-version":[{"id":132,"href":"https:\/\/tech.bluntly.me\/index.php\/wp-json\/wp\/v2\/pages\/119\/revisions\/132"}],"wp:attachment":[{"href":"https:\/\/tech.bluntly.me\/index.php\/wp-json\/wp\/v2\/media?parent=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}