conschedule 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +154 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/config/conschedule_manifest.js +2 -0
  6. data/app/assets/fonts/icomoon.eot +0 -0
  7. data/app/assets/fonts/proxima_nova_100.eot +0 -0
  8. data/app/assets/fonts/proxima_nova_400.eot +0 -0
  9. data/app/assets/fonts/proxima_nova_700.eot +0 -0
  10. data/app/assets/images/conschedule/chosen-sprite-small.png +0 -0
  11. data/app/assets/images/conschedule/chosen-sprite.png +0 -0
  12. data/app/assets/images/conschedule/close.png +0 -0
  13. data/app/assets/images/conschedule/spinner-small.gif +0 -0
  14. data/app/assets/images/conschedule/spinner.gif +0 -0
  15. data/app/assets/javascripts/conschedule/application.js +22 -0
  16. data/app/assets/javascripts/conschedule/calendar.js +467 -0
  17. data/app/assets/javascripts/conschedule/date.js +104 -0
  18. data/app/assets/javascripts/conschedule/form.js +53 -0
  19. data/app/assets/javascripts/conschedule/home.js +149 -0
  20. data/app/assets/javascripts/conschedule/jquery-ui-datepicker.min.js +1674 -0
  21. data/app/assets/javascripts/conschedule/jquery.easing.min.js +44 -0
  22. data/app/assets/javascripts/conschedule/jquery.validate.js +1532 -0
  23. data/app/assets/javascripts/conschedule/js_time_zone.js +1433 -0
  24. data/app/assets/javascripts/conschedule/moment-timezone.js +1209 -0
  25. data/app/assets/javascripts/conschedule/moment.js +4195 -0
  26. data/app/assets/javascripts/conschedule/schedules.js +22 -0
  27. data/app/assets/javascripts/conschedule/time_zones_drop_down.js +609 -0
  28. data/app/assets/stylesheets/conschedule/application.css +4 -0
  29. data/app/assets/stylesheets/conschedule/common.css +816 -0
  30. data/app/assets/stylesheets/conschedule/home.css +2441 -0
  31. data/app/assets/stylesheets/conschedule/main.css +884 -0
  32. data/app/assets/stylesheets/conschedule/schedules.css +4 -0
  33. data/app/controllers/conschedule/application_controller.rb +49 -0
  34. data/app/controllers/conschedule/schedules_controller.rb +125 -0
  35. data/app/helpers/conschedule/application_helper.rb +15 -0
  36. data/app/helpers/conschedule/schedules_helper.rb +43 -0
  37. data/app/jobs/conschedule/application_job.rb +4 -0
  38. data/app/mailers/conschedule/schedules_mailer.rb +46 -0
  39. data/app/models/conschedule/application_record.rb +5 -0
  40. data/app/models/conschedule/schedule.rb +63 -0
  41. data/app/views/conschedule/schedules/_confirmation.html.erb +38 -0
  42. data/app/views/conschedule/schedules/_page_one.html.erb +75 -0
  43. data/app/views/conschedule/schedules/_page_three.html.erb +94 -0
  44. data/app/views/conschedule/schedules/_page_two.html.erb +22 -0
  45. data/app/views/conschedule/schedules/_schedules.html.erb +122 -0
  46. data/app/views/conschedule/schedules/create.js.erb +11 -0
  47. data/app/views/conschedule/schedules/index.html.erb +123 -0
  48. data/app/views/conschedule/schedules/index.js.erb +3 -0
  49. data/app/views/conschedule/schedules/new.html.erb +11 -0
  50. data/app/views/conschedule/schedules_mailer/send_cancel_email_owner.html.erb +61 -0
  51. data/app/views/conschedule/schedules_mailer/send_cancel_email_user.html.erb +29 -0
  52. data/app/views/conschedule/schedules_mailer/send_confirmation_email_owner.html.erb +77 -0
  53. data/app/views/conschedule/schedules_mailer/send_confirmation_email_user.html.erb +30 -0
  54. data/app/views/kaminari/custom_theme/_first_page.html.erb +3 -0
  55. data/app/views/kaminari/custom_theme/_gap.html.erb +1 -0
  56. data/app/views/kaminari/custom_theme/_last_page.html.erb +3 -0
  57. data/app/views/kaminari/custom_theme/_next_page.html.erb +1 -0
  58. data/app/views/kaminari/custom_theme/_page.html.erb +5 -0
  59. data/app/views/kaminari/custom_theme/_paginator.html.erb +23 -0
  60. data/app/views/kaminari/custom_theme/_prev_page.html.erb +1 -0
  61. data/app/views/layouts/conschedule/application.html.erb +14 -0
  62. data/app/views/layouts/conschedule/mailer.html.erb +11 -0
  63. data/app/views/layouts/conschedule/schedules.html.erb +14 -0
  64. data/config/initializers/assets.rb +11 -0
  65. data/config/routes.rb +11 -0
  66. data/db/migrate/20160812085505_create_conschedule_schedules.rb +27 -0
  67. data/lib/conschedule.rb +34 -0
  68. data/lib/conschedule/configuration.rb +25 -0
  69. data/lib/conschedule/engine.rb +5 -0
  70. data/lib/conschedule/gem_dependencies.rb +2 -0
  71. data/lib/conschedule/version.rb +3 -0
  72. data/lib/generators/conschedule/install_generator.rb +23 -0
  73. data/lib/generators/conschedule/views_generator.rb +45 -0
  74. data/lib/generators/templates/README +40 -0
  75. data/lib/generators/templates/initializer.rb +25 -0
  76. data/lib/tasks/conschedule_tasks.rake +4 -0
  77. metadata +182 -0
@@ -0,0 +1,4 @@
1
+ /*
2
+ *= require conschedule/common
3
+ *= require conschedule/main
4
+ */
@@ -0,0 +1,49 @@
1
+ module Conschedule
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+
5
+ def validate_config
6
+ ["main_heading", "purpose", "instructions", "location_details", "start_date", "end_date", "available_days", "system_time_zone", "black_out_dates", "sun_timings",
7
+ "mon_timings", "tue_timings", "wed_timings", "thu_timings", "fri_timings", "sat_timings", "duration", "from_address", "send_confirmation_mail", "send_cancel_mail",
8
+ "to_address", "contact_name"].each do |name|
9
+ case name
10
+ when "main_heading", "purpose", "instructions", "location_details"
11
+ fail "Invalid value for #{name.to_s.titleize}, value should be a String" if !Conschedule.send(name).blank? && !Conschedule.send(name).is_a?(String)
12
+ when "start_date"
13
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Date" unless Date.valid_date? *Conschedule.send(name).split('-').map(&:to_i)
14
+ when "end_date"
15
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Date" unless Date.valid_date? *Conschedule.send(name).split('-').map(&:to_i)
16
+ fail "Invalid value for #{name.to_s.titleize}, value should be greater than start date" if Conschedule.end_date.to_date < Conschedule.start_date.to_date
17
+ when "available_days"
18
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Array" if !Conschedule.send(name).is_a?(Array)
19
+ valid_days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
20
+ invalid_values = Conschedule.send(name) - valid_days
21
+ fail "Invalid value for #{name.to_s.titleize}, valid values are #{valid_days.join(', ')}" unless invalid_values.empty?
22
+ when "system_time_zone"
23
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid TimeZone" unless ActiveSupport::TimeZone[Conschedule.send(name)].present?
24
+ when "black_out_dates"
25
+ unless Conschedule.send(name).blank?
26
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Array" if !Conschedule.send(name).is_a?(Array)
27
+ Conschedule.send(name).each do |date|
28
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Date" unless Date.valid_date? *date.split('-').map(&:to_i)
29
+ end
30
+ end
31
+ when "sun_timings", "mon_timings", "tue_timings", "wed_timings", "thu_timings", "fri_timings", "sat_timings"
32
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Array" if !Conschedule.send(name).is_a?(Array)
33
+ start_time, end_time = Conschedule.send(name)
34
+ fail "Invalid value for #{name.to_s.titleize}, value should have a valid start time" if /^(2[0-3]|[01][0-9]):([0-5][0-9])$/.match(start_time).blank?
35
+ fail "Invalid value for #{name.to_s.titleize}, value should have a valid end time" if /^(2[0-3]|[01][0-9]):([0-5][0-9])$/.match(end_time).blank?
36
+ fail "Invalid value for #{name.to_s.titleize}, value should have a valid start time and end time" if end_time.to_time < start_time.to_time
37
+ when "duration"
38
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Integer" if !Conschedule.send(name).is_a?(Integer)
39
+ fail "Invalid value for #{name.to_s.titleize}, value should be a greater than or equal to 5 and less than or equal to 1440" unless Conschedule.send(name) >= 5 && Conschedule.send(name) <= 1440
40
+ when "send_confirmation_mail", "send_cancel_mail"
41
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Boolean true or false" unless Conschedule.send(name).is_a?(TrueClass) || Conschedule.send(name).is_a?(FalseClass)
42
+ when "contact_name"
43
+ fail "Invalid value for #{name.to_s.titleize}, value should be a string" if !Conschedule.send(name).is_a?(String)
44
+ end
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,125 @@
1
+ require_dependency "conschedule/application_controller"
2
+
3
+ module Conschedule
4
+ class SchedulesController < ApplicationController
5
+
6
+ before_action :validate_config
7
+
8
+ def index
9
+ config_data
10
+ @filters_applied = params[:status_ids].present? && params[:status_ids].include?("cancelled") ? true : false
11
+ @schedules = schedules_search.page(params[:page])
12
+ @grouped = @schedules.group_by { |s| s.slot_start_time.strftime("%Y-%m-%d") }
13
+ render layout: "conschedule/application"
14
+ end
15
+
16
+ def new
17
+ config_data
18
+ @schedule = Schedule.new
19
+ render layout: "conschedule/schedules"
20
+ end
21
+
22
+ def create
23
+ config_data
24
+ sst = convert_to_tz(params[:schedule][:slot_start_time],params[:schedule][:user_time_zone])
25
+ set = convert_to_tz(params[:schedule][:slot_end_time],params[:schedule][:user_time_zone])
26
+ schedule_data = {
27
+ app_time_zone: @page_info[:system_time_zone],
28
+ event_name: @page_info[:purpose],
29
+ event_description: @page_info[:instructions],
30
+ location_details: @page_info[:location_details],
31
+ contact_name: Conschedule.contact_name,
32
+ slot_start_time: sst,
33
+ slot_end_time: set
34
+ }
35
+ schedule_data.each do |key,value|
36
+ params[:schedule][key.to_sym] = value
37
+ end
38
+ @schedule = Schedule.create(schedule_params)
39
+ end
40
+
41
+ def cancel
42
+ @schedule = Schedule.find(params[:id])
43
+ @schedule.update(schedule_params.merge(status: 'cancelled'))
44
+ redirect_to schedules_path
45
+ end
46
+
47
+ private
48
+
49
+ def config_data
50
+ @page_info = {
51
+ main_heading: Conschedule.main_heading,
52
+ purpose: Conschedule.purpose,
53
+ instructions: Conschedule.instructions,
54
+ location_details: Conschedule.location_details,
55
+ start_date: Conschedule.start_date,
56
+ end_date: Conschedule.end_date,
57
+ original_start_date: Conschedule.start_date,
58
+ original_end_date: Conschedule.end_date,
59
+ available_days: Conschedule.available_days,
60
+ system_time_zone: Conschedule.system_time_zone,
61
+ black_out_dates: Conschedule.black_out_dates,
62
+ sun_timings: Conschedule.sun_timings,
63
+ mon_timings: Conschedule.mon_timings,
64
+ tue_timings: Conschedule.tue_timings,
65
+ wed_timings: Conschedule.wed_timings,
66
+ thu_timings: Conschedule.thu_timings,
67
+ fri_timings: Conschedule.fri_timings,
68
+ sat_timings: Conschedule.sat_timings,
69
+ duration: Conschedule.duration,
70
+ enable_tz: Conschedule.enable_tz
71
+ }
72
+ gon.page_info = @page_info
73
+ end
74
+
75
+ def schedule_params
76
+ params.require(:schedule).permit(:app_time_zone, :user_time_zone, :app_tz_offset, :user_tz_offset, :event_name, :event_description, :location_details, :slot_start_time, :slot_end_time, :contact_name, :first_name, :last_name, :phone, :email, :message, :status, :cancel_reason)
77
+ end
78
+
79
+ def schedules_search
80
+ status = params[:status_ids].blank? ? ["active"] : params[:status_ids]
81
+ current_time = Time.now.in_time_zone(@page_info[:system_time_zone])
82
+ case params[:period]
83
+ when "past"
84
+ schedules = Schedule.past(status,current_time)
85
+ @date_range_label = "All Past"
86
+ @filter_message = "You have no past events"
87
+ @suggestion_message = "past events"
88
+ when "upcoming"
89
+ schedules = Schedule.upcoming(status,current_time)
90
+ @date_range_label = "All Upcoming"
91
+ @filter_message = "You have no upcoming events yet"
92
+ @suggestion_message = "upcoming events"
93
+ when "today"
94
+ schedules = Schedule.range(status,Time.now.beginning_of_day,Time.now.end_of_day)
95
+ @date_range_label = "Today"
96
+ @filter_message = "You have no events for today yet"
97
+ @suggestion_message = "events for today"
98
+ when "this_week", "this_month", "range"
99
+ schedules = Schedule.range(status,params[:start_date],params[:end_date])
100
+ if params[:period] == "range"
101
+ @date_range_label = params[:start_date].to_date.strftime("%b %-d, %Y") + " - " + params[:end_date].to_date.strftime("%b %-d, %Y")
102
+ @filter_message = "You have no events for the date range of #{@date_range_label}"
103
+ @suggestion_message = "events for #{@date_range_label}"
104
+ else
105
+ @date_range_label = params[:period].titleize
106
+ @filter_message = "You have no events for #{params[:period].gsub('_'," ")} yet"
107
+ @suggestion_message = "events for #{params[:period].gsub('_'," ")}"
108
+ end
109
+ else
110
+ schedules = Schedule.upcoming(status,current_time)
111
+ @date_range_label = "All Upcoming"
112
+ @filter_message = "You have no upcoming events yet"
113
+ @suggestion_message = "upcoming events"
114
+ end
115
+ schedules.order("slot_start_time")
116
+ end
117
+
118
+ def convert_to_tz(date,tz)
119
+ Time.zone = tz
120
+ ctz = Time.zone.parse(date)
121
+ return ctz
122
+ end
123
+
124
+ end
125
+ end
@@ -0,0 +1,15 @@
1
+ module Conschedule
2
+ module ApplicationHelper
3
+
4
+ def fdtime(date_time,format)
5
+ formats = {
6
+ time: "%I:%M%P",
7
+ date: "%A, %B %-d, %Y",
8
+ month_date: "%B %-d, %Y"
9
+ }
10
+ date_time.strftime(formats[format])
11
+ end
12
+
13
+
14
+ end
15
+ end
@@ -0,0 +1,43 @@
1
+ module Conschedule
2
+ module SchedulesHelper
3
+
4
+ def cancel_reason(schedule)
5
+ if schedule.cancel_reason.blank?
6
+ 'No reason provided.'
7
+ else
8
+ schedule.cancel_reason
9
+ end
10
+ end
11
+
12
+ def slot_start_end_time(schedule,version,start_time=false)
13
+ slot_start_time = schedule.slot_start_time
14
+ slot_end_time = schedule.slot_end_time
15
+ tz = version == "app" ? schedule.app_time_zone : schedule.user_time_zone
16
+ sst = slot_start_time.in_time_zone(tz)
17
+ set = slot_end_time.in_time_zone(tz)
18
+ if start_time
19
+ [fdtime(sst,:time),fdtime(sst,:date)].join(" - ")
20
+ else
21
+ [fdtime(sst,:time),fdtime(set,:time)].join(" - ")
22
+ end
23
+ end
24
+
25
+ def is_today?(date,tz)
26
+ Time.now.in_time_zone(tz).strftime("%Y-%m-%d") == date.in_time_zone(tz).strftime("%Y-%m-%d")
27
+ end
28
+
29
+ def page_entries_info(collection, options = {})
30
+ entry_name = options[:entry_name] || collection.entry_name
31
+ entry_name = entry_name.pluralize unless collection.total_count == 1
32
+
33
+ if collection.total_pages < 2
34
+ "Displaying #{collection.total_count} of #{collection.total_count} #{entry_name}"
35
+ else
36
+ first = collection.offset_value + 1
37
+ last = (sum = collection.offset_value + collection.limit_value) > collection.total_count ? collection.total_count : sum
38
+ "Displaying #{first} – #{last} of #{collection.total_count} #{entry_name} "
39
+ end.html_safe
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,4 @@
1
+ module Conschedule
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,46 @@
1
+ module Conschedule
2
+ class SchedulesMailer < ActionMailer::Base
3
+ default from: Conschedule.from_address
4
+ layout 'conschedule/mailer'
5
+
6
+ def send_cancel_email_user(schedule)
7
+ @schedule = schedule
8
+ @slot_date = schedule.slot_date_time("user","start").strftime("%B %-d, %Y")
9
+ mail(
10
+ to: "#{schedule.full_name} <#{schedule.email}>",
11
+ subject: "Canceled: #{schedule.event_name} with #{Conschedule.contact_name} on #{@slot_date}"
12
+ )
13
+ end
14
+
15
+ def send_cancel_email_owner(schedule)
16
+ @schedule = schedule
17
+ @slot_date = schedule.slot_date_time("app","start").strftime("%B %-d, %Y")
18
+ @slot_start_time = schedule.slot_date_time("app","start")
19
+ mail(
20
+ to: Conschedule.to_address,
21
+ subject: "Canceled: #{schedule.event_name} with #{schedule.full_name} on #{@slot_date}"
22
+ )
23
+ end
24
+
25
+ def send_confirmation_email_owner(schedule)
26
+ @schedule = schedule
27
+ @slot_date = schedule.slot_date_time("app","start").strftime("%B %-d, %Y")
28
+ @slot_start_time = schedule.slot_date_time("app","start")
29
+ mail(
30
+ to: Conschedule.to_address,
31
+ subject: "New Event: #{schedule.event_name} with #{schedule.full_name} on #{@slot_date}"
32
+ )
33
+ end
34
+
35
+ def send_confirmation_email_user(schedule)
36
+ @schedule = schedule
37
+ @slot_date = schedule.slot_date_time("user","start").strftime("%B %-d, %Y")
38
+ mail(
39
+ to: "#{schedule.full_name} <#{schedule.email}>",
40
+ subject: "Confirmed: #{schedule.event_name} with #{Conschedule.contact_name} on #{@slot_date}"
41
+ )
42
+ end
43
+
44
+
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ module Conschedule
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,63 @@
1
+ module Conschedule
2
+ class Schedule < ApplicationRecord
3
+
4
+ validates :app_time_zone, :user_time_zone, :app_tz_offset, :user_tz_offset, :slot_start_time, :slot_end_time, :first_name, :phone, :email, presence: true
5
+
6
+ scope :past, -> (status,time) { where("status IN (?) AND slot_start_time < ?",status,time) }
7
+ scope :upcoming, -> (status,time) { where("status IN (?) AND slot_start_time >= ?",status,time) }
8
+ scope :range, -> (status,start_time,end_time) { where("status IN (?) AND (slot_start_time >= ? AND slot_start_time <= ?)",status,start_time,end_time) }
9
+
10
+ after_create :send_confirmation_email
11
+ after_update :send_cancel_email
12
+
13
+ def full_name
14
+ [first_name,last_name].compact.join(" ")
15
+ end
16
+
17
+ def send_confirmation_email
18
+ SchedulesMailer.send_confirmation_email_user(self).deliver
19
+ if Conschedule.send_confirmation_mail && validate_to_address
20
+ SchedulesMailer.send_confirmation_email_owner(self).deliver
21
+ end
22
+ end
23
+
24
+ def send_cancel_email
25
+ if status_changed?
26
+ SchedulesMailer.send_cancel_email_user(self).deliver
27
+ end
28
+ if Conschedule.send_cancel_mail && validate_to_address
29
+ SchedulesMailer.send_cancel_email_owner(self).deliver
30
+ end
31
+ end
32
+
33
+ def status_changed?
34
+ changed_attributes.has_key?("status") && changed_attributes["status"] == "active"
35
+ end
36
+
37
+ def validate_to_address
38
+ return false if Conschedule.to_address.downcase =~ /please-change-me/
39
+ return true
40
+ end
41
+
42
+ def cancelled?
43
+ status == "cancelled"
44
+ end
45
+
46
+ def display_action?
47
+ if status == "cancelled"
48
+ return false
49
+ else
50
+ slot_start_time = self.slot_date_time("app","start")
51
+ current_time = Time.now.in_time_zone(app_time_zone)
52
+ return current_time > slot_start_time ? false : true
53
+ end
54
+ end
55
+
56
+ def slot_date_time(version,period)
57
+ tz = version == "app" ? app_time_zone : user_time_zone
58
+ period == "start" ? slot_start_time.in_time_zone(tz) : slot_end_time.in_time_zone(tz)
59
+ end
60
+
61
+
62
+ end
63
+ end
@@ -0,0 +1,38 @@
1
+ <div id="main-region">
2
+ <div>
3
+ <div class="header">
4
+ <h2 class="pts">Confirmed</h2>
5
+ <div class="mbs phl">
6
+ You are scheduled with <%= @schedule.contact_name %>.
7
+ </div>
8
+ </div>
9
+ <div class="wrapper narrower">
10
+ <hr class="dotted mbm">
11
+ <div class="mbs row">
12
+ <div class="marker" style="background-color: #fff200"></div>
13
+ <div class="last-col">
14
+ <h2><%= @schedule.event_name %></h2>
15
+ </div>
16
+ </div>
17
+ <div class="iconed-text emphasis">
18
+ <i class="icon-clock"></i> <%= slot_start_end_time(@schedule,"user",true) %>
19
+ </div>
20
+ <div class="iconed-text">
21
+ <i class="icon-globe"></i><%= @schedule.user_time_zone %>
22
+ </div>
23
+ <div class="iconed-text">
24
+ <i class="icon-description"></i>
25
+ <div class="last-col">
26
+ <%= @schedule.event_description %>
27
+ </div>
28
+ </div>
29
+ <div class="iconed-text">
30
+ <i class="icon-location-target"></i>
31
+ <div class="last-col">
32
+ <%= @schedule.location_details %>
33
+ </div>
34
+ </div>
35
+ <hr class="dotted mbl">
36
+ </div>
37
+ </div>
38
+ </div>
@@ -0,0 +1,75 @@
1
+ <div id="main-region">
2
+ <div class="date-time-step">
3
+ <div class="header">
4
+ <div class="js-profile-region">
5
+ <div class="wrapper">
6
+ <div class="label">
7
+ <%= @page_info[:main_heading] %>
8
+ <div class="js-popover-region"></div>
9
+ </div>
10
+ </div>
11
+ </div>
12
+ </div>
13
+ <div class="subheader">
14
+ <div class="wrapper row">
15
+ <div class="col1of2">
16
+ <% unless @page_info[:purpose].blank? %>
17
+ <div class="marker" style="background-color: #fff200"></div>
18
+ <div class="last-col">
19
+ <h3><%= @page_info[:purpose] %></h3>
20
+ </div>
21
+ <% else %>
22
+ &nbsp;
23
+ <% end %>
24
+ </div>
25
+ <div class="col1of2">
26
+ <div class="timezone-area">
27
+ <span class="muted">Times are in</span>
28
+ <div class="timezone">
29
+ <%= f.select :user_time_zone, "", {}, {class: "chzn js-timezone-dropdown chzn-done", id: "timezonesdropdown", style: "display: none;"} %>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ <div class="wrapper">
36
+ <div class="iconed-text muted">
37
+ <% unless @page_info[:instructions].blank? %>
38
+ <i class="icon-description"></i>
39
+ <div class="last-col">
40
+ <%= @page_info[:instructions] %>
41
+ </div>
42
+ <% end %>
43
+ </div>
44
+ <div class="iconed-text muted">
45
+ <% unless @page_info[:location_details].blank? %>
46
+ <i class="icon-location-target"></i>
47
+ <div class="last-col">
48
+ <%= @page_info[:location_details] %>
49
+ </div>
50
+ <% end %>
51
+ </div>
52
+ <div class="js-days-region mvl">
53
+ <div class="week-view">
54
+ <h2 class="text-center mbl">Select a Day</h2>
55
+ <div class="js-days-region">
56
+ <div class="period row"><span class="icon-angle-left js-navigation-prev"></span>
57
+ <span class="icon-angle-right js-navigation-next"></span>
58
+ <div class="js-days-body">
59
+ </div>
60
+ </div>
61
+ </div>
62
+ <div class="spinner js-spinner hidden">
63
+ <div class="bounce1"></div>
64
+ <div class="bounce2"></div>
65
+ <div class="bounce3"></div>
66
+ </div>
67
+ <div class="js-weeks-region">
68
+ </div>
69
+ </div>
70
+ </div>
71
+ <div style="display: block;" class="pagination row js-pagination-bar mbl">
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>