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 & 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.