source: Dev/trunk/src/client/dojox/date/hebrew.js @ 532

Last change on this file since 532 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

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