667165fe409f2b9b036dd646cf0cf06a5fbc78c2
[platform/framework/web/crosswalk-tizen.git] /
1 define(['./totalDaysInMonth', './totalDaysInYear', '../time/convert'], function(totalDaysInMonth, totalDaysInYear, convert){
2
3     /**
4      * calculate the difference between dates (range)
5      */
6     function diff(start, end, unitName){
7         // sort the dates to make it easier to process (specially year/month)
8         if (start > end) {
9             var swap = start;
10             start = end;
11             end = swap;
12         }
13
14         var output;
15
16         if (unitName === 'month') {
17             output = getMonthsDiff(start, end);
18         } else if (unitName === 'year'){
19             output = getYearsDiff(start, end);
20         } else if (unitName != null) {
21             if (unitName === 'day') {
22                 // ignore timezone difference because of daylight savings time
23                 start = toUtc(start);
24                 end = toUtc(end);
25             }
26             output = convert(end - start, 'ms', unitName);
27         } else {
28             output = end - start;
29         }
30
31         return output;
32     }
33
34
35     function toUtc(d){
36         // we ignore timezone differences on purpose because of daylight
37         // savings time, otherwise it would return fractional days/weeks even
38         // if a full day elapsed. eg:
39         // Wed Feb 12 2014 00:00:00 GMT-0200 (BRST)
40         // Sun Feb 16 2014 00:00:00 GMT-0300 (BRT)
41         // diff should be 4 days and not 4.041666666666667
42         return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(),
43                         d.getHours(), d.getMinutes(), d.getSeconds(),
44                         d.getMilliseconds());
45     }
46
47
48     function getMonthsDiff(start, end){
49         return getElapsedMonths(start, end) +
50                getElapsedYears(start, end) * 12 +
51                getFractionalMonth(start, end);
52     }
53
54
55     function getYearsDiff(start, end){
56         var elapsedYears = getElapsedYears(start, end);
57         return elapsedYears + getFractionalYear(start, end, elapsedYears);
58     }
59
60
61     function getElapsedMonths(start, end){
62         var monthDiff = end.getMonth() - start.getMonth();
63         if (monthDiff < 0) {
64             monthDiff += 12;
65         }
66         // less than a full month
67         if (start.getDate() > end.getDate()) {
68             monthDiff -= 1;
69         }
70         return monthDiff;
71     }
72
73
74     function getElapsedYears(start, end){
75         var yearDiff = end.getFullYear() - start.getFullYear();
76         // less than a full year
77         if (start.getMonth() > end.getMonth()) {
78             yearDiff -= 1;
79         }
80         return yearDiff;
81     }
82
83
84     function getFractionalMonth(start, end){
85         var fractionalDiff = 0;
86         var startDay = start.getDate();
87         var endDay = end.getDate();
88
89         if (startDay !== endDay) {
90             var startTotalDays = totalDaysInMonth(start);
91             var endTotalDays = totalDaysInMonth(end);
92             var totalDays;
93             var daysElapsed;
94
95             if (startDay > endDay) {
96                 // eg: Jan 29 - Feb 27 (29 days elapsed but not a full month)
97                 var baseDay = startTotalDays - startDay;
98                 daysElapsed = endDay + baseDay;
99                 // total days should be relative to 1st day of next month if
100                 // startDay > endTotalDays
101                 totalDays = (startDay > endTotalDays)?
102                     endTotalDays + baseDay + 1 : startDay + baseDay;
103             } else {
104                 // fractional is only based on endMonth eg: Jan 12 - Feb 18
105                 // (6 fractional days, 28 days until next full month)
106                 daysElapsed = endDay - startDay;
107                 totalDays = endTotalDays;
108             }
109
110             fractionalDiff = daysElapsed / totalDays;
111         }
112
113         return fractionalDiff;
114     }
115
116
117     function getFractionalYear(start, end, elapsedYears){
118         var base = elapsedYears?
119             new Date(end.getFullYear(), start.getMonth(), start.getDate()) :
120             start;
121         var elapsedDays = diff(base, end, 'day');
122         return elapsedDays / totalDaysInYear(end);
123     }
124
125
126     return diff;
127
128 });