inputmask.date.extensions.js 23 KB

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