let url_preset = "";
let finalActives = [];
let dataToReturn = localStorage.getItem("answers") ? JSON.parse(localStorage.getItem("answers")) : [];
let uniqueQuestionsShowed = [];
let lastQuizResponseShown;
let lastShowedQuestionId = null;
let emailFieldInProgress = false;
let minRangeVal = null;
let maxRangeVal = null;
let blank_active_count = 0;
let data = "";
let items = "";
let allItems = "";
let UserName = "";
let UserBirth = "";
let currentActiveAnswerType = null;
let currentQuestion = null;
let answer = "";
let currentQuizIndex = 0;
let totalQuizQuestions = [];
let currentQuestionCounter = 0;
let saveResponseInto = null;
let ans = "";
let city_id = "";
let tempMcqAns = "";
let tempMcqAnsValue = 0;
let tempMcqiBLActives = [];
let tempMcqBLActives = [];
let tempMcqiAns = "";
let tempMcqiAnsValue = 0;
let sliderAns = "";
let sliderBLActives = [];
let sliderVal = "";
let tempSelectionAns = [];
let isSkipStoreAnswer = false;
let isExecuted = false;
let nextBtnClicked = false;
let argument = [];
let weights = {};
let apiQues = null;
let quesResponse = null;
let responseHeader = null;
let responseBody = null;
let flag = false;
let age = "";
let allLength = "";
let eachLength = 0;
let totalQ = 0;
let increase = 0;
let progress = 0;
let timerStart = false;
let ranges = [];
let lastCurrentQuizQuesInProgress = false;
let responseOnGoing = false;
let hasNoResponse = false;
let responseClosed = false;
let closeResponseTimeout;
let mainConfigurations;
let profile_characteristics = {};
let nextQuestionTimeoutCounter = 3000;
let selectionQuestionTimeoutCounter = 6000;
let closeResponseTimeoutCounter = 5000;
let timeout;
const mainImage = $(".main-image-container img");
fetch(url_preset + "/configurations")
.then((res) => res.json())
.then((data) => {
if (data.success) {
mainConfigurations = data.payload;
mainImage.attr("src", url_preset + mainConfigurations.image.url);
}
});
$(document).on("click", ".beginButton", async function () {
$("#page1").css("display", "none");
$("#page2").css("display", "none");
$("#page3").css("display", "none");
$("#page4").css("display", "none");
$("#page5").css("display", "none");
$("#page6").css("display", "none");
$("#page7").css("display", "none");
await getQuizzesApi();
showQuizTitle();
return nextQuestion();
});
$(document).on("click", ".goBottom", function () {
$("html, body").animate({ scrollTop: $(document).height() }, "slow");
});
$(document).on("click", ".nextBtn", function () {
nextBtnClicked = true;
});
let firstTime = true;
let oldAnswers = [];
const customerId = document.getElementById("customer-id");
const customerEmail = document.getElementById("customer-email");
if (customerId || customerEmail) {
fetch(url_preset + "/v1/api/order/customer?id=" + customerId?.innerText + "&email=" + customerEmail?.innerText)
.then((res) => res.json())
.then((data) => {
if (data.success && data.data) {
oldAnswers = data.data;
firstTime = false;
}
});
}
function getQuizzesApi() {
return new Promise(function (resolve, reject) {
$.ajax({
url: url_preset + "/admin/api/quizzes?limit=0",
type: "GET",
success: function (response) {
data = response.data; //all data in the api
allItems = data.items; // items in the api
allLength = allItems.length;
for (i = 0; i < allLength; i++) {
var eachName = allItems[i].name;
eachLength = allItems[i].questions.length;
totalQ = totalQ + eachLength;
$("#progressBarSection .progressBar .progressColumnsDiv").append(`
`);
}
return resolve();
},
error: function (error) {
return reject(error);
},
});
});
}
// function to show all quiz title page
function showQuizTitle() {
$("#page1").css("display", "none");
$("#page3").css("display", "none");
$("#page5").css("display", "none");
$("#page6").css("display", "none");
$("#page7").css("display", "none");
$("#page2").css("display", "block");
$("#page2 .container .row").html("");
$("#progressBarSection").css("display", "none");
$("#page2 .container .row").append(`
Part ${allItems[currentQuizIndex].id}: ${allItems[currentQuizIndex].name}
${allItems[currentQuizIndex].description}
`);
setTimeout(function () {
$("#page1").css("display", "none");
$("#page2").css("display", "none");
$("#page3").css("display", "block");
$("#page4").css("display", "none");
$("#page5").css("display", "none");
$("#page6").css("display", "none");
$("#page7").css("display", "none");
$("#progressBarSection").css("display", "block");
}, nextQuestionTimeoutCounter);
}
function showPreparingPage() {
clearTimeout(closeResponseTimeout);
$("#page1").css("display", "none");
$("#page2").css("display", "none");
$("#page3").css("display", "none");
$("#page4").css("display", "none");
$("#page5").css("display", "none");
$("#page7").css("display", "none");
$("#page6").css("display", "block");
$("#progressBarSection").css("display", "none");
showResults();
}
async function showResults() {
const { accumlatedUniqueWeights, sortedWeightsArray } = getUniqueAccumlatedWeights(dataToReturn);
const accumlatedBLActives = getUniqueBlackListActives(dataToReturn);
const { activesToAdd, activesToRemove } = await getEngineRules(accumlatedUniqueWeights);
const { sortedFinalActiveslist, sortedFinalActiveslistWithScores } = await calculatePrioritySelection(accumlatedUniqueWeights);
const filteredActivesListInitial = filterBlacklistActives(sortedFinalActiveslistWithScores);
finalActives = applyFinalCalculations(filteredActivesListInitial, activesToAdd, activesToRemove, dataToReturn);
console.log("accumlated weights", accumlatedUniqueWeights);
console.log("black listed actives", accumlatedBLActives);
console.log("full actives list", sortedFinalActiveslist);
console.log("full actives list with scores", sortedFinalActiveslistWithScores);
console.log("after first filter", filteredActivesListInitial);
console.log("final actives List", finalActives);
if (accumlatedUniqueWeights) {
await createProfile(accumlatedUniqueWeights);
}
$("#page6").css("display", "none");
$("#page7 .nameDiv h5").html(localStorage.getItem("name"));
$("#page7").css("display", "block");
} // showResults function ends here
function applyFinalCalculations(blFilterdActiveList, activesToAdd, activesToRemove, answersArray) {
//select top 5
//checkup here to see if it is first time or not
let finalActivesList = [];
blFilterdActiveList.forEach((active, index) => {
if (index < 5) {
finalActivesList.push(active);
} else {
if (active[1] >= 22) {
finalActivesList.push(active);
}
}
});
if (activesToRemove && activesToRemove.length) {
finalActivesList.filter((active) => !activesToRemove.includes(active[0]));
}
if (activesToAdd && activesToAdd.length) {
activesToAdd.forEach((activeToAdd) => {
finalActivesList.push([activeToAdd, 0]);
});
}
//second bl active list removal
finalActivesList = finalActivesList.slice(0, 10);
const blackListedActives = getUniqueBlackListActives(answersArray);
finalActivesList = finalActivesList.filter((active) => {
return !blackListedActives.includes(active);
});
// if (finalActivesList.length < 10) {
// for (let i = finalActivesList.length; i < 11; i++) {
// finalActivesList.push("Blank");
// blank_active_count++;
// }
// }
if (firstTime) {
finalActivesList.unshift(["Base", 100]);
} else {
finalActivesList.unshift(["Base Refill", 100]);
}
return finalActivesList;
}
async function getEngineRules(uniqueWeights) {
let activesToAdd = [];
let activesToRemove = [];
const rules = await getRules();
rules.forEach(function (rule) {
const operator = rule.operator;
const compareValue = rule.compare_value;
const ruleOutputVariable = rule.output_variable_name;
const actionTaken = rule.action;
const activesInQuestion = JSON.parse(rule.actives);
if (uniqueWeights[ruleOutputVariable]) {
if (operator == 0) {
// = eq
if (uniqueWeights[ruleOutputVariable] == compareValue) {
if (actionTaken == 1) {
//add
activesInQuestion.forEach((aiq) => {
activesToAdd.push(aiq);
});
} else if (actionTaken == 2) {
//remove
activesInQuestion.forEach((aiq) => {
activesToRemove.push(aiq);
});
}
}
} else if (operator == 1) {
// < less than
if (uniqueWeights[ruleOutputVariable] < compareValue) {
if (actionTaken == 1) {
//add
activesInQuestion.forEach((aiq) => {
activesToAdd.push(aiq);
});
} else if (actionTaken == 2) {
//remove
activesInQuestion.forEach((aiq) => {
activesToRemove.push(aiq);
});
}
}
} else if (operator == 2) {
// <= less than or equal
if (uniqueWeights[ruleOutputVariable] <= compareValue) {
if (actionTaken == 1) {
//add
activesInQuestion.forEach((aiq) => {
activesToAdd.push(aiq);
});
} else if (actionTaken == 2) {
//remove
activesInQuestion.forEach((aiq) => {
activesToRemove.push(aiq);
});
}
}
} else if (operator == 3) {
// > greater than
if (uniqueWeights[ruleOutputVariable] > compareValue) {
if (actionTaken == 1) {
//add
activesInQuestion.forEach((aiq) => {
activesToAdd.push(aiq);
});
} else if (actionTaken == 2) {
//remove
activesInQuestion.forEach((aiq) => {
activesToRemove.push(aiq);
});
}
}
} else if (operator == 4) {
// >= greater than or equal
if (uniqueWeights[ruleOutputVariable] >= compareValue) {
if (actionTaken == 1) {
//add
activesInQuestion.forEach((aiq) => {
activesToAdd.push(aiq);
});
} else if (actionTaken == 2) {
//remove
activesInQuestion.forEach((aiq) => {
activesToRemove.push(aiq);
});
}
}
} else if (operator == 5) {
// != not
if (uniqueWeights[ruleOutputVariable] != compareValue) {
if (actionTaken == 1) {
//add
activesInQuestion.forEach((aiq) => {
activesToAdd.push(aiq);
});
} else if (actionTaken == 2) {
//remove
activesInQuestion.forEach((aiq) => {
activesToRemove.push(aiq);
});
}
}
} else if (operator == 6) {
//between
let min = rule.min;
let max = rule.max;
if (uniqueWeights[ruleOutputVariable] >= min && uniqueWeights[ruleOutputVariable] <= max) {
if (actionTaken == 1) {
//add
activesInQuestion.forEach((aiq) => {
activesToAdd.push(aiq);
});
} else if (actionTaken == 2) {
//remove
activesInQuestion.forEach((aiq) => {
activesToRemove.push(aiq);
});
}
}
}
}
});
return { activesToAdd, activesToRemove };
}
function filterBlacklistActives(sortedActivesListWithScores) {
//remove blActives
const blackListedActives = getUniqueBlackListActives(dataToReturn);
sortedActivesListWithScores = sortedActivesListWithScores.filter((active) => {
return !blackListedActives.includes(active[0]);
});
return sortedActivesListWithScores;
}
function getUniqueAccumlatedWeights(answersArray) {
//create array of unique weight and accumlated value
let weightsArray = [];
let accumlatedUniqueWeightsWihBase = {};
answersArray.forEach(function (answer) {
if (answer.weights && Object.keys(answer.weights).length) weightsArray.push(answer.weights);
});
if (weightsArray.length == 0) {
return { accumlatedUniqueWeightsWihBase, sortedWeightsArray: [] };
}
weightsArray.forEach(function (weight) {
Object.keys(weight).forEach(function (key) {
if (accumlatedUniqueWeightsWihBase.hasOwnProperty(key)) {
accumlatedUniqueWeightsWihBase[key] = {
value: parseFloat(accumlatedUniqueWeightsWihBase[key].value) + parseFloat(weight[key].value),
base: parseFloat(accumlatedUniqueWeightsWihBase[key].base) + parseFloat(weight[key].base),
};
} else {
accumlatedUniqueWeightsWihBase[key] = {
value: parseFloat(weight[key].value),
base: parseFloat(weight[key].base),
};
}
});
});
let accumlatedUniqueWeights = {};
Object.entries(accumlatedUniqueWeightsWihBase).forEach(([variableName, { value, base }]) => {
accumlatedUniqueWeights[variableName] = parseFloat(value) / parseFloat(base);
});
let sortedEntries = Object.entries(accumlatedUniqueWeights).sort(function (a, b) {
return b[1] - a[1];
});
return { accumlatedUniqueWeights, sortedWeightsArray: sortedEntries };
}
async function calculatePrioritySelection(accumlatedUniqueWeights) {
const outputVariableList = await getFullOutputVariablesList().then((data) => data.output_variables);
const activesList = await getFullActivesList().then((data) => data.actives);
const finalActiveScores = {};
for (const active of activesList) {
//equation
const activeName = active.name;
let activesListWeightsScores = active.variables_scores ? JSON.parse(active.variables_scores) : {};
//filter empty active weights score
activesListWeightsScores = Object.entries(activesListWeightsScores).filter(([outputVarName, score]) => {
return score;
});
let filteredActivesWeightScores = Object.fromEntries(activesListWeightsScores);
Object.entries(filteredActivesWeightScores).forEach(([name, score]) => {
const outputVariableAccumlatedWeight = accumlatedUniqueWeights[name];
if (outputVariableAccumlatedWeight) {
const outputVariablePriority = outputVariableList.find((ovar) => ovar.name == name).priority;
if (finalActiveScores.hasOwnProperty(activeName)) {
finalActiveScores[activeName] = parseFloat(finalActiveScores[activeName]) + parseFloat(outputVariableAccumlatedWeight) * parseFloat(outputVariablePriority / 100) * parseFloat(score);
} else {
finalActiveScores[activeName] = parseFloat(outputVariableAccumlatedWeight) * parseFloat(outputVariablePriority / 100) * parseFloat(score);
}
}
});
}
//
const finalDividedList = {};
Object.entries(finalActiveScores).forEach(([active, score]) => {
if (!isNaN(score)) {
finalDividedList[active] = parseFloat(score / 1000);
}
});
let sortedFinalActiveslistWithScores = Object.entries(finalDividedList).sort(([, a], [, b]) => b - a);
let sortedFinalActiveslist = Object.keys(finalDividedList).sort((a, b) => finalDividedList[b] - finalDividedList[a]);
return { sortedFinalActiveslist, sortedFinalActiveslistWithScores };
}
function getUniqueBlackListActives(answersArray) {
let accumlatedBLActives = [];
answersArray.forEach(function (answer) {
if (answer.black_list_actives) {
for (const blActive of answer.black_list_actives) {
if (!accumlatedBLActives.includes(blActive)) {
accumlatedBLActives.push(blActive);
}
}
}
});
return accumlatedBLActives;
}
async function createProfile(uniqueWeights) {
const sections = await getProfileSections();
const container = $("#profile-result-container");
for (const section of sections) {
const sectionTitle = section.section_title;
profile_characteristics[sectionTitle] = [];
let containerTemplate = `