
function shift_date_year(date, offset) {
    return (new Date(
        date.getFullYear() + offset,
        date.getMonth(),
        date.getDate()
    ));
}

function validate_checkbox(selector, message) {
    var value = $(selector + ':checked');
    if(value.size() < 1) {
        insert_error(selector, message);
        return false;
    }
    return true;
}

function validate_non_blank(selector) {
    var value = get_value(selector);
    if(is_blank(value)) {
        insert_error(selector, 'Value cannot be blank');
    }
}

function validate_numeric(selector) {
    var value = get_value(selector);
    if(!is_numeric(value)) {
        insert_error(selector, 'Value must be numeric');
        return false;
    }
    return true;
}

function validate_zip(selector) {
    if(validate_numeric(selector))
    {
        if(get_value(selector).length < 5)
            insert_error(selector, 'Value must be at least 5 numerals');
    }
}

function validate_date(selector) {
    var value = get_value(selector);
    if(has_date_format(value)) {
        if(is_valid_date(value)) {
            if(!is_through_today(value)) {
                insert_error(selector, 'This date is past today');
            }
        }
        else {
            insert_error(selector, 'This date does not exist');
        }
    }
    else if(is_blank(value)) {
        insert_error(selector, 'Value cannot be blank');
    }
    else {
        insert_error(selector, 'Please use format: mm/dd/yyyy');
    }
}

function validate_over_13(selector)
{
    var value = get_value(selector);
    var dob = new Date(value);
    var compare_dob = shift_date_year(today, -13);
    if(dob > compare_dob ) {
        return false;
    }
    return true;
}

function validate_email(selector) {
    var value = get_value(selector);
    if(is_email_address(value)) {
        return true;
    }
    else if(is_blank(value)) {
        insert_error(selector, 'Value cannot be blank');
        return false;
    }
    else {
        insert_error(selector, 'Format must be part1@part2');
        return false;
    }
}

function validate_match(selector1, selector2) {
    if(get_value(selector1) != get_value(selector2)) {
        insert_error(selector2, 'Value does not match');
    }
}

function get_value(selector) {
    return $.trim($(selector).val());
}

function is_blank(value) {
    var regex = /^$/;
    return regex.test(value);
}

function is_numeric(value) {
    var regex = /^-{0,1}\d*\.{0,1}\d+$/;
    return regex.test(value);
}

function has_date_format(value) {
    var regex = /(0[1-9]|1[012])\/(0[1-9]|[12][0-9]|3[01])\/(19|20)\d\d/;
    return regex.test(value);
}

function is_valid_date(value) {
    var month = parseInt(value.substring(0,2), 10) - 1;

    return (new Date(value)).getMonth() == month;
}

function is_through_today(value) {
    return (new Date(value)) <= today;
}

function is_email_address(value) {
    var regex = /^[^@]+\@[^@]+$/;
    return regex.test(value);
}

function clear_errors(id) {
    $('#'+id+' .form_error').remove();
}

function has_errors(id) {
    return $('#'+id+' .form_error').length > 0;
}

function insert_errors(errors) {
    for(id in errors) {
        insert_error('#'+id, errors[id]);
    }
}

function insert_error(selector, error) {
    $(selector).parent().append(
        ['<div class="form_error">', error, '</div>'].join('')
    );
}
