$( 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 }; })(); });