At Bagner Law, PC, we believe every case deserves a comprehensive analysis from day one. Our initial consultations are conducted as in-depth strategy sessions where we review the specific facts of your matter to provide actionable legal guidance. To ensure we can dedicate the necessary resources to this evaluation, a professional consultation fee is required to secure your appointment. However, should you choose to retain our firm, this full amount will be credited toward your initial retainer.
Select Date & Time
Please select a date and time for your appointment
YOUR APPOINTMENT IS NOT CONFIRMED UNTIL YOU RECEIVE A NOTICE
Questions?
Call (510) 351-5345 for help.
Call (510) 351-5345 for help.
Summary
Nothing selected yet
' + selectedDate + ' at ' + formatTime12h(selectedSlot) + '
');
summary.innerHTML = lines.length ? lines.join('') : 'Nothing selected yet
';
var totalEl = root.querySelector('[data-rbbk-total]');
if (totalEl) {
if (any && total > 0) {
totalEl.style.display = '';
root.querySelector('[data-rbbk-total-amt]').textContent = '$' + (total/100).toFixed(2);
} else {
totalEl.style.display = 'none';
}
}
}
function renderCalendar() {
var y = view.getFullYear(), m = view.getMonth() + 1;
root.querySelector('.rbbk-cal-label').textContent = view.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });
fetchJson('/preview/booking-available-dates?domain=' + encodeURIComponent(DOMAIN_Q) + '&year=' + y + '&month=' + m)
.then(function(data) {
var available = (data && data.availableDates) || [];
var availSet = {}; available.forEach(function(d) { availSet[d] = true; });
var daysInMonth = new Date(y, m, 0).getDate();
var cal = root.querySelector('[data-rbbk-cal]');
cal.innerHTML = '';
for (var d = 1; d <= daysInMonth; d++) {
var ds = y + '-' + String(m).padStart(2, '0') + '-' + String(d).padStart(2, '0');
var btn = document.createElement('button');
btn.type = 'button';
btn.textContent = d;
btn.className = 'rbbk-date-btn' + (availSet[ds] ? '' : ' rbbk-unavailable');
if (availSet[ds]) {
btn.addEventListener('click', function(dateStr) {
return function() { selectDate(dateStr); };
}(ds));
} else {
btn.disabled = true;
}
cal.appendChild(btn);
}
});
}
function selectDate(dateStr) {
selectedDate = dateStr;
root.querySelector('.rbbk-date-label').textContent = dateStr;
fetchJson('/preview/booking-available-slots?domain=' + encodeURIComponent(DOMAIN_Q) + '&date=' + encodeURIComponent(dateStr))
.then(function(data) {
var slots = (data && data.slots) || [];
var grid = root.querySelector('[data-rbbk-slots]');
grid.innerHTML = '';
if (!slots.length) {
grid.innerHTML = 'No times available this day.
';
return;
}
slots.forEach(function(s) {
var btn = document.createElement('button');
btn.type = 'button'; btn.textContent = formatTime12h(s); btn.className = 'rbbk-slot-btn';
btn.addEventListener('click', function() { selectedSlot = s; renderSummary(); showStep('details'); });
grid.appendChild(btn);
});
showStep('time');
});
}
root.querySelector('[data-rbbk-prev]').addEventListener('click', function() { view.setMonth(view.getMonth() - 1); renderCalendar(); });
root.querySelector('[data-rbbk-next]').addEventListener('click', function() { view.setMonth(view.getMonth() + 1); renderCalendar(); });
var backToServiceBtn = root.querySelector('[data-rbbk-back-to-service]');
if (backToServiceBtn) backToServiceBtn.addEventListener('click', function() { showStep('service'); });
// The date step's back button goes to whichever step actually precedes
// it for THIS service -- "custom" if the currently selected service has
// questions, otherwise straight to "service" -- rather than a fixed
// target, since which step that is varies per service.
var backFromDateBtn = root.querySelector('[data-rbbk-back-from-date]');
if (backFromDateBtn) backFromDateBtn.addEventListener('click', function() {
var fields = CUSTOM_FIELDS_BY_SERVICE[serviceSelectEl && serviceSelectEl.value] || [];
showStep(fields.length ? 'custom' : 'service');
});
root.querySelector('[data-rbbk-back-to-date]').addEventListener('click', function() { showStep('date'); });
root.querySelector('[data-rbbk-back-to-time]').addEventListener('click', function() { showStep('time'); });
var serviceSelectEl = root.querySelector('[data-rbbk-service]');
if (serviceSelectEl) serviceSelectEl.addEventListener('change', function() {
extraServices = extraServices.filter(function(s) { return s.id !== serviceSelectEl.value; });
renderExtraList(); renderSummary(); updateAddBtnVisibility();
});
var customFieldsContainer = root.querySelector('[data-rbbk-custom-fields]');
function renderCustomFields(serviceId) {
if (!customFieldsContainer) return;
customFieldsContainer.innerHTML = '';
(CUSTOM_FIELDS_BY_SERVICE[serviceId] || []).forEach(function(f) {
var wrap = document.createElement('div');
wrap.className = 'rbbk-field';
var label = document.createElement('label');
label.textContent = f.label + (f.required ? '*' : '');
wrap.appendChild(label);
if (f.type === 'select') {
var sel = document.createElement('select');
sel.dataset.fieldName = f.name;
(f.options || []).forEach(function(opt) {
var o = document.createElement('option');
o.value = opt; o.textContent = opt;
sel.appendChild(o);
});
wrap.appendChild(sel);
}
customFieldsContainer.appendChild(wrap);
});
}
var customNextBtn = root.querySelector('[data-rbbk-custom-next]');
if (customNextBtn) customNextBtn.addEventListener('click', function() {
var serviceId = serviceSelectEl && serviceSelectEl.value;
var fields = CUSTOM_FIELDS_BY_SERVICE[serviceId] || [];
var answers = {};
for (var i = 0; i < fields.length; i++) {
var input = customFieldsContainer.querySelector('[data-field-name="' + fields[i].name + '"]');
var val = input ? input.value : '';
if (fields[i].required && !val) { input.focus(); return; }
answers[fields[i].name] = { label: fields[i].label, value: val };
}
customFieldAnswers = answers;
renderSummary();
showStep('date');
});
// Service step renders clickable cards instead of the (still-present,
// hidden) 
