1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 | 1
1
1
7
1
7
1
1
7
7
7
7
1
1
1
1
1
1
1
1
1
| (function () {
"use strict";
var attrs = ["years", "months", "days", "hours", "minutes", "seconds", "milliseconds"];
var gFn = function (attr) {
return function () {
return this[attr];
};
};
var sFn = function (attr) {
return function (val) {
this[attr] = val;
return this;
};
};
var addSetFuncs = function (context, attrs) {
for (var i = 0; i < attrs.length ; i++) {
var $a = attrs[i], $b = $a.slice(0, 1).toUpperCase() + $a.slice(1);
context.prototype[$a] = 0;
context.prototype["get" + $b] = gFn($a);
context.prototype["set" + $b] = sFn($a);
}
};
var setMonthsAndYears = function (orient, d1, d2, context) {
function inc() {
d1.addMonths(-orient);
context.months++;
if (context.months === 12) {
context.years++;
context.months = 0;
}
}
if (orient === +1) {
while (d1 > d2) {
inc();
}
} else {
while (d1 < d2) {
inc();
}
}
context.months--;
context.months *= orient;
context.years *= orient;
};
var adjustForDST = function(orient, startDate, endDate) {
var hasDSTMismatch = (false === (startDate.isDaylightSavingTime() === endDate.isDaylightSavingTime()));
if (hasDSTMismatch && orient === 1) {
startDate.addHours(-1);
} else if (hasDSTMismatch) {
startDate.addHours(1);
}
};
/**
* TimePeriod(startDate, endDate);
* TimePeriod(years, months, days, hours, minutes, seconds, milliseconds);
*/
var TimePeriod = function (years, months, days, hours, minutes, seconds, milliseconds) {
if (arguments.length === 7) {
this.set(years, months, days, hours, minutes, seconds, milliseconds);
} else if (arguments.length === 2 && arguments[0] instanceof Date && arguments[1] instanceof Date) {
var startDate = arguments[0].clone();
var endDate = arguments[1].clone();
var orient = (startDate > endDate) ? +1 : -1;
this.dates = {
start: arguments[0].clone(),
end: arguments[1].clone()
};
setMonthsAndYears(orient, startDate, endDate, this);
adjustForDST(orient, startDate, endDate);
// // TODO - adjust for DST
var diff = endDate - startDate;
if (diff !== 0) {
var ts = new TimeSpan(diff);
this.set(this.years, this.months, ts.getDays(), ts.getHours(), ts.getMinutes(), ts.getSeconds(), ts.getMilliseconds());
}
}
return this;
};
// create all the set functions.
addSetFuncs(TimePeriod, attrs);
TimePeriod.prototype.set = function (years, months, days, hours, minutes, seconds, milliseconds){
this.setYears(years || this.getYears());
this.setMonths(months || this.getMonths());
this.setDays(days || this.getDays());
this.setHours(hours || this.getHours());
this.setMinutes(minutes || this.getMinutes());
this.setSeconds(seconds || this.getSeconds());
this.setMilliseconds(milliseconds || this.getMilliseconds());
};
Date.TimePeriod = TimePeriod;
Eif (typeof window !== "undefined") {
// keeping API compatible for v1.x
window.TimePeriod = TimePeriod;
}
}()); |