{"id":255,"date":"2021-03-03T04:30:46","date_gmt":"2021-03-03T04:30:46","guid":{"rendered":"https:\/\/trubianvillage.com\/researchcenter\/home\/"},"modified":"2026-08-01T23:11:20","modified_gmt":"2026-08-01T23:11:20","slug":"home","status":"publish","type":"page","link":"https:\/\/trubianvillage.com\/researchcenter\/","title":{"rendered":"Home"},"content":{"rendered":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>People of the Record Ancestral Research Center<\/title>\n<style>\n:root{\n  --green:#173a2d;\n  --green2:#2f654e;\n  --gold:#b8893b;\n  --cream:#f5efe2;\n  --paper:#fffdf8;\n  --ink:#1f2924;\n  --muted:#67726c;\n  --line:#d9cfbd;\n  --red:#9e3131;\n  --shadow:0 12px 28px rgba(21,42,31,.12);\n}\n*{box-sizing:border-box}\nbody{margin:0;font-family:Georgia,\"Times New Roman\",serif;background:var(--cream);color:var(--ink)}\nbutton,input,select,textarea{font:inherit}\nbutton{cursor:pointer}\n.hidden{display:none!important}\n.topbar{position:sticky;top:0;z-index:20;background:var(--green);color:#fff;padding:14px 5vw;display:flex;justify-content:space-between;align-items:center;gap:18px;box-shadow:0 4px 16px rgba(0,0,0,.2)}\n.brand{font-weight:700}\n.nav{display:flex;gap:8px;flex-wrap:wrap}\n.nav button{border:0;background:transparent;color:#fff;padding:8px 10px;border-radius:8px}\n.nav button:hover{background:rgba(255,255,255,.12)}\n.hero{padding:82px 7vw;background:linear-gradient(135deg,#142f24,#315b49);color:#fff;display:grid;grid-template-columns:1.4fr .8fr;gap:32px;align-items:center}\n.hero h1{font-size:clamp(2.5rem,6vw,5rem);line-height:.98;margin:0 0 20px}\n.hero p{font-size:1.15rem;line-height:1.7;max-width:760px}\n.hero-card{background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.25);padding:24px;border-radius:18px}\n.section{padding:58px 6vw}\n.section h2{font-size:2.25rem;margin:0 0 12px}\n.lead{color:var(--muted);max-width:900px;line-height:1.7}\n.grid{display:grid;gap:20px}\n.three{grid-template-columns:repeat(3,1fr)}\n.card,.panel{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:22px;box-shadow:var(--shadow)}\n.price{font-size:2.35rem;font-weight:700;color:var(--green2)}\n.btn{border:0;border-radius:9px;padding:11px 17px;background:var(--green2);color:#fff;font-weight:700}\n.btn.alt{background:#fff;color:var(--green);border:1px solid var(--green)}\n.btn.gold{background:var(--gold)}\n.btn.red{background:var(--red)}\n.btn.ghost{background:transparent;border:1px solid var(--green2);color:var(--green2)}\n.notice{padding:13px;border-radius:9px;background:#fff4d5;border:1px solid #e4c76e;margin:12px 0}\n.success{padding:13px;border-radius:9px;background:#e7f5ec;border:1px solid #9dc9ad;color:#195c38;margin:12px 0}\n.warning{color:#8d2b2b;font-weight:700}\n.searchrow{display:grid;grid-template-columns:2fr 1fr 1fr auto;gap:10px}\ninput,select,textarea{width:100%;padding:10px 11px;border:1px solid #cfc4b3;border-radius:8px;background:#fff}\ntextarea{min-height:100px;resize:vertical}\nlabel{display:block;font-weight:700;margin-bottom:6px}\n.results{display:grid;gap:12px;margin-top:18px}\n.result{background:#fff;border:1px solid var(--line);border-left:5px solid var(--gold);padding:15px;border-radius:11px}\n.badge{display:inline-block;font-size:.78rem;padding:4px 8px;border-radius:999px;background:#e7f1eb;color:#214c39;margin:0 5px 5px 0}\n.loginwrap{min-height:72vh;display:grid;place-items:center;padding:35px}\n.loginbox{max-width:430px;width:100%}\n.dashboard{display:grid;grid-template-columns:250px 1fr;min-height:760px}\n.side{background:#122b21;color:#fff;padding:23px}\n.side h3{margin-top:0}\n.side button{width:100%;border:0;background:transparent;color:#fff;text-align:left;padding:10px;border-radius:7px;margin:3px 0}\n.side button:hover,.side button.active{background:#294838}\n.workspace{padding:27px;background:#f7f2e8}\n.formgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:13px}\n.full{grid-column:1\/-1}\n.kpis{display:grid;grid-template-columns:repeat(6,1fr);gap:12px}\n.kpi{background:#fff;border:1px solid var(--line);border-radius:13px;padding:17px}\n.kpi strong{display:block;font-size:1.8rem;color:var(--green2)}\ntable{width:100%;border-collapse:collapse}\nth,td{text-align:left;padding:10px;border-bottom:1px solid #e5ddcf;vertical-align:top}\nth{background:#f0eadf}\n.audio-controls{display:flex;gap:9px;flex-wrap:wrap}\n.offer{max-width:880px;margin:0 auto;background:linear-gradient(145deg,#fffdf8,#f4ead4);border:2px solid var(--gold);text-align:center}\n.offer .price{font-size:4.3rem;line-height:1;margin:18px 0 8px}.once{font:800 .78rem Arial,sans-serif;letter-spacing:.14em;text-transform:uppercase;color:var(--green2)}\n.access-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;text-align:left;margin:22px 0}.access-item{padding:14px;border-radius:10px;background:#fff;border:1px solid var(--line)}\n.checkout{margin-top:22px;padding:20px;border-radius:13px;background:#f3f8f5;text-align:left}.fine{font:0.82rem\/1.55 Arial,sans-serif;color:var(--muted)}\n.commission{display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:end}.commission-output{padding:16px;border-radius:12px;background:#e7f5ec;border:1px solid #9dc9ad}\n.backup-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}\n.backup-card{border:1px solid var(--line);border-radius:14px;padding:18px;background:#fff}\n.footer{padding:30px 6vw;background:#10261d;color:#e9f0ec}\n@media(max-width:950px){\n  .hero{grid-template-columns:1fr}\n  .three,.kpis{grid-template-columns:1fr 1fr}\n  .dashboard{grid-template-columns:1fr}\n  .searchrow,.formgrid,.backup-grid{grid-template-columns:1fr}\n  .commission{grid-template-columns:1fr}\n}\n@media(max-width:620px){\n  .three,.kpis,.access-grid{grid-template-columns:1fr}\n  .topbar{align-items:flex-start;flex-direction:column}\n}\n<\/style>\n<\/head>\n<body>\n\n<header class=\"topbar\">\n  <div class=\"brand\">People of the Record Ancestral Research Center<\/div>\n  <nav class=\"nav\">\n    <button onclick=\"showPublic('home')\">Home<\/button>\n    <button onclick=\"showPublic('plans')\">$25 Registration<\/button>\n    <button onclick=\"showPublic('academy')\">Audio Introduction<\/button>\n    <button onclick=\"showPublic('search')\">Archive Search<\/button>\n    <button onclick=\"showMemberLogin()\">Member Login<\/button>\n    <button onclick=\"showLogin()\">Administration<\/button>\n  <\/nav>\n<\/header>\n\n<main id=\"publicApp\">\n  <section id=\"homeView\">\n    <div class=\"hero\">\n      <div>\n        <span class=\"badge\">Genealogy \u2022 Archive \u2022 Registry \u2022 Research<\/span>\n        <h1>Preserve the Record. Reconnect the Family.<\/h1>\n        <p>A unified ancestral research platform for historical documents, family trees, member registry, professional genealogy, audio education, searchable names, and protected family records. Register once for $25 and receive complete member access without monthly membership charges.<\/p>\n        <button class=\"btn gold\" onclick=\"showPublic('academy')\">Hear the Introduction<\/button>\n        <button class=\"btn alt\" onclick=\"showPublic('plans')\">See Everything Included<\/button>\n      <\/div>\n      <div class=\"hero-card\">\n        <h3>One Payment. Complete Access.<\/h3>\n        <div class=\"price\" style=\"color:#f2cf84\">$25<\/div>\n        <p>One-time registration and portal setup. No monthly membership subscription. Listen to the complete introduction before deciding.<\/p>\n      <\/div>\n    <\/div>\n    <section class=\"section\">\n      <h2>One Unified Research System<\/h2>\n      <p class=\"lead\">The platform combines indexed historical records, family trees, document vaults, research alerts, registry review, professional research services, and protected administration. Every registered member receives the complete collection of member tools.<\/p>\n      <div class=\"grid three\">\n        <div class=\"card\"><h3>Historical Depository<\/h3><p>Index census, military, probate, land, vital, church, court, newspaper, tribal, and family records.<\/p><\/div>\n        <div class=\"card\"><h3>Family and Registry<\/h3><p>Connect members, evidence, ancestral lines, document vaults, and registry applications.<\/p><\/div>\n        <div class=\"card\"><h3>Researcher Marketplace<\/h3><p>Qualified members may offer genealogy services. Researchers choose their service prices, and 10% of each completed service charge supports the platform.<\/p><\/div>\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <section id=\"plansView\" class=\"section hidden\">\n    <div class=\"card offer\">\n      <p class=\"once\">One-time registration and portal setup<\/p>\n      <div class=\"price\" id=\"pricePublicRegistration\">$25.00<\/div>\n      <p><strong>Pay once. Receive complete member access.<\/strong><br>No monthly or yearly membership subscription.<\/p>\n      <div class=\"access-grid\">\n        <div class=\"access-item\"><b>Unified Archive Search<\/b><br>Census, military, land, vital, court, church, tribal, newspaper, family, and other indexed records.<\/div>\n        <div class=\"access-item\"><b>Family Tree and Timeline<\/b><br>Build family lines, organize relationships, preserve events, and connect supporting evidence.<\/div>\n        <div class=\"access-item\"><b>Document Vault and Uploads<\/b><br>Organize family documents, photographs, oral-history notes, research files, and record citations.<\/div>\n        <div class=\"access-item\"><b>Record-Match Alerts<\/b><br>Receive possible matches across the archive, uploaded records, and participating family trees.<\/div>\n        <div class=\"access-item\"><b>Audio Research Academy<\/b><br>Use the read-along audio lessons and genealogy orientation library.<\/div>\n        <div class=\"access-item\"><b>People of the Record Registry<\/b><br>Submit family evidence for authorized human review and preserve the documented record.<\/div>\n        <div class=\"access-item\"><b>Professional Research Marketplace<\/b><br>Hire a researcher or apply to offer research services through the platform.<\/div>\n        <div class=\"access-item\"><b>Research Notebook and Saved Work<\/b><br>Save searches, organize findings, prepare reports, and continue research over time.<\/div>\n      <\/div>\n      <button class=\"btn alt\" onclick=\"showPublic('academy')\">Listen Before You Register<\/button>\n      <div class=\"checkout\">\n        <h3>Register for Complete Access<\/h3>\n        <div class=\"formgrid\">\n          <div><label>Full name<\/label><input id=\"registrationName\" autocomplete=\"name\"><\/div>\n          <div><label>Email<\/label><input id=\"registrationEmail\" type=\"email\" autocomplete=\"email\"><\/div>\n          <div><label>Create username<\/label><input id=\"registrationUsername\" autocomplete=\"username\"><\/div>\n          <div><label>Create password<\/label><input id=\"registrationPassword\" type=\"password\" autocomplete=\"new-password\"><\/div>\n          <div><label>Family line or research interest<\/label><input id=\"registrationFamily\"><\/div>\n          <div><label>Fee-waiver code, if provided<\/label><input id=\"registrationWaiver\"><\/div>\n        <\/div>\n        <label style=\"font-weight:400\"><input id=\"registrationTerms\" type=\"checkbox\" style=\"width:auto\"> I understand that $25 is a one-time registration and portal-setup fee, professional research services are separately priced by independent researchers, and 10% of each marketplace service charge goes to the platform.<\/label>\n        <button class=\"btn gold\" style=\"margin-top:14px\" onclick=\"beginRegistration()\">Continue to $25 Secure Payment<\/button>\n        <div id=\"registrationResult\"><\/div>\n        <p class=\"fine\">Production note: enter your approved PayPal or Stripe checkout address in Administration \u2192 Program Settings. The preview confirmation is provided only for testing the registration workflow.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"panel\" style=\"margin-top:22px\">\n      <h2>Offer Research Services<\/h2>\n      <p class=\"lead\">Registered members may apply for a researcher profile. Researchers set their own prices. The platform retains 10% of each completed service charge, and the researcher receives 90%, before any separate payment-processor fees or applicable taxes.<\/p>\n      <div class=\"commission\">\n        <div><label>Example service price<\/label><input id=\"commissionPrice\" type=\"number\" min=\"0\" step=\"0.01\" value=\"100\"><\/div>\n        <button class=\"btn\" onclick=\"calculateCommission()\">Calculate<\/button>\n        <div id=\"commissionResult\" class=\"commission-output\">At $100.00: researcher $90.00 \u2022 platform $10.00<\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section id=\"academyView\" class=\"section hidden\">\n    <h2>Free Audio Introduction Before Registration<\/h2>\n    <p class=\"lead\">Listen before paying. The introduction explains what the $25 one-time payment covers, what complete portal access includes, how family and record research works, and how the professional researcher marketplace shares 10% with the platform. The transcript remains visible for read-along access.<\/p>\n    <div class=\"panel\">\n      <label>Episode<\/label>\n      <select id=\"episodeSelect\" onchange=\"loadEpisode()\"><\/select>\n      <div class=\"audio-controls\" style=\"margin:15px 0\">\n        <button class=\"btn\" onclick=\"playEpisode()\">Play<\/button>\n        <button class=\"btn alt\" onclick=\"pauseEpisode()\">Pause or Resume<\/button>\n        <button class=\"btn red\" onclick=\"stopEpisode()\">Stop<\/button>\n        <select id=\"speechRate\" style=\"max-width:150px\"><option value=\"0.8\">0.8\u00d7<\/option><option value=\"1\" selected>1\u00d7<\/option><option value=\"1.2\">1.2\u00d7<\/option><option value=\"1.5\">1.5\u00d7<\/option><\/select>\n      <\/div>\n      <h3 id=\"episodeTitle\"><\/h3>\n      <div id=\"episodeTranscript\" class=\"result\"><\/div>\n    <\/div>\n  <\/section>\n\n  <section id=\"searchView\" class=\"section hidden\">\n    <h2>Search the Internal Archive<\/h2>\n    <div class=\"panel\">\n      <div class=\"searchrow\">\n        <input id=\"publicSearchQuery\" placeholder=\"Name, place, collection, or keyword\">\n        <input id=\"publicSearchYear\" placeholder=\"Year\">\n        <select id=\"publicSearchCategory\"><\/select>\n        <button class=\"btn\" onclick=\"runPublicSearch()\">Search<\/button>\n      <\/div>\n      <div id=\"publicSearchResults\" class=\"results\"><\/div>\n    <\/div>\n  <\/section>\n<\/main>\n\n<section id=\"memberLoginView\" class=\"loginwrap hidden\">\n  <div class=\"card loginbox\">\n    <h2>Member Portal Login<\/h2>\n    <p class=\"lead\">Active members receive complete portal access after the one-time registration and setup payment.<\/p>\n    <label>Username<\/label><input id=\"memberUsername\" autocomplete=\"username\">\n    <label style=\"margin-top:12px\">Password<\/label><input id=\"memberPassword\" type=\"password\" autocomplete=\"current-password\">\n    <button class=\"btn\" style=\"margin-top:15px;width:100%\" onclick=\"memberLogin()\">Enter Member Portal<\/button>\n    <button class=\"btn alt\" style=\"margin-top:9px;width:100%\" onclick=\"showPublic('home')\">Return Home<\/button>\n    <p id=\"memberLoginMessage\"><\/p>\n  <\/div>\n<\/section>\n\n<section id=\"memberApp\" class=\"hidden\">\n  <div class=\"dashboard\">\n    <aside class=\"side\">\n      <h3>Complete Member Portal<\/h3>\n      <p>Welcome, <strong id=\"memberWelcome\"><\/strong><\/p>\n      <button onclick=\"showMemberTool('memberHome',this)\" class=\"active\">Portal Home<\/button>\n      <button onclick=\"showMemberTool('memberArchive',this)\">Unified Archive<\/button>\n      <button onclick=\"showMemberTool('memberTree',this)\">Family Tree<\/button>\n      <button onclick=\"showMemberTool('memberVault',this)\">Document Vault<\/button>\n      <button onclick=\"showMemberTool('memberAlerts',this)\">Match Alerts<\/button>\n      <button onclick=\"showMemberTool('memberNotebook',this)\">Research Notebook<\/button>\n      <button onclick=\"showMemberTool('memberResearcher',this)\">Research Marketplace<\/button>\n      <button onclick=\"memberLogout()\">Log Out<\/button>\n    <\/aside>\n    <div class=\"workspace\">\n      <div id=\"memberHomeTab\" class=\"member-tab\">\n        <h2>Your Complete Portal Access<\/h2>\n        <div class=\"grid three\">\n          <div class=\"card\"><h3>Search the Record<\/h3><p>Search indexed historical collections and organize promising leads.<\/p><button class=\"btn\" onclick=\"showMemberTool('memberArchive')\">Open Archive<\/button><\/div>\n          <div class=\"card\"><h3>Build the Family Record<\/h3><p>Create your family tree, timeline, evidence trail, and private document collection.<\/p><button class=\"btn\" onclick=\"showMemberTool('memberTree')\">Open Family Tree<\/button><\/div>\n          <div class=\"card\"><h3>Professional Research<\/h3><p>Hire an approved researcher or apply to offer your own genealogy services.<\/p><button class=\"btn\" onclick=\"showMemberTool('memberResearcher')\">Open Marketplace<\/button><\/div>\n        <\/div>\n        <div class=\"success\">Membership status: <b>Complete Portal Access<\/b> \u2022 No recurring membership charge.<\/div>\n      <\/div>\n      <div id=\"memberArchiveTab\" class=\"member-tab hidden\"><h2>Unified Archive<\/h2><div class=\"panel\"><p>Search the internal collection and follow links added by administrators to external land, census, military, vital, tribal, court, and family-record collections.<\/p><button class=\"btn\" onclick=\"memberLogout();showPublic('search')\">Search Internal Archive<\/button><\/div><\/div>\n      <div id=\"memberTreeTab\" class=\"member-tab hidden\"><h2>Family Tree and Timeline<\/h2><div class=\"panel\"><p>This portal area is reserved for the member\u2019s family-tree builder, relationships, life events, source citations, and cross-family match suggestions.<\/p><textarea id=\"memberTreeNotes\" placeholder=\"Begin with the names, dates, places, and relationships you already know.\"><\/textarea><button class=\"btn\" onclick=\"saveMemberWorkspace()\">Save Family Notes<\/button><\/div><\/div>\n      <div id=\"memberVaultTab\" class=\"member-tab hidden\"><h2>Document Vault<\/h2><div class=\"panel\"><input id=\"memberVaultFiles\" type=\"file\" multiple><p class=\"fine\">This preview records filenames locally. Production storage requires an authenticated encrypted server or approved cloud-storage connection.<\/p><button class=\"btn\" onclick=\"saveMemberWorkspace()\">Add to Preview Vault<\/button><div id=\"memberVaultList\"><\/div><\/div><\/div>\n      <div id=\"memberAlertsTab\" class=\"member-tab hidden\"><h2>Possible Record-Match Alerts<\/h2><div class=\"panel\"><p>Alerts identify possible overlaps in names, places, dates, uploaded records, and participating family trees. Every match is a research lead and must be verified against original evidence.<\/p><div class=\"notice\">No new verified matches in this preview.<\/div><\/div><\/div>\n      <div id=\"memberNotebookTab\" class=\"member-tab hidden\"><h2>Research Notebook<\/h2><div class=\"panel\"><textarea id=\"memberNotebook\" placeholder=\"Research question, collection searched, source citation, findings, and next step\u2026\"><\/textarea><button class=\"btn\" onclick=\"saveMemberWorkspace()\">Save Notebook<\/button><p id=\"memberSaveMessage\"><\/p><\/div><\/div>\n      <div id=\"memberResearcherTab\" class=\"member-tab hidden\"><h2>Professional Research Marketplace<\/h2><div class=\"panel\"><p>Hire approved researchers for separately priced projects, or apply to offer services. Researchers set their prices; the platform receives <b id=\"memberPlatformPercent\">10%<\/b> of each completed service charge.<\/p><label>Research specialty<\/label><input id=\"researcherSpecialty\" placeholder=\"Land records, census, military, family reconstruction\u2026\"><label style=\"margin-top:12px\">Researcher biography<\/label><textarea id=\"researcherBio\"><\/textarea><label>Typical starting price<\/label><input id=\"researcherPrice\" type=\"number\" min=\"0\" step=\"0.01\"><button class=\"btn\" onclick=\"applyAsResearcher()\">Submit Researcher Application<\/button><p id=\"researcherMessage\"><\/p><\/div><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"loginView\" class=\"loginwrap hidden\">\n  <div class=\"card loginbox\">\n    <h2>Administrative Login<\/h2>\n    <div class=\"notice\"><b>Super Administrator 1:<\/b> superadmin1 \/ records2026<br><b>Super Administrator 2:<\/b> superadmin2 \/ records2026<\/div>\n    <label>Username<\/label><input id=\"loginUsername\">\n    <label style=\"margin-top:12px\">Password<\/label><input id=\"loginPassword\" type=\"password\">\n    <button class=\"btn\" style=\"margin-top:15px;width:100%\" onclick=\"login()\">Log In<\/button>\n    <p id=\"loginMessage\"><\/p>\n  <\/div>\n<\/section>\n\n<section id=\"adminApp\" class=\"hidden\">\n  <div class=\"dashboard\">\n    <aside class=\"side\">\n      <h3>Administrative Center<\/h3>\n      <button class=\"active\" onclick=\"openAdminTab('dashboard',this)\">Dashboard<\/button>\n      <button onclick=\"openAdminTab('documents',this)\">Documents<\/button>\n      <button onclick=\"openAdminTab('registry',this)\">Registry<\/button>\n      <button onclick=\"openAdminTab('audio',this)\">Audio Academy<\/button>\n      <button class=\"super-only\" onclick=\"openAdminTab('admins',this)\">Administrators<\/button>\n      <button class=\"super-only\" onclick=\"openAdminTab('pricing',this)\">Pricing<\/button>\n      <button class=\"super-only\" onclick=\"openAdminTab('marketplace',this)\">Research Marketplace<\/button>\n      <button class=\"super-only\" onclick=\"openAdminTab('waivers',this)\">Fee Waivers<\/button>\n      <button class=\"super-only\" onclick=\"openAdminTab('backup',this)\">Backup &#038; Restore<\/button>\n      <button onclick=\"logout()\">Log Out<\/button>\n    <\/aside>\n\n    <div class=\"workspace\">\n      <div id=\"dashboardTab\" class=\"admin-tab\">\n        <h2>Dashboard<\/h2>\n        <div class=\"kpis\">\n          <div class=\"kpi\">Documents<strong id=\"kpiDocuments\">0<\/strong><\/div>\n          <div class=\"kpi\">Indexed People<strong id=\"kpiPeople\">0<\/strong><\/div>\n          <div class=\"kpi\">Registry Entries<strong id=\"kpiRegistry\">0<\/strong><\/div>\n          <div class=\"kpi\">Administrators<strong id=\"kpiAdmins\">0<\/strong><\/div>\n          <div class=\"kpi\">Registered Members<strong id=\"kpiMembers\">0<\/strong><\/div>\n          <div class=\"kpi\">Last Backup<strong id=\"kpiBackup\" style=\"font-size:1rem\">Never<\/strong><\/div>\n        <\/div>\n        <div class=\"panel\" style=\"margin-top:18px\">\n          <p>Signed in as <strong id=\"signedInName\"><\/strong> <span id=\"signedInRole\" class=\"badge\"><\/span><\/p>\n          <div id=\"backupDueNotice\"><\/div>\n        <\/div>\n      <\/div>\n\n      <div id=\"documentsTab\" class=\"admin-tab hidden\">\n        <h2>Document Intake and Search Index<\/h2>\n        <div class=\"panel\">\n          <div class=\"formgrid\">\n            <div class=\"full\"><label>Files<\/label><input id=\"documentFiles\" type=\"file\" multiple><\/div>\n            <div><label>Collection<\/label><input id=\"documentCollection\" placeholder=\"1880 Federal Census\"><\/div>\n            <div><label>Category<\/label><select id=\"documentCategory\"><\/select><\/div>\n            <div><label>Year<\/label><input id=\"documentYear\"><\/div>\n            <div><label>Location<\/label><input id=\"documentLocation\"><\/div>\n            <div class=\"full\"><label>People named in the record, one per line<\/label><textarea id=\"documentPeople\"><\/textarea><\/div>\n            <div class=\"full\"><label>Aliases and search terms<\/label><textarea id=\"documentAliases\"><\/textarea><\/div>\n            <div class=\"full\"><label>Notes<\/label><textarea id=\"documentNotes\"><\/textarea><\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"saveDocuments()\">Index Documents<\/button>\n          <p id=\"documentMessage\"><\/p>\n        <\/div>\n        <div class=\"panel\" style=\"overflow:auto\">\n          <table><thead><tr><th>Archive ID<\/th><th>File<\/th><th>Collection<\/th><th>People<\/th><th>Action<\/th><\/tr><\/thead><tbody id=\"documentsTable\"><\/tbody><\/table>\n        <\/div>\n      <\/div>\n\n      <div id=\"registryTab\" class=\"admin-tab hidden\">\n        <h2>People of the Record Registry<\/h2>\n        <div class=\"panel\">\n          <div class=\"formgrid\">\n            <div><label>Full name<\/label><input id=\"registryName\"><\/div>\n            <div><label>Email<\/label><input id=\"registryEmail\"><\/div>\n            <div><label>Family line<\/label><input id=\"registryFamily\"><\/div>\n            <div><label>Status<\/label><select id=\"registryStatus\"><option>Pending Review<\/option><option>Verified<\/option><option>Verified With Limitations<\/option><option>Rejected<\/option><\/select><\/div>\n            <div class=\"full\"><label>Evidence notes<\/label><textarea id=\"registryEvidence\"><\/textarea><\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"saveRegistryEntry()\">Save Registry Entry<\/button>\n        <\/div>\n        <div class=\"panel\" style=\"overflow:auto\"><table><thead><tr><th>Name<\/th><th>Family<\/th><th>Status<\/th><th>Action<\/th><\/tr><\/thead><tbody id=\"registryTable\"><\/tbody><\/table><\/div>\n      <\/div>\n\n      <div id=\"audioTab\" class=\"admin-tab hidden\">\n        <h2>Audio Academy Editor<\/h2>\n        <div class=\"panel\">\n          <label>Episode title<\/label><input id=\"newEpisodeTitle\">\n          <label style=\"margin-top:12px\">Transcript<\/label><textarea id=\"newEpisodeText\"><\/textarea>\n          <button class=\"btn\" onclick=\"saveEpisode()\">Add Episode<\/button>\n        <\/div>\n        <div id=\"adminEpisodes\" class=\"grid\"><\/div>\n      <\/div>\n\n      <div id=\"adminsTab\" class=\"admin-tab hidden\">\n        <h2>Administrator Management<\/h2>\n        <div class=\"panel\">\n          <div class=\"formgrid\">\n            <div><label>Name<\/label><input id=\"adminName\"><\/div>\n            <div><label>Username<\/label><input id=\"adminUsername\"><\/div>\n            <div><label>Password<\/label><input id=\"adminPassword\" type=\"password\"><\/div>\n            <div><label>Role<\/label><select id=\"adminRole\"><option value=\"admin\">Administrator<\/option><option value=\"superadmin\">Super Administrator<\/option><\/select><\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"saveAdministrator()\">Create Administrator<\/button>\n          <p id=\"adminMessage\"><\/p>\n        <\/div>\n        <div class=\"panel\" style=\"overflow:auto\"><table><thead><tr><th>Name<\/th><th>Username<\/th><th>Role<\/th><th>Status<\/th><th>Action<\/th><\/tr><\/thead><tbody id=\"adminsTable\"><\/tbody><\/table><\/div>\n      <\/div>\n\n      <div id=\"pricingTab\" class=\"admin-tab hidden\">\n        <h2>Program Settings<\/h2>\n        <div class=\"panel\">\n          <div class=\"formgrid\">\n            <div><label>One-time registration fee<\/label><input id=\"priceRegistration\" type=\"number\" step=\"0.01\" value=\"25\"><\/div>\n            <div><label>Marketplace platform percentage<\/label><input id=\"platformPercent\" type=\"number\" min=\"0\" max=\"100\" step=\"0.1\" value=\"10\"><\/div>\n            <div class=\"full\"><label>Secure payment link<\/label><input id=\"paymentLink\" type=\"url\" placeholder=\"https:\/\/paypal.me\/... or Stripe Payment Link\"><\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"savePricing()\">Save Program Settings<\/button>\n          <p id=\"pricingMessage\"><\/p>\n        <\/div>\n      <\/div>\n\n      <div id=\"marketplaceTab\" class=\"admin-tab hidden\">\n        <h2>Research Marketplace<\/h2>\n        <div class=\"kpis\">\n          <div class=\"kpi\">Researchers<strong id=\"kpiResearchers\">0<\/strong><\/div>\n          <div class=\"kpi\">Transactions<strong id=\"kpiTransactions\">0<\/strong><\/div>\n          <div class=\"kpi\">Service Volume<strong id=\"kpiServiceVolume\">$0<\/strong><\/div>\n          <div class=\"kpi\">Platform Share<strong id=\"kpiPlatformRevenue\">$0<\/strong><\/div>\n        <\/div>\n        <div class=\"panel\" style=\"margin-top:18px;overflow:auto\">\n          <h3>Record Completed Research Service<\/h3>\n          <div class=\"formgrid\">\n            <div><label>Researcher name<\/label><input id=\"transactionResearcher\"><\/div>\n            <div><label>Client or project<\/label><input id=\"transactionClient\"><\/div>\n            <div><label>Service charge<\/label><input id=\"transactionAmount\" type=\"number\" min=\"0\" step=\"0.01\"><\/div>\n            <div><label>Status<\/label><select id=\"transactionStatus\"><option>Completed<\/option><option>Pending<\/option><option>Refunded<\/option><\/select><\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"saveMarketplaceTransaction()\">Record Transaction<\/button>\n          <p id=\"transactionMessage\"><\/p>\n        <\/div>\n        <div class=\"panel\" style=\"overflow:auto\"><table><thead><tr><th>Date<\/th><th>Researcher<\/th><th>Client\/Project<\/th><th>Charge<\/th><th>Researcher 90%<\/th><th>Platform 10%<\/th><th>Status<\/th><\/tr><\/thead><tbody id=\"marketplaceTable\"><\/tbody><\/table><\/div>\n      <\/div>\n\n      <div id=\"waiversTab\" class=\"admin-tab hidden\">\n        <h2>Fee-Waiver Administration<\/h2>\n        <div class=\"panel\">\n          <div class=\"formgrid\">\n            <div><label>Code<\/label><input id=\"waiverCode\"><\/div>\n            <div><label>Applicable fee<\/label><select id=\"waiverPlan\"><option value=\"registration\">One-Time Registration<\/option><\/select><\/div>\n            <div><label>Type<\/label><select id=\"waiverType\"><option value=\"full\">Full Waiver<\/option><option value=\"percent\">Percentage<\/option><option value=\"fixed\">Fixed Dollar Amount<\/option><\/select><\/div>\n            <div><label>Amount<\/label><input id=\"waiverAmount\" type=\"number\" value=\"100\"><\/div>\n            <div><label>Maximum uses<\/label><input id=\"waiverMaxUses\" type=\"number\" value=\"1\"><\/div>\n            <div><label>Expiration<\/label><input id=\"waiverExpiration\" type=\"date\"><\/div>\n            <div><label>Email restriction<\/label><input id=\"waiverEmail\"><\/div>\n            <div><label>Status<\/label><select id=\"waiverStatus\"><option value=\"active\">Active<\/option><option value=\"inactive\">Inactive<\/option><\/select><\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"saveWaiver()\">Create Waiver<\/button>\n          <p id=\"waiverMessage\"><\/p>\n        <\/div>\n        <div class=\"panel\" style=\"overflow:auto\"><table><thead><tr><th>Code<\/th><th>Plan<\/th><th>Benefit<\/th><th>Uses<\/th><th>Status<\/th><th>Action<\/th><\/tr><\/thead><tbody id=\"waiversTable\"><\/tbody><\/table><\/div>\n      <\/div>\n\n      <div id=\"backupTab\" class=\"admin-tab hidden\">\n        <h2>Daily Database Backup and Restore<\/h2>\n        <div class=\"notice\">Download one backup each day and store it somewhere separate from the website, such as an external drive or protected cloud folder.<\/div>\n        <div class=\"backup-grid\">\n          <div class=\"backup-card\">\n            <h3>Download Complete Database<\/h3>\n            <p>This exports documents, indexed people, registry records, member registrations, marketplace transactions, administrators, program settings, waiver codes, audio episodes, and system settings into one dated JSON file.<\/p>\n            <button class=\"btn gold\" onclick=\"downloadDatabaseBackup()\">Download Today&#8217;s Backup<\/button>\n            <p id=\"downloadBackupMessage\"><\/p>\n          <\/div>\n          <div class=\"backup-card\">\n            <h3>Restore Database<\/h3>\n            <p>Select a previous JSON backup. Restoring replaces the current browser database with the information stored in that backup.<\/p>\n            <input id=\"restoreBackupFile\" type=\"file\" accept=\".json\">\n            <button class=\"btn red\" style=\"margin-top:12px\" onclick=\"restoreDatabaseBackup()\">Restore Uploaded Backup<\/button>\n            <p id=\"restoreBackupMessage\"><\/p>\n          <\/div>\n        <\/div>\n        <div class=\"panel\" style=\"margin-top:18px\">\n          <h3>Backup History<\/h3>\n          <div id=\"backupHistory\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<footer class=\"footer\">\n  <strong>People of the Record Ancestral Research Center<\/strong>\n  <p>One-time $25 registration \u2022 Complete portal access \u2022 Professional researcher marketplace with a 10% platform share.<\/p>\n<\/footer>\n\n<script>\nconst categories=[\"All Categories\",\"Census Records\",\"Military Records\",\"Probate and Estate Records\",\"Land and Property Records\",\"Birth Records\",\"Death Records\",\"Marriage Records\",\"Court Records\",\"Church Records\",\"Freedmen's Bureau Records\",\"Freedman's Bank Records\",\"Newspapers\",\"Tribal and Enrollment Records\",\"Family Records\",\"Other Historical Records\"];\n\nlet database=JSON.parse(localStorage.getItem(\"por_complete_database\")||\"null\")||{\n  version:\"1.0\",\n  documents:[{\n    id:\"POR-CEN-1880-000001\",file:\"lincoln_parish_1880_page_12.pdf\",collection:\"1880 Louisiana Federal Census\",\n    category:\"Census Records\",year:\"1880\",location:\"Lincoln Parish, Louisiana\",\n    people:[\"Robert French | age 39\",\"Peggy French | age 35\",\"William French | age 12\"],\n    aliases:\"Robt. French, Peggie French\",notes:\"Household 122\"\n  }],\n  registry:[],\n  administrators:[\n    {id:\"ADM-0001\",name:\"Primary Super Administrator\",username:\"superadmin1\",password:\"records2026\",role:\"superadmin\",active:true},\n    {id:\"ADM-0002\",name:\"Second Super Administrator\",username:\"superadmin2\",password:\"records2026\",role:\"superadmin\",active:true}\n  ],\n  settings:{registrationFee:25,platformPercent:10,paymentLink:\"\"},\n  registrations:[],\n  researchers:[],\n  marketplaceTransactions:[],\n  waivers:[],\n  waiverUses:[],\n  episodes:[\n    {title:\"What Your One-Time $25 Registration Provides\",text:\"Welcome to the People of the Record Ancestral Research Center. Before you pay, we want you to understand exactly what you are receiving. The twenty-five-dollar payment is a one-time registration and portal-setup fee. It is not a monthly membership subscription. After registration, you receive complete member access to the unified archive search, family-tree and timeline tools, document vault, record uploads, research notebook, saved searches, possible record-match alerts, audio research academy, People of the Record registry application, and professional-researcher marketplace. The Center brings census, military, land, probate, vital, church, court, newspaper, tribal, family, and other historical records into one organized research environment. Technology may help identify possible relationships and records, but authorized human reviewers make registry decisions, and possible matches must be verified against original evidence. Registered members may also apply to offer genealogy research services. Each approved researcher sets the price for their own service. When a client purchases a research service through the marketplace, ten percent of the researcher's service charge goes back to the platform and ninety percent is allocated to the researcher, before any separate payment-processing fees or taxes. The twenty-five-dollar registration fee does not include the separate price of hiring a professional researcher. The purpose of this Center is to help families preserve evidence, reconnect ancestral lines, organize their records, and pass a documented inheritance to future generations. Listen to the remaining free orientation episodes, review everything included, and register only when you understand the offer.\"},\n    {title:\"How the Internal Archive Works\",text:\"Every approved document entered into the archive may be indexed by name, year, place, collection, record type, family relationship, and alternate spelling. A single census page may create many searchable person entries. Members can search the internal archive and discover possible records connected to their ancestors.\"},\n    {title:\"The Registry and Evidence Review\",text:\"The People of the Record Registry is evidence based. Technology may help organize documents and identify possible connections, but authorized human reviewers make registry decisions. Records may be marked pending review, verified, verified with limitations, restricted, or rejected.\"}\n  ],\n  backupHistory:[],\n  lastBackup:null\n};\n\n\/* Upgrade older browser previews that used three monthly tiers. *\/\ndatabase.settings=database.settings||{registrationFee:25,platformPercent:10,paymentLink:\"\"};\ndatabase.settings.registrationFee=Number(database.settings.registrationFee||25);\ndatabase.settings.platformPercent=Number(database.settings.platformPercent??10);\ndatabase.registrations=database.registrations||[];\ndatabase.researchers=database.researchers||[];\ndatabase.marketplaceTransactions=database.marketplaceTransactions||[];\ndelete database.prices;\n\nlet currentAdmin=null;\nlet currentMember=null;\nlet speech=null;\nlet speechQueue=[];\nlet speechIndex=0;\n\nfunction saveDatabase(){\n  localStorage.setItem(\"por_complete_database\",JSON.stringify(database));\n}\nfunction money(v){return \"$\"+Number(v||0).toFixed(2)}\nfunction esc(v){return String(v??\"\").replace(\/[&<>\"']\/g,m=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#039;\"}[m]))}\n\nfunction initialize(){\n  documentCategory.innerHTML=categories.slice(1).map(c=>`<option>${esc(c)}<\/option>`).join(\"\");\n  publicSearchCategory.innerHTML=categories.map((c,i)=>`<option value=\"${i?esc(c):\"\"}\">${esc(c)}<\/option>`).join(\"\");\n  episodeSelect.innerHTML=database.episodes.map((e,i)=>`<option value=\"${i}\">Episode ${i+1}: ${esc(e.title)}<\/option>`).join(\"\");\n  loadEpisode();applyPrices();calculateCommission();refreshAdmin();showPublic(\"home\");\n}\nfunction showPublic(name){\n  publicApp.classList.remove(\"hidden\");loginView.classList.add(\"hidden\");adminApp.classList.add(\"hidden\");memberLoginView.classList.add(\"hidden\");memberApp.classList.add(\"hidden\");\n  [\"home\",\"plans\",\"academy\",\"search\"].forEach(x=>document.getElementById(x+\"View\").classList.toggle(\"hidden\",x!==name));\n  if(name===\"plans\")applyPrices();\n}\nfunction showMemberLogin(){publicApp.classList.add(\"hidden\");loginView.classList.add(\"hidden\");adminApp.classList.add(\"hidden\");memberApp.classList.add(\"hidden\");memberLoginView.classList.remove(\"hidden\")}\nfunction memberLogin(){\n  const user=database.registrations.find(x=>x.status===\"Active\"&&x.username===memberUsername.value.trim()&&x.password===memberPassword.value);\n  if(!user){memberLoginMessage.textContent=\"Incorrect login or the registration is not active.\";return}\n  currentMember=user;memberLoginView.classList.add(\"hidden\");memberApp.classList.remove(\"hidden\");memberWelcome.textContent=user.name;memberPlatformPercent.textContent=database.settings.platformPercent+\"%\";\n  memberTreeNotes.value=user.treeNotes||\"\";memberNotebook.value=user.notebook||\"\";renderMemberVault();showMemberTool(\"memberHome\");\n}\nfunction memberLogout(){currentMember=null;memberApp.classList.add(\"hidden\");showPublic(\"home\")}\nfunction showMemberTool(name,button){\n  document.querySelectorAll(\".member-tab\").forEach(x=>x.classList.add(\"hidden\"));document.getElementById(name+\"Tab\").classList.remove(\"hidden\");\n  document.querySelectorAll(\"#memberApp .side button\").forEach(x=>x.classList.remove(\"active\"));if(button)button.classList.add(\"active\");\n}\nfunction saveMemberWorkspace(){\n  if(!currentMember)return;currentMember.treeNotes=memberTreeNotes.value;currentMember.notebook=memberNotebook.value;\n  const files=[...memberVaultFiles.files].map(x=>x.name);currentMember.vaultFiles=[...(currentMember.vaultFiles||[]),...files];memberVaultFiles.value=\"\";\n  saveDatabase();renderMemberVault();memberSaveMessage.textContent=\"Your preview workspace has been saved in this browser.\";\n}\nfunction renderMemberVault(){if(!currentMember)return;memberVaultList.innerHTML=(currentMember.vaultFiles||[]).map(x=>'<div class=\"result\">'+esc(x)+'<\/div>').join(\"\")||\"<p>No preview files recorded.<\/p>\"}\nfunction applyAsResearcher(){\n  if(!currentMember)return;if(!researcherSpecialty.value.trim()){researcherMessage.textContent=\"Enter a research specialty.\";return}\n  if(database.researchers.some(x=>x.memberId===currentMember.id)){researcherMessage.textContent=\"A researcher application already exists for this account.\";return}\n  database.researchers.push({memberId:currentMember.id,name:currentMember.name,email:currentMember.email,specialty:researcherSpecialty.value.trim(),bio:researcherBio.value.trim(),startingPrice:Number(researcherPrice.value)||0,status:\"Pending Review\",appliedAt:new Date().toISOString()});\n  saveDatabase();researcherMessage.textContent=\"Researcher application submitted for review.\";refreshAdmin();\n}\nfunction showLogin(){publicApp.classList.add(\"hidden\");memberLoginView.classList.add(\"hidden\");memberApp.classList.add(\"hidden\");adminApp.classList.add(\"hidden\");loginView.classList.remove(\"hidden\")}\nfunction login(){\n  const user=database.administrators.find(a=>a.active&&a.username===loginUsername.value.trim()&&a.password===loginPassword.value);\n  if(!user){loginMessage.textContent=\"Incorrect login or inactive account.\";return}\n  currentAdmin=user;loginView.classList.add(\"hidden\");publicApp.classList.add(\"hidden\");adminApp.classList.remove(\"hidden\");applyRole();refreshAdmin();\n}\nfunction logout(){currentAdmin=null;showPublic(\"home\")}\nfunction applyRole(){\n  document.querySelectorAll(\".super-only\").forEach(x=>x.classList.toggle(\"hidden\",!currentAdmin||currentAdmin.role!==\"superadmin\"));\n  signedInName.textContent=currentAdmin?currentAdmin.name:\"\";\n  signedInRole.textContent=currentAdmin?(currentAdmin.role===\"superadmin\"?\"Super Administrator\":\"Administrator\"):\"\";\n}\nfunction openAdminTab(name,button){\n  const protectedTabs=[\"admins\",\"pricing\",\"marketplace\",\"waivers\",\"backup\"];\n  if(protectedTabs.includes(name)&&(!currentAdmin||currentAdmin.role!==\"superadmin\")){alert(\"Super Administrator access is required.\");return}\n  document.querySelectorAll(\".admin-tab\").forEach(x=>x.classList.add(\"hidden\"));\n  document.getElementById(name+\"Tab\").classList.remove(\"hidden\");\n  document.querySelectorAll(\".side button\").forEach(x=>x.classList.remove(\"active\"));\n  if(button)button.classList.add(\"active\");\n  refreshAdmin();\n}\nfunction applyPrices(){\n  pricePublicRegistration.textContent=money(database.settings.registrationFee);\n  priceRegistration.value=database.settings.registrationFee;\n  platformPercent.value=database.settings.platformPercent;\n  paymentLink.value=database.settings.paymentLink||\"\";\n}\nfunction savePricing(){\n  database.settings.registrationFee=Math.max(0,Number(priceRegistration.value)||25);\n  database.settings.platformPercent=Math.min(100,Math.max(0,Number(platformPercent.value)||10));\n  database.settings.paymentLink=paymentLink.value.trim();\n  saveDatabase();applyPrices();calculateCommission();pricingMessage.textContent=\"Program settings updated.\";\n}\nfunction validWaiver(code,email){\n  if(!code)return null;\n  const w=database.waivers.find(x=>x.code===code.toUpperCase());\n  if(!w||w.status!==\"active\"||(w.plan!==\"registration\"&&w.plan!==\"all\")||(w.expiration&&new Date(w.expiration+\"T23:59:59\")<new Date())||w.uses>=w.maxUses||(w.email&&w.email!==email.toLowerCase()))return null;\n  return w;\n}\nfunction registrationTotal(waiver){\n  const base=database.settings.registrationFee;let discount=0;\n  if(waiver){discount=waiver.type===\"full\"?base:waiver.type===\"percent\"?base*(waiver.amount\/100):waiver.amount}\n  discount=Math.min(base,Math.max(0,discount));return{base,discount,due:Math.max(0,base-discount)};\n}\nfunction beginRegistration(){\n  const name=registrationName.value.trim(),email=registrationEmail.value.trim().toLowerCase(),username=registrationUsername.value.trim(),password=registrationPassword.value;\n  if(!name||!email||!username||!password){registrationResult.innerHTML='<p class=\"warning\">Complete your name, email, username, and password.<\/p>';return}\n  if(!registrationTerms.checked){registrationResult.innerHTML='<p class=\"warning\">Please confirm the registration and marketplace terms.<\/p>';return}\n  if(database.registrations.some(x=>x.email===email||x.username.toLowerCase()===username.toLowerCase())){registrationResult.innerHTML='<p class=\"warning\">An account already uses that email or username.<\/p>';return}\n  const waiverCode=registrationWaiver.value.trim().toUpperCase(),waiver=validWaiver(waiverCode,email);\n  if(waiverCode&&!waiver){registrationResult.innerHTML='<p class=\"warning\">That waiver code is not valid for this registration.<\/p>';return}\n  const total=registrationTotal(waiver);\n  const pending={id:\"MEM-\"+String(database.registrations.length+1).padStart(6,\"0\"),name,email,username,password,family:registrationFamily.value.trim(),regularFee:total.base,discount:total.discount,amountPaid:total.due,waiverCode:waiver?waiver.code:\"\",status:\"Pending Payment\",createdAt:new Date().toISOString(),access:\"Complete Portal Access\"};\n  sessionStorage.setItem(\"por_pending_registration\",JSON.stringify(pending));\n  const payment=database.settings.paymentLink;\n  registrationResult.innerHTML='<div class=\"success\"><b>Registration prepared.<\/b><br>One-time fee: '+money(total.base)+'<br>Discount: '+money(total.discount)+'<br><b>Amount due: '+money(total.due)+'<\/b><br><button class=\"btn gold\" style=\"margin-top:10px\" onclick=\"completePreviewRegistration()\">Complete Preview Payment<\/button>'+(payment?'<a class=\"btn\" style=\"display:inline-block;margin:10px 0 0 8px;text-decoration:none\" href=\"'+esc(payment)+'\" target=\"_blank\" rel=\"noopener\">Open Secure Payment<\/a>':'')+'<p class=\"fine\">For production, account access must be activated only after your payment processor confirms payment on the server.<\/p><\/div>';\n}\nfunction completePreviewRegistration(){\n  const pending=JSON.parse(sessionStorage.getItem(\"por_pending_registration\")||\"null\");if(!pending)return;\n  pending.status=\"Active\";pending.activatedAt=new Date().toISOString();database.registrations.push(pending);\n  if(pending.waiverCode){const w=database.waivers.find(x=>x.code===pending.waiverCode);if(w)w.uses++}\n  database.waiverUses.unshift({code:pending.waiverCode||\"NONE\",plan:\"registration\",email:pending.email,regularPrice:pending.regularFee,discount:pending.discount,amountDue:pending.amountPaid,date:new Date().toISOString()});\n  saveDatabase();sessionStorage.removeItem(\"por_pending_registration\");registrationResult.innerHTML='<div class=\"success\"><b>Preview registration activated.<\/b><br>Member ID: '+esc(pending.id)+'<br>Access: Complete Portal Access<\/div>';refreshAdmin();\n}\nfunction calculateCommission(){\n  if(!document.getElementById(\"commissionPrice\"))return;\n  const charge=Math.max(0,Number(commissionPrice.value)||0),share=charge*(database.settings.platformPercent\/100),researcher=charge-share;\n  commissionResult.textContent=\"At \"+money(charge)+\": researcher \"+money(researcher)+\" \u2022 platform \"+money(share)+\" (\"+database.settings.platformPercent+\"%)\";\n}\nfunction saveMarketplaceTransaction(){\n  const amount=Math.max(0,Number(transactionAmount.value)||0);if(!transactionResearcher.value.trim()||!amount){transactionMessage.textContent=\"Enter a researcher and service charge.\";return}\n  const platform=amount*(database.settings.platformPercent\/100);\n  database.marketplaceTransactions.unshift({date:new Date().toISOString(),researcher:transactionResearcher.value.trim(),client:transactionClient.value.trim(),amount,researcherShare:amount-platform,platformShare:platform,status:transactionStatus.value});\n  saveDatabase();transactionResearcher.value=\"\";transactionClient.value=\"\";transactionAmount.value=\"\";transactionMessage.textContent=\"Marketplace transaction recorded.\";refreshAdmin();\n}\nfunction loadEpisode(){\n  const e=database.episodes[Number(episodeSelect.value)||0];\n  if(!e)return;\n  episodeTitle.textContent=e.title;episodeTranscript.textContent=e.text;\n}\nfunction playEpisode(){\n  stopEpisode();\n  const e=database.episodes[Number(episodeSelect.value)||0];if(!e)return;\n  speechQueue=e.text.match(\/[^.!?]+[.!?]+|[^.!?]+$\/g)||[e.text];speechIndex=0;speakNextPassage();\n}\nfunction speakNextPassage(){\n  if(speechIndex>=speechQueue.length){speech=null;return}\n  speech=new SpeechSynthesisUtterance(speechQueue[speechIndex].trim());speech.rate=Number(speechRate.value);\n  speech.onend=()=>{speechIndex++;speakNextPassage()};speech.onerror=e=>{if(e.error!==\"interrupted\")speech=null};\n  speechSynthesis.speak(speech);\n}\nfunction pauseEpisode(){if(speechSynthesis.paused)speechSynthesis.resume();else speechSynthesis.pause()}\nfunction stopEpisode(){speechSynthesis.cancel();speech=null;speechQueue=[];speechIndex=0}\nfunction saveEpisode(){\n  if(!newEpisodeTitle.value.trim()||!newEpisodeText.value.trim())return;\n  database.episodes.push({title:newEpisodeTitle.value.trim(),text:newEpisodeText.value.trim()});saveDatabase();\n  newEpisodeTitle.value=\"\";newEpisodeText.value=\"\";initialize();openAdminTab(\"audio\");\n}\nfunction saveDocuments(){\n  const files=[...documentFiles.files];if(!files.length){documentMessage.textContent=\"Select at least one file.\";return}\n  const people=documentPeople.value.split(\/\\r?\\n\/).map(x=>x.trim()).filter(Boolean);\n  files.forEach(file=>database.documents.push({\n    id:\"POR-\"+String(database.documents.length+1).padStart(6,\"0\"),\n    file:file.name,collection:documentCollection.value||\"Unassigned Collection\",category:documentCategory.value,\n    year:documentYear.value,location:documentLocation.value,people,aliases:documentAliases.value,notes:documentNotes.value\n  }));\n  saveDatabase();documentMessage.textContent=files.length+\" document(s) indexed.\";documentFiles.value=\"\";refreshAdmin();\n}\nfunction deleteDocument(i){if(confirm(\"Delete this record?\")){database.documents.splice(i,1);saveDatabase();refreshAdmin()}}\nfunction saveRegistryEntry(){\n  if(!registryName.value.trim())return;\n  database.registry.push({name:registryName.value.trim(),email:registryEmail.value.trim(),family:registryFamily.value.trim(),status:registryStatus.value,evidence:registryEvidence.value.trim()});\n  saveDatabase();registryName.value=\"\";registryEmail.value=\"\";registryFamily.value=\"\";registryEvidence.value=\"\";refreshAdmin();\n}\nfunction deleteRegistry(i){if(confirm(\"Delete this registry entry?\")){database.registry.splice(i,1);saveDatabase();refreshAdmin()}}\nfunction saveAdministrator(){\n  if(!adminName.value.trim()||!adminUsername.value.trim()||!adminPassword.value){adminMessage.textContent=\"Complete every required field.\";return}\n  if(database.administrators.some(a=>a.username.toLowerCase()===adminUsername.value.trim().toLowerCase())){adminMessage.textContent=\"Username already exists.\";return}\n  database.administrators.push({id:\"ADM-\"+String(database.administrators.length+1).padStart(4,\"0\"),name:adminName.value.trim(),username:adminUsername.value.trim(),password:adminPassword.value,role:adminRole.value,active:true});\n  saveDatabase();adminMessage.textContent=\"Administrator created.\";adminName.value=\"\";adminUsername.value=\"\";adminPassword.value=\"\";refreshAdmin();\n}\nfunction toggleAdmin(i){\n  const a=database.administrators[i];\n  if(currentAdmin&&a.id===currentAdmin.id){alert(\"You cannot deactivate your current account.\");return}\n  const activeSupers=database.administrators.filter(x=>x.active&&x.role===\"superadmin\").length;\n  if(a.active&&a.role===\"superadmin\"&&activeSupers<=2){alert(\"At least two active Super Administrators must remain.\");return}\n  a.active=!a.active;saveDatabase();refreshAdmin();\n}\nfunction saveWaiver(){\n  const code=(waiverCode.value.trim()||(\"POR-\"+Math.random().toString(36).slice(2,8))).toUpperCase();\n  if(database.waivers.some(w=>w.code===code)){waiverMessage.textContent=\"That code already exists.\";return}\n  database.waivers.push({code,plan:waiverPlan.value,type:waiverType.value,amount:Number(waiverAmount.value)||0,maxUses:Math.max(1,Number(waiverMaxUses.value)||1),uses:0,expiration:waiverExpiration.value,email:waiverEmail.value.trim().toLowerCase(),status:waiverStatus.value});\n  saveDatabase();waiverMessage.textContent=\"Waiver created: \"+code;waiverCode.value=\"\";refreshAdmin();\n}\nfunction toggleWaiver(i){database.waivers[i].status=database.waivers[i].status===\"active\"?\"inactive\":\"active\";saveDatabase();refreshAdmin()}\nfunction runPublicSearch(){\n  const q=publicSearchQuery.value.trim().toLowerCase(),year=publicSearchYear.value.trim(),cat=publicSearchCategory.value;\n  const matches=database.documents.filter(r=>{\n    const hay=[r.id,r.file,r.collection,r.category,r.year,r.location,r.aliases,r.notes,...(r.people||[])].join(\" \").toLowerCase();\n    return(!q||hay.includes(q))&&(!year||String(r.year).includes(year))&&(!cat||r.category===cat);\n  });\n  publicSearchResults.innerHTML=matches.length?matches.map(r=>`<div class=\"result\"><span class=\"badge\">${esc(r.category)}<\/span><h3>${esc(r.id)} \u2014 ${esc(r.file)}<\/h3><p><b>Collection:<\/b> ${esc(r.collection)}<br><b>Year:<\/b> ${esc(r.year||\"Unknown\")} &nbsp; <b>Location:<\/b> ${esc(r.location||\"Unknown\")}<\/p><p><b>Indexed people:<\/b> ${esc((r.people||[]).join(\"; \")||\"None\")}<\/p><\/div>`).join(\"\"):'<div class=\"result\">No matching records found.<\/div>';\n}\nfunction downloadDatabaseBackup(){\n  const now=new Date();\n  database.lastBackup=now.toISOString();\n  database.backupHistory.unshift({date:database.lastBackup,by:currentAdmin?currentAdmin.username:\"unknown\",documents:database.documents.length,registry:database.registry.length});\n  database.backupHistory=database.backupHistory.slice(0,100);\n  saveDatabase();\n  const backup={application:\"People of the Record Ancestral Research Center\",exportedAt:now.toISOString(),database};\n  const blob=new Blob([JSON.stringify(backup,null,2)],{type:\"application\/json\"});\n  const url=URL.createObjectURL(blob);const a=document.createElement(\"a\");\n  const stamp=now.getFullYear()+\"-\"+String(now.getMonth()+1).padStart(2,\"0\")+\"-\"+String(now.getDate()).padStart(2,\"0\")+\"_\"+String(now.getHours()).padStart(2,\"0\")+\"-\"+String(now.getMinutes()).padStart(2,\"0\");\n  a.href=url;a.download=\"people-of-the-record-backup_\"+stamp+\".json\";document.body.appendChild(a);a.click();a.remove();URL.revokeObjectURL(url);\n  downloadBackupMessage.textContent=\"Backup downloaded and recorded.\";refreshAdmin();\n}\nfunction restoreDatabaseBackup(){\n  const file=restoreBackupFile.files[0];if(!file){restoreBackupMessage.textContent=\"Select a JSON backup file.\";return}\n  const reader=new FileReader();\n  reader.onload=()=>{\n    try{\n      const parsed=JSON.parse(reader.result);const restored=parsed.database||parsed;\n      const required=[\"documents\",\"registry\",\"administrators\",\"waivers\",\"episodes\"];\n      if(!required.every(k=>Object.prototype.hasOwnProperty.call(restored,k)))throw new Error(\"Invalid backup structure\");\n      if(!confirm(\"Restore this backup? Current browser data will be replaced.\"))return;\n      database=restored;database.backupHistory=database.backupHistory||[];database.lastBackup=database.lastBackup||null;\n      saveDatabase();restoreBackupMessage.textContent=\"Database restored successfully.\";initialize();showLogin();\n    }catch(e){restoreBackupMessage.textContent=\"The selected file is not a valid system backup.\"}\n  };\n  reader.readAsText(file);\n}\nfunction refreshAdmin(){\n  applyRole();applyPrices();\n  const completed=database.marketplaceTransactions.filter(x=>x.status===\"Completed\");\n  kpiResearchers.textContent=database.researchers.length||new Set(database.marketplaceTransactions.map(x=>x.researcher)).size;\n  kpiTransactions.textContent=database.marketplaceTransactions.length;\n  kpiServiceVolume.textContent=money(completed.reduce((n,x)=>n+x.amount,0));\n  kpiPlatformRevenue.textContent=money(completed.reduce((n,x)=>n+x.platformShare,0));\n  marketplaceTable.innerHTML=database.marketplaceTransactions.map(function(x){\n    return \"<tr><td>\"+new Date(x.date).toLocaleDateString()+\"<\/td><td>\"+esc(x.researcher)+\"<\/td><td>\"+esc(x.client)+\"<\/td><td>\"+money(x.amount)+\"<\/td><td>\"+money(x.researcherShare)+\"<\/td><td>\"+money(x.platformShare)+\"<\/td><td>\"+esc(x.status)+\"<\/td><\/tr>\";\n  }).join(\"\");\n  kpiDocuments.textContent=database.documents.length;\n  kpiPeople.textContent=database.documents.reduce((n,r)=>n+(r.people||[]).length,0);\n  kpiRegistry.textContent=database.registry.length;\n  kpiAdmins.textContent=database.administrators.filter(a=>a.active).length;\n  kpiMembers.textContent=database.registrations.filter(x=>x.status===\"Active\").length;\n  kpiBackup.textContent=database.lastBackup?new Date(database.lastBackup).toLocaleDateString():\"Never\";\n  const today=new Date().toDateString(),last=database.lastBackup?new Date(database.lastBackup).toDateString():\"\";\n  backupDueNotice.innerHTML=last===today?'<div class=\"success\">Today\u2019s database backup has been downloaded.<\/div>':'<div class=\"notice\"><b>Daily backup due.<\/b> Open Backup & Restore and download today\u2019s database copy.<\/div>';\n  documentsTable.innerHTML=database.documents.map((r,i)=>`<tr><td>${esc(r.id)}<\/td><td>${esc(r.file)}<\/td><td>${esc(r.collection)}<\/td><td>${(r.people||[]).length}<\/td><td><button class=\"btn red\" onclick=\"deleteDocument(${i})\">Delete<\/button><\/td><\/tr>`).join(\"\");\n  registryTable.innerHTML=database.registry.map((r,i)=>`<tr><td>${esc(r.name)}<\/td><td>${esc(r.family)}<\/td><td>${esc(r.status)}<\/td><td><button class=\"btn red\" onclick=\"deleteRegistry(${i})\">Delete<\/button><\/td><\/tr>`).join(\"\");\n  adminsTable.innerHTML=database.administrators.map((a,i)=>`<tr><td>${esc(a.name)}<\/td><td>${esc(a.username)}<\/td><td>${a.role===\"superadmin\"?\"Super Administrator\":\"Administrator\"}<\/td><td>${a.active?\"Active\":\"Inactive\"}<\/td><td><button class=\"btn ${a.active?\"red\":\"ghost\"}\" onclick=\"toggleAdmin(${i})\">${a.active?\"Deactivate\":\"Activate\"}<\/button><\/td><\/tr>`).join(\"\");\n  waiversTable.innerHTML=database.waivers.map((w,i)=>`<tr><td><b>${esc(w.code)}<\/b><\/td><td>${esc(w.plan)}<\/td><td>${w.type===\"full\"?\"Full waiver\":w.type===\"percent\"?w.amount+\"%\":money(w.amount)}<\/td><td>${w.uses}\/${w.maxUses}<\/td><td>${esc(w.status)}<\/td><td><button class=\"btn ghost\" onclick=\"toggleWaiver(${i})\">${w.status===\"active\"?\"Deactivate\":\"Activate\"}<\/button><\/td><\/tr>`).join(\"\");\n  adminEpisodes.innerHTML=database.episodes.map((e,i)=>`<div class=\"card\"><h3>${esc(e.title)}<\/h3><p>${esc(e.text.slice(0,240))}${e.text.length>240?\"...\":\"\"}<\/p><\/div>`).join(\"\");\n  backupHistory.innerHTML=database.backupHistory.length?database.backupHistory.map(b=>`<div class=\"result\"><b>${new Date(b.date).toLocaleString()}<\/b> by ${esc(b.by)}<br>${b.documents} documents and ${b.registry} registry entries<\/div>`).join(\"\"):\"<p>No backups recorded yet.<\/p>\";\n}\ninitialize();\n<\/script>\n<\/body>\n<\/html>\n\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1122,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"class_list":["post-255","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/trubianvillage.com\/researchcenter\/wp-json\/wp\/v2\/pages\/255","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trubianvillage.com\/researchcenter\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/trubianvillage.com\/researchcenter\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/trubianvillage.com\/researchcenter\/wp-json\/wp\/v2\/users\/1122"}],"replies":[{"embeddable":true,"href":"https:\/\/trubianvillage.com\/researchcenter\/wp-json\/wp\/v2\/comments?post=255"}],"version-history":[{"count":317,"href":"https:\/\/trubianvillage.com\/researchcenter\/wp-json\/wp\/v2\/pages\/255\/revisions"}],"predecessor-version":[{"id":2226,"href":"https:\/\/trubianvillage.com\/researchcenter\/wp-json\/wp\/v2\/pages\/255\/revisions\/2226"}],"wp:attachment":[{"href":"https:\/\/trubianvillage.com\/researchcenter\/wp-json\/wp\/v2\/media?parent=255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}