﻿/* Definición de objetos utilizados */
     //Constantes de posicion
    var idIngrediente               = 0
    var nombreIngrediente           = 1
    var valorSapIngrediente         = 2
    var valorIodoIngrediente        = 3
    var valorInsIngrediente         = 4
    var valorLauricoIngrediente     = 5
    var valorLinoleicoIngrediente   = 6
    var valorMyristicoIngrediente   = 7
    var valorOleicoIngrediente      = 8
    var valorPalmiticoIngrediente   = 9
    var valorRicinoleicoIngrediente = 10
    var valorEstearicoIngrediente   = 11
    var valorLinolenicoIngrediente  = 12
    var valorDescripcionIngrediente = 13
	
	var numeroIngredientesFormula   = 18
    
	var ingredientesVisibles        = 1
    
    // Clase ingrediente que almacena cada uno de los componentes de la fórmula
    function Ingrediente(id, peso, sap){
        this.id                = id
        this.peso              = peso
        this.sap               = sap
        this.esGrasa           = (sap != 0)
        this.porcentajeGrasas  = 0.
        this.porcentajeFormula = 0.
        this.KOH               = 0
        if(id != 0){
            var num = buscaIngrediente(id)
            this.nombre      = lista[num][nombreIngrediente]
            this.iodo        = lista[num][valorIodoIngrediente]
            this.ins         = lista[num][valorInsIngrediente]
            this.laurico     = lista[num][valorLauricoIngrediente]
            this.linoleico   = lista[num][valorLinoleicoIngrediente]
            this.myristico   = lista[num][valorMyristicoIngrediente]
            this.oleico      = lista[num][valorOleicoIngrediente]
            this.palmitico   = lista[num][valorPalmiticoIngrediente]
            this.ricinoleico = lista[num][valorRicinoleicoIngrediente]
            this.estearico   = lista[num][valorEstearicoIngrediente]
            this.linolenico  = lista[num][valorLinolenicoIngrediente]
            this.descripcion = lista[num][valorDescripcionIngrediente]}
            
        this.resultado = new Resultado(this)
    }
    
    // Busca un ingrediente en la lista y devuelve su posición en la matriz
    function buscaIngrediente(id){
        if(id==0){return 0}
        for(nbi=0; nbi<lista.length; nbi++){
            if(lista[nbi][idIngrediente] == id){return nbi}
        }
    }
	// Busca un ingrediente en el selector y devuelve su posición (selIndex)
    function buscaIngredienteSel(id){
        sel = document.getElementById("SelIngrediente");
		for(ni=0; ni<sel.length; ni++){
			if(sel.options[ni].value == id){return ni}
        }
    }


    /* Clase Formula 
     * Clase que crea un objeto Formula que almacena todos los valores de la fórmula
     * parametro: sobreEngrasado = valor sobreEngrasado de la fórmula
     * parametro: concentracion = valor concentracion de la fórmula
     * parametro: tipoAlcali = tipoAlcali (1 = KOH || 1.4025 = NaOH)
     * parametro: notas = notas adicionales de la fórmula
     * devuelve un objeto Formula 
     */
    function Formula(sobreEngrasado, concentracion, tipoAlcali, notas){
        this.nombre = ""
        this.listaIngredientes = new Array()
        this.sobreEngrasado = sobreEngrasado
        this.concentracion = concentracion
        this.tipoAlcali = tipoAlcali
        this.notas = notas
        //valores iniciales
        this.KOH = 0.
        this.agua = 0.
        this.mediaSap = 0.
        this.mediaIodo = 0.
        this.mediaINS = 0.
        this.dureza = 0
        this.espuma = 0
        this.persistencia = 0
        this.limpieza = 0
        this.acondicionado = 0
        
        this.pesoGrasas = 0.
        this.pesoIngredientes = 0.
        this.pesoTotal = 0.
		
    }
    
    /* Clase Resultado
     * Crea un objeto Resultado que auto-calcula respecto a un ingrediente directamente
     * parametro: ingred = objeto de la clase Ingrediente
     * devuelve un objeto Resultado 
     */
    function Resultado(ingred){
        
        //Calcula el valor de Dureza con los factores precalculados y declarados anteriormente
	    mivar = ingred.laurico * fctDureza[0] + ingred.linoleico * fctDureza[1] + ingred.myristico * fctDureza[2] + ingred.oleico * fctDureza[3] + ingred.palmitico * fctDureza[4] + ingred.ricinoleico * fctDureza[5] + ingred.estearico * fctDureza[6] + ingred.linolenico * fctDureza[7]
	    this.dureza = parseInt(mivar * fctDureza[8])
	    
	    //Calcula el valor de burbujas en la espuma
	    mivar = ingred.laurico * fctBurbujas[0] + ingred.linoleico * fctBurbujas[1] + ingred.myristico * fctBurbujas[2] + ingred.oleico * fctBurbujas[3] + ingred.palmitico * fctBurbujas[4] + ingred.ricinoleico * fctBurbujas[5] + ingred.estearico * fctBurbujas[6] + ingred.linolenico * fctBurbujas[7]
	    this.burbujas = parseInt(mivar * fctBurbujas[8])
	    
	    //Calcula el valor de persistencia de la espuma
	    mivar = ingred.laurico * fctPersistencia[0] + ingred.linoleico * fctPersistencia[1] + ingred.myristico * fctPersistencia[2] + ingred.oleico * fctPersistencia[3] + ingred.palmitico * fctPersistencia[4] + ingred.ricinoleico * fctPersistencia[5] + ingred.estearico * fctPersistencia[6] + ingred.linolenico * fctPersistencia[7]
	    this.persistencia = parseInt(mivar * fctPersistencia[8])
	    
        //Calcula el valor de limpieza
	    mivar = ingred.laurico * fctLimpieza[0] + ingred.linoleico * fctLimpieza[1] + ingred.myristico * fctLimpieza[2] + ingred.oleico * fctLimpieza[3] + ingred.palmitico * fctLimpieza[4] + ingred.ricinoleico * fctLimpieza[5] + ingred.estearico * fctLimpieza[6] + ingred.linolenico * fctLimpieza[7]
	    this.limpieza = parseInt(mivar * fctLimpieza[8])
	    
	    //Calcula el valor de acondicionado
	    mivar = ingred.laurico * fctAcondicionado[0] + ingred.linoleico * fctAcondicionado[1] + ingred.myristico * fctAcondicionado[2] + ingred.oleico * fctAcondicionado[3] + ingred.palmitico * fctAcondicionado[4] + ingred.ricinoleico * fctAcondicionado[5] + ingred.estearico * fctAcondicionado[6] + ingred.linolenico * fctAcondicionado[7]
	    this.acondicionado = parseInt(mivar * fctAcondicionado[8])
	    
	    //Excepciones. 
	    //Estos ingredientes tienen cualidades propias independientes de los ácidos grasos
        //Alcohol
        if(ingred.id==33){this.dureza = -30; this.persistencia = -70; this.burbujas = -40; this.limpieza = 40; this.acondicionado = -20}
        //Arcilla
        if(ingred.id==34){this.dureza = 90; this.limpieza = 100}
        //Coco por el Capróico, Caprílico, Cáprico
        //if(ingred.id==3){this.limpieza += 6}
        //borago por el g-linolenico
        if(ingred.id==27){this.acondicionado += 20; this.burbujas = 100}
        //mostaza por el g-linolenico
        if(ingred.id==65){this.acondicionado += 15; this.burbujas = 80}
        //cacahuete por el g-linolenico
        if(ingred.id==67){this.acondicionado += 5; this.burbujas = 55}
        //Cacao en polvo
        if(ingred.id==48){this.acondicionado = 50}
        //cera de abeja
        if(ingred.id==17){this.dureza = 150; this.acondicionado = 65}
        //cera de carnauba
        if(ingred.id==68){this.dureza = 160; this.acondicionado = 50}
        //Colofonia
        if(ingred.id==22){this.dureza = -20; this.burbujas = 80}
        //Dipropilenglicol
        if(ingred.id==50){this.dureza = 10; this.persistencia = 0; this.limpieza = 65; this.burbujas = 90; this.acondicionado = 80}
        //jojoba por el Gadoleico
        if(ingred.id==28){this.acondicionado = 90}
        //macadamia por el Gadoleico
        if(ingred.id==56){this.acondicionado = 90}
        //Jugo de aloe
        if(ingred.id==45){this.dureza = -15; this.acondicionado = 15}
        //Karité
        if(ingred.id==21){this.acondicionado += 12}
        //Propilenglicol
        if(ingred.id==49){this.dureza = -10; this.persistencia = 0; this.burbujas = 50; this.acondicionado = 50}
        //Sal
        if(ingred.id==39){this.dureza = 80; this.acondicionado = 50}
        //Sodio Lactato
        if(ingred.id==43){this.dureza = 90; this.acondicionado = 50}
         
	} 
	
	function aplicaVariantes(resul){
        // Aplicando el sobre-engrasado a la Dureza, limpieza, espuma, persistencia y acondicionado
        resul.dureza        = resul.dureza        * (1 - selSE.value * fctDureza[9])
        resul.limpieza      = resul.limpieza      * (1 - selSE.value * fctLimpieza[9])
        resul.burbujas      = resul.burbujas      * (1 + selSE.value * fctBurbujas[9])
        resul.persistencia  = resul.persistencia  * (1 + selSE.value * fctPersistencia[9])
        resul.acondicionado = resul.acondicionado * (1 + selSE.value * fctAcondicionado[9])

        return resul
    }
    
	// Método para añadir ingredientes(obj) a una fórmula
    function addIngr(obj, posicion, ingrediente){
        obj.listaIngredientes[posicion] = ingrediente
    }

     function cambiaFormula(formulaNueva){
		 
        //Inicializa los selectores y los oculta
        if(typeof(formulaNueva) == 'object'){
			ingredientesVisibles = 1;
			selectoresIngrdt[0].selectedIndex = 0;
			for (n=1; n<numeroIngredientesFormula; n++){
				selectoresIngrdt[n].selectedIndex = 0
				pesoIngrediente[n].value = 0
				sapIngrediente[n].value = 0
				listaIngredientes[n].style.display = "none"}
			
			//copiamos la formula almacenada
			miFormula = new Formula(0,0,1,"");
			miFormula = formulaNueva;
			
			//vamos creando las lineas de cada ingrediente
			for (n=0; n<miFormula.listaIngredientes.length; n++){
				selectoresIngrdt[n].selectedIndex = buscaIngredienteSel(miFormula.listaIngredientes[n].id)
				listaIngredientes[n].style.display = visibilidad
				ingredientesVisibles++}
				
			//Actualizamos los otros controles
			selAlcalis.value = miFormula.tipoAlcali
			selSE.value = miFormula.sobreEngrasado
			selConcentracion.value = miFormula.concentracion
			nombreFormula.innerHTML = miFormula.nombre
			calculos()
			txNotas.value = miFormula.notas
		}
        
    }
    
