var olay_action, olay_id, tmpVar; //*** APPLICATION FUNCTIONS /*--- * [fnj_selectorExist][Funzione per controllare l'esistenza di un selettore nel DOM] * @version 1.5.0 * @param string fj_selector (ID-CLASS-DATA Selettore) * @return boolean (TRUE/FALSE) ---*/ function fnj_selectorExist(fj_selector) { // Controlla se il selettore è per ID if (fj_selector.startsWith('#')) { return document.getElementById(fj_selector.substring(1)) !== null; } // Controlla se il selettore è per Classe if (fj_selector.startsWith('.')) { return document.getElementsByClassName(fj_selector.substring(1)).length > 0; } // Controlla se il selettore è per attributo data-done-in if (fj_selector.startsWith('[data-done-in')) { return document.querySelector(fj_selector) !== null; } // Se non è un selettore valido, ritorna false return false; } //$***END /*--- * [IsJsonString][Funzione per controllare se una stringa è JSON valido] * @version 1.5.0 * @param string f_str (Stringa da controllare) * @return boolean (TRUE/FALSE) ---*/ function IsJsonString(f_str) { try { JSON.parse(f_str); } catch (e) { return false; } return true; } //$***END //*** COPY/CUT/PAST /*--- // * [copyText][Funzione di copia negli appunti] // * @version 1.5.0 // * @param string f_targetId (ID Selettore che contiene il testo da copiare) // * @return boolean (TRUE/FALSE) ---*/ async function copyText(f_targetId) { const target = document.getElementById(f_targetId); if (!target) { console.error('Target not found'); return; } let text = ''; if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') { text = target.value; } else { text = target.innerText; } try { await navigator.clipboard.writeText(text); } catch (err) { console.error('Failed to copy: ', err); } } //$***END /*--- * [cutText][Funzione di taglia negli appunti] * @version 1.5.0 * @param string f_targetId (ID Selettore che contiene il testo da copiare) * @return boolean (TRUE/FALSE) ---*/ async function cutText(f_targetId) { const target = document.getElementById(f_targetId); if (!target) { console.error('Target not found'); return; } let text = ''; if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') { text = target.value; target.value = ''; } else { text = target.innerText; target.innerText = ''; } try { await navigator.clipboard.writeText(text); alert('Tagliato'); } catch (err) { console.error('Failed to cut: ', err); } } //$***END /*--- * [pasteText][Funzione incollare dagli appunti] * @version 1.5.0 * @param string f_targetId (ID Selettore incollare il testo) * @return boolean (TRUE/FALSE) ---*/ async function pasteText(f_targetId) { const target = document.getElementById(f_targetId); if (!target) { console.error('Target not found'); return; } try { const text = await navigator.clipboard.readText(); if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') { target.value = text; } else { target.innerText = text; } } catch (err) { console.error('Failed to paste: ', err); } } //$***END //*** OVERLAY PANE //localStorage.removeItem('overlayPaneState'); // Apre il pannello OVERLAY PANE function openOverlayPane(f_color_master) { var container = $('#cuba_olay_pane_container'); // Apri il pannello container.css('display', 'block').addClass('active'); // Cambia il colore di background container.find('.cuba_olay_header') .removeClass('bg-primary bg-info bg-warning') .addClass(f_color_master); } //*** Javascript Form & Validation //*** Validazione della mail function validateEmail(email) { const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return re.test(String(email).toLowerCase()); } //*** Sanitize del campo - Metodo tradizionale function sanitizeInput(input) { // Sanifica l'input rimuovendo potenziali script e tag HTML const element = document.createElement('div'); element.innerText = input; return element.innerHTML; } //*** Sanitize del campo - Metodo DOMPurify function domSanitizeInput(input) { return DOMPurify.sanitize(input); } //*** Visualizzazione campo password function togglePasswordVisibility(triggerId, inputId) { const trigger = document.getElementById(triggerId); const passwordInput = document.getElementById(inputId); const confirmPasswordInput = document.getElementById('confirm-password'); const icons = trigger.querySelectorAll('i'); if (passwordInput.type === 'password') { passwordInput.type = 'text'; icons[0].classList.add('d-none'); icons[1].classList.remove('d-none'); if (confirmPasswordInput) { confirmPasswordInput.type = 'text'; } } else { passwordInput.type = 'password'; icons[0].classList.remove('d-none'); icons[1].classList.add('d-none'); if (confirmPasswordInput) { confirmPasswordInput.type = 'password'; } } } //*** Controllo della consistenza password function checkPasswordStrength() { const passwordInput = document.getElementById('password'); const password = passwordInput.value; const meter = document.querySelectorAll('[data-kt-password-meter-control="highlight"] > div'); const txtPassStrong = document.getElementById('txt_pass_strong'); const validChars = /^[a-zA-Z0-9&$£\-_.]*$/; let strength = 0; // Check for invalid characters if (!validChars.test(password)) { Swal.fire({ text: "La password contiene caratteri non validi. Sono ammessi solo a-z, A-Z, 0-9 e i seguenti simboli: & $ £ - _ .", icon: "error", buttonsStyling: !1, confirmButtonText: "Ok, Capito!", customClass: { confirmButton: "btn btn-primary" }, }); // Remove invalid character passwordInput.value = password.replace(/[^a-zA-Z0-9&$£\-_.]/g, ''); return; } if (password.length >= 8 && password.length <= 16) strength++; if (/[a-z]/.test(password)) strength++; if (/[A-Z]/.test(password)) strength++; if (/[0-9]/.test(password)) strength++; if (/[\W_]/.test(password)) strength++; // Set the meter only if at least 2 criteria are met const visibleStrength = Math.max(0, strength - 1); meter.forEach((bar, index) => { if (index < visibleStrength) { bar.classList.add('active'); } else { bar.classList.remove('active'); } }); // Update the password strength text using lang_text let strengthText = ''; switch (visibleStrength) { case 0: strengthText = "Password troppo debole"; break; case 1: strengthText = "Password molto debole"; break; case 2: strengthText = "Password media"; break; case 3: strengthText = "Password forte"; break; case 4: strengthText = "Password molto forte"; break; } txtPassStrong.textContent = strengthText; } //*** Controllo delle due password function validatePasswordsMatch() { const password = document.getElementById('password').value; const confirmPassword = document.getElementById('confirm-password').value; if (password !== confirmPassword) { document.getElementById('confirm-password').classList.add('is-invalid'); Swal.fire({ text: "Le due password non sono uguali", icon: "error", buttonsStyling: !1, confirmButtonText: "Ok, Capito!", customClass: { confirmButton: "btn btn-primary" }, }); } else { document.getElementById('confirm-password').classList.remove('is-invalid'); } } $(document).ready(function() { // Nasconde il pane fino a quando il DOM è completamente caricato OVERLAY PANE $(window).on('load', function() { $('#cuba_olay_pane_container').css('display', 'none'); }); // Gestisce la chiusura del pannello OVERLAY PANE $('#cuba_olay_headerIconClose').on('click', function() { $('#cuba_olay_pane_container').css('display', 'none').removeClass('active'); }); // Gestisce l'arrotolamento del pannello OVERLAY PANE $('#cuba_olay_headerIconRoll').on('click', function() { var container = $('#cuba_olay_pane_container'); var rollIcon = $('#cuba_olay_headerIconRoll'); if (container.hasClass('rolled')) { container.removeClass('rolled'); rollIcon.removeClass('ki-eye-slash').addClass('ki-eye'); } else { container.addClass('rolled'); rollIcon.removeClass('ki-eye').addClass('ki-eye-slash'); } }); // Gestisce la minimizzazione del pannello OVERLAY PANE $('#cuba_olay_headerIconPin').on('click', function() { var container = $('#cuba_olay_pane_container'); if (container.hasClass('minimized')) { container.removeClass('minimized'); } else { container.addClass('minimized'); } }); // Assegna il trigger del menu HEADER Proprietà $('#triggerOverlayPane').on('click', function() { openOverlayPane('bg-primary'); }); // Gestisce il caricamento dei dettagli Socio/Memebers tramite AJAX [_overlay_pane.php][router-manager-data.php] $(document).on('click', '.overlay-pane-trigger', function() { olay_action = $(this).data('olay-action'); olay_id = $(this).data('olay-id'); // console.log(olay_action + " ::: " + olay_id); openOverlayPane('bg-primary'); // Dati generici aggiuntivi con valori di default var additionalData = { additional_param: $('#hidden_input').val() || 'default_value' // Default se l'input non esiste o è vuoto }; // Dati dinamici var data = { action_105: olay_action, id_olay: olay_id }; // Unisci i dati dinamici con i dati aggiuntivi e serializza var serializedData = $.param($.extend(data, additionalData)); $.ajax({ url: 'routers/router-manager-data.php', method: 'POST', data: serializedData, success: function(response) { if (response.status === 'success') { $('#cuba_olay_pane_container .cuba_olay_body').html(response.message); $('#cuba_olay_pane_container').css('display', 'block').addClass('active'); } else if (response.status === 'error') { // Gestione degli errori Swal.fire({ icon: 'error', title: 'Error', text: response.message, }); } else { Swal.fire({ icon: 'error', title: 'Error', text: 'Formato di risposta non valido', }); } }, error: function(xhr, status, error) { // Gestione degli errori di richiesta Swal.fire({ icon: 'error', title: 'Error', text: 'An error occurred while processing your request.', }); } }); }); });