1/* 2Input Mask plugin extensions 3http://github.com/RobinHerbots/jquery.inputmask 4Copyright (c) 2010 - 2014 Robin Herbots 5Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) 6Version: 0.0.0 7 8Optional extensions on the jquery.inputmask base 9*/ 10(function ($) { 11 //date & time aliases 12 $.extend($.inputmask.defaults.definitions, { 13 'h': { //hours 14 validator: "[01][0-9]|2[0-3]", 15 cardinality: 2, 16 prevalidator: [{ validator: "[0-2]", cardinality: 1 }] 17 }, 18 's': { //seconds || minutes 19 validator: "[0-5][0-9]", 20 cardinality: 2, 21 prevalidator: [{ validator: "[0-5]", cardinality: 1 }] 22 }, 23 'd': { //basic day 24 validator: "0[1-9]|[12][0-9]|3[01]", 25 cardinality: 2, 26 prevalidator: [{ validator: "[0-3]", cardinality: 1 }] 27 }, 28 'm': { //basic month 29 validator: "0[1-9]|1[012]", 30 cardinality: 2, 31 prevalidator: [{ validator: "[01]", cardinality: 1 }] 32 }, 33 'y': { //basic year 34 validator: "(19|20)\\d{2}", 35 cardinality: 4, 36 prevalidator: [ 37 { validator: "[12]", cardinality: 1 }, 38 { validator: "(19|20)", cardinality: 2 }, 39 { validator: "(19|20)\\d", cardinality: 3 } 40 ] 41 } 42 }); 43 $.extend($.inputmask.defaults.aliases, { 44 'dd/mm/yyyy': { 45 mask: "1/2/y", 46 placeholder: "dd/mm/yyyy", 47 regex: { 48 val1pre: new RegExp("[0-3]"), //daypre 49 val1: new RegExp("0[1-9]|[12][0-9]|3[01]"), //day 50 val2pre: function (separator) { var escapedSeparator = $.inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])"); }, //monthpre 51 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 52 }, 53 leapday: "29/02/", 54 separator: '/', 55 yearrange: { minyear: 1900, maxyear: 2099 }, 56 isInYearRange: function (chrs, minyear, maxyear) { 57 var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length))); 58 var enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length))); 59 return (enteredyear != NaN ? minyear <= enteredyear && enteredyear <= maxyear : false) || 60 (enteredyear2 != NaN ? minyear <= enteredyear2 && enteredyear2 <= maxyear : false); 61 }, 62 determinebaseyear: function (minyear, maxyear, hint) { 63 var currentyear = (new Date()).getFullYear(); 64 if (minyear > currentyear) return minyear; 65 if (maxyear < currentyear) { 66 var maxYearPrefix = maxyear.toString().slice(0, 2); 67 var maxYearPostfix = maxyear.toString().slice(2, 4); 68 while (maxyear < maxYearPrefix + hint) { 69 maxYearPrefix--; 70 } 71 var maxxYear = maxYearPrefix + maxYearPostfix; 72 return minyear > maxxYear ? minyear : maxxYear; 73 } 74 75 return currentyear; 76 }, 77 onKeyUp: function (e, buffer, opts) { 78 var $input = $(this); 79 if (e.ctrlKey && e.keyCode == opts.keyCode.RIGHT) { 80 var today = new Date(); 81 $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()); 82 } 83 }, 84 definitions: { 85 '1': { //val1 ~ day or month 86 validator: function (chrs, buffer, pos, strict, opts) { 87 var isValid = opts.regex.val1.test(chrs); 88 if (!strict && !isValid) { 89 if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) { 90 isValid = opts.regex.val1.test("0" + chrs.charAt(0)); 91 if (isValid) { 92 buffer[pos - 1] = "0"; 93 return { "pos": pos, "c": chrs.charAt(0) }; 94 } 95 } 96 } 97 return isValid; 98 }, 99 cardinality: 2, 100 prevalidator: [{ 101 validator: function (chrs, buffer, pos, strict, opts) { 102 var isValid = opts.regex.val1pre.test(chrs); 103 if (!strict && !isValid) { 104 isValid = opts.regex.val1.test("0" + chrs); 105 if (isValid) { 106 buffer[pos] = "0"; 107 pos++; 108 return { "pos": pos }; 109 } 110 } 111 return isValid; 112 }, cardinality: 1 113 }] 114 }, 115 '2': { //val2 ~ day or month 116 validator: function (chrs, buffer, pos, strict, opts) { 117 var frontValue = buffer.join('').substr(0, 3); 118 if (frontValue.indexOf(opts.placeholder[0]) != -1) frontValue = "01" + opts.separator; 119 var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs); 120 if (!strict && !isValid) { 121 if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) { 122 isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0)); 123 if (isValid) { 124 buffer[pos - 1] = "0"; 125 return { "pos": pos, "c": chrs.charAt(0) }; 126 } 127 } 128 } 129 return isValid; 130 }, 131 cardinality: 2, 132 prevalidator: [{ 133 validator: function (chrs, buffer, pos, strict, opts) { 134 var frontValue = buffer.join('').substr(0, 3); 135 if (frontValue.indexOf(opts.placeholder[0]) != -1) frontValue = "01" + opts.separator; 136 var isValid = opts.regex.val2pre(opts.separator).test(frontValue + chrs); 137 if (!strict && !isValid) { 138 isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs); 139 if (isValid) { 140 buffer[pos] = "0"; 141 pos++; 142 return { "pos": pos }; 143 } 144 } 145 return isValid; 146 }, cardinality: 1 147 }] 148 }, 149 'y': { //year 150 validator: function (chrs, buffer, pos, strict, opts) { 151 if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { 152 var dayMonthValue = buffer.join('').substr(0, 6); 153 if (dayMonthValue != opts.leapday) 154 return true; 155 else { 156 var year = parseInt(chrs, 10);//detect leap year 157 if (year % 4 === 0) 158 if (year % 100 === 0) 159 if (year % 400 === 0) 160 return true; 161 else return false;
162 else return true; 163 else return false; 164 } 165 } else return false; 166 }, 167 cardinality: 4, 168 prevalidator: [ 169 { 170 validator: function (chrs, buffer, pos, strict, opts) { 171 var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 172 if (!strict && !isValid) { 173 var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1); 174 175 isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 176 if (isValid) { 177 buffer[pos++] = yearPrefix[0]; 178 return { "pos": pos }; 179 } 180 yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2); 181 182 isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 183 if (isValid) { 184 buffer[pos++] = yearPrefix[0]; 185 buffer[pos++] = yearPrefix[1]; 186 return { "pos": pos }; 187 } 188 } 189 return isValid; 190 }, 191 cardinality: 1 192 }, 193 { 194 validator: function (chrs, buffer, pos, strict, opts) { 195 var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 196 if (!strict && !isValid) { 197 var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); 198 199 isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear); 200 if (isValid) { 201 buffer[pos++] = yearPrefix[1]; 202 return { "pos": pos }; 203 } 204 205 yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); 206 if (opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { 207 var dayMonthValue = buffer.join('').substr(0, 6); 208 if (dayMonthValue != opts.leapday) 209 isValid = true; 210 else { 211 var year = parseInt(chrs, 10);//detect leap year 212 if (year % 4 === 0) 213 if (year % 100 === 0) 214 if (year % 400 === 0) 215 isValid = true; 216 else isValid = false; 217 else isValid = true; 218 else isValid = false; 219 } 220 } else isValid = false; 221 if (isValid) { 222 buffer[pos - 1] = yearPrefix[0]; 223 buffer[pos++] = yearPrefix[1]; 224 buffer[pos++] = chrs[0]; 225 return { "pos": pos }; 226 } 227 } 228 return isValid; 229 }, cardinality: 2 230 }, 231 { 232 validator: function (chrs, buffer, pos, strict, opts) { 233 return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 234 }, cardinality: 3 235 } 236 ] 237 } 238 }, 239 insertMode: false, 240 autoUnmask: false 241 }, 242 'mm/dd/yyyy': { 243 placeholder: "mm/dd/yyyy", 244 alias: "dd/mm/yyyy", //reuse functionality of dd/mm/yyyy alias 245 regex: { 246 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 247 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 248 val1pre: new RegExp("[01]"), //monthpre
249 val1: new RegExp("0[1-9]|1[012]") //month 250 }, 251 leapday: "02/29/", 252 onKeyUp: function (e, buffer, opts) { 253 var $input = $(this); 254 if (e.ctrlKey && e.keyCode == opts.keyCode.RIGHT) { 255 var today = new Date(); 256 $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()); 257 } 258 } 259 }, 260 'yyyy/mm/dd': { 261 mask: "y/1/2", 262 placeholder: "yyyy/mm/dd", 263 alias: "mm/dd/yyyy", 264 leapday: "/02/29", 265 onKeyUp: function (e, buffer, opts) { 266 var $input = $(this); 267 if (e.ctrlKey && e.keyCode == opts.keyCode.RIGHT) { 268 var today = new Date(); 269 $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()); 270 } 271 }, 272 definitions: { 273 '2': { //val2 ~ day or month 274 validator: function (chrs, buffer, pos, strict, opts) { 275 var frontValue = buffer.join('').substr(5, 3); 276 if (frontValue.indexOf(opts.placeholder[5]) != -1) frontValue = "01" + opts.separator; 277 var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs); 278 if (!strict && !isValid) { 279 if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) { 280 isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0)); 281 if (isValid) { 282 buffer[pos - 1] = "0"; 283 return { "pos": pos, "c": chrs.charAt(0) }; 284 } 285 } 286 } 287 288 //check leap yeap 289 if (isValid) { 290 var dayMonthValue = buffer.join('').substr(4, 4) + chrs; 291 if (dayMonthValue != opts.leapday) 292 return true; 293 else { 294 var year = parseInt(buffer.join('').substr(0, 4), 10); //detect leap year 295 if (year % 4 === 0) 296 if (year % 100 === 0) 297 if (year % 400 === 0) 298 return true; 299 else return false; 300 else return true; 301 else return false; 302 } 303 } 304 305 return isValid; 306 }, 307 cardinality: 2, 308 prevalidator: [{ 309 validator: function (chrs, buffer, pos, strict, opts) { 310 var frontValue = buffer.join('').substr(5, 3); 311 if (frontValue.indexOf(opts.placeholder[5]) != -1) frontValue = "01" + opts.separator; 312 var isValid = opts.regex.val2pre(opts.separator).test(frontValue + chrs); 313 if (!strict && !isValid) { 314 isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs); 315 if (isValid) { 316 buffer[pos] = "0"; 317 pos++; 318 return { "pos": pos }; 319 } 320 } 321 return isValid; 322 }, cardinality: 1 323 }] 324 } 325 } 326 }, 327 'dd.mm.yyyy': { 328 mask: "1.2.y", 329 placeholder: "dd.mm.yyyy", 330 leapday: "29.02.", 331 separator: '.', 332 alias: "dd/mm/yyyy" 333 }, 334 'dd-mm-yyyy': { 335 mask: "1-2-y", 336 placeholder: "dd-mm-yyyy", 337 leapday: "29-02-", 338 separator: '-', 339 alias: "dd/mm/yyyy" 340 }, 341 'mm.dd.yyyy': { 342 mask: "1.2.y", 343 placeholder: "mm.dd.yyyy", 344 leapday: "02.29.", 345 separator: '.', 346 alias: "mm/dd/yyyy" 347 }, 348 'mm-dd-yyyy': { 349 mask: "1-2-y", 350 placeholder: "mm-dd-yyyy", 351 leapday: "02-29-", 352 separator: '-', 353 alias: "mm/dd/yyyy" 354 }, 355 'yyyy.mm.dd': { 356 mask: "y.1.2", 357 placeholder: "yyyy.mm.dd", 358 leapday: ".02.29", 359 separator: '.', 360 alias: "yyyy/mm/dd" 361 }, 362 'yyyy-mm-dd': { 363 mask: "y-1-2", 364 placeholder: "yyyy-mm-dd", 365 leapday: "-02-29", 366 separator: '-', 367 alias: "yyyy/mm/dd" 368 }, 369 'datetime': { 370 mask: "1/2/y h:s", 371 placeholder: "dd/mm/yyyy hh:mm", 372 alias: "dd/mm/yyyy", 373 regex: { 374 hrspre: new RegExp("[012]"), //hours pre 375 hrs24: new RegExp("2[0-9]|1[3-9]"), 376 hrs: new RegExp("[01][0-9]|2[0-3]"), //hours 377 ampm: new RegExp("^[a|p|A|P][m|M]") 378 }, 379 timeseparator: ':', 380 hourFormat: "24", // or 12 381 definitions: { 382 'h': { //hours 383 validator: function (chrs, buffer, pos, strict, opts) { 384 var isValid = opts.regex.hrs.test(chrs); 385 if (!strict && !isValid) { 386 if (chrs.charAt(1) == opts.timeseparator || "-.:".indexOf(chrs.charAt(1)) != -1) { 387 isValid = opts.regex.hrs.test("0" + chrs.charAt(0)); 388 if (isValid) { 389 buffer[pos - 1] = "0"; 390 buffer[pos] = chrs.charAt(0); 391 pos++; 392 return { "pos": pos }; 393 } 394 } 395 } 396 397 if (isValid && opts.hourFormat !== "24" && opts.regex.hrs24.test(chrs)) { 398 399 var tmp = parseInt(chrs, 10); 400 401 if (tmp == 24) { 402 buffer[pos + 5] = "a"; 403 buffer[pos + 6] = "m"; 404 } else { 405 buffer[pos + 5] = "p"; 406 buffer[pos + 6] = "m"; 407 } 408 409 tmp = tmp - 12; 410 411 if (tmp < 10) { 412 buffer[pos] = tmp.toString(); 413 buffer[pos - 1] = "0"; 414 } else { 415 buffer[pos] = tmp.toString().charAt(1); 416 buffer[pos - 1] = tmp.toString().charAt(0); 417 } 418 419 return { "pos": pos, "c": buffer[pos] }; 420 } 421 422 return isValid; 423 }, 424 cardinality: 2, 425 prevalidator: [{ 426 validator: function (chrs, buffer, pos, strict, opts) { 427 var isValid = opts.regex.hrspre.test(chrs); 428 if (!strict && !isValid) { 429 isValid = opts.regex.hrs.test("0" + chrs); 430 if (isValid) { 431 buffer[pos] = "0"; 432 pos++; 433 return { "pos": pos }; 434 } 435 } 436 return isValid; 437 }, cardinality: 1 438 }] 439 }, 440 't': { //am/pm 441 validator: function (chrs, buffer, pos, strict, opts) { 442 return opts.regex.ampm.test(chrs + "m"); 443 }, 444 casing: "lower", 445 cardinality: 1 446 } 447 }, 448 insertMode: false, 449 autoUnmask: false 450 }, 451 'datetime12': { 452 mask: "1/2/y h:s t\\m", 453 placeholder: "dd/mm/yyyy hh:mm xm", 454 alias: "datetime", 455 hourFormat: "12" 456 }, 457 'hh:mm t': { 458 mask: "h:s t\\m", 459 placeholder: "hh:mm xm", 460 alias: "datetime", 461 hourFormat: "12" 462 }, 463 'h:s t': { 464 mask: "h:s t\\m", 465 placeholder: "hh:mm xm", 466 alias: "datetime", 467 hourFormat: "12" 468 }, 469 'hh:mm:ss': { 470 mask: "h:s:s", 471 autoUnmask: false 472 }, 473 'hh:mm': { 474 mask: "h:s", 475 autoUnmask: false 476 }, 477 'date': { 478 alias: "dd/mm/yyyy" // "mm/dd/yyyy" 479 }, 480 'mm/yyyy': { 481 mask: "1/y", 482 placeholder: "mm/yyyy", 483 leapday: "donotuse", 484 separator: '/', 485 alias: "mm/dd/yyyy" 486 } 487 }); 488})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.