/***
Archivo utilizado para calculos de los simuladores BCI-EMOL
Autor: Sebastián Rivas, Leonardo Soto - Imagemaker IT (http://www.imagemaker.cl/)
       

Dependencies: MochiKit (http://www.mochikit.com/)
              UI4W (http://ui4w.sourceforge.net/)

***/

/**
 * VARIABLES GENERALES - Usadas por más de un simulador
 */

/**
 * El valor de la UF
 */
var UF = 18400;
/**
 * Define el número de decimales que utilizará la aplicación
 */
var numero_decimales = 4;

/**
 * FUNCIONES GENERALES - Usadas por más de un simulador
 */

/**
 * Inicialmente se pensaba en abrir un pop-up con una dirección del banco al presionar sobre el banner.
 * Posteriormente se cambió dado que quitaron el botón de contactenos del BCI. Ahora cada banner en realidad hace submit del formulario para ir al php
 */
function abrirBanner(){
    /*
    var URL_banner = 'http://www.bci.cl/personas/novedades/3x3_act.html';
    window.open(URL_banner,'Bci','width=800,height=600,location=1,scrollbars=1,menubar=1,resizable=1,toolbar=1');
    //dependent,directories,fullscreen,location,menubar,resizable,scrollbars,status,toolbar
    */
    //CAMBIO PARA HACER SUBMIT DEL FORMULARIO
    $('formulario').submit();
}

/**
 * Cambia los valores del slider especificado, seteando un mínimo y máximo
 * Se optó por hacer una función porque probablemente cambie el API de los slider
 */
function cambiaValoresMinimoYMaximoDelSlider(minimo, maximo,idSlider){
        w$(idSlider).valueMapperFunctions = UI.Slider.ValueMappers.range(minimo, maximo);
        w$(idSlider).steps = maximo - minimo + 1;
        w$(idSlider).setValue(minimo);
}
/**
 * Cambia los valores del slider especificado, seteando un mínimo y máximo y seteando un valor actual
 * Se optó por hacer una función porque probablemente cambie el API de los slider
 */

function cambiaValoresMinimoYMaximoDelSliderConMontoEspecifico(minimo, maximo,idSlider,montoAPoner){
        cambiaValoresMinimoYMaximoDelSlider(minimo, maximo,idSlider);
        w$(idSlider).setValue(montoAPoner);
}

/**
 * Cambia los valores del slider especificado, valores específicos que puede tomar el slider
 * Se optó por hacer una función porque probablemente cambie el API de los slider
 */
function cambiaValoresEspecificosDelSlider(arreglo,idSlider){
        w$(idSlider).valueMapperFunctions = UI.Slider.ValueMappers.values.apply(UI.Slider.ValueMappers, arreglo)
        w$(idSlider).steps = arreglo.length;
        w$(idSlider).setValue(parseFloat(arreglo[0]));
}

/**
 * Cambia los valores del select especificado, seteando los valores del arreglo con nombre igual al valor
 */
function cambiaValoresDelSelect(arreglo,idSelect){
    var combo = $(idSelect);
    while(combo.options.length >0){
        combo.options[0] = null;
    }
    for(var i=0 ;i<arreglo.length;i++){
        combo.options[i] = new Option(arreglo[i],arreglo[i]);
    }
}

/**
 * Reposiciona la ventana (idVentana) de manera de que aparezca "sobre" y a la "derecha" de una imágen dada
 * En realidad reposiciona el primer objeto respecto del segundo
 */
function muestraObservaciones(idVentana, idImagenCercana){
    showElement(idVentana);
    var dim  = elementDimensions(idVentana);
    var pos = elementPosition(idImagenCercana);
    setElementPosition(idVentana,elementPosition(idVentana));
    
    pos.x += 10;
    pos.y -= dim.h;
    setElementPosition(idVentana,pos);
}

/**
 * Dado un número, retorna "$ número_formateado"
 */ 
function parseMoneda(monto){
    return "$ " + parseNumero(""+monto);
}
/**
 * Inverso de parseMoneda
 * Dado un string de la forma "$ número_formateado" retorna el número
 */ 
function unParseMoneda(moneda){
    var moneda = moneda.toString();
    if(moneda.indexOf('$')>=0){
        return unParseNumero(trim(moneda.substring(moneda.indexOf('$')+1)));
    }
    return unParseNumero(trim(moneda));
}

/**
 * Dado un número, retorna "UF número_formateado"
 */ 
function parseUF(monto){
    return "UF " + parseNumero(redondeaNumeroANDecimales(monto.toString(),numero_decimales));
}
/**
 * Inverso de parseUF
 * Dado un string de la forma "UF número_formateado" retorna el número
 */ 
function unParseUF(moneda){
    var moneda = moneda.toString();
    if(moneda.indexOf('UF')>=0){
        return unParseNumero(trim(moneda.substring(moneda.indexOf('UF')+3)));
    }
    return unParseNumero(trim(moneda));
}



/**
 * Dado un número retorna "número_formateado%"
 */
function parsePorcentaje(monto){
    return parseNumero(redondeaNumeroANDecimales(monto,numero_decimales)) + "%";
}
/**
 * Inverso de parseUF
 * Dado un string de la forma "número_formateado%" retorna el número
 */ 
function unParsePorcentaje(moneda){
    return unParseNumero(trim(moneda.substring(0,moneda.length-1)));
}

/**
 * Esta función redondéa el número a N decimales, 
 * por ejemplo redondeaNumeroANDecimales(9.7529,3) retorna 9.753
 */
function redondeaNumeroANDecimales(numero,decimal){
    return Math.round(numero * Math.pow(10,decimal))/ Math.pow(10,decimal);
}

/**
 * Pone el separador "." de miles
 * ej: 123456789 retorna 123.456.789
 */
function poneSeparadorDeMiles(monto){
    var signo = monto<0 ? "-" : "";
    var monto = Math.abs(monto).toString();
    if(monto.toString().length <= 3)
        return signo + monto.toString();
    return signo + poneSeparadorDeMiles(monto.substring(0,monto.length-3)) + "." + monto.substring(monto.length-3);
}

/**
 * Quita el separador "." de miles
 * ej: 123.456.789 retorna 123456789
 */
function quitaSeparadorDeMiles(numero_con_puntos){
    var numero = parseFloat(numero_con_puntos.split('.').join(''));
    if(!isNaN(numero))
        return numero;
    return 0;   
}

/**
 * Pone los separadores de miles y decimales al número
 * ej: 123456789,132456 retorna 123.456.789,132456
 */
function parseNumero(monto){
    if(monto==0) return "0";
    //Si el número no tiene decimales simplemente retorno el número con separador de miles
    if(monto.toString().split('.').length < 2)
        return poneSeparadorDeMiles(monto);
    //Sino, separo los decimales y se los agrego al final   
    return poneSeparadorDeMiles(Math.floor(monto)) + "," +monto.toString().split('.')[1];
}

/**
 * Quita los separadores de miles y decimales al número
 * ej: 123.456.789,132456 retorna 123456789,132456
 */
function unParseNumero(numero){
    var numero_separado = numero.split(',');
    //Si el número no tiene decimales simplemente quito los separadores de miles
    if(numero_separado.length < 2){
        return quitaSeparadorDeMiles(numero_separado[0]);
    }
    //Sino, separo los decimales, se los agrego al final y devuelvo el float.
    return parseFloat(quitaSeparadorDeMiles(numero_separado[0]) + "." + numero_separado[1]);
}

/**
 * Devuelve lo mismo que la funcion PAGO(tasa,nper,va) de excel
 */
function pago(tasa, meses, montoFinanciamiento){
    return montoFinanciamiento * ((tasa*Math.pow(1+tasa, meses))/(Math.pow(1+tasa, meses)-1));
}

/**
 * Una especie de inversa de pago, en que esta vez le paso la cuota y me entrega el VA
 */
function pago_inverso(tasa,nper,c){
    return c / ((tasa*Math.pow(1+tasa,nper))/(Math.pow(1+tasa,nper)-1));
}

/**
 * Función que dado un string quita los espacios en blanco al principio y al final y retorna el nuevo string
 */
function trim(str){
    while(''+str.charAt(0)==' ')
        str=str.substring(1,str.length);
    while(''+str.charAt(str.length-1)==' ')
        str=str.substring(0,str.length-1);
    return str;
}



/**
 * FUNCIONES DE SIMULADOR DE CRÉDITO AUTOMOTRIZ
 */
//Número de Cuotas de Crédito Automotriz
var numero_cuotas_automotriz = 24;
/**
 * Funcion que se utiliza en el simulador de crédito automotriz, obtenida a partir de 'Simulador bci auto soñado.xls'
 * Recibe el monto (int) del vehículo y la tasa porcentual (entre 0 y 100, float) con la que se debe calcular el 
 * valor de sus cuotas
 * Retorna un arreglo con el valor_cuota (de la forma $ xxx.xxx) en arreglo[0] 
 * y valor_futuro_garantizado (de la forma $ xxx.xxx) en arreglo[1] 
 */
function getCuotaSimuladorAutomotriz(monto, tasaPorcentual){    
    var mon= monto;
    var tasa = tasaPorcentual/100.0;
    var nper = numero_cuotas_automotriz;
    var va = mon/0.97662;    // monto del credito con el seguro de desgravamen
    var balloon = mon*0.6;
    
    var ball_1;
    ball_1 = calculaBal(mon, balloon);

    var cuota;  
    cuota = (va - ball_1) * (tasa * Math.pow((1 + tasa), nper)) / (Math.pow((1 +    tasa), nper) - 1);
       
    var arreglo = new Array(2);
    arreglo[0] = parseMoneda(Math.round(cuota));
    arreglo[1] = parseMoneda(monto - balloon);
    return arreglo;
}

/**
 * Funcion utilizada en getCuotaSimuladorAutomotriz(monto) para calcular el desarrollo del balloon
 * Recibe 2 int y 
 * Retorna un int
 */
function calculaBal(monto, balloon){
    if (monto < 350000) {
        return (balloon/1.76371592665308);
    }
    else if (monto < 500000) {
        return (balloon/1.51285240027106);
    }
    else if (monto < 800000) {
        return (balloon/1.51285240027106);
    }
    else if (monto < 1500000) {
        return (balloon/1.2742681735085);
    }
    else if (monto < 3000000) {
        return (balloon/1.26077386058329);
    }
    else if (monto < 4000000) {
        return (balloon/1.24824739948546);
    }
    else if (monto < 5000000) {
        return (balloon/1.24824739948546);
    }
    else {
        return (balloon/1.24409848209239);
    }
}

/**
 * FUNCIONES DE SIMULADOR DE CRÉDITO DE CONSUMO
 */
var impuesto_credito = 1.01608;

function getMontoSimuladorCreditoConsumo(plazo, cuota, tasaMensual){
    var factor = 1/tasaMensual
    var factor2 = 1/(tasaMensual*(Math.pow(tasaMensual+1, plazo)))
    factor = factor - factor2

    var montoCredito = cuota * factor
    var monto =  montoCredito / impuesto_credito

    var cuota = montoCredito / factor

    var arreglo = [];
    arreglo[0] =  parseMoneda(parseInt(cuota));
    arreglo[1] =  parseMoneda(parseInt(montoCredito));
    return arreglo;
}
 


function getCuotaSimuladorCreditoConsumo(plazo, monto, tasaMensual){

    
    var factor = 1/tasaMensual

    var factor2 = 1/(tasaMensual*(Math.pow(tasaMensual+1, plazo)))
        
    factor = factor - factor2

    var montoCredito = impuesto_credito * monto
    var cuota = montoCredito / factor




    var arreglo = [];
    arreglo[0] =  parseMoneda(parseInt(cuota));
    arreglo[1] =  parseMoneda(parseInt(montoCredito));
    return arreglo;
}
 

/**
 * FUNCIONES DE SIMULADOR DE CRÉDITO HIPOTECARIO POR VALOR DE PROPIEDAD
 */
//Tasa de interes de créditos hipotecarios
var interes_CHIP = 4.7; //En %, considerando interés anual
/**
 *Función que se utiliza en el simulador de crédito hipotecario por valor de la propiedad para calcular la cuota mensual
 *@param tipo_propiedad, puede ser 'casa', 'departamento' o 'terreno'
 *@param tipo_moneda_valor_propiedad, puede ser: 'UF' o 'Pesos'
 *@param tipo_moneda_pie, puede ser: 'UF' o 'Pesos'
 *@return un Array en que indica la cuota mensual en UF (Array[0] de la forma 'UF xxx.xxx') y Pesos (Array[1] de la forma '$ xxx.xxx')
*/
//function getCuotaSimuladorHipotecarioPorValorPropiedad(tipo_propiedad, valor_propiedad, tipo_moneda_valor_propiedad, pie, tipo_moneda_pie, plazo){

function getCuotaSimuladorHipotecarioPorValorPropiedad(tipo_propiedad, moneda, plazo, monto, tasaMensual, montoPropiedad, pie){
    var valor_propiedad_uf = moneda=="UF" ? parseFloat(montoPropiedad) : parseFloat(montoPropiedad)/UF;
    var pie_uf = moneda=="UF" ? parseFloat(pie) : parseFloat(pie)/UF;
    var va = moneda=="UF" ? parseFloat(monto) : parseFloat(monto)/UF;

    if(va <= 0){
        var arreglo = new Array(2);
        arreglo[0] = '0';
        arreglo[1] = '0';
        arreglo[2] = '0';
        arreglo[3] = '0';
        return arreglo;         
    }
    
    var tasa = Math.pow(1+(tasaMensual/100),1/12) - 1;
    var nper = plazo * 12;
    
    var cuota = pago(tasa,nper,va);
    //cuota += getValorSeguroDegravamenHipotecario(va);
    //cuota += getValorSegurosIncendioYSismoHipotecario(valor_propiedad_uf, tipo_propiedad);
    
    var arreglo = new Array(2);
    arreglo[0] = parseUF(redondeaNumeroANDecimales(cuota,numero_decimales));
    arreglo[1] = parseMoneda(parseInt(cuota * UF,0));
    arreglo[2] = parseUF(valor_propiedad_uf - pie_uf);
    arreglo[3] = parsePorcentaje(((valor_propiedad_uf - pie_uf)/valor_propiedad_uf) *100);
    return arreglo;
}
    
/**
 *Función que se utiliza en getCuotaSimuladorHipotecarioPorValorPropiedad para calcular el valor del seguro de degravamen
 *@param monto_credito_uf, el monto del crédito en UF
 *@return el valor del seguro
 *IMPORTANTE: Supongo que el número de asegurados es 1
*/
function getValorSeguroDegravamenHipotecario(monto_credito_uf){
    return monto_credito_uf * 0.00029;
}

/**
 *Función que se utiliza en getCuotaSimuladorHipotecarioPorValorPropiedad para calcular el valor del seguro de incendio y sismo
 *@param valor_propiedad_uf, el valor de la propiedad en UF
 *@param tipo_propiedad, puede ser 'casa', 'departamento' o 'terreno'
 *@return el valor del seguro
*/
function getValorSegurosIncendioYSismoHipotecario(valor_propiedad_uf, tipo_propiedad){
    var factor; 
    if(tipo_propiedad == 'casa'){
        factor = 0.6;
    }
    else if(tipo_propiedad == 'departamento'){
        factor = 0.9;
    }
    else{
        factor = 0;
    }
    return 0.0003 * valor_propiedad_uf * factor;
}

/**
 *Función que se utiliza en el simulador de crédito hipotecario por valor de la propiedad para calcular el monto a financiar
 *@return un Array en que indica el monto en UF (Array[0]), Pesos (Array[1]) y en Porcentaje(Array[2])
 *@param tipo_moneda_valor_propiedad, puede ser: 'UF' o 'Pesos'
 *@param tipo_moneda_pie, puede ser: 'UF' o 'Pesos'
*/
function getMontoAFinanciarSimuladorHipotecarioPorValorPropiedad(valor_propiedad, tipo_moneda_valor_propiedad, pie, tipo_moneda_pie){
    var valor_propiedad_uf = tipo_moneda_valor_propiedad=="UF" ? parseFloat(valor_propiedad) : parseFloat(valor_propiedad)/UF;
    var pie_uf = tipo_moneda_pie=="UF" ? parseFloat(pie) : parseFloat(pie)/UF;

    var arreglo = new Array(3);
    arreglo[0] = parseUF(Math.round(valor_propiedad_uf - pie_uf));
    arreglo[1] = parseMoneda((valor_propiedad_uf - pie_uf)*UF);
    arreglo[2] = parsePorcentaje(((valor_propiedad_uf - pie_uf)/valor_propiedad_uf) *100);
    return arreglo;
}
    
/**
 * FUNCIONES DE SIMULADOR DE CRÉDITO HIPOTECARIO POR VALOR DE LA CUOTA
 */ 
/**
 *Función que se utiliza en el simulador de crédito hipotecario por valor de la cuota mensual para calcular el valor de la propiedad a financiar
 *@return un Array en que indica el valor de la propiedad en UF (Array[0]) y Pesos (Array[1])
 *@param tipo_propiedad, puede ser 'casa', 'departamento' o 'terreno'
 *@param tipo_moneda_valor_propiedad, puede ser: 'UF' o 'Pesos'
 *@param tipo_moneda_pie, puede ser: 'UF' o 'Pesos'
*/
function getCuotaSimuladorHipotecarioPorValorCuota(tipo_propiedad, valor_cuota, moneda, pie, plazo, tasaMensual){
    var valor_cuota_uf = moneda == 'UF' ? valor_cuota : valor_cuota/UF;
    var pie_uf = moneda == 'UF' ? pie : pie/UF;
    
    var monto_en_uf = 0; 

    var i = Math.pow(1+(tasaMensual/100),1/12) -1
    var n = plazo * 12;
    var dividendo = valor_cuota_uf;
    var valor_propiedad = dividendo / ( (i*Math.pow(1+i,n)) / (Math.pow(1+i,n)-1)) + pie;
    
    var arreglo = new Array(2);
    arreglo[0] = parseUF(redondeaNumeroANDecimales(valor_propiedad,2));
    arreglo[1] = parseMoneda(Math.round(valor_propiedad*UF));
    arreglo[2] = parseUF(valor_propiedad - pie_uf);
    arreglo[3] = parsePorcentaje(((valor_propiedad - pie_uf)/valor_propiedad) *100);
    return arreglo;
}
    
//Base en la cual están expresadas las tasas, por ejemplo mensual=30, anual=360
var base = 30; 

/**
 *Función que se utiliza en el simulador de depósito a plazo para calcular el monto a obtener en un depósito
 *@param tipo_deposito, puede ser 'PlazoFijo' o 'Renovable'
 *@param moneda, puede ser: 'UF' o 'Pesos'
 *@return un Array en que indica el monto (Array[0]), montoFinal (Array[1])
*/
function getMontoFinalSimuladorDAP(tipo_deposito, moneda, plazoEnDias, monto, tasaAnual) {
    
    // C(1 + R)^360 = C(1+tasaAnual)
    // R = (1 + tasaAnual)^(1/360) - 1
    
    var rentabilidad = Math.pow(1 + tasaAnual, 1/360.0) - 1;
    var montoFinal = parseInt(monto * Math.pow(1 + rentabilidad, plazoEnDias));
    var arreglo = [];
    arreglo[0] =  moneda == 'UF' ? parseUF(monto) : parseMoneda(monto);
    arreglo[1] = moneda == 'UF' ? parseUF(montoFinal) : parseMoneda(montoFinal);
    return arreglo;
}

/**
 *Función que se utiliza en getMontoFinalSimuladorDAP para calcular la rentabilidad del DAP
 *@param tipo_deposito, puede ser 'PlazoFijo' o 'Renovable'
 *@param moneda, puede ser: 'UF' o 'Pesos'
 *@return float rentabilidad
*/
function getRentabilidadDAP(tipo_deposito, moneda, plazo, monto){
    var rango_monto;
    var rango_plazo;
    if(moneda=='Pesos'){
        if(monto>=1000000 && monto<=3000000){
         rango_monto = '1.000.000-3.000.000';
        }
        else if(monto>=3000001 && monto<=5000000){
         rango_monto = '3.000.001-5.000.000';       
        }
        else if(monto>=5000001 && monto<=15000000){
         rango_monto = '5.000.001-15.000.000';
        }
        else if(monto>=15000001 && monto<=30000000){
         rango_monto = '15.000.001-30.000.000';
        }
        else if(monto>=30000001){
         rango_monto = '30.000.001 o mas';
        }
        
        if(plazo>=30 && plazo<=35)
         rango_plazo = '30-35';
        else if(plazo>=36 && plazo<=55)
         rango_plazo = '36-55';
        else if(plazo>=56 && plazo<=61)
         rango_plazo = '56-61';
        else if(plazo>=62 && plazo<=75)
         rango_plazo = '62-75';
        else if(plazo>=76 && plazo<=120)
         rango_plazo = '76-120';
        else if(plazo>=121 && plazo<=131)
         rango_plazo = '121-131';
        else if(plazo>=132 && plazo<=200)
         rango_plazo = '132-200';
        else if(plazo>=201 && plazo<=280)
         rango_plazo = '201-280';
        else if(plazo>=281 && plazo<=360)
         rango_plazo = '281-360';
        else if(plazo>=281 && plazo<=360)
         rango_plazo = '281-360';
        else if(plazo>=361 && plazo<=400)
         rango_plazo = '361-400';
    }
    else if(moneda=='UF'){
        if(plazo>=90 && plazo<=100){
         rango_plazo = '90-100';
        }
        else if(plazo>=101 && plazo<=110){
         rango_plazo = '101-110';
        }
        else if(plazo>=111 && plazo<=119){
         rango_plazo = '111-119';
        }
        else if(plazo>=120 && plazo<=130){
         rango_plazo = '120-130';
        }
        else if(plazo>=131 && plazo<=150){
         rango_plazo = '131-150';
        }
        else if(plazo>=151 && plazo<=179){
         rango_plazo = '151-179';
        }
        else if(plazo>=180 && plazo<=269){
         rango_plazo = '180-269';
        }
        else if(plazo>=270 && plazo<=300){
         rango_plazo = '270-300';
        }
        else if(plazo>=301 && plazo<=360){
         rango_plazo = '360';
        }           
        else if(plazo>=361){
         rango_plazo = '380';
        }
        
        if(monto>=60 && monto<=180)
         rango_monto = '60-180';
        else if(monto>=181 && monto<=300)
         rango_monto = '181-300';
        else if(monto>=301 && monto<=1500)
         rango_monto = '301-1.500';
        else if(monto>=1501 && monto<=3000)
         rango_monto = '1.501-3.000';
        else if(monto>=3001)
         rango_monto = '3.001 o mas';
    }
    
    if(existeLlave(moneda,rango_monto,rango_plazo))
        return tasas_captacion_DAP[moneda][rango_monto][rango_plazo];;
    return 0;   
    
}

/**
 *Función que se utiliza en getRentabilidadDAP para chequear si existe tasas_captacion_DAP[moneda][rango_monto][rango_plazo]
 *@return true si existe, false si no
 */
function existeLlave(moneda,rango_monto,rango_plazo){
    return (moneda in tasas_captacion_DAP) && 
           (rango_monto in tasas_captacion_DAP[moneda]) && 
           (rango_plazo in tasas_captacion_DAP[moneda][rango_monto]);
}


/**
 * FUNCIONES DE SIMULADOR UNIVERSITARIO
 */
/**
 *Funcion utilizada en el simulador Universitario y que se encarga de leer todas las carreras existentes y devolverlas en un arreglo
 *@return un Array de Array's que indican el nombre de la opcion (elemento[0]) y el value (elemento[1]);
 *@param tipo_deposito, puede ser 'PlazoFijo' o 'Renovable'
 *@param moneda, puede ser: 'UF' o 'Pesos'
*/
function getCarrerasSimuladorUniversitario(){
    var arreglo = new Array();
    var llaves = keys(carreras_y_maximo);
    for(var i=0; i<llaves.length; i++){
        var opcion = new Array(2);
        opcion[0] = carreras_y_maximo[llaves[i]][0];
        opcion[1] =  "" + (i+1);
        arreglo[i] = opcion;
    }
    
    return arreglo;
}

//Tabla asociativa con el identificador de cada carrera, que contiene un arreglo con los nombres de las carreras, monto maximo del crédito (UF) y duración de la carrera.
var carreras_y_maximo = {
 '1': new Array('Administración  Pública',368.428,4), 
 '2': new Array('Agronomía',368.428,4), 
 '3': new Array('Arquitectura',368.428,4), 
 '4': new Array('Bibliotecología',223.2897,3), 
 '5': new Array('Biología Marina',167.4673,2), 
 '6': new Array('Biología y Química',368.428,4), 
 '7': new Array('Bioquímica',223.2897,3), 
 '8': new Array('Comunicación Audiovisual',223.2897,3), 
 '9': new Array('Construcción Civil',368.428,4), 
 '10': new Array('Contador Auditor',368.428,4), 
 '11': new Array('Derecho',491.2372,5), 
 '12': new Array('Diseño / Publicidad',223.2897,3), 
 '13': new Array('Educación Diferencial',223.2897,3), 
 '14': new Array('Educación Parvularia',111.6448,1), 
 '15': new Array('Enfermería',368.428,4), 
 '16': new Array('Fonoaudiología',223.2897,3), 
 '17': new Array('Geografía',223.2897,3), 
 '18': new Array('Geología',859.6652,8), 
 '19': new Array('Ingeniería Civil',614.0466,6), 
 '20': new Array('Ingeniería Civil Computación',614.0466,6), 
 '21': new Array('Ingeniería Civil en Minas',736.8559,7), 
 '22': new Array('Ingeniería Civil en Obras Civiles',491.2372,5), 
 '23': new Array('Ingeniería Civil Mecánica y Metalmecánica',491.2372,5), 
 '24': new Array('Ingeniería Civil Química',491.2372,5), 
 '25': new Array('Ingeniería Civil y menciones',614.0466,6), 
 '26': new Array('Ingeniería Comercial',491.2372,5), 
 '27': new Array('Ingeniería Construcción',491.2372,5), 
 '28': new Array('Ingeniería Eléctrica',736.8559,7), 
 '29': new Array('Ingeniería Electrónica',614.0466,6), 
 '30': new Array('Ingeniería en Alimentos',223.2897,3), 
 '31': new Array('Ingeniería en ejecución (Inacap, Duoc y campus)',223.2897,3), 
 '32': new Array('Ingeniería En Información y Control de Gestión',614.0466,6), 
 '33': new Array('Ingeniería Forestal',368.428,4), 
 '34': new Array('Kinesiología y Terapia Ocupacional',223.2897,3), 
 '35': new Array('Licenciatura en Artes',223.2897,3), 
 '36': new Array('Licenciatura en Historia y Letras',223.2897,3), 
 '37': new Array('Medicina',491.2372,5), 
 '38': new Array('Medicina Veterinaria',368.428,4), 
 '39': new Array('Nutrición y Dietética',167.4673,2), 
 '40': new Array('Obstetricia y Puericultura',223.2897,3), 
 '41': new Array('Odontología',368.428,4), 
 '42': new Array('Pedagogía Artes, Música y Danza',111.6448,1), 
 '43': new Array('Pedagogía Castellano y Filosofía',111.6448,1), 
 '44': new Array('Pedagogía Ciencias Naturales',167.4673,2), 
 '45': new Array('Pedagogía Ed Básica',167.4673,2), 
 '46': new Array('Pedagogía Ed. Física',167.4673,2), 
 '47': new Array('Pedagogía Historia',167.4673,2), 
 '48': new Array('Pedagogía Idiomas',167.4673,2), 
 '49': new Array('Pedagogía Matemáticas',167.4673,2), 
 '50': new Array('Pedagogía Religión',223.2897,3), 
 '51': new Array('Periodismo y Comunicación Social',368.428,4), 
 '52': new Array('Psicología',368.428,4), 
 '53': new Array('Psicopedagogía',223.2897,3), 
 '54': new Array('Química y Farmacia',368.428,4), 
 '55': new Array('Químico Laboratorista',223.2897,3), 
 '56': new Array('Sociólogo',368.428,4), 
 '57': new Array('Tecnología Médica',368.428,4), 
 '58': new Array('Trabajo y Servicio Social',167.4673,2), 
 '59': new Array('Traducción',167.4673,2)
};


/**
 *Funcion para el simulador Universitario y que simula la hoja 'AñosCompletos' de la planilla excel 
 * 'Bci Universitario v2p0.xls' utilizada para obtener las cuotas del crédito de estudios universitarios de pregrado
 *@return un Array que indica la cuota durante el periodo de estudios (arreglo[0]), los meses de pago de dicha cuota (arreglo[1]), 
 * la cuota a pagar después del periodo de estudios (arreglo[2]) y los meses de pago de esta cuota (arreglo[3])
 *@param tipo_deposito, puede ser 'PlazoFijo' o 'Renovable'
 *@param moneda, puede ser: 'UF' o 'Pesos'
*/
function getCuotaSimuladorUniversitario(carrera,anosEstudio, plazoCredito, valorAnual){
        if(carrera=='0' || carrera==0 || anosEstudio=='' || plazoCredito=='' || valorAnual==''){
            var arreglo = new Array(4);
            arreglo[0] = 0;
            arreglo[1] = 0;
            arreglo[2] = 0;
            arreglo[3] = 0;         
            return arreglo;
        }
        var carrera = parseFloat(carrera); 
        var anosEstudio = parseFloat(anosEstudio)+1; //Aqui agregamos el año extra para el pago como estudiante
        var plazoCredito = parseFloat(plazoCredito);
        var valorAnual = parseFloat(valorAnual);
        
        var G2= carrera;//Ingreso del Usuario; //Carrera
        var G3= anosEstudio;//carreras_y_maximo[carrera.toString()][2];     //Viene por la carrera; //Años de duración de la carrera a financiar.
        var G4= 2007; /*No sé, asumo el proximo*/           //Año de ingreso a la carrera a financiar.
        var G5= 2007; /*Asumo este año;*/                   //Año de evaluación del crédito en Bci.
        var G8= 0; /*Ingreso del Usuario o asumo CERO;*/    //Años de atraso de la carrera
        var G12= 0;/*ASUMO CERO;*/                          //Dias de gracia
        var G13= carreras_y_maximo[carrera.toString()][1];  //Viene por la carrera; //Monto Máximo
        var G14= 3.06;/*BANCO;*/                            //Tasa base
        var G15= 5.0;/*BANCO;*/                             //Spread anual
        var G16=G14+G15;/*Tasa de interes*/                 //Tasa final
        var G17= 70;/*LO COPIO;*/                           //Porcentaje est (p)
        var G18= (plazoCredito-(anosEstudio))*12; //72;/*NO TENGO IDEA;*/                       //Meses pago eg
        var G23= valorAnual/UF;                 //Ptmo solicitado
        var G32= (plazoCredito - (anosEstudio))*12;             //Ingreso del Usuario; //Meses pago egreso
        //alert(anosEstudio + "|" + plazoCredito + G32);
        var G45=500; //Ptmo max

        var G6= G3-(G5-G4)+G8; //Años que restan para egresar de la carrera.
        
        var G9=G6; //Años por financiar (n)
        var G7=G5-G4; //Años de estudio en la carrera a la evaluacion

        var G36=G16/360*365.25/12; //Tasa mes aprox
        var G37=G36/100; //im (tanto por 1)
        var G38=1+G37; //1+im
        var G39=Math.pow(G38,12)-1; //ia (tanto por 1)
        var G40=1+G39; //1+ia

        var G41=100*(Math.pow(G38,G18)-1)/(G37*Math.pow(G38,G18)); //VP 100 a eg
        var G42=G17*(Math.pow(G38,(G9*12+12))-1)/(G37*Math.pow(G38,(G9*12+12))); //VP p a inicio
        var G43=G41/Math.pow(G38,(G9*12+12))+G42; //VP total a inicio
        var G44=100*(Math.pow(G40,G9)-1)/(G39*Math.pow(G40,(G9-1))); //VP n pmos 100
        var G19= Math.min(G13*G43*100/(G41*G44)/(1+(G12+365.25/12)*G16/36000)/G38,G45); //Ptmo max teórico proporcional
        var G21=G19*G17*G44/(G43*100); //Cuota estudio ptmo max teórico proporcional
        var G22=G21*100/G17; //Cuota egreso min ptmo max teórico proporcional
        var G24=G23*(1+(G12+365.25/12)*G16/36000)/G38; //Ptmo Ajustado por Gracia
        var G26=G21*G24/G19; //Cuota teorica estudio
        var G27=G22*G24/G19; //Cuota teorica egreso a pzo maximo

        var G29=Math.max(0,(G24*G44/100-G13/Math.pow(G40,(G9+1)))*G37*Math.pow(G38,(G9*12+12))/(Math.pow(G38,(G9*12+12))-1)); //Cuota min estudio
        var G30= G29;                               //Cuota estudio
        
        var G33=(G24*(G44/100)*Math.pow(G40,G9+1)-G30*((Math.pow(G38,(G9*12+12))-1)/G37))*G37*Math.pow(G38,G32)/(Math.pow(G38,G32)-1);//Cuota egreso
        
        var G34=G24*G40-G30*(Math.pow(G38,12)-1)/G37; //Cuoton      
        var G28=G24*G40-G26*(Math.pow(G38,12)-1)/G37; //Cuoton teórico


        var G31=(G13/(Math.pow(G38,(G9*12+12)))+G30*G42/G17)*100/G44; //Ptmo máximo según cuota estudio

        //alert('G2'+G2 + ',G3' + G3 + ',G4' + G4 + ',G5' + G5 + ',G6' + G6 + ',G7' + G7 + ',G8' + G8);
        //alert('G9:'+G9 + ',G12:' + G12 + ',G13:' + G13 + ',G14:' + G14 + ',G15:' + G15);
        //alert('G16:'+G16 + ',G17:' + G17 + ',G18:' + G18 + ',G19:' + G19 + ',G21:' + G21 + ',G22:' + G22 + ',G23:' + G23);
        //alert('G24:'+G24 + ',G26:' + G26 + ',G27:' + G27 + ',G28:' + G28 + ',G29:' + G29 + ',G30:' + G30 + ',G31:' + G31);
        //alert('G32:'+G32 + ',G33:' + G33 + ',G34:' + G34 + ',G36:' + G36 + ',G37:' + G37 + ',G38:' + G38);
        
        var arreglo = new Array(4);
        arreglo[0] = parseMoneda(Math.round(G30*UF)); //Cuota durante se estudia
        arreglo[1] = anosEstudio * 12;
        arreglo[2] = parseMoneda(Math.round(G33*UF)); //Cuota después de que se estudia
        arreglo[3] = G32;
        //alert(arreglo);
        
        return arreglo;
        
}
//HACER VISIBLE O INVISIBLE CON CLASE CSS//by Leo Soto
function toggleVisible(elem) {
        toggleElementClass("invisible", elem);
    }

    function makeVisible(elem) {
        var arreglo,i,temp,largo;  
        arreglo=elem.split(",");
        largo=arreglo.length;
        if (largo<2){
                removeElementClass(elem, "invisible");
        }else{
            for (i=0;i<arreglo.length;i++){
                temp=arreglo[i]
                removeElementClass(temp, "invisible");
            }
        }
    }
    
    function makeElementVisible(domElement) {
        removeElementClass(domElement, "invisible");
    }
    function makeElementInvisible(domElement) {
        addElementClass(domElement, "invisible");
    }
    
    function makeInvisible(elem) {
        var arreglo,i,temp,largo;  
        arreglo=elem.split(",");
        largo=arreglo.length;
        if (largo<2){       
                addElementClass(elem, "invisible");
                //$(elem).style.display = 'none';
        }else{
            for (i=0;i<arreglo.length;i++){
                temp=arreglo[i];
                //$(temp).style.display = 'none';
                addElementClass(temp, "invisible");
            }
        }
    }

    function isVisible(elem) {
        // you may also want to check for
        // getElement(elem).style.display == "none"
        return !hasElementClass(elem, "invisible");
};