rrule_form 0.1.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 46c950517d003d7d7362478d9722259a019bc09b555b331fc8a2d7cc89a8fb2f
4
+ data.tar.gz: d17e280fe95f05169df20e0b2143e786b5e4aac53c350ace5e99efd9683d983a
5
+ SHA512:
6
+ metadata.gz: 486569f6cd45c337a5d99408d9d5b9406a56344cec9783a7a373d86ab95b3e5c6e6105aa80ddc938d16754f42b7b76b0344650037032547f2b800c87f5a13526
7
+ data.tar.gz: 84550791f37a928570ae3f0d4ce016fe2814fefccbd5c381797c1a97eae3e91e3909934596a9d43121d47c1909287aadec77e6251390c96dc41a6cd43935ca51
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 2.7.0
6
+ before_install: gem install bundler -v 2.1.4
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rrule_form.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "rspec", "~> 3.0"
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 ravi-bebble
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # RruleForm
2
+ This is a gem wrapping up the javascript and html required for collecting rrule string.
3
+
4
+ The gem inspired from https://github.com/superherogeek/rrule-generator-form
5
+
6
+ ## Installation
7
+
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'rrule_form'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle install
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install rrule_form
22
+
23
+ Add following to application.js
24
+
25
+ ```javascript
26
+ //= require rrule-gui.js
27
+ ```
28
+
29
+ The javascript under this gem needs some dependencies required:
30
+
31
+ 1. jquery
32
+ 1. jquery-ui/widgets/datepicker
33
+ 1. bootstrap css for stylesheets
34
+ 1. bootstrap js for modal usage
35
+
36
+ The javascript part of this gem handles the form manipulation of the form
37
+
38
+
39
+ ## Usage
40
+
41
+ This gem will provide with a helper which will.
42
+ ```ruby
43
+ rrule_form_for(selector, callback=nil)
44
+ ```
45
+
46
+ selector would be jquery selector for the field to be assigned with rrule field.
47
+
48
+ ## Development
49
+
50
+ This gem is in draft state to provide the basic working of a form that handles all types of recurrence.
51
+
52
+ ## Contributing
53
+
54
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ravi-ture/rrule_form.
55
+
56
+
57
+ ## License
58
+
59
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,10 @@
1
+ module RruleForm
2
+ module ApplicationHelper
3
+
4
+ def rrule_form_for(selector, callback=nil)
5
+ return nil if selector.blank?
6
+ render( partial: 'rrule/rrule_form', locals: {selector: selector, callback: callback})
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,143 @@
1
+
2
+ <div class="modal" tabindex="-1" role="dialog" id='rrule_form_modal-<%= selector.gsub(/[^\w\s]/, '_') %>'>
3
+ <div class="modal-dialog" role="document">
4
+ <div class="modal-content">
5
+ <div class="modal-header">
6
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
7
+ <span aria-hidden="true">&times;</span>
8
+ </button>
9
+ <h3 class="modal-title">Set Recurrence Rule</h3>
10
+ </div>
11
+ <div class="modal-body">
12
+ <form name="rrule[<%= selector.gsub(/[^\w\s]/, '_') %>]" id="rrule-<%= selector.gsub(/[^\w\s]/, '_') %>" class='rrule-form' action='javascript:void(0);'>
13
+ <p>Start Date: <input type="text" class="datepicker" id="start-date-rrule" /></p>
14
+ <input type="hidden" name="start-date-formatted" id="start-date-hidden" value="" />
15
+ <!-- <p> End Date: <input type="text" class="datepicker" id="start-date" /></p> -->
16
+ <p>Recurring Event?
17
+ <input type="radio" name="event-recurring" value="no" checked="checked" /> No
18
+ <input type="radio" name="event-recurring" value="yes" /> Yes
19
+ </p>
20
+ <div id="recurring-rules" style="display:none;">
21
+ <!-- FREQ -->
22
+ <p>
23
+ Frequency
24
+ <select name="freq">
25
+ <option value="daily" class="days">Daily</option>
26
+ <option value="weekly" class="weeks">Weekly</option>
27
+ <option value="monthly" class="months">Monthly</option>
28
+ <option value="yearly" class="years">Yearly</option>
29
+ </select>
30
+ </p>
31
+ <p>Every <input type="text" name="interval" value="1" size="2" /> <span class="freq-selection">day(s)</span>
32
+ </p>
33
+ <!-- BYWEEKDAY -->
34
+ <div id="weekday-select" class="btn-toolbar weeks-choice" role="toolbar" style="display:none;">
35
+ <b>Which day(s) of the week does this repeat on:</b>
36
+ <div class="btn-group">
37
+ <% %w{SUN MON TUE WED THU FRI SAT}.each do |wday| %>
38
+ <button class="btn btn-default" id="<%= wday.first(2) %>"><%= wday.titleize %></button>
39
+ <% end %>
40
+ </div>
41
+ </div>
42
+ <!-- BYMONTH -->
43
+ <div id="bymonth-select" class="btn-toolbar years-choice" role="toolbar" style="display:none;">
44
+ <span>Which month(s) of the year does this repeat on</span>
45
+ <p><input type="radio" name="yearly-options" id="yearly-one-month" checked="checked" /> One Month Out of the Year</p>
46
+ on
47
+ <select name="yearly-bymonth" id="yearly-bymonth" class="yearly-one-month">
48
+ <% I18n.t("date.month_names").compact.each_with_index do |month, index| %>
49
+ <option value="<%= index + 1 %>"><%= month %></option>
50
+ <% end %>
51
+ </select>
52
+ <select name="yearly-bymonthday" id="yearly-bymonthday" class="yearly-one-month">
53
+ <% (1..31).each do |index| %>
54
+ <option value="<%= index %>"><%= index %></option>
55
+ <% end %>
56
+ </select>
57
+ <p><input type="radio" name="yearly-options" id="yearly-multiple-months" /> Multiple Months</p>
58
+ <% I18n.t("date.abbr_month_names").compact.in_groups_of(6).each do |month_grp| %>
59
+ <div style="display:block;float:none;" class="btn-group yearly-multiple-months">
60
+ <% month_grp.each do |month| %>
61
+ <button class="btn btn-default" style="width:16.66666666666667%" data-month-num="<%= I18n.t("date.abbr_month_names").compact.index(month) + 1%>" disabled="disabled"><%= month %></button>
62
+ <% end %>
63
+ </div>
64
+ <% end %>
65
+ <p><input type="radio" name="yearly-options" id="yearly-precise" /> Or be precise</p>
66
+ on the
67
+ <select name="yearly-bysetpos" class="yearly-precise" disabled="disabled">
68
+ <option value="1" selected="selected">First</option>
69
+ <option value="2">Second</option>
70
+ <option value="3">Third</option>
71
+ <option value="4">Fourth</option>
72
+ <option value="-1">Last</option>
73
+ </select>
74
+ <select name="yearly-byday" class="yearly-precise" disabled="disabled">
75
+ <% Date::DAYNAMES.each do |day| %>
76
+ <option value="<%= day.first(2).upcase %>"><%= day %></option>
77
+ <% end %>
78
+ <option value="SU,MO,TU,WE,TH,FR,SA" selected="selected">Day</option>
79
+ <option value="MO,TU,WE,TH,FR">Weekday</option>
80
+ <option value="SU,SA">Weekend day</option>
81
+ </select>
82
+ in
83
+ <select name="yearly-bymonth-with-bysetpos-byday" id="yearly-bymonth-with-bysetpos-byday" class="yearly-precise" disabled="disabled">
84
+ <% I18n.t("date.month_names").compact.each_with_index do |month, index| %>
85
+ <option value="<%= index + 1 %>"><%= month %></option>
86
+ <% end %>
87
+ </select>
88
+ </div>
89
+ <!-- BYMONTHDAY -->
90
+ <div id="monthday-select" class="btn-toolbar months-choice" role="toolbar" style="display:none;">
91
+ <input type="radio" name="monthday-pos-select" value="monthday-selected" id="monthday-selected" checked="checked" />
92
+ <b>Which day(s) of the month does this repeat on</b>
93
+ <% (1..31).to_a.in_groups_of(7).each do |date_grp| %>
94
+ <div class="btn-group" style="display:block;float:none;">
95
+ <% date_grp.compact.each do |date| %>
96
+ <button class="btn btn-default" style="width:14.28571428571429%;" data-day-num="<%= date %>"><%= date %></button>
97
+ <% end %>
98
+ </div>
99
+ <% end %>
100
+ <!-- BYDAY -->
101
+ <div>
102
+ <input type="radio" name="monthday-pos-select" value="month-byday-pos-selected" id="month-byday-pos-selected" /> Or
103
+ <select name="month-byday-pos" disabled="yes">
104
+ <option value="1" selected="selected">First</option>
105
+ <option value="2">Second</option>
106
+ <option value="3">Third</option>
107
+ <option value="4">Fourth</option>
108
+ <option value="-1">Last</option>
109
+ </select>
110
+ <select name="month-byday-pos-name" disabled="yes">
111
+ <% Date::DAYNAMES.each do |day| %>
112
+ <option value="<%= day.first(2).upcase %>"><%= day %></option>
113
+ <% end %>
114
+ <option value="SU,MO,TU,WE,TH,FR,SA" selected="selected">Day</option>
115
+ <option value="MO,TU,WE,TH,FR">Weekday</option>
116
+ <option value="SU,SA">Weekend day</option>
117
+ </select>
118
+ </div>
119
+ </div>
120
+ <div id="until-rules" style="display:none;">
121
+ <p>Until</p>
122
+ <p> <label for="count-select"><input type="radio" name="end-select" value="count" id="count-select" checked="checked"/> How many times does this transaction occur?
123
+ <input autocomplete="off" type="number" name="count" min="1" max="50" value="1" step="1"/> Time(s)</label>
124
+ </p>
125
+ <p><label for="until-select"><input type="radio" name="end-select" value="until" id="until-select" /> Specific Date (aka until)
126
+ <input type="text" name="until" id="end-date-rrule" disabled="yes" />
127
+ <input type="hidden" name="end-date-formatted" id="end-date-hidden" value="" /></label>
128
+ </p>
129
+ </div>
130
+ <input type="submit" name="submit" value="submit" />
131
+ </div>
132
+ <div class="show-dates"></div>
133
+ <div class="readout"></div>
134
+ <!-- End Recurrence Form -->
135
+ </form>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ </div>
140
+
141
+ <script type="text/javascript">
142
+ RruleForm.initialize('<%= selector %>', '<%= callback %>');
143
+ </script>
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rrule_form"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/lib/rrule_form.rb ADDED
@@ -0,0 +1,17 @@
1
+ require "rrule_form/version"
2
+
3
+ module RruleForm
4
+ class Error < StandardError; end
5
+
6
+ module Rails
7
+ class Engine < ::Rails::Engine
8
+
9
+ isolate_namespace RruleForm
10
+ initializer 'local_helper.action_controller' do
11
+ ActiveSupport.on_load :action_controller do
12
+ helper RruleForm::ApplicationHelper
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module RruleForm
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,29 @@
1
+ require_relative 'lib/rrule_form/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "rrule_form"
5
+ spec.version = RruleForm::VERSION
6
+ spec.authors = ["ravi-ture"]
7
+ spec.email = ["raviture@gmail.com"]
8
+
9
+ spec.summary = %q{Wrapper for rrule-generater-form}
10
+ spec.description = %q{This is a rails wrapper for rrule-generater-form jquery plugin}
11
+ spec.homepage = "https://github.com/ravi-ture/rrule_form"
12
+ spec.license = "MIT"
13
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
14
+
15
+ spec.metadata["homepage_uri"] = spec.homepage
16
+ spec.metadata["source_code_uri"] = "https://github.com/ravi-ture/rrule_form"
17
+ spec.metadata["changelog_uri"] = "https://github.com/ravi-ture/rrule_form"
18
+ spec.add_dependency "rails"
19
+ spec.add_dependency "sass"
20
+ spec.add_dependency "sass-rails"
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+ end
@@ -0,0 +1,849 @@
1
+ /*
2
+
3
+ RRULE GENERATOR FORM aka RRULE GUI
4
+
5
+ MIT License
6
+
7
+ Copyright (c) 2016 Jordan Roberts
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ of this software and associated documentation files (the "Software"), to deal
11
+ in the Software without restriction, including without limitation the rights
12
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included in all
17
+ copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ SOFTWARE.
26
+
27
+
28
+ */
29
+ RruleForm = {
30
+ readRule: function(rrule) {
31
+
32
+ rrule = typeof rrule !== 'undefined' ? rrule : '';
33
+
34
+ if (rrule != '') {
35
+ // Break down the rule by semi-colons first
36
+ var items = rrule.split(';');
37
+ var recur = [];
38
+ for (i = 0; i < items.length; i++) {
39
+ if (items[i] !== '') {
40
+ temp = items[i].split('=');
41
+ }
42
+ recur[temp[0]] = temp[1];
43
+ }
44
+ console.log(recur);
45
+
46
+ // See if the recurring rule has enough valid parts
47
+ if (recur.FREQ && recur.DTSTART && (recur.COUNT || recur.UNTIL)) {
48
+ recurringRule = {
49
+ freq: recur.FREQ,
50
+ dtstart: recur.DTSTART,
51
+ interval: recur.INTERVAL,
52
+ byday: "",
53
+ bysetpos: "",
54
+ bymonthday: "",
55
+ bymonth: "",
56
+ count: "",
57
+ until: ""
58
+
59
+ };
60
+
61
+ // Set either COUNT or UNTIL
62
+ if (typeof recur.COUNT == 'undefined' && recur.UNTIL) {
63
+ recurringRule.until = recur.UNTIL;
64
+
65
+ } else if (typeof recur.UNTIL == 'undefined' && recur.COUNT) {
66
+ recurringRule.count = recur.COUNT;
67
+ }
68
+
69
+ // Set INTERVAL
70
+ $('input[name="interval"]').val(recur.INTERVAL);
71
+
72
+
73
+ // Setup start-date picker
74
+ startYear = recur.DTSTART.substring(0, 4);
75
+ startMonth = recur.DTSTART.substring(4, 6);
76
+ startDay = recur.DTSTART.substring(6, 8);
77
+ //alert(startYear + startMonth + startDay);
78
+ $('#start-date-rrule').val(startYear + '-' + startMonth + '-' + startDay);
79
+ $('#start-date-hidden').val(startYear + startMonth + startDay + 'T040000z');
80
+
81
+ // Setup start-date picker
82
+ $('#start-date-rrule').datepicker({
83
+ showOtherMonths: true,
84
+ selectOtherMonths: true,
85
+ dateFormat: 'yy-mm-dd',
86
+ onSelect: function(value) {
87
+
88
+ dateSelected = new Date(value + ' 00:00:00');
89
+ dtstartString = dateSelected.getFullYear() + ('0' + (dateSelected.getMonth() + 1)).slice(-2) + ('0' + dateSelected.getDate()).slice(-2);
90
+ $('#start-date-hidden').val(dtstartString + 'T040000z');
91
+ recurringRule.dtstart = dtstartString + 'T040000z';
92
+
93
+ // Set minimum selected date on end-datepicker
94
+ minEndDate = dateSelected.getFullYear() + '-' + ('0' + (dateSelected.getMonth() + 1)).slice(-2) + '-' + ('0' + dateSelected.getDate()).slice(-2);
95
+ $('#end-date-rrule').datepicker('option', 'minDate', minEndDate);
96
+ // Reset the selected enddate
97
+ $('#end-date-hidden').val(dtstartString + 'T040000z');
98
+
99
+ }
100
+ }).datepicker('setDate', 'today');
101
+
102
+
103
+ // Setup the end-date picker
104
+ $('#end-date-rrule').datepicker({
105
+ showOtherMonths: true,
106
+ selectOtherMonths: true,
107
+ dateFormat: 'yy-mm-dd',
108
+ onSelect: function(value) {
109
+ dateSelected = new Date(value + ' 00:00:00');
110
+ untilString = dateSelected.getFullYear() + ('0' + (dateSelected.getMonth() + 1)).slice(-2) + ('0' + dateSelected.getDate()).slice(-2);
111
+ $('#end-date-hidden').val(untilString + 'T040000z');
112
+ // Remove the count variable
113
+ recurringRule.count = '';
114
+ // Set until variable
115
+ recurringRule.until = untilString + 'T040000z';
116
+ }
117
+ }).datepicker('setDate', 'today');
118
+
119
+ if (recur.UNTIL) {
120
+ // Setup end date picker
121
+ endYear = recur.UNTIL.substring(0, 4);
122
+ endMonth = recur.UNTIL.substring(4, 6);
123
+ endDay = recur.UNTIL.substring(6, 8);
124
+
125
+ $('#end-date-rrule').val(endYear + '-' + endMonth + '-' + endDay);
126
+ $('#end-date-hidden').val(endYear + endMonth + endDay + 'T040000z');
127
+
128
+ // Set ENDDATE radio to yes
129
+ $('input[name="end-select"]').prop('checked', true);
130
+ }
131
+
132
+ // Set Recurring event radio to yes
133
+ $('input[name="event-recurring"]').prop('checked', true);
134
+
135
+ // Show Recurring rules
136
+ $('#recurring-rules').slideDown();
137
+
138
+ // Show Until Rules
139
+ $('#until-rules').show();
140
+
141
+
142
+ switch (recur.FREQ) {
143
+
144
+ case ("DAILY"):
145
+
146
+ break;
147
+
148
+ case ("WEEKLY"):
149
+ // Selectbox FREQ = monthly
150
+ $('select[name="freq"]').val('weekly');
151
+
152
+ // Hide all DIVS
153
+ $('#recurring-rules > div').hide();
154
+
155
+ // Show selected DIV
156
+ $('div.' + 'weeks-choice').show();
157
+ $('span.freq-selection').text('week(s)');
158
+
159
+ // Show Until / Count Rules
160
+ $('#until-rules').show();
161
+
162
+ if (typeof recur.BYDAY !== 'undefined') {
163
+
164
+ // Split up the individual bymonthdays
165
+ bydays = recur.BYDAY.split(',');
166
+
167
+ // Loop through the BYDAYs
168
+ for (v = 0; v < bydays.length; v++) {
169
+ console.log(bydays[v]);
170
+ // Set select monthday buttons to active
171
+ $('#weekday-select button[id="' + bydays[v] + '"]').addClass('active')
172
+ }
173
+ recurringRule.byday = recur.BYDAY;
174
+
175
+ return true;
176
+ }
177
+
178
+ break;
179
+
180
+ case ("MONTHLY"):
181
+ // Selectbox FREQ = monthly
182
+ $('select[name="freq"]').val('monthly');
183
+
184
+ // Hide all DIVS
185
+ $('#recurring-rules > div').hide();
186
+
187
+ // Show selected DIV
188
+ $('div.' + 'months-choice').show();
189
+ $('span.freq-selection').text('month(s)');
190
+
191
+ // Show Until / Count Rules
192
+ $('#until-rules').show();
193
+
194
+ if (typeof recur.BYMONTHDAY !== 'undefined') {
195
+
196
+ // Split up the individual bymonthdays
197
+ bymonthdays = recur.BYMONTHDAY.split(',');
198
+
199
+ // Loop through the BYMONTHDAYs
200
+ for (v = 0; v < bymonthdays.length; v++) {
201
+ console.log(bymonthdays[v]);
202
+ // Set select monthday buttons to active
203
+ $('#monthday-select button[data-day-num="' + bymonthdays[v] + '"]').addClass('active')
204
+ }
205
+ recurringRule.bymonthday = recur.BYMONTHDAY;
206
+
207
+ return true;
208
+ }
209
+
210
+ if (typeof recur.BYSETPOS !== 'undefined' && typeof recur.BYDAY !== 'undefined') {
211
+
212
+ // Set Radio Button
213
+ $('input#month-byday-pos-selected').prop('checked', true);
214
+
215
+ // alert(recur.BYDAY);
216
+ $('select[name^="month-byday"]').removeAttr('disabled');
217
+
218
+ // Set values
219
+ $('select[name="month-byday-pos"]').val(recur.BYSETPOS);
220
+ $('select[name="month-byday-pos-name"]').val(recur.BYDAY);
221
+
222
+
223
+ //Disable day buttons
224
+ $('#monthday-select button').attr('disabled', 'disabled');
225
+
226
+ recurringRule.bysetpos = recur.BYSETPOS;
227
+ recurringRule.byday = recur.BYDAY;
228
+
229
+ return true;
230
+ }
231
+
232
+
233
+
234
+ break;
235
+
236
+ case ("YEARLY"):
237
+ // Selectbox FREQ = monthly
238
+ $('select[name="freq"]').val('yearly');
239
+
240
+ // Hide all DIVS
241
+ $('#recurring-rules > div').hide();
242
+
243
+ // Show selected DIV
244
+ $('div.' + 'years-choice').show();
245
+ $('span.freq-selection').text('year(s)');
246
+
247
+ // Show Until / Count Rules
248
+ $('#until-rules').show();
249
+
250
+ // BYMONTH and BYMONTHDAY attributes are going to be set
251
+ if (typeof recur.BYMONTHDAY !== 'undefined' && typeof recur.BYMONTH !== 'undefined') {
252
+
253
+ // Set Radio Button
254
+ $('input#yearly-one-month').prop('checked', true);
255
+
256
+ // alert(recur.BYDAY);
257
+ $('select[name="yearly-bymonth"]').removeAttr('disabled');
258
+ $('select[name="yearly-bymonthday"]').removeAttr('disabled');
259
+
260
+ // Set values
261
+ $('select[name="yearly-bymonth"]').val(recur.BYMONTH);
262
+ $('select[name="yearly-bymonthday"]').val(recur.BYMONTHDAY);
263
+
264
+
265
+ recurringRule.bymonth = recur.BYMONTH;
266
+ recurringRule.bymonthday = recur.BYMONTHDAY;
267
+
268
+ return true;
269
+ }
270
+
271
+ // Multiple Month Selection
272
+ if (typeof recur.BYMONTH !== 'undefined' && typeof recur.BYMONTHDAY == 'undefined') {
273
+ // Disable yearly select boxes
274
+ $('select[name^=yearly-').attr('disabled', 'disabled');
275
+ // Set Radio Button
276
+ $('input#yearly-multiple-months').prop('checked', true);
277
+
278
+ // Make buttons active
279
+ $('.yearly-multiple-months button').removeAttr('disabled');
280
+ // Split up the individual bymonthdays
281
+ bymonth = recur.BYMONTH.split(',');
282
+
283
+ // Loop through the BYMONTHDAYs
284
+ for (v = 0; v < bymonth.length; v++) {
285
+ console.log(bymonth[v]);
286
+ // Set select monthday buttons to active
287
+ $('.yearly-multiple-months button[data-month-num="' + bymonth[v] + '"]').addClass('active')
288
+ }
289
+ recurringRule.bymonth = recur.BYMONTH;
290
+
291
+ return true;
292
+ }
293
+
294
+ // Precise Yearly Selection
295
+ if (typeof recur.BYMONTH !== 'undefined' && typeof recur.BYDAY !== 'undefined' && typeof recur.BYSETPOS !== 'undefined') {
296
+ // Disable yearly select boxes
297
+ $('select[name^=yearly-').attr('disabled', 'disabled');
298
+
299
+ // Enable the right select
300
+ $('select[class=yearly-precise').removeAttr('disabled');
301
+
302
+ // Set Radio Button
303
+ $('input#yearly-precise').prop('checked', true);
304
+
305
+ // Set select values
306
+ $('select[name="yearly-byday"]').val(recur.BYDAY);
307
+ $('select[name="yearly-bysetpos"]').val(recur.BYSETPOS);
308
+
309
+ recurringRule.bymonth = recur.BYMONTH;
310
+ recurringRule.byday = recur.BYDAY;
311
+ recurringRule.bysetpos = recur.BYSETPOS;
312
+
313
+ return true;
314
+ }
315
+
316
+
317
+ break;
318
+
319
+ }
320
+
321
+ }
322
+ }
323
+
324
+ return false;
325
+
326
+ },
327
+
328
+ readRuleState: false,
329
+ resetOptions: function() {
330
+
331
+ // Format the date (http://stackoverflow.com/questions/3605214/javascript-add-leading-zeroes-to-date)
332
+ today = new Date();
333
+ MyDateString = today.getFullYear() + ('0' + (today.getMonth() + 1)).slice(-2) + ('0' + today.getDate()).slice(-2);
334
+
335
+ // Reset all the selected rules
336
+ recurringRule = {
337
+ freq: "daily",
338
+ dtstart: MyDateString + 'T040000z',
339
+ interval: "1",
340
+ byday: "",
341
+ bysetpos: "",
342
+ bymonthday: "",
343
+ bymonth: "",
344
+ count: "",
345
+ until: MyDateString + 'T040000z'
346
+
347
+ };
348
+
349
+ // Reset all button states and input values
350
+ $('button').removeClass('active');
351
+
352
+ // Reset back interval label to 'days'
353
+ $('span.freq-selection').text('days');
354
+
355
+ // Hide all but the daily options
356
+
357
+ $('#monthday-select,#bymonth-select,#weekday-select').hide();
358
+
359
+ // Reset Interval back to 1
360
+ $('input[name="interval"]').val("1");
361
+
362
+ // Reset Count back to 1
363
+ $('input[name="count"]').val("1");
364
+
365
+
366
+ // Change back Daily
367
+ $('select[name="freq"]').val('daily');
368
+
369
+ // Reset Until / Count radio buttons
370
+ $('input[id="until-select"]').prop('checked', false);
371
+ $('input[id="count-select"]').prop('checked', true).change();
372
+ // $('#count').reset();
373
+ },
374
+ rruleGenerate: function() {
375
+ // Produce RRULE state to feed to rrule.js
376
+ rrule = "";
377
+
378
+ // Check to be sure there is a count value or until date selected
379
+ if (recurringRule.count == "" && recurringRule.until == "") {
380
+ // No end in sight, make it default to 1 occurence
381
+ recurringRule.count = "1";
382
+ }
383
+ for (var key in recurringRule) {
384
+ if (recurringRule.hasOwnProperty(key)) {
385
+ if (recurringRule[key] != '') {
386
+ rrule += key + '=' + recurringRule[key] + ';';
387
+ }
388
+ }
389
+ }
390
+ // Remove the last semicolon from the end of RRULE
391
+ rrule = rrule.replace(/;\s*$/, "");
392
+
393
+ // Convert to Uppercase and return
394
+ return rrule.toUpperCase();
395
+ },
396
+ initialize: function(selector, callback) {
397
+ if (!$(selector).length) return;
398
+
399
+ $('<a class="btn btn-small btn-default" data-toggle="modal" data-target="#rrule_form_modal-' + selector.replace(/[^\w\s]/g, '_') + '" href="#">change</a>').insertAfter($(selector)[0])
400
+ if ($(selector).val() != '') {
401
+ RruleForm.readRule($(selector).val())
402
+ } else {
403
+ RruleForm.resetOptions();
404
+ // Setup start-date picker
405
+ $('#start-date-rrule').datepicker({
406
+ showOtherMonths: true,
407
+ selectOtherMonths: true,
408
+ dateFormat: 'dd/mm/yy',
409
+ onSelect: function(value) {
410
+
411
+ dateSelected = new Date(value.replace(/-/g, "/") + ' 00:00:00'); // REGEX used to please SAFARI browser!
412
+ dtstartString = dateSelected.getFullYear() + ('0' + (dateSelected.getMonth() + 1)).slice(-2) + ('0' + dateSelected.getDate()).slice(-2);
413
+ $('#start-date-hidden').val(dtstartString + 'T040000z');
414
+ recurringRule.dtstart = dtstartString + 'T040000z';
415
+
416
+ // Set minimum selected date on end-datepicker
417
+ minEndDate = dateSelected.getFullYear() + '-' + ('0' + (dateSelected.getMonth() + 1)).slice(-2) + '-' + ('0' + dateSelected.getDate()).slice(-2);
418
+ $('#end-date-rrule').datepicker('option', 'minDate', minEndDate);
419
+ // Reset the selected enddate
420
+ $('#end-date-hidden').val(dtstartString + 'T040000z');
421
+ //alert(dateSelected);
422
+ }
423
+ }).datepicker('setDate', 'today');
424
+
425
+ $('#start-date-hidden').val(MyDateString + 'T000000z');
426
+
427
+ // Setup the end-date picker
428
+ $('#end-date-rrule').datepicker({
429
+ showOtherMonths: true,
430
+ selectOtherMonths: true,
431
+ dateFormat: 'dd/mm/yy',
432
+ onSelect: function(value) {
433
+ //dateSelected = Date.parseExact(value, "yyyy-MM-dd");
434
+ dateSelected = new Date(value.replace(/-/g, "/") + ' 00:00:00'); // REGEX used to please SAFARI browser!
435
+ untilString = dateSelected.getFullYear() + ('0' + (dateSelected.getMonth() + 1)).slice(-2) + ('0' + dateSelected.getDate()).slice(-2);
436
+ $('#end-date-hidden').val(untilString + 'T040000z');
437
+ // Remove the count variable
438
+ recurringRule.count = '';
439
+ // Set until variable
440
+ recurringRule.until = untilString + 'T040000z';
441
+
442
+ //alert(dateSelected);
443
+ }
444
+ }).datepicker('setDate', 'today');
445
+
446
+
447
+ $('#end-date-hidden').val(MyDateString + 'T040000z');
448
+
449
+ }
450
+
451
+
452
+ // Setup buttons Don't allow any buttons to submit the form
453
+ $('button').click(function(e) {
454
+ e.preventDefault;
455
+ return false;
456
+ });
457
+
458
+
459
+
460
+ // Recurring Event Calculator: Show/Hide. Grab all the radio buttons to see which one.
461
+ $('input[name="event-recurring"]').change(function() {
462
+
463
+ // Resets all the recurring options
464
+ RruleForm.resetOptions();
465
+ // enable the input next to the selected radio button
466
+ if ($(this).val() == "yes") {
467
+ $('#recurring-rules').slideDown();
468
+
469
+ // Show Until Rules
470
+ $('#until-rules').show();
471
+
472
+ } else {
473
+ //disable the inputs not selected.
474
+ $('#recurring-rules').hide();
475
+ }
476
+
477
+ });
478
+
479
+
480
+
481
+ // FREQ Selection
482
+ $(document).on('change', 'select[name="freq"]', function() {
483
+
484
+ selectedFrequency = $('select[name="freq"] option:selected').attr('class');
485
+
486
+ // Hide all DIVS
487
+ $('#recurring-rules > div').hide();
488
+
489
+ // Show selected DIV
490
+ $('div.' + selectedFrequency + '-choice').show();
491
+ $('span.freq-selection').text(selectedFrequency);
492
+
493
+ // Show Until / Count Rules
494
+ $('#until-rules').show();
495
+
496
+
497
+ // Reset all the selected rules
498
+ recurringRule = {
499
+ freq: "",
500
+ dtstart: $('#start-date-hidden').val(),
501
+ interval: "1",
502
+ byday: "",
503
+ bysetpos: "",
504
+ bymonthday: "",
505
+ bymonth: "",
506
+ count: "1",
507
+ until: ""
508
+
509
+ };
510
+
511
+ // Set frequency
512
+ recurringRule.freq = $('select[name="freq"] option:selected').val();
513
+
514
+ // If it is yearly, fire a change to setup the default values
515
+ if (recurringRule.freq == "yearly") {
516
+ $('select[name="yearly-bymonth"]').change();
517
+ }
518
+
519
+ });
520
+
521
+ // Interval Selection
522
+ $(document).on('change blur keyup', 'input[name="interval"]', function() {
523
+ recurringRule.interval = $(this).val();
524
+
525
+ });
526
+
527
+ // BYDAY - FREQ: WEEKLY Selection
528
+ $('#weekday-select button').on('click', function() {
529
+ $(this).toggleClass('active');
530
+ var byday = []; // Array to Store 'byday' in. Reset it to '' to store new days in below
531
+
532
+ // Store Selected Days in the BYDAY rule
533
+ $('#weekday-select button').each(function() {
534
+
535
+ // Active class is the selected day, store the ID of active days which contains the short day name for the rrule (ex. MO, TU, WE, etc)
536
+ if ($(this).hasClass('active')) {
537
+ byday.push($(this).attr('id'));
538
+ }
539
+
540
+ });
541
+ recurringRule.byday = byday;
542
+
543
+ });
544
+
545
+ // BYMONTHDAY Selection
546
+ $('#monthday-select button').on('click', function() {
547
+ $(this).toggleClass('active');
548
+ var bymonthday = []; // Array to Store 'bymonthday' in. Reset it to '' to store new days in below
549
+
550
+ // Store Selected Days in the BYDAY rule
551
+ $('#monthday-select button').each(function() {
552
+
553
+ // Active class is the selected day, store the ID of active days which contains the short day name for the rrule (ex. MO, TU, WE, etc)
554
+ if ($(this).hasClass('active')) {
555
+ bymonthday.push($(this).attr('data-day-num'));
556
+ }
557
+
558
+ });
559
+ recurringRule.bymonthday = bymonthday;
560
+
561
+ // Reset BYDAY Option
562
+ recurringRule.byday = "";
563
+
564
+ // Reset BySetPos
565
+ recurringRule.bysetpos = "";
566
+ });
567
+
568
+ // BYMONTH Selection
569
+ $('#bymonth-select button').on('click', function() {
570
+ $(this).toggleClass('active');
571
+ var bymonth = []; // Array to Store 'byday' in. Reset it to '' to store new days in below
572
+
573
+ // Store Selected Days in the BYDAY rule
574
+ $('#bymonth-select button').each(function() {
575
+
576
+ // Active class is the selected day, store the ID of active days which contains the short day name for the rrule (ex. MO, TU, WE, etc)
577
+ if ($(this).hasClass('active')) {
578
+ bymonth.push($(this).attr('data-month-num'));
579
+ }
580
+
581
+ });
582
+ recurringRule.bymonth = bymonth;
583
+ });
584
+
585
+
586
+ // FREQ=MONTHLY - RADIO BUTTONS
587
+ $('input[name="monthday-pos-select"]').change(function() {
588
+
589
+ // Selected Radio Button
590
+ var selectedRadio = $(this).val();
591
+
592
+ // A Radio was changed. Grab all the radio buttons to see which one.
593
+ $('input[name="monthday-pos-select"]').each(function() {
594
+
595
+ if ($(this).val() == selectedRadio) {
596
+
597
+ switch ($(this).val()) {
598
+ case "month-byday-pos-selected":
599
+ // ByDay Select Boxes are being used instead of the Month Day
600
+
601
+ // Disable all the monthday buttons
602
+ $('#monthday-select button').attr('disabled', 'disabled');
603
+ $('select[name^="month-byday"]').removeAttr('disabled');
604
+
605
+ // Generate the BYDAY variable from selected dropdowns by firing 'change' event
606
+ $('select[name^="month-byday"]').change();
607
+ // Mark recurring object bymonthday back to nothing
608
+ recurringRule.bymonthday = "";
609
+
610
+ break;
611
+
612
+ case "monthday-selected":
613
+
614
+ // Month Day Buttons are being used instead of the ByDay select boxes
615
+ $('#monthday-select button').removeAttr('disabled');
616
+ $('#monthday-select button').removeClass('active');
617
+
618
+ $('select[name^="month-byday"]').attr('disabled', 'disabled');
619
+ recurringRule.byday = "";
620
+ recurringRule.bysetpos = "";
621
+
622
+
623
+ break;
624
+
625
+ }
626
+ }
627
+
628
+ });
629
+ });
630
+
631
+ // FREQ=YEARLY - RADIO BUTTONS
632
+ $('input[name="yearly-options"]').change(function() {
633
+
634
+ // Selected Radio Button ID
635
+ var selectedRadio = $(this).attr('id');
636
+
637
+ // A Radio was changed. Check all the radio buttons' ids to see which one.
638
+ $('input[name="yearly-options"]').each(function() {
639
+
640
+ if ($(this).attr('id') == selectedRadio) {
641
+
642
+ switch ($(this).attr('id')) {
643
+ case "yearly-one-month":
644
+ // Example Pattern
645
+ // FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=1;UNTIL=20150818;
646
+
647
+ // BYMONTH and BYMONTHDAY attributes are going to be set
648
+ // Reset BYSETPOS, BYDAY,
649
+ recurringRule.bysetpos = "";
650
+ recurringRule.byday = "";
651
+
652
+ // Disable all the yearly select boxes
653
+ $('select[class^="yearly"]').attr('disabled', 'disabled');
654
+
655
+ // Disable all the yearly multiple month buttons
656
+ $('.yearly-multiple-months button').attr('disabled', 'disabled');
657
+ $('.yearly-multiple-months button').removeClass('active');
658
+
659
+ // Enable Yearly One Month Options
660
+ $('select[class="yearly-one-month"]').removeAttr('disabled');
661
+
662
+ // Fire change to select default values
663
+ $('select[name="yearly-bymonth"]').change();
664
+
665
+ break;
666
+
667
+ case "yearly-multiple-months":
668
+ // Example Pattern
669
+ // FREQ=YEARLY;INTERVAL=1;BYMONTH=1,3,4,10;COUNT=1
670
+
671
+ // BYMONTH attribute is going to be set
672
+ // Reset BYMONTHDAY, BYDAY, BYSETPOS
673
+ recurringRule.bymonthday = "";
674
+ recurringRule.byday = "";
675
+ recurringRule.bysetpos = "";
676
+
677
+ // Disable all the monthday buttons
678
+ $('select[class^="yearly"]').attr('disabled', 'disabled');
679
+
680
+ // Enable the buttons
681
+ $('.yearly-multiple-months button').removeAttr('disabled');
682
+
683
+
684
+ break;
685
+
686
+ case "yearly-precise":
687
+ // Example Pattern
688
+ // FREQ=YEARLY;BYDAY=SU;BYSETPOS=1;BYMONTH=1;UNTIL=20150818;
689
+
690
+ // BYDAY, BYSETPOS, and BYMONTH are going to be set
691
+ // Reset BYMONTHDAY
692
+ recurringRule.bymonthday = "";
693
+
694
+ // Disable all the yearly select boxes
695
+ $('select[class^="yearly"]').attr('disabled', 'disabled');
696
+
697
+ // Disable all the yearly multiple month buttons
698
+ $('.yearly-multiple-months button').attr('disabled', 'disabled');
699
+ $('.yearly-multiple-months button').removeClass('active');
700
+
701
+ // Enable Yearly One Month Options
702
+ $('select[class="yearly-precise"]').removeAttr('disabled');
703
+
704
+ // Fire change to select default values
705
+ $('select[name="yearly-bysetpos"]').change();
706
+ break;
707
+ }
708
+ }
709
+
710
+ });
711
+ });
712
+
713
+ // FREQ=YEARLY - Yearly One Month selection
714
+ // Example Pattern
715
+ // FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=1;UNTIL=20150818;
716
+
717
+ // BYMONTH and BYMONTHDAY attributes are going to be set
718
+
719
+ $(document).on('change', 'select[name^="yearly-bymonth"]', function() {
720
+ // Example Pattern
721
+ // FREQ=MONTHLY;INTERVAL=1;BYDAY=SU,SA;BYSETPOS=1;COUNT=1
722
+
723
+ // First, Second, Third, Fourth or Last Days
724
+ var bymonth = $('select[name="yearly-bymonth"]').val();
725
+
726
+ // Make array of selected days.
727
+ var bymonthday = $('select[name="yearly-bymonthday"]').val();
728
+
729
+ recurringRule.bymonth = bymonth;
730
+ recurringRule.bymonthday = bymonthday;
731
+ });
732
+
733
+ // FREQ=YEARLY - Yearly Multiple Month selection
734
+ // Example Pattern
735
+ // FREQ=YEARLY;INTERVAL=1;BYMONTH=1,3,4,10;COUNT=1
736
+ $(document).on('click', '.yearly-multiple-months button', function() {
737
+ $(this).toggleClass('active');
738
+ var bymonth = []; // Array to Store 'bymonth' in. Reset it to '' to store new days in below
739
+
740
+ // Store Selected Days in the BYDAY rule
741
+ $('.yearly-multiple-months button').each(function() {
742
+
743
+ // Active class is the selected day, store the ID of active days which contains the short day name for the rrule (ex. MO, TU, WE, etc)
744
+ if ($(this).hasClass('active')) {
745
+ bymonth.push($(this).attr('data-month-num'));
746
+ }
747
+
748
+ });
749
+ recurringRule.bymonth = bymonth;
750
+ });
751
+
752
+ // FREQ=YEARLY - Yearly Precise Selection
753
+ // Example PAttern
754
+ // FREQ=YEARLY;BYDAY=SU;BYSETPOS=1;BYMONTH=1;UNTIL=20150818;
755
+
756
+ // BYDAY, BYSETPOS, and BYMONTH are going to be set
757
+
758
+ $(document).on('change', 'select[name="yearly-bysetpos"], select[name="yearly-byday"], select[name="yearly-bymonth-with-bysetpos-byday"]', function() {
759
+ // Example Pattern
760
+ // FREQ=MONTHLY;INTERVAL=1;BYDAY=SU,SA;BYSETPOS=1;COUNT=1
761
+
762
+ // First, Second, Third, Fourth or Last Days
763
+ var bysetpos = $('select[name="yearly-bysetpos"]').val();
764
+
765
+ // Make array of selected days.
766
+ var byday = $('select[name="yearly-byday"]').val().split(',');
767
+
768
+ // First, Second, Third, Fourth or Last Days
769
+ var bymonth = $('select[name="yearly-bymonth-with-bysetpos-byday"]').val();
770
+ //alert($('select[name="yearly-bymonth-with-bysetpos-byday"]').val());
771
+
772
+ recurringRule.bymonthday = "";
773
+
774
+ recurringRule.bymonth = bymonth;
775
+ recurringRule.byday = byday;
776
+ recurringRule.bysetpos = bysetpos;
777
+ });
778
+
779
+
780
+ // FREQ=MONTHLY
781
+ // BYDAY and BYSETPOS MONTHLY Setting
782
+
783
+ $(document).on('change', 'select[name^="month-byday"]', function() {
784
+ // Example Pattern
785
+ // FREQ=MONTHLY;INTERVAL=1;BYDAY=SU,SA;BYSETPOS=1;COUNT=1
786
+
787
+ // First, Second, Third, Fourth or Last Days
788
+ var bySetPos = $('select[name="month-byday-pos"]').val();
789
+
790
+ // Make array of selected days.
791
+ var daysSelected = $('select[name="month-byday-pos-name"]').val().split(',');
792
+
793
+ recurringRule.bysetpos = bySetPos;
794
+ recurringRule.byday = daysSelected;
795
+ });
796
+
797
+ // Set the count variable
798
+ $(document).on('input change', 'input[name="count"]', function() {
799
+
800
+ recurringRule.count = $(this).val();
801
+ });
802
+
803
+
804
+
805
+ // Handle Until / Count Radio Buttons
806
+ $('input[name="end-select"]').change(function() {
807
+
808
+ // Selected Radio Button
809
+ var selectedRadio = $(this).val();
810
+
811
+ // A Radio was changed. Grab all the radio buttons to see which one.
812
+ $('input[name="end-select"]').each(function() {
813
+ // enable the input next to the selected radio button
814
+ if ($(this).val() == selectedRadio) {
815
+ $('input[name="' + selectedRadio + '"]').removeAttr('disabled');
816
+ if ($(this).val() == 'until') {
817
+ // Set the date in the until textbox as the until date
818
+
819
+ // Remove the count variable
820
+ recurringRule.count = '';
821
+ // Set until variable
822
+ recurringRule.until = $('#end-date-hidden').val();
823
+ }
824
+ } else {
825
+ //disable the inputs not selected.
826
+ $(this).next('input').attr('disabled', 'disabled').val('');
827
+
828
+ //reset the stored value in the recurringRule object
829
+ var not_selected = $(this).next('input').attr('name');
830
+
831
+ recurringRule[not_selected] = '';
832
+
833
+ }
834
+
835
+ });
836
+ });
837
+
838
+ // Handle Form Submission
839
+ $('#rrule-' + selector.replace(/[^\w\s]/g, '_')).submit(function(e) {
840
+ e.preventDefault();
841
+ if (callback === '') {
842
+ $(selector).val(RruleForm.rruleGenerate());
843
+ } else {
844
+ callback(RruleForm.rruleGenerate())
845
+ }
846
+ $('.modal.in').modal('hide');
847
+ });
848
+ }
849
+ }