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 if (isNaN(chrs)) return false; 58 var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length))); 59 var enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length))); 60 return (!isNaN(enteredyear) ? minyear <= enteredyear && enteredyear <= maxyear : false) || 61 (!isNaN(enteredyear2) ? minyear <= enteredyear2 && enteredyear2 <= maxyear : false); 62 }, 63 determinebaseyear: function (minyear, maxyear, hint) { 64 var currentyear = (new Date()).getFullYear(); 65 if (minyear > currentyear) return minyear; 66 if (maxyear < currentyear) { 67 var maxYearPrefix = maxyear.toString().slice(0, 2); 68 var maxYearPostfix = maxyear.toString().slice(2, 4); 69 while (maxyear < maxYearPrefix + hint) { 70 maxYearPrefix--; 71 } 72 var maxxYear = maxYearPrefix + maxYearPostfix; 73 return minyear > maxxYear ? minyear : maxxYear; 74 } 75 76 return currentyear; 77 }, 78 onKeyUp: function (e, buffer, opts) { 79 var $input = $(this); 80 if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) { 81 var today = new Date(); 82 $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()); 83 $input.triggerHandler('setvalue.inputmask'); 84 } 85 }, 86 getFrontValue: function (mask, buffer, opts) { 87 var start = 0, length = 0; 88 for (var i = 0; i < mask.length; i++) { 89 if (mask.charAt(i) == "2") 90 break; 91 var definition = opts.definitions[mask.charAt(i)]; 92 if (definition) { 93 start += length; 94 length = definition.cardinality; 95 } else length++; 96 } 97 return buffer.join('').substr(start, length); 98 }, 99 definitions: { 100 '1': { //val1 ~ day or month 101 validator: function (chrs, maskset, pos, strict, opts) { 102 var isValid = opts.regex.val1.test(chrs); 103 if (!strict && !isValid) { 104 if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) { 105 isValid = opts.regex.val1.test("0" + chrs.charAt(0)); 106 if (isValid) { 107 maskset.buffer[pos - 1] = "0"; 108 return { "refreshFromBuffer": { start: pos - 1, end: pos }, "pos": pos, "c": chrs.charAt(0) }; 109 } 110 } 111 } 112 return isValid; 113 }, 114 cardinality: 2, 115 prevalidator: [{ 116 validator: function (chrs, maskset, pos, strict, opts) { 117 if (!isNaN(maskset.buffer[pos + 1])) chrs += maskset.buffer[pos + 1]; 118 var isValid = chrs.length == 1 ? opts.regex.val1pre.test(chrs) : opts.regex.val1.test(chrs); 119 if (!strict && !isValid) { 120 isValid = opts.regex.val1.test("0" + chrs); 121 if (isValid) { 122 maskset.buffer[pos] = "0"; 123 pos++; 124 return { "pos": pos }; 125 } 126 } 127 return isValid; 128 }, cardinality: 1 129 }] 130 }, 131 '2': { //val2 ~ day or month 132 validator: function (chrs, maskset, pos, strict, opts) { 133 var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); 134 if (frontValue.indexOf(opts.placeholder[0]) != -1) frontValue = "01" + opts.separator; 135 var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs); 136 if (!strict && !isValid) { 137 if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) { 138 isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0)); 139 if (isValid) { 140 maskset.buffer[pos - 1] = "0"; 141 return { "refreshFromBuffer": { start: pos - 1, end: pos }, "pos": pos, "c": chrs.charAt(0) }; 142 } 143 } 144 } 145 146 //check leap yeap 147 if ((opts.mask.indexOf("2") == opts.mask.length - 1) && isValid) { 148 var dayMonthValue = maskset.buffer.join('').substr(4, 4) + chrs; 149 if (dayMonthValue != opts.leapday) 150 return true; 151 else { 152 var year = parseInt(maskset.buffer.join('').substr(0, 4), 10); //detect leap year 153 if (year % 4 === 0) 154 if (year % 100 === 0) 155 if (year % 400 === 0) 156 return true; 157 else return false;
158 else return true; 159 else return false; 160 } 161 } 162 163 return isValid; 164 }, 165 cardinality: 2, 166 prevalidator: [{ 167 validator: function (chrs, maskset, pos, strict, opts) { 168 if (!isNaN(maskset.buffer[pos + 1])) chrs += maskset.buffer[pos + 1]; 169 var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); 170 if (frontValue.indexOf(opts.placeholder[0]) != -1) frontValue = "01" + opts.separator; 171 var isValid = chrs.length == 1 ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs); 172 if (!strict && !isValid) { 173 isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs); 174 if (isValid) { 175 maskset.buffer[pos] = "0"; 176 pos++; 177 return { "pos": pos }; 178 } 179 } 180 return isValid; 181 }, cardinality: 1 182 }] 183 }, 184 'y': { //year 185 validator: function (chrs, maskset, pos, strict, opts) { 186 if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { 187 var dayMonthValue = maskset.buffer.join('').substr(0, 6); 188 if (dayMonthValue != opts.leapday) 189 return true; 190 else { 191 var year = parseInt(chrs, 10);//detect leap year 192 if (year % 4 === 0) 193 if (year % 100 === 0) 194 if (year % 400 === 0) 195 return true; 196 else return false; 197 else return true; 198 else return false; 199 } 200 } else return false; 201 }, 202 cardinality: 4, 203 prevalidator: [ 204 { 205 validator: function (chrs, maskset, pos, strict, opts) { 206 var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 207 if (!strict && !isValid) { 208 var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1); 209 210 isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 211 if (isValid) { 212 maskset.buffer[pos++] = yearPrefix.charAt(0); 213 return { "pos": pos }; 214 } 215 yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2); 216 217 isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 218 if (isValid) { 219 maskset.buffer[pos++] = yearPrefix.charAt(0); 220 maskset.buffer[pos++] = yearPrefix.charAt(1); 221 return { "pos": pos }; 222 } 223 } 224 return isValid; 225 }, 226 cardinality: 1 227 }, 228 { 229 validator: function (chrs, maskset, pos, strict, opts) { 230 var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 231 if (!strict && !isValid) { 232 var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); 233 234 isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear); 235 if (isValid) { 236 maskset.buffer[pos++] = yearPrefix.charAt(1); 237 return { "pos": pos }; 238 } 239 240 yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); 241 if (opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { 242 var dayMonthValue = maskset.buffer.join('').substr(0, 6); 243 if (dayMonthValue != opts.leapday) 244 isValid = true; 245 else { 246 var year = parseInt(chrs, 10);//detect leap year 247 if (year % 4 === 0) 248 if (year % 100 === 0) 249 if (year % 400 === 0) 250 isValid = true; 251 else isValid = false;
252 else isValid = true; 253 else isValid = false; 254 } 255 } else isValid = false; 256 if (isValid) { 257 maskset.buffer[pos - 1] = yearPrefix.charAt(0); 258 maskset.buffer[pos++] = yearPrefix.charAt(1); 259 maskset.buffer[pos++] = chrs.charAt(0); 260 return { "refreshFromBuffer": { start: pos - 3, end: pos }, "pos": pos }; 261 } 262 } 263 return isValid; 264 }, cardinality: 2 265 }, 266 { 267 validator: function (chrs, maskset, pos, strict, opts) { 268 return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); 269 }, cardinality: 3 270 } 271 ] 272 } 273 }, 274 insertMode: false, 275 autoUnmask: false 276 }, 277 'mm/dd/yyyy': { 278 placeholder: "mm/dd/yyyy", 279 alias: "dd/mm/yyyy", //reuse functionality of dd/mm/yyyy alias 280 regex: { 281 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 282 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 283 val1pre: new RegExp("[01]"), //monthpre 284 val1: new RegExp("0[1-9]|1[012]") //month 285 }, 286 leapday: "02/29/", 287 onKeyUp: function (e, buffer, opts) { 288 var $input = $(this); 289 if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) { 290 var today = new Date(); 291 $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()); 292 $input.triggerHandler('setvalue.inputmask'); 293 } 294 } 295 }, 296 'yyyy/mm/dd': { 297 mask: "y/1/2", 298 placeholder: "yyyy/mm/dd", 299 alias: "mm/dd/yyyy", 300 leapday: "/02/29", 301 onKeyUp: function (e, buffer, opts) { 302 var $input = $(this); 303 if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) { 304 var today = new Date(); 305 $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()); 306 $input.triggerHandler('setvalue.inputmask'); 307 } 308 } 309 }, 310 'dd.mm.yyyy': { 311 mask: "1.2.y", 312 placeholder: "dd.mm.yyyy", 313 leapday: "29.02.", 314 separator: '.', 315 alias: "dd/mm/yyyy" 316 }, 317 'dd-mm-yyyy': { 318 mask: "1-2-y", 319 placeholder: "dd-mm-yyyy", 320 leapday: "29-02-", 321 separator: '-', 322 alias: "dd/mm/yyyy" 323 }, 324 'mm.dd.yyyy': { 325 mask: "1.2.y", 326 placeholder: "mm.dd.yyyy", 327 leapday: "02.29.", 328 separator: '.', 329 alias: "mm/dd/yyyy" 330 }, 331 'mm-dd-yyyy': { 332 mask: "1-2-y", 333 placeholder: "mm-dd-yyyy", 334 leapday: "02-29-", 335 separator: '-', 336 alias: "mm/dd/yyyy" 337 }, 338 'yyyy.mm.dd': { 339 mask: "y.1.2", 340 placeholder: "yyyy.mm.dd", 341 leapday: ".02.29", 342 separator: '.', 343 alias: "yyyy/mm/dd" 344 }, 345 'yyyy-mm-dd': { 346 mask: "y-1-2", 347 placeholder: "yyyy-mm-dd", 348 leapday: "-02-29", 349 separator: '-', 350 alias: "yyyy/mm/dd" 351 }, 352 'datetime': { 353 mask: "1/2/y h:s", 354 placeholder: "dd/mm/yyyy hh:mm", 355 alias: "dd/mm/yyyy", 356 regex: { 357 hrspre: new RegExp("[012]"), //hours pre 358 hrs24: new RegExp("2[0-4]|1[3-9]"), 359 hrs: new RegExp("[01][0-9]|2[0-4]"), //hours 360 ampm: new RegExp("^[a|p|A|P][m|M]"), 361 mspre: new RegExp("[0-5]"), //minutes/seconds pre 362 ms: new RegExp("[0-5][0-9]") 363 }, 364 timeseparator: ':', 365 hourFormat: "24", // or 12 366 definitions: { 367 'h': { //hours 368 validator: function (chrs, maskset, pos, strict, opts) { 369 if (opts.hourFormat == "24") { 370 if (parseInt(chrs, 10) == 24) { 371 maskset.buffer[pos - 1] = "0"; 372 maskset.buffer[pos] = "0"; 373 return { "refreshFromBuffer": { start: pos - 1, end: pos }, "c": "0" }; 374 } 375 } 376 377 var isValid = opts.regex.hrs.test(chrs); 378 if (!strict && !isValid) { 379 if (chrs.charAt(1) == opts.timeseparator || "-.:".indexOf(chrs.charAt(1)) != -1) { 380 isValid = opts.regex.hrs.test("0" + chrs.charAt(0)); 381 if (isValid) { 382 maskset.buffer[pos - 1] = "0"; 383 maskset.buffer[pos] = chrs.charAt(0); 384 pos++; 385 return { "refreshFromBuffer": { start: pos - 2, end: pos }, "pos": pos, "c": opts.timeseparator }; 386 } 387 } 388 } 389 390 if (isValid && opts.hourFormat !== "24" && opts.regex.hrs24.test(chrs)) { 391 392 var tmp = parseInt(chrs, 10); 393 394 if (tmp == 24) { 395 maskset.buffer[pos + 5] = "a"; 396 maskset.buffer[pos + 6] = "m"; 397 } else { 398 maskset.buffer[pos + 5] = "p"; 399 maskset.buffer[pos + 6] = "m"; 400 } 401 402 tmp = tmp - 12; 403 404 if (tmp < 10) { 405 maskset.buffer[pos] = tmp.toString(); 406 maskset.buffer[pos - 1] = "0"; 407 } else { 408 maskset.buffer[pos] = tmp.toString().charAt(1); 409 maskset.buffer[pos - 1] = tmp.toString().charAt(0); 410 } 411 412 return { "refreshFromBuffer": { start: pos - 1, end: pos + 6 }, "c": maskset.buffer[pos] }; 413 } 414 415 return isValid; 416 }, 417 cardinality: 2, 418 prevalidator: [{ 419 validator: function (chrs, maskset, pos, strict, opts) { 420 var isValid = opts.regex.hrspre.test(chrs); 421 if (!strict && !isValid) { 422 isValid = opts.regex.hrs.test("0" + chrs); 423 if (isValid) { 424 maskset.buffer[pos] = "0"; 425 pos++; 426 return { "pos": pos }; 427 } 428 } 429 return isValid; 430 }, cardinality: 1 431 }] 432 }, 433 's': { //seconds || minutes 434 validator: "[0-5][0-9]", 435 cardinality: 2, 436 prevalidator: [ 437 { 438 validator: function (chrs, maskset, pos, strict, opts) { 439 var isValid = opts.regex.mspre.test(chrs); 440 if (!strict && !isValid) { 441 isValid = opts.regex.ms.test("0" + chrs); 442 if (isValid) { 443 maskset.buffer[pos] = "0"; 444 pos++; 445 return { "pos": pos }; 446 } 447 } 448 return isValid; 449 }, cardinality: 1 450 }] 451 }, 452 't': { //am/pm 453 validator: function (chrs, maskset, pos, strict, opts) { 454 return opts.regex.ampm.test(chrs + "m"); 455 }, 456 casing: "lower", 457 cardinality: 1 458 } 459 }, 460 insertMode: false, 461 autoUnmask: false 462 }, 463 'datetime12': { 464 mask: "1/2/y h:s t\\m", 465 placeholder: "dd/mm/yyyy hh:mm xm", 466 alias: "datetime", 467 hourFormat: "12" 468 }, 469 'hh:mm t': { 470 mask: "h:s t\\m", 471 placeholder: "hh:mm xm", 472 alias: "datetime", 473 hourFormat: "12" 474 }, 475 'h:s t': { 476 mask: "h:s t\\m", 477 placeholder: "hh:mm xm", 478 alias: "datetime", 479 hourFormat: "12" 480 }, 481 'hh:mm:ss': { 482 mask: "h:s:s", 483 placeholder: "hh:mm:ss", 484 alias: "datetime", 485 autoUnmask: false 486 }, 487 'hh:mm': { 488 mask: "h:s", 489 placeholder: "hh:mm", 490 alias: "datetime", 491 autoUnmask: false 492 }, 493 'date': { 494 alias: "dd/mm/yyyy" // "mm/dd/yyyy" 495 }, 496 'mm/yyyy': { 497 mask: "1/y", 498 placeholder: "mm/yyyy", 499 leapday: "donotuse", 500 separator: '/', 501 alias: "mm/dd/yyyy" 502 } 503 }); 504 505 return $.fn.inputmask; 506})(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.