Skip to content
Keweenaw Mountain Lodge

Keweenaw Mountain Lodge

A four-season historic wilderness resort at the top of the Keweenaw, est. in 1934

  • Home
    • Lodge Life Shop
    • Maps
    • Special Projects
    • Employment Opportunities
  • Cabins
  • Outdoor Activities
  • Dining
  • Education
  • About
0 events found.

Events

  1. Events
  2. Events

Events for May 15, 2026

Notice
No events scheduled for May 15, 2026. Jump to the next upcoming events.
Notice
No events scheduled for May 15, 2026. Jump to the next upcoming events.

Events Search and Views Navigation

Event Views Navigation

  • List
  • Month
  • Day
Today
  • Previous Day
  • Next Day
  • Google Calendar
  • iCalendar
  • Outlook 365
  • Outlook Live
  • Export .ics file
  • Export Outlook .ics file

Compass: Keweenaw Mountain Lodge > Events > Events

Last modified on April 22nd, 2026 at 7:09 pm

Find Us

Contact Info 
Phone and Email

Physical Address (directions)
14252 US Hwy 41
Copper Harbor, Michigan 49918

Hours of Operations | Employment

Frequently Asked Questions

Learn about our sustainability initiatives

Reminder: The resort is cashless & a no tipping establishment

No Public Bathrooms: Bathrooms are for customers only.

Drug Free: Smoking of cigarettes, e-cigarettes, or marijuana is not allowed anywhere on property.

Lodging Tax: Cabin guests are assessed a lodging tax, per Michigan law.

Privacy Policy

KML - Keweenaw Mountain Lodge

KML - Keweenaw Mountain Lodge - B Corp

About the Keweenaw Mountain Lodge

A four-season historic wilderness resort at the top of the Keweenaw, focused on outdoor activities, rustic worldly food, and education. Resort facilities are available for cabin guests only.

Keweenaw Mountain Lodge on the National Historical Register

Search

Become a Keweenaw Mountain Lodge Insider

The Keweenaw Mountain Lodge is proudly associated with the following:

Visit Keweenaw    Pure Michigan

Lake Superior Circle Tour     United States Golf Association (USGA)

Leave No Trace - Proud Partner   Audubon International

[ view partners and friends of the lodge ]

"Keweenaw Mountain Lodge" and "KML" are registered trademarks

Sister Websites

Keweenaw Dark Sky Park
Back 9 Endurance Run   Front 9 Endurance Golf
Dawg Daze   Snowshoe Hare
  • Instagram
  • LinkedIn

Powered by fun.joyous.adventuresome

-- make a decision, not a comparison --
-- a no judgement zone --





we provide information, we do not sell
so you can self-select in, or self-select out.
if you like what we are doing, come stay with us;
if you do not like what we are doing, move on.
we do not try to get a lot of people to the keweenaw,
we focus on getting people closer to nature.
we are not a social club.

Since 2018, the Keweenaw Mountain Lodge has been privately-owned.
The resort is not a public asset, nor is it controlled by the public.
As such, visitors are required to respect private property,
or they will lose access to the property.

  • Calendar
  • Make a Lodging Reservation
  • Directions
  • Hours of Operations
  • Cameras & Weather
  • Contact Us



(function(){ "use strict"; function init(){ if(!document.getElementById("interests")) return; /* only run where the form exists */ // ---- Question data ---- var interests = [ // Outdoor activities {id:"hiking",label:"Hiking & trails",fit:1}, {id:"trailrun",label:"Trail running",fit:1}, {id:"biking",label:"Mountain biking",fit:1}, {id:"golf",label:"Historic wilderness golf",fit:1}, {id:"water",label:"Fishing & paddling",fit:1}, {id:"wildlife",label:"Wildlife & nature",fit:1}, {id:"birding",label:"Birding",fit:1}, {id:"aurora",label:"Stargazing & northern lights",fit:1}, // Winter {id:"winter",label:"Snowshoeing",fit:1}, {id:"xcski",label:"Cross-country skiing",fit:1}, {id:"downhill",label:"Downhill skiing (Mt. Bohemia)",fit:1}, // Rustic worldly food {id:"food",label:"Rustic worldly food",fit:1}, // Education {id:"learn",label:"Education & workshops",fit:1}, {id:"photo",label:"Photography workshops",fit:1}, {id:"history",label:"History & the WPA-era lodge",fit:1}, // The pace of the place {id:"quiet",label:"Quiet & solitude",fit:1}, {id:"fireside",label:"Fireside downtime",fit:1}, {id:"people",label:"Reconnect with family/friends",fit:1}, // Not what the Lodge is {id:"nightlife",label:"Nightlife & bars",fit:0}, {id:"shopping",label:"Shopping & city sights",fit:0}, {id:"spa",label:"Spa & pampering",fit:0}, {id:"pool",label:"Pool & resort lounging",fit:0} ]; var headspace = [ {id:"unplug",label:"Unplug and be fully present",tag:"The Lodge at its best"}, {id:"explore",label:"Relax, explore, take it as it comes",tag:""}, {id:"content",label:"Capturing content is a main goal of the trip",tag:""}, {id:"review",label:"Mostly here to evaluate or review the place",tag:""} ]; var returning = [ {id:"first",label:"No — this will be our first visit"}, {id:"recent",label:"Yes — in 2024 or later"}, {id:"old",label:"Yes — before 2024"} ]; var connectivity = [ {id:"love",label:"Love going remote"}, {id:"ok",label:"Fine unplugging for a few days"}, {id:"need",label:"I need reliable Wi-Fi / cell service"} ]; var ac = [ {id:"love",label:"Bring on the breeze through the pines"}, {id:"ok",label:"No problem"}, {id:"need",label:"I really need air conditioning"} ]; var comfort = [ {id:"love",label:"Rustic character is the whole point"}, {id:"ok",label:"Comfortable and simple suits me fine"}, {id:"need",label:"I expect upscale / luxury service"} ]; var leadtime = [ {id:"yes",label:"Yes — I can plan 14+ days ahead"}, {id:"no",label:"I need last-minute or same-day"} ]; var nights = [ {id:"yes",label:"Yes — two or more nights"}, {id:"no",label:"Just one night"} ]; var grouptype = [ {id:"no",label:"No — a single cabin for my party"}, {id:"yes",label:"Yes — we'd need multiple cabins, or it's a group event (reunion, wedding, retreat, party)",tag:"Heads-up: the Lodge doesn't host groups"} ]; // ---- Render helpers ---- var $ = function(id){return document.getElementById(id);}; var selected = {}; // interest set var radios = {}; // group -> value function renderChips(){ var box = $("interests"); interests.forEach(function(it){ var b = document.createElement("button"); b.type = "button"; b.className = "chip" + (it.fit===0 ? " anti":""); b.textContent = it.label; b.setAttribute("aria-pressed","false"); b.addEventListener("click",function(){ var on = b.getAttribute("aria-pressed")==="true"; b.setAttribute("aria-pressed", on ? "false":"true"); if(on) delete selected[it.id]; else selected[it.id]=it; }); box.appendChild(b); }); } function renderRadios(group, arr){ var box = $(group); arr.forEach(function(o){ var lab = document.createElement("label"); lab.className = "opt"; var span = ""+o.label+(o.tag?(""+o.tag+""):"")+""; lab.innerHTML = ""+span; lab.querySelector("input").addEventListener("change",function(){ radios[group]=o.id; }); box.appendChild(lab); }); } renderChips(); renderRadios("headspace",headspace); renderRadios("returning",returning); renderRadios("connectivity",connectivity); renderRadios("ac",ac); renderRadios("comfort",comfort); renderRadios("leadtime",leadtime); renderRadios("nights",nights); renderRadios("grouptype",grouptype); // ---- Activity mapping ---- var actMap = { hiking:["Trailhead hikes from the property"], biking:["Copper Harbor's famous singletrack"], golf:["9 holes of historic wilderness golf — wild, natural ground until someone tees off","Play it and it's an authentic 1930s round on hickory clubs","A walking course through natural fairways and pines"], water:["Fishing & paddling on Lake Superior"], trailrun:["Trail running the wilderness trails"], winter:["Snowshoeing on groomed (packed) trails"], xcski:["Cross-country skiing on groomed trails"], downhill:["Downhill skiing at Mt. Bohemia, under 15 miles away"], wildlife:["Wildlife watching in the pines"], birding:["Birding across the 560-acre property"], aurora:["Northern-lights & astrophotography nights"], food:["Rustic worldly food — a limited, from-scratch, slow-food menu","Chef Wi's 4-course private dinner (book at least 2 weeks ahead) — three unhurried hours at the table, and the story of every ingredient"], learn:["Hands-on workshops & guided learning","Dark Sky & stewardship programs"], photo:["A guided photography workshop"], history:["Your cabin's own WPA-era story (built 1936–1940), shared by the staff","The historic lodge & its Great Depression roots"], quiet:["Long quiet mornings on the porch"], fireside:["Evenings by the cabin fireplace"], people:["A shared meal in the historic lodge"] }; var seasonSwap = { winter:{hiking:"Snowshoe trails from the door",biking:"Fat-biking the winter trails",golf:null,water:null,trailrun:null}, summer:{winter:null,xcski:null,downhill:null}, spring:{winter:null,xcski:null,downhill:null}, fall:{aurora:"Fall-color drives & aurora nights",winter:null,xcski:null,downhill:null}, any:{} }; // ---- Cabin inventory ---- var cabins = [ {n:1,bed:3,bath:1,duplex:false}, {n:2,bed:1,bath:1,duplex:false}, {n:3,bed:2,bath:1,duplex:false}, {n:4,bed:2,bath:2,duplex:false}, {n:5,bed:2,bath:2,duplex:false}, {n:6,bed:1,bath:1,duplex:true,ada:true}, {n:7,bed:2,bath:2,duplex:false}, {n:8,bed:1,bath:1,duplex:true}, {n:9,bed:1,bath:1,duplex:true}, {n:10,bed:2,bath:1,duplex:false}, {n:11,bed:2,bath:1,duplex:false}, {n:12,bed:2,bath:1,duplex:false}, {n:14,bed:2,bath:1,duplex:false}, {n:15,bed:2,bath:1,duplex:false}, {n:16,bed:2,bath:1,duplex:false}, {n:17,bed:2,bath:2,duplex:false}, {n:18,bed:2,bath:2,duplex:false}, {n:19,bed:2,bath:1,duplex:false}, {n:20,bed:2,bath:1,duplex:false}, {n:21,bed:3,bath:1,duplex:false}, {n:23,bed:2,bath:2,duplex:false}, {n:24,bed:2,bath:2,duplex:false}, {n:25,bed:2,bath:2,duplex:false} ]; var PET_CABINS = [3,7,8,15,16,17,21]; var GAS_CABINS = [1,8,9,21]; function cabinNums(pred){return cabins.filter(pred).map(function(c){return c.n;});} function listNums(a){return a.join(", ");} function cabinsFor(bed, sideFilter){ return cabins.filter(function(c){ if(c.bed!==bed) return false; if(sideFilter==="golf" && c.n>14) return false; if(sideFilter==="forest" && c.n<15) return false; return true; }); } // ---- Scoring ---- function evaluate(){ var alignedInterests=0, antiInterests=[]; Object.keys(selected).forEach(function(k){ if(selected[k].fit===1) alignedInterests++; else antiInterests.push(selected[k].label); }); var flags=[]; // {type, key, text} var mismatch=0, hard=0; if(radios.leadtime==="no"){hard++;flags.push({t:"rule",k:"Booking rule",x:"Reservations need 14+ days' notice — no walk-ins or same-day stays."});} if(radios.nights==="no"){hard++;flags.push({t:"rule",k:"Booking rule",x:"There's a two-night minimum stay."});} if($("pet").checked){flags.push({t:"rule",k:"Pet policy",x:"Dogs are welcome in designated dog-friendly cabins only — cabins 3, 7, 8, 15, 16, 17, and 21. It's $20 per dog per night, two dogs max, always leashed, and never left unattended more than an hour. Dogs aren't allowed in the Lodge building or on the golf course. Book early — availability is limited."});} if(radios.connectivity==="need"){mismatch++;flags.push({t:"heads",k:"Heads-up",x:"You'll want reliable connectivity, but cell and Wi-Fi are limited here — you're remote. If you must stay connected, request a cabin closest to the Lodge building, where coverage is best, and confirm before booking."});} if(radios.ac==="need"){mismatch++;flags.push({t:"heads",k:"Heads-up",x:"The cabins have no air conditioning. Summer nights are usually cool and box fans are available from the front desk on request — but plan for natural cooling only."});} if(radios.comfort==="need"){mismatch++;flags.push({t:"heads",k:"Heads-up",x:"The cabins are rustic and historic rather than upscale — lovely, but not a luxury resort."});} var reviewIntent = radios.headspace==="review"; var contentIntent = radios.headspace==="content"; if(reviewIntent){flags.push({t:"heads",k:"Heads-up",x:"The Lodge lands best for guests here to experience it firsthand. A visit centered on evaluating the place may not feel the way you're hoping."});} if(contentIntent){flags.push({t:"heads",k:"Heads-up",x:"You can absolutely capture the place — just know the draw here is putting the phone down. Spotty service comes with the territory."});} antiInterests.forEach(function(l){ flags.push({t:"heads",k:"Not on-site",x:"“"+l+"” isn't really the Lodge's thing — Copper Harbor is remote and quiet. Set expectations there."}); }); // Positive notes if(radios.connectivity==="love") flags.push({t:"good",k:"Great match",x:"You're here for the right reasons — this is an unplug-and-breathe kind of place."}); if(alignedInterests>=3) flags.push({t:"good",k:"Great match",x:"Your interests line up beautifully with what the Lodge does best."}); // Timing tips tied to the moon cycle if(selected.aurora) flags.push({t:"heads",k:"Timing tip",x:"For the darkest skies and best stargazing, book your cabin around a new moon."}); if(selected.winter || selected.xcski) flags.push({t:"heads",k:"Winter trails",x:"Our groomed winter trails run December 15–March 31, weather permitting. Planning a night outing? A full moon lights the trails best — book your cabin around one."}); // Returning guests — the Lodge has changed if(radios.returning==="old"){ flags.push({t:"heads",k:"Welcome back — but the Lodge has changed",x:"If your last stay was before 2024, you'll find a different place now. Since 2024 the property is cabin-guests-only — fewer cars and people means quieter grounds and more wildlife, all in service of getting people closer to nature. If your visits go back before 2018, it's an even bigger change from the old party atmosphere."}); } else if(radios.returning==="recent"){ flags.push({t:"good",k:"Welcome back",x:"You already know the current Lodge — quiet, rustic, and focused on getting people closer to nature."}); } if(selected.golf){ flags.push({t:"heads",k:"About the golf course",x:"Our historic wilderness course lives by three words: hickory, natural fairways, and walking — hickory clubs only, walking only (no riding carts, no modern clubs). It's currently the only hickory-only golf course in the United States. Don't have hickory clubs? We rent them, and pull carts are available to help you walk. The season runs June 1–October 15 — we don't open early or extend it, though weather (an October snow, say) can close it before the 15th. It plays like an authentic 1930s round."}); } // Complimentary meals — included with every registered stay var seasonNow = $("season").value; var mealX = "Every stay includes a from-scratch breakfast burrito and drip coffee, 8–11am at the Little Cabin Café."; if(seasonNow==="winter") mealX += " If your stay falls between December 15 and March 31, a complimentary lunch (dine-in, 12–2pm) and dinner (to go, 5pm) are included too — advance reservations, and not on Sundays."; mealX += " Every guest must be registered to receive a complimentary meal, so we prepare the right amount and avoid food waste."; flags.push({t:"good",k:"Meals included",x:mealX}); // Seasonal closures (staff vacation) if(seasonNow==="winter" || seasonNow==="spring" || seasonNow==="fall"){ flags.push({t:"heads",k:"Seasonal closures",x:"We close for staff vacation November 16–December 14 and all of April (except during the Upper Peninsula Dark Sky Festival). Make sure your dates fall outside those windows — we're open the rest of the year."}); } // Group check — the Lodge does not host groups (multiple cabins / events) var partyN = Math.max(1, parseInt($("party").value,10)||1); var isGroup = (radios.grouptype==="yes") || partyN>6; // Verdict var verdict, eyebrow, say, fitLevel; if(isGroup){ fitLevel="group"; verdict="The Lodge doesn't host groups"; eyebrow="Your fit"; say="KML is a quiet place — and groups and quiet don't go together. Cabins are booked to one party at a time, never blocked together for reunions, weddings, retreats, or events. If your plans are really a smaller party here for peace and nature, change your answers above and we'll match you to a cabin. Otherwise the Lodge won't be the right fit — and that's okay."; flags=[{t:"rule",k:"Group policy",x:"KML does not host group bookings or events. Cabins are booked one party at a time and aren't blocked together — multi-cabin gatherings aren't accommodated."}]; } else { var seriousMiss = hard>=1 || mismatch>=2 || antiInterests.length>=2 || (reviewIntent && mismatch>=1) || (reviewIntent && antiInterests.length>=1); if(alignedInterests>=1 && mismatch===0 && antiInterests.length===0 && hard===0 && !reviewIntent){ fitLevel="strong"; verdict="A strong fit"; eyebrow="Your fit"; say="This sounds like exactly the trip the Lodge is built for. Let's get you into a cabin."; } else if(seriousMiss){ fitLevel="check"; verdict="Worth a closer look"; eyebrow="Your fit"; say="A few things here may not match what the Lodge is. None of it's a dealbreaker — but read the notes below so the trip meets you where you are."; } else { fitLevel="good"; verdict="A good fit — with a couple of notes"; eyebrow="Your fit"; say="You'd enjoy it here. Just a few things worth knowing before you book so nothing catches you off guard."; } } // Cabin var p = Math.max(1, parseInt($("party").value,10)||1); var bed = p<=2 ? 1 : (p<=4 ? 2 : (p<=6 ? 3 : 0)); var br = bed===1?"1-bedroom":bed===2?"2-bedroom":bed===3?"3-bedroom":"more than one cabin"; var season = $("season").value; var viewSel = $("view").value; var reqSide = viewSel==="golf"?"golf":(viewSel==="forest"?"forest":null); // Forest-side cabins (15–25) are closed Oct 16–May 15; winter falls entirely within var forestClosed = (season==="winter"); var sideFilter = reqSide; var closureNote = null; if(forestClosed && reqSide!=="golf"){ sideFilter = "golf"; closureNote = (reqSide==="forest") ? "Forest-side cabins (15–25) are closed October 16–May 15, so a winter stay is on the golf-course side (cabins 1–14)." : "In winter, only golf-course-side cabins (1–14) are open — the forest-side cabins (15–25) are closed October 16–May 15."; } var sideWord = sideFilter==="golf"?"golf-course side":(sideFilter==="forest"?"forest side":null); var viewTxt = sideWord ? sideWord : "golf-course or forest side — your pick"; var cabinSub; if(p>6){ cabinSub = "for a party of "+p+" — the Lodge's cabins run 1–3 bedrooms; the desk can pair a couple for you."; } else { cabinSub = "for a party of "+p+" · "+viewTxt; } var cabinNotes = []; if(closureNote) cabinNotes.push(closureNote); if(!forestClosed && (season==="spring"||season==="fall") && reqSide!=="golf"){ cabinNotes.push("Heads-up: forest-side cabins (15–25) are closed October 16–May 15. If your dates fall in that window, you'll be on the golf-course side (cabins 1–14)."); } var sideSuffix = sideWord ? " on the "+sideWord : ""; if(bed>=1 && bed<=3){ var pool = cabinsFor(bed, sideFilter); if(pool.length===0){ var otherWord = sideFilter==="golf"?"forest side":"golf-course side"; cabinNotes.push("There are no "+br+" cabins on the "+sideWord+" — they're all on the "+otherWord+" (cabins "+listNums(cabinNums(function(c){return c.bed===bed;}))+"). Choose that side, or pick a different size."); } else if(bed===1){ var standalone = pool.filter(function(c){return !c.duplex;}).map(function(c){return c.n;}); var duplexes = pool.filter(function(c){return c.duplex;}).map(function(c){return c.n;}); var parts=[]; if(standalone.length) parts.push("Cabin "+listNums(standalone)+" (its own standalone structure)"); if(duplexes.length) parts.push("cabins "+listNums(duplexes)+" (duplexes — you'd share a wall)"); var s1 = "1-bedroom options"+sideSuffix+": "+parts.join(", ")+"."; if(standalone.length) s1 += " Choose Cabin "+standalone[0]+" if you want a whole cabin to yourselves."; cabinNotes.push(s1); var twoOneBath = cabinsFor(2, sideFilter).filter(function(c){return c.bath===1;}).map(function(c){return c.n;}); if(twoOneBath.length) cabinNotes.push("Want more living space? A 2-bedroom, 1-bath cabin has a bigger living room than a 1-bedroom — consider cabins "+listNums(twoOneBath)+"."); } else if(bed===2){ var b1 = pool.filter(function(c){return c.bath===1;}).map(function(c){return c.n;}); var b2 = pool.filter(function(c){return c.bath===2;}).map(function(c){return c.n;}); var p2=[]; if(b1.length) p2.push("1-bath: "+listNums(b1)); if(b2.length) p2.push("2-bath: "+listNums(b2)); var s2 = "2-bedroom cabins"+sideSuffix+" — "+p2.join("; ")+"."; if(b2.length) s2 += " Choose a 2-bath cabin if more than one bathroom matters."; cabinNotes.push(s2); } else if(bed===3){ var ns = pool.map(function(c){return c.n;}); if(sideFilter) cabinNotes.push("The 3-bedroom cabin on the "+sideWord+" is Cabin "+listNums(ns)+" (one bathroom)."); else cabinNotes.push("The two 3-bedroom cabins are 1 (golf-course side) and 21 (forest side), both single-bathroom — there's no 3-bedroom, 2-bath option."); } if(pool.length){ var gasN = pool.filter(function(c){return GAS_CABINS.indexOf(c.n)>=0;}).map(function(c){return c.n;}); var woodN = pool.filter(function(c){return GAS_CABINS.indexOf(c.n)<0;}).map(function(c){return c.n;}); var oneCabin = (pool.length===1); if(gasN.length && woodN.length){ cabinNotes.push("Fireplaces: cabins "+listNums(gasN)+" are gas; cabins "+listNums(woodN)+" are wood-burning (firewood provided — build a fire safely and leave the ashes in the fireplace)."); } else if(gasN.length){ cabinNotes.push(oneCabin ? "This cabin has a gas fireplace." : "These cabins all have gas fireplaces."); } else { cabinNotes.push((oneCabin?"This cabin has a wood-burning fireplace":"These cabins have wood-burning fireplaces")+" — firewood is provided; build a fire safely and leave the ashes in the fireplace (don't remove them)."); } } } if($("pet").checked){ var petMatch = PET_CABINS.filter(function(n){var c=cabins.find(function(x){return x.n===n;});return c && c.bed===bed;}); if(petMatch.length) cabinNotes.push("Dog-friendly "+br+" cabins: "+listNums(petMatch)+"."); } if($("ev").checked){ if(bed===2) cabinNotes.push("For in-cabin EV charging, ask for cabin 10, 11, or 12 (2-bedroom, 1-bath, golf-course side); otherwise use the shared charger at the main Lodge."); else cabinNotes.push("In-cabin EV chargers are on cabins 10, 11, and 12 (all 2-bedroom); for a "+br+" cabin, use the shared charger at the main Lodge."); } if($("access").checked){ cabinNotes.push("For accessibility, Cabin 6 is the ADA-compliant cabin — a 1-bedroom duplex on the golf-course side, rebuilt in 1990 after a 1989 fire (its fireplace is original to 1936). Ask the desk to confirm it suits your party."); } // Cabins to offer booking links for (good fits) var bookCabins = []; if(bed>=1 && bed<=3){ if($("access").checked){ bookCabins = [6]; } else { bookCabins = cabinsFor(bed, sideFilter).map(function(c){return c.n;}); if($("pet").checked) bookCabins = bookCabins.filter(function(n){return PET_CABINS.indexOf(n)>=0;}); } } // Activities var swap = seasonSwap[season]||{}; var acts=[]; Object.keys(selected).forEach(function(k){ if(selected[k].fit!==1) return; var val = actMap[k]; if(swap.hasOwnProperty(k)) val = swap[k]; if(val==null) return; if(Array.isArray(val)) acts = acts.concat(val); else acts.push(val); }); if(acts.length===0){acts=["Trailhead hikes","Rustic worldly food at the lodge","Evenings by the fireplace"];} acts = acts.filter(function(v,i,a){return a.indexOf(v)===i;}).slice(0,8); return {verdict:verdict,eyebrow:eyebrow,say:say,flags:flags,br:br,cabinSub:cabinSub,acts:acts, party:p,season:season,viewTxt:viewTxt,access:$("access").checked,pet:$("pet").checked,ev:$("ev").checked,cabinNotes:cabinNotes,fitLevel:fitLevel,bookCabins:bookCabins,isGroup:isGroup}; } function buildSummary(r){ if(r.isGroup){ return [ "GUEST FIT RECAP — Keweenaw Mountain Lodge", "Fit: Not a fit — group booking (KML does not host groups)", "Party size: "+r.party, "Note: Guest indicated a group or multi-cabin event. Cabins are booked to one party at a time only; the Lodge does not host groups or events.", "Confirmed: read the policies, read the website, and understands how the Lodge operates." ].join("\n"); } var lines=[]; lines.push("GUEST FIT RECAP — Keweenaw Mountain Lodge"); lines.push("Fit: "+r.verdict); lines.push("Party size: "+r.party); lines.push("Cabin: "+r.br+" · "+r.viewTxt+(r.access?" · accessible: Cabin 6":"")+(r.pet?" · dog-friendly cabin required":"")+(r.ev?" · EV: cabins 10/11/12 or Lodge charger":"")); (r.cabinNotes||[]).forEach(function(t){lines.push(" - "+t);}); lines.push("Season: "+(r.season==="any"?"undecided":r.season)); var seeking = Object.keys(selected).map(function(k){return selected[k].label;}); lines.push("Looking for: "+(seeking.length?seeking.join(", "):"—")); var notes = r.flags.filter(function(f){return f.t!=="good";}); if(notes.length){ lines.push(""); lines.push("Notes:"); notes.forEach(function(f){lines.push(" • ["+f.k+"] "+f.x);}); } lines.push(""); lines.push("Confirmed: read the policies, read the website, and understands how the Lodge operates."); return lines.join("\n"); } function render(r){ $("vEyebrow").textContent=r.eyebrow; $("vTitle").textContent=r.verdict; $("vSay").textContent=r.say; if(r.isGroup){ $("cabinBlock").style.display="none"; $("actsBlock").style.display="none"; } else { $("cabinBlock").style.display="block"; $("actsBlock").style.display="block"; $("cabinBig").textContent=r.br; $("cabinSub").textContent=r.cabinSub; var cn=$("cabinNotes"); cn.innerHTML=""; (r.cabinNotes||[]).forEach(function(t){var d=document.createElement("div");d.className="cabin-note";d.textContent=t;cn.appendChild(d);}); var ab=$("acts"); ab.innerHTML=""; r.acts.forEach(function(a){var s=document.createElement("span");s.className="act";s.textContent=a;ab.appendChild(s);}); } var fb=$("flags"); fb.innerHTML=""; if(r.flags.length===0){$("flagsBlock").style.display="none";} else{ $("flagsBlock").style.display="block"; r.flags.forEach(function(f){ var d=document.createElement("div"); d.className="flag "+f.t; d.innerHTML=""+f.k+": "+f.x+""; fb.appendChild(d); }); } $("summaryText").textContent=buildSummary(r); renderBooking(r); var res=$("result"); res.classList.add("show"); res.scrollIntoView({behavior:"smooth",block:"start"}); } var AVAIL_URL="https://keweenawmountainlodge.client.innroad.com/grid"; function renderBooking(r){ var bb=$("bookBlock"); if(r.fitLevel!=="strong" && r.fitLevel!=="good" && r.fitLevel!=="check"){ bb.style.display="none"; return; } bb.style.display="block"; var bc=$("bookCabins"); bc.innerHTML=""; var genLink="Check real-time availability and book on our reservation system."; if(r.fitLevel==="check"){ $("bookIntro").textContent="If the Lodge still sounds like your kind of place after the notes above, you can check availability when you're ready."; $("bookGeneral").innerHTML=genLink; return; } if(r.bookCabins && r.bookCabins.length){ $("bookIntro").textContent="View the recommended "+(r.bookCabins.length>1?"cabins":"cabin")+", then check availability and book:";