$( document ).ready( function() {
var myCalendar = ( function() {
var canSubmit = false;
var showFilteredEvents = true;
var checkCalendarHeightTID;
var allEvents = {
startDate: '2025-12-18',
endDate: '2025-12-18',
currentView: $(window).width() < 767 ? 'list' : 'basicWeek',
eventList: [],
start: function(date) {
if ( date && (date !== undefined) ) {
this.startDate = date;
$('.fc-custom-search #start-date').val(date);
} else {
return this.startDate;
}
},
end: function(date) {
if ( date && (date !== undefined) ) {
this.endDate = date;
$('.fc-custom-search #end-date').val(date);
} else {
return this.endDate;
}
},
view: function(view) {
if ( view && (view !== undefined) ) {
this.currentView = view;
$('.fc-custom-search #view').val(view);
} else {
var formView = $('.fc-custom-search #view').val();
if ( formView && (formView !== undefined) ) {
this.currentView = formView;
}
return this.currentView;
}
},
events: function(events) {
if ( events && (events !== undefined) ) {
this.eventList = events;
} else {
return this.eventList;
}
},
eventSearchText: function(event) {
var searchText = '';
searchText = searchText + event.title.toLowerCase() + ' ';
searchText = searchText + event.intro.toLowerCase() + ' ';
if ( event.school != null && event.school.length > 0 ) {
for (var i=0; i < event.school.length; i++) {
searchText = searchText + event.school[i].toLowerCase() + ' ';
}
}
return searchText;
},
filterBySchool: function(event) {
var schools = $('#school-list').val();
if ( schools != null && schools.length == 1 && schools[0] == '' ) {
return true;
}
if ( schools != null && schools.length > 0 ) {
if ( event.school != null && event.school.length > 0 ) {
for (var i=0; i < schools.length; i++) {
for (var j=0; j < event.school.length; j++) {
if ( schools[i] == event.school[j] ) {
return true;
}
}
}
} else {
return false;
}
} else {
return true;
}
},
searchEvents: function(event) {
var query = $('#search-query').val().toLowerCase();
if ( query != null && query.length > 0 ) {
var queryTerms = query.split(/[ ,]+/).filter(Boolean);
// "this." doesn't work for some reason I don't understand, so I use "allEvents." instead
var searchText = allEvents.eventSearchText(event);
for (var i=0; i < queryTerms.length; i++) {
if ( searchText.search(queryTerms[i]) < 0 ) {
return false;
}
}
return true;
} else {
return true;
}
},
filterEvents: function() {
toggleFilterButtons();
if ( showFilteredEvents ) {
var filteredEvents = this.events().filter(this.filterBySchool);
return filteredEvents.filter(this.searchEvents);
} else {
return this.events();
}
}
};
var makeToolTip = function( element, url ) {
$element = $(element);
$element.data('url', url);
$element.qtip({
content: {
text: function( event, api ) {
$.ajax({
url: 'https://engineering.purdue.edu/Wraps/Widgets3/EventCalendar/wrap8/previewEvent?url=' + $(this).data('url'), // URL to the JSON file
type: 'GET', // POST or GET
dataType: 'json', // Tell it we're retrieving JSON
data: {
}
}).then( function( data ) {
// Now we set the content manually (required!)
api.set('content.text', data);
addtocalendar.load();
}, function(xhr, status, error) {
// Upon failure... set the tooltip content to the status and error value
api.set('content.text', status + ': ' + error);
});
return 'Loading...' // Set some initial loading text
}
},
position: {
my: 'center left', // Position center left of qTip...
at: 'center center', // at the center of element...
target: $(element), // my target
viewport: $(window),
effect: false,
adjust: {
method: 'shift'
}
},
style: {
classes: 'qtip-bootstrap'
},
show: {
delay: 250,
effect: function() {
$(this).fadeTo(350, 1);
}
},
hide: {
delay: 250,
effect: function() {
$(this).fadeTo(200, 0);
},
fixed: true
}
})
}
var showLoading = function() {
$('.fc-view')
.append( $('
') )
.show();
}
var hideLoading = function() {
$('.fc-view .fc-loading').remove();
}
var adjustCalendarHeight = function() {
fullHeight = $('.fc-scroller .fc-day-grid').height();
if ( $('.fc-scroller').height() < fullHeight ) {
$('.fc-scroller').height( fullHeight );
}
checkCalendarHeightTID = window.setTimeout( adjustCalendarHeight, 1000 );
}
var fcCalendar = $('#calendar').fullCalendar({
defaultDate: '2025-12-18',
scrollTime: '08:00',
editable: false,
height: 500,
defaultView: allEvents.view(),
header: {
left: 'title',
center: 'basicDay,basicWeek,month,list',
right: 'today prev,next'
},
views: {
list: {
titleFormat: 'MMM D',
weekends: true
}
},
eventSources: [
{
events: function(start, end, timezone, callback) {
var startDate = $.fullCalendar.moment(start).format();
var endDate = $.fullCalendar.moment(end).format();
if ( allEvents.start() != startDate || allEvents.end() != endDate) {
allEvents.start(startDate);
allEvents.end(endDate);
$.ajax({
url: 'https://engineering.purdue.edu/Wraps/Widgets3/EventCalendar/wrap8/pyGetCalendarEvents',
type: 'GET',
dataType: 'json',
cache: true,
data: {
start: startDate,
end: endDate
},
success: function(events) {
allEvents.events(events);
callback( allEvents.filterEvents() );
},
error: function() {
alert('There was an error fetching events from https://engineering.purdue.edu/Wraps/Widgets3/EventCalendar/wrap8/pyGetCalendarEvents.');
}
});
}
else {
callback( allEvents.filterEvents() );
}
}
}
],
loading: function( isLoading, view ) {
// isLoading gives boolean value
if(isLoading) {
showLoading();
} else {
hideLoading();
}
},
viewRender: function( view, element ) {
allEvents.view(view.name);
hideLoading();
showLoading();
},
eventAfterAllRender: function( view ) {
adjustCalendarHeight();
hideLoading();
},
eventRender: function( event, element ) {
if (event.class != "") {
$(element).addClass(event.class);
}
makeToolTip( element, event.url );
},
eventClick: function(event) {
if (event.url) {
window.open(event.url, '_blank');
return false;
}
},
dayClick: function(date, jsEvent, view) {
$('#calendar').fullCalendar( 'changeView', 'basicDay' );
$('#calendar').fullCalendar( 'gotoDate', date );
$('#calendar .fc-basicWeek-button').blur();
$('#calendar .fc-basicDay-button').focus();
},
schedulerLicenseKey: 'CC-Attribution-NonCommercial-NoDerivatives'
});
var refetchEvents = function() {
$('#calendar').fullCalendar('refetchEvents');
}
var showFilteredEvents = function() {
showFilteredEvents = true;
toggleFilterButtons();
refetchEvents();
}
var showAllEvents = function() {
showFilteredEvents = false;
toggleFilterButtons();
refetchEvents();
}
var toggleFilterButtons = function(show) {
if ( showFilteredEvents ) {
$('#show-filtered-events').addClass('fc-state-active');
$('#show-all-events').removeClass('fc-state-active');
} else {
$('#show-filtered-events').removeClass('fc-state-active');
$('#show-all-events').addClass('fc-state-active');
}
}
$('.search-results ul li').each( function( index, element ) {
$link = $(element).find('a').first();
url = $link.attr('href');
makeToolTip( $link, url );
});
$('#school-list').change( function( event ) {
refetchEvents();
event.preventDefault();
});
$('#search-query').change( function( event ) {
refetchEvents();
// enable the following line to make the form submit only when the submit button is clicked
// event.preventDefault();
}).keyup( function () {
// fire the above change event after every letter
$(this).change();
});
$('.clear-search').click( function(event) {
// document.getElementById('fc-custom-search').reset();
$('#fc-custom-search option').prop("selected", false);
$('#search-query').val('');
// event.preventDefault();
// $('.search-results').remove();
// showFilteredEvents = false;
// toggleFilterButtons();
// refetchEvents();
});
$('#show-filtered-events').click(showFilteredEvents);
$('#show-all-events').click(showAllEvents);
return {
showFilteredEvents: showFilteredEvents,
showAllEvents: showAllEvents
};
})();
});