1(function(){'use strict';var API_BASE='https://api.unidformazione.com/v1';var SITE_KEY='';var PREFILL_NAME='';var PREFILL_LASTNAME='';var PREFILL_EMAIL='';var MOODLE_USER_ID=0;var MOODLE_COURSE_ID=0;var MOODLE_COURSE_NAME='';var scriptTag=document.currentScript||document.querySelector('script[data-site-key]');if(scriptTag){SITE_KEY=scriptTag.getAttribute('data-site-key')||'';PREFILL_NAME=scriptTag.getAttribute('data-user-name')||'';PREFILL_LASTNAME=scriptTag.getAttribute('data-user-lastname')||'';PREFILL_EMAIL=scriptTag.getAttribute('data-user-email')||'';MOODLE_USER_ID=parseInt(scriptTag.getAttribute('data-moodle-user-id')||'0',10);MOODLE_COURSE_ID=parseInt(scriptTag.getAttribute('data-moodle-course-id')||'0',10);MOODLE_COURSE_NAME=scriptTag.getAttribute('data-moodle-course-name')||''} 2if(!SITE_KEY){console.warn('[UniD WA] No data-site-key found on script tag. Widget disabled.');return} 3var siteConfig={content_mode:'products',skip_lead_form:!1,geo_restrict:!0,max_messages:20,has_moodle:!1,};var STORAGE_KEY='unid_wa_'+SITE_KEY.substr(-8);var state={isOpen:!1,conversationId:null,userData:{name:'',lastName:'',email:''},productData:null,courseData:null,currentView:'form',messageCount:0,maxMessages:20,_messages:[],};function saveState(){try{sessionStorage.setItem(STORAGE_KEY,JSON.stringify({conversationId:state.conversationId,userData:state.userData,productData:state.productData,courseData:state.courseData,currentView:state.currentView,messageCount:state.messageCount,messages:state._messages,}))}catch(e){}} 4function loadState(){try{var raw=sessionStorage.getItem(STORAGE_KEY);if(!raw)return!1;var saved=JSON.parse(raw);if(!saved||!saved.conversationId)return!1;state.conversationId=saved.conversationId;state.userData=saved.userData||state.userData;state.productData=saved.productData||null;state.courseData=saved.courseData||null;state.currentView=saved.currentView||'form';state.messageCount=saved.messageCount||0;state._messages=saved.messages||[];return!0}catch(e){return!1}} 5function clearState(){state.conversationId=null;state.userData={name:'',lastName:'',email:''};state.productData=null;state.courseData=null;state.currentView='form';state.messageCount=0;state._messages=[];try{sessionStorage.removeItem(STORAGE_KEY)}catch(e){}} 6function apiPost(endpoint,data){return fetch(API_BASE+endpoint,{method:'POST',headers:{'Content-Type':'application/json','X-Site-Key':SITE_KEY},body:JSON.stringify(data),}).then(function(r){if(!r.ok)return r.json().then(function(e){throw new Error(e.error||'HTTP '+r.status)});return r.json()})} 7function apiGet(endpoint,params){var qs=params?'?'+new URLSearchParams(params).toString():'';return fetch(API_BASE+endpoint+qs,{headers:{'X-Site-Key':SITE_KEY},}).then(function(r){if(!r.ok)return r.json().then(function(e){throw new Error(e.error||'HTTP '+r.status)});return r.json()})} 8function injectStyles(){if(document.getElementById('unid-wa-styles'))return;var link=document.createElement('link');link.rel='stylesheet';link.id='unid-wa-styles';link.href='https://api.unidformazione.com/widget/unid-wa.css';document.head.appendChild(link)} 9var WA_SVG='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>';function buildFAQItem(q,a){return'<div class="wa-faq-item">'+'<div class="wa-faq-question"><span>'+q+'</span><i class="wa-faq-icon"></i></div>'+'<div class="wa-faq-answer">'+a+'</div>'+'</div>'} 10var _keywordsLoaded=!1;var _keywordsFetching=!1;function loadKeywordProducts(){if(_keywordsLoaded||_keywordsFetching)return;_keywordsFetching=!0;var container=dialog.querySelector('.wa-keywords-container');var listEl=dialog.querySelector('.wa-keywords-list');var continueBtn=dialog.querySelector('#wa-continue-btn');fetch(API_BASE+'/keyword-products',{headers:{'X-Site-Key':SITE_KEY},}).then(function(r){return r.ok?r.json():Promise.reject(r.status)}).then(function(data){_keywordsLoaded=!0;_keywordsFetching=!1;var products=(data&&Array.isArray(data.products))?data.products:[];if(!products.length){if(container)container.style.display='none';return} 11var html=products.map(function(p){return'<button type="button" class="wa-keyword-btn" data-id="'+p.id+'" data-title="'+escAttr(p.label)+'">'+escHtml(p.label)+'</button>'}).join('');if(listEl){listEl.innerHTML=html;var btns=listEl.querySelectorAll('.wa-keyword-btn');for(var i=0;i<btns.length;
11i++){(function(btn){btn.addEventListener('click',function(){for(var k=0;k<btns.length;k++)btns[k].classList.remove('selected');btn.classList.add('selected');state.productData={id:parseInt(btn.getAttribute('data-id'),10),title:btn.getAttribute('data-title'),};saveState();if(continueBtn){continueBtn.disabled=!1;continueBtn.classList.remove('disabled')}})})(btns[i])}} 12if(container)container.style.display='';if(state.isOpen&&window.innerWidth>767){requestAnimationFrame(function(){requestAnimationFrame(positionDialog)})}}).catch(function(){_keywordsFetching=!1;if(container)container.style.display='none'})} 13function buildDialogHTML(){return('<div id="wa-view-form" class="wa-view">'+'<form id="wa-form" class="wa-form">'+'<div class="wa-form-group">'+'<div class="wa-input-container">'+'<label for="wa-name">Nome: <span class="required">*</span></label>'+'<input type="text" id="wa-name" class="wa-input" placeholder="Il tuo nome" required>'+'</div>'+'<div class="wa-input-container">'+'<label for="wa-surname">Cognome: <span class="required">*</span></label>'+'<input type="text" id="wa-surname" class="wa-input" placeholder="Il tuo cognome" required>'+'</div>'+'<div class="wa-input-container">'+'<label for="wa-email">Email: <span class="required">*</span></label>'+'<input type="text" id="wa-email" class="wa-input" placeholder="La tua email" required>'+'</div>'+'</div>'+'<div class="wa-form-buttons">'+'<button type="submit" class="wa-btn wa-btn-primary wa-submit">Continua</button>'+'<button type="button" id="wa-cancel" class="wa-btn wa-btn-secondary wa-cancel">Annulla</button>'+'</div>'+'</form>'+'</div>'+'<div id="wa-view-options" class="wa-view" style="display:none">'+'<div class="wa-minimize-container">'+'<button type="button" class="wa-back-arrow-btn" data-back="options"><span class="wa-back-icon">←</span></button>'+'<button type="button" class="wa-minimize-btn">−</button>'+'</div>'+'<h3 class="wa-section-title">Come possiamo aiutarti? 👋</h3>'+'<div class="wa-options-buttons">'+'<div class="wa-ai-card" data-option="enroll" role="button" tabindex="0">'+'<div class="ai-top-section">'+'<div class="ai-icon"><span style="font-size:24px">✨</span></div>'+'<div class="ai-content">'+'<span class="ai-label">Assistenza 24/7</span>'+'<div class="ai-main-text">Sei interessato ad un corso?</div>'+'</div>'+'</div>'+'<button type="button" class="ai-chat-button">Chatta con noi</button>'+'</div>'+'<button type="button" class="wa-btn wa-option-btn" data-option="generalinfo">'+'<span class="option-text">Informazioni generali</span><span class="option-icon">➜</span>'+'</button>'+'<button type="button" class="wa-btn wa-option-btn" data-option="support">'+'<span class="option-text">Sono già iscritto o ho effettuato un ordine</span><span class="option-icon">➜</span>'+'</button>'+'<button type="button" class="wa-btn wa-option-btn" data-option="collaborate">'+'<span class="option-text">Desidero collaborare con voi</span><span class="option-icon">➜</span>'+'</button>'+'</div>'+'</div>'+'<div id="wa-view-productSelector" class="wa-view" style="display:none">'+'<div class="wa-minimize-container">'+'<button type="button" class="wa-back-arrow-btn" data-back="productSelector"><span class="wa-back-icon">←</span></button>'+'<button type="button" class="wa-minimize-btn">−</button>'+'</div>'+'<h3 class="wa-section-title">Seleziona un corso</h3>'+'<div class="wa-search-container">'+'<input type="text" id="wa-product-search" class="wa-search-input" placeholder="Cerca un corso...">'+'</div>'+'<div id="wa-product-results" class="wa-search-results">'+'<p class="wa-search-message">Digita almeno 3 caratteri per cercare</p>'+'</div>'+'<div class="wa-keywords-container" style="display:none">'+'<div class="wa-keywords-title">Oppure scegli un\'area di interesse:</div>'+'<div class="wa-keywords-list"></div>'+'</div>'+'<div class="wa-product-buttons">'+'<button type="button" id="wa-continue-btn" class="wa-btn wa-btn-primary wa-continue-btn disabled" disabled>Vai alla chat</button>'+'</div>'+'</div>'+'<div id="wa-view-courseSelector" class="wa-view" style="display:none">'+'<div class="wa-minimize-container">'+'<button type="button" class="wa-back-arrow-btn" data-back="courseSelector"><span class="wa-back-icon">←</span></button>'+'<button type="button" class="wa-minimize-btn">−</button>'+'</div>'+'<h3 class="wa-section-title">Come possiamo aiutarti? ð</h3>'+'<p class="wa-section-subtitle">Seleziona un corso:</p>'+'<div id="wa-course-list" class="wa-search-results">'+'<p class="wa-search-message">Carico i tuoi corsi...</p>'+'</div>'+'<div class="wa-product-buttons">'+'<button type="button" id="wa-course-skip-btn" class="wa-btn wa-btn-secondary" style="margin-right:8px">Domanda generale</button>'+'<button type="button" id="wa-course-continue-btn" class="wa-btn wa-btn-primary wa-continue-btn disabled" disabled>Vai alla chat</button>'+'</div>'+'</div>'+'<div id="wa-view-aiChat" class="wa-view wa-chat-container" style="display:none">'+'<div class="wa-minimize-container">'+'<button type="button" class="wa-back-arrow-btn" data-back="aiChat"><span class="wa-back-icon">←</span></button>'+'<button type="button" class="wa-minimize-btn">−</button>'+'</div>'+'<div class="wa-chat-messages" id="wa-chat-messages"></div>'+'<div id="wa-typing" class="wa-typing-indicator" style="display:none">'+'<div class="wa-typing-dots">'+'<div class="wa-typing-dot"></div><div class="wa-typing-dot"></div><div class="wa-typing-dot"></div>'+'</div>'+'</div>'+'<div class="wa-chat-input">
13'+'<form id="wa-chat-form" class="wa-chat-form">'+'<input type="text" id="wa-chat-input" class="wa-chat-input-field" placeholder="Scrivi un messaggio..." autocomplete="off">'+'<button type="submit" class="wa-send-btn">'+'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="20" height="20"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg>'+'</button>'+'</form>'+'</div>'+'<div class="wa-chat-footer">'+'<button type="button" id="wa-switch-wa" class="wa-btn wa-btn-primary wa-switch-btn">Passa a WhatsApp</button>'+'<button type="button" id="wa-contact-support" class="wa-btn wa-btn-primary wa-support-btn" style="display:none">Contatta il supporto</button>'+'</div>'+'</div>'+'<div id="wa-view-generalInfo" class="wa-view" style="display:none">'+'<div class="wa-minimize-container">'+'<button type="button" class="wa-back-arrow-btn" data-back="generalInfo"><span class="wa-back-icon">←</span></button>'+'<button type="button" class="wa-minimize-btn">−</button>'+'</div>'+'<h3 class="wa-section-title">Informazioni generali</h3>'+'<div class="wa-faq-container">'+buildFAQItem('Posso seguire i corsi mentre studio o lavoro?','<p>Prevediamo corsi online on demand oppure in presenza studiati per consentire a tutti di frequentare.</p>'+'<p><strong>Corsi online on demand</strong><br>Asincrone, puoi frequentarle in completa autonomia 24h su 24.</p>')+buildFAQItem('Quanto costano i corsi?','<p>Il costo dipende dalla durata e dalla modalità di frequenza. Nella scheda informativa di ogni percorso trovi il prezzo.</p>')+buildFAQItem('Come posso pagare il corso?','<p>Metodi accettati: Bonifico bancario, Carte di credito, PayPal. Disponibile anche Carta Docente per alcune tipologie.</p>')+buildFAQItem('Posso pagare a rate?','<p>Sì: PayPal (3 rate, 0 interessi), Alma (fino a 4 rate, 0 interessi), Heylight (fino a 36 rate).</p>')+'</div>'+'<div class="wa-whatsapp-button-container">'+'<button type="button" class="wa-btn wa-whatsapp-contact-btn">Chatta con un operatore</button>'+'</div>'+'</div>'+'<div id="wa-view-support" class="wa-view" style="display:none">'+'<div class="wa-minimize-container">'+'<button type="button" class="wa-back-arrow-btn" data-back="support"><span class="wa-back-icon">←</span></button>'+'<button type="button" class="wa-minimize-btn">−</button>'+'</div>'+'<h3 class="wa-section-title">Assistenza clienti</h3>'+'<div class="wa-faq-container">'+buildFAQItem('Ho effettuato un ordine, quando ricevo le credenziali?','<p>Se hai già completato il pagamento hai già ricevuto le credenziali via email. Per bonifico attendi 24/48 ore lavorative.</p>')+buildFAQItem('Ho difficoltà ad accedere al corso, come posso risolvere?','<p>Controlla di navigare su <strong>unidcampus.com</strong>. Per ulteriore supporto scrivi a <a href="mailto:[email protected]">[email protected]</a>.</p>')+buildFAQItem('Desideri richiedere un rimborso/recesso?','<p>Verifica nelle condizioni di vendita se è previsto il rimborso, poi segui le istruzioni indicate.</p>')+'</div>'+'<div class="wa-whatsapp-button-container">'+'<button type="button" class="wa-btn wa-whatsapp-support-btn">Chatta con un operatore</button>'+'</div>'+'</div>'+'<div id="wa-view-collaborate" class="wa-view" style="display:none">'+'<div class="wa-minimize-container">'+'<button type="button" class="wa-back-arrow-btn" data-back="collaborate"><span class="wa-back-icon">←</span></button>'+'<button type="button" class="wa-minimize-btn">−</button>'+'</div>'+'<h3 class="wa-section-title">Lavora con noi</h3>'+'<p class="wa-message" style="text-align:left">Se vuoi collaborare con noi compila il form “Lavora con noi”</p>'+'<div class="wa-action-buttons">'+'<a href="/lavora-con-noi/" target="_blank" class="wa-btn wa-btn-primary">Vai al form</a>'+'</div>'+'</div>')} 14function showView(viewName){state.currentView=viewName;saveState();var views=dialog.querySelectorAll('.wa-view');for(var i=0;i<views.length;i++){views[i].style.display=views[i].id==='wa-view-'+viewName?'':'none'} 15if(state.isOpen&&window.innerWidth>767){requestAnimationFrame(function(){requestAnimationFrame(positionDialog)})}} 16var dialog,buttonEl;function openDialog(){state.isOpen=!0;
16updateViewportHeight();var startView;if(state.conversationId){startView=state.currentView}else if(siteConfig.skip_lead_form&&state.userData.email){if(MOODLE_COURSE_ID&&!state.courseData){state.courseData={id:MOODLE_COURSE_ID,fullname:MOODLE_COURSE_NAME};state.conversationId='conv_'+Date.now()+'_'+Math.random().toString(36).substr(2,9);submitFormSilently();startView='aiChat'}else if(siteConfig.content_mode==='knowledge'){if(!state.conversationId){state.conversationId='conv_'+Date.now()+'_'+Math.random().toString(36).substr(2,9);submitFormSilently()} 17startView='courseSelector'}else{startView='options'}}else{startView='form'} 18showView(startView);if(startView==='aiChat')startChat();if(startView==='courseSelector'){loadMoodleCourses();bindCourseSelector()} 19if(dialog.showModal){try{dialog.showModal()}catch(e){}}else{dialog.setAttribute('open','')} 20dialog.style.display='';requestAnimationFrame(function(){requestAnimationFrame(positionDialog)});if(window.innerWidth<=767){document.body.style.overflow='hidden'}} 21function closeDialog(){state.isOpen=!1;if(dialog.close){try{dialog.close()}catch(e){}}else{dialog.removeAttribute('open')} 22dialog.style.display='none';document.body.style.overflow=''} 23function positionDialog(){if(window.innerWidth<=767){dialog.style.cssText+=';position:fixed;bottom:0;left:0;top:auto;width:100vw;max-width:100vw;border-radius:0;margin:0';return} 24var br=buttonEl.getBoundingClientRect();var vw=window.innerWidth,vh=window.innerHeight;var dw=Math.min(380,vw-40);var dh=dialog.offsetHeight||500;var left=Math.max(10,Math.min(br.left+br.width/2-dw/2,vw-dw-20));var top=br.top-dh-15;if(top<10)top=Math.min(br.bottom+15,vh-dh-10);dialog.style.left=left+'px';dialog.style.top=top+'px';dialog.style.position='fixed';dialog.style.width=dw+'px'} 25function bindForm(){var form=dialog.querySelector('#wa-form');var cancelBtn=dialog.querySelector('#wa-cancel');cancelBtn.addEventListener('click',function(){clearState();closeDialog()});var emailInput=dialog.querySelector('#wa-email');emailInput.addEventListener('input',function(){var v=this.value.trim();var ok=v&&/^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/.test(v)&&!v.includes('..');this.setCustomValidity(v&&!ok?'Inserisci un indirizzo email valido':'')});form.addEventListener('submit',function(e){e.preventDefault();var name=dialog.querySelector('#wa-name').value.trim();var lastName=dialog.querySelector('#wa-surname').value.trim();var email=dialog.querySelector('#wa-email').value.trim();if(!name||!lastName||!email){form.reportValidity();return} 26state.userData={name:name,lastName:lastName,email:email};state.conversationId='conv_'+Date.now()+'_'+Math.random().toString(36).substr(2,9);submitFormSilently();if(siteConfig.content_mode==='knowledge'){showView('courseSelector');loadMoodleCourses();bindCourseSelector()}else{showView('options');autoDetectProduct()}})} 27function handleOption(option){switch(option){case 'enroll':if(siteConfig.content_mode==='knowledge'){if(state.courseData&&state.courseData.id){showView('aiChat');startChat()}else{showView('courseSelector');loadMoodleCourses();bindCourseSelector()}}else{if(state.productData&&state.productData.id){showView('aiChat');startChat()}else{showView('productSelector');bindProductSearch();loadKeywordProducts()}} 28break;case 'generalinfo':showView('generalInfo');bindFAQAccordion();break;case 'support':showView('support');bindFAQAccordion();break;case 'collaborate':showView('collaborate');break}} 29function bindOptions(){dialog.querySelector('.wa-ai-card').addEventListener('click',function(){handleOption('enroll')});var optBtns=dialog.querySelectorAll('.wa-option-btn');for(var i=0;i<optBtns.length;i++){(function(btn){btn.addEventListener('click',function(){handleOption(btn.getAttribute('data-option'))})})(optBtns[i])}} 30function bindBackButtons(){var btns=dialog.querySelectorAll('.wa-back-arrow-btn');for(var i=0;i<btns.length;i++){(function(btn){btn.addEventListener('click',function(){var from=btn.getAttribute('data-back');if(from==='aiChat'){if(siteConfig.content_mode==='knowledge'){_coursesLoaded=!1;showView('courseSelector');loadMoodleCourses();bindCourseSelector()}else{showView('productSelector');bindProductSearch();loadKeywordProducts()}}else if(from==='courseSelector'&&siteConfig.content_mode==='knowledge'){closeDialog()}else{showView('options')}})})(btns[i])} 31var minBtns=dialog.querySelectorAll('.wa-minimize-btn');for(var j=0;j<minBtns.length;j++){minBtns[j].addEventListener('click',function(e){e.preventDefault();closeDialog()})}} 32var productSearchBound=!1;function bindProductSearch(){if(productSearchBound)return;productSearchBound=!0;var searchInput=dialog.querySelector('#wa-product-search');var resultsEl=dialog.querySelector('#wa-product-results');var continueBtn=dialog.querySelector('#wa-continue-btn');var searchTimer;searchInput.addEventListener('input',function(){clearTimeout(searchTimer);resultsEl.style.display='';var q=this.value.trim();if(q.length<3){resultsEl.innerHTML='<p class="wa-search-message">Digita almeno 3 caratteri per cercare</p>';return} 33searchTimer=setTimeout(function(){apiGet('/products',{search:q,limit:20}).then(function(data){if(!data.products||!data.products.length){resultsEl.innerHTML='<p class="wa-search-message">Nessun corso trovato</p>';return} 34resultsEl.innerHTML=data.products.map(function(p){return'<div class="wa-product-item" data-id="'+p.id+'" data-title="'+escAttr(p.title)+'">'+escHtml(p.title)+'</div>'}).join('');var items=resultsEl.querySelectorAll('.wa-product-item');for(var i=0;i<items.length;i++){(function(item){item.addEventListener('click',function(){var title=item.getAttribute('data-title');state.productData={id:parseInt(item.getAttribute('data-id')),title:title,};saveState();searchInput.value=title;resultsEl.innerHTML='';resultsEl.style.display='none';continueBtn.disabled=!1;continueBtn.classList.remove('disabled')})})(items[i])}}).catch(function(){resultsEl.innerHTML='<p class="wa-search-message">Errore di ricerca. Riprova.</p>'})},300)});continueBtn.addEventListener('click',function(){if(state.productData&&state.productData.id){showView('aiChat');startChat()}})} 35function bindFAQAccordion(){var items=dialog.querySelectorAll('.wa-faq-item');for(var i=0;i<items.length;i++){(function(item){var q=item.querySelector('.wa-faq-question');var a=item.querySelector('.wa-faq-answer');a.style.display='none';q.addEventListener('click',function(){var open=a.style.display!=='none';a.style.display=open?'none':'block';item.classList.toggle('wa-faq-open',!open)})})(items[i])}
36var contactBtns=dialog.querySelectorAll('.wa-whatsapp-contact-btn, .wa-whatsapp-support-btn');for(var j=0;j<contactBtns.length;j++){contactBtns[j].addEventListener('click',function(){redirectToWhatsApp('Richiesta informazioni')})}} 37function startChat(replay){var messagesEl=dialog.querySelector('#wa-chat-messages');messagesEl.innerHTML='';if(replay&&state._messages.length){var saved=state._messages;state._messages=[];for(var i=0;i<saved.length;i++){if(saved[i].role==='user'){addUserMessage(saved[i].text,!0)}else{addBotMessage(saved[i].text,!0)}} 38if(state.messageCount>=state.maxMessages){var chatInput=dialog.querySelector('#wa-chat-input');var sendBtn=dialog.querySelector('.wa-send-btn');if(chatInput)chatInput.disabled=!0;if(sendBtn)sendBtn.disabled=!0}}else{state._messages=[];state.messageCount=0;addBotMessage('Ciao! Come posso aiutarti oggi?',!0);var selectedLabel=null;if(siteConfig.content_mode==='knowledge'&&state.courseData&&state.courseData.id){selectedLabel=state.courseData.fullname||('Corso #'+state.courseData.id)}else if(state.productData&&state.productData.title){selectedLabel=state.productData.title} 39if(selectedLabel){var note=document.createElement('div');note.className='wa-chat-message wa-bot-message';note.style.cssText='background:#e8f4f9;font-size:12px;color:#555';note.textContent='Corso selezionato: '+selectedLabel;messagesEl.appendChild(note)} 40saveState()} 41bindChatForm()} 42var chatFormBound=!1;function bindChatForm(){if(chatFormBound)return;chatFormBound=!0;var chatForm=dialog.querySelector('#wa-chat-form');var chatInput=dialog.querySelector('#wa-chat-input');var switchBtn=dialog.querySelector('#wa-switch-wa');chatForm.addEventListener('submit',function(e){e.preventDefault();var msg=chatInput.value.trim();if(!msg)return;state.messageCount++;if(state.messageCount>state.maxMessages){addBotMessage('Hai raggiunto il limite di messaggi. Puoi contattarci direttamente su WhatsApp.');chatInput.disabled=!0;dialog.querySelector('.wa-send-btn').disabled=!0;return} 43addUserMessage(msg);chatInput.value='';showTyping(!0);var questionId='';if(siteConfig.content_mode==='knowledge'&&state.courseData&&state.courseData.id){questionId='course_'+state.courseData.id}else if(state.productData&&state.productData.id){questionId='product_'+state.productData.id} 44apiPost('/ai-bot',{message:msg,conversation_id:state.conversationId,question_id:questionId,user_info:state.userData,page_url:window.location.href,}).then(function(data){showTyping(!1);addBotMessage(data.response)}).catch(function(){showTyping(!1);addBotMessage('Mi dispiace, si è verificato un errore. Prova di nuovo o contattaci su WhatsApp.')})});switchBtn.addEventListener('click',function(){var reason=state.productData?'Sono interessato a '+state.productData.title:'Informazioni sui corsi';redirectToWhatsApp(reason)});var supportBtn=dialog.querySelector('#wa-contact-support');if(supportBtn){supportBtn.addEventListener('click',function(){var subject=state.courseData&&state.courseData.id?'Richiesta informazioni - '+state.courseData.fullname:'Richiesta informazioni';var body='Messaggio da: '+state.userData.name+' '+state.userData.lastName;if(state.userData.email)body+=' ('+state.userData.email+')';if(state.courseData&&state.courseData.id)body+='\nCorso: '+state.courseData.fullname;window.location.href='mailto:[email protected]?subject='+encodeURIComponent(subject)+'&body='+encodeURIComponent(body)})}} 45function addUserMessage(text,skipSave){state._messages.push({role:'user',text:text});var el=document.createElement('div');el.className='wa-chat-message wa-user-message';el.textContent=text;appendMsg(el);if(!skipSave)saveState()} 46function addBotMessage(text,skipSave){state._messages.push({role:'bot',text:text});var el=document.createElement('div');el.className='wa-chat-message wa-bot-message';el.innerHTML=linkify(renderMarkdown(escHtml(text)));appendMsg(el);if(!skipSave)saveState()} 47function appendMsg(el){var msgs=dialog.querySelector('#wa-chat-messages');msgs.appendChild(el);msgs.scrollTop=msgs.scrollHeight} 48function showTyping(show){var t=dialog.querySelector('#wa-typing');
48if(t)t.style.display=show?'flex':'none'} 49function redirectToWhatsApp(reason){if(state.conversationId){apiPost('/log-handoff',{conversation_id:state.conversationId,reason:reason}).catch(function(){})} 50var msg='Messaggio da: '+state.userData.name+' '+state.userData.lastName;if(state.userData.email)msg+=' ('+state.userData.email+')';msg+='\nMotivo: '+reason;var url='https://wa.me/?text='+encodeURIComponent(msg);clearState();closeDialog();window.open(url,'_blank')} 51function autoDetectProduct(){apiPost('/detect-product',{page_url:window.location.href}).then(function(data){if(data.success&&data.product&&data.product.id){state.productData=data.product;saveState()}}).catch(function(){})} 52function submitFormSilently(){if(!state.conversationId){state.conversationId='conv_'+Date.now()+'_'+Math.random().toString(36).substr(2,9)} 53apiPost('/form-submit',{conversation_id:state.conversationId,user_info:state.userData,page_url:window.location.href,}).catch(function(){});saveState()} 54var _coursesLoaded=!1;var _coursesFetching=!1;function loadMoodleCourses(){if(_coursesLoaded||_coursesFetching||!MOODLE_USER_ID)return;_coursesFetching=!0;var listEl=dialog.querySelector('#wa-course-list');if(listEl)listEl.innerHTML='<p class="wa-search-message">Carico i tuoi corsi...</p>';apiGet('/moodle-courses',{moodle_user_id:MOODLE_USER_ID}).then(function(data){_coursesLoaded=!0;_coursesFetching=!1;var courses=(data&&Array.isArray(data.courses))?data.courses:[];if(!listEl)return;if(!courses.length){if(state.courseData&&state.courseData.id){courses=[{id:state.courseData.id,fullname:state.courseData.fullname||('Corso #'+state.courseData.id)}]}else{listEl.innerHTML='<p class="wa-search-message">Nessun corso trovato. Usa "Domanda generale".</p>';return}} 55listEl.innerHTML=courses.map(function(c){return'<div class="wa-product-item wa-course-item" data-id="'+c.id+'" data-name="'+escAttr(c.fullname)+'">'+escHtml(c.fullname)+'</div>'}).join('');var items=listEl.querySelectorAll('.wa-course-item');for(var i=0;i<items.length;i++){(function(item){item.addEventListener('click',function(){for(var k=0;k<items.length;k++)items[k].classList.remove('selected');item.classList.add('selected');state.courseData={id:parseInt(item.getAttribute('data-id'),10),fullname:item.getAttribute('data-name'),};saveState();var continueBtn=dialog.querySelector('#wa-course-continue-btn');if(continueBtn){continueBtn.disabled=!1;continueBtn.classList.remove('disabled')}})})(items[i])}}).catch(function(){_coursesFetching=!1;if(listEl)listEl.innerHTML='<p class="wa-search-message">Errore nel caricamento dei corsi.</p>'})} 56var courseSelectorBound=!1;function bindCourseSelector(){if(courseSelectorBound)return;courseSelectorBound=!0;var continueBtn=dialog.querySelector('#wa-course-continue-btn');var skipBtn=dialog.querySelector('#wa-course-skip-btn');if(continueBtn){continueBtn.addEventListener('click',function(){if(state.courseData&&state.courseData.id){if(!state.conversationId){state.conversationId='conv_'+Date.now()+'_'+Math.random().toString(36).substr(2,9);submitFormSilently()} 57showView('aiChat');startChat()}})} 58if(skipBtn){skipBtn.addEventListener('click',function(){state.courseData=null;if(!state.conversationId){state.conversationId='conv_'+Date.now()+'_'+Math.random().toString(36).substr(2,9);submitFormSilently()} 59showView('aiChat');startChat()})}} 60function checkGeoRestriction(){if(!siteConfig.geo_restrict)return;fetch('https://ipapi.co/json/').then(function(r){return r.json()}).then(function(data){var cc=(data.country_code||'').toUpperCase();
60if(cc&&cc!=='IT'&&cc!=='SM'){buttonEl.style.display='none'}}).catch(function(){})} 61function fetchSiteConfig(callback){fetch(API_BASE+'/site-config',{headers:{'X-Site-Key':SITE_KEY},}).then(function(r){return r.ok?r.json():Promise.reject(r.status)}).then(function(data){if(data&&data.config){siteConfig.content_mode=data.config.content_mode||'products';siteConfig.skip_lead_form=!!data.config.skip_lead_form;siteConfig.geo_restrict=!!data.config.geo_restrict;siteConfig.max_messages=data.config.max_messages||20;siteConfig.has_moodle=!!data.config.has_moodle;state.maxMessages=siteConfig.max_messages;if(data.config.content_mode==='knowledge'){var waBtn=dialog.querySelector('#wa-switch-wa');var supportBtn=dialog.querySelector('#wa-contact-support');if(waBtn)waBtn.style.display='none';if(supportBtn)supportBtn.style.display=''}} 62if(callback)callback()}).catch(function(){if(callback)callback()})} 63function renderMarkdown(s){s=s.replace(/\*\*(.+?)\*\*/g,'<strong>$1</strong>');s=s.replace(/((?:^|\n)(?:- |\* ).+)+/g,function(block){var items=block.trim().split(/\n/).map(function(line){return'<li>'+line.replace(/^[-*] /,'')+'</li>'});return'<ul>'+items.join('')+'</ul>'});s=s.replace(/\n/g,'<br>');return s} 64function escHtml(s){var d=document.createElement('div');d.textContent=s||'';return d.innerHTML} 65function escAttr(s){return escHtml(s).replace(/"/g,'"').replace(/'/g,''')} 66function linkify(s){return s.replace(/(https?:\/\/[^\s<]+)/g,function(url){var clean=url.replace(/[.,;:)]+$/,'');return'<a href="'+clean+'" target="_blank" rel="noopener noreferrer">'+clean+'</a>'})} 67function updateViewportHeight(){var h=(window.visualViewport?window.visualViewport.height:window.innerHeight);document.documentElement.style.setProperty('--wa-viewport-height',h+'px')} 68function bindViewportTracking(){if(window.visualViewport){window.visualViewport.addEventListener('resize',function(){updateViewportHeight();if(state.isOpen&&window.innerWidth<=767){dialog.style.top='0'}});window.visualViewport.addEventListener('scroll',function(){if(state.isOpen&&window.innerWidth<=767)updateViewportHeight()})} 69updateViewportHeight()} 70function init(){injectStyles();buttonEl=document.createElement('a');buttonEl.className='whatsapp-button';buttonEl.href='#';buttonEl.setAttribute('aria-label','Contact via WhatsApp');buttonEl.innerHTML=WA_SVG;dialog=document.createElement('dialog');dialog.id='whatsapp-popup';dialog.className='wa-plugin-element whatsapp-popup';dialog.style.display='none';var content=document.createElement('div');content.className='wa-plugin-content';content.innerHTML=buildDialogHTML();dialog.appendChild(content);var container=document.createElement('div');container.id='unid-wa-widget';container.className='wa-plugin-element';container.appendChild(buttonEl);container.appendChild(dialog);document.body.appendChild(container);buttonEl.addEventListener('click',function(e){e.preventDefault();state.isOpen?closeDialog():openDialog()});dialog.addEventListener('click',function(e){if(e.target===dialog)closeDialog()});document.addEventListener('keydown',function(e){if(e.key==='Escape'&&state.isOpen)closeDialog()});bindForm();bindOptions();bindBackButtons();if(PREFILL_NAME||PREFILL_EMAIL){state.userData={name:PREFILL_NAME,lastName:PREFILL_LASTNAME,email:PREFILL_EMAIL,};var nameInput=dialog.querySelector('#wa-name');var surnameInput=dialog.querySelector('#wa-surname');var emailInput=dialog.querySelector('#wa-email');if(nameInput)nameInput.value=PREFILL_NAME;if(surnameInput)surnameInput.value=PREFILL_LASTNAME;if(emailInput)emailInput.value=PREFILL_EMAIL} 71var restored=loadState();if(restored&&state.conversationId){var nameInput2=dialog.querySelector('#wa-name');var surnameInput2=dialog.querySelector('#wa-surname');var emailInput2=dialog.querySelector('#wa-email');if(nameInput2)nameInput2.value=state.userData.name||'';if(surnameInput2)surnameInput2.value=state.userData.lastName||'';if(emailInput2)emailInput2.value=state.userData.email||'';var cv=state.currentView;if(cv==='aiChat'){startChat(!0)}else if(cv==='productSelector'){bindProductSearch();loadKeywordProducts();if(state.productData&&state.productData.id){var continueBtn=dialog.querySelector('#wa-continue-btn');if(continueBtn){continueBtn.disabled=!1;continueBtn.classList.remove('disabled')}}}else if(cv==='courseSelector'){loadMoodleCourses();bindCourseSelector();if(state.courseData&&state.courseData.id){var courseContinueBtn=dialog.querySelector('#wa-course-continue-btn');if(courseContinueBtn){courseContinueBtn.disabled=!1;courseContinueBtn.classList.remove('disabled')}}}else if(cv==='generalInfo'||cv==='support'){bindFAQAccordion()}} 72bindViewportTracking();fetchSiteConfig(function(){checkGeoRestriction()})} 73if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',init)}else{init()}})()
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.