jquery.inputmask.date.extensions.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  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.48
  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. $input.triggerHandler("setvalue.inputmask");
  101. }
  102. },
  103. getFrontValue: function(mask, buffer, opts) {
  104. for (var start = 0, length = 0, i = 0; i < mask.length && "2" != mask.charAt(i); i++) {
  105. var definition = opts.definitions[mask.charAt(i)];
  106. definition ? (start += length, length = definition.cardinality) : length++;
  107. }
  108. return buffer.join("").substr(start, length);
  109. },
  110. definitions: {
  111. "1": {
  112. validator: function(chrs, maskset, pos, strict, opts) {
  113. var isValid = opts.regex.val1.test(chrs);
  114. 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",
  115. {
  116. refreshFromBuffer: {
  117. start: pos - 1,
  118. end: pos
  119. },
  120. pos: pos,
  121. c: chrs.charAt(0)
  122. });
  123. },
  124. cardinality: 2,
  125. prevalidator: [ {
  126. validator: function(chrs, maskset, pos, strict, opts) {
  127. isNaN(maskset.buffer[pos + 1]) || (chrs += maskset.buffer[pos + 1]);
  128. var isValid = 1 == chrs.length ? opts.regex.val1pre.test(chrs) : opts.regex.val1.test(chrs);
  129. return strict || isValid || !(isValid = opts.regex.val1.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0",
  130. pos++, {
  131. pos: pos
  132. });
  133. },
  134. cardinality: 1
  135. } ]
  136. },
  137. "2": {
  138. validator: function(chrs, maskset, pos, strict, opts) {
  139. var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
  140. -1 != frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator);
  141. var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs);
  142. 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",
  143. {
  144. refreshFromBuffer: {
  145. start: pos - 1,
  146. end: pos
  147. },
  148. pos: pos,
  149. c: chrs.charAt(0)
  150. };
  151. if (opts.mask.indexOf("2") == opts.mask.length - 1 && isValid) {
  152. var dayMonthValue = maskset.buffer.join("").substr(4, 4) + chrs;
  153. if (dayMonthValue != opts.leapday) return !0;
  154. var year = parseInt(maskset.buffer.join("").substr(0, 4), 10);
  155. return year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1;
  156. }
  157. return isValid;
  158. },
  159. cardinality: 2,
  160. prevalidator: [ {
  161. validator: function(chrs, maskset, pos, strict, opts) {
  162. isNaN(maskset.buffer[pos + 1]) || (chrs += maskset.buffer[pos + 1]);
  163. var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
  164. -1 != frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator);
  165. var isValid = 1 == chrs.length ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs);
  166. return strict || isValid || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs)) ? isValid : (maskset.buffer[pos] = "0",
  167. pos++, {
  168. pos: pos
  169. });
  170. },
  171. cardinality: 1
  172. } ]
  173. },
  174. y: {
  175. validator: function(chrs, maskset, pos, strict, opts) {
  176. if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
  177. var dayMonthValue = maskset.buffer.join("").substr(0, 6);
  178. if (dayMonthValue != opts.leapday) return !0;
  179. var year = parseInt(chrs, 10);
  180. return year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1;
  181. }
  182. return !1;
  183. },
  184. cardinality: 4,
  185. prevalidator: [ {
  186. validator: function(chrs, maskset, pos, strict, opts) {
  187. var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
  188. if (!strict && !isValid) {
  189. var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1);
  190. if (isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0),
  191. {
  192. pos: pos
  193. };
  194. if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2),
  195. isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0),
  196. maskset.buffer[pos++] = yearPrefix.charAt(1), {
  197. pos: pos
  198. };
  199. }
  200. return isValid;
  201. },
  202. cardinality: 1
  203. }, {
  204. validator: function(chrs, maskset, pos, strict, opts) {
  205. var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
  206. if (!strict && !isValid) {
  207. var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2);
  208. if (isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(1),
  209. {
  210. pos: pos
  211. };
  212. if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2),
  213. opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
  214. var dayMonthValue = maskset.buffer.join("").substr(0, 6);
  215. if (dayMonthValue != opts.leapday) isValid = !0; else {
  216. var year = parseInt(chrs, 10);
  217. isValid = year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1;
  218. }
  219. } else isValid = !1;
  220. if (isValid) return maskset.buffer[pos - 1] = yearPrefix.charAt(0), maskset.buffer[pos++] = yearPrefix.charAt(1),
  221. maskset.buffer[pos++] = chrs.charAt(0), {
  222. refreshFromBuffer: {
  223. start: pos - 3,
  224. end: pos
  225. },
  226. pos: pos
  227. };
  228. }
  229. return isValid;
  230. },
  231. cardinality: 2
  232. }, {
  233. validator: function(chrs, maskset, pos, strict, opts) {
  234. return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
  235. },
  236. cardinality: 3
  237. } ]
  238. }
  239. },
  240. insertMode: !1,
  241. autoUnmask: !1
  242. },
  243. "mm/dd/yyyy": {
  244. placeholder: "mm/dd/yyyy",
  245. alias: "dd/mm/yyyy",
  246. regex: {
  247. val2pre: function(separator) {
  248. var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
  249. return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])");
  250. },
  251. val2: function(separator) {
  252. var escapedSeparator = $.inputmask.escapeRegex.call(this, separator);
  253. 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)");
  254. },
  255. val1pre: new RegExp("[01]"),
  256. val1: new RegExp("0[1-9]|1[012]")
  257. },
  258. leapday: "02/29/",
  259. onKeyUp: function(e) {
  260. var $input = $(this);
  261. if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) {
  262. var today = new Date();
  263. $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()),
  264. $input.triggerHandler("setvalue.inputmask");
  265. }
  266. }
  267. },
  268. "yyyy/mm/dd": {
  269. mask: "y/1/2",
  270. placeholder: "yyyy/mm/dd",
  271. alias: "mm/dd/yyyy",
  272. leapday: "/02/29",
  273. onKeyUp: function(e) {
  274. var $input = $(this);
  275. if (e.ctrlKey && e.keyCode == $.inputmask.keyCode.RIGHT) {
  276. var today = new Date();
  277. $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()),
  278. $input.triggerHandler("setvalue.inputmask");
  279. }
  280. }
  281. },
  282. "dd.mm.yyyy": {
  283. mask: "1.2.y",
  284. placeholder: "dd.mm.yyyy",
  285. leapday: "29.02.",
  286. separator: ".",
  287. alias: "dd/mm/yyyy"
  288. },
  289. "dd-mm-yyyy": {
  290. mask: "1-2-y",
  291. placeholder: "dd-mm-yyyy",
  292. leapday: "29-02-",
  293. separator: "-",
  294. alias: "dd/mm/yyyy"
  295. },
  296. "mm.dd.yyyy": {
  297. mask: "1.2.y",
  298. placeholder: "mm.dd.yyyy",
  299. leapday: "02.29.",
  300. separator: ".",
  301. alias: "mm/dd/yyyy"
  302. },
  303. "mm-dd-yyyy": {
  304. mask: "1-2-y",
  305. placeholder: "mm-dd-yyyy",
  306. leapday: "02-29-",
  307. separator: "-",
  308. alias: "mm/dd/yyyy"
  309. },
  310. "yyyy.mm.dd": {
  311. mask: "y.1.2",
  312. placeholder: "yyyy.mm.dd",
  313. leapday: ".02.29",
  314. separator: ".",
  315. alias: "yyyy/mm/dd"
  316. },
  317. "yyyy-mm-dd": {
  318. mask: "y-1-2",
  319. placeholder: "yyyy-mm-dd",
  320. leapday: "-02-29",
  321. separator: "-",
  322. alias: "yyyy/mm/dd"
  323. },
  324. datetime: {
  325. mask: "1/2/y h:s",
  326. placeholder: "dd/mm/yyyy hh:mm",
  327. alias: "dd/mm/yyyy",
  328. regex: {
  329. hrspre: new RegExp("[012]"),
  330. hrs24: new RegExp("2[0-4]|1[3-9]"),
  331. hrs: new RegExp("[01][0-9]|2[0-4]"),
  332. ampm: new RegExp("^[a|p|A|P][m|M]"),
  333. mspre: new RegExp("[0-5]"),
  334. ms: new RegExp("[0-5][0-9]")
  335. },
  336. timeseparator: ":",
  337. hourFormat: "24",
  338. definitions: {
  339. h: {
  340. validator: function(chrs, maskset, pos, strict, opts) {
  341. if ("24" == opts.hourFormat && 24 == parseInt(chrs, 10)) return maskset.buffer[pos - 1] = "0",
  342. maskset.buffer[pos] = "0", {
  343. refreshFromBuffer: {
  344. start: pos - 1,
  345. end: pos
  346. },
  347. c: "0"
  348. };
  349. var isValid = opts.regex.hrs.test(chrs);
  350. 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",
  351. maskset.buffer[pos] = chrs.charAt(0), pos++, {
  352. refreshFromBuffer: {
  353. start: pos - 2,
  354. end: pos
  355. },
  356. pos: pos,
  357. c: opts.timeseparator
  358. };
  359. if (isValid && "24" !== opts.hourFormat && opts.regex.hrs24.test(chrs)) {
  360. var tmp = parseInt(chrs, 10);
  361. return 24 == tmp ? (maskset.buffer[pos + 5] = "a", maskset.buffer[pos + 6] = "m") : (maskset.buffer[pos + 5] = "p",
  362. maskset.buffer[pos + 6] = "m"), tmp -= 12, 10 > tmp ? (maskset.buffer[pos] = tmp.toString(),
  363. maskset.buffer[pos - 1] = "0") : (maskset.buffer[pos] = tmp.toString().charAt(1),
  364. maskset.buffer[pos - 1] = tmp.toString().charAt(0)), {
  365. refreshFromBuffer: {
  366. start: pos - 1,
  367. end: pos + 6
  368. },
  369. c: maskset.buffer[pos]
  370. };
  371. }
  372. return isValid;
  373. },
  374. cardinality: 2,
  375. prevalidator: [ {
  376. validator: function(chrs, maskset, pos, strict, opts) {
  377. var isValid = opts.regex.hrspre.test(chrs);
  378. return strict || isValid || !(isValid = opts.regex.hrs.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0",
  379. pos++, {
  380. pos: pos
  381. });
  382. },
  383. cardinality: 1
  384. } ]
  385. },
  386. s: {
  387. validator: "[0-5][0-9]",
  388. cardinality: 2,
  389. prevalidator: [ {
  390. validator: function(chrs, maskset, pos, strict, opts) {
  391. var isValid = opts.regex.mspre.test(chrs);
  392. return strict || isValid || !(isValid = opts.regex.ms.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0",
  393. pos++, {
  394. pos: pos
  395. });
  396. },
  397. cardinality: 1
  398. } ]
  399. },
  400. t: {
  401. validator: function(chrs, maskset, pos, strict, opts) {
  402. return opts.regex.ampm.test(chrs + "m");
  403. },
  404. casing: "lower",
  405. cardinality: 1
  406. }
  407. },
  408. insertMode: !1,
  409. autoUnmask: !1
  410. },
  411. datetime12: {
  412. mask: "1/2/y h:s t\\m",
  413. placeholder: "dd/mm/yyyy hh:mm xm",
  414. alias: "datetime",
  415. hourFormat: "12"
  416. },
  417. "hh:mm t": {
  418. mask: "h:s t\\m",
  419. placeholder: "hh:mm xm",
  420. alias: "datetime",
  421. hourFormat: "12"
  422. },
  423. "h:s t": {
  424. mask: "h:s t\\m",
  425. placeholder: "hh:mm xm",
  426. alias: "datetime",
  427. hourFormat: "12"
  428. },
  429. "hh:mm:ss": {
  430. mask: "h:s:s",
  431. placeholder: "hh:mm:ss",
  432. alias: "datetime",
  433. autoUnmask: !1
  434. },
  435. "hh:mm": {
  436. mask: "h:s",
  437. placeholder: "hh:mm",
  438. alias: "datetime",
  439. autoUnmask: !1
  440. },
  441. date: {
  442. alias: "dd/mm/yyyy"
  443. },
  444. "mm/yyyy": {
  445. mask: "1/y",
  446. placeholder: "mm/yyyy",
  447. leapday: "donotuse",
  448. separator: "/",
  449. alias: "mm/dd/yyyy"
  450. }
  451. }), $.fn.inputmask;
  452. });