/* Askivio Frontend v2 (consent, multilingual, header avatar, CTA, usage banners) */
(function(){
"use strict";
function onReady(fn){ if (document.readyState==='loading') document.addEventListener('DOMContentLoaded', fn, {once:true}); else fn(); }
function css(el, st){ for (const k in st){ el.style[k]=st[k]; } }
function isMobile(){ return window.innerWidth<768; }
function renderRich(t){
const esc = String(t||'')
.replace(/&/g,'&').replace(//g,'>')
.replace(/"/g,'"').replace(/'/g,''');
let html = esc.replace(/\[([^\]]+)\]\((https?:\/\/[^\s)]+)\)/g, (_m, label, href) => {
return `${label}`;
});
html = html.replace(/((https?:\/\/|www\.)[^\s<]+[^<.,:;"')\]\s])/gi, (m) => {
const href = m.startsWith('http') ? m : `https://${m}`;
return `${m}`;
});
html = html.replace(/\n{2,}/g, '\n\n').replace(/\n/g, ' ');
return html;
}
function mapPos(pos,x,y){
const o={top:'',right:'',bottom:'',left:'',transform:''}; x=x||'16px'; y=y||'16px';
switch(pos){
case'tl':o.top=y;o.left=x;break;
case'tc':o.top=y;o.left='50%';o.transform='translateX(-50%)';break;
case'tr':o.top=y;o.right=x;break;
case'cl':o.top='50%';o.left=x;o.transform='translateY(-50%)';break;
case'cc':o.top='50%';o.left='50%';o.transform='translate(-50%,-50%)';break;
case'cr':o.top='50%';o.right=x;o.transform='translateY(-50%)';break;
case'bl':o.bottom=y;o.left=x;break;
case'bc':o.bottom=y;o.left='50%';o.transform='translateX(-50%)';break;
default:o.bottom=y;o.right=x;
}
return o;
}
function el(tag, cls, st){ const d=document.createElement(tag); if(cls)d.className=cls; if(st)css(d,st); return d; }
/* ===== Language helpers ===== */
function askivioPreferredLang() {
const cfg = window.AskivioCFG || {};
const v = (cfg.lang || '') ||
(document.documentElement && document.documentElement.lang) ||
(navigator.language || navigator.userLanguage || '');
const code = String(v || 'en').toLowerCase().slice(0,2);
return ['ro','en','it','es','fr','de'].includes(code) ? code : 'en';
}
function askivioGuessLang(s){
s = (s||'').toLowerCase().trim();
if (/(bun[ăa]|salut|buna ziua|servus|hei|neața|neata)/.test(s)) return 'ro';
if (/[ăâîșşţț]/.test(s) || /(cina|pranz|mic dejun|rezerv|pret|preț|ofert|program)/.test(s)) return 'ro';
if (/(prenot|prezzo|orario|ristorante|cena|camera)/.test(s)) return 'it';
if (/(reserv|precio|horario|cena|restaurante)/.test(s)) return 'es';
if (/(réserv|prix|horaire|dîner|restaurant)/i.test(s)) return 'fr';
if (/(reserv|preis|öffnungs|abendessen|restaurant|zimmer)/i.test(s)) return 'de';
return 'en';
}
/* ===== Consent + session ===== */
const ASKIVIO_LS_CONSENT_KEY = 'AskivioConsentV1';
const ASKIVIO_LS_SID_KEY = 'AskivioSID';
function askivioGetSID(){
let sid = localStorage.getItem(ASKIVIO_LS_SID_KEY);
if (!sid) {
sid = (crypto && crypto.randomUUID) ? crypto.randomUUID()
: 'sid-' + Math.random().toString(36).slice(2) + Date.now().toString(36);
localStorage.setItem(ASKIVIO_LS_SID_KEY, sid);
}
return sid;
}
function askivioGetConsent(){
const v = localStorage.getItem(ASKIVIO_LS_CONSENT_KEY);
return (v === 'yes' || v === 'no') ? v : null;
}
function askivioSetConsent(ok){ localStorage.setItem(ASKIVIO_LS_CONSENT_KEY, ok ? 'yes' : 'no'); }
function askivioConsentText(lang){
const t = {
en:{title:'Consent to improve the service', body:'Do you allow us to record this conversation for a limited time, only to improve answer quality?', agree:'Yes, I agree', deny:'No, thanks'},
ro:{title:'Consimțământ pentru îmbunătățirea serviciului', body:'Ne permiți să înregistrăm conversația pentru o perioadă limitată, exclusiv pentru a îmbunătăți calitatea răspunsurilor?', agree:'Da, sunt de acord', deny:'Nu, mulțumesc'},
it:{title:'Consenso', body:'Ci permetti di registrare la conversazione per un periodo limitato, solo per migliorare la qualità?', agree:'Sì, accetto', deny:'No, grazie'},
es:{title:'Consentimiento', body:'¿Nos permites registrar la conversación por un tiempo limitado, solo para mejorar la calidad?', agree:'Sí, acepto', deny:'No, gracias'},
fr:{title:'Consentement', body:'Autorisez-vous l’enregistrement temporaire de cette conversation pour améliorer la qualité ?', agree:'Oui, j’accepte', deny:'Non, merci'},
de:{title:'Einwilligung', body:'Erlauben Sie die zeitlich begrenzte Aufzeichnung des Gesprächs, nur zur Qualitätsverbesserung?', agree:'Ja, einverstanden', deny:'Nein, danke'},
};
return t[lang] || t.en;
}
function askivioRenderConsentBar(lang){
const t = askivioConsentText(lang);
return `