var cero="0,00"
function calculos() {
	if ((document.form1.plazo.value>480 && document.form1.aniosmeses.options.selectedIndex==1) || (document.form1.plazo.value>40 && document.form1.aniosmeses.options.selectedIndex==0))
		{alert("El plazo máximo es de 40 años.");return}
	document.form1.interes.value=new NumberFormat(document.form1.interes.value).Numero()
	//if (document.form1.aniosmeses.options[0].selected){medida = 12.0}
	if (document.form1.aniosmeses.options.selectedIndex==0){medida = 12.0}
	else{medida = 1.0}
	var nulos=0
	longitud=document.form1.length
	for (i=0;i<longitud;i++) {
		if (document.form1[i].type=="text" && document.form1[i].value==""){
			if (document.form1[i].name=="plazo"){document.form1[i].value=0}
			else{document.form1[i].value=cero}
		}
		if (document.form1[i].type=="text" && (document.form1[i].value==0 || document.form1[i].value==cero)){nulos=nulos+1}
	}
	if (nulos>1){
		if ("H"=="G")
			alert("Debe rellenar todos los campos menos el que quiera calcular.")
		else
			alert("Debes rellenar todos los campos menos el que quieras calcular.")
		return
	}
	//Calcula el plazo
	if (document.form1.plazo.value==0){
		var importeunf=new NumberFormat(document.form1.importe.value)
		importeunf=importeunf.Numero()
		var cuotaunf=new NumberFormat(document.form1.cuota.value)
		cuotaunf=cuotaunf.Numero()
		document.form1.plazo.value = Math.round(Math.log(1-(importeunf*document.form1.interes.value/(cuotaunf*1200)))/(-1*Math.log(1+document.form1.interes.value/1200)))
		var anios=document.form1.plazo.value
		var resto=document.form1.plazo.value % 12
		if (resto==0){
			document.form1.aniosmeses.options.selectedIndex=0
			document.form1.plazo.value=Math.round(document.form1.plazo.value/12)
		}
		else{document.form1.aniosmeses.options.selectedIndex=1}
		if (isNaN(document.form1.plazo.value) || isFinite(document.form1.plazo.value)==false) {
			document.form1.plazo.value=0
			alert("Imposible calcular el plazo. Alguno de los datos introducidos es erróneo o excede el límite máximo (30 años).")
		}
		else {
			if (document.form1.plazo.value>360) {
				document.form1.plazo.value=0
				alert("El plazo calculado excede del límite máximo (30 años).")
			}
		}
	}
	else {
		
		//Calcula el importe
		if (document.form1.importe.value==cero) {
			
			var cuotaunf=new NumberFormat(document.form1.cuota.value)
			cuotaunf=cuotaunf.Numero()
			var importe_calculo =new NumberFormat(cuotaunf*(1-Math.pow(1+document.form1.interes.value/1200,-document.form1.plazo.value*12))/(document.form1.interes.value/1200))
			document.form1.importe.value=importe_calculo.toFormatted()
		}
		else {
			
			//Calcula el tipo de interés	
			if (document.form1.interes.value==0) {
				imp = new NumberFormat(document.form1.importe.value).Numero()
				cuota = new NumberFormat(document.form1.cuota.value).Numero()
				plazo_meses = parseInt(document.form1.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){
					alert("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%
					alert("Resulta imposible calcular un tipo de interés, debe indicar un importe de cuota inferior.")
					return
				}
				tipo_mensual = tipo_mensual * 1200.0
				document.form1.interes.value = Math.round(tipo_mensual * 100.0) / 100.0
			}
			else {
				
				// CALCULO LA CUOTA
				
				var importeunf=new NumberFormat(document.form1.importe.value);
				
				importeunf=importeunf.Numero()
				var cuota_calculo=new NumberFormat(importeunf*(document.form1.interes.value/1200)/(1-(Math.pow(1+document.form1.interes.value/1200,-parseFloat(document.form1.plazo.value)*medida))))
				document.form1.cuota.value=cuota_calculo.toFormatted()
				
			}
		}
	}
	document.form1.interes.value=new NumberFormat(document.form1.interes.value).toFormatted()
}
			
function cuadro(enlace){
if (document.form1.importe.value==cero || document.form1.plazo.value==0 || document.form1.interes.value==cero || document.form1.cuota.value==cero) {
	if ("H"=="G")
		alert("Debe rellenar los campos y hacer el cálculo para poder generar el cuadro.")	
	else	
		alert("Debes rellenar los campos y hacer el cálculo para poder generar el cuadro.")
}
else {
	var importe=new NumberFormat(document.form1.importe.value)
	var cuota=new NumberFormat(document.form1.cuota.value)
	if (document.form1.aniosmeses.options.selectedIndex==0)
		{var aniosmeses="años"}
	else{var aniosmeses="meses"}
	var plazoc=document.form1.plazo.value
	var Rp=document.form1.interes.value.replace(/,/g,".")
	enlace.href="amortizacion.asp?marcablanca="+form1.marcablanca.value+"&Is="+importe.Numero()+"&Cp="+cuota.Numero()+"&periodos="+plazoc+"&Rp="+Rp+"&aniosmeses="+aniosmeses+"&desde="
}
}

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

}
function blanco(parametro){
	parametro.value=new NumberFormat(parametro.value).Numero()
	if (parametro.value=="0"){parametro.value=""}
}
function redondea(parametro)
	{
		
	if (isNaN(parametro.value)){alert("El dato debe ser un número.");parametro.value="0"}
	else{parametro.value=Math.round(parametro.value)}
	}		
function poner_blanco(objeto) {
	objeto.value=new NumberFormat(objeto.value).Numero()
	if (objeto.value==0) {objeto.value=""}
}

function validar(objeto){
	
	if (objeto.value==""){objeto.value=0}
	//objeto.value=new NumberFormat(objeto.value).Numero()
	objeto.value=new NumberFormat(objeto.value).toFormatted();
}

function NumberFormat(num)
{
	// member variables
	this.num;

	// external methods
	this.setNumber = setNumberNF;
	this.toFormatted = toFormattedNF;
	this.Numero = NumeroNF;
	this.setNumber((num==null) ? 0 : num);

}

function setNumberNF(num)
{
	this.num = num;
}

function toFormattedNF() {
	var n=new String(this.num)
	n=formatNumber(n,".##0,00")
	//CUANDO QUERAMOS QUITAR DECIMALES
	//n=formatNumber(n,".##0")
	return n
}

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

function formatNumber(number, format) {
	
number=number.replace(/,/g,".")
if (isNaN(number)) {
	
	alert("El dato debe ser un número.")
	number="0,00"
	return number
	}
else {if (number<0) {alert("El campo debe ser un número positivo.");number="0,00";return number}}
//  if (number - 0 != number) return null; // if number is NaN return null
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) : "";
	
// adjust decimal places by cropping or adding zeros to LHS of number
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); // round up

	// patch provided by Patti Marcoux 1999/08/06
    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"; // append zero to RHS of number
        else break;
    }
}

// adjust leading zeros
sleftEnd = strip(sleftEnd, "#"); // remove hashes from LHS of format
nleftEnd = strip(nleftEnd, separator); // remove key characters
    
while (sleftEnd.length > nleftEnd.length) {
	nleftEnd = "0" + nleftEnd; // prepend zero to LHS of number
}

// patch provided by Drew Degentesh 2001/02/07
var isNegative = (nleftEnd.length > 0 && nleftEnd.charAt(0) == "-");
if (isNegative) nleftEnd = nleftEnd.substring (1);

if (useSeparator) nleftEnd = separate(nleftEnd, separator); // add separator
var output = nleftEnd + ((nrightEnd != "") ? "," + nrightEnd : ""); // combine parts
return (isNegative ? "-" : "") + output;
}

function strip(input, chars) { // strip all characters in 'chars' from input
var output = ""; // initialise output string
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) { // format input using 'separator' to mark 000's
input = "" + input;
var output = ""; // initialise output string
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)
	}
}
//BORRAR EL COMENTARIO SI FUNCIONA EL DESFORMATEO 17/11/01
//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
	//if (dato.charAt(i)==".") {dato=dato.substr(0,i)+dato.substr(i+1)}
}
return dato
}

