document.addEventListener('DOMContentLoaded', function() { // Voltage Drop Calculator Elements const form = document.getElementById('calculator-form'); const cableContainer = document.getElementById('cable-container'); const addCableButton = document.getElementById('add-cable'); const calculateButton = document.querySelector('.btn-calculate'); let cableCount = 1; const maxCables = 3; // Function to check if all form fields are filled function checkFormValidity() { const isValid = form.checkValidity(); if (isValid) { calculateButton.disabled = false; calculateButton.classList.add('enabled'); } else { calculateButton.disabled = true; calculateButton.classList.remove('enabled'); } } // Function to update the IDs and names of the inputs in each cable group function updateCableGroupInputs() { const cableGroups = document.querySelectorAll('.cable-group'); cableGroups.forEach((group, index) => { group.querySelectorAll('input, select').forEach(input => { const baseName = input.name.split('[')[0]; // Get the base name without the index input.name = `${baseName}[${index}]`; input.id = `${baseName}-${index}`; // Update the id as well for accessibility }); group.querySelector('h2').textContent = `Cable ${index + 1}`; // Update the cable group title }); } // Function to copy values from the first cable group function copyInitialCableValues(newCableGroup) { const initialCableGroup = document.querySelector('.cable-group'); // Copy values from the initial cable group to the new cable group initialCableGroup.querySelectorAll('input, select').forEach((input, index) => { const correspondingInput = newCableGroup.querySelectorAll('input, select')[index]; correspondingInput.value = input.value; }); } // Function to update the visibility of the remove buttons function updateRemoveButtons() { const removeButtons = document.querySelectorAll('.btn-remove-cable'); removeButtons.forEach(button => { if (cableCount > 1) { button.style.display = 'inline-block'; } else { button.style.display = 'none'; } }); } // Add a new cable section addCableButton.addEventListener('click', function() { if (cableCount < maxCables) { const newCableGroup = document.querySelector('.cable-group').cloneNode(true); // Copy values from the initial cable group copyInitialCableValues(newCableGroup); // Append the new cable group to the container cableContainer.appendChild(newCableGroup); cableCount++; updateCableGroupInputs(); // Update IDs and titles updateRemoveButtons(); checkFormValidity(); } if (cableCount >= maxCables) { addCableButton.disabled = true; } }); // Remove a cable section cableContainer.addEventListener('click', function(event) { if (event.target.classList.contains('btn-remove-cable')) { if (cableCount > 1) { event.target.closest('.cable-group').remove(); cableCount--; updateCableGroupInputs(); // Update IDs and titles addCableButton.disabled = false; updateRemoveButtons(); checkFormValidity(); } } }); // Handle form submission for voltage drop calculator form.addEventListener('submit', async function(event) { event.preventDefault(); const formData = new FormData(form); const cablesData = []; // Iterate over the form data and collect all cables for (let i = 0; i < cableCount; i++) { const voltage = parseFloat(formData.get(`voltage[${i}]`)); const load = parseFloat(formData.get(`load[${i}]`)); const length = parseFloat(formData.get(`length[${i}]`)); const cable_type = formData.get(`cable_type[${i}]`); cablesData.push({ voltage, load, length, cable_type }); } console.log("Sending cables data:", cablesData); // Debugging line // Send the cables data to the backend const response = await fetch('/calculate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cables: cablesData }) }); if (response.ok) { const results = await response.json(); // Display the results let resultsHtml = ''; results.forEach((result, index) => { let remainingVoltage = cablesData[index].voltage - result.voltage_drop; // Ensure voltage doesn't go below 0 if (remainingVoltage < 0) remainingVoltage = 0; // Calculate the percentage drop const voltageDropPercentage = ((cablesData[index].voltage - remainingVoltage) / cablesData[index].voltage) * 100; // Determine the color based on the percentage drop let colorClass = ''; if (voltageDropPercentage > 10) { colorClass = 'red-text'; } else if (voltageDropPercentage > 5) { colorClass = 'orange-text'; } resultsHtml += `
Cable ${index + 1} Voltage: ${remainingVoltage.toFixed(2)} V
`; resultsHtml += `Voltage Drop: ${voltageDropPercentage.toFixed(2)}%
`; }); document.getElementById('result').innerHTML = resultsHtml; } else { console.error("Error:", response.statusText); } }); // Initially check the form validity and update buttons on page load form.addEventListener('input', checkFormValidity); checkFormValidity(); updateRemoveButtons(); });