From ada6666ceca18d3722bc20c0f46e1ffc34e3a342 Mon Sep 17 00:00:00 2001
From: Tyler Lemburg <trlemburg@gmail.com>
Date: Thu, 4 Aug 2016 13:41:56 -0500
Subject: [PATCH] Resource calendar and more

---
 app.rb                            |  16 ++-
 models/reservation.rb             |   6 ++
 public/css/resource_scheduler.css |   2 +-
 routes/admin.rb                   |   1 +
 routes/events.rb                  |   3 +
 routes/resources.rb               |  60 ++++++++++-
 routes/space.rb                   |   1 +
 src/less/resource_scheduler.less  |   4 +
 views/resource_calendar.erb       | 173 ++++++++++++++++++++++++++++++
 views/resources.erb               |   1 +
 10 files changed, 261 insertions(+), 6 deletions(-)
 create mode 100644 views/resource_calendar.erb

diff --git a/app.rb b/app.rb
index a3714ee..cca809b 100644
--- a/app.rb
+++ b/app.rb
@@ -34,8 +34,6 @@ def flash(type, header, message)
 end
 
 before do
-  require_login
-
   # site defaults
   @title = 'UNL Resource Scheduler'
   @breadcrumbs = [
@@ -72,7 +70,7 @@ helpers do
     raise Sinatra::NotFound if space.nil?
     @space = space
 
-    if !@user.in_space?(@space)
+    if defined?(@user) && !@user.in_space?(@space)
       flash :error, 'Unauthorized', 'Sorry, you don\'t have access to this service space.'
       redirect '/'
     end
@@ -80,6 +78,12 @@ helpers do
     @breadcrumbs << {:text => @space.name, :href => @space.href}
   end
 
+  def check_login
+    if !session['cas'].nil? && !session['cas']['user'].nil?
+      @user = User.find_by(:username => session['cas']['user'], :creation_method => 'CAS')
+    end
+  end
+
   def require_login
     if session['cas'].nil? || session['cas']['user'].nil?
       halt 401
@@ -124,6 +128,7 @@ error do
 end
 
 get '/' do
+  require_login
   @breadcrumbs << {:text => 'Home'}
   # get the service spaces that this user has access to
   spaces = @user.service_spaces
@@ -132,4 +137,9 @@ get '/' do
   }
 end
 
+get '/logout/' do
+  session.delete('cas')
+  redirect back
+end
+
 Dir.glob("#{ROOT}/routes/*.rb") { |file| require file }
\ No newline at end of file
diff --git a/models/reservation.rb b/models/reservation.rb
index 357973d..0b0ed8c 100644
--- a/models/reservation.rb
+++ b/models/reservation.rb
@@ -12,6 +12,12 @@ class Reservation < ActiveRecord::Base
 		where('(start_time >= ? AND start_time < ?) OR (end_time >= ? AND end_time < ?)', today.getutc, tomorrow.getutc, today.getutc, tomorrow.getutc)
 	}
 
+	scope :in_week, ->(time) {
+		last_sunday = time.in_time_zone.week_start
+		next_sunday = (time.in_time_zone.week_start + 1.week + 1.hour).in_time_zone.week_start
+		where('(start_time >= ? AND start_time < ?) OR (end_time >= ? AND end_time < ?)', last_sunday.getutc, next_sunday.getutc, last_sunday.getutc, next_sunday.getutc)
+	}
+
 	# returns length in minutes. If start or end is nil, returns 0
 	def length
 		if end_time.nil? || start_time.nil?
diff --git a/public/css/resource_scheduler.css b/public/css/resource_scheduler.css
index 14dfd15..9062819 100644
--- a/public/css/resource_scheduler.css
+++ b/public/css/resource_scheduler.css
@@ -1 +1 @@
-@charset "UTF-8";@font-face{font-family:'eventicon';src:url('font/eventicon.eot?22213170');src:url('font/eventicon.eot?22213170#iefix') format('embedded-opentype'),url('font/eventicon.svg?22213170#eventicon') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'eventicon';src:url('data:application/octet-stream;base64,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') format('woff'),url('data:application/octet-stream;base64,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') format('truetype')}[class^="eventicon-"]:before,[class*=" eventicon-"]:before{font-family:"eventicon";font-style:normal;font-weight:normal;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.eventicon-plus-circled:before{content:'\e800'}.eventicon-search:before{content:'\e801'}.eventicon-angle-circled-left:before{content:'\e802'}.eventicon-angle-circled-right:before{content:'\e803'}.eventicon-rss:before{content:'\e804'}.eventicon-calendar-empty:before{content:'\e805'}.eventicon-link:before{content:'\e806'}.eventicon-location:before{content:'\e807'}.eventicon-clock:before{content:'\e808'}.eventicon-vcard:before{content:'\e809'}.clearfix:after{content:" ";visibility:hidden;display:block;height:0;clear:both}.wdn-grid-set.reverse>[class*=wdn-col]{float:right}#pagetitle h3{margin-top:0}#maincontent form{padding:1em}#maincontent form fieldset{margin:0;margin-bottom:1em}#maincontent form legend{font-size:1.5em;margin-top:0.5em;margin-bottom:1em;padding-bottom:0}#maincontent form.delete-form,#maincontent form.inline-form{display:inline;padding:0}#maincontent form input{word-wrap:normal}#maincontent form input[disabled]{background:#CCCCCC}#maincontent form textarea{resize:vertical}#maincontent form .helper{font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif}#maincontent form .offset-field-group{background:#41708d;border-radius:.5em;padding:1em}#maincontent form .offset-field-group label{color:#fefdfa}.table-actions a,.table-actions button{vertical-align:middle}.space-image{background:#78c3f1;border-radius:1em;border:1px solid #41708d;padding:1em}#notice .message-content a{text-decoration:underline}.calendar-container{font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;width:100%;text-align:center}.calendar-container .time-labels{font-size:80%;text-align:right;display:inline-block;border-right:1px solid #C9C9C9;width:9%;margin:0}.calendar-container .time-labels .calendar-half-hour{padding-right:3px}.calendar-container .calendar-day{vertical-align:bottom;text-align:center;border-left:1px solid #C9C9C9;border-right:1px solid #C9C9C9;display:inline-block;width:12%;margin:0}.calendar-container .calendar-day .day-chart{position:relative}.calendar-container .calendar-half-hour{height:20px;border-top:1px solid #C9C9C9}.calendar-container .calendar-half-hour:last-child{border-bottom:1px solid #C9C9C9}.calendar-container .calendar-half-hour:nth-child(2n){background-color:#EEEEEE}.calendar-container .event,.calendar-container .reservation{position:absolute;overflow-y:scroll;background:#78c3f1;border:1px solid #137cbd;border-radius:3px;width:80%;font-size:60%;text-align:left;padding:3px;word-wrap:break-word}.calendar-container .event.new-member-orientation,.calendar-container .reservation.new-member-orientation{background:#FFFFB8;border-color:#b8b800}.calendar-container .event.free-event,.calendar-container .reservation.free-event{background:#F8F8F8;border-color:#797979}.calendar-container .event.machine-training,.calendar-container .reservation.machine-training{background:#58CC2F;border-color:#34791c}.calendar-container .event.rsvp-only-event,.calendar-container .reservation.rsvp-only-event{background:#FFA6F5;border-color:#a60093}.calendar-container .event.top-overflow,.calendar-container .reservation.top-overflow{border-top:none;border-top-left-radius:0px;border-top-right-radius:0px}.calendar-container .event.bottom-overflow,.calendar-container .reservation.bottom-overflow{border-bottom:none;border-bottom-left-radius:0px;border-bottom-right-radius:0px}.calendar-container .event.editing,.calendar-container .reservation.editing{border-style:dashed;opacity:.7}.calendar-container .event a,.calendar-container .reservation a{color:initial}.calendar-container .event a:hover,.calendar-container .reservation a:hover{text-decoration:underline}.calendar-container .status{position:absolute;background:gray;width:100%;opacity:.5}.calendar-container .status.closed{background-color:#444}.calendar-container .status.open-without-reservations{background-color:#78c3f1}.calendar-container.individual-day{background-color:#f9f8f5;border:1px solid #d5d5d2}.calendar-container.individual-day .time-labels{width:25%}.calendar-container.individual-day .calendar-day{width:70%}.event-details{margin-bottom:1em;padding:0 23px 1.777em;padding:0 1.425rem 1.777em;border-top:5px solid #D00000;background-color:#fff;box-shadow:0 0 0 1px rgba(20,20,20,0.1)}.event-details .date-wrapper,.event-details .time-wrapper,.event-details .location,.event-details .contact{display:block;font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;font-weight:400;font-style:normal;font-size:13px;font-size:0.802rem}.event-details .date-wrapper:before,.event-details .time-wrapper:before,.event-details .location:before,.event-details .contact:before{color:#c1c0be}.event-details .description{margin:1em 0 0;padding-top:1em;border-top:1px solid #c1c0be}.toolbox,.visual-island{background:#f9f8f5;margin-bottom:1em;word-wrap:break-word;padding:0 !important}.toolbox .tools,.visual-island .tools,.toolbox .details,.visual-island .details{padding:1em;border-left:1px solid #d5d5d2;border-right:1px solid #d5d5d2;border-bottom:1px solid #d5d5d2}.toolbox .tools.top-border,.visual-island .tools.top-border,.toolbox .details.top-border,.visual-island .details.top-border{border-top:1px solid #d5d5d2}.toolbox h1,.visual-island h1,.toolbox h2,.visual-island h2,.toolbox h3,.visual-island h3,.toolbox h4,.visual-island h4,.toolbox h5,.visual-island h5,.toolbox h6,.visual-island h6,.toolbox .vi-header,.visual-island .vi-header{display:block;font-size:.802em !important;margin:0;border-bottom:1px solid #474746;font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;width:100%;background-color:#474746;padding:1em;text-transform:uppercase;color:#fff;font-weight:400;font-style:normal;text-align:center}.toolbox p,.visual-island p{padding:0 1em 1em 1em}.toolbox ul,.visual-island ul{padding:0;padding-left:1em;margin:0}.toolbox ul a,.visual-island ul a{border-bottom:none;font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif}.event-list{background-color:#eae9e6;font-size:80%;line-height:1.4}.event-list .center{text-align:center}.event-list tbody tr{min-height:30px}.event-list ul{padding-left:0;list-style-type:none}.event-list li{padding:5px 0}.event-list li:not(:last-child){border-bottom:1px solid #999999}.date-time-select{padding:1em;background-color:#f9f8f5;border:1px solid #d5d5d2;margin-bottom:0.75em;text-align:center}.date-time-select.hours{text-align:left}.date-time-select .wdn-icon-calendar{margin-right:-2.3em;position:relative;z-index:2;margin-left:0.8em}.date-time-select .am_pm{display:inline-block;font-family:"Gotham";font-size:.75em;margin-left:.75em}.date-time-select input{padding-left:2.3em;width:40%;position:relative;text-align:center}.date-time-select select{width:14%;text-align:center;padding:0}.date-time-select>*{vertical-align:middle}@media (max-width:767px){.medium-hidden{display:none}.medium-block{display:block !important}.date-time-select input{width:100%}.date-time-select select{width:30%;text-align:center}}
\ No newline at end of file
+@charset "UTF-8";@font-face{font-family:'eventicon';src:url('font/eventicon.eot?22213170');src:url('font/eventicon.eot?22213170#iefix') format('embedded-opentype'),url('font/eventicon.svg?22213170#eventicon') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'eventicon';src:url('data:application/octet-stream;base64,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') format('woff'),url('data:application/octet-stream;base64,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') format('truetype')}[class^="eventicon-"]:before,[class*=" eventicon-"]:before{font-family:"eventicon";font-style:normal;font-weight:normal;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.eventicon-plus-circled:before{content:'\e800'}.eventicon-search:before{content:'\e801'}.eventicon-angle-circled-left:before{content:'\e802'}.eventicon-angle-circled-right:before{content:'\e803'}.eventicon-rss:before{content:'\e804'}.eventicon-calendar-empty:before{content:'\e805'}.eventicon-link:before{content:'\e806'}.eventicon-location:before{content:'\e807'}.eventicon-clock:before{content:'\e808'}.eventicon-vcard:before{content:'\e809'}.clearfix:after{content:" ";visibility:hidden;display:block;height:0;clear:both}.wdn-grid-set.reverse>[class*=wdn-col]{float:right}.wdn-band{position:relative}#pagetitle h3{margin-top:0}#maincontent form{padding:1em}#maincontent form fieldset{margin:0;margin-bottom:1em}#maincontent form legend{font-size:1.5em;margin-top:0.5em;margin-bottom:1em;padding-bottom:0}#maincontent form.delete-form,#maincontent form.inline-form{display:inline;padding:0}#maincontent form input{word-wrap:normal}#maincontent form input[disabled]{background:#CCCCCC}#maincontent form textarea{resize:vertical}#maincontent form .helper{font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif}#maincontent form .offset-field-group{background:#41708d;border-radius:.5em;padding:1em}#maincontent form .offset-field-group label{color:#fefdfa}.table-actions a,.table-actions button{vertical-align:middle}.space-image{background:#78c3f1;border-radius:1em;border:1px solid #41708d;padding:1em}#notice .message-content a{text-decoration:underline}.calendar-container{font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;width:100%;text-align:center}.calendar-container .time-labels{font-size:80%;text-align:right;display:inline-block;border-right:1px solid #C9C9C9;width:9%;margin:0}.calendar-container .time-labels .calendar-half-hour{padding-right:3px}.calendar-container .calendar-day{vertical-align:bottom;text-align:center;border-left:1px solid #C9C9C9;border-right:1px solid #C9C9C9;display:inline-block;width:12%;margin:0}.calendar-container .calendar-day .day-chart{position:relative}.calendar-container .calendar-half-hour{height:20px;border-top:1px solid #C9C9C9}.calendar-container .calendar-half-hour:last-child{border-bottom:1px solid #C9C9C9}.calendar-container .calendar-half-hour:nth-child(2n){background-color:#EEEEEE}.calendar-container .event,.calendar-container .reservation{position:absolute;overflow-y:scroll;background:#78c3f1;border:1px solid #137cbd;border-radius:3px;width:80%;font-size:60%;text-align:left;padding:3px;word-wrap:break-word}.calendar-container .event.new-member-orientation,.calendar-container .reservation.new-member-orientation{background:#FFFFB8;border-color:#b8b800}.calendar-container .event.free-event,.calendar-container .reservation.free-event{background:#F8F8F8;border-color:#797979}.calendar-container .event.machine-training,.calendar-container .reservation.machine-training{background:#58CC2F;border-color:#34791c}.calendar-container .event.rsvp-only-event,.calendar-container .reservation.rsvp-only-event{background:#FFA6F5;border-color:#a60093}.calendar-container .event.top-overflow,.calendar-container .reservation.top-overflow{border-top:none;border-top-left-radius:0px;border-top-right-radius:0px}.calendar-container .event.bottom-overflow,.calendar-container .reservation.bottom-overflow{border-bottom:none;border-bottom-left-radius:0px;border-bottom-right-radius:0px}.calendar-container .event.editing,.calendar-container .reservation.editing{border-style:dashed;opacity:.7}.calendar-container .event a,.calendar-container .reservation a{color:initial}.calendar-container .event a:hover,.calendar-container .reservation a:hover{text-decoration:underline}.calendar-container .status{position:absolute;background:gray;width:100%;opacity:.5}.calendar-container .status.closed{background-color:#444}.calendar-container .status.open-without-reservations{background-color:#78c3f1}.calendar-container.individual-day{background-color:#f9f8f5;border:1px solid #d5d5d2}.calendar-container.individual-day .time-labels{width:25%}.calendar-container.individual-day .calendar-day{width:70%}.event-details{margin-bottom:1em;padding:0 23px 1.777em;padding:0 1.425rem 1.777em;border-top:5px solid #D00000;background-color:#fff;box-shadow:0 0 0 1px rgba(20,20,20,0.1)}.event-details .date-wrapper,.event-details .time-wrapper,.event-details .location,.event-details .contact{display:block;font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;font-weight:400;font-style:normal;font-size:13px;font-size:0.802rem}.event-details .date-wrapper:before,.event-details .time-wrapper:before,.event-details .location:before,.event-details .contact:before{color:#c1c0be}.event-details .description{margin:1em 0 0;padding-top:1em;border-top:1px solid #c1c0be}.toolbox,.visual-island{background:#f9f8f5;margin-bottom:1em;word-wrap:break-word;padding:0 !important}.toolbox .tools,.visual-island .tools,.toolbox .details,.visual-island .details{padding:1em;border-left:1px solid #d5d5d2;border-right:1px solid #d5d5d2;border-bottom:1px solid #d5d5d2}.toolbox .tools.top-border,.visual-island .tools.top-border,.toolbox .details.top-border,.visual-island .details.top-border{border-top:1px solid #d5d5d2}.toolbox h1,.visual-island h1,.toolbox h2,.visual-island h2,.toolbox h3,.visual-island h3,.toolbox h4,.visual-island h4,.toolbox h5,.visual-island h5,.toolbox h6,.visual-island h6,.toolbox .vi-header,.visual-island .vi-header{display:block;font-size:.802em !important;margin:0;border-bottom:1px solid #474746;font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;width:100%;background-color:#474746;padding:1em;text-transform:uppercase;color:#fff;font-weight:400;font-style:normal;text-align:center}.toolbox p,.visual-island p{padding:0 1em 1em 1em}.toolbox ul,.visual-island ul{padding:0;padding-left:1em;margin:0}.toolbox ul a,.visual-island ul a{border-bottom:none;font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif}.event-list{background-color:#eae9e6;font-size:80%;line-height:1.4}.event-list .center{text-align:center}.event-list tbody tr{min-height:30px}.event-list ul{padding-left:0;list-style-type:none}.event-list li{padding:5px 0}.event-list li:not(:last-child){border-bottom:1px solid #999999}.date-time-select{padding:1em;background-color:#f9f8f5;border:1px solid #d5d5d2;margin-bottom:0.75em;text-align:center}.date-time-select.hours{text-align:left}.date-time-select .wdn-icon-calendar{margin-right:-2.3em;position:relative;z-index:2;margin-left:0.8em}.date-time-select .am_pm{display:inline-block;font-family:"Gotham";font-size:.75em;margin-left:.75em}.date-time-select input{padding-left:2.3em;width:40%;position:relative;text-align:center}.date-time-select select{width:14%;text-align:center;padding:0}.date-time-select>*{vertical-align:middle}@media (max-width:767px){.medium-hidden{display:none}.medium-block{display:block !important}.date-time-select input{width:100%}.date-time-select select{width:30%;text-align:center}}
\ No newline at end of file
diff --git a/routes/admin.rb b/routes/admin.rb
index e1a8f62..b5bf894 100644
--- a/routes/admin.rb
+++ b/routes/admin.rb
@@ -5,6 +5,7 @@ require 'models/space_hour'
 require 'models/permission'
 
 before '/:service_space_url_name/admin*' do
+	require_login
 	load_service_space
 
 	raise Sinatra::NotFound unless !@user.nil? && @user.is_admin?(@space)
diff --git a/routes/events.rb b/routes/events.rb
index 43bfbbc..f9e7c4f 100644
--- a/routes/events.rb
+++ b/routes/events.rb
@@ -2,6 +2,7 @@ require 'models/event'
 require 'models/event_signup'
 
 get '/:service_space_url_name/events/:event_id/?' do
+	require_login
 	load_service_space
 
 	# this is an event details page
@@ -18,6 +19,7 @@ get '/:service_space_url_name/events/:event_id/?' do
 end
 
 post '/:service_space_url_name/events/:event_id/sign_up/?' do
+	require_login
 	load_service_space
 
 	# check that is a valid event
@@ -54,6 +56,7 @@ post '/:service_space_url_name/events/:event_id/sign_up/?' do
 end
 
 post '/:service_space_url_name/events/:event_id/remove_signup/?' do
+	require_login
 	load_service_space
 
 	# get the event
diff --git a/routes/resources.rb b/routes/resources.rb
index a0e344c..2c0351a 100644
--- a/routes/resources.rb
+++ b/routes/resources.rb
@@ -6,6 +6,7 @@ require 'models/event_signup'
 require 'models/space_hour'
 
 get '/:service_space_url_name/resources/?' do
+	require_login
 	load_service_space
 	@breadcrumbs << {:text => 'Resources'}
 
@@ -18,8 +19,59 @@ get '/:service_space_url_name/resources/?' do
 	}
 end
 
+# page to see the calendar for a resource
+get '/:service_space_url_name/resources/:resource_id/calendar/?' do
+	check_login
+	load_service_space
+	# check that the user has authorization to reserve this resource, if resource requires auth
+	resource = Resource.find_by(:service_space_id => @space.id, :id => params[:resource_id])
+	if resource.nil?
+		flash(:alert, 'Not Found', 'That resource does not exist.')
+		redirect @space.resources_href
+	end
+
+	@breadcrumbs << {:text => 'Resources', :href => @space.resources_href} << {:text => "#{resource.name} Calendar"}
+
+	date = params[:date].nil? ? Time.now.midnight.in_time_zone : Time.parse(params[:date]).midnight.in_time_zone
+	sunday = date.in_time_zone.week_start
+	
+	# get the reservations for this week
+	reservations = Reservation.includes(:event).where(:resource_id => resource.id).in_week(date).all
+
+	# get the space's hours for the week
+	hours = SpaceHour.where(:service_space_id => @space.id)
+		.where('effective_date < ?', (sunday+1.week+1.hour).midnight.utc.strftime('%Y-%m-%d %H:%M:%S'))
+		.order(:day_of_week, :effective_date => :desc, :id => :desc).all.to_a
+
+	hours_days = hours.group_by do |space_hour|
+		space_hour.day_of_week
+	end
+
+	week_hours = {}
+	hours_days.each do |number_of_days, array|
+		this_day = (sunday + number_of_days.days + 1.hour).midnight
+
+		# find the correct hour record to use for this day
+		array.each do |space_hour|
+			if space_hour.effective_date.in_time_zone.midnight == this_day.in_time_zone.midnight || (!space_hour.one_off && space_hour.effective_date.in_time_zone.midnight <= this_day.in_time_zone.midnight)
+				week_hours[number_of_days] = space_hour
+				break
+			end
+		end
+	end
+
+	erb :resource_calendar, :layout => :fixed, :locals => {
+		:date => date,
+		:sunday => sunday,
+		:reservations => reservations,
+		:resource => resource,
+		:week_hours => week_hours
+	}
+end
+
 # form for reserving a resource
 get '/:service_space_url_name/resources/:resource_id/reserve/?' do
+	require_login
 	load_service_space
 	@breadcrumbs << {:text => 'Resources', :href => @space.resources_href} << {:text => 'Reserve'}
 
@@ -79,6 +131,7 @@ end
 
 # submit form for reserving a resource
 post '/:service_space_url_name/resources/:resource_id/reserve/?' do
+	require_login
 	load_service_space
 
 	resource = Resource.find_by(:service_space_id => @space.id, :id => params[:resource_id])
@@ -174,11 +227,12 @@ post '/:service_space_url_name/resources/:resource_id/reserve/?' do
 	)
 
 	flash(:success, 'Reservation Created', "You have successfully reserved #{resource.name} for #{params[:length]} minutes at #{start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}")
-	redirect @space.resources_href
+	redirect "/#{@space.url_name}/resources/#{resource.id}/calendar/"
 end
 
 
 get '/:service_space_url_name/resources/:resource_id/edit_reservation/:reservation_id/?' do
+	require_login
 	load_service_space
 	@breadcrumbs << {:text => 'Resources', :href => @space.resources_href} << {:text => 'Edit Reservation'}
 
@@ -247,6 +301,7 @@ get '/:service_space_url_name/resources/:resource_id/edit_reservation/:reservati
 end
 
 post '/:service_space_url_name/resources/:resource_id/edit_reservation/:reservation_id/?' do
+	require_login
 	load_service_space
 
 	resource = Resource.find_by(:service_space_id => @space.id, :id => params[:resource_id])
@@ -340,10 +395,11 @@ post '/:service_space_url_name/resources/:resource_id/edit_reservation/:reservat
 	)
 
 	flash(:success, 'Reservation Updated', "You have successfully updated your reservation for #{resource.name}: it is now for #{params[:length]} minutes at #{start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}")
-	redirect back
+	redirect "/#{@space.url_name}/resources/#{resource.id}/calendar/"
 end
 
 post '/:service_space_url_name/resources/:resource_id/cancel/:reservation_id/?' do
+	require_login
 	load_service_space
 
 	# check that the user requesting cancel is the same as the one on the reservation
diff --git a/routes/space.rb b/routes/space.rb
index 3aa6969..16afc64 100644
--- a/routes/space.rb
+++ b/routes/space.rb
@@ -3,6 +3,7 @@ require 'models/reservation'
 require 'models/event'
 
 get '/:service_space_url_name/?' do
+	require_login
 	load_service_space
 
 	reservations = Reservation.joins(:resource).includes(:event).
diff --git a/src/less/resource_scheduler.less b/src/less/resource_scheduler.less
index fd63e9e..f4ee47f 100644
--- a/src/less/resource_scheduler.less
+++ b/src/less/resource_scheduler.less
@@ -24,6 +24,10 @@
 	float: right;
 }
 
+.wdn-band {
+	position: relative;
+}
+
 #pagetitle h3 {
 	margin-top: 0;
 }
diff --git a/views/resource_calendar.erb b/views/resource_calendar.erb
new file mode 100644
index 0000000..5d12ead
--- /dev/null
+++ b/views/resource_calendar.erb
@@ -0,0 +1,173 @@
+<% reservation_groups = reservations.group_by do |reservation|
+	reservation.start_time.in_time_zone.strftime("%Y/%m/%d")
+end %>
+
+<div id="pagetitle">
+	<h3>
+		<%= resource.name %> Calendar
+	</h3>
+</div>
+
+<div style="position: absolute; top: 1em; right: 1em; text-align: right;">
+	<% if @user %>
+	<a style="font-size: 1.25em;" class="wdn-button wdn-button-triad" href="/logout/">Log Out</a>
+	<% end %>
+	<a style="font-size: 1.5em;" class="wdn-button wdn-button-brand" href="/<%= @space.url_name %>/resources/<%= resource.id %>/reserve/">Reserve Me!</a>
+</div>
+
+<div style="margin-bottom: 16px;">
+<h4 style="text-align: center; margin: 0;">
+<%= month = sunday.strftime('%B %Y') %><%= (month2 = (sunday+6.days).strftime('%B %Y')) == month ? '' : " - #{month2}" %>
+</h4>
+<a href="/<%= @space.url_name %>/resources/<%= resource.id %>/calendar/?date=<%= (date-7.days).strftime('%Y-%m-%d') %>" class="wdn-button wdn-button-triad" id="prev-week">&lt; PREV</a>
+<a href="/<%= @space.url_name %>/resources/<%= resource.id %>/calendar/?date=<%= (date+7.days).strftime('%Y-%m-%d') %>" class="wdn-button wdn-button-triad" style="float: right;" id="next-week">NEXT &gt;</a>
+</div>
+
+<div class="calendar-container">
+	<div class="time-labels">
+		<div class="time-chart">
+			<% (12..39).each do |j| %>
+				<div class="calendar-half-hour">
+					<label><%= "#{(j / 2) % 12 + (j==24?12:0)} #{j>=24?'PM':'AM'}" if j % 2 == 0 %></label>
+				</div>
+			<% end %>
+		</div>
+	</div>
+	<% (0..6).each do |i| %>
+	<% day = (sunday + i.days + 1.hour).midnight %>
+	<% slots = [0] * 36 %>
+	<div class="calendar-day" data-day="<%= day.strftime("%Y/%m/%d") %>">
+		<label class="day-header"><%= day.strftime("%^a %-m/%d") %></label>
+		<div class="day-chart" title="Open">
+			<% if week_hours.has_key?(i) %>
+				<% # figure out where the closed divs need to be
+					# we can assume that all records in this space_hour are non-intertwined
+					closed_start = 0
+					closed_end = 0
+					starts = week_hours[i].hours.map{|record| record[:start]}
+					ends = week_hours[i].hours.map{|record| record[:end]}
+					%> <%
+					closeds = []
+					(360..1199).each do |j|
+						if starts.include?(j)
+							closed_end = j
+							closeds << [closed_start, closed_end]
+							closed_start = 0
+							closed_end = 0
+						end
+						if ends.include?(j)
+							closed_start = j
+						end
+					end 
+					closed_end = 1200
+					closeds << [closed_start, closed_end]
+
+					closeds.each do |closed|
+						start_time = closed[0] %>
+	            		<% end_time = closed[1] %>
+	            		<% 
+	            		if [((end_time - 360) / 30).floor, 35].min  < 0
+							next
+						end
+						top = ((start_time - 360) / 30) * 20
+						height = (end_time - start_time) * 20 / 30
+						if top < 0
+							height += top
+							top = 0
+						end 
+						if top + height > 720
+							height = 720 - top
+						end
+						%>
+						<div class="status closed" title="Closed" style="top: <%= top %>px; height: <%= height %>px;">
+							&nbsp;
+						</div>
+						<%
+					end
+				%>
+				<% week_hours[i].hours.each do |record| %>
+					<% if record[:status] != 'open' && record[:status] != 'closed' %>
+						<% start_time = record[:start] %>
+	            		<% end_time = record[:end] %>
+	            		<% if [((end_time - 360) / 30).floor, 35].min  < 0
+							next
+						end
+						top = ((start_time - 360) / 30) * 20
+						height = (end_time - start_time) * 20 / 30
+						if top < 0
+							height += top
+							top = 0
+						end 
+						if top + height > 720
+							height = 720 - top
+						end
+						%>
+						<div title="<%= record[:status].split('_').join(' ').capitalize_all %>" class="status <%= record[:status].downcase.split('_').join('-') %>" style="top: <%= top %>px; height: <%= height %>px;">
+							&nbsp;
+						</div>
+					<% end %>
+				<% end %>
+			<% end %>
+
+			<% day_events = reservation_groups[day.strftime("%Y/%m/%d")] %>
+			<% unless day_events.nil? %>
+			<% day_events.sort{|a, b| a.start_time <=> b.start_time}.each do |res| %>
+				<% start_slot = [(((res.start_time.in_time_zone - day.midnight) / 60 - 360) / 30).floor, 0].max 
+				end_slot = [(((res.end_time.in_time_zone - day.midnight) / 60 - 360) / 30).floor, 35].min 
+				if end_slot < 0
+					next
+				end
+				over = 0 
+				(start_slot..end_slot).each do |k|
+					over = slots[k] if slots[k] > over
+				end
+				over = [over,3].min
+				top = (((res.start_time.in_time_zone - day.midnight) / 60 - 360) / 30) * 20
+				height = res.length * 20 / 30
+				top_overflow = false
+				bottom_overflow = false
+				if top < 0
+					height += top
+					top = 0
+					top_overflow = true
+				end 
+				if top + height > 720
+					height = 720 - top
+					bottom_overflow = true
+					reservation_groups[(day + 1.day).strftime("%Y/%m/%d")] ||= []
+					reservation_groups[(day + 1.day).strftime("%Y/%m/%d")] << res
+				end
+				%>
+				<div class="event <%= 'top-overflow' if top_overflow %> <%= 'bottom-overflow' if bottom_overflow %>" 
+					style="top: <%= top %>px; height: <%= height %>px; left: <%=over*8%>px">
+					<%= 'a reservation' %>
+				</div>
+				<% (start_slot..end_slot).each do |k| %>
+					<% slots[k] = slots[k] + 1 %>
+				<% end %>
+			<% end %>
+			<% end %>
+			
+			<div>
+			<% (12..39).each do |j| %>
+				<div class="calendar-half-hour">
+					&nbsp;
+				</div>
+			<% end %>
+			</div>
+		</div>
+	</div>
+	<% end %>
+</div>
+
+<script type="text/javascript">
+require(['jquery'], function ($) {
+	var max_z = 5;
+	$(document).ready(function () {
+		$('.event').click(function (click) {
+			$(this).css('z-index', max_z);
+			max_z += 1;
+		});
+	});
+});
+</script>
\ No newline at end of file
diff --git a/views/resources.erb b/views/resources.erb
index 77821f5..8fab1a8 100644
--- a/views/resources.erb
+++ b/views/resources.erb
@@ -19,6 +19,7 @@
             <td class="table-actions">
                 <% if resource.is_reservable %>
                     <a href="/<%= @space.url_name %>/resources/<%= resource.id %>/reserve/" class="wdn-button wdn-button-brand">Reserve Time</a>
+                    <a href="/<%= @space.url_name %>/resources/<%= resource.id %>/calendar/" class="wdn-button wdn-button-triad">See Calendar</a>
                 <% else %>
                     Reservation not required
                 <% end %>
-- 
GitLab