function csdata(e){
e=e.replace(/^[^a-zA-Z]+|[^a-zA-Z]+$/g, "");
e=e.replace(/^'+|'+$/g, "");
e=encodeURIComponent(e);
setTimeout(()=> {
if(jQuery('.gloss_dt').length===0&&jQuery('.gloss_banner').length===0){
const banner=`
<div class="gloss_banner"
style="width: auto; height: 50px; margin-bottom: 10px; display: flex; align-items: center; justify-content: center; border-radius: 10px; overflow: hidden; background: linear-gradient(90deg, #4facfe, #00f2fe); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); transition: transform 0.3s;">
<img src="https://placehold.co/150x50"
alt="Placeholder"
style="width: 100%; height: 100%; object-fit: cover; filter: brightness(90%);">
</div>
`;
const glossaryLink=`
<div>
<div class="gloss_dt">
<a class="cstm_save" data-word="${e}" href="#"
style="display: inline-block; padding: 10px 20px; font-size: 14px; font-weight: bold; text-transform: uppercase; text-decoration: none; color: white; background: linear-gradient(90deg, #ff7e5f, #feb47b); border-radius: 25px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: transform 0.2s, box-shadow 0.2s;">
Add To Glossary
</a>
<a class="speak_now" data-word="${e}" href="#"
style="display: inline-flex; align-items: center; gap: 8px; padding: 10px 20px; font-size: 14px; font-weight: bold; text-transform: uppercase; text-decoration: none; color: white; background: linear-gradient(90deg, #3db9ff, #72dfff); border-radius: 25px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: transform 0.2s, box-shadow 0.2s;">
<span style="font-size: 24px;">&#128264;</span>
<span>Play</span>
</a>
</div>
<div style="display: flex; gap: 20px; margin-bottom: 15px;">
<a class="find_image" data-word="${e}" href="#"
onclick="sendKeywordToReq('${e}'); return false;"
style="font-size: 14px; text-decoration: none; color: #1E90FF;"> <!-- nice trustworthy blue -->
Word Formation & Synonyms!
</a>
<a class="find_image" data-word="${e}" href="#"
onclick="showImages('${e}'); return false;"
style="font-size: 14px; text-decoration: none; color: orange;">
Find an image related to the word!
</a>
</div>
</div>
`;
jQuery('.wpapi_selection_container').after(banner + glossaryLink);
}}, 1500);
}
document.addEventListener("DOMContentLoaded", function (){
const modalHTML=`
<div id="imageModal" style="display:none; position:fixed; top:10%; left:50%; transform:translateX(-50%);
background:#fff; padding:20px; border:1px solid #ccc; box-shadow:0 4px 8px rgba(0,0,0,0.1); z-index:9999;">
<div id="imageResults" style="display:flex; gap:10px; flex-wrap:wrap;"></div>
<button onclick="closeModal()" style="margin-top:15px; padding:5px;">Close</button>
</div>
`;
document.body.insertAdjacentHTML('beforeend', modalHTML);
});
function closeCustomModal(){
document.getElementById("customModal").style.display="none";
jQuery("#customModal").fadeOut();
}
function sendKeywordToReq(tx){
jQuery('.footer_loader').addClass('act');
if(jQuery("#customModal").length===0){
let modalHTML=`
<div id="customModal" class="modal" style="display:none;">
<div class="modal-content">
<button
type="button"
class="modal-close"
aria-label="Close modal"
onclick="closeCustomModal(event)"
>
&times;
</button>
<div class="modal-body"></div>
</div>
</div>
`;
jQuery("body").append(modalHTML);
let modalCSS=`
<style id="customModalStyles">
.modal {
position: fixed;
top: 0; left: 0;
width: 100%; height: 100%;
background: rgba(0,0,0,0.5);
display: flex; align-items: flex-start; justify-content: center;
overflow-y: auto;
padding: 50px 10px; 
z-index: 999;
}
.modal-content {
background: #fff;
padding: 20px 25px;
border-radius: 10px;
width: 100%;
max-width: 600px;
max-height: 90vh;
overflow-y: auto;
box-shadow: 0px 4px 20px rgba(0,0,0,0.4);
position: relative;
animation: fadeIn 0.3s ease-in-out;
}
.modal-close {
position: absolute;
top: 15px;
right: 20px;
font-size: 26px;
font-weight: bold;
cursor: pointer;
background: none;
border: none;
padding: 0;
line-height: 1;
color: inherit;
z-index: 9999;       
pointer-events: auto; 
}
.modal-body {
line-height: 1.6;
}
@keyframes fadeIn {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }}
@media (max-width: 480px){
.modal-content {
padding: 15px 20px;
}}
</style>
`;
jQuery("head").append(modalCSS);
jQuery(document).on("click", "#customModal", function(e){
if(jQuery(e.target).is("#customModal")){
jQuery("#customModal").fadeOut();
}});
}
function showModalWithContent(htmlContent){
jQuery('#customModal .modal-body').html(htmlContent);
jQuery('#customModal').fadeIn();
}
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action: 'show_advanced',
keyword: tx,
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
jQuery('#customModal .modal-body').html("<p>" + response.message + "</p>");
jQuery('#customModal').fadeIn();
},
error: function(xhr, status, error){
jQuery('.footer_loader').removeClass('act');
jQuery('#customModal .modal-body').html("<p style='color:red;'>Something went wrong. Please try again.</p>");
jQuery('#customModal').fadeIn();
}});
}
async function showImages(word){
const apiKey='u5SE1yKVuCuvK6sx1s5WCMswZBj6eh9KGqswSdjd_m4';
const url=`https://api.unsplash.com/search/photos?query=${word}&client_id=${apiKey}&per_page=3`;
const imageContainer=document.getElementById('imageResults');
imageContainer.innerHTML='<p>Loading...</p>';
try {
const response=await fetch(url);
const data=await response.json();
const images=data.results;
imageContainer.innerHTML='';
if(!images.length){
imageContainer.innerHTML='<p>No images found.</p>';
}else{
images.forEach(img=> {
const image=document.createElement('img');
image.src=img.urls.thumb;
image.alt=img.alt_description||'Image';
image.style.width='100px';
image.style.height='100px';
image.style.objectFit='cover';
imageContainer.appendChild(image);
});
}
document.getElementById('imageModal').style.display='block';
} catch (err){
imageContainer.innerHTML='<p>Error loading images.</p>';
console.error('Error fetching images:', err);
}}
function closeModal(){
document.getElementById('imageModal').style.display='none';
}
function csdata_ORG(e){
console.log('test');
setTimeout(()=> {
const banner=`
<div class="gloss_banner"
style="width: auto; height: 50px; margin-bottom: 10px; display: flex; align-items: center; justify-content: center; border-radius: 10px; overflow: hidden; background: linear-gradient(90deg, #4facfe, #00f2fe); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); transition: transform 0.3s;">
<img src="https://placehold.co/150x50"
alt="Placeholder"
style="width: 100%; height: 100%; object-fit: cover; filter: brightness(90%);">
</div>
`;
const glossaryLink=`
<div class="gloss_dt">
<a class="cstm_save" data-word="${e}" href="#"
style="display: inline-block; padding: 10px 20px; font-size: 14px; font-weight: bold; text-transform: uppercase; text-decoration: none; color: white; background: linear-gradient(90deg, #ff7e5f, #feb47b); border-radius: 25px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: transform 0.2s, box-shadow 0.2s;">
Add To Glossary
</a>
<a class="speak_now" data-word="${e}" href="#"
style="display: inline-flex; align-items: center; gap: 8px; padding: 10px 20px; font-size: 14px; font-weight: bold; text-transform: uppercase; text-decoration: none; color: white; background: linear-gradient(90deg, #3db9ff, #72dfff); border-radius: 25px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: transform 0.2s, box-shadow 0.2s;">
<span style="font-size: 24px;">&#128264;</span>
<span>Play</span>
</a>
</div>
`;
jQuery('.wpapi_selection_container ').after(banner + glossaryLink);
}, 1500);
}
let _speechSynth=window.speechSynthesis;
let _voices=[];
const _cache={};
function loadVoicesWhenAvailable(onComplete=()=> {}){
_speechSynth=window.speechSynthesis;
function checkVoices(){
const voices=_speechSynth.getVoices();
if(voices.length > 0){
_voices=voices;
onComplete();
}else{
setTimeout(checkVoices, 100);
}}
checkVoices();
}
function getVoices(locale){
if(!_speechSynth){
throw new Error('Browser does not support speech synthesis');
}
if(_cache[locale]) return _cache[locale];
const matchingVoices=_voices.filter(voice=> voice.lang===locale);
_cache[locale]=matchingVoices.length ? matchingVoices:null;
return _cache[locale];
}
function playByText(locale, text, onEnd){
const voices=getVoices(locale);
if(!voices||voices.length===0){
console.error(`No available voice for locale: ${locale}`);
return;
}
let voice=voices.find(v=> /female|woman/i.test(v.name))||voices[0];
const utterance=new SpeechSynthesisUtterance(text);
utterance.voice=voice;
utterance.pitch=1;
utterance.rate=1;
utterance.volume=1;
utterance.lang=locale;
if(onEnd){
utterance.onend=onEnd;
}
_speechSynth.cancel();
_speechSynth.speak(utterance);
}
function playByText_ORG(locale, text, onEnd){
const voices=getVoices(locale);
if(!voices||voices.length===0){
console.error(`No available voice for locale: ${locale}`);
return;
}
const utterance=new SpeechSynthesisUtterance(text);
utterance.voice=voices[0];
utterance.pitch=0.8;
utterance.rate=1;
utterance.volume=1;
utterance.lang=locale;
if(onEnd){
utterance.onend=onEnd;
}
_speechSynth.cancel();
_speechSynth.speak(utterance);
}
loadVoicesWhenAvailable(()=> {
console.log("Voices loaded.");
});
jQuery(document).on('click', '.speak_now_ORG', function(event){
event.preventDefault();
const text=jQuery(this).data('data-word');
if(text){
setTimeout(()=> playByText("en-GB", text), 300);
}});
jQuery(document).on('click', '.speak_now', function(event){
event.preventDefault();
const text=jQuery(this).data('data-word');
if(text){
setTimeout(()=> playByText("en-GB", text), 300);
}});
jQuery(document).on('click', '.speak_now_V5', function(event){
event.preventDefault();
var tx=jQuery(this).data('word');
if(!tx) return;
if(isSpeaking){
return;
}
const message=new SpeechSynthesisUtterance(tx);
message.lang="en-GB";
message.pitch=1.2;
message.rate=1.0;
isSpeaking=true;
message.onend=function(){
console.log('Speech has ended.');
isSpeaking=false;
};
speechSynthesis.onvoiceschanged=()=> {
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB"&&voice.gender==="female");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
};
if(speechSynthesis.getVoices().length > 0){
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB"&&voice.gender==="female");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
}});
jQuery(document).on('click', '.speak_now_V4', function(event){
event.preventDefault();
var tx=jQuery(this).data('word');
if(!tx) return;
const message=new SpeechSynthesisUtterance(tx);
message.lang="en-GB";
message.pitch=1.2;
message.rate=1.0;
if(speechSynthesis.speaking){
return;
}
speechSynthesis.cancel();
speechSynthesis.onvoiceschanged=()=> {
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB"&&voice.gender==="female");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
};
if(speechSynthesis.getVoices().length > 0){
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB"&&voice.gender==="female");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
}});
jQuery(document).on('click', '.speak_now_V3', function(event){
event.preventDefault();
var tx=jQuery(this).data('word');
if(!tx) return;
const message=new SpeechSynthesisUtterance(tx);
message.lang="en-GB";
message.pitch=1.2;
message.rate=1.0;
if(speechSynthesis.speaking){
return;
}
message.onend=function(){
console.log('Speech has ended, ready for the next one.');
};
speechSynthesis.onvoiceschanged=()=> {
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
};
if(speechSynthesis.getVoices().length > 0){
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
}});
jQuery(document).on('click', '.speak_now_V2', function(event){
event.preventDefault();
var tx=jQuery(this).data('word');
if(!tx) return;
const message=new SpeechSynthesisUtterance(tx);
message.lang="en-GB";
message.pitch=1.2;
message.rate=1.0;
if(speechSynthesis.speaking){
return;
}
speechSynthesis.onvoiceschanged=()=> {
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
};
if(speechSynthesis.getVoices().length > 0){
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
}});
jQuery(document).on('click', '.speak_now_V1', function(){
event.preventDefault();
var tx=jQuery(this).data('word');
if(!tx) return;
const message=new SpeechSynthesisUtterance(tx);
message.lang="en-GB";
message.pitch=1.2;
message.rate=1.0;
speechSynthesis.onvoiceschanged=()=> {
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
};
if(speechSynthesis.getVoices().length > 0){
const voices=speechSynthesis.getVoices().filter(voice=> voice.lang==="en-GB");
if(voices.length > 0){
message.voice=voices[0];
}
speechSynthesis.speak(message);
}});
jQuery(document).on('click', '.cstm_save_ORGWithBOTHAPIWORKINGWELLTODAY', function(){
var tx=String(jQuery(this).data('word')).toLowerCase();
jQuery('.footer_loader').addClass('act');
fetch("https://api.dictionaryapi.dev/api/v2/entries/en/" + encodeURIComponent(tx))
.then(function(res){
if(!res.ok){
return Promise.resolve([{ meanings: [{ partOfSpeech: "No Data" }] }]);
}
return res.json();
})
.then(function(json){
var meanings=(json&&json[0]&&json[0].meanings)||[];
var parts=[];
for (var i=0; i < meanings.length; i++){
var pos=meanings[i].partOfSpeech;
if(parts.indexOf(pos)===-1) parts.push(pos);
}
if(parts.length===1&&parts[0].toLowerCase()==="no data"){
return fetch("https://wordsapiv1.p.rapidapi.com/words/" + encodeURIComponent(tx), {
method: 'GET',
headers: {
"x-rapidapi-host": "wordsapiv1.p.rapidapi.com",
"x-rapidapi-key": "nokey"
}})
.then(response=> response.json())
.then(data=> {
if(!data.results||!data.results.length) return "No Data";
var wordsParts=[];
data.results.forEach(r=> {
if(r.partOfSpeech) wordsParts.push(r.partOfSpeech);
});
wordsParts=[...new Set(wordsParts)];
return wordsParts.length ? wordsParts.join(" / "):"No Data";
})
.catch(err=> {
return "No Data";
});
}else{
return parts.join(" / ");
}})
.then(function(apiResult){
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action: 'add_to_glossary',
keyword: tx,
apiResult: apiResult
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
Swal.fire({
position: "top-end",
icon: "success",
title: response.message,
showConfirmButton: false,
timer: 1500
});
},
error: function(xhr, status, error){
jQuery('.footer_loader').removeClass('act');
}});
})
.catch(function(err){
jQuery('.footer_loader').removeClass('act');
});
return false;
});
jQuery(document).on('click', '.cstm_save', function(){
var tx=String(jQuery(this).attr('data-word')||jQuery(this).data('word')||'').toLowerCase();
jQuery('.footer_loader').addClass('act');
/* THE AREA BELOW IS DISABLED BECAUSE FREE API CREATE ISSUES AND ADDED A SIMPLE QUERY AT THE BOTTOM OF THIS DISABLED AREA
fetch("https://api.allorigins.win/raw?url=" + encodeURIComponent("https://api.dictionaryapi.dev/api/v2/entries/en/" + encodeURIComponent(tx)))
.then(function(res){
if(!res.ok){
return Promise.resolve([{ meanings: [{ partOfSpeech: "no data" }] }]);
}
return res.json();
})
.then(function(json){
var meanings=(json&&json[0]&&json[0].meanings)||[];
var parts=[];
for (var i=0; i < meanings.length; i++){
var pos=meanings[i].partOfSpeech;
if(parts.indexOf(pos)===-1) parts.push(pos);
}
var apiResult=parts.join(" / ");
var apiResult="no data";
console.log("apiResult:", apiResult);
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action: 'add_to_glossary',
keyword: tx,
apiResult: apiResult
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
Swal.fire({
position: "top-end",
icon: "success",
title: response.message,
showConfirmButton: false,
timer: 1500
});
},
error: function(xhr, status, error){
jQuery('.footer_loader').removeClass('act');
}});
})
.catch(function(err){
jQuery('.footer_loader').removeClass('act');
});
return false;
*/
var apiResult="no data";
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action: 'add_to_glossary',
keyword: tx,
apiResult: apiResult
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
Swal.fire({
position: "top-end",
icon: "success",
title: response.message,
showConfirmButton: false,
timer: 1500
});
},
error: function(xhr, status, error){
jQuery('.footer_loader').removeClass('act');
}});
return false;
});
jQuery(document).on('click', '.cstm_save_test1workingwell', function(){
var tx=jQuery(this).data('word').toLowerCase();
console.log("testt " + tx);
jQuery('.footer_loader').addClass('act');
fetch("https://api.dictionaryapi.dev/api/v2/entries/en/" + encodeURIComponent(tx))
.then(function(res){
if(!res.ok) throw new Error(res.status);
return res.json();
})
.then(function(json){
var meanings=(json&&json[0]&&json[0].meanings)||[];
var parts=[];
for (var i=0; i < meanings.length; i++){
var pos=meanings[i].partOfSpeech;
if(parts.indexOf(pos)===-1) parts.push(pos);
}
var apiResult=parts.join(" / ");
console.log("apiResult:", apiResult);
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action: 'add_to_glossary',
keyword: tx,
apiResult: apiResult
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
Swal.fire({
position: "top-end",
icon: "success",
title: response.message,
showConfirmButton: false,
timer: 1500
});
console.log("PHP response:", response);
},
error: function(xhr, status, error){
jQuery('.footer_loader').removeClass('act');
console.error("AJAX error:", status, error);
}});
})
.catch(function(err){
jQuery('.footer_loader').removeClass('act');
console.log("API fetch error:", err);
});
return false;
});
jQuery(document).on('click', '.cstm_save_ORG', function(){
var tx=jQuery(this).data('word').toLowerCase();
console.log("testtff" + tx);
fetch("https://api.dictionaryapi.dev/api/v2/entries/en/" + encodeURIComponent(tx))
.then(function (res){
if(!res.ok) throw new Error(res.status);
return res.json();
})
.then(function (json){
var meanings=(json&&json[0]&&json[0].meanings)||[];
var parts=[];
for (var i=0; i < meanings.length; i++){
var pos=meanings[i].partOfSpeech;
if(parts.indexOf(pos)===-1) parts.push(pos);
}
var apiResult=parts.join(" / ");
console.log("apiResult:", apiResult);
jQuery('body').data('api_result', apiResult);
})
.catch(function (err){
console.log("API error:", err);
jQuery('body').data('api_result', '');
});
var apiResult=jQuery('body').data('api_result');
jQuery('.footer_loader').addClass('act');
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action:'add_to_glossary',
keyword: tx,
apiResult: apiResult,
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
Swal.fire({
position: "top-end",
icon: "success",
title: response.message,
showConfirmButton: false,
timer: 1500
});
}});
return false;
});
jQuery(document).on('click', 'a.del_rem', function(){
var ind=jQuery(this).data('index');
var tk=jQuery(this);
Swal.fire({
title: 'Are you sure?',
icon: 'error',
confirmButtonText: 'Yes'
}).then((result)=> {
if(result['isConfirmed']){
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action:'remove_glossary',
index: ind
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
tk.parent().parent().remove();
if(response.status){
Swal.fire({
position: "top-end",
icon: "success",
title: response.message,
showConfirmButton: false,
timer: 2000
});
if(jQuery('#glossary-table-body').length&&jQuery('#glossary-table-body tr').length===0){
var emptyMsg='<p style="margin-top: 20px; padding: 15px; background-color: #f8f9fa; border: 1px solid #dee2e6; border-radius: 5px; color: #333; font-size: 16px; font-family: Arial, sans-serif;">Your glossary is currently empty. Please add words to view them here.</p>';
jQuery('.glossary-table').remove();
if(jQuery('.user_glossary .glossary_inner').length){
jQuery('.user_glossary .glossary_inner').append(emptyMsg);
}}
}else{
Swal.fire({
position: "top-end",
icon: "error",
title: response.message,
showConfirmButton: false,
timer: 2000
});
}}
});
}})
return false;
});
jQuery(document).on('click', '.add-reminder', function(){
var tsk=jQuery(this);
jQuery('.footer_loader').addClass('act');
var ind=jQuery(this).data('index');
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action:'add_reminder',
index: ind
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
if(response.status){
jQuery(tsk).text('Remove Reminder').attr('class', 'remove-reminder');
Swal.fire({
position: "top-end",
icon: "success",
title: response.message,
showConfirmButton: false,
timer: 1500
});
}else{
Swal.fire({
position: "top-end",
icon: "error",
title: response.message,
showConfirmButton: false,
timer: 5000
});
}
}});
return false;
});
if(jQuery('.glossary-table').length){
jQuery.fn.dataTable.ext.search.push(function (settings, data, dataIndex){
var trNode=settings.aoData[dataIndex].nTr;
var attr1=trNode.getAttribute("data-type");
var attr2=trNode.getAttribute("data-rem");
var val1=jQuery('#glossary-filter').val();
if(val1===""||val1===attr1){
return true;
}
else if(val1===""||val1===attr2){
return true;
}
return false;
});
}
function findWordAtIndex(focusIndex,text){
var words=text.split(' ');
var wordIndex=0;
var charCount=0;
for (var i=0; i < words.length; i++){
var word=words[i];
var wordLength=word.length;
if(charCount <=focusIndex&&focusIndex < charCount + wordLength){
wordIndex=i;
break;
}
charCount +=wordLength + 1;
}
return words[wordIndex];
}
jQuery(document).ready(function($){
var table='';
if($('.glossary-table').length){
table=$('.glossary-table').DataTable({
responsive: true
});
}
if($('.stories-table').length){
table2=$('.stories-table').DataTable({
responsive: true
});
}
$('#glossary-filter').on('change', function(){
table.draw();
});
})
jQuery(document).on('change', '.sel_type', function(){
jQuery('.footer_loader').addClass('act');
var vk=jQuery(this).val();
var ind=jQuery(this).data('index');
var kyd=jQuery(this).attr('data-nm');
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action:'update_status',
status: vk,
index: ind,
keyword: kyd
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
myChart.destroy();
var ctx=document.getElementById('wordAdditionChart').getContext('2d');
var chartData=response.daily_stats;
ctx.height=500;
myChart=new Chart(ctx, {
type: 'line',
data: {
labels: Object.keys(chartData['just_learnt']),
datasets: [
{
label: 'Just Learnt',
data: Object.values(chartData['just_learnt']),
backgroundColor: 'rgba(255, 99, 132, 0.6)',
borderColor: 'rgba(255, 99, 132, 1)',
borderWidth: 2,
fill: false,
tension: 0.1
},
{
label: 'Confident',
data: Object.values(chartData['confident']),
backgroundColor: 'rgba(54, 162, 235, 0.6)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 2,
fill: false,
tension: 0.1
},
{
label: 'Daily Use',
data: Object.values(chartData['daily_use']),
backgroundColor: 'rgba(75, 192, 192, 0.6)',
borderColor: 'rgba(75, 192, 192, 1)',
borderWidth: 2,
fill: false,
tension: 0.1
},
]
},
options: {
responsive: true,
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Number of Words'
},
ticks: {
reverse: false,
stepSize: 1
},
},
x: {
title: {
display: true,
text: 'Date .'
}}
}}
});
Swal.fire({
position: "top-end",
icon: "success",
title: response.msg,
showConfirmButton: false,
timer: 1500
});
}});
});
jQuery(document).on('click', 'a.remove-reminder', function(){
var tl=jQuery(this);
jQuery('.footer_loader').addClass('act');
var ind=jQuery(this).data('index');
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action:'remove_reminder',
index: ind
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
jQuery(tl).text('Add Reminder').attr('class', 'add-reminder');
Swal.fire({
position: "top-end",
icon: "success",
title: response.message,
showConfirmButton: false,
timer: 1500
});
}});
return false;
});
jQuery(document).on('click', '.add_wrd', function(){
jQuery('.add-word-popup').addClass('actt');
return false;
});
jQuery(document).off('submit.acAddWord', '.ac-add-word-form');
jQuery(document).on('submit.acAddWord', '.ac-add-word-form', function(e){
e.preventDefault();
if(e.stopImmediatePropagation){ e.stopImmediatePropagation(); }
var $form=jQuery(this);
if(window.__acAddWordBusy){ return false; }
if($form.data('busy')){ return false; }
$form.data('busy', true);
window.__acAddWordBusy=true;
var $submit=$form.find('input[type="submit"], button[type="submit"]');
$submit.prop('disabled', true);
jQuery('.footer_loader').addClass('act');
var payload=$form.serialize();
if(payload.indexOf('action=add_new_word')===-1){
payload +=(payload ? '&':'') + 'action=add_new_word';
}
jQuery.ajax({
type: 'post',
dataType: 'json',
url: ajax_object.ajaxurl,
data: payload,
error: function(){
jQuery('.footer_loader').removeClass('act');
$form.data('busy', false);
window.__acAddWordBusy=false;
$submit.prop('disabled', false);
Swal.fire({ position: 'top-end', icon: 'error', title: 'Request failed. Please try again.', showConfirmButton: false, timer: 5000 });
},
complete: function(){
$form.data('busy', false);
window.__acAddWordBusy=false;
$submit.prop('disabled', false);
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
var ok = !!(response&&(response.status===true||response.status==='true'||response.status===1||response.status==='1'||response.success===true));
var msg=(response&&response.message) ? response.message:(ok ? 'Saved.':'Request failed.');
var toastIcon=(msg&&msg.toLowerCase().indexOf('already on your list')!==-1) ? 'info':(ok ? 'success':'error');
Swal.fire({
position: "top-end",
icon: toastIcon,
title: msg,
showConfirmButton: false,
timer: 1800
});
if(!ok){
return;
}
var _formWord=$form.find('input[name="word"]').val();
var _formUid=$form.find('input[name="uid"]').val();
var _formPos=$form.find('input[name="pos"]').val();
var _formCf=$form.find('select[name="cf_lvl"]').val();
var _addedWord=(response&&response.data&&response.data.keyword) ? response.data.keyword:$form.find('input[name="word"]').val();
_addedWord=(_addedWord||'').toString().trim().toLowerCase().replace(/\W+$/g, '');
function acRefreshGlossaryRows(doneCb){
jQuery.ajax({
type: 'post',
dataType: 'json',
url: ajax_object.ajaxurl,
data: { action: 'ac_get_glossary_rows' },
success: function(r){
if(r&&r.status==='success'){
var $tableEl=jQuery('.glossary-table');
if($tableEl.length){
$tableEl.find('tbody').html(r.html);
if(jQuery.fn.DataTable&&jQuery.fn.DataTable.isDataTable($tableEl)){
var dt=$tableEl.DataTable();
dt.clear();
var nodes=$tableEl.find('tbody tr').toArray();
if(nodes.length){
dt.rows.add(nodes);
}
dt.draw(false);
dt.page(0).draw('page');
}
if(_addedWord){
$tableEl.find('tbody tr').each(function(){
var txt=jQuery(this).find('td').first().text().toLowerCase();
if(txt.indexOf(_addedWord)!==-1){
jQuery(this).addClass('ac-new-row');
setTimeout(()=> jQuery(this).removeClass('ac-new-row'), 1800);
return false;
}});
}}
}
if(typeof doneCb==='function') doneCb();
},
error: function(){
if(typeof doneCb==='function') doneCb();
}});
}
jQuery('.add-word-popup').removeClass('actt');
$form[0].reset();
acRefreshGlossaryRows(function(){});
jQuery('.add-word-popup').removeClass('actt');
$form[0].reset();
},
error: function(){
jQuery('.footer_loader').removeClass('act');
Swal.fire({
position: "top-end",
icon: "error",
title: 'Could not add the word. Please try again.',
showConfirmButton: false,
timer: 4000
});
}});
return false;
});
jQuery(document).on('click', 'a.clz_pp', function(){
jQuery('.add-word-popup').removeClass('actt');
return false;
});
jQuery(document).on('change', 'select.mnsl', function(){
var vl=jQuery(this).val();
jQuery('.footer_loader').addClass('act');
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action:'sort_data',
type: vl
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
myChart.destroy();
var ctx=document.getElementById('wordAdditionChart').getContext('2d');
var chartData=response.daily_stats;
ctx.height=500;
myChart=new Chart(ctx, {
type: 'line',
data: {
labels: Object.keys(chartData['just_learnt']),
datasets: [
{
label: 'Just Learnt',
data: Object.values(chartData['just_learnt']),
backgroundColor: 'rgba(255, 99, 132, 0.6)',
borderColor: 'rgba(255, 99, 132, 1)',
borderWidth: 2,
fill: false,
tension: 0.1
},
{
label: 'Confident',
data: Object.values(chartData['confident']),
backgroundColor: 'rgba(54, 162, 235, 0.6)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 2,
fill: false,
tension: 0.1
},
{
label: 'Daily Use',
data: Object.values(chartData['daily_use']),
backgroundColor: 'rgba(75, 192, 192, 0.6)',
borderColor: 'rgba(75, 192, 192, 1)',
borderWidth: 2,
fill: false,
tension: 0.1
},
]
},
options: {
responsive: true,
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Number of Words'
},
ticks: {
reverse: false,
stepSize: 1
},
},
x: {
title: {
display: true,
text: 'Date'
}}
}}
});
}});
return false;
});
jQuery(document).on('click', 'a.delbookmrk', function(){
Swal.fire({
title: 'Are you sure?',
icon: 'error',
confirmButtonText: 'Yes'
}).then((result)=> {
if(result['isConfirmed']){
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action:'remove_all_reminders',
},
success: function(response){
if(response){
Swal.fire({
position: "top-end",
icon: "success",
title: "All reminders resetted",
showConfirmButton: false,
timer: 1500
});
location.reload();
}}
});
}});
return false;
});
jQuery(document).on('submit', '.story_fm', function(){
jQuery('.footer_loader').addClass('act');
var fmd=jQuery(this).serialize();
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: fmd,
success: function(response){
jQuery('.footer_loader').removeClass('act');
if(response.status){
Swal.fire({
position: "top-end",
icon: "success",
title: response.msg,
showConfirmButton: false,
timer: 1500
});
var d=(response.data||{});
if(d.uid&&d.excerpt&&jQuery('.stories-table tbody').length){
var safeExcerpt=jQuery('<div/>').text(d.excerpt).html();
var row=''+
'<tr data-id="' + d.uid + '" class="singl_story">' +
'<td></td>' +
'<td>' + safeExcerpt + '</td>' +
'<td><a data-index="' + d.uid + '" href="#" class="del_story" style="display: inline-block; width: 100px; text-align: center; padding: 5px; margin: 3px; font-size: 12px; font-weight: normal; color: white; text-decoration: none; background: #e53935; border-radius: 5px; border: 1px solid #e53935;">Delete</a></td>' +
'</tr>';
jQuery('.stories-table tbody').prepend(row);
jQuery('.stories-table tbody tr').each(function(i){
jQuery(this).find('td').first().text(i+1);
});
}}else{
Swal.fire({
position: "top-end",
icon: "error",
title: response.msg,
showConfirmButton: false,
timer: 5000
});
}}
});
return false;
});
jQuery(document).on('click', '.singl_story', function(){
jQuery('.footer_loader').addClass('act');
var did=jQuery(this).data('id');
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action:'get_story',
index: did
},
success: function(response){
jQuery('.footer_loader').removeClass('act');
if(response.status){
jQuery('.story-inner-cont').html(response.html);
jQuery('.story-popup').addClass('actstp');
}else{
Swal.fire({
position: "top-end",
icon: "error",
title: response.msg,
showConfirmButton: false,
timer: 5000
});
}}
});
});
jQuery(document).on('click', 'a.clz_pp', function(){
window.speechSynthesis.cancel();
jQuery('.story-popup').removeClass('actstp');
});
jQuery(document).off('click.acDelStory', 'a.del_story');
jQuery(document).on('click.acDelStory', 'a.del_story', function(e){
e.preventDefault();
if(e.stopImmediatePropagation){ e.stopImmediatePropagation(); }
e.stopPropagation();
var di=jQuery(this).data('index');
Swal.fire({
title: 'Are you sure?',
icon: 'error',
confirmButtonText: 'Yes'
}).then((result)=> {
if(result['isConfirmed']){
jQuery('.footer_loader').addClass('act');
jQuery.ajax({
type: "post",
dataType: "json",
url: ajax_object.ajaxurl,
data: {
action:'delete_story',
index: di
},
error: function(){
jQuery('.footer_loader').removeClass('act');
Swal.fire({ position: 'top-end', icon: 'error', title: 'Delete failed. Please try again.', showConfirmButton: false, timer: 5000 });
},
complete: function(){
jQuery('.footer_loader').removeClass('act');
},
success: function(response){
if(response.status){
Swal.fire({
position: "top-end",
icon: "success",
title: response.msg,
showConfirmButton: false,
timer: 1500
});
var $row=jQuery('tr.singl_story[data-id="' + di + '"]');
if($row.length){
$row.remove();
jQuery('.stories-table tbody tr').each(function(i){
jQuery(this).find('td').first().text(i+1);
});
}}else{
Swal.fire({
position: "top-end",
icon: "error",
title: response.msg,
showConfirmButton: false,
timer: 5000
});
jQuery('.footer_loader').removeClass('act');
}}
});
}});
});
jQuery(document).on('click', '.listen_story', function(){
var ty=jQuery('.story-inner-cont').text();
var msg=new SpeechSynthesisUtterance();
msg.text=ty;
window.speechSynthesis.speak(msg);
return false;
});