// Fichero de funciones javascript para las tablas de amortizacion.
// Autor: Fco. Javier Aranda Granda (Unidad Internet-Intranet/BdE)
// Versión 070418
// Depende de:
// - simulador_matFin.js
// - simulador_camposNum.js

/*
Fundamentos generales.
# Una tabla de amortización para un préstamo con N periodos de cómputo(meses)
  está compuesto por N+1 filas de datos.
- La primera fila, correspondiente al mes 0 representa el momento de la concesión del crédito.
- La segunda fila (mes 1) corresponde al primer pago.
- La última fila (mes N) corresponde al último pago.
# Representamos las siguientes columnas:
- Nº de mes.
- Tipo de interés: Interés TAE con el que se calcula el importe de los intereses
  a pagar en el mes actual.
- Cuota: La cuota que se está pagando en ese periodo. En caso de hacer una
  amortización parcial en el modelo aprovado NO se representa dicha amortización
  parcial.
- Amortizado: La parte de la cuota que sobra de pagar los intereses y que se
  dedica a amortizar el capital pendiente.
  En el caso de periodo de carencia, en el caso de que no se paguen intereses,
  y en el modelo aprobado, se representa como valor cero (aunque en realidad 
  el importe de amortización se podría considerar negativo).
  En el caso de amortización parcial, sí que se refleja en el amortizado
  la cantidad extra amortizada..
- Intereses: Importe de los intereses a pagar. Se calcula a partir del tipo
  de interés aplicable al periodo actual, y el capital pendiente del periodo anterior.
- Capital pendiente: El capital que queda pendiente de pagar después de contabilizar
  la cuota pagada y los intereses. En el periodo inicial se espera que sea igual
  al capital prestado. En el periodo final se espera que sea cero.
  
## DECLARACION DE CONSTANTES
## FUNCIONES DE UTILIDAD INTERNA
- rellenaTablaLineas(arrTipos:double[], arrCuotas:double[], arrAmortizados:double[], arrIntereses:double[], arrPendientes:double[], periodoInicio:int, periodoFin:int):void;
 * Rellena un rango de líneas de una tabla de amortización, calculando el importe de intereses, el amortizado y el capital pendiente para cada periodo.
function rellenaTablaLineaCuadre(arrTipos:double[], arrCuotas:double[], arrAmortizados:double[], arrIntereses:double[], arrPendientes: double[], periodoAjuste:int):void;
 * Rellena una línea de la tabla de amortización (la última) para que la cuota pagada cuadre con la variación del capital pendiente.
function creaTablaAmortizacion(a_capInicial:double, a_numPeriodos:int, arrInicioTramos:int[], arrTiposTramos:double[], arrCuotasTramos:double[]):double[][];
 * Crea los datos de una tabla de amortización para los datos suministrados.

## FUNCIONES DE CALCULO DE TABLAS (escenarios concretos)
- function calculaTablaRufm(a_numMeses:int, a_interesNominal:double, a_capital:double):Array {
 * Genera la tabla de amortización para un caso sencillo de préstamo

- function calculaTablaRufmCarencia(a_numMeses:int, a_interesNominal:double, a_capital:double, a_mesesCarencia:int, a_cuotaCarencia:double):Array {
 * Elabora la tabla de amortización para el escenario de un periodo de carencia.

- function calculaTablaRufmCambioInteres(a_numMeses:int, a_interesNominal:double, a_capital:double, a_mesCambio:int, a_interesNominal2:double): Array {
 * Elabora la tabla de amortización para el escenario de un cambio de tipo de interés.

- function calculaTablaRufmDuracionPorCuota(a_cuota:double, a_interesNominal:double, a_capital:double):Array {
 * Calcula la tabla de amortización para la hipótesis de ajustar la duración del préstamo

## FUNCIONES DE FORMATEO DE TABLAS.
- function escribeDocumentoTabla(a_tabla:Array) {
 * Abre una nueva ventana para visualizar la tabla de amortización

function escribeTabla(a_tabla:Array, a_destino:document) {
 * Escribe el código HTML de la tabla generada en un objeto document.

() EJEMPLOS DE USO:
- simulador_amortizacion.js
- pruebas_tablas.htm

*/

//##########
// DECLARACION DE CONSTANTES
//##########

/** Tamaño de la primera dimensión de las tablas de amortización (número de columnas) */
var TA_SIZE = 5;
/** Columna de la tabla para el tipo de interés aplicable para el periodo (es un dato de entrada para el llamador). */
var TA_TIPOINTERES = 0;
/** Columna de la tabla para la cuota que el cliente paga en el periodo (es un dato de entrada para el llamador). */
var TA_CUOTA = 1;
/** Columna para el importe del capital amortizado en el periodo (es un dato de salida, igual a la cuota menos los intereses). */
var TA_AMORTIZADO = 2;
/** Columna para el importe de los intereses generados en el periodo anterior
  (un dato de salida, igual al capital pendiente del periodo anterior, por el tipo de interés indicado en éste)*/
var TA_INTERESES = 3;
/** Capital pendiente de amortizar tras este periodo. (Dato de entrada en el periodo cero, de salida
  en todos los periodos siguientes, igual al capital pendiente del periodo anterior menos el capital
  amortizado en este periodo. */
var TA_CAPITALPENDIENTE = 4;


//##########
// FUNCIONES DE UTILIDAD INTERNA
//##########

/**
 * Rellena un rango de líneas de una tabla de amortización, calculando el importe de intereses, el amortizado y el capital pendiente para cada periodo.
 * @param arrTipos Array de los tipos de interés (por periodo) de la tabla de amortización. Debe venir relleno.
 * @param arrCuotas Array de las cuotas de la tabla de amortización. Debe venir relleno.
 * @param arrAmortizados Array de los importes amortizados. Se rellena.
 * @param arrIntereses Array de los importes de intereses pagados. Se rellena.
 * @param arrPendientes Array de capitales pendientes de amortizar. Se rellena.
 * @param periodoInicio Número de periodo de inicio de proceso (inclusive).
 * @param periodoFin Número de periodo de fin de proceso (exclusive).
 */
function rellenaTablaLineas(arrTipos, arrCuotas, arrAmortizados, arrIntereses, arrPendientes, periodoInicio, periodoFin) {
	var l_pendienteAnterior = arrPendientes[periodoInicio - 1];
	for (var idxPeriodo = periodoInicio; idxPeriodo < periodoFin; idxPeriodo++) {
		var l_importeInteres = redondea(l_pendienteAnterior * arrTipos[idxPeriodo], 2);
		arrIntereses[idxPeriodo] = l_importeInteres;
		arrAmortizados[idxPeriodo] = arrCuotas[idxPeriodo] - l_importeInteres;
		l_pendienteAnterior = arrPendientes[idxPeriodo - 1] - arrAmortizados[idxPeriodo];
		arrPendientes[idxPeriodo] = l_pendienteAnterior;
	}
}

/**
 * Rellena una línea de la tabla de amortización (la última) para que la cuota pagada cuadre con la variación del capital pendiente.
 * @param arrTipos Tipos de interés por periodo de la tabla de amortización. Debe venir rellenado.
 * @param arrCuotas Cuotas pagadas por periodo de la tabla de amortización. Se calcula para el periodo.
 * @param arrAmortizados Importes amortizados por periodo de la tabla de amortización. Se calcula para el periodo.
 * @param arrIntereses Intereses pagados por periodo de la tabla de amortización. Se calcula para el periodo.
 * @param arrPendientes Capital pendiente de amortizar por periodo. Debe venir relleno para este periodo y para el anterior.
 * @param periodoAjuste Número de periodo de la tabla de amortización para el que se hace el ajuste.
 */
function rellenaTablaLineaCuadre(arrTipos, arrCuotas, arrAmortizados, arrIntereses, arrPendientes, periodoAjuste) {
	var l_pendienteAnterior = arrPendientes[periodoAjuste - 1];
	var l_pendienteNuevo = arrPendientes[periodoAjuste];
	var l_importeIntereses = redondea(l_pendienteAnterior * arrTipos[periodoAjuste], 2);
	arrIntereses[periodoAjuste] = l_importeIntereses;
	arrCuotas[periodoAjuste] = l_pendienteAnterior - l_pendienteNuevo + l_importeIntereses;
	arrAmortizados[periodoAjuste] = arrCuotas[periodoAjuste] - l_importeIntereses;
}

/**
 * Crea los datos de una tabla de amortización para los datos suministrados.
 * @param a_capInicial Capital inicial del préstamo
 * @param a_numPeriodos Número de periodos que dura el préstamo
 * @param arrInicioTramos Array con los números de periodo en que comienza cada tramo.
 *   Debe estar ordenado de forma ascendente. El primer tramo típicamente empezará en el periodo 1 y no en el 0.
 * @param arrTiposTramos Tipos de interés por periodo para cada tramo.
 * @param arrCuotasTramos Cuotas pagadas por periodo para cada tramo.
 * @return Tabla de amortización (double[columna][periodo]. Ver constantes TA_XXX para la posición de cada columna.
 */
// TODO: Considerar quitar función comprometida
function creaTablaAmortizacion(a_capInicial, a_numPeriodos, arrInicioTramos, arrTiposTramos, arrCuotasTramos) {
	var l_numMesesTabla = a_numPeriodos + 1;
	var l_tiposInteres			= new Array(l_numMesesTabla);
	var l_cuotas				= new Array(l_numMesesTabla);
	var l_amortizados			= new Array(l_numMesesTabla);
	var l_intereses 			= new Array(l_numMesesTabla);
	var l_capitalesPendientes	= new Array(l_numMesesTabla);
	var l_tabla = [l_tiposInteres, l_cuotas, l_amortizados, l_intereses, l_capitalesPendientes];

	l_tiposInteres[0] = 0;
	l_cuotas[0] = 0;
	l_amortizados[0] = 0;
	l_intereses[0] = 0;
	l_capitalesPendientes[0] = a_capInicial;
	var l_numTramos = arrInicioTramos.length;
	for (var idxTramo = 0; idxTramo < l_numTramos; idxTramo++) {
		var l_inicioTramo = arrInicioTramos[idxTramo];
		var l_finTramo = (idxTramo < l_numTramos - 1) ? arrInicioTramos[idxTramo+1] : a_numPeriodos;
		var l_tipoTramo = arrTiposTramos[idxTramo];
		var l_cuotaTramo = arrCuotasTramos[idxTramo];
		for (var idxPeriodo = l_inicioTramo; idxPeriodo < l_finTramo; idxPeriodo++) {
			l_tiposInteres[idxPeriodo] = l_tipoTramo;
			l_cuotas[idxPeriodo] = l_cuotaTramo;
		}
		rellenaTablaLineas(l_tiposInteres, l_cuotas, l_amortizados, l_intereses, l_capitalesPendientes, l_inicioTramo, l_finTramo);		
	}
	l_tiposInteres[a_numPeriodos] = arrTiposTramos[l_numTramos-1];
	l_capitalesPendientes[a_numPeriodos] =  0.0;
	rellenaTablaLineaCuadre(l_tiposInteres, l_cuotas, l_amortizados, l_intereses, l_capitalesPendientes, a_numPeriodos);
	
	return l_tabla;
}

// var miTabla = tablaAmortizacionPeriodoInicial(a_capInicial, a_numPeriodosTotal, a_periodoFin, a_tipo, a_cuota);
function tablaAmortizacionPeriodoInicial(a_capInicial, a_numPeriodosTotal, a_periodoFin, a_tipo, a_cuota) {
	var l_numMesesTabla = a_numPeriodosTotal + 1;
	var l_tiposInteres			= new Array(l_numMesesTabla);
	var l_cuotas				= new Array(l_numMesesTabla);
	var l_amortizados			= new Array(l_numMesesTabla);
	var l_intereses 			= new Array(l_numMesesTabla);
	var l_capitalesPendientes	= new Array(l_numMesesTabla);
	var l_tabla = [l_tiposInteres, l_cuotas, l_amortizados, l_intereses, l_capitalesPendientes];

	l_tiposInteres[0] = 0;
	l_cuotas[0] = 0;
	l_amortizados[0] = 0;
	l_intereses[0] = 0;
	l_capitalesPendientes[0] = a_capInicial;
	
	tablaAmortizacionPeriodoIntermedio(l_tabla, 1, a_periodoFin, a_tipo, a_cuota);
	return l_tabla;
}

function tablaAmortizacionPeriodoIntermedio(a_tabla, a_periodoInicio, a_periodoFin, a_tipo, a_cuota) {
	var l_pendienteAnterior = a_tabla[TA_CAPITALPENDIENTE][a_periodoInicio - 1];
	for (var idxPeriodo = a_periodoInicio; idxPeriodo < a_periodoFin; idxPeriodo++) {
		a_tabla[TA_TIPOINTERES][idxPeriodo] = a_tipo;
		a_tabla[TA_CUOTA][idxPeriodo] = a_cuota;
		
		var l_importeInteres = redondea(l_pendienteAnterior * a_tipo, 2);
		a_tabla[TA_INTERESES][idxPeriodo] = l_importeInteres;
		var l_amortizado = a_cuota - l_importeInteres;
		a_tabla[TA_AMORTIZADO][idxPeriodo] = l_amortizado;
		l_pendienteAnterior -= l_amortizado;
		a_tabla[TA_CAPITALPENDIENTE][idxPeriodo] = l_pendienteAnterior;
	}

}

function tablaAmortizacionFin(a_tabla, a_periodoFin, a_tipo) {
	var l_pendienteAnterior = a_tabla[TA_CAPITALPENDIENTE][a_periodoFin - 1];
	a_tabla[TA_TIPOINTERES][a_periodoFin] = a_tipo;
	var l_intereses = redondea(l_pendienteAnterior * a_tipo, 2);
	a_tabla[TA_INTERESES][a_periodoFin] = l_intereses;
	a_tabla[TA_CUOTA][a_periodoFin] = l_pendienteAnterior + l_intereses;
	a_tabla[TA_AMORTIZADO][a_periodoFin] = l_pendienteAnterior;
	a_tabla[TA_CAPITALPENDIENTE][a_periodoFin] = 0.0;
}

//##########
//FUNCIONES DE CALCULO DE TABLAS (escenarios concretos)
//##########

/**
 * Genera la tabla de amortización para un caso sencillo de préstamo
 *   ajustado a Rentas Uniformes Finitas, con cuotas mensuales.
 * Es responsabilidad del llamador que los datos sean correctos.
 * @param a_numMeses Número de cuotas en las que se paga el préstamo-
 * @param a_interesNominal Interés nominal del préstamo (periodo cómputo es mensual).
 * @param a_capital Capital pendiente de pagar en el momento inicial.
 * @return Tabla de amortización generada.
 */
function calculaTablaRufm(a_numMeses, a_interesNominal, a_capital) {
	var l_interesPeriodo = a_interesNominal / 1200.0;
	var l_cuota = redondea(a_capital / rufFactorValorInicial(a_numMeses, l_interesPeriodo), 2);
/*
	var l_tabla = creaTablaAmortizacion(a_capital, a_numMeses, [1], [l_interesPeriodo], [l_cuota]);
*/
	var l_tabla = tablaAmortizacionPeriodoInicial(a_capital, a_numMeses, a_numMeses, l_interesPeriodo, l_cuota);
	tablaAmortizacionFin(l_tabla, a_numMeses, l_interesPeriodo);
	return l_tabla;
}

/**
 * Elabora la tabla de amortización para el escenario de un periodo de carencia.
 * Durante el periodo de carencia, o bien no se paga ninguna cuota,
 * o bien se pagan únicamente los intereses del préstamo (con lo que el capital pendiente se mantiene).
 * Es responsabilidad del llamador verificar que los datos de entrada sean correctos.
 * @param a_numMeses Número de meses que transcurren desde el inicio del préstamo hasta la finalización del mismo.
 * @param a_interesNominal Interés nominal (tantos por cien, para periodos mensuales).
 * @param a_mesesCarencia Número de meses con una cuota reducida.
 * @param a_cuotaCarencia Importe que se paga durante los meses de carencia. Es cero si no se paga
 *   ningún interés, es capitalInicial*interes/1200 si se pagan los intereses.
 * @return Tabla de amortización generada
 */
function calculaTablaRufmCarencia(a_numMeses, a_interesNominal, a_capital, a_mesesCarencia, a_cuotaCarencia) {
	var l_interesPeriodo = a_interesNominal / 1200.0;
	var l_cuota0 = redondea(a_cuotaCarencia, 2);
/*	
	var l_pendienteFinCarencia = rufCapitalPendienteEnPeriodo(a_capital, l_cuota0, a_mesesCarencia, l_interesPeriodo);
	var l_cuotaF = l_pendienteFinCarencia / rufFactorValorInicial(a_numMeses - a_mesesCarencia, l_interesPeriodo);
	var l_cuotaF = redondea(l_cuotaF, 2);
	var l_tabla = creaTablaAmortizacion(a_capital, a_numMeses,
			[1, a_mesesCarencia + 1],
			[l_interesPeriodo, l_interesPeriodo],
			[l_cuota0, l_cuotaF]);
*/
	var l_tabla = tablaAmortizacionPeriodoInicial(a_capital, a_numMeses, a_mesesCarencia + 1, l_interesPeriodo, l_cuota0);
	var l_pendienteFinCarencia = l_tabla[TA_CAPITALPENDIENTE][a_mesesCarencia];
	var l_cuotaF = redondea(
			l_pendienteFinCarencia / rufFactorValorInicial(a_numMeses - a_mesesCarencia, l_interesPeriodo),
			2);
	tablaAmortizacionPeriodoIntermedio(l_tabla, a_mesesCarencia + 1, a_numMeses, l_interesPeriodo, l_cuotaF);
	
	tablaAmortizacionFin(l_tabla, a_numMeses, l_interesPeriodo);
	return l_tabla;
}

/**
 * Elabora la tabla de amortización para el escenario de un cambio de tipo de interés.
 * En momento durante el préstamo se cambia el tipo de interés aplicable al préstamo
 *  (de modo que hay que recalcular la cuota).
 * Es responsabilidad del llamador verificar que los datos de entrada son correctos.
 * @param a_numMeses Número de meses totales desde el inicio hasta que se termina de pagar el préstamo.
 * @param a_interesNominal Tipo de Interés (tanto por ciento, nominal referido a meses) inicial del préstamo.
 * @param a_mesCambio Número de meses durante los que se aplica el tipo de interés inicial. Si el mes i es 12,
 *   entonces en la tabla se representa el tipo inicial desde el 1 hasta el 12(i), y a partir del
 *   13(i+1) se aplica el tipo de interés cambiado.
 * @param a_interesNominal2 Tipo de interés (tanto por ciento, nominal referido a meses) a aplicar
 *   despúes del cambio.
 * @return Tabla de amortización generada.
 */
function calculaTablaRufmCambioInteres(a_numMeses, a_interesNominal, a_capital, a_mesCambio, a_interesNominal2) {
	// Calcula la cuota inicial.
	var l_interesPeriodo = a_interesNominal / 1200.0;
	var l_cuota0 = redondea(
			a_capital / rufFactorValorInicial(a_numMeses, l_interesPeriodo),
			2);
/*
	// Calcula la cuota tras el cambio de intereses.
	var l_capitalPendienteCambio = rufCapitalPendienteEnPeriodo(a_capital, l_cuota0, a_mesCambio, l_interesPeriodo);
	var l_interesPeriodo2 = a_interesNominal2 / 1200.0;
	var l_cuotaF = l_capitalPendienteCambio /
			rufFactorValorInicial(a_numMeses - a_mesCambio, l_interesPeriodo2);
	// Rellena la tabla
	var l_tabla = creaTablaAmortizacion(a_capital, a_numMeses,
			[1, a_mesCambio + 1],
			[l_interesPeriodo, l_interesPeriodo2],
			[l_cuota0, l_cuotaF]);
*/
	var l_tabla = tablaAmortizacionPeriodoInicial(a_capital, a_numMeses, a_mesCambio + 1, l_interesPeriodo, l_cuota0);
	var l_capitalPendienteCambio = l_tabla[TA_CAPITALPENDIENTE][a_mesCambio];
	var l_interesPeriodo2 = a_interesNominal2 / 1200.0;
	var l_cuotaF = redondea(
			l_capitalPendienteCambio / rufFactorValorInicial(a_numMeses - a_mesCambio, l_interesPeriodo2),
			2);
	tablaAmortizacionPeriodoIntermedio(l_tabla, a_mesCambio + 1, a_numMeses, l_interesPeriodo2, l_cuotaF);
	tablaAmortizacionFin(l_tabla, a_numMeses, l_interesPeriodo2);

	return l_tabla;
}

/**
 * Calcula la tabla de amortización para la hipótesis de ajustar la duración del préstamo
 *  en función de la cuota (como cuando se hace una amortización parcial).
 * Es responsabilidad del llamador comprobar que los datos de entrada sean correctos.
 *  Será inválido por ejemplo si la cuota es inferior a la cantidad que se pagaría simplemente
 *  como intereses (a_capital*a_interesNominal/1200)
 * En el caso de amortización parcial, procedería que el llamador retoque el resultado en
 *  el amortizado del periodo cero para indicar el capital que se amortizó.
 * @param a_cuota Cuota con la que se quiere pagar el préstamo.
 * @param a_interesNominal Tipo de Interés (tanto por ciento, nominal referido a meses) del préstamo.
 * @param a_capital Capital pendiente de amortizar (por ejemplo después de la amortización parcial).
 * @return Tabla de amortización generada.
 */
function calculaTablaRufmDuracionPorCuota(a_cuota, a_interesNominal, a_capital) {
	var l_interesPeriodo = a_interesNominal / 1200.0;
	// Calcula el número de periodos.
	var l_cuotaRed = redondea(a_cuota, 2);
	var l_duracion = rufDuracion(a_capital/l_cuotaRed, l_interesPeriodo);
	// La duración es redondeada hacia arriba para que el último pago sea igual o menor
	// a la cuota normal. Puede que resulte un último pago de cero (o negativo), en cuyo caso
	// decrementaremos el número de cuotas.
	var l_numPeriodos = Math.ceil(l_duracion);
	// Calculo la cuota final a partir del valor actualizado de la renta de todas las cuotas menos la última.
	var l_valorCuotasNormales = l_cuotaRed * rufFactorValorInicial(l_numPeriodos - 1, l_interesPeriodo);
	var l_valorActualizadoCuotaFinal = a_capital - l_valorCuotasNormales;
	var l_cuotaFinal = l_valorActualizadoCuotaFinal * Math.pow(1.0+l_interesPeriodo, l_numPeriodos);
	if (l_cuotaFinal < 0.005) { // TT_IMPROVE: Permitir configurar la precisión según la divisa.
		l_numPeriodos--;
	}

	var l_tabla = creaTablaAmortizacion(a_capital, l_numPeriodos,
			[1],
			[l_interesPeriodo],
			[l_cuotaRed]);
	return l_tabla;
}



//##########
// FUNCIONES DE FORMATEO DE TABLAS.
//##########

/**
 * Abre una nueva ventana para visualizar la tabla de amortización
 * @param a_tabla La tabla de amortización generada.
 * @return (sin retorno).
 */
function escribeDocumentoTabla(a_tabla) {
        var windowTabla = window.open('','_blank','toolbar=no,status=no,scrollbars=yes,width=550');
        windowTabla.document.write('<html><head><title>Tabla de Amortizaci&oacute;n</title>\n');
        windowTabla.document.write('<style type="text/css">\n' +
                '@media screen {\n' +
                'table {font-family: Verdana; font-size:10px;border:none;}\n' +
				'th {font-family: Verdana; font-size:10px;border:none;color:#FFFFFF; background-color:#AA0000}\n' +
                'td {font-family: Verdana;font-size:10px;border:none;}\n\n' +
				'.raya {height:1px;background-color:#CCCCCC;}' +
                '.noprint {}\n' +
                '}\n' +
                '@media print {\n' +
                'table {font-family: Verdana; font-size:10px;border:solid;border-width:1px; border-color:#3399CC;}\n' +
                'td {font-family: Verdana;font-size:10px;border: solid;border-width:1px;border-color:#3399CC;}\n' +
                '.noprint {display:none}\n' +
                '}\n' +
                '@media all {\n' +
                        '.boton {border: 1px solid;; background-color: #333; color: white;'+
						'font-weight: bold; font-size: 10px; font-family: Verdana; text-align: center;} \n' +
                        '.titulo {color:#3399CC;font-size:150%;font-weight:bold}\n' +
                '}\n' +
        '</style>\n');
    windowTabla.document.write('</head><body>\n');

	escribeTabla(a_tabla, windowTabla.document);

        windowTabla.document.write('</body></html>');
		windowTabla.document.close();
}

/**
 * Escribe el código HTML de la tabla generada en un objeto document.
 * @param a_tabla Tabla de amortización a mostrar
 * @param a_destino Objeto document sobre el cual escribir el código HTML.
 * @return (sin retorno)
 */
// ** Se intentó obtener el objeto document de una capa para mostrarlo en el mísmo documento,
//   pero sin resultados por el momento.
function escribeTabla(a_tabla, a_destino) {
	a_destino.write('<table align="center" cellpadding="3">'+
	'<div class="noprint" style="float:right"><button class="boton" onclick="window.print();">Imprimir&nbsp;<img alt="Imprimir" src="../img/imprimir20.gif" style="vertical-align:middle" border="0"></button></div>'+
	'<caption><strong>Tabla de Amortizaci&oacute;n Calculada</strong></caption>' +
	'<thead><tr>\n' +
	'<th><acronym title="N&uacute;mero">Nº</acronym> mes</td>' +
	'<th>Tipo de inter&eacute;s</td>' +
	'<th>Cuota</td>' +
	'<th>Amortizado</td>' +
	'<th>Intereses</td>' +
	'<th>Capital Pendiente</td></tr></thead>\n');
	
	var l_tiposInteres = a_tabla[TA_TIPOINTERES];
	var l_cuotas = a_tabla[TA_CUOTA];
	var l_amortizados = a_tabla[TA_AMORTIZADO];
	var l_intereses = a_tabla[TA_INTERESES];
	var l_capitalesPendientes = a_tabla[TA_CAPITALPENDIENTE];
	
	var l_numCuotas = l_tiposInteres.length;
	for (var l_numMes = 0; l_numMes < l_numCuotas; l_numMes++) {
                var txtInteresMes = (l_numMes==0) ? '&nbsp;' :
						formatNumero(l_tiposInteres[l_numMes] * 1200, 2, 3, PERMITE_CERO, !PERMITE_NEG, !FORMATEA_MIL) + '&nbsp;%';
                var txtCapitalMes = formatNumero(l_capitalesPendientes[l_numMes], 6, 2, PERMITE_CERO, PERMITE_NEG, FORMATEA_MIL) + '&nbsp;&euro;';
                var txtCuotaMes = (l_numMes==0 && l_cuotas[0]==0) ? '&nbsp;' :
						formatNumero(l_cuotas[l_numMes], 6, 2, PERMITE_CERO, PERMITE_NEG, FORMATEA_MIL) + '&nbsp;&euro;';
                var txtAmortizadoMes = (l_amortizados[l_numMes] <= 0) ? '0,00&nbsp;&euro;' :
						formatNumero(l_amortizados[l_numMes], 6, 2, PERMITE_CERO, PERMITE_NEG, FORMATEA_MIL) + '&nbsp;&euro;';
                var txtInteresesMes = (l_numMes==0 && l_intereses[0]==0) ? '&nbsp;' :
						formatNumero(l_intereses[l_numMes], 6, 2, PERMITE_CERO, PERMITE_NEG, FORMATEA_MIL) + '&nbsp;&euro;';
                a_destino.write('<tr>' +
                        '<td align="right">' + l_numMes + '</td>' +
                        '<td align="right">' + txtInteresMes + '</td>' +
                        '<td align="right">' + txtCuotaMes + '</td>' +
                        '<td align="right">' + txtAmortizadoMes + '</td>'); //+
						a_destino.write(
						'<td align="right">' + txtInteresesMes + '</td>' +
                        '<td align="right">' + txtCapitalMes +'</td></tr>\n');
        }
        a_destino.write('</tbody>\n</table>');
}

