@ui5/webcomponents-localization 0.0.0-538a79a92 → 0.0.0-5b6c21cc6

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 (238) hide show
  1. package/.eslintignore +2 -0
  2. package/.npsrc.json +3 -0
  3. package/CHANGELOG.md +1849 -0
  4. package/README.md +37 -9
  5. package/dist/.tsbuildinfo +1 -0
  6. package/dist/Assets-fetch.d.ts +1 -0
  7. package/dist/Assets-fetch.js +3 -0
  8. package/dist/Assets-fetch.js.map +1 -0
  9. package/dist/Assets.d.ts +1 -0
  10. package/dist/Assets.js +2 -1
  11. package/dist/Assets.js.map +1 -0
  12. package/dist/CalendarUtils.d.ts +3 -0
  13. package/dist/CalendarUtils.js +6 -0
  14. package/dist/CalendarUtils.js.map +1 -0
  15. package/dist/DateFormat.d.ts +5 -0
  16. package/dist/DateFormat.js +6 -2
  17. package/dist/DateFormat.js.map +1 -0
  18. package/dist/LocaleData.d.ts +5 -0
  19. package/dist/LocaleData.js +6 -2
  20. package/dist/LocaleData.js.map +1 -0
  21. package/dist/dates/CalendarDate.d.ts +42 -0
  22. package/dist/dates/CalendarDate.js +171 -181
  23. package/dist/dates/CalendarDate.js.map +1 -0
  24. package/dist/dates/ExtremeDates.d.ts +5 -0
  25. package/dist/dates/ExtremeDates.js +29 -0
  26. package/dist/dates/ExtremeDates.js.map +1 -0
  27. package/dist/dates/UI5Date.d.ts +5 -0
  28. package/dist/dates/UI5Date.js +7 -0
  29. package/dist/dates/UI5Date.js.map +1 -0
  30. package/dist/dates/UniversalDate.d.ts +47 -0
  31. package/dist/dates/UniversalDate.js +5 -0
  32. package/dist/dates/UniversalDate.js.map +1 -0
  33. package/dist/dates/convertMonthNumbersToMonthNames.d.ts +16 -0
  34. package/dist/dates/convertMonthNumbersToMonthNames.js +30 -0
  35. package/dist/dates/convertMonthNumbersToMonthNames.js.map +1 -0
  36. package/dist/dates/getDaysInMonth.d.ts +3 -0
  37. package/dist/dates/getDaysInMonth.js +10 -0
  38. package/dist/dates/getDaysInMonth.js.map +1 -0
  39. package/dist/dates/getRoundedTimestamp.d.ts +7 -0
  40. package/dist/dates/getRoundedTimestamp.js +15 -0
  41. package/dist/dates/getRoundedTimestamp.js.map +1 -0
  42. package/dist/dates/getTodayUTCTimestamp.d.ts +7 -0
  43. package/dist/dates/getTodayUTCTimestamp.js +9 -0
  44. package/dist/dates/getTodayUTCTimestamp.js.map +1 -0
  45. package/dist/dates/modifyDateBy.d.ts +14 -0
  46. package/dist/dates/modifyDateBy.js +55 -0
  47. package/dist/dates/modifyDateBy.js.map +1 -0
  48. package/dist/dates/transformDateToSecondaryType.d.ts +7 -0
  49. package/dist/dates/transformDateToSecondaryType.js +18 -0
  50. package/dist/dates/transformDateToSecondaryType.js.map +1 -0
  51. package/dist/features/calendar/Buddhist.js +1 -0
  52. package/dist/features/calendar/Buddhist.js.map +1 -0
  53. package/dist/features/calendar/Gregorian.js +1 -0
  54. package/dist/features/calendar/Gregorian.js.map +1 -0
  55. package/dist/features/calendar/Islamic.js +1 -0
  56. package/dist/features/calendar/Islamic.js.map +1 -0
  57. package/dist/features/calendar/Japanese.js +1 -0
  58. package/dist/features/calendar/Japanese.js.map +1 -0
  59. package/dist/features/calendar/Persian.js +1 -0
  60. package/dist/features/calendar/Persian.js.map +1 -0
  61. package/dist/generated/assets/cldr/Unicode-Data-Files-LICENSE.txt +27 -0
  62. package/dist/generated/assets/cldr/ar.json +1692 -511
  63. package/dist/generated/assets/cldr/ar_EG.json +1692 -511
  64. package/dist/generated/assets/cldr/ar_SA.json +1787 -607
  65. package/dist/generated/assets/cldr/bg.json +1665 -663
  66. package/dist/generated/assets/cldr/ca.json +1637 -550
  67. package/dist/generated/assets/cldr/cnr.json +6169 -0
  68. package/dist/generated/assets/cldr/cs.json +1620 -409
  69. package/dist/generated/assets/cldr/cy.json +6932 -0
  70. package/dist/generated/assets/cldr/da.json +1581 -542
  71. package/dist/generated/assets/cldr/de.json +1506 -374
  72. package/dist/generated/assets/cldr/de_AT.json +1496 -364
  73. package/dist/generated/assets/cldr/de_CH.json +1515 -383
  74. package/dist/generated/assets/cldr/el.json +1222 -273
  75. package/dist/generated/assets/cldr/el_CY.json +1222 -273
  76. package/dist/generated/assets/cldr/en.json +1621 -547
  77. package/dist/generated/assets/cldr/en_AU.json +1759 -637
  78. package/dist/generated/assets/cldr/en_GB.json +1632 -528
  79. package/dist/generated/assets/cldr/en_HK.json +1715 -608
  80. package/dist/generated/assets/cldr/en_IE.json +1680 -576
  81. package/dist/generated/assets/cldr/en_IN.json +1663 -555
  82. package/dist/generated/assets/cldr/en_NZ.json +1699 -595
  83. package/dist/generated/assets/cldr/en_PG.json +1700 -596
  84. package/dist/generated/assets/cldr/en_SG.json +1689 -582
  85. package/dist/generated/assets/cldr/en_ZA.json +1677 -573
  86. package/dist/generated/assets/cldr/es.json +1895 -704
  87. package/dist/generated/assets/cldr/es_AR.json +1837 -645
  88. package/dist/generated/assets/cldr/es_BO.json +1882 -690
  89. package/dist/generated/assets/cldr/es_CL.json +1723 -639
  90. package/dist/generated/assets/cldr/es_CO.json +1639 -554
  91. package/dist/generated/assets/cldr/es_MX.json +2052 -860
  92. package/dist/generated/assets/cldr/es_PE.json +1567 -591
  93. package/dist/generated/assets/cldr/es_UY.json +1595 -619
  94. package/dist/generated/assets/cldr/es_VE.json +1613 -637
  95. package/dist/generated/assets/cldr/et.json +1428 -368
  96. package/dist/generated/assets/cldr/fa.json +1550 -483
  97. package/dist/generated/assets/cldr/fi.json +1530 -343
  98. package/dist/generated/assets/cldr/fr.json +1437 -419
  99. package/dist/generated/assets/cldr/fr_BE.json +1434 -416
  100. package/dist/generated/assets/cldr/fr_CA.json +1573 -555
  101. package/dist/generated/assets/cldr/fr_CH.json +1387 -369
  102. package/dist/generated/assets/cldr/fr_LU.json +1437 -419
  103. package/dist/generated/assets/cldr/he.json +1699 -536
  104. package/dist/generated/assets/cldr/hi.json +1224 -194
  105. package/dist/generated/assets/cldr/hr.json +1762 -485
  106. package/dist/generated/assets/cldr/hu.json +1392 -303
  107. package/dist/generated/assets/cldr/id.json +1642 -570
  108. package/dist/generated/assets/cldr/it.json +1491 -455
  109. package/dist/generated/assets/cldr/it_CH.json +1491 -455
  110. package/dist/generated/assets/cldr/ja.json +1145 -86
  111. package/dist/generated/assets/cldr/kk.json +1784 -570
  112. package/dist/generated/assets/cldr/ko.json +1194 -162
  113. package/dist/generated/assets/cldr/lt.json +1385 -288
  114. package/dist/generated/assets/cldr/lv.json +1371 -369
  115. package/dist/generated/assets/cldr/mk.json +6045 -0
  116. package/dist/generated/assets/cldr/ms.json +1600 -551
  117. package/dist/generated/assets/cldr/nb.json +1267 -209
  118. package/dist/generated/assets/cldr/nl.json +1743 -425
  119. package/dist/generated/assets/cldr/nl_BE.json +1743 -425
  120. package/dist/generated/assets/cldr/pl.json +1905 -492
  121. package/dist/generated/assets/cldr/pt.json +1915 -605
  122. package/dist/generated/assets/cldr/pt_PT.json +1873 -633
  123. package/dist/generated/assets/cldr/ro.json +1592 -482
  124. package/dist/generated/assets/cldr/ru.json +1610 -514
  125. package/dist/generated/assets/cldr/ru_UA.json +1604 -508
  126. package/dist/generated/assets/cldr/sk.json +1631 -569
  127. package/dist/generated/assets/cldr/sl.json +1534 -430
  128. package/dist/generated/assets/cldr/sr.json +1461 -346
  129. package/dist/generated/assets/cldr/sr_Latn.json +6226 -0
  130. package/dist/generated/assets/cldr/sv.json +1508 -443
  131. package/dist/generated/assets/cldr/th.json +1315 -237
  132. package/dist/generated/assets/cldr/tr.json +1551 -436
  133. package/dist/generated/assets/cldr/uk.json +1621 -520
  134. package/dist/generated/assets/cldr/vi.json +1425 -429
  135. package/dist/generated/assets/cldr/zh_CN.json +1427 -342
  136. package/dist/generated/assets/cldr/zh_HK.json +1398 -312
  137. package/dist/generated/assets/cldr/zh_SG.json +1403 -317
  138. package/dist/generated/assets/cldr/zh_TW.json +1258 -193
  139. package/dist/generated/json-imports/LocaleData-fetch.d.ts +1 -0
  140. package/dist/generated/json-imports/LocaleData-fetch.js +93 -0
  141. package/dist/generated/json-imports/LocaleData-fetch.js.map +1 -0
  142. package/dist/generated/json-imports/LocaleData.d.ts +1 -0
  143. package/dist/generated/json-imports/LocaleData.js +93 -0
  144. package/dist/generated/json-imports/LocaleData.js.map +1 -0
  145. package/dist/getCachedLocaleDataInstance.d.ts +4 -0
  146. package/dist/getCachedLocaleDataInstance.js +10 -0
  147. package/dist/getCachedLocaleDataInstance.js.map +1 -0
  148. package/dist/locale/getLocaleData.d.ts +11 -0
  149. package/dist/locale/getLocaleData.js +13 -17
  150. package/dist/locale/getLocaleData.js.map +1 -0
  151. package/dist/sap/base/Event.js +59 -0
  152. package/dist/sap/base/Eventing.js +146 -0
  153. package/dist/sap/base/Log.js +2 -248
  154. package/dist/sap/base/assert.js +31 -9
  155. package/dist/sap/base/config/MemoryConfigurationProvider.js +20 -0
  156. package/dist/sap/base/config.js +17 -0
  157. package/dist/sap/base/i18n/Formatting.d.ts +8 -0
  158. package/dist/sap/base/i18n/Formatting.js +11 -0
  159. package/dist/sap/base/i18n/Formatting.js.map +1 -0
  160. package/dist/sap/base/i18n/LanguageTag.js +173 -0
  161. package/dist/sap/base/i18n/Localization.d.ts +4 -0
  162. package/dist/sap/base/i18n/Localization.js +12 -0
  163. package/dist/sap/base/i18n/Localization.js.map +1 -0
  164. package/dist/sap/base/i18n/date/CalendarType.js +43 -0
  165. package/dist/sap/base/i18n/date/CalendarWeekNumbering.js +105 -0
  166. package/dist/sap/base/i18n/date/TimezoneUtils.js +319 -0
  167. package/dist/sap/base/strings/camelize.js +30 -0
  168. package/dist/sap/base/strings/formatMessage.js +88 -15
  169. package/dist/sap/base/util/LoaderExtensions.d.ts +4 -0
  170. package/dist/sap/base/util/LoaderExtensions.js +11 -4
  171. package/dist/sap/base/util/LoaderExtensions.js.map +1 -0
  172. package/dist/sap/base/util/ObjectPath.d.ts +4 -0
  173. package/dist/sap/base/util/ObjectPath.js +4 -33
  174. package/dist/sap/base/util/ObjectPath.js.map +1 -0
  175. package/dist/sap/base/util/Version.js +157 -0
  176. package/dist/sap/base/util/_merge.js +83 -26
  177. package/dist/sap/base/util/array/uniqueSort.js +37 -15
  178. package/dist/sap/base/util/deepClone.js +102 -0
  179. package/dist/sap/base/util/deepEqual.js +75 -55
  180. package/dist/sap/base/util/extend.js +58 -7
  181. package/dist/sap/base/util/isEmptyObject.js +34 -0
  182. package/dist/sap/base/util/isPlainObject.js +35 -1
  183. package/dist/sap/base/util/now.js +24 -3
  184. package/dist/sap/base/util/resolveReference.js +3 -0
  185. package/dist/sap/base/util/uid.js +27 -0
  186. package/dist/sap/ui/base/DataType.js +657 -0
  187. package/dist/sap/ui/base/Interface.js +50 -6
  188. package/dist/sap/ui/base/Metadata.js +435 -173
  189. package/dist/sap/ui/base/Object.js +287 -27
  190. package/dist/sap/ui/core/CalendarType.js +24 -8
  191. package/dist/sap/ui/core/Configuration.d.ts +17 -0
  192. package/dist/sap/ui/core/Configuration.js +23 -0
  193. package/dist/sap/ui/core/Configuration.js.map +1 -0
  194. package/dist/sap/ui/core/Core.d.ts +25 -0
  195. package/dist/sap/ui/core/Core.js +7 -32
  196. package/dist/sap/ui/core/Core.js.map +1 -0
  197. package/dist/sap/ui/core/FormatSettings.d.ts +9 -0
  198. package/dist/sap/ui/core/FormatSettings.js +12 -0
  199. package/dist/sap/ui/core/FormatSettings.js.map +1 -0
  200. package/dist/sap/ui/core/Locale.js +190 -116
  201. package/dist/sap/ui/core/LocaleData.js +2668 -2679
  202. package/dist/sap/ui/core/Supportability.js +5 -0
  203. package/dist/sap/ui/core/Theming.js +539 -0
  204. package/dist/sap/ui/core/date/Buddhist.js +163 -92
  205. package/dist/sap/ui/core/date/CalendarUtils.js +65 -0
  206. package/dist/sap/ui/core/date/CalendarWeekNumbering.js +30 -0
  207. package/dist/sap/ui/core/date/Gregorian.js +26 -9
  208. package/dist/sap/ui/core/date/Islamic.js +299 -184
  209. package/dist/sap/ui/core/date/Japanese.js +213 -116
  210. package/dist/sap/ui/core/date/Persian.js +325 -194
  211. package/dist/sap/ui/core/date/UI5Date.js +991 -0
  212. package/dist/sap/ui/core/date/UniversalDate.js +1251 -208
  213. package/dist/sap/ui/core/date/_Calendars.js +10 -1
  214. package/dist/sap/ui/core/format/DateFormat.js +3163 -1781
  215. package/dist/sap/ui/core/format/TimezoneUtil.js +24 -0
  216. package/package-scripts.cjs +28 -0
  217. package/package.json +21 -13
  218. package/tsconfig.json +24 -0
  219. package/used-modules.txt +28 -2
  220. package/dist/dates/calculateWeekNumber.js +0 -51
  221. package/dist/json-imports/LocaleData.js +0 -171
  222. package/dist/sap/ui/Device.js +0 -5
  223. package/package-scripts.js +0 -30
  224. package/src/Assets.js +0 -2
  225. package/src/DateFormat.js +0 -3
  226. package/src/LocaleData.js +0 -3
  227. package/src/dates/CalendarDate.js +0 -203
  228. package/src/dates/calculateWeekNumber.js +0 -51
  229. package/src/json-imports/LocaleData.js +0 -171
  230. package/src/locale/getLocaleData.js +0 -27
  231. package/src/sap/base/util/LoaderExtensions.js +0 -7
  232. package/src/sap/ui/core/Core.js +0 -38
  233. /package/{config/.eslintrc.js → .eslintrc.cjs} +0 -0
  234. /package/{src/features/calendar/Buddhist.js → dist/features/calendar/Buddhist.d.ts} +0 -0
  235. /package/{src/features/calendar/Gregorian.js → dist/features/calendar/Gregorian.d.ts} +0 -0
  236. /package/{src/features/calendar/Islamic.js → dist/features/calendar/Islamic.d.ts} +0 -0
  237. /package/{src/features/calendar/Japanese.js → dist/features/calendar/Japanese.d.ts} +0 -0
  238. /package/{src/features/calendar/Persian.js → dist/features/calendar/Persian.d.ts} +0 -0
@@ -1,263 +1,394 @@
1
- import UniversalDate from './UniversalDate.js';
2
- import CalendarType from '../CalendarType.js';
3
- var Persian = UniversalDate.extend('sap.ui.core.date.Persian', {
4
- constructor: function () {
5
- var aArgs = arguments;
6
- if (aArgs.length > 1) {
7
- aArgs = toGregorianArguments(aArgs);
8
- }
9
- this.oDate = this.createDate(Date, aArgs);
10
- this.sCalendarType = CalendarType.Persian;
1
+ /*!
2
+ * OpenUI5
3
+ * (c) Copyright 2009-2024 SAP SE or an SAP affiliate company.
4
+ * Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
5
+ */
6
+ // Provides class sap.ui.core.date.Persian
7
+ import UniversalDate from "./UniversalDate.js";
8
+ import CalendarType from "../CalendarType.js";
9
+ import _Calendars from "./_Calendars.js";
10
+ /**
11
+ * The Persian date class
12
+ *
13
+ * @class
14
+ * The Persian date does conversion of day, month and year values based on the vernal equinox.
15
+ * Calculation taken from jalaali-js.
16
+ *
17
+ * @private
18
+ * @alias sap.ui.core.date.Persian
19
+ * @extends sap.ui.core.date.UniversalDate
20
+ */
21
+ var Persian = UniversalDate.extend("sap.ui.core.date.Persian", /** @lends sap.ui.core.date.Persian.prototype */{
22
+ constructor: function () {
23
+ var aArgs = arguments;
24
+ if (aArgs.length > 1) {
25
+ aArgs = toGregorianArguments(aArgs);
11
26
  }
27
+ this.oDate = this.createDate(Date, aArgs);
28
+ this.sCalendarType = CalendarType.Persian;
29
+ }
12
30
  });
13
31
  Persian.UTC = function () {
14
- var aArgs = toGregorianArguments(arguments);
15
- return Date.UTC.apply(Date, aArgs);
32
+ var aArgs = toGregorianArguments(arguments);
33
+ return Date.UTC.apply(Date, aArgs);
16
34
  };
17
35
  Persian.now = function () {
18
- return Date.now();
36
+ return Date.now();
19
37
  };
20
38
  var BASE_YEAR = 1300;
39
+
40
+ /**
41
+ * Calculate Persian date from gregorian
42
+ *
43
+ * @param {object} oGregorian a JS object containing day, month and year in the gregorian calendar
44
+ * @private
45
+ */
21
46
  function toPersian(oGregorian) {
22
- var iJulianDayNumber = g2d(oGregorian.year, oGregorian.month + 1, oGregorian.day);
23
- return d2j(iJulianDayNumber);
47
+ var iJulianDayNumber = g2d(oGregorian.year, oGregorian.month + 1, oGregorian.day);
48
+ return d2j(iJulianDayNumber);
24
49
  }
50
+
51
+ /**
52
+ * Calculate gregorian date from Persian
53
+ *
54
+ * @param {object} oPersian a JS object containing day, month and year in the Persian calendar
55
+ * @private
56
+ */
25
57
  function toGregorian(oPersian) {
26
- var iJulianDayNumber = j2d(oPersian.year, oPersian.month + 1, oPersian.day);
27
- return d2g(iJulianDayNumber);
58
+ var iJulianDayNumber = j2d(oPersian.year, oPersian.month + 1, oPersian.day);
59
+ return d2g(iJulianDayNumber);
28
60
  }
29
61
  function toGregorianArguments(aArgs) {
30
- var aGregorianArgs = Array.prototype.slice.call(aArgs), oPersian, oGregorian;
31
- if (typeof aArgs[0] !== 'number' || typeof aArgs[1] !== 'number' || aArgs[2] !== undefined && typeof aArgs[2] != 'number') {
32
- aGregorianArgs[0] = NaN;
33
- aGregorianArgs[1] = NaN;
34
- aGregorianArgs[2] = NaN;
35
- return aGregorianArgs;
36
- }
37
- oPersian = {
38
- year: aArgs[0],
39
- month: aArgs[1],
40
- day: aArgs[2] !== undefined ? aArgs[2] : 1
41
- };
42
- oGregorian = toGregorian(oPersian);
43
- aGregorianArgs[0] = oGregorian.year;
44
- aGregorianArgs[1] = oGregorian.month;
45
- aGregorianArgs[2] = oGregorian.day;
62
+ var aGregorianArgs = Array.prototype.slice.call(aArgs),
63
+ oPersian,
64
+ oGregorian;
65
+ // Validate arguments
66
+ if (typeof aArgs[0] !== "number" || typeof aArgs[1] !== "number" || aArgs[2] !== undefined && typeof aArgs[2] != "number") {
67
+ aGregorianArgs[0] = NaN;
68
+ aGregorianArgs[1] = NaN;
69
+ aGregorianArgs[2] = NaN;
46
70
  return aGregorianArgs;
71
+ }
72
+ oPersian = {
73
+ year: aArgs[0],
74
+ month: aArgs[1],
75
+ day: aArgs[2] !== undefined ? aArgs[2] : 1
76
+ };
77
+ oGregorian = toGregorian(oPersian);
78
+ aGregorianArgs[0] = oGregorian.year;
79
+ aGregorianArgs[1] = oGregorian.month;
80
+ aGregorianArgs[2] = oGregorian.day;
81
+ return aGregorianArgs;
47
82
  }
83
+
84
+ /*
85
+ This function determines if the Jalaali (Persian) year is
86
+ leap (366-day long) or is the common year (365 days), and
87
+ finds the day in March (Gregorian calendar) of the first
88
+ day of the Jalaali year (jy).
89
+ @param jy Jalaali calendar year (-61 to 3177)
90
+ @return
91
+ leap: number of years since the last leap year (0 to 4)
92
+ gy: Gregorian year of the beginning of Jalaali year
93
+ march: the March day of Farvardin the 1st (1st day of jy)
94
+ @see: http://www.astro.uni.torun.pl/~kb/Papers/EMP/PersianC-EMP.htm
95
+ @see: http://www.fourmilab.ch/documents/calendar/
96
+ */
48
97
  function jalCal(jy) {
49
- var breaks = [
50
- -61,
51
- 9,
52
- 38,
53
- 199,
54
- 426,
55
- 686,
56
- 756,
57
- 818,
58
- 1111,
59
- 1181,
60
- 1210,
61
- 1635,
62
- 2060,
63
- 2097,
64
- 2192,
65
- 2262,
66
- 2324,
67
- 2394,
68
- 2456,
69
- 3178
70
- ], bl = breaks.length, gy = jy + 621, leapJ = -14, jp = breaks[0], jm, jump, leap, leapG, march, n, i;
71
- for (i = 1; i < bl; i += 1) {
72
- jm = breaks[i];
73
- jump = jm - jp;
74
- if (jy < jm) {
75
- break;
76
- }
77
- leapJ = leapJ + div(jump, 33) * 8 + div(mod(jump, 33), 4);
78
- jp = jm;
79
- }
80
- n = jy - jp;
81
- leapJ = leapJ + div(n, 33) * 8 + div(mod(n, 33) + 3, 4);
82
- if (mod(jump, 33) === 4 && jump - n === 4) {
83
- leapJ += 1;
84
- }
85
- leapG = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150;
86
- march = 20 + leapJ - leapG;
87
- if (jump - n < 6) {
88
- n = n - jump + div(jump + 4, 33) * 33;
98
+ // Jalaali years starting the 33-year rule.
99
+ var breaks = [-61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178],
100
+ bl = breaks.length,
101
+ gy = jy + 621,
102
+ leapJ = -14,
103
+ jp = breaks[0],
104
+ jm,
105
+ jump,
106
+ leap,
107
+ leapG,
108
+ march,
109
+ n,
110
+ i;
111
+
112
+ // Find the limiting years for the Jalaali year jy.
113
+ for (i = 1; i < bl; i += 1) {
114
+ jm = breaks[i];
115
+ jump = jm - jp;
116
+ if (jy < jm) {
117
+ break;
89
118
  }
90
- leap = mod(mod(n + 1, 33) - 1, 4);
91
- if (leap === -1) {
92
- leap = 4;
93
- }
94
- return {
95
- leap: leap,
96
- gy: gy,
97
- march: march
98
- };
119
+ leapJ = leapJ + div(jump, 33) * 8 + div(mod(jump, 33), 4);
120
+ jp = jm;
121
+ }
122
+ n = jy - jp;
123
+
124
+ // Find the number of leap years from AD 621 to the beginning
125
+ // of the current Jalaali year in the Persian calendar.
126
+ leapJ = leapJ + div(n, 33) * 8 + div(mod(n, 33) + 3, 4);
127
+ if (mod(jump, 33) === 4 && jump - n === 4) {
128
+ leapJ += 1;
129
+ }
130
+
131
+ // And the same in the Gregorian calendar (until the year gy).
132
+ leapG = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150;
133
+
134
+ // Determine the Gregorian date of Farvardin the 1st.
135
+ march = 20 + leapJ - leapG;
136
+
137
+ // Find how many years have passed since the last leap year.
138
+ if (jump - n < 6) {
139
+ n = n - jump + div(jump + 4, 33) * 33;
140
+ }
141
+ leap = mod(mod(n + 1, 33) - 1, 4);
142
+ if (leap === -1) {
143
+ leap = 4;
144
+ }
145
+ return {
146
+ leap: leap,
147
+ gy: gy,
148
+ march: march
149
+ };
99
150
  }
151
+
152
+ /*
153
+ Converts a date of the Jalaali calendar to the Julian Day number.
154
+ @param jy Jalaali year (1 to 3100)
155
+ @param jm Jalaali month (1 to 12)
156
+ @param jd Jalaali day (1 to 29/31)
157
+ @return Julian Day number
158
+ */
100
159
  function j2d(jy, jm, jd) {
101
- while (jm < 1) {
102
- jm += 12;
103
- jy--;
104
- }
105
- while (jm > 12) {
106
- jm -= 12;
107
- jy++;
108
- }
109
- var r = jalCal(jy);
110
- return g2d(r.gy, 3, r.march) + (jm - 1) * 31 - div(jm, 7) * (jm - 7) + jd - 1;
160
+ // Correct month overflow/underflow for correct day calculation
161
+ while (jm < 1) {
162
+ jm += 12;
163
+ jy--;
164
+ }
165
+ while (jm > 12) {
166
+ jm -= 12;
167
+ jy++;
168
+ }
169
+ var r = jalCal(jy);
170
+ return g2d(r.gy, 3, r.march) + (jm - 1) * 31 - div(jm, 7) * (jm - 7) + jd - 1;
111
171
  }
172
+
173
+ /*
174
+ Converts the Julian Day number to a date in the Jalaali calendar.
175
+ @param jdn Julian Day number
176
+ @return
177
+ jy: Jalaali year (1 to 3100)
178
+ jm: Jalaali month (1 to 12)
179
+ jd: Jalaali day (1 to 29/31)
180
+ */
112
181
  function d2j(jdn) {
113
- var gy = d2g(jdn).year, jy = gy - 621, r = jalCal(jy), jdn1f = g2d(gy, 3, r.march), jd, jm, k;
114
- k = jdn - jdn1f;
115
- if (k >= 0) {
116
- if (k <= 185) {
117
- jm = 1 + div(k, 31);
118
- jd = mod(k, 31) + 1;
119
- return {
120
- year: jy,
121
- month: jm - 1,
122
- day: jd
123
- };
124
- } else {
125
- k -= 186;
126
- }
127
- } else {
128
- jy -= 1;
129
- k += 179;
130
- if (r.leap === 1) {
131
- k += 1;
132
- }
133
- }
134
- jm = 7 + div(k, 30);
135
- jd = mod(k, 30) + 1;
136
- return {
182
+ var gy = d2g(jdn).year,
183
+ jy = gy - 621,
184
+ r = jalCal(jy),
185
+ jdn1f = g2d(gy, 3, r.march),
186
+ jd,
187
+ jm,
188
+ k;
189
+
190
+ // Find number of days that passed since 1 Farvardin.
191
+ k = jdn - jdn1f;
192
+ if (k >= 0) {
193
+ if (k <= 185) {
194
+ // The first 6 months.
195
+ jm = 1 + div(k, 31);
196
+ jd = mod(k, 31) + 1;
197
+ return {
137
198
  year: jy,
138
199
  month: jm - 1,
139
200
  day: jd
140
- };
201
+ };
202
+ } else {
203
+ // The remaining months.
204
+ k -= 186;
205
+ }
206
+ } else {
207
+ // Previous Jalaali year.
208
+ jy -= 1;
209
+ k += 179;
210
+ if (r.leap === 1) {
211
+ k += 1;
212
+ }
213
+ }
214
+ jm = 7 + div(k, 30);
215
+ jd = mod(k, 30) + 1;
216
+ return {
217
+ year: jy,
218
+ month: jm - 1,
219
+ day: jd
220
+ };
141
221
  }
222
+
223
+ /*
224
+ Calculates the Julian Day number from Gregorian or Julian
225
+ calendar dates. This integer number corresponds to the noon of
226
+ the date (i.e. 12 hours of Universal Time).
227
+ The procedure was tested to be good since 1 March, -100100 (of both
228
+ calendars) up to a few million years into the future.
229
+ @param gy Calendar year (years BC numbered 0, -1, -2, ...)
230
+ @param gm Calendar month (1 to 12)
231
+ @param gd Calendar day of the month (1 to 28/29/30/31)
232
+ @return Julian Day number
233
+ */
142
234
  function g2d(gy, gm, gd) {
143
- var d = div((gy + div(gm - 8, 6) + 100100) * 1461, 4) + div(153 * mod(gm + 9, 12) + 2, 5) + gd - 34840408;
144
- d = d - div(div(gy + 100100 + div(gm - 8, 6), 100) * 3, 4) + 752;
145
- return d;
235
+ var d = div((gy + div(gm - 8, 6) + 100100) * 1461, 4) + div(153 * mod(gm + 9, 12) + 2, 5) + gd - 34840408;
236
+ d = d - div(div(gy + 100100 + div(gm - 8, 6), 100) * 3, 4) + 752;
237
+ return d;
146
238
  }
239
+
240
+ /*
241
+ Calculates Gregorian and Julian calendar dates from the Julian Day number
242
+ (jdn) for the period since jdn=-34839655 (i.e. the year -100100 of both
243
+ calendars) to some millions years ahead of the present.
244
+ @param jdn Julian Day number
245
+ @return
246
+ gy: Calendar year (years BC numbered 0, -1, -2, ...)
247
+ gm: Calendar month (1 to 12)
248
+ gd: Calendar day of the month M (1 to 28/29/30/31)
249
+ */
147
250
  function d2g(jdn) {
148
- var j, i, gd, gm, gy;
149
- j = 4 * jdn + 139361631;
150
- j = j + div(div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
151
- i = div(mod(j, 1461), 4) * 5 + 308;
152
- gd = div(mod(i, 153), 5) + 1;
153
- gm = mod(div(i, 153), 12) + 1;
154
- gy = div(j, 1461) - 100100 + div(8 - gm, 6);
155
- return {
156
- year: gy,
157
- month: gm - 1,
158
- day: gd
159
- };
251
+ var j, i, gd, gm, gy;
252
+ j = 4 * jdn + 139361631;
253
+ j = j + div(div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
254
+ i = div(mod(j, 1461), 4) * 5 + 308;
255
+ gd = div(mod(i, 153), 5) + 1;
256
+ gm = mod(div(i, 153), 12) + 1;
257
+ gy = div(j, 1461) - 100100 + div(8 - gm, 6);
258
+ return {
259
+ year: gy,
260
+ month: gm - 1,
261
+ day: gd
262
+ };
160
263
  }
264
+
265
+ /*
266
+ Utility helper functions.
267
+ */
268
+
161
269
  function div(a, b) {
162
- return ~~(a / b);
270
+ return ~~(a / b);
163
271
  }
164
272
  function mod(a, b) {
165
- return a - ~~(a / b) * b;
273
+ return a - ~~(a / b) * b;
166
274
  }
275
+
276
+ /**
277
+ * Get the Persian date from the this.oDate
278
+ */
167
279
  Persian.prototype._getPersian = function () {
168
- return toPersian({
169
- day: this.oDate.getDate(),
170
- month: this.oDate.getMonth(),
171
- year: this.oDate.getFullYear()
172
- });
280
+ return toPersian({
281
+ day: this.oDate.getDate(),
282
+ month: this.oDate.getMonth(),
283
+ year: this.oDate.getFullYear()
284
+ });
173
285
  };
286
+
287
+ /**
288
+ * Set the Persian date to the current this.oDate object
289
+ * @param {object} oPersian a JS object containing day, month and year in the Persian calendar
290
+ */
174
291
  Persian.prototype._setPersian = function (oPersian) {
175
- var oGregorian = toGregorian(oPersian);
176
- return this.oDate.setFullYear(oGregorian.year, oGregorian.month, oGregorian.day);
292
+ var oGregorian = toGregorian(oPersian);
293
+ return this.oDate.setFullYear(oGregorian.year, oGregorian.month, oGregorian.day);
177
294
  };
295
+
296
+ /**
297
+ * Get the Persian date from the this.oDate
298
+ */
178
299
  Persian.prototype._getUTCPersian = function () {
179
- return toPersian({
180
- day: this.oDate.getUTCDate(),
181
- month: this.oDate.getUTCMonth(),
182
- year: this.oDate.getUTCFullYear()
183
- });
300
+ return toPersian({
301
+ day: this.oDate.getUTCDate(),
302
+ month: this.oDate.getUTCMonth(),
303
+ year: this.oDate.getUTCFullYear()
304
+ });
184
305
  };
306
+
307
+ /**
308
+ * Set the Persian date to the current this.oDate object
309
+ * @param {object} oPersian a JS object containing day, month and year in the Persian calendar
310
+ */
185
311
  Persian.prototype._setUTCPersian = function (oPersian) {
186
- var oGregorian = toGregorian(oPersian);
187
- return this.oDate.setUTCFullYear(oGregorian.year, oGregorian.month, oGregorian.day);
312
+ var oGregorian = toGregorian(oPersian);
313
+ return this.oDate.setUTCFullYear(oGregorian.year, oGregorian.month, oGregorian.day);
188
314
  };
315
+
316
+ /*
317
+ * Override setters and getters specific to the Persian date
318
+ */
189
319
  Persian.prototype.getDate = function (iDate) {
190
- return this._getPersian().day;
320
+ return this._getPersian().day;
191
321
  };
192
322
  Persian.prototype.getMonth = function () {
193
- return this._getPersian().month;
323
+ return this._getPersian().month;
194
324
  };
195
325
  Persian.prototype.getYear = function () {
196
- return this._getPersian().year - BASE_YEAR;
326
+ return this._getPersian().year - BASE_YEAR;
197
327
  };
198
328
  Persian.prototype.getFullYear = function () {
199
- return this._getPersian().year;
329
+ return this._getPersian().year;
200
330
  };
201
331
  Persian.prototype.setDate = function (iDate) {
202
- var oPersian = this._getPersian();
203
- oPersian.day = iDate;
204
- return this._setPersian(oPersian);
332
+ var oPersian = this._getPersian();
333
+ oPersian.day = iDate;
334
+ return this._setPersian(oPersian);
205
335
  };
206
336
  Persian.prototype.setMonth = function (iMonth, iDay) {
207
- var oPersian = this._getPersian();
208
- oPersian.month = iMonth;
209
- if (iDay !== undefined) {
210
- oPersian.day = iDay;
211
- }
212
- return this._setPersian(oPersian);
337
+ var oPersian = this._getPersian();
338
+ oPersian.month = iMonth;
339
+ if (iDay !== undefined) {
340
+ oPersian.day = iDay;
341
+ }
342
+ return this._setPersian(oPersian);
213
343
  };
214
344
  Persian.prototype.setYear = function (iYear) {
215
- var oPersian = this._getPersian();
216
- oPersian.year = iYear + BASE_YEAR;
217
- return this._setPersian(oPersian);
345
+ var oPersian = this._getPersian();
346
+ oPersian.year = iYear + BASE_YEAR;
347
+ return this._setPersian(oPersian);
218
348
  };
219
349
  Persian.prototype.setFullYear = function (iYear, iMonth, iDay) {
220
- var oPersian = this._getPersian();
221
- oPersian.year = iYear;
222
- if (iMonth !== undefined) {
223
- oPersian.month = iMonth;
224
- }
225
- if (iDay !== undefined) {
226
- oPersian.day = iDay;
227
- }
228
- return this._setPersian(oPersian);
350
+ var oPersian = this._getPersian();
351
+ oPersian.year = iYear;
352
+ if (iMonth !== undefined) {
353
+ oPersian.month = iMonth;
354
+ }
355
+ if (iDay !== undefined) {
356
+ oPersian.day = iDay;
357
+ }
358
+ return this._setPersian(oPersian);
229
359
  };
230
360
  Persian.prototype.getUTCDate = function (iDate) {
231
- return this._getUTCPersian().day;
361
+ return this._getUTCPersian().day;
232
362
  };
233
363
  Persian.prototype.getUTCMonth = function () {
234
- return this._getUTCPersian().month;
364
+ return this._getUTCPersian().month;
235
365
  };
236
366
  Persian.prototype.getUTCFullYear = function () {
237
- return this._getUTCPersian().year;
367
+ return this._getUTCPersian().year;
238
368
  };
239
369
  Persian.prototype.setUTCDate = function (iDate) {
240
- var oPersian = this._getUTCPersian();
241
- oPersian.day = iDate;
242
- return this._setUTCPersian(oPersian);
370
+ var oPersian = this._getUTCPersian();
371
+ oPersian.day = iDate;
372
+ return this._setUTCPersian(oPersian);
243
373
  };
244
374
  Persian.prototype.setUTCMonth = function (iMonth, iDay) {
245
- var oPersian = this._getUTCPersian();
246
- oPersian.month = iMonth;
247
- if (iDay !== undefined) {
248
- oPersian.day = iDay;
249
- }
250
- return this._setUTCPersian(oPersian);
375
+ var oPersian = this._getUTCPersian();
376
+ oPersian.month = iMonth;
377
+ if (iDay !== undefined) {
378
+ oPersian.day = iDay;
379
+ }
380
+ return this._setUTCPersian(oPersian);
251
381
  };
252
382
  Persian.prototype.setUTCFullYear = function (iYear, iMonth, iDay) {
253
- var oPersian = this._getUTCPersian();
254
- oPersian.year = iYear;
255
- if (iMonth !== undefined) {
256
- oPersian.month = iMonth;
257
- }
258
- if (iDay !== undefined) {
259
- oPersian.day = iDay;
260
- }
261
- return this._setUTCPersian(oPersian);
383
+ var oPersian = this._getUTCPersian();
384
+ oPersian.year = iYear;
385
+ if (iMonth !== undefined) {
386
+ oPersian.month = iMonth;
387
+ }
388
+ if (iDay !== undefined) {
389
+ oPersian.day = iDay;
390
+ }
391
+ return this._setUTCPersian(oPersian);
262
392
  };
393
+ _Calendars.set(CalendarType.Persian, Persian);
263
394
  export default Persian;