浏览代码

rename extensions to more reflect the dependency

Robin Herbots 10 年之前
父节点
当前提交
8766ea71eb

+ 2 - 1
Gruntfile.js

@@ -15,7 +15,8 @@ module.exports = function(grunt) {
     for (var srcNdx in srcFiles) {
       var dstFile = srcFiles[srcNdx].replace("js/", ""),
         dstFileMin = dstFile.replace(".js", ".min.js");
-      wrapModuleLoaders(srcFiles[srcNdx], "build/" + dstFile, dstFile.indexOf("jquery") == -1 ? ["jquery"] : (dstFile.indexOf("extension") == -1 ? ["jquery", "./inputmask"] : ["jquery", "./inputmask", "./jquery.inputmask"]));
+      wrapModuleLoaders(srcFiles[srcNdx], "build/" + dstFile, dstFile.indexOf("jquery") == -1 ?
+        (dstFile.indexOf("extension") == -1 ? ["jquery"] : ["jquery", "./inputmask"]) : ["jquery", "./inputmask"]);
       uglifyConfig[dstFile] = {
         dest: 'dist/inputmask/' + dstFile,
         src: "build/" + dstFile,

+ 3 - 3
README.md

@@ -900,10 +900,10 @@ In App_Start, BundleConfig.cs
 bundles.Add(new ScriptBundle("~/bundles/inputmask").Include(
             "~/Scripts/jquery.inputmask/inputmask.js",
             "~/Scripts/jquery.inputmask/jquery.inputmask.js",
-                        "~/Scripts/jquery.inputmask/jquery.inputmask.extensions.js",
-                        "~/Scripts/jquery.inputmask/jquery.inputmask.date.extensions.js",
+                        "~/Scripts/jquery.inputmask/inputmask.extensions.js",
+                        "~/Scripts/jquery.inputmask/inputmask.date.extensions.js",
                         //and other extensions you want to include
-                        "~/Scripts/jquery.inputmask/jquery.inputmask.numeric.extensions.js"));
+                        "~/Scripts/jquery.inputmask/inputmask.numeric.extensions.js"));
 ```
 
 In Layout

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "jquery.inputmask",
-  "version": "3.1.64-45",
+  "version": "3.1.64-46",
   "main": [
     "./dist/inputmask/jquery.inputmask.js",
     "./dist/inputmask/jquery.inputmask.extensions.js",

+ 1 - 1
component.json

@@ -2,7 +2,7 @@
     "name": "jquery_inputmask",
     "repository": "robinherbots/jquery.inputmask",
     "description": "jquery.inputmask is a jquery plugin which create an input mask.",
-    "version": "3.1.64-45",
+    "version": "3.1.64-46",
     "keywords": [ "jquery", "plugins", "input", "form", "inputmask", "mask" ],
     "main": "./dist/jquery.inputmask.bundle.js",
     "scripts": [

+ 1 - 1
composer.json

@@ -1,7 +1,7 @@
 {
     "name": "robinherbots/jquery.inputmask",
     "description": "jquery.inputmask is a jquery plugin which create an input mask.",
-	"version": "3.1.64-45",
+	"version": "3.1.64-46",
     "type": "library",
     "keywords": ["jquery", "plugins", "input", "form", "inputmask", "mask"],
     "homepage": "http://robinherbots.github.io/jquery.inputmask",

+ 461 - 0
dist/inputmask/inputmask.date.extensions.js

@@ -0,0 +1,461 @@
+/*!
+* inputmask.date.extensions.js
+* http://github.com/RobinHerbots/jquery.inputmask
+* Copyright (c) 2010 - 2015 Robin Herbots
+* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+* Version: 3.1.64-46
+*/
+!function(factory) {
+    "function" == typeof define && define.amd ? define([ "jquery", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("./inputmask")) : factory(jQuery);
+}(function($) {
+    return inputmask.extendDefinitions({
+        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
+            } ]
+        },
+        d: {
+            validator: "0[1-9]|[12][0-9]|3[01]",
+            cardinality: 2,
+            prevalidator: [ {
+                validator: "[0-3]",
+                cardinality: 1
+            } ]
+        },
+        m: {
+            validator: "0[1-9]|1[012]",
+            cardinality: 2,
+            prevalidator: [ {
+                validator: "[01]",
+                cardinality: 1
+            } ]
+        },
+        y: {
+            validator: "(19|20)\\d{2}",
+            cardinality: 4,
+            prevalidator: [ {
+                validator: "[12]",
+                cardinality: 1
+            }, {
+                validator: "(19|20)",
+                cardinality: 2
+            }, {
+                validator: "(19|20)\\d",
+                cardinality: 3
+            } ]
+        }
+    }), inputmask.extendAliases({
+        "dd/mm/yyyy": {
+            mask: "1/2/y",
+            placeholder: "dd/mm/yyyy",
+            regex: {
+                val1pre: new RegExp("[0-3]"),
+                val1: new RegExp("0[1-9]|[12][0-9]|3[01]"),
+                val2pre: function(separator) {
+                    var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
+                    return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])");
+                },
+                val2: function(separator) {
+                    var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
+                    return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))");
+                }
+            },
+            leapday: "29/02/",
+            separator: "/",
+            yearrange: {
+                minyear: 1900,
+                maxyear: 2099
+            },
+            isInYearRange: function(chrs, minyear, maxyear) {
+                if (isNaN(chrs)) return !1;
+                var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length))), enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length)));
+                return (isNaN(enteredyear) ? !1 : enteredyear >= minyear && maxyear >= enteredyear) || (isNaN(enteredyear2) ? !1 : enteredyear2 >= minyear && maxyear >= enteredyear2);
+            },
+            determinebaseyear: function(minyear, maxyear, hint) {
+                var currentyear = new Date().getFullYear();
+                if (minyear > currentyear) return minyear;
+                if (currentyear > maxyear) {
+                    for (var maxYearPrefix = maxyear.toString().slice(0, 2), maxYearPostfix = maxyear.toString().slice(2, 4); maxYearPrefix + hint > maxyear; ) maxYearPrefix--;
+                    var maxxYear = maxYearPrefix + maxYearPostfix;
+                    return minyear > maxxYear ? minyear : maxxYear;
+                }
+                return currentyear;
+            },
+            onKeyDown: function(e, buffer, caretPos, opts) {
+                var $input = $(this);
+                if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) {
+                    var today = new Date();
+                    $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()), 
+                    $input.triggerHandler("setvalue.inputmask");
+                }
+            },
+            getFrontValue: function(mask, buffer, opts) {
+                for (var start = 0, length = 0, i = 0; i < mask.length && "2" != mask.charAt(i); i++) {
+                    var definition = opts.definitions[mask.charAt(i)];
+                    definition ? (start += length, length = definition.cardinality) : length++;
+                }
+                return buffer.join("").substr(start, length);
+            },
+            definitions: {
+                "1": {
+                    validator: function(chrs, maskset, pos, strict, opts) {
+                        var isValid = opts.regex.val1.test(chrs);
+                        return strict || isValid || chrs.charAt(1) != opts.separator && -1 == "-./".indexOf(chrs.charAt(1)) || !(isValid = opts.regex.val1.test("0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", 
+                        {
+                            refreshFromBuffer: {
+                                start: pos - 1,
+                                end: pos
+                            },
+                            pos: pos,
+                            c: chrs.charAt(0)
+                        });
+                    },
+                    cardinality: 2,
+                    prevalidator: [ {
+                        validator: function(chrs, maskset, pos, strict, opts) {
+                            var pchrs = chrs;
+                            isNaN(maskset.buffer[pos + 1]) || (pchrs += maskset.buffer[pos + 1]);
+                            var isValid = 1 == pchrs.length ? opts.regex.val1pre.test(pchrs) : opts.regex.val1.test(pchrs);
+                            if (!strict && !isValid) {
+                                if (isValid = opts.regex.val1.test(chrs + "0")) return maskset.buffer[pos] = chrs, 
+                                maskset.buffer[++pos] = "0", {
+                                    pos: pos,
+                                    c: "0"
+                                };
+                                if (isValid = opts.regex.val1.test("0" + chrs)) return maskset.buffer[pos] = "0", 
+                                pos++, {
+                                    pos: pos
+                                };
+                            }
+                            return isValid;
+                        },
+                        cardinality: 1
+                    } ]
+                },
+                "2": {
+                    validator: function(chrs, maskset, pos, strict, opts) {
+                        var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
+                        -1 != frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator);
+                        var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs);
+                        if (!strict && !isValid && (chrs.charAt(1) == opts.separator || -1 != "-./".indexOf(chrs.charAt(1))) && (isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0)))) return maskset.buffer[pos - 1] = "0", 
+                        {
+                            refreshFromBuffer: {
+                                start: pos - 1,
+                                end: pos
+                            },
+                            pos: pos,
+                            c: chrs.charAt(0)
+                        };
+                        if (opts.mask.indexOf("2") == opts.mask.length - 1 && isValid) {
+                            var dayMonthValue = maskset.buffer.join("").substr(4, 4) + chrs;
+                            if (dayMonthValue != opts.leapday) return !0;
+                            var year = parseInt(maskset.buffer.join("").substr(0, 4), 10);
+                            return year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1;
+                        }
+                        return isValid;
+                    },
+                    cardinality: 2,
+                    prevalidator: [ {
+                        validator: function(chrs, maskset, pos, strict, opts) {
+                            isNaN(maskset.buffer[pos + 1]) || (chrs += maskset.buffer[pos + 1]);
+                            var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
+                            -1 != frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator);
+                            var isValid = 1 == chrs.length ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs);
+                            return strict || isValid || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", 
+                            pos++, {
+                                pos: pos
+                            });
+                        },
+                        cardinality: 1
+                    } ]
+                },
+                y: {
+                    validator: function(chrs, maskset, pos, strict, opts) {
+                        if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
+                            var dayMonthValue = maskset.buffer.join("").substr(0, 6);
+                            if (dayMonthValue != opts.leapday) return !0;
+                            var year = parseInt(chrs, 10);
+                            return year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1;
+                        }
+                        return !1;
+                    },
+                    cardinality: 4,
+                    prevalidator: [ {
+                        validator: function(chrs, maskset, pos, strict, opts) {
+                            var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+                            if (!strict && !isValid) {
+                                var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1);
+                                if (isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), 
+                                {
+                                    pos: pos
+                                };
+                                if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2), 
+                                isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), 
+                                maskset.buffer[pos++] = yearPrefix.charAt(1), {
+                                    pos: pos
+                                };
+                            }
+                            return isValid;
+                        },
+                        cardinality: 1
+                    }, {
+                        validator: function(chrs, maskset, pos, strict, opts) {
+                            var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+                            if (!strict && !isValid) {
+                                var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2);
+                                if (isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(1), 
+                                {
+                                    pos: pos
+                                };
+                                if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2), 
+                                opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
+                                    var dayMonthValue = maskset.buffer.join("").substr(0, 6);
+                                    if (dayMonthValue != opts.leapday) isValid = !0; else {
+                                        var year = parseInt(chrs, 10);
+                                        isValid = year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1;
+                                    }
+                                } else isValid = !1;
+                                if (isValid) return maskset.buffer[pos - 1] = yearPrefix.charAt(0), maskset.buffer[pos++] = yearPrefix.charAt(1), 
+                                maskset.buffer[pos++] = chrs.charAt(0), {
+                                    refreshFromBuffer: {
+                                        start: pos - 3,
+                                        end: pos
+                                    },
+                                    pos: pos
+                                };
+                            }
+                            return isValid;
+                        },
+                        cardinality: 2
+                    }, {
+                        validator: function(chrs, maskset, pos, strict, opts) {
+                            return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+                        },
+                        cardinality: 3
+                    } ]
+                }
+            },
+            insertMode: !1,
+            autoUnmask: !1
+        },
+        "mm/dd/yyyy": {
+            placeholder: "mm/dd/yyyy",
+            alias: "dd/mm/yyyy",
+            regex: {
+                val2pre: function(separator) {
+                    var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
+                    return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])");
+                },
+                val2: function(separator) {
+                    var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
+                    return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)");
+                },
+                val1pre: new RegExp("[01]"),
+                val1: new RegExp("0[1-9]|1[012]")
+            },
+            leapday: "02/29/",
+            onKeyDown: function(e, buffer, caretPos, opts) {
+                var $input = $(this);
+                if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) {
+                    var today = new Date();
+                    $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), 
+                    $input.triggerHandler("setvalue.inputmask");
+                }
+            }
+        },
+        "yyyy/mm/dd": {
+            mask: "y/1/2",
+            placeholder: "yyyy/mm/dd",
+            alias: "mm/dd/yyyy",
+            leapday: "/02/29",
+            onKeyDown: function(e, buffer, caretPos, opts) {
+                var $input = $(this);
+                if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) {
+                    var today = new Date();
+                    $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()), 
+                    $input.triggerHandler("setvalue.inputmask");
+                }
+            }
+        },
+        "dd.mm.yyyy": {
+            mask: "1.2.y",
+            placeholder: "dd.mm.yyyy",
+            leapday: "29.02.",
+            separator: ".",
+            alias: "dd/mm/yyyy"
+        },
+        "dd-mm-yyyy": {
+            mask: "1-2-y",
+            placeholder: "dd-mm-yyyy",
+            leapday: "29-02-",
+            separator: "-",
+            alias: "dd/mm/yyyy"
+        },
+        "mm.dd.yyyy": {
+            mask: "1.2.y",
+            placeholder: "mm.dd.yyyy",
+            leapday: "02.29.",
+            separator: ".",
+            alias: "mm/dd/yyyy"
+        },
+        "mm-dd-yyyy": {
+            mask: "1-2-y",
+            placeholder: "mm-dd-yyyy",
+            leapday: "02-29-",
+            separator: "-",
+            alias: "mm/dd/yyyy"
+        },
+        "yyyy.mm.dd": {
+            mask: "y.1.2",
+            placeholder: "yyyy.mm.dd",
+            leapday: ".02.29",
+            separator: ".",
+            alias: "yyyy/mm/dd"
+        },
+        "yyyy-mm-dd": {
+            mask: "y-1-2",
+            placeholder: "yyyy-mm-dd",
+            leapday: "-02-29",
+            separator: "-",
+            alias: "yyyy/mm/dd"
+        },
+        datetime: {
+            mask: "1/2/y h:s",
+            placeholder: "dd/mm/yyyy hh:mm",
+            alias: "dd/mm/yyyy",
+            regex: {
+                hrspre: new RegExp("[012]"),
+                hrs24: new RegExp("2[0-4]|1[3-9]"),
+                hrs: new RegExp("[01][0-9]|2[0-4]"),
+                ampm: new RegExp("^[a|p|A|P][m|M]"),
+                mspre: new RegExp("[0-5]"),
+                ms: new RegExp("[0-5][0-9]")
+            },
+            timeseparator: ":",
+            hourFormat: "24",
+            definitions: {
+                h: {
+                    validator: function(chrs, maskset, pos, strict, opts) {
+                        if ("24" == opts.hourFormat && 24 == parseInt(chrs, 10)) return maskset.buffer[pos - 1] = "0", 
+                        maskset.buffer[pos] = "0", {
+                            refreshFromBuffer: {
+                                start: pos - 1,
+                                end: pos
+                            },
+                            c: "0"
+                        };
+                        var isValid = opts.regex.hrs.test(chrs);
+                        if (!strict && !isValid && (chrs.charAt(1) == opts.timeseparator || -1 != "-.:".indexOf(chrs.charAt(1))) && (isValid = opts.regex.hrs.test("0" + chrs.charAt(0)))) return maskset.buffer[pos - 1] = "0", 
+                        maskset.buffer[pos] = chrs.charAt(0), pos++, {
+                            refreshFromBuffer: {
+                                start: pos - 2,
+                                end: pos
+                            },
+                            pos: pos,
+                            c: opts.timeseparator
+                        };
+                        if (isValid && "24" !== opts.hourFormat && opts.regex.hrs24.test(chrs)) {
+                            var tmp = parseInt(chrs, 10);
+                            return 24 == tmp ? (maskset.buffer[pos + 5] = "a", maskset.buffer[pos + 6] = "m") : (maskset.buffer[pos + 5] = "p", 
+                            maskset.buffer[pos + 6] = "m"), tmp -= 12, 10 > tmp ? (maskset.buffer[pos] = tmp.toString(), 
+                            maskset.buffer[pos - 1] = "0") : (maskset.buffer[pos] = tmp.toString().charAt(1), 
+                            maskset.buffer[pos - 1] = tmp.toString().charAt(0)), {
+                                refreshFromBuffer: {
+                                    start: pos - 1,
+                                    end: pos + 6
+                                },
+                                c: maskset.buffer[pos]
+                            };
+                        }
+                        return isValid;
+                    },
+                    cardinality: 2,
+                    prevalidator: [ {
+                        validator: function(chrs, maskset, pos, strict, opts) {
+                            var isValid = opts.regex.hrspre.test(chrs);
+                            return strict || isValid || !(isValid = opts.regex.hrs.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", 
+                            pos++, {
+                                pos: pos
+                            });
+                        },
+                        cardinality: 1
+                    } ]
+                },
+                s: {
+                    validator: "[0-5][0-9]",
+                    cardinality: 2,
+                    prevalidator: [ {
+                        validator: function(chrs, maskset, pos, strict, opts) {
+                            var isValid = opts.regex.mspre.test(chrs);
+                            return strict || isValid || !(isValid = opts.regex.ms.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", 
+                            pos++, {
+                                pos: pos
+                            });
+                        },
+                        cardinality: 1
+                    } ]
+                },
+                t: {
+                    validator: function(chrs, maskset, pos, strict, opts) {
+                        return opts.regex.ampm.test(chrs + "m");
+                    },
+                    casing: "lower",
+                    cardinality: 1
+                }
+            },
+            insertMode: !1,
+            autoUnmask: !1
+        },
+        datetime12: {
+            mask: "1/2/y h:s t\\m",
+            placeholder: "dd/mm/yyyy hh:mm xm",
+            alias: "datetime",
+            hourFormat: "12"
+        },
+        "hh:mm t": {
+            mask: "h:s t\\m",
+            placeholder: "hh:mm xm",
+            alias: "datetime",
+            hourFormat: "12"
+        },
+        "h:s t": {
+            mask: "h:s t\\m",
+            placeholder: "hh:mm xm",
+            alias: "datetime",
+            hourFormat: "12"
+        },
+        "hh:mm:ss": {
+            mask: "h:s:s",
+            placeholder: "hh:mm:ss",
+            alias: "datetime",
+            autoUnmask: !1
+        },
+        "hh:mm": {
+            mask: "h:s",
+            placeholder: "hh:mm",
+            alias: "datetime",
+            autoUnmask: !1
+        },
+        date: {
+            alias: "dd/mm/yyyy"
+        },
+        "mm/yyyy": {
+            mask: "1/y",
+            placeholder: "mm/yyyy",
+            leapday: "donotuse",
+            separator: "/",
+            alias: "mm/dd/yyyy"
+        }
+    }), $.fn.inputmask;
+});

文件差异内容过多而无法显示
+ 8 - 0
dist/inputmask/inputmask.date.extensions.min.js


+ 107 - 0
dist/inputmask/inputmask.extensions.js

@@ -0,0 +1,107 @@
+/*!
+* inputmask.extensions.js
+* http://github.com/RobinHerbots/jquery.inputmask
+* Copyright (c) 2010 - 2015 Robin Herbots
+* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+* Version: 3.1.64-46
+*/
+!function(factory) {
+    "function" == typeof define && define.amd ? define([ "jquery", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("./inputmask")) : factory(jQuery);
+}(function($) {
+    return inputmask.extendDefinitions({
+        A: {
+            validator: "[A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]",
+            cardinality: 1,
+            casing: "upper"
+        },
+        "#": {
+            validator: "[0-9A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]",
+            cardinality: 1,
+            casing: "upper"
+        }
+    }), inputmask.extendAliases({
+        url: {
+            mask: "ir",
+            placeholder: "",
+            separator: "",
+            defaultPrefix: "http://",
+            regex: {
+                urlpre1: new RegExp("[fh]"),
+                urlpre2: new RegExp("(ft|ht)"),
+                urlpre3: new RegExp("(ftp|htt)"),
+                urlpre4: new RegExp("(ftp:|http|ftps)"),
+                urlpre5: new RegExp("(ftp:/|ftps:|http:|https)"),
+                urlpre6: new RegExp("(ftp://|ftps:/|http:/|https:)"),
+                urlpre7: new RegExp("(ftp://|ftps://|http://|https:/)"),
+                urlpre8: new RegExp("(ftp://|ftps://|http://|https://)")
+            },
+            definitions: {
+                i: {
+                    validator: function(chrs, maskset, pos, strict, opts) {
+                        return !0;
+                    },
+                    cardinality: 8,
+                    prevalidator: function() {
+                        for (var result = [], prefixLimit = 8, i = 0; prefixLimit > i; i++) result[i] = function() {
+                            var j = i;
+                            return {
+                                validator: function(chrs, maskset, pos, strict, opts) {
+                                    if (opts.regex["urlpre" + (j + 1)]) {
+                                        var k, tmp = chrs;
+                                        j + 1 - chrs.length > 0 && (tmp = maskset.buffer.join("").substring(0, j + 1 - chrs.length) + "" + tmp);
+                                        var isValid = opts.regex["urlpre" + (j + 1)].test(tmp);
+                                        if (!strict && !isValid) {
+                                            for (pos -= j, k = 0; k < opts.defaultPrefix.length; k++) maskset.buffer[pos] = opts.defaultPrefix[k], 
+                                            pos++;
+                                            for (k = 0; k < tmp.length - 1; k++) maskset.buffer[pos] = tmp[k], pos++;
+                                            return {
+                                                pos: pos
+                                            };
+                                        }
+                                        return isValid;
+                                    }
+                                    return !1;
+                                },
+                                cardinality: j
+                            };
+                        }();
+                        return result;
+                    }()
+                },
+                r: {
+                    validator: ".",
+                    cardinality: 50
+                }
+            },
+            insertMode: !1,
+            autoUnmask: !1
+        },
+        ip: {
+            mask: "i[i[i]].i[i[i]].i[i[i]].i[i[i]]",
+            definitions: {
+                i: {
+                    validator: function(chrs, maskset, pos, strict, opts) {
+                        return pos - 1 > -1 && "." != maskset.buffer[pos - 1] ? (chrs = maskset.buffer[pos - 1] + chrs, 
+                        chrs = pos - 2 > -1 && "." != maskset.buffer[pos - 2] ? maskset.buffer[pos - 2] + chrs : "0" + chrs) : chrs = "00" + chrs, 
+                        new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs);
+                    },
+                    cardinality: 1
+                }
+            }
+        },
+        email: {
+            mask: "*{1,64}[.*{1,64}][.*{1,64}][.*{1,64}]@*{1,64}[.*{2,64}][.*{2,6}][.*{1,2}]",
+            greedy: !1,
+            onBeforePaste: function(pastedValue, opts) {
+                return pastedValue = pastedValue.toLowerCase(), pastedValue.replace("mailto:", "");
+            },
+            definitions: {
+                "*": {
+                    validator: "[0-9A-Za-z!#$%&'*+/=?^_`{|}~-]",
+                    cardinality: 1,
+                    casing: "lower"
+                }
+            }
+        }
+    }), $.fn.inputmask;
+});

文件差异内容过多而无法显示
+ 8 - 0
dist/inputmask/inputmask.extensions.min.js


+ 7 - 1
dist/inputmask/inputmask.js

@@ -3,7 +3,7 @@
 * http://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2015 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.1.64-45
+* Version: 3.1.64-46
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jquery" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery")) : factory(jQuery);
@@ -1327,6 +1327,12 @@
                 el: this.el
             }) : void 0;
         }
+    }, inputmask.extendDefaults = function(options) {
+        $.extend(inputmask.prototype.defaults, options);
+    }, inputmask.extendDefinitions = function(definition) {
+        $.extend(inputmask.prototype.defaults.definitions, definition);
+    }, inputmask.extendAliases = function(alias) {
+        $.extend(inputmask.prototype.defaults.aliases, alias);
     };
     var ua = navigator.userAgent, iphone = null !== ua.match(new RegExp("iphone", "i")), androidchrome = (null !== ua.match(new RegExp("android.*safari.*", "i")), 
     null !== ua.match(new RegExp("android.*chrome.*", "i"))), androidfirefox = null !== ua.match(new RegExp("android.*firefox.*", "i")), PasteEventType = (/Kindle/i.test(ua) || /Silk/i.test(ua) || /KFTT/i.test(ua) || /KFOT/i.test(ua) || /KFJWA/i.test(ua) || /KFJWI/i.test(ua) || /KFSOWI/i.test(ua) || /KFTHWA/i.test(ua) || /KFTHWI/i.test(ua) || /KFAPWA/i.test(ua) || /KFAPWI/i.test(ua), 

文件差异内容过多而无法显示
+ 2 - 2
dist/inputmask/inputmask.min.js


文件差异内容过多而无法显示
+ 359 - 0
dist/inputmask/inputmask.numeric.extensions.js


文件差异内容过多而无法显示
+ 8 - 0
dist/inputmask/inputmask.numeric.extensions.min.js


+ 48 - 0
dist/inputmask/inputmask.phone.extensions.js

@@ -0,0 +1,48 @@
+/*!
+* inputmask.phone.extensions.js
+* http://github.com/RobinHerbots/jquery.inputmask
+* Copyright (c) 2010 - 2015 Robin Herbots
+* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+* Version: 3.1.64-46
+*/
+!function(factory) {
+    "function" == typeof define && define.amd ? define([ "jquery", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("./inputmask")) : factory(jQuery);
+}(function($) {
+    return inputmask.extendAliases({
+        phone: {
+            url: "phone-codes/phone-codes.js",
+            countrycode: "",
+            mask: function(opts) {
+                opts.definitions["#"] = opts.definitions[9];
+                var maskList = [];
+                return $.ajax({
+                    url: opts.url,
+                    async: !1,
+                    dataType: "json",
+                    success: function(response) {
+                        maskList = response;
+                    },
+                    error: function(xhr, ajaxOptions, thrownError) {
+                        alert(thrownError + " - " + opts.url);
+                    }
+                }), maskList = maskList.sort(function(a, b) {
+                    return (a.mask || a) < (b.mask || b) ? -1 : 1;
+                });
+            },
+            keepStatic: !1,
+            nojumps: !0,
+            nojumpsThreshold: 1,
+            onBeforeMask: function(value, opts) {
+                var processedValue = value.replace(/^0/g, "");
+                return (processedValue.indexOf(opts.countrycode) > 1 || -1 == processedValue.indexOf(opts.countrycode)) && (processedValue = "+" + opts.countrycode + processedValue), 
+                processedValue;
+            }
+        },
+        phonebe: {
+            alias: "phone",
+            url: "phone-codes/phone-be.js",
+            countrycode: "32",
+            nojumpsThreshold: 4
+        }
+    }), $.fn.inputmask;
+});

文件差异内容过多而无法显示
+ 8 - 0
dist/inputmask/inputmask.phone.extensions.min.js


+ 124 - 0
dist/inputmask/inputmask.regex.extensions.js

@@ -0,0 +1,124 @@
+/*!
+* inputmask.regex.extensions.js
+* http://github.com/RobinHerbots/jquery.inputmask
+* Copyright (c) 2010 - 2015 Robin Herbots
+* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+* Version: 3.1.64-46
+*/
+!function(factory) {
+    "function" == typeof define && define.amd ? define([ "jquery", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("./inputmask")) : factory(jQuery);
+}(function($) {
+    return inputmask.extendAliases({
+        Regex: {
+            mask: "r",
+            greedy: !1,
+            repeat: "*",
+            regex: null,
+            regexTokens: null,
+            tokenizer: /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g,
+            quantifierFilter: /[0-9]+[^,]/,
+            isComplete: function(buffer, opts) {
+                return new RegExp(opts.regex).test(buffer.join(""));
+            },
+            definitions: {
+                r: {
+                    validator: function(chrs, maskset, pos, strict, opts) {
+                        function regexToken(isGroup, isQuantifier) {
+                            this.matches = [], this.isGroup = isGroup || !1, this.isQuantifier = isQuantifier || !1, 
+                            this.quantifier = {
+                                min: 1,
+                                max: 1
+                            }, this.repeaterPart = void 0;
+                        }
+                        function analyseRegex() {
+                            var match, m, currentToken = new regexToken(), opengroups = [];
+                            for (opts.regexTokens = []; match = opts.tokenizer.exec(opts.regex); ) switch (m = match[0], 
+                            m.charAt(0)) {
+                              case "(":
+                                opengroups.push(new regexToken(!0));
+                                break;
+
+                              case ")":
+                                var groupToken = opengroups.pop();
+                                opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(groupToken) : currentToken.matches.push(groupToken);
+                                break;
+
+                              case "{":
+                              case "+":
+                              case "*":
+                                var quantifierToken = new regexToken(!1, !0);
+                                m = m.replace(/[{}]/g, "");
+                                var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 == mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
+                                if (quantifierToken.quantifier = {
+                                    min: mq0,
+                                    max: mq1
+                                }, opengroups.length > 0) {
+                                    var matches = opengroups[opengroups.length - 1].matches;
+                                    if (match = matches.pop(), !match.isGroup) {
+                                        var groupToken = new regexToken(!0);
+                                        groupToken.matches.push(match), match = groupToken;
+                                    }
+                                    matches.push(match), matches.push(quantifierToken);
+                                } else {
+                                    if (match = currentToken.matches.pop(), !match.isGroup) {
+                                        var groupToken = new regexToken(!0);
+                                        groupToken.matches.push(match), match = groupToken;
+                                    }
+                                    currentToken.matches.push(match), currentToken.matches.push(quantifierToken);
+                                }
+                                break;
+
+                              default:
+                                opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(m) : currentToken.matches.push(m);
+                            }
+                            currentToken.matches.length > 0 && opts.regexTokens.push(currentToken);
+                        }
+                        function validateRegexToken(token, fromGroup) {
+                            var isvalid = !1;
+                            fromGroup && (regexPart += "(", openGroupCount++);
+                            for (var mndx = 0; mndx < token.matches.length; mndx++) {
+                                var matchToken = token.matches[mndx];
+                                if (1 == matchToken.isGroup) isvalid = validateRegexToken(matchToken, !0); else if (1 == matchToken.isQuantifier) {
+                                    var crrntndx = $.inArray(matchToken, token.matches), matchGroup = token.matches[crrntndx - 1], regexPartBak = regexPart;
+                                    if (isNaN(matchToken.quantifier.max)) {
+                                        for (;matchToken.repeaterPart && matchToken.repeaterPart != regexPart && matchToken.repeaterPart.length > regexPart.length && !(isvalid = validateRegexToken(matchGroup, !0)); ) ;
+                                        isvalid = isvalid || validateRegexToken(matchGroup, !0), isvalid && (matchToken.repeaterPart = regexPart), 
+                                        regexPart = regexPartBak + matchToken.quantifier.max;
+                                    } else {
+                                        for (var i = 0, qm = matchToken.quantifier.max - 1; qm > i && !(isvalid = validateRegexToken(matchGroup, !0)); i++) ;
+                                        regexPart = regexPartBak + "{" + matchToken.quantifier.min + "," + matchToken.quantifier.max + "}";
+                                    }
+                                } else if (void 0 != matchToken.matches) for (var k = 0; k < matchToken.length && !(isvalid = validateRegexToken(matchToken[k], fromGroup)); k++) ; else {
+                                    var testExp;
+                                    if ("[" == matchToken.charAt(0)) {
+                                        testExp = regexPart, testExp += matchToken;
+                                        for (var j = 0; openGroupCount > j; j++) testExp += ")";
+                                        var exp = new RegExp("^(" + testExp + ")$");
+                                        isvalid = exp.test(bufferStr);
+                                    } else for (var l = 0, tl = matchToken.length; tl > l; l++) if ("\\" != matchToken.charAt(l)) {
+                                        testExp = regexPart, testExp += matchToken.substr(0, l + 1), testExp = testExp.replace(/\|$/, "");
+                                        for (var j = 0; openGroupCount > j; j++) testExp += ")";
+                                        var exp = new RegExp("^(" + testExp + ")$");
+                                        if (isvalid = exp.test(bufferStr)) break;
+                                    }
+                                    regexPart += matchToken;
+                                }
+                                if (isvalid) break;
+                            }
+                            return fromGroup && (regexPart += ")", openGroupCount--), isvalid;
+                        }
+                        null == opts.regexTokens && analyseRegex();
+                        var cbuffer = maskset.buffer.slice(), regexPart = "", isValid = !1, openGroupCount = 0;
+                        cbuffer.splice(pos, 0, chrs);
+                        for (var bufferStr = cbuffer.join(""), i = 0; i < opts.regexTokens.length; i++) {
+                            var regexToken = opts.regexTokens[i];
+                            if (isValid = validateRegexToken(regexToken, regexToken.isGroup)) break;
+                        }
+                        return isValid;
+                    },
+                    cardinality: 1
+                }
+            }
+        }
+    }), $.fn.inputmask;
+});

文件差异内容过多而无法显示
+ 8 - 0
dist/inputmask/inputmask.regex.extensions.min.js


+ 1 - 1
dist/inputmask/jquery.inputmask.js

@@ -3,7 +3,7 @@
 * http://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2015 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.1.64-45
+* Version: 3.1.64-46
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jquery", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("./inputmask")) : factory(jQuery);

文件差异内容过多而无法显示
+ 1 - 1
dist/inputmask/jquery.inputmask.min.js


+ 14 - 8
dist/jquery.inputmask.bundle.js

@@ -3,7 +3,7 @@
 * http://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2015 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.1.64-45
+* Version: 3.1.64-46
 */
 !function($) {
     function inputmask(options) {
@@ -1325,6 +1325,12 @@
                 el: this.el
             }) : void 0;
         }
+    }, inputmask.extendDefaults = function(options) {
+        $.extend(inputmask.prototype.defaults, options);
+    }, inputmask.extendDefinitions = function(definition) {
+        $.extend(inputmask.prototype.defaults.definitions, definition);
+    }, inputmask.extendAliases = function(alias) {
+        $.extend(inputmask.prototype.defaults.aliases, alias);
     };
     var ua = navigator.userAgent, iphone = null !== ua.match(new RegExp("iphone", "i")), androidchrome = (null !== ua.match(new RegExp("android.*safari.*", "i")), 
     null !== ua.match(new RegExp("android.*chrome.*", "i"))), androidfirefox = null !== ua.match(new RegExp("android.*firefox.*", "i")), PasteEventType = (/Kindle/i.test(ua) || /Silk/i.test(ua) || /KFTT/i.test(ua) || /KFOT/i.test(ua) || /KFJWA/i.test(ua) || /KFJWI/i.test(ua) || /KFSOWI/i.test(ua) || /KFTHWA/i.test(ua) || /KFTHWI/i.test(ua) || /KFAPWA/i.test(ua) || /KFAPWI/i.test(ua), 
@@ -1379,7 +1385,7 @@
         }
     }), $.fn.inputmask;
 }(jQuery), function($) {
-    return $.extend($.inputmask.defaults.definitions, {
+    return inputmask.extendDefinitions({
         h: {
             validator: "[01][0-9]|2[0-3]",
             cardinality: 2,
@@ -1426,7 +1432,7 @@
                 cardinality: 3
             } ]
         }
-    }), $.extend($.inputmask.defaults.aliases, {
+    }), inputmask.extendAliases({
         "dd/mm/yyyy": {
             mask: "1/2/y",
             placeholder: "dd/mm/yyyy",
@@ -1830,7 +1836,7 @@
         }
     }), $.fn.inputmask;
 }(jQuery), function($) {
-    return $.extend($.inputmask.defaults.definitions, {
+    return inputmask.extendDefinitions({
         A: {
             validator: "[A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]",
             cardinality: 1,
@@ -1841,7 +1847,7 @@
             cardinality: 1,
             casing: "upper"
         }
-    }), $.extend($.inputmask.defaults.aliases, {
+    }), inputmask.extendAliases({
         url: {
             mask: "ir",
             placeholder: "",
@@ -1927,7 +1933,7 @@
         }
     }), $.fn.inputmask;
 }(jQuery), function($) {
-    return $.extend($.inputmask.defaults.aliases, {
+    return inputmask.extendAliases({
         numeric: {
             mask: function(opts) {
                 function autoEscape(txt) {
@@ -2276,7 +2282,7 @@
         }
     }), $.fn.inputmask;
 }(jQuery), function($) {
-    return $.extend($.inputmask.defaults.aliases, {
+    return inputmask.extendAliases({
         phone: {
             url: "phone-codes/phone-codes.js",
             countrycode: "",
@@ -2314,7 +2320,7 @@
         }
     }), $.fn.inputmask;
 }(jQuery), function($) {
-    return $.extend($.inputmask.defaults.aliases, {
+    return inputmask.extendAliases({
         Regex: {
             mask: "r",
             greedy: !1,

文件差异内容过多而无法显示
+ 3 - 3
dist/jquery.inputmask.bundle.min.js


+ 603 - 0
js/inputmask.date.extensions.js

@@ -0,0 +1,603 @@
+/*
+Input Mask plugin extensions
+http://github.com/RobinHerbots/jquery.inputmask
+Copyright (c) 2010 -  Robin Herbots
+Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+Version: 0.0.0-dev
+
+Optional extensions on the jquery.inputmask base
+*/
+(function($) {
+  //date & time aliases
+  inputmask.extendDefinitions({
+    'h': { //hours
+      validator: "[01][0-9]|2[0-3]",
+      cardinality: 2,
+      prevalidator: [{
+        validator: "[0-2]",
+        cardinality: 1
+      }]
+    },
+    's': { //seconds || minutes
+      validator: "[0-5][0-9]",
+      cardinality: 2,
+      prevalidator: [{
+        validator: "[0-5]",
+        cardinality: 1
+      }]
+    },
+    'd': { //basic day
+      validator: "0[1-9]|[12][0-9]|3[01]",
+      cardinality: 2,
+      prevalidator: [{
+        validator: "[0-3]",
+        cardinality: 1
+      }]
+    },
+    'm': { //basic month
+      validator: "0[1-9]|1[012]",
+      cardinality: 2,
+      prevalidator: [{
+        validator: "[01]",
+        cardinality: 1
+      }]
+    },
+    'y': { //basic year
+      validator: "(19|20)\\d{2}",
+      cardinality: 4,
+      prevalidator: [{
+        validator: "[12]",
+        cardinality: 1
+      }, {
+        validator: "(19|20)",
+        cardinality: 2
+      }, {
+        validator: "(19|20)\\d",
+        cardinality: 3
+      }]
+    }
+  });
+  inputmask.extendAliases({
+    'dd/mm/yyyy': {
+      mask: "1/2/y",
+      placeholder: "dd/mm/yyyy",
+      regex: {
+        val1pre: new RegExp("[0-3]"), //daypre
+        val1: new RegExp("0[1-9]|[12][0-9]|3[01]"), //day
+        val2pre: function(separator) {
+          var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
+          return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])");
+        }, //monthpre
+        val2: function(separator) {
+            var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
+            return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))");
+          } //month
+      },
+      leapday: "29/02/",
+      separator: '/',
+      yearrange: {
+        minyear: 1900,
+        maxyear: 2099
+      },
+      isInYearRange: function(chrs, minyear, maxyear) {
+        if (isNaN(chrs)) return false;
+        var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length)));
+        var enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length)));
+        return (!isNaN(enteredyear) ? minyear <= enteredyear && enteredyear <= maxyear : false) ||
+          (!isNaN(enteredyear2) ? minyear <= enteredyear2 && enteredyear2 <= maxyear : false);
+      },
+      determinebaseyear: function(minyear, maxyear, hint) {
+        var currentyear = (new Date()).getFullYear();
+        if (minyear > currentyear) return minyear;
+        if (maxyear < currentyear) {
+          var maxYearPrefix = maxyear.toString().slice(0, 2);
+          var maxYearPostfix = maxyear.toString().slice(2, 4);
+          while (maxyear < maxYearPrefix + hint) {
+            maxYearPrefix--;
+          }
+          var maxxYear = maxYearPrefix + maxYearPostfix;
+          return minyear > maxxYear ? minyear : maxxYear;
+        }
+
+        return currentyear;
+      },
+      onKeyDown: function(e, buffer, caretPos, opts) {
+        var $input = $(this);
+        if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) {
+          var today = new Date();
+          $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString());
+          $input.triggerHandler('setvalue.inputmask');
+        }
+      },
+      getFrontValue: function(mask, buffer, opts) {
+        var start = 0,
+          length = 0;
+        for (var i = 0; i < mask.length; i++) {
+          if (mask.charAt(i) == "2")
+            break;
+          var definition = opts.definitions[mask.charAt(i)];
+          if (definition) {
+            start += length;
+            length = definition.cardinality;
+          } else length++;
+        }
+        return buffer.join('').substr(start, length);
+      },
+      definitions: {
+        '1': { //val1 ~ day or month
+          validator: function(chrs, maskset, pos, strict, opts) {
+            var isValid = opts.regex.val1.test(chrs);
+            if (!strict && !isValid) {
+              if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) {
+                isValid = opts.regex.val1.test("0" + chrs.charAt(0));
+                if (isValid) {
+                  maskset.buffer[pos - 1] = "0";
+                  return {
+                    "refreshFromBuffer": {
+                      start: pos - 1,
+                      end: pos
+                    },
+                    "pos": pos,
+                    "c": chrs.charAt(0)
+                  };
+                }
+              }
+            }
+            return isValid;
+          },
+          cardinality: 2,
+          prevalidator: [{
+            validator: function(chrs, maskset, pos, strict, opts) {
+              var pchrs = chrs;
+              if (!isNaN(maskset.buffer[pos + 1])) pchrs += maskset.buffer[pos + 1];
+              var isValid = pchrs.length == 1 ? opts.regex.val1pre.test(pchrs) : opts.regex.val1.test(pchrs);
+              if (!strict && !isValid) {
+                isValid = opts.regex.val1.test(chrs + "0");
+                if (isValid) {
+                  maskset.buffer[pos] = chrs;
+                  maskset.buffer[++pos] = "0";
+                  return {
+                    "pos": pos,
+                    "c": "0"
+                  };
+                }
+                isValid = opts.regex.val1.test("0" + chrs);
+                if (isValid) {
+                  maskset.buffer[pos] = "0";
+                  pos++;
+                  return {
+                    "pos": pos
+                  };
+                }
+              }
+              return isValid;
+            },
+            cardinality: 1
+          }]
+        },
+        '2': { //val2 ~ day or month
+          validator: function(chrs, maskset, pos, strict, opts) {
+            var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
+            if (frontValue.indexOf(opts.placeholder[0]) != -1) frontValue = "01" + opts.separator;
+            var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs);
+            if (!strict && !isValid) {
+              if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) {
+                isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0));
+                if (isValid) {
+                  maskset.buffer[pos - 1] = "0";
+                  return {
+                    "refreshFromBuffer": {
+                      start: pos - 1,
+                      end: pos
+                    },
+                    "pos": pos,
+                    "c": chrs.charAt(0)
+                  };
+                }
+              }
+            }
+
+            //check leap yeap
+            if ((opts.mask.indexOf("2") == opts.mask.length - 1) && isValid) {
+              var dayMonthValue = maskset.buffer.join('').substr(4, 4) + chrs;
+              if (dayMonthValue != opts.leapday)
+                return true;
+              else {
+                var year = parseInt(maskset.buffer.join('').substr(0, 4), 10); //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;
+              }
+            }
+
+            return isValid;
+          },
+          cardinality: 2,
+          prevalidator: [{
+            validator: function(chrs, maskset, pos, strict, opts) {
+              if (!isNaN(maskset.buffer[pos + 1])) chrs += maskset.buffer[pos + 1];
+              var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
+              if (frontValue.indexOf(opts.placeholder[0]) != -1) frontValue = "01" + opts.separator;
+              var isValid = chrs.length == 1 ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs);
+              if (!strict && !isValid) {
+                isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs);
+                if (isValid) {
+                  maskset.buffer[pos] = "0";
+                  pos++;
+                  return {
+                    "pos": pos
+                  };
+                }
+              }
+              return isValid;
+            },
+            cardinality: 1
+          }]
+        },
+        'y': { //year
+          validator: function(chrs, maskset, pos, strict, opts) {
+            if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
+              var dayMonthValue = maskset.buffer.join('').substr(0, 6);
+              if (dayMonthValue != opts.leapday)
+                return true;
+              else {
+                var year = parseInt(chrs, 10); //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: function(chrs, maskset, pos, strict, opts) {
+              var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+              if (!strict && !isValid) {
+                var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1);
+
+                isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+                if (isValid) {
+                  maskset.buffer[pos++] = yearPrefix.charAt(0);
+                  return {
+                    "pos": pos
+                  };
+                }
+                yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2);
+
+                isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+                if (isValid) {
+                  maskset.buffer[pos++] = yearPrefix.charAt(0);
+                  maskset.buffer[pos++] = yearPrefix.charAt(1);
+                  return {
+                    "pos": pos
+                  };
+                }
+              }
+              return isValid;
+            },
+            cardinality: 1
+          }, {
+            validator: function(chrs, maskset, pos, strict, opts) {
+              var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+              if (!strict && !isValid) {
+                var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2);
+
+                isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear);
+                if (isValid) {
+                  maskset.buffer[pos++] = yearPrefix.charAt(1);
+                  return {
+                    "pos": pos
+                  };
+                }
+
+                yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2);
+                if (opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
+                  var dayMonthValue = maskset.buffer.join('').substr(0, 6);
+                  if (dayMonthValue != opts.leapday)
+                    isValid = true;
+                  else {
+                    var year = parseInt(chrs, 10); //detect leap year
+                    if (year % 4 === 0)
+                      if (year % 100 === 0)
+                        if (year % 400 === 0)
+                          isValid = true;
+                        else isValid = false;
+                    else isValid = true;
+                    else isValid = false;
+                  }
+                } else isValid = false;
+                if (isValid) {
+                  maskset.buffer[pos - 1] = yearPrefix.charAt(0);
+                  maskset.buffer[pos++] = yearPrefix.charAt(1);
+                  maskset.buffer[pos++] = chrs.charAt(0);
+                  return {
+                    "refreshFromBuffer": {
+                      start: pos - 3,
+                      end: pos
+                    },
+                    "pos": pos
+                  };
+                }
+              }
+              return isValid;
+            },
+            cardinality: 2
+          }, {
+            validator: function(chrs, maskset, pos, strict, opts) {
+              return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+            },
+            cardinality: 3
+          }]
+        }
+      },
+      insertMode: false,
+      autoUnmask: false
+    },
+    'mm/dd/yyyy': {
+      placeholder: "mm/dd/yyyy",
+      alias: "dd/mm/yyyy", //reuse functionality of dd/mm/yyyy alias
+      regex: {
+        val2pre: function(separator) {
+          var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
+          return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])");
+        }, //daypre
+        val2: function(separator) {
+          var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
+          return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)");
+        }, //day
+        val1pre: new RegExp("[01]"), //monthpre
+        val1: new RegExp("0[1-9]|1[012]") //month
+      },
+      leapday: "02/29/",
+      onKeyDown: function(e, buffer, caretPos, opts) {
+        var $input = $(this);
+        if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) {
+          var today = new Date();
+          $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString());
+          $input.triggerHandler('setvalue.inputmask');
+        }
+      }
+    },
+    'yyyy/mm/dd': {
+      mask: "y/1/2",
+      placeholder: "yyyy/mm/dd",
+      alias: "mm/dd/yyyy",
+      leapday: "/02/29",
+      onKeyDown: function(e, buffer, caretPos, opts) {
+        var $input = $(this);
+        if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) {
+          var today = new Date();
+          $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString());
+          $input.triggerHandler('setvalue.inputmask');
+        }
+      }
+    },
+    'dd.mm.yyyy': {
+      mask: "1.2.y",
+      placeholder: "dd.mm.yyyy",
+      leapday: "29.02.",
+      separator: '.',
+      alias: "dd/mm/yyyy"
+    },
+    'dd-mm-yyyy': {
+      mask: "1-2-y",
+      placeholder: "dd-mm-yyyy",
+      leapday: "29-02-",
+      separator: '-',
+      alias: "dd/mm/yyyy"
+    },
+    'mm.dd.yyyy': {
+      mask: "1.2.y",
+      placeholder: "mm.dd.yyyy",
+      leapday: "02.29.",
+      separator: '.',
+      alias: "mm/dd/yyyy"
+    },
+    'mm-dd-yyyy': {
+      mask: "1-2-y",
+      placeholder: "mm-dd-yyyy",
+      leapday: "02-29-",
+      separator: '-',
+      alias: "mm/dd/yyyy"
+    },
+    'yyyy.mm.dd': {
+      mask: "y.1.2",
+      placeholder: "yyyy.mm.dd",
+      leapday: ".02.29",
+      separator: '.',
+      alias: "yyyy/mm/dd"
+    },
+    'yyyy-mm-dd': {
+      mask: "y-1-2",
+      placeholder: "yyyy-mm-dd",
+      leapday: "-02-29",
+      separator: '-',
+      alias: "yyyy/mm/dd"
+    },
+    'datetime': {
+      mask: "1/2/y h:s",
+      placeholder: "dd/mm/yyyy hh:mm",
+      alias: "dd/mm/yyyy",
+      regex: {
+        hrspre: new RegExp("[012]"), //hours pre
+        hrs24: new RegExp("2[0-4]|1[3-9]"),
+        hrs: new RegExp("[01][0-9]|2[0-4]"), //hours
+        ampm: new RegExp("^[a|p|A|P][m|M]"),
+        mspre: new RegExp("[0-5]"), //minutes/seconds pre
+        ms: new RegExp("[0-5][0-9]")
+      },
+      timeseparator: ':',
+      hourFormat: "24", // or 12
+      definitions: {
+        'h': { //hours
+          validator: function(chrs, maskset, pos, strict, opts) {
+            if (opts.hourFormat == "24") {
+              if (parseInt(chrs, 10) == 24) {
+                maskset.buffer[pos - 1] = "0";
+                maskset.buffer[pos] = "0";
+                return {
+                  "refreshFromBuffer": {
+                    start: pos - 1,
+                    end: pos
+                  },
+                  "c": "0"
+                };
+              }
+            }
+
+            var isValid = opts.regex.hrs.test(chrs);
+            if (!strict && !isValid) {
+              if (chrs.charAt(1) == opts.timeseparator || "-.:".indexOf(chrs.charAt(1)) != -1) {
+                isValid = opts.regex.hrs.test("0" + chrs.charAt(0));
+                if (isValid) {
+                  maskset.buffer[pos - 1] = "0";
+                  maskset.buffer[pos] = chrs.charAt(0);
+                  pos++;
+                  return {
+                    "refreshFromBuffer": {
+                      start: pos - 2,
+                      end: pos
+                    },
+                    "pos": pos,
+                    "c": opts.timeseparator
+                  };
+                }
+              }
+            }
+
+            if (isValid && opts.hourFormat !== "24" && opts.regex.hrs24.test(chrs)) {
+
+              var tmp = parseInt(chrs, 10);
+
+              if (tmp == 24) {
+                maskset.buffer[pos + 5] = "a";
+                maskset.buffer[pos + 6] = "m";
+              } else {
+                maskset.buffer[pos + 5] = "p";
+                maskset.buffer[pos + 6] = "m";
+              }
+
+              tmp = tmp - 12;
+
+              if (tmp < 10) {
+                maskset.buffer[pos] = tmp.toString();
+                maskset.buffer[pos - 1] = "0";
+              } else {
+                maskset.buffer[pos] = tmp.toString().charAt(1);
+                maskset.buffer[pos - 1] = tmp.toString().charAt(0);
+              }
+
+              return {
+                "refreshFromBuffer": {
+                  start: pos - 1,
+                  end: pos + 6
+                },
+                "c": maskset.buffer[pos]
+              };
+            }
+
+            return isValid;
+          },
+          cardinality: 2,
+          prevalidator: [{
+            validator: function(chrs, maskset, pos, strict, opts) {
+              var isValid = opts.regex.hrspre.test(chrs);
+              if (!strict && !isValid) {
+                isValid = opts.regex.hrs.test("0" + chrs);
+                if (isValid) {
+                  maskset.buffer[pos] = "0";
+                  pos++;
+                  return {
+                    "pos": pos
+                  };
+                }
+              }
+              return isValid;
+            },
+            cardinality: 1
+          }]
+        },
+        's': { //seconds || minutes
+          validator: "[0-5][0-9]",
+          cardinality: 2,
+          prevalidator: [{
+            validator: function(chrs, maskset, pos, strict, opts) {
+              var isValid = opts.regex.mspre.test(chrs);
+              if (!strict && !isValid) {
+                isValid = opts.regex.ms.test("0" + chrs);
+                if (isValid) {
+                  maskset.buffer[pos] = "0";
+                  pos++;
+                  return {
+                    "pos": pos
+                  };
+                }
+              }
+              return isValid;
+            },
+            cardinality: 1
+          }]
+        },
+        't': { //am/pm
+          validator: function(chrs, maskset, pos, strict, opts) {
+            return opts.regex.ampm.test(chrs + "m");
+          },
+          casing: "lower",
+          cardinality: 1
+        }
+      },
+      insertMode: false,
+      autoUnmask: false
+    },
+    'datetime12': {
+      mask: "1/2/y h:s t\\m",
+      placeholder: "dd/mm/yyyy hh:mm xm",
+      alias: "datetime",
+      hourFormat: "12"
+    },
+    'hh:mm t': {
+      mask: "h:s t\\m",
+      placeholder: "hh:mm xm",
+      alias: "datetime",
+      hourFormat: "12"
+    },
+    'h:s t': {
+      mask: "h:s t\\m",
+      placeholder: "hh:mm xm",
+      alias: "datetime",
+      hourFormat: "12"
+    },
+    'hh:mm:ss': {
+      mask: "h:s:s",
+      placeholder: "hh:mm:ss",
+      alias: "datetime",
+      autoUnmask: false
+    },
+    'hh:mm': {
+      mask: "h:s",
+      placeholder: "hh:mm",
+      alias: "datetime",
+      autoUnmask: false
+    },
+    'date': {
+      alias: "dd/mm/yyyy" // "mm/dd/yyyy"
+    },
+    'mm/yyyy': {
+      mask: "1/y",
+      placeholder: "mm/yyyy",
+      leapday: "donotuse",
+      separator: '/',
+      alias: "mm/dd/yyyy"
+    }
+  });
+
+  return $.fn.inputmask;
+})(jQuery);

+ 129 - 0
js/inputmask.extensions.js

@@ -0,0 +1,129 @@
+/*
+Input Mask plugin extensions
+http://github.com/RobinHerbots/jquery.inputmask
+Copyright (c) 2010 -  Robin Herbots
+Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+Version: 0.0.0-dev
+
+Optional extensions on the jquery.inputmask base
+*/
+(function($) {
+  //extra definitions
+  inputmask.extendDefinitions({
+    'A': {
+      validator: "[A-Za-z\u0410-\u044F\u0401\u0451\u00C0-\u00FF\u00B5]",
+      cardinality: 1,
+      casing: "upper" //auto uppercasing
+    },
+    '#': {
+      validator: "[0-9A-Za-z\u0410-\u044F\u0401\u0451\u00C0-\u00FF\u00B5]",
+      cardinality: 1,
+      casing: "upper"
+    }
+  });
+  inputmask.extendAliases({
+    'url': {
+      mask: "ir",
+      placeholder: "",
+      separator: "",
+      defaultPrefix: "http://",
+      regex: {
+        urlpre1: new RegExp("[fh]"),
+        urlpre2: new RegExp("(ft|ht)"),
+        urlpre3: new RegExp("(ftp|htt)"),
+        urlpre4: new RegExp("(ftp:|http|ftps)"),
+        urlpre5: new RegExp("(ftp:/|ftps:|http:|https)"),
+        urlpre6: new RegExp("(ftp://|ftps:/|http:/|https:)"),
+        urlpre7: new RegExp("(ftp://|ftps://|http://|https:/)"),
+        urlpre8: new RegExp("(ftp://|ftps://|http://|https://)")
+      },
+      definitions: {
+        'i': {
+          validator: function(chrs, maskset, pos, strict, opts) {
+            return true;
+          },
+          cardinality: 8,
+          prevalidator: (function() {
+            var result = [],
+              prefixLimit = 8;
+            for (var i = 0; i < prefixLimit; i++) {
+              result[i] = (function() {
+                var j = i;
+                return {
+                  validator: function(chrs, maskset, pos, strict, opts) {
+                    if (opts.regex["urlpre" + (j + 1)]) {
+                      var tmp = chrs,
+                        k;
+                      if (((j + 1) - chrs.length) > 0) {
+                        tmp = maskset.buffer.join('').substring(0, ((j + 1) - chrs.length)) + "" + tmp;
+                      }
+                      var isValid = opts.regex["urlpre" + (j + 1)].test(tmp);
+                      if (!strict && !isValid) {
+                        pos = pos - j;
+                        for (k = 0; k < opts.defaultPrefix.length; k++) {
+                          maskset.buffer[pos] = opts.defaultPrefix[k];
+                          pos++;
+                        }
+                        for (k = 0; k < tmp.length - 1; k++) {
+                          maskset.buffer[pos] = tmp[k];
+                          pos++;
+                        }
+                        return {
+                          "pos": pos
+                        };
+                      }
+                      return isValid;
+                    } else {
+                      return false;
+                    }
+                  },
+                  cardinality: j
+                };
+              })();
+            }
+            return result;
+          })()
+        },
+        "r": {
+          validator: ".",
+          cardinality: 50
+        }
+      },
+      insertMode: false,
+      autoUnmask: false
+    },
+    "ip": { //ip-address mask
+      mask: "i[i[i]].i[i[i]].i[i[i]].i[i[i]]",
+      definitions: {
+        'i': {
+          validator: function(chrs, maskset, pos, strict, opts) {
+            if (pos - 1 > -1 && maskset.buffer[pos - 1] != ".") {
+              chrs = maskset.buffer[pos - 1] + chrs;
+              if (pos - 2 > -1 && maskset.buffer[pos - 2] != ".") {
+                chrs = maskset.buffer[pos - 2] + chrs;
+              } else chrs = "0" + chrs;
+            } else chrs = "00" + chrs;
+            return new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs);
+          },
+          cardinality: 1
+        }
+      }
+    },
+    "email": {
+      mask: "*{1,64}[.*{1,64}][.*{1,64}][.*{1,64}]@*{1,64}[.*{2,64}][.*{2,6}][.*{1,2}]",
+      greedy: false,
+      onBeforePaste: function(pastedValue, opts) {
+        pastedValue = pastedValue.toLowerCase();
+        return pastedValue.replace("mailto:", "");
+      },
+      definitions: {
+        '*': {
+          validator: "[0-9A-Za-z!#$%&'*+/=?^_`{|}~\-]",
+          cardinality: 1,
+          casing: "lower"
+        }
+      }
+    }
+  });
+  return $.fn.inputmask;
+})(jQuery);

+ 595 - 0
js/inputmask.numeric.extensions.js

@@ -0,0 +1,595 @@
+/*
+Input Mask plugin extensions
+http://github.com/RobinHerbots/jquery.inputmask
+Copyright (c) 2010 -  Robin Herbots
+Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+Version: 0.0.0-dev
+
+Optional extensions on the jquery.inputmask base
+*/
+(function($) {
+  //number aliases
+  inputmask.extendAliases({
+    'numeric': {
+      mask: function(opts) {
+        function autoEscape(txt) {
+          var escapedTxt = "";
+          for (var i = 0; i < txt.length; i++) {
+            escapedTxt += opts.definitions[txt[i]] ? "\\" + txt[i] : txt[i];
+          }
+          return escapedTxt;
+        }
+        if (opts.repeat !== 0 && isNaN(opts.integerDigits)) {
+          opts.integerDigits = opts.repeat;
+        }
+        opts.repeat = 0;
+        if (opts.groupSeparator == opts.radixPoint) { //treat equal separator and radixpoint
+          if (opts.radixPoint == ".")
+            opts.groupSeparator = ",";
+          else if (opts.radixPoint == ",")
+            opts.groupSeparator = ".";
+          else opts.groupSeparator = "";
+        }
+        if (opts.groupSeparator === " ") { //prevent conflict with default skipOptionalPartCharacter
+          opts.skipOptionalPartCharacter = undefined;
+        }
+        opts.autoGroup = opts.autoGroup && opts.groupSeparator != "";
+        if (opts.autoGroup) {
+          if (typeof opts.groupSize == "string" && isFinite(opts.groupSize)) opts.groupSize = parseInt(opts.groupSize);
+          if (isFinite(opts.integerDigits)) {
+            var seps = Math.floor(opts.integerDigits / opts.groupSize);
+            var mod = opts.integerDigits % opts.groupSize;
+            opts.integerDigits = parseInt(opts.integerDigits) + (mod == 0 ? seps - 1 : seps);
+          }
+        }
+
+        //enforce placeholder to single
+        if (opts.placeholder.length > 1)
+          opts.placeholder = opts.placeholder.charAt(0);
+        //only allow radixfocus when placeholder = 0
+        opts.radixFocus = opts.radixFocus && opts.placeholder == "0";
+
+        opts.definitions[";"] = opts.definitions["~"]; //clone integer def for decimals
+        opts.definitions[";"].definitionSymbol = "~";
+
+        var mask = autoEscape(opts.prefix);
+        mask += "[+]";
+        mask += "~{1," + opts.integerDigits + "}";
+        if (opts.digits != undefined && (isNaN(opts.digits) || parseInt(opts.digits) > 0)) {
+          if (opts.digitsOptional)
+            mask += "[" + (opts.decimalProtect ? ":" : opts.radixPoint) + ";{" + opts.digits + "}]";
+          else mask += (opts.decimalProtect ? ":" : opts.radixPoint) + ";{" + opts.digits + "}";
+        }
+        if (opts.negationSymbol.back != "")
+          mask += "[-]";
+        mask += autoEscape(opts.suffix);
+
+        opts.greedy = false; //enforce greedy false
+        return mask;
+      },
+      placeholder: "",
+      greedy: false,
+      digits: "*", //number of fractionalDigits
+      digitsOptional: true,
+      groupSeparator: "", //",", // | "."
+      radixPoint: ".",
+      radixFocus: true,
+      groupSize: 3,
+      autoGroup: false,
+      allowPlus: true,
+      allowMinus: true,
+      negationSymbol: {
+        front: "-", //"("
+        back: "" //")"
+      },
+      integerDigits: "+", //number of integerDigits
+      prefix: "",
+      suffix: "",
+      rightAlign: true,
+      decimalProtect: true, //do not allow assumption of decimals input without entering the radixpoint
+      min: undefined, //minimum value
+      max: undefined, //maximum value
+      postFormat: function(buffer, pos, reformatOnly, opts) { //this needs to be removed // this is crap
+        //console.log("input " + buffer);
+        var negationStrip = false;
+
+        var suffixStripped = false;
+        if (buffer.length >= opts.suffix.length && buffer.join('').indexOf(opts.suffix) == (buffer.length - opts.suffix.length)) {
+          buffer.length = buffer.length - opts.suffix.length; //strip suffix
+          suffixStripped = true;
+        }
+        //position overflow corrections
+        pos = pos >= buffer.length ? buffer.length - 1 : (pos < opts.prefix.length ? opts.prefix.length : pos);
+
+        var needsRefresh = false,
+          charAtPos = buffer[pos];
+        if (opts.groupSeparator == "" ||
+          ($.inArray(opts.radixPoint, buffer) != -1 && pos > $.inArray(opts.radixPoint, buffer)) ||
+          new RegExp('[' + $.inputmask.escapeRegex(opts.negationSymbol.front) + '\+]').test(charAtPos)
+        ) {
+          if (suffixStripped) {
+            for (var i = 0, l = opts.suffix.length; i < l; i++) {
+              buffer.push(opts.suffix.charAt(i));
+            }
+          }
+          //console.log("return input " + buffer);
+          return {
+            pos: pos
+          };
+        }
+
+        var cbuf = buffer.slice();
+        if (charAtPos == opts.groupSeparator) {
+          cbuf.splice(pos--, 1);
+          charAtPos = cbuf[pos];
+        }
+        if (reformatOnly) {
+          if (charAtPos != opts.radixPoint) cbuf[pos] = "?";
+        } else cbuf.splice(pos, 0, "?"); //set position indicator
+        var bufVal = cbuf.join(''),
+          bufValOrigin = bufVal;
+        if (bufVal.length > 0 && opts.autoGroup || (reformatOnly && bufVal.indexOf(opts.groupSeparator) != -1)) {
+          var escapedGroupSeparator = $.inputmask.escapeRegex(opts.groupSeparator);
+          needsRefresh = bufVal.indexOf(opts.groupSeparator) == 0;
+          bufVal = bufVal.replace(new RegExp(escapedGroupSeparator, "g"), '');
+          var radixSplit = bufVal.split(opts.radixPoint);
+          bufVal = opts.radixPoint == "" ? bufVal : radixSplit[0];
+          if (bufVal != (opts.prefix + "?0") && bufVal.length >= (opts.groupSize + opts.prefix.length)) {
+            //needsRefresh = true;
+            var reg = new RegExp('([-\+]?[\\d\?]+)([\\d\?]{' + opts.groupSize + '})');
+            while (reg.test(bufVal)) {
+              bufVal = bufVal.replace(reg, '$1' + opts.groupSeparator + '$2');
+              bufVal = bufVal.replace(opts.groupSeparator + opts.groupSeparator, opts.groupSeparator);
+            }
+          }
+          if (opts.radixPoint != "" && radixSplit.length > 1)
+            bufVal += opts.radixPoint + radixSplit[1];
+        }
+        needsRefresh = bufValOrigin != bufVal;
+        buffer.length = bufVal.length; //align the length
+        for (var i = 0, l = bufVal.length; i < l; i++) {
+          buffer[i] = bufVal.charAt(i);
+        }
+        var newPos = $.inArray("?", buffer);
+        if (newPos == -1 && charAtPos == opts.radixPoint) newPos = $.inArray(opts.radixPoint, buffer);
+        if (reformatOnly) buffer[newPos] = charAtPos;
+        else buffer.splice(newPos, 1);
+
+        if (!needsRefresh && suffixStripped) {
+          for (var i = 0, l = opts.suffix.length; i < l; i++) {
+            buffer.push(opts.suffix.charAt(i));
+          }
+        }
+        //console.log("formatted " + buffer + " refresh " + needsRefresh);
+        return {
+          pos: newPos,
+          "refreshFromBuffer": needsRefresh,
+          "buffer": buffer
+        };
+      },
+      onBeforeWrite: function(e, buffer, caretPos, opts) {
+        if (e && e.type == "blur") {
+          //handle minvalue
+          var maskedValue = buffer.join(''),
+            processValue = maskedValue.replace(opts.prefix, "");
+          processValue = processValue.replace(opts.suffix, "");
+          processValue = processValue.replace(new RegExp($.inputmask.escapeRegex(opts.groupSeparator), "g"), "");
+          if (opts.radixPoint === ",") processValue = processValue.replace($.inputmask.escapeRegex(opts.radixPoint), ".");
+
+          if (isFinite(processValue)) {
+            if (isFinite(opts.min) && parseFloat(processValue) < parseFloat(opts.min)) {
+              return $.extend(true, {
+                "refreshFromBuffer": true,
+                "buffer": (opts.prefix + opts.min).split('')
+              }, opts.postFormat((opts.prefix + opts.min).split(''), 0, true, opts));
+            }
+          }
+
+          var tmpBufSplit = opts.radixPoint != "" ? buffer.join('').split(opts.radixPoint) : [buffer.join('')],
+            matchRslt = tmpBufSplit[0].match(opts.regex.integerPart(opts)),
+            matchRsltDigits = tmpBufSplit.length == 2 ? tmpBufSplit[1].match(opts.regex.integerNPart(opts)) : undefined;
+          if (matchRslt && (matchRslt[0] == opts.negationSymbol.front + "0" || matchRslt[0] == opts.negationSymbol.front || matchRslt[0] == "+") && (matchRsltDigits == undefined || matchRsltDigits[0].match(/^0+$/))) {
+            buffer.splice(matchRslt.index, 1);
+          }
+          var radixPosition = $.inArray(opts.radixPoint, buffer);
+          if (radixPosition != -1 && isFinite(opts.digits) && !opts.digitsOptional) {
+            for (var i = 1; i <= opts.digits; i++) {
+              if (buffer[radixPosition + i] == undefined || buffer[radixPosition + i] == opts.placeholder.charAt(0)) buffer[radixPosition + i] = "0";
+            }
+            return {
+              "refreshFromBuffer": true,
+              "buffer": buffer
+            };
+          }
+        }
+
+        if (opts.autoGroup) {
+          var rslt = opts.postFormat(buffer, caretPos - 1, true, opts);
+          rslt.caret = caretPos <= opts.prefix.length ? rslt.pos : rslt.pos + 1;
+          return rslt;
+        }
+      },
+      regex: {
+        integerPart: function(opts) {
+          return new RegExp('[' + $.inputmask.escapeRegex(opts.negationSymbol.front) + '\+]?\\d+');
+        },
+        integerNPart: function(opts) {
+          return new RegExp('[\\d' + $.inputmask.escapeRegex(opts.groupSeparator) + ']+');
+        }
+      },
+      signHandler: function(chrs, maskset, pos, strict, opts) {
+        if (!strict && (opts.allowMinus && chrs === "-") || (opts.allowPlus && chrs === "+")) {
+          var matchRslt = maskset.buffer.join('').match(opts.regex.integerPart(opts));
+
+          if (matchRslt && matchRslt[0].length > 0) {
+            if (maskset.buffer[matchRslt.index] == (chrs === "-" ? "+" : opts.negationSymbol.front)) {
+              if (chrs == "-") {
+                if (opts.negationSymbol.back != "")
+                  return {
+                    "pos": matchRslt.index,
+                    "c": opts.negationSymbol.front,
+                    "remove": matchRslt.index,
+                    "caret": pos,
+                    "insert": {
+                      "pos": maskset["buffer"].length - opts.suffix.length - 1,
+                      "c": opts.negationSymbol.back
+                    }
+                  };
+                else return {
+                  "pos": matchRslt.index,
+                  "c": opts.negationSymbol.front,
+                  "remove": matchRslt.index,
+                  "caret": pos
+                };
+              } else {
+                if (opts.negationSymbol.back != "")
+                  return {
+                    "pos": matchRslt.index,
+                    "c": "+",
+                    "remove": [matchRslt.index, maskset["buffer"].length - opts.suffix.length - 1],
+                    "caret": pos
+                  };
+                else return {
+                  "pos": matchRslt.index,
+                  "c": "+",
+                  "remove": matchRslt.index,
+                  "caret": pos
+                };
+              }
+            } else if (maskset.buffer[matchRslt.index] == (chrs === "-" ? opts.negationSymbol.front : "+")) {
+              if (chrs == "-" && opts.negationSymbol.back != "") {
+                return {
+                  "remove": [matchRslt.index, maskset["buffer"].length - opts.suffix.length - 1],
+                  "caret": pos - 1
+                };
+              } else {
+                return {
+                  "remove": matchRslt.index,
+                  "caret": pos - 1
+                };
+              }
+            } else {
+              if (chrs == "-") {
+                if (opts.negationSymbol.back != "")
+                  return {
+                    "pos": matchRslt.index,
+                    "c": opts.negationSymbol.front,
+                    "caret": pos + 1,
+                    "insert": {
+                      "pos": maskset["buffer"].length - opts.suffix.length,
+                      "c": opts.negationSymbol.back
+                    }
+                  };
+                else return {
+                  "pos": matchRslt.index,
+                  "c": opts.negationSymbol.front,
+                  "caret": pos + 1
+                };
+              } else {
+                return {
+                  "pos": matchRslt.index,
+                  "c": chrs,
+                  "caret": pos + 1
+                };
+              }
+            }
+          }
+        }
+        return false;
+      },
+      radixHandler: function(chrs, maskset, pos, strict, opts) {
+        if (!strict && chrs === opts.radixPoint && opts.digits > 0) {
+          var radixPos = $.inArray(opts.radixPoint, maskset.buffer),
+            integerValue = maskset.buffer.join('').match(opts.regex.integerPart(opts));
+
+          if (radixPos != -1 && maskset["validPositions"][radixPos]) {
+            if (maskset["validPositions"][radixPos - 1])
+              return {
+                "caret": radixPos + 1
+              };
+            else return {
+              "pos": integerValue.index,
+              c: integerValue[0],
+              "caret": radixPos + 1
+            };
+          } else if (!integerValue || (integerValue["0"] == "0" && (integerValue.index + 1) != pos)) {
+            maskset.buffer[integerValue ? integerValue.index : pos] = "0";
+            return {
+              "pos": (integerValue ? integerValue.index : pos) + 1
+            };
+          }
+        }
+        return false;
+      },
+      leadingZeroHandler: function(chrs, maskset, pos, strict, opts) {
+        var matchRslt = maskset.buffer.join('').match(opts.regex.integerNPart(opts)),
+          radixPosition = $.inArray(opts.radixPoint, maskset.buffer);
+        if (matchRslt && !strict && (radixPosition == -1 || pos <= radixPosition)) {
+          if (matchRslt["0"].indexOf("0") == 0) {
+            if (pos < opts.prefix.length) pos = matchRslt.index; //position
+            var _radixPosition = $.inArray(opts.radixPoint, maskset._buffer);
+            var digitsMatch = maskset._buffer && maskset.buffer.slice(radixPosition).join('') == maskset._buffer.slice(_radixPosition).join('') || parseInt(maskset.buffer.slice(radixPosition + 1).join('')) == 0;
+            var integerMatch = maskset._buffer && maskset.buffer.slice(matchRslt.index, radixPosition).join('') == maskset._buffer.slice(opts.prefix.length, _radixPosition).join('') || maskset.buffer.slice(matchRslt.index, radixPosition).join('') == "0";
+
+            if (radixPosition == -1 || digitsMatch && integerMatch) {
+              maskset.buffer.splice(matchRslt.index, 1);
+              pos = pos > matchRslt.index ? pos - 1 : matchRslt.index;
+              return {
+                "pos": pos,
+                "remove": matchRslt.index
+              };
+            } else if (matchRslt.index + 1 == pos || chrs == "0") {
+              maskset.buffer.splice(matchRslt.index, 1);
+              pos = matchRslt.index;
+              return {
+                "pos": pos,
+                "remove": matchRslt.index
+              };
+            }
+          } else if (chrs === "0" && pos <= matchRslt.index && matchRslt["0"] != opts.groupSeparator) {
+            return false;
+          }
+        }
+        return true;
+      },
+      postValidation: function(buffer, opts) {
+        //handle maxvalue
+        var isValid = true,
+          maskedValue = buffer.join(''),
+          processValue = maskedValue.replace(opts.prefix, "");
+        processValue = processValue.replace(opts.suffix, "");
+        processValue = processValue.replace(new RegExp($.inputmask.escapeRegex(opts.groupSeparator), "g"), "");
+        if (opts.radixPoint === ",") processValue = processValue.replace($.inputmask.escapeRegex(opts.radixPoint), ".");
+        //handle negation symbol
+        processValue = processValue.replace(new RegExp("^" + $.inputmask.escapeRegex(opts.negationSymbol.front)), "-");
+        processValue = processValue.replace(new RegExp($.inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "");
+
+
+        if (isFinite(processValue)) {
+          if (isFinite(opts.max)) {
+            isValid = parseFloat(processValue) <= parseFloat(opts.max);
+          }
+        }
+
+        return isValid;
+      },
+      definitions: {
+        '~': {
+          validator: function(chrs, maskset, pos, strict, opts) {
+            var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
+            if (!isValid) {
+              isValid = opts.radixHandler(chrs, maskset, pos, strict, opts);
+              if (!isValid) {
+                isValid = strict ? new RegExp("[0-9" + $.inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs);
+                if (isValid === true) {
+                  isValid = opts.leadingZeroHandler(chrs, maskset, pos, strict, opts);
+                  if (isValid === true) {
+                    //handle overwrite when fixed precision
+                    var radixPosition = $.inArray(opts.radixPoint, maskset.buffer);
+                    if (opts.digitsOptional === false && pos > radixPosition && !strict) {
+                      isValid = {
+                        "pos": pos,
+                        "remove": pos
+                      };
+                    } else isValid = {
+                      pos: pos
+                    };
+                  }
+                }
+              }
+            }
+
+            return isValid;
+          },
+          cardinality: 1,
+          prevalidator: null
+        },
+        '+': {
+          validator: function(chrs, maskset, pos, strict, opts) {
+            var isValid = opts.signHandler(chrs, maskset, pos, strict, opts),
+              nbl;
+            if (!isValid && ((strict && opts.allowMinus && chrs === opts.negationSymbol.front) || (opts.allowMinus && chrs == "-") || (opts.allowPlus && chrs == "+"))) {
+              if (chrs == "-") {
+                if (opts.negationSymbol.back != "")
+                  isValid = {
+                    "pos": pos,
+                    "c": chrs === "-" ? opts.negationSymbol.front : "+",
+                    "caret": pos + 1,
+                    "insert": {
+                      "pos": maskset["buffer"].length,
+                      "c": opts.negationSymbol.back
+                    }
+                  };
+                else isValid = {
+                  "pos": pos,
+                  "c": chrs === "-" ? opts.negationSymbol.front : "+",
+                  "caret": pos + 1
+                };
+              } else {
+                isValid = true;
+              }
+            }
+            return isValid;
+          },
+          cardinality: 1,
+          prevalidator: null,
+          placeholder: ''
+        },
+        '-': {
+          validator: function(chrs, maskset, pos, strict, opts) {
+            var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
+            if (!isValid && strict && opts.allowMinus && chrs === opts.negationSymbol.back) {
+              isValid = true;
+            }
+            return isValid;
+          },
+          cardinality: 1,
+          prevalidator: null,
+          placeholder: ''
+        },
+        ':': {
+          validator: function(chrs, maskset, pos, strict, opts) {
+            var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
+            if (!isValid) {
+              var radix = "[" + $.inputmask.escapeRegex(opts.radixPoint) + "]";
+              isValid = new RegExp(radix).test(chrs);
+              if (isValid && maskset["validPositions"][pos] && maskset["validPositions"][pos]["match"].placeholder == opts.radixPoint) {
+                isValid = {
+                  "caret": pos + 1
+                };
+              }
+            }
+            return isValid;
+          },
+          cardinality: 1,
+          prevalidator: null,
+          placeholder: function(opts) {
+            return opts.radixPoint;
+          }
+        }
+      },
+      insertMode: true,
+      autoUnmask: false,
+      unmaskAsNumber: false,
+      onUnMask: function(maskedValue, unmaskedValue, opts) {
+        var processValue = maskedValue.replace(opts.prefix, "");
+        processValue = processValue.replace(opts.suffix, "");
+        processValue = processValue.replace(new RegExp($.inputmask.escapeRegex(opts.groupSeparator), "g"), "");
+        if (opts.unmaskAsNumber) {
+          processValue = processValue.replace($.inputmask.escapeRegex.call(this, opts.radixPoint), ".");
+          return Number(processValue);
+        }
+        return processValue;
+      },
+      isComplete: function(buffer, opts) {
+        var maskedValue = buffer.join(''),
+          bufClone = buffer.slice();
+        //verify separator positions
+        opts.postFormat(bufClone, 0, true, opts);
+        if (bufClone.join('') != maskedValue) return false;
+
+        var processValue = maskedValue.replace(opts.prefix, "");
+        processValue = processValue.replace(opts.suffix, "");
+        processValue = processValue.replace(new RegExp($.inputmask.escapeRegex(opts.groupSeparator), "g"), "");
+        if (opts.radixPoint === ",") processValue = processValue.replace($.inputmask.escapeRegex(opts.radixPoint), ".");
+        return isFinite(processValue);
+      },
+      onBeforeMask: function(initialValue, opts) {
+        if (opts.radixPoint != "" && isFinite(initialValue)) {
+          initialValue = initialValue.toString().replace(".", opts.radixPoint);
+        } else {
+          var kommaMatches = initialValue.match(/,/g);
+          var dotMatches = initialValue.match(/\./g);
+          if (dotMatches && kommaMatches) {
+            if (dotMatches.length > kommaMatches.length) {
+              initialValue = initialValue.replace(/\./g, "");
+              initialValue = initialValue.replace(",", opts.radixPoint);
+            } else if (kommaMatches.length > dotMatches.length) {
+              initialValue = initialValue.replace(/,/g, "");
+              initialValue = initialValue.replace(".", opts.radixPoint);
+            } else { //equal
+              initialValue = initialValue.indexOf(".") < initialValue.indexOf(",") ? initialValue.replace(/\./g, "") : initialValue = initialValue.replace(/,/g, "");
+            }
+          } else {
+            initialValue = initialValue.replace(new RegExp($.inputmask.escapeRegex(opts.groupSeparator), "g"), "");
+          }
+        }
+
+        if (opts.digits == 0) {
+          if (initialValue.indexOf(".") != -1) {
+            initialValue = initialValue.substring(0, initialValue.indexOf("."));
+          } else if (initialValue.indexOf(",") != -1) {
+            initialValue = initialValue.substring(0, initialValue.indexOf(","));
+          }
+        }
+
+        return initialValue;
+      },
+      canClearPosition: function(maskset, position, lvp, strict, opts) {
+        var positionInput = maskset["validPositions"][position].input,
+          canClear = (positionInput != opts.radixPoint && isFinite(positionInput)) ||
+          position == lvp ||
+          positionInput == opts.groupSeparator ||
+          positionInput == opts.negationSymbol.front ||
+          positionInput == opts.negationSymbol.back,
+          posOffset = 0;
+
+        if (canClear && isFinite(positionInput)) {
+          var matchRslt
+          if (!strict && maskset["buffer"]) {
+            matchRslt = maskset["buffer"].join('').substr(0, position).match(opts.regex.integerNPart(opts));
+            var pos = position + 1,
+              isNull = matchRslt == null || parseInt(matchRslt["0"].replace(new RegExp($.inputmask.escapeRegex(opts.groupSeparator), "g"), "")) == 0;
+            if (isNull) {
+              while (maskset["validPositions"][pos] && (maskset["validPositions"][pos].input == opts.groupSeparator || maskset["validPositions"][pos].input == "0")) {
+                delete maskset["validPositions"][pos];
+                pos++;
+              }
+            }
+          }
+
+          var buffer = [];
+          //build new buffer from validPositions
+          for (var vp in maskset.validPositions) {
+            buffer.push(maskset.validPositions[vp].input);
+          }
+          matchRslt = buffer.join('').match(opts.regex.integerNPart(opts));
+          var radixPosition = $.inArray(opts.radixPoint, maskset.buffer);
+          if (matchRslt && (radixPosition == -1 || position <= radixPosition)) {
+            if (matchRslt["0"].indexOf("0") == 0) {
+              canClear = matchRslt.index != position || radixPosition == -1;
+            } else {
+              var intPart = parseInt(matchRslt["0"].replace(new RegExp($.inputmask.escapeRegex(opts.groupSeparator), "g"), ""));
+              if (radixPosition != -1 && intPart < 10 /*&& opts.placeholder.charAt(0) == "0"*/ ) {
+                maskset["validPositions"][position].input = "0";
+                maskset["p"] = opts.prefix.length + 1;
+                canClear = false;
+              }
+            }
+          }
+        }
+
+        return canClear;
+      }
+    },
+    'currency': {
+      prefix: "$ ",
+      groupSeparator: ",",
+      alias: "numeric",
+      placeholder: "0",
+      autoGroup: true,
+      digits: 2,
+      digitsOptional: false,
+      clearMaskOnLostFocus: false
+    },
+    'decimal': {
+      alias: "numeric"
+    },
+    'integer': {
+      alias: "numeric",
+      digits: "0",
+      radixPoint: ""
+    }
+  });
+  return $.fn.inputmask;
+})(jQuery);

+ 66 - 0
js/inputmask.phone.extensions.js

@@ -0,0 +1,66 @@
+/*
+Input Mask plugin extensions
+http://github.com/RobinHerbots/jquery.inputmask
+Copyright (c) 2010 -  Robin Herbots
+Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+Version: 0.0.0-dev
+
+Phone extension.
+When using this extension make sure you specify the correct url to get the masks
+
+ $(selector).inputmask("phone", {
+                url: "Scripts/jquery.inputmask/phone-codes/phone-codes.json",
+                onKeyValidation: function () { //show some metadata in the console
+                    console.log($(this).inputmask("getmetadata")["cd"]);
+                }
+  });
+
+
+*/
+(function($) {
+  inputmask.extendAliases({
+    'phone': {
+      url: "phone-codes/phone-codes.js",
+      countrycode: "",
+      mask: function(opts) {
+        opts.definitions['#'] = opts.definitions['9'];
+        var maskList = [];
+        $.ajax({
+          url: opts.url,
+          async: false,
+          dataType: 'json',
+          success: function(response) {
+            maskList = response;
+          },
+          error: function(xhr, ajaxOptions, thrownError) {
+            alert(thrownError + " - " + opts.url);
+          }
+        });
+
+        maskList = maskList.sort(function(a, b) {
+          return (a["mask"] || a) < (b["mask"] || b) ? -1 : 1;
+        });
+
+        return maskList;
+      },
+      keepStatic: false,
+      nojumps: true,
+      nojumpsThreshold: 1,
+      onBeforeMask: function(value, opts) {
+        var processedValue = value.replace(/^0/g, "");
+        if (processedValue.indexOf(opts.countrycode) > 1 || processedValue.indexOf(opts.countrycode) == -1) {
+          processedValue = "+" + opts.countrycode + processedValue;
+        }
+
+        return processedValue;
+      }
+    },
+    'phonebe': {
+      alias: "phone",
+      url: "phone-codes/phone-be.js",
+      countrycode: "32",
+      nojumpsThreshold: 4
+    }
+  });
+  return $.fn.inputmask;
+})(jQuery);

+ 203 - 0
js/inputmask.regex.extensions.js

@@ -0,0 +1,203 @@
+/*
+Input Mask plugin extensions
+http://github.com/RobinHerbots/jquery.inputmask
+Copyright (c) 2010 -  Robin Herbots
+Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
+Version: 0.0.0-dev
+
+Regex extensions on the jquery.inputmask base
+Allows for using regular expressions as a mask
+*/
+(function($) {
+  inputmask.extendAliases({ // $(selector).inputmask("Regex", { regex: "[0-9]*"}
+    'Regex': {
+      mask: "r",
+      greedy: false,
+      repeat: "*",
+      regex: null,
+      regexTokens: null,
+      //Thx to https://github.com/slevithan/regex-colorizer for the tokenizer regex
+      tokenizer: /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g,
+      quantifierFilter: /[0-9]+[^,]/,
+      isComplete: function(buffer, opts) {
+        return new RegExp(opts.regex).test(buffer.join(''));
+      },
+      definitions: {
+        'r': {
+          validator: function(chrs, maskset, pos, strict, opts) {
+            function regexToken(isGroup, isQuantifier) {
+              this.matches = [];
+              this.isGroup = isGroup || false;
+              this.isQuantifier = isQuantifier || false;
+              this.quantifier = {
+                min: 1,
+                max: 1
+              };
+              this.repeaterPart = undefined;
+            }
+
+            function analyseRegex() {
+              var currentToken = new regexToken(),
+                match, m, opengroups = [];
+
+              opts.regexTokens = [];
+
+              // The tokenizer regex does most of the tokenization grunt work
+              while (match = opts.tokenizer.exec(opts.regex)) {
+                m = match[0];
+                switch (m.charAt(0)) {
+                  case "(": // Group opening
+                    opengroups.push(new regexToken(true));
+                    break;
+                  case ")": // Group closing
+                    var groupToken = opengroups.pop();
+                    if (opengroups.length > 0) {
+                      opengroups[opengroups.length - 1]["matches"].push(groupToken);
+                    } else {
+                      currentToken.matches.push(groupToken);
+                    }
+                    break;
+                  case "{":
+                  case "+":
+                  case "*": //Quantifier
+                    var quantifierToken = new regexToken(false, true);
+                    m = m.replace(/[{}]/g, "");
+                    var mq = m.split(","),
+                      mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]),
+                      mq1 = mq.length == 1 ? mq0 : (isNaN(mq[1]) ? mq[1] : parseInt(mq[1]));
+                    quantifierToken.quantifier = {
+                      min: mq0,
+                      max: mq1
+                    };
+                    if (opengroups.length > 0) {
+                      var matches = opengroups[opengroups.length - 1]["matches"];
+                      match = matches.pop();
+                      if (!match["isGroup"]) {
+                        var groupToken = new regexToken(true);
+                        groupToken.matches.push(match);
+                        match = groupToken;
+                      }
+                      matches.push(match);
+                      matches.push(quantifierToken);
+                    } else {
+                      match = currentToken.matches.pop();
+                      if (!match["isGroup"]) {
+                        var groupToken = new regexToken(true);
+                        groupToken.matches.push(match);
+                        match = groupToken;
+                      }
+                      currentToken.matches.push(match);
+                      currentToken.matches.push(quantifierToken);
+                    }
+                    break;
+                  default:
+                    if (opengroups.length > 0) {
+                      opengroups[opengroups.length - 1]["matches"].push(m);
+                    } else {
+                      currentToken.matches.push(m);
+                    }
+                    break;
+                }
+              }
+
+              if (currentToken.matches.length > 0)
+                opts.regexTokens.push(currentToken);
+            };
+
+            function validateRegexToken(token, fromGroup) {
+              var isvalid = false;
+              if (fromGroup) {
+                regexPart += "(";
+                openGroupCount++;
+              }
+              for (var mndx = 0; mndx < token["matches"].length; mndx++) {
+                var matchToken = token["matches"][mndx];
+                if (matchToken["isGroup"] == true) {
+                  isvalid = validateRegexToken(matchToken, true);
+                } else if (matchToken["isQuantifier"] == true) {
+                  var crrntndx = $.inArray(matchToken, token["matches"]),
+                    matchGroup = token["matches"][crrntndx - 1];
+                  var regexPartBak = regexPart;
+                  if (isNaN(matchToken.quantifier.max)) {
+                    while (matchToken["repeaterPart"] && matchToken["repeaterPart"] != regexPart && matchToken["repeaterPart"].length > regexPart.length) {
+                      isvalid = validateRegexToken(matchGroup, true);
+                      if (isvalid) break;
+                    }
+                    isvalid = isvalid || validateRegexToken(matchGroup, true);
+                    if (isvalid) matchToken["repeaterPart"] = regexPart;
+                    regexPart = regexPartBak + matchToken.quantifier.max;
+                  } else {
+                    for (var i = 0, qm = matchToken.quantifier.max - 1; i < qm; i++) {
+                      isvalid = validateRegexToken(matchGroup, true);
+                      if (isvalid) break;
+                    }
+                    regexPart = regexPartBak + "{" + matchToken.quantifier.min + "," + matchToken.quantifier.max + "}";
+                  }
+                } else if (matchToken["matches"] != undefined) {
+                  for (var k = 0; k < matchToken.length; k++) {
+                    isvalid = validateRegexToken(matchToken[k], fromGroup);
+                    if (isvalid) break;
+                  }
+                } else {
+                  var testExp;
+                  if (matchToken.charAt(0) == "[") {
+                    testExp = regexPart;
+                    testExp += matchToken;
+                    for (var j = 0; j < openGroupCount; j++) {
+                      testExp += ")";
+                    }
+                    var exp = new RegExp("^(" + testExp + ")$");
+                    isvalid = exp.test(bufferStr);
+                  } else {
+                    for (var l = 0, tl = matchToken.length; l < tl; l++) {
+                      if (matchToken.charAt(l) == "\\") continue;
+                      testExp = regexPart;
+                      testExp += matchToken.substr(0, l + 1);
+                      testExp = testExp.replace(/\|$/, "");
+                      for (var j = 0; j < openGroupCount; j++) {
+                        testExp += ")";
+                      }
+                      var exp = new RegExp("^(" + testExp + ")$");
+                      isvalid = exp.test(bufferStr);
+                      if (isvalid) break;
+                    }
+                  }
+                  regexPart += matchToken;
+                }
+                if (isvalid) break;
+              }
+
+              if (fromGroup) {
+                regexPart += ")";
+                openGroupCount--;
+              }
+
+              return isvalid;
+            }
+
+
+            if (opts.regexTokens == null) {
+              analyseRegex();
+            }
+
+            var cbuffer = maskset.buffer.slice(),
+              regexPart = "",
+              isValid = false,
+              openGroupCount = 0;
+            cbuffer.splice(pos, 0, chrs);
+            var bufferStr = cbuffer.join('');
+            for (var i = 0; i < opts.regexTokens.length; i++) {
+              var regexToken = opts.regexTokens[i];
+              isValid = validateRegexToken(regexToken, regexToken["isGroup"]);
+              if (isValid) break;
+            }
+
+            return isValid;
+          },
+          cardinality: 1
+        }
+      }
+    }
+  });
+  return $.fn.inputmask;
+})(jQuery);

+ 10 - 10
nuspecs/jquery.inputmask.linux.nuspec

@@ -25,16 +25,16 @@
     <tags>jQuery, plugins, input, form, inputmask, mask</tags>
   </metadata>
   <files>
-    <file src="dist/inputmask/jquery.inputmask.date.extensions.js"
-      target="content/Scripts/jquery.inputmask/jquery.inputmask.date.extensions.js"/>
-    <file src="dist/inputmask/jquery.inputmask.extensions.js"
-      target="content/Scripts/jquery.inputmask/jquery.inputmask.extensions.js"/>
-    <file src="dist/inputmask/jquery.inputmask.numeric.extensions.js"
-      target="content/Scripts/jquery.inputmask/jquery.inputmask.numeric.extensions.js"/>
-    <file src="dist/inputmask/jquery.inputmask.regex.extensions.js"
-      target="content/Scripts/jquery.inputmask/jquery.inputmask.regex.extensions.js"/>
-    <file src="dist/inputmask/jquery.inputmask.phone.extensions.js"
-      target="content/Scripts/jquery.inputmask/jquery.inputmask.phone.extensions.js"/>
+    <file src="dist/inputmask/inputmask.date.extensions.js"
+      target="content/Scripts/jquery.inputmask/inputmask.date.extensions.js"/>
+    <file src="dist/inputmask/inputmask.extensions.js"
+      target="content/Scripts/jquery.inputmask/inputmask.extensions.js"/>
+    <file src="dist/inputmask/inputmask.numeric.extensions.js"
+      target="content/Scripts/jquery.inputmask/inputmask.numeric.extensions.js"/>
+    <file src="dist/inputmask/inputmask.regex.extensions.js"
+      target="content/Scripts/jquery.inputmask/inputmask.regex.extensions.js"/>
+    <file src="dist/inputmask/inputmask.phone.extensions.js"
+      target="content/Scripts/jquery.inputmask/inputmask.phone.extensions.js"/>
     <file src="dist/inputmask/jquery.inputmask.js"
       target="content/Scripts/jquery.inputmask/jquery.inputmask.js"/>
     <file src="dist/inputmask/inputmask.js"

+ 10 - 10
nuspecs/jquery.inputmask.nuspec

@@ -25,16 +25,16 @@
     <tags>jQuery, plugins, input, form, inputmask, mask</tags>
   </metadata>
   <files>
-    <file src="..\dist\inputmask\jquery.inputmask.date.extensions.js"
-      target="content\Scripts\jquery.inputmask\jquery.inputmask.date.extensions.js"/>
-    <file src="..\dist\inputmask\jquery.inputmask.extensions.js"
-      target="content\Scripts\jquery.inputmask\jquery.inputmask.extensions.js"/>
-    <file src="..\dist\inputmask\jquery.inputmask.numeric.extensions.js"
-      target="content\Scripts\jquery.inputmask\jquery.inputmask.numeric.extensions.js"/>
-    <file src="..\dist\inputmask\jquery.inputmask.regex.extensions.js"
-      target="content\Scripts\jquery.inputmask\jquery.inputmask.regex.extensions.js"/>
-    <file src="..\dist\inputmask\jquery.inputmask.phone.extensions.js"
-      target="content\Scripts\jquery.inputmask\jquery.inputmask.phone.extensions.js"/>
+    <file src="..\dist\inputmask\inputmask.date.extensions.js"
+      target="content\Scripts\jquery.inputmask\inputmask.date.extensions.js"/>
+    <file src="..\dist\inputmask\inputmask.extensions.js"
+      target="content\Scripts\jquery.inputmask\inputmask.extensions.js"/>
+    <file src="..\dist\inputmask\inputmask.numeric.extensions.js"
+      target="content\Scripts\jquery.inputmask\inputmask.numeric.extensions.js"/>
+    <file src="..\dist\inputmask\inputmask.regex.extensions.js"
+      target="content\Scripts\jquery.inputmask\inputmask.regex.extensions.js"/>
+    <file src="..\dist\inputmask\inputmask.phone.extensions.js"
+      target="content\Scripts\jquery.inputmask\inputmask.phone.extensions.js"/>
     <file src="..\dist\inputmask\jquery.inputmask.js"
       target="content\Scripts\jquery.inputmask\jquery.inputmask.js"/>
     <file src="..\dist\inputmask\inputmask.js"

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "jquery.inputmask",
-  "version": "3.1.64-45",
+  "version": "3.1.64-46",
   "description": "jquery.inputmask is a jquery plugin which create an input mask.",
   "main": "./dist/inputmask/jquery.inputmask.js",
   "files": [