var g_am_bInInitialize = false;
var g_am_bGraphReady = false;
var aAmortResult = new Array();
var txtTable = "";

var g_am_pLoanSlider               = null;
var g_am_pRateSlider               = null;
var g_am_pTermSlider               = null;
var g_am_pExtrapaymentamountSlider = null;
var g_am_pExtrapaymentmonthSlider  = null;

var g_strChartLegend = '<div class="amortizationlegendcontainer"><div class="amortizationlegendentry"><div class="amortizationlegendbalance"></div>Loan Balance</div><div class="amortizationlegendentry"><div class="amortizationlegendprinciple"></div>Total Principle Paid</div><div class="amortizationlegendentry"><div class="amortizationlegendinterest"></div>Total Interest Paid</div><div class="amortizationlegenddivider"><br></div></div>';

function am_saveCalculatorToMyC21(pObj, strId){
    if( g_lMyC21Account == null ) {
        if( !processMyC21Account() ){
            //not logged in, display login form
            displayMyC21Login(pObj);
            return false;
        }
    }

    var fm = document.amortization;
    if( am_checkForm(fm, strId) ){
       var payment      = cleanAndParseInt(fm.amort_extrapaymentamount.value);
       var afterMonth   = cleanAndParseInt(fm.amort_extrapaymentmonth.value);
       var loanAmount   = cleanAndParseInt(fm.amort_loan.value);
       var loanTerm     = fm.amort_term[fm.amort_term.selectedIndex].value;
       var interestRate = cleanAndParseFloat(fm.amort_rate.value);

       var parms = 'calctype=Z&loanamount='+ escape(loanAmount) +'&interestrate='+ escape(interestRate);
       parms += '&loanterm='+ escape(loanTerm) +'&payment='+ escape(payment) +'&aftermonth='+ escape(afterMonth);

       displayMyC21SaveItemPopup(pObj, 'type=C&'+ parms, 'save_img');
       //dcsMultiTrack('WT.cg_n', 'Engage', 'WT.z_engage_type', 'Engage', 'WT.z_engage_event', 'Save Search');
    }
    return false;
}

function am_checkForm(form, strId)
{
   var errorMsg = "";
   var i;
   var message = new Array();
   var inputs = new Array(form.length);
   var monthconcat = "0";

   //am_clearResults();

   var interestrate, loanamount, loantype, extrapaymentamount, extrapaymentmonth;
   for (i = 0; i < form.length; i++) {
      inputs[i] = form.elements[i].name;  
   }

   for (i = 0; i < form.length; i++) {
      if (inputs[i] == "amort_rate")
         interestrate = i;
      else if (inputs[i] == "amort_loan")
         loanamount = i;
      else if (inputs[i] == "amort_term")
         loantype = i;
      else if (inputs[i] == "amort_extrapaymentamount")
         extrapaymentamount = i;
      else if (inputs[i] == "amort_extrapaymentmonth")
         extrapaymentmonth = i;
   }

   message[0] = "Please enter your loan amount.\n";
   message[1] = "Your loan amount should be free of special characters or letters.\n";
   message[2] = "Your loan amount should be greater than $20000 and less than $1,000,000,000.\n";
   message[3] = "Please enter your interest rate.\n";
   message[4] = "Your interest rate should be free of special characters or letters.\n";
   message[5] = "Your interest rate should be greater than 0% and less than 51%.\n";
   message[6] = "Your extra payment amount should be free of special characters or letters.\n";
   message[7] = "Your extra payment amount should be greater than $1 and less than your loan amount.\n";
   message[8] = "Your extra payment month should be free of special characters or letters.\n";
   message[9] = "Your extra payment month should be greater than 1 and less than your loan term.\n";
   message[10] = "You must specify either both or neither of the extra payment amount and month.\n";

   var loanAmountValue = cleanInput(form.elements[loanamount].value);
   var interestRateValue = cleanInput(form.elements[interestrate].value);
   var extraPaymentValue = cleanInput(form.elements[extrapaymentamount].value);
   var extraMonthValue = cleanInput(form.elements[extrapaymentmonth].value);
   var iLoanLength = parseInt(form.elements[loantype][form.elements[loantype].selectedIndex].value) * 12;

   errorMsg += validateRangedNumberValue(loanAmountValue,    message[0], message[1], message[2], 20001, 999999999);
   errorMsg += validateRangedNumberValue(interestRateValue,  message[3], message[4], message[5], 1, 50);
   errorMsg += validateEmptyOrRangedNumberValue(extraPaymentValue,  message[6], message[7], 2, parseInt(loanAmountValue) - 1);
   errorMsg += validateEmptyOrRangedNumberValue(extraMonthValue,  message[8], message[9], 2, (iLoanLength - 1));

   if ((isBlank(extraPaymentValue) + isBlank(extraMonthValue)) == 1 ) {
      errorMsg += message[10];
   }


   //No need to return anything here
   if (errorMsg.length == 0) {
      //If there's no error message, calculate
      am_clearResults(strId);
      am_calculate();
      am_showResults(strId);
      am_DrawChart(strId);
      return true;
   } else {
      //If there's an error message, just show it
      alert("Before continuing, the following fields require attention:\n\n" + errorMsg);
   }
   am_DrawChart(strId);
   return false;
}

function am_calculate()
{
   aAmortResult = new Array();
   txtTable = "";

   var extrapaymentamount = new Number(0);
   var extrapaymentmonth = new Number(0);
   if ( isBlank(cleanInput(document.amortization.amort_extrapaymentamount.value)) != 1 ) {
      extrapaymentamount = parseFloat(cleanInput(document.amortization.amort_extrapaymentamount.value));
      extrapaymentmonth = parseInt(cleanInput(document.amortization.amort_extrapaymentmonth.value));
   }
   // === Start C# Port ==

   var dAnnualInterestRate, dTotalInterest, dInterest;
   var dMonthly;
   var dLoanAmt, dBegBalance, dPrincipal, dRemBalance;
   var nTerm;
   var txtResult="";

   dLoanAmt = parseFloat(cleanInput(document.amortization.amort_loan.value));
   nTerm = parseInt(document.amortization.amort_term[document.amortization.amort_term.selectedIndex].value);
   dAnnualInterestRate = parseFloat(cleanInput(document.amortization.amort_rate.value))/1200;
   dMonthly = (dLoanAmt * dAnnualInterestRate) / (1 - 1/parseFloat(Math.pow(parseFloat(1 + dAnnualInterestRate), (12 * nTerm))));

   //Response.Write("<script language=\"javascript\">\n");
   //Response.Write("document.frmAmortization.txtMonPayment.value=" + Decimal.Round(dMonthly, 2).ToString() + "\n");
   //Response.Write("</script>\n");

   dBegBalance = dLoanAmt;
   dTotalInterest = 0;
   var i=1;
   while (i <= (12 * nTerm)) {
      if (dBegBalance <= dMonthly) {
         dInterest = 0;
         dPrincipal = dBegBalance;
      } else {
         dInterest = dBegBalance * dAnnualInterestRate;
         if (extrapaymentamount > 0 && i == extrapaymentmonth) {
            dPrincipal = extrapaymentamount - dInterest;
         } else {
            dPrincipal = dMonthly - dInterest;
         }
      }

      dRemBalance = dBegBalance - dPrincipal;

      txtResult += "<TR>";
      txtResult += "<TD>" + i + "</TD>";

      aAmortResult[i-1] = new Object();
      aAmortResult[i-1].dInterest = dInterest;
      aAmortResult[i-1].dPrincipal = dPrincipal;
      aAmortResult[i-1].dRemBalance = dRemBalance;

      txtResult += "<TD>$" + commasDecimals(dInterest.toString()) + "</TD>";
      txtResult += "<TD>$" + commasDecimals(dPrincipal.toString()) + "</TD>";
      txtResult += "<TD>$" + commasDecimals(dRemBalance.toString()) + "</TD>";
      txtResult += "</TR>";

      if (dRemBalance == 0)
         break;

      dBegBalance = dRemBalance;
      dTotalInterest = dTotalInterest + dInterest;
      i++;
   }       //End of while

   txtTable += g_strChartLegend;
   txtTable += "<div class=\"calcresultlabel amortization\">It will take " + i + " months to pay off this loan.<br>";
   txtTable += "Total interest paid: $" + commasDecimals(dTotalInterest.toString()) + "</div>";
   txtTable += "<div class=\"amortizationtablecontainer\">";
   txtTable += "<table class=\"amortizationtable\" cellSpacing=\"0\" cellPadding=\"3\" width=\"100%\" border=\"0\">";
   txtTable += "<tr>";
   txtTable += "<th>";
   txtTable += "Month";
   txtTable += "</th>";
   txtTable += "<th>";
   txtTable += "Interest payment";
   txtTable += "</th>";
   txtTable += "<th>";
   txtTable += "Principle payment";
   txtTable += "</th>";
   txtTable += "<th>";
   txtTable += "Remaining balance";
   txtTable += "</th>";
   txtTable += "</tr>";

   txtTable += txtResult;

   txtTable += "</table>";
   txtTable += "</div>";
   
}

function am_clearResults(strId)
{
   var objResults = document.getElementById('objResults');
   if( objResults != null ) {
      objResults.innerHTML = "";
   }
   ProxySimpleBarGraph_Clear(strId);
   ProxySimpleBarGraph_ShowImage(true, strId);
}

function am_showResults(strId)
{
   var objResults = document.getElementById('objResults');
   if( objResults != null ) {
      objResults.innerHTML = txtTable;
   }   
}

function SimpleBarGraph_Ready_Amortization(strId)
{
   if( window.SimpleBarGraph_Ready_Amortization_foo ) {
      setTimeout(function() { SimpleBarGraph_Ready_Amortization_foo(strId);}, 50);
      } 
   else {
      alert('implementation of XyChartReady missing...');
      }
}

function SimpleBarGraph_Ready_Amortization_foo(strId){
   ProxySimpleBarGraph_SetImage('/images/calculator/default_amortization.jpg', strId);
   ProxySimpleBarGraph_ShowImage(true, strId);

   g_am_bGraphReady = true;
}

function am_DrawChart(strId)
{
   ProxySimpleBarGraph_Clear(strId);
   ProxySimpleBarGraph_ShowImage(true, strId);
   
   if ( !g_am_bGraphReady ) {
      return;
   }
   fm = document.forms.amortization;

   var nTerm = parseInt(fm.amort_term[fm.amort_term.selectedIndex].value);

   xData1 = new Object();
   xData1['color1'] = 0xEEB31D;                   
   xData1['color2'] = 0xEEB31D; 
   xData1['width'] = 5;
   xData1['offset'] = 0;

   xData2 = new Object();
   xData2['color1'] = 0xFFFFFF;                   
   xData2['color2'] = 0xFFFFFF; 
   xData2['width'] = 5;
   xData2['offset'] = 1;

   xData3 = new Object();
   xData3['color1'] = 0x000000;
   xData3['color2'] = 0x000000;
   xData3['width'] = 5;
   xData3['offset'] = 2;


   //Calculate balance, every 2 years
   var iCount = 0;
   for(var i=0; i < nTerm; i++) {
      if( (i % 2) == 0 ) {
         if( aAmortResult[i*12] ) {
            xData1[iCount++] = aAmortResult[i*12].dRemBalance;
         }
      }
   }

   //Now sum up principle payment, every 2 years report
   var dTotalPrincipal = 0;
   iCount = 0;
   for(var i=0; i < nTerm; i++) {      
      for( var j=0; j < 12; j++) {
         if( aAmortResult[(i*12)+j] != null ) {
            dTotalPrincipal += aAmortResult[(i*12)+j].dPrincipal;
         }
      }
      if( (i % 2) == 0 ) {
         if( aAmortResult[i*12] && aAmortResult[i*12].dRemBalance > 0 ) {
            xData2[iCount++] = dTotalPrincipal;
         }
      }
   }

   //Now sum up interest paid, every 2 years report
   var dTotalInterest = 0;
   iCount = 0;
   for(var i=0; i < nTerm; i++) {      
      for( var j=0; j < 12; j++) {
         if( aAmortResult[(i*12)+j] != null ) {
            dTotalInterest += aAmortResult[(i*12)+j].dInterest;
         }
      }
      if( (i % 2) == 0 ) {
         if( aAmortResult[i*12] && aAmortResult[i*12].dRemBalance > 0 ) {
            xData3[iCount++] = dTotalInterest;
         }
      }
   }

   var iTotal = 0;
   if( dTotalInterest > iTotal ) {
      iTotal = dTotalInterest;
   }
   if( aAmortResult[0].dRemBalance > iTotal ) {
      iTotal = aAmortResult[0].dRemBalance;
   }
   if( dTotalPrincipal > iTotal ) {
      iTotal = dTotalPrincipal;
   }
   iTotal = iTotal.toNearest(5000);
   iTotal += 5000;

   var oVert = new Object();
   oVert['padding'] = 30;
   oVert['offset'] = 10;
   oVert['legend'] = '<font color="#FFFFFF" size="13" face="ARIAL"><b></b></font>';
   oVert['label_prefix'] = '$';   
   oVert['min'] = 0;
   oVert['increment'] = (iTotal/4);
   oVert['ticks'] = 5;
   oVert['grid'] = true;
   oVert['css'] = ".label { font-family: Arial; font-size: 12; font-weight: bold; color: #FFFFFF; text-align: right;}";

   var oHorz = new Object();
   oHorz['padding'] = 55;
   oHorz['offset'] = 30;   
   oHorz['legend'] = '<font color="#000000" size="13" face="ARIAL"><b>Year</b></font>';
   oHorz['label_prefix'] = '';
   oHorz['min'] = 1;
   oHorz['increment'] = 2;
   oHorz['ticks'] = 15;
   oHorz['grid'] = false;
   oHorz['css'] = ".label { font-family: Arial; font-size: 12; font-weight: bold; color: #000000; text-align: center;}";
   ProxySimpleBarGraph_Setup( oHorz, oVert, strId );

   ProxySimpleBarGraph_Plot( xData1, strId );
   ProxySimpleBarGraph_Plot( xData2, strId );
   ProxySimpleBarGraph_Plot( xData3, strId );

   ProxySimpleBarGraph_ShowImage(false, strId);

   var iPrice = cleanInput(document.amortization.amort_loan.value);
   var iTop = getTopNum(iPrice);   
   var iMult = getMultiplier(iTop);
   var iMax = iTop + (4 * iMult);
   var iMin = iTop - (4 * iMult);
   setSearchRanges(iMin, iMax);

}

function enableAmortizationExplore()
{
   g_am_bInInitialize = true;

   SetOnEmpty('amort_term', 30);
   SetOnEmpty('amort_rate', 6.25);
   SetOnEmpty('amort_loan', 160000);

   var iLoan               = GetCleanedHiddenFieldIntValue('amort_loan');
   var fRate               = GetCleanedHiddenFieldFloatValue('amort_rate');
   var iTerm               = GetCleanedHiddenFieldIntValue('amort_term');
   var iExtrapaymentamount = GetCleanedHiddenFieldIntValue('amort_extrapaymentamount');
   var iExtrapaymentmonth  = GetCleanedHiddenFieldIntValue('amort_extrapaymentmonth');

   g_am_pLoanSlider.SetValues(iLoan, 0, true);
   g_am_pRateSlider.SetValues(fRate, 0, true);
   g_am_pTermSlider.SetValues(iTerm, 0, true);
   g_am_pExtrapaymentamountSlider.SetValues(iExtrapaymentamount, 0, true);
   g_am_pExtrapaymentmonthSlider.SetValues(iExtrapaymentmonth, 0, true);

   g_am_bInInitialize = false;
   UpdateCalculatorResults_Amortization();
}

function UpdateCalculatorResults_Amortization() {
   if( !g_am_bInInitialize )
      am_checkForm(document.forms.amortization, 'amortization');
}

function onChangeLoanSlider_Amortization( pSlider ) {
   onMovingLoanSlider_Amortization( pSlider );
   UpdateCalculatorResults_Amortization();
}
function onMovingLoanSlider_Amortization( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_loan').innerHTML = '$' + AddCommas(iValue);
   document.getElementById('amort_loan').value = AddCommas(iValue);
}
function onChangeRateSlider_Amortization( pSlider ) {
   onMovingRateSlider_Amortization( pSlider );
   UpdateCalculatorResults_Amortization();
}
function onMovingRateSlider_Amortization( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_rate').innerHTML = iValue + '%';
   document.getElementById('amort_rate').value = AddCommas(iValue);
}
function onChangeTermSlider_Amortization( pSlider ) {
   onMovingTermSlider_Amortization( pSlider );
   UpdateCalculatorResults_Amortization();
}
function onMovingTermSlider_Amortization( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_term').innerHTML = iValue + ' years';
   document.getElementById('amort_term').value = AddCommas(iValue);
}
function onChangeExtrapaymentamountSlider_Amortization( pSlider ) {
   onMovingExtrapaymentamountSlider_Amortization( pSlider );
   UpdateCalculatorResults_Amortization();
}
function onMovingExtrapaymentamountSlider_Amortization( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_extrapaymentamount').innerHTML = '$' + AddCommas(iValue);
   document.getElementById('amort_extrapaymentamount').value = AddCommas(iValue);
}
function onChangeExtrapaymentmonthSlider_Amortization( pSlider ) {
   onMovingExtrapaymentmonthSlider_Amortization( pSlider );
   UpdateCalculatorResults_Amortization();
}
function onMovingExtrapaymentmonthSlider_Amortization( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_extrapaymentmonth').innerHTML  = iValue + ' months';
   document.getElementById('amort_extrapaymentmonth').value = AddCommas(iValue);
}

function InitializeAmortizationCalculator()
{
   var iLoan               = GetCleanedHiddenFieldIntValue('amort_loan');
   var fRate               = GetCleanedHiddenFieldFloatValue('amort_rate');
   var iTerm               = GetCleanedHiddenFieldIntValue('amort_term');
   var iExtrapaymentamount = GetCleanedHiddenFieldIntValue('amort_extrapaymentamount');
   var iExtrapaymentmonth  = GetCleanedHiddenFieldIntValue('amort_extrapaymentmonth');

   var pDivLoan               = document.getElementById('amortcalcslide_amort_loan');
   var pDivRate               = document.getElementById('amortcalcslide_amort_rate');
   var pDivTerm               = document.getElementById('amortcalcslide_amort_term');
   var pDivExtrapaymentamount = document.getElementById('amortcalcslide_amort_extrapaymentamount');
   var pDivExtrapaymentmonth  = document.getElementById('amortcalcslide_amort_extrapaymentmonth');

   document.getElementById('amortcalclabel_amort_loan').innerHTML               = '$' + AddCommas(iLoan);
   document.getElementById('amortcalclabel_amort_rate').innerHTML               = fRate + '%';
   document.getElementById('amortcalclabel_amort_term').innerHTML               = '$' + AddCommas(iTerm);
   document.getElementById('amortcalclabel_amort_extrapaymentamount').innerHTML = '$' + AddCommas(iExtrapaymentamount);
   document.getElementById('amortcalclabel_amort_extrapaymentmonth').innerHTML  = '$' + AddCommas(iExtrapaymentmonth);


   try {
      g_am_bInInitialize = true;

      g_am_pLoanSlider = new CyberC21Slider( pDivLoan.id, false, 50000, 950000, 5000,
                                          iLoan, 0,
                                          '/images/sidebar/sliderbg_122.gif', '/images/sidebar/slideractivearea.gif', 122, 16, '',
                                          '/images/sidebar/grabwidget.gif', '/images/sidebar/grabwidget.gif', 15, 16,
                                          1, 1,
                                          onChangeLoanSlider_Amortization, onMovingLoanSlider_Amortization );
      g_am_pRateSlider = new CyberC21Slider( pDivRate.id, false, 2, 12, 0.25,
                                          fRate, 0,
                                          '/images/sidebar/sliderbg_122.gif', '/images/sidebar/slideractivearea.gif', 122, 16, '',
                                          '/images/sidebar/grabwidget.gif', '/images/sidebar/grabwidget.gif', 15, 16,
                                          1, 1,
                                          onChangeRateSlider_Amortization, onMovingRateSlider_Amortization );
      g_am_pTermSlider = new CyberC21Slider( pDivTerm.id, false,  15, 30, 15,
                                          iTerm, 0,
                                          '/images/sidebar/sliderbg_122.gif', '/images/sidebar/slideractivearea.gif', 122, 16, '',
                                          '/images/sidebar/grabwidget.gif', '/images/sidebar/grabwidget.gif', 15, 16,
                                          1, 1,
                                          onChangeTermSlider_Amortization, onMovingTermSlider_Amortization );
      g_am_pExtrapaymentamountSlider = new CyberC21Slider( pDivExtrapaymentamount.id, false, 0, 100000, 500,
                                          iExtrapaymentamount, 0,
                                          '/images/sidebar/sliderbg_122.gif', '/images/sidebar/slideractivearea.gif', 122, 16, '',
                                          '/images/sidebar/grabwidget.gif', '/images/sidebar/grabwidget.gif', 15, 16,
                                          1, 1,
                                          onChangeExtrapaymentamountSlider_Amortization, onMovingExtrapaymentamountSlider_Amortization );
      g_am_pExtrapaymentmonthSlider = new CyberC21Slider( pDivExtrapaymentmonth.id, false, 0, 360, 1,
                                          iExtrapaymentmonth, 0,
                                          '/images/sidebar/sliderbg_122.gif', '/images/sidebar/slideractivearea.gif', 122, 16, '',
                                          '/images/sidebar/grabwidget.gif', '/images/sidebar/grabwidget.gif', 15, 16,
                                          1, 1,
                                          onChangeExtrapaymentmonthSlider_Amortization, onMovingExtrapaymentmonthSlider_Amortization );

      g_am_bInInitialize = false;
   } catch ( e ) {
      alert( e.message );
   }
}

RfgQueueCommand('InitializeAmortizationCalculator();');

function getMultiplier(num)
{
   var len = num.toString().length;
   if (len > 2) {
      return  Math.pow(10, len-2);
      }
   return 10;

}

function getTopNum(num)
{
//   if (num <= 100) num = 1000;
   var mult = getMultiplier(num) * 10;
   var topNum = num / mult;
   var dec = topNum - parseInt(topNum);
      
   if ((dec < 0.5) && (dec > 0)) dec = topNum += 0.5 - dec;
   else topNum = Math.ceil(topNum);

   topNum *= mult;

   return topNum;

}

