function GetValue(sValue)
// Función para formatear los valores numéricos introducidos
{
    var sRaw = "";							// Variable con el valor formateado
    var sChar = "";							// Variable a la que pasamos cada carácter del valor a formatear
    var i = 0;

    sValue += "";
    for (i=0; i <= sValue.length; i++) {	// Hasta que no equiparemos i con el número de carácteres del valor a formatear

        sChar = sValue.substring(i, i+1);	// Pasamos cada carácter por la variable SChar, dependiendo del contador.

	if ((sChar >= "0") && (sChar <= "9")){	// Comparamos si está entre el rango 0 a 9
            sRaw = sRaw + sChar;			// Vamos componiendo el valor formateado
        }
    }										// Fin Hasta

    if (sRaw.length > 0) {					// Si el número de carácteres del valor formateado es superior a 0
        return parseInt(sRaw);				// Retornamos el valor
    }
    else {
        return 0;
    }
}

// ---------------------------------------------------------
function GetValueRate(sValue)
// Función para formatear los valores numéricos DECIMALES introducidos (interés)
{
    var sRaw = "";									// Variable con el valor formateado
    var sChar = "";									// Variable a la que pasamos cada carácter del valor a formatear
    var bHasDecimal = 0;
    var i = 0;

    sValue += "";
    for (i=0; i <= sValue.length; i++) {			// Hasta que no equiparemos i con el número de carácteres del valor a formatear

        sChar = sValue.substring(i, i+1);			// Pasamos cada carácter por la variable SChar, dependiendo del contador.

        if ((sChar >= "0") && (sChar <= "9")){		// Comparamos si está entre el rango 0 a 9
            sRaw = sRaw + sChar;
        }

        if ((sChar == ",") || (sChar == ".")){		// Si el carácter conté "," o "."
            bHasDecimal = 1;						// Activamos flag información "contiene decimales"
            sRaw = sRaw + ".";						// Le insertamos el "." como separador de decimales
        }

    }												// Fin Hasta

    if (bHasDecimal) {								// Si el flag información "contiene decimales" = 1 (activo)
        return parseFloat(sRaw);					// Retorna los valores numéricos desde la izquierda, conservando "," y "-"
    }

	if (sRaw.length > 0) {							// Si el valor formateado es superior a 0
        return parseInt(sRaw);						// Retorna los valores númericos desde la izquierda
    }
    else {
        return 0;
    }
}

// ---------------------------------------------------------
function FormatOutput(iValue, nDec) {
// Función para formatear el "." de cientos, miles y millares

    var bIsNegative = 0;		// Flag por si valor es negativo
    var iPos = 0;				// 
    var sChar = "";				// Variable para almacenar carácter tratado
    var sTempNumber = "";
    var sNoChars = "";
    var sDollars = "";
    var sCents = "";
    var sDollarAmount = "";
    var sFormated = "";
    var x = 0;
	var IndexOfDec = -1;
	var rounded;

    if (iValue != "") {			// Si el valor es diferente a ""

        sTempNumber = iValue + "";												// Pasamos valor
        if (sTempNumber.charAt(0) == "-") {										// Si contiene el valor "-" en la primera posición
            bIsNegative = 1;													// Activamos Flag negativo
            sTempNumber = sTempNumber.substring(1, sTempNumber.length);			// Pasamos el valor sin negativo		
        }

        //sTempNumber
        IndexOfDec = sTempNumber.indexOf(".");		// Pasamos la posición en la que se encuentra el primer "." (Si lo hay, si no devuelve -1)

        if (IndexOfDec == -1) {						
            sDollars = sTempNumber;
            sCents = "00";
        }
        else if (IndexOfDec == 0) {
            sDollars = "0";
            sCents = sTempNumber.substring(IndexOfDec + 1, sTempNumber.length);
        }
        else {
            sDollars = sTempNumber.substring(0, IndexOfDec);
            if (IndexOfDec == (sTempNumber.length - 1)) {
                sCents = "00";
            }
            else {
                sCents = sTempNumber.substring(IndexOfDec + 1, sTempNumber.length)
                sCents += "0";
                sCents = sCents.charAt(0) + sCents.charAt(1);
            }
        }

        sFormated = sDollars;
        x = sDollars.length;
        iPos = 0;
        while (x > 0) {
            x--;
            sChar = sDollars.charAt(x);
            rounded = Math.round(iPos/3);
            if ( (iPos/3 == rounded ) & (iPos != 0) ) {
                sDollarAmount = "." + sDollarAmount;
            }
            sDollarAmount = sChar +  sDollarAmount;
            iPos++;
        }

        if (nDec) {
          if (bIsNegative) {
              sFormated = "-" + sDollarAmount + "," + sCents + "";
          }
          else {
              sFormated = sDollarAmount + "," + sCents  + "";
          }
	}
        else {
          if (bIsNegative) {
              sFormated = "-" + sDollarAmount + "";
          }
          else {
              sFormated = sDollarAmount + "";
          }
	}

        return (sFormated);
    }
    else {

        return("0" + "");
    }
}

// ---------------------------------------------------------
function FormatOutputPercent(iValue, nOfDec) {
// Función para añadir y formatear el "interés" con un símbolo %
 return(iValue + " %")
}


// ---------------------------------------------------------
function GetMonthlyPayment(term, rate, loanAmount) {
//Función para averiguar las quotas mensuales, dependiendo de los Plazos, interés y capital.
//Valores pasados a la función (Plazos, interes, capital)
	var rateMonthly
	var totalPayments
	var payment
    
	
	if (rate >= 1) { //Si el interés es mayor o igual a 1
        (rate = rate / 100);
    }
    rateMonthly = (rate / 12); //Media interés

    totalPayments = (term * 12); //total de pagos es Plazos * 12

    if (rate == 0) { //si el interes es = 0
        payment = (loanAmount / totalPayments); //cuota = capital / plazos
    }

    else {
        payment = (loanAmount * rateMonthly) / (1 - Math.pow((1+rateMonthly), (-1*totalPayments)) ); 
		//fórumula para cálculo de cuotas vs interés vs plazos
    }

    return(payment); //Pasamos el valor
}

// ---------------------------------------------------------
function ReCalculate() {
	
	var Fprice
	var Frate
	var Fterm
	var iLoanAmount
	var iMonPayment
	var iPaymentTotal
	
	// Función con la que calculamos los valores a mostrar en el formulario
	// Todos los valores pasan por la función GetValue

    // Pasamos a las variables dos datos del formulario
    Fprice = GetValue(document.form.txtPrice.value); //Precio
    Fdownpayment    = GetValue(document.form.txtDownpayment.value); //Entrada
    Frate  = GetValueRate(document.form.txtRate.value); //Interés
    Fterm  = GetValue(document.form.cboTerm.options[document.form.cboTerm.selectedIndex].text); //Plazos

    iLoanAmount     = Fprice - Fdownpayment;// El precio Total pasa a ser el Precio-Entrada
    //iLoanAmount = Fprice; // Cálculo sin campo de entrada
	iMonPayment = GetMonthlyPayment(Fterm, Frate, iLoanAmount); //Calculamos mediante función la cuota mensual
    iMonPayment = Math.round(iMonPayment * 100) / 100;
    iPaymentTotal   = ((iMonPayment * 12) * Fterm) + Fdownpayment; // Cálculo teniendo en cuenta entrada
	iPaymentTotal = ((iMonPayment * 12) * Fterm);
    iPaymentTotal     = Math.round(iPaymentTotal * 100) / 100;


    //// FORMAT VARIABLES

    Fdownpayment    = FormatOutput(Fdownpayment,0);
    Fprice          = FormatOutput(Fprice,0);
    Frate           = FormatOutputPercent(Frate);

    iLoanAmount     = FormatOutput(iLoanAmount,0);
    iPaymentTotal   = FormatOutput(iPaymentTotal,0);


    iMonPayment     = FormatOutput(iMonPayment,0);



    //// SPIT OUT RESULTS

    document.form.txtPrice.value         = Fprice;
    document.form.txtDownpayment.value   = Fdownpayment;
    document.form.txtRate.value          = Frate;
    //document.form.txtLoanAmount.value    = iLoanAmount;
    document.form.txtMonPayment.value    = iMonPayment;
    //document.form.txtPaymentTotal.value    = iPaymentTotal;

}