// JavaScript Document

//variable función que contiene la función de calcular a llamar. 
  //TGastos es una Array bidimensional en la que cada fila tiene cuatro valores asociados a cada gasto: 
  //              columna 0: Descripción del Gasto. 
  //              columna 1: Cuantía del gasto ya sea en total o en porcentaje. 
  //              columna 2: El gasto real ya calculado y preparado para aplicar. 
  //              columna 3: Si el gasto se aplica a una vivienda de Obra Nueva (N), Segundamano (S) o a Todas (T)
  

//Gastos Compra-Venta. 
TGastosCV= new Array ()
TGastosCV [0]= new Array ('<p><b>Gastos de Compra-Venta</b></p>', '', 0, 'Titulo de la Tabla'); 
TGastosCV [1]= new Array ('IVA vivienda', '7%', 0, 'N');       //Varía Canarias, Ceuta melilla
TGastosCV [2]= new Array ('ITP (Trasmisiones Patrimoniales)', '7%', 0, 'S');   //Varía Canarias, Ceuta melilla 
TGastosCV [3]= new Array ('Actos Jurídicos Documentados', '1%', 0, 'N');    //Variable Comunidad Autonoma
TGastosCV [4]= new Array ('Notaría', 250, 0, 'T');          //Varía en función del precio de la vivienda
TGastosCV [5]= new Array ('Registro', 250, 0, 'T');         //varía en función del precio de la vivienda.
TGastosCV [6]= new Array ('Gestoría', 250, 0, 'T'); 
TGastosCV [7]= new Array ('Gastos de Compra Venta', '', 0, 'Fila para el total'); 


//Gastos Hipoteca.
var TGastosH= new Array ()
TGastosH [0]= new Array ('Gastos de Hipoteca', '', 0, 'Titulo de la Tabla'); 
TGastosH [1]= new Array ('Comisión de Apertura', '1%', 0, 'T');  //Depende del Banco. 
TGastosH [2]= new Array ('Actos jurídicos Documentados', '1%', 0, 'T');  //depende de la comunidad autonoma y del valor de responsabilidad hipotecaria (Importehipoteca *2)
TGastosH [3]= new Array ('Tasación', 250, 0, 'T');  //Depende del valor de la vivienda. 
TGastosH [4]= new Array ('Registro', 250, 0, 'T');  //Depende del valor de responsabilidad hipotecaria.  
TGastosH [5]= new Array ('Notaría', 250, 0, 'T');  //Depende del valor de responsabilidad hipotecaria.  
TGastosH [6]= new Array ('Gestoría', 200, 0, 'T'); 
TGastosH [7]= new Array ('Seguros',100, 0,'T'); 
TGastosH [8]= new Array ('Gastos Hipotecarios','', 0,'Fila para el Total'); 


// Provincias... en orden 1=Alava, 2 Andalucía... etc...

// Array para alamacenar el ITP de la compraventa de segundamano. 
var ITP = new Array(6,7,7,7,7,6,7,7,7,7,7,7,7,6,7,7,7,6,7,6);
var ArrGastos = new Array(); 

var NOTARIACV= 1;
var REGISTROCV=2;
var GESTORIACV=3;
var TASACIONH=4;
var NOTARIAH=5;
var REGISTROH=6;
var GESTORIAH=7; 

//Array para almacenar los gastos dependiendo del precio de la vivienda O el importe de la hipoteca:
//   1= PRECIO VIVIENDA o IMPORTE HIPOTECA. 
//   2= GASTOS DE NOTARIA DE LA COMPRA-VENTA
//   3= GASTOS DE REGISTRO DE LA COMPRA-VENTA
//   4= GASTOS DE GESTORIA DE LA COMPRA-VENTA
//   5= Gastos de TASACIÓN DE LA HIPOTECA
//   6= Gastos de Notaria de la HIPOTECA
//   7= Gastos de Registro de la HIPOTECA
//   8= Gastos de GESTORIA de la HIPOTECA.

ArrGastos [0] = new Array (60000 ,	412,  155,	202, 150, 551,	145,	202); 
ArrGastos [1] = new Array (66000 ,	419,  161,	202, 150, 555,	148,	202);
ArrGastos [2] = new Array (72000	, 426,  166,	223, 150,	560,	151,	202);
ArrGastos [3] = new Array (78000	, 433,  171,	223, 150,	564,	155,	202);
ArrGastos [4] = new Array (84000	, 440,  176,	223, 150,	569,	158,	223);
ArrGastos [5] = new Array (90000	, 447,  182,	244, 150,	573,	162,	223);
ArrGastos [6] = new Array (96000	, 454,  187,	244, 150,	575,	163,	223);
ArrGastos [7] = new Array (102000,	461,	192,	244, 150,	578,	164,	223);
ArrGastos [8] = new Array (108000,	468,	197,	258, 150,	580,	166,	223);
ArrGastos [9] = new Array (114000,	475,	203,	258, 150,	582,	167,	223);
ArrGastos [10] = new Array (120000,	482,	208,	265, 150,	584,	168,	244);
ArrGastos [11] = new Array (126000,	489,	213,	265, 150,	587,	170,	244);
ArrGastos [12] = new Array (132000,	496,	218,	279, 172,	589,	171,	244);
ArrGastos [13] = new Array (138000,	503,	223,	279, 172,	591,	172,	244);
ArrGastos [14] = new Array (144000,	510,	229,	279, 172,	593,	174,	244);
ArrGastos [15] = new Array (150000,	517,	234,	296, 172,	596,	175,	244);
ArrGastos [16] = new Array (156000,	520,	236,	303, 172,	598,	176,	258);
ArrGastos [17] = new Array (162000,	524,	238,	310, 172,	600,	178,	258);
ArrGastos [18] = new Array (168000,	527,	240,	317, 172,	603,	179,	258);
ArrGastos [19] = new Array (174000,	531,	242,	324, 172,	605,	180,	258);
ArrGastos [20] = new Array (180000,	534,	244,	331, 172,	607,	182,	265);
ArrGastos [21] = new Array (186000,	538,	246,	338, 172,	609,	183,	265);
ArrGastos [22] = new Array (192000,	541,	249,	345, 172,	612,	185,	265);
ArrGastos [23] = new Array (198000,	545,	251,	349, 172,	614,	186,	265);
ArrGastos [24] = new Array (204000,	548,	253,	359, 172,	615,	187,	279);
ArrGastos [25] = new Array (210000,	552,	255,	366, 172,	618,	189,	279);
ArrGastos [26] = new Array (216000,	556,	257,	366, 172,	621,	190,	279);
ArrGastos [27] = new Array (222000,	559,	259,	366, 172,	623,	191,	279);
ArrGastos [28] = new Array (228000,	562,	261,	366, 207,	625,	193,	279);
ArrGastos [29] = new Array (234000,	566,	263,	366, 207,	627,	194,	279);
ArrGastos [30] = new Array (240000,	569,	265,	366, 207,	630,	195,	296);


function DameGasto (Importe, CodGasto) {
  var i=0;
	var r=0;
	while  ((ArrGastos [i][0] < Importe) && (i < ArrGastos.length-1)) {
    i++;
	}
	r= ArrGastos[i][CodGasto];
	return r; 
}

function ActualizarGastos (ImporteH, ImporteCV, Provincia) {
	//Gastos de CompraVenta
	//Notaria: 
	TGastosCV [4][1]=DameGasto (ImporteCV, NOTARIACV); 
  //Registro: 
	TGastosCV [5][1]=DameGasto (ImporteCV, REGISTROCV); 
  //Registro: 
	TGastosCV [6][1]=DameGasto (ImporteCV, GESTORIACV); 
	
	//Gastos de Hipoteca
	//Tasación: 
	TGastosH [3][1]=DameGasto (ImporteH, TASACIONH); 
	//Notaria: 
	TGastosH [4][1]=DameGasto (ImporteH, NOTARIAH); 
  //Registro: 
	TGastosH [5][1]=DameGasto (ImporteH, REGISTROH); 
  //Registro: 
	TGastosH [6][1]=DameGasto (ImporteH, GESTORIAH); 
}


function CalculaGastos (ArrGastos, Importe, TipoVivienda) {
  //Función que pasa un Array de Gastos a un Importe determinado. 
  //ArrGastos es una Array bidimensional en la que cada fila tiene tres valores asociados a cada gasto: 
  //              columna 0: Descripción del Gasto. 
  //              columna 1: Cuantía del gasto ya sea en total o en porcentaje. 
  //              columna 2: El gasto real ya calculado y preparado para aplicar. 
  //              columna 3: Si el gasto se aplica a una vivienda de Obra Nueva (N), Segundamano (S) o a Todas (T)
  var i; 
  var Valor; 
  var Resul=0; 
  for (i=0; i < ArrGastos.length; i++) {   //Recorremos el array de gastos.
    if (ArrGastos [i][3]==TipoVivienda || ArrGastos[i][3]=='T') {
	    Valor = ArrGastos[i][1] + " ";
      if (Valor.indexOf ("%") > -1) {  //Determinamos si el gasto es un porcentaje.
	      Valor=Valor.replace ("%", "");     //Eliminamos el porcentaje del número gasto. 
	      ArrGastos[i][2]=(Math.round ( Importe * Valor))/100;      //Calculamos la cuantía real del gasto
	    } else {
	      ArrGastos[i][2]=ArrGastos[i][1];        //Si no es porcentaje es un valor fijo. 
	    }
	    Resul= parseFloat(Resul) + parseFloat (ArrGastos[i][2]);
	  }
  }
  return Resul;
}


function Calcula2(form,CampoResul) 
{ 
  var Importe = strToNum(form.iImporte.value);
  var Interes = strToNum(form.iInteres.value);
  var Plazo = strToNum(form.iPlazo.value);
  var Cuota = strToNum(form.iCuota.value);
	var Euribor=form.iEuribor.value; 
  var resul="";
	var texto="<p>La <span>Cuota a pagar</span> es de:</p>";
  switch (true) {
    case form.rTipoCalculo[0].checked:
	    resul = CalculaCuota (Importe,Interes, Plazo);
	    break; 
	  case form.rTipoCalculo[1].checked: 
	    resul = CalculaImporte (Cuota, Interes, Plazo); 
			texto = "<p>El <span>Importe de la Hipoteca</span> es de:</p>"
	    break;
	  case form.rTipoCalculo[2].checked: 
	    resul= CalculaInteres (Cuota,Importe, Plazo, Euribor);
			texto= "<p>El <span>Interés máximo</span> es de:</p>"
	    break;
	  case form.rTipoCalculo[3].checked: 
	    resul= CalculaPlazo (Cuota,Importe, Interes);
			texto= "<p>El <span>Plazo en Años</span> es de:</p>"
	    break;
  } 
  CampoResul.innerHTML= numToStr(resul);
	$("TextoResultado").innerHTML=texto; 
}

    
function CalculaCuota(importe,interes,plazo)
{
  if ((interes!="") && (importe!="") && (plazo!="")) {
    interes=interes/1200;  // el interes partido de los 12 meses y el 100 del porcentaje. 
    plazo=plazo * 12;  // el plazo en años   lo pasamos a meses.
    factor= Math.pow ((1+interes),-plazo); //la formula en cachos... calculamos una de las partes: 
    resul= (importe*interes) / (1-factor);  // La formula total.
  }
  else {
    resul=0
  }
  return resul;
}

function CalculaInteres (cuota, importe, plazo, interesInicial) {
	
	var Ij;
	var i;
  var factor1;
	var factor2;
	Ij=0; 
  i=interesInicial/1200; 	
	plazo=plazo*12;
	while (Math.abs(Ij-i) >0.000001) {
		Ij=i; 
  	factor1= 1 - Math.pow ((1+Ij), -plazo);
		factor1= (cuota/Ij) * factor1; 
		factor1= importe - factor1; 
		
		factor2= 1 - Math.pow ((1+Ij), -plazo);
		factor2= factor2/Ij;
		factor2= factor2 - (plazo * Math.pow ((1+Ij), -plazo-1))
		factor2= factor2 * cuota/Ij;
		
		i= Ij - (factor1/factor2); 
	}
  return i * 1200;
}


function CalculaPlazo (cuota, importe, interes) {
  var r=0;
  if ((interes!="") && (importe!="") && (cuota!="")) {
        interes=interes/1200;  // el interes partido de los 12 meses y el 100 del porcentaje. (interes mensual)
		factor1=(importe*interes)/cuota;    // Hay que calcular la formula poco a poco y por partes.
		if (factor1 < 1) {
 		  factor1=1 - factor1;               // la formula sería tal que así: Plazo= log(1-((importe*interes)/cuota))/log(1+interes)
		  factor1=Math.log (factor1);        //  estando el "interes" normalizado es decir dividido por 12 meses y por 100. 
		  factor2=Math.log (1 + interes);        //el plazo se calcularia en meses, lo pasamos en años y...
		  r=Math.round (Math.abs(factor1/factor2)/12);  // ... le quitamos el negativo (cosas de los logaritmos...)
		} else r='Plazo Infinito'; 
  }
  return r;
}
 
function CalculaImporte(cuota,interes,plazo) 
{
  if ((interes!="") && (cuota!="") && (plazo!="")) {
    interes=interes/1200;  // el interes partido de los 12 meses y el 100 del porcentaje. 
    plazo=plazo * 12;  // el plazo en años   lo pasamos a meses.
    factor= Math.pow ((1+interes),-plazo); //la formula en cachos... calculamos una de las partes: 
    resul= cuota * (1-factor)/interes;  // La formula total.
  }
  else {
    resul=0
  }
  return resul; // Redondeo para dos decimales. 
}

function Invertir (Cadena) {
  var resul="";
  var CadLocal=Cadena.substr (0,Cadena.length-1);
  var UltCaracter=Cadena.substr (Cadena.length-1,1);
  if (Cadena.length ==1) { 
    resul=Cadena; 
  } else {
    resul= UltCaracter + Invertir (CadLocal); 
  }
  return resul;
}

function strToNum (str) {
//pasa un número formateado en string a un número. 

  var resul="";
  resul = str.replace (/\./g,"");   //quitamos los puntos de miles.
  resul = resul.replace (",","."); // cambiamos la coma decimal por un punto. A estudiar dependiendo de la versión de internet explorer. 
  resul = parseFloat(resul);
  return resul;  //devolvemos el valor con el tipo float. 
}



function numToStr (Num) {
//un numero lo formatea a Cadena. 
  var r="";                      
  
  r=String (Math.round (Num*100) /100);  //dejamos solo dos decimales. 
  r=r.replace (".",",");   //Cambios el punto decimal por la coma decimal.
  r=r.split (",");        //Recogemos la parte entera. 
  r[0]=Invertir(r[0]);     //le damos la vuelta a la parte entera para ponerles los puntos. 
  r[0]=r[0].replace(/(\d\d\d)/g, "$1.");  //le ponemos los puntos empezando por la izquierda. 
  r[0]=r[0].replace ( /\.$/,"");          //  y quitamos el último caracter si es un punto.
  if (!isNaN (r[1])) {
    r[1]="," + r[1];
  } else {
    r[1]="";
  }
  return Invertir(r[0]) + r[1];     // Finalmente devolvemos a dar la vuelta a la parte entera y la pegamos a la decimal. 
}
	
function SumaGastos(Tabla, TV, Porcentaje) {
	//TV es tipo de vivienda: segunda mano, obra nueva 
	//Porcentaje es un 1 si hay que sumar los porcentajes y 0 si no es así.  
  var i=0; 
  var r=0; 
  var Valor=0;
  for (i=0; i < Tabla.length; i++) {
	  Valor = String (Tabla[i][1]); 
    if (((Valor.indexOf ("%")>0)==Porcentaje) && ((Tabla[i][3] == TV)|| (Tabla[i][3] == 'T'))) {
	    r+=parseFloat (Valor); 
	  }
  }
  return r; 
}


function ImporteNeto (ImporteTotal,TipoVivienda) {
	var SGF=0; //Suma de Gastos vijos. 
	var SP=0; // Suma de Porcentajes. 
	var r=0;
	SGF=SumaGastos (TGastosCV,TipoVivienda,false) + SumaGastos (TGastosH, TipoVivienda, false); 
	SP= (SumaGastos (TGastosCV,TipoVivienda,true) + SumaGastos (TGastosH, TipoVivienda, true))/100; 
	
	r= (ImporteTotal -SGF) / (1+ SP); 
	
	return r;
}


function GastosTotales (Importe,TipoVivienda) {
	var SGF=0; //Suma de Gastos vijos. 
	var SP=0; // Suma de Porcentajes. 
	var r=0;
	SGF=SumaGastos (TGastosCV,TipoVivienda,false) + SumaGastos (TGastosH, TipoVivienda, false); 
	SP= (SumaGastos (TGastosCV,TipoVivienda,true) + SumaGastos (TGastosH, TipoVivienda, true))/100; 
	
	r= SGF + (Importe * SP); 
	
	return r;
}

