var expenseRows = 0;

function initialize()
{
	addExpenseRow();
	addExpenseRow();
	addExpenseRow();
	addExpenseRow();
}






function addExpenseRow()
{
	var totals = document.getElementById("expensetotals");
	
	var tr = document.createElement("tr");
	var r = expenseRows++;
	
	
	var d = document.createElement("td");
	d.innerHTML = "<input type='text' name='data"+r+"_d' style='width: 12em'>";
	tr.appendChild(d);
	
	for(var c = 0; c<12; c++)
	{
		var td = document.createElement("td");
			var input = document.createElement("input");
			input.setAttribute("type", "text");
			input.setAttribute("id", "expensedata"+r+"_"+c);
			input.onblur = getExpenseUpdater(r, c);
		td.appendChild(input);
		
		tr.appendChild(td);
	}
	
	var y = document.createElement("td");
	y.setAttribute("id", "expensedata"+r+"_y");
	y.setAttribute("class", "total");
	y.innerHTML = "0.00";
	tr.appendChild(y);
	
	var m = document.createElement("td");
	m.setAttribute("id", "expensedata"+r+"_m");
	m.setAttribute("class", "total");
	m.innerHTML = "0.00";
	tr.appendChild(m);
	
	totals.parentNode.insertBefore(tr, totals);
}


function getExpenseUpdater(r, c)
{
	return function() { updateExpenseTotals(r, c)};
}

function updateExpenseTotals(r, c)
{
	var mycell = document.getElementById("expensedata"+r+"_"+c);
	mycell.value = formatDollar(orZero(mycell.value));
	
	
	var cellTotal = 0;
	
	for(var m = 0; m<12; m++)
	{
		cellValue = parseFloat(document.getElementById("expensedata"+r+"_"+m).value);
		
		cellTotal += orZero(cellValue);
	}
	
	document.getElementById("expensedata"+r+"_y").innerHTML = formatDollar(cellTotal);
	document.getElementById("expensedata"+r+"_m").innerHTML = formatDollar(cellTotal / 12);
	
	
	
	var monthTotal = 0;
	
	for(var i=0; i<expenseRows; i++)
	{
		monthValue = parseFloat(document.getElementById("expensedata"+i+"_"+c).value);
		
		monthTotal += orZero(monthValue);
	}
	
	document.getElementById("expensedatat_" + c).innerHTML = formatDollar(monthTotal);
	
	
	
	var total = 0;
	
	for(var m = 0; m<12; m++)
	{
		value = parseFloat(document.getElementById("expensedatat_"+m).innerHTML);
		
		total += orZero(value);
	}
	
	document.getElementById("expensedatat_y").innerHTML = formatDollar(total);
	document.getElementById("expensedatat_m").innerHTML = formatDollar(total/12);
	
	updateOption2();
	updateOption3();
}


function updateOption2()
{
	var monthly = document.getElementById("expensedatat_m").innerHTML;

	for(var m=0; m<12; m++)
	{
		var monthTotal = 0;
		
		for(var i=0; i<12; i++)
		{
			var monthfor = (i+m)%12;
			monthValue = document.getElementById("expensedatat_"+monthfor).innerHTML;
			
			monthTotal += orZero(monthValue * (12 - i));
		}
		
		document.getElementById("two1_" + m).innerHTML = formatDollar(monthTotal / 12);
	
		document.getElementById("twof_" + m).innerHTML = monthly;
	}
}

function updateOption3()
{	
	for(var r=0; r<12; r++)
	{
		for(var m=0; m<12; m++)
		{
			var total = 0;
			
			for(var i=0; i<r; i++)
			{
				var monthfor = (i+m)%12;
				value = document.getElementById("expensedatat_"+monthfor).innerHTML;
				
				total += orZero(value / 12);
			}
			
			for(var i=r; i<12; i++)
			{
				var monthfor = (i+m)%12;
				value = document.getElementById("expensedatat_"+monthfor).innerHTML;
				
				total += orZero(value / (i+1));
			}
			
			document.getElementById("three"+r+"_"+m).innerHTML = formatDollar(total);
		}
	}




	var foreverMonths = document.getElementById("expensedatat_m").innerHTML;

	for(var m=0; m<12; m++)
	{
		document.getElementById("threef_"+m).innerHTML = foreverMonths;
	}
}


function orZero(value)
{
	if(isNaN(value))
	{
		return 0;
	}
	else
	{
		return value;
	}
}


function formatDollar(value)
{
	var string = String(Math.ceil(value * 100) / 100);

	var point = string.indexOf(".");
	
	if (point == -1)
		return string + ".00";
		
	if (string.length == point + 2)
		return string + "0";
		
	if (point == 0)
		return "0" + string;
		
	return string;
}
