module BannerHelper
def active_banners
BANNERS.reject do |_k, v|
- enddate = v[:enddate]
begin
- parsed = enddate && Date.parse(enddate)
- rescue
- parsed = nil
+ startdate = v[:startdate] && Date.parse(v[:startdate])
+ rescue StandardError
+ startdate = nil
end
- parsed.is_a?(Date) && parsed.past?
+
+ begin
+ enddate = v[:enddate] && Date.parse(v[:enddate])
+ rescue StandardError
+ enddate = nil
+ end
+
+ startdate&.future? || enddate&.past?
end
end
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"
# rotate all banner queue positions
index = cval.to_i
- cookies[ckey] = index - 1 if index > 0
+ cookies[ckey] = index - 1 if index.positive?
- # pick banner with mininum queue position
+ # 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 banner_key.nil?
end
end
- def cookie_id(key)
+ def banner_cookie(key)
"_osm_banner_#{key}"
end
end