source: Dev/branches/rest-dojo-ui/client/dojox/date/islamic.js @ 265

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