buddhist.js 6.5 KB

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