
function getFormData(theForm)
{
    formData = new Object();
    
    theElems = theForm.elements;   
     
    for(var i=0;i<theElems.length;i++)
    {
        e = theElems[i];

        switch(e.type)
        {
        case 'text':
        case 'textarea':
            formData[e.name] = e.value;
            break;
        case 'radio': // assumes at least one of the buttons is selected
            if ( e.checked )
                formData[e.name] = e.value;
            break;
            
        case 'select':
            formData[e.name] = e.options[e.selectedIndex];
            break;

        default:
            break;
        }
    }
    return formData;
}


//
// Coefficients
// 

afCoef =
{
    gender: 1.994060, age: 0.150520, bmi: 0.019300, sbp: 0.006150, hrx: 0.424100, pr_intv: 0.070650, vhd: 3.795860, 
    hxchf: 9.428330, age2: -0.000380, gender_age2: -0.000280, age_vhd: -0.042380, age_hxchf: -0.123070
};

afXbar = 
{
     gender: 0.4464, age: 60.9022, bmi: 26.2861, sbp: 136.1674, hrx: 0.2413, pr_intv: 16.3901, vhd: 0.0281, 
     hxchf: 0.0087, age2: 3806.9000, gender_age2: 1654.6600, age_vhd: 1.8961, age_hxchf: 0.6100
 };


function calcBmi(height, mass)
{
	bmi = 703.0 * mass / (height * height);
	 
    return bmi;   
}


function calcAfRisk(data)
{    
    // Fill in derived values
    data['age2'] = (data['age'].toFloat() * data['age'].toFloat());
    data['gender_age2'] = (data['gender'].toFloat() * data['age2'].toFloat());
    data['age_vhd'] = (data['age'].toFloat() * data['vhd'].toFloat());
    data['age_hxchf'] = (data['age'].toFloat() * data['hxchf'].toFloat());
    
    // do computation
    var betaBarSum = 0.0;
    var betaSum = 0.0;
    for(var k in afCoef)
    {
        dBetaBar = afCoef[k] * afXbar[k];
        betaBarSum += dBetaBar;

        dBeta = afCoef[k] * data[k].toFloat();
        betaSum += dBeta;
    }

    var risk = 1.0 - Math.pow(.96337, Math.exp(betaSum - betaBarSum)); // const is from  the spreadsheet


    // cap at .3
    if (risk > .3)
        risk = .3
  
    
    return risk;

}


function formDataValid(data)
{
    if ( (data['age'] > 90) || (data['age'] < 45))
    {
        $('error_msg').set('text',"Age must be between 45 and 90");
        return false;
    }

    if ( (data['height'] > 84) || (data['height'] < 48))
    {
        $('error_msg').set('text',"Height must be between 48 and 84");
        return false;
    }
    
    if ( (data['weight'] > 300) || (data['weight'] < 80))
    {
        $('error_msg').set('text',"Weight must be between 80 and 300");
        return false;
    }
    
    if ( (data['sbp'] > 200) || (data['sbp'] < 90))
    {
        $('error_msg').set('text',"Systolic pressure must be between 90 and 200");
        return false;
    }

    if ( (data['pr_intv_ms'] > 220) || (data['pr_intv_ms'] < 100))
    {
        $('error_msg').set('text',"PR Interval must be between 100 and 220");
        return false;
    }
    
    return true;
}

function calcRisks()
{

    var data = getFormData(document.forms.afRiskForm);

    if ( formDataValid(data) )
    {
        $('error_msg').set('text',''); // clear error text
                
        // user risk
        data['bmi'] = calcBmi(data['height'].toFloat(), data['weight'].toFloat());
        data['pr_intv'] = (data['pr_intv_ms'].toFloat() / 10.0);
        
        var afRisk = calcAfRisk(data);

        // comparative risk
        data['bmi'] = 22.5;
        data['sbp'] = 124.5;
        data['hrx'] = 0;
        data['pr_intv'] = 16;
        data['vhd'] = 0;
        data['hxchf'] = 0;     
        var compRisk = calcAfRisk(data);

        var afRiskPct = Math.round( 100 * afRisk);
        var compRiskPct = Math.round( 100 * compRisk);   
  
    	var afRiskText = afRiskPct + "%";
        if (afRiskPct >= 30)
            afRiskText = ">30%";

   
        // text
        $('af_risk_txt').set('text',afRiskText);
        $('comp_af_risk_txt').set('text',compRiskPct + "%");

        // And bar widths in the graph
        var fullW = $('graph_bkg').getStyle('width').toInt();
        fullW -= 10; // 10 pixel right border. Sorry.

        // NOTE: Bars peg at 30%
        $('af_risk_bar').setStyle('width', (afRiskPct * fullW / 30).toInt());          
        $('comp_af_risk_bar').setStyle('width', (compRiskPct * fullW/ 30).toInt());       
        
    }
}


//Mootools setup
window.addEvent('domready', function()
{
    calcRisks();
});

