123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.date.buddhist"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.date.buddhist"] = true;
- dojo.provide("dojox.date.buddhist");
- dojo.experimental("dojox.date.buddhist");
- dojo.require("dojox.date.buddhist.Date");
- dojo.require("dojo.date"); // for compare
-
- // Utility methods to do arithmetic calculations with buddhist.Dates
- dojox.date.buddhist.getDaysInMonth = function(/*buddhist.Date*/dateObject){
- return dojo.date.getDaysInMonth(dateObject.toGregorian());
- };
- dojox.date.buddhist.isLeapYear = function(/*buddhist.Date*/dateObject){
- return dojo.date.isLeapYear(dateObject.toGregorian());
- };
- //FIXME: reduce compare, add, diff also
- dojox.date.buddhist.compare = function(/*buddhist.Date*/date1, /*buddhist.Date*/date2, /*String?*/portion){
- // summary:
- // Compare two buddhist date objects by date, time, or both.
- return dojo.date.compare(date1,date2, portion); //FIXME
- };
- dojox.date.buddhist.add = function(/*dojox.date.buddhist.Date*/date, /*String*/interval, /*int*/amount){
- // based on and similar to dojo.date.add
- // summary:
- // Add to a Date in intervals of different size, from milliseconds to years
- // date: buddhist.Date
- // Date object to start with
- // interval:
- // A string representing the interval. One of the following:
- // "year", "month", "day", "hour", "minute", "second",
- // "millisecond", "week", "weekday"
- // amount:
- // How much to add to the date.
- var newBuddDate = new dojox.date.buddhist.Date(date);
- switch(interval){
- case "day":
- newBuddDate.setDate(date.getDate(true) + amount);
- break;
- case "weekday":
- var days, weeks;
- var mod = amount % 5;
- if(!mod){
- days = (amount > 0) ? 5 : -5;
- weeks = (amount > 0) ? ((amount-5)/5) : ((amount+5)/5);
- }else{
- days = mod;
- weeks = parseInt(amount/5);
- }
- // Get weekday value for orig date param
- var strt = date.getDay();
- // Orig date is Sat / positive incrementer
- // Jump over Sun
- var adj = 0;
- if(strt == 6 && amount > 0){
- adj = 1;
- }else if(strt == 0 && amount < 0){
- // Orig date is Sun / negative incrementer
- // Jump back over Sat
- adj = -1;
- }
- // Get weekday val for the new date
- var trgt = strt + days;
- // New date is on Sat or Sun
- if(trgt == 0 || trgt == 6){
- adj = (amount > 0) ? 2 : -2;
- }
- // Increment by number of weeks plus leftover days plus
- // weekend adjustments
- amount = (7 * weeks) + days + adj;
- newBuddDate.setDate(date.getDate(true) + amount);
- break;
- case "year":
- newBuddDate.setFullYear(date.getFullYear() + amount );
- break;
- case "week":
- amount *= 7;
- newBuddDate.setDate(date.getDate(true) + amount);
- break;
- case "month":
- newBuddDate.setMonth(date.getMonth() + amount);
- break;
- case "hour":
- newBuddDate.setHours(date.getHours() + amount );
- break;
- case "minute":
- newBuddDate.setMinutes(date.getMinutes() + amount );
- break;
- case "second":
- newBuddDate.setSeconds(date.getSeconds() + amount );
- break;
- case "millisecond":
- newBuddDate.setMilliseconds(date.getMilliseconds() + amount );
- break;
- }
- return newBuddDate; // dojox.date.buddhist.Date
- };
- dojox.date.buddhist.difference = function(/*dojox.date.buddhist.Date*/date1, /*dojox.date.buddhist.Date?*/date2, /*String?*/interval){
- // based on and similar to dojo.date.difference
- // summary:
- // date1 - date2
- // date2 is hebrew.Date object. If not specified, the current hebrew.Date is used.
- // interval:
- // A string representing the interval. One of the following:
- // "year", "month", "day", "hour", "minute", "second",
- // "millisecond", "week", "weekday"
- // Defaults to "day".
-
- date2 = date2 || new dojox.date.buddhist.Date();
- interval = interval || "day";
- var yearDiff = date1.getFullYear() - date2.getFullYear();
- var delta = 1; // Integer return value
- switch(interval){
- case "weekday":
- var days = Math.round(dojox.date.buddhist.difference(date1, date2, "day"));
- var weeks = parseInt(dojox.date.buddhist.difference(date1, date2, "week"));
- var mod = days % 7;
-
- // Even number of weeks
- if(mod == 0){
- days = weeks*5;
- }else{
- // Weeks plus spare change (< 7 days)
- var adj = 0;
- var aDay = date2.getDay();
- var bDay = date1.getDay();
-
- weeks = parseInt(days/7);
- mod = days % 7;
- // Mark the date advanced by the number of
- // round weeks (may be zero)
- var dtMark = new dojox.date.buddhist.Date(date1);
- dtMark.setDate(dtMark.getDate(true)+(weeks*7));
- var dayMark = dtMark.getDay();
-
- // Spare change days -- 6 or less
- if(days > 0){
- switch(true){
- // Range starts on Fri
- case aDay == 5:
- adj = -1;
- break;
- // Range starts on Sat
- case aDay == 6:
- adj = 0;
- break;
- // Range ends on Fri
- case bDay == 5:
- adj = -1;
- break;
- // Range ends on Sat
- case bDay == 6:
- adj = -2;
- break;
- // Range contains weekend
- case (dayMark + mod) > 5:
- adj = -2;
- }
- }else if(days < 0){
- switch(true){
- // Range starts on Fri
- case aDay == 5:
- adj = 0;
- break;
- // Range starts on Sat
- case aDay == 6:
- adj = 1;
- break;
- // Range ends on Fri
- case bDay == 5:
- adj = 2;
- break;
- // Range ends on Sat
- case bDay == 6:
- adj = 1;
- break;
- // Range contains weekend
- case (dayMark + mod) < 0:
- adj = 2;
- }
- }
- days += adj;
- days -= (weeks*2);
- }
- delta = days;
- break;
- case "year":
- delta = yearDiff;
- break;
- case "month":
- var startdate = (date1.toGregorian() > date2.toGregorian()) ? date1 : date2; // more
- var enddate = (date1.toGregorian() > date2.toGregorian()) ? date2 : date1;
-
- var month1 = startdate.getMonth();
- var month2 = enddate.getMonth();
-
- if (yearDiff == 0){
- delta = startdate.getMonth() - enddate.getMonth() ;
- }else{
- delta = 12-month2;
- delta += month1;
- var i = enddate.getFullYear()+1;
- var e = startdate.getFullYear();
- for (i; i < e; i++){
- delta += 12;
- }
- }
- if (date1.toGregorian() < date2.toGregorian()){
- delta = -delta;
- }
- break;
- case "week":
- // Truncate instead of rounding
- // Don't use Math.floor -- value may be negative
- delta = parseInt(dojox.date.buddhist.difference(date1, date2, "day")/7);
- break;
- case "day":
- delta /= 24;
- // fallthrough
- case "hour":
- delta /= 60;
- // fallthrough
- case "minute":
- delta /= 60;
- // fallthrough
- case "second":
- delta /= 1000;
- // fallthrough
- case "millisecond":
- delta *= date1.toGregorian().getTime()- date2.toGregorian().getTime();
- }
-
- // Round for fractional values and DST leaps
- return Math.round(delta); // Number (integer)
- };
- }
|