quagliato
1/14/2014 - 4:55 PM

Date validation

Date validation

function validateDate(date, fieldName, afterToday){
    if(date.length < 10){
        alert(fieldName + ': tamanho inválido.');
        return false;
    }

    if(date.charAt(2) != '/' || date.charAt(5) != '/'){
        alert(fieldName + ': formatação inválida.');
        return false;
    }
    var year = parseInt(date.substr(6, 4));
    var month = parseInt(date.substr(3, 2));
    var day = parseInt(date.substr(0, 2));

    if(!year){
        alert(fieldName + ': ano inválido - ' + date.substr(6, 4));
        return false;
    }

    if(!month || month < 1 || month > 12){
        alert(fieldName + ': mês inválido - ' + date.substr(3, 2));   
        return false;
    }

    if(!day || day < 1 || day > 31){
        alert(fieldName + ': dia inválido - ' + date.substr(0, 2));
        return false;
    }

    var major = new Array(1, 3, 5, 7, 8, 10, 12);
    var minor = new Array(4, 6, 9, 11);

    if(major.indexOf(month) != -1 && day > 31){
        alert(fieldName + ': para meses com 31 dias, o maior dia possível é 31.');
        return false;
    }else if(minor.indexOf(month) != -1 && day > 30){
        alert(fieldName + ': para meses com 30 dias, o maior dia possível é 30.');
        return false;
    }else if(month == 2){

        var leapyear = false;
        if((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0){
            leapyear = true;
        }

        if(leapyear && day > 29){
            alert(fieldName + ': para meses com até 29 dias, o maior dia possível é 29.');
            return false;
        }else if(!leapyear && day > 28){
            alert(fieldName + ': para meses com até 28 dias, o maior dia possível é 28.');
            return false;
        }
    }

    date = new Date(
        year,
        month - 1,
        day,
        0,
        0,
        0 
    );

    var now = new Date();

    if (afterToday) {
        if(date < now){
            alert(fieldName + ' não pode ser anterior a hoje.');
            return false;
        }
    }

    return true;
}