source: Dev/branches/rest-dojo-ui/client/dojox/date/hebrew.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

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