Anesthesia Clinical Calculators Clinical Calculators for Anesthesia Trainees
This comprehensive collection of clinical calculators is designed to support anesthesia trainees in their daily practice. Find the calculator you need quickly by browsing through categories or using the search function.
Information
`; break; case 'ibw': title = 'Ideal Body Weight Calculator'; content = `
`; break; case 'map': title = 'Mean Arterial Pressure (MAP) Calculator'; content = `
`; break; case 'gcs': title = 'Glasgow Coma Scale (GCS) Calculator'; content = `
`; break; case 'anion-gap': title = 'Anion Gap Calculator'; content = `
`; break; case 'alveolar-gas': title = 'Alveolar Gas Equation Calculator'; content = `
`; break; case 'aa-gradient': title = 'A-a Gradient Calculator'; content = `
`; break; case 'pao2-fio2': title = 'PaO2/FiO2 Ratio Calculator'; content = `
`; break; case 'creatinine-clearance': title = 'Creatinine Clearance Calculator'; content = `
`; break; case 'asa': title = 'ASA Physical Status Classification'; content = `
× ${title}
Classification
Information
`; break; case 'dead-space': title = 'Dead Space Calculator'; content = `
`; break; case 'shunt-fraction': title = 'Shunt Fraction Calculator'; content = `
`; break; case 'oxygen-index': title = 'Oxygenation Index Calculator'; content = `
`; break; case 'ards-severity': title = 'ARDS Severity Calculator'; content = `
`; break; case 'cardiac-output': title = 'Cardiac Output/Index Calculator'; content = `
`; break; default: title = 'Calculator'; content = `
× ${title}
This calculator is under development. Please check back later.
`; break; } return content; } // Function to add event listeners to modal function addModalEventListeners(modal, type) { // Close modal when clicking on X const closeBtn = modal.querySelector('.close-modal'); closeBtn.addEventListener('click', function() { modal.style.display = 'none'; document.body.style.overflow = 'auto'; }); // Close modal when clicking outside of it window.addEventListener('click', function(event) { if (event.target === modal) { modal.style.display = 'none'; document.body.style.overflow = 'auto'; } }); // Tab functionality const tabs = modal.querySelectorAll('.tab'); tabs.forEach(tab => { tab.addEventListener('click', function() { const tabId = this.getAttribute('data-tab'); // Remove active class from all tabs and contents tabs.forEach(t => t.classList.remove('active')); const tabContents = modal.querySelectorAll('.tab-content'); tabContents.forEach(content => content.classList.remove('active')); // Add active class to clicked tab and corresponding content this.classList.add('active'); const activeContent = modal.querySelector(`#${tabId}-tab`); if (activeContent) { activeContent.classList.add('active'); } }); }); // Add calculator-specific functionality switch(type) { case 'bmi': setupBMICalculator(modal); break; case 'ibw': setupIBWCalculator(modal); break; case 'map': setupMAPCalculator(modal); break; case 'gcs': setupGCSCalculator(modal); break; case 'anion-gap': setupAnionGapCalculator(modal); break; case 'alveolar-gas': setupAlveolarGasCalculator(modal); break; case 'aa-gradient': setupAAGradientCalculator(modal); break; case 'pao2-fio2': setupPaO2FiO2Calculator(modal); break; case 'creatinine-clearance': setupCreatinineClearanceCalculator(modal); break; case 'asa': setupASACalculator(modal); break; case 'dead-space': setupDeadSpaceCalculator(modal); break; case 'shunt-fraction': setupShuntFractionCalculator(modal); break; case 'oxygen-index': setupOxygenIndexCalculator(modal); break; case 'ards-severity': setupARDSSeverityCalculator(modal); break; case 'cardiac-output': setupCardiacOutputCalculator(modal); break; } } // Setup BMI Calculator function setupBMICalculator(modal) { const calculateBtn = modal.querySelector('#calculate-bmi'); const resetBtn = modal.querySelector('#reset-bmi'); const resultBox = modal.querySelector('#bmi-result'); calculateBtn.addEventListener('click', function() { const height = parseFloat(modal.querySelector('#height').value); const heightUnit = modal.querySelector('#height-unit').value; const weight = parseFloat(modal.querySelector('#weight').value); const weightUnit = modal.querySelector('#weight-unit').value; if (isNaN(height) || isNaN(weight)) { alert('Please enter valid height and weight values'); return; } // Convert to metric if needed let heightInMeters = height; if (heightUnit === 'cm') { heightInMeters = height / 100; } else if (heightUnit === 'in') { heightInMeters = height * 0.0254; } else if (heightUnit === 'ft') { heightInMeters = height * 0.3048; } let weightInKg = weight; if (weightUnit === 'lb') { weightInKg = weight * 0.453592; } // Calculate BMI const bmi = weightInKg / (heightInMeters * heightInMeters); // Determine category let category = ''; if (bmi < 18.5) { category = 'Underweight'; } else if (bmi < 25) { category = 'Normal weight'; } else if (bmi < 30) { category = 'Overweight'; } else { category = 'Obesity'; } // Display result modal.querySelector('#bmi-value').textContent = bmi.toFixed(1); modal.querySelector('#bmi-category').textContent = category; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#height').value = ''; modal.querySelector('#weight').value = ''; resultBox.style.display = 'none'; }); } // Setup IBW Calculator function setupIBWCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-ibw'); const resetBtn = modal.querySelector('#reset-ibw'); const resultBox = modal.querySelector('#ibw-result'); calculateBtn.addEventListener('click', function() { const gender = modal.querySelector('#gender').value; const height = parseFloat(modal.querySelector('#ibw-height').value); const heightUnit = modal.querySelector('#ibw-height-unit').value; if (isNaN(height)) { alert('Please enter a valid height value'); return; } // Convert to cm if needed let heightInCm = height; if (heightUnit === 'in') { heightInCm = height * 2.54; } // Calculate IBW let ibw; if (gender === 'male') { ibw = 50 + 0.91 * (heightInCm - 152.4); } else { ibw = 45.5 + 0.91 * (heightInCm - 152.4); } // Display result modal.querySelector('#ibw-value').textContent = ibw.toFixed(1) + ' kg'; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#gender').selectedIndex = 0; modal.querySelector('#ibw-height').value = ''; resultBox.style.display = 'none'; }); } // Setup MAP Calculator function setupMAPCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-map'); const resetBtn = modal.querySelector('#reset-map'); const resultBox = modal.querySelector('#map-result'); calculateBtn.addEventListener('click', function() { const systolic = parseFloat(modal.querySelector('#systolic').value); const diastolic = parseFloat(modal.querySelector('#diastolic').value); if (isNaN(systolic) || isNaN(diastolic)) { alert('Please enter valid blood pressure values'); return; } // Calculate MAP const map = ((2 * diastolic) + systolic) / 3; // Determine interpretation let interpretation = ''; if (map < 60) { interpretation = 'Low - Inadequate tissue perfusion'; } else if (map <= 100) { interpretation = 'Normal'; } else { interpretation = 'High'; } // Display result modal.querySelector('#map-value').textContent = map.toFixed(1); modal.querySelector('#map-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#systolic').value = ''; modal.querySelector('#diastolic').value = ''; resultBox.style.display = 'none'; }); } // Setup GCS Calculator function setupGCSCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-gcs'); const resetBtn = modal.querySelector('#reset-gcs'); const resultBox = modal.querySelector('#gcs-result'); calculateBtn.addEventListener('click', function() { const eyeOpening = modal.querySelector('#eye-opening').value; const verbalResponse = modal.querySelector('#verbal-response').value; const motorResponse = modal.querySelector('#motor-response').value; if (eyeOpening === '' || verbalResponse === '' || motorResponse === '') { alert('Please select values for all components'); return; } // Calculate total GCS let totalGCS = 0; let severity = ''; if (eyeOpening !== 'NT') totalGCS += parseInt(eyeOpening); if (verbalResponse !== 'NT') totalGCS += parseInt(verbalResponse); if (motorResponse !== 'NT') totalGCS += parseInt(motorResponse); // Determine severity if (totalGCS <= 8) { severity = 'Severe'; } else if (totalGCS <= 12) { severity = 'Moderate'; } else { severity = 'Mild'; } // Display result modal.querySelector('#gcs-value').textContent = totalGCS; modal.querySelector('#gcs-severity').textContent = severity; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#eye-opening').selectedIndex = 0; modal.querySelector('#verbal-response').selectedIndex = 0; modal.querySelector('#motor-response').selectedIndex = 0; resultBox.style.display = 'none'; }); } // Setup Anion Gap Calculator function setupAnionGapCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-anion-gap'); const resetBtn = modal.querySelector('#reset-anion-gap'); const resultBox = modal.querySelector('#anion-gap-result'); calculateBtn.addEventListener('click', function() { const sodium = parseFloat(modal.querySelector('#sodium').value); const chloride = parseFloat(modal.querySelector('#chloride').value); const bicarbonate = parseFloat(modal.querySelector('#bicarbonate').value); if (isNaN(sodium) || isNaN(chloride) || isNaN(bicarbonate)) { alert('Please enter valid electrolyte values'); return; } // Calculate Anion Gap const anionGap = sodium - (chloride + bicarbonate); // Determine interpretation let interpretation = ''; if (anionGap < 8) { interpretation = 'Low - May indicate laboratory error, hypoalbuminemia, or multiple myeloma'; } else if (anionGap <= 16) { interpretation = 'Normal'; } else { interpretation = 'High - Suggests metabolic acidosis (lactic acidosis, ketoacidosis, renal failure, toxins)'; } // Display result modal.querySelector('#anion-gap-value').textContent = anionGap.toFixed(1); modal.querySelector('#anion-gap-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#sodium').value = ''; modal.querySelector('#chloride').value = ''; modal.querySelector('#bicarbonate').value = ''; resultBox.style.display = 'none'; }); } // Setup Alveolar Gas Equation Calculator function setupAlveolarGasCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-alveolar-gas'); const resetBtn = modal.querySelector('#reset-alveolar-gas'); const resultBox = modal.querySelector('#alveolar-gas-result'); calculateBtn.addEventListener('click', function() { const fio2 = parseFloat(modal.querySelector('#fio2').value); const paco2 = parseFloat(modal.querySelector('#paco2').value); const r = parseFloat(modal.querySelector('#r').value); if (isNaN(fio2) || isNaN(paco2) || isNaN(r)) { alert('Please enter valid values for all fields'); return; } // Constants const patm = 760; // Atmospheric pressure at sea level (mmHg) const ph2o = 47; // Water vapor pressure at 37°C (mmHg) // Calculate PAO2 using alveolar gas equation const pao2 = (fio2 * (patm - ph2o)) - (paco2 / r); // Display result modal.querySelector('#pao2-value').textContent = pao2.toFixed(1); resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#fio2').value = ''; modal.querySelector('#paco2').value = ''; modal.querySelector('#r').value = '0.8'; resultBox.style.display = 'none'; }); } // Setup A-a Gradient Calculator function setupAAGradientCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-aa-gradient'); const resetBtn = modal.querySelector('#reset-aa-gradient'); const resultBox = modal.querySelector('#aa-gradient-result'); calculateBtn.addEventListener('click', function() { const pao2 = parseFloat(modal.querySelector('#pao2-aa').value); const paco2 = parseFloat(modal.querySelector('#paco2-aa').value); const fio2 = parseFloat(modal.querySelector('#fio2-aa').value); const age = parseFloat(modal.querySelector('#age').value); if (isNaN(pao2) || isNaN(paco2) || isNaN(fio2) || isNaN(age)) { alert('Please enter valid values for all fields'); return; } // Constants const patm = 760; // Atmospheric pressure at sea level (mmHg) const ph2o = 47; // Water vapor pressure at 37°C (mmHg) const r = 0.8; // Respiratory quotient // Calculate PAO2 using alveolar gas equation const PAO2 = (fio2 * (patm - ph2o)) - (paco2 / r); // Calculate A-a gradient const aaGradient = PAO2 - pao2; // Calculate expected A-a gradient const expectedAA = (age / 4) + 4; // Determine interpretation let interpretation = ''; if (aaGradient <= expectedAA) { interpretation = 'Normal A-a gradient for age'; } else { interpretation = 'Increased A-a gradient - suggests problem with oxygenation'; } // Display result modal.querySelector('#aa-gradient-value').textContent = aaGradient.toFixed(1); modal.querySelector('#expected-aa-value').textContent = expectedAA.toFixed(1); modal.querySelector('#aa-gradient-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#pao2-aa').value = ''; modal.querySelector('#paco2-aa').value = ''; modal.querySelector('#fio2-aa').value = '0.21'; modal.querySelector('#age').value = ''; resultBox.style.display = 'none'; }); } // Setup PaO2/FiO2 Ratio Calculator function setupPaO2FiO2Calculator(modal) { const calculateBtn = modal.querySelector('#calculate-pao2-fio2'); const resetBtn = modal.querySelector('#reset-pao2-fio2'); const resultBox = modal.querySelector('#pao2-fio2-result'); calculateBtn.addEventListener('click', function() { const pao2 = parseFloat(modal.querySelector('#pao2-pf').value); const fio2 = parseFloat(modal.querySelector('#fio2-pf').value); const fio2Unit = modal.querySelector('#fio2-unit').value; if (isNaN(pao2) || isNaN(fio2)) { alert('Please enter valid values for all fields'); return; } // Convert FiO2 to fraction if in percentage let fio2Fraction = fio2; if (fio2Unit === 'percent') { fio2Fraction = fio2 / 100; } // Calculate P/F ratio const pfRatio = pao2 / fio2Fraction; // Determine interpretation let interpretation = ''; if (pfRatio > 400) { interpretation = 'Normal oxygenation'; } else if (pfRatio > 300) { interpretation = 'Mild hypoxemia'; } else if (pfRatio > 200) { interpretation = 'Moderate hypoxemia / Mild ARDS'; } else if (pfRatio > 100) { interpretation = 'Severe hypoxemia / Moderate ARDS'; } else { interpretation = 'Extreme hypoxemia / Severe ARDS'; } // Display result modal.querySelector('#pf-ratio-value').textContent = pfRatio.toFixed(0); modal.querySelector('#pf-ratio-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#pao2-pf').value = ''; modal.querySelector('#fio2-pf').value = ''; modal.querySelector('#fio2-unit').selectedIndex = 0; resultBox.style.display = 'none'; }); } // Setup Creatinine Clearance Calculator function setupCreatinineClearanceCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-creatinine-clearance'); const resetBtn = modal.querySelector('#reset-creatinine-clearance'); const resultBox = modal.querySelector('#creatinine-clearance-result'); calculateBtn.addEventListener('click', function() { const serumCreatinine = parseFloat(modal.querySelector('#serum-creatinine').value); const age = parseFloat(modal.querySelector('#age-cc').value); const weight = parseFloat(modal.querySelector('#weight-cc').value); const gender = modal.querySelector('#gender-cc').value; if (isNaN(serumCreatinine) || isNaN(age) || isNaN(weight)) { alert('Please enter valid values for all fields'); return; } // Calculate creatinine clearance using Cockcroft-Gault formula let crCl = ((140 - age) * weight) / (72 * serumCreatinine); // Adjust for gender if (gender === 'female') { crCl = crCl * 0.85; } // Determine interpretation let interpretation = ''; if (crCl > 90) { interpretation = 'Normal kidney function'; } else if (crCl > 60) { interpretation = 'Mildly decreased kidney function'; } else if (crCl > 30) { interpretation = 'Moderately decreased kidney function'; } else if (crCl > 15) { interpretation = 'Severely decreased kidney function'; } else { interpretation = 'Kidney failure'; } // Display result modal.querySelector('#creatinine-clearance-value').textContent = crCl.toFixed(1); modal.querySelector('#creatinine-clearance-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#serum-creatinine').value = ''; modal.querySelector('#age-cc').value = ''; modal.querySelector('#weight-cc').value = ''; modal.querySelector('#gender-cc').selectedIndex = 0; resultBox.style.display = 'none'; }); } // Setup ASA Physical Status Calculator function setupASACalculator(modal) { const showBtn = modal.querySelector('#show-asa-details'); const resetBtn = modal.querySelector('#reset-asa'); const resultBox = modal.querySelector('#asa-result'); showBtn.addEventListener('click', function() { const asaClass = modal.querySelector('#asa-class').value; const emergency = modal.querySelector('#emergency').value; if (asaClass === '') { alert('Please select an ASA class'); return; } // Get ASA description let description = ''; switch(asaClass) { case 'I': description = 'Normal healthy patient'; break; case 'II': description = 'Patient with mild systemic disease'; break; case 'III': description = 'Patient with severe systemic disease'; break; case 'IV': description = 'Patient with severe systemic disease that is a constant threat to life'; break; case 'V': description = 'Moribund patient who is not expected to survive without the operation'; break; case 'VI': description = 'Declared brain-dead patient whose organs are being removed for donor purposes'; break; } // Add emergency modifier if needed let classification = asaClass; if (emergency === 'yes') { classification += 'E'; } // Display result modal.querySelector('#asa-classification').textContent = classification; modal.querySelector('#asa-description').textContent = description; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#asa-class').selectedIndex = 0; modal.querySelector('#emergency').selectedIndex = 0; resultBox.style.display = 'none'; }); } // Setup Dead Space Calculator function setupDeadSpaceCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-dead-space'); const resetBtn = modal.querySelector('#reset-dead-space'); const resultBox = modal.querySelector('#dead-space-result'); calculateBtn.addEventListener('click', function() { const paco2 = parseFloat(modal.querySelector('#paco2-ds').value); const petco2 = parseFloat(modal.querySelector('#petco2').value); const tidalVolume = modal.querySelector('#tidal-volume').value; // Input validation if (isNaN(paco2) || isNaN(petco2)) { alert('Please enter valid values for PaCO2 and PetCO2'); return; } // Validate PaCO2 range (20-80 mmHg) if (paco2 < 20 || paco2 > 80) { alert('PaCO2 value is outside the realistic range (20-80 mmHg). Please check your input.'); return; } // Validate PetCO2 range (10-50 mmHg) if (petco2 < 10 || petco2 > 50) { alert('PetCO2 value is outside the realistic range (10-50 mmHg). Please check your input.'); return; } // Validate that PaCO2 > PetCO2 if (paco2 <= petco2) { alert('PaCO2 must be greater than PetCO2. Please check your input values.'); return; } // Calculate dead space fraction const deadSpaceFraction = (paco2 - petco2) / paco2; // Calculate dead space volume if tidal volume is provided let deadSpaceVolume = ''; if (tidalVolume !== '') { const tv = parseFloat(tidalVolume); // Validate tidal volume (100-1500 mL) if (isNaN(tv) || tv < 100 || tv > 1500) { alert('Tidal volume must be between 100 and 1500 mL. Please check your input.'); return; } deadSpaceVolume = (tv * deadSpaceFraction).toFixed(0) + ' mL'; } // Determine interpretation let interpretation = ''; if (deadSpaceFraction < 0.20) { interpretation = 'Low - May indicate measurement error or unusual physiological state'; } else if (deadSpaceFraction <= 0.35) { interpretation = 'Normal'; } else if (deadSpaceFraction <= 0.45) { interpretation = 'Mildly increased - May indicate early lung disease or mild V/Q mismatch'; } else if (deadSpaceFraction <= 0.60) { interpretation = 'Moderately increased - Suggests significant V/Q mismatch or lung disease'; } else { interpretation = 'Severely increased - Indicates severe V/Q mismatch, consider pulmonary embolism or ARDS'; } // Display results modal.querySelector('#dead-space-fraction').textContent = (deadSpaceFraction * 100).toFixed(1) + '%'; modal.querySelector('#dead-space-volume').textContent = deadSpaceVolume || 'Not calculated (tidal volume not provided)'; modal.querySelector('#dead-space-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#paco2-ds').value = ''; modal.querySelector('#petco2').value = ''; modal.querySelector('#tidal-volume').value = ''; resultBox.style.display = 'none'; }); } // Setup Shunt Fraction Calculator function setupShuntFractionCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-shunt-fraction'); const resetBtn = modal.querySelector('#reset-shunt-fraction'); const resultBox = modal.querySelector('#shunt-fraction-result'); calculateBtn.addEventListener('click', function() { const pao2 = parseFloat(modal.querySelector('#pao2-sf').value); const sao2 = parseFloat(modal.querySelector('#sao2').value); const hemoglobin = parseFloat(modal.querySelector('#hemoglobin').value); const paco2 = parseFloat(modal.querySelector('#paco2-sf').value); const fio2 = parseFloat(modal.querySelector('#fio2-sf').value); const mixedVenousO2 = parseFloat(modal.querySelector('#mixed-venous-o2').value); // Input validation if (isNaN(pao2) || isNaN(sao2) || isNaN(hemoglobin) || isNaN(paco2) || isNaN(fio2) || isNaN(mixedVenousO2)) { alert('Please enter valid values for all fields'); return; } // Validate PaO2 range (40-600 mmHg) if (pao2 < 40 || pao2 > 600) { alert('PaO2 value is outside the realistic range (40-600 mmHg). Please check your input.'); return; } // Validate SaO2 range (70-100%) if (sao2 < 70 || sao2 > 100) { alert('SaO2 value is outside the realistic range (70-100%). Please check your input.'); return; } // Validate hemoglobin range (5-20 g/dL) if (hemoglobin < 5 || hemoglobin > 20) { alert('Hemoglobin value is outside the realistic range (5-20 g/dL). Please check your input.'); return; } // Validate PaCO2 range (20-80 mmHg) if (paco2 < 20 || paco2 > 80) { alert('PaCO2 value is outside the realistic range (20-80 mmHg). Please check your input.'); return; } // Validate FiO2 range (0.21-1.0) if (fio2 < 0.21 || fio2 > 1.0) { alert('FiO2 value is outside the realistic range (0.21-1.0). Please check your input.'); return; } // Validate mixed venous O2 range (40-90%) if (mixedVenousO2 < 40 || mixedVenousO2 > 90) { alert('Mixed venous O2 value is outside the realistic range (40-90%). Please check your input.'); return; } // Constants const huffnerConstant = 1.34; // mL O2 per gram of hemoglobin const o2Solubility = 0.0031; // mL O2 per dL per mmHg const patm = 760; // Atmospheric pressure at sea level (mmHg) const ph2o = 47; // Water vapor pressure at 37°C (mmHg) const r = 0.8; // Respiratory quotient // Calculate PAO2 using alveolar gas equation const pao2Alveolar = (fio2 * (patm - ph2o)) - (paco2 / r); // Calculate oxygen contents // Arterial oxygen content (CaO2) const sao2Fraction = sao2 / 100; const cao2 = (hemoglobin * huffnerConstant * sao2Fraction) + (pao2 * o2Solubility); // Capillary oxygen content (CcO2) - assuming 100% saturation const cco2 = (hemoglobin * huffnerConstant * 1.0) + (pao2Alveolar * o2Solubility); // Mixed venous oxygen content (CvO2) const mixedVenousO2Fraction = mixedVenousO2 / 100; // Estimate PvO2 from SvO2 using a rough approximation let pvO2; if (mixedVenousO2 >= 70) { pvO2 = 40 + (mixedVenousO2 - 70) * 0.5; // Rough approximation } else { pvO2 = 30 + (mixedVenousO2 - 60) * 0.4; // Rough approximation } const cvo2 = (hemoglobin * huffnerConstant * mixedVenousO2Fraction) + (pvO2 * o2Solubility); // Calculate shunt fraction let shuntFraction; if (cco2 - cvo2 > 0) { shuntFraction = (cco2 - cao2) / (cco2 - cvo2); } else { alert('Unable to calculate shunt fraction. CcO2 must be greater than CvO2.'); return; } // Validate shunt fraction result if (shuntFraction < 0 || shuntFraction > 1) { alert('Calculated shunt fraction is outside the valid range (0-1). Please check your input values.'); return; } // Determine interpretation let interpretation = ''; if (shuntFraction < 0.03) { interpretation = 'Low - May indicate measurement error or unusual physiological state'; } else if (shuntFraction <= 0.05) { interpretation = 'Normal'; } else if (shuntFraction <= 0.10) { interpretation = 'Mildly increased - May indicate mild lung disease or early atelectasis'; } else if (shuntFraction <= 0.20) { interpretation = 'Moderately increased - Suggests significant lung pathology such as pneumonia, atelectasis, or ARDS'; } else { interpretation = 'Severely increased - Indicates severe intrapulmonary shunting, consider massive atelectasis, ARDS, or intracardiac shunt'; } // Display results modal.querySelector('#shunt-fraction-value').textContent = (shuntFraction * 100).toFixed(1) + '%'; modal.querySelector('#cao2-value').textContent = cao2.toFixed(2); modal.querySelector('#cco2-value').textContent = cco2.toFixed(2); modal.querySelector('#cvo2-value').textContent = cvo2.toFixed(2); modal.querySelector('#shunt-fraction-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#pao2-sf').value = ''; modal.querySelector('#sao2').value = ''; modal.querySelector('#hemoglobin').value = ''; modal.querySelector('#paco2-sf').value = ''; modal.querySelector('#fio2-sf').value = '0.21'; modal.querySelector('#mixed-venous-o2').value = '75'; resultBox.style.display = 'none'; }); } // Setup Oxygenation Index Calculator function setupOxygenIndexCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-oxygen-index'); const resetBtn = modal.querySelector('#reset-oxygen-index'); const resultBox = modal.querySelector('#oxygen-index-result'); calculateBtn.addEventListener('click', function() { const fio2 = parseFloat(modal.querySelector('#fio2-oi').value); const meanAirwayPressure = parseFloat(modal.querySelector('#mean-airway-pressure').value); const pao2 = parseFloat(modal.querySelector('#pao2-oi').value); // Input validation if (isNaN(fio2) || isNaN(meanAirwayPressure) || isNaN(pao2)) { alert('Please enter valid values for all fields'); return; } // Validate FiO2 range (0.21-1.0) if (fio2 < 0.21 || fio2 > 1.0) { alert('FiO2 value is outside the realistic range (0.21-1.0). Please check your input.'); return; } // Validate Mean Airway Pressure range (5-40 cmH2O) if (meanAirwayPressure < 5 || meanAirwayPressure > 40) { alert('Mean Airway Pressure value is outside the realistic range (5-40 cmH2O). Please check your input.'); return; } // Validate PaO2 range (40-500 mmHg) if (pao2 < 40 || pao2 > 500) { alert('PaO2 value is outside the realistic range (40-500 mmHg). Please check your input.'); return; } // Calculate Oxygenation Index const oxygenIndex = (fio2 * meanAirwayPressure * 100) / pao2; // Validate calculated OI if (oxygenIndex < 0 || oxygenIndex > 200) { alert('Calculated Oxygenation Index is outside the valid range (0-200). Please check your input values.'); return; } // Determine interpretation let interpretation = ''; if (oxygenIndex < 5) { interpretation = 'Normal - Adequate oxygenation with minimal support'; } else if (oxygenIndex <= 15) { interpretation = 'Mild respiratory failure - May respond to conventional ventilation strategies'; } else if (oxygenIndex <= 30) { interpretation = 'Moderate respiratory failure - May require advanced ventilatory strategies'; } else { interpretation = 'Severe respiratory failure - Consider ECMO or other rescue therapies'; } // Display results modal.querySelector('#oxygen-index-value').textContent = oxygenIndex.toFixed(1); modal.querySelector('#oxygen-index-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#fio2-oi').value = '0.21'; modal.querySelector('#mean-airway-pressure').value = ''; modal.querySelector('#pao2-oi').value = ''; resultBox.style.display = 'none'; }); } // Setup ARDS Severity Calculator function setupARDSSeverityCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-ards-severity'); const resetBtn = modal.querySelector('#reset-ards-severity'); const resultBox = modal.querySelector('#ards-severity-result'); calculateBtn.addEventListener('click', function() { const pao2 = parseFloat(modal.querySelector('#pao2-ards').value); const fio2 = parseFloat(modal.querySelector('#fio2-ards').value); const fio2Unit = modal.querySelector('#fio2-unit-ards').value; const peep = parseFloat(modal.querySelector('#peep').value); const timing = modal.querySelector('#timing').value; const cause = modal.querySelector('#cause').value; const cardiac = modal.querySelector('#cardiac').value; // Input validation if (isNaN(pao2) || isNaN(fio2) || isNaN(peep)) { alert('Please enter valid values for PaO2, FiO2, and PEEP'); return; } // Validate PaO2 range (40-500 mmHg) if (pao2 < 40 || pao2 > 500) { alert('PaO2 value is outside the realistic range (40-500 mmHg). Please check your input.'); return; } // Validate FiO2 range (0.21-1.0 or 21-100%) if (fio2 < 0.21 || fio2 > 1.0) { if (fio2Unit === 'percent' && (fio2 < 21 || fio2 > 100)) { alert('FiO2 value is outside the realistic range (21-100%). Please check your input.'); return; } else if (fio2Unit === 'fraction') { alert('FiO2 value is outside the realistic range (0.21-1.0). Please check your input.'); return; } } // Validate PEEP range (5-25 cmH2O) if (peep < 5 || peep > 25) { alert('PEEP value is outside the realistic range (5-25 cmH2O). Please check your input.'); return; } // Convert FiO2 to fraction if in percentage let fio2Fraction = fio2; if (fio2Unit === 'percent') { fio2Fraction = fio2 / 100; } // Calculate P/F ratio const pfRatio = pao2 / fio2Fraction; // Validate P/F ratio result if (pfRatio < 40 || pfRatio > 600) { alert('Calculated P/F ratio is outside the valid range (40-600). Please check your input values.'); return; } // Determine ARDS classification let ardsClassification = ''; let meetsBerlin = 'No'; let interpretation = ''; // Check if meets Berlin Definition criteria const timingAcute = timing === 'acute'; const respiratoryCause = cause === 'respiratory'; const cardiacNormal = cardiac === 'normal'; const peepAdequate = peep >= 5; if (timingAcute && respiratoryCause && cardiacNormal && peepAdequate) { if (pfRatio > 300) { ardsClassification = 'No ARDS'; meetsBerlin = 'No'; interpretation = 'Does not meet ARDS criteria. Consider other causes of respiratory failure.'; } else if (pfRatio > 200) { ardsClassification = 'Mild ARDS'; meetsBerlin = 'Yes'; interpretation = 'Meets criteria for mild ARDS. Mortality ~27%. Consider conventional lung-protective ventilation.'; } else if (pfRatio > 100) { ardsClassification = 'Moderate ARDS'; meetsBerlin = 'Yes'; interpretation = 'Meets criteria for moderate ARDS. Mortality ~32%. Consider higher PEEP, recruitment maneuvers, and prone positioning.'; } else { ardsClassification = 'Severe ARDS'; meetsBerlin = 'Yes'; interpretation = 'Meets criteria for severe ARDS. Mortality ~45%. Consider all advanced therapies including ECMO evaluation.'; } } else { ardsClassification = 'Cannot classify'; meetsBerlin = 'No'; interpretation = 'Does not meet all Berlin Definition criteria. '; if (!timingAcute) { interpretation += 'Onset is not acute. '; } if (!respiratoryCause) { interpretation += 'Primary cause may not be respiratory. '; } if (!cardiacNormal) { interpretation += 'Cardiac function may be impaired. '; } if (!peepAdequate) { interpretation += 'PEEP is inadequate (< 5 cmH2O). '; } interpretation += 'Consider alternative diagnoses or reassess when criteria are met.'; } // Display results modal.querySelector('#pf-ratio-ards').textContent = pfRatio.toFixed(0); modal.querySelector('#ards-classification').textContent = ardsClassification; modal.querySelector('#meets-berlin').textContent = meetsBerlin; modal.querySelector('#ards-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { modal.querySelector('#pao2-ards').value = ''; modal.querySelector('#fio2-ards').value = ''; modal.querySelector('#fio2-unit-ards').selectedIndex = 0; modal.querySelector('#peep').value = ''; modal.querySelector('#timing').selectedIndex = 0; modal.querySelector('#cause').selectedIndex = 0; modal.querySelector('#cardiac').selectedIndex = 0; resultBox.style.display = 'none'; }); } // Setup Cardiac Output Calculator function setupCardiacOutputCalculator(modal) { const calculateBtn = modal.querySelector('#calculate-cardiac-output'); const resetBtn = modal.querySelector('#reset-cardiac-output'); const resultBox = modal.querySelector('#cardiac-output-result'); const methodSelect = modal.querySelector('#co-method'); // Method content elements const fickMethod = modal.querySelector('#fick-method'); const thermodilutionMethod = modal.querySelector('#thermodilution-method'); const estimatedMethod = modal.querySelector('#estimated-method'); // Show/hide method content based on selection methodSelect.addEventListener('change', function() { const selectedMethod = this.value; fickMethod.style.display = selectedMethod === 'fick' ? 'block' : 'none'; thermodilutionMethod.style.display = selectedMethod === 'thermodilution' ? 'block' : 'none'; estimatedMethod.style.display = selectedMethod === 'estimated' ? 'block' : 'none'; }); calculateBtn.addEventListener('click', function() { const selectedMethod = methodSelect.value; let cardiacOutput = 0; let isValid = true; if (selectedMethod === 'fick') { const o2Consumption = parseFloat(modal.querySelector('#o2-consumption').value); const arterialO2 = parseFloat(modal.querySelector('#arterial-o2').value); const mixedVenousO2 = parseFloat(modal.querySelector('#mixed-venous-o2-co').value); // Input validation for Fick method if (isNaN(o2Consumption) || isNaN(arterialO2) || isNaN(mixedVenousO2)) { alert('Please enter valid values for all Fick method fields'); return; } if (o2Consumption < 100 || o2Consumption > 500) { alert('O2 consumption is outside the realistic range (100-500 mL/min)'); return; } if (arterialO2 < 10 || arterialO2 > 25) { alert('Arterial O2 content is outside the realistic range (10-25 mL/dL)'); return; } if (mixedVenousO2 < 8 || mixedVenousO2 > 20) { alert('Mixed venous O2 content is outside the realistic range (8-20 mL/dL)'); return; } if (arterialO2 <= mixedVenousO2) { alert('Arterial O2 content must be greater than mixed venous O2 content'); return; } // Calculate using Fick principle const aVDiff = arterialO2 - mixedVenousO2; cardiacOutput = o2Consumption / aVDiff / 10; // Convert to L/min } else if (selectedMethod === 'thermodilution') { const injectateVolume = parseFloat(modal.querySelector('#injectate-volume').value); const injectateTemp = parseFloat(modal.querySelector('#injectate-temp').value); const bloodTemp = parseFloat(modal.querySelector('#blood-temp').value); const areaUnderCurve = parseFloat(modal.querySelector('#area-under-curve').value); const calculationConstant = parseFloat(modal.querySelector('#calculation-constant').value); // Input validation for thermodilution method if (isNaN(injectateVolume) || isNaN(injectateTemp) || isNaN(bloodTemp) || isNaN(areaUnderCurve) || isNaN(calculationConstant)) { alert('Please enter valid values for all thermodilution method fields'); return; } if (injectateVolume < 5 || injectateVolume > 20) { alert('Injectate volume is outside the realistic range (5-20 mL)'); return; } if (injectateTemp < 0 || injectateTemp > 25) { alert('Injectate temperature is outside the realistic range (0-25°C)'); return; } if (bloodTemp < 35 || bloodTemp > 39) { alert('Blood temperature is outside the realistic range (35-39°C)'); return; } if (areaUnderCurve <= 0) { alert('Area under curve must be greater than 0'); return; } // Simplified thermodilution calculation const tempDifference = bloodTemp - injectateTemp; cardiacOutput = (injectateVolume * tempDifference * calculationConstant) / areaUnderCurve; } else if (selectedMethod === 'estimated') { const heartRate = parseFloat(modal.querySelector('#heart-rate').value); const systolicBP = parseFloat(modal.querySelector('#systolic-bp').value); const diastolicBP = parseFloat(modal.querySelector('#diastolic-bp').value); const bsa = parseFloat(modal.querySelector('#bsa').value); // Input validation for estimated method if (isNaN(heartRate) || isNaN(systolicBP) || isNaN(diastolicBP) || isNaN(bsa)) { alert('Please enter valid values for all estimated method fields'); return; } if (heartRate < 40 || heartRate > 180) { alert('Heart rate is outside the realistic range (40-180 bpm)'); return; } if (systolicBP < 70 || systolicBP > 250) { alert('Systolic BP is outside the realistic range (70-250 mmHg)'); return; } if (diastolicBP < 30 || diastolicBP > 150) { alert('Diastolic BP is outside the realistic range (30-150 mmHg)'); return; } if (systolicBP <= diastolicBP) { alert('Systolic BP must be greater than diastolic BP'); return; } if (bsa < 1.0 || bsa > 2.5) { alert('Body surface area is outside the realistic range (1.0-2.5 m²)'); return; } // Estimated cardiac output using a simplified formula // This is a rough estimation based on heart rate and blood pressure const map = (systolicBP + 2 * diastolicBP) / 3; cardiacOutput = (heartRate * map * 0.001) + 2.0; // Very rough estimation } // Validate cardiac output if (cardiacOutput < 1 || cardiacOutput > 15) { alert('Calculated cardiac output is outside the valid range (1-15 L/min). Please check your input values.'); return; } // Calculate cardiac index const bsa = parseFloat(modal.querySelector('#bsa').value) || 1.73; const cardiacIndex = cardiacOutput / bsa; // Determine interpretation let interpretation = ''; if (cardiacIndex < 1.5) { interpretation = 'Severely decreased - Indicates decompensated shock requiring immediate intervention'; } else if (cardiacIndex < 2.0) { interpretation = 'Moderately decreased - Often symptomatic, requires hemodynamic support'; } else if (cardiacIndex < 2.5) { interpretation = 'Mildly decreased - May be compensated, monitor closely'; } else if (cardiacIndex <= 4.2) { interpretation = 'Normal - Adequate cardiac output'; } else if (cardiacIndex <= 4.5) { interpretation = 'Mildly increased - May be normal in some conditions (e.g., pregnancy)'; } else { interpretation = 'Markedly increased - Suggests hyperdynamic state (e.g., sepsis, anemia, hyperthyroidism)'; } // Display results modal.querySelector('#co-value').textContent = cardiacOutput.toFixed(2); modal.querySelector('#ci-value').textContent = cardiacIndex.toFixed(2); modal.querySelector('#co-interpretation').textContent = interpretation; resultBox.style.display = 'block'; }); resetBtn.addEventListener('click', function() { // Reset all inputs modal.querySelectorAll('input').forEach(input => { if (input.type === 'number') { if (input.id === 'injectate-volume') input.value = '10'; else if (input.id === 'injectate-temp') input.value = '4'; else if (input.id === 'blood-temp') input.value = '37'; else if (input.id === 'calculation-constant') input.value = '1'; else if (input.id === 'bsa') input.value = '1.73'; else input.value = ''; } }); // Reset method selection methodSelect.selectedIndex = 0; fickMethod.style.display = 'block'; thermodilutionMethod.style.display = 'none'; estimatedMethod.style.display = 'none'; // Hide result box resultBox.style.display = 'none'; }); } });