let calculatedBodyFat = null; let selectedGender = "male"; // ========== AUTO CAPTURE LOCATION ========== $.getJSON('https://api.db-ip.com/v2/free/self/', function(info) { $("#country").val(info.countryName || ""); $("#city").val(info.city || ""); }).fail(function() { $.getJSON('https://ipinfo.io/json?token=36c49d56a01964', function(info) { $("#country").val(info.country || ""); $("#city").val(info.city || ""); }).fail(function() { $("#country").val(""); $("#city").val(""); }); }); // ========================================== // MALE / FEMALE TOGGLE FUNCTION // ========================================== function showCalculator(type) { if (type === 'male') { selectedGender = "male"; $('#maleCalculator').show(); $('#femaleCalculator').hide(); $('#btnMale').addClass('btn-primary active').removeClass('btn-outline-primary'); $('#btnFemale').addClass('btn-outline-primary').removeClass('btn-primary active'); } else { selectedGender = "female"; $('#maleCalculator').hide(); $('#femaleCalculator').show(); $('#btnFemale').addClass('btn-primary active').removeClass('btn-outline-primary'); $('#btnMale').addClass('btn-outline-primary').removeClass('btn-primary active'); } } // ========================================== // MODAL LOGIC (OPEN ONLY ONCE) // ========================================== function handleBodyFatResult(resultValue, category, extraSuggestion, resultEl) { calculatedBodyFat = resultValue; if (localStorage.getItem("bodyFatFormSubmitted") === "true") { showBodyFatResult(resultEl, resultValue, category, extraSuggestion); } else { $("#emailModal").modal("show"); } } function showBodyFatResult(resultEl, value, category, extraSuggestion) { let cls = category === "Lean" ? "category-lean" : category === "Fit" ? "category-fit" : "category-overfat"; let html = `

Estimated Body Fat: ${value}%

Category: ${category}

${extraSuggestion} `; resultEl.removeClass("category-lean category-fit category-overfat animate") .html(html) .addClass(cls); setTimeout(() => resultEl.addClass("animate"), 50); } // ==================================================== // ================= MALE CALCULATION ================= // ==================================================== function calculateBodyFatMale() { selectedGender = "male"; let waist = convertToCm(parseFloat($("#waistMale").val())); let neck = convertToCm(parseFloat($("#neckMale").val())); let height = convertToCm(parseFloat($("#heightMale").val())); const resultEl = $("#resultMale"); if (!waist || !neck || !height) { resultEl.text("⚠️ Please enter all values."); return; } if (waist - neck <= 0) { resultEl.html("⚠️ Waist and Neck values are unrealistic."); return; } const bodyFat = 495 / (1.0324 - 0.19077 * Math.log10(waist - neck) + 0.15456 * Math.log10(height)) - 450; const result = parseFloat(bodyFat.toFixed(1)); let category = ""; let suggestion = ""; if (result < 14) category = "Lean"; else if (result < 25) category = "Fit"; else { category = "Overfat"; suggestion = `💡 Aim to reduce ~${(result - 24).toFixed(1)}% body fat to reach Fit range.`; } handleBodyFatResult(result, category, suggestion, resultEl); } // ==================================================== // ================ FEMALE CALCULATION ================ // ==================================================== function calculateBodyFatFemale() { selectedGender = "female"; let waist = convertToCm(parseFloat($("#waistFemale").val())); let hip = convertToCm(parseFloat($("#hipFemale").val())); let neck = convertToCm(parseFloat($("#neckFemale").val())); let height = convertToCm(parseFloat($("#heightFemale").val())); const resultEl = $("#resultFemale"); if (!waist || !hip || !neck || !height) { resultEl.text("⚠️ Please enter all values."); return; } if (waist + hip - neck <= 0) { resultEl.html("⚠️ Waist, Hip, and Neck values are unrealistic."); return; } const bodyFat = 495 / (1.29579 - 0.35004 * Math.log10(waist + hip - neck) + 0.22100 * Math.log10(height)) - 450; const result = parseFloat(bodyFat.toFixed(1)); let category = ""; let suggestion = ""; if (result < 21) category = "Lean"; else if (result < 33) category = "Fit"; else { category = "Overfat"; suggestion = `💡 Aim to reduce ~${(result - 32).toFixed(1)}% body fat to reach Fit range.`; } handleBodyFatResult(result, category, suggestion, resultEl); } // ==================================================== // ================ FORM SUBMISSION =================== // ==================================================== $("#pipedriveForm").on("submit", async function(e) { e.preventDefault(); if (localStorage.getItem("bodyFatFormSubmitted") === "true") { alert("You have already submitted the form."); return; } const email = $("#email").val().trim(); const res = grecaptcha.getResponse(); if (!email) { alert("Please enter a valid email."); return; } if (!res) { alert("Please complete the reCAPTCHA."); return; } const submitBtn = $(this).find("button[type='submit']"); submitBtn.prop("disabled", true).text("Submitting..."); const data = { name: $("#name").val() || "", email: email || "", phone: $("#phone").val() || "", lab_name: $("#lab_name").val() || "", country: $("#country").val() || "", city: $("#city").val() || "", source: "Sales Tool", "g-recaptcha-response": res || "" }; try { await fetch("https://livehealth.solutions/v4/on-boarding/pipedrive_capture/", { method: "POST", mode: "no-cors", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }); localStorage.setItem("bodyFatFormSubmitted", "true"); $("#emailModal").modal("hide"); grecaptcha.reset(); if (selectedGender === "male") { showBodyFatResult($("#resultMale"), calculatedBodyFat, "", ""); } else { showBodyFatResult($("#resultFemale"), calculatedBodyFat, "", ""); } } catch (err) { console.error("Error:", err); alert("Something went wrong."); } finally { submitBtn.text("Submitted ✅").prop("disabled", true); } }); // ==================================================== // Convert to CM function convertToCm(value) { return $("#unit").val() === "inch" ? value * 2.54 : value; }