var separator = ".";
var decpoint = ",";

function escribirErrores(texto)
	{
	var capa=document.getElementById('errores');
	capa.innerHTML ='';
	capa.innerHTML =texto;
	}
function borrarErrores()
	{
	var capa=document.getElementById('errores');
	capa.innerHTML ='&nbsp;';
	}
	
function borrar(formulario)
 {
var longitud;
longitud=document.getElementById(formulario).length;
for(i=0;i<longitud;i++)
	{
	document.getElementById(formulario).elements[i].value=0;
	}
//document.getElementById(formulario).elements[0].focus();
 }
 
function poner_blanco(objeto) {
	objeto.value=new NumberFormat(objeto.value).Numero();
	if (objeto.value==0) {
		objeto.value="";
		}
}

function blanco(parametro,formulario){
	
	parametro.value=new NumberFormat(parametro.value).Numero()
	if (parametro.value=="0"){
		parametro.value=""
		}
//	parametro.focus();
}

function redondea(parametro)
	{
	if (isNaN(parametro.value)){
		escribirErrores("El dato debe ser un número.");
		parametro.value="0"
//		parametro.focus();
		return false;
		}
	else{parametro.value=Math.round(parametro.value)}
	}		
	
function validar(objeto){
	if (objeto.value==""){
		objeto.value=0;
		}
	objeto.value=new NumberFormat(objeto.value).toFormatted();
}

function NumberFormat(num)
{
	this.num;
	this.setNumber = setNumberNF;
	this.toFormatted = toFormattedNF;
	this.Numero = NumeroNF;
	this.setNumber((num==null) ? 0 : num);

}

function setNumberNF(num)
{
	this.num = num;
}
//para usar 2 decimales
function toFormattedNF() {
	var n=new String(this.num);
	n=formatNumber(n,".##0,00");
	return n;
}



function formatNumber(number, format) {
number=number.replace(/,/g,".");
if (isNaN(number)) {
	escribirErrores("El dato debe ser un número.");
	number="0,00";
	return number;
	}
else {
	if (number<0) {
		number="0,00";
		escribirErrores("El campo debe ser un número positivo.");
		return number
		}
	}

var useSeparator = format.indexOf(separator) != -1; // use separators in number
format = strip(format, separator); // remove key characters
number = "" + number; // convert number input to string
number=poner_coma(number);
// split number and format into LHS and RHS using decpoint as divider
var dec = number.indexOf(decpoint) != -1;
var nleftEnd = (dec) ? number.substring(0, number.indexOf(",")) : number;
var nrightEnd = (dec) ? number.substring(number.indexOf(",") + 1) : "";
    
dec = format.indexOf(decpoint) != -1;
var sleftEnd = (dec) ? format.substring(0, format.indexOf(",")) : format;
var srightEnd = (dec) ? format.substring(format.indexOf(",") + 1) : "";
	
//SE AJUSTAN LOS DECIMALES AÑADIENDO O QUITANDO CEROS
if (srightEnd.length < nrightEnd.length) {
	var nextChar = nrightEnd.charAt(srightEnd.length) - 0;
    nrightEnd = nrightEnd.substring(0, srightEnd.length);
    if (nextChar >= 5) nrightEnd = "" + ((nrightEnd - 0) + 1); // REDONDEADO HACIA ARRIBA


    while (srightEnd.length > nrightEnd.length) {
		nrightEnd = "0" + nrightEnd;
    }

    if (srightEnd.length < nrightEnd.length) {
		nrightEnd = nrightEnd.substring(1);
        nleftEnd = (nleftEnd - 0) + 1;
    }
}
else {
    for (var i=nrightEnd.length; srightEnd.length > nrightEnd.length; i++) {
		if (srightEnd.charAt(i) == "0") nrightEnd += "0"; // AÑADE CEROS AL NUMERO
        else break;
    }
}


sleftEnd = strip(sleftEnd, "#"); 
nleftEnd = strip(nleftEnd, separator); 
    
while (sleftEnd.length > nleftEnd.length) {
	nleftEnd = "0" + nleftEnd; 
}

var isNegative = (nleftEnd.length > 0 && nleftEnd.charAt(0) == "-");
if (isNegative) nleftEnd = nleftEnd.substring (1);

if (useSeparator) nleftEnd = separate(nleftEnd, separator); // AÑADE EL SEPARADOR
var output = nleftEnd + ((nrightEnd != "") ? "," + nrightEnd : ""); // JUNTA TODO
return (isNegative ? "-" : "") + output;
}

function strip(input, chars) { // SEPARA TODOS LOS CARACTERES EN UN STRING
var output = ""; // INICIALIZA EL STRING DE SALIDA A VACIO
for (var i=0; i < input.length; i++)
	if (chars.indexOf(input.charAt(i)) == -1) output += input.charAt(i);
return output;
}

function separate(input, separator) { // FORMATEA EL STRING DE ENTRADA CON EL SEPARADOR Y LOS CEROS NECESARIOS
input = "" + input;
var output = ""; // INICIALIZA EL STRING DE SALIDA
for (var i=0; i < input.length; i++) {
	if (i != 0 && (input.length - i) % 3 == 0) output += separator;
	output += input.charAt(i);
}
return output;
}

function NumeroNF() {
	var n=new String(this.num)
	desformatear(n)
	n=dato
	return n
}

function desformatear(cadena) {
var div=new Number(1)
dato=new String(cadena)
if (dato.indexOf(",")>=0) {dec=dato.length-dato.indexOf(",")-1} else {dec=0}
if (dec>2) {dato=dato.substr(0,dato.indexOf(",")+2);dec=2}
switch (dec) {
case 0 : div=1;break
case 1 : div=10;break
case 2 : div=100;break
}
for (i=0;i<=dato.length;i++) {
	if (dato.charAt(i)=="." || dato.charAt(i)==",") {
		dato=dato.substr(0,i)+dato.substr(i+1)
	}
}
//if (isNaN(dato)) {alert("El dato debe ser un número.")}
//else {dato=dato/div}
dato=dato/div
return dato;
}

function poner_coma(valor) {
var dato=new String(valor)
for (i=0;i<=dato.length;i++) {
	if (dato.charAt(i)==".") {dato=dato.substr(0,i)+","+dato.substr(i+1)}
	//CUANDO QUERAMOS QUITAR DECIMALES
	}
return dato
}


function calculos() {
	var cero="0,00";
	document.calc_hipotecas.interes.value=new NumberFormat(document.calc_hipotecas.interes.value).Numero();
	if (document.calc_hipotecas.aniosmeses.options.selectedIndex==0){medida = 12.0}
	else{medida = 1.0}
	var nulos=0
	longitud=document.calc_hipotecas.length
	for (i=0;i<longitud;i++) {
		if (document.calc_hipotecas[i].type=="text" && document.calc_hipotecas[i].value==""){
			if (document.calc_hipotecas[i].name=="plazo"){document.calc_hipotecas[i].value=0}
			else{document.calc_hipotecas[i].value=cero}
		}
		if (document.calc_hipotecas[i].type=="text" && (document.calc_hipotecas[i].value==0 || document.calc_hipotecas[i].value==cero)){nulos=nulos+1}
	}
	if (nulos>1){
		escribirErrores("Debe rellenar todos los campos excepto el campo Cuota.");
		return false
	}
	//Calcula el plazo
	if (document.calc_hipotecas.plazo.value==0){
		var importeunf=new NumberFormat(document.calc_hipotecas.importe.value)
		importeunf=importeunf.Numero()
		var cuotaunf=new NumberFormat(document.calc_hipotecas.cuota.value)
		cuotaunf=cuotaunf.Numero()
		document.calc_hipotecas.plazo.value = Math.round(Math.log(1-(importeunf*document.calc_hipotecas.interes.value/(cuotaunf*1200)))/(-1*Math.log(1+document.calc_hipotecas.interes.value/1200)))
		var anios=document.calc_hipotecas.plazo.value
		var resto=document.calc_hipotecas.plazo.value % 12
		if (resto==0){
			document.calc_hipotecas.aniosmeses.options.selectedIndex=0
			document.calc_hipotecas.plazo.value=Math.round(document.calc_hipotecas.plazo.value/12)
		}
		else{document.calc_hipotecas.aniosmeses.options.selectedIndex=1}
		if (isNaN(document.calc_hipotecas.plazo.value) || isFinite(document.calc_hipotecas.plazo.value)==false) {
			document.calc_hipotecas.plazo.value=0
			escribirErrores("Imposible calcular el plazo. Alguno de los datos introducidos es erroneo o excede el límite máximo (40 años).")
			return false
		}
		else {
			if (document.calc_hipotecas.plazo.value>360) {
				document.calc_hipotecas.plazo.value=0
				escribirErrores("El plazo calculado excede del límite máximo (40 años).")
				return false
			}
		}
	}
	else {
		//Calcula el importe
		if (document.calc_hipotecas.importe.value==0) {
			var cuotaunf=new NumberFormat(document.calc_hipotecas.cuota.value)
			cuotaunf=cuotaunf.Numero()
			var importe_calculo =new NumberFormat(cuotaunf*(1-Math.pow(1+document.calc_hipotecas.interes.value/1200,-document.calc_hipotecas.plazo.value*12))/(document.calc_hipotecas.interes.value/1200))
			document.calc_hipotecas.importe.value=importe_calculo.toFormatted()
		}
		else {
			//Calcula el tipo de interés	
			if (document.calc_hipotecas.interes.value==0) {
				imp = new NumberFormat(document.calc_hipotecas.importe.value).Numero()
				cuota = new NumberFormat(document.calc_hipotecas.cuota.value).Numero()
				plazo_meses = parseInt(document.calc_hipotecas.plazo.value)
				plazo_meses = plazo_meses * medida
				tipo_mensual = 20.0 / 1200.0
				inc_tipo_mensual = 10.0 / 1200.0
				y  = 1.0 + tipo_mensual
				cuota_actual = Math.round(imp * tipo_mensual * Math.pow(y,plazo_meses) / ( Math.pow(y,plazo_meses) - 1.0 ))
				var contador=0
				if (cuota*plazo_meses<imp){
					escribirErrores("Resulta imposible calcular un tipo de interés, debe indicar un importe de cuota superior.")
					return	
				}
				var cuota_redondeada=Math.round(cuota)
				while ( cuota_actual != cuota_redondeada && contador<40){
					y  = 1.0 + tipo_mensual
					cuota_actual = Math.round(imp * tipo_mensual * Math.pow(y,plazo_meses) / ( Math.pow(y,plazo_meses) - 1.0 ))
					if (cuota_actual==cuota_redondeada || contador==40){
						inc_tipo_mensual=0
					}
					if (cuota_actual > cuota){ // se aplica un interes muy alto, hay que bajarlo
						tipo_mensual= tipo_mensual - inc_tipo_mensual
					}
					else {// se aplica un interes muy bajo, hay que subirlo
						tipo_mensual= tipo_mensual + inc_tipo_mensual
					}
					inc_tipo_mensual = inc_tipo_mensual / 2.0
					contador=contador+1
				}
				if (contador==40) {//LO QUITAMOS PARA QUE LO CALCULE SIEMPRE Y NO LO LIMITE AL 20%
					escribirErrores("Resulta imposible calcular un tipo de interés, debe indicar un importe de cuota inferior.")
					return
				}
				tipo_mensual = tipo_mensual * 1200.0
				document.calc_hipotecas.interes.value = Math.round(tipo_mensual * 100.0) / 100.0
			}
			else {
				// CALCULO LA CUOTA
				var importeunf=new NumberFormat(document.calc_hipotecas.importe.value)
				importeunf=importeunf.Numero()
				var cuota_calculo=new NumberFormat(importeunf*(document.calc_hipotecas.interes.value/1200)/(1-Math.pow(1+document.calc_hipotecas.interes.value/1200,-document.calc_hipotecas.plazo.value*medida)))
				document.calc_hipotecas.cuota.value=cuota_calculo.toFormatted()
			}
		}
	}
	document.calc_hipotecas.interes.value=new NumberFormat(document.calc_hipotecas.interes.value).toFormatted()
}
			

function validar(objeto){
	if (objeto.id!="plazo"){
		objeto.value=new NumberFormat(objeto.value).toFormatted()
		}
}


function desformatea(parametro){
	parametro.value=new NumberFormat(parametro.value).Numero()
	if (parametro.value=="0"){parametro.value=""}
}

