Angular Numeric Restriction Directive

A directive that will restrict numeric input between two ranges, allow only even numbers, and reject all invalid and non-numeric inputs

HTML

<script src="http://code.angularjs.org/angular-1.0.0.js"></script>
<form name="testForm">
    <div ng-controller="MyCtrl">
        <input type="text" name="testInput" ng-model="number" ng-min="3" ng-max="14" required="required" numbers-only="numbers-only" />
        <div ng-show="testForm.testInput.$error.nonnumeric" style="color: red;">
            Numeric input only.
        </div>
        <div ng-show="testForm.testInput.$error.belowminimum" style="color: red;">
            Number is too small.
        </div>
        <div ng-show="testForm.testInput.$error.abovemaximum" style="color: red;">
            Number is too big.
        </div>
        <div ng-show="testForm.testInput.$error.odd" style="color: red;">
            Numeric is odd.
        </div>
    </div>
</form>

JavaScript

angular.module('myApp', []).directive('numbersOnly', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, modelCtrl) {
            element.bind('blur', function () {
                if (parseInt(element.val(), 10) < attrs.ngMin) {
                    modelCtrl.$setValidity('belowminimum', false);
                    scope.$apply(function () {
                        element.val('');
                    });
                }
            });
            modelCtrl.$parsers.push(function (inputValue) {
                // this next if is necessary for when using ng-required on your input. 
                // In such cases, when a letter is typed first, this parser will be called
                // again, and the 2nd time, the value will be undefined
                if (inputValue == undefined) return ''
                var transformedInput = inputValue.replace(/[^0-9]/g, '');
                if (transformedInput != inputValue || (parseInt(transformedInput, 10) < parseInt(attrs.ngMin, 10) && transformedInput !== '1') || parseInt(transformedInput, 10) > parseInt(attrs.ngMax, 10) || (transformedInput % 2 !== 0 && transformedInput !== '1')) {
                    if (transformedInput != inputValue) {
                        modelCtrl.$setValidity('nonnumeric', false);
                    } else {
                        modelCtrl.$setValidity('nonnumeric', true);
                    }
                    if (parseInt(transformedInput, 10) < parseInt(attrs.ngMin, 10) && transformedInput !== '1') {
                        modelCtrl.$setValidity('belowminimum', false);
                    } else {
                        modelCtrl.$setValidity('belowminimum', true);
                    }
                    if (parseInt(transformedInput, 10) > parseInt(attrs.ngMax, 10)) {
                        modelCtrl.$setValidity('abovemaximum', false);
                    } else {
                       ...