Toronto Prohibition & Spirits Tour

North America’s Wild Past Comes to Toronto.


Join us for history, hidden corners, and tasting as we uncover the secrets of Toronto’s prohibition past!

Explore Prohibition History: Learn how Toronto’s Gooderham and Worts Distillery supplied millions of gallons of alcohol to the U.S. and Canada during the wild 1920s & 30s Prohibition years. Our expert local guides will share captivating stories about the distillery and its role in shaping North American drinking culture – while you roam through Toronto’s only pedestrian neighbourhood.

Beginner Spirits Tasting: Your tour concludes with a curated tasting of Canadian spirits – a perfect way to appreciate the legacy of Gooderham and Worts.

Tour Details:


Duration:
Approximately 1 hour and 20 minutes
Booking Times: Saturdays & Sundays at 1:30 PM
Price: $53 + HST per person (includes all tastings)
Tour Size: Minimum 2, maximum 12 participants
Meeting Point: Go Tours Canada – 11 Gristmill Lane
Participant Requirements: Must be 19+ with valid ID to join the tasting

Private Group Bookings: Looking for a custom experience? Private group tours and alternate times can be arranged.

Our guide can follow a fully accessible route upon request. Please let us know in advance to make arrangements.

An explosion of flavour awaits your mouth on the Distillery District Breakfast Tour. Hot drinks and luxurious bites - discover a new side of the Distillery on our tour.
Indulge in rich coffee & sensational biscotti on our Distillery District Breakfast tour.

Our Toronto Prohibition and Spirits Tour is a journey through the stories, secrets, and spirits of Toronto’s past. Experience the Gooderham and Worts Distillery during the wild west era of the 1920s and 30s. Learn about Al Capone, Rocco Perri, and the Canadian booze makers that kept 2 countries toasting during Prohibition.

/* Go Tours Canada — Team Building — JS (v4.43) */ /* Paste into Divi > Theme Options > Integration > "body" box, wrapped in . */ (function() { 'use strict'; // Divi's Integration "body" code is injected at the TOP of , before the // page content. Defer all setup until the DOM is parsed so the builder markup // (and the containers this script fills) actually exist when we run. function gtcInit() { // Guard against double-execution if Divi enqueues the script twice if (window.__gtcInit) return; // No-op on any page that doesn't contain the builder (safe for site-wide load) if (!document.getElementById('groupSize')) return; window.__gtcInit = true; // ============================================= // STATE + DATA // ============================================= var state = { exp: null, price: 0, group: 0, tastings: new Set(), grat: null }; var currentModalExp = null; var currentTastingModal = null; var expNames = { 'walking-no': 'Walking Tour', 'walking-tasting': 'Walking Tour + Tasting', 'prohibition': 'Prohibition & Spirits Tour', 'breakfast': 'Breakfast Tour', 'yorkville': 'Yorkville Lunch Hour', 'full-ride': 'The Full Ride', 'segway': 'Segway Tour', 'custom': 'Custom Experience', 'custom-segway': 'Custom Segway Experience' }; var expData = { 'walking-no':{title:'Classic Distillery District Walking Tour',desc:"Our classic 60-minute route through the Distillery District. Easy pace, photogenic streets, and 20 years of local storytelling. The budget-friendly starting point for corporate groups of any size. Morning and afternoon timing available.",expect:"Small groups, 60 minutes of comfortable walking with plenty of photo stops. Rain or shine. The Distillery has more covered walkways and sheltered courtyards than most people realize.",feats:['Rain-or-shine','Any group size','Most flexible scheduling','Distillery District'],photos:['https://www.gotourscanada.com/wp-content/uploads/2026/06/Walking-Tour-1.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Walking-Tour2.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Walking-Tour-3.jpg']}, 'walking-tasting':{title:'Distillery District Walking Tour + Tasting',desc:"Our most popular corporate team building experience since 2005. The classic Distillery District walk plus one deluxe artisan tasting from our local partners. Perfect for groups of 25+ who want a relaxed experience with flexible add-ons. Indoor backup locations available.",expect:"1.5 hours including tasting stop. Select your included tasting in Step 3, or upgrade to a premium tasting for just $4 more per person.",feats:['1 tasting included','Rain-or-shine','Best for 25+','Indoor backup','Distillery District'],photos:['https://www.gotourscanada.com/wp-content/uploads/2026/06/WalkingTasting-1.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/WalkingTasting-2.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/WalkingTasting-3.jpg']}, 'prohibition':{title:'Toronto Prohibition & Spirits Tour',desc:"Bootlegging tales, hidden history, and a spirits tasting flight at one of our premium Distillery District partners. The go-to wind-down for corporate teams after a day of meetings or conferences. Custom start times available for your group.",expect:"Small groups, 75 minutes of storytelling and a sit-down spirits tasting. Ideal for client hosting, conference breakout activities, and evening team events.",feats:['Spirits flight included','Conference favourite','Client hosting','Custom start times','Distillery District'],photos:['https://www.gotourscanada.com/wp-content/uploads/2026/06/Prohibition-1.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Prohibition-2.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Prohibition-3.jpg']}, 'breakfast':{title:'Distillery District Breakfast Tour',desc:"Premium coffee, pastries, and a breezy morning route through the Distillery District. Teams arrive at your conference energized and connected. Start times from 8am, steps from downtown Toronto hotels and convention centres.",expect:"75 minutes with multiple food stops. Vegetarian-friendly. The perfect start for all-day events, offsites, and conferences in or near the Distillery District.",feats:['Multiple tastings included','Vegetarian friendly','From 8am','Near downtown hotels','Distillery District'],photos:['https://www.gotourscanada.com/wp-content/uploads/2026/06/Breakfast-Tour-1.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Breakfast-Tour-2.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Breakfast-Tour-3.jpg']}, 'full-ride':{title:'The Full Ride: Segway, Walking & Tasting',desc:"Ninety minutes, three ways to explore the Distillery District: Segway ride, guided walk, and a premium tasting. Groups rotate in pods of 8 so nobody waits around. Our flagship corporate team building experience for offsites that want adventure and smiles.",expect:"30-min Segway with professional training, 30-min guided walk, 30-min premium tasting. Seamless pod rotations keep the energy up. 150,000+ riders trained since 2005.",feats:['Segway + Walk + Taste','8-24 guests','Pro safety training','Flagship experience','Distillery District'],photos:['https://www.gotourscanada.com/wp-content/uploads/2026/06/Full-Ride-Segway-Tour.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Full-Ride-Spirits-Tasting.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Full-Ride-Walking-Tour.jpg']}, 'segway':{title:'Distillery District Segway Tour',desc:"Pure Segway fun through the Distillery District with training from experienced instructors. We've trained 150,000+ riders since 2005. Toronto's only Segway tour. Best for small executive teams wanting something active and memorable.",expect:"60 minutes including professional training. All riders must be 12+ and 100-280 lbs. Big grins not mandatory but likely.",feats:['Training included','3-8 guests','Toronto exclusive','150K+ riders trained','Distillery District'],photos:['https://www.gotourscanada.com/wp-content/uploads/2026/06/Segway-1.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Segway-2.jpg','https://www.gotourscanada.com/wp-content/uploads/2026/06/Segway-3.jpg']}, 'yorkville':{title:'Yorkville Lunch Hour Stretch',desc:"A 60-minute midday walking tour through Yorkville, one of Toronto's most upscale neighbourhoods. Perfect for conference attendees at nearby luxury hotels, the ROM, or the Royal Conservatory looking for a refreshing break between sessions. Galleries, historic homes, and hidden courtyards.",expect:"Comfortable pace through Yorkville. Easy scheduling around conference lunch breaks. Meet at a central Yorkville location shared upon booking.",feats:['Near luxury hotels','ROM / Royal Conservatory','Midday conference break','Any group size','Yorkville'],photos:['https://images.unsplash.com/photo-1519501025264-65ba15a82390?w=300&q=80','https://images.unsplash.com/photo-1555396273-367ea4eb4db5?w=300&q=80','https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=300&q=80']}, 'custom':{title:'Custom Corporate Experience',desc:"Tell us what you need and we'll build it. Every custom event starts with a guided neighbourhood introduction through the Distillery District or Yorkville, then we layer on tastings, extend the route, or combine neighbourhoods. From intimate groups to 100+ people, we've been doing this since 2005.",expect:"Your event includes a 30-minute guided neighbourhood walk as a starting point. Add tastings, extend the tour, split your group across experiences. We'll send a custom quote within 24 hours.",feats:['Guided intro walk included','Fully custom','Any group size','Multi-neighbourhood','We build it together'],photos:['https://images.unsplash.com/photo-1587974928442-77dc3e0dba72?w=300&q=80','https://images.unsplash.com/photo-1558618666-fcd25c85f82e?w=300&q=80','https://images.unsplash.com/photo-1569529465841-dfecdab7503b?w=300&q=80']}, 'custom-segway':{title:'Custom Segway Experience',desc:"Your Segway ride, your tasting pick. Combine a Segway tour with any of our Distillery District tasting partners for a hands-on team event. Pricing starts at $62/pp which includes the Segway tour and one tasting of your choice. Add more tastings or extend the experience from there.",expect:"60-minute Segway tour with professional training, plus a tasting stop at your chosen partner. Upgrade to premium tastings or add more stops. 3-24 guests.",feats:['Segway + 1 tasting','Choose your tasting','Pro safety training','3-24 guests','Distillery District'],photos:['https://images.unsplash.com/photo-1632236542159-809925128485?w=300&q=80','https://images.unsplash.com/photo-1558618666-fcd25c85f82e?w=300&q=80','https://images.unsplash.com/photo-1569529465841-dfecdab7503b?w=300&q=80']} }; // ============================================= // TASTINGS — single source of truth for BOTH the cards and the info modal. // card* fields drive the grid card; the remaining fields drive the modal. // Card copy and modal copy differ deliberately, so both are kept here. // MODAL COPY IS DRAFT (Aaron to edit/verify) — real partner businesses; // verify any specific claims (awards, "only", founding facts) before launch. // Array order = render order (and mobile stacking order within each tier). // ============================================= var TASTINGS = [ { id:'soma', type:'deluxe', price:19, thumb:'https://www.gotourscanada.com/wp-content/uploads/2026/06/Soma-Tasting.jpg', cardName:'Soma Chocolate', cardNameTag:null, cardDesc:'Award winning Bean-to-bar chocolate. A rich, easygoing stop packing major flavour. A favourite pairing with Mill Street or Old Flame.', tier:'Deluxe Tasting · $19/person', title:'Soma Chocolate', desc:"A guided chocolate tasting with one of the Distillery District's best-loved chocolate makers. Your group samples a curated selection while learning a little about how the chocolate is made on site.", expect:"A short, relaxed tasting led by the shop. Vegetarian-friendly; ask us about dairy-free options when you book.", feats:['Bean-to-bar','Vegetarian-friendly','Distillery District'], priceLabel:'$19 per person' }, { id:'mill-street', type:'deluxe', price:19, thumb:'https://www.gotourscanada.com/wp-content/uploads/2026/06/Mill-St.-Tasting.jpg', cardName:'Mill Street Brewery', cardNameTag:null, cardDesc:'A craft beer flight at a Distillery District landmark. Easy, sociable, and the classic way to loosen up a group after a walk.', tier:'Deluxe Tasting · $19/person', title:'Mill Street Brewery', desc:"A craft beer flight at a Distillery District brewing landmark. Your group tastes a range of styles with a few notes on what makes each one distinct.", expect:"A guided flight of craft beers. Guests must be 19+ with valid ID. Non-alcoholic alternatives available with advance notice.", feats:['Craft beer flight','19+ with ID','Distillery District'], priceLabel:'$19 per person' }, { id:'izumi', type:'deluxe', price:19, thumb:'https://www.gotourscanada.com/wp-content/uploads/2026/06/Izumi-Tasting.jpg', cardName:'Izumi Sake', cardNameTag:null, cardDesc:'Japanese Sake, brewed right in the Distillery District. A genuinely unique tasting from Japan to the heart of Toronto.', tier:'Deluxe Tasting · $19/person', title:'Izumi Sake', desc:"A sake tasting at a sake brewery right in the Distillery District. A genuinely different tasting experience your team likely hasn't done before.", expect:"A guided sake tasting. Guests must be 19+ with valid ID. Non-alcoholic alternatives available with advance notice.", feats:['Sake tasting','19+ with ID','Distillery District'], priceLabel:'$19 per person' }, { id:'sweet-escapes', type:'deluxe', price:19, thumb:'https://www.gotourscanada.com/wp-content/uploads/2026/06/SweetEscapes-Tasting.jpg', cardName:'Sweet Escapes', cardNameTag:null, cardDesc:'Boutique desserts made to share, with take-home treats if you want to send everyone off happy. The sweet finish to a memorable day in the Distillery.', tier:'Deluxe Tasting · $19/person', title:'Sweet Escapes', desc:"A boutique dessert tasting, with the option of take-home gift bags for the group. A crowd-pleaser for teams that want something sweet and shareable.", expect:"A dessert tasting with optional gift-bag add-on. Vegetarian-friendly. Tell us about allergies in advance.", feats:['Desserts & gift bags','Vegetarian-friendly','Distillery District'], priceLabel:'$19 per person' }, { id:'old-flame', type:'deluxe', price:19, thumb:'https://www.gotourscanada.com/wp-content/uploads/2026/07/OldFlame-Tasting.jpg', cardName:'Old Flame Brewery', cardNameTag:null, cardDesc:'A craft beer flight with a warm pretzel to match. Laid-back, friendly, and easy to love for a group of any size.', tier:'Deluxe Tasting · $19/person', title:'Old Flame Brewery', desc:"A craft beer taster flight from Old Flame Brewery, with the option to add a pretzel. A relaxed, sociable tasting that suits groups of any size.", expect:"A guided beer flight, with a pretzel add-on available. Guests must be 19+ with valid ID. Non-alcoholic alternatives available with advance notice.", feats:['Beer flight','Pretzel option','19+ with ID'], priceLabel:'$19 per person' }, { id:'spirit-spirits', type:'premium', price:23, thumb:'https://www.gotourscanada.com/wp-content/uploads/2026/06/SpiritofYork-Tasting-.jpg', cardName:'Spirit of York', cardNameTag:{text:'SPIRITS',color:'#b8960c'}, cardDesc:'A sit-down craft spirits flight at a Distillery District distillery. A little more polished, ideal for marking a milestone or hosting clients in style.', tier:'Premium Tasting · $23/person', title:'Spirit of York — Spirits Flight', desc:"A sit-down craft spirits flight at a Distillery District distillery. More depth and presentation than our deluxe tastings, ideal for groups marking a milestone or hosting clients.", expect:"A guided spirits flight in a sit-down setting. Guests must be 19+ with valid ID. Non-alcoholic alternatives available with advance notice.", feats:['Craft spirits flight','Sit-down setting','19+ with ID'], priceLabel:'$23 per person' }, { id:'spirit-boards', type:'premium', price:23, thumb:'https://www.gotourscanada.com/wp-content/uploads/2026/07/Distillery-District-Charcuterie-Board-Spirit-of-York-scaled.jpeg', cardName:'Spirit of York', cardNameTag:{text:'BOARDS',color:'#b8960c'}, cardDesc:'Charcuterie and artisan cheese, laid out to linger over. Pairs beautifully with the spirits flight.', tier:'Premium Tasting · $23/person', title:'Spirit of York — Charcuterie Boards', desc:"Charcuterie and artisan cheese boards in a sit-down setting at the distillery. Pairs beautifully with the spirits flight if your group wants to do both.", expect:"A shared board experience in a sit-down setting. Vegetarian options available; tell us about allergies in advance.", feats:['Charcuterie & cheese','Sit-down setting','Pairs with spirits'], priceLabel:'$23 per person' }, { id:'yummi-candles', type:'experience', price:65, thumb:'https://www.gotourscanada.com/wp-content/uploads/2026/07/YummiCandles-Toronto-Teambuilding.jpg', cardName:'Yummi Candles', cardNameTag:{text:'EXPERIENCE',color:'var(--gtc-exp)'}, cardDesc:'A hands-on session where everyone pours a candle to take home - pair with a Segway ride for a truly unique event.', tier:'Hands-on Experience · $65/person', title:'Yummi Candles Experience', desc:"A hands-on candle-making session, not a tasting. Each guest crafts a candle to take home, making it a more involved, longer activity than a standard tasting stop. A strong centrepiece for teams that want to make something together.", expect:"A guided, hands-on session with a take-home candle for each guest. Because it's a full activity rather than a tasting, it's always priced and added separately, and it's never the 'included' tasting on bundled experiences.", feats:['Hands-on activity','Take-home candle','Priced separately'], priceLabel:'$65 per person' } ]; var tastingById = {}; TASTINGS.forEach(function(t) { tastingById[t.id] = t; }); // Build one card's markup from a tasting entry (extraClass = grid-placement hook) function tastingCardHTML(t, extraClass) { var tag = t.cardNameTag ? ' ' + t.cardNameTag.text + '' : ''; var cls = 'tasting-card' + (t.type === 'experience' ? ' exp-card' : '') + (extraClass ? ' ' + extraClass : ''); return '
' + '
' + '
' + '
' + t.cardName + tag + '
' + '
' + t.cardDesc + '
' + '
$' + t.price + '/pp
' + 'More info →' + '
'; } // Render cards into the deluxe grid and the premium/experience tier row. // Runs synchronously at script start; the containers exist above this script, // and all tasting interactions use delegated document listeners so dynamically // inserted cards work without rebinding. (function renderTastingCards() { var deluxe = TASTINGS.filter(function(t) { return t.type === 'deluxe'; }); var premium = TASTINGS.filter(function(t) { return t.type === 'premium'; }); var experience = TASTINGS.filter(function(t) { return t.type === 'experience'; }); var dg = document.getElementById('tastingDeluxeGrid'); if (dg) dg.innerHTML = deluxe.map(function(t) { return tastingCardHTML(t); }).join(''); var tr = document.getElementById('tastingTierRow'); if (tr && premium.length >= 2 && experience.length >= 1) { tr.innerHTML = '
Premium ($23/person)
' + '

For groups that want their event to really stand out. Sit-down tastings with more depth and presentation.

' + tastingCardHTML(premium[0], 'tr-card-1') + tastingCardHTML(premium[1], 'tr-card-2') + '
Hands-on Experience ($65/person)
' + '

A guided, hands-on session - great for teams that want a lasting physical memento.

' + tastingCardHTML(experience[0], 'tr-card-3'); } })(); // ============================================= // GROUP SIZE // ============================================= var groupInput = document.getElementById('groupSize'); if (groupInput) { groupInput.addEventListener('input', function() { state.group = parseInt(this.value) || 0; filterExp(); calc(); }); } function filterExp() { var g = state.group, msg = document.getElementById('filterMsg'); var dim = 0; var tiles = document.querySelectorAll('.exp-tile'); tiles.forEach(function(t) { var mn = parseInt(t.dataset.min), mx = parseInt(t.dataset.max); if (g > 0 && (g < mn || g > mx)) { t.classList.add('dim'); dim++; if (t.classList.contains('sel')) { t.classList.remove('sel'); state.exp = null; state.price = 0; } } else { t.classList.remove('dim'); } }); var total = tiles.length; if (g > 0 && g < 3) { msg.innerHTML = 'Minimum group size is 3 guests.'; msg.classList.add('vis'); } else if (g > 0 && dim > 0) { msg.innerHTML = 'Showing ' + (total - dim) + ' experiences for groups of ' + g + '.'; msg.classList.add('vis'); } else if (g > 30) { msg.innerHTML = 'Love it. For groups of ' + g + ', we\'ll coordinate multiple guides and rotations. Every experience below works as a starting point, or go Custom and we\'ll design it around you.'; msg.classList.add('vis'); } else { msg.classList.remove('vis'); } } // ============================================= // EXPERIENCE TILES + INFO LINKS (event delegation) // ============================================= document.addEventListener('click', function(e) { var infoLink = e.target.closest('.exp-info-link'); if (infoLink) { e.preventDefault(); e.stopPropagation(); showInfo(infoLink.dataset.info); return; } var tile = e.target.closest('.exp-tile'); if (!tile) return; if (tile.classList.contains('dim')) return; document.querySelectorAll('.exp-tile').forEach(function(x) { x.classList.remove('sel'); }); tile.classList.add('sel'); state.exp = tile.dataset.exp; state.price = parseFloat(tile.dataset.price); updateTasting(); calc(); updateSectionBadges(); }); function showInfo(key) { currentModalExp = key; var d = expData[key]; if (!d) return; document.getElementById('modalPhotos').innerHTML = d.photos ? d.photos.map(function(p) { return ''; }).join('') : ''; document.getElementById('modalTitle').textContent = d.title; document.getElementById('modalDesc').textContent = d.desc; document.getElementById('modalExpect').textContent = d.expect; document.getElementById('modalFeats').innerHTML = d.feats.map(function(f) { return '\u2713 ' + f + ''; }).join(''); var tile = document.querySelector('.exp-tile[data-exp="' + key + '"]'); document.getElementById('modalSelectBtn').style.display = (tile && tile.classList.contains('dim')) ? 'none' : 'inline-block'; openModal('modalOverlay'); } // ============================================= // MODALS — one generic open/close controller for all four overlays // (experience, tasting, cancellation, weather). // Closes on: a click on any .modal-close / .tasting-modal-close / .policy-close, // OR a click that lands directly on an overlay backdrop. Because only a direct // backdrop hit closes, clicks inside a modal card need no stopPropagation. // ============================================= function openModal(id) { var m = document.getElementById(id); if (m) m.classList.add('vis'); } function closeModal(el) { if (el) el.classList.remove('vis'); } document.addEventListener('click', function(e) { var closer = e.target.closest('.modal-close, .tasting-modal-close, .policy-close'); if (closer) { closeModal(closer.closest('.gtc-modal-overlay, .gtc-tasting-overlay, .gtc-policy-overlay')); return; } var t = e.target; if (t.classList && (t.classList.contains('gtc-modal-overlay') || t.classList.contains('gtc-tasting-overlay') || t.classList.contains('gtc-policy-overlay'))) { closeModal(t); } }); document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { document.querySelectorAll('.gtc-modal-overlay.vis, .gtc-tasting-overlay.vis, .gtc-policy-overlay.vis').forEach(closeModal); } }); // Policy modal openers document.getElementById('cancelPolicyBtn').addEventListener('click', function() { openModal('cancelOverlay'); }); document.getElementById('weatherPolicyBtn').addEventListener('click', function() { openModal('weatherOverlay'); }); // Experience modal "Select" — close, then trigger the matching tile document.getElementById('modalSelectBtn').addEventListener('click', function() { closeModal(document.getElementById('modalOverlay')); var tile = document.querySelector('.exp-tile[data-exp="' + currentModalExp + '"]'); if (tile) tile.click(); }); // Tasting modal "Add" — close, then select the matching card if not already on document.getElementById('tastingModalSelectBtn').addEventListener('click', function() { closeModal(document.getElementById('tastingModalOverlay')); var card = document.querySelector('.tasting-card[data-tasting="' + currentTastingModal + '"]'); if (card && !card.classList.contains('sel')) card.click(); }); // ============================================= // TASTING INFO MODAL // ============================================= function showTastingInfo(key) { currentTastingModal = key; var d = tastingById[key]; if (!d) return; var thumb = document.getElementById('tastingModalThumb'); if (d.thumb) { thumb.style.backgroundImage = "url('" + d.thumb + "')"; thumb.style.display = 'block'; } else { // No photo for this partner — use the tier-tinted gradient fallback var isExp = /Experience/.test(d.tier); thumb.style.backgroundImage = isExp ? 'linear-gradient(135deg, var(--gtc-exp-soft), var(--gtc-stone))' : 'linear-gradient(135deg, var(--gtc-gold-soft), var(--gtc-stone))'; thumb.style.display = 'block'; } document.getElementById('tastingModalTier').textContent = d.tier; document.getElementById('tastingModalTitle').textContent = d.title; document.getElementById('tastingModalDesc').textContent = d.desc; document.getElementById('tastingModalExpect').textContent = d.expect; document.getElementById('tastingModalFeats').innerHTML = d.feats.map(function(f) { return '\u2713 ' + f + ''; }).join(''); document.getElementById('tastingModalPrice').textContent = d.priceLabel; openModal('tastingModalOverlay'); } // ============================================= // TASTINGS (event delegation) // ============================================= document.addEventListener('click', function(e) { // Info link takes priority and must NOT toggle selection var tInfo = e.target.closest('.tasting-info-link'); if (tInfo) { e.preventDefault(); e.stopPropagation(); showTastingInfo(tInfo.dataset.tinfo); return; } var card = e.target.closest('.tasting-card'); if (!card) return; var k = card.dataset.tasting; if (!k) return; if (state.tastings.has(k)) { state.tastings.delete(k); card.classList.remove('sel'); } else { state.tastings.add(k); card.classList.add('sel'); } updateTasting(); calc(); }); function updateTasting() { var incl = (state.exp === 'walking-tasting' || state.exp === 'custom-segway'); var el = document.getElementById('tastingInstruction'); if (state.exp === 'walking-tasting') el.textContent = "Your experience includes 1 deluxe tasting. Select below. Upgrade to premium for just $4 more, or add extras at full price."; else if (state.exp === 'custom-segway') el.textContent = "Your Custom Segway includes 1 deluxe tasting. Select below. Upgrade to premium for just $4 more, or add extras at full price."; else if (['prohibition','breakfast','full-ride'].indexOf(state.exp) !== -1) el.textContent = "Your experience includes tastings. Want to add more? Additional tastings are $19-23 per person."; else if (state.exp === 'custom') el.textContent = "Add tastings to your custom event. We'll include them in your quote at $19-23 per person."; else el.textContent = "Add artisan tastings from our Distillery District partners ($19-23 per person each)."; // Pre-select an included tasting for experiences that bundle one if (incl && !hasEligibleTasting()) { preSelectTasting('soma'); } // Reset all price labels to their face value document.querySelectorAll('.tasting-card').forEach(function(c) { var p = parseInt(c.dataset.price); var pe = c.querySelector('.tasting-price'); pe.textContent = '$' + p + '/pp'; pe.classList.remove('tasting-incl'); }); // Label the first ELIGIBLE (non-experience) tasting as included/upgrade if (incl) { var firstEligible = firstEligibleTasting(); if (firstEligible) { var fc = document.querySelector('.tasting-card[data-tasting="' + firstEligible + '"]'); var pe = fc.querySelector('.tasting-price'); pe.textContent = fc.dataset.type === 'premium' ? '+$4/pp upgrade' : 'Included \u2713'; pe.classList.add('tasting-incl'); } } } // Is at least one selected tasting eligible to be the "included" slot? function hasEligibleTasting() { return Array.from(state.tastings).some(function(k) { var c = document.querySelector('.tasting-card[data-tasting="' + k + '"]'); return c && c.dataset.type !== 'experience'; }); } // First selected tasting that can occupy the free/upgrade slot (skips $65 experience) function firstEligibleTasting() { return Array.from(state.tastings).filter(function(k) { var c = document.querySelector('.tasting-card[data-tasting="' + k + '"]'); return c && c.dataset.type !== 'experience'; })[0]; } function preSelectTasting(key) { var card = document.querySelector('.tasting-card[data-tasting="' + key + '"]'); if (card && !card.classList.contains('sel')) { state.tastings.add(key); card.classList.add('sel'); } } // ============================================= // GRATUITY (event delegation) // ============================================= document.addEventListener('click', function(e) { var opt = e.target.closest('.extra-opt'); if (!opt) return; var was = opt.classList.contains('sel'); document.querySelectorAll('.extra-opt').forEach(function(x) { x.classList.remove('sel'); }); if (!was) { opt.classList.add('sel'); state.grat = parseInt(opt.dataset.grat); } else { state.grat = null; } calc(); }); // ============================================= // CALCULATE // ============================================= function calc() { var g = state.group, base = state.price * g; var ctaBtn = document.getElementById('ctaBtn'); if (!state.exp || g === 0 || g < 3) { document.getElementById('runPrice').textContent = '$0'; document.getElementById('runDetail').textContent = g === 0 ? 'Enter your group size to get started' : (g < 3 ? 'Minimum 3 guests' : 'Select an experience above'); ctaBtn.disabled = true; updateFormSummary(null); return; } var incl = (state.exp === 'walking-tasting' || state.exp === 'custom-segway'); var tt = 0, tastingNames = []; var freeUsed = false; state.tastings.forEach(function(k) { var c = document.querySelector('.tasting-card[data-tasting="' + k + '"]'); var p = parseInt(c.dataset.price); var type = c.dataset.type; tastingNames.push(c.querySelector('.tasting-name').textContent.trim()); if (type === 'experience') { // $65 hands-on experience is ALWAYS full price, never the free slot tt += p * g; } else if (incl && !freeUsed) { // First eligible tasting: free (deluxe) or +$4 (premium) tt += (type === 'premium' ? 4 : 0) * g; freeUsed = true; } else { tt += p * g; } }); // Round each component once, then derive the total from the rounded pieces // so the displayed line items always sum to the displayed total. var taxable = base + tt; var gp = (state.grat && state.grat > 0) ? state.grat : 0; var gratR = Math.round(taxable * (gp / 100)); var hstR = Math.round(taxable * 0.13); var total = base + tt + gratR + hstR; document.getElementById('runPrice').textContent = '$' + total.toLocaleString(); var d = g + ' guests \u00B7 $' + state.price + '/pp'; if (tt > 0) d += ' + tastings'; if (gp > 0) d += ' + ' + gp + '% tip'; d += ' \u00B7 incl. HST'; document.getElementById('runDetail').textContent = d; ctaBtn.disabled = false; // Update hidden form fields document.getElementById('hExp').value = expNames[state.exp] || state.exp; document.getElementById('hGroup').value = g; document.getElementById('hTastings').value = tastingNames.join(', ') || 'None'; document.getElementById('hGrat').value = gp > 0 ? gp + '%' : (state.grat === 0 ? 'Deferred to invoice' : 'None selected'); document.getElementById('hBreakdown').value = 'Base: $' + base + ' | Tastings: $' + tt + ' | Gratuity: $' + gratR + ' | HST: $' + hstR; document.getElementById('hTotal').value = '$' + total; updateFormSummary({ exp: expNames[state.exp], group: g, price: state.price, tastings: tastingNames, tastingTotal: tt, grat: gp, gratAmount: gratR, hst: hstR, total: total }); } function updateFormSummary(data) { var el = document.getElementById('formSummary'); if (!el) return; if (!data) { el.innerHTML = 'Submit your quote request and our event planning team will be in touch within 24 hours. If you still have questions - call us directly at (416) 677-3831 to get the answers you need.'; return; } var html = '' + data.exp + ' for ' + data.group + ' guests at $' + data.price + '/pp'; if (data.tastings.length > 0) html += '
Tastings: ' + data.tastings.join(', '); if (data.grat > 0) html += '
Gratuity: ' + data.grat + '% ($' + data.gratAmount + ')'; html += '
HST (13%): $' + data.hst; html += '
Estimated total: $' + data.total.toLocaleString() + ''; el.innerHTML = html; } // ============================================= // CTA BUTTON → SCROLL TO FORM // ============================================= document.getElementById('ctaBtn').addEventListener('click', function() { document.getElementById('quoteFormStep').scrollIntoView({ behavior: 'smooth', block: 'start' }); setTimeout(function() { document.getElementById('qName').focus(); }, 500); }); // ============================================= // HERO FAQ ANCHOR (smooth scroll, Divi-safe) // ============================================= var heroFaqLink = document.getElementById('heroFaqLink'); if (heroFaqLink) { heroFaqLink.addEventListener('click', function(e) { var faq = document.getElementById('gtcFaq'); if (faq) { e.preventDefault(); faq.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); } // ============================================= // SUBMIT GATE // Native required handles Name/Email/Date. This blocks submit when no // experience is selected (it's a selection state, not a form field) or the // group is under the 3-guest minimum. Inline error, no disabled button. // ============================================= var quoteForm = document.getElementById('quoteForm'); var formError = document.getElementById('formError'); function showFormError(msg) { formError.textContent = msg; formError.classList.add('vis'); } function clearFormError() { formError.classList.remove('vis'); formError.textContent = ''; } if (quoteForm) { quoteForm.addEventListener('submit', function(e) { // Selection-state checks run before the network submit if (!state.exp) { e.preventDefault(); showFormError('Please choose an experience in Step 2 before submitting.'); document.getElementById('quoteFormStep').scrollIntoView({ behavior: 'smooth', block: 'start' }); return; } if (state.group < 3) { e.preventDefault(); showFormError('Please enter a group size of at least 3 guests in Step 1.'); document.getElementById('groupSize').scrollIntoView({ behavior: 'smooth', block: 'center' }); document.getElementById('groupSize').focus(); return; } // Valid: let the native required fields and Formspree take over clearFormError(); }); } // Clear the error as soon as the user fixes the selection document.addEventListener('click', function() { if (formError.classList.contains('vis') && state.exp && state.group >= 3) clearFormError(); }); // ============================================= // COLLAPSIBLE SECTIONS (event delegation) // Expanded sections rest at max-height:none so they never clip on late // image/font reflow. Pixel heights are used only to drive the transition. // ============================================= document.addEventListener('click', function(e) { var toggle = e.target.closest('.exp-section-toggle'); if (!toggle) return; var section = document.getElementById(toggle.dataset.section); if (!section) return; var body = section.querySelector('.exp-section-body'); if (section.classList.contains('collapsed')) { // EXPAND: from 0 → measured px → none (so content can grow freely after) section.classList.remove('collapsed'); body.style.maxHeight = body.scrollHeight + 'px'; body.addEventListener('transitionend', function te() { body.style.maxHeight = 'none'; body.removeEventListener('transitionend', te); }); } else { // COLLAPSE: from none → fixed px → 0 (reflow needed for the animation) body.style.maxHeight = body.scrollHeight + 'px'; void body.offsetHeight; // force reflow so the next change animates section.classList.add('collapsed'); // CSS forces max-height:0 !important } }); // Sections start expanded: leave max-height unset (auto) so nothing clips. function updateSectionBadges() { var walkingExps = ['walking-no','walking-tasting','prohibition','breakfast','yorkville','custom']; var segwayExps = ['full-ride','segway','custom-segway']; var wBadge = document.getElementById('walkingSelBadge'); var sBadge = document.getElementById('segwaySelBadge'); if (wBadge) wBadge.style.display = (state.exp && walkingExps.indexOf(state.exp) !== -1) ? 'inline-block' : 'none'; if (sBadge) sBadge.style.display = (state.exp && segwayExps.indexOf(state.exp) !== -1) ? 'inline-block' : 'none'; } // ============================================= // FAQ TOGGLES (event delegation) // ============================================= document.addEventListener('click', function(e) { var btn = e.target.closest('.faq-q'); if (!btn) return; var answer = btn.nextElementSibling; var icon = btn.querySelector('.faq-icon'); var isOpen = answer.classList.contains('open'); document.querySelectorAll('.faq-a').forEach(function(a) { a.classList.remove('open'); }); document.querySelectorAll('.faq-icon').forEach(function(i) { i.textContent = '+'; i.style.transform = ''; }); if (!isOpen) { answer.classList.add('open'); icon.textContent = '\u2212'; } }); } // Run after the DOM is ready, even if Divi injects this script at the top of . if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', gtcInit); } else { gtcInit(); } })();