Plan Your Corporate Team Event

Featuring COVID safe experiences for your team, explore Toronto Teambuilding Events in 2022 with Go Tours Canada.

Distillery District Walking Tours

Explore Toronto's prohibition past on our special monthly Prohibition and Whisky History tour in partnership with Aviary Brewpub.

Book Our Prohibition & Spirits Tour

Toronto Canary District Segway Adventure Modern Urban Exploration.

Try Our 1-Hour Segway Adventure

Distillery District Segway Tours - 20 Years Rolling

___________________

Since 2005 our Toronto tour guides have trained over 150,000 Segway riders! Join us in Toronto’s Distillery District and check off a fun bucket list item 😉  Great for family trips. Ride through the Distillery District – and now Canary District – on two wheels.

Distillery District Walking Tours

___________________

Discover Toronto’s historic neighborhood with local experts.

Share hidden corners and insider knowledge of Old Town Toronto and the Distillery District. From our Classic Walking Tour to our foodie-favorite Breakfast Tour, we bring 20 years of local knowledge to every step.

Locate Us

11 Gristmill Lane Toronto Ontario M5A 3C4

(416) 677-3831

 

About Go Tours Canada

Launched in 2005, Go Tours Canada is Toronto's award-winning tour company specializing in Distillery District and Old Town Toronto experiences.

Our expert tour guides have led over 250,000 visitors through Toronto's most historic neighborhoods, sharing insider knowledge about the city's best restaurants, coffee shops, and hidden cultural gems.

Choose walking tours featuring prohibition history and local food experiences, or explore the Distillery District on Toronto's ONLY Segway tour.

. */ (function() { 'use strict'; // 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'; } }); })();