function calculate()
{  
	var currentAge = document.getElementById("currentAge").value;
	if ( currentAge.length == 0 )
	{
		alert("Please enter your current age.");
		return;
	}
	currentAge = parseFloat(currentAge);
	if ( isNaN(currentAge) )
	{
		alert("Please enter your current age as a number");
		return;
	}
	if ( currentAge < 0 || currentAge > 120)
	{
		alert("Please enter a current age between 0 and 120");
		return;
	}


	var retirementAge = document.getElementById("retirementAge").value;
	if ( retirementAge.length == 0 )
	{
		alert("Please enter your retirement age.");
		return;
	}
	retirementAge = parseFloat(retirementAge);
	if ( isNaN(retirementAge) )
	{
		alert("Please enter your retirement age as a number");
		return;
	}
	if ( retirementAge < 20 || retirementAge > 120)
	{
		alert("Please enter a retirement age between 20 and 120");
		return;
	}

	var runOut = parseFloat( document.getElementById("runOut").value);

	if ( runOut != -1 && retirementAge >= runOut )
	{
		alert("Your desired retirement age must be less than the age at which your savings run out");
		return;
	}

	if ( currentAge >= retirementAge )
	{
		alert("Your desired retirement age must be greater than your current age.");
		return;
	}


	var income = document.getElementById("income").value; 
	if ( income.length == 0 )
	{
		alert("Please enter your desired retirement income.");
		return;
	}
	income = fixNumber(income);
	income = parseFloat(income);
	
	if ( isNaN(income) )
	{
		alert("Please enter your desired retirement income as a number.");
		return;
	}
	if ( income <= 0 ) 
	{
		alert("Please enter a desired retirement income greater than 0.");
		return;
	}


	var savings = document.getElementById("savings").value; 
	if ( savings.length == 0 )
	{
		alert("Please enter your current savings.");
		return;
	}
	savings = fixNumber(savings);
	savings = parseFloat(savings);
	
	if ( isNaN(savings) )
	{
		alert("Please enter your current savings as a number.");
		return;
	}


	var savings = document.getElementById("savings").value; 
	if ( savings.length == 0 )
	{
		alert("Please enter your current savings.");
		return;
	}
	savings = fixNumber(savings);
	savings = parseFloat(savings);
	
	if ( isNaN(savings) )
	{
		alert("Please enter your current savings as a number.");
		return;
	}


	var ror = document.getElementById("ror").value; 
	if ( ror.length == 0 )
	{
		alert("Please enter your expected post-tax investment return.");
		return;
	}
	ror = fixNumber(ror);
	ror = parseFloat(ror);
	if ( isNaN(ror) )
	{
		alert("Please enter your expected post-tax investment return as a number.");
		return;
	}
	if ( ror < 0 || ror > 30 )
	{
		alert("Please enter an investment return between 0 and 30.");
		return;
	}
  

	var roi = document.getElementById("roi").value; 
	if ( roi.length == 0 )
	{
		alert("Please enter expected inflation.");
		return;
	}
	roi = fixNumber(roi);
	roi = parseFloat(roi);
	if ( isNaN(roi) )
	{
		alert("Please enter expected inflation as a number.");
		return;
	}
	if ( roi < 0 || roi > 30 )
	{
		alert("Please enter an expected inflation between 0 and 30.");
		return;
	}
	
	var yearstoretirement = retirementAge - currentAge;

	var lumpsum;
	var inflationearnings;
	if ( runOut == -1 )
	{ 
		if ( ror <= roi )
		{
			alert("It is not possible for your savings to last forever if your investment return is not greater than inflation");
			return;
		}
		inflationearnings = ror/100 - roi/100;
		lumpsum = income / inflationearnings;
	}
	else
	{
		var yearsinretirement = runOut - retirementAge;
		inflationearnings = 1 + ror/100 - roi/100;
		if ( inflationearnings == 1 )
			lumpsum = income * yearsinretirement;
		else
			lumpsum = income * ( (1 - Math.pow(inflationearnings, yearsinretirement) ) / ( 1 - inflationearnings ) ) / Math.pow(inflationearnings, yearsinretirement);
	}

	var inflationlumpsum = lumpsum * Math.pow( (1+roi/100), yearstoretirement);

	var earnings = 1+ror/100;

	var savingsperyear = inflationlumpsum - savings * Math.pow(earnings, yearstoretirement);

	if ( savingsperyear > 0 )
		savingsperyear /= ( ( 1-Math.pow(earnings, yearstoretirement) ) / ( 1 - earnings ) );
	else 
		// calculate how much extra we have
		savingsperyear /= Math.pow(1+ror/100, yearstoretirement);
		
	var x = document.getElementById("results");

	var results = "Based on the projections you entered:<p>You want to retire in <b>" + yearstoretirement + "</b> years.";

	if ( runOut == -1 )
	{
		results += "<p>You will need to live off your savings <b>forever</b>.";
	}
	else results += "<p>You will need to live off your savings for <b>" + yearsinretirement + "</b> years.";

	results += "<p>You will need total savings of <b>" + formatDollars(inflationlumpsum) + "</b> which is <b>" + formatDollars(lumpsum) + "</b> in today's dollars.";

	if ( savingsperyear <= 0 )
		results += "<p>You already have enough savings to retire at age " + retirementAge + ".  In fact, you have <b>" + formatDollars(-1*savingsperyear) + "</b> extra.";
	else
		results += "<p>You will need to save <b>" + formatDollars(savingsperyear) + "</b> per year.";

	x.innerHTML = results;
	x.style.display = "block";
}



