function $( id ) {
  return document.getElementById( id );
}

function $$( element ) {
	var el = $( element );
  var raw = el.value;
  raw = raw.replace( /[$,]/g, '' );
  var value = parseFloat( raw );
	if ( value != raw ){
		el.value = 0;
		value = 0;
	}
  return value;
}      

function PMT( i, numPayments, principal ){
  var rate = Math.pow( ( 1 + i ), numPayments );
  var monthlyPayment = principal * ( i * rate ) / ( rate - 1 );
  return monthlyPayment;
}

function roundCents( value ) {
  return Math.round( value * 100 ) / 100.0;      
}

function addCommas( amount ) {
  var num = Math.floor( amount * 100+0.50000000001);
	var sign = num > 0 ? '' : '-';
	num = Math.abs( num );
  var cents = num % 100;
  num = Math.floor( num / 100 ).toString();
  if(cents<10) {
    cents = "0" + cents;  
  }
  
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) {
    num = num.substring(0,num.length-(4*i+3))+','+
    num.substring(num.length-(4*i+3));  
  }
  
  return sign + num + '.' + cents; 
}

function currencyFormat( value ){
  var amount = roundCents( value );
  return '$' + addCommas( amount );
}

function execute( price, downpayment, term ) {

  var TRTOW = {
    baseRent: null,
    monthlyEquityBuildup: null,
    totalMonthlyRent: null,
    accumulationEquity: null,
    projectedPurchasePrice: null,
    taxes: ASSUMPTIONS.taxes,
    insurance: ASSUMPTIONS.insurance
  };
  TRTOW.projectedPurchasePrice = price *
    Math.pow( 1 + ASSUMPTIONS.annualAppreciation, term );
  
  var PAYMENT_CALC_TENANT = {
    numberPayments: 12,
    firstMortgagePayment: null,
    equityBuildup: ( ( TRTOW.projectedPurchasePrice * 0.05 ) - downpayment ) / (12*term),
    investorLoanInterestRate: null,
    taxRate: null,
    annualAppreciation: null
  };
  
  var tenantApr = Math.pow((( MORTGAGE_DETAILS.interestRate / 2 ) + 1 ), 2/12 ) - 1;
  var tenantNumPayments = 12 * MORTGAGE_DETAILS.amortization;
  var tenantPrincipal = ASSUMPTIONS.firstMortgagePrincipal;

  PAYMENT_CALC_TENANT.firstMortgagePayment = PMT( 
    tenantApr, 
    tenantNumPayments, 
    tenantPrincipal );

  PAYMENT_CALC_TENANT.investorLoanInterestRate = (
      ( price * ASSUMPTIONS.investorDp ) - downpayment ) * 
    ( ASSUMPTIONS.investorInterestRate / 12 );
  PAYMENT_CALC_TENANT.taxRate = price *
    ASSUMPTIONS.taxRate /
    12;
  PAYMENT_CALC_TENANT.annualAppreciation = 
    PAYMENT_CALC_TENANT.firstMortgagePayment +
    PAYMENT_CALC_TENANT.equityBuildup +
    PAYMENT_CALC_TENANT.investorLoanInterestRate + 
    PAYMENT_CALC_TENANT.taxRate; 
    
  TRTOW.monthlyEquityBuildup = PAYMENT_CALC_TENANT.equityBuildup;
  TRTOW.baseRent = PAYMENT_CALC_TENANT.firstMortgagePayment + 
    PAYMENT_CALC_TENANT.investorLoanInterestRate;
  TRTOW.totalMonthlyRent = 
    TRTOW.baseRent + 
    TRTOW.monthlyEquityBuildup + 
    ASSUMPTIONS.taxes +
    ASSUMPTIONS.insurance;

  TRTOW.accumulationEquity = ( 
      term * 
      12 *
      TRTOW.monthlyEquityBuildup ) +
    downpayment;

  return TRTOW;      
}

function calculate(){
  var price = $$( 'price' );
  var downpayment = $$( 'downpayment' );
  var term = $$( 'term' );
	if (term > 5 ) {
		alert( "The maximum term is 5 years" );
		return false;
	}
	if (downpayment < 5000 ) {
		alert( "The minimum downpayment is $5,000" );
		return false;
	}
  $( 'results' ).style.visibility = 'visible';

  var trtow = execute( price, downpayment, term );

  $( 'rent' ).value = currencyFormat( trtow.baseRent );
  $( 'monthly_equity' ).value = currencyFormat( trtow.monthlyEquityBuildup );
  $( 'taxes' ).value = currencyFormat( trtow.taxes );
  $( 'insurance' ).value = currencyFormat( trtow.insurance );
  $( 'total_rent' ).value = currencyFormat( trtow.totalMonthlyRent );
  $( 'equity' ).value = currencyFormat( trtow.accumulationEquity );
  $( 'purchase_price' ).value = currencyFormat( trtow.projectedPurchasePrice );
  
  return false;     
}



