$(document).ready(function(){
    jQuery.validator.addMethod('noSpace', function(value, element) {
        return value.indexOf(' ') < 0 && value != '';
    }, 'No space please and don\'t leave it empty.');
    
    jQuery.validator.addMethod('notEqual', function(value, element, param) {
        return value == $(param).val() ? false : true;
    }, 'The value must be different than other.');

    // VALIDA DATA BRASIL dd/mm/YYYY
    jQuery.validator.addMethod('dateBR', function(value, element) {
        if (value.length != 10)
            return false;
        var data = value;
        var dia = data.substr(0,2);
        var barra1 = data.substr(2,1);
        var mes = data.substr(3,2);
        var barra2 = data.substr(5,1);
        var ano = data.substr(6,4);
        if (data.length != 10 || barra1 != '/' || barra2 !='/' || isNaN(dia) || isNaN(mes) || isNaN(ano) || dia > 31 || mes > 12 )
            return false;
        else if ((mes == 4 || mes == 6 || mes == 9 || mes == 11) && dia == 31)
            return false;
        else if (mes == 2 && (dia > 29 || (dia == 29 && ano%4 != 0)))
            return false;
        else if (ano < 1900)
            return false;
        return true;
    }, 'Campo exige uma Data válida.');  // Mensagem padrão

    jQuery.validator.addMethod('integer', function(value, element) {
        return this.optional(element) || /^-?\d+$/.test(value);
    }, 'A positive or negative non-decimal number please');

    // VALIDA VALOR FINAL ><= VALOR
    jQuery.validator.addMethod('valueInterval', function(value, element, parameters){
        if (value != undefined && value != '' && $(parameters[0]).val() != undefined && $(parameters[0]).val() != '') {
            var firstValue = value;
            firstValue = replaceAll(firstValue, 'R$', '');
            firstValue = replaceAll(firstValue, ' ', '');
            firstValue = replaceAll(firstValue, '.', '');
            firstValue = replaceAll(firstValue, ',', '.');
            firstValue = parseFloat(firstValue);
            var secondValue = $(parameters[0]).val();
            secondValue = replaceAll(secondValue, 'R$', '');
            secondValue = replaceAll(secondValue, ' ', '');
            secondValue = replaceAll(secondValue, '.', '');
            secondValue = replaceAll(secondValue, ',', '.');
            secondValue = parseFloat(secondValue);

            var isValid = false;
            switch(parameters[1]){
                case 'gt':
                    isValid = firstValue > secondValue;
                    break;
                case 'lt':
                    isValid = firstValue < secondValue;
                    break;
                case 'get':
                    isValid = firstValue >= secondValue;
                    break;
                case 'let':
                    isValid = firstValue <= secondValue;
                    break;
                case 'eq':
                    isValid = firstValue == secondValue;
                    break;
            }
            return isValid;
        } else
            return true;
    }, 'Campo exige um Valor Superior ou Anterior.');
    
    // Valor minimo
    jQuery.validator.addMethod('minValue', function(value, element, parameters) {
        if (value != '') {
            value = replaceAll(value, 'R$', '');
            value = replaceAll(value, ' ', '');
            value = replaceAll(value, '.', '');
            value = replaceAll(value, ',', '.');
            value = parseFloat(value);
            if (value < parameters)
                return false;
        }
        return true;
    }, 'Campo exige um valor mínimo.');

    // VALIDA HORA hh:ii:ss
    jQuery.validator.addMethod('Hour', function(value, element) {
        if(value.length != 8)
            return false;
        var horario = value;
        var hora = horario.substr(0, 2);
        var barra1 = horario.substr(2, 1);
        var minuto = horario.substr(3, 2);
        var barra2 = horario.substr(5, 1);
        var segundo = horario.substr(6, 2);

        if (horario.length != 8 || barra1 != ':' || barra2 != ':' || isNaN(hora) || isNaN(minuto) || isNaN(segundo) || hora > 23 || minuto > 59 || segundo > 59)
            return false;
        return true;
    }, 'Campo exige um Horário válido.');  // Mensagem padrão
    
    // VALIDA DATA FINAL > DATA INICIAL dd/mm/YYYY
    jQuery.validator.addMethod('dateInterval', function(value, element, parameters){ // formato BR dd/mm/YYYY
        var firstDate = value;
        var firstDay = firstDate.substr(0,2);
        var firstMonth = firstDate.substr(3,2);
        var firstYear = firstDate.substr(6,4);
        var firstDateComp = firstMonth+'/'+firstDay+'/'+firstYear;
        var firstDateComp2 = Date.parse(firstDateComp);

        var secondDate = $(parameters[0]).val();
        var secondDay = secondDate.substr(0,2);
        var secondMonth = secondDate.substr(3,2);
        var secondYear = secondDate.substr(6,4);
        var secondDateComp = secondMonth+'/'+secondDay+'/'+secondYear;
        var secondDateComp2 = Date.parse(secondDateComp);

        var isValid = false;
        switch(parameters[1]){
            case 'gt':
                isValid = firstDateComp2 > secondDateComp2;
                break;
            case 'lt':
                isValid = firstDateComp2 < secondDateComp2;
                break;
            case 'get':
                isValid = firstDateComp2 >= secondDateComp2;
                break;
            case 'let':
                isValid = firstDateComp2 <= secondDateComp2;
                break;
            case 'eq':
                isValid = firstDateComp2 == secondDateComp2;
                break;
        }
        return isValid;
    }, 'Campo exige uma Data Superior ou Anterior.');
    
    jQuery.validator.addMethod('alphanumeric', function(value, element) {
        return this.optional(element) || /^[a-zA-Z0-9-\-]+$/i.test(value);
    }, 'Letters, numbers, spaces or underscores only please');
    
    (function() {
        function stripHtml(value) {
            return value.replace(/<.[^<>]*?>/g, ' ').replace(/&nbsp;|&#160;/gi, ' ')
            .replace(/[0-9.(),;:!?%#$'"_+=\/-]*/g,'');
        }
        
        jQuery.validator.addMethod('minWords', function(value, element, params) {
            return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params;
        }, jQuery.validator.format('Please enter at least {0} words.'));
        
        jQuery.validator.addMethod('maxWords', function(value, element, params) {
            return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length < params;
        }, jQuery.validator.format('Please enter {0} words or less.'));

        jQuery.validator.addMethod('rangeWords', function(value, element, params) {
            return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1];
        }, jQuery.validator.format('Please enter between {0} and {1} words.'));

    })();

});
