module BannerHelper
+ def active_banners
+ BANNERS.reject do |_k, v|
+ begin
+ startdate = v[:startdate] && Date.parse(v[:startdate])
+ rescue StandardError
+ startdate = nil
+ end
- def all_banners()
- {
- :sotmus2016 => {
- :id => 'sotmus2016',
- :alt => 'State of the Map US 2016',
- :link => 'http://stateofthemap.us/',
- :img => 'banners/sotmus-2016.jpg',
- :enddate => '2016-jul-23'
- },
- :sotm2016 => {
- :id => 'sotm2016',
- :alt => 'State of the Map 2016',
- :link => 'http://2016.stateofthemap.org/',
- :img => 'banners/sotm-2016.jpg',
- :enddate => '2016-sep-23'
- }
- }
- end
+ begin
+ enddate = v[:enddate] && Date.parse(v[:enddate])
+ rescue StandardError
+ enddate = nil
+ end
- def active_banners()
- all_banners().reject do |k,v|
- enddate = v[:enddate]
- parsed = (enddate and Date.parse enddate rescue nil)
- parsed.is_a?(Date) and parsed.past?
+ startdate&.future? || enddate&.past?
end
end
# returns the least recently seen banner that is not hidden
- def next_banner()
- banners = active_banners()
- bannerKey = nil
- cookieKey = nil
- queuePos = 9999
+ def next_banner
+ banners = active_banners
+ banner_key = nil
+ cookie_key = nil
+ min_index = 9999
+ min_date = Date.new(9999, 1, 1)
banners.each do |k, v|
- ckey = cookie_id(v[:id]).to_sym
+ ckey = banner_cookie(v[:id]).to_sym
cval = cookies[ckey] || 0
- next if cval == 'hide'
+ next if cval == "hide"
# rotate all banner queue positions
index = cval.to_i
- if index > 0
- cookies[ckey] = index - 1
- end
+ cookies[ckey] = index - 1 if index.positive?
- # pick banner with mininum queue position
- if index <= queuePos
- bannerKey = k
- cookieKey = ckey
- queuePos = index
- end
+ # pick banner with minimum queue position
+ next if index > min_index
+
+ # or if equal queue position, pick banner with soonest end date (i.e. next expiring)
+ end_date = Date.parse(v[:enddate])
+ next if index == min_index && end_date > min_date
+
+ banner_key = k
+ cookie_key = ckey
+ min_index = index
+ min_date = end_date
end
- unless bannerKey.nil?
- cookies[cookieKey] = banners.length # bump to end of queue
- banners[bannerKey]
+ unless banner_key.nil?
+ cookies[cookie_key] = banners.length # bump to end of queue
+ banners[banner_key]
end
end
- def cookie_id(key)
+ def banner_cookie(key)
"_osm_banner_#{key}"
end
-
end