/******************************************************************************
*	Web Application: fincl_plngl_pgrms
*	Original programming from MS-Excel
*	Copyright (c) 2007 Professional Representation Inc. All rights reserved.
*
*	Conversion from MS-Excel to JavaScript Web Application performed
*	by Ryan Provost, Inc. (http://www.ryanprovost.com/)
*
*	NOTE:   Please no comments on the code. We are well	aware that it is
*			far from optimized. It does work, though - on all browsers, no less!
*
*******************************************************************************/

var fincl_plngl_pgrms = function()
{
	var age							= parseInt($('AGE').value);
	var periods						= parseInt($('FUTURE_AGE').value) - age;
	
	if(periods < 0 ){
		$('fincl_plngl_pgrms').innerHTML	= "Projected age  must be less then Current age";
		return;
	}

	var resources					= parseFloat($('RESOURCES').value);
	var inflationRate				= parseFloat($('RATE_OF_INFLATION').value)/100;
	var inflationRate				= parseFloat($('RATE_OF_INFLATION').value)/100;

	//INFLOW
	var totalInflow					= parseFloat($('TOTAL_INFLOW').value);
	var inflowAdjInflation			= (totalInflow * inflationRate) + totalInflow;
	var inflowTaxRate				= parseFloat($('INFLOW_TAX_RATE').value)/100;
	var inflowAdjTaxes				= Math.round(totalInflow - (totalInflow * inflowTaxRate));
	if(DEBUG) alert('inflowAdjTaxes - '+inflowAdjTaxes)

	// OUTFLOW
	var totalOutflow				= parseFloat($('TOTAL_OUTFLOW').value);
	var outflowAdjInflation			= Math.round((totalOutflow * inflationRate) + totalOutflow);
	if(DEBUG) alert('outflowAdjInflation - '+outflowAdjInflation)

	var surplusDeficit				= inflowAdjTaxes - outflowAdjInflation;
	var netresources				= resources + surplusDeficit;
	if(DEBUG) alert('netresources - '+netresources)

	// Stnd Ret Pgrm Tax Calc
	var investmentDeferred			= parseFloat($('PERCENT_DEFERRED_INVESTMENT').value)/100;
	var investmentNonDeferred		= parseFloat($('PERCENT_NONDEFERRED_INVESTMENT').value)/100;
	var investmentTaxRate			= parseFloat($('PERCENT_INVESTMENT_TAX').value)/100;
	var deferredTaxRate				= investmentDeferred * 0;
	var nonDeferredTaxRate			= investmentNonDeferred * inflowTaxRate;
	var combinedTaxRate				= deferredTaxRate + nonDeferredTaxRate;

	var investmentTaxRate			= combinedTaxRate.toFixed(3);
	$('PERCENT_INVESTMENT_TAX').value = Math.round((investmentTaxRate*100)*100)/100;

	$('BOND_RETURN_ADJ_TAXES').value	= (((1-investmentTaxRate) * $('PERCENT_RETURN_BONDS').value)/100);
	$('STOCK_RETURN_ADJ_TAXES').value	= (((1-investmentTaxRate) * $('PERCENT_RETURN_STOCK').value)/100);
	if(DEBUG) alert("investmentTaxRate - "+investmentTaxRate);

	// BONDS
	var bondAllocation				= parseFloat($('PERCENT_BOND_ALLOCATION').value)/100;
	var bondBasedOnAllocation		= netresources * bondAllocation;
	var bondRateReturn				= parseFloat($('BOND_RETURN_ADJ_TAXES').value);
	var bondsReturn					= (bondBasedOnAllocation * bondRateReturn);
	if(DEBUG) alert('bondsReturn - '+bondsReturn)

	// STOCKS
	var stockAllocation				= parseFloat($('PERCENT_STOCK_ALLOCATION').value)/100;
	var stockBasedOnAllocation		= netresources * stockAllocation;
	var stockRateReturn				= parseFloat($('STOCK_RETURN_ADJ_TAXES').value);
	var stockReturn					= (stockBasedOnAllocation * stockRateReturn);
	if(DEBUG) alert('stockReturn - '+stockReturn)

	var combinedReturn				= bondsReturn + stockReturn;
	var combinedRateReturn			= combinedReturn/netresources;
	if(DEBUG) alert('combinedRateReturn - '+combinedRateReturn)
	
	var resourcesAdjCombinedReturn	= (netresources * combinedRateReturn) + netresources;

	var resultsResources			= resources;
	var resultsNetResources			= resultsResources + surplusDeficit;
	var availableResources			=(resultsNetResources * combinedRateReturn) + resultsNetResources

	if(DEBUG) alert("availableResources - "+availableResources);

	for(var i=1; periods >= i; i++)
	{
		totalInflow					= inflowAdjInflation;
		inflowAdjInflation			= (totalInflow * inflationRate) + totalInflow;
		inflowAdjTaxes				= totalInflow - (totalInflow * inflowTaxRate);
	if(DEBUG) alert("periods - "+i+'\n inflowAdjTaxes - '+inflowAdjTaxes)

		totalOutflow				= outflowAdjInflation;
		outflowAdjInflation			= (totalOutflow * inflationRate) + totalOutflow;
	if(DEBUG) alert("periods - "+i+'\n outflowAdjInflation - '+outflowAdjInflation)

		surplusDeficit				= inflowAdjTaxes - outflowAdjInflation;
		netresources				= resourcesAdjCombinedReturn + surplusDeficit;


			// BONDS
		bondBasedOnAllocation		= netresources * bondAllocation;
		bondsReturn					= (bondBasedOnAllocation * bondRateReturn);
	if(DEBUG) alert("periods - "+i+'\n bondsReturn - '+bondsReturn)

	// STOCKS
		stockBasedOnAllocation		= netresources * stockAllocation;
		stockReturn					= (stockBasedOnAllocation * stockRateReturn);
	if(DEBUG) alert("periods - "+i+'\n stockReturn - '+stockReturn)

		combinedReturn				= bondsReturn + stockReturn;
		combinedRateReturn			= combinedReturn/netresources;
	if(DEBUG) alert("periods - "+i+'\n combinedRateReturn - '+combinedRateReturn)

		resourcesAdjCombinedReturn	= (netresources * combinedRateReturn) + netresources;

		resultsResources			= availableResources;
		resultsNetResources			= resultsResources + surplusDeficit;
		availableResources			= (resultsNetResources * combinedRateReturn) + resultsNetResources;
		if(DEBUG) alert("periods - "+i+"\n availableResources - "+availableResources+"\n Rounded - "+Math.round(availableResources));

	}

	$('results_bonds').innerHTML		= $('PERCENT_BOND_ALLOCATION').value;
	$('results_stocks').innerHTML		= $('PERCENT_STOCK_ALLOCATION').value;
	$('inflowtaxrate').innerHTML		= inflowTaxRate;
	$('investment_taxrate').innerHTML	= $('PERCENT_INVESTMENT_TAX').value;
	$('BOND_RETURN_ADJ_TAXES').value	= Number($('BOND_RETURN_ADJ_TAXES').value).toFixed(3);
	$('STOCK_RETURN_ADJ_TAXES').value	= Number($('STOCK_RETURN_ADJ_TAXES').value).toFixed(3);
	$('results_bond_return').innerHTML	= Number($('BOND_RETURN_ADJ_TAXES').value);
	$('results_stock_return').innerHTML	= Number($('STOCK_RETURN_ADJ_TAXES').value);
	$('fincl_plngl_pgrms').innerHTML	= addCommas( Math.round(availableResources));


}


function fincl_plngl_pgrms_OLD () {
	// Calculate M16 Value
	if ( IsNumeric(document.getElementById("field_10").value) && IsNumeric(document.getElementById("field_11").value) )
		document.getElementById("field_12").value = roundNumber((1-(document.getElementById("field_10").value/100))*document.getElementById("field_11").value, 2)/100;

	// Calculate M18 Value
	if ( IsNumeric(document.getElementById("field_10").value) && IsNumeric(document.getElementById("field_13").value) )
		document.getElementById("field_14").value = roundNumber((1-(document.getElementById("field_10").value/100))*document.getElementById("field_13").value, 2)/100;

	// Set Calculation Array
	var prop_table	= new Array();
	prop_table[0]	= new Array();

	// Get User-Defined Variables
	prop_table[0]['row_7']		= parseFloat ( document.getElementById("field_1").value );
	prop_table[0]['row_11']		= parseFloat ( document.getElementById("field_3").value ); // field_3 current liquid assest
	prop_table[0]['row_19']		= parseFloat ( document.getElementById("field_4").value ); // field_4 inflow
	prop_table[0]['Taxrate_inflow'] = (document.getElementById("field_inflowtax").value/100);
	prop_table[0]['row_23']		= parseFloat ( document.getElementById("field_5").value ); // field_5 outflow
	prop_table[0]['row_20']		= parseFloat ( document.getElementById("field_6").value ); // field_6 Rate inflation
	prop_table[0]['row_24']		= parseFloat ( document.getElementById("field_6").value ); // field_6 Rate inflation
	prop_table[0]['row_43']		= parseFloat ( document.getElementById("field_8").value ); // field_7 % Bonds
	prop_table[0]['row_49']		= parseFloat ( document.getElementById("field_9").value ); // field_8 % Stocks
	prop_table[0]['row_45']		= (1-(document.getElementById("field_10").value/100))*document.getElementById("field_11").value; // field_11 Rate return bonds
	prop_table[0]['row_51']		= (1-(document.getElementById("field_10").value/100))*document.getElementById("field_13").value; // field_13 Rate return Stocks
	prop_table[0]['periods']	= document.getElementById("field_2").value - prop_table[0]['row_7'];


	// Convert Whole Numbers to Percentages
	prop_table[0]['row_20']		= ( prop_table[0]['row_20'] / 100 );
	prop_table[0]['row_24']		= ( prop_table[0]['row_24'] / 100 );
	prop_table[0]['row_43']		= ( prop_table[0]['row_43'] / 100 );
	prop_table[0]['row_45']		= ( prop_table[0]['row_45'] / 100 );
	prop_table[0]['row_49']		= ( prop_table[0]['row_49'] / 100 );
	prop_table[0]['row_51']		= ( prop_table[0]['row_51'] / 100 );


	/***
	*	Set Values
	**/
	
	// Determine Surplus/Deficit
	//Inflow Adjusted for Inflation = (inflow * inflation rate)+inflow
	prop_table[0]['row_21']		= ( prop_table[0]['row_19'] * prop_table[0]['row_20'] ) + prop_table[0]['row_19'];

	//Inflow Adjusted for taxes = inflow - (inflow * taxrate)
	prop_table[0]['InflowAdjTax'] = prop_table[0]['row_19'] - (prop_table[0]['row_19']*prop_table[0]['Taxrate_inflow']);

	//Outflow Adjusted for Inflation =  (outflow * rate inflation) + outflow
	prop_table[0]['row_25']		= ( prop_table[0]['row_23'] * prop_table[0]['row_24'] ) + prop_table[0]['row_23'];

	prop_table[0]['row_32']		= prop_table[0]['row_25']; // total outflow

	//prop_table[0]['row_34']		= prop_table[0]['row_21'] - prop_table[0]['row_32']; //Inflow Adjusted for Inflation - total outflow
	
	//Surplus/Deficit = Inflow Adjusted for taxes - total outflow
	prop_table[0]['row_34']		= prop_table[0]['InflowAdjTax'] - prop_table[0]['row_32'];
	
	prop_table[0]['row_12']		= prop_table[0]['row_34']; // Surplus/Deficit

	// NetResources = current liquid assest + Surplus/Deficit
	prop_table[0]['row_13']		= prop_table[0]['row_11'] + prop_table[0]['row_12'];

	// Determine Estimated Bonds/Stocks Return
	prop_table[0]['row_38']		= prop_table[0]['row_11']; // resources
	prop_table[0]['row_39']		= prop_table[0]['row_34']; // Surplus/Deficit

	// net resources = resources + Surplus
	prop_table[0]['row_40']		= prop_table[0]['row_38'] + prop_table[0]['row_39'];

	// Bonds/Cash based on suggested allocation = net resources * bond allocation %
	prop_table[0]['row_44']		= prop_table[0]['row_40'] * prop_table[0]['row_43'];

	// return on bonds = Bonds/Cash based on suggested allocation * Selected Rate of Return Bonds %
	prop_table[0]['row_46']		= prop_table[0]['row_44'] * prop_table[0]['row_45'];

	//Stocks based on suggested allocation = net resources * stock allocation %
	prop_table[0]['row_50']		= prop_table[0]['row_40'] * prop_table[0]['row_49'];

	//Return on stocks  = Stocks based on suggested allocation * Selected Rate of Return stocks %
	prop_table[0]['row_52']		= prop_table[0]['row_50'] * prop_table[0]['row_51'];

	// combined return = return on bonds + Return on stocks
	prop_table[0]['row_54']		= prop_table[0]['row_46'] + prop_table[0]['row_52'];

	// combined rate of return = combined return / net resources 
	prop_table[0]['row_55']		= prop_table[0]['row_54'] / prop_table[0]['row_40'];

	prop_table[0]['row_15']		= prop_table[0]['row_55']; //rate of return

	// Needed for propogation
	// Resources adjusted for combined Return = (net resources * combined rate of return) +net resources 
	prop_table[0]['row_57']		= ( prop_table[0]['row_40'] * prop_table[0]['row_55'] ) + prop_table[0]['row_40'];

	// Total for Period (same as row 57)
	prop_table[0]['row_16']		= ( prop_table[0]['row_13'] * prop_table[0]['row_15'] ) + prop_table[0]['row_13'];

	if ( prop_table[0]['periods'] == 0 ) {
		document.getElementById("fincl_plngl_pgrms").innerHTML = "$" + addCommas(prop_table[0]['row_16']);
	} else if ( prop_table[0]['periods'] < 0 ) {
		document.getElementById("fincl_plngl_pgrms").innerHTML = "Not enough periods";
	} else {
		for ( i=1; i<prop_table[0]['periods']+1; i++ ) {
			prop_table[i]	= new Array();

			// Determine Surplus/Deficit
			prop_table[i]['row_11']		= prop_table[i-1]['row_16']; // start resources = last iteration avail resources
			prop_table[i]['row_19']		= prop_table[i-1]['row_21']; // total inflow = last iteration Inflow Adjusted for Inflation
			prop_table[i]['row_20']		= prop_table[i-1]['row_20']; // inflow inflation rate
			prop_table[i]['Taxrate_inflow'] = prop_table[i-1]['Taxrate_inflow'];
			prop_table[i]['row_23']		= prop_table[i-1]['row_25']; // total outflow = last iteration Outflow Adjusted for Inflation
			prop_table[i]['row_24']		= prop_table[i-1]['row_24']; // rate of inflation
			prop_table[i]['row_38']		= prop_table[i-1]['row_57']; // resources = last iteration total resources
			prop_table[i]['row_43']		= prop_table[i-1]['row_43']; // allocation bond
			prop_table[i]['row_45']		= prop_table[i-1]['row_45']; // rate of return bond
			prop_table[i]['row_49']		= prop_table[i-1]['row_49']; // allocation stocks
			prop_table[i]['row_51']		= prop_table[i-1]['row_51']; // rate of return stocks

			//Inflow Adjusted for Inflation = (inflow * inflation rate)+inflow
			prop_table[i]['row_21']		= ( prop_table[i]['row_19'] * prop_table[i]['row_20'] ) + prop_table[i]['row_19'];
			
			//Inflow Adjusted for taxes = inflow - (inflow * taxrate)
			prop_table[i]['InflowAdjTax'] = prop_table[i]['row_19'] - (prop_table[i]['row_19']*prop_table[i]['Taxrate_inflow']);
			
			//Outflow Adjusted for Inflation =  (outflow * rate inflation) + outflow
			prop_table[i]['row_25']		= ( prop_table[i]['row_23'] * prop_table[i]['row_24'] ) + prop_table[i]['row_23'];
			
			prop_table[i]['row_32']		= prop_table[i]['row_25'];
			
			//prop_table[i]['row_34']		= prop_table[i]['row_21'] - prop_table[i]['row_32'];
			
			//Surplus/Deficit = Inflow Adjusted for taxes - total outflow
			prop_table[i]['row_34']		= prop_table[i]['InflowAdjTax'] - prop_table[i]['row_32'];
					
			prop_table[i]['row_12']		= prop_table[i]['row_34']; //Surplus/Deficit

			// NetResources = current liquid assest + Surplus/Deficit
			prop_table[i]['row_13']		= prop_table[i]['row_11'] + prop_table[i]['row_12'];
		
			// Determine Estimated Bonds/Stocks Return
			prop_table[i]['row_39']		= prop_table[i]['row_34'];

			// net resources = resources + Surplus
			prop_table[i]['row_40']		= prop_table[i]['row_38'] + prop_table[i]['row_39'];

			// Bonds/Cash based on suggested allocation = net resources * bond allocation %
			prop_table[i]['row_44']		= prop_table[i]['row_40'] * prop_table[i]['row_43'];

			// return on bonds = Bonds/Cash based on suggested allocation * Selected Rate of Return Bonds %
			prop_table[i]['row_46']		= prop_table[i]['row_44'] * prop_table[i]['row_45'];
		
			prop_table[i]['row_50']		= prop_table[i]['row_40'] * prop_table[i]['row_49'];
			prop_table[i]['row_52']		= prop_table[i]['row_50'] * prop_table[i]['row_51'];
			prop_table[i]['row_54']		= prop_table[i]['row_46'] + prop_table[i]['row_52'];
			prop_table[i]['row_55']		= prop_table[i]['row_54'] / prop_table[i]['row_40'];
			prop_table[i]['row_15']		= prop_table[i]['row_55'];

			// Needed for Propagation
			prop_table[i]['row_57']		= ( prop_table[i]['row_40'] * prop_table[i]['row_55'] ) + prop_table[i]['row_40'];

			// Total for Period
			prop_table[i]['row_16']		= ( prop_table[i]['row_13'] * prop_table[i]['row_15'] ) + prop_table[i]['row_13'];
		}

		// Output Total for Specified Period
		document.getElementById("fincl_plngl_pgrms").innerHTML = "$" + addCommas(Math.round(prop_table[prop_table[0]['periods']]['row_16']));

		// Set Summary Paragraph Items
		document.getElementById("results_bonds").innerHTML			= document.getElementById("field_8").value;
		document.getElementById("results_stocks").innerHTML			= document.getElementById("field_9").value;
		document.getElementById("results_tax_bracket").innerHTML	= document.getElementById("field_inflowtax").value;
		document.getElementById("results_bond_return").innerHTML	= document.getElementById("field_11").value;
		document.getElementById("results_stock_return").innerHTML	= document.getElementById("field_13").value;
	}
}
