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, '<').replace(/>/g, '>')); 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.