(function($){'use strict';;;;const standardTanks=typeof aquariumCalc !=='undefined' ? aquariumCalc.standardTanks :[];let currentUnitsSystem='us';let isStandardTankMode=false;let lastSelectedTankData=null;let filterByTankSize=false;const CM_PER_INCH=2.54;const LITERS_PER_GALLON=3.78541;const LITERS_PER_CUBIC_CM=1000;const MM_PER_INCH=25.4;let metricValues={volume:10 * LITERS_PER_GALLON,length:0,width:0,height:0,substrateDepth:0};let grainSizeMM=4;$(document).ready(function(){initCalculator();$('#share-stocking-btn').on('click',shareState)});//==========SHARE FUNCTION (просто копирует URL страницы)==========function shareState(){let url=window.location.href.split('?')[0];// чистая ссылка без параметров let btn=$('#share-stocking-btn');let originalHtml=btn.html();if (navigator.clipboard){navigator.clipboard.writeText(url).then(function(){btn.html('✓ Copied!');setTimeout(function(){btn.html(originalHtml)},2000)}).catch(function(){prompt('Copy this link to share the calculator:',url)})}else{prompt('Copy this link to share the calculator:',url)}}//==========ВСЕ ОСТАЛЬНЫЕ ФУНКЦИИ БЕЗ ИЗМЕНЕНИЙ==========// (они такие же,как в предыдущей версии,но без restoreStateFromURL) function initCalculator(){if ($('#aquarium-calculator-container').length===0) return;let initialVolumeGal=parseFloat($('#tank-volume').val());if (!isNaN(initialVolumeGal) && initialVolumeGal>0){metricValues.volume=initialVolumeGal * LITERS_PER_GALLON}let lengthIn=parseFloat($('#tank-length').val());let widthIn=parseFloat($('#tank-width').val());let heightIn=parseFloat($('#tank-height').val());if (!isNaN(lengthIn) && lengthIn>0) metricValues.length=lengthIn * CM_PER_INCH;if (!isNaN(widthIn) && widthIn>0) metricValues.width=widthIn * CM_PER_INCH;if (!isNaN(heightIn) && heightIn>0) metricValues.height=heightIn * CM_PER_INCH;let depthIn=parseFloat($('#substrate-depth').val());if (!isNaN(depthIn) && depthIn>0) metricValues.substrateDepth=depthIn * CM_PER_INCH;grainSizeMM=parseFloat($('#substrate-grain-mm').val()) || 4;setupSpeciesFilter();setupSpeciesInfo();$('#add-species').on('click',addSpecies);$('#clear-all').on('click',clearAllSpecies);$('#toggle-advanced').on('click',function(){$('#advanced-settings-panel').slideToggle(200);$(this).toggleClass('active');calculateStocking()});$('#standard-tank-select').on('change',function(){const selected=$(this).find('option:selected');if (selected.val()){isStandardTankMode=true;const gallons=parseFloat(selected.val());const tankName=selected.data('name');let tankData=standardTanks.find(t=>t.gallons===gallons && t.name===tankName);if (!tankData){tankData={gallons:gallons,name:tankName,l_in:parseFloat(selected.data('l_in')),w_in:parseFloat(selected.data('w_in')),h_in:parseFloat(selected.data('h_in'))}}if (tankData && tankData.l_in && tankData.w_in && tankData.h_in){lastSelectedTankData=tankData;metricValues.volume=gallons * LITERS_PER_GALLON;metricValues.length=tankData.l_in * CM_PER_INCH;metricValues.width=tankData.w_in * CM_PER_INCH;metricValues.height=tankData.h_in * CM_PER_INCH;updateFieldsFromMetric();updateTankConfigSummary(true,tankName,gallons,tankData);applyFilters();calculateStocking()}}else{isStandardTankMode=false;lastSelectedTankData=null;updateTankConfigSummary(false);applyFilters();calculateStocking()}});$('#tank-length, #tank-width, #tank-height').on('input',function(){if (isStandardTankMode){$('#standard-tank-select').val('');isStandardTankMode=false;lastSelectedTankData=null}updateMetricFromDimensions();updateVolumeFromDimensions();updateFieldsFromMetric();updateTankConfigSummary();applyFilters();calculateStocking()});$('#tank-volume').on('input',function(){if (isStandardTankMode){$('#standard-tank-select').val('');isStandardTankMode=false;lastSelectedTankData=null}let volumeVal=parseFloat($(this).val());if (!isNaN(volumeVal) && volumeVal>0){metricValues.volume=(currentUnitsSystem==='us') ? volumeVal * LITERS_PER_GALLON:volumeVal}$('#tank-length, #tank-width, #tank-height').val('');metricValues.length=0;metricValues.width=0;metricValues.height=0;updateFieldsFromMetric();updateTankConfigSummary();applyFilters();calculateStocking()});$('input[name="units-system"]').on('change',function(){currentUnitsSystem=$(this).val();updateUnitLabels();updateGrainSizeDisplay();updateFieldsFromMetric();updateTankConfigSummary();applyFilters();calculateStocking()});$('#substrate-depth').on('input',function(){let depthVal=parseFloat($(this).val());if (!isNaN(depthVal) && depthVal>0){metricValues.substrateDepth=(currentUnitsSystem==='us') ? depthVal * CM_PER_INCH:depthVal}else{metricValues.substrateDepth=0}calculateStocking()});$('#substrate-type, #plants-density, #water-change, #filter-type, #filter-gph, #filter-overrated').on('change',function(){calculateStocking()});$('#substrate-grain-mm').on('input',function(){let val=parseFloat($(this).val());if (!isNaN(val) && val>0){grainSizeMM=val}else{grainSizeMM=4}calculateStocking()});$('#internal-filters, #external-filters').on('change',function(){calculateStocking()});$('#filter-water-type, #filter-animal-type, #filter-peaceful, #filter-plantsafe, #filter-beginner, #filter-by-tank-size').on('change',function(){applyFilters()});$('#species-search').on('input',function(){applyFilters()});updateUnitLabels();updateGrainSizeDisplay();updateFieldsFromMetric();applyFilters();calculateStocking()}function updateGrainSizeDisplay(){const $input=$('#substrate-grain-mm');const $label=$('#grain-unit-label');if (currentUnitsSystem==='us'){let inches=grainSizeMM / MM_PER_INCH;$input.val(inches.toFixed(2));$label.text('inches')}else{$input.val(grainSizeMM.toFixed(1));$label.text('mm')}}function updateFieldsFromMetric(){let volumeDisplay,lengthDisplay,widthDisplay,heightDisplay,depthDisplay;if (currentUnitsSystem==='us'){volumeDisplay=Math.round(metricValues.volume / LITERS_PER_GALLON);lengthDisplay=Math.round(metricValues.length / CM_PER_INCH);widthDisplay=Math.round(metricValues.width / CM_PER_INCH);heightDisplay=Math.round(metricValues.height / CM_PER_INCH);depthDisplay=(metricValues.substrateDepth / CM_PER_INCH).toFixed(1)}else{volumeDisplay=Math.round(metricValues.volume);lengthDisplay=Math.round(metricValues.length);widthDisplay=Math.round(metricValues.width);heightDisplay=Math.round(metricValues.height);depthDisplay=metricValues.substrateDepth.toFixed(1)}$('#tank-volume').val(volumeDisplay);$('#tank-length').val(lengthDisplay>0 ? lengthDisplay:'');$('#tank-width').val(widthDisplay>0 ? widthDisplay:'');$('#tank-height').val(heightDisplay>0 ? heightDisplay:'');$('#substrate-depth').val(depthDisplay>0 ? depthDisplay:'')}function updateMetricFromDimensions(){let lengthVal=parseFloat($('#tank-length').val());let widthVal=parseFloat($('#tank-width').val());let heightVal=parseFloat($('#tank-height').val());if (!isNaN(lengthVal) && lengthVal>0){metricValues.length=(currentUnitsSystem==='us') ? lengthVal * CM_PER_INCH:lengthVal}else{metricValues.length=0}if (!isNaN(widthVal) && widthVal>0){metricValues.width=(currentUnitsSystem==='us') ? widthVal * CM_PER_INCH:widthVal}else{metricValues.width=0}if (!isNaN(heightVal) && heightVal>0){metricValues.height=(currentUnitsSystem==='us') ? heightVal * CM_PER_INCH:heightVal}else{metricValues.height=0}}function updateVolumeFromDimensions(){if (metricValues.length>0 && metricValues.width>0 && metricValues.height>0){let volumeLiters=(metricValues.length * metricValues.width * metricValues.height) / LITERS_PER_CUBIC_CM;if (volumeLiters>0){metricValues.volume=volumeLiters;updateFieldsFromMetric()}}}function updateUnitLabels(){if (currentUnitsSystem==='us'){$('#volume-unit-label').text('gallons');$('#length-unit-label').text('inches');$('#width-unit-label').text('inches');$('#height-unit-label').text('inches');$('#depth-unit-label').text('inches');$('#space-calculated-unit').text('gal')}else{$('#volume-unit-label').text('liters');$('#length-unit-label').text('cm');$('#width-unit-label').text('cm');$('#height-unit-label').text('cm');$('#depth-unit-label').text('cm');$('#space-calculated-unit').text('L')}}function updateTankConfigSummary(isStandard,tankName,gallons,tankData){const $summary=$('#tank-config-summary');const $modeIcon=$('#config-mode-icon');const $modeText=$('#config-mode-text');const $details=$('#config-details');if (isStandard===undefined){if (isStandardTankMode && lastSelectedTankData){isStandard=true;tankData=lastSelectedTankData;tankName=tankData.name;gallons=tankData.gallons}else{isStandard=false}}if (isStandard && tankData){$summary.show();$modeIcon.text('📏');$modeText.text('Standard Tank');let dimensionsText='';if (currentUnitsSystem==='us'){dimensionsText=`${tankData.l_in}× ${tankData.w_in}× ${tankData.h_in}in`}else{const l_cm=Math.round(tankData.l_in * CM_PER_INCH);const w_cm=Math.round(tankData.w_in * CM_PER_INCH);const h_cm=Math.round(tankData.h_in * CM_PER_INCH);dimensionsText=`${l_cm}× ${w_cm}× ${h_cm}cm`}const volumeText=currentUnitsSystem==='us' ? `${gallons}gal` :`${Math.round(gallons * LITERS_PER_GALLON)}L`;$details.html(` <div><strong>Tank:</strong>${tankName}</div><div><strong>Volume:</strong>${volumeText}</div><div><strong>Dimensions:</strong>${dimensionsText}</div>`)}else{let displayVolume,volumeUnit;if (currentUnitsSystem==='us'){displayVolume=Math.round(metricValues.volume / LITERS_PER_GALLON);volumeUnit='gal'}else{displayVolume=Math.round(metricValues.volume);volumeUnit='L'}const length=metricValues.length;const width=metricValues.width;const height=metricValues.height;if (length>0 && width>0 && height>0){$summary.show();$modeIcon.text('⚙️');$modeText.text('Custom Dimensions');let dimsText;if (currentUnitsSystem==='us'){const l_in=Math.round(length / CM_PER_INCH);const w_in=Math.round(width / CM_PER_INCH);const h_in=Math.round(height / CM_PER_INCH);dimsText=`${l_in}× ${w_in}× ${h_in}in`}else{dimsText=`${Math.round(length)}× ${Math.round(width)}× ${Math.round(height)}cm`}$details.html(` <div><strong>Volume:</strong>${displayVolume}${volumeUnit}</div><div><strong>Dimensions:</strong>${dimsText}</div>`)}else{$summary.show();$modeIcon.text('⚙️');$modeText.text('Custom Volume');$details.html(` <div><strong>Volume:</strong>${displayVolume}${volumeUnit}</div><div><strong>Dimensions:</strong>Not provided</div>`)}}}function applyFilters(){const query=$('#species-search').val().toLowerCase().trim();const peacefulOnly=$('#filter-peaceful').is(':checked');const plantSafeOnly=$('#filter-plantsafe').is(':checked');const beginnerOnly=$('#filter-beginner').is(':checked');filterByTankSize=$('#filter-by-tank-size').is(':checked');const waterType=$('#filter-water-type').val();const animalType=$('#filter-animal-type').val();let volumeLiters=metricValues.volume;let filteredKeys=Object.keys(speciesData).filter(key=>{const s=speciesData[key];if (!s) return false;if (query !=='' && !s.name.toLowerCase().includes(query) && !s.scientific.toLowerCase().includes(query)) return false;if (peacefulOnly && !s.peaceful) return false;if (plantSafeOnly && s.plantSafe===false) return false;if (beginnerOnly && s.difficulty !=='beginner') return false;if (waterType !=='all'){if (waterType==='freshwater' && s.salinity !=='freshwater') return false;if (waterType==='brackish' && s.salinity !=='brackish') return false;if (waterType==='saltwater' && s.salinity !=='saltwater') return false;if (waterType==='terrestrial' && s.habitat==='aquatic') return false}if (animalType !=='all'){const type=s.type || 'other';if (type !==animalType) return false}if (filterByTankSize && s.minTankSize && volumeLiters>0 && volumeLiters < s.minTankSize) return false;return true});updateSpeciesDropdown(filteredKeys)}function updateSpeciesDropdown(filteredKeys){const $select=$('#species-select');;filteredKeys.forEach(key=>{const s=speciesData[key];const type=s.type || 'other';if (!groups[type]) groups[type]=[];groups[type].push({key,name:s.name,scientific:s.scientific})});$select.empty();if (filteredKeys.length===0){$select.append('<option disabled>No species match filters</option>')}else{for (const type in groups){const $group=$('<optgroup>').attr('label',type.charAt(0).toUpperCase()+type.slice(1));groups[type].forEach(s=>{const $option=$('<option>').val(s.key).text(`${s.name}(${s.scientific})`);$group.append($option)});$select.append($group)}}if ($select.val()){$select.trigger('change')}}function setupSpeciesFilter(){applyFilters()}function setupSpeciesInfo(){$('#species-select').on('change',function(){const key=$(this).val();if (!key){$('#species-info').hide();return}const s=speciesData[key];if (!s) return;let sizeHtml='';if (currentUnitsSystem==='us' && s.sizeIn){sizeHtml=`<li>📏 Size:${parseFloat(s.sizeIn).toFixed(1)}inches</li>`}else if (s.sizeCm){let sizeDisplay=currentUnitsSystem==='us' ? (parseFloat(s.sizeCm) / CM_PER_INCH).toFixed(1)+' inches' :parseFloat(s.sizeCm).toFixed(1)+' cm';sizeHtml=`<li>📏 Size:${sizeDisplay}</li>`}let infoHtml='<ul style="margin: 5px 0; padding-left: 20px;">';infoHtml+=sizeHtml;infoHtml+=s.difficulty==='advanced' ? '<li>🔧 Advanced care – needs specific conditions.</li>' :s.difficulty==='beginner' ? '<li>✅ Beginner friendly.</li>' :'<li>⚙️ Intermediate care.</li>';infoHtml+=s.plantSafe===false ? '<li>🌿 May damage or eat plants.</li>' :'<li>🌿 Safe with plants.</li>';infoHtml+=!s.peaceful ? '<li>⚠️ Can be aggressive towards other species.</li>' :'<li>😌 Generally peaceful.</li>';if (s.predator) infoHtml+='<li>🐟 May hunt small tank mates.</li>';if (s.finNipper) infoHtml+='<li>✂️ May nip fins of other fish.</li>';if (s.habitat !=='aquatic') infoHtml+='<li>🌊 Semi-terrestrial – requires land access.</li>';if (s.note) infoHtml+='<li>ℹ️ '+escapeHtml(s.note)+'</li>';infoHtml+='</ul>';let articleLink='';if (s.article_url && s.article_url.trim() !==''){articleLink=`<p><a href="${escapeHtml(s.article_url)}" target="_blank" rel="noopener noreferrer" class="guide-link">📖 Read full guide</a></p>`}$('#species-info-content').html(`<strong>${escapeHtml(s.name)}</strong><em style="color:#666; font-weight:normal;">(${escapeHtml(s.scientific)})</em>${infoHtml}${articleLink}`);$('#species-info').show()})}function addSpecies(){const key=$('#species-select').val();let count=parseInt($('#species-count').val());if (!key){alert('Please select a species');return}if (!count || count <=0){alert('Enter a valid count');return}selectedSpecies[key]=(selectedSpecies[key] || 0)+count;updateSpeciesList();calculateStocking()}function updateSpeciesList(){const $list=$('#selected-species-list');$list.empty();if (Object.keys(selectedSpecies).length===0){$list.html('<p class="no-data">No species added yet</p>');return}$.each(selectedSpecies,function(key,count){const s=speciesData[key];if (!s) return;let warnings=[];if (!s.peaceful) warnings.push('aggressive');if (s.predator) warnings.push('predator');if (s.finNipper) warnings.push('fin-nipper');if (s.plantSafe===false) warnings.push('plant-unsafe');if (s.habitat !=='aquatic') warnings.push('semi-terrestrial');if (s.shrimpSafe===false || s.shrimpSafe==='no' || s.shrimpSafe==='caution') warnings.push('eats shrimp');if (s.snailSafe===false || s.snailSafe==='no' || s.snailSafe==='caution') warnings.push('eats snails');if (s.urchinSafe===false || s.urchinSafe==='no' || s.urchinSafe==='caution') warnings.push('attacks urchins');if (s.starfishSafe===false || s.starfishSafe==='no' || s.starfishSafe==='caution') warnings.push('attacks starfish');if (s.coralSafe===false || s.coralSafe==='no' || s.coralSafe==='caution') warnings.push('attacks coral');const warningIcon=warnings.length ? '<span class="species-warnings" title="'+warnings.join(', ')+'">⚠️</span>' :'';const articleIcon=s.article_url && s.article_url.trim() !=='' ? `<a href="${escapeHtml(s.article_url)}" target="_blank" class="species-link" style="font-size: 1.4em; text-decoration: none; display: inline-block; vertical-align: middle;">📖</a>` :'';const actionsHtml=articleIcon ? `<div class="species-actions" style="display: flex; gap: 40px; align-items: center;">${articleIcon}<button class="remove-species" data-key="${escapeHtml(key)}">✕ Remove</button></div>` :`<button class="remove-species" data-key="${escapeHtml(key)}">✕ Remove</button>`;const $item=$('<div>',{class:'species-item'}).html('<div class="species-info-left">'+'<span class="species-name">'+escapeHtml(s.name)+warningIcon+'</span>'+'<div class="species-count-control">'+'<button class="species-count-dec" data-key="'+escapeHtml(key)+'">−</button>'+'<input type="number" class="species-count-input" data-key="'+escapeHtml(key)+'" value="'+count+'" min="1" step="1">'+'<button class="species-count-inc" data-key="'+escapeHtml(key)+'">+</button>'+'</div>'+'</div>'+'<div class="species-info-right">'+actionsHtml+'</div>');$list.append($item)});$('.species-count-dec').on('click',function(e){e.preventDefault();const key=$(this).data('key');let current=selectedSpecies[key] || 0;if (current>1){selectedSpecies[key]=current - 1;updateSpeciesList();calculateStocking()}});$('.species-count-inc').on('click',function(e){e.preventDefault();const key=$(this).data('key');selectedSpecies[key]=(selectedSpecies[key] || 0)+1;updateSpeciesList();calculateStocking()});$('.species-count-input').on('change',function(e){const key=$(this).data('key');let newVal=parseInt($(this).val());if (isNaN(newVal) || newVal < 1) newVal=1;selectedSpecies[key]=newVal;updateSpeciesList();calculateStocking()});$('.remove-species').on('click',function(){delete selectedSpecies[$(this).data('key')];updateSpeciesList();calculateStocking()})}function clearAllSpecies(){selectedSpecies={};updateSpeciesList();calculateStocking()}function calculateStocking(){let volumeLiters=metricValues.volume;let lengthCm=metricValues.length;let widthCm=metricValues.width;let heightCm=metricValues.height;let depthCm=metricValues.substrateDepth;if (volumeLiters <=0) return;let substrateType=$('#substrate-type').val();let plantsDensity=$('#plants-density').val();let waterChangePercent=parseFloat($('#water-change').val()) || 0;let filterType=$('#filter-type').val();let filterGph=parseFloat($('#filter-gph').val()) || 0;let filterOverrated=$('#filter-overrated').is(':checked');let volumeGallons=volumeLiters / LITERS_PER_GALLON;let substrateGrainMm=grainSizeMM;let internalFilters=parseInt($('#internal-filters').val()) || 0;let externalFilters=parseInt($('#external-filters').val()) || 0;$.ajax({url:aquariumCalc.ajaxUrl,type:'POST',data:{action:'calculate_stocking',nonce:aquariumCalc.nonce,volume_liters:volumeLiters,volume_gallons:volumeGallons,length_cm:lengthCm,width_cm:widthCm,height_cm:heightCm,substrate_type:substrateType,substrate_depth_cm:depthCm,plants_density:plantsDensity,water_change_percent:waterChangePercent,filter_type:filterType,filter_gph:filterGph,filter_overrated:filterOverrated,species:selectedSpecies,units_system:currentUnitsSystem,substrate_grain_mm:substrateGrainMm,internal_filters:internalFilters,external_filters:externalFilters},success:function(response){if (response.success){updateAnalysis(response.data)}else{console.error('Calculation failed',response)}},error:function(xhr,status,error){console.error('AJAX Error:',status,error)}})}function updateAnalysis(data){const isMetric=(data.units_system==='metric');updateTankConfigSummary();const $mixedWarning=$('#mixed-habitats-warning');if (data.parameters && data.parameters.mixed_habitats){$mixedWarning.show()}else{$mixedWarning.hide()}if (data.overall_status && data.overall_status.message){$('#overall-status-container').show();const $statusBox=$('#overall-status-box');const os=data.overall_status;let statusHtml='';if (os.status==='ok'){$statusBox.removeClass('error warning critical').addClass('success');statusHtml=os.message}else if (os.status==='warning'){$statusBox.removeClass('success error critical').addClass('warning');statusHtml=os.message}else if (os.status==='critical'){$statusBox.removeClass('success warning error').addClass('critical');statusHtml=os.message}$('#overall-status-message').html(statusHtml)}else{$('#overall-status-container').hide()}if (data.parameters.has_aquatic){if (data.parameters.temp.min !==null && data.parameters.temp.max !==null){let minC=data.parameters.temp.min,maxC=data.parameters.temp.max;if (minC>maxC) [minC,maxC]=[maxC,minC];if (isMetric){$('#temp-range').html(`${minC}°C – ${maxC}°C`)}else{let minF=(minC * 9/5+32).toFixed(0);let maxF=(maxC * 9/5+32).toFixed(0);$('#temp-range').html(`${minF}°F – ${maxF}°F`)}}else if (!data.parameters.temp.overlap){$('#temp-range').html('<span class="no-overlap">⚠ No overlap</span>')}else{$('#temp-range').html('<span class="no-data">N/A</span>')}if (data.parameters.ph.min !==null && data.parameters.ph.max !==null){let minPH=data.parameters.ph.min,maxPH=data.parameters.ph.max;if (minPH>maxPH) [minPH,maxPH]=[maxPH,minPH];$('#ph-range').text(`${minPH}– ${maxPH}`)}else if (!data.parameters.ph.overlap){$('#ph-range').html('<span class="no-overlap">⚠ No overlap</span>')}else{$('#ph-range').html('<span class="no-data">N/A</span>')}if (data.parameters.gh.min !==null && data.parameters.gh.max !==null){let minGH=data.parameters.gh.min,maxGH=data.parameters.gh.max;if (minGH>maxGH) [minGH,maxGH]=[maxGH,minGH];$('#gh-range').text(`${minGH}– ${maxGH}`)}else if (!data.parameters.gh.overlap){$('#gh-range').html('<span class="no-overlap">⚠ No overlap</span>')}else{$('#gh-range').html('<span class="no-data">N/A</span>')}}else{$('#temp-range').html('N/A');$('#ph-range').html('N/A');$('#gh-range').html('N/A')}const $waterWarnings=$('#water-params-warnings');$waterWarnings.empty();if (data.warnings_by_category && data.warnings_by_category.water_parameters){data.warnings_by_category.water_parameters.forEach(w=>{$waterWarnings.append('<div class="warning-item">'+escapeHtml(w)+'</div>')})}const bioload=data.bioload;if (bioload.applicable && bioload.level){const fill=$('#bioload-fill');fill.css('width',Math.min(bioload.percent, 100)+'%');let levelText='';let levelClass='';if (bioload.level==='low'){fill.css('background-color','#4CAF50');levelText=`🟢 Low bioload (${bioload.percent}%) - Filtration can handle more animals`;levelClass='bioload-level-low'}else if (bioload.level==='moderate'){fill.css('background-color','#FFC107');levelText=`🟡 Moderate bioload (${bioload.percent}%) - Monitor parameters regularly`;levelClass='bioload-level-moderate'}else if (bioload.level==='high'){fill.css('background-color','#FF9800');levelText=`🟠 High bioload (${bioload.percent}%) - Approaching capacity`;levelClass='bioload-level-high'}else if (bioload.level==='critical'){fill.css('background-color','#F44336');levelText=`🔴 Critical bioload (${bioload.percent}%) - Overstocked!`;levelClass='bioload-level-critical'}$('#bioload-level-indicator').text(levelText).removeClass('bioload-level-low bioload-level-moderate bioload-level-high bioload-level-critical').addClass(levelClass);if (bioload.filter_recommendation){$('#bioload-filter-recommendation').html('<div style="margin-top:10px; font-size:0.9em; color:#856404;">'+escapeHtml(bioload.filter_recommendation)+'</div>').show()}else{$('#bioload-filter-recommendation').hide()}if (bioload.filter_info){$('#bioload-filter-info').html('💡 '+escapeHtml(bioload.filter_info)).show()}else{$('#bioload-filter-info').hide()}$('.bioload-meter').show();$('#bioload-not-applicable-message').hide()}else{$('.bioload-meter').hide();$('#bioload-not-applicable-message').show().html('⚠️ '+escapeHtml(bioload.message || 'Bioload calculation is not applicable.'));$('#bioload-filter-recommendation').hide();$('#bioload-filter-info').hide()}const $bioloadWarnings=$('#bioload-warnings');$bioloadWarnings.empty();if (data.warnings_by_category && data.warnings_by_category.bioload){data.warnings_by_category.bioload.forEach(w=>{$bioloadWarnings.append('<div class="warning-item">'+escapeHtml(w)+'</div>')})}if (data.effective_volume_liters){$('#effective-volume-container').show();const effVol=isMetric ? data.effective_volume_liters.toFixed(1)+' L' :data.effective_volume_gallons.toFixed(1)+' gal';$('#effective-volume-value').text(effVol);if (data.effective_volume_reduction_percent && data.effective_volume_reduction_percent>0){$('#effective-volume-reduction').text(` (reduced by ${data.effective_volume_reduction_percent}%)`)}else{$('#effective-volume-reduction').text('')}if (data.effective_volume_warning){$('#effective-volume-warning').html('<div class="warning-item">'+escapeHtml(data.effective_volume_warning)+'</div>')}else{$('#effective-volume-warning').empty()}}else{$('#effective-volume-container').hide()}if (data.space_recommendation && data.space_recommendation.valid){const sr=data.space_recommendation;const $spaceBlock=$('.space-recommendation');$spaceBlock.show();$spaceBlock.removeClass('critical warning ok');const minVol=sr.min_volume_liters;const recVol=sr.recommended_volume_liters;const nominalVol=data.nominal_volume_liters || data.effective_volume_liters;const eps=0.5;if (nominalVol < minVol - eps){$spaceBlock.addClass('critical')}else if (nominalVol < recVol - eps || Math.abs(nominalVol - minVol) <=eps){$spaceBlock.addClass('warning')}else{$spaceBlock.addClass('ok')}if (isMetric){$('#space-calculated-volume').text(sr.min_volume_liters.toFixed(1))}else{$('#space-calculated-volume').text(sr.min_volume_gallons.toFixed(1))}let infoHtml='';if (nominalVol < minVol - eps){let recommendedVolume=isMetric ? sr.recommended_volume_liters.toFixed(1)+' L' :sr.recommended_volume_gallons.toFixed(1)+' gal';infoHtml=`<div><strong>Recommended tank size:</strong>${recommendedVolume}</div>`;infoHtml+=`<div>Your nominal tank volume (${isMetric ? nominalVol.toFixed(1)+' L':(nominalVol/3.78541).toFixed(1)+' gal'}) is below the minimum required.</div>`}else if (nominalVol < recVol - eps){let currentVolume=isMetric ? nominalVol.toFixed(1)+' L' :(nominalVol/3.78541).toFixed(1)+' gal';let recommendedVolume=isMetric ? sr.recommended_volume_liters.toFixed(1)+' L' :sr.recommended_volume_gallons.toFixed(1)+' gal';infoHtml=`<div>Your nominal tank volume (${currentVolume}) meets the minimum,but a larger tank (${recommendedVolume}) is recommended for better comfort.</div>`}else if (Math.abs(nominalVol - minVol) <=eps){let currentVolume=isMetric ? nominalVol.toFixed(1)+' L' :(nominalVol/3.78541).toFixed(1)+' gal';let recommendedVolume=isMetric ? sr.recommended_volume_liters.toFixed(1)+' L' :sr.recommended_volume_gallons.toFixed(1)+' gal';infoHtml=`<div>Your nominal tank volume (${currentVolume}) exactly meets the minimum,but a larger tank (${recommendedVolume}) is recommended for better comfort.</div>`}else{let currentVolume=isMetric ? nominalVol.toFixed(1)+' L' :(nominalVol/3.78541).toFixed(1)+' gal';infoHtml=`<div>Your nominal tank volume (${currentVolume}) is adequate.</div>`}$('#space-recommended-tanks').html(infoHtml);const $spaceMinBox=$('.space-calculated-minimum');if (nominalVol < minVol - eps){$spaceMinBox.css('border-left-color','#e74c3c').css('background','#f8d7da')}else if (nominalVol < recVol - eps || Math.abs(nominalVol - minVol) <=eps){$spaceMinBox.css('border-left-color','#ffc107').css('background','#fff3cd')}else{$spaceMinBox.css('border-left-color','#27ae60').css('background','#d4edda')}if (data.has_invert){const hintHtml='<div style="margin-top:10px; font-size:0.9em; color:#2c3e50;"><strong>💡 Tip:</strong> For shrimp, crabs, crayfish, and snails, long tanks (with larger footprint) are preferred over tall ones.</div>';if ($('#space-hint').length===0){$('.space-recommendation').append('<div id="space-hint"></div>')}$('#space-hint').html(hintHtml)}else{$('#space-hint').empty()}}else{$('.space-recommendation').hide()}const $spaceWarnings=$('#space-warnings');$spaceWarnings.empty();if (data.warnings_by_category && data.warnings_by_category.space){data.warnings_by_category.space.forEach(w=>{$spaceWarnings.append('<div class="warning-item">'+escapeHtml(w)+'</div>')})}if (data.swimming_zones){let zonesHtml='';for (const [zone,percent] of Object.entries(data.swimming_zones)){if (percent>0){zonesHtml+=`<div><strong>${zone.charAt(0).toUpperCase()+zone.slice(1)}:</strong>${percent}%</div>`}}$('#swimming-zones-display').html(zonesHtml || '—')}else{$('#swimming-zones-display').text('—')}const $compat=$('#compatibility-status');const $compatMsg=$('#compatibility-message');if (data.compatibility.status==='compatible'){$compat.removeClass('error').addClass('success');$compatMsg.html('✓ All species are compatible')}else{$compat.removeClass('success').addClass('error');$compatMsg.html('✗ Compatibility issues detected. See warnings below.')}const $compatWarnings=$('#compatibility-warnings');$compatWarnings.empty();if (data.warnings_by_category && data.warnings_by_category.compatibility){data.warnings_by_category.compatibility.forEach(w=>{$compatWarnings.append('<div class="warning-item">'+escapeHtml(w)+'</div>')})}const $otherWarnings=$('#other-warnings');$otherWarnings.empty();if (data.warnings_by_category && data.warnings_by_category.other){data.warnings_by_category.other.forEach(w=>{$otherWarnings.append('<div class="warning-item">'+escapeHtml(w)+'</div>')})}}function escapeHtml(text){if (typeof text !=='string') return text;return text.replace(/[&<>"']/g, function(m) {
        if (m === '&') return '&amp;';
        if (m === '<') return '&lt;';
        if (m === '>') return '&gt;';
        if (m === '"') return '&quot;';
        return '&#39;'})}})(jQuery);