/* Hipofinan */

function capital(cuota, interes_anual, anyos, periodos_anyo)
{
	interes_anual /= 100;
	var aux = 1.0 - Math.pow((1.0 + interes_anual / periodos_anyo), -(anyos * periodos_anyo));
	return(cuota * aux / (interes_anual / periodos_anyo));
}
function cuota(capital, interes_anual, anyos, periodos_anyo)
{
	interes_anual /= 100;
	var aux = 1.0 - Math.pow((1.0 + interes_anual / periodos_anyo), -(anyos * periodos_anyo));
	return(capital * (interes_anual / periodos_anyo) / aux);
}
function cuotav(capital, interes_f, anyos_f, interes_v, anyos_v, periodos_anyo)
{
	var cuota_fija = cuota(capital, interes_f, anyos_f + anyos_v, periodos_anyo);
	
	if (anyos_v > 0)
	{
		var capital_restante, capital_amortizado, interes_amortizado, pagos_fijo, i;
		pagos_fijo = anyos_f * periodos_anyo;
		capital_restante = capital;
		for(i = 1; i <= pagos_fijo; i++)
		{
			interes_amortizado = capital_restante * interes_f / (periodos_anyo * 100.0);
			capital_amortizado = cuota_fija - interes_amortizado;
			capital_restante = capital_restante - capital_amortizado;
		}

		return cuota(capital_restante, interes_v, anyos_v, periodos_anyo);
	}
	return cuota_fija;
}
function tae(C, c, n, q)
{
	if (isNaN(c)) return NaN;
	
	var max_dif = 1; if (c < 2) max_dif = 0.2
	var I = 5.0;
	var increm = 1.0;
	var c_aux = cuota(C, I, n, q);
	var dif = c - c_aux;
	var dif_aux ,maxloops = 50;
	
	increm = Math.abs(increm) * (dif / Math.abs(dif)); // poner el signo correcto
	
	if (isNaN(c_aux)) return NaN;

	for (var counter = 0; Math.abs(dif) > max_dif && counter <= maxloops; ++counter)
	{
		I += increm;
		c_aux = cuota(C, I, n, q);
		dif_aux = dif;
		dif = c - c_aux;
		
		increm = dif * increm / (dif_aux - dif);
	//	increm = Math.abs(increm) * (dif / Math.abs(dif)); // poner el signo correcto (no hace falta)
	}

	return I;
}
function plazo(C, c, I, q)
{
	if (isNaN(c)) return NaN;

	var maxloops = 1000;
	var dif_aux = 0;
	var n = 25.0;
	var increm = 1.0;
	var c_aux = cuota(C, I, n, q);
	var dif = c_aux - c;

	if (isNaN(c_aux)) return NaN;

	for (var counter = 0; n > 0 && n <= 100 && counter < maxloops; counter++) // counter se añade para evitar un blucle infinito en caso de errores en el código
	{

		if (Math.abs(dif + dif_aux) < Math.max(dif, dif_aux)) // ((Math.abs(dif) + Math.abs(dif_aux))))
		{
			if (Math.abs(dif) < Math.abs(dif_aux))
				return n;
			else
				return n - increm;
		}
		increm = Math.abs(increm) * (dif / Math.abs(dif)); // poner el signo correcto
		n += increm;
		c_aux = cuota(C, I, n, q);
		dif_aux = dif;
		dif = c_aux - c;
	}
	return n;
}
//_________________________________________________________
function isEmpty(s){return ((s == null) || (s.length == 0));}
function redondear(numero, decimales)
{
	if (isEmpty(numero) || numero == '-' || numero == '+')
		return '';
	if (numero > 99999999999) // los numeros grandes los aproxima como quiere...
		return numero;
	if (isEmpty(decimales)) decimales = 0;
	var aux = Math.pow(10, decimales);
	return (Math.round(numero * aux)/aux);
}



/* Format Num ***************************************************************************************/

function euro_keypress(){restringirNumero(1000000000, 2);}
function euro_blur(obj){esNumeroEntre(obj, 1000000000, 2);}
function tipo_keypress(){restringirNumero(1000000, 3);}
function tipo_blur(obj){esNumeroEntre(obj, 1000000, 3);}
function trim(s){return s.replace(/(^\s*)|(\s*$)/g, '');}
function restringirNumero(max, decimales, bSign, bThousand, bAllow_leading_zeros)
{// evento onKeyPress
	var objTxt = event.srcElement;
	var objValue = objTxt.value;
	var keyCode = event.keyCode;
	
	if (decimales == null) decimales = -2;
	if (bSign == null) bSign = false;
	if (bThousand == null) bThousand = true;
	if (bAllow_leading_zeros == null) bAllow_leading_zeros = false;


	if ((keyCode == 43 || keyCode == 45) && objValue.indexOf('+') == -1 && objValue.indexOf('-') == -1 && bSign)
	{
		// Se ponga donde se ponga un signo siempre aparece al principio y
		// después el cursor se va al final del objeto.
		event.returnValue = false;
		objTxt.value = String.fromCharCode(keyCode) + objTxt.value;
		return false;
	}
	if ((keyCode > 57 || keyCode < 43 || keyCode == 47) || (keyCode == 43 || keyCode == 45) && (objValue.indexOf('+') > -1 || objValue.indexOf('-') > -1 || !bSign) || ((keyCode == 44 || keyCode == 46) && (objValue.indexOf(',') > -1 || decimales == -2)))
	{
		event.returnValue = false;
		esNumeroEntre(objTxt, max, decimales, bSign, bThousand, bAllow_leading_zeros);
		return false;
	}
	if (keyCode == 46) // punto (.)
		event.keyCode = 44; // coma (,)
}
function formatNum(valor, decimales, bSign, bThousand, bAllow_leading_zeros)
{
	var val = stripSpaces(valor);

	if (decimales == null) decimales = -2;
	if (bThousand == null) bThousand = true;
	if (bSign == null) bSign = false;
	if (bAllow_leading_zeros == null) bAllow_leading_zeros = false;

	if (bSign)
		val = comprobarSigno(val); // en esta función ya se llama a stripLeadingZeros(val)
	else
	{
		val = val.replace(/[+-]/g , '');
		if (!(bAllow_leading_zeros && (decimales == -2 || decimales == 0) && !bThousand))
			val = stripLeadingZeros(val);
	}

	if (decimales > -2)
		val = limpiarDecimal(val, decimales);

	if (bThousand)
		val = ponerPuntos(val);
	
	if (isNaN(quitarFormatoNumero(val))) // en caso de que se hubiera pegado un valor erroneo.
		val = valor;
		
	return val;
}

function esNumeroEntre(objTxt, max, decimales, bSign, bThousand, bAllow_leading_zeros)
{
	if (decimales == null) decimales = -2;
	if (bThousand == null) bThousand = true;
	if (bSign == null) bSign = false;
	if (bAllow_leading_zeros == null) bAllow_leading_zeros = false;

	var num = objTxt.value;
	if (decimales == -2)
	{
		num = num.replace(/[,]/g , '');
		objTxt.value = num;
	}
	num = quitarFormatoNumero(num);
	if (trim(num) == '' || trim(num) == '.')
	{
		objTxt.value = '';
		return true;
	}

	var mensaje = 'Debe ser un número menor que ' + ponerPuntos(max) + '\n(el signo decimal debe ser la coma ",")';

	if (!bAllow_leading_zeros)
		num = (num == '')? num: parseFloat(num);

	if (num == '' || (esNumero(num) && num <= max))
	{
		num += '';
		num = num.replace(/[.]/g, ',');
		objTxt.value = formatNum(num, decimales, bSign, bThousand, bAllow_leading_zeros);
		return true;
	}

	alert(mensaje);
	objTxt.focus();
	objTxt.select();
	return false;
}
function esNumero(dato)
{
	dato = '' + dato;
	return (dato != '' && !isNaN(dato) && dato.indexOf('E') == -1 && dato.indexOf('e') == -1);
}
function ponerPuntos(num)
{
	num = '' + num;
	var aux_i = '';
	var aux_d = '';
	var numero = num.replace(/[.]/g, ''); // limpiar formato pero dejar la coma (,)
	var num_sin_dec;
	var decimales = '';
	var num_puntos = '';
	var signo = numero.charAt(0);
	if (signo == '-' || signo == '+')
		numero = numero.substr(1);
	else
		signo = '';
	if (numero.indexOf(',') != -1)
	{
		num_sin_dec = numero.substring(0, numero.indexOf(','));
		decimales = numero.substr(numero.indexOf(','));
	}
	else
		num_sin_dec = numero;

	if (num_sin_dec.length > 3)
	{
		aux_i = num_sin_dec;
		while (aux_i.length > 3)
		{
			aux_d = aux_i.substr(aux_i.length - 3);
			aux_i = aux_i.substr(0, aux_i.length - 3);
			num_puntos = '.' + aux_d + num_puntos;
		}
		num = signo + aux_i + num_puntos + decimales;
	}
	else
		num = signo + numero;
	return num;
}
function quitarFormatoNumero(dato)
{
	datAo = '' + dato;
	dato = dato.replace(/[.]/g, '');
	dato = dato.replace(/\,/g, '.');
	return dato;
}

function stripSpaces(s)
{
	return s.replace(/\s/g, '');
}
function comprobarSigno(value)
{
	value = stripLeadingZeros(value);
	if (value == '-' || value == '+') return '';
	if (value.lastIndexOf('+') > 0)
		return value.replace(/[+]/g, '');
	if (value.lastIndexOf('-') > 0)
		return value.replace(/[-]/g, '');
	return value;
}
function stripLeadingZeros(s)
{
	var signo = s.charAt(0);
	if (signo == '-' || signo == '+')
		s = s.substr(1);
	else
		signo = '';

	for (var i = 0; i < s.length; ++i)
		if (s.charAt(i) != '0' || s.charAt(i+1) == ',' || s.charAt(i+1) == '')
			return signo + s.substr(i);
	return signo + s;
}
function redondear(numero, decimales)
{
	if (numero == null || numero == '-' || numero == '+')
		return '';
	if (numero > 99999999999) // los numeros grandes los aproxima como quiere...
		return numero;
	if (decimales == null) decimales = 0;
	var aux = Math.pow(10, decimales);
	return (Math.round(numero * aux)/aux);
}
function limpiarDecimal(numero, decimales)
{
	if (decimales == null) decimales = -2;
	numero = '' + numero;
	var signo = numero.charAt(0);
	if (signo == '-' || signo == '+')
		numero = numero.substr(1);
	else
		signo = '';

	if (decimales > -1)
	{
		numero = '' + redondear(quitarFormatoNumero(numero), decimales);
		numero = numero.replace(/[.]/g, ',');
	}

	var coma_index = numero.indexOf(',');
	if (coma_index == (numero.length - 1))
		numero = numero.substr(0, coma_index);
	else if (coma_index == 0)
		numero = '0' + numero;

	numero = signo + numero;

	return numero;
}




/* Calculo de la hipoteca **********************************************************************************************/

var q = 12;
function calcular()
{
	var C = quitarFormatoNumero(document.credito.C.value);
	var n = quitarFormatoNumero(document.credito.n.value);
	var I = quitarFormatoNumero(document.credito.I.value);
	var cu = quitarFormatoNumero(document.credito.cu.value);

	if (C == '' && n != '' && I != '' && cu != '')
		calcularCapital(cu, I, n, q);
	else if (n == '' && C != '' && I != '' && cu != '')
		calcularPlazo(C, cu, I, q);
	else if (I == '' && n != '' && C != '' && cu != '')
		calcularInteres(C, cu, n, q);
	else if (cu == '' && n != '' && I != '' && C != '')
		calcularCuota(C, I, n ,q);
	else
		alert('Debe rellenar todos los valores menos el que desea calcular.');
}
function calcularPlazo(C, cu, I, q)
{
	var p = plazo(C, cu, I, q);
	if (isNaN(p))
		alert('Los datos proporcionados no son coherentes.\nEl cálculo no se puede hacer.\n');
	else if (p <= 0)
		document.credito.n.value = '< 0';
	else if (p > 100)
		document.credito.n.value = '> 100';
	else
		document.credito.n.value = p;
}
function calcularCapital(cu, I, n, q)
{
	var c = capital(cu, I, n, q);
	if (isNaN(c))
		alert('Los datos proporcionados no son coherentes.\n\nEl cálculo no se puede hacer.\n');
	else
		document.credito.C.value = ponerPuntos(Math.round(c));
}
function calcularCuota(C, I, n ,q)
{
	var c = cuota(C, I, n ,q);
	if (isNaN(c))
		alert('Los datos proporcionados no son coherentes.\n\nEl cálculo no se puede hacer.\n');
	else
	{
		c = '' + redondear(c, 2);
		document.credito.cu.value = ponerPuntos(c.replace(/[.]/g, ','));
	}
}
function calcularInteres(C, cu, n, q)
{
	var i = tae(C, cu, n, q);
	if (isNaN(i))
		alert('Los datos proporcionados no son coherentes.\n');
	else if (i >= 0)
	{
		i = '' + redondear(i, 3);
		document.credito.I.value = i.replace(/[.]/g, ',');
	}
	else
		alert('El interés calculado es menor que cero. \n\nLa cuota y/o el plazo son demasido bajos.\n');
}



