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