var old_importe  = 0;
var old_plazos   = 0;
var old_meses    = 0;
var old_tipo     = 0;
var old_cuota    = 0;
var decim_moneda = 0;

function redondea(numero) {
  var x;
  x = Math.pow(10,decim_moneda);
  return Math.round(numero * x) / x;
}

function es_numero(numero) {
  return true;
}

function ha_cambiado() {
  return true;
}

function almacena() {
  return;
}

// Funcion que calcula la cuota (calcular_cuota)
// en función de IMPORTE, NUMERO DE PLAZOS y TIPO DE INTERÉS
function calcular_cuota() {
  if (ha_cambiado() == 0) {
    return;
  }

  importe    = parseFloat(document.forms[0].importe.value);
  plazos     = parseInt(document.forms[0].plazos.value);
  tipo_anual = parseFloat(document.forms[0].tipo.value);
  meses      = parseInt(document.forms[0].meses.options[document.forms[0].meses.selectedIndex].value);
  base       = parseInt(document.forms[0].base.options[document.forms[0].base.selectedIndex].value);

  if (isNaN(importe) || isNaN(plazos) || isNaN(tipo_anual) || importe * plazos * tipo_anual == 0) {
    alert("Para calcular la cuota se han de introducir los campos 'Importe', 'Plazos' y 'Tipo nominal'.");
    return;
  }
  if (tipo_anual > 20.0) {
    alert("El 'Tipo nominal' es superior al 20% y no se puede utilizar para un préstamo hipotecario.");
    return;
  }
  plazos_en_meses = plazos * meses;
  tipo_mensual = 365 / base * tipo_anual / 1200.0;
  x = 1.0 + tipo_mensual;
  y = 1.0 / Math.pow(x, plazos_en_meses);
  //cuota = importe * tipo_mensual * Math.pow(x, plazos_en_meses) / ( Math.pow(x, plazos_en_meses) - 1.0 );
  cuota = importe * tipo_mensual / ( 1.0 - y );
  document.forms[0].cuota.value = redondea(cuota);
  almacena();
}

// Funcion que calcula el importe (calcular_importe)
// en función de CUOTA, NUMERO DE PLAZOS y TIPO DE INTERÉS
function calcular_importe() {
  if (ha_cambiado() == 0) {
    return;
  }

  cuota      = parseFloat(document.forms[0].cuota.value);
  plazos     = parseInt(document.forms[0].plazos.value);
  tipo_anual = parseFloat(document.forms[0].tipo.value);
  meses      = parseInt(document.forms[0].meses.options[document.forms[0].meses.selectedIndex].value);
  base       = parseInt(document.forms[0].base.options[document.forms[0].base.selectedIndex].value);

  if (isNaN(cuota) || isNaN(plazos) || isNaN(tipo_anual) || cuota * plazos * tipo_anual == 0) {
    alert("Para calcular el importe se han de introducir los campos de 'Cuota mensual', 'Plazos' y 'Tipo nominal'.");
    return;
  }
  if (tipo_anual > 20.0) {
    alert("El 'Tipo nominal' es superior al 20% y no se puede utilizar para un préstamo hipotecario.");
    return;
  }
  plazos_en_meses = plazos * meses;
  tipo_mensual = 365 / base * tipo_anual / 1200.0;
  x = 1.0 + tipo_mensual;
  y = 1.0 / Math.pow(x, plazos_en_meses);
  //importe = cuota / ( tipo_mensual * Math.pow(x, plazos_en_meses) / ( Math.pow(x, plazos_en_meses) - 1.0 ));
  importe = cuota * ( 1.0 - y ) / tipo_mensual;
  document.forms[0].importe.value = redondea(importe);
  almacena();
}

// Funcion que calcula el numero de plazos (calcular_plazos)
// en función de CUOTA, IMPORTE y TIPO DE INTERÉS
function calcular_plazos() {
  if (ha_cambiado() == 0) {
    return;
  }

  importe    = parseFloat(document.forms[0].importe.value);
  cuota      = parseFloat(document.forms[0].cuota.value);
  tipo_anual = parseFloat(document.forms[0].tipo.value);
  base       = parseInt(document.forms[0].base.options[document.forms[0].base.selectedIndex].value);

  if (isNaN(importe) || isNaN(cuota) || isNaN(tipo_anual) || importe * cuota * tipo_anual == 0) {
    alert("Para calcular los plazos se han de introducir los campos de 'Importe', 'Cuota mensual' y 'Tipo nominal'.");
    return;
  }
  if (tipo_anual > 20.0) {
    alert("El 'Tipo nominal' es superior al 20% i no se puede utilizar para un préstamo hipotecario.");
    return;
  }
  tipo_mensual = 365 / base * tipo_anual / 1200.0;
  if (cuota <= importe * tipo_mensual) {
    alert("Es impossible una hipoteca amb aquests valors");
    return;
  }
  plazos_en_meses = Math.round((Math.log(cuota) - Math.log(cuota - importe * tipo_mensual)) / Math.log(tipo_mensual + 1.0));
/*  
  plazos_en_meses = 1;
  x = 1.0 + tipo_mensual;
  cuota_aprox = redondea(importe * tipo_mensual * Math.pow(x, plazos_en_meses) / ( Math.pow(x, plazos_en_meses) - 1.0 ));
  while (cuota_aprox > cuota) {
    plazos_en_meses++;
    cuota_aprox = redondea(importe * tipo_mensual * Math.pow(x, plazos_en_meses) / ( Math.pow(x, plazos_en_meses) - 1.0 ));
    if (plazos_en_meses > 360) {
      alert("El nùmero de plazos necesarios excede el límite admitido por un banco (30 años)" + plazos_en_meses);
      almacena();
      return;
    }
  }
  document.forms[0].plazos.value = plazos_en_meses - 1; 
*/
  document.forms[0].plazos.value = plazos_en_meses;
  document.forms[0].meses.options[1].selected = true;
  almacena();
}

// Funcion que calcula el tipo de interes (calcular_tipo)
// en función de CUOTA, IMPORTE y NÚMERO DE PLAZOS
function calcular_tipo() {
  if (ha_cambiado() == 0) {
    return;
  }

  importe    = parseFloat(document.forms[0].importe.value);
  cuota      = parseFloat(document.forms[0].cuota.value);
  plazos     = parseInt(document.forms[0].plazos.value);
  meses      = parseInt(document.forms[0].meses.options[document.forms[0].meses.selectedIndex].value);
  base       = parseInt(document.forms[0].base.options[document.forms[0].base.selectedIndex].value);

  if (isNaN(importe) || isNaN(cuota) || isNaN(plazos) || importe * cuota * plazos == 0) {
    alert("Para calcular el tipo se han de introducir los campos de 'Importe', 'Cuota mensual' y 'Plazos'.");
    return;
  }

  plazos_en_meses = plazos * meses;
  tipo_mensual_aprox = 365 / base * 20.0 / 1200.0;
  inc_tipo = 10.0 / 1200.0;
  x = 1.0 + tipo_mensual_aprox;
  y = 1.0 / Math.pow(x, plazos_en_meses);
  cuota_aprox = redondea(importe * tipo_mensual_aprox / ( 1.0 - y ));
  while (cuota_aprox != cuota) {
    if (cuota_aprox > cuota) {                             // Tipo demasiado alto
      tipo_mensual_aprox = tipo_mensual_aprox - inc_tipo;
    } else {                                               // Tipo demasiado bajo
      tipo_mensual_aprox = tipo_mensual_aprox + inc_tipo;
    }
    if ( tipo_mensual_aprox > 365 / base * 20.0 / 1200.0 ) {
      alert("El 'Tipo nominal' es superior al 20% y no se puede utilizar para un préstamo hipotecario.");
      almacena();
      return;
    }
    inc_tipo = inc_tipo / 2.0;
    x = 1.0 + tipo_mensual_aprox;
    y = 1.0 / Math.pow(x, plazos_en_meses);
    cuota_aprox = redondea(importe * tipo_mensual_aprox / (1.0 - y ));
  }
  tipo_mensual = tipo_mensual_aprox * 1200.0 * base / 365;
  document.forms[0].tipo.value = redondea(tipo_mensual * 100.0) / 100.0;
  almacena();
}
