/**
 * Las clases usan para el remplazo los nombres de atributos con el LowerCamelCase
 * es decir si el atributo es nombre y la clase es servicio se tiene que:
 *      lowerCamelCase(NombreClase + atributo);
 *      Ejm:
 *      El atributo "nombre" de la clase "Servicio" se buscara en la plantilla
 *      de la siguiente manera "__servicioNombre__" y este se reemplazara por el
 *      valor del atributo.
 *
 **/

function Generica(atributos)
{
    if (atributos == undefined) {
        atributos = new Array();
    }
    if (this.atributos == undefined) {
        this.atributos = atributos;
    }

    this.prefijo        = '';
    this.delimitadorIni = '__';
    this.delimitadorFin = '__';
    this.valores = new Array();

    this.set = function(datos)
    {
        this.setAtributos(datos);
    }

    this.setAtributos = function(datos)
    {
        if (datos instanceof Object) {
            for (var indice in this.atributos) {
                var valor = this.atributos[indice];
                if (datos[valor] != undefined) {
                    this.valores[valor] = datos[valor];
                } else if (datos[indice] != undefined) {
                    this.valores[valor] = datos[indice];
                }
            }
        }
    }
    /*
     * devuelve el valor del atributo nombre;
     * @param string nombre 
     * @return false|String|array 
     */
    this.traerParametro = function(nombre)
    {
        if (this.valores[nombre] != undefined) {
            return this.valores[nombre];
        }
        return false;
    }

    this.indice = function (atributo)
    {
        return this.traerIndiceAtributo(atributo);
    }
    /*
     * devuelve el indice del atributo
     * @param string atributo 
     * @return -1|indice
     */
    this.traerIndiceAtributo = function(atributo)
    {
        for (var i in this.atributos) {
            if (this.atributos[i] == atributo) {
                return i;
            }
        }
        return -1;
    }

    /**
     * Retorna la plantilla dividida en 3 partes la segunda parte es la
     * plantilla de la seccion buscada, si no se ubica correctamente la
     * seccion buscada se returna la plantilla original como primer y
     * único elemento del objeto retornado.
     *
     * @param etqInicial cadena que se busca como inicio de plantilla
     * @param etqFinal cadena que se busca como final de plantilla
     * @return array de un solo parametro si no encuentra | array de 3 parametros si encuentra
     */
    this.separarSeccion = function(etqInicial, etqFinal, plantilla)
    {
        var respuesta = new Array();
        var secciones = plantilla.split(etqInicial);
        if (secciones.length == 2) {
            respuesta[0] = secciones[0];
            secciones = secciones[1].split(etqFinal);
            if (secciones.length == 2) {
                respuesta[1] = secciones[0];
                respuesta[2] = secciones[1];
            }
        }
        if (respuesta.length == 3) {
            return respuesta;
        }        
        respuesta[0] = plantilla;
        return respuesta;
    }
    
    this.traerHtml = function(plantilla)
    {
        for (var i in this.atributos) {
            var valor = this.atributos[i];
            if (this.valores[valor] == undefined) {
//                console.log('El parametro ' + valor
//                     + ' no tiene valor asignado en id '
//                     + this.valores['id']);
            } else {
                plantilla = this.reemplazarVariable(plantilla, valor, this.valores[valor]);
            }
        }
        return plantilla;
    }

    /**
     * @param string plantilla
     * @param string variable Nombre de la variable que se quiere remplazar,
     *                        a esta variable se le agrega el prefijo de la
     *                        clase y los delimitadores por ejemplo:
     *                        <br>En la clase "Servicio"
     *                        <br>el prefijo es "servicio"
     *                        <br>los delimitadores por defecto son '__'
     *                        <br>finalmenrte
     *
     * @param string valor
     * @param string prefijo OPTIONAL Por defecto usa el prefijo de la clase
     *
     **/
    this.reemplazarVariable = function(plantilla, variable, valor, prefijo)
    {
        if (valor == undefined) {
            valor = '';
        }
        if (prefijo == undefined) {
            prefijo = this.prefijo;
        }
        if (prefijo.trim() != '') {
            variable = variable.ucFirst();
        }
        var variableHtml = this.delimitadorIni
                         + prefijo
                         + variable
                         + this.delimitadorFin;
        var exp = new RegExp(variableHtml, "g");
        return plantilla.replace(exp, valor);
    }
}
