

//CLOSING COST VARIABLES
var closingCosts, loanAmt, loanTerm, interestRate, discountPoints, downPayment = "";

//RESULTS VARIABLES
var mortCosts, monthPay, refiPay, payDiff, breakMonth = "";

var g_bInInitialize = false;
var g_bGraphReady = false;

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

    var fm = document.refinancecalculator;
    if( checkForm(fm, true) ){
       var loanBalance   = cleanAndParseInt(fm.refinance_current_loan.value);
       var currentRate   = cleanAndParseFloat(fm.refinance_current_rate.value);
       var payment       = cleanAndParseInt(fm.refinance_current_pi.value);
       var propertyValue = cleanAndParseInt(fm.refinance_current_value.value);
       var loanTerm      = cleanAndParseInt(fm.refinance_new_term.options[fm.refinance_new_term.selectedIndex].value);
       var loanAmount    = cleanAndParseInt(fm.refinance_new_loanamt.value);
       var interestRate  = cleanAndParseFloat(fm.refinance_new_rate.value);

       var parms = 'calctype=F&loanbalance='+ escape(loanBalance) +'&currentrate='+ escape(currentRate);
       parms += '&payment='+ escape(payment) +'&propertyvalue='+ escape(propertyValue) +'&loanterm='+ escape(loanTerm);
       parms += '&loanAmount='+ escape(loanAmount) +'&interestrate='+ escape(interestRate);

       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 PMICalculator (loanAmt, downPaymentAmt)
{
   var loanAmt = cleanInput(document.refinancecalculator.refinance_new_loanamt.value);
   var salesPrice = cleanInput(document.refinancecalculator.refinance_current_value.value);
   var LTV = loanAmt/salesPrice;
   var PMIRate = true;
   var LTVThreshold = 0.8;
   var monthlyMI = 0;

   if (LTV < LTVThreshold) {
      PMIRate = false;
   }

   if (PMIRate) {
      if ((LTV < 0.85)||(LTV == 0.85)) {
         PMIRate = 0.0032;
      } else if ((LTV < 0.90)||(LTV == 0.90)) {
         PMIRate = 0.0052;
      } else if ((LTV < 0.95)||(LTV == 0.95)) {
         PMIRate = 0.0078;
      } else {
         PMIRate = 0.0090;
      }

      monthlyMI = loanAmt * PMIRate/12;
   }

   return monthlyMI;
}

function closingCostCaculate(loanAmt, loanTerm, interestRate, programPoints, downPaymentAmt)
{
   //Default properties per landscape
   var taxServiceFee = new Number(75);
   var feeToCharge = new Number(350);
   var creditReportFee = new Number(20.7);
   var appraisalFee = new Number(300);
   var floodCertFee = new Number(15.5);
   var interestDays = new Number(15);
   var prePaidInterest = new Number((interestRate / 365) * loanAmt * interestDays);
   var originationFee = new Number(0);

   if ((programPoints > 0.01)||(programPoints == 0.01)) {
      originationFee = 0.01 * loanAmt;
   }

   var discountPoints = new Number(0);
   if (programPoints > 0.01) {
      discountPoints = (programPoints - 0.01) * loanAmt;
   } else if ((programPoints > 0)&&(programPoints < 0.01)) {
      discountPoints = programPoints * loanAmt;
   }

   var paidByLender = new Number(0);
   if (programPoints < 0.0) {
      paidByLender = programPoints * loanAmt;
   }

   var monthlyMI = PMICalculator(loanAmt, downPaymentAmt);
   var MIFee = new Number(monthlyMI * 2);
   var closingCosts = new Number(taxServiceFee + feeToCharge + creditReportFee + appraisalFee + floodCertFee + paidByLender + discountPoints + originationFee + prePaidInterest + MIFee)
   return(closingCosts);
}

function calculate()
{
   var mi = cleanInput(document.refinancecalculator.refinance_new_rate.value) / 1200;
   var base = 1;
   var mbase = 1 + mi;
   for (i=0; i< cleanInput(document.refinancecalculator.refinance_new_term.value) * 12; i++) {
      base = base * mbase;
   }

   //additional var definitions for calculating closing cost
   loanAmt = cleanInput(document.refinancecalculator.refinance_new_loanamt.value);
   loanTerm = cleanInput(document.refinancecalculator.refinance_new_term.options[document.refinancecalculator.refinance_new_term.selectedIndex].value) * 12;
   interestRate = cleanInput(document.refinancecalculator.refinance_new_rate.value) / 100;
   programPoints = 0.00;
   discountPoints = programPoints;
   downPayment = cleanInput(document.refinancecalculator.refinance_current_value.value) - loanAmt;
   closingCosts = floor(closingCostCaculate(loanAmt, loanTerm, interestRate, programPoints, downPayment));

   //These calculations are used in the results section and apply the values to JavaScript variables (as strings)
   mortCosts = closingCosts.toString();
   monthPay = cleanInput(document.refinancecalculator.refinance_current_pi.value).toString();
   refiPay = floor(cleanInput(document.refinancecalculator.refinance_new_loanamt.value) * mi / ( 1 - (1/base))).toString();
   payDiff = floor(cleanInput(document.refinancecalculator.refinance_current_pi.value) - cleanInput(document.refinancecalculator.refinance_new_loanamt.value) * mi / ( 1 - (1/base))).toString();
   var monthb = eval(mortCosts / payDiff);
   breakMonth = parseInt(monthb);   
}

function showResults()
{
   var strMortCosts = commasDecimals(mortCosts);
   var strMonthPay = commasDecimals(monthPay);
   var strRefiPay = commasDecimals(refiPay);
   var strPayDiff = commasDecimals(payDiff);

   var strBreakMonths = "";
   if( breakMonth > 0 ) {
      strBreakMonths = breakMonth + " month(s)";
   }

   //BUILDS RESULTS
   var changeMsg =
   "<b>Results</b><br>" +
   "<FONT CLASS=\"basic\">Based on the information you provided:</FONT>" + 
   "<TABLE CELLPADDING=\"0\" CELLSPACING=\"0\" WIDTH=\"0\">" +
   "  <TR ALIGN=\"left\" VALIGN=\"top\">" +
   "    <TD COLSPAN=\"2\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">Estimated costs to obtain a new mortgage:</FONT></TD>" +
   "    <TD><FONT CLASS=\"basic\">&nbsp;</FONT></TD>" +
   "    <TD COLSPAN=\"2\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">" + "<B>" + "$" + strMortCosts + "</B>" + "</FONT></TD>" +
   "  </TR>" +
   "  <TR ALIGN=\"left\" VALIGN=\"top\">" +
   "    <TD COLSPAN=\"2\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">Current Monthly Payment:</FONT></TD>" +
   "    <TD><FONT CLASS=\"basic\">&nbsp;</FONT></TD>" +
   "    <TD COLSPAN=\"2\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">" + "<B>" + "$" + strMonthPay + "</B>" + "</FONT></TD>" +
   "  </TR>" +
   "  <TR ALIGN=\"left\" VALIGN=\"top\">" +
   "    <TD COLSPAN=\"2\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">Refinance Payment:</FONT></TD>" +
   "    <TD><FONT CLASS=\"basic\">&nbsp;</FONT></TD>" +
   "    <TD COLSPAN=\"2\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">" + "<B>" + "$" + strRefiPay + "</B>" + "</FONT></TD>" +
   "  </TR>" +
   "  <TR ALIGN=\"left\" VALIGN=\"top\">" +
   "    <TD COLSPAN=\"2\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">How much lower the new payment would be than the current one:</FONT></TD>" +
   "    <TD><FONT CLASS=\"basic\">&nbsp;</FONT></TD>" +
   "    <TD COLSPAN=\"2\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">" + "<B>" + "$" + strPayDiff + "</B>" + "</FONT></TD>" +
   "  </TR>" +
   "  <TR ALIGN=\"left\" VALIGN=\"top\">" +
   "    <TD COLSPAN=\"2\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">Months to break even:</FONT></TD>" +
   "    <TD><FONT CLASS=\"basic\">&nbsp;</FONT></TD>" + 
   "    <TD COLSPAN=\"2\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\"><FONT CLASS=\"basic\">" + "<B>" + strBreakMonths + "</B>" +  "</FONT></TD>" +
   "  </TR>" +
   "</TABLE>";

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

   DrawChart();
}

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

   var currentloan, currentpi, currentrate, currentvalue, newterm, newrate, newamount = "";

   for (i = 0; i < form.length; i++)
      inputs[i] = form.elements[i].name;

   for (i = 0; i < form.length; i++) {
      if (inputs[i] == "refinance_current_loan")
         currentloan = i;
      else if (inputs[i] == "refinance_current_rate")
         currentrate = i;
      else if (inputs[i] == "refinance_current_pi")
         currentpi = i;

      else if (inputs[i] == "refinance_current_value")
         currentvalue = i;
      else if (inputs[i] == "refinance_new_term")
         newterm = i;
      else if (inputs[i] == "refinance_new_rate")
         newrate = i;
      else if (inputs[i] == "refinance_new_loanamt")
         newamount = i;
   }
   message[0] = "Please enter your current loan balance.\n";
   message[1] = "Your current loan balance should be free of letters or special characters.\n";
   message[2] = "Your current loan balance should be greater than $0 and less than $1,000,000,000.\n";

   message[3] = "Please enter your current principal and interest.\n";
   message[4] = "The current principal and interest of your loan should be free of letters and special characters.\n";
   message[5] = "The current principal and interest of your loan should be less than $1,000,000,000.\n";

   message[6] = "Please enter your current interest rate.\n";
   message[7] = "Your current interest rate value should be free of letters and special characters.\n";
   message[8] = "Your current interest rate value should be greater than 0% and less than 51%.\n";

   message[9] = "Please enter the amount of the new loan.\n";
   message[10] = "The new loan amount should be free of letters or special characters.\n";
   message[11] = "The  new loan amount should be greater than $0 and less than $1,000,000,000.\n";

   message[12] = "Please enter your new interest rate.\n";
   message[13] = "Your new interest rate value should be free of letters and special characters.\n";
   message[14] = "Your new interest rate value should be greater than 0% and less than 51%.";

   message[15] = "Please enter the estimated value of your property.\n";
   message[16] = "The estimated value of your property should be free of letters or special characters.\n";
   message[17] = "The estimated value of your property should be greater than $0 and less\n" +  "than $1,000,000,000.\n";

   var currentLoanValue =   cleanInput(form.elements[currentloan].value);  
   var currentPiValue =   cleanInput(form.elements[currentpi].value);  
   var currentRateValue =  cleanInput(form.elements[currentrate].value);
   var currentValue =  cleanInput(form.elements[currentvalue].value);
   var newRateValue =  cleanInput(form.elements[newrate].value);
   var newAmountValue =  cleanInput(form.elements[newamount].value);
   
   errorMsg +=validateRangedNumberValue(currentLoanValue, message[0], message[1], message[2], 0, 99999999);
   errorMsg +=validateRangedNumberValue(currentPiValue, message[3], message[4], message[5], 0, 9999999);
   errorMsg +=validateRangedNumberValue(currentRateValue, message[6], message[7], message[8], 1, 50);
   errorMsg +=validateRangedNumberValue(currentValue, message[15], message[16], message[17], 0, 9999999);
   errorMsg +=validateRangedNumberValue(newRateValue, message[12], message[13], message[14], 1, 50);
   errorMsg +=validateRangedNumberValue(newAmountValue, message[9], message[10], message[11], 0, 99999999);



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

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



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

   g_bGraphReady = true;
}

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 = topNum += 0.5 - dec;
   else topNum = Math.ceil(topNum);

   topNum *= mult;

   return topNum;

}

function getNumDivs(num)
{
   var yTop = getTopNum(num);
   var yMult = getMultiplier(yTop)

   var iTmp = yTop / yMult;
   var yNumDiv = iTmp;
   var iCnt = 0;
   while (iTmp > 9) {
      iTmp = Math.ceil(iTmp / 5);
      iCnt++;
      }

   var yInc = yMult * Math.pow(5, iCnt);
   yNumDiv = iTmp;

   while (yNumDiv < 4) {
      yNumDiv *= 2;
      yInc /= 2;
      }

   yNumDiv++;
   
   return yNumDiv;
}

function getIncrement(num)
{
   var yTop = getTopNum(num);
   var yMult = getMultiplier(yTop)

   var iTmp = yTop / yMult;
   var yNumDiv = iTmp;
   var iCnt = 0;
   while (iTmp > 9) {
      iTmp = Math.ceil(iTmp / 5);
      iCnt++;
      }

   var yInc = yMult * Math.pow(5, iCnt);
   yNumDiv = iTmp;

   while (yNumDiv < 4) {
      yNumDiv *= 2;
      yInc /= 2;
      }

   return yInc;
}


function DrawChart()
{
   ProxySimpleBarGraph_Clear();
   ProxySimpleBarGraph_ShowImage(true);
   
   if ( !g_bGraphReady ) {
      return;
   }
   var iMonthPay = parseInt(monthPay);
   var iRefiPay  = parseInt(refiPay);

   var yMax = Math.max(iMonthPay, iRefiPay);
   var yInc = getIncrement(yMax);
   var yNumDiv = getNumDivs(yMax);

   //var iRange = Math.abs(iMonthPay - iRefiPay);
   //var iStep = iRange.toNearest(10);

   var oVert = new Object();
   oVert['padding'] = 30;
   oVert['offset'] = 10;
   oVert['min'] = 0;
   oVert['increment'] = yInc;
   oVert['legend'] = '<font color="#FFFFFF" size="13" face="ARIAL"><b>Monthly Payment</b></font>';
   oVert['label_prefix'] = '$';
   oVert['ticks'] = yNumDiv;
   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'] = 20;
   oHorz['offset'] = 0;
   oHorz['min'] = 1;
   oHorz['increment'] = 1;
   oHorz['legend'] = '';//'<font color="#000000" size="13" face="ARIAL"><b>Loan</b></font>';
   oHorz['label_prefix'] = '';
   oHorz['ticks'] = 2;
   oHorz['grid'] = false;
   oHorz['css'] = ".label { font-family: Arial; font-size: 1px; font-weight: bold; color: #5A5A5A; text-align: center;}";
   ProxySimpleBarGraph_Setup( oHorz, oVert );

   xData1 = new Object();
   xData1['color1'] = 0xFFFB01;                   
   xData1['color2'] = 0xFF9600; 
   xData1['width'] = 80;
   xData1['offset'] = 1;

   xData2 = new Object();
   xData2['color1'] = 0xFC9001;                   
   xData2['color2'] = 0x971200; 
   xData2['width'] = 80;
   xData2['offset'] = -2;

   xData1[0] = iMonthPay;
   xData2[1] = iRefiPay;

   ProxySimpleBarGraph_Plot( xData1 );
   ProxySimpleBarGraph_Plot( xData2 );

   ProxySimpleBarGraph_ShowImage(false);

//--- NOT GRAPH
   var iMax = Math.max(cleanInput(document.refinancecalculator.refinance_new_loanamt.value), cleanInput(document.refinancecalculator.refinance_current_value.value), cleanInput(document.refinancecalculator.refinance_current_loan.value));

   var iTop = getTopNum(iMax);
   var iNumDiv = getNumDivs(iMax);
   var iInc = getIncrement(iMax);
   
   var iMin = iTop - (Math.floor(iNumDiv / 2) * iInc);
   iTop += iInc;

   setSearchRanges(iMin, iTop);

}
