CINXE.COM

UIS Ticket Office

<!DOCTYPE html> <html> <head> <!-- CCU 03/2006 meta tags settings start --> <title>UIS Ticket Office</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta name="referrer" content="origin"> <meta name="description" content="Buy tickets online. UIS Ticket Office ticket reservation system. Book your tickets instantly."> <meta name="keywords" content="UIS Ticket Office, tickets,Buy Tickets, events, performances, shows, online ticketing"> <meta name="author" content="ShoWare"> <meta name="abstract" content="Buy tickets and see performance listings from UIS Ticket Office"> <meta name="robots" content="INDEX, FOLLOW"> <meta property="og:url" content="https://uisticketoffice.showare.com" /> <meta property="og:site_name" content="UIS Ticket Office" /> <meta property="og:type" content="website" /> <meta property="og:title" content="UIS Ticket Office" /> <meta property="og:description" content="Check This Out: Buy tickets and see performance listings from UIS Ticket Office" /> <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.8, minimum-scale=1.0' name='viewport' /> <meta name="google-translate-customization" content="9aaf36daf6e43103-a12f76fcd2014ac8-g804c3b886a9cdf60-11"></meta> <link rel="stylesheet" type="text/css" href="//uisticketoffice.showare.com/include/structure.css?ver=20228"> <link rel="stylesheet" type="text/css" href="//uisticketoffice.showare.com/include/style.css?ver=20228"> <link rel="stylesheet" type="text/css" media="only screen and (max-width: 1024px)" href="//uisticketoffice.showare.com/include/mobile.css?ver=20228"> <script type="text/javascript" src="//uisticketoffice.showare.com/include/javascript.js?ver=20228"></script> <script type="text/javascript" src="//uisticketoffice.showare.com/include/jq.js"></script> <script type='text/javascript' src='/include/jquery-3.5.1.min.js'></script><script type='text/javascript' src='/include/jqueryui-themes/jquery-ui.min.js'></script> <script async type="text/javascript" src="//uisticketoffice.showare.com/include/mobile.js"></script> <script type="text/javascript"> if (!navigator.cookieEnabled) { alert("Your browser settings are currently configured to not allow cookies. Please enable cookies and try again."); window.stop(); document.execCommand("Stop"); //works in IE, } </script> <script type="text/javascript" src="//uisticketoffice.showare.com/include/swApi.js"></script> <script type="text/javascript"> var window = window || {}; var Showare = Showare || {}; var document = document || undefined; Showare.Logger = { Settings: { ShouldLogInDev: true }, data: null, env: {} } window.onerror = function(msg, url, lineNo, _, error) { var envInfo = Showare.Logger._getEnvironmentDetails(); var message = { Description: msg, SourceFile: url, SourceLine: lineNo, Referer: envInfo.referer, QueryString: envInfo.querystring, ErrorType: Showare.Logger.Settings.ErrorType, Website: envInfo.website, ShouldLogInDev: Showare.Logger.Settings.ShouldLogInDev, Browser: envInfo.browser, IPAddress: envInfo.ipaddress }; if (error != undefined) { message.Exception = error.stack; } if (Showare.Logger.data) { message.StateVariables = JSON.stringify(Showare.Logger.data); } swApi.sendRequest("POST", "/v1/errorlog/", message); Showare.Logger.data = null; return false; function shouldfilterError() { return !( // This error gets thrown by third party includes, to see full error, we need // to do https://blog.sentry.io/2016/05/17/what-is-script-error.html (msg.search("\s*Script error.*") == -1) && // Related to iOS issue: https://github.com/getsentry/raven-js/issues/756 (msg.search(".*evaluating 'elt.parentNode'.*") == -1)) } }; Showare.Logger.log = function(exception, data) { Showare.Logger.data = data; if (Object.prototype.toString.call(exception) == "[object Error]") { if (exception.stack) { var ex = exception.stack.split('\n'); // Parse exceptions in the format of // ' at src (javascript.js?ver=20228:510)' var data = ex[1].match(/.+\((.+):(\d+):(\d+)\)/); // and // ' at src javascript.js?ver=20228:510' if (!data) { data = ex[1].match(/.+\s(.+):(\d+):(\d+)/); } window.onerror(ex[0], data[1], data[2], '', exception); } else { window.onerror(exception.name + ": " + exception.message, '', ''); } } else { window.onerror(exception, '', ''); } }; Showare.Logger.warn = function(msg, data) { var logDetails = { environment: Showare.Logger._getEnvironmentDetails(), message: msg, data: data } swApi.sendRequest("POST", "/v1/errorlog/warn", logDetails); return; }; Showare.Logger._getEnvironmentDetails = function() { Showare.Logger.Settings.ErrorType = 'Javascript'; return { browser: "Mozilla/4.0 compatible MSIE 7.0 Windows NT 6.0 SLCC1 .NET CLR 2.0.50727 .NET CLR 3.0.04506 .NET CLR 3.5.21022 .NET CLR 1.0.3705 .NET CLR 1.1.4322", ipaddress: "8.222.208.146", querystring: window.location.href, referer: "", website: "uisticketoffice.showare.com", basketid: "6kLTVUS0FTQ4A1MDMzMjESMTI0MD0yMxAxNTEzMTICMiIyLj04OyQ2MTguMD4UV0ZCVkRCLJ____oWlR" } } </script><script type="text/javascript"> //---------------------------DATEPICKER--------------------------------- function buildDatepicker(options) { //Calling this function should be sufficient to create a calendar within a designated div, with and //EX: headerDP = buildDatepicker({"calendarID":"headerCalendar","linkedInputID":"headerCalendarInput","isModal":false,"forceDates":true, "defaultDate": "{{Output date from server Here}}"}); <~ would create a calendar object for the calendar presented at #headerCalendar, and link it to #headerCalendarInput //most calendar methods are specific to the document the calendar resides on, and should be handled via the onChange event for the linked input //Available Options: // calendarID (required) == string, ID of calendar div // linkedInput (required) == string, ID of input which will change when a date is selected // isModal == boolean, if true, calendar will be hidden, and display when the designated input recieves focus. If false, the calendar will be present and display as an inline block at all times. // forceDates == boolean, if true only highlighted dates will be clickable // detailedCalendar == boolean, if true data is pulled to determine pricing information, sold out days, limited availablility - requires eventID // defaultDate == string, mm/dd/yyyy date that calendar should start on (this will only represent the month displayed at the begining) // type == string: defaults to "performancedates", which will add all visible performances // eventID == integer: defaults to -1 which means no event. Other values will filter by events with that ID, allowing for a search of performance dates for a specific event only // //Methods: // showDlg()/hideDlg() : shows/hides modal calendars, no valid for non-modal calendars // addHighlightDay(mm/dd/yyyy) : adds a date (presented as a mm/dd/yyyy string) to the list of highlight dates for the calendar - REQUIRES HighlightDays() function call to visually represent this change on the calendar // clearHihghlightDays() : removes all stored highlight dates // highlightDays() : adds highlight class to stored days, visually highlighting them ont he calendar. var myID = options.calendarID; //required var myLinkedInput = options.linkedInputID; //required var isModal = options.isModal || false; var showLoader = options.showLoader || false; var forceDates = options.forceDates || false; var myDefault = new Date(); if (options.defaultDate) { try{ myDefault = new Date(options.defaultDate); } catch (e) { console.log("date no valid for calendar: " + myID); console.log(e); } } var type = options.type || "performancedates"; var eventID = options.eventID || -1; var detailedCalendar = options.detailedCalendar && eventID != -1 || false; var bundleID = options.bundleID || -1; var categoryID = options.CategoryID || -1; var corporatePartnerPage = options.corporatePartnerPage || 0; var bValidCoupon = options.bValidCoupon || 0; var couponCode = options.couponCode || ""; return new swDatepicker(myID, myLinkedInput, isModal, showLoader, forceDates, detailedCalendar, myDefault, type, eventID, bundleID, categoryID, corporatePartnerPage,bValidCoupon,couponCode) } function swDatepicker(id, target, modal, loader, force, detailed, defaultDate, type, eventID, bundleID, categoryID, corporatePartnerPage,bValidCoupon,couponCode) { this.$id = $('#' + id); // element to attach widget to this.$monthObj = this.$id.find('.month'); this.$prev = this.$id.find('.bn_prev'); this.$next = this.$id.find('.bn_next'); this.$grid = this.$id.find('.cal'); this.$target = $('#' + target); // div or text box that will receive the selected date string and focus (if modal) this.bModal = modal; // true if datepicker should appear in a modal dialog box. this.showLoader = loader; this.forceDateSelection = force; //if true, will only allow users to click on highlighted dates - see addHighlightDay() this.detailedCalendar = detailed; this.active = !modal; this.type = type; this.eventID = eventID; this.bundleID = bundleID; this.categoryID = categoryID; this.corporatePartnerPage = corporatePartnerPage; this.calendarName = id; this.monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; this.dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; this.dateObj = new Date(); this.curYear = this.dateObj.getFullYear(); this.year = defaultDate.getFullYear(); this.curMonth = this.dateObj.getMonth(); this.month = defaultDate.getMonth(); this.getFirstDate(defaultDate.getMonth()); //update the month to the first performance ASAP this.curDate = this.dateObj.getDate(); this.date = defaultDate.getDate(); this.currentDate = (this.month == this.curMonth && this.year == this.curYear); this.activeMonth = (String(this.month + 1) + "/1/" + this.year) this.keys = { tab: 9, enter: 13, esc: 27, space: 32, pageup: 33, pagedown: 34, end: 35, home: 36, left: 37, up: 38, right: 39, down: 40 }; this.bValidCoupon = bValidCoupon; this.couponCode = couponCode; this.highlightDates = []; // display the current month this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); // populate the calendar grid this.popGrid(); // update the table's activedescdendant to point to the current day this.$grid.attr('aria-activedescendant', this.$grid.find('.today').attr('id')); this.bindHandlers(); //show selected day $('#' + this.calendarName + '-day' + this.date).addClass('focus').attr('aria-selected', 'true'); // hide dialog if in modal mode if (this.bModal == true) { this.$id.attr('aria-hidden', 'true'); //show/hide functionality may vary based on use, so should be handled after the datepicker is created. //if we're on mobile, disable keyboard for the input: if ($(window).width() < 1024) { this.$target.attr("readonly", "true"); } } this.currencySymbol = "$"; this.buyTicketsButtonText = "Buy Tickets"; } // // popGrid() is a member function to populate the datepicker grid with calendar days // representing the current month // // @return N/A // swDatepicker.prototype.popGrid = function () { if(this.showLoader) $(".calendar-loading").show(); var numDays = this.calcNumDays(this.year, this.month); var startWeekday = this.calcStartWeekday(this.year, this.month); var weekday = 0; var curDay = 1; var rowCount = 1; var $tbody = this.$grid.find('tbody'); var gridCells = '\t<tr id="row1">\n'; // clear the grid $tbody.empty(); $('#msg').empty(); // Insert the leading empty cells for (weekday = 0; weekday < startWeekday; weekday++) { gridCells += '\t\t<td class="empty">&nbsp;</td>\n'; } // insert the days of the month. for (curDay = 1; curDay <= numDays; curDay++) { if (curDay == this.curDate && this.currentDate == true) { gridCells += '\t\t<td id="' + this.calendarName + '-day' + curDay + '" class="today day-cell" headers="row' + rowCount + ' ' + this.dayNames[weekday] + '" role="gridcell" aria-selected="false"><span class="calendar-day notranslate">' + curDay + '</span> <span class="calendar-dayoftheweek" style="display: none;">' + this.dayNames[weekday] + '</span></td>'; } else { gridCells += '\t\t<td id="' + this.calendarName + '-day' + curDay + '" class="day-cell" headers="row' + rowCount + ' ' + this.dayNames[weekday] + '" role="gridcell" aria-selected="false"><span class="calendar-day notranslate">' + curDay + '</span> <span class="calendar-dayoftheweek" style="display: none;">' + this.dayNames[weekday] + '</span></td>'; } if (weekday == 6 && curDay < numDays) { // This was the last day of the week, close it out // and begin a new one gridCells += '\t</tr>\n\t<tr id="row' + rowCount + '">\n'; rowCount++; weekday = 0; } else { weekday++; } } // Insert any trailing empty cells for (weekday; weekday < 7; weekday++) { gridCells += '\t\t<td class="empty">&nbsp;</td>\n'; } gridCells += '\t</tr>'; $tbody.append(gridCells); if(this.detailedCalendar){ this.getCalendarDetails(); }else{ this.fetchDates(); } } // // calcNumDays() is a member function to calculate the number of days in a given month // // @return (integer) number of days // swDatepicker.prototype.calcNumDays = function (year, month) { return 32 - new Date(year, month, 32).getDate(); } // // calcstartWeekday() is a member function to calculate the day of the week the first day of a // month lands on // // @return (integer) number representing the day of the week (0=Sunday....6=Saturday) // swDatepicker.prototype.calcStartWeekday = function (year, month) { return new Date(year, month, 1).getDay(); } // end calcStartWeekday() // // showPrevMonth() is a member function to show the previous month // // @param (offset int) offset may be used to specify an offset for setting // focus on a day the specified number of days from // the end of the month. // @return N/A // swDatepicker.prototype.showPrevMonth = function (offset) { // show the previous month if (this.month < 1) { this.month = 11; this.year--; } else { this.month--; } if (this.month != this.curMonth || this.year != this.curYear) { this.currentDate = false; } else { this.currentDate = true; } this.activeMonth = (String(this.month + 1) + "/1/" + this.year) // populate the calendar grid this.popGrid(); this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); // if offset was specified, set focus on the last day - specified offset if (offset != null) { var numDays = this.calcNumDays(this.year, this.month); var day = 'day' + (numDays - offset); this.$grid.attr('aria-activedescendant', this.calendarName + '-' + day); $('#' + this.calendarName + '-' + day).addClass('focus').attr('aria-selected', 'true'); } } // end showPrevMonth() // // showNextMonth() is a member function to show the next month // // @param (offset int) offset may be used to specify an offset for setting // focus on a day the specified number of days from // the beginning of the month. // @return N/A // swDatepicker.prototype.showNextMonth = function (offset) { // show the next month if (this.month == 11) { this.month = 0; this.year++; } else { this.month++; } if (this.month != this.curMonth || this.year != this.curYear) { this.currentDate = false; } else { this.currentDate = true; } this.activeMonth = (String(this.month + 1) + "/1/" + this.year) // populate the calendar grid this.popGrid(); this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); // if offset was specified, set focus on the first day + specified offset if (offset != null) { var day = 'day' + offset; this.$grid.attr('aria-activedescendant', this.calendarName + '-' + day); $('#' + this.calendarName + '-' + day).addClass('focus').attr('aria-selected', 'true'); } } // end showNextMonth() // // showPrevYear() is a member function to show the previous year // // @return N/A // swDatepicker.prototype.showPrevYear = function () { // decrement the year this.year--; if (this.month != this.curMonth || this.year != this.curYear) { this.currentDate = false; } else { this.currentDate = true; } // populate the calendar grid this.popGrid(); this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); } // end showPrevYear() // // showNextYear() is a member function to show the next year // // @return N/A // swDatepicker.prototype.showNextYear = function () { // increment the year this.year++; if (this.month != this.curMonth || this.year != this.curYear) { this.currentDate = false; } else { this.currentDate = true; } // populate the calendar grid this.popGrid(); this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); } // end showNextYear() // // bindHandlers() is a member function to bind event handlers for the widget // // @return N/A // swDatepicker.prototype.bindHandlers = function () { var thisObj = this; ////////////////////// bind button handlers ////////////////////////////////// this.$prev.click(function (e) { return thisObj.handlePrevClick(e); }); this.$next.click(function (e) { return thisObj.handleNextClick(e); }); this.$prev.keydown(function (e) { return thisObj.handlePrevKeyDown(e); }); this.$next.keydown(function (e) { return thisObj.handleNextKeyDown(e); }); ///////////// bind grid handlers ////////////// this.$grid.keydown(function (e) { return thisObj.handleGridKeyDown(e); }); this.$grid.keypress(function (e) { return thisObj.handleGridKeyPress(e); }); this.$grid.focus(function (e) { return thisObj.handleGridFocus(e); }); this.$grid.blur(function (e) { return thisObj.handleGridBlur(e); }); this.$grid.delegate('td', 'click', function (e) { return thisObj.handleGridClick(this, e); }); } // end bindHandlers(); function scrollToFirstHighlightDay() { // find all the heights of elements before the calendar var EventInfoHeight = $('#EventInformationWrap').outerHeight() + 64; // 64 is the height mobile navigation var EventLabelAndOptionsHeight = $('#eventCalendarLabelAndOptions').outerHeight(); var CalendarMonthHeight = $('.sw-datepicker.large-datepicker .month-wrap').outerHeight(); var EventInfoAndOptionsHeight = EventInfoHeight + EventLabelAndOptionsHeight; var CalendarTopInfoHeaderHeights = EventInfoHeight + EventLabelAndOptionsHeight + CalendarMonthHeight + 10; // 10 is just a gap added so it is not sticking against the month section // set the Top section sticky so when it focuses on the first hightlight day you can still see the informations $('#EventInformationWrap').addClass("make-this-section-sticky"); $('#eventCalendarLabelAndOptions').addClass("make-this-section-sticky"); $('#eventCalendarLabelAndOptions').css("top", EventInfoHeight); $('.sw-datepicker.large-datepicker .month-wrap').addClass("make-this-section-sticky"); $('.sw-datepicker.large-datepicker .month-wrap').css("top", EventInfoAndOptionsHeight); // Check if any elements with the class .highlight-day exist var highlightDay = $('.performance-list-calendar .highlight-day').first(); // set the first day cell var firstDayCel = $('.day-cell').first(); var scrollToPosition = 0; if (highlightDay.length > 0) { // Get the offset only if .highlight-day element exists scrollToPosition = highlightDay.offset().top; scrollToPosition = scrollToPosition - CalendarTopInfoHeaderHeights; $('html, body').animate({scrollTop: scrollToPosition}, 'slow'); } else { // if there's no highlights on this month, focus on the first day of the month scrollToPosition = firstDayCel.offset().top; scrollToPosition = scrollToPosition - (CalendarTopInfoHeaderHeights * 2); $('html, body').animate({scrollTop: scrollToPosition}, 'slow'); } } // // handlePrevClick() is a member function to process click events for the prev month button // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handlePrevClick = function (e) { if (window.innerWidth <= 550) { // Call the function when viewport width is 550 and smaller setTimeout(function() { scrollToFirstHighlightDay(); }, 1000); } var active = this.$grid.attr('aria-activedescendant'); if (e.ctrlKey) { this.showPrevYear(); } else { this.showPrevMonth(); } if (this.currentDate == false) { this.$grid.attr('aria-activedescendant', this.calendarName + '-day1'); } else { this.$grid.attr('aria-activedescendant', active); } e.stopPropagation(); return false; } // end handlePrevClick() // // handleNextClick() is a member function to process click events for the next month button // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleNextClick = function (e) { if (window.innerWidth <= 550) { // Call the function when viewport width is 550 and smaller setTimeout(function() { scrollToFirstHighlightDay(); }, 1000); } var active = this.$grid.attr('aria-activedescendant'); if (e.ctrlKey) { this.showNextYear(); } else { this.showNextMonth(); } if (this.currentDate == false) { this.$grid.attr('aria-activedescendant', this.calendarName + '-day1'); } else { this.$grid.attr('aria-activedescendant', active); } e.stopPropagation(); return false; } // end handleNextClick() // // handlePrevKeyDown() is a member function to process keydown events for the prev month button // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handlePrevKeyDown = function (e) { if (e.altKey) { return true; } switch (e.keyCode) { case this.keys.tab: { if (this.bModal == false || !e.shiftKey || e.ctrlKey) { return true; } this.$grid.focus(); e.stopPropagation(); return false; } case this.keys.enter: case this.keys.space: { if (e.shiftKey) { return true; } if (e.ctrlKey) { this.showPrevYear(); } else { this.showPrevMonth(); } e.stopPropagation(); return false; } } return true; } // end handlePrevKeyDown() // // handleNextKeyDown() is a member function to process keydown events for the next month button // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleNextKeyDown = function (e) { if (e.altKey) { return true; } switch (e.keyCode) { case this.keys.enter: case this.keys.space: { if (e.ctrlKey) { this.showNextYear(); } else { this.showNextMonth(); } e.stopPropagation(); return false; } } return true; } // end handleNextKeyDown() // // handleGridKeyDown() is a member function to process keydown events for the datepicker grid // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleGridKeyDown = function (e) { var $rows = this.$grid.find('tbody tr'); var $curDay = $('#' + this.$grid.attr('aria-activedescendant')); var $days = this.$grid.find('td').not('.empty'); var $curRow = $curDay.parent(); if (e.altKey) { return true; } switch (e.keyCode) { case this.keys.tab: { if (this.bModal == true) { if (e.shiftKey) { this.$next.focus(); } else { this.$prev.focus(); } e.stopPropagation() return false; } break; } case this.keys.enter: case this.keys.space: { if (e.ctrlKey) { return true; } // update the target box this.$target.val((this.month + 1) + '/' + $curDay.find(".calendar-day").text() + '/' + this.year).change(); // fall through } case this.keys.esc: { // dismiss the dialog box this.hideDlg(); e.stopPropagation(); return false; } case this.keys.left: { if (e.ctrlKey || e.shiftKey) { return true; } var dayIndex = $days.index($curDay) - 1; var $prevDay = null; if (dayIndex >= 0) { $prevDay = $days.eq(dayIndex); $curDay.removeClass('focus').attr('aria-selected', 'false'); $prevDay.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $prevDay.attr('id')); } else { this.showPrevMonth(0); } e.stopPropagation(); return false; } case this.keys.right: { if (e.ctrlKey || e.shiftKey) { return true; } var dayIndex = $days.index($curDay) + 1; var $nextDay = null; if (dayIndex < $days.length) { $nextDay = $days.eq(dayIndex); $curDay.removeClass('focus').attr('aria-selected', 'false'); $nextDay.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $nextDay.attr('id')); } else { // move to the next month this.showNextMonth(1); } e.stopPropagation(); return false; } case this.keys.up: { if (e.ctrlKey || e.shiftKey) { return true; } var dayIndex = $days.index($curDay) - 7; var $prevDay = null; if (dayIndex >= 0) { $prevDay = $days.eq(dayIndex); $curDay.removeClass('focus').attr('aria-selected', 'false'); $prevDay.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $prevDay.attr('id')); } else { // move to appropriate day in previous month dayIndex = 6 - $days.index($curDay); this.showPrevMonth(dayIndex); } e.stopPropagation(); return false; } case this.keys.down: { if (e.ctrlKey || e.shiftKey) { return true; } var dayIndex = $days.index($curDay) + 7; var $prevDay = null; if (dayIndex < $days.length) { $prevDay = $days.eq(dayIndex); $curDay.removeClass('focus').attr('aria-selected', 'false'); $prevDay.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $prevDay.attr('id')); } else { // move to appropriate day in next month dayIndex = 8 - ($days.length - $days.index($curDay)); this.showNextMonth(dayIndex); } e.stopPropagation(); return false; } case this.keys.pageup: { var active = this.$grid.attr('aria-activedescendant'); if (e.shiftKey) { return true; } if (e.ctrlKey) { this.showPrevYear(); } else { this.showPrevMonth(); } if ($('#' + active).attr('id') == undefined) { var lastDay = 'day' + this.calcNumDays(this.year, this.month); $('#' + this.calendarName + '-' + lastDay).addClass('focus').attr('aria-selected', 'true'); } else { $('#' + this.calendarName + '-' + active).addClass('focus').attr('aria-selected', 'true'); } e.stopPropagation(); return false; } case this.keys.pagedown: { var active = this.$grid.attr('aria-activedescendant'); if (e.shiftKey) { return true; } if (e.ctrlKey) { this.showNextYear(); } else { this.showNextMonth(); } if ($('#' + active).attr('id') == undefined) { var lastDay = 'day' + this.calcNumDays(this.year, this.month); $('#' + this.calendarName + '-' + lastDay).addClass('focus').attr('aria-selected', 'true'); } else { $('#' + this.calendarName + '-' + active).addClass('focus').attr('aria-selected', 'true'); } e.stopPropagation(); return false; } case this.keys.home: { if (e.ctrlKey || e.shiftKey) { return true; } $curDay.removeClass('focus').attr('aria-selected', 'false'); $('#' + this.calendarName + '-day1').addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', this.calendarName + '-day1'); e.stopPropagation(); return false; } case this.keys.end: { if (e.ctrlKey || e.shiftKey) { return true; } var lastDay = 'day' + this.calcNumDays(this.year, this.month); $curDay.removeClass('focus').attr('aria-selected', 'false'); $('#' + this.calendarName + '-' + lastDay).addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', this.calendarName + '-' + lastDay); e.stopPropagation(); return false; } } return true; } // end handleGridKeyDown() // // handleGridKeyPress() is a member function to consume keypress events for browsers that // use keypress to scroll the screen and manipulate tabs // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleGridKeyPress = function (e) { if (e.altKey) { return true; } switch (e.keyCode) { case this.keys.tab: case this.keys.enter: case this.keys.space: case this.keys.esc: case this.keys.left: case this.keys.right: case this.keys.up: case this.keys.down: case this.keys.pageup: case this.keys.pagedown: case this.keys.home: case this.keys.end: { e.stopPropagation(); return false; } } return true; } // end handleGridKeyPress() // // handleGridClick() is a member function to process mouse click events for the datepicker grid // // @input (id obj) e is the id of the object triggering the event // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleGridClick = function (id, e) { var $cell = $(id); if ($cell.is('.empty')) { return true; } this.$grid.find('.focus').removeClass('focus').attr('aria-selected', 'false'); $cell.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $cell.attr('id')); var $curDay = $('#' + this.$grid.attr('aria-activedescendant')); // update the target box if (!this.forceDateSelection || $cell.hasClass("highlight-day")) { this.$target.val((this.month + 1) + '/' + $curDay.children('.calendar-day').text() + '/' + this.year).change(); // dismiss the dialog box this.hideDlg(); } e.stopPropagation(); return false; } // end handleGridClick() // // handleGridFocus() is a member function to process focus events for the datepicker grid // // @input (e obj) e is the event object associated with the event // // @return (boolean) true // swDatepicker.prototype.handleGridFocus = function (e) { var active = this.$grid.attr('aria-activedescendant'); if ($('#' + active).attr('id') == undefined) { var lastDay = 'day' + this.calcNumDays(this.year, this.month); $('#' + lastDay).addClass('focus').attr('aria-selected', 'true'); } else { $('#' + active).addClass('focus').attr('aria-selected', 'true'); } return true; } // end handleGridFocus() // // handleGridBlur() is a member function to process blur events for the datepicker grid // // @input (e obj) e is the event object associated with the event // // @return (boolean) true // swDatepicker.prototype.handleGridBlur = function (e) { $('#' + this.$grid.attr('aria-activedescendant')).removeClass('focus').attr('aria-selected', 'false'); return true; } // end handleGridBlur() // // showDlg() is a member function to show the datepicker and give it focus. This function is only called if // the datepicker is used in modal dialog mode. // // @return N/A // swDatepicker.prototype.showDlg = function () { if (!this.bModal) return; var thisObj = this; var thisNode = this.$id; this.highlightDays(); this.active = true; //prevent calendar from pushing out of the right side of the window if (thisNode.parent()[0].getBoundingClientRect().left > (window.innerWidth / 2)) thisNode.addClass("right-side"); $(".content-wrap").bind('click', function (e) { if (!thisNode[0].contains(e.target) && e.target != thisObj.$target[0]) { thisObj.hideDlg(); } }); // show the dialog this.$id.attr('aria-hidden', 'false'); this.$grid.focus(); } // end showDlg() // // hideDlg() is a member function to hide the datepicker and remove focus. This function is only called if // the datepicker is used in modal dialog mode. // // @return N/A // swDatepicker.prototype.hideDlg = function () { if (!this.bModal) return; this.active = false; var thisNode = this.$id; // unbind the modal event sinks $(document).unbind('click'); // hide the dialog this.$id.attr('aria-hidden', 'true'); // set focus on the focus target //this.$target.focus(); } // end showDlg() //function to highlight days with performances or valid information //to prevent rewriting the calendar each time a date is added, popGrid() should be called after all dates have been added swDatepicker.prototype.addHighlightDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } this.highlightDates.push(date); if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass("highlight-day"); } } swDatepicker.prototype.addDateInfoBox = function (date, infoBoxText) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).append('<span class="date-info-box">' + infoBoxText + '</span>'); } } swDatepicker.prototype.addDateSubNote = function (date, noteText) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).append('<span class="date-info-box date-sub-note">' + noteText + '</span>'); } } swDatepicker.prototype.setDaySoldOut = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('sold-out'); this.addDateInfoBox(date, "Sold Out"); $("#" + this.calendarName + "-day" + datesplit[1]).children(".date-info-box").removeClass("date-info-box").addClass("sold-out-info-box"); } } swDatepicker.prototype.setcustomStatus = function (date,showPhoneNumber,currenStatus) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('sold-out'); var phoneNumber = " <br> (217) 206-6160 " if (!showPhoneNumber) phoneNumber=""; this.addDateInfoBox(date, currenStatus +phoneNumber); $("#" + this.calendarName + "-day" + datesplit[1]).children(".date-info-box").removeClass("date-info-box").addClass("sold-out-info-box"); } } swDatepicker.prototype.setDayLimitedAvailabilty = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('limited-availability'); this.addDateSubNote(date, 'Selling Quickly'); //$("#" + this.calendarName + "-day" + datesplit[1]).children(".date-info-box").removeClass("date-info-box").addClass("sold-out-info-box"); } if($(".limited-availability-legend-item").length == 0){ $(".calendar-notes-wrap").append('<div class="limited-availability-legend-item"><span classs="calendar-limited-availability-legend-icon">!</span> - Selling Quickly</div>') // $("#streamlinedCalendarLimitedAvailabilityLegend").append('<div class="limited-availability-legend-item"><span class="calendar-limited-availability-legend-icon">!</span> - Selling Quickly</div>') } } swDatepicker.prototype.setMutedDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('muted'); } } swDatepicker.prototype.clearMutedDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).removeClass('muted'); } } swDatepicker.prototype.setCouponMutedDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('coupon-muted'); } } swDatepicker.prototype.setPasswordHiddenDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('password-hidden'); $("#" + this.calendarName + "-day" + datesplit[1]).removeClass('highlight-day'); } } swDatepicker.prototype.clearAllMutedDays = function () { $(".muted").removeClass('muted'); } swDatepicker.prototype.clearHighlightDays = function () { this.highlightDates = []; this.highlightDays(); } //highlights all days in the highlightDates array swDatepicker.prototype.highlightDays = function () { $("#" + this.calendarName + " .highlight-day").removeClass("highlight-day"); var curYear = this.year; var curMonth = this.month; var calName = this.calendarName; var IEFix = new RegExp(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g); this.highlightDates.forEach(function (o, i, a) { var datesplit = o.split("/"); if (parseInt(datesplit[0].replace(IEFix, '')) - 1 == parseInt(curMonth) && parseInt(datesplit[2].replace(IEFix, '')) == parseInt(curYear)) { $("#" + calName + "-day" + datesplit[1].replace(IEFix, '')).addClass("highlight-day"); } }); this.setColors(); } swDatepicker.prototype.setColors = function () { /* Custom color functionality. Utilized by dropping calendar-colors.txt file in root of custom folder requires json content of text file formatted as follows: { "events": {"528": [ {"date":"12/1/2025", "color": "#ccc"}, {"date":"12/2/2025", "color": "#ccc"} ] , "529": [ {"date":"12/8/2025", "color": "#ccc"}, {"date":"12/9/2025", "color": "#ccc"} ] } , "bundles":[], "generic": {"dates": [ {"date":"12/23/2025", "color": "#def"}, {"date":"12/22/2025", "color": "#1a1"} ] , "weekdays": [ {"day":"Saturday", "color": "#2a2"}, {"day":"Thursday", "color": "#3a3"} ] } } } */ var thisDP = this; try{ $.getJSON("/calendar-colors.txt") .done(function (data) { thisDP.renderColors(data); }) .fail(function (jqxhr, textStatus, error) { console.log("No Custom Calendar Colors Found"); return; }); }catch(e){ console.log("parsing error:"); console.log(e); return; } } swDatepicker.prototype.renderColors = function (colorData) { var curYear = this.year; var curMonth = this.month; var calName = this.calendarName; var IEFix = new RegExp(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g); //set generic colors if(colorData.generic){ if(colorData.generic.dates.length > 0){ colorData.generic.dates.forEach(function (o, i, a) { var datesplit = o.date.split("/"); if (parseInt(datesplit[0].replace(IEFix, '')) - 1 == parseInt(curMonth) && parseInt(datesplit[2].replace(IEFix, '')) == parseInt(curYear)) { $("#" + calName + "-day" + datesplit[1].replace(IEFix, '') + ' .calendar-day').css("background-color", o.color); } }); } if(colorData.generic.weekdays && colorData.generic.weekdays.length > 0){ colorData.generic.weekdays.forEach(function (o, i, a) { $("td[headers*=" + o.day + "] .calendar-day").css("background-color", o.color); }); } } if(colorData.events && colorData.events[this.eventID] && this.eventID !== -1){ colorData.events[this.eventID].forEach(function (o, i, a) { var datesplit = o.date.split("/"); if (parseInt(datesplit[0].replace(IEFix, '')) - 1 == parseInt(curMonth) && parseInt(datesplit[2].replace(IEFix, '')) == parseInt(curYear)) { $("#" + calName + "-day" + datesplit[1].replace(IEFix, '') + ' .calendar-day').css("background-color", o.color); } }); } if(colorData.bundles && colorData.bundles[this.bundleID] && this.bundleID !== -1){ colorData.bundles[this.bundleID].forEach(function (o, i, a) { var datesplit = o.date.split("/"); if (parseInt(datesplit[0].replace(IEFix, '')) - 1 == parseInt(curMonth) && parseInt(datesplit[2].replace(IEFix, '')) == parseInt(curYear)) { $("#" + calName + "-day" + datesplit[1].replace(IEFix, '') + ' .calendar-day').css("background-color", o.color); } }); } } swDatepicker.prototype.fetchDates = function(){ var thisCalendar = this; var haveDates = thisCalendar.fetchLocalDates(); if (thisCalendar.categoryID >= 0) haveDates = false; this.clearHighlightDays(); if(haveDates){ //valid local dates stored try{ haveDates = JSON.parse(haveDates); if (haveDates.length > 0) { haveDates.forEach(function(o){ thisCalendar.addHighlightDay(o); }) thisCalendar.highlightDays(); } } catch (e) { console.log("Failed to grab dates. Date object not valid: ", haveDates); console.log(e); } } else { $.getJSON("/include/widgets/calendar/calendarRequests.asp", { action: thisCalendar.type, calMonth: thisCalendar.activeMonth, iEvent: thisCalendar.eventID, iBundle: thisCalendar.bundleID, iCategory : thisCalendar.categoryID, cp : thisCalendar.corporatePartnerPage }) .done(function (data) { thisCalendar.storeDates(data.performancedates); try { if (data.performancedates.length > 0) { data.performancedates.forEach(function (o) { thisCalendar.addHighlightDay(o); }) thisCalendar.highlightDays(); } } catch (e) { console.log("Failed to grab dates. Date object not valid: " + haveDates); console.log(e); } $(".calendar-loading").hide(); }) .fail(function (jqxhr, textStatus, error) { var err = textStatus + ", " + error; console.log("Request Failed: " + err); $(".calendar-loading").hide(); }); } } swDatepicker.prototype.getCalendarDetails = function(){ var thisCalendar = this; this.clearHighlightDays(); $("#" + this.calendarName).removeClass("has-muted-days"); $.getJSON("/include/widgets/calendar/calendarRequests.asp", { action: thisCalendar.type, calMonth: thisCalendar.activeMonth, iEvent: thisCalendar.eventID, iBundle: thisCalendar.bundleID, iCategory : thisCalendar.categoryID, cp : thisCalendar.corporatePartnerPage, bValidCoupon : thisCalendar.bValidCoupon, couponCode : thisCalendar.couponCode }) .done(function (data) { //to save on request time, we need to resolve the data on the client a bit before we store it var performanceDates = []; data.performanceDateData.forEach(function(dd){ if(dd.DoNotShowPublic == 0){ var detailsObj = {}; var currentDateIndex = fetchDateIndex(dd.CalendarDate, performanceDates); if(currentDateIndex == -1){ detailsObj.date = dd.CalendarDate; detailsObj.performances = []; detailsObj.performances.push(dd.PerformanceCode); detailsObj.defaultPrice = dd.LowestDefaultPrice; detailsObj.PerformanceName = dd.PerformanceName; detailsObj.PerformanceTime = dd.PerfTime; detailsObj.PerformanceStartTimeAlias = dd.PerformanceStartTimeAlias; detailsObj.DisplayType = dd.DisplayType; detailsObj.CalendarViewShowPrice = dd.CalendarViewShowPrice; detailsObj.CalendarViewShowPerformanceName = dd.CalendarViewShowPerformanceName; detailsObj.CalendarViewShowPerformanceTime = dd.CalendarViewShowPerformanceTime; detailsObj.CalendarViewShowBuyButton = dd.CalendarViewShowBuyButton; detailsObj.StreamlinedViewShowPrice = dd.StreamlinedViewShowPrice; detailsObj.defaultPricingCode = dd.LowestDefaultPricingCode; detailsObj.secondaryPrice = dd.LowestSecondaryPrice; detailsObj.secondaryPricingCode =dd.LowestSecondaryPricingCode; detailsObj.NoCouponAvailable = dd.NoCouponAvailable; detailsObj.passwordMatch = dd.passwordMatch; detailsObj.hasPassword = dd.hasPassword; detailsObj.hasCoupons = dd.hasCoupons; detailsObj.IsSalesPeriodEnded = dd.IsSalesPeriodEnded; detailsObj.SaleIcon = dd.SaleIcon; detailsObj.BSaleIcon = dd.BSaleIcon; performanceDates.push(detailsObj) }else{ performanceDates[currentDateIndex].performances.push(dd.PerformanceCode); performanceDates[currentDateIndex].NoCouponAvailable = dd.NoCouponAvailable; performanceDates[currentDateIndex].passwordMatch = dd.passwordMatch; performanceDates[currentDateIndex].acMatch = dd.acMatch; performanceDates[currentDateIndex].hasPassword = dd.hasPassword; performanceDates[currentDateIndex].hasCoupons = dd.hasCoupons; performanceDates[currentDateIndex].PerformanceName = dd.PerformanceName; performanceDates[currentDateIndex].PerformanceTime = dd.PerfTime; performanceDates[currentDateIndex].PerformanceStartTimeAlias = dd.PerformanceStartTimeAlias; performanceDates[currentDateIndex].CalendarViewShowPrice = dd.CalendarViewShowPrice; performanceDates[currentDateIndex].CalendarViewShowPerformanceName = dd.CalendarViewShowPerformanceName; performanceDates[currentDateIndex].CalendarViewShowPerformanceTime = dd.CalendarViewShowPerformanceTime; performanceDates[currentDateIndex].CalendarViewShowBuyButton = dd.CalendarViewShowBuyButton; performanceDates[currentDateIndex].IsSalesPeriodEnded = dd.IsSalesPeriodEnded; performanceDates[currentDateIndex].SaleIcon = dd.SaleIcon; performanceDates[currentDateIndex].BSaleIcon = dd.BSaleIcon; //check for lowest price if(performanceDates[currentDateIndex].defaultPrice > dd.LowestDefaultPrice && dd.LowestDefaultPrice != null){ performanceDates[currentDateIndex].defaultPrice = dd.LowestDefaultPrice; performanceDates[currentDateIndex].defaultPricingCode = dd.LowestDefaultPricingCode; } if(performanceDates[currentDateIndex].hasCoupons == 1 && performanceDates[currentDateIndex].defaultPrice < dd.LowestDefaultPrice && dd.LowestDefaultPrice != null && false){ performanceDates[currentDateIndex].defaultPrice = dd.LowestDefaultPrice; performanceDates[currentDateIndex].defaultPricingCode = dd.LowestDefaultPricingCode; } if(performanceDates[currentDateIndex].secondaryPrice > dd.LowestSecondaryPrice && dd.LowestSecondaryPrice != null){ performanceDates[currentDateIndex].secondaryPrice = dd.LowestSecondaryPrice; performanceDates[currentDateIndex].secondaryPricingCode = dd.LowestSecondaryPricingCode; } } //set limited availaibility by matching up results from query with performances for(perf in data.performances){ if(data.performances[perf].id == dd.PerformanceID){ data.performances[perf].LimitedAvailability = dd.LimitedAvailability; data.performances[perf].TimeZone = dd.TimeZone.replace('"', ""); data.performances[perf].SingleAreaVenueAreaID = dd.SingleAreaVenueAreaID; data.performances[perf].NoCouponAvailable = dd.NoCouponAvailable; data.performances[perf].passwordMatch = dd.passwordMatch; data.performances[perf].acMatch = dd.acMatch; data.performances[perf].hasPassword = dd.hasPassword; } } } }) data.performanceDates = performanceDates; delete data.performanceDateData; try { if (thisCalendar.couponCode != "" && $("#couponCode").length > 0) { if($("#coupon-notify").length > 0) $("#coupon-notify").remove(); var notifyMessage = document.createElement("div"); notifyMessage.setAttribute("id","coupon-notify"); notifyMessage.setAttribute("class",data.hasValidCoupon ? 'coupon-notify-message' : 'coupon-error-message'); notifyMessage.innerHTML = (data.hasValidCoupon ? "Code <b>" + thisCalendar.couponCode + "</b> has been applied to valid dates and times." : "The code entered is either invalid, or no longer available."); $("#plCalendar").prepend(notifyMessage); window.scrollTo(0,0); } thisCalendar.doCalendarDetailed(data); } catch (e) { console.log("Failed to parse details. Date object not valid: ", data); console.log(e); } }) .fail(function (jqxhr, textStatus, error) { var err = textStatus + ", " + error; console.log("Request Failed: " + err); }); } swDatepicker.prototype.doCalendarDetailed = function(detailData){ var thisCalendar = this; this.detailData = detailData; var defaultPricingLegend = [], secondaryPricingLegend = []; detailData.performanceDates.forEach(function(d){ thisCalendar.addHighlightDay(d.date); if (d.NoCouponAvailable > 0) thisCalendar.setCouponMutedDay(d.date); if (d.hasPassword > 0 && d.passwordMatch == 0) thisCalendar.setPasswordHiddenDay(d.date); //check if date sold out var dateSoldOut = true; var customStatus = false; var showPhoneNumber =false; var dateLimitedAvailability = false; var performanceStatus=""; var performanceOnSale = false; var IsSalesPeriodEnded = false; d.performances.forEach(function(datePerformance){ if(detailData.performances[String(datePerformance).toLowerCase()] && detailData.performances[String(datePerformance).toLowerCase()].status == "On Sale"){ dateSoldOut = false; performanceOnSale=true; if(detailData.performances[String(datePerformance).toLowerCase()].LimitedAvailability == 1) dateLimitedAvailability = true; IsSalesPeriodEnded = detailData.performances[String(datePerformance).toLowerCase()].IsSalesPeriodEnded==1 } else{ if ((detailData.performances[String(datePerformance).toLowerCase()].status != "Sold Out") && (detailData.performances[String(datePerformance).toLowerCase()].status != "On Sale") ){ customStatus=true; performanceStatus=detailData.performances[String(datePerformance).toLowerCase()].status; dateSoldOut = false; //dateLimitedAvailability=false; if ( detailData.performances[String(datePerformance).toLowerCase()].bSalePhone==1 || detailData.performances[String(datePerformance).toLowerCase()].SalePhone==1){ showPhoneNumber=true; } } if(!detailData.performances[String(datePerformance).toLowerCase()]){ d.performances.splice(d.performances.indexOf(datePerformance)); console.log("Date Trimmed, child performance not contained in performance data: " + datePerformance); } } }) if(dateLimitedAvailability && !dateSoldOut){ thisCalendar.setDayLimitedAvailabilty(d.date); } if ( IsSalesPeriodEnded) { performanceStatus=d.SaleIcon; } else{ performanceStatus=d.BSaleIcon; } if(dateSoldOut){ thisCalendar.setDaySoldOut(d.date); }else{ if ( (customStatus && !dateLimitedAvailability && !performanceOnSale) || IsSalesPeriodEnded) { thisCalendar.setcustomStatus(d.date,showPhoneNumber,performanceStatus) } else{ //date not sold out, add details, add to legend if one exists var detailString = ""; // if the price option is checked in event landing page in the admin if(d.CalendarViewShowPrice != 0 || d.StreamlinedViewShowPrice !=0){ //for now, we'll just add the pricing, this would be a spot to modify what is displayed on the dates by changing the contents of this string if(d.defaultPrice != null){ detailString = "<span class='display-perfprice'>" + thisCalendar.currencySymbol + d.defaultPrice.toFixed(2).replace('.00','') + "</span>"; if(defaultPricingLegend.indexOf(d.defaultPricingCode) === -1) defaultPricingLegend.push(d.defaultPricingCode); } if(d.secondaryPricingCode != "" && d.secondaryPricingCode != null){ if(secondaryPricingLegend.indexOf(d.secondaryPricingCode) === -1) secondaryPricingLegend.push(d.secondaryPricingCode); if (d.DisplayType === "calendar") detailString = "<span class='display-perfprice-withchild'>" + thisCalendar.currencySymbol + d.secondaryPrice.toFixed(2).replace('.00','') + "/</span>" + detailString ; } } if(d.CalendarViewShowPerformanceName != 0){ detailString = detailString + "<span class='display-perfname'>" + d.PerformanceName + "</span> "; } if(d.CalendarViewShowPerformanceTime != 0){ if(d.PerformanceStartTimeAlias != ""){ // Performance Alias time is present detailString = detailString + " <span class='display-perftime'>" + d.PerformanceStartTimeAlias + "</span>"; } else { detailString = detailString + " <span class='display-perftime'>" + d.PerformanceTime + "</span>"; } } if(d.CalendarViewShowBuyButton != 0){ detailString = detailString + "<span class='button display-perfbuybutton'>" + thisCalendar.buyTicketsButtonText + "</span>"; } thisCalendar.addDateInfoBox(d.date, detailString); } } }) //for now, we only generate the legend if there are one or two prices pesent if(defaultPricingLegend.length === 1 && secondaryPricingLegend.length === 1){ $("#calendarLegend").html(secondaryPricingLegend[0] +" / " + defaultPricingLegend[0]) $("#calendarLegend").show(); }else{ if(defaultPricingLegend.length === 1){ $("#calendarLegend").html(defaultPricingLegend[0]) $("#calendarLegend").show(); }else{ $("#calendarLegend").hide(); } } if(typeof(setFilterOptions) == 'function'){ setFilterOptions(thisCalendar); } $(".calendar-loading").hide(); } swDatepicker.prototype.getFirstDate = function(defaultMonth){ var thisCalendar = this; //this should only happen once on calendar load - currently only enabled for bundles if(thisCalendar.bundleID == 0 || thisCalendar.bundleID == -1) return defaultMonth; //currently only developed for bundles TODO: add event, category, standard support. $.getJSON("/include/widgets/calendar/calendarRequests.asp", { action: 'initialBundleDate', iBundle: thisCalendar.bundleID, cp : thisCalendar.corporatePartnerPage }) .done(function (data) { try { if (data.performancedates.length > 0) { var firstMonth = Number(String(data.performancedates).split("/")[0]) - 1; var firstYear = Number(String(data.performancedates).split("/")[2]); thisCalendar.month = firstMonth - 1; //to make this simple, we're using the showNextMonth() function, which means we need to set the month to 1 less than our target, as that function increments the month itself thisCalendar.year = firstYear; thisCalendar.showNextMonth(); }else{ return defaultMonth; } }catch(e){ console.log("getFirstDate returned invalid date. Default used"); console.log(e); return defaultMonth; } }) .fail(function (jqxhr, textStatus, error) { var err = textStatus + ", " + error; console.log("Request Failed: " + err); }); } swDatepicker.prototype.fetchLocalDates = function () { //utliize storage to store months var CalendarExpireTime = new Date().getTime(); var isExpired = false; var datesData = ""; var calendarIDString = this.calendarName + this.type + this.eventID + this.bundleID + "-" + this.corporatePartnerPage + "_" + this.activeMonth; try { //check for local storage support isExpired = CalendarExpireTime > Number(localStorage.getItem("CalendarExpireTime_" + calendarIDString)); if (isExpired) { //item expired, clear local results localStorage.setItem("ShowareDates_" + calendarIDString, ""); localStorage.setItem("CalendarExpireTime_" + calendarIDString, CalendarExpireTime + (1000 * 60 * 30)); //item information expires after 30 minutes return false; } localStorage.setItem("CalendarExpireTime_" + calendarIDString, CalendarExpireTime + (1000 * 60 * 30)); //item information expires after 30 minutes if (localStorage.getItem("ShowareDates_" + calendarIDString) != null && localStorage.getItem("ShowareDates_" + calendarIDString) != "" && localStorage.getItem("ShowareDates_" + calendarIDString) != []) { return localStorage.getItem("ShowareDates_" + calendarIDString); } else { //date info not stored return false; } } catch (e) { return false; } } swDatepicker.prototype.storeDates = function (dateData) { var calendarIDString = this.calendarName + this.type + this.eventID + this.bundleID + "-" + this.corporatePartnerPage + "_" + this.activeMonth; try { localStorage.setItem("ShowareDates_" + calendarIDString, JSON.stringify(dateData)); } catch (e) { //no local storage } } function fetchDateIndex(dateString, dateObjectArray){ try{ for(var i = 0;i < dateObjectArray.length;i++){ if(dateObjectArray[i].date == dateString){ return i; break; } } return -1; }catch(e){ //this function requires specific objects with a date property, it will fail otherwise and we'll just return what one would expect from a failed indexof return -1; } } function swapMonthDay(d){ //expects dd/mm/yyyy format try{ let splitDate = d.split("/"); let newDate = splitDate[1] + '/' + splitDate[0] + "/" + splitDate[2]; return newDate; }catch(e){ console.log("could not swap date:",d,e); return d; } } </script> <script type="text/javascript"> if (typeof localStorage === 'object') { try { localStorage.setItem('localStorage', 1); localStorage.removeItem('localStorage'); } catch (e) { Storage.prototype._setItem = Storage.prototype.setItem; Storage.prototype.setItem = function () { }; console.log("local storage not availalbe, data tracking limited"); } } function persistDataLayer(layerName, pageVal) { var ShoWareExpTime = new Date().getTime(); var isExpired = false; try { isExpired = ShoWareExpTime > Number(localStorage.getItem("swExpTime")); if (isExpired) { removeDataLayer(); } localStorage.setItem("swExpTime", ShoWareExpTime + 1000 * 60 * 30); //tag information expires after 30 minutes of inactivity //grab anything we might have in storage= var existVal = localStorage.getItem(layerName); if (pageVal != "") { //page val trumps all, store it and send it back localStorage.setItem(layerName, pageVal); return pageVal; } else { //page val was empty, so we'll try to pull a value out of local storage if (existVal != "" && existVal != null && existVal != undefined && !isExpired) { return existVal; } else { //no value exists, or the values stored have expired; return ""; } } } catch(e) { //no local storage, or other error, we'll just return the page value. Calls to this function should assume the possibility of failure as local storage does not work on IOS devices with private browsing enabled. return pageVal; } } function addDataLayer(layerName, setVal) { try { //the data layer MUST be set up before the container is introduced. //We will rely on future loads to address these variables as they are added after the pageload. localStorage.setItem(layerName, setVal); //push data to dataLayer so we can retrieve it with non-load events (clicks, changes, etc...) dataLayer.push({[layerName]: setVal}); } catch (e) { //local storage failed, or the data layer was not available. } } function removeDataLayer() { //empty showare data layer from local storage. for (var i = localStorage.length - 1; i >= 0; i--) { layerName = localStorage.key(i); if (layerName.indexOf("Ticketing") > -1) { localStorage.removeItem(layerName); } } } function tryParse(jsonString) { if (jsonString == "" || jsonString == null || jsonString == undefined) { return ''; } try { JSON.parse(jsonString); } catch (e) { console.log(e); return ''; } return JSON.parse(jsonString); } </script> <script> window.dataLayer = window.dataLayer || []; dataLayer.push({ 'TicketingHasActivePerformances': 'True', 'TicketingPage': 'wordverification_check.asp', 'TicketingEventID': persistDataLayer("TicketingEventID", ""), 'TicketingBundleID': persistDataLayer("TicketingBundleID", ""), 'TicketingPerformanceID': persistDataLayer("TicketingPerformanceID", ""), 'TicketingPerformanceCode': persistDataLayer("TicketingPerformanceCode", ""), 'TicketingPerformanceDate': persistDataLayer("TicketingPerformanceDate", ""), 'TicketingOrderID': persistDataLayer("TicketingOrderID", "0"), 'TicketingNewCustomer': persistDataLayer("TicketingNewCustomer", ""), 'TicketingCustomerID': "", 'TicketingCustomerZipCode': persistDataLayer("TicketingCustomerZipCode", ""), 'TicketingCustomerState': persistDataLayer("TicketingCustomerState", ""), 'TicketingCustomerCountry': persistDataLayer("TicketingCustomerCountry", ""), 'TicketingCustomerCity': persistDataLayer("TicketingCustomerCity", ""), 'TicketingCurrencyCode': persistDataLayer("TicketingCurrencyCode", "USD"), 'TicketingOrderTotal': persistDataLayer("TicketingOrderTotal", ""), 'TicketingCoupon': persistDataLayer("TicketingCoupon", ""), 'TicketingPromo': persistDataLayer("TicketingPromo", ""), 'TicketingDiscountAmount': persistDataLayer("TicketingDiscountAmount", ""), //promo code dicount value only 'TicketingHasMixedBasket': persistDataLayer("TicketingHasMixedBasket", ""), 'TicketingOrderSubTotal': persistDataLayer("TicketingOrderSubTotal", ""), 'TicketingItemCount': persistDataLayer("TicketingItemCount", ""), 'TicketingBundleCount': persistDataLayer("TicketingBundleCount", ""), 'TicketingShippingMethod': persistDataLayer("TicketingShippingMethod", ""), 'TicketingIsWillCall': persistDataLayer("TicketingIsWillCall", ""), 'TicketingHeardAbout': persistDataLayer("TicketingHeardAbout", ""), 'TicketingShippingTotal': persistDataLayer("TicketingShippingTotal", ""), 'TicketingTaxTotal': persistDataLayer("TicketingTaxTotal", ""), 'TicketingFeesTotal': persistDataLayer("TicketingFeesTotal", ""), 'TicketingProcessingFee': persistDataLayer("TicketingProcessingFee", ""), 'TicketingTicketFeesTotal': persistDataLayer("TicketingTicketFeesTotal", ""), 'TicketingTicketItems': persistDataLayer("TicketingTicketItems", ""), 'TicketingDonationItems': persistDataLayer("TicketingDonationItems", ""), 'TicketingMembershipItems': persistDataLayer("TicketingMembershipItems", ""), 'TicketingSalesChannel': persistDataLayer("TicketingSalesChannel", ""), 'TicketingPaymentType': persistDataLayer("TicketingPaymentType", ""), 'TicketingEventName': persistDataLayer("TicketingEventName", ""), 'TicketingPerformanceName': persistDataLayer("TicketingPerformanceName", ""), 'TicketingBundleName': persistDataLayer("TicketingBundleName", ""), 'TicketingPromoterID': persistDataLayer("TicketingPromoterID", ""), 'TicketingEventCategories': persistDataLayer("TicketingEventCategories", ""), 'GAClientID': persistDataLayer("GAClientID", ""), 'transactionId': 0, 'transactionTotal': parseFloat(persistDataLayer("transactionTotal", "")), 'transactionAffiliation' : 'UIS Ticket Office', 'transactionTax': parseFloat(persistDataLayer("transactionTax", "")), 'transactionShipping': parseFloat(persistDataLayer("transactionShipping", "")), 'transactionProducts': tryParse(persistDataLayer("transactionProducts", "")) }); if(typeof(customDataLayerPush) === "function"){ customDataLayerPush(); //custom function can be defined in local files and values pushed prior to GTM loading to simplify tag implimentation } </script> <!-- CLIENT Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-KPKGB68V');</script> <!-- End CLIENT Google Tag Manager --> <!-- PRIMARY Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-MDGF2K');</script> <!-- End PRIMARY Google Tag Manager --> <script type="text/javascript"> var simpleCacheBuster = { beforeLength: 0, afterLength: 0 }; simpleCacheBuster.beforeLength = document.cookie.length; simpleCacheBuster.afterLength = document.cookie.replace("ShowareVersion=newUI", " ").length; // If length is the same, then we haven't set this version cookie before, clear the cache. // If after length is smaller, then we have replaced the same version, do nothing. // After length shouldn't be greater, do nothing. if (simpleCacheBuster.beforeLength == simpleCacheBuster.afterLength) { document.cookie = "ShowareVersion=newUI"; // This will force browser to reload all includes from server instead of cache. // Sadly, this doesn't work on Chrome due to a bug that they refuse to fix. // https://bugs.chromium.org/p/chromium/issues/detail?id=443462 location.reload(true); } </script> <script language="JavaScript"> $(document).ready(function () { var sessionKey; sessionKey = ''; //v1Session variable declared in jq.js v1Session.setSessionKey(sessionKey); }); </script> <script type="text/javascript"> /* * Replace all SVG images with inline SVG - allows for image modificcation via CSS */ function extractIcons() { $('img.sw-icon').each(function () { var $img = $(this); var imgID = $img.attr('id'); var imgClass = $img.attr('class'); var imgURL = $img.attr('src'); $.get(imgURL, function (data) { // Get the SVG tag, ignore the rest var $svg = jQuery(data).find('svg'); // Add replaced image's ID to the new SVG if (typeof imgID !== 'undefined') { $svg = $svg.attr('id', imgID); } // Add replaced image's classes to the new SVG if (typeof imgClass !== 'undefined') { $svg = $svg.attr('class', imgClass + ' replaced-svg'); } // Remove any invalid XML tags as per http://validator.w3.org $svg = $svg.removeAttr('xmlns:a'); // Replace image with new SVG $img.replaceWith($svg); }, 'xml'); }); } </script> <script type="text/javascript"> function getGAClientID() { try { return ga.getAll()[0].get('clientId'); } catch (e) { return "0"; } } function addGAClient(){ var gaID = getGAClientID(); if(gaID == "0"){ //no analytics (unlikely), or analytics not loaded yet setTimeout(function(){addGAClient()}, 500); }else{ try{ addDataLayer('GAClientID', gaID); }catch(e){ console.log("Failed to add data layer object: GAClientID:"); console.log(e); } } } addGAClient(); </script> <!-- Comodo SSL Seal --> <script type="text/javascript"> //<![CDATA[ var tlJsHost = ((window.location.protocol == "https:") ? "https://secure.comodo.com/" : "http://www.trustlogo.com/"); document.write(unescape("%3Cscript src='" + tlJsHost + "trustlogo/javascript/trustlogo.js' type='text/javascript'%3E%3C/script%3E")); //]]> </script> <script type="text/javascript"> var swEnhancedEcommerce = { basketProducts: [], myImpressions: [], myProducts: [], //Building Up items to pass to analytics addImpressions: function (name, id, price, category, list, position) { //adds a product impression to myImpressions - represents a user being presented a specific product if (price != '') { //price is optional this.myImpressions.push( { 'name': name, // Name or ID is required. 'id': id, 'price': price, 'category': category, 'list': list, 'position': position } ); } else { this.myImpressions.push( { 'name': name, // Name or ID is required. 'id': id, 'category': category, 'list': list, 'position': position } ); } }, addProducts: function (name, id, price, category, position) { //product clicks represent a product being selected. For showare currently this will always be a single product, but future use may require allowing users to select multiple products //this represents a click on a product, NOT adding a product to the basket if (price != '') { //price is optional this.myProducts.push( { 'name': name, // Name or ID is required. 'id': id, 'price': price, 'category': category, 'position': position } ); } else { this.myProducts.push( { 'name': name, // Name or ID is required. 'id': id, 'category': category, 'position': position } ); } }, //object management functions clearImpressions: function(){ this.myImpressions = []; }, clearProducts: function () { this.myProducts = []; }, //Passing data to analytics sendImpressions: function(){ window.dataLayer.push({ 'event': 'impressionsPushed', 'ecommerce': { 'impressions': this.myImpressions } }); }, sendProducts: function (list) { //list should be a string of the originator of the product click, for instance a performance list, event list, callout, or other window.dataLayer.push({ 'event': 'productClick', 'ecommerce': { 'click': { 'actionField': { 'list': list }, // Optional list property. 'products': this.myProducts } } }); }, sendDetails: function (name, id, category) { //tracks a user's view of product details window.dataLayer.push({ 'event': 'detailView', 'ecommerce': { 'detail': { 'products': [{ 'name': name, // Name or ID is required. 'id': id, 'category': category, }] } } }); }, sendAddToBasket: function(){ //REQUIRES basketProducts populated via fetchBasketProducts or directly window.dataLayer.push({ 'event': 'addToCart', 'ecommerce': { 'add': { // 'add' actionFieldObject measures. 'products': this.basketProducts } } }); }, sendRemoveFromBasket: function (name, id, price, category, quantity, doUpdate) { //the item should be removed from the actual basket before this is called, as the basket is updated immediately window.dataLayer.push({ 'event': 'removeFromCart', 'ecommerce': { 'remove': { // 'remove' actionFieldObject measures. 'products': [{ // removing a product to a shopping cart. 'name': name, 'id': id, 'price': price, 'category': category, 'quantity': quantity }] } } }); if (doUpdate) { this.fetchBasketProducts(); } }, sendRemoveAllFromBasket: function () { //the item should be removed from the actual basket before this is called, as the basket is updated immediately window.dataLayer.push({ 'event': 'removeFromCart', 'ecommerce': { 'remove': { // 'remove' actionFieldObject measures. 'products': this.basketProducts } } }); this.basketProducts = []; }, //method to fetch basket - we should only call this if we intend to send products to analytics fetchBasketProducts: function (type, orderID) { if (typeof type === 'undefined') type = 'basket'; //defaults to grabbing basket items if (typeof orderID === 'undefined') orderID = 0; var fetchURL = "include/modules/enhancedEcommerceBasket.asp?type=" + type + "&orderid=" + orderID; try { $.ajax({ context: this, url: fetchURL }) .done(function (data) { //note that we'll only have basket details if this method is called. Functions like sendAddToBasket, and sendPurchase will not function if this method has not completed. try{ this.basketProducts = JSON.parse(data); } catch (e) { console.log(e); this.basketProducts = []; } }); //grab the basket and store contents } catch (e) { console.log(e); return } }, sendOrder: function (orderID, orderTotal, taxFees, shippingFees, couponCodes) { var fetchURL = "include/modules/enhancedEcommerceBasket.asp?type=order&orderid=" + orderID; orderProducts = []; try { $.ajax({ context: this, url: fetchURL }) .done(function (data) { //note that we'll only have basket details if this method is called. Functions like sendAddToBasket, and sendPurchase will not function if this method has not completed. try { orderProducts = JSON.parse(data); } catch (e) { console.log(e); orderProducts = []; } dataLayer.push({ 'event': 'purchaseMade', 'ecommerce': { 'purchase': { 'actionField': { 'id': orderID, // Transaction ID. Required for purchases and refunds. 'affiliation': 'Online Ticketing', 'revenue': orderTotal, // Total transaction value (incl. tax and shipping) 'tax': taxFees, 'shipping': shippingFees, 'coupon': couponCodes }, 'products': orderProducts } } }); }); //grab the basket and store contents } catch (e) { console.log(e); return } }, // -------------------------------------------- CHECKOUT STEPS -------------------------------------------- // 1. Basket Page "Checkout" Clicked // 2. login/guest/create // 3. Streamlined - select shipping method // 4. Streamlined - enter payment information // 5. Streamlined - complete clicked // 6. view order sendCheckoutStep: function(stepID, option){ dataLayer.push({ 'event': 'checkout', 'ecommerce': { 'checkout': { 'actionField': { 'step': stepID, 'option': option }, 'products': this.basketProducts } } }); } } </script> <script type="text/javascript"> //---------------------------DATEPICKER--------------------------------- function buildDatepicker(options) { //Calling this function should be sufficient to create a calendar within a designated div, with and //EX: headerDP = buildDatepicker({"calendarID":"headerCalendar","linkedInputID":"headerCalendarInput","isModal":false,"forceDates":true, "defaultDate": "{{Output date from server Here}}"}); <~ would create a calendar object for the calendar presented at #headerCalendar, and link it to #headerCalendarInput //most calendar methods are specific to the document the calendar resides on, and should be handled via the onChange event for the linked input //Available Options: // calendarID (required) == string, ID of calendar div // linkedInput (required) == string, ID of input which will change when a date is selected // isModal == boolean, if true, calendar will be hidden, and display when the designated input recieves focus. If false, the calendar will be present and display as an inline block at all times. // forceDates == boolean, if true only highlighted dates will be clickable // detailedCalendar == boolean, if true data is pulled to determine pricing information, sold out days, limited availablility - requires eventID // defaultDate == string, mm/dd/yyyy date that calendar should start on (this will only represent the month displayed at the begining) // type == string: defaults to "performancedates", which will add all visible performances // eventID == integer: defaults to -1 which means no event. Other values will filter by events with that ID, allowing for a search of performance dates for a specific event only // //Methods: // showDlg()/hideDlg() : shows/hides modal calendars, no valid for non-modal calendars // addHighlightDay(mm/dd/yyyy) : adds a date (presented as a mm/dd/yyyy string) to the list of highlight dates for the calendar - REQUIRES HighlightDays() function call to visually represent this change on the calendar // clearHihghlightDays() : removes all stored highlight dates // highlightDays() : adds highlight class to stored days, visually highlighting them ont he calendar. var myID = options.calendarID; //required var myLinkedInput = options.linkedInputID; //required var isModal = options.isModal || false; var showLoader = options.showLoader || false; var forceDates = options.forceDates || false; var myDefault = new Date(); if (options.defaultDate) { try{ myDefault = new Date(options.defaultDate); } catch (e) { console.log("date no valid for calendar: " + myID); console.log(e); } } var type = options.type || "performancedates"; var eventID = options.eventID || -1; var detailedCalendar = options.detailedCalendar && eventID != -1 || false; var bundleID = options.bundleID || -1; var categoryID = options.CategoryID || -1; var corporatePartnerPage = options.corporatePartnerPage || 0; var bValidCoupon = options.bValidCoupon || 0; var couponCode = options.couponCode || ""; return new swDatepicker(myID, myLinkedInput, isModal, showLoader, forceDates, detailedCalendar, myDefault, type, eventID, bundleID, categoryID, corporatePartnerPage,bValidCoupon,couponCode) } function swDatepicker(id, target, modal, loader, force, detailed, defaultDate, type, eventID, bundleID, categoryID, corporatePartnerPage,bValidCoupon,couponCode) { this.$id = $('#' + id); // element to attach widget to this.$monthObj = this.$id.find('.month'); this.$prev = this.$id.find('.bn_prev'); this.$next = this.$id.find('.bn_next'); this.$grid = this.$id.find('.cal'); this.$target = $('#' + target); // div or text box that will receive the selected date string and focus (if modal) this.bModal = modal; // true if datepicker should appear in a modal dialog box. this.showLoader = loader; this.forceDateSelection = force; //if true, will only allow users to click on highlighted dates - see addHighlightDay() this.detailedCalendar = detailed; this.active = !modal; this.type = type; this.eventID = eventID; this.bundleID = bundleID; this.categoryID = categoryID; this.corporatePartnerPage = corporatePartnerPage; this.calendarName = id; this.monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; this.dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; this.dateObj = new Date(); this.curYear = this.dateObj.getFullYear(); this.year = defaultDate.getFullYear(); this.curMonth = this.dateObj.getMonth(); this.month = defaultDate.getMonth(); this.getFirstDate(defaultDate.getMonth()); //update the month to the first performance ASAP this.curDate = this.dateObj.getDate(); this.date = defaultDate.getDate(); this.currentDate = (this.month == this.curMonth && this.year == this.curYear); this.activeMonth = (String(this.month + 1) + "/1/" + this.year) this.keys = { tab: 9, enter: 13, esc: 27, space: 32, pageup: 33, pagedown: 34, end: 35, home: 36, left: 37, up: 38, right: 39, down: 40 }; this.bValidCoupon = bValidCoupon; this.couponCode = couponCode; this.highlightDates = []; // display the current month this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); // populate the calendar grid this.popGrid(); // update the table's activedescdendant to point to the current day this.$grid.attr('aria-activedescendant', this.$grid.find('.today').attr('id')); this.bindHandlers(); //show selected day $('#' + this.calendarName + '-day' + this.date).addClass('focus').attr('aria-selected', 'true'); // hide dialog if in modal mode if (this.bModal == true) { this.$id.attr('aria-hidden', 'true'); //show/hide functionality may vary based on use, so should be handled after the datepicker is created. //if we're on mobile, disable keyboard for the input: if ($(window).width() < 1024) { this.$target.attr("readonly", "true"); } } this.currencySymbol = "$"; this.buyTicketsButtonText = "Buy Tickets"; } // // popGrid() is a member function to populate the datepicker grid with calendar days // representing the current month // // @return N/A // swDatepicker.prototype.popGrid = function () { if(this.showLoader) $(".calendar-loading").show(); var numDays = this.calcNumDays(this.year, this.month); var startWeekday = this.calcStartWeekday(this.year, this.month); var weekday = 0; var curDay = 1; var rowCount = 1; var $tbody = this.$grid.find('tbody'); var gridCells = '\t<tr id="row1">\n'; // clear the grid $tbody.empty(); $('#msg').empty(); // Insert the leading empty cells for (weekday = 0; weekday < startWeekday; weekday++) { gridCells += '\t\t<td class="empty">&nbsp;</td>\n'; } // insert the days of the month. for (curDay = 1; curDay <= numDays; curDay++) { if (curDay == this.curDate && this.currentDate == true) { gridCells += '\t\t<td id="' + this.calendarName + '-day' + curDay + '" class="today day-cell" headers="row' + rowCount + ' ' + this.dayNames[weekday] + '" role="gridcell" aria-selected="false"><span class="calendar-day notranslate">' + curDay + '</span> <span class="calendar-dayoftheweek" style="display: none;">' + this.dayNames[weekday] + '</span></td>'; } else { gridCells += '\t\t<td id="' + this.calendarName + '-day' + curDay + '" class="day-cell" headers="row' + rowCount + ' ' + this.dayNames[weekday] + '" role="gridcell" aria-selected="false"><span class="calendar-day notranslate">' + curDay + '</span> <span class="calendar-dayoftheweek" style="display: none;">' + this.dayNames[weekday] + '</span></td>'; } if (weekday == 6 && curDay < numDays) { // This was the last day of the week, close it out // and begin a new one gridCells += '\t</tr>\n\t<tr id="row' + rowCount + '">\n'; rowCount++; weekday = 0; } else { weekday++; } } // Insert any trailing empty cells for (weekday; weekday < 7; weekday++) { gridCells += '\t\t<td class="empty">&nbsp;</td>\n'; } gridCells += '\t</tr>'; $tbody.append(gridCells); if(this.detailedCalendar){ this.getCalendarDetails(); }else{ this.fetchDates(); } } // // calcNumDays() is a member function to calculate the number of days in a given month // // @return (integer) number of days // swDatepicker.prototype.calcNumDays = function (year, month) { return 32 - new Date(year, month, 32).getDate(); } // // calcstartWeekday() is a member function to calculate the day of the week the first day of a // month lands on // // @return (integer) number representing the day of the week (0=Sunday....6=Saturday) // swDatepicker.prototype.calcStartWeekday = function (year, month) { return new Date(year, month, 1).getDay(); } // end calcStartWeekday() // // showPrevMonth() is a member function to show the previous month // // @param (offset int) offset may be used to specify an offset for setting // focus on a day the specified number of days from // the end of the month. // @return N/A // swDatepicker.prototype.showPrevMonth = function (offset) { // show the previous month if (this.month < 1) { this.month = 11; this.year--; } else { this.month--; } if (this.month != this.curMonth || this.year != this.curYear) { this.currentDate = false; } else { this.currentDate = true; } this.activeMonth = (String(this.month + 1) + "/1/" + this.year) // populate the calendar grid this.popGrid(); this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); // if offset was specified, set focus on the last day - specified offset if (offset != null) { var numDays = this.calcNumDays(this.year, this.month); var day = 'day' + (numDays - offset); this.$grid.attr('aria-activedescendant', this.calendarName + '-' + day); $('#' + this.calendarName + '-' + day).addClass('focus').attr('aria-selected', 'true'); } } // end showPrevMonth() // // showNextMonth() is a member function to show the next month // // @param (offset int) offset may be used to specify an offset for setting // focus on a day the specified number of days from // the beginning of the month. // @return N/A // swDatepicker.prototype.showNextMonth = function (offset) { // show the next month if (this.month == 11) { this.month = 0; this.year++; } else { this.month++; } if (this.month != this.curMonth || this.year != this.curYear) { this.currentDate = false; } else { this.currentDate = true; } this.activeMonth = (String(this.month + 1) + "/1/" + this.year) // populate the calendar grid this.popGrid(); this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); // if offset was specified, set focus on the first day + specified offset if (offset != null) { var day = 'day' + offset; this.$grid.attr('aria-activedescendant', this.calendarName + '-' + day); $('#' + this.calendarName + '-' + day).addClass('focus').attr('aria-selected', 'true'); } } // end showNextMonth() // // showPrevYear() is a member function to show the previous year // // @return N/A // swDatepicker.prototype.showPrevYear = function () { // decrement the year this.year--; if (this.month != this.curMonth || this.year != this.curYear) { this.currentDate = false; } else { this.currentDate = true; } // populate the calendar grid this.popGrid(); this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); } // end showPrevYear() // // showNextYear() is a member function to show the next year // // @return N/A // swDatepicker.prototype.showNextYear = function () { // increment the year this.year++; if (this.month != this.curMonth || this.year != this.curYear) { this.currentDate = false; } else { this.currentDate = true; } // populate the calendar grid this.popGrid(); this.$monthObj.html(this.monthNames[this.month] + ' ' + this.year); } // end showNextYear() // // bindHandlers() is a member function to bind event handlers for the widget // // @return N/A // swDatepicker.prototype.bindHandlers = function () { var thisObj = this; ////////////////////// bind button handlers ////////////////////////////////// this.$prev.click(function (e) { return thisObj.handlePrevClick(e); }); this.$next.click(function (e) { return thisObj.handleNextClick(e); }); this.$prev.keydown(function (e) { return thisObj.handlePrevKeyDown(e); }); this.$next.keydown(function (e) { return thisObj.handleNextKeyDown(e); }); ///////////// bind grid handlers ////////////// this.$grid.keydown(function (e) { return thisObj.handleGridKeyDown(e); }); this.$grid.keypress(function (e) { return thisObj.handleGridKeyPress(e); }); this.$grid.focus(function (e) { return thisObj.handleGridFocus(e); }); this.$grid.blur(function (e) { return thisObj.handleGridBlur(e); }); this.$grid.delegate('td', 'click', function (e) { return thisObj.handleGridClick(this, e); }); } // end bindHandlers(); function scrollToFirstHighlightDay() { // find all the heights of elements before the calendar var EventInfoHeight = $('#EventInformationWrap').outerHeight() + 64; // 64 is the height mobile navigation var EventLabelAndOptionsHeight = $('#eventCalendarLabelAndOptions').outerHeight(); var CalendarMonthHeight = $('.sw-datepicker.large-datepicker .month-wrap').outerHeight(); var EventInfoAndOptionsHeight = EventInfoHeight + EventLabelAndOptionsHeight; var CalendarTopInfoHeaderHeights = EventInfoHeight + EventLabelAndOptionsHeight + CalendarMonthHeight + 10; // 10 is just a gap added so it is not sticking against the month section // set the Top section sticky so when it focuses on the first hightlight day you can still see the informations $('#EventInformationWrap').addClass("make-this-section-sticky"); $('#eventCalendarLabelAndOptions').addClass("make-this-section-sticky"); $('#eventCalendarLabelAndOptions').css("top", EventInfoHeight); $('.sw-datepicker.large-datepicker .month-wrap').addClass("make-this-section-sticky"); $('.sw-datepicker.large-datepicker .month-wrap').css("top", EventInfoAndOptionsHeight); // Check if any elements with the class .highlight-day exist var highlightDay = $('.performance-list-calendar .highlight-day').first(); // set the first day cell var firstDayCel = $('.day-cell').first(); var scrollToPosition = 0; if (highlightDay.length > 0) { // Get the offset only if .highlight-day element exists scrollToPosition = highlightDay.offset().top; scrollToPosition = scrollToPosition - CalendarTopInfoHeaderHeights; $('html, body').animate({scrollTop: scrollToPosition}, 'slow'); } else { // if there's no highlights on this month, focus on the first day of the month scrollToPosition = firstDayCel.offset().top; scrollToPosition = scrollToPosition - (CalendarTopInfoHeaderHeights * 2); $('html, body').animate({scrollTop: scrollToPosition}, 'slow'); } } // // handlePrevClick() is a member function to process click events for the prev month button // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handlePrevClick = function (e) { if (window.innerWidth <= 550) { // Call the function when viewport width is 550 and smaller setTimeout(function() { scrollToFirstHighlightDay(); }, 1000); } var active = this.$grid.attr('aria-activedescendant'); if (e.ctrlKey) { this.showPrevYear(); } else { this.showPrevMonth(); } if (this.currentDate == false) { this.$grid.attr('aria-activedescendant', this.calendarName + '-day1'); } else { this.$grid.attr('aria-activedescendant', active); } e.stopPropagation(); return false; } // end handlePrevClick() // // handleNextClick() is a member function to process click events for the next month button // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleNextClick = function (e) { if (window.innerWidth <= 550) { // Call the function when viewport width is 550 and smaller setTimeout(function() { scrollToFirstHighlightDay(); }, 1000); } var active = this.$grid.attr('aria-activedescendant'); if (e.ctrlKey) { this.showNextYear(); } else { this.showNextMonth(); } if (this.currentDate == false) { this.$grid.attr('aria-activedescendant', this.calendarName + '-day1'); } else { this.$grid.attr('aria-activedescendant', active); } e.stopPropagation(); return false; } // end handleNextClick() // // handlePrevKeyDown() is a member function to process keydown events for the prev month button // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handlePrevKeyDown = function (e) { if (e.altKey) { return true; } switch (e.keyCode) { case this.keys.tab: { if (this.bModal == false || !e.shiftKey || e.ctrlKey) { return true; } this.$grid.focus(); e.stopPropagation(); return false; } case this.keys.enter: case this.keys.space: { if (e.shiftKey) { return true; } if (e.ctrlKey) { this.showPrevYear(); } else { this.showPrevMonth(); } e.stopPropagation(); return false; } } return true; } // end handlePrevKeyDown() // // handleNextKeyDown() is a member function to process keydown events for the next month button // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleNextKeyDown = function (e) { if (e.altKey) { return true; } switch (e.keyCode) { case this.keys.enter: case this.keys.space: { if (e.ctrlKey) { this.showNextYear(); } else { this.showNextMonth(); } e.stopPropagation(); return false; } } return true; } // end handleNextKeyDown() // // handleGridKeyDown() is a member function to process keydown events for the datepicker grid // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleGridKeyDown = function (e) { var $rows = this.$grid.find('tbody tr'); var $curDay = $('#' + this.$grid.attr('aria-activedescendant')); var $days = this.$grid.find('td').not('.empty'); var $curRow = $curDay.parent(); if (e.altKey) { return true; } switch (e.keyCode) { case this.keys.tab: { if (this.bModal == true) { if (e.shiftKey) { this.$next.focus(); } else { this.$prev.focus(); } e.stopPropagation() return false; } break; } case this.keys.enter: case this.keys.space: { if (e.ctrlKey) { return true; } // update the target box this.$target.val((this.month + 1) + '/' + $curDay.find(".calendar-day").text() + '/' + this.year).change(); // fall through } case this.keys.esc: { // dismiss the dialog box this.hideDlg(); e.stopPropagation(); return false; } case this.keys.left: { if (e.ctrlKey || e.shiftKey) { return true; } var dayIndex = $days.index($curDay) - 1; var $prevDay = null; if (dayIndex >= 0) { $prevDay = $days.eq(dayIndex); $curDay.removeClass('focus').attr('aria-selected', 'false'); $prevDay.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $prevDay.attr('id')); } else { this.showPrevMonth(0); } e.stopPropagation(); return false; } case this.keys.right: { if (e.ctrlKey || e.shiftKey) { return true; } var dayIndex = $days.index($curDay) + 1; var $nextDay = null; if (dayIndex < $days.length) { $nextDay = $days.eq(dayIndex); $curDay.removeClass('focus').attr('aria-selected', 'false'); $nextDay.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $nextDay.attr('id')); } else { // move to the next month this.showNextMonth(1); } e.stopPropagation(); return false; } case this.keys.up: { if (e.ctrlKey || e.shiftKey) { return true; } var dayIndex = $days.index($curDay) - 7; var $prevDay = null; if (dayIndex >= 0) { $prevDay = $days.eq(dayIndex); $curDay.removeClass('focus').attr('aria-selected', 'false'); $prevDay.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $prevDay.attr('id')); } else { // move to appropriate day in previous month dayIndex = 6 - $days.index($curDay); this.showPrevMonth(dayIndex); } e.stopPropagation(); return false; } case this.keys.down: { if (e.ctrlKey || e.shiftKey) { return true; } var dayIndex = $days.index($curDay) + 7; var $prevDay = null; if (dayIndex < $days.length) { $prevDay = $days.eq(dayIndex); $curDay.removeClass('focus').attr('aria-selected', 'false'); $prevDay.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $prevDay.attr('id')); } else { // move to appropriate day in next month dayIndex = 8 - ($days.length - $days.index($curDay)); this.showNextMonth(dayIndex); } e.stopPropagation(); return false; } case this.keys.pageup: { var active = this.$grid.attr('aria-activedescendant'); if (e.shiftKey) { return true; } if (e.ctrlKey) { this.showPrevYear(); } else { this.showPrevMonth(); } if ($('#' + active).attr('id') == undefined) { var lastDay = 'day' + this.calcNumDays(this.year, this.month); $('#' + this.calendarName + '-' + lastDay).addClass('focus').attr('aria-selected', 'true'); } else { $('#' + this.calendarName + '-' + active).addClass('focus').attr('aria-selected', 'true'); } e.stopPropagation(); return false; } case this.keys.pagedown: { var active = this.$grid.attr('aria-activedescendant'); if (e.shiftKey) { return true; } if (e.ctrlKey) { this.showNextYear(); } else { this.showNextMonth(); } if ($('#' + active).attr('id') == undefined) { var lastDay = 'day' + this.calcNumDays(this.year, this.month); $('#' + this.calendarName + '-' + lastDay).addClass('focus').attr('aria-selected', 'true'); } else { $('#' + this.calendarName + '-' + active).addClass('focus').attr('aria-selected', 'true'); } e.stopPropagation(); return false; } case this.keys.home: { if (e.ctrlKey || e.shiftKey) { return true; } $curDay.removeClass('focus').attr('aria-selected', 'false'); $('#' + this.calendarName + '-day1').addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', this.calendarName + '-day1'); e.stopPropagation(); return false; } case this.keys.end: { if (e.ctrlKey || e.shiftKey) { return true; } var lastDay = 'day' + this.calcNumDays(this.year, this.month); $curDay.removeClass('focus').attr('aria-selected', 'false'); $('#' + this.calendarName + '-' + lastDay).addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', this.calendarName + '-' + lastDay); e.stopPropagation(); return false; } } return true; } // end handleGridKeyDown() // // handleGridKeyPress() is a member function to consume keypress events for browsers that // use keypress to scroll the screen and manipulate tabs // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleGridKeyPress = function (e) { if (e.altKey) { return true; } switch (e.keyCode) { case this.keys.tab: case this.keys.enter: case this.keys.space: case this.keys.esc: case this.keys.left: case this.keys.right: case this.keys.up: case this.keys.down: case this.keys.pageup: case this.keys.pagedown: case this.keys.home: case this.keys.end: { e.stopPropagation(); return false; } } return true; } // end handleGridKeyPress() // // handleGridClick() is a member function to process mouse click events for the datepicker grid // // @input (id obj) e is the id of the object triggering the event // // @input (e obj) e is the event object associated with the event // // @return (boolean) false if consuming event, true if propagating // swDatepicker.prototype.handleGridClick = function (id, e) { var $cell = $(id); if ($cell.is('.empty')) { return true; } this.$grid.find('.focus').removeClass('focus').attr('aria-selected', 'false'); $cell.addClass('focus').attr('aria-selected', 'true'); this.$grid.attr('aria-activedescendant', $cell.attr('id')); var $curDay = $('#' + this.$grid.attr('aria-activedescendant')); // update the target box if (!this.forceDateSelection || $cell.hasClass("highlight-day")) { this.$target.val((this.month + 1) + '/' + $curDay.children('.calendar-day').text() + '/' + this.year).change(); // dismiss the dialog box this.hideDlg(); } e.stopPropagation(); return false; } // end handleGridClick() // // handleGridFocus() is a member function to process focus events for the datepicker grid // // @input (e obj) e is the event object associated with the event // // @return (boolean) true // swDatepicker.prototype.handleGridFocus = function (e) { var active = this.$grid.attr('aria-activedescendant'); if ($('#' + active).attr('id') == undefined) { var lastDay = 'day' + this.calcNumDays(this.year, this.month); $('#' + lastDay).addClass('focus').attr('aria-selected', 'true'); } else { $('#' + active).addClass('focus').attr('aria-selected', 'true'); } return true; } // end handleGridFocus() // // handleGridBlur() is a member function to process blur events for the datepicker grid // // @input (e obj) e is the event object associated with the event // // @return (boolean) true // swDatepicker.prototype.handleGridBlur = function (e) { $('#' + this.$grid.attr('aria-activedescendant')).removeClass('focus').attr('aria-selected', 'false'); return true; } // end handleGridBlur() // // showDlg() is a member function to show the datepicker and give it focus. This function is only called if // the datepicker is used in modal dialog mode. // // @return N/A // swDatepicker.prototype.showDlg = function () { if (!this.bModal) return; var thisObj = this; var thisNode = this.$id; this.highlightDays(); this.active = true; //prevent calendar from pushing out of the right side of the window if (thisNode.parent()[0].getBoundingClientRect().left > (window.innerWidth / 2)) thisNode.addClass("right-side"); $(".content-wrap").bind('click', function (e) { if (!thisNode[0].contains(e.target) && e.target != thisObj.$target[0]) { thisObj.hideDlg(); } }); // show the dialog this.$id.attr('aria-hidden', 'false'); this.$grid.focus(); } // end showDlg() // // hideDlg() is a member function to hide the datepicker and remove focus. This function is only called if // the datepicker is used in modal dialog mode. // // @return N/A // swDatepicker.prototype.hideDlg = function () { if (!this.bModal) return; this.active = false; var thisNode = this.$id; // unbind the modal event sinks $(document).unbind('click'); // hide the dialog this.$id.attr('aria-hidden', 'true'); // set focus on the focus target //this.$target.focus(); } // end showDlg() //function to highlight days with performances or valid information //to prevent rewriting the calendar each time a date is added, popGrid() should be called after all dates have been added swDatepicker.prototype.addHighlightDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } this.highlightDates.push(date); if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass("highlight-day"); } } swDatepicker.prototype.addDateInfoBox = function (date, infoBoxText) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).append('<span class="date-info-box">' + infoBoxText + '</span>'); } } swDatepicker.prototype.addDateSubNote = function (date, noteText) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).append('<span class="date-info-box date-sub-note">' + noteText + '</span>'); } } swDatepicker.prototype.setDaySoldOut = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('sold-out'); this.addDateInfoBox(date, "Sold Out"); $("#" + this.calendarName + "-day" + datesplit[1]).children(".date-info-box").removeClass("date-info-box").addClass("sold-out-info-box"); } } swDatepicker.prototype.setcustomStatus = function (date,showPhoneNumber,currenStatus) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('sold-out'); var phoneNumber = " <br> (217) 206-6160 " if (!showPhoneNumber) phoneNumber=""; this.addDateInfoBox(date, currenStatus +phoneNumber); $("#" + this.calendarName + "-day" + datesplit[1]).children(".date-info-box").removeClass("date-info-box").addClass("sold-out-info-box"); } } swDatepicker.prototype.setDayLimitedAvailabilty = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); console.log(date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('limited-availability'); this.addDateSubNote(date, 'Selling Quickly'); //$("#" + this.calendarName + "-day" + datesplit[1]).children(".date-info-box").removeClass("date-info-box").addClass("sold-out-info-box"); } if($(".limited-availability-legend-item").length == 0){ $(".calendar-notes-wrap").append('<div class="limited-availability-legend-item"><span classs="calendar-limited-availability-legend-icon">!</span> - Selling Quickly</div>') // $("#streamlinedCalendarLimitedAvailabilityLegend").append('<div class="limited-availability-legend-item"><span class="calendar-limited-availability-legend-icon">!</span> - Selling Quickly</div>') } } swDatepicker.prototype.setMutedDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('muted'); } } swDatepicker.prototype.clearMutedDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).removeClass('muted'); } } swDatepicker.prototype.setCouponMutedDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('coupon-muted'); } } swDatepicker.prototype.setPasswordHiddenDay = function (date) { var datesplit = String(date).split("/"); for(var i = 0;i < datesplit.length; i++){ datesplit[i] = datesplit[i].replace(/^0+/, ''); } date = datesplit.join("/"); if (datesplit.length != 3) { //date didn't come in in m/d/yyyy format, kick it back in the console console.log("invalid date sent, datepicker accepts m/d/yyyy only - " + date); return; } if (parseInt(datesplit[0]) - 1 == this.month && parseInt(datesplit[2]) == this.year) { $("#" + this.calendarName + "-day" + datesplit[1]).addClass('password-hidden'); $("#" + this.calendarName + "-day" + datesplit[1]).removeClass('highlight-day'); } } swDatepicker.prototype.clearAllMutedDays = function () { $(".muted").removeClass('muted'); } swDatepicker.prototype.clearHighlightDays = function () { this.highlightDates = []; this.highlightDays(); } //highlights all days in the highlightDates array swDatepicker.prototype.highlightDays = function () { $("#" + this.calendarName + " .highlight-day").removeClass("highlight-day"); var curYear = this.year; var curMonth = this.month; var calName = this.calendarName; var IEFix = new RegExp(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g); this.highlightDates.forEach(function (o, i, a) { var datesplit = o.split("/"); if (parseInt(datesplit[0].replace(IEFix, '')) - 1 == parseInt(curMonth) && parseInt(datesplit[2].replace(IEFix, '')) == parseInt(curYear)) { $("#" + calName + "-day" + datesplit[1].replace(IEFix, '')).addClass("highlight-day"); } }); this.setColors(); } swDatepicker.prototype.setColors = function () { /* Custom color functionality. Utilized by dropping calendar-colors.txt file in root of custom folder requires json content of text file formatted as follows: { "events": {"528": [ {"date":"12/1/2025", "color": "#ccc"}, {"date":"12/2/2025", "color": "#ccc"} ] , "529": [ {"date":"12/8/2025", "color": "#ccc"}, {"date":"12/9/2025", "color": "#ccc"} ] } , "bundles":[], "generic": {"dates": [ {"date":"12/23/2025", "color": "#def"}, {"date":"12/22/2025", "color": "#1a1"} ] , "weekdays": [ {"day":"Saturday", "color": "#2a2"}, {"day":"Thursday", "color": "#3a3"} ] } } } */ var thisDP = this; try{ $.getJSON("/calendar-colors.txt") .done(function (data) { thisDP.renderColors(data); }) .fail(function (jqxhr, textStatus, error) { console.log("No Custom Calendar Colors Found"); return; }); }catch(e){ console.log("parsing error:"); console.log(e); return; } } swDatepicker.prototype.renderColors = function (colorData) { var curYear = this.year; var curMonth = this.month; var calName = this.calendarName; var IEFix = new RegExp(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g); //set generic colors if(colorData.generic){ if(colorData.generic.dates.length > 0){ colorData.generic.dates.forEach(function (o, i, a) { var datesplit = o.date.split("/"); if (parseInt(datesplit[0].replace(IEFix, '')) - 1 == parseInt(curMonth) && parseInt(datesplit[2].replace(IEFix, '')) == parseInt(curYear)) { $("#" + calName + "-day" + datesplit[1].replace(IEFix, '') + ' .calendar-day').css("background-color", o.color); } }); } if(colorData.generic.weekdays && colorData.generic.weekdays.length > 0){ colorData.generic.weekdays.forEach(function (o, i, a) { $("td[headers*=" + o.day + "] .calendar-day").css("background-color", o.color); }); } } if(colorData.events && colorData.events[this.eventID] && this.eventID !== -1){ colorData.events[this.eventID].forEach(function (o, i, a) { var datesplit = o.date.split("/"); if (parseInt(datesplit[0].replace(IEFix, '')) - 1 == parseInt(curMonth) && parseInt(datesplit[2].replace(IEFix, '')) == parseInt(curYear)) { $("#" + calName + "-day" + datesplit[1].replace(IEFix, '') + ' .calendar-day').css("background-color", o.color); } }); } if(colorData.bundles && colorData.bundles[this.bundleID] && this.bundleID !== -1){ colorData.bundles[this.bundleID].forEach(function (o, i, a) { var datesplit = o.date.split("/"); if (parseInt(datesplit[0].replace(IEFix, '')) - 1 == parseInt(curMonth) && parseInt(datesplit[2].replace(IEFix, '')) == parseInt(curYear)) { $("#" + calName + "-day" + datesplit[1].replace(IEFix, '') + ' .calendar-day').css("background-color", o.color); } }); } } swDatepicker.prototype.fetchDates = function(){ var thisCalendar = this; var haveDates = thisCalendar.fetchLocalDates(); if (thisCalendar.categoryID >= 0) haveDates = false; this.clearHighlightDays(); if(haveDates){ //valid local dates stored try{ haveDates = JSON.parse(haveDates); if (haveDates.length > 0) { haveDates.forEach(function(o){ thisCalendar.addHighlightDay(o); }) thisCalendar.highlightDays(); } } catch (e) { console.log("Failed to grab dates. Date object not valid: ", haveDates); console.log(e); } } else { $.getJSON("/include/widgets/calendar/calendarRequests.asp", { action: thisCalendar.type, calMonth: thisCalendar.activeMonth, iEvent: thisCalendar.eventID, iBundle: thisCalendar.bundleID, iCategory : thisCalendar.categoryID, cp : thisCalendar.corporatePartnerPage }) .done(function (data) { thisCalendar.storeDates(data.performancedates); try { if (data.performancedates.length > 0) { data.performancedates.forEach(function (o) { thisCalendar.addHighlightDay(o); }) thisCalendar.highlightDays(); } } catch (e) { console.log("Failed to grab dates. Date object not valid: " + haveDates); console.log(e); } $(".calendar-loading").hide(); }) .fail(function (jqxhr, textStatus, error) { var err = textStatus + ", " + error; console.log("Request Failed: " + err); $(".calendar-loading").hide(); }); } } swDatepicker.prototype.getCalendarDetails = function(){ var thisCalendar = this; this.clearHighlightDays(); $("#" + this.calendarName).removeClass("has-muted-days"); $.getJSON("/include/widgets/calendar/calendarRequests.asp", { action: thisCalendar.type, calMonth: thisCalendar.activeMonth, iEvent: thisCalendar.eventID, iBundle: thisCalendar.bundleID, iCategory : thisCalendar.categoryID, cp : thisCalendar.corporatePartnerPage, bValidCoupon : thisCalendar.bValidCoupon, couponCode : thisCalendar.couponCode }) .done(function (data) { //to save on request time, we need to resolve the data on the client a bit before we store it var performanceDates = []; data.performanceDateData.forEach(function(dd){ if(dd.DoNotShowPublic == 0){ var detailsObj = {}; var currentDateIndex = fetchDateIndex(dd.CalendarDate, performanceDates); if(currentDateIndex == -1){ detailsObj.date = dd.CalendarDate; detailsObj.performances = []; detailsObj.performances.push(dd.PerformanceCode); detailsObj.defaultPrice = dd.LowestDefaultPrice; detailsObj.PerformanceName = dd.PerformanceName; detailsObj.PerformanceTime = dd.PerfTime; detailsObj.PerformanceStartTimeAlias = dd.PerformanceStartTimeAlias; detailsObj.DisplayType = dd.DisplayType; detailsObj.CalendarViewShowPrice = dd.CalendarViewShowPrice; detailsObj.CalendarViewShowPerformanceName = dd.CalendarViewShowPerformanceName; detailsObj.CalendarViewShowPerformanceTime = dd.CalendarViewShowPerformanceTime; detailsObj.CalendarViewShowBuyButton = dd.CalendarViewShowBuyButton; detailsObj.StreamlinedViewShowPrice = dd.StreamlinedViewShowPrice; detailsObj.defaultPricingCode = dd.LowestDefaultPricingCode; detailsObj.secondaryPrice = dd.LowestSecondaryPrice; detailsObj.secondaryPricingCode =dd.LowestSecondaryPricingCode; detailsObj.NoCouponAvailable = dd.NoCouponAvailable; detailsObj.passwordMatch = dd.passwordMatch; detailsObj.hasPassword = dd.hasPassword; detailsObj.hasCoupons = dd.hasCoupons; detailsObj.IsSalesPeriodEnded = dd.IsSalesPeriodEnded; detailsObj.SaleIcon = dd.SaleIcon; detailsObj.BSaleIcon = dd.BSaleIcon; performanceDates.push(detailsObj) }else{ performanceDates[currentDateIndex].performances.push(dd.PerformanceCode); performanceDates[currentDateIndex].NoCouponAvailable = dd.NoCouponAvailable; performanceDates[currentDateIndex].passwordMatch = dd.passwordMatch; performanceDates[currentDateIndex].acMatch = dd.acMatch; performanceDates[currentDateIndex].hasPassword = dd.hasPassword; performanceDates[currentDateIndex].hasCoupons = dd.hasCoupons; performanceDates[currentDateIndex].PerformanceName = dd.PerformanceName; performanceDates[currentDateIndex].PerformanceTime = dd.PerfTime; performanceDates[currentDateIndex].PerformanceStartTimeAlias = dd.PerformanceStartTimeAlias; performanceDates[currentDateIndex].CalendarViewShowPrice = dd.CalendarViewShowPrice; performanceDates[currentDateIndex].CalendarViewShowPerformanceName = dd.CalendarViewShowPerformanceName; performanceDates[currentDateIndex].CalendarViewShowPerformanceTime = dd.CalendarViewShowPerformanceTime; performanceDates[currentDateIndex].CalendarViewShowBuyButton = dd.CalendarViewShowBuyButton; performanceDates[currentDateIndex].IsSalesPeriodEnded = dd.IsSalesPeriodEnded; performanceDates[currentDateIndex].SaleIcon = dd.SaleIcon; performanceDates[currentDateIndex].BSaleIcon = dd.BSaleIcon; //check for lowest price if(performanceDates[currentDateIndex].defaultPrice > dd.LowestDefaultPrice && dd.LowestDefaultPrice != null){ performanceDates[currentDateIndex].defaultPrice = dd.LowestDefaultPrice; performanceDates[currentDateIndex].defaultPricingCode = dd.LowestDefaultPricingCode; } if(performanceDates[currentDateIndex].hasCoupons == 1 && performanceDates[currentDateIndex].defaultPrice < dd.LowestDefaultPrice && dd.LowestDefaultPrice != null && false){ performanceDates[currentDateIndex].defaultPrice = dd.LowestDefaultPrice; performanceDates[currentDateIndex].defaultPricingCode = dd.LowestDefaultPricingCode; } if(performanceDates[currentDateIndex].secondaryPrice > dd.LowestSecondaryPrice && dd.LowestSecondaryPrice != null){ performanceDates[currentDateIndex].secondaryPrice = dd.LowestSecondaryPrice; performanceDates[currentDateIndex].secondaryPricingCode = dd.LowestSecondaryPricingCode; } } //set limited availaibility by matching up results from query with performances for(perf in data.performances){ if(data.performances[perf].id == dd.PerformanceID){ data.performances[perf].LimitedAvailability = dd.LimitedAvailability; data.performances[perf].TimeZone = dd.TimeZone.replace('"', ""); data.performances[perf].SingleAreaVenueAreaID = dd.SingleAreaVenueAreaID; data.performances[perf].NoCouponAvailable = dd.NoCouponAvailable; data.performances[perf].passwordMatch = dd.passwordMatch; data.performances[perf].acMatch = dd.acMatch; data.performances[perf].hasPassword = dd.hasPassword; } } } }) data.performanceDates = performanceDates; delete data.performanceDateData; try { if (thisCalendar.couponCode != "" && $("#couponCode").length > 0) { if($("#coupon-notify").length > 0) $("#coupon-notify").remove(); var notifyMessage = document.createElement("div"); notifyMessage.setAttribute("id","coupon-notify"); notifyMessage.setAttribute("class",data.hasValidCoupon ? 'coupon-notify-message' : 'coupon-error-message'); notifyMessage.innerHTML = (data.hasValidCoupon ? "Code <b>" + thisCalendar.couponCode + "</b> has been applied to valid dates and times." : "The code entered is either invalid, or no longer available."); $("#plCalendar").prepend(notifyMessage); window.scrollTo(0,0); } thisCalendar.doCalendarDetailed(data); } catch (e) { console.log("Failed to parse details. Date object not valid: ", data); console.log(e); } }) .fail(function (jqxhr, textStatus, error) { var err = textStatus + ", " + error; console.log("Request Failed: " + err); }); } swDatepicker.prototype.doCalendarDetailed = function(detailData){ var thisCalendar = this; this.detailData = detailData; var defaultPricingLegend = [], secondaryPricingLegend = []; detailData.performanceDates.forEach(function(d){ thisCalendar.addHighlightDay(d.date); if (d.NoCouponAvailable > 0) thisCalendar.setCouponMutedDay(d.date); if (d.hasPassword > 0 && d.passwordMatch == 0) thisCalendar.setPasswordHiddenDay(d.date); //check if date sold out var dateSoldOut = true; var customStatus = false; var showPhoneNumber =false; var dateLimitedAvailability = false; var performanceStatus=""; var performanceOnSale = false; var IsSalesPeriodEnded = false; d.performances.forEach(function(datePerformance){ if(detailData.performances[String(datePerformance).toLowerCase()] && detailData.performances[String(datePerformance).toLowerCase()].status == "On Sale"){ dateSoldOut = false; performanceOnSale=true; if(detailData.performances[String(datePerformance).toLowerCase()].LimitedAvailability == 1) dateLimitedAvailability = true; IsSalesPeriodEnded = detailData.performances[String(datePerformance).toLowerCase()].IsSalesPeriodEnded==1 } else{ if ((detailData.performances[String(datePerformance).toLowerCase()].status != "Sold Out") && (detailData.performances[String(datePerformance).toLowerCase()].status != "On Sale") ){ customStatus=true; performanceStatus=detailData.performances[String(datePerformance).toLowerCase()].status; dateSoldOut = false; //dateLimitedAvailability=false; if ( detailData.performances[String(datePerformance).toLowerCase()].bSalePhone==1 || detailData.performances[String(datePerformance).toLowerCase()].SalePhone==1){ showPhoneNumber=true; } } if(!detailData.performances[String(datePerformance).toLowerCase()]){ d.performances.splice(d.performances.indexOf(datePerformance)); console.log("Date Trimmed, child performance not contained in performance data: " + datePerformance); } } }) if(dateLimitedAvailability && !dateSoldOut){ thisCalendar.setDayLimitedAvailabilty(d.date); } if ( IsSalesPeriodEnded) { performanceStatus=d.SaleIcon; } else{ performanceStatus=d.BSaleIcon; } if(dateSoldOut){ thisCalendar.setDaySoldOut(d.date); }else{ if ( (customStatus && !dateLimitedAvailability && !performanceOnSale) || IsSalesPeriodEnded) { thisCalendar.setcustomStatus(d.date,showPhoneNumber,performanceStatus) } else{ //date not sold out, add details, add to legend if one exists var detailString = ""; // if the price option is checked in event landing page in the admin if(d.CalendarViewShowPrice != 0 || d.StreamlinedViewShowPrice !=0){ //for now, we'll just add the pricing, this would be a spot to modify what is displayed on the dates by changing the contents of this string if(d.defaultPrice != null){ detailString = "<span class='display-perfprice'>" + thisCalendar.currencySymbol + d.defaultPrice.toFixed(2).replace('.00','') + "</span>"; if(defaultPricingLegend.indexOf(d.defaultPricingCode) === -1) defaultPricingLegend.push(d.defaultPricingCode); } if(d.secondaryPricingCode != "" && d.secondaryPricingCode != null){ if(secondaryPricingLegend.indexOf(d.secondaryPricingCode) === -1) secondaryPricingLegend.push(d.secondaryPricingCode); if (d.DisplayType === "calendar") detailString = "<span class='display-perfprice-withchild'>" + thisCalendar.currencySymbol + d.secondaryPrice.toFixed(2).replace('.00','') + "/</span>" + detailString ; } } if(d.CalendarViewShowPerformanceName != 0){ detailString = detailString + "<span class='display-perfname'>" + d.PerformanceName + "</span> "; } if(d.CalendarViewShowPerformanceTime != 0){ if(d.PerformanceStartTimeAlias != ""){ // Performance Alias time is present detailString = detailString + " <span class='display-perftime'>" + d.PerformanceStartTimeAlias + "</span>"; } else { detailString = detailString + " <span class='display-perftime'>" + d.PerformanceTime + "</span>"; } } if(d.CalendarViewShowBuyButton != 0){ detailString = detailString + "<span class='button display-perfbuybutton'>" + thisCalendar.buyTicketsButtonText + "</span>"; } thisCalendar.addDateInfoBox(d.date, detailString); } } }) //for now, we only generate the legend if there are one or two prices pesent if(defaultPricingLegend.length === 1 && secondaryPricingLegend.length === 1){ $("#calendarLegend").html(secondaryPricingLegend[0] +" / " + defaultPricingLegend[0]) $("#calendarLegend").show(); }else{ if(defaultPricingLegend.length === 1){ $("#calendarLegend").html(defaultPricingLegend[0]) $("#calendarLegend").show(); }else{ $("#calendarLegend").hide(); } } if(typeof(setFilterOptions) == 'function'){ setFilterOptions(thisCalendar); } $(".calendar-loading").hide(); } swDatepicker.prototype.getFirstDate = function(defaultMonth){ var thisCalendar = this; //this should only happen once on calendar load - currently only enabled for bundles if(thisCalendar.bundleID == 0 || thisCalendar.bundleID == -1) return defaultMonth; //currently only developed for bundles TODO: add event, category, standard support. $.getJSON("/include/widgets/calendar/calendarRequests.asp", { action: 'initialBundleDate', iBundle: thisCalendar.bundleID, cp : thisCalendar.corporatePartnerPage }) .done(function (data) { try { if (data.performancedates.length > 0) { var firstMonth = Number(String(data.performancedates).split("/")[0]) - 1; var firstYear = Number(String(data.performancedates).split("/")[2]); thisCalendar.month = firstMonth - 1; //to make this simple, we're using the showNextMonth() function, which means we need to set the month to 1 less than our target, as that function increments the month itself thisCalendar.year = firstYear; thisCalendar.showNextMonth(); }else{ return defaultMonth; } }catch(e){ console.log("getFirstDate returned invalid date. Default used"); console.log(e); return defaultMonth; } }) .fail(function (jqxhr, textStatus, error) { var err = textStatus + ", " + error; console.log("Request Failed: " + err); }); } swDatepicker.prototype.fetchLocalDates = function () { //utliize storage to store months var CalendarExpireTime = new Date().getTime(); var isExpired = false; var datesData = ""; var calendarIDString = this.calendarName + this.type + this.eventID + this.bundleID + "-" + this.corporatePartnerPage + "_" + this.activeMonth; try { //check for local storage support isExpired = CalendarExpireTime > Number(localStorage.getItem("CalendarExpireTime_" + calendarIDString)); if (isExpired) { //item expired, clear local results localStorage.setItem("ShowareDates_" + calendarIDString, ""); localStorage.setItem("CalendarExpireTime_" + calendarIDString, CalendarExpireTime + (1000 * 60 * 30)); //item information expires after 30 minutes return false; } localStorage.setItem("CalendarExpireTime_" + calendarIDString, CalendarExpireTime + (1000 * 60 * 30)); //item information expires after 30 minutes if (localStorage.getItem("ShowareDates_" + calendarIDString) != null && localStorage.getItem("ShowareDates_" + calendarIDString) != "" && localStorage.getItem("ShowareDates_" + calendarIDString) != []) { return localStorage.getItem("ShowareDates_" + calendarIDString); } else { //date info not stored return false; } } catch (e) { return false; } } swDatepicker.prototype.storeDates = function (dateData) { var calendarIDString = this.calendarName + this.type + this.eventID + this.bundleID + "-" + this.corporatePartnerPage + "_" + this.activeMonth; try { localStorage.setItem("ShowareDates_" + calendarIDString, JSON.stringify(dateData)); } catch (e) { //no local storage } } function fetchDateIndex(dateString, dateObjectArray){ try{ for(var i = 0;i < dateObjectArray.length;i++){ if(dateObjectArray[i].date == dateString){ return i; break; } } return -1; }catch(e){ //this function requires specific objects with a date property, it will fail otherwise and we'll just return what one would expect from a failed indexof return -1; } } function swapMonthDay(d){ //expects dd/mm/yyyy format try{ let splitDate = d.split("/"); let newDate = splitDate[1] + '/' + splitDate[0] + "/" + splitDate[2]; return newDate; }catch(e){ console.log("could not swap date:",d,e); return d; } } </script> <link rel="stylesheet" type="text/css" href="//uisticketoffice.showare.com/include/accessodesign-core-addition.css?ver=20228b0078"> <link rel="stylesheet" type="text/css" href="//uisticketoffice.showare.com/include/style.css?ver=20228b0078"> <link rel="stylesheet" type="text/css" media="only screen and (max-width: 1024px)" href="//uisticketoffice.showare.com/include/mobile.css?ver=20228b0078"> </head> <body class="body-class default-font"> <!-- CLIENT Google Tag Manager --> <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-KPKGB68V" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End CLIENT Google Tag Manager --> <!-- PRIMARY Google Tag Manager --> <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-MDGF2K" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End PRIMARY Google Tag Manager --> <div style="position:relative;"> <button class="skip-nav" title="Skip to Main Content">Skip to Main Content</button> </div> <script type="text/javascript"> $(function(){ $(".main-container").attr("tabindex", 0); }) $(".skip-nav").on("click", function(){ console.log("s"); $(".main-container").focus(); }); </script> <div id="page-wrap"><!--Main Page Wrap - Ends in HTMLfooter--> <!-- BEGIN Mobile Navigation BEGIN --> <nav class="navigation sw-nav mobile-only"> <i id="menu-icon" class="sw-icon-menu" style="display:inline-block;" onclick="actMenu();hideWidgets();"></i> <div class="tab-nav-wrap"> <a class="tab-nav" HREF="https://uispac.com/friends">Become a FRIENDS Member</a> <a class="tab-nav" HREF="https://uisticketoffice.showare.com/myaccount.asp?gifrompage=1&gitopage=1">My Account</a> </div> <ul id="mobile-menu" onclick="actMenu();"> <!--<li><a HREF="/">home</a></li> <!--CLIENT Home URL--> <li><a HREF="https://uisticketoffice.showare.com/default.asp">Ticketing Home</a></li> <li class="mobile-only"><a HREF="https://uisticketoffice.showare.com/myaccount.asp?gifrompage=1&gitopage=1">my account</a></li> <li class="sw-sep mobile-only"></li> <li class="mobile-only no-tab"><a class="tab-nav" HREF="https://uisticketoffice.showare.com/MembershipCreateNew.asp?gifrompage=1&gitopage=1">Become a FRIENDS Member</a></li> <li class="sw-sep no-tab"></li> <li><a onclick="actSearch();actMenu();return 0">Search</a></li> <li class="mobile-calendar-option"><a onclick="actWidget('calendar');return 0;">Calendar</a></li> <li class="sw-sep"></li> <li><a HREF="https://uisticketoffice.showare.com/basket.asp">shopping cart</a></li> <li class="sw-sep"></li> <li><a onclick="actWidget('info');return 0;">Info</a></li> <li class="sw-sep"></li> <li><a onclick="actMenu();hideWidgets();">Close</a></li> </ul> <a style="color:inherit;" href="http://uisticketoffice.showare.com/basket.asp"><i class="sw-icon-basket" style="float:right;"></i></a> <i class="sw-icon-search" style="float:right;" onclick="actSearch();"></i> <div id="swSearch" style="display:none;"> <input type="text" id="swSearchTxt" value="" placeholder="search events, venues, artists etc..." /> <script type="text/javascript"> $('#swSearchTxt').keyup(function (e) { if (e.which === 13) { //update the performance list updatePerformanceList_Search($("#swSearchTxt").val()) } }) </script> </div> </nav> <!--END Mobile Navigation END --> <header class="mobile-header mobile-only"> <!--custom branding location for mobile --> <!--Header Ads can be placed here if client desires: --> <a href="https://uisticketoffice.showare.com/"><img src="/images/uis-ticketing-logo.png" alt="UIS Ticket Office" border="0"><h1>UIS Ticket Office</h1></a> </header> <script type="text/javascript"> $(function () { $(".control-box").append("<a class='close-widget mobile-only' onclick='hideWidgets()'>close</a>"); }) </script> <div class="no-mobile head-band clear"> <div class="center-div site-width"> <ul class="showare-nav band-nav"> <li><a HREF="https://uisticketoffice.showare.com/MembershipCreateNew.asp?gifrompage=1&gitopage=1" style="font-weight: 600; margin-left: 0;">CLICK HERE to join the FRIENDS of UIS Performing Arts Center for great TICKETING BENEFITS</a></li> <li class="basket-widget"><div id="ShoWareBasketWidget" class="internal"></div></li> <li class="login-link"><a HREF="http://uisticketoffice.showare.com/myaccount.asp?gifrompage=1&gitopage=1">UIS Ticket Office <br>Account Login</a></li> <li class="login-link sitewideinfo-desktopnav"><a href="Javascript:popUp('Plan Your Visit','detailpopup.asp?type=sitewideinfo', 400, 480,'no','yes','no','no')">Plan Your Visit</a></li> <li class="search-control"> <input class="search-text showare-text" type="text" size="16" name="SearchText" value="" placeholder="search..."><input id="searchButton" class="search-button; " type="button" name="Go" value="Go"/> <script language="javascript"> $('.search-text').keyup(function(e) { if(e.which === 13){ //update the performance list updatePerformanceList_Search($(".search-text").val()) } }) $("#searchButton").click(function(){ updatePerformanceList_Search($(".search-text").val()) }); function updatePerformanceList_Search(searchVal) { window.location.href= "/default.asp?search="+searchVal } </script></li> </ul> </div> </div> <header class="head-wrap no-mobile"> <div class="header-background"> <!--This header will not be present on mobile. Use the mobile header area if a branding location for mobile is required.--> <div class="head-inner center-div site-width"> <div class="header-left"> Powered by <a href="http://www.showare.com" target="_blank">accesso ShoWare℠</a><br> The <em>ONLY</em> Official Online<br> Ticket Seller for the<br> UIS Performing Arts Center </div> <div class="logo-container"> <a href="https://uisticketoffice.showare.com/"><img src="/images/uis-ticketing-logo.png" alt="UIS Ticket Office" border="0"><h1>UIS Ticket Office</h1></a> </div> <div class="header-right"> <h2><a href="http://uispac.com/" target="_blank">UIS Performing Arts Center</a></h2> <a href="https://www.uis.edu/music/" target="_blank">UIS Music</a> <a href="http://uis.edu/theatre" target="_blank">UIS Theatre</a> <a href="http://ilsymphony.org/" target="_blank">Illinois Symphony Orchestra</a> </div> <div class="clear-float clear"></div> </div><!--END head-inner END--> </div> </header><!--END head-wrap END--> <div class="topnav-wrap no-mobile"> <div class="center-div site-width"> </div> </div> <!--MAIN BODY--> <div class="content-wrap"><!--Main Content Wrap - this and content-inner end in HTMLfooter--> <div class="content-inner center-div site-width"> <!--LEFT SIDE--> <div class="control-wrap hide-wrap"> <div id="calendarWidget" class="control-box calendar-control notranslate"> <span class="heading-text">Browse Dates</span> <!--<img src="images/hdrDates.gif" width="162" height="20" alt="" border="0"><br>--> <input type="hidden" id="headerCalendarInput" value=""/> <div id="headerCalendar" class="sw-datepicker"><link rel="stylesheet" href="/include/font-awesome/css/font-awesome.min.css" /> <div tabindex="0" class="calendar-object" style="position:relative;"> <style type="text/css" scoped> .sw-datepicker { font-size:inherit;/*Calendar size is determined by parent's font size.*/ } .sw-datepicker.large-datepicker { margin-top: 20px; } .sw-datepicker[aria-hidden=true] { display:none; } .sw-datepicker.is-modal{ margin: 10px; padding: 2px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; position: absolute; top:30px; left:0px; z-index:99; background-color: #fff; border: 1px solid #ccc; box-shadow: 0px 0px 6px RGBA(0,0,0,0.4); } .sw-datepicker.is-modal.right-side { left:auto; right:0px; } .sw-datepicker .month-wrap { background-color: #337ab7; border: 1px solid #2e6da4; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; text-align:center; } .sw-datepicker .bn_next, div.bn_prev{ margin: 2px; border:1px solid transparent; line-height:1.3em; color:#fff; padding:0 .25em; font-weight:bold; cursor:pointer; } .sw-datepicker .bn_prev { float: left; } .sw-datepicker .bn_next { float: right; } .sw-datepicker .bn_prev:hover, .sw-datepicker .bn_prev:focus, .sw-datepicker .bn_next:hover, .sw-datepicker .bn_next:focus { margin: 2px; background-color: #4fbae0; border: 1px solid #00a4df; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .sw-datepicker .bn_img { margin: 0; padding: 2px; } .sw-datepicker .month { display:inline-block; line-height:1.5em; font-weight: bold; font-size: 1.2em; color:#fff; } .sw-datepicker .cal { font-size: 1.2em; text-align: center; } .sw-datepicker .offscreen { position: absolute; left: -200em; top: -100em; } .sw-datepicker td.day-cell.highlight-day{ cursor:pointer; } td span.calendar-day{ display:inline-block; height:1.5em; width:1.5em; line-height:1.5em; border-radius:3px; margin:.1em; position:relative; } td.highlight-day span.calendar-day{ border:1px solid #337ab7; background:#fcfcfc; color:#337ab7; cursor:pointer; } td.limited-availability:after{ content:'!'; display:inline-block; font-weight:bold; position:absolute; top:3px; right:5px; font-size:3vw; color:#aa0; } .sw-datepicker abbr{ text-decoration:none; opacity:.4; display:inline-block; margin:.3em 0; } td.today{ background:#eee; } td.focus{ background:#8ecae0; } .sw-datepicker td{ position:relative; } .sw-datepicker.large-datepicker, .sw-datepicker.large-datepicker table{ width:100%; } .sw-datepicker.large-datepicker .month-wrap{ font-size:1.5em; background:RGBA(255,255,255,0.0); border:none; border-bottom:1px solid #eee; } .sw-datepicker.large-datepicker .month-wrap *{ color:inherit!important; } .sw-datepicker.large-datepicker .day-cell{ height:8vh; width:14%; border:1px solid #eee; opacity:.7; transition:opacity .5s; } .sw-datepicker.large-datepicker .day-cell.highlight-day{ opacity:1; } .sw-datepicker.large-datepicker td span.calendar-day{ position:absolute; top:5px; left:5px; font-size:.7em; text-align:center; font-weight:bold; height:2em; width:2em; padding:.25em; line-height:1.3em; display:inline-block; background:RGBA(255,255,255,0.0); border:none; pointer-events:none; } .sw-datepicker .date-info-box{ font-size: 1.5vw; padding: 30px 5px 15px; display: block; position: relative; } .sw-datepicker .date-info-box .display-perfstatus{ font-size: .72vw; display: block; text-align: center!important; padding: 5px 10px; border: 1px solid var(--gap-error); border-radius: 8px; color: var(--gap-error); width: 90%; margin: auto; box-sizing: border-box; background: rgba(222,27,60,.05); } .sw-datepicker .date-info-box .display-perfprice{ font-size: 1vw; } .sw-datepicker .date-info-box .display-perfprice-withchild{ font-size: 1vw; } .sw-datepicker .date-info-box .display-perfname{ font-size: .8vw; display: block; text-align: center; padding: 0px 10px; } .sw-datepicker .date-info-box .display-perftime{ font-size: .93vw; display: block; padding-top: 5px; } .sw-datepicker .date-info-box .display-perfbuybutton{ font-size: .7vw; display: block; padding: 5px 10px; width: 90%; margin: 5px auto; } .sw-datepicker .date-sub-note{ font-style: italic; font-size: .93vw; opacity: .8; position: absolute; bottom: auto; top: 0px; padding-bottom: 20px; padding-top: 15px; margin-bottom: 30px; width: 100%; } @media only screen and (max-width: 1500px){ .sw-datepicker .date-info-box .display-perfname{ font-size: 1.1vw; } .sw-datepicker .date-info-box .display-perftime, .sw-datepicker .date-info-box .display-perfprice, .sw-datepicker .date-info-box .display-perfprice-withchild{ font-size: 1.2vw; } .sw-datepicker .date-info-box .display-perfbuybutton{ font-size: 1vw; } } @media only screen and (max-width: 1300px){ .sw-datepicker .date-info-box .display-perfname{ font-size: 1.3vw; } .sw-datepicker .date-info-box .display-perftime, .sw-datepicker .date-info-box .display-perfprice, .sw-datepicker .date-info-box .display-perfprice-withchild{ font-size: 1.3vw; } } @media only screen and (max-width: 1024px){ .sw-datepicker .date-sub-note{ display:none!important; } .sw-datepicker .date-info-box .display-perfname{ font-size: 12px; } .sw-datepicker .date-info-box .display-perftime, .sw-datepicker .date-info-box .display-perfprice, .sw-datepicker .date-info-box .display-perfprice-withchild{ font-size: 12px; } .sw-datepicker .date-info-box .display-perfbuybutton{ font-size: 12px; white-space: unset; line-height: 1.2; } /* adjustment for coupon codes on mobile*/ .couponecode-wrap { display: flex; flex-direction: row-reverse; align-items: stretch; flex-wrap: nowrap; gap: 20px; width: 100%; } #FilterSelect { margin-bottom: 8px; } #couponCodeSubmitButton { margin-top: 0; } #couponCode { flex: 1; height: auto; } } @media only screen and (max-width: 800px){ .sw-datepicker.large-datepicker .day-cell { height: auto!important; width: 14%; min-height: 50px; border: 1px solid #eee; opacity: .7; transition: opacity .5s; } .sw-datepicker.large-datepicker table td.empty, .sw-datepicker.large-datepicker table th { width: 14%; min-width: 14%; } .sw-datepicker .date-info-box .display-perfbuybutton { width: 100%; line-height: 1.1!important; font-size: 11px!important; white-space: unset; padding: 5px!important; } .sw-datepicker .date-info-box .display-perftime, .sw-datepicker .date-info-box .display-perfprice, .sw-datepicker .date-info-box .display-perfprice-withchild, .sw-datepicker .date-info-box .display-perfname{ font-size: 11px; } .sw-datepicker table tr { display: flex; justify-content: space-evenly; } .sw-datepicker .date-info-box .display-perfname{ padding: 5px 0px 0; } .sw-datepicker .date-info-box { overflow-wrap: normal; } .sw-datepicker.large-datepicker table td.empty, .sw-datepicker.large-datepicker table th, .sw-datepicker table td.empty, .sw-datepicker table th { width: calc((100% / 7) - 4px); min-width: 10%; } .sw-datepicker.large-datepicker .day-cell, .sw-datepicker .day-cell { width: calc((100% / 7) - 4px); } .sw-datepicker .day-cell.sold-out{ padding-top: 35px!important; line-height: 1.2!important; } } @media only screen and (max-width: 550px){ #epPerformanceList #eventCalendar { width: 100%; } .sw-datepicker .date-info-box .display-perfbuybutton { font-size: 7px!important; font-weight: 400!important; } .sw-datepicker .date-info-box .display-perftime, .sw-datepicker .date-info-box .display-perfprice, .sw-datepicker .date-info-box .display-perfprice-withchild, .sw-datepicker .date-info-box .display-perfname{ font-size: 10px; } .sw-datepicker .day-cell.sold-out{ padding-top: 30px!important; line-height: .9!important; } .sw-datepicker.large-datepicker table tr{ display: flex; justify-content: space-evenly; } .sw-datepicker.large-datepicker table td.empty, .sw-datepicker.large-datepicker table th, .sw-datepicker.large-datepicker table td, .sw-datepicker.large-datepicker .day-cell { width: calc(96vw / 7); } } .sw-datepicker .day-cell.sold-out{ opacity:.7!important; color:#a00; pointer-events:none; } .sw-datepicker .day-cell.muted{ opacity:.3!important; } .sw-datepicker .day-cell.coupon-muted{ opacity:.3!important; } .sw-datepicker .day-cell.password-hidden .date-info-box{ display: none!important; } .sw-datepicker .day-cell.muted .calendar-day{ color:inherit!important; border:none!important; } .sw-datepicker .day-cell.coupon-muted .calendar-day{ color:inherit!important; border:none!important; } .sw-datepicker .day-cell.sold-out .date-info-box{ display:none; } .sw-datepicker .day-cell.sold-out .calendar-day{ color:#a00; border:none; text-decoration:line-through; } @media only screen and (max-width: 1024px){ .sw-datepicker .date-info-box, .sw-datepicker .sold-out-info-box{ font-size:2vw; } } .calendar-loading{ position:absolute; top:50%; left:50%; font-size:4vw; font-weight:bold; color:RGBA(0,0,0,0.4); width:66vw; margin-left:-33vw; height:20vw; margin-top:-10vh; line-height:20vw; text-align:center; background:RGBA(255,255,255,0.9); border-radius:1em; border:1px solid RGBA(0,0,0,0.4); box-shadow:2px 2px 4px RGBA(0,0,0,0.2); } .limited-availability-legend-item{ text-align:right; } .calendar-limited-availability-legend-icon{ font-weight:bold; color:#aa0; } .calendar-dayoftheweek {display: none!important;} #calendarWidget .calendar-dayoftheweek {display: none!important;} </style> <style> @media only screen and (max-width: 800px){ .sw-datepicker.large-datepicker .sold-out-info-box { margin-top: 40px; display: inline-block; } .sw-datepicker .day-cell.sold-out{ padding-top: 0px!important; line-height: 1.2!important; } } @media only screen and (max-width: 550px){ /*make the event info and calendar options sticky*/ .make-this-section-sticky { position: -webkit-sticky; position: sticky; top: 64px; z-index: 9; background: #fff; color: #000; width: 100vw; margin-left: -10px; padding: 10px; } .sw-datepicker.large-datepicker div.month-wrap { background-color: #fff; padding: 10px; z-index: 9; width: 100vw; margin-left: -10px; border-bottom: 2px solid #ccc; border-radius: 0; } /* Show the name of the week */ .sw-datepicker.large-datepicker .calendar-dayoftheweek { font-size: 12px; display: inline-block!important; position: absolute; left: 13px; top: -1px; display: block; width: 100%; background: #e5f1fc; height: 26px; color: #00458a; position: relative; text-align: left; padding: 5px; width: calc(100% - 22px); } /*.sw-datepicker.large-datepicker .calendar-dateandday-wrap { display: block; width: 100%; background: #e5f1fc; height: 26px; color: #00458a; position: relative; border-bottom: 1px solid #ccc; }*/ .sw-datepicker.large-datepicker td.day-cell span.calendar-day{ border-radius: 0%; margin: 0; padding: 0 5px; /*border: 1px solid var(--gap-secondary-lighter)!important; border-left: none!important;*/ background: transparent; height: 26px; width: 25px; line-height: 26px!important; box-sizing: border-box; display: inline-flex!important; align-items: center; justify-content: center; position: absolute; left: 0; top: 0; background: #fff!important; } .sw-datepicker.large-datepicker td.day-cell.highlight-day span.calendar-day{ /*border: 1px solid #cce3fa; background: #cce3fa; */ color: #00458a; } .sw-datepicker.large-datepicker td.day-cell.highlight-day.sold-out span.calendar-day{ border: 1px solid #fdf3f5; /*background: #fdf3f5;*/ color: #de1b3c; } /* New layout for mobile event calendar */ .sw-datepicker.large-datepicker table.cal { display: block; } .sw-datepicker.large-datepicker table.cal thead { display: none; } .sw-datepicker.large-datepicker table.cal tr { display: block; clear: both; } .sw-datepicker.large-datepicker table.cal tr td { position: relative; } .sw-datepicker.large-datepicker .day-cell { width: calc(100vw - 20px); display: block; } .sw-datepicker.large-datepicker td span.calendar-day { text-align: left!important; width: 100px; } .sw-datepicker.large-datepicker .date-info-box, .sw-datepicker.large-datepicker .sold-out-info-box { padding: 7px 5px 5px 25px; text-align: left; display: block; font-size: 12px; min-height: 55px; } .sw-datepicker.large-datepicker .date-info-box .display-perftime, .sw-datepicker.large-datepicker .date-info-box .display-perfprice, .sw-datepicker.large-datepicker .date-info-box .display-perfprice-withchild, .sw-datepicker.large-datepicker .date-info-box .display-perfname { font-size: 12px; text-align: left; } .sw-datepicker.large-datepicker .date-info-box .display-perfbuybutton { font-size: 12px!important; font-weight: 400!important; display: inline-block!important; padding: 5px 20px!important; width: auto; max-width: 120px; position: absolute; right: 10px; top: 10px; margin-bottom: 10px; } .sw-datepicker .date-info-box.date-sub-note { font-style: italic; font-size: 12px; opacity: .8; position: absolute; bottom: 0; top: 0px; right: 15px; padding: 5px 0 0px 0; display: block!important; margin-bottom: 0; text-align: right; } .sw-datepicker .date-info-box .display-perfname, .sw-datepicker .date-info-box .display-perftime { width: calc(100% - 120px); } .sw-datepicker.large-datepicker .sold-out-info-box { margin-top: 0px; } .calendar-loading { position: absolute; left: -90vw!important; width: 90vw!important; margin-left: 0!important; left: -100vw!important; top: 30vh!important; } .sw-datepicker .day-cell.sold-out{ opacity: .7!important; color: #a00; pointer-events: none; padding-top: 0px!important; line-height: 1.4!important; } /* End New layout for mobile event calendar */ #calendarWidget .calendar-dayoftheweek {display: none!important;} } </style> <div class="month-wrap"> <div class="bn_prev" role="button" aria-labelledby="bn_prev-label" tabindex="0" title="Previous Month"><i class="fa fa-backward" aria-hidden="true"></i></div> <div tabindex="0" class="month" role="heading" aria-live="assertive" aria-atomic="true">Loading...</div> <div class="bn_next" role="button" aria-labelledby="bn_next-label" tabindex="0" title="Next Month"><i class="fa fa-forward" aria-hidden="true"></i></div> </div> <table title="Search Date - Select a date to search" class="cal" role="grid" aria-activedescendant="errMsg" aria-labelledby="month" tabindex="0" style="margin: 0px auto;outline:none!important;"> <thead> <tr class="weekdays"> <th class="Sunday"><abbr title="Sunday">Su</abbr></th> <th class="Monday"><abbr title="Monday">Mo</abbr></th> <th class="Tuesday"><abbr title="Tuesday">Tu</abbr></th> <th class="Wednesday"><abbr title="Wednesday">We</abbr></th> <th class="Thursday"><abbr title="Thursday">Th</abbr></th> <th class="Friday"><abbr title="Friday">Fr</abbr></th> <th class="Saturday"><abbr title="Saturday">Sa</abbr></th> </tr> </thead> <tbody> <tr><td class="errMsg" colspan="7">Loading...</td></tr> </tbody> </table> <div class="bn_prev-label offscreen">Go to previous month</div> <div class="bn_next-label offscreen">Go to next month</div> <div class="calendar-loading" style="display:none;"><i class="fa fa-spin fa-spinner" style="margin-right:.5em;"></i>Loading...</div> </div> <div class="calendar-notes-wrap"></div> </div> <script type="text/javascript"> var headerDP = ""; if ($("#categorySelect").length == 0 || 'True' == 'False') headerDP = buildDatepicker({ "calendarID": "headerCalendar", "linkedInputID": "headerCalendarInput", "isModal": false, "forceDates": true, "defaultDate": "12/1/2024", "corporatePartnerPage":0}); $("#headerCalendarInput").on("change", function () { var properDate = /^\d{1,2}\/\d{1,2}\/\d{4}$/; if (!properDate.test($(this).val())) { console.log("Main calendar attempted an invalid date: " + $(this).val()); return;//invalid date } window.location.href= "/default.asp?searchdate="+$(this).val()+""; }); extractIcons(); </script> </div> <div id="infoWidget" class="control-box info-control"> <span class="heading-text">Information</span> <!--<img src="images/hdrInfo.gif" width="162" height="20" alt="" border="0"><br>--> <span class="info-text small-text"><span style="font-size: 11pt;"><strong>UIS Ticket Office Hours:</strong></span><br />Monday-Friday 10 am - 5 pm<br />Also open two hours prior to any UIS Performing Arts Center ticketed event.<br /><br />Located on the 1st floor of the Public Affairs Center<br />Will Call the day of events, 2nd floor in the UIS Performing Arts Center lobby.<br /><br />GPS Address (not for mailing):<br />UIS Performing Arts Center<br />2200 Ernest Hemingway Dr.<br />Springfield, IL 62703</span> </div> <a class="reporting-link" href="/reporting/login.asp">Promoter Login</a> <div class="ads-control"> <center> <a href=https://uispac.com/events/comedian-ron-white target=_blank ><img class='ad-image' src=/AdsUPLImage/ron_white_sidebar.jpg width=1 height=1 border=0 alt=></a><a href=https://uispac.com/events/comedian-ron-white target=_blank ><img class='ad-image' src=/AdsUPLImage/ron_white_sidebar.jpg width=1 height=1 border=0 alt=></a><img class='ad-image' src=/AdsUPLImage/blank.gif width=1 height=1 border=0 alt=><img class='ad-image' src=/AdsUPLImage/blank.gif width=1 height=1 border=0 alt=><img class='ad-image' src=/AdsUPLImage/blank.gif width=1 height=1 border=0 alt=><img class='ad-image' src=/AdsUPLImage/blank.gif width=1 height=1 border=0 alt=><img class='ad-image' src=/AdsUPLImage/blank.gif width=1 height=1 border=0 alt=><img class='ad-image' src=/AdsUPLImage/blank.gif width=1 height=1 border=0 alt=><img class='ad-image' src=/AdsUPLImage/blank.gif width=1 height=1 border=0 alt=><img class='ad-image' src=/AdsUPLImage/blank.gif width=1 height=1 border=0 alt=> </center> </div> </div><!--END control-wrap END--> <!--END LEFT SIDE--> <div id="epImage2"></div> <div class="main-container "> <!-- Main Area --> <!-- end HTMLheader.asp --> <center> <br><br> <div class="error-message" id="recaptcha-error" style="display:none;"></div> <table align="center"><tr><td align='center'> <form method="post" name='frmCaptcha' id='frmCaptcha'> <script src="https://www.google.com/recaptcha/api.js"></script><div class="g-recaptcha" data-sitekey="6LcD9QEAAAAAACsTDL4NpV-b7aEOkp7cJzfmASjB" data-callback="submitForm"></div> <input type="hidden" id="forwardURL" name="forwardurl" value="//uisticketoffice.showare.com/orderticketsarea.asp?p=583&amp;a=250&amp;src="> <input type="hidden" name="isPost" value="1"> <br> </form> </td></tr></table> </center> <script type="text/javascript"> var recaptchaData = {}; recaptchaData.doTest = 1; recaptchaData.LineType = "0"; recaptchaData.LineID = "583"; recaptchaData.backURL = "//uisticketoffice.showare.com/ordertickets.asp?p=583"; recaptchaData.forwardurl = "//uisticketoffice.showare.com/orderticketsarea.asp?p=583&a=250&src=&_ga=&_gl="; recaptchaData.isPost = "1";//this is a neat feature, wonder what it does... recaptchaData.recaptchaResponse = ""; function checkRecaptcha(){ recaptchaData.recaptchaResponse = $("#g-recaptcha-response").val(); if(recaptchaData.recaptchaResponse == ""){ writeError("Please verify you are a real person below to continue."); return; } $.ajax({ method: "POST", url: "//uisticketoffice.showare.com/wordVerification_check.asp", data: recaptchaData }) .done(function( response ) { try{ response = JSON.parse(response); if(response.response === "success"){ document.frmCaptcha.action = recaptchaData.forwardurl; document.frmCaptcha.submit(); }else{ writeError("<!--" + response.error + "-->Oops, something went wrong. Please try again") } }catch(e){ console.log(e); writeError("Something went wrong, please try again later.") } }); } function writeError(msg){ $("#recaptcha-error").html(msg).show(); } function submitForm(){ checkRecaptcha(); } </script> </div><!--End main-container #END--> <!-- end main arean --> <div class="clear-float"></div><!--force inner-content pas floated left and right sections--> </div><!--END content-inner END--> </div><!--END content-wrap END--> <div class="foot-wrap"> <div class="foot-inner center-div site-width"> <div class="topfooter no-mobile"> <div class="footer-module"> <p>UIS Ticket Office<br> University of Illinois Springfield<br> One University Plaza, MS PAC 292<br> Springfield, IL 62703-5407<br> (217) 206-6160<br> <a href="mailto:UISTicketOffice@uis.edu">UISTicketOffice@uis.edu</a> </p> </div> <div class="footer-module" style="padding-top: 10px;"> <a href="http://uis.edu/"><img src="/images/uis-logo.png" style="width: 320px; height: auto;"></a> </div> <div class="footer-module" style="text-align: right;"> <p>UIS Performing Arts Center<br> Administrative Office<br> University of Illinois Springfield<br> One University Plaza, MS PAC 397<br> Springfield, IL 62703-5407<br> (217) 206-6150<br> <a href="mailto:uispac@uis.edu">UISpac@uis.edu</a> </p> </div> <div class="clear-float clear"></div> </div> <div class="clear-float clear"></div> <center><img class='ad-image' src=/AdsUPLImage/blank.gif width=1 height=1 border=0 alt=> </center> <span class="copyright-text"> Copyright &copy; 2024&nbsp;<a href="http://bot.uillinois.edu/" target="_blank">Board of Trustees of the University of Illinois</a>, All Rights Reserved. <em style="margin-right:6px;"><a href="http://www.showare.com" target="_blank">accesso ShoWare&#8480;</a></em> ticketing System provided by <em><a href="http://www.accesso.com" target="_blank">accesso<span style="font-size:10px;">&#174;</span></a></em> <br><br> </span><!--END copyright-text span END--> <script language="JavaScript" type="text/javascript"> //variable defined via external script from HTMLHeadClose.asp if (typeof TrustLogo !== "undefined") { TrustLogo("https://uisticketoffice.showare.com/images/comodo.png", "CL1", "none"); } </script> </div><!--END foot-inner END--> </div><!--END foot-wrap END--> </div><!--END page-wrap END--> <script> $(function() { sortDropDrown('venueSelect',0); }); </script> <script language="javascript"> $(function () { //activate modals hoverModal(); }); </script> <style> @media screen and (max-width: 1024px) { #popup-wrap{ max-width:100%!important; margin-left: -200px!important; left: 50%!important; top:1em!important; } } @media screen and (max-width: 601px) { #draggable #popup-wrap{ width:98%!important; margin-left: 1%!important; left: 0%!important; top:1em!important; } } </style> <script> setTimeout(function() { $( document ).ready(function() { var importantInfoLinkDesktop = "<li class=\"sitewideinfo-desktopnav\" role=\"menuitem\"><a href=\"Javascript:popUp('Plan Your Visit','detailpopup.asp?type=sitewideinfo', 400, 480,'no','yes','no','no')\" role=\"button\">Plan Your Visit</a></li>"; var importantInfoLinkMobile = "<li class=\"sitewideinfo-mobilenav\" role=\"menuitem\"><a href=\"Javascript:popUp('Plan Your Visit','detailpopup.asp?type=sitewideinfo', 400, 480,'no','yes','no','no')\" role=\"button\">Plan Your Visit</a></li>"; $('#mobile-menu li').each(function(){ if($(this).is(':contains("Ticketing Home")') || $(this).is(':contains("Ticketing Home")') || $(this).hasClass("showarenav-homelink")) { $( importantInfoLinkMobile ).insertAfter( $(this) ); } }); $('.showare-nav li').each(function(){ if($(this).is(':contains("Ticketing Home")') || $(this).is(':contains("Ticketing Home")') || $(this).hasClass("showarenav-homelink")) { $( importantInfoLinkDesktop ).insertAfter( $(this) ); } }); }); }, 300); </script> <script async src="//uisticketoffice.showare.com/include/widgets/basket/basketwidget.js?ver=20228b0078" id="showarebasketscript" type="text/javascript"></script> <script> var cb = function() { var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = '/include/jqueryui-themes/default/jquery-ui.css'; var h = document.getElementsByTagName('head')[0]; h.parentNode.insertBefore(l, h); }; var raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ; if (raf) raf(cb); else window.addEventListener('load', cb); </script> <script type="text/javascript"> $("body").addClass("wordverification_check"); if(window.location.hostname.toLowerCase() != "uisticketoffice.showare.com"){ Showare.Logger.warn("Bad Domain Request","uisticketoffice.showare.com - " + window.location.hostname); window.location.replace("//uisticketoffice.showare.com"); } </script> <!-- ARIA ACCESSABILITY FEATURES --> <script type="text/javascript"> try{ $(".main-container").attr("role","main"); $("ul.showare-nav").attr("role","menubar"); $("ul.showare-nav li").attr("role","menuitem"); $("ul.showare-nav li a").attr("role","button"); $(".search-control").attr("role","search"); $("input.search-text").attr("aria-label","Search"); $(".control-wrap").attr("role","complementary"); $("header.head-wrap").attr("role","banner"); $("div.foot-wrap").attr("role","contentinfo"); $("a.header-logo-link h1").attr("aria-hidden","true"); $(".copyright-text:last").find("a").attr("role", "button"); $(".tab-nav-wrap").find("a").attr("role", "button"); $("#mobile-menu").attr("role","menubar"); $("#mobile-menu li").attr("role","menuitem"); $("#mobile-menu li a").attr("role","button"); $(".heading-text").attr("role","heading"); $(".ad-image").attr("role","presentation"); //add a basket link for aria to read $("li.basket-widget").prepend('<a tabindex="0" class="aria-basket-link" href="basket.asp?fw=1">Shopping Cart</a>'); //adds aria-label explaining that the link is opening a new tab if the link has target="blank" on it and no aria-label added $('a[target="_blank"]').each(function() { if (!$(this).attr('aria-label')) { $(this).attr('aria-label', 'Opens in a new tab.'); } }); // address the "button can not be empty" - add the Next Month and Previous month to the arrow buttons var spanNextMonth = $('<span>', {id: 'bn_next-label', class: 'sr-only', text: 'Next Month'}); var spanPrevMonth = $('<span>', {id: 'bn_prev-label', class: 'sr-only', text: 'Previous Month'}); $('.bn_next').prepend(spanNextMonth); $('.bn_prev').prepend(spanPrevMonth); // add ID attribute to main sections $("header.head-wrap.no-mobile").attr("id","mainheadwrap"); $("div.content-wrap").attr("id","maincontentwrap"); $("div.foot-wrap").attr("id","mainfootwrap"); // adding Skip link var skipLinkToHeader = $('<a>', {href: '#mainheadwrap', class: 'skip-link', text: 'Skip to header content'}); var skipLinkToMainContent = $('<a>', {href: '#maincontentwrap', class: 'skip-link', text: 'Skip to main content'}); var skipLinkToFooterContent = $('<a>', {href: '#mainfootwrap', class: 'skip-link', text: 'Skip to footer content'}); // add created skip link above the main sections $(skipLinkToHeader).insertBefore("header.head-wrap.no-mobile"); $(skipLinkToMainContent).insertBefore("div.content-wrap"); $(skipLinkToFooterContent).insertBefore("div.foot-wrap"); // use setTimeout to make sure all are loaded before adding attributes setTimeout(function() { $(".day-cell.highlight-day").attr("tabindex", "0"); // address the interactive elements should be navigable using the keyboard $("#ShoWareBasketWidget").find(".cart-item").attr("role", "button").attr("tabindex", "0"); $("#ShoWareBasketWidget .cart-item .cart-item-pic").attr("role", "cart presentation"); $("#ShoWareBasketWidget .cart-item .cart-item-pic .sw-i-cart").attr("role", "cart presentation"); $(".featured-items-item .streaming-note").attr("role","presentation"); $(".pl-item a.pl-popup-link").attr("role","button"); $(".pl-date-block-image").attr("role","img"); // address the "Incorrect use of aria-describedy" - this is used in the header cart but there's no ID to refer it to var cartTitle = $('.cart-item-desc').attr('title'); var spanCartItemDesc = $('<span>', {id: 'cart-text', class: 'sr-only', text: cartTitle}); $('.cart-item-desc').prepend(spanCartItemDesc); // address the "Incorrect use of aria-describedy" - this is used in the calendar and no ID to refer it to var calendarTableTitle = $('.calendar-object table:first').attr('title'); var spanCalendarIDAdded = $('<span>', {id: 'month', class: 'sr-only', text: calendarTableTitle}); $('.calendar-object table:first').prepend(spanCalendarIDAdded); }, 1200); }catch(e){ console.log("Failed to update header for accessability:"); console.log(e); } </script> <style> /* Hide visually but keep accessible to screen readers */ .sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; border: 0 !important; } .skip-link { position: absolute; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden; } /* Style for focused interactive elements visible to accessibility readers */ :focus-visible { outline: 2px solid #ccc; /* Show the outline for accessibility readers */ outline-offset: 2px; /* Optional: Adjust the spacing between the element and the outline */ } </style> <script> setTimeout(function() { $( document ).ready(function() { $('#mobile-menu li a').each(function(){ if($(this).is(':contains("close")')) { $(this).attr("onclick","actWidget('');"); } if($(this).is(':contains("search")')) { $(this).attr("onclick","actSearch();return 0;"); } if($(this).is(':contains("shopping cart")')) { $(this).attr("HREF","https://uisticketoffice.showare.com/basket.asp?fw=1"); } }); $('#mobile-menu').removeAttr("onclick"); }); }, 300); </script> <script> // Add control wrap's height as the min-height for main-constrain-width so the sidebar won't overlap to the footer setTimeout(function() { $( document ).ready(function() { varControlWrapHeight = $(".control-wrap").height() + "px"; $(".main-constrain-width").css( "min-height", varControlWrapHeight ); }); }, 300); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10