var medical_exp, dental_exp, ortho_exp, vision_exp, rx_exp, other_exp, num_depends, income;
var total_exp, rec_contrib_amt;

function retrieveInput (form) // Input values from form	
{	
	medical_exp = parseInput(form.medical_exp.value);
	dental_exp = parseInput(form.dental_exp.value);
	ortho_exp = parseInput(form.ortho_exp.value);
	vision_exp = parseInput(form.vision_exp.value);
	rx_exp = parseInput(form.rx_exp.value);
	other_exp = parseInput(form.other_exp.value);
	num_depends = parseInput(form.num_depends.value);
	income = parseInput(form.income.value);
}

function calcTotalExp (form)
{	total_exp = medical_exp + dental_exp + ortho_exp + vision_exp + rx_exp + other_exp;
	form.total_exp.value = format(total_exp, 2);
}

function calcContrib (form)
{	rec_contrib_amt = total_exp;
	if (rec_contrib_amt < contribMin)
		rec_contrib_amt = contribMin;
	if (rec_contrib_amt > contribMax)
		rec_contrib_amt = contribMax;	
	
	form.rec_contrib.value = format(rec_contrib_amt, 2);
}

function calcFica (amount)
{	if (amount > SSlimit-1)
		return (SSlimit * SSpercent) + (MedicPercent * amount);
	else return (SSpercent+MedicPercent)*amount;
}

function calcFedtax (amount)
{	var ret;
	
	amount = amount - personal_exempt[status] - (num_depends*exempt_amt) - deduct[status];
	if (amount < taxlimit1[status])
		return taxPercent[0]*amount;
	else
		ret = taxPercent[0]*taxlimit1[status];
		
	if (amount < taxlimit2[status])
		return ret + (taxPercent[1]*(amount-taxlimit1[status]));
	else
		ret = ret + (taxPercent[1]*(taxlimit2[status]-taxlimit1[status]));

	if (amount < taxlimit3[status])
		return ret + (taxPercent[2]*(amount - taxlimit2[status]));
	else
		ret = ret + (taxPercent[2]*(taxlimit3[status] - taxlimit2[status]));
	
	if (amount < taxlimit4[status])
		return ret + (taxPercent[3]*(amount - taxlimit3[status]));
	else
		ret = ret + (taxPercent[3]*(taxlimit4[status] - taxlimit3[status]));

	if (amount < taxlimit5[status])
		return ret + (taxPercent[4]*(amount - taxlimit4[status]));
	else
		ret = ret + (taxPercent[4]*(taxlimit5[status] - taxlimit4[status]));

	return ret + (taxPercent[5]*(amount - taxlimit5[status]));
}
	
function calcTaxSave (form)
{	fica_save_amt = calcFica (income) - calcFica (income-rec_contrib_amt);
	fedtax_save_amt = calcFedtax (income) - calcFedtax (income-rec_contrib_amt);
	total_taxsave_amt = fica_save_amt + fedtax_save_amt;
	form.fica_save.value = format(fica_save_amt, 2);
	form.fedtax_save.value = format(fedtax_save_amt, 2);
	form.total_taxsave.value = format(total_taxsave_amt, 2);
}
	
function parseInput (field)
{	if (field.length==0)
		return 0;
	else return eval(field);
}

function format(original_number, decimals) 
{	var result1 = original_number * Math.pow(10, decimals);
    var result2 = Math.round(result1);
    var result3 = result2 / Math.pow(10, decimals);
    return CommaFormatted(pad_with_zeros(result3, decimals));
}

function pad_with_zeros(rounded_value, decimal_places) {

    // Convert the number to a string
    var value_string = rounded_value.toString()
    
    // Locate the decimal point
    var decimal_location = value_string.indexOf(".")

    // Is there a decimal point?
    if (decimal_location == -1) {
        
        // If no, then all decimal places will be padded with 0s
        decimal_part_length = 0
        
        // If decimal_places is greater than zero, tack on a decimal point
        value_string += decimal_places > 0 ? "." : ""
    }
    else {

        // If yes, then only the extra decimal places will be padded with 0s
        decimal_part_length = value_string.length - decimal_location - 1
    }
    
    // Calculate the number of decimal places that need to be padded with 0s
    var pad_total = decimal_places - decimal_part_length
    
    if (pad_total > 0) {
        
        // Pad the string with 0s
        for (var counter = 1; counter <= pad_total; counter++) 
            value_string += "0"
        }
    return value_string
}

function CommaFormatted(amount)
{
	var delimiter = ","; // replace comma if desired
	var a = amount.split('.',2)
	var d = a[1];
	var i = parseInt(a[0]);
	if(isNaN(i)) { return ''; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	var n = new String(i);
	var a = [];
	while(n.length > 3)
	{
		var nn = n.substr(n.length-3);
		a.unshift(nn);
		n = n.substr(0,n.length-3);
	}
	if(n.length > 0) { a.unshift(n); }
	n = a.join(delimiter);
	if(d.length < 1) { amount = n; }
	else { amount = n + '.' + d; }
	amount = minus + amount;
	return amount;
}