    /* Esta funcion sirve para saber si el navegador es explorer o no */
    function esExplorer() {
        return ((navigator.userAgent.toLowerCase().indexOf("msie") != -1) &&
                 (navigator.userAgent.toLowerCase().indexOf("opera") == -1));
    }
    var explorer = esExplorer();

    /* Esta funcion sirve para redondear un numero */
    function roundNumber(number, lenght) {
       return number.toFixed(lenght);
    }

    /* Esta funcion sirve para hacer el control de maxLength de un textarea */
    function controlLength(propiedad, maxLength, e) {
            var key;

        if(window.event) {
            key = e.keyCode; 	// for IE, e.keyCode or window.event.keyCode can be used
        } else if(e.which) {
            key = e.which; 		// netscape
        } else {
            return true; 		// no event, so pass through
        }

        if (key == 8) {
            return true;
        }

        return (propiedad.value.length < maxLength);
    }

    function buscarComboDescripcion(valorFiltro, combo, lista) {
        comboLleno = combo;
        vaciarCombo(comboLleno);
        for (var count = 0; count < lista.length; count++) {
            var descripcion = lista[count][1];
            if ((descripcion.toLowerCase()).match(valorFiltro.toLowerCase())) {
                comboLleno = comboAdd(comboLleno, lista[count][1],lista[count][0]);
            }
        }
    }

    function buscarCombo(valorFiltro, combo) {
        var encontro = false;
        if (valorFiltro.length > 1) {
            for (var count = 0; (!encontro) && (count < combo.length); count++) {
//                if (combo[count].value.toLowerCase() == valorFiltro.toLowerCase()) {
                var comparar = combo[count].value.substring(0, valorFiltro.length);

//                alert(comparar.toLowerCase() + ' == ' + valorFiltro);

                if (comparar.toLowerCase() == valorFiltro.toLowerCase()) {
                    combo.selectedIndex = count;
                    encontro = true;
                }
            }
        }
        return encontro;
    }

    // Funciones para filtrar un combo
    function vaciarCombo(combo) {
        while (eval(combo.options.length > 0)) {
            eval(combo.remove(0));
        }
    }

    // por medio de un filtro carga el combo
    function actualizarCombo(filtro, comboProperty, lista) {
        combo = comboProperty;
        vaciarCombo(combo);
        for (i= 0;i<lista.length;i++) {
            if (filtro=='') {
                combo = comboAdd(combo, lista[i][1],lista[i][0]);
            } else if (lista[i][1].toLowerCase().indexOf(filtro.toLowerCase()) > -1) {
                combo = comboAdd(combo, lista[i][1],lista[i][0]);
            }
        }
    }

    // como la forma de cargar una opcion en un combo varia segun el navegador, se crea esta funcion
    function comboAdd(combo, codigo, descripcion) {
        if (explorer) {
            combo.add( new Option(codigo, descripcion) );
        } else {
            combo.add( new Option(codigo, descripcion), null);
        }
        return combo;
    }

    // funcion para abrir un popUp
    function popupStd(popup_url, popup_width, popup_height) {
        var tmp = window.open(popup_url,'','resizable=yes,menubar=no,location=no,toolbar=no,status=yes,scrollbars=yes,directories=no,width='+popup_width+',height='+popup_height);
    }

    // busca un elemento del form por medio de su nombre
    function getElementByName(name) {
        var theForm = document.forms[0];
        var resultElement = null;
        for (i=0; i < theForm.elements.length; i++) {
            if (theForm.elements[i].name == name) {
                resultElement = theForm.elements[i];
                i = theForm.elements.length;
            }
        }
        return resultElement;
    }

    // convierte un double a un String
    function formatDouble(valueDouble) {
        return ('' + roundNumber(valueDouble, 2)).replace(".",",");
    }

    // convierte un string a double
    function parseDouble(valueString) {
        return Number(valueString.replace(",","."));
    }

    /* Esta funcion sirve para filtrar cualquier tipo de caracter que no sea numerico */
    function controlNumero(propiedad, e) {
        var key;
        var keychar;
        var reg;

        if(window.event) {
            key = e.keyCode; 	// for IE, e.keyCode or window.event.keyCode can be used
        } else if(e.which) {
            key = e.which; 		// netscape
        } else {
            return true; 		// no event, so pass through
        }

        keychar = String.fromCharCode(key);

        reg = /\d/;// number         backspace    delete	   enter            ,

        // si es . entonces lo convierte en ,
        if ((key == 46) && (propiedad.value.indexOf(',') == -1)) {
            propiedad.value =  propiedad.value + ',';
        }

        if (key == 45) {
            if (propiedad.value.indexOf('-') == -1) {
                propiedad.value =  '-' + propiedad.value;
            } else {
                propiedad.value =  propiedad.value.replace('-', '');
            }
        }

        return reg.test(keychar) || key == 8 || key == 127 || key == 13 || ((key == 44)  && (propiedad.value.indexOf(',') == -1));
    }

    /* Es lo mismo que controlNumero pero en vez de marcar los decimales con com te los marca con puntos */
    function controlDecimalPunto(propiedad, e) {
        var key;
        var keychar;
        var reg;

        if(window.event) {
            key = e.keyCode; 	// for IE, e.keyCode or window.event.keyCode can be used
        } else if(e.which) {
            key = e.which; 		// netscape
        } else {
            return true; 		// no event, so pass through
        }

        keychar = String.fromCharCode(key);

        reg = /\d/;

        if ((key == 44) && (propiedad.value.indexOf('.') == -1)) {
            propiedad.value =  propiedad.value + '.';
        }

        if (key == 45) {
            if (propiedad.value.indexOf('-') == -1) {
                propiedad.value =  '-' + propiedad.value;
            } else {
                propiedad.value =  propiedad.value.replace('-', '');
            }
        }

        // 44 es coma
        // 46 es punto
        // 45 es menos
        // 8 backspace
        // 127 delete
        // 13 enter

        return reg.test(keychar) || key == 8 || key == 127 || key == 13 || ((key == 46)  && (propiedad.value.indexOf('.') == -1));
    }

    /* Solo te deja ingresar numeros enteros */
    function controlEntero(propiedad, e) {
        var key;
        var keychar;
        var reg;

        if(window.event) {
            key = e.keyCode; 	// for IE, e.keyCode or window.event.keyCode can be used
        } else if(e.which) {
            key = e.which; 		// netscape
        } else {
            return true; 		// no event, so pass through
        }

        keychar = String.fromCharCode(key);

        reg = /\d/;

        return reg.test(keychar) || key == 8 || key == 127 || key == 13;
    }

    /* Esto se usa en el abm generico si un campo editado es pk y su tipo es TEXTO entonces solo deja ingresar numeros y letras */
    function controlPk(propiedad, e) {
        var key;
        var keychar;
        var reg;

        if(window.event) {
            key = e.keyCode; 	// for IE, e.keyCode or window.event.keyCode can be used
        } else if(e.which) {
            key = e.which; 		// netscape
        } else {
            return true; 		// no event, so pass through
        }

        keychar = String.fromCharCode(key);

        reg = /\d/;

        //65 90 M
        //97 122 m
        //48 57 n
        return (key >= 65  && key <= 90) || (key >= 97  && key <= 122) || (key >= 48  && key <= 57) || key == 8 || key == 127 || key == 13 || key == 95;
    }

    function isPopUp() {
        return ((window.opener) && (window.opener != null));
    }

    /* metodo que se usa en el onLoad del body para inicializar un radio del form */
    function initRadio(radio, iniciarA) {
        if (radio.length != undefined && radio.length > 0) {
            var encontro = false;
            for (var contador = 0 ; ((!encontro) && (contador < radio.length)) ; contador++) {
//                if (radio[contador].checked == true) {
                if (radio[contador].checked) {
                    encontro = true;
                }
            }
            if (!encontro) {
                radio[iniciarA].checked = true;
            }
        }
    }
    function changecss(theClass,element,value) {
    //documentation for this script at http://www.shawnolson.net/a/503/
        var cssRules = 'rules';
        if (document.all) {
            cssRules = 'rules';
        }
        else if (document.getElementById) {
            cssRules = 'cssRules';
        }
        alert(cssRules);
        for (var S = 0; S < document.styleSheets.length; S++){
            for (var R = 0; R < document.styleSheets[S][cssRules].length; R++) {
//                alert(document.styleSheets[S][cssRules][R].selectorText);
                if (document.styleSheets[S][cssRules][R].selectorText == '.' + theClass
                        || document.styleSheets[S][cssRules][R].selectorText == theClass) {
                    if (document.styleSheets[S][cssRules][R].style) {
                        document.styleSheets[S][cssRules][R].style[element] = value;
                    }
                }
            }
        }
    }

    function getElementByIdTag(documento, idElemento) {
        var tag = null;
        if (documento.getElementById) {
            tag = documento.getElementById(idElemento);

        } else if (documento.all) {
            tag = documento.all[idElemento];

        } else if (documento.layers) {
            tag = documento.layers[idElemento];
        }
        return tag;
    }

    function getEstiloUnificado(nombreDomElemento, propiedadEstilo, valorPropiedadEstilo) {
        if (!explorer) {
            if ((propiedadEstilo.toLowerCase() == 'display') && (valorPropiedadEstilo.toLowerCase() == 'block')) {
                if (nombreDomElemento.toLowerCase().indexOf('tablerow') != -1) {
                    valorPropiedadEstilo = 'table-row';


                } else if (nombreDomElemento.toLowerCase().indexOf('tablecell') != -1) {
                    valorPropiedadEstilo = 'table-cell';

                }
            }
        } else {
            if (propiedadEstilo.toUpperCase() == 'display') {
                if ((nombreDomElemento.toLowerCase().indexOf('tablerow') != -1) && (valorPropiedadEstilo.toLowerCase() == 'table-row')) {
                    valorPropiedadEstilo = 'block';

                } else if ((nombreDomElemento.toLowerCase().indexOf('tablecell') != -1) && (valorPropiedadEstilo.toLowerCase() == 'table-cell')) {
                    valorPropiedadEstilo = 'block';
                }
            }
        }
        return valorPropiedadEstilo;
    }

    function changePropertyStyleById(idElemento, propiedadEstilo, valorPropiedadEstilo) {
        var elemento = getElementByIdTag(document, idElemento);

        if (elemento) {

            valorPropiedadEstilo = getEstiloUnificado(elemento.toString(), propiedadEstilo, valorPropiedadEstilo);

            var estiloElemento = elemento.style;
            eval("estiloElemento." + propiedadEstilo + "='" + valorPropiedadEstilo + "'");
        }

    }

    function changePropertyStyleByName(nombreElemento, propiedadEstilo, valorPropiedadEstilo) {
        var listaElementos = document.getElementsByName(nombreElemento);


        for (var contadorElementos = 0; contadorElementos < listaElementos.length; contadorElementos++) {
            var elemento = listaElementos[contadorElementos];

            if (elemento) {

                valorPropiedadEstilo = getEstiloUnificado(elemento.toString(), propiedadEstilo, valorPropiedadEstilo);

                var estiloElemento = elemento.style;
                eval("estiloElemento." + propiedadEstilo + "='" + valorPropiedadEstilo + "'");
            }
        }
    }

    function changePropertyStyleByClass(nombreElemento, nombreClaseEstilo, propiedadEstilo, valorPropiedadEstilo, elementoPadre) {

        if (!elementoPadre) {
            elementoPadre = document;
        }

        var arregloResultante = [];

        var elementos;
        if (nombreElemento == '*') {
            elementos = (explorer) ? elementoPadre.all : elementoPadre.getElementsByTagName('*');
        } else {
            elementos = elementoPadre.getElementsByTagName(nombreElemento);
        }

        // por cada elemento
        for (var contadorElementos = 0; contadorElementos < elementos.length; contadorElementos++) {
            var elemento = elementos[contadorElementos];

            if (nombreClaseEstilo == '*') {
                var estiloElemento = elemento.style;
                eval("estiloElemento." + propiedadEstilo + "='" + valorPropiedadEstilo + "'");

                arregloResultante[arregloResultante.length] = elemento;

            } else {
                var pertence = false;

                for (var contadorAtributos = 0; (!pertence) && (contadorAtributos < elemento.attributes.length); contadorAtributos++) {
                    if ((elemento.attributes.item(contadorAtributos).nodeName == 'class') &&
                            (elemento.attributes.item(contadorAtributos).nodeValue == nombreClaseEstilo)) {

                        pertence = true;

                        valorPropiedadEstilo = getEstiloUnificado(elemento.toString(), propiedadEstilo, valorPropiedadEstilo);
                        var estiloElemento = elemento.style;
                        eval("estiloElemento." + propiedadEstilo + "='" + valorPropiedadEstilo + "'");

                        arregloResultante[arregloResultante.length] = elemento;
                    }
                }
            }
        }

        return arregloResultante;
    }

    /* version vieja
        function changePropertyStyleByClass(nombreElemento, nombreClaseEstilo, propiedadEstilo, valorPropiedadEstilo) {
            var elementos;
            if (nombreElemento == '*') {
                elementos = (explorer) ? document.all : document.getElementsByTagName('*');
            } else {
                elementos = document.getElementsByTagName(nombreElemento);
            }

            // por cada elemento
            for (var contadorElementos = 0; contadorElementos < elementos.length; contadorElementos++) {
                var elemento = elementos[contadorElementos];

                var pertence = false;

                for (var contadorAtributos = 0; (!pertence) && (contadorAtributos < elemento.attributes.length); contadorAtributos++) {
                    if ((elemento.attributes.item(contadorAtributos).nodeName == 'class') &&
                            (elemento.attributes.item(contadorAtributos).nodeValue == nombreClaseEstilo)) {

                        pertence = true;

                        valorPropiedadEstilo = getEstiloUnificado(elemento.toString(), propiedadEstilo, valorPropiedadEstilo);
                        var estiloElemento = elemento.style;
                        eval("estiloElemento." + propiedadEstilo + "='" + valorPropiedadEstilo + "'");

                    }
                }
            }
        }
    */

    function setStyleByClass(nombreElemento, nombreClaseEstilo, propiedadEstilo, valorPropiedadEstilo) {
        changePropertyStyleByClass(nombreElemento, nombreClaseEstilo, propiedadEstilo, valorPropiedadEstilo);
    }

    function inputEnabled(property) {
        property.readOnly = false;
        property.className = '';
    }

    function inputDisabled(property) {
        property.readOnly = true;
        property.className = 'inputDisabled';
    }

    function trim(texto) {
        return texto.replace(/^\s*|\s*$/g,'');
    }


