window.NLBK = window.NLBK || (function () {var D = [{"s":"chennai","c":"Chennai","a":"Alwarpet","n":"Nalam Alwarpet","p":"+91 44 4620 1414","e":"alwarpet@nalam.in","m":8,"w":60,"i":"https://images.unsplash.com/photo-1582228096960-7f5d2ec4aa8e?auto=format&fit=crop&w=800&h=500&q=75","h":{"mon":[["Dinner","19:00","23:30"]],"tue":[["Lunch","12:30","15:30"],["Dinner","19:00","23:30"]],"wed":[["Lunch","12:30","15:30"],["Dinner","19:00","23:30"]],"thu":[["Lunch","12:30","15:30"],["Dinner","19:00","23:30"]],"fri":[["Lunch","12:30","15:30"],["Dinner","19:00","23:30"]],"sat":[["Lunch","12:30","15:30"],["Dinner","19:00","23:30"]],"sun":[["Lunch","12:30","15:30"],["Dinner","19:00","23:30"]]},"x":{"2026-10-30":["Staff day",null]},"ar":[["Main room","Long room facing the hearth"],["Chef’s counter","Twelve stools around the fire"],["Verandah","Open-air, ceiling fans"]]},{"s":"bangalore","c":"Bengaluru","a":"Indiranagar","n":"Nalam Indiranagar","p":"+91 80 4718 2290","e":"indiranagar@nalam.in","m":10,"w":60,"i":"https://images.unsplash.com/photo-1573330013103-79abb849927b?auto=format&fit=crop&w=800&h=500&q=75","h":{"mon":[["Lunch","12:00","15:30"],["Dinner","19:00","23:30"]],"tue":[["Lunch","12:00","15:30"],["Dinner","19:00","23:30"]],"wed":[["Lunch","12:00","15:30"],["Dinner","19:00","23:30"]],"thu":[["Lunch","12:00","15:30"],["Dinner","19:00","23:30"]],"fri":[["Lunch","12:00","15:30"],["Dinner","19:00","23:30"]],"sat":[["Brunch","12:00","16:00"],["Dinner","19:00","23:59"]],"sun":[["Brunch","12:00","16:00"],["Dinner","19:00","23:00"]]},"x":{},"ar":[["Ground floor","Bar and grill counter"],["Terrace","Covered, open through the monsoon"]]},{"s":"mumbai","c":"Mumbai","a":"Bandra West","n":"Nalam Bandra","p":"+91 22 6914 0822","e":"bandra@nalam.in","m":6,"w":60,"i":"https://images.unsplash.com/photo-1569921894261-ecda0b2cc1af?auto=format&fit=crop&w=800&h=500&q=75","h":{"mon":[],"tue":[["Dinner","18:30","23:30"]],"wed":[["Dinner","18:30","23:30"]],"thu":[["Dinner","18:30","23:30"]],"fri":[["Dinner","18:30","01:00"]],"sat":[["Lunch","12:30","15:30"],["Dinner","18:30","01:00"]],"sun":[["Dinner","18:30","23:30"]]},"x":{},"ar":[["Bar","High tops along the copper bar"],["Dining room","Banquettes and two-tops"]]},{"s":"hyderabad","c":"Hyderabad","a":"Jubilee Hills","n":"Nalam Jubilee Hills","p":"+91 40 4855 3636","e":"jubileehills@nalam.in","m":12,"w":60,"i":"https://images.unsplash.com/photo-1669043962012-a5b8496cd664?auto=format&fit=crop&w=800&h=500&q=75","h":{"mon":[["Lunch","12:30","16:00"],["Dinner","19:00","23:30"]],"tue":[["Lunch","12:30","16:00"],["Dinner","19:00","23:30"]],"wed":[["Lunch","12:30","16:00"],["Dinner","19:00","23:30"]],"thu":[["Lunch","12:30","16:00"],["Dinner","19:00","23:30"]],"fri":[["Lunch","12:30","16:00"],["Dinner","19:00","23:30"]],"sat":[["Lunch","12:30","16:00"],["Dinner","19:00","23:30"]],"sun":[["Lunch","12:30","16:00"],["Dinner","19:00","23:30"]]},"x":{"2026-11-06":["Private event — dinner only",[["Dinner","20:00","23:30"]]]},"ar":[["Main room","Garden-facing windows"],["Garden","Under the neem trees"],["Private room","Seats up to 14"]]},{"s":"kochi","c":"Kochi","a":"Fort Kochi","n":"Nalam Fort Kochi","p":"+91 484 297 1402","e":"fortkochi@nalam.in","m":8,"w":60,"i":"https://images.unsplash.com/photo-1621246935353-ff54e60ab837?auto=format&fit=crop&w=800&h=500&q=75","h":{"mon":[["Lunch","12:00","15:30"],["Dinner","19:00","23:00"]],"tue":[["Dinner","19:00","23:30"]],"wed":[["Lunch","12:00","15:30"],["Dinner","19:00","23:00"]],"thu":[["Lunch","12:00","15:30"],["Dinner","19:00","23:00"]],"fri":[["Lunch","12:00","15:30"],["Dinner","19:00","23:00"]],"sat":[["Lunch","12:00","15:30"],["Dinner","19:00","23:00"]],"sun":[["Lunch","12:00","15:30"],["Dinner","19:00","23:00"]]},"x":{"2026-10-21":["Closed for Thiruvonam",null]},"ar":[["Courtyard","Open to the sky"],["Godown room","Laterite walls, teak beams"]]}];var S = { b: '', d: '', g: 0, t: '', a: 'any', ev: '', k: 1 }, R = null, M = null;var LABEL = ['', 'Branch', 'Date', 'Guests', 'Time', 'Table', 'Your details'];var WD = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];function P(n) { return ('0' + n).slice(-2); }function iso(d) { return d.getFullYear() + '-' + P(d.getMonth() + 1) + '-' + P(d.getDate()); }function parse(s) { return new Date(s + 'T12:00:00'); }function today() { return iso(new Date()); }function addDays(s, n) { var d = parse(s); d.setDate(d.getDate() + n); return iso(d); }function mins(t) { return +t.slice(0, 2) * 60 + +t.slice(3, 5); }function fmt(t) { var h = +t.slice(0, 2), m = t.slice(3, 5); return ((h % 12) || 12) + ':' + m + (h >= 12 && h < 24 ? ' PM' : ' AM'); }function longDate(s) { return parse(s).toLocaleDateString('en-IN', { weekday: 'long', day: 'numeric', month: 'long' }); }function root() { if (!R || !document.body.contains(R)) R = document.querySelector('.nl-res'); return R; }function q(s) { var r = root(); return r ? r.querySelector(s) : null; }function qa(s) { var r = root(); return r ? [].slice.call(r.querySelectorAll(s)) : []; }function br() { for (var i = 0; i < D.length; i++) if (D[i].s === S.b) return D[i]; return null; }function shifts(b, ds) { if (!b) return []; if (b.x[ds]) return b.x[ds][1] || []; return b.h[WD[parse(ds).getDay()]] || []; }function holiday(b, ds) { return b && b.x[ds] ? b.x[ds][0] : ''; }function el(tag, cls, txt) { var e = document.createElement(tag); if (cls) e.className = cls; if (txt != null) e.textContent = txt; return e; }function btn(cls, txt, fn) { var b = el('button', cls, txt); b.type = 'button'; b.onclick = fn; return b; }function slots(b, ds) {var out = [], now = new Date(), cut = now.getHours() * 60 + now.getMinutes() + 60, isToday = ds === today();shifts(b, ds).forEach(function (s) {var o = mins(s[1]), c = mins(s[2]); if (c <= o) c += 1440;for (var m = o; m <= c - 75; m += 30) { if (isToday && m < cut) continue; out.push({ shift: s[0], time: P(Math.floor(m / 60) % 24) + ':' + P(m % 60) }); }});return out;}function status(b) {var t = today(), now = new Date(), n = now.getHours() * 60 + now.getMinutes(), sh = shifts(b, t), i, s;for (i = 0; i < sh.length; i++) { s = sh[i]; var o = mins(s[1]), c = mins(s[2]); if (c <= o) c += 1440; if (n >= o && n < c) return { open: true, label: c - n <= 45 ? 'Closing soon' : 'Open now', detail: s[0] + ' until ' + fmt(s[2]) }; }for (i = 0; i < sh.length; i++) if (mins(sh[i][1]) > n) return { open: false, label: 'Closed now', detail: 'Opens ' + fmt(sh[i][1]) + ' for ' + sh[i][0].toLowerCase() };for (i = 1; i <= 7; i++) { var ds = addDays(t, i), nx = shifts(b, ds)[0]; if (nx) return { open: false, label: 'Closed now', detail: 'Opens ' + (i === 1 ? 'tomorrow' : parse(ds).toLocaleDateString('en-IN', { weekday: 'long' })) + ' ' + fmt(nx[1]) }; }return { open: false, label: 'Temporarily closed', detail: '' };}function done(k) { return k === 1 ? !!S.b : k === 2 ? !!S.d : k === 3 ? S.g > 0 : k === 4 || k === 5 ? !!S.t : false; }function reachable(k) { for (var i = 1; i < k; i++) if (!done(i)) return false; return true; }function canNext() { return S.k === 5 || done(S.k); }function steps() {qa('.nl-step').forEach(function (it) {var k = +((it.className.match(/nl-step-(\d)/) || [])[1] || 0); if (!k) return;it.classList.toggle('is-current', k === S.k);it.classList.toggle('is-done', k < S.k && done(k));it.classList.toggle('is-locked', k > S.k && !reachable(k));var num = it.querySelector('.nl-step-num'); if (num) num.textContent = k < S.k && done(k) ? '✓' : String(k);it.setAttribute('aria-current', k === S.k ? 'step' : 'false');});var bar = q('.nl-steps'), cur = q('.nl-step.is-current');if (bar && cur && bar.scrollWidth > bar.clientWidth) bar.scrollTo({ left: cur.offsetLeft - 16, behavior: 'smooth' });}function panels(focus) {qa('.nl-res-panel').forEach(function (p) {var k = +((p.className.match(/nl-p-(\d)/) || [])[1] || 0), on = k === S.k;p.classList.toggle('is-on', on);if (on && focus) { var h = p.querySelector('h1,h2,h3'); if (h) { h.setAttribute('tabindex', '-1'); try { h.focus({ preventScroll: true }); } catch (e) {} } }});var back = q('.nl-res-back'), next = q('.nl-res-next');if (back) back.style.visibility = S.k > 1 ? 'visible' : 'hidden';if (next) { next.style.display = S.k === 6 ? 'none' : ''; next.disabled = !canNext(); next.classList.toggle('is-disabled', !canNext()); }var r = root(); if (focus && r) { var top = r.getBoundingClientRect().top; if (top < 0) window.scrollTo({ top: window.pageYOffset + top - 120, behavior: 'smooth' }); }}function tiles() {D.forEach(function (b) {var st = status(b);qa('.nl-st-' + b.s).forEach(function (x) { x.textContent = st.label + (st.detail ? ' · ' + st.detail : ''); x.classList.toggle('is-open', st.open); });});qa('.nl-res-branch').forEach(function (t) { var on = !!S.b && t.classList.contains('nl-res-b-' + S.b); t.classList.toggle('is-selected', on); t.setAttribute('aria-checked', on ? 'true' : 'false'); });}function calendar() {var b = br(), c = q('.nl-cal'); if (!c) return; c.innerHTML = ''; if (!b) return;var min = today(), max = addDays(min, b.w || 60);if (!M) { var f = parse(S.d || min); M = new Date(f.getFullYear(), f.getMonth(), 1); }var head = el('div', 'nl-cal-head');var prevOk = iso(M) > min.slice(0, 8) + '01', nextOk = iso(new Date(M.getFullYear(), M.getMonth() + 1, 1)) <= max;var pv = btn('nl-cal-nav', '‹', function () { M = new Date(M.getFullYear(), M.getMonth() - 1, 1); calendar(); }); pv.disabled = !prevOk; pv.setAttribute('aria-label', 'Previous month');var nx = btn('nl-cal-nav', '›', function () { M = new Date(M.getFullYear(), M.getMonth() + 1, 1); calendar(); }); nx.disabled = !nextOk; nx.setAttribute('aria-label', 'Next month');var lab = el('p', 'nl-cal-month', M.toLocaleDateString('en-IN', { month: 'long', year: 'numeric' })); lab.setAttribute('aria-live', 'polite');head.appendChild(pv); head.appendChild(lab); head.appendChild(nx); c.appendChild(head);var g = el('div', 'nl-cal-grid'); g.setAttribute('role', 'grid');['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'].forEach(function (w) { g.appendChild(el('span', 'nl-cal-dow', w)); });var start = new Date(M); start.setDate(start.getDate() - ((start.getDay() + 6) % 7));for (var i = 0; i < 42; i++) {var d = new Date(start); d.setDate(start.getDate() + i);var ds = iso(d), off = ds < min || ds > max || !shifts(b, ds).length, hol = holiday(b, ds);var cell = btn('nl-cal-day' + (d.getMonth() !== M.getMonth() ? ' is-outside' : '') + (ds === S.d ? ' is-selected' : '') + (ds === min ? ' is-today' : ''), String(d.getDate()), (function (ds) { return function () { pick('date', ds); }; })(ds));cell.disabled = off;cell.setAttribute('aria-label', longDate(ds) + (off && ds >= min && ds <= max ? ', closed' + (hol ? ' (' + hol + ')' : '') : ''));if (hol) cell.title = hol;g.appendChild(cell);}c.appendChild(g);var lg = el('p', 'nl-cal-legend'); lg.appendChild(el('span', 'nl-cal-dot')); lg.appendChild(document.createTextNode(' Today · greyed-out days are closed or outside our booking window')); c.appendChild(lg);}function guests() {var b = br(), c = q('.nl-res-guests'), nt = q('.nl-res-gnote'); if (!c) return; c.innerHTML = ''; if (!b) return;for (var i = 1; i <= b.m; i++) {var o = btn('nl-guest' + (i === S.g ? ' is-selected' : ''), String(i), (function (i) { return function () { pick('guests', i); }; })(i));o.setAttribute('role', 'radio'); o.setAttribute('aria-checked', i === S.g ? 'true' : 'false'); c.appendChild(o);}if (nt) nt.textContent = 'Bigger group? Call ' + b.a + ' on ' + b.p + ' or ask about private dining.';}function times() {var b = br(), c = q('.nl-res-times'), nt = q('.nl-res-tnote'); if (!c) return; c.innerHTML = ''; if (!b || !S.d) return;var list = slots(b, S.d);if (!shifts(b, S.d).length) {if (nt) nt.textContent = b.a + ' is closed on ' + longDate(S.d) + '. ' + (holiday(b, S.d) || 'Choose another day.');c.appendChild(btn('nl-res-link', 'Choose another date', function () { go(2); })); return;}if (!list.length) {if (nt) nt.textContent = 'No more bookable times on ' + longDate(S.d) + '. Choose another day, or call ' + b.a + ' on ' + b.p + '.';c.appendChild(btn('nl-res-link', 'Choose another date', function () { go(2); })); return;}if (nt) nt.textContent = 'Times ' + b.a + ' serves on ' + longDate(S.d) + ' for ' + S.g + (S.g > 1 ? ' guests' : ' guest') + '. The branch confirms your table by phone or email.';var groups = {};list.forEach(function (s) {if (!groups[s.shift]) { var f = el('fieldset', 'nl-slots-group'); f.appendChild(el('legend', '', s.shift)); var w = el('div', 'nl-slots-grid'); f.appendChild(w); c.appendChild(f); groups[s.shift] = w; }var o = btn('nl-slot' + (s.time === S.t ? ' is-selected' : ''), '', (function (t) { return function () { pick('time', t); }; })(s.time));o.appendChild(el('span', 'nl-slot-time', fmt(s.time))); o.setAttribute('aria-pressed', s.time === S.t ? 'true' : 'false');groups[s.shift].appendChild(o);});}function areas() {var b = br(), c = q('.nl-res-areas'); if (!c) return; c.innerHTML = ''; if (!b) return;function card(key, title, body) {var o = btn('nl-area' + (S.a === key ? ' is-selected' : ''), '', function () { pick('area', key); });o.appendChild(el('strong', '', title)); o.appendChild(el('span', '', body)); o.setAttribute('aria-pressed', S.a === key ? 'true' : 'false'); return o;}c.appendChild(card('any', 'No preference', 'We’ll seat you at the best table for your party. Recommended.'));(b.ar || []).forEach(function (a) { c.appendChild(card(a[0], a[0], a[1])); });}function summary() {var b = br();function set(k, v) { qa('.nl-res-sum-' + k).forEach(function (x) { x.textContent = v || '—'; }); }set('branch', b ? b.n : ''); set('date', S.d ? longDate(S.d) : ''); set('guests', S.g ? String(S.g) : ''); set('time', S.t ? fmt(S.t) : '');set('table', S.t ? (S.a === 'any' ? 'No preference' : S.a) : '');qa('.nl-res-ch').forEach(function (x) { var k = +((x.className.match(/nl-ch-(\d)/) || [])[1] || 0); x.style.visibility = k && done(k) ? 'visible' : 'hidden'; });var ph = q('.nl-res-sum-phone'); if (ph) { ph.textContent = b ? b.p : ''; ph.style.display = b ? '' : 'none'; if (b) ph.setAttribute('href', 'tel:' + b.p.replace(/\s/g, '')); }var im = q('.nl-res-sum-img img'); if (im && b) { im.src = b.i; im.alt = b.n; }fill();}function fill() {var b = br(), f = q('.nl-form'); if (!f) return;function set(nm, v) {var x = f.querySelector('[data-fieldname="' + nm + '"] input,[data-fieldname="' + nm + '"] select,[data-fieldname="' + nm + '"] textarea,[name="' + nm + '"]');if (x && v !== '' && x.value !== String(v)) { x.value = v; x.dispatchEvent(new Event('change', { bubbles: true })); x.dispatchEvent(new Event('input', { bubbles: true })); }}set('branch', b ? b.n : ''); set('booking_date', S.d); set('booking_time', S.t); set('guests', S.g || '');set('seating_preference', S.t ? (S.a === 'any' ? 'No preference' : S.a) : '');if (S.ev) set('special_requests', 'For the event: ' + S.ev);var fb = q('.nl-res-fallback'); if (fb && f.querySelector('input,select,textarea')) fb.classList.add('is-hidden');var m = q('.nl-res-mail');if (m && b) {var body = 'Hello ' + b.a + ',\n\nI would like a table for ' + (S.g || '') + ' on ' + (S.d ? longDate(S.d) : '') + ' at ' + (S.t ? fmt(S.t) : '') + (S.a !== 'any' ? ' (' + S.a + ' if possible)' : '') + '.\n\nName:\nMobile:\n';m.setAttribute('href', 'mailto:' + b.e + '?subject=' + encodeURIComponent('Table request: ' + b.n) + String.fromCharCode(38) + 'body=' + encodeURIComponent(body));}}function render(focus) { steps(); tiles(); calendar(); guests(); times(); areas(); summary(); panels(focus); }function go(k) { if (k >= 1 && k <= 6 && reachable(k)) { S.k = k; if (k === 2) M = null; render(true); } }function next() { if (canNext()) go(Math.min(S.k + 1, 6)); }function back() { go(Math.max(S.k - 1, 1)); }function later(k) { setTimeout(function () { go(k); }, 180); }function pick(kind, v) {var b;if (kind === 'branch') {S.b = v; S.t = ''; S.a = 'any'; b = br();if (S.d && !shifts(b, S.d).length) S.d = '';if (S.g > b.m) S.g = 0;render(false); later(S.d ? (S.g ? 4 : 3) : 2);} else if (kind === 'date') { S.d = v; S.t = ''; render(false); later(S.g ? 4 : 3); }else if (kind === 'guests') { S.g = +v; S.t = ''; render(false); later(4); }else if (kind === 'time') { S.t = v; render(false); later(5); }else if (kind === 'area') { S.a = v; render(false); }}function init() {var r = root(); if (!r || r.__nl) return; r.__nl = 1; r.classList.add('nl-js');var p = new URLSearchParams(location.search), b = p.get('branch'), d = p.get('date'), g = +p.get('guests') || 0;S.ev = p.get('event') || '';var known = D.some(function (x) { return x.s === b; });if (known) {S.b = b; var bb = br();if (d && /^\d{4}-\d{2}-\d{2}$/.test(d) && d >= today() && shifts(bb, d).length) S.d = d;if (g && g <= bb.m) S.g = g;}S.k = S.b ? (S.d ? (S.g ? 4 : 3) : 2) : 1;render(false);var t = 0, iv = setInterval(function () { fill(); if (++t > 20) clearInterval(iv); }, 500);}return { init: init, pick: function (k, v) { init(); pick(k, v); }, go: function (k) { init(); go(k); }, next: function () { init(); next(); }, back: function () { init(); back(); }, fill: fill };})();
Which Nalam would you like to visit?
Chennai
Nalam Alwarpet
Tamil & Chettinad, cooked over tamarind wood
Bengaluru
Nalam Indiranagar
Coastal Karnataka & Kodava, with a charcoal grill
Mumbai
Nalam Bandra
Konkan coast seafood & a cocktail bar
Hyderabad
Nalam Jubilee Hills
Deccan & Andhra, with a charcoal dum kitchen
Kochi
Nalam Fort Kochi
Malabar & Syrian Christian, with the day’s catch