Cats and Dogs
Vass, Cameron, Sanford, Southern Pines, Pinehurst, Aberdeen, Whispering Pines and Carthage
PO BOX 355 Vass NC 28394
Like your local clinic, I charge a standard exam fee unless your location requires extended travel beyond my normal service area.
Euthanasia fees range from $250-$360
Non-private cremation fees range from $95-$130
Private cremation fees range from $250-$350
| Hospice Consultation | $155.00 |
| Senior Pet House Call | $140.00 |
| Additional Pet (Same Visit) | $75.00 |
| Senior Bloodwork | $165.00 |
| Cancer Screening (Blood Test) | $210.00 |
| Extended Travel Fee | $60.00 |
You can easily arrange a visit with me using my online scheduling system. Simply request your preferred appointment time online or by calling, and I'll confirm the visit based on availability. When you schedule your visit, you'll be asked questions about your pet to ensure we coordinate care that fits your schedule while allowing me to prepare properly for your pet's needs.
My visit fees are listed here on my website and discussed upfront, so there are no surprises. Before arriving at your home, I'll review your pet's medical history and any records you've provided when possible. This preparation allows me to make the most of our time together. It ensures I'm ready to address your pet's specific health needs when I arrive.
Every pet is unique, and I believe in creating individualized care plans that work best for your furry family member. My typical house call visits last approximately 45 minutes, giving us plenty of time for a thorough examination, discussion of findings, and development of a treatment plan together. Payment is conveniently handled by credit card at the visit.
I believe in maintaining open communication with my clients. You can reach me by phone, email, or text with any questions or updates about your pet's progress. I'm always eager to hear how your pet is doing! For ongoing care needs, I also offer telemedicine consultations that make follow-up appointments convenient and accessible from your home.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The COMFORT Scale | Heal House Call Veterinary</title>
<meta name="description" content="A quality of life assessment tool for pets, developed by Heal House Call Veterinary.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=DM+Serif+Display&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'DM Sans', sans-serif; background: #f8f7fc; color: #1a1a2e; min-height: 100vh; }
:root {
--blue: #00a7e0; --blue-light: #e6f6fc;
--purple: #7474c1; --purple-light: #ededf7; --purple-mid: #bbbde0;
--dark-purple: #410099;
--green: #8dcf6a; --green-light: #eef8e7;
--orange: #FF9900; --red: #eb0045; --red-light: #fde8ec;
--gray: #666; --border: #e2e0f0;
}
.app { max-width: 720px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
/* ── Header ── */
.header { text-align: center; margin-bottom: 2.5rem; }
.header-title { font-family: 'DM Serif Display', serif; font-size: 2.4rem; line-height: 1.1; margin-bottom: 0.4rem; }
.header-title .blue { color: var(--blue); }
.header-title .dp { color: var(--dark-purple); }
.header-sub { color: var(--purple); font-size: 0.95rem; font-style: italic; margin-bottom: 0.25rem; }
.header-brand { color: var(--gray); font-size: 0.85rem; font-weight: 500; letter-spacing: 0.04em; }
.header-divider { height: 3px; background: linear-gradient(90deg, var(--dark-purple), var(--blue), var(--purple)); border-radius: 2px; margin: 1.25rem auto 0; width: 80px; }
/* ── Pet name + date ── */
.pet-name-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; }
.pet-name-row label { font-size: 0.85rem; color: var(--gray); white-space: nowrap; }
.pet-name-row input { flex: 1; border: 1px solid var(--border); border-radius: 8px; padding: 0.5rem 0.75rem; font-family: 'DM Sans', sans-serif; font-size: 0.9rem; color: var(--dark-purple); background: #fff; outline: none; transition: border-color 0.15s; }
.pet-name-row input:focus { border-color: var(--purple); }
.date-display { font-size: 0.78rem; color: var(--gray); text-align: right; margin-bottom: 1.5rem; }
/* ── Intro box ── */
.intro-box { background: var(--purple-light); border-radius: 12px; padding: 1.25rem 1.5rem; margin-bottom: 2rem; border-left: 4px solid var(--purple); }
.intro-box p { font-size: 0.9rem; line-height: 1.6; color: #333; margin-bottom: 0.5rem; }
.intro-box p:last-child { margin-bottom: 0; }
.intro-box strong { color: var(--dark-purple); }
.intro-red { color: var(--red); font-weight: 600; }
/* ── Score key ── */
.score-key { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; margin-bottom: 2rem; }
.score-key-item { text-align: center; padding: 0.5rem 0.25rem; border-radius: 8px; border: 1px solid var(--border); }
.score-key-num { font-size: 1.3rem; font-weight: 600; display: block; }
.score-key-label { font-size: 0.7rem; color: var(--gray); line-height: 1.2; }
.key-1 { background: #eef8e7; } .key-1 .score-key-num { color: var(--green); }
.key-2 { background: var(--blue-light); } .key-2 .score-key-num { color: var(--blue); }
.key-3 { background: #fff8e1; } .key-3 .score-key-num { color: var(--orange); }
.key-4 { background: #fdebd0; } .key-4 .score-key-num { color: var(--orange); }
.key-5 { background: var(--red-light); } .key-5 .score-key-num { color: var(--red); }
/* ── Section cards ── */
.section-card { background: #fff; border-radius: 14px; border: 1px solid var(--border); margin-bottom: 1.25rem; overflow: hidden; transition: box-shadow 0.2s; }
.section-card:hover { box-shadow: 0 4px 20px rgba(116,116,193,0.12); }
.section-header { padding: 1rem 1.25rem 0.75rem; cursor: pointer; display: flex; align-items: center; justify-content: space-between; user-select: none; }
.section-header-left { display: flex; align-items: center; gap: 0.75rem; flex: 1; }
.section-letter { width: 42px; height: 42px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-family: 'DM Serif Display', serif; font-size: 1.4rem; color: #fff; flex-shrink: 0; }
.section-title-group { flex: 1; }
.section-title { font-size: 0.95rem; font-weight: 600; color: var(--dark-purple); line-height: 1.2; }
.section-subtitle { font-size: 0.78rem; color: var(--gray); font-style: italic; margin-top: 2px; }
.section-score-pill { font-size: 0.85rem; font-weight: 600; padding: 0.25rem 0.75rem; border-radius: 20px; min-width: 52px; text-align: center; transition: all 0.3s; margin-right: 0.5rem; }
.pill-empty { background: var(--purple-light); color: var(--purple); }
.pill-1 { background: #eef8e7; color: #3a7a1a; }
.pill-2 { background: var(--blue-light); color: #0a5a80; }
.pill-3 { background: #fff8e1; color: #8a5500; }
.pill-4 { background: #fdebd0; color: #8a3a00; }
.pill-5 { background: var(--red-light); color: var(--red); }
.chevron { transition: transform 0.25s; color: var(--purple-mid); font-size: 1rem; }
.chevron.open { transform: rotate(180deg); }
.section-body-wrap { display: none; }
.section-body-wrap.open { display: block; }
.section-body { padding: 0 1.25rem 1.25rem; }
/* ── Anchor table ── */
.anchor-table { width: 100%; border-collapse: collapse; margin-bottom: 1rem; }
.anchor-table th { font-size: 0.75rem; font-weight: 600; color: #fff; padding: 0.5rem 0.75rem; text-align: left; }
.anchor-table td { padding: 0.6rem 0.75rem; font-size: 0.82rem; vertical-align: top; }
.anchor-table tr:nth-child(even) td { background: #fafafa; }
.anchor-score { font-size: 1.2rem; font-weight: 700; text-align: center; display: block; width: 36px; }
.a1 { color: var(--green); } .a3 { color: var(--orange); } .a5 { color: var(--red); }
.anchor-label { font-weight: 600; color: var(--dark-purple); display: block; margin-bottom: 2px; }
/* ── Consider block ── */
.consider-block { margin-bottom: 1rem; }
.consider-title { font-size: 0.8rem; font-weight: 600; color: var(--purple); margin-bottom: 0.4rem; text-transform: uppercase; letter-spacing: 0.06em; }
.consider-list { list-style: none; }
.consider-list li { font-size: 0.82rem; color: #444; padding: 0.3rem 0 0.3rem 1rem; position: relative; line-height: 1.45; border-bottom: 1px solid #f5f5f5; }
.consider-list li:last-child { border-bottom: none; }
.consider-list li::before { content: '•'; color: var(--blue); position: absolute; left: 0; font-weight: 700; }
/* ── Score input ── */
.score-input-row { display: flex; align-items: center; gap: 1rem; background: var(--purple-light); border-radius: 10px; padding: 0.75rem 1rem; }
.score-input-label { font-size: 0.85rem; font-weight: 600; color: var(--dark-purple); flex: 1; }
.score-buttons { display: flex; gap: 6px; }
.score-btn { width: 36px; height: 36px; border-radius: 8px; border: 2px solid #e0ddf0; font-size: 0.95rem; font-weight: 600; cursor: pointer; transition: all 0.15s; background: #fff; color: #aaa; font-family: 'DM Sans', sans-serif; }
.score-btn:hover { transform: scale(1.1); border-color: var(--purple-mid); color: var(--dark-purple); }
.score-btn.active-1 { background: #eef8e7; border-color: var(--green); color: #3a7a1a; }
.score-btn.active-2 { background: var(--blue-light); border-color: var(--blue); color: #0a5a80; }
.score-btn.active-3 { background: #fff8e1; border-color: var(--orange); color: #8a5500; }
.score-btn.active-4 { background: #fdebd0; border-color: var(--orange); color: #8a3a00; }
.score-btn.active-5 { background: var(--red-light); border-color: var(--red); color: var(--red); }
.alert-5 { background: var(--red-light); border: 1px solid #f5b3c0; border-radius: 8px; padding: 0.5rem 0.75rem; margin-top: 0.75rem; font-size: 0.78rem; color: var(--red); font-weight: 500; }
.note-italic { font-size: 0.78rem; font-style: italic; color: var(--purple); margin-bottom: 0.75rem; padding-left: 0.5rem; border-left: 2px solid var(--purple-mid); line-height: 1.5; }
/* ── Summary panel ── */
.summary-panel { background: #fff; border-radius: 14px; border: 2px solid var(--purple-mid); padding: 1.5rem; margin-top: 2rem; box-shadow: 0 8px 32px rgba(65,0,153,0.12); }
.summary-title { font-family: 'DM Serif Display', serif; font-size: 1.4rem; margin-bottom: 1rem; }
.summary-title .blue { color: var(--blue); }
.summary-title .dp { color: var(--dark-purple); }
.summary-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; margin-bottom: 1.25rem; }
.summary-cell { text-align: center; padding: 0.5rem 0.25rem; background: var(--purple-light); border-radius: 8px; }
.summary-cell-letter { font-family: 'DM Serif Display', serif; font-size: 1.1rem; color: var(--purple); display: block; }
.summary-cell-score { font-size: 1rem; font-weight: 600; color: var(--dark-purple); display: block; }
.summary-cell-score.unset { color: #bbb; }
.total-row { display: flex; align-items: center; justify-content: space-between; background: var(--purple-light); border-radius: 10px; padding: 0.75rem 1.25rem; margin-bottom: 1rem; }
.total-label { font-weight: 600; font-size: 1rem; color: var(--dark-purple); }
.total-score { font-family: 'DM Serif Display', serif; font-size: 1.8rem; color: var(--dark-purple); }
.total-max { font-size: 0.85rem; color: var(--gray); }
.total-bar-wrap { height: 8px; background: var(--border); border-radius: 4px; margin-bottom: 1rem; overflow: hidden; }
.total-bar { height: 100%; border-radius: 4px; transition: width 0.5s ease, background 0.5s ease; }
.interpretation { border-radius: 10px; padding: 1rem 1.25rem; transition: all 0.4s; margin-bottom: 1rem; }
.interp-label { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; margin-bottom: 0.25rem; }
.interp-heading { font-size: 1rem; font-weight: 600; margin-bottom: 0.3rem; }
.interp-text { font-size: 0.84rem; line-height: 1.55; }
.interp-green { background: var(--green-light); }
.interp-green .interp-label { color: #3a7a1a; } .interp-green .interp-heading { color: #2a5a10; } .interp-green .interp-text { color: #3a5a20; }
.interp-orange { background: #fff8e1; }
.interp-orange .interp-label { color: #8a5500; } .interp-orange .interp-heading { color: #6a4000; } .interp-orange .interp-text { color: #5a3a00; }
.interp-red { background: var(--red-light); }
.interp-red .interp-label { color: var(--red); } .interp-red .interp-heading { color: #8a0028; } .interp-red .interp-text { color: #6a0020; }
.interp-empty { background: var(--purple-light); }
.interp-empty .interp-label { color: var(--purple); } .interp-empty .interp-heading { color: var(--dark-purple); } .interp-empty .interp-text { color: var(--purple); }
/* ── Buttons ── */
.btn-row { display: flex; gap: 8px; }
.reset-btn { flex: 1; padding: 0.65rem; border-radius: 8px; border: 1px solid var(--border); background: transparent; font-size: 0.82rem; color: var(--gray); cursor: pointer; transition: all 0.15s; font-family: 'DM Sans', sans-serif; }
.reset-btn:hover { background: var(--purple-light); color: var(--dark-purple); border-color: var(--purple-mid); }
.print-btn { flex: 2; padding: 0.65rem; border-radius: 8px; border: none; background: var(--dark-purple); font-size: 0.88rem; color: #fff; cursor: pointer; transition: background 0.15s; font-family: 'DM Sans', sans-serif; font-weight: 500; }
.print-btn:hover { background: var(--purple); }
/* ── Footer ── */
.footer { text-align: center; margin-top: 2.5rem; padding-top: 1.5rem; border-top: 1px solid var(--border); }
.footer-logo { font-family: 'DM Serif Display', serif; font-size: 1.1rem; color: var(--dark-purple); margin-bottom: 0.3rem; }
.footer-tagline { font-size: 0.78rem; color: var(--gray); font-style: italic; margin-bottom: 0.75rem; }
.footer-cta { display: inline-block; background: var(--blue); color: #fff; text-decoration: none; font-size: 0.82rem; font-weight: 500; padding: 0.5rem 1.25rem; border-radius: 20px; transition: background 0.15s; }
.footer-cta:hover { background: #0090c5; }
.footer-legal { font-size: 0.72rem; color: #bbb; margin-top: 1rem; line-height: 1.5; }
/* ── Print styles ── */
@media print {
body { background: #fff; }
.app { padding: 0; max-width: 100%; }
.section-body-wrap { display: block !important; }
.chevron, .btn-row, .footer-cta { display: none !important; }
.summary-panel { box-shadow: none !important; page-break-inside: avoid; }
.section-card { page-break-inside: avoid; box-shadow: none !important; }
.score-btn { border: 1px solid #ddd !important; }
.header-divider { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.section-letter, .anchor-table th, .print-btn, .reset-btn { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.intro-box, .score-key-item, .summary-cell, .total-row, .interpretation { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
}
/* ── Responsive ── */
@media (max-width: 480px) {
.header-title { font-size: 1.9rem; }
.summary-grid { grid-template-columns: repeat(7, 1fr); gap: 4px; }
.summary-cell-letter { font-size: 0.9rem; }
.summary-cell-score { font-size: 0.85rem; }
.score-buttons { gap: 4px; }
.score-btn { width: 32px; height: 32px; font-size: 0.85rem; }
}
</style>
</head>
<body>
<div class="app">
<div class="header">
<div class="header-title"><span class="dp">THE </span><span class="blue">COMFORT</span><span class="dp"> SCALE</span></div>
<div class="header-sub">A Quality of Life Assessment for Pets</div>
<div class="header-brand">HEAL HOUSE CALL VETERINARY</div>
<div class="header-divider"></div>
</div>
<div class="pet-name-row">
<label for="pet-name">Pet's name:</label>
<input type="text" id="pet-name" placeholder="Enter your pet's name..." autocomplete="off">
</div>
<div class="date-display" id="date-display"></div>
<div class="intro-box">
<p>Rate your pet in each category from <strong>1 to 5</strong>. A score of <strong>1 means no concern</strong>. A score of <strong>5 means severe concern</strong>. Scores of 2 or 4 are completely valid — a 2 means closer to no concern, a 4 means closer to severe.</p>
<p><strong>A lower total score reflects a better quality of life.</strong></p>
<p class="intro-red">A score of 5 in any single category warrants an immediate conversation with your veterinarian.</p>
</div>
<div class="score-key">
<div class="score-key-item key-1"><span class="score-key-num">1</span><span class="score-key-label">No concern</span></div>
<div class="score-key-item key-2"><span class="score-key-num">2</span><span class="score-key-label">Mild concern</span></div>
<div class="score-key-item key-3"><span class="score-key-num">3</span><span class="score-key-label">Moderate concern</span></div>
<div class="score-key-item key-4"><span class="score-key-num">4</span><span class="score-key-label">Significant concern</span></div>
<div class="score-key-item key-5"><span class="score-key-num">5</span><span class="score-key-label">Severe concern ⚑</span></div>
</div>
<div id="sections-container"></div>
<div class="summary-panel">
<div class="summary-title"><span class="blue">COMFORT</span><span class="dp"> Score Summary</span></div>
<div id="print-pet-info" style="font-size:0.82rem;color:var(--gray);margin-bottom:0.75rem;display:none;"></div>
<div class="summary-grid" id="summary-grid"></div>
<div class="total-row">
<span class="total-label">Total Score</span>
<span><span class="total-score" id="total-score">—</span> <span class="total-max">/ 35</span></span>
</div>
<div class="total-bar-wrap"><div class="total-bar" id="total-bar" style="width:0%;background:var(--purple-mid)"></div></div>
<div class="interpretation interp-empty" id="interpretation">
<div class="interp-label">Status</div>
<div class="interp-heading">Complete all sections to see your result</div>
<div class="interp-text">Score each of the seven categories above, then your total and interpretation will appear here.</div>
</div>
<div class="btn-row">
<button class="reset-btn" onclick="resetAll()">Reset</button>
<button class="print-btn" onclick="printScale()">🖶 Save / Print as PDF</button>
</div>
</div>
<div class="footer">
<div class="footer-logo">Heal House Call Veterinary</div>
<div class="footer-tagline">Compassionate veterinary care, in the comfort of your home.</div>
<a class="footer-cta" href="https://healhousecall.com" target="_blank">Book a House Call Visit</a>
<div class="footer-legal">This tool is intended to support — not replace — a conversation with your veterinarian.<br>© Heal House Call Veterinary. The COMFORT Scale was developed for use by Heal veterinarians and their clients.</div>
</div>
</div>
<script>
const categories = [
{ letter:'C', color:'#410099', title:'COMFORT | Pain Management', subtitle:'Is your pet in pain, and is that pain being managed effectively?',
anchors:[{score:1,label:'No concern',desc:'Pet appears comfortable and pain-free. No signs of distress, no whimpering, normal posture and breathing at rest.'},{score:3,label:'Moderate concern',desc:'Pain is present but partially controlled with medication. Pet is uncomfortable at times but able to rest and move.'},{score:5,label:'Severe concern',desc:'Pet appears painful despite medication — whimpering, crying, refusing to move, trembling, or panting constantly at rest.'}],
note:'Many animals instinctively hide pain. A 2 or 4 is completely valid — trust what you observe, even when it's subtle.',
questions:['Is your pet panting, whimpering, or crying when at rest — not just during activity?','Are they reluctant to move, be touched, or change positions?','Are current pain medications still working, or do they seem less effective than before?','Are they trembling, shaking, or showing a glazed or faraway expression?','Have they stopped doing things they used to enjoy because of pain or discomfort?']},
{ letter:'O', color:'#7474c1', title:'ORAL INTAKE | Eating & Drinking', subtitle:'Is your pet eating and drinking enough to sustain their body and energy?',
anchors:[{score:1,label:'No concern',desc:'Pet is eating and drinking normally with a healthy appetite and stable weight.'},{score:3,label:'Moderate concern',desc:'Pet is eating less than usual or only eating treats and special foods. Some weight loss noted. Drinking has changed.'},{score:5,label:'Severe concern',desc:'Pet is refusing food and water entirely, or vomiting frequently. Significant weight loss or muscle wasting is visible.'}],
note:null,
questions:['Has your pet's appetite changed noticeably in the last week or two?','Are they finishing their regular meals, or only picking at food — or refusing it?','Will they only eat if hand-fed or offered special treats?','Are there signs of nausea — vomiting, drooling, lip-licking, or hanging over the water bowl?','Have you noticed visible weight loss, a bony spine, or prominent ribs recently?']},
{ letter:'M', color:'#410099', title:'MOBILITY | Activity & Movement', subtitle:'Can your pet move around enough to engage with their world?',
anchors:[{score:1,label:'No concern',desc:'Pet moves freely and confidently, enjoying their normal level of physical activity without tiring quickly.'},{score:3,label:'Moderate concern',desc:'Pet can move around but tires quickly or needs encouragement. Can manage about half of their prior activity level.'},{score:5,label:'Severe concern',desc:'Pet cannot stand or walk without full assistance. Unable to reposition themselves. Stumbling, falling, or seizures may be present.'}],
note:null,
questions:['Can your pet walk across the room without stumbling, falling, or needing support?','Can they get up from a lying position on their own, or do they need to be lifted?','Are they still interested in going outside, exploring, or being in the same room as the family?','Have you noticed muscle weakness, crossed legs when standing, or limb dragging?','How quickly do they tire compared to a few months ago?']},
{ letter:'F', color:'#7474c1', title:'FREEDOM | Independence & Self-Care', subtitle:'Can your pet meet their own basic needs without constant assistance?',
anchors:[{score:1,label:'No concern',desc:'Pet can reach food and water, go to the bathroom appropriately, groom themselves, and reposition during rest — all without help.'},{score:3,label:'Moderate concern',desc:'Pet needs help with some tasks but retains meaningful independence. May need assistance going outside but doesn't soil themselves regularly.'},{score:5,label:'Severe concern',desc:'Pet is fully dependent — soiling themselves, unable to groom, cannot reach food or water, cannot reposition to avoid pressure sores.'}],
note:null,
questions:['Can your pet get to their food and water bowl on their own without getting stuck?','Are they going to the bathroom in the appropriate place, or having accidents on themselves?','Can they keep themselves clean after elimination, or do they need help?','Do they shift positions during sleep on their own, or stay in one spot risking pressure sores?','Can they navigate their normal spaces — stairs, furniture, rooms — without falling?']},
{ letter:'O', color:'#410099', title:'OWNER | Your Wellbeing & Capacity', subtitle:'Quality of life applies to you too. Your ability to provide care matters deeply.',
anchors:[{score:1,label:'No concern',desc:'You feel confident, supported, and able to comfortably meet your pet's needs without significant physical, emotional, or financial strain.'},{score:3,label:'Moderate concern',desc:'You understand your pet's condition and are managing, but it requires significant effort. Some concerns about capacity or support remain.'},{score:5,label:'Severe concern',desc:'You feel overwhelmed, exhausted, or unable to provide the care your pet needs. Lack of clarity, support, or resources is significantly affecting care.'}],
note:'This section is not about judgment — it is about honesty. Caring for a seriously ill pet is hard. Your wellbeing is part of your pet's quality of life.',
questions:['Do you have a clear understanding of your pet's diagnosis and what to expect going forward?','Are you physically able to lift, clean, medicate, and assist your pet as needed?','Do you have emotional support — from family, friends, or your veterinary team?','Are the financial costs of care manageable, or are they creating serious stress?','Is your household aligned on next steps, or is there disagreement about how to proceed?']},
{ letter:'R', color:'#7474c1', title:'REAL SELF | Personality, Spark & Engagement', subtitle:'Does your pet still feel like themselves?',
anchors:[{score:1,label:'No concern',desc:'Pet is fully engaged — greets you, shows curiosity or excitement, seeks affection, and displays their characteristic personality and quirks.'},{score:3,label:'Moderate concern',desc:'Pet still shows some interest and moments of engagement, but less frequently or with less enthusiasm than before.'},{score:5,label:'Severe concern',desc:'Pet shows little to no interest in people, their environment, or activities they once loved. May hide, withdraw, or seem confused and unresponsive.'}],
note:null,
questions:['Does your pet still greet you at the door, or look up and respond when you come home?','Do they show any interest in toys, treats, walks, or their other favorite things?','Do they still seek out affection, cuddles, or just being near family members?','Do they respond to your voice or presence the way they used to?','Does this still feel like the pet you know — or has something fundamental shifted?']},
{ letter:'T', color:'#410099', title:'TOMORROW | Good Days vs. Bad Days', subtitle:'Are the good days still outweighing the bad?',
anchors:[{score:1,label:'No concern',desc:'Nearly every day is a good day. Your pet is stable, comfortable, and enjoying life with minimal suffering.'},{score:3,label:'Moderate concern',desc:'Good and bad days are roughly equal. There are still meaningful moments, but the trend may be shifting in the wrong direction.'},{score:5,label:'Severe concern',desc:'Bad days clearly outnumber good days. Quality moments are rare. The overall trend is declining and suffering is outweighing joy.'}],
note:'Keeping a simple calendar — even just a happy face or sad face each day — can make patterns easier to see when emotions make it hard to think clearly.',
questions:['Think about the last two weeks — if you marked each day as good or bad, which would win?','Write down 3 things your pet loves most. Are they still able to enjoy any of them?','Is the overall trend improving, holding steady, or getting progressively worse?','On a bad day, how bad is it — uncomfortable, or truly suffering?','If today were their last day, would that feel too soon — or like the right time?']}
];
const scores = new Array(7).fill(null);
document.getElementById('date-display').textContent = 'Date: ' + new Date().toLocaleDateString('en-US',{year:'numeric',month:'long',day:'numeric'});
function buildSections() {
const container = document.getElementById('sections-container');
const summaryGrid = document.getElementById('summary-grid');
categories.forEach((cat, i) => {
const card = document.createElement('div');
card.className = 'section-card';
const anchorsHTML = cat.anchors.map(a => {
const cls = a.score===1?'a1':a.score===3?'a3':'a5';
return `<tr><td><span class="anchor-score ${cls}">${a.score}</span></td><td><span class="anchor-label">${a.label}</span>${a.desc}</td></tr>`;
}).join('');
const questionsHTML = cat.questions.map(q=>`<li>${q}</li>`).join('');
const noteHTML = cat.note ? `<p class="note-italic">⚑ ${cat.note}</p>` : '';
const btns = [1,2,3,4,5].map(n=>`<button class="score-btn" id="btn-${i}-${n}" onclick="setScore(${i},${n})">${n}</button>`).join('');
card.innerHTML = `
<div class="section-header" onclick="toggleSection(${i})">
<div class="section-header-left">
<div class="section-letter" style="background:${cat.color}">${cat.letter}</div>
<div class="section-title-group">
<div class="section-title">${cat.title}</div>
<div class="section-subtitle">${cat.subtitle}</div>
</div>
</div>
<span class="section-score-pill pill-empty" id="pill-${i}">—</span>
<span class="chevron" id="chev-${i}">⌄</span>
</div>
<div class="section-body-wrap" id="body-${i}">
<div class="section-body">
<table class="anchor-table">
<thead><tr><th style="background:${cat.color};width:52px">Score</th><th style="background:${cat.color}">What this looks like for your pet</th></tr></thead>
<tbody>${anchorsHTML}</tbody>
</table>
${noteHTML}
<div class="consider-block">
<div class="consider-title">Consider</div>
<ul class="consider-list">${questionsHTML}</ul>
</div>
<div class="score-input-row">
<span class="score-input-label">${cat.letter} score:</span>
<div class="score-buttons">${btns}</div>
</div>
<div id="alert-${i}" style="display:none" class="alert-5">⚑ Score of 5 — please contact your veterinarian immediately, regardless of your total score.</div>
</div>
</div>`;
container.appendChild(card);
const cell = document.createElement('div');
cell.className = 'summary-cell';
cell.innerHTML = `<span class="summary-cell-letter">${cat.letter}</span><span class="summary-cell-score unset" id="sumval-${i}">—</span>`;
summaryGrid.appendChild(cell);
});
toggleSection(0);
}
function toggleSection(i) {
const body = document.getElementById(`body-${i}`);
const chev = document.getElementById(`chev-${i}`);
body.classList.toggle('open', !body.classList.contains('open'));
chev.classList.toggle('open', !chev.classList.contains('open') !== body.classList.contains('open'));
if (body.classList.contains('open')) chev.classList.add('open');
else chev.classList.remove('open');
}
function setScore(i, val) {
scores[i] = val;
for (let n=1;n<=5;n++) {
const btn = document.getElementById(`btn-${i}-${n}`);
btn.className = n===val ? `score-btn active-${n}` : 'score-btn';
}
document.getElementById(`pill-${i}`).textContent = val;
document.getElementById(`pill-${i}`).className = `section-score-pill pill-${val}`;
document.getElementById(`sumval-${i}`).textContent = val;
document.getElementById(`sumval-${i}`).className = 'summary-cell-score';
document.getElementById(`alert-${i}`).style.display = val===5 ? 'block' : 'none';
updateTotal();
if (i < 6) { const nb = document.getElementById(`body-${i+1}`); if (!nb.classList.contains('open')) { toggleSection(i+1); } }
}
function updateTotal() {
const filled = scores.filter(s=>s!==null);
const total = filled.reduce((a,b)=>a+b,0);
const totalEl = document.getElementById('total-score');
const bar = document.getElementById('total-bar');
const interp = document.getElementById('interpretation');
if (filled.length===0) {
totalEl.textContent='—'; bar.style.width='0%';
interp.className='interpretation interp-empty';
interp.innerHTML='<div class="interp-label">Status</div><div class="interp-heading">Complete all sections to see your result</div><div class="interp-text">Score each of the seven categories above, then your total and interpretation will appear here.</div>';
return;
}
totalEl.textContent = total;
bar.style.width = Math.round((total/35)*100)+'%';
let barColor,cls,label,heading,text;
if (total<=7) { barColor='#8dcf6a';cls='interp-green';label='Quality of life is good';heading='Quality of life is good.';text='Continue current care and monitor regularly. Schedule a routine check-in with your veterinarian.'; }
else if (total<=21) { barColor='#FF9900';cls='interp-orange';label='Quality of life is declining';heading='Quality of life is declining.';text='Discuss your pet's care plan with your veterinarian. Adjustments to pain management, nutrition, or support may meaningfully improve comfort.'; }
else { barColor='#eb0045';cls='interp-red';label='Quality of life is significantly compromised';heading='Quality of life is significantly compromised.';text='A compassionate conversation about next steps — including the option of peaceful euthanasia — is appropriate. You are not alone in this. Your veterinarian is here to support you.'; }
bar.style.background = barColor;
interp.className = `interpretation ${cls}`;
interp.innerHTML = `<div class="interp-label">${label}</div><div class="interp-heading">${heading}</div><div class="interp-text">${text}</div>`;
if (scores.some(s=>s===5)) interp.innerHTML += '<div style="margin-top:0.6rem;font-size:0.78rem;font-weight:600;color:#eb0045;">⚑ One or more categories scored 5 — please contact your veterinarian immediately.</div>';
}
function resetAll() {
scores.fill(null);
for (let i=0;i<7;i++) {
for (let n=1;n<=5;n++) document.getElementById(`btn-${i}-${n}`).className='score-btn';
document.getElementById(`pill-${i}`).textContent='—';
document.getElementById(`pill-${i}`).className='section-score-pill pill-empty';
document.getElementById(`sumval-${i}`).textContent='—';
document.getElementById(`sumval-${i}`).className='summary-cell-score unset';
document.getElementById(`alert-${i}`).style.display='none';
}
updateTotal();
}
function printScale() {
const name = document.getElementById('pet-name').value.trim();
const info = document.getElementById('print-pet-info');
const date = new Date().toLocaleDateString('en-US',{year:'numeric',month:'long',day:'numeric'});
if (name) { info.textContent = 'Pet: ' + name + ' | Date: ' + date; info.style.display='block'; }
else { info.textContent = 'Date: ' + date; info.style.display='block'; }
window.print();
}
buildSections();
</script>
</body>
</html>
© 2026 Heal House Call Veterinarian™