';
else lib.innerHTML=arc.slice().reverse().map(function(a,i){
var msgs=Array.isArray(a.messages)?a.messages:[];
var body=msgs.map(function(m){var role=m.role==="host"?"\u0412\u0415\u0414\u0423\u0429\u0418\u0419":"\u0413\u041e\u0421\u0422\u042c";return ''+role+'
';return;}
log.innerHTML=radioState.messages.map(function(m){
var who=String(m.userId||"");
var kind=m.speaker || (m.role==="guest"?"guest":(who===String(radioState.cohostId||"")?"cohost":"host"));
if(kind==="system")return ''+esc(m.time||"")+''+esc(m.text||"")+'';
if(kind==="owner"||kind==="editor")kind=(who===String(radioState.cohostId||""))?"cohost":"host";
var label=kind==="guest"?"\u0413\u041e\u0421\u0422\u042c":(kind==="cohost"?"\u0421\u041e\u0412\u0415\u0414\u0423\u0429\u0418\u0419":"\u0412\u0415\u0414\u0423\u0429\u0418\u0419");
var sig=kind==="guest"?"G":(kind==="cohost"?"CO":"MIC");
return '
'+saRadioAvatarHtml(who,kind)+'
'+label+'ID '+esc(who)+'
'+esc(m.text||"")+'
';
}).join("");
saRadioHydrateAvatars(log);
log.scrollTop=log.scrollHeight;
}
function saRadioRefresh(){
var ae=document.activeElement;
if(ae && studio.contains(ae) && /^(INPUT|TEXTAREA|BUTTON)$/.test(ae.tagName))return;
if(radioBusy)return;
radioBusy=true;
apiGet().then(function(all){radioState=normalizeRadio(all[RADIO_FIELD]);renderStudio();}).catch(function(){}).then(function(){radioBusy=false;});
}
function mutateRadio(mutator){
if(radioBusy)return new Promise(function(resolve,reject){
setTimeout(function(){mutateRadio(mutator).then(resolve,reject);},180);
});
radioBusy=true;
return apiGet().then(function(all){
var r=normalizeRadio(all[RADIO_FIELD]);mutator(r);all[RADIO_FIELD]=r;
return apiSetFull(all).then(function(){return apiGet();});
}).then(function(all2){radioState=normalizeRadio(all2[RADIO_FIELD]);renderStudio();}).catch(function(e){
var st=studio.querySelector(".sa-save-state");st.textContent="\u041e\u0428\u0418\u0411\u041a\u0410 \u0421\u041e\u0425\u0420\u0410\u041d\u0415\u041d\u0418\u042f";
var er=studio.querySelector(".sa-live-error");er.textContent="LIVE API: "+(e&&e.message?e.message:"ERROR");er.classList.add("show");
}).then(function(){radioBusy=false;});
}
studio.querySelector(".sa-set-cast").addEventListener("click",function(){
if(!isRadioEditor())return;
var h=String(parseInt(studio.querySelector(".sa-host-id").value,10)||"");
var c=String(parseInt(studio.querySelector(".sa-cohost-id").value,10)||"");
var g=String(parseInt(studio.querySelector(".sa-guest-id").value,10)||"");
var st=studio.querySelector(".sa-save-state");
if(st)st.textContent="SAVING...";
mutateRadio(function(r){r.hostId=h;r.cohostId=c;r.guestId=g;}).then(function(){
if(st)st.textContent="SAVED";
setTimeout(function(){if(st)st.textContent="";},1400);
});
});
studio.querySelector(".sa-send").addEventListener("click",function(){
var uid=myId(), host=uid&&uid===String(radioState.hostId||""), cohost=uid&&uid===String(radioState.cohostId||""), invited=uid&&uid===String(radioState.guestId||"");
if(!(host||cohost||invited))return;
var ta=studio.querySelector(".sa-compose textarea"), txt=(ta.value||"").trim();if(!txt)return;
var now=new Date(), hh=String(now.getHours()).padStart(2,"0"), mm=String(now.getMinutes()).padStart(2,"0");
mutateRadio(function(r){r.messages.push({id:String(Date.now())+"_"+uid,userId:uid,role:invited?"guest":"host",speaker:invited?"guest":(cohost?"cohost":"host"),time:hh+":"+mm,text:txt});r.messages=r.messages.slice(-120);}).then(function(){ta.value="";});
});
studio.querySelector(".sa-add-editor").addEventListener("click",function(){
if(!isAdmin())return;
var id=String(parseInt(studio.querySelector(".sa-editor-id").value,10)||"");
if(!id)return;
mutateRadio(function(r){
r.editors=Array.isArray(r.editors)?r.editors.map(String):[];
if(r.editors.indexOf(id)===-1)r.editors.push(id);
}).then(function(){studio.querySelector(".sa-editor-id").value="";});
});
studio.querySelector(".sa-jingle").addEventListener("click",function(){
if(!isRadioEditor())return;mutateRadio(function(r){r.messages.push({id:String(Date.now())+"_sys",userId:"",role:"system",speaker:"system",time:new Date().toLocaleTimeString([], {hour:"2-digit",minute:"2-digit"}),text:"101.7 FM // STATION IDENT // RADIO SAN AVELIO"});r.messages=r.messages.slice(-120);});
});
studio.querySelector(".sa-breaking").addEventListener("click",function(){
if(!isRadioEditor())return;var txt=(studio.querySelector(".sa-breaking-text").value||"").trim();
mutateRadio(function(r){var on=!(r.breakNews&&r.breakNews.active);r.breakNews={active:on,text:on?(txt||"BREAKING NEWS"):((r.breakNews&&r.breakNews.text)||"")};});
});
studio.querySelectorAll(".sa-reactions [data-react]").forEach(function(b){b.addEventListener("click",function(){
var k=b.getAttribute("data-react"),uid=myId();if(!uid)return;
mutateRadio(function(r){
r.reactions=r.reactions||{signal:0,star:0,heart:0};r.reactionUsers=r.reactionUsers||{signal:[],star:[],heart:[]};
var a=Array.isArray(r.reactionUsers[k])?r.reactionUsers[k]:[];
if(a.indexOf(uid)!==-1)return;
a.push(uid);r.reactionUsers[k]=a.slice(-500);r.reactions[k]=(parseInt(r.reactions[k],10)||0)+1;
});
});});
studio.querySelector(".sa-add-track").addEventListener("click",function(){
if(!isRadioEditor())return;
var title=(studio.querySelector(".sa-track-title").value||"").trim(), url=(studio.querySelector(".sa-track-url").value||"").trim();
if(!url)return;
if(!/^https?:\/\//i.test(url)){var st=studio.querySelector(".sa-audio-state");if(st)st.textContent="BAD URL";return;}
mutateRadio(function(r){
var track={title:title||"TRACK",url:url};
r.playlist.push(track);r.playlist=r.playlist.slice(-30);
r.nowPlaying={title:track.title,url:track.url};
}).then(function(){
studio.querySelector(".sa-track-title").value="";
studio.querySelector(".sa-track-url").value="";
var st=studio.querySelector(".sa-audio-state");if(st)st.textContent="READY";
});
});
studio.querySelector(".sa-toggle-air").addEventListener("click",function(){
if(!isRadioEditor())return;mutateRadio(function(r){r.onAir=!r.onAir;});
});
studio.querySelector(".sa-listen").addEventListener("click",function(){
var a=studio.querySelector(".sa-audio"),st=studio.querySelector(".sa-audio-state"),btn=this;
var u=(radioState.nowPlaying&&radioState.nowPlaying.url)||"";
if(u && saMediaKind(u)!=="audio"){if(st)st.textContent="EXTERNAL / OPEN LINK";return;}
if(!u){if(st)st.textContent="NO TRACK";return;}
if(a.getAttribute("data-url")!==u){a.src=u;a.setAttribute("data-url",u);a.load();}
if(!a.paused){a.pause();btn.textContent="\u25b6 \u041f\u0423\u0421\u041a";if(st)st.textContent="PAUSED";return;}
if(st)st.textContent="CONNECTING...";
a.play().then(function(){btn.textContent="\u2161 \u041f\u0410\u0423\u0417\u0410";if(st)st.textContent="PLAYING";}).catch(function(e){
btn.textContent="\u25b6 \u041f\u0423\u0421\u041a";
if(st)st.textContent="PLAY ERROR "+((e&&e.name)?e.name:"MEDIA");
});
});
(function(){
var a=studio.querySelector(".sa-audio"),st=studio.querySelector(".sa-audio-state"),btn=studio.querySelector(".sa-listen");
if(!a)return;
a.addEventListener("canplay",function(){if(st&&a.paused)st.textContent="READY";});
a.addEventListener("playing",function(){if(st)st.textContent="PLAYING";if(btn)btn.textContent="\u2161 \u041f\u0410\u0423\u0417\u0410";});
a.addEventListener("pause",function(){if(st&&a.currentTime>0&&!a.ended)st.textContent="PAUSED";if(btn)btn.textContent="\u25b6 \u041f\u0423\u0421\u041a";});
a.addEventListener("ended",function(){if(st)st.textContent="ENDED";if(btn)btn.textContent="\u25b6 \u041f\u0423\u0421\u041a";});
a.addEventListener("error",function(){
var code=a.error&&a.error.code, msg=code===2?"NETWORK":code===3?"DECODE":code===4?"SOURCE":"MEDIA";
if(st)st.textContent="AUDIO ERROR / "+msg;
if(btn)btn.textContent="\u25b6 \u041f\u0423\u0421\u041a";
});
})();
var qsend=studio.querySelector(".sa-question-send");
if(qsend)qsend.addEventListener("click",function(){
var ta=studio.querySelector(".sa-question-text"),txt=(ta.value||"").trim(),uid=myId();if(!txt||!uid)return;
mutateRadio(function(r){r.questions.push({id:String(Date.now()),userId:uid,text:txt});r.questions=r.questions.slice(-40);}).then(function(){ta.value="";});
});
studio.querySelector(".sa-library-btn").addEventListener("click",function(){
studio.querySelector(".sa-library").classList.toggle("open");
});
studio.querySelector(".sa-finish").addEventListener("click",function(){
if(!isRadioEditor() || !radioState.messages.length)return;
mutateRadio(function(r){
var d=new Date();
r.archive.push({id:String(Date.now()),title:r.title||"\u0413\u043e\u0441\u0442\u044c \u0432\u0435\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u044d\u0444\u0438\u0440\u0430",date:String(d.getDate()).padStart(2,"0")+"."+String(d.getMonth()+1).padStart(2,"0")+"."+d.getFullYear(),messages:r.messages.slice()});
r.archive=r.archive.slice(-50);r.messages=[];r.guestId="";r.hostId="";r.cohostId="";
});
});
saRadioRefresh();
setInterval(function(){if(studio.classList.contains("open"))saRadioRefresh();},3000);
}
function boot(){
mount();
var tries=0;
var timer=setInterval(function(){
mount();
if(++tries>20 || document.querySelector("#sa-radio-mount"))clearInterval(timer);
},250);
}
if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",boot);
else boot();
})();