MediCare Plus — Healthcare Assistance & Patient Support
Trusted by 12,000+ families across West Bengal & India Trusted medical help, one click away. From emergency ambulance to elderly care, home nursing to ICU support — verified caregivers, real-time tracking, and a team that picks up the phone at 3 AM.
Heart rate stable
72 bpm — patient safe
ETA: 6 minutes
Ambulance en route
Verified caregiver
Background-checked staff
Verified Staff
ID & background checked
24/7 Available
Day, night, holidays
Live Tracking
Family knows location
Hospital-grade
ICU & oxygen ready
Our Services 19 healthcare services. One trusted platform. Every service has its own dedicated booking flow. Click any card to start — emergency or routine, we’ve got you.
Emergency Response When seconds matter, we’re already on the way. ICU-equipped ambulances, oxygen-ready vehicles, and a dispatch team that confirms within 60 seconds. No paperwork delays. No “we’ll call back” excuses.
Call Ambulance Now
Basic & ICU-equipped • Avg ETA 8 min
Emergency Pickup
From home, anywhere in West Bengal
Instant Callback
Coordinator calls you in 60 seconds
Smart Features Built for families who can’t be there. Especially for NRI families and busy households — we keep you in the loop, automatically.
Live GPS Tracking Watch the ambulance approach in real time. Share the link with the whole family.
WhatsApp Updates Auto-updates to the family WhatsApp group at every step — pickup, arrival, handover.
AI Triage Priority Critical cases jump the queue. Our system reads symptoms and dispatches the right team.
Instant Callback Don’t want to type? Tap once and a coordinator calls you back within 60 seconds.
Female Caregivers Available on request — for elderly women, post-surgery patients, and family preference.
Secure Records Patient data encrypted. Only you and assigned staff can see prescriptions and history.
How it works Help is 4 taps away. No app downloads, no long forms during emergencies. Just speed.
1
Pick a service Tap any service card or use Emergency SOS.
2
Quick details Patient info, location, urgency. Takes 90 seconds.
3
Instant dispatch Verified team on the way. WhatsApp confirmation sent.
4
Live updates Track in real-time. Family stays informed automatically.
Book Service
Quick & secure — takes about 90 seconds
+
MediCare Plus
Admin Dashboard • Demo
← Back to site Operations Dashboard Live booking activity from your website. Connect a backend (Google Apps Script / Supabase) to persist data permanently.
Today’s Bookings
0
▲ Live count
Critical / Urgent
0
▲ Need immediate dispatch
Avg Response
7.2min
▼ 12% faster than last week
Recent Bookings
Auto-refreshes • 0 total
No bookings yet
Submit a test booking from the website to see it appear here in real time.
`).join('');// ============================================================
// BOOKING STATE
// ============================================================
const state = {
currentStep: 1,
totalSteps: 5,
selectedService: null,
selectedNeeds: new Set(),
bookings: [] // in-memory store; replace with backend
};// ============================================================
// MODAL CONTROL
// ============================================================
const modal = document.getElementById('hc-booking-modal');
const modalClose = document.getElementById('hc-modal-close');
const modalServiceName = document.getElementById('hc-modal-service-name');
const stepper = document.getElementById('hc-stepper');
const stepperItems = stepper.querySelectorAll('.hc-stepper-item');
const stepIndicator = document.getElementById('hc-step-indicator');
const btnNext = document.getElementById('hc-btn-next');
const btnBack = document.getElementById('hc-btn-back');
const modalFoot = document.getElementById('hc-modal-foot');
const form = document.getElementById('hc-booking-form');function openBookingModal(serviceId, isEmergency) {
state.selectedService = SERVICES.find(s => s.id === serviceId) || { id: serviceId, name: 'General Service' };
state.currentStep = 1;
state.selectedNeeds = new Set();
if (isEmergency) state.selectedNeeds.add('ambulance');
form.reset();
document.querySelectorAll('#hc-app .hc-pill.active').forEach(p => p.classList.remove('active'));
document.querySelectorAll('#hc-app .hc-level.active').forEach(l => l.classList.remove('active'));
if (isEmergency) {
const emergencyPill = document.querySelector('#hc-app .hc-pill[data-value="ambulance"]');
if (emergencyPill) emergencyPill.classList.add('active');
const criticalLevel = document.querySelector('#hc-app .hc-level[data-value="critical"]');
if (criticalLevel) {
criticalLevel.classList.add('active');
form.querySelector('[name="emergency_level"]').value = 'critical';
}
}
modalServiceName.textContent = state.selectedService.name;
showStep(1);
modal.classList.add('active');
document.body.style.overflow = 'hidden';
}function closeBookingModal() {
modal.classList.remove('active');
document.body.style.overflow = '';
}function showStep(n) {
state.currentStep = n;
document.querySelectorAll('#hc-app .hc-form-step').forEach(el => el.classList.remove('active'));
const stepEl = document.querySelector('#hc-app .hc-form-step[data-step="' + n + '"]');
if (stepEl) stepEl.classList.add('active');stepperItems.forEach((item, idx) => {
item.classList.remove('active', 'done');
if (idx + 1 < n) item.classList.add('done');
else if (idx + 1 === n) item.classList.add('active');
});if (n === 6) {
modalFoot.style.display = 'none';
} else {
modalFoot.style.display = 'flex';
stepIndicator.textContent = 'Step ' + n + ' of ' + state.totalSteps;
btnBack.style.display = n > 1 ? 'inline-flex' : 'none';
if (n === state.totalSteps) {
btnNext.innerHTML = 'Confirm Booking
';
btnNext.classList.remove('hc-btn-next');
btnNext.classList.add('hc-btn-submit');
} else {
btnNext.innerHTML = 'Continue
';
btnNext.classList.add('hc-btn-next');
btnNext.classList.remove('hc-btn-submit');
}
}
}// ============================================================
// FORM VALIDATION
// ============================================================
function validateStep(n) {
let valid = true;
document.querySelectorAll('#hc-app .hc-error-msg').forEach(el => el.textContent = '');
document.querySelectorAll('#hc-app .hc-input.hc-error, #hc-app .hc-select.hc-error').forEach(el => el.classList.remove('hc-error'));const stepEl = document.querySelector('#hc-app .hc-form-step[data-step="' + n + '"]');
if (!stepEl) return true;const required = stepEl.querySelectorAll('[required]');
required.forEach(field => {
const value = field.value.trim();
const errorEl = stepEl.querySelector('[data-error="' + field.name + '"]');
if (!value) {
valid = false;
if (field.classList.contains('hc-input') || field.classList.contains('hc-select') || field.classList.contains('hc-textarea')) {
field.classList.add('hc-error');
}
if (errorEl) errorEl.textContent = 'This field is required';
} else if (field.name === 'mobile' && !/^[0-9]{10}$/.test(value)) {
valid = false;
field.classList.add('hc-error');
if (errorEl) errorEl.textContent = 'Enter a valid 10-digit mobile';
} else if (field.name === 'age' && (parseInt(value) < 0 || parseInt(value) > 120)) {
valid = false;
field.classList.add('hc-error');
if (errorEl) errorEl.textContent = 'Enter a valid age (0-120)';
}
});return valid;
}// ============================================================
// PILL TOGGLES (multi-select)
// ============================================================
document.querySelectorAll('#hc-app [data-multi="needs"] .hc-pill').forEach(pill => {
pill.addEventListener('click', () => {
pill.classList.toggle('active');
const value = pill.dataset.value;
if (state.selectedNeeds.has(value)) state.selectedNeeds.delete(value);
else state.selectedNeeds.add(value);
form.querySelector('[name="needs"]').value = Array.from(state.selectedNeeds).join(',');
});
});// Emergency level (single-select)
document.querySelectorAll('#hc-app [data-field="emergency_level"] .hc-level').forEach(level => {
level.addEventListener('click', () => {
document.querySelectorAll('#hc-app [data-field="emergency_level"] .hc-level').forEach(l => l.classList.remove('active'));
level.classList.add('active');
form.querySelector('[name="emergency_level"]').value = level.dataset.value;
const errorEl = document.querySelector('#hc-app [data-error="emergency_level"]');
if (errorEl) errorEl.textContent = '';
});
});// File upload labels
form.querySelector('[name="patient_photo"]').addEventListener('change', e => {
const f = e.target.files[0];
if (f) document.getElementById('hc-photo-name').textContent = f.name;
});
form.querySelector('[name="prescription"]').addEventListener('change', e => {
const f = e.target.files[0];
if (f) document.getElementById('hc-rx-name').textContent = f.name;
});// Geolocation
document.getElementById('hc-locate-btn').addEventListener('click', () => {
const text = document.getElementById('hc-locate-text');
if (!navigator.geolocation) {
showToast('Geolocation not supported on this device.', 'error');
return;
}
text.textContent = 'Getting location...';
navigator.geolocation.getCurrentPosition(pos => {
const coords = pos.coords.latitude.toFixed(5) + ', ' + pos.coords.longitude.toFixed(5);
text.textContent = '✓ Location captured (' + coords + ')';
const addr = form.querySelector('[name="pickup_address"]');
addr.value = (addr.value ? addr.value + '\n' : '') + 'GPS: ' + coords;
showToast('Location captured successfully');
}, () => {
text.textContent = 'Use my live location';
showToast('Location access denied. Please type address.', 'error');
}, { timeout: 10000 });
});// ============================================================
// STEP NAVIGATION
// ============================================================
btnNext.addEventListener('click', () => {
if (state.currentStep < state.totalSteps) {
if (validateStep(state.currentStep)) showStep(state.currentStep + 1);
} else {
// Submit
if (validateStep(state.currentStep)) submitBooking();
}
});
btnBack.addEventListener('click', () => {
if (state.currentStep > 1) showStep(state.currentStep - 1);
});modalClose.addEventListener('click', closeBookingModal);
modal.addEventListener('click', e => { if (e.target === modal) closeBookingModal(); });
document.addEventListener('keydown', e => {
if (e.key === 'Escape' && modal.classList.contains('active')) closeBookingModal();
});// ============================================================
// SUBMIT BOOKING
// ============================================================
function generateBookingId() {
return 'MCP-' + Date.now().toString().slice(-6) + Math.floor(Math.random() * 100);
}async function submitBooking() {
const formData = new FormData(form);
const booking = {
id: generateBookingId(),
service_id: state.selectedService.id,
service_name: state.selectedService.name,
timestamp: new Date().toISOString(),
status: formData.get('emergency_level') === 'critical' ? 'urgent' : 'pending'
};
formData.forEach((value, key) => {
if (value instanceof File) {
if (value.name && value.size > 0) booking[key] = value.name + ' (' + Math.round(value.size / 1024) + 'KB)';
} else {
booking[key] = value;
}
});// Optional: POST to Google Apps Script backend
if (HC_CONFIG.BACKEND_URL) {
try {
await fetch(HC_CONFIG.BACKEND_URL, {
method: 'POST',
mode: 'no-cors',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(booking)
});
} catch (err) {
console.warn('Backend submit failed (showing local confirmation anyway)', err);
}
}// Save to in-memory store
state.bookings.unshift(booking);
refreshAdmin();// Show success
document.getElementById('hc-booking-id').textContent = 'Booking ID: ' + booking.id;
showStep(6);
showToast('Booking confirmed — we will call you shortly');// If critical, simulate emergency dispatch toast
if (booking.status === 'urgent') {
setTimeout(() => showToast('🚑 Ambulance dispatched. Tracking link sent via WhatsApp.'), 1200);
}
}// ============================================================
// SERVICE BUTTON CLICKS — global delegation
// ============================================================
document.getElementById('hc-app').addEventListener('click', e => {
const btn = e.target.closest('[data-service]');
if (btn) {
e.preventDefault();
const serviceId = btn.dataset.service;
const isEmergency = btn.dataset.emergency === 'true';
openBookingModal(serviceId, isEmergency);
}
});// ============================================================
// ADMIN DASHBOARD
// ============================================================
const admin = document.getElementById('hc-admin');
document.getElementById('hc-admin-toggle').addEventListener('click', e => {
e.preventDefault();
admin.classList.add('active');
refreshAdmin();
document.body.style.overflow = 'hidden';
});
document.getElementById('hc-admin-close-btn').addEventListener('click', () => {
admin.classList.remove('active');
document.body.style.overflow = '';
});function refreshAdmin() {
document.getElementById('hc-stat-today').textContent = state.bookings.length;
document.getElementById('hc-stat-urgent').textContent = state.bookings.filter(b => b.status === 'urgent').length;
document.getElementById('hc-stat-confirmed').textContent = state.bookings.filter(b => b.status === 'confirmed').length;
document.getElementById('hc-bookings-count').textContent = state.bookings.length;
document.getElementById('hc-badge-count').textContent = state.bookings.length;const list = document.getElementById('hc-bookings-list');
if (state.bookings.length === 0) {
list.innerHTML = '
No bookings yet Submit a test booking from the website to see it appear here in real time.
';
return;
}
list.innerHTML = '
ID Patient Service Phone Level Status Action ' +
state.bookings.map(b => `${b.id} ${b.patient_name || '-'}${b.age || ''} • ${b.gender || ''} ${b.service_name} ${b.mobile || '-'} ${(b.emergency_level || 'normal').toUpperCase()} ${b.status.toUpperCase()}
Approve
Reject
`).join('') + '
';
}// Admin row actions
document.getElementById('hc-bookings-list').addEventListener('click', e => {
const btn = e.target.closest('[data-action]');
if (!btn) return;
const id = btn.dataset.id;
const booking = state.bookings.find(b => b.id === id);
if (!booking) return;
if (btn.dataset.action === 'approve') {
booking.status = 'confirmed';
showToast('Booking ' + id + ' approved');
} else {
booking.status = 'rejected';
showToast('Booking ' + id + ' rejected', 'error');
}
refreshAdmin();
});// ============================================================
// TOAST
// ============================================================
const toastWrap = document.getElementById('hc-toasts');
function showToast(text, type) {
const toast = document.createElement('div');
toast.className = 'hc-toast' + (type === 'error' ? ' error' : '');
toast.innerHTML = `
${type === 'error' ? ' ' : ' '}
${text}
`;
toastWrap.appendChild(toast);
setTimeout(() => {
toast.style.transition = 'opacity 0.3s, transform 0.3s';
toast.style.opacity = '0';
toast.style.transform = 'translateX(120%)';
setTimeout(() => toast.remove(), 300);
}, 3500);
}// ============================================================
// INIT — minimum date for appointment
// ============================================================
const today = new Date().toISOString().split('T')[0];
form.querySelector('[name="appt_date"]').setAttribute('min', today);// Smooth scroll for nav links
document.querySelectorAll('#hc-app a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const href = a.getAttribute('href');
if (href.length > 1) {
const target = document.querySelector(href);
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
}
});
});console.log('%c MediCare Plus loaded ', 'background:#0D4F8C; color:white; padding:4px 8px; border-radius:4px;', state.bookings.length + ' bookings in memory');
})();