STOP THE PHONE CHAOS

See How Much Your Restaurant Saves

Your staff is drowning in phone calls. Missed orders. Angry customers. Let us show you a better way.

200+ QSRs Served 98% Accuracy 24/7 Coverage

YOUR NUMBERS

Tell Us About Your Restaurant

Slide the bars to match your situation. We’ll crunch the numbers instantly!

Phone Calls Per Day 22

How many calls does your store get daily?

Staff Hourly Rate $14/hr

What do you pay the person answering phones?

Missed Calls 20%

What percent of calls go unanswered during a rush?

Average Order Value $25

What does a typical phone order come to?

Minutes Per Call 3 min

How long does it take to take one order?

Number of Locations 1

How many stores do you operate?

YOUR SAVINGS

Here’s What You’ll Save

Total Annual Net Savings

$24.9K

After call center costs of $736/mo

$5.6K

Labor Savings/Year

Staff freed from phones

$28.1K

Recovered Revenue

From missed calls

402 hrs

Hours Saved/Year

8 hrs/week freed

18%

Accuracy Boost

Fewer wrong orders

Your Savings Breakdown

Per Day

$68

Per Month

$2,074

ROI

282%

3 orders recovered daily

That’s 90 extra orders every month you’re currently losing!

Love Your Numbers?

Download or share your savings report with your team.

Multiple Locations?

Compare savings across all your stores side-by-side

THE TRANSFORMATION

Before vs. After

Toggle to see the difference a call center makes

  • Staff juggling phones & customers
  • 20-40% of calls go unanswered
  • Wrong orders from rushed phone calls
  • Long hold times = hangups
  • Lost revenue from missed orders
  • Staff burnout & high turnover

SIMPLE AS PIE

How It Works

Five simple steps to phone call freedom

  1. 1

    Your Phone Rings

    A customer calls your restaurant to place an order.

  2. 2

    We Answer It

    Our trained agents pick up within 3 rings — every time.

  3. 3

    Order Taken Perfectly

    Using your exact menu, pricing, and specials. 98% accuracy.

  4. 4

    Sent to Your Kitchen

    Order goes straight to your POS system instantly.

  5. 5

    You Make the Food

    Your staff focuses on what they do best — cooking great food!

The Best Part?

Your customers never know the difference. They think they’re talking to someone at your restaurant. Same greeting, same menu knowledge, same great service.

DID YOU KNOW?

The Numbers Don’t Lie

Tap each card to reveal the full story

“I can’t take orders, answer the phone, AND make pizzas at the same time!”

SUCCESS STORIES

QSRs Like You Are Saving Big

Real restaurants. Real numbers. Real results.

Across All Our QSR Partners

$2.2M+Annual Savings
96%Avg Calls Caught
98%Order Accuracy

QUICK WINS

Results From Day One

  1. Day 1 Zero missed calls from the moment we go live
  2. Week 1 Staff morale improves as phone stress disappears
  3. Month 1 Measurable revenue increase from recovered orders
  4. Month 3 Full ROI achieved — everything after is pure profit

Our Promise

If you don’t see measurable improvement in your first 30 days, we’ll work with you until you do. No questions asked.

READY TO SAVE?

Let’s Turn $24,893 Into Reality

Bajco Group - Color Logo

Mary Ziola-Vega

QSR Solutions Specialist

Get Your Custom Proposal

We’ll prepare a detailed savings plan for your restaurant

' ); }function initReportButtons( root ) { var buttons = root.querySelectorAll( '[data-bjc-pdf]' );for ( var i = 0; i < buttons.length; i++ ) { ( function ( btn ) { var label = btn.querySelector( '[data-bjc-pdf-label]' ); var original = label ? label.textContent : '';btn.addEventListener( 'click', function () { var html = reportHTML( store.inputs, store.results );function flash( text, cls ) { if ( label ) { label.textContent = text; } btn.classList.add( cls ); window.setTimeout( function () { if ( label ) { label.textContent = original; } btn.classList.remove( cls ); }, 2500 ); }try { var win = window.open( '', '_blank' );if ( win ) { win.document.open(); win.document.write( html ); win.document.close(); window.setTimeout( function () { try { win.focus(); win.print(); } catch ( e ) { /* Popup closed before printing. */ } }, 700 ); } else { // Popup blocked — fall back to a file download. var blob = new window.Blob( [ html ], { type: 'text/html' } ); var url = window.URL.createObjectURL( blob ); var a = document.createElement( 'a' ); a.href = url; a.download = 'Bajco-QSR-Savings-Report.html'; document.body.appendChild( a ); a.click(); document.body.removeChild( a ); window.URL.revokeObjectURL( url ); }flash( 'Report ready!', 'is-success' ); } catch ( e ) { flash( 'Something went wrong — try again', 'is-error' ); } } ); } )( buttons[ i ] ); } }/* ------------------------------------------------------------------ */ /* Share */ /* ------------------------------------------------------------------ */function initShare( root ) { var buttons = root.querySelectorAll( '[data-bjc-share]' );for ( var i = 0; i < buttons.length; i++ ) { ( function ( btn ) { btn.addEventListener( 'click', function () { var r = store.results; var msg = "I just calculated that my restaurant could save " + currencyFull( r.totalAnnualSavings ) + "/year with Bajco Group's call center service!\n\nKey numbers:\n" + '- Labor savings: ' + currencyFull( r.annualLaborSavings ) + '/yr\n' + '- Recovered revenue: ' + currencyFull( r.annualRecoveredRevenue ) + '/yr\n' + '- ROI: ' + group( r.roiPercentage ) + '%\n\n' + window.location.href;var note = btn.parentNode.querySelector( '[data-bjc-share-msg]' );function say( text ) { if ( ! note ) { return; } note.textContent = text; note.hidden = false; window.setTimeout( function () { note.hidden = true; }, 3500 ); }if ( navigator.share ) { navigator .share( { title: 'My QSR Savings Report', text: msg } ) .catch( function () { /* Dismissed — nothing to do. */ } ); return; }if ( navigator.clipboard && navigator.clipboard.writeText ) { navigator.clipboard.writeText( msg ).then( function () { say( I18N.copied || 'Report copied to clipboard!' ); }, function () { say( msg.split( '\n' )[ 0 ] ); } ); } else { say( msg.split( '\n' )[ 0 ] ); } } ); } )( buttons[ i ] ); } }/* ------------------------------------------------------------------ */ /* Mailto enrichment */ /* ------------------------------------------------------------------ */function updateMailto() { var links = document.querySelectorAll( '[data-bjc-mailto]' ); if ( ! links.length ) { return; }var address = ( CFG.contact && CFG.contact.email ) || ''; var body = 'Hi,\n\nI used the Bajco Group savings calculator and my restaurant could save ' + currencyFull( store.results.totalAnnualSavings ) + '/year.\n\nHere are my numbers:\n' + '- Calls/day: ' + trimNumber( store.inputs.callsPerDay ) + '\n' + '- Locations: ' + trimNumber( store.inputs.locations ) + '\n' + '- Missed calls: ' + trimNumber( store.inputs.missedCallPercent ) + '%\n' + '- Avg order: ' + currencyFull( store.inputs.avgOrderValue ) + '\n\n' + "I'd love to learn more about your call center services.\n\nBest regards";var href = 'mailto:' + address + '?subject=' + encodeURIComponent( 'QSR Call Center Savings Inquiry' ) + '&body=' + encodeURIComponent( body );for ( var i = 0; i < links.length; i++ ) { links[ i ].href = href; } }/* ------------------------------------------------------------------ */ /* Boot */ /* ------------------------------------------------------------------ */function mount( root ) { root = root || document; initSliders( root ); initScrollButtons( root ); initReveal( root ); initBeforeAfter( root ); initExpanders( root ); initReportButtons( root ); initShare( root ); notify( true ); }store.listeners.push( function ( inputs, results, animate ) { paintSliderValues( inputs ); paintOutputs( inputs, results, animate ); updateMailto(); } );if ( document.readyState === 'loading' ) { document.addEventListener( 'DOMContentLoaded', function () { mount( document ); } ); } else { mount( document ); }// Elementor re-renders widgets in the editor preview; re-bind when it does. if ( window.jQuery ) { window.jQuery( window ).on( 'elementor/frontend/init', function () { if ( window.elementorFrontend && window.elementorFrontend.hooks ) { window.elementorFrontend.hooks.addAction( 'frontend/element_ready/global', function ( $scope ) { mount( $scope && $scope[ 0 ] ? $scope[ 0 ] : document ); } ); } } ); }/* Public API — the compare script and any custom code build on this. */ window.BajcoSavings = { calculate: calculate, format: format, currency: currency, currencyFull: currencyFull, percent: percent, group: group, trimNumber: trimNumber, store: store, setInput: setInput, mount: mount, bounds: BOUNDS, i18n: I18N }; } )();/* ==== multi-location compare tool ==== */ /** * Multi-location comparison tool. * * Up to N locations with their own sliders, combined totals, a bar chart, * ROI/savings rankings and saved comparisons. Saves live in localStorage — * no account, no server round trip. */ ( function () { 'use strict';var B = window.BajcoSavings; if ( ! B ) { return; }var CFG = window.BajcoSavingsData || {}; var I18N = B.i18n || {}; var BOUNDS = B.bounds || {}; var STORAGE_KEY = 'bajco_saved_comparisons';var COLORS = [ '#0B3F9E', '#66D6FF', '#133064', '#2BB8EE', '#1C4F9C', '#0D6B96', '#5B8FD9', '#071C42', '#9AE6FF', '#3E6FC4' ];var MEDAL = [ '#0B3F9E', '#5B8FD9', '#9AE6FF' ]; var MEDAL_BG = [ '#EEF4FF', '#F4F8FF', '#EEFAFF' ];var METRICS = [ { key: 'totalAnnualSavings', label: 'Annual Savings', format: 'currency' }, { key: 'annualLaborSavings', label: 'Labor Savings', format: 'currency' }, { key: 'annualRecoveredRevenue', label: 'Revenue Recovered', format: 'currency' }, { key: 'roiPercentage', label: 'ROI %', format: 'percent' }, { key: 'monthlySavings', label: 'Monthly Savings', format: 'currency' } ];var FIELDS = [ { key: 'callsPerDay', label: 'Phone Calls Per Day' }, { key: 'staffHourlyRate', label: 'Staff Hourly Rate', prefix: '$', suffix: '/hr' }, { key: 'missedCallPercent', label: 'Missed Calls', suffix: '%' }, { key: 'avgOrderValue', label: 'Average Order Value', prefix: '$' }, { key: 'minutesPerCall', label: 'Minutes Per Call', suffix: ' min' } ];function color( index ) { return COLORS[ index % COLORS.length ]; }/** Inline SVG for one of the icons the build injected. */ function ic( name ) { return ( window.BAJCO_ICON || {} )[ name ] || ''; }function esc( str ) { return String( str ) .replace( /&/g, '&' ) .replace( //g, '>' ) .replace( /"/g, '"' ); }function uid() { return 'loc_' + Math.random().toString( 36 ).substring( 2, 10 ) + '_' + Date.now().toString( 36 ); }function newLocation( index ) { var defaults = CFG.defaults || {}; return { id: uid(), name: 'Location ' + index, callsPerDay: Number( defaults.callsPerDay || 22 ), staffHourlyRate: Number( defaults.staffHourlyRate || 14 ), missedCallPercent: Number( defaults.missedCallPercent || 20 ), avgOrderValue: Number( defaults.avgOrderValue || 25 ), minutesPerCall: Number( defaults.minutesPerCall || 3 ) }; }/** * Each location is computed with locations: 1 — the combined totals do the * aggregating, so the multiplier must never be applied twice. */ function withResults( loc ) { var inputs = { callsPerDay: loc.callsPerDay, staffHourlyRate: loc.staffHourlyRate, missedCallPercent: loc.missedCallPercent, avgOrderValue: loc.avgOrderValue, minutesPerCall: loc.minutesPerCall, locations: 1 }; return { loc: loc, results: B.calculate( inputs ) }; }function combinedTotals( rows ) { var totals = { totalAnnualSavings: 0, totalMonthlySavings: 0, totalDailySavings: 0, totalLaborSavings: 0, totalRecoveredRevenue: 0, totalTimeSavedHours: 0, totalCallCenterCost: 0, averageROI: 0, locationCount: rows.length };if ( ! rows.length ) { return totals; }var roiSum = 0;for ( var i = 0; i < rows.length; i++ ) { var r = rows[ i ].results; totals.totalAnnualSavings += r.totalAnnualSavings; totals.totalMonthlySavings += r.monthlySavings; totals.totalDailySavings += r.dailySavings; totals.totalLaborSavings += r.annualLaborSavings; totals.totalRecoveredRevenue += r.annualRecoveredRevenue; totals.totalTimeSavedHours += r.annualTimeSavedHours; // Note: this is the monthly cost summed, matching the app. totals.totalCallCenterCost += r.callCenterCostPerMonth; roiSum += r.roiPercentage; }totals.averageROI = Math.round( roiSum / rows.length );return totals; }function readSaved() { try { var raw = JSON.parse( window.localStorage.getItem( STORAGE_KEY ) || '[]' ); return Array.isArray( raw ) ? raw : []; } catch ( e ) { return []; } }function writeSaved( list ) { try { window.localStorage.setItem( STORAGE_KEY, JSON.stringify( list ) ); } catch ( e ) { /* Quota or private mode — the UI still works for this session. */ } }/* ------------------------------------------------------------------ */ /* Instance */ /* ------------------------------------------------------------------ */function Compare( root ) { this.root = root; this.max = Number( root.getAttribute( 'data-bjc-max' ) || 10 ); this.locations = [ newLocation( 1 ), newLocation( 2 ) ]; this.activeId = null; this.tab = 'edit'; this.metric = 'totalAnnualSavings'; this.sort = 'roi';this.panels = { edit: root.querySelector( '[data-bjc-panel="edit"]' ), results: root.querySelector( '[data-bjc-panel="results"]' ), saved: root.querySelector( '[data-bjc-panel="saved"]' ) };this.nameInput = root.querySelector( '[data-bjc-compare-name]' ); this.toast = root.querySelector( '[data-bjc-toast]' );this.bindChrome(); this.render(); }Compare.prototype.flash = function ( message ) { var self = this; if ( ! this.toast ) { return; } this.toast.textContent = message; this.toast.hidden = false; window.clearTimeout( this._toastTimer ); this._toastTimer = window.setTimeout( function () { self.toast.hidden = true; }, 2500 ); };Compare.prototype.bindChrome = function () { var self = this; var tabs = this.root.querySelectorAll( '[data-bjc-tab]' );for ( var i = 0; i < tabs.length; i++ ) { ( function ( tab ) { tab.addEventListener( 'click', function () { self.tab = tab.getAttribute( 'data-bjc-tab' ); self.render(); } ); } )( tabs[ i ] ); }var newBtn = this.root.querySelector( '[data-bjc-new]' ); if ( newBtn ) { newBtn.addEventListener( 'click', function () { self.locations = [ newLocation( 1 ), newLocation( 2 ) ]; self.activeId = null; self.tab = 'edit'; if ( self.nameInput ) { self.nameInput.value = 'My Comparison'; } self.render(); } ); }var saveBtn = this.root.querySelector( '[data-bjc-save]' ); if ( saveBtn ) { saveBtn.addEventListener( 'click', function () { self.save(); } ); } };Compare.prototype.save = function () { var name = this.nameInput ? this.nameInput.value.trim() : '';if ( ! name ) { this.flash( I18N.nameRequired || 'Please give your comparison a name.' ); return; }var list = readSaved(); var rows = this.locations.map( withResults ); var record = { id: this.activeId || 'cmp_' + Date.now().toString( 36 ), name: name, locations: this.locations, totals: combinedTotals( rows ), updatedAt: new Date().toISOString() };var replaced = false; for ( var i = 0; i < list.length; i++ ) { if ( list[ i ].id === record.id ) { list[ i ] = record; replaced = true; break; } } if ( ! replaced ) { list.unshift( record ); }writeSaved( list ); this.activeId = record.id; this.flash( 'Saved “' + name + '”.' ); this.render(); };Compare.prototype.load = function ( record ) { this.locations = record.locations.slice(); this.activeId = record.id; this.tab = 'edit'; if ( this.nameInput ) { this.nameInput.value = record.name; } this.render(); this.root.scrollIntoView( { behavior: 'smooth', block: 'start' } ); };/* ---- Rendering ---- */Compare.prototype.render = function () { var rows = this.locations.map( withResults ); var totals = combinedTotals( rows );this.renderTabs(); this.renderSummary( totals );if ( this.panels.edit ) { this.panels.edit.hidden = this.tab !== 'edit'; if ( this.tab === 'edit' ) { this.renderEdit( rows ); } }if ( this.panels.results ) { this.panels.results.hidden = this.tab !== 'results'; if ( this.tab === 'results' ) { this.renderResults( rows, totals ); } }if ( this.panels.saved ) { this.panels.saved.hidden = this.tab !== 'saved'; if ( this.tab === 'saved' ) { this.renderSaved(); } }var saveWrap = this.root.querySelector( '.bjc-compare__save' ); if ( saveWrap ) { saveWrap.hidden = this.tab === 'saved'; }var saveLabel = this.root.querySelector( '[data-bjc-save-label]' ); if ( saveLabel ) { saveLabel.textContent = this.activeId ? 'Update Comparison' : 'Save Comparison'; }var count = this.root.querySelector( '[data-bjc-saved-count]' ); if ( count ) { count.textContent = String( readSaved().length ); } };Compare.prototype.renderTabs = function () { var tabs = this.root.querySelectorAll( '[data-bjc-tab]' ); for ( var i = 0; i < tabs.length; i++ ) { var active = tabs[ i ].getAttribute( 'data-bjc-tab' ) === this.tab; tabs[ i ].classList.toggle( 'is-active', active ); tabs[ i ].setAttribute( 'aria-selected', active ? 'true' : 'false' ); } };Compare.prototype.renderSummary = function ( totals ) { var cells = this.root.querySelectorAll( '[data-bjc-total]' );for ( var i = 0; i < cells.length; i++ ) { var key = cells[ i ].getAttribute( 'data-bjc-total' ); var mode = cells[ i ].getAttribute( 'data-bjc-format' ) || 'numberFull'; if ( Object.prototype.hasOwnProperty.call( totals, key ) ) { cells[ i ].textContent = B.format( totals[ key ], mode ); } } };Compare.prototype.renderEdit = function ( rows ) { var self = this; var html = '';for ( var i = 0; i < rows.length; i++ ) { html += this.locationCard( rows[ i ], i ); }html += '' + '';this.panels.edit.innerHTML = html;var addBtn = this.panels.edit.querySelector( '[data-add]' ); if ( addBtn ) { addBtn.addEventListener( 'click', function () { if ( self.locations.length >= self.max ) { self.flash( I18N.maxLocations || 'You have reached the maximum number of locations.' ); return; } self.locations.push( newLocation( self.locations.length + 1 ) ); self.render(); } ); }var goBtn = this.panels.edit.querySelector( '[data-go-results]' ); if ( goBtn ) { goBtn.addEventListener( 'click', function () { self.tab = 'results'; self.render(); } ); }this.bindLocationCards(); };Compare.prototype.locationCard = function ( row, index ) { var loc = row.loc; var c = color( index ); var sliders = '';for ( var f = 0; f < FIELDS.length; f++ ) { var field = FIELDS[ f ]; var b = BOUNDS[ field.key ] || { min: 0, max: 100, step: 1 }; var value = loc[ field.key ]; var pct = ( ( value - b.min ) / ( b.max - b.min ) ) * 100;sliders += '
' + '
' + '' + '' + esc( field.label ) + '' + '' + '' + ( field.prefix || '' ) + B.trimNumber( value ) + ( field.suffix || '' ) + '
' + '
' + '' + '
'; }return ( '
' + '
' + '' + ( index + 1 ) + '' + '' + '' + '' + '' + ( this.locations.length > 2 ? '' : '' ) + '
' + '
' + sliders + '
' + '
' + '' + 'Annual savings' + '' + B.currencyFull( row.results.totalAnnualSavings ) + '' + '' + 'ROI' + '' + B.percent( row.results.roiPercentage ) + '' + '
' ); };Compare.prototype.bindLocationCards = function () { var self = this; var cards = this.panels.edit.querySelectorAll( '[data-loc]' );for ( var i = 0; i < cards.length; i++ ) { ( function ( card ) { var id = card.getAttribute( 'data-loc' );function find() { for ( var n = 0; n < self.locations.length; n++ ) { if ( self.locations[ n ].id === id ) { return self.locations[ n ]; } } return null; }var nameField = card.querySelector( '[data-name]' ); if ( nameField ) { nameField.addEventListener( 'input', function () { var loc = find(); if ( loc ) { loc.name = nameField.value; } } ); }var ranges = card.querySelectorAll( '[data-field]' ); for ( var r = 0; r < ranges.length; r++ ) { ( function ( range ) { range.addEventListener( 'input', function () { var loc = find(); if ( ! loc ) { return; } loc[ range.getAttribute( 'data-field' ) ] = Number( range.value ); self.render(); } ); } )( ranges[ r ] ); }var toggle = card.querySelector( '[data-toggle]' ); var body = card.querySelector( '[data-body]' ); if ( toggle && body ) { toggle.addEventListener( 'click', function () { body.hidden = ! body.hidden; toggle.innerHTML = ic( body.hidden ? 'chevron-down' : 'chevron-up' ); } ); }var dup = card.querySelector( '[data-duplicate]' ); if ( dup ) { dup.addEventListener( 'click', function () { if ( self.locations.length >= self.max ) { self.flash( I18N.maxLocations || 'You have reached the maximum number of locations.' ); return; } var loc = find(); if ( ! loc ) { return; } var copy = JSON.parse( JSON.stringify( loc ) ); copy.id = uid(); copy.name = loc.name + ' (Copy)'; self.locations.push( copy ); self.render(); } ); }var remove = card.querySelector( '[data-remove]' ); if ( remove ) { remove.addEventListener( 'click', function () { if ( self.locations.length <= 2 ) { return; } if ( ! window.confirm( I18N.confirmRemove || 'Remove this location?' ) ) { return; } self.locations = self.locations.filter( function ( l ) { return l.id !== id; } ); self.render(); } ); } } )( cards[ i ] ); } };Compare.prototype.renderResults = function ( rows, totals ) { var self = this;this.panels.results.innerHTML = this.combinedBlock( totals ) + this.chartBlock( rows ) + this.rankingBlock( rows ) + this.detailsBlock( rows );var chips = this.panels.results.querySelectorAll( '[data-metric]' ); for ( var i = 0; i < chips.length; i++ ) { ( function ( chip ) { chip.addEventListener( 'click', function () { self.metric = chip.getAttribute( 'data-metric' ); self.render(); } ); } )( chips[ i ] ); }var sorts = this.panels.results.querySelectorAll( '[data-sort]' ); for ( var s = 0; s < sorts.length; s++ ) { ( function ( btn ) { btn.addEventListener( 'click', function () { self.sort = btn.getAttribute( 'data-sort' ); self.render(); } ); } )( sorts[ s ] ); } };Compare.prototype.combinedBlock = function ( t ) { function item( label, value ) { return ( '
' + '' + label + '' + '' + value + '
' ); }return ( '
' + '

Combined Totals

' + '

' + t.locationCount + ' locations combined

' + '
' + item( 'Annual Savings', B.currencyFull( t.totalAnnualSavings ) ) + item( 'Monthly Savings', B.currencyFull( t.totalMonthlySavings ) ) + item( 'Daily Savings', B.currencyFull( t.totalDailySavings ) ) + item( 'Labor Savings', B.currencyFull( t.totalLaborSavings ) ) + item( 'Revenue Recovered', B.currencyFull( t.totalRecoveredRevenue ) ) + item( 'Hours Saved/Yr', B.group( t.totalTimeSavedHours ) ) + '
' + '
' + '
Call Center Cost' + '' + B.currencyFull( t.totalCallCenterCost ) + '/mo
' + '' + '
Average ROI' + '' + B.percent( t.averageROI ) + '
' + '
' ); };Compare.prototype.chartBlock = function ( rows ) { if ( ! rows.length ) { return ''; }var self = this; var metric = METRICS.filter( function ( m ) { return m.key === self.metric; } )[ 0 ] || METRICS[ 0 ];var values = rows.map( function ( r ) { return r.results[ metric.key ]; } ); var max = Math.max.apply( null, values.concat( [ 1 ] ) ); var bestIndex = values.indexOf( Math.max.apply( null, values ) );var chips = ''; for ( var m = 0; m < METRICS.length; m++ ) { chips += ''; }var bars = ''; for ( var i = 0; i < rows.length; i++ ) { var c = color( i ); var width = Math.max( ( values[ i ] / max ) * 100, 2 );bars += '
' + '' + '' + esc( rows[ i ].loc.name ) + '' + '' + B.format( values[ i ], metric.format ) + '
' + '
'; }var insight = ''; if ( rows.length >= 2 ) { insight = '

' + ic( 'lightbulb' ) + '' + esc( rows[ bestIndex ].loc.name ) + ' has the highest ' + metric.label.toLowerCase() + ' at ' + B.format( values[ bestIndex ], metric.format ) + '

'; }return ( '
' + ic( 'bar-chart-3' ) + '

Side-by-Side Comparison

' + '
' + chips + '
' + '
' + bars + '
' + insight + '
' ); };Compare.prototype.rankingBlock = function ( rows ) { if ( rows.length < 2 ) { return ''; }var self = this; var ranked = rows.slice().sort( function ( a, b ) { return self.sort === 'roi' ? b.results.roiPercentage - a.results.roiPercentage : b.results.totalAnnualSavings - a.results.totalAnnualSavings; } );var list = ''; for ( var i = 0; i < ranked.length; i++ ) { var row = ranked[ i ]; var original = rows.indexOf( row ); var c = color( original ); var isTop = i < 3; var medal = isTop ? MEDAL[ i ] : '#8D95A1'; var bg = isTop ? MEDAL_BG[ i ] : '#F8F8F8';var metricHtml = this.sort === 'roi' ? '' + B.percent( row.results.roiPercentage ) + '' + 'ROI' : '' + B.currency( row.results.totalAnnualSavings ) + '' + '/year';list += '
' + '#' + ( i + 1 ) + '' + '
' + '' + '' + esc( row.loc.name ) + '' + '' + B.trimNumber( row.loc.callsPerDay ) + ' calls/day · ' + B.trimNumber( row.loc.missedCallPercent ) + '% missed' + '
' + metricHtml + '
'; }var best = ranked[ 0 ]; var worst = ranked[ ranked.length - 1 ]; var gap = Math.abs( best.results.totalAnnualSavings - worst.results.totalAnnualSavings );return ( '
' + ic( 'trophy' ) + '

Location Rankings

' + '
' + '' + '' + '
' + list + '

' + ic( 'activity' ) + 'Opportunity Gap

' + '

If ' + esc( worst.loc.name ) + ' performed like ' + esc( best.loc.name ) + ', you could save an additional ' + B.currencyFull( gap ) + '/year.

' + '
' ); };Compare.prototype.detailsBlock = function ( rows ) { var html = '
' + ic( 'list' ) + '

Location Details

';function cell( label, value, tone ) { return ( '' + '' + label + '' + '' + value + '' ); }for ( var i = 0; i < rows.length; i++ ) { var r = rows[ i ].results; var c = color( i );html += '
' + '
' + '' + esc( rows[ i ].loc.name ) + '
' + '
' + cell( 'Annual', B.currencyFull( r.totalAnnualSavings ), 'var(--bjc-success)' ) + cell( 'Monthly', B.currencyFull( r.monthlySavings ), 'var(--bjc-primary)' ) + cell( 'ROI', B.percent( r.roiPercentage ), 'var(--bjc-accent-dark)' ) + cell( 'Labor', B.currencyFull( r.annualLaborSavings ) ) + cell( 'Revenue', B.currencyFull( r.annualRecoveredRevenue ) ) + cell( 'Hours/Yr', B.group( r.annualTimeSavedHours ) ) + '
'; }return html; };Compare.prototype.renderSaved = function () { var self = this; var list = readSaved();if ( ! list.length ) { this.panels.saved.innerHTML = '
' + ic( 'folder-open' ) + 'No saved comparisons yet' + 'Configure your locations and tap “Save Comparison” to save.
'; return; }var html = ''; for ( var i = 0; i < list.length; i++ ) { var record = list[ i ]; var when = new Date( record.updatedAt ); var stamp = isNaN( when.getTime() ) ? '' : when.toLocaleDateString();html += '
' + '' + '' + '' + B.currency( ( record.totals && record.totals.totalAnnualSavings ) || 0 ) + '' + '' + '
'; }this.panels.saved.innerHTML = html;var items = this.panels.saved.querySelectorAll( '[data-record]' ); for ( var n = 0; n < items.length; n++ ) { ( function ( item ) { var id = item.getAttribute( 'data-record' );item.querySelector( '[data-open]' ).addEventListener( 'click', function () { var saved = readSaved(); for ( var k = 0; k < saved.length; k++ ) { if ( saved[ k ].id === id ) { self.load( saved[ k ] ); return; } } } );item.querySelector( '[data-delete]' ).addEventListener( 'click', function () { if ( ! window.confirm( I18N.confirmDelete || 'Delete this saved comparison?' ) ) { return; } writeSaved( readSaved().filter( function ( r ) { return r.id !== id; } ) ); if ( self.activeId === id ) { self.activeId = null; } self.render(); } ); } )( items[ n ] ); } };/* ------------------------------------------------------------------ */ /* Boot */ /* ------------------------------------------------------------------ */function mountCompare( root ) { root = root || document; var nodes = root.querySelectorAll( '[data-bjc-compare]' );for ( var i = 0; i < nodes.length; i++ ) { if ( ! nodes[ i ].getAttribute( 'data-bjc-ready' ) ) { nodes[ i ].setAttribute( 'data-bjc-ready', '1' ); new Compare( nodes[ i ] ); } } }if ( document.readyState === 'loading' ) { document.addEventListener( 'DOMContentLoaded', function () { mountCompare( document ); } ); } else { mountCompare( document ); }if ( window.jQuery ) { window.jQuery( window ).on( 'elementor/frontend/init', function () { if ( window.elementorFrontend && window.elementorFrontend.hooks ) { window.elementorFrontend.hooks.addAction( 'frontend/element_ready/global', function ( $scope ) { mountCompare( $scope && $scope[ 0 ] ? $scope[ 0 ] : document ); } ); } } ); }window.BajcoCompare = { mount: mountCompare }; } )();/* ==== static build glue: Elementor form bridge, mailto fallback ==== */ /** * Page glue for the static build. * * 1. Elementor Pro form bridge — if an Elementor form exists anywhere on the * page, the calculator's live numbers are written into its hidden fields on * every change and again just before submit, so the lead arrives through * Elementor's own pipeline (Submissions, email, webhooks, CRM). * The built-in form is hidden and the CTA re-points at the Elementor form. * 2. No Elementor form? The built-in form opens a pre-filled mailto: so the * page is never a dead end. * 3. Compare panel toggle — the multi-location tool is an in-page section here * rather than a separate route. */ ( function () { 'use strict';var B = window.BajcoSavings; if ( ! B ) { return; }var CONTACT = ( window.BajcoSavingsData || {} ).contact || {};/* ------------------------------------------------------------------ */ /* Elementor Pro form bridge */ /* ------------------------------------------------------------------ *//** Elementor field ID -> value read out of the calculator. */ var FIELDS = { savings_summary: function ( i, r ) { return ( B.currencyFull( r.totalAnnualSavings ) + '/yr net savings — ' + B.trimNumber( i.callsPerDay ) + ' calls/day across ' + B.trimNumber( i.locations ) + ' location(s), ' + B.trimNumber( i.missedCallPercent ) + '% missed, ' + B.currencyFull( i.avgOrderValue ) + ' avg order, ' + B.trimNumber( i.minutesPerCall ) + ' min/call, ' + B.currencyFull( i.staffHourlyRate ) + '/hr staff. Labor ' + B.currencyFull( r.annualLaborSavings ) + ', recovered revenue ' + B.currencyFull( r.annualRecoveredRevenue ) + ', ROI ' + B.percent( r.roiPercentage ) + '.' ); }, annual_savings: function ( i, r ) { return B.currencyFull( r.totalAnnualSavings ); }, monthly_savings: function ( i, r ) { return B.currencyFull( r.monthlySavings ); }, daily_savings: function ( i, r ) { return B.currencyFull( r.dailySavings ); }, roi: function ( i, r ) { return B.percent( r.roiPercentage ); }, labor_savings: function ( i, r ) { return B.currencyFull( r.annualLaborSavings ); }, recovered_revenue: function ( i, r ) { return B.currencyFull( r.annualRecoveredRevenue ); }, hours_saved_year: function ( i, r ) { return B.group( r.annualTimeSavedHours ); }, orders_recovered_day: function ( i, r ) { return B.group( r.missedCallsRecoveredPerDay ); }, call_center_cost_month: function ( i, r ) { return B.currencyFull( r.callCenterCostPerMonth ); }, calls_per_day: function ( i ) { return B.trimNumber( i.callsPerDay ); }, staff_hourly_rate: function ( i ) { return B.currencyFull( i.staffHourlyRate ); }, missed_call_percent: function ( i ) { return B.trimNumber( i.missedCallPercent ) + '%'; }, avg_order_value: function ( i ) { return B.currencyFull( i.avgOrderValue ); }, minutes_per_call: function ( i ) { return B.trimNumber( i.minutesPerCall ); }, locations: function ( i ) { return B.trimNumber( i.locations ); }, page_url: function () { return window.location.href; } };function elementorForms() { return document.querySelectorAll( 'form.elementor-form' ); }/** Fills whichever mapped fields the form actually has; ignores the rest. */ function fillAll() { var forms = elementorForms(); var inputs = B.store.inputs; var results = B.store.results;for ( var f = 0; f < forms.length; f++ ) { for ( var id in FIELDS ) { if ( ! Object.prototype.hasOwnProperty.call( FIELDS, id ) ) { continue; } var field = forms[ f ].querySelector( '[name="form_fields[' + id + ']"]' ) || forms[ f ].querySelector( '#form-field-' + id ); if ( field ) { field.value = FIELDS[ id ]( inputs, results ); } } } }function initElementorBridge() { var forms = elementorForms(); if ( ! forms.length ) { return false; }fillAll(); B.store.listeners.push( fillAll );// Top the values up on the way out, in case anything re-rendered. for ( var i = 0; i < forms.length; i++ ) { forms[ i ].addEventListener( 'submit', fillAll, true ); }// Retire the built-in form; the Elementor one is the real one now. var own = document.querySelector( '[data-bjc-form]' ); if ( own ) { own.hidden = true; own.setAttribute( 'data-bjc-superseded', '1' ); }var opener = document.querySelector( '[data-bjc-form-open]' ); if ( opener ) { opener.addEventListener( 'click', function () { forms[ 0 ].scrollIntoView( { behavior: 'smooth', block: 'center' } ); var first = forms[ 0 ].querySelector( 'input:not([type="hidden"]), textarea, select' ); if ( first ) { first.focus( { preventScroll: true } ); } } ); }return true; }/* ------------------------------------------------------------------ */ /* Built-in form -> mailto fallback */ /* ------------------------------------------------------------------ */function initBuiltInForm() { var form = document.querySelector( '[data-bjc-form]' ); if ( ! form || form.getAttribute( 'data-bjc-superseded' ) ) { return; }var errorEl = form.querySelector( '[data-bjc-form-error]' ); var success = form.parentNode.querySelector( '[data-bjc-form-success]' ); var opener = document.querySelector( '[data-bjc-form-open]' );function val( name ) { var field = form.querySelector( '[name="' + name + '"]' ); return field ? field.value.trim() : ''; }function fail( message ) { if ( errorEl ) { errorEl.textContent = message; errorEl.hidden = false; } }if ( opener ) { opener.addEventListener( 'click', function () { form.hidden = false; opener.hidden = true; var first = form.querySelector( 'input[name="name"]' ); if ( first ) { first.focus(); } } ); }form.addEventListener( 'submit', function ( event ) { event.preventDefault();if ( errorEl ) { errorEl.hidden = true; }if ( val( 'website' ) ) { return; // Honeypot: a bot filled the hidden field. }var name = val( 'name' ); var email = val( 'email' ); var phone = val( 'phone' );if ( ! name || ! email || ! phone ) { fail( 'Please fill in your name, email, and phone number so we can reach you.' ); return; }if ( email.indexOf( '@' ) === -1 || email.indexOf( '.' ) === -1 ) { fail( 'Please enter a valid email address.' ); return; }var i = B.store.inputs; var r = B.store.results; var restaurant = val( 'restaurant' );var body = 'Hi ' + ( CONTACT.name || '' ) + ',\n\n' + 'I used the savings calculator and would like a proposal.\n\n' + 'Name: ' + name + '\n' + 'Restaurant: ' + ( restaurant || '(not given)' ) + '\n' + 'Email: ' + email + '\n' + 'Phone: ' + phone + '\n\n' + 'My numbers:\n' + '- Calls/day: ' + B.trimNumber( i.callsPerDay ) + '\n' + '- Staff rate: ' + B.currencyFull( i.staffHourlyRate ) + '/hr\n' + '- Missed calls: ' + B.trimNumber( i.missedCallPercent ) + '%\n' + '- Avg order: ' + B.currencyFull( i.avgOrderValue ) + '\n' + '- Minutes/call: ' + B.trimNumber( i.minutesPerCall ) + '\n' + '- Locations: ' + B.trimNumber( i.locations ) + '\n\n' + 'Estimated results:\n' + '- Net annual savings: ' + B.currencyFull( r.totalAnnualSavings ) + '\n' + '- Monthly: ' + B.currencyFull( r.monthlySavings ) + '\n' + '- Labor savings: ' + B.currencyFull( r.annualLaborSavings ) + '\n' + '- Recovered revenue: ' + B.currencyFull( r.annualRecoveredRevenue ) + '\n' + '- ROI: ' + B.percent( r.roiPercentage ) + '\n';window.location.href = 'mailto:' + ( CONTACT.email || '' ) + '?subject=' + encodeURIComponent( 'Savings calculator enquiry — ' + ( restaurant || name ) ) + '&body=' + encodeURIComponent( body );form.hidden = true; if ( success ) { success.hidden = false; success.scrollIntoView( { behavior: 'smooth', block: 'center' } ); } } ); }/* ------------------------------------------------------------------ */ /* Compare panel toggle */ /* ------------------------------------------------------------------ */function initComparePanel() { var panel = document.querySelector( '[data-bjc-compare-panel]' ); if ( ! panel ) { return; }var openers = document.querySelectorAll( '[data-bjc-compare-open]' ); for ( var i = 0; i < openers.length; i++ ) { openers[ i ].addEventListener( 'click', function () { panel.hidden = false; if ( window.BajcoCompare ) { window.BajcoCompare.mount( panel ); } panel.scrollIntoView( { behavior: 'smooth', block: 'start' } ); } ); }var closer = panel.querySelector( '[data-bjc-compare-close]' ); if ( closer ) { closer.addEventListener( 'click', function () { panel.hidden = true; var calc = document.querySelector( '.bjc-calculator' ); if ( calc ) { calc.scrollIntoView( { behavior: 'smooth', block: 'start' } ); } } ); } }/* ------------------------------------------------------------------ */function boot() { if ( ! initElementorBridge() ) { initBuiltInForm(); } initComparePanel(); }if ( document.readyState === 'loading' ) { document.addEventListener( 'DOMContentLoaded', boot ); } else { boot(); }// Elementor renders its forms after its own frontend init, so re-check once // that has run in case the form appeared late. if ( window.jQuery ) { window.jQuery( window ).on( 'elementor/frontend/init', function () { window.setTimeout( function () { if ( ! document.querySelector( '[data-bjc-superseded]' ) ) { initElementorBridge(); } }, 200 ); } ); }window.BajcoBridge = { fillAll: fillAll, fields: FIELDS }; } )();