1<!doctype html> 2<html lang="en-us"> 3 4<head> 5 <title>Careers | Alameda County</title> 6 <meta charset="utf-8"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 <meta name="viewport" content="width=device-width, initial-scale=1"> 9 <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> 10 <meta name="Description" content="Page for people looking for a new career."> 11 <meta name="Keywords" content="Alameda County, government, employment, jobs, careers, "> 12 <meta name="Location" content="Alameda County, Bay Area, California, United States"> 13 14 <!-- Google Tag Manager -->
15<script>
vendor: 331 bytes, lines 15-19
15(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 16new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 17j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 18'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 19})(window,document,'script','dataLayer','
19GTM-MW6VWCK
vendor: 3 bytes, line 19
19');
19</script>
19 20<!-- End Google Tag Manager --> 21 22<!-- Bootstrap core CSS --> 23<link href="/acgov-css/bootstrap.min.css" rel="stylesheet"> 24 25<!-- IE10 viewport hack for Surface/desktop Windows 8 bug --> 26<link href="/acgov-css/ie10-viewport-bug-workaround.css" rel="stylesheet"> 27 28<!-- Custom styles for this template --> 29<link href="/acgov-css/custom.css" rel="stylesheet"> 30 31<!-- Google Material Icons Font --> 32<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> 33 34<!-- Background Image Load --> 35<!-- When changing the wallpaper image, keep in mind that it may effect the readability of content since the 36content div is partially transparent. Adjust the transparency on line 164 of the custom.css file -->
37<script> 38//window.onload = function() { 39//if (window.screen.width > 767) { 40// document.body.style.backgroundImage = "url('/img/wallpaper-merritt-adj2.jpg')"; 41//} 42//} 43 44function submitsearch() { 45 document.getElementById("search-form").submit(); 46} 47function goback() { 48 window.history.back(); 49} 50</script>
50 51
52<script> /* NEW TEMP SEARCH BOX */ 53 (function() { 54 var cx = '002986915478428468373:0muhvevs3v0'; 55 var gcse = document.createElement('script'); 56 gcse.type = 'text/javascript'; 57 gcse.async = true; 58 gcse.src = 'https://cse.google.com/cse.js?cx=' + cx; 59 var s = document.getElementsByTagName('script')[0]; 60 s.parentNode.insertBefore(gcse, s); 61 })(); 62</script>
62 63 64 65<style> /* NEW TEMP SEARCH BOX */ 66td.gsc-search-button { padding-right: 5px; } 67td.gsib_a { 68 padding:10px; 69} 70.gsc-search-button-v2 { 71 padding: 11px 25px !important; 72 margin: 15px; 73 border-radius: 3px !important; 74} 75.gsc-search-button-v2 svg { 76 width:18px; 77 height:18px; 78} 79/*Media Querry*/ 80@media (max-width:767px){ 81td.gsc-input { width:20%;} 82} 83</style> 84 85 <style> 86 87 88 </style> 89</head> 90 91<body> 92 <!-- skip to content --> 93<header> 94 <a href="#content" class="skip-link">Skip to Content</a> 95 96 <!-- Above-the-fold branding --> 97 <div id="acgov-branding" class="container branding"> 98 <div class="row container"> 99 <div id="acgov-logo" class="col-sm-6 col-xs-12 logo"> 100 <a href="/index.htm"> 101 <img id="acgovlogo" class="img-responsive acgov-logo" src="/img/acgov-branding2024.png" alt="Alameda County CA acgov Home" /> 102 </a> 103 </div> 104 <div id="acgov-tagline" class="col-sm-6 col-xs-12 tagline"> 105 <!-- Accessible Translate trigger (top) --> 106 <a id="translate-trigger-top" href="#" role="button" data-toggle="modal" data-target="#modal-trans" aria-haspopup="dialog" aria-controls="modal-trans" aria-expanded="false"> 107 <span class="material-icons md-24 trans-icon"></span> Translate 108 </a> 109 </div> 110 </div> 111 </div> 112 113 <!-- Sticky / scrolled branding --> 114 <div id="acgov-branding-scroll" class="container branding" style="display:none;"> 115 <div class="row container"> 116 <div id="logo-scroll" class="col-sm-2 col-xs-12 logo"> 117 <a href="/index.htm"> 118 <img class="img-responsive acgov-logo" src="/img/acgov-branding2024.png" alt="ACGOV Logo" /> 119 </a> 120 </div> 121 <div id="spacer" class="col-sm-5 col-xs-12 spacer"></div> 122 <div id="tagline-scroll" class="col-sm-5 col-xs-12 tagline-scroll"> 123 <!-- Accessible Translate trigger (sticky) --> 124 <a id="translate-trigger-scroll" href="#" role="button" data-toggle="modal" data-target="#modal-trans" aria-haspopup="dialog" aria-controls="modal-trans" aria-expanded="false"> 125 <span class="material-icons md-24 trans-icon"></span> Translate 126 </a> 127 </div> 128 </div> 129 </div> 130</header> 131
132<script> 133 // ===== Sticky header behavior (original, now with null-safety) ===== 134 window.onscroll = changePos; 135 function changePos() { 136 var branding = document.getElementById("acgov-branding"); 137 var brandingscroll = document.getElementById("acgov-branding-scroll"); 138 var tagline = document.getElementById("acgov-tagline"); 139 var logo = document.getElementById("acgovlogo"); 140 141 if (document.documentElement.clientWidth >= 768) { 142 if (window.pageYOffset > 57) { 143 if (branding) branding.style.display = "none"; 144 if (brandingscroll) brandingscroll.style.display = "block"; 145 } else { 146 if (branding) branding.style.display = "block"; 147 if (brandingscroll) brandingscroll.style.display = "none"; 148 } 149 } else { 150 if (window.pageYOffset > 57) { 151 if (tagline) tagline.style.display = "none"; 152 if (logo) logo.style.maxWidth = "200px"; 153 } else { 154 if (tagline) tagline.style.display = "block"; 155 if (logo) logo.style.maxWidth = "100%"; 156 } 157 } 158 } 159 160 // ===== Accessibility: aria-expanded sync + focus trap for #modal-trans ===== 161 document.addEventListener("DOMContentLoaded", function () { 162 var modal = document.getElementById("modal-trans"); 163 if (!modal) return; // modal needs to exist 164 165 // Collect both triggers, if present 166 var triggers = [ 167 document.getElementById("translate-trigger-top"), 168 document.getElementById("translate-trigger-scroll") 169 ].filter(Boolean); 170 171 // Remember which trigger opened the modal (for focus restore + aria state) 172 var lastTrigger = null; 173 174 // When a trigger is clicked, record it as the opener 175 triggers.forEach(function (t) { 176 t.addEventListener("click", function () { lastTrigger = t; }, { capture: true }); 177 }); 178 179 // Helper: set aria-expanded on all triggers (defaults to "false") 180 function setExpandedForTriggers(value) { 181 triggers.forEach(function (t) { 182 t.setAttribute("aria-expanded", value ? "true" : "false"); 183 }); 184 } 185 186 // Bootstrap modal events 187 modal.addEventListener("shown.bs.modal", function (evt) { 188 // Prefer the event's relatedTarget (Bootstrap sets it), else use lastTrigger 189 var opener = evt && evt.relatedTarget ? evt.relatedTarget : lastTrigger; 190 // First set all to false, then true on the opener (for accuracy) 191 setExpandedForTriggers(false); 192 if (opener && opener.setAttribute) opener.setAttribute("aria-expanded", "true"); 193 194 // Move focus to the first meaningful element inside the modal 195 var focusables = getFocusableElements(modal); 196 if (focusables.length) { 197 var preferred = modal.querySelector('[data-primary], .btn-primary, [data-dismiss="modal"], .close'); 198 (preferred && typeof preferred.focus === "function" ? preferred : focusables[0]).focus(); 199 } 200 201 // Start focus trap 202 modal.addEventListener("keydown", trapTabKey); 203 }); 204 205 modal.addEventListener("hidden.bs.modal", function () { 206 // Reset aria-expanded for all triggers 207 setExpandedForTriggers(false); 208 209 // Stop focus trap 210 modal.removeEventListener("keydown", trapTabKey); 211 212 // Restore focus to the opener, if available 213 if (lastTrigger && typeof lastTrigger.focus === "function") { 214 lastTrigger.focus(); 215 } 216 lastTrigger = null; 217 }); 218 219 // ===== Focus trap helpers ===== 220 function getFocusableElements(container) { 221 var selector = [ 222 'a[href]:not([tabindex="-1"])', 223 'area[href]:not([tabindex="-1"])', 224 'input:not([type="hidden"]):not([disabled]):not([tabindex="-1"])', 225 'select:not([disabled]):not([tabindex="-1"])', 226 'textarea:not([disabled]):not([tabindex="-1"])', 227 'button:not([disabled]):not([tabindex="-1"])', 228 'iframe:not([tabindex="-1"])', 229 'audio[controls]:not([tabindex="-1"])', 230 'video[controls]:not([tabindex="-1"])', 231 '[contenteditable]:not([tabindex="-1"])', 232 '[tabindex]:not([tabindex="-1"])' 233 ].join(','); 234 235 return Array.prototype.slice.call(container.querySelectorAll(selector)) 236 .filter(function (el) { 237 return el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0; 238 }); 239 } 240 241 function trapTabKey(e) { 242 if (e.key !== "Tab") return; 243 244 var focusables = getFocusableElements(modal); 245 if (!focusables.length) return; 246 247 var first = focusables[0]; 248 var last = focusables[focusables.length - 1]; 249 var active = document.activeElement; 250 251 if (e.shiftKey) { 252 if (active === first || !modal.contains(active)) { 253 last.focus(); 254 e.preventDefault(); 255 } 256 } else { 257 if (active === last || !modal.contains(active)) { 258 first.focus(); 259 e.preventDefault(); 260 } 261 } 262 } 263 }); 264</script>
264 265 <div role="search" class="container searchbox"> 266<!--<div class="container urgent"> 267 <div class="row"> 268 <p><i class="material-icons md-48 md-vertical-middle"></i> This is a sample urgent notification box. Please click here for more information: <a href="as">Urgent Link</a></p> 269 </div> 270</div>--> 271 <!-- <div class="container info-msg"> 272 <div class="row"> 273 <p><span class="material-icons md-48 md-vertical-middle">warning</span><strong>Upcoming Website Outages</strong><br> Due to upcoming maintenance, you may encounter errors when accessing County websites this Sunday, August 10th.<br>We apologize for any inconvenience.</p> 274 </div> 275 </div> --> 276<div class="container info-msg"> 277 <div class="row"> 278 <p><span class="material-icons md-48 md-vertical-middle">info</span> Alameda County is gradually transitioning our websites to a new .GOV domain name: "alamedacountyca.gov".</br><a href="/government/dotgov.htm">Learn more</a><span class="material-icons md-32 md-vertical-middle">arrow_forward</span></p> 279 </div> 280 </div> 281 282 <div class="row search"> 283 <form id="search-form" style="margin: auto; width: 90%;" method="get" action="https://acsearch.acgov.org/s/search.html?" target="_parent" type="external"> 284 <div class="input-group"> 285 <label for="funnelbackinput" class="sr-only">Search</label> 286 287 <input id="funnelbackinput" type="search" name="query" class="form-control search-input" placeholder="What can we help you find today?" aria-label="Search"> 288 <span class="input-group-addon"> 289 <button type="submit" class="btn search-button" name="btnG" value="Search" aria-label="Submit search">Search</button> 290 </span> 291 </div> 292 <input type="hidden" name="collection" value="acgov" /> 293 <input type="hidden" name="profile" value="acgov"> 294 <input type="hidden" name="form" value="acgov" /> 295 </form> 296 </div> 297</div> 298<!-- skip to content jumplink destination <div> starts here--> 299<div role="main" id="content"> 300 <!-- ending </div> is located at begining of footer --> 301 <!-- Google Translate the Pages ---------------------------------> 302<div class="modal fade" id="modal-trans" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-title" aria-describedby="modal-desc"> 303 <div class="modal-dialog" role="document"> 304 <div class="modal-content"> 305 <div class="modal-header"> 306 307 <!-- Close button: accessible label + visual "Ã" --> 308 <button type="button" class="close" data-dismiss="modal" aria-label="Close dialog"> 309 <span aria-hidden="true">×</span> 310 <span class="sr-only">Close</span> 311 </button> 312 313 <!-- Modal title with id referenced by aria-labelledby --> 314 <h3 class="modal-title" id="modal-title">Translate this Page</h3> 315 </div> 316 317 <!-- Body gets an id referenced by aria-describedby --> 318 <div class="modal-body deptinfo" id="modal-desc"> 319 <h4>Disclaimer</h4> 320 <p>Translation of pages on ACGOV.org is performed by Google Translate, a third-party service which Alameda County has no control over. The service provides automated computer translations that are only an approximation of the websitesâ original content.</p> 321 <p>Alameda County does not warrant the accuracy, reliability, or timeliness of any information translated by Google Translate. These translations should not be considered exact renderings of the original ACGOV.org site. Some portions of the site will not be translated at all, which includes but is not limited to buttons, graphics, photos, and video content.</p> 322 323 <!-- Keep the widget container as its own block (avoid nesting <div> inside <p>) --> 324 <div class="mt-3" id="google_translate_element"></div> 325 </div> 326 327 <!-- Optional footer with an explicit close action for keyboard users --> 328 <div class="modal-footer"> 329 <button type="button" class="btn btn-primary" data-dismiss="modal" data-primary>Close</button> 330 </div> 331 </div> 332 </div> 333</div> 334
335<script> 336(function () { 337 var attempts = 0; 338 var maximumAttempts = 60; 339 340 function attachTranslationTracking() { 341 var dropdown = document.querySelector(".goog-te-combo"); 342 343 if (!dropdown) { 344 attempts++; 345 346 if (attempts < maximumAttempts) { 347 window.setTimeout(attachTranslationTracking, 500); 348 } else { 349 console.warn("Translation tracking: Google Translate dropdown was not found."); 350 } 351 352 return; 353 } 354 355 if (dropdown.getAttribute("data-siteimprove-tracking") === "true") { 356 return; 357 } 358 359 dropdown.setAttribute("data-siteimprove-tracking", "true"); 360 361 dropdown.addEventListener("change", function () { 362 var selectedOption = this.options[this.selectedIndex]; 363 364 if (!this.value || !selectedOption) { 365 return; 366 } 367 368 var languageName = selectedOption.text.trim(); 369 370 console.log( 371 "Siteimprove translation event:", 372 this.value, 373 languageName 374 ); 375 376 window._sz = window._sz || []; 377 window._sz.push([ 378 "event", 379 "Translation", 380 "Language selected", 381 languageName 382 ]); 383 }); 384 385 console.log("Translation tracking attached."); 386 } 387 388 attachTranslationTracking(); 389})(); 390</script>
390 391 <div class="container content"> 392 <div class="row row-title"> 393 <h1 class="pagetitle">Careers</h1> 394 <a href="#" data-toggle="modal" data-target="#modal-trans"><i class="material-icons md-48 trans-icon"></i></a> 395 </div> 396 <div class="row regular hero"> 397 <img class="heroimage" src="/img/careers3.jpg" width="100%" alt="Photo of County staff at a hackathon event."> 398 <div class="col-xs-12 col-sm-8 main-column"> 399 400 <h2 class="sub-title">Our Community. Your Purpose.</h2> 401 <p>Alameda County is more than a great place to work. It is a great place to learn, to make a difference, to grow, to strive, to succeed, and to flourish. Come join our team and find more than just a job. Find your purpose. Find your career.</p> 402 <a class="btn btn-success btn-default btn-responsive btn-lg" style="letter-spacing: 1px; margin-bottom: 20px; text-transform:uppercase;" href="http://www.jobaps.com/Alameda/default.asp" class="external-link"><img src="/img/icon-view.png" height="30px" alt="Magnifying glass icon">View Openings</a> 403 <h2>Get Email Alerts</h2> 404 <p>You can search our list of job descriptions and select any description to view it and sign up to be notified when a job in that class opens.</p> 405 <a class="btn btn-success btn-default btn-responsive btn-lg" style="letter-spacing: 1px; margin-bottom: 20px; text-transform:uppercase;" href="https://www.jobaps.com/Alameda/auditor/classspecs.asp"><img src="/img/icon-view.png" height="30px" alt="Magnifying glass icon">Search Job Descriptions</a> 406 <h2>How to Apply</h2> 407 <ul> 408 <li><a href="/hrs/divisions/ps/application.htm#1">What You Need to Know</a></li> 409 <li><a href="/hrs/divisions/ps/application.htm#2">Applying Online</a></li> 410 <li><a href="/hrs/divisions/ps/application.htm#3">Filing Deadlines</a></li> 411 </ul> 412 413 <h2>Employment Procedures</h2> 414 <ul> 415 <li><a href="/hrs/divisions/ps/application.htm#5">Recruitment & Selection Process</a></li> 416 <li><a href="/hrs/divisions/ps/application.htm#8">Persons with Disabilities</a></li> 417 <li><a href="/hrs/divisions/ps/application.htm#9">Probationary Period</a></li> 418 <li><a href="/hrs/divisions/ps/application.htm#10">Fingerprints / Physical Examination</a></li> 419 </ul> 420 <h2>General Employment Information</h2> 421 <ul> 422 <li><a href="https://hrs.alamedacountyca.gov/employee-benefits-center/">Employee Benefits</a></li> 423 </ul> 424 425 </div> 426 <div class="col-xs-12 col-sm-4 side-column bordered"> 427 <a href="https://twitter.com/AlamedaCountyHR" class="external-link"><img style="max-width:400px;padding-bottom:20px;" src="/images/newhomepage/followhr.png" width="85%" alt="Follow HRS on Twitter at AlamedaCountyHR"></a> 428 <a href="https://www.linkedin.com/company/alameda-county" class="external-link"><img style="max-width:400px;padding-bottom:10px;" src="/images/newhomepage/linkedin.png" width="100%" alt="LinkedIn logo. Follow link to our LinkedIn page."class="external-link"></a> 429 <!-- <a href="https://www.dice.com/company/10204163P"><img style="max-width:500px;" src="/img/dicepromo.png" width="100%" alt="DICE.com logo. Follow link to look up tech job openings."></a> --> 430 <a href="https://indeedhi.re/3xduSXm" class="external-link"><img style="max-width:400px;padding-bottom:10px;" src="/images/newhomepage/indeed-it-career.png" width="90%" alt="Indeed logo. Find Your IT Career."></a> 431 <!-- <a href="https://www.indeed.com/jobs?q=Alameda+County+Information+Technology+Department&l=Concord%2C+CA&from=searchOnHP&vjk=f882e5f10040469f"><img style="max-width:400px;padding-bottom:10px;" src="/images/newhomepage/indeed-it-career.png" width="90%" alt="Indeed logo. Find Your IT Career."></a> --> 432 <div id="questions"> 433 <h2><i class="material-icons md-36 md-vertical-middle"></i> Questions</h2> 434 <p>For questions / comments, please contact our <a href="#" data-toggle="modal" data-target="#modal
434-hrs">Human Resource Services</a> department.</p> 435 </div> 436 <div id="resources"> 437 <h2><i class="material-icons md-36 md-vertical-middle"></i> Web Resources </h2> 438 <ul> 439 <li><a href="https://trainingcenter.acgov.org/">Career Centers</a></li> 440 <li><a href="http://jobs.ca.gov/" class="external-link">State of California Jobs</a></li> 441 <li><a href="http://www.alameda.courts.ca.gov/Pages.aspx/Employment">Superior Court Job Openings</a></li> 442 </ul> 443 </div> 444 445 </div> 446 447 </div> 448 <!--Human Resource Services---------------------------------> 449<div class="modal fade" id="modal-hrs" tabindex="-1" role="dialog" aria-label="Human Resource Services Info"> 450 <div class="modal-dialog" role="document"> 451 <div class="modal-content"> 452 <div class="modal-header"> 453 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> 454 <h3 class="modal-title">Human Resource Services</h3> 455 </div> 456 <div class="modal-body deptinfo"> 457 <a class="dept-phone" href="tel:510-272-6471"><span class="material-icons md-48"></span></a> 458 <a class="dept-map external-link" href="https://goo.gl/maps/r2uNzFmew9p"><span class="material-icons md-48"></span></a> 459 <p class="dept-address"> 460 1405 Lakeside Drive<br /> 461 Oakland, CA 94612-4305<br /> 462 510.272.6471 463 </p> 464 <h4 class="deptlinks"><span class="material-icons md-36 md-vertical-middle"></span> Links</h4> 465 <ul> 466 <li><a class="dept-link" href="https://hrs.alamedacountyca.gov/">Department Website</a></li> 467 <li><a class="dept-link" href="/careers.htm">Careers</a></li> 468 <li><a class="dept-link" href="https://hrs.alamedacountyca.gov/employee-benefits-center/">Employee Benefits</a></li> 469 470 </ul> 471 <h4 class="deptlinks"><span class="material-icons md-36 md-vertical-middle"></span> Online Services</h4> 472 <ul> 473 <li><a class="dept-link external-link" href="http://www.jobaps.com/alameda/">Current Job Opportunities</a></li> 474 <li><a class="dept-link external-link" href="http://www.jobaps.com/alameda/">Apply Online</a></li> 475 <li><a class="dept-link external-link" href="http://www.jobaps.com/alameda/auditor/ClassSpecs.asp">Job Descriptions</a></li> 476 <li><a class="dept-link external-link" href="http://www.jobaps.com/alameda/auditor/ClassSpecs.asp">Open Job Notifications</a></li> 477 </ul> 478 <h4 class="deptlinks"><span class="material-icons md-36 md-vertical-middle"></span> Get Connected</h4> 479 <a href="http://twitter.com/alamedacountyhr"><img class="icon-sm icon-48" src="/img/twitter200x200.png" alt="Twitter icon"></a> 480 <a href="http://www.linkedin.com/company/8424?trk=tyah" class="external-link"><img class="icon-sm icon-48" src="/img/linkedin200x200.png" alt="LinkedIn icon"></a> 481 482 </div> 483 </div> 484 </div> 485</div> 486 487 </div> 488 <!-- ending of role="main" here--> 489</div> 490 491<!-- footer starts here --> 492<footer class="container-fluid footer"> 493 <div class="row text-center"> 494 <p> 495 <a class="cu" href="/government/contactus.htm">Contact Us</a> | 496 <a class="acc" href="/government/accessibility.htm">Accessibility</a> | 497 <a class="la" href="/acspeaks/">Language Access</a> | 498 <a class="em" href="/emergencysite/">
498Emergencies</a> | 499 <a class="ld" href="/government/legal.htm">Legal/Disclaimers</a> | 500 <a class="ps" href="/government/legal.htm">Privacy Statement</a> | 501 <a class="gu" href="/government/guidelines.htm">Website Guidelines</a> | 502 <a class="sb" href="/government/sb272.htm">SB 272 </a> | 503 <a class="sm" href="/sitemap.htm">Site Map</a> 504 <br /> 505 <a href="https://www.facebook.com/AlamedaCounty" class="external-link"><img class="social-icon" src="/img/facebook200x200.png" alt="facbook icon" /></a> 506 <a href="https://twitter.com/AlamedaCounty" class="external-link"><img class="social-icon" src="/img/twitter200x200.png" alt="Twitter icon" /></a> 507 <a href="https://www.youtube.com/user/AlamedaCountyCA" class="external-link"><img class="social-icon" src="/img/youtube200x200.png" alt="YouTube icon" /></a> 508 <a href="https://www.flickr.com/photos/alamedacounty" class="external-link"><img class="social-icon" src="/img/flickr200x200.png" alt="Flickr icon" /></a> 509 <a href="/government/connected/rss.htm"><img class="social-icon" src="/img/rss200x200.png" alt="RSS icon" /></a> 510 <a href="https://public.govdelivery.com/accounts/CAALAME/subscriber/new" class="external-link"><img class="social-icon" src="/img/govdelivery200x200.png" alt="GovDelivery icon" /></a> 511 <br /> 512 <a href="http://www.adobe.com/go/getreader" class="external-link"> 513 <img alt="Get Adobe Reader" style="padding: 10px;" src="/img/get-reader.png" /></a> 514 <br /> 515 <span class="material-icons md-18" style="vertical-align:bottom"></span> 2025 Alameda County 516 </p> 517 </div> 518</footer> 519 520<!-- Bootstrap core JavaScript 521================================================== --> 522<!-- Placed at the end of the document so the pages load faster --> 523
524<script type="text/javascript"> 525function googleTranslateElementInit() { 526 new google.translate.TranslateElement({pageLanguage: 'en', includedLanguages: 'af,am,ar,de,es,fa,fr,gu,hi,id,ja,km,ko,pt,ru,so,sw,tl,ur,vi,yo,zh-CN,zh-TW'}, 'google_translate_element'); 527} 528</script>
528<script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
528 529 530
531<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
531
532<script>window.jQuery || document.write('
532<script src="/acgov-js/jquery.min.js"><\/script>')</script>
532
533<script src="/acgov-js/bootstrap.min.js"></script>
533 534<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
535<script src="/acgov-js/ie10-viewport-bug-workaround.js"></script>
535 536<!-- Google Analytics code -->
537<script>
vendor: 340 bytes, lines 537-543
537 538 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 539 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 540 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 541 })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 542 543 ga('create', '
543UA-48660008-1
vendor: 44 bytes, lines 543-544
543', 'acgov.org'); 544 ga('send', 'pageview');
545</script>
545 546 547 548 549<!-- External Links--> 550<!-- External Link Popup - HTML structure --> 551<div id="external-popup" class="popup-overlay" role="dialog" aria-labelledby="popup-title" aria-hidden="true"> 552 <div class="popup-content"> 553 <button id="close-external-popup" class="popup-close" aria-label="Close">X</button> 554 <p><img src="/img/external-site-icon.svg" width="50px" alt="External Link" class="popup-icon"></p> 555 <h2 id="popup-title">External Link</h2> 556 <p>You are about to leave an official Alameda County website. 557 Alameda County bears no responsibility for the accuracy, legality, accessibility, or content of the external site or for that of subsequent links. 558 Contact the external site for answers to questions regarding its content.</p> 559 <div class="popup-button-container"> 560 <button id="cancel-external" class="popup-button btn btn-default btn-lg">Cancel</button> 561 <button id="continue-external" class="popup-button btn btn-success btn-lg">Continue</button> 562 </div> 563 </div> 564</div> 565 566<!-- External Link Popup JavaScript -->
567<script> 568 document.addEventListener("DOMContentLoaded", function () { 569 const modal = document.getElementById("external-popup"); 570 const closeButton = document.getElementById("close-external-popup"); 571 const cancelButton = document.getElementById("cancel-external"); 572 const continueButton = document.getElementById("continue-external"); 573 574 // CHANGED: store the actual trigger element (the link), not document.activeElement 575 let lastTriggerEl = null; 576 577 let popupShownInSession = sessionStorage.getItem('externalPopupShown') === 'true'; 578 579 // (Optional but recommended) Make sure dialog semantics are present 580 if (!modal.hasAttribute('role')) modal.setAttribute('role', 'dialog'); 581 if (!modal.hasAttribute('aria-modal')) modal.setAttribute('aria-modal', 'true'); 582 583 function getFocusableInModal() { 584 const nodeList = modal.querySelectorAll( 585 "button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])" 586 ); 587 return Array.from(nodeList).filter(el => !el.hasAttribute('disabled') && el.offsetParent !== null); 588 } 589 590 // CHANGED: accept the trigger element; derive URL from it 591 function openModal(triggerEl) { 592 lastTriggerEl = triggerEl; // <-- save the invoker reliably 593 const externalURL = triggerEl?.href; 594 595 modal.style.display = "block"; 596 modal.setAttribute("aria-hidden", "false"); 597 598 // Move focus inside the dialog (prefer the close button; fallback to first focusable or modal) 599 const focusables = getFocusableInModal(); 600 (closeButton || focusables[0] || modal).focus(); 601 602 continueButton.onclick = () => { 603 sessionStorage.setItem('externalPopupShown', 'true'); 604 popupShownInSession = true; 605 if (externalURL) window.location.href = externalURL; 606 }; 607 cancelButton.onclick = closeModal; 608 closeButton.onclick = closeModal; 609 610 document.addEventListener("keydown", trapTabKey); 611 document.addEventListener("keydown", closeOnEscape); 612 613 // If you want "once per session" behavior on open, keep this: 614 sessionStorage.setItem('externalPopupShown', 'true'); 615 popupShownInSession = true; 616 } 617 618 function closeModal() { 619 modal.style.display = "none"; 620 modal.setAttribute("aria-hidden", "true"); 621 622 document.removeEventListener("keydown", trapTabKey); 623 document.removeEventListener("keydown", closeOnEscape); 624 625 // CHANGED: restore focus to the invoker on the next frame for VO/Safari reliability 626 if (lastTriggerEl && lastTriggerEl.isConnected) { 627 requestAnimationFrame(() => { 628 try { 629 lastTriggerEl.focus({ preventScroll: false }); 630 } catch (_) { 631 // Silent fallback 632 lastTriggerEl.focus(); 633 } 634 }); 635 } 636 } 637 638 function trapTabKey(e) { 639 if (e.key !== "Tab") return; 640 641 const focusableElements = getFocusableInModal(); 642 if (!focusableElements.length) return; 643 644 const firstElement = focusableElements[0]; 645 const lastElement = focusableElements[focusableElements.length - 1]; 646 647 if (e.shiftKey && document.activeElement === firstElement) { 648 lastElement.focus(); 649 e.preventDefault(); 650 } else if (!e.shiftKey && document.activeElement === lastElement) { 651 firstElement.focus(); 652 e.preventDefault(); 653 } 654 } 655 656 function closeOnEscape(e) { 657 if (e.key === "Escape") { 658 e.preventDefault(); 659 closeModal(); 660 } 661 } 662 663 function setupExternalLinks() { 664 document.querySelectorAll('a.external-link').forEach(link => { 665 if (link.children.length === 1 && link.querySelector("button, img, span.material-icons, i.material-icons")) { 666 link.classList.add("hide-icon"); 667 } 668 669 // CHANGED: pass the actual link as the trigger 670 link.addEventListener('click', function (e) { 671 e.preventDefault(); 672 openModal(link); // was openModal(link.href) 673 }); 674 675 // CHANGED: nested clickable children also pass the link as trigger 676 link.querySelectorAll("button, img").forEach(element => { 677 element.addEventListener("click", function (e) { 678 e.preventDefault(); 679 openModal(link); // was openModal(link.href) 680 }); 681 }); 682 683 // ARIA hint that this opens a dialog 684 if (!link.hasAttribute("aria-haspopup")) { 685 link.setAttribute("aria-haspopup", "dialog"); 686 } 687 }); 688 } 689 690 modal.style.display = "none"; 691 modal.setAttribute("aria-hidden", "true"); 692 693 setupExternalLinks(); 694 695 window.addEventListener('pageshow', (event) => { 696 if (event.persisted && popupShownInSession) { 697 modal.style.display = "none"; 698 modal.setAttribute("aria-hidden", "true"); 699 } 700 }); 701 702 window.addEventListener('beforeunload', () => { 703 sessionStorage.removeItem('externalPopupShown'); 704 }); 705 }); 706</script>
706 707 708<!-- Automatically sets aria label for phone, email, directions icons -->
709<script> 710 const iconGlyphMap = { 711 '\uE0CD': 'Phone', 712 '\uE0BE': 'Email', 713 '\uE52E': 'Get directions' 714 }; 715 716 document.querySelectorAll('.material-icons').forEach(icon => { 717 const glyph = icon.textContent.trim(); 718 if (iconGlyphMap[glyph]) { 719 icon.setAttribute('aria-label', iconGlyphMap[glyph]); 720 icon.setAttribute('role', 'img'); 721 } 722 }); 723</script>
723 724</body> 725 726 727 728<!-- Siteimprove Analytics Code -->
729<script async src="https://siteimproveanalytics.com/js/siteanalyze_10984.js"></script>
729 730 731 732 733</body> 734 735</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.