// utils.js — общие хелперы: _esc, busy lock, validateJson, лог-панель
function _esc(s){
/* HTML-экранирование: " → " & → & < → < */
return String(s||'').replace(/&/g,'&').replace(/"/g,'"').replace(/{
const el=document.getElementById('log-panel');
if(!el||el.style.display==='none') return;
try{
const r=await fetch('/api/log');
const lines=await r.json();
el.innerHTML=lines.map(l=>`
${_esc(l)}
`).join('');
el.scrollTop=el.scrollHeight;
}catch(e){}
},2000);
}
function toggleLog(){
const el=document.getElementById('log-panel');
if(!el) return;
if(el.style.display==='none'){ el.style.display='block'; startLogPoll(); }
else el.style.display='none';
}
function relativeTime(iso) {
if (!iso) return '-';
const d = new Date(iso);
if (isNaN(d.getTime())) return '-';
const sec = Math.floor((Date.now() - d.getTime()) / 1000);
if (sec < 0) return 'только что';
if (sec < 60) return sec + 'с';
const min = Math.floor(sec / 60);
if (min < 60) return min + 'м';
const hr = Math.floor(min / 60);
if (hr < 24) return hr + 'ч ' + (min % 60) + 'м';
const days = Math.floor(hr / 24);
return days + 'д ' + (hr % 24) + 'ч';
}