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
// 
deathCoef = 
    { age: 0.075673, systolic: 0.006062, smoker: 0.492189, diabetes: 0.333309, history: 0.503179, murmur: 0.355479, lvh: 0.167387 };

deathXbar = 
    { age: 74.9205674, systolic: 145.9106383, smoker: 0.1801418, diabetes: 0.1531915, history: 0.3446809, murmur: 0.1333333, lvh: 0.1489362 };

strokeCoef =
    {gender: 0.650715, age: 0.029065, systolic: 0.006130, diabetes: 0.589268, tia: 0.631572 };

strokeXbar =
    {gender: 1.4765957, age: 74.9205674, systolic: 145.9106383, diabetes: 0.1531915, tia: 0.1446809};


function calcStrokeRisk(data)
{    
    var betaBarSum = 0.0;
    var betaSum = 0.0;
    for(var k in strokeCoef)
    {
        dBetaBar = strokeCoef[k] * strokeXbar[k];
        betaBarSum += dBetaBar;

        dBeta = strokeCoef[k] * data[k].toFloat();
        betaSum += dBeta;
    }

    var risk = 1.0 - Math.pow(.8571, Math.exp(betaSum - betaBarSum)); // .8571 is a const in the spreadsheet
    
    
    // cap at .75
    if (risk > .75)
        risk = .75;

    // comparative value
    var compBetaSum = 90.0 * 0.00613;
    compBetaSum += strokeCoef['gender'] * data['gender'].toFloat();
    compBetaSum += strokeCoef['age'] * data['age'].toFloat();    
    var compRisk = 1.0 - Math.pow(.8571, Math.exp(compBetaSum - betaBarSum));    
    
    return new Array(risk, compRisk);
}

function calcDeathRisk(data)
{    
	var betaBarSum = 0.0;
	var betaSum = 0.0;
    for(var k in deathCoef)
    {
        dBetaBar = deathCoef[k] * deathXbar[k];
        betaBarSum += dBetaBar;

        dBeta = deathCoef[k] * data[k];
        betaSum += dBeta;
    }

    var risk = 1.0 - Math.pow(0.5225, Math.exp(betaSum - betaBarSum)); 
    
    // cap at .95
    if (risk > .95)
        risk = .95

    // comparative value
    var compBetaSum = 90.0 * 0.006062;
    compBetaSum += deathCoef['age'] * data['age'];
    var compRisk = 1.0 - Math.pow(0.5225, Math.exp(compBetaSum - betaBarSum));    
    
    return new Array(risk, compRisk);
}



function formDataValid(data)
{
    if ( (data['age'] > 94) || (data['age'] < 55))
    {
        $('error_msg').set('text',"Age must be beteen 55 and 94");
        return false;
    }

    if ( (data['systolic'] > 200) || (data['systolic'] < 90))
    {
        $('error_msg').set('text',"Systolic must be between 90 and 200");
        return false;
    }
    
 return true;
}

function calcRisks()
{

    var data = getFormData(document.forms.strokeForm);

    if ( formDataValid(data) )
    {
        $('error_msg').set('text',''); // clear error text
        
        var strokeVals = calcStrokeRisk(data);       
        var deathVals = calcDeathRisk(data);
         
        var strokeRisk = Math.round( 100 * strokeVals[0]);
        var deathRisk = Math.round( 100 * deathVals[0]);   
  
        // this is what the spreadsheet says, but it seems backwards to me
        if (strokeRisk > deathRisk)
            strokeRisk = deathRisk;

        var strokeRiskText = strokeRisk + "%";
        if (strokeRisk >= 75)
            strokeRiskText = "Greater than 75%";

  	    var deathRiskText = deathRisk + "%";   
        if (deathRisk >= 95)
      	    deathRiskText = "Greater than 95%";

      

        // Comparative vaues
        var compStrokeRisk = Math.round( 100 * strokeVals[1]);
        var compDeathRisk = Math.round( 100 * deathVals[1]);    

        // Set values
        $('stroke_risk_txt').set('text',strokeRiskText);
        $('death_risk_txt').set('text',deathRiskText);	         
        $('comp_stroke_risk_txt').set('text',compStrokeRisk + "%");
        $('comp_death_risk_txt').set('text',compDeathRisk + "%");          
              
        
        // And bar widths in the graph
        var fullW = $('graph_bkg').getStyle('width').toInt();
        fullW -= 10; // 10 pixel right border. Sorry.
        
        $('stroke_risk_bar').setStyle('width', (strokeRisk * fullW / 100).toInt());
        $('death_risk_bar').setStyle('width', (deathRisk * fullW/ 100).toInt());	         
        $('comp_stroke_risk_bar').setStyle('width', (compStrokeRisk * fullW/ 100).toInt());
        $('comp_death_risk_bar').setStyle('width', (compDeathRisk * fullW/ 100).toInt());        
        
    }
}


//Mootools setup
window.addEvent('domready', function()
{
    calcRisks();
});
