/*
|------------------------------------------------------------------------------------------|
|     Classe: Validator                                                                    |
|     Versão: 1.0                                                                          |
|  Descrição: Classe para trabalhar com validações de campos de formulários.               |
|                                                                                          |
|  Criado:      10/08/2006 | Por: Mauro Willian                                            |
|  Modificado:  __/__/____ | Por:                                                          |
|------------------------------------------------------------------------------------------|
*/
function Validator()
{
    //##### Atributos Públicos #####
    this.Items = new ValidatorItems();
    
    //##### Atributos Privados #####
    this._form = null;
    this._css_class_error = "Obrigatorio";
    this._css_class_error_mensage = "ErrorMensage";
    this._tipo_mensagem = "txt";
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: setForm                                                       |
    |          Descrição: Informa o ID do formulário que contém os campos.              |
    |       Visibilidade: public                                                        |
    |            Retorno: bool                                                          |
    |         Parâmetros: form = ID do formulário que contém os campos.                 |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 10/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.setForm = function(form)
    {
        this._form = document.getElementById(form);
    }
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: setForm                                                       |
    |          Descrição: Informa o ID do formulário que contém os campos.              |
    |       Visibilidade: public                                                        |
    |            Retorno: bool                                                          |
    |         Parâmetros: form = ID do formulário que contém os campos.                 |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 10/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.setTipoMensagem = function(tipo)
    {
        this._tipo_mensagem = tipo.toLowerCase();
    }
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: setCssClassError                                              |
    |          Descrição: Classe CSS que formata o asterísco de campo obrigatório.      |
    |       Visibilidade: public                                                        |
    |            Retorno: void                                                          |
    |         Parâmetros: css_class = Nome da classe CSS.                               |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 10/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.setCssClassError = function(css_class)
    {
        this._css_class_error = css_class;
    }
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: setCssClassErrorMensage                                       |
    |          Descrição: Classe CSS que formata a mensagem de erro de cada campo.      |
    |       Visibilidade: public                                                        |
    |            Retorno: void                                                          |
    |         Parâmetros: css_class = Nome da classe CSS.                               |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 10/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.setCssClassErrorMensage = function(css_class)
    {
        this._css_class_error_mensage = css_class;
    }
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: Validate                                                      |
    |          Descrição: Inicia a validação dos campos do formulário.                  |
    |       Visibilidade: public                                                        |
    |            Retorno: bool                                                          |
    |         Parâmetros: nenhum                                                        |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 10/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.Validate = function()
    {
        var oPrimeiroErro = null;
        var oRegExp = null;
        
        for (var i = 0; i < this.Items.length(); i++)
        {   
            var oItem = this.Items.Get(i);
                        
            var oControl = this._form[oItem.control];
            var oParent = oControl.parentNode;
            var erro = true;
            
            if (document.getElementById("erro1_" + oItem.control))
                document.getElementById("erro1_" + oItem.control).style.display = "none";
            if (document.getElementById("erro2_" + oItem.control))
                document.getElementById("erro2_" + oItem.control).style.display = "none";
                
            switch (oItem.type.toLowerCase())
            {
                case "cpf":
                    if (fctVrificaCPF(oControl.value))
                        erro = false;
                    break;
                case "cnpj":
                    if (fctVrificaCNPJ(oControl.value))
                        erro = false;
                    break;
                case "email":
                    oRegExp = new RegExp("^([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[@]([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[.]([a-z,A-Z]){2,3}([0-9,a-z,A-Z])?$");
                    break;
                case "datetime":
                    oRegExp = /^(0[1-9]|[12][0-9]|[3][12])\/(0[1-9]|1[012])\/([12][0-9]{3})?$/;
                    break;
                case "smalldatetime":
                    oRegExp = /^(0[1-9]|[12][0-9]|[3][12])\/(0[1-9]|1[012])\/([12][0-9]{3})?$/;
                    break;
                case "hora":
                    oRegExp = /([01]\d|2[0-3]):[0-5]\d/;
                    break;
                case "expressao":
                    oRegExp = new RegExp(oItem.expression);
                    break;
                default:
                    //Verificando o tamanho do valor do campo
                    if (oControl.type == "text" || oControl.type == "textarea" || oControl.type == "file" || oControl.type == "password")
                    {
                        if (oControl.value.length > 0)
                            erro = false;
                    }
                    //Verificando se o campo está checado
                    else if (oControl.type == "checkbox" || oControl.type == "radio")
                    {
                        if (oControl.length == null)
                        {
                            if (oControl.checked)
                                erro = false;
                        }
                        else
                        {
                            for (var j = 0; j < oControl.length; j++)
                            {
                                if (oControl[j].checked)
                                    erro = false;
                            }
                        }
                    }
                    //Verificando se o campo está selecionado
                    else if (oControl.type == "select-one" || oControl.type == "select-multiple")
                    {
                        if (oControl.multiple)
                        {
                            for (var j = 0; j < oControl.options.length; j++)
                            {
                                if (oControl.options[j].selected)
                                    erro = false;
                            }
                        }
                        if (oControl.value != '0')
                            erro = false;
                    }
                    break;
            }
            
            //Verificando uma expressão regular
            if (oRegExp != null)
            {
                if (oRegExp.test(oControl.value))
                {
                    //Verifico se é uma data válida (período)
                    if (oItem.type.toLowerCase() == "datetime" || oItem.type.toLowerCase() == "smalldatetime")
                    {
                        var dData = Date.Parse(oControl.value);
                        if (oItem.type.toLowerCase() == "smalldatetime")
                        {
                            if (dData.isSQLSmallDate())
                                erro = false;
                        }
                        else
                        {
                            if (dData.isSQLDate())
                                erro = false;
                        }
                    }
                    else
                    {
                        erro = false;
                    }
                }
            }
            
            if (erro)
            {
                if (this._tipo_mensagem == "alert")
                {
                    alert(oItem.mensage);
                    oControl.focus();
                    return false;
                }
                else
                {
                    if (document.getElementById("erro1_" + oItem.control))
                        document.getElementById("erro1_" + oItem.control).style.display = "inline";
                    else
                        oParent.innerHTML += "<span id=\"erro1_" + oItem.control + "\" class=\"Obrigatorio\">*</span>";
                    
                    if (document.getElementById("erro2_" + oItem.control))
                        document.getElementById("erro2_" + oItem.control).style.display = "block";
                    else
                        oParent.innerHTML += "<span id=\"erro2_" + oItem.control + "\" class=\"ErrorMensage\">" + oItem.mensage + "</span>";
                    
                    if (oPrimeiroErro == null)
                        oPrimeiroErro = oControl;
                }
            }
        }
        
        if (oPrimeiroErro == null)
            return true;
        else
            return false;
    }
}

/*
|------------------------------------------------------------------------------------------|
|     Classe: ValidatorItem                                                                |
|     Versão: 1.0                                                                          |
|  Descrição: Representa um item (campo) do formulário.                                    |
| Parâmetros: c = Nome do campo que será validado.                                         |
|             m = Mensagem de erro caso o campo não esteja válido.                         |
|             t = Tipo de validação que será feita no campo.                               |
|             e = Expressão regular para validação. [opcional]                             |
|                                                                                          |
|  Criado:      10/08/2006 | Por: Mauro Willian                                            |
|  Modificado:  __/__/____ | Por:                                                          |
|------------------------------------------------------------------------------------------|
*/
function ValidatorItem(c, m, t, e)
{
    //##### Atributos Públicos #####
    this.control = c;
    this.mensage = m;
    this.type = t;
    this.expression = e;
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: ToString                                                      |
    |          Descrição: Retorna todos os tributos na classe em formato string.        |
    |       Visibilidade: public                                                        |
    |            Retorno: string                                                        |
    |         Parâmetros: nenhum                                                        |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 11/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.ToString = function()
    {
        var retorno = "";
        
        retorno += "Control: " + this.control + "\n";
        retorno += "Mensage: " + this.mensage + "\n";
        retorno += "Type: " + this.type + "\n";
        retorno += "Expression: " + this.expression;
        
        return retorno;
    }
}

/*
|------------------------------------------------------------------------------------------|
|     Classe: ValidatorItems                                                               |
|     Versão: 1.0                                                                          |
|  Descrição: Representa uma coloeção de itens (campos) do formulário.                     |
|                                                                                          |
|  Criado:      10/08/2006 | Por: Mauro Willian                                            |
|  Modificado:  __/__/____ | Por:                                                          |
|------------------------------------------------------------------------------------------|
*/
function ValidatorItems()
{
    //##### Atributos Privados #####
    this._items = new Array();
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: Add                                                           |
    |          Descrição: Adiciona um novo item na coleção.                             |
    |       Visibilidade: public                                                        |
    |            Retorno: void                                                          |
    |         Parâmetros: control    = Nome do campo que será validado.                 |
    |                     mensage    = Mensagem de erro caso o campo não esteja válido. |
    |                     type       = Tipo de validação que será feita no campo.       |
    |                     expression = Expressão regular para validação. [opcional]     |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 10/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.Add = function(control, mensage, type, expression)
    {
        this._items.push(new ValidatorItem(control, mensage, type, expression));
    }
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: Clear                                                         |
    |          Descrição: Remove todos os itens da coleção.                             |
    |       Visibilidade: public                                                        |
    |            Retorno: void                                                          |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 10/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.Clear = function()
    {
        this._items = new Array();
    }
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: Get                                                           |
    |          Descrição: Retorna um item de acordo com o índice informado.             |
    |       Visibilidade: public                                                        |
    |            Retorno: ValidatorItem                                                 |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 10/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.Get = function(indice)
    {
        return this._items[indice];
    }
    
    /*
    |-----------------------------------------------------------------------------------|
    |             Método: length                                                        |
    |          Descrição: Informa a quantidade de itens estão presentes na coleção.     |
    |       Visibilidade: public                                                        |
    |            Retorno: int                                                           |
    |            Criador: Mauro Willian                                                 |
    | Última Modificação: 10/08/2006 | Por: Mauro Willian                               |
    |-----------------------------------------------------------------------------------|
    */
    this.length = function()
    {
        return this._items.length;
    }
}
