(function ($){
'use strict';
function applyVisibility(){
var S=window.CTF_Settings;
if(!S) return;
if(!parseInt(S.show_timer||'1')){ var t=document.getElementById('ctf-timer-trigger'); if(t) t.style.display='none'; }
if(!parseInt(S.show_favs||'1')){ var f=document.getElementById('ctf-fav-trigger');   if(f) f.style.display='none'; }
if(!parseInt(S.show_radio||'1')){ var r=document.getElementById('ctf-radio-trigger'); if(r) r.style.display='none'; }
if(!parseInt(S.show_quiz||'1')){ var q=document.getElementById('ctf-quiz-trigger');  if(q) q.style.display='none'; }
if(!parseInt(S.show_heart||'1')){ var h=document.getElementById('ctf-heart-wrap');    if(h) h.style.display='none'; }
if(!parseInt(S.show_listeners||'1')){
var ls=document.querySelectorAll('.ct-listeners'); ls.forEach(function(el){ el.style.display='none'; });
}}
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', applyVisibility);
}else{
applyVisibility();
}
var CTF=window.CTF||{};
function storageGet(key, fallback){
try { var v=localStorage.getItem(key); return v!==null ? JSON.parse(v):fallback; }
catch(e){ return fallback; }}
function storageSet(key, val){
try { localStorage.setItem(key, JSON.stringify(val)); } catch(e){}}
var FAV_KEY='ct_favourites';
function getFavs(){ return storageGet(FAV_KEY, []); }
function saveFavs(favs){ storageSet(FAV_KEY, favs); }
function isFav(id){ return getFavs().some(function(f){ return String(f.id)===String(id); });}
function addFav(data){
var favs=getFavs();
data.id=String(data.id);
if(!isFav(data.id)){ favs.unshift(data); saveFavs(favs); }}
function removeFav(id){
saveFavs(getFavs().filter(function(f){ return String(f.id)!==String(id); }));
}
function updateHeartBtn(){
var btn=$('#ctf-heart-btn');
if(!btn.length) return;
var pid=String(btn.attr('data-track-id')||btn.data('track-id')||CTF.post_id||'');
if(!pid) return;
btn.toggleClass('saved', isFav(pid));
}
$(document).on('click', '#ctf-heart-btn', function(){
var pid=String($(this).attr('data-track-id')||$(this).data('track-id')||CTF.post_id||'');
if(!pid) return;
if(isFav(pid)){
removeFav(pid);
$(this).removeClass('saved');
}else{
var thumb=$('.ct-hero-thumb').css('background-image').replace(/url\(["']?|["']?\)/g,'')||'';
var cat=$('.ct-category-badge').first().text().trim();
var title=$('#ct-track-title').text().trim()||CTF.post_title||document.title;
addFav({ id: pid, title: title, url: window.location.href, thumb: thumb, cat: cat });
$(this).addClass('saved').addClass('saved-pulse');
setTimeout(function(){ $('#ctf-heart-btn').removeClass('saved-pulse'); }, 400);
}
updateHeartBtn();
});
var activePanelId=null;
function openPanel(id){
$('.ctf-panel').prop('hidden', true);
$('.ctf-trigger').removeClass('active');
if(activePanelId===id){ activePanelId=null; return; }
$('#' + id).prop('hidden', false);
activePanelId=id;
}
function closePanel(id){
$('#' + id).prop('hidden', true);
if(activePanelId===id) activePanelId=null;
}
$('#ctf-fav-trigger').on('click',   function(){ openPanel('ctf-fav-panel');   renderFavourites(); });
$('#ctf-timer-trigger').on('click', function(){ openPanel('ctf-timer-panel'); });
$('#ctf-radio-trigger').on('click', function(){ openPanel('ctf-radio-panel'); });
$('#ctf-quiz-trigger').on('click',  function(){ openPanel('ctf-quiz-panel');  });
$(document).on('click', '.ctf-panel__close', function(){
closePanel($(this).data('panel'));
activePanelId=null;
$('.ctf-trigger').removeClass('active');
});
$(document).on('click', function(e){
if(!$(e.target).closest('.ctf-bar').length){
$('.ctf-panel').prop('hidden', true);
activePanelId=null;
$('.ctf-trigger').removeClass('active');
}});
function renderFavourites(){
var favs=getFavs();
var list=$('#ctf-fav-list');
list.empty();
if(!favs.length){
list.html('<p class="ctf-empty">No favourites yet. Heart a track to save it here.</p>');
return;
}
favs.forEach(function(f){
var item=$('<a>', { href: f.url, class: 'ctf-fav-item' });
item.append($('<div>', { class: 'ctf-fav-thumb', css: f.thumb ? { backgroundImage: 'url(' + f.thumb + ')' }:{}}));
var info=$('<div>', { class: 'ctf-fav-info' });
info.append($('<span>', { class: 'ctf-fav-title', text: f.title }));
if(f.cat) info.append($('<span>', { class: 'ctf-fav-cat', text: f.cat }));
item.append(info);
var rm=$('<button>', { class: 'ctf-fav-remove', html: '&times;', 'aria-label': 'Remove' });
rm.on('click', function(e){
e.preventDefault();
e.stopPropagation();
removeFav(String(f.id));
renderFavourites();
updateHeartBtn();
});
item.append(rm);
list.append(item);
});
}
$('#ctf-fav-clear').on('click', function(){
if(confirm('Clear all favourites?')){
saveFavs([]);
renderFavourites();
updateHeartBtn();
}});
updateHeartBtn();
var timerInterval=null;
var timerRemaining=0;
var timerFadeStart=(window.CTF_Settings&&CTF_Settings.timer_fade_secs) ? parseInt(CTF_Settings.timer_fade_secs, 10):60;
function formatTime(secs){
var m=Math.floor(secs / 60);
var s=secs % 60;
return (m < 10 ? '0':'') + m + ':' + (s < 10 ? '0':'') + s;
}
function stopTimer(){
clearInterval(timerInterval);
timerInterval=null;
timerRemaining=0;
$('#ctf-timer-active').prop('hidden', true);
$('#ctf-timer-countdown').text('00:00');
$('.ctf-timer-btn').removeClass('selected');
var audio=document.getElementById('ct-audio');
if(audio){
var saved=parseFloat(document.cookie.match(/ct_volume=([^;]*)/)?.[1]||'0.28');
audio.volume=Math.min(1, Math.max(0, saved));
}}
function startTimer(mins){
clearInterval(timerInterval);
timerRemaining=mins * 60;
$('#ctf-timer-active').prop('hidden', false);
$('#ctf-timer-countdown').text(formatTime(timerRemaining));
timerInterval=setInterval(function(){
timerRemaining--;
$('#ctf-timer-countdown').text(formatTime(timerRemaining));
var audio=document.getElementById('ct-audio');
if(audio&&timerRemaining <=timerFadeStart){
audio.volume=Math.max(0, audio.volume - (audio.volume / timerFadeStart));
}
if(timerRemaining <=0){
clearInterval(timerInterval);
timerInterval=null;
if(audio){ audio.pause(); audio.volume=0; }
$('#ctf-timer-active').prop('hidden', true);
var n=$('<div>', {
text: '💤 Sleep timer ended. Goodnight!',
css: { position:'fixed', bottom:'5rem', left:'50%', transform:'translateX(-50%)',
background:'#141a22', border:'1px solid rgba(119,201,211,0.3)', borderRadius:'8px',
padding:'0.75rem 1.5rem', color:'#eaf0f6', fontSize:'0.88rem',
zIndex: 10000, whiteSpace:'nowrap' }});
$('body').append(n);
setTimeout(function(){ n.fadeOut(600, function(){ n.remove(); });}, 4000);
}}, 1000);
}
$(document).on('click', '.ctf-timer-btn', function(){
var mins=parseInt($(this).data('mins'), 10);
$('.ctf-timer-btn').removeClass('selected');
$(this).addClass('selected');
startTimer(mins);
});
$('#ctf-timer-cancel').on('click', stopTimer);
var radioAudio=document.getElementById('ctf-radio-audio');
var radioPlaying=false;
var radioCurrentId=0;
var radioCat='';
$('.ctf-cat-btn').on('click', function(){
$('.ctf-cat-btn').removeClass('active');
$(this).addClass('active');
radioCat=$(this).data('cat')||'';
if(radioPlaying) loadNextRadioTrack();
});
function loadNextRadioTrack(){
$.post(CTF.ajax_url, {
action:  'ctf_radio_next',
nonce:   CTF.nonce,
cat:     radioCat,
exclude: radioCurrentId
}, function(res){
if(!res.success||!res.data.track_url) return;
var d=res.data;
radioCurrentId=d.id;
$('#ctf-radio-title').text(d.title);
$('#ctf-radio-link').attr('href', d.url);
if(d.thumb) $('#ctf-radio-thumb').css('background-image', 'url(' + d.thumb + ')');
$('#ctf-radio-now').prop('hidden', false);
radioAudio.src=d.track_url;
radioAudio.load();
radioAudio.play().catch(function(){});
});
}
if(radioAudio){
radioAudio.addEventListener('ended', function(){
if(radioPlaying) loadNextRadioTrack();
});
}
$('#ctf-radio-play').on('click', function(){
radioPlaying=true;
$(this).prop('hidden', true);
$('#ctf-radio-skip, #ctf-radio-stop').prop('hidden', false);
loadNextRadioTrack();
});
$('#ctf-radio-skip').on('click', function(){ loadNextRadioTrack(); });
$('#ctf-radio-stop').on('click', function(){
radioPlaying=false;
radioCurrentId=0;
if(radioAudio){ radioAudio.pause(); radioAudio.src=''; }
$('#ctf-radio-play').prop('hidden', false);
$('#ctf-radio-skip, #ctf-radio-stop').prop('hidden', true);
$('#ctf-radio-now').prop('hidden', true);
});
var quizMap={
'stressed-sleep-nature':    'nature',
'stressed-sleep-any':       'nature',
'stressed-meditate-eastern':'oriental',
'stressed-meditate-any':    'relax',
'stressed-relax-any':       'relax',
'tired-sleep-any':          'relax',
'tired-sleep-classical':    'classic',
'focused-work-classical':   'classic',
'focused-work-eastern':     'oriental',
'focused-work-any':         'relax',
'focused-meditate-eastern': 'oriental',
'happy-relax-nature':       'nature',
'happy-relax-classical':    'classic',
};
var quizAnswers={};
var currentStep=1;
function quizCategoryFor(answers){
var key=[answers.mood, answers.activity, answers.style].join('-');
if(quizMap[key]) return quizMap[key];
if(answers.style==='nature')   return 'nature';
if(answers.style==='classical') return 'classic';
if(answers.style==='eastern')  return 'oriental';
if(answers.activity==='sleep') return 'relax';
if(answers.activity==='work')  return 'classic';
return 'relax';
}
$(document).on('click', '.ctf-quiz-opt', function(){
var key=$(this).data('key');
var val=$(this).data('val');
quizAnswers[key]=val;
if(currentStep < 3){
$('#ctf-quiz-step-' + currentStep).prop('hidden', true);
currentStep++;
$('#ctf-quiz-step-' + currentStep).prop('hidden', false);
}else{
$('.ctf-quiz-step').prop('hidden', true);
var cat=quizCategoryFor(quizAnswers);
$.post(CTF.ajax_url, { action: 'ctf_mood_tracks', nonce: CTF.nonce, cat: cat }, function(res){
var container=$('#ctf-quiz-tracks').empty();
if(res.success&&res.data.length){
res.data.forEach(function(t){
var item=$('<a>', { href: t.url, class: 'ctf-quiz-track' });
item.append($('<div>', { class: 'ctf-quiz-track-thumb', css: t.thumb ? { backgroundImage: 'url(' + t.thumb + ')' }:{}}));
item.append($('<span>', { class: 'ctf-quiz-track-title', text: t.title }));
item.append($('<span>', { class: 'ctf-quiz-track-play', html: '<svg viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg>' }));
container.append(item);
});
}
$('#ctf-quiz-result').prop('hidden', false);
});
}});
$('#ctf-quiz-restart').on('click', function(){
quizAnswers={}; currentStep=1;
$('#ctf-quiz-result').prop('hidden', true);
$('.ctf-quiz-step').prop('hidden', true);
$('#ctf-quiz-step-1').prop('hidden', false);
});
$(document).on('click', '.ct-faq-q', function(){
var expanded=$(this).attr('aria-expanded')==='true';
$(this).attr('aria-expanded', !expanded);
$(this).next('.ct-faq-a').prop('hidden', expanded);
});
}(jQuery));