calendarjs-rails 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/README.md +2 -0
  4. data/lib/calendarjs-rails.rb +7 -0
  5. data/news.md +2 -0
  6. data/test/calendarjs_rails_test.rb +7 -0
  7. data/test/dummy/Rakefile +8 -0
  8. data/test/dummy/config.ru +4 -0
  9. data/test/dummy/config/application.rb +64 -0
  10. data/test/dummy/config/boot.rb +10 -0
  11. data/test/dummy/config/environment.rb +5 -0
  12. data/test/dummy/config/environments/development.rb +30 -0
  13. data/test/dummy/config/environments/production.rb +63 -0
  14. data/test/dummy/config/environments/test.rb +34 -0
  15. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  16. data/test/dummy/config/initializers/inflections.rb +15 -0
  17. data/test/dummy/config/initializers/mime_types.rb +5 -0
  18. data/test/dummy/config/initializers/secret_token.rb +7 -0
  19. data/test/dummy/config/initializers/session_store.rb +8 -0
  20. data/test/dummy/config/initializers/wrap_parameters.rb +9 -0
  21. data/test/dummy/config/locales/en.yml +5 -0
  22. data/test/dummy/config/routes.rb +2 -0
  23. data/test/dummy/tmp/cache/assets/sprockets/v3.0/-j/-jX6MoF1gOaOZHxINZZpMRHTn2kF9xfDHriD08Mq00s.cache +0 -0
  24. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0V/0VyeLwtys3zoO0lGDBiFmH2ncDxv-QM0UnEeiRvvEOg.cache +1 -0
  25. data/test/dummy/tmp/cache/assets/sprockets/v3.0/29/29z91GF7Jdd6-ZvvN_9P3veprmZggQJbiZgKrZs-UI4.cache +2 -0
  26. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4J/4JzoxrC9KC4LiJqiajkI9-3K5-2NdFy4M_cFaj6eTEs.cache +1 -0
  27. data/test/dummy/tmp/cache/assets/sprockets/v3.0/76/76rZCUXXl9eSYVRC7ZNyLGrJDpgwxEDAE-wn3wvHjRw.cache +3 -0
  28. data/test/dummy/tmp/cache/assets/sprockets/v3.0/CC/CCY-6ieyRqrrB1PH687qeY6LDpwtCRzzlkbBgAlCM84.cache +1 -0
  29. data/test/dummy/tmp/cache/assets/sprockets/v3.0/FP/FPNvsGsm0uotkevOb2NHkDa_8GdCbRgn5zF9Pzi0rjo.cache +2 -0
  30. data/test/dummy/tmp/cache/assets/sprockets/v3.0/KE/KE54S4D96FMdc6-Xj2izBJAChedLDCBpamIR5NDZbHM.cache +1 -0
  31. data/test/dummy/tmp/cache/assets/sprockets/v3.0/L9/L9JZ807nqCi_-g6HbJU4gd38QdFKkWtnAoxr90ymOSg.cache +3 -0
  32. data/test/dummy/tmp/cache/assets/sprockets/v3.0/LK/LK0j1_AEtvrRUHEHZHhegGwJOZFh_bQ073S4m3OgrMA.cache +2 -0
  33. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Q1/Q1qcrf38TQ_-2TwAK9ayGq2OdoQju3bZALLzfJok2Z8.cache +3 -0
  34. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Re/Re1zH3S_FMcunhZmCxaXFvCwdAK6JdLuIJU0vGX6jVY.cache +0 -0
  35. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ww/WwwxBKzI2nK7E6S4bvev_XaMP6VYFlDAoE6T-suuH20.cache +1 -0
  36. data/test/dummy/tmp/cache/assets/sprockets/v3.0/a1/a1U4RlX-h_CSLpnWmM188oG7iH3dpBndcO5PwsnFPvc.cache +0 -0
  37. data/test/dummy/tmp/cache/assets/sprockets/v3.0/aD/aD9vsmOUiytCNsyXonYHSjxnWJHvDBI36z1ZgG1rNaM.cache +2 -0
  38. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dT/dTwKpWBP570vthdHFZCVcZ6lwdGEPPFPrwgIHh4ApRw.cache +0 -0
  39. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dx/dxfL5DH54Gm9f5VadebVrJTsZ9aV2vT91Wh5DXJxCS4.cache +0 -0
  40. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lD/lDIiAPN5ZE3rTTxeci6JGLHarEfNhKD_bKxzQIHNqh0.cache +1 -0
  41. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lL/lL3bM8saW7SfiHHUn4zLOECqmaH5pENG5A4_2i0jSpE.cache +0 -0
  42. data/test/dummy/tmp/cache/assets/sprockets/v3.0/q5/q5QHvwif5zHCewYT81wwztvjF6UasJLLQR0UVGML6yQ.cache +1 -0
  43. data/test/dummy/tmp/cache/assets/sprockets/v3.0/v8/v8ysLZl-Y9QdSJty-2bv7-gxgBI66Nm9GLDbkeBpPvs.cache +2 -0
  44. data/test/dummy/tmp/cache/assets/sprockets/v3.0/vg/vgxyzvY-w7qdQGnOEfxXFL6xR2jnWM0buoU_geEYUIc.cache +0 -0
  45. data/test/dummy/tmp/cache/assets/sprockets/v3.0/vn/vncjI19OzgdPPQwTdvdz5ApUeBGO0_KaznNJa3haYgQ.cache +1 -0
  46. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xV/xVmK48WqdaLwOGpahnASPN6d0wq88FkAoHIjsBOCh6Q.cache +3 -0
  47. data/test/dummy/tmp/cache/assets/sprockets/v3.0/yE/yEBl6HzyqwjnY1VQux89nkXU8EIknmxBjWU8w2s4qoU.cache +0 -0
  48. data/test/dummy/tmp/cache/assets/sprockets/v3.0/yw/ywj5LBveIytjjWIHwZN5BZ0Cgub3AG_av9f-ekoPzPE.cache +2 -0
  49. data/test/dummy/tmp/cache/assets/sprockets/v3.0/zC/zCm6IZvmdtCx2iyLAHFwSjqX8R2IiCOVM_zY2k-B0Hw.cache +1 -0
  50. data/test/dummy/tmp/cache/assets/sprockets/v3.0/zD/zDX8JWTGnCOVj1kqIevdJP1mNzNEIibIVEYQDJEGfZE.cache +2 -0
  51. data/test/integration/navigation_test.rb +23 -0
  52. data/test/test_helper.rb +15 -0
  53. data/vendor/assets/javascripts/Calendar.js +794 -0
  54. data/vendor/assets/stylesheets/Calendar.css +5 -0
  55. metadata +188 -0
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
+ # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
+
6
+ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
+ # Rails.backtrace_cleaner.remove_silencers!
@@ -0,0 +1,15 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format
4
+ # (all these examples are active by default):
5
+ # ActiveSupport::Inflector.inflections do |inflect|
6
+ # inflect.plural /^(ox)$/i, '\1en'
7
+ # inflect.singular /^(ox)en/i, '\1'
8
+ # inflect.irregular 'person', 'people'
9
+ # inflect.uncountable %w( fish sheep )
10
+ # end
11
+ #
12
+ # These inflection rules are supported but not enabled by default:
13
+ # ActiveSupport::Inflector.inflections do |inflect|
14
+ # inflect.acronym 'RESTful'
15
+ # end
@@ -0,0 +1,5 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new mime types for use in respond_to blocks:
4
+ # Mime::Type.register "text/richtext", :rtf
5
+ # Mime::Type.register_alias "text/html", :iphone
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+ # Make sure the secret is at least 30 characters and all random,
6
+ # no regular words or you'll be exposed to dictionary attacks.
7
+ Dummy::Application.config.secret_token = '49dfd6e5e224394dc63086a6507249b44ff1ca26e4a474ceb4e57f19aeacc345d514ee349e42e82b7a83d287041cf85487c0753f213534e4dbd02f355202a00b'
@@ -0,0 +1,8 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ Dummy::Application.config.session_store :cookie_store, key: '_dummy_session'
4
+
5
+ # Use the database for sessions instead of the cookie-based default,
6
+ # which shouldn't be used to store highly confidential information
7
+ # (create the session table with "rails generate session_migration")
8
+ # Dummy::Application.config.session_store :active_record_store
@@ -0,0 +1,9 @@
1
+ # Be sure to restart your server when you modify this file.
2
+ #
3
+ # This file contains settings for ActionController::ParamsWrapper which
4
+ # is enabled by default.
5
+
6
+ # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7
+ ActiveSupport.on_load(:action_controller) do
8
+ wrap_parameters format: [:json]
9
+ end
@@ -0,0 +1,5 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: "Hello world"
@@ -0,0 +1,2 @@
1
+ Rails.application.routes.draw do
2
+ end
@@ -0,0 +1 @@
1
+ I"�/Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/stylesheets/Calendar.css?type=text/css&id=09a5b91b758f6cbe82085ea1a7964b86975cab6d9378048f9d2ac41276e381a4:ET
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash} I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"Lprocessors:type=application/javascript&file_type=application/javascript;TTI"zfile-digest:///Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/javascripts/Calendar.js;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTF
@@ -0,0 +1 @@
1
+ I"�/Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/stylesheets/Calendar.css?type=text/css&pipeline=self&id=0d93802a45553bea37ea113d56f020d07f3453fe885bdd158e7f89fe52c79af2:ET
@@ -0,0 +1,3 @@
1
+ [o:Set:
2
+ @hash}
3
+ I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"zfile-digest:///Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/javascripts/Calendar.js;TTF
@@ -0,0 +1 @@
1
+ I"�/Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/stylesheets/Calendar.css?type=text/css&pipeline=self&id=637f804f22bf841b541bbb6af38b06d6ceaed5b51f1923c56d534b94288ff2f9:ET
@@ -0,0 +1,2 @@
1
+ "%����g"5,�~���BG�l��}��
2
+ TS
@@ -0,0 +1 @@
1
+ I"�/Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/javascripts/Calendar.js?type=application/javascript&id=9f382dfe35f3aa7fc3c20ac6aeb4cb02e859bef87b366e74dd456225c59732c2:ET
@@ -0,0 +1,3 @@
1
+ [o:Set:
2
+ @hash}
3
+ I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI">processors:type=text/css&file_type=text/css&pipeline=self;TTI"{file-digest:///Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/stylesheets/Calendar.css;TTF
@@ -0,0 +1,2 @@
1
+ "%">��\C�~td����VOx��
2
+ ����hȓ��
@@ -0,0 +1,3 @@
1
+ [o:Set:
2
+ @hash}
3
+ I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"zfile-digest:///Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/javascripts/Calendar.js;TTF
@@ -0,0 +1 @@
1
+ I"�/Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/stylesheets/Calendar.css?type=text/css&id=75a82ed0a713320463da6771e8defefe588991c8c65e19d71fe3fe2fbb44a03e:ET
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash} I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"Lprocessors:type=application/javascript&file_type=application/javascript;TTI"zfile-digest:///Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/javascripts/Calendar.js;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTF
@@ -0,0 +1 @@
1
+ "%'�����|F�^��XA�א�vw�I�.a�p��7�
@@ -0,0 +1 @@
1
+ I"�/Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/javascripts/Calendar.js?type=application/javascript&id=3c3e0de650ce2bd3ac0eba4bad7138d16dd4810b89d17135fde16a6eb8d64232:ET
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash} I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"0processors:type=text/css&file_type=text/css;TTI"{file-digest:///Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/stylesheets/Calendar.css;TTI">processors:type=text/css&file_type=text/css&pipeline=self;TTF
@@ -0,0 +1 @@
1
+ I"�/Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/javascripts/Calendar.js?type=application/javascript&pipeline=self&id=7a8641c7cdfcbba2e88b82335eaebcc987ce70ef913c5e27bdf02c13a6b49018:ET
@@ -0,0 +1,3 @@
1
+ [o:Set:
2
+ @hash}
3
+ I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI">processors:type=text/css&file_type=text/css&pipeline=self;TTI"{file-digest:///Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/stylesheets/Calendar.css;TTF
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash} I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"0processors:type=text/css&file_type=text/css;TTI"{file-digest:///Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/stylesheets/Calendar.css;TTI">processors:type=text/css&file_type=text/css&pipeline=self;TTF
@@ -0,0 +1 @@
1
+ I"�/Users/viniciusmagalhaes/Development/vkmagalhaes/calendarjs-rails/vendor/assets/javascripts/Calendar.js?type=application/javascript&pipeline=self&id=2236af4e8767fd64a644b23547019d0c94d463809947ab4eb3d84626e21ab267:ET
@@ -0,0 +1,2 @@
1
+ "%ܥ4b���摋{Ypmmx�?�@
2
+ ��yUr�d�
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class NavigationTest < ActionDispatch::IntegrationTest
4
+ test 'can access calendarjs' do
5
+ get '/assets/Calendar.js'
6
+ assert_response :success
7
+ end
8
+
9
+ test 'calendarjs response is for the expected version' do
10
+ get '/assets/Calendar.js'
11
+ assert_match(/version : 1\.0\.10/, @response.body)
12
+ end
13
+
14
+ test 'can access calendarjs css' do
15
+ get '/assets/Calendar.css'
16
+ assert_response :success
17
+ end
18
+
19
+ test 'calendarjs css response is for the expected version' do
20
+ get '/assets/Calendar.css'
21
+ assert_match(/version : 1\.0\.10/, @response.body)
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ # Configure Rails Environment
2
+ ENV['RAILS_ENV'] = 'test'
3
+
4
+ require File.expand_path('../dummy/config/environment.rb', __FILE__)
5
+ require 'rails/test_help'
6
+
7
+ Rails.backtrace_cleaner.remove_silencers!
8
+
9
+ # Load support files
10
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
11
+
12
+ # Load fixtures from the engine
13
+ if ActiveSupport::TestCase.method_defined?(:fixture_path=)
14
+ ActiveSupport::TestCase.fixture_path = File.expand_path('../fixtures', __FILE__)
15
+ end
@@ -0,0 +1,794 @@
1
+ //! https://github.com/Baremetrics/calendar
2
+ //! version : 1.0.10
3
+
4
+ 'use strict';
5
+
6
+ (function(root, factory) {
7
+ if (typeof define === 'function' && define.amd) {
8
+ // AMD. Register as an anonymous module.
9
+ define(['jquery', 'moment'], factory);
10
+ } else if (typeof exports === 'object') {
11
+ // Node/CommonJS
12
+ module.exports = factory(require('jquery'), require('moment'));
13
+ } else {
14
+ // Browser globals
15
+ root.Calendar = factory(jQuery, moment);
16
+ }
17
+ }(this, function($, moment) {
18
+ function Calendar(settings) {
19
+ var self = this;
20
+
21
+ this.settings = settings;
22
+
23
+ this.calIsOpen = false;
24
+ this.presetIsOpen = false;
25
+ this.sameDayRange = settings.same_day_range || false;
26
+
27
+ this.element = settings.element || $('.daterange');
28
+ this.selected = null;
29
+
30
+ this.type = this.element.hasClass('daterange--single') ? 'single' : 'double';
31
+ this.required = settings.required == false ? false : true;
32
+
33
+ this.format = settings.format || {};
34
+ this.format.input = settings.format && settings.format.input || 'MMMM D, YYYY';
35
+ this.format.preset = settings.format && settings.format.preset || 'll';
36
+ this.format.jump_month = settings.format && settings.format.jump_month || 'MMMM';
37
+ this.format.jump_year = settings.format && settings.format.jump_year || 'YYYY';
38
+
39
+ this.placeholder = settings.placeholder || this.format.input;
40
+
41
+ this.days_array = settings.days_array && settings.days_array.length == 7 ?
42
+ settings.days_array : moment.weekdaysMin();
43
+
44
+ this.orig_start_date = null;
45
+ this.orig_end_date = null;
46
+ this.orig_current_date = null;
47
+
48
+ this.earliest_date = settings.earliest_date ? moment(settings.earliest_date) :
49
+ moment('1900-01-01');
50
+ this.latest_date = settings.latest_date ? moment(settings.latest_date) :
51
+ moment('2900-12-31');
52
+ this.end_date = settings.end_date ? moment(settings.end_date) :
53
+ (this.type == 'double' ? moment() : null);
54
+ this.start_date = settings.start_date ? moment(settings.start_date) :
55
+ (this.type == 'double' ? this.end_date.clone().subtract(1, 'month') : null);
56
+ this.current_date = settings.current_date ? moment(settings.current_date) :
57
+ (this.type == 'single' ? moment() : null);
58
+
59
+ this.presets = settings.presets == false || this.type == 'single' ? false : true;
60
+
61
+ this.callback = settings.callback || this.calendarSetDates;
62
+
63
+ this.calendarHTML(this.type);
64
+
65
+ $('.dr-presets', this.element).click(function() {
66
+ self.presetToggle();
67
+ });
68
+
69
+ $('.dr-list-item', this.element).click(function() {
70
+ var start = $('.dr-item-aside', this).data('start');
71
+ var end = $('.dr-item-aside', this).data('end');
72
+
73
+ self.start_date = self.calendarCheckDate(start);
74
+ self.end_date = self.calendarCheckDate(end);
75
+
76
+ self.calendarSetDates();
77
+ self.presetToggle();
78
+ self.calendarSaveDates();
79
+ });
80
+
81
+ $('.dr-date', this.element).on({
82
+ 'click': function() {
83
+ self.calendarOpen(this);
84
+ },
85
+
86
+ 'keyup': function(event) {
87
+ if (event.keyCode == 9 && !self.calIsOpen && !self.start_date && !self.end_date)
88
+ self.calendarOpen(this);
89
+ },
90
+
91
+ 'keydown': function(event) {
92
+ switch (event.keyCode) {
93
+
94
+ case 9: // Tab
95
+ if ($(self.selected).hasClass('dr-date-start')) {
96
+ event.preventDefault();
97
+ self.calendarCheckDates();
98
+ self.calendarSetDates();
99
+ $('.dr-date-end', self.element).trigger('click');
100
+ } else {
101
+ self.calendarCheckDates();
102
+ self.calendarSetDates();
103
+ self.calendarSaveDates();
104
+ self.calendarClose('force');
105
+ }
106
+ break;
107
+
108
+ case 13: // Enter
109
+ event.preventDefault();
110
+ self.calendarCheckDates();
111
+ self.calendarSetDates();
112
+ self.calendarSaveDates();
113
+ self.calendarClose('force');
114
+ break;
115
+
116
+ case 27: // ESC
117
+ self.calendarSetDates();
118
+ self.calendarClose('force');
119
+ break;
120
+
121
+ case 38: // Up
122
+ event.preventDefault();
123
+ var timeframe = 'day';
124
+
125
+ if (event.shiftKey)
126
+ timeframe = 'week';
127
+
128
+ if (event.metaKey)
129
+ timeframe = 'month';
130
+
131
+ var back = moment(self.current_date).subtract(1, timeframe);
132
+
133
+ $(this).html(back.format(self.format.input));
134
+ self.current_date = back;
135
+ break;
136
+
137
+ case 40: // Down
138
+ event.preventDefault();
139
+ var timeframe = 'day';
140
+
141
+ if (event.shiftKey)
142
+ timeframe = 'week';
143
+
144
+ if (event.metaKey)
145
+ timeframe = 'month';
146
+
147
+ var forward = moment(self.current_date).add(1, timeframe);
148
+
149
+ $(this).html(forward.format(self.format.input));
150
+ self.current_date = forward;
151
+ break;
152
+ }
153
+ }
154
+ });
155
+
156
+ $('.dr-month-switcher i', this.element).click(function() {
157
+ var m = $('.dr-month-switcher span', self.element).data('month');
158
+ var y = $('.dr-year-switcher span', self.element).data('year');
159
+ var this_moment = moment([y, m, 1]);
160
+ var back = this_moment.clone().subtract(1, 'month');
161
+ var forward = this_moment.clone().add(1, 'month').startOf('day');
162
+
163
+ if ($(this).hasClass('dr-left')) {
164
+ self.calendarOpen(self.selected, back);
165
+ } else if ($(this).hasClass('dr-right')) {
166
+ self.calendarOpen(self.selected, forward);
167
+ }
168
+ });
169
+
170
+ $('.dr-year-switcher i', this.element).click(function() {
171
+ var m = $('.dr-month-switcher span', self.element).data('month');
172
+ var y = $('.dr-year-switcher span', self.element).data('year');
173
+ var this_moment = moment([y, m, 1]);
174
+ var back = this_moment.clone().subtract(1, 'year');
175
+ var forward = this_moment.clone().add(1, 'year').startOf('day');
176
+
177
+
178
+ if ($(this).hasClass('dr-left')) {
179
+ self.calendarOpen(self.selected, back);
180
+ } else if ($(this).hasClass('dr-right')) {
181
+ self.calendarOpen(self.selected, forward);
182
+ }
183
+ });
184
+
185
+ $('.dr-dates-dash', this.element).click(function() {
186
+ $('.dr-date-start', self.element).trigger('click');
187
+ });
188
+
189
+ // Once you click into a selection.. this lets you click out
190
+ this.element.on('click', function() {
191
+ document.addEventListener('click', function(f) {
192
+ var contains = self.element.find(f.path[0]);
193
+
194
+ if (!contains.length) {
195
+ if (self.presetIsOpen)
196
+ self.presetToggle();
197
+
198
+ if (self.calIsOpen) {
199
+ if ($(self.selected).hasClass('dr-date-end'))
200
+ self.calendarSaveDates();
201
+
202
+ self.calendarSetDates();
203
+ self.calendarClose('force');
204
+ }
205
+ }
206
+ });
207
+ });
208
+ }
209
+
210
+
211
+ Calendar.prototype.presetToggle = function() {
212
+ if (this.presetIsOpen == false) {
213
+ this.orig_start_date = this.start_date;
214
+ this.orig_end_date = this.end_date;
215
+ this.orig_current_date = this.current_date;
216
+
217
+ this.presetIsOpen = true;
218
+ } else if (this.presetIsOpen) {
219
+ this.presetIsOpen = false;
220
+ }
221
+
222
+ if (this.calIsOpen == true)
223
+ this.calendarClose();
224
+
225
+ $('.dr-preset-list', this.element).slideToggle(200);
226
+ $('.dr-input', this.element).toggleClass('dr-active');
227
+ $('.dr-presets', this.element).toggleClass('dr-active');
228
+ this.element.toggleClass('dr-active');
229
+ }
230
+
231
+
232
+ Calendar.prototype.presetCreate = function() {
233
+ var self = this;
234
+ var ul_presets = $('<ul class="dr-preset-list" style="display: none;"></ul>');
235
+ var presets = typeof self.settings.presets === 'object' ? self.settings.presets : [{
236
+ label: 'Last 30 days',
237
+ start: moment(self.latest_date).subtract(29, 'days'),
238
+ end: self.latest_date
239
+ }, {
240
+ label: 'Last month',
241
+ start: moment(self.latest_date).subtract(1, 'month').startOf('month'),
242
+ end: moment(self.latest_date).subtract(1, 'month').endOf('month')
243
+ }, {
244
+ label: 'Last 3 months',
245
+ start: moment(self.latest_date).subtract(3, 'month').startOf('month'),
246
+ end: moment(self.latest_date).subtract(1, 'month').endOf('month')
247
+ }, {
248
+ label: 'Last 6 months',
249
+ start: moment(self.latest_date).subtract(6, 'month').startOf('month'),
250
+ end: moment(self.latest_date).subtract(1, 'month').endOf('month')
251
+ }, {
252
+ label: 'Last year',
253
+ start: moment(self.latest_date).subtract(12, 'month').startOf('month'),
254
+ end: moment(self.latest_date).subtract(1, 'month').endOf('month')
255
+ }, {
256
+ label: 'All time',
257
+ start: self.earliest_date,
258
+ end: self.latest_date
259
+ }];
260
+
261
+ if (moment(self.latest_date).diff(moment(self.latest_date).startOf('month'), 'days') >= 6 &&
262
+ typeof self.settings.presets !== 'object'
263
+ ) {
264
+ presets.splice(1, 0, {
265
+ label: 'This month',
266
+ start: moment(self.latest_date).startOf('month'),
267
+ end: self.latest_date
268
+ });
269
+ }
270
+
271
+ $.each(presets, function(i, d) {
272
+ if (moment(d.start).isBefore(self.earliest_date)) {
273
+ d.start = self.earliest_date;
274
+ }
275
+ if (moment(d.start).isAfter(self.latest_date)) {
276
+ d.start = self.latest_date;
277
+ }
278
+ if (moment(d.end).isBefore(self.earliest_date)) {
279
+ d.end = self.earliest_date;
280
+ }
281
+ if (moment(d.end).isAfter(self.latest_date)) {
282
+ d.end = self.latest_date;
283
+ }
284
+
285
+ var startISO = moment(d.start).toISOString();
286
+ var endISO = moment(d.end).toISOString();
287
+ var string = moment(d.start).format(self.format.preset) + ' &ndash; ' + moment(d.end).format(self.format.preset);
288
+
289
+ if ($('.dr-preset-list', self.element).length) {
290
+ var item = $('.dr-preset-list .dr-list-item:nth-of-type(' + (i + 1) + ') .dr-item-aside', self.element);
291
+ item.data('start', startISO);
292
+ item.data('end', endISO);
293
+ item.html(string);
294
+ } else {
295
+ ul_presets.append('<li class="dr-list-item">' + d.label +
296
+ '<span class="dr-item-aside" data-start="' + startISO + '" data-end="' + endISO + '">' + string + '</span>' +
297
+ '</li>');
298
+ }
299
+ });
300
+
301
+ return ul_presets;
302
+ }
303
+
304
+
305
+ Calendar.prototype.calendarSetDates = function() {
306
+ $('.dr-date-start', this.element).html(moment(this.start_date).format(this.format.input));
307
+ $('.dr-date-end', this.element).html(moment(this.end_date).format(this.format.input));
308
+
309
+ if (!this.start_date && !this.end_date) {
310
+ var old_date = $('.dr-date', this.element).html();
311
+ var new_date = moment(this.current_date).format(this.format.input);
312
+
313
+ if (old_date.length === 0 && !this.required)
314
+ new_date = '';
315
+
316
+ if (old_date != new_date)
317
+ $('.dr-date', this.element).html(new_date);
318
+ }
319
+ }
320
+
321
+
322
+ Calendar.prototype.calendarSaveDates = function() {
323
+ if (this.type === 'double') {
324
+ if (!moment(this.orig_end_date).isSame(this.end_date) || !moment(this.orig_start_date).isSame(this.start_date))
325
+ return this.callback();
326
+ } else {
327
+ if (!this.required || !moment(this.orig_current_date).isSame(this.current_date))
328
+ return this.callback();
329
+ }
330
+ }
331
+
332
+ Calendar.prototype.calendarCheckDate = function(d) {
333
+ // Today
334
+ if (d === 'today' || d === 'now')
335
+ return moment().isAfter(this.latest_date) ? this.latest_date :
336
+ moment().isBefore(this.earliest_date) ? this.earliest_date : moment();
337
+
338
+ // Earliest
339
+ if (d === 'earliest')
340
+ return this.earliest_date;
341
+
342
+ // Latest
343
+ if (d === 'latest')
344
+ return this.latest_date;
345
+
346
+ // Convert string to a date if keyword ago or ahead exists
347
+ if (d && (/\bago\b/.test(d) || /\bahead\b/.test(d)))
348
+ return this.stringToDate(d);
349
+
350
+ var regex = /(?:\d)((?:st|nd|rd|th)?,?)/;
351
+ var d_array = d ? d.replace(regex, '').split(' ') : [];
352
+
353
+ // Add current year if year is not included
354
+ if (d_array.length == 2) {
355
+ d_array.push(moment().format(this.format.jump_year));
356
+ d = d_array.join(' ');
357
+ }
358
+
359
+ // Convert using settings format
360
+ var parsed_d = this.parseDate(d);
361
+
362
+ if (!parsed_d.isValid())
363
+ return moment(d); // occurs when parsing preset dates
364
+
365
+ return parsed_d;
366
+ }
367
+
368
+ Calendar.prototype.calendarCheckDates = function() {
369
+ var startTxt = $('.dr-date-start', this.element).html();
370
+ var endTxt = $('.dr-date-end', this.element).html();
371
+ var c = this.calendarCheckDate($(this.selected).html());
372
+ var s;
373
+ var e;
374
+
375
+ // Modify strings via some specific keywords to create valid dates
376
+ // Finally set all strings as dates
377
+ if (startTxt === 'ytd' || endTxt === 'ytd') { // Year to date
378
+ s = moment().startOf('year');
379
+ e = moment().endOf('year');
380
+ } else {
381
+ s = this.calendarCheckDate(startTxt);
382
+ e = this.calendarCheckDate(endTxt);
383
+ }
384
+
385
+ if (c.isBefore(this.earliest_date))
386
+ c = this.earliest_date;
387
+ if (s.isBefore(this.earliest_date))
388
+ s = this.earliest_date;
389
+ if (e.isBefore(this.earliest_date) || e.isBefore(s))
390
+ e = s.clone().add(6, 'day');
391
+
392
+ if (c.isAfter(this.latest_date))
393
+ c = this.latest_date;
394
+ if (e.isAfter(this.latest_date))
395
+ e = this.latest_date;
396
+ if (s.isAfter(this.latest_date) || s.isAfter(e))
397
+ s = e.clone().subtract(6, 'day');
398
+
399
+ // Push and save if it's valid otherwise return to previous state
400
+ if (this.type === 'double') {
401
+
402
+ // Is this a valid date?
403
+ if (s.isSame(e) && !this.sameDayRange)
404
+ return this.calendarSetDates();
405
+
406
+ this.start_date = s.isValid() ? s : this.start_date;
407
+ this.end_date = e.isValid() ? e : this.end_date;
408
+ }
409
+
410
+ this.current_date = c.isValid() ? c : this.current_date;
411
+ }
412
+
413
+
414
+ Calendar.prototype.stringToDate = function(str) {
415
+ var date_arr = str.split(' ');
416
+
417
+ if (date_arr[2] === 'ago') {
418
+ return moment(this.current_date).subtract(date_arr[0], date_arr[1]);
419
+ } else if (date_arr[2] === 'ahead') {
420
+ return moment(this.current_date).add(date_arr[0], date_arr[1]);
421
+ }
422
+
423
+ return this.current_date;
424
+ }
425
+
426
+
427
+ Calendar.prototype.calendarOpen = function(selected, switcher) {
428
+ var self = this;
429
+ var other;
430
+ var cal_width = $('.dr-dates', this.element).innerWidth() - 8;
431
+
432
+ this.selected = selected || this.selected;
433
+
434
+ if (this.presetIsOpen == true)
435
+ this.presetToggle();
436
+
437
+ if (this.calIsOpen == true) {
438
+ this.calendarClose(switcher ? 'switcher' : undefined);
439
+ } else if ($(this.selected).html().length) {
440
+ this.orig_start_date = this.start_date;
441
+ this.orig_end_date = this.end_date;
442
+ this.orig_current_date = this.current_date;
443
+ }
444
+
445
+ this.calendarCheckDates();
446
+ this.calendarCreate(switcher);
447
+ this.calendarSetDates();
448
+
449
+ var next_month = moment(switcher || this.current_date).add(1, 'month').startOf('month').startOf('day');
450
+ var past_month = moment(switcher || this.current_date).subtract(1, 'month').endOf('month');
451
+ var next_year = moment(switcher || this.current_date).add(1, 'year').startOf('month').startOf('day');
452
+ var past_year = moment(switcher || this.current_date).subtract(1, 'year').endOf('month');
453
+ var this_moment = moment(switcher || this.current_date);
454
+
455
+ $('.dr-month-switcher span', this.element)
456
+ .data('month', this_moment.month())
457
+ .html(this_moment.format(this.format.jump_month));
458
+ $('.dr-year-switcher span', this.element)
459
+ .data('year', this_moment.year())
460
+ .html(this_moment.format(this.format.jump_year));
461
+
462
+ $('.dr-switcher i', this.element).removeClass('dr-disabled');
463
+
464
+ if (next_month.isAfter(this.latest_date))
465
+ $('.dr-month-switcher .dr-right', this.element).addClass('dr-disabled');
466
+
467
+ if (past_month.isBefore(this.earliest_date))
468
+ $('.dr-month-switcher .dr-left', this.element).addClass('dr-disabled');
469
+
470
+ if (next_year.isAfter(this.latest_date))
471
+ $('.dr-year-switcher .dr-right', this.element).addClass('dr-disabled');
472
+
473
+ if (past_year.isBefore(this.earliest_date))
474
+ $('.dr-year-switcher .dr-left', this.element).addClass('dr-disabled');
475
+
476
+ $('.dr-day', this.element).on({
477
+ mouseenter: function() {
478
+ var selected = $(this);
479
+ var start_date = moment(self.start_date);
480
+ var end_date = moment(self.end_date);
481
+ var current_date = moment(self.current_date);
482
+
483
+ if ($(self.selected).hasClass("dr-date-start")) {
484
+ selected.addClass('dr-hover dr-hover-before');
485
+ $('.dr-start', self.element).css({
486
+ 'border': 'none',
487
+ 'padding-left': '0.3125rem'
488
+ });
489
+ setMaybeRange('start');
490
+ }
491
+
492
+ if ($(self.selected).hasClass("dr-date-end")) {
493
+ selected.addClass('dr-hover dr-hover-after');
494
+ $('.dr-end', self.element).css({
495
+ 'border': 'none',
496
+ 'padding-right': '0.3125rem'
497
+ });
498
+ setMaybeRange('end');
499
+ }
500
+
501
+ if (!self.start_date && !self.end_date)
502
+ selected.addClass('dr-maybe');
503
+
504
+ $('.dr-selected', self.element).css('background-color', 'transparent');
505
+
506
+ function setMaybeRange(type) {
507
+ other = undefined;
508
+
509
+ self.range(6 * 7).forEach(function(i) {
510
+ var next = selected.next().data('date');
511
+ var prev = selected.prev().data('date');
512
+ var curr = selected.data('date');
513
+
514
+ if (!curr)
515
+ return false;
516
+
517
+ if (!prev)
518
+ prev = curr;
519
+
520
+ if (!next)
521
+ next = curr;
522
+
523
+ if (type == 'start') {
524
+ if (moment(next).isSame(self.end_date) || (self.sameDayRange && moment(curr).isSame(self.end_date)))
525
+ return false;
526
+
527
+ if (moment(curr).isAfter(self.end_date)) {
528
+ other = other || moment(curr).add(6, 'day').startOf('day');
529
+
530
+ if (i > 5 || (next ? moment(next).isAfter(self.latest_date) : false)) {
531
+ $(selected).addClass('dr-end');
532
+ other = moment(curr);
533
+ return false;
534
+ }
535
+ }
536
+
537
+ selected = selected.next().addClass('dr-maybe');
538
+ } else if (type == 'end') {
539
+ if (moment(prev).isSame(self.start_date) || (self.sameDayRange && moment(curr).isSame(self.start_date)))
540
+ return false;
541
+
542
+ if (moment(curr).isBefore(self.start_date)) {
543
+ other = other || moment(curr).subtract(6, 'day');
544
+
545
+ if (i > 5 || (prev ? moment(prev).isBefore(self.earliest_date) : false)) {
546
+ $(selected).addClass('dr-start');
547
+ other = moment(curr);
548
+ return false;
549
+ }
550
+ }
551
+
552
+ selected = selected.prev().addClass('dr-maybe');
553
+ }
554
+ });
555
+ }
556
+ },
557
+ mouseleave: function() {
558
+ if ($(this).hasClass('dr-hover-before dr-end'))
559
+ $(this).removeClass('dr-end');
560
+
561
+ if ($(this).hasClass('dr-hover-after dr-start'))
562
+ $(this).removeClass('dr-start');
563
+
564
+ $(this).removeClass('dr-hover dr-hover-before dr-hover-after');
565
+ $('.dr-start, .dr-end', self.element).css({
566
+ 'border': '',
567
+ 'padding': ''
568
+ });
569
+ $('.dr-maybe:not(.dr-current)', self.element).removeClass('dr-start dr-end');
570
+ $('.dr-day', self.element).removeClass('dr-maybe');
571
+ $('.dr-selected', self.element).css('background-color', '');
572
+ }
573
+ });
574
+
575
+ if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
576
+ $('.dr-day', this.element).on({
577
+ touchstart: function() {
578
+ selectOneDate(other, self, $(this).data('date'));
579
+ }
580
+ });
581
+
582
+ $('div[contenteditable]', this.element).removeAttr('contenteditable');
583
+ } else {
584
+ $('.dr-day', this.element).on({
585
+ mousedown: function() {
586
+ selectOneDate(other, self, $(this).data('date'));
587
+ }
588
+ });
589
+ }
590
+
591
+ $('.dr-calendar', this.element)
592
+ .css('width', cal_width)
593
+ .slideDown(200);
594
+ $('.dr-input', this.element).addClass('dr-active');
595
+ $(selected).addClass('dr-active').focus();
596
+ this.element.addClass('dr-active');
597
+
598
+ this.calIsOpen = true;
599
+ }
600
+
601
+
602
+ Calendar.prototype.calendarClose = function(type) {
603
+ var self = this;
604
+
605
+ if (!this.calIsOpen || this.presetIsOpen || type == 'force') {
606
+ $('.dr-calendar', this.element).slideUp(200, function() {
607
+ $('.dr-day', self.element).remove();
608
+ });
609
+ } else {
610
+ $('.dr-day', this.element).remove();
611
+ }
612
+
613
+ if (type == 'switcher') {
614
+ return false;
615
+ }
616
+
617
+ $('.dr-input, .dr-date', this.element).removeClass('dr-active');
618
+ this.element.removeClass('dr-active');
619
+
620
+ this.calIsOpen = false;
621
+ }
622
+
623
+
624
+ Calendar.prototype.calendarCreate = function(switcher) {
625
+ var self = this;
626
+ var array = this.calendarArray(this.start_date, this.end_date, this.current_date, switcher);
627
+
628
+ array.forEach(function(d, i) {
629
+ var classString = "dr-day";
630
+
631
+ if (d.fade)
632
+ classString += " dr-fade";
633
+
634
+ if (d.start)
635
+ classString += " dr-start";
636
+
637
+ if (d.end)
638
+ classString += " dr-end";
639
+
640
+ if (d.current)
641
+ classString += " dr-current";
642
+
643
+ if (d.selected)
644
+ classString += " dr-selected";
645
+
646
+ if (d.outside)
647
+ classString += " dr-outside";
648
+
649
+ $('.dr-day-list', self.element).append('<li class="' + classString + '" data-date="' + d.date + '">' + d.str + '</li>');
650
+ });
651
+ }
652
+
653
+
654
+ Calendar.prototype.calendarArray = function(start, end, current, switcher) {
655
+ var self = this;
656
+ current = moment(current || start || end).startOf('day');
657
+
658
+ var reference = switcher || current || start || end;
659
+
660
+ var startRange = moment(reference).startOf('month').startOf('week');
661
+ var endRange = moment(startRange).add(6 * 7 - 1, 'days').endOf('day');
662
+
663
+ var daysInRange = [];
664
+ var d = moment(startRange);
665
+ while (d.isBefore(endRange)) {
666
+ daysInRange.push({
667
+ str: +d.format('D'),
668
+ start: start && d.isSame(start, 'day'),
669
+ end: end && d.isSame(end, 'day'),
670
+ current: current && d.isSame(current, 'day'),
671
+ selected: start && end && d.isBetween(start, end),
672
+ date: d.toISOString(),
673
+ outside: d.isBefore(self.earliest_date) || d.isAfter(self.latest_date),
674
+ fade: !d.isSame(reference, 'month')
675
+ });
676
+ d.add(1, 'd');
677
+ }
678
+
679
+ return daysInRange;
680
+ }
681
+
682
+
683
+ Calendar.prototype.calendarHTML = function(type) {
684
+ var ul_days_of_the_week = $('<ul class="dr-days-of-week-list"></ul>');
685
+ var days = this.days_array.splice(moment.localeData().firstDayOfWeek()).concat(this.days_array.splice(0, moment.localeData().firstDayOfWeek()));
686
+
687
+ $.each(days, function(i, elem) {
688
+ ul_days_of_the_week.append('<li class="dr-day-of-week">' + elem + '</li>');
689
+ });
690
+
691
+ if (type == "double")
692
+ return this.element.append('<div class="dr-input">' +
693
+ '<div class="dr-dates">' +
694
+ '<div class="dr-date dr-date-start" contenteditable>' + moment(this.start_date).format(this.format.input) + '</div>' +
695
+ '<span class="dr-dates-dash">&ndash;</span>' +
696
+ '<div class="dr-date dr-date-end" contenteditable>' + moment(this.end_date).format(this.format.input) + '</div>' +
697
+ '</div>' +
698
+
699
+ (this.presets ? '<div class="dr-presets">' +
700
+ '<span class="dr-preset-bar"></span>' +
701
+ '<span class="dr-preset-bar"></span>' +
702
+ '<span class="dr-preset-bar"></span>' +
703
+ '</div>' : '') +
704
+ '</div>' +
705
+
706
+ '<div class="dr-selections">' +
707
+ '<div class="dr-calendar" style="display: none;">' +
708
+ '<div class="dr-range-switcher">' +
709
+ '<div class="dr-switcher dr-month-switcher">' +
710
+ '<i class="dr-left"></i>' +
711
+ '<span>April</span>' +
712
+ '<i class="dr-right"></i>' +
713
+ '</div>' +
714
+ '<div class="dr-switcher dr-year-switcher">' +
715
+ '<i class="dr-left"></i>' +
716
+ '<span>2015</span>' +
717
+ '<i class="dr-right"></i>' +
718
+ '</div>' +
719
+ '</div>' +
720
+ ul_days_of_the_week[0].outerHTML +
721
+ '<ul class="dr-day-list"></ul>' +
722
+ '</div>' +
723
+ (this.presets ? this.presetCreate()[0].outerHTML : '') +
724
+ '</div>');
725
+
726
+ return this.element.append('<div class="dr-input">' +
727
+ '<div class="dr-dates">' +
728
+ '<div class="dr-date" contenteditable placeholder="' + this.placeholder + '">' + (this.settings.current_date ? moment(this.current_date).format(this.format.input) : '') + '</div>' +
729
+ '</div>' +
730
+ '</div>' +
731
+
732
+ '<div class="dr-selections">' +
733
+ '<div class="dr-calendar" style="display: none;">' +
734
+ '<div class="dr-range-switcher">' +
735
+ '<div class="dr-switcher dr-month-switcher">' +
736
+ '<i class="dr-left"></i>' +
737
+ '<span></span>' +
738
+ '<i class="dr-right"></i>' +
739
+ '</div>' +
740
+ '<div class="dr-switcher dr-year-switcher">' +
741
+ '<i class="dr-left"></i>' +
742
+ '<span></span>' +
743
+ '<i class="dr-right"></i>' +
744
+ '</div>' +
745
+ '</div>' +
746
+ ul_days_of_the_week[0].outerHTML +
747
+ '<ul class="dr-day-list"></ul>' +
748
+ '</div>' +
749
+ '</div>');
750
+ }
751
+
752
+
753
+ Calendar.prototype.parseDate = function(d) {
754
+ if (moment.defaultZone !== null && moment.hasOwnProperty('tz')) {
755
+ return moment.tz(d, this.format.input, moment.defaultZone.name);
756
+ } else {
757
+ return moment(d, this.format.input);
758
+ }
759
+ }
760
+
761
+
762
+ Calendar.prototype.range = function(length) {
763
+ var range = new Array(length);
764
+
765
+ for (var idx = 0; idx < length; idx++) {
766
+ range[idx] = idx;
767
+ }
768
+
769
+ return range;
770
+ }
771
+
772
+ function selectOneDate(other, cal, date) {
773
+ var string = moment(date).format(cal.format.input);
774
+
775
+ if (other) {
776
+ $('.dr-date', cal.element)
777
+ .not(cal.selected)
778
+ .html(other.format(cal.format.input));
779
+ }
780
+
781
+ $(cal.selected).html(string);
782
+ cal.calendarOpen(cal.selected);
783
+
784
+ if ($(cal.selected).hasClass('dr-date-start')) {
785
+ $('.dr-date-end', cal.element).trigger('click');
786
+ } else {
787
+ cal.calendarSaveDates();
788
+ cal.calendarClose('force');
789
+ }
790
+ }
791
+
792
+
793
+ return Calendar;
794
+ }));