function reCalculateKt(changedObj) {
	ktArray = new Array();
	
	refreshVariables();
	
	ktArray["results"] = new Array();
	
    var startdateTemp = ktArray["vars"]["first_payment_date"].split("/");
    var paydate = new Date(startdateTemp[2], startdateTemp[0]-1, startdateTemp[1]);    
    var monthdays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

	ktArray["results"]["monthly_interest_rate"] = (Math.pow(1+(ktArray["vars"]["interest_rate"]/100)/ktArray["vars"]["compound_period"], ktArray["vars"]["compound_period"]/ktArray["vars"]["periods_per_year"])-1)*100;
	
	var ii = Math.pow((1+(ktArray["vars"]["interest_rate"]/100)/ktArray["vars"]["compound_period"]), (ktArray["vars"]["compound_period"]/ktArray["vars"]["periods_per_year"]));
	var nn = ktArray["vars"]["periods_per_year"]*ktArray["vars"]["term_of_loan"];
	ktArray["results"]["original_monthly_payment"] = ktArray["results"]["monthly_payment"] = (ktArray["vars"]["loan_amount"]*(ii-1)/(1-Math.pow(ii,-nn)));
	if (ktArray["vars"]["interest_only_period"]) {
		ii = Math.pow((1+(ktArray["vars"]["interest_rate"]/100)/ktArray["vars"]["compound_period"]), (ktArray["vars"]["compound_period"]/ktArray["vars"]["periods_per_year"]));
		nn = ktArray["vars"]["periods_per_year"]*(ktArray["vars"]["term_of_loan"]-ktArray["vars"]["interest_only_period"]);
		ktArray["results"]["monthly_payment"] = (ktArray["vars"]["loan_amount"]*(ii-1)/(1-Math.pow(ii,-nn)));
	}
	
	if (!ktArray["vars"]["extra_monthly_payment"]) ktArray["vars"]["extra_monthly_payment"] = 0;
	ktArray["results"]["total_monthly_payment"] = ktArray["results"]["monthly_payment"]+ktArray["vars"]["extra_monthly_payment"];
	
	ktArray["results"]["adj_interest_rate"] = ktArray["vars"]["interest_rate"]
	
	//calculate monthly payments and totals
	ktArray["results"]["monthly"] = new Array();
	ktArray["results"]["credit"] = ktArray["vars"]["loan_amount"];
	ktArray["results"]["total_interest"] = 0;
	ktArray["results"]["total_extra_payments"] = 0;
	ktArray["results"]["total_principal_paid"] = 0;
	ktArray["results"]["total_payments"] = 0;
	ktArray["results"]["est_max_rate"] = 0;
	ktArray["results"]["est_max_payment"] = 0;
	while (ktArray["results"]["credit"]>0) {
		var cnt = ktArray["results"]["monthly"].length;
		ktArray["results"]["monthly"][cnt] = new Array();
		
    	if (cnt) {
    		switch(ktArray["vars"]["periods_per_year"]) {
    			case 1:
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
    			break;
    			case 2:
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
    			break;
    			case 4:
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
    			break;
    			case 6:
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
    			break;
    			case 12:
		    		paydate.setDate(paydate.getDate()+monthdays[paydate.getMonth()]+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));
    			break;
    			case 24:
    				if (cnt%2) {
    					//first payment of the month
		    			paydate.setDate(paydate.getDate()+14);    					
    				} else {
    					//second payment of the month
		    			paydate.setDate(paydate.getDate()+(monthdays[paydate.getMonth()]-14)+(paydate.getFullYear()%4==0 && paydate.getMonth()==1 ? 1 : 0));    					
    				}
    			break;
    			case 26:
	    			paydate.setDate(paydate.getDate()+14);    					
    			break;
    			case 52:
	    			paydate.setDate(paydate.getDate()+7);    					
    			break;
    			case 365:
    			case 364:
    			case 360:
	    			paydate.setDate(paydate.getDate()+1);
    			break;
    		}
    	}
    	ktArray["results"]["monthly"][cnt]["paydate"] = (paydate.getMonth()+1)+"/"+paydate.getDate()+"/"+paydate.getFullYear();

    	ktArray["results"]["monthly"][cnt]["interest_rate"] = ktArray["results"]["adj_interest_rate"];
    	if (cnt>((ktArray["vars"]["year_rate_fixed"]-1)*12) && (cnt-((ktArray["vars"]["year_rate_fixed"]-1)*12))%ktArray["vars"]["months_between_adjustments"]==0) {
    		ktArray["results"]["monthly"][cnt]["interest_rate"] = ktArray["results"]["adj_interest_rate"] = (ktArray["results"]["monthly"][cnt]["interest_rate"]+ktArray["vars"]["expected_adjustment"]);

    		ii = Math.pow((1+(ktArray["results"]["monthly"][cnt]["interest_rate"]/100)/ktArray["vars"]["compound_period"]), (ktArray["vars"]["compound_period"]/ktArray["vars"]["periods_per_year"]));
			nn = (ktArray["vars"]["periods_per_year"]*ktArray["vars"]["term_of_loan"])-cnt;
			ktArray["results"]["total_monthly_payment"] = (ktArray["results"]["credit"]*(ii-1)/(1-Math.pow(ii,-nn)));
    	}
    	if (ktArray["results"]["est_max_rate"]<ktArray["results"]["monthly"][cnt]["interest_rate"]) {
    		ktArray["results"]["est_max_rate"] = parseFloat(ktArray["results"]["monthly"][cnt]["interest_rate"].toFixed(2));
    	}
    	
		ktArray["results"]["monthly"][cnt]["payment_due"] = parseFloat(ktArray["results"]["total_monthly_payment"].toFixed(2));
    	if (ktArray["vars"]["interest_only_period"] && cnt<(ktArray["vars"]["interest_only_period"]*ktArray["vars"]["periods_per_year"])) {
    		ktArray["results"]["monthly"][cnt]["payment_due"] = ktArray["results"]["interest_only_payment"];
    	}
		
		if (ktArray["vars"]["additional_payment"+cnt]) {
			ktArray["results"]["monthly"][cnt]["additional_payment"] = ktArray["vars"]["additional_payment"+cnt];
		} else {
			ktArray["results"]["monthly"][cnt]["additional_payment"] = 0;
		}
		
		if (!cnt && ktArray["vars"]["payment_type_beginorend"]==2) {
			ktArray["results"]["monthly"][cnt]["interest_due"] = 0;
		} else {
	    	ktArray["results"]["monthly"][cnt]["interest_due"] = parseFloat(((Math.pow(1+ktArray["results"]["adj_interest_rate"]/100/ktArray["vars"]["compound_period"], ktArray["vars"]["compound_period"]/ktArray["vars"]["periods_per_year"])-1)*ktArray["results"]["credit"]).toFixed(2));
	    	ktArray["results"]["total_interest"] += ktArray["results"]["monthly"][cnt]["interest_due"];
		}
    	
    	if (cnt) {
    		ktArray["results"]["monthly"][cnt]["interest_paid"] = ktArray["results"]["monthly"][cnt-1]["interest_paid"]+ktArray["results"]["monthly"][cnt]["interest_due"];
    	} else {
    		ktArray["results"]["monthly"][cnt]["interest_paid"] = ktArray["results"]["monthly"][cnt]["interest_due"];
    	}
    	
    	if ((ktArray["results"]["credit"]-ktArray["results"]["monthly"][cnt]["payment_due"]-ktArray["results"]["monthly"][cnt]["additional_payment"])<(ktArray["results"]["monthly"][cnt]["payment_due"]/10)) ktArray["results"]["monthly"][cnt]["payment_due"] = ktArray["results"]["credit"]+ktArray["results"]["monthly"][cnt]["interest_due"];
    	
    	ktArray["results"]["monthly"][cnt]["principal_paid"] = parseFloat((ktArray["results"]["monthly"][cnt]["payment_due"]-ktArray["results"]["monthly"][cnt]["interest_due"]+ktArray["results"]["monthly"][cnt]["additional_payment"]).toFixed(2));
    	ktArray["results"]["total_principal_paid"] += ktArray["results"]["monthly"][cnt]["principal_paid"];

    	ktArray["results"]["total_payments"] += ktArray["results"]["monthly"][cnt]["payment_due"]+ktArray["results"]["monthly"][cnt]["additional_payment"];
    	
    	ktArray["results"]["monthly"][cnt]["balance"] = parseFloat((ktArray["results"]["credit"]-ktArray["results"]["monthly"][cnt]["principal_paid"]).toFixed(2));
    	
    	ktArray["results"]["monthly"][cnt]["cum_interest"] = ktArray["results"]["total_interest"];
    	ktArray["results"]["monthly"][cnt]["cum_principal"] = ktArray["results"]["total_principal_paid"];

    	ktArray["results"]["credit"] = ktArray["results"]["monthly"][cnt]["balance"];
    	
    	if (ktArray["results"]["est_max_payment"]<ktArray["results"]["monthly"][cnt]["payment_due"]) {
    		ktArray["results"]["est_max_payment"] = ktArray["results"]["monthly"][cnt]["payment_due"];
    	}
    	
    	if (ktArray["results"]["credit"]<0) return 1;
	}
	
	ktArray["results"]["number_of_payments"] = ktArray["results"]["monthly"].length;
	ktArray["results"]["number_of_years_to_payoff"] = ktArray["results"]["number_of_payments"]/12;
	
	ktArray["results"]["internal_rate_return"] = ((ktArray["results"]["est_max_payment"]*0.0001*12)-1)*10;
	
	//balance
	var balancemonth = (ktArray["vars"]["balance_at_year"]*12)-1;
	if (balancemonth) {
		ktArray["results"]["outstanding_balance"] = ktArray["results"]["monthly"][balancemonth]["balance"];
		ktArray["results"]["interest_paid"] = ktArray["results"]["monthly"][balancemonth]["interest_paid"];
		if (!ktArray["vars"]["original_down_payment"]) ktArray["vars"]["original_down_payment"] = 0;
		ktArray["results"]["equity"] = ktArray["vars"]["loan_amount"]-ktArray["results"]["outstanding_balance"]+ktArray["vars"]["original_down_payment"];
	}
	
	ktArray["results"]["est_interest_savings"] = (ktArray["results"]["number_of_payments"]*parseFloat(ktArray["results"]["original_monthly_payment"])-ktArray["vars"]["loan_amount"]-parseFloat(ktArray["results"]["total_interest"]));
		
	displayValues();
}

function displayValues() {
	for (var fieldId in ktArray["results"]) {
		var fieldObj = document.getElementById(fieldId);
		if (fieldObj && ktArray["results"][fieldId]) {
			fieldObj.innerHTML = numberFormat(ktArray["results"][fieldId], fieldObj.getAttribute("valuetype"), fieldObj.getAttribute("valueformat"));
		}
	}
	
	var i=0, row, payment_shedule_content=document.getElementById("payment_shedule_content"), newDiv, borderbottom="";
    payment_shedule_content.innerHTML = "";
	while (row = ktArray["results"]["monthly"][i]) {

    	if ((i+1)%ktArray["vars"]["periods_per_year"]==0) {
    		borderbottom = " borderBottom";
    	} else {
    		borderbottom = "";
    	}

    	if (!row["additional_payment"]) row["additional_payment"] = 0;
		
		newDiv = document.createElement("div");
    	newDiv.className = "ps_no aligncenter"+borderbottom;
    	newDiv.innerHTML = i+1;
    	payment_shedule_content.appendChild(newDiv);
    	
		newDiv = document.createElement("div");
    	newDiv.className = "ps_paymentdate aligncenter"+borderbottom;
    	newDiv.innerHTML = numberFormat(row["paydate"], "date", "");
    	payment_shedule_content.appendChild(newDiv);
    	
		newDiv = document.createElement("div");
    	newDiv.className = "ps_paymentdue alignleft"+borderbottom;
    	newDiv.innerHTML = numberFormat(row["interest_rate"], "percent", "0.3");
    	payment_shedule_content.appendChild(newDiv);
    	
		newDiv = document.createElement("div");
    	newDiv.className = "ps_interestrate alignleft"+borderbottom;
    	newDiv.innerHTML = numberFormat(row["payment_due"], "money", "0.2");
    	payment_shedule_content.appendChild(newDiv);
    	
		newDiv = document.createElement("div");
    	newDiv.className = "ps_additionalpayment alignright"+borderbottom;
    	newDiv.style.height = "20px";
    	newDiv.innerHTML = "<input type='text' id='additional_payment"+i+"' value='"+numberFormat(row["additional_payment"], "money", "0.2")+"' valuetype='money' valueformat='0.0' onchange='reCalculateKt(this);'>";
    	payment_shedule_content.appendChild(newDiv);
    	
		newDiv = document.createElement("div");
    	newDiv.className = "ps_interestdue aligncenter"+borderbottom;
    	newDiv.innerHTML = numberFormat(row["interest_due"], "money", "0.2");
    	payment_shedule_content.appendChild(newDiv);
    	
		newDiv = document.createElement("div");
    	newDiv.className = "ps_principalpaid aligncenter"+borderbottom;
    	newDiv.innerHTML = numberFormat(row["principal_paid"], "money", "0.2");
    	payment_shedule_content.appendChild(newDiv);
    	
		newDiv = document.createElement("div");
    	newDiv.className = "ps_balance alignright"+borderbottom;
    	newDiv.innerHTML = numberFormat(row["balance"], "money", "0.2");
    	payment_shedule_content.appendChild(newDiv);
    	
		newDiv = document.createElement("div");
    	newDiv.className = "clearboth";
    	newDiv.innerHTML = "";
    	payment_shedule_content.appendChild(newDiv);
    	
		i++;
	}
}


var helpTexts = new Array();
helpTexts["term_of_loan"] = "<b>Term of Loan</b><br />Mortgage loans usually have 15 or 30-year terms. Auto loans are usually between 2 and 5 years.";
helpTexts["interest_rate"] = "The starting annual interest rate. For most popular ARMs, this rate remains fixed for a specified number of years.";
helpTexts["first_payment_date"] = "<b>First Payment Date</b><br />Assumes that the first payment date is at the end of the first period.<br />Shortcut: To enter today's date, press Ctrl+;";
helpTexts["year_rate_fixed"] = "In a 5-year ARM, the initial interest rate remains fixed for the first 5 years. After that, the rate is subject to adjustments, depending upon market conditions.<br />ARM loans are often used when planning to sell the house after a number of years. 3, 5, 7, and 10-year ARMs are the most common.";
helpTexts["months_between_adjustments"] = "<b>Months Between Adjustments:</b><br />The adjustment period is the number of months between each interest rate adjustment. The common adjustment period is 12 months, meaning that the rate will be adjusted once a year at most.";
helpTexts["expected_adjustment"] = "<b>Expected Adjustment:</b><br />The amount that you think the interest rate will be adjusted. This amount is added to the interest rate at the beginning of each adjustment period.";
helpTexts["interest_rate_cap"] = "<b>Interest Rate Cap:</b><br />The maximum interest rate the mortgage allows. The rate will not be adjusted higher than the cap.";
helpTexts["est_max_rate"] = "<b>Estimated Maximum Interest Rate:</b><br />Based upon the assumptions for 'Expected adjustment' and 'Months between adjustments' and the 'Interest rate cap', this is the estimated maximum rate that you would expect over the life of the loan.";
helpTexts["est_max_payment"] = "<b>Estimated Maximum Monthly Payment:</b><br />This is one of the most important estimates! Based upon the rate adjustment assumptions, this is what you'd expect your maximum monthly payment to be over the life of the loan.";
helpTexts["internal_rate_return"] = "<b>Internal Rate of Return (IRR)</b><br />This is used to provide an estimate of the effective APR (Annual Percentage Rate) for comparing with other types of loans.";

