1<!DOCTYPE html> 2<html lang="en-US"> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta name="referrer" content="no-referrer-when-downgrade"/> 7 <meta http-equiv="Content-Language" content="en">
8<script> 9window.daSessionId = function () { 10 try { 11 var match = document.cookie.match(/(?:^|; )da_sid=([0-9a-f]{32})(?:;|$)/); 12 if (match) { 13 return match[1]; 14 } 15 var bytes = new Uint8Array(16), id = '', i; 16 if (window.crypto && window.crypto.getRandomValues) { 17 window.crypto.getRandomValues(bytes); 18 } else { 19 for (i = 0; i < 16; i++) { bytes[i] = Math.floor(Math.random() * 256); } 20 } 21 for (i = 0; i < 16; i++) { id += (bytes[i] < 16 ? '0' : '') + bytes[i].toString(16); } 22 document.cookie = 'da_sid=' + id + '; path=/; SameSite=Lax' + (location.protocol === 'https:' ? '; Secure' : ''); 23 return id; 24 } catch (e) { 25 return ''; 26 } 27}; 28</script>
vendor: 1 bytes, line 28
28
29<script> 30(function () { 31 'use strict'; 32 33 var GOVERN = true; 34 var REAP = true; 35 36 // The partial can now be emitted for the listener reaper alone - in that 37 // case leave MutationObserver untouched. 38 if (!GOVERN && !REAP) { 39 return; 40 } 41 42 var Native = window.MutationObserver; 43 44 if (!Native) { 45 return; 46 } 47 48 /** 49 * Per-origin policy. Origins absent from this map are never touched. 50 * 51 * coalesce - collapse a burst of callbacks into one per animation frame, 52 * passing the accumulated records through. The vendor still 53 * sees real records, just batched. 54 * scopeTo - if the vendor tries to observe document/body/html, point it 55 * at this container instead. Falls back to the original 56 * target when the selector is not on the page. 57 * reap - disconnect this origin's previous observer when it creates 58 * a new one. For vendors that re-register per render and 59 * never clean up. 60 * sentinel - retarget to a shared sentinel node and rely on notify() to 61 * wake them once per render. Only safe for vendors that 62 * rescan the DOM themselves; see notify() below. 63 */ 64 var POLICY = { 65 'plugin.tradepending.com': { coalesce: true, reap: true }, 66 'ver.ev5.ai': { coalesce: true, scopeTo: '#srp-results' }, 67 'cdn.dg.toyota.com': { coalesce: true }, 68 'cdn.userway.org': { coalesce: true } 69 }; 70 71 var newest = {}; // origin -> most recent instance, for reap 72 var governed = []; // every governed instance, for notify() 73 var sentinel = null; 74 75 function sentinelNode() { 76 if (!sentinel) { 77 sentinel = document.createElement('div'); 78 sentinel.id = 'da-observer-sentinel'; 79 sentinel.setAttribute('aria-hidden', 'true'); 80 sentinel.style.display = 'none'; 81 (document.body || document.documentElement).appendChild(sentinel); 82 } 83 return sentinel; 84 } 85 86 function originOf(stack) { 87 var hosts = stack.match(/https?:\/\/([^\/:)\s]+)/g) || []; 88 89 for (var i = 0; i < hosts.length; i++) { 90 var host = hosts[i].replace(/^https?:\/\//, ''); 91 if (POLICY[host]) { 92 return host; 93 } 94 } 95 return null; 96 } 97 98 window.MutationObserver = function (callback) { 99 var origin; 100 101 try { 102 origin = originOf((new Error()).stack || ''); 103 } catch (e) { 104 origin = null; 105 } 106 107 // Not a governed vendor - hand back the real thing and stay out of it. 108 if (!origin) { 109 return new Native(callback); 110 } 111 112 var policy = POLICY[origin]; 113 var pending = []; 114 var queued = false; 115 var instance; 116 117 function flush() { 118 queued = false; 119 var batch = pending; 120 pending = []; 121 122 try { 123 callback.call(instance, batch, instance); 124 } catch (e) { 125 // A vendor throwing is their problem, not ours - never let it 126 // escape into the frame that triggered the mutation. 127 if (window.console && console.debug) { 128 console.debug('[observer-governor] ' + origin + ' callback threw', e); 129 } 130 } 131 } 132 133 function onRecords(records) {
134 // With GOVERN off the vendor gets its records straight through, 135 // unbatched, exactly as the native observer would deliver them. 136 if (!GOVERN || !policy.coalesce) { 137 return callback.call(instance, records, instance); 138 } 139 140 pending = pending.concat(records); 141 142 if (!queued) { 143 queued = true; 144 requestAnimationFrame(flush); 145 } 146 } 147 148 instance = new Native(onRecords); 149 150 var nativeObserve = instance.observe.bind(instance); 151 var nativeDisconnect = instance.disconnect.bind(instance); 152 153 instance.observe = function (target, options) { 154 var finalTarget = target; 155 var isWide = target === document || target === document.body 156 || target === document.documentElement; 157 158 // Retargeting is governing, not reaping. With GOVERN off the vendor 159 // observes exactly what it asked to observe. 160 if (GOVERN && policy.sentinel) { 161 finalTarget = sentinelNode(); 162 options = { attributes: true }; 163 } else if (GOVERN && policy.scopeTo && isWide) { 164 finalTarget = document.querySelector(policy.scopeTo) || target; 165 } 166 167 return nativeObserve(finalTarget, options); 168 }; 169 170 instance.disconnect = function () { 171 pending = []; 172 queued = false; 173 return nativeDisconnect(); 174 }; 175 176 // Reaping is independent of governing: this is the only behaviour that runs 177 // when REAP is on and GOVERN is off. 178 if (REAP && policy.reap && newest[origin]) { 179 try { newest[origin].disconnect(); } catch (e) {} 180 } 181 newest[origin] = instance; 182 183 governed.push({ origin: origin, instance: instance, invoke: onRecords }); 184 185 return instance; 186 }; 187 188 window.MutationObserver.prototype = Native.prototype; 189 190 /** 191 * Tell governed vendors that a render finished, instead of letting them 192 * discover it by watching thousands of nodes change. 193 * 194 * Two mechanisms, because vendors differ: 195 * 196 * 1. The sentinel. Bumping an attribute on a hidden node produces one 197 * genuine, browser-delivered record. Vendors that respond by rescanning 198 * the DOM - which is most of them - work unchanged. Preferred, because 199 * nothing is forged. 200 * 201 * 2. Synthesised records, for vendors that read addedNodes to find new 202 * content and would see nothing from the sentinel. MutationRecord is 203 * not constructible, so these are plain objects; addedNodes is a real 204 * static NodeList off the container so that vendors calling NodeList 205 * methods on it still work. This is a best-effort shim - prefer a 206 * vendor's own documented refresh API where one exists. 207 * 208 * @param {string} containerSelector element that was re-rendered 209 * @param {boolean} synthesize also hand-deliver a childList record 210 */ 211 window.DAObserverGovernor = { 212 notify: function (containerSelector, synthesize) { 213 // Inert when only reaping. Nothing is retargeted to the sentinel in 214 // that mode, and synthesising records would hand vendors notifications 215 // they would never have received natively - which is governing. 216 if (!GOVERN) { 217 return; 218 } 219 220 var node = sentinelNode(); 221 node.setAttribute('data-da-render', String(Date.now())); 222 223 if (!synthesize) { 224 return; 225 } 226 227 var container = document.querySelector(containerSelector); 228 229 if (!container) { 230 return; 231 } 232 233 var record = { 234 type: 'childList', 235 target: container, 236 addedNodes: container.querySelectorAll(':scope > *'), 237 removedNodes: container.querySelectorAll('#da-observer-sentinel'), 238 previousSibling: null, 239 nextSibling: null, 240 attributeName: null, 241 attributeNamespace: null, 242 oldValue: null 243 }; 244 245 governed.forEach(function (entry) { 246 try { entry.invoke([record]); } catch (e) {} 247 }); 248 }, 249 250 // Small surface for checking what is actually being governed at runtime. 251 inspect: function () { 252 return governed.map(function (e) { return e.origin; }); 253 } 254 }; 255})(); 256 257/** 258 * LISTENER REAP - see the header. Its own IIFE because it patches a different 259 * API for a different vendor pathology; it shares nothing with the observer 260 * work above except the stack-origin idea. 261 */ 262(function () { 263 'use strict'; 264 265 var ENABLED = true; 266 267 if (!ENABLED) { 268 return; 269 } 270 271 /** 272 * Matched as substrings of any URL in the constructor stack, so the hashed 273 * build names (dg-inline-save-heart.CFRS092E.min.js) match without pinning 274 * a hash. Add here only after measuring: the vendor must re-bind per render 275 * AND never remove - a vendor that manages its own listeners would fight 276 * this for no gain. 277 */ 278 var REAP_ORIGINS = ['dg-inline-save-heart']; 279 280 var nativeAdd = EventTarget.prototype.addEventListener; 281 var nativeRemove = EventTarget.prototype.removeEventListener; 282 283 var generation = 0; 284 var tracked = []; // { target, type, fn, opts, gen, origin } 285 var reapedTotal = 0; 286 287 // The document's own URL, for excluding inline-script stack frames below. 288 var pageUrl = location.origin + location.pathname; 289 290 function reapOrigin(stack) { 291 var urls = stack.match(/https?:\/\/[^\s)]+/g) || []; 292 293 for (var i = 0; i < urls.length; i++) { 294 // Strip query string and line:column before matching. Without this, 295 // the ?da-listener-reap-origin probe value matches ITSELF in every 296 // inline-script frame - the document URL, probe param included, is 297 // what the stack shows for inline code - and the probe then tracks 298 // every inline listener on the page. Caught by exactly that 299 // happening on the local stack: 230 of the theme's own listeners 300 // reaped in one test run. 301 var clean = urls[i].split('?')[0].replace(/:\d+:\d+\)?$/, ''); 302 303 // Inline frames report the page itself; only external script files 304 // can be a vendor. This also stops a REAP_ORIGINS entry from ever 305 // matching a path segment of the page's own URL. 306 if (clean === pageUrl) { 307 continue; 308 } 309 310 for (var j = 0; j < REAP_ORIGINS.length; j++) { 311 if (clean.indexOf(REAP_ORIGINS[j]) !== -1) { 312 return REAP_ORIGINS[j]; 313 } 314 } 315 } 316 return null; 317 } 318 319 /** 320 * Cheap attribution first: a listener bound synchronously from an external 321 * script names that script in document.currentScript, no stack parse 322 * needed - and script-evaluation time is when a page binds most of its 323 * document-level listeners, ahead of which this patch runs for ALL of 324 * them. Returns the matched origin, null for a definite "external script, 325 * not a tracked vendor" (no stack needed either), or undefined when it 326 * cannot tell - inline script or async callback, where currentScript is 327 * srcless or null - and only that case pays for new Error().stack. 328 */ 329 function currentScriptOrigin() { 330 var el = document.currentScript; 331 332 if (!el || !el.src) { 333 return undefined; 334 } 335 336 var clean = el.src.split('?')[0]; 337 338 for (var j = 0; j < REAP_ORIGINS.length; j++) { 339 if (clean.indexOf(REAP_ORIGINS[j]) !== -1) { 340 return REAP_ORIGINS[j]; 341 } 342 } 343 return null; 344 } 345 346 // Capture is part of a listener's identity to the browser, so it is part 347 // of it here too: {capture: true} and bubble registrations of the same 348 // function are different listeners. 349 function captureOf(opts) { 350 return opts === true || !!(opts && opts.capture); 351 } 352 353 EventTarget.prototype.addEventListener = function (type, fn, opts) { 354 // Document-level targets only: the pathology is the ever-growing 355 // dispatch chain on document/window, not listeners on the cards 356 // themselves - those are garbage-collected with the card. 357 if (this === document || this === window 358 || this === document.body || this === document.documentElement) { 359 var origin = currentScriptOrigin(); 360 361 if (origin === undefined) { 362 try { 363 origin = reapOrigin((new Error()).stack || ''); 364 } catch (e) { 365 origin = null; 366 } 367 } 368 369 if (origin && typeof fn === 'function') { 370 tracked.push({ target: this, type: type, fn: fn, opts: opts, gen: generation, origin: origin }); 371 } 372 } 373 return nativeAdd.call(this, type, fn, opts); 374 }; 375 376 // Vendors removing their own listeners must keep working exactly as before; 377 // drop our record so a later reap does not double-remove. The scan is 378 // gated to the four tracked targets with records present - Swiper's 379 // per-render detachEvents used to walk it for every element it touched - 380 // and matches capture, since splicing the capture record while a vendor 381 // removed its bubble twin would leave a live listener untracked forever. 382 EventTarget.prototype.removeEventListener = function (type, fn, opts) { 383 if (tracked.length !== 0 384 && (this === document || this === window 385 || this === document.body || this === document.documentElement)) { 386 for (var i = tracked.length - 1; i >= 0; i--) { 387 var t = tracked[i]; 388 if (t.target === this && t.type === type && t.fn === fn 389 && captureOf(t.opts) === captureOf(opts)) { 390 tracked.splice(i, 1); 391 break; 392 } 393 } 394 } 395 return nativeRemove.call(this, type, fn, opts); 396 }; 397 398 window.DAListenerReaper = { 399 /** 400 * Called by the theme when an SRP render settles. Keeps the newest TWO 401 * generations - the render on screen plus one back, which covers 402 * handlers a vendor adds asynchronously after its render hook fired - 403 * and removes everything older through the native removeEventListener, 404 * with the exact arguments the vendor used. 405 * 406 * Age alone is not staleness, and TWO conditions guard a removal. 407 * 408 * Generation 0 is never reaped, full stop. advance() runs at the top 409 * of the theme's settled-render handler, before the vendor is handed 410 * that render's cards, so generation 0 is what was bound before any 411 * search render completed - page-init listeners, including the 412 * delegated singleton a vendor binds once at script evaluation and 413 * never rebinds. The plain age rule removed that permanently on the 414 * shopper's second search, and the synthetic test leaker could not 415 * catch it because it has no init-time singleton. The cost of the 416 * blanket keep is that anything a vendor bound during the very first 417 * render is kept too: one render's worth of listeners held for the 418 * life of the page, against unbounded growth, which is the trade this 419 * whole mechanism exists to make. 420 * 421 * Beyond that, a record goes only when the SAME origin has bound the 422 * SAME event type in a LATER generation - the rebind that replaced 423 * it, which is the "re-binds per render" premise demanded as evidence 424 * rather than assumed. Origin+type is not listener identity and does 425 * not claim to be: a singleton bound mid-session, of the same type as 426 * a per-render batch from the same script, would still be matched by 427 * its neighbours' rebind. Generation 0 covers the case that has 428 * actually been observed in the wild; this covers the rest. 429 */ 430 advance: function () { 431 generation++; 432 433 var newestGen = {}; 434 var keep = []; 435 var i, key; 436 437 for (i = 0; i < tracked.length; i++) { 438 key = tracked[i].origin + '|' + tracked[i].type; 439 if (!(key in newestGen) || tracked[i].gen > newestGen[key]) { 440 newestGen[key] = tracked[i].gen; 441 } 442 } 443 444 for (i = 0; i < tracked.length; i++) { 445 var t = tracked[i]; 446 447 if (t.gen === 0) { 448 keep.push(t); 449 continue; 450 } 451 452 if (t.gen <= generation - 2 && newestGen[t.origin + '|' + t.type] > t.gen) { 453 try { nativeRemove.call(t.target, t.type, t.fn, t.opts); } catch (e) {} 454 reapedTotal++; 455 } else { 456 keep.push(t); 457 } 458 } 459 460 tracked = keep; 461 }, 462 463 stats: function () { 464 return { generation: generation, live: tracked.length, reaped: reapedTotal, origins: REAP_ORIGINS.slice() }; 465 } 466 }; 467})(); 468</script>
468 469<link rel="icon" href="https://bucket.dealervenom.com/assets/oem/toyota/favicon/toyota-red-favicon.ico?auto=compres&format&ixlib=php-1.2.1&width=16&w=32" sizes="32x32"><link rel="apple-touch-icon" href="https://bucket.dealervenom.com/assets/oem/toyota/favicon/toyota-red-favicon.ico?auto=compres&format&ixlib=php-1.2.1&width=16&w=180"> <meta name="viewport" content="width=device-width, initial-scale=1"> 470 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/jquery.min.js?v=1.537.43" as="script"> 471 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/globalJs.js?v=1.789.534" as="script"> 472 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/dv-events.js?v=1.789.527" as="script"> 473 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/fontawesome/webfonts/fa-light-300.subset.woff2" as="font" type="font/woff2" crossorigin> 474 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin> 475 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/fontawesome/webfonts/fa-brands-400.subset.woff2" as="font" type="font/woff2" crossorigin> 476 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/fontawesome/webfonts/fa-duotone-900.subset.woff2" as="font" type="font/woff2" crossorigin> 477
477<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/jquery.min.js?v=1.537.43"></script>
477 478
478<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/globalJs.js?v=1.789.534"></script>
478 479
479<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/dv-events.js?v=1.789.527"></script>
479 480 <!-- DV Google Tag Manager --> 481
481<script>
vendor: 555 bytes, lines 481-495
481 482 (function (w, d, s, l, i) { 483 w[l] = w[l] || []; 484 w[l].push({ 485 'gtm.start': new Date().getTime(), 486 event: 'gtm.js' 487 }); 488 var f = d.getElementsByTagName(s)[0], 489 j = d.createElement(s), 490 dl = l != 'dataLayer' ? '&l=' + l : ''; 491 j.async = true; 492 j.src = 493 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 494 f.parentNode.insertBefore(j, f); 495 })(window, document, 'script', 'dataLayer', '
495GTM-P288V3RS
vendor: 8 bytes, lines 495-496
495'); 496
496</script>
496 497 <!-- DV End Google Tag Manager -->
vendor: 72 bytes, lines 497-498
497 498 <script async src="https://www.googletagmanager.com/gtag/js?id=
498G-PZJ9P58581
vendor: 16 bytes, lines 498-499
498"></script> 499
499<script> 500
vendor: 184 bytes, lines 500-507
500window.dataLayer = window.dataLayer || []; 501 502 function gtag() { 503 dataLayer.push(arguments); 504 } 505 506 gtag('js', new Date()); 507 gtag('config', '
507G-PZJ9P58581
vendor: 20 bytes, lines 507-508
507'); 508
508gtag('config', 'G-M3B4B59Q4Z'); 509 </script>
509 510
510<script> 511 console.log("Enabling SD Analytics..."); 512 (function (s, h, i, f, t, d, g, l) { 513 s[d] = s[d] || function () { 514 (s[d].q = s[d].q || []).push(arguments) 515 }, s[d].l = 1 * new Date(); g = h.createElement(i), 516 l = h.getElementsByTagName(i)[0]; g.async = 1; g.src = f + 517 '?containerId=' + t + '&dl=' + d; l.parentNode.insertBefore(g, l) 518 })(window, document, 'script', 'https://toyota-tagging-prod.azureedge.net/scripts/sd.js', 'Toyota', 'sd'); 519 sd('create', 'TOYOTA', '37194', 'DEALERVENOM'); 520 sd('dataLayer', { 521 pageType: 'Vehicle Listing', 522 websiteTier: 'Tier 3', 523 pageBrand: 'Toyota', 524 sessionId: (window.daSessionId ? window.daSessionId() : ''), 525 language: 'en', //note(ethan): need to change this to allow translations 526 trafficType: 'Organic Search', 527 dealerZipCode: '15108', 528 dealerState: 'PA', 529 dealerCity: 'Moon Township', 530 dealerName: 'Brewer Airport Toyota', 531 dealerTda: 'CAT10', 532 siteTechnologyVersion: '2.0031', 533 userZipCode: '', //note(ethan): add user location 534 userCity: '', 535 userState: '' 536 }); 537 sd('send', 'pageview'); 538 539 if (window.location.href.includes("thank-you")) { 540 var urlSearch = new URLSearchParams(window.location.search); 541 var tradeInYear = urlSearch.get("year") || urlSearch.get("yr"); 542 var tradeInMake = urlSearch.get("make"); 543 var tradeInModel = urlSearch.get("model"); 544 var formTitle = urlSearch.get("title") || ""; 545 546 function sendThankYouFormSubmission(displayType, formVehicle, tradeIn) { 547 var payload = { 548 leadId: urlSearch.get("leadid"), 549 formType: getSDFormType(formTitle.replace("+", "")), 550 leadType: 'lead', 551 displayType: displayType, 552 events: 'formSubmission' 553 }; 554 555 if (formVehicle) { 556 payload.formVehicle = formVehicle; 557 } 558 559 if (tradeIn) { 560 payload.tradeIn = tradeIn; 561 } 562 563 sd('dataLayer', payload); 564 sd('send'); 565 } 566 567 function getThankYouTradeIn() { 568 if (!tradeInYear || !tradeInMake || !tradeInModel) { 569 return null; 570 } 571 572 return { 573 year: tradeInYear, 574 make: tradeInMake, 575 model: tradeInModel 576 }; 577 } 578 579 function requestThankYouVehicleDetails(displayType, tradeIn) { 580 $.post("/app/themes/dv-framework/ajax/sdformvehicle.php", { 581 vin: urlSearch.get("vin") 582 }).done(function (data) { 583 var parsedVehicle = null; 584 585 try { 586 parsedVehicle = JSON.parse(data); 587 } catch (error) { 588 parsedVehicle = null; 589 } 590 591 sendThankYouFormSubmission(displayType, parsedVehicle, tradeIn); 592 }).fail(function () { 593 sendThankYouFormSubmission(displayType, null, tradeIn); 594 }); 595 } 596 597 if (urlSearch.get("vin") && tradeInYear && tradeInMake && tradeInModel) { 598 requestThankYouVehicleDetails('modal', getThankYouTradeIn()); 599 } else if (urlSearch.get("vin")) { 600 requestThankYouVehicleDetails('modal', null); 601 } else if (tradeInYear && tradeInMake && tradeInModel) { 602 sendThankYouFormSubmission('in-page', null, getThankYouTradeIn()); 603 } else { 604 sendThankYouFormSubmission('in-page', null, null); 605 } 606 } else { 607 console.log("NO THANK YOU..."); 608 } 609 610 //carousel clicks sd click 611 document.addEventListener('click', function (event) { 612 var target = event.target; 613 while (target && target !== document) { 614 if (target.classList && target.classList.contains('post-dv-offers')) { 615 var assetName = target.querySelector('a').getAttribute('title'); 616 var assetPosition = target.getAttribute('data-slick-index'); 617 sd('dataLayer', { 618 events: 'carouselClick', 619 assetName: assetName, 620 assetPosition: assetPosition 621 }); 622 sd('send'); 623 break; 624 } 625 target = target.parentNode; 626 } 627 }); 628 629 </script>
629 630 631 632 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/srpCSS/algolia.css?v=1.790.370" as="style"> 633 <link rel="stylesheet" type="text/css" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/srpCSS/algolia.css?v=1.790.370"> 634 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/avgrund/avgrund.css?v=1.598.642" as="style"> 635 <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.1.25/jquery.fancybox.min.css" as="style"> 636 <!--<link rel="preload" href="https://code.jquery.com/jquery-migrate-3.4.1.min.js" as="script">--> 637 <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.1.25/jquery.fancybox.min.js" as="script"> 638 <link rel="stylesheet" type="text/css" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/avgrund/avgrund.css?v=1.598.642"> 639 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.1.25/jquery.fancybox.min.css"/> 640 <!--
640<script type="text/javascript" src="https://code.jquery.com/jquery-migrate-3.4.1.min.js"></script>
640--> 641
641<script src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.1.25/jquery.fancybox.min.js"></script>
641 642 <link rel="stylesheet" type="text/css" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/srpCSS/algolia-grid.css?v=1.763.753"> 643 644 645 646 647 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/footer.css?v=1.741.129" as="style"> 648 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/slick/slick.css?v=1.536.957" as="style"> 649 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/slick/slick-theme.css?v=1.536.959" as="style"> 650 <link rel="stylesheet" type="text/css" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/footer.css?v=1.741.129"> 651 <link rel="stylesheet" type="text/css" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/slick/slick.css?v=1.536.957"> 652 <link rel="stylesheet" type="text/css" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/slick/slick-theme.css?v=1.536.959"> 653 <!-- Redux Styling Below --> 654 655 <style> 656 header { 657 height: 75px !important; 658 } 659 660 .srp_cta:hover { 661 background-color: #000000; 662 } 663 664 .ginput_container_textarea textarea:hover { 665 border-color: #eb0a1e !important; 666 } 667 668 .primary_color, 669 .dv_button { 670 color: #eb0a1e; 671 } 672 673 .dv_button { 674 border-left: 10px solid#000000; 675 } 676 677 body .btn.dds-search { 678 background-color: #eb0a1e; 679 } 680 681 button, 682 .dv-button { 683 background: #eb0a1e; 684 color: #ffffff; 685 } 686 687 button:hover, 688 .dv-button:hover { 689 background: #000000; 690 } 691 692 .primary_background_color, 693 .gform_footer input.button, 694 .gform_page_footer input.button { 695 background-color: #eb0a1e; 696 } 697 698 .dv_button_reverse { 699 color: #eb0a1e; 700 } 701 702 .vdp-roadster-express { 703 background-color: #063497; 704 color: #ffffff !important; 705 border: 1px solid#ffcc00; 706 } 707 708 .vdp-roadster-express:hover { 709 background-color: #ffcc00; 710 color: #063497 !important; 711 border: 1px solid#063497; 712 } 713 714 .srp-roadster-express { 715 background-color: #063497; 716 color: #ffffff; 717 } 718 719 .srp-roadster-express:hover { 720 background-color: #ffcc00; 721 } 722 723 .vdp-content .award-honor, 724 .new-used, 725 .incentive-items h4, 726 .warranty-font-size-two, 727 .total-savings, 728 .map_title_bottom { 729 color: #eb0a1e; 730 } 731 732 .google-box-container-left-bottom, 733 .box-three-container, 734 .box-three-container-class { 735 background-color: #eb0a1e !important; 736 } 737 738 .google-circle { 739 background-color: #000000; 740 } 741 742 .secondary_color, 743 .map_title_top { 744 color: #000000; 745 } 746 747 .secondary_background_color {
748 background-color: #000000; 749 } 750 751 .srp_main .block-nav li { 752 background-color: #eb0a1e; 753 } 754 755 .dropbtn { 756 background-color: #eb0a1e !important; 757 color: #fff; 758 } 759 760 .gform_wrapper input:hover, 761 .ginput_container_select select:hover, 762 .address_state select:hover { 763 border-color: #eb0a1e !important; 764 } 765 766 .gform_footer input.button { 767 border: 0 !important; 768 } 769 770 .gform_footer input.button:hover { 771 border: 0 !important; 772 } 773 774 .gform_wrapper input[type=checkbox]:checked + label:before, 775 .gform_wrapper input[type=radio]:checked + label:before { 776 background-color: #eb0a1e !important; 777 } 778 779 #mobile-nav-subheader { 780 top: 75px; 781 background: #eb0a1e; 782 } 783 784 .brand-weight:hover { 785 color: #eb0a1e; 786 } 787 788 .sub-header, 789 .subheader, 790 .search-box { 791 top: 75px; 792 } 793 794 .customize-support .sub-header, 795 .customize-support .subheader { 796 top: calc(75px +32px); 797 } 798 799 .dv-sidenav { 800 background-color: #eb0a1e !important; 801 top: 75px !important; 802 height: calc(100vh - 75px); 803 } 804 805 .wpb_column a { 806 color: #eb0a1e; 807 } 808 809 .not-found-button > a:hover { 810 color: #eb0a1e !important; 811 } 812 813 814 .internal-btn button { 815 background-color: #eb0a1e !important; 816 color: #ffffff !important; 817 } 818 819 .internal-btn button:hover { 820 background-color: #000000 !important; 821 color: #ffffff !important; 822 } 823 824 .internal-btn a { 825 background-color: #eb0a1e !important; 826 color: #ffffff !important; 827 } 828 829 .internal-btn a:hover { 830 background-color: #000000 !important; 831 color: #ffffff !important; 832 } 833 834 .internal-header { 835 background: linear-gradient(rgba(32,30,30,0.99),rgba(32,30,30,0.99)); 836 } 837 838 @media screen and (max-width: 1255px) { 839 header { 840 height: 75px !important; 841 } 842 843 .sub-header, 844 .subheader { 845 top: 75px !important; 846 } 847 848 .customize-support .sub-header, 849 .customize-support .subheader { 850 top: calc(75px +86px) !important; 851 } 852 853 .customize-support .dv-sidenav { 854 top: calc(75px +86px) !important; 855 } 856 857 .customize-support #mobile-nav-subheader { 858 top: calc(75px +46px) !important; 859 } 860 861 #mobile-nav-subheader { 862 top: 75px !important; 863 } 864 865 .dv-sidenav { 866 top: 75px !important; 867 height: calc(100vh - 75px); 868 } 869 } 870 </style> 871 872 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/dv-hydrate.js?v=1.772.37" as="script"> 873
873<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/dv-hydrate.js?v=1.772.37"></script>
873 874 875 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/dv-modal-disclaimer.js?v=1.774.900" as="script"> 876
876<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/dv-modal-disclaimer.js?v=1.774.900"></script>
876 877 878 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/da-gform-loader.js?v=1.786.483" as="script"> 879
879<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/da-gform-loader.js?v=1.786.483"></script>
879 880 881 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/da-modal.js?v=1.790.314" as="script"> 882
882<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/da-modal.js?v=1.790.314"></script>
882 883 884 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/da-flyout.js?v=1.789.531" as="script"> 885
885<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/da-flyout.js?v=1.789.531"></script>
885 886 887 <link rel="preload" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" as="style"> 888 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css"/> 889 890 <link rel="preload" as="script" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"> 891
891<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
891 892 893 <link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/slick.min.js?v=1.536.999" as="script"> 894
894<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/slick.min.js?v=1.536.999"></script>
894 895 896
896<script> 897 $(document).ready(function () { 898 $('body').addClass('dv-logged-out'); 899 }); 900 </script>
900 901 902 <style> 903 :root { 904 --primary-color: #eb0a1e; 905 --secondary-color: #000000; 906 --mobile-break-point: 1255px; 907 --header-height: 75px; 908 --mobile-header-height: 75px; 909 --header-design-background-color: #ffffff; 910 --header-design-text-color: #000000; 911 --header-design-border-color: #555555; 912 --menu-design-background-color: #ffffff; 913 --menu-design-text-color: #000000; 914 --menu-design-text-hover-color: #ffffff; 915 --menu-design-background-hover-color: #eb0a1e; 916 --brand-button-color: #eb0a1e; 917 --brand-title-color: #ffffff; 918 --brand-button-hover-color: #000000; 919 --brand-title-hover-color: #ffffff; 920 --swiper-theme-color: var(--primary-color); 921 } 922 </style> 923
924<script> 925 const _COOKIENAME = "dv_alertbar"; 926 </script>
926<script> 927 sessionStorage.removeItem(_COOKIENAME); 928 window.sessionStorage; 929 </script>
929<script> 930 sessionStorage.removeItem("dv-global-modal"); 931 window.sessionStorage; 932 </script>
932<!-- This site is running CAOS: Complete Analytics Optimization Suite for Wordpress -->
932<script> 933 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 934 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 935 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 936 })(window,document,'script','https://www.brewerairporttoyota.com/app/plugins/dv-google-analytics-utm/cache/local-ga.js','ga');ga('create', '', 'auto');ga('send', 'pageview');</script>
936<title>New Toyota Cars & Trucks in Moon Township PA | Brewer Airport Toyota</title> 937<meta name='robots' content='max-image-preview:large' /> 938 939<!-- Start Dealer Alchemist - Premium SEO by: Dealer Alchemist --> 940<meta name="robots" content="noydir" /> 941<meta name="description" content="Shop new Toyota vehicles at Brewer Airport Toyota in Moon Township, PA. View real-time pricing, online deals, and buy with confidence." /> 942<meta property="og:image" content="" /> 943<meta property="og:locale" content="en_US" /> 944<meta property="og:type" content="website" /> 945<meta property="og:title" content="New Toyota Cars & Trucks in Moon Township PA | Brewer Airport Toyota" /> 946<meta property="og:description" content="Shop new Toyota vehicles at Brewer Airport Toyota in Moon Township, PA. View real-time pricing, online deals, and buy with confidence." /> 947<meta property="og:url" content="https://www.brewerairporttoyota.com/new-vehicles/" /> 948<meta property="og:site_name" content="Brewer Airport Toyota" /> 949<meta name="twitter:card" content="summary" /> 950<meta name="twitter:site" content="@BrewerToyota" /> 951<meta name="twitter:title" content="New Toyota Cars & Trucks in Moon Township PA | Brewer Airport Toyota" /> 952<meta name="twitter:description" content="Shop new Toyota vehicles at Brewer Airport Toyota in Moon Township, PA. View real-time pricing, online deals, and buy with confidence." /> 953<!-- End Dealer Alchemist - Premium SEO by: Dealer Alchemist | 0.00204s --> 954 955<link rel='dns-prefetch' href='//s.w.org' /> 956<link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='dv-team-members' href='https://www.brewerairporttoyota.com/app/plugins/dv-meet-the-team/assets/css/meet-the-team.css?ver=5.9.5' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='wp-block-library' href='https://www.brewerairporttoyota.com/wp/wp-includes/css/dist/block-library/style.min.css?ver=5.9.5' type='text/css' media='all' /><style id='global-styles-inline-css' type='text/css'> 957body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
957--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--duotone--dark-grayscale: url('#wp-duotone-dark-grayscale');--wp--preset--duotone--grayscale: url('#wp-duotone-grayscale');--wp--preset--duotone--purple-yellow: url('#wp-duotone-purple-yellow');--wp--preset--duotone--blue-red: url('#wp-duotone-blue-red');--wp--preset--duotone--midnight: url('#wp-duotone-midnight');--wp--preset--duotone--magenta-yellow: url('#wp-duotone-magenta-yellow');--wp--preset--duotone--purple-green: url('#wp-duotone-purple-green');--wp--preset--duotone--blue-orange: url('#wp-duotone-blue-orange');--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
957.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 958</style> 959<link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='auth0-widget' href='https://www.brewerairporttoyota.com/app/plugins/auth0/assets/css/main.css?ver=5.9.5' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='menu-image' href='https://www.brewerairporttoyota.com/app/plugins/dv-menu-image/menu-image.css?ver=1.1' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='dv-offers-styles' href='https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/dv-offers/dv-offers.css?ver=1.758.197' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='globalStyle' href='https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/globalStyle.css?ver=1.785.865' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='dv-modal-styles' href='https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/dv-modal/dv-modal.css?ver=1.790.321' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='ag-modal-form-styles' href='https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/ag-modal-form/ag-modal-form.css?ver=1.701.907' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='vehicle-models-menu' href='https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/vehicle-models-menu/vehicle-models-menu.css?ver=1.738.884' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='style' href='https://www.brewerairporttoyota.com/app/themes/dv-brewer-airport-toyota/style.css?ver=1.776.843' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='fontawesome' href='https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/fontawesome/css/all.min.css?ver=1.694.28' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='fontawesome-subset' href='https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/fontawesome/css/fa-subset.css?ver=1.785.828' type='text/css' media='all' /><link rel="https://api.w.org/" href="https://www.brewerairporttoyota.com/wp-json/" /><link rel="alternate" type="application/json" href="https://www.brewerairporttoyota.com/wp-json/wp/v2/pages/16" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.brewerairporttoyota.com/wp/xmlrpc.php?rsd" /> 960<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://www.brewerairporttoyota.com/wp/wp-includes/wlwmanifest.xml" /> 961<link rel="alternate" type="application/json+oembed" href="https://www.brewerairporttoyota.com/w
961p-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.brewerairporttoyota.com%2Fnew-vehicles%2F" /> 962<link rel="alternate" type="text/xml+oembed" href="https://www.brewerairporttoyota.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.brewerairporttoyota.com%2Fnew-vehicles%2F&format=xml" /> 963 <!-- Stream WordPress user activity plugin v3.6.0 --> 964<noscript><style>.vce-row-container .vcv-lozad {display: none}</style></noscript><meta name="generator" content="Powered by Visual Composer Website Builder - fast and easy-to-use drag and drop visual editor for WordPress."/><!-- HFCM by 99 Robots - Snippet # 7: GTM Header --> 965<!-- Google Tag Manager -->
966<script>
vendor: 339 bytes, lines 966-970
966(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 967new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 968j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 969'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 970})(window,document,'script','dataLayer','
970GTM-PQJDGJ
vendor: 3 bytes, line 970
970');
970</script>
970 971<!-- End Google Tag Manager --> 972<!-- /end HFCM by 99 Robots --> 973<!-- HFCM by 99 Robots - Snippet # 5: DA Google Site Verification --> 974<meta name="google-site-verification" content="qpT6PY8U997RsdekNkAIC-SDo1_ABh7KkdoD7ufFa24" /> 975<!-- /end HFCM by 99 Robots --> 976<!-- HFCM by 99 Robots - Snippet # 4: Gubagoo Chat -->
977<script src="https://cdn.gubagoo.io/toolbars/121057/loader_121057_1.js" async></script>
977 978<!-- /end HFCM by 99 Robots --> 979<!-- HFCM by 99 Robots - Snippet # 2: TradePending -->
980<script src="https://plugin.tradepending.com/v5/snap-5xkdxc73AfRPjaRBK.js"></script>
980 981<!-- /end HFCM by 99 Robots --> 982 <style type="text/css" id="wp-custom-css"> 983 /* Hide old 2024 logo */ 984img.dv-homepage-president-award-logo { 985 display: none !important; 986} 987 988/* Add new 2025 logo */ 989.ag-dealer-logo a::after { 990 content: ""; 991 width: 70px; 992 height: 70px; 993 margin-left: 10px; 994 flex: 0 0 70px; 995 background: url("https://bucket.dealeralchemist.com/brewer-airport-toyota/pres_logo_FINAL_clean.png?auto=compress%2Cformat&ixlib=php-3.3.1") center / contain no-repeat; 996} </style> 997 <style type="text/css">#wpadminbar, #wpadminbar .menupop .ab-sub-wrapper, .ab-sub-secondary, #wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {background:#2a2e35}#wpadminbar a.ab-item, #wpadminbar>#wp-toolbar span.ab-label, #wpadminbar>#wp-toolbar span.noticon, #wpadminbar .ab-icon:before,#wpadminbar .ab-item:before {color:#b7bbcc}#wpadminbar .quicklinks .menupop ul li a, #wpadminbar .quicklinks .menupop ul li a strong, #wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a {color:#b7bbcc; font-size:13px !important }#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{background:#2a2e35; color:#ffffff}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label,#wpadminbar>#wp-toolbar li.hover span.ab-label, #wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before, #wpadminbar .quicklinks .menupop .ab-sub-secondary>li .ab-item:focus a,#wpadminbar .quicklinks .menupop .ab-sub-secondary>li>a:hover {color:#ffffff}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, #wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar{color:#ffffff}#wpadminbar .menupop .ab-sub-wrapper, #wpadminbar .shortlink-input {background:#2a2e35}#wpadminbar .ab-submenu .ab-item, #wpadminbar .quicklinks .menupop ul.ab-submenu li a,#wpadminbar .quicklinks .menupop ul.ab-submenu li a.ab-item {color:#ffffff}#wpadminbar .ab-submenu .ab-item:hover, #wpadminbar .quicklinks .menupop ul.ab-submenu li a:hover,#wpadminbar .quicklinks .menupop ul.ab-submenu li a.ab-item:hover {color:#b7bbcc}.quicklinks li.wpshapere_site_title a{ outline:none; border:none;}.quicklinks li.wpshapere_site_title {width:180px !important;margin-top:3px !important;}.quicklinks li.wpshapere_site_title a{outline:none; border:none;}.quicklinks li.wpshapere_site_title a, .quicklinks li.wpshapere_site_title a:hover, .quicklinks li.wpshapere_site_title a:focus {background:url(https://bucket.dealervenom.com/assets/autogo/logos/AutoGO-Logo-White-XL.png?auto=compress%2Cformat&ixlib=php-1.2.1&w=400) 15px 3px no-repeat !important; text-indent:-9999px !important; width:auto;background-size:50%!important;}</style> 998 <link rel="canonical" href="https://www.brewerairporttoyota.com/new-vehicles/" /> 999 1000</head> 1001 1002<body class="srp_main"> 1003 <style> 1004 header { 1005 background: #ffffff } 1006 1007 header, 1008 header .ag-brand-logo, 1009 header .ag-dealer-logo, 1010 header .ag-dealer-info { 1011 border-color: #555555 } 1012 1013 header .ag-dealer-logo a, 1014 header .ag-dealer-logo h3, 1015 header .ag-dealer-info a, 1016 header .ag-dealer-nav #main_nav_menu #menu-main-nav-menu>li>a { 1017 color: #000000 !important 1018 } 1019 1020 header .ag-dealer-nav #main_nav_menu #menu-main-nav-menu>li>ul a { 1021 color: #000000 !important 1022 } 1023 1024 header .ag-dealer-nav #main_nav_menu #menu-main-nav-menu>li>ul>li.dv-submenu-model-selector .dv-submenu-dealer-models p a { 1025 color: #fff !important 1026 } 1027 1028 header .ag-dealer-nav #main_nav_menu #menu-main-nav-menu>li>ul a:hover { 1029 color: #ffffff !important 1030 } 1031 1032 header #menu-main-nav-menu li.has-sub ul { 1033 background-color: #ffffff !important; 1034 } 1035 1036 header #menu-main-nav-menu li.has-sub ul a:hover { 1037 background-color: #eb0a1e !important; 1038 color: #ffffff !important 1039 } 1040 1041 @media screen and (max-width: 1255px) { 1042 header .ag-dealer-info { 1043 border-right: 1px solid var(--header-design-border-color) 1044 } 1045 1046 header .ag-dealer-nav { 1047 display: none 1048 } 1049 1050 header .ag-dealer-logo { 1051 margin-right: auto 1052 } 1053 } 1054</style> 1055<style> 1056 .ag-top-nav { 1057 padding: 12.5px 25px; 1058 background: #000000; 1059 display: flex; 1060 display: -webkit-flex; 1061 display: -ms-flexbox; 1062 flex-flow: row nowrap; 1063 align-items: center; 1064 justify-content: flex-end; 1065 position: sticky; 1066 top: 0; 1067 z-index: 150; 1068 gap: 12.5px 1069 } 1070 1071 .ag-top-nav .ag-top-nav-item a { 1072 font-size: clamp(10px, 1vw, 12px); 1073 line-height: 100%; 1074 color: #ffffff; 1075 text-transform: uppercase; 1076 text-align: center; 1077 display: inline-block; 1078 vertical-align: center; 1079 } 1080 1081 .ag-top-nav .ag-top-nav-item span.mb-bhi-display span { 1082 font-size: clamp(10px, 1vw, 12px); 1083 line-height: 100%; 1084 color: #ffffff; 1085 text-transform: uppercase; 1086 text-align: center; 1087 display: inline-block; 1088 } 1089 1090 .ag-top-nav .ag-top-nav-item span.mb-bhi-display span b { 1091 color: #00a900; 1092 font-weight: bold; 1093 margin-right: 2px; 1094 } 1095 1096 .ag-top-nav .ag-top-nav-item span.mb-bhi-display { 1097 display: inline-block; 1098 vertical-align: top; 1099 } 1100 1101 1102 .ag-top-nav-mobile { 1103 padding: 12.5px; 1104 background: #000000; 1105 display: none; 1106 flex-flow: row nowrap; 1107 align-items: center; 1108 justify-content: center; 1109 position: sticky; 1110 top: 0; 1111 z-index: 150; 1112 gap: 12.5px 1113 } 1114 1115 .ag-top-nav-mobile .ag-top-nav-item a { 1116 font-size: clamp(9px, 1vw, 12px); 1117 line-height: 100%; 1118 color: #ffffff; 1119 text-transform: uppercase; 1120 text-align: center; 1121 display: inline-block; 1122 vertical-align: center; 1123 } 1124 1125 .ag-top-nav-mobile .ag-top-nav-item span.mb-bhi-display span { 1126 font-size: clamp(9px, 1vw, 12px); 1127 line-height: 100%; 1128 color: #ffffff; 1129 text-transform: uppercase; 1130 text-align: center; 1131 display: inline-block; 1132 } 1133 1134 .ag-top-nav-mobile .ag-top-nav-item span.mb-bhi-display span b { 1135 color: #00a900; 1136 font-weight: bold; 1137 margin-right: 2px; 1138 } 1139 1140 .ag-top-nav-mobile .ag-top-nav-item span.mb-bhi-display { 1141 display: inline-block; 1142 vertical-align: top; 1143 } 1144 1145 @media screen and (max-width: 769px) { 1146 .ag-top-nav { 1147 display: none 1148 } 1149 .ag-top-nav-mobile { 1150 display: flex; 1151 display: -webkit-flex; 1152 display: -ms-flexbox; 1153 } 1154 } 1155 1156 @media print { 1157 .ag-top-nav { 1158 display: none 1159 } 1160 .ag-top-nav-mobile { 1161 display: none; 1162 } 1163 } 1164 1165 </style> 1166 1167<header> 1168 <div class="ag-brand-logo"> 1169 <a data-ag-event="media_interaction" href="/" title="Toyota"> 1170 <img src="https://bucket.dealervenom.com/assets/oem/toyota/logos/toyota-logo-no-tagline.png?auto=compress&format&ixlib=php-1.2.1&w=41" alt="Toyota" /> 1171 </a> 1172 </div> 1173 <div class="ag-dealer-logo"> 1174 <a data-ag-event="media_interaction" href="/" title="Brewer Airport Toyota"> 1175 1176 <img class="logo-desktop" src="https://bucket.dealervenom.com/brewer-airport-toyota/logo.png?auto=compress&format&ixlib=php-1.2.1&h=50" alt="Brewer Airport Toyota" /> 1177 1178 <img class="logo-white" src="https://bucket.dealeralchemist.com/brewer-airport-toyota/brewer-logo-white-min-rev.png?auto=compress%2Cformat&ixlib=php-3.3.1&h=50" alt="Brewer Airport Toyota" /> 1179 1180 <img class="dv-homepage-president-award-logo" src="https://bucket.dealervenom.com/brewer-airport-toyota/president-award-logo.png?auto=compress&format&ixlib=php-1.2.1&h=70" alt="President's Award" /> 1181 </a> 1182 </div> 1183 <div class="ag-dealer-nav"> 1184 <nav class="ag-desktop-menu" aria-label="Desktop Menu"> 1185 <div id="main_nav_menu" class="menu-main-nav-menu-container"><ul id="menu-main-nav-menu" class="menu"><li id="menu-item-76682" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children has-sub"><a data-ag-event="menu_interaction" style="" data-element_type="" href="https://www.brewerairporttoyota.com/new-vehicles/" class="menu-image-title-after"><span class="menu-image-title">New</span></a> 1186<ul> 1187 <li id="menu-item-76683" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="/new-vehicles/" class="menu-image-title-after"><span class="menu-image-title">Shop All New</span></a></li> 1188 <li id="menu-item-76686" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="/research/" class="menu-image-title-after"><span class="menu-image-title">
1188Toyota Model Showroom</span></a></li> 1189 <li id="menu-item-76695" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="/electrified-vehicles/" class="menu-image-title-after"><span class="menu-image-title">Electrified Vehicles</span></a></li> 1190 <li id="menu-item-78074" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="https://www.brewerairporttoyota.com/value-trade/" class="menu-image-title-after"><span class="menu-image-title">Sell / Trade Your Vehicle</span></a></li> 1191 <li id="menu-item-76709" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="/incentives/" class="menu-image-title-after"><span class="menu-image-title">Toyota Incentives</span></a></li> 1192 <li id="menu-item-76693" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="/toyotacare/" class="menu-image-title-after"><span class="menu-image-title">ToyotaCare</span></a></li> 1193 <li id="menu-item-76684" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="/new-vehicles/?flags.type=Special" class="menu-image-title-after"><span class="menu-image-title">New Vehicle Specials</span></a></li> 1194 <li id="menu-item-76697" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="https://www.brewerairporttoyota.com/toyotacare-plus/" class="menu-image-title-after"><span class="menu-image-title">ToyotaCare Plus</span></a></li> 1195 <li id="menu-item-76688" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="/vehicle-finder-service/" class="menu-image-title-after"><span class="menu-image-title">Vehicle Finder Service</span></a></li> 1196 <li id="menu-item-76694" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="/toyota-safety-sense/" class="menu-image-title-after"><span class="menu-image-title">Toyota Safety Sense</span></a></li> 1197 <li id="menu-item-76718" class="dv-submenu-model-selector menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="new" href="#!" class="menu-image-title-after"><span class="menu-image-title"> 1198 <style type='text/css'> 1199 header #menu-main-nav-menu li.has-sub ul .dv-submenu-item a:hover{ background-color: #000 !important }header #menu-main-nav-menu li.has-sub ul .dv-submenu-item a:hover span{
1199color: #fff !important }header #menu-main-nav-menu li.has-sub ul .dv-submenu-item a span{ color: #fff !important }#menu-main-nav-menu .dv-submenu-model-selector .dv-vehicle-menu-scroll { color: #fff !important }header #menu-main-nav-menu li.has-sub ul .dv-submenu-model-selector{ background-color: var(--primary-color) !important } 1200 </style> 1201 <style>#menu-main-nav-menu .dv-submenu-model-selector .dv-vehicle-menu-model-wrapper { overflow-y: auto !important; max-height: 300px !important; width: 100%;}</style> 1202
1202<script> 1203 $('.dv-submenu-model-selector > a').contents().unwrap(); 1204 $('.dv-submenu-model-selector > span').contents().unwrap(); 1205 </script>
1205 1206 <div class="dv-vehicle-menu-model-wrapper no-scroll"> 1207 <div class="dv-submenu-dealer-models toyota-cars & minivans"> 1208 <p><a data-ag-event="cta_interaction" href="/new-vehicles/?make=Toyota&body=Sedan&body=Van" title="Shop Cars & Minivans" class='dv-submenu-bodystyle-link'>Cars & Minivans</a></p> 1209 <div class="dv-submenu-item-wrapper"> 1210 <div class="dv-submenu-item"> 1211 <a href="/new-vehicles/?make=Toyota&model=Corolla&model=Corolla%20Hatchback&model=Corolla%20Hybrid" title="Corolla" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1212 <div class="dv-submenu-item-img"> 1213 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/corolla-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Corolla" style="width: 50px !important"/> 1214 </div> 1215 <div class="dv-submenu-item-modelinfo"> 1216 <span class="dv-submenu-item-modelname">Corolla (7)</span> 1217 </div> 1218 </a> 1219 </div> <div class="dv-submenu-item"> 1220 <a href="/new-vehicles/?make=Toyota&model=GR Corolla" title="GR Corolla" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1221 <div class="dv-submenu-item-img"> 1222 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/gr-corolla-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="GR Corolla" style="width: 50px !important"/> 1223 </div> 1224 <div class="dv-submenu-item-modelinfo"> 1225 <span class="dv-submenu-item-modelname">GR Corolla (1)</span> 1226 </div> 1227 </a> 1228 </div> <div class="dv-submenu-item"> 1229 <a href="/research/supra/" title="GR Supra" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1230 <div class="dv-submenu-item-img"> 1231 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/supra-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="GR Supra" style="width: 50px !important"/> 1232 </div> 1233 <div class="dv-submenu-item-modelinfo"> 1234 <span class="dv-submenu-item-modelname">GR Supra (0)</span> 1235 </div> 1236 </a> 1237 </div> <div class="dv-submenu-item"> 1238 <a href="/new-vehicles/?make=Toyota&model=GR86" title="GR86" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1239 <div class="dv-submenu-item-img"> 1240 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/gr86-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="GR86" style="width: 50px !important"/> 1241 </div> 1242 <div class="dv-submenu-item-modelinfo"> 1243 <span class="dv-submenu-item-modelname">GR86 (1)</span> 1244 </div> 1245 </a> 1246 </div> <div class="dv-submenu-item"> 1247 <a href="/new-vehicles/?make=Toyota&model=Sienna" title="Sienna" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1248 <div class="dv-submenu-item-img"> 1249 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/sienna-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Sienna" style="width: 50px !important"/> 1250 </div> 1251 <div class="dv-submenu-item-modelinfo"> 1252 <span class="dv-submenu-item-modelname">Sienna (9)</span> 1253 </div> 1254 </a> 1255 </div> 1256 </div> 1257</div><div class="dv-submenu-dealer-models toyota-electrified / hybrid"> 1258 <p><a data-ag-event="cta_interaction" href="/new-vehicles/?make=Toyota&fuel=Hybrid&fuel=Electric&fuel=Battery%20Electric&fuel=Plug-in%20Hybrid" title="Shop Electrified / Hybrid" class='dv-submenu-bodystyle-link'>Electrified / Hybrid</a></p> 1259 <div class="dv-submenu-item-wrapper"> 1260 <div class="dv-submenu-item"> 1261 <a href="/new-vehicles/?make=Toyota&model=bZ" title="bZ" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1262 <div class="dv-submenu-item-img"> 1263 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/bz4x-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="bZ" style="width: 50px !important"/> 1264 </div> 1265 <div class="dv-submenu-item-modelinfo"> 1266 <span class="dv-submenu-item-modelname">bZ (2)</span> 1267 </div> 1268 </a> 1269 </div> <div class="dv-submenu-item"> 1270 <a href="/research/c-hr/" title="C-HR" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1271 <div class="dv-submenu-item-img"> 1272 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/c-hr-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="C-HR" style="width: 50px !important"/> 1273 </div> 1274 <div class="dv-submenu-item-modelinfo"> 1275 <span class="dv-submenu-item-modelname">C-HR (0)</span> 1276 </div> 1277 </a> 1278 </div> <div class="dv-submenu-item"> 1279 <a href="/new-vehicles/?make=Toyota&model=Camry" title="Camry" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1280 <div class="dv-submenu-item-img"> 1281 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/camry-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Camry" style="width: 50px !important"/> 1282 </div> 1283 <div class="dv-submenu-item-modelinfo"> 1284 <span class="dv-submenu-item-modelname">Camry (16)</span> 1285 </div> 1286 </a> 1287 </div> <div class="dv-submenu-item"> 1288 <a href="/new-vehicles/?make=Toyota&model=Crown" title="Crown" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1289 <div class="dv-submenu-item-img"> 1290 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/crown-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Crown" style="width: 50px !important"/> 1291 </div> 1292 <div class="dv-submenu-item-modelinfo"> 1293 <span class="dv-submenu-item-modelname">Crown (1)</span> 1294 </div> 1295 </a> 1296 </div> <div class="dv-submenu-item"> 1297 <a href="/new-vehicles/?make=Toyota&model=Crown Signia" title="Crown Signia" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1298 <div class="dv-submenu-item-img"> 1299 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/crown-signia-c.png?auto=compress%2Cformat&ixlib=php-3.3.1&width=50" alt="Crown Signia" style="width: 50px !important"/> 1300 </div> 1301 <div class="dv-submenu-item-modelinfo"> 1302 <span class="dv-submenu-item-modelname">Crown Signia (7)</span> 1303 </div> 1304 </a> 1305 </div> <div class="dv-submenu-item"> 1306 <a href="/new-vehicles/?make=Toyota&model=Prius" title="Prius" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1307 <div class="dv-submenu-item-img"> 1308 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/prius-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Prius" style="width: 50px !important"/> 1309 </div> 1310 <div class="dv-submenu-item-modelinfo"> 1311 <span class="dv-submenu-item-modelname">Prius (2)</span> 1312 </div> 1313 </a> 1314 </div> <div class="dv-submenu-item"> 1315 <a href="/new-vehicles/?make=Toyota&model=Prius%20Plug-in%20Hybrid" title="Prius Plug-in Hybrid" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1316 <div class="dv-submenu-item-img"> 1317 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/prius-prime-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Prius Plug-in Hybrid" style="width: 50px !important"/> 1318 </div> 1319 <div class="dv-submenu-item-modelinfo"> 1320 <span class="dv-submenu-item-modelname">Prius Plug-in Hybrid (1)</span> 1321 </div> 1322 </a> 1323 </div> <div class="dv-submenu-item"> 1324 <a href="/new-vehicles/?make=Toyota&model=RAV4%20Plug-in%20Hybrid" title="RAV4 Plug-in Hybrid" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1325 <div class="dv-submenu-item-img"> 1326 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/rav4-prime-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="RAV4 Plug-in Hybrid" style="width: 50px !important"/> 1327 </div> 1328 <div class="dv-submenu-item-modelinfo"> 1329 <span class="dv-submenu-item-modelname">RAV4 Plug-in Hybrid (2)</span> 1330 </div> 1331 </a> 1332 </div> 1333 </div> 1334</div><div class="dv-submenu-dealer-models toyota-crossovers / trucks / suvs"> 1335 <p><a data-ag-event="cta_interaction" href="/new-vehicles/?make=Toyota&body=SUV&body=Truck&body=Crossover" title="Shop Crossovers / Trucks / SUVs" class='dv-submenu-bodystyle-link'>Crossovers / Trucks / SUVs</a></p> 1336 <div class="dv-submenu-item-wrapper"> 1337 <div class="dv-submenu-item"> 1338 <a href="/new-vehicles/?make=Toyota&model=4Runner&model=4Runner%20i-FORCE%20MAX" title="4Runner" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1339 <div class="dv-submenu-item-img"> 1340 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/4runner-w.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="4Runner" style="width: 50px !important"/> 1341 </div> 1342 <div class="dv-submenu-item-modelinfo"> 1343 <span class="dv-submenu-item-modelname">4Runner (12)</span> 1344 </div> 1345 </a> 1346 </div> <div class="dv-submenu-item"> 1347 <a href="/new-vehicles/?make=Toyota&model=Corolla%20Cross&model=Corolla%20Cross%20Hybrid" title="Corolla Cross" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1348 <div class="dv-submenu-item-img"> 1349 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/corolla-cross-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Corolla Cross" style="width: 50px !important"/> 1350 </div> 1351 <div class="dv-submenu-item-modelinfo"> 1352 <span class="dv-submenu-item-modelname">Corolla Cross (13)</span> 1353 </div> 1354 </a> 1355 </div> <div class="dv-submenu-item"> 1356 <a href="/new-vehicles/?make=Toyota&model=Grand%20Highlander&model=Grand%20Highlander%20Hybrid" title="Grand Highlander" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1357 <div class="dv-submenu-item-img"> 1358 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/grand-highlander-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Grand Highlander" style="width: 50px !important"/> 1359 </div> 1360 <div class="dv-submenu-item-modelinfo"> 1361 <span class="dv-submenu-item-modelname">Grand Highlander (15)</span> 1362 </div> 1363 </a> 1364 </div> <div class="dv-submenu-item"> 1365 <a href="/new-vehicles/?make=Toyota&model=Highlander&model=Highlander%20Hybrid" title="Highlander" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1366 <div class="dv-submenu-item-img"> 1367 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/highlander-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Highlander" style="width: 50px !important"/> 1368 </div> 1369 <div class="dv-submenu-item-modelinfo"> 1370 <span class="dv-submenu-item-modelname">Highlander (5)</span> 1371 </div> 1372 </a> 1373 </div> <div class="dv-submenu-item"> 1374 <a href="/new-vehicles/?make=Toyota&model=Land Cruiser" title="Land Cruiser" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1375 <div class="dv-submenu-item-img"> 1376 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/land-cruiser-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Land Cruiser" style="width: 50px !important"/> 1377 </div> 1378 <div class="dv-submenu-item-modelinfo"> 1379 <span class="dv-submenu-item-modelname">Land Cruiser (6)</span> 1380 </div> 1381 </a> 1382 </div> <div class="dv-submenu-item"> 1383 <a href="/new-vehicles/?make=Toyota&model=RAV4&model=RAV4%20Hybrid" title="RAV4" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1384 <div class="dv-submenu-item-img"> 1385 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/rav4-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="RAV4" style="width: 50px !important"/> 1386 </div> 1387 <div class="dv-submenu-item-modelinfo"> 1388 <span class="dv-submenu-item-modelname">RAV4 (27)</span> 1389 </div> 1390 </a> 1391 </div> <div class="dv-submenu-item"> 1392 <a href="/new-vehicles/?make=Toyota&model=Sequoia" title="Sequoia" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1393 <div class="dv-submenu-item-img"> 1394 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/sequoia-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Sequoia" style="width: 50px !important"/> 1395 </div> 1396 <div class="dv-submenu-item-modelinfo"> 1397 <span class="dv-submenu-item-modelname">Sequoia (5)</span> 1398 </div> 1399 </a> 1400 </div> <div class="dv-submenu-item"> 1401 <a href="/new-vehicles/?make=Toyota&model=Tacoma&model=Tacoma%20i-FORCE%20MAX" title="Tacoma" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1402 <div class="dv-submenu-item-img"> 1403 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/tacoma-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Tacoma" style="width: 50px !important"/> 1404 </div> 1405 <div class="dv-submenu-item-modelinfo"> 1406 <span class="dv-submenu-item-modelname">Tacoma (49)</span> 1407 </div> 1408 </a> 1409 </div> <div class="dv-submenu-item"> 1410 <a href="/new-vehicles/?make=Toyota&model=Tundra&model=Tundra%20i-FORCE%20MAX" title="Tundra" data-ag-event="cta_interaction" class='dv-submenu-item-link'> 1411 <div class="dv-submenu-item-img"> 1412 <img src="https://bucket.dealeralchemist.com/assets/oem/toyota/carousel/jellies/tundra-c.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=50" alt="Tundra" style="width: 50px !important"/> 1413 </div> 1414 <div class="dv-submenu-item-modelinfo"> 1415 <span class="dv-submenu-item-modelname">Tundra (21)</span> 1416 </div> 1417 </a> 1418 </div> 1419 </div> 1420</div> 1421 </div> 1422
1422<script> 1423 $('.dv-submenu-model-selector a:empty').remove(); 1424 $('.dv-vehicle-menu-model-wrapper > a:first-of-type').remove(); 1425 $('.dv-submenu-model-selector .dv-submenu-dealer-models > a:first-child').contents().unwrap(); 1426 </script>
1426 1427 </span></a></li> 1428</ul> 1429</li> 1430<li id="menu-item-82843" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="" href="https://smartpath.brewerairporttoyota.com/how-it-works-service?dealerCd=37194&source=t3" class="menu-image-title-after"><span class="menu-image-title">SmartPath</span></a></li> 1431<li id="menu-item-76703" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children has-sub"><a data-ag-event="menu_interaction" style="" data-element_type="" href="/used-vehicles/" class="menu-image-title-after"><span class="menu-image-title">Used</span></a> 1432<ul> 1433 <li id="menu-item-76719" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="used" href="https://www.brewerairporttoyota.com/used-vehicles/" class="menu-image-title-after"><span class="menu-image-title">Shop All Pre-Owned</span></a></li> 1434 <li id="menu-item-76708" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="used" href="/used-vehicles/?flags.type=Special" class="menu-image-title-after"><span class="menu-image-title">Used Vehicle Specials</span></a></li> 1435 <li id="menu-item-78110" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="used" href="https://www.brewerairporttoyota.com/certified-vehicle-information/" class="menu-image-title-after"><span class="menu-image-title">Why Certified?</span></a></li> 1436 <li id="menu-item-76702" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="used" href="/used-vehicles/?finalPriceRange=$10,000%20and%20Below" class="menu-image-title-after"><span class="menu-image-title">Vehicles Under $10K</span></a></li> 1437 <li id="menu-item-76710" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="used" href="/value-trade/" class="menu-image-title-after"><span class="menu-image-title">Sell / Trade Your Vehicle</span></a></li> 1438 <li id="menu-item-78072" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="used" href="https://www.brewerairporttoyota.com/vehicle-finder-service/" class="menu-image-title-after"><span class="menu-image-title">Vehicle Finder Service</span></a></li> 1439</ul> 1440</li> 1441<li id="menu-item-76712" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children has-sub"><a data-ag-event="menu_interaction" style="" data-element_type="" href="/service/" class="menu-image-title-after"><span class="menu-image-title">Service & Parts</span></a> 1442<ul> 1443 <li id="menu-item-76724" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/" class="menu-image-title-after"><span class="menu-image-title">Service Center</span></a></li> 1444 <li id="menu-item-76722" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/parts/" class="menu-image-title-after"><span class="menu-image-title">Parts Center</span></a></li> 1445 <li id="menu-item-76725" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/schedule-service/" class="menu-image-title-after"><span class="menu-image-title">Schedule Service</span></a></li> 1446 <li id="menu-item-76740" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/parts/order-parts/" class="menu-image-title-after"><span class="menu-image-title">Order Parts</span></a></li> 1447 <li id="menu-item-76783" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="https://www.brewerairporttoyota.com/specials/service/" class="menu-image-title-after"><span class="menu-image-title">Service & Parts Specials</span></a></li> 1448 <li id="menu-item-76727" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/tires/" class="menu-image-title-after"><span class="menu-image-title">Tires</span></a></li> 1449 <li id="menu-item-76728" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="https://www.brewerairporttoyota.com/service/service-care/" class="menu-image-title-after"><span class="menu-image-title">Toyota Service Care</span></a></li> 1450 <li id="menu-item-76754" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/brakes/" class="menu-image-title-after"><span class="menu-image-title">Brakes</span></a></li> 1451 <li id="menu-item-76760" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="https://www.brewerairporttoyota.com/toyotacare-plus/" class="menu-image-title-after"><span class="menu-image-title">ToyotaCare Plus</span></a></li> 1452 <li id="menu-item-76726" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/oil-change/" class="menu-image-title-after"><span class="menu-image-title">Oil Change</span></a></li> 1453 <li id="menu-item-76759" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="https://www.brewerairporttoyota.com/toyota-express-maintenance/" class="menu-image-title-after"><span class="menu-image-title">Toyota Express Maintenance</span></a></li> 1454 <li id="menu-item-76755" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/batteries/" class="menu-image-title-after"><span class="menu-image-title">Batteries</span></a></li> 1455 <li id="menu-item-76756" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/recalls/" class="menu-image-title-after"><span class="menu-image-title">Check Vehicle for Recalls</span></a></li> 1456</ul> 1457</li> 1458<li id="menu-item-76707" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children has-sub"><a data-ag-event="menu_interaction" style="" data-element_type="" href="https://www.brewerairporttoyota.com/finance/" class="menu-image-title-after"><span class="menu-image-title">Finance</span></a> 1459<ul> 1460 <li id="menu-item-76713" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="/finance/" class="menu-image-title-after"><span class="menu-image-title">Finance Center</span></a></li> 1461 <li id="menu-item-76714" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="/finance/finance-application/" class="menu-image-title-after"><span class="menu-image-title">Finance Application</span></a></li> 1462 <li id="menu-item-76720" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="https://www.brewerairporttoyota.com/finance/payments-calculator/" class="menu-image-title-after"><span class="menu-image-title">Payment Calculator</span></a></li> 1463 <li id="menu-item-76715" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="/lease-trade-in/" class="menu-image-title-after"><span class="menu-image-title">Lease Trade In</span></a></li> 1464 <li id="menu-item-76723" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="/finance/buy-vs-lease/" class="menu-image-title-after"><span class="menu-image-title">Buy vs Lease</span></a></li> 1465 <li id="menu-item-76696" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="/college-rebate-program/" class="menu-image-title-after"><span class="menu-image-title">College Rebate Program</span></a></li> 1466 <li id="menu-item-76717" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="/military-rebate-program/" class="menu-image-title-after"><span class="menu-image-title">Military Rebate Program</span></a></li> 1467</ul> 1468</li> 1469<li id="menu-item-76745" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children has-sub"><a data-ag-event="menu_interaction" style="" data-element_type="" href="/contact/" class="menu-image-title-after"><span class="menu-image-title">About</span></a> 1470<ul> 1471 <li id="menu-item-76750" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="/about/" class="menu-image-title-after"><span class="menu-image-title">About Us</span></a></li> 1472 <li id="menu-item-76757" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="https://www.brewerairporttoyota.com/reviews/" class="menu-image-title-after"><span class="menu-image-title">Reviews</span></a></li> 1473 <li id="menu-item-76749" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="/contact/" class="menu-image-title-after"><span class="menu-image-title">Contact Us</span></a></li> 1474 <li id="menu-item-78111" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="https://www.brewerairporttoyota.com/the-brewer-airport-toyota-advantage/" class="menu-image-title-after"><span class="menu-image-title">Why Buy?</span></a></li> 1475 <li id="menu-item-77502" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="https://www.brewerairporttoyota.com/hours-and-directions/" class="menu-image-title-after"><span class="menu-image-title">Hours & Directions</span></a></li> 1476 <li id="menu-item-78078" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="https://www.brewerairporttoyota.com/service/service-amenities/" class="menu-image-title-after"><span class="menu-image-title">VIP Program</span></a></li> 1477 <li id="menu-item-76751" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="/meet-the-team/" class="menu-image-title-after"><span class="menu-image-title">Meet Our Team</span></a></li> 1478 <li id="menu-item-78077" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="https://www.brewerairporttoyota.com/community/" class="menu-image-title-after"><span class="menu-image-title">Community</span></a></li> 1479 <li id="menu-item-76752" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="/careers/" class="menu-image-title-after"><span class="menu-image-title">Careers</span></a></li> 1480 <li id="menu-item-78079" class="menu-half menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="https://www.brewerairporttoyota.com/community/food-drive/" class="menu-image-title-after"><span class="menu-image-title">Food Drive</span></a></li> 1481 <li id="menu-item-76753" class="menu-half menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="about" href="/privacy-policy/" class="menu-image-title-after"><span class="menu-image-title">Privacy Policy</span></a></li> 1482</ul> 1483</li> 1484</ul></div> </nav> 1485 </div> 1486 <div class="ag-dealer-reviews"> 1487 <a data-ag-event="cta_interaction" href="/reviews" title="Google Reviews"> 1488
1488<script type="application/ld+json"> 1489{ 1490 "@context": "https://schema.org/", 1491 "@type": "AggregateRating", 1492 "itemReviewed": { 1493 "@type": "AutomotiveBusiness", 1494 "image": "https://bucket.dealervenom.com/assets/oem/toyota/favicon/toyota-red-favicon.ico?auto=compres&format&ixlib=php-1.2.1&width=16", 1495 "name": "Brewer Airport Toyota", 1496 "telephone": "412.265.4743", 1497 "address" : { 1498 "@type": "PostalAddress", 1499 "streetAddress": "8900 University Blvd", 1500 "addressLocality": "PA", 1501 "postalCode": "15108", 1502 "addressCountry": "US" 1503 } 1504 }, 1505 "ratingValue": "4.6", 1506 "bestRating": "5", 1507 "ratingCount": "2030" 1508} 1509</script>
1509 1510 1511<div class="dv-reviews-badge " style="display: none;"> 1512 <div class="dv-reviews-badge-col"> 1513 <img src="https://bucket.dealeralchemist.com/assets/reviews/google_small_icon.png?auto=compress%2Cformat&ixlib=php-1.2.1" alt="Google Logo"> 1514 <p class="dv-reviews-badge-score">4.6</p> 1515 </div> 1516 <div class="dv-reviews-badge-col dv-reviews-badge-col-stack"> 1517 <p class="dv-review-badge-rating"><i class= 'fas fa-star'></i><i class= 'fas fa-star'></i><i class= 'fas fa-star'></i><i class= 'fas fa-star'></i><i class='fas fa-star-half-alt'></i></p> 1518 <p class="dv-review-badge-count">2030 Reviews</p> 1519 </div> 1520</div> </a> 1521 </div> 1522 <div class="ag-dealer-info"> 1523 <a data-ag-event="clickToCall|Sales" href="tel:412.265.4743" title="Call Brewer Airport Toyota"> 1524 412.265.4743 </a> 1525 <a data-ag-event="getDirections" href="/hours-and-directions/" title="Get hours & directions to Brewer Airport Toyota"> 1526 <span data-fetch-shortcode data-code="mbhi" data-arguments="location="Dealership" includetime="" includeday="" format="12" approximation="1" openingsoonmessagetime="2700" closingsoonmessagetime="2700" openmessage="&lt;span class=&quot;mbhi_dv_header mbhi_open&quot;&gt;&lt;b&gt;Open&lt;/b&gt;&lt;/span&gt; {from} - {to}" closedmessage="&lt;span class=&quot;mbhi_dv_header mbhi_closed&quot;&gt;Now Closed&lt;/span&gt;" openingsoonmessage="Opening in {x} minutes" closingsoonmessage="Closing in {x} minutes" removezeroes="1" extra_classes="" show_specialdate_messages="1" show_vacation_messages="" vacation_message_closed="" specialdate_message_open="" specialdate_message_closed="" from="" to="" loading="Welcome!" display="consolidated"">Welcome!</span> </a> 1527 </div> 1528 <div class="nav-below-btn-toggle"> 1529 <div id="nav-icon-wrapper"> 1530 <span style="background-color: #000000"></span> 1531 <span style="background-color: #000000"></span> 1532 <span style="background-color: #000000"></span> 1533 <span style="background-color: #000000"></span> 1534 </div> 1535 </div></header> 1536 1537<style> 1538 .dv-header-lower { 1539 display: none; 1540 background: var(--primary-color); 1541 } 1542 1543 .dv-header-lower:hover { 1544 cursor: pointer; 1545 } 1546 1547 @media screen and (max-width: 768px) { 1548 .dv-header-lower.dv-header-lower-closed { 1549 display: none !important 1550 } 1551 1552 .dv-header-lower { 1553 display: flex; 1554 display: -webkit-flex; 1555 display: -ms-flexbox; 1556 align-items: center; 1557 justify-content: center; 1558 text-align: center; 1559 width: 100%; 1560 height: auto; 1561 position: sticky; 1562 z-index: 100; 1563 left: 0; 1564 right: 0; 1565 top: 75px !important 1566 } 1567 } 1568 1569 .dv-header-lower .dv-header-col { 1570 flex: 1 1 33.333%; 1571 width: 33.333%; 1572 } 1573 1574 .dv-header-lower .dv-header-col.hide { 1575 display: none 1576 } 1577 1578 .dv-header-lower .dv-header-col:not(:first-child) { 1579 position: relative; 1580 } 1581 1582 .dv-header-lower .dv-header-col:not(:first-child):before { 1583 position: absolute; 1584 content: ''; 1585 left: 0; 1586 height: 50%; 1587 top: 25%; 1588 z-index: 0; 1589 width: 1px; 1590 background-color: #fff; 1591 } 1592 1593 .dv-header-lower .dv-header-col a { 1594 padding: 15px 5px; 1595 font-size: 12px; 1596 display: block; 1597 color: #ffffff; 1598 text-decoration: none; 1599 font-family: inherit; 1600 text-decoration: none; 1601 } 1602 1603 .dv-header-lower .dv-header-col a i { 1604 margin-right: 5px; 1605 } 1606 1607 /* 1608 * Search Overlay 1609 */ 1610 1611 .ag-header-search-overlay { 1612 height: 0; 1613 width: 100%; 1614 background: var(--primary-color); 1615 opacity: 0; 1616 visibility: hidden; 1617 transition: opacity 200ms ease-out; 1618 -webkit-transition: opacity 200ms ease-out; 1619 -moz-transition: opacity 200ms ease-out; 1620 box-sizing: border-box; 1621 } 1622 1623 .ag-header-search-overlay * { 1624 box-sizing: border-box; 1625 } 1626 1627 .ag-header-search-overlay .ag-header-search-overlay-wrapper { 1628 display: flex; 1629 display: -webkit-flex; 1630 display: -ms-flexbox; 1631 } 1632 1633 .ag-header-search-overlay.active { 1634 position: fixed; 1635 height: auto; 1636 padding: 25px; 1637 top: 75px; 1638 width: 100%; 1639 z-index: 150; 1640 visibility: visible; 1641 background: #fff; 1642 display: flex; 1643 display: -webkit-flex; 1644 display: -ms-flexbox; 1645 flex-flow: column nowrap; 1646 align-items: center; 1647 justify-content: center; 1648 opacity: 1; 1649 box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.1); 1650 transition: opacity 200ms ease-in; 1651 -webkit-transition: opacity 200ms ease-in; 1652 -moz-transition: opacity 200ms ease-in; 1653 } 1654 1655 .ag-header-search-overlay .ag-header-search-overlay-container { 1656 padding: 0; 1657 margin: 0; 1658 position: relative; 1659 width: 80% 1660 } 1661 1662 .ag-header-search-overlay .ag-header-search-overlay-container .ag-header-search-overlay-close { 1663 padding: 0 12.5px; 1664 width: fit-content; 1665 background-color: var(--primary-color); 1666 display: flex; 1667 display: -webkit-flex; 1668 display: -ms-flexbox; 1669 flex-flow: column nowrap; 1670 align-items: center; 1671 justify-content: center; 1672 } 1673 1674 .ag-header-search-overlay .ag-header-search-overlay-container .ag-header-search-overlay-close:hover { 1675 cursor: pointer; 1676 background-color: var(--secondary-color) 1677 } 1678 1679 .ag-header-search-overlay .ag-header-search-overlay-container .ag-header-search-overlay-close span { 1680 color: #fff; 1681 font-size: 10px; 1682 text-transform: uppercase; 1683 } 1684 1685 .ag-header-search-overlay .ag-header-search-cta-group { 1686 display: flex; 1687 display: -webkit-flex; 1688 display: -ms-flexbox; 1689 flex-flow: row nowrap; 1690 justify-content: center; 1691 align-items: center; 1692 gap: 25px; 1693 padding-top: 25px; 1694 } 1695 1696 .ag-header-search-overlay .ag-header-search-cta-group a { 1697 display: block; 1698 background-color: var(--primary-color); 1699 color: #fff; 1700 border: 0; 1701 padding: 12.5px 25px; 1702 font-size: 12px; 1703 } 1704 1705 .ag-header-search-overlay .ag-header-search-cta-group a:hover { 1706 background-color: var(--secondary-color) 1707 } 1708 1709 @media screen and (max-width: 768px) { 1710 .ag-header-search-overlay.active { 1711 top: 75px; 1712 } 1713 1714 .ag-header-search-overlay .ag-header-search-overlay-container { 1715 width: 100% 1716 } 1717 } 1718 1719 @media screen and (max-width: 480px) { 1720 .ag-header-search-overlay .ag-header-search-cta-group a { 1721 padding: 12.5px 1722 } 1723 } 1724</style> 1725 1726<div class="dv-header-lower" style="top: 75px"> 1727 <div class="dv-header-col"> 1728 <a href="tel:412.265.4743" 1729 target="_self" 1730 title="Sales" 1731 data-ag-event="clickToCall|Sales"> 1732 <i class="fa fa-phone"></i> 1733 Sales </a> 1734 </div> 1735 <div class="dv-header-col"> 1736 <a href="tel:412.265.4756" 1737 target="_self" 1738 title="Service" 1739 data-ag-event="clickToCall|Service"> 1740 <i class="fa fa-phone"></i> 1741 Service </a> 1742 </div> 1743 <div class="dv-header-col"> 1744 <a href="https://maps.app.goo.gl/1J7BChWkZVkUyzg67" 1745 target="_blank" 1746 title="Get Directions" 1747 data-ag-event="getDirections"> 1748 <i class="fa fas fa-map-marker-alt"></i> 1749 Get Directions </a> 1750 </div> 1751 </div> 1752 1753<link rel="preload" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/header/header-pulldown.css?v=1.761.775" as="style"> 1754<link rel="stylesheet" href="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/header/header-pulldown.css?v=1.761.775" type="text/css"> 1755<style> 1756.dv-fw-search .dv-fw-mobile-menu-wrapper>ul.dv-fw-mobile-menu-selector, 1757.dv-fw-search .dv-fw-mobile-menu-wrapper>ul .dv-fw-mobile-menu-item { 1758 background-color: #eb0a1e; 1759} 1760 1761.dv-fw-search .dv-fw-mobile-menu-wrapper>ul .dv-fw-mobile-menu-item.active { 1762 background-color: #000000; 1763} 1764 1765.dv-fw-search .dv-fw-mobile-menu-wrapper>ul .dv-fw-mobile-menu-item>a { 1766 border-color: #ffffff; 1767 color: #fff; 1768} 1769 1770.dv-fw-search .dv-fw-mobile-menu-wrapper .dv-mobile-menu-btn { 1771 color: #fff !important; 1772 background: #eb0a1e !important; 1773} 1774 1775.dv-fw-search .dv-fw-mobile-menu-wrapper .dv-mobile-menu-btn:hover { 1776 color: #fff !important; 1777 background: #000000 !important; 1778} 1779 1780@media screen and (max-width: 1255px) { 1781 .dv-fw-search { 1782 background: transparent; 1783 min-width: 400px; 1784 width: 33.333%; 1785 } 1786 1787 /* .dv-fw-search.dv-toggle-open { 1788 border-top: 1px solid transparent; 1789 } */ 1790 body.mobile-menu-open { 1791 position: relative; 1792 } 1793 1794 body.mobile-menu-open:before { 1795 content: ''; 1796 position: absolute; 1797 top: 0; 1798 left: 0; 1799 width: 100%; 1800 height: 100%; 1801 background: rgba(0, 0, 0, 0.5); 1802 z-index: 3; 1803 } 1804 1805 .dv-fw-search .dv-fw-search-wrapper { 1806 display: none; 1807 } 1808 1809 .dv-fw-search .dv-fw-mobile-menu-wrapper { 1810 display: flex; 1811 background: #fff; 1812 } 1813 1814 .dv-desktop-menu, 1815 #desktop-nav { 1816 display: none !important; 1817 } 1818} 1819 1820@media screen and (max-width: 768px) { 1821 .dv-fw-search { 1822 min-width: 100%; 1823 width: 100%; 1824 } 1825} 1826</style> 1827<style> 1828/* min width redux */ 1829@media screen and (min-width: calc(1255px + 1px)) { 1830 1831 .dv-fw-search, 1832 .nav-below-btn-toggle { 1833 display: none !important; 1834 } 1835} 1836 1837@media screen and (max-width: 1255px) { 1838 .dv-desktop-menu #desktop-nav { 1839 display: none !important; 1840 } 1841} 1842</style> 1843 1844<div class="dv-fw-search"> 1845 <div class="dv-fw-search-wrapper"> 1846 </div> 1847 <div class="dv-fw-mobile-menu-wrapper"> 1848 <ul class="dv-fw-mobile-menu-selector"> 1849 <li class="dv-fw-mobile-menu-item active">
1850 <a href="#" title="Mobile Menu"> 1851 <span><i class="fal fa-bars"></i></span> 1852 <span>Menu</span> 1853 </a> 1854 </li> 1855 <li class="dv-fw-mobile-menu-item"> 1856 <a href="#" title="Mobile Menu"> 1857 <span><i class="fal fa-phone"></i></span> 1858 <span>Call</span> 1859 </a> 1860 </li> 1861 <li class="dv-fw-mobile-menu-item"> 1862 <a href="#" title="Mobile Menu"> 1863 <span><i class="fal fa-map-marker-alt"></i></span> 1864 <span>Location</span> 1865 </a> 1866 </li> 1867 <li class="dv-fw-mobile-menu-item"> 1868 <a href="#" title="Mobile Menu"> 1869 <span><i class="fal fa-clock"></i></span> 1870 <span>Hours</span> 1871 </a> 1872 </li> 1873 </ul> 1874 <ul class="dv-fw-mobile-menu-content"> 1875 <li class="dv-fw-mobile-menu-item-content active"> 1876 <div class="dv-mobile-menu-inner"> 1877 <nav class="dv-mobile-menu" aria-label="Mobile Menu"> 1878 <div id="mobile_main_nav_menu" class="menu-mobile-menu-container"><ul id="menu-mobile-menu" class="menu"><li id="menu-item-76662" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="" href="https://www.brewerairporttoyota.com/new-vehicles/" class="menu-image-title-after"><span class="menu-image-title">New Vehicles</span></a></li> 1879<li id="menu-item-76677" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="" href="/used-vehicles/" class="menu-image-title-after"><span class="menu-image-title">Used Vehicles</span></a></li> 1880<li id="menu-item-82844" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="" href="https://smartpath.brewerairporttoyota.com/how-it-works-service?dealerCd=37194&source=t3" class="menu-image-title-after"><span class="menu-image-title">SmartPath</span></a></li> 1881<li id="menu-item-76666" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="" href="/value-trade/" class="menu-image-title-after"><span class="menu-image-title">Sell / Trade Your Vehicle</span></a></li> 1882<li id="menu-item-76665" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="" href="https://www.brewerairporttoyota.com/vehicle-finder-service/" class="menu-image-title-after"><span class="menu-image-title">Vehicle Finder Service</span></a></li> 1883<li id="menu-item-76671" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children has-sub"><a data-ag-event="menu_interaction" style="" data-element_type="" href="#/" class="menu-image-title-after"><span class="menu-image-title">Service & Parts</span></a> 1884<ul> 1885 <li id="menu-item-76669" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/" class="menu-image-title-after"><span class="menu-image-title">Service Center</span></a></li> 1886 <li id="menu-item-76670" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/schedule-service/" class="menu-image-title-after"><span class="menu-image-title">Schedule Service</span></a></li> 1887 <li id="menu-item-76672" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/parts/" class="menu-image-title-after"><span class="menu-image-title">Parts Center</span></a></li> 1888 <li id="menu-item-76673" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/parts/order-parts/" class="menu-image-title-after"><span class="menu-image-title">Order Parts</span></a></li> 1889 <li id="menu-item-76780" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="service-&-parts" href="/service/recalls/" class="menu-image-title-after"><span class="menu-image-title">Check For Recalls</span></a></li> 1890</ul> 1891</li> 1892<li id="menu-item-76663" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children has-sub"><a data-ag-event="menu_interaction" style="" data-element_type="" href="#/" class="menu-image-title-after"><span class="menu-image-title">Finance</span></a> 1893<ul> 1894 <li id="menu-item-76668" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="/finance/" class="menu-image-title-after"><span class="menu-image-title">Finance Center</span></a></li> 1895 <li id="menu-item-76667" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="/finance/finance-application/" class="menu-image-title-after"><span class="menu-image-title">Finance Application</span></a></li> 1896 <li id="menu-item-77504" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="finance" href="https://www.brewerairporttoyota.com/finance/payments-calculator/" class="menu-image-title-after"><span class="menu-image-title">Payment Calculator</span></a></li> 1897</ul> 1898</li> 1899<li id="menu-item-76664" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children has-sub"><a data-ag-event="menu_interaction" style="" data-element_type="" href="#/" class="menu-image-title-after"><span class="menu-image-title">Specials</span></a> 1900<ul> 1901 <li id="menu-item-76674" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="specials" href="/incentives/" class="menu-image-title-after"><span class="menu-image-title">Toyota Incentives</span></a></li> 1902 <li id="menu-item-76675" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="specials" href="/new-vehicles/?flags.type=Special" class="menu-image-title-after"><span class="menu-image-title">New Vehicle Specials</span></a></li> 1903 <li id="menu-item-76676" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="specials" href="/used-vehicles/?flags.type=Special" class="menu-image-title-after"><span class="menu-image-title">Used Vehicle Specials</span></a></li> 1904 <li id="menu-item-76784" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="specials" href="https://www.brewerairporttoyota.com/specials/service/" class="menu-image-title-after"><span class="menu-image-title">Service & Parts Specials</span></a></li> 1905 <li id="menu-item-78104" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="specials" href="https://www.brewerairporttoyota.com/college-rebate-program/" class="menu-image-title-after"><span class="menu-image-title">College Rebate Program</span></a></li> 1906 <li id="menu-item-78105" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="specials" href="https://www.brewerairporttoyota.com/military-rebate-program/" class="menu-image-title-after"><span class="menu-image-title">Military Rebate Program</span></a></li> 1907</ul> 1908</li> 1909<li id="menu-item-76685" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children has-sub"><a data-ag-event="menu_interaction" style="" data-element_type="" href="#/" class="menu-image-title-after"><span class="menu-image-title">About Us</span></a> 1910<ul> 1911 <li id="menu-item-76690" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="/about/" class="menu-image-title-after"><span class="menu-image-title">About Us</span></a></li> 1912 <li id="menu-item-76689" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="/contact/" class="menu-image-title-after"><span class="menu-image-title">Contact Us</span></a></li> 1913 <li id="menu-item-77506" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="https://www.brewerairporttoyota.com/hours-and-directions/" class="menu-image-title-after"><span class="menu-image-title">Hours & Directions</span></a></li> 1914 <li id="menu-item-76691" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="/meet-the-team/" class="menu-image-title-after"><span class="menu-image-title">Meet Our Team</span></a></li> 1915 <li id="menu-item-76692" class="menu-item menu-item-type-custom menu-item-object-custom"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="/careers/" class="menu-image-title-after"><span class="menu-image-title">Careers</span></a></li> 1916 <li id="menu-item-77507" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="https://www.brewerairporttoyota.com/reviews/" class="menu-image-title-after"><span class="menu-image-title">Reviews</span></a></li> 1917 <li id="menu-item-78112" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="https://www.brewerairporttoyota.com/the-brewer-airport-toyota-advantage/" class="menu-image-title-after"><span class="menu-image-title">Why Buy</span></a></li> 1918 <li id="menu-item-78108" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="https://www.brewerairporttoyota.com/service/service-amenities/" class="menu-image-title-after"><span class="menu-image-title">VIP Program</span></a></li> 1919 <li id="menu-item-78106" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="https://www.brewerairporttoyota.com/community/" class="menu-image-title-after"><span class="menu-image-title">Community</span></a></li> 1920 <li id="menu-item-78107" class="menu-item menu-item-type-post_type menu-item-object-page"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="https://www.brewerairporttoyota.com/community/food-drive/" class="menu-image-title-after"><span class="menu-image-title">Food Drive</span></a></li> 1921 <li id="menu-item-77505" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy"><a data-ag-event="menu_interaction" style="" data-element_type="about-us" href="https://www.brewerairporttoyota.com/privacy-policy/" class="menu-image-title-after"><span class="menu-image-title">Privacy Policy</span></a></li> 1922</ul> 1923</li> 1924</ul></div> </nav>
1925 </div> 1926 </li> 1927 <li class="dv-fw-mobile-menu-item-content"> 1928 <div class="dv-mobile-menu-inner"> 1929 <div class="dv-mobile-menu-inner-header">Call</div> 1930 <div class="dv-mobile-menu-inner-body dv-dealer-call"> 1931 <ul> 1932 <li> 1933 <span>Sales</span> 1934 <a href="tel:412.265.4743" title="Call Brewer Airport Toyota Sales 412.265.4743" data-aga-event="clickToCall" data-aga-event-set-prop="clickToCallDepartment|Sales"><i class="fal fa-mobile"></i> 412.265.4743</a> 1935 </li> 1936 <li> 1937 <span>Service</span> 1938 <a href="tel:412.265.4756" title="Call Brewer Airport Toyota Service 412.265.4756" data-aga-event="clickToCall" data-aga-event-set-prop="clickToCallDepartment|Service"><i class="fal fa-mobile"></i> 412.265.4756</a> 1939 </li> 1940 <li> 1941 <span>Parts</span> 1942 <a href="tel:412.265.4756" title="Call Brewer Airport Toyota Parts 412.265.4756" data-aga-event="clickToCall" data-aga-event-set-prop="clickToCallDepartment|Parts"><i class="fal fa-mobile"></i> 412.265.4756</a> 1943 </li> 1944 <!--<li> 1945 <span>Collision Center</span> 1946 <a href="tel:COLLISION NUMBER" title="Call Brewer Airport Toyota Collision Center COLLISION NUMBER" data-aga-event="clickToCall" data-aga-event-set-prop="clickToCallDepartment|Collision"><i class="fal fa-mobile"></i> COLLISION NUMBER</a> 1947 </li>--> 1948</ul> </div> 1949 </div> 1950 </li> 1951 <li class="dv-fw-mobile-menu-item-content"> 1952 <div class="dv-mobile-menu-inner"> 1953 <div class="dv-mobile-menu-inner-header">Location</div> 1954 <div class="dv-mobile-menu-inner-body dv-dealer-location"> 1955 <ul> 1956 <li> 1957 <span><i class="fal fa-map-marker-alt"></i> Brewer Airport Toyota</span> 1958 <a target='_blank' href="https://maps.app.goo.gl/1J7BChWkZVkUyzg67" title="" data-aga-event="getDirections">8900 University Blvd<br> Moon Township PA 15108</a> 1959 <a target='_blank' href="https://maps.app.goo.gl/1J7BChWkZVkUyzg67" title="" class="dv-mobile-menu-btn" data-aga-event="getDirections">Get Directions</a> 1960 </li> 1961 <!--<li> 1962 <span><i class="fal fa-map-marker-alt"></i> Brewer Airport Toyota Collision Center</span> 1963 <a target='_blank' href="" title="" data-aga-event="getDirections"></a> 1964 <a target='_blank' href="" title="" class="dv-mobile-menu-btn" data-aga-event="getDirections">Get Directions</a> 1965 </li>--> 1966 1967</ul> </div> 1968 </div> 1969 </li> 1970 <li class="dv-fw-mobile-menu-item-content"> 1971 <div class="dv-mobile-menu-inner"> 1972 <div class="dv-mobile-menu-inner-header">Hours</div> 1973 <div class="dv-mobile-menu-inner-body dv-dealer-hours"> 1974 <ul> 1975 <li> 1976 <span style='font-weight:800;'>Sales <i class="fal fa-clock"></i></span> 1977 <span data-fetch-shortcode data-code="mbhi_hours" data-arguments="location="Sales" format="12" display="table" output="1" includeholidays="true" includevacations="" abbreviatedays="" consolidationseparator=" - " hourseparator=" - " entryseparator=", " mhbr="1" showonlytoday="" dayentryseparator=" " removezeroes="1" seo="" for_admin="" hide_hours="" startonsunday="" extra_classes="" dates_in_past="1" replace_with_specials="true" replace_with_vacations="" date_format="day first" replaced_vacations_format="{day} ({name})" replaced_specials_format="{day} *({month_short} {day_of_month})" included_vacations_format="{from_day_of_month} {from_month_short} - {to_day_of_month} {to_month_short}" included_specials_format="{day_of_month} {month_short}" day_format="{day}" view="normal" rollover="" rollover_from="30" rollover_to="14" includeholiday="true"">Welcome!</span> 1978 <span style='font-weight:800;'>Service <i class="fal fa-clock"></i></span> 1979 <span data-fetch-shortcode data-code="mbhi_hours" data-arguments="location="Service" format="12" display="table" output="1" includeholidays="true" includevacations="" abbreviatedays="" consolidationseparator=" - " hourseparator=" - " entryseparator=", " mhbr="1" showonlytoday="" dayentryseparator=" " removezeroes="1" seo="" for_admin="" hide_hours="" startonsunday="" extra_classes="" dates_in_past="1" replace_with_specials="true" replace_with_vacations="" date_format="day first" replaced_vacations_format="{day} ({name})" replaced_specials_format="{day} *({month_short} {day_of_month})" included_vacations_format="{from_day_of_month} {from_month_short} - {to_day_of_month} {to_month_short}" included_specials_format="{day_of_month} {month_short}" day_format="{day}" view="normal" rollover="" rollover_from="30" rollover_to="14" includeholiday="true"">Welcome!</span> 1980 <span style='font-weight:800;'>Parts <i class="fal fa-clock"></i></span> 1981 <span data-fetch-shortcode data-code="mbhi_hours" data-arguments="location="Parts" format="12" display="table" output="1" includeholidays="true" includevacations="" abbreviatedays="" consolidationseparator=" - " hourseparator=" - " entryseparator=", " mhbr="1" showonlytoday="" dayentryseparator=" " removezeroes="1" seo="" for_admin="" hide_hours="" startonsunday="" extra_classes="" dates_in_past="1" replace_with_specials="true" replace_with_vacations="" date_format="day first" replaced_vacations_format="{day} ({name})" replaced_specials_format="{day} *({month_short} {day_of_month})" included_vacations_format="{from_day_of_month} {from_month_short} - {to_day_of_month} {to_month_short}" included_specials_format="{day_of_month} {month_short}" day_format="{day}" view="normal" rollover="" rollover_from="30" rollover_to="14" includeholiday="true"">Welcome!</span> 1982 <!--<span style='font-weight:800;'>Collison <i class="fal fa-clock"></i></span> 1983 [mbhi_hours location="Collision" display="table" includeholiday="true" replace_with_specials="true"] 1984 <span style='font-weight:800;'>Rental <i class="fal fa-clock"></i></span> 1985 [mbhi_hours location="Rental" display="table" includeholiday="true" replace_with_specials="true"] 1986 </li>--> 1987</ul> </div>
1988 </div> 1989 </li> 1990 </ul> 1991 </div> 1992</div>
1993<script> 1994var CloseMenu = function(e) { 1995 $('.nav-below-btn-toggle').each(function() { 1996 if ($(this).hasClass('open')) { 1997 $(this).removeClass('open'); 1998 } else { 1999 2000 $(this).addClass('open'); 2001 } 2002 }); 2003 if ($('.dv-header-lower').length) { 2004 $('.dv-header-lower').toggleClass("dv-header-lower-closed"); 2005 } 2006 $(".dv-fw-search").toggleClass("dv-toggle-open"); 2007 $("body").toggleClass("mobile-menu-open"); 2008 $('#the-nav-below').remove(); 2009}; 2010$(function() { 2011 2012 // Icon Click FN 2013 $(".nav-below-btn-toggle").click(function(event) { 2014 event.preventDefault(); 2015 event.stopPropagation(); 2016 var lowerHeaderHeight = document.querySelector(".srp_main .dv-header-lower"); 2017 if(!!lowerHeaderHeight) { 2018 $(window).scroll(function() { 2019 var scroll = $(window).scrollTop(); 2020 var totalHeaderHeight = parseInt('75px', 10 ) - parseInt(lowerHeaderHeight.offsetHeight, 10 ) + 'px'; 2021 if (scroll > 0) { 2022 document.querySelector(".dv-fw-search").style.top = parseInt(totalHeaderHeight, 10) + parseInt(lowerHeaderHeight.offsetHeight, 10) + 'px'; 2023 } else { 2024 document.querySelector(".dv-fw-search").style.top = 'auto'; 2025 } 2026 }); 2027 } 2028 CloseMenu($(this)); 2029 }); 2030 2031 $(document).on('click', function(e) { 2032 var opened = $('body').hasClass('mobile-menu-open'); 2033 var bodyContent = $('body.mobile-menu-open'); 2034 var target = $(e.target); 2035 if (opened === true && target.is(bodyContent)) { 2036 CloseMenu($('.nav-below-btn-toggle')); 2037 } 2038 }); 2039 2040 // Open Dropdown Menu Mobile 2041 $(".dv-mobile-menu-inner #menu-mobile-menu > li.has-sub > a").click(function() { 2042 $(".dv-mobile-menu-inner #menu-mobile-menu > li.has-sub > a").parent().find("ul").slideUp("fast"); 2043 2044 var panel = this.nextElementSibling; 2045 panel.style.maxHeight = panel.style.maxHeight ? panel.scrollHeight : null; 2046 var curHeight = document.querySelector(".dv-mobile-menu-inner").style.height; 2047 curHeight = parseInt(curHeight, 10); 2048 2049 if ($(this).parent().hasClass("open-active")) { 2050 $(".dv-mobile-menu-inner #menu-mobile-menu > li.has-sub > a").parent().removeClass("open-active"); 2051 $(this).parent().find("ul").slideUp("fast"); 2052 2053 document.querySelector(".dv-mobile-menu-inner").style.height = curHeight - panel.scrollHeight + 'px'; 2054 } else { 2055 $(".dv-mobile-menu-inner #menu-mobile-menu > li.has-sub > a").parent().removeClass("open-active"); 2056 $(this).parent().toggleClass("open-active"); 2057 $(this).parent().find("ul").slideToggle("fast"); 2058 2059 document.querySelector(".dv-mobile-menu-inner").style.height = curHeight + panel.scrollHeight + 'px'; 2060 } 2061 2062 this.scrollIntoView(); 2063 }); 2064 2065 // Mobile Menu Selector 2066 $(".dv-fw-mobile-menu-selector li").on("click", function() { 2067 $(".dv-fw-mobile-menu-selector li").removeClass("active"); 2068 $(this).toggleClass("active"); 2069 var idx = $(this).index(); 2070 $(this).parents().find('.dv-fw-mobile-menu-item-content').removeClass('active'); 2071 $(this).parents().find('.dv-fw-mobile-menu-item-content').eq(idx).addClass('active') 2072 }); 2073 2074 // Mobile Menu Caret 2075 $(".dv-mobile-menu-inner #menu-mobile-menu li.has-sub > a").append('<span class="dv-mobile-menu-caret"><i class="fa fa-chevron-down"></i></span>'); 2076}); 2077 2078// Mobile fix for height of menu items 2079document.addEventListener("DOMContentLoaded", function() { 2080 var elmInnerHeight = document.querySelector(".dv-mobile-menu-inner").getBoundingClientRect().height; 2081 // var header = document.querySelector("header"); 2082 // var headerHeight = header.getBoundingClientRect().height; 2083 // var distanceToTop = header.getBoundingClientRect().top; 2084 var setHeight = Math.ceil((elmInnerHeight)).toString(); 2085 document.querySelector(".dv-mobile-menu-inner").style.height = setHeight + 'px'; 2086}); 2087</script>
2087 2088 2089<div class="bread-crumbs"> 2090 <div class="dv-bread-crumbs" style="display:none;" itemscope itemtype="https://schema.org/BreadcrumbList"><span itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"><a href="https://www.brewerairporttoyota.com" itemprop="item"><span itemprop="name">Brewer Airport Toyota</span></a><meta itemprop="position" content="1"></span><span class="separator"> / </span><span itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"><span itemprop="name">New Vehicles</span><meta itemprop="position" content="1"></span></div></div> 2091 2092<!-- da-srp-studio: switch=OFF (enable Redux → Integrations → SRP Functions → SRP Studio Config, then save options) studio=off (legacy Redux template) | clear cache: append ?srp_config_flush=1 --> 2093 <div class="srpLoading"> 2094 <div class="lds-ring"><div></div><div></div><div></div><div></div></div> 2095 </div> 2096 2097<div class="srp-header"> 2098 <div id="resultsStats"></div> 2099 <div class="srp-header-results"> 2100 <div class="srp-search"> 2101 <div class="srp-searchbar"> 2102 <i class="fas fa-search"></i> 2103 <div id="searchbox"></div> 2104 </div> 2105 <div id="clearSearchResults"><button><i class="fal fa-backspace"></i> <span>Clear<br>Search</span></button></div> 2106 </div> 2107 <div class="srp-header-right"> 2108 <div class="sortFilters" id="sortByDesktop"><div class="dv-srp-search-options-wrapper"><span class="dv-srp-search-options-label"><i class="fas fa-sort-amount-up"></i> <span class="dv-srp-search-options-dynamic-label">Sort</span></span></div></div> 2109 <div id="pagination-top"></div> 2110 </div> 2111 </div> 2112 <div class="dv-srp-search-options"> 2113 <div class="sortFilters" id="sortByMobile"><div class="dv-srp-search-options-wrapper"><span class="dv-srp-search-options-label"><i class="fas fa-sort-amount-up"></i> <span class="dv-srp-search-options-dynamic-label">Sort</span></span></div></div> 2114 <div class="showFiltersNonLegacy" id="showFiltersNonLegacy"></div> 2115 <div class="saveFilters"><div class="dv-srp-search-options-wrapper"><span class="dv-srp-search-options-label"><i class="fal fa-heart"></i> Save</span></div></div> 2116 </div> 2117</div> 2118 2119 2120<main> 2121 <div class="side-panel-container"> 2122 <section id="srp-filters" class="srp-filters"> 2123 <div class="srp-filters-close-wrapper"> 2124 <div class="srp-filters-reset-btn-wrapper"> 2125 <div id="srp-filters-reset-btn"></div> 2126 </div> 2127 <div class="srp-filters-close-btn"> 2128 <i class="fal fa-times"></i> Close 2129 </div> 2130 </div> 2131 <div class="range-slider-container srp-panel-toggle"> <div> 2132 <span> 2133 <h4>Price</h4> 2134 </span> 2135 <div id="price-range-slider"></div> 2136 </div> 2137 </div> 2138 2139 <div class="type-container srp-panel-toggle"> 2140 <span> 2141 <h4>Type</h4> 2142 </span> 2143 <div id="type-list"></div> 2144 </div> 2145 2146 <div class="dealertag-container srp-panel-toggle hidden-filter"> 2147 <span> 2148 <h4>Dealer Special</h4> 2149 <a><i class="far fa-chevron-up"></i></a> 2150 </span> 2151 <div id="dealertag-list"></div> 2152 </div> 2153 2154 <div class="make-container srp-panel-toggle"> 2155 <span> 2156 <h4>Make</h4> 2157 <a><i class="far fa-chevron-up"></i></a> 2158 </span> 2159 <div id="make-list"></div> 2160 </div> 2161 2162 <div class="model-container srp-panel-toggle"> 2163 <span> 2164 <h4>Model</h4> 2165 <a><i class="far fa-chevron-up"></i></a> 2166 </span> 2167 <div id="model-list"></div> 2168 </div> 2169 2170 <div class="trim-container srp-panel-toggle"> 2171 <span> 2172 <h4>Trim</h4> 2173 <a><i class="far fa-chevron-up"></i></a> 2174 </span> 2175 <div id="trim-list"></div> 2176 </div> 2177 2178 <div class="year-container srp-panel-toggle"> 2179 <span> 2180 <h4>Year</h4> 2181 <a><i class="far fa-chevron-up"></i></a> 2182 </span> 2183 <div id="year-list"></div> 2184 </div> 2185 2186 <div class="pricerange-container srp-panel-toggle"> 2187 <span> 2188 <h4>Price Range</h4> 2189 <a><i class="far fa-chevron-up"></i></a> 2190 </span> 2191 <div id="pricerange-list"></div> 2192 </div> 2193 2194 <div class="body-container srp-panel-toggle"> 2195 <span> 2196 <h4>Body</h4> 2197 <a><i class="far fa-chevron-up"></i></a> 2198 </span> 2199 <div id="body-list"></div>
2200 </div> 2201 2202 <div class="cab-container srp-panel-toggle"> 2203 <span> 2204 <h4>Cab Style</h4> 2205 <a><i class="far fa-chevron-up"></i></a> 2206 </span> 2207 <div id="cab-list"></div> 2208 </div> 2209 2210 <div class="bed-container srp-panel-toggle"> 2211 <span> 2212 <h4>Bed Style</h4> 2213 <a><i class="far fa-chevron-up"></i></a> 2214 </span> 2215 <div id="bed-list"></div> 2216 </div> 2217 2218 <div class="fuel-container srp-panel-toggle"> 2219 <span> 2220 <h4>Fuel</h4> 2221 <a><i class="far fa-chevron-up"></i></a> 2222 </span> 2223 <div id="fuel-list"></div> 2224 </div> 2225 2226 <div class="transmission-container srp-panel-toggle"> 2227 <span> 2228 <h4>Transmission</h4> 2229 <a><i class="far fa-chevron-up"></i></a> 2230 </span> 2231 <div id="transmission-list"></div> 2232 </div> 2233 2234 <div class="color-container srp-panel-toggle"> 2235 <span> 2236 <h4>Color</h4> 2237 <a><i class="far fa-chevron-up"></i></a> 2238 </span> 2239 <div id="color-list"></div> 2240 </div> 2241 2242 <div class="drivetrain-container srp-panel-toggle"> 2243 <span> 2244 <h4>Drivetrain</h4> 2245 <a><i class="far fa-chevron-up"></i></a> 2246 </span> 2247 <div id="drivetrain-list"></div> 2248 </div> 2249 2250 <div class="location-container srp-panel-toggle"> 2251 <span> 2252 <h4>Location</h4> 2253 <a><i class="far fa-chevron-up"></i></a> 2254 </span> 2255 <div id="location-list"></div> 2256 </div> 2257 2258 <div class="mpg-hway-container srp-panel-toggle"> 2259 <span> 2260 <h4>MPG Highway</h4> 2261 <a><i class="far fa-chevron-up"></i></a> 2262 </span> 2263 <div id="mpg-hway-list"></div> 2264 </div> 2265 2266 <div class="mpg-city-container srp-panel-toggle"> 2267 <span> 2268 <h4>MPG City</h4> 2269 <a><i class="far fa-chevron-up"></i></a> 2270 </span> 2271 <div id="mpg-city-list"></div> 2272 </div> 2273 2274 <div class="features-container srp-panel-toggle"> 2275 <span> 2276 <h4>Features</h4> 2277 <a><i class="far fa-chevron-up"></i></a> 2278 </span> 2279 <div id="features-list"></div> 2280 </div> 2281 2282 <div class="status-container srp-panel-toggle"> 2283 <span> 2284 <h4>Status</h4> 2285 <a><i class="far fa-chevron-up"></i></a> 2286 </span> 2287 <div id="status-list"></div> 2288 </div> 2289 2290 <div class="range-container srp-panel-toggle"> 2291 <span> 2292 <h4>Range</h4> 2293 <a><i class="far fa-chevron-up"></i></a> 2294 </span> 2295 <div id="range-list"></div> 2296 </div> 2297 2298 </section> 2299</div> 2300 2301<div class="filterResultCount"><span id="srpFilterResultCount"></span></div> 2302 2303<div class="result-wrapper "> 2304 2305 <h1 style="visibility: hidden; position: absolute; z-index: 0;">New Vehicles</h1> 2306 2307 <div class='dv-offers-top-banner-new-srp-wrapper'><div class='dv-offers-top-banner-new-srp'><div class='dv-offers-banner-disclaimer'> 2308 <div class='dv-offers-banner-disclaimer-btn' data-disclaimer='New 2026 Toyota Tundra Models OR New 2026 Toyota Tundra SR5 Crew Max 4WD *Qualified customers who finance a new 2026 Tundra can receive as low as 2.99% APR for 72 months with 72 monthly payments of $15.19 for every $1,000 financed. Terms available on approved credit through Toyota Financial Services (TFS) at participating Toyota dealers. For only very well qualified customers. Amount financed, down payment amount, and credit worthiness may impact availability of offer. Dealer contribution may vary and could affect price. Individual dealer prices, other terms and offers may vary. Must take retail delivery from dealer's stock and terms subject to vehicle availability. Offer cannot be combined with TFS Lease Cash, Down Payment Assistance, Trade-in Assistance, Customer Cash, Lease, Lease Subvention Cash. See your participating Toyota dealer for details. Dealer sets final price. Price excludes tax, title, license and $490 dealer doc fee. Offer available in DE, MD, PA, VA, WV regardless of buyer's residency; void where prohibited. Expires 09-30-2026. **Qualified lessees can lease a new 2026 Tundra 4WD Crew Max SR5 V6 10AT Model 8361 for $379 per month for 36 months with $4,999 Due At Signing. Based on 10,000 miles/yr. Security Deposit waived. Lease excludes tax, title, license, registration fees, and dealer options and charges. $490 dealer doc fee extra. Terms available on approved credit through Toyota Financial Services (TFS) at participating Toyota dealers. Not all customers qualify. Lease example based on 2026 Tundra 4WD Crew Max S
2308R5 V6 10AT Model 8361 with Total SRP of $53,804, net capitalized cost of $47,024, and a lease end purchase amount of $37,663. $4,999 Due At Signing includes $3,870 customer down payment, first month's payment of $379 of the 36 month lease offer, and $750 Acquisition Fee. Security deposit required with exception of prior Toyota Financial Services (TFS) financing history and/or TFS credit rating in which a security deposit may be waived. Tax, title, license are extra. Dealer contribution may vary and could affect lease payment. Individual dealer prices, other terms and offers may vary. Must lease from participating dealer's stock and terms are subject to vehicle availability. Lessee responsible for maintenance, excess wear and use, and will pay $0.15 per mile for all mileage over 10,000 miles per year. $350 disposition fee is due at lease end. Offer cannot be combined with TFS Finance Cash, Down Payment Assistance, Trade-in Assistance, Customer Cash, APR, Finance Subvention Cash. Offer available in DE, MD, PA, VA, WV regardless of buyer's residency; void where prohibited. Expires 09-30-2026. Dealer sets final price. See your participating Toyota dealer for details. Model shown for illustration purposes only.' onclick='DVPopUp(this);return false;'>Disclaimer</div> 2309 </div><a data-ag-event='cta_interaction' href='https://www.brewerairporttoyota.com/new-vehicles/?model=Tundra' target='_self' title='New 2026 Toyota Tundra Models OR New 2026 Toyota Tundra SR5 Crew Max 4WD | Brewer Airport Toyota' class='dv-offers-top-banner-new-srp-desktop'><span class='dv-offers-offer-title-hidden'>New 2026 Toyota Tundra Models OR New 2026 Toyota Tundra SR5 Crew Max 4WD</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/BrewerAirportToyota0926_SRPBanner4_Tundra.jpg?auto=compress%2Cformat&ixlib=php-3.3.1' alt='New 2026 Toyota Tundra Models OR New 2026 Toyota Tundra SR5 Crew Max 4WD'/></a><a data-ag-event='cta_interaction' href='https://www.brewerairporttoyota.com/new-vehicles/?model=Tundra' target='_self' title='New 2026 Toyota Tundra Models OR New 2026 Toyota Tundra SR5 Crew Max 4WD | Brewer Airport Toyota' class='dv-offers-top-banner-new-srp-mobile'><span class='dv-offers-offer-title-hidden'>New 2026 Toyota Tundra Models OR New 2026 Toyota Tundra SR5 Crew Max 4WD</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/BrewerAirportToyota0926_SRPMobile4_Tundra.jpg?auto=compress%2Cformat&ixlib=php-3.3.1' alt='New 2026 Toyota Tundra Models OR New 2026 Toyota Tundra SR5 Crew Max 4WD | Brewer Airport Toyota'/></a></div><div class='dv-offers-top-banner-new-srp'><div class='dv-offers-banner-disclaimer'> 2310 <div class='dv-offers-banner-disclaimer-btn' data-disclaimer='New 2026 Toyota Camry LE 2WD *Qualified lessees can lease a new 2026 Camry 2WD 4Dr. Sedan LE Hybrid CVT Model 2559 for $279 per month for 36 months with $3,999 Due At Signing. Based on 10,000 miles/yr. Security Deposit waived. Lease excludes tax, title, license, registration fees, and dealer options and charges. $490 dealer doc fee extra. Terms available on approved credit through Toyota Financial Services (TFS) at participating Toyota dealers. Not all customers qualify. Lease example based on 2026 Camry 2WD 4Dr. Sedan LE Hybrid CVT Model 2559 with Total SRP of $31,214, net capitalized cost of $26,420, and a lease end purchase amount of $21,538. $3,999 Due At Signing includes $2,970 customer down payment, first month's payment of $279 of the 36 month lease offer, and $750 Acquisition Fee. Security deposit required with exception of prior Toyota Financial Services (TFS) financing history and/or TFS credit rating in which a security deposit may be waived. Tax, title, license are extra. Dealer contribution may vary and could affect lease payment. Individual dealer prices, monthly payment, and other terms and offers may vary. Must lease from participating dealer's stock and terms are subject to vehicle availability. Lessee responsible for maintenance, excess wear and use, and will pay $0.15 per mile for all mileage over 10,000 miles per year. $350 disposition fee is due at lease end. Offer cannot be combined with TFS Finance Cash, Down Payment Assistance, Trade-in Assistance, Customer Cash, APR, Finance Subvention Cash. Excludes 2WD 4Dr. Sedan XSE Hybrid CVT, 2WD 4Dr. Sedan XLE Hybrid CVT, 4WD 4Dr. Sedan XLE Hybrid CVT, 4WD 4Dr. Sedan XSE Hybrid CVT, 4WD 4Dr. Sedan NIGHTSHADE Hybrid CVT, 2WD 4Dr. Sedan NIGHTSHADE Hybrid CVT. Offer available in DE, MD, PA, VA, WV regardless of buyer's residency; void where prohibited. Expires 09-30-2026. Dealer sets final price. See your participating Toyota dealer for details. Model shown for illustration purposes only.' onclick='DVPopUp(this);return false;'>Disclaimer</div> 2311 </div><a data-ag-event='cta_interaction' href='https://www.brewerairporttoyota.com/new-vehicles/?model=Camry' target='_self' title='New 2026 Toyota Camry LE 2WD | Brewer Airport Toyota' class='dv-offers-top-banner-new-srp-desktop'><span class='dv-offers-offer-title-hidden'>New 2026 Toyota Camry LE 2WD</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/BrewerAirportToyota0926_SRPBanner3_Camry.jpg?auto=compress%2Cformat&ixlib=php-3.3.1' alt='New 2026 Toyota Camry LE 2WD'/></a><a data-ag-event='cta_interaction' href='https://www.brewerairporttoyota.com/new-vehicles/?model=Camry' target='_self' title='New 2026 Toyota Camry LE 2WD | Brewer Airport Toyota' class='dv-offers-top-banner-new-srp-mobile'><span class='dv-offers-offer-title-hidden'>New 2026 Toyota Camry LE 2WD</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/BrewerAirportToyota0926_SRPMobile3_Camry.jpg?auto=compress%2Cformat&ixlib=php-3.3.1' alt='New 2026 Toyota Camry LE 2WD | Brewer Airport Toyota'/></a></div><div class='dv-offers-top-banner-new-srp'><div class='dv-offers-banner-disclaimer'> 2312 <div class='dv-offers-banner-disclaimer-btn' data-disclaimer='New 2026 Toyota Tacoma SR5 Double Cab 4WD Qualified lessees can lease a new 2026 Tacoma 4WD Double Cab SR5 L4 8AT Model 7540 for $249 per month for 36 months with $4,999 Due At Signing. Based on 10,000 miles/yr. Security Deposit waived. Lease excludes tax, title, license, registration fees, and dealer options and charges. $490 dealer doc fee extra. Terms available on approved credit through Toyota Financial Services (TFS) at participating Toyota dealers. Not all customers qualify. Lease example based on 2026 Tacoma 4WD Double Cab SR5 L4 8AT Model 7540 with Total SRP of $42,550, net capitalized cost of $36,238, and a lease end purchase amount of $32,764. $4,999 Due At Signing includes $4,000 customer down payment, first month's payment of $249 of the 36 month lease offer, and $750 Acquisition Fee. Security deposit required with exception of prior Toyota Financial Services (TFS) financing history and/or TFS credit rating in which a security deposit may be waived. Tax, title, license are extra. Dealer contribution may vary and could affect lease payment. Individual dealer prices, monthly payment, and other terms and offers may vary. Must lease from participating dealer's stock and terms are subject to vehicle availability. Lessee responsible for maintenance, excess wear and use, and will pay $0.15 per mile for all mileage over 10,000 miles per year. $350 disposition fee is due at lease end. Offer cannot be combined with TFS Finance Cash, Down Payment Assistance, Trade-in Assistance, Customer Cash, APR, Finance Subvention Cash. Excludes 4WD Double Cab SR L4 8AT, 4WD Double Cab SR L4 6MT, 4WD Extra Cab SR L4 8AT, 2WD Double Cab TRD SPORT L4 8AT, 4WD Double Cab TRD SPORT L4 6MT, 2WD Extra Cab SR L4 8AT, 2WD Extra Cab TRD PRERUN L4 8AT, 4WD Double Cab LIMITED L4 8AT, 4WD Double Cab TRD OFF RD L4 6MT, 2WD Double Cab SR L4 8AT, 4WD Double Cab TRD OFF RD L4 8AT, 4WD Double Cab TRD OFF RD L4 8AT, 2WD Double Cab TRD SPORT L4 8AT, 4WD Double Cab TRD SPORT L4 8AT, 4WD Double Cab TRD SPORT L4 8AT. Offer available in DE, MD, PA, VA, WV regardless of buyer's residency; void where prohibited. Expires 09-30-2026. Dealer sets final price. See your participating Toyota dealer for details. Model shown for illustration purposes only. ' onclick='DVPopUp(this);return false;'>Disclaimer</div> 2313 </div><a data-ag-event='cta_interaction' href='https://www.brewerairporttoyota.com/new-vehicles/?model=Tacoma' target='_self' title='New 2026 Toyota Tacoma SR5 Double Cab 4WD | Brewer Airport Toyota' class='dv-offers-top-banner-new-srp-desktop'><span class='dv-offers-offer-title-hidden'>New 2026 Toyota Tacoma SR5 Double Cab 4WD</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/BrewerAirportToyota0926_SRPBanner2_Tacoma.jpg?auto=compress%2Cformat&ixlib=php-3.3.1' alt='New 2026 Toyota Tacoma SR5 Double Cab 4WD'/></a><a data-ag-event='cta_interaction' href='https://www.brewerairporttoyota.com/new-vehicles/?model=Tacoma' target='_self' title='New 2026 Toyota Tacoma SR5 Double Cab 4WD | Brewer Airport Toyota' class='dv-offers-top-banner-new-srp-mobile'><span class='dv-offers-offer-title-hidden'>New 2026 Toyota Tacoma SR5 Double Cab 4WD</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/BrewerAirportToyota0926_SRPMobile2_Tacoma.jpg?auto=compress%2Cformat&ixlib=php-3.3.1' alt='New 2026 Toyota Tacoma SR5 Double Cab 4WD | Brewer Airport Toyota'/></a></div><div class='dv-offers-top-banner-new-srp'><div class='dv-offers-banner-disclaimer'> 2314 <div class='dv-offers-banner-disclaimer-btn' data-disclaimer='New 2026 Toyota Corolla LE 2WD *Qualified lessees can lease a new 2026 Corolla 2WD 4Dr. Sedan LE L4 CVT-F Model 1852 for $189 per month for 36 months with $3,999 Due At Signing. Based on 10,000 miles/yr. Security Deposit waived. Lease excludes tax, title, license, registration fees, and dealer options and charges. $490 dealer doc fee extra. Terms available on approved credit through Toyota Financial Services (TFS) at participating Toyota dealers. Not all customers qualify. Lease example based on 2026 Corolla 2WD 4Dr. Sedan LE L4 CVT-F Model 1852 with Total SRP of $24,729, net capitalized cost of $20,429, and a lease end purchase amount of $16,816. $3,999 Due At Signing includes $3,060 customer down payment, first month's payment of $189 of the 36 month lease offer, and $750 Acquisition Fee. Security deposit required with exception of prior Toyota Financial Services (TFS) financing history and/or TFS credit rating in which a security deposit may be waived. Tax, title, license are extra. Dealer contribution may vary and could affect lease payment. Individual dealer prices, other terms and offers may vary. Must lease from participating dealer's stock and terms are subject to vehicle availability. Lessee responsible for maintenance, excess wear and use, and will pay $0.15 per mile for all mileage over 10,000 miles per year. $350 disposition fee is due at lease end. Offer cannot be combined with TFS Finance Cash, Down Payment Assistance, Trade-in Assistance, Customer Cash, APR, Finance Subvention Cash. Offer available in DE, MD, PA, VA, WV regardless of buyer's residency; void where prohibited. Expires 09-30-2026. Dealer sets final price. See your participating Toyota dealer for details. Model shown for illustration purposes only.' onclick='DVPopUp(this);return false;'>Disclaimer</div> 2315 </div><a data-ag-event='cta_interaction' href='https://www.brewerairporttoyota.com/new-vehicles/?model=Corolla' target='_self' title='New 2026 Toyota Corolla LE 2WD | Brewer Airport Toyota' class='dv-offers-top-banner-new-srp-desktop'><span class='dv-offers-offer-title-hidden'>New 2026 Toyota Corolla LE 2WD</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/BrewerAirportToyota0926_SRPBanner1_Corolla.jpg?auto=compress%2Cformat&ixlib=php-3.3.1' alt='New 2026 Toyota Corolla LE 2WD'/></a><a data-ag-event='cta_interaction' href='https://www.brewerairporttoyota.com/new-vehicles/?model=Corolla' target='_self' title='New 2026 Toyota Corolla LE 2WD | Brewer Airport Toyota' class='dv-offers-top-banner-new-srp-mobile'><span class='dv-offers-offer-title-hidden'>New 2026 Toyota Corolla LE 2WD</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/BrewerAirportToyota0926_SRPMobile1_Corolla.jpg?auto=compress%2Cformat&ixlib=php-3.3.1' alt='New 2026 Toyota Corolla LE 2WD | Brewer Airport Toyota'/></a></div></div>
2315<script> 2316 $(document).ready(function() { 2317 $(".dv-offers-top-banner-new-srp-wrapper").slick({ 2318 dots: false, 2319 autoplay: true, 2320 infinite: true, 2321 autoplaySpeed: 4500, 2322 speed: 500, 2323 slidesToShow: 1, 2324 pauseOnHover: true, 2325 pauseOnFocus: true, 2326 pauseOnDotsHover: true, 2327 arrows: true, 2328 dotsClass: "dv-offers-srp-dots", 2329 }) 2330 .on("beforeChange", function(event, slick, currentSlide, nextSlide) { 2331 if (currentSlide !== nextSlide) { 2332 var elements = document.querySelectorAll(".slick-center + .slick-cloned"); 2333 for (var i = 0; i < elements.length; i++) { 2334 setTimeout(function() { 2335 return elements[i].classList.add("slick-current", "slick-center"); 2336 }); 2337 } 2338 } 2339 }); 2340 2341 }); 2342 2343 </script>
2343 2344 <style> 2345 .dv-offers-top-banner-new-srp-wrapper .slick-arrow, .dv-offers-top-banner-used-srp-wrapper .slick-arrow { 2346 background: rgba(0,0,0,0.8); 2347 width: auto; 2348 height: auto 2349 } 2350 .dv-offers-top-banner-new-srp-wrapper .slick-arrow:before, .dv-offers-top-banner-used-srp-wrapper .slick-arrow:before { 2351 color: #fff; 2352 padding: 5px; 2353 line-height: 100%; 2354 display: block; 2355 width: auto; 2356 height: auto; 2357 } 2358 </style> 2359 2360 <div class="ag-tp-trade-srp-banner"></div> 2361 <div class="ag-tp-payments-srp-banner"></div> 2362 <div class="ag-tp-qualified-srp-banner"></div> 2363 2364 <div class="dv-srp-filter-tags"> 2365 <div class="dv-srp-filter-clear-btn" id="dv-srp-clear-filters"></div> 2366 <div id="filterTags"></div> 2367 </div> 2368 2369 <div id="srp-results" class="srp-results"> 2370 <div id="hit-template"> 2371 <div> 2372 <div class="listing" data-vehicle-id="{{databaseID}}" data-vehicle-vin="{{vin}}" data-vehicle-condition="{{condition}}" data-vehicle-year="{{yr}}" data-vehicle-stock-number="{{stockNumber}}" data-vehicle-make-model="{{make}} {{model}}" data-vehicle-price="{{final_price}}" data-vehicle-discount="{{discount_matrix}}" data-dealer-name="{{dealer.name}}" data-ag-ext-color="{{exteriorColor}}" data-ag-price="{{finalPriceInt}}" data-ag-make="{{make}}" data-ag-model="{{model}}" data-ag-type="{{body}}" data-ag-trim="{{trim}}" data-ag-vdp-url="{{vdpUrl}}"> 2373 <div class="listing-container" data-url='{{vdpUrl}}'> 2374 <div class="left-side"> 2375 {{#flags.hasSoldVehicles}} 2376 <div class="srp-mc-sold-banner"> 2377 <p>SOLD</p> 2378 </div> 2379 {{/flags.hasSoldVehicles}} 2380 <div class="vehicle-image"> 2381 2382 <div class="img-container image-ratio-perc image-aspect-ratio-4x3"> 2383 {{#flags.hasSpecial}} 2384 <div class="vehicle-special srp-banner-overlay">{{flags.specialText}}</div> 2385 {{/flags.hasSpecial}} 2386 {{#flags.isReserved}} 2387 <div class="vehicle-special reserved-vehicle"> 2388 This vehicle has a pending sale. <div class="dv-tooltip"> 2389 <p class="dv-tooltip-content">Pending Sale indicates a customer has either reserved or has begun the process to purchase this vehicle. Please contact us directly to learn about similar vehicles.</p> 2390 <i class="fal fa-question-circle"></i> 2391 </div> 2392 </div> 2393 {{/flags.isReserved}} 2394 <div class="vehicle-views"> 2395 <!-- Current image carousel --> 2396 <div id="swiper-240894" class="swiper srp-swiper-vehicles img" data-id="240894"> 2397 <div class="swiper-wrapper"> 2398 {{#imageUrls}} 2399 <div class="swiper-slide"> 2400 <img class="lazy srp-click-image" alt="{{condition}} {{yr}} {{make}} {{model}} {{body}}" data-src="{{.}}" /> 2401 <div class="swiper-lazy-preloader"></div> 2402 </div> 2403 {{/imageUrls}} 2404 </div> 2405 <!-- Add Navigation --> 2406 <!-- Changed <div> to <button> to prevent rapid clicks from triggering native text-selection/highlight on SRP cards --> 2407 <button type="button" class="swiper-button-next swiper-button-next-240894" aria-label="Next slide"></button> 2408 <button type="button" class="swiper-button-prev swiper-button-prev-240894" aria-label="Previous slide"></button> 2409</div> </div> 2410 </div> 2411 2412 <div class="dv-smartpath-container"> 2413 {{#flags.hasSmartpathDisclaimer}} 2414 <div class="dv-smartpath-disclaimer"> 2415 <p class="dv-sp-disclaimer">{{smartpathDisclaimer}}</p> 2416 </div> 2417 {{/flags.hasSmartpathDisclaimer}} 2418 </div> 2419 <div class="vehicle-colors"> 2420 <div class="exterior-color">
2421 {{#exteriorColor}} 2422 {{#exteriorHex}} 2423 <div style="background-color:{{exteriorHex}};"></div> 2424 {{/exteriorHex}} 2425 {{^exteriorHex}} 2426 {{#genericColor}} 2427 <div style="background-color:{{genericColor}};"></div> 2428 {{/genericColor}} 2429 {{^genericColor}} 2430 <div style="background: url('//bucket.dealeralchemist.com/assets/images/slash-square.png');background-size: 100%;"></div> 2431 {{/genericColor}} 2432 {{/exteriorHex}} 2433 <div class="color-info"> 2434 <p class="color-label">EXTERIOR</p> 2435 <p class="color">{{exteriorColor}} {{#exteriorColorDisclaimer}}<i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-disclaimer="{{exteriorColorDisclaimer}}"></i>{{/exteriorColorDisclaimer}}</p> 2436 </div> 2437 {{/exteriorColor}} 2438 </div> 2439 <div class="interior-color"> 2440 {{#interiorColor}} 2441 {{#interiorHex}} 2442 <div style="background-color:{{interiorHex}};"></div> 2443 {{/interiorHex}} 2444 {{^interiorHex}} 2445 {{#genericInteriorColor}} 2446 <div style="background-color:{{genericInteriorColor}};"></div> 2447 {{/genericInteriorColor}} 2448 {{^genericInteriorColor}} 2449 <div style="background: url('//bucket.dealeralchemist.com/assets/images/slash-square.png');background-size: 100%;"></div> 2450 {{/genericInteriorColor}} 2451 {{/interiorHex}} 2452 <div class="color-info"> 2453 <p class="color-label">INTERIOR</p> 2454 <p class="color">{{interiorColor}} {{#interiorColorDisclaimer}}<i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-disclaimer="{{interiorColorDisclaimer}}"></i>{{/interiorColorDisclaimer}}</p> 2455 </div> 2456 {{/interiorColor}} 2457 </div> 2458 </div> 2459 2460 </div> 2461 </div> 2462 <div class="right-side"> 2463 <div class="right-top" style="padding-left:0px"> 2464 <div class="vehicle-info"> 2465 <div class="vehicle-title-wrap"> 2466 <a href="{{vdpUrl}}"> 2467 <h2 class="car-title"><p class="category">{{condition}} {{yr}}</p> 2468<span class="new-used secondary_color">{{make}} {{model}} {{trim}} {{cab}} {{bed}} {{stylename}}</span></h2> 2469 <div class="vin-stock"> 2470 <p class="vin">{{#mileage}}<div class='ag-srp-miles'><p style='font-size:12px;'><i class="fa-light fa-gauge-low"></i> Mileage <span style='font-size:12px;'>{{#helpers.formatNumber}}{{mileage}}{{/helpers.formatNumber}} </span></p></div>{{/mileage}}</p> 2471 </div> 2472 </a> 2473 <div class="title-actions"> 2474 </div> 2475 </div> 2476 <div class="specs"> 2477 <!--<p>Engine <span style="font-weight: bold;font-family: 'ToyotaType', sans-serif">{{engine}}</span></p> 2478<p>Drivetrain <span style="font-weight: bold;font-family: 'ToyotaType', sans-serif">{{drivetrain}}</span></p> 2479{{#range}}<p>Range <span style="font-weight: bold;font-family: 'ToyotaType', sans-serif">{{range}}</span></p>{{/range}} 2480--> 2481<div class="man-badges"> 2482{{#flags.hasToyotaCare}} 2483 <a href="/toyotacare/" class="dv-tooltip"><p class="dv-tooltip-content">ToyotaCare is a no cost maintenance plan with 24-hour roadside assistance. The ToyotaCare plan covers normal factory scheduled maintenance for 2 years or 25,000 miles, whichever comes first. 24-hour roadside assistance is also included for 2 years and unlimited miles.</p><img alt="toyota care logo" src="//bucket.dealervenom.com/assets/oem/toyota/logos/toyota-care.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=100"></a> 2484{{/flags.hasToyotaCare}} 2485{{#flags.hasToyotaSafety}} 2486 <a href="/toyota-safety-sense/" class="dv-tooltip dv-toyota-safety-sense"><p class="dv-tooltip-content">Toyota Safety Sense™ (TSS) is a bundle of active safety features included on many new Toyota vehicles at no additional cost. These innovative features were designed to help protect you and your passengers from harm.</p><img alt="toyota safety sense logo" src="//bucket.dealervenom.com/assets/oem/toyota/logos/toyota-safety-sense.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=56"></a> 2487{{/flags.hasToyotaSafety}} 2488</div> </div> 2489 </div> 2490 {{#certified}} 2491 <div class="srp-tcuv-container"> 2492 <img src="https://media.dealeralchemist.com/oem/toyota/logo-certified-used-vehicles.svg?auto=compress%2Cformat" alt="TCUV Logo" width="50%"/> 2493 {{#flags.isGoldCertified}} 2494 <div class="srp-tcuv-gold">
2495 <span>GOLD CERTIFIED</span> 2496 <p>View Details <a href="/certified-vehicle-information/" target="_blank"><i class="fad fa-info-circle"></i></a></p> 2497 </div> 2498 {{/flags.isGoldCertified}} 2499 {{#flags.isSilverCertified}} 2500 <div class="srp-tcuv-silver"> 2501 <span>SILVER CERTIFIED</span> 2502 <p>View Details <a href="/certified-vehicle-information/" target="_blank"><i class="fad fa-info-circle"></i></a></p> 2503 </div> 2504 {{/flags.isSilverCertified}} 2505 </div> 2506 {{/certified}} 2507 <div class="vehicle-price-container"> 2508 <div class="vehicle-price flex_box"> 2509 {{!-- ============================================================ --}} 2510{{!-- SRP PRICING STACK --}} 2511{{!-- Renders pricing breakdown for vehicle search result cards. --}} 2512{{!-- ============================================================ --}} 2513{{^flags.internetPriceHigher}} 2514 {{#flags.msrpFinal}} 2515 {{#flags.noFinalPrice}} 2516 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2517 <p class="dv-pricing-stack-strong"> 2518 <a data-aga-event="clickToCall" data-aga-event-set-prop="clickToCallDepartment|Sales" href='tel:{{dealer.phone}}'>CALL FOR PRICE</a> 2519 <span class="dv-pricing-stack-value-default"> 2520 <a data-aga-event="clickToCall" data-aga-event-set-prop="clickToCallDepartment|Sales" href='tel:{{dealer.phone}}'>{{dealer.phone}}</a> 2521 </span> 2522 </p> 2523 </div> 2524 {{/flags.noFinalPrice}} 2525 {{^flags.noFinalPrice}} 2526 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2527 <p class="dv-pricing-stack-strong"> 2528 TSRP 2529 <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-modal-title="MSRP" data-disclaimer="This is the Manufacturer Suggested Retail Price for this Vehicle."></i> 2530 2531 <span class="dv-pricing-stack-strong">{{msrp}}</span> 2532 </p> 2533 </div> 2534 {{/flags.noFinalPrice}} 2535 {{/flags.msrpFinal}} 2536 {{^flags.msrpFinal}} 2537 <div class="dv-pricing-stack-container"> 2538 {{#flags.noFinalPrice}} 2539 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2540 <p class="dv-pricing-stack-strong"> 2541 <a data-aga-event="clickToCall" data-aga-event-set-prop="clickToCallDepartment|Sales" href='tel:{{dealer.phone}}'>CALL FOR PRICE</a> 2542 <span class="dv-pricing-stack-value-default"> 2543 <a data-aga-event="clickToCall" data-aga-event-set-prop="clickToCallDepartment|Sales" href='tel:{{dealer.phone}}'>{{dealer.phone}}</a> 2544 </span> 2545 </p> 2546 </div> 2547 {{/flags.noFinalPrice}} 2548 {{^flags.noFinalPrice}} 2549 2550 {{!-- ── MSRP (with strikethrough slash) ── --}} 2551 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2552 <p class="dv-pricing-stack-strong"> 2553 TSRP 2554 <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-modal-title="MSRP" data-disclaimer="This is the Manufacturer Suggested Retail Price for this Vehicle."></i> 2555 2556 <span class="dv-pricing-stack-strong">{{msrp}}</span> 2557 </p> 2558 </div> 2559 2560 {{!-- ── Custom Pricing Rule (Dealer Adjustment) ── --}} 2561 {{#flags.hasDiscountMatrix}} 2562 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2563 <p class="dv-pricing-stack-strong"> 2564 Dealer Adjustment 2565 <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-disclaimer="This is a custom dealer amount."></i> 2566 <span class="dv-pricing-stack-strong">{{discountMatrix}}</span> 2567 </p> 2568 </div> 2569 {{/flags.hasDiscountMatrix}} 2570 {{!-- ── Dealer Doc Fees ── --}} 2571 {{#flags.hasDealerFees}} 2572 {{#dealerFees}} 2573 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2574 <p class="dv-pricing-stack-strong">{{name}} <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-modal-title="{{name}}" data-disclaimer="{{disclaimer}}"></i>
2575 <span class="dv-pricing-stack-strong">+{{displayAmount}}</span> 2576 </p> 2577 </div> 2578 {{/dealerFees}} 2579 {{/flags.hasDealerFees}} 2580 2581 {{!-- ── Dealer Installed Accessories ── --}} 2582 {{#options}} 2583 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2584 <p class="dv-pricing-stack-strong"> 2585 {{name}} 2586 <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-modal-title="Dealer Installed Options" data-disclaimer="Installed Packages by the Dealership. {{name}} - {{description}}"></i> 2587 <span class="dv-pricing-stack-strong">+{{price}}</span> 2588 </p> 2589 </div> 2590 {{/options}} 2591 2592 {{!-- ── Non-Conditional Incentives (with flyout) ── --}} 2593 {{#flags.hasIncentives}} 2594 <div class="ag-incentives-row-wrap"> 2595 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2596 <p class="dv-pricing-stack-strong"> 2597 {{make}} Incentives 2598 <i class="fad fa-info-circle ag-incentives-icon-trigger" tabindex="0" role="button" aria-label="View incentive details"></i> 2599 <span class="dv-pricing-stack-strong">{{incentivesDiscount}}</span> 2600 </p> 2601 </div> 2602 <div class="ag-conditional-offers ag-incentives-flyout"> 2603 <details class="ag-details-wrapper"> 2604 <summary class="ag-incentives-hidden-summary" aria-hidden="true"></summary> 2605 <div class="ag-conditional-panel"> 2606 <div class="ag-conditional-panel-inner"> 2607 {{#incentives}} 2608 <div class="dv-dealer-subtotal da-srp-incentive-stack dv-pricing-main"> 2609 <div class="ag-incentive-line-item"> 2610 <p class="da-srp-incentive da-conditional ag-incentive-row"> 2611 <span class="ag-incentive-copy-wrap"> 2612 <span class="ag-incentive-title">{{programDescription}}</span> 2613 <span class="ag-incentive-disclaimer">{{disclaimerText}}</span> 2614 </span> 2615 <span class="da-conditional ag-incentive-value">-{{programValue}}</span> 2616 </p> 2617 </div> 2618 </div> 2619 {{/incentives}} 2620 {{^flags.hasIncentives}} 2621 <div class="ag-dealer-cond-incentive"> 2622 <p class="ag-pricing-stack-desc">No incentive details available at this time.</p> 2623 </div> 2624 {{/flags.hasIncentives}} 2625 </div> 2626 </div> 2627 </details> 2628 </div> 2629 </div> 2630 {{/flags.hasIncentives}} 2631 2632 {{!-- ── Dealer / Feed Discount ── --}} 2633 {{#flags.hasDealerDiscount}} 2634 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2635 <p class="dv-pricing-stack-strong"> 2636 Dealer Discount 2637 <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-modal-title="Dealer Discount" data-disclaimer="This is the discount provided by the dealership."></i> 2638 <span class="dv-pricing-stack-strong">{{dealerDiscount}}</span> 2639 </p> 2640 </div> 2641 {{/flags.hasDealerDiscount}} 2642 2643 2644 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2645 <p class="dv-pricing-stack-strong"> 2646 Brewer Airport Price 2647 <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-modal-title="Our Price" data-disclaimer="This is our price after all discounts and incentives everyone qualifies for."></i> 2648 <span class="dv-pricing-stack-value-default" style="color: #000000 !important;">{{finalPrice}}</span> 2649 </p> 2650 </div> 2651 {{/flags.noFinalPrice}} 2652 </div> 2653 {{/flags.msrpFinal}} 2654{{/flags.internetPriceHigher}} 2655{{#flags.internetPriceHigher}} 2656 {{^flags.noFinalPrice}} 2657 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2658 <p class="dv-pricing-stack-strong"> 2659 TSRP 2660 <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-modal-title="MSRP" data-disclaimer="This is the Manufacturer Suggested Retail Price for this Vehicle."></i> 2661 2662 <span class="dv-pricing-stack-strong">{{msrp}}</span> 2663 </p> 2664 </div> 2665 {{!-- ── Dealer Doc Fees ── --}} 2666 {{#flags.hasDealerFees}} 2667 {{#dealerFees}} 2668 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2669 <p class="dv-pricing-stack-strong">{{name}} <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-modal-title="{{name}}" data-disclaimer="{{disclaimer}}"></i> 2670 <span class="dv-pricing-stack-strong">+{{displayAmount}}</span> 2671 </p> 2672 </div> 2673 {{/dealerFees}} 2674 {{/flags.hasDealerFees}} 2675 <div class="dv-dealer-subtotal dv-price-stack dv-pricing-main"> 2676 <p class="dv-pricing-stack-strong"> 2677 Brewer Airport Price 2678 <i class="fad fa-info-circle" onclick="DVPopUp(this);return false;" data-modal-title="Our Price" data-disclaimer="This is our price after all discounts and incentives everyone qualifies for."></i>
2679 <span class="dv-pricing-stack-value-default" style="color: #000000 !important;">{{finalPrice}}</span> 2680 </p> 2681 </div> 2682 {{/flags.noFinalPrice}} 2683{{/flags.internetPriceHigher}} 2684 2685{{!-- ============================================================ --}} 2686{{!-- FLYOUT BEHAVIOR SCRIPT --}} 2687{{!-- Handles expand/collapse for incentives and doc-fee panels. --}} 2688{{!-- Self-initializing guard prevents double-binding. --}} 2689{{!-- ============================================================ --}}
2690<script> 2691(function () { 2692if (window.agOfferFlyoutsInitialized) return; 2693window.agOfferFlyoutsInitialized = true; 2694 2695const VEHICLE_CARD_SELECTOR = '.ag-vehicle-card, .vehicle-card, .inventory-card, .srp-vehicle, .vdp-vehicle, [data-vehicle]'; 2696const ANIMATION_DURATION = 250; 2697 2698/* ── Helpers ───────────────────────────────────────────── */ 2699 2700function getPriceContainer(element) { 2701const card = element.closest(VEHICLE_CARD_SELECTOR); 2702return card ? card.querySelector('.vehicle-price-container') : null; 2703} 2704 2705function expandFlyout(flyout, details, panel, priceContainer) { 2706details.open = true; 2707const pushAmount = panel.scrollHeight + 10; 2708 2709requestAnimationFrame(function () { 2710requestAnimationFrame(function () { 2711flyout.classList.add('ag-is-expanded'); 2712 2713if (priceContainer) { 2714priceContainer.style.transition = 'transform 250ms ease'; 2715priceContainer.style.transform = 'translateY(-' + pushAmount + 'px)'; 2716} 2717}); 2718}); 2719} 2720 2721function collapseFlyout(flyout, details, priceContainer) { 2722flyout.classList.remove('ag-is-expanded'); 2723 2724if (priceContainer) { 2725priceContainer.style.transform = ''; 2726} 2727 2728setTimeout(function () { 2729if (!flyout.classList.contains('ag-is-expanded')) { 2730details.open = false; 2731} 2732}, ANIMATION_DURATION); 2733} 2734 2735function toggleFlyout(flyout, details, panel, priceContainer) { 2736if (!flyout || !details || !panel) return; 2737 2738const isExpanding = !flyout.classList.contains('ag-is-expanded'); 2739 2740if (isExpanding) { 2741expandFlyout(flyout, details, panel, priceContainer); 2742} else { 2743collapseFlyout(flyout, details, priceContainer); 2744} 2745} 2746 2747/* ── Click Handler ─────────────────────────────────────── */ 2748 2749document.addEventListener('click', function (e) { 2750 2751/* Incentives icon trigger */ 2752const incentivesIconTrigger = e.target.closest('.ag-incentives-icon-trigger'); 2753if (incentivesIconTrigger) { 2754const wrap = incentivesIconTrigger.closest('.ag-incentives-row-wrap'); 2755if (!wrap) return; 2756 2757const flyout = wrap.querySelector('.ag-incentives-flyout'); 2758const details = wrap.querySelector('.ag-details-wrapper'); 2759const panel = wrap.querySelector('.ag-conditional-panel'); 2760const priceContainer = getPriceContainer(incentivesIconTrigger); 2761 2762e.preventDefault(); 2763e.stopPropagation(); 2764toggleFlyout(flyout, details, panel, priceContainer); 2765return; 2766} 2767 2768/* Doc fee icon trigger */ 2769const docFeeIconTrigger = e.target.closest('.ag-doc-fee-icon-trigger'); 2770if (docFeeIconTrigger) { 2771const wrap = docFeeIconTrigger.closest('.ag-doc-fee-row-wrap'); 2772if (!wrap) return; 2773 2774const flyout = wrap.querySelector('.ag-doc-fee-flyout'); 2775const details = wrap.querySelector('.ag-doc-fee-details-wrapper'); 2776const panel = wrap.querySelector('.ag-doc-fee-panel'); 2777const priceContainer = getPriceContainer(docFeeIconTrigger); 2778 2779e.preventDefault(); 2780e.stopPropagation(); 2781toggleFlyout(flyout, details, panel, priceContainer); 2782return; 2783} 2784 2785/* Close incentives flyout on outside click */ 2786const openIncentivesFlyout = document.querySelector('.ag-incentives-flyout.ag-is-expanded'); 2787if (openIncentivesFlyout) { 2788const wrap = openIncentivesFlyout.closest('.ag-incentives-row-wrap'); 2789if (wrap && !wrap.contains(e.target)) { 2790const details = openIncentivesFlyout.querySelector('.ag-details-wrapper'); 2791const priceContainer = getPriceContainer(openIncentivesFlyout); 2792if (details) collapseFlyout(openIncentivesFlyout, details, priceContainer); 2793} 2794} 2795 2796/* Close doc fee flyout on outside click */ 2797const openDocFeeFlyout = document.querySelector('.ag-doc-fee-flyout.ag-is-expanded'); 2798if (openDocFeeFlyout) { 2799const wrap = openDocFeeFlyout.closest('.ag-doc-fee-row-wrap'); 2800if (wrap && !wrap.contains(e.target)) { 2801const details = openDocFeeFlyout.querySelector('.ag-doc-fee-details-wrapper'); 2802const priceContainer = getPriceContainer(openDocFeeFlyout); 2803if (details) collapseFlyout(openDocFeeFlyout, details, priceContainer); 2804} 2805} 2806}); 2807 2808/* ── Keyboard Handler (Enter / Space) ──────────────────── */ 2809 2810document.addEventListener('keydown', function (e) { 2811if (e.key !== 'Enter' && e.key !== ' ') return; 2812 2813/* Incentives keyboard trigger */ 2814const incentivesKeyTrigger = e.target.closest('.ag-incentives-icon-trigger'); 2815if (incentivesKeyTrigger) { 2816const wrap = incentivesKeyTrigger.closest('.ag-incentives-row-wrap'); 2817if (!wrap) return; 2818 2819const flyout = wrap.querySelector('.ag-incentives-flyout'); 2820const details = wrap.querySelector('.ag-details-wrapper'); 2821const panel = wrap.querySelector('.ag-conditional-panel'); 2822const priceContainer = getPriceContainer(incentivesKeyTrigger); 2823 2824e.preventDefault(); 2825toggleFlyout(flyout, details, panel, priceContainer); 2826return; 2827} 2828 2829/* Doc fee keyboard trigger */ 2830const docFeeKeyTrigger = e.target.closest('.ag-doc-fee-icon-trigger'); 2831if (docFeeKeyTrigger) { 2832const wrap = docFeeKeyTrigger.closest('.ag-doc-fee-row-wrap'); 2833if (!wrap) return; 2834 2835const flyout = wrap.querySelector('.ag-doc-fee-flyout'); 2836const details = wrap.querySelector('.ag-doc-fee-details-wrapper'); 2837const panel = wrap.querySelector('.ag-doc-fee-panel'); 2838const priceContainer = getPriceContainer(docFeeKeyTrigger); 2839 2840e.preventDefault(); 2841toggleFlyout(flyout, details, panel, priceContainer); 2842} 2843}); 2844})(); 2845</script>
2845 2846 2847{{!-- ============================================================ --}} 2848{{!-- STYLES --}} 2849{{!-- ============================================================ --}} 2850<style> 2851 2852/* ── Price Stack ───────────────────────────────────────── */ 2853 2854.dv-price-stack p { 2855height: 23px; 2856font-size: 14px; 2857font-weight: bold; 2858position: relative; 2859} 2860 2861.dv-price-stack p b { 2862font-size: 14px; 2863font-weight: bold; 2864} 2865 2866.dv-price-stack span { 2867font-size: 14px; 2868font-weight: bold; 2869} 2870 2871.dv-price-stack .dv-price-slash { 2872max-width: 63px; 2873z-index: 98; 2874position: absolute; 2875right: 0; 2876} 2877 2878.dv-pricing-stack-strong .dv-pricing-stack-value-default { 2879color: #00bb00; 2880} 2881 2882 2883/* ── Incentives Flyout ─────────────────────────────────── */ 2884 2885.ag-incentives-row-wrap { 2886position: relative; 2887} 2888 2889.ag-incentives-hidden-summary { 2890display: none; 2891} 2892 2893.ag-incentives-icon-trigger { 2894cursor: pointer; 2895margin-left: 4px; 2896color: inherit; 2897} 2898 2899.ag-incentives-icon-trigger:focus-visible { 2900outline: 2px solid rgba(0, 0, 0, 0.18); 2901outline-offset: 2px; 2902border-radius: 2px; 2903} 2904 2905.ag-incentives-flyout { 2906width: 100%; 2907position: relative; 2908--anim-speed: 250ms; 2909margin-top: 0; 2910border-top: 0; 2911padding-top: 0; 2912} 2913 2914.ag-incentives-flyout .ag-conditional-panel { 2915display: grid; 2916grid-template-rows: 0fr; 2917position: absolute; 2918left: 0; 2919right: 0; 2920bottom: calc(100% + 10px); 2921overflow: hidden; 2922transition: grid-template-rows var(--anim-speed) ease; 2923border-radius: 10px; 2924background: rgba(255, 255, 255, 0.92); 2925backdrop-filter: blur(8px); 2926z-index: 999; 2927box-shadow: 0 10px 28px rgba(0, 0, 0, 0.16); 2928} 2929 2930.ag-incentives-flyout.ag-is-expanded .ag-conditional-panel { 2931grid-template-rows: 1fr; 2932border: 1px solid rgba(0, 0, 0, 0.08); 2933} 2934 2935.ag-incentives-flyout .ag-conditional-panel-inner { 2936min-height: 0; 2937padding: 0 14px; 2938transition: padding var(--anim-speed) ease; 2939} 2940 2941.ag-incentives-flyout.ag-is-expanded .ag-conditional-panel-inner { 2942padding: 12px 14px; 2943} 2944 2945.ag-incentives-flyout .da-srp-incentive-stack, 2946.ag-incentives-flyout .da-srp-incentive-stack .dv-pricing-stack-strong, 2947.ag-incentives-flyout .da-srp-incentive-stack p { 2948height: auto !important; 2949min-height: 0; 2950} 2951 2952 2953/* ── Doc Fee Flyout ────────────────────────────────────── */ 2954 2955.ag-doc-fee-row-wrap { 2956position: relative; 2957} 2958 2959.ag-doc-fee-hidden-summary { 2960display: none; 2961} 2962 2963.ag-doc-fee-icon-trigger { 2964cursor: pointer; 2965margin-left: 4px; 2966color: inherit; 2967} 2968 2969.ag-doc-fee-icon-trigger:focus-visible { 2970outline: 2px solid rgba(0, 0, 0, 0.18); 2971outline-offset: 2px; 2972border-radius: 2px; 2973} 2974 2975.ag-doc-fee-flyout { 2976width: 100%; 2977position: relative; 2978--anim-speed: 250ms; 2979margin-top: 0; 2980border-top: 0; 2981padding-top: 0; 2982} 2983 2984.ag-doc-fee-flyout .ag-doc-fee-panel { 2985display: grid; 2986grid-template-rows: 0fr; 2987position: absolute; 2988left: 0; 2989right: 0; 2990bottom: calc(100% + 10px); 2991overflow: hidden; 2992transition: grid-template-rows var(--anim-speed) ease; 2993border-radius: 10px; 2994background: rgba(255, 255, 255, 0.92); 2995backdrop-filter: blur(8px); 2996z-index: 999; 2997box-shadow: 0 10px 28px rgba(0, 0, 0, 0.16); 2998} 2999 3000.ag-doc-fee-flyout.ag-is-expanded .ag-doc-fee-panel { 3001grid-template-rows: 1fr; 3002border: 1px solid rgba(0, 0, 0, 0.08); 3003} 3004 3005.ag-doc-fee-flyout .ag-doc-fee-panel-inner { 3006min-height: 0; 3007padding: 0 14px; 3008transition: padding var(--anim-speed) ease; 3009} 3010 3011.ag-doc-fee-flyout.ag-is-expanded .ag-doc-fee-panel-inner { 3012padding: 12px 14px; 3013} 3014 3015.ag-doc-fee-flyout .da-srp-incentive-stack, 3016.ag-doc-fee-flyout .da-srp-incentive-stack .dv-pricing-stack-strong, 3017.ag-doc-fee-flyout .da-srp-incentive-stack p { 3018height: auto !important; 3019min-height: 0; 3020} 3021 3022 3023/* ── Shared Line Item Styles (used by both flyouts) ────── */ 3024 3025.ag-incentive-line-item { 3026width: 100%; 3027} 3028 3029.ag-incentive-row { 3030display: grid; 3031grid-template-columns: minmax(0, 1fr) auto; 3032align-items: start; 3033column-gap: 10px; 3034margin: 0; 3035line-height: 1.25; 3036} 3037 3038.ag-incentive-copy-wrap { 3039min-width: 0; 3040display: block; 3041} 3042 3043.ag-incentive-title { 3044display: block; 3045font-size: 0.8rem;
3046font-weight: 700; 3047color: #222; 3048line-height: 1.2; 3049} 3050 3051.ag-incentive-disclaimer { 3052display: block; 3053margin-top: 3px; 3054font-size: 0.55rem; 3055line-height: 1.25; 3056color: #666; 3057font-weight: 400; 3058white-space: normal; 3059overflow-wrap: anywhere; 3060} 3061 3062.ag-incentive-value { 3063display: inline-block; 3064white-space: nowrap; 3065font-size: 0.8rem !important; 3066font-weight: 700; 3067align-self: start; 3068} 3069 3070.da-srp-incentive-stack { 3071position: relative; 3072padding: 8px 0; 3073} 3074 3075.da-srp-incentive-stack:not(:last-child) { 3076border-bottom: 1px dashed #d7d7d7; 3077} 3078 3079.da-srp-incentive-stack:last-child { 3080border-bottom: none; 3081} 3082 3083.ag-details-wrapper summary::-webkit-details-marker, 3084.ag-doc-fee-details-wrapper summary::-webkit-details-marker { 3085display: none; 3086} 3087 3088.ag-details-wrapper summary, 3089.ag-doc-fee-details-wrapper summary { 3090list-style: none; 3091outline: none; 3092} 3093 3094</style> 3095 3096 </div> 3097 3098 3099 3100 3101 3102 3103 </div> 3104 3105 <!-- Conditional Incentives SRP card displays --> 3106 <style> 3107 .incentive-items { 3108 border-bottom: none !important; 3109 display: flex; 3110 padding-bottom: 5px; 3111 width: 100%; 3112 } 3113 3114 .incentive-items > div:first-of-type { 3115 /* padding-right: 5%; */ 3116 } 3117 3118 .incentive-items > div:last-of-type { 3119 display: flex; 3120 flex-flow: column; 3121 align-items: flex-end; 3122 justify-content: space-evenly; 3123 height: 100px; 3124 min-width: 200px; 3125 } 3126 3127 .incentive-items h4 { 3128 font-size: 16px; 3129 font-weight: 500; 3130 } 3131 3132 .incentives-btn { 3133 color: #ffffff; 3134 background-color: #eb0a1e; 3135 font-size: .8rem; 3136 font-weight: 100; 3137 cursor: pointer; 3138 padding: 5px 10px; 3139 } 3140 3141 .incentives-btn:hover { 3142 background-color: #000000; 3143 color: #ffffff; 3144 } 3145 3146 .input-incentive-name, 3147 .input-incentive-value { 3148 display: none; 3149 } 3150 3151 .incentives-description { 3152 margin: 0 !important; 3153 } 3154 3155 .incentive-items { 3156 display: flex; 3157 justify-content: space-between; 3158 align-items: flex-start; 3159 padding: 1rem; 3160 border-bottom: 1px solid #eee; 3161 } 3162 3163 .cash-incentives { 3164 align-items: flex-end; 3165 } 3166 3167 .cash-incentives-value { 3168 margin-right: 10%; 3169 } 3170 3171 .incentives-btn { 3172 white-space: nowrap; 3173 min-width: fit-content; 3174 } 3175 3176 .hidden { 3177 display: none; 3178 } 3179 3180 .toggle-list-item { 3181 display: flex; 3182 justify-content: space-between; 3183 align-items: center; 3184 cursor: pointer; 3185 padding-bottom: 25px; 3186 } 3187 3188 #srp_incentives_form:not(.hidden) { 3189 display: block !important; 3190 } 3191 3192 .ag-dealer-cond-incentive { 3193 display: flex; 3194 justify-content: space-between; 3195 align-items: center; 3196 padding: 0.25rem 0; 3197 width: 100%; 3198 gap: 1rem; 3199 } 3200 3201 .incentive-content { 3202 display: flex; 3203 align-items: baseline; 3204 gap: 0.5rem; 3205 flex: 1; 3206 } 3207 3208 .ag-pricing-stack-strong { 3209 margin: 0; 3210 font-size: 0.75rem; 3211 line-height: 1.2; 3212 flex: 1; 3213 } 3214 3215 .ag-pricing-stack-value { 3216 font-size: 0.75rem; 3217 text-align: right; 3218 white-space: nowrap; 3219 min-width: 60px; 3220 } 3221 3222 .ag-conditional-stack-label { 3223 padding-bottom: 5px; 3224 } 3225 3226 .ag-price-stack-incentives { 3227 padding: 25px; 3228 } 3229 </style> 3230 3231 {{#flags.hasConditionalIncentives}} 3232 <div class="ag-price-stack ag-price-stack-incentives"> 3233 <h5 class="ag-conditional-stack-label">Additional Available Offers</h5> 3234 3235 {{#_transformed.priorityIncentives}} 3236 <div class="ag-dealer-cond-incentive"> 3237 <div class="incentive-content"> 3238 <p class="ag-pricing-stack-strong">{{programDescription}}</p> 3239 <i class="fad fa-info-circle" 3240 onclick="DVPopUp(this);return false;" 3241 data-disclaimer="{{disclaimerText}}</br></br>{{programRuleList.0.description}}</br></br>Effective : {{effectiveDate}} to {{expiryDate}}"> 3242 </i> 3243 </div> 3244 <div class="ag-pricing-stack-value">{{programValue}}</div> 3245 </div> 3246 {{/_transformed.priorityIncentives}} 3247 3248 {{#_transformed.remainingIncentivesCount}} 3249 <div class="ag-dealer-cond-incentive ag-price-stack ag-more-incentives"> 3250 <a href="javascript: void(0);" 3251 data-vehicle-vin="{{vin}}" 3252 data-vehicle-condition="{{condition}}" 3253 data-vehicle-year="{{yr}}" 3254 data-vehicle-stock-number="{{stockNumber}}" 3255 data-vehicle-make-model="{{make}} {{model}}" 3256 data-vehicle-price="{{finalPrice}}" 3257 data-dealer-name="{{dealer.name}}" 3258 data-vehicle-url="{{vdpUrl}}"> 3259 <h5 class="ag-conditional-stack-label"> 3260 See {{_transformed.remainingIncentivesCount}} Additional Available Offers 3261 <i class="fal fa-chevron-right"></i> 3262 </h5>
3263 <span style="display:none;" class="vehicle_title_form">{{yr}} {{make}} {{model}}</span> 3264 </a> 3265 </div> 3266 3267 <div style="display: none;" class="incentives-content-template"> 3268 <section style="padding:25px;" class="more-info-section vehicle-incentives"> 3269 <ul> 3270 <li> 3271 {{#_transformed.incentives.length}} 3272 <div class="toggle-list-item toggle-incentives"> 3273 <h3 class="toggle-header">Available Manufacturer Incentives</h3> 3274 <i class="fa fa-chevron-down chev-incentives" aria-hidden="true"></i> 3275 </div> 3276 {{/_transformed.incentives.length}} 3277 3278 {{#_transformed.incentives}} 3279 <ul class="toggle-list-incentives list-style incentive-items"> 3280 <li class="vdp-item incentive-items"> 3281 <div style="line-height: 1.2;"> 3282 <h4 id="{{incentiveID}}">{{programDescription}}</h4> 3283 <p class="incentives-description" style="font-size: 12px; font-weight: 400; color:#a9a9a9;">
3284 Effective Dates: {{effectiveDate}} - {{expiryDate}} 3285 </p> 3286 <p class="incentives-description" style="font-size: 10px; font-weight: 400;">{{disclaimerText}} {{programRuleList.0.description}}</p> 3287 </div> 3288 <div class="cash-incentives" style="color:#5cb85c; font-weight: 600; font-size: 36px;"> 3289 <div class="text-right cash-incentives-value"> 3290 {{programValue}} 3291 </div> 3292 <div class="text-right"> 3293 <a id="incentives_button_" 3294 class="incentives-btn text-center" 3295 name="{{programDescription}}" 3296 data-value="{{programValue}}" 3297 data-form-value="24" 3298 data-vehicle-vin="{{vin}}" 3299 data-vehicle-condition="{{condition}}" 3300 data-vehicle-year="{{yr}}" 3301 data-vehicle-stock-number="{{stockNumber}}" 3302 data-vehicle-make-model="{{make}} {{model}}" 3303 data-vehicle-price="{{finalPrice}}" 3304 data-dealer-name="{{dealer.name}}" 3305 data-vehicle-url="{{vdpUrl}}"> 3306 See if you Qualify </a> 3307 </div> 3308 </div> 3309 </li> 3310 </ul> 3311 {{/_transformed.incentives}} 3312 </li> 3313 <li> 3314 {{#_transformed.otherIncentives.length}} 3315 <div class="toggle-list-item toggle-qualify"> 3316 <h3 class="toggle-header">You May Also Qualify For</h3> 3317 <i class="fa fa-chevron-down chev-qualify" aria-hidden="true"></i> 3318 </div> 3319 {{/_transformed.otherIncentives.length}} 3320 3321 {{#_transformed.otherIncentives}} 3322 <ul class="toggle-list-qualify list-style incentive-items"> 3323 <li class="vdp-item incentive-items"> 3324 <div style="line-height: 1.2;"> 3325 <h4 id="{{incentiveID}}">{{programDescription}}</h4> 3326 <p class="incentives-description" style="font-size: 12px; font-weight: 400; color:#a9a9a9;">
3327 Effective Dates: {{effectiveDate}} - {{expiryDate}} 3328 </p> 3329 <p class="incentives-description" style="font-size: 10px; font-weight: 400;">{{disclaimerText}} {{programRuleList.0.description}}</p> 3330 </div> 3331 <div class="cash-incentives" style="color:#5cb85c; font-weight: 600; font-size: 36px;"> 3332 <div class="text-right cash-incentives-value"> 3333 {{programValue}} 3334 </div> 3335 <div class="text-right"> 3336 <a id="incentives_button_1" 3337 class="incentives-btn text-center" 3338 name="{{programDescription}}" 3339 data-value="{{programValue}}" 3340 data-form-value="24" 3341 data-vehicle-vin="{{vin}}" 3342 data-vehicle-condition="{{condition}}" 3343 data-vehicle-year="{{yr}}" 3344 data-vehicle-stock-number="{{stockNumber}}" 3345 data-vehicle-make-model="{{make}} {{model}}" 3346 data-vehicle-price="{{finalPrice}}" 3347 data-dealer-name="{{dealer.name}}" 3348 data-vehicle-url="{{vdpUrl}}"> 3349 See if you Qualify </a> 3350 </div> 3351 </div> 3352 </li> 3353 </ul> 3354 {{/_transformed.otherIncentives}} 3355 </li> 3356 </ul> 3357 </section> 3358 <div class="srp_incentives_form hidden" id="srp_incentives_form"></div> 3359 </div> 3360 {{/_transformed.remainingIncentivesCount}} 3361 </div> 3362 {{/flags.hasConditionalIncentives}} 3363 <!--END Conditional Incentives SRP card displays --> 3364 3365 3366 </div> 3367 3368 3369 3370 3371 <div class="right-bottom"> 3372 <div class="srp-custom srp-custom-six" style='height:180px'> 3373 <style> 3374 .da-quick-form-button:hover { 3375 background-color: #cc0000 !important; 3376 color: #FFFFFF !important; 3377 } 3378 .da-quick-form-button:hover svg path { 3379 stroke: #FFFFFF; 3380 } 3381 .da-quick-form-button { 3382 text-align: center; 3383 leading-trim: both; 3384 font-size: 12px; 3385 font-weight: 600; 3386 line-height: normal; 3387 font-family: inherit !important; 3388 text-transform: none; 3389 } 3390 .da-quick-form-button[disabled] { 3391 opacity: 0.7; 3392 cursor: not-allowed; 3393 } 3394 @keyframes spin { 3395 from { transform: rotate(0deg); } 3396 to { transform: rotate(360deg); } 3397 } 3398 .animate-spin { 3399 animation: spin 1s linear infinite; 3400 } 3401 .icon-container { 3402 display: inline-flex; 3403 align-items: center; 3404 } 3405 .icon-container > * { 3406 display: none; 3407 } 3408 .icon-container > *.active { 3409 display: inline-flex; 3410 } 3411 .da-quick-form input:user-invalid { 3412 background-color: #ff00001f !important; 3413 } 3414 </style><div class="da-quick-form" data-locked-pricing="false" style="margin-bottom:25px; margin-top:25px;" id="da_quick_form_6ab799c9cc741"><div class="da-quick-form-title-container" style="background-color: #231f20; color: #fff; padding: 15px; text-align:center; border-radius: 5px 5px 0px 0px; font-weight: 600;"><h5 class="gform_title quick_form_title">Quick Contact</h5></div><form method="post" class="gform_form gform_quick_form" data-form-id="41"><input type="hidden" id="da_quick_form_nonce" name="da_quick_form_nonce" value="4ad092445d" /><input type="hidden" name="_wp_http_referer" value="/new-vehicles/" /><input type="hidden" name="da_vehicle_id" class="vehicle-id-field" value="{{vin}}"><input type="hidden" name="da_vin" class="vin-field" value="{{vin}}"><input type="hidden" name="da_stock_number" class="stock-number-field" value="{{stockNumber}}"><input type="hidden" name="da_year" class="year-field" value="{{year}}"><input type="hidden" name="da_make" class="make-field" value="{{make}}"><input type="hidden" name="da_model" class="model-field" value="{{model}}"><input type="hidden" name="da_trim" class="trim-field" value="{{trim}}"><input type="hidden" name="da_msrp" class="msrp-field" value="{{msrp}}">
3414<input type="hidden" name="da_final_price" class="final-price-field" value="{{finalPrice}}"><input type="hidden" name="da_dealer_name" class="dealer-name-field" value="{{dealer.name}}"><input type="hidden" name="da_discount_matrix" class="discount-matrix-field" value="{{discountMatrix}}"><input type="hidden" name="da_discount_matrix_value" class="discount-matrix-value-field" value="{{discountmatrix_value}}"><input type="hidden" name="da_internet_price" class="internet-price-field" value="{{internet_price}}"><input type="hidden" name="da_condition" class="condition-field" value="{{condition}}"><input type="hidden" name="da_vehicle_url" class="vehicle-url-field" value="{{vdpUrl}}"><div class="gform_body"><div class="gform_fields" style="display: flex;"><div class="gfield" style="flex:1;"><input type="text" name="da_quick_form_name" placeholder="Full Name" required class="medium" style="height: 45px; background-color:#F8F8F8; border: none; border-left: 1px solid #E0E0E0;"></div><div class="gfield ginput_container ginput_container_phone" style="flex:1;"><input type="tel" name="da_quick_form_phone" placeholder="Phone" required pattern="\(\d{3}\) \d{3}-\d{4}" title="10-digit phone number. Formatting is applied automatically." class="medium da-quick-form-phone-input" style="height: 45px; background-color:#F8F8F8; border: none; border-left: 1px solid #E0E0E0; border-right: 1px solid #E0E0E0;"></div></div><div class="gform_fields da_quick_form_bottom_row" style="display: flex; align-items: stretch;"><div class="gfield da_quick_form_bottom_row" style="flex: 3;"><input type="email" name="da_quick_form_email" placeholder="Email" required class="medium" style="width: 100%; height: 45px; background-color:#F8F8F8; border:1px solid #E0E0E0; border-radius: 0 0 0 5px !important;"></div><div class="gfield gform_fields" style="flex: 1.5;"><button type="submit" name="da_quick_form_submitted" class="gform_button button da-quick-form-button" style="width: 100%; height: 45px; margin: 0; background-color: #eb0a1e; border: none; color: #FFFFFF; cursor: pointer; border-radius: 0px 0px 5px 0; display: flex; align-items: center; justify-content: center; gap: 4px;"><span class="icon-container"><span class="default-icon active"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none"> 3415 <g clip-path="url(#clip0_4_59)"> 3416 <path d="M2.25 9.75C2.25 9.35218 2.40804 8.97064 2.68934 8.68934C2.97064 8.40804 3.35218 8.25 3.75 8.25H11.25C11.6478 8.25 12.0294 8.40804 12.3107 8.68934C12.592 8.97064 12.75 9.35218 12.75 9.75V14.25C12.75 14.6478 12.592 15.0294 12.3107 15.3107C12.0294 15.592 11.6478 15.75 11.25 15.75H3.75C3.35218 15.75 2.97064 15.592 2.68934 15.3107C2.40804 15.0294 2.25 14.6478 2.25 14.25V9.75Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3417 <path d="M6.75 12C6.75 12.1989 6.82902 12.3897 6.96967 12.5303C7.11032 12.671 7.30109 12.75 7.5 12.75C7.69891 12.75 7.88968 12.671 8.03033 12.5303C8.17098 12.3897 8.25 12.1989 8.25 12C8.25 11.8011 8.17098 11.6103 8.03033 11.4697C7.88968 11.329 7.69891 11.25 7.5 11.25C7.30109 11.25 7.11032 11.329 6.96967 11.4697C6.82902 11.6103 6.75 11.8011 6.75 12Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3418 <path d="M9.75 8.25V5.25C9.75 4.45435 10.0661 3.69129 10.6287 3.12868C11.1913 2.56607 11.9544 2.25 12.75 2.25C13.5456 2.25 14.3087 2.56607 14.8713 3.12868C15.4339 3.69129 15.75 4.45435 15.75 5.25V8.25" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3419 </g> 3420 <defs> 3421 <clipPath id="clip0_4_59"> 3422 <rect width="18" height="18" fill="white"/> 3423 </clipPath> 3424 </defs> 3425 </svg></span><span class="loading-icon"><svg class="animate-spin" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none"> 3426 <path d="M12 4.75V6.25" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3427 <path d="M17.1266 6.87347L16.0659 7.93413" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3428 <path d="M19.25 12H17.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3429 <path d="M17.1266 17.1265L16.0659 16.0659" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3430 <path d="M12 17.75V19.25" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3431 <path d="M7.9342 16.0659L6.87354 17.1265" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3432 <path d="M6.25 12H4.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3433 <path d="M7.9342 7.93413L6.87354 6.87347" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 3434 </svg></span></span><span class="button-text">Submit</span></button></div></div></div></form></div><div class="da-quick-form-unlocked" style="display:none;"></div> </div> 3435 <div class="srp-custom srp-custom-seven" style='height:50px'> 3436 <button class='tp-btn-full-frame dv-tp-cta'><i class="fal fa-cars"></i> Value Your Trade</button> </div> 3437 3438 <div class="srp-cta"> 3439 3440 3441 3442 <a href='{{vdpUrl}}' data-vehicle-vin="{{vin}}" data-vehicle-condition="{{condition}}" data-vehicle-year="{{yr}}" data-vehicle-stock-number="{{stockNumber}}" data-vehicle-make-model="{{make}} {{model}}" data-vehicle-price="{{final_price}}" data-dealer-name="{{dealer.name}}" class="srp-cta-5-btn srp_cta_5 srp_cta">View Details</a> 3443 <div class="srp-extra-div"><p class="trans" style="color:#838383;font-size:.65rem;">VIN: <span class="bold-value-2" style="color:#838383; font-size:.65rem; font-weight: 600;"> {{vin}}</span></p> 3444{{#stockNumber}}<p class="trim" style="color:#838383;font-size:.65rem;">Stock:<span class="bold-value-2" style="color:#838383; font-size:.65rem; font-weight: 600;"> {{stockNumber}}</span></p>{{/stockNumber}}</div> 3445 </div> 3446 <!--End .srp-cta--> 3447 </div> 3448 </div> 3449 3450 </div> 3451 3452 3453 <div class="listing-bottom-row srp-lower-bar"> 3454 <div class="dealer-phone"> 3455 <p style="text-transform: capitalize;"><a data-aga-event="getDirections" href="{{dealer.googleShareUrl}}" target="_blank">{{dealer.name}}</a></p> 3456 <p><a class="dv-lowerbar-used-srp-veh-phone" data-aga-event="clickToCall" data-aga-event-set-prop="clickToCallDepartment|Sales" href="tel:{{dealer.phone}}"><i class="fal fa-phone-alt"></i>{{dealer.phone}}</a></p> 3457</div> </div> 3458 </div> 3459 </div> 3460 </div> 3461 </div> 3462 3463 <div class='dv-offers-bottom-banner-new-srp-wrapper'><div class='dv-offers-bottom-banner-new-srp'><div class='dv-offers-banner-disclaimer'> 3464 <div class='dv-offers-banner-disclaimer-btn' data-disclaimer='See dealer for complete details.' onclick='DVPopUp(this);return false;'>Disclaimer</div> 3465 </div><a data-ag-event='cta_interaction' href='/vehicle-finder-service/' target='_self' title='Can’t Find What You’re Looking For? | Brewer Airport Toyota' class='dv-offers-bottom-banner-new-srp-desktop'><span class='dv-offers-offer-title-hidden'>Can’t Find What You’re Looking For?</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/find-my-car-DT.png?auto=compress%2Cformat&ixlib=php-3.3.1' alt='Can’t Find What You’re Looking For? | Brewer Airport Toyota'/></a><a data-ag-event='cta_interaction' href='/vehicle-finder-service/' target='_self' title='Can’t Find What You’re Looking For? | Brewer Airport Toyota' class='dv-offers-bottom-banner-new-srp-mobile'><span class='dv-offers-offer-title-hidden'>Can’t Find What You’re Looking For?</span><img src='https://bucket.dealeralchemist.com/brewer-airport-toyota/find-my-car-MB.png?auto=compress%2Cformat&ixlib=php-3.3.1' alt='Can’t Find What You’re Looking For? | Brewer Airport Toyota'/></a></div></div>
3465<script> 3466 $(document).ready(function() { 3467 $(".dv-offers-bottom-banner-new-srp-wrapper").slick({ 3468 dots: false, 3469 autoplay: true, 3470 infinite: true, 3471 autoplaySpeed: 4500, 3472 speed: 500, 3473 slidesToShow: 1, 3474 pauseOnHover: true, 3475 pauseOnFocus: true, 3476 pauseOnDotsHover: true, 3477 arrows: true, 3478 dotsClass: "dv-offers-srp-dots", 3479 }) 3480 .on("beforeChange", function(event, slick, currentSlide, nextSlide) { 3481 if (currentSlide !== nextSlide) { 3482 var elements = document.querySelectorAll(".slick-center + .slick-cloned"); 3483 for (var i = 0; i < elements.length; i++) { 3484 setTimeout(function() { 3485 return elements[i].classList.add("slick-current", "slick-center"); 3486 }); 3487 } 3488 } 3489 }); 3490 3491 }); 3492 3493 </script>
3493 3494 <style> 3495 .dv-offers-top-banner-new-srp-wrapper .slick-arrow, .dv-offers-top-banner-used-srp-wrapper .slick-arrow { 3496 background: rgba(0,0,0,0.8); 3497 width: auto; 3498 height: auto 3499 } 3500 .dv-offers-top-banner-new-srp-wrapper .slick-arrow, .dv-offers-top-banner-used-srp-wrapper .slick-arrow:before { 3501 color: #fff; 3502 padding: 5px; 3503 line-height: 100%; 3504 display: block; 3505 width: auto; 3506 height: auto; 3507 } 3508 </style> 3509 3510 <div class="srp-footer"> 3511 <div id="resultsStats-bottom"></div> 3512 <div id="pagination-bottom"></div> 3513 </div> 3514</div> 3515 3516<div id="empty-template" style='display:none;'> 3517 <div class='row srp-no-results'><h3>Don't see the vehicle you are looking for? We will find it for you!</h3></div><div class='srp-noResults-wrapper'> 3518 <div class='gf_browser_chrome gform_wrapper orderparts_wrapper' id='gform_wrapper_7' ><form data-id="7" data-type="consumer_contact" data-department="sales" data-name="Vehicle Finder Service" data-redirected="true" method='post' enctype='multipart/form-data' id='gform_7' class='orderparts' action='/new-vehicles/'> 3519 <div class='gform_body'><ul id='gform_fields_7' class='gform_fields left_label form_sublabel_below description_below'><li id='field_7_6' class='gfield gsection field_sublabel_below field_description_below gfield_visibility_visible' ><h2 class='gsection_title'>Vehicle Info</h2></li><li id='field_7_35' class='gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible' ></ul><ul class="formsection"></li><li id='field_7_49' class='gfield dv-form-textbox dv-form-name gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label gfield_label_before_complex' >Name<span class='gfield_required'>*</span></label><div class='ginput_complex ginput_container no_prefix has_first_name no_middle_name has_last_name no_suffix gf_name_has_2 ginput_container_name' id='input_7_49'> 3520 3521 <span id='input_7_49_3_container' class='name_first' > 3522 <input type='text' name='input_49.3' id='input_7_49_3' value='' aria-label='First name' tabindex='50' aria-required="true" aria-invalid="false" placeholder='First'/> 3523 <label for='input_7_49_3' >First</label> 3524 </span> 3525 3526 <span id='input_7_49_6_container' class='name_last' > 3527 <input type='text' name='input_49.6' id='input_7_49_6' value='' aria-label='Last name' tabindex='52' aria-required="true" aria-invalid="false" placeholder='Last'/> 3528 <label for='input_7_49_6' >Last</label> 3529 </span> 3530 3531 </div></li><li id='field_7_3' class='gfield dv-form-textbox field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_3' >Phone</label><div class='ginput_container ginput_container_phone'><input name='input_3' id='input_7_3' type='text' value='' class='medium' tabindex='54' aria-invalid="false" /></div></li><li id='field_7_4' class='gfield dv-form-textbox gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_4' >Email<span class='gfield_required'>*</span></label><div class='ginput_container ginput_container_email'> 3532 <input name='input_4' id='input_7_4' type='text' value='' class='medium' tabindex='55' aria-required="true" aria-invalid="false"/> 3533 </div></li><li id='field_7_5' class='gfield dv-form-textbox gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' >Contact Preference?<span class='gfield_required'>*</span></label><div class='ginput_container ginput_container_radio'><ul class='gfield_radio' id='input_7_5'><li class='gchoice_7_5_0'><input name='input_5' type='radio' value='Phone' id='choice_7_5_0' tabindex='56' /><label for='choice_7_5_0' id='label_7_5_0'>Phone</label></li><li class='gchoice_7_5_1'><input name='input_5' type='radio' value='Email' id='choice_7_5_1' tabindex='57' /><label for='choice_7_5_1' id='label_7_5_1'>Email</label></li></ul></div></li><li id='field_7_36' class='gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible' ></ul><ul></li><li id='field_7_7' class='gfield gsection field_sublabel_below field_description_below gfield_visibility_visible' ><h2 class='gsection_title'>What Are You Looking For?</h2></li><li id='field_7_37' class='gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible' ></ul><ul class="formsection"></li><li id='field_7_41' class='gfield dv-form-textbox gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' >Type<span class='gfield_required'>*</span></label><div class='ginput_container ginput_container_radio'><ul class='gfield_radio' id='input_7_41'><li class='gchoice_7_41_0'><input name='input_41' type='radio' value='New' id='choice_7_41_0' tabindex='58' /><label for='choice_7_41_0' id='label_7_41_0'>New</label></li><li class='gchoice_7_41_1'><input name='input_41' type='radio' value='Used' id='choice_7_41_1' tabindex='59' /><label for='choice_7_41_1' id='label_7_41_1'>Used</label></li><li class='gchoice_7_41_2'><input name='input_41' type='radio' value='Any' id='choice_7_41_2' tabindex='60' /><label for='choice_7_41_2' id='label_7_41_2'>Any</label></li></ul></div></li><li id='field_7_50' class='gfield dv-form-textbox gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_50' >Year<span class='gfield_required'>*</span></label><div class='ginput_container ginput_container_text'><input name='input_50' id='input_7_50' type='text' value='' class='medium' tabindex='61' placeholder='XXXX' aria-required="true" aria-invalid="false" /></div></li><li id='field_7_44' class='gfield dv-form-textbox gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_44' >Mileage (Max)<span class='gfield_required'>*</span></label><div class='ginput_container ginput_container_select'><select name='input_44' id='input_7_44' class='medium gfield_select' tabindex='62' aria-required="true" aria-invalid="false"><option value='5000' >5000</option><option value='10000' >10000</option><option value='15000' >15000</option><option value='20000' >20000</option><option value='25000' >25000</option><option value='30000' >30000</option><option value='40000' >40000</option><option value='50000' >50000</option><option value='60000' >60000</option><option value='70000' >70000</option><option value='80000' >80000</option><option value='90000' >90000</option><option value='100000' >100000</option><option value='150000' >150000</option><option value='Any' >Any</option></select></div></li><li id='field_7_45' class='gfield dv-form-textbox gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_45' >Price (Max)<span class='gfield_required'>*</span></label><div class='ginput_container ginput_container_select'><select name='input_45' id='input_7_45' class='medium gfield_select' tabindex='63' aria-required="true" aria-invalid="false"><option value='Any' >Any</option><option value='$200000' >$200000</option><option value='$150000' >$150000</option><option value='$120000' >$120000</option><option value='$100000' >$100000</option><option value='$90000' >$90000</option><option value='$80000' >$80000</option><option value='$70000' >$70000</option><option value='$60000' >$60000</option><option value='$50000' >$50000</option><option value='$40000' >$40000</option><option value='$30000' >$30000</option><option value='$25000' >$25000</option><option value='$20000' >$20000</option><option value='$15000' >$15000</option><option value='$10000' >$10000</option><option value='$5000' >$5000</option></select></div></li><li id='field_7_9' class='gfield dv-form-textbox gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_9' >Make<span class='gfield_required'>*</span></label><div class='ginput_container ginput_container_text'><input name='input_9' id='input_7_9' type='text' value='' class='medium' tabindex='64' aria-required="true" aria-invalid="false" /></div></li><li id='field_7_10' class='gfield dv-form-textbox gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_10' >
3533Model<span class='gfield_required'>*</span></label><div class='ginput_container ginput_container_text'><input name='input_10' id='input_7_10' type='text' value='' class='medium' tabindex='65' aria-required="true" aria-invalid="false" /></div></li><li id='field_7_11' class='gfield dv-form-textbox field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_11' >Trim</label><div class='ginput_container ginput_container_text'><input name='input_11' id='input_7_11' type='text' value='' class='medium' tabindex='66' aria-invalid="false" /></div></li><li id='field_7_46' class='gfield dv-form-textbox field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_46' >Color</label><div class='ginput_container ginput_container_text'><input name='input_46' id='input_7_46' type='text' value='' class='medium' tabindex='67' aria-invalid="false" /></div></li><li id='field_7_12' class='gfield dv-form-textbox gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' >Transmission<span class='gfield_required'>*</span></label><div class='ginput_container ginput_container_radio'><ul class='gfield_radio' id='input_7_12'><li class='gchoice_7_12_0'><input name='input_12' type='radio' value='Automatic' id='choice_7_12_0' tabindex='68' /><label for='choice_7_12_0' id='label_7_12_0'>Automatic</label></li><li class='gchoice_7_12_1'><input name='input_12' type='radio' value='Manual' id='choice_7_12_1' tabindex='69' /><label for='choice_7_12_1' id='label_7_12_1'>Manual</label></li></ul></div></li><li id='field_7_47' class='gfield dv-form-textbox field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_47' >Message</label><div class='ginput_container ginput_container_textarea'><textarea name='input_47' id='input_7_47' class='textarea small' tabindex='70' aria-invalid="false" rows='10' cols='50'></textarea></div></li><li id='field_7_38' class='gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible' ></ul><ul></li><li id='field_7_39' class='gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible' ><div class="bottomsection">By submitting this form, you agree to be contacted with information regarding the vehicle you are searching for.</div></ul></li><li id='field_7_40' class='gfield hidden field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_40' >Referral ID</label></li><li id='field_7_51' class='gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_7_51' >Name</label><div class='ginput_container'><input name='input_51' id='input_7_51' type='text' value='' /></div><div class='gfield_description' id='gfield_description__51'>This field is for validation purposes and should be left unchanged.</div></li> 3534 </ul></div> 3535 <div class='gform_footer left_label'> <input type='submit' id='gform_submit_button_7' class='gform_button button' value='Let us find it!' tabindex='71' onclick='if(window["gf_submitting_7"]){return false;} window["gf_submitting_7"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_7"]){return false;} window["gf_submitting_7"]=true; jQuery("#gform_7").trigger("submit",[true]); }' /> 3536 <input type='hidden' class='gform_hidden' name='is_submit_7' value='1' /> 3537 <input type='hidden' class='gform_hidden' name='gform_submit' value='7' /> 3538 3539 <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> 3540 <input type='hidden' class='gform_hidden' name='state_7' value='WyJbXSIsIjExNzhmZjIwMGMwYzVkM2UzYjE0NGUyMzc1MWQyNTczIl0=' /> 3541 <input type='hidden' class='gform_hidden' name='gform_target_page_number_7' id='gform_target_page_number_7' value='0' /> 3542 <input type='hidden' class='gform_hidden' name='gform_source_page_number_7' id='gform_source_page_number_7' value='1' /> 3543 <input type='hidden' name='gform_field_values' value='' /> 3544 3545 </div> 3546 <p class="gf-consent-text" style="margin-top: 12px; font-size:11px; color:#999B9F; line-height:1.1rem;">By submitting your information, you consent to receive communications from Brewer Airport Toyota, including SMS, voice calls, and/or emails, regarding our products, services, and promotional offers. These communications may be sent using automated technology. Consent is not a condition of purchase. Standard messaging and data rates may apply.</p><div class="dealer-disclaimer-container-class"></div><p style="display: none !important;"><label>Δ<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="92"/>
3546<script>document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() );</script>
3546</p></form> 3547 </div></div></div> 3548 3549 3550 <style> 3551 .listing .vehicle-views .srp-views { 3552 top: 10px; 3553 right: 10px; 3554 } 3555 </style>
3555<script> 3556 function toggleMobileButton() { 3557 3558 var isMobile = window.innerWidth <= 768; 3559 var button = document.querySelector('.srp-cta-6-btn'); 3560 3561 if (!isMobile && button) { 3562 button.parentNode.removeChild(button); 3563 } 3564} 3565toggleMobileButton(); 3566window.onload = toggleMobileButton; 3567window.onresize = toggleMobileButton; 3568</script>
3568 3569 3570
3571<script> 3572 /** 3573 * The loading overlay needs a deadline as well as a success condition. 3574 * 3575 * This poll had no upper bound: if results never arrived - slow connection, 3576 * Algolia error, an exception thrown earlier on the page - it retried every 3577 * 100ms indefinitely and the overlay stayed up forever. Measured on prod 3578 * throttled to Slow 3G, results had still not rendered 90 seconds in and this 3579 * was still looping. 3580 * 3581 * It went unnoticed for so long only because .srpLoading was silently unstyled: 3582 * a Stylus indentation bug folded its declarations into a selector list, so 3583 * browsers dropped the entire rule and the overlay covered nothing. See the 3584 * note in media/css/srpCSS/algolia.styl. Now that the rule compiles, this is a 3585 * genuinely opaque full-viewport layer at z-index 999, and an unbounded wait 3586 * means a shopper stuck on a grey screen with no way past it. 3587 * 3588 * Revealing a half-built page is the better failure. The above-the-fold 3589 * controls are styled from algolia.css at first paint, so what shows through is 3590 * presentable even mid-load. 3591 * 3592 * Measured from performance.now() - milliseconds since navigation start - and 3593 * NOT from a Date.now() captured when this script runs. This block sits around 3594 * line 3,260 of an 8,800-line document, so on a slow connection it executes 3595 * many seconds after the overlay first paints; anchoring the deadline to script 3596 * execution would silently stretch it by however long the HTML took to get 3597 * here. The budget is a fixed span of page life, not that span measured from 3598 * whenever-this-parsed. 3599 * 3600 * Configurable at Theme Options -> Performance -> "Maximum time to show the 3601 * loading overlay". There is deliberately no switch to turn the deadline off: 3602 * unbounded is the bug it replaced. 3603 */ 3604 var SRP_LOADING_MAX_MS = 12000; 3605 3606 function checkForResults() { 3607 if ($("#srp-results .ais-Hits-item")[0] || $("#srp-results .srp-no-results").is(":visible")) { 3608 $(".srpLoading").remove(); 3609 } else if (performance.now() > SRP_LOADING_MAX_MS) { 3610 $(".srpLoading").remove(); 3611 } else { 3612 setTimeout(checkForResults, 100); 3613 } 3614 } 3615 3616 3617 checkForResults(); 3618 //Moroney Label Click Event - SRP 3619 function callWindowSticker(vin,year,make,model,condition) { 3620 if (String(make).toLowerCase() === 'kia' && String(condition).toLowerCase() === 'new') { 3621 if (window.AutoGoKiaWindowSticker) { 3622 window.AutoGoKiaWindowSticker.open(`/wp-json/dealer/v1/kia-window-sticker/${encodeURIComponent(vin)}`); 3623 } 3624 return false; 3625 } 3626 3627 let windowSticker = `https://api.toyotainventory.com/vehicles/${vin}/monroney`; 3628 3629 //SDIS Auth Token for Window Stickers 3630 $.ajax({ 3631 url: windowSticker, 3632 type: 'GET', 3633 beforeSend: function (xhr) { 3634 xhr.setRequestHeader('Authorization', 'Bearer RABWAGUAbgBvAG0AVABvAHkAbwB0AGEAMgAwADIAMgA='); 3635 }, 3636 }); 3637 3638 sd('dataLayer', { 3639 linkType: 'Monroney Label', 3640 vehicleDetails: { 3641 status: 'new', 3642 year: year, 3643 make: make, 3644 model: model, 3645 vin: vin, 3646 }, 3647 events: 'linkClick' 3648 }); 3649 sd('send'); 3650 } 3651</script>
3651 3652 3653
3654<script> 3655 /** 3656 * Begin Quick Form Event Listener Logic 3657 */ 3658 var $isVDP = jQuery("#fixed-info-container"); 3659 3660 function populateHiddenFields(formInstance) { 3661 if (typeof DVHydrate !== 'undefined') { 3662 DVHydrate.populateFormFields("#" + formInstance); 3663 } 3664 } 3665 3666 function getQuickFormCookies() { 3667 var cookies = {}; 3668 document.cookie.split(";").forEach(cookie => { 3669 var parts = cookie.trim().split("="); 3670 var name = parts[0]; 3671 var value = parts[1]; 3672 if (name.startsWith("quickFormUnlocked_")) { 3673 cookies[name] = value; 3674 } 3675 }); 3676 return cookies; 3677 } 3678 3679 function checkAndHideForms() { 3680 var cookies = getQuickFormCookies(); 3681 3682 if (Object.keys(cookies).length === 0) return; 3683 3684 3685 var $vdpContainer = jQuery("#fixed-info-container"); 3686 var isVDP = $vdpContainer.length > 0; 3687 3688 // Get the condition from the container 3689 var condition = isVDP ? 3690 $vdpContainer.data("vehicle-condition").toLowerCase() : 3691 jQuery(".listing").first().data("vehicle-condition").toLowerCase(); 3692
3693 // Check for condition-specific "all" cookie 3694 if (`quickFormUnlocked_all_${condition}` in cookies) { 3695 jQuery(".da-quick-form").remove(); 3696 jQuery(".da-quick-form-unlocked").show(); 3697 jQuery("#da-quick-form-unlocked").show(); 3698 jQuery("#vdp-pricingheader-container").remove(); 3699 return; 3700 } 3701 3702 if ($vdpContainer.length > 0) { 3703 // VDP logic 3704 var vin = $vdpContainer.data("vehicle-vin"); 3705 if (vin && "quickFormUnlocked_" + vin in cookies) { 3706 jQuery(".da-quick-form").remove(); 3707 } 3708 } else { 3709 // SRP logic 3710 jQuery(".da-quick-form").each(function() { 3711 var $form = jQuery(this); 3712 var $parentCard = $form.closest(".listing"); 3713 var vin = $parentCard.data("vehicleVin"); 3714 3715 if (vin && "quickFormUnlocked_" + vin in cookies) { 3716 $form.remove(); 3717 } 3718 }); 3719 } 3720 } 3721 3722 if($isVDP.length > 0) { 3723 checkAndHideForms(); 3724 } 3725 3726 const handleInventoryLoad = (event) => { 3727 jQuery(".da-quick-form").each(function() { 3728 var formId = jQuery(this).attr("id"); 3729 populateHiddenFields(formId); 3730 }); 3731 }; 3732 3733 window.addEventListener("Inventory:loaded_srp", () => { 3734 handleInventoryLoad(); 3735 checkAndHideForms(); 3736 3737 jQuery("#srp-filters, #pagination-top, #pagination-bottom, #filterTags, #srp-filters-reset-btn, #dv-srp-clear-filters, #clearSearchResults, #showFiltersNonLegacy, .ais-Pagination-link, .ais-Pagination").click(function(){ 3738 checkAndHideForms(); 3739 }); 3740 }); 3741 3742 window.addEventListener("Inventory:loaded_vdp", handleInventoryLoad); 3743 3744 /** 3745 * e/o: Begin Quick Form Event Listener Logic 3746 */ 3747</script>
3747 3748 3749<!-- Pinned to the exact version @2 resolves to today. The stale-search 3750 canceller below assumes this version's axios/XHR transport; a CDN-resolved 3751 minor that swapped in the fetch adapter would silently disable it. The 3752 pin is also what makes integrity possible - a floating @2 changes bytes 3753 by design, so it could never carry one. Hash is sha384 of the 145,726-byte 3754 2.9.0 dist, same treatment as the instantsearch tag below. -->
3755<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/typesense-instantsearch-adapter.min.js" integrity="sha384-B47IWeyyh8xnZkeL6rPg51tYX2fWwgI6CbkJN8BYp3VKHngE3hM/2Bqn8JTE8c92" crossorigin="anonymous"></script>
vendor: 1 bytes, line 3755
3755
3756<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/instantsearch.production.min.js" integrity="sha256-r9HX5YzBrppuVpgfMA3USvgS2jEdIBPJ3ntsidyTNl8=" crossorigin="anonymous"></script>
vendor: 1 bytes, line 3756
3756
3757<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/jquery.formatCurrency-1.4.0.min.js?v=1.598.636"></script>
vendor: 1 bytes, line 3757
3757
3758<script defer src="https://www.youtube.com/iframe_api"></script>
vendor: 1 bytes, line 3758
3758
3759<script> 3760 var srpCondition = "New"; 3761 var indexName = "vehicles-TOY37194"; 3762 var cityState = "Moon Township, PA"; 3763 var isNexusToyota = "1"; 3764 var isNexusHonda = ""; 3765 var isNexusAcura = ""; 3766 var isNexusEnabled = "1"; 3767 var dealerRegion = "CAT10"; 3768 var distanceUnit = "Mile"; 3769 var haveSdAnalytics = false; 3770 haveSdAnalytics = true; var searchChangedTimer = null; 3771 var lastSdSearchStateSignature = null; 3772 var lastSdFacetStateSignature = null; 3773 var sdInitialFilterSearchSent = false; 3774 var sdFormShownPending = false; 3775 3776 /** 3777 * "formInitiation already sent for the currently shown form". 3778 * 3779 * Module scope on purpose. This was a `var formInitHandled = false` declared 3780 * inside the no-results branch, immediately before binding the click handler - 3781 * so every run of that branch bound another handler, and each one closed over 3782 * its own copy of the flag. After N no-result renders a single click ran N 3783 * handlers, every one of them believing it was the first, and sent N 3784 * formInitiation events. That was duplicated analytics, not just wasted work. 3785 * 3786 * Still reset where the original was, so the semantics are unchanged: one 3787 * initiation per form shown. 3788 */ 3789 var sdFormInitHandled = false; 3790 3791 /** 3792 * A query-only search owes Shift Digital a pageview and filterSearch on top 3793 * of typedSearch, and typedSearch has to land first. 3794 * 3795 * The render for a keystroke arrives long before the 800ms typedSearch 3796 * debounce, so the render only marks the send as pending and the debounce 3797 * flushes it. The timer is the fallback for query changes with no typing 3798 * behind them - the clear-search and reset buttons call setQuery('') - which 3799 * would otherwise leave the flag pending forever. 3800 */ 3801 var lastSdQuery = null; 3802 var sdQueryAnalyticsPending = false; 3803 var sdQueryAnalyticsTimer = null; 3804 var currentRefinements = {}; 3805 var vehiclesList = []; 3806 let userInteractedWithFacets = false; 3807 var srpDealerId = "TOY37194"; 3808 var dealerGroupSite = "GRP"; 3809 3810 const showConditionalIncentives = "1"; 3811 3812 //Homepage/Menu Link Model Map for correct facetting 3813 const modelFormatMap = { 3814 'bz4x': 'bZ4X', 3815 'rav4': 'RAV4', 3816 '4runner': '4Runner', 3817 'i-force': 'Tundra i-FORCE MAX', 3818 'tundra i-force max': 'Tundra i-FORCE MAX', 3819 'hr-v': 'HR-V', 3820 'cr-v': 'CR-V', 3821 'hr-v hybrid': 'HR-V Hybrid', 3822 'cr-v hybrid': 'CR-V Hybrid', 3823 'gr86': 'GR86', 3824 'rav4 prime': 'RAV4 Prime', 3825 'rav4 hybrid': 'RAV4 Hybrid', 3826 'titan xd': 'Titan XD', 3827 'gt-r': 'GT-R', 3828 'leaf': 'LEAF', 3829 'es': 'ES', 3830 'is': 'IS', 3831 'is 500': 'IS 500', 3832 'ls': 'LS', 3833 'es hybrid': 'ES Hybrid', 3834 'lc hybrid': 'LC Hybrid', 3835 'ls hybrid': 'LS Hybrid', 3836 'nx hybrid': 'NX Hybrid', 3837 'nx phev': 'NX PHEV', 3838 'rx phev': 'RX PHEV', 3839 'rx hybrid': 'RX Hybrid', 3840 'ux hybrid': 'UX Hybrid', 3841 'gx': 'GX', 3842 'lx': 'LX', 3843 'nx': 'NX', 3844 'rx': 'RX', 3845 'ux': 'UX', 3846 'lc convertible': 'LC Convertible', 3847 'rc': 'RC', 3848 'rc f': 'RC F', 3849 'lc': 'LC', 3850 'rz': 'RZ', 3851 'tx': 'TX', 3852 'tx phev': 'TX PHEV', 3853 'tx 500h': 'TX 500h', 3854 'ux phev': 'UX PHEV', 3855 'i4': 'i4', 3856 'i5': 'i5', 3857 'i7': 'i7', 3858 'ix': 'iX', 3859 'adx': 'ADX', 3860 'mdx': 'MDX', 3861 'rdx': 'RDX', 3862 'tlx': 'TLX', 3863 'zdx': 'ZDX', 3864 'sierra ev': 'Sierra EV', 3865 'sierra hd': 'Sierra HD', 3866 'hummer ev pickup': 'Hummer EV Pickup', 3867 'hummer ev suv': 'Hummer EV SUV', 3868 'yukon xl': 'Yukon XL', 3869 'outlander phev': 'Outlander PHEV', 3870 'gla': 'GLA', 3871 'glb': 'GLB', 3872 'glc': 'GLC', 3873 'gle': 'GLE', 3874 'gls': 'GLS', 3875 'glc coupe': 'GLC Coupe', 3876 'gle coupe': 'GLE Coupe', 3877 'gls coupe': 'GLS Coupe', 3878 'g-class': 'G-Class', 3879 'c-class': 'C-Class', 3880 'c-class sedan': 'C-Class Sedan', 3881 'e-class': 'E-Class', 3882 'e-class sedan': 'E-Class Sedan', 3883 's-class': 'S-Class', 3884 's-class sedan': 'S-Class Sedan', 3885 'eqb': 'EQB', 3886 'eqc': 'EQC', 3887 'eqe': 'EQE', 3888 'eqs': 'EQS', 3889 'eqs suv': 'EQS SUV', 3890 'cla': 'CLA', 3891 'c-class cabriolet': 'C-Class Cabriolet', 3892 'amg®': 'AMG®', 3893 'amg® gt': 'AMG® GT', 3894 }; 3895 3896 function formatModelName(model) { 3897 const lowerCaseModel = model.toLowerCase(); 3898 if (modelFormatMap[lowerCaseModel]) { 3899 return modelFormatMap[lowerCaseModel]; 3900 } else { 3901 const words = model.split(' '); 3902 return words.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(' '); 3903 } 3904 } 3905
3906 /** 3907 * Build the page title from the current selected refinements 3908 */ 3909 function buildTitle(refinementList) 3910 { 3911 let titleString = ""; 3912 let modelString = ""; 3913 let bodyString = ""; 3914 let condition = srpCondition; 3915 let vehicleHistoryString = ""; 3916 3917 currentRefinements = refinementList; 3918 3919 if(refinementList.body && condition == 'New'){ 3920 if(refinementList.body.length == 1){ 3921 titleString = "Toyota" + " " + refinementList.body[0] + " Models"; 3922 } else{ 3923 for( var bod in refinementList.body) 3924 { 3925 bodyString += " " + refinementList.body[bod] + ","; 3926 titleString = "Toyota" + " " + bodyString + " Models"; 3927 } 3928 } 3929 return titleString; 3930 } 3931 3932 if(refinementList.body && condition == 'Used'){ 3933 if(refinementList.body.length == 1){ 3934 titleString = refinementList.body[0] + " Models"; 3935 } else{ 3936 for( var bod in refinementList.body) 3937 { 3938 bodyString += " " + refinementList.body[bod] + ","; 3939 titleString = bodyString + " Models"; 3940 } 3941 } 3942 return titleString; 3943 } 3944 3945 if (refinementList.make && refinementList.make.length == 1) 3946 { 3947 3948 if(refinementList.body && condition == 'Used'){ 3949 if(refinementList.body.length == 1){ 3950 titleString = refinementList.make + " " + refinementList.body[0] + " Models"; 3951 } else{ 3952 for( var bod in refinementList.body) 3953 { 3954 bodyString += " " + refinementList.body[bod] + ","; 3955 } 3956 for( var make in refinementList.make) 3957 { 3958 makeString += " " + refinementList.make[make] + ","; 3959 3960 } 3961 titleString = makeString + " " + bodyString + " Models"; 3962 3963 } 3964 return titleString; 3965 } 3966 3967 if (refinementList.model && refinementList.model.length == 1) 3968 { 3969 titleString = refinementList.make[0] + " " + refinementList.model[0] + " Vehicles"; 3970 3971 return titleString; 3972 } 3973 else if (refinementList.model) 3974 { 3975 for (var model in refinementList.model) 3976 { 3977 titleString += " " + refinementList.model[model] + ","; 3978 } 3979 3980 return titleString; 3981 } 3982 else 3983 { 3984 titleString = refinementList.make[0] + " Models"; 3985 return titleString; 3986 } 3987 } 3988 else if (refinementList.make) 3989 { 3990 if (refinementList.model) 3991 { 3992 if (refinementList.model.length == 1) 3993 { 3994 titleString += " " + refinementList.model[0]; 3995 } 3996 else 3997 { 3998 for (var model in refinementList.model) 3999 { 4000 titleString += " " + refinementList.model[model] + ","; 4001 } 4002 } 4003 4004 titleString += " Models"; 4005 4006 return titleString; 4007 } 4008 for (var make in refinementList.make) 4009 { 4010 titleString += " " + refinementList.make[make] + ","; 4011 } 4012 4013 titleString += " Models"; 4014 4015 return titleString; 4016 } 4017 else{ 4018 if(refinementList.model){ 4019 4020 if (refinementList.model.length == 1) 4021 { 4022 modelString += " " + refinementList.model[0]; 4023 } 4024 else 4025 { 4026 for (var model in refinementList.model) 4027 { 4028 modelString += " " + refinementList.model[model] + ","; 4029 } 4030 } 4031 if(condition == 'Used'){ 4032 titleString += " " + modelString + " Models"; 4033 } else{ 4034 titleString += "Toyota" + " " + modelString + " Models"; 4035 } 4036 return titleString; 4037 } 4038 } 4039 4040 //Build Title for Vehicle History 4041 if(refinementList.vehicleHistory && condition == "Used") 4042 { 4043 if(refinementList.vehicleHistory.length == 1) 4044 { 4045 titleString = refinementList.vehicleHistory[0] + " Models"; 4046 } 4047 else 4048 { 4049 for (var bod in refinementList.vehicleHistory) 4050 { 4051 vehicleHistoryString += " " + refinementList.vehicleHistory[bod] + ","; 4052 } 4053 titleString = vehicleHistoryString + " Models"; 4054 } 4055 return titleString; 4056 } 4057 4058 //Build title for flags.type 4059 if (refinementList["flags.type"] && refinementList["flags.type"].length > 0) { 4060 let flagsTypeString = ""; 4061 4062 if (refinementList["flags.type"].length === 1) { 4063 titleString = refinementList["flags.type"][0] + " Models"; 4064 } else { 4065 for (let i = 0; i < refinementList["flags.type"].length; i++) { 4066 flagsTypeString += refinementList["flags.type"][i] + ", "; 4067 } 4068 flagsTypeString = flagsTypeString.slice(0, -2); 4069 titleString = flagsTypeString + " Models"; 4070 } 4071 4072 return titleString; 4073 } 4074 4075 4076 return "Toyota Vehicles"; 4077 } 4078
4079 //Build meta description for SRP filters 4080 function buildDescription(refinementList){ 4081 4082 modelString = ""; 4083 makeString = ""; 4084 featureString = ""; 4085 fuelString = ""; 4086 colorString = ""; 4087 bodyString = ""; 4088 trimString = ""; 4089 4090 currentRefinements = refinementList 4091 4092 if(refinementList.body && refinementList.features){ 4093 if(refinementList.body.length == 1 && refinementList.features.length == 1){ 4094 bodyString += "" + refinementList.body[0] + "s"; 4095 featureString +="" + refinementList.features[0] + " "; 4096 } else{ 4097 for( var bod in refinementList.body) 4098 { 4099 bodyString += " " + refinementList.body[bod] + "s,"; 4100 } 4101 4102 for( var feat in refinementList.features) 4103 { 4104 featureString += " " + refinementList.features[feat] + ", "; 4105 } 4106 } 4107 4108 let newDesc = `Shop ${srpCondition} ${bodyString} with ${featureString}in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4109 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4110 4111 } 4112 4113 if(refinementList.model){ 4114 4115 if(srpCondition == "New"){ 4116 4117 if( refinementList.model.length >= 1 ){ 4118 4119 if (refinementList.model.length == 1) 4120 { 4121 modelString += " " + refinementList.model[0]; 4122 } 4123 else 4124 { 4125 for (var model in refinementList.model) 4126 { 4127 modelString += " " + refinementList.model[model] + ","; 4128 } 4129 4130 } 4131 4132 if(refinementList.features){ 4133 if(refinementList.features.length == 1){ 4134 featureString += "" + refinementList.features[0]; 4135 } else{ 4136 for( var feat in refinementList.features) 4137 { 4138 featureString += " " + refinementList.features[feat] + ","; 4139 } 4140 } 4141 4142 let newDesc = `Shop ${srpCondition} Toyota ${modelString} vehicles with ${featureString} in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4143 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4144 } 4145 4146 if(refinementList.fuel){ 4147 fuelString += " " + refinementList.fuel[0]; 4148 let newDesc = `Shop ${srpCondition} Toyota ${modelString} ${fuelString} vehicles in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4149 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4150 } 4151 4152 if(refinementList.generic_color){ 4153 if(refinementList.generic_color.length == 1){ 4154 colorString += " " + refinementList.generic_color[0] + " "; 4155 }else{ 4156 for( var color in refinementList.generic_color) 4157 { 4158 colorString += " " + refinementList.generic_color[color] + ","; 4159 } 4160 } 4161 4162 let newDesc = `Shop ${srpCondition} ${colorString} Toyota ${modelString} vehicles in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4163 4164 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc) 4165 } 4166 4167 if(refinementList.trim){ 4168 if(refinementList.trim.length == 1){ 4169 trimString += "" + refinementList.trim[0]; 4170 } else{ 4171 for( var feat in refinementList.trim) 4172 { 4173 trimString += " " + refinementList.trim[feat] + ","; 4174 } 4175 } 4176 4177 let newDesc = `Shop ${srpCondition}
4177 ${modelString} in ${trimString} trim levels in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4178 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4179 } 4180 4181 let newDesc = `Shop ${srpCondition} Toyota ${modelString} vehicles in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}`; 4182 4183 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc) 4184 4185 } 4186 } 4187 } 4188 if (refinementList.make){ 4189 4190 4191 if(refinementList.make.length == 1){ 4192 makeString += " " + refinementList.make[0]; 4193 4194 } 4195 else 4196 { 4197 4198 for (var make in refinementList.make) 4199 { 4200 makeString += " " + refinementList.make[make] + ","; 4201 } 4202 } 4203 4204 if(refinementList.features){ 4205 if(refinementList.features.length == 1){ 4206 featureString += " " + refinementList.features[0]; 4207 } else{ 4208 for( var feat in refinementList.features) 4209 { 4210 featureString += " " + refinementList.features[feat] + ","; 4211 } 4212 } 4213 4214 let newDesc = `Shop ${srpCondition} ${makeString} vehicles with${featureString} in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4215 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4216 } 4217 4218 if(refinementList.fuel){ 4219 fuelString += " " + refinementList.fuel[0]; 4220 let newDesc = `Shop ${srpCondition} ${makeString} ${fuelString} vehicles in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4221 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4222 } 4223 4224 if(refinementList.generic_color){ 4225 if(refinementList.generic_color.length == 1){ 4226 colorString += " " + refinementList.generic_color[0] + " "; 4227 }else{ 4228 for( var color in refinementList.generic_color) 4229 { 4230 colorString += " " + refinementList.generic_color[color] + ","; 4231 } 4232 } 4233 4234 let newDesc = `Shop ${srpCondition} ${colorString} ${makeString} vehicles in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4235 4236 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc) 4237 } 4238 4239 4240 if(refinementList.body){ 4241 if(refinementList.body.length == 1){ 4242 bodyString += "" + refinementList.body[0] + "s"; 4243 } else{ 4244 for( var feat in refinementList.body) 4245 { 4246 bodyString += " " + refinementList.body[feat] + "s,"; 4247 } 4248 } 4249 4250 let newDesc = `Shop ${srpCondition} ${makeString} ${bodyString} in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4251 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4252 } 4253 4254 4255 let newDesc = `Shop ${srpCondition} ${makeString} vehicles in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4256 4257 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc) 4258 4259 4260 } 4261 4262 if(refinementList.genericColor){ 4263 if(refinementList.genericColor.length == 1){ 4264 colorString += " " + refinementList.genericColor[0] + " "; 4265 }else{ 4266 for( var color in refinementList.genericColor) 4267 { 4268 colorString += " " + refinementList.genericColor[color] + ","; 4269 } 4270 } 4271 4272 let newDesc = `Shop ${srpCondition} ${colorString} Toyota vehicles in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}`; 4273 4274 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc) 4275 } 4276 4277 if(refinementList.fuel){ 4278 fuelString += " " + refinementList.fuel[0]; 4279 let newDesc = `Shop ${srpCondition} Toyota ${fuelString} vehicles in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4280 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4281 } 4282 4283 if(refinementList.features){ 4284 if(refinementList.features.length == 1){ 4285 featureString += "" + refinementList.features[0]; 4286 } else{ 4287 for( var feat in refinementList.features) 4288 { 4289 featureString += " " + refinementList.features[feat] + ","; 4290 } 4291 } 4292 4293 let newDesc = `Shop ${srpCondition}
4293 Toyota ${modelString} vehicles with ${featureString} in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4294 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4295 } 4296 4297 if(refinementList.body){ 4298 if(refinementList.body.length == 1){ 4299 bodyString += "" + refinementList.body[0] + "s"; 4300 } else{ 4301 for( var feat in refinementList.body) 4302 { 4303 bodyString += " " + refinementList.body[feat] + "s,"; 4304 } 4305 } 4306 4307 let newDesc = `Shop ${srpCondition} ${bodyString} in Stock and Online today at Brewer Airport Toyota, ${srpCondition} Toyota dealership in ${cityState}` 4308 return document.querySelector('meta[name="description"]').setAttribute("content", newDesc); 4309 } 4310 4311 return 4312 4313 } 4314 4315 /** 4316 * Trigger Inventory Loaded Event 4317 */ 4318 function _triggerInventoryLoaded() { 4319 const event = new Event('Inventory:loaded_srp'); 4320 window.dispatchEvent(event); 4321 } 4322 4323 /** 4324 * Search for Smart Path Disclaimer Function 4325 * @author layth abdelqader 4326 * @param {string} text - text to filter by 4327 * @param {string} cname - class name of element 4328 */ 4329 function SmartPathDisclaimer(text, cname) { 4330 // set up replacement fn 4331 var doReplacement = function(interval) { 4332 // clear interval 4333 clearInterval(interval); 4334 // lets start the loop and find all classnames/text that match 4335 const container = [...document.querySelectorAll(cname)]; 4336 for (let i = 0; i < container.length; i++) { 4337 var classListing = [...container[i].classList]; 4338 if (container[i].textContent.includes(text) && container[i].textContent.includes("transit")) 4339 { 4340 if(!container[i].textContent.includes(text + ':')){ 4341 container[i].innerHTML = container[i].innerHTML.replace(text, "<strong>
4341" + text + ':' + "</strong>"); 4342 } 4343 } else if (container[i].textContent.includes(text) && container[i].textContent.includes("build phase")) { 4344 if(!container[i].textContent.includes(text + ':')){ 4345 container[i].innerHTML = container[i].innerHTML.replace(text, "<strong>" + text + ':' + "</strong>"); 4346 } 4347 } else if (container[i].textContent.includes(text)) { 4348 container[i].innerHTML = container[i].innerHTML.replace(text, "<strong>" + text + "</strong>"); 4349 } else { 4350 container[i].classList.remove( 4351 "dv-sp-disclaimer-strong" 4352 ); 4353 } 4354 } 4355 }; 4356 // set up interval and wait for dgdatahub to load 4357 var interval = setInterval(function () { 4358 if (window.DGDataHub != undefined) { 4359 if (typeof window.DGDataHub.getWarningState !== "undefined" && window.DGDataHub.getWarningState().dgLoaded) { 4360 doReplacement(interval) 4361 } 4362 } 4363 }, 200); 4364 } 4365 4366 /** 4367 * Search highlighting is computed, transferred and parsed, then thrown away. 4368 * 4369 * The adapter defaults highlight_full_fields to the whole query_by list, so 4370 * every response carries per-hit highlight blocks for all sixteen fields. 4371 * Nothing reads them: no template in this file touches _highlightResult, 4372 * and never has. Both highlight knobs are set to "none" below: the adapter 4373 * injects highlight_full_fields on its own, which of the two wins is 4374 * decided server-side, and naming both removes the doubt for free. 4375 * 4376 * Sized honestly before assuming it mattered: on the live i95 collection 4377 * the highlight blocks are about 1% of a 428KB keystroke response, because 4378 * the weight is the documents themselves - imageUrls is 48% of a 25KB hit 4379 * and conditionalIncentives another 32%, and both are genuinely rendered, 4380 * so neither can be excluded. This trim is kept because it is free and 4381 * strictly correct - the server skips work nobody consumes - not because 4382 * it moves the needle. Anyone tempted to chase response size further: 4383 * measure the per-field split first, and note that the transfer was never 4384 * what blocked the main thread - the re-render is. 4385 * 4386 * Gated on Theme Options -> Performance -> "Skip unused search highlighting" 4387 * because a dealer's custom runtime JS (srp-js-function-render-runtime) 4388 * could in principle read _highlightResult even though the theme does not. 4389 * ?da-search-payload=full restores the old payload for one request, which 4390 * is the way to test that theory on a live dealer before flipping the switch. 4391 */ 4392 var daTrimSearchPayload = true && new URLSearchParams(window.location.search).get('da-search-payload') !== 'full'; 4393 4394 /** 4395 * Cancel a search the moment a newer one supersedes it. 4396 * 4397 * Michael's idea, confirmed by measurement on Slow 4G: typing "tundra" at 4398 * a normal cadence put EIGHT multi_search requests in flight at once. The 4399 * first two responses ate the whole link (444KB), "tun" through "tundra" 4400 * all hit the client's 5s timeout, were retried, and timed out again - so 4401 * the page settled with the box saying "tundra" and the results showing 4402 * "tu". On a slow connection the stale downloads do not just waste 4403 * transfer, they starve the one query the user actually wants and leave 4404 * wrong results on screen. 4405 * 4406 * The adapter's client sends via axios/XHR, which complicates the obvious 4407 * fix: a bare xhr.abort() fires the error path, axios rejects, and 4408 * typesense-js treats that as a node failure and RETRIES - recreating the 4409 * storm this exists to prevent. So a superseded request is silenced 4410 * before it is aborted: every handler axios attached is stripped, then 4411 * the native abort runs. Axios never learns; its promise simply never 4412 * settles; the retry logic never fires. InstantSearch orders responses by 4413 * query id, so the never-answered request was never going to render 4414 * anyway. 4415 * 4416 * Fast connections are unaffected in practice: responses return in 4417 * ~250ms and are done before the next keystroke, so there is rarely 4418 * anything in flight to cancel. 4419 */ 4420 var daCancelStaleSearch = true && new URLSearchParams(window.location.search).get('da-cancel-stale-search') !== 'off'; 4421 4422 /** 4423 * Arm content-visibility on the result cards (rule in algolia.css, gated 4424 * on this class so the flag lives here with the other Performance flags). 4425 * Off-screen cards then skip style recalculation and layout entirely on 4426 * each render - the two largest named costs in the keystroke trace after 4427 * the render itself. See the comment block in algolia.styl for numbers. 4428 */ 4429 if (true && new URLSearchParams(window.location.search).get('da-content-visibility') !== 'off') { 4430 document.documentElement.classList.add('da-cv'); 4431 } 4432 4433 // The header that marks a request as this SRP's own. Sent by the adapter's 4434 // client (below) and recognised by the canceller; nothing else uses it. 4435 var DA_SRP_SEARCH_HEADER = 'X-DA-SRP-Search'; 4436 4437 if (daCancelStaleSearch) { 4438 (function () { 4439 var inFlight = null; 4440 4441 /** 4442 * Ownership is carried by the request itself, not inferred. 4443 * 4444 * Keying on '/multi_search' alone claimed EVERY Typesense client on 4445 * the page - the inventory-widget shortcode builds its own adapter, 4446 * and one slot shared between it and the SRP meant each aborted the 4447 * other's requests. A silenced request never settles its promise, 4448 * so the loser hung forever: the widget spinning, or the SRP stuck 4449 * in stalled with stale results. 4450 * 4451 * A timing-based claim (a ticket raised beside each search call) 4452 * only narrowed that: our XHR opens several microtasks after the 4453 * call, so a request already mid-chain in another adapter could 4454 * drain the ticket first and invert ownership, and typesense-js 4455 * schedules its retries on a timer, which left every retry 4456 * unclaimable. Both go away if the request announces itself: the 4457 * SRP's client sends DA_SRP_SEARCH_HEADER (see the adapter's server 4458 * config), no other client on the page does, and a retry re-sends 4459 * the same headers. 4460 * 4461 * The header costs no round trips. These requests already carry 4462 * x-typesense-api-key and a JSON content type, so they are already 4463 * preflighted; the endpoint was measured to reflect an arbitrary 4464 * requested header back in access-control-allow-headers, with 4465 * access-control-max-age 3600. 4466 */ 4467 var nativeSend = XMLHttpRequest.prototype.send; 4468 var nativeAbort = XMLHttpRequest.prototype.abort; 4469 var nativeAdd = XMLHttpRequest.prototype.addEventListener; 4470 var nativeRem = XMLHttpRequest.prototype.removeEventListener; 4471 var nativeHeader = XMLHttpRequest.prototype.setRequestHeader; 4472 4473 XMLHttpRequest.prototype.setRequestHeader = function (name, value) { 4474 if (String(name).toLowerCase() === DA_SRP_SEARCH_HEADER.toLowerCase()) { 4475 this.__daSearch = true; 4476 this.__daHandlers = []; 4477 } 4478 return nativeHeader.apply(this, arguments); 4479 }; 4480
4481 // Record what axios attaches to a search request, so it can all be 4482 // detached at supersede time. Non-search requests skip the 4483 // bookkeeping entirely. 4484 XMLHttpRequest.prototype.addEventListener = function (type, fn, opts) { 4485 if (this.__daSearch && this.__daHandlers) { 4486 this.__daHandlers.push([type, fn, opts]); 4487 } 4488 return nativeAdd.apply(this, arguments); 4489 }; 4490 4491 function silence(xhr) { 4492 (xhr.__daHandlers || []).forEach(function (h) { 4493 try { nativeRem.call(xhr, h[0], h[1], h[2]); } catch (e) {} 4494 }); 4495 xhr.__daHandlers = null; 4496 // Older axios wires the on* properties instead of listeners. 4497 xhr.onreadystatechange = xhr.onload = xhr.onerror = null; 4498 xhr.onabort = xhr.ontimeout = xhr.onloadend = xhr.onprogress = null; 4499 try { nativeAbort.call(xhr); } catch (e) {} 4500 } 4501 4502 XMLHttpRequest.prototype.send = function () { 4503 if (this.__daSearch) { 4504 if (inFlight && inFlight !== this) { 4505 silence(inFlight); 4506 } 4507 inFlight = this; 4508 4509 var self = this; 4510 // Attached via the native path so silence() cannot strip it. 4511 nativeAdd.call(this, 'loadend', function () { 4512 if (inFlight === self) { inFlight = null; } 4513 }); 4514 } 4515 return nativeSend.apply(this, arguments); 4516 }; 4517 })(); 4518 } 4519 4520 const typesenseAdapter = new TypesenseInstantSearchAdapter({ 4521 server: { 4522 apiKey: "eQUa8iq30l8Tu908Drz9WKqar6tCJGd4", 4523 nodes: [{ 4524 host: 'hjnrb3s21408ezpfp.a1.typesense.net', 4525 port: 443, 4526 protocol: 'https' 4527 }], 4528 // Marks this client's requests for the stale-search canceller 4529 // above, retries included. Sent only when cancellation is on, so a 4530 // dealer with the switch off sends exactly the old request. 4531 additionalHeaders: daCancelStaleSearch 4532 ? (function () { var h = {}; h[DA_SRP_SEARCH_HEADER] = '1'; return h; })() 4533 : {}, 4534 cacheSearchResultsForSeconds: 2 * 60, 4535 }, 4536 additionalSearchParameters: Object.assign({ 4537 query_by: "vin,stockNumber,lastEight,year,make,model,trim,exteriorColor,body,features,engine,transmission,drivetrain,fuel,genericColor,dealertag" 4538 }, daTrimSearchPayload ? { highlight_fields: "none", highlight_full_fields: "none" } : {}) 4539 }); 4540 4541const searchClient = typesenseAdapter.searchClient; 4542 4543 4544 /** 4545 * Hold result RENDERING until typing pauses. The search itself is not 4546 * delayed - this is the other half of the story the render split started. 4547 * 4548 * The field reports that prompted it (2026-08-21, three iPhone users, 4549 * independently): results arrive fast, but LETTERS appear late. The trace 4550 * agrees: each keystroke's re-render occupies the main thread for roughly 4551 * two seconds on a phone (InstantSearch rebuild + style recalculation 4552 * across ~16,000 elements on live i95), so the NEXT keypress cannot paint 4553 * until the previous render finishes. One user narrated the mechanism 4554 * without knowing it: "once filter(0) is reached, the lag is gone so live 4555 * filtering seems to be lagging input." 4556 * 4557 * So: while keys arrive faster than the settle delay, the queryHook holds 4558 * the QUERY too (see the BURST ADDENDUM there: calling search() moves the 4559 * helper's state and re-renders every widget, main-thread work that the 4560 * gated render handler cannot avoid), and this wrapper holds any RESPONSE 4561 * still in flight when typing resumes. While the user types, nothing 4562 * renders and every keystroke echoes instantly; the moment they pause,
4563 * exactly one search fires and its response renders on arrival. On a slow 4564 * connection that is one round trip after the pause - the accepted price 4565 * of the burst hold, kept honest by cancel-stale above so nothing stale 4566 * competes with it. 4567 * 4568 * Two guards keep it to exactly ONE render per pause: 4569 * - cancel-stale above kills superseded requests at the network layer; 4570 * - the sequence check here refuses to deliver any response that is no 4571 * longer the newest, covering dealers with cancel-stale switched off. 4572 * A refused response returns a promise that never settles, which is also 4573 * how cancel-stale silences axios - InstantSearch's own query 4574 * ordering means it was never going to render anyway. 4575 * 4576 * Quiet threshold shares DA_SETTLE_MS (Theme Options -> Performance -> 4577 * settle delay) so there is one tuning knob for "typing has paused". 4578 */ 4579 var daRenderOnSettle = true && new URLSearchParams(window.location.search).get('da-render-on-settle') !== 'off'; 4580 4581 /** 4582 * -Infinity, not 0: performance.now() starts near zero at page load, so a 4583 * zero here read as "typed just now" for the first DA_SETTLE_MS of page 4584 * life and held the bootstrap render behind whenQuiet() on warm loads. 4585 */ 4586 var daLastTypeAt = -Infinity; 4587 4588 /** 4589 * True while the shopper is mid-burst in the search box. Shared by the 4590 * response hold below and onRenderHandler: while this is true, responses 4591 * are parked, so a render event can only be a loading-state churn against 4592 * results that cannot have changed - and both halves of the handler skip. 4593 */ 4594 function daTypingActive() { 4595 var quiet = (typeof DA_SETTLE_MS === 'number') ? DA_SETTLE_MS : 250; 4596 return (performance.now() - daLastTypeAt) < quiet; 4597 } 4598 4599 if (daRenderOnSettle) { 4600 document.addEventListener('input', function (e) { 4601 if (e.target && e.target.classList && e.target.classList.contains('ais-SearchBox-input')) { 4602 daLastTypeAt = performance.now(); 4603 } 4604 }, true); 4605 4606 (function () { 4607 var seq = 0; 4608 4609 function quietMs() { 4610 return (typeof DA_SETTLE_MS === 'number') ? DA_SETTLE_MS : 250; 4611 } 4612 4613 function whenQuiet(isStale) { 4614 return new Promise(function (resolve) { 4615 (function check() { 4616 // A superseded caller stops polling right away: its 4617 // .then below discards the result, and resolving now 4618 // releases the response object this promise chain was 4619 // pinning (~428KB per keystroke on live i95) instead 4620 // of reforging the closure until typing stops. 4621 if (isStale()) { 4622 resolve(); 4623 return; 4624 } 4625 var since = performance.now() - daLastTypeAt; 4626 if (since >= quietMs()) { 4627 resolve(); 4628 } else { 4629 setTimeout(check, Math.max(16, quietMs() - since)); 4630 } 4631 })(); 4632 }); 4633 } 4634 4635 var origSearch = searchClient.search.bind(searchClient); 4636 4637 searchClient.search = function (requests) { 4638 var mySeq = ++seq; 4639 4640 return origSearch(requests).then(function (res) { 4641 if (mySeq !== seq) { 4642 return new Promise(function () {}); 4643 } 4644 return whenQuiet(function () { return mySeq !== seq; }).then(function () { 4645 if (mySeq !== seq) { 4646 return new Promise(function () {}); 4647 } 4648 return res; 4649 }); 4650 }); 4651 }; 4652 })(); 4653 } 4654function getSrpWindowTitle(refinementList) { 4655 if (!refinementList) { 4656 return srpCondition + " Toyota Vehicles in " + cityState; 4657 } 4658 4659 return srpCondition + " " + buildTitle(refinementList) + " in " + cityState; 4660} 4661 4662function syncSrpSeoState(refinementList) { 4663 $("h1").text(getSrpWindowTitle(refinementList)); 4664 4665 if (refinementList) { 4666 buildDescription(refinementList); 4667 } 4668} 4669 4670const daSrpRouter = instantsearch.routers.history({ 4671 /** 4672 * One history entry per settled search, not one per keystroke. 4673 * 4674 * The router calls history.pushState on every UI-state write, and the 4675 * default 400ms writeDelay is shorter than the gap between keystrokes 4676 * for most people - so typing a six-letter model name pushed six 4677 * entries. That is six Back presses to leave the page, and it walks 4678 * straight at WebKit's history-call rate limit (~100 per 30s, past 4679 * which Safari throws a SecurityError). 1000ms collapses a typed word
4680 * into one or two entries; refinement clicks are spaced well past a 4681 * second apart, so facet navigation keeps an entry per click exactly 4682 * as before. 4683 * 4684 * The debounce has a hole the pagehide flush below plugs: the router 4685 * never flushes a pending write when the page is left, so a shopper 4686 * who filtered and tapped a vehicle inside one writeDelay would come 4687 * Back to an SRP that had forgotten the filter. True at the default 4688 * 400ms too; a full second just made it easy to hit. 4689 */ 4690 writeDelay: 1000, 4691 windowTitle: function windowTitle(routeState) { 4692 syncSrpSeoState(routeState.refinementList); 4693 4694 return getSrpWindowTitle(routeState.refinementList); 4695 }, 4696 createURL: function createURL({ qsModule, location, routeState }) { 4697 const origin = location.origin; 4698 const pathname = location.pathname; 4699 const hash = location.hash; 4700 4701 const urlParams = new URLSearchParams(window.location.search); 4702 const priceBelow = urlParams.get('priceBelow'); 4703 4704 /** 4705 * Params carried onto every URL the router builds. 4706 * 4707 * The query string is rebuilt from route state, so anything the 4708 * router does not model is dropped on every write. utm_* was 4709 * already carried for that reason; the ad click IDs join it, 4710 * because Back from a VDP onto an SRP stripped of its gclid breaks 4711 * attribution for the traffic that costs the most to buy. 4712 * 4713 * Carrying them HERE rather than in the pagehide flush is what 4714 * makes the flush safe. Its first version appended click IDs to 4715 * the finished URL string and split on '#' and '?' to place them, 4716 * which mis-sliced any URL whose refinement values contain those 4717 * characters - and they can, because refinements are serialised 4718 * with encode:false (the exteriorHex strip below exists for the 4719 * same reason). A dealertag of "Certified #1 Dealer" truncated the 4720 * query at the '#' and pushed every later refinement into the 4721 * fragment. Building the URL in one place, from parts, has no 4722 * string surgery to get wrong. 4723 * 4724 * Values are encoded, unlike the raw interpolation below: these 4725 * arrive from ad platforms rather than from our own state, and an 4726 * unencoded one would reintroduce exactly the bug above. 4727 */ 4728 const carriedParams = [ 4729 'utm_campaign', 'utm_medium', 'utm_source', 'utm_term', 'utm_id', 'utm_content', 4730 'gclid', 'gbraid', 'wbraid', 'dclid', 'fbclid', 'msclkid', 'ttclid', 'gad_source', 'srsltid' 4731 ]; 4732 const utmQuery = carriedParams 4733 .map(param => { 4734 const value = urlParams.get(param); 4735 return value ? `${param}=${encodeURIComponent(value)}` : null; 4736 }) 4737 .filter(Boolean) 4738 .join('&'); 4739 4740 const queryParts = []; 4741 4742 if (routeState.refinementList) { 4743 var refinements = Object.assign({}, routeState.refinementList); 4744 // Remove # from exteriorHex values for correct URL formatting 4745 if (refinements.exteriorHex) { 4746 refinements.exteriorHex = refinements.exteriorHex.map(function(v) { return v.replace('#', ''); }); 4747 } 4748 queryParts.push(qsModule.stringify(refinements, { arrayFormat: 'repeat', delimiter: '&', encode: false })); 4749 } 4750 4751 if (routeState.hierarchicalMenu) { 4752 queryParts.push(qsModule.stringify({ modelCategory: routeState.hierarchicalMenu["modelCategory.lvl0"] }, { arrayFormat: 'repeat', delimiter: '&', encode: false })); 4753 } 4754 4755 if (routeState.query) { 4756 queryParts.push(`q=${routeState.query}`); 4757 } 4758 4759 if (routeState.page) { 4760 queryParts.push(`pg=${routeState.page}`); 4761 } 4762 4763 if (routeState.range?.rangeSliderPrice) { 4764 queryParts.push(`priceRange=${routeState.range.rangeSliderPrice}`); 4765 } 4766 if (routeState.range?.mileage) { 4767 queryParts.push(`mileageRange=${routeState.range.mileage}`); 4768 } 4769 if (routeState.range?.yr) { 4770 queryParts.push(`yearRange=${routeState.range.yr}`); 4771 } 4772 4773 if (priceBelow) { 4774 queryParts.push(`priceBelow=${priceBelow}`); 4775 } 4776 4777 let queryString = queryParts.filter(Boolean).join('&'); 4778 4779 if (queryString.includes('transmission_type')) { 4780 queryString = queryString.replace('_type', ''); 4781 } 4782 4783 if (utmQuery) { 4784 queryString = queryString ? `${queryString}&${utmQuery}` : utmQuery; 4785 } 4786 4787 const fullURL = `${origin}${pathname}${queryString ? `?${queryString}` : ''}${hash}`; 4788 4789 return fullURL; 4790 }, 4791 parseURL: function parseURL(_ref2) { 4792 var qsModule = _ref2.qsModule, location = _ref2.location; 4793 var urlSearch = new URLSearchParams(window.location.search); 4794 //Convert the current URL to JSON
4795 let refinements = qsModule.parse(location.search.slice(1), {arrayFormat: 'repeat', delimiter: '&'}); 4796 4797 // Add hashtag back to exteriorHex for correct filtering 4798 if (refinements.exteriorHex) { 4799 refinements.exteriorHex = [].concat(refinements.exteriorHex).map(function(v) { 4800 return v.charAt(0) === '#' ? v : '#' + v; 4801 }); 4802 } 4803 4804 var priceBelow = urlSearch.get('priceBelow'); 4805 if (priceBelow) { 4806 refinements.price = refinements.price || []; 4807 refinements.price.push('<' + priceBelow); 4808 } 4809 4810 //Carousel Model Manipulation 4811 if(refinements['model']) { 4812 4813 if(Array.isArray(refinements['model'])) { 4814 for(let i = 0; i < refinements['model'].length; i++) { 4815 refinements['model'][i] = formatModelName(refinements['model'][i]); 4816 } 4817 }else{ 4818 refinements['model'] = formatModelName(refinements['model']); 4819 } 4820 } 4821 //End Carousel Model Manipulation 4822 4823 if (isNexusToyota && refinements['flags.type'] == "Certified") 4824 { 4825 refinements['flags.type'] = [ 4826 "Gold Certified", 4827 "Silver Certified" 4828 ]; 4829 } else if (isNexusHonda && refinements['flags.type'] == "Certified") 4830 { 4831 refinements['flags.type'] = [ 4832 "True Certified", 4833 "True Used" 4834 ]; 4835 } else if (isNexusAcura && refinements['flags.type'] == "Certified") { 4836 refinements['flags.type'] = [ 4837 "Precision Certified", 4838 "Precision Used" 4839 ]; 4840 } 4841 4842 4843 4844 let refinementsList = refinements; 4845 4846 for (var refinement in refinements) 4847 { 4848 if (typeof refinements[refinement] == "string") 4849 { 4850 refinementsList[refinement] = [refinements[refinement]]; 4851 } 4852 } 4853 4854 const priceRange = urlSearch.get('priceRange'); 4855 const mileageRange = urlSearch.get('mileageRange'); 4856 const yearRange = urlSearch.get('yearRange'); 4857 let range = {}; 4858 4859 if (priceRange) { 4860 range.rangeSliderPrice = priceRange; 4861 } 4862 4863 if (mileageRange) { 4864 range.mileage = mileageRange; 4865 } 4866 4867 if (yearRange) { 4868 range.yr = yearRange; 4869 } 4870 4871 let hierarchicalMenu = {}; 4872 if (refinements['modelCategory']) 4873 { 4874 hierarchicalMenu["modelCategory.lvl0"] = refinements['modelCategory']; 4875 } 4876 4877 //Return the corrected refinement array and current query and page (if exists) 4878 return { 4879 refinementList: refinementsList, 4880 query: urlSearch.get('q'), 4881 page: urlSearch.get('pg'), 4882 range: range, 4883 hierarchicalMenu: hierarchicalMenu 4884 } 4885 } 4886 }); 4887 4888 /** 4889 * Commit the debounced URL write before the page goes away. 4890 * 4891 * The history router schedules its history write on a writeDelay timer and 4892 * never flushes it on unload (verified in the instantsearch.js bundle), so 4893 * any navigation inside the delay - filter, tap a vehicle, Back - landed on 4894 * an SRP without the filter. 4895 * 4896 * REPLACE, never push. The entry being fixed up is the SRP the shopper is 4897 * leaving, so the correction belongs ON it: pushing would leave the 4898 * filtered SRP in front of the unfiltered one and cost a second Back press 4899 * to escape, which is the exact tax the writeDelay change set out to 4900 * remove. It also sidesteps the browser-dependent question of where an 4901 * entry pushed during pagehide lands relative to the committing navigation. 4902 * 4903 * The URL is captured at write() time rather than rebuilt at pagehide, 4904 * because that is the moment the router computes its own - only the history 4905 * call is debounced - so what is written is byte-identical to what would 4906 * have been. It is also written UNTOUCHED: click IDs are carried by 4907 * createURL now, so there is no string surgery here to get wrong on a 4908 * refinement value containing '#' or '?'. 4909 * 4910 * pagehide rather than beforeunload: it fires only when the page is really 4911 * being left, so a cancelled navigation cannot rewrite the URL underneath a 4912 * shopper who stayed. 4913 * 4914 * ?da-url-flush=off disables it for one request. It is the only behaviour 4915 * in this PR that writes browser history during unload, so it gets the same 4916 * escape hatch as everything else here even though it is a bug fix. 4917 */ 4918 if (new URLSearchParams(window.location.search).get('da-url-flush') !== 'off') { 4919 (function () {
4920 var pendingUrl = null; 4921 var nativeWrite = daSrpRouter.write.bind(daSrpRouter); 4922 4923 daSrpRouter.write = function (routeState) { 4924 pendingUrl = daSrpRouter.createURL(routeState); 4925 return nativeWrite(routeState); 4926 }; 4927 4928 window.addEventListener('pagehide', function () { 4929 if (pendingUrl === null || pendingUrl === window.location.href) { 4930 return; // nothing pending, or the debounced write already ran 4931 } 4932 4933 try { 4934 history.replaceState(null, '', pendingUrl); 4935 } catch (e) { /* WebKit's history rate limit; nothing left to try */ } 4936 }); 4937 })(); 4938 } 4939 4940const search = instantsearch({indexName: indexName, stalledSearchDelay: 1000, searchClient: searchClient, searchParameters: { clickAnalytics: true }, routing: {router: daSrpRouter, stateMapping: { 4941 stateToRoute: function stateToRoute(uiState) { 4942 //Update routeState with current uiState 4943 return { 4944 query: uiState[indexName].query, 4945 page: uiState[indexName].page, 4946 refinementList: uiState[indexName].refinementList, 4947 range: uiState[indexName].range, 4948 hierarchicalMenu: uiState[indexName].hierarchicalMenu 4949 }; 4950 }, 4951 routeToState: function routeToState(routeState) { 4952 //Update uiState with current routeState 4953 return { 4954 "vehicles-TOY37194": { 4955 query: routeState.query, 4956 page: routeState.page, 4957 refinementList: routeState.refinementList, 4958 range: routeState.range, 4959 hierarchicalMenu: routeState.hierarchicalMenu 4960 } 4961 }; 4962 } 4963 }}}); 4964 4965 const urlParams = new URLSearchParams(window.location.search); 4966 const priceBelow = urlParams.get('priceBelow'); 4967 4968 let setFilters = ''; 4969 if (priceBelow) { 4970 setFilters = `condition:${srpCondition} && finalPriceInt:<${priceBelow}`; 4971 } else { 4972 setFilters = "condition:" + srpCondition; 4973 } 4974 4975 //Main Search Widget 4976 search.addWidgets([ 4977 instantsearch.widgets.configure({ 4978 filters: setFilters, 4979 hitsPerPage: 24 4980 }) 4981 ]); 4982 4983 4984 //Results Widget 4985 search.addWidgets([ 4986 instantsearch.widgets.hits({ 4987 container: '#srp-results', 4988 templates: { 4989 item: document.getElementById('hit-template').innerHTML, 4990 empty: document.getElementById('empty-template').innerHTML 4991 }, 4992 transformItems(items) { 4993 const transformedItems = items.map(item => transformIncentives(item)); 4994 vehiclesList = items; 4995 return items; 4996 } 4997 }) 4998 ]); 4999 5000 // Listen for the render event 5001 search.on('render', () => { 5002 _triggerInventoryLoaded(); 5003 // You can add any post-render logic here 5004 }); 5005 5006 //Banner Widget for TOP of srp 5007 5008 //Text Search Widget 5009 search.addWidget( 5010 instantsearch.widgets.searchBox({ 5011 container: "#searchbox", 5012 placeholder: "Search Inventory", 5013 autofocus: false, 5014 showLoadingIndicator: true, 5015 queryHook: function(query, search){ 5016 5017 query = query.replace(/(\b\d\b)\s+(?=\w)/g, '$1'); 5018 5019 if(query?.length == 0 || query == undefined){ 5020 document.querySelector('#clearSearchResults').style.display = "none"; 5021 } else { 5022 document.querySelector('#clearSearchResults').style.display = "block"; 5023 } 5024 5025 /** 5026 * Coalesce keystrokes into one search. 5027 * 5028 * Each search replaces the whole results list - about 3,400 nodes - 5029 * and every third-party observer watching body or document is handed 5030 * that entire record set. Firing per character multiplied that by the 5031 * length of the word. 5032 * 5033 * 100ms is deliberately short: it is below the ~150ms where typing 5034 * starts to feel laggy, so results still land while the user is 5035 * typing, but a burst within one word collapses into a single render. 5036 * Clearing the box is exempt so the reset stays instant. 5037 * 5038 * BURST ADDENDUM (2026-08-21, the iPhone keystroke-echo reports). 5039 * Even with the render-on-settle response hold, calling search() 5040 * per keystroke costs: every call moves the helper's state, and 5041 * InstantSearch re-renders every widget against it - measured at 5042 * ~4.7s of main-thread work across one fast-typed word on the 5043 * 4x-throttled bench, none of it produced by our render handler 5044 * (the A/B with the handler gated read the same). So while keys 5045 * are arriving faster than the settle delay, the timer re-arms 5046 * instead of firing: a fast burst reaches the helper as ONE 5047 * search when the fingers pause, and a deliberate typist whose 5048 * gaps exceed the settle delay gets the old per-keystroke flow 5049 * untouched. Gated on the same switch as the response hold - 5050 * they are two halves of "nothing renders mid-burst". 5051 */ 5052 if (window.__dvSearchDebounce) { 5053 clearTimeout(window.__dvSearchDebounce); 5054 } 5055 5056 if (!query) { 5057 // Clearing must reset instantly, as promised above - but 5058 // the backspace that emptied the box also bumped 5059 // daLastTypeAt, which would hold the reset render behind 5060 // the settle delay. Declare typing over instead. 5061 daLastTypeAt = -Infinity; 5062 search(query); 5063 return; 5064 } 5065 5066 var daFireSearch = function () {
5067 if (daRenderOnSettle && daTypingActive()) { 5068 window.__dvSearchDebounce = setTimeout(daFireSearch, 100); 5069 return; 5070 } 5071 search(query); 5072 }; 5073 5074 window.__dvSearchDebounce = setTimeout(daFireSearch, 100); 5075 } 5076 }) 5077 ); 5078 5079 //5-2-2023 customer default sorting work around while we build to admin panel 5080 let currentIndex = 'vehicles-TOY37194'; 5081 currentIndex = currentIndex.split('/')[0]; 5082 5083 //Sort By Widget Desktop 5084 const { connectSortBy } = instantsearch.connectors; 5085 const renderSortByDesktop = (renderOptions, isFirstRender) => { 5086 const { 5087 options, 5088 currentRefinement, 5089 refine, 5090 widgetParams, 5091 // `canRefine` is only available from v4.45.0 5092 // Use `hasNoResults` in earlier minor versions. 5093 canRefine, 5094 } = renderOptions; 5095 5096 if (isFirstRender) { 5097 const _div = document.createElement('div'); 5098 _div.classList.add("dv-srp-sort-desktop"); 5099 5100 _div.innerHTML = ` 5101 ${options.map(option => 5102 `<a data-sort-value="${option.value}" data-sort-label="${option.label}" class="${option.value === currentRefinement ? 'dv-srp-sort-selected' : ''}"> 5103 <i class="fas fa-${option.icon}"></i> ${option.label} 5104 </a>`).join('') 5105 } 5106 `; 5107 let filtered = options.filter(opt => opt.value === currentRefinement); 5108 if(filtered?.length > 0){ 5109 document.querySelector('.dv-srp-search-options-dynamic-label').innerHTML = filtered[0].label; 5110 } 5111 widgetParams.container.appendChild(_div); 5112 } 5113 5114 //widgetParams.container.querySelector('div'); 5115 const nodes = document.querySelectorAll('.dv-srp-sort-desktop > *'); 5116 nodes.forEach(function(node) { 5117 node.addEventListener('click', function(event) { 5118 event.preventDefault(); 5119 if (event?.target == undefined) { return }; 5120 let _ActiveClass = 'dv-srp-sort-selected'; 5121 let _value = event?.target?.dataset?.sortValue; 5122 let _label = event?.target?.dataset?.sortLabel; 5123 5124 if (_value && _value != currentRefinement) { 5125 refine(_value); 5126 if(currentRefinement){ 5127 nodes.forEach(el => el.classList.remove(_ActiveClass)); 5128 event?.target?.classList.add(_ActiveClass); 5129 document.querySelector('.dv-srp-search-options-dynamic-label').innerHTML = _label; 5130 } 5131 } 5132 }); 5133 }); 5134 5135 }; 5136 // Create the custom widget 5137 const customSortByDesktop = connectSortBy(renderSortByDesktop); 5138 search.addWidgets([ 5139 customSortByDesktop({ 5140 container: document.querySelector('#sortByDesktop'), 5141 items: [ 5142 { label: "Most Relevant", value: `${currentIndex}`, icon: 'sort'}, 5143 { label: "Price Low to High", value: `${currentIndex}/sort/sortPrice:desc,price:asc`, icon: 'sort-numeric-down'}, 5144 { label: "Price High to Low", value: `${currentIndex}/sort/sortPrice:desc,price:desc`, icon: 'sort-numeric-up'}, 5145 { label: distanceUnit + 's Low to High', value: `${currentIndex}/sort/mileage:asc`, icon: 'sort-numeric-down'}, 5146 { label: "Year: Newest", value: `${currentIndex}/sort/yr:desc`, icon: 'long-arrow-up'}, 5147 { label: "Year: Oldest", value: `${currentIndex}/sort/yr:asc`, icon: 'long-arrow-down'} 5148 ], 5149 }) 5150 ]); 5151 5152 // Toggle Desktop Sort Dropdown 5153 document.querySelector('#sortByDesktop').addEventListener('click', function(event) { 5154 event.stopPropagation(); 5155 var el = document.querySelector('.dv-srp-sort-desktop'); 5156 el.classList.toggle('dv-srp-sort-desktop-active'); 5157 }); 5158 5159 // Close dropdown when clicking outside 5160 document.addEventListener('click', function(event) { 5161 var el = document.querySelector('.dv-srp-sort-desktop'); 5162 var button = document.querySelector('#sortByDesktop'); 5163 5164 if (!el.contains(event.target) && !button.contains(event.target)) { 5165 el.classList.remove('dv-srp-sort-desktop-active'); 5166 } 5167 }); 5168 5169 //Sort By Widget Mobile 5170 const renderSortByMobile = (renderOptions, isFirstRender) => { 5171 const { 5172 options, 5173 currentRefinement, 5174 refine, 5175 widgetParams, 5176 // `canRefine` is only available from v4.45.0 5177 // Use `hasNoResults` in earlier minor versions. 5178 canRefine, 5179 } = renderOptions; 5180 5181 if (isFirstRender) { 5182 const _div = document.createElement('div'); 5183 _div.classList.add("dv-srp-sort-mobile"); 5184 5185 _div.innerHTML = ` 5186 ${options.map(option => 5187 `<a data-sort-value="${option.value}" data-sort-label="${option.label}" class="${option.value === currentRefinement ? 'dv-srp-sort-selected' : ''}"> 5188 <i class="fas fa-${option.icon}"></i> ${option.label} 5189 </a>`).join('') 5190 } 5191 `; 5192 5193 widgetParams.container.appendChild(_div); 5194 } 5195 5196 //widgetParams.container.querySelector('div'); 5197 const nodes = document.querySelectorAll('.dv-srp-sort-mobile > *');
5198 nodes.forEach(function(node) { 5199 node.addEventListener('click', function(event) { 5200 event.preventDefault(); 5201 if (event?.target == undefined) { return }; 5202 let _ActiveClass = 'dv-srp-sort-selected'; 5203 let _value = event?.target?.dataset?.sortValue; 5204 let _label = event?.target?.dataset?.sortLabel; 5205 5206 if (_value && _value != currentRefinement) { 5207 refine(_value); 5208 if(currentRefinement){ 5209 nodes.forEach(el => el.classList.remove(_ActiveClass)); 5210 event?.target?.classList.add(_ActiveClass); 5211 } 5212 } 5213 }); 5214 }); 5215 5216 }; 5217 // Create the custom widget 5218 const customSortByMobile = connectSortBy(renderSortByMobile); 5219 search.addWidgets([ 5220 customSortByMobile({ 5221 container: document.querySelector('#sortByMobile'), 5222 items: [ 5223 { label: "Most Relevant", value: `${currentIndex}`, icon: 'sort'}, 5224 { label: "Price Low to High", value: `${currentIndex}/sort/sortPrice:desc,price:asc`, icon: 'sort-numeric-down'}, 5225 { label: "Price High to Low", value: `${currentIndex}/sort/sortPrice:desc,price:desc`, icon: 'sort-numeric-up'}, 5226 { label: distanceUnit + 's Low to High', value: `${currentIndex}/sort/mileage:asc`, icon: 'sort-numeric-down'}, 5227 { label: "Year: Newest", value: `${currentIndex}/sort/yr:desc`, icon: 'long-arrow-up'}, 5228 { label: "Year: Oldest", value: `${currentIndex}/sort/yr:asc`, icon: 'long-arrow-down'} 5229 ], 5230 }) 5231 ]); 5232 5233 // Toggle Mobile Sort Dropdown 5234 document.querySelector('#sortByMobile').addEventListener('click', function(event) { 5235 event.stopPropagation(); // Prevent the event from bubbling up to the document 5236 var el = document.querySelector('.dv-srp-sort-mobile'); 5237 el.classList.toggle('dv-srp-sort-mobile-active'); 5238 }); 5239 5240 // Close dropdown when clicking outside 5241 document.addEventListener('click', function(event) { 5242 var el = document.querySelector('.dv-srp-sort-mobile'); 5243 var button = document.querySelector('#sortByMobile'); 5244 5245 if (!el.contains(event.target) && !button.contains(event.target)) { 5246 el.classList.remove('dv-srp-sort-mobile-active'); 5247 } 5248 }); 5249 search.addWidget( 5250 instantsearch.widgets.rangeSlider({ 5251 container: '#price-range-slider', 5252 attribute: 'rangeSliderPrice', 5253 step: 1000, 5254 pips: false, 5255 precision: 0, 5256 tooltips: { 5257 format(value) { 5258 5259 const newValue = Math.round(value/1000)*1000 5260 return "$" + Math.round(newValue).toLocaleString(); 5261 }, 5262 }, 5263 }) 5264 ); 5265 5266 //Pin price ammounts to top and let handler move them 5267 const priceSlider = document.querySelector('#price-range-slider'); 5268 5269 if (priceSlider) { 5270 /** 5271 * Rheostat positions its handles by writing style.left, so the tooltips 5272 * have to be repositioned in response. Watching for that write is fine; 5273 * doing it naively is not, and the naive version was measurably the most 5274 * expensive observer on this page. 5275 * 5276 * Two problems it had: 5277 * 5278 * 1. It observed style attributes across the slider's whole subtree and 5279 * then wrote styles to the tooltips *inside* that subtree, so every 5280 * run scheduled another run. It only ever settled because the values 5281 * converged. 5282 * 2. It read offsetWidth and then wrote, synchronously, on every single 5283 * mutation - a forced layout each time. Typing in the SRP search box 5284 * re-renders the results and fires this constantly. 5285 * 5286 * So: coalesce to one run per frame, and disconnect around our own writes 5287 * so they cannot feed back in. Skipping unchanged values keeps us from 5288 * dirtying style for no reason. 5289 */ 5290 const OBSERVE_OPTIONS = { 5291 childList: true, 5292 subtree: true, 5293 attributes: true, 5294 attributeFilter: ['style'] 5295 }; 5296 5297 const setStyle = (el, prop, value) => { 5298 if (el.style[prop] !== value) { 5299 el.style[prop] = value; 5300 } 5301 }; 5302 5303 const applyTooltipPositions = () => { 5304 const handles = priceSlider.querySelectorAll('.rheostat-handle'); 5305 5306 if (handles.length !== 2) { 5307 return; 5308 } 5309 5310 const tooltip1 = handles[0].querySelector('.rheostat-tooltip'); 5311 const tooltip2 = handles[1].querySelector('.rheostat-tooltip'); 5312 const background = priceSlider.querySelector('.rheostat-background'); 5313 5314 if (!tooltip1 || !tooltip2 || !background) { 5315 return; 5316 } 5317
5318 // every read first, then every write - one layout pass, not two 5319 const handle1Left = parseFloat(handles[0].style.left) || 0; 5320 const handle2Left = parseFloat(handles[1].style.left) || 100; 5321 const sliderWidth = background.offsetWidth; 5322 5323 const handle1Offset = (handle1Left / 100) * sliderWidth; 5324 const handle2Offset = (handle2Left / 100) * sliderWidth; 5325 5326 setStyle(tooltip1, 'left', `-${handle1Offset}px`); 5327 setStyle(tooltip1, 'transform', 'none'); 5328 5329 setStyle(tooltip2, 'right', `-${sliderWidth - handle2Offset}px`); 5330 setStyle(tooltip2, 'left', 'auto'); 5331 setStyle(tooltip2, 'transform', 'none'); 5332 }; 5333 5334 let repositionQueued = false; 5335 5336 const scheduleReposition = () => { 5337 if (repositionQueued) { 5338 return; 5339 } 5340 5341 repositionQueued = true; 5342 5343 requestAnimationFrame(() => { 5344 repositionQueued = false; 5345 // Detach first: the writes below land inside the observed subtree 5346 // and would otherwise queue another callback immediately. 5347 observer.disconnect(); 5348 5349 try { 5350 applyTooltipPositions(); 5351 } finally { 5352 observer.observe(priceSlider, OBSERVE_OPTIONS); 5353 } 5354 }); 5355 }; 5356 5357 const observer = new MutationObserver(scheduleReposition); 5358 observer.observe(priceSlider, OBSERVE_OPTIONS); 5359 5360 scheduleReposition(); 5361 5362 window.addEventListener('resize', scheduleReposition); 5363 } 5364 var daFacetLimit = 100000; 5365 var daFacetShowMore = false; 5366 var daFacetShowMoreLimit = 100000; 5367 var daFacetSortLead = []; 5368 search.addWidget( 5369 instantsearch.widgets.refinementList({ 5370 container: '#make-list', 5371 attribute: 'make', 5372 operator: 'or', 5373 sortBy: daFacetSortLead.concat(['count:desc']), 5374 limit: daFacetLimit, 5375 showMore: daFacetShowMore, 5376 showMoreLimit: daFacetShowMoreLimit 5377 }) 5378 ); 5379 search.addWidget( 5380 instantsearch.widgets.refinementList({ 5381 container: '#model-list', 5382 attribute: "model", 5383 operator: 'or', 5384 sortBy(a,b) { 5385 // Comparator, so it cannot concat daFacetSortLead - same lead by hand. 5386 if (daFacetShowMore && a.isRefined !== b.isRefined) return a.isRefined ? -1 : 1; 5387 a = a.name.toLowerCase(); 5388 b = b.name.toLowerCase(); 5389 if( a == b) return 0; 5390 return a < b ? -1 : 1; 5391 }, 5392 limit: daFacetLimit, 5393 showMore: daFacetShowMore, 5394 showMoreLimit: daFacetShowMoreLimit, 5395 transformItems(items) { 5396 return items.filter(item => item.count > 0); 5397 }, 5398 }) 5399 ); 5400 search.addWidget( 5401 instantsearch.widgets.refinementList({ 5402 container: '#trim-list', 5403 attribute: 'trim', 5404 operator: 'or', 5405 sortBy: daFacetSortLead.concat(['count:desc']), 5406 limit: daFacetLimit, 5407 showMore: daFacetShowMore, 5408 showMoreLimit: daFacetShowMoreLimit 5409 }) 5410 ); 5411 search.addWidget( 5412 instantsearch.widgets.refinementList({ 5413 container: '#year-list', 5414 attribute: 'yr', 5415 operator: 'or', 5416 sortBy: daFacetSortLead.concat(['name:desc']), 5417 limit: daFacetLimit, 5418 showMore: daFacetShowMore, 5419 showMoreLimit: daFacetShowMoreLimit 5420 }) 5421 ); 5422 search.addWidget( 5423 instantsearch.widgets.refinementList({ 5424 container: '#pricerange-list', 5425 attribute: 'finalPriceRange', 5426 operator: 'or', 5427 sortBy: function sortBy(a, b) { 5428 let priceOptions = { 5429 "$10,000 and Below": 0, 5430 "$10,000 - $20,000": 1, 5431 "$20,000 - $30,000": 2, 5432 "$30,000 - $40,000": 3, 5433 "$40,000 - $50,000": 4, 5434 "$50,000 - $60,000": 5, 5435 "$60,000 - $70,000": 6, 5436 "$70,000 - $80,000": 7, 5437 "$80,000 - $90,000": 8, 5438 "$90,000 - $100,000": 9, 5439 "$100,000 and Up": 10 5440 }; 5441 5442 if (priceOptions[a.name] < priceOptions[b.name]) 5443 { 5444 return -1; 5445 } 5446 5447 if (priceOptions[a.name] > priceOptions[b.name]) 5448 { 5449 return 1; 5450 } 5451 5452 return 0; 5453 }, 5454 limit: 100000 5455 }) 5456 ); 5457 search.addWidget( 5458 instantsearch.widgets.refinementList({ 5459 container: '#body-list', 5460 attribute: 'body', 5461 operator: 'or', 5462 sortBy: daFacetSortLead.concat(['']), 5463 limit: daFacetLimit, 5464 showMore: daFacetShowMore, 5465 showMoreLimit: daFacetShowMoreLimit, 5466 templates: { 5467 item: "<label class=\"ais-RefinementList-label\">\n\t\t\t\t\t\t\t<input type=\"checkbox\" class=\"ais-RefinementList-checkbox\" value=\"{{value}}\">\n\t\t\t\t\t\t\t<span class=\"ais-RefinementList-labelText srp-{{value}}\">{{value}} · {{count}}</span>\n\t\t\t\t\t\t</label>" 5468 } 5469 }) 5470 ); 5471 5472 // Cab List Widget 5473 search.addWidget( 5474 instantsearch.widgets.refinementList({ 5475 container: '#cab-list', 5476 attribute: 'cab', 5477 operator: 'or', 5478 sortBy: daFacetSortLead.concat(['name:asc']), 5479 limit: daFacetLimit, 5480 showMore: daFacetShowMore, 5481 showMoreLimit: daFacetShowMoreLimit 5482 }) 5483 ); 5484 5485 //Bed List Widget 5486 search.addWidget( 5487 instantsearch.widgets.refinementList({ 5488 container: '#bed-list', 5489 attribute: 'bed', 5490 operator: 'or', 5491 sortBy: daFacetSortLead.concat(['name:asc']), 5492 limit: daFacetLimit, 5493 showMore: daFacetShowMore, 5494 showMoreLimit: daFacetShowMoreLimit 5495 }) 5496 ); 5497 search.addWidget( 5498 instantsearch.widgets.refinementList({ 5499 container: '#fuel-list', 5500 attribute: 'fuel', 5501 operator: 'or', 5502 sortBy: daFacetSortLead.concat(['count:desc']), 5503 limit: daFacetLimit, 5504 showMore: daFacetShowMore, 5505 showMoreLimit: daFacetShowMoreLimit 5506 }) 5507 ); 5508 search.addWidget( 5509 instantsearch.widgets.refinementList({ 5510 container: '#transmission-list', 5511 attribute: 'transmissionType', 5512 operator: 'or', 5513 sortBy: daFacetSortLead.concat(['count:desc']), 5514 limit: daFacetLimit, 5515 showMore: daFacetShowMore, 5516 showMoreLimit: daFacetShowMoreLimit 5517 }) 5518 ); 5519 search.addWidget( 5520 instantsearch.widgets.refinementList({ 5521 container: '#drivetrain-list', 5522 attribute: 'drivetrain', 5523 operator: 'or', 5524 sortBy: daFacetSortLead.concat(['count:desc']), 5525 limit: daFacetLimit, 5526 showMore: daFacetShowMore, 5527 showMoreLimit: daFacetShowMoreLimit, 5528 transformItems(items) { 5529 return items.filter((i) => i.value !== ""); 5530 } 5531 }) 5532 ); 5533 search.addWidget( 5534 instantsearch.widgets.refinementList({ 5535 container: '#location-list', 5536 attribute: 'dealerName', 5537 operator: 'or', 5538 sortBy: ['count:desc'], 5539 limit: 500 5540 }) 5541 ); 5542 search.addWidget( 5543 instantsearch.widgets.refinementList({ 5544 container: '#mpg-hway-list', 5545 attribute: 'mpgHwayRange', 5546 operator: 'or', 5547 sortBy: ['count:desc'], 5548 }) 5549 ); 5550 search.addWidget( 5551 instantsearch.widgets.refinementList({ 5552 container: '#mpg-city-list', 5553 attribute: 'mpgCityRange', 5554 operator: 'or', 5555 sortBy: ['count:desc'], 5556 }) 5557 ); 5558 search.addWidget( 5559 instantsearch.widgets.refinementList({ 5560 container: '#features-list', 5561 attribute: 'features', 5562 operator: 'and', 5563 sortBy: daFacetSortLead.concat(['name:acs']), 5564 limit: daFacetLimit, 5565 showMore: daFacetShowMore, 5566 showMoreLimit: daFacetShowMoreLimit 5567 }) 5568 ); 5569 search.addWidget( 5570 instantsearch.widgets.refinementList({ 5571 container: '#range-list', 5572 attribute: 'range', 5573 operator: 'or', 5574 sortBy: ['count:desc'], 5575 limit: 100000 5576 }) 5577 ); 5578 5579 5580 /* 5581 * 5582 * OEMs require the following order for vehicle Status - NEX-1762 5583 * 5584 */ 5585 const oemStatusOrder = ["In Stock", "In Transit", "In Production"]; 5586 5587 search.addWidget( 5588 instantsearch.widgets.refinementList({ 5589 container: '#status-list', 5590 attribute: 'status', 5591 transformItems(items) { 5592 const sortedItems = [...items].sort((a, b) => { 5593 const indexA = oemStatusOrder.indexOf(a.label); 5594 const indexB = oemStatusOrder.indexOf(b.label); 5595 5596 return (indexA === -1 ? oemStatusOrder.length : indexA) - 5597 (indexB === -1 ? oemStatusOrder.length : indexB); 5598 }); 5599 5600 return sortedItems; // Ensure it returns a new array 5601 }, 5602 templates: { 5603 item: `<label class="ais-RefinementList-label"> 5604 <input type="checkbox" class="ais-RefinementList-checkbox" value="{{value}}"> 5605 <div>
5606 <span class="ais-RefinementList-labelText">{{label}}</span> 5607 </div> 5608 <span class="ais-RefinementList-count">{{count}}</span> 5609 </label>` 5610 } 5611 }) 5612 ); 5613 5614 //Type List Widget 5615 search.addWidget( 5616 instantsearch.widgets.refinementList({ 5617 container: '#type-list', 5618 attribute: 'flags.type', 5619 operator: 'or', 5620 sortBy: daFacetSortLead.concat(['count:desc']), 5621 limit: daFacetLimit, 5622 showMore: daFacetShowMore, 5623 showMoreLimit: daFacetShowMoreLimit 5624 }) 5625 ); 5626 5627 search.addWidget( 5628 instantsearch.widgets.refinementList({ 5629 container: '#dealertag-list', 5630 attribute: 'dealertag', 5631 operator: 'or', 5632 limit: daFacetLimit, 5633 showMore: daFacetShowMore, 5634 showMoreLimit: daFacetShowMoreLimit 5635 }) 5636 ); 5637 5638 5639 //Custom Pagination SRP 5640 const { connectPagination } = instantsearch.connectors; 5641 5642 const renderPagination = (renderOptions, isFirstRender) => { 5643 const { 5644 pages, 5645 currentRefinement, 5646 nbPages, 5647 isFirstPage, 5648 isLastPage, 5649 refine, 5650 createURL, 5651 } = renderOptions; 5652 5653 const container = document.querySelector('#pagination-top'); 5654 5655 if (nbPages <= 1) { 5656 container.style.display = 'none'; 5657 return; 5658 } else { 5659 container.style.display = ''; 5660 } 5661 5662 container.innerHTML = ` 5663 <ul class="ais-pagination-ul"> 5664 ${ 5665 currentRefinement >= 1 5666 ? ` 5667 <li> 5668 <a class="ais-Pagination-link" href="${createURL(currentRefinement - 1)}" data-value="${currentRefinement - 1}"> 5669 <i class="fa-solid fa-chevron-left"></i> 5670 </a> 5671 </li> 5672 ` 5673 : '' 5674 } 5675 <div class="ais-pagination-wrapper"> 5676 Page <span class="ais-Pagination-link">${currentRefinement + 1}</span> of <span class="ais-Pagination-link">${nbPages}</span> 5677 </div> 5678 ${ 5679 currentRefinement < nbPages - 1 5680 ? ` 5681 <li> 5682 <a class="ais-Pagination-link" href="${createURL(currentRefinement + 1)}" data-value="${currentRefinement + 1}"> 5683 <i class="fa-solid fa-chevron-right"></i> 5684 </a> 5685 </li> 5686 ` 5687 : '' 5688 } 5689 </ul> 5690 `; 5691 5692 [...container.querySelectorAll('a')].forEach(element => { 5693 element.addEventListener('click', event => { 5694 event.preventDefault(); 5695 refine(event.currentTarget.dataset.value); 5696 5697 window.scrollTo({ 5698 top: 0, 5699 left: 0, 5700 behavior: 'smooth' 5701 }); 5702 }); 5703 }); 5704 }; 5705 5706 const customPagination = connectPagination( 5707 renderPagination 5708 ); 5709 5710 search.addWidgets([ 5711 customPagination({ 5712 container: document.querySelector('#pagination-top'), 5713 }) 5714 ]); 5715 5716 //Bottom Pagination 5717 5718 const renderPaginationBottom = (renderOptions, isFirstRender) => { 5719 const { 5720 pages, 5721 currentRefinement, 5722 nbPages, 5723 isFirstPage, 5724 isLastPage, 5725 refine, 5726 createURL, 5727 } = renderOptions; 5728 5729 const containerBottom= document.querySelector('#pagination-bottom'); 5730 5731 if (nbPages <= 1) { 5732 containerBottom.style.visibility = 'hidden'; 5733 return; 5734 } else { 5735 containerBottom.style.visibility = 'visible'; 5736 } 5737 5738 containerBottom.innerHTML = ` 5739 <ul class="ais-pagination-ul"> 5740 ${ 5741 currentRefinement >= 1 5742 ? ` 5743 <li> 5744 <a class="ais-Pagination-link" href="${createURL(currentRefinement - 1)}" data-value="${currentRefinement - 1}"> 5745 <i class="fa-solid fa-chevron-left"></i> 5746 </a> 5747 </li> 5748 ` 5749 : '' 5750 } 5751 <div class="ais-pagination-wrapper"> 5752 Page <span class="ais-Pagination-link">${currentRefinement + 1}</span> of <span class="ais-Pagination-link">${nbPages}</span> 5753 </div> 5754 ${ 5755 currentRefinement < nbPages - 1 5756 ? ` 5757 <li> 5758 <a class="ais-Pagination-link" href="${createURL(currentRefinement + 1)}" data-value="${currentRefinement + 1}"> 5759 <i class="fa-solid fa-chevron-right"></i> 5760 </a> 5761 </li> 5762 ` 5763 : '' 5764 } 5765 </ul> 5766 `; 5767 5768 [...containerBottom.querySelectorAll('a')].forEach(element => { 5769 element.addEventListener('click', event => { 5770 event.preventDefault(); 5771 refine(event.currentTarget.dataset.value); 5772 5773 window.scrollTo({ 5774 top: 0, 5775 left: 0, 5776 behavior: 'smooth' 5777 }); 5778 }); 5779 }); 5780 }; 5781 5782 const customPaginationBottom = connectPagination( 5783 renderPaginationBottom 5784 ); 5785 5786 search.addWidgets([ 5787 customPaginationBottom({ 5788 container: document.querySelector('#pagination-bottom'), 5789 }) 5790 ]); 5791 5792//End Customer Pagination SRP 5793 5794 // Clear Results Button Widget 5795 //search.addWidget( 5796 // instantsearch.widgets.clearRefinements({ 5797 // container: '#clearSearchResults', 5798 // templates: { 5799 // resetLabel: '<i class="fal fa-backspace"></i> <span>Clear<br>Search</span>' 5800 // } 5801 // }) 5802 //); 5803 5804 search.addWidget( 5805 instantsearch.widgets.clearRefinements({ 5806 container: '#dv-srp-clear-filters', 5807 templates: { 5808 resetLabel: 'Clear All' 5809 } 5810 }) 5811 ); 5812 5813 search.addWidget( 5814 instantsearch.widgets.clearRefinements({ 5815 container: '#srp-filters-reset-btn', 5816 templates: { 5817 resetLabel: 'Clear Filters' 5818 } 5819 }) 5820 ); 5821 5822 //Results Stats Widget (Top) 5823 // in {{processingTimeMS}}ms 5824 const { connectStats } = instantsearch.connectors; 5825 5826 let renderStats = (renderOptions, isFirstRender) => { 5827 let { 5828 page, 5829 nbPages, 5830 nbSortedHits, 5831 hitsPerPage, 5832 nbHits, 5833 isLastPage, 5834 } = renderOptions; 5835 5836 const containerStats = document.querySelector('#resultsStats'); 5837 5838 let pageNumber = page + 1; 5839 let lastPage = nbPages - 1; 5840 let nextPage = page + 1; 5841 5842 containerStats.innerHTML =` 5843 <div class="ais-Stats"> 5844 ${nbHits === 0 ?`
5845 \n\t\t\t\t\tNo results\n\t\t\t\t\t 5846 ` : '' } 5847 ${page === 0 && nbHits > hitsPerPage ? ` 5848 \n\t\t\t\t\tShowing <span id=\"numberHits\">${pageNumber}</span> - <span id=\"numberHits\">${hitsPerPage * pageNumber}</span> of <span id=\"numberHits\">${nbHits}</span>\n results found\n\t\t\t\t\t` 5849 : ''} 5850 ${page >= 1 && page !== lastPage && nbHits > hitsPerPage ? ` 5851 \n\t\t\t\t\tShowing <span id=\"numberHits\">${page * hitsPerPage}</span> - <span id=\"numberHits\">${hitsPerPage * nextPage}</span> of <span id=\"numberHits\">${nbHits}</span>\n results found\n\t\t\t\t\t 5852 ` : ''} 5853 ${page === lastPage && nbHits < hitsPerPage ? ` 5854 \n\t\t\t\t\tShowing <span id=\"numberHits\">${pageNumber}</span> - <span id=\"numberHits\">${nbHits}</span> of <span id=\"numberHits\">${nbHits}</span>\n results found\n\t\t\t\t\t 5855 ` : ''} 5856 ${page === lastPage && nbPages != 1 ? ` 5857 \n\t\t\t\t\tShowing <span id=\"numberHits\">${lastPage * hitsPerPage}</span> - <span id=\"numberHits\">${nbHits}</span> of <span id=\"numberHits\">${nbHits}</span>\n results found\n\t\t\t\t\t 5858 ` : ''} 5859 `; 5860 5861 }; 5862 5863 const customStats = connectStats( 5864 renderStats 5865 ); 5866 5867 search.addWidgets([ 5868 customStats({ 5869 container: document.querySelector('#resultsStats'), 5870 }) 5871 ]); 5872 5873 //Result Stats Widget (Bottom) 5874 // in {{processingTimeMS}}ms 5875 search.addWidget( 5876 instantsearch.widgets.stats({ 5877 container: '#resultsStats-bottom', 5878 templates: { 5879 text: "\n\t\t\t\t\t{{#hasNoResults}}No results{{/hasNoResults}}\n\t\t\t\t\t{{#hasOneResult}}<span id=\"numberHits\">1</span> result{{/hasOneResult}}\n\t\t\t\t\t{{#hasManyResults}}<span id=\"numberHits\">{{#helpers.formatNumber}}{{nbHits}}{{/helpers.formatNumber}}</span> results{{/hasManyResults}} found" 5880 } 5881 }) 5882 ); 5883 5884 //Mobile Show Filters Buttom Stats Widget 5885 search.addWidget( 5886 instantsearch.widgets.stats({ 5887 container: '#showFiltersNonLegacy', 5888 templates: { 5889 text: "\n\t\t\t\t\t<div class='dv-srp-search-options-wrapper'><span class='showFilters-label'><i class='fas fa-sort-amount-up'></i> Filter</span> <span class='showFilters-value'>{{#hasNoResults}}(0){{/hasNoResults}}\n\t\t\t\t\t{{#hasOneResult}}(1){{/hasOneResult}}\n\t\t\t\t\t{{#hasManyResults}} ({{#helpers.formatNumber}} {{nbHits}} {{/helpers.formatNumber}}) {{/hasManyResults}}</span></div>" 5890 } 5891 }) 5892 ); 5893 search.addWidget( 5894 instantsearch.widgets.stats({ 5895 container: '#srpFilterResultCount', 5896 templates: { 5897 text: "\n\t\t\t\t\t{{#hasNoResults}}No Results{{/hasNoResults}}\n\t\t\t\t\t{{#hasOneResult}}Show 1 Result{{/hasOneResult}}\n\t\t\t\t\t{{#hasManyResults}}Show {{#helpers.formatNumber}}{{nbHits}}{{/helpers.formatNumber}} Results{{/hasManyResults}}" 5898 } 5899 }) 5900 ); 5901 5902 search.addWidget( 5903 instantsearch.widgets.currentRefinements({ 5904 container: '#filterTags', 5905 transformItems: function transformItems(items) { 5906 items.forEach(function (item) { 5907 if (item.label == "dealer.name") 5908 { 5909 item.label = "Dealer Name"; 5910 }; 5911 5912 if (item.label == "flags.type") 5913 { 5914 item.label = "Type"; 5915 }; 5916 5917 if (item.label == "yr") 5918 { 5919 item.label = "Year"; 5920 }; 5921 5922 if (item.label == "finalPriceRange" || item.label == "FinalPriceRange") 5923 { 5924 item.label = "Price Range"; 5925 }; 5926 5927 if (item.label == "monthlyPaymentRange") 5928 { 5929 item.label = "Monthly Payment"; 5930 } 5931 5932 if (item.label == "genericColor") 5933 { 5934 item.label = "Color"; 5935 }; 5936 5937 if (item.label == "mileageRange") 5938 { 5939 item.label = distanceUnit + " Range"; 5940 }; 5941 5942 if (item.label == "vehiclehistory") 5943 { 5944 item.label = "Vehicle History"; 5945 }; 5946 if (item.label == "finalPriceInt") 5947 { 5948 item.label = "Price Range"; 5949 }; 5950 if(item.label == "transmissionType") 5951 { 5952 item.label = "Transmission"; 5953 } 5954 if (item.label == "rangeSliderPrice") 5955 { 5956 item.label = "Price"; 5957 }; 5958 5959 if (item.label == "modelCategory.lvl1") 5960 { 5961 item.label = "Model"; 5962 item.refinements = item.refinements.map((ref) => ({ ...ref, label: ref.label.split(" > ")[1]})); 5963 } 5964 }); 5965 return items; 5966 } 5967 }) 5968 ); 5969 5970 /** 5971 * Remove previous and next arrows if there's only 1 image in the stack. 5972 * Swiper has this functionality supposedly with watchOverflow: true 5973 * but it was not working when set 5974 * 5975 * @param sliderElm 5976 * @private 5977 */ 5978 function _maybeRemoveSwiperNavigation(sliderElm) { 5979 let imageCount = 0; 5980 const slides = sliderElm.querySelectorAll('.swiper-slide') 5981 5982 if (slides.length <= 1) { 5983 let navElements = sliderElm.querySelectorAll('.swiper-button-next,.swiper-button-prev') 5984 if (navElements.length) {
5985 navElements.forEach( (el) => { 5986 el.remove() 5987 }) 5988 } 5989 } 5990 } 5991 5992 /** 5993 * Limit the amount of images per vehicle card by using the SRP max images option in AG Options 5994 * 5995 * Two fixes, 2026-08-21, hunting the DOM weight behind the keystroke-lag 5996 * reports: 5997 * 5998 * 1. This used to run only when a carousel first scrolled INTO VIEW, so 5999 * every off-screen card kept its full slide stack in the DOM through 6000 * every re-render - the trim only ever helped cards the shopper had 6001 * already reached. It now also runs as part of the render rebuild 6002 * (_buildSRPImageCarousel), so excess slides leave the DOM the moment 6003 * the cards do exist, on every card, every render. Style recalculation 6004 * and layout pay per node whether or not a card is on screen (unless 6005 * content-visibility hides it, which older Safari lacks). 6006 * 6007 * 2. The gate was hard-coded "length > 5", which silently ignored a 6008 * configured cap below five. It now gates on the cap itself. 6009 * 6010 * ?da-slide-cap=N overrides the cap for one request - the way to measure 6011 * "what would a tighter cap buy" on a live dealer without touching their 6012 * setting. 6013 * 6014 * @private 6015 */ 6016 // The ?da-slide-cap=N override, read once per page instead of once per 6017 // trim call - it cannot change while the page lives. 6018 var daSlideCapOverride = parseInt(new URLSearchParams(window.location.search).get('da-slide-cap'), 10); 6019 6020 function _limitSlidesPerVehicleCard(scope) { 6021 // With a scope, trim just that carousel; without one, sweep the page. 6022 let vehicleCardCarousels = scope ? [scope] : document.querySelectorAll('.srp-swiper-vehicles'); 6023 6024 let srpMaxImageLength = 5; 6025 if (daSlideCapOverride > 0) { 6026 srpMaxImageLength = daSlideCapOverride; 6027 } 6028
6029 vehicleCardCarousels.forEach(slider => { 6030 6031 let swiperWrapper = slider.querySelector('.swiper-wrapper'); 6032 let swiperSlides = swiperWrapper.querySelectorAll('.swiper-slide'); 6033 6034 if (swiperSlides.length > srpMaxImageLength && ! swiperWrapper.dataset.maximages) { 6035 6036 for (let i = srpMaxImageLength; i < swiperSlides.length; i++) { 6037 swiperWrapper.removeChild(swiperSlides[i]); 6038 } 6039 6040 swiperWrapper.setAttribute('data-maximages', srpMaxImageLength); 6041 } 6042 }); 6043 } 6044 6045 6046 /** 6047 * Transform the incentives data to be more easily accessible in the template 6048 * 6049 * @private 6050 */ 6051 function transformIncentives(item) { 6052 6053 if (!showConditionalIncentives || !item.conditionalIncentives) return item; 6054 6055 const formatDate = (dateString) => { 6056 if (!dateString) return null; 6057 const date = new Date(dateString); 6058 const month = (date.getMonth() + 1).toString().padStart(2, '0'); 6059 const day = date.getDate().toString().padStart(2, '0'); 6060 const year = date.getFullYear(); 6061 return `${month}-${day}-${year}`; 6062 }; 6063 6064 const mapNexusIncentive = inc => { 6065 if (!inc.value || inc.value === 0) return null; 6066 6067 const incentive = {}; 6068 if (inc.title) incentive.programDescription = inc.title; 6069 if (inc.title) incentive.programName = inc.title; 6070 if (inc.value) incentive.programValue = inc.value; 6071 if (inc.disclaimer) incentive.disclaimerText = inc.disclaimer; 6072 if (inc.effectiveDate) incentive.effectiveDate = formatDate(inc.effectiveDate); 6073 if (inc.expiryDate) incentive.expiryDate = formatDate(inc.expiryDate); 6074 if (inc.description) { 6075 incentive.programRuleList = [{ 6076 description: inc.description 6077 }]; 6078 } 6079 return incentive; 6080 }; 6081 6082 if (isNexusToyota || isNexusAcura || isNexusHonda || isNexusEnabled) { 6083 item.conditionalIncentives = Array.isArray(item.conditionalIncentives) 6084 ? item.conditionalIncentives 6085 .map(mapNexusIncentive) 6086 .filter(incentive => incentive !== null && Object.keys(incentive).length > 0) 6087 : []; 6088 6089 item.incentives = Array.isArray(item.incentives) 6090 ? item.incentives 6091 .map(mapNexusIncentive) 6092 .filter(incentive => incentive !== null && Object.keys(incentive).length > 0) 6093 : []; 6094 } 6095 6096 6097 let priorityIncentives = item.conditionalIncentives.filter(incentive => { 6098 const desc = (incentive.programDescription || '').toString().toLowerCase(); 6099 return desc.includes('military') || desc.includes('college') || 6100 desc.includes('graduate') || desc.includes('first responder'); 6101 }); 6102 6103 let otherIncentives = item.conditionalIncentives.filter(incentive => { 6104 const desc = (incentive.programDescription || '').toString().toLowerCase(); 6105 return !desc.includes('military') && !desc.includes('college') && 6106 !desc.includes('graduate') && !desc.includes('first responder'); 6107 }); 6108 6109 if (priorityIncentives.length === 0) 6110 { 6111 priorityIncentives = item.conditionalIncentives.slice(0, 3); 6112 otherIncentives = otherIncentives.slice(3, otherIncentives.length); 6113 } 6114 6115 const regularIncentives = item.incentives || []; 6116 6117 const remainingIncentivesCount = otherIncentives.length + regularIncentives.length; 6118 6119 item._transformed = { 6120 priorityIncentives, 6121 otherIncentives, 6122 incentives: item.incentives || [], 6123 hasAdditionalIncentives: otherIncentives.length > 0, 6124 remainingIncentivesCount 6125 }; 6126 6127 return item; 6128 } 6129 6130 /** 6131 * Live Swiper instances and the observer that lazily creates them, kept so 6132 * the NEXT render can tear them down. 6133 * 6134 * Swiper attaches its drag-tracking listeners (touchmove, pointermove, 6135 * touchend and friends) to document, per instance - it has to, to keep 6136 * tracking a drag that leaves the container. InstantSearch replaces the 6137 * whole results list on every render, so the containers those instances 6138 * were built on are discarded, but the instances themselves - and their 6139 * document-level listeners - were never destroyed. Measured on the live 6140 * i95 SRP: ~220 document/window listeners added per six-character search 6141 * by swiper-bundle alone, none ever removed, 1,873 net after six searches. 6142 * Every tap on the page then runs the whole accumulated chain, which is 6143 * the path WebKit dispatches slowest. 6144 * 6145 * Same shape for the IntersectionObserver: a fresh one per render, 6146 * observing the new cards, with the old one left alive holding the old 6147 * ones. destroy() + disconnect() at the top of the rebuild is the whole 6148 * fix. Not behind a Theme Options switch for the same reason the delegated 6149 * click handlers were not: removing a leak has no behaviour to opt out of. 6150 */ 6151 var daSwipers = []; 6152 var daSwiperObserver = null; 6153 6154 /** 6155 * Builds the SRP vehicle image carousel on the vehicle card 6156 * 6157 * @private 6158 */ 6159 function _buildSRPImageCarousel() { 6160 // Tear down the previous render's carousels before building this one.
6161 // cleanStyles stays false: the old containers are already detached, 6162 // so restyling them is wasted work. 6163 daSwipers.forEach(function (s) { 6164 try { s.destroy(true, false); } catch (e) { /* already dead is fine */ } 6165 }); 6166 daSwipers.length = 0; 6167 6168 if (daSwiperObserver) { 6169 daSwiperObserver.disconnect(); 6170 } 6171 6172 // Trim excess slides from EVERY card now, not on first intersection - 6173 // see the note on _limitSlidesPerVehicleCard. The in-intersect call 6174 // below stays as a belt for slides added late by anything else. 6175 _limitSlidesPerVehicleCard(); 6176 6177 /** 6178 * b/o: Allow the loading of Swipers when needed and scrolled into view 6179 * using the javascript intersection Observer API 6180 */ 6181 const observerOptions = { 6182 root: null, 6183 rootMargin: '0px', 6184 threshold: 0.2 // when 20% of the element is in view proceed with loading the swiper 6185 }; 6186 6187 function handleIntersect(entries, observer) { 6188 entries.forEach(entry => { 6189 if (entry.isIntersecting) { 6190 // Belt for slides added late by anything else, scoped to 6191 // the one carousel entering view - the unscoped call here 6192 // re-walked every wrapper on the page per intersecting 6193 // card, ~576 wrapper scans across one scrolled 24-card 6194 // page, all duplicating the render-time trim above. 6195 _limitSlidesPerVehicleCard(entry.target); 6196 _maybeRemoveSwiperNavigation(entry.target) 6197 // Initialize Swiper for this container 6198 daSwipers.push(new Swiper(entry.target, { 6199 loop: true, 6200 /** 6201 * Swiper's default touchAngle is 45 degrees, meaning it claims 6202 * any drag within 45 degrees of horizontal as a carousel swipe. 6203 * A thumb flick is rarely perfectly vertical, so on a phone - 6204 * where these cards fill most of the screen - a large share of 6205 * scroll attempts get swallowed by the carousel and the page 6206 * does not move. That reads exactly as "scrolling is stuck". 6207 * 6208 * 25 degrees keeps deliberate horizontal swipes working while 6209 * letting anything steeper scroll the page. 6210 */ 6211 touchAngle: 25, 6212 navigation: { 6213 nextEl: `.swiper-button-next`, 6214 prevEl: `.swiper-button-prev` 6215 } 6216 })); 6217 6218 observer.unobserve(entry.target); 6219 } 6220 }); 6221 } 6222 6223 daSwiperObserver = new IntersectionObserver(handleIntersect, observerOptions); 6224 // Get all of the swipers on the page 6225 let vehicleCardCarousels = document.querySelectorAll('.srp-swiper-vehicles'); 6226
6227 vehicleCardCarousels.forEach(slider => { 6228 daSwiperObserver.observe(slider); 6229 }); 6230 } 6231 6232 /* b/o: Image Aspect Ratio Fix */ 6233 6234 /** 6235 * Calculate a new height based on previous values as well as a new width 6236 * 6237 * @param newWidth the new width of the element to calulcate the height 6238 * @param originalWidth the original width of the item to find aspect ratio 6239 * @param originalHeight the original height of the item to find aspect ratio 6240 * @returns number 6241 */ 6242 function calculateHeight(newWidth, originalWidth, originalHeight) { 6243 const aspectRatio = originalWidth / originalHeight; 6244 const newHeight = newWidth / aspectRatio; 6245 return parseFloat(newHeight.toFixed(1)); 6246 } 6247 6248 /* 6249 * e/o: Image Aspect Ratio Fix 6250 * 6251 * _debounce/_onResize/_constrainImageAspectRatio were removed here. The 6252 * resize handler measured every card with jQuery .width() and then did 6253 * nothing with the result - the two lines that used it had been commented 6254 * out - so all it did was force a synchronous layout per vehicle card on 6255 * every render. It was also called from onRenderHandler, and each call 6256 * added another window resize listener that was never removed. 6257 * 6258 * It was the single largest remaining cost on this page: 2,863ms of forced 6259 * reflow attributed to jQuery's dimension getter while typing one search. 6260 * 6261 * Note: shortcodes/inventory-widget/sc.inventory-widget.php still carries a 6262 * copy of the same dead pattern. 6263 */ 6264 6265 /** 6266 * Render is deliberately split in two. 6267 * 6268 * instantsearch re-renders roughly 1.7 times per keystroke - measured at ten 6269 * renders for six typed characters on the used-vehicles SRP. The tail of this 6270 * handler re-initialises against the freshly built card DOM: Swiper carousels, 6271 * lazy-image observers, SmartPath, and the forms. None of that is incremental 6272 * state - every one rebuilds from the current result set - so running them on 6273 * an intermediate render produces work the next keystroke immediately throws 6274 * away. 6275 * 6276 * onRenderImmediate() is everything that keeps what is on screen truthful: 6277 * result counts, facet container visibility, filter tags. Delaying any of it 6278 * would leave stale numbers on screen while the user types. 6279 * 6280 * onRenderSettled() is everything that re-initialises, trailing-debounced so 6281 * it runs once when typing stops. 250ms rather than the 100ms used for the 6282 * search debounce above, because this work is an order of magnitude heavier 6283 * and none of it is visible state. 6284 * 6285 * Gated on Theme Options -> Performance -> "Defer post-render work on the SRP", 6286 * on by default, with the settle delay configurable there too. 6287 * ?da-render-split=off still runs both halves inline for this request only, so 6288 * support can rule it in or out on a live page without changing the setting. 6289 */ 6290 // Floor 100, matching the spinner: its old min of 0 made daTypingActive() 6291 // always false, which switched render-on-settle off while its switch still 6292 // read on. Below about 100ms neither feature does anything useful anyway. 6293 var DA_SETTLE_MS = 250; 6294 var daSettleTimer = null; 6295 var daRenderSplit = true && new URLSearchParams(window.location.search).get('da-render-split') !== 'off'; 6296 6297 function onRenderHandler() 6298 { 6299 /** 6300 * Cleared before the mid-burst return on purpose: a timer armed by 6301 * the last pre-burst render would otherwise fire DURING the typing 6302 * window the gate below exists to protect - full Swiper rebuild, 6303 * slide trims, a burned reaper generation, all for a render that 6304 * never happened. The settled render that follows the held response 6305 * re-arms it, so nothing is lost by clearing here. 6306 */ 6307 clearTimeout(daSettleTimer); 6308 6309 /** 6310 * Mid-burst, this render can only be loading-state churn: responses 6311 * are being held by the render-on-settle gate, so nothing on screen 6312 * has changed and both halves would run for nothing - measured at 6313 * ~4.7s of main-thread time across one fast-typed word on the 6314 * 4x-throttled bench, all of it between keystrokes the user was 6315 * still typing. The render that matters fires when the held response 6316 * delivers at settle, and typing is quiet by definition then, so 6317 * this guard is never true for it. 6318 */ 6319 if (daRenderOnSettle && daTypingActive()) 6320 { 6321 return; 6322 } 6323 6324 onRenderImmediate(); 6325 6326 if (!daRenderSplit) 6327 { 6328 onRenderSettled(); 6329 return; 6330 } 6331 6332 daSettleTimer = setTimeout(onRenderSettled, DA_SETTLE_MS); 6333 } 6334 6335 function onRenderImmediate() 6336 { 6337 // Update smartpath disclaimer 6338 SmartPathDisclaimer("Sale Pending", ".dv-sp-disclaimer"); 6339 6340 /** 6341 * If no card is in the view, and we are not on mobile, scroll to top. 6342 * 6343 * Delegated off document and namespaced, because onRenderHandler runs on 6344 * every render: the previous .click() bound a fresh handler to every 6345 * refinement label each time, so after N searches a single click ran N 6346 * copies - N viewport measurements and N scroll animations. Binding once 6347 * by delegation also survives the labels being replaced on re-render. 6348 */ 6349 var mobile = window.matchMedia("(max-width: 1024px)"); 6350 $(document) 6351 .off("click.daSrpScrollTop") 6352 .on("click.daSrpScrollTop", ".ais-RefinementList-label", function() { 6353 if (!$('.listing-container').isInViewport() && !mobile.matches) 6354 { 6355 $("html,body").animate({scrollTop:$(".result-wrapper").offset().top - 200},"1000"); 6356 } 6357 }); 6358 6359 // Lazy-image observers and the card carousels are built in 6360 // onRenderSettled() - see the note on the split above. 6361 6362 /** 6363 * Filter panel visibility, by class rather than jQuery show()/hide(). 6364 * 6365 * jQuery hide() is cheap - it just writes display:none - but show() has to 6366 * work out the element's default display, which means getComputedStyle 6367 * against a DOM the render has just dirtied. That is a forced synchronous 6368 * layout per call, and there are twenty calls here. Measured at 686ms for 6369 * 34 elements while typing a single search; hide() over the same run cost
6370 * 1ms. Toggling a class invalidates style without forcing a read. 6371 * 6372 * Equivalent because none of these containers is hidden by a stylesheet - 6373 * every one resolves to display:block from CSS alone, in the parent theme 6374 * and in every child theme - so removing the class lands them exactly 6375 * where show() would have. 6376 */ 6377 var daShow = function (sel) { $(sel).removeClass("da-srp-hidden"); }; 6378 var daHide = function (sel) { $(sel).addClass("da-srp-hidden"); }; 6379 6380 //If a filter list does not have no items in it, be sure it is shown 6381 $(".ais-RefinementList").not(".ais-RefinementList--noRefinement").each(function () { 6382 daShow($(this).parents().eq(1)); 6383 }); 6384 6385 //Hide any filter list that has no items in it 6386 $(".ais-RefinementList--noRefinement").each(function () { 6387 daHide($(this).parents().eq(1)); 6388 }); 6389 6390 if ($("#status-list > div > ul").children().length == 1) 6391 { 6392 daHide(".status-container"); 6393 } 6394 else 6395 { 6396 daShow(".status-container"); 6397 } 6398 6399 if ($("#engine-list > div > ul").children().length == 1) 6400 { 6401 daHide(".engine-container"); 6402 } 6403 else 6404 { 6405 daShow(".engine-container"); 6406 } 6407 6408 //If a make is selected, show the model filter list. 6409 if ($("#make-list ul li").hasClass("ais-RefinementList-item--selected")) 6410 { 6411 daShow(".model-container"); 6412 } 6413 else if ($("#make-list ul li").length > 1) 6414 { 6415 //If a make is not selected, and there is more than one make in the list, hide the model list 6416 daHide(".model-container"); 6417 } 6418 else 6419 { 6420 //Only one make is in the list, so keep model list showing, and hide the make list. 6421 daHide(".make-container"); 6422 } 6423 6424 //If a model is selected, show the trim filter list. 6425 if ($("#model-list ul li").hasClass("ais-RefinementList-item--selected") || $("#modelCategory-list ul li").hasClass("ais-RefinementList-item--selected")) 6426 { 6427 daShow(".trim-container"); 6428 } 6429 else 6430 { 6431 // 6432 daHide(".trim-container"); 6433 } 6434 6435 //If a truck is selected, show the cab/bed filter list. 6436 var child = $(".srp-Truck"); 6437 6438 if ($(child).parent().parent().parent().hasClass("ais-RefinementList-item--selected")) 6439 { 6440 daShow(".bed-container, .cab-container"); 6441 } 6442 else{ 6443 daHide(".bed-container, .cab-container"); 6444 } 6445 6446 //Show bed and cab info if Model name of truck is selected 6447 if($("#body-list div > ul").find("li").length === 1){ 6448 if ($(child).parent().parent().parent().hasClass("ais-RefinementList-item")) 6449 { 6450 daShow(".bed-container, .cab-container"); 6451 } 6452 else{ 6453 daHide(".bed-container, .cab-container"); 6454 } 6455 } 6456 6457 if ($(".fuel-container input[value='Electric']").is(":checked")) 6458 { 6459 $(".range.container").show(); 6460 } 6461 else 6462 { 6463 $(".range-container").hide(); 6464 } 6465 6466 /** 6467 * Change mobile filter bar color when a filter is selected. 6468 * 6469 * Delegated and namespaced for the same reason as the scroll-top handler 6470 * above: .click() bound a fresh handler on every render, so after N renders 6471 * one tap ran N copies. Typing six characters is ten renders. 6472 */ 6473 $(document) 6474 .off("click.daSrpFilterBar") 6475 .on("click.daSrpFilterBar", ".ais-RefinementList-item", function () { 6476 $('.showFiltersNonLegacy').css('background-color', '#000000'); 6477 $('.showFiltersNonLegacy').css('color', '#FFFFFF'); 6478 }); 6479 6480 //Results X of X Text 6481 if(parseInt($("#numberHits").text().replace(/,/g,''), 10) < 24) 6482 { 6483 $('#hitsPage').text($("#numberHits").text()); 6484 } 6485 else if (parseInt($('.ais-Pagination-item--selected > .ais-Pagination-link').attr('aria-label'), 10) > 1) 6486 { 6487 var page = parseInt($('.ais-Pagination-item--selected > .ais-Pagination-link').attr('aria-label'), 10); 6488 var hits = 24 * (page - 1); 6489 $('#hitsStart').text(hits); 6490 var hitsOnPage = parseInt($('#numberHits').text().replace(/,/g,''), 10); 6491 if ((hitsOnPage - (hits)) < 24) 6492 { 6493 $('#hitsPage').text(hitsOnPage); 6494 } 6495 else 6496 { 6497 $('#hitsPage').text((hits) + 24); 6498 } 6499 } 6500 else 6501 { 6502 $("#hitsStart").text(1); 6503 $("#hitsPage").text(24); 6504 } 6505 6506 6507 //Deselection of facets based on hierarchy - delegated, same reasoning as above. 6508 $(document) 6509 .off("click.daSrpFacetHierarchy")
6510 .on("click.daSrpFacetHierarchy", "#make-list ul li, #trim-list ul li, #model-list ul li", function () { 6511 if ($(this).hasClass("ais-RefinementList-item--selected")) { 6512 userInteractedWithFacets = true; 6513 checkAndRemoveFacets(); 6514 } 6515 }); 6516 6517 // $(".srp-integrations-video").click(function() { 6518 // showVideo(event, $(this).attr('data-video-url')); 6519 // }); 6520 6521 //Hide filter tags if there are no current selected filters 6522 if ($("#filterTags .ais-CurrentRefinements-list").has('li').length == 0) 6523 { 6524 $("#filterTags").hide(); 6525 $(".dv-srp-filter-clear-btn").hide(); 6526 $(".dv-srp-filter-tags").hide(); 6527 } 6528 else 6529 { 6530 $("#filterTags").show(); 6531 $(".dv-srp-filter-clear-btn").css('display', 'inline-flex'); 6532 $(".dv-srp-filter-tags").show(); 6533 } 6534 6535 } 6536 6537 /** 6538 * Watch an image for the moment it can first paint. 6539 * 6540 * <img> exposes only load and error, and both fire when the LAST byte arrives. 6541 * naturalWidth, by contrast, becomes non-zero as soon as the browser has parsed 6542 * the image header - well before the download finishes, and the point from which 6543 * it has both dimensions and pixels to draw. That is the closest thing the 6544 * platform gives us to a "started rendering" signal. 6545 * 6546 * It is also exactly when the CSS placeholder box stops being needed: until 6547 * naturalWidth is known the image cannot size itself, and after it can. So the 6548 * same signal clears the spinner and releases the reserved box. 6549 * 6550 * One shared rAF loop rather than a timer per image: a 24-card page has ~120 6551 * images in flight, and this is one callback per frame instead of 120. 6552 */ 6553 var daPainting = []; 6554 var daPaintRaf = null; 6555 6556 function daPaintTick() 6557 { 6558 for (var i = daPainting.length - 1; i >= 0; i--) 6559 { 6560 var watch = daPainting[i]; 6561 6562 if (!watch.img.isConnected || watch.img.naturalWidth > 0) 6563 { 6564 daPainting.splice(i, 1); 6565 watch.done(); 6566 } 6567 } 6568 6569 daPaintRaf = daPainting.length ? requestAnimationFrame(daPaintTick) : null; 6570 } 6571 6572 function daWatchFirstPaint(img, done) 6573 { 6574 daPainting.push({ img: img, done: done }); 6575 6576 if (daPaintRaf === null) 6577 { 6578 daPaintRaf = requestAnimationFrame(daPaintTick); 6579 } 6580 } 6581 6582 /** 6583 * Trailing-debounced half of the render. 6584 * 6585 * Everything here re-initialises against the freshly rendered cards and 6586 * rebuilds from the current result set, so running it once after typing stops 6587 * is equivalent to running it on every intermediate render - minus the work 6588 * that was being discarded. Anything added here must be idempotent. 6589 */ 6590 function onRenderSettled() 6591 { 6592 /** 6593 * A settled render is a listener generation boundary. 6594 * 6595 * The reaper (template/partials/observer-governor.php, on by default) 6596 * tracks document-level listeners bound by vendors that re-decorate the 6597 * cards on every render and never unbind - dg-inline-save-heart being 6598 * the measured one. Telling it a render settled lets it retire the 6599 * batches serving cards that no longer exist. No-op when the partial 6600 * did not emit the reaper. 6601 */ 6602 if (window.DAListenerReaper) 6603 { 6604 window.DAListenerReaper.advance(); 6605 } 6606 6607 //Image lazy loading 6608 var lazyImages = [].slice.call(document.querySelectorAll("img.lazy")); 6609 if ("IntersectionObserver" in window) 6610 { 6611 let lazyImageObserver = new IntersectionObserver(function (entires, observer) { 6612 entires.forEach(function (entry) { 6613 if (entry.isIntersecting) 6614 { 6615 let lazyImage = entry.target; 6616 6617 /** 6618 * Clear the Swiper preloader once the image resolves. 6619 * 6620 * Bound BEFORE src is assigned: a cached image can fire load 6621 * synchronously on assignment, and a listener attached after 6622 * that would never run - leaving the spinner going forever. 6623 * 6624 * Error is handled too. A dead image URL should show the 6625 * browser's own broken state rather than spin indefinitely, 6626 * which at least reads as 'failed' instead of 'still trying'. 6627 */ 6628 let clearPreloader = function () { 6629 let slide = lazyImage.parentElement; 6630 let preloader = slide && slide.querySelector(".swiper-lazy-preloader"); 6631 6632 if (preloader) 6633 { 6634 preloader.remove(); 6635 } 6636 6637 lazyImage.classList.remove("da-img-loading"); 6638 }; 6639 6640 lazyImage.addEventListener("load", clearPreloader, { once: true }); 6641 lazyImage.addEventListener("error", clearPreloader, { once: true }); 6642 6643 lazyImage.src = lazyImage.dataset.src; 6644 6645 /** 6646 * Hand the reserved box from .lazy to .da-img-loading rather 6647 * than dropping it here. 6648 * 6649 * Removing .lazy on its own released the placeholder box the 6650 * instant src was assigned - before a single byte had arrived, 6651 * so the image still had no intrinsic size and the slide 6652 * collapsed back to its 16px alt-text line box. The spinner 6653 * centres on the slide, so it visibly jumped to the top and 6654 * then returned once the photo landed. 6655 * 6656 * .da-img-loading keeps the box but not the visibility:hidden, 6657 * so a progressive image paints as it arrives instead of 6658 * appearing all at once at the end. 6659 */ 6660 lazyImage.classList.remove("lazy"); 6661 lazyImage.classList.add("da-img-loading"); 6662 6663 daWatchFirstPaint(lazyImage, clearPreloader); 6664 6665 lazyImageObserver.unobserve(lazyImage); 6666 } 6667 }); 6668 }); 6669
6670 lazyImages.forEach(function (lazyImage) { 6671 lazyImageObserver.observe(lazyImage); 6672 }); 6673 } 6674 6675 // Initialize vehicle images carousel 6676 _buildSRPImageCarousel(); 6677 6678 6679 //Disable then reenabled the forms. 6680 disableForms(); 6681 6682 initForms(); 6683 6684 6685 //SD Analytics 6686 if (haveSdAnalytics && typeof(sd) !== "undefined") 6687 { 6688 var numberHits = $("#numberHits").text(); 6689 6690 if (numberHits === '0' || numberHits === "") { 6691 6692 if (sdInitialFilterSearchSent) { 6693 sd('dataLayer', { 6694 formType: getSDFormType($(".gform_title", $(".popup_form#srp_form_container")).text(), $(".popup_form#srp_form_container form")[0]), 6695 displayType: 'modal', 6696 events: 'formShown' 6697 }); 6698 sd('send'); 6699 } else { 6700 sdFormShownPending = true; 6701 } 6702 6703 /** 6704 * Delegated and namespaced so re-running this branch replaces the 6705 * handler instead of stacking another one. See sdFormInitHandled 6706 * at the top of the file for what the stacking actually cost. 6707 * 6708 * Bound off document rather than the wrapper because the form markup 6709 * is replaced when the modal is rebuilt, which would strip a handler 6710 * bound directly to the inputs. 6711 */ 6712 sdFormInitHandled = false; 6713 6714 $(document) 6715 .off("click.daSrpSdFormInit") 6716 .on("click.daSrpSdFormInit", ".gform_wrapper input", function () { 6717 if (sdFormInitHandled) 6718 { 6719 return; 6720 } 6721 6722 sendShiftDigitalFormEvent({ 6723 formType: getSDFormType($(".gform_title", $(".popup_form#srp_form_container")).text(), $(".popup_form#srp_form_container form")[0]), 6724 displayType: 'modal', 6725 eventName: 'formInitiation' 6726 }); 6727 6728 sdFormInitHandled = true; 6729 }); 6730 6731 $(document) 6732 .off("input.daSrpSdField change.daSrpSdField") 6733 .on("input.daSrpSdField change.daSrpSdField", ".gform_wrapper input, .gform_wrapper textarea, .gform_wrapper select", function () { 6734 if (shouldTrackShiftDigitalFieldInteraction(this)) 6735 { 6736 sendShiftDigitalFormEvent({ 6737 formType: getSDFormType($(".gform_title", $(".popup_form#srp_form_container")).text(), $(".popup_form#srp_form_container form")[0]), 6738 displayType: 'modal', 6739 eventName: 'formFieldInteraction', 6740 fieldTarget: this 6741 }); 6742 } 6743 }); 6744 } 6745 6746 } 6747 } 6748 6749 6750search.on('render', onRenderHandler); 6751search.on('render', handleSdSrpRenderAnalytics); 6752 6753/** 6754 * Tell governed third parties a render happened, rather than leaving them to 6755 * infer it from thousands of mutation records. See 6756 * template/partials/observer-governor.php - a no-op if that is not loaded. 6757 * 6758 * Second argument stays false: the sentinel wakes anything that rescans the DOM 6759 * on its own, which covers the vendors currently governed. Only pass true for a 6760 * vendor that reads addedNodes to find new content, and verify it there first. 6761 */ 6762search.on('render', function () { 6763 if (window.DAObserverGovernor) { 6764 window.DAObserverGovernor.notify('#srp-results', false); 6765 } 6766}); 6767 6768search.on('render', (() => { 6769 let timer; 6770 return () => { 6771 clearTimeout(timer); 6772 timer = setTimeout(() => { 6773 document.dispatchEvent(new CustomEvent('srp:renderStart')); 6774 // give time for the instantsearch lib to render 6775 requestAnimationFrame(() => { 6776 document.dispatchEvent(new CustomEvent('srp:renderComplete')); 6777 }); 6778 }, 200); 6779 }; 6780})()); 6781 6782searchClient.search([{indexName: indexName, params: {query: '', hitsPerPage: 0, facets: ['exteriorHex']}}]) 6783 .then(function(res) { 6784 var colorAttr = (res.results[0].facets && res.results[0].facets['exteriorHex']) ? 'exteriorHex' : 'genericColor'; 6785 search.addWidget(instantsearch.widgets.refinementList({ 6786 container: '#color-list', 6787 attribute: colorAttr, 6788 operator: 'or', 6789 // Swatches opt out of daFacetLimit - a Show more button would land 6790 // inside the flex grid - but still need a limit over the default 10. 6791 limit: 100000, 6792 templates: { item: "<i style=\"background: {{value}};\" class=far fa-check\"></i>" } 6793 })); 6794 search.start(); 6795 }) 6796 .catch(function() { 6797 search.addWidget(instantsearch.widgets.refinementList({ 6798 container: '#color-list', 6799 attribute: 'genericColor', 6800 operator: 'or', 6801 limit: 100000, 6802 templates: { item: "<i style=\"background: {{value}};\" class=far fa-check\"></i>" } 6803 })); 6804 search.start(); 6805 }); 6806 6807/** 6808 * Mobile keyboard affordances for the search box. 6809 * 6810 * InstantSearch renders the field itself, so these are applied after start(). 6811 * Two problems on a phone: the Return key had no clear meaning, and once the 6812 * keyboard was up there was no obvious way down - the field sits near the top 6813 * of the page with no surrounding tappable dead space. 6814 * 6815 * - enterkeyhint labels the Return key "Search" on iOS and Android. 6816 * - Submitting blurs, so Return actually closes the keyboard. InstantSearch 6817 * already suppresses the form's default submit, so nothing navigates. 6818 * - Scrolling the results blurs too. This is the usual mobile search pattern: 6819 * once you scroll, you are reading results rather than typing. Gated on a 6820 * real scroll distance so a stray pixel of movement does not dismiss it, 6821 * and on touch input so desktop is unaffected. 6822 */ 6823function daSetupSearchBoxKeyboard() { 6824 var searchInput = document.querySelector('#searchbox .ais-SearchBox-input'); 6825 6826 // Depending on the branch above, start() happens inside a promise, so the 6827 // field may not exist yet. Bound off 'render' and guarded, rather than run 6828 // inline - an earlier inline version silently did nothing for exactly this 6829 // reason, and looked like it worked because InstantSearch blurs on submit 6830 // by itself. 6831 if (!searchInput || searchInput.dataset.daKeyboardReady) { 6832 return; 6833 } 6834 6835 searchInput.dataset.daKeyboardReady = '1'; 6836 searchInput.setAttribute('enterkeyhint', 'search'); 6837 6838 if (window.matchMedia('(hover: none)').matches) { 6839 // Anchor on focus, not on the first scroll event. Anchoring on the first 6840 // event measures the delta from wherever that event already landed, which 6841 // is zero for anything but a slow drag. 6842 var scrollAnchor = null; 6843 6844 /** 6845 * Only a scroll the user actually drove should dismiss the keyboard. 6846 * 6847 * The first version of this compared scroll distance alone, which broke 6848 * tapping the field on iOS whenever the page was scrolled even slightly. 6849 * Focusing an input on iOS makes the BROWSER scroll: the keyboard shrinks 6850 * the visual viewport, and a collapsed address bar expands. Both move 6851 * window.scrollY well past this threshold within a frame or two of focus, 6852 * so the handler blurred the field the moment it was tapped. It worked at 6853 * the very top of the page only because there was nothing to adjust. 6854 * 6855 * A drag produces touchmove. Browser-driven scroll does not, so requiring 6856 * a recent touchmove separates the two. Anything else re-anchors instead
6857 * of dismissing, which also covers the keyboard opening mid-session. 6858 */ 6859 var lastTouchMove = 0; 6860 6861 document.addEventListener('touchmove', function () { 6862 lastTouchMove = Date.now(); 6863 }, { passive: true }); 6864 6865 searchInput.addEventListener('focus', function () { 6866 scrollAnchor = window.scrollY; 6867 }); 6868 6869 searchInput.addEventListener('blur', function () { 6870 scrollAnchor = null; 6871 }); 6872 6873 // Keyboard show/hide relays out the page. Re-anchor rather than reading it 6874 // as the shopper scrolling away from the field. 6875 if (window.visualViewport) { 6876 window.visualViewport.addEventListener('resize', function () { 6877 if (scrollAnchor !== null) { 6878 scrollAnchor = window.scrollY; 6879 } 6880 }); 6881 } 6882 6883 window.addEventListener('scroll', function () { 6884 if (scrollAnchor === null || document.activeElement !== searchInput) { 6885 return; 6886 } 6887 6888 if (Date.now() - lastTouchMove > 500) { 6889 scrollAnchor = window.scrollY; 6890 return; 6891 } 6892 6893 if (Math.abs(window.scrollY - scrollAnchor) > 40) { 6894 searchInput.blur(); 6895 } 6896 }, { passive: true }); 6897 } 6898} 6899 6900search.on('render', daSetupSearchBoxKeyboard); 6901daSetupSearchBoxKeyboard(); 6902 6903$.fn.isInViewport = function() { 6904 var elementTop = $(this).offset().top; 6905 var elementBottom = elementTop + $(this).outerHeight(); 6906 6907 var viewportTop = $(window).scrollTop(); 6908 var viewportBottom = viewportTop + $(window).height(); 6909 6910 return elementBottom > viewportTop && elementTop < viewportBottom; 6911}; 6912 6913/** 6914 * Reads the current InstantSearch helper state for the supported Shift Digital 6915 * filterSearch fields and returns a pipe-delimited value string. 6916 * 6917 * We intentionally read from the live helper refinements instead of the URL 6918 * because the router can lag one render behind on select/deselect interactions. 6919 * 6920 * @param {object} state 6921 * @param {string[]} keys 6922 * @returns {string} 6923 */ 6924function getSdStateFilterValues(state, keys) { 6925 var refinementSources = [ 6926 state.disjunctiveFacetsRefinements || {}, 6927 state.facetsRefinements || {}, 6928 state.hierarchicalFacetsRefinements || {} 6929 ]; 6930 6931 for (var sourceIndex = 0; sourceIndex < refinementSources.length; sourceIndex++) { 6932 var source = refinementSources[sourceIndex]; 6933 6934 for (var keyIndex = 0; keyIndex < keys.length; keyIndex++) { 6935 var key = keys[keyIndex]; 6936 var values = source[key]; 6937 6938 if (!values) { 6939 continue; 6940 } 6941 6942 if (!Array.isArray(values)) { 6943 values = [values]; 6944 } 6945 6946 values = values.filter(Boolean); 6947 6948 if (values.length > 0) { 6949 return values.join("|"); 6950 } 6951 } 6952 } 6953 6954 return "All"; 6955} 6956 6957/** 6958 * Reads a numeric range slider value from the InstantSearch helper state, 6959 * falling back to the facet stats (full inventory bounds) when the user 6960 * has not moved the slider. 6961 * 6962 * @param {object} helperState search.helper.state 6963 * @param {string} attribute The Algolia attribute name (e.g. 'rangeSliderPrice', 'yr') 6964 * @param {function|null} formatter Optional formatter for min/max values 6965 * @returns {string} 6966 */ 6967function getSdNumericRangeValue(helperState, attribute, formatter) { 6968 var refinements = (helperState.numericRefinements || {})[attribute] || {}; 6969 var stats = {}; 6970 6971 if (search.helper && search.helper.lastResults && search.helper.lastResults.disjunctiveFacets) { 6972 var facet = search.helper.lastResults.disjunctiveFacets.find(function(f) { return f.name === attribute; }); 6973 if (facet && facet.stats) { 6974 stats = facet.stats; 6975 } 6976 } 6977 6978 var min = refinements[">="] ? refinements[">="][0] : (stats.min != null ? stats.min : null); 6979 var max = refinements["<="] ? refinements["<="][0] : (stats.max != null ? stats.max : null); 6980 6981 if (min === null && max === null) { 6982 return "All"; 6983 } 6984 6985 if (formatter) { 6986 return formatter(min) + " - " + formatter(max); 6987 } 6988 6989 return min + " - " + max; 6990} 6991 6992/** 6993 * Returns the year for the Shift Digital filterSearch payload. 6994 * 6995 * Shift Digital wants a single year only when the shopper has actually narrowed 6996 * to one. Every "more than one year is showing" case reports "All" - including a 6997 * year slider spanning a range, which previously reported a shared "2015 - 2026" 6998 * string that read as two values in one prop. 6999 * 7000 * @param {object} helperState search.helper.state 7001 * @returns {string} 7002 */ 7003function getSdYearValue(helperState) { 7004 var yearFacetSelection = getSdStateFilterValues(helperState, ["year", "yr"]); 7005 7006 if (yearFacetSelection !== "All") { 7007 return yearFacetSelection.indexOf("|") === -1 ? yearFacetSelection : "All"; 7008 } 7009 7010 // Only a slider collapsed onto one year counts as picking a year. 7011 var sliderRefinements = (helperState.numericRefinements || {})["yr"] || {}; 7012 var min = sliderRefinements[">="] ? sliderRefinements[">="][0] : null; 7013 var max = sliderRefinements["<="] ? sliderRefinements["<="][0] : null; 7014 7015 if (min !== null && max !== null && Number(min) === Number(max)) { 7016 return String(Math.round(min)); 7017 } 7018 7019 return "All"; 7020} 7021 7022/** 7023 * Returns the min and max price as plain integers for the Shift Digital 7024 * filterSearch payload. Checks finalPriceRange bucket selections first, 7025 * then falls back to the rangeSliderPrice numeric refinements, then to 7026 * the full facet stats (inventory bounds) when no filter is active. 7027 * 7028 * @returns {{min: number|null, max: number|null}} 7029 */ 7030function getSdPriceBounds(helperState) { 7031 var refinementSources = [ 7032 helperState.disjunctiveFacetsRefinements || {}, 7033 helperState.facetsRefinements || {} 7034 ]; 7035 7036 for (var i = 0; i < refinementSources.length; i++) { 7037 var buckets = refinementSources[i]["finalPriceRange"]; 7038 if (buckets && buckets.length > 0) { 7039 var vals = Array.isArray(buckets) ? buckets : [buckets]; 7040 var mins = []; 7041 var maxes = []; 7042
7043 vals.forEach(function(bucket) { 7044 var s = bucket.replace(/[$,]/g, ''); 7045 var below = s.match(/^(\d+)\s+and\s+Below$/i); 7046 var above = s.match(/^(\d+)\s+and\s+Up$/i); 7047 var range = s.match(/^(\d+)\s+-\s+(\d+)$/); 7048 7049 if (below) { mins.push(0); maxes.push(parseInt(below[1], 10)); } 7050 else if (above) { mins.push(parseInt(above[1], 10)); } 7051 else if (range) { mins.push(parseInt(range[1], 10)); maxes.push(parseInt(range[2], 10)); } 7052 }); 7053 7054 if (mins.length > 0 || maxes.length > 0) { 7055 return { 7056 min: mins.length > 0 ? Math.min.apply(null, mins) : null, 7057 max: maxes.length > 0 ? Math.max.apply(null, maxes) : null 7058 }; 7059 } 7060 } 7061 } 7062 7063 var sliderRefinements = (helperState.numericRefinements || {})["rangeSliderPrice"] || {}; 7064 var stats = {}; 7065 7066 if (search.helper && search.helper.lastResults && search.helper.lastResults.disjunctiveFacets) { 7067 var priceFacet = search.helper.lastResults.disjunctiveFacets.find(function(f) { 7068 return f.name === "rangeSliderPrice"; 7069 }); 7070 if (priceFacet && priceFacet.stats) { 7071 stats = priceFacet.stats; 7072 } 7073 } 7074 7075 var min = sliderRefinements[">="] ? sliderRefinements[">="][0] : (stats.min != null ? stats.min : null); 7076 var max = sliderRefinements["<="] ? sliderRefinements["<="][0] : (stats.max != null ? stats.max : null); 7077 7078 return { 7079 min: min !== null ? Math.round(min) : null, 7080 max: max !== null ? Math.round(max) : null 7081 }; 7082} 7083 7084/** 7085 * Builds the Shift Digital filterSearch payload from the current InstantSearch 7086 * helper state. 7087 * 7088 * This keeps supported facet values in sync with the interaction that triggered 7089 * the render instead of relying on URL parameters that may still reflect the 7090 * previous refinement state. 7091 * 7092 * @returns {{status: string, minPrice: number|null, maxPrice: number|null, year: string, mileage: string, make: string, model: string, color: string, trim: string, bodyStyle: string, features: string, drivetrain: string}} 7093 */ 7094function buildSdFilterSearchPayload() { 7095 var helperState = search.helper && search.helper.state ? search.helper.state : {}; 7096 var status = "All"; 7097 var certificationRefinements = getSdStateFilterValues(helperState, ["flags.type"]); 7098 7099 if (certificationRefinements !== "All") { 7100 var selectedCount = certificationRefinements.split("|").length; 7101 var totalCount = 0; 7102 7103 if (search.helper && search.helper.lastResults) { 7104 var facetValues = search.helper.lastResults.getFacetValues("flags.type"); 7105 if (Array.isArray(facetValues)) { 7106 totalCount = facetValues.length; 7107 } 7108 } 7109 7110 if (totalCount > 0 && selectedCount >= totalCount) { 7111 status = "Mixed"; 7112 } else { 7113 status = "CPO"; 7114 } 7115 } else if (srpCondition) { 7116 status = srpCondition; 7117 } 7118 7119 /** 7120 * Handle price, year, and mileage as special cases since they can be either a range facet refinement or a numeric slider refinement depending on how the user has interacted with the filters. 7121 */ 7122 var priceBounds = getSdPriceBounds(helperState); 7123 var year = getSdYearValue(helperState); 7124 7125 var mileageRangeSelection = getSdStateFilterValues(helperState, ["mileageRange"]); 7126 var mileage = mileageRangeSelection !== "All" ? mileageRangeSelection : getSdNumericRangeValue(helperState, "mileage", function(v) { return Number(v).toLocaleString(); }); 7127 7128 return { 7129 status: status, 7130 minPrice: priceBounds.min, 7131 maxPrice: priceBounds.max, 7132 year: year, 7133 mileage: mileage, 7134 make: getSdStateFilterValues(helperState, ["make"]), 7135 model: getSdStateFilterValues(helperState, ["model"]), 7136 color: getSdStateFilterValues(helperState, ["genericColor", "generic_color"]), 7137 trim: getSdStateFilterValues(helperState, ["trim"]), 7138 bodyStyle: getSdStateFilterValues(helperState, ["body"]), 7139 features: getSdStateFilterValues(helperState, ["features"]), 7140 drivetrain: getSdStateFilterValues(helperState, ["drivetrain"]) 7141 }; 7142} 7143 7144/** 7145 * Creates a stable signature for the current search helper state so we can 7146 * detect real SRP refinement changes across renders. 7147 * 7148 * This is used only as change detection. The actual Shift Digital payload is 7149 * still built separately from the supported helper refinements. 7150 * 7151 * @returns {string} 7152 */ 7153function buildSdSearchStateSignature() { 7154 if (!search.helper || !search.helper.state) { 7155 return JSON.stringify({ 7156 query: "", 7157 disjunctiveFacetsRefinements: {}, 7158 facetsRefinements: {}, 7159 hierarchicalFacetsRefinements: {}, 7160 numericRefinements: {} 7161 }); 7162 } 7163 7164 return JSON.stringify({ 7165 query: search.helper.state.query || "", 7166 disjunctiveFacetsRefinements: search.helper.state.disjunctiveFacetsRefinements || {}, 7167 facetsRefinements: search.helper.state.facetsRefinements || {}, 7168 hierarchicalFacetsRefinements: search.helper.state.hierarchicalFacetsRefinements || {}, 7169 numericRefinements: search.helper.state.numericRefinements || {} 7170 }); 7171} 7172 7173/**
7174 * Builds a signature of only the facet/numeric refinement state (excludes 7175 * the search query) so facet-only changes can be distinguished from 7176 * query-only changes. 7177 * 7178 * @returns {string} 7179 */ 7180function buildSdFacetStateSignature() { 7181 if (!search.helper || !search.helper.state) { 7182 return JSON.stringify({ 7183 disjunctiveFacetsRefinements: {}, 7184 facetsRefinements: {}, 7185 hierarchicalFacetsRefinements: {}, 7186 numericRefinements: {} 7187 }); 7188 } 7189 7190 return JSON.stringify({ 7191 disjunctiveFacetsRefinements: search.helper.state.disjunctiveFacetsRefinements || {}, 7192 facetsRefinements: search.helper.state.facetsRefinements || {}, 7193 hierarchicalFacetsRefinements: search.helper.state.hierarchicalFacetsRefinements || {}, 7194 numericRefinements: search.helper.state.numericRefinements || {} 7195 }); 7196} 7197 7198/** 7199 * Sends the SRP pageview and filterSearch payload to Shift Digital for the 7200 * current search state. 7201 * 7202 * @returns {void} 7203 */ 7204function sendSdSrpPageViewAndFilterSearch() { 7205 sd('dataLayer', { 7206 pageType: 'Vehicle Listing', 7207 websiteTier: 'Tier 3', 7208 pageBrand: 'Toyota', 7209 sessionId: (window.daSessionId ? window.daSessionId() : ''), 7210 language: 'en', //note(ethan): need to change this to allow translations 7211 trafficType: 'Organic Search', 7212 dealerZipCode: '15108', 7213 dealerState: 'PA', 7214 dealerCity: 'Moon Township', 7215 dealerName: 'Brewer Airport Toyota', 7216 dealerTda: 'CAT10', 7217 siteTechnologyVersion: '2.0031', 7218 userZipCode: '', //note(ethan): add user location 7219 userCity: '', 7220 userState: '' 7221 }); 7222 sd('send', 'pageview'); 7223 7224 sd('dataLayer', { 7225 countSearchResults: $("#numberHits").text(), 7226 filterSearch: buildSdFilterSearchPayload(), 7227 events: 'filterSearch' 7228 }); 7229 sd('send'); 7230} 7231 7232/** 7233 * Sends the pageview and filterSearch owed to a query-only search. 7234 * 7235 * Called straight after typedSearch so Shift Digital sees 7236 * typedSearch -> pageview -> filterSearch, and off a timer when the query 7237 * changed without anything being typed. 7238 * 7239 * @returns {void} 7240 */ 7241function flushSdQueryAnalytics() { 7242 clearTimeout(sdQueryAnalyticsTimer); 7243 sdQueryAnalyticsTimer = null; 7244 7245 if (!sdQueryAnalyticsPending) { 7246 return; 7247 } 7248 7249 sdQueryAnalyticsPending = false; 7250 sendSdSrpPageViewAndFilterSearch(); 7251} 7252 7253/** 7254 * Watches InstantSearch render cycles and dispatches Shift Digital analytics 7255 * only when the underlying helper state has actually changed. 7256 * 7257 * The helper state signature prevents duplicate sends on unrelated renders 7258 * while still allowing select and deselect facet actions to be tracked. 7259 * 7260 * Facet changes send immediately. Query changes defer to flushSdQueryAnalytics 7261 * so typedSearch keeps its place at the front of the sequence. 7262 * 7263 * @returns {void} 7264 */ 7265function handleSdSrpRenderAnalytics() { 7266 if (!(haveSdAnalytics && typeof(sd) !== "undefined")) { 7267 return; 7268 } 7269 7270 if (!search.helper || !search.helper.lastResults) { 7271 return; 7272 } 7273 7274 var nextSdSearchStateSignature = buildSdSearchStateSignature(); 7275 var nextSdFacetStateSignature = buildSdFacetStateSignature(); 7276 var nextSdQuery = search.helper.state.query || ""; 7277 7278 if (lastSdSearchStateSignature === null) { 7279 lastSdSearchStateSignature = nextSdSearchStateSignature; 7280 lastSdFacetStateSignature = nextSdFacetStateSignature; 7281 lastSdQuery = nextSdQuery; 7282 return; 7283 } 7284 7285 var facetsChanged = nextSdFacetStateSignature !== lastSdFacetStateSignature; 7286 var queryChanged = nextSdQuery !== lastSdQuery; 7287 lastSdSearchStateSignature = nextSdSearchStateSignature; 7288 lastSdFacetStateSignature = nextSdFacetStateSignature; 7289 lastSdQuery = nextSdQuery; 7290 7291 if (facetsChanged) { 7292 // The facet send carries the current query too, so one send covers both. 7293 sdQueryAnalyticsPending = false; 7294 clearTimeout(sdQueryAnalyticsTimer); 7295 sdQueryAnalyticsTimer = null; 7296 7297 var deferAnalyticsUpdate = window.requestIdleCallback || function(callback) { 7298 setTimeout(callback, 0); 7299 }; 7300 7301 deferAnalyticsUpdate(function () { 7302 sendSdSrpPageViewAndFilterSearch(); 7303 }); 7304 7305 return; 7306 } 7307 7308 if (queryChanged) { 7309 sdQueryAnalyticsPending = true; 7310 clearTimeout(sdQueryAnalyticsTimer); 7311 sdQueryAnalyticsTimer = setTimeout(flushSdQueryAnalytics, 1200); 7312 } 7313} 7314 7315$(document).ready(function () { 7316 7317 // srp filter toggle buttons 7318 $(".srp-panel-toggle > span").click(function () { 7319 $(this).siblings("div").slideToggle("slow"); 7320 $(this).find("a > i").toggleClass("chevron-flip"); 7321 }); 7322 7323 $(document).on("input", ".ais-SearchBox-input", function() { 7324 clearTimeout(searchChangedTimer); 7325 searchChangedTimer = setTimeout(function() { 7326 if (haveSdAnalytics && typeof(sd) !== "undefined") { 7327 sd('dataLayer', { 7328 typedSearchContent: $(".ais-SearchBox-input").val().replace(/ /g, "|"), 7329 events: 'typedSearch' 7330 }); 7331 sd('send'); 7332 7333 // typedSearch is out the door, so the query's pageview and 7334 // filterSearch can follow it. 7335 flushSdQueryAnalytics(); 7336 } 7337 }, 800); 7338 }); 7339 7340 $(".showFiltersNonLegacy").click(function() { 7341 toggleFilters(); 7342 }); 7343 7344 $(".srp-filters-close-btn, .filterResultCount, .srpFilterResultCount").click(function() { 7345 toggleFilters(); 7346 }); 7347 7348 //Close mobile filters when a search is entered 7349 $('input[type=search]').on('search', function () { 7350 if ($('.side-panel-container').hasClass('mobileFilters')) 7351 { 7352 toggleFilters(); 7353 } 7354 }); 7355 7356 // Clear filters and set the filters bar back to the normal color 7357 $("#dv-srp-clear-filters, #srp-filters-reset-btn").click(function() { 7358 search.helper.setQuery('').search(); 7359 }); 7360 7361 // Clear Search bar 7362 $("#clearSearchResults").click(function() { 7363 document.querySelector('#clearSearchResults').style.display = "none"; 7364 search.helper.setQuery('').search(); 7365 }); 7366 7367 var placeholderText = [ 7368 ]; 7369 7370 var placeholderTextVoice = [ 7371 "Listening, Say \"Show Me a Red " + new Date().getFullYear() + " Toyota with Navigation\"", 7372 ]; 7373 7374 //Change mobile filters bar when text is typed in the searchbar 7375 $('.ais-SearchBox-input').change(function () { 7376 $('.showFiltersNonLegacy').css('background-color', '#000000'); 7377 $('.showFiltersNonLegacy').css('color', '#FFFFFF'); 7378 }) 7379 7380 //Make vehicle cars click into the VDP 7381 $(document.body).on("click", ".car-title, .srp-slider-buttons, .srp-click-image", function (e) { 7382 var vehicle_url = $(this).parents(".listing-container").attr("data-url") 7383 if (vehicle_url) { 7384 window.location = vehicle_url; 7385 } else { 7386 console.warn("`vehicle_url` was not found on the .listing-container"); 7387 } 7388 }); 7389 7390 7391 $('.year-container > div').slideToggle("slow"); 7392 $(".year-container > span > a > i").toggleClass("chevron-flip"); 7393 7394 7395 $('.pricerange-container > div').slideToggle("slow"); 7396 $(".pricerange-container > span > a > i").toggleClass("chevron-flip"); 7397 7398 7399 $('.mileagerange-container > div').slideToggle("slow"); 7400 $(".mileagerange-container > span > a > i").toggleClass("chevron-flip"); 7401 7402 7403 $('.body-container > div').slideToggle("slow"); 7404 $(".body-container > span > a > i").toggleClass("chevron-flip"); 7405 7406 7407 $('.fuel-container > div').slideToggle("slow"); 7408 $(".fuel-container > span > a > i").toggleClass("chevron-flip"); 7409 7410 7411 $('.transmission-container > div').slideToggle("slow"); 7412 $(".transmission-container > span > a > i").toggleClass("chevron-flip"); 7413 7414 7415 $('.color-container > div').slideToggle("slow"); 7416 $(".color-container > span > a > i").toggleClass("chevron-flip"); 7417 7418 7419 $('.drivetrain-container > div').slideToggle("slow"); 7420 $(".drivetrain-container > span > a > i").toggleClass("chevron-flip"); 7421 7422 7423 $('.location-container > div').slideToggle("slow"); 7424 $(".location-container > span > a > i").toggleClass("chevron-flip"); 7425 7426 7427 $('.mpg-hway-container > div').slideToggle("slow"); 7428 $(".mpg-hway-container > span > a > i").toggleClass("chevron-flip"); 7429 7430 7431 $('.mpg-city-container > div').slideToggle("slow"); 7432 $(".mpg-city-container > span > a > i").toggleClass("chevron-flip"); 7433 7434 7435 $('.features-container > div').slideToggle("slow"); 7436 $(".features-container > span > a > i").toggleClass("chevron-flip"); 7437 7438 7439 $('.fa-microphone').toggleClass('fal fas fa-microphone fa-search'); 7440 //$('.ais-SearchBox-input').placeholderTypewriter({text: placeholderText}); 7441 7442 if (haveSdAnalytics && typeof(sd) !== "undefined") 7443 { 7444 // header.php has already sent the pageview for this load, so this 7445 // keeps the pageview -> filterSearch order Shift Digital asked for. 7446 sd('dataLayer', { 7447 countSearchResults: $("#numberHits").text(), 7448 filterSearch: buildSdFilterSearchPayload(), 7449 events: 'filterSearch' 7450 }); 7451 sd('send'); 7452 7453 sdInitialFilterSearchSent = true; 7454 7455 if (sdFormShownPending) { 7456 sd('dataLayer', { 7457 formType: getSDFormType($(".gform_title", $(".popup_form#srp_form_container")).text(), $(".popup_form#srp_form_container form")[0]), 7458 displayType: 'modal', 7459 events: 'formShown' 7460 }); 7461 sd('send'); 7462 sdFormShownPending = false;
7463 } 7464 } 7465 }); 7466 7467 function voiceSearch(term) 7468 { 7469 term = term.toLowerCase(); 7470 let searchBox = document.querySelector('.ais-SearchBox-input'); 7471 searchBox.value = term; 7472 searchBox.dispatchEvent(new Event('input')); 7473 } 7474</script>
vendor: 1 bytes, line 7474
7474
7475<script> 7476 7477var popupFormCalled = false; 7478var currentVehicleData = null; 7479var currentFormType = null; 7480 7481 //Open the form 7482 function popupForm(vin) { 7483 7484 if (popupFormCalled) { 7485 console.log('Prevented duplicate popupForm call'); 7486 return; 7487 } 7488 7489 popupFormCalled = true; 7490 setTimeout(function() { 7491 popupFormCalled = false; 7492 }, 500); 7493 7494 $(".cd-panel").addClass("cd-panel--is-visible"); 7495 $("body").delay(300).queue(function (next) { 7496 $(this).addClass("cd-panel-no-scroll"); 7497 next(); 7498 }); 7499 $(".right-half, #nav-icon1, #nav-icon2, #nav-icon3, #nav-icon4").delay(300).queue(function (next) { 7500 $(this).addClass("cd-panel-subheader-no-scroll"); 7501 next(); 7502 }); 7503 7504 if (vin === "payment_calculator_container") { 7505 $(".popup_form#srp_form_container").hide(); 7506 $("#payment_calculator_container").show(); 7507 calculate(); 7508 var selected_form_title = $(".gform_title", selected_form).text(); 7509 $("#popup_left_title").html(selected_form_title); 7510 } else { 7511 var selected_form = $(".popup_form#srp_form_container"); 7512 var selected_form_title = $(".gform_title", selected_form).text(); 7513 $("#popup_left_title").html(selected_form_title); 7514 } 7515 7516 if (haveSdAnalytics && typeof(sd) !== "undefined" && vin !== 'payment_calculator_container') 7517 { 7518 window.currentVin = vin; 7519 7520 $.post("/app/themes/dv-framework/ajax/sdformvehicle.php", {vin: vin}, function (data) { 7521 7522 setTimeout(function() { 7523 7524 sd('dataLayer', { 7525 formType: getSDFormType($(".gform_title", $(".popup_form#srp_form_container")).text()), 7526 displayType: 'modal', 7527 events: 'formShown' 7528 }); 7529 sd('send'); 7530 7531 currentVehicleData = JSON.parse(data); 7532 currentFormType = getSDFormType($(".gform_title", $(".popup_form#srp_form_container")).text(), $(".popup_form#srp_form_container form")[0]) 7533 7534 var formInitHandled = false; 7535 $('.gform_wrapper input').click(function() { 7536 if (!formInitHandled) 7537 { 7538 sendShiftDigitalFormEvent({ 7539 formType: getSDFormType($(".gform_title", $(".popup_form#srp_form_container")).text(), $(".popup_form#srp_form_container form")[0]), 7540 displayType: 'modal', 7541 eventName: 'formInitiation' 7542 }); 7543 7544 formInitHandled = true; 7545 } 7546 }); 7547 $('.gform_wrapper input, .gform_wrapper textarea, .gform_wrapper select').on('input change', function() { 7548 if (shouldTrackShiftDigitalFieldInteraction(this)) 7549 { 7550 sendShiftDigitalFormEvent({ 7551 formType: getSDFormType($(".gform_title", $(".popup_form#srp_form_container")).text(), $(".popup_form#srp_form_container form")[0]), 7552 displayType: 'modal', 7553 eventName: 'formFieldInteraction', 7554 fieldTarget: this 7555 }); 7556 } 7557 }); 7558 }, 1000); 7559 }); 7560 } 7561 } 7562 7563 //Non confirmation page form submission for SD Analytics 7564 jQuery(document).ready(function(){ 7565 jQuery(document).on("gform_confirmation_loaded.vehicleForm", function(event, formId){ 7566 7567 if (haveSdAnalytics && typeof(sd) !== "undefined" && currentVehicleData) { 7568 7569 sd('dataLayer', { 7570 formType: currentFormType, 7571 displayType: 'modal', 7572 events: 'formSubmission', 7573 formVehicle: currentVehicleData, 7574 leadType: 'lead' 7575 }); 7576 sd('send'); 7577 7578 currentVehicleData = null; 7579 currentFormType = null; 7580 } 7581 }); 7582 }); 7583 7584 //Incentives Slide out 7585 // Wait for element to become available 7586 function waitForElement(selector) { 7587 return new Promise(resolve => { 7588 if (document.querySelector(selector)) { 7589 return resolve(document.querySelector(selector)); 7590 } 7591 7592 console.log("waiting for element"); 7593 7594 const observer = new MutationObserver(mutations => { 7595 if (document.querySelector(selector)) { 7596 observer.disconnect(); 7597 resolve(document.querySelector(selector)); 7598 } 7599 }); 7600 7601 // If you get "parameter 1 is not of type 'Node'" error, see https://stackoverflow.com/a/77855838/492336 7602 observer.observe(document.body, { 7603 childList: true, 7604 subtree: true 7605 }); 7606 }); 7607 } 7608 7609 function initForms() 7610 { 7611 disableForms(); 7612 7613 $('.srp_cta_1').click(function () { 7614 var vin = $(this).attr("data-vehicle-vin"); 7615 $("#popup_left_dealer").html($(this).attr("data-dealer-name")); 7616 $("#popup_left_price").html($(this).attr("data-vehicle-price")); 7617 $("#popup_left_stock_number").html($(this).attr("data-vehicle-stock-number")); 7618 $("#popup_left_vin").html($(this).attr("data-vehicle-vin")); 7619 $("#popup_left_vehicle_title").html($(".vehicle_title_form", $(this)).text()); 7620 getCTAForm($(this).attr("data-vehicle-id"), $(this).attr("data-vehicle-vin"), $(this).attr("data-vehicle-discount"), 1); 7621 popupForm(vin); 7622 event.stopPropagation(); 7623 }); 7624 $('.srp_cta_2').click(function () { 7625 var vin = $(this).attr("data-vehicle-vin"); 7626 $("#popup_left_dealer").html($(this).attr("data-dealer-name")); 7627 $("#popup_left_price").html($(this).attr("data-vehicle-price")); 7628 $("#popup_left_stock_number").html($(this).attr("data-vehicle-stock-number")); 7629 $("#popup_left_vin").html($(this).attr("data-vehicle-vin")); 7630 $("#popup_left_vehicle_title").html($(".vehicle_title_form", $(this)).text()); 7631 getCTAForm($(this).attr("data-vehicle-id"), $(this).attr("data-vehicle-vin"), $(this).attr("data-vehicle-discount"), 27); 7632 popupForm(vin); 7633 event.stopPropagation(); 7634 }); 7635 //slideout with all incentives for srp 7636 function popupIncentivesBox(vin){ 7637 $(".cd-panel").addClass("cd-panel--is-visible"); 7638 $("body").delay(300).queue(function (next) { 7639 $(this).addClass("cd-panel-no-scroll"); 7640 next(); 7641 }); 7642 $(".right-half, #nav-icon1, #nav-icon2, #nav-icon3, #nav-icon4").delay(300).queue(function (next) { 7643 $(this).addClass("cd-panel-subheader-no-scroll"); 7644 next(); 7645 }); 7646 var selected_form = $(".popup_form#srp_form_container"); 7647 var selected_form_title = $(".gform_title", selected_form).text(); 7648 $("#popup_left_title").html(selected_form_title); 7649 } 7650 7651 //Open incentives form from incentives list 7652 function popupIncentives(containerName, incentiveName, incentiveValue, formValue, vehicleData) { 7653 7654 $('.vehicle-incentives').addClass('hidden'); 7655 7656 waitForElement('.popup_form#srp_incentives_form div').then((elm) => { 7657 $('#srp_incentives_form').removeClass('hidden'); 7658 }); 7659 7660 $(".cd-panel").addClass("cd-panel--is-visible"); 7661 $("body").delay(300).queue(function (next) { 7662 $(this).addClass("cd-panel-no-scroll"); 7663 next(); 7664 }); 7665 $(".right-half, #nav-icon1, #nav-icon2, #nav-icon3, #nav-icon4").delay(300).queue(function (next) { 7666 $(this).addClass("cd-panel-subheader-no-scroll"); 7667 next(); 7668 }); 7669 7670 var selected_form = $(".popup_form#srp_form_container"); 7671 var selected_form_title = $(".gform_title", selected_form).text(); 7672 $("#popup_left_title").html(selected_form_title); 7673 7674 getIncentivesForm(vehicleData.vehicleVin, vehicleData.vehicleVin, vehicleData.vehiclePrice, vehicleData.formValue, vehicleData.vehicleUrl); 7675 popupForm(vehicleData.vehicleVin); 7676 7677 } 7678 //End incentives slideout 7679 7680 //Additional incentives button to open slideout 7681 $('.ag-more-incentives a').click(function() { 7682 var $currentButton = $(this); 7683 var vin = $currentButton.attr("data-vehicle-vin"); 7684 $('.vehicle-incentives').removeClass('hidden'); 7685 if (!$('.srp_incentives_form').hasClass('hidden')) { 7686 $('.srp_incentives_form').addClass('hidden'); 7687 } 7688 7689 var vin = $(this).attr("data-vehicle-vin"); 7690 $("#popup_left_dealer").html($currentButton.attr("data-dealer-name")); 7691 $("#popup_left_price").html($currentButton.attr("data-vehicle-price")); 7692 $("#popup_left_stock_number").html($currentButton.attr("data-vehicle-stock-number")); 7693 $("#popup_left_vin").html($currentButton.attr("data-vehicle-vin")); 7694 $("#popup_left_vehicle_title").html($(".vehicle_title_form", $currentButton).text()); 7695 $(".popup_form").show(); 7696 $(".cd-panel__subheader-right").hide(); 7697 var incentivesContent = $currentButton.closest('.ag-more-incentives') 7698 .next('.incentives-content-template') 7699 .html(); 7700 var customLayout = ` 7701 <div class="incentives-popup-container"> 7702 <div class="incentives-list"> 7703 ${incentivesContent} 7704 7705 </div> 7706 `; 7707 7708 var form_container = $("#srp_form_container"); 7709 form_container.html(customLayout); 7710 var selected_form_title = $(".gform_title", form_container).text(); 7711 $("#popup_left_title").html(selected_form_title); 7712 $(".gform_title", form_container).hide(); 7713 $(".gform_description", form_container).hide(); 7714 7715 popupIncentivesBox(vin); 7716 event.stopPropagation(); 7717 }); 7718 7719 //toggle Lists 7720 $(document).on('click', '.toggle-incentives', function(event) { 7721 event.preventDefault(); 7722 event.stopImmediatePropagation(); 7723 let $lists = $('.toggle-list-incentives'); 7724 let $icon = $(this).find("i"); 7725 $lists.stop(true, false).slideToggle(400); 7726 $icon.toggleClass("fa-chevron-down fa-chevron-up"); 7727 return false;
7728 }); 7729 7730 //toggle lists 7731 $(document).on('click', '.toggle-qualify', function(event) { 7732 event.preventDefault(); 7733 event.stopImmediatePropagation(); 7734 let $lists = $('.toggle-list-qualify'); 7735 let $icon = $(this).find("i"); 7736 $lists.stop(true, false).slideToggle(400); 7737 $icon.toggleClass("fa-chevron-down fa-chevron-up"); 7738 return false; 7739 }); 7740 7741 $(document).on('click', '.incentives-btn', function(event) { 7742 7743 var buttonData = $(this); 7744 var vehicleData = buttonData[0]; 7745 7746 if(event.target.attributes['data-value'] !== undefined){ 7747 } 7748 if (event.target.name !== undefined || event.target.attributes['data-value'] !== undefined){ 7749 var incentiveName = event.target.name; 7750 var incentiveValue = ''; 7751 var formValue = event.target.attributes['data-value'].value; 7752 7753 if (event.target.attributes['data-value'] !== undefined){ 7754 incentiveValue = event.target.attributes['data-value'].value; 7755 } 7756 7757 popupIncentives("incentives_container", incentiveName, incentiveValue, formValue, vehicleData.dataset); 7758 event.stopPropagation(); 7759 } else { 7760 console.log('error! missing attributes') 7761 } 7762 }); 7763 7764 $(".autocheck_button").on("click", function () { 7765 var vin = $(this).attr("data-vehicle-vin"); 7766 $("#popup_left_dealer").html($(this).attr("data-dealer-name")); 7767 $("#popup_left_price").html($(this).attr("data-vehicle-price")); 7768 $("#popup_left_stock_number").html($(this).attr("data-vehicle-stock-number")); 7769 $("#popup_left_vin").html($(this).attr("data-vehicle-vin")); 7770 $("#popup_left_vehicle_title").html($(".vehicle_title_form", $(this)).text()); 7771 $(".cd-panel__content").css({"padding-top": "114px"}); 7772 $(".cd-panel__container").css({"width": "100%"}); 7773 $(".cd-panel__header").css({"width": "100%"}); 7774 getAutoCheckReport($(this).attr("data-vehicle-id")); 7775 popupForm(vin); 7776 event.stopPropagation(); 7777 }); 7778 7779 $('.srp-cta-calculate-payment-btn').click(function () { 7780 const parentListing = $(this).closest('.listing'); 7781 const priceVal = parentListing.data('ag-price'); 7782 $('#carPrice').val(priceVal || 0); 7783 $("#popup_left_vin").html($(this).attr("data-vehicle-vin")); 7784 $("#popup_left_vehicle_title").html($(".vehicle_title_form", $(this)).text()); 7785 popupForm("payment_calculator_container"); 7786 event.stopPropagation(); 7787 }); 7788 7789 7790 //Button click to close, click outside form to close 7791 $(".cd-panel__close, .cd-panel__otherside").click(function () { 7792 $(".cd-panel").removeClass("cd-panel--is-visible"); 7793 $("#payment_calculator_container").delay(400).hide(0); 7794 $(".popup_form").delay(400).hide(0); 7795 $(".popup_form").delay(400).queue(function (next) { 7796 $(this).empty(); 7797 next(); 7798 }); 7799 $("body").delay(400).queue(function (next) { 7800 $(this).removeClass("cd-panel-no-scroll"); 7801 next(); 7802 }); 7803 $(".right-half, #nav-icon1, #nav-icon2, #nav-icon3, #nav-icon4").delay(400).queue(function (next) { 7804 $(this).removeClass("cd-panel-subheader-no-scroll"); 7805 next(); 7806 }); 7807 $(".cd-panel__content").removeAttr('style'); 7808 $(".listing").removeAttr('style'); 7809 $(".cd-panel__subheader-right").show(); 7810 setTimeout(function () { 7811 $(".cd-panel__container").removeAttr('style'); 7812 }, 300); 7813 }); 7814 } 7815 7816 function disableForms() 7817 { 7818 7819 $('.srp_cta_1').off("click"); 7820 $('.srp_cta_2').off("click"); 7821 7822 $(".autocheck_button").off("click"); 7823 $(".cd-panel__close, .cd-panel__otherside").off("click"); 7824 } 7825 7826 function toggleFilters() 7827 { 7828 $(".side-panel-container").toggleClass("mobileFilters"); 7829 $(".showFiltersNonLegacy i").toggleClass("chevron-flip"); 7830 $(".result-wrapper").toggleClass("filtersOpen"); 7831 $("body").toggleClass("filtersOpen"); 7832 $(".filterResultCount").toggleClass("filter-result-count-active"); 7833 } 7834 7835 /** 7836 * Retry counter lives outside the function on purpose. 7837 * 7838 * It used to be `let tries = 0` as the first statement inside, which reset it 7839 * to zero on every call - so `tries < 10` could never fail and the "retry ten 7840 * times" guard was in fact an unbounded one-second loop for as long as the page 7841 * stayed open. It does not fire where DG loads normally, but it does on any 7842 * dealer where DG is slow, blocked, or absent. 7843 * 7844 * Logging is behind ?spdebug=1 for the same reason the rest of this moved to 7845 * onRenderSettled: console.log of a populated vehicle array on every render is 7846 * not free, and it is markedly worse in Safari with an inspector attached - 7847 * which is exactly the situation anyone debugging this on an iPhone is in. 7848 */ 7849 var smartPathTries = 0; 7850 var smartPathDebug = new URLSearchParams(window.location.search).get('spdebug') === '1'; 7851
7852 function renderSmartPath() 7853 { 7854 if (smartPathDebug) console.log("Trying to render smartpath objects..."); 7855 7856 if (typeof window.DGDataHub.getWarningState !== "undefined" && (window.DGDataHub.getWarningState().dgLoaded || smartPathDebug)) 7857 { 7858 var smartPathVehicles = vehiclesList.map(veh => ({ 7859 type: 'inv', 7860 brand: veh.make, 7861 modelCd: veh.modelCode, 7862 dealerCd: '37194', 7863 advertisedPrice: parseFloat(veh.internetPrice.replace("$", "").replace(",", "")), // Advertised Price 7864 imageHref: veh.imageUrls[0], 7865 imagePrice: 0, 7866 marketingSeries: veh.model, 7867 marketingName: veh.model, 7868 year: veh.yr, 7869 vin: veh.vin, 7870 price: parseFloat(veh.msrp.replace("$", "").replace(",", "")), // MSRP 7871 ePrice: parseFloat(veh.finalPrice.replace("$", "").replace(",", "")), // Selling Price 7872 vdpHref: veh.vdpUrl, 7873 vlpHref: `http://www.toyota.com/${veh.model.toLowerCase()}/`, 7874 salesClass: veh.certified == "yes" ? 'cpo' : veh.condition.toLowerCase(), // value options are 'new', 'used' and 'cpo' (certified pre-owned), 7875 vehicleType: veh.certified == "yes" ? 'cpo' : veh.condition.toLowerCase() // value options are 'new', 'used' and 'cpo' (certified pre-owned), 7876 })); 7877 7878 var saveItemsObj = {} 7879 7880 smartPathVehicles.map(veh => saveItemsObj[`dg-inline-save-inv-${veh.vin}`] = veh); 7881 7882 if (smartPathDebug) console.log(smartPathVehicles); 7883 7884 window.DGDataHub.renderInlineSaves(saveItemsObj); 7885 7886 7887 if (smartPathDebug) console.log(window.DGDataHub.getDgid()); 7888 7889 fetch("https://mobile-api.rti.toyota.com/leads/garage/eprice?dgid=" + window.DGDataHub.getDgid() + "&dealerCd=" + "37194").then(response => response.json()).then(data => { 7890 if (data.includes("37194") && srpCondition != "Used") 7891 { 7892 if (smartPathDebug) console.log("Unlocking smartprice..."); 7893 $(".dv-pricinggate").show(); 7894 $(".dv-pricing-main").hide(); 7895 $(".srp_cta_pricinggate").hide(); 7896 $(".srp-cta-smartpath1-btn").hide(); 7897 $(".srp-cta-smartpathunlocked-btn").attr('style', 'display: inline !important'); 7898 7899 $(".vehicle-price-container").css('height', ''); 7900 } 7901 7902 return data; 7903 }).then(data => { if (smartPathDebug) console.log(data); }); 7904 } 7905 else 7906 { 7907 if (smartPathTries < 10) 7908 { 7909 smartPathTries++; 7910 setTimeout(renderSmartPath, 1000); 7911 } 7912 } 7913 } 7914 7915 function checkAndRemoveFacets() { 7916 7917 if (!userInteractedWithFacets) return; 7918 7919 // Remove child facet if parent facet is unclicked 7920 if(srpCondition === "Used" || srpDealerId.includes(dealerGroupSite)){ 7921 if($("#model-list ul li input[type='checkbox']:checked").length > 0 && $("#make-list ul li input[type='checkbox']:checked").length === 0){ 7922 search.helper.removeDisjunctiveFacetRefinement('model'); 7923 search.helper.removeDisjunctiveFacetRefinement('trim'); 7924 search.helper.search(); 7925 userInteractedWithFacets = false; 7926 } 7927 } 7928 7929 if($("#trim-list ul li input[type='checkbox']:checked").length > 0 && $("#model-list ul li input[type='checkbox']:checked").length === 0){ 7930 search.helper.removeDisjunctiveFacetRefinement('trim'); 7931 search.helper.search(); 7932 userInteractedWithFacets = false; 7933 } 7934 } 7935 7936 function getUrlParams() { 7937 7938 const params = new URLSearchParams(window.location.search); 7939 const paramObj = {}; 7940 params.forEach((value, key) => { 7941 7942 if (!paramObj[key]) { 7943 7944 paramObj[key] = []; 7945 } 7946 paramObj[key].push(value); 7947 }); 7948 return paramObj; 7949 } 7950 7951 // Function to dynamically toggle filters based on URL params 7952 function toggleFiltersDynamically() { 7953 const params = getUrlParams(); 7954 7955 Object.keys(params).forEach(function(filterVar) { 7956 7957 filterVar = filterVar.toLowerCase(); 7958 7959 if(filterVar == "genericcolor"){ 7960 filterVar = "color"; 7961 } 7962 7963 if(filterVar == "finalpricerange"){ 7964 filterVar = "pricerange"; 7965 } 7966 7967 if(filterVar == "yr"){ 7968 filterVar = "year"; 7969 } 7970 7971 if(filterVar == "transmissiontype"){ 7972 filterVar = "transmission"; 7973 } 7974 7975 const containerSelector = $(`.${filterVar}-container > div`); 7976 7977 if (containerSelector.length > 0) { 7978 containerSelector.show(); 7979 } 7980 }); 7981 } 7982 7983 7984 //Nexus Fuse Payments Start 7985 7986 //Fuse Payments Button - Nexus 7987 function nexusPaymentButtons(){ 7988 7989 } 7990 7991 7992 function updateFuseButton(buttonContainer, data, offerTypeId) { 7993 7994 if (!data || !Array.isArray(data)) { 7995 console.error('Error in updateFuseButton: "data" is either undefined or not an array.', { data, buttonContainer, offerTypeId }); 7996 buttonContainer.style.display = 'none'; 7997 return; 7998 } 7999 8000 const matchedOffer = data.find(offer => offer.fuse.OfferTypeID == offerTypeId); 8001 8002 if (matchedOffer) { 8003 8004 //Used for Fuse SinglePaymentOption 8005 const fuseOfferOne = "5"; 8006 8007 //Used for Fuse APR 8008 const fuseOfferTwo = "7"; 8009 8010 //Used for Fuse PaymentNoTax 8011 const fuseOfferThree = "5"; 8012 8013 let ctaText = ""; 8014 let buttonHtml = ""; 8015 let ctaDisclaimer = ""; 8016 8017 if(matchedOffer.fuse.OfferTypeID == fuseOfferOne && fuseOfferOne !== "1") { 8018 const ctaFuseText = "Single Payment Option"; 8019 const singlePayment = matchedOffer.fuse.SinglePayment; 8020 8021 function formatAsCurrency(amount) {
8022 return amount.toLocaleString('en-US', { 8023 minimumFractionDigits: 0, 8024 maximumFractionDigits: 0 8025 }); 8026 } 8027 8028 const formattedPayment = formatAsCurrency(singlePayment); 8029 8030 ctaFuseAmount = formattedPayment 8031 ctaDisclaimer = matchedOffer.fuse.Disclaimer; 8032 8033 buttonHtml = ` 8034 <a href='javascript: void(0);' data-vehicle-id="${matchedOffer.vin}" data-vehicle-vin="${buttonContainer.getAttribute('data-vehicle-vin')}" data-vehicle-condition="${buttonContainer.getAttribute('data-vehicle-condition')}" data-vehicle-year="${buttonContainer.getAttribute('data-vehicle-year')}" data-vehicle-make="${buttonContainer.getAttribute('data-vehicle-make')}" data-vehicle-model="${buttonContainer.getAttribute('data-vehicle-model')}" data-vehicle-stock-number="${buttonContainer.getAttribute('data-vehicle-stock-number')}" data-vehicle-price="${buttonContainer.getAttribute('data-vehicle-price')}" data-vehicle-discount="${buttonContainer.getAttribute('data-vehicle-discount')}" data-dealer-name="${buttonContainer.getAttribute('data-dealer-name')}" data-dealer-id="${buttonContainer.getAttribute('data-dealer-id')}" data-form-id="${buttonContainer.getAttribute('data-form-id')}" data-offer-type-id="${offerTypeId}" data-customer-disclaimer="${ctaDisclaimer}" class="${buttonContainer.className}"> 8035 <span class="option-title">${ctaFuseText}</span> 8036 <span class="option-value">$${ctaFuseAmount}</span> 8037 <span style="display:none;" class="vehicle_title_form">${buttonContainer.getAttribute('data-vehicle-year')} ${buttonContainer.getAttribute('data-vehicle-make')} ${buttonContainer.getAttribute('data-vehicle-model')} </span> 8038 </a> 8039 `; 8040 } 8041 8042 if(matchedOffer.fuse.OfferTypeID == fuseOfferTwo){ 8043 const ctaFuseText = "APR"; 8044 const ctaFuseAmount = `${matchedOffer.fuse.APR}%`; 8045 ctaDisclaimer = matchedOffer.fuse.Disclaimer; 8046 8047 buttonHtml = ` 8048 <a href='javascript: void(0);' data-vehicle-id="${matchedOffer.vin}" data-vehicle-vin="${buttonContainer.getAttribute('data-vehicle-vin')}" data-vehicle-condition="${buttonContainer.getAttribute('data-vehicle-condition')}" data-vehicle-year="${buttonContainer.getAttribute('data-vehicle-year')}" data-vehicle-make="${buttonContainer.getAttribute('data-vehicle-make')}" data-vehicle-model="${buttonContainer.getAttribute('data-vehicle-model')}" data-vehicle-stock-number="${buttonContainer.getAttribute('data-vehicle-stock-number')}" data-vehicle-price="${buttonContainer.getAttribute('data-vehicle-price')}" data-vehicle-discount="${buttonContainer.getAttribute('data-vehicle-discount')}" data-dealer-name="${buttonContainer.getAttribute('data-dealer-name')}" data-dealer-id="${buttonContainer.getAttribute('data-dealer-id')}" data-form-id="${buttonContainer.getAttribute('data-form-id')}" data-offer-type-id="${offerTypeId}" data-customer-disclaimer="${ctaDisclaimer}" class="${buttonContainer.className}"> 8049 <span class="option-title">${ctaFuseText}</span> 8050 <span class="option-value">${ctaFuseAmount}</span> 8051 <span style="display:none;" class="vehicle_title_form">${buttonContainer.getAttribute('data-vehicle-year')} ${buttonContainer.getAttribute('data-vehicle-make')} ${buttonContainer.getAttribute('data-vehicle-model')} </span> 8052 </a> 8053 `; 8054 } 8055 8056 //Fuse option 3 used for offerTypeId 1 PaymentNoTax 8057 if(matchedOffer.fuse.OfferTypeID == fuseOfferThree && (matchedOffer.fuse.OfferTypeID == 1 && fuseOfferOne === "1")){ 8058 const ctaFuseText = "Single Payment Option"; 8059 const ctaFuseAmount = `${matchedOffer.fuse.PaymentNoTax}`; 8060 ctaDisclaimer = matchedOffer.fuse.Disclaimer; 8061 8062 const textResult = replaceAmountPlaceholder(ctaFuseText, ctaFuseAmount); 8063 8064 if (textResult.hasPlaceholder) { 8065 buttonHtml = ` 8066 <a href='javascript: void(0);' data-vehicle-id="${matchedOffer.vin}" data-vehicle-vin="${buttonContainer.getAttribute('data-vehicle-vin')}" data-vehicle-condition="${buttonContainer.getAttribute('data-vehicle-condition')}" data-vehicle-year="${buttonContainer.getAttribute('data-vehicle-year')}" data-vehicle-make="${buttonContainer.getAttribute('data-vehicle-make')}" data-vehicle-model="${buttonContainer.getAttribute('data-vehicle-model')}" data-vehicle-stock-number="${buttonContainer.getAttribute('data-vehicle-stock-number')}" data-vehicle-price="${buttonContainer.getAttribute('data-vehicle-price')}" data-vehicle-discount="${buttonContainer.getAttribute('data-vehicle-discount')}" data-dealer-name="${buttonContainer.getAttribute('data-dealer-name')}" data-dealer-id="${buttonContainer.getAttribute('data-dealer-id')}" data-form-id="${buttonContainer.getAttribute('data-form-id')}" data-offer-type-id="${offerTypeId}" data-customer-disclaimer="${ctaDisclaimer}" class="${buttonContainer.className}"> 8067 <span class="option-title">${textResult.displayText}</span> 8068 <span style="display:none;" class="vehicle_title_form">${buttonContainer.getAttribute('data-vehicle-year')} ${buttonContainer.getAttribute('data-vehicle-make')} ${buttonContainer.getAttribute('data-vehicle-model')} </span> 8069 </a> 8070 `; 8071 } else { 8072 buttonHtml = `
8073 <a href='javascript: void(0);' data-vehicle-id="${matchedOffer.vin}" data-vehicle-vin="${buttonContainer.getAttribute('data-vehicle-vin')}" data-vehicle-condition="${buttonContainer.getAttribute('data-vehicle-condition')}" data-vehicle-year="${buttonContainer.getAttribute('data-vehicle-year')}" data-vehicle-make="${buttonContainer.getAttribute('data-vehicle-make')}" data-vehicle-model="${buttonContainer.getAttribute('data-vehicle-model')}" data-vehicle-stock-number="${buttonContainer.getAttribute('data-vehicle-stock-number')}" data-vehicle-price="${buttonContainer.getAttribute('data-vehicle-price')}" data-vehicle-discount="${buttonContainer.getAttribute('data-vehicle-discount')}" data-dealer-name="${buttonContainer.getAttribute('data-dealer-name')}" data-dealer-id="${buttonContainer.getAttribute('data-dealer-id')}" data-form-id="${buttonContainer.getAttribute('data-form-id')}" data-offer-type-id="${offerTypeId}" data-customer-disclaimer="${ctaDisclaimer}" class="${buttonContainer.className}"> 8074 <span class="option-title">${textResult.displayText}</span> 8075 <span class="option-value">$${ctaFuseAmount}</span> 8076 <span style="display:none;" class="vehicle_title_form">${buttonContainer.getAttribute('data-vehicle-year')} ${buttonContainer.getAttribute('data-vehicle-make')} ${buttonContainer.getAttribute('data-vehicle-model')} </span> 8077 </a> 8078 `; 8079 } 8080 } 8081 8082 let newButtonElement = document.createRange().createContextualFragment(buttonHtml).firstElementChild; 8083 buttonContainer.replaceWith(newButtonElement); 8084 8085 fuseButtonBinding(); 8086 } else { 8087 console.log("No matching offer found for OfferTypeID:", offerTypeId); 8088 } 8089 } 8090 8091 8092 function replaceAmountPlaceholder(text, amount) { 8093 if (text.includes('{amount}')) { 8094 return { 8095 hasPlaceholder: true, 8096 displayText: text.replace('{amount}', `<span class="option-value">$${amount}</span>`) 8097 }; 8098 } 8099 return { 8100 hasPlaceholder: false, 8101 displayText: text 8102 }; 8103 } 8104 8105 function fuseButtonBinding(){ 8106 } 8107 //Nexus Fuse Payments End 8108 8109 8110 8111 $(document).ready(function () { 8112 // if (navigator.platform == "MacIntel") 8113 // { 8114 // $(".srp-results").css("width", "calc(100vw - 376px)"); 8115 // } 8116 8117 8118 setTimeout(function(){ 8119 8120 toggleFiltersDynamically(); 8121 nexusPaymentButtons(); 8122 initForms(); 8123 registerSmartpathCTAOverrides(jQuery("#srp-results")); 8124 }, 1000); 8125 }); 8126</script>
8126 8127 8128 8129 8130 8131</main> 8132<div class="srp-bottom-disclaimers"> 8133<h4>Disclaimer</h4> 8134<p>*Pricing of vehicles on this web site may include options that may have been installed at the Dealership. Pricing includes $490 PA Doc Fee, and may include current promotions, incentives, and/or bonus cash from Toyota Financial Services. Monthly payment calculator does not include tax, title, license. Please contact the Dealership for latest pricing and monthly payment. Published price subject to change without notice to correct errors or omissions or in the event of inventory fluctuations. Price good for 2 days only, please contact store by email or phone for details. 8135</p> 8136<br> 8137<p> 8138While every effort has been made to ensure display of accurate data, the vehicle listings within this web site may not reflect all accurate vehicle items. Accessories and color may vary. All Inventory listed is subject to prior sale. The vehicle photo displayed may be an example only. Vehicle Photos may not match exact vehicle. Please confirm vehicle price with Dealership. See Dealership for details. 8139</p> 8140</div>
8140<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/video.js?v=1.648.51"></script>
8140 8141<style> 8142 /*****************************************************************************************************************************/ 8143 /* CTA 1 Button */ 8144 /*****************************************************************************************************************************/ 8145 .srp-cta-1-btn { 8146 color: #ffffff !important; 8147 background-color: #eb0a1e !important; 8148 } 8149 8150 .srp-cta-1-btn:hover { 8151 background-color: #383838 !important; 8152 } 8153 8154 /*****************************************************************************************************************************/ 8155 /* CTA 2 Button */ 8156 /*****************************************************************************************************************************/ 8157 .srp-cta-2-btn { 8158 color: #ffffff !important; 8159 background-color: #d50000 !important; 8160 } 8161 8162 .srp-cta-2-btn:hover { 8163 background-color: #000000 !important; 8164 } 8165 8166 /*****************************************************************************************************************************/ 8167 /* CTA 3 Button */ 8168 /*****************************************************************************************************************************/ 8169 .srp-cta-3-btn { 8170 color: #ffffff !important; 8171 background-color: #000000 !important; 8172 } 8173 8174 .srp-cta-3-btn:hover { 8175 background-color: #eeeeee !important; 8176 } 8177 8178 8179 /*****************************************************************************************************************************/ 8180 /* CTA 4 Button */ 8181 /*****************************************************************************************************************************/ 8182 .srp-cta-4-btn { 8183 color: #ffffff !important; 8184 background-color: #000000 !important; 8185 } 8186 8187 .srp-cta-4-btn:hover { 8188 background-color: #eeeeee !important; 8189 } 8190 8191 /*****************************************************************************************************************************/ 8192 /* CTA 5 Button */ 8193 /*****************************************************************************************************************************/ 8194 .srp-cta-5-btn { 8195 color: #ffffff !important; 8196 background-color: #262626 !important; 8197 } 8198 8199 .srp-cta-5-btn:hover { 8200 background-color: #0a0a0a !important; 8201 } 8202 8203 /*****************************************************************************************************************************/ 8204 /* CTA 6 Button */ 8205 /*****************************************************************************************************************************/ 8206 .srp-cta-6-btn { 8207 color: #ffffff !important; 8208 background-color: #262626 !important; 8209 } 8210 8211 .srp-cta-6-btn:hover { 8212 background-color: #0a0a0a !important; 8213 } 8214 8215 /*****************************************************************************************************************************/ 8216 /* Roadster CTA Button */ 8217 /*****************************************************************************************************************************/ 8218 .srp-cta-roadster-btn { 8219 color: #063497 !important; 8220 background-color: #ffcc00 !important; 8221 } 8222 8223 /*****************************************************************************************************************************/ 8224 /* Custom Modal CTA Button */ 8225 /*****************************************************************************************************************************/ 8226 .srp-cta-modal-btn { 8227 color: #ffffff; 8228 background-color: #000000; 8229 } 8230 8231 .srp-cta-modal-btn:hover { 8232 color: #000000; 8233 background-color: #000000; 8234 } 8235 8236 .srp-cta-modal-btn-two { 8237 color: #000000; 8238 background-color: #eb0a1e; 8239 } 8240 8241 .srp-cta-modal-btn-two:hover { 8242 color: #000000; 8243 background-color: #eb0a1e; 8244 } 8245 8246 /*****************************************************************************************************************************/ 8247 /* Pricing Gate Button */ 8248 /*****************************************************************************************************************************/ 8249 .srp-cta-pricinggate-btn { 8250 color: #ffffff !important; 8251 background-color: #000000 !important; 8252 } 8253 8254 .srp-cta-pricinggate-btn:hover { 8255 color: #eeeeee !important; 8256 background-color: #eeeeee !important; 8257 } 8258 8259 /*****************************************************************************************************************************/ 8260 /* CTA Calculate Payment Button */ 8261 /*****************************************************************************************************************************/ 8262 .srp-cta-calculate-payment-btn { 8263 color: white; 8264 background-color: var(--primary-color); 8265 border-color: var(--primary-color); 8266 } 8267 8268 .srp-cta-calculate-payment-btn:hover { 8269 color: white; 8270 background-color: var(--secondary-color); 8271 border-color: var(--secondary-color); 8272 } 8273 8274 8275 /*****************************************************************************************************************************/ 8276 /* Instant Search Styles */ 8277 /*****************************************************************************************************************************/ 8278 8279 .ais-Pagination-item--firstPage .ais-Pagination-link, .ais-Pagination-item--previousPage .ais-Pagination-link, .ais-Pagination-item--nextPage .ais-Pagination-link, .ais-Pagination-item--lastPage .ais-Pagination-link { 8280 color: #eb0a1e; 8281 } 8282 8283 .ais-RefinementList-count { 8284 color: #eb0a1e; 8285 font-weight: bold; 8286 } 8287 8288 .srp-SUV { 8289 background: url(https://bucket.dealervenom.com/assets/oem/toyota/filters/suv.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=120&height=100); 8290 } 8291 8292 .srp-Van { 8293 background: url(https://bucket.dealervenom.com/assets/oem/toyota/filters/van.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=120&height=100); 8294 } 8295 8296 .srp-Truck { 8297 background: url(https://bucket.dealervenom.com/assets/oem/toyota/filters/truck.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=120&height=100); 8298 } 8299 8300 .srp-Hatchback { 8301 background: url(https://bucket.dealervenom.com/assets/oem/toyota/filters/hatch.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=120&height=100); 8302 } 8303 8304 .srp-Wagon { 8305 background: url(https://bucket.dealervenom.com/assets/oem/toyota/filters/wagon.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=120&height=100); 8306 } 8307 8308 .srp-Coupe { 8309 background: url(https://bucket.dealervenom.com/assets/oem/toyota/filters/coupe.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=120&height=100); 8310 } 8311 8312 .srp-Sedan { 8313 background: url(https://bucket.dealervenom.com/assets/oem/toyota/filters/sedan.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=120&height=100); 8314 } 8315 8316 .srp-Convertible { 8317 background: url(https://bucket.dealervenom.com/assets/oem/toyota/filters/convertible.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=120&height=100); 8318 } 8319 8320 .srp-Crossover { 8321 background : url(https://bucket.dealervenom.com/assets/oem/toyota/filters/crossover.png?auto=compress%2Cformat&ixlib=php-1.2.1&width=140); 8322 } 8323 8324 .vehicle-special { 8325 background-color: #f00f00 !important; 8326 } 8327 8328 8329 .srp-header { 8330 top: 75px; 8331 } 8332 8333 .car-title > p { 8334 color: #eb0a1e; 8335 } 8336 8337 .listing-bottom-row { 8338 background-color: #000000; 8339 color: #ffffff; 8340 } 8341 8342 .specs { 8343 height: 60px; 8344 } 8345 8346 .img-container { 8347 padding-bottom: 75%; 8348 } 8349 8350 #clearSearchResults button { 8351 color: #eb0a1e; 8352 } 8353 8354 .srp-windowsticker.srp_cta:hover { 8355 background-color: #ffffff; 8356 color: #eb0a1e; 8357 border-color: #eb0a1e; 8358 } 8359 8360 .reserved-vehicle { 8361 background-color: #EB0A11; 8362 color: ; 8363 } 8364 8365 8366 .vehicle-price-container { 8367 height: 120px; 8368 } 8369 8370 @media screen and (max-width: 1024px) 8371 { 8372 .srp-header { 8373 top: 75px; 8374 height: auto; 8375 flex-flow: column nowrap; 8376 padding: 25px; 8377 box-sizing: border-box; 8378 } 8379 8380 .srp-search { 8381 position: relative; 8382 } 8383 #clearSearchResults { 8384 position: absolute; 8385 right: 10px; 8386 background: #fff; 8387 } 8388 #clearSearchResults button { 8389 padding-right: 0; 8390 } 8391 .mobileFilters { 8392 bottom: 0 8393 } 8394 8395 .dv-logged-in .srp-filters { 8396 padding-top: 75px 8397 } 8398 } 8399 8400 .filterResultCount { 8401 display: none 8402 } 8403 @media screen and (max-width: 1024px){ 8404 .filterResultCount { 8405 background-color: #EB0A1E; 8406 color: #FFFFFF; 8407 display: none; 8408 position: fixed; 8409 bottom: 0; 8410 z-index: 2147483647; 8411 width: 100%; 8412 text-align: center; 8413 padding: 12.5px 0; 8414 } 8415 .filterResultCount:hover { 8416 cursor: pointer; 8417 } 8418 .filterResultCount.filter-result-count-active { 8419 display: block 8420 } 8421 } 8422 .dv-srp-search-options { 8423 display: none; 8424 position: relative; 8425 box-sizing: border-box 8426 } 8427 8428 .dv-srp-search-options * { 8429 box-sizing: border-box 8430 } 8431 8432 .sortFilters .dv-srp-sort-mobile { 8433 position: absolute; 8434 width: 100%; 8435 min-width: 160px; 8436 left: 0; 8437 top: 100%; 8438 padding: 0; 8439 background: #fff; 8440 box-shadow: 0 8px 16px 0 rgba(0,0,0,.2); 8441 z-index: 1; 8442 text-align: left; 8443 overflow: hidden; 8444 visibility: hidden; 8445 opacity: 0; 8446 height: 0 8447 } 8448 8449 .sortFilters .dv-srp-sort-desktop { 8450 position: absolute; 8451 width: 100%; 8452 min-width: 160px; 8453 left: 0; 8454 top: 80%; 8455 padding: 0; 8456 background: #fff; 8457 box-shadow: 0 8px 16px 0 rgba(0,0,0,.2); 8458 z-index: 1; 8459 text-align: left; 8460 overflow: hidden; 8461 visibility: hidden; 8462 opacity: 0; 8463 height: 0 8464 } 8465 8466 .sortFilters .dv-srp-sort-mobile.dv-srp-sort-mobile-active, 8467 .sortFilters .dv-srp-sort-desktop.dv-srp-sort-desktop-active { 8468 overflow: auto; 8469 visibility: visible; 8470 opacity: 1; 8471 height: fit-content; 8472 padding: 12.5px 8473 } 8474 8475 .sortFilters .dv-srp-sort-mobile a,
8476 .sortFilters .dv-srp-sort-desktop a { 8477 font-size: 12px; 8478 display: block; 8479 margin: 12.5px 0; 8480 color: #000; 8481 display: flex; 8482 display: -webkit-flex; 8483 display: -ms-flexbox; 8484 justify-content: flex-start; 8485 align-items: center; 8486 gap: 6.25px; 8487 text-transform: capitalize 8488 } 8489 8490 .sortFilters .dv-srp-sort-mobile a:hover, 8491 .sortFilters .dv-srp-sort-desktop a:hover { 8492 cursor: pointer; 8493 } 8494 8495 .sortFilters .dv-srp-sort-mobile a.dv-srp-sort-selected, 8496 .sortFilters .dv-srp-sort-desktop a.dv-srp-sort-selected { 8497 color: var(--primary-color) 8498 } 8499 8500 .sortFilters .dv-srp-sort-mobile a i, 8501 .sortFilters .dv-srp-sort-desktop a i { 8502 display: block; 8503 color: var(--primary-color); 8504 width: 15px; 8505 text-align: center 8506 } 8507 8508 #sortByDesktop { 8509 position: relative; 8510 box-sizing: border-box; 8511 margin-right: 25px 8512 } 8513 8514 #sortByDesktop * { 8515 box-sizing: border-box; 8516 } 8517 8518 @media screen and (min-width: 1024px) { 8519 .dv-srp-search-options-wrapper { 8520 /* background: var(--primary-color); */ 8521 color: #505050; 8522 padding: 12.5px; 8523 min-width: 100%; 8524 white-space: nowrap; 8525 } 8526 8527 .dv-srp-search-options-wrapper:hover { 8528 cursor: pointer; 8529 } 8530 8531 .dv-srp-search-options-wrapper .dv-srp-search-options-label { 8532 display: inline-block; 8533 vertical-align: bottom; 8534 font-size: 14px; 8535 font-weight: 600 8536 } 8537 8538 .dv-srp-search-options-wrapper .dv-srp-search-options-label i { 8539 margin-right: 6.25px 8540 } 8541 } 8542 8543 @media screen and (max-width: 1024px) { 8544 .srp-header { 8545 background: #f8f8f8; 8546 } 8547 .srp-header .dv-srp-search-options { 8548 display: flex; 8549 display: -webkit-flex; 8550 display: -ms-flexbox; 8551 margin-top: 12.5px; 8552 gap: 25px; 8553 } 8554 .srp-header .dv-srp-search-options .sortFilters, 8555 .srp-header .dv-srp-search-options .showFiltersNonLegacy, 8556 .srp-header .dv-srp-search-options .saveFilters { 8557 width: 33.333%; 8558 flex: 1 1 33.333%; 8559 background: var(--primary-color); 8560 color: #fff; 8561 padding: 6.25px; 8562 display: flex; 8563 display: -webkit-flex; 8564 display: -ms-flexbox; 8565 text-align: center; 8566 justify-content: center; 8567 align-items: center; 8568 font-size: 12px; 8569 text-transform: uppercase; 8570 } 8571 .srp-header .dv-srp-search-options .sortFilters:hover, 8572 .srp-header .dv-srp-search-options .showFiltersNonLegacy:hover, 8573 .srp-header .dv-srp-search-options .saveFilters:hover { 8574 cursor: pointer; 8575 } 8576 .srp-header .dv-srp-search-options .saveFilters { 8577 display: none !important 8578 } 8579 .srp-searchbar { 8580 background: #fff; 8581 flex-basis: 100%; 8582 border: 1px solid #e9e9e9; 8583 } 8584 .srp-searchbar input { 8585 background-color: #fff !important; 8586 } 8587 .srp-searchbar > .fa-search { 8588 padding: 0 12.5px; 8589 } 8590 #searchbox { 8591 width: 100%; 8592 } 8593 } 8594 @media screen and (max-width: 480px) { 8595 .srp-header .dv-srp-search-options { 8596 gap: 12.5px; 8597 } 8598 .srp-header .dv-srp-search-options .sortFilters, 8599 .srp-header .dv-srp-search-options .showFiltersNonLegacy, 8600 .srp-header .dv-srp-search-options .saveFilters { 8601 font-size: 10px 8602 } 8603 } 8604 8605 .ag-srp-miles { 8606 background: #eee; 8607 border-radius: 15px; 8608 font-weight: 500; 8609 display:block; 8610 padding:4px; 8611 color:#000; 8612 line-height:16px; 8613 font-size:12px !important; 8614} 8615 8616.srp-bottom-disclaimers { 8617 font-size: 12px; 8618 color: #bcc4cc; 8619} 8620.srp-bottom-disclaimers h4 { 8621 text-transform: none; 8622 padding-bottom: 12.5px; 8623 color: #000; 8624} 8625/*Pricing Slash*/ 8626.dv-price-stack p { 8627 position: relative; 8628} 8629.dv-price-stack .dv-price-slash { 8630 z-index: 98; 8631 position: absolute; 8632 right: 0; 8633 max-width: 50px; 8634} 8635/*Pricing Slash*/ 8636 8637/*Vin-Stock Container styles*/ 8638 .srp-extra-div { 8639 display: flex; 8640 margin: auto; 8641 padding-bottom: 5px; 8642 padding-bottom: 12.5px !important; 8643 padding-top: 12.5px !important; 8644 } 8645 .srp-cta a:last-of-type { 8646 margin-bottom: 0px !important; 8647} 8648/*Vin-Stock Container styles*/ 8649/*TP CTA*/ 8650.dv-tp-cta { 8651 width: 100%; 8652 display: block; 8653 border: 0; 8654 padding: 14px; 8655 box-sizing: border-box; 8656 margin-bottom: 12.5px; 8657 font-size:0.8rem; 8658} 8659 8660.dv-tp-cta:hover { 8661 cursor: pointer; 8662 background: #000; 8663} 8664/*TP CTA*/</style> 8665<!-- Modals --> 8666<!-- Twilio Modal --> 8667 8668<!-- Youtube Player Modal --> 8669<div class="modal fade" tabindex="-1" role="dialog" id="youtube_modal"> 8670 <div class="modal-dialog youtube-embed" role="document"> 8671 <div class="modal-content youtube-embed"> 8672 <div class="modal-body youtube-modal-body"> 8673 <div id="ytplayer"></div> 8674 </div> 8675 </div><!-- /.modal-content --> 8676 </div><!-- /.modal-dialog --> 8677</div><!-- /.modal --> 8678 8679<!-- compare Player Modal --> 8680<div class="modal fade" tabindex="-1" role="dialog" id="compare_modal"> 8681 <div class="modal-dialog compare-embed" role="document"> 8682 <div class="modal-content compare-embed"> 8683 <div class="modal-body compare-modal-body"> 8684 <div id="ytplayer"></div> 8685 </div> 8686 </div><!-- /.modal-content --> 8687 </div><!-- /.modal-dialog --> 8688</div><!-- /.modal --> 8689 8690<div class="modal fade" tabindex="-1" role="dialog" id="custom_modal" style="padding: 20px"> 8691 <div class="modal-dialog custom-embed" role="document"> 8692 <div class="modal-content custom-embed"> 8693 <div class="modal-body custom-modal-body"> 8694 <div id="custom_player"></div> 8695 </div> 8696 </div><!-- /.modal-content --> 8697 </div><!-- /.modal-dialog --> 8698</div><!-- /.modal --> 8699 8700<div class="cd-panel cd-panel--from-right js-cd-panel-main"> 8701 <section class="cd-panel__header"> 8702 <p id="popup_left_title"></p> 8703 <a href="javascript:void(0);" class="cd-panel__close js-cd-close">Close</a> 8704 </section> 8705 <div class="cd-panel__container"> 8706 <div class="cd-panel__subheader"> 8707 <div class="cd-panel__subheader-left"> 8708 <h4 id="popup_left_vehicle_title"></h4> 8709 <p>Stock: <span id="popup_left_stock_number"></span> <span>|</span> Vin: <span id="popup_left_vin"></span></p> 8710 </div> 8711 </div> 8712 <div class="cd-panel__content"> 8713 <div class="forms_container"> 8714 <div class="popup_form" id="srp_form_container" style="display: none;"> 8715 </div> 8716 8717 <div id="payment_calculator_container" style="display: none;"> 8718 <style> 8719 .dv-payment-calculator { 8720 max-width: 1428.75px; 8721 margin: 0 auto; 8722 font-family: inherit; 8723 background: #fff; 8724 } 8725 .dv-payment-calculator .dv-calculator-disclaimer { 8726 padding: 25px; 8727 font-size: 14px; 8728 color: #879099; 8729 } 8730 @media screen and (max-width: 768px) { 8731 .dv-payment-calculator { 8732 padding: 25px; 8733 } 8734 } 8735 .dv-payment-calculator h2 { 8736 font-size: 24px; 8737 font-weight: bold; 8738 padding: 25px 50px 8739 } 8740 .dv-payment-calculator * { 8741 box-sizing: border-box; 8742 } 8743 .dv-payment-calculator .dv-payment-calculator-container { 8744 display: block; 8745 } 8746 .dv-payment-calculator .dv-payment-calculator-container .dv-payment-calculator-calc { 8747 background: #fff; 8748 padding: 0 50px; 8749 } 8750 @media screen and (max-width: 768px) { 8751 .dv-payment-calculator .dv-payment-calculator-container .dv-payment-calculator-calc { 8752 margin-bottom: 50px; 8753 } 8754 } 8755 .dv-payment-calculator .dv-payment-calculator-container .dv-payment-calculator-col { 8756 width: 100%; 8757 } 8758 .dv-payment-calculator .dv-payment-calculator-wrapper { 8759 display: -webkit-box; 8760 display: flex; 8761 width: 100%; 8762 } 8763 .dv-payment-calculator .dv-payment-calculator-results .dv-payment-calculator-wrapper { 8764 padding: 0 50px; 8765 } 8766 .dv-payment-calculator .dv-payment-calculator-wrapper .dv-payment-calculator-col-12 { 8767 width: 100%; 8768 -webkit-box-flex: 1; 8769 flex: 1 1 100%; 8770 } 8771 .dv-payment-calculator .dv-payment-calculator-wrapper .dv-payment-calculator-col-8 { 8772 width: 66.66666667%; 8773 -webkit-box-flex: 1; 8774 flex: 1 1 66.66666667%; 8775 } 8776 .dv-payment-calculator .dv-payment-calculator-wrapper .dv-payment-calculator-col-6 { 8777 margin: 0px 25px 0 0; 8778 width: calc(1 / 2 * 100% - (1 - 1 / 2) * 25px); 8779 -webkit-box-flex: 1; 8780 flex: 1 1 calc(1 / 2 * 100% - (1 - 1 / 2) * 25px); 8781 } 8782 .dv-payment-calculator .dv-payment-calculator-wrapper .dv-payment-calculator-col-6:nth-child(2n) { 8783 margin-right: 0; 8784 } 8785 .dv-payment-calculator .dv-payment-calculator-wrapper .dv-payment-calculator-col-4 {
8786 width: 33.33333%; 8787 -webkit-box-flex: 1; 8788 flex: 1 1 33.33333%; 8789 } 8790 .dv-payment-calculator .dv-payment-calculator-wrapper .dv-payment-calculator-col-3 { 8791 width: 25%; 8792 -webkit-box-flex: 1; 8793 flex: 1 1 25%; 8794 margin: 0 25px; 8795 } 8796 .dv-payment-calculator .dv-payment-calculator-input-group { 8797 position: relative; 8798 margin: 25px 0; 8799 } 8800 .dv-payment-calculator .dv-payment-calculator-input-group label { 8801 display: block; 8802 padding: 0 0 10px 0; 8803 font-size: 16px; 8804 color: #879099; 8805 font-weight: 500; 8806 width: 100%; 8807 } 8808 .dv-payment-calculator .dv-payment-calculator-input-group label #dv-payment-calculator-range-value { 8809 display: block; 8810 float: right; 8811 margin: 0; 8812 } 8813 .dv-payment-calculator .dv-payment-calculator-input-group .dv-payment-calculator-range-list { 8814 display: -webkit-box; 8815 display: flex; 8816 width: 100%; 8817 -webkit-box-pack: justify; 8818 justify-content: space-between; 8819 margin-top: 0px; 8820 padding-top: 0px; 8821 } 8822 .dv-payment-calculator .dv-payment-calculator-input-group .dv-payment-calculator-range-list option { 8823 width: 3ex; 8824 display: -webkit-box; 8825 display: flex; 8826 -webkit-box-pack: center; 8827 justify-content: center; 8828 height: 42px; 8829 -webkit-box-align: end; 8830 align-items: end; 8831 height: 4ex; 8832 } 8833 .dv-payment-calculator .dv-payment-calculator-input-group .dv-payment-calculator-range-list option:before { 8834 content: attr(value); 8835 font-size: 12px; 8836 color: rgba(0,0,0,0.32); 8837 display: block; 8838 } 8839 .dv-payment-calculator .dv-payment-calculator-input-group input { 8840 border: none; 8841 border-bottom: 1px solid #e1e6eb; 8842 padding-left: 15px; 8843 color: #879099; 8844 padding: 5px 5px 5px 25px; 8845 font-size: 14px; 8846 font-family: inherit; 8847 outline: none; 8848 line-height: 1; 8849 width: 100%; 8850 } 8851 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range] { 8852 padding: 10px 0 0 0; 8853 border-bottom: 0; 8854 -webkit-appearance: none; 8855 -moz-appearance: none; 8856 margin: 10px 0 0 0; 8857 width: 100%; 8858 } 8859 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]:focus { 8860 outline: none; 8861 } 8862 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]:focus::-webkit-slider-runnable-track { 8863 background: #2fd566; 8864 } 8865 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]:focus::-ms-fill-lower { 8866 background: #2fd566; 8867 } 8868 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]:focus::-ms-fill-upper { 8869 background: #2fd566; 8870 } 8871 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]::-webkit-slider-runnable-track { 8872 width: 100%; 8873 height: 5px; 8874 cursor: pointer; 8875 animate: 0.2s; 8876 box-shadow: 0px 0px 0px #000; 8877 background: #2fd566; 8878 border-radius: 1px; 8879 border: 0px solid #000; 8880 } 8881 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]::-webkit-slider-thumb { 8882 box-shadow: 0px 0px 0px #000; 8883 border: 1px solid #171a1d; 8884 height: 18px; 8885 width: 18px; 8886 border-radius: 25px; 8887 background: #fff; 8888 cursor: pointer; 8889 -webkit-appearance: none; 8890 margin-top: -7px; 8891 } 8892 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]::-moz-range-track { 8893 width: 100%; 8894 height: 5px; 8895 cursor: pointer; 8896 animate: 0.2s; 8897 box-shadow: 0px 0px 0px #000; 8898 background: #2fd566; 8899 border-radius: 1px; 8900 border: 0px solid #000; 8901 } 8902 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]::-moz-range-thumb { 8903 box-shadow: 0px 0px 0px #000; 8904 border: 1px solid #171a1d; 8905 height: 18px; 8906 width: 18px; 8907 border-radius: 25px; 8908 background: #fff; 8909 cursor: pointer; 8910 } 8911 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]::-ms-track { 8912 width: 100%; 8913 height: 5px; 8914 cursor: pointer; 8915 animate: 0.2s; 8916 background: transparent; 8917 border-color: transparent; 8918 color: transparent; 8919 } 8920 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]::-ms-fill-lower { 8921 background: #2fd566; 8922 border: 0px solid #000; 8923 border-radius: 2px; 8924 box-shadow: 0px 0px 0px #000; 8925 } 8926 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]::-ms-fill-upper { 8927 background: #2fd566; 8928 border: 0px solid #000; 8929 border-radius: 2px; 8930 box-shadow: 0px 0px 0px #000; 8931 } 8932 .dv-payment-calculator .dv-payment-calculator-input-group input[type=range]::-ms-thumb {
8933 margin-top: 1px; 8934 box-shadow: 0px 0px 0px #000; 8935 border: 1px solid #171a1d; 8936 height: 18px; 8937 width: 18px; 8938 border-radius: 25px; 8939 background: #fff; 8940 cursor: pointer; 8941 } 8942 .dv-payment-calculator .dv-payment-calculator-input-group span { 8943 position: absolute; 8944 left: 0; 8945 bottom: 11px; 8946 color: #879099; 8947 font-size: 14px; 8948 line-height: 1; 8949 } 8950 .dv-payment-calculator .dv-payment-calculator-results { 8951 background: #141518; 8952 padding-bottom: 25px; 8953 } 8954 .dv-payment-calculator .dv-payment-calculator-results .dv-payment-calculator-results-header { 8955 padding: 25px 50px; 8956 } 8957 .dv-payment-calculator .dv-payment-calculator-results p { 8958 font-size: 18px; 8959 color: #fff; 8960 margin: 0; 8961 } 8962 .dv-payment-calculator .dv-payment-calculator-results .dv-payment-calculator-col-3 { 8963 margin: 0; 8964 } 8965 .dv-payment-calculator .dv-payment-calculator-results .dv-payment-calculator-input-group { 8966 margin-top: 0; 8967 margin-bottom: 0; 8968 } 8969 .dv-payment-calculator .dv-payment-calculator-results .dv-payment-calculator-input-group label { 8970 font-size: 10px; 8971 font-weight: bold; 8972 padding-bottom: 5px; 8973 } 8974 .dv-payment-calculator .dv-payment-calculator-results .dv-payment-calculator-input-group p { 8975 background: transparent; 8976 color: #fff; 8977 border-bottom: none; 8978 font-size: 20px; 8979 font-weight: 600; 8980 letter-spacing: 1px; 8981 font-family: inherit; 8982 margin: 0; 8983 } 8984 @media screen and (max-width: 768px) { 8985 .dv-payment-calculator .dv-payment-calculator-wrapper { 8986 display: block; 8987 } 8988 .dv-payment-calculator .dv-payment-calculator-wrapper [class*='dv-payment-calculator-col'] { 8989 width: 100%; 8990 -webkit-box-flex: 1; 8991 flex: 1 1 100%; 8992 } 8993 } 8994 @media screen and (max-width: 768px) { 8995 .dv-payment-calculator .dv-payment-calculator-wrapper { 8996 font-size: 0; 8997 } 8998 .dv-payment-calculator .dv-payment-calculator-wrapper .dv-payment-calculator-col-3 { 8999 font-size: 0; 9000 display: inline-block; 9001 width: 50%; 9002 } 9003 .dv-payment-calculator .dv-payment-calculator-wrapper [class*='dv-payment-calculator-col'] { 9004 margin-bottom: 25px; 9005 } 9006 .dv-payment-calculator .dv-payment-calculator-wrapper [class*='dv-payment-calculator-col']:last-child { 9007 margin-bottom: 0; 9008 } 9009 } 9010 9011 </style> 9012 9013 <div class="dv-payment-calculator"> 9014 <div class="dv-payment-calculator-container"> 9015 <div class="dv-payment-calculator-col"> 9016 <h2>Payment Calculator</h2> 9017 <div class="dv-payment-calculator-calc"> 9018 <div class="dv-payment-calculator-wrapper"> 9019 <div class="dv-payment-calculator-col-6"> 9020 <div class="dv-payment-calculator-input-group"> 9021 <label for="Purchase Price">Purchase Price</label>
9022 <span>$</span> 9023 <input type="text" value="0" id="carPrice" placeholder="0" onChange="calculate()" tabindex="2" onkeypress="return (event.charCode !=8 && event.charCode ==0 || ( event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)))"> 9024 </div> 9025 <div class="dv-payment-calculator-input-group"> 9026 <label for="Tax Rate">Tax Rate</label> 9027 <span>%</span> 9028 <input type="text" id="taxRate" value="6" placeholder="0" onChange="calculate()" tabindex="4" onkeypress="return (event.charCode !=8 && event.charCode ==0 || ( event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)))"> 9029 </div> 9030 <div class="dv-payment-calculator-input-group"> 9031 <label for="APR">APR</label> 9032 <span>%</span> 9033 <input type="text" value="5.99" id="intRate" placeholder="0" onChange="calculate()" tabindex="6" onkeypress="return (event.charCode !=8 && event.charCode ==0 || ( event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)))"> 9034 </div> 9035 </div> 9036 <div class="dv-payment-calculator-col-6"> 9037 <div class="dv-payment-calculator-input-group"> 9038 <label for="Trade-in Value">Trade-in Value</label> 9039 <span>$</span> 9040 <input type="text" value="0" id="tradeValue" placeholder="0" onChange="calculate()" tabindex="3" onkeypress="return (event.charCode !=8 && event.charCode ==0 || ( event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)))"> 9041 </div> 9042 <div class="dv-payment-calculator-input-group"> 9043 <label for="Trade-in Payoff Amount">Trade-in Payoff Amount</label> 9044 <span>$</span> 9045 <input type="text" value="0" id="tradePayoff" placeholder="0" onChange="calculate()" tabindex="4" onkeypress="return (event.charCode !=8 && event.charCode ==0 || ( event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)))"> 9046 </div> 9047 <div class="dv-payment-calculator-input-group"> 9048 <label for="Down Payment">Down Payment</label> 9049 <span>$</span> 9050 <input type="text" value="0" id="downPay" placeholder="0" onChange="calculate()" tabindex="5" onkeypress="return (event.charCode !=8 && event.charCode ==0 || ( event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)))"> 9051 </div> 9052 </div> 9053 </div> 9054 <div class="dv-payment-calculator-input-group"> 9055 <label for="Loan Term">Loan Term <p id="dv-payment-calculator-range-value"></p></label> 9056 <input type="range" value="72" step="12" min="12" max="84" list="dv-range-list-options" id="termRate" class="dv-payment-calculator-range-input" onChange="calculate()" tabindex="7"> 9057 9058 <datalist class="dv-payment-calculator-range-list" id="dv-range-list-options"> 9059 <option value="12"> </option> 9060 <option value="24"> </option> 9061 <option value="36"> </option> 9062 <option value="48"> </option> 9063 <option value="60"> </option> 9064 <option value="72"> </option> 9065 <option value="84"> </option> 9066 </datalist> 9067 </div> 9068 </div> 9069 </div> 9070 <div class="dv-payment-calculator-col"> 9071 <div class="dv-payment-calculator-results"> 9072 <div class="dv-payment-calculator-results-header"> 9073 <p>Payment Options</p> 9074 </div> 9075 <div class="dv-payment-calculator-wrapper"> 9076 <div class="dv-payment-calculator-col-3"> 9077 <div class="dv-payment-calculator-input-group"> 9078 <label for="Monthly Payment">Monthly Payment</label> 9079 <p id="result">$0.00</p> 9080 </div> 9081 </div> 9082 <div class="dv-payment-calculator-col-3"> 9083 <div class="dv-payment-calculator-input-group"> 9084 <label for="Bi-Weekly Payment">Bi-Weekly Payment</label> 9085 <p id="result0">$0.00</p> 9086 </div> 9087 </div> 9088 <div class="dv-payment-calculator-col-3"> 9089 <div class="dv-payment-calculator-input-group"> 9090 <label for="Weekly Payment">Weekly Payment</label> 9091 <p id="result2">$0.00</p> 9092 </div> 9093 </div> 9094 <div class="dv-payment-calculator-col-3"> 9095 <div class="dv-payment-calculator-input-group"> 9096 <label for="Total Amount Financed">Total Amount Financed</label> 9097 <p id="principal">$0.00</p> 9098 </div> 9099 </div> 9100 </div> 9101 <div class="dv-payment-calculator-wrapper"> 9102 <div class="dv-payment-calculator-col-3"> 9103 <div class="dv-payment-calculator-input-group"> 9104 <label for="Total Amount Down">Total Amount Down</label> 9105 <p id="totalAmountDown">$0.00</p> 9106 </div> 9107 </div> 9108 </div> 9109 </div> 9110 </div> 9111 </div> 9112 <div class="dv-calculator-disclaimer"> 9113 <p>*Calculated payments are estimated. Title and other fees and incentives may not be included in this calculation, which is an estimate only. Monthly payment estimates are for informational purpose and do not represent a financing offer from the seller of this vehicle. Other taxes may apply. Please complete a finance application for rates that you qual
9113ify for.</p> 9114 </div> 9115 </div> 9116
9116<script> 9117 $(function () { 9118 // Term Range Selector 9119 var PaymentCalcRange = function () { 9120 var SliderValueHTML = $("#dv-payment-calculator-range-value"); 9121 var Slider = $(".dv-payment-calculator-range-input"); 9122 SliderValueHTML.html(Slider.val() + " mo"); 9123 $(document).on("input", ".dv-payment-calculator-range-input", function () { 9124 SliderValueHTML.html($(this).val() + " mo"); 9125 }); 9126 }; 9127 PaymentCalcRange(); 9128 calculate(); 9129 }); 9130 9131 function calculate() { 9132 //Get the values of all of elements, convert the strings into ints, create decimals for values that are percentages. 9133 var carPrice = parseFloat( 9134 document.getElementById("carPrice").value.replace(/\$|,/g, "") 9135 ) || 0; 9136 var taxRate = (parseFloat(document.getElementById("taxRate").value) || 0) / 100; 9137 var tradeValue = parseFloat( 9138 document.getElementById("tradeValue").value.replace(/\$|,/g, "") 9139 ) || 0; 9140 var tradePayoff = parseFloat( 9141 document.getElementById("tradePayoff").value.replace(/\$|,/g, "") 9142 ) || 0; 9143 var downPay = parseFloat( 9144 document.getElementById("downPay").value.replace(/\$|,/g, "") 9145 ) || 0; 9146 var intRate = parseFloat(document.getElementById("intRate").value) || 0; 9147 var termRate = parseFloat(document.getElementById("termRate").value); 9148 9149 //Calculate the principal 9150 // Trade-in equity offsets the down payment; the combined amount is subtracted once. 9151 var taxAmount = carPrice * taxRate; 9152 var carWithTax = carPrice + taxAmount; 9153 var tradeEquity = parseFloat((tradeValue - tradePayoff).toFixed(2)); 9154 var totalAmountDown = parseFloat((downPay + tradeEquity).toFixed(2)); 9155 var carPrincipal = (carWithTax - totalAmountDown).toFixed(2); 9156 var intMonth = (intRate/100) / 12; 9157 9158 // Calculate Monthly/Bi-Weekly/Weekly Payments 9159 var monthly = 9160 intMonth === 0 9161 ? parseInt(carPrincipal / termRate).toFixed(2) 9162 : interest(carPrincipal, intMonth, termRate); 9163 var biWeekly = parseFloat(monthly / 2).toFixed(2); 9164 var weekly = parseFloat(monthly / 4).toFixed(2); 9165 9166 //Update the principal element with the new value. 9167 var carPrincipalFormatted = carPrincipal < 0 9168 ? "-$" + numberWithCommas(Math.abs(carPrincipal).toFixed(2).toString()) 9169 : "$" + numberWithCommas(carPrincipal.toString()); 9170 document.getElementById("principal").innerHTML = carPrincipalFormatted; 9171 9172 //Set the final calculated payment to the result element. 9173 document.getElementById("result").innerHTML = "$" + monthly; 9174 document.getElementById("result0").innerHTML = "$" + biWeekly; 9175 document.getElementById("result2").innerHTML = "$" + weekly; 9176 9177 var totalAmountDownFormatted = totalAmountDown < 0 9178 ? "-$" + numberWithCommas(Math.abs(totalAmountDown).toFixed(2).toString()) 9179 : "$" + numberWithCommas(totalAmountDown.toFixed(2).toString()); 9180 document.getElementById("totalAmountDown").innerHTML = totalAmountDownFormatted; 9181 } 9182 9183 function numberWithCommas(x) { 9184 return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); 9185 } 9186 9187 function interest(principal, intRate, term) { 9188 var int1 = 1 + intRate; 9189 var intEx = int1 * int1; 9190 for (var i = 0; i < term - 2; i++) { 9191 intEx = intEx * int1; 9192 } 9193 var intEx1 = intEx - 1; 9194 var intEx2 = intRate / intEx1; 9195 var intEx3 = intEx2 + intRate; 9196 var pay = intEx3 * principal; 9197 return pay.toFixed(2); 9198 } 9199 9200 </script>
9200 9201 </div> 9202 </div> 9203 </div> <!-- cd-panel__content --> 9204 </div> <!-- cd-panel__container --> 9205 <div class="cd-panel__otherside"> 9206 </div> 9207</div> <!-- cd-panel --> 9208 <footer> 9209 <!-- sub-footer --> 9210<div class="row"> 9211 <div class="footer_top" 9212 style="background: linear-gradient(rgba(0,0,0,0.7), rgba(0,0,0,0.7)), url(); background-position:center center; background-size: cover;"> 9213 <div class="footer_container"> 9214 <div class="row footer-links"> 9215 9216 <div class="foot3 footer-soc-icons footer-bar1"> 9217 <div id="footer-sidebar1"> 9218 <h5>Stay Connected</h5> 9219<a href="https://www.facebook.com/BrewerAirportToyota/" target='_blank'><i class="fab fa-facebook fa-2x" style="color:#3C5A99;"></i></a> 9220<a href="https://twitter.com/BrewerToyota" target='_blank'><i class="fa-brands fa-x-twitter fa-2x" style="color:#FFF;"></i></a> 9221<!--<a href="" target='_blank'><i class="fab fa-instagram fa-2x" style="color:#C13584;"></i></a> 9222<a href="" target='_blank'><i class="fab fa-youtube fa-2x" style="color:#FF0000;"></i></a>--> 9223 9224<!--<h5>Stay Connected</h5> 9225<a href="/facebook/" data-lity><i class="fab fa-facebook-f fa-2x" style="color:#3C5A99;"></i></a> 9226<a href="/twitter/" data-lity><i class="fab fa-twitter fa-2x" style="color:#1DA1F2;"></i></a> 9227<a href="/instagram/" data-lity><i class="fab fa-instagram fa-2x" style="color:#C13584;"></i></a> 9228<a href="/youtube/" data-lity><i class="fab fa-youtube fa-2x" style="color:#FF0000;"></i></a>--> </div> 9229 </div> 9230 9231 <div class="foot3 footer-middle-sec"> 9232 <div id="footer-sidebar2"> 9233 <h5>Call Us</h5> 9234<a data-ag-event="clickToCall" data-ag-event-set-prop="clickToCallDepartment|Sales" href="tel:412.265.4743" class="telephone">412.265.4743</a> 9235<div> 9236<h5>Get Directions</h5> 9237<a data-ag-event="getDirections" target="_blank" href="https://maps.app.goo.gl/1J7BChWkZVkUyzg67"><span class='dealer-full-address'><span>8900 University Blvd </span><span> </span><span></span><span>Moon Township, </span><span>PA </span><span>15108 </span></span></a> 9238</div> </div> 9239 </div> 9240 9241 <div class="foot3 quicklinks"> 9242 <h5>Quick Links</h5> 9243 <div id="footer-sidebar3"> 9244 <aside id="nav_menu-2" class="widget widget_nav_menu"><div class="menu-quick-links-container"><ul id="menu-quick-links" class="menu"><li id="menu-item-76742" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-76742"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/" class="menu-image-title-after"><span class="menu-image-title">Home</span></a></li> 9245<li id="menu-item-76763" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-76763"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="/service/" class="menu-image-title-after"><span class="menu-image-title">Service Center</span></a></li> 9246<li id="menu-item-76762" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-76762"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/about/" class="menu-image-title-after"><span class="menu-image-title">About Us</span></a></li> 9247<li id="menu-item-76743" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-16 current_page_item menu-item-76743"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/new-vehicles/" class="menu-image-title-after"><span class="menu-image-title">New Vehicles</span></a></li> 9248<li id="menu-item-77508" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-77508"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/service/schedule-service/" class="menu-image-title-after"><span class="menu-image-title">Schedule Service</span></a></li> 9249<li id="menu-item-76746" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-76746"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/contact/" class="menu-image-title-after"><span class="menu-image-title">Contact Us</span></a></li> 9250<li id="menu-item-77509" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-77509"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="/new-vehicles/?flags.type=Special" class="menu-image-title-after"><span class="menu-image-title">New Vehicle Specials</span></a></li> 9251<li id="menu-item-76747" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-76747"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/finance/" class="menu-image-title-after"><span class="menu-image-title">Finance Center</span></a></li> 9252<li id="menu-item-77510" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-77510"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/hours-and-directions/" class="menu-image-title-after"><span class="menu-image-title">Hours & Directions</span></a></li> 9253<li id="menu-item-76744" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-76744"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/used-vehicles/" class="menu-image-title-after"><span class="menu-image-title">Pre-Owned Vehicles</span></a></li> 9254<li id="menu-item-77511" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-77511"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/finance/finance-application/" class="menu-image-title-after"><span class="menu-image-title">Finance Application</span></a></li> 9255<li id="menu-item-76767" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-76767"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/meet-the-team/" class="menu-image-title-after"><span class="menu-image-title">Meet The Team</span></a></li> 9256<li id="menu-item-76764" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-76764"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="/parts/" class="menu-image-title-after"><span class="menu-image-title">Parts Center</span></a></li> 9257<li id="menu-item-76765" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-76765"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="/value-trade/" class="menu-image-title-after"><span class="menu-image-title">Value Your Trade</span></a></li> 9258<li id="menu-item-76748" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy menu-item-76748"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/privacy-policy/" class="menu-image-title-after"><span class="menu-image-title">Privacy Policy</span></a></li> 9259<li id="menu-item-77512" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-77512"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" href="https://www.brewerairporttoyota.com/vehicle-finder-service/" class="menu-image-title-after"><span class="menu-image-title">Vehicle Finder Service</span></a></li> 9260<li id="menu-item-76766" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-76766"><a data-ag-event="menu_interaction" style="" data-element_type="new-vehicles" target="_blank" href="https://www.toyota.com/recall/" class="menu-image-title-after"><span class="menu-image-title">Safety Recalls & Service Campaigns</span></a></li> 9261</ul></div></aside> </div> 9262 </div> 9263 </div> 9264 9265 <div class="row"> 9266 <div class="footer_bottom-light" 9267 > 9268 <div class="footer-powered-container"> 9269 <div class="footer-copyright"> 9270 <h6><p>© 2026 Brewer Airport Toyota. </p> 9271 <a href="/sitemap.xml">Sitemap</a> <p>|</p> 9272 <a href="/privacy-policy/">Privacy Policy</a> 9273 </h6> 9274 </div> 9275 <div class="footer-powered"> 9276 <h6> 9277 <p>Advanced Automotive Websites By</p> 9278 <a href="https://dealeralchemist.com" target="_blank"> 9279 <h6>Dealer Alchemist</h6> 9280 </a> 9281 </h6> 9282 </div> 9283 </div> 9284 </div> 9285 </div> 9286 </div> 9287 </div> 9288</div> 9289 9290<style>table.mabel-bhi-businesshours tr.mbhi-is-current {
9291background: #E9E9E9; 9292} 9293 9294.dv-alertbar { 9295 display: flex !important; 9296 top: 0 !important; 9297} 9298</style><!-- DV Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 9298-9299
9298 9299<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
9299GTM-P288V3RS
vendor: 91 bytes, lines 9299-9300
9299" height="0" width="0" 9300 style="display:none;visibility:hidden"></iframe></noscript>
9301<!-- DV End Google Tag Manager (noscript) --> 9302
9303<script type='text/javascript' src='https://www.brewerairporttoyota.com/wp/wp-includes/js/jquery/jquery.min.js?ver=3.6.0' id='jquery-core-js'></script>
vendor: 1 bytes, line 9303
9303
9304<script type='text/javascript' id='wp-api-request-js-extra'> 9305/* <![CDATA[ */ 9306var wpApiSettings = {"root":"https:\/\/www.brewerairporttoyota.com\/wp-json\/","nonce":"aa9508e6a2","versionString":"wp\/v2\/"}; 9307/* ]]> */ 9308</script>
vendor: 1 bytes, line 9308
9308
9309<script type='text/javascript' src='https://www.brewerairporttoyota.com/wp/wp-includes/js/api-request.min.js?ver=5.9.5' id='wp-api-request-js'></script>
vendor: 1 bytes, line 9309
9309
9310<script type='text/javascript' id='mabel-business-hours-indicator-pro-js-extra'> 9311/* <![CDATA[ */ 9312var mabel_script_vars = {"ajaxurl":"https:\/\/www.brewerairporttoyota.com\/wp\/wp-admin\/admin-ajax.php","locations":[{"Name":"Parts","Timezone":"America\/New_York","Type":"AutoPartsStore","Days":[{"Day":"Monday","Hours":[{"From":"7:00","To":"7:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Tuesday","Hours":[{"From":"7:00","To":"7:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Wednesday","Hours":[{"From":"7:00","To":"7:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Thursday","Hours":[{"From":"7:00","To":"7:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Friday","Hours":[{"From":"7:00","To":"5:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Saturday","Hours":[{"From":"7:30","To":"4:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Sunday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]}],"Holidays":[],"Vacations":[]},{"Name":"Collision Center","Timezone":"America\/New_York","Type":"AutoBodyShop","Days":[{"Day":"Monday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Tuesday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Wednesday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Thursday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Friday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Saturday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Sunday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]}],"Holidays":[],"Vacations":[]},{"Name":"Sales","Timezone":"America\/New_York","Type":"AutoDealer","Days":[{"Day":"Monday","Hours":[{"From":"9:00","To":"8:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Tuesday","Hours":[{"From":"9:00","To":"8:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Wednesday","Hours":[{"From":"9:00","To":"8:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Thursday","Hours":[{"From":"9:00","To":"8:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Friday","Hours":[{"From":"9:00","To":"6:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Saturday","Hours":[{"From":"9:00","To":"5:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Sunday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]}],"Holidays":[],"Vacations":[],"Image":""},{"Name":"Service","Timezone":"America\/New_York","Type":"AutoRepair","Days":[{"Day":"Monday","Hours":[{"From":"7:00","To":"7:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Tuesday","Hours":[{"From":"7:00","To":"7:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Wednesday","Hours":[{"From":"7:00","To":"7:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Thursday","Hours":[{"From":"7:00","To":"7:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Friday","Hours":[{"From":"7:00","To":"5:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Saturday","Hours":[{"From":"7:30","To":"4:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Sunday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]}],"Holidays":[],"Vacations":[],"Image":""},{"Name":"Rental","Timezone":"America\/New_York","Type":"AutoRental","Days":[{"Day":"Monday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Tuesday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Wednesday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Thursday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Friday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Saturday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Sunday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]}],"Holidays":[],"Vacations":[],"Image":""},{"Name":"Dealership","Timezone":"America\/New_York","Type":"LocalBusiness","Days":[{"Day":"Monday","Hours":[{"From":"7:00","To":"8:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Tuesday","Hours":[{"From":"7:00","To":"8:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Wednesday","Hours":[{"From":"7:00","To":"8:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Thursday","Hours":[{"From":"7:00","To":"8:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Friday","Hours":[{"From":"7:00","To":"6:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Saturday","Hours":[{"From":"7:30","To":"5:00","ToIndication":"PM","FromIndication":"AM"}]},{"Day":"Sunday","Hours":[{"From":"0","To":"0","ToIndication":"PM","FromIndication":"AM"}]}],"Holidays":[],"Vacations":[],"Image":""}],"settings":{"dayentryseparator":" ","time_format":"12","warning":"45","warningclosing":"45","removezeroes":true,"includetime":false,"includeday":false,"approximation":true,"loading":"Welcome!","timezone":"America\/New_York"},"i18n":{"days":{"Monday":"Monday","Tuesday":"Tuesday","Wednesday":"Wednesday","Thursday":"Thursday","Frid
9312ay":"Friday","Saturday":"Saturday","Sunday":"Sunday"},"days_short":{"Monday":"Mon","Tuesday":"Tue","Wednesday":"Wed","Thursday":"Thu","Friday":"Fri","Saturday":"Sat","Sunday":"Sun"},"months":{"January":"January","February":"February","March":"March","April":"April","May":"May","June":"June","July":"July","August":"August","September":"September","October":"October","November":"November","December":"December"},"months_short":{"Jan":"Jan","Feb":"Feb","Mar":"Mar","Apr":"Apr","May":"May","Jun":"Jun","Jul":"Jul","Aug":"Aug","Sep":"Sept","Oct":"Oct","Nov":"Nov","Dec":"Dec"},"day":"day","days_text":"days","hour":"hour","hours":"hours","minute":"minute","minutes":"minutes","closed":"Closed"}}; 9313/* ]]> */ 9314</script>
vendor: 1 bytes, line 9314
9314
9315<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/plugins/mabel-business-hours-indicator-pro/public/js/public.js?ver=3.3.9' id='mabel-business-hours-indicator-pro-js'></script>
vendor: 1 bytes, line 9315
9315
9316<script type='text/javascript' id='dds-scripts-js-extra'> 9317/* <![CDATA[ */ 9318var get_dds_data = {"ajax_url":"https:\/\/www.brewerairporttoyota.com\/wp\/wp-admin\/admin-ajax.php"}; 9319/* ]]> */ 9320</script>
vendor: 1 bytes, line 9320
9320
9321<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/themes/dv-framework/shortcodes/dropdown-search/dropdown-search.js?ver=1.620.828' id='dds-scripts-js'></script>
vendor: 1 bytes, line 9321
9321
9322<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/themes/dv-framework/shortcodes/searchbox/searchbox.js?ver=1.533.837' id='dv-searchbox-scripts-js'></script>
vendor: 1 bytes, line 9322
9322
9323<script type='text/javascript' id='platform-shadow-js-after'> 9324(function () { 9325 function hydrate() { 9326 // Only act on hosts we mark, and only when the shadow root isn't already present. 9327 var hosts = document.querySelectorAll('.platform-linked-content[data-platform-shadow="1"]'); 9328 for (var i = 0; i < hosts.length; i++) { 9329 var host = hosts[i]; 9330 if (host.shadowRoot || !host.attachShadow) continue; 9331 9332 var t = host.querySelector('template[shadowrootmode]'); 9333 if (!t) continue; 9334 9335 var mode = t.getAttribute('shadowrootmode') || 'open'; 9336 var root = host.attachShadow({ mode: mode }); 9337 9338 root.appendChild(t.content.cloneNode(true)); 9339 t.remove(); 9340 } 9341 } 9342 9343 if (document.readyState === 'loading') { 9344 document.addEventListener('DOMContentLoaded', hydrate); 9345 } else { 9346 hydrate(); 9347 } 9348})(); 9349</script>
vendor: 1 bytes, line 9349
9349
9350<script type='text/javascript' id='da-merge-tags-js-extra'> 9351/* <![CDATA[ */ 9352var daMergeTags = {"timezone":"America\/New_York"}; 9353/* ]]> */ 9354</script>
vendor: 1 bytes, line 9354
9354
9355<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/themes/dv-framework/components/Utils/merge-tags.min.js?ver=1.784.48' id='da-merge-tags-js'></script>
vendor: 1 bytes, line 9355
9355
9356<script type='text/javascript' id='get_srp_form-js-extra'> 9357/* <![CDATA[ */ 9358var get_srp_form = {"ajax_url":"https:\/\/www.brewerairporttoyota.com\/wp\/wp-admin\/admin-ajax.php"}; 9359/* ]]> */ 9360</script>
vendor: 1 bytes, line 9360
9360
9361<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/srp-ajax.js?ver=1.776.838' id='get_srp_form-js'></script>
vendor: 1 bytes, line 9361
9361
9362<script type='text/javascript' id='script-ga4-js-extra'> 9363/* <![CDATA[ */ 9364var AGEventManagerOptions = {"debug":"","trackingIDs":["G-PZJ9P58581","G-M3B4B59Q4Z"]}; 9365/* ]]> */ 9366</script>
vendor: 1 bytes, line 9366
9366
9367<script type="module" src="https://www.brewerairporttoyota.com/app/themes/dv-framework/components/EventsManager/public/latest.js?ver=1790226195"></script>
9367<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/plugins/gravityforms/js/jquery.maskedinput.min.js?ver=2.4.6' id='gform_masked_input-js'></script>
vendor: 1 bytes, line 9367
9367
9368<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/plugins/gravityforms/js/placeholders.jquery.min.js?ver=2.4.6' id='gform_placeholder-js'></script>
9368 9369 <div class="ag-kia-window-sticker-modal" data-kia-window-sticker-modal aria-hidden="true"> 9370 <div class="ag-kia-window-sticker-modal__backdrop" data-kia-window-sticker-close></div> 9371 <div class="ag-kia-window-sticker-modal__dialog" role="dialog" aria-modal="true" aria-label="Factory Window Sticker"> 9372 <button class="ag-kia-window-sticker-modal__close" type="button" data-kia-window-sticker-close aria-label="Close window sticker">×</button> 9373 <iframe class="ag-kia-window-sticker-modal__iframe" data-kia-window-sticker-frame title="Factory Window Sticker"></iframe> 9374 </div> 9375 </div> 9376 <style> 9377 .ag-kia-window-sticker-modal { 9378 position: fixed; 9379 z-index: 999999; 9380 top: 0; 9381 right: 0; 9382 bottom: 0; 9383 left: 0; 9384 display: none; 9385 } 9386 .ag-kia-window-sticker-modal.is-open { 9387 display: block; 9388 } 9389 .ag-kia-window-sticker-modal__backdrop { 9390 position: absolute; 9391 top: 0; 9392 right: 0; 9393 bottom: 0; 9394 left: 0; 9395 background: rgba(0, 0, 0, 0.72); 9396 } 9397 .ag-kia-window-sticker-modal__dialog { 9398 position: absolute; 9399 top: 50%; 9400 left: 50%; 9401 width: 82vw; 9402 max-width: 1560px; 9403 height: 88vh; 9404 max-height: 980px; 9405 transform: translate(-50%, -50%); 9406 background: #fff; 9407 box-shadow: 0 18px 48px rgba(0, 0, 0, 0.35); 9408 } 9409 .ag-kia-window-sticker-modal__close { 9410 position: absolute; 9411 z-index: 1; 9412 top: 8px; 9413 right: 10px; 9414 width: 34px; 9415 height: 34px; 9416 border: 0; 9417 border-radius: 50%; 9418 background: #222; 9419 color: #fff; 9420 font-size: 26px; 9421 line-height: 30px; 9422 cursor: pointer; 9423 } 9424 .ag-kia-window-sticker-modal__iframe { 9425 width: 100%; 9426 height: 100%; 9427 border: 0; 9428 } 9429 body.ag-kia-window-sticker-modal-open { 9430 overflow: hidden; 9431 } 9432 @media (max-width: 767px) { 9433 .ag-kia-window-sticker-modal__dialog { 9434 width: calc(100vw - 20px); 9435 height: calc(100vh - 20px); 9436 max-height: none; 9437 } 9438 } 9439 </style> 9440
9440<script> 9441 (function () { 9442 var modal = document.querySelector('[data-kia-window-sticker-modal]'); 9443 var frame = document.querySelector('[data-kia-window-sticker-frame]'); 9444 var activeTrigger = null; 9445 9446 if (!modal || !frame) { 9447 return; 9448 } 9449 9450 function open(url, trigger) { 9451 activeTrigger = trigger || null; 9452 frame.setAttribute('src', url); 9453 modal.classList.add('is-open'); 9454 modal.setAttribute('aria-hidden', 'false'); 9455 document.body.classList.add('ag-kia-window-sticker-modal-open'); 9456 } 9457 9458 function close() { 9459 modal.classList.remove('is-open'); 9460 modal.setAttribute('aria-hidden', 'true'); 9461 frame.removeAttribute('src'); 9462 document.body.classList.remove('ag-kia-window-sticker-modal-open'); 9463 9464 if (activeTrigger && typeof activeTrigger.focus === 'function') { 9465 activeTrigger.focus(); 9466 } 9467 } 9468 9469 function closest(element, selector) { 9470 while (element && element !== document) { 9471 if (element.matches && element.matches(selector)) { 9472 return element; 9473 } 9474 9475 element = element.parentNode; 9476 } 9477 9478 return null; 9479 } 9480 9481 window.AutoGoKiaWindowSticker = { 9482 open: open, 9483 close: close 9484 }; 9485 9486 document.addEventListener('click', function (event) { 9487 var link = closest(event.target, '[data-kia-window-sticker-link]'); 9488 9489 if (!link) { 9490 link = closest(event.target, 'a[href*="/kia-window-sticker/"]'); 9491 } 9492 9493 if (link) { 9494 event.preventDefault(); 9495 event.stopImmediatePropagation(); 9496 open(link.href, link); 9497 } 9498 }, true); 9499 9500 document.addEventListener('click', function (event) { 9501 if (!closest(event.target, '[data-kia-window-sticker-close]')) { 9502 return; 9503 } 9504 9505 event.preventDefault(); 9506 close(); 9507 }); 9508 9509 document.addEventListener('keyup', function (event) { 9510 if ((event.key === 'Escape' || event.keyCode === 27) && modal.classList.contains('is-open')) { 9511 close(); 9512 } 9513 }); 9514 })(); 9515 </script>
9515 9516 <!-- HFCM by 99 Robots - Snippet # 8: GTM Footer --> 9517<!-- Google Tag Manager (noscript) -->
vendor: 71 bytes, lines 9517-9518
9517 9518<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
9518GTM-PQJDGJ
vendor: 89 bytes, lines 9518-9519
9518" 9519height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
9520<!-- End Google Tag Manager (noscript) --> 9521<!-- /end HFCM by 99 Robots --> 9522<!-- HFCM by 99 Robots - Snippet # 3: USERway -->
9523<script src="https://cdn.userway.org/widget.js" data-account="SNSTzAU4BD"></script>
9523 9524<!-- /end HFCM by 99 Robots --> 9525<!-- Dealer Alchemist -->
9526<script> 9527 var _paq = window._paq = window._paq || []; 9528 /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ 9529 _paq.push(['trackPageView']); 9530 _paq.push(['enableLinkTracking']); 9531 (function() { 9532 var u="https://analytics.autogo.ai/"; 9533 _paq.push(['setTrackerUrl', u+'js/tracker.php']); 9534 _paq.push(['setSiteId', '340']); 9535 var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; 9536 g.async=true; g.src=u+'js/tracker.php'; s.parentNode.insertBefore(g,s); 9537 })(); 9538</script>
9538 9539<!-- End Dealer Alchemist Code --> 9540
9541<script type="application/ld+json" data-type="generalSchema"> 9542{ 9543 "@context": "https://www.schema.org", 9544 "@type": "AutoDealer", 9545 "@id": "https://www.brewerairporttoyota.com/#brewerairporttoyota", 9546 "priceRange": "$-$$$", 9547 "name": "Brewer Airport Toyota", 9548 "url": "https://www.brewerairporttoyota.com", 9549 "telephone": "412.265.4743", 9550 "image": "https://bucket.dealervenom.com/brewer-airport-toyota/logo.png?auto=compress&format=&ixlib=php-1.2.1&h=50&w=200", 9551 "logo": "https://bucket.dealervenom.com/brewer-airport-toyota/logo.png?auto=compress&format=&ixlib=php-1.2.1&h=50&w=200", 9552 "address": { 9553 "@type": "PostalAddress", 9554 "streetAddress": "8900 University Blvd", 9555 "addressLocality": "Moon Township", 9556 "addressRegion": "PA", 9557 "postalCode": "15108", 9558 "addressCountry": "US" 9559}, 9560 "openingHoursSpecification": [ 9561 { 9562 "@type": "OpeningHoursSpecification", 9563 "dayOfWeek": [ 9564 "Monday", 9565 "Tuesday", 9566 "Wednesday", 9567 "Thursday" 9568 ], 9569 "opens": "07:00", 9570 "closes": "19:00" 9571 }, 9572 { 9573 "@type": "OpeningHoursSpecification", 9574 "dayOfWeek": [ 9575 "Friday" 9576 ], 9577 "opens": "07:00", 9578 "closes": "17:00" 9579 }, 9580 { 9581 "@type": "OpeningHoursSpecification", 9582 "dayOfWeek": [ 9583 "Saturday" 9584 ], 9585 "opens": "07:30", 9586 "closes": "16:00" 9587 }, 9588 { 9589 "@type": "OpeningHoursSpecification", 9590 "dayOfWeek": [ 9591 "Sunday" 9592 ], 9593 "opens": "00:00", 9594 "closes": "12:00" 9595 }, 9596 { 9597 "@type": "OpeningHoursSpecification", 9598 "dayOfWeek": [ 9599 "Monday", 9600 "Tuesday", 9601 "Wednesday", 9602 "Thursday", 9603 "Friday", 9604 "Saturday", 9605 "Sunday" 9606 ], 9607 "opens": "00:00", 9608 "closes": "12:00" 9609 }, 9610 { 9611 "@type": "OpeningHoursSpecification", 9612 "dayOfWeek": [ 9613 "Monday", 9614 "Tuesday", 9615 "Wednesday", 9616 "Thursday" 9617 ], 9618 "opens": "09:00", 9619 "closes": "20:00" 9620 }, 9621 { 9622 "@type": "OpeningHoursSpecification", 9623 "dayOfWeek": [ 9624 "Friday" 9625 ], 9626 "opens": "09:00", 9627 "closes": "18:00" 9628 }, 9629 { 9630 "@type": "OpeningHoursSpecification", 9631 "dayOfWeek": [ 9632 "Saturday" 9633 ], 9634 "opens": "09:00", 9635 "closes": "17:00" 9636 }, 9637 { 9638 "@type": "OpeningHoursSpecification", 9639 "dayOfWeek": [ 9640 "Sunday" 9641 ], 9642 "opens": "00:00", 9643 "closes": "12:00" 9644 }, 9645 { 9646 "@type": "OpeningHoursSpecification", 9647 "dayOfWeek": [ 9648 "Monday", 9649 "Tuesday", 9650 "Wednesday", 9651 "Thursday" 9652 ], 9653 "opens": "07:00", 9654 "closes": "19:00" 9655 }, 9656 { 9657 "@type": "OpeningHoursSpecification", 9658 "dayOfWeek": [ 9659 "Friday" 9660 ], 9661 "opens": "07:00", 9662 "closes": "17:00" 9663 }, 9664 { 9665 "@type": "OpeningHoursSpecification", 9666 "dayOfWeek": [ 9667 "Saturday" 9668 ], 9669 "opens": "07:30", 9670 "closes": "16:00" 9671 }, 9672 { 9673 "@type": "OpeningHoursSpecification", 9674 "dayOfWeek": [ 9675 "Sunday" 9676 ], 9677 "opens": "00:00", 9678 "closes": "12:00" 9679 }, 9680 { 9681 "@type": "OpeningHoursSpecification", 9682 "dayOfWeek": [ 9683 "Monday", 9684 "Tuesday", 9685 "Wednesday", 9686 "Thursday", 9687 "Friday", 9688 "Saturday", 9689 "Sunday" 9690 ], 9691 "opens": "00:00", 9692 "closes": "12:00" 9693 }, 9694 { 9695 "@type": "OpeningHoursSpecification", 9696 "dayOfWeek": [ 9697 "Monday", 9698 "Tuesday", 9699 "Wednesday", 9700 "Thursday" 9701 ], 9702 "opens": "07:00", 9703 "closes": "20:00" 9704 }, 9705 { 9706 "@type": "OpeningHoursSpecification", 9707 "dayOfWeek": [ 9708 "Friday" 9709 ], 9710 "opens": "07:00", 9711 "closes": "18:00" 9712 }, 9713 { 9714 "@type": "OpeningHoursSpecification", 9715 "dayOfWeek": [ 9716 "Saturday" 9717 ], 9718 "opens": "07:30", 9719 "closes": "17:00" 9720 }, 9721 { 9722 "@type": "OpeningHoursSpecification", 9723 "dayOfWeek": [ 9724 "Sunday" 9725 ], 9726 "opens": "00:00", 9727 "closes": "12:00" 9728 } 9729], 9730 "department": [ 9731 { 9732 "@type": "AutoPartsStore", 9733 "priceRange": "$-$$$", 9734 "name": "Parts", 9735 "address": { 9736 "@type": "PostalAddress", 9737 "streetAddress": "8900 University Blvd",
9738 "addressLocality": "Moon Township", 9739 "addressRegion": "PA", 9740 "postalCode": "15108", 9741 "addressCountry": "US" 9742 }, 9743 "telephone": "412.265.4743", 9744 "openingHoursSpecification": [ 9745 { 9746 "@type": "OpeningHoursSpecification", 9747 "dayOfWeek": [ 9748 "Monday", 9749 "Tuesday", 9750 "Wednesday", 9751 "Thursday" 9752 ], 9753 "opens": "07:00", 9754 "closes": "19:00" 9755 }, 9756 { 9757 "@type": "OpeningHoursSpecification", 9758 "dayOfWeek": [ 9759 "Friday" 9760 ], 9761 "opens": "07:00", 9762 "closes": "17:00" 9763 }, 9764 { 9765 "@type": "OpeningHoursSpecification", 9766 "dayOfWeek": [ 9767 "Saturday" 9768 ], 9769 "opens": "07:30", 9770 "closes": "16:00" 9771 }, 9772 { 9773 "@type": "OpeningHoursSpecification", 9774 "dayOfWeek": [ 9775 "Sunday" 9776 ], 9777 "opens": "00:00", 9778 "closes": "12:00" 9779 } 9780 ], 9781 "image": "https:\/\/bucket.dealervenom.com\/brewer-airport-toyota\/logo.png?auto=compress&format=&ixlib=php-1.2.1&h=50&w=200" 9782 }, 9783 { 9784 "@type": "AutoBodyShop", 9785 "priceRange": "$-$$$", 9786 "name": "Collision Center", 9787 "address": { 9788 "@type": "PostalAddress", 9789 "streetAddress": "8900 University Blvd", 9790 "addressLocality": "Moon Township", 9791 "addressRegion": "PA", 9792 "postalCode": "15108", 9793 "addressCountry": "US" 9794 }, 9795 "telephone": "412.265.4743", 9796 "openingHoursSpecification": [ 9797 { 9798 "@type": "OpeningHoursSpecification", 9799 "dayOfWeek": [ 9800 "Monday", 9801 "Tuesday", 9802 "Wednesday", 9803 "Thursday", 9804 "Friday", 9805 "Saturday", 9806 "Sunday" 9807 ], 9808 "opens": "00:00", 9809 "closes": "12:00" 9810 } 9811 ], 9812 "image": "https:\/\/bucket.dealervenom.com\/brewer-airport-toyota\/logo.png?auto=compress&format=&ixlib=php-1.2.1&h=50&w=200" 9813 }, 9814 { 9815 "@type": "AutoDealer", 9816 "priceRange": "$-$$$", 9817 "name": "Sales", 9818 "address": { 9819 "@type": "PostalAddress", 9820 "streetAddress": "8900 University Blvd", 9821 "addressLocality": "Moon Township", 9822 "addressRegion": "PA", 9823 "postalCode": "15108", 9824 "addressCountry": "US" 9825 }, 9826 "telephone": "412.265.4743", 9827 "openingHoursSpecification": [ 9828 { 9829 "@type": "OpeningHoursSpecification", 9830 "dayOfWeek": [ 9831 "Monday", 9832 "Tuesday", 9833 "Wednesday", 9834 "Thursday" 9835 ], 9836 "opens": "09:00", 9837 "closes": "20:00" 9838 }, 9839 { 9840 "@type": "OpeningHoursSpecification", 9841 "dayOfWeek": [ 9842 "Friday" 9843 ], 9844 "opens": "09:00", 9845 "closes": "18:00" 9846 }, 9847 { 9848 "@type": "OpeningHoursSpecification", 9849 "dayOfWeek": [ 9850 "Saturday" 9851 ], 9852 "opens": "09:00", 9853 "closes": "17:00" 9854 }, 9855 { 9856 "@type": "OpeningHoursSpecification", 9857 "dayOfWeek": [ 9858 "Sunday" 9859 ], 9860 "opens": "00:00", 9861 "closes": "12:00" 9862 } 9863 ], 9864 "image": "https:\/\/bucket.dealervenom.com\/brewer-airport-toyota\/logo.png?auto=compress&format=&ixlib=php-1.2.1&h=50&w=200" 9865 }, 9866 { 9867 "@type": "AutoRepair", 9868 "priceRange": "$-$$$", 9869 "name": "Service", 9870 "address": { 9871 "@type": "PostalAddress", 9872 "streetAddress": "8900 University Blvd",
9873 "addressLocality": "Moon Township", 9874 "addressRegion": "PA", 9875 "postalCode": "15108", 9876 "addressCountry": "US" 9877 }, 9878 "telephone": "412.265.4743", 9879 "openingHoursSpecification": [ 9880 { 9881 "@type": "OpeningHoursSpecification", 9882 "dayOfWeek": [ 9883 "Monday", 9884 "Tuesday", 9885 "Wednesday", 9886 "Thursday" 9887 ], 9888 "opens": "07:00", 9889 "closes": "19:00" 9890 }, 9891 { 9892 "@type": "OpeningHoursSpecification", 9893 "dayOfWeek": [ 9894 "Friday" 9895 ], 9896 "opens": "07:00", 9897 "closes": "17:00" 9898 }, 9899 { 9900 "@type": "OpeningHoursSpecification", 9901 "dayOfWeek": [ 9902 "Saturday" 9903 ], 9904 "opens": "07:30", 9905 "closes": "16:00" 9906 }, 9907 { 9908 "@type": "OpeningHoursSpecification", 9909 "dayOfWeek": [ 9910 "Sunday" 9911 ], 9912 "opens": "00:00", 9913 "closes": "12:00" 9914 } 9915 ], 9916 "image": "https:\/\/bucket.dealervenom.com\/brewer-airport-toyota\/logo.png?auto=compress&format=&ixlib=php-1.2.1&h=50&w=200" 9917 }, 9918 { 9919 "@type": "AutoRental", 9920 "priceRange": "$-$$$", 9921 "name": "Rental", 9922 "address": { 9923 "@type": "PostalAddress", 9924 "streetAddress": "8900 University Blvd", 9925 "addressLocality": "Moon Township", 9926 "addressRegion": "PA", 9927 "postalCode": "15108", 9928 "addressCountry": "US" 9929 }, 9930 "telephone": "412.265.4743", 9931 "openingHoursSpecification": [ 9932 { 9933 "@type": "OpeningHoursSpecification", 9934 "dayOfWeek": [ 9935 "Monday", 9936 "Tuesday", 9937 "Wednesday", 9938 "Thursday", 9939 "Friday", 9940 "Saturday", 9941 "Sunday" 9942 ], 9943 "opens": "00:00", 9944 "closes": "12:00" 9945 } 9946 ], 9947 "image": "https:\/\/bucket.dealervenom.com\/brewer-airport-toyota\/logo.png?auto=compress&format=&ixlib=php-1.2.1&h=50&w=200" 9948 }, 9949 { 9950 "@type": "LocalBusiness", 9951 "priceRange": "$-$$$", 9952 "name": "Dealership", 9953 "address": { 9954 "@type": "PostalAddress", 9955 "streetAddress": "8900 University Blvd", 9956 "addressLocality": "Moon Township", 9957 "addressRegion": "PA", 9958 "postalCode": "15108", 9959 "addressCountry": "US" 9960 }, 9961 "telephone": "412.265.4743", 9962 "openingHoursSpecification": [ 9963 { 9964 "@type": "OpeningHoursSpecification", 9965 "dayOfWeek": [ 9966 "Monday", 9967 "Tuesday", 9968 "Wednesday", 9969 "Thursday" 9970 ], 9971 "opens": "07:00", 9972 "closes": "20:00" 9973 }, 9974 { 9975 "@type": "OpeningHoursSpecification", 9976 "dayOfWeek": [ 9977 "Friday" 9978 ], 9979 "opens": "07:00", 9980 "closes": "18:00" 9981 }, 9982 { 9983 "@type": "OpeningHoursSpecification", 9984 "dayOfWeek": [ 9985 "Saturday" 9986 ], 9987 "opens": "07:30", 9988 "closes": "17:00" 9989 }, 9990 { 9991 "@type": "OpeningHoursSpecification", 9992 "dayOfWeek": [ 9993 "Sunday" 9994 ], 9995 "opens": "00:00", 9996 "closes": "12:00" 9997 } 9998 ], 9999 "image": "https:\/\/bucket.dealervenom.com\/brewer-airport-toyota\/logo.png?auto=compress&format=&ixlib=php-1.2.1&h=50&w=200" 10000 } 10001]} 10002</script>
vendor: 1 bytes, line 10002
10002
10003<script type="text/javascript"> 10004 10005 jQuery(document).ready(function($) { 10006 10007 let submittedVins = []; 10008 let vdpContainer = jQuery("#fixed-info-container"); 10009 let isVDP = vdpContainer.length > 0; 10010 10011 // Per Kyle / analytics team, quick form submissions should be considered 10012 // sales forms — set directly (rather than starting as 'Lead' and mutating 10013 // to 'sales' only after the first submission, which used to leak the 10014 // mutated state into engagement events and into any other quick form 10015 // sharing this same script instance on the page, e.g. one-per-listing-card 10016 // on an SRP). 10017 const ascFormDetails = { 10018 name: 'Quick Form', 10019 type: 'sales', 10020 department: 'sales' 10021 }; 10022 10023 // Check if SD Analytics is available 10024 let haveSdAnalytics = true; 10025 10026 // Capture form input clicks 10027 jQuery(document).on("input", ".gform_quick_form input", function(e) { 10028 const form = $(e.target).closest("form")[0]; 10029 QFFormInitiated(getFormData(e), form, e.target); 10030 }); 10031 10032 function getFormData(e) { 10033 let form; 10034 if ( e !== null ) { 10035 form = $(e.target).closest("form"); 10036 } else { 10037 form = $(this).closest("form"); 10038 } 10039 10040 return { 10041 name: form.find("[name=da_quick_form_name]").val(), 10042 phone: form.find("[name=da_quick_form_phone]").val(), 10043 email: form.find("[name=da_quick_form_email]").val(), 10044 vin: form.find(".vin-field").val(), 10045 stockNumber: form.find(".stock-number-field").val(), 10046 year: form.find(".year-field").val(), 10047 make: form.find(".make-field").val(), 10048 model: form.find(".model-field").val(), 10049 trim: form.find(".trim-field").val(), 10050 msrp: form.find(".msrp-field").val(), 10051 finalPrice: form.find(".final-price-field").val(), 10052 dealerName: form.find(".dealer-name-field").val(), 10053 discountMatrix: form.find(".discount-matrix-field").val(), 10054 internetPrice: form.find(".internet-price-field").val(), 10055 condition: form.find(".condition-field").val(), 10056 vehicleUrl: form.find(".vehicle-url-field").val(), 10057 }; 10058 } 10059 10060 function validatePhoneNumber(phone) { 10061 const cleaned = phone.replace(/[^0-9]/g, ""); 10062 10063 if (cleaned.length < 10 || cleaned.length > 11) { 10064 return false; 10065 } 10066 10067 if (cleaned.length === 11 && cleaned[0] !== "1") { 10068 return false; 10069 } 10070 10071 const suspiciousPatterns = [ 10072 /^(.)�{9,}$/, 10073 /^(12345678\d{2})$/, 10074 /^(98765432\d{2})$/, 10075 /^(0{10})$/ 10076 ]; 10077 10078 for (let pattern of suspiciousPatterns) { 10079 if (pattern.test(cleaned)) { 10080 return false; 10081 } 10082 } 10083 10084 return true; 10085 } 10086 10087 function validateEmail(email) { 10088 if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { 10089 return false; 10090 } 10091 10092 const disposableDomains = [ 10093 "tempmail.com", "throwaway.com", "mailinator.com", 10094 "temp-mail.org", "fakeinbox.com", "guerrillamail.com", 10095 "yopmail.com", "10minutemail.com", "trashmail.com", 10096 "test.com" 10097 ]; 10098 10099 const domain = email.split("@")[1].toLowerCase(); 10100 if (disposableDomains.includes(domain)) { 10101 return false; 10102 } 10103 10104 const suspiciousPatterns = [ 10105 /^test/, 10106 /^[0-9]+@/, 10107 /^admin@/, 10108 /^info@/, 10109 /^no-?reply@/ 10110 ]; 10111 10112 for (let pattern of suspiciousPatterns) { 10113 if (pattern.test(email.toLowerCase())) { 10114 return false; 10115 } 10116 } 10117 10118 return true; 10119 } 10120 10121 function formatPhoneNumber(input) { 10122 let numbers = input.replace(/\D/g, ""); 10123 numbers = numbers.substring(0, 10); 10124 10125 if (numbers.length === 0) return ""; 10126 if (numbers.length <= 3) return "(" + numbers; 10127 if (numbers.length <= 6) return "(" + numbers.substring(0,3) + ") " + numbers.substring(3); 10128 return "(" + numbers.substring(0,3) + ") " + numbers.substring(3,6) + "-" + numbers.substring(6); 10129 } 10130 10131 $(document).on("input", ".da-quick-form-phone-input", function(e) { 10132 let input = $(this); 10133 let formatted = formatPhoneNumber(input.val()); 10134 input.val(formatted); 10135 }); 10136 10137 $(document).on("paste", ".da-quick-form-phone-input", function(e) { 10138 e.preventDefault(); 10139 let input = $(this); 10140 let pastedText = (e.originalEvent.clipboardData || window.clipboardData).getData("text"); 10141 input.val(formatPhoneNumber(pastedText)); 10142 }); 10143 10144 function populateHiddenFields(formInstance) { 10145 if (typeof DVHydrate !== 'undefined') { 10146 DVHydrate.populateFormFields("#" + formInstance); 10147 } 10148 } 10149 10150 function QFFormShown(formData) 10151 { 10152 if (haveSdAnalytics && typeof(sd) !== "undefined") { 10153 sd("dataLayer", { 10154 formType: "General Contact", 10155 displayType: "in-page", 10156 events: "formShown", 10157 formVehicle: formData 10158 }); 10159 10160 sd("send"); 10161 } 10162 } 10163 10164 const isSRP = $("body").hasClass("srp_main"); 10165 10166 let quickFormTitle = $(".quick_form_title"); 10167 if (!isSRP && quickFormTitle && quickFormTitle.is(":visible")) { 10168 QFFormShown(getFormData(null)); 10169 } 10170 10171 function QFFormInitiated(formData, form, fieldTarget) 10172 {
10173 try { 10174 if (haveSdAnalytics && typeof(sd) !== "undefined") { 10175 if (form && form.dataset.sdFormInitiationTracked !== "true") { 10176 sendShiftDigitalFormEvent({ 10177 formType: "General Contact", 10178 displayType: "in-page", 10179 eventName: "formInitiation", 10180 formVehicle: formData 10181 }); 10182 10183 form.dataset.sdFormInitiationTracked = "true"; 10184 } 10185 10186 if (shouldTrackShiftDigitalFieldInteraction(fieldTarget)) { 10187 sendShiftDigitalFormEvent({ 10188 formType: "General Contact", 10189 displayType: "in-page", 10190 eventName: "formFieldInteraction", 10191 fieldTarget: fieldTarget, 10192 formVehicle: formData 10193 }); 10194 } 10195 } 10196 } catch (e) { 10197 console.error(e); 10198 } 10199 10200 if (window.DAForms) { 10201 window.DAForms.formEngagement('asc_form_engagement', ascFormDetails, 'start', getVehicleFromForm(form)); 10202 } 10203 } 10204 10205 function getVehicleFromForm(form) 10206 { 10207 let vehicle = {}; 10208 const formData = getFormData({target: form}); 10209 vehicle.vin = formData.vin; 10210 vehicle.make = formData.make; 10211 vehicle.model = formData.model; 10212 vehicle.displayedPrice = parseFloat(formData.finalPrice.replace(/[^\d.]/g, '')); 10213 vehicle.status = formData.condition; 10214 vehicle.year = formData.year; 10215 vehicle.trim = formData.trim; 10216 10217 return vehicle; 10218 } 10219 10220 function QFFormSubmitted(formData, form) 10221 { 10222 if ( submittedVins.includes(formData.vin)) { 10223 return; 10224 } else { 10225 submittedVins.push(formData.vin); 10226 } 10227 10228 try { 10229 if (haveSdAnalytics && typeof(sd) !== "undefined" && formData.vin ) { 10230 sd("dataLayer", { 10231 formType: "General Contact", 10232 displayType: "in-page", 10233 events: "formSubmission", 10234 formVehicle: formData, 10235 leadType: "lead" 10236 }); 10237 sd("send"); 10238 } 10239 } catch (e) { 10240 console.error(e); 10241 } 10242 10243 if (window.DAForms) { 10244 window.DAForms.formSubmission('asc_form_submission', ascFormDetails, formData.buttonText, 'unknown', getVehicleFromForm(form)); 10245 window.DAForms.addDepartmentSpecificSubmission(ascFormDetails, formData.buttonText); 10246 } 10247 } 10248 10249 function getQuickFormCookies() { 10250 let cookies = {}; 10251 document.cookie.split(";").forEach(cookie => { 10252 let parts = cookie.trim().split("="); 10253 let name = parts[0]; 10254 let value = parts[1]; 10255 if (name.startsWith("quickFormUnlocked_")) { 10256 cookies[name] = value; 10257 } 10258 }); 10259 return cookies; 10260 } 10261 10262 function checkAndHideForms() { 10263 let cookies = getQuickFormCookies(); 10264 10265 if (Object.keys(cookies).length === 0) return; 10266 10267 // Get the condition from the container 10268 let condition = isVDP ? 10269 vdpContainer.data("vehicle-condition").toLowerCase() : 10270 jQuery(".listing").first().data("vehicle-condition").toLowerCase(); 10271
10272 // Check for condition-specific "all" cookie 10273 if (`quickFormUnlocked_all_` + condition in cookies) { 10274 jQuery(".da-quick-form").remove(); 10275 jQuery(".da-quick-form-unlocked").show(); 10276 jQuery("#da-quick-form-unlocked").show(); 10277 jQuery("#vdp-pricingheader-container").remove(); 10278 return; 10279 } 10280 10281 if (vdpContainer.length > 0) { 10282 // VDP logic 10283 let vin = vdpContainer.data("vehicle-vin"); 10284 if (vin && "quickFormUnlocked_" + vin in cookies) { 10285 jQuery(".da-quick-form").remove(); 10286 } 10287 } else { 10288 // SRP logic 10289 jQuery(".da-quick-form").each(function() { 10290 let form = jQuery(this); 10291 let parentCard = form.closest(".listing"); 10292 let vin = parentCard.data("vehicleVin"); 10293 10294 if (vin && "quickFormUnlocked_" + vin in cookies) { 10295 form.remove(); 10296 } 10297 }); 10298 } 10299 } 10300 10301 if(isVDP) { 10302 checkAndHideForms(); 10303 setTimeout(function() { 10304 jQuery(".da-quick-form").each(function() { 10305 let formId = jQuery(this).attr("id"); 10306 populateHiddenFields(formId); 10307 }); 10308 }, 2000); 10309 } 10310 10311 // submitQuickForm will trigger this event after it has submitted to the WP backend 10312 document.addEventListener("form:quick-form-submit", function(e) { 10313 QFFormSubmitted(e.detail.data, e.detail.form); 10314 }); 10315 10316 $(document).on("submit", ".da-quick-form form", function(e) { 10317 e.preventDefault(); 10318 10319 const form = $(this); 10320 const button = form.find(".da-quick-form-button"); 10321 const defaultIcon = button.find(".default-icon"); 10322 const loadingIcon = button.find(".loading-icon"); 10323 const buttonText = button.find(".button-text"); 10324 10325 button.prop("disabled", true); 10326 defaultIcon.removeClass("active"); 10327 loadingIcon.addClass("active"); 10328 const originalButtonText = buttonText.text(); 10329 buttonText.text("SUBMITTING..."); 10330 10331 const email = form.find("[name=da_quick_form_email]").val(); 10332 const phone = form.find("[name=da_quick_form_phone]").val(); 10333 10334 const status = (validateEmail(email) && validatePhoneNumber(phone)) ? "active" : "spam"; 10335 let vehicleCard = form.closest(".listing"); 10336 10337 const qfData = { 10338 name: form.find("[name=da_quick_form_name]").val(), 10339 security: form.find("[name=da_quick_form_nonce]").val(), 10340 phone: phone, 10341 email: email, 10342 status: status, 10343 id: form.find(".vin-field").val(), 10344 vin: form.find(".vin-field").val(), 10345 stockNumber: form.find(".stock-number-field").val(), 10346 year: form.find(".year-field").val(), 10347 make: form.find(".make-field").val(), 10348 model: form.find(".model-field").val(), 10349 trim: form.find(".trim-field").val(), 10350 msrp: form.find(".msrp-field").val(), 10351 finalPrice: form.find(".final-price-field").val(), 10352 dealerName: form.find(".dealer-name-field").val(), 10353 discountMatrix: form.find(".discount-matrix-field").val(), 10354 discountMatrixValue: form.find(".discount-matrix-value-field").val(), 10355 internetPrice: form.find(".internet-price-field").val(), 10356 condition: isVDP ? form.find(".condition-field").val() : $(vehicleCard).attr("data-vehicle-condition"), 10357 vehicleUrl: form.find(".vehicle-url-field").val(), 10358 formId: parseInt(form.data("form-id")), 10359 formLocation: isVDP ? "VDP" : "SRP", 10360 buttonText: originalButtonText 10361 }; 10362 10363 form.find("input, button").prop("disabled", true); 10364 10365 submitQuickForm(qfData, form); 10366 }); 10367 }); 10368</script>
10368<link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='dv-dealer-reviews-badge-css' href='https://www.brewerairporttoyota.com/app/themes/dv-framework/media/css/dv-reviews/badge/dv-reviews-badge.css?ver=1.771.862' type='text/css' media='all' /><link rel='preload' as='style' onload="this.onload=null;this.rel='stylesheet'" id='itsg_progresszero_css' href='https://www.brewerairporttoyota.com/app/plugins/gravity-forms-start-progress-bar-at-zero-percent/css/itsg_progresszero_css.min.css?ver=1.2.0' type='text/css' media='all' />
10368<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/plugins/gravityforms/js/jquery.json.min.js?ver=2.4.6' id='gform_json-js'></script>
vendor: 1 bytes, line 10368
10368
10369<script type='text/javascript' id='gform_gravityforms-js-extra'> 10370/* <![CDATA[ */ 10371var gform_gravityforms = {"strings":{"invalid_file_extension":"This type of file is not allowed. Must be one of the following: ","delete_file":"Delete this file","in_progress":"in progress","file_exceeds_limit":"File exceeds size limit","illegal_extension":"This type of file is not allowed.","max_reached":"Maximum number of files reached","unknown_error":"There was a problem while saving the file on the server","currently_uploading":"Please wait for the uploading to complete","cancel":"Cancel","cancel_upload":"Cancel this upload","cancelled":"Cancelled"},"vars":{"images_url":"https:\/\/www.brewerairporttoyota.com\/app\/plugins\/gravityforms\/images"}}; 10372var gform_gravityforms = {"strings":{"invalid_file_extension":"This type of file is not allowed. Must be one of the following: ","delete_file":"Delete this file","in_progress":"in progress","file_exceeds_limit":"File exceeds size limit","illegal_extension":"This type of file is not allowed.","max_reached":"Maximum number of files reached","unknown_error":"There was a problem while saving the file on the server","currently_uploading":"Please wait for the uploading to complete","cancel":"Cancel","cancel_upload":"Cancel this upload","cancelled":"Cancelled"},"vars":{"images_url":"https:\/\/www.brewerairporttoyota.com\/app\/plugins\/gravityforms\/images"}}; 10373var gform_gravityforms = {"strings":{"invalid_file_extension":"This type of file is not allowed. Must be one of the following: ","delete_file":"Delete this file","in_progress":"in progress","file_exceeds_limit":"File exceeds size limit","illegal_extension":"This type of file is not allowed.","max_reached":"Maximum number of files reached","unknown_error":"There was a problem while saving the file on the server","currently_uploading":"Please wait for the uploading to complete","cancel":"Cancel","cancel_upload":"Cancel this upload","cancelled":"Cancelled"},"vars":{"images_url":"https:\/\/www.brewerairporttoyota.com\/app\/plugins\/gravityforms\/images"}}; 10374var gform_gravityforms = {"strings":{"invalid_file_extension":"This type of file is not allowed. Must be one of the following: ","delete_file":"Delete this file","in_progress":"in progress","file_exceeds_limit":"File exceeds size limit","illegal_extension":"This type of file is not allowed.","max_reached":"Maximum number of files reached","unknown_error":"There was a problem while saving the file on the server","currently_uploading":"Please wait for the uploading to complete","cancel":"Cancel","cancel_upload":"Cancel this upload","cancelled":"Cancelled"},"vars":{"images_url":"https:\/\/www.brewerairporttoyota.com\/app\/plugins\/gravityforms\/images"}}; 10375var gform_gravityforms = {"strings":{"invalid_file_extension":"This type of file is not allowed. Must be one of the following: ","delete_file":"Delete this file","in_progress":"in progress","file_exceeds_limit":"File exceeds size limit","illegal_extension":"This type of file is not allowed.","max_reached":"Maximum number of files reached","unknown_error":"There was a problem while saving the file on the server","currently_uploading":"Please wait for the uploading to complete","cancel":"Cancel","cancel_upload":"Cancel this upload","cancelled":"Cancelled"},"vars":{"images_url":"https:\/\/www.brewerairporttoyota.com\/app\/plugins\/gravityforms\/images"}}; 10376/* ]]> */ 10377</script>
vendor: 1 bytes, line 10377
10377
10378<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/plugins/gravityforms/js/gravityforms.min.js?ver=2.4.6' id='gform_gravityforms-js'></script>
vendor: 1 bytes, line 10378
10378
10379<script type='text/javascript' src='https://www.brewerairporttoyota.com/app/plugins/gravityforms/js/conditional_logic.min.js?ver=2.4.6' id='gform_conditional_logic-js'></script>
vendor: 1 bytes, line 10379
10379
10380<script type='text/javascript'> if(typeof gf_global == 'undefined') var gf_global = {"gf_currency_config":{"name":"U.S. Dollar","symbol_left":"$","symbol_right":"","symbol_padding":"","thousand_separator":",","decimal_separator":".","decimals":2},"base_url":"https:\/\/www.brewerairporttoyota.com\/app\/plugins\/gravityforms","number_formats":[],"spinnerUrl":"https:\/\/www.brewerairporttoyota.com\/app\/plugins\/gravityforms\/images\/spinner.gif"};jQuery(document).bind('gform_post_render', function(event, formId, currentPage){if(formId == 7) {if(typeof Placeholders != 'undefined'){ 10381 Placeholders.enable(); 10382 }jQuery('#input_7_3').mask('(999) 999-9999').bind('keypress', function(e){if(e.which == 13){jQuery(this).blur();} } );} } );jQuery(document).bind('gform_post_conditional_logic', function(event, formId, fields, isInit){} );</script>
10382<script type='text/javascript'> jQuery(document).ready(function(){jQuery(document).trigger('gform_post_render', [7, 1]) } ); </script>
10382<style> 10383 #browser-warning { 10384 position: fixed; 10385 top: -160px; 10386 left: 0; 10387 right: 0; 10388 background-color: #ff9800; 10389 color: white; 10390 text-align: center; 10391 padding: 15px; 10392 font-size: 16px; 10393 z-index: 1000; 10394 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 10395 transition: top 0.5s ease-in-out; 10396 } 10397 #browser-warning a { 10398 color: #fff; 10399 text-decoration: underline; 10400 font-weight: bold; 10401 } 10402 #browser-warning .dismiss-button { 10403 background: white; 10404 padding: 5px 10px; 10405 border-radius: 2px; 10406 border: none; 10407 color: #ff9800; 10408 font-size: 16px; 10409 cursor: pointer; 10410 margin-top: 8px; 10411 } 10412 </style> 10413 10414 10415<div id="browser-warning"> 10416 Your browser is out of date. Please <a href="https://browsehappy.com/" target="_blank">update your browser</a> for 10417 the best experience. 10418</div> 10419 10420
10420<script> 10421 const OUTDATED_IOS_VERSION = 17; // iOS version considered outdated 10422 10423 function isBrowserOutdated() { 10424 const ua = navigator.userAgent; 10425 const isOldBrowser = !( 10426 'fetch' in window && 10427 'Promise' in window && 10428 'assign' in Object 10429 ); // Simple feature detection for modern JS APIs 10430 const isOldIE = /MSIE|Trident/.test(ua); // Detect old IE versions 10431 return isOldBrowser || isOldIE; 10432 } 10433 10434 function isIOSOutdated() { 10435 const ua = navigator.userAgent; 10436 const isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream; 10437 if (isIOS) { 10438 const iosVersion = ua.match(/OS (\d+)_/); 10439 if (iosVersion && iosVersion[1]) { 10440 return parseInt(iosVersion[1], 10) < OUTDATED_IOS_VERSION; // Assume iOS < OUTDATED_IOS_VERSION is outdated 10441 } 10442 } 10443 return false; 10444 } 10445 10446 function isAndroidOutdated() { 10447 const ua = navigator.userAgent.toLowerCase(); 10448 const isAndroid = ua.includes("android"); 10449 if (isAndroid) { 10450 const isOldBrowser = !('fetch' in window && 'Promise' in window && 'assign' in Object); 10451 return isOldBrowser; 10452 } 10453 return false; 10454 } 10455 10456 function showBrowserWarning(message) { 10457 const dismissButton = document.createElement('button');
10458 dismissButton.classList = 'dismiss-button'; 10459 dismissButton.innerText = 'Dismiss'; 10460 dismissButton.style.marginLeft = '15px'; 10461 dismissButton.onclick = function() { 10462 const warning = document.getElementById('browser-warning'); 10463 warning.style.top = '-160px'; // Slide up 10464 localStorage.setItem('ag-browser-warning-dismissed', 'true'); 10465 }; 10466 const warning = document.getElementById('browser-warning'); 10467 warning.innerHTML = message; 10468 warning.appendChild(document.createElement('br')); 10469 warning.appendChild(dismissButton); 10470 warning.style.top = '0'; // Slide down 10471 } 10472 10473 function checkBrowser() { 10474 if (localStorage.getItem('ag-browser-warning-dismissed') === 'true') { 10475 return; 10476 } 10477 if (isBrowserOutdated()) { 10478 showBrowserWarning( 10479 'Your browser is out of date.<br/>Please <a href="https://browsehappy.com/" target="_blank">update your browser</a> for the best experience.' 10480 ); 10481 } else if (isIOSOutdated()) { 10482 showBrowserWarning( 10483 'Your iOS version is outdated.<br/>Please update your iOS version to get the latest browser updates.' 10484 ); 10485 } else if (isAndroidOutdated()) { 10486 showBrowserWarning( 10487 'Your Android browser is outdated.<br/>Please update your browser from the <a href="https://play.google.com/store/apps/details?id=com.android.chrome" target="_blank">Google Play Store</a>.' 10488 ); 10489 } 10490 } 10491 10492 window.onload = checkBrowser; 10493 </script>
10493 10494 10495<!-- <style> 10496body .buorg { 10497 border-color: #646464; 10498 color: #fff; 10499 background-color: #141518; 10500} 10501</style> 10502
10503<script> 10504var $buoop = {required:{e:-4,f:-4,o:-4,s:-2,c:-4},insecure:true,api:2021.10 }; 10505function $buo_f(){ 10506 var e = document.createElement("script"); 10507 e.src = "//browser-update.org/update.min.js"; 10508 document.body.appendChild(e); 10509}; 10510try {document.addEventListener("DOMContentLoaded", $buo_f,false)} 10511catch(e){window.attachEvent("onload", $buo_f)} 10512</script>
10512 --> 10513</script>
vendor: 1 bytes, line 10513
10513
10514<script type="text/javascript"> 10515// Toggle nav-below hamburger icon 10516jQuery(document).ready(function() { 10517 jQuery('.roll-out-btn').click(function() { 10518 jQuery('.roll-out-btn').toggleClass('roll-out-btn-open'); 10519 jQuery('.roll-out-menu').toggleClass('roll-out-open'); 10520 jQuery('.rollout-frame').toggleClass('rollout-frame-open'); 10521 jQuery('.save-btn').toggleClass('save-btn-saved'); 10522 10523 }); 10524 10525 // Toggle Side Menu 10526 $('#nav-icon3').click(function() { 10527 $("body").toggleClass('menu-open'); 10528 $("#dv-sidenav").toggleClass("dv-sidenav-open"); 10529 }); 10530 10531 }); 10532 10533</script>
10533 10534
10535<script> 10536/** 10537 * Removing SDA events on all anchors 10538 * Due to an issue with android issue 10539 */ 10540var removeSDCTAEvent = function(){ 10541 var el = document.querySelectorAll('a'); 10542 for (i = 0; i < el.length; ++i) { 10543 if(el[i].hasAttribute("data-sda-event")) { 10544 if(el[i].getAttribute("data-sda-event") == 'clickToCall'){ 10545 var propVal = ''; 10546 if(el[i].getAttribute("data-sda-event-set-prop")){ 10547 propVal = el[i].getAttribute("data-sda-event-set-prop"); 10548 propVal = propVal.split("|"); 10549 propVal = propVal[1]; 10550 } 10551 el[i].removeAttribute("data-sda-event"); 10552 el[i].removeAttribute("data-sda-event-set-prop"); 10553 el[i].setAttribute("data-ag-event", 'clickToCall|'+propVal) 10554 } 10555 if(el[i].getAttribute("data-sda-event") == 'getDirections'){ 10556 el[i].removeAttribute("data-sda-event"); 10557 el[i].setAttribute("data-ag-event", 'getDirections'); 10558 } 10559 } 10560 } 10561}; 10562 10563// removeSDCTAEvent(); 10564//setInterval(removeSDCTAEvent, 10000); 10565</script>
10565 10566 10567 10568 10569
10569<script>/*Copyright 2011-2015 iPerceptions, Inc. All rights reserved. Do not distribute.iPerceptions provides this code 'as is' without warranty of any kind, either express or implied. */ window.iperceptionskey = '6d1fdf1a-2979-42c3-82c9-6ae3384d9f05';(function () { var a = document.createElement('script'),b = document.getElementsByTagName('body')[0]; a.type = 'text/javascript'; a.async = true;a.src = '//universal.iperceptions.com/wrapper.js';b.appendChild(a);})();</script>
10569 10570 10571
10571<script> 10572 var scheduleServiceIframeURL = "https://service.connectcdk.com/?cid=3000517"; 10573 </script>
10573 10574
10574<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/catch-schedule-service-btn.js"></script>
10574 10575 10576 10577 10578 10579
10579<script> 10580 var customModalsLinks = [{"trigger_slug":"schedule","target_url":"https:\/\/service.connectcdk.com\/?cid=3000517"}]; 10581 </script>
10581 10582 10583
10583<script src="https://www.brewerairporttoyota.com/app/themes/dv-framework/media/js/auto-modal.js" defer></script>
10583 10584 </footer> 10585 </body> 10586 10587</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.