var g_bInInitialize = false;
var g_bGraphReady = false;
var aAmortResult = new Array();
var txtTable = "";

var g_bInInitialize = false;
var g_bGraphReady = false;

var g_pLoanSlider               = null;
var g_pRateSlider               = null;
var g_pTermSlider               = null;
var g_pExtrapaymentamountSlider = null;
var g_pExtrapaymentmonthSlider  = null;






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

   //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";


   if (isBlank(form.elements[loanamount].value) == 1)
      errorMsg += message[0];
   else if (isNaN(form.elements[loanamount].value) == true)
      errorMsg += message[1];
   else if ((form.elements[loanamount].value <= 0)||(form.elements[loanamount].value >= 1000000000))
      errorMsg += message[2];

   if (isBlank(form.elements[interestrate].value) == 1)
      errorMsg += message[3];
   else if (isNaN(form.elements[interestrate].value) == true)
      errorMsg += message[4];
   else if ((form.elements[interestrate].value <= 0)||(form.elements[interestrate].value >= 51))
      errorMsg += message[5];


   if (isBlank(form.elements[extrapaymentamount].value) != 1) {
      if (isNaN(form.elements[extrapaymentamount].value) == true)
         errorMsg += message[6];
      else if ((form.elements[extrapaymentamount].value < 0)||(parseFloat(form.elements[extrapaymentamount].value) >= parseFloat(form.elements[loanamount].value)))
         errorMsg += message[7];
   }
   if (isBlank(form.elements[extrapaymentmonth].value) != 1) {
      iLoanLength = parseInt(form.elements[loantype][form.elements[loantype].selectedIndex].value) * 12;
      if (isNaN(form.elements[extrapaymentmonth].value) == true)
         errorMsg += message[8];
      else if ((form.elements[extrapaymentmonth].value < 0)||(parseInt(form.elements[extrapaymentmonth].value) >= iLoanLength))
         errorMsg += message[9];
   }

   if ((isBlank(form.elements[extrapaymentmonth].value) + isBlank(form.elements[extrapaymentamount].value)) == 1 ) {
      errorMsg += message[10];
   }


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

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

   var extrapaymentamount = new Number(0);
   var extrapaymentmonth = new Number(0);
//    if ( isBlank(document.amortization.amort_extrapaymentamount.value) != 1 ) {
//      extrapaymentamount = parseFloat(document.amortization.amort_extrapaymentamount.value);
//      extrapaymentmonth = parseInt(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(document.amortization.amort_loan.value);
   nTerm = parseInt(document.amortization.amort_term[document.amortization.amort_term.selectedIndex].value);
   dAnnualInterestRate = parseFloat(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 style=\"width: 60px;\">" + i + "</td>";

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

      txtResult += "<td style=\"width: 100px;\">$" + commasDecimals(dInterest.toString()) + "</td>";
      txtResult += "<td style=\"width: 100px;\">$" + commasDecimals(dPrincipal.toString()) + "</td>";
      txtResult += "<td style=\"width: 100px;\">$" + commasDecimals(dRemBalance.toString()) + "</td>";
      txtResult += "</tr>";

      if (dRemBalance == 0)
         break;

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

   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 += "<table id=\"amorttablehead\">";
   txtTable += "  <tr>";
   txtTable += "  <th style=\"width: 60px;\">Month</th>";
   txtTable += "  <th style=\"width: 100px;\">Interest Payment</th>";
   txtTable += "  <th style=\"width: 100px;\">Principle Payment</th>";
   txtTable += "  <th style=\"width: 100px;\">Remaining Balance</th>";
   txtTable += "  </tr>";

   txtTable += "<tr ><td colspan=\"4\">";

    txtTable += "<div class=\"amortizationtablecontainer\" id=\"amorttablediv\">";
    txtTable += "<table id=\"amorttable\">";

    txtTable += txtResult;

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

    txtTable += "</td></tr>";


   txtTable += "</table>";

   document.getElementById("results").innerHTML=txtTable;

   document.getElementById('instructions').style.display="none";
  document.getElementById('results').style.display="block";

   return false;

}

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

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

function SimpleBarGraph_Ready()
{
   ProxySimpleBarGraph_SetImage('/images/calculator/default_amortization.jpg');
   ProxySimpleBarGraph_ShowImage(true);

   g_bGraphReady = true;
}

function DrawChart()
{
   ProxySimpleBarGraph_Clear();
   ProxySimpleBarGraph_ShowImage(true);

   if ( !g_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 );

   ProxySimpleBarGraph_Plot( xData1 );
   ProxySimpleBarGraph_Plot( xData2 );
   ProxySimpleBarGraph_Plot( xData3 );

   ProxySimpleBarGraph_ShowImage(false);

   var iPrice = 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_bInInitialize = true;

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

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

   g_pLoanSlider.SetValues(iLoan, 0, true);
   g_pRateSlider.SetValues(fRate, 0, true);
   g_pTermSlider.SetValues(iTerm, 0, true);
   g_pExtrapaymentamountSlider.SetValues(iExtrapaymentamount, 0, true);
   g_pExtrapaymentmonthSlider.SetValues(iExtrapaymentmonth, 0, true);

   g_bInInitialize = false;
   UpdateCalculatorResults();
}

function UpdateCalculatorResults() {
   if( !g_bInInitialize )
      checkForm(document.forms.amortization);
}

function onChangeLoanSlider( pSlider ) {
   onMovingLoanSlider( pSlider );
   UpdateCalculatorResults();
}
function onMovingLoanSlider( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_loan').innerHTML = '$' + AddCommas(iValue);
   document.getElementById('amort_loan').value = iValue;
}
function onChangeRateSlider( pSlider ) {
   onMovingRateSlider( pSlider );
   UpdateCalculatorResults();
}
function onMovingRateSlider( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_rate').innerHTML = iValue + '%';
   document.getElementById('amort_rate').value = iValue;
}
function onChangeTermSlider( pSlider ) {
   onMovingTermSlider( pSlider );
   UpdateCalculatorResults();
}
function onMovingTermSlider( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_term').innerHTML = iValue + ' years';
   document.getElementById('amort_term').value = iValue;
}
function onChangeExtrapaymentamountSlider( pSlider ) {
   onMovingExtrapaymentamountSlider( pSlider );
   UpdateCalculatorResults();
}
function onMovingExtrapaymentamountSlider( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_extrapaymentamount').innerHTML = '$' + AddCommas(iValue);
   document.getElementById('amort_extrapaymentamount').value = iValue;
}
function onChangeExtrapaymentmonthSlider( pSlider ) {
   onMovingExtrapaymentmonthSlider( pSlider );
   UpdateCalculatorResults();
}
function onMovingExtrapaymentmonthSlider( pSlider ) {
   var iValue = pSlider.GetLowValue();
   document.getElementById('amortcalclabel_amort_extrapaymentmonth').innerHTML  = iValue + ' months';
   document.getElementById('amort_extrapaymentmonth').value = iValue;
}

function InitializeAmortizationCalculator()
{
   var iLoan               = GetHiddenFieldIntValue('amort_loan');
   var fRate               = GetHiddenFieldFloatValue('amort_rate');
   var iTerm               = GetHiddenFieldIntValue('amort_term');
   var iExtrapaymentamount = GetHiddenFieldIntValue('amort_extrapaymentamount');
   var iExtrapaymentmonth  = GetHiddenFieldIntValue('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_bInInitialize = true;

      g_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, onMovingLoanSlider );
      g_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, onMovingRateSlider );
      g_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, onMovingTermSlider );
      g_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, onMovingExtrapaymentamountSlider );
      g_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, onMovingExtrapaymentmonthSlider );

      g_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;

}

