/*
formVal.
	
Autor: André Inocenti - http://www.inocenti.com.br
Validação geral para formulario.
	
*/

$(document).ready(function () {

    /*
    * Abaixo segue a lista das validações disponiveis:
    *
    * Class: requerido: verifica se o campo está vazio ou não.
    *
    * Class: upload: um pouco mais complexo, para usa-lo você precisa digitar por ex: upload*jpg-png
    * Aonde upload: é a funcao, *: é o demilitador, após ele vem quais extensões são válidas separadas por "-". Neste exemplo
    * são aceitas  as extensões jpg e png
    *
    * Class: email: valida se o email é válido.
    */


    /* validacao do formulario ao ser submetido */

    $("form").submit(function () {
        return validarForm($(this));
    });

   validarForm = function (form) {
        $('.msgErro').remove();          
        $("input, textarea, select", form).each(function (i) {
          
            var campo = $(this);
            var params = "";			
			
            //se campo está invisivel vai para próximo
            if ($(campo).is(":hidden") || $(campo).is(":submit")) {
                return true;
            }


            var classe = campo.attr("class");
            classe = classe != undefined ? classe : '' ;
            var classesBkp = classe.split(/\s+/);

            for (var i in classesBkp) {
                campo.removeClass(classesBkp[i]);
            }

            //para verificacao do upload
            if (classe.indexOf("upload") != -1) {
                classes = classe.split(" ");

                for (var itens in classes) {
                    if (classes[itens].indexOf("upload") != -1) {
                        tipo = classes[itens];

                    }
                }
                params = tipo.split("*");
                params = params[1].split("-");
            } else {
                tipo = classe;
            }
               
            for (var i in classesBkp) {
                if (classesBkp[i] != "certo" && classesBkp[i] != "errado") {
                    campo.addClass(classesBkp[i]);
                }
            }
            
            verificaQualFuncao(tipo, campo, params);



        });

        if ($(".msgErro").length) {
            return false;
        } else {
            return true;
        }
    }

    /* Validação em tempo de execução para os campos de formularios.
    * Para usa-lo o input precisa ter 2 classes, uma chamada validar que ativa o bind, e
    * outra referente ao tipo de validação. 
    */
    $(".validar").live("focusout", function (event) {
        //pega campo e coloca na var
        campo = $(this);


        var params = "";
        classe = campo.attr("class");


        //para verificacao do upload
        if (classe.indexOf("upload") != -1) {
            classes = classe.split(" ");

            for (var itens in classes) {
                if (classes[itens].indexOf("upload") != -1) {
                    tipo = classes[itens];

                }
            }
            params = tipo.split("*");
            params = params[1].split("-");
        } else {
            tipo = classe;
        }

        //Chama a funcao certa	

        verificaQualFuncao(tipo, campo, params);

    });

});





function verificaQualFuncao(tipo, campo, params) {
    if (tipo.indexOf("requerido") != -1)
        validaRequerido(campo);
    if (tipo.indexOf("upload") != -1)
        validaUpload(campo, params);
    if (tipo.indexOf("email") != -1)
        validaEmail(campo);
    if (tipo.indexOf("mailCadastrado") != -1)
        validaEmailCadastrado(campo);
    if (tipo.indexOf("data") != -1)
        validaData(campo);
    if (tipo.indexOf("user") != -1)
        validaUsuario(campo);
    if (tipo.indexOf("numero") != -1)
        validaIsNumero(campo);
    if (tipo.indexOf("valCpf") != -1)
        validaCpf(campo);
    if (tipo.indexOf("valCnpj") != -1)
        validaCnpj(campo);
    if (tipo.indexOf("senha") != -1)
        validaSenha(campo); 
    if (tipo.indexOf("chk") != -1)
        validaChk(campo); 
    
}


function validaChk(campo){
    if(campo.is(':checked'))
        certo(campo);	
    else
        errado(campo, "Item requerido");	
}

function validaSenha(campo){
	var valor1 = campo.val();
	var valor2 = $('.senha2').val();
	if (valor1 == valor2){
		certo(campo);	
	}
	else{
		 errado(campo, "As senhas não são iguais.");	
	}
}



function validaRequerido(campo) {

    if (campo.val() == null) {
        errado(campo, "O campo é requerido.");
    } else {

        if (tirarMascara(campo.val()).length == 0) {
            errado(campo, "O campo é requerido.");
        } else {
            certo(campo);
        }
    }
}

//Valida nome de usuario (se ja existe)
function validaUsuario(campo) {
    var nome = campo.val();

    if (nome == "") {
        errado(campo, "Nome de usuário precisa ser preenchido");
    } else {
        campo.addClass("carregandoVal");

        $.ajax({
            type: "GET",
            url: "validacao/valida_usuario/" + nome,
            //data: "",
            success: function(msg) {

                if (msg == 0) {
                    campo.removeClass("carregandoVal");
                    certo(campo);
                } else {
                    campo.removeClass("carregandoVal");
                    errado(campo, "Nome de usuário já cadastrado");
                }
            }
        });
    }
}




function validaUpload(campo, params) {

    flag = 0;

    if (campo.val() != "") {
        //pega extensao
        ext = campo.val().split(".");
        ext = ext[ext.length - 1];

        ext = ext.toLowerCase();

        $.each(params, function(key, value) {
            if (ext == value)
                flag = 1;
        });

        if (flag == 0) {
            errado(campo, "A extensão: '." + ext + "' não é válida.");
        } else {
            certo(campo);
        }
    }


}

function validaData(campo) {

    var expReg = /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/(19|20)?\d{2}$/;
    var flag = 1;
    if ((campo) && (campo.val().match(expReg)) && (campo.value != '')) {
        
    } else
        flag = 0;

    if (flag == 0) {
        errado(campo, "A data: '" + campo.val() + "' é inválida.");
    } else {
        certo(campo);
    }
}


function validaEmail(campo) {
    //pega campo pai
    var email = campo.val();

    var bolReturn = false;
    var oRegEmail = /^[a-z0-9\._\-]+\@[a-z0-9\._\-]+\.[a-z]{2,3}$/i;
    bolReturn = oRegEmail.test(email);

    if (!bolReturn) {
        errado(campo, "* O email digitado não é válido.");
    } else {
        certo(campo);
    }

}

function validaEmailCadastrado(campo) {
    var email = campo.val();


    var bolReturn = false;
    var oRegEmail = /^[a-z0-9\._\-]+\@[a-z0-9\._\-]+\.[a-z]{2,3}$/i;
    bolReturn = oRegEmail.test(email);

    if (!bolReturn) {
        errado(campo, "O email digitado não é válido.");
    } else {
        campo.addClass("carregandoVal");

        $.ajax({
            type: "GET",
            url: "validacao/validacao/valida_email/" + email,
            //data: "",
            success: function(msg) {
                alert(msg)
                if (msg == 0) {
                    campo.removeClass("carregandoVal");
                    certo(campo);
                } else {
                    campo.removeClass("carregandoVal");
                    errado(campo, "Email já cadastrado");
                }
            }
        });
    }

}

function validaCpf(campo) {
    //pega campo pai
    var cpfFull = campo.val();
    var erro = 0;

    cpf = cpfFull.replace(/\.|-|\//gi, ''); // elimina .(ponto), -(hifem) e /(barra)
    while (cpf.length < 11) cpf = "0" + cpf;
    var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
    var a = [];
    var b = new Number;
    var c = 11;
    for (i = 0; i < 11; i++) {
        a[i] = cpf.charAt(i);
        if (i < 9) b += (a[i] * --c);
    }
    if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11 - x }
    b = 0;
    c = 11;
    for (y = 0; y < 10; y++) b += (a[y] * c--);
    if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11 - x; }
    if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]) || cpf.match(expReg)) erro = 1;


    if (erro == 1) {
        errado(campo, "O CPF digitado não é válido.");
    } else {

        campo.addClass("carregandoVal");

        $.ajax({
            type: "GET",
            url: "validacao/valida_cpf/" + cpfFull,
            //data: "",
            success: function(msg) {
                if (msg == 0) {
                    campo.removeClass("carregandoVal");
                    certo(campo);
                } else {
                    campo.removeClass("carregandoVal");
                    errado(campo, "ERRO: CPF já cadastrado");
                }
            }
        });
    }

}

function validaCnpj(campo) {

    cnpj = campo.val();

    campo.addClass("carregandoVal");

    $.ajax({
        type: "GET",
        url: "validacao/valida_cnpj/" + cnpj,
        //data: "",
        success: function(msg) {
            if (msg == 0) {
                campo.removeClass("carregandoVal");
                certo(campo);
            } else {
                campo.removeClass("carregandoVal");
                errado(campo, "ERRO: CNPJ já cadastrado");
            }
        }
    });
}


function validaIsNumero(campo) {
    var valor = campo.val();

    if (isNaN(valor)) {
        errado(campo, "O campo precisa ser numérico");
    } else {
        certo(campo);
    }
}

function validaNumero(campoNormal) {

    id = campoNormal.id;

    campo = $('#' + id);
    valor = campo.val();

    novaString = '';

    for (x = 0; x < valor.length; x++) {

        letra = valor.charAt(x);

        if (!isNaN(letra)) {
            novaString += letra;
        }
    }

    novaString = novaString.replace(/ /g, "");
    campo.val(novaString);



}




function tirarMascara(valor) {
    var letras = new Array(',', '.', '-', '_', '/', '\\', '|', '(', ')');
    if (valor != null) {
        for (var i in letras) {
            valor = valor.replace(letras[i], '');
        }
    }
    return valor;

}

function errado(campo, msg) {
    var cor = '#CC4400';
    var opacity = '0.9';
    var fonte = 'Arial';
    var fontSize = '90%'

    if (!$('.msgErro').length) {
        msg = (campo.attr('msg') != '' && campo.attr('msg') != undefined) ? msg + ' <br /> ' + campo.attr('msg') : msg;


        var left = campo.position().left + (campo.width() / 2 - (campo.width() / 2) / 2);

        var setaCima = '<div style="background-color:' + cor + ';box-shadow:1px 4px 5px ' + cor + ';  height:1px;opacity:' + opacity + '; width:13px; margin:0 auto;"></div><div style="background-color:' + cor + '; box-shadow:1px 4px 5px ' + cor + '; height:1px;opacity:' + opacity + '; width:11px; margin:0 auto;"></div><div style="background-color:' + cor + '; box-shadow:1px 4px 5px ' + cor + '; height:1px;opacity:' + opacity + '; width:9px; margin:0 auto;"></div><div style="background-color:' + cor + ';box-shadow:1px 4px 5px ' + cor + ';  height:1px;opacity:' + opacity + '; width:7px; margin:0 auto;"></div><div style="background-color:' + cor + ';box-shadow:1px 4px 5px ' + cor + ';  height:1px;opacity:' + opacity + '; width:5px; margin:0 auto;"></div><div style="background-color:' + cor + '; box-shadow:1px 4px 5px ' + cor + '; height:1px;opacity:' + opacity + '; width:3px; margin:0 auto;"></div><div style="background-color:' + cor + '; box-shadow:1px 4px 5px ' + cor + '; height:1px;opacity:' + opacity + '; width:1px; margin:0 auto;"></div>';

        var setaBaixo = '<div style="background-color:' + cor + ';box-shadow:1px 4px 5px ' + cor + '; height:1px;opacity:' + opacity + '; width:1px; margin:0 auto;"></div><div style="background-color:' + cor + ';box-shadow:1px 4px 5px ' + cor + ';  height:1px;opacity:' + opacity + '; width:3px; margin:0 auto;"></div><div style="background-color:' + cor + '; box-shadow:1px 4px 5px ' + cor + '; height:1px;opacity:' + opacity + '; width:5px; margin:0 auto;"></div><div style="background-color:' + cor + '; box-shadow:1px 4px 5px ' + cor + '; height:1px;opacity:' + opacity + '; width:7px; margin:0 auto;"></div><div style="background-color:' + cor + ';box-shadow:1px 4px 5px ' + cor + ';  height:1px;opacity:' + opacity + '; width:9px; margin:0 auto;"></div><div style="background-color:' + cor + ';box-shadow:1px 4px 5px ' + cor + ';  height:1px;opacity:' + opacity + '; width:11px; margin:0 auto;"></div><div style="background-color:' + cor + '; box-shadow:1px 4px 5px ' + cor + '; height:1px;opacity:' + opacity + '; width:13px; margin:0 auto;"></div>';

        var divMsg = "<div style='min-width:250px; min-height:20px; padding:5px;box-shadow:1px 1px 6px " + cor + ";  background-color:" + cor + "; color:#fff; opacity:" + opacity + "; border-radius:6px; -webkit-border-radius:6px; -moz-border-radius:6px;'><span style='opacity:1; width:auto;  color:#fff; font-family:" + fonte + "; font-size:" + fontSize + "'>" + msg + "</span></div>";

        var divSeta = "<div style='width:20px;margin-left:10px;'>"
        divSeta += (campo.hasClass('boxBottom')) ? setaBaixo : setaCima;
        divSeta += "</div>";

        var divErrado = "<div class='msgErro' style='position:absolute; z-index:1000; left:" + left + "px;'>";
        divErrado += (campo.hasClass('boxBottom')) ? divSeta + divMsg : divMsg + divSeta;
        divErrado += "</div>";
        //alert(campo.position().top);

        campo.parent().append(divErrado);
        campo.parent().css('z-index','1000');

        var msgErro = campo.parent().children('.msgErro');
        var y = (campo.hasClass('boxBottom')) ? parseInt(campo.position().top) + campo.height() + 5 : campo.position().top - msgErro.height() - 5;
        msgErro.css('top', y + 'px');
    }
}

function certo(campo) {
    campo.parent().children('.msgErro').remove();

    //campo.removeClass("errado");
    //campo.addClass("correto");

}

function erradoSemFundo(campo, msg) {

    $(".erroNoForm").remove();
    $("#erros").html("<div class='erroNoForm'>" + msg + "</div>");
}

function certoSemFundo(campo) {
    $(".erroNoForm").remove();
}

function dump(obj) {
    var out = '';
    for (var i in obj) {
        out += i + ": " + obj[i] + "\n";
    }

    alert(out);
}
