var LS_Validaciones = {
    SetearError: function(Campo, Error)
    {
        //Si hay error, lo muestro en la celda, con un efecto hecho por jQuery.
        if (Error != "")
        {
            $("#" + Campo).hide();
            $("#" + Campo).addClass("contenedor-error");
            LS.ObtenerPorId(Campo).innerHTML = Error;
            $("#" + Campo).fadeIn();
        }
        //Si no hay error, oculto la celda.
        else
        {
            $("#" + Campo).fadeOut("medium", function() { $("#" + Campo).removeClass("contenedor-error"); });
        }
    },

    //Función que valida un campo según los criterios requeridos, e indica el error en una celda.
    ValidarCampo: function(Campo, Args)
    {
        //Inicializo el error, y por cada validación requerida si no es pasada, grabo el error en la variable.
        var Error = "";
        if (Args != undefined && Campo != null)
        {
            //Si me pasa un string, es el Id, por lo tanto obtengo el campo.
            if (Campo.value == undefined) Campo = LS.ObtenerPorId(Campo);

            //Si el campo no puede estar vacio.
            if (Args.e == 1 && Campo.value == "")
            {
                Error = rValidaciones.Error_Vacio;
            }
            //Si el campo puede estar vacio, y está, no arrojo ningún error.
            else if (Args.e == -1 && Campo.value == "")
            {
                Error = "";
            }
            //Si el campo requiere un mínimo de caracteres, viene el mínimo en el parametro ml.
            else if (Args.ml && Campo.value.length < Args.ml)
            {
                Error = rValidaciones.Error_MinimoCaracteres.replace("{0}", Args.ml);
            }
            //Si el campo requiere una fecha válida.
            else if (Args.dt && !LS_Validaciones.EsFecha(Campo.value))
            {
                Error = rValidaciones.Error_Fecha;
            }
            //Si el campo requiere un valor entero, indica si necesita ser positivo el parametro p.
            else if (Args.n && !LS_Validaciones.EsNumerico(Campo.value, Args.p))
            {
                Error = rValidaciones.Error_Numero;
            }
            //Si el campo requiere un valor decimal, indica si necesita ser positivo el parametro p.
            else if (Args.d && !LS_Validaciones.EsDecimal(Campo.value, Args.p))
            {
                Error = rValidaciones.Error_Decimal;
            }
            //Si el campo requiere una imagen (jpg, jpeg, gif, o png).
            else if (Args.i && !LS_Validaciones.EsImagen(Campo.value))
            {
                Error = rValidaciones.Error_Imagen;
            }
            //Si el campo requiere un email.
            else if (Args.em && !LS_Validaciones.EsEmail(Campo.value))
            {
                Error = rValidaciones.Error_Email;
            }
            //Si el campo entró en una validación extra.
            //ev tiene dos atributos
            //r: True o False, que indica si es valido o no.
            //e: Contenido del error.
            else if (Args.ev && !Args.ev.r)
            {
                Error = (Args.ev.e) ? Args.ev.e : rValidaciones.Error_General;
            }

            //Seteo el error.
            LS_Validaciones.SetearError(Args.ec, Error);
        }

        //Si el error está vacío, quiere decir que es válido.
        return (Error == "");
    },

    //Función que determina si el texto (nombre de archivo) es una imagen.
    EsImagen: function(Texto)
    {
        //Obtengo la posición del punto.
        var PosicionPunto = Texto.toString().lastIndexOf(".");

        //Si no hay extensión, no es válido.
        if (PosicionPunto == -1) return false;

        //Obtengo la extensión, que está después del último punto.
        var Extension = Texto.substr(PosicionPunto).toLowerCase();

        //Devuelvo si la extensión, es alguna de las permitidas.
        return (Extension == ".jpg" || Extension == ".jpeg" || Extension == ".gif" || Extension == ".png");
    },

    //Función que determina si el texto es un email.
    EsEmail: function(Texto)
    {
        //Creo una máscara con el formato correcto de un email.
        var Mascara = new RegExp("^[a-z]+.*@[a-z]+.*\.([a-z]{2,})+$");

        //Compruebo si el parámetro coincide con la máscara.
        return Mascara.test(Texto);
    },

    //Función que determina si el texto es un número, y si es positivo.
    EsNumerico: function(Valor, Positivo)
    {
        //Si no requiere ser positivo, o tiene false, elimino el menos del comienzo.
        if (Valor.substr(0, 1) == "-" && (Positivo == undefined || !Positivo)) Valor = Valor.substr(1);

        //Reemplazo todos los números por vacío.
        Valor = Valor.replace(/0/g, "");
        Valor = Valor.replace(/1/g, "");
        Valor = Valor.replace(/2/g, "");
        Valor = Valor.replace(/3/g, "");
        Valor = Valor.replace(/4/g, "");
        Valor = Valor.replace(/5/g, "");
        Valor = Valor.replace(/6/g, "");
        Valor = Valor.replace(/7/g, "");
        Valor = Valor.replace(/8/g, "");
        Valor = Valor.replace(/9/g, "");

        //Si quedo un string vacío, quiere decir que era un número ya que estos desaparecieron.
        return (Valor == "");
    },

    //Función que determina si el texto es un número decimal, y si es positivo.
    EsDecimal: function(Valor, Positivo)
    {
        //Si no requiere ser positivo, o tiene false, elimino el menos del comienzo.
        if (Valor.substr(0, 1) == "-" && (Positivo == undefined || !Positivo)) Valor = Valor.substr(1);

        //Reemplazo todos los números por vacío.
        Valor = Valor.replace(/0/g, "");
        Valor = Valor.replace(/1/g, "");
        Valor = Valor.replace(/2/g, "");
        Valor = Valor.replace(/3/g, "");
        Valor = Valor.replace(/4/g, "");
        Valor = Valor.replace(/5/g, "");
        Valor = Valor.replace(/6/g, "");
        Valor = Valor.replace(/7/g, "");
        Valor = Valor.replace(/8/g, "");
        Valor = Valor.replace(/9/g, "");

        //Si quedo un string vacío, una coma o un punto, quiere decir que era un número ya que todos los números desaparecieron.
        return (Valor == "," || Valor == "." || Valor == "");
    },

    //Función que determina si el texto es una fecha valida.
    EsFecha: function(StringFecha, Formato)
    {
        //El formato por defecto es dd/mm/yyyy
        if (Formato == undefined) Formato = "dd/mm/yyyy";

        //Inicializo las variables.
        var Dia, Mes, Anio = 0;

        if (Formato == "dd/mm/yyyy")
        {
            //Creo la máscara para validar que el string de la fecha sea válido.
            var Mascara = new RegExp("^[0-9]{2}/[0-9]{2}/[0-9]{4}$");

            //Si el string, cumple con la máscara, obtengo los números.
            if (Mascara.test(StringFecha))
            {
                Dia = StringFecha.toString().substr(0, 2);
                Mes = StringFecha.toString().substr(3, 2);
                Anio = StringFecha.toString().substr(6, 4);
            }
        }
        else if (Formato == "yyyy/mm/dd")
        {
            //Creo la máscara para validar que el string de la fecha sea válido.
            var Mascara = new RegExp("^[0-9]{4}/[0-9]{2}/[0-9]{2}$");

            //Si el string, cumple con la máscara, obtengo los números.
            if (Mascara.test(StringFecha))
            {
                Anio = StringFecha.toString().substr(0, 4);
                Mes = StringFecha.toString().substr(5, 2);
                Dia = StringFecha.toString().substr(8, 2);
            }
        }

        //Si el mes no está entre 1 y 12, no existe.
        if (Mes < 1 || Mes > 12) return false;

        //Si el día no está entre 1 y 31, no existe.
        if (Dia < 1 || Dia > 31) return false;

        //Si el mes es febrero.
        if (Mes == 2)
        {
            //Si es bisiesto, tiene 29 días.
            if (parseInt(Anio) % 4 == 0 && parseInt(Anio) % 100 == 0 && parseInt(Anio) % 400 == 0)
            {
                if (Dia < 1 || Dia > 29) return false;
            }
            //Si no es bisiesto, solo tiene 28 días.
            else
            {
                if (Dia < 1 || Dia > 28) return false;
            }
        }
        //Si el mes tiene 30 días lo válido.
        else if (Mes == 4 || Mes == 6 || Mes == 9 || Mes == 11)
        {
            if (Dia > 30) return false;
        }

        //Si pasó todas las validaciones, quiere decir que es válido.
        return true;
    }
}
