//br-script.js
document.addEventListener("DOMContentLoaded", function(){
var hasLocalizedObject=(
typeof br_ajax_obj!=="undefined"
&& typeof br_ajax_obj==="object"
&& br_ajax_obj!==null
);
var brConfig=hasLocalizedObject ? br_ajax_obj:{};
var brStrings=(brConfig.strings&&typeof brConfig.strings==="object") ? brConfig.strings:{};
var debugEnabled = !!brConfig.debug;
function debugLog(){
if(!debugEnabled||typeof window==="undefined"||!window.console){
return;
}
var logger=window.console["log"];
if(typeof logger==="function"){
logger.apply(window.console, arguments);
}}
function isAdminContext(){
return !!brConfig.is_admin;
}
function hasAjaxConfig(){
return (
typeof brConfig.ajax_url==="string"
&& brConfig.ajax_url!==""
&& typeof brConfig.nonce==="string"
&& brConfig.nonce!==""
&& typeof brConfig.post_id!=="undefined"
&& brConfig.post_id!==null
&& brConfig.post_id!==""
);
}
var readerContainers=document.querySelectorAll(".blog-reader-container");
if(!readerContainers.length){
return;
}
if(brConfig.versions){
debugLog("BOTSAUTO reader assets", brConfig.versions);
}
function getChecklistToken(){
var urlParams=new URLSearchParams(window.location.search);
return urlParams.get("botsauto_edit")||"";
}
function getString(key, fallback){
if(typeof brStrings[key]==="string"&&brStrings[key]!==""){
return brStrings[key];
}
return fallback;
}
function setButtonLabel(button, text){
if(!button){
return;
}
var labelNode=button.querySelector(".blog-reader-button-label");
if(labelNode){
labelNode.textContent=text;
}else{
button.textContent=text;
}}
function setStatus(element, message, type){
if(!element){
return;
}
element.textContent=message||"";
element.classList.remove("is-info", "is-success", "is-warning", "is-error");
if(message&&type){
element.classList.add(type);
}}
function getErrorMessageFromResponse(data){
if(typeof data==="string"&&data){
return data;
}
if(data&&typeof data==="object"&&data.message){
return data.message;
}
return getString("unknownError", "Onbekende fout");
}
function getContainerElement(container, selectors){
for (var i=0; i < selectors.length; i++){
var element=container.querySelector(selectors[i]);
if(element){
return element;
}}
return null;
}
function ensureAjaxConfig(setStatusFn){
if(hasAjaxConfig()){
return true;
}
console.error("Missing br_ajax_obj localization data required for reader requests.");
if(typeof setStatusFn==="function"){
setStatusFn(
getString("configMissing", "Audio-configuratie ontbreekt. Herlaad de pagina en probeer opnieuw."),
"is-error"
);
}
return false;
}
readerContainers.forEach(function(container){
var readBtn=getContainerElement(container, ['[data-br-role="read-button"]', ".blog-reader-read-btn", "#br-read-btn"]);
var languageSelect=getContainerElement(container, ['[data-br-role="language-select"]', ".blog-reader-language-select", "#br-language-select"]);
var audioElement=getContainerElement(container, ['[data-br-role="audio-element"]', ".blog-reader-audio", "#br-audio"]);
var audioPlayerWrapper=getContainerElement(container, ['[data-br-role="audio-player"]', ".blog-reader-audio-player"]);
var customPromptTextarea=getContainerElement(container, ['[data-br-role="custom-prompt"]', "#br-custom-prompt", "#br_custom_prompt"]);
var guidingThreadTextarea=getContainerElement(container, ['[data-br-role="guiding-thread-textarea"]', "#br-audio-guiding-thread", "#br_audio_guiding_thread"]);
var audioVariantSelect=getContainerElement(container, ['[data-br-role="audio-variant-select"]', "#br-audio-variant-override", "#br_audio_variant_override"]);
var resetPromptBtn=getContainerElement(container, ['[data-br-role="reset-prompt-button"]', "#br-reset-prompt-btn"]);
var saveGuidingThreadBtn=getContainerElement(container, ['[data-br-role="save-guiding-thread-button"]', "#br-save-guiding-thread-btn"]);
var guidingThreadStatus=getContainerElement(container, ['[data-br-role="guiding-thread-status"]', "#br-guiding-thread-status"]);
var readerStatus=getContainerElement(container, ['[data-br-role="reader-status"]', "#br-reader-status"]);
function setReaderStatus(message, type){
setStatus(readerStatus, message, type);
}
function setGuidingThreadStatus(message, type){
setStatus(guidingThreadStatus, message, type);
}
if(audioPlayerWrapper){
if(!audioElement||!audioElement.getAttribute("src")){
audioPlayerWrapper.hidden=true;
}}else if(audioElement&&!audioElement.getAttribute("src")){
audioElement.style.display="none";
}
if(resetPromptBtn
&& isAdminContext()
&& typeof brConfig.default_prompt==="string"
&& brConfig.default_prompt!==""
){
resetPromptBtn.addEventListener("click", function(e){
e.preventDefault();
if(customPromptTextarea){
customPromptTextarea.value=brConfig.default_prompt;
}});
}
if(saveGuidingThreadBtn&&isAdminContext()&&guidingThreadTextarea){
saveGuidingThreadBtn.addEventListener("click", function(e){
e.preventDefault();
if(!ensureAjaxConfig(setGuidingThreadStatus)){
return;
}
saveGuidingThreadBtn.disabled=true;
saveGuidingThreadBtn.textContent=getString("savingAudioSettings", "Instellingen opslaan...");
setGuidingThreadStatus("", "is-info");
var requestParams={
action: "br_save_audio_guiding_thread",
nonce: brConfig.nonce,
post_id: brConfig.post_id,
guiding_thread: guidingThreadTextarea.value||"",
audio_variant_override_id: audioVariantSelect ? (audioVariantSelect.value||""):""
};
var checklistToken=getChecklistToken();
if(checklistToken){
requestParams.botsauto_edit=checklistToken;
}
fetch(brConfig.ajax_url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
},
body: new URLSearchParams(requestParams)
})
.then(function(response){
return response.json();
})
.then(function(data){
if(data&&data.success){
if(data.data&&data.data.audio_variant_override_warning){
setGuidingThreadStatus(data.data.audio_variant_override_warning, "is-warning");
}else{
var successMessage=(data.data&&data.data.message) ? data.data.message:getString("audioSettingsSaved", "Audio-instellingen opgeslagen.");
setGuidingThreadStatus(successMessage, "is-success");
}}else{
var errorMessage=getString("guidingThreadSaveFailed", "Rode draad kon niet worden opgeslagen.");
if(data&&data.data&&data.data.message){
errorMessage=data.data.message;
}
setGuidingThreadStatus(errorMessage, "is-error");
}})
.catch(function(error){
console.error("Guiding thread save failed:", error);
setGuidingThreadStatus(
getString("guidingThreadSaveFailed", "Rode draad kon niet worden opgeslagen.") + " " + error.message,
"is-error"
);
})
.finally(function(){
saveGuidingThreadBtn.disabled=false;
saveGuidingThreadBtn.textContent=getString("saveAudioSettings", "Audio-instellingen opslaan");
});
});
}
if(!(readBtn&&languageSelect&&audioElement)){
console.error("Missing reader elements in container (button/select/audio).");
return;
}
readBtn.addEventListener("click", function(e){
e.preventDefault();
readBtn.disabled=true;
setButtonLabel(readBtn, getString("generating", "Audio wordt gegenereerd..."));
setReaderStatus(getString("generating", "Audio wordt gegenereerd..."), "is-info");
var selectedLanguage=languageSelect.value;
if(!selectedLanguage){
readBtn.disabled=false;
setButtonLabel(readBtn, getString("listen", "Luister"));
setReaderStatus(getString("noLanguageSelected", "Kies eerst een taal."), "is-warning");
return;
}
if(!ensureAjaxConfig(setReaderStatus)){
readBtn.disabled=false;
setButtonLabel(readBtn, getString("listen", "Luister"));
return;
}
debugLog("Selected language:", selectedLanguage);
var botsautoToken=getChecklistToken();
var requestParams={
action: "br_generate_audio",
nonce: brConfig.nonce,
post_id: brConfig.post_id,
language: selectedLanguage
};
if(botsautoToken){
requestParams.botsauto_edit=botsautoToken;
}
if(isAdminContext()&&customPromptTextarea&&customPromptTextarea.value.trim()){
requestParams.custom_prompt=customPromptTextarea.value.trim();
debugLog("Using custom prompt from admin override");
}
if(isAdminContext()&&guidingThreadTextarea){
requestParams.custom_guiding_thread=guidingThreadTextarea.value||"";
}
fetch(brConfig.ajax_url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
},
body: new URLSearchParams(requestParams)
})
.then(function(response){
debugLog("Raw response:", response);
return response.json();
})
.then(function(data){
debugLog("Audio generation response:", data);
if(data&&data.success){
if(data.data&&Array.isArray(data.data.warnings)&&data.data.warnings.length){
setReaderStatus(data.data.warnings.join(" "), "is-warning");
}else{
setReaderStatus(getString("audioReady", "Audio staat klaar en wordt afgespeeld."), "is-success");
}
if(!(data.data&&data.data.audio_url)){
console.error("Audio generation succeeded without audio_url.", data ? data.data:null);
setReaderStatus(getString("unknownError", "Onbekende fout"), "is-error");
return;
}
audioElement.src=data.data.audio_url;
if(audioPlayerWrapper){
audioPlayerWrapper.hidden=false;
}else{
audioElement.style.display="block";
}
var playPromise=audioElement.play();
if(playPromise&&typeof playPromise.catch==="function"){
playPromise.catch(function(playError){
debugLog("Audio playback did not start automatically:", playError);
setReaderStatus(getString("audioReady", "Audio staat klaar. Klik op afspelen om te luisteren."), "is-info");
});
}}else{
console.error("Audio generation failed:", data&&data.data ? data.data:data);
var errorMessage=getErrorMessageFromResponse(data ? data.data:null);
if(data&&data.data&&data.data.code){
console.error("Audio generation error code:", data.data.code);
}
setReaderStatus(getString("errorPrefix", "Fout:") + " " + errorMessage, "is-error");
}})
.catch(function(error){
console.error("AJAX error:", error);
setReaderStatus(getString("errorPrefix", "Fout:") + " " + error.message, "is-error");
})
.finally(function(){
readBtn.disabled=false;
setButtonLabel(readBtn, getString("listen", "Luister"));
});
});
});
});