hebrew.js 7.6 KB

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