inputmask.date.extensions.js 24 KB

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