hebrew.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. define("dojox/date/hebrew", ["dojo/_base/kernel", "dojo/date", "./hebrew/Date"], function(dojo, dd, hebrewDate){
  2. dojo.getObject("date.hebrew", true, dojox);
  3. dojo.experimental("dojox.date.hebrew");
  4. // Utility methods to do arithmetic calculations with hebrew.Dates
  5. // added for compat to date
  6. dojox.date.hebrew.getDaysInMonth = function(/*hebrew.Date*/month){
  7. return month.getDaysInHebrewMonth(month.getMonth(), month.getFullYear());
  8. };
  9. //TODO: define hebrew.isLeapYear? Or should it be invalid, since it has different meaning?
  10. dojox.date.hebrew.compare = function(/*hebrew.Date*/dateheb1, /*hebrew.Date*/dateheb2, /*String?*/portion){
  11. // summary:
  12. // Compare two hebrew date objects by date, time, or both.
  13. // description:
  14. // Returns 0 if equal, positive if a > b, else negative.
  15. // date1:
  16. // hebrew.Date object
  17. // date2:
  18. // hebrew.Date object. If not specified, the current hebrew.Date is used.
  19. // portion:
  20. // A string indicating the "date" or "time" portion of a Date object.
  21. // Compares both "date" and "time" by default. One of the following:
  22. // "date", "time", "datetime"
  23. if(dateheb1 instanceof hebrewDate){
  24. dateheb1 = dateheb1.toGregorian();
  25. }
  26. if(dateheb2 instanceof hebrewDate){
  27. dateheb2 = dateheb2.toGregorian();
  28. }
  29. return dd.compare.apply(null, arguments);
  30. };
  31. dojox.date.hebrew.add = function(/*dojox.date.hebrew.Date*/date, /*String*/interval, /*int*/amount){
  32. // based on and similar to dojo.date.add
  33. // summary:
  34. // Add to a Date in intervals of different size, from milliseconds to years
  35. // date: hebrew.Date
  36. // Date object to start with
  37. // interval:
  38. // A string representing the interval. One of the following:
  39. // "year", "month", "day", "hour", "minute", "second",
  40. // "millisecond", "week", "weekday"
  41. // amount:
  42. // How much to add to the date.
  43. var newHebrDate = new hebrewDate(date);
  44. switch(interval){
  45. case "day":
  46. newHebrDate.setDate(date.getDate() + amount);
  47. break;
  48. case "weekday":
  49. var day = date.getDay();
  50. var remdays = 0;
  51. if(amount < 0 && day == 6){ day = 5; remdays = -1; }
  52. if((day + amount) < 5 && (day + amount) >= 0){ //in the same week
  53. newHebrDate.setDate(date.getDate() + amount + remdays);
  54. }else{
  55. var add = (amount > 0) ? 5 : -1;
  56. var adddays = (amount > 0) ? 2 : -2 ; /*first weekend */
  57. if (amount > 0 && (day == 5 || day == 6)) { remdays = 4 - day; day = 4;}
  58. var newamount = day + amount - add;
  59. var weeks = parseInt(newamount / 5);
  60. var newday = newamount%5;
  61. newHebrDate.setDate(date.getDate() - day+ adddays + weeks * 7 + remdays + newday + add);
  62. }
  63. break;
  64. case "year":
  65. newHebrDate.setFullYear(date.getFullYear() + amount);
  66. break;
  67. case "week":
  68. amount *= 7;
  69. newHebrDate.setDate(date.getDate() + amount);
  70. break;
  71. case "month":
  72. var month = date.getMonth(),
  73. newMonth = month + amount;
  74. if(!date.isLeapYear(date.getFullYear())){
  75. if(month < 5 && newMonth >= 5){ newMonth++;}
  76. else if (month > 5 && newMonth <= 5){ newMonth--;}
  77. }
  78. newHebrDate.setMonth(newMonth);
  79. break;
  80. case "hour":
  81. newHebrDate.setHours(date.getHours() + amount);
  82. break;
  83. case "minute":
  84. newHebrDate._addMinutes(amount);
  85. break;
  86. case "second":
  87. newHebrDate._addSeconds(amount);
  88. break;
  89. case "millisecond":
  90. newHebrDate._addMilliseconds(amount);
  91. break;
  92. }
  93. return newHebrDate; // dojox.date.hebrew.Date
  94. };
  95. dojox.date.hebrew.difference = function(/*dojox.date.hebrew.Date*/date1, /*dojox.date.hebrew.Date?*/date2, /*String?*/interval){
  96. // based on and similar to dojo.date.difference
  97. // summary:
  98. // date2 - date1
  99. // date2 is hebrew.Date object. If not specified, the current hebrew.Date is used.
  100. // interval:
  101. // A string representing the interval. One of the following:
  102. // "year", "month", "day", "hour", "minute", "second",
  103. // "millisecond", "week", "weekday"
  104. // Defaults to "day".
  105. date2 = date2 || new hebrewDate();
  106. interval = interval || "day";
  107. var yearDiff = date2.getFullYear() - date1.getFullYear();
  108. var delta = 1; // Integer return value
  109. switch(interval){
  110. case "weekday":
  111. var days = Math.round(dojox.date.hebrew.difference(date1, date2, "day"));
  112. var weeks = parseInt(dojox.date.hebrew.difference(date1, date2, "week"));
  113. var mod = days % 7;
  114. // Even number of weeks
  115. if(mod == 0){
  116. days = weeks*5;
  117. }else{
  118. // Weeks plus spare change (< 7 days)
  119. var adj = 0;
  120. var aDay = date1.getDay();
  121. var bDay = date2.getDay();
  122. weeks = parseInt(days/7);
  123. mod = days % 7;
  124. // Mark the date advanced by the number of
  125. // round weeks (may be zero)
  126. var dtMark = new hebrewDate(date1);
  127. dtMark.setDate(dtMark.getDate()+(weeks*7));
  128. var dayMark = dtMark.getDay();
  129. // Spare change days -- 6 or less
  130. if(days > 0){
  131. switch(true){
  132. // Range starts on Fri
  133. case aDay == 5:
  134. adj = -1;
  135. break;
  136. // Range starts on Sat
  137. case aDay == 6:
  138. adj = 0;
  139. break;
  140. // Range ends on Fri
  141. case bDay == 5:
  142. adj = -1;
  143. break;
  144. // Range ends on Sat
  145. case bDay == 6:
  146. adj = -2;
  147. break;
  148. // Range contains weekend
  149. case (dayMark + mod) > 5:
  150. adj = -2;
  151. }
  152. }else if(days < 0){
  153. switch(true){
  154. // Range starts on Fri
  155. case aDay == 5:
  156. adj = 0;
  157. break;
  158. // Range starts on Sat
  159. case aDay == 6:
  160. adj = 1;
  161. break;
  162. // Range ends on Fri
  163. case bDay == 5:
  164. adj = 2;
  165. break;
  166. // Range ends on Sat
  167. case bDay == 6:
  168. adj = 1;
  169. break;
  170. // Range contains weekend
  171. case (dayMark + mod) < 0:
  172. adj = 2;
  173. }
  174. }
  175. days += adj;
  176. days -= (weeks*2);
  177. }
  178. delta = days;
  179. break;
  180. case "year":
  181. delta = yearDiff;
  182. break;
  183. case "month":
  184. var startdate = (date2.toGregorian() > date1.toGregorian()) ? date2 : date1; // more
  185. var enddate = (date2.toGregorian() > date1.toGregorian()) ? date1 : date2;
  186. var month1 = startdate.getMonth();
  187. var month2 = enddate.getMonth();
  188. if(yearDiff == 0){
  189. delta = ( !date2.isLeapYear(date2.getFullYear()) && startdate.getMonth() > 5 && enddate.getMonth() <=5) ? (startdate.getMonth() - enddate.getMonth() - 1) :
  190. (startdate.getMonth() - enddate.getMonth() );
  191. }else{
  192. delta = (!enddate.isLeapYear(enddate.getFullYear()) && month2 < 6) ? (13-month2-1) : (13-month2);
  193. delta += (!startdate.isLeapYear(startdate.getFullYear()) && month1 > 5) ? (month1 -1): month1;
  194. var i = enddate.getFullYear() + 1;
  195. var e = startdate.getFullYear();
  196. for (i; i < e; i++){
  197. delta += enddate.isLeapYear(i) ? 13 : 12;
  198. }
  199. }
  200. if(date2.toGregorian() < date1.toGregorian()){
  201. delta = -delta;
  202. }
  203. break;
  204. case "week":
  205. // Truncate instead of rounding
  206. // Don't use Math.floor -- value may be negative
  207. delta = parseInt(dojox.date.hebrew.difference(date1, date2, "day")/7);
  208. break;
  209. case "day":
  210. delta /= 24;
  211. // fallthrough
  212. case "hour":
  213. delta /= 60;
  214. // fallthrough
  215. case "minute":
  216. delta /= 60;
  217. // fallthrough
  218. case "second":
  219. delta /= 1000;
  220. // fallthrough
  221. case "millisecond":
  222. delta *= date2.toGregorian().getTime()- date1.toGregorian().getTime();
  223. }
  224. // Round for fractional values and DST leaps
  225. return Math.round(delta); // Number (integer)
  226. };
  227. return dojox.date.hebrew;
  228. });