kalendae_assets 0.2.1 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +1 -0
- data/.travis.yml +4 -0
- data/Appraisals +11 -0
- data/README.md +11 -1
- data/gemfiles/rails_3.gemfile +7 -0
- data/gemfiles/rails_4.0.gemfile +7 -0
- data/gemfiles/rails_4.1.gemfile +7 -0
- data/kalendae_assets.gemspec +2 -1
- data/lib/kalendae_assets/version.rb +1 -1
- data/test/dummy/config/environments/test.rb +3 -1
- data/test/spec_helper.rb +6 -2
- data/vendor/assets/javascripts/kalendae.js +196 -845
- data/vendor/assets/javascripts/kalendae.standalone.js +2411 -0
- data/vendor/assets/stylesheets/kalendae.css +35 -16
- metadata +55 -23
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
Zjk4ODFiYmI5ZjVkZTc2ZjRlNDk5ZGU4OTI1ZDFiMGJmNmEzNWNlYQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZDRhNGVkYWNlYjZmMWNjMmIxMzU3NTM4MjRiNjZlNTQyY2I5ZmMwZQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YzUxODcyOWM4MDdmYjI5OTdjNzA5YTRiODZmOWNlYTJkNWM0ZTQzN2QyNDUy
|
10
|
+
OTRmNWMxMjU0NDY2ZjVhOWE1NDA5NTFlNDUzNDM5ZjZkODdlOTczZDlkYTNi
|
11
|
+
N2MwZTk0ZTc3ZDY1MGM4M2FhYmRjZGQ0ODhjNWEzNzk1Y2ZhMzg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NGU5YjBlY2U0YzQwZDNmMmYyOTIyZjI2ODFiM2M4NWM5Mjk0MjA1ZGIyZDkz
|
14
|
+
MzBlMDRkYWJjZTIzOWNiZmQwYTQxYjNhYmQ5NDg0ZGU1NjhhMzkyM2MyMDc3
|
15
|
+
NjA0MjJhOTkyODcwZmRlNDY0MGEzYjZjZTViNGZiNjQwZDhjYmM=
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Appraisals
ADDED
data/README.md
CHANGED
@@ -5,7 +5,11 @@
|
|
5
5
|
|
6
6
|
**Step 1**
|
7
7
|
|
8
|
-
Load `kalendae_assets` in your `Gemfile
|
8
|
+
Load `kalendae_assets` in your `Gemfile`. In Rails 4, don't put it in a group:
|
9
|
+
|
10
|
+
gem 'kalendae_assets'
|
11
|
+
|
12
|
+
In Rails 3, place it in the `assets` group:
|
9
13
|
|
10
14
|
group :assets do
|
11
15
|
gem 'kalendae_assets'
|
@@ -19,6 +23,12 @@ Run 'bundle install'
|
|
19
23
|
|
20
24
|
Require `kalendae.js` in your Javascript manifest (e.g. `application.js`)
|
21
25
|
|
26
|
+
//= require kalendae.standalone
|
27
|
+
|
28
|
+
The standalone version bundles a copy of of moment.js. If you already have
|
29
|
+
moment.js in your app, you can use the non-standalone version to keep your
|
30
|
+
assets smaller:
|
31
|
+
|
22
32
|
//= require kalendae
|
23
33
|
|
24
34
|
**Step 4**
|
data/kalendae_assets.gemspec
CHANGED
@@ -14,7 +14,8 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.name = "kalendae_assets"
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = KalendaeAssets::VERSION
|
17
|
-
gem.add_dependency 'rails', '
|
17
|
+
gem.add_dependency 'rails', '>= 3.1'
|
18
|
+
gem.add_development_dependency 'appraisal'
|
18
19
|
gem.add_development_dependency 'sqlite3'
|
19
20
|
gem.add_development_dependency 'minitest'
|
20
21
|
gem.add_development_dependency 'capybara'
|
@@ -30,8 +30,10 @@ Dummy::Application.configure do
|
|
30
30
|
config.action_mailer.delivery_method = :test
|
31
31
|
|
32
32
|
# Raise exception on mass assignment protection for Active Record models
|
33
|
-
config.active_record.mass_assignment_sanitizer = :strict
|
33
|
+
config.active_record.mass_assignment_sanitizer = :strict if Rails::VERSION::MAJOR < 4
|
34
34
|
|
35
35
|
# Print deprecation notices to the stderr
|
36
36
|
config.active_support.deprecation = :stderr
|
37
|
+
|
38
|
+
config.eager_load = true
|
37
39
|
end
|
data/test/spec_helper.rb
CHANGED
@@ -12,5 +12,9 @@ class IntegrationTest < MiniTest::Spec
|
|
12
12
|
register_spec_type(/integration$/, self)
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
unless Rails.version.to_f > 4
|
16
|
+
require 'turn'
|
17
|
+
|
18
|
+
Turn.config.format = :pretty
|
19
|
+
Turn.config.natural = true
|
20
|
+
end
|
@@ -1,17 +1,26 @@
|
|
1
1
|
/********************************************************************
|
2
2
|
* Kalendae, a framework agnostic javascript date picker *
|
3
|
-
* Copyright(c)
|
3
|
+
* Copyright(c) 2013 Jarvis Badgley (chipersoft@gmail.com) *
|
4
4
|
* http://github.com/ChiperSoft/Kalendae *
|
5
|
-
* Version 0.
|
5
|
+
* Version 0.4.1 *
|
6
6
|
********************************************************************/
|
7
7
|
|
8
8
|
(function (undefined) {
|
9
9
|
|
10
|
-
var today;
|
10
|
+
var today, moment;
|
11
11
|
|
12
12
|
var Kalendae = function (targetElement, options) {
|
13
|
+
if (typeof document.addEventListener !== 'function' && !util.isIE8()) return;
|
14
|
+
|
13
15
|
//if the first argument isn't an element and isn't a string, assume that it is the options object
|
14
|
-
|
16
|
+
var is_element = false;
|
17
|
+
try {
|
18
|
+
is_element = targetElement instanceof Element;
|
19
|
+
}
|
20
|
+
catch (err) {
|
21
|
+
is_element = !!targetElement && is_element.nodeType === 1;
|
22
|
+
}
|
23
|
+
if (!(is_element || typeof(targetElement) === 'string')) options = targetElement;
|
15
24
|
|
16
25
|
var self = this,
|
17
26
|
classes = self.classes,
|
@@ -35,7 +44,7 @@ var Kalendae = function (targetElement, options) {
|
|
35
44
|
//generate the column headers (Su, Mo, Tu, etc)
|
36
45
|
i = 7;
|
37
46
|
while (i--) {
|
38
|
-
columnHeaders.push( startDay.format(
|
47
|
+
columnHeaders.push( startDay.format(opts.columnHeaderFormat) );
|
39
48
|
startDay.add('days',1);
|
40
49
|
}
|
41
50
|
|
@@ -62,11 +71,11 @@ var Kalendae = function (targetElement, options) {
|
|
62
71
|
self.viewStartDate = vsd.date(1);
|
63
72
|
|
64
73
|
var viewDelta = ({
|
65
|
-
'past'
|
66
|
-
'today-past'
|
67
|
-
'any'
|
68
|
-
'today-future'
|
69
|
-
'future'
|
74
|
+
'past' : opts.months-1,
|
75
|
+
'today-past' : opts.months-1,
|
76
|
+
'any' : opts.months>2?Math.floor(opts.months/2):0,
|
77
|
+
'today-future' : 0,
|
78
|
+
'future' : 0
|
70
79
|
})[this.settings.direction];
|
71
80
|
|
72
81
|
|
@@ -78,16 +87,16 @@ var Kalendae = function (targetElement, options) {
|
|
78
87
|
if (typeof opts.blackout === 'function') {
|
79
88
|
self.blackout = opts.blackout;
|
80
89
|
} else if (!!opts.blackout) {
|
81
|
-
var bdates = parseDates(opts.blackout, opts.parseSplitDelimiter);
|
90
|
+
var bdates = parseDates(opts.blackout, opts.parseSplitDelimiter, opts.format);
|
82
91
|
self.blackout = function (input) {
|
83
92
|
input = moment(input).yearDay();
|
84
|
-
if (input < 1 || !self._sel
|
93
|
+
if (input < 1 || !self._sel) return false;
|
85
94
|
var i = bdates.length;
|
86
95
|
while (i--) if (bdates[i].yearDay() === input) return true;
|
87
96
|
return false;
|
88
|
-
}
|
97
|
+
};
|
89
98
|
} else {
|
90
|
-
self.blackout = function () {return false;}
|
99
|
+
self.blackout = function () {return false;};
|
91
100
|
}
|
92
101
|
|
93
102
|
|
@@ -108,11 +117,14 @@ var Kalendae = function (targetElement, options) {
|
|
108
117
|
|
109
118
|
//title bar
|
110
119
|
$title = util.make('div', {'class':classes.title}, $cal);
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
util.make('a', {'class':classes.
|
115
|
-
|
120
|
+
if(!opts.useYearNav){
|
121
|
+
util.addClassName($title, classes.disableYearNav);
|
122
|
+
}
|
123
|
+
util.make('a', {'class':classes.previousYear}, $title); //previous button
|
124
|
+
util.make('a', {'class':classes.previousMonth}, $title); //previous button
|
125
|
+
util.make('a', {'class':classes.nextYear}, $title); //next button
|
126
|
+
util.make('a', {'class':classes.nextMonth}, $title); //next button
|
127
|
+
$caption = util.make('span', {'class':classes.caption}, $title); //title caption
|
116
128
|
|
117
129
|
//column headers
|
118
130
|
$header = util.make('div', {'class':classes.header}, $cal);
|
@@ -120,7 +132,7 @@ var Kalendae = function (targetElement, options) {
|
|
120
132
|
do {
|
121
133
|
$span = util.make('span', {}, $header);
|
122
134
|
$span.innerHTML = columnHeaders[i];
|
123
|
-
} while (++i < 7)
|
135
|
+
} while (++i < 7);
|
124
136
|
|
125
137
|
//individual day cells
|
126
138
|
$days = util.make('div', {'class':classes.days}, $cal);
|
@@ -212,52 +224,56 @@ var Kalendae = function (targetElement, options) {
|
|
212
224
|
|
213
225
|
Kalendae.prototype = {
|
214
226
|
defaults : {
|
215
|
-
attachTo:
|
216
|
-
months:
|
217
|
-
weekStart:
|
218
|
-
direction:
|
219
|
-
directionScrolling:
|
220
|
-
viewStartDate:
|
221
|
-
blackout:
|
222
|
-
selected:
|
223
|
-
mode:
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
227
|
+
attachTo :null, /* the element to attach the root container to. can be string or DOMElement */
|
228
|
+
months :1, /* total number of months to display side by side */
|
229
|
+
weekStart :0, /* day to use for the start of the week. 0 is Sunday */
|
230
|
+
direction :'any', /* past, today-past, any, today-future, future */
|
231
|
+
directionScrolling :true, /* if a direction other than any is defined, prevent scrolling out of range */
|
232
|
+
viewStartDate :null, /* date in the month to display. When multiple months, this is the left most */
|
233
|
+
blackout :null, /* array of dates, or function to be passed a date */
|
234
|
+
selected :null, /* dates already selected. can be string, date, or array of strings or dates. */
|
235
|
+
mode :'single', /* single, multiple, range */
|
236
|
+
dayOutOfMonthClickable:false,
|
237
|
+
format :null, /* string used for parsing dates. */
|
238
|
+
subscribe :null, /* object containing events to subscribe to */
|
239
|
+
|
240
|
+
columnHeaderFormat :'dd', /* number of characters to show in the column headers */
|
241
|
+
titleFormat :'MMMM, YYYY', /* format mask for month titles. See momentjs.com for rules */
|
242
|
+
dayNumberFormat :'D', /* format mask for individual days */
|
243
|
+
dayAttributeFormat :'YYYY-MM-DD', /* format mask for the data-date attribute set on every span */
|
244
|
+
parseSplitDelimiter : /,\s*|\s+-\s+/, /* regex to use for splitting multiple dates from a passed string */
|
245
|
+
rangeDelimiter :' - ', /* string to use between dates when outputting in range mode */
|
246
|
+
multipleDelimiter :', ', /* string to use between dates when outputting in multiple mode */
|
247
|
+
useYearNav :true,
|
248
|
+
|
249
|
+
dateClassMap :{}
|
236
250
|
},
|
237
251
|
classes : {
|
238
|
-
container
|
239
|
-
calendar
|
240
|
-
monthFirst
|
241
|
-
monthMiddle
|
242
|
-
monthLast
|
243
|
-
title
|
244
|
-
previousMonth
|
245
|
-
nextMonth
|
246
|
-
previousYear
|
247
|
-
nextYear
|
248
|
-
caption
|
249
|
-
header
|
250
|
-
days
|
251
|
-
dayOutOfMonth
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
252
|
+
container :'kalendae',
|
253
|
+
calendar :'k-calendar',
|
254
|
+
monthFirst :'k-first-month',
|
255
|
+
monthMiddle :'k-middle-month',
|
256
|
+
monthLast :'k-last-month',
|
257
|
+
title :'k-title',
|
258
|
+
previousMonth :'k-btn-previous-month',
|
259
|
+
nextMonth :'k-btn-next-month',
|
260
|
+
previousYear :'k-btn-previous-year',
|
261
|
+
nextYear :'k-btn-next-year',
|
262
|
+
caption :'k-caption',
|
263
|
+
header :'k-header',
|
264
|
+
days :'k-days',
|
265
|
+
dayOutOfMonth :'k-out-of-month',
|
266
|
+
dayInMonth :'k-in-month',
|
267
|
+
dayActive :'k-active',
|
268
|
+
daySelected :'k-selected',
|
269
|
+
dayInRange :'k-range',
|
270
|
+
dayToday :'k-today',
|
271
|
+
monthSeparator :'k-separator',
|
272
|
+
disablePreviousMonth :'k-disable-previous-month-btn',
|
273
|
+
disableNextMonth :'k-disable-next-month-btn',
|
274
|
+
disablePreviousYear :'k-disable-previous-year-btn',
|
275
|
+
disableNextYear :'k-disable-next-year-btn',
|
276
|
+
disableYearNav :'k-disable-year-nav'
|
261
277
|
},
|
262
278
|
|
263
279
|
disablePreviousMonth: false,
|
@@ -266,11 +282,11 @@ Kalendae.prototype = {
|
|
266
282
|
disableNextYear: false,
|
267
283
|
|
268
284
|
directions: {
|
269
|
-
'past'
|
270
|
-
'today-past'
|
271
|
-
'any'
|
272
|
-
'today-future'
|
273
|
-
'future'
|
285
|
+
'past' :function (date) {return moment(date).yearDay() >= today.yearDay();},
|
286
|
+
'today-past' :function (date) {return moment(date).yearDay() > today.yearDay();},
|
287
|
+
'any' :function (date) {return false;},
|
288
|
+
'today-future' :function (date) {return moment(date).yearDay() < today.yearDay();},
|
289
|
+
'future' :function (date) {return moment(date).yearDay() <= today.yearDay();}
|
274
290
|
},
|
275
291
|
|
276
292
|
getSelectedAsDates : function () {
|
@@ -286,7 +302,7 @@ Kalendae.prototype = {
|
|
286
302
|
var out = [];
|
287
303
|
var i=0, c = this._sel.length;
|
288
304
|
for (;i<c;i++) {
|
289
|
-
out.push(this._sel[i].format(format || this.settings.format || 'YYYY-MM-DD'))
|
305
|
+
out.push(this._sel[i].format(format || this.settings.format || 'YYYY-MM-DD'));
|
290
306
|
}
|
291
307
|
return out;
|
292
308
|
},
|
@@ -295,7 +311,7 @@ Kalendae.prototype = {
|
|
295
311
|
var out = [];
|
296
312
|
var i=0, c = this._sel.length;
|
297
313
|
for (;i<c;i++) {
|
298
|
-
out.push(moment(this._sel[i]))
|
314
|
+
out.push(moment(this._sel[i]));
|
299
315
|
}
|
300
316
|
return out;
|
301
317
|
},
|
@@ -352,14 +368,24 @@ Kalendae.prototype = {
|
|
352
368
|
},
|
353
369
|
|
354
370
|
setSelected : function (input, draw) {
|
355
|
-
|
356
|
-
|
371
|
+
var i,
|
372
|
+
new_dates = parseDates(input, this.settings.parseSplitDelimiter, this.settings.format),
|
373
|
+
old_dates = parseDates(this.getSelected(), this.settings.parseSplitDelimiter, this.settings.format);
|
374
|
+
|
375
|
+
i = old_dates.length;
|
376
|
+
while(i--) { this.removeSelected(old_dates[i], draw); }
|
377
|
+
|
378
|
+
i = new_dates.length;
|
379
|
+
while(i--) { this.addSelected(new_dates[i], draw); }
|
357
380
|
|
358
381
|
if (draw !== false) this.draw();
|
359
382
|
},
|
360
383
|
|
361
384
|
addSelected : function (date, draw) {
|
362
|
-
date = moment(date).hours(12);
|
385
|
+
date = moment(date, this.settings.format).hours(12);
|
386
|
+
|
387
|
+
if(this.settings.dayOutOfMonthClickable && this.settings.mode !== 'range'){ this.makeSelectedDateVisible(date); }
|
388
|
+
|
363
389
|
switch (this.settings.mode) {
|
364
390
|
case 'multiple':
|
365
391
|
if (!this.isSelected(date)) this._sel.push(date);
|
@@ -380,18 +406,29 @@ Kalendae.prototype = {
|
|
380
406
|
break;
|
381
407
|
}
|
382
408
|
this._sel.sort(function (a,b) {return a.yearDay() - b.yearDay();});
|
383
|
-
this.publish('change', this);
|
409
|
+
this.publish('change', this, [date]);
|
384
410
|
if (draw !== false) this.draw();
|
385
411
|
return true;
|
386
412
|
},
|
387
413
|
|
414
|
+
makeSelectedDateVisible: function (date) {
|
415
|
+
outOfViewMonth = moment(date).date('1').diff(this.viewStartDate,'months');
|
416
|
+
|
417
|
+
if(outOfViewMonth < 0){
|
418
|
+
this.viewStartDate.subtract('months',1);
|
419
|
+
}
|
420
|
+
else if(outOfViewMonth > 0 && outOfViewMonth >= this.settings.months){
|
421
|
+
this.viewStartDate.add('months',1);
|
422
|
+
}
|
423
|
+
},
|
424
|
+
|
388
425
|
removeSelected : function (date, draw) {
|
389
|
-
date = moment(date).
|
426
|
+
date = moment(date, this.settings.format).hours(12);
|
390
427
|
var i = this._sel.length;
|
391
428
|
while (i--) {
|
392
|
-
if (this._sel[i].yearDay() === date) {
|
429
|
+
if (this._sel[i].yearDay() === date.yearDay()) {
|
393
430
|
this._sel.splice(i,1);
|
394
|
-
this.publish('change', this);
|
431
|
+
this.publish('change', this, [date]);
|
395
432
|
if (draw !== false) this.draw();
|
396
433
|
return true;
|
397
434
|
}
|
@@ -411,7 +448,8 @@ Kalendae.prototype = {
|
|
411
448
|
j=0, k,
|
412
449
|
s,
|
413
450
|
dateString,
|
414
|
-
opts = this.settings
|
451
|
+
opts = this.settings,
|
452
|
+
diff;
|
415
453
|
|
416
454
|
c = this.calendars.length;
|
417
455
|
|
@@ -433,7 +471,9 @@ Kalendae.prototype = {
|
|
433
471
|
if (s) klass.push(({'-1':classes.dayInRange,'1':classes.daySelected, 'true':classes.daySelected})[s]);
|
434
472
|
|
435
473
|
if (day.month() != month.month()) klass.push(classes.dayOutOfMonth);
|
436
|
-
else
|
474
|
+
else klass.push(classes.dayInMonth);
|
475
|
+
|
476
|
+
if (!(this.blackout(day) || this.direction(day) || (day.month() != month.month() && opts.dayOutOfMonthClickable === false)) || s>0) klass.push(classes.dayActive);
|
437
477
|
|
438
478
|
if (day.yearDay() === today.yearDay()) klass.push(classes.dayToday);
|
439
479
|
|
@@ -451,9 +491,8 @@ Kalendae.prototype = {
|
|
451
491
|
} while (++i < c);
|
452
492
|
|
453
493
|
if (opts.directionScrolling) {
|
454
|
-
var diff = -(moment().diff(month, 'months'));
|
455
494
|
if (opts.direction==='today-past' || opts.direction==='past') {
|
456
|
-
|
495
|
+
diff = month.add({m:1}).diff(moment(), 'months', true);
|
457
496
|
if (diff <= 0) {
|
458
497
|
this.disableNextMonth = false;
|
459
498
|
util.removeClassName(this.container, classes.disableNextMonth);
|
@@ -463,7 +502,7 @@ Kalendae.prototype = {
|
|
463
502
|
}
|
464
503
|
|
465
504
|
} else if (opts.direction==='today-future' || opts.direction==='future') {
|
466
|
-
|
505
|
+
diff = month.subtract({m:1}).diff(moment(), 'months', true);
|
467
506
|
if (diff > opts.months) {
|
468
507
|
this.disablePreviousMonth = false;
|
469
508
|
util.removeClassName(this.container, classes.disablePreviousMonth);
|
@@ -476,7 +515,8 @@ Kalendae.prototype = {
|
|
476
515
|
|
477
516
|
|
478
517
|
if (opts.direction==='today-past' || opts.direction==='past') {
|
479
|
-
|
518
|
+
diff = month.add({m:12}).diff(moment(), 'months', true);
|
519
|
+
if (diff <= -11) {
|
480
520
|
this.disableNextYear = false;
|
481
521
|
util.removeClassName(this.container, classes.disableNextYear);
|
482
522
|
} else {
|
@@ -485,7 +525,8 @@ Kalendae.prototype = {
|
|
485
525
|
}
|
486
526
|
|
487
527
|
} else if (opts.direction==='today-future' || opts.direction==='future') {
|
488
|
-
|
528
|
+
diff = month.subtract({m:12}).diff(moment(), 'months', true);
|
529
|
+
if (diff > (11 + opts.months)) {
|
489
530
|
this.disablePreviousYear = false;
|
490
531
|
util.removeClassName(this.container, classes.disablePreviousYear);
|
491
532
|
} else {
|
@@ -497,7 +538,7 @@ Kalendae.prototype = {
|
|
497
538
|
|
498
539
|
}
|
499
540
|
}
|
500
|
-
}
|
541
|
+
};
|
501
542
|
|
502
543
|
var parseDates = function (input, delimiter, format) {
|
503
544
|
var output = [];
|
@@ -508,14 +549,15 @@ var parseDates = function (input, delimiter, format) {
|
|
508
549
|
input = [input];
|
509
550
|
}
|
510
551
|
|
511
|
-
var c = input.length
|
512
|
-
|
552
|
+
var c = input.length,
|
553
|
+
i = 0;
|
554
|
+
|
513
555
|
do {
|
514
556
|
if (input[i]) output.push( moment(input[i], format).hours(12) );
|
515
557
|
} while (++i < c);
|
516
558
|
|
517
559
|
return output;
|
518
|
-
}
|
560
|
+
};
|
519
561
|
|
520
562
|
|
521
563
|
|
@@ -524,7 +566,7 @@ window.Kalendae = Kalendae;
|
|
524
566
|
var util = Kalendae.util = {
|
525
567
|
|
526
568
|
isIE8: function() {
|
527
|
-
|
569
|
+
return !!( (/msie 8./i).test(navigator.appVersion) && !(/opera/i).test(navigator.userAgent) && window.ActiveXObject && XDomainRequest && !window.msPerformance );
|
528
570
|
},
|
529
571
|
|
530
572
|
// ELEMENT FUNCTIONS
|
@@ -620,6 +662,14 @@ var util = Kalendae.util = {
|
|
620
662
|
return false;
|
621
663
|
},
|
622
664
|
|
665
|
+
scrollContainer: function (elem) {
|
666
|
+
do {
|
667
|
+
var overflow = util.getStyle(elem, 'overflow');
|
668
|
+
if (overflow === 'auto' || overflow === 'scroll') return elem;
|
669
|
+
} while ((elem = elem.parentNode) && elem != window.document.body);
|
670
|
+
return null;
|
671
|
+
},
|
672
|
+
|
623
673
|
getPosition: function (elem, isInner) {
|
624
674
|
var x = elem.offsetLeft,
|
625
675
|
y = elem.offsetTop,
|
@@ -673,7 +723,7 @@ var util = Kalendae.util = {
|
|
673
723
|
else a[k] = b[k];
|
674
724
|
}
|
675
725
|
return a;
|
676
|
-
}
|
726
|
+
};
|
677
727
|
|
678
728
|
for (; i < arguments.length; i++) {
|
679
729
|
_c(d, arguments[i]);
|
@@ -682,45 +732,45 @@ var util = Kalendae.util = {
|
|
682
732
|
},
|
683
733
|
|
684
734
|
isArray: function (array) {
|
685
|
-
return
|
686
|
-
!array ||
|
687
|
-
(!array.length || array.length === 0) ||
|
688
|
-
typeof array !== 'object' ||
|
689
|
-
!array.constructor ||
|
690
|
-
array.nodeType ||
|
691
|
-
array.item
|
692
|
-
);
|
735
|
+
return Object.prototype.toString.call(array) == "[object Array]"
|
693
736
|
}
|
694
737
|
};
|
695
738
|
|
696
739
|
|
697
740
|
//auto-initializaiton code
|
698
|
-
Kalendae.util.domReady(function () {
|
741
|
+
if (typeof document.addEventListener === 'function') Kalendae.util.domReady(function () {
|
699
742
|
var els = util.$$('.auto-kal'),
|
700
743
|
i = els.length,
|
701
|
-
e
|
744
|
+
e,
|
745
|
+
options,
|
746
|
+
optionsRaw;
|
702
747
|
|
703
748
|
while (i--) {
|
704
749
|
e = els[i];
|
750
|
+
optionsRaw = e.getAttribute('data-kal');
|
751
|
+
options = (optionsRaw == null || optionsRaw == "") ? {} : (new Function('return {' + optionsRaw + '};'))();
|
752
|
+
|
705
753
|
if (e.tagName === 'INPUT') {
|
706
754
|
//if element is an input, bind a popup calendar to the input.
|
707
|
-
new Kalendae.Input(e);
|
755
|
+
new Kalendae.Input(e, options);
|
708
756
|
} else {
|
709
757
|
//otherwise, insert a flat calendar into the element.
|
710
|
-
new Kalendae({attachTo:e});
|
758
|
+
new Kalendae(util.merge(options, {attachTo:e}));
|
711
759
|
}
|
712
760
|
|
713
761
|
}
|
714
762
|
});
|
715
|
-
|
716
763
|
Kalendae.Input = function (targetElement, options) {
|
764
|
+
if (typeof document.addEventListener !== 'function' && !util.isIE8()) return;
|
765
|
+
|
717
766
|
var $input = this.input = util.$(targetElement),
|
718
|
-
overwriteInput
|
767
|
+
overwriteInput,
|
768
|
+
$closeButton;
|
719
769
|
|
720
770
|
if (!$input || $input.tagName !== 'INPUT') throw "First argument for Kalendae.Input must be an <input> element or a valid element id.";
|
721
771
|
|
722
772
|
var self = this,
|
723
|
-
classes = self.classes
|
773
|
+
classes = self.classes,
|
724
774
|
opts = self.settings = util.merge(self.defaults, options);
|
725
775
|
|
726
776
|
//force attachment to the body
|
@@ -735,7 +785,7 @@ Kalendae.Input = function (targetElement, options) {
|
|
735
785
|
|
736
786
|
//create the close button
|
737
787
|
if (opts.closeButton) {
|
738
|
-
|
788
|
+
$closeButton = util.make('a', {'class':classes.closeButton}, self.container);
|
739
789
|
util.addEvent($closeButton, 'click', function () {
|
740
790
|
$input.blur();
|
741
791
|
});
|
@@ -762,7 +812,7 @@ Kalendae.Input = function (targetElement, options) {
|
|
762
812
|
});
|
763
813
|
|
764
814
|
util.addEvent($input, 'blur', function () {
|
765
|
-
if (noclose) {
|
815
|
+
if (noclose && util.isIE8()) {
|
766
816
|
noclose = false;
|
767
817
|
$input.focus();
|
768
818
|
}
|
@@ -772,6 +822,16 @@ Kalendae.Input = function (targetElement, options) {
|
|
772
822
|
self.setSelected(this.value);
|
773
823
|
});
|
774
824
|
|
825
|
+
var $scrollContainer = util.scrollContainer($input);
|
826
|
+
|
827
|
+
if( $scrollContainer ) {
|
828
|
+
|
829
|
+
// Hide calendar when $scrollContainer is scrolled
|
830
|
+
util.addEvent($scrollContainer, 'scroll', function (event) {
|
831
|
+
$input.blur();
|
832
|
+
});
|
833
|
+
}
|
834
|
+
|
775
835
|
self.subscribe('change', function () {
|
776
836
|
$input.value = self.getSelected();
|
777
837
|
});
|
@@ -795,36 +855,41 @@ Kalendae.Input.prototype = util.merge(Kalendae.prototype, {
|
|
795
855
|
var $container = this.container,
|
796
856
|
style = $container.style,
|
797
857
|
$input = this.input,
|
798
|
-
pos = util.getPosition($input)
|
858
|
+
pos = util.getPosition($input),
|
859
|
+
$scrollContainer = util.scrollContainer($input),
|
860
|
+
scrollTop = $scrollContainer ? $scrollContainer.scrollTop : 0,
|
861
|
+
opts = this.settings;
|
799
862
|
|
800
863
|
style.display = '';
|
801
864
|
switch (opts.side) {
|
802
865
|
case 'left':
|
803
|
-
style.left = (pos.left - util.getWidth($container) +
|
804
|
-
style.top = (pos.top +
|
866
|
+
style.left = (pos.left - util.getWidth($container) + opts.offsetLeft) + 'px';
|
867
|
+
style.top = (pos.top + opts.offsetTop - scrollTop) + 'px';
|
805
868
|
break;
|
806
869
|
case 'right':
|
807
870
|
style.left = (pos.left + util.getWidth($input)) + 'px';
|
808
|
-
style.top = (pos.top +
|
871
|
+
style.top = (pos.top + opts.offsetTop - scrollTop) + 'px';
|
809
872
|
break;
|
810
873
|
case 'top':
|
811
|
-
style.left = (pos.left +
|
812
|
-
style.top = (pos.top - util.getHeight($container) +
|
874
|
+
style.left = (pos.left + opts.offsetLeft) + 'px';
|
875
|
+
style.top = (pos.top - util.getHeight($container) + opts.offsetTop - scrollTop) + 'px';
|
813
876
|
break;
|
814
877
|
case 'bottom':
|
815
878
|
/* falls through */
|
816
879
|
default:
|
817
|
-
style.left = (pos.left +
|
818
|
-
style.top = (pos.top + util.getHeight($input) +
|
880
|
+
style.left = (pos.left + opts.offsetLeft) + 'px';
|
881
|
+
style.top = (pos.top + util.getHeight($input) + opts.offsetTop - scrollTop) + 'px';
|
819
882
|
break;
|
820
883
|
}
|
821
884
|
|
822
885
|
style.position = util.isFixed($input) ? 'fixed' : 'absolute';
|
823
886
|
|
887
|
+
this.publish('show', this);
|
824
888
|
},
|
825
889
|
|
826
890
|
hide : function () {
|
827
891
|
this.container.style.display = 'none';
|
892
|
+
this.publish('hide', this);
|
828
893
|
}
|
829
894
|
|
830
895
|
});
|
@@ -916,736 +981,22 @@ var MinPubSub = function(d){
|
|
916
981
|
}
|
917
982
|
};
|
918
983
|
|
919
|
-
}
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
round = Math.round,
|
930
|
-
languages = {},
|
931
|
-
hasModule = (typeof module !== 'undefined'),
|
932
|
-
paramsToParse = 'months|monthsShort|monthsParse|weekdays|weekdaysShort|longDateFormat|calendar|relativeTime|ordinal|meridiem'.split('|'),
|
933
|
-
i,
|
934
|
-
jsonRegex = /^\/?Date\((\-?\d+)/i,
|
935
|
-
charactersToReplace = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|dddd?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|zz?|ZZ?|LT|LL?L?L?)/g,
|
936
|
-
nonuppercaseLetters = /[^A-Z]/g,
|
937
|
-
timezoneRegex = /\([A-Za-z ]+\)|:[0-9]{2} [A-Z]{3} /g,
|
938
|
-
tokenCharacters = /(\\)?(MM?M?M?|dd?d?d|DD?D?D?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|ZZ?|T)/g,
|
939
|
-
inputCharacters = /(\\)?([0-9]+|([a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+|([\+\-]\d\d:?\d\d))/gi,
|
940
|
-
isoRegex = /\d{4}.\d\d.\d\d(T(\d\d(.\d\d(.\d\d)?)?)?([\+\-]\d\d:?\d\d)?)?/,
|
941
|
-
isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
|
942
|
-
isoTimes = [
|
943
|
-
['HH:mm:ss', /T\d\d:\d\d:\d\d/],
|
944
|
-
['HH:mm', /T\d\d:\d\d/],
|
945
|
-
['HH', /T\d\d/]
|
946
|
-
],
|
947
|
-
timezoneParseRegex = /([\+\-]|\d\d)/gi,
|
948
|
-
VERSION = "1.5.0",
|
949
|
-
shortcuts = 'Month|Date|Hours|Minutes|Seconds|Milliseconds'.split('|');
|
950
|
-
|
951
|
-
// Moment prototype object
|
952
|
-
function Moment(date, isUTC) {
|
953
|
-
this._d = date;
|
954
|
-
this._isUTC = !!isUTC;
|
955
|
-
}
|
956
|
-
|
957
|
-
// left zero fill a number
|
958
|
-
// see http://jsperf.com/left-zero-filling for performance comparison
|
959
|
-
function leftZeroFill(number, targetLength) {
|
960
|
-
var output = number + '';
|
961
|
-
while (output.length < targetLength) {
|
962
|
-
output = '0' + output;
|
963
|
-
}
|
964
|
-
return output;
|
965
|
-
}
|
966
|
-
|
967
|
-
// helper function for _.addTime and _.subtractTime
|
968
|
-
function dateAddRemove(date, _input, adding, val) {
|
969
|
-
var isString = (typeof _input === 'string'),
|
970
|
-
input = isString ? {} : _input,
|
971
|
-
ms, d, M, currentDate;
|
972
|
-
if (isString && val) {
|
973
|
-
input[_input] = +val;
|
974
|
-
}
|
975
|
-
ms = (input.ms || input.milliseconds || 0) +
|
976
|
-
(input.s || input.seconds || 0) * 1e3 + // 1000
|
977
|
-
(input.m || input.minutes || 0) * 6e4 + // 1000 * 60
|
978
|
-
(input.h || input.hours || 0) * 36e5; // 1000 * 60 * 60
|
979
|
-
d = (input.d || input.days || 0) +
|
980
|
-
(input.w || input.weeks || 0) * 7;
|
981
|
-
M = (input.M || input.months || 0) +
|
982
|
-
(input.y || input.years || 0) * 12;
|
983
|
-
if (ms) {
|
984
|
-
date.setTime(+date + ms * adding);
|
985
|
-
}
|
986
|
-
if (d) {
|
987
|
-
date.setDate(date.getDate() + d * adding);
|
988
|
-
}
|
989
|
-
if (M) {
|
990
|
-
currentDate = date.getDate();
|
991
|
-
date.setDate(1);
|
992
|
-
date.setMonth(date.getMonth() + M * adding);
|
993
|
-
date.setDate(Math.min(new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate(), currentDate));
|
994
|
-
}
|
995
|
-
return date;
|
996
|
-
}
|
997
|
-
|
998
|
-
// check if is an array
|
999
|
-
function isArray(input) {
|
1000
|
-
return Object.prototype.toString.call(input) === '[object Array]';
|
1001
|
-
}
|
1002
|
-
|
1003
|
-
// convert an array to a date.
|
1004
|
-
// the array should mirror the parameters below
|
1005
|
-
// note: all values past the year are optional and will default to the lowest possible value.
|
1006
|
-
// [year, month, day , hour, minute, second, millisecond]
|
1007
|
-
function dateFromArray(input) {
|
1008
|
-
return new Date(input[0], input[1] || 0, input[2] || 1, input[3] || 0, input[4] || 0, input[5] || 0, input[6] || 0);
|
1009
|
-
}
|
1010
|
-
|
1011
|
-
// format date using native date object
|
1012
|
-
function formatMoment(m, inputString) {
|
1013
|
-
var currentMonth = m.month(),
|
1014
|
-
currentDate = m.date(),
|
1015
|
-
currentYear = m.year(),
|
1016
|
-
currentDay = m.day(),
|
1017
|
-
currentHours = m.hours(),
|
1018
|
-
currentMinutes = m.minutes(),
|
1019
|
-
currentSeconds = m.seconds(),
|
1020
|
-
currentZone = -m.zone(),
|
1021
|
-
ordinal = moment.ordinal,
|
1022
|
-
meridiem = moment.meridiem;
|
1023
|
-
// check if the character is a format
|
1024
|
-
// return formatted string or non string.
|
1025
|
-
//
|
1026
|
-
// uses switch/case instead of an object of named functions (like http://phpjs.org/functions/date:380)
|
1027
|
-
// for minification and performance
|
1028
|
-
// see http://jsperf.com/object-of-functions-vs-switch for performance comparison
|
1029
|
-
function replaceFunction(input) {
|
1030
|
-
// create a couple variables to be used later inside one of the cases.
|
1031
|
-
var a, b;
|
1032
|
-
switch (input) {
|
1033
|
-
// MONTH
|
1034
|
-
case 'M' :
|
1035
|
-
return currentMonth + 1;
|
1036
|
-
case 'Mo' :
|
1037
|
-
return (currentMonth + 1) + ordinal(currentMonth + 1);
|
1038
|
-
case 'MM' :
|
1039
|
-
return leftZeroFill(currentMonth + 1, 2);
|
1040
|
-
case 'MMM' :
|
1041
|
-
return moment.monthsShort[currentMonth];
|
1042
|
-
case 'MMMM' :
|
1043
|
-
return moment.months[currentMonth];
|
1044
|
-
// DAY OF MONTH
|
1045
|
-
case 'D' :
|
1046
|
-
return currentDate;
|
1047
|
-
case 'Do' :
|
1048
|
-
return currentDate + ordinal(currentDate);
|
1049
|
-
case 'DD' :
|
1050
|
-
return leftZeroFill(currentDate, 2);
|
1051
|
-
// DAY OF YEAR
|
1052
|
-
case 'DDD' :
|
1053
|
-
a = new Date(currentYear, currentMonth, currentDate);
|
1054
|
-
b = new Date(currentYear, 0, 1);
|
1055
|
-
return ~~ (((a - b) / 864e5) + 1.5);
|
1056
|
-
case 'DDDo' :
|
1057
|
-
a = replaceFunction('DDD');
|
1058
|
-
return a + ordinal(a);
|
1059
|
-
case 'DDDD' :
|
1060
|
-
return leftZeroFill(replaceFunction('DDD'), 3);
|
1061
|
-
// WEEKDAY
|
1062
|
-
case 'd' :
|
1063
|
-
return currentDay;
|
1064
|
-
case 'do' :
|
1065
|
-
return currentDay + ordinal(currentDay);
|
1066
|
-
case 'ddd' :
|
1067
|
-
return moment.weekdaysShort[currentDay];
|
1068
|
-
case 'dddd' :
|
1069
|
-
return moment.weekdays[currentDay];
|
1070
|
-
// WEEK OF YEAR
|
1071
|
-
case 'w' :
|
1072
|
-
a = new Date(currentYear, currentMonth, currentDate - currentDay + 5);
|
1073
|
-
b = new Date(a.getFullYear(), 0, 4);
|
1074
|
-
return ~~ ((a - b) / 864e5 / 7 + 1.5);
|
1075
|
-
case 'wo' :
|
1076
|
-
a = replaceFunction('w');
|
1077
|
-
return a + ordinal(a);
|
1078
|
-
case 'ww' :
|
1079
|
-
return leftZeroFill(replaceFunction('w'), 2);
|
1080
|
-
// YEAR
|
1081
|
-
case 'YY' :
|
1082
|
-
return leftZeroFill(currentYear % 100, 2);
|
1083
|
-
case 'YYYY' :
|
1084
|
-
return currentYear;
|
1085
|
-
// AM / PM
|
1086
|
-
case 'a' :
|
1087
|
-
return currentHours > 11 ? meridiem.pm : meridiem.am;
|
1088
|
-
case 'A' :
|
1089
|
-
return currentHours > 11 ? meridiem.PM : meridiem.AM;
|
1090
|
-
// 24 HOUR
|
1091
|
-
case 'H' :
|
1092
|
-
return currentHours;
|
1093
|
-
case 'HH' :
|
1094
|
-
return leftZeroFill(currentHours, 2);
|
1095
|
-
// 12 HOUR
|
1096
|
-
case 'h' :
|
1097
|
-
return currentHours % 12 || 12;
|
1098
|
-
case 'hh' :
|
1099
|
-
return leftZeroFill(currentHours % 12 || 12, 2);
|
1100
|
-
// MINUTE
|
1101
|
-
case 'm' :
|
1102
|
-
return currentMinutes;
|
1103
|
-
case 'mm' :
|
1104
|
-
return leftZeroFill(currentMinutes, 2);
|
1105
|
-
// SECOND
|
1106
|
-
case 's' :
|
1107
|
-
return currentSeconds;
|
1108
|
-
case 'ss' :
|
1109
|
-
return leftZeroFill(currentSeconds, 2);
|
1110
|
-
// TIMEZONE
|
1111
|
-
case 'zz' :
|
1112
|
-
// depreciating 'zz' fall through to 'z'
|
1113
|
-
case 'z' :
|
1114
|
-
return (m._d.toString().match(timezoneRegex) || [''])[0].replace(nonuppercaseLetters, '');
|
1115
|
-
case 'Z' :
|
1116
|
-
return (currentZone < 0 ? '-' : '+') + leftZeroFill(~~(Math.abs(currentZone) / 60), 2) + ':' + leftZeroFill(~~(Math.abs(currentZone) % 60), 2);
|
1117
|
-
case 'ZZ' :
|
1118
|
-
return (currentZone < 0 ? '-' : '+') + leftZeroFill(~~(10 * Math.abs(currentZone) / 6), 4);
|
1119
|
-
// LONG DATES
|
1120
|
-
case 'L' :
|
1121
|
-
case 'LL' :
|
1122
|
-
case 'LLL' :
|
1123
|
-
case 'LLLL' :
|
1124
|
-
case 'LT' :
|
1125
|
-
return formatMoment(m, moment.longDateFormat[input]);
|
1126
|
-
// DEFAULT
|
1127
|
-
default :
|
1128
|
-
return input.replace(/(^\[)|(\\)|\]$/g, "");
|
1129
|
-
}
|
1130
|
-
}
|
1131
|
-
return inputString.replace(charactersToReplace, replaceFunction);
|
1132
|
-
}
|
1133
|
-
|
1134
|
-
// date from string and format string
|
1135
|
-
function makeDateFromStringAndFormat(string, format) {
|
1136
|
-
var inArray = [0, 0, 1, 0, 0, 0, 0],
|
1137
|
-
timezoneHours = 0,
|
1138
|
-
timezoneMinutes = 0,
|
1139
|
-
isUsingUTC = false,
|
1140
|
-
inputParts = string.match(inputCharacters),
|
1141
|
-
formatParts = format.match(tokenCharacters),
|
1142
|
-
len = Math.min(inputParts.length, formatParts.length),
|
1143
|
-
i,
|
1144
|
-
isPm;
|
1145
|
-
|
1146
|
-
// function to convert string input to date
|
1147
|
-
function addTime(format, input) {
|
1148
|
-
var a;
|
1149
|
-
switch (format) {
|
1150
|
-
// MONTH
|
1151
|
-
case 'M' :
|
1152
|
-
// fall through to MM
|
1153
|
-
case 'MM' :
|
1154
|
-
inArray[1] = ~~input - 1;
|
1155
|
-
break;
|
1156
|
-
case 'MMM' :
|
1157
|
-
// fall through to MMMM
|
1158
|
-
case 'MMMM' :
|
1159
|
-
for (a = 0; a < 12; a++) {
|
1160
|
-
if (moment.monthsParse[a].test(input)) {
|
1161
|
-
inArray[1] = a;
|
1162
|
-
break;
|
1163
|
-
}
|
1164
|
-
}
|
1165
|
-
break;
|
1166
|
-
// DAY OF MONTH
|
1167
|
-
case 'D' :
|
1168
|
-
// fall through to DDDD
|
1169
|
-
case 'DD' :
|
1170
|
-
// fall through to DDDD
|
1171
|
-
case 'DDD' :
|
1172
|
-
// fall through to DDDD
|
1173
|
-
case 'DDDD' :
|
1174
|
-
inArray[2] = ~~input;
|
1175
|
-
break;
|
1176
|
-
// YEAR
|
1177
|
-
case 'YY' :
|
1178
|
-
input = ~~input;
|
1179
|
-
inArray[0] = input + (input > 70 ? 1900 : 2000);
|
1180
|
-
break;
|
1181
|
-
case 'YYYY' :
|
1182
|
-
inArray[0] = ~~Math.abs(input);
|
1183
|
-
break;
|
1184
|
-
// AM / PM
|
1185
|
-
case 'a' :
|
1186
|
-
// fall through to A
|
1187
|
-
case 'A' :
|
1188
|
-
isPm = (input.toLowerCase() === 'pm');
|
1189
|
-
break;
|
1190
|
-
// 24 HOUR
|
1191
|
-
case 'H' :
|
1192
|
-
// fall through to hh
|
1193
|
-
case 'HH' :
|
1194
|
-
// fall through to hh
|
1195
|
-
case 'h' :
|
1196
|
-
// fall through to hh
|
1197
|
-
case 'hh' :
|
1198
|
-
inArray[3] = ~~input;
|
1199
|
-
break;
|
1200
|
-
// MINUTE
|
1201
|
-
case 'm' :
|
1202
|
-
// fall through to mm
|
1203
|
-
case 'mm' :
|
1204
|
-
inArray[4] = ~~input;
|
1205
|
-
break;
|
1206
|
-
// SECOND
|
1207
|
-
case 's' :
|
1208
|
-
// fall through to ss
|
1209
|
-
case 'ss' :
|
1210
|
-
inArray[5] = ~~input;
|
1211
|
-
break;
|
1212
|
-
// TIMEZONE
|
1213
|
-
case 'Z' :
|
1214
|
-
// fall through to ZZ
|
1215
|
-
case 'ZZ' :
|
1216
|
-
isUsingUTC = true;
|
1217
|
-
a = (input || '').match(timezoneParseRegex);
|
1218
|
-
if (a && a[1]) {
|
1219
|
-
timezoneHours = ~~a[1];
|
1220
|
-
}
|
1221
|
-
if (a && a[2]) {
|
1222
|
-
timezoneMinutes = ~~a[2];
|
1223
|
-
}
|
1224
|
-
// reverse offsets
|
1225
|
-
if (a && a[0] === '+') {
|
1226
|
-
timezoneHours = -timezoneHours;
|
1227
|
-
timezoneMinutes = -timezoneMinutes;
|
1228
|
-
}
|
1229
|
-
break;
|
1230
|
-
}
|
1231
|
-
}
|
1232
|
-
for (i = 0; i < len; i++) {
|
1233
|
-
addTime(formatParts[i], inputParts[i]);
|
1234
|
-
}
|
1235
|
-
// handle am pm
|
1236
|
-
if (isPm && inArray[3] < 12) {
|
1237
|
-
inArray[3] += 12;
|
1238
|
-
}
|
1239
|
-
// if is 12 am, change hours to 0
|
1240
|
-
if (isPm === false && inArray[3] === 12) {
|
1241
|
-
inArray[3] = 0;
|
1242
|
-
}
|
1243
|
-
// handle timezone
|
1244
|
-
inArray[3] += timezoneHours;
|
1245
|
-
inArray[4] += timezoneMinutes;
|
1246
|
-
// return
|
1247
|
-
return isUsingUTC ? new Date(Date.UTC.apply({}, inArray)) : dateFromArray(inArray);
|
1248
|
-
}
|
1249
|
-
|
1250
|
-
// compare two arrays, return the number of differences
|
1251
|
-
function compareArrays(array1, array2) {
|
1252
|
-
var len = Math.min(array1.length, array2.length),
|
1253
|
-
lengthDiff = Math.abs(array1.length - array2.length),
|
1254
|
-
diffs = 0,
|
1255
|
-
i;
|
1256
|
-
for (i = 0; i < len; i++) {
|
1257
|
-
if (~~array1[i] !== ~~array2[i]) {
|
1258
|
-
diffs++;
|
1259
|
-
}
|
1260
|
-
}
|
1261
|
-
return diffs + lengthDiff;
|
1262
|
-
}
|
1263
|
-
|
1264
|
-
// date from string and array of format strings
|
1265
|
-
function makeDateFromStringAndArray(string, formats) {
|
1266
|
-
var output,
|
1267
|
-
inputParts = string.match(inputCharacters),
|
1268
|
-
scores = [],
|
1269
|
-
scoreToBeat = 99,
|
1270
|
-
i,
|
1271
|
-
curDate,
|
1272
|
-
curScore;
|
1273
|
-
for (i = 0; i < formats.length; i++) {
|
1274
|
-
curDate = makeDateFromStringAndFormat(string, formats[i]);
|
1275
|
-
curScore = compareArrays(inputParts, formatMoment(new Moment(curDate), formats[i]).match(inputCharacters));
|
1276
|
-
if (curScore < scoreToBeat) {
|
1277
|
-
scoreToBeat = curScore;
|
1278
|
-
output = curDate;
|
1279
|
-
}
|
1280
|
-
}
|
1281
|
-
return output;
|
1282
|
-
}
|
1283
|
-
|
1284
|
-
// date from iso format
|
1285
|
-
function makeDateFromString(string) {
|
1286
|
-
var format = 'YYYY-MM-DDT',
|
1287
|
-
i;
|
1288
|
-
if (isoRegex.exec(string)) {
|
1289
|
-
for (i = 0; i < 3; i++) {
|
1290
|
-
if (isoTimes[i][1].exec(string)) {
|
1291
|
-
format += isoTimes[i][0];
|
1292
|
-
break;
|
1293
|
-
}
|
1294
|
-
}
|
1295
|
-
return makeDateFromStringAndFormat(string, format + 'Z');
|
1296
|
-
}
|
1297
|
-
return new Date(string);
|
1298
|
-
}
|
1299
|
-
|
1300
|
-
// helper function for _date.from() and _date.fromNow()
|
1301
|
-
function substituteTimeAgo(string, number, withoutSuffix) {
|
1302
|
-
var rt = moment.relativeTime[string];
|
1303
|
-
return (typeof rt === 'function') ?
|
1304
|
-
rt(number || 1, !!withoutSuffix, string) :
|
1305
|
-
rt.replace(/%d/i, number || 1);
|
1306
|
-
}
|
1307
|
-
|
1308
|
-
function relativeTime(milliseconds, withoutSuffix) {
|
1309
|
-
var seconds = round(Math.abs(milliseconds) / 1000),
|
1310
|
-
minutes = round(seconds / 60),
|
1311
|
-
hours = round(minutes / 60),
|
1312
|
-
days = round(hours / 24),
|
1313
|
-
years = round(days / 365),
|
1314
|
-
args = seconds < 45 && ['s', seconds] ||
|
1315
|
-
minutes === 1 && ['m'] ||
|
1316
|
-
minutes < 45 && ['mm', minutes] ||
|
1317
|
-
hours === 1 && ['h'] ||
|
1318
|
-
hours < 22 && ['hh', hours] ||
|
1319
|
-
days === 1 && ['d'] ||
|
1320
|
-
days <= 25 && ['dd', days] ||
|
1321
|
-
days <= 45 && ['M'] ||
|
1322
|
-
days < 345 && ['MM', round(days / 30)] ||
|
1323
|
-
years === 1 && ['y'] || ['yy', years];
|
1324
|
-
args[2] = withoutSuffix;
|
1325
|
-
return substituteTimeAgo.apply({}, args);
|
1326
|
-
}
|
1327
|
-
|
1328
|
-
moment = function (input, format) {
|
1329
|
-
if (input === null || input === '') {
|
1330
|
-
return null;
|
1331
|
-
}
|
1332
|
-
var date,
|
1333
|
-
matched;
|
1334
|
-
// parse Moment object
|
1335
|
-
if (input && input._d instanceof Date) {
|
1336
|
-
date = new Date(+input._d);
|
1337
|
-
// parse string and format
|
1338
|
-
} else if (format) {
|
1339
|
-
if (isArray(format)) {
|
1340
|
-
date = makeDateFromStringAndArray(input, format);
|
1341
|
-
} else {
|
1342
|
-
date = makeDateFromStringAndFormat(input, format);
|
1343
|
-
}
|
1344
|
-
// evaluate it as a JSON-encoded date
|
1345
|
-
} else {
|
1346
|
-
matched = jsonRegex.exec(input);
|
1347
|
-
date = input === undefined ? new Date() :
|
1348
|
-
matched ? new Date(+matched[1]) :
|
1349
|
-
input instanceof Date ? input :
|
1350
|
-
isArray(input) ? dateFromArray(input) :
|
1351
|
-
typeof input === 'string' ? makeDateFromString(input) :
|
1352
|
-
new Date(input);
|
1353
|
-
}
|
1354
|
-
return new Moment(date);
|
1355
|
-
};
|
1356
|
-
|
1357
|
-
// creating with utc
|
1358
|
-
moment.utc = function (input, format) {
|
1359
|
-
if (isArray(input)) {
|
1360
|
-
return new Moment(new Date(Date.UTC.apply({}, input)), true);
|
1361
|
-
}
|
1362
|
-
return (format && input) ? moment(input + ' 0', format + ' Z').utc() : moment(input).utc();
|
1363
|
-
};
|
1364
|
-
|
1365
|
-
// humanizeDuration
|
1366
|
-
moment.humanizeDuration = function (num, type, withSuffix) {
|
1367
|
-
var difference = +num,
|
1368
|
-
rel = moment.relativeTime,
|
1369
|
-
output;
|
1370
|
-
switch (type) {
|
1371
|
-
case "seconds" :
|
1372
|
-
difference *= 1000; // 1000
|
1373
|
-
break;
|
1374
|
-
case "minutes" :
|
1375
|
-
difference *= 60000; // 60 * 1000
|
1376
|
-
break;
|
1377
|
-
case "hours" :
|
1378
|
-
difference *= 3600000; // 60 * 60 * 1000
|
1379
|
-
break;
|
1380
|
-
case "days" :
|
1381
|
-
difference *= 86400000; // 24 * 60 * 60 * 1000
|
1382
|
-
break;
|
1383
|
-
case "weeks" :
|
1384
|
-
difference *= 604800000; // 7 * 24 * 60 * 60 * 1000
|
1385
|
-
break;
|
1386
|
-
case "months" :
|
1387
|
-
difference *= 2592000000; // 30 * 24 * 60 * 60 * 1000
|
1388
|
-
break;
|
1389
|
-
case "years" :
|
1390
|
-
difference *= 31536000000; // 365 * 24 * 60 * 60 * 1000
|
1391
|
-
break;
|
1392
|
-
default :
|
1393
|
-
withSuffix = !!type;
|
1394
|
-
break;
|
1395
|
-
}
|
1396
|
-
output = relativeTime(difference, !withSuffix);
|
1397
|
-
return withSuffix ? (difference <= 0 ? rel.past : rel.future).replace(/%s/i, output) : output;
|
1398
|
-
};
|
1399
|
-
|
1400
|
-
// version number
|
1401
|
-
moment.version = VERSION;
|
1402
|
-
|
1403
|
-
// default format
|
1404
|
-
moment.defaultFormat = isoFormat;
|
1405
|
-
|
1406
|
-
// language switching and caching
|
1407
|
-
moment.lang = function (key, values) {
|
1408
|
-
var i,
|
1409
|
-
param,
|
1410
|
-
req,
|
1411
|
-
parse = [];
|
1412
|
-
if (values) {
|
1413
|
-
for (i = 0; i < 12; i++) {
|
1414
|
-
parse[i] = new RegExp('^' + values.months[i] + '|^' + values.monthsShort[i].replace('.', ''), 'i');
|
1415
|
-
}
|
1416
|
-
values.monthsParse = values.monthsParse || parse;
|
1417
|
-
languages[key] = values;
|
1418
|
-
}
|
1419
|
-
if (languages[key]) {
|
1420
|
-
for (i = 0; i < paramsToParse.length; i++) {
|
1421
|
-
param = paramsToParse[i];
|
1422
|
-
moment[param] = languages[key][param] || moment[param];
|
1423
|
-
}
|
1424
|
-
} else {
|
1425
|
-
if (hasModule) {
|
1426
|
-
req = require('./lang/' + key);
|
1427
|
-
moment.lang(key, req);
|
1428
|
-
}
|
1429
|
-
}
|
1430
|
-
};
|
1431
|
-
|
1432
|
-
// set default language
|
1433
|
-
moment.lang('en', {
|
1434
|
-
months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
|
1435
|
-
monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
|
1436
|
-
weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
|
1437
|
-
weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
|
1438
|
-
longDateFormat : {
|
1439
|
-
LT : "h:mm A",
|
1440
|
-
L : "MM/DD/YYYY",
|
1441
|
-
LL : "MMMM D YYYY",
|
1442
|
-
LLL : "MMMM D YYYY LT",
|
1443
|
-
LLLL : "dddd, MMMM D YYYY LT"
|
1444
|
-
},
|
1445
|
-
meridiem : {
|
1446
|
-
AM : 'AM',
|
1447
|
-
am : 'am',
|
1448
|
-
PM : 'PM',
|
1449
|
-
pm : 'pm'
|
1450
|
-
},
|
1451
|
-
calendar : {
|
1452
|
-
sameDay : '[Today at] LT',
|
1453
|
-
nextDay : '[Tomorrow at] LT',
|
1454
|
-
nextWeek : 'dddd [at] LT',
|
1455
|
-
lastDay : '[Yesterday at] LT',
|
1456
|
-
lastWeek : '[last] dddd [at] LT',
|
1457
|
-
sameElse : 'L'
|
1458
|
-
},
|
1459
|
-
relativeTime : {
|
1460
|
-
future : "in %s",
|
1461
|
-
past : "%s ago",
|
1462
|
-
s : "a few seconds",
|
1463
|
-
m : "a minute",
|
1464
|
-
mm : "%d minutes",
|
1465
|
-
h : "an hour",
|
1466
|
-
hh : "%d hours",
|
1467
|
-
d : "a day",
|
1468
|
-
dd : "%d days",
|
1469
|
-
M : "a month",
|
1470
|
-
MM : "%d months",
|
1471
|
-
y : "a year",
|
1472
|
-
yy : "%d years"
|
1473
|
-
},
|
1474
|
-
ordinal : function (number) {
|
1475
|
-
var b = number % 10;
|
1476
|
-
return (~~ (number % 100 / 10) === 1) ? 'th' :
|
1477
|
-
(b === 1) ? 'st' :
|
1478
|
-
(b === 2) ? 'nd' :
|
1479
|
-
(b === 3) ? 'rd' : 'th';
|
1480
|
-
}
|
1481
|
-
});
|
1482
|
-
|
1483
|
-
// compare moment object
|
1484
|
-
moment.isMoment = function (obj) {
|
1485
|
-
return obj instanceof Moment;
|
1486
|
-
};
|
1487
|
-
|
1488
|
-
// shortcut for prototype
|
1489
|
-
moment.fn = Moment.prototype = {
|
1490
|
-
|
1491
|
-
clone : function () {
|
1492
|
-
return moment(this);
|
1493
|
-
},
|
1494
|
-
|
1495
|
-
valueOf : function () {
|
1496
|
-
return +this._d;
|
1497
|
-
},
|
1498
|
-
|
1499
|
-
'native' : function () {
|
1500
|
-
return this._d;
|
1501
|
-
},
|
1502
|
-
|
1503
|
-
toString : function () {
|
1504
|
-
return this._d.toString();
|
1505
|
-
},
|
1506
|
-
|
1507
|
-
toDate : function () {
|
1508
|
-
return this._d;
|
1509
|
-
},
|
1510
|
-
|
1511
|
-
utc : function () {
|
1512
|
-
this._isUTC = true;
|
1513
|
-
return this;
|
1514
|
-
},
|
1515
|
-
|
1516
|
-
local : function () {
|
1517
|
-
this._isUTC = false;
|
1518
|
-
return this;
|
1519
|
-
},
|
1520
|
-
|
1521
|
-
format : function (inputString) {
|
1522
|
-
return formatMoment(this, inputString ? inputString : moment.defaultFormat);
|
1523
|
-
},
|
1524
|
-
|
1525
|
-
add : function (input, val) {
|
1526
|
-
this._d = dateAddRemove(this._d, input, 1, val);
|
1527
|
-
return this;
|
1528
|
-
},
|
1529
|
-
|
1530
|
-
subtract : function (input, val) {
|
1531
|
-
this._d = dateAddRemove(this._d, input, -1, val);
|
1532
|
-
return this;
|
1533
|
-
},
|
1534
|
-
|
1535
|
-
diff : function (input, val, asFloat) {
|
1536
|
-
var inputMoment = moment(input),
|
1537
|
-
zoneDiff = (this.zone() - inputMoment.zone()) * 6e4,
|
1538
|
-
diff = this._d - inputMoment._d - zoneDiff,
|
1539
|
-
year = this.year() - inputMoment.year(),
|
1540
|
-
month = this.month() - inputMoment.month(),
|
1541
|
-
date = this.date() - inputMoment.date(),
|
1542
|
-
output;
|
1543
|
-
if (val === 'months') {
|
1544
|
-
output = year * 12 + month + date / 30;
|
1545
|
-
} else if (val === 'years') {
|
1546
|
-
output = year + month / 12;
|
1547
|
-
} else {
|
1548
|
-
output = val === 'seconds' ? diff / 1e3 : // 1000
|
1549
|
-
val === 'minutes' ? diff / 6e4 : // 1000 * 60
|
1550
|
-
val === 'hours' ? diff / 36e5 : // 1000 * 60 * 60
|
1551
|
-
val === 'days' ? diff / 864e5 : // 1000 * 60 * 60 * 24
|
1552
|
-
val === 'weeks' ? diff / 6048e5 : // 1000 * 60 * 60 * 24 * 7
|
1553
|
-
diff;
|
1554
|
-
}
|
1555
|
-
return asFloat ? output : round(output);
|
1556
|
-
},
|
1557
|
-
|
1558
|
-
from : function (time, withoutSuffix) {
|
1559
|
-
return moment.humanizeDuration(this.diff(time), !withoutSuffix);
|
1560
|
-
},
|
1561
|
-
|
1562
|
-
fromNow : function (withoutSuffix) {
|
1563
|
-
return this.from(moment(), withoutSuffix);
|
1564
|
-
},
|
1565
|
-
|
1566
|
-
calendar : function () {
|
1567
|
-
var diff = this.diff(moment().sod(), 'days', true),
|
1568
|
-
calendar = moment.calendar,
|
1569
|
-
allElse = calendar.sameElse,
|
1570
|
-
format = diff < -6 ? allElse :
|
1571
|
-
diff < -1 ? calendar.lastWeek :
|
1572
|
-
diff < 0 ? calendar.lastDay :
|
1573
|
-
diff < 1 ? calendar.sameDay :
|
1574
|
-
diff < 2 ? calendar.nextDay :
|
1575
|
-
diff < 7 ? calendar.nextWeek : allElse;
|
1576
|
-
return this.format(typeof format === 'function' ? format.apply(this) : format);
|
1577
|
-
},
|
1578
|
-
|
1579
|
-
isLeapYear : function () {
|
1580
|
-
var year = this.year();
|
1581
|
-
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
1582
|
-
},
|
1583
|
-
|
1584
|
-
isDST : function () {
|
1585
|
-
return (this.zone() < moment([this.year()]).zone() ||
|
1586
|
-
this.zone() < moment([this.year(), 5]).zone());
|
1587
|
-
},
|
1588
|
-
|
1589
|
-
day : function (input) {
|
1590
|
-
var day = this._d.getDay();
|
1591
|
-
return (typeof input === 'undefined') ? day :
|
1592
|
-
this.add({ d : input - day });
|
1593
|
-
},
|
1594
|
-
|
1595
|
-
sod: function () {
|
1596
|
-
return this.clone()
|
1597
|
-
.hours(0)
|
1598
|
-
.minutes(0)
|
1599
|
-
.seconds(0)
|
1600
|
-
.milliseconds(0);
|
1601
|
-
},
|
1602
|
-
|
1603
|
-
eod: function () {
|
1604
|
-
// end of day = start of day plus 1 day, minus 1 millisecond
|
1605
|
-
return this.sod().add({
|
1606
|
-
d : 1,
|
1607
|
-
ms : -1
|
1608
|
-
});
|
1609
|
-
},
|
1610
|
-
|
1611
|
-
zone : function () {
|
1612
|
-
return this._isUTC ? 0 : this._d.getTimezoneOffset();
|
1613
|
-
},
|
1614
|
-
|
1615
|
-
daysInMonth : function () {
|
1616
|
-
return this.clone().month(this.month() + 1).date(0).date();
|
1617
|
-
}
|
1618
|
-
};
|
1619
|
-
|
1620
|
-
// helper for adding shortcuts
|
1621
|
-
function makeShortcut(name, key) {
|
1622
|
-
moment.fn[name] = function (input) {
|
1623
|
-
var utc = this._isUTC ? 'UTC' : '';
|
1624
|
-
if (typeof input !== 'undefined') {
|
1625
|
-
this._d['set' + utc + key](input);
|
1626
|
-
return this;
|
1627
|
-
} else {
|
1628
|
-
return this._d['get' + utc + key]();
|
1629
|
-
}
|
1630
|
-
};
|
1631
|
-
}
|
1632
|
-
|
1633
|
-
// loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds)
|
1634
|
-
for (i = 0; i < shortcuts.length; i ++) {
|
1635
|
-
makeShortcut(shortcuts[i].toLowerCase(), shortcuts[i]);
|
1636
|
-
}
|
1637
|
-
|
1638
|
-
// add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear')
|
1639
|
-
makeShortcut('year', 'FullYear');
|
1640
|
-
|
1641
|
-
return moment;
|
1642
|
-
})(Date);
|
984
|
+
};
|
985
|
+
if (!Kalendae.moment) {
|
986
|
+
if (window.moment) {
|
987
|
+
Kalendae.moment = window.moment;
|
988
|
+
} else {
|
989
|
+
throw "Kalendae requires moment.js. You must use kalendae.standalone.js if moment is not available on the page.";
|
990
|
+
}
|
991
|
+
}
|
992
|
+
|
993
|
+
moment = Kalendae.moment;
|
1643
994
|
|
1644
995
|
//function to reset the date object to 00:00 GMT
|
1645
996
|
moment.fn.stripTime = function () {
|
1646
997
|
this._d = new Date(Math.floor(this._d.valueOf() / 86400000) * 86400000);
|
1647
998
|
return this;
|
1648
|
-
}
|
999
|
+
};
|
1649
1000
|
|
1650
1001
|
|
1651
1002
|
//function to get the total number of days since the epoch.
|
@@ -1653,11 +1004,11 @@ moment.fn.yearDay = function (input) {
|
|
1653
1004
|
var yearday = Math.floor(this._d / 86400000);
|
1654
1005
|
return (typeof input === 'undefined') ? yearday :
|
1655
1006
|
this.add({ d : input - yearday });
|
1656
|
-
}
|
1007
|
+
};
|
1657
1008
|
|
1658
|
-
today = moment().stripTime();
|
1009
|
+
today = Kalendae.moment().stripTime();
|
1659
1010
|
|
1660
|
-
if (typeof jQuery !== 'undefined') {
|
1011
|
+
if (typeof jQuery !== 'undefined' && (typeof document.addEventListener === 'function' || util.isIE8())) {
|
1661
1012
|
jQuery.fn.kalendae = function (options) {
|
1662
1013
|
this.each(function (i, e) {
|
1663
1014
|
if (e.tagName === 'INPUT') {
|
@@ -1669,7 +1020,7 @@ if (typeof jQuery !== 'undefined') {
|
|
1669
1020
|
}
|
1670
1021
|
});
|
1671
1022
|
return this;
|
1672
|
-
}
|
1023
|
+
};
|
1673
1024
|
}
|
1674
1025
|
|
1675
1026
|
|