PageSourceSearch

https://tickets.thehanovertheatre.org/Online/default.asp?BOparam::…Oparam::WScontent::loadArticle::context_id=

html thehanovertheatre.org collected 2026-09-24 10:44:59 UTC 107,462 bytes, 2,816 lines download raw bytes

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&amp;BOparam::WScontent::loadArticle::permalink=sv2627&amp;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&nbsp;inquire about accessible seating options,&nbsp;
365please contact the Box Office at <a href=\"tel:18775717469\">877.571.7469<\/a>&nbsp;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(&quot;&quot;); 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., &#243; -> ó).
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(&quot;shoppingCart.asp?sToken=1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=&quot;)" 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(&quot;default.asp?doWork::WScontent::loadArticle=Load&amp;BOparam::WScontent::loadArticle::article_id=3EADE5D1-C212-4B7D-B25A-7E802D2F425C&amp;menu_id=A02D1D6B-9C4F-45E5-8578-FF193CB637B5&quot;, &quot;sToken&quot;, &quot;1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=&quot;)">
2177					<span class="menu-label">Shows &amp; 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 &amp; Payments
2217					</a>
2218				
2219					<a class="menuSubItem dropdown-item btn" href="https://thehanovertheatre.org/conservatory/holidays-closures/" target="_blank">
2220						Holidays &amp; 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 &amp; 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 &amp; 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(&quot;maintainAccount.asp?menu_id=3E71187C-B1CB-4745-80E6-6C937FCC992D&quot;, &quot;sToken&quot;, &quot;1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=&quot;)">
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, &quot;BOset::WScontent::SearchCriteria::search_from::0&quot;, &quot;0&quot;, &quot;false&quot;, &quot;sToken&quot;, &quot;1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=&quot;);" 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, &quot;BOset::WScontent::SearchCriteria::search_to::0&quot;, &quot;0&quot;, &quot;false&quot;, &quot;sToken&quot;, &quot;1,f7a9df75,6ab4ff2b,E86A1FA3-6F79-4E9C-BA2B-35A05F757826,Gf3WLpGPgxZ0bgUecWMVlLZcRxs=&quot;);" 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 &amp; 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 &amp; 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&amp;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.