@ui5/webcomponents-localization 0.0.0-fb61e9889 → 0.0.0-fca1107e7

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 -1
  2. package/.npsrc.json +3 -0
  3. package/CHANGELOG.md +964 -0
  4. package/README.md +6 -6
  5. package/dist/.tsbuildinfo +1 -0
  6. package/{src/Assets-static.js → dist/Assets-static.d.ts} +0 -1
  7. package/dist/Assets-static.js +1 -0
  8. package/dist/Assets-static.js.map +1 -0
  9. package/dist/Assets.d.ts +1 -0
  10. package/dist/Assets.js +1 -0
  11. package/dist/Assets.js.map +1 -0
  12. package/dist/DateFormat.d.ts +6 -0
  13. package/dist/DateFormat.js +6 -2
  14. package/dist/DateFormat.js.map +1 -0
  15. package/dist/LocaleData.d.ts +6 -0
  16. package/dist/LocaleData.js +6 -2
  17. package/dist/LocaleData.js.map +1 -0
  18. package/dist/dates/CalendarDate.d.ts +43 -0
  19. package/dist/dates/CalendarDate.js +171 -201
  20. package/dist/dates/CalendarDate.js.map +1 -0
  21. package/dist/dates/ExtremeDates.d.ts +5 -0
  22. package/dist/dates/ExtremeDates.js +25 -35
  23. package/dist/dates/ExtremeDates.js.map +1 -0
  24. package/dist/dates/UI5Date.d.ts +6 -0
  25. package/dist/dates/UI5Date.js +7 -0
  26. package/dist/dates/UI5Date.js.map +1 -0
  27. package/dist/dates/UniversalDate.d.ts +47 -0
  28. package/dist/dates/UniversalDate.js +5 -0
  29. package/dist/dates/UniversalDate.js.map +1 -0
  30. package/dist/dates/calculateWeekNumber.d.ts +6 -0
  31. package/dist/dates/calculateWeekNumber.js +43 -49
  32. package/dist/dates/calculateWeekNumber.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 +10 -9
  41. package/dist/dates/getRoundedTimestamp.js.map +1 -0
  42. package/dist/dates/getTodayUTCTimestamp.d.ts +7 -0
  43. package/dist/dates/getTodayUTCTimestamp.js +3 -3
  44. package/dist/dates/getTodayUTCTimestamp.js.map +1 -0
  45. package/dist/dates/modifyDateBy.d.ts +14 -0
  46. package/dist/dates/modifyDateBy.js +42 -29
  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/ar.json +5571 -5906
  62. package/dist/generated/assets/cldr/ar_EG.json +5571 -5906
  63. package/dist/generated/assets/cldr/ar_SA.json +5570 -5906
  64. package/dist/generated/assets/cldr/bg.json +4491 -4979
  65. package/dist/generated/assets/cldr/ca.json +4478 -4996
  66. package/dist/generated/assets/cldr/cnr.json +4667 -0
  67. package/dist/generated/assets/cldr/cs.json +5067 -5498
  68. package/dist/generated/assets/cldr/cy.json +5479 -5884
  69. package/dist/generated/assets/cldr/da.json +4371 -4888
  70. package/dist/generated/assets/cldr/de.json +4420 -4916
  71. package/dist/generated/assets/cldr/de_AT.json +4421 -4917
  72. package/dist/generated/assets/cldr/de_CH.json +4419 -4915
  73. package/dist/generated/assets/cldr/el.json +4309 -4883
  74. package/dist/generated/assets/cldr/el_CY.json +4309 -4883
  75. package/dist/generated/assets/cldr/en.json +4342 -4971
  76. package/dist/generated/assets/cldr/en_AU.json +4382 -4962
  77. package/dist/generated/assets/cldr/en_GB.json +4373 -4971
  78. package/dist/generated/assets/cldr/en_HK.json +4382 -4977
  79. package/dist/generated/assets/cldr/en_IE.json +4373 -4971
  80. package/dist/generated/assets/cldr/en_IN.json +4378 -4972
  81. package/dist/generated/assets/cldr/en_NZ.json +4373 -4971
  82. package/dist/generated/assets/cldr/en_PG.json +4374 -4972
  83. package/dist/generated/assets/cldr/en_SG.json +4378 -4973
  84. package/dist/generated/assets/cldr/en_ZA.json +4374 -4972
  85. package/dist/generated/assets/cldr/es.json +4584 -4912
  86. package/dist/generated/assets/cldr/es_AR.json +4587 -4914
  87. package/dist/generated/assets/cldr/es_BO.json +4586 -4913
  88. package/dist/generated/assets/cldr/es_CL.json +4479 -4914
  89. package/dist/generated/assets/cldr/es_CO.json +4479 -4913
  90. package/dist/generated/assets/cldr/es_MX.json +4588 -4915
  91. package/dist/generated/assets/cldr/es_PE.json +4370 -4913
  92. package/dist/generated/assets/cldr/es_UY.json +4372 -4915
  93. package/dist/generated/assets/cldr/es_VE.json +4371 -4914
  94. package/dist/generated/assets/cldr/et.json +4373 -4967
  95. package/dist/generated/assets/cldr/fa.json +4429 -4883
  96. package/dist/generated/assets/cldr/fi.json +4514 -5008
  97. package/dist/generated/assets/cldr/fr.json +4383 -4979
  98. package/dist/generated/assets/cldr/fr_BE.json +4383 -4979
  99. package/dist/generated/assets/cldr/fr_CA.json +4377 -4973
  100. package/dist/generated/assets/cldr/fr_CH.json +4401 -4997
  101. package/dist/generated/assets/cldr/fr_LU.json +4383 -4979
  102. package/dist/generated/assets/cldr/he.json +4980 -5378
  103. package/dist/generated/assets/cldr/hi.json +4345 -4829
  104. package/dist/generated/assets/cldr/hr.json +4640 -4919
  105. package/dist/generated/assets/cldr/hu.json +4415 -4856
  106. package/dist/generated/assets/cldr/id.json +4132 -4658
  107. package/dist/generated/assets/cldr/it.json +4355 -4950
  108. package/dist/generated/assets/cldr/it_CH.json +4355 -4950
  109. package/dist/generated/assets/cldr/ja.json +4251 -4830
  110. package/dist/generated/assets/cldr/kk.json +4503 -4725
  111. package/dist/generated/assets/cldr/ko.json +4210 -4738
  112. package/dist/generated/assets/cldr/lt.json +4939 -5481
  113. package/dist/generated/assets/cldr/lv.json +4651 -5112
  114. package/dist/generated/assets/cldr/mk.json +4408 -0
  115. package/dist/generated/assets/cldr/ms.json +4093 -4515
  116. package/dist/generated/assets/cldr/nb.json +4403 -4977
  117. package/dist/generated/assets/cldr/nl.json +4542 -4884
  118. package/dist/generated/assets/cldr/nl_BE.json +4542 -4884
  119. package/dist/generated/assets/cldr/pl.json +4978 -5176
  120. package/dist/generated/assets/cldr/pt.json +4597 -4805
  121. package/dist/generated/assets/cldr/pt_PT.json +4648 -4940
  122. package/dist/generated/assets/cldr/ro.json +4633 -5090
  123. package/dist/generated/assets/cldr/ru.json +4947 -5407
  124. package/dist/generated/assets/cldr/ru_UA.json +4947 -5407
  125. package/dist/generated/assets/cldr/sk.json +4980 -5370
  126. package/dist/generated/assets/cldr/sl.json +4948 -5340
  127. package/dist/generated/assets/cldr/sr.json +4737 -5126
  128. package/dist/generated/assets/cldr/sr_Latn.json +4722 -5127
  129. package/dist/generated/assets/cldr/sv.json +4406 -5011
  130. package/dist/generated/assets/cldr/th.json +4234 -4797
  131. package/dist/generated/assets/cldr/tr.json +4451 -4979
  132. package/dist/generated/assets/cldr/uk.json +4908 -5353
  133. package/dist/generated/assets/cldr/vi.json +4094 -4673
  134. package/dist/generated/assets/cldr/zh_CN.json +4124 -4632
  135. package/dist/generated/assets/cldr/zh_HK.json +4132 -4640
  136. package/dist/generated/assets/cldr/zh_SG.json +4132 -4640
  137. package/dist/generated/assets/cldr/zh_TW.json +4155 -4728
  138. package/dist/generated/json-imports/LocaleData-static.d.ts +1 -0
  139. package/dist/generated/json-imports/LocaleData-static.js +12 -11
  140. package/dist/generated/json-imports/LocaleData-static.js.map +1 -0
  141. package/dist/generated/json-imports/LocaleData.d.ts +1 -0
  142. package/dist/generated/json-imports/LocaleData.js +88 -87
  143. package/dist/generated/json-imports/LocaleData.js.map +1 -0
  144. package/dist/getCachedLocaleDataInstance.d.ts +4 -0
  145. package/dist/getCachedLocaleDataInstance.js +6 -9
  146. package/dist/getCachedLocaleDataInstance.js.map +1 -0
  147. package/dist/locale/getLocaleData.d.ts +11 -0
  148. package/dist/locale/getLocaleData.js +13 -17
  149. package/dist/locale/getLocaleData.js.map +1 -0
  150. package/dist/sap/base/Event.js +59 -0
  151. package/dist/sap/base/Eventing.js +146 -0
  152. package/dist/sap/base/Log.js +2 -240
  153. package/dist/sap/base/assert.js +31 -5
  154. package/dist/sap/base/config/MemoryConfigurationProvider.js +20 -0
  155. package/dist/sap/base/config.js +17 -0
  156. package/dist/sap/base/i18n/Formatting.js +1130 -0
  157. package/dist/sap/base/i18n/LanguageTag.js +173 -0
  158. package/dist/sap/base/i18n/Localization.d.ts +4 -0
  159. package/dist/sap/base/i18n/Localization.js +12 -0
  160. package/dist/sap/base/i18n/Localization.js.map +1 -0
  161. package/dist/sap/base/i18n/date/CalendarType.js +43 -0
  162. package/dist/sap/base/i18n/date/CalendarWeekNumbering.js +105 -0
  163. package/dist/sap/base/i18n/date/TimezoneUtils.js +319 -0
  164. package/dist/sap/base/strings/camelize.js +30 -0
  165. package/dist/sap/base/strings/formatMessage.js +88 -15
  166. package/dist/sap/base/util/LoaderExtensions.d.ts +4 -0
  167. package/dist/sap/base/util/LoaderExtensions.js +9 -12
  168. package/dist/sap/base/util/LoaderExtensions.js.map +1 -0
  169. package/dist/sap/base/util/ObjectPath.d.ts +4 -0
  170. package/dist/sap/base/util/ObjectPath.js +4 -33
  171. package/dist/sap/base/util/ObjectPath.js.map +1 -0
  172. package/dist/sap/base/util/Version.js +157 -0
  173. package/dist/sap/base/util/_merge.js +83 -26
  174. package/dist/sap/base/util/array/uniqueSort.js +37 -15
  175. package/dist/sap/base/util/deepClone.js +102 -0
  176. package/dist/sap/base/util/deepEqual.js +75 -51
  177. package/dist/sap/base/util/extend.js +58 -7
  178. package/dist/sap/base/util/isEmptyObject.js +34 -0
  179. package/dist/sap/base/util/isPlainObject.js +35 -1
  180. package/dist/sap/base/util/now.js +24 -3
  181. package/dist/sap/base/util/resolveReference.js +3 -0
  182. package/dist/sap/base/util/uid.js +27 -0
  183. package/dist/sap/ui/base/DataType.js +657 -0
  184. package/dist/sap/ui/base/Interface.js +47 -1
  185. package/dist/sap/ui/base/Metadata.js +435 -171
  186. package/dist/sap/ui/base/Object.js +284 -48
  187. package/dist/sap/ui/core/CalendarType.js +24 -8
  188. package/dist/sap/ui/core/Configuration.d.ts +18 -0
  189. package/dist/sap/ui/core/Configuration.js +23 -0
  190. package/dist/sap/ui/core/Configuration.js.map +1 -0
  191. package/dist/sap/ui/core/Core.d.ts +27 -0
  192. package/dist/sap/ui/core/Core.js +7 -32
  193. package/dist/sap/ui/core/Core.js.map +1 -0
  194. package/dist/sap/ui/core/FormatSettings.d.ts +10 -0
  195. package/dist/sap/ui/core/FormatSettings.js +14 -0
  196. package/dist/sap/ui/core/FormatSettings.js.map +1 -0
  197. package/dist/sap/ui/core/Locale.js +190 -142
  198. package/dist/sap/ui/core/LocaleData.js +2665 -1202
  199. package/dist/sap/ui/core/Supportability.js +5 -0
  200. package/dist/sap/ui/core/Theming.js +539 -0
  201. package/dist/sap/ui/core/date/Buddhist.js +162 -93
  202. package/dist/sap/ui/core/date/CalendarUtils.js +65 -0
  203. package/dist/sap/ui/core/date/CalendarWeekNumbering.js +30 -0
  204. package/dist/sap/ui/core/date/Gregorian.js +25 -10
  205. package/dist/sap/ui/core/date/Islamic.js +298 -185
  206. package/dist/sap/ui/core/date/Japanese.js +212 -117
  207. package/dist/sap/ui/core/date/Persian.js +324 -195
  208. package/dist/sap/ui/core/date/UI5Date.js +991 -0
  209. package/dist/sap/ui/core/date/UniversalDate.js +1251 -211
  210. package/dist/sap/ui/core/date/_Calendars.js +10 -1
  211. package/dist/sap/ui/core/format/DateFormat.js +3163 -1794
  212. package/dist/sap/ui/core/format/TimezoneUtil.js +24 -0
  213. package/package-scripts.cjs +28 -0
  214. package/package.json +14 -6
  215. package/tsconfig.json +24 -0
  216. package/used-modules.txt +29 -2
  217. package/dist/sap/ui/Device.js +0 -5
  218. package/hash.txt +0 -1
  219. package/package-scripts.js +0 -40
  220. package/src/Assets.js +0 -2
  221. package/src/DateFormat.js +0 -3
  222. package/src/LocaleData.js +0 -3
  223. package/src/dates/CalendarDate.js +0 -223
  224. package/src/dates/ExtremeDates.js +0 -39
  225. package/src/dates/calculateWeekNumber.js +0 -51
  226. package/src/dates/getRoundedTimestamp.js +0 -14
  227. package/src/dates/getTodayUTCTimestamp.js +0 -9
  228. package/src/dates/modifyDateBy.js +0 -42
  229. package/src/getCachedLocaleDataInstance.js +0 -13
  230. package/src/locale/getLocaleData.js +0 -27
  231. package/src/sap/base/util/LoaderExtensions.js +0 -17
  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,265 +1,394 @@
1
- import UniversalDate from './UniversalDate.js';
2
- import CalendarType from '../CalendarType.js';
3
- import _Calendars from './_Calendars.js';
4
- var Persian = UniversalDate.extend('sap.ui.core.date.Persian', {
5
- constructor: function () {
6
- var aArgs = arguments;
7
- if (aArgs.length > 1) {
8
- aArgs = toGregorianArguments(aArgs);
9
- }
10
- this.oDate = this.createDate(Date, aArgs);
11
- 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);
12
26
  }
27
+ this.oDate = this.createDate(Date, aArgs);
28
+ this.sCalendarType = CalendarType.Persian;
29
+ }
13
30
  });
14
31
  Persian.UTC = function () {
15
- var aArgs = toGregorianArguments(arguments);
16
- return Date.UTC.apply(Date, aArgs);
32
+ var aArgs = toGregorianArguments(arguments);
33
+ return Date.UTC.apply(Date, aArgs);
17
34
  };
18
35
  Persian.now = function () {
19
- return Date.now();
36
+ return Date.now();
20
37
  };
21
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
+ */
22
46
  function toPersian(oGregorian) {
23
- var iJulianDayNumber = g2d(oGregorian.year, oGregorian.month + 1, oGregorian.day);
24
- return d2j(iJulianDayNumber);
47
+ var iJulianDayNumber = g2d(oGregorian.year, oGregorian.month + 1, oGregorian.day);
48
+ return d2j(iJulianDayNumber);
25
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
+ */
26
57
  function toGregorian(oPersian) {
27
- var iJulianDayNumber = j2d(oPersian.year, oPersian.month + 1, oPersian.day);
28
- return d2g(iJulianDayNumber);
58
+ var iJulianDayNumber = j2d(oPersian.year, oPersian.month + 1, oPersian.day);
59
+ return d2g(iJulianDayNumber);
29
60
  }
30
61
  function toGregorianArguments(aArgs) {
31
- var aGregorianArgs = Array.prototype.slice.call(aArgs), oPersian, oGregorian;
32
- if (typeof aArgs[0] !== 'number' || typeof aArgs[1] !== 'number' || aArgs[2] !== undefined && typeof aArgs[2] != 'number') {
33
- aGregorianArgs[0] = NaN;
34
- aGregorianArgs[1] = NaN;
35
- aGregorianArgs[2] = NaN;
36
- return aGregorianArgs;
37
- }
38
- oPersian = {
39
- year: aArgs[0],
40
- month: aArgs[1],
41
- day: aArgs[2] !== undefined ? aArgs[2] : 1
42
- };
43
- oGregorian = toGregorian(oPersian);
44
- aGregorianArgs[0] = oGregorian.year;
45
- aGregorianArgs[1] = oGregorian.month;
46
- 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;
47
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;
48
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
+ */
49
97
  function jalCal(jy) {
50
- var breaks = [
51
- -61,
52
- 9,
53
- 38,
54
- 199,
55
- 426,
56
- 686,
57
- 756,
58
- 818,
59
- 1111,
60
- 1181,
61
- 1210,
62
- 1635,
63
- 2060,
64
- 2097,
65
- 2192,
66
- 2262,
67
- 2324,
68
- 2394,
69
- 2456,
70
- 3178
71
- ], bl = breaks.length, gy = jy + 621, leapJ = -14, jp = breaks[0], jm, jump, leap, leapG, march, n, i;
72
- for (i = 1; i < bl; i += 1) {
73
- jm = breaks[i];
74
- jump = jm - jp;
75
- if (jy < jm) {
76
- break;
77
- }
78
- leapJ = leapJ + div(jump, 33) * 8 + div(mod(jump, 33), 4);
79
- jp = jm;
80
- }
81
- n = jy - jp;
82
- leapJ = leapJ + div(n, 33) * 8 + div(mod(n, 33) + 3, 4);
83
- if (mod(jump, 33) === 4 && jump - n === 4) {
84
- leapJ += 1;
85
- }
86
- leapG = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150;
87
- march = 20 + leapJ - leapG;
88
- if (jump - n < 6) {
89
- 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;
90
118
  }
91
- leap = mod(mod(n + 1, 33) - 1, 4);
92
- if (leap === -1) {
93
- leap = 4;
94
- }
95
- return {
96
- leap: leap,
97
- gy: gy,
98
- march: march
99
- };
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
+ };
100
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
+ */
101
159
  function j2d(jy, jm, jd) {
102
- while (jm < 1) {
103
- jm += 12;
104
- jy--;
105
- }
106
- while (jm > 12) {
107
- jm -= 12;
108
- jy++;
109
- }
110
- var r = jalCal(jy);
111
- 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;
112
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
+ */
113
181
  function d2j(jdn) {
114
- var gy = d2g(jdn).year, jy = gy - 621, r = jalCal(jy), jdn1f = g2d(gy, 3, r.march), jd, jm, k;
115
- k = jdn - jdn1f;
116
- if (k >= 0) {
117
- if (k <= 185) {
118
- jm = 1 + div(k, 31);
119
- jd = mod(k, 31) + 1;
120
- return {
121
- year: jy,
122
- month: jm - 1,
123
- day: jd
124
- };
125
- } else {
126
- k -= 186;
127
- }
128
- } else {
129
- jy -= 1;
130
- k += 179;
131
- if (r.leap === 1) {
132
- k += 1;
133
- }
134
- }
135
- jm = 7 + div(k, 30);
136
- jd = mod(k, 30) + 1;
137
- 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 {
138
198
  year: jy,
139
199
  month: jm - 1,
140
200
  day: jd
141
- };
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
+ };
142
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
+ */
143
234
  function g2d(gy, gm, gd) {
144
- var d = div((gy + div(gm - 8, 6) + 100100) * 1461, 4) + div(153 * mod(gm + 9, 12) + 2, 5) + gd - 34840408;
145
- d = d - div(div(gy + 100100 + div(gm - 8, 6), 100) * 3, 4) + 752;
146
- 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;
147
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
+ */
148
250
  function d2g(jdn) {
149
- var j, i, gd, gm, gy;
150
- j = 4 * jdn + 139361631;
151
- j = j + div(div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
152
- i = div(mod(j, 1461), 4) * 5 + 308;
153
- gd = div(mod(i, 153), 5) + 1;
154
- gm = mod(div(i, 153), 12) + 1;
155
- gy = div(j, 1461) - 100100 + div(8 - gm, 6);
156
- return {
157
- year: gy,
158
- month: gm - 1,
159
- day: gd
160
- };
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
+ };
161
263
  }
264
+
265
+ /*
266
+ Utility helper functions.
267
+ */
268
+
162
269
  function div(a, b) {
163
- return ~~(a / b);
270
+ return ~~(a / b);
164
271
  }
165
272
  function mod(a, b) {
166
- return a - ~~(a / b) * b;
273
+ return a - ~~(a / b) * b;
167
274
  }
275
+
276
+ /**
277
+ * Get the Persian date from the this.oDate
278
+ */
168
279
  Persian.prototype._getPersian = function () {
169
- return toPersian({
170
- day: this.oDate.getDate(),
171
- month: this.oDate.getMonth(),
172
- year: this.oDate.getFullYear()
173
- });
280
+ return toPersian({
281
+ day: this.oDate.getDate(),
282
+ month: this.oDate.getMonth(),
283
+ year: this.oDate.getFullYear()
284
+ });
174
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
+ */
175
291
  Persian.prototype._setPersian = function (oPersian) {
176
- var oGregorian = toGregorian(oPersian);
177
- 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);
178
294
  };
295
+
296
+ /**
297
+ * Get the Persian date from the this.oDate
298
+ */
179
299
  Persian.prototype._getUTCPersian = function () {
180
- return toPersian({
181
- day: this.oDate.getUTCDate(),
182
- month: this.oDate.getUTCMonth(),
183
- year: this.oDate.getUTCFullYear()
184
- });
300
+ return toPersian({
301
+ day: this.oDate.getUTCDate(),
302
+ month: this.oDate.getUTCMonth(),
303
+ year: this.oDate.getUTCFullYear()
304
+ });
185
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
+ */
186
311
  Persian.prototype._setUTCPersian = function (oPersian) {
187
- var oGregorian = toGregorian(oPersian);
188
- 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);
189
314
  };
315
+
316
+ /*
317
+ * Override setters and getters specific to the Persian date
318
+ */
190
319
  Persian.prototype.getDate = function (iDate) {
191
- return this._getPersian().day;
320
+ return this._getPersian().day;
192
321
  };
193
322
  Persian.prototype.getMonth = function () {
194
- return this._getPersian().month;
323
+ return this._getPersian().month;
195
324
  };
196
325
  Persian.prototype.getYear = function () {
197
- return this._getPersian().year - BASE_YEAR;
326
+ return this._getPersian().year - BASE_YEAR;
198
327
  };
199
328
  Persian.prototype.getFullYear = function () {
200
- return this._getPersian().year;
329
+ return this._getPersian().year;
201
330
  };
202
331
  Persian.prototype.setDate = function (iDate) {
203
- var oPersian = this._getPersian();
204
- oPersian.day = iDate;
205
- return this._setPersian(oPersian);
332
+ var oPersian = this._getPersian();
333
+ oPersian.day = iDate;
334
+ return this._setPersian(oPersian);
206
335
  };
207
336
  Persian.prototype.setMonth = function (iMonth, iDay) {
208
- var oPersian = this._getPersian();
209
- oPersian.month = iMonth;
210
- if (iDay !== undefined) {
211
- oPersian.day = iDay;
212
- }
213
- 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);
214
343
  };
215
344
  Persian.prototype.setYear = function (iYear) {
216
- var oPersian = this._getPersian();
217
- oPersian.year = iYear + BASE_YEAR;
218
- return this._setPersian(oPersian);
345
+ var oPersian = this._getPersian();
346
+ oPersian.year = iYear + BASE_YEAR;
347
+ return this._setPersian(oPersian);
219
348
  };
220
349
  Persian.prototype.setFullYear = function (iYear, iMonth, iDay) {
221
- var oPersian = this._getPersian();
222
- oPersian.year = iYear;
223
- if (iMonth !== undefined) {
224
- oPersian.month = iMonth;
225
- }
226
- if (iDay !== undefined) {
227
- oPersian.day = iDay;
228
- }
229
- 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);
230
359
  };
231
360
  Persian.prototype.getUTCDate = function (iDate) {
232
- return this._getUTCPersian().day;
361
+ return this._getUTCPersian().day;
233
362
  };
234
363
  Persian.prototype.getUTCMonth = function () {
235
- return this._getUTCPersian().month;
364
+ return this._getUTCPersian().month;
236
365
  };
237
366
  Persian.prototype.getUTCFullYear = function () {
238
- return this._getUTCPersian().year;
367
+ return this._getUTCPersian().year;
239
368
  };
240
369
  Persian.prototype.setUTCDate = function (iDate) {
241
- var oPersian = this._getUTCPersian();
242
- oPersian.day = iDate;
243
- return this._setUTCPersian(oPersian);
370
+ var oPersian = this._getUTCPersian();
371
+ oPersian.day = iDate;
372
+ return this._setUTCPersian(oPersian);
244
373
  };
245
374
  Persian.prototype.setUTCMonth = function (iMonth, iDay) {
246
- var oPersian = this._getUTCPersian();
247
- oPersian.month = iMonth;
248
- if (iDay !== undefined) {
249
- oPersian.day = iDay;
250
- }
251
- 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);
252
381
  };
253
382
  Persian.prototype.setUTCFullYear = function (iYear, iMonth, iDay) {
254
- var oPersian = this._getUTCPersian();
255
- oPersian.year = iYear;
256
- if (iMonth !== undefined) {
257
- oPersian.month = iMonth;
258
- }
259
- if (iDay !== undefined) {
260
- oPersian.day = iDay;
261
- }
262
- 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);
263
392
  };
264
393
  _Calendars.set(CalendarType.Persian, Persian);
265
394
  export default Persian;