
jQuery.extend(jQuery.validator.messages, {
    required: message.required,
    remote: message.remote,
    email: message.email,
    url: message.url,
    date: message.date,
    dateISO: message.dateISO,
    dateDE: message.dateDE,
    number: message.number,
    numberDE: message.numberDE,
    digits: message.digits,
    creditcard: message.creditcard,
    equalTo: message.equalTo,
    accept: message.accept,
    maxlength: jQuery.validator.format(message.maxlength),
    minlength: jQuery.validator.format(message.minlength),
    rangelength: jQuery.validator.format(message.rangelength),
    range: jQuery.validator.format(message.range),
    max: jQuery.validator.format(message.max),
    min: jQuery.validator.format(message.min)
});

jQuery.validator.addMethod("datePTBR", function(value) { 
    return this.optional(element) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(value);
}, "Por favor, forne&ccedil;a uma data v&aacute;lida.");


jQuery.validator.addMethod("validMultSelect", function(value, element) {
    return (element.options.length) ? true : false;
}, message.required);

jQuery.validator.addMethod("cnpj", function(value, element) {
    return this.optional(element) || isCNPJ(value);
}, message.cnpj);

jQuery.validator.addMethod("cpf", function(value, element) {
    return this.optional(element) || isCPF(value);
}, message.cpf);

jQuery.validator.addMethod("date", function(value, element) {
    return this.optional(element) || checkDate(element);
}, message.date);

jQuery.validator.addMethod("hours", function(value, element) {
    return this.optional(element) || checkHours(element);
}, message.hours);

jQuery.validator.addMethod("compareDate", function(value, element,target) {
    return this.optional(element) || compareDate(value, element, target);
}, message.compareDate);

jQuery.validator.addMethod("compareDatePassport", function(value, element,target) {
    return this.optional(element) || compareDate(value, element, target);
}, message.compareDatePassport);

jQuery.validator.addMethod("compareDateMission", function(value, element,target) {
    return this.optional(element) || compareDate(value, element, target);
}, message.compareDateMission);

jQuery.validator.addMethod("compareHour", function(value, element,target) {
    return this.optional(element) || compareHour(value, element, target);
}, message.compareHour);

jQuery.validator.addMethod("compareDateNow", function(value, element) {
    return this.optional(element) || compareDateNow(value, element);
}, message.compareDateNow);

jQuery.validator.addMethod("compareDatePrevious", function(value, element) {
    return this.optional(element) || compareDatePrevious(value, element);
}, message.compareDatePrevious);
/*
jQuery.validator.addMethod("compareDateInicioMissao", function(value, element) {
    return this.optional(element) || compareDatePrevious(value, element);
}, message.compareDateInicioMissao);
*/
jQuery.validator.addMethod("compareDateInicioMissao", function(value, element,target) {
    return this.optional(element) || compareDatePrevious(value, element, target);
}, message.compareDateInicioMissao);

jQuery.validator.addMethod("requiredValue", function(value, element) {
    return this.optional(element) || requiredValue(value);
}, message.requiredValue);

function requiredValue(value){
    if(value == ''){
        return true;
    }
    value = removeMask(value);
    return (parseInt(value, 10)) ? true : false;
}

/*
jQuery.validator.addMethod("isDay", function(value, element) {
    return this.optional(element) || isDay(value, element);
}, message.isDay);

jQuery.validator.addMethod("isDayAdmin", function(value, element) {
    return this.optional(element) || isDayAdmin(value, element);
}, message.isDayAdmin);
*/
function isCNPJ(str){

    if (str == '' || str == 'CNPJ' || str == '__.___.___/____-__'){

        return true;
    }

    str = removeMask(str);

    if (str.length != 14){
        return false;
    }

    if ((str.indexOf("-") != -1) || (str.indexOf(".") != -1) || (str.indexOf("/") != -1)){
        return false;
    }

    var df, resto, dac = "";

    df = 5*str.charAt(0)+4*str.charAt(1)+3*str.charAt(2)+2*str.charAt(3)+9*str.charAt(4)+8*str.charAt(5)+7*str.charAt(6)+6*str.charAt(7)+5*str.charAt(8)+4*str.charAt(9)+3*str.charAt(10)+2*str.charAt(11);
    resto = df % 11;
    dac += ( (resto <= 1) ? 0 : (11-resto) );
    df = 6*str.charAt(0)+5*str.charAt(1)+4*str.charAt(2)+3*str.charAt(3)+2*str.charAt(4)+9*str.charAt(5)+8*str.charAt(6)+7*str.charAt(7)+6*str.charAt(8)+5*str.charAt(9)+4*str.charAt(10)+3*str.charAt(11)+2*parseInt(dac,10);
    resto = df % 11;
    dac += ( (resto <= 1) ? 0 : (11-resto) );

    if (dac != (str.substring(str.length-2,str.length))){
        return false;
    }
    return true;
}

function isCPF(str) {

    if (str == '' || str == 'CPF' || str == '___.___.___-__'){
        return true;
    }

    str = removeMask(str);

    var c = str.substr(0,9);

    if (c == "000000000" || c == "111111111" || c == "222222222" ||
        c == "333333333" || c == "444444444" || c == "555555555" || c == "666666666" ||
        c == "777777777" || c == "888888888" || c == "999999999")
        {
        return false;
    }

    var dv = str.substr(9,2);
    var d1 = 0;
    for (i = 0; i < 9; i++){
        d1 += c.charAt(i)*(10-i);
    }

    if (d1 == 0){
        return false;
    }

    d1 = 11 - (d1 % 11);
    if (d1 > 9) d1 = 0;
    if (dv.charAt(0) != d1){
        return false;
    }

    d1 *= 2;
    for (i = 0; i < 9; i++){
        d1 += c.charAt(i)*(11-i);
    }
    d1 = 11 - (d1 % 11);
    if (d1 > 9) d1 = 0;
    if (dv.charAt(1) != d1){
        return false;
    }
    return true;
}

function checkDate(pObj) {

    if(pObj.value == '__/__/____' || pObj.value == ''){
        return true;
    }

    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 aRet = true;
    if ((pObj) && (pObj.value.match(expReg)) && (pObj.value != '')) {
        var dia = parseInt(pObj.value.substring(0,2),10);
        var mes = parseInt(pObj.value.substring(3,5),10);
        var ano = parseInt(pObj.value.substring(6,10),10);

        if ((mes == 04 || mes == 06 || mes == 09 || mes == 11) && dia > 30)
            aRet = false;
        else
        if ((ano % 4) != 0 && mes == 2 && dia > 28)
            aRet = false;
        else
        if ((ano%4) == 0 && mes == 2 && dia > 29)
            aRet = false;
    }  else
        aRet = false;
    return aRet;
}

function checkHours(pObj){

    if(pObj.value == '__:__' || pObj.value == ''){
        return true;
    }

    var horario     = pObj.value;
    var hora        = horario.substr(0,2);
    var doispontos  = horario.substr(2,1);
    var minuto      = horario.substr(3,2);
    if(horario.length!=5||isNaN(hora)||isNaN(minuto)||hora>23||minuto>59||doispontos!=":")return false;
    return true;
}

function compareHour(value, element, target){

    if(value.value == '__:__' || value.value == ''){
        return true;
    }

    var anotherValue = jQuery(target).val();

    if(anotherValue.value == '__:__' || anotherValue.value == ''){
        return true;
    }


    var ahour = anotherValue.split(':');
    var hi = parseInt(ahour[0],10);
    var mi = parseInt(ahour[1],10);

    ahour = value.split(':');
    var hf = parseInt(ahour[0],10);
    var mf = parseInt(ahour[1],10);

    if ( hf * 60 + mf * 1 <= hi * 60 + mi * 1 ) {
        return false;
    }
    return true;
}
/*
function isDay(value, element){

    if(value == '__/__/____' || value == ''){
        return true;
    }

    if ( value == getDateNow() ){
        return true;
    }else{
        return false;
    }

}
*/
/*
function isDayAdmin(value, element){

    if(value == '__/__/____' || value == ''){
        return true;
    }

    var adata = value.split('/');
    var gg = parseInt(adata[0],10);
    var mm = parseInt(adata[1],10);
    var aaaa = parseInt(adata[2],10);
    var xdata = new Date(aaaa,mm-1,gg);

    adata = getDateNow().split('/');
    gg = parseInt(adata[0],10);
    mm = parseInt(adata[1],10);
    aaaa = parseInt(adata[2],10);
    var ydata = new Date(aaaa,mm-1,gg);

    if ( xdata <= ydata ){
        return true;
    }else{
        return false;
    }

}
*/
function compareDate(value, element, target){

    if(value == '__/__/____' || value == ''){
        return true;
    }

    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    var anotherValue = jQuery(target).val();

    if(anotherValue == '__/__/____' || anotherValue == ''){
        return true;
    }

    if( re.test(value) && re.test(anotherValue) ){
        var adata = value.split('/');
        var gg = parseInt(adata[0],10);
        var mm = parseInt(adata[1],10);
        var aaaa = parseInt(adata[2],10);
        var xdata = new Date(aaaa,mm-1,gg);

        adata = anotherValue.split('/');
        gg = parseInt(adata[0],10);
        mm = parseInt(adata[1],10);
        aaaa = parseInt(adata[2],10);
        var ydata = new Date(aaaa,mm-1,gg);

        if ( ydata <= xdata )
            return true;
        else
            return false;
    } else
        return false;
}


function compareDateNow(value, element){

    if(value == '__/__/____' || value == ''){
        return true;
    }

    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    var anotherValue = getDateNow();
    if( re.test(value) && re.test(anotherValue) ){
        var adata = value.split('/');
        var gg = parseInt(adata[0],10);
        var mm = parseInt(adata[1],10);
        var aaaa = parseInt(adata[2],10);
        var xdata = new Date(aaaa,mm-1,gg);

        adata = anotherValue.split('/');
        gg = parseInt(adata[0],10);
        mm = parseInt(adata[1],10);
        aaaa = parseInt(adata[2],10);
        var ydata = new Date(aaaa,mm-1,gg);

        if ( ydata <= xdata )
            return true;
        else
            return false;
    } else
        return false;

}


function compareDatePrevious(value, element, target){

    if(value == '__/__/____' || value == ''){
        return true;
    }

    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    var anotherValue = jQuery(target).val();

    if(anotherValue == '__/__/____' || anotherValue == ''){
        return true;
    }

    return !compareDate(value, element, target);

/*
    if(value == '__/__/____' || value == ''){
        return true;
    }
    
    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    var anotherValue = getDateNow();
    if( re.test(value) && re.test(anotherValue) ){
    var adata = value.split('/');
    var gg = parseInt(adata[0],10);
    var mm = parseInt(adata[1],10);
    var aaaa = parseInt(adata[2],10);
    var xdata = new Date(aaaa,mm-1,gg);

    adata = anotherValue.split('/');
    gg = parseInt(adata[0],10);
    mm = parseInt(adata[1],10);
    aaaa = parseInt(adata[2],10);
    var ydata = new Date(aaaa,mm-1,gg);

    if ( ydata >= xdata )
        return true;
    else
        return false;
    } else
        return false;
        */
}



function getDateNow(){
    return dateNow;
}

function removeMask(str){
    return str.replace(/\D/g,"");
}

function limitTextarea(){
    $('textarea').each(function(){
        var textarea = $(this);

        if(textarea.attr('maxlength') != undefined){
            textarea.keyup(function(){
                if(textarea.val().length >= textarea.attr('maxlength')){
                    textarea.val(textarea.val().substr(0, textarea.attr('maxlength')));
                }
            })
        }
        //coloca um contador no textarea que tem o atributo minlength
        if(textarea.attr('minlength') != undefined){
            $(this).after('<em class="counter" id="counter-' + textarea.attr('id') + '" style="clear:both ; display: block ;">'+ message.counter + textarea.val().length +'</em>');
            textarea.keyup(function(){
                $('#counter-' + textarea.attr('id')).html(message.counter + textarea.val().length);
            });
        }
    });
}

