PageSourceSearch

https://www.cincyticket.com/include/widgets/events/EventList.js?v2

js cincyticket.com collected 2026-09-25 18:52:25 UTC 32,848 bytes, 660 lines download raw bytes

1//  ShoWare event list display functions and AJAX calls:
2//      pages require the scripot element and #swEventList container
3//      default settings can be achieved 
4
5//  functions:
6//clearEventList() - clears the list object
7//doEventList() - lists events based on eventListArgs{}
8//elLoadMore() - loads next page, page is tracked as loaded, but can be manipulated via eventListArgs.page
9//fetchEvents(args) - fetches events, function fetchs AND builds events via callback once list is fetched to buildEvents(data)
10//buildEvents(events) - writes event list items to page 
11
12//  initial run of fetchEvents() performed automatically at end of page.
13function swMonthDayYearFormat(date) {
14    var dateObject = parseLocalCalendarDate(date);
15    if (!dateObject) {
16        return '';
17    }
18    var options = { year: 'numeric', month: 'short', day: 'numeric' };
19    var formattedDate = dateObject.toLocaleDateString('en-US', options);
20    
21    return formattedDate;
22}
23
24function parseLocalCalendarDate(value) {
25    if (!value) {
26        return null;
27    }
28
29    // Date-only strings (YYYY-MM-DD...) should be treated as local calendar dates,
30    // not converted from UTC, to avoid off-by-one rendering in negative timezones.
31    if (typeof value === 'string') {
32        var isoDateMatch = value.match(/^(\d{4})-(\d{2})-(\d{2})/);
33        if (isoDateMatch) {
34            return new Date(parseInt(isoDateMatch[1], 10), parseInt(isoDateMatch[2], 10) - 1, parseInt(isoDateMatch[3], 10));
35        }
36    }
37
38    var parsed = new Date(value);
39    if (isNaN(parsed.getTime())) {
40        return null;
41    }
42
43    return new Date(parsed.getFullYear(), parsed.getMonth(), parsed.getDate());
44}
45
46var EventList = $("#swEventList");
47var focusEvent;
48var siteURL = $("#swEventListScript").attr('src').split("/");
49siteURL = "//" + siteURL[2] //protocol relative url
50
51var eventListArgs = {},
52    messages = {},
53    loadedEvents = [];
54
55var streamlinedHidePrices = $("input[name='hidePrices']").val() == '1';
56
57//build initial arguments from object
58eventListArgs = {
59    //ARGS: '[isCorporatePartner]', [Category], [SpecificEvents]
60    "category": typeof EventList.data("category") !== 'undefined' ? EventList.data("category") : '',
61
62    "specificEvents": [],
63
64    "page": typeof EventList.data("page") !== 'undefined' ? EventList.data("page") : 1,
65
66    "corporatepartnerpage": typeof EventList.data("corporatepartnerpage") !== 'undefined' ? parseInt(EventList.data("corporatepartnerpage"),10) : 0
67}
68
69//clear event list and reset to a default list for update when the user calls doEventList
70function clearEventList() {
71
72    //set default options
73    eventListArgs.category = 0;
74
75    eventListArgs.page = 1;
76
77    eventListArgs.corporatepartnerpage = 0;
78    //remove the items from the list
79    EventList.empty();
80
81    //remove any load more buttons
82    if ($("#loadMoreEventsButton").length) {
83        $("#loadMoreEventsButton").remove();
84    }
85}
86
87function doEventList() {
88    fetchEvents(eventListArgs)
89}
90
91function elLoadMore() {
92    eventListArgs.page = eventListArgs.page + 1;
93    fetchEvents(eventListArgs);
94    //set button to loading if it exists
95    if ($("#loadMoreEventsButton").length) {
96        $("#loadMoreEventsButton .sw-icon-spinner").show();
97        $("#loadMoreEventsButton .active-text").hide();
98    }
99}
100var streamNote = '<a class="streaming-popup" href="Javascript:popUp(\'Streaming Details\',\'StreamingDetails.asp?evt=%EVTVALUE%\', 400, 480,\'no\',\'yes\',\'no\',\'no\')"><img class="sw-icon streaming-icon" src="/images/stream-icon.svg" alt="Streaming Available">Streaming Available</a>'
101var eventTemplate = ''
102
103function setupEventTemplate() {
104    if (isStreamlinedHomePage) {
105        eventTemplate += '         <section id="event-%EVENTID%" class="featuredevent-box featuredbox-%EVENTCOUNT%" data-index="%EVENTCOUNT%">'
106        eventTemplate += '             <div class="background-wrap" style="background: linear-gradient(0deg, rgba(0,0,0,1) -20%, rgba(255,255,255,0) 50%), url(%EVENTIMAGE%) no-repeat center/cover !important; background-size: cover;">'
107        eventTemplate += '                  <div class="topinfo-wrap">'
108        eventTemplate += '                      <div class="featuredevent-favorite"><div class="infolabel">
108<span class=" %SHOWLABELINFOONIMAGE%">%INFOLINE%</span></div><a href="#" class="fav-link" title="Add this to your favorite event." data-title="%EVENTNAME%" data-link="%EVENTLINK%" data-isfree="%ISFREE%" data-eventid="%EVENTID%"><i class="sn-social-media-icon fa fa-heart-o"></i></a></div>'
109        eventTemplate += '                  </div>'
110        eventTemplate += '                  <div class="bottominfo-wrap">'
111        eventTemplate += '                      %EVENTLIMITEDAVAILABILITY%'
112        eventTemplate += '                      <div class="right"><a href="#" class="featured-togglelink button featuredbox-%EVENTCOUNT%"><i class="sn-social-media-icon fa fa-angle-down"></i></a></div>'
113        eventTemplate += '                      %EVENTBESTSELLERTEXTWRAP%'
114        eventTemplate += '                  </div>'
115        eventTemplate += '              </div>'
116        eventTemplate += '              <div class="featuredevent-infowrap">'
117        eventTemplate += '                   <div class="featuredevent-title">%EVENTNAME%</div>'
118        eventTemplate += '                   <div class="featuredevent-description">%EVENTCATEGORIES%</div>'
119        eventTemplate += '              </div>'
120        eventTemplate += '         </section>'
121        eventTemplate += '         <div class="highlightinfo-wrap featuredbox-%EVENTCOUNT%" style="display: none;">'
122        eventTemplate += '         <button class="prevevent-btn toggle-a-featuredevent featuredbox-%EVENTCOUNTMinus1%"><i class="fa fa-angle-left"></i></button> <button class="nextevent-btn toggle-a-featuredevent featuredbox-%EVENTCOUNTPlus1%"><i class="fa fa-angle-right"></i></button>'
123        eventTemplate += '               <div class="homefeaturedimages-wrap">'
124        eventTemplate += '                  <div class="highlightimages-wrap">'
125        eventTemplate += '                      %EVENTIMAGE2%'  
126        eventTemplate += '                      %EVENTIMAGE3%'  
127        eventTemplate += '                      %EVENTIMAGE4%'   
128        eventTemplate += '                  </div>'
129        eventTemplate += '                  <div class="homefeaturedimages-pagination"></div>'
130        eventTemplate += '               </div>'
131        eventTemplate += '               <div class="highlightdescription-wrap">'
132        eventTemplate += '               <div class="highlighttitle-wrap">'        
133        eventTemplate += '                   <div class="highlight-title">%EVENTNAME%</div>'
134        eventTemplate += '                   <div class="highlight-dateschedule-wrap">'
135        eventTemplate += '                        %DATEDISPLAY%'
136        eventTemplate += '                        <div class="highlight-schedule %HIDEINFOLABELONDESCRIPTION%">%INFOLINE%</div>'
137        eventTemplate += '                   </div>'
138        eventTemplate += '                   %BUYTICKETSBUTTON%'
139        eventTemplate += '               </div>'
140        eventTemplate += '                  <div class="description">%EVENTDESCRIPTION%</div>'
141        if (!streamlinedHidePrices) {
142            eventTemplate += '                  <div class="event-pricing-wrap">'
143            eventTemplate += '                      <span class="pricing-title">%EVENTPRICINGLABEL%</span>'
144            eventTemplate += '                      %EVENTPRICING%'
145            eventTemplate += '                  </div>'
146        }
147        eventTemplate += '               </div>'
148        eventTemplate += '         </div>'
149    } else {
150        // *******  this is the old style design for Featured Events,
151        eventTemplate += '          <div class="featured-items-item clear" data-index="%INDEX%">'
152        eventTemplate += '              <h2 class="event-list-event-name notranslate"><a href="%EVENTLINK%">%EVENTNAME%</a></h2>'
153        eventTemplate += '              <a class="event-image-link" tabindex="-1" href="%EVENTLINK%"><img class="featured-items-image" alt="%EVENTNAMEALTIMG%" border="0" src="%EVENTIMAGE%"></a>'
154        eventTemplate += '              <div class="featured-items-description clear" tabindex="0">%EVENTDESCRIPTION%</div>'
155        eventTemplate += '              <span class="streaming-note streaming-available-event-note">%STREAMNOTE%</span>'
156        eventTemplate += '              <a href="%EVENTLINK%" class="button buy-tickets ">%BUTTONTEXT%</a>'
157        eventTemplate += '          </div>'
158    }
159}
160
161
162function fetchEvents(args) {
163    //we're fetchin' events, add a load more button if one doesn't exist to notify the patron that a list is loading
164    if (isStreamlinedHomePage) {
165        // Add Loading indicator
166        $("#swEventList").html('<i class="fa fa-spinner fa-spin" style="display: block; margin-left: auto; margin-right: auto;"></i>');
167    } else {
168        // Only add 'load more' button if on default home page
169        if ($("#loadMoreEventsButton").length == 0) {
170            EventList.parent().append('<button id="loadMoreEventsButton" class="button load-more-button sw-button-muted" onclick="elLoadMore();" style="width:100%;"><span class="active-text" style="display:none;">load more...</span><i class="sw-icon sw-icon-spinner"></i></button>');
171        }
172    }
173    
174    $.getJSON(siteURL + "/include/widgets/events/EventList.asp", {
175            category: args.category,
176
177            page: args.page,
178
179            cp: args.corporatepartnerpage
180
181        })
182        //events = data;
183        .done(function(data) {
184            // If streamlined home page, remove loading indicator before building events
185            if (isStreamlinedHomePage)
186                $("#swEventList").html('');
187
188            eventList = data;
189
190            buildEvents(data);
191            buildCategoryName(args.category);
192
193            // Update a few things for the streamlined home page after building events
194            if (isStreamlinedHomePage) {
195                updateClickHandlers();
196                updateActivityCount();
197                disableFilterInputs(false);
198                updateFavoriteList();
199                updateFeaturedImages();
200                goToEvent();
201            }
202                
203        })
204        .fail(function(jqxhr, textStatus, error) {
205            var err = textStatus + ", " + error;
206            console.log("Request Failed: " + err);
207        })
208}
209
210// ================  Function to update the favorite list in the UI and toggle icons ==================//
211function updateFavoriteList() {
212    let swEventFavorites = localStorage.getItem("swEventFavorites") ? JSON.parse(localStorage.getItem("swEventFavorites")) : []; // Retrieve the swEventFavorites from localStorage and parse the JSON
213    
214    // Loop through all fav-links and set the correct heart icon based on the localStorage
215    $(".fav-link").each(function () {
216        let eventTitle = $(this).parent().parent().parent().siblings('.featuredevent-infowrap').find('.featuredevent-title').html();
217        let isFavorite = swEventFavorites.some(f => f.title === eventTitle);
218
219        // Toggle between 'fa-heart' and 'fa-heart-o' based on whether it's in swEventFavorites
220        if (isFavorite) {
221            $(this).find("i").removeClass("fa-heart-o").addClass("fa-heart").addClass("red");
222        } else {
223            $(this).find("i").removeClass("fa-heart").removeClass("red").addClass("fa-heart-o");
224        }
225    });
226
227    // Also populate the list with favorite events
228    $("#swEventFavorites").empty();
229    swEventFavorites.forEach(function (fav) {
230        $("#swEventFavorites").append(`<li><a href='${fav.link}'>${fav.title}</a></li>`);
231    });
232}
233
234function updateActivityCount() {
235    var count = $('section.featuredevent-box:visible').length;
236    var activityStr = "Showing " + count + ((count == 1) ? " Activity" : " Activities");
237    
238    if (count < 3 && !$("#swEventList").hasClass("lessthree")) {
239      $("#swEventList").addClass("lessthree");
240	}
241
242	$('div.filterstotal-text').html(activityStr);
243}
244
245function filterEventList(events) {
246    // Filter events by search term
247    var search = $("input[name='search']").val().toString();
248
249    var filteredEvents = structuredClone(events);
250    
251    // If there is no search term, don't filter
252    if (search != "")
253        filteredEvents.swEvent = filteredEvents.swEvent.filter((evt) => evt.Event.toLowerCase().includes(search.toLowerCase()));
254
255    // Filter events by date range
256
257    // If there are no dates selected, don't filter
258    if ($("#dateRangeInput").val() != "") {
259        var dateRangeObj = JSON.parse($("#dateRangeInput").val());
260
261        // Only filter if both dates are selected
262        if (dateRangeObj.from != '' && dateRangeObj.to != '') {
263            var fromDate = parseLocalCalendarDate(dateRangeObj.from);
264            var toDate = parseLocalCalendarDate(dateRangeObj.to);
265
266            if (!fromDate || !toDate) {
267                return filteredEvents;
268            }
269
270            filteredEvents.swEvent = filteredEvents.swEvent.filter(function(evt) {
271                var eventStartDate = parseLocalCalendarDate(evt.PerformanceStart);
272                var eventEndDate = parseLocalCalendarDate(evt.PerformanceEnd);
273
274                if (!eventStartDate || !eventEndDate) {
275                    return false;
276                }
277
278                // If event starts before end of filter and event ends after start of filter, include
279                return ((eventStartDate <= toDate) && (eventEndDate >= fromDate));
280            });
281        }
282    }
283    
284    // Filter events by event category
285    var eventCategoryFilterStr = $("input[name='eventCategoryFilter']").val().toString();
286
287    // If there are no event categories selected, don't filter
288    if (eventCategoryFilterStr != "") {
289        var eventCategoryFilter = eventCategoryFilterStr.split(',');
290        filteredEvents.swEvent = filteredEvents.swEvent.filter(function(evt) {
291            // Build array of categories assigned to this event
292            var thisEventCategories = [];
293            
294            for (var i = 0; i < evt.EventCategories.length; i++) {
295                // Don't count inactive categories
296                if (evt.EventCategories[i].CatActive != 1)
297                    continue;
298
299                var categoryID = evt.EventCategories[i].ID.toString();
300                var parentCategoryID = evt.EventCategories[i].ParentCategory.toString();
301
302                if (!thisEventCategories.includes(categoryID))
303                    thisEventCategories.push(categoryID);
304
305                if (parentCategoryID > 0 && !thisEventCategories.includes(parentCategoryID))
306                    thisEventCategories.push(parentCategoryID);
307            }
308
309            // We have a match if any category selected in the filter is assigned to the Event
310            return eventCategoryFilter.some(category => thisEventCategories.includes(category));
311        });
312    }
313
314    // Filter events by performance category
315    var performanceCategoryFilterStr = $("input[name='performanceCategoryFilter']").val().toString();
316
317    // If there are no performance categories selected, don't filter
318    if (performanceCategoryFilterStr != "") {
319        var performanceCategoryFilter = performanceCategoryFilterStr.split(',');
320
321        filteredEvents.swEvent = filteredEvents.swEvent.filter(function(evt) {
322            // We have a match if any category selected in the filter is assigned to the Event
323            return performanceCategoryFilter.some(category => evt.PerformanceCategories.includes(Number(category)));
324        });
325    }
326
327    // Filter events by price
328    var priceFilterStr = $("input[name='priceFilter']").val().toString();
329
330    // If there are no price filters, don't filter
331    if (priceFilterStr != "") {
332        var priceFilter = priceFilterStr.split(',');
333
334        filteredEvents.swEvent = filteredEvents.swEvent.filter(function(evt) {
335            // Return true if any of the pricing in this event matches any of the filters
336            // If the event is set to free, just check the 'complimentary' filter if enabled and return
337            if (evt.isFree) {
338                return priceFilter.includes("99");
339            }
340
341            return evt.pricing.some(price => {
342                // Check each price against the appropriate filter(s)
343                var currentPrice = price.Price;
344
345                // Filter 1: $0 - $20
346                if (priceFilter.includes("1")) {
347                    if (currentPrice >= 0.00 && currentPrice <= 20.00)
348                        return true;         
349                }
350
351                // Filter 2: $20 to $50
352                if (priceFilter.includes("2")) {
353                    if (currentPrice >= 20.00 && currentPrice <= 50.00) 
354                        return true;                
355                }
356
357                // Filter 3: $50 - $100
358                if (priceFilter.includes("3")) {
359                    if (currentPrice >= 50.00 && currentPrice <= 100.00) 
360                        return true;                
361                }
362
363                // Filter 4: $100 or more
364                if (priceFilter.includes("4")) {
365                    if (currentPrice >= 100.00) 
366                        return true;                
367                }
368                // Filter 99: Complimentary
369
370                // If we got all the way here without returning true, we didn't find a matching price so return false
371                return false;
372            });
373        });
374    }
375
376    return filteredEvents;
377
378}
379
380function buildCategoryName(category) {
381    $.getJSON(siteURL + "/include/ajax.asp", {
382            action: 'category',
383            category: category
384
385
386        })
387        //events = data;
388        .done(function(data) {
389            if (data.length > 0) {
390                var CategoryDescription = "<span class='category-heading'>" + data[0].Hierarchy + " </span> <div class='category-subdescription'>" + data[0].CategoryDescription + "</div>";
391                if (CategoryDescription.charAt(CategoryDescription.length - 1) == '/') {
392                    CategoryDescription = CategoryDescription.substr(0, CategoryDescription.length - 1);
393                }
394				$(".category-description").remove();
395               // EventList.prepend("<div class='heading-text category-description' >" + CategoryDescription + "</div>");
396                $("<div class='heading-text category-description' >" + CategoryDescription + "</div>").insertBefore(EventList);	
397            }
398            if (isStreamlinedHomePage)
399                moveHighlightInfo(); 
400        })    
401        .fail(function() {
402            if (isStreamlinedHomePage)
403                moveHighlightInfo(); // Optionally call it even on failure, if needed
404        });
405
406}
407
408function buildEvents(events) {
409    // If using streamlined home page, ensure events are filtered first
410    if (isStreamlinedHomePage)
411        events = filterEventList(events);
412
413    var indexOffset = loadedEvents.length;
414    var loc = [],
415        swEvent, eventMarkup, perfDate, packageBundleLink;
416
417
418    if (events.swEvent.length === 0) {
419        $("#loadMoreEventsButton").remove();
420        $(".no-event-msg").remove();
421        EventList.append("<span class='no-event-msg'>(no events)</span>");
422        return;
423    }
424    
425    for (i = 0; i < events.swEvent.length; i++) {
426        eventMarkup = eventTemplate;
427        ev = events.swEvent[i];
428        if(eventListArgs.specificEvents.length > 0){
429            if(eventListArgs.specificEvents.indexOf(ev.ID) == -1){
430                //event not part of specified events
431                continue;
432            }
433        }
434        loadedEvents.push(ev);
435
436        if (isStreamlinedHomePage) {
437            eventMarkup = eventMarkup.replace(/%EVENTCOUNT%/g, i);
438            eventMarkup = eventMarkup.replace(/%EVENTCOUNTPlus1%/g, (i + 1 === events.swEvent.length ? 0 : i + 1));
439            eventMarkup =eventMarkup.replace(/%EVENTCOUNTMinus1%/g, (i - 1 < 0 ? events.swEvent.length - 1 : i - 1));
440            eventMarkup = eventMarkup.replace(/%ISFREE%/g, ev.isFree);
441            eventMarkup = eventMarkup.replace(/%EVENTID%/g, ev.ID);
442            eventBestSellerWrap = '<div class="bestseller-wrap"><span class="bestseller">'+ events.settings.SpotlightEventText +'</span></div>'
443            limitedAvailabilityWrap = '<div class="ondemand-item-wrap"><span class="indemand-title">'+ events.settings.LimitedInventoryTitle +'</span><span class="indemand-additional-desc">'+ events.settings.LimitedInventoryAdditionalDescription +'</span></div>'
444            if (ev.isBestSeller == 1) {
445                eventMarkup = eventMarkup.replace(/%EVENTBESTSELLERTEXTWRAP%/g, eventBestSellerWrap);
446            } else {
447                eventMarkup = eventMarkup.replace(/%EVENTBESTSELLERTEXTWRAP%/g, "");
448            }
449    
450            if (ev.LimitedAvailability == 1 && (events.settings.LimitedInventoryTitle.trim() != "" || events.settings.LimitedInventoryAdditionalDescription.trim() != "")) {
451                eventMarkup = eventMarkup.replace(/%EVENTLIMITEDAVAILABILITY%/g, limitedAvailabilityWrap);
452            } else {
453                eventMarkup = eventMarkup.replace(/%EVENTLIMITEDAVAILABILITY%/g, "");
454            }
455
456            // Add pricing, buy tickets button and dates if event is not free
457            if (!ev.isFree) {
458                eventMarkup = eventMarkup.replace(/%BUYTICKETSBUTTON%/g, '<div class="button-wrap"><a href="%EVENTLINK%" class="button buy-tickets">' + events.settings.BuyTicketsButtonText + '</a></div>');
459                eventMarkup = eventMarkup.replace(/%EVENTPRICINGLABEL%/g, ev.PriceLabel)
460
461                var pricingStr = "";
462                for (var j = 0; j < ev.pricing.length; j++) {
463                    pricingStr += '<span class="pricing-item">' + ev.pricing[j].Name + ' from $' + ev.pricing[j].Price.toFixed(2) + '</span>';
464                }
465                eventMarkup = eventMarkup.replace(/%EVENTPRICING%/g, pricingStr);
466                eventMarkup = eventMarkup.replace(/%DATEDISPLAY%/g, hideStreamlinedHomePageDateRange ? '' : '<div class="highlight-date">' + swMonthDayYearFormat(ev.PerformanceStart) + ' - ' + swMonthDayYearFormat(ev.PerformanceEnd) + '</div>');
467            } else {
468                // If event is set to free, check if the performances has qualifiers or Early Booking is active
469                if (ev.hasQualifiers === 1 || ev.isEarlyBooking == 1) {
470                    eventMarkup = eventMarkup.replace(/%BUYTICKETSBUTTON%/g, '<div class="button-wrap"><a href="%EVENTLINK%" class="button buy-tickets">' + events.settings.BuyTicketsButtonText + '</a></div>');
471                } else {
472                    eventMarkup = eventMarkup.replace(/%BUYTICKETSBUTTON%/g, '');
473                }
474                // If event is set to free, don't show pricing, or dates
475                eventMarkup = eventMarkup.replace(/%EVENTPRICINGLABEL%/g, '');
476                eventMarkup = eventMarkup.replace(/%EVENTPRICING%/g, '');
477                eventMarkup = eventMarkup.replace(/%DATEDISPLAY%/g, '');
478            }
479
480            // Add info line
481            eventMarkup = eventMarkup.replace(/%INFOLINE%/g,ev.StreamlinedHomePageInfoLine);
482            if (isMoveLabeInfoOnImage === "True") { // application variable set in the admin
483                eventMarkup = eventMarkup.replace(/%HIDEINFOLABELONDESCRIPTION%/g,'hideinfolabel');
484                eventMarkup = eventMarkup.replace(/%SHOWLABELINFOONIMAGE%/g,'showinfolabelonimage');
485            } else {
486                eventMarkup = eventMarkup.replace(/%HIDEINFOLABELONDESCRIPTION%/g,'');
487                eventMarkup = eventMarkup.replace(/%SHOWLABELINFOONIMAGE%/g,'hideinfolabel');
488            }
489
490            // Add event categories
491            eventMarkup = eventMarkup.replace(/%EVENTCATEGORIES%/g, ev.EventCategoriesStr);
492        }
493         
494        //add items to enhanced ecommerce as impressions
495        try {
496            swEnhancedEcommerce.addImpressions(ev.Event, ev.ID, '', 'event', 'Land Page Event List', i + indexOffset + 1);
497        } catch (e) { }
498        eventMarkup = eventMarkup.replace(/%EVENTLINK%/g, getEventLink(ev, events.settings));
499        eventMarkup = eventMarkup.replace(/%EVENTNAME%/g, ev.Event.replace(/</g, '&lt;').replace(/>/g, '&gt;'));
500		eventMarkup = eventMarkup.replace(/%EVENTNAMEALTIMG%/g, ev.Event.replace(/[@#$%^&*()_+=\-[\]{}\\|'";:,.><?]/g, ''));
501        if (ev.Img_1.toLowerCase() == "blank.gif" || ev.Img_1 == "") {
502            eventMarkup = eventMarkup.replace(/(\<a class=\"event-image-link\").+?(\<\/a\>)/g, "");
503            console.log(ev.Img_1.toLowerCase());
504        }
505
506        eventMarkup = eventMarkup.replace("%EVENTIMAGE%", events.settings.ProtocolRelativeURL + "/uplimage/" + ev.Img_1);
507
508        if (ev.images != undefined && Object.keys(ev.images).length !== 0) {
509            if (ev.images.StreamlinedViewImage2.trim().toLowerCase() != "" && !ev.images.StreamlinedViewImage2.trim().toLowerCase().includes("blank.gif"))
510                eventMarkup = eventMarkup.replace("%EVENTIMAGE2%", "<img class='featured-images' alt='" + ev.Event + "' src='" + events.settings.ProtocolRelativeURL + "/uplimage/" + ev.images.StreamlinedViewImage2 + "'>");
511            else
512                eventMarkup = eventMarkup.replace("%EVENTIMAGE2%", "");
513
514            if (ev.images.StreamlinedViewImage3.trim().toLowerCase() != "" && !ev.images.StreamlinedViewImage3.trim().toLowerCase().includes("blank.gif"))
515                eventMarkup = eventMarkup.replace("%EVENTIMAGE3%", "<img class='featured-images' alt='" + ev.Event + "' src='" + events.settings.ProtocolRelativeURL + "/uplimage/" + ev.images.StreamlinedViewImage3 + "'>");
516            else
517                eventMarkup = eventMarkup.replace("%EVENTIMAGE3%", "");
518           
519            if (ev.images.StreamlinedViewImage4.trim().toLowerCase() != "" && !ev.images.StreamlinedViewImage4.trim().toLowerCase().includes("blank.gif"))
520                eventMarkup = eventMarkup.replace("%EVENTIMAGE4%", "<img class='featured-images' alt='" + ev.Event + "' src='" + events.settings.ProtocolRelativeURL + "/uplimage/" + ev.images.StreamlinedViewImage4 + "'>");
521            else
522                eventMarkup = eventMarkup.replace("%EVENTIMAGE4%", "");
523        } else {
524            eventMarkup = eventMarkup.replace("%EVENTIMAGE2%", "");
525            eventMarkup = eventMarkup.replace("%EVENTIMAGE3%", "");
526            eventMarkup = eventMarkup.replace("%EVENTIMAGE4%", "");
527        }
528        
529
530        eventMarkup = eventMarkup.replace("%EVENTDESCRIPTION%", ev.Description);
531        eventMarkup = eventMarkup.replace("%INDEX%", i + indexOffset);
532        if (ev.ItemType == "E") {
533            eventMarkup = eventMarkup.replace("%BUTTONTEXT%", events.settings.BuyTicketsButtonText);
534        } else {
535            //bundle
536            eventMarkup = eventMarkup.replace("%BUTTONTEXT%", "buy " + events.settings.SysMsgBundleAlias);
537        }
538        if(ev.HasStream == 1){
539            eventMarkup = eventMarkup.replace("%STREAMNOTE%", streamNote);
540            eventMarkup = eventMarkup.replace("%EVTVALUE%", String(ev.ID))
541        }else{
542            eventMarkup = eventMarkup.replace("%STREAMNOTE%", '');
543        }
544
545        EventList.append(eventMarkup);
546        if (i == 0 && eventListArgs.page > 1) {
547            focusEvent = $(".event-list-event-name")[$(".event-list-event-name").length - 1];
548        }
549
550    }
551    extractIcons();
552
553    // Only do pagination stuff if we are on the default home page
554    if (!isStreamlinedHomePage) {
555        if (eventListArgs.page > 1) {
556            $(focusEvent).focus();
557        }
558
559        //set button to active if it exists
560        if ($("#loadMoreEventsButton").length) {
561            $("#loadMoreEventsButton .sw-icon-spinner").hide();
562            $("#loadMoreEventsButton .active-text").show();
563        }
564        //check if we've reached the end of the performances
565        if (events.settings.endOfList) {
566            //remove any load more buttons
567            if ($("#loadMoreEventsButton").length) {
568                $("#loadMoreEventsButton").remove();
569            }
570        } else {
571            //if the EventList doesn't have a load more button, add one
572            if ($("#loadMoreEventsButton").length == 0) {
573                EventList.parent().append('<button tabindex="0" id="loadMoreEventsButton" class="button load-more-button sw-button-muted" onclick="elLoadMore();" style="width:100%;"><span class="active-text">load more...</span><i class="sw-icon sw-icon-spinner" style="display:none;"></i></button>');
574            }
575        }
576    }
577
578    if (typeof updateCalendarDateByCategory == 'function') {
579        updateCalendarDateByCategory($("#categorySelect").val() !== 'undefined' ? $("#categorySelect").val() : 0);
580    }
581
582    //send enhanced ecommerce impressions
583    try{
584        swEnhancedEcommerce.sendImpressions();
585        swEnhancedEcommerce.clearImpressions();
586    }catch(e){}
587
588    $('.showinfolabelonimage').each(function() {
589        if ($.trim($(this).text()) === '') {
590            $(this).hide();
591        }
592    });
593
594}
595
596function getEventLink(thisEvent, settings) {
597    var url, upc;
598    url = settings.ProtocolRelativeURL;
599    upc = thisEvent.upcomingInfo;
600
601    var cpParameter = "";
602    cpParameter = (settings.isCorporatePartner > 0)?"&cp=" + settings.isCorporatePartner : "";
603
604    if (thisEvent.ItemType == "E" && upc) {
605        if (settings.AlwaysHitEventLandingPage == 1) {
606            return url + "/eventperformances.asp?evt=" + thisEvent.ID + cpParameter;
607        } else {
608
609            if (((upc.AccessMemberRestriction == 2) && (upc.AccessAllowedByMembershipLevel == 0)) || ((upc.AccessMemberRestriction == 1) && (!settings.isMember))) {
610                return url + "/eventperformances.asp?evt=" + thisEvent.ID + cpParameter;    
611            }
612
613            if (upc.NumUCP == 1 && (upc.EarlyBooking == 0 || (upc.EarlyBooking == 1 && settings.isMember))) {
614                // Check ForceSingleSection first - it takes priority regardless of InteractiveSeatmapActive
615                if (upc.PerfAreaID != 0 && settings.PerfAutoJumpToSection == 1) {
616                    //single area venue performance (ForceSingleSection)
617                    return url + "/orderticketsarea.asp?p=" + upc.PerfID + "&a=" + upc.PerfAreaID + "&backurl=" + url + "/default.asp";
618                }
619                if(thisEvent.InteractiveSeatmapActive){
620                    return url + "/orderticketsvenue.asp?p=" + upc.PerfID + "&backurl=" + url + "/default.asp";
621                }
622                //single performance, tickets available, no specific area
623                return url + "/ordertickets.asp?p=" + upc.PerfID + "&backurl=" + url + "/default.asp";
624            } else {                
625                return url + "/eventperformances.asp?evt=" + thisEvent.ID + cpParameter;                
626            }
627        }
628    }
629    if (thisEvent.ItemType == "B") {
630        //bundle item
631        if (settings.UseFlexBundles) {
632            return url + "/BundleSelectTier.asp?BundleID=" + thisEvent.ID;
633        } else {
634            return url + "/BundlePurchase_Qty.asp?BundleID=" + thisEvent.ID;
635        }
636        
637    }
638    //default to event page:
639    return url + "/eventperformances.asp?evt=" + thisEvent.ID;
640}
641
642var isStreamlinedHomePage = $("input[name='isStreamlined']").val() == '1';
643var isMoveLabeInfoOnImage = $("input[name='showInfoLabelOnImage']").val();
644var hideStreamlinedHomePageDateRange = $("input[name='hideStreamlinedHomePageDateRange']").val() == 'true';
645
646// Initial setup
647setupEventTemplate();
648fetchEvents(eventListArgs);
649
650//functions to report clicks
651$("#swEventList").on('click', 'h2 a, a.buy-tickets', function (e) {
652    //this tracks all event list clicks, this could easily be split out, but currently we're only tracking clicks on the event list itself
653    var myIndex = $(this).closest(".featured-items-item").data("index");
654    try {
655        var product = loadedEvents[myIndex];
656        swEnhancedEcommerce.addProducts(product.Event, product.ID, '', 'event', myIndex + 1);
657        swEnhancedEcommerce.sendProducts('Land Page Event List');
658        swEnhancedEcommerce.clearProducts();
659    } catch (e) { }
660});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.