{"id":969,"date":"2026-04-22T05:48:36","date_gmt":"2026-04-22T05:48:36","guid":{"rendered":"https:\/\/tourvill.com\/?page_id=969"},"modified":"2026-05-20T11:51:05","modified_gmt":"2026-05-20T11:51:05","slug":"tourvill-admin","status":"publish","type":"page","link":"https:\/\/tourvill.com\/index.php\/tourvill-admin\/","title":{"rendered":"TourVill Admin"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"969\" class=\"elementor elementor-969\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-da0b4fb e-con-full e-flex e-con e-parent\" data-id=\"da0b4fb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-869efba elementor-widget elementor-widget-html\" data-id=\"869efba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>TourVill \u2014 Central PMS<\/title>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Sora:wght@300;400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n*{margin:0;padding:0;box-sizing:border-box}\r\n:root{\r\n  --orange:#e8630a;--orange2:#c4520a;--ol:#fff4ed;\r\n  --navy:#0b1f3a;--navy2:#152d52;\r\n  --white:#fff;--bg:#f8f9fa;--sf:#f1f3f5;\r\n  --text:#0f172a;--muted:#64748b;--bd:#e2e8f0;\r\n  --green:#10b981;--gbg:#d1fae5;--gt:#065f46;\r\n  --amber:#f59e0b;--abg:#fef3c7;--at:#92400e;\r\n  --red:#ef4444;--rbg:#fee2e2;--rt:#991b1b;\r\n  --blue:#3b82f6;--bbg:#dbeafe;--bt:#1e40af;\r\n  --r:10px;--rsm:7px;--rlg:16px;\r\n}\r\nbody{font-family:\\'Sora\\',sans-serif;background:var(--bg);color:var(--text);font-size:13px;line-height:1.5;min-height:100vh}\r\n.login-page{display:flex;min-height:100vh;align-items:center;justify-content:center;background:var(--navy);padding:20px}\r\n.login-box{background:var(--white);border-radius:var(--rlg);padding:36px;width:100%;max-width:400px;box-shadow:0 24px 60px rgba(0,0,0,.25)}\r\n.login-logo{text-align:center;margin-bottom:28px}\r\n.login-icon{width:52px;height:52px;background:var(--orange);border-radius:12px;display:flex;align-items:center;justify-content:center;margin:0 auto 12px}\r\n.login-logo h1{font-size:20px;font-weight:700;color:var(--navy)}\r\n.login-logo p{font-size:12px;color:var(--muted);margin-top:3px}\r\n.lf{margin-bottom:14px}\r\n.lf label{display:block;font-size:11px;font-weight:600;color:var(--navy);margin-bottom:5px;text-transform:uppercase;letter-spacing:.05em}\r\n.lf input{width:100%;border:1.5px solid var(--bd);border-radius:var(--rsm);padding:11px 13px;font-family:\\'Sora\\',sans-serif;font-size:14px;color:var(--text);outline:none;transition:border .2s}\r\n.lf input:focus{border-color:var(--orange)}\r\n.login-btn{width:100%;background:var(--orange);color:#fff;border:none;padding:12px;border-radius:var(--rsm);font-family:\\'Sora\\',sans-serif;font-size:14px;font-weight:700;cursor:pointer;margin-top:6px;transition:all .2s;display:flex;align-items:center;justify-content:center;gap:8px}\r\n.login-btn:hover{background:var(--orange2)}\r\n.login-btn:disabled{opacity:.6;cursor:not-allowed}\r\n.login-err{background:var(--rbg);color:var(--rt);border-radius:var(--rsm);padding:10px 14px;font-size:12px;margin-bottom:14px;display:none;text-align:center}\r\n.login-note{font-size:11px;color:var(--muted);text-align:center;margin-top:16px}\r\n.dashboard{display:none;flex-direction:column;min-height:100vh}\r\n.topbar{background:var(--navy);height:54px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;position:sticky;top:0;z-index:30}\r\n.logo{color:#fff;font-weight:700;font-size:15px;display:flex;align-items:center;gap:8px}\r\n.logo-accent{color:var(--orange)}\r\n.logo-badge{background:var(--orange);color:#fff;font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;letter-spacing:.04em}\r\n.topbar-right{display:flex;align-items:center;gap:10px}\r\n.sync-info{font-size:11px;color:rgba(255,255,255,0.4)}\r\n.refresh-btn{background:rgba(255,255,255,0.1);border:none;color:rgba(255,255,255,0.8);padding:6px 12px;border-radius:var(--rsm);font-family:\\'Sora\\',sans-serif;font-size:11px;cursor:pointer;display:flex;align-items:center;gap:5px;transition:all .2s}\r\n.refresh-btn:hover{background:rgba(255,255,255,0.18);color:#fff}\r\n.ri{display:inline-block;transition:transform .5s}\r\n.refresh-btn.loading .ri{transform:rotate(360deg)}\r\n.role-pill{padding:4px 12px;border-radius:20px;font-size:11px;font-weight:600;color:#fff}\r\n.role-super{background:var(--orange)}\r\n.role-b2b{background:var(--blue)}\r\n.logout-btn{background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.15);color:rgba(255,255,255,0.7);padding:5px 12px;border-radius:var(--rsm);font-family:\\'Sora\\',sans-serif;font-size:11px;cursor:pointer;transition:all .2s}\r\n.logout-btn:hover{background:rgba(255,255,255,0.15);color:#fff}\r\n.layout{display:flex;flex:1;min-height:calc(100vh - 54px)}\r\n.sidebar{width:220px;background:var(--navy);flex-shrink:0;overflow-y:auto}\r\n.sb-sec{padding:8px 10px}\r\n.sb-lbl{font-size:9px;font-weight:700;color:rgba(255,255,255,0.3);text-transform:uppercase;letter-spacing:.1em;padding:10px 8px 5px}\r\n.mi{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:var(--rsm);color:rgba(255,255,255,0.55);font-size:12px;font-weight:500;cursor:pointer;transition:all .2s;margin-bottom:1px;user-select:none}\r\n.mi:hover{background:rgba(255,255,255,0.07);color:rgba(255,255,255,0.9)}\r\n.mi.active{background:var(--orange);color:#fff}\r\n.mi svg{flex-shrink:0;width:14px;height:14px;opacity:.8}\r\n.mi.active svg{opacity:1}\r\n.mbadge{margin-left:auto;background:rgba(255,255,255,0.2);color:#fff;font-size:9px;font-weight:700;padding:1px 7px;border-radius:10px}\r\n.mi.active .mbadge{background:rgba(0,0,0,0.2)}\r\n.sb-div{border:none;border-top:1px solid rgba(255,255,255,0.08);margin:6px 10px}\r\n.main{flex:1;display:flex;flex-direction:column;overflow-y:auto}\r\n.ph{background:var(--white);border-bottom:1px solid var(--bd);padding:13px 22px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0;flex-wrap:wrap;gap:8px}\r\n.ph-left h2{font-size:15px;font-weight:600;color:var(--navy)}\r\n.ph-left p{font-size:11px;color:var(--muted);margin-top:1px}\r\n.ph-right{display:flex;gap:8px;flex-wrap:wrap}\r\n.btn{padding:7px 14px;border-radius:var(--rsm);font-family:\\'Sora\\',sans-serif;font-size:12px;font-weight:600;cursor:pointer;border:none;transition:all .2s;white-space:nowrap}\r\n.btn-orange{background:var(--orange);color:#fff}\r\n.btn-orange:hover{background:var(--orange2)}\r\n.btn-outline{background:var(--white);color:var(--muted);border:1px solid var(--bd)}\r\n.btn-outline:hover{border-color:var(--navy);color:var(--navy)}\r\n.btn-green{background:var(--green);color:#fff}\r\n.btn-red{background:var(--rbg);color:var(--rt);border:none}\r\n.btn-blue{background:var(--blue);color:#fff}\r\n.btn-purple{background:#7c3aed;color:#fff}\r\n.content{padding:18px 22px;flex:1}\r\n.view{display:none}\r\n.view.active{display:block}\r\n.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}\r\n.metric{background:var(--white);border:1px solid var(--bd);border-radius:var(--r);padding:15px;position:relative;overflow:hidden}\r\n.mbar{position:absolute;top:0;left:0;width:3px;height:100%}\r\n.mlbl{font-size:10px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.04em;margin-bottom:8px}\r\n.mval{font-size:21px;font-weight:700;color:var(--navy);line-height:1}\r\n.msub{font-size:10px;margin-top:6px;font-weight:500}\r\n.up{color:var(--green)}.dn{color:var(--red)}.nt{color:var(--muted)}\r\n.g2{display:grid;grid-template-columns:1.6fr 1fr;gap:14px;margin-bottom:14px}\r\n.g22{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}\r\n.card{background:var(--white);border:1px solid var(--bd);border-radius:var(--r);padding:16px}\r\n.ch{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}\r\n.ct{font-size:13px;font-weight:600;color:var(--navy)}\r\n.ca{font-size:11px;color:var(--orange);cursor:pointer;font-weight:500}\r\n.tw{overflow-x:auto;border-radius:var(--r);border:1px solid var(--bd)}\r\ntable{width:100%;border-collapse:collapse;background:var(--white)}\r\nthead th{font-size:10px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;padding:9px 12px;text-align:left;background:var(--sf);border-bottom:1px solid var(--bd);white-space:nowrap}\r\ntbody td{padding:10px 12px;font-size:12px;color:var(--text);border-bottom:1px solid var(--bd)}\r\ntbody tr:last-child td{border-bottom:none}\r\ntbody tr:hover td{background:#fafbfc;cursor:pointer}\r\n.tb{font-weight:600;color:var(--navy)}\r\n.tm{color:var(--muted);font-size:11px}\r\n.badge{display:inline-flex;align-items:center;gap:3px;padding:3px 8px;border-radius:20px;font-size:10px;font-weight:600;white-space:nowrap}\r\n.badge::before{content:\\'\\';width:5px;height:5px;border-radius:50%;flex-shrink:0}\r\n.bc{background:var(--gbg);color:var(--gt)}.bc::before{background:var(--green)}\r\n.bp{background:var(--abg);color:var(--at)}.bp::before{background:var(--amber)}\r\n.br{background:var(--rbg);color:var(--rt)}.br::before{background:var(--red)}\r\n.bb{background:var(--bbg);color:var(--bt)}.bb::before{background:var(--blue)}\r\n.type-r{background:var(--gbg);color:var(--gt);padding:2px 7px;border-radius:10px;font-size:9px;font-weight:700}\r\n.type-h{background:var(--bbg);color:var(--bt);padding:2px 7px;border-radius:10px;font-size:9px;font-weight:700}\r\n.type-o{background:var(--abg);color:var(--at);padding:2px 7px;border-radius:10px;font-size:9px;font-weight:700}\r\n.pay-paid{background:var(--gbg);color:var(--gt);padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600}\r\n.pay-unpaid{background:var(--rbg);color:var(--rt);padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600}\r\n.pay-partial{background:var(--abg);color:var(--at);padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600}\r\n.fb{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}\r\n.fb input,.fb select{border:1px solid var(--bd);border-radius:var(--rsm);padding:7px 10px;font-family:\\'Sora\\',sans-serif;font-size:12px;color:var(--text);background:var(--white);outline:none;transition:border .2s}\r\n.fb input:focus,.fb select:focus{border-color:var(--orange)}\r\n.fb input{flex:1;min-width:160px}\r\n.occ-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}\r\n.occ-lbl{font-size:11px;color:var(--muted);width:120px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n.occ-bg{flex:1;background:var(--sf);border-radius:20px;height:7px;overflow:hidden}\r\n.occ-fill{height:100%;background:var(--orange);border-radius:20px;transition:width .5s}\r\n.occ-pct{font-size:11px;font-weight:600;color:var(--navy);width:30px;text-align:right;flex-shrink:0}\r\n.rev-bars{display:flex;align-items:flex-end;gap:5px;height:90px;padding-top:8px}\r\n.rev-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px}\r\n.rev-bar{width:100%;border-radius:4px 4px 0 0}\r\n.rev-lbl{font-size:9px;color:var(--muted);text-align:center}\r\n.cal-dd-wrap{position:relative;display:inline-block}\r\n.cal-dd-btn{background:var(--white);border:1px solid var(--bd);border-radius:var(--rsm);padding:7px 14px;font-family:\\'Sora\\',sans-serif;font-size:12px;font-weight:500;cursor:pointer;color:var(--navy);transition:all .2s;display:flex;align-items:center;gap:6px;min-width:180px}\r\n.cal-dd-btn:hover{border-color:var(--orange);color:var(--orange)}\r\n.cal-dd-menu{display:none;position:absolute;top:110%;left:0;background:var(--white);border:1px solid var(--bd);border-radius:var(--r);box-shadow:0 8px 24px rgba(0,0,0,.12);z-index:50;min-width:240px;max-height:300px;overflow-y:auto}\r\n.cal-dd-menu.open{display:block}\r\n.cal-dd-item{padding:9px 14px;font-size:12px;cursor:pointer;color:var(--text);border-bottom:1px solid var(--bd);transition:background .15s}\r\n.cal-dd-item:last-child{border:none}\r\n.cal-dd-item:hover{background:var(--ol);color:var(--orange)}\r\n.cal-dd-item.sel{background:var(--orange);color:#fff}\r\n.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:3px;margin-top:8px}\r\n.cdh{font-size:9px;color:var(--muted);text-align:center;font-weight:600;padding:3px 0;text-transform:uppercase}\r\n.cd{min-height:48px;border:1px solid var(--bd);border-radius:5px;padding:3px 4px;background:var(--white)}\r\n.cd.om{background:var(--sf);opacity:.4}\r\n.cd.td{border-color:var(--orange);border-width:1.5px}\r\n.cd.booked{background:#fee2e2;border-color:#fca5a5}\r\n.cd.free{background:#f0fdf4;border-color:#86efac}\r\n.cd-n{font-size:10px;font-weight:600;color:var(--navy);margin-bottom:2px}\r\n.cd.booked .cd-n{color:var(--rt)}\r\n.cbk{border-radius:3px;padding:1px 4px;font-size:8px;margin-bottom:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#fff}\r\n.cal-legend{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:10px}\r\n.cal-legend span{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--muted)}\r\n.pr{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid var(--bd)}\r\n.pr:last-child{border:none}\r\n.pav{width:30px;height:30px;border-radius:50%;background:var(--navy);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;flex-shrink:0}\r\n.pi{flex:1;min-width:0}\r\n.pn{font-size:12px;font-weight:500;color:var(--navy)}\r\n.pm{font-size:10px;color:var(--muted)}\r\n.pa{font-size:13px;font-weight:700;color:var(--navy)}\r\n.lr{text-align:center;padding:28px;color:var(--muted);font-size:12px}\r\n.sp{display:inline-block;width:15px;height:15px;border:2px solid var(--bd);border-top-color:var(--orange);border-radius:50%;animation:spin .7s linear infinite;margin-right:6px;vertical-align:middle}\r\n@keyframes spin{to{transform:rotate(360deg)}}\r\n.err{background:var(--rbg);border:1px solid #fca5a5;border-radius:var(--r);padding:12px 16px;color:var(--rt);font-size:12px;margin-bottom:14px;display:none}\r\n.empty{text-align:center;padding:36px 20px;color:var(--muted);font-size:12px}\r\n.ss{border:1px solid var(--bd);border-radius:var(--rsm);padding:5px 8px;font-family:\\'Sora\\',sans-serif;font-size:11px;cursor:pointer;outline:none;background:var(--white);color:var(--text)}\r\n.stat-box{background:var(--sf);border-radius:var(--rsm);padding:10px 12px;text-align:center}\r\n.sb-val{font-size:17px;font-weight:700;color:var(--navy)}\r\n.sb-lbl{font-size:10px;color:var(--muted);margin-top:2px}\r\n.mb{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.45);z-index:200;align-items:center;justify-content:center;padding:16px}\r\n.mb.open{display:flex}\r\n.modal{background:var(--white);border-radius:var(--rlg);width:100%;max-width:520px;max-height:92vh;overflow-y:auto;box-shadow:0 24px 80px rgba(0,0,0,.2)}\r\n.mhead{background:var(--navy);padding:18px 22px;border-radius:var(--rlg) var(--rlg) 0 0;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:1}\r\n.mhead h3{font-size:16px;font-weight:600;color:#fff;margin:0}\r\n.mhead p{font-size:11px;color:rgba(255,255,255,0.5);margin:2px 0 0}\r\n.mcl{background:rgba(255,255,255,0.1);border:none;color:#fff;width:30px;height:30px;border-radius:50%;font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0}\r\n.mcl:hover{background:rgba(255,255,255,0.2)}\r\n.mbody{padding:22px}\r\n.mr{display:flex;justify-content:space-between;align-items:flex-start;padding:8px 0;border-bottom:1px solid var(--bd);font-size:12px}\r\n.mr:last-child{border:none}\r\n.ml{color:var(--muted);flex-shrink:0;width:120px}\r\n.mv{font-weight:500;color:var(--navy);text-align:right;flex:1}\r\n.ma{display:flex;gap:8px;margin-top:16px;flex-wrap:wrap}\r\n.ma .btn{flex:1;min-width:100px}\r\n.fg{margin-bottom:13px}\r\n.fg label{display:block;font-size:11px;font-weight:600;color:var(--navy);margin-bottom:5px;text-transform:uppercase;letter-spacing:.04em}\r\n.fg input,.fg select{width:100%;border:1.5px solid var(--bd);border-radius:var(--rsm);padding:10px 13px;font-family:\\'Sora\\',sans-serif;font-size:13px;color:var(--text);background:var(--white);outline:none;transition:border .2s}\r\n.fg input:focus,.fg select:focus{border-color:var(--orange)}\r\n.frow{display:grid;grid-template-columns:1fr 1fr;gap:12px}\r\n.pp{background:var(--ol);border:1px solid rgba(232,99,10,0.2);border-radius:var(--rsm);padding:12px 14px;margin-bottom:14px}\r\n.pp.hidden{display:none}\r\n.ppr{display:flex;justify-content:space-between;font-size:12px;margin-bottom:4px;color:var(--muted)}\r\n.ppr.tot{font-weight:700;font-size:14px;color:var(--navy);padding-top:8px;border-top:1px solid rgba(232,99,10,0.2);margin-top:6px}\r\n.sub-btn{width:100%;background:var(--orange);color:#fff;border:none;padding:12px;border-radius:var(--rsm);font-family:\\'Sora\\',sans-serif;font-size:14px;font-weight:700;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:8px;transition:all .2s}\r\n.sub-btn:hover{background:var(--orange2)}\r\n.sub-btn:disabled{opacity:.6;cursor:not-allowed}\r\n.sp2{width:15px;height:15px;border:2px solid rgba(255,255,255,0.3);border-top-color:#fff;border-radius:50%;animation:spin .7s linear infinite;display:none}\r\n.bk-ok{display:none;text-align:center;padding:24px}\r\n.bk-ok-icon{width:56px;height:56px;background:var(--gbg);border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto 12px;font-size:24px;color:var(--green)}\r\n.bk-ok-id{font-size:20px;font-weight:700;color:var(--navy);letter-spacing:2px;margin:8px 0}\r\n.user-card{background:var(--white);border:1px solid var(--bd);border-radius:var(--r);padding:14px 16px;display:flex;align-items:center;gap:12px;margin-bottom:8px;transition:box-shadow .2s}\r\n.user-card:hover{box-shadow:0 2px 8px rgba(0,0,0,.08)}\r\n.user-avatar{width:38px;height:38px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;color:#fff;flex-shrink:0}\r\n.ua-super{background:var(--orange)}\r\n.ua-b2b{background:var(--blue)}\r\n.ua-agent{background:#7c3aed}\r\n.user-info{flex:1;min-width:0}\r\n.user-name{font-size:13px;font-weight:600;color:var(--navy)}\r\n.user-meta{font-size:11px;color:var(--muted);margin-top:1px}\r\n.user-role-badge{padding:3px 10px;border-radius:20px;font-size:10px;font-weight:700}\r\n.role-super-badge{background:var(--ol);color:var(--orange)}\r\n.role-b2b-badge{background:var(--bbg);color:var(--bt)}\r\n.role-agent-badge{background:#ede9fe;color:#6d28d9}\r\n.user-actions{display:flex;gap:6px}\r\n.icon-btn{background:var(--sf);border:1px solid var(--bd);border-radius:6px;padding:5px 8px;font-size:11px;cursor:pointer;color:var(--muted);transition:all .2s}\r\n.icon-btn:hover{background:var(--rbg);color:var(--rt);border-color:#fca5a5}\r\n.add-user-form{background:var(--sf);border:1px solid var(--bd);border-radius:var(--r);padding:16px;margin-bottom:16px}\r\n.add-user-form h4{font-size:13px;font-weight:600;color:var(--navy);margin-bottom:12px}\r\n.form-grid{display:grid;grid-template-columns:1fr 1fr 1fr auto;gap:10px;align-items:end}\r\n.agent-info-banner{background:var(--bbg);border:1px solid #bfdbfe;border-radius:var(--r);padding:12px 16px;margin-bottom:14px;display:flex;align-items:center;gap:10px}\r\n.agent-info-banner svg{flex-shrink:0;color:var(--blue)}\r\n.agent-info-banner p{font-size:12px;color:var(--bt)}\r\n.hbg{display:none;background:none;border:none;cursor:pointer;padding:6px;flex-direction:column;gap:4px}\r\n.hbg span{display:block;width:20px;height:2px;background:#fff;border-radius:2px}\r\n.sob{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:25}\r\n.sob.open{display:block}\r\n@media(max-width:900px){.g2,.g22{grid-template-columns:1fr}.metrics{grid-template-columns:1fr 1fr}.form-grid{grid-template-columns:1fr 1fr}}\r\n@media(max-width:768px){\r\n  .hbg{display:flex}.sync-info{display:none}.topbar{padding:0 14px}\r\n  .sidebar{position:fixed;left:-225px;top:54px;height:calc(100vh - 54px);z-index:26;transition:left .3s}\r\n  .sidebar.open{left:0}.layout{display:block}.main{width:100%}\r\n  .content{padding:14px}.modal{width:94vw}.mbody{padding:16px}\r\n  .cd{min-height:34px}.frow{grid-template-columns:1fr}.form-grid{grid-template-columns:1fr}\r\n}\r\n@media(max-width:480px){.metrics{grid-template-columns:1fr}.fb{flex-direction:column}}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<html lang=\"en\">\r\n\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>TourVill \u2014 Central PMS<\/title>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Sora:wght@300;400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n*{margin:0;padding:0;box-sizing:border-box}\r\n:root{\r\n  --orange:#e8630a;--orange2:#c4520a;--ol:#fff4ed;\r\n  --navy:#0b1f3a;--navy2:#152d52;\r\n  --white:#fff;--bg:#f8f9fa;--sf:#f1f3f5;\r\n  --text:#0f172a;--muted:#64748b;--bd:#e2e8f0;\r\n  --green:#10b981;--gbg:#d1fae5;--gt:#065f46;\r\n  --amber:#f59e0b;--abg:#fef3c7;--at:#92400e;\r\n  --red:#ef4444;--rbg:#fee2e2;--rt:#991b1b;\r\n  --blue:#3b82f6;--bbg:#dbeafe;--bt:#1e40af;\r\n  --r:10px;--rsm:7px;--rlg:16px;\r\n}\r\nbody{font-family:'Sora',sans-serif;background:var(--bg);color:var(--text);font-size:13px;line-height:1.5;min-height:100vh}\r\n.login-page{display:flex;min-height:100vh;align-items:center;justify-content:center;background:var(--navy);padding:20px}\r\n.login-box{background:var(--white);border-radius:var(--rlg);padding:36px;width:100%;max-width:400px;box-shadow:0 24px 60px rgba(0,0,0,.25)}\r\n.login-logo{text-align:center;margin-bottom:28px}\r\n.login-icon{width:52px;height:52px;background:var(--orange);border-radius:12px;display:flex;align-items:center;justify-content:center;margin:0 auto 12px}\r\n.login-logo h1{font-size:20px;font-weight:700;color:var(--navy)}\r\n.login-logo p{font-size:12px;color:var(--muted);margin-top:3px}\r\n.lf{margin-bottom:14px}\r\n.lf label{display:block;font-size:11px;font-weight:600;color:var(--navy);margin-bottom:5px;text-transform:uppercase;letter-spacing:.05em}\r\n.lf input{width:100%;border:1.5px solid var(--bd);border-radius:var(--rsm);padding:11px 13px;font-family:'Sora',sans-serif;font-size:14px;color:var(--text);outline:none;transition:border .2s}\r\n.lf input:focus{border-color:var(--orange)}\r\n.login-btn{width:100%;background:var(--orange);color:#fff;border:none;padding:12px;border-radius:var(--rsm);font-family:'Sora',sans-serif;font-size:14px;font-weight:700;cursor:pointer;margin-top:6px;transition:all .2s;display:flex;align-items:center;justify-content:center;gap:8px}\r\n.login-btn:hover{background:var(--orange2)}\r\n.login-btn:disabled{opacity:.6;cursor:not-allowed}\r\n.login-err{background:var(--rbg);color:var(--rt);border-radius:var(--rsm);padding:10px 14px;font-size:12px;margin-bottom:14px;display:none;text-align:center}\r\n.login-note{font-size:11px;color:var(--muted);text-align:center;margin-top:16px}\r\n.dashboard{display:none;flex-direction:column;min-height:100vh}\r\n.topbar{background:var(--navy);height:54px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;position:sticky;top:0;z-index:30}\r\n.logo{color:#fff;font-weight:700;font-size:15px;display:flex;align-items:center;gap:8px}\r\n.logo-accent{color:var(--orange)}\r\n.logo-badge{background:var(--orange);color:#fff;font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;letter-spacing:.04em}\r\n.topbar-right{display:flex;align-items:center;gap:10px}\r\n.sync-info{font-size:11px;color:rgba(255,255,255,0.4)}\r\n.refresh-btn{background:rgba(255,255,255,0.1);border:none;color:rgba(255,255,255,0.8);padding:6px 12px;border-radius:var(--rsm);font-family:'Sora',sans-serif;font-size:11px;cursor:pointer;display:flex;align-items:center;gap:5px;transition:all .2s}\r\n.refresh-btn:hover{background:rgba(255,255,255,0.18);color:#fff}\r\n.ri{display:inline-block;transition:transform .5s}\r\n.refresh-btn.loading .ri{transform:rotate(360deg)}\r\n.role-pill{padding:4px 12px;border-radius:20px;font-size:11px;font-weight:600;color:#fff}\r\n.role-super{background:var(--orange)}\r\n.role-b2b{background:var(--blue)}\r\n.logout-btn{background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.15);color:rgba(255,255,255,0.7);padding:5px 12px;border-radius:var(--rsm);font-family:'Sora',sans-serif;font-size:11px;cursor:pointer;transition:all .2s}\r\n.logout-btn:hover{background:rgba(255,255,255,0.15);color:#fff}\r\n.layout{display:flex;flex:1;min-height:calc(100vh - 54px)}\r\n.sidebar{width:220px;background:var(--navy);flex-shrink:0;overflow-y:auto}\r\n.sb-sec{padding:8px 10px}\r\n.sb-lbl{font-size:9px;font-weight:700;color:rgba(255,255,255,0.3);text-transform:uppercase;letter-spacing:.1em;padding:10px 8px 5px}\r\n.mi{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:var(--rsm);color:rgba(255,255,255,0.55);font-size:12px;font-weight:500;cursor:pointer;transition:all .2s;margin-bottom:1px;user-select:none}\r\n.mi:hover{background:rgba(255,255,255,0.07);color:rgba(255,255,255,0.9)}\r\n.mi.active{background:var(--orange);color:#fff}\r\n.mi svg{flex-shrink:0;width:14px;height:14px;opacity:.8}\r\n.mi.active svg{opacity:1}\r\n.mbadge{margin-left:auto;background:rgba(255,255,255,0.2);color:#fff;font-size:9px;font-weight:700;padding:1px 7px;border-radius:10px}\r\n.mi.active .mbadge{background:rgba(0,0,0,0.2)}\r\n.sb-div{border:none;border-top:1px solid rgba(255,255,255,0.08);margin:6px 10px}\r\n.main{flex:1;display:flex;flex-direction:column;overflow-y:auto}\r\n.ph{background:var(--white);border-bottom:1px solid var(--bd);padding:13px 22px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0;flex-wrap:wrap;gap:8px}\r\n.ph-left h2{font-size:15px;font-weight:600;color:var(--navy)}\r\n.ph-left p{font-size:11px;color:var(--muted);margin-top:1px}\r\n.ph-right{display:flex;gap:8px;flex-wrap:wrap}\r\n.btn{padding:7px 14px;border-radius:var(--rsm);font-family:'Sora',sans-serif;font-size:12px;font-weight:600;cursor:pointer;border:none;transition:all .2s;white-space:nowrap}\r\n.btn-orange{background:var(--orange);color:#fff}\r\n.btn-orange:hover{background:var(--orange2)}\r\n.btn-outline{background:var(--white);color:var(--muted);border:1px solid var(--bd)}\r\n.btn-outline:hover{border-color:var(--navy);color:var(--navy)}\r\n.btn-green{background:var(--green);color:#fff}\r\n.btn-red{background:var(--rbg);color:var(--rt);border:none}\r\n.btn-blue{background:var(--blue);color:#fff}\r\n.content{padding:18px 22px;flex:1}\r\n.view{display:none}\r\n.view.active{display:block}\r\n.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}\r\n.metric{background:var(--white);border:1px solid var(--bd);border-radius:var(--r);padding:15px;position:relative;overflow:hidden}\r\n.mbar{position:absolute;top:0;left:0;width:3px;height:100%}\r\n.mlbl{font-size:10px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.04em;margin-bottom:8px}\r\n.mval{font-size:21px;font-weight:700;color:var(--navy);line-height:1}\r\n.msub{font-size:10px;margin-top:6px;font-weight:500}\r\n.up{color:var(--green)}.dn{color:var(--red)}.nt{color:var(--muted)}\r\n.g2{display:grid;grid-template-columns:1.6fr 1fr;gap:14px;margin-bottom:14px}\r\n.g22{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}\r\n.card{background:var(--white);border:1px solid var(--bd);border-radius:var(--r);padding:16px}\r\n.ch{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}\r\n.ct{font-size:13px;font-weight:600;color:var(--navy)}\r\n.ca{font-size:11px;color:var(--orange);cursor:pointer;font-weight:500}\r\n.tw{overflow-x:auto;border-radius:var(--r);border:1px solid var(--bd)}\r\ntable{width:100%;border-collapse:collapse;background:var(--white)}\r\nthead th{font-size:10px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;padding:9px 12px;text-align:left;background:var(--sf);border-bottom:1px solid var(--bd);white-space:nowrap}\r\ntbody td{padding:10px 12px;font-size:12px;color:var(--text);border-bottom:1px solid var(--bd)}\r\ntbody tr:last-child td{border-bottom:none}\r\ntbody tr:hover td{background:#fafbfc;cursor:pointer}\r\n.tb{font-weight:600;color:var(--navy)}\r\n.tm{color:var(--muted);font-size:11px}\r\n.badge{display:inline-flex;align-items:center;gap:3px;padding:3px 8px;border-radius:20px;font-size:10px;font-weight:600;white-space:nowrap}\r\n.badge::before{content:'';width:5px;height:5px;border-radius:50%;flex-shrink:0}\r\n.bc{background:var(--gbg);color:var(--gt)}.bc::before{background:var(--green)}\r\n.bp{background:var(--abg);color:var(--at)}.bp::before{background:var(--amber)}\r\n.br{background:var(--rbg);color:var(--rt)}.br::before{background:var(--red)}\r\n.bb{background:var(--bbg);color:var(--bt)}.bb::before{background:var(--blue)}\r\n.type-r{background:var(--gbg);color:var(--gt);padding:2px 7px;border-radius:10px;font-size:9px;font-weight:700}\r\n.type-h{background:var(--bbg);color:var(--bt);padding:2px 7px;border-radius:10px;font-size:9px;font-weight:700}\r\n.type-o{background:var(--abg);color:var(--at);padding:2px 7px;border-radius:10px;font-size:9px;font-weight:700}\r\n.pay-paid{background:var(--gbg);color:var(--gt);padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600}\r\n.pay-unpaid{background:var(--rbg);color:var(--rt);padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600}\r\n.pay-partial{background:var(--abg);color:var(--at);padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600}\r\n.fb{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}\r\n.fb input,.fb select{border:1px solid var(--bd);border-radius:var(--rsm);padding:7px 10px;font-family:'Sora',sans-serif;font-size:12px;color:var(--text);background:var(--white);outline:none;transition:border .2s}\r\n.fb input:focus,.fb select:focus{border-color:var(--orange)}\r\n.fb input{flex:1;min-width:160px}\r\n.occ-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}\r\n.occ-lbl{font-size:11px;color:var(--muted);width:120px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n.occ-bg{flex:1;background:var(--sf);border-radius:20px;height:7px;overflow:hidden}\r\n.occ-fill{height:100%;background:var(--orange);border-radius:20px;transition:width .5s}\r\n.occ-pct{font-size:11px;font-weight:600;color:var(--navy);width:30px;text-align:right;flex-shrink:0}\r\n.rev-bars{display:flex;align-items:flex-end;gap:5px;height:90px;padding-top:8px}\r\n.rev-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px}\r\n.rev-bar{width:100%;border-radius:4px 4px 0 0}\r\n.rev-lbl{font-size:9px;color:var(--muted);text-align:center}\r\n.cal-dd-wrap{position:relative;display:inline-block}\r\n.cal-dd-btn{background:var(--white);border:1px solid var(--bd);border-radius:var(--rsm);padding:7px 14px;font-family:'Sora',sans-serif;font-size:12px;font-weight:500;cursor:pointer;color:var(--navy);transition:all .2s;display:flex;align-items:center;gap:6px;min-width:180px}\r\n.cal-dd-btn:hover{border-color:var(--orange);color:var(--orange)}\r\n.cal-dd-menu{display:none;position:absolute;top:110%;left:0;background:var(--white);border:1px solid var(--bd);border-radius:var(--r);box-shadow:0 8px 24px rgba(0,0,0,.12);z-index:50;min-width:240px;max-height:300px;overflow-y:auto}\r\n.cal-dd-menu.open{display:block}\r\n.cal-dd-item{padding:9px 14px;font-size:12px;cursor:pointer;color:var(--text);border-bottom:1px solid var(--bd);transition:background .15s}\r\n.cal-dd-item:last-child{border:none}\r\n.cal-dd-item:hover{background:var(--ol);color:var(--orange)}\r\n.cal-dd-item.sel{background:var(--orange);color:#fff}\r\n.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:3px;margin-top:8px}\r\n.cdh{font-size:9px;color:var(--muted);text-align:center;font-weight:600;padding:3px 0;text-transform:uppercase}\r\n.cd{min-height:48px;border:1px solid var(--bd);border-radius:5px;padding:3px 4px;background:var(--white)}\r\n.cd.om{background:var(--sf);opacity:.4}\r\n.cd.td{border-color:var(--orange);border-width:1.5px}\r\n.cd.booked{background:#fee2e2;border-color:#fca5a5}\r\n.cd.free{background:#f0fdf4;border-color:#86efac}\r\n.cd-n{font-size:10px;font-weight:600;color:var(--navy);margin-bottom:2px}\r\n.cd.booked .cd-n{color:var(--rt)}\r\n.cbk{border-radius:3px;padding:1px 4px;font-size:8px;margin-bottom:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#fff}\r\n.cal-legend{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:10px}\r\n.cal-legend span{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--muted)}\r\n.pr{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid var(--bd)}\r\n.pr:last-child{border:none}\r\n.pav{width:30px;height:30px;border-radius:50%;background:var(--navy);color:#fff;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;flex-shrink:0}\r\n.pi{flex:1;min-width:0}\r\n.pn{font-size:12px;font-weight:500;color:var(--navy)}\r\n.lr{text-align:center;padding:28px;color:var(--muted);font-size:12px}\r\n.sp{display:inline-block;width:15px;height:15px;border:2px solid var(--bd);border-top-color:var(--orange);border-radius:50%;animation:spin .7s linear infinite;margin-right:6px;vertical-align:middle}\r\n@keyframes spin{to{transform:rotate(360deg)}}\r\n.err{background:var(--rbg);border:1px solid #fca5a5;border-radius:var(--r);padding:12px 16px;color:var(--rt);font-size:12px;margin-bottom:14px;display:none}\r\n.empty{text-align:center;padding:36px 20px;color:var(--muted);font-size:12px}\r\n.ss{border:1px solid var(--bd);border-radius:var(--rsm);padding:5px 8px;font-family:'Sora',sans-serif;font-size:11px;cursor:pointer;outline:none;background:var(--white);color:var(--text)}\r\n.stat-box{background:var(--sf);border-radius:var(--rsm);padding:10px 12px;text-align:center}\r\n.sb-val{font-size:17px;font-weight:700;color:var(--navy)}\r\n.sb-lbl2{font-size:10px;color:var(--muted);margin-top:2px}\r\n.mb{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.45);z-index:200;align-items:center;justify-content:center;padding:16px}\r\n.mb.open{display:flex}\r\n.modal{background:var(--white);border-radius:var(--rlg);width:100%;max-width:520px;max-height:92vh;overflow-y:auto;box-shadow:0 24px 80px rgba(0,0,0,.2)}\r\n.mhead{background:var(--navy);padding:18px 22px;border-radius:var(--rlg) var(--rlg) 0 0;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:1}\r\n.mhead h3{font-size:16px;font-weight:600;color:#fff;margin:0}\r\n.mhead p{font-size:11px;color:rgba(255,255,255,0.5);margin:2px 0 0}\r\n.mcl{background:rgba(255,255,255,0.1);border:none;color:#fff;width:30px;height:30px;border-radius:50%;font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0}\r\n.mcl:hover{background:rgba(255,255,255,0.2)}\r\n.mbody{padding:22px}\r\n.mr{display:flex;justify-content:space-between;align-items:flex-start;padding:8px 0;border-bottom:1px solid var(--bd);font-size:12px}\r\n.mr:last-child{border:none}\r\n.ml{color:var(--muted);flex-shrink:0;width:120px}\r\n.mv{font-weight:500;color:var(--navy);text-align:right;flex:1}\r\n.ma{display:flex;gap:8px;margin-top:16px;flex-wrap:wrap}\r\n.ma .btn{flex:1;min-width:100px}\r\n.fg{margin-bottom:13px}\r\n.fg label{display:block;font-size:11px;font-weight:600;color:var(--navy);margin-bottom:5px;text-transform:uppercase;letter-spacing:.04em}\r\n.fg input,.fg select,.fg textarea{width:100%;border:1.5px solid var(--bd);border-radius:var(--rsm);padding:10px 13px;font-family:'Sora',sans-serif;font-size:13px;color:var(--text);background:var(--white);outline:none;transition:border .2s}\r\n.fg input:focus,.fg select:focus,.fg textarea:focus{border-color:var(--orange)}\r\n.fg textarea{resize:vertical;min-height:80px}\r\n.frow{display:grid;grid-template-columns:1fr 1fr;gap:12px}\r\n.pp{background:var(--ol);border:1px solid rgba(232,99,10,0.2);border-radius:var(--rsm);padding:12px 14px;margin-bottom:14px}\r\n.pp.hidden{display:none}\r\n.ppr{display:flex;justify-content:space-between;font-size:12px;margin-bottom:4px;color:var(--muted)}\r\n.ppr.tot{font-weight:700;font-size:14px;color:var(--navy);padding-top:8px;border-top:1px solid rgba(232,99,10,0.2);margin-top:6px}\r\n.sub-btn{width:100%;background:var(--orange);color:#fff;border:none;padding:12px;border-radius:var(--rsm);font-family:'Sora',sans-serif;font-size:14px;font-weight:700;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:8px;transition:all .2s}\r\n.sub-btn:hover{background:var(--orange2)}\r\n.sub-btn:disabled{opacity:.6;cursor:not-allowed}\r\n.sp2{width:15px;height:15px;border:2px solid rgba(255,255,255,0.3);border-top-color:#fff;border-radius:50%;animation:spin .7s linear infinite;display:none}\r\n.bk-ok{display:none;text-align:center;padding:24px}\r\n.bk-ok-icon{width:56px;height:56px;background:var(--gbg);border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto 12px;font-size:24px;color:var(--green)}\r\n.bk-ok-id{font-size:20px;font-weight:700;color:var(--navy);letter-spacing:2px;margin:8px 0}\r\n.user-card{background:var(--white);border:1px solid var(--bd);border-radius:var(--r);padding:14px 16px;display:flex;align-items:center;gap:12px;margin-bottom:8px;transition:box-shadow .2s}\r\n.user-card:hover{box-shadow:0 2px 8px rgba(0,0,0,.08)}\r\n.user-avatar{width:38px;height:38px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;color:#fff;flex-shrink:0}\r\n.ua-super{background:var(--orange)}.ua-b2b{background:var(--blue)}.ua-agent{background:#7c3aed}\r\n.user-info{flex:1;min-width:0}\r\n.user-name{font-size:13px;font-weight:600;color:var(--navy)}\r\n.user-meta{font-size:11px;color:var(--muted);margin-top:1px}\r\n.user-role-badge{padding:3px 10px;border-radius:20px;font-size:10px;font-weight:700}\r\n.role-super-badge{background:var(--ol);color:var(--orange)}\r\n.role-b2b-badge{background:var(--bbg);color:var(--bt)}\r\n.role-agent-badge{background:#ede9fe;color:#6d28d9}\r\n.user-actions{display:flex;gap:6px}\r\n.icon-btn{background:var(--sf);border:1px solid var(--bd);border-radius:6px;padding:5px 8px;font-size:11px;cursor:pointer;color:var(--muted);transition:all .2s}\r\n.icon-btn:hover{background:var(--rbg);color:var(--rt);border-color:#fca5a5}\r\n.add-user-form{background:var(--sf);border:1px solid var(--bd);border-radius:var(--r);padding:16px;margin-bottom:16px}\r\n.add-user-form h4{font-size:13px;font-weight:600;color:var(--navy);margin-bottom:12px}\r\n.form-grid{display:grid;grid-template-columns:1fr 1fr 1fr auto;gap:10px;align-items:end}\r\n.agent-info-banner{background:var(--bbg);border:1px solid #bfdbfe;border-radius:var(--r);padding:12px 16px;margin-bottom:14px;display:flex;align-items:center;gap:10px}\r\n.hbg{display:none;background:none;border:none;cursor:pointer;padding:6px;flex-direction:column;gap:4px}\r\n.hbg span{display:block;width:20px;height:2px;background:#fff;border-radius:2px}\r\n.sob{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:25}\r\n.sob.open{display:block}\r\n\/* PM CAT CHIP *\/\r\n.pm-cat-chip{display:inline-flex;align-items:center;gap:7px;padding:8px 14px;border:1.5px solid var(--bd);border-radius:var(--rsm);cursor:pointer;font-size:12px;font-weight:600;transition:all .15s;user-select:none;font-family:'Sora',sans-serif}\r\n.pm-cat-chip.sel{background:#1a56db;color:#fff;border-color:#1a56db}\r\n@media(max-width:900px){.g2,.g22{grid-template-columns:1fr}.metrics{grid-template-columns:1fr 1fr}.form-grid{grid-template-columns:1fr 1fr}}\r\n@media(max-width:768px){\r\n  .hbg{display:flex}.sync-info{display:none}.topbar{padding:0 14px}\r\n  .sidebar{position:fixed;left:-225px;top:54px;height:calc(100vh - 54px);z-index:26;transition:left .3s}\r\n  .sidebar.open{left:0}.layout{display:block}.main{width:100%}\r\n  .content{padding:14px}.modal{width:94vw}.mbody{padding:16px}\r\n  .cd{min-height:34px}.frow{grid-template-columns:1fr}.form-grid{grid-template-columns:1fr}\r\n}\r\n@media(max-width:480px){.metrics{grid-template-columns:1fr}.fb{flex-direction:column}}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<!-- LOGIN PAGE -->\r\n<div class=\"login-page\" id=\"login-page\">\r\n  <div class=\"login-box\">\r\n    <div class=\"login-logo\">\r\n      <div class=\"login-icon\">\r\n        <svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" fill=\"none\"><path d=\"M3 19c2-4 5-5 10-5s8 1 10 5\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\"\/><path d=\"M6 19V12a7 7 0 0 1 14 0v7\" stroke=\"#fff\" stroke-width=\"2\"\/><rect x=\"9\" y=\"8\" width=\"8\" height=\"6\" rx=\"1.5\" fill=\"#fff\"\/><\/svg>\r\n      <\/div>\r\n      <h1>TourVill PMS<\/h1>\r\n      <p>Central Property Management System<\/p>\r\n    <\/div>\r\n    <div class=\"login-err\" id=\"login-err\">\u274c Username \u09ac\u09be Password \u09ad\u09c1\u09b2!<\/div>\r\n    <div class=\"lf\"><label>Username<\/label><input type=\"text\" id=\"l-user\" placeholder=\"username \u09b2\u09bf\u0996\u09c1\u09a8\" autocomplete=\"username\"><\/div>\r\n    <div class=\"lf\"><label>Password<\/label><input type=\"password\" id=\"l-pass\" placeholder=\"password \u09b2\u09bf\u0996\u09c1\u09a8\" onkeydown=\"if(event.key==='Enter')doLogin()\"><\/div>\r\n    <button class=\"login-btn\" id=\"login-btn\" onclick=\"doLogin()\">\r\n      <span>Login \u0995\u09b0\u09c1\u09a8<\/span><div class=\"sp2\" id=\"login-spin\"><\/div>\r\n    <\/button>\r\n    <div class=\"login-note\">TourVill \u2014 Authorized Personnel Only<\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- DASHBOARD -->\r\n<div class=\"dashboard\" id=\"dashboard\">\r\n  <div class=\"topbar\">\r\n    <div style=\"display:flex;align-items:center;gap:10px\">\r\n      <button class=\"hbg\" onclick=\"togSB()\"><span><\/span><span><\/span><span><\/span><\/button>\r\n      <div class=\"logo\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"M2 14c2-3 5-4 8-4s6 1 8 4\" stroke=\"#e8630a\" stroke-width=\"1.8\" stroke-linecap=\"round\"\/><path d=\"M5 14V9a5 5 0 0 1 10 0v5\" stroke=\"white\" stroke-width=\"1.5\"\/><rect x=\"7\" y=\"6\" width=\"6\" height=\"4\" rx=\"1\" fill=\"#e8630a\"\/><\/svg>\r\n        Tour<span class=\"logo-accent\">Vill<\/span><span class=\"logo-badge\">Central PMS<\/span>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"topbar-right\">\r\n      <span class=\"sync-info\" id=\"sync-info\">\u09b8\u09bf\u0999\u09cd\u0995 \u09b9\u09af\u09bc\u09a8\u09bf<\/span>\r\n      <button class=\"refresh-btn\" id=\"rbtn\" onclick=\"loadData()\"><span class=\"ri\">\u21bb<\/span> \u09b0\u09bf\u09ab\u09cd\u09b0\u09c7\u09b6<\/button>\r\n      <span class=\"role-pill\" id=\"role-pill\">Admin<\/span>\r\n      <button class=\"logout-btn\" onclick=\"doLogout()\">Logout<\/button>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"sob\" id=\"sob\" onclick=\"togSB()\"><\/div>\r\n\r\n  <div class=\"layout\">\r\n    <div class=\"sidebar\" id=\"sidebar\">\r\n      <div class=\"sb-sec\">\r\n        <div class=\"sb-lbl\">Main<\/div>\r\n        <div class=\"mi active\" onclick=\"sv('overview',this)\">\r\n          <svg viewBox=\"0 0 14 14\" fill=\"none\"><rect x=\"1\" y=\"1\" width=\"5\" height=\"5\" rx=\"1.2\" fill=\"currentColor\"\/><rect x=\"8\" y=\"1\" width=\"5\" height=\"5\" rx=\"1.2\" fill=\"currentColor\"\/><rect x=\"1\" y=\"8\" width=\"5\" height=\"5\" rx=\"1.2\" fill=\"currentColor\"\/><rect x=\"8\" y=\"8\" width=\"5\" height=\"5\" rx=\"1.2\" fill=\"currentColor\"\/><\/svg>\r\n          Overview\r\n        <\/div>\r\n        <div class=\"mi\" onclick=\"sv('bookings',this)\">\r\n          <svg viewBox=\"0 0 14 14\" fill=\"none\"><rect x=\"1.5\" y=\"1.5\" width=\"11\" height=\"11\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><line x1=\"4\" y1=\"5\" x2=\"10\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"\/><line x1=\"4\" y1=\"7.5\" x2=\"8\" y2=\"7.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"\/><\/svg>\r\n          \u09b8\u09ac Booking <span class=\"mbadge\" id=\"pb\">0<\/span>\r\n        <\/div>\r\n        <div class=\"mi\" onclick=\"sv('payments',this)\">\r\n          <svg viewBox=\"0 0 14 14\" fill=\"none\"><rect x=\"1\" y=\"3.5\" width=\"12\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><line x1=\"1\" y1=\"6.5\" x2=\"13\" y2=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.2\"\/><\/svg>\r\n          Revenue\r\n        <\/div>\r\n        <div class=\"mi\" onclick=\"sv('calendar',this)\">\r\n          <svg viewBox=\"0 0 14 14\" fill=\"none\"><rect x=\"1.5\" y=\"2.5\" width=\"11\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><line x1=\"4.5\" y1=\"1.5\" x2=\"4.5\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"\/><line x1=\"9.5\" y1=\"1.5\" x2=\"9.5\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"\/><line x1=\"1.5\" y1=\"6\" x2=\"12.5\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1.2\"\/><\/svg>\r\n          Calendar\r\n        <\/div>\r\n        <div class=\"mi\" id=\"sb-props\" onclick=\"sv('assets',this)\">\r\n          <svg viewBox=\"0 0 14 14\" fill=\"none\"><path d=\"M2 11c1.5-2.5 3-3 5-3s3.5.5 5 3\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"\/><circle cx=\"7\" cy=\"5.5\" r=\"2.5\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><\/svg>\r\n          Properties <span class=\"mbadge\" id=\"asset-count\">0<\/span>\r\n        <\/div>\r\n        <div class=\"mi\" id=\"sb-analytics\" onclick=\"sv('analytics',this)\">\r\n          <svg viewBox=\"0 0 14 14\" fill=\"none\"><line x1=\"2\" y1=\"12\" x2=\"2\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"\/><line x1=\"2\" y1=\"12\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"\/><rect x=\"4\" y=\"7\" width=\"2\" height=\"5\" rx=\"1\" fill=\"currentColor\"\/><rect x=\"7\" y=\"5\" width=\"2\" height=\"7\" rx=\"1\" fill=\"currentColor\"\/><rect x=\"10\" y=\"3\" width=\"2\" height=\"9\" rx=\"1\" fill=\"currentColor\"\/><\/svg>\r\n          Analytics\r\n        <\/div>\r\n        <div class=\"mi\" id=\"sb-users\" onclick=\"sv('users',this)\">\r\n          <svg viewBox=\"0 0 14 14\" fill=\"none\"><circle cx=\"5\" cy=\"4.5\" r=\"2.5\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><path d=\"M1 11c.8-2 2.2-3 4-3s3.2 1 4 3\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"\/><path d=\"M9.5 6.5c1 0 1.8.8 1.8 1.8\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"\/><path d=\"M11.3 8.3c.5.3.9.9.9 1.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"\/><\/svg>\r\n          User Management\r\n        <\/div>\r\n        <!-- \u2605 NEW: Property Manager \u2014 SuperAdmin only -->\r\n        <div class=\"mi\" id=\"sb-propmanager\" onclick=\"sv('propmanager',this)\">\r\n          <svg viewBox=\"0 0 14 14\" fill=\"none\"><rect x=\"1\" y=\"7\" width=\"5\" height=\"6\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><rect x=\"8\" y=\"4\" width=\"5\" height=\"9\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><path d=\"M3.5 7V5a1.5 1.5 0 0 1 3 0v2\" stroke=\"currentColor\" stroke-width=\"1.2\"\/><\/svg>\r\n          Property Manager\r\n        <\/div>\r\n      <\/div>\r\n      <hr class=\"sb-div\">\r\n      <div class=\"sb-sec\">\r\n        <div class=\"sb-lbl\">Filter by Type<\/div>\r\n        <div class=\"mi\" onclick=\"filterByType('Resort')\"><span style=\"width:8px;height:8px;background:var(--green);border-radius:2px;flex-shrink:0;display:inline-block\"><\/span>Resorts<\/div>\r\n        <div class=\"mi\" onclick=\"filterByType('Houseboat')\"><span style=\"width:8px;height:8px;background:var(--blue);border-radius:2px;flex-shrink:0;display:inline-block\"><\/span>Houseboats<\/div>\r\n        <div class=\"mi\" onclick=\"filterByType('Hotel')\"><span style=\"width:8px;height:8px;background:var(--amber);border-radius:2px;flex-shrink:0;display:inline-block\"><\/span>Hotels<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"main\">\r\n\r\n      <!-- OVERVIEW -->\r\n      <div id=\"v-overview\" class=\"view active\">\r\n        <div class=\"ph\"><div class=\"ph-left\"><h2>Central Dashboard<\/h2><p id=\"ov-sub\">\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/p><\/div><div class=\"ph-right\"><button class=\"btn btn-outline\" onclick=\"exportCSV()\">CSV Export<\/button><\/div><\/div>\r\n        <div class=\"content\">\r\n          <div class=\"err\" id=\"err-box\">\u26a0 Google Sheets \u09a5\u09c7\u0995\u09c7 \u09a1\u09c7\u099f\u09be \u09b2\u09cb\u09a1 \u09b9\u09af\u09bc\u09a8\u09bf\u0964<\/div>\r\n          <div id=\"agent-banner\" style=\"display:none\" class=\"agent-info-banner\"><svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"><circle cx=\"9\" cy=\"9\" r=\"8\" stroke=\"#3b82f6\" stroke-width=\"1.5\"\/><line x1=\"9\" y1=\"8\" x2=\"9\" y2=\"13\" stroke=\"#3b82f6\" stroke-width=\"1.5\" stroke-linecap=\"round\"\/><circle cx=\"9\" cy=\"5.5\" r=\"1\" fill=\"#3b82f6\"\/><\/svg><p id=\"agent-banner-text\">\u0986\u09aa\u09a8\u09bf \u09b6\u09c1\u09a7\u09c1 \u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09bf\u099c\u09c7\u09b0 booking \u09a6\u09c7\u0996\u09a4\u09c7 \u09aa\u09be\u099a\u09cd\u099b\u09c7\u09a8\u0964<\/p><\/div>\r\n          <div class=\"metrics\">\r\n            <div class=\"metric\"><div class=\"mbar\" style=\"background:var(--orange)\"><\/div><div class=\"mlbl\">\u09ae\u09cb\u099f \u0986\u09af\u09bc (\u098f\u0987 \u09ae\u09be\u09b8)<\/div><div class=\"mval\" id=\"m-rev\">\u2014<\/div><div class=\"msub nt\" id=\"m-rev-s\">\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/div><\/div>\r\n            <div class=\"metric\"><div class=\"mbar\" style=\"background:var(--blue)\"><\/div><div class=\"mlbl\">\u09ae\u09cb\u099f Booking<\/div><div class=\"mval\" id=\"m-bk\">\u2014<\/div><div class=\"msub nt\" id=\"m-bk-s\">\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/div><\/div>\r\n            <div class=\"metric\"><div class=\"mbar\" style=\"background:var(--amber)\"><\/div><div class=\"mlbl\">Pending<\/div><div class=\"mval\" id=\"m-pd\">\u2014<\/div><div class=\"msub nt\">\u098f\u0996\u09a8\u0987 action \u09a8\u09bf\u09a8<\/div><\/div>\r\n            <div class=\"metric\"><div class=\"mbar\" style=\"background:var(--green)\"><\/div><div class=\"mlbl\">Confirmed<\/div><div class=\"mval\" id=\"m-cf\">\u2014<\/div><div class=\"msub nt\" id=\"m-cf-s\">\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/div><\/div>\r\n          <\/div>\r\n          <div class=\"g2\">\r\n            <div class=\"card\"><div class=\"ch\"><span class=\"ct\">\u09b8\u09be\u09ae\u09cd\u09aa\u09cd\u09b0\u09a4\u09bf\u0995 Booking<\/span><span class=\"ca\" onclick=\"sv('bookings',null)\">\u09b8\u09ac \u09a6\u09c7\u0996\u09c1\u09a8 \u2192<\/span><\/div><div id=\"rec-bk\"><div class=\"lr\"><span class=\"sp\"><\/span>\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/div><\/div><\/div>\r\n            <div style=\"display:flex;flex-direction:column;gap:14px\">\r\n              <div class=\"card\"><div class=\"ch\"><span class=\"ct\">Booking Status<\/span><\/div><div id=\"status-boxes\"><\/div><\/div>\r\n              <div class=\"card\"><div class=\"ch\"><span class=\"ct\">\u09b8\u09be\u09ae\u09cd\u09aa\u09cd\u09b0\u09a4\u09bf\u0995 Payment<\/span><\/div><div id=\"rec-pay\"><\/div><\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"g2\">\r\n            <div class=\"card\"><div class=\"ch\"><span class=\"ct\">Top Properties<\/span><\/div><div id=\"top-assets\"><\/div><\/div>\r\n            <div class=\"card\"><div class=\"ch\"><span class=\"ct\">Weekly Revenue<\/span><\/div><div class=\"rev-bars\" id=\"rev-chart\"><\/div><div style=\"display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:10px\"><div class=\"stat-box\"><div class=\"sb-val\" id=\"rev-total\">\u2014<\/div><div class=\"sb-lbl2\">\u09ae\u09cb\u099f \u0986\u09af\u09bc<\/div><\/div><div class=\"stat-box\"><div class=\"sb-val\" id=\"rev-avg\">\u2014<\/div><div class=\"sb-lbl2\">\u0997\u09a1\u09bc booking<\/div><\/div><\/div><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- BOOKINGS -->\r\n      <div id=\"v-bookings\" class=\"view\">\r\n        <div class=\"ph\"><div class=\"ph-left\"><h2 id=\"bk-page-title\">\u09b8\u09ac Booking<\/h2><p id=\"bk-sub\">\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/p><\/div><div class=\"ph-right\"><button class=\"btn btn-outline\" onclick=\"exportCSV()\">CSV Export<\/button><button class=\"btn btn-orange\" id=\"add-bk-btn\" onclick=\"openAddBk()\">+ Add Booking<\/button><\/div><\/div>\r\n        <div class=\"content\">\r\n          <div class=\"fb\"><input type=\"text\" id=\"bk-q\" placeholder=\"\u09a8\u09be\u09ae, \u09ab\u09cb\u09a8 \u09ac\u09be Booking ID...\" oninput=\"filterBk()\"><select id=\"bk-st\" onchange=\"filterBk()\"><option value=\"\">\u09b8\u09ac Status<\/option><option>Confirmed<\/option><option>Pending<\/option><option>Cancelled<\/option><option>Completed<\/option><\/select><select id=\"bk-tp\" onchange=\"filterBk()\"><option value=\"\">\u09b8\u09ac Type<\/option><option>Resort<\/option><option>Houseboat<\/option><option>Hotel<\/option><\/select><select id=\"bk-as\" onchange=\"filterBk()\"><option value=\"\">\u09b8\u09ac Property<\/option><\/select><\/div>\r\n          <div class=\"tw\"><table><thead><tr><th>Booking ID<\/th><th>Guest<\/th><th>Property<\/th><th>Package<\/th><th>\u09a4\u09be\u09b0\u09bf\u0996<\/th><th>\u099c\u09a8\/\u09b0\u09be\u09a4<\/th><th>\u09ae\u09cb\u099f<\/th><th>Payment<\/th><th>Status<\/th><th id=\"act-col\">Action<\/th><\/tr><\/thead><tbody id=\"bk-tbody\"><tr><td colspan=\"10\"><div class=\"lr\"><span class=\"sp\"><\/span>\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/div><\/td><\/tr><\/tbody><\/table><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- REVENUE -->\r\n      <div id=\"v-payments\" class=\"view\">\r\n        <div class=\"ph\"><div class=\"ph-left\"><h2>Revenue & Payment<\/h2><p id=\"pay-sub\">\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/p><\/div><div class=\"ph-right\"><button class=\"btn btn-outline\" onclick=\"exportCSV()\">CSV Export<\/button><\/div><\/div>\r\n        <div class=\"content\">\r\n          <div class=\"metrics\" style=\"grid-template-columns:repeat(3,1fr)\"><div class=\"metric\"><div class=\"mbar\" style=\"background:var(--green)\"><\/div><div class=\"mlbl\">\u09ae\u09cb\u099f \u0986\u09af\u09bc (Confirmed)<\/div><div class=\"mval\" id=\"p-total\">\u2014<\/div><\/div><div class=\"metric\"><div class=\"mbar\" style=\"background:var(--amber)\"><\/div><div class=\"mlbl\">Pending \u098f\u09b0 \u09ae\u09cb\u099f<\/div><div class=\"mval\" id=\"p-pend\">\u2014<\/div><\/div><div class=\"metric\"><div class=\"mbar\" style=\"background:var(--red)\"><\/div><div class=\"mlbl\">\u09ac\u09be\u09a4\u09bf\u09b2 booking<\/div><div class=\"mval\" id=\"p-canc\">\u2014<\/div><\/div><\/div>\r\n          <div class=\"fb\"><input type=\"text\" id=\"pay-q\" placeholder=\"\u09a8\u09be\u09ae \u09ac\u09be Booking ID...\" oninput=\"filterPay()\"><select id=\"pay-st\" onchange=\"filterPay()\"><option value=\"\">\u09b8\u09ac Booking Status<\/option><option>Confirmed<\/option><option>Pending<\/option><option>Cancelled<\/option><option>Completed<\/option><\/select><select id=\"pay-ps\" onchange=\"filterPay()\"><option value=\"\">\u09b8\u09ac Payment Status<\/option><option value=\"Paid\">Paid<\/option><option value=\"Unpaid\">Unpaid<\/option><option value=\"Partial\">Partial<\/option><\/select><select id=\"pay-as\" onchange=\"filterPay()\"><option value=\"\">\u09b8\u09ac Property<\/option><\/select><\/div>\r\n          <div class=\"tw\"><table><thead><tr><th>Booking ID<\/th><th>Guest<\/th><th>Property<\/th><th>Check-in<\/th><th>Check-out<\/th><th>\u099c\u09a8<\/th><th>\u09b0\u09be\u09a4<\/th><th>\u09ae\u09cb\u099f<\/th><th>Payment<\/th><th>Status<\/th><\/tr><\/thead><tbody id=\"pay-tbody\"><tr><td colspan=\"10\"><div class=\"lr\"><span class=\"sp\"><\/span>\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/div><\/td><\/tr><\/tbody><\/table><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- CALENDAR -->\r\n      <div id=\"v-calendar\" class=\"view\">\r\n        <div class=\"ph\"><div class=\"ph-left\"><h2>Booking Calendar<\/h2><p id=\"cal-sub\">Property select \u0995\u09b0\u09c1\u09a8<\/p><\/div><div class=\"ph-right\" style=\"flex-wrap:wrap;gap:8px\"><div class=\"cal-dd-wrap\" id=\"cal-dd-wrap\"><button class=\"cal-dd-btn\" onclick=\"togCalDD()\" id=\"cal-dd-btn\">\ud83c\udfe0 All Properties \u25be<\/button><div class=\"cal-dd-menu\" id=\"cal-dd-menu\"><div class=\"cal-dd-item sel\" onclick=\"selCalAsset('','All Properties')\">\ud83c\udfe0 All Properties<\/div><\/div><\/div><button class=\"btn btn-outline\" onclick=\"prevM()\">\u2190 \u0986\u0997\u09c7\u09b0 \u09ae\u09be\u09b8<\/button><button class=\"btn btn-outline\" onclick=\"nextM()\">\u09aa\u09b0\u09c7\u09b0 \u09ae\u09be\u09b8 \u2192<\/button><\/div><\/div>\r\n        <div class=\"content\"><div style=\"display:flex;gap:10px;margin-bottom:12px;align-items:center;flex-wrap:wrap\"><div style=\"background:var(--white);border:1px solid var(--bd);border-radius:var(--r);padding:9px 14px;font-size:12px;font-weight:600;color:var(--navy)\" id=\"cal-lbl\"><\/div><div class=\"cal-legend\"><span><span style=\"width:12px;height:12px;background:#fee2e2;border:1px solid #fca5a5;border-radius:2px;display:inline-block\"><\/span>Booked<\/span><span><span style=\"width:12px;height:12px;background:#f0fdf4;border:1px solid #86efac;border-radius:2px;display:inline-block\"><\/span>Available<\/span><span><span style=\"width:12px;height:12px;background:var(--white);border:1.5px solid var(--orange);border-radius:2px;display:inline-block\"><\/span>Today<\/span><\/div><\/div><div id=\"cal-grid\" style=\"background:var(--white);border:1px solid var(--bd);border-radius:var(--r);padding:12px\"><div class=\"lr\"><span class=\"sp\"><\/span>\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/div><\/div><\/div>\r\n      <\/div>\r\n\r\n      <!-- ASSETS -->\r\n      <div id=\"v-assets\" class=\"view\">\r\n        <div class=\"ph\"><div class=\"ph-left\"><h2>Properties<\/h2><p id=\"ast-sub\">\u09b8\u09ac property<\/p><\/div><\/div>\r\n        <div class=\"content\"><div class=\"fb\"><input type=\"text\" id=\"ast-q\" placeholder=\"Property \u09a8\u09be\u09ae \u09ac\u09be location...\" oninput=\"filterAssets()\"><select id=\"ast-tp\" onchange=\"filterAssets()\"><option value=\"\">\u09b8\u09ac Type<\/option><option>Resort<\/option><option>Houseboat<\/option><option>Hotel<\/option><\/select><\/div><div class=\"tw\"><table><thead><tr><th>Property Name<\/th><th>Type<\/th><th>Location<\/th><th>Base Price<\/th><th>Total Booking<\/th><th>Status<\/th><\/tr><\/thead><tbody id=\"ast-tbody\"><tr><td colspan=\"6\"><div class=\"lr\"><span class=\"sp\"><\/span>\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/div><\/td><\/tr><\/tbody><\/table><\/div><\/div>\r\n      <\/div>\r\n\r\n      <!-- ANALYTICS -->\r\n      <div id=\"v-analytics\" class=\"view\">\r\n        <div class=\"ph\"><div class=\"ph-left\"><h2>Analytics<\/h2><p>Performance \u09b8\u09be\u09b0\u09b8\u0982\u0995\u09cd\u09b7\u09c7\u09aa<\/p><\/div><\/div>\r\n        <div class=\"content\"><div class=\"g22\"><div class=\"card\"><div class=\"ch\"><span class=\"ct\">\u09ae\u09c2\u09b2 \u09aa\u09b0\u09bf\u09b8\u0982\u0996\u09cd\u09af\u09be\u09a8<\/span><\/div><div id=\"key-stats\" style=\"display:grid;grid-template-columns:1fr 1fr;gap:8px\"><\/div><\/div><div class=\"card\"><div class=\"ch\"><span class=\"ct\">Property Type \u09ac\u09bf\u09ad\u09be\u099c\u09a8<\/span><\/div><div id=\"type-chart\"><\/div><\/div><\/div><div class=\"card\"><div class=\"ch\"><span class=\"ct\">Property \u0993\u09af\u09bc\u09be\u0987\u099c Booking<\/span><\/div><div id=\"all-occ\"><\/div><\/div><\/div>\r\n      <\/div>\r\n\r\n      <!-- USERS -->\r\n      <div id=\"v-users\" class=\"view\">\r\n        <div class=\"ph\"><div class=\"ph-left\"><h2>User Management<\/h2><p id=\"usr-sub\">\u09b8\u09ac user<\/p><\/div><\/div>\r\n        <div class=\"content\">\r\n          <div class=\"add-user-form\"><h4>\u2795 \u09a8\u09a4\u09c1\u09a8 User \u09af\u09cb\u0997 \u0995\u09b0\u09c1\u09a8<\/h4><div class=\"form-grid\"><div class=\"fg\" style=\"margin-bottom:0\"><label>Username *<\/label><input type=\"text\" id=\"nu-username\" placeholder=\"agent_karim\"><\/div><div class=\"fg\" style=\"margin-bottom:0\"><label>Password *<\/label><input type=\"password\" id=\"nu-password\" placeholder=\"\u09b6\u0995\u09cd\u09a4\u09bf\u09b6\u09be\u09b2\u09c0 password\"><\/div><div class=\"fg\" style=\"margin-bottom:0\"><label>Role *<\/label><select id=\"nu-role\"><option value=\"B2B\">B2B Agent<\/option><option value=\"AgentAdmin\">Agent Admin<\/option><\/select><\/div><div class=\"fg\" style=\"margin-bottom:0\"><label>&nbsp;<\/label><button class=\"btn btn-orange\" onclick=\"addNewUser()\" id=\"add-user-btn\">+ Add User<\/button><\/div><\/div><div id=\"add-user-msg\" style=\"display:none;margin-top:10px;padding:8px 12px;border-radius:6px;font-size:12px\"><\/div><\/div>\r\n          <div id=\"user-list-wrap\"><div class=\"lr\"><span class=\"sp\"><\/span>Users \u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...<\/div><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- \u2605 NEW: PROPERTY MANAGER -->\r\n      <div id=\"v-propmanager\" class=\"view\">\r\n        <div class=\"ph\">\r\n          <div class=\"ph-left\"><h2>\ud83c\udfe0 Property Manager<\/h2><p id=\"pm-sub\">Tourvill website properties manage \u0995\u09b0\u09c1\u09a8<\/p><\/div>\r\n          <div class=\"ph-right\"><button class=\"btn btn-orange\" onclick=\"pmOpenAdd()\">+ Add Property<\/button><\/div>\r\n        <\/div>\r\n        <div class=\"content\">\r\n          <div class=\"metrics\">\r\n            <div class=\"metric\"><div class=\"mbar\" style=\"background:#1a56db\"><\/div><div class=\"mlbl\">Total<\/div><div class=\"mval\" id=\"pm-s-total\">\u2014<\/div><\/div>\r\n            <div class=\"metric\"><div class=\"mbar\" style=\"background:#6d28d9\"><\/div><div class=\"mlbl\">Our Property<\/div><div class=\"mval\" id=\"pm-s-our\">\u2014<\/div><\/div>\r\n            <div class=\"metric\"><div class=\"mbar\" style=\"background:#d97706\"><\/div><div class=\"mlbl\">Popular<\/div><div class=\"mval\" id=\"pm-s-popular\">\u2014<\/div><\/div>\r\n            <div class=\"metric\"><div class=\"mbar\" style=\"background:#dc2626\"><\/div><div class=\"mlbl\">Hot<\/div><div class=\"mval\" id=\"pm-s-hot\">\u2014<\/div><\/div>\r\n          <\/div>\r\n          <div style=\"display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap\">\r\n            <button class=\"btn btn-orange\" id=\"pmf-all\" onclick=\"pmFilter('all',this)\">All<\/button>\r\n            <button class=\"btn btn-outline\" id=\"pmf-our\" onclick=\"pmFilter('Our Property',this)\">Our Property<\/button>\r\n            <button class=\"btn btn-outline\" id=\"pmf-popular\" onclick=\"pmFilter('Popular',this)\">Popular<\/button>\r\n            <button class=\"btn btn-outline\" id=\"pmf-hot\" onclick=\"pmFilter('Hot',this)\">Hot<\/button>\r\n          <\/div>\r\n          <div class=\"tw\">\r\n            <table>\r\n              <thead><tr><th>Image<\/th><th>Property<\/th><th>Categories<\/th><th>View Info Page<\/th><th>Actions<\/th><\/tr><\/thead>\r\n              <tbody id=\"pm-tbody\"><tr><td colspan=\"5\"><div class=\"lr\"><span class=\"sp\"><\/span>Loading...<\/div><\/td><\/tr><\/tbody>\r\n            <\/table>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- ADD BOOKING MODAL -->\r\n<div class=\"mb\" id=\"add-bk-modal\">\r\n  <div class=\"modal\"><div class=\"mhead\"><div><h3>\u09a8\u09a4\u09c1\u09a8 Booking<\/h3><p>\u09b8\u09ac \u09a4\u09a5\u09cd\u09af \u09b8\u09a0\u09bf\u0995\u09ad\u09be\u09ac\u09c7 \u09a6\u09bf\u09a8<\/p><\/div><button class=\"mcl\" onclick=\"closeAddBk()\">\u2715<\/button><\/div>\r\n  <div class=\"mbody\"><div id=\"ab-form\">\r\n    <div class=\"frow\"><div class=\"fg\"><label>Guest Name *<\/label><input type=\"text\" id=\"ab-name\" placeholder=\"\u09aa\u09c2\u09b0\u09cd\u09a3 \u09a8\u09be\u09ae\"><\/div><div class=\"fg\"><label>Phone *<\/label><input type=\"tel\" id=\"ab-phone\" placeholder=\"01XXXXXXXXX\"><\/div><\/div>\r\n    <div class=\"fg\"><label>Email<\/label><input type=\"email\" id=\"ab-email\" placeholder=\"email@example.com\"><\/div>\r\n    <div class=\"frow\"><div class=\"fg\"><label>Property *<\/label><select id=\"ab-asset\" onchange=\"abUpdAsset()\"><option value=\"\">-- Property \u09ac\u09c7\u099b\u09c7 \u09a8\u09bf\u09a8 --<\/option><\/select><\/div><div class=\"fg\"><label>Type<\/label><input type=\"text\" id=\"ab-type\" readonly style=\"background:var(--sf);color:var(--muted)\"><\/div><\/div>\r\n    <div class=\"fg\"><label>Package<\/label><input type=\"text\" id=\"ab-pkg\" placeholder=\"\u09af\u09c7\u09ae\u09a8: Family Standard\"><\/div>\r\n    <div class=\"frow\"><div class=\"fg\"><label>Check-in *<\/label><input type=\"date\" id=\"ab-ci\" onchange=\"abCalc()\"><\/div><div class=\"fg\"><label>Check-out *<\/label><input type=\"date\" id=\"ab-co\" onchange=\"abCalc()\"><\/div><\/div>\r\n    <div class=\"frow\"><div class=\"fg\"><label>Persons<\/label><input type=\"number\" id=\"ab-per\" value=\"2\" min=\"1\" onchange=\"abCalc()\"><\/div><div class=\"fg\"><label>Rate\/Person\/Night<\/label><input type=\"number\" id=\"ab-rate\" placeholder=\"5000\" onchange=\"abCalc()\"><\/div><\/div>\r\n    <div class=\"fg\"><label>Notes<\/label><input type=\"text\" id=\"ab-notes\" placeholder=\"\u09ac\u09bf\u09b6\u09c7\u09b7 \u0985\u09a8\u09c1\u09b0\u09cb\u09a7...\"><\/div>\r\n    <div class=\"pp hidden\" id=\"ab-pp\"><div class=\"ppr\"><span id=\"ab-r1\">\u2014<\/span><span id=\"ab-r2\">\u2014<\/span><\/div><div class=\"ppr\"><span>Service Charge (5%)<\/span><span id=\"ab-r3\">\u2014<\/span><\/div><div class=\"ppr tot\"><span>\u09ae\u09cb\u099f<\/span><span id=\"ab-r4\">\u2014<\/span><\/div><\/div>\r\n    <div id=\"ab-conflict\" style=\"display:none;background:var(--rbg);border:1px solid #fca5a5;border-radius:var(--rsm);padding:12px;margin-bottom:12px;font-size:12px;color:var(--rt)\">\u26a0 \u098f\u0987 \u09a4\u09be\u09b0\u09bf\u0996\u09c7 \u098f\u0987 property \u09a4\u09c7 booking \u0986\u099b\u09c7!<\/div>\r\n    <button class=\"sub-btn\" id=\"ab-sub\" onclick=\"submitAddBk()\"><span>Booking Confirm \u0995\u09b0\u09c1\u09a8<\/span><div class=\"sp2\" id=\"ab-spin\"><\/div><\/button>\r\n  <\/div>\r\n  <div class=\"bk-ok\" id=\"ab-ok\"><div class=\"bk-ok-icon\">\u2713<\/div><div style=\"font-size:14px;font-weight:600;color:var(--navy);margin-bottom:6px\">Booking \u09b8\u09ae\u09cd\u09aa\u09a8\u09cd\u09a8!<\/div><div class=\"bk-ok-id\" id=\"ab-bid\">\u2014<\/div><div style=\"font-size:12px;color:var(--muted);margin-bottom:16px\">Booking \u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09af\u09cb\u0997 \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964<\/div><button class=\"btn btn-orange\" onclick=\"closeAddBk()\">\u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8<\/button><\/div>\r\n  <\/div><\/div>\r\n<\/div>\r\n\r\n<!-- BOOKING DETAIL MODAL -->\r\n<div class=\"mb\" id=\"bk-modal\">\r\n  <div class=\"modal\"><div class=\"mhead\"><div><h3 id=\"m-title\">Booking Details<\/h3><p id=\"m-sub\"><\/p><\/div><button class=\"mcl\" onclick=\"closeM()\">\u2715<\/button><\/div><div class=\"mbody\"><div id=\"m-body\"><\/div><div class=\"ma\" id=\"m-actions\"><\/div><\/div><\/div>\r\n<\/div>\r\n\r\n<!-- \u2605 PROPERTY MANAGER ADD\/EDIT MODAL -->\r\n<div class=\"mb\" id=\"pm-modal\">\r\n  <div class=\"modal\" style=\"max-width:580px\">\r\n    <div class=\"mhead\"><div><h3 id=\"pm-modal-title\">Add New Property<\/h3><p>Tourvill website \u098f auto publish \u09b9\u09ac\u09c7<\/p><\/div><button class=\"mcl\" onclick=\"pmCloseModal()\">\u2715<\/button><\/div>\r\n    <div class=\"mbody\">\r\n      <div style=\"font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.8px;margin-bottom:10px\">Basic Info<\/div>\r\n      <div class=\"frow\">\r\n        <div class=\"fg\"><label>Property Name *<\/label><input type=\"text\" id=\"pm-name\" placeholder=\"e.g. Ocean View Villa\"><\/div>\r\n        <div class=\"fg\"><label>Location *<\/label><select id=\"pm-location\"><option value=\"\">Select location...<\/option><option>Cox's Bazar<\/option><option>Bandarban<\/option><option>Sundarban<\/option><option>Saint Martin<\/option><option>Sreemangal<\/option><option>Sajek<\/option><option>Tanguar Haor<\/option><\/select><\/div>\r\n      <\/div>\r\n      <div class=\"fg\">\r\n        <label>Image URL<\/label>\r\n        <input type=\"text\" id=\"pm-image\" placeholder=\"https:\/\/...\" oninput=\"pmPreviewImg()\">\r\n        <div id=\"pm-img-preview\" style=\"width:100%;height:100px;background:var(--sf);border-radius:var(--rsm);border:1.5px dashed var(--bd);display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--muted);overflow:hidden;margin-top:8px\">Image preview<\/div>\r\n      <\/div>\r\n      <div style=\"border-top:1px solid var(--bd);margin:14px 0\"><\/div>\r\n      <div style=\"font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.8px;margin-bottom:10px\">Categories (\u098f\u0995\u09be\u09a7\u09bf\u0995 select \u0995\u09b0\u09be \u09af\u09be\u09ac\u09c7)<\/div>\r\n      <div style=\"display:flex;gap:10px;flex-wrap:wrap;margin-bottom:4px\">\r\n        <div class=\"pm-cat-chip\" id=\"pm-cc-our\" onclick=\"pmToggleCat(this,'Our Property')\">\ud83c\udfe1 Our Property<\/div>\r\n        <div class=\"pm-cat-chip\" id=\"pm-cc-popular\" onclick=\"pmToggleCat(this,'Popular')\">\u2b50 Popular<\/div>\r\n        <div class=\"pm-cat-chip\" id=\"pm-cc-hot\" onclick=\"pmToggleCat(this,'Hot')\">\ud83d\udd25 Hot<\/div>\r\n      <\/div>\r\n      <div style=\"border-top:1px solid var(--bd);margin:14px 0\"><\/div>\r\n      <div style=\"font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.8px;margin-bottom:10px\">View Info Page Content<\/div>\r\n      <div class=\"fg\"><label>Page Title (H1)<\/label><input type=\"text\" id=\"pm-h1\" placeholder=\"e.g. Discover Ocean View Villa in Cox's Bazar\"><\/div>\r\n      <div class=\"fg\"><label>Description<\/label><textarea id=\"pm-desc\" placeholder=\"Describe the property...\"><\/textarea><\/div>\r\n      <div class=\"fg\">\r\n        <label>Key Highlights<\/label>\r\n        <div id=\"pm-kp-list\" style=\"display:flex;flex-direction:column;gap:8px;margin-bottom:8px\">\r\n          <div style=\"display:flex;gap:8px;align-items:center\"><input type=\"text\" placeholder=\"e.g. Private beach access\" style=\"flex:1;border:1.5px solid var(--bd);border-radius:var(--rsm);padding:9px 12px;font-family:'Sora',sans-serif;font-size:13px;outline:none;color:var(--text)\"><button onclick=\"pmRemoveKP(this)\" style=\"width:30px;height:30px;border:1.5px solid var(--bd);border-radius:6px;background:transparent;cursor:pointer;font-size:13px;flex-shrink:0\">\u2715<\/button><\/div>\r\n        <\/div>\r\n        <button onclick=\"pmAddKP('')\" style=\"font-size:12px;font-weight:700;color:#1a56db;background:#dbeafe;border:none;padding:7px 14px;border-radius:var(--rsm);cursor:pointer;font-family:'Sora',sans-serif\">+ Add Highlight<\/button>\r\n      <\/div>\r\n      <button class=\"sub-btn\" id=\"pm-save-btn\" onclick=\"pmSave()\">\r\n        <span id=\"pm-save-text\">Save & Create Page<\/span><div class=\"sp2\" id=\"pm-spin\"><\/div>\r\n      <\/button>\r\n      <div id=\"pm-msg\" style=\"display:none;margin-top:10px;padding:10px 14px;border-radius:var(--rsm);font-size:12px;text-align:center\"><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- \u2605 PROPERTY DELETE CONFIRM -->\r\n<div class=\"mb\" id=\"pm-del-modal\">\r\n  <div class=\"modal\" style=\"max-width:360px;text-align:center\">\r\n    <div class=\"mhead\"><div><h3>Property Delete \u0995\u09b0\u09ac\u09c7\u09a8?<\/h3><p>WordPress page \u0993 remove \u09b9\u09ac\u09c7<\/p><\/div><button class=\"mcl\" onclick=\"document.getElementById('pm-del-modal').classList.remove('open')\">\u2715<\/button><\/div>\r\n    <div class=\"mbody\"><div style=\"font-size:36px;margin-bottom:12px\">\ud83d\uddd1\ufe0f<\/div><p style=\"font-size:13px;color:var(--muted);margin-bottom:20px\">\u098f\u0987 action undo \u0995\u09b0\u09be \u09af\u09be\u09ac\u09c7 \u09a8\u09be\u0964<\/p><div style=\"display:flex;gap:10px;justify-content:center\"><button class=\"btn btn-outline\" onclick=\"document.getElementById('pm-del-modal').classList.remove('open')\">Cancel<\/button><button class=\"btn btn-red\" onclick=\"pmConfirmDelete()\">Yes, Delete<\/button><\/div><\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ EXISTING PMS CODE \u2014 \u0995\u09bf\u099b\u09c1\u0987 change \u09b9\u09af\u09bc\u09a8\u09bf\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nvar SCRIPT_URL = 'https:\/\/script.google.com\/macros\/s\/AKfycbyIuZcVNGekS0reeqjB9RLmd6pPAXR69fFrDiSWtO_hTdnqxxCpGjxj3HQdb_rP9GOX\/exec';\r\nvar currentRole='',currentUsername='';\r\nvar allBookings=[],allAssets=[],allUsers=[];\r\nvar visibleBookings=[];\r\nvar calMonth=new Date().getMonth(),calYear=new Date().getFullYear();\r\nvar selCalAssetVal='';\r\nvar typeColors={Resort:'#10b981',Houseboat:'#3b82f6',Hotel:'#f59e0b'};\r\n\r\nfunction doLogin(){\r\n  var user=document.getElementById('l-user').value.trim(),pass=document.getElementById('l-pass').value.trim();\r\n  if(!user||!pass){showErr('Username \u0993 Password \u09a6\u09bf\u09a8');return;}\r\n  var btn=document.getElementById('login-btn');btn.disabled=true;document.getElementById('login-spin').style.display='block';\r\n  fetch(SCRIPT_URL+'?action=login&username='+encodeURIComponent(user)+'&password='+encodeURIComponent(pass))\r\n    .then(r=>r.json()).then(d=>{btn.disabled=false;document.getElementById('login-spin').style.display='none';\r\n    if(d.success){currentRole=d.role;currentUsername=d.username;document.getElementById('login-page').style.display='none';document.getElementById('dashboard').style.display='flex';applyRole();loadData();}\r\n    else showErr('Username \u09ac\u09be Password \u09ad\u09c1\u09b2!');}).catch(()=>{btn.disabled=false;document.getElementById('login-spin').style.display='none';showErr('Connection error!');});\r\n}\r\nfunction showErr(msg){var el=document.getElementById('login-err');el.textContent='\u274c '+msg;el.style.display='block';}\r\nfunction doLogout(){currentRole='';currentUsername='';allBookings=[];allAssets=[];allUsers=[];visibleBookings=[];document.getElementById('login-page').style.display='flex';document.getElementById('dashboard').style.display='none';document.getElementById('l-user').value='';document.getElementById('l-pass').value='';document.getElementById('login-err').style.display='none';}\r\n\r\nfunction applyRole(){\r\n  var pill=document.getElementById('role-pill');\r\n  var isSA=(currentRole==='SuperAdmin');\r\n  if(isSA){pill.textContent='\ud83d\udc51 Super Admin';pill.className='role-pill role-super';document.getElementById('sb-props').style.display='flex';document.getElementById('sb-analytics').style.display='flex';document.getElementById('sb-users').style.display='flex';document.getElementById('sb-propmanager').style.display='flex';document.getElementById('agent-banner').style.display='none';}\r\n  else{pill.textContent=currentRole==='AgentAdmin'?'\ud83d\udee1 Agent Admin':'\ud83e\udd1d B2B Agent';pill.className='role-pill role-b2b';document.getElementById('sb-props').style.display='none';document.getElementById('sb-analytics').style.display='none';document.getElementById('sb-users').style.display='none';document.getElementById('sb-propmanager').style.display='none';document.getElementById('agent-banner').style.display='flex';document.getElementById('agent-banner-text').textContent='\u0986\u09aa\u09a8\u09bf \u09b6\u09c1\u09a7\u09c1 \u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09bf\u099c\u09c7\u09b0 booking \u09a6\u09c7\u0996\u09a4\u09c7 \u09aa\u09be\u099a\u09cd\u099b\u09c7\u09a8\u0964';}\r\n}\r\n\r\nfunction loadData(){\r\n  var btn=document.getElementById('rbtn');btn.classList.add('loading');btn.disabled=true;\r\n  fetch(SCRIPT_URL+'?action=getDashboardData').then(r=>r.json()).then(d=>{\r\n    allBookings=d.bookings||[];allAssets=d.assets||[];\r\n    visibleBookings=currentRole==='SuperAdmin'?allBookings:allBookings.filter(b=>b.agentUsername===currentUsername);\r\n    renderAll();btn.classList.remove('loading');btn.disabled=false;\r\n    var now=new Date();document.getElementById('sync-info').textContent='\u09b8\u09bf\u0999\u09cd\u0995: '+now.getHours()+':'+String(now.getMinutes()).padStart(2,'0');\r\n    document.getElementById('err-box').style.display='none';\r\n    if(currentRole==='SuperAdmin')loadUsers();\r\n  }).catch(()=>{btn.classList.remove('loading');btn.disabled=false;document.getElementById('err-box').style.display='block';});\r\n}\r\n\r\nfunction renderAll(){renderMetrics();renderRecBk();renderStatusBoxes();renderRecPay();renderTopAssets();renderRevChart();renderBkTable();renderPayTable();renderCal();if(currentRole==='SuperAdmin'){renderAssetsTable();renderAnalytics();}populateFilters();populateCalDD();populateAbAssets();var now=new Date();var months=['\u099c\u09be\u09a8\u09c1\u09af\u09bc\u09be\u09b0\u09bf','\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09af\u09bc\u09be\u09b0\u09bf','\u09ae\u09be\u09b0\u09cd\u099a','\u098f\u09aa\u09cd\u09b0\u09bf\u09b2','\u09ae\u09c7','\u099c\u09c1\u09a8','\u099c\u09c1\u09b2\u09be\u0987','\u0986\u0997\u09b8\u09cd\u099f','\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0','\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0','\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0','\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0'];document.getElementById('ov-sub').textContent=months[now.getMonth()]+' '+now.getFullYear()+' \u2014 '+visibleBookings.length+'\u099f\u09bf booking, '+allAssets.length+'\u099f\u09bf property';document.getElementById('bk-sub').textContent='\u09ae\u09cb\u099f '+visibleBookings.length+'\u099f\u09bf booking';document.getElementById('asset-count').textContent=allAssets.length;document.getElementById('ast-sub').textContent=allAssets.length+'\u099f\u09bf property';document.getElementById('bk-page-title').textContent=currentRole!=='SuperAdmin'?'\u0986\u09ae\u09be\u09b0 Booking':'\u09b8\u09ac Booking';}\r\n\r\nfunction renderMetrics(){var bks=visibleBookings;var now=new Date();var mBk=bks.filter(b=>{var d=new Date(b.checkIn);return d.getMonth()===now.getMonth()&&d.getFullYear()===now.getFullYear();});var mRev=mBk.filter(b=>b.bookingStatus!=='Cancelled').reduce((s,b)=>s+(parseFloat(b.totalAmount)||0),0);var pending=bks.filter(b=>b.bookingStatus==='Pending').length;var confirmed=bks.filter(b=>b.bookingStatus==='Confirmed').length;var totalRev=bks.filter(b=>b.bookingStatus!=='Cancelled').reduce((s,b)=>s+(parseFloat(b.totalAmount)||0),0);document.getElementById('m-rev').textContent='\u09f3 '+fmt(mRev);document.getElementById('m-bk').textContent=bks.length;document.getElementById('m-pd').textContent=pending;document.getElementById('m-cf').textContent=confirmed;document.getElementById('m-rev-s').textContent='\u098f\u0987 \u09ae\u09be\u09b8: '+mBk.length+'\u099f\u09bf booking';document.getElementById('m-bk-s').textContent='\u09ae\u09cb\u099f: \u09f3 '+fmt(totalRev);document.getElementById('m-cf-s').textContent=bks.length?Math.round(confirmed\/bks.length*100)+'% confirm rate':'\u2014';document.getElementById('pb').textContent=pending;var pTotal=bks.filter(b=>b.bookingStatus!=='Cancelled').reduce((s,b)=>s+(parseFloat(b.totalAmount)||0),0);var pPend=bks.filter(b=>b.bookingStatus==='Pending').reduce((s,b)=>s+(parseFloat(b.totalAmount)||0),0);document.getElementById('p-total').textContent='\u09f3 '+fmt(pTotal);document.getElementById('p-pend').textContent='\u09f3 '+fmt(pPend);document.getElementById('p-canc').textContent=bks.filter(b=>b.bookingStatus==='Cancelled').length+'\u099f\u09bf';document.getElementById('pay-sub').textContent=bks.length+'\u099f\u09bf booking';document.getElementById('rev-total').textContent='\u09f3 '+fmt(pTotal);document.getElementById('rev-avg').textContent=bks.length?'\u09f3 '+fmt(pTotal\/bks.length):'\u2014';}\r\n\r\nfunction renderRecBk(){var el=document.getElementById('rec-bk');var list=visibleBookings.slice(-6).reverse();if(!list.length){el.innerHTML='<div class=\"empty\">\u0995\u09cb\u09a8\u09cb booking \u09a8\u09c7\u0987<\/div>';return;}var h='<table style=\"width:100%;border-collapse:collapse\"><thead><tr>';['Guest','Property','Status'].forEach(x=>h+='<th style=\"font-size:10px;color:var(--muted);text-align:left;padding:4px 0;border-bottom:1px solid var(--bd)\">'+x+'<\/th>');h+='<\/tr><\/thead><tbody>';list.forEach(b=>{h+='<tr onclick=\"openM(\\''+b.bookingId+'\\')\" style=\"cursor:pointer\">';h+='<td style=\"padding:7px 0;border-bottom:1px solid var(--bd)\"><div style=\"font-size:12px;font-weight:500;color:var(--navy)\">'+esc(b.guestName)+'<\/div><div style=\"font-size:10px;color:var(--muted)\">'+esc(b.bookingId)+'<\/div><\/td>';h+='<td style=\"padding:7px 0;border-bottom:1px solid var(--bd)\"><div style=\"font-size:11px;color:var(--muted)\">'+esc(b.assetName||'\u2014')+'<\/div>'+typeBadge(b.assetType)+'<\/td>';h+='<td style=\"padding:7px 0;border-bottom:1px solid var(--bd);text-align:right\">'+sBadge(b.bookingStatus)+'<\/td>';h+='<\/tr>';});el.innerHTML=h+'<\/tbody><\/table>';}\r\n\r\nfunction renderStatusBoxes(){var s={Confirmed:0,Pending:0,Cancelled:0,Completed:0};visibleBookings.forEach(b=>{if(s[b.bookingStatus]!==undefined)s[b.bookingStatus]++;});var colors={Confirmed:'background:var(--gbg);color:var(--gt)',Pending:'background:var(--abg);color:var(--at)',Cancelled:'background:var(--rbg);color:var(--rt)',Completed:'background:var(--bbg);color:var(--bt)'};var h='<div style=\"display:grid;grid-template-columns:1fr 1fr;gap:8px\">';Object.keys(s).forEach(k=>{h+='<div style=\"'+colors[k]+';padding:10px 12px;border-radius:8px;text-align:center\"><div style=\"font-size:18px;font-weight:700\">'+s[k]+'<\/div><div style=\"font-size:10px;margin-top:2px\">'+k+'<\/div><\/div>';});document.getElementById('status-boxes').innerHTML=h+'<\/div>';}\r\n\r\nfunction renderRecPay(){var el=document.getElementById('rec-pay');var list=visibleBookings.filter(b=>b.bookingStatus==='Confirmed'||b.bookingStatus==='Completed').slice(-4).reverse();if(!list.length){el.innerHTML='<div style=\"font-size:12px;color:var(--muted);text-align:center;padding:10px\">\u0995\u09cb\u09a8\u09cb payment \u09a8\u09c7\u0987<\/div>';return;}var h='';list.forEach(b=>{var ini=(b.guestName||'XX').split(' ').map(w=>w[0]).slice(0,2).join('').toUpperCase();var ps=b.paymentStatus||'Unpaid';h+='<div class=\"pr\"><div class=\"pav\">'+ini+'<\/div><div class=\"pi\"><div class=\"pn\">'+esc(b.guestName)+'<\/div><div class=\"pm\">'+esc(b.assetName||'')+'<\/div><\/div><div style=\"text-align:right\"><div class=\"pa\">\u09f3 '+fmt(b.totalAmount)+'<\/div>'+payBadge(ps)+'<\/div><\/div>';});el.innerHTML=h;}\r\n\r\nfunction renderTopAssets(){var el=document.getElementById('top-assets');var counts={};visibleBookings.filter(b=>b.bookingStatus!=='Cancelled').forEach(b=>{counts[b.assetName]=(counts[b.assetName]||0)+1;});var sorted=Object.keys(counts).sort((a,b)=>counts[b]-counts[a]).slice(0,8);var max=sorted.length?counts[sorted[0]]:1;var h='';sorted.forEach(name=>{var pct=Math.round(counts[name]\/max*100);h+='<div class=\"occ-row\"><div class=\"occ-lbl\">'+esc(name)+'<\/div><div class=\"occ-bg\"><div class=\"occ-fill\" style=\"width:'+pct+'%\"><\/div><\/div><div class=\"occ-pct\">'+counts[name]+'<\/div><\/div>';});el.innerHTML=h||'<div class=\"empty\">\u09a1\u09c7\u099f\u09be \u09a8\u09c7\u0987<\/div>';}\r\n\r\nfunction renderRevChart(){var el=document.getElementById('rev-chart');var now=new Date(),month=now.getMonth(),year=now.getFullYear();var wData=[0,0,0,0];visibleBookings.filter(b=>b.bookingStatus!=='Cancelled').forEach(b=>{var d=new Date(b.checkIn);if(d.getMonth()===month&&d.getFullYear()===year){var w=Math.min(3,Math.floor((d.getDate()-1)\/7));wData[w]+=parseFloat(b.totalAmount)||0;}});var max=Math.max(...wData)||1;var weeks=['\u09b8\u09aa\u09cd\u09a4\u09be\u09b9 \u09e7','\u09b8\u09aa\u09cd\u09a4\u09be\u09b9 \u09e8','\u09b8\u09aa\u09cd\u09a4\u09be\u09b9 \u09e9','\u09b8\u09aa\u09cd\u09a4\u09be\u09b9 \u09ea'];el.innerHTML=wData.map((v,i)=>'<div class=\"rev-col\"><div class=\"rev-bar\" style=\"height:'+(Math.round(v\/max*85)+5)+'%;background:'+(v===Math.max(...wData)?'var(--orange)':'#e2e8f0')+'\"><\/div><div class=\"rev-lbl\">'+weeks[i]+'<\/div><\/div>').join('');}\r\n\r\nfunction renderBkTable(list){var data=list||visibleBookings;var tbody=document.getElementById('bk-tbody');if(!data.length){tbody.innerHTML='<tr><td colspan=\"10\"><div class=\"empty\">\u0995\u09cb\u09a8\u09cb booking \u09a8\u09c7\u0987<\/div><\/td><\/tr>';return;}var h='';data.slice().reverse().forEach(b=>{var n=calcN(b.checkIn,b.checkOut);var ps=b.paymentStatus||'Unpaid';h+='<tr onclick=\"openM(\\''+b.bookingId+'\\')\">';h+='<td class=\"tb\">'+esc(b.bookingId)+'<\/td>';h+='<td><div style=\"font-weight:500\">'+esc(b.guestName)+'<\/div><div class=\"tm\">'+esc(b.phone||'')+'<\/div><\/td>';h+='<td><div>'+esc(b.assetName||'\u2014')+'<\/div>'+typeBadge(b.assetType)+'<\/td>';h+='<td class=\"tm\">'+esc((b.packageType||'\u2014').replace(' Package',''))+'<\/td>';h+='<td>'+esc(b.checkIn||'')+'<br><span class=\"tm\">\u2192 '+esc(b.checkOut||'')+'<\/span><\/td>';h+='<td style=\"text-align:center\">'+esc(b.persons||'\u2014')+'<br><span class=\"tm\">'+n+' \u09b0\u09be\u09a4<\/span><\/td>';h+='<td style=\"font-weight:600\">\u09f3 '+fmt(b.totalAmount)+'<\/td>';h+='<td>'+payBadge(ps)+'<\/td>';h+='<td>'+sBadge(b.bookingStatus)+'<\/td>';if(currentRole==='SuperAdmin'){h+='<td><select class=\"ss\" onclick=\"event.stopPropagation()\" onchange=\"updSt(\\''+b.bookingId+'\\',this.value)\">';['Confirmed','Pending','Completed','Cancelled'].forEach(s=>h+='<option value=\"'+s+'\"'+(b.bookingStatus===s?' selected':'')+'>'+sLbl(s)+'<\/option>');h+='<\/select><\/td>';}else h+='<td><span class=\"tm\">View only<\/span><\/td>';h+='<\/tr>';});tbody.innerHTML=h;}\r\n\r\nfunction renderPayTable(list){var data=list||visibleBookings;var tbody=document.getElementById('pay-tbody');if(!data.length){tbody.innerHTML='<tr><td colspan=\"10\"><div class=\"empty\">\u09a1\u09c7\u099f\u09be \u09a8\u09c7\u0987<\/div><\/td><\/tr>';return;}var h='';data.slice().reverse().forEach(b=>{var ps=b.paymentStatus||'Unpaid';h+='<tr onclick=\"openM(\\''+b.bookingId+'\\')\">';h+='<td class=\"tb\">'+esc(b.bookingId)+'<\/td>';h+='<td><div style=\"font-weight:500\">'+esc(b.guestName)+'<\/div><div class=\"tm\">'+esc(b.phone||'')+'<\/div><\/td>';h+='<td>'+esc(b.assetName||'\u2014')+'<\/td>';h+='<td>'+esc(b.checkIn||'\u2014')+'<\/td>';h+='<td>'+esc(b.checkOut||'\u2014')+'<\/td>';h+='<td style=\"text-align:center\">'+esc(b.persons||'\u2014')+'<\/td>';h+='<td style=\"text-align:center\">'+calcN(b.checkIn,b.checkOut)+'<\/td>';h+='<td style=\"font-weight:600;color:var(--gt)\">\u09f3 '+fmt(b.totalAmount)+'<\/td>';h+='<td>'+payBadge(ps)+'<\/td>';h+='<td>'+sBadge(b.bookingStatus)+'<\/td>';h+='<\/tr>';});tbody.innerHTML=h;}\r\n\r\nfunction populateCalDD(){var menu=document.getElementById('cal-dd-menu');var assets=[...new Set(visibleBookings.map(b=>b.assetName).filter(Boolean))].sort();menu.innerHTML='<div class=\"cal-dd-item '+(selCalAssetVal===''?'sel':'')+'\" onclick=\"selCalAsset(\\'\\',\\'All Properties\\')\">\ud83c\udfe0 All Properties<\/div>';assets.forEach(a=>{menu.innerHTML+='<div class=\"cal-dd-item '+(selCalAssetVal===a?'sel':'')+'\" onclick=\"selCalAsset(\\''+esc(a)+'\\',\\''+esc(a)+'\\')\">\ud83d\udccd '+esc(a)+'<\/div>';});}\r\n\r\nfunction togCalDD(){document.getElementById('cal-dd-menu').classList.toggle('open');}\r\nfunction selCalAsset(val,label){selCalAssetVal=val;document.getElementById('cal-dd-btn').textContent='\ud83c\udfe0 '+label+' \u25be';document.getElementById('cal-dd-menu').classList.remove('open');document.getElementById('cal-sub').textContent=label;renderCal();}\r\ndocument.addEventListener('click',function(e){if(!document.getElementById('cal-dd-wrap').contains(e.target))document.getElementById('cal-dd-menu').classList.remove('open');});\r\n\r\nfunction renderCal(){var months=['\u099c\u09be\u09a8\u09c1\u09af\u09bc\u09be\u09b0\u09bf','\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09af\u09bc\u09be\u09b0\u09bf','\u09ae\u09be\u09b0\u09cd\u099a','\u098f\u09aa\u09cd\u09b0\u09bf\u09b2','\u09ae\u09c7','\u099c\u09c1\u09a8','\u099c\u09c1\u09b2\u09be\u0987','\u0986\u0997\u09b8\u09cd\u099f','\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0','\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0','\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0','\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0'];var days=['\u09b0\u09ac\u09bf','\u09b8\u09cb\u09ae','\u09ae\u0999\u09cd\u0997\u09b2','\u09ac\u09c1\u09a7','\u09ac\u09c3\u09b9\u0983','\u09b6\u09c1\u0995\u09cd\u09b0','\u09b6\u09a8\u09bf'];document.getElementById('cal-lbl').textContent=months[calMonth]+' '+calYear;var firstDay=new Date(calYear,calMonth,1).getDay();var dInMonth=new Date(calYear,calMonth+1,0).getDate();var today=new Date();var bookedDays=new Set(),bMap={};visibleBookings.filter(b=>b.bookingStatus!=='Cancelled'&&(!selCalAssetVal||b.assetName===selCalAssetVal)).forEach(b=>{var col=typeColors[b.assetType]||'#888';var s=new Date(b.checkIn),e=new Date(b.checkOut);for(var d=new Date(s);d<=e;d.setDate(d.getDate()+1)){if(d.getMonth()===calMonth&&d.getFullYear()===calYear){var k=d.getDate();bookedDays.add(k);if(!bMap[k])bMap[k]=[];bMap[k].push({name:b.assetName,col,guest:b.guestName});}}});var h='<div class=\"cal-grid\">';days.forEach(d=>h+='<div class=\"cdh\">'+d+'<\/div>');for(var i=0;i<firstDay;i++)h+='<div class=\"cd om\"><\/div>';for(var day=1;day<=dInMonth;day++){var isT=today.getDate()===day&&today.getMonth()===calMonth&&today.getFullYear()===calYear;var isB=bookedDays.has(day);var cls='cd'+(isT?' td':'')+(isB?' booked':selCalAssetVal?' free':'');h+='<div class=\"'+cls+'\"><div class=\"cd-n\">'+day+'<\/div>';if(bMap[day]){bMap[day].slice(0,2).forEach(bk=>{h+='<div class=\"cbk\" style=\"background:'+bk.col+'\" title=\"'+esc(bk.name)+'\">'+esc(bk.name.split(' ')[0])+'<\/div>';});if(bMap[day].length>2)h+='<div style=\"font-size:8px;color:var(--muted)\">+'+(bMap[day].length-2)+'<\/div>';}h+='<\/div>';}h+='<\/div>';document.getElementById('cal-grid').innerHTML=h;}\r\n\r\nfunction prevM(){calMonth--;if(calMonth<0){calMonth=11;calYear--;}renderCal();}\r\nfunction nextM(){calMonth++;if(calMonth>11){calMonth=0;calYear++;}renderCal();}\r\n\r\nfunction renderAssetsTable(list){var data=list||allAssets;var tbody=document.getElementById('ast-tbody');if(!data.length){tbody.innerHTML='<tr><td colspan=\"6\"><div class=\"empty\">property \u09a8\u09c7\u0987<\/div><\/td><\/tr>';return;}var counts={};allBookings.forEach(b=>{counts[b.assetName]=(counts[b.assetName]||0)+1;});tbody.innerHTML=data.map(a=>'<tr><td class=\"tb\">'+esc(a.name)+'<\/td><td>'+typeBadge(a.type)+'<\/td><td class=\"tm\">'+esc(a.location||'\u2014')+'<\/td><td>'+(a.basePrice?'\u09f3 '+fmt(a.basePrice):'\u2014')+'<\/td><td style=\"text-align:center;font-weight:600\">'+(counts[a.name]||0)+'<\/td><td><span style=\"background:'+(a.status==='Active'?'var(--gbg)':'var(--rbg)')+';color:'+(a.status==='Active'?'var(--gt)':'var(--rt)')+';padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600\">'+esc(a.status||'Active')+'<\/span><\/td><\/tr>').join('');}\r\n\r\nfunction renderAnalytics(){var bks=visibleBookings;var counts={};bks.forEach(b=>{counts[b.assetName]=(counts[b.assetName]||0)+1;});var total=bks.length||1;var sorted=Object.keys(counts).sort((a,b)=>counts[b]-counts[a]);document.getElementById('all-occ').innerHTML=sorted.map(name=>{var pct=Math.round(counts[name]\/total*100);return'<div class=\"occ-row\"><div class=\"occ-lbl\">'+esc(name)+'<\/div><div class=\"occ-bg\"><div class=\"occ-fill\" style=\"width:'+pct+'%\"><\/div><\/div><div class=\"occ-pct\">'+pct+'%<\/div><\/div>';}).join('')||'<div class=\"empty\">\u09a1\u09c7\u099f\u09be \u09a8\u09c7\u0987<\/div>';var confirmed=bks.filter(b=>b.bookingStatus==='Confirmed').length;var cancelled=bks.filter(b=>b.bookingStatus==='Cancelled').length;var totalRev=bks.filter(b=>b.bookingStatus!=='Cancelled').reduce((s,b)=>s+(parseFloat(b.totalAmount)||0),0);var avgRev=bks.length?Math.round(totalRev\/bks.length):0;document.getElementById('key-stats').innerHTML=[['\u09f3 '+fmt(avgRev),'\u0997\u09a1\u09bc booking \u09ae\u09c2\u09b2\u09cd\u09af'],[bks.length?Math.round(confirmed\/bks.length*100)+'%':'\u2014','Confirmation Rate'],[bks.length?Math.round(cancelled\/bks.length*100)+'%':'\u2014','Cancellation Rate'],[allAssets.length,'Active Properties']].map(s=>'<div class=\"stat-box\"><div class=\"sb-val\">'+s[0]+'<\/div><div class=\"sb-lbl2\">'+s[1]+'<\/div><\/div>').join('');var types={Resort:0,Houseboat:0,Hotel:0};allAssets.forEach(a=>{if(types[a.type]!==undefined)types[a.type]++;});document.getElementById('type-chart').innerHTML='<div style=\"display:flex;flex-direction:column;gap:8px\">'+Object.keys(types).map(t=>{var pct=allAssets.length?Math.round(types[t]\/allAssets.length*100):0;return'<div class=\"occ-row\"><div class=\"occ-lbl\">'+t+'<\/div><div class=\"occ-bg\"><div class=\"occ-fill\" style=\"width:'+pct+'%;background:'+typeColors[t]+'\"><\/div><\/div><div class=\"occ-pct\">'+types[t]+'<\/div><\/div>';}).join('')+'<\/div>';}\r\n\r\nfunction populateFilters(){var assets=[...new Set(visibleBookings.map(b=>b.assetName).filter(Boolean))].sort();['bk-as','pay-as'].forEach(id=>{var sel=document.getElementById(id);if(!sel)return;var cur=sel.value;sel.innerHTML='<option value=\"\">\u09b8\u09ac Property<\/option>'+assets.map(a=>'<option value=\"'+esc(a)+'\">'+esc(a)+'<\/option>').join('');sel.value=cur;});}\r\n\r\nfunction filterBk(){var q=document.getElementById('bk-q').value.toLowerCase(),st=document.getElementById('bk-st').value,tp=document.getElementById('bk-tp').value,as=document.getElementById('bk-as').value;renderBkTable(visibleBookings.filter(b=>(!q||(b.guestName||'').toLowerCase().includes(q)||(b.bookingId||'').toLowerCase().includes(q)||(b.phone||'').includes(q))&&(!st||b.bookingStatus===st)&&(!tp||b.assetType===tp)&&(!as||b.assetName===as)));}\r\n\r\nfunction filterPay(){var q=document.getElementById('pay-q').value.toLowerCase(),st=document.getElementById('pay-st').value,ps=document.getElementById('pay-ps').value,as=document.getElementById('pay-as').value;renderPayTable(visibleBookings.filter(b=>(!q||(b.guestName||'').toLowerCase().includes(q)||(b.bookingId||'').toLowerCase().includes(q))&&(!st||b.bookingStatus===st)&&(!ps||(b.paymentStatus||'Unpaid')===ps)&&(!as||b.assetName===as)));}\r\n\r\nfunction filterAssets(){var q=document.getElementById('ast-q').value.toLowerCase(),tp=document.getElementById('ast-tp').value;renderAssetsTable(allAssets.filter(a=>(!q||(a.name||'').toLowerCase().includes(q)||(a.location||'').toLowerCase().includes(q))&&(!tp||a.type===tp)));}\r\n\r\nfunction filterByType(type){sv('bookings',null);document.getElementById('bk-tp').value=type;filterBk();}\r\n\r\nfunction populateAbAssets(){var sel=document.getElementById('ab-asset');var names=[...new Set([...allAssets.map(a=>a.name),...allBookings.map(b=>b.assetName)].filter(Boolean))].sort();sel.innerHTML='<option value=\"\">-- Property \u09ac\u09c7\u099b\u09c7 \u09a8\u09bf\u09a8 --<\/option>'+names.map(n=>{var a=allAssets.find(x=>x.name===n)||{};return'<option value=\"'+esc(n)+'\" data-type=\"'+(a.type||'')+'\" data-price=\"'+(a.basePrice||0)+'\">'+esc(n)+'<\/option>';}).join('');}\r\n\r\nfunction abUpdAsset(){var sel=document.getElementById('ab-asset');var opt=sel.options[sel.selectedIndex];document.getElementById('ab-type').value=opt.getAttribute('data-type')||'';var price=opt.getAttribute('data-price');if(price&&price!=='0')document.getElementById('ab-rate').value=price;abCalc();}\r\n\r\nfunction abCalc(){var ci=document.getElementById('ab-ci').value,co=document.getElementById('ab-co').value;var per=parseInt(document.getElementById('ab-per').value)||1;var rate=parseFloat(document.getElementById('ab-rate').value)||0;if(!ci||!co||!rate)return null;var n=Math.round((new Date(co)-new Date(ci))\/86400000);if(n<=0)return null;var sub=rate*per*n,svc=Math.round(sub*0.05),tot=sub+svc;document.getElementById('ab-r1').textContent='\u09f3 '+fmt(rate)+' \u00d7 '+per+' \u099c\u09a8 \u00d7 '+n+' \u09b0\u09be\u09a4';document.getElementById('ab-r2').textContent='\u09f3 '+fmt(sub);document.getElementById('ab-r3').textContent='\u09f3 '+fmt(svc);document.getElementById('ab-r4').textContent='\u09f3 '+fmt(tot);document.getElementById('ab-pp').classList.remove('hidden');return{n,per,sub,svc,tot};}\r\n\r\nfunction openAddBk(){document.getElementById('ab-form').style.display='block';document.getElementById('ab-ok').style.display='none';document.getElementById('ab-conflict').style.display='none';document.getElementById('ab-pp').classList.add('hidden');document.getElementById('add-bk-modal').classList.add('open');}\r\n\r\nfunction closeAddBk(){document.getElementById('add-bk-modal').classList.remove('open');['ab-name','ab-phone','ab-email','ab-pkg','ab-ci','ab-co','ab-notes','ab-rate'].forEach(id=>document.getElementById(id).value='');document.getElementById('ab-asset').value='';document.getElementById('ab-type').value='';document.getElementById('ab-per').value='2';loadData();}\r\n\r\nfunction submitAddBk(){var name=document.getElementById('ab-name').value.trim(),phone=document.getElementById('ab-phone').value.trim();var asset=document.getElementById('ab-asset').value,type=document.getElementById('ab-type').value;var pkg=document.getElementById('ab-pkg').value.trim();var ci=document.getElementById('ab-ci').value,co=document.getElementById('ab-co').value;var per=document.getElementById('ab-per').value,notes=document.getElementById('ab-notes').value;if(!name){alert('Guest Name \u09a6\u09bf\u09a8');return;}if(!phone||phone.length<10){alert('\u09b8\u09a0\u09bf\u0995 Phone \u09a6\u09bf\u09a8');return;}if(!asset){alert('Property \u09ac\u09c7\u099b\u09c7 \u09a8\u09bf\u09a8');return;}if(!ci||!co){alert('\u09a4\u09be\u09b0\u09bf\u0996 \u09a6\u09bf\u09a8');return;}var p=abCalc();if(!p){alert('\u09b8\u09a0\u09bf\u0995 \u09a4\u09be\u09b0\u09bf\u0996 \u0993 Rate \u09a6\u09bf\u09a8');return;}var bid='TV-'+new Date().getFullYear()+'-'+Math.floor(Math.random()*9000+1000);var btn=document.getElementById('ab-sub');btn.classList.add('loading');btn.disabled=true;document.getElementById('ab-conflict').style.display='none';var payload={action:'addBooking',bookingId:bid,timestamp:new Date().toISOString(),guestName:name,phone,email:document.getElementById('ab-email').value||'',assetName:asset,assetType:type,packageType:pkg||'Custom Booking',checkIn:ci,checkOut:co,persons:per,nights:p.n,totalAmount:p.tot,paymentStatus:'Unpaid',status:'Pending',notes,agentUsername:currentUsername};var params=Object.keys(payload).map(k=>encodeURIComponent(k)+'='+encodeURIComponent(payload[k])).join('&');fetch(SCRIPT_URL+'?'+params).then(r=>r.json()).then(d=>{btn.classList.remove('loading');btn.disabled=false;if(d.conflict){document.getElementById('ab-conflict').style.display='block';}else{document.getElementById('ab-bid').textContent=bid;document.getElementById('ab-form').style.display='none';document.getElementById('ab-ok').style.display='block';}}).catch(()=>{btn.classList.remove('loading');btn.disabled=false;alert('Error!');});}\r\n\r\nfunction openM(id){var b=visibleBookings.find(x=>x.bookingId===id);if(!b)return;document.getElementById('m-title').textContent=b.bookingId;document.getElementById('m-sub').textContent=b.assetName||'';var ps=b.paymentStatus||'Unpaid';var rows=[['Guest Name',b.guestName],['Phone',b.phone||'\u2014'],['Email',b.email||'\u2014'],['Property',b.assetName||'\u2014'],['Type',b.assetType||'\u2014'],['Package',(b.packageType||'\u2014').replace(' Package','')],['Check-in',b.checkIn||'\u2014'],['Check-out',b.checkOut||'\u2014'],['Nights',calcN(b.checkIn,b.checkOut)+' \u09b0\u09be\u09a4'],['Persons',(b.persons||'\u2014')+' \u099c\u09a8'],['Total Amount','\u09f3 '+fmt(b.totalAmount)],['Payment',''],['Booking Status',''],['Agent',b.agentUsername||'\u2014'],['Notes',b.notes||'\u2014']];var h='';rows.forEach(r=>{h+='<div class=\"mr\"><span class=\"ml\">'+r[0]+'<\/span>';if(r[0]==='Booking Status')h+='<span>'+sBadge(b.bookingStatus)+'<\/span>';else if(r[0]==='Payment')h+='<span>'+payBadge(ps)+'<\/span>';else h+='<span class=\"mv\">'+esc(r[1])+'<\/span>';h+='<\/div>';});document.getElementById('m-body').innerHTML=h;var acts='<button class=\"btn btn-outline\" onclick=\"closeM()\">\u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8<\/button>';if(currentRole==='SuperAdmin'){if(b.bookingStatus==='Pending')acts+='<button class=\"btn btn-green\" onclick=\"updSt(\\''+b.bookingId+'\\',\\'Confirmed\\');closeM()\">\u2713 Confirm<\/button>';if(b.bookingStatus!=='Cancelled')acts+='<button class=\"btn btn-red\" onclick=\"updSt(\\''+b.bookingId+'\\',\\'Cancelled\\');closeM()\">\u09ac\u09be\u09a4\u09bf\u09b2<\/button>';if(ps==='Unpaid'||ps==='Partial')acts+='<button class=\"btn btn-blue\" onclick=\"updPay(\\''+b.bookingId+'\\',\\'Paid\\');closeM()\">\ud83d\udcb0 Payment Confirm<\/button>';if(ps==='Paid')acts+='<button class=\"btn btn-outline\" onclick=\"updPay(\\''+b.bookingId+'\\',\\'Unpaid\\');closeM()\">Payment Undo<\/button>';}document.getElementById('m-actions').innerHTML=acts;document.getElementById('bk-modal').classList.add('open');}\r\n\r\nfunction closeM(){document.getElementById('bk-modal').classList.remove('open');}\r\n\r\nfunction updSt(id,newSt){var b=allBookings.find(x=>x.bookingId===id);if(!b)return;b.bookingStatus=newSt;var vb=visibleBookings.find(x=>x.bookingId===id);if(vb)vb.bookingStatus=newSt;renderAll();fetch(SCRIPT_URL+'?action=updateStatus&bookingId='+id+'&status='+newSt).catch(e=>console.error(e));}\r\n\r\nfunction updPay(id,newPs){var b=allBookings.find(x=>x.bookingId===id);if(!b)return;b.paymentStatus=newPs;var vb=visibleBookings.find(x=>x.bookingId===id);if(vb)vb.paymentStatus=newPs;renderAll();fetch(SCRIPT_URL+'?action=updatePayment&bookingId='+id+'&paymentStatus='+newPs).catch(e=>console.error(e));}\r\n\r\nfunction loadUsers(){fetch(SCRIPT_URL+'?action=getUsers').then(r=>r.json()).then(d=>{allUsers=d.users||[];renderUserList();document.getElementById('usr-sub').textContent=allUsers.length+'\u099c\u09a8 user';}).catch(()=>{document.getElementById('user-list-wrap').innerHTML='<div class=\"err\" style=\"display:block\">Users \u09b2\u09cb\u09a1 \u09b9\u09af\u09bc\u09a8\u09bf<\/div>';});}\r\n\r\nfunction renderUserList(){var wrap=document.getElementById('user-list-wrap');if(!allUsers.length){wrap.innerHTML='<div class=\"empty\">\u0995\u09cb\u09a8\u09cb user \u09a8\u09c7\u0987<\/div>';return;}var roleLabels={SuperAdmin:'\ud83d\udc51 Super Admin',AgentAdmin:'\ud83d\udee1 Agent Admin',B2B:'\ud83e\udd1d B2B Agent'};var roleBadgeClass={SuperAdmin:'role-super-badge',AgentAdmin:'role-agent-badge',B2B:'role-b2b-badge'};var avatarClass={SuperAdmin:'ua-super',AgentAdmin:'ua-agent',B2B:'ua-b2b'};var h='';allUsers.forEach(u=>{var ini=(u.username||'U').substring(0,2).toUpperCase();var isSuper=u.role==='SuperAdmin';h+='<div class=\"user-card\"><div class=\"user-avatar '+(avatarClass[u.role]||'ua-b2b')+'\">'+ini+'<\/div><div class=\"user-info\"><div class=\"user-name\">'+esc(u.username)+'<\/div><div class=\"user-meta\">Role: '+(roleLabels[u.role]||u.role)+'<\/div><\/div><span class=\"user-role-badge '+(roleBadgeClass[u.role]||'role-b2b-badge')+'\">'+(roleLabels[u.role]||u.role)+'<\/span>';if(!isSuper)h+='<div class=\"user-actions\"><button class=\"icon-btn\" onclick=\"deleteUser(\\''+esc(u.username)+'\\')\" title=\"Delete\">\ud83d\uddd1<\/button><\/div>';h+='<\/div>';});wrap.innerHTML=h;}\r\n\r\nfunction addNewUser(){var username=document.getElementById('nu-username').value.trim(),password=document.getElementById('nu-password').value.trim(),role=document.getElementById('nu-role').value;if(!username||!password){showUserMsg('Username \u0993 Password \u09a6\u09bf\u09a8','error');return;}if(username.length<4){showUserMsg('Username \u0995\u09ae\u09aa\u0995\u09cd\u09b7\u09c7 4 character','error');return;}if(password.length<6){showUserMsg('Password \u0995\u09ae\u09aa\u0995\u09cd\u09b7\u09c7 6 character','error');return;}var btn=document.getElementById('add-user-btn');btn.disabled=true;btn.textContent='\u09af\u09cb\u0997 \u09b9\u099a\u09cd\u099b\u09c7...';fetch(SCRIPT_URL+'?action=addUser&username='+encodeURIComponent(username)+'&password='+encodeURIComponent(password)+'&role='+encodeURIComponent(role)).then(r=>r.json()).then(d=>{btn.disabled=false;btn.textContent='+ Add User';if(d.success){showUserMsg('\u2705 '+username+' \u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09af\u09cb\u0997 \u09b9\u09af\u09bc\u09c7\u099b\u09c7!','success');document.getElementById('nu-username').value='';document.getElementById('nu-password').value='';loadUsers();}else showUserMsg('\u274c '+(d.error||'Error \u09b9\u09af\u09bc\u09c7\u099b\u09c7'),'error');}).catch(()=>{btn.disabled=false;btn.textContent='+ Add User';showUserMsg('\u274c Connection error','error');});}\r\n\r\nfunction showUserMsg(text,type){var el=document.getElementById('add-user-msg');el.textContent=text;el.style.display='block';el.style.background=type==='success'?'var(--gbg)':'var(--rbg)';el.style.color=type==='success'?'var(--gt)':'var(--rt)';setTimeout(()=>el.style.display='none',4000);}\r\n\r\nfunction deleteUser(username){if(!confirm(username+' \u0995\u09c7 delete \u0995\u09b0\u09ac\u09c7\u09a8?'))return;fetch(SCRIPT_URL+'?action=deleteUser&username='+encodeURIComponent(username)).then(r=>r.json()).then(d=>{if(d.success){showUserMsg('\u2705 '+username+' delete \u09b9\u09af\u09bc\u09c7\u099b\u09c7','success');loadUsers();}else showUserMsg('\u274c Delete \u09b9\u09af\u09bc\u09a8\u09bf','error');});}\r\n\r\nfunction exportCSV(){var h=['Booking ID','Guest Name','Phone','Email','Property','Type','Package','Check-In','Check-Out','Persons','Nights','Total Amount','Payment Status','Booking Status','Agent','Notes'];var rows=visibleBookings.map(b=>[b.bookingId,b.guestName,b.phone||'',b.email||'',b.assetName||'',b.assetType||'',b.packageType||'',b.checkIn||'',b.checkOut||'',b.persons||'',calcN(b.checkIn,b.checkOut),b.totalAmount||'',b.paymentStatus||'Unpaid',b.bookingStatus||'',b.agentUsername||'',b.notes||''].join(','));var a=document.createElement('a');a.href='data:text\/csv;charset=utf-8,\\uFEFF'+encodeURIComponent([h.join(',')].concat(rows).join('\\n'));a.download='tourvill-bookings.csv';a.click();}\r\n\r\nfunction fmt(n){return Math.round(parseFloat(n)||0).toLocaleString('en-IN');}\r\nfunction calcN(ci,co){if(!ci||!co)return'\u2014';var d=Math.round((new Date(co)-new Date(ci))\/86400000);return isNaN(d)||d<0?'\u2014':d;}\r\nfunction esc(s){return String(s||'').replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\"\/g,'&quot;');}\r\nfunction sBadge(s){var m={Confirmed:'<span class=\"badge bc\">Confirmed<\/span>',Pending:'<span class=\"badge bp\">Pending<\/span>',Cancelled:'<span class=\"badge br\">Cancelled<\/span>',Completed:'<span class=\"badge bb\">Completed<\/span>'};return m[s]||'<span class=\"badge\" style=\"background:var(--sf);color:var(--muted)\">'+esc(s)+'<\/span>';}\r\nfunction payBadge(s){var m={Paid:'<span class=\"pay-paid\">\u2713 Paid<\/span>',Unpaid:'<span class=\"pay-unpaid\">\u2717 Unpaid<\/span>',Partial:'<span class=\"pay-partial\">~ Partial<\/span>'};return m[s]||'<span class=\"pay-unpaid\">\u2717 Unpaid<\/span>';}\r\nfunction typeBadge(t){var m={Resort:'<span class=\"type-r\">Resort<\/span>',Houseboat:'<span class=\"type-h\">Houseboat<\/span>',Hotel:'<span class=\"type-o\">Hotel<\/span>'};return m[t]||'';}\r\nfunction sLbl(s){var m={Confirmed:'Confirm \u0995\u09b0\u09c1\u09a8',Pending:'Pending',Completed:'Completed',Cancelled:'\u09ac\u09be\u09a4\u09bf\u09b2'};return m[s]||s;}\r\n\r\nfunction sv(name,el){document.querySelectorAll('.view').forEach(v=>v.classList.remove('active'));document.getElementById('v-'+name).classList.add('active');if(el){document.querySelectorAll('.mi').forEach(m=>m.classList.remove('active'));el.classList.add('active');}if(window.innerWidth<=768){document.getElementById('sidebar').classList.remove('open');document.getElementById('sob').classList.remove('open');}if(name==='users'&&currentRole==='SuperAdmin')loadUsers();if(name==='propmanager'&&currentRole==='SuperAdmin')pmLoad();}\r\n\r\nfunction togSB(){document.getElementById('sidebar').classList.toggle('open');document.getElementById('sob').classList.toggle('open');}\r\n\r\ndocument.getElementById('bk-modal').addEventListener('click',function(e){if(e.target===this)closeM();});\r\ndocument.getElementById('add-bk-modal').addEventListener('click',function(e){if(e.target===this)closeAddBk();});\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ \u2605 PROPERTY MANAGER \u2014 \u09a8\u09a4\u09c1\u09a8 system\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nvar PM_API='https:\/\/script.google.com\/macros\/s\/AKfycbzJB0prAF2to6k6xzTtMcKDAhG7YpyPR-Za6ovs3GdUvv5R9Xzi3DQzM_kyF2MEVof6\/exec';\r\nvar pmAllProps=[],pmSelectedCats=[],pmEditingRow=null,pmDeletingRow=null;\r\n\r\nfunction pmApiCall(params){return new Promise(function(resolve,reject){var cb='pmcb_'+Date.now()+'_'+Math.floor(Math.random()*99999);var url=PM_API+'?'+new URLSearchParams(params).toString()+'&callback='+cb;var timer=setTimeout(function(){delete window[cb];reject(new Error('Timeout'));},30000);window[cb]=function(data){clearTimeout(timer);resolve(data);delete window[cb];var el=document.getElementById(cb);if(el)el.remove();};var s=document.createElement('script');s.id=cb;s.src=url;s.onerror=function(){clearTimeout(timer);delete window[cb];reject(new Error('Error'));};document.head.appendChild(s);});}\r\n\r\nfunction pmLoad(){document.getElementById('pm-tbody').innerHTML='<tr><td colspan=\"5\"><div class=\"lr\"><span class=\"sp\"><\/span>Loading...<\/div><\/td><\/tr>';pmApiCall({action:'getAll'}).then(function(res){pmAllProps=res.data||[];pmUpdateStats();pmRenderTable(pmAllProps);document.getElementById('pm-sub').textContent=pmAllProps.length+'\u099f\u09bf property';}).catch(function(){document.getElementById('pm-tbody').innerHTML='<tr><td colspan=\"5\"><div class=\"empty\">\u26a0 Load \u09b9\u09af\u09bc\u09a8\u09bf\u0964<\/div><\/td><\/tr>';});}\r\n\r\nfunction pmUpdateStats(){document.getElementById('pm-s-total').textContent=pmAllProps.length;document.getElementById('pm-s-our').textContent=pmAllProps.filter(function(p){return p.Category&&p.Category.indexOf('Our Property')!==-1;}).length;document.getElementById('pm-s-popular').textContent=pmAllProps.filter(function(p){return p.Category&&p.Category.indexOf('Popular')!==-1;}).length;document.getElementById('pm-s-hot').textContent=pmAllProps.filter(function(p){return p.Category&&p.Category.indexOf('Hot')!==-1;}).length;}\r\n\r\nfunction pmRenderTable(data){var tbody=document.getElementById('pm-tbody');if(!data.length){tbody.innerHTML='<tr><td colspan=\"5\"><div class=\"empty\">\u0995\u09cb\u09a8\u09cb property \u09a8\u09c7\u0987\u0964 Add \u0995\u09b0\u09c1\u09a8!<\/div><\/td><\/tr>';return;}tbody.innerHTML=data.map(function(p){var cats=(p.Category||'').split(',').filter(Boolean);var catHtml=cats.map(function(c){c=c.trim();var style=c==='Our Property'?'background:#ede9fe;color:#6d28d9':c==='Popular'?'background:#fef3c7;color:#d97706':'background:#fee2e2;color:#dc2626';return'<span style=\"'+style+';padding:2px 8px;border-radius:20px;font-size:10px;font-weight:700;text-transform:uppercase;margin:2px;display:inline-block\">'+c+'<\/span>';}).join('');var imgHtml=p.Image_URL?'<img decoding=\"async\" src=\"'+p.Image_URL+'\" style=\"width:48px;height:36px;object-fit:cover;border-radius:6px\" onerror=\"this.parentElement.textContent=\\'\ud83c\udfe0\\'\">':'<span style=\"font-size:18px\">\ud83c\udfe0<\/span>';var wpLink=p.Info_Link?'<a href=\"'+p.Info_Link+'\" target=\"_blank\" style=\"color:#1a56db;font-size:12px;font-weight:600\">\ud83d\udd17 View Page<\/a>':'<span style=\"color:var(--muted);font-size:11px\">Not created yet<\/span>';return'<tr><td style=\"width:60px\"><div style=\"width:48px;height:36px;border-radius:6px;overflow:hidden;background:#dbeafe;display:flex;align-items:center;justify-content:center\">'+imgHtml+'<\/div><\/td><td><div style=\"font-weight:600;font-size:13px\">'+esc(p.Name||'\u2014')+'<\/div><div style=\"font-size:11px;color:var(--muted);margin-top:2px\">\ud83d\udccd '+esc(p.Location||'\u2014')+'<\/div><\/td><td>'+catHtml+'<\/td><td>'+wpLink+'<\/td><td><div style=\"display:flex;gap:6px\"><button class=\"btn btn-outline\" style=\"font-size:11px;padding:5px 10px\" onclick=\"pmOpenEdit('+p.rowIndex+')\">Edit<\/button><button class=\"btn btn-red\" style=\"font-size:11px;padding:5px 10px\" onclick=\"pmOpenDelete('+p.rowIndex+')\">Delete<\/button><\/div><\/td><\/tr>';}).join('');}\r\n\r\nfunction pmFilter(cat,el){['pmf-all','pmf-our','pmf-popular','pmf-hot'].forEach(function(id){var b=document.getElementById(id);if(b)b.className='btn btn-outline';});el.className='btn btn-orange';pmRenderTable(cat==='all'?pmAllProps:pmAllProps.filter(function(p){return p.Category&&p.Category.indexOf(cat)!==-1;}));}\r\n\r\nfunction pmToggleCat(el,val){var isSel=el.classList.contains('sel');if(isSel){el.classList.remove('sel');pmSelectedCats=pmSelectedCats.filter(function(c){return c!==val;});}else{el.classList.add('sel');if(pmSelectedCats.indexOf(val)===-1)pmSelectedCats.push(val);}}\r\n\r\nfunction pmSetCats(catString){pmSelectedCats=[];document.querySelectorAll('.pm-cat-chip').forEach(function(el){el.classList.remove('sel');});if(!catString)return;catString.split(',').forEach(function(c){var v=c.trim();if(!v)return;pmSelectedCats.push(v);var id=v==='Our Property'?'pm-cc-our':v==='Popular'?'pm-cc-popular':'pm-cc-hot';var el=document.getElementById(id);if(el)el.classList.add('sel');});}\r\n\r\nfunction pmAddKP(val){var list=document.getElementById('pm-kp-list');var row=document.createElement('div');row.style.cssText='display:flex;gap:8px;align-items:center';row.innerHTML='<input type=\"text\" placeholder=\"e.g. Sea view\" value=\"'+(val||'')+'\" style=\"flex:1;border:1.5px solid var(--bd);border-radius:var(--rsm);padding:9px 12px;font-family:\\'Sora\\',sans-serif;font-size:13px;outline:none;color:var(--text)\"><button onclick=\"pmRemoveKP(this)\" style=\"width:30px;height:30px;border:1.5px solid var(--bd);border-radius:6px;background:transparent;cursor:pointer;font-size:13px;flex-shrink:0\">\u2715<\/button>';list.appendChild(row);}\r\n\r\nfunction pmRemoveKP(btn){var list=document.getElementById('pm-kp-list');if(list.children.length>1)btn.parentElement.remove();else btn.previousElementSibling.value='';}\r\n\r\nfunction pmGetKPs(){return Array.from(document.querySelectorAll('#pm-kp-list input')).map(function(i){return i.value.trim();}).filter(Boolean).join('|');}\r\n\r\nfunction pmSetKPs(str){var list=document.getElementById('pm-kp-list');list.innerHTML='';var points=(str||'').split('|').filter(Boolean);if(!points.length)points=[''];points.forEach(function(p){pmAddKP(p);});}\r\n\r\nfunction pmPreviewImg(){var url=document.getElementById('pm-image').value.trim();var prev=document.getElementById('pm-img-preview');prev.innerHTML=url?'<img decoding=\"async\" src=\"'+url+'\" style=\"width:100%;height:100%;object-fit:cover\" onerror=\"this.parentElement.innerHTML=\\'Invalid URL\\'\">':'Image preview';}\r\n\r\nfunction pmOpenAdd(){pmEditingRow=null;document.getElementById('pm-modal-title').textContent='Add New Property';document.getElementById('pm-save-text').textContent='Save & Create Page';pmClearForm();document.getElementById('pm-msg').style.display='none';document.getElementById('pm-modal').classList.add('open');}\r\n\r\nfunction pmOpenEdit(rowIndex){var p=pmAllProps.find(function(x){return x.rowIndex===rowIndex;});if(!p)return;pmEditingRow=rowIndex;document.getElementById('pm-modal-title').textContent='Edit Property';document.getElementById('pm-save-text').textContent='Update Property';document.getElementById('pm-name').value=p.Name||'';document.getElementById('pm-location').value=p.Location||'';document.getElementById('pm-image').value=p.Image_URL||'';document.getElementById('pm-h1').value=p.H1||'';document.getElementById('pm-desc').value=p.Description||'';pmSetCats(p.Category||'');pmSetKPs(p.KeyPoints||'');pmPreviewImg();document.getElementById('pm-msg').style.display='none';document.getElementById('pm-modal').classList.add('open');}\r\n\r\nfunction pmSave(){var name=document.getElementById('pm-name').value.trim(),location=document.getElementById('pm-location').value;if(!name){pmShowMsg('\u26a0 Property Name \u09a6\u09bf\u09a8','error');return;}if(!location){pmShowMsg('\u26a0 Location select \u0995\u09b0\u09c1\u09a8','error');return;}if(!pmSelectedCats.length){pmShowMsg('\u26a0 \u0995\u09ae\u09aa\u0995\u09cd\u09b7\u09c7 \u098f\u0995\u099f\u09be category select \u0995\u09b0\u09c1\u09a8','error');return;}var btn=document.getElementById('pm-save-btn');document.getElementById('pm-spin').style.display='block';document.getElementById('pm-save-text').textContent='\u23f3 Creating...';btn.disabled=true;var params={action:pmEditingRow?'edit':'add',Name:name,Location:location,Image_URL:document.getElementById('pm-image').value.trim(),Category:pmSelectedCats.join(','),Booking_Link:'https:\/\/wa.me\/8801891120929?text='+encodeURIComponent('I want to book: '+name),H1:document.getElementById('pm-h1').value.trim()||name,Description:document.getElementById('pm-desc').value.trim(),KeyPoints:pmGetKPs()};if(pmEditingRow)params.rowIndex=pmEditingRow;pmApiCall(params).then(function(res){if(res.status==='success'){pmCloseModal();pmLoad();pmShowToast(pmEditingRow?'\u2705 Property updated!':'\u2705 Property added & page created!');}else pmShowMsg('\u274c '+(res.message||'Error'),'error');}).catch(function(e){pmShowMsg('\u274c '+e.message,'error');}).finally(function(){document.getElementById('pm-spin').style.display='none';document.getElementById('pm-save-text').textContent=pmEditingRow?'Update Property':'Save & Create Page';btn.disabled=false;});}\r\n\r\nfunction pmOpenDelete(rowIndex){pmDeletingRow=rowIndex;document.getElementById('pm-del-modal').classList.add('open');}\r\n\r\nfunction pmConfirmDelete(){pmApiCall({action:'delete',rowIndex:pmDeletingRow}).then(function(){document.getElementById('pm-del-modal').classList.remove('open');pmLoad();pmShowToast('\ud83d\uddd1\ufe0f Property deleted!');}).catch(function(){pmShowToast('\u274c Delete \u09b9\u09af\u09bc\u09a8\u09bf');});}\r\n\r\nfunction pmClearForm(){['pm-name','pm-image','pm-h1','pm-desc'].forEach(function(id){document.getElementById(id).value='';});document.getElementById('pm-location').value='';document.getElementById('pm-img-preview').innerHTML='Image preview';pmSetCats('');pmSetKPs('');pmSelectedCats=[];}\r\n\r\nfunction pmCloseModal(){document.getElementById('pm-modal').classList.remove('open');}\r\n\r\nfunction pmShowMsg(msg,type){var el=document.getElementById('pm-msg');el.textContent=msg;el.style.display='block';el.style.background=type==='error'?'var(--rbg)':'var(--gbg)';el.style.color=type==='error'?'var(--rt)':'var(--gt)';}\r\n\r\nfunction pmShowToast(msg){var t=document.createElement('div');t.textContent=msg;t.style.cssText='position:fixed;bottom:24px;right:24px;background:var(--navy);color:#fff;padding:12px 20px;border-radius:10px;font-size:13px;font-weight:600;z-index:999;box-shadow:0 4px 20px rgba(0,0,0,.2)';document.body.appendChild(t);setTimeout(function(){t.style.opacity='0';t.style.transition='opacity .3s';setTimeout(function(){t.remove();},300);},3000);}\r\n\r\ndocument.getElementById('pm-modal').addEventListener('click',function(e){if(e.target===this)pmCloseModal();});\r\ndocument.getElementById('pm-del-modal').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open');});\r\n<\/script>\r\n<\/body>\r\n<\/html>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>TourVill \u2014 Central PMS TourVill \u2014 Central PMS TourVill PMS Central Property Management System \u274c Username \u09ac\u09be Password \u09ad\u09c1\u09b2! Username Password Login \u0995\u09b0\u09c1\u09a8 TourVill \u2014 Authorized Personnel Only TourVillCentral PMS \u09b8\u09bf\u0999\u09cd\u0995 \u09b9\u09af\u09bc\u09a8\u09bf \u21bb \u09b0\u09bf\u09ab\u09cd\u09b0\u09c7\u09b6 Admin Logout Main Overview \u09b8\u09ac Booking 0 Revenue Calendar Properties 0 Analytics User Management Property Manager Filter by Type Resorts Houseboats [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-969","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tourvill.com\/index.php\/wp-json\/wp\/v2\/pages\/969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tourvill.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tourvill.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tourvill.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tourvill.com\/index.php\/wp-json\/wp\/v2\/comments?post=969"}],"version-history":[{"count":37,"href":"https:\/\/tourvill.com\/index.php\/wp-json\/wp\/v2\/pages\/969\/revisions"}],"predecessor-version":[{"id":1448,"href":"https:\/\/tourvill.com\/index.php\/wp-json\/wp\/v2\/pages\/969\/revisions\/1448"}],"wp:attachment":[{"href":"https:\/\/tourvill.com\/index.php\/wp-json\/wp\/v2\/media?parent=969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}