let txtBox = document.querySelector('.txtBox')
txtBox.focus()
let letterCloseButton = document.querySelector('.letter-close-button')
let startsWith = document.getElementById("startsWith");
let mustInclude = document.getElementById("mustInclude");
let endsWith = document.getElementById("endsWith");
let exculdeWith = document.getElementById("exculdeWith");
let inculdeWith = document.getElementById("inculdeWith");
let wordLength = document.getElementById("wordLength");
let textBoxes = document.querySelectorAll('.textBoxes');
let filterInputs = document.querySelectorAll('.filter_val');
let formElement = document.querySelector("#form");
let wordCount = document.querySelector(".wordCount");
let main = document.querySelector(".main");
let errorMsg = document.querySelector(".errorMsg");
let serachBtn = document.querySelector(".serachBtn")
let tab_container = document.querySelector(".tab_container");
let lengthSelect = document.querySelector(".length-select");
let getScript = document.currentScript;
let siteUrl = getScript.dataset.url;
let serachSection = document.querySelector(".serachSection");
let rangeOfBlankTile = serachSection.dataset.range;
let letterLen = serachSection.dataset.letter
let ablank = serachSection.dataset.ablank
let featureContainer = document.querySelector("#featureContainer")
let howContainer = document.querySelector("#howContainer")
let faqsContainer = document.querySelector("#faqsContainer")
let infographicsContainer = document.querySelector("#infographicsContainer")
let theSelect = document.getElementById("select_dropDown");
let sortingFilter = document.querySelector("#select_dropDown");
let sortup = document.querySelector(".sortup-icon");
let bool = false;
let authorsLists = document.querySelector(".authors-list")
let searchBtnContainer = document.querySelector(".search-btn-container")
let home_page_search_result
let homePageSearchResult
let sortValue;
let sortBool = false;
let ok = true;
let worker = new Worker('/assets/js/wordfinder-worker.js');
textBoxes.forEach(txtBox => {
txtBox.addEventListener("input", () => {
if (txtBox.value !== '') {
txtBox.classList.add('blinkBoxShadow');
} else {
txtBox.classList.remove('blinkBoxShadow');
}
});
txtBox.addEventListener('blur', () => {
txtBox.classList.remove('blinkBoxShadow');
});
});
txtBox.addEventListener('input', (e) => {
if (e.target.value === "") {
letterCloseButton.style.display = "none"
}
else {
letterCloseButton.style.display = "block"
}
e.target.value = e.target.value.replace(/[^a-zA-Z? ]/g, "")
let rangeOfBlankTile = 3
if (rangeOfBlankTile === "") {
rangeOfBlankTile = 3
}
e.target.value = e.target.value.replace(/ /g, '?')
let data = []
data = e.target.value.split('').filter((i) => i === '?')
if (data.length > rangeOfBlankTile) {
e.target.value = e.target.value.replace(/\?$/, '')
}
})
letterCloseButton.addEventListener("click", () => {
txtBox.value = ""
letterCloseButton.style.display = "none"
})
Array.from(filterInputs).forEach((item) => {
item.addEventListener("input", (e) => {
const inputValue = e.target.value;
const parentElement = e.target.parentElement;
const imgElement = parentElement.querySelector('img');
const tooltipElement = parentElement.querySelector('.filter-tooltip');
if (inputValue == "") {
imgElement.src = "/assets/images/questionmark.svg"
setTimeout(() => {
item.nextElementSibling.setAttribute("data-tip", item.nextElementSibling.id)
}, 100);
tooltipElement.style.setProperty('--tooltip-padding', '0.5rem');
tooltipElement.style.setProperty('--tooltip-border-style', 'soild');
} else {
item.nextElementSibling.removeAttribute("data-tip")
imgElement.src = "/assets/images/close-btn.svg"
tooltipElement.style.setProperty('--tooltip-padding', '0');
tooltipElement.style.setProperty('--tooltip-border-style', 'none');
}
})
item.nextElementSibling.addEventListener("click", () => {
const parentElement = item.parentElement;
const imgElement = parentElement.querySelector('img');
const tooltipElement = parentElement.querySelector('.filter-tooltip');
item.value = ""
imgElement.src = "/assets/images/questionmark.svg"
setTimeout(() => {
item.nextElementSibling.setAttribute("data-tip", item.nextElementSibling.id)
}, 100);
tooltipElement.style.setProperty('--tooltip-padding', '0.5rem');
tooltipElement.style.setProperty('--tooltip-border-style', 'soild');
})
})
sortup.addEventListener("click", () => {
if (bool) {
theSelect.size = 0;
bool = false;
theSelect.style.display = "none";
} else {
bool = true;
theSelect.size = 3;
theSelect.style.display = "block";
}
});
const getDiff = (text1, text2) => {
var diffRange = [];
var currentRange = undefined;
for (var i = 0; i < text1.length; i++) {
if (text1[i] != text2[i]) {
if (currentRange == undefined) {
currentRange = [i];
}
}
if (currentRange != undefined && text1[i] == text2[i]) {
currentRange.push(i);
diffRange.push(currentRange);
currentRange = undefined;
}
}
if (currentRange != undefined) {
currentRange.push(i);
diffRange.push(currentRange);
}
return diffRange;
};
const loadResource = (FILE_URL, data = {}, async = true, type = "text/javascript") => {
return new Promise((resolve, reject) => {
let resourceEle;
if (type === "text/javascript") {
resourceEle = document.createElement("script");
resourceEle.src = FILE_URL;
resourceEle.classList.add("loaded-js");
} else if (type === "text/css") {
resourceEle = document.createElement("link");
resourceEle.rel = "stylesheet";
resourceEle.href = FILE_URL;
} else {
reject({
status: false,
message: `Unsupported resource type: ${type}`,
});
return;
}
resourceEle.type = type;
resourceEle.async = async;
Object.keys(data).forEach((key) => {
resourceEle.setAttribute(`data-${key}`, data[key]);
});
resourceEle.addEventListener("load", () => {
resolve({ status: true });
});
resourceEle.addEventListener("error", () => {
reject({
status: false,
message: `Failed to load the resource ${FILE_URL}`,
});
});
if (type === "text/javascript") {
// console.log(resourceEle);
// console.log(FILE_URL);
document.body.appendChild(resourceEle);
} else if (type === "text/css") {
document.head.appendChild(resourceEle);
}
});
};
function sendPageViewEvent() {
gtag('event', 'page_view', {
page_location: window.location.pathname + location.search
});
}
function logSubmit(e) {
e.preventDefault();
if (txtBox.value != "" || startsWith.value != "" || endsWith.value != "" || mustInclude.value != "" || exculdeWith.value != "" || inculdeWith.value != "" || wordLength.value != "") {
if (featureContainer) {
featureContainer.remove()
}
if (howContainer) {
howContainer.remove()
}
if (faqsContainer) {
faqsContainer.remove()
}
if (infographicsContainer) {
infographicsContainer.remove()
}
if (authorsLists) {
authorsLists.remove()
}
serachBtn.style.background = 'url(/assets/images/spinner.gif) no-repeat center center';
main.innerHTML = `
`;
let quesMark = "?";
if (rangeOfBlankTile) {
if (!txtBox.value.includes("?")) {
txtBox.value = txtBox.value + quesMark.repeat(rangeOfBlankTile);
txtBox.value = txtBox.value;
}
}
if (ablank) {
if (!txtBox.value.includes("?")) {
if (txtBox.value.length <= letterLen || txtBox.value.length >= letterLen) {
txtBox.value = txtBox.value + '?'
txtBox.value = txtBox.value
}
}
}
document.querySelector(".fillterWrapper").classList.add("hide")
let selectedDictionary = document.querySelector(".select_dropDown2").value;
if (history.pushState) {
var newurl =
window.location.protocol +
"//" +
window.location.host +
window.location.pathname +
"?" +
"search" +
"=" +
txtBox.value.toLowerCase() +
"&" +
"dictionary" +
"=" +
selectedDictionary +
"&" +
"prefix" +
"=" +
startsWith.value +
"&" +
"contains" +
"=" +
mustInclude.value +
"&" +
"suffix" +
"=" +
endsWith.value +
"&" +
"exclude" +
"=" +
exculdeWith.value +
"&" +
"include" +
"=" +
inculdeWith.value +
"&" +
"length" +
"=" +
wordLength.value;
window.history.pushState({ path: newurl }, "", newurl);
const params = new URLSearchParams(window.location.search);
serachValue = params.get("search");
prefixValue = params.get("prefix");
containsValue = params.get("contains");
suffixValue = params.get("suffix");
exculdeValue = params.get("exclude");
includeValue = params.get("include");
lengthValue = params.get("length");
dictonary = params.get("dictionary");
getData(txtBox.value.toLowerCase())
setTimeout(sendPageViewEvent, 0);
}
const paramName = 'search';
if (new URLSearchParams(window.location.search).has(paramName)) {
const additionalData = {}
var loadJs = document.querySelector(".loaded-js");
if (loadJs == null) {
loadResource("/assets/css/wordfinder-result.css", additionalData, true, "text/css")
.then((data) => {
console.log("CSS loaded:", data);
})
.catch((error) => {
console.error("Error loading CSS:", error);
});
}
}
} else {
console.log("Please Enter Valid Letters.");
}
}
let selectedDictionary = document.querySelector(".select_dropDown2");
selectedDictionary.addEventListener("change", (e) => {
logSubmit(e);
});
formElement.addEventListener("submit", logSubmit);
sortingFilter.addEventListener("change", logSubmit);
// getWords define
const getData = async (serachValue) => {
try {
let selectedDictionary = document.querySelector(".select_dropDown2").value;
if (letterLen) {
home_page_search_result = document.querySelector("#home_page_search_result")
homePageSearchResult = `/?search=${serachValue}&dictionary=Dictionary&prefix=&contains=&suffix=&exculde=&inculde=&length=`;
}
document.querySelector(".main-header").style.background = "#fff"
document.querySelector(".sortingFilters").style.display = "none"
errorMsg.innerHTML = "";
wordCount.innerHTML = "";
if (serachValue) {
serachValue = serachValue + startsWith.value.toLowerCase() + endsWith.value.toLowerCase() + mustInclude.value.toLowerCase() + inculdeWith.value.toLowerCase() + exculdeWith.value.toLowerCase()
}
const startTime = performance.now();
worker.postMessage({
type: "api",
serachValue: serachValue,
selectedDictionary: selectedDictionary,
endpoint: `/.netlify/functions`
});
worker.onmessage = (event) => {
main.innerHTML = "";
serachBtn.style.background = 'url(/assets/images/search.svg) no-repeat center center';
getWords(startTime, serachValue, event.data.data);
}
} catch (error) {
console.log(error);
}
};
let newUrl = window.location.href;
if (newUrl.includes("?")) {
const params = new URLSearchParams(window.location.search);
let serachValue = params.get("search").toLowerCase();
let prefixValue = params.get("prefix");
let containsValue = params.get("contains");
let suffixValue = params.get("suffix");
let exculdeValue = params.get("exclude");
let includeValue = params.get("include");
let lengthValue = params.get("length");
let dictonary = params.get("dictionary");
txtBox.value = serachValue
startsWith.value = prefixValue
mustInclude.value = containsValue
endsWith.value = suffixValue
exculdeWith.value = exculdeValue
inculdeWith.value = includeValue
wordLength.value = lengthValue
document.querySelector(".select_dropDown2").value = dictonary
logSubmit(new Event('submit'))
}
let previousDataIndex = null
let previousID = null;
let storepreviousIndex = []
let moreData = []
let data_index = 98;
function getWords(startTime, serachValue, data) {
data_index = 98
moreData = []
storepreviousIndex = []
main.innerHTML = "";
lengthSelect.innerHTML = ""
if (typeof data === "string") {
const params = new URLSearchParams(window.location.search);
errorMsg.innerHTML = "no words found";
if (!letterLen) {
let serachValue = params.get("search").toLowerCase();
txtBox.value = serachValue + "?"
logSubmit(new Event('submit'))
}
} else {
worker.postMessage({
type: 'filterwords',
data: data,
serachValue: serachValue,
prefixValue: startsWith.value,
containsValue: mustInclude.value,
suffixValue: endsWith.value,
exculdeValue: exculdeWith.value,
includeValue: inculdeWith.value,
lengthValue: wordLength.value,
sortingFilter: sortingFilter.selectedIndex,
dictonary: document.querySelector(".select_dropDown2").value
});
worker.onmessage = (event) => {
if (event.data.type === "filterwords") {
errorMsg.innerHTML = ""
document.querySelector(".sortingFilters").style.display = "flex"
let { prefixValue, containsValue, suffixValue, exculdeValue, includeValue, lengthValue, newdata, i, newWordsLength, result } = event.data
moreData.push(newdata)
if (prefixValue) {
startsWith.nextElementSibling.querySelector("img").src = "/assets/images/close-btn.svg"
startsWith.classList.add("tick");
startsWith.value = startsWith.value;
}
if (suffixValue) {
endsWith.nextElementSibling.querySelector("img").src = "/assets/images/close-btn.svg"
endsWith.classList.add("tick");
endsWith.value = endsWith.value;
}
if (containsValue) {
mustInclude.nextElementSibling.querySelector("img").src = "/assets/images/close-btn.svg"
mustInclude.classList.add("tick");
mustInclude.value = mustInclude.value;
}
if (lengthValue) {
wordLength.nextElementSibling.querySelector("img").src = "/assets/images/close-btn.svg"
wordLength.classList.add("tick");
wordLength.value = wordLength.value;
}
if (exculdeValue) {
exculdeWith.nextElementSibling.querySelector("img").src = "/assets/images/close-btn.svg"
exculdeWith.classList.add("tick");
exculdeWith.value = exculdeWith.value;
}
if (includeValue) {
inculdeWith.nextElementSibling.querySelector("img").src = "/assets/images/close-btn.svg"
inculdeWith.classList.add("tick");
inculdeWith.value = inculdeWith.value;
}
if (newdata.length === 0) {
main.innerHTML += "";
} else {
if (result[0] !== undefined) {
if (wordLength.value) {
lengthSelect.style.display = "none"
} else {
var option = document.createElement("option");
option.text = `${i} Letter`;
option.value = i;
lengthSelect.setAttribute("onchange", `Filtering(${i})`)
lengthSelect.add(option);
lengthSelect.style.display = "block"
}
if (letterLen) {
home_page_search_result.href = homePageSearchResult
home_page_search_result.innerHTML = `See words of any length with letters ${serachValue.split("")}`
}
const endTime = performance.now();
const timeTaken = endTime - startTime; // Calculate time taken in milliseconds
// Log the time taken
console.log(`Time taken by worker: ${timeTaken.toFixed(2)} ms`);
main.innerHTML += `
${i} Letter Words
${result.join("")}
`
showMoreLimit()
}
}
if (newWordsLength === 0) {
errorMsg.innerHTML = "No Words Found";
document.querySelector(".sortingFilters").style.display = "none"
} else {
if (txtBox.value) {
wordCount.innerHTML = `Found ${newWordsLength} words with letters with ${txtBox.value.split("")}`;
} else {
let startwithMsg = ""
let endwithMsg = ""
let containsMsg = ""
let lengthMsg = ""
let inputVal = ""
if (txtBox.value) {
inputVal = `${input.value.split("")} `
}
if (prefixValue) {
startwithMsg = `starting with ${prefixValue.split("")}`
}
if (suffixValue) {
endwithMsg = `ending with ${suffixValue.split("")} `
}
if (containsValue) {
containsMsg = `containing with ${containsValue.split("")} `
}
if (lengthValue) {
lengthMsg = `with ${lengthValue} letter words`
}
let msg = ` Found ${newWordsLength} words with letters
${lengthMsg} ${inputVal} ${startwithMsg} ${endwithMsg} ${containsMsg} `
wordCount.innerHTML = `${msg} `
}
}
}
}
}
}
async function getMoreWords() {
let flattenedArray = moreData.flat();
let uniqueArray = [...new Set(flattenedArray)];;
return uniqueArray
}
async function showMoreWords(e) {
try {
let showmore = e.parentElement.children[0];
let id = showmore.id;
if (previousID !== null && parseInt(previousID) !== parseInt(id)) {
data_index = 98
const filteredIndexes = storepreviousIndex.filter(item => item.id === id);
if (filteredIndexes.length > 0) {
const lastItem = filteredIndexes[filteredIndexes.length - 1];
data_index = lastItem.data_index + 98;
lastItem.data_index = data_index;
}
}
previousID = id;
storepreviousIndex.push({
data_index,
id
})
console.log("Current data_index:", data_index);
document.getElementById(id).innerHTML = `Loading...`;
let content_area = document.getElementById("alpha_" + id).getElementsByClassName("wordList")[0];
const result = await getMoreWords();
let full_words = result.filter((item) => item.length === Number(id));
if (data_index < full_words.length) {
for (let d = data_index; d < data_index + 98; d++) {
if (full_words[d] != undefined) {
let itemHtml = "";
let points
let ScrabbleLetterScore = ScrabbleScore();
if (serachValue) {
serachValue = serachValue + startsWith.value.toLowerCase() + endsWith.value.toLowerCase() + mustInclude.value.toLowerCase() + inculdeWith.value.toLowerCase() + exculdeWith.value.toLowerCase()
}
if (serachValue) {
var text1 = serachValue.replace("?", "");
var text2 = full_words[d];
var text3 = full_words[d];
let chars = text1.split("");
let indexs = [];
chars.map((i) => {
let findIndexes = findIndex(text3, i);
if (findIndexes.length > 0) {
text3 = text3.split("");
text3[findIndexes] = "$";
text3 = text3.join("");
indexs = [...indexs, ...findIndexes];
}
});
let n1 = false
text2.split("").map((itemValue, index) => {
let check = indexs.find((i) => i === index);
if (check !== undefined) {
itemHtml += `${itemValue}`;
n1 = true
} else {
itemHtml += `${itemValue}`;
}
});
if (n1 == true) {
let parsedText = itemHtml.replace(/]*>.*?<\/span>/g, '');
// console.log(parsedText);
points = 0
for (let i = 0; i < parsedText.length; i++) {
points += ScrabbleLetterScore[parsedText[i]] || 0; // for unknown characters
}
}
} else {
itemHtml = full_words[d]
points = 0;
for (let i = 0; i < full_words[d].length; i++) {
points += ScrabbleLetterScore[full_words[d][i]] || 0; // for unknown characters
}
}
full_words[d] = full_words[d].toLowerCase();
let span = document.createElement("span");
span.setAttribute("class", "points");
span.setAttribute("value", `${points}`);
span.innerHTML = `${points}`;
let a = document.createElement("a");
a.setAttribute("class", "anchor__style");
a.setAttribute("target", "_blank");
a.setAttribute("href", "/word-meaning?search=" + full_words[d].replace(/<\/?[^>]+>/gi, ''));
a.setAttribute("data-original-title", `Lookup ${full_words[d].replace(/<\/?[^>]+>/gi, '')} in Dictionary`)
a.innerHTML = ` ${itemHtml} `;
a.appendChild(span)
content_area.appendChild(a);
}
}
document.getElementById(id).innerHTML = `More Words`;
data_index += 98;
} else {
document.getElementById(id).style.display = "none";
}
} catch (error) {
console.error("Error fetching or processing data:", error);
}
}
const ScrabbleScore = (dictonary) => {
let twl06_sowpods = {
a: 1,
e: 1,
i: 1,
o: 1,
u: 1,
l: 1,
n: 1,
r: 1,
s: 1,
t: 1,
d: 2,
g: 2,
b: 3,
c: 3,
m: 3,
p: 3,
f: 4,
h: 4,
v: 4,
w: 4,
y: 4,
k: 5,
j: 8,
x: 8,
q: 10,
z: 10,
};
let wwfScore = {
a: 1,
b: 4,
c: 4,
d: 2,
e: 1,
f: 4,
g: 3,
h: 3,
i: 1,
j: 10,
k: 5,
l: 2,
m: 4,
n: 2,
o: 1,
p: 4,
q: 10,
r: 1,
s: 1,
t: 1,
u: 2,
v: 5,
w: 4,
x: 8,
y: 3,
z: 10,
};
if (dictonary === "wwf") {
return wwfScore;
} else {
return twl06_sowpods;
}
};
function showMoreLimit() {
let tableFooter = document.querySelectorAll(".btn-container")
let showmore = document.querySelectorAll(".showmore_btn");
for (let i = 0; i < showmore.length; i++) {
let data_of_button = document.getElementById("alpha_" + showmore[i].getAttribute("id"));
let final_data = data_of_button.getElementsByClassName("anchor__style");
if (final_data.length < 98) {
tableFooter[i].style.display = "none";
}
}
}
window.onscroll = function () {
var section = document.querySelectorAll(".wordlistContainer");
let new_sections = {};
Array.prototype.forEach.call(section, function (e) {
if (document.body.clientWidth > 991) {
new_sections[e.id] = e.offsetTop - 10;
} else {
new_sections[e.id] = e.offsetTop - 10;
}
});
var scrollPosition =
document.documentElement.scrollTop || document.body.scrollTop;
for (i in new_sections) {
let sort_val = document.querySelector(".sort-select").value;
if (
i.split("_")[0] == sort_val &&
new_sections[i] &&
new_sections[i] <= scrollPosition
) {
// document.querySelector(".active-tab").classList.remove("active-tab");
// var active_now = document.querySelector("#Tab_" + i.split("_")[1]);
// active_now.classList.add("active-tab");
// active_now.scrollIntoView({ block: "nearest" });
}
}
};
let sections = {};
function Filtering(id) {
id = lengthSelect.value
let tabs = document.getElementsByClassName("tab_link");
tabs[0] ? tabs[0].classList.add("active-tab") : "";
Array.from(tabs).map((item) => {
item.classList.remove("active-tab");
});
main.innerHTML += ``;
let activeLetter = event.target;
activeLetter.classList.add("active-tab");
var section = document.querySelectorAll(".allGroupWords");
var sort_val = "alpha";
Array.prototype.forEach.call(section, function (e) {
if (document.body.clientWidth > 991) {
sections[e.id] = e.offsetTop - 10;
} else {
sections[e.id] = e.offsetTop - 10;
}
});
document.documentElement.scrollTop = sections[sort_val + "_" + id] + 5;
setTimeout(() => {
document.documentElement.scrollTop = sections[sort_val + "_" + id] + 5;
}, 150);
}
function findIndex(str, char) {
const strLength = str.length;
const indexes = [];
let newStr = str;
while (newStr && newStr.indexOf(char) > -1) {
indexes.push(newStr.indexOf(char) + strLength - newStr.length);
newStr = newStr.substring(newStr.indexOf(char) + 5);
newStr = newStr.substring(newStr.indexOf(char) + 5);
}
return indexes;
}