Browse Source

detect leap year in year validation

Robin Herbots 14 years ago
parent
commit
5c1a959a01
1 changed files with 97 additions and 53 deletions
  1. 97 53
      jquery.inputmask.extentions.js

+ 97 - 53
jquery.inputmask.extentions.js

@@ -6,45 +6,89 @@ Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.p
 
 Optional extentions on the jquery.inputmask base
 */
-(function($){
-$.extend($.inputmask.defaults.aliases, {
-    'dd/mm/yyyy': {
-        mask: "d/m/y",
-        definitions: {
-                    'm': { //month
-                        "validator": function(chrs, buffer) { 
-                        				var dayValue = buffer.join('').substr(0, 3);
-                        				return new RegExp("((0[1-9]|[12][0-9])\/(0[1-9]|1[012]))|(30\/(0[13-9]|1[012]))|(31\/(0[13578]|1[02]))").test(dayValue + chrs); },
-                        "cardinality": 2,
-                        "prevalidator": [{ "validator": "[01]", "cardinality": 1}]
+(function($) {
+    $.extend($.inputmask.defaults.aliases, {
+        'dd/mm/yyyy': {
+            mask: "d/m/y",
+            regex: {
+                month: new RegExp("((0[1-9]|[12][0-9])\/(0[1-9]|1[012]))|(30\/(0[13-9]|1[012]))|(31\/(0[13578]|1[02]))"),
+                year: new RegExp("(19|20)\\d\\d")
+            },
+            definitions: {
+                'm': { //month
+                    "validator": function(chrs, buffer) {
+                        var dayValue = buffer.join('').substr(0, 3);
+                        return $.inputmask.defaults.aliases['dd/mm/yyyy'].regex.month.test(dayValue + chrs);
                     },
-                    'y': { //year
-                        "validator": "(19|20)\\d\\d",
-                        "cardinality": 4,
-                        "prevalidator": [
+                    "cardinality": 2,
+                    "prevalidator": [{ "validator": "[01]", "cardinality": 1}]
+                },
+                'y': { //year
+                    "validator": function(chrs, buffer) {
+                        if ($.inputmask.defaults.aliases['dd/mm/yyyy'].regex.year.test(chrs)) {
+                            var dayMonthValue = buffer.join('').substr(0, 6);
+                            if (dayMonthValue != "29/02/")
+                                return true;
+                            else {
+                                var year = parseInt(chrs);  //detect leap year
+                                if (year % 4 == 0)
+                                    if (year % 100 == 0)
+                                        if (year % 400 == 0)
+                                            return true;
+                                        else return false;
+                                    else return true;
+                                else return false;
+                            }
+                        } else return false;
+                    },
+                    "cardinality": 4,
+                    "prevalidator": [
                         { "validator": "[12]", "cardinality": 1 },
                         { "validator": "(19|20)", "cardinality": 2 },
                         { "validator": "(19|20)\\d", "cardinality": 3 }
                         ]
-                    }
+                }
+            },
+            insertMode: false
         },
-        insertMode: false 
-    }, 
-    'mm/dd/yyyy': {
-        mask: "m/d/y",
-        definitions: {
-                    'd': { //day
-                        "validator": function(chrs, buffer) { 
-                        				var monthValue = buffer.join('').substr(0, 3);
-                        				return new RegExp("((0[1-9]|1[012])\/(0[1-9]|[12][0-9]))|((0[13-9]|1[012])\/30)|((0[13578]|1[02])\/31)").test(monthValue + chrs); },
-                        "cardinality": 2,
-                        "prevalidator": [{ "validator": function(chrs, buffer) { 
-                        									var monthValue = buffer.join('').substr(0, 3);
-                        									return new RegExp("((0[13-9]|1[012])\/[0-3])|(02\/[0-2])").test(monthValue + chrs); },
-                        				 "cardinality": 1}]
+        'mm/dd/yyyy': {
+            mask: "m/d/y",
+            regex: {
+                day: new RegExp("((0[1-9]|1[012])\/(0[1-9]|[12][0-9]))|((0[13-9]|1[012])\/30)|((0[13578]|1[02])\/31)"),
+                daypre: new RegExp("((0[13-9]|1[012])\/[0-3])|(02\/[0-2])"),
+                year: new RegExp("(19|20)\\d\\d")
+            },
+            definitions: {
+                'd': { //day
+                    "validator": function(chrs, buffer) {
+                        var monthValue = buffer.join('').substr(0, 3);
+                        return $.inputmask.defaults.aliases['mm/dd/yyyy'].regex.day.test(monthValue + chrs);
+                    },
+                    "cardinality": 2,
+                    "prevalidator": [{ "validator": function(chrs, buffer) {
+                        var monthValue = buffer.join('').substr(0, 3);
+                        return $.inputmask.defaults.aliases['mm/dd/yyyy'].regex.daypre.test(monthValue + chrs);
+                    },
+                        "cardinality": 1}]
                     },
                     'y': { //year
-                        "validator": "(19|20)\\d\\d",
+                        "validator": function(chrs, buffer) {
+                            if ($.inputmask.defaults.aliases['mm/dd/yyyy'].regex.year.test(chrs)) {
+                                var monthDayValue = buffer.join('').substr(0, 6);
+                                if (monthDayValue != "02/29/")
+                                    return true;
+                                else {
+                                    var year = parseInt(chrs);  //detect leap year
+                                    if (year % 4 == 0)
+                                        if (year % 100 == 0)
+                                            if (year % 400 == 0)
+                                                return true;
+                                            else return false;
+                                        else return true;
+                                    else return false;
+                                }
+                            } else return false;
+                        },
                         "cardinality": 4,
                         "prevalidator": [
                         { "validator": "[12]", "cardinality": 1 },
@@ -52,27 +96,27 @@ $.extend($.inputmask.defaults.aliases, {
                         { "validator": "(19|20)\\d", "cardinality": 3 }
                         ]
                     }
-        },
-        insertMode: false 
-    }, 
-    'date': {
-        alias: "dd/mm/yyyy"
-    },
-    'hh:mm:ss': {
-        mask: "h:s:s",
-        autoUnmask: false,
-        definitions: {
-            'h': {
-                "validator": "[01][0-9]|2[0-3]",
-                "cardinality": 2,
-                "prevalidator": [{ "validator": "[0-2]", "cardinality": 1}]
+                },
+                insertMode: false
+            },
+            'date': {
+                alias: "dd/mm/yyyy"
             },
-            's': {
-                "validator": "[0-5][0-9]",
-                "cardinality": 2,
-                "prevalidator": [{ "validator": "[0-5]", "cardinality": 1}]
+            'hh:mm:ss': {
+                mask: "h:s:s",
+                autoUnmask: false,
+                definitions: {
+                    'h': {
+                        "validator": "[01][0-9]|2[0-3]",
+                        "cardinality": 2,
+                        "prevalidator": [{ "validator": "[0-2]", "cardinality": 1}]
+                    },
+                    's': {
+                        "validator": "[0-5][0-9]",
+                        "cardinality": 2,
+                        "prevalidator": [{ "validator": "[0-5]", "cardinality": 1}]
+                    }
+                }
             }
-        }
-    }
-});
-})(jQuery);
+        });
+    })(jQuery);