Original source (on modern site)
Now that the warm weather finally has inspired us to get off our couches, Greater Cincinnati has a ton of fun ways to enjoy a day (or night) out on the town. Whether you're looking to cheer on some marathon runners, down a few margaritas in honor of Cinco de Mayo or check out some local art, this roster of events has something for every sort of weekend warrior.
If you're looking for even more to do every day of the week, visit the CityBeat events calendar, which is free to use if you have something planned that you'd like to advertise to CityBeat readers.
`
this.removeSpinner = () => {
jQuery(slideshowInstance.itemContainerSelector + ' div[uk-spinner]').remove()
};
this.prevPageLinkHTML = ``
this.nextPageLinkHTML = ``
Object.defineProperties(this, {
'items': {
get: function() {
return jQuery(this.itemContainerSelector).find(this.itemSelector)
}
},
'currentItem': {
get: function() {
var foundItem = null
var foundItemInView = null
this.items.each(function () {
var currentInView = elementInView(jQuery(this), scrollTopOffset, 0)
if (currentInView) {
// An in view item is already located extra logic
if (foundItemInView && foundItemInView.inView) {
// The entire previously found item is visible - it wins
if (foundItemInView.topInView && foundItemInView.bottomInView) return
// The previously found item covers the visible area - it wins
if (foundItemInView.middleCoversView) return
// The previously found item has more surface area - it wins
if (foundItemInView.percentVisable > currentInView.percentOfViewHeight) return
}
foundItem = jQuery(this)
foundItemInView = currentInView
}
})
return foundItem
}
},
'currentItemIndex': {
get: function() {
var currentElement = this.currentItem.closest('[slide-index]')
if(currentElement) {
return parseInt(currentElement.attr('slide-index'))
}
return null
}
},
'currentItemId': {
get: function() {
var currentElement = this.currentItem.closest('[slide-id]')
if(currentElement) {
return currentElement.attr('slide-id')
}
return null
}
}
})
var slideshowInstance = this
// xxx for debuggering - ig
window.slideshowInstance = slideshowInstance;
var scrollTopOffset = window.innerHeight > this.smallMenuBreakPoint ? 110 : 140
var originUrl = window.location.href
this.scrollToIndex = function (index) {
var slideItem = this.items.filter('[slide-index="' + index + '"]')
if (slideItem.length) {
var topOffset = slideItem.offset().top - scrollTopOffset
// window.scrollTo({ top: topOffset, behavior: 'smooth' })
window.scrollTo({ top: topOffset, behavior: 'auto' })
}
else {
this.fetchMore(index, function () {
slideshowInstance.scrollToIndex(index)
})
}
}
this.fetchMore = function (startIndex, callback) {
var currentItemOnFetch = this.currentItem
var url = '/cincinnati/12-things-to-do-in-cincinnati-this-weekend-may-3-5/Slideshow/17354917'
var params = {
ajaxComponent: componentId,
action: 'grabMore',
startIndex: startIndex,
oid: slideshowOid,
cb: '1714755326',
}
if (paginate) {
params.paginate = paginate;
}
var keywords = currentItemOnFetch.attr('slide-keywords')
if (keywords) {
params.keywords = keywords
}
if (editorView === true) {
params.editor = true
}
//
jQuery.ajax({
url: url,
type: 'GET',
data: params,
dataType: 'json',
//
beforeSend: function () { console.log('Fetching results') },
success: function (data) {
console.log('success', data.results, data.results.length, data.error, data)
if (data) {
if (data.error) {
console.log(data.error)
}
else if (data.results) {
console.log('slideshowInstance.items', slideshowInstance.items)
for (var i = 0; i < data.results.length; i++) {
var resultItem = jQuery(data.results[i])
//
// var resultItem = jQuery.parseHTML(data.results[i], document, true);
var resultItemIndex = parseInt(resultItem.attr('slide-index'))
var resultAlreadyInserted = slideshowInstance.items.filter('[slide-index="' + resultItemIndex + '"]').length > 0
console.log('result', resultItemIndex)
var previousItem = null
var previousItemIndex = 0
if (!resultAlreadyInserted) {
slideshowInstance.items.each(function () {
if (resultAlreadyInserted) return
var currentItem = jQuery(this)
var currentItemIndex = parseInt(currentItem.attr('slide-index'))
if (resultItemIndex === currentItemIndex ) {
resultAlreadyInserted = true
return
}
else if (resultItemIndex > previousItemIndex
&& resultItemIndex < currentItemIndex) {
var topOffsetBeforeInsert = currentItemOnFetch.get(0).getBoundingClientRect().top
resultItem.insertBefore(currentItem)
resultAlreadyInserted = true
var adjustedTopPosition = currentItemOnFetch.offset().top - topOffsetBeforeInsert
window.scrollTo({ top: adjustedTopPosition, behavior: 'auto' })
}
previousItem = currentItem
previousItemIndex = currentItemIndex
})
if (!resultAlreadyInserted) {
var topOffsetBeforeInsert = currentItemOnFetch.get(0).getBoundingClientRect().top
resultItem.insertAfter(slideshowInstance.items.last())
resultAlreadyInserted = true
var adjustedTopPosition = currentItemOnFetch.offset().top - topOffsetBeforeInsert
window.scrollTo({ top: adjustedTopPosition, behavior: 'auto' })
if (typeof instgrm === 'object' && instgrm.Embeds && typeof instgrm.Embeds.process === 'function') {
setTimeout(instgrm.Embeds.process, 200);
}
}
}
}
}
else { console.log('How did we get here?') }
}
else { console.log('No result or error returned from content request.') }
},
complete: function () {
slideshowInstance.items = jQuery(slideshowInstance.itemSelector) // Update items result
slideshowInstance.removeSpinner();
if (typeof callback === 'function') { callback() }
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR, textStatus, errorThrown);
if (textStatus === 'timeout') {
slideshowInstance.removeSpinner();
if (paginate === true) return;
paginate = true;
if (slideshowInstance.items.length < totalSlides) {
var firstLoadedIndex = parseInt(slideshowInstance.items.first().attr('slide-index')) || 1;
var lastLoadedIndex = parseInt(slideshowInstance.items.last().attr('slide-index')) || totalSlides;
if(firstLoadedIndex > 1) {
var prevLink = jQuery(slideshowInstance.prevPageLinkHTML);
var prevLinkUrl = new URL(url, `https://www.citybeat.com`);
prevLinkUrl.searchParams.append('startIndex', firstLoadedIndex - 1);
prevLinkUrl.searchParams.append('paginate', 'true');
prevLink.attr('href', prevLinkUrl.href);
jQuery(slideshowInstance.itemContainerSelector).prepend(prevLink);
}
if(lastLoadedIndex < totalSlides) {
var nextLink = jQuery(slideshowInstance.nextPageLinkHTML);
var nextLinkUrl = new URL(url, `https://www.citybeat.com`);
nextLinkUrl.searchParams.append('startIndex', lastLoadedIndex + 1);
nextLinkUrl.searchParams.append('paginate', 'true');
nextLink.attr('href', nextLinkUrl.href);
jQuery(slideshowInstance.itemContainerSelector).append(nextLink);
}
}
}
}
})
}
//
var lazyLoadSurroundingItemsInterval = null;
var lazyLoadTimeout = null;
var lazyLoadSurroundingItems = function (index) {
if (paginate) return;
if (slideshowInstance.items.length >= totalSlides) {
clearInterval(lazyLoadSurroundingItemsInterval);
}
if (slideshowInstance.lazyLoadMoreResults) {
// Rate limit lazyloading more slides
clearTimeout(lazyLoadTimeout);
lazyLoadTimeout = setTimeout(function () {
var prevIndex = Math.max(index - 1, 1)
var prevPrevIndex = Math.max(index - 2, 1)
var nextIndex = index + 1
var nextNextIndex = index + 2
var prevIndexLoaded = slideshowInstance.items.filter('[slide-index="' + prevIndex + '"]').length > 0
var prevPrevIndexLoaded = slideshowInstance.items.filter('[slide-index="' + prevPrevIndex + '"]').length > 0
var nextIndexLoaded = slideshowInstance.items.filter('[slide-index="' + nextIndex + '"]').length > 0
var nextNextIndexLoaded = slideshowInstance.items.filter('[slide-index="' + nextNextIndex + '"]').length > 0
if(!prevIndexLoaded) {
slideshowInstance.removeSpinner();
// jQuery(slideshowInstance.itemContainerSelector).prepend(slideshowInstance.spinnerHTML)
slideshowInstance.fetchMore(Math.max(prevIndex - (fetchMoreMaxCount - 1), 1))
}
else if(!prevPrevIndexLoaded) {
slideshowInstance.removeSpinner();
// jQuery(slideshowInstance.itemContainerSelector).prepend(slideshowInstance.spinnerHTML)
slideshowInstance.fetchMore(Math.max(prevPrevIndex - (fetchMoreMaxCount - 1), 1))
}
if(!nextIndexLoaded) {
slideshowInstance.removeSpinner();
jQuery(slideshowInstance.itemContainerSelector).append(slideshowInstance.spinnerHTML)
slideshowInstance.fetchMore(nextIndex)
}
else if(!nextNextIndexLoaded) {
slideshowInstance.removeSpinner();
jQuery(slideshowInstance.itemContainerSelector).append(slideshowInstance.spinnerHTML)
slideshowInstance.fetchMore(nextNextIndex)
}
}, 200)
}
}
//
var lazyLoadLastCheckedIndex = slideshowInstance.currentItemIndex
lazyLoadSurroundingItemsInterval = setInterval(function () {
var currentIndex = slideshowInstance.currentItemIndex
console.log(`lazyLoadSurroundingItemsInterval - currentIndex: ${currentIndex}; lazyLoadLastCheckedIndex: ${lazyLoadLastCheckedIndex}`);
if(currentIndex !== lazyLoadLastCheckedIndex) {
lazyLoadLastCheckedIndex = currentIndex;
lazyLoadSurroundingItems(currentIndex);
}
}, 1000);
var onScrollLastCheckedIndex = slideshowInstance.currentItemIndex
jQuery(window).on('scroll resize', function () {
var currentIndex = slideshowInstance.currentItemIndex
if(currentIndex !== onScrollLastCheckedIndex) {
onScrollLastCheckedIndex = currentIndex
// console.log(`Slide Item index: ${currentIndex}`)
fireEvent('foundation:slideshow:slidechange')
}
});
// var onScrollTimeout = null;
// jQuery(window).on('scroll resize', function () {
// // Rate limit lazyloading more slides
// clearTimeout(onScrollTimeout);
// onScrollTimeout = setTimeout(function () {
// var currentIndex = slideshowInstance.currentItemIndex
// if(currentIndex !== onScrollLastCheckedIndex) {
// onScrollLastCheckedIndex = currentIndex
// console.log(`Slide Item index: ${currentIndex}`)
// fireEvent('foundation:slideshow:slidechange')
// }
// }, 100);
// });
this.initialized = false
this.init = function () {
if (this.initialized === true) return
// Prevent the browser from trying to scroll to the last scroll position before reload
if (history.scrollRestoration) {
history.scrollRestoration = 'manual'
}
var startIndex = this.items.first().attr('slide-index')
var oid = window.location.pathname.match(/\d+$/)
if (oid) {
var grabIndex = parseInt(this.items.closest('[slide-id="' + oid[0] + '"]').attr('slide-index'))
if (!isNaN(grabIndex)) {
var startIndex = grabIndex
}
}
// if (startIndex > 1) {
// this.scrollToIndex(startIndex)
// }
// if(jQuery(this.itemContainerSelector + '[single-listing]').length === 0) {
// this.lazyLoadMoreResults = true
// }
this.lazyLoadMoreResults = true
this.initialized = true
lazyLoadSurroundingItems(startIndex)
}
return this
}
var SlideshowItems = new SlideshowItemsObj()
// Ad refresh on slide change handling
var adSlideChangeRefreshThreshold = 10;
var adSlideChangeRefreshTimeout = null;
//
adSlideChangeRefreshTimeout = setTimeout(function () {
adSlideChangeRefreshTimeout = null; // Set timer to null
}, adSlideChangeRefreshThreshold)
// Timeout to prevent fast jogging from item to item
var itemChangeTimeout = null
jQuery(document).on('foundation:slideshow:slidechange', function () {
if (editorView !== true) {
updateMetaDataFromElement(SlideshowItems.currentItem)
}
// Google Anayltics track pageview
if (typeof ga === 'function') {
console.log("foundation:slideshow:slidechange event", "sending pageview navigation to:", window.location.href);
ga('set', 'location', window.location.href)
for (let i = 1; i <= 3; i++) {
let currentDimension = jQuery(SlideshowItems.currentItem).attr('ga-dimension'+i)
if (typeof currentDimension === 'string') {
ga('set', 'dimension' + i, currentDimension)
}
else {
ga('set', 'dimension' + i, '')
}
}
ga('send', 'pageview')
}
//
if (adSlideChangeRefreshTimeout === null) {
//
adSlideChangeRefreshTimeout = setTimeout(function () {
adSlideChangeRefreshTimeout = null; // Set timer to null
}, adSlideChangeRefreshThreshold)
//
if (Foundation.Ad && Foundation.Ad.slots) {
if (typeof (Foundation.Ad.slots['CIN_Footer-1']) === 'object') {
Foundation.Ad.showFooter('CIN_Footer-1');
}
}
//
if (Foundation.Gpt && Foundation.Gpt.getInPageSlotDataById) {
var gptSlots = window.googletag.pubads().getSlots();
var gptSlotFixedFooter = gptSlots.filter((slot) => slot.getSlotElementId() === `FixedFooter`)
if (gptSlotFixedFooter.length) {
Foundation.Gpt.ShowAd.refreshFixedFooter(gptSlotFixedFooter[0]);
}
}
}
});
// Try to init immediately
SlideshowItems.init()
// On document loaded
jQuery(function () {
SlideshowItems.init()
})
// })();