@fileverse-dev/fortune-core 1.3.5 → 1.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,3 +6,4 @@ export declare function getSelectionCharacterOffsets(element: Node): {
6
6
  end: number;
7
7
  } | null;
8
8
  export declare function setSelectionByCharacterOffset(element: HTMLDivElement, start: number, end: number): void;
9
+ export declare function getRangeRectsByCharacterOffset(element: HTMLDivElement, start: number, end: number): DOMRect[];
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.getRangeRectsByCharacterOffset = getRangeRectsByCharacterOffset;
6
7
  exports.getSelectionCharacterOffsets = getSelectionCharacterOffsets;
7
8
  exports.moveToEnd = moveToEnd;
8
9
  exports.selectTextContent = selectTextContent;
@@ -124,4 +125,39 @@ function setSelectionByCharacterOffset(element, start, end) {
124
125
  sel.removeAllRanges();
125
126
  sel.addRange(range);
126
127
  }
128
+ }
129
+ function getRangeRectsByCharacterOffset(element, start, end) {
130
+ if (start >= end) return [];
131
+ var charIndex = 0;
132
+ var startNode = null;
133
+ var startOffset = 0;
134
+ var endNode = null;
135
+ var endOffset = 0;
136
+ function walk(node) {
137
+ if (node.nodeType === Node.TEXT_NODE) {
138
+ var len = (node.textContent || "").length;
139
+ if (startNode == null && charIndex + len > start) {
140
+ startNode = node;
141
+ startOffset = start - charIndex;
142
+ }
143
+ if (endNode == null && charIndex + len >= end) {
144
+ endNode = node;
145
+ endOffset = end - charIndex;
146
+ return true;
147
+ }
148
+ charIndex += len;
149
+ return false;
150
+ }
151
+ for (var i = 0; i < node.childNodes.length; i += 1) {
152
+ if (walk(node.childNodes[i])) return true;
153
+ }
154
+ return false;
155
+ }
156
+ walk(element);
157
+ if (!startNode || !endNode) return [];
158
+ var range = document.createRange();
159
+ range.setStart(startNode, startOffset);
160
+ range.setEnd(endNode, endOffset);
161
+ var rects = range.getClientRects();
162
+ return Array.from(rects);
127
163
  }
@@ -21,29 +21,6 @@ function datenum_local(v, date1904) {
21
21
  if (date1904) epoch -= 1461 * 24 * 60 * 60 * 1000;else if (v >= base1904) epoch += 24 * 60 * 60 * 1000;
22
22
  return (epoch - dnthresh_utc) / (24 * 60 * 60 * 1000);
23
23
  }
24
- var good_pd_date = new Date("2017-02-19T19:06:09.000Z");
25
- if (Number.isNaN(good_pd_date.getFullYear())) good_pd_date = new Date("2/19/17");
26
- var good_pd = good_pd_date.getFullYear() === 2017;
27
- function parseDate(str, fixdate) {
28
- var d = new Date(str);
29
- if (good_pd) {
30
- if (!_lodash.default.isNil(fixdate)) {
31
- if (fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);else if (fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);
32
- }
33
- return d;
34
- }
35
- if (str instanceof Date) return str;
36
- if (good_pd_date.getFullYear() === 1917 && !Number.isNaN(d.getFullYear())) {
37
- var s = d.getFullYear();
38
- if (str.indexOf("".concat(s)) > -1) return d;
39
- d.setFullYear(d.getFullYear() + 100);
40
- return d;
41
- }
42
- var n = str.match(/\d+/g) || ["2017", "2", "19", "0", "0", "0"];
43
- var out = new Date(+n[0], +n[1] - 1, +n[2], +n[3] || 0, +n[4] || 0, +n[5] || 0);
44
- if (str.indexOf("Z") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000);
45
- return out;
46
- }
47
24
  function genarate(value) {
48
25
  var m = null;
49
26
  var ct = {};
@@ -267,23 +244,37 @@ function genarate(value) {
267
244
  t: "n"
268
245
  };
269
246
  v = parseFloat(value);
270
- } else if ((0, _validation.isdatetime)(value) && (value.toString().indexOf(".") > -1 || value.toString().indexOf(":") > -1 || value.toString().length < 16)) {
271
- v = datenum_local(parseDate(value.toString().replace(/-/g, "/")));
272
- if (v.toString().indexOf(".") > -1) {
273
- if (value.toString().length > 18) {
274
- ct.fa = "yyyy-MM-dd hh:mm:ss";
275
- } else if (value.toString().length > 11) {
276
- ct.fa = "yyyy-MM-dd hh:mm";
277
- } else {
278
- ct.fa = "yyyy-MM-dd";
279
- }
247
+ } else if (typeof value === "string") {
248
+ var df = (0, _validation.detectDateFormat)(value.toString());
249
+ if (df) {
250
+ var dateObj = new Date(df.year, df.month - 1, df.day, df.hours, df.minutes, df.seconds);
251
+ v = datenum_local(dateObj);
252
+ ct.t = "d";
253
+ var map = {
254
+ "yyyy-MM-dd": "dd/MM/yyyy",
255
+ "yyyy-MM-dd HH:mm": "dd/MM/yyyy",
256
+ "yyyy-MM-ddTHH:mm": "dd/MM/yyyy",
257
+ "yyyy/MM/dd": "dd/MM/yyyy",
258
+ "yyyy/MM/dd HH:mm": "dd/MM/yyyy",
259
+ "yyyy.MM.dd": "yyyy.MM.dd",
260
+ "MM/dd/yyyy h:mm AM/PM": "MM/dd/yyyy h:mm AM/PM",
261
+ "MM/dd/yyyy": "MM/dd/yyyy",
262
+ "M/d/yyyy": "M/d/yyyy",
263
+ "MM/dd/yy": "MM/dd/yy",
264
+ "dd/MM/yyyy": "dd/MM/yyyy",
265
+ "dd-MM-yyyy": "dd/MM/yyyy",
266
+ "dd.MM.yyyy": "dd.MM.yyyy",
267
+ named: "dd/MM/yyyy"
268
+ };
269
+ ct.fa = map[df.formatType] || "dd/MM/yyyy";
270
+ m = _ssf.default.format(ct.fa, v);
280
271
  } else {
281
- ct.fa = "yyyy-MM-dd";
272
+ m = value.toString();
273
+ ct.fa = "General";
274
+ ct.t = "g";
282
275
  }
283
- ct.t = "d";
284
- m = _ssf.default.format(ct.fa, v);
285
276
  } else {
286
- m = value;
277
+ m = value.toString();
287
278
  ct.fa = "General";
288
279
  ct.t = "g";
289
280
  }
@@ -13,14 +13,14 @@ export declare function saveHyperlink(ctx: Context, r: number, c: number, linkTe
13
13
  cellInput?: HTMLDivElement | null;
14
14
  }): void;
15
15
  export declare function removeHyperlink(ctx: Context, r: number, c: number): void;
16
- export declare function showLinkCard(ctx: Context, r: number, c: number, isEditing?: boolean, isMouseDown?: boolean, options?: {
16
+ export declare function showLinkCard(ctx: Context, r: number, c: number, options?: {
17
17
  applyToSelection?: boolean;
18
18
  originText?: string;
19
19
  selectionOffsets?: {
20
20
  start: number;
21
21
  end: number;
22
22
  };
23
- }): void;
23
+ }, isEditing?: boolean, isMouseDown?: boolean): void;
24
24
  export declare function goToLink(ctx: Context, r: number, c: number, linkType: string, linkAddress: string, scrollbarX: HTMLDivElement, scrollbarY: HTMLDivElement): void;
25
25
  export declare function isLinkValid(ctx: Context, linkType: string, linkAddress: string): {
26
26
  isValid: boolean;
@@ -127,7 +127,7 @@ function removeHyperlink(ctx, r, c) {
127
127
  }
128
128
  ctx.linkCard = undefined;
129
129
  }
130
- function showLinkCard(ctx, r, c, isEditing, isMouseDown, options) {
130
+ function showLinkCard(ctx, r, c, options, isEditing, isMouseDown) {
131
131
  var _a, _b, _c, _d, _e, _f, _g, _h;
132
132
  if (isEditing === void 0) {
133
133
  isEditing = false;
@@ -146,7 +146,11 @@ function showLinkCard(ctx, r, c, isEditing, isMouseDown, options) {
146
146
  if (isEditing || link != null && (!((_f = ctx.linkCard) === null || _f === void 0 ? void 0 : _f.isEditing) || isMouseDown) || ((_g = ctx.linkCard) === null || _g === void 0 ? void 0 : _g.sheetId) !== ctx.currentSheetId) {
147
147
  var col_pre = c - 1 === -1 ? 0 : ctx.visibledatacolumn[c - 1];
148
148
  var row = ctx.visibledatarow[r];
149
- var originText = (options === null || options === void 0 ? void 0 : options.originText) !== undefined ? options.originText : (cell === null || cell === void 0 ? void 0 : cell.v) == null ? "" : "".concat(cell.v);
149
+ var originText = function () {
150
+ if ((options === null || options === void 0 ? void 0 : options.originText) !== undefined) return options.originText;
151
+ if ((cell === null || cell === void 0 ? void 0 : cell.v) == null) return "";
152
+ return "".concat(cell.v);
153
+ }();
150
154
  ctx.linkCard = {
151
155
  sheetId: ctx.currentSheetId,
152
156
  r: r,
@@ -1648,6 +1648,7 @@ function deleteSelectedCellFormat(ctx) {
1648
1648
  return "success";
1649
1649
  }
1650
1650
  function fillRightData(ctx) {
1651
+ var _a, _b;
1651
1652
  var allowEdit = (0, _utils.isAllowEdit)(ctx);
1652
1653
  if (allowEdit === false) {
1653
1654
  return "allowEdit";
@@ -1675,10 +1676,20 @@ function fillRightData(ctx) {
1675
1676
  var r2 = selection[s].row[1];
1676
1677
  var c1 = selection[s].column[0];
1677
1678
  var c2 = selection[s].column[1];
1678
- for (var r = r1; r <= r2; r += 1) {
1679
- for (var c = c1; c <= c2; c += 1) {
1680
- var previousCell = d[r][c - 1];
1681
- d[r][c] = __assign({}, previousCell);
1679
+ var isSingleCell = r1 === r2 && c1 === c2;
1680
+ if (isSingleCell) {
1681
+ if (c1 - 1 >= 0 && d[r1]) {
1682
+ var prev = d[r1][c1 - 1];
1683
+ d[r1][c1] = prev != null ? __assign({}, prev) : {};
1684
+ }
1685
+ } else {
1686
+ for (var r = r1; r <= r2; r += 1) {
1687
+ var sourceCell = (_a = d[r]) === null || _a === void 0 ? void 0 : _a[c1];
1688
+ for (var c = c1 + 1; c <= c2; c += 1) {
1689
+ if (d[r]) {
1690
+ d[r][c] = sourceCell != null ? __assign({}, sourceCell) : (_b = d[r][c]) !== null && _b !== void 0 ? _b : {};
1691
+ }
1692
+ }
1682
1693
  }
1683
1694
  }
1684
1695
  }
@@ -1686,6 +1697,7 @@ function fillRightData(ctx) {
1686
1697
  return "success";
1687
1698
  }
1688
1699
  function fillDownData(ctx) {
1700
+ var _a, _b;
1689
1701
  var allowEdit = (0, _utils.isAllowEdit)(ctx);
1690
1702
  if (allowEdit === false) {
1691
1703
  return "allowEdit";
@@ -1713,10 +1725,20 @@ function fillDownData(ctx) {
1713
1725
  var r2 = selection[s].row[1];
1714
1726
  var c1 = selection[s].column[0];
1715
1727
  var c2 = selection[s].column[1];
1716
- for (var r = r1; r <= r2; r += 1) {
1728
+ var isSingleCell = r1 === r2 && c1 === c2;
1729
+ if (isSingleCell) {
1730
+ if (r1 - 1 >= 0 && d[r1 - 1]) {
1731
+ var prev = d[r1 - 1][c1];
1732
+ if (!d[r1]) d[r1] = [];
1733
+ d[r1][c1] = prev != null ? __assign({}, prev) : {};
1734
+ }
1735
+ } else {
1717
1736
  for (var c = c1; c <= c2; c += 1) {
1718
- var previousCell = d[r - 1][c];
1719
- d[r][c] = __assign({}, previousCell);
1737
+ var sourceCell = (_a = d[r1]) === null || _a === void 0 ? void 0 : _a[c];
1738
+ for (var r = r1 + 1; r <= r2; r += 1) {
1739
+ if (!d[r]) d[r] = [];
1740
+ d[r][c] = sourceCell != null ? __assign({}, sourceCell) : (_b = d[r][c]) !== null && _b !== void 0 ? _b : {};
1741
+ }
1720
1742
  }
1721
1743
  }
1722
1744
  }
@@ -1370,7 +1370,7 @@ var make_ssf = function make_ssf(SSF) {
1370
1370
  if (typeof n !== "number" || !Number.isFinite(n)) return null;
1371
1371
  if (!Number.isInteger(n)) return null;
1372
1372
  if (n < 0) return null;
1373
- var minSec = 0; // 1970-01-01
1373
+ var minSec = 100000; // Excel serial numbers max ~73050 for year 2100; avoids collision
1374
1374
  var maxSec = 4102444800; // ~2100-01-01
1375
1375
  var minMs = minSec * 1000;
1376
1376
  var maxMs = maxSec * 1000;
@@ -36,8 +36,8 @@ var _context = require("../context");
36
36
  var _utils = require("../utils");
37
37
  var _cell = require("./cell");
38
38
  var _color = require("./color");
39
- var _format = require("./format");
40
39
  var _cursor = require("./cursor");
40
+ var _format = require("./format");
41
41
  var _formula2 = require("./formula");
42
42
  var _inlineString = require("./inline-string");
43
43
  var _location = require("./location");
@@ -67,21 +67,42 @@ function updateFormatCell(ctx, d, attr, foucsStatus, row_st, row_ed, col_st, col
67
67
  } else {
68
68
  value = cell;
69
69
  }
70
+ var type = "n";
71
+ if ((0, _format.is_date)(foucsStatus) || foucsStatus === 14 || foucsStatus === 15 || foucsStatus === 16 || foucsStatus === 17 || foucsStatus === 18 || foucsStatus === 19 || foucsStatus === 20 || foucsStatus === 21 || foucsStatus === 22 || foucsStatus === 45 || foucsStatus === 46 || foucsStatus === 47) {
72
+ type = "d";
73
+ } else if (foucsStatus === "@" || foucsStatus === 49) {
74
+ type = "s";
75
+ }
70
76
  if (_lodash.default.isNil(value)) {
77
+ if (!_lodash.default.isNil(d[r])) {
78
+ if (_lodash.default.isNil(d[r][c])) {
79
+ d[r][c] = {
80
+ ct: {
81
+ fa: foucsStatus,
82
+ t: type
83
+ }
84
+ };
85
+ } else if (_lodash.default.isPlainObject(d[r][c])) {
86
+ if (_lodash.default.isNil(d[r][c].ct)) d[r][c].ct = {};
87
+ d[r][c].ct.fa = foucsStatus;
88
+ d[r][c].ct.t = type;
89
+ }
90
+ }
71
91
  continue;
72
92
  }
73
93
  if (foucsStatus !== "@" && (0, _validation.isRealNum)(value)) {
74
94
  value = Number(value);
95
+ } else if (type === "d" && typeof value === "string") {
96
+ var dateInfo = (0, _validation.detectDateFormat)(value);
97
+ if (dateInfo) {
98
+ var dateObj = new Date(dateInfo.year, dateInfo.month - 1, dateInfo.day, dateInfo.hours, dateInfo.minutes, dateInfo.seconds);
99
+ value = (0, _format.datenum_local)(dateObj);
100
+ }
75
101
  }
76
- var mask = (0, _format.update)(foucsStatus, value);
77
- var type = "n";
78
- if ((0, _format.is_date)(foucsStatus) || foucsStatus === 14 || foucsStatus === 15 || foucsStatus === 16 || foucsStatus === 17 || foucsStatus === 18 || foucsStatus === 19 || foucsStatus === 20 || foucsStatus === 21 || foucsStatus === 22 || foucsStatus === 45 || foucsStatus === 46 || foucsStatus === 47) {
79
- type = "d";
80
- } else if (foucsStatus === "@" || foucsStatus === 49) {
81
- type = "s";
82
- } else if (foucsStatus === "General" || foucsStatus === 0) {
102
+ if (foucsStatus === "General" || foucsStatus === 0) {
83
103
  type = (0, _validation.isRealNum)(value) ? "n" : "g";
84
104
  }
105
+ var mask = (0, _format.update)(foucsStatus, value);
85
106
  if (cell && _lodash.default.isPlainObject(cell)) {
86
107
  cell.m = "".concat(mask);
87
108
  if (_lodash.default.isNil(cell.ct)) {
@@ -89,7 +110,7 @@ function updateFormatCell(ctx, d, attr, foucsStatus, row_st, row_ed, col_st, col
89
110
  }
90
111
  cell.ct.fa = foucsStatus;
91
112
  cell.ct.t = type;
92
- cell.v = String(value);
113
+ cell.v = typeof value === "number" ? value : String(value);
93
114
  cell.fc = cell.fc || ((_f = (_e = (_d = cell.ct) === null || _d === void 0 ? void 0 : _d.s) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.fc);
94
115
  cell.bl = cell.bl || ((_j = (_h = (_g = cell.ct) === null || _g === void 0 ? void 0 : _g.s) === null || _h === void 0 ? void 0 : _h[0]) === null || _j === void 0 ? void 0 : _j.bl);
95
116
  cell.it = cell.it || ((_m = (_l = (_k = cell.ct) === null || _k === void 0 ? void 0 : _k.s) === null || _l === void 0 ? void 0 : _l[0]) === null || _m === void 0 ? void 0 : _m.it);
@@ -102,7 +123,7 @@ function updateFormatCell(ctx, d, attr, foucsStatus, row_st, row_ed, col_st, col
102
123
  fa: foucsStatus,
103
124
  t: type
104
125
  },
105
- v: value,
126
+ v: typeof value === "number" ? value : value,
106
127
  m: mask
107
128
  };
108
129
  }
@@ -1028,11 +1049,11 @@ function handleLink(ctx, cellInput) {
1028
1049
  }
1029
1050
  }
1030
1051
  }
1031
- (0, _hyperlink.showLinkCard)(ctx, r, c, true, false, {
1052
+ (0, _hyperlink.showLinkCard)(ctx, r, c, {
1032
1053
  applyToSelection: applyToSelection || undefined,
1033
1054
  originText: originText,
1034
1055
  selectionOffsets: selectionOffsets
1035
- });
1056
+ }, true, false);
1036
1057
  }
1037
1058
  var handlerMap = {
1038
1059
  "currency-format": handleCurrencyFormat,
@@ -15,6 +15,16 @@ export declare function valueIsError(value: string): boolean;
15
15
  export declare function isRealNull(val: any): boolean;
16
16
  export declare function isHexValue(str: string): boolean;
17
17
  export declare function isRealNum(val: any): boolean;
18
+ export type DateFormatInfo = {
19
+ year: number;
20
+ month: number;
21
+ day: number;
22
+ hours: number;
23
+ minutes: number;
24
+ seconds: number;
25
+ formatType: string;
26
+ };
27
+ export declare function detectDateFormat(str: string): DateFormatInfo | null;
18
28
  export declare function isdatetime(s: any): boolean;
19
29
  export declare function diff(now: any, then: any): number;
20
30
  export declare function isdatatypemulti(s: any): any;
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.detectDateFormat = detectDateFormat;
6
7
  exports.detectErrorFromValue = detectErrorFromValue;
7
8
  exports.diff = diff;
8
9
  exports.errorMessagesFromValue = exports.error = void 0;
@@ -56,33 +57,296 @@ function isRealNum(val) {
56
57
  }
57
58
  return !Number.isNaN(Number(val));
58
59
  }
59
- function checkDateTime(str) {
60
- var reg1 = /^(\d{4})-(\d{1,2})-(\d{1,2})(\s(\d{1,2}):(\d{1,2})(:(\d{1,2}))?)?$/;
61
- var reg2 = /^(\d{4})\/(\d{1,2})\/(\d{1,2})(\s(\d{1,2}):(\d{1,2})(:(\d{1,2}))?)?$/;
62
- if (!reg1.test(str) && !reg2.test(str)) {
63
- return false;
60
+ var MONTH_NAME_MAP = {
61
+ january: 1,
62
+ february: 2,
63
+ march: 3,
64
+ april: 4,
65
+ may: 5,
66
+ june: 6,
67
+ july: 7,
68
+ august: 8,
69
+ september: 9,
70
+ october: 10,
71
+ november: 11,
72
+ december: 12,
73
+ jan: 1,
74
+ feb: 2,
75
+ mar: 3,
76
+ apr: 4,
77
+ jun: 6,
78
+ jul: 7,
79
+ aug: 8,
80
+ sep: 9,
81
+ oct: 10,
82
+ nov: 11,
83
+ dec: 12
84
+ };
85
+ var MONTH_NAMES_RE = "january|february|march|april|may|june|july|august|september|october|november|december|jan|feb|mar|apr|jun|jul|aug|sep|oct|nov|dec";
86
+ var MONTH_ABBR_RE = "jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec";
87
+ function isValidDateParts(year, month, day) {
88
+ if (year < 1900) return false;
89
+ if (month < 1 || month > 12) return false;
90
+ if (day < 1 || day > 31) return false;
91
+ if (month === 2) {
92
+ var isLeap = new Date(year, 1, 29).getDate() === 29;
93
+ if (isLeap && day > 29) return false;
94
+ if (!isLeap && day > 28) return false;
64
95
  }
65
- var year = Number(RegExp.$1);
66
- var month = Number(RegExp.$2);
67
- var day = Number(RegExp.$3);
68
- if (year < 1900) {
69
- return false;
96
+ if ([4, 6, 9, 11].includes(month) && day > 30) return false;
97
+ return true;
98
+ }
99
+ function detectDateFormat(str) {
100
+ if (!str || str.toString().length < 5) return null;
101
+ var s = str.toString().trim();
102
+ var m;
103
+ m = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(s);
104
+ if (m) {
105
+ var y = +m[1];
106
+ var mo = +m[2];
107
+ var d = +m[3];
108
+ var h = +m[4];
109
+ var mi = +m[5];
110
+ var sec = m[6] != null ? +m[6] : 0;
111
+ if (isValidDateParts(y, mo, d)) {
112
+ return {
113
+ year: y,
114
+ month: mo,
115
+ day: d,
116
+ hours: h,
117
+ minutes: mi,
118
+ seconds: sec,
119
+ formatType: "yyyy-MM-ddTHH:mm"
120
+ };
121
+ }
70
122
  }
71
- if (month > 12) {
72
- return false;
123
+ m = /^(\d{4})-(\d{1,2})-(\d{1,2})(?:\s(\d{1,2}):(\d{2})(?::(\d{2}))?)?$/.exec(s);
124
+ if (m) {
125
+ var y = +m[1];
126
+ var mo = +m[2];
127
+ var d = +m[3];
128
+ if (isValidDateParts(y, mo, d)) {
129
+ var h = m[4] != null ? +m[4] : 0;
130
+ var mi = m[5] != null ? +m[5] : 0;
131
+ var sec = m[6] != null ? +m[6] : 0;
132
+ return {
133
+ year: y,
134
+ month: mo,
135
+ day: d,
136
+ hours: h,
137
+ minutes: mi,
138
+ seconds: sec,
139
+ formatType: m[4] != null ? "yyyy-MM-dd HH:mm" : "yyyy-MM-dd"
140
+ };
141
+ }
73
142
  }
74
- if (day > 31) {
75
- return false;
143
+ m = /^(\d{4})\/(\d{1,2})\/(\d{1,2})(?:\s(\d{1,2}):(\d{2})(?::(\d{2}))?)?$/.exec(s);
144
+ if (m) {
145
+ var y = +m[1];
146
+ var mo = +m[2];
147
+ var d = +m[3];
148
+ if (isValidDateParts(y, mo, d)) {
149
+ var h = m[4] != null ? +m[4] : 0;
150
+ var mi = m[5] != null ? +m[5] : 0;
151
+ var sec = m[6] != null ? +m[6] : 0;
152
+ return {
153
+ year: y,
154
+ month: mo,
155
+ day: d,
156
+ hours: h,
157
+ minutes: mi,
158
+ seconds: sec,
159
+ formatType: m[4] != null ? "yyyy/MM/dd HH:mm" : "yyyy/MM/dd"
160
+ };
161
+ }
76
162
  }
77
- if (month === 2) {
78
- if (new Date(year, 1, 29).getDate() === 29 && day > 29) {
79
- return false;
163
+ m = /^(\d{4})\.(\d{1,2})\.(\d{1,2})$/.exec(s);
164
+ if (m) {
165
+ var y = +m[1];
166
+ var mo = +m[2];
167
+ var d = +m[3];
168
+ if (isValidDateParts(y, mo, d)) {
169
+ return {
170
+ year: y,
171
+ month: mo,
172
+ day: d,
173
+ hours: 0,
174
+ minutes: 0,
175
+ seconds: 0,
176
+ formatType: "yyyy.MM.dd"
177
+ };
80
178
  }
81
- if (new Date(year, 1, 29).getDate() !== 29 && day > 28) {
82
- return false;
179
+ }
180
+ m = /^(\d{1,2})\/(\d{1,2})\/(\d{4})\s(\d{1,2}):(\d{2})\s?(AM|PM)$/i.exec(s);
181
+ if (m) {
182
+ var p1 = +m[1];
183
+ var p2 = +m[2];
184
+ var y = +m[3];
185
+ var h = +m[4];
186
+ var mi = +m[5];
187
+ var ampm = m[6].toUpperCase();
188
+ if (p1 <= 12 && isValidDateParts(y, p1, p2)) {
189
+ var actualH = h;
190
+ if (ampm === "PM" && h !== 12) actualH = h + 12;
191
+ if (ampm === "AM" && h === 12) actualH = 0;
192
+ return {
193
+ year: y,
194
+ month: p1,
195
+ day: p2,
196
+ hours: actualH,
197
+ minutes: mi,
198
+ seconds: 0,
199
+ formatType: "MM/dd/yyyy h:mm AM/PM"
200
+ };
83
201
  }
84
202
  }
85
- return true;
203
+ m = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/.exec(s);
204
+ if (m) {
205
+ var p1 = +m[1];
206
+ var p2 = +m[2];
207
+ var y = +m[3];
208
+ if (p1 > 12 && isValidDateParts(y, p2, p1)) {
209
+ return {
210
+ year: y,
211
+ month: p2,
212
+ day: p1,
213
+ hours: 0,
214
+ minutes: 0,
215
+ seconds: 0,
216
+ formatType: "dd/MM/yyyy"
217
+ };
218
+ }
219
+ if (p2 > 12 && p1 <= 12 && isValidDateParts(y, p1, p2)) {
220
+ var formatType = m[1].length === 1 ? "M/d/yyyy" : "MM/dd/yyyy";
221
+ return {
222
+ year: y,
223
+ month: p1,
224
+ day: p2,
225
+ hours: 0,
226
+ minutes: 0,
227
+ seconds: 0,
228
+ formatType: formatType
229
+ };
230
+ }
231
+ if (p1 <= 12 && p2 <= 31 && isValidDateParts(y, p1, p2)) {
232
+ var formatType = m[1].length === 1 ? "M/d/yyyy" : "MM/dd/yyyy";
233
+ return {
234
+ year: y,
235
+ month: p1,
236
+ day: p2,
237
+ hours: 0,
238
+ minutes: 0,
239
+ seconds: 0,
240
+ formatType: formatType
241
+ };
242
+ }
243
+ }
244
+ m = /^(\d{2})\/(\d{2})\/(\d{2})$/.exec(s);
245
+ if (m) {
246
+ var p1 = +m[1];
247
+ var p2 = +m[2];
248
+ var y = 2000 + +m[3];
249
+ if (p1 <= 12 && p2 <= 31 && isValidDateParts(y, p1, p2)) {
250
+ return {
251
+ year: y,
252
+ month: p1,
253
+ day: p2,
254
+ hours: 0,
255
+ minutes: 0,
256
+ seconds: 0,
257
+ formatType: "MM/dd/yy"
258
+ };
259
+ }
260
+ }
261
+ m = /^(\d{1,2})-(\d{1,2})-(\d{4})$/.exec(s);
262
+ if (m) {
263
+ var p1 = +m[1];
264
+ var p2 = +m[2];
265
+ var y = +m[3];
266
+ if (p1 > 12 && isValidDateParts(y, p2, p1)) {
267
+ return {
268
+ year: y,
269
+ month: p2,
270
+ day: p1,
271
+ hours: 0,
272
+ minutes: 0,
273
+ seconds: 0,
274
+ formatType: "dd-MM-yyyy"
275
+ };
276
+ }
277
+ }
278
+ m = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/.exec(s);
279
+ if (m) {
280
+ var p1 = +m[1];
281
+ var p2 = +m[2];
282
+ var y = +m[3];
283
+ if (p1 > 12 && isValidDateParts(y, p2, p1)) {
284
+ return {
285
+ year: y,
286
+ month: p2,
287
+ day: p1,
288
+ hours: 0,
289
+ minutes: 0,
290
+ seconds: 0,
291
+ formatType: "dd.MM.yyyy"
292
+ };
293
+ }
294
+ }
295
+ m = new RegExp("^(".concat(MONTH_NAMES_RE, ")\\s+(\\d{1,2}),?\\s+(\\d{4})$"), "i").exec(s);
296
+ if (m) {
297
+ var mo = MONTH_NAME_MAP[m[1].toLowerCase()];
298
+ var d = +m[2];
299
+ var y = +m[3];
300
+ if (mo && isValidDateParts(y, mo, d)) {
301
+ return {
302
+ year: y,
303
+ month: mo,
304
+ day: d,
305
+ hours: 0,
306
+ minutes: 0,
307
+ seconds: 0,
308
+ formatType: "named"
309
+ };
310
+ }
311
+ }
312
+ m = new RegExp("^(\\d{1,2})\\s+(".concat(MONTH_NAMES_RE, ")\\s+(\\d{4})$"), "i").exec(s);
313
+ if (m) {
314
+ var d = +m[1];
315
+ var mo = MONTH_NAME_MAP[m[2].toLowerCase()];
316
+ var y = +m[3];
317
+ if (mo && isValidDateParts(y, mo, d)) {
318
+ return {
319
+ year: y,
320
+ month: mo,
321
+ day: d,
322
+ hours: 0,
323
+ minutes: 0,
324
+ seconds: 0,
325
+ formatType: "named"
326
+ };
327
+ }
328
+ }
329
+ m = new RegExp("^(".concat(MONTH_ABBR_RE, ")-(\\d{1,2})-(\\d{4})$"), "i").exec(s);
330
+ if (m) {
331
+ var mo = MONTH_NAME_MAP[m[1].toLowerCase()];
332
+ var d = +m[2];
333
+ var y = +m[3];
334
+ if (mo && isValidDateParts(y, mo, d)) {
335
+ return {
336
+ year: y,
337
+ month: mo,
338
+ day: d,
339
+ hours: 0,
340
+ minutes: 0,
341
+ seconds: 0,
342
+ formatType: "named"
343
+ };
344
+ }
345
+ }
346
+ return null;
347
+ }
348
+ function checkDateTime(str) {
349
+ return detectDateFormat(str) !== null;
86
350
  }
87
351
  function isdatetime(s) {
88
352
  if (s === null || s.toString().length < 5) {