\"},e.prototype.computeEventTimeFormat=function(){return this.opt(\"mediumTimeFormat\")},e}(o.default);e.default=s},function(t,e,n){Object.defineProperty(e,\"__esModule\",{value:!0});var i=n(2),r=n(3),o=n(59),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.handleClick=function(e,n){var i;t.prototype.handleClick.call(this,e,n),r(n.target).closest(\"a[href]\").length||(i=e.footprint.eventDef.url)&&!n.isDefaultPrevented()&&(window.location.href=i)},e}(o.default);e.default=s},function(t,e,n){Object.defineProperty(e,\"__esModule\",{value:!0});var i=n(38),r=n(52),o=n(215),s=n(216);i.default.registerClass(r.default),i.default.registerClass(o.default),i.default.registerClass(s.default)},function(t,e,n){Object.defineProperty(e,\"__esModule\",{value:!0});var i=n(51),r=n(213),o=n(214),s=n(258),a=n(259);i.defineThemeSystem(\"standard\",r.default),i.defineThemeSystem(\"jquery-ui\",o.default),i.defineThemeSystem(\"bootstrap3\",s.default),i.defineThemeSystem(\"bootstrap4\",a.default)},function(t,e,n){Object.defineProperty(e,\"__esModule\",{value:!0});var i=n(2),r=n(19),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=o,o.prototype.classes={widget:\"fc-bootstrap3\",tableGrid:\"table-bordered\",tableList:\"table\",tableListHeading:\"active\",buttonGroup:\"btn-group\",button:\"btn btn-default\",stateActive:\"active\",stateDisabled:\"disabled\",today:\"alert alert-info\",popover:\"panel panel-default\",popoverHeader:\"panel-heading\",popoverContent:\"panel-body\",headerRow:\"panel-default\",dayRow:\"panel-default\",listView:\"panel panel-default\"},o.prototype.baseIconClass=\"glyphicon\",o.prototype.iconClasses={close:\"glyphicon-remove\",prev:\"glyphicon-chevron-left\",next:\"glyphicon-chevron-right\",prevYear:\"glyphicon-backward\",nextYear:\"glyphicon-forward\"},o.prototype.iconOverrideOption=\"bootstrapGlyphicons\",o.prototype.iconOverrideCustomButtonOption=\"bootstrapGlyphicon\",o.prototype.iconOverridePrefix=\"glyphicon-\"},function(t,e,n){Object.defineProperty(e,\"__esModule\",{value:!0});var i=n(2),r=n(19),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=o,o.prototype.classes={widget:\"fc-bootstrap4\",tableGrid:\"table-bordered\",tableList:\"table\",tableListHeading:\"table-active\",buttonGroup:\"btn-group\",button:\"btn btn-primary\",stateActive:\"active\",stateDisabled:\"disabled\",today:\"alert alert-info\",popover:\"card card-primary\",popoverHeader:\"card-header\",popoverContent:\"card-body\",headerRow:\"table-bordered\",dayRow:\"table-bordered\",listView:\"card card-primary\"},o.prototype.baseIconClass=\"fa\",o.prototype.iconClasses={close:\"fa-times\",prev:\"fa-chevron-left\",next:\"fa-chevron-right\",prevYear:\"fa-angle-double-left\",nextYear:\"fa-angle-double-right\"},o.prototype.iconOverrideOption=\"bootstrapFontAwesome\",o.prototype.iconOverrideCustomButtonOption=\"bootstrapFontAwesome\",o.prototype.iconOverridePrefix=\"fa-\"},function(t,e,n){Object.defineProperty(e,\"__esModule\",{value:!0});var i=n(22),r=n(62),o=n(229);i.defineView(\"basic\",{class:r.default}),i.defineView(\"basicDay\",{type:\"basic\",duration:{days:1}}),i.defineView(\"basicWeek\",{type:\"basic\",duration:{weeks:1}}),i.defineView(\"month\",{class:o.default,duration:{months:1},defaults:{fixedWeekCount:!0}})},function(t,e,n){Object.defineProperty(e,\"__esModule\",{value:!0});var i=n(22),r=n(226);i.defineView(\"agenda\",{class:r.default,defaults:{allDaySlot:!0,slotDuration:\"00:30:00\",slotEventOverlap:!0}}),i.defineView(\"agendaDay\",{type:\"agenda\",duration:{days:1}}),i.defineView(\"agendaWeek\",{type:\"agenda\",duration:{weeks:1}})},function(t,e,n){Object.defineProperty(e,\"__esModule\",{value:!0});var i=n(22),r=n(230);i.defineView(\"list\",{class:r.default,buttonTextKey:\"list\",defaults:{buttonText:\"list\",listDayFormat:\"LL\",noEventsMessage:\"No events to display\"}}),i.defineView(\"listDay\",{type:\"list\",duration:{days:1},defaults:{listDayFormat:\"dddd\"}}),i.defineView(\"listWeek\",{type:\"list\",duration:{weeks:1},defaults:{listDayFormat:\"dddd\",listDayAltFormat:\"LL\"}}),i.defineView(\"listMonth\",{type:\"list\",duration:{month:1},defaults:{listDayAltFormat:\"dddd\"}}),i.defineView(\"listYear\",{type:\"list\",duration:{year:1},defaults:{listDayAltFormat:\"dddd\"}})},function(t,e){Object.defineProperty(e,\"__esModule\",{value:!0})}])});","/* =Events Calendar\r\n--------------------------------------------------*/\r\n\r\n// Calendar Display\r\n// Uses FullCalendar 2\r\n// Pulls events from XML file\r\n// after render, moves the events data from one nested table to another\r\n\r\n\r\n$(document).ready(function() {\r\n\r\n // for calendar page, main and secondary (home page, sidebar calendar)\r\n var calendarPage = false;\r\n if ($('#events-calendar').length) {\r\n calendarPage = true;\r\n }\r\n\r\n var secondaryCalendar = false;\r\n if ($('.secondary-calendar').length) {\r\n secondaryCalendar = true;\r\n }\r\n\r\n // eventsURL must appear on the template\r\n // var eventsURL = 'events2.xml';\r\n var currentDateStorage = 'currentDateStorage';\r\n var menuDateFormat = 'YYYY-M';\r\n var calendarDateFormat = 'YYYY-MM-DD';\r\n var feedDateFormat = 'M/D/YYYY hh:mm:ss a';\r\n var displayDateFormat = 'MMMM D YYYY';\r\n var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\n\r\n // for listing pages, including category pages\r\n var listingPage = false;\r\n if ($('.events-listing').length > 0) {\r\n listingPage = true;\r\n }\r\n var eventsPerPage = 10; // usually 20\r\n\r\n var businessName = 'Fort St. John'; // client name for add to calendar buttons\r\n var productName = 'Events Calendar'; // product name for add to calendar buttons\r\n\r\n // for the full listing page, the only one that has the category filters\r\n var listingAllPage = false;\r\n if ($('#events-all').length > 0) {\r\n listingAllPage = true;\r\n }\r\n\r\n // events detail page, just need add to calendar buttons\r\n var detailPage = false;\r\n if ($('#events-detail').length > 0) {\r\n detailPage = true;\r\n }\r\n\r\n var singleCategoryStorage = 'singleCategoryStorage';\r\n\r\n // for calendar & full listing\r\n var excludedCategoriesStorage = 'excludedCategoriesStorage';\r\n\r\n // functions for calendar\r\n\r\n // the menu uses zero indexed months: 2018-0\r\n // the calendar uses one indexed months: 2018-01-01\r\n function dateFormatMenuToCalendar(menuDate) {\r\n var arr = menuDate.split('-');\r\n calendarDate = moment(arr[0] + '-' + (parseInt(arr[1]) + 1), menuDateFormat).format(calendarDateFormat);\r\n return calendarDate;\r\n }\r\n\r\n function dateFormatCalendarToMenu(calendarDate) {\r\n var arr = calendarDate.split('-');\r\n calendarDateMoment = moment(calendarDate, calendarDateFormat);\r\n menuDate = calendarDateMoment.format('YYYY') + '-' + (parseInt(calendarDateMoment.format('M')) - 1);\r\n return menuDate;\r\n }\r\n\r\n // need to check local storage for these\r\n function getCurrentDate() {\r\n // start with the default, which is the first of this month\r\n var date = moment().startOf('month').format(menuDateFormat);\r\n\r\n // if it's already set, don't change it\r\n if (currentDate !== undefined) {\r\n date = currentDate;\r\n }\r\n // check for local storage but not if it's a secondary calendar\r\n else if (sessionStorageAvailable && (!(secondaryCalendar)) ) {\r\n var storage = sessionStorage.getItem(currentDateStorage);\r\n if (storage) {\r\n date = JSON.parse(storage);\r\n }\r\n }\r\n return date;\r\n }\r\n\r\n function updateCurrentDate(date) {\r\n\r\n // update var\r\n currentDate = date;\r\n\r\n // update sessionStorage but not on secondary calendars\r\n if (!(secondaryCalendar)) {\r\n sessionStorage.setItem(currentDateStorage, JSON.stringify(date));\r\n }\r\n }\r\n\r\n function goToCalendarDate() {\r\n eventsCalendar.fullCalendar('gotoDate', currentDate);\r\n }\r\n\r\n function setUpDateNavigation() {\r\n // set to current date\r\n // console.log(currentDate);\r\n $('#events-months option[value=\"' + dateFormatCalendarToMenu(currentDate) + '\"]').attr('selected', 'selected');\r\n\r\n // add event for menu selection\r\n $('#events-months').change(function() {\r\n var date = $('#events-months option:selected').val();\r\n updateCurrentDate(dateFormatMenuToCalendar(date));\r\n goToCalendarDate();\r\n });\r\n\r\n // add event to update menu / currentDate on nav button click\r\n // next\r\n $('#calendar .fc-right').html('');\r\n $('#calendar button#month-next').click(function(e) {\r\n var nextDate = moment(currentDate, calendarDateFormat).add(1, 'months').format(calendarDateFormat);\r\n updateCurrentDate(nextDate);\r\n $('#events-months option').removeAttr('selected');\r\n $('#events-months option[value=\"' + dateFormatCalendarToMenu(currentDate) + '\"]').attr('selected', 'selected');\r\n goToCalendarDate();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n // prev\r\n $('#calendar .fc-left').html('');\r\n $('#calendar button#month-prev').click(function(e) {\r\n var prevDate = moment(currentDate, calendarDateFormat).subtract(1, 'months').format(calendarDateFormat);\r\n updateCurrentDate(prevDate);\r\n $('#events-months option').removeAttr('selected');\r\n $('#events-months option[value=\"' + dateFormatCalendarToMenu(currentDate) + '\"]').attr('selected', 'selected');\r\n goToCalendarDate();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n }\r\n\r\n // recheck this after styling, not sure what has to change\r\n function updateCalendarCategories() {\r\n // calendarCategories = getSetting('eventsCategories');\r\n // $('#calendar .calendar-cell-wrapper').remove();\r\n $('#calendar td.calendar-has-event').removeClass('calendar-has-event');\r\n for (var j = 0; j < allCategories.length; j++) {\r\n $('#calendar td').removeClass(allCategories[j]);\r\n }\r\n eventsCalendar.fullCalendar('refetchEvents');\r\n // console.log(currentDate);\r\n // updateDateOptions();\r\n }\r\n\r\n // functions for listing & detail\r\n\r\n function createAddEventLinks(eventElement, eventID, eventStart, eventEnd, eventTitle, eventBusiness, eventProduct) {\r\n\r\n // add links\r\n var googleURL = 'https://www.google.com/calendar/event?action=TEMPLATE&text='+encodeURIComponent(eventTitle)+'&dates='+encodeURIComponent(eventStart)+'/'+encodeURIComponent(eventEnd)+'&details=&location=';\r\n\r\n var addHTML = '
';\r\n\r\n if (!detailPage) {\r\n $(eventElement).append(addHTML);\r\n }\r\n else {\r\n $('.event-submit-link').before(addHTML);\r\n }\r\n\r\n var eventDatestamp = moment().utc().format('YYYYMMDDTHHmmss')+ 'Z';\r\n // ical click\r\n $(\"#event-add-\"+eventID).click( function(e) {\r\n var text = \"BEGIN:VCALENDAR\\nMETHOD:PUBLISH\\nVERSION:2.0\\nPRODID:-//\"+eventBusiness+\"//\"+eventProduct+\"//EN\\nBEGIN:VEVENT\\nUID:\"+eventID+\"\\nDTSTAMP:\"+eventDatestamp+\"\\nDTSTART:\"+eventStart+\"\\nDTEND:\"+eventEnd+\"\\nSUMMARY:\"+eventTitle+\"\\nEND:VEVENT\\nEND:VCALENDAR\";\r\n var filename = 'event'+eventID;\r\n var blob = new Blob([text], {type: \"text/plain;charset=utf-8\"});\r\n saveAs(blob, filename+\".ics\");\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n }\r\n\r\n function paginateEvents() {\r\n // add and remove container\r\n\r\n $('#events-pager').remove();\r\n $('.events-listing').append('');\r\n\r\n $('.events-listing').paginate({\r\n itemContainer: '#events-container',\r\n itemElement: 'li',\r\n itemsPerPage: eventsPerPage,\r\n navContainer: '#events-pager',\r\n pagerLabel: 'Events List Pagination',\r\n });\r\n }\r\n\r\n\r\n // functions for full listing\r\n\r\n function updateListingCategories(allEvents) {\r\n // reset full list\r\n $('#events-container').html(allEvents);\r\n // $('li.events-item').addClass('hidden');\r\n $.each(excludedCategories, function(index, value) {\r\n $('li.events-item.category-' + value).remove();\r\n });\r\n // paginate\r\n paginateEvents();\r\n }\r\n\r\n // functions for calendar & full listing\r\n\r\n function compareArrays(array1, array2) {\r\n array1.sort();\r\n array2.sort();\r\n var arraysSame = (array1.length == array2.length) && array1.every(function(element, index) {\r\n return element === array2[index];\r\n });\r\n return arraysSame;\r\n }\r\n\r\n // check for local/session storage\r\n function storageAvailable(type) {\r\n try {\r\n var storage = window[type],\r\n x = '__storage_test__';\r\n storage.setItem(x, x);\r\n storage.removeItem(x);\r\n return true;\r\n }\r\n catch(e) {\r\n return e instanceof DOMException && (\r\n // everything except Firefox\r\n e.code === 22 ||\r\n // Firefox\r\n e.code === 1014 ||\r\n // test name field too, because code might not be present\r\n // everything except Firefox\r\n e.name === 'QuotaExceededError' ||\r\n // Firefox\r\n e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&\r\n // acknowledge QuotaExceededError only if there's something already stored\r\n storage.length !== 0;\r\n }\r\n }\r\n\r\n\r\n // get these from the on-page html because they can't be changed\r\n function getAllCategories() {\r\n var categories = [];\r\n $(\"#categories-container input[type=checkbox]\").each(function() {\r\n if ($(this).val() != 'all') {\r\n categories.push($(this).val());\r\n }\r\n });\r\n return categories;\r\n }\r\n\r\n // need to check local storage for these\r\n function getExcludedCategories() {\r\n // start with the default, none are excluded\r\n var categories = [];\r\n\r\n // if it's already set, don't change it, even if it's empty\r\n if (excludedCategories !== undefined) {\r\n categories = excludedCategories;\r\n }\r\n // check for local storage\r\n else if (sessionStorageAvailable) {\r\n var storage = sessionStorage.getItem(excludedCategoriesStorage);\r\n if (storage) {\r\n categories = JSON.parse(storage);\r\n }\r\n }\r\n\r\n return categories;\r\n }\r\n\r\n\r\n function updateExcludedCategories(action, category) {\r\n var categories = excludedCategories;\r\n\r\n // console.log('a');\r\n\r\n if (action == 'remove') {\r\n var index = categories.indexOf(category);\r\n if (index > -1) {\r\n categories.splice(index, 1);\r\n }\r\n }\r\n\r\n // means \"show all categories\"\r\n else if (action == 'all') {\r\n categories = [];\r\n }\r\n\r\n // add is the default\r\n // but check if it's already there\r\n else if ((category != 'all') && ($.inArray(category, excludedCategories) == -1)) {\r\n categories.push(category);\r\n }\r\n\r\n // update var\r\n excludedCategories = categories;\r\n\r\n // update sessionStorage\r\n sessionStorage.setItem(excludedCategoriesStorage, JSON.stringify(categories));\r\n\r\n }\r\n\r\n\r\n function setUpCategoryFiltering() {\r\n // add divs to split the list into columns\r\n\r\n var columns = 2;\r\n var categoryItem = 'label';\r\n var columnClass = 'column';\r\n\r\n $('#categories-container').each(function() {\r\n var items_per_col = new Array(),\r\n items = $(this).find(categoryItem),\r\n min_items_per_col = Math.floor(items.length / columns),\r\n difference = items.length - (min_items_per_col * columns);\r\n for (var i = 0; i < columns; i++) {\r\n if (i < difference) {\r\n items_per_col[i] = min_items_per_col + 1;\r\n } else {\r\n items_per_col[i] = min_items_per_col;\r\n }\r\n }\r\n for (var i = 0; i < columns; i++) {\r\n $(this).append($('').addClass(columnClass));\r\n for (var j = 0; j < items_per_col[i]; j++) {\r\n var pointer = 0;\r\n for (var k = 0; k < i; k++) {\r\n pointer += items_per_col[k];\r\n }\r\n $(this).find('.' + columnClass).last().append(items[j + pointer]);\r\n }\r\n }\r\n });\r\n\r\n // check on categories & set up click filtering\r\n $('#categories-container input[type=checkbox]').each(function() {\r\n var category = $(this).val();\r\n\r\n if (category != 'all') {\r\n\r\n if ($.inArray(category, excludedCategories) == -1) {\r\n $(this).prop('checked', true);\r\n }\r\n // if none are excluded, check all as well\r\n if (excludedCategories.length === 0) {\r\n $('#categories-container input#all-categories').prop('checked', true);\r\n }\r\n $(this).change(function(e) {\r\n // console.log( $(this).prop('checked'));\r\n var change = $(this).prop('checked');\r\n if (change === true) {\r\n updateExcludedCategories('remove', category);\r\n }\r\n else {\r\n updateExcludedCategories('add', category);\r\n }\r\n // check if All needs to be checked on\r\n if (excludedCategories.length === 0) {\r\n $('#categories-container input#all-categories').prop('checked', true);\r\n }\r\n else {\r\n $('#categories-container input#all-categories').prop('checked', false);\r\n }\r\n\r\n if (calendarPage) {\r\n // calendar update\r\n updateCalendarCategories();\r\n }\r\n\r\n if (listingAllPage) {\r\n updateListingCategories(allEvents);\r\n // paginate\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n }\r\n });\r\n\r\n // all\r\n\r\n $('#categories-container input#all-categories').change(function(e) {\r\n // console.log( $(this).prop('checked'));\r\n var change = $(this).prop('checked');\r\n if (change === true) {\r\n // check all\r\n $('#categories-container input[type=checkbox]').prop('checked', true);\r\n // update included categories\r\n updateExcludedCategories('all', 'all');\r\n // update calendar\r\n // updateCalendarCategories();\r\n }\r\n // if it's unchecked, it doesn't matter at all\r\n\r\n if (calendarPage) {\r\n // calendar update\r\n updateCalendarCategories();\r\n }\r\n\r\n if (listingAllPage) {\r\n updateListingCategories(allEvents);\r\n // paginate\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n }\r\n\r\n var sessionStorageAvailable = false;\r\n if (storageAvailable('sessionStorage')) {\r\n sessionStorageAvailable = true;\r\n $('.calendar').addClass('calendar-storage_available');\r\n }\r\n\r\n // main calendar page and list all events page are the only ones with the category filter\r\n if (listingAllPage || (calendarPage && !(secondaryCalendar)) ) {\r\n\r\n\r\n var allCategories = getAllCategories();\r\n var excludedCategories = getExcludedCategories();\r\n\r\n // if we're coming from a detail page, we need to check for the single category to filter on\r\n // why that detail link can't just go to the category page, we will never know...\r\n\r\n if (listingAllPage) {\r\n\r\n if (sessionStorageAvailable) {\r\n\r\n // got to check for the single category first; that gets sent from the detail page\r\n\r\n // if it's there, grab the value\r\n\r\n var singleCategory = sessionStorage.getItem(singleCategoryStorage);\r\n // console.log(singleCategory);\r\n if (singleCategory) {\r\n\r\n // set excluded to all, then rm the single one\r\n\r\n excludedCategories = getAllCategories();\r\n\r\n updateExcludedCategories('remove', singleCategory);\r\n\r\n // then remove the single category from session storage\r\n sessionStorage.removeItem(singleCategoryStorage)\r\n }\r\n\r\n }\r\n }\r\n\r\n setUpCategoryFiltering();\r\n }\r\n\r\n if (secondaryCalendar) {\r\n // always show all events even if they've filtered them on the main calendar page\r\n // but don't update session storage\r\n var excludedCategories = '';\r\n }\r\n\r\n if (calendarPage) {\r\n var currentDate = getCurrentDate();\r\n // we still have to use CSS to remove the .fc-content-skeleton divs\r\n // just an easier way of dealing with it\r\n var eventsCalendar = $('#calendar').fullCalendar({\r\n header: {\r\n left: '',\r\n center: 'title',\r\n right: ''\r\n },\r\n navLinks: false,\r\n handleWindowResize: false,\r\n height: 'auto',\r\n // dayNamesShort: days,\r\n columnHeaderHtml: function(mom) {\r\n for (i=0; i<=6; i++) {\r\n if (mom.day() === i) {\r\n return days[i];\r\n }\r\n }\r\n },\r\n defaultDate: moment(currentDate, menuDateFormat).format(calendarDateFormat),\r\n // defaultDate: moment('20180701', 'YYYYMMDD').format('YYYY-MM-DD'),\r\n displayEventTime: false,\r\n events: function(start, end, timezone, callback) {\r\n $.ajax({\r\n url: eventsURL,\r\n dataType: 'xml',\r\n cache: false,\r\n success: function(doc) {\r\n var events = [];\r\n $(doc).find('event').each(function() {\r\n var days = $(this).attr('days');\r\n // console.log($.inArray($(this).attr('cat'), excludedCategories));\r\n if ($.inArray($(this).attr('cat'), excludedCategories) == -1) {\r\n for(var j = 0; j < parseInt(days); j++) {\r\n events.push({\r\n title: $(this).attr('name'),\r\n start: moment($(this).attr('startDate'), feedDateFormat).add(j, 'days'),\r\n url: $(this).attr('url'),\r\n category: $(this).attr('cat')\r\n });\r\n }\r\n }\r\n });\r\n callback(events);\r\n },\r\n error: function() {\r\n // console.log('sorry');\r\n }\r\n });\r\n },\r\n eventRender: function(event, element) {\r\n var day = event.start.format(calendarDateFormat);\r\n\r\n element.addClass('category-' + event.category + ' calendar-event');\r\n var theEvent = element;\r\n $('td[data-date=\"'+day+'\"]').addClass(event.category).addClass('calendar-has-event').append(element);\r\n },\r\n eventAfterAllRender: function() {\r\n $('.fc-bg td.fc-day .calendar-cell-wrapper').remove();\r\n\r\n $('.fc-content-skeleton thead td').each(function() {\r\n var date = $(this).data('date');\r\n var day = $(this).html();\r\n\r\n $('.fc-bg').find('td[data-date='+ date +']').prepend(day);\r\n // wrap events in UL, add number of events per day\r\n $('.fc-bg td.calendar-has-event').children('a.fc-event').wrap('
');\r\n });\r\n\r\n $('.fc-bg td.calendar-has-event').each(function() {\r\n\r\n var eventDayMoment = moment($(this).data('date'), calendarDateFormat);\r\n\r\n var eventDay = eventDayMoment.format(displayDateFormat);\r\n\r\n $(this).children('li').wrapAll('