Validate age from date of birthday

by next0001

HTML

<select id="birthday_year" name="birthday_year" class="birthday year" >
    <option value="">Year</option>
    <option value="1995">1995</option>
    <option value="1994">1994</option>
    <option value="1993">1993</option>
    <option value="1992">1992</option>
    <option value="1991">1991</option>
    <option value="1990">1990</option>
    <option value="1989">1989</option>
    <option value="1988">1988</option>
    <option value="1987">1987</option>
    <option value="1986">1986</option>
    <option value="1985">1985</option>
    <option value="1984">1984</option>
    <option value="1983">1983</option>
    <option value="1982">1982</option>
    <option value="1981">1981</option>
    <option value="1980">1980</option>
</select>
<select id="birthday_month" name="birthday_month" class="birthday month" >
    <option value="">Month</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
    <option value="6">6</option>
    <option value="7">7</option>
    <option value="8">8</option>
    <option value="9">9</option>
    <option value="10">10</option>
    <option value="11">11</option>
    <option value="12">12</option>
</select>
<select id="birthday_day" name="birthday_day" class="birthday day" >
    <option value="">Day</option>
</select>
<input id="btn_submit" type="submit" value="Validate my age." />

JavaScript

function isLeapYear(year) {
    return (new Date(year , 2 , 0).getDate() == 29);
}

function getAge(birthDate) {
    var today = new Date();
    var age = today.getFullYear() - birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();

    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }

    return age;
}

function getDays(year, month) {
    var days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

    if (isLeapYear(year)) {
        days[2] = 29;
    }

    return days[month];
}

function validateDoB() {
    var birthday_year  = $('#birthday_year');
    var birthday_month = $('#birthday_month');
    var birthday_day   = $('#birthday_day');
    
    if (birthday_year.val() == '' || birthday_month.val() == '' || birthday_day.val() == '') {
        alert('Input your date of birthday, plz.');
    } else {
        // 檢查是否滿二十歲
        if (getAge(new Date(birthday_year.val(), birthday_month.val()-1, birthday_day.val())) >= 20) {
            alert('Your age is older 20.');
        } else {
            alert('Your age is under 20.');
        }
    }
    
    return false;
}

$('.birthday.year, .birthday.month').change(function(){
    var year  = $('#birthday_year');
    var month = $('#birthday_month');
    var day   = $('#birthday_day');

    var selected_day = day.val();

    if (year.val() == '' || month.val() == '') {
        return false;
    }

    var days = getDays(year.val(), month.val());
    var options = ['<option value="">日</option>'];

    for (var i = 1; i <= days; i++) {
        options.push('<option value="' + i + '">' + i + '</option>');
    }

    day.html('').append(options.join("\n"));
    day.val(Math.min(selected_day, days));
}).trigger('change');

$('#btn_submit').click(validateDoB);