1<!DOCTYPE html> 2<html lang="en" translate="no"> 3<head> 4 <title>Find an Optometrist â ARBO</title> 5 <meta charset="utf-8" /> 6 <meta http-equiv="Content-Language" content="en" /> 7 <meta name="google" content="notranslate" /> 8 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui"/> 9 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 10 <meta name="description" content="ARBO template made using Bootstrap 5 and it has huge amount of ready made feature, UI components, pages which completely fulfills any dashboard needs."/> 11 <meta name="keywords" content="flat ui, admin Admin , Responsive, Landing, Bootstrap, App, Template, Mobile, iOS, Android, apple, creative app"/> 12 <meta name="author" content="arbo" /> 13 <link rel="icon" href="/dist-v1/assets/images/favicon.ico" type="image/x-icon"/> 14 <link rel="preconnect" href="https://fonts.googleapis.com" /> 15 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 16 <link href="https://fonts.googleapis.com/css2?family=Public+Sans:wght@400;500;600;700&family=Source+Serif+4:opsz,[email protected],400;8..60,600;8..60,700&display=swap" rel="stylesheet" /> 17 <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" /> 18 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css"> 19 20 <link rel="stylesheet" href="https://cdn.datatables.net/3.0.3/css/dataTables.bootstrap5.min.css" /> 21 <link rel="stylesheet" href="https://cdn.datatables.net/responsive/4.0.3/css/responsive.bootstrap5.min.css" /> 22 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.10.0/css/bootstrap-datepicker.standalone.min.css" integrity="sha512-D5/oUZrMTZE/y4ldsD6UOeuPR4lwjLnfNMWkjC0pffPTCVlqzcHTNvkn3dhL7C0gYifHQJAIrRTASbMvLmpEug==" crossorigin="anonymous" referrerpolicy="no-referrer"> 23 <link rel="stylesheet" type="text/css" href="/dist-v1/assets/css/arbo-public.css"/> 24 </head> 25<body> 26 27<a class="arbo-skip-link" href="#main">Skip to main content</a> 28 29<!-- Utility bar -------------------------------------------------------------> 30<div class="arbo-utility"> 31 <div class="container d-flex flex-wrap align-items-center justify-content-between gap-3 py-2"> 32 <nav class="d-none d-md-flex align-items-center gap-4" aria-label="Utility"> 33 <a href="/contact-us">Contact Us</a> 34 <a href="/faq">FAQ</a> 35 <a href="/cope/optometrist-search">Find an Optometrist</a> 36 <a href="/publications">Publications</a> 37 </nav> 38 <div class="d-flex align-items-center ms-auto gap-3"> 39 <div class="dropdown"> 40 <button class="btn btn-sm btn-arbo-gold dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">Log in</button> 41 <ul class="dropdown-menu dropdown-menu-end"> 42 <li><a class="dropdown-item" href="/oetracker/login"><span class="fst-italic">OE TRACKER</span></a></li> 43 <li><a class="dropdown-item" href="/reviewer/login">COPE Reviewer</a></li> 44 <li><a class="dropdown-item" href="/orgs/login">COPE Administrator</a></li> 45 <li><a class="dropdown-item" href="/memberboards/login">ARBO Member Boards</a></li> 46 </ul> 47 </div> 48 </div> 49 </div> 50</div> 51 52<!-- Main navigation ---------------------------------------------------------> 53<nav class="navbar navbar-expand-lg arbo-navbar" aria-label="Main"> 54 <div class="container position-relative"> 55 56 <a class="navbar-brand d-flex align-items-center gap-2" href="/"> 57 <img src="/images/logo_transparent_500px.png" alt="ARBO â Association of Regulatory Boards of Optometry" /> 58 </a> 59 60 <button class="navbar-toggler border-0 my-2" type="button" data-bs-toggle="offcanvas" data-bs-target="#arboNav" aria-controls="arboNav" aria-label="Toggle navigation"> 61 <span class="navbar-toggler-icon"></span> 62 </button> 63 64 <div class="offcanvas offcanvas-end offcanvas-lg arbo-offcanvas" tabindex="-1" id="arboNav" aria-labelledby="arboNavLabel"> 65 <div class="offcanvas-header"> 66 <span class="offcanvas-title" id="arboNavLabel">Menu</span> 67 <button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" data-bs-target="#arboNav" aria-label="Close"></button> 68 </div> 69 <div class="offcanvas-body p-0"> 70 <ul class="navbar-nav ms-lg-auto align-items-lg-center"> 71 72 <!-- COPE --> 73 <li class="nav-item dropdown position-lg-static"> 74 <a class="nav-link arbo-nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">COPE</a> 75 <div class="dropdown-menu arbo-mega"> 76 <div class="container"> 77 <div class="row g-4"> 78 <div class="col-lg-3 col-md-6"> 79 <div class="col-title">COPE Program</div> 80 <a href="/cope">COPE Mission</a> 81 <a href="/cope/overview">COPE Overview</a> 82 <a href="/cope/info">COPE Information</a> 83 <a href="/new-standards-integrity">Standards for Integrity</a> 84 <a href="/cope/news">COPE News</a> 85 <a href="/cope/committee">COPE Council</a> 86 <a href="/cope-webinars">COPE Webinars</a> 87 </div> 88 <div class="col-lg-3 col-md-6"> 89 <div class="col-title">Courses</div> 90 <a href="/cope/qualifications">Course Qualification</a> 91 <a href="/courses/new">Course Submission</a> 92 <a href="/courses/search">Course Search</a> 93 <a href="/cope/review-fees">Course Review Fees</a> 94 <div class="col-title mt-4">Reviewers</div> 95 <a href="/reviewer">Become a COPE Reviewer</a> 96 <a href="/reviewer/login">COPE Reviewer Login</a> 97 </div> 98 <div class="col-lg-3 col-md-6"> 99 <div class="col-title">Activities</div> 100 <a href="/events">Activity Accreditation Info</a> 101 <a href="/events/fees">Activity Fees</a> 102 <a href="/orgs/admin">Activity Submission</a> 103 <a href="/events/search">Activity Search</a> 104 <div class="col-title mt-4">Administrators</div> 105 <a href="/orgs">Become a COPE Admin</a> 106 <a href="/orgs/login">COPE Admin Login</a> 107 <a href="/orgs/adminlist">COPE Admin List</a> 108 </div> 109 <div class="col-lg-3 col-md-6"> 110 <div class="arbo-news arbo-news-rail"> 111 <div class="col-title mb-2">COPE News</div> 112 <a href="#"><span class="hd">2025 COPE Data Report â get more information</span></a> 113 <a href="#"><span class="hd">Summer 2026 GreenSheet</span></a> 114 <a href="https://blog.arbo.org/"><span class="hd">Latest ARBO news on our blog</span></a> 115 <div class="arbo-mega-promo mt-3"> 116 <div class="arbo-serif fs-6 mb-1">State & Provincial CE Requirements</div> 117 <a href="/cestateinfo" class="fw-semibold small" style="border-bottom:0;">Open the lookup →</a> 118 </div> 119 </div> 120 </div> 121 </div> 122 </div> 123 </div> 124 </li> 125 126 <!-- OE TRACKER --> 127 <li class="nav-item dropdown position-lg-static"> 128 <a class="nav-link arbo-nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"><span class="fst-italic">OE TRACKER</span></a> 129 <div class="dropdown-menu arbo-mega"> 130 <div class="container"> 131 <div class="row g-4"> 132 <div class="col-lg-3 col-md-6"> 133 <div class="col-title">About</div> 134 <a href="/oetracker">Features</a> 135 <a href="/oetracker/fees">Fees</a> 136 <a href="/oetracker/mobile">Mobile App</a> 137 <a href="/mobileapp-comments">Mobile App Comments Form</a> 138 </div> 139 <div class="col-lg-3 col-md-6"> 140 <div class="col-title">Optometrists</div> 141 <a href="/oetracker/setup-account">
141Create <span class="fst-italic">OE TRACKER</span> Account</a> 142 <a href="/oetracker/login">Optometrist <span class="fst-italic">OE TRACKER</span> Login</a> 143 </div> 144 <div class="col-lg-3 col-md-6"> 145 <div class="col-title">Tools</div> 146 <a href="/oetracker/lookup"><span class="fst-italic">OE TRACKER</span> Lookup</a> 147 <a href="https://s3.amazonaws.com/arbo.org/public/OET+Fax+Cover+Sheet+2021.pdf" target="_blank"><span class="fst-italic">OE TRACKER</span> Fax Cover Sheet (PDF)</a> 148 </div> 149 <div class="col-lg-3 col-md-6"> 150 <div class="arbo-news arbo-news-rail"> 151 <div class="col-title mb-2"><span class="fst-italic">OE TRACKER</span> News</div> 152 <a href="/oetracker/mobile"><span class="hd"><span class="fst-italic">OE TRACKER</span> Mobile App</span></a> 153 <a href="#"><span class="hd">Summer 2026 GreenSheet</span></a> 154 <a href="https://blog.arbo.org/"><span class="hd">Latest ARBO news on our blog</span></a> 155 <div class="arbo-mega-promo mt-3"> 156 <div class="arbo-serif fs-6 mb-1">Track CE from anywhere</div> 157 <a href="/oetracker/mobile" class="fw-semibold small" style="border-bottom:0;">Get the mobile app →</a> 158 </div> 159 </div> 160 </div> 161 </div> 162 </div> 163 </div> 164 </li> 165 166 <!-- CELMO --> 167 <li class="nav-item dropdown position-lg-static"> 168 <a class="nav-link arbo-nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">CELMO</a> 169 <div class="dropdown-menu arbo-mega"> 170 <div class="container"> 171 <div class="row g-4"> 172 <div class="col-lg-3 col-md-6"> 173 <div class="col-title">Program</div> 174 <a href="/celmo">Program Overview</a> 175 <a href="/celmo/requirements">Certificate Requirements</a> 176 <a href="https://s3.amazonaws.com/arbo.org/public/celmo_flowchart.pdf" target="_blank">CELMO Process (PDF)</a> 177 </div> 178 <div class="col-lg-3 col-md-6"> 179 <div class="col-title">Apply</div> 180 <a href="/celmo/application">Application</a> 181 <a href="/celmo/faq">CELMO FAQ</a> 182 </div> 183 </div> 184 </div> 185 </div> 186 </li> 187 188 <!-- Meetings --> 189 <li class="nav-item dropdown position-lg-static"> 190 <a class="nav-link arbo-nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Meetings</a> 191 <div class="dropdown-menu arbo-mega"> 192 <div class="container"> 193 <div class="row g-4"> 194 <div class="col-lg-3 col-md-6"> 195 <div class="col-title">Annual Meetings</div> 196 <a href="/meetings/2027">2027 Annual Meeting</a> 197 <a href="/meetings/future">Future Annual Meetings</a> 198 </div> 199 <div class="col-lg-3 col-md-6"> 200 <div class="col-title">Webinars</div> 201 <a href="/regulatory-webinars">ARBO Regulatory Webinars</a> 202 </div> 203 <div class="col-lg-3 col-md-6"> 204 <div class="arbo-mega-promo"> 205 <div class="col-title mb-2">Next up</div> 206 <div class="arbo-serif fs-5 mb-2">2027 Annual Meeting â Boston, MA</div> 207 <a href="/meetings/2027" class="fw-semibold" style="border-bottom:0;">Meeting details →</a> 208 </div> 209 </div> 210 </div> 211 </div> 212 </div> 213 </li> 214 215 <!-- About --> 216 <li class="nav-item dropdown position-lg-static"> 217 <a class="nav-link arbo-nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">About</a> 218 <div class="dropdown-menu arbo-mega"> 219 <div class="container"> 220 <div class="row g-4"> 221 <div class="col-lg-3 col-md-6"> 222 <div class="col-title">The Association</div> 223 <a href="/history">ARBO History</a> 224 <a href="/directors">Board of Directors</a> 225 <a href="/committee-staff">Committees & Staff</a> 226 <a href="https://s3.amazonaws.com/arbo.org/public/ARBO+Bylaws+Amended+June+2024+FINAL.pdf" target="_blank">ARBO Bylaws (PDF)</a> 227 </div> 228 <div class="col-lg-3 col-md-6"> 229 <div class="col-title">Connect</div> 230 <a href="/memberboards">Directory of Member Boards</a> 231 <a href="/contact-us">Contact Us</a> 232 </div> 233 </div> 234 </div> 235 </div> 236 </li> 237 238 <!-- Member Boards --> 239 <li class="nav-item dropdown position-lg-static"> 240 <a class="nav-link arbo-nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Member Boards</a> 241 <div class="dropdown-menu arbo-mega"> 242 <div class="container"> 243 <div class="row g-4"> 244 <div class="col-lg-3 col-md-6"> 245 <div class="col-title">Resources</div> 246 <a href="/cestateinfo">State/Provincial CE Requirements</a> 247 <a href="/cestate-licensure-reqs">State/Provincial Licensing Requirements</a> 248 <a href="/memberboards">Directory of Member Boards</a> 249 <a href="/memberboards/login">Licensing Board Login</a> 250 </div> 251 <div class="col-lg-3 col-md-6"> 252 <div class="col-title">Info Center</div> 253 <a href="https://blog.arbo.org">ARBO Blog</a> 254 <a href="/publications">Publications</a> 255 <a href="/documents">Public Documents</a> 256 <a href="/links">Public Links</a> 257 <a href="/security">Privacy & Security</a> 258 </div> 259 </div> 260 </div> 261 </div> 262 </li> 263 264 </ul> 265 </div> 266 </div> 267 </div> 268</nav> 269 270<!-- Hero --------------------------------------------------------------------> 271<section class="arbo-page-header"> 272 <div class="container"> 273 <div class="row align-items-center g-4"> 274 <div class="col-lg-8"> 275 <div class="arbo-eyebrow mb-3">Association of Regulatory Boards of Optometry</div> 276 <h1>Find an Optometrist</h1> 277 <p class="sub">Search optometrists in the ARBO database.</p> 278 </div> 279 <div class="col-lg-4 d-flex justify-content-lg-end"> 280 <div class="arbo-logo-plate" style="padding:18px 22px;"> 281 <img src="/images/logo_transparent_500px.png" alt="Optometrist examining a patient at a slit lamp" width="249" height="133" style="display:block; width:186px; height:auto;" /> 282 </div> 283 </div> 284 285 286 </div> 287 </div> 288</section> 289 290 291<!-- Main --------------------------------------------------------------------> 292<div class="container py-5" id="main"> 293 <div class="arbo-table-panel"> 294 295 <div class="arbo-table-toolbar"> 296 <div class="d-flex flex-wrap align-items-center justify-content-between gap-3"> 297 <div> 298 <h2>Optometrist List</h2> 299 <p class="hint">Search by name, city or state. Only optometrists who have chosen to be listed appear in these results.</p> 300 </div> 301 <button class="btn btn-arbo-gold px-4 py-2" type="button" data-bs-toggle="modal" data-bs-target="#optoSearchModal">Find an Optometrist</button> 302 </div> 303 304 <div class="arbo-filter-chips mt-3 d-none" id="activeFilters">
305 <span class="arbo-eyebrow me-1">Search</span> 306 </div> 307 </div> 308 309 <div class="p-4 p-md-5 text-center" id="startState"> 310 <p class="arbo-eyebrow mb-2">No search yet</p> 311 <p class="arbo-serif fs-4 mb-2" style="color:var(--arbo-green-dark);">Start with a name, city or state</p> 312 <p class="arbo-empty mb-4">Results appear here once you run a search.</p> 313 <button class="btn btn-arbo-gold px-4 py-2" type="button" data-bs-toggle="modal" data-bs-target="#optoSearchModal">Open search</button> 314 </div> 315 316 <div class="table-responsive d-none" id="resultsWrap"> 317 <table id="optoTable" class="table w-100"> 318 <thead> 319 <tr> 320 <th scope="col">Name</th> 321 <th scope="col">Practice address</th> 322 <th scope="col">State</th> 323 <th scope="col">Phone</th> 324 </tr> 325 </thead> 326 <tbody></tbody> 327 </table> 328 </div> 329 </div> 330 331 <p class="mt-4 mb-0" style="font-size:14px; color:var(--arbo-muted); max-width:70ch;">Contact details are supplied by the optometrist and maintained in their <span class="fst-italic">OE TRACKER</span> account. To correct or remove a listing, <a href="/contact-us">contact ARBO</a>.</p> 332</div> 333 334<!-- Optometrist Search modal ------------------------------------------------> 335<div class="modal fade" id="optoSearchModal" tabindex="-1" aria-labelledby="optoSearchLabel" aria-hidden="true"> 336 <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable"> 337 <div class="modal-content"> 338 339 <div class="modal-header"> 340 <h2 class="modal-title" id="optoSearchLabel">Optometrist Search</h2> 341 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 342 </div> 343 344 <form id="optoSearchForm"> 345 <div class="modal-body"> 346 <div class="arbo-callout arbo-callout-error mb-4 d-none" id="searchError" role="alert"> 347 <p class="hd">Too many results</p> 348 <p class="mb-0" id="searchErrorMsg">Please provide more specific search terms.</p> 349 </div> 350 351 <fieldset class="arbo-fieldset"> 352 <legend>Name</legend> 353 <div class="row g-3"> 354 <div class="col-md-6"> 355 <label class="form-label" for="qFirst">First name</label> 356 <input class="form-control" type="text" id="qFirst" name="fname" maxlength="255" placeholder="Starts with" /> 357 </div> 358 <div class="col-md-6"> 359 <label class="form-label" for="qLast">Last name</label> 360 <input class="form-control" type="text" id="qLast" name="lname" maxlength="255" placeholder="Starts with" /> 361 </div> 362 </div> 363 </fieldset> 364 365 <fieldset class="arbo-fieldset mb-0"> 366 <legend>Location</legend> 367 <div class="row g-3"> 368 <div class="col-md-6"> 369 <label class="form-label" for="qCity">City</label> 370 <input class="form-control" type="text" id="qCity" name="city" maxlength="255" placeholder="Starts with" /> 371 </div> 372 <div class="col-md-6"> 373 <label class="form-label" for="qState">State / Province</label> 374 <select class="form-select" id="qState" name="state"> 375 <option value="" selected>Any State</option> 376 <option value="AB" >AB - Alberta 377 <option value="AK" >AK - Alaska 378 <option value="AL" >AL - Alabama 379 <option value="AR" >AR - Arkansas 380 <option value="AU" >AU - Australia 381 <option value="AZ" >AZ - Arizona 382 <option value="BC" >BC - British Columbia 383 <option value="CA" >CA - California 384 <option value="CO" >CO - Colorado 385 <option value="CT" >CT - Connecticut 386 <option value="DC" >DC - District of Columbia 387 <option value="DE" >DE - Delaware 388 <option value="FL" >FL - Florida 389 <option value="GA" >GA - Georgia 390 <option value="GU" >GU - Guam 391 <option value="HI" >HI - Hawaii 392 <option value="IA" >IA - Iowa 393 <option value="ID" >ID - Idaho 394 <option value="IL" >IL - Illinois 395 <option value="IN" >IN - Indiana 396 <option value="KS" >KS - Kansas 397 <option value="KY" >KY - Kentucky 398 <option value="LA" >
398LA - Louisiana 399 <option value="MA" >MA - Massachusetts 400 <option value="MB" >MB - Manitoba 401 <option value="MD" >MD - Maryland 402 <option value="ME" >ME - Maine 403 <option value="MI" >MI - Michigan 404 <option value="MN" >MN - Minnesota 405 <option value="MO" >MO - Missouri 406 <option value="MS" >MS - Mississippi 407 <option value="MT" >MT - Montana 408 <option value="NB" >NB - New Brunswick 409 <option value="NC" >NC - North Carolina 410 <option value="ND" >ND - North Dakota 411 <option value="NE" >NE - Nebraska 412 <option value="NF" >NF - Newfoundland and Labrador 413 <option value="NH" >NH - New Hampshire 414 <option value="NJ" >NJ - New Jersey 415 <option value="NL" >NL - Newfoundland and Labrador 416 <option value="NM" >NM - New Mexico 417 <option value="NS" >NS - Nova Scotia 418 <option value="NT" >NT - Northwest Territories 419 <option value="NU" >NU - Nunavut 420 <option value="NV" >NV - Nevada 421 <option value="NY" >NY - New York 422 <option value="NZ" >NZ - New Zealand 423 <option value="OH" >OH - Ohio 424 <option value="OK" >OK - Oklahoma 425 <option value="ON" >ON - Ontario 426 <option value="OR" >OR - Oregon 427 <option value="PA" >PA - Pennsylvania 428 <option value="PE" >PE - Prince Edward Island 429 <option value="PR" >PR - Puerto Rico 430 <option value="QC" >QC - Quebec 431 <option value="RI" >RI - Rhode Island 432 <option value="SC" >SC - South Carolina 433 <option value="SD" >SD - South Dakota 434 <option value="SK" >SK - Saskatchewan 435 <option value="TN" >TN - Tennessee 436 <option value="TX" >TX - Texas 437 <option value="UT" >UT - Utah 438 <option value="VA" >VA - Virginia 439 <option value="VI" >VI - Virgin Islands 440 <option value="VT" >VT - Vermont 441 <option value="WA" >WA - Washington 442 <option value="WI" >WI - Wisconsin 443 <option value="WV" >
443WV - West Virginia 444 <option value="WY" >WY - Wyoming 445 <option value="YT" >YT - Yukon Territories 446 </select> 447 </div> 448 </div> 449 </fieldset> 450 451 </div> 452 453 <div class="modal-footer d-flex justify-content-between"> 454 <button class="btn btn-outline-secondary" type="reset">Reset</button> 455 <button class="btn btn-arbo-gold px-5" type="button" id="optoSearchSubmitBtn">Search</button> 456 </div> 457 </form> 458 459 </div> 460 </div> 461</div> 462 463<!-- Footer ------------------------------------------------------------------> 464<footer class="arbo-footer"> 465 <div class="container d-flex flex-wrap justify-content-between align-items-center gap-3"> 466 <div>Copyright © 2026 ARBO. All rights reserved.</div> 467 <a href="https://www.facebook.com/Association-of-Regulatory-Boards-of-Optometry-127983077242338/">Visit our Facebook page</a> 468 </div> 469</footer> 470
471<script type="text/javascript" src="/dist-v1/bower_components/jquery/js/jquery.min.js"></script>
vendor: 1 bytes, line 471
471
472<script type="text/javascript" src="/dist-v1/bower_components/jquery-ui/js/jquery-ui.min.js"></script>
vendor: 1 bytes, line 472
472
473<script type="text/javascript" src="/dist-v1/bower_components/popper.js/js/popper.min.js"></script>
vendor: 1 bytes, line 473
473
474<script type="text/javascript" src="/dist-v1/bower_components/bootstrap/js/bootstrap.min.js"></script>
474 475<!-- waves js -->
476<script src="/dist-v1/assets/pages/waves/js/waves.min.js"></script>
476 477<!-- jquery slimscroll js -->
478<script type="text/javascript" src="/dist-v1/bower_components/jquery-slimscroll/js/jquery.slimscroll.js"></script>
478 479<!-- modernizr js -->
480<script type="text/javascript" src="/dist-v1/bower_components/modernizr/js/modernizr.js"></script>
vendor: 1 bytes, line 480
480
481<script type="text/javascript" src="/dist-v1/bower_components/modernizr/js/css-scrollbars.js"></script>
481 482
483<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.30.1/moment.min.js"></script>
483 484<!-- data-table js --> 485<!--
486<script src="https://cdn.datatables.net/2.2.2/js/dataTables.min.js"></script>
vendor: 1 bytes, line 486
486
487<script src="https://cdn.datatables.net/2.2.2/js/dataTables.bootstrap5.min.js"></script>
vendor: 1 bytes, line 487
487
488<script src="https://cdn.datatables.net/buttons/3.2.2/js/dataTables.buttons.min.js"></script>
vendor: 1 bytes, line 488
488
489<script src="https://cdn.datatables.net/buttons/3.2.2/js/buttons.bootstrap5.min.js"></script>
vendor: 1 bytes, line 489
489
490<script src="https://cdn.datatables.net/responsive/3.0.4/js/dataTables.responsive.min.js"></script>
vendor: 1 bytes, line 490
490
491<script src="https://cdn.datatables.net/responsive/3.0.4/js/responsive.bootstrap5.min.js"></script>
491 492 493
494<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
vendor: 1 bytes, line 494
494
495<script src="https://cdn.datatables.net/2.1.8/js/dataTables.min.js"></script>
vendor: 1 bytes, line 495
495
496<script src="https://cdn.datatables.net/2.1.8/js/dataTables.bootstrap5.min.js"></script>
vendor: 1 bytes, line 496
496
497<script src="https://cdn.datatables.net/responsive/3.0.3/js/dataTables.responsive.min.js"></script>
vendor: 1 bytes, line 497
497
498<script src="https://cdn.datatables.net/responsive/3.0.3/js/responsive.bootstrap5.min.js"></script>
498 499 500 501https://cdn.datatables.net/3.0.3/css/dataTables.bootstrap5.min.css 502https://cdn.datatables.net/responsive/4.0.3/css/responsive.bootstrap5.min.css 503 504 505
506<script src="/dist-v1/assets/datatables_custom/datatables.min.js"></script>
506 507--> 508
509<script src="https://cdn.datatables.net/3.0.3/js/dataTables.min.js"></script>
vendor: 1 bytes, line 509
509
510<script src="https://cdn.datatables.net/3.0.3/js/dataTables.bootstrap5.min.js"></script>
vendor: 1 bytes, line 510
510
511<script src="https://cdn.datatables.net/responsive/4.0.3/js/dataTables.responsive.min.js"></script>
vendor: 1 bytes, line 511
511
512<script src="https://cdn.datatables.net/responsive/4.0.3/js/responsive.bootstrap5.min.js"></script>
512 513 514
515<script src="https://cdnjs.cloudflare.com/ajax/libs/parsley.js/2.9.2/parsley.min.js" integrity="sha512-eyHL1atYNycXNXZMDndxrDhNAegH2BDWt1TmkXJPoGf1WLlNYt08CSjkqF5lnCRmdm3IrkHid8s2jOUY4NIZVQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 515
515
516<script src="https://cdnjs.cloudflare.com/ajax/libs/filepond/4.32.7/filepond.min.js" integrity="sha512-/kcyaB84QgojPP9E91b3lmeLZXKMG6wGqIGaTIld4RtbyTBFB0DHBSL7/WPwU/fAftwmpvYYvdq/S96smP8Ppw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 516
516
517<script src="https://unpkg.com/jquery-filepond/filepond.jquery.js"></script>
517 518 519<!-- Bootstrap date-time-picker js -->
520<script type="text/javascript" src="/dist-v1/assets/pages/advance-elements/moment-with-locales.min.js"></script>
vendor: 1 bytes, line 520
520
521<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.10.0/js/bootstrap-datepicker.min.js" integrity="sha512-LsnSViqQyaXpD4mBBdRYeP6sRwJiJveh2ZIbW41EBrNmKxgr/LFZIiWT6yr+nycvhvauz8c2nYMhrP80YhG7Cw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 521
521
522<script type="text/javascript" src="/dist-v1/assets/pages/advance-elements/bootstrap-datetimepicker.min.js"></script>
522 523<!-- Date-range picker js -->
524<script type="text/javascript" src="/dist-v1/bower_components/bootstrap-daterangepicker/js/daterangepicker.js"></script>
vendor: 1 bytes, line 524
524
525<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
vendor: 1 bytes, line 525
525
526<script src="https://cdnjs.cloudflare.com/ajax/libs/uuid/8.2.0/uuid.min.js" integrity="sha512-X0CJvcClD8EXFn5Oq8BD5lIsznKDfxb0Sf9Wr8MCCTyAEWaAAxr0Jvm3qyofsmN7eSHMZ0PPQGjVKroLAfexrA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 526
526
527<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.4.16/purify.min.js" integrity="sha512-flQmhkXNRQ3iUfvtdCobtpMjCb6kE+zLnTiAulAQJ3WykVfy84JvCMOo6vhwWXHTXjR25h9Zj+LyGFRWKjRoag==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 527
527
528<script src="/dist-v1/js/common.js?rnd=16447531841407264416"></script>
528 529 530 531 532 533
534<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>
vendor: 1 bytes, line 534
534
535<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/quill.js"></script>
vendor: 1 bytes, line 535
535
536<script src="https://cdnjs.cloudflare.com/ajax/libs/he/1.2.0/he.min.js"></script>
536 537
538<script> 539 $(document).ready(function () { 540 $("#optoSearchModal").modal('show'); 541 const searchUrl = "/cope/optometrist-search/ajax"; 542 let formData = { fname: '', lname: '', city: '', state: '' }; 543 const formDataLabels = { fname: 'First name', lname: 'Last name', city: 'City', state: 'State' }; 544 const optoTable = $("#optoTable").DataTable({ 545 createdRow: function (row, data, dataIndex) { 546 //to monitor row creation 547 }, 548 ajax: { 549 url: searchUrl, 550 type: "POST", 551 data: function (d) { 552 console.log(d); 553 return $.extend({}, d, formData); // keep DataTables params + add form fields 554 }, 555 dataSrc: function (json) { 556 json.data.forEach(function (part, index, theArray) { 557 //const fullName = Utils.joinStringsWith(" ", [part.fname, part.lname]); 558 //theArray[index].fullName = '<span class="title">' + Utils.joinStringsWith(", ", [fullName, part.degrees]) + '</span>'; 559 560 theArray[index].fullName = DOMPurify.sanitize('<span class="title">' + Utils.escapeHtml(part.full_name) + '</span>'); 561 562 563 const addressLine1 = DOMPurify.sanitize(Utils.joinStringsWithAndReturnNull(", ", [part.office1addr, part.office1addr2])); 564 const addressLine2 = DOMPurify.sanitize(Utils.joinStringsWithAndReturnNull(", ", [part.office1city, Utils.joinStringsWithAndReturnNull(" ", [part.office1st, part.office1zip])])); 565 if(!addressLine1 && !addressLine2) { 566 theArray[index].address = "N/A"; 567 } else { 568 theArray[index].address = DOMPurify.sanitize(Utils.joinStringsWith("<br />", [Utils.escapeHtml(addressLine1), Utils.escapeHtml(addressLine2)])); 569 } 570 571 if(Utils.isNullOrEmpty(part.office1phone)) { 572 theArray[index].phone = '<span class="arbo-empty">Not listed</span>'; 573 } else { 574 theArray[index].phone = Utils.formatPhone(part.office1phone, true); 575 } 576 577 578 if(Utils.isNullOrEmpty(part.office1st)) { 579 theArray[index].state = ""; 580 } else { 581 theArray[index].state = DOMPurify.sanitize('<span class="arbo-pill">' + Utils.escapeHtml(part.office1st) + '</span>'); 582 } 583 }); 584 return json.data; 585 }, 586 error: function (xhr, error, thrown) { 587 if (xhr.responseJSON && xhr.responseJSON.message) { 588 alert(xhr.responseJSON.message); 589 } else { 590 alert("An unexpected error occurred. Please try again later."); 591 } 592 } 593 }, 594 columns: [ 595 { data: "fullName", className: "text-start wrap-text-dt align-middle", orderable: true}, 596 { data: "address", width: "20%", className: "text-center wrap-text-dt align-middle", orderable: false}, 597 { data: "state", className: "text-center wrap-text-dt align-middle", orderable: true}, 598 { data: "phone", className: "text-center wrap-text-dt align-middle", orderable: true}, 599 ], 600 columnDefs: [ 601 { targets: "_all", orderSequence: ["asc", "desc"] } 602 ], 603 //layout: { topStart: ['pageLength', 'search'], topEnd: null, bottomStart: 'info', bottomEnd: 'paging' }, 604 layout: { topStart: ['pageLength'], topEnd: null, bottomStart: 'info', bottomEnd: 'paging' }, 605 serverSide: true, 606 pageLength: 25, 607 lengthMenu: [25, 50, 100], 608 responsive: true, 609 autoWidth: false, 610 deferRender: true, 611 deferLoading: 0, // here 612 processing: true, 613 order: [[0, "asc"]], 614 language: { 615 //search: '', 616 //searchPlaceholder: 'Filter these resultsâ¦', 617 //lengthMenu: 'Show _MENU_ Filter Optometrists', 618 lengthMenu: 'Show _MENU_ ', 619 info: 'Showing _START_â_END_ of _TOTAL_ optometrists', 620 infoEmpty: 'No optometrists found', 621 infoFiltered: '(filtered from _MAX_ matches)', 622 zeroRecords: 'No optometrists match this search. Open the search to change your criteria.', 623 emptyTable: 'No optometrists match this search. Open the search to change your criteria.', 624 paginate: { previous: 'â¹ Prev', next: 'Next âº' } 625 } 626 }); 627 function setupFilterChips(){ 628 $("#activeFilters").empty(); 629 $("#activeFilters").append('<span class="arbo-eyebrow me-1">Search</span>'); 630 //go over the formData and add chips for each non-empty value 631 let filterCount = 0; 632 for (var key in formData) { 633 if(!Utils.isNullOrEmpty(formData[key])) { 634 const value = DOMPurify.sanitize(formData[key]); 635 $("#activeFilters").append('<span class="arbo-chip"><span><strong>' + formDataLabels[key] + ': ' + value + '</strong></span>' + 636 '<button type="button" class="filter-btn-remove" aria-label="Remove the First name filter" data-key="' + key + '">×</button></span>'); //store the key in the data attribute of the button 637 filterCount++; 638 } 639 } 640 641 $(".filter-btn-remove").on("click", function (event) {
642 const key = $(this).data("key"); 643 formData[key] = ""; //clear the value in the formData object 644 setupFilterChips(); 645 optoTable.ajax.reload(); 646 }); 647 if(filterCount === 0) { 648 $("#activeFilters").hideBs(); 649 } else { 650 $("#activeFilters").append('<button type="button" class="btn btn-link p-0 ms-1 remove-all-filter-btn" style="font-size: 13px">Clear search</button>'); 651 $("#activeFilters").showBs(); 652 $(".remove-all-filter-btn").on("click", function (event) { 653 formData = { fname: '', lname: '', city: '', state: '' }; 654 setupFilterChips(); 655 optoTable.ajax.reload(); 656 }); 657 } 658 } 659 660 $("#optoSearchSubmitBtn").on("click", function (event) { 661 $(this).blur(); 662 formData = $("#optoSearchForm").serializeFormJSON(); 663 formData.fname = DOMPurify.sanitize(formData.fname).trim(); 664 formData.lname = DOMPurify.sanitize(formData.lname).trim(); 665 formData.city = DOMPurify.sanitize(formData.city).trim(); 666 setupFilterChips(); 667 $("#optoSearchModal").modal('hide'); 668 optoTable.ajax.reload(); 669 $("#resultsWrap").showBs(); 670 $("#startState").hideBs(); 671 }); 672 673 $("#optoSearchModal").on("shown.bs.modal", function () { 674 $("#optoSearchForm").resetForm(); 675 formData = { fname: '', lname: '', city: '', state: '' }; 676 }); 677 }); 678</script>
678 679</body> 680</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.