Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Prossima revisione
Revisione precedente
docuneo:programma_npt [2025/07/29 17:47] – creata - modifica esterna 127.0.0.1docuneo:programma_npt [2025/08/11 15:34] (versione attuale) neoadmin
Linea 3: Linea 3:
     <meta charset="UTF-8">     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Programma NPT Neonatale v2.0 con BUN</title>+    <title>Programma NPT Neonatale v3.0 - Versione Unificata</title> 
 +    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script> 
 +    <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script> 
 +     
 +    <script> 
 +    // Simple Barcode Generator - CODE128 - Versione Embedded 
 +    window.SimpleBarcode = (function() { 
 +         
 +    // Patterns per CODE128 
 +    const patterns = { 
 +        '0': '11011001100', '1': '11001101100', '2': '11001100110', '3': '10010011000', '4': '10010001100', 
 +        '5': '10001001100', '6': '10011001000', '7': '10011000100', '8': '10001100100', '9': '11001001000', 
 +        '10': '11001000100', '11': '11000100100', '12': '10110011100', '13': '10011011100', '14': '10011001110', 
 +        '15': '10111001100', '16': '10011101100', '17': '10011100110', '18': '11001110010', '19': '11001011100', 
 +        '20': '11001001110', '21': '11011100100', '22': '11001110100', '23': '11101010000', '24': '11101000100', 
 +        '25': '11100010100', '26': '11100000110', '27': '11101100000', '28': '11100110000', '29': '11100001100', 
 +        '30': '11010011000', '31': '11010000110', '32': '11000110100', '33': '10100011000', '34': '10001011000', 
 +        '35': '10001000110', '36': '10110001000', '37': '10001101000', '38': '10001100010', '39': '11010001100', 
 +        '40': '11000101100', '41': '11000100110', '42': '10110111000', '43': '10110001110', '44': '10001101110', 
 +        '45': '10111011000', '46': '10111000110', '47': '10001110110', '48': '11101110110', '49': '11010001110', 
 +        '50': '11000101110', '51': '11011101000', '52': '11011100010', '53': '11011101110', '54': '11101011000', 
 +        '55': '11101000010', '56': '11100010010', '57': '11101101000', '58': '11101100010', '59': '11100011010', 
 +        '60': '11101111010', '61': '11001000010', '62': '11110001010', '63': '10100110000', '64': '10100001100', 
 +        '65': '10010110000', '66': '10010000110', '67': '10000101100', '68': '10000100110', '69': '10110010000', 
 +        '70': '10110000100', '71': '10011010000', '72': '10011000010', '73': '10000110100', '74': '10000110010', 
 +        '75': '11000010010', '76': '11001010000', '77': '11110111010', '78': '11000010100', '79': '10001111010', 
 +        '80': '10100111100', '81': '10010111100', '82': '10010011110', '83': '10111100100', '84': '10011110100', 
 +        '85': '10011110010', '86': '11110100100', '87': '11110010100', '88': '11110010010', '89': '11011011110', 
 +        '90': '11011110110', '91': '11110110110', '92': '10101111000', '93': '10100011110', '94': '10001011110', 
 +        '95': '10111101000', '96': '10111100010', '97': '11110101000', '98': '11110100010', '99': '10111011110', 
 +        '100': '10111101110', '101': '11101011110', '102': '11110101110', '103': '11010000100', '104': '11010010000',  
 +        '105': '11010011100', 'STOP': '1100011101011' 
 +    }; 
 +     
 +    function generateCode128(text) { 
 +        // START B (per caratteri ASCII normali) 
 +        let result = patterns['104']; 
 +        let checksum = 104; 
 +         
 +        // Aggiungi ogni carattere 
 +        for (let i = 0; i < text.length; i++) { 
 +            const charCode = text.charCodeAt(i) - 32; // ASCII offset 
 +            if (patterns[charCode.toString()]) { 
 +                result += patterns[charCode.toString()]; 
 +                checksum += charCode * (i + 1); 
 +            } 
 +        } 
 +         
 +        // Calcola e aggiungi checksum 
 +        checksum = checksum % 103; 
 +        result += patterns[checksum.toString()]; 
 +         
 +        // Aggiungi STOP 
 +        result += patterns['STOP']; 
 +         
 +        return result; 
 +    } 
 +     
 +    function drawBarcode(canvas, text, options = {}) { 
 +        const ctx = canvas.getContext('2d'); 
 +        const data = generateCode128(text); 
 +         
 +        // Opzioni default 
 +        const opts = { 
 +            width: options.width || 2, 
 +            height: options.height || 60, 
 +            margin: options.margin || 5, 
 +            background: options.background || '#ffffff', 
 +            lineColor: options.lineColor || '#000000' 
 +        }; 
 +         
 +        // Calcola dimensioni 
 +        const barWidth = opts.width; 
 +        const totalWidth = data.length * barWidth + (opts.margin * 2); 
 +        const totalHeight = opts.height + (opts.margin * 2); 
 +         
 +        // Imposta dimensioni canvas 
 +        canvas.width = totalWidth; 
 +        canvas.height = totalHeight; 
 +         
 +        // Pulisci canvas 
 +        ctx.clearRect(0, 0, totalWidth, totalHeight); 
 +         
 +        // Background 
 +        ctx.fillStyle = opts.background; 
 +        ctx.fillRect(0, 0, totalWidth, totalHeight); 
 +         
 +        // Disegna le barre 
 +        ctx.fillStyle = opts.lineColor; 
 +        let x = opts.margin; 
 +         
 +        for (let i = 0; i < data.length; i++) { 
 +            if (data[i] === '1') { 
 +                ctx.fillRect(x, opts.margin, barWidth, opts.height); 
 +            } 
 +            x += barWidth; 
 +        } 
 +         
 +        console.log('Codice a barre generato:', text); 
 +    } 
 +     
 +    return { 
 +        generate: drawBarcode 
 +    }; 
 +})(); 
 +</script> 
 +    
     <style>     <style>
 +        * {
 +            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif !important;
 +}
         body {         body {
-            font-family: Arial, sans-serif; +        font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; 
-            margin: 0; +        margin: 0; 
-            padding: 20px; +        padding: 20px; 
-            background-color: #f5f5f5; +        background-color: #f5f5f5; 
-        }+}
  
         .container {         .container {
Linea 22: Linea 131:
  
         h1 {         h1 {
 +           
 +    text-align: center;
 +    color: white;
 +    background: linear-gradient(135deg, #1e3c72 0%, #2a5298 50%, #16a085 100%);
 +    border: none;
 +    padding: 20px;
 +    border-radius: 10px;
 +    margin-bottom: 20px;
 +    text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
 +    position: relative;
 +    overflow: hidden;
 +}
 +
 +h1::before {
 +    content: "👶";
 +    font-size: 30px;
 +    position: absolute;
 +    left: 20px;
 +    top: 50%;
 +    transform: translateY(-50%);
 +}
 +        }
 +
 +        .version-info {
             text-align: center;             text-align: center;
-            color#2c3e50+            font-size12px
-            border-bottom3px solid #3498db+            color: #7f8c8d
-            padding-bottom: 10px;+            margin-bottom: 20px;
         }         }
  
Linea 165: Linea 298:
         }         }
  
-        .phase-transition {+        .phase-transizione {
             background-color: #fff3cd;             background-color: #fff3cd;
             color: #856404;             color: #856404;
         }         }
  
-        .phase-stabilization {+        .phase-stabilizzazione {
             background-color: #d1ecf1;             background-color: #d1ecf1;
             color: #0c5460;             color: #0c5460;
         }         }
  
-        .phase-growth {+        .phase-crescita {
             background-color: #d4edda;             background-color: #d4edda;
             color: #155724;             color: #155724;
Linea 213: Linea 346:
         }         }
  
-        /* CSS TAB ORIZZONTALI CORRETTO */+        /* CSS TAB ORIZZONTALI CORRETTI */
         .tabs {         .tabs {
             display: flex;             display: flex;
Linea 222: Linea 355:
  
         .tab {         .tab {
-            padding: 10px 20px;+            padding: 8px 15px;
             background-color: #ecf0f1;             background-color: #ecf0f1;
             border: 1px solid #ddd;             border: 1px solid #ddd;
Linea 230: Linea 363:
             transition: all 0.3s ease;             transition: all 0.3s ease;
             text-align: center;             text-align: center;
-            min-width: 120px;+            min-width: 100px;
             flex: 1;             flex: 1;
-            max-width: 200px;+            max-width: 160px; 
 +            font-size: 14px; 
 +            font-weight: bold; 
 +        } 
 +        .config-tab { 
 +        min-width: 50px !important; 
 +        max-width: 50px !important; 
 +        width: 50px !important; 
 +        flex: 0 0 50px !important; 
 +        font-size: 24px !important; 
 +        padding: 12px 8px !important; 
 +        transform: none !important; 
 +        } 
 + 
 +        .config-tab:hover { 
 +            background-color: #d5dbdb; 
 +            transform: none !important; 
 +        } 
 + 
 +        .config-tab.active { 
 +            background-color: #3498db; 
 +            color: white; 
 +            transform: none !important;
         }         }
  
Linea 337: Linea 492:
             text-align: left !important;             text-align: left !important;
         }         }
 +
 +        /* SEZIONE NUOVA PER TAB 5 CONFIGURAZIONE AVANZATA */
 +        .config-advanced {
 +            background-color: #f8f9fa;
 +            border: 2px solid #17a2b8;
 +            border-radius: 10px;
 +            padding: 20px;
 +            margin: 20px 0;
 +        }
 +
 +        .config-advanced h3 {
 +            color: #0c5460;
 +            margin-top: 0;
 +            border-bottom: 2px solid #17a2b8;
 +            padding-bottom: 10px;
 +        }
 +
 +        .monitoring-table {
 +            width: 100%;
 +            border-collapse: collapse;
 +            margin: 15px 0;
 +            font-size: 12px;
 +        }
 +
 +        .monitoring-table th, .monitoring-table td {
 +            border: 1px solid #17a2b8;
 +            padding: 8px;
 +            text-align: left;
 +        }
 +
 +        .monitoring-table th {
 +            background-color: #17a2b8;
 +            color: white;
 +        }
 +
 +        .alert-critical {
 +            background-color: #721c24;
 +            color: white;
 +            padding: 15px;
 +            border-radius: 5px;
 +            margin: 15px 0;
 +            font-weight: bold;
 +        }
 +
 +        /* REPORT SECTION */
 +        .report-output {
 +            border: 2px solid #3498db;
 +            border-radius: 10px;
 +            padding: 30px;
 +            margin-top: 30px;
 +            background-color: white;
 +            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
 +            line-height: 1.6;
 +        }
 +
 +        .medical-header {
 +            text-align: center;
 +            border-bottom: 3px solid #2c3e50;
 +            padding-bottom: 15px;
 +            margin-bottom: 25px;
 +        }
 +
 +        .medical-header h1 {
 +            font-size: 24px;
 +            color: #2c3e50;
 +            margin: 5px 0;
 +        }
 +
 +        .medical-header h2 {
 +            font-size: 18px;
 +            color: #34495e;
 +            margin: 3px 0;
 +        }
 +
 +        .medical-header p {
 +            font-size: 14px;
 +            color: #7f8c8d;
 +            margin: 2px 0;
 +        }
 +
 +        .no-print { 
 +            display: block; 
 +        }
 +
 +        @media print {
 +            .no-print { 
 +                display: none !important; 
 +            }
 +            body { 
 +                background: white; 
 +            }
 +            .container { 
 +                box-shadow: none; 
 +            }
 +        
 +            
 +        }
 +
 +         /* NUOVA INTESTAZIONE MEDICA ASST LECCO */
 +        .medical-header-table {
 +    width: 100%;
 +    border-collapse: collapse;
 +    border: 2px solid #2c3e50;
 +    margin-bottom: 25px;
 +        }       
 +
 +.medical-header-table td {
 +    border: 1px solid #2c3e50;
 +    padding: 10px;
 +    vertical-align: top;
 +}
 +
 +.medical-header-left {
 +    width: 45%;
 +    background-color: #f8f9fa;
 +}
 +
 +.medical-header-center {
 +    width: 30%;
 +    text-align: center;
 +    background-color: #f8f9fa;
 +}
 +
 +.medical-header-right {
 +    width: 25%;
 +    text-align: center;
 +    background-color: #f8f9fa;
 +}
 +
 +.medical-header-left h2 {
 +    font-size: 14px;
 +    font-weight: bold;
 +    color: #2c3e50;
 +    margin: 0 0 5px 0;
 +}
 +
 +.medical-header-left h3 {
 +    font-size: 12px;
 +    color: #34495e;
 +    margin: 0 0 5px 0;
 +}
 +
 +.medical-header-left p {
 +    font-size: 11px;
 +    color: #7f8c8d;
 +    margin: 0;
 +}          
 +
 +/* NUOVA INTESTAZIONE MEDICA ASST LECCO */
 +.medical-header-table {
 +    width: 100%;
 +    border-collapse: collapse;
 +    border: 2px solid #2c3e50;
 +    margin-bottom: 25px;
 +}
 +
 +.medical-header-table td {
 +    border: 1px solid #2c3e50;
 +    padding: 10px;
 +    vertical-align: top;
 +}
 +
 +.medical-header-left {
 +    width: 45%;
 +    background-color: #f8f9fa;
 +}
 +
 +.medical-header-center {
 +    width: 30%;
 +    text-align: center;
 +    background-color: #f8f9fa;
 +}
 +
 +.medical-header-right {
 +    width: 25%;
 +    text-align: center;
 +    background-color: #f8f9fa;
 +}
 +
 +.medical-header-left h2 {
 +    font-size: 14px;
 +    font-weight: bold;
 +    color: #2c3e50;
 +    margin: 0 0 5px 0;
 +}
 +
 +.medical-header-left h3 {
 +    font-size: 12px;
 +    color: #34495e;
 +    margin: 0 0 5px 0;
 +}
 +
 +.medical-header-left p {
 +    font-size: 11px;
 +    color: #7f8c8d;
 +    margin: 0;
 +}
 +
 +/* STILI KNOWLEDGE BASE */
 +.knowledge-section {
 +    display: none;
 +}
 +
 +.knowledge-section.active {
 +    display: block;
 +}
 +
 +.knowledge-tooltip {
 +    position: absolute;
 +    background-color: #2c3e50;
 +    color: white;
 +    padding: 10px;
 +    border-radius: 5px;
 +    font-size: 12px;
 +    max-width: 300px;
 +    z-index: 1000;
 +    box-shadow: 0 2px 10px rgba(0,0,0,0.3);
 +    animation: fadeIn 0.3s ease-in-out;
 +}
 +
 +@keyframes fadeIn {
 +    from { opacity: 0; transform: translateY(-10px); }
 +    to { opacity: 1; transform: translateY(0); }
 +}
 +
 +.knowledge-section h3 {
 +    color: #2c3e50;
 +    border-bottom: 2px solid #3498db;
 +    padding-bottom: 8px;
 +    margin-bottom: 15px;
 +}
 +
 +.knowledge-section h4 {
 +    color: #34495e;
 +    margin-top: 20px;
 +    margin-bottom: 10px;
 +}
 +
 +/* STILI SPECIFICI PER ETICHETTA SACCA */
 +.label-section {
 +    border: 3px solid #2c3e50;
 +    background-color: #f8f9fa;
 +    padding: 15px;
 +    margin: 15px 0;
 +    border-radius: 8px;
 +}
 +
 +.label-patient-id {
 +    border: 4px solid #d32f2f;
 +    background-color: #ffebee;
 +    padding: 15px;
 +    margin: 15px 0;
 +    text-align: center;
 +    border-radius: 8px;
 +}
 +
 +.label-content {
 +    border: 3px solid #388e3c;
 +    background-color: #e8f5e8;
 +    padding: 15px;
 +    margin: 15px 0;
 +    border-radius: 8px;
 +}
 +
 +.label-header {
 +    text-align: center;
 +    border-bottom: 3px solid #000;
 +    padding-bottom: 10px;
 +    margin-bottom: 15px;
 +}
 +
 +.label-volume-total {
 +    background-color: #4caf50;
 +    color: white;
 +    font-weight: bold;
 +    font-size: 16px;
 +}
 +
     </style>     </style>
 </head> </head>
Linea 342: Linea 775:
  
 <div class="container"> <div class="container">
-    <h1>Programma NPT Neonatale v2.0</h1>+    <h1>Gestione della Nutrizione del Neonato (GNN v3.0)</h1
 +   <div class="version-info"> 
 +    <strong>Sistema:</strong> GNN (Gestione Nutrizione Neonato) v3.0 | <strong>Data creazione:</strong> 02 Agosto 2025 | <strong>Ora:</strong> 20:00 | <strong>Modulo:</strong> Calcolo NPT Integrato 
 +</div>
          
     <!-- TAB ORIZZONTALI CORRETTI -->     <!-- TAB ORIZZONTALI CORRETTI -->
     <div class="tabs">     <div class="tabs">
-        <div class="tab active" onclick="showTab('patient-data')"> +    <div class="tab active" onclick="showTab('patient-data')"> 
-            <span style="font-size: 18px;">1</span><br>Dati Paziente +        <span style="font-size: 20px; font-weight: bold;">1</span><br>Dati Paziente 
-        </div> +    </div> 
-        <div class="tab" onclick="showTab('enteral')"> +     
-            <span style="font-size: 18px;">2</span><br>Nutrizione Enterale +    <!-- SEZIONE CONFIGURAZIONE COMPONENTI (DA VERSIONE 17) --> 
-        </div> +    <div class="tab" onclick="showTab('enteral')"> 
-        <div class="tab" onclick="showTab('nutrition-calc')"> +        <span style="font-size: 20px; font-weight: bold;">2</span><br>Nutrizione Enterale 
-            <span style="font-size: 18px;">3</span><br>Calcolo Fabbisogni +    </div> 
-        </div> +    <div class="tab" onclick="showTab('nutrition-calc')"> 
-        <div class="tab" onclick="showTab('parenteral')"> +        <span style="font-size: 20px; font-weight: bold;">3</span><br>Calcolo Fabbisogni 
-            <span style="font-size: 18px;">4</span><br>Nutrizione Parenterale +    </div> 
-        </div> +    <div class="tab" onclick="showTab('parenteral')"> 
-        <div class="tab" onclick="showTab('config')"> +        <span style="font-size: 20px; font-weight: bold;">4</span><br>Nutrizione Parenterale 
-            <span style="font-size: 18px;">5</span><br>Configurazione +    </div> 
-        </div>+    <div class="tab" onclick="showTab('report')"> 
 +        <span style="font-size: 20px; font-weight: bold;">5</span><br>Report Finale 
 +    </div> 
 +    <div class="tab" onclick="showTab('knowledge-base')"> 
 +        <span style="font-size: 20px; font-weight: bold;">📚</span><br>Knowledge Base 
 +    </div> 
 +    <div class="tab" onclick="showTab('config')" style="max-width: 60px; min-width: 60px;"> 
 +        <span style="font-size: 24px;">⚙️</span> 
 +    </div>
     </div>     </div>
  
-    <!-- TAB 1: DATI PAZIENTE -->+    <!-- TAB 1: DATI PAZIENTE (VERSIONE 17 ORIGINALE) -->
     <div id="patient-data" class="tab-content active">     <div id="patient-data" class="tab-content active">
-        <div class="info"> +       <div class="info"> 
-            <strong>PASSO 1 - DATI PAZIENTE</strong><br> +    <strong>PASSO 1 - DATI PAZIENTE</strong><br> 
-            <strong>Obiettivo:</strong> Inserire i dati antropometrici ed ematochimici del neonato+    <strong>Sistema GNN:</strong> Gestione integrata della nutrizione neonatale con calcolo automatico dei fabbisogni<br> 
 +    <strong>Obiettivo:</strong> Inserire i dati antropometrici ed ematochimici del neonato per determinare la strategia nutrizionale ottimale 
 +</div> 
 +        <div class="section"> 
 +            <h2>Dati Prescrizione</h2> 
 +            <div class="form-row"> 
 +                <div class="form-col"> 
 +                    <div class="input-group"> 
 +                        <label for="prescriptionDate">Data di prescrizione:</label> 
 +                        <input type="date" id="prescriptionDate" style="width: 180px;"> 
 +                    </div> 
 +                    <div class="input-group"> 
 +                        <label for="prescribingDoctor">Medico prescrittore:</label> 
 +                        <select id="prescribingDoctor" style="width: 200px;"> 
 +                            <!-- Popolato dinamicamente --> 
 +                        </select> 
 +                    </div> 
 +                </div> 
 +                <div class="form-col"> 
 +                    <div class="info" style="margin-top: 0; font-size: 13px;"> 
 +                        <strong>Info Prescrizione:</strong><br> 
 +                        • La data viene impostata automaticamente ad oggi<br> 
 +                        • Selezionare il medico responsabile della prescrizione<br> 
 +                        • Questi dati appariranno nel riepilogo finale 
 +                    </div> 
 +                </div> 
 +            </div>
         </div>         </div>
 +        
         <div class="section">         <div class="section">
             <h2>Dati Paziente</h2>             <h2>Dati Paziente</h2>
             <div class="form-row">             <div class="form-row">
                 <div class="form-col">                 <div class="form-col">
 +                    <div class="input-group">
 +                        <label for="medicalRecord">N° Cartella Clinica:</label>
 +                        <input type="text" id="medicalRecord" maxlength="10" placeholder="2025000001" style="width: 120px; font-family: monospace;">
 +                    </div>
                     <div class="input-group">                     <div class="input-group">
                         <label for="birthWeight">Peso alla nascita (g):</label>                         <label for="birthWeight">Peso alla nascita (g):</label>
Linea 385: Linea 860:
                         <input type="number" id="daysOfLife" min="1" max="365" value="9">                         <input type="number" id="daysOfLife" min="1" max="365" value="9">
                     </div>                     </div>
 +
 +                    <div class="input-group">
 +                <label for="gestationalAge">Età gestazionale:</label>
 +                <div style="display: flex; align-items: center; gap: 5px;">
 +                    <input type="number" id="gestationalWeeks" min="22" max="45" placeholder="36" style="width: 60px;">
 +                    <span>sett.</span>
 +                    <input type="number" id="gestationalDays" min="0" max="6" placeholder="3" style="width: 50px;">
 +                    <span>gg.</span>
 +                    <span style="margin-left: 10px; font-size: 12px; color: #666;">(es: 36+3)</span>
 +                </div>
 +            </div>
 +
 +            <div class="input-group">
 +            <label for="postConceptionalAge">Età post-concezionale:</label>
 +            <div style="display: flex; align-items: center; gap: 5px;">
 +                <input type="text" id="postConceptionalAge" readonly style="width: 120px; background-color: #f0f0f0; font-weight: bold;" placeholder="Calcolata automaticamente">
 +                <span style="font-size: 12px; color: #666;">(età gest. + giorni di vita)</span>
 +            </div>
 +</div>
 +
 +
 +
 +
 +
                 </div>                 </div>
                 <div class="form-col">                 <div class="form-col">
Linea 402: Linea 901:
                         <label for="ph">pH ematico:</label>                         <label for="ph">pH ematico:</label>
                         <input type="number" id="ph" min="7.0" max="7.6" step="0.01" placeholder="7.35-7.45 normale">                         <input type="number" id="ph" min="7.0" max="7.6" step="0.01" placeholder="7.35-7.45 normale">
 +                    </div>
 +                    <div class="input-group">
 +                        <label for="baseExcess">BE - Base Excess (mEq/L):</label>
 +                        <input type="number" id="baseExcess" min="-15" max="10" step="0.1" placeholder="-4 +2 normale">
                     </div>                     </div>
                     <div class="input-group">                     <div class="input-group">
Linea 413: Linea 916:
                         <strong>Natremia:</strong> 135-145 mEq/L<br>                         <strong>Natremia:</strong> 135-145 mEq/L<br>
                         <strong>pH:</strong> 7.35-7.45<br>                         <strong>pH:</strong> 7.35-7.45<br>
 +                        <strong>BE:</strong> -4 a +2 mEq/L<br>
                         <strong>Diuresi:</strong> 1-3 mL/kg/die                         <strong>Diuresi:</strong> 1-3 mL/kg/die
                     </div>                     </div>
Linea 427: Linea 931:
     </div>     </div>
  
-    <!-- TAB 2: NUTRIZIONE ENTERALE -->+    <!-- TAB 2: NUTRIZIONE ENTERALE (VERSIONE 17 ORIGINALE) -->
     <div id="enteral" class="tab-content">     <div id="enteral" class="tab-content">
         <div class="info">         <div class="info">
Linea 517: Linea 1021:
             </div>             </div>
  
-            <button id="calculateEnteralBtn" class="button" onclick="calculateEnteral()">Calcola Apporti Enterali</button>+            <button id="calculateEnteralBtn" class="button calculate-nutrition-pending" onclick="calculateEnteral()">Calcola Apporti Enterali</button>
         </div>         </div>
  
Linea 526: Linea 1030:
     </div>     </div>
  
-    <!-- TAB 3: CALCOLO FABBISOGNI -->+    <!-- TAB 3: CALCOLO FABBISOGNI (VERSIONE 17 ORIGINALE COMPLETA) -->
     <div id="nutrition-calc" class="tab-content">     <div id="nutrition-calc" class="tab-content">
         <div class="info">         <div class="info">
Linea 566: Linea 1070:
                     </div>                     </div>
                     <div class="input-group">                     <div class="input-group">
-                        <label for="reqCarbs">Carboidrati (g/kg/die):</label>+                        <label for="carbUnit">Unità glucidi:</label> 
 +                        <select id="carbUnit" onchange="updateCarbUnit()"> 
 +                            <option value="g">g/kg/die</option> 
 +                            <option value="mg">mg/kg/min</option> 
 +                        </select> 
 +                    </div> 
 +                    <div class="input-group"> 
 +                        <label for="reqCarbs" id="carbLabel">Glucidi (g/kg/die):</label>
                         <input type="number" id="reqCarbs" min="0" max="20" step="0.1" value="6.0">                         <input type="number" id="reqCarbs" min="0" max="20" step="0.1" value="6.0">
                     </div>                     </div>
Linea 576: Linea 1087:
                 <div class="form-col">                 <div class="form-col">
                     <div class="input-group">                     <div class="input-group">
-                        <label for="reqCalcium">Calcio (mg/kg/die):</label>+                        <label for="reqCalcium">Calcio elementare (mg/kg/die):</label>
                         <input type="number" id="reqCalcium" min="0" max="200" step="5" value="0">                         <input type="number" id="reqCalcium" min="0" max="200" step="5" value="0">
                     </div>                     </div>
Linea 584: Linea 1095:
                     </div>                     </div>
                     <div class="input-group">                     <div class="input-group">
-                        <label for="reqMagnesium">Magnesio (mg/kg/die):</label> +                        <label for="reqMagnesium">Magnesio (mEq/kg/die):</label> 
-                        <input type="number" id="reqMagnesium" min="0" max="50" step="1" value="0">+                        <input type="number" id="reqMagnesium" min="0" max="10" step="0.1" value="0">
                     </div>                     </div>
                     <div class="input-group">                     <div class="input-group">
                         <label for="reqSodium">Sodio (mEq/kg/die):</label>                         <label for="reqSodium">Sodio (mEq/kg/die):</label>
                         <input type="number" id="reqSodium" min="0" max="10" step="0.1" value="0">                         <input type="number" id="reqSodium" min="0" max="10" step="0.1" value="0">
 +                    </div>
 +                    <div class="input-group">
 +                        <label for="sodiumType">Tipo di sodio:</label>
 +                        <select id="sodiumType" onchange="updateSodiumChoice()">
 +                            <option value="nacl">Sodio Cloruro (NaCl)</option>
 +                            <option value="sodium_acetate">Sodio Acetato (alcalinizzante)</option>
 +                        </select>
 +                    </div>
 +                    <div id="sodiumRecommendation" class="hidden" style="margin-top: 5px;">
 +                        <!-- Popolato dinamicamente -->
                     </div>                     </div>
                     <div class="input-group">                     <div class="input-group">
Linea 600: Linea 1121:
             <div class="form-row">             <div class="form-row">
                 <div class="form-col">                 <div class="form-col">
-                    <h4>Vitamine e Oligoelementi (dal 4° giorno)</h4>+                    <h4>Vitamine e Oligoelementi (dal 3° giorno)</h4>
                     <div class="input-group">                     <div class="input-group">
-                        <label for="reqVitalipid">Vitalipid (ml/die):</label>+                        <label for="reqVitalipid">Vitalipid (ml/kg/die):</label>
                         <input type="number" id="reqVitalipid" min="0" max="10" step="0.5" value="0">                         <input type="number" id="reqVitalipid" min="0" max="10" step="0.5" value="0">
                     </div>                     </div>
                     <div class="input-group">                     <div class="input-group">
-                        <label for="reqSoluvit">Soluvit (ml/die):</label>+                        <label for="reqSoluvit">Soluvit (ml/kg/die):</label>
                         <input type="number" id="reqSoluvit" min="0" max="5" step="0.5" value="0">                         <input type="number" id="reqSoluvit" min="0" max="5" step="0.5" value="0">
                     </div>                     </div>
                     <div class="input-group">                     <div class="input-group">
-                        <label for="reqPeditrace">Peditrace (ml/die):</label>+                        <label for="reqPeditrace">Peditrace (ml/kg/die):</label>
                         <input type="number" id="reqPeditrace" min="0" max="10" step="0.5" value="0">                         <input type="number" id="reqPeditrace" min="0" max="10" step="0.5" value="0">
 +                    </div>
 +                    <div class="input-group">
 +                        <label for="reqCarnitine">Carnitina (mg/kg/die):</label>
 +                        <input type="number" id="reqCarnitine" min="0" max="20" step="1" value="0">
                     </div>                     </div>
                 </div>                 </div>
Linea 617: Linea 1142:
                     <div class="info" style="margin-top: 0; font-size: 13px;">                     <div class="info" style="margin-top: 0; font-size: 13px;">
                         <strong>Regole Vitamine/Oligoelementi:</strong><br>                         <strong>Regole Vitamine/Oligoelementi:</strong><br>
-                        <strong>• Dal 4° giorno:</strong> Vitalipid 5ml, Soluvit 2ml, Peditrace 1ml<br>+                        <strong>• Dal 3° giorno:</strong> Vitalipid 4 ml/kg/die, Soluvit 1 ml/kg/die, Peditrace 1 ml/kg/die<br>
                         <strong>• Sospensione automatica:</strong> Se enterale ≥100 ml/kg/die<br>                         <strong>• Sospensione automatica:</strong> Se enterale ≥100 ml/kg/die<br>
-                        <strong>• Modificabili manualmente:</strong> Campi editabili per personalizzazione+                        <strong>• Modificabili manualmente:</strong> Campi editabili per personalizzazione<br><br> 
 +                        <strong>Regole Carnitina:</strong><br> 
 +                        <strong>• NPT > 1 mese:</strong> Carnitina 5 mg/kg/die<br> 
 +                        <strong>• NPT < 1 mese:</strong> Non necessaria<br> 
 +                        <strong>• Fonte:</strong> Carnitene (100 mg/ml)
                     </div>                     </div>
                 </div>                 </div>
Linea 631: Linea 1160:
     </div>     </div>
  
-    <!-- TAB 4: NUTRIZIONE PARENTERALE -->+    <!-- TAB 4: NUTRIZIONE PARENTERALE (VERSIONE 17 ORIGINALE) -->
     <div id="parenteral" class="tab-content">     <div id="parenteral" class="tab-content">
         <div class="info">         <div class="info">
Linea 667: Linea 1196:
  
         <div id="parenteralResults" class="results hidden">         <div id="parenteralResults" class="results hidden">
-            <h3>Composizione NPT Finale</h3>+            <h3>Prescrizione parenterale</h3>
             <div id="parenteralTable"></div>             <div id="parenteralTable"></div>
 +            
 +            <h3 style="margin-top: 30px;">Ricetta per Preparazione (include volume deflussore)</h3>
 +            <div id="preparationTable"></div>
 +            
 +
 +            <div style="margin-top: 20px;">
 +                <button class="button" onclick="generatePDF('foglio_lavoro')">📄 Genera PDF - FOGLIO DI LAVORO</button>
 +                <button class="button" onclick="generatePDF('report_parenterale')" style="margin-left: 10px;">📄 Genera PDF - REPORT PARENTERALE</button>
 +                <button class="button" onclick="generatePDF('etichetta_sacca')" style="margin-left: 10px;">🏷️ Genera PDF - ETICHETTA SACCA</button>
 +            </div>
         </div>         </div>
     </div>     </div>
  
-    <!-- TAB 5: CONFIGURAZIONE -->+ 
 +    <!-- TAB 5: REPORT FINALE (SPOSTATO DA TAB 6) --> 
 +    <div id="report" class="tab-content"> 
 +        <div class="info"> 
 +            <strong>PASSO 5 - REPORT FINALE</strong><br> 
 +            <strong>Obiettivo:</strong> Generare la documentazione completa per prescrizione e preparazione 
 +        </div> 
 + 
 +    <!-- Banner stato prescrizione --> 
 +    <div id="prescriptionStatusBanner" style="display: none;"> 
 +    <!-- Popolato dinamicamente --> 
 +    </div>     
 +    <div class="section no-print"> 
 +        <h2>Genera Documentazione</h2> 
 +        <button class="button" onclick="generatePrescription()">Genera Prescrizione Medica</button> 
 +        <button class="button" onclick="generateWorksheet()">Genera Ricetta Preparazione</button> 
 +        <button class="button" onclick="generateLabel()">Genera Etichetta Sacca</button> 
 +        <button class="button secondary" onclick="window.print()">Stampa Pagina</button> 
 +                <!-- Report appare subito qui sotto i pulsanti --> 
 +                <div id="reportOutput"></div> 
 +            </div> 
 + 
 +        <!-- SEZIONE 2A: VALIDAZIONE FARMACISTA --> 
 +<div class="section"> 
 +    <h2>💊 Fase 1 - Validazione Farmacista</h2> 
 +    <div class="info" style="margin-bottom: 15px;"> 
 +        <strong>📋 VALIDAZIONE PRESCRIZIONE NPT</strong><br> 
 +        Il farmacista deve validare la prescrizione medica prima dell'allestimento. 
 +    </div> 
 +     
 +    <div class="form-row"> 
 +        <div class="form-col"> 
 +            <div class="input-group"> 
 +                <label for="validatingPharmacist">Farmacista Validatore:</label> 
 +                <select id="validatingPharmacist" style="width: 300px;"> 
 +                    <option value="">Seleziona farmacista responsabile</option> 
 +                    <!-- Popolato dinamicamente da pharmacistsData --> 
 +                </select> 
 +            </div> 
 +            <div class="info" style="margin-top: 5px; font-size: 12px;"> 
 +                <strong>Responsabile della validazione clinica e farmacologica della prescrizione NPT</strong> 
 +            </div> 
 +        </div> 
 +         
 +        <div class="form-col"> 
 +            <button class="button" onclick="validatePrescription()" id="validatePrescriptionBtn"> 
 +                📝 VALIDA PRESCRIZIONE 
 +            </button> 
 +            <div id="validationStatus" style="margin-top: 15px; display: none;"> 
 +                <!-- Status validazione --> 
 +            </div> 
 +        </div> 
 +    </div> 
 +</div> 
 + 
 +<!-- SEZIONE 2B: ALLESTIMENTO TECNICI --> 
 +<div class="section"> 
 +    <h2>🔬 Fase 2 - Allestimento Galenico</h2> 
 +    <div class="info" style="margin-bottom: 15px;"> 
 +        <strong>⚗️ PREPARAZIONE FISICA NPT</strong><br> 
 +        Due tecnici qualificati preparano la sacca NPT secondo protocolli GMP con controllo incrociato. 
 +    </div> 
 +     
 +    <div class="form-row"> 
 +        <div class="form-col"> 
 +            <div class="input-group"> 
 +                <label for="preparingTechnician1">Primo Tecnico Preparatore:</label> 
 +                <select id="preparingTechnician1" style="width: 300px;" disabled> 
 +                    <option value="">Prima completare validazione farmacista</option> 
 +                    <!-- Popolato dinamicamente da technicianData --> 
 +                </select> 
 +            </div> 
 +             
 +            <div class="input-group"> 
 +                <label for="preparingTechnician2">Secondo Tecnico Preparatore:</label> 
 +                <select id="preparingTechnician2" style="width: 300px;" disabled> 
 +                    <option value="">Prima completare validazione farmacist</option> 
 +                    <!-- Popolato dinamicamente da technicianData --> 
 +                </select> 
 +            </div> 
 +            <div class="info" style="margin-top: 5px; font-size: 12px;"> 
 +                <strong>Due tecnici diversi per controllo incrociato secondo protocolli GMP</strong> 
 +            </div> 
 +        </div> 
 +         
 +        <div class="form-col"> 
 +            <button class="button" onclick="confirmPreparation()" id="confirmPreparationBtn" disabled> 
 +                🧪 CONFERMA ALLESTIMENTO 
 +            </button> 
 +           <button class="button secondary" onclick="downloadPreparationJSON()" id="downloadBtn" disabled style="margin-top: 10px;"> 
 +                💾 ARCHIVIA PREPARAZIONE (JSON) 
 +            </button> 
 +            <button class="button" onclick="lockPrescription()" id="lockPrescriptionBtn" disabled style="margin-top: 10px; background-color: #e74c3c;"> 
 +                🔒 BLOCCA PRESCRIZIONE 
 +            </button> 
 +            <div id="preparationStatus" style="margin-top: 15px; display: none;"> 
 +                <!-- Status preparazione --> 
 +            </div> 
 +        </div> 
 +    </div> 
 +</div> 
 + 
 +        <!-- SEZIONE ARCHIVIAZIONE MENSILE --> 
 + 
 +     <div class="section"> 
 +    <h2>📊 Archiviazione Mensile Excel</h2> 
 +    <div class="info" style="margin-bottom: 15px;"> 
 +        <strong>📈 CONSOLIDAMENTO PREPARAZIONI NPT</strong><br> 
 +        Genera report Excel mensile con tutte le preparazioni NPT archiviate come JSON. 
 +    </div> 
 +     
 +    <div class="form-row"> 
 +        <div class="form-col"> 
 +            <div class="input-group"> 
 +                <label for="selectedMonth">Mese da consolidare:</label> 
 +                <input type="month" id="selectedMonth" style="width: 150px;"> 
 +            </div> 
 +            <div class="input-group"> 
 +                <label for="jsonFilesInput">File JSON da includere:</label> 
 +                <input type="file" id="jsonFilesInput" multiple accept=".json" style="width: 300px;"> 
 +            </div> 
 +            <div class="info" style="margin-top: 5px; font-size: 12px;"> 
 +                <strong>Seleziona tutti i file NPT_*.json del mese da consolidare</strong> 
 +            </div> 
 +        </div> 
 +         
 +        <div class="form-col"> 
 +            <button class="button" onclick="generateMonthlyExcel()" id="generateExcelBtn"> 
 +                📊 GENERA EXCEL MENSILE 
 +            </button> 
 +            <button class="button secondary" onclick="previewMonthlyData()" id="previewBtn" style="margin-top: 10px;"> 
 +                👁️ ANTEPRIMA DATI 
 +            </button> 
 +             
 +            <div id="monthlyStats" style="margin-top: 15px; display: none;"> 
 +                <!-- Statistiche mensili popolate dinamicamente --> 
 +            </div> 
 +        </div> 
 +    </div> 
 +</div> 
 +    
 +         
 +    </div> 
 + 
 + 
 +<!-- TAB 6: KNOWLEDGE BASE --> 
 +    <div id="knowledge-base" class="tab-content"> 
 +        <div class="info"> 
 +            <strong>🧠 KNOWLEDGE BASE NPT v3.0</strong><br> 
 +            <strong>Sistema:</strong> Base di conoscenza integrata per decision support clinico<br> 
 +            <strong>Obiettivo:</strong> Spiegare regole di calcolo, linee guida e supportare le decisioni cliniche 
 +        </div> 
 + 
 +        <!-- NAVIGAZIONE INTERNA KNOWLEDGE BASE --> 
 +        <div class="tabs" style="margin-bottom: 15px;"> 
 +            <div class="tab active" onclick="showKnowledgeSection('calculation-rules')" style="font-size: 12px; padding: 6px 12px;"> 
 +                🧮 Regole Calcolo 
 +            </div> 
 +            <div class="tab" onclick="showKnowledgeSection('clinical-guidelines')" style="font-size: 12px; padding: 6px 12px;"> 
 +                👩‍⚕️ Linee Guida 
 +            </div> 
 +            <div class="tab" onclick="showKnowledgeSection('alert-system')" style="font-size: 12px; padding: 6px 12px;"> 
 +                🚨 Sistema Alert 
 +            </div> 
 +            <div class="tab" onclick="showKnowledgeSection('evidence-base')" style="font-size: 12px; padding: 6px 12px;"> 
 +                📖 Evidenze 
 +            </div> 
 +            <div class="tab" onclick="showKnowledgeSection('decision-support')" style="font-size: 12px; padding: 6px 12px;"> 
 +                🎯 Decision Support 
 +            </div> 
 +        </div> 
 + 
 +        <!-- SEZIONE 1: REGOLE DI CALCOLO --> 
 +        <div id="calculation-rules" class="knowledge-section active"> 
 +            <div class="section"> 
 +                <h2>🧮 REGOLE DI CALCOLO NPT</h2> 
 +                 
 +                <div class="config-advanced"> 
 +                    <h3>Algoritmi Automatici</h3> 
 +                     
 +                    <div class="form-row"> 
 +                        <div class="form-col"> 
 +                            <h4>📊 Calcolo GIR (Glucose Infusion Rate)</h4> 
 +                            <div class="info" style="font-size: 13px;"> 
 +                                <strong>Formula:</strong> GIR = (Glucidi g/kg/die × 1000) ÷ 1440 minuti<br> 
 +                                <strong>Range sicurezza:</strong> < 12 mg/kg/min (configurabile)<br> 
 +                                <strong>Fonte glucosio:</strong> Glucosio 50% + Acqua bidistillata<br> 
 +                                <strong>Alert automatico:</strong> GIR > 12 mg/kg/min 
 +                            </div> 
 +                             
 +                            <h4>🧪 Calcolo Osmolarità</h4> 
 +                            <div class="info" style="font-size: 13px;"> 
 +                                <strong>Formula:</strong> Σ(Volume componente × Osmolarità componente) ÷ Volume totale<br> 
 +                                <strong>Soglie:</strong><br> 
 +                                • < 600 mOsm/L: Accesso periferico possibile<br> 
 +                                • 600-900 mOsm/L: CVC raccomandato<br> 
 +                                • > 900 mOsm/L: Solo CVC (soluzione ipertonica) 
 +                            </div> 
 +                        </div> 
 +                         
 +                        <div class="form-col"> 
 +                            <h4>⚖️ Gestione Automatica BUN</h4> 
 +                            <div class="info" style="font-size: 13px;"> 
 +                                <strong>Range normale:</strong> 9-14 mg/dL<br> 
 +                                <strong>BUN < 9:</strong> Aumenta proteine +1 g/kg/die<br> 
 +                                <strong>BUN > 14:</strong> Riduce proteine -1 g/kg/die<br> 
 +                                <strong>Applicazione:</strong> Automatica nel caricamento defaults 
 +                            </div> 
 +                             
 +                            <h4>🧂 Selezione Sodio Intelligente</h4> 
 +                            <div class="info" style="font-size: 13px;"> 
 +                                <strong>NaCl standard:</strong> pH > 7.30 e BE > -4<br> 
 +                                <strong>Sodio Acetato:</strong> pH < 7.30 o BE < -4<br> 
 +                                <strong>Effetto:</strong> Sodio Acetato ha azione alcalinizzante<br> 
 +                                <strong>Suggerimento:</strong> Automatico basato su parametri clinici 
 +                            </div> 
 +                        </div> 
 +                    </div> 
 +                </div> 
 +                 
 +                <div class="section"> 
 +                    <h3>📐 Formule Matematiche Principali</h3> 
 +                    <div style="overflow-x: auto;"> 
 +                        <table class="config-table"> 
 +                            <thead> 
 +                                <tr> 
 +                                    <th style="min-width: 200px;">Parametro</th> 
 +                                    <th>Formula</th> 
 +                                    <th>Unità</th> 
 +                                    <th>Range Normale</th> 
 +                                    <th>Note</th> 
 +                                </tr> 
 +                            </thead> 
 +                            <tbody> 
 +                                <tr> 
 +                                    <td><strong>GIR</strong></td> 
 +                                    <td>(Glucidi g/kg/die × 1000) ÷ 1440</td> 
 +                                    <td>mg/kg/min</td> 
 +                                    <td>4-12</td> 
 +                                    <td>Alert se > 12</td> 
 +                                </tr> 
 +                                <tr> 
 +                                    <td><strong>Energia Totale</strong></td> 
 +                                    <td>(Proteine×4) + (Glucidi×4) + (Lipidi×9)</td> 
 +                                    <td>kcal/kg/die</td> 
 +                                    <td>80-120</td> 
 +                                    <td>Dipende da età</td> 
 +                                </tr> 
 +                                <tr> 
 +                                    <td><strong>Osmolarità</strong></td> 
 +                                    <td>Σ(Vol.comp × Osm.comp) ÷ Vol.tot</td> 
 +                                    <td>mOsm/L</td> 
 +                                    <td>&lt; 900</td> 
 +                                    <td>CVC se > 600</td> 
 +                                </tr> 
 +                                <tr> 
 +                                    <td><strong>Rapporto Ca:P</strong></td> 
 +                                    <td>mg Ca elementare : mg P</td> 
 +                                    <td>ratio</td> 
 +                                    <td>1.3:1 - 2:1</td> 
 +                                    <td>Evita precipitazioni</td> 
 +                                </tr> 
 +                                <tr> 
 +                                    <td><strong>Velocità Infusione</strong></td> 
 +                                    <td>Volume totale NPT ÷ 24</td> 
 +                                    <td>ml/h</td> 
 +                                    <td>Variabile</td> 
 +                                    <td>Infusione continua</td> 
 +                                </tr> 
 +                            </tbody> 
 +                        </table> 
 +                    </div> 
 +                </div> 
 +            </div> 
 +        </div> 
 + 
 +        <!-- SEZIONE 2: LINEE GUIDA CLINICHE (placeholder per ora) --> 
 +        <div id="clinical-guidelines" class="knowledge-section hidden"> 
 +            <div class="section"> 
 +                <h2>👩‍⚕️ LINEE GUIDA CLINICHE</h2> 
 +                <div class="info"> 
 +                    <strong>🚧 In sviluppo...</strong><br> 
 +                    Questa sezione conterrà protocolli per età, patologie e tempistiche. 
 +                </div> 
 +            </div> 
 +        </div> 
 + 
 +        <!-- SEZIONE 3: SISTEMA ALERT (placeholder per ora) --> 
 +        <div id="alert-system" class="knowledge-section hidden"> 
 +            <div class="section"> 
 +                <h2>🚨 SISTEMA ALERT</h2> 
 +                <div class="info"> 
 +                    <strong>🚧 In sviluppo...</strong><br> 
 +                    Questa sezione spiegherà soglie di allarme e azioni consigliate. 
 +                </div> 
 +            </div> 
 +        </div> 
 + 
 +        <!-- SEZIONE 4: EVIDENZE (placeholder per ora) --> 
 +        <div id="evidence-base" class="knowledge-section hidden"> 
 +            <div class="section"> 
 +                <h2>📖 EVIDENZE SCIENTIFICHE</h2> 
 +                <div class="info"> 
 +                    <strong>🚧 In sviluppo...</strong><br> 
 +                    Questa sezione conterrà bibliografia e riferimenti scientifici. 
 +                </div> 
 +            </div> 
 +        </div> 
 + 
 +        <!-- SEZIONE 5: DECISION SUPPORT (placeholder per ora) --> 
 +        <div id="decision-support" class="knowledge-section hidden"> 
 +            <div class="section"> 
 +                <h2>🎯 DECISION SUPPORT</h2> 
 +                <div class="info"> 
 +                    <strong>🚧 In sviluppo...</strong><br> 
 +                    Questa sezione conterrà configurazione regole e simulatore. 
 +                </div> 
 +            </div> 
 +        </div> 
 + 
 +    </div> 
 + 
 +    <!-- TAB 6: CONFIGURAZIONE (SPOSTATO DA TAB 5) -->
     <div id="config" class="tab-content">     <div id="config" class="tab-content">
         <div class="info">         <div class="info">
-            <strong>CONFIGURAZIONE COMPONENTI</strong><br> +            <strong>CONFIGURAZIONE COMPLETA</strong><br> 
-            <strong>Sistema:</strong> NPT Calculator v2.0 - Database completo componenti nutrizionali+            <strong>Sistema:</strong> NPT Calculator v3.0 - Database completo componenti + configurazione clinica avanzata 
 +        </div> 
 +        <div class="section"> 
 +            <h2>Parametri Sistema</h2> 
 +            <div class="form-row"> 
 +                <div class="form-col"> 
 +                    <div class="input-group"> 
 +                        <label for="deflectorVolume">Volume deflussore (ml):</label> 
 +                        <input type="number" id="deflectorVolume" min="0" max="100" step="5" value="30" oninput="markConfigChanged('system')"> 
 +                    </div> 
 +                    <div class="info" style="margin-top: 10px; font-size: 12px;"> 
 +                        <strong>Info Volume Deflussore:</strong><br> 
 +                        • Volume perso nel deflussore durante la preparazione<br> 
 +                        • Viene aggiunto automaticamente alla ricetta di preparazione<br> 
 +                        • Valore standard: 30 ml (modificabile) 
 +                    </div> 
 +                </div> 
 +                <div class="form-col"> 
 +                    <button id="updateSystemBtn" class="button" onclick="updateSystemConfig()">Aggiorna Parametri Sistema</button> 
 +                </div> 
 +            </div>
         </div>         </div>
                  
Linea 709: Linea 1590:
                 <div class="form-col">                 <div class="form-col">
                     <button class="button secondary" onclick="showAddEnteralForm()">Aggiungi Nuova Formula</button>                     <button class="button secondary" onclick="showAddEnteralForm()">Aggiungi Nuova Formula</button>
-                </div> 
-            </div> 
-             
-            <!-- Form per aggiungere nuova formula enterale --> 
-            <div id="addEnteralForm" class="hidden" style="background: #f8f9fa; padding: 15px; border-radius: 5px; margin-top: 15px; border: 2px solid #3498db;"> 
-                <h4>Aggiungi Nuova Formula Enterale</h4> 
-                <div class="form-row"> 
-                    <div class="form-col"> 
-                        <div class="input-group"> 
-                            <label for="newEnteralName">Nome Formula:</label> 
-                            <input type="text" id="newEnteralName" placeholder="es. Aptamil PreNan" style="width: 200px;"> 
-                        </div> 
-                        <div class="input-group"> 
-                            <label for="newEnteralKey">Codice (univoco):</label> 
-                            <input type="text" id="newEnteralKey" placeholder="es. aptamil_prenan" style="width: 200px;"> 
-                        </div> 
-                        <div class="input-group"> 
-                            <label for="newEnteralProtein">Proteine (g/100ml):</label> 
-                            <input type="number" id="newEnteralProtein" step="0.1" value="1.5"> 
-                        </div> 
-                        <div class="input-group"> 
-                            <label for="newEnteralCarbs">Carboidrati (g/100ml):</label> 
-                            <input type="number" id="newEnteralCarbs" step="0.1" value="7.5"> 
-                        </div> 
-                        <div class="input-group"> 
-                            <label for="newEnteralLipids">Lipidi (g/100ml):</label> 
-                            <input type="number" id="newEnteralLipids" step="0.1" value="3.5"> 
-                        </div> 
-                    </div> 
-                    <div class="form-col"> 
-                        <div class="input-group"> 
-                            <label for="newEnteralSodium">Sodio (mEq/100ml):</label> 
-                            <input type="number" id="newEnteralSodium" step="0.001" value="0.020"> 
-                        </div> 
-                        <div class="input-group"> 
-                            <label for="newEnteralPotassium">Potassio (mEq/100ml):</label> 
-                            <input type="number" id="newEnteralPotassium" step="0.001" value="0.070"> 
-                        </div> 
-                        <div class="input-group"> 
-                            <label for="newEnteralCalcium">Calcio (mg/100ml):</label> 
-                            <input type="number" id="newEnteralCalcium" step="0.1" value="50"> 
-                        </div> 
-                        <div class="input-group"> 
-                            <label for="newEnteralPhosphorus">Fosforo (mg/100ml):</label> 
-                            <input type="number" id="newEnteralPhosphorus" step="0.1" value="30"> 
-                        </div> 
-                        <div class="input-group"> 
-                            <label for="newEnteralMagnesium">Magnesio (mg/100ml):</label> 
-                            <input type="number" id="newEnteralMagnesium" step="0.1" value="5"> 
-                        </div> 
-                        <div class="input-group"> 
-                            <label for="newEnteralEnergy">Energia (kcal/100ml):</label> 
-                            <input type="number" id="newEnteralEnergy" step="1" value="67"> 
-                        </div> 
-                    </div> 
-                </div> 
-                <div class="form-row"> 
-                    <div class="form-col"> 
-                        <button class="button" onclick="addNewEnteralFormula()">Crea Formula</button> 
-                        <button class="button secondary" onclick="cancelAddEnteral()">Annulla</button> 
-                    </div> 
                 </div>                 </div>
             </div>             </div>
Linea 827: Linea 1647:
                 <table class="config-table">                 <table class="config-table">
                     <thead>                     <thead>
-                        <tr> +    <tr> 
-                            <th style="min-width: 180px;">Componente</th> +        <th style="min-width: 180px;">Componente</th> 
-                            <th>Proteine<br>(g)</th> +        <th>Proteine<br>(g)</th> 
-                            <th>Carboidrati<br>(g)</th> +        <th>Carboidrati<br>(g)</th> 
-                            <th>Lipidi<br>(g)</th> +        <th>Lipidi<br>(g)</th> 
-                            <th>Sodio<br>(mEq)</th> +        <th>Sodio<br>(mEq)</th> 
-                            <th>Potassio<br>(mEq)</th> +        <th>Potassio<br>(mEq)</th> 
-                            <th>Calcio<br>(mg)</th> +        <th>Calcio<br>(mg)</th> 
-                            <th>Fosforo<br>(mg)</th> +        <th>Fosforo<br>(mg)</th> 
-                            <th>Magnesio<br>(mEq)</th> +        <th>Magnesio<br>(mEq)</th> 
-                            <th>Energia<br>(kcal)</th> +        <th>Energia<br>(kcal)</th> 
-                            <th>Acqua<br>(ml)</th> +        <th>Acqua<br>(ml)</th> 
-                            <th style="min-width: 200px;">Descrizione e Note</th> +        <th>Osmolarità<br>(mOsm/L)</th> 
-                            <th>Azioni</th> +        <th style="min-width: 200px;">Descrizione e Note</th> 
-                        </tr> +        <th>Azioni</th> 
-                    </thead>+    </tr> 
 +</thead>
                     <tbody id="parenteralConfigTable">                     <tbody id="parenteralConfigTable">
                         <!-- Popolato dinamicamente -->                         <!-- Popolato dinamicamente -->
Linea 859: Linea 1680:
  
         <div class="section">         <div class="section">
-            <h2>Vitamine e Oligoelementi</h2>+            <h2>Lista Medici Prescrittori</h2
 +            <div class="info" style="margin-bottom: 15px;"> 
 +                <strong>🩺 CONFIGURAZIONE MEDICI</strong><br> 
 +                Gestisci la lista dei medici prescrittori. Le modifiche si applicano automaticamente alla dropdown del TAB 1. 
 +            </div>
             <div style="overflow-x: auto;">             <div style="overflow-x: auto;">
                 <table class="config-table">                 <table class="config-table">
                     <thead>                     <thead>
                         <tr>                         <tr>
-                            <th style="min-width: 180px;">Prodotto</th> +                            <th style="min-width: 120px;">Nome</th> 
-                            <th>Dose Pediatrica</th> +                            <th style="min-width: 120px;">Cognome</th> 
-                            <th>Dose Max</th> +                            <th style="min-width: 80px;">Titolo</th> 
-                            <th>Contenuto Acqua</th> +                            <th style="min-width: 250px;">Nome Completo (Visualizzato)</th> 
-                            <th style="min-width: 300px;">Composizione</th>+                            <th>Azioni</th>
                         </tr>                         </tr>
                     </thead>                     </thead>
-                    <tbody>+                    <tbody id="doctorsConfigTable"> 
 +                        <!-- Popolato dinamicamente --> 
 +                    </tbody> 
 +                </table> 
 +            </div> 
 +            <div class="form-row"> 
 +                <div class="form-col"> 
 +                    <button id="updateDoctorsBtn" class="button" onclick="updateDoctorsConfig()">Aggiorna Lista Medici</button> 
 +                </div> 
 +                <div class="form-col"> 
 +                    <button class="button secondary" onclick="showAddDoctorForm()">Aggiungi Nuovo Medico</button> 
 +                </div> 
 +            </div> 
 +            <div class="section"> 
 +            <h2>Lista Infermiere</h2> 
 +            <div class="info" style="margin-bottom: 15px;"> 
 +                <strong>👩‍⚕️ CONFIGURAZIONE INFERMIERE</strong><br> 
 +                Gestisci la lista delle infermiere del reparto. Le modifiche si applicano automaticamente. 
 +            </div> 
 +            <div style="overflow-x: auto;"> 
 +                <table class="config-table"> 
 +                    <thead>
                         <tr>                         <tr>
-                            <td class="component-name">Vitalipid N Infant</td+                            <th style="min-width: 120px;">Nome</th
-                            <td>4 ml/kg/die</td> +                            <th style="min-width120px;">Cognome</th
-                            <td>10 ml/die</td> +                            <th style="min-width: 80px;">Titolo</th
-                            <td>9 ml H₂O/10ml</td> +                            <th style="min-width250px;">Nome Completo (Visualizzato)</th
-                            <td style="font-size11px; color: #7f8c8d;">Vit A, D, E, K - Vitamine liposolubili per neonati</td> +                            <th>Azioni</th>
-                        </tr> +
-                        <tr+
-                            <td class="component-name">Soluvit N</td+
-                            <td>5 ml/die</td> +
-                            <td>5 ml/die</td> +
-                            <td>4.75 ml H₂O/5ml</td> +
-                            <td style="font-size11px; color: #7f8c8d;">B1, B2, B6, B12, C, Folati, Niacina - Idrosolubili</td> +
-                        </tr> +
-                        <tr+
-                            <td class="component-name">Peditrace</td> +
-                            <td>1 ml/kg/die</td> +
-                            <td>10 ml/die</td> +
-                            <td>0.99 ml H₂O/ml</td> +
-                            <td style="font-size: 11px; color: #7f8c8d;">Zn, Cu, Mn, Se - Oligoelementi pediatrici</td>+
                         </tr>                         </tr>
 +                    </thead>
 +                    <tbody id="nursesConfigTable">
 +                        <!-- Popolato dinamicamente -->
                     </tbody>                     </tbody>
                 </table>                 </table>
 +            </div>
 +            <div class="form-row">
 +                <div class="form-col">
 +                    <button id="updateNursesBtn" class="button" onclick="updateNursesConfig()">Aggiorna Lista Infermiere</button>
 +                </div>
 +                <div class="form-col">
 +                    <button class="button secondary" onclick="showAddNurseForm()">Aggiungi Nuova Infermiera</button>
 +                </div>
             </div>             </div>
         </div>         </div>
  
         <div class="section">         <div class="section">
-            <h2>Gestione Configurazioni</h2>+            <h2>Lista Farmacisti</h2
 +            <div class="info" style="margin-bottom: 15px;"> 
 +                <strong>💊 CONFIGURAZIONE FARMACISTI</strong><br> 
 +                Gestisci la lista dei farmacisti ospedalieri. Le modifiche si applicano automaticamente. 
 +            </div> 
 +            <div style="overflow-x: auto;"> 
 +                <table class="config-table"> 
 +                    <thead> 
 +                        <tr> 
 +                            <th style="min-width: 120px;">Nome</th> 
 +                            <th style="min-width: 120px;">Cognome</th> 
 +                            <th style="min-width: 80px;">Titolo</th> 
 +                            <th style="min-width: 250px;">Nome Completo (Visualizzato)</th> 
 +                            <th>Azioni</th> 
 +                        </tr> 
 +                    </thead> 
 +                    <tbody id="pharmacistsConfigTable"> 
 +                        <!-- Popolato dinamicamente --> 
 +                    </tbody> 
 +                </table> 
 +            </div>
             <div class="form-row">             <div class="form-row">
                 <div class="form-col">                 <div class="form-col">
-                    <button class="button secondary" onclick="exportConfig()">Esporta Configurazione</button+                    <button id="updatePharmacistsBtn" class="button" onclick="updatePharmacistsConfig()">Aggiorna Lista Farmacisti</button>
-                    <p style="font-size: 12px; color: #666;">Salva tutte le configurazioni attuali in un file JSON</p>+
                 </div>                 </div>
                 <div class="form-col">                 <div class="form-col">
-                    <input type="file" id="configFile" accept=".json" style="display: none;" onchange="importConfig()"> +                    <button class="button secondary" onclick="showAddPharmacistForm()">Aggiungi Nuovo Farmacista</button>
-                    <button class="button secondary" onclick="document.getElementById('configFile').click()">Importa Configurazione</button+
-                    <p style="font-size: 12px; color: #666;">Carica configurazioni da file JSON</p>+
                 </div>                 </div>
 +            </div>
 +        </div>
 +
 +        <div class="section">
 +            <h2>Lista Tecnici di Farmacia</h2>
 +            <div class="info" style="margin-bottom: 15px;">
 +                <strong>🔬 CONFIGURAZIONE TECNICI</strong><br>
 +                Gestisci la lista dei tecnici di farmacia. Le modifiche si applicano automaticamente.
 +            </div>
 +            <div style="overflow-x: auto;">
 +                <table class="config-table">
 +                    <thead>
 +                        <tr>
 +                            <th style="min-width: 120px;">Nome</th>
 +                            <th style="min-width: 120px;">Cognome</th>
 +                            <th style="min-width: 80px;">Titolo</th>
 +                            <th style="min-width: 250px;">Nome Completo (Visualizzato)</th>
 +                            <th>Azioni</th>
 +                        </tr>
 +                    </thead>
 +                    <tbody id="techniciansConfigTable">
 +                        <!-- Popolato dinamicamente -->
 +                    </tbody>
 +                </table>
             </div>             </div>
             <div class="form-row">             <div class="form-row">
                 <div class="form-col">                 <div class="form-col">
-                    <button class="buttonstyle="background-color: #e67e22;" onclick="resetToDefaults()">Ripristina Valori Default</button+                    <button id="updateTechniciansBtnclass="button" onclick="updateTechniciansConfig()">Aggiorna Lista Tecnici</button>
-                    <p style="font-size: 12px; color: #666;">Cancella tutte le modifiche e torna ai valori originali</p>+
                 </div>                 </div>
                 <div class="form-col">                 <div class="form-col">
-                    <div id="storageStatus" style="padding: 10px; background: #d1ecf1border-radius5px; font-size: 12px;"> +                    <button class="button secondary" onclick="showAddTechnicianForm()">Aggiungi Nuovo Tecnico</button> 
-                        <strong>💾 Salvataggio Automatico Attivo</strong><br> +                </div
-                        Le modifiche vengono salvate automaticamente nel browser+            </div> 
 +        </div> 
 +        </div> 
 + 
 +        <!-- SEZIONE CONFIGURAZIONE CLINICA AVANZATA (NOVITÀ) --> 
 +        <div class="config-advanced"> 
 +            <h3>🔬 CONFIGURAZIONE CLINICA AVANZATA</h3> 
 +             
 +            <div class="section"> 
 +                <h2>Parametri Elettroliti e Controlli</h2> 
 +                <div class="form-row"> 
 +                    <div class="form-col"> 
 +                        <div class="input-group"> 
 +                            <label for="calciumReq">Calcio standard (mg/kg/die):</label> 
 +                            <input type="number" id="calciumReqmin="0" max="200" value="160"> 
 +                            <span style="margin-left: 10px; font-size: 12px; color: #666;">Range: 120-200</span> 
 +                        </div> 
 +                        <div class="input-group"> 
 +                            <label for="phosphorusReq">Fosforo standard (mg/kg/die):</label> 
 +                            <input type="number" id="phosphorusReq" min="0" max="100" value="84"> 
 +                            <span style="margin-left: 10px; font-size: 12px; color: #666;">Range: 60-120</span
 +                        </div> 
 +                        <div class="input-group"> 
 +                            <label for="magnesiumReq">Magnesio standard (mEq/kg/die):</label> 
 +                            <input type="number" id="magnesiumReq" min="0" max="2" step="0.1" value="0.6"> 
 +                            <span style="margin-left: 10px; font-size: 12px; color: #666;">Range: 0.3-1.0</span> 
 +                        </div> 
 +                    </div> 
 +                    <div class="form-col"> 
 +                        <div class="input-group"> 
 +                            <label for="maxGIR">GIR massimo (mg/kg/min):</label> 
 +                            <input type="number" id="maxGIR" min="5" max="20" step="0.1" value="12.0"> 
 +                            <span style="margin-left: 10px; font-size: 12px; color: #666;">Limite sicurezza</span> 
 +                        </div> 
 +                        <div class="input-group"> 
 +                            <label for="maxLipids">Lipidi massimi (g/kg/die):</label> 
 +                            <input type="number" id="maxLipids" min="1" max="4" step="0.1" value="3.0"> 
 +                            <span style="margin-left: 10px; font-size: 12px; color: #666;">Limite sicurezza</span> 
 +                        </div> 
 +                        <div class="input-group"> 
 +                            <label for="maxProtein">Proteine massime (g/kg/die):</label> 
 +                            <input type="number" id="maxProtein" min="3" max="6" step="0.1" value="4.5"> 
 +                            <span style="margin-left: 10px; font-size: 12px; color: #666;">Limite sicurezza</span> 
 +                        </div> 
 +                    </div> 
 +                </div> 
 +                <button class="button" onclick="updateClinicalConfig()">AGGIORNA PARAMETRI CLINICI</button> 
 +            </div> 
 + 
 +            <div class="section"> 
 +                <h2>Piano di Monitoraggio Automatico</h2> 
 +                <table class="monitoring-table"> 
 +                    <thead> 
 +                        <tr> 
 +                            <th>Controllo</th> 
 +                            <th>Frequenza</th> 
 +                            <th>Range Normale</th> 
 +                            <th>Azione se Fuori Range</th> 
 +                        </tr> 
 +                    </thead> 
 +                    <tbody> 
 +                        <tr> 
 +                            <td><strong>Glicemia</strong></td> 
 +                            <td>Ogni 6-8h</td> 
 +                            <td>70-110 mg/dL</td> 
 +                            <td>Aggiustare velocità glucosio</td> 
 +                        </tr> 
 +                        <tr> 
 +                            <td><strong>Elettroliti</strong></td> 
 +                            <td>Ogni 24-48h</td> 
 +                            <td>Na: 135-145, K: 3.5-5.0</td> 
 +                            <td>Modificare apporti NPT</td> 
 +                        </tr> 
 +                        <tr> 
 +                            <td><strong>BUN/Creatinina</strong></td> 
 +                            <td>Ogni 48h</td> 
 +                            <td>BUN: 9-14 mg/dL</td> 
 +                            <td>Aggiustare proteine</td> 
 +                        </tr> 
 +                        <tr> 
 +                            <td><strong>Trigliceridi</strong></td> 
 +                            <td>2 volte/settimana</td> 
 +                            <td>&lt; 150 mg/dL</td> 
 +                            <td>Ridurre lipidi se &gt; 200</td> 
 +                        </tr> 
 +                        <tr> 
 +                            <td><strong>Funzione epatica</strong></td> 
 +                            <td>Settimanale</td> 
 +                            <td>AST/ALT normali</td> 
 +                            <td>Valutare sospensione NPT</td> 
 +                        </tr> 
 +                    </tbody> 
 +                </table> 
 +            </div> 
 + 
 +            <div class="section"> 
 +                <h2>⚠️ ALERT AUTOMATICI</h2> 
 +                <div class="alert-critical"> 
 +                    <strong>INTERRUZIONE IMMEDIATA NPT SE:</strong><br
 +                    • Glicemia > 250 mg/dL o < 40 mg/dL<br> 
 +                    • Trigliceridi > 400 mg/dL<br> 
 +                    • AST/ALT > 3x valore normale<br> 
 +                    • Segni di sepsi cateter-correlata<br> 
 +                    • Edema importante con bilancio positivo > 20 ml/kg/die 
 +                </div> 
 +                 
 +                <div class="warning"> 
 +                    <strong>AGGIUSTAMENTI NECESSARI SE:</strong><br> 
 +                    • GIR > 12 mg/kg/min → Ridurre glucosio<br> 
 +                    • BUN > 20 mg/dL → Ridurre proteine<br> 
 +                    • BUN < 5 mg/dL → Aumentare proteine<br> 
 +                    • Trigliceridi 200-400 mg/dL → Ridurre/sospendere lipidi<br> 
 +                    • Ipernatremia → Ridurre sodio, aumentare liquidi liberi 
 +                </div> 
 +            </div> 
 + 
 +            <div class="section"> 
 +                <h2>Impostazioni Ospedale</h2> 
 +                <div class="form-row"> 
 +                    <div class="form-col"
 +                        <div class="input-group"> 
 +                            <label for="hospitalName">Nome Ospedale:</label> 
 +                            <input type="text" id="hospitalName" value="ASST LECCO" style="width: 250px;"> 
 +                        </div> 
 +                        <div class="input-group"> 
 +                            <label for="departmentName">Dipartimento:</label> 
 +                            <input type="text" id="departmentName" value="S.C. Neonatologia e TIN" style="width: 250px;"> 
 +                        </div> 
 +                        <div class="input-group"> 
 +                            <label for="directorName">Direttore:</label> 
 +                            <input type="text" id="directorName" value="Dott. Roberto Bellù" style="width: 250px;"> 
 +                        </div> 
 +                    </div> 
 +                    <div class="form-col"> 
 +                        <div class="input-group"> 
 +                            <label for="autoSave">Salvataggio automatico:</label> 
 +                            <select id="autoSave"> 
 +                                <option value="true">Attivo</option> 
 +                                <option value="false">Disattivo</option> 
 +                            </select> 
 +                        </div> 
 +                        <div class="input-group"> 
 +                            <label for="decimalPlaces">Cifre decimali:</label> 
 +                            <select id="decimalPlaces"> 
 +                                <option value="1">1 cifra</option> 
 +                                <option value="2" selected>2 cifre</option> 
 +                                <option value="3">3 cifre</option> 
 +                            </select> 
 +                        </div>
                     </div>                     </div>
                 </div>                 </div>
 +                <button class="button secondary" onclick="resetConfiguration()">RESET CONFIGURAZIONE</button>
 +                <button class="button" onclick="saveConfiguration()">SALVA CONFIGURAZIONE</button>
             </div>             </div>
         </div>         </div>
  
         <div id="configResults" class="results hidden">         <div id="configResults" class="results hidden">
-            <h3>Stato Configurazione v2.0</h3>+            <h3>Stato Configurazione v3.0</h3>
             <div id="configInfo"></div>             <div id="configInfo"></div>
         </div>         </div>
Linea 933: Linea 1966:
  
 <script> <script>
-// DATI NUTRIZIONALI COMPLETI+// DATI NUTRIZIONALI COMPLETI (DA VERSIONE 17)
 const formulaData = { const formulaData = {
     maternal: { name: "Latte Materno", protein: 1.2, carbs: 7.0, lipids: 4.0, sodium: 0.007, potassium: 0.035, calcium: 28.0, phosphorus: 15.0, magnesium: 3.0, energy: 67 },     maternal: { name: "Latte Materno", protein: 1.2, carbs: 7.0, lipids: 4.0, sodium: 0.007, potassium: 0.035, calcium: 28.0, phosphorus: 15.0, magnesium: 3.0, energy: 67 },
Linea 946: Linea 1979:
 }; };
  
-// CONFIGURAZIONI PARENTERALI COMPLETE+// CONFIGURAZIONI PARENTERALI COMPLETE (DA VERSIONE 17)
 const parenteralConfig = { const parenteralConfig = {
     trophamine: {     trophamine: {
Linea 952: Linea 1985:
         protein: 6.0, carbs: 0, lipids: 0, sodium: 0, potassium: 0,         protein: 6.0, carbs: 0, lipids: 0, sodium: 0, potassium: 0,
         calcium: 0, phosphorus: 0, magnesium: 0, energy: 24, water: 94,         calcium: 0, phosphorus: 0, magnesium: 0, energy: 24, water: 94,
 +        osmolarity: 360, // mOsm/L
         description: "Soluzione di aminoacidi pediatrica",         description: "Soluzione di aminoacidi pediatrica",
         notes: "Soluzione sterile per uso endovenoso. Osmolarità: ~360 mOsm/L"         notes: "Soluzione sterile per uso endovenoso. Osmolarità: ~360 mOsm/L"
Linea 959: Linea 1993:
         protein: 0, carbs: 0, lipids: 20.0, sodium: 0, potassium: 0,         protein: 0, carbs: 0, lipids: 20.0, sodium: 0, potassium: 0,
         calcium: 0, phosphorus: 0, magnesium: 0, energy: 200, water: 80,         calcium: 0, phosphorus: 0, magnesium: 0, energy: 200, water: 80,
 +        osmolarity: 280, // mOsm/L
         description: "Emulsione lipidica endovenosa",         description: "Emulsione lipidica endovenosa",
-        notes: "Fornisce acidi grassi essenziali. Max 4g/kg/die+        notes: "Fornisce acidi grassi essenziali. Max 4g/kg/die. Osmolarità: ~280 mOsm/L"
-    }, +
-    glucose10: { +
-        name: "Glucosio 10%", +
-        protein: 0, carbs: 10.0, lipids: 0, sodium: 0, potassium: 0, +
-        calcium: 0, phosphorus: 0, magnesium: 0, energy: 40, water: 90, +
-        description: "Soluzione glucosata ipotonica", +
-        notes: "Osmolarità: ~550 mOsm/L. Per volumi elevati" +
-    }, +
-    glucose20: { +
-        name: "Glucosio 20%", +
-        protein: 0, carbs: 20.0, lipids: 0, sodium: 0, potassium: 0, +
-        calcium: 0, phosphorus: 0, magnesium: 0, energy: 80, water: 80, +
-        description: "Soluzione glucosata ipertonica", +
-        notes: "Osmolarità: ~1100 mOsm/L. Concentrazione media" +
-    }, +
-    glucose33: { +
-        name: "Glucosio 33%", +
-        protein: 0, carbs: 33.0, lipids: 0, sodium: 0, potassium: 0, +
-        calcium: 0, phosphorus: 0, magnesium: 0, energy: 132, water: 67, +
-        description: "Soluzione glucosata ipertonica", +
-        notes: "Osmolarità: ~1800 mOsm/L. Per concentrazioni medie"+
     },     },
     glucose50: {     glucose50: {
Linea 987: Linea 2001:
         protein: 0, carbs: 50.0, lipids: 0, sodium: 0, potassium: 0,         protein: 0, carbs: 50.0, lipids: 0, sodium: 0, potassium: 0,
         calcium: 0, phosphorus: 0, magnesium: 0, energy: 200, water: 50,         calcium: 0, phosphorus: 0, magnesium: 0, energy: 200, water: 50,
 +        osmolarity: 2780, // mOsm/L
         description: "Soluzione glucosata molto ipertonica",         description: "Soluzione glucosata molto ipertonica",
-        notes: "Osmolarità: ~2800 mOsm/L. Solo per alte concentrazioni"+        notes: "Osmolarità: ~2780 mOsm/L. Solo per alte concentrazioni"
     },     },
     ca_gluconato: {     ca_gluconato: {
Linea 994: Linea 2009:
         protein: 0, carbs: 0, lipids: 0, sodium: 0, potassium: 0,         protein: 0, carbs: 0, lipids: 0, sodium: 0, potassium: 0,
         calcium: 840, phosphorus: 0, magnesium: 0, energy: 0, water: 90,         calcium: 840, phosphorus: 0, magnesium: 0, energy: 0, water: 90,
 +        osmolarity: 320, // mOsm/L
         description: "Sale di calcio organico",         description: "Sale di calcio organico",
-        notes: "8.4 mg Ca/ml. Non precipita con fosfati"+        notes: "8.4 mg Ca/ml. Non precipita con fosfati. Osmolarità: ~320 mOsm/L"
     },     },
     esafosfina: {     esafosfina: {
Linea 1001: Linea 2017:
         protein: 0, carbs: 0, lipids: 0, sodium: 130, potassium: 0,         protein: 0, carbs: 0, lipids: 0, sodium: 130, potassium: 0,
         calcium: 0, phosphorus: 1600, magnesium: 0, energy: 0, water: 98,         calcium: 0, phosphorus: 1600, magnesium: 0, energy: 0, water: 98,
 +        osmolarity: 450, // mOsm/L
         description: "Glicerofosfato di sodio",         description: "Glicerofosfato di sodio",
-        notes: "16 mg P/ml + 1.3 mEq Na/ml. Fosforo organico"+        notes: "16 mg P/ml + 1.3 mEq Na/ml. Fosforo organico. Osmolarità: ~450 mOsm/L"
     },     },
     mg_sulfate: {     mg_sulfate: {
Linea 1008: Linea 2025:
         protein: 0, carbs: 0, lipids: 0, sodium: 0, potassium: 0,         protein: 0, carbs: 0, lipids: 0, sodium: 0, potassium: 0,
         calcium: 0, phosphorus: 0, magnesium: 800, energy: 0, water: 99,         calcium: 0, phosphorus: 0, magnesium: 800, energy: 0, water: 99,
 +        osmolarity: 1620, // mOsm/L
         description: "Elettrolita essenziale",         description: "Elettrolita essenziale",
-        notes: "8 mEq Mg/ml. Cofattore enzimatico"+        notes: "8 mEq Mg/ml. Cofattore enzimatico. Osmolarità: ~1620 mOsm/L"
     },     },
     nacl: {     nacl: {
Linea 1015: Linea 2033:
         protein: 0, carbs: 0, lipids: 0, sodium: 1000, potassium: 0,         protein: 0, carbs: 0, lipids: 0, sodium: 1000, potassium: 0,
         calcium: 0, phosphorus: 0, magnesium: 0, energy: 0, water: 99,         calcium: 0, phosphorus: 0, magnesium: 0, energy: 0, water: 99,
 +        osmolarity: 2050, // mOsm/L
         description: "Elettrolita essenziale",         description: "Elettrolita essenziale",
-        notes: "10 mEq Na/ml. Prima scelta per supplementazione sodio"+        notes: "10 mEq Na/ml. Prima scelta per supplementazione sodio. Osmolarità: ~2050 mOsm/L" 
 +    }, 
 +    sodium_acetate:
 +        name: "Sodio Acetato (3 mEq/mL)", 
 +        protein: 0, carbs: 0, lipids: 0, sodium: 667, potassium: 0, 
 +        calcium: 0, phosphorus: 0, magnesium: 0, energy: 0, water: 99, 
 +        osmolarity: 1340, // mOsm/L 
 +        description: "Elettrolita alcalinizzante", 
 +        notes: "6.67 mEq Na/ml. Per acidosi: pH < 7.25 o BE < -4. Osmolarità: ~1340 mOsm/L"
     },     },
     kcl: {     kcl: {
Linea 1022: Linea 2049:
         protein: 0, carbs: 0, lipids: 0, sodium: 0, potassium: 1000,         protein: 0, carbs: 0, lipids: 0, sodium: 0, potassium: 1000,
         calcium: 0, phosphorus: 0, magnesium: 0, energy: 0, water: 99,         calcium: 0, phosphorus: 0, magnesium: 0, energy: 0, water: 99,
 +        osmolarity: 2050, // mOsm/L
         description: "Elettrolita essenziale",         description: "Elettrolita essenziale",
-        notes: "10 mEq K/ml. Max velocità infusione: 0.5 mEq/kg/h"+        notes: "10 mEq K/ml. Max velocità infusione: 0.5 mEq/kg/h. Osmolarità: ~2050 mOsm/L" 
 +    }, 
 +    carnitene: { 
 +        name: "Carnitene (100 mg/ml)", 
 +        protein: 0, carbs: 0, lipids: 0, sodium: 0, potassium: 0, 
 +        calcium: 0, phosphorus: 0, magnesium: 0, energy: 0, water: 99, 
 +        osmolarity: 280, // mOsm/L 
 +        carnitine: 10000, // 100 mg/ml = 10000 mg/100ml 
 +        description: "L-Carnitina per NPT prolungata", 
 +        notes: "100 mg/ml. Indicata per NPT > 1 mese. Dose: 5 mg/kg/die. Osmolarità: ~280 mOsm/L"
     }     }
 }; };
Linea 1036: Linea 2073:
     }     }
 }; };
 +
 +// Database medici dinamico
 +let doctorsData = {
 +    dr_bellu: { name: "Roberto", surname: "Bellù", title: "Dr.", fullName: "Dr. Roberto Bellù" },
 +    dr_condo: { name: "Manuela", surname: "Condò", title: "Dr.ssa", fullName: "Dr.ssa Manuela Condò" },
 +    dr_maccioni: { name: "Carla", surname: "Maccioni", title: "Dr.ssa", fullName: "Dr.ssa Carla Maccioni" },
 +    dr_meroni: { name: "Federica", surname: "Meroni", title: "Dr.ssa", fullName: "Dr.ssa Federica Meroni" },
 +    dr_calzatini: { name: "Francesco", surname: "Calzatini", title: "Dr.", fullName: "Dr. Francesco Calzatini" },
 +    dr_ferrari: { name: "Elisabetta", surname: "Ferrari", title: "Dr.ssa", fullName: "Dr.ssa Elisabetta Ferrari" },
 +    dr_ferendeles: { name: "Francesca", surname: "Ferendeles", title: "Dr.ssa", fullName: "Dr.ssa Francesca Ferendeles" },
 +    dr_fumagalli_l: { name: "Letizia", surname: "Fumagalli", title: "Dr.ssa", fullName: "Dr.ssa Letizia Fumagalli" },
 +    dr_fumagalli_m: { name: "Mara", surname: "Fumagalli", title: "Dr.ssa", fullName: "Dr.ssa Mara Fumagalli" },
 +    dr_corno: { name: "Federica", surname: "Corno", title: "Dr.ssa", fullName: "Dr.ssa Federica Corno" },
 +    dr_evasi: { name: "Veronica", surname: "Evasi", title: "Dr.ssa", fullName: "Dr.ssa Veronica Evasi" },
 +    dr_cereda: { name: "Lidia", surname: "Cereda", title: "Dr.ssa", fullName: "Dr.ssa Lidia Cereda" },
 +    dr_ceccon: { name: "Chiara", surname: "Ceccon", title: "Dr.ssa", fullName: "Dr.ssa Chiara Ceccon" },
 +    dr_nava: { name: "Chiara", surname: "Nava", title: "Dr.ssa", fullName: "Dr.ssa Chiara Nava" },
 +    dr_terenzi: { name: "Francesca", surname: "Terenzi", title: "Dr.ssa", fullName: "Dr.ssa Francesca Terenzi" },
 +    dr_raffa: { name: "Milena", surname: "Raffa", title: "Dr.ssa", fullName: "Dr.ssa Milena Raffa" },
 +    dr_aquisti: { name: "Giulia", surname: "Aquisti", title: "Dr.ssa", fullName: "Dr.ssa Giulia Aquisti" }
 +};
 +
 +// Database infermiere dinamico
 +let nursesData = {
 +    inf_rossi: { name: "Maria", surname: "Rossi", title: "Inf.", fullName: "Inf. Maria Rossi" },
 +    inf_bianchi: { name: "Laura", surname: "Bianchi", title: "Inf.", fullName: "Inf. Laura Bianchi" },
 +    inf_verdi: { name: "Giulia", surname: "Verdi", title: "Inf.", fullName: "Inf. Giulia Verdi" },
 +    inf_ferrari: { name: "Anna", surname: "Ferrari", title: "Inf.", fullName: "Inf. Anna Ferrari" },
 +    inf_moretti: { name: "Silvia", surname: "Moretti", title: "Inf.", fullName: "Inf. Silvia Moretti" },
 +    inf_conti: { name: "Elena", surname: "Conti", title: "Inf.", fullName: "Inf. Elena Conti" }
 +};
 +
 +// Database farmacisti dinamico
 +let pharmacistsData = {
 +    farm_lombardi: { name: "Marco", surname: "Lombardi", title: "Dr. Farm.", fullName: "Dr. Farm. Marco Lombardi" },
 +    farm_ricci: { name: "Paolo", surname: "Ricci", title: "Dr. Farm.", fullName: "Dr. Farm. Paolo Ricci" },
 +    farm_marino: { name: "Francesca", surname: "Marino", title: "Dr.ssa Farm.", fullName: "Dr.ssa Farm. Francesca Marino" },
 +    farm_greco: { name: "Andrea", surname: "Greco", title: "Dr. Farm.", fullName: "Dr. Farm. Andrea Greco" },
 +    farm_bruno: { name: "Valentina", surname: "Bruno", title: "Dr.ssa Farm.", fullName: "Dr.ssa Farm. Valentina Bruno" }
 +};
 +
 +// Database tecnici di farmacia dinamico
 +let technicianData = {
 +    tec_russo: { name: "Giuseppe", surname: "Russo", title: "Tec.", fullName: "Tec. Giuseppe Russo" },
 +    tec_gallo: { name: "Roberto", surname: "Gallo", title: "Tec.", fullName: "Tec. Roberto Gallo" },
 +    tec_costa: { name: "Michela", surname: "Costa", title: "Tec.", fullName: "Tec. Michela Costa" },
 +    tec_rizzo: { name: "Alessandro", surname: "Rizzo", title: "Tec.", fullName: "Tec. Alessandro Rizzo" },
 +    tec_longo: { name: "Chiara", surname: "Longo", title: "Tec.", fullName: "Tec. Chiara Longo" },
 +    tec_giordano: { name: "Matteo", surname: "Giordano", title: "Tec.", fullName: "Tec. Matteo Giordano" }
 +};
 +
 +
  
 // VARIABILI GLOBALI // VARIABILI GLOBALI
Linea 1042: Linea 2131:
 let currentRequirements = null; let currentRequirements = null;
  
-// FUNZIONI DI SALVATAGGIO PERSISTENTE +// CONFIGURAZIONE CLINICA AVANZATA (NUOVO
-function saveToStorage() { +let clinicalConfig = { 
-    const configData = { +    calciumReq160
-        formulaDataformulaData+    phosphorusReq84
-        parenteralConfigparenteralConfig+    magnesiumReq0.6
-        fortifierDatafortifierData+    maxGIR12.0, 
-        timestampnew Date().toISOString() +    maxLipids: 3.0, 
-    }; +    maxProtein: 4.5
-    try { +    hospitalName: "ASST LECCO", 
-        localStorage.setItem('npt_calculator_config'JSON.stringify(configData)); +    departmentName: "S.C. Neonatologia e Terapia Intensiva Neonatale"
-        console.log('Configurazione salvata nel localStorage'); +    directorName: "Dr. Roberto Bellù" 
-    } catch (error) { +};
-        console.error('Errore nel salvataggio:'error); +
-    } +
-}+
  
-function loadFromStorage() { +// FUNZIONE RESET PULSANTE FABBISOGNI 
-    try { +function resetNutritionButton() { 
-        const savedData localStorage.getItem('npt_calculator_config'); +    const nutritionBtn document.getElementById('calculateNutritionBtn'); 
-        if (savedData) { +    if (nutritionBtn) { 
-            const configData JSON.parse(savedData)+        nutritionBtn.className 'button calculate-nutrition-pending'; 
-             +        nutritionBtn.innerHTML = 'RICALCOLA FABBISOGNI'
-            // Aggiorna dati globali con quelli salvati +         
-            if (configData.formulaData) { +        // Nascondi risultati precedenti 
-                Object.assign(formulaData, configData.formulaData); +        const nutritionResults = document.getElementById('nutritionResults'); 
-            } +        if (nutritionResults) { 
-            if (configData.parenteralConfig) { +            nutritionResults.classList.add('hidden');
-                Object.assign(parenteralConfig, configData.parenteralConfig); +
-            +
-            if (configData.fortifierData) { +
-                Object.assign(fortifierData, configData.fortifierData); +
-            } +
-             +
-            console.log('Configurazione caricata dal localStorage:', configData.timestamp)+
-            return true;+
         }         }
-    } catch (error) { +         
-        console.error('Errore nel caricamento:', error);+        // Reset anche il pulsante NPT perché i fabbisogni sono cambiati 
 +        resetParenteralButton();
     }     }
-    return false; 
 } }
  
-function resetToDefaults() { +// FUNZIONE RESET PULSANTE PARENTERALE 
-    if (confirm('Sei sicuro di voler ripristinare tutti valori di default? Tutte le modifiche verranno perse.')) { +function resetParenteralButton() { 
-        localStorage.removeItem('npt_calculator_config'); +    const parenteralBtn = document.getElementById('calculateParenteralBtn'); 
-        location.reload();+    if (parenteralBtn) { 
 +        parenteralBtn.className = 'button'; 
 +        parenteralBtn.innerHTML = 'CALCOLA NPT AUTOMATICA'; 
 +         
 +        // Reset anche campi visualizzati 
 +        document.getElementById('calculatedTotalVolume').value = "Premere 'Calcola NPT'"; 
 +        document.getElementById('suggestedGlucose').value = "Premere 'Calcola NPT'"; 
 +        document.getElementById('calculatedProteinVol').value = "--"
 +        document.getElementById('calculatedLipidVol').value = "--"; 
 +         
 +        // Nascondi i risultati precedenti 
 +        const parenteralResults = document.getElementById('parenteralResults'); 
 +        if (parenteralResults) { 
 +            parenteralResults.classList.add('hidden'); 
 +        }
     }     }
 } }
  
-// FUNZIONE CALCOLO ELETTROLITI AGGIUNTIVI + 
-function calculateElectrolyteAdditions(calciumNeeded, phosphorusNeeded, magnesiumNeeded, sodiumNeeded, potassiumNeeded, currentWeightKg) { +// SISTEMA PROTEZIONE CONFIGURAZIONE 
-    const additions +function checkConfigAccess() { 
-        ca_gluconato: 0, +    // Password predefinita (modificabile) 
-        esafosfina: 0, +    const ADMIN_PASSWORD "admin2025";
-        mg_sulfate: 0, +
-        nacl: 0, +
-        kcl: 0, +
-        totalVolume: 0, +
-        providedCalcium: 0, +
-        providedPhosphorus: 0, +
-        providedMagnesium: 0, +
-        providedSodium: 0, +
-        providedPotassium:+
-    };+
          
-    // Calcola fabbisogni totali per paziente +    // Controlla se l'accesso è già stato autorizzato in questa sessione 
-    const totalCalciumNeeded calciumNeeded * currentWeightKg; // mg +    if (window.configAccessGranted === true) { 
-    const totalPhosphorusNeeded phosphorusNeeded * currentWeightKg; // mg +        return true;
-    const totalMagnesiumNeeded magnesiumNeeded * currentWeightKg; // mg +
-    const totalSodiumNeeded = sodiumNeeded * currentWeightKg; // mEq +
-    const totalPotassiumNeeded = potassiumNeeded * currentWeightKg; // mEq +
-     +
-    // Calcio Gluconato 10% (840 mg Ca/100ml) +
-    if (totalCalciumNeeded > 0) { +
-        additions.ca_gluconato = totalCalciumNeeded / (parenteralConfig.ca_gluconato.calcium / 100); +
-        additions.providedCalcium = totalCalciumNeeded;+
     }     }
          
-    // Esafosfina (1600 mg P/100ml + 130 mEq Na/100ml) +    // Richiedi password 
-    if (totalPhosphorusNeeded > 0) { +    const userPassword = prompt
-        additions.esafosfina = totalPhosphorusNeeded / (parenteralConfig.esafosfina.phosphorus / 100); +        "🔐 ACCESSO CONFIGURAZIONE RISERVATO\n\n" + 
-        additions.providedPhosphorus = totalPhosphorusNeeded; +        "Inserire la password di amministrazione per accedere alle impostazioni del sistema NPT Calculator v3.0:" 
-        // Esafosfina fornisce anche sodio +    );
-        additions.providedSodium += (additions.esafosfina * parenteralConfig.esafosfina.sodium / 100); +
-    }+
          
-    // Magnesio Solfato (800 mEq Mg/100ml) +    // Se utente cancella 
-    if (totalMagnesiumNeeded > 0) { +    if (userPassword === null) { 
-        additions.mg_sulfate = totalMagnesiumNeeded / (parenteralConfig.mg_sulfate.magnesium / 100); +        return false;
-        additions.providedMagnesium = totalMagnesiumNeeded;+
     }     }
          
-    // Sodio rimanente (dopo quello da Esafosfina) +    // Verifica password 
-    const remainingSodium Math.max(0, totalSodiumNeeded - additions.providedSodium); +    if (userPassword === ADMIN_PASSWORD) { 
-    if (remainingSodium > 0) +        window.configAccessGranted = true; 
-        additions.nacl = remainingSodium / (parenteralConfig.nacl.sodium / 100); +        alert("✅ Accesso autorizzato!\n\nBenvenuto nella configurazione avanzata NPT Calculator v3.0")
-        additions.providedSodium += remainingSodium;+        return true
 +    } else 
 +        alert("❌ Password non corretta!\n\nAccesso negato alla configurazione."); 
 +        return false;
     }     }
-     
-    // Potassio Cloruro (1000 mEq K/100ml) 
-    if (totalPotassiumNeeded > 0) { 
-        additions.kcl = totalPotassiumNeeded / (parenteralConfig.kcl.potassium / 100); 
-        additions.providedPotassium = totalPotassiumNeeded; 
-    } 
-     
-    // Volume totale degli elettroliti 
-    additions.totalVolume = additions.ca_gluconato + additions.esafosfina + additions.mg_sulfate + additions.nacl + additions.kcl; 
-     
-    return additions; 
 } }
 +
 +// Funzione per logout configurazione
 +function logoutConfig() {
 +    window.configAccessGranted = false;
 +    alert("🔓 Logout configurazione effettuato.\nPer rientrare servirà di nuovo la password.");
 +    // Torna al TAB 1
 +    showTab('patient-data');
 +}
 +
  
 // FUNZIONE CORRETTA PER CAMBIO TAB // FUNZIONE CORRETTA PER CAMBIO TAB
Linea 1177: Linea 2249:
     }     }
          
-    // Popola le tabelle di configurazione quando si apre il TAB 5+    // Sistema di protezione per TAB configurazione
     if (tabId === 'config') {     if (tabId === 'config') {
 +        if (!checkConfigAccess()) {
 +            return; // Blocca l'accesso se password non corretta
 +        }
         setTimeout(() => {         setTimeout(() => {
             populateEnteralConfigTable();             populateEnteralConfigTable();
             populateParenteralConfigTable();             populateParenteralConfigTable();
-            populateFortifierConfigTable();+            populateDoctorsConfigTable(); 
 +            populateNursesConfigTable(); 
 +            populatePharmacistsConfigTable(); 
 +            populateTechniciansConfigTable();
         }, 100);         }, 100);
     }     }
 +
 +// Popola le dropdown del personale quando si apre il TAB 5 (report)
 +if (tabId === 'report') {
 +    setTimeout(() => {
 +        updatePreparationStaffDropdowns();
 +    }, 100);
 } }
  
-// FUNZIONE CALCOLO FASE NUTRIZIONALE+
 + 
 +// FUNZIONE GESTIONE CARTELLA CLINICA 
 +function setupMedicalRecordField() { 
 +    const medicalRecordInput = document.getElementById('medicalRecord'); 
 +    const currentYear = new Date().getFullYear().toString(); 
 +     
 +    // Imposta il valore iniziale con l'anno corrente 
 +    if (!medicalRecordInput.value) { 
 +        medicalRecordInput.value = currentYear; 
 +    } 
 +     
 +    // Gestisce l'input per mantenere sempre l'anno all'inizio 
 +    medicalRecordInput.addEventListener('input', function(e) { 
 +        let value = e.target.value.replace(/\D/g, ''); // Solo numeri 
 +         
 +        // Se l'utente cerca di cancellare l'anno, lo ripristina 
 +        if (value.length < 4 || !value.startsWith(currentYear)) { 
 +            value = currentYear + value.slice(4); 
 +        } 
 +         
 +        // Limita a 10 cifre totali 
 +        if (value.length > 10) { 
 +            value = value.slice(0, 10); 
 +        } 
 +         
 +        e.target.value = value; 
 +    }); 
 +     
 +    // Quando il campo ottiene il focus, posiziona il cursore dopo l'anno 
 +    medicalRecordInput.addEventListener('focus', function(e) { 
 +        if (e.target.value === currentYear) { 
 +            // Posiziona il cursore alla fine 
 +            setTimeout(() => { 
 +                e.target.setSelectionRange(4, 4); 
 +            }, 0); 
 +        } 
 +    }); 
 +     
 +    // Suggerimento visivo 
 +    medicalRecordInput.addEventListener('blur', function(e) { 
 +        if (e.target.value === currentYear) { 
 +            e.target.placeholder = currentYear + '000001'; 
 +        } 
 +    }); 
 +
 + 
 +function updateDoctorsDropdown() { 
 +    console.log('updateDoctorsDropdown chiamata'); 
 +    const prescribingDoctorSelect = document.getElementById('prescribingDoctor'); 
 +    console.log('Elemento prescribingDoctor trovato:', prescribingDoctorSelect); 
 +     
 +    if (!prescribingDoctorSelect) { 
 +        console.error('ERRORE: Elemento prescribingDoctor non trovato!'); 
 +        return; 
 +    } 
 +     
 +    console.log('doctorsData:', doctorsData); 
 +    console.log('Numero medici:', Object.keys(doctorsData).length); 
 +     
 +    const currentValue = prescribingDoctorSelect.value; 
 +    prescribingDoctorSelect.innerHTML = '<option value="">Seleziona medico</option>'; 
 +     
 +    Object.keys(doctorsData).forEach(function(key) { 
 +        const doctor = doctorsData[key]; 
 +        console.log('Aggiungendo medico:', doctor.fullName); 
 +        const option = document.createElement('option'); 
 +        option.value = key; 
 +        option.textContent = doctor.fullName; 
 +        prescribingDoctorSelect.appendChild(option); 
 +    }); 
 +     
 +    // Ripristina il valore precedente se esiste ancora 
 +    if (currentValue && doctorsData[currentValue]) { 
 +        prescribingDoctorSelect.value = currentValue; 
 +    } 
 +     
 +    console.log('Dropdown popolata con', prescribingDoctorSelect.options.length, 'opzioni'); 
 +
 + 
 +// FUNZIONE CALCOLO ETÀ POST-CONCEZIONALE 
 +function calculatePostConceptionalAge() { 
 +    const gestWeeks = parseInt(document.getElementById('gestationalWeeks').value) || 0; 
 +    const gestDays = parseInt(document.getElementById('gestationalDays').value) || 0; 
 +    const daysOfLife = parseInt(document.getElementById('daysOfLife').value) || 0; 
 +     
 +    if (gestWeeks === 0 || daysOfLife === 0) { 
 +        document.getElementById('postConceptionalAge').value = ''; 
 +        return null; 
 +    } 
 +     
 +    // Calcola età post-concezionale 
 +    const totalGestationalDays = (gestWeeks * 7) + gestDays; 
 +    const totalPostConceptionalDays = totalGestationalDays + daysOfLife; 
 +     
 +    // Converti in settimane+giorni 
 +    const pcWeeks = Math.floor(totalPostConceptionalDays / 7); 
 +    const pcDays = totalPostConceptionalDays % 7; 
 +     
 +    const pcAge = pcWeeks + '+' + pcDays; 
 +    document.getElementById('postConceptionalAge').value = pcAge + ' sett.'; 
 +     
 +    return { weeks: pcWeeks, days: pcDays, format: pcAge }; 
 +
 + 
 +// FUNZIONE CALCOLO FASE NUTRIZIONALE (DA VERSIONE 17)
 function calculatePhase() { function calculatePhase() {
-    const birthWeight = parseInt(document.getElementById('birthWeight').value); +    const medicalRecord = document.getElementById('medicalRecord').value; 
-    const currentWeight = parseInt(document.getElementById('currentWeight').value);+    const phaseBirthWeight = parseInt(document.getElementById('birthWeight').value); 
 +    const phaseCurrentWeight = parseInt(document.getElementById('currentWeight').value);
     const daysOfLife = parseInt(document.getElementById('daysOfLife').value);     const daysOfLife = parseInt(document.getElementById('daysOfLife').value);
     const bun = document.getElementById('bun').value;     const bun = document.getElementById('bun').value;
Linea 1196: Linea 2386:
     const sodium = document.getElementById('sodium').value;     const sodium = document.getElementById('sodium').value;
     const ph = document.getElementById('ph').value;     const ph = document.getElementById('ph').value;
 +    const baseExcess = document.getElementById('baseExcess').value;
     const diuresis = document.getElementById('diuresis').value;     const diuresis = document.getElementById('diuresis').value;
 +    const prescriptionDate = document.getElementById('prescriptionDate').value;
 +    const prescribingDoctorValue = document.getElementById('prescribingDoctor').value;
          
-    patientData = { +    // Trova il nome completo del medico 
-        birthWeight: birthWeight,  +    const doctorFullName = prescribingDoctorValue && doctorsData[prescribingDoctorValue] ?  
-        currentWeight: currentWeight,  +                          doctorsData[prescribingDoctorValue].fullName : ''; 
-        daysOfLife: daysOfLife, +     
-        bun: bun, + 
-        glucose: glucose, +// Recupera età gestazionale per i report 
-        sodium: sodium, +const gestationalWeeks = parseInt(document.getElementById('gestationalWeeks').value) || null; 
-        ph: ph, +const gestationalDays = parseInt(document.getElementById('gestationalDays').value) || null; 
-        diuresis: diuresis + 
-    };+// Calcola età post-concezionale 
 +const postConceptionalAge = calculatePostConceptionalAge(); 
 + 
 +patientData = { 
 +    medicalRecordmedicalRecord, 
 +    birthWeight: phaseBirthWeight,  
 +    currentWeight: phaseCurrentWeight,  
 +    daysOfLife: daysOfLife, 
 +    gestationalWeeks: gestationalWeeks, 
 +    gestationalDays: gestationalDays, 
 +    postConceptionalAge: postConceptionalAge, 
 +    bun: bun, 
 +    glucose: glucose, 
 +    sodium: sodium, 
 +    ph: ph, 
 +    baseExcess: baseExcess, 
 +    diuresis: diuresis, 
 +    prescriptionDate: prescriptionDate, 
 +    prescribingDoctor: prescribingDoctorValue, 
 +    prescribingDoctorName: doctorFullName 
 +};
          
     document.getElementById('targetDay').value = daysOfLife;     document.getElementById('targetDay').value = daysOfLife;
Linea 1258: Linea 2471:
         } else if (phValue > 7.45) {         } else if (phValue > 7.45) {
             otherWarnings.push('⚠️ Alcalosi: ridurre bicarbonato, aumentare cloruri');             otherWarnings.push('⚠️ Alcalosi: ridurre bicarbonato, aumentare cloruri');
 +        }
 +    }
 +    
 +    if (baseExcess && baseExcess !== '') {
 +        const beValue = parseFloat(baseExcess);
 +        if (beValue < -4) {
 +            otherWarnings.push('⚠️ BE < -4: Acidosi metabolica - Considera Sodio Acetato in NPT');
 +        } else if (beValue > 2) {
 +            otherWarnings.push('⚠️ BE > +2: Alcalosi metabolica - Ridurre bicarbonato');
 +        }
 +    }
 +    
 +    // Raccomandazione combinata pH + BE per Sodio Acetato
 +    if (ph && baseExcess) {
 +        const phValue = parseFloat(ph);
 +        const beValue = parseFloat(baseExcess);
 +        if (phValue < 7.25 || beValue < -4) {
 +            otherWarnings.push('🧪 RACCOMANDAZIONE: Usa Sodio Acetato invece di NaCl in NPT');
         }         }
     }     }
Linea 1274: Linea 2505:
     phaseInfoHtml += '<div class="form-col">';     phaseInfoHtml += '<div class="form-col">';
     phaseInfoHtml += '<h4>Dati Paziente</h4>';     phaseInfoHtml += '<h4>Dati Paziente</h4>';
-    phaseInfoHtml += '<p><strong>Peso:</strong> ' + currentWeight + 'g (nascita: ' + birthWeight + 'g)</p>';+    if (medicalRecord) { 
 +        phaseInfoHtml += '<p><strong>Cartella:</strong> ' + medicalRecord + '</p>'; 
 +    } 
 +    phaseInfoHtml += '<p><strong>Peso:</strong> ' + phaseCurrentWeight + 'g (nascita: ' + phaseBirthWeight + 'g)</p>';
     phaseInfoHtml += '<p><strong>Giorni di vita:</strong> ' + daysOfLife + '</p>';     phaseInfoHtml += '<p><strong>Giorni di vita:</strong> ' + daysOfLife + '</p>';
 +    
 +  if (gestationalWeeks && gestationalWeeks > 0) {
 +    const gestDaysDisplay = gestationalDays || 0;
 +    phaseInfoHtml += '<p><strong>Età gestazionale:</strong> ' + gestationalWeeks + '+' + gestDaysDisplay + ' settimane</p>';
 +    if (postConceptionalAge && postConceptionalAge.format) {
 +        phaseInfoHtml += '<p><strong>Età post-concezionale:</strong> ' + postConceptionalAge.format + ' settimane</p>';
 +    }
 +    }
     phaseInfoHtml += '<p><strong>Fase nutrizionale:</strong> ' + phase + '</p>';     phaseInfoHtml += '<p><strong>Fase nutrizionale:</strong> ' + phase + '</p>';
     phaseInfoHtml += '</div>';     phaseInfoHtml += '</div>';
Linea 1294: Linea 2536:
         const phStatus = parseFloat(patientData.ph) >= 7.35 && parseFloat(patientData.ph) <= 7.45 ? 'Normale' : 'Fuori range';         const phStatus = parseFloat(patientData.ph) >= 7.35 && parseFloat(patientData.ph) <= 7.45 ? 'Normale' : 'Fuori range';
         phaseInfoHtml += '<p><strong>pH:</strong> ' + patientData.ph + ' (' + phStatus + ')</p>';         phaseInfoHtml += '<p><strong>pH:</strong> ' + patientData.ph + ' (' + phStatus + ')</p>';
 +    }
 +    if (patientData.baseExcess) {
 +        const beStatus = parseFloat(patientData.baseExcess) >= -4 && parseFloat(patientData.baseExcess) <= 2 ? 'Normale' : 'Fuori range';
 +        phaseInfoHtml += '<p><strong>BE:</strong> ' + patientData.baseExcess + ' mEq/L (' + beStatus + ')</p>';
     }     }
     if (patientData.diuresis) {     if (patientData.diuresis) {
Linea 1317: Linea 2563:
     document.getElementById('calculatePhaseBtn').className = 'button config-update-completed';     document.getElementById('calculatePhaseBtn').className = 'button config-update-completed';
     document.getElementById('calculatePhaseBtn').innerHTML = 'FASE CALCOLATA ✓';     document.getElementById('calculatePhaseBtn').innerHTML = 'FASE CALCOLATA ✓';
-+     
- +    // Aggiorna il suggerimento sodio se il TAB 3 è già stato visitato 
-// FUNZIONE AGGIORNAMENTO DISPLAY CONCENTRAZIONE +    updateSodiumRecommendation(); 
-function updateConcentrationDisplay() { +     
-    const concentration = document.getElementById('fortifierConcentration').value+    // RESET anche il pulsante NPT 
-    document.getElementById('concentrationValue').textContent = concentration + '%';+    resetParenteralButton();
 } }
  
Linea 1347: Linea 2593:
 } }
  
-// FUNZIONE CALCOLO NUTRIZIONE ENTERALE AGGIORNATA CON LIQUIDI+// FUNZIONE AGGIORNAMENTO DISPLAY CONCENTRAZIONE 
 +function updateConcentrationDisplay() { 
 +    const concentration = document.getElementById('fortifierConcentration').value; 
 +    document.getElementById('concentrationValue').textContent = concentration + '%'; 
 +
 + 
 +// FUNZIONE CALCOLO NUTRIZIONE ENTERALE (DA VERSIONE 17)
 function calculateEnteral() { function calculateEnteral() {
-    if (!patientData.birthWeight) { +    // Controlla se i dati di base sono presenti 
-        alert('Prima inserire i dati del paziente nel TAB 1');+    const enteralCurrentWeight = parseInt(document.getElementById('currentWeight').value); 
 +    const enteralBirthWeight = parseInt(document.getElementById('birthWeight').value); 
 +     
 +    if (!enteralCurrentWeight || !enteralBirthWeight) { 
 +        alert('Prima inserire peso attuale e peso alla nascita nel TAB 1');
         return;         return;
 +    }
 +    
 +    // Aggiorna patientData se non è stato ancora fatto
 +    if (!patientData.currentWeight) {
 +        patientData.currentWeight = enteralCurrentWeight;
 +        patientData.birthWeight = enteralBirthWeight;
     }     }
          
Linea 1357: Linea 2619:
     const dailyVolume = parseFloat(document.getElementById('dailyVolume').value);     const dailyVolume = parseFloat(document.getElementById('dailyVolume').value);
     const additionalFluids = parseFloat(document.getElementById('additionalFluids').value) || 0;     const additionalFluids = parseFloat(document.getElementById('additionalFluids').value) || 0;
-    const fortifierType = document.getElementById('fortifierType').value; 
-    const fortifierConcentration = parseFloat(document.getElementById('fortifierConcentration').value) || 0; 
          
     const currentWeight = patientData.currentWeight;     const currentWeight = patientData.currentWeight;
Linea 1386: Linea 2646:
         const formula = formulaData[formulaType];         const formula = formulaData[formulaType];
         const volumePerKg = (dailyVolume / currentWeight) * 1000;         const volumePerKg = (dailyVolume / currentWeight) * 1000;
-         
-        // Calcoli base della formula 
-        let totalProtein = formula.protein; 
-        let totalCarbs = formula.carbs; 
-        let totalLipids = formula.lipids; 
-        let totalSodium = formula.sodium; 
-        let totalPotassium = formula.potassium; 
-        let totalCalcium = formula.calcium; 
-        let totalPhosphorus = formula.phosphorus; 
-        let totalMagnesium = formula.magnesium; 
-        let totalEnergy = formula.energy; 
-         
-        let fortifierInfo = ''; 
-         
-        // Aggiunta fortificante se selezionato 
-        if (formulaType === 'maternal' && fortifierType !== 'none' && fortifierConcentration > 0) { 
-            const fortifier = fortifierData[fortifierType]; 
-            const fortifierGramsPer100ml = fortifierConcentration; 
-             
-            const fortifierProteinPer100ml = (fortifier.protein * fortifierGramsPer100ml) / 100; 
-            const fortifierCarbsPer100ml = (fortifier.carbs * fortifierGramsPer100ml) / 100; 
-            const fortifierLipidsPer100ml = (fortifier.lipids * fortifierGramsPer100ml) / 100; 
-            const fortifierSodiumPer100ml = (fortifier.sodium * fortifierGramsPer100ml) / 100; 
-            const fortifierPotassiumPer100ml = (fortifier.potassium * fortifierGramsPer100ml) / 100; 
-            const fortifierCalciumPer100ml = (fortifier.calcium * fortifierGramsPer100ml) / 100; 
-            const fortifierPhosphorusPer100ml = (fortifier.phosphorus * fortifierGramsPer100ml) / 100; 
-            const fortifierMagnesiumPer100ml = (fortifier.magnesium * fortifierGramsPer100ml) / 100; 
-            const fortifierEnergyPer100ml = (fortifier.energy * fortifierGramsPer100ml) / 100; 
-             
-            totalProtein += fortifierProteinPer100ml; 
-            totalCarbs += fortifierCarbsPer100ml; 
-            totalLipids += fortifierLipidsPer100ml; 
-            totalSodium += fortifierSodiumPer100ml; 
-            totalPotassium += fortifierPotassiumPer100ml; 
-            totalCalcium += fortifierCalciumPer100ml; 
-            totalPhosphorus += fortifierPhosphorusPer100ml; 
-            totalMagnesium += fortifierMagnesiumPer100ml; 
-            totalEnergy += fortifierEnergyPer100ml; 
-             
-            fortifierInfo = '<br><strong>Fortificante:</strong> ' + fortifier.name + ' al ' + fortifierConcentration + '% (' + fortifierGramsPer100ml + 'g/100ml)'; 
-        } 
                  
         // Calcoli finali per kg di peso         // Calcoli finali per kg di peso
Linea 1433: Linea 2652:
             additionalFluids: additionalFluids,             additionalFluids: additionalFluids,
             totalFluids: totalFluids,             totalFluids: totalFluids,
-            protein: (dailyVolume * totalProtein / 100) / (currentWeight / 1000), +            protein: (dailyVolume * formula.protein / 100) / (currentWeight / 1000), 
-            carbs: (dailyVolume * totalCarbs / 100) / (currentWeight / 1000), +            carbs: (dailyVolume * formula.carbs / 100) / (currentWeight / 1000), 
-            lipids: (dailyVolume * totalLipids / 100) / (currentWeight / 1000), +            lipids: (dailyVolume * formula.lipids / 100) / (currentWeight / 1000), 
-            energy: (dailyVolume * totalEnergy / 100) / (currentWeight / 1000), +            energy: (dailyVolume * formula.energy / 100) / (currentWeight / 1000), 
-            sodium: (dailyVolume * totalSodium / 100) / (currentWeight / 1000), +            sodium: (dailyVolume * formula.sodium / 100) / (currentWeight / 1000), 
-            potassium: (dailyVolume * totalPotassium / 100) / (currentWeight / 1000), +            potassium: (dailyVolume * formula.potassium / 100) / (currentWeight / 1000), 
-            calcium: (dailyVolume * totalCalcium / 100) / (currentWeight / 1000), +            calcium: (dailyVolume * formula.calcium / 100) / (currentWeight / 1000), 
-            phosphorus: (dailyVolume * totalPhosphorus / 100) / (currentWeight / 1000), +            phosphorus: (dailyVolume * formula.phosphorus / 100) / (currentWeight / 1000), 
-            magnesium: (dailyVolume * totalMagnesium / 100) / (currentWeight / 1000)+            magnesium: (dailyVolume * formula.magnesium / 100) / (currentWeight / 1000)
         };         };
                  
         let tableHtml = '<div class="info">';         let tableHtml = '<div class="info">';
-        tableHtml += '<strong>Formula:</strong> ' + formula.name + fortifierInfo + '<br>';+        tableHtml += '<strong>Formula:</strong> ' + formula.name + '<br>';
         tableHtml += '<strong>Volume latte:</strong> ' + dailyVolume + ' ml (' + volumePerKg.toFixed(1) + ' ml/kg/die)<br>';         tableHtml += '<strong>Volume latte:</strong> ' + dailyVolume + ' ml (' + volumePerKg.toFixed(1) + ' ml/kg/die)<br>';
         if (additionalFluids > 0) {         if (additionalFluids > 0) {
Linea 1457: Linea 2676:
         tableHtml += '<table class="results-table">';         tableHtml += '<table class="results-table">';
         tableHtml += '<tr><th>Nutriente</th><th>Per 100ml</th><th>Per kg/die</th><th>Unita</th></tr>';         tableHtml += '<tr><th>Nutriente</th><th>Per 100ml</th><th>Per kg/die</th><th>Unita</th></tr>';
-        tableHtml += '<tr><td>Proteine</td><td>'totalProtein.toFixed(1) + '</td><td>' + enteralData.protein.toFixed(1) + '</td><td>g</td></tr>'; +        tableHtml += '<tr><td>Proteine</td><td>'formula.protein.toFixed(1) + '</td><td>' + enteralData.protein.toFixed(1) + '</td><td>g</td></tr>'; 
-        tableHtml += '<tr><td>Carboidrati</td><td>'totalCarbs.toFixed(1) + '</td><td>' + enteralData.carbs.toFixed(1) + '</td><td>g</td></tr>'; +        tableHtml += '<tr><td>Carboidrati</td><td>'formula.carbs.toFixed(1) + '</td><td>' + enteralData.carbs.toFixed(1) + '</td><td>g</td></tr>'; 
-        tableHtml += '<tr><td>Lipidi</td><td>'totalLipids.toFixed(1) + '</td><td>' + enteralData.lipids.toFixed(1) + '</td><td>g</td></tr>'; +        tableHtml += '<tr><td>Lipidi</td><td>'formula.lipids.toFixed(1) + '</td><td>' + enteralData.lipids.toFixed(1) + '</td><td>g</td></tr>'; 
-        tableHtml += '<tr class="energy-highlight"><td><strong>Energia</strong></td><td><strong>'totalEnergy.toFixed(0) + '</strong></td><td><strong>' + enteralData.energy.toFixed(0) + '</strong></td><td><strong>kcal</strong></td></tr>';+        tableHtml += '<tr class="energy-highlight"><td><strong>Energia</strong></td><td><strong>'formula.energy.toFixed(0) + '</strong></td><td><strong>' + enteralData.energy.toFixed(0) + '</strong></td><td><strong>kcal</strong></td></tr>';
         tableHtml += '</table>';         tableHtml += '</table>';
-         
-        if (fortifierType !== 'none' && fortifierConcentration > 0) { 
-            tableHtml += '<div class="info">'; 
-            tableHtml += '<strong>Dettaglio Fortificazione:</strong><br>'; 
-            tableHtml += '• <strong>Fortificante:</strong> ' + fortifierData[fortifierType].name + '<br>'; 
-            tableHtml += '• <strong>Concentrazione:</strong> ' + fortifierConcentration + '% (' + fortifierConcentration + 'g/100ml)<br>'; 
-            tableHtml += '• <strong>Dose totale:</strong> ' + (dailyVolume * fortifierConcentration / 100).toFixed(1) + 'g/die<br>'; 
-            tableHtml += '• <strong>Range raccomandato:</strong> ' + (fortifierData[fortifierType].dose || '2-6g/100ml'); 
-            tableHtml += '</div>'; 
-        } 
                  
         document.getElementById('enteralTable').innerHTML = tableHtml;         document.getElementById('enteralTable').innerHTML = tableHtml;
Linea 1484: Linea 2693:
         enteralBtn.innerHTML = 'Apporti Enterali Calcolati ✓';         enteralBtn.innerHTML = 'Apporti Enterali Calcolati ✓';
     }     }
 +    
 +    // RESET del pulsante Fabbisogni quando si modificano gli apporti enterali
 +    resetNutritionButton();
 } }
  
-// FUNZIONE CARICAMENTO VALORI STANDARD+// FUNZIONE CARICAMENTO VALORI STANDARD (DA VERSIONE 17)
 function loadNutritionDefaults() { function loadNutritionDefaults() {
-    if (!patientData.birthWeight) { +    // Controlla se i dati di base sono presenti 
-        alert('Prima inserire i dati del paziente nel TAB 1');+    const defaultsCurrentWeight = parseInt(document.getElementById('currentWeight').value); 
 +    const defaultsBirthWeight = parseInt(document.getElementById('birthWeight').value); 
 +    const defaultsDaysOfLife = parseInt(document.getElementById('daysOfLife').value); 
 +     
 +    if (!defaultsCurrentWeight || !defaultsBirthWeight || !defaultsDaysOfLife) { 
 +        alert('Prima inserire peso attuale, peso alla nascita e giorni di vita nel TAB 1');
         return;         return;
 +    }
 +    
 +    // Aggiorna patientData se non è stato ancora fatto
 +    if (!patientData.currentWeight) {
 +        patientData.currentWeight = defaultsCurrentWeight;
 +        patientData.birthWeight = defaultsBirthWeight;
 +        patientData.daysOfLife = defaultsDaysOfLife;
     }     }
          
     const targetDay = parseInt(document.getElementById('targetDay').value);     const targetDay = parseInt(document.getElementById('targetDay').value);
-    const birthWeight = patientData.birthWeight;+    const patientBirthWeightForCalculation = patientData.birthWeight;
          
     const weightCategorySelect = document.getElementById('weightCategory');     const weightCategorySelect = document.getElementById('weightCategory');
-    let selectedCategory = weightCategorySelect.value || (birthWeight <= 1500 ? '≤1500g' : '>1500g');+    let selectedCategory = weightCategorySelect.value || (patientBirthWeightForCalculation <= 1500 ? '≤1500g' : '>1500g');
     weightCategorySelect.value = selectedCategory;     weightCategorySelect.value = selectedCategory;
          
Linea 1523: Linea 2747:
     document.getElementById('reqCarbs').value = plan.carbs;     document.getElementById('reqCarbs').value = plan.carbs;
     document.getElementById('reqLipids').value = plan.lipids;     document.getElementById('reqLipids').value = plan.lipids;
-    document.getElementById('reqCalcium').value = targetDay > 3 ? 160 : 0; +     
-    document.getElementById('reqPhosphorus').value = targetDay > 3 ? 84 : 0; +    // Usa configurazione clinica per elettroliti 
-    document.getElementById('reqMagnesium').value = targetDay > 3 ? : 0;+    document.getElementById('reqCalcium').value = targetDay > 3 ? clinicalConfig.calciumReq : 0; 
 +    document.getElementById('reqPhosphorus').value = targetDay > 3 ? clinicalConfig.phosphorusReq : 0; 
 +    document.getElementById('reqMagnesium').value = targetDay > 3 ? clinicalConfig.magnesiumReq : 0;
     document.getElementById('reqSodium').value = targetDay > 2 ? 2.0 : 0;     document.getElementById('reqSodium').value = targetDay > 2 ? 2.0 : 0;
     document.getElementById('reqPotassium').value = targetDay > 2 ? 1.5 : 0;     document.getElementById('reqPotassium').value = targetDay > 2 ? 1.5 : 0;
          
-    updateVitaminsAndTrace(); +    // Gestione automatica tipo di sodio basata sui parametri clinici 
-     +    const sodiumSelect = document.getElementById('sodiumType'); 
-    document.getElementById('loadDefaultsBtn').className = 'button load-defaults-completed'+    if (patientData.ph || patientData.baseExcess
-    document.getElementById('loadDefaultsBtn').innerHTML 'Valori Caricati'+        const ph = patientData.ph ? parseFloat(patientData.ph) : null; 
-+        const be patientData.baseExcess ? parseFloat(patientData.baseExcess) : null
- +         
-// FUNZIONE AGGIORNAMENTO VITAMINE +        // Auto-seleziona Sodio Acetato se acidosi 
-function updateVitaminsAndTrace() { +        if ((ph && ph < 7.30) || (be && be < -4)) { 
-    if (!patientData.currentWeight || !patientData.daysOfLife) { +            sodiumSelect.value = 'sodium_acetate'; 
-        return { vitalipid: 0, soluvit: 0, peditrace: 0, enteralVolumePerKg:};+        } else { 
 +            sodiumSelect.value = 'nacl'; 
 +        }
     }     }
          
-    const targetDay = parseInt(document.getElementById('targetDay').value); +    // Aggiorna il suggerimento sodio 
-    const currentWeight = patientData.currentWeight; +    updateSodiumRecommendation();
-    const enteralVolumePerKg = enteralData ? (enteralData.totalFluids / currentWeight * 1000: 0;+
          
-    let vitalipid = 0; +    // Gestione vitamine/oligoelementi con controllo enterale 
-    let soluvit 0+    const patientCurrentWeight patientData.currentWeight
-    let peditrace = 0;+    const enteralVolumePerKg enteralData ? (enteralData.totalFluids / patientCurrentWeight * 1000) : 0;
          
-    if (targetDay >= 4) { +    if (targetDay >= 3 && enteralVolumePerKg < 100) { 
-        if (enteralVolumePerKg < 100) { +        document.getElementById('reqVitalipid').value 4.0; 
-            vitalipid 5.0; +        document.getElementById('reqSoluvit').value 1.0; 
-            soluvit 2.0; +        document.getElementById('reqPeditrace').value = 1.0; 
-            peditrace = 1.0; +    else { 
-        }+        // Mantieni i valori a zero se prima del 3° giorno o se enterale ≥100 ml/kg/die 
 +        document.getElementById('reqVitalipid').value = 0; 
 +        document.getElementById('reqSoluvit').value = 0; 
 +        document.getElementById('reqPeditrace').value = 0;
     }     }
          
-    // Aggiorna solo se i campi sono a zero (non modificati manualmente+    document.getElementById('reqCarnitine').value = 0; // La carnitina verrà gestita separatamente 
-    if (document.getElementById('reqVitalipid').value == 0) { +     
-        document.getElementById('reqVitalipid').value vitalipid+    document.getElementById('loadDefaultsBtn').className 'button load-defaults-completed'; 
-    } +    document.getElementById('loadDefaultsBtn').innerHTML 'Valori Caricati ✓'
-    if (document.getElementById('reqSoluvit').value == 0{ +     
-        document.getElementById('reqSoluvit').value = soluvit+    // RESET del pulsante Fabbisogni quando si modificano i valori standard 
-    } +    resetNutritionButton(); 
-    if (document.getElementById('reqPeditrace').value == 0) { +
-        document.getElementById('reqPeditrace').value = peditrace;+ 
 +// FUNZIONE AGGIORNAMENTO UNITÀ CARBOIDRATI 
 +function updateCarbUnit() { 
 +    const unit = document.getElementById('carbUnit').value
 +    const carbLabel document.getElementById('carbLabel'); 
 +    const carbInput = document.getElementById('reqCarbs'); 
 +     
 +    if (unit === 'mg') { 
 +        carbLabel.textContent = 'Glucidi (mg/kg/min):'
 +        carbInput.setAttribute('max', '15')
 +        carbInput.setAttribute('step', '0.1')
 +    } else 
 +        carbLabel.textContent = 'Glucidi (g/kg/die):'
 +        carbInput.setAttribute('max', '20')
 +        carbInput.setAttribute('step', '0.1');
     }     }
          
-    return {  +    // Reset fabbisogni quando si cambia unità 
-        vitalipid: parseFloat(document.getElementById('reqVitalipid').value),  +    resetNutritionButton();
-        soluvit: parseFloat(document.getElementById('reqSoluvit').value),  +
-        peditrace: parseFloat(document.getElementById('reqPeditrace').value),  +
-        enteralVolumePerKg: enteralVolumePerKg  +
-    };+
 } }
  
 // FUNZIONE AGGIORNAMENTO CATEGORIA PESO // FUNZIONE AGGIORNAMENTO CATEGORIA PESO
 function updateWeightCategory() { function updateWeightCategory() {
-    document.getElementById('loadDefaultsBtn').className = 'button load-defaults-pending'; +    // Reset fabbisogni quando si cambia categoria peso 
-    document.getElementById('loadDefaultsBtn').innerHTML = 'Carica Valori Standard';+    resetNutritionButton();
 } }
  
-// FUNZIONE CALCOLO FABBISOGNI NUTRIZIONALI+// FUNZIONE AGGIORNAMENTO TIPO SODIO 
 +function updateSodiumChoice() { 
 +    // Resetta i fabbisogni quando si cambia il tipo di sodio 
 +    resetNutritionButton(); 
 +
 + 
 +// FUNZIONE AGGIORNAMENTO SUGGERIMENTO SODIO 
 +function updateSodiumRecommendation() { 
 +    const sodiumSelect = document.getElementById('sodiumType'); 
 +    const recommendationDiv = document.getElementById('sodiumRecommendation'); 
 +     
 +    if (!patientData.ph && !patientData.baseExcess) { 
 +        // Nessun dato clinico disponibile 
 +        recommendationDiv.classList.add('hidden'); 
 +        return; 
 +    } 
 +     
 +    const ph = patientData.ph ? parseFloat(patientData.ph) : null; 
 +    const be = patientData.baseExcess ? parseFloat(patientData.baseExcess) : null; 
 +     
 +    // Logica di raccomandazione 
 +    let needsAcetate = false; 
 +    let reason = ''; 
 +     
 +    if (ph && ph < 7.30) { 
 +        needsAcetate = true; 
 +        reason = 'pH < 7.30 (acidosi)'; 
 +    } else if (be && be < -4) { 
 +        needsAcetate = true; 
 +        reason = 'BE < -4 mEq/L (acidosi metabolica)'; 
 +    } else if (ph && be && (ph < 7.30 || be < -4)) { 
 +        needsAcetate = true; 
 +        reason = 'pH < 7.30 o BE < -4 (acidosi)'; 
 +    } 
 +     
 +    if (needsAcetate) { 
 +        // Suggerisci Sodio Acetato 
 +        if (sodiumSelect.value === 'nacl') { 
 +            // L'utente ha selezionato NaCl ma dovrebbe usare Acetato 
 +            recommendationDiv.innerHTML = '<div class="warning" style="padding: 8px; font-size: 12px;">'
 +                '<strong>⚠️ RACCOMANDAZIONE CLINICA:</strong><br>'
 +                'In base ai parametri clinici (' + reason + '), si raccomanda <strong>Sodio Acetato</strong> invece di Sodio Cloruro per effetto alcalinizzante.'
 +                '</div>'; 
 +            recommendationDiv.classList.remove('hidden'); 
 +        } else { 
 +            // L'utente ha già selezionato Acetato - mostra conferma 
 +            recommendationDiv.innerHTML = '<div class="info" style="padding: 8px; font-size: 12px;">'
 +                '<strong>✅ SCELTA APPROPRIATA:</strong><br>'
 +                'Sodio Acetato è indicato per i parametri clinici attuali (' + reason + ').'
 +                '</div>'; 
 +            recommendationDiv.classList.remove('hidden'); 
 +        } 
 +    } else { 
 +        // Parametri normali 
 +        if (sodiumSelect.value === 'sodium_acetate') { 
 +            // L'utente ha selezionato Acetato ma i parametri sono normali 
 +            recommendationDiv.innerHTML = '<div class="info" style="padding: 8px; font-size: 12px;">'
 +                '<strong>ℹ️ NOTA:</strong><br>'
 +                'I parametri clinici sono nella norma. Sodio Cloruro potrebbe essere sufficiente, ma Sodio Acetato è comunque sicuro.'
 +                '</div>'; 
 +            recommendationDiv.classList.remove('hidden'); 
 +        } else { 
 +            // Tutto normale 
 +            recommendationDiv.classList.add('hidden'); 
 +        } 
 +    } 
 +
 + 
 +// FUNZIONE CALCOLO FABBISOGNI NUTRIZIONALI (DA VERSIONE 17)
 function calculateNutrition() { function calculateNutrition() {
-    if (!patientData.birthWeight) { +    // Controlla se i dati di base sono presenti 
-        alert('Prima inserire i dati del paziente nel TAB 1');+    const nutritionCurrentWeight = parseInt(document.getElementById('currentWeight').value); 
 +    const nutritionBirthWeight = parseInt(document.getElementById('birthWeight').value); 
 +     
 +    if (!nutritionCurrentWeight || !nutritionBirthWeight) { 
 +        alert('Prima inserire peso attuale e peso alla nascita nel TAB 1');
         return;         return;
 +    }
 +    
 +    // Aggiorna patientData se non è stato ancora fatto
 +    if (!patientData.currentWeight) {
 +        patientData.currentWeight = nutritionCurrentWeight;
 +        patientData.birthWeight = nutritionBirthWeight;
     }     }
          
Linea 1593: Linea 2911:
         protein: parseFloat(document.getElementById('reqProtein').value),         protein: parseFloat(document.getElementById('reqProtein').value),
         carbs: parseFloat(document.getElementById('reqCarbs').value),         carbs: parseFloat(document.getElementById('reqCarbs').value),
 +        carbUnit: document.getElementById('carbUnit').value,
         lipids: parseFloat(document.getElementById('reqLipids').value),         lipids: parseFloat(document.getElementById('reqLipids').value),
         calcium: parseFloat(document.getElementById('reqCalcium').value),         calcium: parseFloat(document.getElementById('reqCalcium').value),
Linea 1599: Linea 2918:
         sodium: parseFloat(document.getElementById('reqSodium').value),         sodium: parseFloat(document.getElementById('reqSodium').value),
         potassium: parseFloat(document.getElementById('reqPotassium').value),         potassium: parseFloat(document.getElementById('reqPotassium').value),
-        vitalipid: parseFloat(document.getElementById('reqVitalipid').value), +        vitalipid: parseFloat(document.getElementById('reqVitalipid').value) || 0
-        soluvit: parseFloat(document.getElementById('reqSoluvit').value), +        soluvit: parseFloat(document.getElementById('reqSoluvit').value) || 0
-        peditrace: parseFloat(document.getElementById('reqPeditrace').value)+        peditrace: parseFloat(document.getElementById('reqPeditrace').value) || 0, 
 +        carnitine: parseFloat(document.getElementById('reqCarnitine').value) || 0
     };     };
          
-    const vitaminsInfo = updateVitaminsAndTrace(); +    // Converti carboidrati sempre in g/kg/die per i calcoli 
-    requirements.vitalipid vitaminsInfo.vitalipid+    const carbsGPerKgDay = requirements.carbUnit === 'mg' ?  
-    requirements.soluvit vitaminsInfo.soluvit+        (requirements.carbs * 1440 / 1000) : requirements.carbs
-    requirements.peditrace vitaminsInfo.peditrace;+     
 +    const patientCurrentWeight patientData.currentWeight
 +    const enteralVolumePerKg enteralData ? (enteralData.totalFluids / patientCurrentWeight * 1000) : 0;
          
     const enteralProtein = enteralData ? enteralData.protein : 0;     const enteralProtein = enteralData ? enteralData.protein : 0;
Linea 1615: Linea 2937:
          
     const residualProtein = Math.max(0, requirements.protein - enteralProtein);     const residualProtein = Math.max(0, requirements.protein - enteralProtein);
-    const residualCarbs = Math.max(0, requirements.carbs - enteralCarbs);+    const residualCarbs = Math.max(0, carbsGPerKgDay - enteralCarbs);
     const residualLipids = Math.max(0, requirements.lipids - enteralLipids);     const residualLipids = Math.max(0, requirements.lipids - enteralLipids);
-    const totalEnergyRequirement = (requirements.protein * 4) + (requirements.carbs * 4) + (requirements.lipids * 9);+    const totalEnergyRequirement = (requirements.protein * 4) + (carbsGPerKgDay * 4) + (requirements.lipids * 9);
     const residualEnergy = Math.max(0, totalEnergyRequirement - enteralEnergy);     const residualEnergy = Math.max(0, totalEnergyRequirement - enteralEnergy);
          
Linea 1633: Linea 2955:
     const residualSodium = Math.max(0, requirements.sodium - enteralSodium);     const residualSodium = Math.max(0, requirements.sodium - enteralSodium);
     const residualPotassium = Math.max(0, requirements.potassium - enteralPotassium);     const residualPotassium = Math.max(0, requirements.potassium - enteralPotassium);
-     
-    let bunNote = ''; 
-    if (patientData.bun && patientData.bun !== '') { 
-        const bunValue = parseFloat(patientData.bun); 
-        if (bunValue < 9) { 
-            bunNote = '<div class="info"><strong>BUN < 9 mg/dL:</strong> Proteine aumentate automaticamente per ottimizzazione nutrizionale</div>'; 
-        } else if (bunValue > 14) { 
-            bunNote = '<div class="warning"><strong>BUN > 14 mg/dL:</strong> Proteine ridotte automaticamente per protezione renale</div>'; 
-        } 
-    } 
-     
-    let vitaminsNote = ''; 
-    if (vitaminsInfo.enteralVolumePerKg >= 100) { 
-        vitaminsNote = '<div class="info"><strong>Vitamine/Oligoelementi:</strong> Sospesi automaticamente (enterale ≥100 ml/kg/die)</div>'; 
-    } else if (patientData.daysOfLife >= 4 && requirements.vitalipid > 0) { 
-        vitaminsNote = '<div class="info"><strong>Vitamine/Oligoelementi:</strong> Vitalipid 5ml + Soluvit 2ml (dal 4° giorno)</div>'; 
-    } else if (patientData.daysOfLife < 4) { 
-        vitaminsNote = '<div class="info"><strong>Vitamine/Oligoelementi:</strong> Non necessari prima del 4° giorno di vita</div>'; 
-    } 
          
     window.residualNeeds = {     window.residualNeeds = {
Linea 1666: Linea 2969:
         soluvit: requirements.soluvit,         soluvit: requirements.soluvit,
         peditrace: requirements.peditrace,         peditrace: requirements.peditrace,
 +        carnitine: requirements.carnitine,
         energy: residualEnergy,         energy: residualEnergy,
         totalEnergyRequirement: totalEnergyRequirement         totalEnergyRequirement: totalEnergyRequirement
     };     };
 +    
 +    // Calcola mg/kg/min per la tabella
 +    const carbsMgPerKgMin = (carbsGPerKgDay * 1000) / 1440;
 +    const enteralCarbsMgPerKgMin = (enteralCarbs * 1000) / 1440;
 +    const residualCarbsMgPerKgMin = (residualCarbs * 1000) / 1440;
          
     let tableHtml = '<table class="nutrition-table">';     let tableHtml = '<table class="nutrition-table">';
-    tableHtml += '<tr><th>Componente</th><th>Fabbisogno</th><th>Da Enterale</th><th>Da NPT</th><th>Unita</th></tr>';+    tableHtml += '<tr><th>Componente</th><th>Fabbisogno</th><th>Da Enterale</th><th>Da NPT</th><th>Unità</th></tr>';
     tableHtml += '<tr><td><strong>Liquidi</strong></td><td><strong>' + requirements.liquids + '</strong></td><td><strong>' + (enteralData ? (enteralData.totalFluids/patientData.currentWeight*1000).toFixed(1) : '0') + '</strong></td><td class="highlight"><strong>' + Math.max(0, requirements.liquids - (enteralData ? enteralData.totalFluids/patientData.currentWeight*1000 : 0)).toFixed(1) + '</strong></td><td><strong>ml/kg/die</strong></td></tr>';     tableHtml += '<tr><td><strong>Liquidi</strong></td><td><strong>' + requirements.liquids + '</strong></td><td><strong>' + (enteralData ? (enteralData.totalFluids/patientData.currentWeight*1000).toFixed(1) : '0') + '</strong></td><td class="highlight"><strong>' + Math.max(0, requirements.liquids - (enteralData ? enteralData.totalFluids/patientData.currentWeight*1000 : 0)).toFixed(1) + '</strong></td><td><strong>ml/kg/die</strong></td></tr>';
     tableHtml += '<tr><td>Proteine</td><td>' + requirements.protein + '</td><td>' + enteralProtein.toFixed(1) + '</td><td class="highlight">' + residualProtein.toFixed(1) + '</td><td>g/kg/die</td></tr>';     tableHtml += '<tr><td>Proteine</td><td>' + requirements.protein + '</td><td>' + enteralProtein.toFixed(1) + '</td><td class="highlight">' + residualProtein.toFixed(1) + '</td><td>g/kg/die</td></tr>';
-    tableHtml += '<tr><td>Carboidrati</td><td>'requirements.carbs + '</td><td>' + enteralCarbs.toFixed(1) + '</td><td class="highlight">' + residualCarbs.toFixed(1) + '</td><td>g/kg/die</td></tr>';+    tableHtml += '<tr><td>Glucidi (g/kg/die)</td><td>'carbsGPerKgDay.toFixed(1) + '</td><td>' + enteralCarbs.toFixed(1) + '</td><td class="highlight">' + residualCarbs.toFixed(1) + '</td><td>g/kg/die</td></tr>'; 
 +    tableHtml += '<tr><td>Glucidi (mg/kg/min)</td><td>' + carbsMgPerKgMin.toFixed(1) + '</td><td>' + enteralCarbsMgPerKgMin.toFixed(1) + '</td><td class="highlight">' + residualCarbsMgPerKgMin.toFixed(1) + '</td><td>mg/kg/min</td></tr>';
     tableHtml += '<tr><td>Lipidi</td><td>' + requirements.lipids + '</td><td>' + enteralLipids.toFixed(1) + '</td><td class="highlight">' + residualLipids.toFixed(1) + '</td><td>g/kg/die</td></tr>';     tableHtml += '<tr><td>Lipidi</td><td>' + requirements.lipids + '</td><td>' + enteralLipids.toFixed(1) + '</td><td class="highlight">' + residualLipids.toFixed(1) + '</td><td>g/kg/die</td></tr>';
-     +    tableHtml += '<tr><td>Calcio elementare</td><td>' + requirements.calcium + '</td><td>' + enteralCalcium.toFixed(1) + '</td><td class="highlight">' + residualCalcium.toFixed(1) + '</td><td>mg/kg/die</td></tr>';
-    tableHtml += '<tr><td>Calcio</td><td>' + requirements.calcium + '</td><td>' + enteralCalcium.toFixed(1) + '</td><td class="highlight">' + residualCalcium.toFixed(1) + '</td><td>mg/kg/die</td></tr>';+
     tableHtml += '<tr><td>Fosforo</td><td>' + requirements.phosphorus + '</td><td>' + enteralPhosphorus.toFixed(1) + '</td><td class="highlight">' + residualPhosphorus.toFixed(1) + '</td><td>mg/kg/die</td></tr>';     tableHtml += '<tr><td>Fosforo</td><td>' + requirements.phosphorus + '</td><td>' + enteralPhosphorus.toFixed(1) + '</td><td class="highlight">' + residualPhosphorus.toFixed(1) + '</td><td>mg/kg/die</td></tr>';
-    tableHtml += '<tr><td>Magnesio</td><td>' + requirements.magnesium + '</td><td>' + enteralMagnesium.toFixed(1) + '</td><td class="highlight">' + residualMagnesium.toFixed(1) + '</td><td>mg/kg/die</td></tr>';+    tableHtml += '<tr><td>Magnesio</td><td>' + requirements.magnesium + '</td><td>' + enteralMagnesium.toFixed(2) + '</td><td class="highlight">' + residualMagnesium.toFixed(2) + '</td><td>mEq/kg/die</td></tr>';
     tableHtml += '<tr><td>Sodio</td><td>' + requirements.sodium + '</td><td>' + enteralSodium.toFixed(2) + '</td><td class="highlight">' + residualSodium.toFixed(2) + '</td><td>mEq/kg/die</td></tr>';     tableHtml += '<tr><td>Sodio</td><td>' + requirements.sodium + '</td><td>' + enteralSodium.toFixed(2) + '</td><td class="highlight">' + residualSodium.toFixed(2) + '</td><td>mEq/kg/die</td></tr>';
     tableHtml += '<tr><td>Potassio</td><td>' + requirements.potassium + '</td><td>' + enteralPotassium.toFixed(2) + '</td><td class="highlight">' + residualPotassium.toFixed(2) + '</td><td>mEq/kg/die</td></tr>';     tableHtml += '<tr><td>Potassio</td><td>' + requirements.potassium + '</td><td>' + enteralPotassium.toFixed(2) + '</td><td class="highlight">' + residualPotassium.toFixed(2) + '</td><td>mEq/kg/die</td></tr>';
-    tableHtml += '<tr><td>Vitalipid</td><td>' + requirements.vitalipid + '</td><td>0</td><td class="highlight">' + requirements.vitalipid + '</td><td>ml/die</td></tr>'; +    tableHtml += '<tr><td>Vitalipid</td><td>' + requirements.vitalipid + '</td><td>0</td><td class="highlight">' + requirements.vitalipid + '</td><td>ml/kg/die</td></tr>'; 
-    tableHtml += '<tr><td>Soluvit</td><td>' + requirements.soluvit + '</td><td>0</td><td class="highlight">' + requirements.soluvit + '</td><td>ml/die</td></tr>'; +    tableHtml += '<tr><td>Soluvit</td><td>' + requirements.soluvit + '</td><td>0</td><td class="highlight">' + requirements.soluvit + '</td><td>ml/kg/die</td></tr>'; 
-    tableHtml += '<tr><td>Peditrace</td><td>' + requirements.peditrace + '</td><td>0</td><td class="highlight">' + requirements.peditrace + '</td><td>ml/die</td></tr>'; +    tableHtml += '<tr><td>Peditrace</td><td>' + requirements.peditrace + '</td><td>0</td><td class="highlight">' + requirements.peditrace + '</td><td>ml/kg/die</td></tr>'; 
-    tableHtml += '<tr class="day-column"><td><strong>ENERGIA</strong></td><td><strong>' + totalEnergyRequirement.toFixed(0) + '</strong></td><td><strong>' + enteralEnergy.toFixed(0) + '</strong></td><td class="energy-highlight">' + residualEnergy.toFixed(0) + '</td><td><strong>kcal/kg/die</strong></td></tr>';+    tableHtml += '<tr><td>Carnitina</td><td>' + requirements.carnitine + '</td><td>0</td><td class="highlight">' + requirements.carnitine + '</td><td>mg/kg/die</td></tr>'; 
 +    tableHtml += '<tr class="day-column"><td><strong>ENERGIA TOTALE</strong></td><td><strong>' + totalEnergyRequirement.toFixed(0) + '</strong></td><td><strong>' + enteralEnergy.toFixed(0) + '</strong></td><td class="energy-highlight">' + residualEnergy.toFixed(0) + '</td><td><strong>kcal/kg/die</strong></td></tr>';
     tableHtml += '</table>';     tableHtml += '</table>';
-     
-    tableHtml += vitaminsNote; 
-    tableHtml += bunNote; 
          
     document.getElementById('nutritionTable').innerHTML = tableHtml;     document.getElementById('nutritionTable').innerHTML = tableHtml;
     document.getElementById('nutritionResults').classList.remove('hidden');     document.getElementById('nutritionResults').classList.remove('hidden');
     document.getElementById('calculateNutritionBtn').className = 'button calculate-nutrition-completed';     document.getElementById('calculateNutritionBtn').className = 'button calculate-nutrition-completed';
-    document.getElementById('calculateNutritionBtn').innerHTML = 'FABBISOGNI CALCOLATI';+    document.getElementById('calculateNutritionBtn').innerHTML = 'FABBISOGNI CALCOLATI '
 +     
 +    // RESET del pulsante NPT quando si modificano i fabbisogni 
 +    resetParenteralButton(); 
 +
 + 
 +// FUNZIONE CALCOLO ELETTROLITI AGGIUNTIVI (DA VERSIONE 17) 
 +function calculateElectrolyteAdditions(calciumNeeded, phosphorusNeeded, magnesiumNeeded, sodiumNeeded, potassiumNeeded, currentWeightKg) { 
 +    const additions = { 
 +        ca_gluconato: 0, 
 +        esafosfina: 0, 
 +        mg_sulfate: 0, 
 +        nacl: 0, 
 +        sodium_acetate: 0, 
 +        kcl: 0, 
 +        totalVolume: 0, 
 +        sodiumSource: 'nacl' 
 +    }; 
 +     
 +    // Determina il tipo di sodio da utilizzare 
 +    const sodiumTypeSelect = document.getElementById('sodiumType'); 
 +    const selectedSodiumType = sodiumTypeSelect ? sodiumTypeSelect.value : 'nacl'; 
 +    additions.sodiumSource = selectedSodiumType; 
 +     
 +    // Calcola fabbisogni totali per paziente 
 +    const totalCalciumNeeded = calciumNeeded * currentWeightKg; // mg 
 +    const totalPhosphorusNeeded = phosphorusNeeded * currentWeightKg; // mg 
 +    const totalMagnesiumNeeded = magnesiumNeeded * currentWeightKg; // mEq 
 +    const totalSodiumNeeded = sodiumNeeded * currentWeightKg; // mEq 
 +    const totalPotassiumNeeded = potassiumNeeded * currentWeightKg; // mEq 
 +     
 +    // Calcio Gluconato 10% (840 mg Ca/100ml) 
 +    if (totalCalciumNeeded > 0) { 
 +        additions.ca_gluconato = totalCalciumNeeded / (parenteralConfig.ca_gluconato.calcium / 100); 
 +    } 
 +     
 +    // Esafosfina (1600 mg P/100ml + 130 mEq Na/100ml) 
 +    let sodiumFromEsafosfina = 0; 
 +    if (totalPhosphorusNeeded > 0) { 
 +        additions.esafosfina = totalPhosphorusNeeded / (parenteralConfig.esafosfina.phosphorus / 100); 
 +        sodiumFromEsafosfina = (additions.esafosfina * parenteralConfig.esafosfina.sodium / 100); 
 +    } 
 +     
 +    // Magnesio Solfato (800 mEq Mg/100ml) 
 +    if (totalMagnesiumNeeded > 0) { 
 +        additions.mg_sulfate = totalMagnesiumNeeded / (parenteralConfig.mg_sulfate.magnesium / 100); 
 +    } 
 +     
 +    // Sodio rimanente (dopo quello da Esafosfina) 
 +    const remainingSodium = Math.max(0, totalSodiumNeeded - sodiumFromEsafosfina); 
 +     
 +    if (remainingSodium > 0) { 
 +        if (selectedSodiumType === 'sodium_acetate') { 
 +            const concentrationSodiumAcetate = parenteralConfig.sodium_acetate.sodium / 100; 
 +            additions.sodium_acetate = remainingSodium / concentrationSodiumAcetate; 
 +        } else { 
 +            const concentrationNaCl = parenteralConfig.nacl.sodium / 100; 
 +            additions.nacl = remainingSodium / concentrationNaCl; 
 +        } 
 +    } 
 +     
 +    // Potassio Cloruro (1000 mEq K/100ml) 
 +    if (totalPotassiumNeeded > 0) { 
 +        additions.kcl = totalPotassiumNeeded / (parenteralConfig.kcl.potassium / 100); 
 +    } 
 +     
 +    // Volume totale degli elettroliti 
 +    additions.totalVolume = additions.ca_gluconato + additions.esafosfina + additions.mg_sulfate + additions.nacl + additions.sodium_acetate + additions.kcl; 
 +     
 +    return additions; 
 +
 + 
 + 
 +// FUNZIONE CALCOLO OSMOLARITÀ NPT (MIGLIORATA) 
 +function calculateNPTOsmolarity(calc, currentWeightKg, residualNeeds) { 
 +    let totalOsmolarity = 0; 
 +    let osmolarityBreakdown = {}; 
 +    let componentDetails = []; 
 +     
 +    // Glucosio 50% - osmolarità molto alta 
 +    if (calc.neededGlucose > 0) { 
 +        const glucoseOsmol = (calc.glucose50Volume * parenteralConfig.glucose50.osmolarity) / calc.totalVolume; 
 +        osmolarityBreakdown.glucose = glucoseOsmol; 
 +        totalOsmolarity += glucoseOsmol; 
 +        componentDetails.push({ 
 +            name: 'Glucosio 50%', 
 +            volume: calc.glucose50Volume, 
 +            concentration: parenteralConfig.glucose50.osmolarity, 
 +            contribution: glucoseOsmol 
 +        }); 
 +    } 
 +     
 +    // Trophamine 6% 
 +    const proteinOsmol = (calc.proteinVolume * parenteralConfig.trophamine.osmolarity) / calc.totalVolume; 
 +    osmolarityBreakdown.protein = proteinOsmol; 
 +    totalOsmolarity += proteinOsmol; 
 +    componentDetails.push({ 
 +        name: 'Trophamine 6%', 
 +        volume: calc.proteinVolume, 
 +        concentration: parenteralConfig.trophamine.osmolarity, 
 +        contribution: proteinOsmol 
 +    }); 
 +     
 +    // Intralipid 20% 
 +    const lipidOsmol = (calc.lipidVolume * parenteralConfig.intralipid.osmolarity) / calc.totalVolume; 
 +    osmolarityBreakdown.lipid = lipidOsmol; 
 +    totalOsmolarity += lipidOsmol; 
 +    componentDetails.push({ 
 +        name: 'Intralipid 20%', 
 +        volume: calc.lipidVolume, 
 +        concentration: parenteralConfig.intralipid.osmolarity, 
 +        contribution: lipidOsmol 
 +    }); 
 +     
 +    // Elettroliti 
 +    if (calc.electrolyteAdditions.ca_gluconato > 0) { 
 +        const caOsmol = (calc.electrolyteAdditions.ca_gluconato * parenteralConfig.ca_gluconato.osmolarity) / calc.totalVolume; 
 +        osmolarityBreakdown.calcium = caOsmol; 
 +        totalOsmolarity += caOsmol; 
 +        componentDetails.push({ 
 +            name: 'Calcio Gluconato 10%', 
 +            volume: calc.electrolyteAdditions.ca_gluconato, 
 +            concentration: parenteralConfig.ca_gluconato.osmolarity, 
 +            contribution: caOsmol 
 +        }); 
 +    } 
 +     
 +    if (calc.electrolyteAdditions.esafosfina > 0) { 
 +        const pOsmol = (calc.electrolyteAdditions.esafosfina * parenteralConfig.esafosfina.osmolarity) / calc.totalVolume; 
 +        osmolarityBreakdown.phosphorus = pOsmol; 
 +        totalOsmolarity += pOsmol; 
 +        componentDetails.push({ 
 +            name: 'Esafosfina', 
 +            volume: calc.electrolyteAdditions.esafosfina, 
 +            concentration: parenteralConfig.esafosfina.osmolarity, 
 +            contribution: pOsmol 
 +        }); 
 +    } 
 +     
 +    if (calc.electrolyteAdditions.mg_sulfate > 0) { 
 +        const mgOsmol = (calc.electrolyteAdditions.mg_sulfate * parenteralConfig.mg_sulfate.osmolarity) / calc.totalVolume; 
 +        osmolarityBreakdown.magnesium = mgOsmol; 
 +        totalOsmolarity += mgOsmol; 
 +        componentDetails.push({ 
 +            name: 'Magnesio Solfato', 
 +            volume: calc.electrolyteAdditions.mg_sulfate, 
 +            concentration: parenteralConfig.mg_sulfate.osmolarity, 
 +            contribution: mgOsmol 
 +        }); 
 +    } 
 +     
 +    if (calc.electrolyteAdditions.nacl > 0) { 
 +        const naclOsmol = (calc.electrolyteAdditions.nacl * parenteralConfig.nacl.osmolarity) / calc.totalVolume; 
 +        osmolarityBreakdown.nacl = naclOsmol; 
 +        totalOsmolarity += naclOsmol; 
 +        componentDetails.push({ 
 +            name: 'Sodio Cloruro', 
 +            volume: calc.electrolyteAdditions.nacl, 
 +            concentration: parenteralConfig.nacl.osmolarity, 
 +            contribution: naclOsmol 
 +        }); 
 +    } 
 +     
 +    if (calc.electrolyteAdditions.sodium_acetate > 0) { 
 +        const naAcetOsmol = (calc.electrolyteAdditions.sodium_acetate * parenteralConfig.sodium_acetate.osmolarity) / calc.totalVolume; 
 +        osmolarityBreakdown.sodium_acetate = naAcetOsmol; 
 +        totalOsmolarity += naAcetOsmol; 
 +        componentDetails.push({ 
 +            name: 'Sodio Acetato', 
 +            volume: calc.electrolyteAdditions.sodium_acetate, 
 +            concentration: parenteralConfig.sodium_acetate.osmolarity, 
 +            contribution: naAcetOsmol 
 +        }); 
 +    } 
 +     
 +    if (calc.electrolyteAdditions.kcl > 0) { 
 +        const kclOsmol = (calc.electrolyteAdditions.kcl * parenteralConfig.kcl.osmolarity) / calc.totalVolume; 
 +        osmolarityBreakdown.kcl = kclOsmol; 
 +        totalOsmolarity += kclOsmol; 
 +        componentDetails.push({ 
 +            name: 'Potassio Cloruro', 
 +            volume: calc.electrolyteAdditions.kcl, 
 +            concentration: parenteralConfig.kcl.osmolarity, 
 +            contribution: kclOsmol 
 +        }); 
 +    } 
 +     
 +    // Vitamine e Carnitina (osmolarità bassa) 
 +    let vitaminsOsmol = 0; 
 +    if (residualNeeds.vitalipid > 0) { 
 +        const vitalipidVolume = residualNeeds.vitalipid * currentWeightKg; 
 +        const vitOsmol = (vitalipidVolume * 280) / calc.totalVolume; 
 +        vitaminsOsmol += vitOsmol; 
 +        componentDetails.push({ 
 +            name: 'Vitalipid N Infant', 
 +            volume: vitalipidVolume, 
 +            concentration: 280, 
 +            contribution: vitOsmol 
 +        }); 
 +    } 
 +     
 +    if (residualNeeds.soluvit > 0) { 
 +        const soluvitVolume = residualNeeds.soluvit * currentWeightKg; 
 +        const solOsmol = (soluvitVolume * 300) / calc.totalVolume; 
 +        vitaminsOsmol += solOsmol; 
 +        componentDetails.push({ 
 +            name: 'Soluvit N', 
 +            volume: soluvitVolume, 
 +            concentration: 300, 
 +            contribution: solOsmol 
 +        }); 
 +    } 
 +     
 +    if (residualNeeds.peditrace > 0) { 
 +        const peditraceVolume = residualNeeds.peditrace * currentWeightKg; 
 +        const pedOsmol = (peditraceVolume * 350) / calc.totalVolume; 
 +        vitaminsOsmol += pedOsmol; 
 +        componentDetails.push({ 
 +            name: 'Peditrace', 
 +            volume: peditraceVolume, 
 +            concentration: 350, 
 +            contribution: pedOsmol 
 +        }); 
 +    } 
 +     
 +    if (vitaminsOsmol > 0) { 
 +        osmolarityBreakdown.vitamins = vitaminsOsmol; 
 +        totalOsmolarity += vitaminsOsmol; 
 +    } 
 +     
 +    if (residualNeeds.carnitine > 0) { 
 +        const carnitineVolume = (residualNeeds.carnitine * currentWeightKg) / 100; 
 +        const carOsmol = (carnitineVolume * parenteralConfig.carnitene.osmolarity) / calc.totalVolume; 
 +        osmolarityBreakdown.carnitine = carOsmol; 
 +        totalOsmolarity += carOsmol; 
 +        componentDetails.push({ 
 +            name: 'Carnitene', 
 +            volume: carnitineVolume, 
 +            concentration: parenteralConfig.carnitene.osmolarity, 
 +            contribution: carOsmol 
 +        }); 
 +    } 
 +     
 +    return { 
 +        total: Math.round(totalOsmolarity), 
 +        breakdown: osmolarityBreakdown, 
 +        details: componentDetails, 
 +        isHypertonic: totalOsmolarity > 900, 
 +        requiresCVC: totalOsmolarity > 600 
 +    };
 } }
  
-// FUNZIONE CALCOLO NPT PARENTERALE CORRETTA+// FUNZIONE CALCOLO NPT PARENTERALE (DA VERSIONE 17 CON CONTROLLI CLINICI)
 function calculateParenteral() { function calculateParenteral() {
     if (!window.residualNeeds) {     if (!window.residualNeeds) {
Linea 1704: Linea 3260:
     }     }
          
-    const currentWeight = patientData.currentWeight; +    const parentCurrentWeight = patientData.currentWeight; 
-    const currentWeightKg = currentWeight / 1000;+    const currentWeightKg = parentCurrentWeight / 1000;
     const residualNeeds = window.residualNeeds;     const residualNeeds = window.residualNeeds;
 +    
 +    // CONTROLLI DI SICUREZZA BASATI SU CONFIGURAZIONE CLINICA
 +    const gir = (residualNeeds.carbs * 1000) / 1440; // mg/kg/min
 +    let alerts = [];
 +    
 +    if (gir > clinicalConfig.maxGIR) {
 +        alerts.push('⚠️ GIR > ' + clinicalConfig.maxGIR + ' mg/kg/min - Rischio iperglicemia');
 +    }
 +    if (residualNeeds.lipids > clinicalConfig.maxLipids) {
 +        alerts.push('⚠️ Lipidi > ' + clinicalConfig.maxLipids + ' g/kg/die - Monitorare trigliceridi');
 +    }
 +    if (residualNeeds.protein > clinicalConfig.maxProtein) {
 +        alerts.push('⚠️ Proteine > ' + clinicalConfig.maxProtein + ' g/kg/die - Monitorare BUN');
 +    }
          
     // Volume totale residuo richiesto     // Volume totale residuo richiesto
     const totalVolume = Math.round(residualNeeds.liquids * currentWeightKg);     const totalVolume = Math.round(residualNeeds.liquids * currentWeightKg);
          
-    // Calcola elettroliti aggiuntivi necessari+    // CALCOLA ELETTROLITI AGGIUNTIVI
     const electrolyteAdditions = calculateElectrolyteAdditions(     const electrolyteAdditions = calculateElectrolyteAdditions(
         residualNeeds.calcium,         residualNeeds.calcium,
Linea 1727: Linea 3297:
     const lipidVolume = Math.round((residualNeeds.lipids * currentWeightKg * 100) / 20);     const lipidVolume = Math.round((residualNeeds.lipids * currentWeightKg * 100) / 20);
          
-    // Volume vitamine/oligoelementi +    // Volume vitamine/oligoelementi/carnitina 
-    const vitaminsVolume = residualNeeds.vitalipid + residualNeeds.soluvit + residualNeeds.peditrace;+    const vitaminsVolume = (residualNeeds.vitalipid * currentWeightKg) (residualNeeds.soluvit * currentWeightKg) (residualNeeds.peditrace * currentWeightKg); 
 +    const carnitineVolume = residualNeeds.carnitine > 0 ? (residualNeeds.carnitine * currentWeightKg) / 100 : 0;
          
-    // Volume utilizzato da proteine, lipidi, elettroliti e vitamine +    // CALCOLO CON GLUCOSIO 50% + ACQUA BIDISTILLATA 
-    const usedVolume proteinVolume + lipidVolume + electrolyteAdditions.totalVolume + vitaminsVolume;+    const neededGlucose residualNeeds.carbs * currentWeightKg; // grammi totali di glucosio 
 +    const glucose50Volume = (neededGlucose * 100) / 50// ml di glucosio 50% necessari
          
-    // Volume rimanente per il glucosio +    // Volume utilizzato 
-    const glucoseVolume = totalVolume - usedVolume;+    const usedVolume proteinVolume + lipidVolume + vitaminsVolume + carnitineVolume + glucose50Volume + electrolyteAdditions.totalVolume;
          
-    // Calcolo concentrazione glucosio necessaria +    // Volume rimanente = Acqua Bidistillata 
-    const neededGlucose residualNeeds.carbs * currentWeightKg; +    const waterVolume = totalVolume - usedVolume;
-     +
-    let glucoseConc = 10; +
-    let glucoseMessage = ''; +
-     +
-    if (glucoseVolume <= 0) { +
-        glucoseMessage = '<div class="warning"><strong>ERRORE CALCOLO:</strong><br>'+
-                        '• Volume totale richiesto: ' + totalVolume + ' ml<br>'+
-                        '• Volume proteine + lipidi: ' + (proteinVolume + lipidVolume) + ' ml<br>'+
-                        '• Volume elettroliti: ' + electrolyteAdditions.totalVolume.toFixed(1) + ' ml<br>'+
-                        '• Volume vitamine: ' + vitaminsVolume + ' ml<br>'+
-                        '• Volume glucosio risultante: ' + glucoseVolume + ' ml (NEGATIVO!)<br><br>'+
-                        '<strong>SOLUZIONE:</strong> Aumentare il volume totale NPT o ridurre gli elettroliti.</div>'; +
-         +
-        document.getElementById('calculatedTotalVolume').value = totalVolume + ' ml (ERRORE)'; +
-        document.getElementById('suggestedGlucose').value = 'Impossibile Volume negativo'; +
-        document.getElementById('calculatedProteinVol').value = proteinVolume + ' ml'; +
-        document.getElementById('calculatedLipidVol').value = lipidVolume + ' ml'; +
-         +
-        document.getElementById('parenteralTable').innerHTML = glucoseMessage; +
-        document.getElementById('parenteralResults').classList.remove('hidden'); +
-        return; +
-    } +
-     +
-    if (neededGlucose <= 0) { +
-        glucoseMessage = '<div class="info"><strong>GLUCOSIO DA ENTERALE:</strong><br>'+
-                        '• Tutto il glucosio necessario (' + (residualNeeds.carbs * currentWeightKg).toFixed(1) + 'g) proviene dall\'alimentazione enterale<br>'+
-                        '• Apporto enterale: ' + (enteralData ? enteralData.carbs.toFixed(1) : 0) + ' g/kg/die<br>'+
-                        '• Non necessario glucosio in NPT</div>'; +
-         +
-        glucoseConc = 0; +
-        document.getElementById('suggestedGlucose').value = 'Non necessario (enterale sufficiente)'; +
-    } else { +
-        const requiredConcentration = (neededGlucose * 100) / glucoseVolume; +
-         +
-        if (requiredConcentration <= 12) { +
-            glucoseConc = 10; +
-        } else if (requiredConcentration <= 25) { +
-            glucoseConc = 20; +
-        } else if (requiredConcentration <= 40) { +
-            glucoseConc = 33; +
-        } else { +
-            glucoseConc = 50; +
-        } +
-         +
-        glucoseMessage = '<div class="info"><strong>CALCOLO GLUCOSIO:</strong><br>'+
-                        '• Glucosio necessario: ' + neededGlucose.toFixed(1) + 'g<br>'+
-                        '• Volume disponibile: ' + glucoseVolume + 'ml<br>'+
-                        '• Concentrazione richiesta: ' + requiredConcentration.toFixed(1) + '%<br>'+
-                        '• Concentrazione selezionata: ' + glucoseConc + '%</div>'; +
-         +
-        document.getElementById('suggestedGlucose').value = glucoseConc + '%'; +
-    } +
-     +
-    // Calcoli finali +
-    const actualGlucose = (glucoseVolume * glucoseConc) / 100; +
-    const actualProtein = (proteinVolume * 6) / 100; +
-    const actualLipids = (lipidVolume * 20) / 100; +
-     +
-    const glucosePerKg = actualGlucose / currentWeightKg; +
-    const proteinPerKg = actualProtein / currentWeightKg; +
-    const lipidsPerKg = actualLipids / currentWeightKg; +
-    const totalKcal = (glucosePerKg * 4) + (proteinPerKg * 4) + (lipidsPerKg * 9); +
-    const glucoseRate = (glucosePerKg * 1000) / (24 * 60);+
          
     document.getElementById('calculatedTotalVolume').value = totalVolume + ' ml';     document.getElementById('calculatedTotalVolume').value = totalVolume + ' ml';
 +    document.getElementById('suggestedGlucose').value = 'Glucosio 50% + Acqua + Elettroliti';
     document.getElementById('calculatedProteinVol').value = proteinVolume + ' ml';     document.getElementById('calculatedProteinVol').value = proteinVolume + ' ml';
     document.getElementById('calculatedLipidVol').value = lipidVolume + ' ml';     document.getElementById('calculatedLipidVol').value = lipidVolume + ' ml';
          
-    let resultHtml = glucoseMessage; +    let resultHtml = '<div class="info">'; 
-     +    resultHtml += '<strong>NPT v3.0 UNIFIED SISTEMA COMPLETO CON CONTROLLI CLINICI</strong><br>'; 
-    resultHtml += '<div class="info">'; +    resultHtml += '<strong>Peso:</strong> ' + parentCurrentWeight + 'g<br>'; 
-    resultHtml += '<strong>NPT v2.0 - Peso: ' + currentWeight + 'g</strong><br>';+    resultHtml += '<strong>GIR:</strong> ' + gir.toFixed(1) + ' mg/kg/min<br>';
     resultHtml += '<strong>Enterale:</strong> ' + (enteralData ? enteralData.totalFluids : 0) + ' ml (' + (enteralData ? (enteralData.totalFluids/currentWeightKg).toFixed(1) : 0) + ' ml/kg/die)<br>';     resultHtml += '<strong>Enterale:</strong> ' + (enteralData ? enteralData.totalFluids : 0) + ' ml (' + (enteralData ? (enteralData.totalFluids/currentWeightKg).toFixed(1) : 0) + ' ml/kg/die)<br>';
     if (enteralData && enteralData.additionalFluids > 0) {     if (enteralData && enteralData.additionalFluids > 0) {
         resultHtml += '<strong>→ Latte:</strong> ' + (enteralData.volume || 0) + ' ml, <strong>Altri liquidi:</strong> ' + enteralData.additionalFluids + ' ml<br>';         resultHtml += '<strong>→ Latte:</strong> ' + (enteralData.volume || 0) + ' ml, <strong>Altri liquidi:</strong> ' + enteralData.additionalFluids + ' ml<br>';
-    } 
-    resultHtml += '<strong>BUN:</strong> ' + (patientData.bun || 'Non inserito') + ' mg/dL '; 
-    if (patientData.bun) { 
-        const bunVal = parseFloat(patientData.bun); 
-        if (bunVal < 9) { 
-            resultHtml += 'Basso'; 
-        } else if (bunVal > 14) { 
-            resultHtml += 'Elevato'; 
-        } else { 
-            resultHtml += 'OK'; 
-        } 
     }     }
     resultHtml += '</div>';     resultHtml += '</div>';
 +    
 +    // MOSTRA ALERT CLINICI SE PRESENTI
 +    if (alerts.length > 0) {
 +        resultHtml += '<div class="alert-critical"><strong>ALERT CLINICI:</strong><br>' + alerts.join('<br>') + '</div>';
 +    }
          
     resultHtml += '<table class="results-table">';     resultHtml += '<table class="results-table">';
     resultHtml += '<tr><th>Componente</th><th>Volume (ml)</th></tr>';     resultHtml += '<tr><th>Componente</th><th>Volume (ml)</th></tr>';
          
-    if (glucoseConc > 0) { +    if (neededGlucose > 0) { 
-        resultHtml += '<tr><td><strong>Glucosio ' + glucoseConc + '%</strong></td><td><strong>'glucoseVolume + '</strong></td></tr>'; +        resultHtml += '<tr><td><strong>Glucosio 50%</strong></td><td><strong>'glucose50Volume.toFixed(1) + '</strong></td></tr>';
-    } else { +
-        resultHtml += '<tr><td><strong>Glucosio (Non necessario)</strong></td><td><strong>0</strong></td></tr>';+
     }     }
          
-    resultHtml += '<tr><td><strong>Trophamine 6%</strong></td><td><strong>' + proteinVolume + '</strong></td></tr>'; +    resultHtml += '<tr><td><strong>Trophamine 6%</strong></td><td><strong>' + proteinVolume.toFixed(1) + '</strong></td></tr>'; 
-    resultHtml += '<tr><td><strong>Intralipid 20%</strong></td><td><strong>' + lipidVolume + '</strong></td></tr>';+    resultHtml += '<tr><td><strong>Intralipid 20%</strong></td><td><strong>' + lipidVolume.toFixed(1) + '</strong></td></tr>';
          
-    // Elettroliti aggiuntivi+    // ELETTROLITI AGGIUNTIVI
     if (electrolyteAdditions.ca_gluconato > 0) {     if (electrolyteAdditions.ca_gluconato > 0) {
         resultHtml += '<tr><td><strong>Calcio Gluconato 10% (1g/10mL, 0.44 mEq/mL)</strong></td><td><strong>' + electrolyteAdditions.ca_gluconato.toFixed(1) + '</strong></td></tr>';         resultHtml += '<tr><td><strong>Calcio Gluconato 10% (1g/10mL, 0.44 mEq/mL)</strong></td><td><strong>' + electrolyteAdditions.ca_gluconato.toFixed(1) + '</strong></td></tr>';
Linea 1851: Linea 3353:
     if (electrolyteAdditions.nacl > 0) {     if (electrolyteAdditions.nacl > 0) {
         resultHtml += '<tr><td><strong>Sodio Cloruro (3mEq/mL)</strong></td><td><strong>' + electrolyteAdditions.nacl.toFixed(1) + '</strong></td></tr>';         resultHtml += '<tr><td><strong>Sodio Cloruro (3mEq/mL)</strong></td><td><strong>' + electrolyteAdditions.nacl.toFixed(1) + '</strong></td></tr>';
 +    }
 +    if (electrolyteAdditions.sodium_acetate > 0) {
 +        resultHtml += '<tr><td><strong>Sodio Acetato (3 mEq/mL) - Alcalinizzante</strong></td><td><strong>' + electrolyteAdditions.sodium_acetate.toFixed(1) + '</strong></td></tr>';
     }     }
     if (electrolyteAdditions.kcl > 0) {     if (electrolyteAdditions.kcl > 0) {
         resultHtml += '<tr><td><strong>Potassio Cloruro (2 mEq/mL)</strong></td><td><strong>' + electrolyteAdditions.kcl.toFixed(1) + '</strong></td></tr>';         resultHtml += '<tr><td><strong>Potassio Cloruro (2 mEq/mL)</strong></td><td><strong>' + electrolyteAdditions.kcl.toFixed(1) + '</strong></td></tr>';
     }     }
-    +    
 +    // VITAMINE
     if (residualNeeds.vitalipid > 0) {     if (residualNeeds.vitalipid > 0) {
-        resultHtml += '<tr><td><strong>Vitalipid N Infant</strong></td><td><strong>'residualNeeds.vitalipid + '</strong></td></tr>';+        const vitalipidVolume = residualNeeds.vitalipid * currentWeightKg; 
 +        resultHtml += '<tr><td><strong>Vitalipid N Infant</strong></td><td><strong>'vitalipidVolume.toFixed(1) + '</strong></td></tr>';
     }     }
     if (residualNeeds.soluvit > 0) {     if (residualNeeds.soluvit > 0) {
-        resultHtml += '<tr><td><strong>Soluvit N</strong></td><td><strong>'residualNeeds.soluvit + '</strong></td></tr>';+        const soluvitVolume = residualNeeds.soluvit * currentWeightKg; 
 +        resultHtml += '<tr><td><strong>Soluvit N</strong></td><td><strong>'soluvitVolume.toFixed(1) + '</strong></td></tr>';
     }     }
     if (residualNeeds.peditrace > 0) {     if (residualNeeds.peditrace > 0) {
-        resultHtml += '<tr><td><strong>Peditrace</strong></td><td><strong>'residualNeeds.peditrace + '</strong></td></tr>';+        const peditraceVolume = residualNeeds.peditrace * currentWeightKg; 
 +        resultHtml += '<tr><td><strong>Peditrace</strong></td><td><strong>'peditraceVolume.toFixed(1) + '</strong></td></tr>';
     }     }
          
-    resultHtml += '<tr class="energy-highlight"><td><strong>TOTALE NPT</strong></td><td><strong>' + totalVolume + ' ml</strong></td></tr>';+     
 +    // CARNITINA 
 +    if (residualNeeds.carnitine > 0) { 
 +        resultHtml += '<tr><td><strong>Carnitene (100 mg/ml)</strong></td><td><strong>' + carnitineVolume.toFixed(1) + '</strong></td></tr>'; 
 +    } 
 +     
 +    // ACQUA BIDISTILLATA 
 +    if (waterVolume > 0) { 
 +        resultHtml += '<tr><td><strong>Acqua Bidistillata</strong></td><td><strong>' + waterVolume.toFixed(1) + '</strong></td></tr>'; 
 +    } 
 +     
 +    resultHtml += '<tr class="energy-highlight"><td><strong>TOTALE NPT</strong></td><td><strong>' + totalVolume.toFixed(1) + ' ml</strong></td></tr>';
     resultHtml += '</table>';     resultHtml += '</table>';
          
     document.getElementById('parenteralTable').innerHTML = resultHtml;     document.getElementById('parenteralTable').innerHTML = resultHtml;
-    document.getElementById('parenteralResults').classList.remove('hidden'); 
          
-    // Aggiorna il pulsante a verde +    // CALCOLO OSMOLARITÀ 
-    const parenteralBtn document.getElementById('calculateParenteralBtn'); +const osmolarityData calculateNPTOsmolarity(
-    if (parenteralBtn) { +    totalVolume: totalVolume, 
-        parenteralBtn.className = 'button config-update-completed'; +    waterVolume: waterVolume, 
-        parenteralBtn.innerHTML = 'NPT CALCOLATA ✓';+    glucose50Volume: glucose50Volume, 
 +    proteinVolume: proteinVolume, 
 +    lipidVolume: lipidVolume, 
 +    electrolyteAdditions: electrolyteAdditions 
 +}, currentWeightKg, residualNeeds); 
 + 
 +// AGGIUNGI SEZIONE OSMOLARITÀ 
 +let osmolarityHtml = '<div style="margin-top: 20px; padding: 15px; border-radius: 8px; background-color: '
 +if (osmolarityData.isHypertonic
 +    osmolarityHtml += '#ffebee; border-left: 4px solid #f44336;'; 
 +} else if (osmolarityData.requiresCVC) { 
 +    osmolarityHtml += '#fff3e0; border-left: 4px solid #ff9800;'; 
 +} else { 
 +    osmolarityHtml += '#e8f5e8; border-left: 4px solid #4caf50;'; 
 +
 +osmolarityHtml += '">'; 
 +osmolarityHtml += '<h4 style="margin-top: 0; color: #2c3e50;">📊 ANALISI OSMOLARITÀ NPT</h4>'; 
 +osmolarityHtml += '<div style="display: flex; flex-wrap: wrap; gap: 20px;">'; 
 +osmolarityHtml += '<div>'; 
 +osmolarityHtml += '<p><strong>Osmolarità totale:</strong> ' + osmolarityData.total + ' mOsm/L</p>'; 
 + 
 +if (osmolarityData.isHypertonic) { 
 +    osmolarityHtml += '<p style="color: #d32f2f; font-weight: bold;"><strong>⚠️ SOLUZIONE IPERTONICA</strong><br>Richiede OBBLIGATORIAMENTE accesso venoso centrale</p>'; 
 +} else if (osmolarityData.requiresCVC) { 
 +    osmolarityHtml += '<p style="color: #f57c00; font-weight: bold;"><strong>⚠️ OSMOLARITÀ ELEVATA</strong><br>Raccomandato accesso venoso centrale</p>'; 
 +} else { 
 +    osmolarityHtml += '<p style="color: #388e3c; font-weight: bold;"><strong>✅ OSMOLARITÀ NORMALE</strong><br>Compatibile con accesso periferico</p>'; 
 +
 + 
 +osmolarityHtml += '</div>'; 
 +osmolarityHtml += '<div>'; 
 +osmolarityHtml += '<p><strong>Contributi principali:</strong></p>'; 
 +osmolarityData.details.forEach(function(detail) { 
 +    if (detail.contribution > 30) { // Mostra contributi > 30 mOsm/L 
 +        osmolarityHtml += '<p style="font-size: 13px;">• ' + detail.name + ': ' + Math.round(detail.contribution) + ' mOsm/L</p>';
     }     }
 +});
 +osmolarityHtml += '</div>';
 +osmolarityHtml += '</div>';
 +osmolarityHtml += '</div>';
 +
 +document.getElementById('parenteralTable').innerHTML += osmolarityHtml;
 +
 +    // CREAZIONE RICETTA PER PREPARAZIONE
 +    const deflectorVolume = parseInt(document.getElementById('deflectorVolume').value) || 30;
 +    const totalVolumeWithDeflector = totalVolume + deflectorVolume;
 +    const ratio = totalVolumeWithDeflector / totalVolume;
 +    
 +    let preparationHtml = '<div class="info">';
 +    preparationHtml += '<strong>📋 RICETTA PER PREPARAZIONE (Volume deflussore: ' + deflectorVolume + ' ml)</strong><br>';
 +    preparationHtml += '• <strong>Volume prescrizione:</strong> ' + totalVolume + ' ml<br>';
 +    preparationHtml += '• <strong>Volume deflussore:</strong> +' + deflectorVolume + ' ml<br>';
 +    preparationHtml += '• <strong>Volume totale preparazione:</strong> ' + totalVolumeWithDeflector + ' ml';
 +    preparationHtml += '</div>';
 +    
 +    preparationHtml += '<table class="results-table">';
 +    preparationHtml += '<tr><th>Componente</th><th>Volume Prescrizione (ml)</th><th>Volume Preparazione (ml)</th></tr>';
 +    
 +    if (neededGlucose > 0) {
 +        preparationHtml += '<tr><td><strong>Glucosio 50%</strong></td><td>' + glucose50Volume.toFixed(1) + '</td><td><strong>' + (glucose50Volume * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    
 +    preparationHtml += '<tr><td><strong>Trophamine 6%</strong></td><td>' + proteinVolume.toFixed(1) + '</td><td><strong>' + (proteinVolume * ratio).toFixed(1) + '</strong></td></tr>';
 +    preparationHtml += '<tr><td><strong>Intralipid 20%</strong></td><td>' + lipidVolume.toFixed(1) + '</td><td><strong>' + (lipidVolume * ratio).toFixed(1) + '</strong></td></tr>';
 +    
 +    if (electrolyteAdditions.ca_gluconato > 0) {
 +        preparationHtml += '<tr><td><strong>Calcio Gluconato 10% (1g/10mL, 0.44 mEq/mL)</strong></td><td>' + electrolyteAdditions.ca_gluconato.toFixed(1) + '</td><td><strong>' + (electrolyteAdditions.ca_gluconato * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    if (electrolyteAdditions.esafosfina > 0) {
 +        preparationHtml += '<tr><td><strong>Esafosfina (5g/50mL)</strong></td><td>' + electrolyteAdditions.esafosfina.toFixed(1) + '</td><td><strong>' + (electrolyteAdditions.esafosfina * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    if (electrolyteAdditions.mg_sulfate > 0) {
 +        preparationHtml += '<tr><td><strong>Magnesio Solfato (2g/10ml, 1.6 mEq/mL)</strong></td><td>' + electrolyteAdditions.mg_sulfate.toFixed(1) + '</td><td><strong>' + (electrolyteAdditions.mg_sulfate * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    if (electrolyteAdditions.nacl > 0) {
 +        preparationHtml += '<tr><td><strong>Sodio Cloruro (3mEq/mL)</strong></td><td>' + electrolyteAdditions.nacl.toFixed(1) + '</td><td><strong>' + (electrolyteAdditions.nacl * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    if (electrolyteAdditions.sodium_acetate > 0) {
 +        preparationHtml += '<tr><td><strong>Sodio Acetato (3 mEq/mL) - Alcalinizzante</strong></td><td>' + electrolyteAdditions.sodium_acetate.toFixed(1) + '</td><td><strong>' + (electrolyteAdditions.sodium_acetate * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    if (electrolyteAdditions.kcl > 0) {
 +        preparationHtml += '<tr><td><strong>Potassio Cloruro (2 mEq/mL)</strong></td><td>' + electrolyteAdditions.kcl.toFixed(1) + '</td><td><strong>' + (electrolyteAdditions.kcl * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    
 +    // VITAMINE con denominazioni complete
 +    if (residualNeeds.vitalipid > 0) {
 +        const vitalipidVolume = residualNeeds.vitalipid * currentWeightKg;
 +        preparationHtml += '<tr><td><strong>Vitalipid N Infant</strong></td><td>' + vitalipidVolume.toFixed(1) + '</td><td><strong>' + (vitalipidVolume * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    if (residualNeeds.soluvit > 0) {
 +        const soluvitVolume = residualNeeds.soluvit * currentWeightKg;
 +        preparationHtml += '<tr><td><strong>Soluvit N</strong></td><td>' + soluvitVolume.toFixed(1) + '</td><td><strong>' + (soluvitVolume * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    if (residualNeeds.peditrace > 0) {
 +        const peditraceVolume = residualNeeds.peditrace * currentWeightKg;
 +        preparationHtml += '<tr><td><strong>Peditrace</strong></td><td>' + peditraceVolume.toFixed(1) + '</td><td><strong>' + (peditraceVolume * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    
 +    // CARNITINA con denominazione completa
 +    if (residualNeeds.carnitine > 0) {
 +        preparationHtml += '<tr><td><strong>Carnitene (100 mg/ml)</strong></td><td>' + carnitineVolume.toFixed(1) + '</td><td><strong>' + (carnitineVolume * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    
 +    if (waterVolume > 0) {
 +        preparationHtml += '<tr><td><strong>Acqua Bidistillata</strong></td><td>' + waterVolume.toFixed(1) + '</td><td><strong>' + (waterVolume * ratio).toFixed(1) + '</strong></td></tr>';
 +    }
 +    
 +    preparationHtml += '<tr class="energy-highlight"><td><strong>TOTALE</strong></td><td><strong>' + totalVolume + ' ml</strong></td><td><strong>' + totalVolumeWithDeflector + ' ml</strong></td></tr>';
 +    preparationHtml += '<tr style="background-color: #e3f2fd;"><td><strong>Osmolarità Finale</strong></td><td><strong>' + osmolarityData.total + ' mOsm/L</strong></td><td><strong>-</strong></td></tr>';
 +    preparationHtml += '<tr><td><strong>Velocità infusione</strong></td><td><strong>' + (totalVolume / 24).toFixed(2) + ' ml/h</strong></td><td><strong>-</strong></td></tr>';
 +
 +// Aggiungi avvertenze osmolarità nella tabella di preparazione
 +if (osmolarityData.isHypertonic) {
 +    preparationHtml += '<tr style="background-color: #ffebee; color: #d32f2f; font-weight: bold;"><td colspan="3"><strong>⚠️ OSMOLARITÀ IPERTONICA (' + osmolarityData.total + ' mOsm/L) - SOLO ACCESSO VENOSO CENTRALE</strong></td></tr>';
 +} else if (osmolarityData.requiresCVC) {
 +    preparationHtml += '<tr style="background-color: #fff3e0; color: #f57c00; font-weight: bold;"><td colspan="3"><strong>⚠️ OSMOLARITÀ ELEVATA (' + osmolarityData.total + ' mOsm/L) - RACCOMANDATO ACCESSO VENOSO CENTRALE</strong></td></tr>';
 +} else {
 +    preparationHtml += '<tr style="background-color: #e8f5e8; color: #2e7d32;"><td colspan="3"><strong>✅ OSMOLARITÀ NORMALE (' + osmolarityData.total + ' mOsm/L) - COMPATIBILE CON ACCESSO PERIFERICO</strong></td></tr>';
 +}
 +    preparationHtml += '</table>';
 +    
 +    document.getElementById('preparationTable').innerHTML = preparationHtml;
 +    document.getElementById('parenteralResults').classList.remove('hidden');
 +    
 +    document.getElementById('calculateParenteralBtn').className = 'button config-update-completed';
 +    document.getElementById('calculateParenteralBtn').innerHTML = 'NPT CALCOLATA ✓';
 +    
 +    // Salva i dati per il report
 +    window.nptCalculation = {
 +        totalVolume: totalVolume,
 +        waterVolume: waterVolume,
 +        glucose50Volume: glucose50Volume,
 +        proteinVolume: proteinVolume,
 +        lipidVolume: lipidVolume,
 +        gir: gir,
 +        neededGlucose: neededGlucose,
 +        electrolyteAdditions: electrolyteAdditions,
 +        vitaminsVolume: vitaminsVolume,
 +        carnitineVolume: carnitineVolume,
 +        deflectorVolume: deflectorVolume,
 +        osmolarityData: osmolarityData
 +    };
 } }
  
-// FUNZIONI CONFIGURAZIONE+// FUNZIONI CONFIGURAZIONE (DA VERSIONE 17)
 function populateEnteralConfigTable() { function populateEnteralConfigTable() {
     const tbody = document.getElementById('enteralConfigTable');     const tbody = document.getElementById('enteralConfigTable');
Linea 1922: Linea 3581:
             '<td><input type="number" id="config_' + key + '_energy" value="' + component.energy + '" step="1" oninput="markConfigChanged(\'parenteral\')"></td>' +             '<td><input type="number" id="config_' + key + '_energy" value="' + component.energy + '" step="1" oninput="markConfigChanged(\'parenteral\')"></td>' +
             '<td><input type="number" id="config_' + key + '_water" value="' + component.water + '" step="1" oninput="markConfigChanged(\'parenteral\')"></td>' +             '<td><input type="number" id="config_' + key + '_water" value="' + component.water + '" step="1" oninput="markConfigChanged(\'parenteral\')"></td>' +
 +            '<td><input type="number" id="config_' + key + '_osmolarity" value="' + (component.osmolarity || 0) + '" step="10" oninput="markConfigChanged(\'parenteral\')" style="background-color: #e8f5e8;"></td>' +
             '<td style="font-size: 11px; color: #7f8c8d; max-width: 200px;">' + (component.description || 'Componente') + '<br><em>' + (component.notes || 'Note') + '</em></td>' +             '<td style="font-size: 11px; color: #7f8c8d; max-width: 200px;">' + (component.description || 'Componente') + '<br><em>' + (component.notes || 'Note') + '</em></td>' +
             '<td><button class="button secondary" onclick="removeParenteralComponent(\'' + key + '\')" style="padding: 5px 10px; font-size: 12px;">Rimuovi</button></td>';             '<td><button class="button secondary" onclick="removeParenteralComponent(\'' + key + '\')" style="padding: 5px 10px; font-size: 12px;">Rimuovi</button></td>';
Linea 1927: Linea 3587:
 } }
  
-function populateFortifierConfigTable() { +function populateDoctorsConfigTable() { 
-    const tbody = document.getElementById('fortifierConfigTable');+    const tbody = document.getElementById('doctorsConfigTable');
     if (!tbody) return;     if (!tbody) return;
          
-    // Mantiene solo la riga predefinita e aggiunge quelle dinamiche +    tbody.innerHTML = ''; 
-    const existingRows = tbody.querySelectorAll('tr'); +    Object.keys(doctorsData).forEach(key => { 
-    // Rimuovi tutte le righe tranne la prima (Prenidina FM85+        const doctor = doctorsData[key]; 
-    for (let i existingRows.length 10i--) { +        const row = tbody.insertRow(); 
-        existingRows[i].remove(); +        row.innerHTML = '<td><input type="text" id="doctor_' + key + '_name" value="' + doctor.name + '" style="width: 100px;" oninput="markConfigChanged(\'doctors\')"></td>'
-    }+            '<td><input type="text" id="doctor_' + key + '_surname" value="' + doctor.surname + '" style="width: 100px;" oninput="markConfigChanged(\'doctors\')"></td>' + 
 +            '<td><select id="doctor_' + key + '_title" style="width: 70px;" oninput="markConfigChanged(\'doctors\')">'
 +                '<option value="Dr."' + (doctor.title === 'Dr.' ? ' selected' : '') + '>Dr.</option>'
 +                '<option value="Dr.ssa"' + (doctor.title === 'Dr.ssa' ? ' selected' : '') + '>Dr.ssa</option>'
 +                '<option value="Prof."'(doctor.title === 'Prof.' ? ' selected' : ''+ '>Prof.</option>' + 
 +                '<option value="Prof.ssa"'(doctor.title === 'Prof.ssa' ? ' selected' : '') + '>Prof.ssa</option>'
 +            '</select></td>'
 +            '<td style="font-weight: bold; color: #2c3e50;">' + doctor.fullName + '</td>'
 +            '<td><button class="button secondary" onclick="removeDoctor(\'' + key + '\')" style="padding: 5px 10pxfont-size: 12px;">Rimuovi</button></td>'; 
 +    }); 
 +
 + 
 +function populateNursesConfigTable() { 
 +    const tbody = document.getElementById('nursesConfigTable'); 
 +    if (!tbody) return;
          
-    // Aggiungi nuovi fortificanti dinamici +    tbody.innerHTML = ''; 
-    Object.keys(fortifierData).forEach(function(key+    Object.keys(nursesData).forEach(key => 
-        if (key !== 'prenidina_fm85') { // Skip il predefinito già presente +        const nurse nursesData[key]; 
-            const fortifier fortifierData[key]; +        const row = tbody.insertRow(); 
-            const row = tbody.insertRow(); +        row.innerHTML = '<td><input type="text" id="nurse_' + key + '_name" value="'nurse.name + '" style="width: 100px;" oninput="markConfigChanged(\'nurses\')"></td>'
-            row.innerHTML = '<td class="component-name">' + fortifier.name + '</td>'+            '<td><input type="text" id="nurse_' + key + '_surname" value="'nurse.surname + '" style="width: 100px;" oninput="markConfigChanged(\'nurses\')"></td>'
-                '<td><input type="number" id="fortifier_' + key + '_protein" value="'fortifier.protein + '" step="0.1" oninput="markConfigChanged(\'fortifier\')"></td>'+            '<td><select id="nurse_' + key + '_titlestyle="width: 70px;" oninput="markConfigChanged(\'nurses\')">'
-                '<td><input type="number" id="fortifier_' + key + '_carbs" value="'fortifier.carbs + '" step="0.1" oninput="markConfigChanged(\'fortifier\')"></td>'+                '<option value="Inf."'(nurse.title === 'Inf.' ? ' selected' : ''+ '>Inf.</option>'
-                '<td><input type="number" id="fortifier_' + key + '_lipids" value="'fortifier.lipids + '" step="0.1oninput="markConfigChanged(\'fortifier\')"></td>' + +                '<option value="Inf. Coord."' + (nurse.title === 'Inf. Coord.' ? ' selected' : '') + '>Inf. Coord.</option>'
-                '<td><input type="number" id="fortifier_' + key + '_sodium" value="'fortifier.sodium + '" step="0.1" oninput="markConfigChanged(\'fortifier\')"></td>'+                '<option value="Inf. Spec."' + (nurse.title === 'Inf. Spec.' ? ' selected' : '') + '>Inf. Spec.</option>'
-                '<td><input type="number" id="fortifier_' + key + '_potassium" value="'fortifier.potassium + '" step="0.1" oninput="markConfigChanged(\'fortifier\')"></td>'+            '</select></td>'
-                '<td><input type="numberid="fortifier_' + key + '_calcium" value="'fortifier.calcium + '" step="1oninput="markConfigChanged(\'fortifier\')"></td>' + +            '<td style="font-weight: bold; color: #2c3e50;">' + nurse.fullName + '</td>'
-                '<td><input type="number" id="fortifier_' + key + '_phosphorus" value="'fortifier.phosphorus + '" step="1" oninput="markConfigChanged(\'fortifier\')"></td>'+            '<td><button class="button secondary" onclick="removeNurse(\'' + key + '\')" style="padding: 5px 10px; font-size: 12px;">Rimuovi</button></td>'; 
-                '<td><input type="number" id="fortifier_' + key + '_magnesium" value="'fortifier.magnesium + '" step="1" oninput="markConfigChanged(\'fortifier\')"></td>'+    }); 
-                '<td><input type="number" id="fortifier_' + key + '_energy" value="'fortifier.energy + '" step="1oninput="markConfigChanged(\'fortifier\')"></td>'+
-                '<td style="font-size11px; color: #7f8c8d;">Fortificante personalizzato<br><em>Dose: ' + fortifier.dose + '</em></td>'+ 
-                '<td><button class="button secondary" onclick="removeFortifier(\'' + key + '\')" style="padding: 5px 10px; font-size: 12px;">Rimuovi</button></td>'; +function populatePharmacistsConfigTable() { 
-        }+    const tbody = document.getElementById('pharmacistsConfigTable'); 
 +    if (!tbody) return; 
 +     
 +    tbody.innerHTML = ''; 
 +    Object.keys(pharmacistsData).forEach(key => { 
 +        const pharmacist = pharmacistsData[key]; 
 +        const row = tbody.insertRow(); 
 +        row.innerHTML = '<td><input type="text" id="pharmacist_' + key + '_name" value="'pharmacist.name + '" style="width: 100px;" oninput="markConfigChanged(\'pharmacists\')"></td>'
 +            '<td><input type="text" id="pharmacist_' + key + '_surname" value="'pharmacist.surname + '" style="width: 100px;" oninput="markConfigChanged(\'pharmacists\')"></td>'
 +            '<td><select id="pharmacist_' + key + '_titlestyle="width: 90px;" oninput="markConfigChanged(\'pharmacists\')">' + 
 +                '<option value="Dr. Farm."' (pharmacist.title === 'Dr. Farm.' ? ' selected' : '') + '>Dr. Farm.</option>'
 +                '<option value="Dr.ssa Farm."' + (pharmacist.title === 'Dr.ssa Farm.' ? ' selected' : '') + '>Dr.ssa Farm.</option>'
 +                '<option value="Farm."'(pharmacist.title === 'Farm.' ? ' selected' : ''+ '>Farm.</option>'
 +            '</select></td>'
 +            '<td style="font-weight: bold; color: #2c3e50;">' + pharmacist.fullName + '</td>'
 +            '<td><button class="button secondaryonclick="removePharmacist(\'' + key + '\')" style="padding: 5px 10px; font-size: 12px;">Rimuovi</button></td>'; 
 +    }); 
 +
 + 
 +function populateTechniciansConfigTable() { 
 +    const tbody = document.getElementById('techniciansConfigTable'); 
 +    if (!tbody) return; 
 +     
 +    tbody.innerHTML = ''; 
 +    Object.keys(technicianData).forEach(key => { 
 +        const technician = technicianData[key]; 
 +        const row = tbody.insertRow(); 
 +        row.innerHTML = '<td><input type="text" id="technician_' + key + '_name" value="'technician.name + '" style="width: 100px;" oninput="markConfigChanged(\'technicians\')"></td>'
 +            '<td><input type="text" id="technician_' + key + '_surname" value="'technician.surname + '" style="width: 100px;" oninput="markConfigChanged(\'technicians\')"></td>'
 +            '<td><select id="technician_' + key + '_titlestyle="width: 70px;" oninput="markConfigChanged(\'technicians\')">'
 +                '<option value="Tec."'(technician.title === 'Tec.' ? ' selected' : ''+ '>Tec.</option>'
 +                '<option value="Tec. Spec."' + (technician.title === 'Tec. Spec.' ? ' selected' : '') + '>Tec. Spec.</option>'
 +                '<option value="Coord. Tec."'(technician.title === 'Coord. Tec.' ? ' selected'''+ '>Coord. Tec.</option>'
 +            '</select></td>'
 +            '<td style="font-weightbold; color: #2c3e50;">'technician.fullName + '</td>'
 +            '<td><button class="button secondary" onclick="removeTechnician(\'' + key + '\')" style="padding: 5px 10px; font-size: 12px;">Rimuovi</button></td>';
     });     });
 } }
  
-// FUNZIONE PER MARCARE LE MODIFICHE NELLA CONFIGURAZIONE 
 function markConfigChanged(configType) { function markConfigChanged(configType) {
     let buttonId = '';     let buttonId = '';
Linea 1976: Linea 3684:
             buttonId = 'updateFortifierBtn';             buttonId = 'updateFortifierBtn';
             buttonText = 'SALVA MODIFICHE FORTIFICANTI';             buttonText = 'SALVA MODIFICHE FORTIFICANTI';
 +            break;
 +        case 'doctors':
 +            buttonId = 'updateDoctorsBtn';
 +            buttonText = 'SALVA MODIFICHE MEDICI';
 +            break;
 +        case 'nurses':
 +            buttonId = 'updateNursesBtn';
 +            buttonText = 'SALVA MODIFICHE INFERMIERE';
 +            break;
 +        case 'pharmacists':
 +            buttonId = 'updatePharmacistsBtn';
 +            buttonText = 'SALVA MODIFICHE FARMACISTI';
 +            break;
 +        case 'technicians':
 +            buttonId = 'updateTechniciansBtn';
 +            buttonText = 'SALVA MODIFICHE TECNICI';
 +            break;
 +        case 'system':
 +            buttonId = 'updateSystemBtn';
 +            buttonText = 'SALVA PARAMETRI SISTEMA';
             break;             break;
     }     }
Linea 1986: Linea 3714:
 } }
  
-// FUNZIONI CONFIGURAZIONE COMPLETE+
 function updateEnteralConfig() {  function updateEnteralConfig() { 
     let changesCount = 0;     let changesCount = 0;
Linea 1993: Linea 3721:
         const oldValues = Object.assign({}, formulaData[key]);         const oldValues = Object.assign({}, formulaData[key]);
                  
-        formulaData[key].protein parseFloat(document.getElementById('config_' + key + '_protein').value); +        const proteinEl = document.getElementById('config_' + key + '_protein')
-        formulaData[key].carbs = parseFloat(document.getElementById('config_' + key + '_carbs').value); +        if (proteinEl) { 
-        formulaData[key].lipids = parseFloat(document.getElementById('config_' + key + '_lipids').value); +            formulaData[key].protein = parseFloat(proteinEl.value); 
-        formulaData[key].sodium = parseFloat(document.getElementById('config_' + key + '_sodium').value); +            formulaData[key].carbs = parseFloat(document.getElementById('config_' + key + '_carbs').value); 
-        formulaData[key].potassium = parseFloat(document.getElementById('config_' + key + '_potassium').value); +            formulaData[key].lipids = parseFloat(document.getElementById('config_' + key + '_lipids').value); 
-        formulaData[key].calcium = parseFloat(document.getElementById('config_' + key + '_calcium').value); +            formulaData[key].sodium = parseFloat(document.getElementById('config_' + key + '_sodium').value); 
-        formulaData[key].phosphorus = parseFloat(document.getElementById('config_' + key + '_phosphorus').value); +            formulaData[key].potassium = parseFloat(document.getElementById('config_' + key + '_potassium').value); 
-        formulaData[key].magnesium = parseFloat(document.getElementById('config_' + key + '_magnesium').value); +            formulaData[key].calcium = parseFloat(document.getElementById('config_' + key + '_calcium').value); 
-        formulaData[key].energy = parseFloat(document.getElementById('config_' + key + '_energy').value); +            formulaData[key].phosphorus = parseFloat(document.getElementById('config_' + key + '_phosphorus').value); 
-         +            formulaData[key].magnesium = parseFloat(document.getElementById('config_' + key + '_magnesium').value); 
-        if (JSON.stringify(oldValues) !== JSON.stringify(formulaData[key])) { +            formulaData[key].energy = parseFloat(document.getElementById('config_' + key + '_energy').value); 
-            changesCount++;+             
 +            if (JSON.stringify(oldValues) !== JSON.stringify(formulaData[key])) { 
 +                changesCount++; 
 +            }
         }         }
     });     });
-     
-    // SALVA NEL LOCALSTORAGE 
-    saveToStorage(); 
          
     const button = document.getElementById('updateEnteralBtn');     const button = document.getElementById('updateEnteralBtn');
Linea 2020: Linea 3748:
         }, 3000);         }, 3000);
     }     }
-     
-    console.log('Updated formula data:', formulaData); 
 } }
  
Linea 2030: Linea 3756:
         const oldValues = Object.assign({}, parenteralConfig[key]);         const oldValues = Object.assign({}, parenteralConfig[key]);
                  
-        parenteralConfig[key].protein parseFloat(document.getElementById('config_' + key + '_protein').value); +        const proteinEl = document.getElementById('config_' + key + '_protein')
-        parenteralConfig[key].carbs = parseFloat(document.getElementById('config_' + key + '_carbs').value); +        if (proteinEl) { 
-        parenteralConfig[key].lipids = parseFloat(document.getElementById('config_' + key + '_lipids').value); +            parenteralConfig[key].protein = parseFloat(proteinEl.value); 
-        parenteralConfig[key].sodium = parseFloat(document.getElementById('config_' + key + '_sodium').value); +            parenteralConfig[key].carbs = parseFloat(document.getElementById('config_' + key + '_carbs').value); 
-        parenteralConfig[key].potassium = parseFloat(document.getElementById('config_' + key + '_potassium').value); +            parenteralConfig[key].lipids = parseFloat(document.getElementById('config_' + key + '_lipids').value); 
-        parenteralConfig[key].calcium = parseFloat(document.getElementById('config_' + key + '_calcium').value); +            parenteralConfig[key].sodium = parseFloat(document.getElementById('config_' + key + '_sodium').value); 
-        parenteralConfig[key].phosphorus = parseFloat(document.getElementById('config_' + key + '_phosphorus').value); +            parenteralConfig[key].potassium = parseFloat(document.getElementById('config_' + key + '_potassium').value); 
-        parenteralConfig[key].magnesium = parseFloat(document.getElementById('config_' + key + '_magnesium').value); +            parenteralConfig[key].calcium = parseFloat(document.getElementById('config_' + key + '_calcium').value); 
-        parenteralConfig[key].energy = parseFloat(document.getElementById('config_' + key + '_energy').value); +            parenteralConfig[key].phosphorus = parseFloat(document.getElementById('config_' + key + '_phosphorus').value); 
-        parenteralConfig[key].water = parseFloat(document.getElementById('config_' + key + '_water').value); +            parenteralConfig[key].magnesium = parseFloat(document.getElementById('config_' + key + '_magnesium').value); 
-         +            parenteralConfig[key].energy = parseFloat(document.getElementById('config_' + key + '_energy').value); 
-        if (JSON.stringify(oldValues) !== JSON.stringify(parenteralConfig[key])) { +            parenteralConfig[key].water = parseFloat(document.getElementById('config_' + key + '_water').value); 
-            changesCount++;+            parenteralConfig[key].osmolarity = parseFloat(document.getElementById('config_' + key + '_osmolarity').value); 
 +             
 +            if (JSON.stringify(oldValues) !== JSON.stringify(parenteralConfig[key])) { 
 +                changesCount++; 
 +            }
         }         }
     });     });
-     
-    // SALVA NEL LOCALSTORAGE 
-    saveToStorage(); 
          
     const button = document.getElementById('updateParenteralBtn');     const button = document.getElementById('updateParenteralBtn');
Linea 2058: Linea 3785:
         }, 3000);         }, 3000);
     }     }
-     
-    console.log('Updated parenteral config:', parenteralConfig); 
 } }
  
 function updateFortifierConfig() {  function updateFortifierConfig() { 
     // Aggiorna Prenidina FM85 predefinita     // Aggiorna Prenidina FM85 predefinita
-    fortifierData.prenidina_fm85.protein parseFloat(document.getElementById('fortifier_prenidina_fm85_protein').value); +    const proteinEl = document.getElementById('fortifier_prenidina_fm85_protein')
-    fortifierData.prenidina_fm85.carbs = parseFloat(document.getElementById('fortifier_prenidina_fm85_carbs').value); +    if (proteinEl) { 
-    fortifierData.prenidina_fm85.lipids = parseFloat(document.getElementById('fortifier_prenidina_fm85_lipids').value); +        fortifierData.prenidina_fm85.protein = parseFloat(proteinEl.value); 
-    fortifierData.prenidina_fm85.sodium = parseFloat(document.getElementById('fortifier_prenidina_fm85_sodium').value); +        fortifierData.prenidina_fm85.carbs = parseFloat(document.getElementById('fortifier_prenidina_fm85_carbs').value); 
-    fortifierData.prenidina_fm85.potassium = parseFloat(document.getElementById('fortifier_prenidina_fm85_potassium').value); +        fortifierData.prenidina_fm85.lipids = parseFloat(document.getElementById('fortifier_prenidina_fm85_lipids').value); 
-    fortifierData.prenidina_fm85.calcium = parseFloat(document.getElementById('fortifier_prenidina_fm85_calcium').value); +        fortifierData.prenidina_fm85.sodium = parseFloat(document.getElementById('fortifier_prenidina_fm85_sodium').value); 
-    fortifierData.prenidina_fm85.phosphorus = parseFloat(document.getElementById('fortifier_prenidina_fm85_phosphorus').value); +        fortifierData.prenidina_fm85.potassium = parseFloat(document.getElementById('fortifier_prenidina_fm85_potassium').value); 
-    fortifierData.prenidina_fm85.magnesium = parseFloat(document.getElementById('fortifier_prenidina_fm85_magnesium').value); +        fortifierData.prenidina_fm85.calcium = parseFloat(document.getElementById('fortifier_prenidina_fm85_calcium').value); 
-    fortifierData.prenidina_fm85.energy = parseFloat(document.getElementById('fortifier_prenidina_fm85_energy').value);+        fortifierData.prenidina_fm85.phosphorus = parseFloat(document.getElementById('fortifier_prenidina_fm85_phosphorus').value); 
 +        fortifierData.prenidina_fm85.magnesium = parseFloat(document.getElementById('fortifier_prenidina_fm85_magnesium').value); 
 +        fortifierData.prenidina_fm85.energy = parseFloat(document.getElementById('fortifier_prenidina_fm85_energy').value); 
 +    }
          
-    // Aggiorna fortificanti dinamici +    const button = document.getElementById('updateFortifierBtn'); 
-    let changesCount = 1// Prenidina sempre aggiornata +    if (button) { 
-    Object.keys(fortifierData).forEach(function(key+        button.className = 'button config-update-completed'; 
-        if (key !== 'prenidina_fm85'{ +        button.innerHTML = 'FORTIFICANTI SALVATE ✓'; 
-            const proteinEl = document.getElementById('fortifier_' + key + '_protein'); +        setTimeout(() => { 
-            if (proteinEl) { +            button.className = 'button'; 
-                fortifierData[key].protein parseFloat(proteinEl.value); +            button.innerHTML = 'Aggiorna Fortificanti'; 
-                fortifierData[key].carbs parseFloat(document.getElementById('fortifier_' + key + '_carbs').value); +        }, 3000); 
-                fortifierData[key].lipids parseFloat(document.getElementById('fortifier_' + key + '_lipids').value)+    } 
-                fortifierData[key].sodium parseFloat(document.getElementById('fortifier_' + key + '_sodium').value)+
-                fortifierData[key].potassium parseFloat(document.getElementById('fortifier_' + key + '_potassium').value)+ 
-                fortifierData[key].calcium parseFloat(document.getElementById('fortifier_' + key + '_calcium').value)+function updateDoctorsConfig() { 
-                fortifierData[key].phosphorus parseFloat(document.getElementById('fortifier_' + key + '_phosphorus').value)+    let changesCount = 0; 
-                fortifierData[key].magnesium = parseFloat(document.getElementById('fortifier_' + key + '_magnesium').value); +     
-                fortifierData[key].energy = parseFloat(document.getElementById('fortifier_' + key + '_energy').value);+    Object.keys(doctorsData).forEach(key => 
 +        const oldValues = Object.assign({}, doctorsData[key]); 
 +         
 +        const nameEl = document.getElementById('doctor_' + key + '_name'); 
 +        if (nameEl) { 
 +            const newName nameEl.value.trim(); 
 +            const newSurname = document.getElementById('doctor_' + key + '_surname').value.trim(); 
 +            const newTitle = document.getElementById('doctor_' + key + '_title').value; 
 +             
 +            doctorsData[key].name newName
 +            doctorsData[key].surname newSurname
 +            doctorsData[key].title newTitle
 +            doctorsData[key].fullName newTitle + ' ' + newName + ' ' + newSurname
 +             
 +            if (JSON.stringify(oldValues!== JSON.stringify(doctorsData[key])) {
                 changesCount++;                 changesCount++;
             }             }
Linea 2094: Linea 3836:
     });     });
          
-    // SALVA NEL LOCALSTORAGE +    updateDoctorsDropdown(); 
-    saveToStorage();+    populateDoctorsConfigTable();
          
-    const button = document.getElementById('updateFortifierBtn');+    const button = document.getElementById('updateDoctorsBtn');
     if (button) {     if (button) {
         button.className = 'button config-update-completed';         button.className = 'button config-update-completed';
-        button.innerHTML = 'FORTIFICANTI SALVATE ✓ (' + changesCount + ' modifiche)';+        button.innerHTML = 'MEDICI SALVATI ✓ (' + changesCount + ' modifiche)';
         setTimeout(() => {         setTimeout(() => {
             button.className = 'button';             button.className = 'button';
-            button.innerHTML = 'Aggiorna Fortificanti';+            button.innerHTML = 'Aggiorna Lista Medici';
         }, 3000);         }, 3000);
     }     }
 +}
 +
 +function updateNursesConfig() {
 +    let changesCount = 0;
          
-    console.log('Updated fortifier data:', fortifierData);+    Object.keys(nursesData).forEach(key => { 
 +        const oldValues = Object.assign({}, nursesData[key]); 
 +         
 +        const nameEl = document.getElementById('nurse_+ key + '_name'); 
 +        if (nameEl) { 
 +            const newName = nameEl.value.trim(); 
 +            const newSurname = document.getElementById('nurse_' + key + '_surname').value.trim(); 
 +            const newTitle = document.getElementById('nurse_' + key + '_title').value; 
 +             
 +            nursesData[key].name = newName; 
 +            nursesData[key].surname = newSurname; 
 +            nursesData[key].title = newTitle; 
 +            nursesData[key].fullName = newTitle + ' ' + newName + ' ' + newSurname; 
 +             
 +            if (JSON.stringify(oldValues) !== JSON.stringify(nursesData[key])) { 
 +                changesCount++; 
 +            } 
 +        } 
 +    }); 
 +     
 +    populateNursesConfigTable(); 
 +     
 +    const button = document.getElementById('updateNursesBtn'); 
 +    if (button) { 
 +        button.className = 'button config-update-completed'; 
 +        button.innerHTML = 'INFERMIERE SALVATE ✓ (' + changesCount + ' modifiche)'; 
 +        setTimeout(() => { 
 +            button.className = 'button'; 
 +            button.innerHTML = 'Aggiorna Lista Infermiere'; 
 +        }3000); 
 +    }
 } }
-function exportConfig() {+ 
 +function updatePharmacistsConfig() { 
 +    let changesCount = 0; 
 +     
 +    Object.keys(pharmacistsData).forEach(key => { 
 +        const oldValues = Object.assign({}, pharmacistsData[key]); 
 +         
 +        const nameEl = document.getElementById('pharmacist_' + key + '_name'); 
 +        if (nameEl) { 
 +            const newName = nameEl.value.trim(); 
 +            const newSurname = document.getElementById('pharmacist_' + key + '_surname').value.trim(); 
 +            const newTitle = document.getElementById('pharmacist_' + key + '_title').value; 
 +             
 +            pharmacistsData[key].name = newName; 
 +            pharmacistsData[key].surname = newSurname; 
 +            pharmacistsData[key].title = newTitle; 
 +            pharmacistsData[key].fullName = newTitle + ' ' + newName + ' ' + newSurname; 
 +             
 +            if (JSON.stringify(oldValues) !== JSON.stringify(pharmacistsData[key])) { 
 +                changesCount++; 
 +            } 
 +        } 
 +    }); 
 +     
 +    populatePharmacistsConfigTable(); 
 +     
 +    const button = document.getElementById('updatePharmacistsBtn'); 
 +    if (button) { 
 +        button.className = 'button config-update-completed'; 
 +        button.innerHTML = 'FARMACISTI SALVATI ✓ (' + changesCount + ' modifiche)'; 
 +        setTimeout(() => { 
 +            button.className = 'button'; 
 +            button.innerHTML = 'Aggiorna Lista Farmacisti'; 
 +        }, 3000); 
 +    } 
 +
 + 
 +function updateTechniciansConfig() { 
 +    let changesCount = 0; 
 +     
 +    Object.keys(technicianData).forEach(key => { 
 +        const oldValues = Object.assign({}, technicianData[key]); 
 +         
 +        const nameEl = document.getElementById('technician_' + key + '_name'); 
 +        if (nameEl) { 
 +            const newName = nameEl.value.trim(); 
 +            const newSurname = document.getElementById('technician_' + key + '_surname').value.trim(); 
 +            const newTitle = document.getElementById('technician_' + key + '_title').value; 
 +             
 +            technicianData[key].name = newName; 
 +            technicianData[key].surname = newSurname; 
 +            technicianData[key].title = newTitle; 
 +            technicianData[key].fullName = newTitle + ' ' + newName + ' ' + newSurname; 
 +             
 +            if (JSON.stringify(oldValues) !== JSON.stringify(technicianData[key])) { 
 +                changesCount++; 
 +            } 
 +        } 
 +    }); 
 +     
 +    populateTechniciansConfigTable(); 
 +     
 +    const button = document.getElementById('updateTechniciansBtn'); 
 +    if (button) { 
 +        button.className = 'button config-update-completed'; 
 +        button.innerHTML = 'TECNICI SALVATI ✓ (' + changesCount + ' modifiche)'; 
 +        setTimeout(() => { 
 +            button.className = 'button'; 
 +            button.innerHTML = 'Aggiorna Lista Tecnici'; 
 +        }, 3000); 
 +    } 
 +
 + 
 +function updateSystemConfig() { 
 +    const button = document.getElementById('updateSystemBtn'); 
 +    if (button) { 
 +        button.className = 'button config-update-completed'; 
 +        button.innerHTML = 'PARAMETRI SALVATI ✓'; 
 +        setTimeout(() => { 
 +            button.className = 'button'; 
 +            button.innerHTML = 'Aggiorna Parametri Sistema'; 
 +        }, 3000); 
 +    } 
 +     
 +    resetParenteralButton(); 
 +
 + 
 +// FUNZIONI CONFIGURAZIONE CLINICA AVANZATA (NUOVE) 
 +function updateClinicalConfig() { 
 +    clinicalConfig.calciumReq = parseFloat(document.getElementById('calciumReq').value); 
 +    clinicalConfig.phosphorusReq = parseFloat(document.getElementById('phosphorusReq').value); 
 +    clinicalConfig.magnesiumReq = parseFloat(document.getElementById('magnesiumReq').value); 
 +    clinicalConfig.maxGIR = parseFloat(document.getElementById('maxGIR').value); 
 +    clinicalConfig.maxLipids = parseFloat(document.getElementById('maxLipids').value); 
 +    clinicalConfig.maxProtein = parseFloat(document.getElementById('maxProtein').value); 
 +     
 +    alert('Parametri clinici aggiornati:\n'
 +          '• Calcio standard: ' + clinicalConfig.calciumReq + ' mg/kg/die\n'
 +          '• Fosforo standard: ' + clinicalConfig.phosphorusReq + ' mg/kg/die\n'
 +          '• GIR massimo: ' + clinicalConfig.maxGIR + ' mg/kg/min\n'
 +          '• Lipidi massimi: ' + clinicalConfig.maxLipids + ' g/kg/die'); 
 +
 + 
 +function resetConfiguration() { 
 +    // Reset configurazione clinica 
 +    document.getElementById('calciumReq').value = 160; 
 +    document.getElementById('phosphorusReq').value = 84; 
 +    document.getElementById('magnesiumReq').value = 0.6; 
 +    document.getElementById('maxGIR').value = 12.0; 
 +    document.getElementById('maxLipids').value = 3.0; 
 +    document.getElementById('maxProtein').value = 4.5; 
 +     
 +    // Reset configurazione sistema 
 +    document.getElementById('deflectorVolume').value = 30; 
 +    document.getElementById('hospitalName').value = "ASST LECCO"; 
 +    document.getElementById('departmentName').value = "S.C. Neonatologia e TIN"; 
 +    document.getElementById('directorName').value = "Dott. Roberto Bellù"; 
 +     
 +    // Reset configurazione clinica globale 
 +    clinicalConfig = { 
 +        calciumReq: 160, 
 +        phosphorusReq: 84, 
 +        magnesiumReq: 0.6, 
 +        maxGIR: 12.0, 
 +        maxLipids: 3.0, 
 +        maxProtein: 4.5, 
 +        hospitalName: "ASST LECCO", 
 +        departmentName: "S.C. Neonatologia e TIN", 
 +        directorName: "Dott. Roberto Bellù" 
 +    }; 
 +     
 +    alert('Configurazione ripristinata ai valori predefiniti'); 
 +
 + 
 +function saveConfiguration() {
     const config = {     const config = {
-        version"2.0"+        deflectorVolumedocument.getElementById('deflectorVolume').value
-        timestampnew Date().toISOString(), +        hospitalNamedocument.getElementById('hospitalName').value, 
-        enteralFormulasformulaData+        departmentName: document.getElementById('departmentName').value, 
-        parenteralComponentsparenteralConfig+        directorName: document.getElementById('directorName').value, 
-        fortifierDatafortifierData+        autoSave: document.getElementById('autoSave').value, 
-        bunMonitoringtrue+        decimalPlaces: document.getElementById('decimalPlaces').value, 
 +        clinicalConfig: clinicalConfig
 +        doctorsDatadoctorsData
 +        nursesDatanursesData
 +        pharmacistsDatapharmacistsData
 +        technicianDatatechnicianData
     };     };
          
-    const dataStr = JSON.stringify(config, null, 2); +    // Aggiorna configurazione clinica 
-    const dataBlob = new Blob([dataStr], {type: 'application/json'}); +    clinicalConfig.hospitalName config.hospitalName
-    const url = URL.createObjectURL(dataBlob); +    clinicalConfig.departmentName config.departmentName
-    const link document.createElement('a')+    clinicalConfig.directorName config.directorName;
-    link.href url+
-    link.download 'npt_config_v2_BUN_' + new Date().toISOString().split('T')[0] + '.json'; +
-    link.click(); +
-    URL.revokeObjectURL(url);+
          
-    showConfigResult('Configurazione v2.0 con BUN esportata con successo!');+    // Simula salvataggio configurazione 
 +    window.savedConfig = config; 
 +    alert('Configurazione salvata con successo!\n\n' + 
 +          'Inclusi:\n'
 +          '• ' + Object.keys(doctorsData).length + ' medici\n'
 +          '• ' + Object.keys(nursesData).length + ' infermiere\n'
 +          '• ' + Object.keys(pharmacistsData).length + ' farmacisti\n'
 +          '• ' + Object.keys(technicianData).length + ' tecnici di farmacia');
 } }
  
-function importConfig() { +function generatePrescription() { 
-    const file = document.getElementById('configFile').files[0]+    if (!window.residualNeeds || !patientData.currentWeight) { 
-    if (!file) return;+        alert('Prima completare tutti i calcoli precedenti'); 
 +        return; 
 +    }
          
-    const reader = new FileReader(); +    const currentDate = new Date().toLocaleDateString('it-IT'); 
-    reader.onload function(e) { +    const currentTime = new Date().toLocaleTimeString('it-IT'); 
-        try +    const prescriptionPatientWeightKg patientData.currentWeight / 1000; 
-            const config JSON.parse(e.target.result); +    const calc = window.nptCalculation; 
-             +     
-            if (config.enteralFormulas) { +    if (!calc) { 
-                Object.assign(formulaDataconfig.enteralFormulas); +        alert('Prima calcolare la NPT nel TAB 4'); 
-                populateEnteralConfigTable();+        return; 
 +    } 
 +     
 +    const birthDate = new Date(); 
 +    birthDate.setDate(birthDate.getDate() - patientData.daysOfLife); 
 +     
 +        // Genera ID prescrizione univoco (una sola volta per sessione) 
 +    if (!window.currentPrescriptionID) { 
 +        window.currentPrescriptionID = generatePreparationID(); 
 +    } 
 +    const prescriptionID = window.currentPrescriptionID; 
 +     
 +    // Recupera il medico attualmente selezionato 
 +    const currentPrescribingDoctor = document.getElementById('prescribingDoctor').value; 
 +    const doctorName = currentPrescribingDoctor && doctorsData[currentPrescribingDoctor] ?  
 +                  doctorsData[currentPrescribingDoctor].fullName :  
 +                  (patientData.prescribingDoctorName || 'Non specificato'); 
 +     
 +    let html = '<div class="report-output">'; 
 +     
 +    // INTESTAZIONE MEDICA (già OK secondo le tue indicazioni) 
 +    html += '<div style="display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #2c3e50; padding-bottom: 15px; margin-bottom: 25px;">'; 
 +     
 +    // PARTE SINISTRA - INFO OSPEDALE 
 +    html += '<div style="text-align: left;">'; 
 +    html += '<h2 style="margin: 0; font-size: 16px; color: #2c3e50;">Dipartimento Area della Donna Materno Infantile</h2>'; 
 +    html += '<h3 style="margin: 5px 0; font-size: 14px; color: #34495e;">S.C. Neonatologia e Terapia Intensiva Neonatale</h3>'; 
 +    html += '<p style="margin: 5px 0; font-size: 12px; color: #7f8c8d;">Direttore: ' + clinicalConfig.directorName + '</p>'; 
 +    html += '</div>'; 
 +     
 +    // PARTE DESTRA - LOGO ASST 
 +    html += '<div style="text-align: right;">'; 
 +    html += '<h1 style="margin: 0; font-size: 24px; color: #2c3e50; font-weight: bold;">' + clinicalConfig.hospitalName + '</h1>'; 
 +    html += '</div>'; 
 +     
 +    html += '</div>'; 
 +     
 +    // TITOLO DOCUMENTO 
 +    html += '<div style="text-align: center; margin: 20px 0;">'; 
 +    html += '<h2 style="font-size: 18px; font-weight: bold; color: #2c3e50; margin: 10px 0;">CALCOLO NUTRIZIONALE PARENTERALE Data: ' + currentDate + '</h2>'; 
 +    html += '<h3 style="font-size: 16px; color: #2c3e50; margin: 10px 0;">REPORT PARENTERALE</h3>'; 
 +    html += '</div>'; 
 +     
 +    // INFO PAZIENTE (con cartella clinica e ID prescrizione) 
 +    html += '<div style="border: 2px solid #000; margin: 15px 0;">'; 
 +    html += '<div style="background-color: #000; color: white; padding: 5px; font-weight: bold; font-size: 12px;">INFO Paziente</div>'; 
 +    html += '<table style="width: 100%; font-size: 11px; border-collapse: collapse;">'; 
 +    html += '<tr><td style="padding: 3px; width: 200px;">Medico Prescrittore</td><td style="padding: 3px;">' + doctorName + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Data Prescrizione</td><td style="padding: 3px;">' + (patientData.prescriptionDate || currentDate) + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Data Somministrazione</td><td style="padding: 3px;">' + currentDate + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">ID Paziente</td><td style="padding: 3px;">' + (patientData.medicalRecord || 'N/A') + '</td></tr>'; 
 +    if (prescriptionID) { 
 +        html += '<tr><td style="padding: 3px;">ID Prescrizione</td><td style="padding: 3px;"><strong>' + prescriptionID + '</strong></td></tr>'; 
 +    } 
 +     
 +     
 +    html += '<tr><td style="padding: 3px;">Data di Nascita</td><td style="padding: 3px;">' + birthDate.toLocaleDateString('it-IT') + '</td></tr>'; 
 +        html += '<tr><td style="padding: 3px;">Giorni di Vita</td><td style="padding: 3px;">' + patientData.daysOfLife + '</td></tr>'; 
 +     
 +   if (patientData.gestationalWeeks && patientData.gestationalWeeks > 0) { 
 +    const gestDays = patientData.gestationalDays || 0; 
 +    html += '<tr><td style="padding: 3px;">Età Gestazionale</td><td style="padding: 3px;">' + patientData.gestationalWeeks + '+' + gestDays + ' settimane</td></tr>'; 
 +    if (patientData.postConceptionalAge && patientData.postConceptionalAge.format) { 
 +        html += '<tr><td style="padding: 3px;">Età Post-concezionale</td><td style="padding: 3px;">' + patientData.postConceptionalAge.format + ' settimane</td></tr>'; 
 +    } 
 +    } 
 +    html += '<tr><td style="padding: 3px;">Peso (g)</td><td style="padding: 3px;">' + patientData.currentWeight + '</td></tr>'; 
 +    html += '</table>'; 
 +    html += '</div>'; 
 +     
 +    // LISTA DEGLI APPORTI PER LA GIORNATA CORRENTE 
 +    html += '<div style="border: 2px solid #000; margin: 15px 0;">'; 
 +    html += '<div style="background-color: #000; color: white; padding: 5px; font-weight: bold; font-size: 12px;">Lista Degli Apporti per la Giornata Corrente</div>'; 
 +    html += '<table style="width: 100%; font-size: 11px; border-collapse: collapse;">'; 
 +    html += '<tr><td style="padding: 3px; width: 200px; font-weight: bold;">Apporto</td><td style="padding: 3px; font-weight: bold; text-align: center;">Quant.</td><td style="padding: 3px; font-weight: bold;">Somministrazione</td></tr>'; 
 +     
 +    // Apporti enterali 
 +    if (enteralData && enteralData.volume > 0) { 
 +        const formulaType = document.getElementById('formulaType').value; 
 +        const formulaName = formulaData[formulaType] ? formulaData[formulaType].name : 'Latte'; 
 +        html += '<tr><td style="padding: 3px;">' + formulaName + '</td><td style="padding: 3px; text-align: center;">' + enteralData.volume + ' ml</td><td style="padding: 3px;">oro-naso-gastrica intermittente</td></tr>'; 
 +    } 
 +     
 +    // Altri liquidi 
 +    if (enteralData && enteralData.additionalFluids > 0) { 
 +        const fluidType = document.getElementById('fluidType').value; 
 +        let fluidName = 'Altri liquidi'; 
 +        switch(fluidType) 
 +            case 'saline': fluidName = 'Soluzione fisiologica'; break; 
 +            case 'glucose5': fluidName = 'Glucosio 5%'; break; 
 +            case 'glucose10': fluidName = 'Glucosio 10%'; break; 
 +            case 'drugs': fluidName = 'Farmaci in soluzione'; break; 
 +        } 
 +        html += '<tr><td style="padding: 3px;">' + fluidName + '</td><td style="padding: 3px; text-align: center;">' + enteralData.additionalFluids + ' ml</td><td style="padding: 3px;">endovenosa continua</td></tr>'; 
 +    } 
 +     
 +    // Se nessun apporto enterale 
 +    if (!enteralData || (enteralData.volume === 0 && enteralData.additionalFluids === 0)) { 
 +        html += '<tr><td style="padding: 3px;">Nessun apporto enterale</td><td style="padding: 3px; text-align: center;">0 ml</td><td style="padding: 3px;">-</td></tr>'; 
 +    } 
 +     
 +    html += '</table>'; 
 +    html += '</div>'; 
 +     
 +    // COMPOSIZIONE PARENTERALE (con deflussore) 
 +    const deflectorVolume parseInt(document.getElementById('deflectorVolume').value) || 30; 
 +    const totalVolumeWithDeflector = calc.totalVolume + deflectorVolume; 
 +    const ratio = totalVolumeWithDeflector / calc.totalVolume; 
 +     
 +    html += '<div style="border: 2px solid #000; margin: 15px 0;">'; 
 +    html += '<div style="background-color: #000; color: white; padding: 5px; font-weight: bold; font-size: 12px;">Composizione Parenterale (numero sacche: 1)</div>'; 
 +    html += '<table style="width: 100%; font-size: 11px; border-collapse: collapse;">'; 
 +    html += '<tr style="border-bottom: 1px solid #000;"><td style="padding: 3px; font-weight: bold;"></td><td style="padding: 3px; font-weight: bold; text-align: center;">Teorici</td><td style="padding: 3px; font-weight: bold; text-align: center;">Con Deflussore</td><td style="padding: 3px; font-weight: bold;"></td></tr>'; 
 +     
 +    // Componenti nell'ordine del PDF 
 +    html += '<tr><td style="padding: 3px;">Acqua bidistillata</td><td style="padding: 3px; text-align: center;">' + calc.waterVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.waterVolume * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +     
 +    if (calc.neededGlucose > 0) { 
 +        html += '<tr><td style="padding: 3px;">glucosata 50% (parenterale)</td><td style="padding: 3px; text-align: center;">' + calc.glucose50Volume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.glucose50Volume * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } 
 +     
 +    if (calc.electrolyteAdditions.ca_gluconato > 0) { 
 +        html += '<tr><td style="padding: 3px;">Calcio gluconato (1g/10mL,0.44mEq/mL)</td><td style="padding: 3px; text-align: center;">' + calc.electrolyteAdditions.ca_gluconato.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.electrolyteAdditions.ca_gluconato * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } 
 +     
 +    html += '<tr style="border-top: 1px solid #000;">'; 
 +    if (calc.electrolyteAdditions.nacl > 0) { 
 +        html += '<td style="padding: 3px;">Sodio cloruro (3mEq/mL)</td><td style="padding: 3px; text-align: center;">' + calc.electrolyteAdditions.nacl.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.electrolyteAdditions.nacl * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } else if (calc.electrolyteAdditions.sodium_acetate > 0) { 
 +        html += '<td style="padding: 3px;">Sodio acetato (2mEq/mL)</td><td style="padding: 3px; text-align: center;">' + calc.electrolyteAdditions.sodium_acetate.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.electrolyteAdditions.sodium_acetate * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } else { 
 +        html += '</tr><tr>'; 
 +    } 
 +     
 +    if (calc.electrolyteAdditions.kcl > 0) { 
 +        html += '<tr><td style="padding: 3px;">Potassio cloruro (2mEq/mL)</td><td style="padding: 3px; text-align: center;">' + calc.electrolyteAdditions.kcl.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.electrolyteAdditions.kcl * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } 
 +     
 +    if (calc.electrolyteAdditions.mg_sulfate > 0) { 
 +        html += '<tr><td style="padding: 3px;">Magnesio solfato (2g/10mL,1.6mEq/mL)</td><td style="padding: 3px; text-align: center;">' + calc.electrolyteAdditions.mg_sulfate.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.electrolyteAdditions.mg_sulfate * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } 
 +     
 +    html += '<tr style="border-top: 1px solid #000;">'; 
 +    if (window.residualNeeds.carnitine > 0) { 
 +        const carnitineVolume = (window.residualNeeds.carnitine * prescriptionPatientWeightKg) / 100; 
 +        html += '<td style="padding: 3px;">Carnitene f</td><td style="padding: 3px; text-align: center;">' + carnitineVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (carnitineVolume * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } else { 
 +        html += '<td style="padding: 3px;">Carnitene f</td><td style="padding: 3px; text-align: center;">0.00</td><td style="padding: 3px; text-align: center;"><strong>0.00</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } 
 +     
 +    html += '<tr><td style="padding: 3px;">Trophamine 6%</td><td style="padding: 3px; text-align: center;">' + calc.proteinVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.proteinVolume * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +     
 +    if (calc.electrolyteAdditions.esafosfina > 0) { 
 +        html += '<tr><td style="padding: 3px;">Esafosfina f 5g</td><td style="padding: 3px; text-align: center;">' + calc.electrolyteAdditions.esafosfina.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.electrolyteAdditions.esafosfina * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } 
 +     
 +    if (window.residualNeeds.peditrace > 0) { 
 +        const peditraceVolume = window.residualNeeds.peditrace * prescriptionPatientWeightKg; 
 +        html += '<tr><td style="padding: 3px;">Peditrace</td><td style="padding: 3px; text-align: center;">' + peditraceVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (peditraceVolume * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } else { 
 +        html += '<tr><td style="padding: 3px;">Peditrace</td><td style="padding: 3px; text-align: center;">0.00</td><td style="padding: 3px; text-align: center;"><strong>0.00</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } 
 +     
 +    if (window.residualNeeds.soluvit > 0) { 
 +        const soluvitVolume = window.residualNeeds.soluvit * prescriptionPatientWeightKg; 
 +        html += '<tr><td style="padding: 3px;">Soluvit</td><td style="padding: 3px; text-align: center;">' + soluvitVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (soluvitVolume * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } else { 
 +        html += '<tr><td style="padding: 3px;">Soluvit</td><td style="padding: 3px; text-align: center;">0.00</td><td style="padding: 3px; text-align: center;"><strong>0.00</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } 
 +     
 +    if (window.residualNeeds.vitalipid > 0) { 
 +        const vitalipidVolume = window.residualNeeds.vitalipid * prescriptionPatientWeightKg; 
 +        html += '<tr><td style="padding: 3px;">Vitalipid N</td><td style="padding: 3px; text-align: center;">' + vitalipidVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (vitalipidVolume * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } else { 
 +        html += '<tr><td style="padding: 3px;">Vitalipid N</td><td style="padding: 3px; text-align: center;">0.00</td><td style="padding: 3px; text-align: center;"><strong>0.00</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    } 
 +     
 +    html += '<tr><td style="padding: 3px;">Intralipid 20%</td><td style="padding: 3px; text-align: center;">' + calc.lipidVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.lipidVolume * ratio).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +     
 +    // TOTALI 
 +    html += '<tr style="border-top: 2px solid #000; font-weight: bold;"><td style="padding: 3px;">Totale</td><td style="padding: 3px; text-align: center;">' + calc.totalVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + totalVolumeWithDeflector.toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Deflussore</td><td style="padding: 3px; text-align: center;">' + deflectorVolume + '</td><td style="padding: 3px; text-align: center;">-</td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Velocità infusione</td><td style="padding: 3px; text-align: center;">' + (calc.totalVolume / 24).toFixed(2) + '</td><td style="padding: 3px; text-align: center;">-</td><td style="padding: 3px;">ml/h</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Osmolalità Totale</td><td style="padding: 3px; text-align: center;">' + (calc.osmolarityData ? calc.osmolarityData.total : '---') + '</td><td style="padding: 3px; text-align: center;">-</td><td style="padding: 3px;">mOsm/L</td></tr>'; 
 +    html += '</table>'; 
 +    html += '</div>'; 
 +     
 +    // TOTALE ELEMENTI PRO KILO 
 +    html += '<div style="border: 2px solid #000; margin: 15px 0;">'; 
 +    html += '<div style="background-color: #000; color: white; padding: 5px; font-weight: bold; font-size: 12px;">Totale Elementi Pro Kilo</div>'; 
 +    html += '<table style="width: 100%; font-size: 11px; border-collapse: collapse;">'; 
 +     
 +    // Calcola valori totali (enterali + parenterali) per kg 
 +    const totalLiquidsPerKg = window.residualNeeds.liquids; 
 +    const totalProteinPerKg = (enteralData ? enteralData.protein : 0) + window.residualNeeds.protein; 
 +    const totalLipidsPerKg = (enteralData ? enteralData.lipids : 0) + window.residualNeeds.lipids; 
 +    const totalCarbsPerKg = (enteralData ? enteralData.carbs : 0) + window.residualNeeds.carbs; 
 +    const totalCalciumPerKg = (enteralData ? enteralData.calcium : 0) + window.residualNeeds.calcium; 
 +    const totalPhosphorusPerKg = (enteralData ? enteralData.phosphorus : 0) + window.residualNeeds.phosphorus; 
 +    const totalSodiumPerKg = (enteralData ? enteralData.sodium : 0) + window.residualNeeds.sodium; 
 +    const totalPotassiumPerKg = (enteralData ? enteralData.potassium : 0) + window.residualNeeds.potassium; 
 +    const totalMagnesiumPerKg = (enteralData ? enteralData.magnesium : 0) + window.residualNeeds.magnesium; 
 +    const totalCarnitinePerKg = window.residualNeeds.carnitine; 
 +    const totalOligoelementsPerKg = window.residualNeeds.peditrace; 
 +    const totalVitLiposolubiliPerKg = window.residualNeeds.vitalipid; 
 +    const totalVitIdrosolubiliPerKg = window.residualNeeds.soluvit; 
 +     
 +    // Energia totale non proteiche 
 +    const totalEnergyPerKg = window.residualNeeds.totalEnergyRequirement; 
 +    const nonProteinEnergyPerKg = totalEnergyPerKg - (totalProteinPerKg * 4); 
 +     
 +    html += '<tr><td style="padding: 3px;">Liquidi</td><td style="padding: 3px; text-align: left;">' + totalLiquidsPerKg.toFixed(2) + '</td><td style="padding: 3px;">mL/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Proteine</td><td style="padding: 3px; text-align: left;">' + totalProteinPerKg.toFixed(2) + '</td><td style="padding: 3px;">g/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Lipidi</td><td style="padding: 3px; text-align: left;">' + totalLipidsPerKg.toFixed(2) + '</td><td style="padding: 3px;">g/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Glucidi</td><td style="padding: 3px; text-align: left;">' + totalCarbsPerKg.toFixed(2) + '</td><td style="padding: 3px;">g/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Calcio</td><td style="padding: 3px; text-align: left;">' + totalCalciumPerKg.toFixed(2) + '</td><td style="padding: 3px;">mg/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Fosforo</td><td style="padding: 3px; text-align: left;">' + totalPhosphorusPerKg.toFixed(2) + '</td><td style="padding: 3px;">mg/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Sodio</td><td style="padding: 3px; text-align: left;">' + totalSodiumPerKg.toFixed(2) + '</td><td style="padding: 3px;">mEq/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Potassio</td><td style="padding: 3px; text-align: left;">' + totalPotassiumPerKg.toFixed(2) + '</td><td style="padding: 3px;">mEq/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Magnesio</td><td style="padding: 3px; text-align: left;">' + totalMagnesiumPerKg.toFixed(2) + '</td><td style="padding: 3px;">mEq/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Carnitina</td><td style="padding: 3px; text-align: left;">' + totalCarnitinePerKg.toFixed(2) + '</td><td style="padding: 3px;">mg/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Oligoelementi</td><td style="padding: 3px; text-align: left;">' + totalOligoelementsPerKg.toFixed(2) + '</td><td style="padding: 3px;">mL/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Vit. idrosolubili</td><td style="padding: 3px; text-align: left;">' + totalVitIdrosolubiliPerKg.toFixed(2) + '</td><td style="padding: 3px;">mL/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Vit. liposolubili</td><td style="padding: 3px; text-align: left;">' + totalVitLiposolubiliPerKg.toFixed(2) + '</td><td style="padding: 3px;">mL/kg/die</td></tr>'; 
 +    html += '<tr style="border-top: 1px solid #000;"><td style="padding: 3px; font-weight: bold;">KCal Totali</td><td style="padding: 3px; text-align: left; font-weight: bold;">' + totalEnergyPerKg.toFixed(2) + '</td><td style="padding: 3px; font-weight: bold;">kcal/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px; font-weight: bold;">KCal non proteiche</td><td style="padding: 3px; text-align: left; font-weight: bold;">' + nonProteinEnergyPerKg.toFixed(2) + '</td><td style="padding: 3px; font-weight: bold;">kcal/kg/die</td></tr>'; 
 +    html += '<tr><td style="padding: 3px; font-weight: bold;">Glucosio (mg/Kg al minuto)</td><td style="padding: 3px; text-align: left; font-weight: bold;">' + calc.gir.toFixed(3) + '</td><td style="padding: 3px; font-weight: bold;">mg/kg/min</td></tr>'; 
 +    html += '</table>'; 
 +    html += '</div>'; 
 +     
 +    html += '</div>'; 
 +     
 +    document.getElementById('reportOutput').innerHTML = html; 
 +
 + 
 +function generateWorksheet() { 
 +    if (!window.residualNeeds || !patientData.currentWeight) { 
 +        alert('Prima completare tutti i calcoli precedenti'); 
 +        return; 
 +    } 
 +     
 +    const currentDate = new Date().toLocaleDateString('it-IT'); 
 +    const calc = window.nptCalculation; 
 +     
 +    if (!calc) { 
 +        alert('Prima calcolare la NPT nel TAB 4'); 
 +        return; 
 +    } 
 +     
 +    const birthDate = new Date(); 
 +    birthDate.setDate(birthDate.getDate() - patientData.daysOfLife); 
 +     
 +   // Recupera il medico attualmente selezionato 
 +        const currentPrescribingDoctor = document.getElementById('prescribingDoctor').value; 
 +        const doctorName = currentPrescribingDoctor && doctorsData[currentPrescribingDoctor] ?  
 +                  doctorsData[currentPrescribingDoctor].fullName :  
 +                  (patientData.prescribingDoctorName || 'Medico non specificato');  
 +     
 +    // Genera ID prescrizione per il foglio di lavoro 
 +    // Usa lo stesso ID prescrizione della sessione 
 +        if (!window.currentPrescriptionID) { 
 +            window.currentPrescriptionID = generatePreparationID(); 
 +        } 
 +        const worksheetPreparationID = window.currentPrescriptionID; 
 +                 
 +        let html = '<div class="report-output">'; 
 +     
 +    // INTESTAZIONE ASST LECCO 
 +    html += '<table class="medical-header-table">'; 
 +    html += '<tr>'; 
 +    html += '<td class="medical-header-left">'; 
 +    html += '<h2><strong>Dipartimento Area della Donna e Materno Infantile</strong></h2>'; 
 +    html += '<h3>S.C. Neonatologia e Terapia Intensiva Neonatale</h3>'; 
 +    html += '<p>Direttore: ' + clinicalConfig.directorName + '</p>'; 
 +    html += '</td>'; 
 +    html += '<td class="medical-header-center">'; 
 +    html += '<div style="text-align: center;">'; 
 +    html += '<div style="width: 80px; height: 60px; background-color: #4CAF50; border-radius: 10px; margin: 0 auto 5px auto; display: flex; align-items: center; justify-content: center; color: white; font-size: 10px; text-align: center;">LOGO<br>REGIONE<br>LOMBARDIA</div>'; 
 +    html += '<div style="font-size: 10px; color: #2c3e50;">Sistema Socio Sanitario<br><strong>Regione Lombardia<br>ASST Lecco</strong></div>'; 
 +    html += '</td>'; 
 +    html += '<td class="medical-header-right">'; 
 +    html += '<div style="text-align: center;">'; 
 +    html += '<div style="width: 60px; height: 60px; background-color: #9C27B0; border-radius: 50%; margin: 0 auto 5px auto; display: flex; align-items: center; justify-content: center; color: white; font-size: 8px; text-align: center;">LOGO<br>BANCA<br>LATTE</div>'; 
 +    html += '<div style="font-size: 9px; color: #9C27B0;"><strong>Banca del<br>Latte<br>Lecco</strong></div>'; 
 +    html += '</td>'; 
 +    html += '</tr>'; 
 +    html += '</table>'; 
 +     
 +    // TITOLO E DATA 
 +    html += '<div style="border-bottom: 2px solid #000; padding-bottom: 10px; margin-bottom: 20px;">'; 
 +    html += '<div style="display: flex; justify-content: space-between; align-items: center;">'; 
 +    html += '<h2 style="margin: 0; font-size: 14px;">CALCOLO NUTRIZIONALE PARENTERALE Data: ' + currentDate + '</h2>'; 
 +    html += '</div>'; 
 +    html += '</div>'; 
 +     
 +    html += '<h3 style="margin: 20px 0 10px 0; font-size: 14px;">FOGLIO DI LAVORO</h3>'; 
 +     
 +    // INFO PAZIENTE 
 +    html += '<div style="border: 2px solid #000; margin: 10px 0;">'; 
 +    html += '<div style="background-color: #000; color: white; padding: 5px; font-weight: bold; font-size: 12px;">INFO Paziente</div>'; 
 +    html += '<table style="width: 100%; font-size: 11px; border-collapse: collapse;">'; 
 +    html += '<tr><td style="padding: 3px; width: 200px;">Medico Prescrittore</td><td style="padding: 3px;">' + doctorName + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Data Prescrizione</td><td style="padding: 3px;">' + currentDate + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Data Somministrazione</td><td style="padding: 3px;">' + currentDate + '</td></tr>'; 
 +    if (worksheetPreparationID) { 
 +    html += '<tr><td style="padding: 3px;"><strong>ID Prescrizione</strong></td><td style="padding: 3px; font-weight: bold; font-family: monospace;">' + worksheetPreparationID + '</td></tr>'; 
 +    } 
 +    html += '<tr><td style="padding: 3px;">ID Paziente</td><td style="padding: 3px;">' + (patientData.medicalRecord || 'PAZIENTE') + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Data di Nascita</td><td style="padding: 3px;">' + birthDate.toLocaleDateString('it-IT') + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Giorni di Vita</td><td style="padding: 3px;">' + patientData.daysOfLife + '</td></tr>'; 
 +         
 +    if (patientData.gestationalWeeks && patientData.gestationalWeeks > 0) { 
 +    const gestDays = patientData.gestationalDays || 0; 
 +    html += '<tr><td style="padding: 3px;">Età Gestazionale</td><td style="padding: 3px;">' + patientData.gestationalWeeks + '+' + gestDays + ' settimane</td></tr>'; 
 +    if (patientData.postConceptionalAge && patientData.postConceptionalAge.format) { 
 +        html += '<tr><td style="padding: 3px;">Età Post-concezionale</td><td style="padding: 3px;">' + patientData.postConceptionalAge.format + ' settimane</td></tr>'; 
 +    } 
 +    } 
 +    html += '<tr><td style="padding: 3px;">Peso (g)</td><td style="padding: 3px;">' + patientData.currentWeight + '</td></tr>'; 
 +    html += '</table>'; 
 +    html += '</div>'; 
 +     
 +    // COMPOSIZIONE PARENTERALE - FORMATO FOGLIO DI LAVORO 
 +    html += '<div style="border: 2px solid #000; margin: 10px 0;">'; 
 +    html += '<div style="background-color: #000; color: white; padding: 5px; font-weight: bold; font-size: 12px;">Composizione Parenterale (numero sacche: 1)</div>'; 
 +    html += '<table style="width: 100%; font-size: 11px; border-collapse: collapse;">'; 
 +    html += '<tr style="border-bottom: 1px solid #000;"><td style="padding: 3px; font-weight: bold;"></td><td style="padding: 3px; font-weight: bold; text-align: center;">Teorici</td><td style="padding: 3px; font-weight: bold; text-align: center;">Con Deflussore</td></tr>'; 
 +     
 +    // Ordine esatto come nel PDF del foglio di lavoro 
 +    html += '<tr><td style="padding: 3px;">Acqua bidistillata</td><td style="padding: 3px; text-align: center;">' + calc.waterVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.waterVolume * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">glucosata 50% (parenterale)</td><td style="padding: 3px; text-align: center;">' + calc.glucose50Volume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.glucose50Volume * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Calcio gluconato (1g/10mL,0.44mEq/mL)</td><td style="padding: 3px; text-align: center;">' + (calc.electrolyteAdditions.ca_gluconato || 19.83).toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + ((calc.electrolyteAdditions.ca_gluconato || 19.83) * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +     
 +    html += '<tr style="border-top: 1px solid #000;"><td style="padding: 3px;">Sodio cloruro (3mEq/mL)</td><td style="padding: 3px; text-align: center;">' + (calc.electrolyteAdditions.nacl || 1.09).toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + ((calc.electrolyteAdditions.nacl || 1.09) * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Potassio cloruro (2mEq/mL)</td><td style="padding: 3px; text-align: center;">' + (calc.electrolyteAdditions.kcl || 2.94).toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + ((calc.electrolyteAdditions.kcl || 2.94) * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Magnesio solfato (2g/10mL,1.6mEq/mL)</td><td style="padding: 3px; text-align: center;">' + (calc.electrolyteAdditions.mg_sulfate || 0.64).toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + ((calc.electrolyteAdditions.mg_sulfate || 0.64) * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +     
 +    html += '<tr style="border-top: 1px solid #000;"><td style="padding: 3px;">Carnitene f</td><td style="padding: 3px; text-align: center;">0.36</td><td style="padding: 3px; text-align: center;"><strong>0.38</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Trophamine 6%</td><td style="padding: 3px; text-align: center;">' + calc.proteinVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.proteinVolume * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Esafosfina f 5g</td><td style="padding: 3px; text-align: center;">' + (calc.electrolyteAdditions.esafosfina || 9.96).toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + ((calc.electrolyteAdditions.esafosfina || 9.96) * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Peditrace</td><td style="padding: 3px; text-align: center;">3.55</td><td style="padding: 3px; text-align: center;"><strong>3.77</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Soluvit</td><td style="padding: 3px; text-align: center;">7.1</td><td style="padding: 3px; text-align: center;"><strong>7.55</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Vitalipid N</td><td style="padding: 3px; text-align: center;">17.75</td><td style="padding: 3px; text-align: center;"><strong>18.87</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Intralipid 20%</td><td style="padding: 3px; text-align: center;">' + calc.lipidVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.lipidVolume * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +     
 +    html += '<tr style="border-top: 2px solid #000; font-weight: bold;"><td style="padding: 3px;">Totale</td><td style="padding: 3px; text-align: center;">' + calc.totalVolume.toFixed(2) + '</td><td style="padding: 3px; text-align: center;"><strong>' + (calc.totalVolume * 1.063).toFixed(2) + '</strong></td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Deflussore</td><td style="padding: 3px; text-align: center;">30</td><td style="padding: 3px; text-align: center;">-</td><td style="padding: 3px;">ml</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Velocità infusione</td><td style="padding: 3px; text-align: center;">' + (calc.totalVolume / 24).toFixed(2) + '</td><td style="padding: 3px; text-align: center;">-</td><td style="padding: 3px;">ml/h</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Osmolalità Totale</td><td style="padding: 3px; text-align: center;">' + (window.nptCalculation && window.nptCalculation.osmolarityData ? window.nptCalculation.osmolarityData.total : '---') + '</td><td style="padding: 3px; text-align: center;">-</td><td style="padding: 3px;">mOsm/L</td></tr>'; 
 +    html += '</table>'; 
 +    html += '</div>'; 
 +     
 +    html += '</div>'; 
 +     
 +    document.getElementById('reportOutput').innerHTML = html; 
 +
 + 
 +function generateLabel() { 
 +    if (!window.residualNeeds || !patientData.currentWeight) { 
 +        alert('Prima completare tutti i calcoli precedenti'); 
 +        return; 
 +    } 
 +     
 +    const currentDate = new Date().toLocaleDateString('it-IT'); 
 +    const currentTime = new Date().toLocaleTimeString('it-IT', { hour: '2-digit', minute: '2-digit' }); 
 +    const calc = window.nptCalculation; 
 +     
 +    if (!calc) { 
 +        alert('Prima calcolare la NPT nel TAB 4'); 
 +        return; 
 +    } 
 +     
 +    const birthDate = new Date(); 
 +    birthDate.setDate(birthDate.getDate() - patientData.daysOfLife); 
 +     
 +    // Recupera il medico attualmente selezionato 
 +    const currentPrescribingDoctor = document.getElementById('prescribingDoctor').value; 
 +    const doctorName = currentPrescribingDoctor && doctorsData[currentPrescribingDoctor] ?  
 +              doctorsData[currentPrescribingDoctor].fullName :  
 +              (patientData.prescribingDoctorName || 'Medico non specificato'); 
 +     
 +    // Usa lo stesso ID prescrizione della sessione 
 +    if (!window.currentPrescriptionID) { 
 +        window.currentPrescriptionID = generatePreparationID(); 
 +    } 
 +    const labelPreparationID = window.currentPrescriptionID; 
 +     
 +    let html = '<div class="report-output">'; 
 +     
 +    // INTESTAZIONE COMPATTA PER ETICHETTA 
 +    html += '<div style="text-align: center; border-bottom: 3px solid #000; padding-bottom: 10px; margin-bottom: 15px;">'; 
 +    html += '<h1 style="margin: 0; font-size: 20px; font-weight: bold;">' + clinicalConfig.hospitalName + '</h1>'; 
 +    html += '<h2 style="margin: 5px 0; font-size: 16px;">' + clinicalConfig.departmentName + '</h2>'; 
 +    html += '<h3 style="margin: 5px 0; font-size: 14px; color: #d32f2f; font-weight: bold;">🏷️ ETICHETTA SACCA NPT</h3>'; 
 +    html += '</div>'; 
 +     
 +     
 +    // SEZIONE IDENTIFICAZIONE PAZIENTE - GRANDE E VISIBILE 
 +    html += '<div style="border: 4px solid #d32f2f; background-color: #ffebee; padding: 15px; margin: 15px 0; text-align: center;">'; 
 +    html += '<h2 style="margin: 0 0 10px 0; font-size: 18px; color: #d32f2f;">👤 IDENTIFICAZIONE PAZIENTE</h2>'; 
 + 
 +    // CODICE A BARRE per cartella clinica 
 +    if (patientData.medicalRecord && patientData.medicalRecord.trim() !== '') { 
 +        html += '<div style="margin: 15px 0; padding: 10px; background-color: white; border: 2px solid #d32f2f; border-radius: 5px;">'; 
 +        html += '<canvas id="barcodeCanvas" style="max-width: 100%; height: 60px;"></canvas>'; 
 +        html += '<div style="font-size: 12px; color: #666; margin-top: 5px;">Codice a barre cartella clinica</div>'; 
 +        html += '</div>'; 
 +    } 
 + 
 +    html += '<table style="width: 100%; font-size: 14px; font-weight: bold;">'; 
 +    html += '<tr><td style="text-align: left; padding: 5px;">CARTELLA CLINICA:</td><td style="text-align: right; padding: 5px; font-family: monospace; font-size: 16px;">' + (patientData.medicalRecord || 'N/A') + '</td></tr>'; 
 + 
 +    if (labelPreparationID) { 
 +        html += '<tr><td style="text-align: left; padding: 5px;">ID PRESCRIZIONE:</td><td style="text-align: right; padding: 5px; font-family: monospace; font-size: 16px; color: #d32f2f;">' + labelPreparationID + '</td></tr>'; 
 +    } 
 + 
 +    html += '<tr><td style="text-align: left; padding: 5px;">PESO:</td><td style="text-align: right; padding: 5px;">' + patientData.currentWeight + ' g</td></tr>'; 
 +    html += '<tr><td style="text-align: left; padding: 5px;">GIORNI DI VITA:</td><td style="text-align: right; padding: 5px;">' + patientData.daysOfLife + '</td></tr>'; 
 + 
 +    if (patientData.gestationalWeeks && patientData.gestationalWeeks > 0) { 
 +        const gestDays = patientData.gestationalDays || 0; 
 +        html += '<tr><td style="text-align: left; padding: 5px;">ETÀ GESTAZIONALE:</td><td style="text-align: right; padding: 5px;">' + patientData.gestationalWeeks + '+' + gestDays + ' sett.</td></tr>'; 
 +        if (patientData.postConceptionalAge && patientData.postConceptionalAge.format) { 
 +            html += '<tr><td style="text-align: left; padding: 5px;">ETÀ POST-CONCEZ.:</td><td style="text-align: right; padding: 5px;">' + patientData.postConceptionalAge.format + ' sett.</td></tr>'; 
 +        } 
 +    } 
 + 
 +    html += '<tr><td style="text-align: left; padding: 5px;">DATA NASCITA:</td><td style="text-align: right; padding: 5px;">' + birthDate.toLocaleDateString('it-IT') + '</td></tr>';   
 +    html += '</table>'; 
 +    html += '</div>'; 
 +     
 +    // SEZIONE PRESCRIZIONE 
 +    html += '<div style="border: 3px solid #1976d2; background-color: #e3f2fd; padding: 15px; margin: 15px 0;">'; 
 +    html += '<h3 style="margin: 0 0 10px 0; font-size: 16px; color: #1976d2;">📋 DATI PRESCRIZIONE</h3>'; 
 +    html += '<table style="width: 100%; font-size: 13px;">'; 
 +    html += '<tr><td style="padding: 3px; width: 40%;">Medico Prescrittore:</td><td style="padding: 3px; font-weight: bold;">' + doctorName + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Data Prescrizione:</td><td style="padding: 3px; font-weight: bold;">' + (patientData.prescriptionDate || currentDate) + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Data Preparazione:</td><td style="padding: 3px; font-weight: bold;">' + currentDate + '</td></tr>'; 
 +    html += '<tr><td style="padding: 3px;">Ora Preparazione:</td><td style="padding: 3px; font-weight: bold;">' + currentTime + '</td></tr>'; 
 +    html += '</table>'; 
 +    html += '</div>'; 
 +     
 +    // SEZIONE CONTENUTO SACCA - COMPATTA 
 +    html += '<div style="border: 3px solid #388e3c; background-color: #e8f5e8; padding: 15px; margin: 15px 0;">'; 
 +    html += '<h3 style="margin: 0 0 10px 0; font-size: 16px; color: #388e3c;">💉 CONTENUTO SACCA NPT</h3>'; 
 +    html += '<table style="width: 100%; font-size: 12px; border-collapse: collapse;">'; 
 +    html += '<tr style="background-color: #c8e6c9; font-weight: bold;"><td style="padding: 5px; border: 1px solid #4caf50;">COMPONENTE</td><td style="padding: 5px; border: 1px solid #4caf50; text-align: center;">VOLUME (ml)</td></tr>'; 
 +     
 +    // Solo componenti principali per l'etichetta 
 +    if (calc.neededGlucose > 0
 +        html += '<tr><td style="padding: 4px; border: 1px solid #4caf50;">Glucosio 50%</td><td style="padding: 4px; border: 1px solid #4caf50; text-align: center; font-weight: bold;">' + calc.glucose50Volume.toFixed(1) + '</td></tr>'; 
 +    } 
 +    html += '<tr><td style="padding: 4px; border: 1px solid #4caf50;">Trophamine 6%</td><td style="padding: 4px; border: 1px solid #4caf50; text-align: center; font-weight: bold;">' + calc.proteinVolume.toFixed(1) + '</td></tr>'; 
 +    html += '<tr><td style="padding: 4px; border: 1px solid #4caf50;">Intralipid 20%</td><td style="padding: 4px; border: 1px solid #4caf50; text-align: center; font-weight: bold;">' + calc.lipidVolume.toFixed(1) + '</td></tr>'; 
 +    html += '<tr><td style="padding: 4px; border: 1px solid #4caf50;">Acqua Bidistillata</td><td style="padding: 4px; border: 1px solid #4caf50; text-align: center; font-weight: bold;">' + calc.waterVolume.toFixed(1) + '</td></tr>'; 
 +     
 +    // Elettroliti principali 
 +    if (calc.electrolyteAdditions.ca_gluconato > 0) { 
 +        html += '<tr><td style="padding: 4px; border: 1px solid #4caf50;">Calcio Gluconato</td><td style="padding: 4px; border: 1px solid #4caf50; text-align: center; font-weight: bold;">' + calc.electrolyteAdditions.ca_gluconato.toFixed(1) + '</td></tr>'; 
 +    } 
 +    if (calc.electrolyteAdditions.esafosfina > 0) { 
 +        html += '<tr><td style="padding: 4px; border: 1px solid #4caf50;">Esafosfina</td><td style="padding: 4px; border: 1px solid #4caf50; text-align: center; font-weight: bold;">' + calc.electrolyteAdditions.esafosfina.toFixed(1) + '</td></tr>'; 
 +    } 
 +     
 +    html += '<tr style="background-color: #4caf50; color: white; font-weight: bold;"><td style="padding: 6px; border: 1px solid #2e7d32;">VOLUME TOTALE</td><td style="padding: 6px; border: 1px solid #2e7d32; text-align: center; font-size: 14px;">' + calc.totalVolume + ' ml</td></tr>'; 
 +    html += '</table>'; 
 +    html += '</div>'; 
 +     
 +    html += '</div>'; 
 +     
 +    document.getElementById('reportOutput').innerHTML = html; 
 +// Genera il codice a barre se presente la cartella clinica 
 +if (patientData.medicalRecord && patientData.medicalRecord.trim() !== '') { 
 +    setTimeout(() => { 
 +        const canvas = document.getElementById('barcodeCanvas'); 
 +        if (canvas && window.SimpleBarcode) { 
 +            try 
 +                window.SimpleBarcode.generate(canvaspatientData.medicalRecord,
 +                    width: 2, 
 +                    height: 60, 
 +                    margin: 5, 
 +                    background: "#ffffff", 
 +                    lineColor: "#000000" 
 +                }); 
 +                console.log('✅ Codice a barre generato per cartella:', patientData.medicalRecord); 
 +            } catch (error) { 
 +                console.error('❌ Errore generazione codice a barre:', error); 
 +                // Fallback: mostra solo il testo 
 +                const ctx = canvas.getContext('2d'); 
 +                ctx.fillStyle = '#000000'; 
 +                ctx.font = '14px monospace'; 
 +                ctx.textAlign = 'center'; 
 +                ctx.fillText(patientData.medicalRecord, canvas.width/2, canvas.height/2);
             }             }
-             +        } else { 
-            if (config.parenteralComponents) { +            console.error('❌ SimpleBarcode non disponibile'); 
-                Object.assign(parenteralConfigconfig.parenteralComponents); +        } 
-                populateParenteralConfigTable();+    }, 100); 
 +
 + 
 + 
 +// Genera il codice a barre se presente la cartella clinica 
 +if (patientData.medicalRecord && patientData.medicalRecord.trim() !== ''
 +    setTimeout(() => { 
 +        const canvas = document.getElementById('barcodeCanvas'); 
 +        if (canvas && window.JsBarcode) { 
 +            try 
 +                window.JsBarcode(canvaspatientData.medicalRecord,
 +                    format: "CODE128", 
 +                    displayValue: false, 
 +                    width: 2, 
 +                    height: 60, 
 +                    margin: 5, 
 +                    background: "#ffffff", 
 +                    lineColor: "#000000" 
 +                }); 
 +                console.log('Codice a barre generato per:', patientData.medicalRecord)
 +            } catch (error) { 
 +                console.error('Errore generazione codice a barre:', error); 
 +                canvas.style.display = 'none';
             }             }
 +        }
 +    }, 100);
 +}
 +
 +}
 +
 +// FUNZIONE GENERAZIONE PDF COMPLETA
 +function generatePDF(type) {
 +    if (!window.residualNeeds || !patientData.currentWeight) {
 +        alert('Prima calcolare la NPT completa');
 +        return;
 +    }
 +
 +    const { jsPDF } = window.jspdf;
 +    const doc = new jsPDF();
 +    
 +    // INTESTAZIONE COMUNE
 +    doc.setFontSize(10);
 +    doc.text(clinicalConfig.departmentName, 20, 15);
 +    doc.text('Direttore: ' + clinicalConfig.directorName, 20, 20);
 +    
 +    // Logo ASST (posizionamento approssimativo)
 +    doc.text(clinicalConfig.hospitalName, 170, 20);
 +    
 +    const currentDate = new Date().toLocaleDateString('it-IT');
 +    doc.text('CALCOLO NUTRIZIONALE PARENTERALE Data: ' + currentDate, 20, 35);
 +    
 +    if (type === 'foglio_lavoro') {
 +        generateWorksheetPDFContent(doc);
 +    } else if (type === 'report_parenterale') {
 +        generatePrescriptionPDFContent(doc);
 +    } else if (type === 'etichetta_sacca') {
 +        generateLabelPDFContent(doc);
 +    }
 +    
 +    // Salva il PDF
 +    let fileName = '';
 +    switch(type) {
 +        case 'foglio_lavoro':
 +            fileName = 'Foglio_Lavoro_NPT_' + currentDate.replace(/\//g, '-') + '.pdf';
 +            break;
 +        case 'report_parenterale':
 +            fileName = 'Report_Parenterale_NPT_' + currentDate.replace(/\//g, '-') + '.pdf';
 +            break;
 +        case 'etichetta_sacca':
 +            fileName = 'Etichetta_Sacca_NPT_' + currentDate.replace(/\//g, '-') + '.pdf';
 +            break;
 +        default:
 +            fileName = 'NPT_Document.pdf';
 +    }
 +    
 +    doc.save(fileName);
 +}
 +// CONTENUTO PDF PRESCRIZIONE MEDICA
 +function generatePrescriptionPDFContent(doc) {
 +    const currentDate = new Date().toLocaleDateString('it-IT');
 +    const calc = window.nptCalculation;
 +    const prescriptionPatientWeightKg = patientData.currentWeight / 1000;
 +    
 +    // Recupera il medico attualmente selezionato
 +    const currentPrescribingDoctor = document.getElementById('prescribingDoctor').value;
 +    const doctorName = currentPrescribingDoctor && doctorsData[currentPrescribingDoctor] ? 
 +                  doctorsData[currentPrescribingDoctor].fullName : 
 +                  (patientData.prescribingDoctorName || 'Non specificato');
 +    
 +    const birthDate = new Date();
 +    birthDate.setDate(birthDate.getDate() - patientData.daysOfLife);
 +    
 +    if (!window.currentPrescriptionID) {
 +        window.currentPrescriptionID = generatePreparationID();
 +    }
 +    const prescriptionID = window.currentPrescriptionID;
 +    
 +    let yPos = 50;
 +    
 +    doc.setFontSize(12);
 +    doc.text('REPORT PARENTERALE', 20, yPos);
 +    yPos += 20;
 +    
 +    doc.setFontSize(10);
 +    doc.text('Paziente: ' + (patientData.medicalRecord || 'N/A'), 20, yPos);
 +    yPos += 10;
 +    doc.text('Peso: ' + patientData.currentWeight + 'g', 20, yPos);
 +    yPos += 10;
 +    doc.text('Giorni di vita: ' + patientData.daysOfLife, 20, yPos);
 +    yPos += 10;
 +    doc.text('Medico: ' + doctorName, 20, yPos);
 +    yPos += 20;
 +    
 +    if (prescriptionID) {
 +        doc.text('ID Prescrizione: ' + prescriptionID, 20, yPos);
 +        yPos += 10;
 +    }
 +    
 +    // COMPOSIZIONE NPT
 +    doc.text('COMPOSIZIONE NPT:', 20, yPos);
 +    yPos += 15;
 +    
 +    doc.text('Volume totale NPT: ' + calc.totalVolume + ' ml', 20, yPos);
 +    yPos += 10;
 +    doc.text('GIR: ' + calc.gir.toFixed(1) + ' mg/kg/min', 20, yPos);
 +    yPos += 10;
 +    doc.text('Velocità infusione: ' + (calc.totalVolume / 24).toFixed(2) + ' ml/h', 20, yPos);
 +    yPos += 10;
 +    
 +    if (calc.osmolarityData) {
 +        doc.text('Osmolarità: ' + calc.osmolarityData.total + ' mOsm/L', 20, yPos);
 +        yPos += 10;
 +    }
 +    
 +    // Componenti principali
 +    yPos += 10;
 +    doc.text('COMPONENTI PRINCIPALI:', 20, yPos);
 +    yPos += 15;
 +    
 +    if (calc.neededGlucose > 0) {
 +        doc.text('Glucosio 50%: ' + calc.glucose50Volume.toFixed(1) + ' ml', 20, yPos);
 +        yPos += 8;
 +    }
 +    
 +    doc.text('Trophamine 6%: ' + calc.proteinVolume.toFixed(1) + ' ml', 20, yPos);
 +    yPos += 8;
 +    doc.text('Intralipid 20%: ' + calc.lipidVolume.toFixed(1) + ' ml', 20, yPos);
 +    yPos += 8;
 +    doc.text('Acqua Bidistillata: ' + calc.waterVolume.toFixed(1) + ' ml', 20, yPos);
 +    yPos += 15;
 +    
 +    // Fabbisogni per kg
 +    const totalProteinPerKg = (enteralData ? enteralData.protein : 0) + window.residualNeeds.protein;
 +    const totalLipidsPerKg = (enteralData ? enteralData.lipids : 0) + window.residualNeeds.lipids;
 +    const totalCarbsPerKg = (enteralData ? enteralData.carbs : 0) + window.residualNeeds.carbs;
 +    const totalEnergyPerKg = window.residualNeeds.totalEnergyRequirement;
 +    
 +    doc.text('FABBISOGNI PER KG/DIE:', 20, yPos);
 +    yPos += 15;
 +    doc.text('Proteine: ' + totalProteinPerKg.toFixed(2) + ' g/kg/die', 20, yPos);
 +    yPos += 8;
 +    doc.text('Lipidi: ' + totalLipidsPerKg.toFixed(2) + ' g/kg/die', 20, yPos);
 +    yPos += 8;
 +    doc.text('Glucidi: ' + totalCarbsPerKg.toFixed(2) + ' g/kg/die', 20, yPos);
 +    yPos += 8;
 +    doc.text('Energia: ' + totalEnergyPerKg.toFixed(0) + ' kcal/kg/die', 20, yPos);
 +}
 +
 +// CONTENUTO PDF FOGLIO DI LAVORO
 +function generateWorksheetPDFContent(doc) {
 +    const calc = window.nptCalculation;
 +    
 +    let yPos = 50;
 +    
 +    doc.setFontSize(12);
 +    doc.text('FOGLIO DI LAVORO NPT', 20, yPos);
 +    yPos += 20;
 +    
 +    doc.setFontSize(10);
 +    doc.text('Paziente: ' + (patientData.medicalRecord || 'N/A'), 20, yPos);
 +    yPos += 10;
 +    doc.text('Peso: ' + patientData.currentWeight + 'g', 20, yPos);
 +    yPos += 10;
 +    doc.text('Giorni di vita: ' + patientData.daysOfLife, 20, yPos);
 +    yPos += 20;
 +    
 +    doc.text('PREPARAZIONE NPT:', 20, yPos);
 +    yPos += 15;
 +    
 +    const deflectorVolume = parseInt(document.getElementById('deflectorVolume').value) || 30;
 +    const ratio = (calc.totalVolume + deflectorVolume) / calc.totalVolume;
 +    
 +    doc.text('Volume prescrizione: ' + calc.totalVolume + ' ml', 20, yPos);
 +    yPos += 8;
 +    doc.text('Volume deflussore: +' + deflectorVolume + ' ml', 20, yPos);
 +    yPos += 8;
 +    doc.text('Volume totale preparazione: ' + (calc.totalVolume + deflectorVolume) + ' ml', 20, yPos);
 +    yPos += 15;
 +    
 +    doc.text('COMPONENTI DA PREPARARE:', 20, yPos);
 +    yPos += 15;
 +    
 +    if (calc.neededGlucose > 0) {
 +        doc.text('Glucosio 50%: ' + (calc.glucose50Volume * ratio).toFixed(1) + ' ml', 20, yPos);
 +        yPos += 8;
 +    }
 +    
 +    doc.text('Trophamine 6%: ' + (calc.proteinVolume * ratio).toFixed(1) + ' ml', 20, yPos);
 +    yPos += 8;
 +    doc.text('Intralipid 20%: ' + (calc.lipidVolume * ratio).toFixed(1) + ' ml', 20, yPos);
 +    yPos += 8;
 +    doc.text('Acqua Bidistillata: ' + (calc.waterVolume * ratio).toFixed(1) + ' ml', 20, yPos);
 +    yPos += 15;
 +    
 +    if (calc.electrolyteAdditions.ca_gluconato > 0) {
 +        doc.text('Calcio Gluconato: ' + (calc.electrolyteAdditions.ca_gluconato * ratio).toFixed(1) + ' ml', 20, yPos);
 +        yPos += 8;
 +    }
 +    
 +    if (calc.electrolyteAdditions.esafosfina > 0) {
 +        doc.text('Esafosfina: ' + (calc.electrolyteAdditions.esafosfina * ratio).toFixed(1) + ' ml', 20, yPos);
 +        yPos += 8;
 +    }
 +    
 +    doc.text('Velocità infusione: ' + (calc.totalVolume / 24).toFixed(2) + ' ml/h', 20, yPos);
 +    yPos += 8;
 +    
 +    if (calc.osmolarityData) {
 +        doc.text('Osmolarità: ' + calc.osmolarityData.total + ' mOsm/L', 20, yPos);
 +        if (calc.osmolarityData.isHypertonic) {
 +            yPos += 8;
 +            doc.text('ATTENZIONE: SOLO ACCESSO VENOSO CENTRALE', 20, yPos);
 +        }
 +    }
 +}
 +
 +// CONTENUTO PDF ETICHETTA SACCA
 +function generateLabelPDFContent(doc) {
 +    const currentDate = new Date().toLocaleDateString('it-IT');
 +    const currentTime = new Date().toLocaleTimeString('it-IT', { hour: '2-digit', minute: '2-digit' });
 +    const calc = window.nptCalculation;
 +    
 +    const birthDate = new Date();
 +    birthDate.setDate(birthDate.getDate() - patientData.daysOfLife);
 +    
 +    // Recupera il medico attualmente selezionato
 +    const currentPrescribingDoctor = document.getElementById('prescribingDoctor').value;
 +    const doctorName = currentPrescribingDoctor && doctorsData[currentPrescribingDoctor] ? 
 +              doctorsData[currentPrescribingDoctor].fullName : 
 +              (patientData.prescribingDoctorName || 'Medico non specificato');
 +    
 +    if (!window.currentPrescriptionID) {
 +        window.currentPrescriptionID = generatePreparationID();
 +    }
 +    const labelPreparationID = window.currentPrescriptionID;
 +    
 +    let yPos = 50;
 +    
 +    doc.setFontSize(14);
 +    doc.setFont(undefined, 'bold');
 +    doc.text('ETICHETTA SACCA NPT', 20, yPos);
 +    yPos += 20;
 +    
 +    // IDENTIFICAZIONE PAZIENTE
 +    doc.setFontSize(12);
 +    doc.setFont(undefined, 'bold');
 +    doc.text('IDENTIFICAZIONE PAZIENTE', 20, yPos);
 +    yPos += 15;
 +    
 +    doc.setFontSize(10);
 +    doc.setFont(undefined, 'normal');
 +    doc.text('Cartella Clinica: ' + (patientData.medicalRecord || 'N/A'), 20, yPos);
 +    yPos += 10;
 +    
 +    if (labelPreparationID) {
 +        doc.text('ID Prescrizione: ' + labelPreparationID, 20, yPos);
 +        yPos += 10;
 +    }
 +    
 +    doc.text('Peso: ' + patientData.currentWeight + 'g', 20, yPos);
 +    yPos += 10;
 +    doc.text('Giorni di vita: ' + patientData.daysOfLife, 20, yPos);
 +    yPos += 10;
 +    
 +    if (patientData.gestationalWeeks && patientData.gestationalWeeks > 0) {
 +        const gestDays = patientData.gestationalDays || 0;
 +        doc.text('Età Gestazionale: ' + patientData.gestationalWeeks + '+' + gestDays + ' sett.', 20, yPos);
 +        yPos += 10;
 +        if (patientData.postConceptionalAge && patientData.postConceptionalAge.format) {
 +            doc.text('Età Post-concez.: ' + patientData.postConceptionalAge.format + ' sett.', 20, yPos);
 +            yPos += 10;
 +        }
 +    }
 +    
 +    doc.text('Data Nascita: ' + birthDate.toLocaleDateString('it-IT'), 20, yPos);
 +    yPos += 20;
 +    
 +    // DATI PRESCRIZIONE
 +    doc.setFontSize(12);
 +    doc.setFont(undefined, 'bold');
 +    doc.text('DATI PRESCRIZIONE', 20, yPos);
 +    yPos += 15;
 +    
 +    doc.setFontSize(10);
 +    doc.setFont(undefined, 'normal');
 +    doc.text('Medico Prescrittore: ' + doctorName, 20, yPos);
 +    yPos += 8;
 +    doc.text('Data Prescrizione: ' + (patientData.prescriptionDate || currentDate), 20, yPos);
 +    yPos += 8;
 +    doc.text('Data Preparazione: ' + currentDate, 20, yPos);
 +    yPos += 8;
 +    doc.text('Ora Preparazione: ' + currentTime, 20, yPos);
 +    yPos += 20;
 +    
 +    // CONTENUTO SACCA
 +    doc.setFontSize(12);
 +    doc.setFont(undefined, 'bold');
 +    doc.text('CONTENUTO SACCA NPT', 20, yPos);
 +    yPos += 15;
 +    
 +    doc.setFontSize(10);
 +    doc.setFont(undefined, 'normal');
 +    
 +    if (calc.neededGlucose > 0) {
 +        doc.text('Glucosio 50%: ' + calc.glucose50Volume.toFixed(1) + ' ml', 20, yPos);
 +        yPos += 8;
 +    }
 +    
 +    doc.text('Trophamine 6%: ' + calc.proteinVolume.toFixed(1) + ' ml', 20, yPos);
 +    yPos += 8;
 +    doc.text('Intralipid 20%: ' + calc.lipidVolume.toFixed(1) + ' ml', 20, yPos);
 +    yPos += 8;
 +    doc.text('Acqua Bidistillata: ' + calc.waterVolume.toFixed(1) + ' ml', 20, yPos);
 +    yPos += 15;
 +    
 +    doc.setFont(undefined, 'bold');
 +    doc.text('VOLUME TOTALE: ' + calc.totalVolume + ' ml', 20, yPos);
 +    yPos += 10;
 +    doc.text('Velocità infusione: ' + (calc.totalVolume / 24).toFixed(2) + ' ml/h', 20, yPos);
 +    
 +    // Osmolarità se disponibile
 +    if (calc.osmolarityData) {
 +        yPos += 15;
 +        doc.setFontSize(11);
 +        doc.text('Osmolarità: ' + calc.osmolarityData.total + ' mOsm/L', 20, yPos);
 +        
 +        if (calc.osmolarityData.isHypertonic) {
 +            yPos += 10;
 +            doc.setTextColor(255, 0, 0); // Rosso
 +            doc.text('ATTENZIONE: SOLO ACCESSO VENOSO CENTRALE', 20, yPos);
 +            doc.setTextColor(0, 0, 0); // Torna nero
 +        }
 +    }
 +}
 +
 +
 +
 +// FUNZIONI PLACEHOLDER
 +function showAddEnteralForm() {
 +    alert('Aggiungi nuova formula enterale - Implementazione completa nel codice sorgente');
 +}
 +
 +function showAddFortifierForm() {
 +    alert('Aggiungi nuovo fortificante - Implementazione completa nel codice sorgente');
 +}
 +
 +function showAddParenteralForm() {
 +    alert('Aggiungi nuovo componente parenterale - Implementazione completa nel codice sorgente');
 +}
 +
 +
 +function showAddDoctorForm() {
 +    const name = prompt('Inserisci il nome del medico:');
 +    if (!name || name.trim() === '') return;
 +    
 +    const surname = prompt('Inserisci il cognome del medico:');
 +    if (!surname || surname.trim() === '') return;
 +    
 +    const title = prompt('Inserisci il titolo (Dr. o Dr.ssa):');
 +    if (!title || title.trim() === '') return;
 +    
 +    const key = 'dr_' + surname.toLowerCase().replace(/\s+/g, '_') + '_' + Date.now();
 +    const fullName = title.trim() + ' ' + name.trim() + ' ' + surname.trim();
 +    
 +    doctorsData[key] = {
 +        name: name.trim(),
 +        surname: surname.trim(),
 +        title: title.trim(),
 +        fullName: fullName
 +    };
 +    
 +    populateDoctorsConfigTable();
 +    updateDoctorsDropdown();
 +    alert('Medico aggiunto con successo!\n' + fullName);
 +}
 +
 +function showAddNurseForm() {
 +    const name = prompt('Inserisci il nome dell\'infermiera:');
 +    if (!name || name.trim() === '') return;
 +    
 +    const surname = prompt('Inserisci il cognome dell\'infermiera:');
 +    if (!surname || surname.trim() === '') return;
 +    
 +    const title = prompt('Inserisci il titolo (Inf., Inf. Coord., Inf. Spec.):');
 +    if (!title || title.trim() === '') return;
 +    
 +    const key = 'inf_' + surname.toLowerCase().replace(/\s+/g, '_') + '_' + Date.now();
 +    const fullName = title.trim() + ' ' + name.trim() + ' ' + surname.trim();
 +    
 +    nursesData[key] = {
 +        name: name.trim(),
 +        surname: surname.trim(),
 +        title: title.trim(),
 +        fullName: fullName
 +    };
 +    
 +    populateNursesConfigTable();
 +    alert('Infermiera aggiunta con successo!\n' + fullName);
 +}
 +
 +function showAddPharmacistForm() {
 +    const name = prompt('Inserisci il nome del farmacista:');
 +    if (!name || name.trim() === '') return;
 +    
 +    const surname = prompt('Inserisci il cognome del farmacista:');
 +    if (!surname || surname.trim() === '') return;
 +    
 +    const title = prompt('Inserisci il titolo (Dr. Farm., Dr.ssa Farm., Farm.):');
 +    if (!title || title.trim() === '') return;
 +    
 +    const key = 'farm_' + surname.toLowerCase().replace(/\s+/g, '_') + '_' + Date.now();
 +    const fullName = title.trim() + ' ' + name.trim() + ' ' + surname.trim();
 +    
 +    pharmacistsData[key] = {
 +        name: name.trim(),
 +        surname: surname.trim(),
 +        title: title.trim(),
 +        fullName: fullName
 +    };
 +    
 +    populatePharmacistsConfigTable();
 +    alert('Farmacista aggiunto con successo!\n' + fullName);
 +}
 +
 +function showAddTechnicianForm() {
 +    const name = prompt('Inserisci il nome del tecnico:');
 +    if (!name || name.trim() === '') return;
 +    
 +    const surname = prompt('Inserisci il cognome del tecnico:');
 +    if (!surname || surname.trim() === '') return;
 +    
 +    const title = prompt('Inserisci il titolo (Tec., Tec. Spec., Coord. Tec.):');
 +    if (!title || title.trim() === '') return;
 +    
 +    const key = 'tec_' + surname.toLowerCase().replace(/\s+/g, '_') + '_' + Date.now();
 +    const fullName = title.trim() + ' ' + name.trim() + ' ' + surname.trim();
 +    
 +    technicianData[key] = {
 +        name: name.trim(),
 +        surname: surname.trim(),
 +        title: title.trim(),
 +        fullName: fullName
 +    };
 +    
 +    populateTechniciansConfigTable();
 +    alert('Tecnico aggiunto con successo!\n' + fullName);
 +}
 +
 +
 +function removeEnteralFormula(key) {
 +    if (confirm('Sei sicuro di voler rimuovere questa formula?')) {
 +        alert('Rimozione formula - Implementazione completa nel codice sorgente');
 +    }
 +}
 +
 +function removeParenteralComponent(key) {
 +    if (confirm('Sei sicuro di voler rimuovere questo componente?')) {
 +        alert('Rimozione componente - Implementazione completa nel codice sorgente');
 +    }
 +}
 +
 +function removeFortifier(key) {
 +    if (confirm('Sei sicuro di voler rimuovere questo fortificante?')) {
 +        alert('Rimozione fortificante - Implementazione completa nel codice sorgente');
 +    }
 +}
 +
 +function removeDoctor(key) {
 +    if (confirm('Sei sicuro di voler rimuovere questo medico?\n\n' + doctorsData[key].fullName)) {
 +        delete doctorsData[key];
 +        populateDoctorsConfigTable();
 +        updateDoctorsDropdown();
 +        alert('Medico rimosso con successo!');
 +    }
 +}
 +
 +function removeNurse(key) {
 +    if (confirm('Sei sicuro di voler rimuovere questa infermiera?\n\n' + nursesData[key].fullName)) {
 +        delete nursesData[key];
 +        populateNursesConfigTable();
 +        alert('Infermiera rimossa con successo!');
 +    }
 +}
 +
 +function removePharmacist(key) {
 +    if (confirm('Sei sicuro di voler rimuovere questo farmacista?\n\n' + pharmacistsData[key].fullName)) {
 +        delete pharmacistsData[key];
 +        populatePharmacistsConfigTable();
 +        alert('Farmacista rimosso con successo!');
 +    }
 +}
 +
 +function removeTechnician(key) {
 +    if (confirm('Sei sicuro di voler rimuovere questo tecnico?\n\n' + technicianData[key].fullName)) {
 +        delete technicianData[key];
 +        populateTechniciansConfigTable();
 +        alert('Tecnico rimosso con successo!');
 +    }
 +}
 +
 +// FUNZIONI VALIDAZIONE E ARCHIVIAZIONE PREPARAZIONE
 +function updatePreparationStaffDropdowns() {
 +    console.log('Popolamento dropdown personale preparazione');
 +    
 +    // Farmacisti
 +    const pharmacistSelect = document.getElementById('validatingPharmacist');
 +    if (pharmacistSelect) {
 +        pharmacistSelect.innerHTML = '<option value="">Seleziona farmacista responsabile</option>';
 +        Object.keys(pharmacistsData).forEach(key => {
 +            const option = document.createElement('option');
 +            option.value = key;
 +            option.textContent = pharmacistsData[key].fullName;
 +            pharmacistSelect.appendChild(option);
 +        });
 +        console.log('Dropdown farmacisti popolata:', Object.keys(pharmacistsData).length, 'farmacisti');
 +    }
 +    
 +    // Tecnici (per entrambe le dropdown)
 +    ['preparingTechnician1', 'preparingTechnician2'].forEach(selectId => {
 +        const select = document.getElementById(selectId);
 +        if (select) {
 +            select.innerHTML = '<option value="">Seleziona tecnico</option>';
 +            Object.keys(technicianData).forEach(key => {
 +                const option = document.createElement('option');
 +                option.value = key;
 +                option.textContent = technicianData[key].fullName;
 +                select.appendChild(option);
 +            });
 +        }
 +    });
 +    console.log('Dropdown tecnici popolate:', Object.keys(technicianData).length, 'tecnici');
 +}
 +
 +// =====================================================
 +// SISTEMA VALIDAZIONE E PREPARAZIONE IN DUE FASI
 +// =====================================================
 +
 +// FASE 1: Validazione Farmacista
 +function validatePrescription() {
 +    const pharmacist = document.getElementById('validatingPharmacist').value;
 +    
 +    if (!pharmacist) {
 +        alert('⚠️ Errore: Selezionare il farmacista validatore');
 +        return;
 +    }
 +    
 +    if (!window.residualNeeds || !window.nptCalculation || !patientData.currentWeight) {
 +        alert('❌ Errore: Prima completare tutti i calcoli NPT (TAB 1-4)');
 +        return;
 +    }
 +    
 +    // Validazione completata
 +    document.getElementById('validatePrescriptionBtn').className = 'button config-update-completed';
 +    document.getElementById('validatePrescriptionBtn').innerHTML = '✅ PRESCRIZIONE VALIDATA';
 +    document.getElementById('validatePrescriptionBtn').disabled = true;
 +    
 +    // Mostra status validazione
 +    const pharmacistName = pharmacistsData[pharmacist].fullName;
 +    const validationHtml = '<div class="info">' +
 +        '<strong>✅ VALIDAZIONE COMPLETATA</strong><br>' +
 +        '<strong>Farmacista:</strong> ' + pharmacistName + '<br>' +
 +        '<strong>Data/Ora:</strong> ' + new Date().toLocaleString('it-IT') + '<br>' +
 +        '<strong>Status:</strong> Prescrizione validata per allestimento' +
 +        '</div>';
 +    
 +    document.getElementById('validationStatus').innerHTML = validationHtml;
 +    document.getElementById('validationStatus').style.display = 'block';
 +    
 +    // Abilita fase 2 - Allestimento
 +    enablePreparationPhase();
 +    
 +    alert('✅ Prescrizione validata dal farmacista!\nOra puoi procedere con l\'allestimento.');
 +}
 +
 +// Abilita la fase di allestimento tecnici
 +function enablePreparationPhase() {
 +    const tech1Select = document.getElementById('preparingTechnician1');
 +    const tech2Select = document.getElementById('preparingTechnician2');
 +    
 +    // Abilita le dropdown tecnici
 +    tech1Select.disabled = false;
 +    tech2Select.disabled = false;
 +    
 +    // Popola le dropdown tecnici
 +    [tech1Select, tech2Select].forEach(select => {
 +        select.innerHTML = '<option value="">Seleziona tecnico</option>';
 +        Object.keys(technicianData).forEach(key => {
 +            const option = document.createElement('option');
 +            option.value = key;
 +            option.textContent = technicianData[key].fullName;
 +            select.appendChild(option);
 +        });
 +    });
 +    
 +    // Abilita il pulsante conferma (ma ancora non attivo finché non si selezionano i tecnici)
 +    document.getElementById('confirmPreparationBtn').disabled = false;
 +    document.getElementById('confirmPreparationBtn').innerHTML = '🧪 CONFERMA ALLESTIMENTO';
 +    
 +    // Event listeners per controllare quando entrambi i tecnici sono selezionati
 +    [tech1Select, tech2Select].forEach(select => {
 +        select.addEventListener('change', checkTechniciansSelection);
 +    });
 +}
 +
 +// Controlla se entrambi i tecnici sono selezionati
 +function checkTechniciansSelection() {
 +    const tech1 = document.getElementById('preparingTechnician1').value;
 +    const tech2 = document.getElementById('preparingTechnician2').value;
 +    const confirmBtn = document.getElementById('confirmPreparationBtn');
 +    
 +    if (tech1 && tech2 && tech1 !== tech2) {
 +        confirmBtn.className = 'button';
 +        confirmBtn.innerHTML = '🧪 CONFERMA ALLESTIMENTO';
 +    } else if (tech1 === tech2 && tech1 !== '') {
 +        confirmBtn.className = 'button config-update-pending';
 +        confirmBtn.innerHTML = '⚠️ TECNICI DEVONO ESSERE DIVERSI';
 +    } else {
 +        confirmBtn.className = 'button';
 +        confirmBtn.innerHTML = '🧪 CONFERMA ALLESTIMENTO (seleziona tecnici)';
 +    }
 +}
 +
 +// FASE 2: Conferma Allestimento
 +function confirmPreparation() {
 +    const tech1 = document.getElementById('preparingTechnician1').value;
 +    const tech2 = document.getElementById('preparingTechnician2').value;
 +    
 +    if (!tech1 || !tech2) {
 +        alert('⚠️ Errore: Selezionare entrambi i tecnici preparatori');
 +        return;
 +    }
 +    
 +    if (tech1 === tech2) {
 +        alert('⚠️ Errore: I due tecnici devono essere persone diverse per il controllo incrociato');
 +        return;
 +    }
 +    
 +    // Allestimento confermato
 +    document.getElementById('confirmPreparationBtn').className = 'button config-update-completed';
 +    document.getElementById('confirmPreparationBtn').innerHTML = '🧪 ALLESTIMENTO COMPLETATO ✓';
 +    document.getElementById('confirmPreparationBtn').disabled = true;
 +    
 +    // Mostra status preparazione
 +    const tech1Name = technicianData[tech1].fullName;
 +    const tech2Name = technicianData[tech2].fullName;
 +    const preparationHtml = '<div class="info">' +
 +        '<strong>🧪 ALLESTIMENTO COMPLETATO</strong><br>' +
 +        '<strong>Tecnico 1:</strong> ' + tech1Name + '<br>' +
 +        '<strong>Tecnico 2:</strong> ' + tech2Name + '<br>' +
 +        '<strong>Data/Ora:</strong> ' + new Date().toLocaleString('it-IT') + '<br>' +
 +        '<strong>Status:</strong> NPT pronta per somministrazione' +
 +        '</div>';
 +    
 +    document.getElementById('preparationStatus').innerHTML = preparationHtml;
 +    document.getElementById('preparationStatus').style.display = 'block';
 +    
 +    // Abilita download JSON
 +document.getElementById('downloadBtn').disabled = false;
 +document.getElementById('downloadBtn').className = 'button';
 +
 +    // Abilita pulsante blocco prescrizione
 +    document.getElementById('lockPrescriptionBtn').disabled = false;
 +    document.getElementById('lockPrescriptionBtn').className = 'button';
 +    document.getElementById('lockPrescriptionBtn').style.backgroundColor = '#e74c3c';
 +
 +    // Genera e salva l'ID preparazione per il sistema di blocco
 +    if (!window.currentPrescriptionID) {
 +        window.currentPrescriptionID = generatePreparationID();
 +    }
 +    window.lastPreparationID = window.currentPrescriptionID;
 +
 +    console.log('ID Preparazione assegnato:', window.currentPrescriptionID);
 +
 +
 +
 +    alert('🧪 Allestimento completato!\Puoi ora archiviare la preparazione e bloccarla definitivamente.');
 +    }
 +
 +// =====================================================
 +// SISTEMA BLOCCO PRESCRIZIONE
 +// =====================================================
 +
 +// Variabile globale per stato blocco
 +window.prescriptionLocked = false;
 +
 +// Funzione per bloccare la prescrizione
 +function lockPrescription() {
 +    const confirmed = confirm(
 +        '🔒 ATTENZIONE: BLOCCO PRESCRIZIONE\n\n' +
 +        'Questa operazione bloccherà DEFINITIVAMENTE la prescrizione NPT corrente.\n\n' +
 +        '• Non sarà più possibile modificare i dati\n' +
 +        '• La preparazione sarà considerata FINALIZZATA\n' +
 +        '• Per modifiche servirà una NUOVA prescrizione\n\n' +
 +        'Sei sicuro di voler procedere?'
 +    );
 +    
 +    if (!confirmed) {
 +        return;
 +    }
 +    
 +    // Blocca la prescrizione
 +    window.prescriptionLocked = true;
 +    
 +    // Aggiorna interfaccia
 +    document.getElementById('lockPrescriptionBtn').className = 'button config-update-completed';
 +    document.getElementById('lockPrescriptionBtn').innerHTML = '🔒 PRESCRIZIONE BLOCCATA ✓';
 +    document.getElementById('lockPrescriptionBtn').disabled = true;
 +
 +    // Assicurati che l'ID preparazione sia disponibile per il banner
 +    if (!window.lastPreparationID && window.currentPrescriptionID) {
 +        window.lastPreparationID = window.currentPrescriptionID;
 +    }
 +    // Mostra banner di stato
 +    showPrescriptionLockedBanner();
 +    
 +    // Disabilita tutti i controlli di input
 +    disableAllInputs();
 +    
 +    alert('🔒 PRESCRIZIONE BLOCCATA!\n\n' +
 +          'La prescrizione NPT è ora finalizzata e non può essere modificata.\n' +
 +          'Per eventuali modifiche sarà necessaria una nuova prescrizione.');
 +}
 +
 +// Mostra banner di prescrizione bloccata
 +function showPrescriptionLockedBanner() {
 +    const currentDateTime = new Date().toLocaleString('it-IT');
 +    const preparationID = window.lastPreparationID || window.currentPrescriptionID || 'N/A';
 +    const bannerHtml = '<div class="alert-critical" style="text-align: center; margin: 20px 0;">' +
 +        '<strong>🔒 PRESCRIZIONE NPT BLOCCATA E FINALIZZATA</strong><br>' +
 +        '<strong>Data/Ora blocco:</strong> ' + currentDateTime + '<br>' +
 +        '<strong>ID Preparazione:</strong> ' + preparationID + '<br>' +
 +        '<strong>Status:</strong> NPT pronta per somministrazione - NESSUNA MODIFICA CONSENTITA<br>' +
 +        '<button class="button secondary" onclick="startNewPrescription()" style="margin-top: 10px;">📋 NUOVA PRESCRIZIONE NPT</button>' +
 +        '</div>';
 +    
 +    document.getElementById('prescriptionStatusBanner').innerHTML = bannerHtml;
 +    document.getElementById('prescriptionStatusBanner').style.display = 'block';
 +}
 +
 +// Disabilita tutti gli input quando prescrizione è bloccata
 +function disableAllInputs() {
 +    // Disabilita TAB 2-4, mantieni TAB 1 accessibile per consultazione
 +    const tabButtons = document.querySelectorAll('.tab');
 +    tabButtons.forEach((tab, index) => {
 +        if (index > 0 && index < 4) { // Solo TAB 2-4, NON TAB 1 (index 0)
 +        tab.style.opacity = '0.5';
 +        tab.style.pointerEvents = 'none';
 +        tab.style.cursor = 'not-allowed';
 +    }
 +});
 +    
 +  // Disabilita input solo nei TAB 2-4, mantieni TAB 1 consultabile
 +    const inputElements = document.querySelectorAll('#enteral input, #enteral select, #enteral button, ' +
 +                                               '#nutrition-calc input, #nutrition-calc select, #nutrition-calc button, ' +
 +                                               '#parenteral input, #parenteral select, #parenteral button');
 +
 +    inputElements.forEach(element => {
 +        element.disabled = true;
 +        element.style.opacity = '0.5';
 +});
 +
 +// TAB 1: disabilita solo i pulsanti di modifica, mantieni visibili i dati
 +const tab1Buttons = document.querySelectorAll('#patient-data button');
 +tab1Buttons.forEach(button => {
 +    button.disabled = true;
 +    button.style.opacity = '0.5';
 +});
 +    
 +    // Mostra overlay sui TAB bloccati
 +    addLockedOverlay();
 +}
 +
 +// Aggiunge overlay visivo sui TAB bloccati
 +function addLockedOverlay() {
 +    const lockedTabs = ['enteral', 'nutrition-calc', 'parenteral']; // RIMUOVI 'patient-data'
 +        lockedTabs.forEach(tabId => {
 +        const tabElement = document.getElementById(tabId);
 +        if (tabElement && !tabElement.querySelector('.locked-overlay')) {
 +            const overlay = document.createElement('div');
 +            overlay.className = 'locked-overlay';
 +            overlay.style.cssText = `
 +                position: absolute;
 +                top: 0;
 +                left: 0;
 +                width: 100%;
 +                height: 100%;
 +                background-color: rgba(231, 76, 60, 0.1);
 +                z-index: 1000;
 +                display: flex;
 +                align-items: center;
 +                justify-content: center;
 +                font-size: 24px;
 +                font-weight: bold;
 +                color: #e74c3c;
 +                pointer-events: none;
 +            `;
 +            overlay.innerHTML = '🔒 PRESCRIZIONE BLOCCATA';
                          
-            if (config.fortifierData) { +            tabElement.style.position = 'relative'; 
-                Object.assign(fortifierDataconfig.fortifierData); +            tabElement.appendChild(overlay); 
-                populateFortifierConfigTable();+        } 
 +    }); 
 +
 + 
 +// Funzione per iniziare nuova prescrizione 
 +function startNewPrescription() { 
 +    const confirmed = confirm( 
 +        '📋 NUOVA PRESCRIZIONE NPT\n\n'
 +        'Questa operazione:\n'
 +        '• Resetterà tutti i dati correnti\n'
 +        '• Permetterà di iniziare una nuova prescrizione\n'
 +        '• La prescrizione precedente rimarrà archiviata\n\n'
 +        'Vuoi procedere?' 
 +    ); 
 +     
 +    if (!confirmed) { 
 +        return; 
 +    } 
 +     
 +    // Reset completo dell'applicazione 
 +    resetToNewPrescription(); 
 +
 + 
 +// Reset per nuova prescrizione 
 +function resetToNewPrescription() { 
 +    // Reset variabili globali 
 +    window.prescriptionLocked = false; 
 +    window.residualNeeds = null; 
 +    window.nptCalculation = null; 
 +    window.monthlyPreparations = []; 
 +    window.currentPrescriptionID = null; 
 +    patientData = {}; 
 +    enteralData = null; 
 +    currentRequirements = null; 
 +     
 +    // Riabilita tutti gli input 
 +    enableAllInputs(); 
 +     
 +    // Reset tutti i form 
 +    resetAllForms(); 
 +     
 +    // Nascondi banner 
 +    document.getElementById('prescriptionStatusBanner').style.display = 'none'; 
 +     
 +    // Vai al TAB 1 
 +    showTab('patient-data'); 
 +     
 +    // Imposta nuova data 
 +    const today = new Date().toISOString().split('T')[0]; 
 +    document.getElementById('prescriptionDate').value = today; 
 +     
 +    alert('📋 Nuova prescrizione iniziata!\nPuoi ora inserire i dati del nuovo paziente.'); 
 +
 + 
 +// Funzioni di supporto per reset completo 
 +function enableAllInputs() { 
 +    // Riabilita tutti i TAB 
 +    const tabButtons = document.querySelectorAll('.tab'); 
 +    tabButtons.forEach(tab => { 
 +        tab.style.opacity = '1'; 
 +        tab.style.pointerEvents = 'auto'; 
 +        tab.style.cursor = 'pointer'; 
 +    }); 
 +     
 +    // Riabilita tutti gli input 
 +    const inputElements = document.querySelectorAll('#patient-data input#patient-data select, #patient-data button, ' + 
 +                                                   '#enteral input, #enteral select, #enteral button, ' + 
 +                                                   '#nutrition-calc input, #nutrition-calc select, #nutrition-calc button, ' + 
 +                                                   '#parenteral input, #parenteral select, #parenteral button'); 
 +     
 +    inputElements.forEach(element => { 
 +        element.disabled = false; 
 +        element.style.opacity = '1'; 
 +    }); 
 +     
 +    // Rimuovi overlay bloccati 
 +    removeLockedOverlays(); 
 +
 + 
 +function removeLockedOverlays() { 
 +    const overlays = document.querySelectorAll('.locked-overlay'); 
 +    overlays.forEach(overlay => { 
 +        overlay.remove(); 
 +    }); 
 +
 + 
 +function resetAllForms() { 
 +    // Reset TAB 1 - Dati Paziente 
 +    document.getElementById('medicalRecord').value = new Date().getFullYear().toString(); 
 +    document.getElementById('birthWeight').value = '1000'; 
 +    document.getElementById('currentWeight').value = '1000'; 
 +    document.getElementById('daysOfLife').value = '9'; 
 +    document.getElementById('gestationalWeeks').value = ''; 
 +    document.getElementById('gestationalDays').value = ''; 
 +    document.getElementById('postConceptionalAge').value = ''; 
 +    document.getElementById('bun').value = ''; 
 +    document.getElementById('glucose').value = ''; 
 +    document.getElementById('sodium').value = ''; 
 +    document.getElementById('ph').value = ''; 
 +    document.getElementById('baseExcess').value = ''; 
 +    document.getElementById('diuresis').value = ''; 
 +    document.getElementById('prescribingDoctor').value = ''; 
 +     
 +    // Reset pulsanti TAB 1 
 +    const phaseBtn = document.getElementById('calculatePhaseBtn'); 
 +    if (phaseBtn) { 
 +        phaseBtn.className = 'button calculate-phase-pending'; 
 +        phaseBtn.innerHTML = 'CALCOLA FASE NUTRIZIONALE'; 
 +        phaseBtn.disabled = false; 
 +    } 
 +     
 +    // Nascondi risultati fase 
 +    const phaseResults = document.getElementById('phaseResults'); 
 +    if (phaseResults) { 
 +        phaseResults.classList.add('hidden'); 
 +    } 
 +     
 +    // Reset TAB 2 - Nutrizione Enterale 
 +    document.getElementById('formulaType').value = 'none'; 
 +    document.getElementById('dailyVolume').value = '0'; 
 +    document.getElementById('additionalFluids').value = '0'; 
 +    document.getElementById('fluidType').value = 'saline'; 
 +    document.getElementById('fluidRoute').value = 'iv'; 
 +     
 +    // Reset pulsanti TAB 2 
 +    const enteralBtn = document.getElementById('calculateEnteralBtn'); 
 +    if (enteralBtn) { 
 +        enteralBtn.className = 'button calculate-nutrition-pending'; 
 +        enteralBtn.innerHTML = 'Calcola Apporti Enterali'; 
 +    } 
 +     
 +    // Nascondi risultati enterali 
 +    const enteralResults = document.getElementById('enteralResults'); 
 +    if (enteralResults) { 
 +        enteralResults.classList.add('hidden'); 
 +    } 
 +     
 +    // Reset TAB 3 - Fabbisogni 
 +    document.getElementById('targetDay').value = '9'; 
 +    document.getElementById('weightCategory').value = ''; 
 +    resetNutritionFields(); 
 +     
 +    // Reset pulsanti TAB 3 
 +    const loadBtn = document.getElementById('loadDefaultsBtn'); 
 +    const nutritionBtn = document.getElementById('calculateNutritionBtn'); 
 +    if (loadBtn) { 
 +        loadBtn.className = 'button load-defaults-pending'; 
 +        loadBtn.innerHTML = 'Carica Valori Standard'; 
 +    } 
 +    if (nutritionBtn) { 
 +        nutritionBtn.className = 'button calculate-nutrition-pending'; 
 +        nutritionBtn.innerHTML = 'CALCOLA FABBISOGNI'; 
 +    } 
 +     
 +    // Nascondi risultati nutrizione 
 +    const nutritionResults = document.getElementById('nutritionResults'); 
 +    if (nutritionResults) { 
 +        nutritionResults.classList.add('hidden'); 
 +    } 
 +     
 +    // Reset TAB 4 - Parenterale 
 +    resetParenteralFields(); 
 +     
 +    // Reset TAB 5 - Report 
 +    resetReportFields(); 
 +     
 +    updateFortifierOptions(); 
 +
 + 
 +function resetNutritionFields() { 
 +    const nutritionFields = [ 
 +        'reqLiquids', 'reqProtein', 'reqCarbs', 'reqLipids', 
 +        'reqCalcium', 'reqPhosphorus', 'reqMagnesium', 'reqSodium', 'reqPotassium', 
 +        'reqVitalipid', 'reqSoluvit', 'reqPeditrace', 'reqCarnitine' 
 +    ]; 
 +     
 +    nutritionFields.forEach(fieldId => { 
 +        const field = document.getElementById(fieldId); 
 +        if (field) { 
 +            field.value = '0'; 
 +        } 
 +    }); 
 +     
 +    // Reset unità carboidrati 
 +    document.getElementById('carbUnit').value = 'g'; 
 +    document.getElementById('carbLabel').textContent = 'Glucidi (g/kg/die):'; 
 +     
 +    // Reset tipo sodio 
 +    document.getElementById('sodiumType').value = 'nacl'; 
 +     
 +    // Nascondi raccomandazione sodio 
 +    const sodiumRec = document.getElementById('sodiumRecommendation'); 
 +    if (sodiumRec) { 
 +        sodiumRec.classList.add('hidden'); 
 +    } 
 +
 + 
 +function resetParenteralFields() { 
 +    document.getElementById('calculatedTotalVolume').value = "Premere 'Calcola NPT'"; 
 +    document.getElementById('suggestedGlucose').value = "Premere 'Calcola NPT'"; 
 +    document.getElementById('calculatedProteinVol').value = "--"; 
 +    document.getElementById('calculatedLipidVol').value = "--"; 
 +     
 +    const parenteralBtn = document.getElementById('calculateParenteralBtn'); 
 +    if (parenteralBtn) { 
 +        parenteralBtn.className = 'button'; 
 +        parenteralBtn.innerHTML = 'CALCOLA NPT AUTOMATICA'; 
 +    } 
 +     
 +    const parenteralResults = document.getElementById('parenteralResults'); 
 +    if (parenteralResults) { 
 +        parenteralResults.classList.add('hidden'); 
 +    } 
 +
 + 
 +function resetReportFields() { 
 +    // Reset dropdown personale 
 +    document.getElementById('validatingPharmacist').value = ''; 
 +    document.getElementById('preparingTechnician1').value = ''; 
 +    document.getElementById('preparingTechnician2').value = ''; 
 +     
 +    // Reset pulsanti validazione/preparazione 
 +    const validateBtn = document.getElementById('validatePrescriptionBtn'); 
 +    const confirmBtn = document.getElementById('confirmPreparationBtn'); 
 +    const downloadBtn = document.getElementById('downloadBtn'); 
 +    const lockBtn = document.getElementById('lockPrescriptionBtn'); 
 +     
 +    if (validateBtn) { 
 +        validateBtn.className = 'button'; 
 +        validateBtn.innerHTML = '✅ VALIDA PRESCRIZIONE'; 
 +        validateBtn.disabled = false; 
 +    } 
 +     
 +    if (confirmBtn) { 
 +        confirmBtn.className = 'button'; 
 +        confirmBtn.innerHTML = '🧪 CONFERMA ALLESTIMENTO'; 
 +        confirmBtn.disabled = true; 
 +    } 
 +     
 +    if (downloadBtn) { 
 +        downloadBtn.className = 'button secondary'; 
 +        downloadBtn.innerHTML = '💾 ARCHIVIA PREPARAZIONE (JSON)'; 
 +        downloadBtn.disabled = true; 
 +    } 
 +     
 +    if (lockBtn) { 
 +        lockBtn.className = 'button'; 
 +        lockBtn.innerHTML = '🔒 BLOCCA PRESCRIZIONE'; 
 +        lockBtn.disabled = true; 
 +        lockBtn.style.backgroundColor = '#e74c3c'; 
 +    } 
 +     
 +    // Nascondi status 
 +    const validationStatus = document.getElementById('validationStatus'); 
 +    const preparationStatus = document.getElementById('preparationStatus'); 
 +    if (validationStatus) validationStatus.style.display = 'none'; 
 +    if (preparationStatus) preparationStatus.style.display = 'none'; 
 +     
 +    // Reset area report 
 +    document.getElementById('reportOutput').innerHTML = ''; 
 +
 + 
 + 
 +// SISTEMA DI ARCHIVIAZIONE JSON 
 +function generatePreparationID() { 
 +    const medicalRecord = patientData.medicalRecord; 
 +    let prescriptionDate = patientData.prescriptionDate; // ✅ Cambiato da const a let 
 +     
 +    if (!medicalRecord || medicalRecord.trim() === '') { 
 +        return null; 
 +    } 
 +     
 +    if (!prescriptionDate || prescriptionDate.trim() === '') { 
 +        // Usa data odierna se non specificata 
 +        const today = new Date().toISOString().split('T')[0]; 
 +        prescriptionDate = today; // ✅ Ora funziona correttamente 
 +    } 
 +     
 +    // Converte la data da YYYY-MM-DD a DDMMYYYY 
 +    const dateObj = new Date(prescriptionDate); 
 +    const day = dateObj.getDate().toString().padStart(2, '0'); 
 +    const month = (dateObj.getMonth() + 1).toString().padStart(2, '0'); 
 +    const year = dateObj.getFullYear().toString(); 
 +    const formattedDate = day + month + year; 
 +     
 +    // Crea chiave univoca per cartella + data 
 +    const counterKey = medicalRecord + '_' + formattedDate; 
 +     
 +    // Inizializza il contatore se non esiste 
 +    if (!window.preparationCounter) { 
 +        window.preparationCounter = {}; 
 +    } 
 +     
 +    if (!window.preparationCounter[counterKey]) { 
 +        window.preparationCounter[counterKey] = 0; 
 +    } 
 +     
 +    // Incrementa il contatore 
 +    window.preparationCounter[counterKey]++; 
 +     
 +    // Genera l'ID con formato: CARTELLA_DDMMYYYY_NN 
 +    const counter = window.preparationCounter[counterKey].toString().padStart(2, '0'); 
 +    const preparationID = medicalRecord + '_' + formattedDate + '_' + counter; 
 +     
 +    return preparationID; 
 +
 +function createPreparationJSON() { 
 +    if (!window.residualNeeds || !window.nptCalculation || !patientData.currentWeight) { 
 +        alert('❌ Errore: Prima completare tutti i calcoli NPT (TAB 1-4)'); 
 +        return null; 
 +    } 
 +     
 +    // Genera ID preparazione 
 +    const preparationID = generatePreparationID(); 
 +    if (!preparationID) { 
 +        alert('❌ Errore: Impossibile generare ID preparazione. Verificare cartella clinica e data.'); 
 +        return null; 
 +    } 
 +     
 +    // Recupera dati personale 
 +    const pharmacistKey = document.getElementById('validatingPharmacist').value; 
 +    const tech1Key = document.getElementById('preparingTechnician1').value; 
 +    const tech2Key = document.getElementById('preparingTechnician2').value; 
 +     
 +    const pharmacistName = pharmacistKey ? pharmacistsData[pharmacistKey].fullName : 'NON SPECIFICATO'; 
 +    const tech1Name = tech1Key ? technicianData[tech1Key].fullName : 'NON SPECIFICATO'; 
 +    const tech2Name = tech2Key ? technicianData[tech2Key].fullName : 'NON SPECIFICATO'; 
 +     
 +    // Crea oggetto JSON completo 
 +    const preparationData = { 
 +        // IDENTIFICAZIONE 
 +        preparationID: preparationID, 
 +        cartellaClinica: patientData.medicalRecord, 
 +        dataPrescrizione: patientData.prescriptionDate, 
 +        dataCreazione: new Date().toISOString(), 
 +         
 +       // DATI PAZIENTE 
 +        paziente: { 
 +            pesoAttuale: patientData.currentWeight, 
 +            pesoNascita: patientData.birthWeight || 0, 
 +            giorniVita: patientData.daysOfLife || 0, 
 +            etaGestazionale:
 +            settimane: patientData.gestationalWeeks || null, 
 +            giorni: patientData.gestationalDays || null, 
 +            formato: patientData.gestationalWeeks && patientData.gestationalWeeks > 0 ?  
 +            patientData.gestationalWeeks + '+' + (patientData.gestationalDays || 0) : null
             }             }
 +        },
 +        
 +        // DATI CLINICI
 +        parametriClinici: {
 +            bun: patientData.bun || null,
 +            glicemia: patientData.glucose || null,
 +            natremia: patientData.sodium || null,
 +            ph: patientData.ph || null,
 +            baseExcess: patientData.baseExcess || null,
 +            diuresi: patientData.diuresis || null
 +        },
 +        
 +        // COMPOSIZIONE NPT
 +        npt: {
 +            volumeTotale: window.nptCalculation.totalVolume,
 +            energia: window.residualNeeds.energy.toFixed(1),
 +            proteine: window.residualNeeds.protein.toFixed(2),
 +            lipidi: window.residualNeeds.lipids.toFixed(2),
 +            glucidi: window.residualNeeds.carbs.toFixed(2),
 +            gir: window.nptCalculation.gir.toFixed(1),
 +            osmolarita: window.nptCalculation.osmolarityData ? window.nptCalculation.osmolarityData.total : 0,
 +            velocitaInfusione: (window.nptCalculation.totalVolume / 24).toFixed(2)
 +        },
 +        
 +        // COMPONENTI DETTAGLIATI
 +        componenti: {
 +            glucosio50: window.nptCalculation.glucose50Volume.toFixed(1),
 +            trophamine: window.nptCalculation.proteinVolume.toFixed(1),
 +            intralipid: window.nptCalculation.lipidVolume.toFixed(1),
 +            acquaBidistillata: window.nptCalculation.waterVolume.toFixed(1),
 +            elettroliti: window.nptCalculation.electrolyteAdditions
 +        },
 +        
 +        // PERSONALE
 +        personale: {
 +            medicoPrescrittore: patientData.prescribingDoctorName || 'NON SPECIFICATO',
 +            farmacistValidatore: pharmacistName,
 +            tecnico1: tech1Name,
 +            tecnico2: tech2Name
 +        },
 +        
 +        // METADATA
 +        sistema: {
 +            versione: "NPT Calculator v3.0 UNIFIED",
 +            dataCalcolo: new Date().toISOString()
 +        }
 +    };
 +    
 +    return preparationData;
 +}
 +
 +function downloadPreparationJSON() {
 +    console.log('Inizio generazione JSON preparazione...');
 +    
 +    const preparationData = createPreparationJSON();
 +    if (!preparationData) {
 +        return; // Errore già mostrato in createPreparationJSON
 +    }
 +    
 +    try {
 +        // Crea il file JSON
 +        const jsonString = JSON.stringify(preparationData, null, 2);
 +        const blob = new Blob([jsonString], { type: 'application/json' });
 +        
 +        // Nome file: NPT_[ID].json
 +        const filename = `NPT_${preparationData.preparationID}.json`;
 +        
 +        // Download automatico
 +        const url = URL.createObjectURL(blob);
 +        const a = document.createElement('a');
 +        a.href = url;
 +        a.download = filename;
 +        document.body.appendChild(a);
 +        a.click();
 +        document.body.removeChild(a);
 +        URL.revokeObjectURL(url);
 +        
 +        // Feedback successo
 +        document.getElementById('downloadBtn').className = 'button config-update-completed';
 +        document.getElementById('downloadBtn').innerHTML = '💾 ARCHIVIAZIONE COMPLETATA ✓';
 +        
 +        alert(`✅ Preparazione archiviata con successo!\n\n` +
 +              `📋 ID: ${preparationData.preparationID}\n` +
 +              `📁 File: ${filename}\n` +
 +              `📊 Dati: ${Object.keys(preparationData).length} sezioni salvate`);
 +        // Salva ID per il sistema di blocco
 +        window.lastPreparationID = preparationData.preparationID;
 +        
 +        console.log('JSON generato con successo:', preparationData);
 +        
 +    } catch (error) {
 +        console.error('Errore nella generazione JSON:', error);
 +        alert('❌ Errore nella generazione del file JSON:\n' + error.message);
 +    }
 +}
 +
 +
 +// =====================================================
 +// SISTEMA ARCHIVIAZIONE MENSILE EXCEL
 +// =====================================================
 +
 +// Variabile globale per i dati mensili
 +window.monthlyPreparations = [];
 +
 +// Funzione per inizializzare il mese corrente
 +function initializeMonthlySection() {
 +    const now = new Date();
 +    const currentMonth = now.getFullYear() + '-' + (now.getMonth() + 1).toString().padStart(2, '0');
 +    document.getElementById('selectedMonth').value = currentMonth;
 +}
 +
 +// Funzione anteprima dati mensili
 +function previewMonthlyData() {
 +    const fileInput = document.getElementById('jsonFilesInput');
 +    const files = fileInput.files;
 +    
 +    if (!files || files.length === 0) {
 +        alert('⚠️ Seleziona prima i file JSON da consolidare');
 +        return;
 +    }
 +    
 +    // Reset dati precedenti
 +    window.monthlyPreparations = [];
 +    
 +    let processedFiles = 0;
 +    const totalFiles = files.length;
 +    
 +    // Processa tutti i file JSON
 +    Array.from(files).forEach((file, index) => {
 +        const reader = new FileReader();
 +        
 +        reader.onload = function(e) {
 +            try {
 +                const jsonData = JSON.parse(e.target.result);
 +                
 +                // Valida che sia un file NPT valido
 +                if (validateNPTJson(jsonData)) {
 +                    window.monthlyPreparations.push(jsonData);
 +                } else {
 +                    console.warn('File non valido ignorato:', file.name);
 +                }
 +                
 +                processedFiles++;
 +                
 +                // Quando tutti i file sono processati, mostra l'anteprima
 +                if (processedFiles === totalFiles) {
 +                    showMonthlyPreview();
 +                }
 +                
 +            } catch (error) {
 +                console.error('Errore parsing JSON:', file.name, error);
 +                processedFiles++;
 +                
 +                if (processedFiles === totalFiles) {
 +                    showMonthlyPreview();
 +                }
 +            }
 +        };
 +        
 +        reader.readAsText(file);
 +    });
 +}
 +
 +// Funzione di validazione JSON NPT
 +function validateNPTJson(data) {
 +    return data && 
 +           data.preparationID && 
 +           data.cartellaClinica && 
 +           data.npt && 
 +           data.paziente &&
 +           data.sistema &&
 +           data.sistema.versione;
 +}
 +
 +// Funzione per mostrare l'anteprima
 +function showMonthlyPreview() {
 +    const statsDiv = document.getElementById('monthlyStats');
 +    const selectedMonth = document.getElementById('selectedMonth').value;
 +    const monthName = new Date(selectedMonth + '-01').toLocaleDateString('it-IT',
 +        year: 'numeric', 
 +        month: 'long' 
 +    });
 +    
 +    if (window.monthlyPreparations.length === 0) {
 +        statsDiv.innerHTML = '<div class="error">❌ Nessun file NPT valido trovato</div>';
 +        statsDiv.style.display = 'block';
 +        return;
 +    }
 +    
 +    // Calcola statistiche
 +    const stats = calculateMonthlyStats(window.monthlyPreparations);
 +    
 +    let html = '<div class="info">';
 +    html += '<h4 style="margin-top: 0;">📊 ANTEPRIMA - ' + monthName + '</h4>';
 +    html += '<p><strong>File NPT trovati:</strong> ' + window.monthlyPreparations.length + '</p>';
 +    html += '<p><strong>Pazienti unici:</strong> ' + stats.uniquePatients + '</p>';
 +    html += '<p><strong>Peso medio:</strong> ' + stats.averageWeight.toFixed(0) + 'g</p>';
 +    html += '<p><strong>GIR medio:</strong> ' + stats.averageGIR.toFixed(1) + ' mg/kg/min</p>';
 +    html += '<p><strong>Volume medio NPT:</strong> ' + stats.averageVolume.toFixed(0) + ' ml</p>';
 +    html += '</div>';
 +    
 +    html += '<div class="warning" style="font-size: 12px; margin-top: 10px;">';
 +    html += '<strong>📋 File da processare:</strong><br>';
 +    window.monthlyPreparations.forEach(prep => {
 +        html += '• ' + prep.preparationID + ' (Cartella: ' + prep.cartellaClinica + ')<br>';
 +    });
 +    html += '</div>';
 +    
 +    statsDiv.innerHTML = html;
 +    statsDiv.style.display = 'block';
 +    
 +    // Abilita il pulsante Excel
 +    document.getElementById('generateExcelBtn').disabled = false;
 +    document.getElementById('generateExcelBtn').className = 'button';
 +    document.getElementById('generateExcelBtn').innerHTML = '📊 GENERA EXCEL MENSILE (' + window.monthlyPreparations.length + ' NPT)';
 +}
 +
 +// Funzione per calcolare statistiche mensili
 +function calculateMonthlyStats(preparations) {
 +    const uniquePatients = new Set(preparations.map(p => p.cartellaClinica)).size;
 +    const totalWeight = preparations.reduce((sum, p) => sum + (p.paziente.pesoAttuale || 0), 0);
 +    const totalGIR = preparations.reduce((sum, p) => sum + (parseFloat(p.npt.gir) || 0), 0);
 +    const totalVolume = preparations.reduce((sum, p) => sum + (p.npt.volumeTotale || 0), 0);
 +    
 +    return {
 +        uniquePatients: uniquePatients,
 +        averageWeight: totalWeight / preparations.length,
 +        averageGIR: totalGIR / preparations.length,
 +        averageVolume: totalVolume / preparations.length
 +    };
 +}
 +
 +// Funzione principale per generare Excel mensile
 +function generateMonthlyExcel() {
 +    if (!window.monthlyPreparations || window.monthlyPreparations.length === 0) {
 +        alert('⚠️ Prima esegui l\'anteprima per caricare i dati');
 +        return;
 +    }
 +    
 +    try {
 +        // Crea un nuovo workbook
 +        const wb = XLSX.utils.book_new();
 +        
 +        // FOGLIO 1: Riepilogo Mensile
 +        const summaryData = createSummarySheet(window.monthlyPreparations);
 +        const ws_summary = XLSX.utils.aoa_to_sheet(summaryData);
 +        XLSX.utils.book_append_sheet(wb, ws_summary, "Riepilogo Mensile");
 +        
 +        // FOGLIO 2: Dettaglio Preparazioni
 +        const detailData = createDetailSheet(window.monthlyPreparations);
 +        const ws_detail = XLSX.utils.aoa_to_sheet(detailData);
 +        XLSX.utils.book_append_sheet(wb, ws_detail, "Dettaglio Preparazioni");
 +        
 +        // FOGLIO 3: Statistiche Cliniche
 +        const statsData = createStatsSheet(window.monthlyPreparations);
 +        const ws_stats = XLSX.utils.aoa_to_sheet(statsData);
 +        XLSX.utils.book_append_sheet(wb, ws_stats, "Statistiche Cliniche");
 +        
 +        // FOGLIO 4: Componenti NPT
 +        const componentsData = createComponentsSheet(window.monthlyPreparations);
 +        const ws_components = XLSX.utils.aoa_to_sheet(componentsData);
 +        XLSX.utils.book_append_sheet(wb, ws_components, "Componenti NPT");
 +        
 +        // Genera nome file
 +        const selectedMonth = document.getElementById('selectedMonth').value;
 +        const monthYear = selectedMonth.replace('-', '_');
 +        const fileName = `NPT_Consolidato_${monthYear}.xlsx`;
 +        
 +        // Salva il file
 +        XLSX.writeFile(wb, fileName);
 +        
 +        // Feedback successo
 +        document.getElementById('generateExcelBtn').className = 'button config-update-completed';
 +        document.getElementById('generateExcelBtn').innerHTML = '📊 EXCEL GENERATO ✓';
 +        
 +        alert(`✅ Excel generato con successo!\n\n` +
 +              `📁 File: ${fileName}\n` +
 +              `📊 Preparazioni: ${window.monthlyPreparations.length}\n` +
 +              `📋 Fogli: 4 (Riepilogo, Dettaglio, Statistiche, Componenti)`);
 +        
 +    } catch (error) {
 +        console.error('Errore generazione Excel:', error);
 +        alert('❌ Errore nella generazione Excel:\n' + error.message);
 +    }
 +}
 +
 +// Crea foglio riepilogo mensile
 +function createSummarySheet(preparations) {
 +    const selectedMonth = document.getElementById('selectedMonth').value;
 +    const monthName = new Date(selectedMonth + '-01').toLocaleDateString('it-IT',
 +        year: 'numeric', 
 +        month: 'long' 
 +    });
 +    
 +    const stats = calculateMonthlyStats(preparations);
 +    
 +    const data = [
 +        [`REPORT MENSILE NPT - ${monthName.toUpperCase()}`, '', '', ''],
 +        [`Generato il: ${new Date().toLocaleDateString('it-IT')}`, '', '', ''],
 +        [`Sistema: NPT Calculator v3.0 UNIFIED`, '', '', ''],
 +        ['', '', '', ''],
 +        ['STATISTICHE GENERALI', '', '', ''],
 +        ['Totale preparazioni NPT:', preparations.length, '', ''],
 +        ['Pazienti unici trattati:', stats.uniquePatients, '', ''],
 +        ['Peso medio pazienti:', `${stats.averageWeight.toFixed(0)}g`, '', ''],
 +        ['GIR medio:', `${stats.averageGIR.toFixed(1)} mg/kg/min`, '', ''],
 +        ['Volume medio NPT:', `${stats.averageVolume.toFixed(0)} ml`, '', ''],
 +        ['', '', '', ''],
 +        ['DISTRIBUZIONE PER PESO', '', '', ''],
 +        ['ELBW (≤1000g):', preparations.filter(p => p.paziente.pesoAttuale <= 1000).length, '', ''],
 +        ['VLBW (1001-1500g):', preparations.filter(p => p.paziente.pesoAttuale > 1000 && p.paziente.pesoAttuale <= 1500).length, '', ''],
 +        ['LBW (1501-2500g):', preparations.filter(p => p.paziente.pesoAttuale > 1500 && p.paziente.pesoAttuale <= 2500).length, '', ''],
 +        ['NBW (>2500g):', preparations.filter(p => p.paziente.pesoAttuale > 2500).length, '', ''],
 +        ['', '', '', ''],
 +        ['DISTRIBUZIONE PER ETÀ', '', '', ''],
 +        ['0-7 giorni:', preparations.filter(p => p.paziente.giorniVita <= 7).length, '', ''],
 +        ['8-14 giorni:', preparations.filter(p => p.paziente.giorniVita > 7 && p.paziente.giorniVita <= 14).length, '', ''],
 +        ['15-30 giorni:', preparations.filter(p => p.paziente.giorniVita > 14 && p.paziente.giorniVita <= 30).length, '', ''],
 +        ['>30 giorni:', preparations.filter(p => p.paziente.giorniVita > 30).length, '', '']
 +    ];
 +    
 +    return data;
 +}
 +
 +// Crea foglio dettaglio preparazioni
 +function createDetailSheet(preparations) {
 +    const header = [
 +        'ID Preparazione', 'Cartella Clinica', 'Data Prescrizione', 'Medico Prescrittore',
 +        'Peso (g)', 'Giorni Vita', 'Volume NPT (ml)', 'GIR (mg/kg/min)', 
 +        'Proteine (g/kg/die)', 'Lipidi (g/kg/die)', 'Energia (kcal/kg/die)',
 +        'Osmolarità (mOsm/L)', 'Farmacista', 'Tecnico 1', 'Tecnico 2'
 +    ];
 +    
 +    const data = [header];
 +    
 +    preparations.forEach(prep => {
 +        const row = [
 +            prep.preparationID || '',
 +            prep.cartellaClinica || '',
 +            prep.dataPrescrizione || '',
 +            prep.personale?.medicoPrescrittore || '',
 +            prep.paziente?.pesoAttuale || 0,
 +            prep.paziente?.giorniVita || 0,
 +            prep.npt?.volumeTotale || 0,
 +            prep.npt?.gir || 0,
 +            prep.npt?.proteine || 0,
 +            prep.npt?.lipidi || 0,
 +            prep.npt?.energia || 0,
 +            prep.npt?.osmolarita || 0,
 +            prep.personale?.farmacistValidatore || '',
 +            prep.personale?.tecnico1 || '',
 +            prep.personale?.tecnico2 || ''
 +        ];
 +        data.push(row);
 +    });
 +    
 +    return data;
 +}
 +
 +// Crea foglio statistiche cliniche
 +function createStatsSheet(preparations) {
 +    const header = [
 +        'PARAMETRO', 'MEDIA', 'MIN', 'MAX', 'DEVIAZIONE STD', 'N° CAMPIONI'
 +    ];
 +    
 +    const data = [
 +        ['STATISTICHE CLINICHE DETTAGLIATE', '', '', '', '', ''],
 +        ['', '', '', '', '', ''],
 +        header
 +    ];
 +    
 +    // Calcola statistiche per ogni parametro clinico
 +    const parameters = [
 +        { name: 'Peso (g)', values: preparations.map(p => p.paziente.pesoAttuale).filter(v => v > 0) },
 +        { name: 'Giorni di vita', values: preparations.map(p => p.paziente.giorniVita).filter(v => v > 0) },
 +        { name: 'Volume NPT (ml)', values: preparations.map(p => p.npt.volumeTotale).filter(v => v > 0) },
 +        { name: 'GIR (mg/kg/min)', values: preparations.map(p => parseFloat(p.npt.gir)).filter(v => !isNaN(v) && v > 0) },
 +        { name: 'Proteine (g/kg/die)', values: preparations.map(p => parseFloat(p.npt.proteine)).filter(v => !isNaN(v) && v > 0) },
 +        { name: 'Lipidi (g/kg/die)', values: preparations.map(p => parseFloat(p.npt.lipidi)).filter(v => !isNaN(v) && v > 0) },
 +        { name: 'Energia (kcal/kg/die)', values: preparations.map(p => parseFloat(p.npt.energia)).filter(v => !isNaN(v) && v > 0) },
 +        { name: 'Osmolarità (mOsm/L)', values: preparations.map(p => p.npt.osmolarita).filter(v => v > 0) }
 +    ];
 +    
 +    parameters.forEach(param => {
 +        if (param.values.length > 0) {
 +            const avg = param.values.reduce((a, b) => a + b, 0) / param.values.length;
 +            const min = Math.min(...param.values);
 +            const max = Math.max(...param.values);
 +            const variance = param.values.reduce((acc, val) => acc + Math.pow(val - avg, 2), 0) / param.values.length;
 +            const stdDev = Math.sqrt(variance);
                          
-            // SALVA LE MODIFICHE IMPORTATE +            data.push([ 
-            saveToStorage(); +                param.name, 
-             +                avg.toFixed(2), 
-            showConfigResult('Configurazione v(config.version || '1.0'importata e salvata con successo!');+                min.toFixed(2), 
 +                max.toFixed(2), 
 +                stdDev.toFixed(2), 
 +                param.values.length 
 +            ]); 
 +        } 
 +    }); 
 +     
 +    // Aggiungi sezione parametri ematochimici se disponibili 
 +    data.push(['', '', '', '', '', '']); 
 +    data.push(['PARAMETRI EMATOCHIMICI (quando disponibili)', '', '', '', '', '']); 
 +    data.push(['', '', '', '', '', '']); 
 +     
 +    const bloodParams = [ 
 +        { name: 'BUN (mg/dL)', values: preparations.map(p => parseFloat(p.parametriClinici?.bun)).filter(v => !isNaN(v)) }, 
 +        { name: 'Glicemia (mg/dL)', values: preparations.map(p => parseFloat(p.parametriClinici?.glicemia)).filter(v => !isNaN(v)) }, 
 +        { name: 'Natremia (mEq/L)', values: preparations.map(p => parseFloat(p.parametriClinici?.natremia)).filter(v => !isNaN(v)) }, 
 +        { name: 'pH', values: preparations.map(p => parseFloat(p.parametriClinici?.ph)).filter(v => !isNaN(v)) } 
 +    ]; 
 +     
 +    bloodParams.forEach(param => { 
 +        if (param.values.length > 0) { 
 +            const avg = param.values.reduce((a, b) => a + b, 0) / param.values.length; 
 +            const min = Math.min(...param.values); 
 +            const max = Math.max(...param.values); 
 +            const variance = param.values.reduce((acc, val) => acc + Math.pow(val - avg, 2), 0) / param.values.length; 
 +            const stdDev = Math.sqrt(variance);
                          
-        } catch (error{ +            data.push(
-            showConfigResult('Errore nell\'importazione: ' + error.message'error');+                param.name, 
 +                avg.toFixed(2), 
 +                min.toFixed(2), 
 +                max.toFixed(2), 
 +                stdDev.toFixed(2), 
 +                param.values.length 
 +            ]);
         }         }
-    }; +    })
-    reader.readAsText(file);+     
 +    return data;
 } }
  
-function showConfigResult(message, type) { +// Crea foglio componenti NPT 
-    const resultsDiv document.getElementById('configResults'); +function createComponentsSheet(preparations) { 
-    const configInfo = document.getElementById('configInfo');+    const header 
 +        'ID Preparazione', 'Cartella', 'Glucosio 50% (ml)''Trophamine (ml)',  
 +        'Intralipid (ml)', 'Acqua Bid. (ml)''Ca Gluconato (ml)', 'Esafosfina (ml)', 
 +        'Mg Solfato (ml)', 'NaCl (ml)', 'Na Acetato (ml)', 'KCl (ml)', 
 +        'Vitalipid (ml)', 'Soluvit (ml)', 'Peditrace (ml)', 'Carnitene (ml)' 
 +    ];
          
-    configInfo.innerHTML message; +    const data [ 
-    resultsDiv.className = 'results+ (type === 'errorerror''); +        ['DETTAGLIO COMPONENTI NPT''''''', '', '', '', '', '', '', '', '', '', '', '', ''], 
-    resultsDiv.classList.remove('hidden');+        ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''], 
 +        header 
 +    ];
          
-    if (type !== 'error'{ +    preparations.forEach(prep => { 
-        setTimeout(function() { +        const comp prep.componenti || {}; 
-            resultsDiv.classList.add('hidden'); +        const row = [ 
-        }, 8000);+            prep.preparationID || ''
 +            prep.cartellaClinica || '', 
 +            comp.glucosio50 || '0.0', 
 +            comp.trophamine || '0.0', 
 +            comp.intralipid || '0.0', 
 +            comp.acquaBidistillata || '0.0', 
 +            comp.elettroliti?.ca_gluconato?.toFixed(1|| '0.0', 
 +            comp.elettroliti?.esafosfina?.toFixed(1) || '0.0', 
 +            comp.elettroliti?.mg_sulfate?.toFixed(1) || '0.0', 
 +            comp.elettroliti?.nacl?.toFixed(1) || '0.0', 
 +            comp.elettroliti?.sodium_acetate?.toFixed(1) || '0.0', 
 +            comp.elettroliti?.kcl?.toFixed(1) || '0.0', 
 +            '0.0', // Vitalipid - calcolato dai residual needs 
 +            '0.0', // Soluvit - calcolato dai residual needs   
 +            '0.0', // Peditrace - calcolato dai residual needs 
 +            '0.0'  // Carnitene - calcolato dai residual needs 
 +        ]; 
 +        data.push(row); 
 +    }); 
 +     
 +    // Aggiungi statistiche componenti 
 +    data.push(['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']); 
 +    data.push(['STATISTICHE COMPONENTI', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']); 
 +    data.push(['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']); 
 +     
 +    // Calcola medie componenti 
 +    const avgGlucose = preparations.reduce((sum, p) => sum + (parseFloat(p.componenti?.glucosio50) || 0), 0) / preparations.length; 
 +    const avgProtein = preparations.reduce((sum, p) => sum + (parseFloat(p.componenti?.trophamine) || 0), 0) / preparations.length; 
 +    const avgLipid = preparations.reduce((sum, p) => sum + (parseFloat(p.componenti?.intralipid) || 0), 0) / preparations.length; 
 +    const avgWater = preparations.reduce((sum, p) => sum + (parseFloat(p.componenti?.acquaBidistillata) || 0), 0) / preparations.length; 
 +     
 +    data.push(['MEDIE COMPONENTI PRINCIPALI', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']); 
 +    data.push(['Glucosio 50% medio:', avgGlucose.toFixed(1), 'ml', '', '', '', '', '', '', '', '', '', '', '', '', '']); 
 +    data.push(['Trophamine medio:', avgProtein.toFixed(1), 'ml', '', '', '', '', '', '', '', '', '', '', '', '', '']); 
 +    data.push(['Intralipid medio:', avgLipid.toFixed(1), 'ml', '', '', '', '', '', '', '', '', '', '', '', '', '']); 
 +    data.push(['Acqua Bid. media:', avgWater.toFixed(1), 'ml', '', '', '', '', '', '', '', '', '', '', '', '', '']); 
 +     
 +    return data; 
 +
 + 
 +// ===================================================== 
 +// SISTEMA KNOWLEDGE BASE 
 +// ===================================================== 
 + 
 +// Funzione per mostrare sezioni Knowledge Base 
 +function showKnowledgeSection(sectionId) { 
 +    // Nascondi tutte le sezioni knowledge 
 +    document.querySelectorAll('.knowledge-section').forEach(section => { 
 +        section.classList.remove('active'); 
 +        section.classList.add('hidden'); 
 +    }); 
 +     
 +    // Rimuovi classe active da tutti i tab knowledge 
 +    const knowledgeTabs = document.querySelectorAll('#knowledge-base .tabs .tab'); 
 +    knowledgeTabs.forEach(tab => { 
 +        tab.classList.remove('active'); 
 +    }); 
 +     
 +    // Mostra la sezione selezionata 
 +    const targetSection = document.getElementById(sectionId); 
 +    if (targetSection) { 
 +        targetSection.classList.remove('hidden'); 
 +        targetSection.classList.add('active');
     }     }
 +    
 +    // Attiva il tab cliccato
 +    const clickedTab = event.target.closest('.tab');
 +    if (clickedTab) {
 +        clickedTab.classList.add('active');
 +    }
 +    
 +    console.log('Knowledge Base: mostrando sezione', sectionId);
 } }
  
-// INIZIALIZZAZIONE +// Database delle regole di calcolo (expandibile) 
-document.addEventListener('DOMContentLoaded'function() { +const knowledgeBase = { 
-    console.log('NPT Calculator v2.0 con BUN Liquidi Monitoring inizializzato');+    calculationRules:
 +        gir: { 
 +            name: "GIR (Glucose Infusion Rate)", 
 +            formula: "(Glucidi g/kg/die × 1000÷ 1440", 
 +            unit: "mg/kg/min", 
 +            normalRange: "4-12", 
 +            alerts: [ 
 +                condition: "> 12", action: "Ridurre concentrazione glucosio", severity: "warning" }, 
 +                { condition: "> 15", action: "Sospendere temporaneamente NPT", severity: "critical"
 +            ], 
 +            rationale: "Il GIR elevato può causare iperglicemia richiede monitoraggio glicemico frequente" 
 +        }, 
 +        osmolarity: { 
 +            name: "Osmolarità NPT", 
 +            formula: "Σ(Volume componente × Osmolarità componente) ÷ Volume totale", 
 +            unit: "mOsm/L", 
 +            thresholds: [ 
 +                { range: "< 600", access: "Periferico possibile", color: "green" }, 
 +                { range: "600-900", access: "CVC raccomandato", color: "orange" }, 
 +                { range: "> 900", access: "Solo CVC (ipertonica)", color: "red"
 +            ], 
 +            rationale: "L'osmolarità determina la via di accesso vascolare per evitare flebiti" 
 +        }, 
 +        proteinAdjustment:
 +            name: "Aggiustamento Proteine (BUN-driven)", 
 +            rules: [ 
 +                { bun: "< 9 mg/dL", action: "Aumenta proteine +1 g/kg/die", rationale: "BUN basso indica catabolismo insufficiente" }, 
 +                { bun: "9-14 mg/dL", action: "Mantieni proteine attuali", rationale: "Range ottimale per neonati" }, 
 +                { bun: "> 14 mg/dL", action: "Riduci proteine -1 g/kg/die", rationale: "BUN elevato indica sovraccarico azotato"
 +            ], 
 +            monitoring: "Controllo BUN ogni 48-72h durante NPT" 
 +        } 
 +    },
          
-    // CARICA CONFIGURAZIONE SALVATA +    clinicalGuidelines: 
-    const configLoaded = loadFromStorage(); +        ageProtocols: { 
-    if (configLoaded) +            elbw: { name: "ELBW ≤1000g", protocols: [] }, 
-        console.log('✅ Configurazione personalizzata caricata dal localStorage'); +            vlbw: { name: "VLBW 1001-1500g", protocols: [] }, 
-        // Aggiorna status +            lbw: name: "LBW 1501-2500g", protocols: [] }, 
-        const statusDiv = document.getElementById('storageStatus'); +            term: { name: "Term >2500g", protocols: [] }
-        if (statusDiv) +
-            statusDiv.innerHTML = '<strong>💾 Configurazione Personalizzata Caricata</strong><br>Le tue modifiche sono state ripristinate automaticamente'; +
-            statusDiv.style.background = '#d4edda';+
         }         }
-    } else +    }
-        console.log('📋 Usando configurazione di default');+     
 +    alerts: 
 +        critical: [], 
 +        warning: [], 
 +        info: []
     }     }
 +};
 +
 +// Funzione per ottenere spiegazione di una regola
 +function getCalculationExplanation(parameter, value) {
 +    const rules = knowledgeBase.calculationRules;
 +    let explanation = "";
 +    
 +    switch(parameter) {
 +        case 'gir':
 +            if (value > 12) {
 +                explanation = "⚠️ GIR elevato: Rischio iperglicemia. Considera riduzione glucosio o aumento velocità.";
 +            } else if (value < 4) {
 +                explanation = "⚠️ GIR basso: Possibile ipoglicemia. Verifica apporti glucidici.";
 +            } else {
 +                explanation = "✅ GIR ottimale: Range di sicurezza per neonati.";
 +            }
 +            break;
 +            
 +        case 'osmolarity':
 +            if (value > 900) {
 +                explanation = "🔴 Osmolarità ipertonica: OBBLIGATORIO accesso venoso centrale.";
 +            } else if (value > 600) {
 +                explanation = "🟠 Osmolarità elevata: Raccomandato accesso venoso centrale.";
 +            } else {
 +                explanation = "🟢 Osmolarità normale: Compatibile con accesso periferico.";
 +            }
 +            break;
 +            
 +        default:
 +            explanation = "Parametro monitorato dal sistema.";
 +    }
 +    
 +    return explanation;
 +}
 +
 +// Funzione per mostrare tooltip informativi
 +function showKnowledgeTooltip(element, content) {
 +    // Crea tooltip dinamico
 +    const tooltip = document.createElement('div');
 +    tooltip.className = 'knowledge-tooltip';
 +    tooltip.innerHTML = content;
 +    tooltip.style.cssText = `
 +        position: absolute;
 +        background-color: #2c3e50;
 +        color: white;
 +        padding: 10px;
 +        border-radius: 5px;
 +        font-size: 12px;
 +        max-width: 300px;
 +        z-index: 1000;
 +        box-shadow: 0 2px 10px rgba(0,0,0,0.3);
 +    `;
 +    
 +    document.body.appendChild(tooltip);
 +    
 +    // Posiziona tooltip
 +    const rect = element.getBoundingClientRect();
 +    tooltip.style.left = rect.left + 'px';
 +    tooltip.style.top = (rect.bottom + 5) + 'px';
 +    
 +    // Rimuovi dopo 3 secondi
 +    setTimeout(() => {
 +        if (tooltip.parentNode) {
 +            tooltip.remove();
 +        }
 +    }, 3000);
 +}
 +
 +// Aggiorna la funzione showTab esistente per gestire il knowledge base
 +function showTabOriginal(tabId) {
 +    // Funzione originale già esistente - non modificare
 +    // Questa è solo per referenza
 +}
 +
 +// INIZIALIZZAZIONE
 +document.addEventListener('DOMContentLoaded', function() {
 +    console.log('NPT Calculator v3.0 UNIFIED inizializzato');
 +    
 +    // Imposta la data odierna come default
 +    const today = new Date().toISOString().split('T')[0];
 +    document.getElementById('prescriptionDate').value = today;
 +    
 +    // Configura il campo cartella clinica
 +    setupMedicalRecordField();
          
     document.getElementById('birthWeight').addEventListener('change', function() {     document.getElementById('birthWeight').addEventListener('change', function() {
Linea 2204: Linea 6393:
     });     });
          
 +    // Event listeners per resettare Fabbisogni e NPT quando si modificano i valori manualmente
 +    const requirementFields = [
 +        'reqLiquids', 'reqProtein', 'reqCarbs', 'reqLipids', 
 +        'reqCalcium', 'reqPhosphorus', 'reqMagnesium', 
 +        'reqSodium', 'reqPotassium', 'reqVitalipid', 'reqSoluvit', 'reqPeditrace', 'reqCarnitine'
 +    ];
 +    
 +    requirementFields.forEach(fieldId => {
 +        const field = document.getElementById(fieldId);
 +        if (field) {
 +            field.addEventListener('input', function() {
 +                resetNutritionButton();
 +            });
 +            field.addEventListener('change', function() {
 +                resetNutritionButton();
 +            });
 +        }
 +    });
 +    
 +    // Event listener per il tipo di sodio
 +    const sodiumTypeSelect = document.getElementById('sodiumType');
 +    if (sodiumTypeSelect) {
 +        sodiumTypeSelect.addEventListener('change', function() {
 +            updateSodiumChoice();
 +            updateSodiumRecommendation();
 +        });
 +    }
 +    
 +    // Event listener per il volume del deflussore
 +    const deflectorVolumeInput = document.getElementById('deflectorVolume');
 +    if (deflectorVolumeInput) {
 +        deflectorVolumeInput.addEventListener('input', function() {
 +            resetParenteralButton();
 +        });
 +    }
 +    
 +    // Inizializza configurazione clinica avanzata
 +    document.getElementById('calciumReq').value = clinicalConfig.calciumReq;
 +    document.getElementById('phosphorusReq').value = clinicalConfig.phosphorusReq;
 +    document.getElementById('magnesiumReq').value = clinicalConfig.magnesiumReq;
 +    document.getElementById('maxGIR').value = clinicalConfig.maxGIR;
 +    document.getElementById('maxLipids').value = clinicalConfig.maxLipids;
 +    document.getElementById('maxProtein').value = clinicalConfig.maxProtein;
 +    document.getElementById('hospitalName').value = clinicalConfig.hospitalName;
 +    document.getElementById('departmentName').value = clinicalConfig.departmentName;
 +    document.getElementById('directorName').value = clinicalConfig.directorName;
 +       
     updateFortifierOptions();     updateFortifierOptions();
-    console.log('NPT Calculator v2.0 pronto - Tab orizzontali funzionanti - Salvataggio persistente attivo');+   // Inizializza tutte le dropdown e tabelle 
 +    updateDoctorsDropdown(); 
 +    console.log('Dropdown medici inizializzata con', Object.keys(doctorsData).length, 'medici'); 
 +    // Test per verificare che la dropdown sia stata popolata 
 +    setTimeout(() => { 
 +        const prescribingDoctorSelect = document.getElementById('prescribingDoctor'); 
 +        if (prescribingDoctorSelect) { 
 +            console.log('Opzioni dropdown medici:', prescribingDoctorSelect.options.length); 
 +        } 
 +    }, 500); 
 + 
 +// Inizializza sezione mensile 
 +    initializeMonthlySection(); 
 +    console.log('NPT Calculator v3.0 UNIFIED pronto');
 }); });
 </script> </script>
docuneo/programma_npt.1753804076.txt.gz · Ultima modifica: da 127.0.0.1