﻿/// <reference path="../../../assets/js/jquery/jquery-vsdoc.js" />
jQuery(document).ready(function() {
   //alert(495 / (1.29579 - .35004 * Log10(74 + 97 - 30) + .22100 * Log10(168)) - 450);
    jQuery('#BodyFatCalc #Waist').keyup(function() { CalculateBodyFat(); });
    jQuery('#BodyFatCalc #Weight').keyup(function() { CalculateBodyFat(); });
    jQuery('#BodyFatCalc #Height').keyup(function() { CalculateBodyFat(); });
    jQuery('#BodyFatCalc #Hip').keyup(function() { CalculateBodyFat(); });
    jQuery('#BodyFatCalc #Neck').keyup(function() { CalculateBodyFat(); });
    jQuery('#BodyFatCalc #Male').click(function() { ChangeType(false); CalculateBodyFat(); });
    jQuery('#BodyFatCalc #Female').click(function() { ChangeType(false); CalculateBodyFat(); });
    jQuery('#BodyFatCalc #Metric').click(function() { ChangeSystem(false); });
    jQuery('#BodyFatCalc #English').click(function() { ChangeSystem(false); });
    jQuery('#BodyFatCalc #Metric')[0].checked = BodyFatCalcUnitIsMetric;
    jQuery('#BodyFatCalc #English')[0].checked = !BodyFatCalcUnitIsMetric;    
    jQuery('#BodyFatCalc #YMCA').click(function() { ChangeType(false); });
    jQuery('#BodyFatCalc #Navy').click(function() { ChangeType(false); });
    jQuery('#BodyFatCalc #Navy')[0].checked = BodyFatCalcTypeIsNavy;
    jQuery('#BodyFatCalc #YMCA')[0].checked = !BodyFatCalcTypeIsNavy;    
    ChangeType(true);
    ChangeSystem(true);
});
function ChangeType(bFirstTime) {
    var bMetric = jQuery('#BodyFatCalc #Metric')[0].checked;
    var bNavy = jQuery('#BodyFatCalc #Navy')[0].checked;
    BodyFatCalcTypeIsNavy = bNavy;       
    if (!bNavy) {
        jQuery('#BodyFatCalc #HipRow').hide();
        jQuery('#BodyFatCalc #NeckRow').hide();
        jQuery('#BodyFatCalc #WaistPlace').text('navel');          
    } else {
        var bMale = jQuery('#BodyFatCalc #Male')[0].checked;
        if (!bMale) {
            jQuery('#BodyFatCalc #HipRow').show();
            jQuery('#BodyFatCalc #WaistPlace').text('narrowest');
        } else {
            jQuery('#BodyFatCalc #HipRow').hide();
            jQuery('#BodyFatCalc #WaistPlace').text('navel');            
        }     
        jQuery('#BodyFatCalc #NeckRow').show();
    }
    if (!bFirstTime)
        CalculateBodyFat();
}
function WeightUnit() {
    if (BodyFatCalcUnitIsMetric) 
        return " kg";
    else
        return " lbs";
}
function SizeUnit() {
    if (BodyFatCalcUnitIsMetric) 
        return " cm";
    else
        return " in";
}
function ChangeSystem(bFirstTime) {
    var bMetric = jQuery('#BodyFatCalc #Metric')[0].checked;
    var bNavy = jQuery('#BodyFatCalc #Navy')[0].checked;
    if (BodyFatCalcUnitIsMetric == bMetric && !bFirstTime) return;
    BodyFatCalcUnitIsMetric = bMetric;
    var bMale = jQuery('#BodyFatCalc #Male')[0].checked;
    var iWaist = jQuery('#BodyFatCalc #Waist')[0].value;
    var iWeight = jQuery('#BodyFatCalc #Weight')[0].value;
    var iHeight = jQuery('#BodyFatCalc #Height')[0].value;
    var iHip = jQuery('#BodyFatCalc #Hip')[0].value;  
    var iNeck = jQuery('#BodyFatCalc #Neck')[0].value;

    jQuery('#BodyFatCalc #WeightUnit').text(WeightUnit());
    jQuery('#BodyFatCalc #WaistUnit').text(SizeUnit());
    jQuery('#BodyFatCalc #HeightUnit').text(SizeUnit());
    jQuery('#BodyFatCalc #NeckUnit').text(SizeUnit());
    jQuery('#BodyFatCalc #HipUnit').text(SizeUnit());

    if (BodyFatCalcUnitIsMetric) {
        iWaist = iWaist * 2.54;
        iWeight = iWeight * .4535924;
        iHeight = iHeight * 2.54;
        iHip = iHip * 2.54;
        iNeck = iNeck * 2.54;         
    } else {
        iWaist = iWaist / 2.54;
        iWeight = iWeight / .4535924;
        iHeight = iHeight / 2.54;
        iHip = iHip / 2.54;
        iNeck = iNeck / 2.54; 
    }
    if (isNaN(iWeight) || iWeight == 0)
        jQuery('#BodyFatCalc #Weight')[0].value = "";
    else
        jQuery('#BodyFatCalc #Weight')[0].value = Math.round(iWeight);
    if (isNaN(iWaist) || iWaist == 0)
        jQuery('#BodyFatCalc #Waist')[0].value = "";
    else
        jQuery('#BodyFatCalc #Waist')[0].value = Math.round(iWaist);
    if (isNaN(iHeight) || iHeight == 0)
        jQuery('#BodyFatCalc #Height')[0].value = "";
    else
        jQuery('#BodyFatCalc #Height')[0].value = Math.round(iHeight);
    if (isNaN(iHip) || iHip == 0)
        jQuery('#BodyFatCalc #Hip')[0].value = "";
    else
        jQuery('#BodyFatCalc #Hip')[0].value = Math.round(iHip);
    if (isNaN(iNeck) || iNeck == 0)
        jQuery('#BodyFatCalc #Neck')[0].value = "";
    else
        jQuery('#BodyFatCalc #Neck')[0].value = Math.round(iNeck);
    if (!bFirstTime)
        CalculateBodyFat();
}
function validate(bNavy) {
    if (!jQuery('#BodyFatCalc #Male')[0].checked && !jQuery('#BodyFatCalc #Female')[0].checked) {
        alert('Select a gender');
        return false;
    }
    if (jQuery('#BodyFatCalc #Waist')[0].value == "") return false;
    if (jQuery('#BodyFatCalc #Weight')[0].value == "") return false; 
    if (jQuery('#BodyFatCalc #Height')[0].value == "") return false;    
    if (bNavy) {
        var bMale = jQuery('#BodyFatCalc #Male')[0].checked;    
        if (jQuery('#BodyFatCalc #Neck')[0].value == "") return false;
        if (!bMale && jQuery('#BodyFatCalc #Hip')[0].value == "") return false;
    }
    return true;
}
function CalculateBodyFat() {
    var bNavy = jQuery('#BodyFatCalc #Navy')[0].checked;
    if (!validate(bNavy)) return;   
    var bMale = jQuery('#BodyFatCalc #Male')[0].checked;
    var bEnglish = jQuery('#BodyFatCalc #English')[0].checked;
    var iWaist = Number(jQuery('#BodyFatCalc #Waist')[0].value);
    var iWeight = Number(jQuery('#BodyFatCalc #Weight')[0].value);
    var iHeight = Number(jQuery('#BodyFatCalc #Height')[0].value);
    var iHip = Number(jQuery('#BodyFatCalc #Hip')[0].value);
    var iNeck = Number(jQuery('#BodyFatCalc #Neck')[0].value);
    var iBodyFat = 0;  
    if(bNavy)
        iBodyFat = GetBodyFatNavy2(iNeck, iHip, iWaist, iHeight, bMale, bEnglish);
    else
        iBodyFat = GetBodyFat(iWaist, iWeight, bMale, bEnglish);

    if (isFinite(iBodyFat) && !isNaN(iBodyFat) && !isNaN(iWeight) && iWeight != 0) {
        var iFatMass = GetFatMass(iBodyFat, iWeight);
        var iLeanMass = GetLeanMass(iFatMass, iWeight)
        var iBMI = GetBMI(iHeight, iWeight, bEnglish)
        var sBodyFatCategory = GetBodyFatCategory(iBodyFat, bMale);
        var sBMICategory = GetBMICategory(iBMI);
        jQuery('#BodyFatCalc #Category').text(sBodyFatCategory);           
        jQuery('#BodyFatCalc #BodyFat').text((Math.round(iBodyFat * 100)) + '%');
        jQuery('#BodyFatCalc #FatMass').text(Math.round(iFatMass) + WeightUnit());
        jQuery('#BodyFatCalc #LeanMass').text(Math.round(iLeanMass) + WeightUnit());
        jQuery('#BodyFatCalc #BMI').text(Math.round(iBMI));
        jQuery('#BodyFatCalc #BMICategory').text(sBMICategory);               
    } else {
        jQuery('#BodyFatCalc #BodyFat').text("");
        jQuery('#BodyFatCalc #FatMass').text("");
        jQuery('#BodyFatCalc #LeanMass').text("");
        jQuery('#BodyFatCalc #BMI').text(""); 
        jQuery('#BodyFatCalc #BMICategory').text("");                  
    }        
}
function GetBodyFat(waist, weight, bMale, bEnglish) {
    if (!bEnglish) {
        waist = waist / 2.54;
        weight = weight / .4535924;
    }
    var iUnitFactor = bMale ? 98.42 : 76.76;
    return (-iUnitFactor + (4.15 * waist) - (.082 * weight)) / weight;
}
function GetBodyFatNavy(neck, hip, waist, height, bMale, bEnglish) {
    if (bMale) {
        var iMaleUnitFactor = bEnglish ? 36.76 : 30.3;
        return ((86.01 * Log10(neck * waist)) - (70.041 * Log10(height)) + iMaleUnitFactor);
    } else {
        var iFemaleUnitFactor = bEnglish ? 78.387 : 104.912;
        return (163.205 * Log10(hip + waist - neck) - 97.684 * Log10(height) - iFemaleUnitFactor);
    }
}
function Log10(iValue) {
    return Math.log(iValue)/Math.log(10);
}
function GetBodyFatNavy2(neck, hip, waist, height, bMale, bEnglish) {
    if (bEnglish) {
        waist = waist * 2.54;
        height = height * 2.54;
        hip = hip * 2.54;
        neck = neck * 2.54;
    }
    if (bMale)
        return .01 * (495 / (1.0324 - .19077 * Log10(waist - neck) + .15456 * Log10(height)) - 450);
    else
        return .01 * (495 / (1.29579 - .35004 * Log10(waist + hip - neck) + .22100 * Log10(height)) - 450);
}

function GetFatMass(bodyFat, weight) {
    return bodyFat * weight;
}
function GetLeanMass(fatMass, weight) {
    return weight - fatMass;
}
function GetBMI(height, weight, bEnglish) {
    if (bEnglish)
        return weight / Math.pow(height,2) * 703;    
    else
        return weight / Math.pow(height, 2) * 10000;
}
function GetBodyFatCategory(bodyFat, male) {
    bodyFat = Math.round(bodyFat * 100) * .01;
    if (male) {
        if (bodyFat < .02)
            return "Not Enough Fat";
        else if (bodyFat <= .05)
            return "Essential Fat";
        else if (bodyFat <= .13)
            return "Athletic";
        else if (bodyFat <= .17)
            return "Fit";
        else if (bodyFat <= .25)
            return "Acceptable";
        else
            return "Obese";

    } else {
        if (bodyFat < .10)
            return "Not Enough Fat";
        else if (bodyFat <= .13)
            return "Essential Fat";
        else if (bodyFat <= .20)
            return "Athletic";
        else if (bodyFat <= .24)
            return "Fit";
        else if (bodyFat <= .31)
            return "Acceptable";
        else
            return "Obese";
    }
}
function GetBMICategory(bmi) {
    if (bmi <= 18.5)
        return "Underweight";
    else if (bmi <= 25)
        return "Normal";
    else if (bmi <= 30)
        return "Overweight";
    else if (bmi <= 40)
        return "Obese";
    else
        return "Extremely Obese";
}
