
{"id":12473,"date":"2026-02-07T14:56:06","date_gmt":"2026-02-07T14:56:06","guid":{"rendered":"https:\/\/indianbrahmins.com\/?page_id=12473"},"modified":"2026-02-08T16:09:27","modified_gmt":"2026-02-08T16:09:27","slug":"reception-tulseevanam","status":"publish","type":"page","link":"https:\/\/indianbrahmins.com\/index.php\/reception-tulseevanam\/","title":{"rendered":"Reception-Tulseevanam"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"12473\" class=\"elementor elementor-12473\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d780b61 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"d780b61\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-83aedd9 elementor-widget elementor-widget-shortcode\" data-id=\"83aedd9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">    <div id=\"rtvApp\" class=\"rtv-wrap\">\n      <h2 class=\"rtv-title\">RECEPTION \u2013 TULASEE VANAM<\/h2>\n\n      <div class=\"rtv-admin-bar\">\n        <button type=\"button\" class=\"rtv-btn\" id=\"rtvLoginBtn\">\ud83d\udd10 Admin Login<\/button>\n        <button type=\"button\" class=\"rtv-btn rtv-hidden\" id=\"rtvLogoutBtn\">\ud83d\udeaa Logout<\/button>\n      <\/div>\n\n      <div id=\"rtvStatus\" class=\"rtv-status rtv-hidden\"><\/div>\n\n      <form id=\"rtvForm\" class=\"rtv-form\" autocomplete=\"off\">\n        <input id=\"rtv_name\" placeholder=\"Visitor Name\" required \/>\n        <input id=\"rtv_mobile\" placeholder=\"Mobile No\" required inputmode=\"numeric\" \/>\n        <input id=\"rtv_purpose\" placeholder=\"Purpose\" \/>\n        <input id=\"rtv_notes\" placeholder=\"Notes\" \/>\n        <!-- Honeypot (bots will fill it; humans won't see it) -->\n        <input id=\"rtv_hp\" class=\"rtv-hidden\" tabindex=\"-1\" autocomplete=\"off\" \/>\n        <button class=\"rtv-submit\" id=\"rtvSubmitBtn\" type=\"submit\">Submit<\/button>\n      <\/form>\n\n      <div id=\"rtvAdminPanel\" class=\"rtv-hidden\">\n        <h3 class=\"rtv-subtitle\">\ud83d\udd12 ADMIN PANEL<\/h3>\n\n        <div class=\"rtv-admin-controls\">\n          <select id=\"rtvFilter\">\n            <option value=\"ALL\">Show All<\/option>\n            <option value=\"Pending\">Show Pending Approval<\/option>\n            <option value=\"Approved\">Show Approved<\/option>\n          <\/select>\n\n          <button type=\"button\" class=\"rtv-btn\" id=\"rtvBulkPrivate\">\ud83d\udd12 Bulk Private<\/button>\n          <button type=\"button\" class=\"rtv-btn\" id=\"rtvBulkPublic\">\ud83c\udf10 Bulk Public<\/button>\n          <button type=\"button\" class=\"rtv-btn\" id=\"rtvBulkEdit\">\u270f Bulk Edit<\/button>\n          <button type=\"button\" class=\"rtv-btn\" id=\"rtvBulkDelete\">\ud83d\uddd1 Bulk Delete<\/button>\n        <\/div>\n\n        <div class=\"rtv-table-wrap\">\n          <table class=\"rtv-table\">\n            <thead>\n              <tr>\n                <th><input type=\"checkbox\" id=\"rtvSelectAll\" \/><\/th>\n                <th>Date &amp; Time<\/th>\n                <th>Name<\/th>\n                <th>Mobile<\/th>\n                <th>Purpose<\/th>\n                <th>Notes<\/th>\n                <th>Status<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody id=\"rtvAdminTable\"><\/tbody>\n          <\/table>\n        <\/div>\n      <\/div>\n\n      <h3 class=\"rtv-subtitle\">\ud83c\udf10 PUBLIC APPROVED DATA<\/h3>\n      <div class=\"rtv-table-wrap\">\n        <table class=\"rtv-table\">\n          <thead>\n            <tr>\n              <th>Date &amp; Time<\/th>\n              <th>Name<\/th>\n              <th>Mobile<\/th>\n              <th>Purpose<\/th>\n              <th>Notes<\/th>\n            <\/tr>\n          <\/thead>\n          <tbody id=\"rtvPublicTable\"><\/tbody>\n        <\/table>\n      <\/div>\n\n      <div id=\"rtvPrivateBlock\" class=\"rtv-hidden\">\n        <h3 class=\"rtv-subtitle\">\ud83d\udd12 PRIVATE APPROVED DATA<\/h3>\n        <div class=\"rtv-table-wrap\">\n          <table class=\"rtv-table\">\n            <thead>\n              <tr>\n                <th>Date &amp; Time<\/th>\n                <th>Name<\/th>\n                <th>Mobile<\/th>\n                <th>Purpose<\/th>\n                <th>Notes<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody id=\"rtvPrivateTable\"><\/tbody>\n          <\/table>\n        <\/div>\n      <\/div>\n\n      <div class=\"rtv-modal rtv-hidden\" id=\"rtvModal\">\n        <div class=\"rtv-modal-content\">\n          <button type=\"button\" class=\"rtv-close\" id=\"rtvCloseModal\">X<\/button>\n          <div id=\"rtvModalText\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <style>\n      #rtvApp, #rtvApp *{ color:#111 !important; font-family:Arial,sans-serif !important; box-sizing:border-box; }\n      #rtvApp{ background:#f3f6fb !important; padding:16px !important; border-radius:12px !important; }\n      #rtvApp .rtv-title, #rtvApp .rtv-subtitle{ text-align:center; margin:10px 0; }\n      #rtvApp .rtv-admin-bar{ display:flex; gap:10px; justify-content:flex-end; flex-wrap:wrap; margin-bottom:10px; }\n      #rtvApp .rtv-status{ margin:10px 0; padding:10px 12px; border-radius:10px; background:#fff; border:1px solid #cfd8e3; font-size:13px; }\n      #rtvApp .rtv-form{ display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:15px; }\n      #rtvApp input, #rtvApp select{\n        padding:10px; background:#fff8cc !important; color:#111 !important;\n        border:2px solid #2a7d2a !important; border-left-color:#d11 !important; border-radius:8px; outline:none;\n      }\n      #rtvApp .rtv-submit{\n        grid-column:1\/-1; padding:12px; background:#c8f7c5 !important; border:2px solid #2a7d2a !important;\n        border-radius:10px; font-weight:700; cursor:pointer;\n      }\n      #rtvApp .rtv-submit[disabled]{ opacity:.7; cursor:not-allowed; }\n      #rtvApp .rtv-btn{\n        padding:10px 12px; background:#fff8cc !important; border:2px solid #2a7d2a !important;\n        border-left-color:#d11 !important; border-radius:10px; font-weight:700; cursor:pointer;\n      }\n      #rtvApp .rtv-admin-controls{ display:flex; gap:10px; justify-content:center; flex-wrap:wrap; margin-bottom:10px; }\n      #rtvApp .rtv-table-wrap{ overflow:auto; background:#fff !important; border-radius:12px; border:1px solid #cfd8e3; }\n      #rtvApp .rtv-table{ width:100%; border-collapse:collapse; table-layout:fixed; }\n      #rtvApp .rtv-table th, #rtvApp .rtv-table td{\n        border:1px solid #333; padding:6px; font-size:13px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;\n        text-align:center; background:#fff !important;\n      }\n      #rtvApp .rtv-table th{ background:#111 !important; color:#fff !important; }\n      #rtvApp .rtv-private td{ background:#fff0f0 !important; }\n      #rtvApp .rtv-public td{ background:#e8fff0 !important; }\n      #rtvApp .rtv-hidden{ display:none !important; }\n      #rtvApp a{ color:#0645ad !important; text-decoration:underline !important; }\n      #rtvApp .rtv-modal{ position:fixed; inset:0; background:rgba(0,0,0,.6); display:flex; align-items:center; justify-content:center; z-index:99999; }\n      #rtvApp .rtv-modal-content{ background:#fff !important; padding:15px; width:min(520px,92vw); border-radius:12px; position:relative; }\n      #rtvApp .rtv-close{ position:absolute; right:10px; top:10px; border:0; background:#eee !important; border-radius:10px; padding:6px 10px; cursor:pointer; font-weight:700; }\n      @media (max-width:680px){ #rtvApp .rtv-form{ grid-template-columns:1fr; } }\n    <\/style>\n\n    <script>\n      (function(){\n        const RTV = {\n          ajaxUrl: \"https:\\\/\\\/indianbrahmins.com\\\/wp-admin\\\/admin-ajax.php\",\n          tokenKey: 'rtv_admin_token'\n        };\n        const el = (id)=>document.getElementById(id);\n\n        const statusBox = el('rtvStatus');\n        const loginBtn = el('rtvLoginBtn');\n        const logoutBtn = el('rtvLogoutBtn');\n        const adminPanel = el('rtvAdminPanel');\n        const adminTbody = el('rtvAdminTable');\n        const publicTbody = el('rtvPublicTable');\n        const privateBlock = el('rtvPrivateBlock');\n        const privateTbody = el('rtvPrivateTable');\n        const filterSel = el('rtvFilter');\n        const selectAll = el('rtvSelectAll');\n        const modal = el('rtvModal');\n        const modalText = el('rtvModalText');\n        const submitBtn = el('rtvSubmitBtn');\n\n        let isSubmitting = false;\n\n        function setStatus(msg, isError){\n          if(!msg){ statusBox.classList.add('rtv-hidden'); statusBox.textContent=''; return; }\n          statusBox.textContent = msg;\n          statusBox.style.borderColor = isError ? '#d11' : '#cfd8e3';\n          statusBox.style.background = isError ? '#fff0f0' : '#fff';\n          statusBox.classList.remove('rtv-hidden');\n        }\n\n        function getToken(){ return sessionStorage.getItem(RTV.tokenKey) || ''; }\n        function setToken(t){ sessionStorage.setItem(RTV.tokenKey, t); }\n        function clearToken(){ sessionStorage.removeItem(RTV.tokenKey); }\n        function isAdmin(){ return !!getToken(); }\n\n        function showModal(txt){\n          modalText.textContent = txt || '';\n          modal.classList.remove('rtv-hidden');\n        }\n        el('rtvCloseModal').addEventListener('click', ()=> modal.classList.add('rtv-hidden'));\n        modal.addEventListener('click', (e)=>{ if(e.target === modal) modal.classList.add('rtv-hidden'); });\n\n        function qs(obj){\n          const p = new URLSearchParams();\n          Object.keys(obj).forEach(k=>p.append(k, obj[k]));\n          return p.toString();\n        }\n\n        function escapeHtml(str){\n          return (str+'')\n            .replaceAll('&','&amp;')\n            .replaceAll('<','&lt;')\n            .replaceAll('>','&gt;')\n            .replaceAll('\"','&quot;')\n            .replaceAll(\"'\",\"&#039;\");\n        }\n\n        function shortText(t){\n          if(!t) return '';\n          if(t.length <= 18) return escapeHtml(t);\n          const s = escapeHtml(t.slice(0,18)) + '... ';\n          return s + `<a href=\"#\" data-full=\"${encodeURIComponent(t)}\">Read<\/a>`;\n        }\n\n        async function post(action, data, opts){\n          const retries = (opts && opts.retries != null) ? opts.retries : 1;\n          const timeoutMs = (opts && opts.timeoutMs != null) ? opts.timeoutMs : 12000;\n          let lastErr = null;\n\n          for(let attempt=0; attempt<=retries; attempt++){\n            const controller = new AbortController();\n            const t = setTimeout(()=>controller.abort(), timeoutMs);\n\n            try{\n              const body = qs(Object.assign({ action, token: getToken() }, data || {}));\n\n              const res = await fetch(RTV.ajaxUrl, {\n                method: 'POST',\n                headers: { 'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8' },\n                body,\n                credentials: 'same-origin',\n                cache: 'no-store',\n                signal: controller.signal\n              });\n\n              clearTimeout(t);\n\n              const json = await res.json();\n              if(!json || !json.success) throw new Error((json && json.data && json.data.message) ? json.data.message : 'Request failed');\n              return json.data;\n\n            } catch(err){\n              clearTimeout(t);\n              lastErr = err;\n              const isAbort = (err && err.name === 'AbortError');\n              const isNetwork = (err && (''+err.message).toLowerCase().includes('failed to fetch'));\n              if(attempt < retries && (isAbort || isNetwork)){\n                await new Promise(r=>setTimeout(r, 500 * (attempt+1)));\n                continue;\n              }\n              throw lastErr;\n            }\n          }\n          throw lastErr || new Error('Request failed');\n        }\n\n        function renderAuth(){\n          const admin = isAdmin();\n          adminPanel.classList.toggle('rtv-hidden', !admin);\n          loginBtn.classList.toggle('rtv-hidden', admin);\n          logoutBtn.classList.toggle('rtv-hidden', !admin);\n          privateBlock.classList.toggle('rtv-hidden', !admin);\n        }\n\n        function selectedIds(){\n          return Array.from(document.querySelectorAll('#rtvAdminTable input[type=checkbox]:checked'))\n            .map(cb => cb.getAttribute('data-id'));\n        }\n\n        async function loadTables(){\n          renderAuth();\n          setStatus('Loading data\u2026', false);\n\n          try{\n            const f = filterSel ? filterSel.value : 'ALL';\n            const data = await post('rtv_list', { filter: f }, { retries: 2, timeoutMs: 12000 });\n\n            if(isAdmin()){\n              let html = '';\n              (data.admin || []).forEach(row=>{\n                const cls = (row.status === 'Public') ? 'rtv-public' : 'rtv-private';\n                html += `\n                  <tr class=\"${cls}\">\n                    <td><input type=\"checkbox\" data-id=\"${escapeHtml(row.id)}\"><\/td>\n                    <td>${escapeHtml(row.time)}<\/td>\n                    <td>${escapeHtml(row.name)}<\/td>\n                    <td>${escapeHtml(row.mobile)}<\/td>\n                    <td>${shortText(row.purpose || '')}<\/td>\n                    <td>${shortText(row.notes || '')}<\/td>\n                    <td>${escapeHtml(row.status)}<\/td>\n                  <\/tr>`;\n              });\n              adminTbody.innerHTML = html;\n            } else {\n              adminTbody.innerHTML = '';\n            }\n\n            let pub = '';\n            (data.public || []).forEach(row=>{\n              pub += `\n                <tr class=\"rtv-public\">\n                  <td>${escapeHtml(row.time)}<\/td>\n                  <td>${escapeHtml(row.name)}<\/td>\n                  <td>${escapeHtml(row.mobile)}<\/td>\n                  <td>${escapeHtml(row.purpose || '')}<\/td>\n                  <td>${escapeHtml(row.notes || '')}<\/td>\n                <\/tr>`;\n            });\n            publicTbody.innerHTML = pub;\n\n            if(isAdmin()){\n              let pri = '';\n              (data.private || []).forEach(row=>{\n                pri += `\n                  <tr class=\"rtv-private\">\n                    <td>${escapeHtml(row.time)}<\/td>\n                    <td>${escapeHtml(row.name)}<\/td>\n                    <td>${escapeHtml(row.mobile)}<\/td>\n                    <td>${escapeHtml(row.purpose || '')}<\/td>\n                    <td>${escapeHtml(row.notes || '')}<\/td>\n                  <\/tr>`;\n              });\n              privateTbody.innerHTML = pri;\n            } else {\n              privateTbody.innerHTML = '';\n            }\n\n            document.querySelectorAll('#rtvApp a[data-full]').forEach(a=>{\n              a.addEventListener('click', (e)=>{\n                e.preventDefault();\n                showModal(decodeURIComponent(a.getAttribute('data-full') || ''));\n              });\n            });\n\n            setStatus('', false);\n          } catch(err){\n            setStatus('Load failed: ' + (err && err.message ? err.message : 'Failed to fetch'), true);\n          }\n        }\n\n        function makeClientToken(){\n          try{ if(window.crypto && crypto.randomUUID) return crypto.randomUUID(); } catch(e){}\n          return 'ct_' + Math.random().toString(16).slice(2) + '_' + Date.now();\n        }\n\n        el('rtvForm').addEventListener('submit', async (e)=>{\n          e.preventDefault();\n          if(isSubmitting) return;\n\n          \/\/ Honeypot (bots)\n          if((el('rtv_hp').value || '').trim() !== '') return;\n\n          const name = el('rtv_name').value.trim();\n          const mobile = el('rtv_mobile').value.trim();\n          const purpose = el('rtv_purpose').value.trim();\n          const notes = el('rtv_notes').value.trim();\n\n          if(!name || !mobile){\n            setStatus('Name & Mobile required.', true);\n            return;\n          }\n\n          isSubmitting = true;\n          setStatus('Saving\u2026 Please wait.', false);\n          const oldText = submitBtn.textContent;\n          submitBtn.textContent = 'Saving\u2026';\n          submitBtn.disabled = true;\n\n          try{\n            await post('rtv_submit', { name, mobile, purpose, notes, client_token: makeClientToken() }, { retries: 1, timeoutMs: 12000 });\n            e.target.reset();\n            setStatus('Saved successfully.', false);\n            await loadTables();\n            setTimeout(()=>setStatus('', false), 1500);\n          } catch(err){\n            setStatus('Save failed: ' + (err && err.message ? err.message : 'Failed to fetch'), true);\n          } finally {\n            isSubmitting = false;\n            submitBtn.disabled = false;\n            submitBtn.textContent = oldText;\n          }\n        });\n\n        loginBtn.addEventListener('click', async ()=>{\n          const pin = prompt('Enter Admin PIN:');\n          if(pin === null) return;\n          setStatus('Logging in\u2026', false);\n          try{\n            const out = await post('rtv_login', { pin }, { retries: 0, timeoutMs: 12000 });\n            setToken(out.token);\n            setStatus('Logged in.', false);\n            await loadTables();\n            setTimeout(()=>setStatus('', false), 1200);\n          } catch(err){\n            setStatus('Login failed: ' + (err && err.message ? err.message : 'Wrong PIN'), true);\n          }\n        });\n\n        logoutBtn.addEventListener('click', async ()=>{\n          clearToken();\n          setStatus('Logged out.', false);\n          await loadTables();\n          setTimeout(()=>setStatus('', false), 1200);\n        });\n\n        filterSel.addEventListener('change', ()=> loadTables());\n        selectAll.addEventListener('change', ()=>{\n          document.querySelectorAll('#rtvAdminTable input[type=checkbox]').forEach(cb=> cb.checked = selectAll.checked);\n        });\n\n        el('rtvBulkPrivate').addEventListener('click', async ()=>{\n          const ids = selectedIds();\n          if(!ids.length) return setStatus('Select rows first.', true);\n          setStatus('Updating\u2026', false);\n          try{ await post('rtv_bulk_update', { ids: ids.join(','), status:'Private' }, { retries:1, timeoutMs:12000 }); await loadTables(); }\n          catch(err){ setStatus('Update failed: ' + err.message, true); }\n        });\n\n        el('rtvBulkPublic').addEventListener('click', async ()=>{\n          const ids = selectedIds();\n          if(!ids.length) return setStatus('Select rows first.', true);\n          setStatus('Updating\u2026', false);\n          try{ await post('rtv_bulk_update', { ids: ids.join(','), status:'Public' }, { retries:1, timeoutMs:12000 }); await loadTables(); }\n          catch(err){ setStatus('Update failed: ' + err.message, true); }\n        });\n\n        el('rtvBulkDelete').addEventListener('click', async ()=>{\n          const ids = selectedIds();\n          if(!ids.length) return setStatus('Select rows first.', true);\n          if(!confirm('Delete selected records?')) return;\n          setStatus('Deleting\u2026', false);\n          try{ await post('rtv_bulk_delete', { ids: ids.join(',') }, { retries:1, timeoutMs:12000 }); await loadTables(); }\n          catch(err){ setStatus('Delete failed: ' + err.message, true); }\n        });\n\n        el('rtvBulkEdit').addEventListener('click', async ()=>{\n          const ids = selectedIds();\n          if(!ids.length) return setStatus('Select rows first.', true);\n          const purpose = prompt('New Purpose (leave blank to skip):', '');\n          if(purpose === null) return;\n          const notes = prompt('New Notes (leave blank to skip):', '');\n          if(notes === null) return;\n          setStatus('Editing\u2026', false);\n          try{ await post('rtv_bulk_edit', { ids: ids.join(','), purpose, notes }, { retries:1, timeoutMs:12000 }); await loadTables(); }\n          catch(err){ setStatus('Edit failed: ' + err.message, true); }\n        });\n\n        loadTables();\n      })();\n    <\/script>\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-12473","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/indianbrahmins.com\/index.php\/wp-json\/wp\/v2\/pages\/12473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/indianbrahmins.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/indianbrahmins.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/indianbrahmins.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/indianbrahmins.com\/index.php\/wp-json\/wp\/v2\/comments?post=12473"}],"version-history":[{"count":46,"href":"https:\/\/indianbrahmins.com\/index.php\/wp-json\/wp\/v2\/pages\/12473\/revisions"}],"predecessor-version":[{"id":12554,"href":"https:\/\/indianbrahmins.com\/index.php\/wp-json\/wp\/v2\/pages\/12473\/revisions\/12554"}],"wp:attachment":[{"href":"https:\/\/indianbrahmins.com\/index.php\/wp-json\/wp\/v2\/media?parent=12473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}