// JavaScript Document
// Banco de España
// El Portal del Cliente Bancario
// Simulador Hipotecario con Amortización Parcial
// DEPENDENCIAS (ficheros js a incluir antes):
// simulador_camposNum.js
// simulador_matFin.js
// simulador_tablas.js

/* Tablas de amortización a calcular (ver fichero simulador_tablas.js) */
var tabla_nuevoPlazo = null;
var tabla_nuevaCuota = null;

/**
 * Mostrar la tabla de amortización para el caso de recalcular el plazo.
 */
function mostrarTablaNuevoPlazo() {
	if (doCalcular()) {
		escribeDocumentoTabla(tabla_nuevoPlazo);
		return true;
	}
	return false;
}

/**
 * Mostrar la tabla de amortizacióin para el caso de recalcular la cuota.
 */
function mostrarTablaNuevaCuota() {
	if (doCalcular()) {
		escribeDocumentoTabla(tabla_nuevaCuota);
		return true;
	}
	return false;
}

/**
 * Realiza la validación de los campos de entrada, calcula y muestra los campos de salida y calcula las tablas de amortización.
 */
function doCalcular(){
	// Comprobaciones de datos.
	var l_listaErrores = new Array();
	var l_capital = comprobarValorPositivo(document.miForm.dat_capital, "Capital pendiente de amortizar", l_listaErrores);
	var l_interes = comprobarValor(document.miForm.dat_interes, "Tipo de Interés", l_listaErrores);
	var l_numCuotas = comprobarValorPositivo(document.miForm.dat_plazos, "Plazo de Amortización pendiente", l_listaErrores) *
			document.miForm.sel_plazo.value;
	var l_capAmortizar = comprobarValorPositivo(document.miForm.dat_amortizar, "Capital a amortizar", l_listaErrores);
	if (l_capital > 0 && l_capAmortizar > 0 && l_capital <= l_capAmortizar) {
		l_listaErrores.push('El capital a amortizar debe ser menor que el capital pendiente');
		l_listaErrores.push(document.miForm.dat_amortizar);
	}
	
	if (l_listaErrores.length > 0) {
		var l_mensaje = 'Los datos de entrada no son válidos:';
		for (var i = 0; i < l_listaErrores.length; i+=2) {
			l_mensaje += '\n- ' + l_listaErrores[i];
		}
		alert(l_mensaje);
		l_listaErrores[1].focus();
		return false;
	}

	// Cálculos
	var l_interesPeriodo = l_interes/1200;
	var l_cuotaAntes = l_capital / rufFactorValorInicial(l_numCuotas, l_interesPeriodo);

	var l_capitalRebajado = l_capital - l_capAmortizar;
		
	// Recalcular nuevo plazo.
	// - La mayoría de los casos la duración será un número fraccionario.
	//   Redondearemos hacia arriba y quedará una cuota residual para el último pago.
	// - Puede ocurrir que la cuota residual ínfima (redondeada a 0).
	//   En tal caso la despreciamos y recortamos un periodo.
	var l_duracionFraccionaria = rufDuracion(l_capitalRebajado/l_cuotaAntes, l_interesPeriodo);
	var l_nuevoPlazo = Math.ceil(l_duracionFraccionaria);
	// La cuota final es valor pendiente de amortizar en el penúltimo periodo, aplicando el interés de un periodo.
	var l_cuotaResidual = l_cuotaAntes * rufFactorValorInicial(
			l_duracionFraccionaria - l_nuevoPlazo + 1.0, l_interesPeriodo)
			* (1.0 + l_interesPeriodo);
	if (Math.abs(l_cuotaResidual) < 0.005) {
		l_nuevoPlazo--;
		l_cuotaResidual = l_cuotaAntes;
	}
	
	// Recalculamos la cuota para el caso de mantener el periodo.
	var l_nuevaCuota = l_capitalRebajado /
			rufFactorValorInicial(l_numCuotas, l_interesPeriodo);

	// Calculamos las tablas de amortización.
	tabla_nuevoPlazo = calculaTablaRufmDuracionPorCuota(l_cuotaAntes, l_interes, l_capitalRebajado);
	tabla_nuevoPlazo[TA_AMORTIZADO][0] = l_capAmortizar;
	
	tabla_nuevaCuota = calculaTablaRufm(l_numCuotas, l_interes, l_capitalRebajado);
	tabla_nuevaCuota[TA_AMORTIZADO][0] = l_capAmortizar;

	document.miForm.btn_tablaNuevaCuota.disabled=false;
	document.miForm.btn_tablaNuevoPlazo.disabled=false;

	setNumeroCampo(document.miForm.res_nuevoPlazo_plazo, l_nuevoPlazo);
	setNumeroCampo(document.miForm.res_nuevoPlazo_cuota, l_cuotaAntes);
	setNumeroCampo(document.miForm.res_nuevaCuota_plazo, l_numCuotas);
	setNumeroCampo(document.miForm.res_nuevaCuota_cuota, l_nuevaCuota);
	
	window.location='#topForm';
	return true;
}


// -----------
// Funciones comprobación campos
// -----------

/**
 * Obtiene el valor de un campo, comprobando si es un valor numérico mayor que cero.
 *  En caso de fallo añade un mensaje a la lista y devuelve -1.
 */
function comprobarValorPositivo(campoFormulario, nombreCampo, listaMensajes) {
	var valor = getNumeroCampo(campoFormulario);
	if(isNaN(valor) || (valor <= 0)){
		listaMensajes.push('Debe introducir el campo: ' + nombreCampo);
		listaMensajes.push(campoFormulario);
		return -1;
	}
	return valor;
}


/**
 * Obtiene el valor de un campo, comprobando si es un valor numérico mayor o igual que cero.
 *  En caso de fallo añade un mensaje a la lista y devuelve -1.
 */
function comprobarValor(campoFormulario, nombreCampo, listaMensajes) {
	var valor = getNumeroCampo(campoFormulario);
	if(isNaN(valor) || (valor < 0)){
		listaMensajes.push('Debe introducir el campo: ' + nombreCampo);
		listaMensajes.push(campoFormulario);
		return -1;
	}
	return valor;
}

