PageSourceSearch

https://villadolcecafe.com/-party?source=pop_up&spot_id=267357&des…=private_parties&promotion=private_parties

html villadolcecafe.com collected 2026-09-26 02:39:18 UTC 92,631 bytes, 2,014 lines download raw bytes

1<!DOCTYPE html>
2�<html lang="en"><head><meta content="null" property="og:site_name"/><meta content="http://villadolcecafe.com/-party" property="og:url"/><meta content="website" property="og:type"/><meta content="After 16 years in the restaurant business, Faton and Jerry Lumani wanted to open a modern Italian cafe like those they grew up with in Europe. Places where guests spent evenings lounging and..." property="og:description"/><meta content="Villa Dolce - Groups and Parties" property="og:title"/><!-- wcache 2026-09-25 12:42:57.290495Z --><!--
3smart_footer: true,
4smart_footer_version: 2,
5scripting_active: false
6--><link href="https://villadolcecafe.com/middleton-middleton-villa-dolce-party" rel="canonical"/><meta charset="utf-8"/><meta content="IE=edge" http-equiv="X-UA-Compatible"/><meta content="width=device-width, initial-scale=1" name="viewport"/><meta content="" name="description"/><meta content="" name="author"/><meta content="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/events_back.jpg" property="og:image"/><meta content="Villa Dolce image" property="og:image:alt"/><meta content="image/png" property="og:image:type"/><meta content="139026719469036" property="fb:app_id"/><meta content="summary_large_image" name="twitter:card"/><meta content="Villa Dolce - Groups and Parties" name="twitter:title"/><meta content="After 16 years in the restaurant business, Faton and Jerry Lumani wanted to open a modern Italian cafe like those they grew up with in Europe. Places where guests spent evenings lounging and..." name="twitter:description"/><meta content="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/events_back.jpg" name="twitter:image"/><title>Villa Dolce - Groups and Parties</title>
6<script>document.cookie='resolution='+Math.max(screen.width,screen.height)+("devicePixelRatio" in window ? ","+devicePixelRatio : ",1")+'; path=/';</script>
6<link href="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/favicons/favicon-96x96.png" rel="icon" sizes="96x96" type="image/png"/><link href="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/favicons/favicon.svg" rel="icon" type="image/svg+xml"/><link href="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/favicons/favicon.ico" rel="shortcut icon"/><link href="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/favicons/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180"/><meta content="Villa Dolce" name="apple-mobile-web-app-title"/><link href="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/favicons/site.webmanifest" rel="manifest"/><link href="https://static.spotapps.co/web/villadolcecafe--com/lib/bootstrap/css/bootstrap.min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/villadolcecafe--com/lib/custom-scrollbar/jquery.mCustomScrollbar.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/villadolcecafe--com/lib/font-awesome-4.7.0/css/font-awesome.min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/villadolcecafe--com/lib/hover_css/css/hover-min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/villadolcecafe--com/lib/owlcarousel/owl.carousel.min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/villadolcecafe--com/lib/owlcarousel/owl.theme.default.min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web-lib/leaflet/[email protected]/dist/leaflet.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/villadolcecafe--com/css/style.css?version2" id="mainCSS" rel="stylesheet"/><link href="https://static.spotapps.co/web/villadolcecafe--com/css/bottom_navigation_v1.css?v1768895959" rel="stylesheet"/><link href="css/custom.css?v1768895959&domain=villadolcecafe.com" rel="stylesheet"/><link href="https://static.spotapps.co/web/villadolcecafe--com/lib/icons_font/css/social_icons.css" rel="stylesheet"/><!--[if IE 7]><link rel="stylesheet" href="lib/icons_font/css/social_icons-ie7.css"><![endif]--><link href="https://static.spotapps.co/web/villadolcecafe--com/lib/twitter_x_font_icon/css/twitter_x.css" rel="stylesheet"/><!--[if IE 7]><link rel="stylesheet" href="lib/twitter_x_font_icon/css/twitter_x-ie7.css"><![endif]--><!-- Google tag (gtag.js) -->
vendor: 71 bytes, line 6
6<script async="async" src="https://www.googletagmanager.com/gtag/js?id=
6G-ZDK1ELTWZ6
vendor: 11 bytes, line 6
6"></script>
6<script> 
vendor: 127 bytes, line 6
6window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', '
6G-ZDK1ELTWZ6
vendor: 7 bytes, lines 6-7
6');
7   
7gtag('set', 'linker', {'domains': ['tmt.spotapps.co','spothopperapp.com']});
8          gtag('config', 'G-ZG3PMRMSQD');
9   gtag('config', 'G-VG24VK2VKT'); </script>
9<style>
10
11      html {
12        height: auto;
13        min-height: 100%;
14      }
15      .tmt-page.party-background.drink-menu {
16        background-color: #ebebeb;
17              }
18              .tmt-page.party-background.drink-menu {
19          background-image: url('//static.spotapps.co/spots/a9/8386b31863425aace57e4b0db596fc/wide_medium');
20        }
21        .tmt-page.party-background.drink-menu:before {
22          display: block;
23                      -webkit-backdrop-filter: blur(5px);
24            backdrop-filter: blur(5px);
25                    background-color: rgba(255,255,255,0.8);
26           
27        }
28        .tmt-page.party-background.drink-menu>div:first-child:before {
29          display: none;
30        }
31      
32    </style>
32<script src="https://static.spotapps.co/websites/lib/lazysizes/lazysizes.min.js" async=""></script>
32<script> var ga4_tracking_code='G-ZG3PMRMSQD';</script>
32<script>
33function ga_check(){
34  return true;
35}
36</script>
36<script>
37function universal_ga(action, type, category, ev_action, label){
38  if(typeof ga === 'function')
39  {
40    if(!(action && label))
41      ga(action, type, category)
42    else
43      ga(action, type, category, ev_action, label)
44  }
45
46  if(typeof gtag === 'function')
47  {
48    if(!(action && label))
49    {
50      hash = category
51      ev_label = hash["eventLabel"]
52      var splits = ev_label.match(/.{1,100}/g) ?? [];
53      delete(hash["eventLabel"])
54
55      if(splits.length <= 1)
56        hash["eventLabel"] = ev_label
57      else
58      {
59        for (let i = 0; i < splits.length; i++) {
60          var key = "eventLabel_"+i
61          hash[key] = splits[i]
62        }
63      }
64      console.log(hash)
65      gtag("event", hash["eventCategory"], hash);
66    }
67    else
68    {
69      var hash = {
70        eventCategory: category,
71        eventAction: ev_action
72      }
73
74      var splits = label.match(/.{1,100}/g) ?? [];
75      if(splits.length <= 1)
76        hash["eventLabel"] = label
77      else
78      {
79        for (let i = 0; i < splits.length; i++) {
80          var key = "eventLabel_"+i
81          hash[key] = splits[i]
82        }
83      }
84      gtag("event", hash["eventCategory"], hash);
85    }
86  }
87}
88</script>
88<script>    function getPromotionUrlParams(){
89      var params_str = sessionStorage.getItem('shUrlParams');
90      if (params_str != null){
91        return JSON.parse(params_str);
92      }else{
93        return {};
94      }
95    }
96
97    function getPromotionSourceDetails(){
98        var params_str = localStorage.getItem('promotionSourceDetails');
99        if (params_str != null){
100          return JSON.parse(params_str);
101        }else{
102          return {};
103        }
104    }
105
106    function getLastEmailVisitInDays(){
107      var promotionSourceDetails = getPromotionSourceDetails();
108      if (!promotionSourceDetails['last_visit_email'] ){
109        return null;
110      }
111      return Math.floor((new Date() - new Date(promotionSourceDetails['last_visit_email'])) / (1000 * 60 * 60 * 24));
112    }
113
114    function getLastSocialVisitInDays(){
115      var promotionSourceDetails = getPromotionSourceDetails();
116      if (!promotionSourceDetails['last_visit_social'] ){
117        return null;
118      }
119      return Math.floor((new Date() - new Date(promotionSourceDetails['last_visit_social'])) / (1000 * 60 * 60 * 24));
120    }
121
122    var shUrlParams = getPromotionUrlParams();
123    var promotionSourceDetails = getPromotionSourceDetails();
124
125    new URL(document.location).searchParams.forEach(function(value, paramName){
126
127     shUrlParams[paramName] = value;
128
129     if (paramName == 'source' && value =='social' ){
130       promotionSourceDetails['last_visit_social'] = new Date();
131       localStorage.setItem('promotionSourceDetails', JSON.stringify(promotionSourceDetails));
132     }
133
134     if (paramName == 'source' && value =='email' ){
135       promotionSourceDetails['last_visit_email'] = new Date();
136       localStorage.setItem('promotionSourceDetails', JSON.stringify(promotionSourceDetails));
137     }
138
139    });
140
141    sessionStorage.setItem('shUrlParams', JSON.stringify(shUrlParams))
142</script>
142<style>a:focus:not(:focus-visible){outline:none;box-shadow:none;}
143a.get-directions-footer-link{display:inline-block;transform-origin:left center;transition:transform .2s ease;}
144a.get-directions-footer-link:hover{transform:scale(1.08);}
145@media (prefers-reduced-motion:reduce){a.get-directions-footer-link{transition:none;transform:none;}}
146a.get-directions-footer-link,a.get-directions-footer-link:hover{color:inherit!important;}</style></head><body class="drink-menu party party-background parties-tmt-page tmt-page" id="tmtPage"><style>.image-popup-open {
147    overflow: hidden;
148}
149.main-holder-tmt.page-mode-light {
150    color: #000
151}
152.main-holder-tmt.page-mode-dark {
153    color: #fff
154}
155.main-holder-tmt.page-mode-light .gallery-item {
156    color: #000;
157    background-color: #fff;
158    border: 1px solid #fff;
159}
160.main-holder-tmt.page-mode-dark .gallery-item {
161    color: #fff;
162    background-color: #222;
163    border: 1px solid #404040;
164}
165.main-holder-tmt.page-mode-light .gallery-item .image:hover {
166    outline: 2px solid #007acc;
167    outline-offset: -2px;
168}
169.main-holder-tmt.page-mode-dark .gallery-item .image:hover {
170    outline: 2px solid #3988fe;
171    outline-offset: -2px;
172}
173.main-holder-tmt.page-mode-light .gallery-item .image:focus-visible {
174    outline: 2px solid #007acc;
175    outline-offset: 4px;
176}
177.main-holder-tmt.page-mode-dark .gallery-item .image:focus-visible {
178    outline: 2px solid #3988fe;
179    outline-offset: 4px;  
180}
181.main-holder-tmt {
182    min-height: 100vh;
183    padding-bottom: 100px;
184}
185.main-holder-tmt .text-holder {
186    text-align: center;
187    max-width: 800px;
188    margin: 50px auto;
189}
190.main-holder-tmt .text-holder .page-heading {
191    margin-top: 0;
192    margin-bottom: 25px;
193}
194.main-holder-tmt .text-holder .page-text {
195    margin-top: 0;
196    margin-bottom: 0;
197    text-transform: none;
198}
199.main-holder-tmt .content-holder {
200    max-width: 1250px;
201    margin: 50px auto 0;
202    display: flex;
203    flex-wrap: wrap;
204    justify-content: center;
205}
206.main-holder-tmt .content-holder .column {
207    padding-left: 15px;
208    padding-right: 15px;
209    flex: 0 0 50%;
210    max-width: 50%;
211}
212.main-holder-tmt .content-holder .tmt-form {
213    position: relative;
214}
215.main-holder-tmt .content-holder .tmt-form .custom-loader {
216    position: absolute;
217    top: 0;
218    left: 50%;
219    margin-left: -50px;
220}
221.main-holder-tmt .content-holder .gallery-item {
222    border-radius: 5px;
223    padding: 20px;
224    margin-bottom: 20px;
225    text-align: left;
226}
227.main-holder-tmt .gallery-item .gallery-item-header {
228    margin-top: 0;
229    margin-bottom: 10px;
230    text-transform: none;
231}
232.main-holder-tmt .gallery-item .images-holder {
233    display: grid;
234    grid-template-columns: repeat(3, 1fr);
235    gap: 20px;
236}
237.main-holder-tmt .images-holder .image {
238    width: 100%;
239    height: 125px;
240    object-fit: cover;
241    border-radius: 3px;
242    cursor: pointer;
243}
244.main-holder-tmt .tmt-iframe {
245    border-radius: 5px;
246}
247.main-holder-tmt .image-popup-overlay {
248    position: fixed;
249    top: 0;
250    left: 0;
251    height: 100%;
252    width: 100%;
253    background: rgba(0,0,0,0.8);
254    opacity: 0;
255    visibility: hidden;
256    z-index: 1050;
257    cursor: pointer;
258    transition: opacity 0.3s ease;
259}
260.main-holder-tmt .image-popup-overlay.is-open {
261    opacity: 1;
262    visibility: visible;
263}
264.main-holder-tmt .image-popup-holder {
265    display: grid;
266    place-items: center;
267    height: 100%;
268}
269.main-holder-tmt .image-popup-holder .image-wrapper {
270    display: inline-block;
271    position: relative;
272    margin: 0 30px;
273    text-align: right;
274}
275.main-holder-tmt .image-popup-holder .popup-image {
276    display: block;
277    max-width: 100%;
278    max-height: 80vh;
279    padding: 10px;
280    background-color: #fff;
281    border-radius: 5px;
282    cursor: default;
283}
284.main-holder-tmt .image-popup-holder .image-popup-close {
285    width: 38px;
286    height: 38px;
287    line-height: 28px;
288    padding: 5px;
289    margin-bottom: 5px;
290    font-size: 32px;
291    color: #fff;
292    background: transparent;
293    border: 0;
294    cursor: pointer;
295    text-shadow: 0px 0px 3px #000;
296    font-family: Arial, sans-serif;
297}
298.main-holder-tmt .image-popup-holder .image-popup-close:hover {
299    opacity: 0.8;
300}
301@media (max-width: 1400px) {
302    .main-holder-tmt .content-holder {
303        max-width: 1140px;
304    }
305    .main-holder-tmt .gallery-item .images-holder {
306        grid-template-columns: repeat(2, 1fr);
307    }
308}
309@media (max-width: 1200px) {
310    .main-holder-tmt .text-holder {
311        max-width: 600px;
312    }
313    .main-holder-tmt .content-holder {
314        max-width: 960px;
315    }
316}
317@media (max-width: 1023px) {
318    .main-holder-tmt .gallery-item .images-holder {
319        grid-template-columns: repeat(1, 1fr);
320    }
321    .main-holder-tmt .images-holder .image {
322        width: 220px;
323        margin: 0 auto;
324    }
325}
326@media (max-width: 991px) {
327    .main-holder-tmt .text-holder {
328        max-width: 500px;
329    }
330    .main-holder-tmt .content-holder {
331        max-width: 720px;
332    }
333}
334@media (max-width: 767px) {
335    .main-holder-tmt .text-holder {
336        margin-top: 30px;
337        margin-bottom: 20px;
338        padding: 0 15px;
339    }
340    .main-holder-tmt .content-holder {
341        flex-direction: column-reverse;
342        margin-top: 20px;
343    }
344    .main-holder-tmt .content-holder .column {
345        flex: auto;
346        max-width: 100%;
347    }
348    .main-holder-tmt .tmt-form {
349        margin-bottom: 20px;
350    }
351}</style><div><header style="background-color:#000000;"><style>
352
353.nav-v8 .nav-tab:nth-child(n+7) {
354  -webkit-box-ordinal-group: 3;
355  order: 3;
356}
357
358.navbar.nav-v6.nav-v8 .desktop-navigation .header-logo {
359  top: 0px;
360}
361
362
363.navbar.nav-v6.nav-v8.nav-scroll .desktop-navigation .header-logo {
364  top: 0px;
365}
366
367.navbar.nav-v6 .container {
368  padding-top: 10px;
369  padding-bottom: 10px;
370}
371.navbar.nav-v6.nav-scroll .container {
372  padding-top: 0px;
373  padding-bottom: 0px;
374}
375.navbar.nav-v6 .header-logo img {
376  max-width: 100%;
377}
378
379@media (max-width: 767px) {
380  /* DO NOT change mobile nav height on page scroll */
381  .navbar.nav-v6 .navbar-header,
382  .navbar.nav-v6.nav-scroll .navbar-header {
383    padding-top: 10px;
384    padding-bottom: 10px;
385  }
386  .navbar.nav-v6.nav-v8 .socialnav,
387  .navbar.nav-v6.nav-v8.nav-scroll .socialnav {
388    margin-top: 10px;
389  }
390  .navbar.nav-v6 .container,
391  .navbar.nav-v6.nav-scroll .container {
392    padding-top: 0;
393    padding-bottom: 0;
394  }
395  .navbar.nav-v6 .header-logo,
396  .navbar.nav-v6.nav-scroll .header-logo {
397    height: 70px;
398  }
399  .navbar.nav-v6 .header-logo img {
400    max-height: 100%;
401  }
402  .navbar.nav-v6.nav-scroll .header-logo img {
403    max-width: 100%;
404  }
405  /* HOME page CHANGE mobile nav height on page scroll */
406  /* Remove body.home-page from below code if there should be mobile nav height change on ALL pages */
407  body.home-page .navbar.nav-v6 .navbar-header {
408    padding-top: 10px;
409    padding-bottom: 10px;
410  }
411  body.home-page .navbar.nav-v6.nav-scroll .navbar-header{
412    padding-top: 0px;
413    padding-bottom: 0px;
414  }
415  body.home-page .navbar.nav-v6.nav-v8 .socialnav {
416    margin-top: 10px;
417  }
418  body.home-page .navbar.nav-v6.nav-v8.nav-scroll .socialnav {
419    margin-top: 0px;
420  }
421  body.home-page .navbar.nav-v6 .container{
422    padding-top: 0;
423    padding-bottom: 0;
424  }
425  body.home-page .navbar.nav-v6.nav-scroll .container {
426    padding-top: 0;
427    padding-bottom: 0;
428  }
429  body.home-page .navbar.nav-v6 .header-logo {
430    height: 70px;
431  }
432  body.home-page .navbar.nav-v6.nav-scroll .header-logo {
433    height: 50px;
434  }
435  body.home-page .navbar.nav-v6 .header-logo img {
436    max-height: 100%;
437    max-width: 100%;
438  }
439  body.home-page .navbar.nav-v6.nav-scroll .header-logo img {
440    max-width: 80%;
441  }
442}
443
444
445.navbar-regular .navbar-collapse.collapse.in {
446  background-color: transparent;
447  width: 100%;
448}
449.navbar.nav-v6 .navbar-tabs {
450    background-color: #fff;
451    -webkit-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
452    -moz-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
453    box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
454}
455.navbar.nav-v6.nav-scroll .navbar-tabs {
456    background-color: #fff;
457    -webkit-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
458    -moz-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
459    box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
460}
461.drink-menu .navbar.nav-v6 .navbar-tabs {
462  background-color: #fff;
463  -webkit-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
464  -moz-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
465  box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
466}
467.drink-menu .navbar.nav-v6.nav-scroll .navbar-tabs {
468  background-color: #fff;
469  -webkit-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
470  -moz-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
471  box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
472}
473li.drop-down-link .sub-menu {
474  background-color: #fff;
475  color: #000;
476  }
477.nav-scroll li.drop-down-link .sub-menu {
478  background-color: #fff;
479  color: #000;
480}
481.drink-menu li.drop-down-link .sub-menu {
482  background-color: #fff;
483  color: #000;
484}
485.drink-menu .nav-scroll li.drop-down-link .sub-menu {
486  background-color: #fff;
487  color: #000;
488}
489li.drop-down-link .sub-menu a,
490li.drop-down-link div.drop-down {
491  color: #000;
492}
493.nav-scroll li.drop-down-link .sub-menu a,
494.nav-scroll li.drop-down-link div.drop-down {
495  color: #000;
496}
497.drink-menu li.drop-down-link .sub-menu a,
498.drink-menu li.drop-down-link div.drop-down {
499  color: #000;
500}
501.drink-menu .nav-scroll li.drop-down-link .sub-menu a,
502.drink-menu .nav-scroll li.drop-down-link div.drop-down {
503  color: #000;
504}
505
506.navbar-regular.nav-v6 .navbar-nav>li>a,
507.navbar-regular.nav-v6 .navbar-nav>li>a:hover,
508.navbar-regular.nav-v6 .navbar-nav>.active>a,
509.navbar-regular.nav-v6 .navbar-nav>.active>a:focus,
510.navbar-regular.nav-v6 .navbar-nav>.active>a:hover{
511  border: none;
512  background-color: transparent;
513  color: #B95737;
514}
515.navbar-regular.nav-v6 .navbar-nav>li>a {
516  color: #000;
517}
518.drink-menu .navbar.nav-v6 .navbar-nav>li>a {
519  color: #000;
520}
521.drink-menu .navbar-regular.nav-v6 .navbar-nav>li>a:hover,
522.drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a,
523.drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a:focus,
524.drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a:hover {
525  color: #B95737;
526}
527
528li.drop-down-link .sub-menu a:hover,
529li.drop-down-link .sub-menu a:focus {
530  color: #B95737;
531}
532.drink-menu li.drop-down-link .sub-menu a:hover,
533.drink-menu li.drop-down-link .sub-menu a:focus {
534  color: #B95737;
535}
536
537.drink-menu .navbar.nav-v7 .navbar-nav>li>a {
538  color: #000;
539}
540
541.navbar-regular.nav-v6 .navbar-toggle .icon-bar {
542  background-color: #000;
543}
544.drink-menu .navbar-regular.nav-v6 .navbar-toggle .icon-bar {
545  background-color: #000;
546}
547.navbar-regular.nav-v6 [aria-expanded="true"].navbar-toggle .icon-bar {
548  background-color: #B95737;
549}
550.drink-menu .navbar-regular.nav-v6 [aria-expanded="true"].navbar-toggle .icon-bar {
551  background-color: #B95737;
552}
553.navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a,
554.navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a:hover,
555.navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a,
556.navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:focus,
557.navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:hover {
558  border: none;
559  color: #B95737;
560}
561.navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a {
562  color: #000;
563}
564.drink-menu .navbar.nav-v6.nav-scroll .navbar-nav>li>a {
565  border: none;
566  color: #000;
567}
568.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a:hover,
569.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a,
570.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:focus,
571.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:hover {
572  color: #B95737;
573}
574
575.nav-scroll li.drop-down-link .sub-menu a:hover,
576.nav-scroll li.drop-down-link .sub-menu a:focus {
577  color: #B95737;
578}
579.drink-menu .nav-scroll li.drop-down-link .sub-menu a:hover,
580.drink-menu .nav-scroll li.drop-down-link .sub-menu a:focus {
581  color: #B95737;
582}
583
584.navbar-regular.nav-v6.nav-scroll .navbar-toggle .icon-bar {
585  background-color: #000;
586}
587.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-toggle .icon-bar {
588  background-color: #000;
589}
590.navbar-regular.nav-v6.nav-scroll [aria-expanded="true"].navbar-toggle .icon-bar {
591  background-color: #B95737;
592}
593.drink-menu .navbar-regular.nav-v6.nav-scroll [aria-expanded="true"].navbar-toggle .icon-bar {
594  background-color: #B95737;
595}
596.navbar.nav-v6 .header-logo-text{
597  color: #000;
598}
599.navbar.nav-v6.nav-scroll .header-logo-text{
600  color: #000;
601}
602.navbar.nav-v6 .social-icon{
603  color: #000;
604}
605.navbar.nav-v6.nav-scroll .social-icon{
606  color: #000;
607}
608.navbar.nav-v6 .social-square .contact-icon:hover {
609  color: #000;
610  background-color: #B95737;
611}
612.navbar.nav-v6.nav-scroll .social-square .contact-icon:hover {
613  color: #000;
614  background-color: #B95737;
615}
616
617.drink-menu .navbar.nav-v6 .header-logo-text{
618  color: #000;
619}
620.drink-menu .navbar.nav-v6.nav-scroll .header-logo-text{
621  color: #000;
622}
623.drink-menu .navbar.nav-v6 .social-icon{
624  color: #000;
625}
626.drink-menu .navbar.nav-v6.nav-scroll .social-icon{
627  color: #000;
628}
629.drink-menu .navbar.nav-v6 .social-square .contact-icon:hover {
630  color: #000;
631  background-color: #B95737;
632}
633.drink-menu .navbar.nav-v6.nav-scroll .social-square .contact-icon:hover {
634  color: #000;
635  background-color: #B95737;
636}
637.navbar.nav-v6 .navbar-tabs {
638  border-bottom: 1px solid transparent;
639}
640.navbar.nav-v6.nav-scroll .navbar-tabs {
641  border-bottom: 1px solid transparent;
642}
643.drink-menu .navbar.nav-v6 .navbar-tabs {
644  border-bottom: 1px solid transparent;
645}
646.drink-menu .navbar.nav-v6.nav-scroll .navbar-tabs {
647  border-bottom: 1px solid transparent;
648}
649@media (max-width: 767px) {
650  .navbar.nav-v6 {
651      background-color: #fff;
652      -webkit-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
653      -moz-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
654      box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
655  }
656  .navbar.nav-v6.nav-scroll {
657      background-color: #fff;
658      -webkit-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
659      -moz-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
660      box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
661  }
662  .drink-menu .navbar.nav-v6 {
663    background-color: #fff;
664    -webkit-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
665    -moz-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
666    box-shadow: 0px 4px 4px 0px rgba(0,0,0,0);
667  }
668  .drink-menu .navbar.nav-v6.nav-scroll {
669    background-color: #fff;
670    -webkit-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
671    -moz-box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
672    box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
673  }
674  .navbar.nav-v6 .container,
675  .navbar.nav-v6.nav-scroll .container,
676  .drink-menu .navbar.nav-v6 .container,
677  .drink-menu .navbar.nav-v6.nav-scroll .container {
678    border-bottom: none;
679  }
680  .navbar.nav-v6 .navbar-header {
681    border-bottom: 1px solid transparent;
682  }
683  .navbar.nav-v6.nav-scroll .navbar-header {
684    border-bottom: 1px solid transparent;
685  }
686  .drink-menu .navbar.nav-v6 .navbar-header {
687    border-bottom: 1px solid transparent;
688  }
689  .drink-menu .navbar.nav-v6.nav-scroll .navbar-header {
690    border-bottom: 1spx solid transparent;
691  }
692  li.drop-down-link .sub-menu,
693  .drink-menu li.drop-down-link .sub-menu {
694    background-color: transparent;
695  }
696  .nav-scroll li.drop-down-link .sub-menu,
697  .drink-menu .nav-scroll li.drop-down-link .sub-menu {
698    background-color: transparent;
699  }
700    .navbar-regular.nav-v6 .navbar-nav>li>a:hover,
701  .navbar-regular.nav-v6 .navbar-nav>.active>a,
702  .navbar-regular.nav-v6 .navbar-nav>.active>a:focus,
703  .navbar-regular.nav-v6 .navbar-nav>.active>a:hover{
704    background-color: #B95737;
705    color: #000;
706  }
707  .navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a:hover,
708  .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a,
709  .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:focus,
710  .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:hover{
711    background-color: #B95737;
712    color: #000;
713  }
714  .drink-menu .navbar-regular.nav-v6 .navbar-nav>li>a:hover,
715  .drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a,
716  .drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a:focus,
717  .drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a:hover{
718    background-color: #B95737;
719    color: #000;
720  }
721  .drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a:hover,
722  .drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a,
723  .drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:focus,
724  .drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:hover{
725    background-color: #B95737;
726    color: #000;
727  }
728
729  .navbar-regular.nav-v6 li.drop-down-link.active .drop-down .fa.fa-angle-up {
730    color: #000;
731  }
732  .navbar-regular.nav-v6.nav-scroll li.drop-down-link.active .drop-down .fa.fa-angle-up {
733    color: #000;
734  }
735  .drink-menu .navbar-regular.nav-v6 li.drop-down-link.active .drop-down .fa.fa-angle-up {
736    color: #000;
737  }
738  .drink-menu .navbar-regular.nav-v6.nav-scroll li.drop-down-link.active .drop-down .fa.fa-angle-up {
739    color: #000;
740  }
741}
742</style><!-- nav --><nav class="navbar nav-v4 nav-v6 nav-v7 nav-v8 nav-top navbar-regular navbar-fixed-top" id="navbar" role="navigation"><div id="skip"><a class="visuallyhidden skip-content" href="#content">Skip to main content</a></div><div class="desktop-navigation"><div class="navbar-tabs"><div class="container"><div class="navbar-content"><ul class="nav navbar-nav"><li class="logo-holder"><div class="header-logo logo-top"><img alt="Villa Dolce logo top - Homepage" aria-label="Homepage" class="img-responsive logo-top logo-image" role="link" src="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/logo.png" tabindex="0"/></div><div class="header-logo logo-scroll"><img alt="Villa Dolce logo scroll - Homepage" aria-label="Homepage" class="img-responsive logo-scroll logo-image" role="link" src="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/logo.png" tabindex="0"/></div></li><li class="nav-tab nav-menu-page"><a class="" href="/middleton-middleton-villa-dolce-food-menu" id="/Middleton-Middleton-Villa-Dolce-food-menu_link" target="_self">
743                        
744                      Menu
745                                          </a></li><li class="nav-tab"><a class="" href="/middleton-middleton-villa-dolce-drink-menu" id="/Middleton-Middleton-Villa-Dolce-drink-menu_link" target="_self">
746                        
747                      Drinks
748                                          </a></li><li class="nav-tab"><a class="" href="/middleton-middleton-villa-dolce-happy-hours-specials" id="/Middleton-Middleton-Villa-Dolce-happy-hours-specials_link" target="_self">
749                        
750                      Specials
751                                          </a></li><li class="nav-tab"><a class="" href="/middleton-middleton-villa-dolce-events" id="/Middleton-Middleton-Villa-Dolce-events_link" target="_self">
752                        
753                      Events
754                                          </a></li><li class="nav-tab nav-reservations-link"><a class="link-reservations-sh" href="/middleton-middleton-villa-dolce-reservations#" id="/Middleton-Middleton-Villa-Dolce-reservations#_link" target="_self">
755                        
756                      Reserve
757                                          </a></li><li class="nav-tab active nav-parties-link"><a class="link-parties-sh" href="/middleton-middleton-villa-dolce-party#" id="/Middleton-Middleton-Villa-Dolce-party#_link" target="_self">
758                        
759                      Parties
760                                          </a></li><li class="nav-tab nav-catering-link"><a class="link-catering-sh" href="/middleton-middleton-villa-dolce-catering#" id="/Middleton-Middleton-Villa-Dolce-catering#_link" target="_self">
761                        
762                      Catering
763                                          </a></li><li class="nav-tab gift-cards-nav"><a class="gift-cards-link" href="https://www.toasttab.com/villa-dolce/giftcards" id="gift-cards-link_link" target="_blank">
764                        
765                      Gift Cards
766                                          </a></li><li class="nav-tab drop-down-link"><a aria-expanded="false" class="drop-down" href="#" id="#_link1" role="button" target="">
767                        
768                      Order
769                                            <i aria-hidden="true" class="fa fa-angle-down"></i><i aria-hidden="true" class="fa fa-angle-up"></i></a><ul class="sub-menu"><li>
769<a class="sub-menu-link" href="https://slicelife.com/restaurants/wi/middleton/53562/villa-dolce/menu?utm_campaign=google-order-action-link&rwg_token=AFd1xnH8PPL7bYoR7G4wniMZWM030W-zT2f0mG5kqGG4Nj_Z3nLDh6AY5XZqv5d1iwIlx8rUfBObcYtvJhva0Yc9VS0uQs4OqQ%3D%3D" id="#_link1_option1" target="_self">
770                          Slice                          </a></li><li><a class="sub-menu-link" href="https://eatstreet.com/madison-wi/restaurants/villa-dolce-middleton?order-source=OWG_REDIRECT&rwg=1&rwg_token=AFd1xnEcAazYfNVx7SoM5q9EpX4IeVSJ7xxe06FTqtZuwZaidyyD5nS0FuD9rGJOKpr4f3uXl-IStnvgemanz9RYTcJbjfy8Bw%3D%3D" id="#_link1_option2" target="_blank">
771                          Eatstreet                          </a></li><li><a class="sub-menu-link" href="https://direct.restaurant/43699" id="#_link1_option3" target="_blank">
772                          Direct restaurant                          </a></li><li><a class="sub-menu-link" href="https://www.toasttab.com/local/order/villa-dolce/r-65ec5d48-6284-4b3a-9136-432f1da7d87c?diningOption=takeout&rwg_token=AFd1xnFfdsnlqGkUY_Tzry3mV87mMAVUJK_hYeK4_Ln-5d2YVqf8xNayowgmBsXjwdnHw1bVYwAgZByAF3hHJPSue4CfCOzcpA%3D%3D" id="#_link1_option4" target="_blank">
773                          Toast                          </a></li></ul></li><li class="nav-tab helper-tab"><a href="#" id="hidden_tab_r" target="_self"><span class="visuallyhidden">Go to top</span></a></li></ul><ul class="socialnav"><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.facebook.com/139026719469036" target="_blank"><i class="social-icon fa fa-facebook"></i><span>Facebook page</span></a></li><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.instagram.com/villadolcecafe" target="_blank"><i class="social-icon fa fa-instagram"></i><span>Instagram page</span></a></li><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.google.com/search?q=Villa+Dolce+1828+Parmenter+Street&oq=Villa+Dolce+1828+Parmenter+Street&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIHCAEQIRigATIHCAIQIRigAdIBCDE1NjlqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8#lrd=0x8807aed55416ecab:0xaca58778c8b83372,1,,,," target="_blank"><i aria-hidden="true" class="social-icon fa fa-google"></i><span>Google page</span></a></li></ul></div></div></div></div><div class="mobile-navigation"><div class="container"><a class="header-logo logo-top" href="/#"><img alt="Villa Dolce logo top - Homepage" aria-label="Homepage" class="img-responsive logo-top" src="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/logo.png"/></a><a class="header-logo logo-scroll" href="/"><img alt="Villa Dolce logo scroll - Homepage" aria-label="Homepage" class="img-responsive logo-scroll" src="https://static.spotapps.co/website_images/ab_websites/267357_website_v1/logo.png"/></a><ul class="socialnav"><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.facebook.com/139026719469036" target="_blank"><i class="social-icon fa fa-facebook"></i><span>Facebook page</span></a></li><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.instagram.com/villadolcecafe" target="_blank"><i class="social-icon fa fa-instagram"></i><span>Instagram page</span></a></li><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.google.com/search?q=Villa+Dolce+1828+Parmenter+Street&oq=Villa+Dolce+1828+Parmenter+Street&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIHCAEQIRigATIHCAIQIRigAdIBCDE1NjlqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8#lrd=0x8807aed55416ecab:0xaca58778c8b83372,1,,,," target="_blank"><i aria-hidden="true" class="social-icon fa fa-google"></i><span>Google page</span></a></li></ul><div class="navbar-header"><button class="navbar-toggle" data-target="#navbar-collapse-1" data-toggle="collapse" type="button"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button></div><div class="collapse navbar-collapse" id="navbar-collapse-1"><ul class="nav navbar-nav navbar-right"><li class=" nav-menu-page"><a class="" href="/middleton-middleton-villa-dolce-food-menu" id="mobile_/Middleton-Middleton-Villa-Dolce-food-menu_link" target="_self">
774                    Menu
775                    
776                </a></li><li class=" "><a class="" href="/middleton-middleton-villa-dolce-drink-menu" id="mobile_/Middleton-Middleton-Villa-Dolce-drink-menu_link" target="_self">
777                    Drinks
778                    
779                </a></li><li class=" "><a class="" href="/middleton-middleton-villa-dolce-happy-hours-specials" id="mobile_/Middleton-Middleton-Villa-Dolce-happy-hours-specials_link" target="_self">
780                    Specials
781                    
782                </a></li><li class=" "><a class="" href="/middleton-middleton-villa-dolce-events" id="mobile_/Middleton-Middleton-Villa-Dolce-events_link" target="_self">
783                    Events
784                    
785                </a></li><li class=" nav-reservations-link"><a class="link-reservations-sh" href="/middleton-middleton-villa-dolce-reservations#" id="mobile_/Middleton-Middleton-Villa-Dolce-reservations#_link" target="_self">
786                    Reserve
787                    
788                </a></li><li class="active nav-parties-link"><a class="link-parties-sh" href="/middleton-middleton-villa-dolce-party#" id="mobile_/Middleton-Middleton-Villa-Dolce-party#_link" target="_self">
789                    Parties
790                    
791                </a></li><li class=" nav-catering-link"><a class="link-catering-sh" href="/middleton-middleton-villa-dolce-catering#" id="mobile_/Middleton-Middleton-Villa-Dolce-catering#_link" target="_self">
792                    Catering
793                    
794                </a></li><li class=" gift-cards-nav"><a class="gift-cards-link" href="https://www.toasttab.com/villa-dolce/giftcards" id="mobile_gift-cards-link_link" target="_blank">
795                    Gift Cards
796                    
797                </a></li><li class=" drop-down-link"><a aria-expanded="false" class="drop-down" href="#" id="mobile_#_link1" role="button" target="">
798                    Order
799                                          <i aria-hidden="true" class="fa fa-angle-down"></i><i aria-hidden="true" class="fa fa-angle-up"></i></a><ul class="sub-menu"><li>
799<a class="sub-menu-link" href="https://slicelife.com/restaurants/wi/middleton/53562/villa-dolce/menu?utm_campaign=google-order-action-link&rwg_token=AFd1xnH8PPL7bYoR7G4wniMZWM030W-zT2f0mG5kqGG4Nj_Z3nLDh6AY5XZqv5d1iwIlx8rUfBObcYtvJhva0Yc9VS0uQs4OqQ%3D%3D" id="mobile_#_link1_option1" target="_self">
800                        Slice                        </a></li><li><a class="sub-menu-link" href="https://eatstreet.com/madison-wi/restaurants/villa-dolce-middleton?order-source=OWG_REDIRECT&rwg=1&rwg_token=AFd1xnEcAazYfNVx7SoM5q9EpX4IeVSJ7xxe06FTqtZuwZaidyyD5nS0FuD9rGJOKpr4f3uXl-IStnvgemanz9RYTcJbjfy8Bw%3D%3D" id="mobile_#_link1_option2" target="_blank">
801                        Eatstreet                        </a></li><li><a class="sub-menu-link" href="https://direct.restaurant/43699" id="mobile_#_link1_option3" target="_blank">
802                        Direct restaurant                        </a></li><li><a class="sub-menu-link" href="https://www.toasttab.com/local/order/villa-dolce/r-65ec5d48-6284-4b3a-9136-432f1da7d87c?diningOption=takeout&rwg_token=AFd1xnFfdsnlqGkUY_Tzry3mV87mMAVUJK_hYeK4_Ln-5d2YVqf8xNayowgmBsXjwdnHw1bVYwAgZByAF3hHJPSue4CfCOzcpA%3D%3D" id="mobile_#_link1_option4" target="_blank">
803                        Toast                        </a></li></ul></li></ul></div></div></div></nav></header><main id="content" role="main"><article><div class="pagecontent"><div class="tabs-container"><div class="scrolling"><div class="main-holder-tmt page-mode-light"><div class="text-holder"><h1 class="page-heading section-header page-title">Private Parties &amp; Group Events in Middleton</h1><p class="page-text">Anniversaries, birthdays, and bridal showers are just a few of the many occasions we host for private parties. Our space is also suited for different gatherings with friends, family, or colleagues.
804
805
806With a welcoming setting inspired by European cafes, Villa Dolce offers a relaxed spot for private events in Downtown Middleton. Our team focuses on providing attentive service so you and your guests can truly enjoy your time together.
807
808
809- We host private events for up to 12 guests.
810- Location: 1828 Parmenter Street, Middleton, WI (Downtown Middleton)
811
812
813Please fill out the form below, and we will do our best to accommodate your preferred date and help tailor your event to your needs.</p></div><div class="content-holder"><div class="column tmt-gallery"><div class="gallery-item" role="region"><p class="gallery-item-header">More photos</p><div class="images-holder"><img class="image" src="//static.spotapps.co/spots/80/a5e98136c849e6b360cf8ffa289843/wide_full" tabindex="0" role="button" alt="Restaurant interior, cozy dining area with set dining tables"/><img class="image" src="//static.spotapps.co/spots/34/7fe4162eaa4922bccc1fb13e7f71b2/wide_full" tabindex="0" role="button" alt="Interior space, cozy dining area with set tables"/><img class="image" src="//static.spotapps.co/spots/2b/873e1a264049a48d2eaeca4888752a/wide_full" tabindex="0" role="button" alt="Cozy interior dining area with set tables"/><img class="image" src="//static.spotapps.co/spots/91/af0b810020451ea3a9e87df3ad591d/wide_full" tabindex="0" role="button" alt="Cozy dining area with set tables"/><img class="image" src="//static.spotapps.co/spots/8a/6a69a8f4d9485d8581d86106d3fd7b/wide_full" tabindex="0" role="button" alt="Restaurant interior, cozy dining area with set dining tables suitable for smaller private parties"/><img class="image" src="//static.spotapps.co/spots/21/a47c4c30454397b981f80515779da6/wide_full" tabindex="0" role="button" alt="Restaurant interior, cozy dining room with set dining tables"/></div></div></div><div class="column tmt-form"><div class="custom-loader loader-1" id="loader"></div><iframe id="tmtIframe" class="tmt-iframe hide-iframe" src="https://tmt.spotapps.co/private-parties/parties_v2?spot_id=267357&source=pop_up&destination=private_parties&promotion=private_parties" title="Private Parties & Group Events in Middleton" frameborder="0" width="100%" height="100%" allowfullscreen="allowfullscreen" scrolling="no"></iframe></div></div><div id="imageModal" class="image-popup-overlay" aria-label="Full size image dialog" aria-hidden="true" role="dialog"><div class="image-popup-holder"><div class="image-wrapper"><button type="button" class="image-popup-close" aria-label="Close image popup"><span aria-hidden="true">x</span></button></div></div></div></div></div></div></div></article></main></div><style type="text/css">
814    .navbar-fixed-bottom.nav-v1 {
815        bottom: -100px;
816    }
817    .navbar-fixed-bottom.nav-v1 .nav.navbar-nav.navbar-right {
818        background-color: #fff;
819    }
820    .navbar-fixed-bottom.nav-v1 .bottom-svg-border path,
821    .navbar-fixed-bottom.nav-v1 .bottom-svg-border polygon {
822      fill: #000;
823    }
824    .navbar-fixed-bottom.nav-v1 .bottom-list-item a {
825        color: #000;
826    }
827    .navbar-fixed-bottom.nav-v1 .bottom-list-item a:hover,
828    .navbar-fixed-bottom.nav-v1 .bottom-list-item a:focus {
829        color: #B95737;
830    }
831</style><nav aria-label="mobile footer" class="navbar-fixed-bottom nav-v1" id="bottom-navbar"><div><ul class="nav navbar-nav navbar-right"><li class="bottom-list-item "><a class="bottom-link " href="https://slicelife.com/restaurants/wi/middleton/53562/villa-dolce/menu?utm_campaign=google-order-action-link&rwg_token=AFd1xnH8PPL7bYoR7G4wniMZWM030W-zT2f0mG5kqGG4Nj_Z3nLDh6AY5XZqv5d1iwIlx8rUfBObcYtvJhva0Yc9VS0uQs4OqQ%3D%3D" id="bottom_link_4" target="_self">
832                        Order                    </a></li><li class="bottom-list-item "><a class="bottom-link " href="/middleton-middleton-villa-dolce-reservations" id="bottom_link_3" target="_self">
833                        Reserve                    </a></li><li class="bottom-list-item "><a class="bottom-link " href="/middleton-middleton-villa-dolce-party" id="bottom_link_5" target="_self">
834                        Parties                    </a></li><li class="bottom-list-item "><a class="bottom-link " href="/middleton-middleton-villa-dolce-catering" id="bottom_link_6" target="_self">
835                        Catering                    </a></li></ul></div></nav>
835<script src="https://static.spotapps.co/web/villadolcecafe--com/lib/jquery/jquery.min.js"></script>
835<script src="https://static.spotapps.co/web/villadolcecafe--com/lib/bootstrap/js/bootstrap.min.js"></script>
835<script src="https://static.spotapps.co/web/villadolcecafe--com/js/tmt_script.js"></script>
835<script>
836
837	$("#bottom_link_4").on("click", function(){
838		if (ga_check())
839			universal_ga('send', 'event', 'Button', 'Click', 'Order Online');
840	});
841	$("#bottom_link_3").on("click", function(){
842		if (ga_check())
843			universal_ga('send', 'event', 'Button', 'Click', 'Reserve');
844	});
845	$("#bottom_link_5").on("click", function(){
846		if (ga_check())
847			universal_ga('send', 'event', 'Button', 'Click', 'Private Party');
848	});
849	$("#bottom_link_6").on("click", function(){
850		if (ga_check())
851			universal_ga('send', 'event', 'Button', 'Click', 'Catering');
852	});
853  $('.header-logo, .nav-v2-home-btn').click(function(event) {
854    if ( window.location.pathname == '/' || window.location.pathname == '/index.php') {
855      event.preventDefault();
856      var windowScrollTop = $(window).scrollTop();
857      if(windowScrollTop > 150) {
858        $('html, body').animate({scrollTop: 0}, 750);
859      }
860    }
861  });
862
863$(".banner-section a.banner-pin").click(function(e) {
864    // target element id
865    var id = $(this).attr('href');
866
867    // target element
868    var section = $(id);
869    if (section.length === 0) {
870        return;
871    }
872
873    // prevent standard hash navigation (avoid blinking in IE)
874    e.preventDefault();
875
876    // top position relative to the document
877    var pos = section.offset().top - 100 + 10;
878
879    // animated top scrolling
880    $('body, html').animate({scrollTop: pos}, 750);
881});
882
883$(document).ready(function() {
884  var navHeight = $('nav.navbar').height();
885  $('html').css("scroll-padding-top", navHeight);
886});
887
888var called_v8_scroll = false;
889
890$(document).on('scroll', function (e) {
891    if($(document).scrollTop() > 0) {
892      $('.navbar.nav-v7').addClass('nav-scroll');
893      $('.navbar.nav-v7').removeClass('nav-top');
894      if (2 !=2 && 2 == 2) {
895        if(!called_v8_scroll) {
896          setTimeout(function(){
897            setHelperTabWidth();
898            called_v8_scroll = true;
899          }, 300);
900        }
901      }
902    }else {
903      $('.navbar.nav-v7').removeClass('nav-scroll');
904      $('.navbar.nav-v7').addClass('nav-top');
905      if (2 != 2 && 2 == 2) {
906        $('#hidden_tab_r').width(0);
907        $('#hidden_tab_l').width(0);
908        $('.navbar-nav li.nav-tab').first().css('margin-left', '0px');
909        $('.navbar-nav li.nav-tab').last().css('margin-right', '0px');
910        called_v8_scroll = false;
911      }
912    }
913});
914
915$(function() {
916  setDropDownMenuWidth();
917
918  function setDropDownMenuWidth() {
919    var tabs_list = $('.navbar-tabs .navbar-nav');
920
921    $(tabs_list).find('li.drop-down-link').each(function() {
922      var sub_menu_width = $(this).outerWidth(true);
923      if (sub_menu_width < 100) {
924        sub_menu_width = 100;
925      }
926      $(this).find('.sub-menu').css('width', sub_menu_width+'px');
927    });
928  }
929
930  $( window ).resize(function() {
931    setDropDownMenuWidth();
932  });
933  $( window ).load(function() {
934    setDropDownMenuWidth();
935  });
936
937});
938
939
940
941$( '.drop-down-link .drop-down' ).click(function(event) {
942  event.preventDefault();
943  event.stopPropagation();
944
945  var drop_down = $(this).closest('.drop-down-link');
946  var drop_down_a = $(this);
947
948  if($(drop_down_a).attr("aria-expanded") == "true") { 
949    $(drop_down_a).attr("aria-expanded",false)
950  } else { 
951    $(drop_down_a).attr("aria-expanded",true)
952  }
953
954  
955  var sub_menu = $(this).closest('.drop-down-link').find( '.sub-menu' );
956
957  if ( $(sub_menu).is( ':hidden' ) ) {
958    $(sub_menu).slideDown();
959    $(drop_down).addClass('active');
960  } else {
961    $(sub_menu).slideUp();
962    $(drop_down).removeClass('active');
963  }
964});
965
966//// Set width for corresponding helper tab or margin for first or last nav tab depending on calculeted width sum of left and right tabs
967function setHelperTabWidth() {
968  var nav_tab_width;
969  var tabs_left_width = 0;
970  var tabs_right_width = 0;
971
972  var full_nav_tab_width;
973  var full_tabs_left_width = 0;
974  var full_tabs_right_width = 0;
975
976  $('li.nav-tab').each(function( index, element ) {
977
978    nav_tab_width = $(element).find('a').width();
979    full_nav_tab_width = $(element).outerWidth(true);
980
981    if (!($(element).hasClass('helper-tab'))) {
982      if (index<5) {
983        tabs_left_width += nav_tab_width;
984        full_tabs_left_width += full_nav_tab_width;
985      } else {
986        tabs_right_width += nav_tab_width;
987        full_tabs_right_width += full_nav_tab_width;
988      }
989    } else {
990      if(index == 0) {
991        full_tabs_left_width += full_nav_tab_width;
992      } else {
993        full_tabs_right_width += full_nav_tab_width;
994      }
995    }
996
997  });
998
999  var tabs_width_differance = tabs_left_width - tabs_right_width;
1000  var helper_value = Math.abs(tabs_width_differance);
1001  var full_tabs_width_differance = full_tabs_left_width - full_tabs_right_width;
1002
1003  // if sum of left tabs width is smaller than rigth tabs width tabs_width_differance is negative set margin left for first tab
1004  if (full_tabs_width_differance != 0) {
1005    if (tabs_width_differance < 0) {
1006      $('.navbar-nav li.nav-tab').first().css('margin-left', helper_value+'px');
1007    } else {
1008      $('.navbar-nav li.nav-tab').last().css('margin-right', helper_value+'px');
1009    }
1010  }
1011  
1012}
1013
1014$(function() {
1015  setNavTabsWidth();
1016
1017  function setNavTabsWidth() {
1018    var container_width = $('.navbar-tabs .container').outerWidth();
1019    var social_icons_width = $('.navbar-tabs .socialnav').outerWidth(true);
1020    var reduced_tabs_width = container_width - (2 * social_icons_width) -10;
1021
1022    $('.navbar-tabs .navbar-content').width(reduced_tabs_width);
1023
1024    // helper value set in case logo is centered and tabs width sum on the left and on the right are not the same
1025    if (2 == 2) {
1026      setTimeout(function(){
1027        setHelperTabWidth();
1028        $('.navbar.nav-v8 .desktop-navigation .navbar-nav').css('opacity', '1');
1029      }, 300);
1030
1031    }
1032  }
1033
1034  $( window ).resize(function() {
1035      setNavTabsWidth();
1036  });
1037
1038  $('.nav a:not(.drop-down)').on('click', function () {
1039    $('.navbar-collapse').collapse('hide');
1040  });
1041
1042});
1043
1044$('.logo-holder .logo-image').click(function(event) {
1045  if ( window.location.pathname == '/' || window.location.pathname == '/index.php') {
1046    var windowScrollToTop = $(window).scrollTop();
1047    if(windowScrollToTop > 150) {
1048      $('html, body').animate({scrollTop: 0}, 750);
1049    }
1050  } else {
1051      window.location = "/";
1052  }
1053});
1054    setTimeout(function(){
1055        $('.navbar-fixed-bottom.nav-v1').addClass('show-bottom-nav'); triggerShowFooterEvents();
1056    }, 4000);
1057</script>
1057<script>
1058(function() {
1059  var name = "Villa Dolce";
1060  var pid = "ChIJq-wWVNWuB4gRcjO4yHiHpaw";
1061  function build_url() {
1062    var q = encodeURIComponent(name).replace(/'/g, "%27");
1063    return "https://www.google.com/maps/search/?api=1"
1064         + "&query=" + q
1065         + "&query_place_id=" + encodeURIComponent(pid);
1066  }
1067  window.google_map_url = build_url();
1068  window.open_google_map = function() {
1069    window.open(build_url(), "_blank");
1070  };
1071})();
1072</script>
1072<script>
1073
1074  var spot_id = 267357;
1075  var sh_generic_form_params=JSON.parse('{"generic_contact_form_active":true,"texting_permissions_active":true,"title":"Contact us","instructions":"Please fill out the form and we will be in touch.","reasons":["To host a special event","To get a special event catered","To reserve a table","To apply for a job","Other Questions"],"custom_hours":"","hours":"","active_tmt_cta_links":{"cta_private_party":"https://villadolcecafe.com/-party","cta_catering":"https://villadolcecafe.com/-catering","cta_reservations":"https://villadolcecafe.com/-reservations","cta_jobs":null},"spot_name":"Villa Dolce","label_for_texting_permission":"I’d like to get texts about specials, events, and other exclusive offers and announcements not available to general public"}');
1076
1077  if (false){
1078    console.log("Check SpotHopper configuration. Probably there is no 'WEBSITE::DOMAIN_NAME' key for your website");
1079  }
1080
1081  if (navigator.userAgent.match(/iPhone/i)
1082       || navigator.userAgent.match(/iPad/i)
1083       || navigator.userAgent.match(/iPod/i)){
1084      $(document).ready(function(){
1085            document.body.className += " " + "webkit-mobile-body";
1086      });
1087    }
1088
1089  var promotion_url_param_domain = getPromotionUrlParams()['domain'];
1090  if ( promotion_url_param_domain && ( new URL(document.location).host == 'localhost:4000' || new URL(document.location).host == 'wcache.spotapps.co' ||  new URL(document.location).host == 'website-editor.spotapps.co' || new URL(document.location).host == 'website-editor-staging.spotapps.co' || new URL(document.location).host == 'wcache-staging.spotapps.co')){
1091    $("a[href^='/']").each(function(){
1092      if (this.href.indexOf('domain=') == -1){
1093        var sh_internal_url = new URL(this.href);
1094        sh_internal_url.searchParams.set("domain", promotion_url_param_domain);
1095        this.href = sh_internal_url.toString();
1096      }
1097    })
1098  }
1099
1100
1101  function cta_link_matches_href(href, url){
1102    var domain = 'villadolcecafe.com';
1103    if(typeof url === 'undefined'){
1104      return false;
1105    }
1106    var partsOfURL = url.split(domain);
1107    if (partsOfURL.length != 2){
1108      return href == url;
1109    }else{
1110      var urlPath = partsOfURL[1];
1111      if (urlPath.substring(0,1) == "/"){
1112        urlPath = urlPath.substring(1,urlPath.length);
1113      }
1114      return href.indexOf(urlPath, domain.length + href.indexOf(domain)-1) !== -1;
1115    }
1116  }
1117
1118  var all_cta_links = [{"id":1661683,"spot_id":267357,"url":"https://villadolcecafe.com/-reservations","cta_link_type":"reservations","created_at":"2025-11-13T17:34:14+00:00","updated_at":null,"made_of_food":false,"link_name":"Reservations","target":null,"website_footer_label":"Reserve","position":1},{"id":1343201,"spot_id":267357,"url":"https://villadolcecafe.com/-specials","cta_link_type":"specials","created_at":"2025-03-26T10:08:00+00:00","updated_at":"2025-04-08T09:26:58+00:00","made_of_food":false,"link_name":"","position":null},{"id":1120910,"spot_id":267357,"url":"https://villadolcecafe.com/-party","cta_link_type":"private_parties","created_at":"2024-10-25T21:21:44+00:00","updated_at":"2025-04-08T09:26:58+00:00","made_of_food":false,"link_name":"Private Parties","target":null,"website_footer_label":"Parties","position":3},{"id":1343202,"spot_id":267357,"url":"https://villadolcecafe.com/-events","cta_link_type":"events","created_at":"2025-03-26T10:08:00+00:00","updated_at":"2025-04-08T09:26:58+00:00","made_of_food":false,"link_name":"","position":null},{"id":1343203,"spot_id":267357,"url":"https://villadolcecafe.com/-drink-menu","cta_link_type":"drink_menu","created_at":"2025-03-26T10:08:00+00:00","updated_at":"2025-04-08T09:26:58+00:00","made_of_food":false,"link_name":"","position":null},{"id":1343204,"spot_id":267357,"url":"https://villadolcecafe.com/-food-menu","cta_link_type":"food_menu","created_at":"2025-03-26T10:08:01+00:00","updated_at":"2025-04-08T09:26:58+00:00","made_of_food":false,"link_name":"","position":null},{"id":1120909,"spot_id":267357,"url":"https://villadolcecafe.com/-catering","cta_link_type":"catering","created_at":"2024-10-25T21:21:44+00:00","updated_at":"2025-04-08T09:26:58+00:00","made_of_food":false,"link_name":"Catering","target":null,"website_footer_label":"Catering","position":4},{"id":1362107,"spot_id":267357,"url":"https://www.toasttab.com/villa-dolce/giftcards","cta_link_type":"gift_cards","created_at":"2025-04-08T09:26:58+00:00","updated_at":null,"made_of_food":false,"link_name":"","target":null,"website_footer_label":"Gift Cards","position":5},{"id":1758833,"spot_id":267357,"url":"https://slicelife.com/restaurants/wi/middleton/53562/villa-dolce/menu?utm_campaign=google-order-action-link&rwg_token=AFd1xnH8PPL7bYoR7G4wniMZWM030W-zT2f0mG5kqGG4Nj_Z3nLDh6AY5XZqv5d1iwIlx8rUfBObcYtvJhva0Yc9VS0uQs4OqQ%3D%3D","cta_link_type":"order","created_at":"2026-01-20T07:29:07+00:00","updated_at":null,"made_of_food":false,"link_name":"Slice","target":null,"website_footer_label":"Order","position":0},{"id":1758835,"spot_id":267357,"url":"https://direct.restaurant/43699","cta_link_type":"order3","created_at":"2026-01-20T07:29:07+00:00","updated_at":null,"made_of_food":false,"link_name":"Direct restaurant","target":null,"website_footer_label":"Order","position":null},{"id":1758834,"spot_id":267357,"url":"https://eatstreet.com/madison-wi/restaurants/villa-dolce-middleton?order-source=OWG_REDIRECT&rwg=1&rwg_token=AFd1xnEcAazYfNVx7SoM5q9EpX4IeVSJ7xxe06FTqtZuwZaidyyD5nS0FuD9rGJOKpr4f3uXl-IStnvgemanz9RYTcJbjfy8Bw%3D%3D","cta_link_type":"order2","created_at":"2026-01-20T07:29:07+00:00","updated_at":null,"made_of_food":false,"link_name":"Eatstreet","target":null,"website_footer_label":"Order","position":null},{"id":1758836,"spot_id":267357,"url":"https://www.toasttab.com/local/order/villa-dolce/r-65ec5d48-6284-4b3a-9136-432f1da7d87c?diningOption=takeout&rwg_token=AFd1xnFfdsnlqGkUY_Tzry3mV87mMAVUJK_hYeK4_Ln-5d2YVqf8xNayowgmBsXjwdnHw1bVYwAgZByAF3hHJPSue4CfCOzcpA%3D%3D","cta_link_type":"order4","created_at":"2026-01-20T07:29:08+00:00","updated_at":null,"made_of_food":false,"link_name":"Toast","target":null,"website_footer_label":"Order","position":null}];
1119
1120  function find_cta_link(href) {
1121    for (var i=0; i< all_cta_links.length; i++){
1122      var cta_link = all_cta_links[i];
1123      if ( cta_link_matches_href(href, cta_link.url)){
1124        return cta_link;
1125      }
1126    }
1127  }
1128
1129  function find_cta_links(href) {
1130    var cta_links = []
1131    for (var i=0; i< all_cta_links.length; i++){
1132      var cta_link = all_cta_links[i];
1133      if ( cta_link_matches_href(href, cta_link.url)){
1134        cta_links.push(cta_link);
1135      }
1136    }
1137    return cta_links;
1138  }
1139
1140
1141  function get_current_page_cta_link_types(){
1142    var types = [];
1143    var cta_links = find_cta_links(document.location.href);
1144    for (var i=0; i<cta_links.length; i++){
1145      types.push(cta_links[i].cta_link_type);
1146    }
1147    return types;
1148  }
1149
1150
1151  function is_food_menu_page(){
1152    var cta_link_types = get_current_page_cta_link_types();
1153    for (var i=0; i<cta_link_types.length; i++){
1154      if ('food_menu' == cta_link_types[i])
1155        return true;
1156    }
1157    return false;
1158  }
1159
1160
1161  function get_form_cat_from_cta(){
1162    var cta_link = find_cta_link(document.location.href);
1163    if (cta_link == null) {
1164        return null;
1165    }
1166    if (cta_link.cta_link_type == 'private_parties'){
1167        return 'private_party';
1168    }else if (cta_link.cta_link_type == 'reservations'){
1169        return 'reservation';
1170    }else if (cta_link.cta_link_type == 'catering'){
1171        return 'catering';
1172    }else if (cta_link.cta_link_type == 'job_listing'){
1173        return 'job_listings';
1174    }else if (cta_link.cta_link_type == 'gift_cards'){
1175          return 'gift_cards';
1176    }
1177    return null;
1178  }
1179
1180  function element_has_events_defined(elem){
1181    if ($._data(elem, "events") === undefined){
1182      return false;
1183    }
1184    return true;
1185  }
1186
1187  function create_ga_events_for_cta_clicks(){
1188    if (typeof $ === 'function'){
1189
1190      var cta_link_of_the_page = find_cta_link(location.href);
1191
1192
1193      $("a").each(function(index, elem){
1194        var href = $(elem).attr('href');
1195
1196        if (href  === undefined ){
1197           return;
1198        }
1199
1200        if (href.substring(0,4) == 'tel:'){
1201          if (!element_has_events_defined(elem)){  // not footer links
1202            $(elem).on("click", function(){
1203                universal_ga('send', 'event', {
1204                  eventCategory: 'Button',
1205                  eventAction: 'Click',
1206                  eventLabel: 'Phone',
1207                  transport: 'beacon'
1208                });
1209             });
1210
1211             if (cta_link_of_the_page){
1212                $(elem).on("click", function(){
1213                    universal_ga('send', 'event', {
1214                      eventCategory: 'Button',
1215                      eventAction: 'Click',
1216                      eventLabel: cta_link_of_the_page.cta_link_type +  ' page phone',
1217                      transport: 'beacon'
1218                    });
1219                 });
1220             }
1221          } else {
1222             if (cta_link_of_the_page){
1223               $(elem).on("click", function(){
1224                   universal_ga('send', 'event', {
1225                        eventCategory: 'Button',
1226                        eventAction: 'Click',
1227                        eventLabel: cta_link_of_the_page.cta_link_type +  ' page phone footer',
1228                        transport: 'beacon'
1229                   });
1230               });
1231             }
1232          }
1233
1234
1235        }else{
1236          var cta_link = find_cta_link(href);
1237          if (elem.className != null && elem.className.indexOf("bottom-link") > -1){
1238            // console.log("bottom link detected");
1239          }else{
1240            if (cta_link != null){
1241              $(elem).on("click", function(){
1242                universal_ga('send', 'event', {
1243                        eventCategory: 'Website Link',
1244                        eventAction: 'Click',
1245                        eventLabel: cta_link.cta_link_type,
1246                        transport: 'beacon'
1247                  });
1248              });
1249            }
1250          }
1251        }
1252
1253
1254      });
1255    }
1256  }
1257
1258  if (typeof angular === "undefined") {
1259    create_ga_events_for_cta_clicks();
1260  } else {
1261    angular.element(document).ready(function () {
1262      create_ga_events_for_cta_clicks();
1263    });
1264  }
1265
1266
1267  function triggerShowFooterEvents(){
1268    if (window.screen.availWidth < 768){
1269        universal_ga('send', 'event', {
1270                eventCategory: 'Mobile Footer',
1271                eventAction: 'View',
1272                eventLabel: '',
1273                transport: 'beacon'
1274          });
1275    }
1276  }
1277
1278
1279
1280
1281  ////////////
1282  function smartFooterV2()
1283  {
1284    var list= document.getElementsByClassName("bottom-list-item");
1285    if (!list) return;
1286
1287    if (document.getElementById("bottom-navbar") == null){
1288      return;
1289    }
1290
1291    var bottomNav = document.querySelector('#bottom-navbar .navbar-nav');
1292    var footerLinkPaddingLeft = $('#bottom-navbar .navbar-nav li a').css('padding-left');
1293    var footerLinkPaddingRight = $('#bottom-navbar .navbar-nav li a').css('padding-right');
1294
1295    bottomNav.innerHTML = '';
1296    var linksWithPosition = all_cta_links.filter(e => e.position != null && e.position >= 0);
1297    linksWithPosition.sort(function(a,b) {
1298      return a.position - b.position;
1299    });
1300
1301    var footerLinkStyle = (footerLinkPaddingLeft == '0px' || footerLinkPaddingRight == '0px' ? 'style="padding-left: 8px; padding-right: 8px;"' : '');
1302
1303    linksWithPosition.forEach((e, i) => {
1304        var target = e.target || getUrlTarget(e.url);
1305        bottomNav.insertAdjacentHTML('beforeend',
1306        `<li class="bottom-list-item" style="white-space: nowrap;width: auto;"><a ${footerLinkStyle} class="bottom-link smart-footer-link" data-type="${e.cta_link_type}" data-position="${i}" target="${target}" href="${e.url}">${e.website_footer_label}</a></li>`);
1307    })
1308
1309    var intervalCount = 0
1310    var interval = setInterval(() => {
1311      if(intervalCount == 50){
1312        clearInterval(interval);
1313      }
1314      removeOverflowingFooterLinks();
1315      intervalCount ++;
1316    }, 200);
1317
1318    $('.smart-footer-link').on("click", function(){
1319          if (typeof shUrlParams !== "undefined" && shUrlParams['source'] === undefined){
1320                    shUrlParams['source'] = 'footer';
1321                    sessionStorage.setItem('shUrlParams', JSON.stringify(shUrlParams));
1322          }
1323
1324          var visibleLinks = $('.smart-footer-link').map(function (e) {
1325              return $(this).data('type');
1326          }).toArray().join(',');
1327
1328          universal_ga('send', 'event', {
1329                  eventCategory: 'Button',
1330                  eventAction: 'Click_footer_2',
1331                  eventLabel: "type:" + $(this).data('type') + "|position:" + $(this).data('position') + "|visible:" + visibleLinks,
1332                  transport: 'beacon'
1333            });
1334    });
1335  }
1336
1337  function removeOverflowingFooterLinks(){
1338    var bottomNavLinks = document.querySelectorAll('#bottom-navbar .navbar-nav li');
1339    var width_sum = 0;
1340
1341    bottomNavLinks.forEach(e => {
1342      width_sum += e.getBoundingClientRect().width;
1343      if ((width_sum) > window.innerWidth) {
1344        console.log(`%cLink %c${e.textContent} %cdeleted couldn't fit screen`,"color: #fff;background: #202124;", "background: red;color: #fff", "color: #fff;background: #202124;");
1345        e.remove();
1346      }
1347    });
1348  }
1349
1350  function getUrlTarget(url){
1351    if(url.startsWith('tel')){
1352      return '_self';
1353    }
1354    if(url.startsWith('/') || url.includes('tmt.spotapps.co') || url.includes(window.location.host)){
1355      return '_self';
1356    }
1357    return '_blank';
1358  }
1359
1360  function npb()
1361    {
1362    	var list= document.getElementsByClassName("bottom-list-item");
1363    	if (!list) return;
1364
1365      if (document.getElementById("bottom-navbar") == null){
1366        return;
1367      }
1368
1369      var url = ""
1370    	for (var i=0; i < all_cta_links.length; i++)
1371    	{
1372    		if (all_cta_links[i].cta_link_type == "order"){
1373          url = all_cta_links[i].url;
1374        }
1375    	}
1376
1377    	if ( url == ""){
1378        return;
1379      }
1380
1381    	for (i=0; i < list.length; i++)
1382    	{
1383    		console.log(cta_link_matches_href(list[i].firstChild.href, url));
1384    		if (cta_link_matches_href(list[i].firstChild.href,url))  return;
1385
1386    	};
1387
1388    	var item = list[list.length-1]
1389    	document.getElementById("bottom-navbar").getElementsByClassName("nav navbar-nav")[0].appendChild(item.cloneNode(true));
1390    	var width_sum = 0;
1391    	for (i=0; i < list.length; i++) {
1392    		width_sum += list[i].getBoundingClientRect().width;
1393    	}
1394
1395    	var item = list[list.length-1]
1396    	if ((width_sum - 10) > window.innerWidth) { item.parentNode.removeChild(item); console.log("link deleted couldn't fit screen"); return; }
1397
1398    	item.firstChild.text = "Order";
1399    	item.firstChild.href = url;
1400    	item.firstChild.id = "bottom_link_" + list.length;
1401
1402      $(item.firstChild).on("click", function(){
1403
1404          if (typeof shUrlParams !== "undefined" && shUrlParams['source'] === undefined){
1405                    shUrlParams['source'] = 'footer';
1406                    sessionStorage.setItem('shUrlParams', JSON.stringify(shUrlParams));
1407                  }
1408
1409          universal_ga('send', 'event', {
1410                  eventCategory: 'Button',
1411                  eventAction: 'Click',
1412                  eventLabel: 'Plan B-2 Order',
1413                  transport: 'beacon'
1414            });
1415      });
1416
1417
1418    }
1419
1420function activateSmartFooter(){
1421    var smart_footer_active = true;
1422    var smart_footer_version = 2;
1423    var man_bottom_active = false;
1424    if(window.location.hash == '#smartFooterV2=enabled'){
1425      smartFooterV2();
1426      return;
1427    }
1428    if (smart_footer_active && !man_bottom_active){
1429      if(smart_footer_version == 2 ){
1430          smartFooterV2();
1431       }else {
1432          npb();
1433       }
1434    }
1435  }
1436
1437  activateSmartFooter();
1438
1439  var corona_config_str = '{"id":319803,"spot_id":267357,"promote_pick_up":true,"promote_gift_cards":true,"promote_happy_hour":true,"promote_events":true,"instructions_on_food_page":false,"food_page_instruction_text":null,"food_page_instruction_phone":"6088330033","created_at":"2024-10-25T21:19:35+00:00","updated_at":"2024-10-30T17:47:41+00:00","food_page_button_color":null,"food_page_button_text_color":null,"food_page_link_color":null,"food_page_text_color":null,"wine_and_beer_to_go_license":false,"all_alcoholic_to_go_lincense":false,"current_operating_status":"Offering To Go and Dine-in with Full Capacity","contact_tracing_active":false,"contact_tracing_text":"In cooperation with health guidelines for contact tracing, please fill out the form below.","contact_tracing_address_required":false,"collapse_all":false,"deliveries_priority_value":3,"pick_ups_priority_value":3,"reservations_priority_value":3,"private_parties_priority_value":3,"catering_priority_value":5,"gift_cards_priority_value":3,"jobs_priority_value":0,"food_and_drinks_priority_value":3,"specials_priority_value":3,"national_days_priority_value":3,"holidays_priority_value":3,"sports_priority_value":3,"walk_ins_priority_value":3,"collecting_emails_priority_value":3,"collecting_phone_numbers_priority_value":3,"growing_social_media_followers_priority_value":3,"increasing_revenue_vs_saving_time_priority_value":3,"events_priority_value":3,"shopping_cart_type":"TMT","shopping_cart_active":false}';
1440  var corona_config =  corona_config_str != '' ?  JSON.parse('{"id":319803,"spot_id":267357,"promote_pick_up":true,"promote_gift_cards":true,"promote_happy_hour":true,"promote_events":true,"instructions_on_food_page":false,"food_page_instruction_text":null,"food_page_instruction_phone":"6088330033","created_at":"2024-10-25T21:19:35+00:00","updated_at":"2024-10-30T17:47:41+00:00","food_page_button_color":null,"food_page_button_text_color":null,"food_page_link_color":null,"food_page_text_color":null,"wine_and_beer_to_go_license":false,"all_alcoholic_to_go_lincense":false,"current_operating_status":"Offering To Go and Dine-in with Full Capacity","contact_tracing_active":false,"contact_tracing_text":"In cooperation with health guidelines for contact tracing, please fill out the form below.","contact_tracing_address_required":false,"collapse_all":false,"deliveries_priority_value":3,"pick_ups_priority_value":3,"reservations_priority_value":3,"private_parties_priority_value":3,"catering_priority_value":5,"gift_cards_priority_value":3,"jobs_priority_value":0,"food_and_drinks_priority_value":3,"specials_priority_value":3,"national_days_priority_value":3,"holidays_priority_value":3,"sports_priority_value":3,"walk_ins_priority_value":3,"collecting_emails_priority_value":3,"collecting_phone_numbers_priority_value":3,"growing_social_media_followers_priority_value":3,"increasing_revenue_vs_saving_time_priority_value":3,"events_priority_value":3,"shopping_cart_type":"TMT","shopping_cart_active":false}') : null;
1441
1442
1443  //corona instuctions
1444  function show_corona_instructions(text, phone, btnText){
1445    //format to US number
1446    var match = phone.match(/^(\d{3})(\d{3})(\d{4})$/);
1447
1448    if(corona_config.shopping_cart_type == "TMT" && corona_config.shopping_cart_active == true) {
1449        var linkLocation = "https://tmt.spotapps.co/ordering-menu/?spot_id="+corona_config.spot_id+"&images=yes&accordion=true";
1450        var btnLinkLocation = "https://tmt.spotapps.co/ordering-menu/?spot_id="+corona_config.spot_id+"&images=yes&accordion=true";
1451    }else {
1452        var linkLocation = 'tel:+1'+phone+'';
1453        var btnLinkLocation = 'tel:+1'+ match[1] + '-' + match[2] + '-' + match[3] +''
1454    }
1455    var appendPhone = 'tel:+1'+phone+'';
1456    //inject html content
1457    if ($('.food-menu-nav').length) {
1458      //new template
1459      var pageEl =  $('.food-menu-nav').css('margin','20px auto 10px auto');
1460      var textColor = rgb2hex($('.section-header').css('color'));
1461      var linkColor = rgb2hex($('.food-menu-nav-item.active').css('background-color'));
1462      var fontSize = parseInt($('.food-menu-nav-item').css('font-size'));
1463      fontSize = fontSize + Math.round(fontSize  * 0.25);
1464
1465      // var html = '<div id="show-corona-instructions" style="padding:20px;flex: 0 1 100%;" class="text-center"><p style="color:'+textColor+';">'+text+' <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="color:'+linkColor+';"href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></p><a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="font-size:'+fontSize+'px" class="food-menu-nav-item custom-temp-btn hvr-fade active" href="tel:+1'+phone+'">'+btnText+'</a></div>';
1466      var html = '<div id="show-corona-instructions" style="padding:20px;flex: 0 1 100%;" class="text-center"><p style="color:'+textColor+';">'+text+' <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="text-decoration: underline;color:'+textColor+';" href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></p><a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="display: inline-block !important;font-size:'+fontSize+'px" class="food-menu-nav-item custom-temp-btn hvr-fade active" href="'+btnLinkLocation +'">'+btnText+'</a></div>';
1467
1468    }else {
1469      //old template
1470      var pageEl = $('.tabnav');
1471      var textColor = rgb2hex($('.menu-item-name-traditional').css('color'));
1472      var linkColor = rgb2hex($('.style-traditional .tabnav .nav>li.active>a').css('color'));
1473
1474      var linkTextColor = getContrast50(linkColor);
1475      var fontSize = parseInt($('.menu-item-name-traditional').css('font-size'));
1476      fontSize = fontSize + Math.round(fontSize  * 0.25);
1477      var textTransform = $('.style-traditional .tabnav .nav>li>a').css('text-transform');
1478
1479      // var html = '<div id="show-corona-instructions" style="padding:20px;flex: 0 1 100%;" class="text-center"><p style="color:'+textColor+';margin-bottom:20px;">'+text+' <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="color:'+linkColor+';"href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></p><a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="margin: 20px auto; padding: 10px 50px 10px 30px; cursor: pointer; background-color: '+linkColor+'; background: '+linkColor+'; text-decoration: none; color: '+textColor+'; border: 2px solid '+linkColor+';font-size:'+fontSize+'px;text-transform: '+textTransform+'" href="tel:+1'+phone+'">'+btnText+'</a></div>';
1480      var html = '<div id="show-corona-instructions" style="padding:20px;flex: 0 1 100%;" class="text-center"><p style="color:'+textColor+';margin-bottom:20px;">'+text+' <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="text-decoration: underline;color:'+textColor+';"href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></p><a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="margin: 20px auto; padding: 10px 30px 10px 30px; cursor: pointer; background-color: '+linkColor+'; background: '+linkColor+'; text-decoration: none; color: '+linkTextColor+'; border: 2px solid '+linkColor+';font-size:'+fontSize+'px;text-transform: '+textTransform+'" href="'+btnLinkLocation+'">'+btnText+'</a></div>';
1481
1482    }
1483     //html content
1484    pageEl.prepend(html);
1485  }
1486
1487  function rgb2hex(rgb) {
1488    if(typeof rgb !== "undefined"){
1489      rgbColor = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
1490      if (!rgbColor) {
1491        rgba = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(,\s*\d+\.*\d+)?\)$/);
1492        return "#" + hex(rgba[1]) + hex(rgba[2]) + hex(rgba[3]);
1493      }
1494      function hex(x) {
1495          return ("0" + parseInt(x).toString(16)).slice(-2);
1496      }
1497      return "#" + hex(rgbColor[1]) + hex(rgbColor[2]) + hex(rgbColor[3]);
1498    }
1499    return rgb;
1500  }
1501
1502  function getContrast50(hexcolor){
1503    return (parseInt(hexcolor, 16) > 0xffffff/2) ? '#000':'#fff';
1504  }
1505
1506  function show_corona_sidebar_instructions(text, phone){
1507    //format to US number
1508    var match = phone.match(/^(\d{3})(\d{3})(\d{4})$/);
1509    var divWidth = 230;
1510    var top = 50;
1511    var linkSize = '1.6em';
1512    var pSize = $('p').css('font-size');
1513    var appendPhone = 'tel:+1'+phone+'';
1514
1515    if ($(window).width() < 1600)
1516      var top = 30;
1517    if ($(window).width() < 1200){
1518      var divWidth = 180;
1519      var linkSize = '1.4em';
1520      var pSize ='1.1em';
1521    }
1522
1523    if($('.food-menu-nav').length){ //new template
1524      var textColor = $('.food-menu-nav-item.active').css('color');
1525      var linkColor = $('.food-menu-nav-item.active').css('background-color');
1526
1527      var linkTextColor = $('.food-menu-nav-item.active').css('color');
1528      var parent = $('.food-menu-page');
1529    }
1530    else { //old template
1531      var textColor = $('.menu-item-name-traditional').css('color');
1532      var linkColor = $('.style-traditional .tabnav .nav>
1532li.active>a').css('color');
1533      var parent = $('.food-menu').length ? $('.food-menu') : $('.drink-menu');
1534      var linkTextColor = getContrast50(linkColor);
1535    }
1536
1537    // $(parent).append('<div id="corona-instructions-sidebar" style="display:none;position:fixed;width:'+divWidth+'px;top:'+top+'vh;right:0;background-color:'+linkColor+';padding:15px;text-align:center;color:'+textColor+';text-transform:uppercase;"><p style="margin:0 0 5px;font-size:'+pSize+';">'+text+'</p><i class="fa fa-phone" aria-hidden="true"></i> <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Food Page Side Element Phone\');"  style="font-size:'+linkSize+';color:'+textColor+';" href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></div>');
1538    $(parent).append('<div id="corona-instructions-sidebar" style="display:none;position:fixed;width:'+divWidth+'px;top:'+top+'vh;right:0;background-color:'+linkColor+';padding:15px;text-align:center;color:'+linkTextColor+';text-transform:uppercase;"><p style="margin:0 0 5px;font-size:'+pSize+';">'+text+'</p><i class="fa fa-phone" aria-hidden="true"></i> <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Food Page Side Element Phone\');this.href=\'' + appendPhone + '\';"  style="font-size:'+linkSize+';color:'+linkTextColor+';" href="/call-us/'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></div>');
1539
1540    //check if resolution is bigger than tablet resolution
1541/*  if ($(window).width() > 991) {
1542      //detect scroll
1543      window.onscroll = function (e) {
1544      if ($(window).scrollTop() == 0) {
1545          $('#corona-instructions-sidebar').hide();
1546        }else {
1547          $('#corona-instructions-sidebar').show();
1548        }
1549      }
1550    } */
1551  }
1552
1553  function check_corona_config(config){
1554    console.log(config)
1555    if (config) {
1556      if (config.instructions_on_food_page && config.food_page_instruction_text && config.food_page_instruction_phone) {
1557        if (!config.promote_deliveries && config.promote_pick_up) {
1558          var btnText = 'Call For Pick Up';
1559        }
1560        if (config.promote_deliveries && !config.promote_pick_up) {
1561          var btnText = 'Call For Delivery';
1562        }
1563        if (config.promote_deliveries && config.promote_pick_up) {
1564          var btnText = 'Call For Pick Up Or Delivery';
1565        }
1566
1567        if(typeof btnText !== "undefined"){ // check if pick up or delivery are true
1568          if(config.shopping_cart_type == "TMT" && config.shopping_cart_active == true) {
1569                var btnText = 'ORDER NOW';
1570                    if($('.food-menu-nav').length){ //new template
1571                      var textColor = rgb2hex($('.section-header').css('color'));
1572                      var linkColor = rgb2hex($('.food-menu-nav-item.active').css('background-color'));
1573                      var fontSize = parseInt($('.food-menu-nav-item').css('font-size'));
1574                      fontSize = fontSize + Math.round(fontSize  * 0.25);
1575                    }
1576                    else { //old template
1577                        var textColor = rgb2hex($('.menu-item-name-traditional').css('color'));
1578                        var linkColor = rgb2hex($('.style-traditional .tabnav .nav>li.active>a').css('color'));
1579
1580                        var linkTextColor = getContrast50(linkColor);
1581                        var fontSize = parseInt($('.menu-item-name-traditional').css('font-size'));
1582                        fontSize = fontSize + Math.round(fontSize  * 0.25);
1583                    }
1584                show_corona_instructions('For online orders, use our own <a style="text-decoration:underline;color: '+textColor+';" href="https://tmt.spotapps.co/ordering-menu/?spot_id='+config.spot_id+'&images=yes&accordion=true#"> commission free ordering platform! </a> or call:', config.food_page_instruction_phone, btnText);
1585                show_corona_sidebar_instructions(btnText, config.food_page_instruction_phone);
1586            } else {
1587                show_corona_instructions(config.food_page_instruction_text, config.food_page_instruction_phone, btnText);
1588                show_corona_sidebar_instructions(btnText, config.food_page_instruction_phone);
1589            }
1590
1591        }
1592      }
1593    }
1594  }
1595
1596
1597  if (is_food_menu_page() && !window.location.search.includes("contactless=true")){
1598    $( document ).ready(function() {
1599       setTimeout(function(){
1600        check_corona_config(corona_config);
1601       }, 300);
1602    });
1603  }
1604
1605
1606
1607  function isPhone(phone){
1608      var regex = /^(\+\d{1,2}\s?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/;
1609      return regex.test(phone);
1610  }
1611
1612  function sendEmail_MT (input_id) {
1613    const $loader = $("[data-id=newsletter-widget-2] .sph-loading-img");
1614
1615    const $step = {
1616      form: $("[data-id=newsletter-widget-2] .sph-email-form"),
1617      message: $("[data-id=newsletter-widget-2] .sph-response-message"),
1618    }
1619
1620    const $field = {
1621      email: $("[data-id=newsletter-widget-2] #sph-newsletter-input-" + input_id),
1622      phone: $("[data-id=newsletter-widget-2] #sph-newsletter-phone-" + input_id),
1623      consent: $("[data-id=newsletter-widget-2] #sph-newsletter-checkbox-phone-" + input_id),
1624    };
1625
1626    const $error = {
1627      email: $("[data-id=newsletter-widget-2] #sph-newsletter-email-error-" + input_id),
1628      phone: $("[data-id=newsletter-widget-2] #sph-newsletter-phone-error-" + input_id),
1629    };
1630
1631    if ($field.email.val().trim() === "") {
1632        $error.email
1633          .html("This field is required")
1634          .show();
1635    }
1636    else if (!isEmail($field.email.val().trim())) {
1637      $error.email
1638        .html("Please use the format “[email protected]”")
1639        .show();
1640    } else {
1641      $error.email
1642        .html("")
1643        .hide();
1644    }
1645
1646    if ($field.consent.is(':checked') && $field.phone.val().trim() === "") {
1647      $error.phone
1648        .html("This field is required")
1649        .show();
1650    } else if ($field.phone.val().trim().length > 0 && !isPhone($field.phone.val().trim())) {
1651      $error.phone
1652        .html("The phone number must contain 10 digits")
1653        .show();
1654    } else {
1655      $error.phone
1656        .html("")
1657        .hide();
1658    }
1659
1660    const errorField = $step.form.find('.sh-form-error:visible');
1661
1662    if (errorField.length > 0) {
1663      const input = errorField.first().next();
1664
1665      document.activeElement.blur();
1666
1667      setTimeout(() => {
1668        input.focus();
1669      }, 160)
1670
1671      return;
1672    }
1673
1674    $loader
1675      .show()
1676      .prev()
1677      .hide();
1678
1679    $.ajax({
1680      method: "POST",
1681      url: "https://www.spothopperapp.com/api/spots/267357/contacts/add_with_texting_permission",
1682      crossDomain: true,
1683      dataType: 'json',
1684      data: {
1685        email: $field.email.val().trim(),
1686        phone: $field.phone.val().trim(),
1687        texting_permission: $field.consent.is(':checked'),
1688      },
1689      success: function (data) {
1690        afterRequestSubmission(data);
1691      },
1692      error: function () {
1693        afterRequestSubmission("Something went wrong. Please try again later.");
1694      }
1695    });
1696
1697    function afterRequestSubmission (data) {
1698      $step.form.hide();
1699
1700      $step.message
1701        .html(data)
1702        .show()
1703        .trigger('focus');
1704    }
1705  }
1706</script>
1706<script>function addPromotionParamsToTMTLinks()
1707{
1708    if (sessionStorage.getItem('shUrlParams')) {
1709        let shParams = JSON.parse(sessionStorage.getItem('shUrlParams'));
1710        if (!Object.keys(shParams).length)
1711            return;
1712        if(!shParams.source)
1713            return;
1714        $('a').each(function () {
1715            if (this.href.includes('tmt.spotapps.co')) {
1716                if(this.href.includes('&source=') || this.href.includes('&destination=') || this.href.includes('&promotion='))
1717                    return;
1718
1719                this.href = this.href + '&source=' + shParams.source;
1720                if(shParams.destination)
1721                    this.href = this.href + '&destination=' + shParams.destination;
1722                if(shParams.promotion)
1723                    this.href = this.href + '&promotion=' + shParams.promotion;
1724                if(shParams.fb_post_id)
1725                    this.href = this.href + '&fb_post_id=' + shParams.fb_post_id;
1726                if(shParams.email_post_id)
1727                    this.href = this.href + '&email_post_id=' + shParams.email_post_id;
1728            }
1729        })
1730    }
1731}
1732setTimeout(function() {
1733  addPromotionParamsToTMTLinks();
1734  addFooterToSourceParam();
1735},600)
1736
1737function addFooterToSourceParam()
1738{
1739    $('.bottom-link').each(function (){
1740        if(shouldAddSourceParam(this.href))
1741          this.href = this.href + '&source=footer';
1742    })
1743    $('#sh-multiple-links-content-holder a').each(function (){
1744       if(shouldAddSourceParam(this.href))
1745          this.href = this.href + '&source=footer';
1746    })
1747}
1748function shouldAddSourceParam(link){
1749  if (link.includes('tmt.spotapps.co') && !link.includes('&source=')){
1750    return true;
1751  }
1752  return false;
1753}
1754</script>
1754<script>
1755;(async () => {
1756if (typeof window.focusTrap === 'undefined') {
1757    await getScript('https://unpkg.com/tabbable/dist/index.umd.js');
1758    await getScript('https://unpkg.com/focus-trap/dist/focus-trap.umd.js');
1759}
1760
1761document.querySelectorAll('.modal').forEach((element) => {
1762    const trap = window.focusTrap?.createFocusTrap(element, {
1763        allowOutsideClick: true,
1764    });
1765
1766    $(element).on('shown.bs.modal', () => {
1767	    trap?.activate();
1768	});
1769
1770	$(element).on('hidden.bs.modal', () => {
1771        trap?.deactivate();
1772    });
1773});
1774
1775async function getScript (source) {
1776    return new Promise((resolve, reject) => {
1777        const script = document.createElement('script');
1778        script.src = source;
1779        script.async = true;
1780
1781        script.onload = resolve;
1782        script.onerror = reject;
1783
1784        document.head.appendChild(script);
1785    });
1786}
1787})();
1788</script>
1788<script src="https://wcache-plugins.spotapps.co/production/wcpl_bootstrap_ada_fix/wcpl_bootstrap_ada_fix.js"></script>
1788<link href="https://wcache-plugins.spotapps.co/production/wcpl_bday_club/wcpl_bday_club.css" rel="stylesheet" media="screen"/>
1788<script src="https://wcache-plugins.spotapps.co/production/wcpl_bday_club/wcpl_bday_club.js"></script>
1788<script src="https://wcache-plugins.spotapps.co/production/wcpl_ga_tracking/wcpl_ga_tracking.js"></script>
1788<script src="https://wcache-plugins.spotapps.co/production/wcpl_media_controls/script.js"></script>
1788<link href="https://wcache-plugins.spotapps.co/production/wcpl_website_editor_interpreter/website_interpreter_helper_style.css" rel="stylesheet" media="screen"/>
1788<script>var changes_log_array = {};</script>
1788<script src="https://wcache-plugins.spotapps.co/production/wcpl_website_editor_interpreter/website_interpreter.js"></script>
1788<script>(() => {
1789    function onInitIFrame() {
1790        let loaded = false;
1791        const iframe = document.getElementById("tmtIframe");
1792        if (!iframe) return;
1793
1794        function loadIFrame() {
1795            if (loaded) return;
1796            loaded = true;
1797            frameTMTpageV2Init();
1798        }
1799
1800        iframe.addEventListener("load", () => {
1801            loadIFrame();
1802        }, { once: true });
1803
1804        setTimeout(() => {
1805            if (loaded) return;
1806            iframe.src = iframe.src; 
1807        }, 100);
1808    }
1809
1810    function frameTMTpageV2Init() {
1811        const iframe_element = document.getElementById("tmtIframe");
1812        const tmt_iframe_holder = document.querySelector(".tmt-form");
1813
1814        if (!iframe_element || !tmt_iframe_holder) return;
1815
1816        function setIframeHolderHeight(iframe_height, unit) {
1817            const loader = document.getElementById("loader");
1818            if (iframe_height) {
1819                clearInterval(intervalId);
1820                tmt_iframe_holder.style.height = iframe_height + unit;
1821                if (loader) {                
1822                    loader.style.display = "none";               
1823                }
1824                iframe_element.classList.remove("hide-iframe");
1825            } 
1826        }
1827
1828        const current_location_url = window.location.href;
1829        const iframe = iframe_element.contentWindow;
1830
1831        const message_object = {
1832            locationURL: current_location_url,
1833            paddingTop: 0.1,
1834            resize: false,
1835        };
1836
1837        const intervalId = setInterval(() => {
1838            iframe.postMessage(message_object, '*');
1839        }, 500);    
1840        
1841        setTimeout(() => {
1842            clearInterval(intervalId);
1843        }, 30000);
1844
1845        window.addEventListener(
1846            "message",
1847            function (event) {
1848                if (event.data.tmtPageHeight) {
1849                    const iframe_holder_height_calc = event.data.tmtPageHeight;
1850                    setIframeHolderHeight(iframe_holder_height_calc, "px");
1851                }
1852                if (event.data.tmtScrollTo) {
1853                    window.scrollTo({
1854                        top: event.data.tmtScrollTo,
1855                        behavior: "smooth",
1856                    });
1857                }
1858            },
1859            false
1860        );
1861
1862        function debounce(func) {
1863            let timer;
1864            return function (event) {
1865                if (timer) clearTimeout(timer);
1866                timer = setTimeout(func, 200, event);
1867            };
1868        }
1869        window.addEventListener(
1870            "resize",
1871            debounce(function (e) {
1872                calculatePagePadding();
1873                message_object.resize = true;
1874                iframe.postMessage(message_object, "*");
1875            })
1876        );
1877    }
1878
1879    function calculatePagePadding() {
1880        function getNavigationHeight() {
1881            const nav_element = document.getElementById("navbar");
1882            if (!nav_element) return 0;
1883
1884            const nav_height = nav_element.clientHeight;
1885            return nav_height;
1886        }
1887
1888        const mainHolder = document.querySelector(".main-holder-tmt");
1889        if (!mainHolder) return;
1890
1891        mainHolder.style.paddingTop = getNavigationHeight() + "px";
1892    }
1893
1894    function onInitGallery() {
1895        const imagePopupOverlay = document.querySelector(".image-popup-overlay");
1896        if (!imagePopupOverlay) return;
1897
1898        const imageWrapper = imagePopupOverlay.querySelector(".image-wrapper");
1899        const closeButton = imagePopupOverlay.querySelector(".image-popup-close");
1900        const gallery = document.querySelector(".tmt-gallery");
1901        const galleryImgFormat = "w926";
1902        let lastFocused = null;
1903
1904        if (!gallery || !imageWrapper) return;
1905
1906        function setAriaLabels(gallery) {
1907            gallery.querySelectorAll('.image').forEach(img =>
1908                img.setAttribute('aria-label', img.alt ? 'Open full size image of ' + img.alt : 'Open full size image')
1909            );
1910
1911            gallery.querySelectorAll('.gallery-item').forEach(galleryItem => {
1912                const galleryTitle = galleryItem.querySelector('.gallery-item-header')?.textContent.trim() || '';
1913                galleryItem.setAttribute('aria-label', galleryTitle + ' gallery');
1914            });
1915        }
1916
1917        function changeImageFormat(url) {
1918            const lastSlashIndex = url.lastIndexOf("/");
1919            if (lastSlashIndex === -1) return url;
1920            return url.slice(0, lastSlashIndex + 1) + galleryImgFormat;
1921        }
1922
1923        function getImgElement() {
1924            let popupImage = imagePopupOverlay.querySelector(".popup-image");
1925            if (!popupImage) {
1926                popupImage = document.createElement("img");
1927                popupImage.classList.add("popup-image");
1928                imageWrapper.appendChild(popupImage);
1929            }
1930            return popupImage;
1931        }
1932
1933        function closeImage() {
1934            document.querySelectorAll("body > :not(:has(#imageModal)), .main-holder-tmt > :not(#imageModal), header").forEach((el) => el.removeAttribute("inert"));
1935
1936            let popupImage = imagePopupOverlay.querySelector(".popup-image");
1937            imagePopupOverlay.classList.remove("is-open");
1938            document.body.classList.remove("image-popup-open");
1939            imagePopupOverlay.setAttribute("aria-hidden", "true");
1940            imagePopupOverlay.removeEventListener("click", onBackdropClick);
1941            document.removeEventListener("keydown", onEscapeClose);
1942            if (closeButton) closeButton.removeEventListener("click", closeImage);
1943            if (lastFocused && lastFocused.focus) lastFocused.focus();
1944
1945            popupImage.onerror = null;
1946            popupImage.src = "";
1947            popupImage.alt = "";
1948        }
1949
1950        function onEscapeClose(e) {
1951            if (e.key === "Escape" && imagePopupOverlay.getAttribute("aria-hidden") === "false") {
1952                closeImage();
1953            }
1954        }
1955
1956        function onBackdropClick(e) {
1957            const element = e.target;
1958            if (!element.classList.contains("popup-image")) {
1959                closeImage();
1960            }
1961        }
1962
1963        function openImage(imageUrl, imageAlt) {
1964            const popupImage = getImgElement();
1965            popupImage.onerror = function () {
1966                this.onerror = null;
1967                this.src = imageUrl;
1968            };
1969            popupImage.src = changeImageFormat(imageUrl);
1970            popupImage.alt = imageAlt ? imageAlt : "";
1971
1972            imagePopupOverlay.classList.add("is-open");
1973            document.body.classList.add("image-popup-open");
1974            lastFocused = document.activeElement;
1975            imagePopupOverlay.setAttribute("aria-hidden", "false");
1976            imagePopupOverlay.setAttribute("tabindex", "-1");
1977            imagePopupOverlay?.focus({ preventScroll: true });
1978
1979            imagePopupOverlay.addEventListener("click", onBackdropClick);
1980            document.addEventListener("keydown", onEscapeClose);
1981            if (closeButton) {
1982                closeButton.addEventListener("click", closeImage);
1983            }
1984
1985            document.querySelectorAll("body > :not(:has(#imageModal)), .main-holder-tmt > :not(#imageModal), header").forEach((el) => el.setAttribute("inert", "true"));
1986        }
1987
1988        setAriaLabels(gallery);
1989
1990        gallery.addEventListener("click", (e) => {
1991            const element = e.target;
1992            if (element.classList.contains("image")) {
1993                openImage(element.src, element.alt);
1994            }
1995        });
1996
1997        gallery.addEventListener("keydown", (e) => {
1998            const element = e.target;
1999            if (!element.classList.contains("image") || imagePopupOverlay.getAttribute("aria-hidden") === "false") {
2000                return;
2001            }
2002            if (e.key === "Enter" || e.key === " ") {
2003                e.preventDefault();
2004                openImage(element.src, element.alt);
2005            }
2006        });
2007    }
2008
2009    document.addEventListener("DOMContentLoaded", function () {
2010        onInitIFrame();
2011        calculatePagePadding();
2012        onInitGallery();
2013    });
2014})();</script>
2014</body></html>

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.