function esiPrestacaoCH(vTaxaNominal, bCalculaAuto){
	this.montante = 0;
	this.montanteMin = 0;	
	this.montanteMax = 0;
	this.prazo = 0;
	this.prazoMin = 0;
	this.prazoMax = 0;
	this.prestacao = 0;
	this.prestacaoMin = 0;
	this.prestacaoMax = 0;
	this.numPrestacoesAno = 12;
	this.montanteTemp = 0;
	this.prazoTemp = 0;
	this.prestacaoTemp = 0;
	this.bonificacao = 0.0;
	this.spread = 0.0;
	this.taxaBase = 0.0;
	this.racioFixo = 0.0;
	this.taxaNominal = vTaxaNominal;
	this.calcula = bCalculaAuto;
	this.utilizaSpread = false;
	
	this.arrSpreadValor;
	this.arrSpreadMontante;
	this.arrSpreadRacio;

	this.CalculaAuto = function (bCalculaA) {
		this.calcula = bCalculaA;
	}

	this.InitMontante = function (vCur, vMin, vMax) {
		this.montante = vCur;
		this.montanteMin = vMin;
		this.montanteMax = vMax;
	}

	this.InitPrazo = function (vCur, vMin, vMax) {
		this.prazo = vCur;
		this.prazoMin = vMin;
		this.prazoMax = vMax;
	}
	
	this.InitPrestacao = function (vCur, vMin, vMax) {
		this.prestacao = vCur;
		this.prestacaoMin = vMin;
		this.prestacaoMax = vMax;
	}
	
	this.InitArraysSpread = function (aSpreadValor, aSpreadMontante, aSpreadRacio) {
		this.arrSpreadValor = aSpreadValor;
		this.arrSpreadMontante = aSpreadMontante;
		this.arrSpreadRacio = aSpreadRacio;
		this.utilizaSpread = true;
	}
	
	this.InitTaxaBase = function (vTaxaBase) {
		this.taxaBase = vTaxaBase;
	}
	
	this.InitSpread = function (vSpread) {
		this.spread = vSpread;
	}
	
	this.InitRacioFixo = function (vRacioFixo) {
		this.racioFixo = vRacioFixo;
	}
	
	this.InitBonificacao = function (vBonificacao) {
		this.bonificacao = vBonificacao;
	}

	this.Montante = function() {
		if (arguments.length == 0) 
			return this.montante;
		else
		{
            this.GuardaValores();
            this.montante = arguments[0];
			if (this.calcula) this.CalculaPrestacao();
			this.ValidaValores();
        }
	}

	this.Prazo = function() {
		if (arguments.length == 0) 
			return this.prazo;
		else
		{
            this.GuardaValores();
            this.prazo = arguments[0];
			if (this.calcula) this.CalculaPrestacao();
			this.ValidaValores();
        }
	}
	
	this.Prestacao = function() {
		if (arguments.length == 0) 
			return this.prestacao;
		else
		{
            this.GuardaValores();
            this.prestacao = arguments[0];
			if (this.calcula) this.CalculaMontante();
			this.ValidaValores();
        }
	}
	
	this.GuardaValores = function () {
		this.montanteTemp = this.montante;
		this.prazoTemp = this.prazo;
	}
  
	this.ValidaValores = function () {
		if ( (this.montante > this.montanteMax || this.montante < this.montanteMin) ||
			 (this.prazo > this.prazoMax || this.prazo < this.prazoMin))
		{
			this.montante = this.montanteTemp;
			this.prazo = this.prazoTemp;
		}
	}
	
	this.Spread = function () {
		if (this.utilizaSpread){
			var index;
			var sizeArray = this.arrSpreadValor.length;

			for (index = (sizeArray - 1); index >= 0; index--)
				if (this.Montante() > parseFloat(this.arrSpreadMontante[index])) break;

			for (; index >= 0; index--)
				if (this.racioFixo >= this.arrSpreadRacio[index]) break;

			this.spread = this.arrSpreadValor[index];
		}

		return this.spread;
	}
	
	this.TaxaNominal = function () {
		if (this.utilizaSpread){
			//alert("this.taxaBase: " + this.taxaBase + "   ;   this.Spread(): " + this.Spread());
			return (this.taxaBase + this.Spread() - this.bonificacao);
		}
		else
			return this.taxaNominal;
	}
	
	this.CalculaPrestacao = function () {
		var resultado = 0;
		var taxaNominalPer;
		var prazo;
		var quociente = -1;
		var tempDenom = -1;

		taxaNominalPer = this.TaxaNominal() / this.numPrestacoesAno;

        prazo = this.prazo * 12;
      
		quociente = this.montante * (taxaNominalPer * Math.pow(1 + taxaNominalPer, prazo));
		tempDenom = Math.pow(1 + taxaNominalPer, prazo)-1;
		resultado = quociente / tempDenom;
      
        this.prestacao = Math.round(resultado);
	}
	
	this.CalculaPrestacaoMinima = function () {
		var resultado = 0;
		var taxaNominalPer;
		var prazo;
		var quociente = -1;
		var tempDenom = -1;
        
		taxaNominalPer = this.TaxaNominal() / this.numPrestacoesAno;

        prazo = this.prazo * 12;
      
		resultado = this.montante * taxaNominalPer;
      
        this.prestacao = Math.round(resultado);
	}
	
	this.CalculaMontante = function () {
		var resultado = 0;
		var taxaNominalPer;
		var prazo;
		var quociente = -1;
		var tempDenom = -1;
		
		taxaNominalPer = this.TaxaNominal() / this.numPrestacoesAno;

        prazo = this.prazo * 12;

		quociente = this.prestacao * (Math.pow(1 + taxaNominalPer, prazo)-1);
		tempDenom = taxaNominalPer * Math.pow(1 + taxaNominalPer, prazo);
		resultado = quociente / tempDenom;

        if (resultado > this.montanteMax)
        {
			resultado = this.montanteMax;
			this.montante = Math.round(resultado);
			this.CalculaPrestacao();
		}	
		else
			this.montante = Math.round(resultado);
	}
	
}

