1 2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 3<html lang="en"> 4<head> 5<title>Sasha Velour: TRAVESTY</title> 6<meta property="og:title" content="I just bought tickets to The Hanover Theatre! Will you join me?" /> 7<meta property="og:image" content="https://tickets.thehanovertheatre.org/ArticleMedia/Images/branding_tiki/htpa_color_200x200.jpg" /> 8<meta name="viewport" content="width=device-width, initial-scale=1.0" /> 9<meta name="apple-mobile-web-app-capable" content="yes" /> 10<meta property="og:description" content="Buy and reserve tickets for you and your friends. If you have received this message, it is because someone has reserved a ticket for you! Just click this link to pick up your tickets." /> 11<meta property="og:url" content="https://tickets.thehanovertheatre.org/Online//default.asp?doWork::WScontent::loadArticle=Load&BOparam::WScontent::loadArticle::permalink=sv2627&BOparam::WScontent::loadArticle::context_id=" /> 12<meta property="og:site_name" content="default site" /> 13 14<meta http-equiv="Imagetoolbar" content="no"> 15 16 17<!-- inclusion of bootstrap specific CSS --> 18<!-- http://twitter.github.com for documentation on bootstrap --> 19<link rel="Stylesheet" href="/lib/bootstrap/css/bootstrap.min.css?_7.92.0" /> 20<!-- end of bootstrap specific CSS --> 21 22<!-- include the font awesome css for font icons-->
23<link rel="Stylesheet" href="/lib/fontawesome-free/css/all.min.css" /> 24 25<!-- include material design icons--> 26<link rel="Stylesheet" href="/lib/material-design-icons/material-icons.css" /> 27 28<link rel="stylesheet" href="../../content/images/branding/global.css?_=7.92.0" type="text/css"/> 29 30<!--[if lt IE 9]> 31 <link rel="stylesheet" href="../../content/images/branding/global_IE.css?_7.92.0" type="text/css"> 32<![endif]--> 33
34<script src="/lib/jquery/jquery.min.js?_=7.92.0" type="text/javascript"></script>
34 35 36
37<script language="Javascript"> 38 39</script>
39 40 41 42 43 <link rel="stylesheet" href="/content/Files/CSS/Hanover_20251124.css?_=7.92.0" type="text/css" /> 44 45
46<script type="text/javascript" > 47 48</script>
vendor: 1 bytes, line 48
48
49<script type="text/javascript"> 50 // Check whether cookies are enabled. 51 document.cookie = "TestCookie=1"; 52 var testCookie = document.cookie; 53 54 // Try to retrieve the value we just set. 55 if (testCookie.indexOf("TestCookie=1") == -1) 56 { 57 58 document.location = "error.asp?nocookie="; 59 60 } 61 else 62 document.cookie = "TestCookie=;expires=Thu, 01-Jan-1970 00:00:00 GMT"; 63</script>
63 64
65<script type="text/javascript"> 66 67function setRSVPButtons(response, eventCode) 68{ 69 var url = '/' + eventCode + '/invited?user=' + response.authResponse.userID + '&access_token=' + response.authResponse.accessToken; 70 FB.api(url, 'get', 71 function (response) { 72 if (!response || response.error) { 73 new showAlertPopup("Error occurred:" + response.error.message, "", "", "", "", ""); 74 } 75 else 76 { 77 if (response.data[0].rsvp_status == "attending") 78 { 79 var buttons = document.getElementsByName("attendingButton" + eventCode); 80 for (var x = 0; x < buttons.length; x++) 81 { 82 buttons.item(x).disabled = true; 83 buttons.item(x).style.display = "inline"; 84 } 85 buttons = document.getElementsByName("maybeButton" + eventCode); 86 for (var x = 0; x < buttons.length; x++) 87 { 88 buttons.item(x).style.display = "inline"; 89 } 90 } 91 else if (response.data[0].rsvp_status == "unsure") 92 { 93 var buttons = document.getElementsByName("attendingButton" + eventCode); 94 for (var x = 0; x < buttons.length; x++) 95 { 96 buttons.item(x).style.display = "inline"; 97 } 98 buttons = document.getElementsByName("maybeButton" + eventCode); 99 for (var x = 0; x < buttons.length; x++) 100 { 101 buttons.item(x).disabled = true; 102 buttons.item(x).style.display = "inline"; 103 } 104 } 105 else 106 { 107 var buttons = document.getElementsByName("attendingButton" + eventCode); 108 for (var x = 0; x < buttons.length; x++) 109 { 110 buttons.item(x).style.display = "inline"; 111 } 112 buttons = document.getElementsByName("maybeButton" + eventCode); 113 for (var x = 0; x < buttons.length; x++) 114 { 115 buttons.item(x).style.display = "inline"; 116 } 117 } 118 } 119 }); 120} 121function setRSVPButtonsLogin(eventCode) 122{ 123 FB.getLoginStatus(function (response) { 124 if (response.status == 'connected') { 125 setRSVPButtons(response, eventCode); 126 } 127 else { 128 FB.login(function (response) { 129 if (response.authResponse) { 130 setRSVPButtons(response, eventCode); 131 } else { 132 } 133 }, { scope: 'rsvp_event,email,user_groups,publish_stream' }); 134 } 135 }); 136 return true; 137} 138 139function rsvpToFBEvent(status, response, eventCode) 140{ 141 142 var url = '/' + eventCode + '/' + status + '?access_token='
142+ response.authResponse.accessToken; 143 144 FB.api(url, 'post', 145 function (response) { 146 if (!response || response.error) { 147 new showAlertPopup("Error occurred:" + response.error.message, "", "", "", "", ""); 148 } 149 else 150 { 151 gaTrackEvent('Facebook', 'RSVP to Event Success'); 152 153 if (status == "attending") 154 { 155 var buttons = document.getElementsByName("attendingButton" + eventCode); 156 for (var x = 0; x < buttons.length; x++) 157 { 158 buttons.item(x).disabled = true; 159 } 160 buttons = document.getElementsByName("maybeButton" + eventCode); 161 for (var x = 0; x < buttons.length; x++) 162 { 163 buttons.item(x).disabled = false; 164 } 165 } 166 else if (status == "maybe") 167 { 168 var buttons = document.getElementsByName("maybeButton" + eventCode); 169 for (var x = 0; x < buttons.length; x++) 170 { 171 buttons.item(x).disabled = true; 172 } 173 buttons = document.getElementsByName("attendingButton" + eventCode); 174 for (var x = 0; x < buttons.length; x++) 175 { 176 buttons.item(x).disabled = false; 177 } 178 } 179 } 180 }); 181} 182 183function rsvpToFBEventLogin(status, eventCode) { 184 185 FB.getLoginStatus(function (response) { 186 if (response.status == 'connected') { 187 rsvpToFBEvent(status, response, eventCode); 188 } 189 else { 190 FB.login(function (response) { 191 if (response.authResponse) { 192 rsvpToFBEvent(status, response, eventCode); 193 } else { 194 } 195 }, { scope: 'rsvp_event,email,user_groups,publish_stream' }); 196 } 197 }); 198 return true; 199} 200</script>
vendor: 1 bytes, line 200
200
201<script type="text/javascript" src="../Common/browser_detect.js?_=7.92.0"></script>
vendor: 1 bytes, line 201
201
202<script type="text/javascript"> 203 var genericConfirmationMessage = "Are you sure?"; 204 var offerExpired = "Your order has expired."; 205 var admissionsExpired = "An offer on one of your tickets has expired."; 206 var alertHeaderText = "Attention"; 207 var termsHeaderText = "Terms and Conditions"; 208 var helpHeaderText = "Help"; 209 var sectionHeaderText = "More Information"; 210 211 var okayButtonText = "OK"; 212 var cancelButtonText = "Cancel"; 213 var acceptButtonText = "Accept"; 214 var declineButtonText = "Decline"; 215 var closeButtonText = "Close"; 216 217 var sTokenName = 'sToken'; 218 var sToken = '1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs='; 219</script>
vendor: 1 bytes, line 219
219
220<script type="text/javascript"> 221 var isNextGenCheckoutFFEnabled = 0 == 1; 222 var isNewBuyFlowEnabled = "False" == "True"; 223</script>
vendor: 1 bytes, line 223
223
224<script type="text/javascript" src="../Common/online-jscript.js?_=7.92.0"></script>
vendor: 1 bytes, line 224
224
225<script type="text/javascript" src="../Common/online-navigation-jscript.js?_=7.92.0"></script>
vendor: 1 bytes, line 225
225
226<script type="text/javascript" src="../Common/Widgets/widgetParent.js?_=7.92.0"></script>
vendor: 1 bytes, line 226
226
227<script type="text/javascript"> 228/* 229 230*/ 231function displayMessage(onClickEvent) 232{ 233 234} 235 236function tsOrderChanged( url ) 237{ 238 new showConfirmPopup( '', 'The current order has unsaved changes that may be lost. Continue anyway?', function () { document.location = url }, '' ); 239} 240 241// Used for drop-down menu in IE 6 242<!--//--><![CDATA[//><!-- 243function startList() { 244 if (document.all&&document.getElementById) { 245 navRoot = document.getElementById("menuTop"); 246 for (i=0; i<navRoot.childNodes.length; i++) { 247 node = navRoot.childNodes[i]; 248 if (node.id=="menuTopItem") { 249 node.onmouseover=function() { 250 this.className+=" over"; 251 } 252 253 node.onfocus=function(){ 254 this.className+=" over"; 255 } 256 257 node.onmouseout=function() { 258 this.className=this.className.replace(" over", ""); 259 } 260 261 node.onblur=function() { 262 this.className=this.className.replace(" over", ""); 263 } 264 } 265 } 266 } 267} 268//--><!]]> 269 270var plusApi_loaded = false; 271var twitterApi_loaded = false; 272var fbApi_loaded = false; 273 274 fbApi_loaded = true; 275 276 twitterApi_loaded = true; 277 278</script>
278 279<noscript> 280 <meta http-equiv="refresh" content="0; URL=error.asp"> 281</noscript> 282
283<script type="text/javascript" > 284var longMonthsOfYear = new Array(); 285longMonthsOfYear[ 0 ] = "January"; 286longMonthsOfYear[ 1 ] = "February"; 287longMonthsOfYear[ 2 ] = "March"; 288longMonthsOfYear[ 3 ] = "April"; 289longMonthsOfYear[ 4 ] = "May"; 290longMonthsOfYear[ 5 ] = "June"; 291longMonthsOfYear[ 6 ] = "July"; 292longMonthsOfYear[ 7 ] = "August"; 293longMonthsOfYear[ 8 ] = "September"; 294longMonthsOfYear[ 9 ] = "October"; 295longMonthsOfYear[ 10 ] = "November"; 296longMonthsOfYear[ 11 ] = "December"; 297 298</script>
vendor: 1 bytes, line 298
298
299<script type="text/javascript" src="../Common/Widgets/articleWidgets.js?_=7.92.0"></script>
vendor: 1 bytes, line 299
299
300<script type="text/javascript" src="../Common/Widgets/TabularSearchResultsWidget.js?_=7.92.0"></script>
vendor: 1 bytes, line 300
300
301<script type="text/javascript" src="../Common/Widgets/SearchFilterWidget.js?_=7.92.0"></script>
vendor: 1 bytes, line 301
301
302<script type="text/javascript" src="../Common/Widgets/LoginWidget.js?_=7.92.0"></script>
vendor: 1 bytes, line 302
302
303<script type="text/javascript" src="../Common/Widgets/VideoWidget.js?_=7.92.0"></script>
vendor: 1 bytes, line 303
303
304<script type="text/javascript" src="../Common/Widgets/Tk3DDVWidget.js?_=7.92.0"></script>
vendor: 1 bytes, line 304
304
305<script type="text/javascript" src="../Common/Widgets/CalendarWidget.js?_=7.92.0"></script>
vendor: 1 bytes, line 305
305
306<script type="text/javascript" src="../Common/Widgets/twitterWidgets.js?_=7.92.0"></script>
vendor: 1 bytes, line 306
306
307<script type="text/javascript" src="../Common/Widgets/googleMapsWidget.js?_=7.92.0"></script>
vendor: 1 bytes, line 307
307
308<script type="text/javascript" src="../Common/Widgets/facebookSocialWidgets.js?_=7.92.0"></script>
vendor: 1 bytes, line 308
308
309<script type="text/javascript" src="../Common/Widgets/facebookEvent.js?_=7.92.0"></script>
vendor: 1 bytes, line 309
309
310<script type="text/javascript" src="../Common/Widgets/instagramFeedWebWidget.js?_=7.92.0"></script>
vendor: 1 bytes, line 310
310
311<script type="text/javascript"> 312function loadLocalPage() 313{ 314 315} 316 317var monthsOfYear = new Array(); 318monthsOfYear[ 0 ] = "Jan"; 319monthsOfYear[ 1 ] = "Feb"; 320monthsOfYear[ 2 ] = "Mar"; 321monthsOfYear[ 3 ] = "Apr"; 322monthsOfYear[ 4 ] = "May"; 323monthsOfYear[ 5 ] = "Jun"; 324monthsOfYear[ 6 ] = "Jul"; 325monthsOfYear[ 7 ] = "Aug"; 326monthsOfYear[ 8 ] = "Sep"; 327monthsOfYear[ 9 ] = "Oct"; 328monthsOfYear[ 10 ] = "Nov"; 329monthsOfYear[ 11 ] = "Dec"; 330var longMonthsOfYear = new Array(); 331longMonthsOfYear[ 0 ] = "January"; 332longMonthsOfYear[ 1 ] = "February"; 333longMonthsOfYear[ 2 ] = "March"; 334longMonthsOfYear[ 3 ] = "April"; 335longMonthsOfYear[ 4 ] = "May"; 336longMonthsOfYear[ 5 ] = "June"; 337longMonthsOfYear[ 6 ] = "July"; 338longMonthsOfYear[ 7 ] = "August"; 339longMonthsOfYear[ 8 ] = "September"; 340longMonthsOfYear[ 9 ] = "October"; 341longMonthsOfYear[ 10 ] = "November"; 342longMonthsOfYear[ 11 ] = "December"; 343var daysOfWeek = new Array(); 344daysOfWeek[ 0 ] = "Sun"; 345daysOfWeek[ 1 ] = "Mon"; 346daysOfWeek[ 2 ] = "Tue"; 347daysOfWeek[ 3 ] = "Wed"; 348daysOfWeek[ 4 ] = "Thu"; 349daysOfWeek[ 5 ] = "Fri"; 350daysOfWeek[ 6 ] = "Sat"; 351var longDaysOfWeek = new Array(); 352longDaysOfWeek[ 0 ] = "Sunday"; 353longDaysOfWeek[ 1 ] = "Monday"; 354longDaysOfWeek[ 2 ] = "Tuesday"; 355longDaysOfWeek[ 3 ] = "Wednesday"; 356longDaysOfWeek[ 4 ] = "Thursday"; 357longDaysOfWeek[ 5 ] = "Friday"; 358longDaysOfWeek[ 6 ] = "Saturday"; 359var timeIndicator = new Array(); 360timeIndicator[ 0 ] = "AM"; 361timeIndicator[ 1 ] = "PM"; 362var articleContext = { searchHeaders : [ "Id", "Object Type", "Type", "Category", "Name", "Description", "Short Description", "Start Date", "Start Date time", "Start Date date", "Start Date month", "Start Date year", "End Date", "On Sale Date", "Sales Status", "Availability", "Available Number", "Keywords", "Additional Info", "Group", "Image 1", "Image 2", "image1_alt_text", "image2_alt_text", "thumbnail", "Spotlight Image", "Data 1", "Data 2", "Data 3", "Data 4", "Data 5", "Data 6", "Data 7", "Data 8", "Data 9", "Data 10", "Data 11", "Data 12", "Data 13", "Data 14", "Data 15", "Data 16", "filter1", "filter2", "filter3", "filter4", "filter_parent1", "filter_child2", "filter_parent2", "filter_child1", "multifilter1", "multifilter2", "Organization Short Description", "Sales Type", "Options", "Street", "City", "Province / State", "Postal Code", "Country", "Longitude", "Latitude", "Venue ID", "Venue Name", "Venue Description", "Venue Short Description", "Venue Group", "Venue Data 1", "Venue Data 2", "Venue Data 3", "Venue Data 4", "Venue Data 5", "Venue Data 6", "Venue Data 7", "Venue Data 8", "Venue Data 9", "Venue Data 10", "Venue Data 11", "Venue Data 12", "Venue Type", "Series Name", "Minimum Price", "Maximum Price", "Upsell Article", "Add-on Article", "email", "e_address1", "e_address2", "e_address3", "customer_id", "tracking_code", "twitter_search_term", "external_reference_code", "access", "Venue Organization Id", "Meta Description", "next_gen_buy_flow", "" ], 363 searchNames : [ "id", "object_type", "type", "category", "name", "description", "short_description", "start_date", "start_date_time", "start_date_date", "start_date_month", "start_date_year", "end_date", "on_sale_date", "sales_status", "availability_status", "availability_num", "keywords", "additional_info", "group", "image1", "image2", "image1_alt_text", "image2_alt_text", "thumbnail", "app_image", "data1", "data2", "data3", "data4", "data5", "data6", "data7", "data8", "data9", "data10", "data11", "data12", "data13", "data14", "data15", "data16", "filter1", "filter2", "filter3", "filter4", "filter_parent1", "filter_child2", "filter_parent2", "filter_child1", "multifilter1", "multifilter2", "organization_short_description", "sales_type", "options", "street", "city", "state", "zip", "country", "longitude", "latitude", "venue_id", "venue_name", "venue_description", "venue_short_description", "venue_group", "venue_data1", "venue_data2", "venue_data3", "venue_data4", "venue_data5", "venue_data6", "venue_data7", "venue_data8", "venue_data9", "venue_data10", "venue_data11", "venue_data12", "venue_type", "series_name", "min_price", "max_price", "upsell_article_id", "addon_article_id", "email", "e_address1", "e_address2", "e_address3", "customer_id", "tracking_code", "twitter_search_term", "external_reference_code", "access", "organization_id", "meta_description", "next_gen_buy_flow", "" ], 364 searchResults : [ 365 [ "096A36EE-9FA5-4D6D-A543-910303F67BE4", "P", "Evening", "", "SVT 092626E", "To inquire about accessible seating options,
365please contact the Box Office at <a href=\"tel:18775717469\">877.571.7469<\/a> during regular business hours or email <a href=\"mailto:[email protected]?subject=Sasha%20Velour%3A%20TRAVESTY\">[email protected]<\/a>.", "Sasha Velour: TRAVESTY", "Sat Sep 26 2026 8:00 PM", "20:00", "26", "8", "2026", "", "", "S", "G", "297", "Drag performance,Mainstage,Sasha Velour", "", "", "", "", "", "", "", "", "", "", "Sasha Velour", "TRAVESTY", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "The Hanover Theatre", [], ["2","3","4","6"], "2 Southbridge St", "Worcester", "US-MA", "01608", "US", "", "", "C5614F1C-57AF-449F-B976-5E08BE109848", "The Hanover Theatre", "The Hanover Theatre - Permanent AA", "The Hanover Theatre", "The Hanover Theatre", "", "", "", "", "", "", "", "", "", "", "", "", "reserved", "2627 - Sasha Velour", "$29.00", "$59.00", "", "44915BB9-D34B-46B5-99C9-F6318C55C72F", "", "", "", "", "", "", "", "", "Public", "9B392185-7169-43D1-ADE2-4239D09A736F", "", "0", "" ] 366 ], 367 searchFilters : [ 368 { name : "object_type_filter", label : "Type Filter", className : "objectTypeFilterList", clearFilterLabel : "Clear Type Filter", selectedValue : "", values : [ ] }, 369 { name : "month_filter", label : "Month Filter", className : "monthFilterList", clearFilterLabel : "Clear Month Filter", selectedValue : "", values : [ ] }, 370 { name : "city_filter", label : "City Filter", className : "cityFilterList", clearFilterLabel : "Clear City Filter", selectedValue : "", values : [ ] }, 371 { name : "venue_filter", label : "Venue Filter", className : "venueFilterList", clearFilterLabel : "Clear Venue Filter", selectedValue : "", values : [ ] }, 372 { name : "category_filter", label : "Category Filter", className : "categoryFilterList", clearFilterLabel : "Clear Category Filter", selectedValue : "", values : [ ] }, 373 { name : "organization_short_description_filter", label : "Organization Filter", className : "organizationShortDescriptionFilterList", clearFilterLabel : "Clear Organization Filter", selectedValue : "", values : [ ] }, 374 { name : "filter1", label : "Class Types", className : "customFilterList", clearFilterLabel : "Clear Filter", selectedValue : "", values : [ ] }, 375 { name : "filter2", label : "Filter 2", className : "customFilterList", clearFilterLabel : "Clear Filter", selectedValue : "", values : [ ] }, 376 { name : "filter3", label : "Filter 3", className : "customFilterList", clearFilterLabel : "Clear Filter", selectedValue : "", values : [ ] }, 377 { name : "filter4", label : "Filter 4", className : "customFilterList", clearFilterLabel : "Clear Filter", selectedValue : "", values : [ ] }, 378 { name : "filter_parent1", label : "Filter Parent 1", className : "customFilterParentList", clearFilterLabel : "Clear Filter", selectedValue : "", values : [ ] }, 379 { name : "filter_parent2", label : "Filter Parent 2", className : "customFilterParentList", clearFilterLabel : "Clear Filter", selectedValue : "", values : [ ] }, 380 { name : "multifilter1", label : "Multi Filter 1", className : "customFilterList", clearFilterLabel : "Clear Filter", selectedValue : "", values : [ ] }, 381 { name : "multifilter2", label : "Multi Filter 2", className : "customFilterList", clearFilterLabel : "Clear Filter", selectedValue : "", values : [ ] } 382 ], 383 searchCalendarFilters : [ 384 { name : "calendar_days", label : "Calendar Days", className : "dayFilterList", clearFilterLabel : "Clear Day Filter", selectedValue : "", values : [ ["2026-09-26T00:00:00.000", "1"] ] }, 385 ], 386 performanceDays : [ 387 { name : "performance_days", label : "Performance Days", className : "dayFilterList", clearFilterLabel : "Clear Day Filter", selectedValue : "", values : [ ] }, 388 ], 389 searchLabels: { performances: "Events", date: "Date", unavailable_message: "Enter your promotional code to purchase.", sold_out_message: "Sold Out!", on_sale_message: "Public On Sale", to_be_determined_message: "", next: "»", previous: "«", next_month: "Next month", previous_month: "Previous month", avail_excellent: "Excellent", avail_good: "Good", avail_limited: "Limited", avail_sold_out: "Sold Out", no_results_message: "We\'re sorry, there are no events matching your search.", promo_item: "This item is available with a promo code", buy_seats_message: "Buy", buy_bundle_message: "Buy", buy_item_message: "Buy", pageNext: "Next", pagePrev: "Previous", buy_gift_message: "Donate", buy_storedvalueitem_message: "Buy", upsell_seats_message: "Upgrade", upsell_bundle_message: "Upgrade", upsell_item_message: "Upgrade", upsell_gift_message: "Upgrade", upsell_storedvalueitem_message: "Upgrade", upsell_popup_title: "", addon_seats_message: "Select", addon_bundle_message: "Select", addon_item_message: "Select", addon_gift_message: "Select", addon_storedvalueitem_message: "Select", exchange_seats_message: "Select", exchange_bundle_message: "Select", exchange_item_message: "Select", exchange_gift_message: "Select", exchange_storedvalueitem_message: "Select", describe_seats_message: "%action, %name, %datetime", describe_bundle_message: "%action, %name", describe_item_message: "%action, %name", describe_gift_message: "%action, %name", describe_storedvalueitem_message: "%action, %name", describe_article_message: "%action, %name", see_events_for_date: "See events for %m %d", select_your_time: "Please select your time", view_article_message: "View", price_title: "Price", pagination: "Pagination", availability_title: "Availability", active_promo_codes: "Active promotions:", promo_code_item_title: "This item is available with a promo code", has_promo_code: "false", brand_path: "../../content/images/branding/", clear_date_filter: "Clear Date Filter" }, 390 searchSUMO: { availability_access: "true", mapSelect_access: "true" }, 391 pagination: { current_page: "1", page_size: "20", total_pages: "1" }, 392 loginLabels: { pageTarget: "maintainAccount.asp", loginBoxClass: "login-required", forgotPassword: "true", formLoginName: "", accountLogin: "true" }, 393 contextId: "", 394 articleId: "682F8C41-1D0A-4CB9-9FC4-B0A747940EA3", 395 articleSearchId: "", 396 salesType: "P", 397 sToken: "1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs="}; 398 399createSearchMapping(articleContext); 400 401tsAddReadyEvent(function() { 402 setCalendarWidgetDisplayMonth(); 403 drawWidgets(articleContext); 404 insertToken(articleContext); 405}); 406 407function setCalendarWidgetDisplayMonth() 408{ 409 // If a date has been selected from the calendar widget, we will receive a 'search_from' parameter. 410 // Pass this back to the widget so that it redisplays the month that was previously visible 411 412} 413 414</script>
414 415
416<script type="text/javascript"> 417 function doGAClicks(selectedItem) { 418 _gaq.push(['_trackEvent', selectedItem, 'Clicked']); 419 }; 420 421 function gaTrackEvent(category, action) { 422 _gaq.push(['_trackEvent', category, action]); 423 }; 424</script>
424 425
426<script type="text/javascript"> 427 var _gaq = _gaq || []; 428 _gaq.push(['obj0._setAccount', 'UA-3128084-2']); 429_gaq.push(['obj0._setAllowHash', false]); 430_gaq.push(['obj0._setDomainName', 'none']); 431_gaq.push(['obj0._setAllowLinker',true]); 432_gaq.push(['obj0._trackPageview']); 433 434</script>
434 435
436<script type="text/javascript"> 437 (function () { 438 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.defer = true; 439 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 440 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 441 })(); 442</script>
442 443 444</head> 445 446<body lang="en" onLoad="startList();loadLocalPage(); displayMessage(""); displayOnOfferTimeout();" onUnload="closeChildren()"> 447<div id="spinner" class="spinner"></div>
448<script> 449 var spinnerDelayTimeout; 450 451 var showSpinner = function(){}; 452 var spinnerElement = document.querySelector("body") 453 454 function skipToMain() { 455 let mainSection = document.querySelector("[role=\"main\"]"); 456 if (!mainSection) { 457 mainSection = document.getElementById("content"); 458 } 459 mainSection.tabIndex = -1; // Required for focus to work on a div 460 mainSection.focus(); 461 } 462 463 464 var spinnerDelay = 3; 465 466 467 function stopSpinner() { 468 spinnerElement.classList.remove('show-spinner'); 469 cancelSpinnerTimeouts(); 470 expandSpinner(); 471 } 472 473 function startSpinner() { 474 expandSpinner(); 475 spinnerElement.classList.add('show-spinner'); 476 } 477 478 479 function cancelSpinnerTimeouts() { 480 clearTimeout(spinnerDelayTimeout); 481 } 482 483 function expandSpinner() { 484 spinnerElement.classList.remove('minimize-spinner'); 485 } 486 487 function minimizeSpinner() { 488 spinnerElement.classList.add('minimize-spinner'); 489 } 490 491 // stop spinner if a JS error occurred 492 window.addEventListener('error', stopSpinner); 493 494 // Mimimize spinner if clicked 495 spinnerElement.addEventListener('click', minimizeSpinner); 496 497 // Shows the spinner if page takes long to load 498 // pass true to allow spinner to show even with a popup open 499 (showSpinner = function() { 500 var overridePopupCheck = arguments[0] ? arguments[0] : false; 501 if (overridePopupCheck || !document.querySelector("#popupDiv")) { 502 spinnerDelayTimeout = setTimeout(startSpinner, spinnerDelay*1000); 503 } 504 return true; 505 })(); 506 507 508 509</script>
509 510 511
512<script type="text/javascript"> 513 514/** 515 * Returns the unique values for a given property from an array of items. 516 * If there is only one unique value, returns that value directly. 517 * If there are multiple unique values, returns an array of those values. 518 * 519 * @param {Array} items - The array of objects to extract unique values from. 520 * @param {string} propertyToGet - The property name to extract unique values for. 521 * @returns {Array|any} An array of unique values if more than one exists, otherwise the single unique value. 522 */ 523const getUniqueValues = (items, propertyToGet) => { 524 if (!items || !Array.isArray(items) || items.length === 0) { 525 return []; 526 } 527 const uniquesList = [...new Set(items.map(item => item[propertyToGet]))] 528 return uniquesList.length > 1 ? uniquesList : uniquesList[0]; 529}; 530 531/** 532* Decodes a string containing numeric HTML entities (e.g., ó -> ó). 533* @param {string} encodedText - The string to decode. 534* @returns {string} The decoded (clean) string. 535*/ 536function decodeHtmlEntities(encodedText) { 537 if (typeof encodedText !== 'string' || !encodedText) return ""; 538 var textarea = document.createElement('textarea'); 539 textarea.innerHTML = encodedText; 540 return textarea.value; 541} 542 543/** 544* Normalizes a string for GTM: converts it to lowercase and replaces spaces with underscores. 545* Example: "Palco/Platea VR" -> "palco/platea_vr" 546* @param {string} str - The string to normalize. 547* @returns {string} The normalized string. 548*/ 549function tsNormalizeGtmString(value) { 550 if (value == null || typeof value === 'undefined' || value === "") 551 { 552 return ""; 553 } 554 const str = value.toString(); 555 const decodedStr = decodeHtmlEntities(str); 556 return decodedStr.toLowerCase().replace(/\s+/g, '_'); 557} 558 559/** 560* Normalizes a string/Array for GTM: converts it to lowercase and replaces spaces with underscores. 561* Example: "Palco/Platea VR" -> "palco/platea_vr" 562* Example: ["Palco","Platea VR"] -> ["palco","platea_vr"] 563* @param {string|string[]}str - The string/array to normalize. 564* @returns {string|string[]} The normalized data. 565*/ 566function tsNormalizeGtmData(data) { 567 if (Array.isArray(data)) { 568 return data.map(item => tsNormalizeGtmString(item)); 569 } 570 571 return tsNormalizeGtmString(data); 572} 573 574/** 575 * Takes an array of admission objects and performs the following steps: 576 * 1. Normalizes the string fields (price_type, section, promotion, price_zone) to lowercase and replaces spaces with underscores. 577 * 2. Groups admissions that share the same item_id, price, price_type, price_zone, promotion, and section. 578 * 3. Increments the quantity for grouped items. 579 * 4. Returns an array of unique admissions, each with a quantity and value (quantity * price). 580 * 581 * @param {Array<Object>} admissions - The array of admission objects to normalize and group. 582 * @returns {Array<Object>} An array of grouped and normalized admission objects, each with quantity and value. 583 */ 584const normalizeAndGroupAdmissions = (admissions) => { 585 if (!admissions || !Array.isArray(admissions)) { 586 return []; 587 } 588 return admissions 589 .map(item => ({ 590 ...item, 591 item_name: tsNormalizeGtmData(item.item_name), 592 price_type: tsNormalizeGtmData(item.price_type), 593 section: tsNormalizeGtmData(item.section), 594 promotion: tsNormalizeGtmData(item.promotion), 595 price_zone: tsNormalizeGtmData(item.price_zone), 596 })) 597 .reduce((acc, item) => { 598 // Group items that have the same performance id, price, price_type, price_zone, promotion and section 599 const key = [item.item_id, item.price, item.price_type, item.price_zone, item.promotion, item.section].join('|'); 600 601 const found = acc.find(i => i._groupKey === key); 602 603 if (found) found.quantity += 1 604 else acc.push({ ...item, quantity: item.quantity ?? 1, _groupKey: key }); 605 606 return acc; 607 }, []) 608 .map(({ _groupKey, quantity, price, ...rest }) => ({ 609 ...rest, 610 quantity, 611 price, 612 value: quantity * price 613 })); // Remove the internal _groupKey property 614} 615 616/** 617 * Generates an object for the data layer representing a single performance for ecommerce tracking. 618 * 619 * @param {Object} performanceData - The performance data object. Should contain: 620 * - item_id: {string} Unique identifier for the performance. 621 * - show: {string} Name of the show. 622 * - performance_date: {string} Date of the performance. 623 * - availability: {string|number} Number of available seats. 624 * - availability_default: {string|number} Total number of seats. 625 * - booking_type_default: {string} Default booking type ("seatmap" or "bestseat"). 626 * @param {string} booking_type - The booking type for the performance. 627 * @returns {Object} An object formatted for the data layer, including: 628 * - items: {Array<Object>} Array with a single item containing performance details. 629 * - show: {string} Name of the show. 630 * - performance_date: {string} Date of the performance. 631 * - availability: {string|number} Number of available seats. 632 * - availability_default: {string|number} Total number of seats. 633 * - booking_type: {string} Booking type. 634 * - booking_type_default: {string} Default booking type. 635 * - referrer_code: {string} Referrer code from the session.
636 * Returns an empty object if performanceData is invalid or an error occurs. 637 */ 638function getPerformanceEcommerceObject(performanceData, booking_type) { 639 try { 640 let dataLayerObject = {}; 641 642 if (performanceData && performanceData.item_id) { 643 const { item_id, show, performance_date, availability, availability_default, booking_type_default } = performanceData; 644 const session = getSessionObject() 645 dataLayerObject = { 646 items: [ 647 { 648 item_id, 649 item_name: tsNormalizeGtmData(show), 650 performance_date, 651 availability, 652 availability_default, 653 booking_type, 654 booking_type_default 655 } 656 ], 657 show: tsNormalizeGtmData(show), 658 performance_date, 659 availability, 660 availability_default, 661 booking_type, 662 booking_type_default, 663 referrer_code: session.av.session.referrer 664 } 665 } 666 return dataLayerObject; 667 } catch (error) { 668 console.error("There was an issue getting the view item object", error); 669 return {}; 670 } 671} 672 673/** 674 * Returns a formatted and grouped list of admissions currently in the cart. 675 * 676 * @returns {Array<Object>} Array of grouped and formatted admission objects, each with a quantity. 677 */ 678function getAdmissionsInCartList() { 679 const admissions = []; 680 return normalizeAndGroupAdmissions(admissions) 681} 682 683/** 684 * Returns a formatted and grouped list of admissions currently in the created order. 685 * 686 * @returns {Array<Object>} Array of grouped and formatted admission objects, each with a quantity. 687 */ 688function getAdmissionsInOrderList() { 689 const admissions = []; 690 return normalizeAndGroupAdmissions(admissions) 691} 692 693/** 694 * Collects and formats information about the current session and the admissions (cart items) 695 * in the user's cart. It aggregates unique values for key properties (such as show, performance date, price zone, etc.) 696 * and includes session-specific data like timeout and referrer code. 697 * 698 * @returns {Object} An object with the following properties: 699 * - items: {Array<Object>} The list of admissions currently in the cart, grouped and formatted. 700 * - show: {string|Array<string>} Unique show names in the cart. 701 * - performance_date: {string|Array<string>} Unique performance dates in the cart. 702 * - price_zone: {string|Array<string>} Unique price zones in the cart. 703 * - promotion: {string|Array<string>} Unique promotions in the cart. 704 * - availability: {string|Array<string>} Unique availability statuses in the cart. 705 * - availability_default: {string|Array<string>} Unique default availability values. 706 * - booking_type_default: {string} The default booking type for the cart items. 707 * - price_type: {string|Array<string>} Unique price types in the cart. 708 * - section: {string|Array<string>} Unique sections in the cart. 709 * - timeout: {string} The offer timeout value from the session. 710 * - referrer_code: {string} The referrer code from the session. 711 */ 712function getEcommerceObject(type = "cart") { 713 try { 714 // type can only be "cart" or "order" 715 if (!["cart", "order"].includes(type)) { 716 throw new Error("Invalid type provided. Expected 'cart' or 'order'."); 717 } 718 719 720 721 const typeMap = { 722 cart: getAdmissionsInCartList(), 723 order: getAdmissionsInOrderList() 724 } 725 726 const session = getSessionObject() 727 const admissions = typeMap[type] 728 const value = "0" 729 730 let dataLayerObj = { 731 items: admissions, 732 show: getUniqueValues(admissions, "item_name"), 733 performance_date: getUniqueValues(admissions, "performance_date"), 734 price_zone: getUniqueValues(admissions, "price_zone"), 735 promotion: getUniqueValues(admissions, "promotion"), 736 availability: getUniqueValues(admissions, "availability"), 737 availability_default: getUniqueValues(admissions, "availability_default"), 738 price_type: getUniqueValues(admissions, "price_type"), 739 section: getUniqueValues(admissions, "section"), 740 timeout: "+15m", 741 referrer_code: session.av.session.referrer, 742 currency: admissions.length > 0 ? admissions[0].currency : "", 743 quantity: admissions.reduce((total, item) => total + item.quantity, 0), 744 value: parseFloat(value.replace(",",".")), 745 } 746 747 // If the order has been placed, add additional order-related properties 748 749 750 return dataLayerObj 751 } catch (error) { 752 console.error("There was an issue getting the ecommerce object", error); 753 } 754} 755 756function testValue(value, pattern) 757{ 758 if(!value || !pattern) 759 return false;
760 761 if(pattern.constructor === RegExp) 762 return pattern.test(value.toString()); 763 764 return value.toString() == pattern.toString(); 765} 766 767function isGTM() 768{ 769 return true; 770} 771 772function getSessionObject() 773{ 774 return {av: {session: {language: "EN", 775role: "THT - Internet", 776referrer: null, 777user_id: undefined, 778customer_id: null, 779promo_codes: []}}}; 780} 781 782function getErrorObject() 783{ 784 785 return null; 786 787} 788 789function getPageObject() 790{ 791 return {av: {page: { page_script: "/Online/default.asp", 792 search: { total_records: null, 793 total_pages: null, 794 page_size: null, 795 current_page: null, 796 criteria: { search_from :null, 797 search_to :null, 798 search_criteria :null, 799 category_filter :null, 800 city_filter :null, 801 venue_filter :null, 802 month_filter :null, 803 object_type_filter :null}}, 804 articles: [{article_name: "2627 - Sasha Velour: Travesty", article_title: "Sasha Velour: TRAVESTY", article_type: "2", article_id: "682F8C41-1D0A-4CB9-9FC4-B0A747940EA3"}, 805{article_name: "", article_title: "Login", article_type: "1", article_id: "6BA1D18A-662D-4D54-A903-B98643CA73B5"}, 806{article_name: "", article_title: "Instructions", article_type: "1", article_id: "341FC15D-0E7B-4C27-86C7-5FBA7FA8F7CC"}, 807{article_name: "", article_title: "default header", article_type: "1", article_id: "F8103D8C-7EA0-4B4B-A37E-9DE398B9313D"}, 808{article_name: "", article_title: "default footer", article_type: "1", article_id: "5D09622E-A899-411D-B525-B2F262B34B63"}], 809 810 articleExists: function (article_type, article_title) 811 { 812 if (article_type == null && article_title == null) 813 { 814 if(this.articles.length) 815 return true; 816 } 817 else if (article_type == null) 818 { 819 for(var i = 0; i < this.articles.length; i++) { 820 if(testValue(this.articles[i].article_title, article_title)) 821 return true; 822 } 823 } 824 else if (article_title == null) 825 { 826 for(var i = 0; i < this.articles.length; i++) { 827 if (testValue(this.articles[i].article_type, article_type)) 828 return true; 829 } 830 } 831 else 832 { 833 for(var i = 0; i < this.articles.length; i++) { 834 if (testValue(this.articles[i].article_title, article_title) && testValue(this.articles[i].article_type, article_type)) 835 return true; 836 } 837 } 838 839 return false; 840 } 841 }}}; 842} 843 844 845function getOrderEventObject() 846{ 847 return {event: {av: {event: {order: {action: "" }}}, toString: function () { return "av.event.order-" + this.av.event.order.action;}}}; 848} 849 850function getCartEventObject() 851{ 852 return {event: {av: {event: {cart: {action: "" }}}, toString: function () { return "av.event.cart-" + this.av.event.cart.action;}}}; 853} 854 855function admissionExists(object, product_name) 856{ 857 var ids = new Array(); 858 for (var i = 0; i < object.performances.length; i++) 859 { 860 if (testValue(object.performances[i].name, product_name) || 861 testValue(object.performances[i].description, product_name) || 862 testValue(object.performances[i].short_description, product_name)) 863 { 864 ids.push(object.performances[i].performance_id); 865 } 866 } 867 if (ids.length > 0) 868 { 869 for (var i = 0; i < object.order_admissions.length; i++) 870 { 871 if (ids.indexOf(object.order_admissions[i].performance_id) != -1) 872 { 873 return true; 874 } 875 } 876 } 877 return false; 878} 879 880function bundleExists(object, product_name) 881{ 882 var ids = new Array(); 883 for (var i = 0; i < object.bundles.length; i++) 884 { 885 if (testValue(object.bundles[i].name, product_name) || 886 testValue(object.bundles[i].description, product_name) || 887 testValue(object.bundles[i].short_description, product_name)) 888 { 889 ids.push(object.bundles[i].bundle_id); 890 } 891 } 892 if (ids.length > 0) 893 { 894 for (var i = 0; i < object.order_bundle.length; i++) 895 { 896 if (ids.indexOf(object.order_bundle[i].bundle_id) != -1) 897 { 898 return true; 899 } 900 } 901 } 902 return false; 903} 904 905function miscItemExists(object, product_name) 906{ 907 var ids = new Array(); 908 for (var i = 0; i < object.misc_items.length; i++) 909 { 910 if (testValue(object.misc_items[i].name, product_name) || 911 testValue(object.misc_items[i].description, product_name) || 912 testValue(object.misc_items[i].short_description, product_name)) 913 { 914 ids.push(object.misc_items[i].miscellaneous_item_id); 915 } 916 } 917 if (ids.length > 0) 918 { 919 for (var i = 0; i < object.order_misc_items.length; i++) 920 { 921 if (ids.indexOf(object.order_misc_items[i].item_id) != -1) 922 { 923 return true; 924 } 925 } 926 } 927 return false;
928} 929 930function giftExists(object, product_name) 931{ 932 var ids = new Array(); 933 for (var i = 0; i < object.gifts.length; i++) 934 { 935 if (testValue(object.gifts[i].name, product_name) || 936 testValue(object.gifts[i].description, product_name) || 937 testValue(object.gifts[i].short_description, product_name)) 938 { 939 ids.push(object.gifts[i].gift_id); 940 } 941 } 942 if (ids.length > 0) 943 { 944 for (var i = 0; i < object.order_gifts.length; i++) 945 { 946 if (ids.indexOf(object.order_gifts[i].gift_id) != -1) 947 { 948 return true; 949 } 950 } 951 } 952 return false; 953} 954 955function storeValueExists(object, product_name) 956{ 957 var ids = new Array(); 958 for (var i = 0; i < object.stored_values.length; i++) 959 { 960 if (testValue(object.stored_values[i].name, product_name) || 961 testValue(object.stored_values[i].description, product_name) || 962 testValue(object.stored_values[i].short_description, product_name)) 963 { 964 ids.push(object.stored_values[i].stored_value_id); 965 } 966 } 967 if (ids.length > 0) 968 { 969 for (var i = 0; i < object.order_stored_values.length; i++) 970 { 971 if (ids.indexOf(object.order_stored_values[i].stored_value_id) != -1) 972 { 973 return true; 974 } 975 } 976 } 977 return false; 978} 979 980function productExists(object, product_type, product_name) 981{ 982 var result = false;
983 if (product_name == null && product_type == null) 984 { 985 if (object.order_admissions.length || object.order_bundle.length || object.order_misc_items.length || 986 object.order_gifts.length || object.order_stored_values.length) 987 result = true; 988 } 989 else if (product_name == null) 990 { 991 if (testValue(product_type, "admission") && object.order_admissions.length) 992 result = true; 993 if (testValue(product_type, "bundle") && object.order_bundle.length) 994 result = true; 995 if (testValue(product_type, "miscellaneous_item") && object.order_misc_items.length) 996 result = true; 997 if (testValue(product_type, "gift") && object.order_gifts.length) 998 result = true; 999 if (testValue(product_type, "stored_value") && object.order_stored_values.length) 1000 result = true; 1001 } 1002 else if (product_type == null) 1003 { 1004 if (object.order_admissions.length) 1005 { 1006 result = admissionExists(object, product_name); 1007 } 1008 if (object.order_bundle.length) 1009 { 1010 result = bundleExists(object, product_name); 1011 } 1012 if (object.order_misc_items.length) 1013 { 1014 result = miscItemExists(object, product_name); 1015 } 1016 if (object.order_gifts.length) 1017 { 1018 result = giftExists(object, product_name); 1019 } 1020 if (object.order_stored_values.length) 1021 { 1022 result = storeValueExists(object, product_name); 1023 } 1024 } 1025 else 1026 { 1027 if (testValue(product_type, "admission") && object.order_admissions.length) 1028 { 1029 result = admissionExists(object, product_name); 1030 } 1031 if (testValue(product_type, "bundle") && object.bundles.length) 1032 { 1033 result = bundleExists(object, product_name); 1034 } 1035 if (testValue(product_type, "miscellaneous_item") && object.misc_items.length) 1036 { 1037 result = miscItemExists(object, product_name); 1038 } 1039 if (testValue(product_type, "gift") && object.gifts.length) 1040 { 1041 result = giftExists(object, product_name); 1042 } 1043 if (testValue(product_type, "stored_value") && object.stored_values.length) 1044 { 1045 result = storeValueExists(object, product_name); 1046 } 1047 } 1048 return result; 1049} 1050 1051function admissionValue(object, product_name) 1052{ 1053 var id = new Array(); 1054 var result = 0; 1055 for (var i = 0; i < object.performances.length; i++) 1056 { 1057 if (testValue(object.performances[i].name, product_name) || 1058 testValue(object.performances[i].description, product_name) || 1059 testValue(object.performances[i].short_description, product_name)) 1060 { 1061 id.push(object.performances[i].performance_id); 1062 } 1063 } 1064 if (id.length > 0) 1065 { 1066 for (var i = 0; i < object.order_admissions.length; i++) 1067 { 1068 if (id.indexOf(object.order_admissions[i].performance_id) != -1) 1069 { 1070 result += object.order_admissions[i].amount.amount; 1071 } 1072 } 1073 } 1074 return result; 1075} 1076 1077function bundleValue(object, product_name) 1078{ 1079 var id = new Array(); 1080 var result = 0; 1081 for (var i = 0; i < object.bundles.length; i++) 1082 { 1083 if (testValue(object.bundles[i].name, product_name) || 1084 testValue(object.bundles[i].description, product_name) || 1085 testValue(object.bundles[i].short_description, product_name)) 1086 { 1087 id.push(object.bundles[i].bundle_id); 1088 } 1089 } 1090 if (id.length > 0) 1091 { 1092 for (var i = 0; i < object.order_bundle_admissions.length; i++) 1093 { 1094 if (id.indexOf(object.order_bundle_admissions[i].bundle_id) != -1) 1095 { 1096 result += object.order_bundle_admissions[i].amount.amount; 1097 } 1098 } 1099 } 1100 return result; 1101} 1102 1103function miscItemValue(object, product_name) 1104{ 1105 var id = new Array(); 1106 var result = 0; 1107 for (var i = 0; i < object.misc_items.length; i++) 1108 { 1109 if (testValue(object.misc_items[i].name, product_name) || 1110 testValue(object.misc_items[i].description, product_name) || 1111 testValue(object.misc_items[i].short_description, product_name)) 1112 { 1113 id.push(object.misc_items[i].miscellaneous_item_id); 1114 } 1115 } 1116 if (id.length > 0) 1117 { 1118 for (var i = 0; i < object.order_misc_items.length; i++) 1119 { 1120 if (id.indexOf(object.order_misc_items[i].item_id) != -1) 1121 { 1122 result += object.order_misc_items[i].amount.amount; 1123 } 1124 } 1125 } 1126 return result; 1127} 1128 1129function giftValue(object, product_name) 1130{ 1131 var id = new Array(); 1132 var result = 0; 1133 for (var i = 0; i < object.gifts.length; i++) 1134 { 1135 if (testValue(object.gifts[i].name, product_name) || 1136 testValue(object.gifts[i].description, product_name) || 1137 testValue(object.gifts[i].short_description, product_name)) 1138 {
1139 id.push(object.gifts[i].gift_id); 1140 } 1141 } 1142 if (id.length > 0) 1143 { 1144 for (var i = 0; i < object.order_gifts.length; i++) 1145 { 1146 if (id.indexOf(object.order_gifts[i].gift_id) != -1) 1147 { 1148 result += object.order_gifts[i].pledge_amount.amount; 1149 } 1150 } 1151 } 1152 return result; 1153} 1154 1155function storedValueValue(object, product_name) 1156{ 1157 var id = new Array(); 1158 var result = 0; 1159 for (var i = 0; i < object.stored_values.length; i++) 1160 { 1161 if (testValue(object.stored_values[i].name, product_name) || 1162 testValue(object.stored_values[i].description, product_name) || 1163 testValue(object.stored_values[i].short_description, product_name)) 1164 { 1165 id.push(object.stored_values[i].stored_value_id); 1166 } 1167 } 1168 if (id.length > 0) 1169 { 1170 for (var i = 0; i < object.order_stored_values.length; i++) 1171 { 1172 if (id.indexOf(object.order_stored_values[i].stored_value_id) != -1) 1173 { 1174 result += object.order_stored_values[i].amount.amount; 1175 } 1176 } 1177 } 1178 return result; 1179} 1180 1181function productValue(object, product_type, product_name) 1182{ 1183 var result = 0; 1184 if (product_name == null && product_type == null) 1185 { 1186 if (object.order_admissions.length) 1187 { 1188 for (var i = 0; i < object.order_admissions.length; i++) 1189 { 1190 result += object.order_admissions[i].amount.amount; 1191 } 1192 } 1193 if (object.order_bundle_admissions.length) 1194 { 1195 for (var i = 0; i < object.order_bundle_admissions.length; i++) 1196 { 1197 result += object.order_bundle_admissions[i].amount.amount; 1198 } 1199 } 1200 if (object.order_misc_items.length) 1201 { 1202 for (var i = 0; i < object.order_misc_items.length; i++) 1203 { 1204 result += object.order_misc_items[i].amount.amount; 1205 } 1206 } 1207 if (object.order_gifts.length) 1208 { 1209 for (var i = 0; i < object.order_gifts.length; i++) 1210 { 1211 result += object.order_gifts[i].pledge_amount.amount; 1212 } 1213 } 1214 if (object.order_stored_values.length) 1215 { 1216 for (var i = 0; i < object.order_stored_values.length; i++) 1217 { 1218 result += object.order_stored_values[i].amount.amount; 1219 } 1220 } 1221 } 1222 else if (product_name == null) 1223 { 1224 if (testValue(product_type, "admission") && object.order_admissions.length) 1225 { 1226 for (var i = 0; i < object.order_admissions.length; i++) 1227 { 1228 result += object.order_admissions[i].amount.amount; 1229 } 1230 } 1231 if (testValue(product_type, "bundle") && object.order_bundle_admissions.length) 1232 { 1233 for (var i = 0; i < object.order_bundle_admissions.length; i++) 1234 { 1235 result += object.order_bundle_admissions[i].amount.amount; 1236 } 1237 } 1238 if (testValue(product_type, "miscellaneous_item") && object.order_misc_items.length) 1239 { 1240 for (var i = 0; i < object.order_misc_items.length; i++) 1241 { 1242 result += object.order_misc_items[i].amount.amount; 1243 } 1244 } 1245 if (testValue(product_type, "gift") && object.order_gifts.length) 1246 { 1247 for (var i = 0; i < object.order_gifts.length; i++) 1248 { 1249 result += object.order_gifts[i].pledge_amount.amount; 1250 } 1251 } 1252 if (testValue(product_type, "stored_value") && object.order_stored_values.length) 1253 { 1254 for (var i = 0; i < object.order_stored_values.length; i++) 1255 { 1256 result += object.order_stored_values[i].amount.amount; 1257 } 1258 } 1259 } 1260 else if (product_type == null) 1261 { 1262 if (object.order_admissions.length) 1263 { 1264 result += admissionValue(object, product_name); 1265 } 1266 if (object.order_bundle_admissions.length) 1267 { 1268 result += bundleValue(object, product_name); 1269 } 1270 if (object.order_misc_items.length) 1271 { 1272 result += miscItemValue(object, product_name); 1273 } 1274 if (object.order_gifts.length) 1275 { 1276 result += giftValue(object, product_name); 1277 } 1278 if (object.order_stored_values.length) 1279 { 1280 result += storedValueValue(object, product_name); 1281 } 1282 } 1283 else 1284 { 1285 if (testValue(product_type, "admission") && object.order_admissions.length) 1286 { 1287 result += admissionValue(object, product_name); 1288 } 1289 else if (testValue(product_type, "bundle") && object.bundles.length) 1290 { 1291 result += bundleValue(object, product_name); 1292 } 1293 else if (testValue(product_type, "miscellaneous_item") && object.misc_items.length) 1294 { 1295 result += miscItemValue(object, product_name); 1296 } 1297 else if (testValue(product_type, "gift") && object.gifts.length) 1298 { 1299 result += giftValue(object, product_name); 1300 } 1301 else if (testValue(product_type, "stored_value") && object.stored_values.length) 1302 { 1303 result += storedValueValue(object, product_name); 1304 } 1305 } 1306 return result; 1307} 1308 1309function admissionCount(object, product_name) 1310{ 1311 var id = new Array(); 1312 var result = 0; 1313 for (var i = 0; i < object.performances.length; i++) 1314 { 1315 if (testValue(object.performances[i].name, product_name) || 1316 testValue(object.performances[i].description, product_name) || 1317 testValue(object.performances[i].short_description, product_name)) 1318 { 1319 id.push(object.performances[i].performance_id); 1320 } 1321 } 1322 if (id.length > 0) 1323 { 1324 for (var i = 0; i < object.order_admissions.length; i++) 1325 { 1326 if (id.indexOf(object.order_admissions[i].performance_id) != -1) 1327 { 1328 result ++; 1329 } 1330 } 1331 } 1332 return result; 1333} 1334 1335function bundleCount(object, product_name) 1336{ 1337 var id = new Array(); 1338 var result = 0; 1339 for (var i = 0; i < object.bundles.length; i++) 1340 { 1341 if (testValue(object.bundles[i].name, product_name) || 1342 testValue(object.bundles[i].description, product_name) || 1343 testValue(object.bundles[i].short_description, product_name)) 1344 { 1345 id.push(object.bundles[i].bundle_id); 1346 } 1347 } 1348 if (id.length > 0 && object.order_bundle_admissions.length) 1349 { 1350 for (var i = 0; i < object.order_bundle_admissions.length; i++) 1351 { 1352 if (id.indexOf(object.order_bundle_admissions[i].bundle_id) != -1) 1353 { 1354 result ++; 1355 } 1356 } 1357 } 1358 return result; 1359} 1360 1361function miscItemCount(object, product_name) 1362{ 1363 var id = new Array(); 1364 var result = 0; 1365 for (var i = 0; i < object.misc_items.length; i++) 1366 { 1367 if (testValue(object.misc_items[i].name, product_name) || 1368 testValue(object.misc_items[i].description, product_name) || 1369 testValue(object.misc_items[i].short_description, product_name)) 1370 { 1371 id.push(object.misc_items[i].miscellaneous_item_id); 1372 } 1373 } 1374 if (id.length > 0 && object.order_misc_items.length) 1375 { 1376 for (var i = 0; i < object.order_misc_items.length; i++) 1377 { 1378 if (id.indexOf(object.order_misc_items[i].item_id) != -1) 1379 { 1380 result += parseFloat(object.order_misc_items[i].quantity); 1381 } 1382 } 1383 } 1384 return result; 1385} 1386 1387function giftCount(object, product_name) 1388{ 1389 var id = new Array(); 1390 var result = 0; 1391 for (var i = 0; i < object.gifts.length; i++) 1392 { 1393 if (testValue(object.gifts[i].name, product_name) || 1394 testValue(object.gifts[i].description, product_name) || 1395 testValue(object.gifts[i].short_description, product_name)) 1396 {
1397 id.push(object.gifts[i].gift_id); 1398 } 1399 } 1400 if (id.length > 0) 1401 { 1402 for (var i = 0; i < object.order_gifts.length; i++) 1403 { 1404 if (id.indexOf(object.order_gifts[i].gift_id) != -1) 1405 { 1406 result ++; 1407 } 1408 } 1409 } 1410 return result; 1411} 1412 1413function storedValueCount(object, product_name) 1414{ 1415 var id = new Array(); 1416 var result = 0; 1417 for (var i = 0; i < object.stored_values.length; i++) 1418 { 1419 if (testValue(object.stored_values[i].name, product_name) || 1420 testValue(object.stored_values[i].description, product_name) || 1421 testValue(object.stored_values[i].short_description, product_name)) 1422 { 1423 id.push(object.stored_values[i].stored_value_id); 1424 } 1425 } 1426 if (id.length > 0) 1427 { 1428 for (var i = 0; i < object.order_stored_values.length; i++) 1429 { 1430 if (id.indexOf(object.order_stored_values[i].stored_value_id) != -1) 1431 { 1432 result ++; 1433 } 1434 } 1435 } 1436 return result; 1437} 1438 1439function productCount(object, product_type, product_name) 1440{ 1441 var result = 0; 1442 if (product_name == null && product_type == null) 1443 { 1444 if (object.order_admissions.length) 1445 { 1446 result += object.order_admissions.length; 1447 } 1448 if (object.order_bundle_admissions.length) 1449 { 1450 result += object.order_bundle_admissions.length; 1451 } 1452 if (object.order_misc_items.length) 1453 { 1454 for (var i = 0; i < object.order_misc_items.length; i++) 1455 result += parseFloat(object.order_misc_items[i].quantity); 1456 } 1457 if (object.order_gifts.length) 1458 { 1459 result += object.order_gifts.length; 1460 } 1461 if (object.order_stored_values.length) 1462 { 1463 result += object.order_stored_values.length; 1464 } 1465 } 1466 else if (product_name == null) 1467 { 1468 if (testValue(product_type, "admission") && object.order_admissions.length) 1469 { 1470 result += object.order_admissions.length; 1471 } 1472 if (testValue(product_type, "bundle") && object.order_bundle_admissions.length) 1473 { 1474 result += object.order_bundle_admissions.length; 1475 } 1476 if (testValue(product_type, "miscellaneous_item") && object.order_misc_items.length) 1477 { 1478 for (var i = 0; i < object.order_misc_items.length; i++) 1479 result += parseFloat(object.order_misc_items[i].quantity); 1480 } 1481 if (testValue(product_type, "gift") && object.order_gifts.length) 1482 { 1483 result += object.order_gifts.length; 1484 } 1485 if (testValue(product_type, "stored_value") && object.order_stored_values.length) 1486 { 1487 result += object.order_stored_values.length; 1488 } 1489 } 1490 else if (product_type == null) 1491 { 1492 if (object.order_admissions.length) 1493 { 1494 result += admissionCount(object, product_name); 1495 } 1496 if (object.order_bundle_admissions.length) 1497 { 1498 result += bundleCount(object, product_name); 1499 } 1500 if (object.order_misc_items.length) 1501 { 1502 result += miscItemCount(object, product_name); 1503 } 1504 if (object.order_gifts.length) 1505 { 1506 result += giftCount(object, product_name); 1507 } 1508 if (object.stored_values.length) 1509 { 1510 result += storedValueCount(object, product_name); 1511 } 1512 } 1513 else 1514 { 1515 if (testValue(product_type, "admission") && object.order_admissions.length) 1516 { 1517 result += admissionCount(object, product_name); 1518 } 1519 if (testValue(product_type, "bundle") && object.order_bundle_admissions.length) 1520 { 1521 result += bundleCount(object, product_name); 1522 } 1523 if (testValue(product_type, "miscellaneous_item") && object.order_misc_items.length) 1524 { 1525 result += miscItemCount(object, product_name); 1526 } 1527 if (testValue(product_type, "gift") && object.order_gifts.length) 1528 { 1529 result += giftCount(object, product_name); 1530 } 1531 if (testValue(product_type, "stored_value") && object.order_stored_values.length) 1532 { 1533 result += storedValueCount(object, product_name); 1534 } 1535 } 1536 return result; 1537} 1538 1539function getPerformance(object, performance_id) 1540{ 1541 var result = null; 1542 1543 if (performance_id != null && object.performances.length) 1544 { 1545 for (var i = 0; i < object.performances.length; i++) 1546 { 1547 if (testValue(object.performances[i].performance_id, performance_id)) 1548 { 1549 result = object.performances[i]; 1550 break; 1551 } 1552 } 1553 } 1554 1555 return result; 1556} 1557 1558function getBundle(object, bundle_id) 1559{ 1560 var result = null; 1561 1562 if (bundle_id != null && object.bundles.length) 1563 { 1564 for (var i = 0; i < object.bundles.length; i++) 1565 { 1566 if (testValue(object.bundles[i].bundle_id, bundle_id)) 1567 { 1568 result = object.bundles[i]; 1569 break; 1570 } 1571 } 1572 } 1573 1574 return result; 1575} 1576 1577function getMiscItem(object, miscitem_id) 1578{ 1579 var result = null; 1580 1581 if (miscitem_id != null && object.misc_items.length) 1582 { 1583 for (var i = 0; i < object.misc_items.length; i++) 1584 { 1585 if (testValue(object.misc_items[i].miscellaneous_item_id, miscitem_id)) 1586 { 1587 result = object.misc_items[i]; 1588 break; 1589 } 1590 } 1591 } 1592 1593 return result; 1594} 1595
1596function getGift(object, gift_id) 1597{ 1598 var result = null; 1599 1600 if (gift_id != null && object.gifts.length) 1601 { 1602 for (var i = 0; i < object.gifts.length; i++) 1603 { 1604 if (testValue(object.gifts[i].gift_id, gift_id)) 1605 { 1606 result = object.gifts[i]; 1607 break; 1608 } 1609 } 1610 } 1611 1612 return result; 1613} 1614 1615function getStoredValue(object, storedvalue_id) 1616{ 1617 var result = null; 1618 1619 if (storedvalue_id != null && object.stored_values.length) 1620 { 1621 for (var i = 0; i < object.stored_values.length; i++) 1622 { 1623 if (testValue(object.stored_values[i].stored_value_id, storedvalue_id)) 1624 { 1625 result = object.stored_values[i]; 1626 break; 1627 } 1628 } 1629 } 1630 1631 return result; 1632} 1633 1634function createGAAdmissions(object, transactionProducts, GA4ecommerceItems) 1635{ 1636 if( object.order_admissions.length > 0 ) 1637 { 1638 var admissionList = new Array(); 1639 var admissionPTList = new Array(); 1640 for (var i = 0; i < object.order_admissions.length; i++) 1641 { 1642 var perfID = object.order_admissions[i].performance_id; 1643 if( admissionList[ perfID ] == undefined ) 1644 { 1645 admissionList[ perfID ] = new Array(); 1646 } 1647 admissionList[ perfID ].push( object.order_admissions[i] ); 1648 1649 if( admissionPTList[ perfID ] == undefined ) 1650 { 1651 admissionPTList[ perfID ] = new Array(); 1652 } 1653 var curPTList = admissionPTList[ perfID ]; 1654 var admPTID = object.order_admissions[i].price_type; 1655 if (curPTList[ admPTID ] == undefined ) 1656 { 1657 curPTList[ admPTID ] = new Array(); 1658 } 1659 curPTList[ admPTID ].push( object.order_admissions[i] ); 1660 } 1661 for( var guid in admissionList ) 1662 { 1663 var admNode = admissionList[ guid ][ 0 ]; 1664 var perfID = admNode.performance_id; 1665 var perfNode; 1666 for (var i = 0; i < object.performances.length; i++) 1667 { 1668 if (perfID == object.performances[i].performance_id) 1669 { 1670 perfNode = object.performances[i]; 1671 break; 1672 } 1673 } 1674 var perfName = perfNode.name; 1675 var perfDesc = perfNode.short_description; 1676 if (perfDesc == "" || perfDesc == null) { 1677 perfDesc = perfName; 1678 } 1679 var seriesName = perfNode.series_name; 1680 1681 var curPTList = admissionPTList[ perfID ]; 1682 for ( var guid in curPTList ) 1683 { 1684 seatNode = curPTList[ guid ][ 0 ]; 1685 var admAmount = seatNode.amount.amount; 1686 var priceTypeLabel = seatNode.price_type; 1687 var priceZoneLabel = seatNode.price_zone; 1688 1689 var admissions = { "sku": perfName + " Admission " + priceTypeLabel + "-" + priceZoneLabel, 1690 "name": perfDesc + " Admission", 1691 "category": seriesName + " Admission", 1692 "price": admAmount, 1693 "quantity": curPTList[ guid ].length 1694 }; 1695 1696 var GA4admissions = { 1697 "item_id": perfName, 1698 "item_name": perfDesc, 1699 "item_category": "Admission", 1700 "item_category2": seriesName, 1701 "item_category3": priceTypeLabel, 1702 "item_category4": priceZoneLabel, 1703 "price": admAmount, 1704 "quantity": curPTList[ guid ].length 1705 }; 1706 1707 transactionProducts.push(admissions); 1708 GA4ecommerceItems.push(GA4admissions); 1709 } 1710 } 1711 } 1712} 1713 1714function createGABundles(object, transactionProducts, GA4ecommerceItems) 1715{ 1716 // roll up bundles by id and price 1717 // object.order_bundle - data about the bundle on the order: amount, total 1718 // object.bundles - data about the bundle item: name & description 1719 1720 if( object.bundles.length > 0 ) 1721 { 1722 var bundleList = {}; 1723 for (var i = 0; i < object.order_bundle.length; i++) 1724 { 1725 var bundleID = object.order_bundle[i].bundle_id; 1726 var bundleAmount = object.order_bundle[i].amount.amount; 1727 1728 if( bundleList[ bundleID ] == undefined ) 1729 { 1730 bundleList[ bundleID ] = {}; 1731 } 1732 if( bundleList[ bundleID ][ bundleAmount ] == undefined ) 1733 { 1734 bundleList[ bundleID ][ bundleAmount ] = 0; 1735 } 1736 bundleList[ bundleID ][ bundleAmount ]++; 1737 } 1738 1739 for (var i = 0; i < object.bundles.length; i++) 1740 { 1741 var bundleID = object.bundles[i].bundle_id; 1742 var sku = object.bundles[i].name; 1743 var name = object.bundles[i].description; 1744 var shortDesc = object.bundles[i].short_description; 1745 if (shortDesc == null) { 1746 shortDesc = sku; 1747 } 1748 1749 for(var amount in bundleList[bundleID]) 1750 { 1751 transactionProducts.push( 1752 { 1753 "sku": sku, 1754 "name": name, 1755 "price": amount, 1756 "quantity": bundleList[bundleID][amount] 1757 }); 1758 1759 GA4ecommerceItems.push( 1760 { 1761 "item_id": sku,
1762 "name": shortDesc, 1763 "item_category": "Bundle", 1764 "price": amount, 1765 "quantity": bundleList[bundleID][amount] 1766 }); 1767 } 1768 } 1769 } 1770} 1771 1772function createGAMiscItems(object, transactionProducts, GA4ecommerceItems) 1773{ 1774 if( object.misc_items.length > 0 && object.order_misc_items.length > 0) 1775 { 1776 var itemList = new Array(); 1777 var itemAmountList = new Array(); 1778 for (var i = 0; i < object.order_misc_items.length; i++) 1779 { 1780 var itemID = object.order_misc_items[i].item_id; 1781 if( itemList[ itemID ] == undefined ) 1782 { 1783 itemList[ itemID ] = new Array(); 1784 } 1785 itemList[ itemID ].push( object.order_misc_items[i] ); 1786 if( itemAmountList[ itemID ] == undefined ) 1787 itemAmountList[ itemID ] = parseFloat(object.order_misc_items[i].amount.amount); 1788 } 1789 for (var i = 0; i < object.misc_items.length; i++) 1790 { 1791 var miscItems = { "sku": object.misc_items[i].name, 1792 "name": object.misc_items[i].description, 1793 "category": object.misc_items[i].category, 1794 "price": itemAmountList[object.misc_items[i].miscellaneous_item_id], 1795 "quantity": itemList[object.misc_items[i].miscellaneous_item_id].length 1796 }; 1797 1798 var shortDesc = object.misc_items[i].short_description; 1799 if (shortDesc == null) { 1800 shortDesc = object.misc_items[i].name; 1801 } 1802 1803 var GA4miscItems = { 1804 "item_id": object.misc_items[i].name, 1805 "item_name": shortDesc, 1806 "item_category": "Miscellaneous Item", 1807 "item_category2": object.misc_items[i].category, 1808 "price": itemAmountList[object.misc_items[i].miscellaneous_item_id], 1809 "quantity": itemList[object.misc_items[i].miscellaneous_item_id].length 1810 }; 1811 1812 transactionProducts.push(miscItems); 1813 GA4ecommerceItems.push(GA4miscItems); 1814 } 1815 } 1816} 1817 1818function createGAGifts(object, transactionProducts, GA4ecommerceItems) 1819{ 1820 if( object.gifts.length > 0 && object.order_gifts.length > 0) 1821 { 1822 var giftList = new Array(); 1823 for (var i = 0; i < object.gifts.length; i++) 1824 { 1825 var giftID = object.gifts[i].gift_id; 1826 if( giftList[ giftID ] == undefined ) 1827 { 1828 giftList[ giftID ] = new Array(); 1829 } 1830 giftList[ giftID ] = object.gifts[i].name; 1831 } 1832 for (var i = 0; i < object.order_gifts.length; i++) 1833 { 1834 var gifts = { "sku": giftList[object.order_gifts[i].gift_id], 1835 "name": object.order_gifts[i].appeal_id, 1836 "category": object.order_gifts[i].fund, 1837 "price": object.order_gifts[i].pledge_paid_amount.amount, 1838 "quantity": 1 1839 }; 1840 1841 var GA4gifts = { 1842 "item_id": giftList[object.order_gifts[i].gift_id], 1843 "item_name": object.order_gifts[i].appeal_id, 1844 "item_category": "Gift", 1845 "item_category2": object.order_gifts[i].fund, 1846 "price": object.order_gifts[i].pledge_paid_amount.amount, 1847 "quantity": 1 1848 }; 1849 1850 transactionProducts.push(gifts); 1851 GA4ecommerceItems.push(GA4gifts); 1852 } 1853 } 1854} 1855 1856function createGAStoredValueItems(object, transactionProducts, GA4ecommerceItems) 1857{ 1858 if( object.stored_values.length > 0 ) 1859 { 1860 var storedValueNameList = new Array(); 1861 var storedValueTypeList = new Array(); 1862 var storedValueDescList = new Array(); 1863 var storedValueShortDescList = new Array(); 1864 for (var i = 0; i < object.stored_values.length; i++) 1865 { 1866 var certID = object.stored_values[i].stored_value_id; 1867 if( storedValueNameList[ certID ] == undefined ) 1868 { 1869 storedValueNameList[ certID ] = new Array(); 1870 storedValueTypeList[ certID ] = new Array(); 1871 storedValueDescList[ certID ] = new Array(); 1872 storedValueShortDescList[ certID ] = new Array(); 1873 } 1874 storedValueNameList[ certID ] = object.stored_values[i].name; 1875 storedValueDescList[ certID ] = object.stored_values[i].description; 1876 storedValueShortDescList[ certID ] = object.stored_values[i].short_description; 1877 storedValueTypeList[ certID ] = object.stored_values[i].type; 1878 } 1879 for (var i = 0; i < object.order_stored_values.length; i++) 1880 { 1881 var storedValueItems = { "sku": storedValueNameList[object.order_stored_values[i].stored_value_id], 1882 "name": storedValueDescList[object.order_stored_values[i].stored_value_id], 1883 "category": storedValueTypeList[object.order_stored_values[i].stored_value_id], 1884 "price": parseFloat(object.order_stored_values[i].amount.amount), 1885 "quantity": 1 1886 }; 1887 1888 var shortDesc = storedValueShortDescList[object.order_stored_values[i].stored_value_id]; 1889 if (shortDesc == null) { 1890 shortDesc = storedValueNameList[object.order_stored_values[i].stored_value_id]; 1891 } 1892 1893 var GA4storedValueItems = { 1894 "item_id": storedValueNameList[object.order_stored_values[i].stored_value_id],
1895 "item_name": shortDesc, 1896 "item_category": "Stored Value Item", 1897 "item_category2": storedValueTypeList[object.order_stored_values[i].stored_value_id], 1898 "price": parseFloat(object.order_stored_values[i].amount.amount), 1899 "quantity": 1 1900 }; 1901 1902 transactionProducts.push(storedValueItems); 1903 GA4ecommerceItems.push(GA4storedValueItems); 1904 } 1905 } 1906} 1907 1908function createGATransaction(object) 1909{ 1910 var output; 1911 var transactionProducts = new Array; 1912 var GA4ecommerceItems = new Array; 1913 1914 createGAAdmissions(object, transactionProducts, GA4ecommerceItems); 1915 createGABundles(object, transactionProducts, GA4ecommerceItems); 1916 createGAMiscItems(object, transactionProducts, GA4ecommerceItems); 1917 createGAGifts(object, transactionProducts, GA4ecommerceItems); 1918 createGAStoredValueItems(object, transactionProducts, GA4ecommerceItems); 1919 1920 output = { "transactionId": object.order_number.toString(), 1921 "transactionAffiliation": object.affiliation == null ? "" : object.affiliation.toString(), 1922 "transactionTotal": object.grand_total.amount, 1923 "transactionTax": object.total_tax.amount, 1924 "transactionShipping": object.delivery_charges.amount, 1925 "transactionCity": object.customer_city == null ? "" : object.customer_city.toString(), 1926 "transactionState": object.customer_state == null ? "" : object.customer_state.toString(), 1927 "transactionCountry": object.customer_country == null ? "" : object.customer_country.toString(), 1928 "transactionProducts": transactionProducts, 1929 "ecommerce": { 1930 "transaction_id": object.order_number.toString(), 1931 "value": object.grand_total.amount, 1932 "tax": object.total_tax.amount, 1933 "shipping": object.delivery_charges.amount, 1934 "currency": object.grand_total.currency, 1935 "items": GA4ecommerceItems 1936 } 1937 }; 1938 1939 return output; 1940} 1941 1942 1943 1944</script>
1944 1945 1946
1946<script type="text/javascript"> 1947 var dataLayer = new Array(); 1948 dataLayer.push(getSessionObject()); 1949 dataLayer.push(getPageObject()); 1950 var av_error = getErrorObject(); 1951 if (av_error != null) 1952 dataLayer.push(av_error); 1953 1954 </script>
1954 1955 <!-- Google Tag Manager -->
vendor: 63 bytes, lines 1955-1956
1955 1956 <noscript><iframe src="//www.googletagmanager.com/ns.html?id=
1956GTM-594JG6
vendor: 85 bytes, lines 1956-1958
1956" 1957 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 1958
1958<script>
vendor: 325 bytes, lines 1958-1962
1958(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 1959 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 1960 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 1961 '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 1962 })(window,document,'script','dataLayer','
1962GTM-594JG6
vendor: 3 bytes, line 1962
1962');
1962</script>
1962 1963 <!-- End Google Tag Manager --> 1964 1965<div id="fb-root"></div>
1966<script> 1967 var FBAppID = 'undefined' 1968 var FBVersion = 'v2.8'; 1969 1970 window.fbAsyncInit = function () { 1971 1972 1973 FB.init({ 1974 appId: FBAppID, 1975 status: true, 1976 cookie: true, 1977 frictionlessRequests: true, 1978 xfbml: true, 1979 oauth: true, 1980 version: FBVersion 1981 }); 1982 FB.Canvas.setAutoGrow(); 1983 FB.Canvas.getPageInfo(function (info) { 1984 FB.Canvas.scrollTo(0, 0); 1985 }); 1986 fbinit(); 1987 }; 1988 1989 (function (d, s, id) { 1990 var js, fjs = d.getElementsByTagName(s)[0]; 1991 if (d.getElementById(id)) return; 1992 js = d.createElement(s); js.id = id; 1993 js.src = "//connect.facebook.net/en_US/sdk.js"; 1994 js.defer = true; 1995 fjs.parentNode.insertBefore(js, fjs); 1996 } (document, 'script', 'facebook-jssdk')); 1997 1998 function fblogin(thisForm, callback) { 1999 // check if callback is defined and a function 2000 var callback = callback && typeof callback === 'function' ? callback : function() {}; 2001 2002 FB.getLoginStatus(function (response) { 2003 if (response.status == 'connected') { 2004 callback(thisForm, response); 2005 thisForm.submit(); 2006 } 2007 else { 2008 FB.login(function (response) { 2009 if (response.authResponse) { 2010 callback(thisForm); 2011 thisForm.submit(); 2012 } 2013 }, { scope: 'rsvp_event,user_friends' }); 2014 } 2015 }); 2016 2017 return false; 2018 } 2019</script>
2019 2020
2021<script> 2022 var events = new Array(); 2023 var eventCounter = 0; 2024 2025 function fbinit() { 2026 for (evnt in events) { 2027 setRSVPButtonsLogin(events[evnt]); 2028 } 2029 }; 2030 2031</script>
2031 2032 2033<header class="online-timer"></header> 2034<div role="banner" id="header"> 2035 <button id="menuSkipToContent" onclick="skipToMain()" role="link">Skip to main content</button> 2036 <!-- customer/order information --> 2037 2038<div class="customer-options" id="customer-utilities"> 2039<!--ORDER DETAILS BOX--> 2040 2041 <div id="orderInfo"> 2042 2043 <!-- This is the same information that displays in the grey navigation bar at the top, showing and formatted for the mobile view, when that bar is hidden. --> 2044 <!-- The order of the html elements is different between the two display cases, so we have some duplication of some of the elements. --> 2045 <div id="customer-order-info"> 2046 <div class="hide-when-window-large"> 2047 <div class="form-group"> 2048 2049 2050 <span class="greeting-message">Order for</span> 2051 <span class="greeting-name">Guest</span> 2052 2053 </div> 2054 </div> 2055 <div class="customer-greeting"> 2056 2057 </div> 2058 2059 <div class="customer-order shopping-cart-details order-message "> 2060 2061 <span id="orderInfoEmptyMessage">Your shopping cart is empty.</span> 2062 2063 </div> 2064 2065 <div class="customer-buttons"> 2066 2067 2068 <div class="cart-callout"> 2069 2070 2071 <button title="Shopping Cart" onclick="submitNewForm("shoppingCart.asp?sToken=1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=")" id="orderInfoCartLink" class="shopping-cart-link btn btn-secondary"> 2072 Shopping Cart 2073 </button> 2074 2075 2076 2077 </div> 2078 </div> 2079 2080
2081<script> 2082 var currentLanguage = "EN"; 2083 2084 function setLanguage(dropdown, language) { 2085 var form = dropdown.closest('form'); 2086 form.querySelector(".sessionlanguage").value = language; 2087 form.submit(); 2088 } 2089 2090 function updateDropdownDisplay(dropdown) { 2091 var selectedOption = dropdown.options[dropdown.selectedIndex]; 2092 var displayText = selectedOption.value; 2093 selectedOption.textContent = displayText; // Ensure the selected option shows the abbreviated version 2094 if (displayText !== currentLanguage) { 2095 setLanguage(dropdown, displayText); 2096 } 2097 } 2098 2099 function expandDropdown(dropdown) { 2100 for (var i = 0; i < dropdown.options.length; i++) { 2101 var option = dropdown.options[i]; 2102 option.textContent = option.getAttribute("data-full"); 2103 } 2104 } 2105 2106 function collapseDropdown(dropdown) { 2107 for (var i = 0; i < dropdown.options.length; i++) { 2108 var option = dropdown.options[i]; 2109 option.textContent = option.value; 2110 } 2111 updateDropdownDisplay(dropdown); 2112 } 2113 2114 window.addEventListener("DOMContentLoaded", function () { 2115 var dropdowns = document.querySelectorAll('.languageDropdown'); 2116 dropdowns.forEach(function(dropdown) { 2117 updateDropdownDisplay(dropdown); 2118 // Add event listeners to expand and collapse the dropdown 2119 dropdown.addEventListener("focus", function() { expandDropdown(dropdown); }); 2120 dropdown.addEventListener("blur", function() { collapseDropdown(dropdown); }); 2121 }); 2122 }); 2123</script>
2123 2124 </div> 2125 </div> 2126 2127 <!-- This is the grey navigation bar at the top. Does not show when in mobile view. --> 2128 <div id="orderInfoSecondBar" class="hide-when-window-small"> 2129 <div class="form-group"> 2130 <span class="greeting-message">Order for</span> 2131 <span class="greeting-name">Guest</span> 2132 2133 </div> 2134 </div> 2135 2136 2137 <div class="menuContainer utility-nav"> 2138 <ul id="utility-menu" class="nav"> 2139 2140 <li class="utility-menu-item" id="utility-menu-item-login"> 2141 <a href="login.asp" title="LOGIN" class="menu_item" > 2142 LOGIN 2143 </a> 2144 </li> 2145 2146 </ul> 2147 </div> 2148</div> 2149 2150 <div class="header-content container"> 2151 <a href="https://thehanovertheatre.org" shape="rect" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"><img alt="logo" src="/ArticleMedia/Images/2021-Branding/logo-light-1.svg" style="width: auto; height: auto; max-width:210px;"/> 2152</a> 2153<div id="google_translate_element" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/">Â </div> 2154 2155 </div> 2156 2157 <button type="button" id="menuButton" class="menu-toggle menu-button btn btn-secondary" aria-controls="menu" aria-label="Main Navigation" aria-expanded="false"> 2158 <span class="fas fa-align-justify"></span> 2159 </button> 2160 <button type="button" id="sidebarButton" class="menu-toggle sidebar-button btn btn-secondary" aria-controls="customer-utilities" aria-label="Shopping Cart" aria-expanded="false"> 2161 <span class="fas fa-shopping-cart"></span> 2162 2163 2164 2165 </button> 2166</div> 2167 2168<div class="content-wrapper"> 2169 2170<div aria-label="Main" role="navigation" id="menu"> 2171 <div class="menuContainer main-nav"> 2172 <ul id="menuTop" class="nav clearfix"> 2173 2174 <li class="menuTopItem " id="menuTopItem0"> 2175 2176 <a class="menu_item menu-link" href="javascript:void(0);" onclick="sTokenLink("default.asp?doWork::WScontent::loadArticle=Load&BOparam::WScontent::loadArticle::article_id=3EADE5D1-C212-4B7D-B25A-7E802D2F425C&menu_id=A02D1D6B-9C4F-45E5-8578-FF193CB637B5", "sToken", "1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=")"> 2177 <span class="menu-label">Shows & Tickets</span> 2178 </a> 2179 2180 </li> 2181 2182 <li class="menuTopItem " id="menuTopItem1"> 2183 2184 <a class="menu_item menu-link" href="https://thehanovertheatre.org/subscriptions" target="_blank"> 2185 <span class="menu-label">Series Subscriptions</span> 2186 </a> 2187 2188 </li> 2189 2190 <li class="menuTopItem has-sub-menu clearfix dropdown" id="menuTopItem2"> 2191 2192 <a href="javascript:void(0);" class="menu_item empty-link-dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"> 2193 <span class="menu-label">Conservatory</span> 2194 <span class="fas fa-chevron-down"></span> 2195 <span class="fas fa-chevron-up"></span> 2196 </a> 2197 <div class="menuSub dropdown-menu"> 2198 2199 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/conservatory/" target="_blank"> 2200 Conservatory Home 2201 </a> 2202 2203 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/programs/" target="_blank"> 2204 Register for Classes 2205 </a> 2206 2207 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/conservatory/performance-opportunities/" target="_blank"> 2208 Performance Opportunities 2209 </a> 2210 2211 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/conservatory/policies/" target="_blank"> 2212 Policies 2213 </a> 2214 2215 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/conservatory/tuition-payments/" target="_blank"> 2216 Tuition & Payments 2217 </a> 2218 2219 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/conservatory/holidays-closures/" target="_blank"> 2220 Holidays & Closures 2221 </a> 2222 2223 </div> 2224 2225 </li> 2226 2227 <li class="menuTopItem has-sub-menu clearfix dropdown" id="menuTopItem3"> 2228 2229 <a href="javascript:void(0);" class="menu_item empty-link-dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"> 2230 <span class="menu-label">THT Rep</span> 2231 <span class="fas fa-chevron-down"></span> 2232 <span class="fas fa-chevron-up"></span> 2233 </a> 2234 <div class="menuSub dropdown-menu"> 2235 2236 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/tht-rep/" target="_blank"> 2237 THT Rep Home 2238 </a> 2239 2240 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/support/thtrep-challenge-grant/" target="_blank"> 2241 Support THT Rep 2242 </a> 2243 2244 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/tht-rep/tht-rep-tiered-tickets/" target="_blank"> 2245 Tiered Ticketing 2246 </a> 2247 2248 </div> 2249 2250 </li> 2251 2252 <li class="menuTopItem has-sub-menu clearfix dropdown" id="menuTopItem4"> 2253 2254 <a href="javascript:void(0);" class="menu_item empty-link-dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"> 2255 <span class="menu-label">Support</span> 2256 <span class="fas fa-chevron-down"></span> 2257 <span class="fas fa-chevron-up"></span> 2258 </a> 2259 <div class="menuSub dropdown-menu"> 2260 2261 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/support/membership-indiv
2261idual-giving/" target="_blank"> 2262 Membership & Individual Giving 2263 </a> 2264 2265 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/support/tht-rep/" target="_blank"> 2266 The Hanover Theatre Repertory 2267 </a> 2268 2269 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/mightywurlitzer/" target="_blank"> 2270 The Mighty Wurlitzer Organ 2271 </a> 2272 2273 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/support/corporate-giving/" target="_blank"> 2274 Corporate Giving 2275 </a> 2276 2277 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/support/volunteer/" target="_blank"> 2278 Volunteer 2279 </a> 2280 2281 </div> 2282 2283 </li> 2284 2285 <li class="menuTopItem has-sub-menu clearfix dropdown" id="menuTopItem5"> 2286 2287 <a href="javascript:void(0);" class="menu_item empty-link-dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"> 2288 <span class="menu-label">About</span> 2289 <span class="fas fa-chevron-down"></span> 2290 <span class="fas fa-chevron-up"></span> 2291 </a> 2292 <div class="menuSub dropdown-menu"> 2293 2294 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/plan-your-visit/" target="_blank"> 2295 Plan Your Visit 2296 </a> 2297 2298 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/about/diversity-inclusion/" target="_blank"> 2299 Commitment to DEIB 2300 </a> 2301 2302 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/about/the-building/" target="_blank"> 2303 The Building 2304 </a> 2305 2306 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/about/" target="_blank"> 2307 Mission & History 2308 </a> 2309 2310 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/about/promotional-partners/" target="_blank"> 2311 Promotional Partners 2312 </a> 2313 2314 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/about/venue-rentals/" target="_blank"> 2315 Venue Rentals 2316 </a> 2317 2318 <a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/contact/" target="_blank"> 2319 Contact Us 2320 </a> 2321 2322 </div> 2323 2324 </li> 2325 2326 <li class="menuTopItem " id="menuTopItem6"> 2327 2328 <a class="menu_item menu-link" href="javascript:void(0);" onclick="sTokenLink("maintainAccount.asp?menu_id=3E71187C-B1CB-4745-80E6-6C937FCC992D", "sToken", "1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=")"> 2329 <span class="menu-label">My Account</span> 2330 </a> 2331 2332 </li> 2333 2334 <li class="menuTopItem" id="menuTopItem-languageDropdown"> 2335 2336
2337<script> 2338 var currentLanguage = "EN"; 2339 2340 function setLanguage(dropdown, language) { 2341 var form = dropdown.closest('form'); 2342 form.querySelector(".sessionlanguage").value = language; 2343 form.submit(); 2344 } 2345 2346 function updateDropdownDisplay(dropdown) { 2347 var selectedOption = dropdown.options[dropdown.selectedIndex]; 2348 var displayText = selectedOption.value; 2349 selectedOption.textContent = displayText; // Ensure the selected option shows the abbreviated version 2350 if (displayText !== currentLanguage) { 2351 setLanguage(dropdown, displayText); 2352 } 2353 } 2354 2355 function expandDropdown(dropdown) { 2356 for (var i = 0; i < dropdown.options.length; i++) { 2357 var option = dropdown.options[i]; 2358 option.textContent = option.getAttribute("data-full"); 2359 } 2360 } 2361 2362 function collapseDropdown(dropdown) { 2363 for (var i = 0; i < dropdown.options.length; i++) { 2364 var option = dropdown.options[i]; 2365 option.textContent = option.value; 2366 } 2367 updateDropdownDisplay(dropdown); 2368 } 2369 2370 window.addEventListener("DOMContentLoaded", function () { 2371 var dropdowns = document.querySelectorAll('.languageDropdown'); 2372 dropdowns.forEach(function(dropdown) { 2373 updateDropdownDisplay(dropdown); 2374 // Add event listeners to expand and collapse the dropdown 2375 dropdown.addEventListener("focus", function() { expandDropdown(dropdown); }); 2376 dropdown.addEventListener("blur", function() { collapseDropdown(dropdown); }); 2377 }); 2378 }); 2379</script>
2379 2380 </li> 2381 </ul> 2382 2383 </div> 2384</div> 2385 2386<!-- CONTENT START --> 2387<div id="content"> 2388 <div class="container"> 2389 2390 2391<div class="bodyDetails article-2627SashaVelourTravesty" id="default" > 2392 2393 2394 <div id="searchBox" class="search-box"> 2395 <form role="search" id="searchItems" action="default.asp" method="post" class="form-inline"> 2396 <input type="hidden" name="sToken" value="1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=" class="form-inline"> 2397 <input type="hidden" name="BOset::WScontent::SearchCriteria::venue_filter" value=""> 2398 <input type="hidden" name="BOset::WScontent::SearchCriteria::city_filter" value=""> 2399 <input type="hidden" name="BOset::WScontent::SearchCriteria::month_filter" value=""> 2400 <input type="hidden" name="BOset::WScontent::SearchCriteria::object_type_filter" value=""> 2401 <input type="hidden" name="BOset::WScontent::SearchCriteria::category_filter" value=""> 2402 <input type="hidden" name="BOset::WScontent::SearchCriteria::search_from" value=""> 2403 <input type="hidden" name="BOset::WScontent::SearchCriteria::search_to" value=""> 2404 <input type="hidden" name="doWork::WScontent::search" value="1"> 2405 2406 <input type="hidden" name="BOparam::WScontent::search::article_search_id" value="EE8716B4-0827-4B0D-9ACB-038A148DF966"> 2407 2408 <ul class="list-unstyled"> 2409 <li class="item-search-keyword"> 2410 <span id="keyword-item-search" class="searchBoxLabel field-label">Search Events</span> 2411 <input type="text" name="BOset::WScontent::SearchCriteria::search_criteria" class=" form-control" aria-labelledby="keyword-item-search" value="" title="Search Criteria" id="BOset::WScontent::SearchCriteria::search_criteria" class="form-control"> 2412 </li> 2413 <li class="item-search-start-date"> 2414 <span id="event-dates-search" class="searchBoxLabel field-label">Event Dates</span> 2415 <span id="event-dates-from" class="visually-hidden">from</span> 2416 <div class="input-group"><input type="text" name="BOset::WScontent::SearchCriteria::search_from" class=" form-control" aria-labelledby="event-dates-search event-dates-from" value="" title="Search From" id="BOset::WScontent::SearchCriteria::search_from::0" class="form-control"><div class="input-group-append"><button type="button" class="btn-unstyled calIcon" title="Show date picker" onClick="tsOpenCalendar( event, "BOset::WScontent::SearchCriteria::search_from::0", "0", "false", "sToken", "1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=");" id="cal::BOset::WScontent::SearchCriteria::search_from::0"></button> 2417</div></div> 2418 </li>
2419 <li class="item-search-end-date"> 2420 <span id="event-dates-to" class="searchBoxLabel field-label">to</span> 2421 <div class="input-group"><input type="text" name="BOset::WScontent::SearchCriteria::search_to" class=" form-control" aria-labelledby="event-dates-to" value="" title="Search To" id="BOset::WScontent::SearchCriteria::search_to::0" class="form-control"><div class="input-group-append"><button type="button" class="btn-unstyled calIcon" title="Show date picker" onClick="tsOpenCalendar( event, "BOset::WScontent::SearchCriteria::search_to::0", "0", "false", "sToken", "1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=");" id="cal::BOset::WScontent::SearchCriteria::search_to::0"></button> 2422</div></div> 2423 </li> 2424 <li class="item-search-submit"> 2425 <input type="submit" class="btn btn-secondary" value="Go" name="Go" onclick="performSearch(event)"> 2426 </li> 2427 </ul> 2428
2428<script type="text/javascript"> 2429 function performSearch(event){ 2430 event.preventDefault(); 2431 doGAClicks('Search'); 2432 let _form = document.getElementById("searchItems"); 2433 if (!!_form){ 2434 _form.method = "get"; 2435 _form.removeChild(_form.querySelector("input[name='sToken']")); 2436 document.getElementById("searchItems").submit(); 2437 } 2438 } 2439 2440 </script>
2440 2441 </form> 2442 </div> 2443 2444 2445 2446 <div class="articles has-secondary-features"> 2447 2448 <!-- top scrolling features included --> 2449 2450 2451 <div class="article-body-container"> 2452 2453 <div role="main" class="article-container main-article-body"> 2454 <p style="text-align: center;" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"><img alt="Sasha Velour: TRAVESTY" src="/content/Images/SV_600%20x%20280%20emails%20and%20AV%20ticket%20page.jpg" style="color: inherit; font-family: inherit; font-size: 30px; line-height: 1.1; width: 100%;"/> 2455</p> 2456 2457<div xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"> 2458<p><div name="avWidget" id="avWidget_682F8C41-1D0A-4CB9-9FC4-B0A747940EA3_IDDPDUGYI5B1KXD05GZPYQPKEFLLLWSZP4MWEAEYOAO1BDSCKQSUDJ" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="">
2459<script type="text/javascript"> 2460 registerWidget( "SearchWebWidget", "avWidget_682F8C41-1D0A-4CB9-9FC4-B0A747940EA3_IDDPDUGYI5B1KXD05GZPYQPKEFLLLWSZP4MWEAEYOAO1BDSCKQSUDJ", { "SearchWebWidget": "", "css_class": "", "css_id": "", "css_style": "", "title": "", "showNoResults": "true", "showPrice": "false", "showLegend": "false", "1": "1"}); 2461</script>
2461</div> 2462</p> 2463</div> 2464 2465<p style="text-align: center;" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"><span style="font-size:16px;"><strong>Internationally beloved drag icon Sasha Velour is coming to Worcester with her new theatre show, Travesty.</strong> 2466</span> 2467</p> 2468 2469<p xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"><em>Travesty</em> traces the secret queer history of a single spot throughout time â A witch burns in a field; a clown builds a theater; an underground gay bar rises up against the police. As Velour embodies different characters through a series of jaw-dropping lip-syncs, she invites you to take part in the cycle of existence, resistance and camp that IS drag. Part performance art, part history, part call to action, <em>Travesty</em> will have you screaming at the top of your lungs, dancing in the aisles and inspired to âchange the muthaf*ckinâ world!â<br clear="none"/> 2470<br clear="none"/> 2471<strong>All-In Pricing</strong>: Including all fees, tickets are $41, $51, $61 and $71 depending on seat location and availability. Limited VIP upgrades are available and give you access to the pre-show meet and greet and a commemorative souvenir VIP lanyard. Save on handling fees in person at The Hanover Theatre box office. Contact the box office at <a href="tel:+18775717469" shape="rect">877.571.7469</a> for more information.</p> 2472 2473<div xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/">Â </div> 2474 2475 </div> 2476 2477 <div role="complementary" aria-label="Secondary" class="article-container secondary-linked-features"> 2478 2479<div id="promoCodeBox" class="promotional-code-input"> 2480<form role="form" aria-labelledby="promocode-title" method="POST" action="/Online/default.asp"> 2481 <input type="hidden" name="sToken" value="1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs="> 2482 2483 <input type="hidden" name="BOparam::WScontent::loadArticle::article_id" value="682F8C41-1D0A-4CB9-9FC4-B0A747940EA3"> 2484 2485 <input type="hidden" name="BOparam::WScontent::loadArticle::context_id" value=""> 2486 2487 2488 <h4 id="promocode-title"> 2489 <span class="fas fa-tag promotag"></span> Promo Code</h4> 2490 <ul class="list-unstyled"> 2491 2492 <li class="promotional-code-message"> 2493 If you have a promo or early access code, please enter it here: 2494 </li> 2495 2496 <li> 2497 <div class="input-group"> 2498 <input id="promoCodeBoxInput" type="text" class="form-control" name="BOparam::WScontent::loadArticle::promocode_access_code" title="If you have a promo or early access code, please enter it here:" > 2499 <span class="input-group-append"> 2500 <input type="submit" class="btn btn-secondary" name="doWork::WScontent::loadArticle" value="Go" onclick="doGAClicks('Apply')" > 2501 </span> 2502 </div> 2503 </li> 2504 </ul> 2505</form> 2506 </div> 2507 2508 2509 <div class="secondary-linked-feature-div" id="secondary-linked-feature-0"> 2510 <div name="avWidget" id="avWidget_6BA1D18A-662D-4D54-A903-B98643CA73B5_ID4OKYYSSA4RICPWVHPUUSLCOOWHMUPBES0ATQNOEKMJXUU20A0GNK" xmlns:av="http://www.audienceview.com/xml/email/" xmlns:xhtml="http://www.w3.org/1999/xhtml">
2511<script type="text/javascript"> 2512 registerWidget( "LoginWebWidget", "avWidget_6BA1D18A-662D-4D54-A903-B98643CA73B5_ID4OKYYSSA4RICPWVHPUUSLCOOWHMUPBES0ATQNOEKMJXUU20A0GNK", { "LoginWebWidget": "Login for member discounts, presales and promotional pricing.", "css_class": "", "css_id": "", "css_style": "", "password": "Password", "submit": "Submit", "username": "Username (Email)", "forgot_password": "Forgot Password?", "title": "Login for member discounts, presales and promotional pricing.", "1": "1"}); 2513</script>
2513</div> 2514<br clear="none" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"/> 2515<span style="font-size:11px;" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"><em>Please note, this box does not disappear once logged in.</em> 2516</span> 2517 2518 </div> 2519 2520 2521 2522 <div class="secondary-linked-feature-div" id="secondary-linked-feature-1"> 2523 <strong style="color: inherit; font-family: inherit; font-size: 30px;" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"><span style="font-size: 14px;">Helpful Hints</span> 2524</strong> 2525<div xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/">1. Enter username and password or create account in login box located on left. If you have not logged into your online account before, please temporary password <strong>hanover1</strong>.</div> 2526 2527<div xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/">2. If you have a promo code, enter it into the promotional code box located on left.</div> 2528 2529<div xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/">3. Select desired performance, seat and price.</div> 2530 2531<div xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/">4. Click "add to order," located in bottom right corner.</div> 2532 2533<div xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/">5. Continue to check out.</div> 2534 2535 </div> 2536 2537 2538 </div> 2539 2540 </div> 2541 </div> 2542</div> 2543 2544 </div><!--\\ .bodyDetails --> 2545 </div><!--\\ .container --> 2546</div><!--\\ #content --> 2547 <div role="contentinfo" id="footer"> 2548 <div class="footer-content container"> 2549<div class="row prefooter_wrapper" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"> 2550<h2 class="prefooter_heading col-lg-4">Stay in-the-know</h2> 2551 2552<div class="prefooter_form col-lg-8"><a class="signup-btn" href="https://thehanovertheatre.org/#gform_wrapper_1" shape="rect">sign up</a> 2553</div> 2554</div> 2555 2556<hr class="footer-line" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"/> 2557<div class="row" xmlns="http://www.w3.org/1999/xhtml" xmlns:av="http://www.audienceview.com/xml/email/"> 2558<div class="footer-profile col-lg-3"><a href="https://thehanovertheatre.org" shape="rect"><img alt="logo" src="/ArticleMedia/Images/2021-Branding/logo-light-1.svg" style="width: auto; height: auto; max-width:210px;"/> 2559</a> 2560 2561<h5>The Hanover Theatre & Conservatory for the Performing Arts</h5> 2562 2563<p><a href="https://goo.gl/maps/47QXMqgCGzrC72Hy6" target="_blank" shape="rect">2 Southbridge St</a> 2564<br clear="none"/> 2565Worcester, MA 01608</p> 2566 2567<p>Tickets: <a href="tel:+18775717469" shape="rect">877.571.7469</a> 2568</p> 2569</div> 2570 2571<div class="footer-menu col-lg-3"> 2572<h5>Quick Links</h5> 2573 2574<ul> 2575 <li class="footer-menu-item"><a href="https://thehanovertheatre.org/faqs/" shape="rect">Theatre FAQs</a> 2576</li> 2577 <li class="footer-menu-item"><a href="https://thehanovertheatre.org/plan-your-visit/accessibility/" shape="rect">Accessibility</a> 2578</li> 2579 <li class="footer-menu-item"><a href="https://thehanovertheatre.org/about/venue-rentals/" shape="rect">Venue Rentals</a> 2580</li> 2581 <li class="footer-menu-item"><a href="https://thehanovertheatre.org/plan-your-visit/directions/" shape="rect">Directions & Parking</a> 2582</li> 2583 <li class="footer-menu-item"><a href="https://thehanovertheatre.org/plan-your-visit/safety-protocols/" shape="rect">Safety Protocols</a> 2584</li> 2585 <li class="footer-menu-item"><a href="https://thehanovertheatre.org/careers/" shape="rect">Career Opportunities</a> 2586</li> 2587 <li class="footer-menu-item"><a href="https://thehanovertheatre.org/contact/" shape="rect">Contact Us</a> 2588</li> 2589</ul> 2590</div> 2591 2592<div class="footer-social col-lg-3"> 2593<h5>Connect with us</h5> 2594 2595<div class="footer-social-icon"><a class="fb-icon" href="https://www.facebook.com/thehanovertheatre" shape="rect">facebook</a> <a class="insta-icon" href="https://www.instagram.com/thehanovertheatre/" shape="rect">instagram</a> <a class="twitter-icon" href="https://twitter.com/HanoverTheatre" shape="rect">twitter</a> <a class="yt-icon" href="https://www.youtube.com/user/thehanovertheatre" shape="rect">youtube</a> 2596</div> 2597 2598<div><a href="https://thehanovertheatre.org/behind-the-scene-podcast/" shape="rect">Behind the Scenes Podcast</a> 2599</div> 2600</div> 2601 2602<div class="footer-widget col-lg-3"> 2603<ul> 2604 <li><a href="https://thehanovertheatre.org/classes/" shape="rect">Register for Classes</a> 2605</li> 2606 <li><a href="https://tickets.thehanovertheatre.org:8070/online/default.asp?doWork::WScontent::loadArticle=Load&BOparam::WScontent::loadArticle::article_id=21B9ADAC-5760-474C-B830-A87511E7F859" shape="rect">Donate</a> 2607</li> 2608 <li><a href="https://thehanovertheatre.org/event/" shape="rect">Buy Tickets</a> 2609</li> 2610</ul> 2611</div> 2612 2613<div class="row footer-note-legal"> 2614<div class="main-footer_main-note col-lg-8">Worcester Center for Performing Arts is a registered not-for profit 501(c)(3) organization, which owns and operates The Hanover Theatre and Conservatory for the Performing Arts. The organization also operates the Jean McDonough Arts Center (JMAC) and provides free public programming for the Francis R. Carroll Plaza and the outdoor Bank of America Stage, located directly in front of The Hanover Theatre. All donations are tax deductible to the fullest extent allowed by law.</div> 2615 2616<div class="main-footer_legal-note col-lg-5">©2026 The Hanover Theatre and Conservatory for the Performing Arts. All rights reserved.</div> 2617 2618<div class="main-footer_legal-nav col-lg-6"> 2619<ul id="legal-nav"> 2620 <li><a href="https://thehanovertheatre.org/" shape="rect">Homepage</a> 2621</li> 2622 <li><a href="https://thehanovertheatre.org/privacy-policy/" shape="rect">Privacy Policy</a> 2623</li> 2624</ul> 2625</div> 2626</div> 2627</div> 2628 2629 </div> 2630</div><!--\\ .content-wrapper --> 2631<div id="fade" class="black_overlay"></div> 2632
2633<script type="text/javascript"> 2634 function googleTranslateElementInit() { 2635 new google.translate.TranslateElement({ pageLanguage: 'en', layout: google.translate.TranslateElement.InlineLayout.SIMPLE }, 'google_translate_element'); 2636 } 2637</script>
vendor: 1 bytes, line 2637
2637
2638<script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
2638 2639
2640<script type="text/javascript" defer="defer" src="https://platform.twitter.com/widgets.js" id="twitter-wjs"></script>
2640 2641 2642 2643 2644<!-- inclusion of bootstrap.js --> 2645<!-- http://twitter.github.com for documentation on bootstrap -->
2646<script src="/lib/bootstrap/js/bootstrap.bundle.min.js?_=7.92.0" type="text/javascript"></script>
2646 2647<!-- end of bootstrap.js --> 2648 2649<!-- Font Awesome for icons -->
2650<script src="/lib/fontawesome-free/js/all.min.js"></script>
2650 2651 2652<!-- contains bootstrap specific function declarations -->
2653<script src="bootstrap-functions.js?_=7.92.0" type="text/javascript"></script>
2653 2654<!-- Logout Handler -->
2655<script> 2656$(document).ready(function() { 2657 var body = $("body"); 2658 2659 body 2660 .on("logged-out", function(e) { 2661 var targetPage = "default.asp?BOparam::WScontent::loadArticle::permalink=sv2627&BOparam::WScontent::loadArticle::context_id="; 2662 window.location.assign("login.asp?targetPage="+encodeURIComponent(targetPage)); 2663 }); 2664 2665 // on pressing Enter key on an anchor trigger click 2666 $("a").keypress(function(e){ 2667 if(e.keyCode == 13){ 2668 $(this).trigger("click"); 2669 } 2670 }); 2671 2672 // When page is loaded make sure the Page Load Spinner is not shown 2673 if (spinnerDelayTimeout) { 2674 cancelSpinnerTimeouts(); 2675 } 2676 2677 body.removeClass("show-spinner"); 2678 2679 // Show spinner when form submitted or link clicked 2680 var onSubmit; 2681 $("form").each( 2682 //Trigger the spinner after any other onsubmit functions for the form 2683 function(index) 2684 { 2685 onSubmit = $(this).attr("onsubmit"); 2686 if ( onSubmit && onSubmit != "" ) { 2687 onSubmit = onSubmit.trim(); 2688 // if the submit is "returning", we need to && showSpinner otherwise it won't be called 2689 var returnIndex = onSubmit.indexOf("return"); 2690 if ( returnIndex != -1 ) { 2691 // remove any trailing semi-colons 2692 if ( onSubmit.indexOf(";") == onSubmit.length-1 ) 2693 onSubmit = onSubmit.substr(0, onSubmit.length-1); 2694 2695 // wrap the return in () in case it contains || 2696 // (add 6 to strip the original "return") 2697 onSubmit = onSubmit.substr(0, returnIndex) + "return (" + onSubmit.substr(returnIndex + 6) + ")"; 2698 2699 // and then append the call to the spinner 2700 onSubmit += " && showSpinner()"; 2701 } 2702 else { 2703 onSubmit += ";showSpinner()"; 2704 } 2705 } 2706 else { 2707 onSubmit = "showSpinner()"; 2708 } 2709 $(this).attr("onsubmit", onSubmit); 2710 } 2711 ); 2712 2713 // attach an event listener to each <a> tag to show the spinner if needed 2714 // only do this if the <a> tag has an "href" attribute, so we don't show 2715 // the spinner if staying on the page. If navigating away from the page 2716 // via an onClick, we are assuming the onClick handles the display of the spinner 2717 // (or submits the form with jQuery, so the spinner attached to the form.submit 2718 // is fired) 2719 $("a").click(function(e) { 2720 var href = $(this).attr("href") || ""; 2721 var target = $(this).attr("target") || ""; 2722 2723 if ((target == "" || /^(_self|_top|_parent)/.test(href)) && href != "" && !/^(#|javascript:|mailto:|file:)/.test(href)) 2724 showSpinner(); 2725 }); 2726}); 2727</script>
2727 2728<!-- CONTENT END --> 2729
2730<script type="text/javascript"> 2731 (function () { 2732 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.defer = true; 2733 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 2734 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 2735 })(); 2736</script>
2736 2737
2738<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a401326dcf9e13f2',t:'MTc5MDI0NjY5OQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
2738</body> 2739</html> 2740 2741
2742<script> 2743 $(function(){ 2744 2745 // "Continue Shopping" and "Look for other events" buttons to redirect back to Brochure page user came from 2746 $("a[name=continue-shopping], a[name=continueShopping], input[name=startOver], a[name=error-StartOver], input[name=error-StartOver]").on("click", function(e) { 2747 var returnTo = getCookie('returnTo'); 2748 if(returnTo){ 2749 e.preventDefault(); 2750 deleteCookie('returnTo'); 2751 window.location.href = returnTo; 2752 } 2753 }) 2754 2755 // "New Order" button to redirect to EIF home page 2756 $("input.new-order,input[name=cancel-order]").on("click", function(e){ 2757 var returnTo = getCookie('returnTo'); 2758 if(returnTo){ 2759 e.preventDefault(); 2760 $("#popupDiv_okayButton").on("click", function(e){ 2761 $.ajax({ 2762 url: 'clearOrder.asp', 2763 complete: function() { 2764 deleteCookie('returnTo'); 2765 window.location.href = returnTo; 2766 } 2767 }); 2768 2769 }); 2770 } 2771 }) 2772 }); 2773 2774 //adding the returnTo to the cookie 2775 var returnTo = "undefined"; 2776 2777 if (returnTo) { 2778 var reffA = document.createElement('a'); 2779 reffA.href = returnTo; 2780 2781 if(reffA.host != window.location.host) { 2782 setCookie("returnTo", returnTo, 1); 2783 } 2784 } 2785 2786 /* 2787 ***************************************************** 2788 Cookie methods 2789 ***************************************************** 2790 */ 2791 function setCookie(cname, cvalue, exdays) { 2792 var d = new Date(); 2793 d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); 2794 var expires = "expires="+d.toUTCString(); 2795 document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 2796 } 2797 2798 function getCookie(cname) { 2799 var name = cname + "="; 2800 var ca = document.cookie.split(';'); 2801 for(var i = 0; i < ca.length; i++) { 2802 var c = ca[i]; 2803 while (c.charAt(0) == ' ') { 2804 c = c.substring(1); 2805 } 2806 if (c.indexOf(name) == 0) { 2807 return c.substring(name.length, c.length); 2808 } 2809 } 2810 return ""; 2811 } 2812 2813 function deleteCookie(cname) { 2814 setCookie(cname, "", -1); 2815 } 2816</script>
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.