@syncfusion/ej2-calculate 35.1.37

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.
Files changed (173) hide show
  1. package/.eslintrc.json +263 -0
  2. package/README.md +132 -0
  3. package/base.d.ts +4 -0
  4. package/base.js +4 -0
  5. package/common.d.ts +4 -0
  6. package/common.js +4 -0
  7. package/dist/ej2-calculate.umd.min.js +11 -0
  8. package/dist/ej2-calculate.umd.min.js.map +1 -0
  9. package/dist/es6/ej2-calculate.es2015.js +24801 -0
  10. package/dist/es6/ej2-calculate.es2015.js.map +1 -0
  11. package/dist/es6/ej2-calculate.es5.js +27229 -0
  12. package/dist/es6/ej2-calculate.es5.js.map +1 -0
  13. package/dist/global/ej2-calculate.min.js +11 -0
  14. package/dist/global/ej2-calculate.min.js.map +1 -0
  15. package/dist/global/index.d.ts +14 -0
  16. package/formulas.d.ts +4 -0
  17. package/formulas.js +4 -0
  18. package/index.d.ts +4 -0
  19. package/index.js +4 -0
  20. package/license +10 -0
  21. package/package.json +30 -0
  22. package/src/base/calculate-model.d.ts +4 -0
  23. package/src/base/calculate-model.js +0 -0
  24. package/src/base/calculate.d.ts +1105 -0
  25. package/src/base/calculate.js +4720 -0
  26. package/src/base/index.d.ts +8 -0
  27. package/src/base/index.js +7 -0
  28. package/src/base/parser.d.ts +208 -0
  29. package/src/base/parser.js +1512 -0
  30. package/src/common/address.d.ts +59 -0
  31. package/src/common/address.js +96 -0
  32. package/src/common/cell-ref.d.ts +32 -0
  33. package/src/common/cell-ref.js +112 -0
  34. package/src/common/common.d.ts +44 -0
  35. package/src/common/common.js +134 -0
  36. package/src/common/enum.d.ts +94 -0
  37. package/src/common/enum.js +97 -0
  38. package/src/common/index.d.ts +9 -0
  39. package/src/common/index.js +8 -0
  40. package/src/common/interface.d.ts +122 -0
  41. package/src/common/interface.js +0 -0
  42. package/src/common/l10n.d.ts +24 -0
  43. package/src/common/l10n.js +54 -0
  44. package/src/common/number-date.d.ts +26 -0
  45. package/src/common/number-date.js +38 -0
  46. package/src/common/sheet-info.d.ts +10 -0
  47. package/src/common/sheet-info.js +17 -0
  48. package/src/common/sort.d.ts +17 -0
  49. package/src/common/sort.js +44 -0
  50. package/src/formulas/array.d.ts +47 -0
  51. package/src/formulas/array.js +718 -0
  52. package/src/formulas/basic.d.ts +47 -0
  53. package/src/formulas/basic.js +181 -0
  54. package/src/formulas/complex-numbers.d.ts +207 -0
  55. package/src/formulas/complex-numbers.js +549 -0
  56. package/src/formulas/database.d.ts +152 -0
  57. package/src/formulas/database.js +579 -0
  58. package/src/formulas/date-time-extra.d.ts +97 -0
  59. package/src/formulas/date-time-extra.js +415 -0
  60. package/src/formulas/date-time-intl.d.ts +57 -0
  61. package/src/formulas/date-time-intl.js +309 -0
  62. package/src/formulas/date-time.d.ts +164 -0
  63. package/src/formulas/date-time.js +1021 -0
  64. package/src/formulas/engineering-base.d.ts +150 -0
  65. package/src/formulas/engineering-base.js +404 -0
  66. package/src/formulas/engineering-bessel.d.ts +65 -0
  67. package/src/formulas/engineering-bessel.js +167 -0
  68. package/src/formulas/engineering-convert.d.ts +35 -0
  69. package/src/formulas/engineering-convert.js +120 -0
  70. package/src/formulas/engineering-misc.d.ts +64 -0
  71. package/src/formulas/engineering-misc.js +168 -0
  72. package/src/formulas/financial-amortization-ecma.d.ts +87 -0
  73. package/src/formulas/financial-amortization-ecma.js +288 -0
  74. package/src/formulas/financial-annuity.d.ts +104 -0
  75. package/src/formulas/financial-annuity.js +419 -0
  76. package/src/formulas/financial-bond-helpers.d.ts +106 -0
  77. package/src/formulas/financial-bond-helpers.js +190 -0
  78. package/src/formulas/financial-cashflow.d.ts +47 -0
  79. package/src/formulas/financial-cashflow.js +203 -0
  80. package/src/formulas/financial-coupons.d.ts +227 -0
  81. package/src/formulas/financial-coupons.js +810 -0
  82. package/src/formulas/financial-depreciation.d.ts +64 -0
  83. package/src/formulas/financial-depreciation.js +247 -0
  84. package/src/formulas/financial-rates.d.ts +54 -0
  85. package/src/formulas/financial-rates.js +140 -0
  86. package/src/formulas/financial-securities.d.ts +126 -0
  87. package/src/formulas/financial-securities.js +488 -0
  88. package/src/formulas/formula-math-helpers.d.ts +212 -0
  89. package/src/formulas/formula-math-helpers.js +599 -0
  90. package/src/formulas/formula-module-base.d.ts +54 -0
  91. package/src/formulas/formula-module-base.js +125 -0
  92. package/src/formulas/formula-owner.d.ts +17 -0
  93. package/src/formulas/formula-owner.js +0 -0
  94. package/src/formulas/index.d.ts +68 -0
  95. package/src/formulas/index.js +67 -0
  96. package/src/formulas/information-advanced.d.ts +44 -0
  97. package/src/formulas/information-advanced.js +157 -0
  98. package/src/formulas/information-ecma.d.ts +33 -0
  99. package/src/formulas/information-ecma.js +88 -0
  100. package/src/formulas/information-extra.d.ts +146 -0
  101. package/src/formulas/information-extra.js +351 -0
  102. package/src/formulas/information.d.ts +34 -0
  103. package/src/formulas/information.js +78 -0
  104. package/src/formulas/logical-extra.d.ts +75 -0
  105. package/src/formulas/logical-extra.js +217 -0
  106. package/src/formulas/logical.d.ts +83 -0
  107. package/src/formulas/logical.js +296 -0
  108. package/src/formulas/lookup-array.d.ts +98 -0
  109. package/src/formulas/lookup-array.js +364 -0
  110. package/src/formulas/lookup-ref-extra.d.ts +64 -0
  111. package/src/formulas/lookup-ref-extra.js +180 -0
  112. package/src/formulas/lookup-ref.d.ts +84 -0
  113. package/src/formulas/lookup-ref.js +263 -0
  114. package/src/formulas/lookup.d.ts +114 -0
  115. package/src/formulas/lookup.js +881 -0
  116. package/src/formulas/math-aggregate.d.ts +74 -0
  117. package/src/formulas/math-aggregate.js +376 -0
  118. package/src/formulas/math-ceiling-ecma.d.ts +42 -0
  119. package/src/formulas/math-ceiling-ecma.js +123 -0
  120. package/src/formulas/math-combinatorics.d.ts +75 -0
  121. package/src/formulas/math-combinatorics.js +290 -0
  122. package/src/formulas/math-misc.d.ts +164 -0
  123. package/src/formulas/math-misc.js +889 -0
  124. package/src/formulas/math-number.d.ts +76 -0
  125. package/src/formulas/math-number.js +261 -0
  126. package/src/formulas/math-rounding.d.ts +115 -0
  127. package/src/formulas/math-rounding.js +728 -0
  128. package/src/formulas/math-trig-hyperbolic.d.ts +55 -0
  129. package/src/formulas/math-trig-hyperbolic.js +113 -0
  130. package/src/formulas/math-trig.d.ts +165 -0
  131. package/src/formulas/math-trig.js +334 -0
  132. package/src/formulas/matrix-base.d.ts +13 -0
  133. package/src/formulas/matrix-base.js +169 -0
  134. package/src/formulas/matrix.d.ts +64 -0
  135. package/src/formulas/matrix.js +161 -0
  136. package/src/formulas/regression-ecma.d.ts +66 -0
  137. package/src/formulas/regression-ecma.js +234 -0
  138. package/src/formulas/statistical-advanced.d.ts +125 -0
  139. package/src/formulas/statistical-advanced.js +756 -0
  140. package/src/formulas/statistical-correlation.d.ts +75 -0
  141. package/src/formulas/statistical-correlation.js +198 -0
  142. package/src/formulas/statistical-dispersion.d.ts +108 -0
  143. package/src/formulas/statistical-dispersion.js +337 -0
  144. package/src/formulas/statistical-distribution-extended.d.ts +176 -0
  145. package/src/formulas/statistical-distribution-extended.js +668 -0
  146. package/src/formulas/statistical-distribution.d.ts +104 -0
  147. package/src/formulas/statistical-distribution.js +368 -0
  148. package/src/formulas/statistical-ecma.d.ts +95 -0
  149. package/src/formulas/statistical-ecma.js +392 -0
  150. package/src/formulas/statistical-extended.d.ts +136 -0
  151. package/src/formulas/statistical-extended.js +340 -0
  152. package/src/formulas/statistical-ifs.d.ts +46 -0
  153. package/src/formulas/statistical-ifs.js +180 -0
  154. package/src/formulas/statistical-moments.d.ts +84 -0
  155. package/src/formulas/statistical-moments.js +269 -0
  156. package/src/formulas/statistical-percentile.d.ts +56 -0
  157. package/src/formulas/statistical-percentile.js +195 -0
  158. package/src/formulas/statistical-sample-base.d.ts +14 -0
  159. package/src/formulas/statistical-sample-base.js +124 -0
  160. package/src/formulas/statistical.d.ts +135 -0
  161. package/src/formulas/statistical.js +542 -0
  162. package/src/formulas/text-advanced.d.ts +64 -0
  163. package/src/formulas/text-advanced.js +222 -0
  164. package/src/formulas/text-ecma.d.ts +54 -0
  165. package/src/formulas/text-ecma.js +106 -0
  166. package/src/formulas/text-extra.d.ts +216 -0
  167. package/src/formulas/text-extra.js +657 -0
  168. package/src/formulas/text.d.ts +125 -0
  169. package/src/formulas/text.js +628 -0
  170. package/src/global.js +1 -0
  171. package/src/index.d.ts +14 -0
  172. package/src/index.js +14 -0
  173. package/tslint.json +111 -0
@@ -0,0 +1,1021 @@
1
+ var __extends = (this && this.__extends) || (function () {
2
+ var extendStatics = function (d, b) {
3
+ extendStatics = Object.setPrototypeOf ||
4
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
6
+ return extendStatics(d, b);
7
+ };
8
+ return function (d, b) {
9
+ extendStatics(d, b);
10
+ function __() { this.constructor = d; }
11
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
12
+ };
13
+ })();
14
+ import { FormulasErrorsStrings, CommonErrors } from '../common/index';
15
+ import { isNullOrUndefined, Internationalization } from '@syncfusion/ej2-base';
16
+ import { dateToInt } from '../common/number-date';
17
+ import { FormulaModuleBase } from './formula-module-base';
18
+ /**
19
+ * Date and time construction, extraction, and serial-number conversion for spreadsheet calendars.
20
+ *
21
+ * Registers 14 functions including DATE, DAY, TODAY, DAYS, WEEKDAY, and others.
22
+ *
23
+ * @hidden
24
+ */
25
+ var DateTimeFormulas = /** @class */ (function (_super) {
26
+ __extends(DateTimeFormulas, _super);
27
+ /**
28
+ * @hidden
29
+ * @param {FormulaOwner} owner - Formula registration owner ({@link BasicFormulas}).
30
+ */
31
+ function DateTimeFormulas(owner) {
32
+ var _this = _super.call(this, owner) || this;
33
+ /** Formula definitions registered with {@link BasicFormulas}. */
34
+ _this.formulas = [
35
+ { formulaName: 'DATE', category: 'Date', description: 'Returns the date, given the year, month and day of the month.' },
36
+ { formulaName: 'DAY', category: 'Date', description: 'Returns the day of a given date.' },
37
+ { formulaName: 'TODAY', category: 'Date', description: 'Returns the current date as date value.' },
38
+ { formulaName: 'DAYS', category: 'Date', description: 'Returns the number of days between two dates.' },
39
+ { formulaName: 'WEEKDAY', category: 'Date', description: 'Returns the day of the week corresponding to a date.' },
40
+ { formulaName: 'TIME', category: 'Date & Time', description: 'Converts hours, minutes, seconds to the time formatted text.' },
41
+ { formulaName: 'EDATE', category: 'Date & Time', description: 'Returns a date with given number of months before or after the specified date.' },
42
+ { formulaName: 'EOMONTH', category: 'Date & Time', description: 'Returns the last day of the month that is a specified number of months before or after an initially supplied start date.' },
43
+ { formulaName: 'DATEVALUE', category: 'Date & Time', description: 'Converts a date string into date value.' },
44
+ { formulaName: 'HOUR', category: 'Date & Time', description: 'Returns the number of hours in a specified time string.' },
45
+ { formulaName: 'MINUTE', category: 'Date & Time', description: 'Returns the number of minutes in a specified time string.' },
46
+ { formulaName: 'SECOND', category: 'Date & Time', description: 'Returns the number of seconds in a specified time string.' },
47
+ { formulaName: 'NOW', category: 'Date & Time', description: 'Returns the current date and time.' },
48
+ { formulaName: 'MONTH', category: 'Date & Time', description: 'Returns the number of months in a specified date string.' }
49
+ ];
50
+ return _this;
51
+ }
52
+ /**
53
+ * Returns the date, given the year, month and day of the month.
54
+ *
55
+ * Excel: `DATE(...)`.
56
+ *
57
+ * @hidden
58
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
59
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * engine.computeFormula('=DATE(2024,1,15)');
64
+ * ```
65
+ */
66
+ DateTimeFormulas.prototype.ComputeDATE = function () {
67
+ var args = [];
68
+ for (var _i = 0; _i < arguments.length; _i++) {
69
+ args[_i] = arguments[_i];
70
+ }
71
+ var nestedFormula;
72
+ if (args.length && args[args.length - 1] === 'nestedFormulaTrue') {
73
+ nestedFormula = true;
74
+ args.pop();
75
+ }
76
+ if (isNullOrUndefined(args) || (args.length === 1 && args[0] === '')) {
77
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
78
+ }
79
+ if (args.length !== 3) {
80
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
81
+ }
82
+ var argArr = [];
83
+ for (var i = 0; i < args.length; ++i) {
84
+ argArr[i] = this.parent.getValueFromArg(args[i]);
85
+ }
86
+ argArr[0] = (argArr[0] === this.parent.trueValue) ? '1' : (argArr[0] === this.parent.falseValue) ? '0' : argArr[0];
87
+ argArr[1] = (argArr[1] === this.parent.trueValue) ? '1' : (argArr[1] === this.parent.falseValue) ? '0' : argArr[1];
88
+ argArr[2] = (argArr[2] === this.parent.trueValue) ? '1' : (argArr[2] === this.parent.falseValue) ? '0' : argArr[2];
89
+ for (var idx = 0; idx < argArr.length; idx++) {
90
+ var argsValue = argArr[idx];
91
+ if (this.parent.getErrorStrings().indexOf(argsValue) > -1) {
92
+ return argsValue;
93
+ }
94
+ else if ((argsValue === '""') || (argsValue === '"0"' && args[idx] !== '"0"') || (argsValue === '"TRUE"' || argsValue === '"FALSE"')) {
95
+ return this.parent.getErrorStrings()[CommonErrors.Value].toString();
96
+ }
97
+ }
98
+ var year = Math.floor(this.parent.parseFloat(argArr[0].split(this.parent.tic).join('')));
99
+ var month = Math.floor(this.parent.parseFloat(argArr[1].split(this.parent.tic).join('')));
100
+ var day = Math.floor(this.parent.parseFloat(argArr[2].split(this.parent.tic).join('')));
101
+ var days = 0;
102
+ if (!isNaN(year) && !isNaN(month) && !isNaN(day)) {
103
+ if ((year < 0 && month <= 12) || (year >= 10000 && month > 0)) {
104
+ return this.parent.getErrorStrings()[CommonErrors.Num].toString();
105
+ }
106
+ while (month > 12) {
107
+ month -= 12;
108
+ year++;
109
+ }
110
+ days = this.parent.getSerialDateFromDate(year, month, day);
111
+ }
112
+ else {
113
+ return this.parent.getErrorStrings()[CommonErrors.Value].toString();
114
+ }
115
+ if (days === 0) {
116
+ return this.parent.getErrorStrings()[CommonErrors.Num].toString();
117
+ }
118
+ var date = this.parent.fromOADate(days);
119
+ if (date.toString() !== 'Invalid Date') {
120
+ if ((date.getFullYear() < 1900) || (10000 <= date.getFullYear())) {
121
+ return this.parent.getErrorStrings()[CommonErrors.Num].toString();
122
+ }
123
+ if (!nestedFormula) {
124
+ return new Internationalization(this.parent.parentObject.locale || 'en-US').formatDate(date, { type: 'date', skeleton: 'yMd' });
125
+ }
126
+ }
127
+ return days.toString();
128
+ };
129
+ /**
130
+ * Returns the day of a given date.
131
+ *
132
+ * Excel: `DAY(...)`.
133
+ *
134
+ * @hidden
135
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
136
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
137
+ */
138
+ DateTimeFormulas.prototype.ComputeDAY = function () {
139
+ var args = [];
140
+ for (var _i = 0; _i < arguments.length; _i++) {
141
+ args[_i] = arguments[_i];
142
+ }
143
+ var result;
144
+ var dateVal;
145
+ var errCollection = this.parent.getErrorStrings();
146
+ if (isNullOrUndefined(args) || (args.length === 1 && args[0] === '')) {
147
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
148
+ }
149
+ else if (args.length > 1) {
150
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
151
+ }
152
+ if (args[0].startsWith(this.parent.tic)) {
153
+ dateVal = args[0].split(this.parent.tic).join('');
154
+ if (dateVal === '' || dateVal === this.parent.trueValue || dateVal === this.parent.falseValue) {
155
+ return errCollection[CommonErrors.Value];
156
+ }
157
+ }
158
+ else {
159
+ dateVal = this.parent.getValueFromArg(args[0].split(this.parent.tic).join(''));
160
+ if (this.parent.isCellReference(args[0]) && (dateVal.indexOf(this.parent.tic) > -1)) {
161
+ return errCollection[CommonErrors.Value];
162
+ }
163
+ }
164
+ if (errCollection.indexOf(dateVal) > -1) {
165
+ return dateVal;
166
+ }
167
+ else if (Number(dateVal) < 0) {
168
+ return errCollection[CommonErrors.Num];
169
+ }
170
+ else if (Math.floor(Number(dateVal)) === 0 || dateVal === this.parent.falseValue) {
171
+ return 0;
172
+ }
173
+ else if (dateVal === this.parent.trueValue) {
174
+ return 1;
175
+ }
176
+ result = this.parent.isNaN(Number(dateVal)) ? this.parent.parseDate(dateVal) : this.parent.intToDate(dateVal);
177
+ if (Object.prototype.toString.call(result) === '[object Date]') { /* eslint-disable-next-line */
178
+ result = ((new Date(result).getFullYear() < 1900) || (new Date(result).getFullYear()) > 9999) ? this.parent.isNumber(dateVal) ? 'Num' : 'NaN' : result.getDate();
179
+ }
180
+ if (result.toString() === 'NaN') {
181
+ return errCollection[CommonErrors.Value];
182
+ }
183
+ else if (result.toString() === 'Num') {
184
+ return errCollection[CommonErrors.Num];
185
+ }
186
+ return result;
187
+ };
188
+ /**
189
+ * Returns the current date as date value.
190
+ *
191
+ * Excel: `TODAY(...)`.
192
+ *
193
+ * @hidden
194
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
195
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
196
+ */
197
+ DateTimeFormulas.prototype.ComputeTODAY = function () {
198
+ var args = [];
199
+ for (var _i = 0; _i < arguments.length; _i++) {
200
+ args[_i] = arguments[_i];
201
+ }
202
+ var str;
203
+ if (args.length !== 1 || args[0] !== '') {
204
+ str = this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
205
+ }
206
+ else {
207
+ var dt = new Date(Date.now());
208
+ if (this.parent.parentObject.getModuleName() === 'spreadsheet') {
209
+ str = dateToInt(dt).toString();
210
+ if (this.parent.parser.storedStringText.toUpperCase().indexOf('TODAY') === 0 &&
211
+ this.parent.cell !== '') {
212
+ this.parent.parentObject.setDateFormat(this.parent.getSheetId(this.parent.grid), this.parent.rowIndex(this.parent.cell) - 1, this.parent.colIndex(this.parent.cell) - 1);
213
+ }
214
+ }
215
+ else {
216
+ str = dt.getFullYear() + '/' + this.parent.calculateDate((dt.getMonth() + 1).toString()) + '/'
217
+ + this.parent.calculateDate(dt.getDate().toString());
218
+ }
219
+ }
220
+ return str;
221
+ };
222
+ /**
223
+ * Returns the number of days between two dates.
224
+ *
225
+ * Excel: `DAYS(...)`.
226
+ *
227
+ * @hidden
228
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
229
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
230
+ */
231
+ DateTimeFormulas.prototype.ComputeDAYS = function () {
232
+ var _this = this;
233
+ var args = [];
234
+ for (var _i = 0; _i < arguments.length; _i++) {
235
+ args[_i] = arguments[_i];
236
+ }
237
+ var errCollection = this.parent.getErrorStrings();
238
+ if (isNullOrUndefined(args) && (args.length === 1 && args[0] === '')) {
239
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
240
+ }
241
+ else if (args.length !== 2) {
242
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
243
+ }
244
+ var processArgs = function (actuaValue) {
245
+ var value = _this.parent.getValueFromArg(actuaValue).trim();
246
+ if (value.indexOf(_this.parent.tic) > -1) {
247
+ value = value.split(_this.parent.tic).join('').trim();
248
+ if (value === '' || _this.parent.isCellReference(actuaValue) || value.toUpperCase() === _this.parent.trueValue ||
249
+ value.toUpperCase() === _this.parent.falseValue) {
250
+ return errCollection[CommonErrors.Value];
251
+ }
252
+ }
253
+ value = value.split(_this.parent.tic).join('');
254
+ if (value.toUpperCase() === _this.parent.trueValue) {
255
+ value = '1';
256
+ }
257
+ else if (value === '' || value.toUpperCase() === _this.parent.falseValue) {
258
+ value = '0';
259
+ }
260
+ else if (Number(value) < 0) {
261
+ return errCollection[CommonErrors.Num];
262
+ }
263
+ var dateCheck = _this.parent.hostParseDate(value.toString());
264
+ if (dateCheck.isDate || dateCheck.isTime) {
265
+ value = (_this.parent.parseDate(value).getTime() / (1000 * 3600 * 24)).toString();
266
+ }
267
+ return value;
268
+ };
269
+ var endDate = processArgs(args[0]);
270
+ if (errCollection.indexOf(endDate) > -1) {
271
+ return endDate;
272
+ }
273
+ var startDate = processArgs(args[1]);
274
+ if (errCollection.indexOf(startDate) > -1) {
275
+ return startDate;
276
+ }
277
+ var result = Math.floor(Number(endDate)) - Math.floor(Number(startDate));
278
+ if (isNaN(result)) {
279
+ return errCollection[CommonErrors.Value];
280
+ }
281
+ return result;
282
+ };
283
+ /**
284
+ * Returns the day of the week corresponding to a date.
285
+ *
286
+ * Excel: `WEEKDAY(...)`.
287
+ *
288
+ * @hidden
289
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
290
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
291
+ */
292
+ DateTimeFormulas.prototype.ComputeWEEKDAY = function () {
293
+ var args = [];
294
+ for (var _i = 0; _i < arguments.length; _i++) {
295
+ args[_i] = arguments[_i];
296
+ }
297
+ if ((args[0] === '' && isNullOrUndefined(args[1])) || args.length > 2) {
298
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
299
+ }
300
+ if ((args[0] === '' && args[1] === '') || args[1] === '') {
301
+ return this.parent.getErrorStrings()[CommonErrors.Num].toString();
302
+ }
303
+ if (args.length === 1) {
304
+ args.push('1');
305
+ }
306
+ if ((args[0].indexOf(this.parent.tic) > -1 && args[0].split(this.parent.tic).join('').trim() === '') || (args[1].split(this.parent.tic).join('').trim() === '') || (args[1].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(args[1].split(this.parent.tic).join(''))))) {
307
+ return this.parent.getErrorStrings()[CommonErrors.Value];
308
+ }
309
+ var date;
310
+ var value;
311
+ var day;
312
+ if (this.parent.isCellReference(args[0])) {
313
+ date = this.parent.getValueFromArg(args[0].split(this.parent.tic).join('')) || '0';
314
+ if (date.indexOf(this.parent.tic) > -1) {
315
+ return this.parent.getErrorStrings()[CommonErrors.Value];
316
+ }
317
+ }
318
+ else {
319
+ if ((args[0].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(args[0].split(this.parent.tic).join(''))))) {
320
+ date = this.parent.getValueFromArg(args[0]);
321
+ }
322
+ else {
323
+ date = this.parent.getValueFromArg(args[0].split(this.parent.tic).join('')) || '0';
324
+ }
325
+ }
326
+ if (this.parent.isCellReference(args[1])) {
327
+ value = this.parent.getValueFromArg(args[1].split(this.parent.tic).join('')) || '0';
328
+ }
329
+ else {
330
+ value = this.parent.getValueFromArg(args[1].split(this.parent.tic).join(''));
331
+ }
332
+ if (this.parent.getErrorStrings().indexOf(date) > -1) {
333
+ return date;
334
+ }
335
+ if (this.parent.getErrorStrings().indexOf(value) > -1) {
336
+ return value;
337
+ }
338
+ date = date === this.parent.trueValue ? '1' : (date === this.parent.falseValue ? '0' : date);
339
+ value = value === this.parent.trueValue ? '1' : (value === this.parent.falseValue ? '0' : value);
340
+ day = this.parent.parseFloat(date);
341
+ value = this.parent.parseFloat(value);
342
+ if (isNaN(value) || isNaN(day)) {
343
+ return this.parent.getErrorStrings()[CommonErrors.Value];
344
+ }
345
+ if (day < 0 || day > 2958465) {
346
+ return this.parent.getErrorStrings()[CommonErrors.Num].toString();
347
+ }
348
+ value = parseInt(value.toString(), 10);
349
+ day = day < 1 ? 0 : Math.floor(day) % 7;
350
+ switch (value) {
351
+ case 1:
352
+ case 17:
353
+ day = day <= 0 ? day + 7 : day;
354
+ break;
355
+ case 2:
356
+ case 11:
357
+ day = day - 1;
358
+ day = day <= 0 ? day + 7 : day;
359
+ break;
360
+ case 3:
361
+ day = day - 2;
362
+ day = day < 0 ? day + 7 : day;
363
+ break;
364
+ case 12:
365
+ day = day + 5;
366
+ day = day > 7 ? day - 7 : day;
367
+ break;
368
+ case 13:
369
+ day = day + 4;
370
+ day = day > 7 ? day - 7 : day;
371
+ break;
372
+ case 14:
373
+ day = day + 3;
374
+ day = day > 7 ? day - 7 : day;
375
+ break;
376
+ case 15:
377
+ day = day + 2;
378
+ day = day > 7 ? day - 7 : day;
379
+ break;
380
+ case 16:
381
+ day = day + 1;
382
+ day = day > 7 ? day - 7 : day;
383
+ break;
384
+ default:
385
+ day = this.parent.getErrorStrings()[CommonErrors.Num].toString();
386
+ break;
387
+ }
388
+ return day;
389
+ };
390
+ /**
391
+ * Converts hours, minutes, seconds to the time formatted text.
392
+ *
393
+ * Excel: `TIME(...)`.
394
+ *
395
+ * @hidden
396
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
397
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
398
+ */
399
+ DateTimeFormulas.prototype.ComputeTIME = function () {
400
+ var args = [];
401
+ for (var _i = 0; _i < arguments.length; _i++) {
402
+ args[_i] = arguments[_i];
403
+ }
404
+ var result;
405
+ if (isNullOrUndefined(args) || args.length !== 3) {
406
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
407
+ }
408
+ if (args[0].indexOf(this.parent.tic) > -1 && args[0].split(this.parent.tic).join('').trim() === '') {
409
+ return this.parent.getErrorStrings()[CommonErrors.Value];
410
+ }
411
+ else if (args[1].indexOf(this.parent.tic) > -1 && args[1].split(this.parent.tic).join('').trim() === '') {
412
+ return this.parent.getErrorStrings()[CommonErrors.Value];
413
+ }
414
+ else if (args[2].indexOf(this.parent.tic) > -1 && args[2].split(this.parent.tic).join('').trim() === '') {
415
+ return this.parent.getErrorStrings()[CommonErrors.Value];
416
+ }
417
+ var hours;
418
+ var minutes;
419
+ var seconds;
420
+ if (this.parent.isCellReference(args[0])) {
421
+ hours = this.parent.getValueFromArg(args[0].split(this.parent.tic).join('')) || '0';
422
+ if (hours.indexOf(this.parent.tic) > -1) {
423
+ return this.parent.getErrorStrings()[CommonErrors.Value];
424
+ }
425
+ }
426
+ else {
427
+ if (args[0].indexOf(this.parent.tic) > -1 && (args[0].split(this.parent.tic).join('') === this.parent.trueValue || args[0].split(this.parent.tic).join('') === this.parent.falseValue)) {
428
+ return this.parent.getErrorStrings()[CommonErrors.Value];
429
+ }
430
+ hours = this.parent.getValueFromArg(args[0]).split(this.parent.tic).join('') || '0';
431
+ }
432
+ if (this.parent.getErrorStrings().indexOf(hours) > -1) {
433
+ return hours;
434
+ }
435
+ if (isNaN(this.parent.parseFloat(hours)) && !(hours === this.parent.trueValue || hours === this.parent.falseValue)) {
436
+ return this.parent.getErrorStrings()[CommonErrors.Value];
437
+ }
438
+ if (this.parent.isCellReference(args[1])) {
439
+ minutes = this.parent.getValueFromArg(args[1].split(this.parent.tic).join('')) || '0';
440
+ if (minutes.indexOf(this.parent.tic) > -1) {
441
+ return this.parent.getErrorStrings()[CommonErrors.Value];
442
+ }
443
+ }
444
+ else {
445
+ if (args[1].indexOf(this.parent.tic) > -1 && (args[1].split(this.parent.tic).join('') === this.parent.trueValue || args[1].split(this.parent.tic).join('') === this.parent.falseValue)) {
446
+ return this.parent.getErrorStrings()[CommonErrors.Value];
447
+ }
448
+ minutes = this.parent.getValueFromArg(args[1]).split(this.parent.tic).join('') || '0';
449
+ }
450
+ if (this.parent.getErrorStrings().indexOf(minutes) > -1) {
451
+ return minutes;
452
+ }
453
+ if (isNaN(this.parent.parseFloat(minutes)) && !(minutes === this.parent.trueValue || minutes === this.parent.falseValue)) {
454
+ return this.parent.getErrorStrings()[CommonErrors.Value];
455
+ }
456
+ if (this.parent.isCellReference(args[2])) {
457
+ seconds = this.parent.getValueFromArg(args[2].split(this.parent.tic).join('')) || '0';
458
+ if (seconds.indexOf(this.parent.tic) > -1) {
459
+ return this.parent.getErrorStrings()[CommonErrors.Value];
460
+ }
461
+ }
462
+ else {
463
+ if (args[2].indexOf(this.parent.tic) > -1 && (args[2].split(this.parent.tic).join('') === this.parent.trueValue || args[2].split(this.parent.tic).join('') === this.parent.falseValue)) {
464
+ return this.parent.getErrorStrings()[CommonErrors.Value];
465
+ }
466
+ seconds = this.parent.getValueFromArg(args[2]).split(this.parent.tic).join('') || '0';
467
+ }
468
+ if (this.parent.getErrorStrings().indexOf(seconds) > -1) {
469
+ return seconds;
470
+ }
471
+ if (isNaN(this.parent.parseFloat(seconds)) && !(seconds === this.parent.trueValue || seconds === this.parent.falseValue)) {
472
+ return this.parent.getErrorStrings()[CommonErrors.Value];
473
+ }
474
+ hours = hours === this.parent.trueValue ? '1' : (hours === this.parent.falseValue ? '0' : hours);
475
+ minutes = minutes === this.parent.trueValue ? '1' : (minutes === this.parent.falseValue ? '0' : minutes);
476
+ seconds = seconds === this.parent.trueValue ? '1' : (seconds === this.parent.falseValue ? '0' : seconds);
477
+ hours = parseInt(this.parent.parseFloat(hours).toString(), 10);
478
+ minutes = parseInt(this.parent.parseFloat(minutes).toString(), 10);
479
+ seconds = parseInt(this.parent.parseFloat(seconds).toString(), 10);
480
+ if (isNaN(hours) || isNaN(minutes) || isNaN(seconds)) {
481
+ return this.parent.getErrorStrings()[CommonErrors.Value];
482
+ }
483
+ if (hours > 32767 || minutes > 32767 || seconds > 32767) {
484
+ return this.parent.getErrorStrings()[CommonErrors.Num];
485
+ }
486
+ var value = new Date(1900, 0, 1, hours, minutes, seconds);
487
+ if (value.getFullYear() < 1900) {
488
+ return this.parent.getErrorStrings()[CommonErrors.Num];
489
+ }
490
+ var h = value.getHours();
491
+ var m = value.getMinutes();
492
+ var s = value.getSeconds();
493
+ m = m < 10 ? '0' + m : m;
494
+ s = s < 10 ? '0' + s : s;
495
+ h = h < 10 ? '0' + h : h;
496
+ result = h + ':' + m + ':' + s;
497
+ var timeCheck = this.parent.hostParseDate(result.toString());
498
+ if (timeCheck.isTime) {
499
+ result = timeCheck.value;
500
+ }
501
+ return result;
502
+ };
503
+ /**
504
+ * Returns a date with given number of months before or after the specified date.
505
+ *
506
+ * Excel: `EDATE(...)`.
507
+ *
508
+ * @hidden
509
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
510
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
511
+ */
512
+ DateTimeFormulas.prototype.ComputeEDATE = function () {
513
+ var args = [];
514
+ for (var _i = 0; _i < arguments.length; _i++) {
515
+ args[_i] = arguments[_i];
516
+ }
517
+ if (args.length !== 2 || isNullOrUndefined(args)) {
518
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
519
+ }
520
+ if (args[0] === '' || args[1] === '') {
521
+ return this.parent.getErrorStrings()[CommonErrors.NA];
522
+ }
523
+ if (args[0].split(this.parent.tic).join('') === '' || args[1].split(this.parent.tic).join('') === ''
524
+ || (args[1].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(args[1].split(this.parent.tic).join(''))))) {
525
+ return this.parent.getErrorStrings()[CommonErrors.Value];
526
+ }
527
+ var dValue;
528
+ var mValue;
529
+ if (this.parent.isCellReference(args[0])) {
530
+ if (args[0].indexOf(':') > -1) {
531
+ return this.parent.getErrorStrings()[CommonErrors.Value];
532
+ }
533
+ dValue = this.parent.getValueFromArg(args[0].split(this.parent.tic).join('')) || '0';
534
+ if (dValue.indexOf(this.parent.tic) > -1) {
535
+ return this.parent.getErrorStrings()[CommonErrors.Value];
536
+ }
537
+ if (this.parent.getErrorStrings().indexOf(dValue.toString()) > -1) {
538
+ return dValue.toString();
539
+ }
540
+ }
541
+ else {
542
+ dValue = this.parent.getValueFromArg(args[0].split(this.parent.tic).join(''));
543
+ }
544
+ if (this.parent.isCellReference(args[1])) {
545
+ if (args[1].indexOf(':') > -1) {
546
+ return this.parent.getErrorStrings()[CommonErrors.Value];
547
+ }
548
+ mValue = this.parent.getValueFromArg(args[1].split(this.parent.tic).join('')) || '0';
549
+ }
550
+ else {
551
+ mValue = this.parent.getValueFromArg(args[1].split(this.parent.tic).join(''));
552
+ }
553
+ if (this.parent.getErrorStrings().indexOf(mValue) > -1) {
554
+ return mValue;
555
+ }
556
+ mValue = parseInt(mValue, 10);
557
+ var date;
558
+ if (this.parent.isNumber(dValue)) {
559
+ dValue = parseInt(dValue, 10);
560
+ if (dValue < 0 || dValue > 2958465) {
561
+ return this.parent.getErrorStrings()[CommonErrors.Num];
562
+ }
563
+ date = this.parent.fromOADate(dValue);
564
+ }
565
+ else {
566
+ date = this.parent.checkDateFormat(dValue);
567
+ }
568
+ if (isNaN(mValue) || isNullOrUndefined(this.parent.isDate(date)) || date.getFullYear() > 9999) {
569
+ return this.parent.getErrorStrings()[CommonErrors.Value];
570
+ }
571
+ var checkDate = date.getDate();
572
+ date.setMonth(date.getMonth() + mValue);
573
+ if (checkDate !== date.getDate()) {
574
+ date.setDate(0);
575
+ //For the date like 31st of January and mValue as 1, the setMonth returns 3rd of March, so we using setDate(0) to return 28th of February.
576
+ }
577
+ var result = dateToInt(date);
578
+ // For 0 and 1 values we are considering the same starting date as 1/1/1900, so for 0 we are decrementing the value with 1.
579
+ if (dValue.toString() === '0') {
580
+ result -= 1;
581
+ }
582
+ if (result < 0 || result > 2958465) {
583
+ return this.parent.getErrorStrings()[CommonErrors.Num];
584
+ }
585
+ return result.toString();
586
+ };
587
+ /**
588
+ * Returns the last day of the month that is a specified number of months before or after an initially supplied start date.
589
+ *
590
+ * Excel: `EOMONTH(...)`.
591
+ *
592
+ * @hidden
593
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
594
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
595
+ */
596
+ DateTimeFormulas.prototype.ComputeEOMONTH = function () {
597
+ var args = [];
598
+ for (var _i = 0; _i < arguments.length; _i++) {
599
+ args[_i] = arguments[_i];
600
+ }
601
+ if (args.length !== 2 || isNullOrUndefined(args)) {
602
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
603
+ }
604
+ if (args[0] === '' || args[1] === '') {
605
+ return this.parent.getErrorStrings()[CommonErrors.NA];
606
+ }
607
+ if (args[0].split(this.parent.tic).join('') === '' || args[1].split(this.parent.tic).join('') === ''
608
+ || (args[1].indexOf(this.parent.tic) > -1 && isNaN(this.parent.parseFloat(args[1].split(this.parent.tic).join(''))))) {
609
+ return this.parent.getErrorStrings()[CommonErrors.Value];
610
+ }
611
+ var dateValue;
612
+ var monthValue;
613
+ if (this.parent.isCellReference(args[0])) {
614
+ if (args[0].indexOf(':') > -1) {
615
+ return this.parent.getErrorStrings()[CommonErrors.Value];
616
+ }
617
+ dateValue = this.parent.getValueFromArg(args[0].split(this.parent.tic).join('')) || '0';
618
+ if (dateValue.indexOf(this.parent.tic) > -1) {
619
+ return this.parent.getErrorStrings()[CommonErrors.Value];
620
+ }
621
+ }
622
+ else {
623
+ dateValue = this.parent.getValueFromArg(args[0]).split(this.parent.tic).join('');
624
+ }
625
+ if (this.parent.getErrorStrings().indexOf(dateValue) > -1) {
626
+ return dateValue;
627
+ }
628
+ if (this.parent.isCellReference(args[1])) {
629
+ if (args[1].indexOf(':') > -1) {
630
+ return this.parent.getErrorStrings()[CommonErrors.Value];
631
+ }
632
+ monthValue = this.parent.getValueFromArg(args[1].split(this.parent.tic).join('')) || '0';
633
+ }
634
+ else {
635
+ monthValue = this.parent.getValueFromArg(args[1].split(this.parent.tic).join(''));
636
+ }
637
+ if (this.parent.getErrorStrings().indexOf(monthValue) > -1) {
638
+ return monthValue;
639
+ }
640
+ monthValue = parseInt(monthValue, 10);
641
+ var date;
642
+ if (this.parent.isNumber(dateValue)) {
643
+ dateValue = parseInt(dateValue, 10);
644
+ if (dateValue < 0 || dateValue > 2958465) {
645
+ return this.parent.getErrorStrings()[CommonErrors.Num];
646
+ }
647
+ date = this.parent.fromOADate(dateValue);
648
+ }
649
+ else {
650
+ date = this.parent.checkDateFormat(dateValue);
651
+ }
652
+ if (isNaN(monthValue) || isNullOrUndefined(this.parent.isDate(date)) || date.getFullYear() > 9999) {
653
+ return this.parent.getErrorStrings()[CommonErrors.Value];
654
+ }
655
+ date = new Date(date.getFullYear(), date.getMonth() + (monthValue + 1), 0);
656
+ var result = dateToInt(date);
657
+ if (result < 0 || result > 2958465 || date.getFullYear() < 1900) {
658
+ return this.parent.getErrorStrings()[CommonErrors.Num];
659
+ }
660
+ return result.toString();
661
+ };
662
+ /**
663
+ * Converts a date string into date value.
664
+ *
665
+ * Excel: `DATEVALUE(...)`.
666
+ *
667
+ * @hidden
668
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
669
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
670
+ */
671
+ DateTimeFormulas.prototype.ComputeDATEVALUE = function () {
672
+ var args = [];
673
+ for (var _i = 0; _i < arguments.length; _i++) {
674
+ args[_i] = arguments[_i];
675
+ }
676
+ var dValue;
677
+ var computedDvalue;
678
+ var errCollection = this.parent.getErrorStrings();
679
+ if (args[0] === '') {
680
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
681
+ }
682
+ else if (args.length > 1) {
683
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
684
+ }
685
+ dValue = computedDvalue = this.parent.getValueFromArg(args[0]) || '0';
686
+ if (errCollection.indexOf(dValue) > -1) {
687
+ return dValue;
688
+ }
689
+ if (this.parent.isCellReference(args[0])) {
690
+ if ((args[0].indexOf(':') > -1) || dValue.startsWith(this.parent.tic)) {
691
+ return errCollection[CommonErrors.Value];
692
+ }
693
+ }
694
+ else {
695
+ dValue = (args[0]).split(this.parent.tic).join('') || '0';
696
+ }
697
+ if (!(!(this.parent.isNumber(dValue)) && !isNullOrUndefined(this.parent.isDate(dValue)))) {
698
+ if (!this.parent.isNumber(computedDvalue) && this.parent.isDate(computedDvalue)) {
699
+ dValue = computedDvalue;
700
+ }
701
+ else {
702
+ return errCollection[CommonErrors.Value];
703
+ }
704
+ }
705
+ var date = this.parent.parseDate(dValue);
706
+ if (errCollection.indexOf(dValue) > -1) {
707
+ return dValue;
708
+ }
709
+ else if (isNullOrUndefined(date) || date.toString() === 'Invalid Date' ||
710
+ date.getFullYear() < 1900 || date.getFullYear() > 9999) {
711
+ return this.parent.getErrorStrings()[CommonErrors.Value];
712
+ }
713
+ else {
714
+ dValue = this.parent.toOADate(date).toString();
715
+ }
716
+ return parseFloat(dValue).toFixed(0).toString();
717
+ };
718
+ /**
719
+ * Returns the number of hours in a specified time string.
720
+ *
721
+ * Excel: `HOUR(...)`.
722
+ *
723
+ * @hidden
724
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
725
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
726
+ */
727
+ DateTimeFormulas.prototype.ComputeHOUR = function () {
728
+ var args = [];
729
+ for (var _i = 0; _i < arguments.length; _i++) {
730
+ args[_i] = arguments[_i];
731
+ }
732
+ if (args.length !== 1 || isNullOrUndefined(args) || args[0] === '') {
733
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
734
+ }
735
+ if (args[0].split(this.parent.tic).join('').trim() === '') {
736
+ return this.parent.getErrorStrings()[CommonErrors.Value];
737
+ }
738
+ var cellVal;
739
+ if (this.parent.isCellReference(args[0])) {
740
+ cellVal = this.parent.getValueFromArg(args[0].split(this.parent.tic).join('')) || '0';
741
+ if (cellVal.indexOf(this.parent.tic) > -1) {
742
+ return this.parent.getErrorStrings()[CommonErrors.Value];
743
+ }
744
+ }
745
+ else {
746
+ if (args[0].indexOf(this.parent.tic) > -1 && (args[0].split(this.parent.tic).join('') === this.parent.trueValue || args[0].split(this.parent.tic).join('') === this.parent.falseValue)) {
747
+ return this.parent.getErrorStrings()[CommonErrors.Value];
748
+ }
749
+ cellVal = this.parent.getValueFromArg(args[0]).split(this.parent.tic).join('');
750
+ }
751
+ if (this.parent.getErrorStrings().indexOf(cellVal) > -1) {
752
+ return cellVal;
753
+ }
754
+ cellVal = cellVal === this.parent.trueValue ? '1' : (cellVal === this.parent.falseValue ? '0' : cellVal);
755
+ var date;
756
+ if (this.parent.isNumber(cellVal)) {
757
+ if (this.parent.parseFloat(cellVal) < 0 || this.parent.parseFloat(cellVal) > 2958465) {
758
+ return this.parent.getErrorStrings()[CommonErrors.Num];
759
+ }
760
+ date = this.parent.intToTime(cellVal);
761
+ }
762
+ else {
763
+ var dateCheck = this.parent.hostParseDate(cellVal.toString());
764
+ if (dateCheck.isDate || dateCheck.isTime) {
765
+ date = dateCheck.dateObj;
766
+ }
767
+ else {
768
+ return this.parent.getErrorStrings()[CommonErrors.Value];
769
+ }
770
+ }
771
+ if (date.toString() === 'Invalid Date') {
772
+ date = new Date(Date.parse(cellVal));
773
+ }
774
+ if (date.toString() === 'Invalid Date') {
775
+ var argVal = new Date(Date.now()).toLocaleDateString() + ' ' + cellVal;
776
+ date = new Date(Date.parse(argVal));
777
+ }
778
+ if (date.toString() === 'Invalid Date') {
779
+ date = this.parent.fromOADate(this.parent.parseFloat(cellVal));
780
+ }
781
+ if (date.toString() === 'Invalid Date') {
782
+ return this.parent.getErrorStrings()[CommonErrors.Value];
783
+ }
784
+ if (date.getFullYear() < 1900 || date.getFullYear() > 9999) {
785
+ return this.parent.getErrorStrings()[CommonErrors.Value];
786
+ }
787
+ return date.getHours();
788
+ };
789
+ /**
790
+ * Returns the number of minutes in a specified time string.
791
+ *
792
+ * Excel: `MINUTE(...)`.
793
+ *
794
+ * @hidden
795
+ * @param {string[]} argArr - Formula argument tokens from the Calculate engine.
796
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
797
+ */
798
+ DateTimeFormulas.prototype.ComputeMINUTE = function () {
799
+ var argArr = [];
800
+ for (var _i = 0; _i < arguments.length; _i++) {
801
+ argArr[_i] = arguments[_i];
802
+ }
803
+ if (argArr.length !== 1 || isNullOrUndefined(argArr) || argArr[0] === '') {
804
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
805
+ }
806
+ if (argArr[0].split(this.parent.tic).join('').trim() === '') {
807
+ return this.parent.getErrorStrings()[CommonErrors.Value];
808
+ }
809
+ var cellVal;
810
+ if (this.parent.isCellReference(argArr[0])) {
811
+ cellVal = this.parent.getValueFromArg(argArr[0].split(this.parent.tic).join('')) || '0';
812
+ if (cellVal.indexOf(this.parent.tic) > -1) {
813
+ return this.parent.getErrorStrings()[CommonErrors.Value];
814
+ }
815
+ }
816
+ else {
817
+ if (argArr[0].indexOf(this.parent.tic) > -1 && (argArr[0].split(this.parent.tic).join('') === this.parent.trueValue || argArr[0].split(this.parent.tic).join('') === this.parent.falseValue)) {
818
+ return this.parent.getErrorStrings()[CommonErrors.Value];
819
+ }
820
+ cellVal = this.parent.getValueFromArg(argArr[0]).split(this.parent.tic).join('');
821
+ }
822
+ if (this.parent.getErrorStrings().indexOf(cellVal) > -1) {
823
+ return cellVal;
824
+ }
825
+ cellVal = cellVal === this.parent.trueValue ? '1' : (cellVal === this.parent.falseValue ? '0' : cellVal);
826
+ var dateVal;
827
+ if (this.parent.isNumber(cellVal)) {
828
+ if (this.parent.parseFloat(cellVal) < 0 || this.parent.parseFloat(cellVal) > 2958465) {
829
+ return this.parent.getErrorStrings()[CommonErrors.Num];
830
+ }
831
+ dateVal = this.parent.intToTime(cellVal);
832
+ }
833
+ else {
834
+ var dateCheck = this.parent.hostParseDate(cellVal.toString());
835
+ if (dateCheck.isDate || dateCheck.isTime) {
836
+ dateVal = dateCheck.dateObj;
837
+ }
838
+ else {
839
+ return this.parent.getErrorStrings()[CommonErrors.Value];
840
+ }
841
+ }
842
+ if (dateVal.toString() === 'Invalid Date') {
843
+ dateVal = new Date(Date.parse(cellVal));
844
+ }
845
+ if (dateVal.toString() === 'Invalid Date') {
846
+ var argVal = new Date(Date.now()).toLocaleDateString() + ' ' + cellVal;
847
+ dateVal = new Date(Date.parse(argVal));
848
+ }
849
+ if (dateVal.toString() === 'Invalid Date') {
850
+ dateVal = this.parent.fromOADate(this.parent.parseFloat(cellVal));
851
+ }
852
+ if (dateVal.toString() === 'Invalid Date') {
853
+ return this.parent.getErrorStrings()[CommonErrors.Value];
854
+ }
855
+ if (dateVal.getFullYear() < 1900 || dateVal.getFullYear() > 9999) {
856
+ return this.parent.getErrorStrings()[CommonErrors.Value];
857
+ }
858
+ return dateVal.getMinutes();
859
+ };
860
+ /**
861
+ * Returns the number of seconds in a specified time string.
862
+ *
863
+ * Excel: `SECOND(...)`.
864
+ *
865
+ * @hidden
866
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
867
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
868
+ */
869
+ DateTimeFormulas.prototype.ComputeSECOND = function () {
870
+ var args = [];
871
+ for (var _i = 0; _i < arguments.length; _i++) {
872
+ args[_i] = arguments[_i];
873
+ }
874
+ if (args.length !== 1 || isNullOrUndefined(args) || args[0] === '') {
875
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
876
+ }
877
+ if (args[0].split(this.parent.tic).join('').trim() === '') {
878
+ return this.parent.getErrorStrings()[CommonErrors.Value];
879
+ }
880
+ var cellVal;
881
+ if (this.parent.isCellReference(args[0])) {
882
+ cellVal = this.parent.getValueFromArg(args[0].split(this.parent.tic).join('')) || '0';
883
+ if (cellVal.indexOf(this.parent.tic) > -1) {
884
+ return this.parent.getErrorStrings()[CommonErrors.Value];
885
+ }
886
+ }
887
+ else {
888
+ if (args[0].indexOf(this.parent.tic) > -1 && (args[0].split(this.parent.tic).join('') === this.parent.trueValue || args[0].split(this.parent.tic).join('') === this.parent.falseValue)) {
889
+ return this.parent.getErrorStrings()[CommonErrors.Value];
890
+ }
891
+ cellVal = this.parent.getValueFromArg(args[0]).split(this.parent.tic).join('');
892
+ }
893
+ if (this.parent.getErrorStrings().indexOf(cellVal) > -1) {
894
+ return cellVal;
895
+ }
896
+ cellVal = cellVal === this.parent.trueValue ? '1' : (cellVal === this.parent.falseValue ? '0' : cellVal);
897
+ var dateValue;
898
+ if (this.parent.isNumber(cellVal)) {
899
+ if (this.parent.parseFloat(cellVal) < 0 || this.parent.parseFloat(cellVal) > 2958465) {
900
+ return this.parent.getErrorStrings()[CommonErrors.Num];
901
+ }
902
+ dateValue = this.parent.intToTime(cellVal);
903
+ }
904
+ else {
905
+ var dateCheck = this.parent.hostParseDate(cellVal.toString());
906
+ if (dateCheck.isDate || dateCheck.isTime) {
907
+ dateValue = dateCheck.dateObj;
908
+ }
909
+ else {
910
+ return this.parent.getErrorStrings()[CommonErrors.Value];
911
+ }
912
+ }
913
+ if (dateValue.toString() === 'Invalid Date') {
914
+ dateValue = new Date(Date.parse(cellVal));
915
+ }
916
+ if (dateValue.toString() === 'Invalid Date') {
917
+ var argVal = (new Date(Date.now())).toLocaleDateString() + ' ' + cellVal;
918
+ dateValue = new Date(Date.parse(argVal));
919
+ }
920
+ if (dateValue.toString() === 'Invalid Date') {
921
+ dateValue = this.parent.fromOADate(this.parent.parseFloat(cellVal));
922
+ }
923
+ if (dateValue.toString() === 'Invalid Date') {
924
+ return this.parent.getErrorStrings()[CommonErrors.Value];
925
+ }
926
+ if (dateValue.getFullYear() < 1900 || dateValue.getFullYear() > 9999) {
927
+ return this.parent.getErrorStrings()[CommonErrors.Value];
928
+ }
929
+ return dateValue.getSeconds();
930
+ };
931
+ /**
932
+ * Returns the current date and time.
933
+ *
934
+ * Excel: `NOW(...)`.
935
+ *
936
+ * @hidden
937
+ * @param {string[]} args - Formula argument tokens from the Calculate engine.
938
+ * @returns {string | number} - Computed text result or an Excel error token such as `#VALUE!`.
939
+ */
940
+ DateTimeFormulas.prototype.ComputeNOW = function () {
941
+ var args = [];
942
+ for (var _i = 0; _i < arguments.length; _i++) {
943
+ args[_i] = arguments[_i];
944
+ }
945
+ if (args.length !== 1 || args[0] !== '') {
946
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
947
+ }
948
+ return dateToInt(new Date(Date.now()), true).toString();
949
+ };
950
+ /**
951
+ * Returns the number of months in a specified date string.
952
+ *
953
+ * Excel: `MONTH(...)`.
954
+ *
955
+ * @hidden
956
+ * @param {string[]} argsVal - Formula argument tokens from the Calculate engine.
957
+ * @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
958
+ */
959
+ DateTimeFormulas.prototype.ComputeMONTH = function () {
960
+ var argsVal = [];
961
+ for (var _i = 0; _i < arguments.length; _i++) {
962
+ argsVal[_i] = arguments[_i];
963
+ }
964
+ var errCollection = this.parent.getErrorStrings();
965
+ if (argsVal.length === 1 && argsVal[0] === '') {
966
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
967
+ }
968
+ else if (argsVal.length !== 1) {
969
+ return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
970
+ }
971
+ var value = this.parent.getValueFromArg(argsVal[0]).trim();
972
+ if (errCollection.indexOf(value) > -1) {
973
+ return value;
974
+ }
975
+ if (this.parent.isCellReference(argsVal[0])) {
976
+ if (value.indexOf(this.parent.tic) > -1) {
977
+ return errCollection[CommonErrors.Value];
978
+ }
979
+ else if (value === '') {
980
+ return 1;
981
+ }
982
+ }
983
+ else {
984
+ if (value.toUpperCase() === '"TRUE"' || value.toUpperCase() === '"FALSE"') {
985
+ return errCollection[CommonErrors.Value];
986
+ }
987
+ value = value.split(this.parent.tic).join('');
988
+ }
989
+ if (value === '') {
990
+ return errCollection[CommonErrors.Value];
991
+ }
992
+ else if (value === this.parent.trueValue || value === this.parent.falseValue ||
993
+ (Number(value) > -1 && Number(value) < 32)) {
994
+ return 1;
995
+ }
996
+ else if (Number(value) < 0) {
997
+ return errCollection[CommonErrors.Num];
998
+ }
999
+ else if (value.indexOf('%') > -1) {
1000
+ value = (Number(value.split('%')[0]) * 0.01).toString();
1001
+ }
1002
+ if (this.parent.isNumber(value)) {
1003
+ value = parseInt((Math.floor(Number(value)).toString()), 10);
1004
+ }
1005
+ var date = this.parent.parseDate(value);
1006
+ if (date.toString() === 'Invalid Date') {
1007
+ if (this.parent.isNumber(value)) {
1008
+ return errCollection[CommonErrors.Num];
1009
+ }
1010
+ else {
1011
+ return errCollection[CommonErrors.Value];
1012
+ }
1013
+ }
1014
+ else if ((date.getFullYear() < 1900) || (10000 <= date.getFullYear())) {
1015
+ return errCollection[CommonErrors.Num];
1016
+ }
1017
+ return (date.getMonth() + 1).toString();
1018
+ };
1019
+ return DateTimeFormulas;
1020
+ }(FormulaModuleBase));
1021
+ export { DateTimeFormulas };