document.addEventListener('DOMContentLoaded', function() { const internetBtn = document.getElementById('internetBtn'); const l2lBtn = document.getElementById('l2lBtn'); const internetForm = document.getElementById('internetForm'); const l2lForm = document.getElementById('l2lForm'); const calculateBtn = document.getElementById('calculateBtn'); const ipRangeInput = document.getElementById('ipRange'); const ipTableBody = document.getElementById('ipTableBody'); const ipTableContainer = document.getElementById('ipTableContainer'); const generateBtn = document.getElementById('generateBtn'); const outputContainer = document.getElementById('outputContainer'); const emailOutput = document.getElementById('emailOutput'); const copyBtn = document.getElementById('copyBtn'); // Toggle between service types internetBtn.addEventListener('click', function() { internetBtn.classList.add('bg-blue-600', 'text-white'); internetBtn.classList.remove('bg-gray-200', 'text-gray-800'); l2lBtn.classList.remove('bg-blue-600', 'text-white'); l2lBtn.classList.add('bg-gray-200', 'text-gray-800'); internetForm.classList.remove('hidden'); l2lForm.classList.add('hidden'); outputContainer.classList.add('hidden'); }); // Initialize Feather Icons feather.replace(); l2lBtn.addEventListener('click', function() { l2lBtn.classList.add('bg-blue-600', 'text-white'); l2lBtn.classList.remove('bg-gray-200', 'text-gray-800'); internetBtn.classList.remove('bg-blue-600', 'text-white'); internetBtn.classList.add('bg-gray-200', 'text-gray-800'); l2lForm.classList.remove('hidden'); internetForm.classList.add('hidden'); outputContainer.classList.add('hidden'); }); // Calculate IP addresses calculateBtn.addEventListener('click', function() { const ipRange = ipRangeInput.value.trim(); if (!ipRange) { alert('Please enter a valid IP range (e.g., 190.220.1.216/29)'); return; } try { const [baseIp, cidr] = ipRange.split('/'); const cidrNumber = parseInt(cidr); if (cidrNumber < 0 || cidrNumber > 32) { throw new Error('Invalid CIDR'); } const subnetMask = calculateSubnetMask(cidrNumber); const ipParts = baseIp.split('.').map(Number); const networkAddress = calculateNetworkAddress(ipParts, cidrNumber); const broadcastAddress = calculateBroadcastAddress(networkAddress, cidrNumber); // Clear previous results ipTableBody.innerHTML = ''; // Add network address row addTableRow('RED LAN', formatIp(networkAddress), subnetMask); // Calculate usable IPs (network +1 to broadcast -1) const startIp = [...networkAddress]; incrementIp(startIp); // Calculate the number of usable hosts const usableHosts = Math.pow(2, 32 - cidrNumber) - 2; // Add gateway (first usable IP) addTableRow('GATEWAY', formatIp(startIp), subnetMask); // Increment for next IP incrementIp(startIp); // Add available client IPs for (let i = 0; i < usableHosts - 1; i++) { if (formatIp(startIp) === formatIp(broadcastAddress)) break; addTableRow('DISPONIBLE CLIENTE', formatIp(startIp), subnetMask); incrementIp(startIp); } // Add broadcast address addTableRow('BROADCAST', formatIp(broadcastAddress), subnetMask); ipTableContainer.classList.remove('hidden'); } catch (error) { alert('Invalid IP range format. Please use format like 190.220.1.216/29'); console.error(error); } }); // Generate email template generateBtn.addEventListener('click', function() { if (internetBtn.classList.contains('bg-blue-600')) { generateInternetEmail(); } else { generateL2LEmail(); } outputContainer.classList.remove('hidden'); }); // Copy table to clipboard const copyTableBtn = document.getElementById('copyTableBtn'); copyTableBtn.addEventListener('click', function() { let tableText = 'Type\tIP Address\tSubnet Mask\n'; const rows = ipTableBody.querySelectorAll('tr'); rows.forEach(row => { const cells = row.querySelectorAll('td'); tableText += `${cells[0].textContent}\t${cells[1].textContent}\t${cells[2].textContent}\n`; }); navigator.clipboard.writeText(tableText).then(() => { const originalText = copyTableBtn.innerHTML; copyTableBtn.innerHTML = ' Copied!'; setTimeout(() => { copyTableBtn.innerHTML = originalText; feather.replace(); }, 2000); }); }); // Make sure calculate button works immediately calculateBtn.addEventListener('click', calculateIPs); function calculateIPs() { const ipRange = ipRangeInput.value.trim(); if (!ipRange) { alert('Please enter a valid IP range (e.g., 190.220.1.216/29)'); return; } try { const [baseIp, cidr] = ipRange.split('/'); const cidrNumber = parseInt(cidr); if (cidrNumber < 0 || cidrNumber > 32) { throw new Error('Invalid CIDR'); } const subnetMask = calculateSubnetMask(cidrNumber); const ipParts = baseIp.split('.').map(Number); const networkAddress = calculateNetworkAddress(ipParts, cidrNumber); const broadcastAddress = calculateBroadcastAddress(networkAddress, cidrNumber); // Clear previous results ipTableBody.innerHTML = ''; // Add network address row addTableRow('RED LAN', formatIp(networkAddress), subnetMask); // Calculate usable IPs (network +1 to broadcast -1) const startIp = [...networkAddress]; incrementIp(startIp); // Calculate the number of usable hosts const usableHosts = Math.pow(2, 32 - cidrNumber) - 2; // Add gateway (first usable IP) addTableRow('GATEWAY', formatIp(startIp), subnetMask); // Increment for next IP incrementIp(startIp); // Add available client IPs for (let i = 0; i < usableHosts - 1; i++) { if (formatIp(startIp) === formatIp(broadcastAddress)) break; addTableRow('DISPONIBLE CLIENTE', formatIp(startIp), subnetMask); incrementIp(startIp); } // Add broadcast address addTableRow('BROADCAST', formatIp(broadcastAddress), subnetMask); ipTableContainer.classList.remove('hidden'); } catch (error) { alert('Invalid IP range format. Please use format like 190.220.1.216/29'); console.error(error); } } // Copy email to clipboard copyBtn.addEventListener('click', function() { const textToCopy = emailOutput.textContent; navigator.clipboard.writeText(textToCopy).then(() => { const originalText = copyBtn.innerHTML; copyBtn.innerHTML = ' Copied!'; feather.replace(); setTimeout(() => { copyBtn.innerHTML = originalText; feather.replace(); }, 2000); }).catch(err => { console.error('Failed to copy text: ', err); copyBtn.innerHTML = ' Failed!'; feather.replace(); setTimeout(() => { copyBtn.innerHTML = originalText; feather.replace(); }, 2000); }); }); // Helper functions function addTableRow(type, ip, mask) { if (!ipTableBody) return; const row = document.createElement('tr'); row.innerHTML = `