//Main admin JS file $(function () { jQuery.validator.addMethod("noSpace", function (value, element) { return value.indexOf(" ") < 0 && value != ""; }, "Space are not allowed"); jQuery.validator.addMethod("invalidUsername", function (value, element) { return value != "" && value.toUpperCase() != "ROOT" && value.toUpperCase() != "ADMIN"; }, "Invalid username"); jQuery.validator.addMethod("numericField", function (value, element) { var myregExp = /^\d*[0-9](|.\d*[0-9]|,\d*[0-9])?$/; return value == "" || (value != "" && myregExp.test(value)); }, "Invalid number"); jQuery.validator.addMethod("requiredTinyMCE", function (value, element) { return tinyMCE.get($(element).attr('id')).getContent() != ''; }, "Required"); var csfrtok = $('#csfrtok').val(); $.ajax({ url: $('#base_url').val() + "/ajax/get_last_cookie_key", type: 'POST', data: 'lang=' + lang + '&csfrtok=' + csfrtok, success: function (data) { var actual_key = data; var cookie_url = $('#base_url').val() + "cookie"; $.cookieBar({ message: "Cookies are used to improve the services we offer and to optimize the user experience. To learn more, please visit the cookie policy.
By closing this banner or continuing to browse the site, you consent to the use of cookies.

", acceptText: "Ok, close banner", policyURL: cookie_url, cookieName: actual_key }); } }); /*aggiungi ombra sotto header allo scroll*/ $(window).scroll(function () { var wScroll = $(this).scrollTop(); if (wScroll == 0) { $(".header_container_main").css({ "box-shadow": "none" }); } else { $(".header_container_main").css({ "box-shadow": "0px 0px 2px #666" }); } }); $("img.lazy").lazyload({ effect: "fadeIn", skip_invisible: false }); $("div.lazy").lazyload({ effect: "fadeIn" }); setLang('', 0); $('#lang_switcher').bind('click', function (e) { e.preventDefault(); setLang($(this).data('lang'), 1); }); //fa apparire i filtri $('#js_show_activation_container').bind('click', function (e) { // e.preventDefault(); if ($('.js_show_act_container').css('display') == 'none') { $('.js_show_act_container').fadeIn(); $('#js_show_activation_container_i').removeClass('fal fa-angle-right').addClass('fal fa-angle-up'); } else { $('.js_show_act_container').fadeOut(); $('#js_show_activation_container_i').removeClass('fal fa-angle-up').addClass('fal fa-angle-right'); } }); var genericForm = 1; /****MENU MOBILE***/ if ($('#menu_laterale').length > 0) { $('.menu_btn').bind('click', function (e) { e.preventDefault(); if (!$('#menu_laterale').hasClass('open')) { $('#menu_laterale').animate({ 'right': '0' }, 500, function () { $('#menu_laterale').addClass('open'); }); $('body').prepend('
'); $('#sfondo').bind('click', function () { $('#sfondo').remove(); if ($('#menu_laterale').hasClass('open')) { $('#menu_laterale').animate({ 'right': '-270px' }, 500, function () { $('#menu_laterale').removeClass('open'); }); } }); } else { $('#sfondo').remove(); if ($('#menu_laterale').hasClass('open')) { $('#menu_laterale').animate({ 'right': '-270px' }, 500, function () { $('#menu_laterale').removeClass('open'); }); } } }); } /*** FILE DETAIL****/ if ($('#js_file_detail_container').length) { // Metodo diretto con form dinamico via POST function downloadMethod(slug, csfrtok,kind) { var method="download_file"; if(kind==2){ method="download_timestamp"; } else if(kind==3){ method="download_sign"; } var form = $('
', { 'action': $('#base_url').val() + 'ajax/'+method, 'method': 'POST' }); form.append($('', { 'name': 'slug', 'value': slug, 'type': 'hidden' })); form.append($('', { 'name': 'csfrtok', 'value': csfrtok, 'type': 'hidden' })); $('body').append(form); form.submit(); form.remove(); } $('#js_download_file').bind('click', function (e) { e.preventDefault(); var slug = $('#js_download_file').data('slug'); var csfrtok = $('#csfrtok').val(); downloadMethod(slug, csfrtok,1); }); $('#js_download_timestamp').bind('click', function (e) { e.preventDefault(); var slug = $('#js_download_timestamp').data('slug'); var csfrtok = $('#csfrtok').val(); downloadMethod(slug, csfrtok,2); }); $('#js_download_signed').bind('click', function (e) { e.preventDefault(); var slug = $('#js_download_signed').data('slug'); var csfrtok = $('#csfrtok').val(); downloadMethod(slug, csfrtok,3); }); $('#js_elimina_file').bind('click', function (e) { e.preventDefault(); if(confirm("Sei sicuro di volere eliminare il file? Con esso verranno eliminate anche le condivisioni")){ var slug = $('#js_download_file').data('slug'); var csfrtok = $('#csfrtok').val(); $.ajax({ url: $('#base_url').val() + '/ajax/elimina_file', method: 'POST', data: 'csfrtok=' + csfrtok + "&slug=" + slug, dataType: 'json', success: function (data) { if(data==1){ alert("Eliminazione completata"); var redirecturl=$('#base_url').val() + "/user/files"; document.location.href = redirecturl; } else { alert("Si è verificato un errore durante l\'eliminazione"); } } }); } }); $('#js_elimina_condivisione').bind('click', function (e) { e.preventDefault(); if(confirm("Sei sicuro di volere procedere? L'utente a cui hai condiviso il file non potrà più vederlo.")){ var slug = $('#js_elimina_condivisione').data('slug'); var cod_fiscale = $('#js_elimina_condivisione').data('cod_fiscale'); var csfrtok = $('#csfrtok').val(); $.ajax({ url: $('#base_url').val() + '/ajax/elimina_condivisione', method: 'POST', data: 'csfrtok=' + csfrtok + "&slug=" + slug+ "&cod_fiscale=" + cod_fiscale, dataType: 'json', success: function (data) { if(data==1){ alert("Eliminazione completata"); var redirecturl=$('#base_url').val() + "/user/file_detail/"+slug; document.location.href = redirecturl; } else { alert("Si è verificato un errore durante l\'eliminazione"); } } }); } }); // Aggiunge un metodo per verificare che il valore sia diverso da un altro selettore $.validator.addMethod("notEqualTo", function (value, element, param) { return this.optional(element) || value !== $(param).val(); }, "Codice fiscale non valido"); // Aggiunge il metodo di validazione per il Codice Fiscale italiano $.validator.addMethod("codiceFiscale", function (value, element) { // Accetta sia il codice fiscale standard che il formato SPID con prefisso TINIT- var regExp = /^(?:TINIT-)?[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]$/i; return this.optional(element) || regExp.test(value); }, "Codice fiscale non valido"); $('#condividi_con').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { cod_fiscale: { required: true, codiceFiscale: true, notEqualTo: '#js_my_cf' // Controlla che sia diverso dal campo hidden } }, messages: { cod_fiscale: { required: "Codice fiscale non valido", codiceFiscale: "Codice fiscale non valido", notEqualTo: "Codice fiscale non valido" } } }); } /*** SHARE DETAIL****/ if ($('#js_share_detail_container').length) { $('#js_download_file').bind('click', async function (e) { e.preventDefault(); const { publicKey, secretKey } = noblePostQuantum.ml_kem768.keygen(); //const passphrase = prompt('Scegli una passphrase per proteggere la chiave:'); const passphrase = '--------'; const encrypted = await encryptSecretKey(secretKey, passphrase); await saveEncryptedKey(encrypted); // console.log('Public key (puoi salvarla in chiaro):', publicKey); // console.log('Secret key cifrata e salvata in IndexedDB.'); // CONVERTI LA CHIAVE IN BASE64 QUI const publicKeyBase64 = uint8ArrayToBase64(publicKey); var slug = $('#js_download_file').data('slug'); var csfrtok = $('#csfrtok').val(); $.ajax({ url: $('#base_url').val() + '/ajax/encrypt_public', method: 'POST', data: JSON.stringify({ csfrtok: csfrtok, slug: slug, pubkey: publicKeyBase64 }), dataType: 'json', contentType: 'application/json', // Fondamentale per proteggere il Base64 success: async function (data) { if (data.status === 1) { try { //console.log('Dati ricevuti dal server, avvio il download e decifrazione...'); // 1. Recupera la secret key cifrata da IndexedDB e decriptala con la passphrase const encryptedSavedData = await getEncryptedKey(); //const passphrase = prompt('Inserisci la passphrase per sbloccare la tua chiave privata:'); const passphrase = '--------'; const secretKey = await decryptSecretKey(encryptedSavedData, passphrase); // 2. Converte il kemCiphertext da Base64 in Uint8Array (supporta sia snake_case che camelCase) const kemCiphertextBase64 = data.kem_ciphertext || data.kemCiphertext; const kemCiphertextBytes = base64ToBytes(kemCiphertextBase64); // Esegue il decapsulate con la chiave privata ML-KEM per ottenere la shared secret const sharedSecret = noblePostQuantum.ml_kem768.decapsulate(kemCiphertextBytes, secretKey); // 3. Deriva la wrap_key tramite SHA-256 (replicando la logica del wrapper C) const wrapKeyBytes = await deriveWrapKey(sharedSecret); const wrapKey = await window.crypto.subtle.importKey( "raw", wrapKeyBytes, { name: "AES-GCM" }, false, ["decrypt"] ); // 4. Decifra la wrapped_key per ricavare la vera DEK (32 byte) // IMPORTANTE: il C cifra la DEK usando come AAD la stringa WRAP_CONTEXT // (+ eventuale AAD custom, se presente lato PHP). Va replicato qui. const WRAP_CONTEXT = "PQKEM-WRAP-001|ML-KEM-768|AES-256-GCM"; const wrapAad = new TextEncoder().encode(WRAP_CONTEXT); const wrappedKeyBase64 = data.wrapped_key || data.wrappedKey; const wrappedKeyBytes = base64ToBytes(wrappedKeyBase64); const ivBytes = base64ToBytes(data.iv); const tagBytes = base64ToBytes(data.tag); const cipherWithTag = new Uint8Array(wrappedKeyBytes.length + tagBytes.length); cipherWithTag.set(wrappedKeyBytes, 0); cipherWithTag.set(tagBytes, wrappedKeyBytes.length); const dekBytesRaw = await window.crypto.subtle.decrypt( { name: "AES-GCM", iv: ivBytes, additionalData: wrapAad, tagLength: 128 }, wrapKey, cipherWithTag ); // Importa la DEK reale in formato CryptoKey per l'AES-GCM del browser const dek = await window.crypto.subtle.importKey( "raw", dekBytesRaw, { name: "AES-GCM" }, false, ["decrypt"] ); // 5. Scarica il file cifrato dall'URL const response = await fetch(data.file_url); const encryptedFileBuffer = new Uint8Array(await response.arrayBuffer()); // 6. Il file .enc prodotto dal wrapper C ha questo formato: // [0:8] magic "PQENC002" // [8:16] plaintext size (uint64 big-endian) // [16:28] IV del file (12 byte) <-- IV VERO, diverso da quello del wrap // [28:N] ciphertext // [N:N+16] tag GCM finale // L'AES-GCM del file autentica come AAD i primi 16 byte dell'header // (magic + size). Vanno quindi estratti header, IV e ciphertext+tag. const HEADER_SIZE = 28; const headerAad = encryptedFileBuffer.slice(0, 16); // magic + plaintext size const fileIv = encryptedFileBuffer.slice(16, HEADER_SIZE); // IV specifico del file const cipherAndTag = encryptedFileBuffer.slice(HEADER_SIZE); // ciphertext + tag GCM // 7. Decripta il file con la DEK, l'IV reale del file e l'AAD dell'header const decryptedContent = await window.crypto.subtle.decrypt( { name: "AES-GCM", iv: fileIv, additionalData: headerAad, tagLength: 128 }, dek, cipherAndTag ); // 8. Avvia il download automatico del file chiaro downloadBlob(decryptedContent, data.file_decrypted_name); //console.log('File decriptato e scaricato con successo!'); // 9. La coppia di chiavi è mono-uso: elimina la secret key da IndexedDB await deleteEncryptedKey(); // console.log('Secret key eliminata da IndexedDB.'); } catch (error) { //console.error('Errore durante il processo di decifratura:', error); alert('Errore durante il processo di decifratura'); } } else { alert('Errore dal server durante la generazione dei dati.'); } } }); }); // Metodo diretto con form dinamico via POST function downloadMethod(slug, csfrtok,kind) { var method="download_timestamp"; if(kind==3){ method="download_sign"; } var form = $('', { 'action': $('#base_url').val() + 'ajax/'+method, 'method': 'POST' }); form.append($('', { 'name': 'slug', 'value': slug, 'type': 'hidden' })); form.append($('', { 'name': 'csfrtok', 'value': csfrtok, 'type': 'hidden' })); $('body').append(form); form.submit(); form.remove(); } $('#js_download_timestamp').bind('click', function (e) { e.preventDefault(); var slug = $('#js_download_timestamp').data('slug'); var csfrtok = $('#csfrtok').val(); downloadMethod(slug, csfrtok,2); }); $('#js_download_signed').bind('click', function (e) { e.preventDefault(); var slug = $('#js_download_signed').data('slug'); var csfrtok = $('#csfrtok').val(); downloadMethod(slug, csfrtok,3); }); $('#js_elimina_condivisione').bind('click', function (e) { e.preventDefault(); var slug = $('#js_elimina_condivisione').data('slug'); var csfrtok = $('#csfrtok').val(); $.ajax({ url: $('#base_url').val() + '/ajax/elimina_condivisione_from_child', method: 'POST', data: 'csfrtok=' + csfrtok+"&slug="+slug, dataType: 'json', success: function(data) { if(data==1) { //redirect to utente dettaglio var redirecturl=$('#base_url').val() + "/user/shared_with_you"; document.location.href = redirecturl; //redirect to utente dettaglio } else { alert('Attenzione si è verificato un errore'); } } }); }); } /***HOME***/ if ($('.js_home_block').length) { $('#recupera').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { email_recupero: { email: true, required: true } }, messages: { email_recupero: { required: "Enter a valid email address", email: "Enter a valid email address", }, }, submitHandler: function (form) { $('#js_form_recupero_container').hide(); $('#js_recupero_loader_container').show(); setTimeout( function () { form.submit(); }, 1000); } }); $('#js_chiudi_from_result').bind('click', function (e) { e.preventDefault(); $('#js_form_recupero_container').show(); $('#js_recupero_loader_container').hide(); $('#js_recupero_result_container').hide(); }); $('#show_password_form').bind('click', function (e) { e.preventDefault(); $('#login_form').fadeOut(0); $('#recupera_password').fadeIn(); }); $('#hide_password_form').bind('click', function (e) { e.preventDefault(); $('#recupera_password').fadeOut(0); $('#login_form').fadeIn(); }); $('#show_recupero_error').bind('click', function (e) { e.preventDefault(); $('#recupero_error').fadeIn(); }); $('#hide_recupero_error').bind('keyup', function (e) { e.preventDefault(); $('#recupero_error').fadeOut(); }); $('#js_eye_toogle_password').bind('click', function (e) { e.preventDefault(); $(this).toggleClass("fa-eye fa-eye-slash"); var input = $("#js_password"); if (input.attr("type") === "password") { input.attr("type", "text"); } else { input.attr("type", "password"); } }); $.validator.addMethod( "regex", function (value, element, regexp) { var check = false; return this.optional(element) || regexp.test(value); }, "Please check your input." ); $('#js_open_registrazione').bind('click', function (e) { e.preventDefault(); $('#login_form').hide(); $('#js_form_registrazione').fadeIn(); }); $('#js_close_registrazione').bind('click', function (e) { e.preventDefault(); $('#js_form_registrazione').hide(); $('#login_form').fadeIn(); }); function hasNumber(myString) { return /\d/.test(myString); } $('#password_registrazione').on('input', function (e) { var actual_pass = $('#password_registrazione').val(); var upperCase = new RegExp('[A-Z]'); var lowerCase = new RegExp('[a-z]'); if (actual_pass.match(upperCase)) { $('#js_pwd_val_upper').css('color', 'green'); } else { $('#js_pwd_val_upper').css('color', '#ccc'); } if (actual_pass.match(lowerCase)) { $('#js_pwd_val_lower').css('color', 'green'); } else { $('#js_pwd_val_lower').css('color', '#ccc'); } if (hasNumber(actual_pass)) { $('#js_pwd_val_num').css('color', 'green'); } else { $('#js_pwd_val_num').css('color', '#ccc'); } if (actual_pass.length >= 8) { $('#js_pwd_val_otchr').css('color', 'green'); } else { $('#js_pwd_val_otchr').css('color', '#ccc'); } }); $('#registrazione_form').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { email_registrazione: { remote: { url: $('#base_url').val() + "/ajax/check_email", type: "post", data: { email: function () { return $('#registrazione_form').find("#email_registrazione").val(); }, id: function () { return 0; }, csfrtok: function () { return $("#csfrtok").val(); } } }, email: true, required: true }, password_registrazione: { regex: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[^\s]{8,}$/, minlength: 8, required: true }, conferma_password_registrazione: { minlength: 8, equalTo: "#password_registrazione" }, privacy_policy_check: { required: true } }, messages: { email_registrazione: { remote: "Email address already in use", email: "Enter a valid email address", required: "Enter a valid email address" }, password_registrazione: { regex: "Enter a password of at least 8 characters containing at least one number and at least one capital letter", required: "Enter a password of at least 8 characters containing at least one number and at least one capital letter", minlength: "Enter a password of at least 8 characters containing at least one number and at least one capital letter", maxlength: "Enter a password of at least 8 characters containing at least one number and at least one capital letter" }, conferma_password_registrazione: { equalTo: "passwords do not match", minlength: "passwords do not match", maxlength: "passwords do not match" }, privacy_policy_check: { required: "Warning, in order to register you must have read the privacy policy and consent to the processing of your data." }, } }); } /****registrazione****/ if ($('#registrazione_container').length > 0) { $('.recupera_link').bind('click', function (e) { e.preventDefault(); $('#password_container').fadeIn(); }); $('.recupera_chiudi_btn').bind('click', function (e) { e.preventDefault(); $('#password_container').fadeOut(); }); $('#reg').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { reg_email: { remote: { url: $('#base_url').val() + "/ajax/check_email", type: "post", data: { email: function () { return $('#reg').find("#reg_email").val(); }, id: function () { return 0; }, csfrtok: function () { return $("#csfrtok").val(); } } }, email: true, required: true }, privacy_policy_check: { required: true } }, messages: { reg_email: { remote: "[registrazione_mail_in_uso]", email: "[registrazione_mail_non_valida]", required: "[registrazione_mail_non_valida]" }, privacy_policy_check: { required: "Warning, in order to register you must have read the privacy policy and consent to the processing of your data." } } }); } if ($('#js_2fa').length > 0) { // Verify OTP $('#verify-form').on('submit', function(e) { e.preventDefault(); var otp = $('#otp').val(); var csfrtok = $('#csfrtok').val(); if(!otp) { alert('You must insert an OTP code'); return false; } $.ajax({ url: $('#base_url').val() + '/ajax/verificaotp', method: 'POST', data: 'csfrtok=' + csfrtok+"&otp="+otp, dataType: 'json', success: function(data) { if(data.result) { //redirect to utente dettaglio var redirecturl=$('#base_url').val() + "/user/dashboard"; document.location.href = redirecturl; //redirect to utente dettaglio } else { alert('Not valid OTP code'); } } }); }); // Verify email code $('#verify-form-email').on('submit', function(e) { e.preventDefault(); var otp = $('#otp_email').val(); var csfrtok = $('#csfrtok').val(); if(!otp) { alert('Enter the code received by email'); return false; } $.ajax({ url: $('#base_url').val() + '/ajax/verificaotpemail', method: 'POST', data: 'csfrtok=' + csfrtok+"&otp="+otp, dataType: 'json', success: function(data) { if(data==1) { //alert('OTP is successfully verified! with provided key: ' + data.provided_otp); //redirect to utente dettaglio var redirecturl=$('#base_url').val() + "/user/dashboard"; document.location.href = redirecturl; //redirect to utente dettaglio } else { alert('Codice non valido, inserisci un altro codice.'); } } }); }); $("#js_generaqr").bind('click', function (e) { e.preventDefault(); var csfrtok = $('#csfrtok').val(); $.ajax({ type: "POST", url: $('#base_url').val() + "/ajax/attiva_qr", data: 'csfrtok=' + csfrtok, success: function (data) { var base64data="data:image/png;base64,"+data; $("#js_qrcode_img").attr("src",base64data); $('#js_generaqr').hide(); $('#verify-form').show(); } }); }); $("#js_invia_2fa_btn").bind('click', function (e) { e.preventDefault(); var csfrtok = $('#csfrtok').val(); $.ajax({ type: "POST", url: $('#base_url').val() + "/ajax/invia_email_2fa", data: 'csfrtok=' + csfrtok, success: function (data) { if(data==1){ $('#verify-form-email').show(); alert("The code has been sent, it will be valid for 5 minutes. Enter it in the appropriate field before it expires."); } } }); }); } if ($('#js_qrcoderegen').length > 0) { $("#js_generaqr").bind('click', function (e) { e.preventDefault(); var csfrtok = $('#csfrtok').val(); var r = confirm("Are you sure you want to generate a QR?"); if (r == true) { $.ajax({ type: "POST", url: $('#base_url').val() + "/ajax/attiva_qr", data: 'csfrtok=' + csfrtok, success: function (data) { var base64data="data:image/png;base64,"+data; $("#js_qrcode_img").attr("src",base64data); $('#js_generaqr').hide(); } }); } }); } if ($('#cambia_email').length > 0) { $('#cambia_email').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { email: { remote: { url: $('#base_url').val() + "/ajax/check_email", type: "post", data: { email: function () { return $("#email").val(); }, id: function () { return $("#utente_id").val(); }, csfrtok: function () { return $("#csfrtok").val(); } } }, email: true, required: true } }, messages: { email: { remote: "Email address already in use", email: "Please enter a valid email address", required: "Please enter a valid email address" } } }); } if ($('#cambia_password').length > 0) { function hasNumber(myString) { return /\d/.test(myString); } $('#password').on('input', function (e) { var actual_pass = $('#password').val(); var upperCase = new RegExp('[A-Z]'); var lowerCase = new RegExp('[a-z]'); if (actual_pass.match(upperCase)) { $('#js_pwd_val_upper').css('color', 'green'); } else { $('#js_pwd_val_upper').css('color', '#ccc'); } if (actual_pass.match(lowerCase)) { $('#js_pwd_val_lower').css('color', 'green'); } else { $('#js_pwd_val_lower').css('color', '#ccc'); } if (hasNumber(actual_pass)) { $('#js_pwd_val_num').css('color', 'green'); } else { $('#js_pwd_val_num').css('color', '#ccc'); } if (actual_pass.length >= 8) { $('#js_pwd_val_otchr').css('color', 'green'); } else { $('#js_pwd_val_otchr').css('color', '#ccc'); } }); $('#js_eye_toogle_password_corrente').bind('click', function (e) { e.preventDefault(); $(this).toggleClass("fa-eye fa-eye-slash"); var input = $("#conferma_password"); if (input.attr("type") === "password") { input.attr("type", "text"); } else { input.attr("type", "password"); } }); $('#js_eye_toogle_password').bind('click', function (e) { e.preventDefault(); $(this).toggleClass("fa-eye fa-eye-slash"); var input = $("#password"); if (input.attr("type") === "password") { input.attr("type", "text"); } else { input.attr("type", "password"); } }); $('#js_eye_toogle_password_conferma').bind('click', function (e) { e.preventDefault(); $(this).toggleClass("fa-eye fa-eye-slash"); var input = $("#conferma_password"); if (input.attr("type") === "password") { input.attr("type", "text"); } else { input.attr("type", "password"); } }); $.validator.addMethod( "regex", function (value, element, regexp) { var check = false; return this.optional(element) || regexp.test(value); }, "Please check your input." ); $('#cambia_password').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { password_corrente: { remote: { url: $('#base_url').val() + "/ajax/check_old_password", type: "post", data: { password_corrente: function () { return $("#password_corrente").val(); }, csfrtok: function () { return $("#csfrtok").val(); } } }, required: true }, password: { regex: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[^\s]{8,}$/, minlength: 8, required: true }, conferma_password: { minlength: 8, equalTo: "#password", required: true } }, messages: { password_corrente: { remote: "Incorrect password", required: "Enter your current password", }, password: { remote: "Incorrect password", regex: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", required: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", minlength: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", maxlength: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter" }, conferma_password: { required: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", equalTo: "Passwords do not match", minlength: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", maxlength: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter" } } }); } if ($('#recupera_password_page').length > 0) { function hasNumber(myString) { return /\d/.test(myString); } $('#password').on('input', function (e) { var actual_pass = $('#password').val(); var upperCase = new RegExp('[A-Z]'); var lowerCase = new RegExp('[a-z]'); if (actual_pass.match(upperCase)) { $('#js_pwd_val_upper').css('color', 'green'); } else { $('#js_pwd_val_upper').css('color', '#ccc'); } if (actual_pass.match(lowerCase)) { $('#js_pwd_val_lower').css('color', 'green'); } else { $('#js_pwd_val_lower').css('color', '#ccc'); } if (hasNumber(actual_pass)) { $('#js_pwd_val_num').css('color', 'green'); } else { $('#js_pwd_val_num').css('color', '#ccc'); } if (actual_pass.length >= 8) { $('#js_pwd_val_otchr').css('color', 'green'); } else { $('#js_pwd_val_otchr').css('color', '#ccc'); } }); $.validator.addMethod( "regex", function (value, element, regexp) { var check = false; return this.optional(element) || regexp.test(value); }, "Please check your input." ); $('#recupera_password').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { password: { regex: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[^\s]{8,}$/, minlength: 8, required: true }, conferma_password: { minlength: 8, equalTo: "#password", required: true } }, messages: { password: { regex: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", required: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", minlength: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", }, conferma_password: { required: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", equalTo: "Passwords do not match", minlength: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", } } }); } if ($('#nuova_password_page').length > 0) { function hasNumber(myString) { return /\d/.test(myString); } $('#password').on('input', function (e) { var actual_pass = $('#password').val(); var upperCase = new RegExp('[A-Z]'); var lowerCase = new RegExp('[a-z]'); if (actual_pass.match(upperCase)) { $('#js_pwd_val_upper').css('color', 'green'); } else { $('#js_pwd_val_upper').css('color', '#ccc'); } if (actual_pass.match(lowerCase)) { $('#js_pwd_val_lower').css('color', 'green'); } else { $('#js_pwd_val_lower').css('color', '#ccc'); } if (hasNumber(actual_pass)) { $('#js_pwd_val_num').css('color', 'green'); } else { $('#js_pwd_val_num').css('color', '#ccc'); } if (actual_pass.length >= 8) { $('#js_pwd_val_otchr').css('color', 'green'); } else { $('#js_pwd_val_otchr').css('color', '#ccc'); } }); $.validator.addMethod( "regex", function (value, element, regexp) { var check = false; return this.optional(element) || regexp.test(value); }, "Please check your input." ); $('#nuova_password').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { password: { regex: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[^\s]{8,}$/, minlength: 8, //maxlength : 12, required: true }, conferma_password: { minlength: 8, //maxlength : 12, equalTo: "#password", required: true } }, messages: { password: { regex: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", required: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", minlength: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", }, conferma_password: { required: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", equalTo: "Passwords do not match", minlength: "Enter a password without spaces, at least 8 characters long, containing at least one number, one lowercase and one uppercase letter", } } }); } if ($('#mod_dati_container').length > 0) { $('#modifica_dati').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { nome: { alphanumeric: true, required: true }, cognome: { alphanumeric: true, required: true }, pseudonimo: { remote: { url: $('#base_url').val() + "/ajax/check_pseudonimo", type: "post", data: { pseudonimo: function () { return $("#pseudonimo").val(); }, csfrtok: function () { return $("#csfrtok").val(); } } }, required: true, minlength: 3, maxlength: 15, alphanumeric: true }, cf: { required: true, minlength: 16, maxlength: 16 }, piva: { required: true }, indirizzo: { required: true }, ragione_sociale: { required: true } }, messages: { nome: { required: "Enter your name", alphanumeric: "Special characters cannot be used" }, cognome: { required: "Enter your surname", alphanumeric: "Special characters cannot be used" }, pseudonimo: { required: "Enter a name", remote: "This name is already in use, choose another one", minlength: "The name must be between 3 and 15 characters long", maxlength: "The name must be between 3 and 15 characters long", alphanumeric: "Special characters cannot be used" }, cf: { required: "Enter your tax code", minlength: "The tax code must be 16 characters long", maxlength: "The tax code must be 16 characters long" }, piva: { required: "Enter the VAT number or tax code (in case of sole proprietorship)" }, indirizzo: { required: "Enter the address" }, ragione_sociale: { required: "Enter the company name" } } }); $('input[type=radio][name=tipo]').change(function () { var type = this.value; switchType(type); }); function switchType(type) { if (type == 1) { $('#dati_giuridica').find('input').attr('disabled', 'disabled'); $('#dati_giuridica').find('textarea').attr('disabled', 'disabled'); $('#dati_giuridica').hide(); } else { $('#dati_giuridica').find('input').removeAttr('disabled'); $('#dati_giuridica').find('textarea').removeAttr('disabled'); $('#dati_giuridica').show(); } } } /******GDPR*******/ if ($('#manage_privacy').length > 0) { $('#edit_policy').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { privacy_policy_check: { required: true } }, messages: { privacy_policy_check: { required: "Warning, in order to register you must have read the privacy policy and consent to the processing of your data." } } }); $('#x_btn_marketing').bind('click', function (e) { e.preventDefault(); $("#container_marketing_checkbox").show(); $("#container_label_marketing").hide(); $('#marketing_check').attr('checked', false); }); $('#x_btn_newsletter').bind('click', function (e) { e.preventDefault(); $("#container_newsletter_checkbox").show(); $("#container_label_newsletter").hide(); $('#newsletter_check').attr('checked', false); }); } /****HEADER***/ if ($('#assistenza_container').length > 0) { $('#assistenzafrm').validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name') + '-error'); }, rules: { nome: { required: true }, cognome: { required: true }, messaggio: { required: true, maxlength: 500 }, email: { required: true, email: true }, }, messages: { nome: { required: "Please enter your name", }, cognome: { required: "Please enter your surname", }, messaggio: { required: "Please enter a message", maxlength: "Please enter a message of max 500 characters" }, email: { required: "Please enter a valid email address", email: "Please enter a valid email address", }, } }); $("#assistenzafrm").submit(function () { $('body').prepend(''); $('#modal_loading').fadeIn(); }); if ($('#js_form_result_message').length > 0) { $("#js_form_result_message").delay(1000).fadeOut(800); } } /****GENERAL FUNCTIONS****/ $('#selectAll').bind('click', function (e) { selectCheckbox('gestisci_items', 'items[]'); }); $('input[name="items[]"]').each(function () { $(this).bind('click', function () { var checked = $(this).prop('checked'); disattivaSelectAll(checked, 'gestisci_items'); }); }); $('.unpublish_all').bind('click', function (e) { e.preventDefault(); var formObj = document.forms["gestisci_items"]; if (checkBoxesSel('gestisci_items', 'items[]')) { if (confirm('Sei sicuro di voler spubblicare gli oggetti selezionati?')) { formObj.azione.value = "unpublishAll"; formObj.submit(); } } }); $('.publish_all').bind('click', function (e) { e.preventDefault(); var formObj = document.forms["gestisci_items"]; if (checkBoxesSel('gestisci_items', 'items[]')) { if (confirm('Sei sicuro di voler pubblicare gli oggetti selezionati?')) { formObj.azione.value = "publishAll"; formObj.submit(); } } }); $('.delete_all').bind('click', function (e) { e.preventDefault(); var formObj = document.forms["gestisci_items"]; if (checkBoxesSel('gestisci_items', 'items[]')) { if (confirm('Sei sicuro di voler eliminare gli oggetti selezionati?')) { formObj.azione.value = "deleteAll"; formObj.submit(); } } }); $('.publish_link').each(function () { $(this).bind('click', function (e) { var item_id = $(this).data('item'); var formObj = document.forms["gestisci_items"]; $("input:checkbox[value=" + item_id + "]").attr("checked", true); if (checkBoxesSel('gestisci_items', 'items[]')) { if (confirm('Sei sicuro di voler pubblicare questo oggetto?')) { formObj.azione.value = "publishAll"; formObj.submit(); } } }); }); $('.unpublish_link').each(function () { $(this).bind('click', function (e) { var item_id = $(this).data('item'); var formObj = document.forms["gestisci_items"]; $("input:checkbox[value=" + item_id + "]").attr("checked", true); if (checkBoxesSel('gestisci_items', 'items[]')) { if (confirm('Sei sicuro di voler spubblicare questo oggetto?')) { formObj.azione.value = "unpublishAll"; formObj.submit(); } } }); }); if (genericForm == 1) { $('form').each(function () { $(this).validate({ ignore: [], errorPlacement: function (error, element) { error.appendTo('#' + element.attr('name').replace('[', '').replace(']', '') + '-error'); $('#' + element.attr('name').replace('[', '').replace(']', '') + '-error').fadeIn(); }, success: function (label, element) { $(label).parent().html(''); }, }); }); } }); function setLang(lang, redirect) { // document.location.href=$('#base_url').val()+"lang/"+lang; } /***FUNCTIONS***/ function updateModified() { window.modifiedInfo = 1; } function selectCheckbox(form_name, checkbox_name) { var formObj = document.forms[form_name]; console.log(form_name); var boxes = formObj[checkbox_name].length; var num = 0; if (formObj.selectAll.checked) { for (var i = 0; i < boxes; i++) { if (formObj[checkbox_name][i].checked == false) { formObj[checkbox_name][i].checked = true; } } } else { for (var i = 0; i < boxes; i++) { if (formObj[checkbox_name][i].checked == true) { formObj[checkbox_name][i].checked = false; } } } } function disattivaSelectAll(checked, form_name) { var formObj = document.forms[form_name]; if (checked == false) { formObj.selectAll.checked = false; } } function checkBoxesSel(form_name, checkbox_name) { var formObj = document.forms[form_name]; var checkboxesL = formObj[checkbox_name].length; var message = ""; for (var i = 0; i < checkboxesL; i++) { if (formObj[checkbox_name][i].checked) { message = message + "a"; } } if (message == "") { alert('Nessun oggetto selezionato'); return false; } else { return true; } }