jquery.inputmask.date.extensions.js 21 KB

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