Help
RSS
API
Feed
Maltego
Contact
Domain > www.teetimesny.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2017-02-23
199.188.206.123
(
ClassC
)
2026-01-15
92.112.198.53
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyDate: Thu, 15 Jan 2026 06:21:35 GMTContent-Type: text/htmlContent-Length: 795Connection: keep-aliveLocation: https://www.teetimesny.com/platform: hostingerpanel: hpanelContent-Security-Policy: upgrade-insecure-requestsServer: hcdnalt-svc: h3:443; ma86400x-hcdn-request-id: 7eb54095edd5505202c01f9ce080273c-phx-edge7x-hcdn-cache-status: MISSx-hcdn-upstream-rt: 0.132 !DOCTYPE html>html styleheight:100%>head>meta nameviewport contentwidthdevice-width, initial-scale1, shrink-to-fitno />title> 301 Moved Permanently/title>style>@media (prefers-color-scheme:dark){body{background-color:#000!important}}/style>/head>body stylecolor: #444; margin:0;font: normal 14px/20px Arial, Helvetica, sans-serif; height:100%; background-color: #fff;>div styleheight:auto; min-height:100%; > div styletext-align: center; width:800px; margin-left: -400px; position:absolute; top: 30%; left:50%;> h1 stylemargin:0; font-size:150px; line-height:150px; font-weight:bold;>301/h1>h2 stylemargin-top:20px;font-size: 30px;>Moved Permanently/h2>p>The document has been permanently moved./p>/div>/div>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Thu, 15 Jan 2026 06:21:36 GMTContent-Type: text/html; charsetutf-8Transfer-Encoding: chunkedConnection: keep-aliveVary: Accept-EncodingX-Powered-By: PHP/8.2.29platform: hostingerpanel: hpanelRetry-After: 60Content-Security-Policy: upgrade-insecure-requestsServer: hcdnalt-svc: h3:443; ma86400x-hcdn-request-id: 41244a5dad3691490ff44e0a4f308b8f-phx-edge6x-hcdn-cache-status: DYNAMICx-hcdn-upstream-rt: 0.270 !doctype html>html>head> meta charsetutf-8 /> title>Tee Times/title> meta nameviewport contentwidthdevice-width,initial-scale1 /> meta http-equivCache-Control contentno-store /> link relstylesheet hrefhttps://unpkg.com/leaflet@1.9.4/dist/leaflet.css crossorigin /> style> /* Darker green + lighter diamond fairway */ :root { /* Lightened greens vs last version */ --bg: #143a24; /* base */ --bg2: #0f2f1d; /* depth */ --fg: #e7f5ea; --muted:#b7d8c0; --card:#ffffff; --card-fg:#0a0a0a; --card-muted:#667a66; --card-border:#bcd8c3; --accent:#0e7a3a; --accent-2:#095a2a; --confirm:#e0a33d; --chip:#eef8f0; --chip-border:#cde6d3; --shadow: 0 14px 28px rgba(2,40,19,.18), 0 6px 12px rgba(2,40,19,.12); } @media (prefers-color-scheme: dark) { :root{ --bg:#0a1e12; --bg2:#082010; --fg:#dbf2e2; --muted:#a9cbb1; --card:#0f1e14; --card-fg:#eaf6ee; --card-muted:#9db6a4; --card-border:#193221; --accent:#26b866; --accent-2:#1c8c4e; --confirm:#e0a33d; --chip:#0f2a15; --chip-border:#17401f; --shadow: 0 18px 36px rgba(0,0,0,.32), 0 8px 16px rgba(0,0,0,.24); } .btn-lite{ background:#1a5834; color:var(--fg); border-color:#2d8049; } .zip-form input{ background:rgba(15,46,25,.88); border-color:#274b34; color:var(--fg); } } /* Diamond fairway background pattern */ body{ margin:0; color:var(--fg); font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif; background-color: var(--bg); background-image: repeating-linear-gradient(45deg, rgba(255,255,255,.14) 0 1px, transparent 1px 128px), repeating-linear-gradient(-45deg, rgba(0,0,0,.14) 0 1px, transparent 1px 128px), linear-gradient(0deg, var(--bg), var(--bg2)); background-position: 0 0, 12px 12px, 0 0; background-attachment: fixed; min-height:100vh; } .wrap{ max-width:1100px; margin:32px auto; padding:0 20px; } /* Hero */ .hero{ position:relative; overflow:hidden; border-radius:18px; padding:24px 20px; margin:0 0 18px 0; background: linear-gradient(180deg, rgba(255,255,255,.18), rgba(255,255,255,.06)), radial-gradient(1000px 260px at 50% -60px, #1d6d3d 15%, transparent 60%), linear-gradient(135deg, #1a5d35 0%, #1f6e3c 60%, #267a47 100%); border:1px solid #225735; box-shadow: var(--shadow); } .hero h1{ margin:0; display:flex; align-items:center; gap:10px; color:#f1fff5; } .hero p{ margin:8px 0 0 32px; color:#d2e7d7 } .hero-extra{ margin-top:4px; } .loc-controls{ display:flex; flex-wrap:wrap; align-items:center; gap:12px; margin:16px 0 0 32px; } .hero-toggle{ margin:12px 0 0 32px; } /* Sticky mini header for compact view */ .mini-hero{ position:sticky; top:0; z-index:6000; display:none; align-items:center; justify-content:space-between; padding:8px 12px; margin:0 0 12px 0; border-radius:12px; background: linear-gradient(180deg, rgba(255,255,255,.12), rgba(255,255,255,.06)), linear-gradient(135deg, #1a5d35 0%, #1f6e3c 60%, #267a47 100%); border:1px solid #225735; color:#f1fff5; box-shadow: var(--shadow); } .mini-hero strong{ font-size:.95rem; letter-spacing:.02em } body.is-compact .mini-hero, body.is-collapsed .mini-hero{ display:flex; } body.is-compact .hero .hero-extra, body.is-collapsed .hero .hero-extra{ display:none; } .btn-lite{ display:inline-flex; align-items:center; gap:6px; border-radius:12px; border:1px solid rgba(255,255,255,.35); background:rgba(255,255,255,.12); color:#f4fff7; padding:8px 14px; font-weight:600; cursor:pointer; transition:transform .15s ease, filter .15s ease; } .btn-lite:hover{ filter:brightness(1.08); transform:translateY(-1px); } .btn-lite:disabled{ opacity:.55; cursor:not-allowed; transform:none; filter:none; } .zip-form{ display:flex; align-items:center; gap:8px; } .zip-form input{ background:rgba(255,255,255,.92); border:1px solid rgba(0,0,0,.18); border-radius:10px; padding:8px 12px; min-width:110px; font-size:.95rem; color:#124220; } .zip-form input:focus{ outline:2px solid rgba(14,122,58,.45); outline-offset:1px; } .zip-form .zip-submit{ padding:8px 12px; } .loc-or{ color:#c1ddc8; font-size:.9rem; font-weight:600; text-transform:uppercase; letter-spacing:.12em; } .sr-only{ position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); border:0; } .loc-status{ margin:12px 0 0 32px; color:#b7d8c0; font-size:.92rem; } .map-modal{ position:fixed; inset:0; display:none; align-items:center; justify-content:center; background:rgba(0,0,0,.55); z-index:6000; padding:24px; } .map-modalaria-hiddenfalse{ display:flex; } .map-dialog{ background:var(--card); color:var(--card-fg); border-radius:18px; width:min(700px, 100%); max-width:90vw; box-shadow:var(--shadow); position:relative; padding:18px; display:flex; flex-direction:column; gap:12px; } .map-dialog header{ display:flex; align-items:center; justify-content:space-between; } .map-dialog h2{ margin:0; font-size:1.2rem; } .map-close{ border:none; background:transparent; color:var(--card-muted); font-size:1.2rem; cursor:pointer; padding:4px 8px; } .map-close:hover{ color:var(--card-fg); } .map-instructions{ margin:0; font-size:.92rem; color:var(--card-muted); } #map-picker{ width:100%; height:360px; border-radius:14px; overflow:hidden; } .map-actions{ display:flex; justify-content:flex-end; gap:10px; } .flag{ display:inline-block; width:22px; height:22px; border-radius:50%; background: radial-gradient(circle at 30% 30%, #fff, #f1f1f1 55%, #e2e2e2); box-shadow: inset 0 0 0 2px #d2d2d2; position:relative; } .flag:after{ content:; position:absolute; left:10px; top:-24px; width:2px; height:24px; background:#2b2b2b; } .flag:before{ content:; position:absolute; left:12px; top:-24px; width:16px; height:10px; background:linear-gradient(90deg,#d00,#f55); clip-path: polygon(0 0, 100% 50%, 0 100%); } /* Cards */ .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:18px} .card{ position:relative; background:var(--card); color:var(--card-fg); border:1px solid var(--card-border); border-radius:16px; padding:16px 16px 12px; box-shadow: var(--shadow); transition: transform .15s ease, box-shadow .15s ease, border-color .2s; } .card:before{ content:; position:absolute; inset:0 0 auto auto; height:5px; width:100%; background: linear-gradient(90deg, var(--accent-2), var(--accent)); border-top-left-radius:16px; border-top-right-radius:16px; opacity:.9; } .card.empty:before{ background: linear-gradient(90deg, #b77a12, var(--confirm)); } .card:hover{ transform: translateY(-2px); box-shadow: 0 18px 36px rgba(2,40,19,.22), 0 8px 16px rgba(2,40,19,.14); } .hdr{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;margin-top:6px} .hdr .title{display:flex;flex-direction:column;gap:4px;} .hdr .subline{display:flex;flex-wrap:wrap;gap:10px;align-items:center;} .muted{color:var(--card-muted);font-size:12px} .distance-pill{ display:inline-flex; align-items:center; gap:6px; background:var(--chip); border:1px solid var(--chip-border); border-radius:999px; padding:4px 12px; font-size:.75rem; color:var(--card-fg); font-weight:600; letter-spacing:.04em; cursor:pointer; transition:transform .12s ease, box-shadow .12s ease; box-shadow:none; position:relative; font-family:inherit; line-height:1; appearance:none; } .distance-pill::after{ content:\203A; /* › visual cue */ display:inline-block; margin-left:6px; opacity:.7; font-weight:700; transform:translateX(0); transition:transform .12s ease, opacity .2s ease; } /* Hide caret when pill is empty, hidden, or disabled */ .distance-pill:empty::after{ display:none } .distance-pillhidden::after{ display:none } .distance-pill:disabled::after{ display:none } .distance-pill:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; } .distance-pill:hover{ transform:translateY(-1px); box-shadow:0 6px 14px rgba(0,0,0,.18); } .distance-pill:hover::after, .distance-pill:focus-visible::after{ transform:translateX(2px); opacity:.9; } /* Times list & chips */ ul{margin:10px 0 0 0; padding:0; list-style:none} .slot{display:grid; grid-template-columns:auto 1fr auto; column-gap:8px; align-items:center; margin:6px 0} .time{font-weight:700; font-variant-numeric: tabular-nums; white-space:nowrap} .chips{display:flex; flex-wrap:nowrap; gap:6px 8px; overflow:hidden; min-width:0; white-space:nowrap} .price{font-weight:700; font-variant-numeric: tabular-nums; white-space:nowrap; text-align:right; min-width:5ch} .price:empty::before{ content:\00A0; } .times-wrap{position:relative;} .times-list{margin:10px 0 0 0; padding:0; list-style:none;} .times-list.scrollable{ max-height:280px; overflow-y:auto; padding-right:4px; scrollbar-width:thin; scrollbar-color:var(--chip-border) transparent; overscroll-behavior: contain; } .times-list.scrollable::-webkit-scrollbar{width:6px} .times-list.scrollable::-webkit-scrollbar-track{background:transparent} .times-list.scrollable::-webkit-scrollbar-thumb{ background:var(--chip-border); border-radius:999px; } .scrollable-wrapper{position:relative; padding-bottom:6px;} .scroll-hint{ margin-top:8px; display:flex; align-items:center; gap:6px; font-size:11px; font-weight:600; letter-spacing:.08em; text-transform:uppercase; color:var(--card-muted); opacity:.95; transition:opacity .25s ease, color .25s ease; } .scroll-hint i{ font-style:normal; font-weight:700; display:inline-flex; align-items:center; justify-content:center; width:18px; height:18px; border-radius:50%; border:1px solid var(--chip-border); background:var(--chip); color:var(--card-fg); font-size:11px; line-height:1; } .scroll-hint.dim{opacity:.55;} .scroll-hint.active{opacity:.35;} .scroll-hint.hidden{opacity:0; pointer-events:none;} .chip{ display:inline-block; padding:2px 6px; border-radius:999px; background:var(--chip); border:1px solid var(--chip-border); font-size:11px; color:var(--card-fg); } .chip.money{ font-weight:700 } .chip i{ font-style:normal; opacity:.85; margin-right:4px } /* Hour grouping separator */ .hour-sep{ display:flex; align-items:center; gap:8px; margin:8px 0 4px 0; opacity:.9 } .hour-sep span{ font-size:.70rem; letter-spacing:.12em; text-transform:uppercase; color:var(--card-muted); white-space:nowrap } .hour-sep:before{ content:; display:block; height:1px; background:var(--chip-border); flex:1; opacity:.5 } .hour-sep:after{ content:; display:block; width:0 } /* Buttons */ .btn{display:inline-block;margin-top:12px;border-radius:12px;text-decoration:none;font-weight:600;line-height:1} .btn.book{ padding:10px 14px; background: linear-gradient(180deg, var(--accent), var(--accent-2)); color:#fff; } .btn.confirm{ padding:6px 10px; font-size:.85rem; background: linear-gradient(180deg, var(--confirm), #b57618); color:#fff; } .btn:hover{ filter:brightness(1.03); transform: translateY(-1px); } .directions-popover{ position:absolute; min-width:210px; background:var(--card); color:var(--card-fg); border:1px solid var(--card-border); border-radius:12px; padding:12px 14px; box-shadow:0 18px 34px rgba(10,30,18,.28); z-index:6500; } .directions-popover strong{ display:block; font-size:.8rem; text-transform:uppercase; letter-spacing:.14em; color:var(--card-muted); margin-bottom:8px; } .directions-popover .dir-from{ margin:0 0 10px 0; font-size:.75rem; color:var(--card-muted); } .directions-popover .dir-links{ display:flex; flex-direction:column; gap:8px; } .directions-popover a{ display:flex; align-items:center; justify-content:space-between; padding:8px 10px; border-radius:10px; text-decoration:none; font-weight:600; background:var(--chip); border:1px solid var(--chip-border); color:var(--card-fg); font-size:.85rem; } .directions-popover a:hover{ filter:brightness(1.08); } .directions-popover a.recommended::after{ content:Recommended; font-size:.65rem; letter-spacing:.12em; text-transform:uppercase; color:var(--card-muted); } .directions-popover button.close-popover{ margin-top:10px; align-self:flex-end; border:none; background:none; color:var(--card-muted); font-size:.75rem; font-weight:600; text-transform:uppercase; letter-spacing:.14em; cursor:pointer; } .directions-popover button.close-popover:hover{ color:var(--card-fg); } /style>/head>body> div classwrap> div classhero> h1>span classflag>/span> Tee Times Near You/h1> div classhero-extra idhero-extra> p>Share your location, drop a pin on the map, or enter a ZIP code to see the closest courses first. Without it we keep the newest updates on top./p> div classloc-controls rolegroup aria-labelTee time location options> button typebutton classbtn-lite iduse-location>Use my location/button> span classloc-or>or/span> button typebutton classbtn-lite idchoose-map>Choose on map/button> span classloc-or>or/span> form classzip-form idzip-form novalidate> label classsr-only forzip-input>ZIP code/label> input idzip-input namezip inputmodenumeric pattern0-9{5} maxlength5 autocompletepostal-code placeholderZIP code /> button typesubmit classbtn-lite zip-submit>Go/button> /form> /div> p classmuted loc-status idlocation-status data-location-status>Showing newest updates first. Choose a location to reorder by distance and tap or click the distance badge for directions./p> /div> button typebutton classbtn-lite hero-toggle idhero-toggle aria-expandedtrue aria-controlshero-extra>Hide options/button> /div> div classmini-hero idmini-hero rolebanner aria-labelTee Times sticky header> strong>Tee Times Near You/strong> button typebutton classbtn-lite mini-hero-show idmini-hero-show aria-expandedfalse aria-controlshero-extra>Show options/button> /div> div classmap-modal idmap-modal aria-hiddentrue roledialog aria-modaltrue aria-labelledbymap-title> div classmap-dialog> header> h2 idmap-title>Choose a location/h2> button typebutton classmap-close idmap-close aria-labelClose map>×/button> /header> p classmap-instructions>Pan and zoom, then click the map to drop a pin. We’ll sort courses by distance from that spot./p> div idmap-picker roleapplication aria-labelLocation picker map tabindex0>/div> div classmap-actions> button typebutton classbtn-lite idmap-cancel>Cancel/button> /div> /div> /div> div classgrid> div classcard empty data-courseWest Sayville Golf Course data-course-idsuffolk-west-sayville data-zip11796 data-lat40.7251 data-lng-73.1013 data-updated1765976304 > div classhdr> div classtitle> strong>West Sayville Golf Course/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:58:24.804914-05:00>Updated Dec 17, 2025 7:58 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://nysuffolkctyweb.myvscloud.com/webtrac/web/search.html?displaydetail&moduleGR target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseTimber Point 9 Hole White Course data-course-idsuffolk-timber-point-white data-zip11739 data-lat40.7351 data-lng-73.1519 data-updated1765976179 > div classhdr> div classtitle> strong>Timber Point 9 Hole White Course/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:56:19.682519-05:00>Updated Dec 17, 2025 7:56 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://nysuffolkctyweb.myvscloud.com/webtrac/web/search.html?displaydetail&moduleGR target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseTimber Point Blue Course (Blue to White) data-course-idsuffolk-timber-point-blue data-zip11739 data-lat40.7351 data-lng-73.1519 data-updated1765976055 > div classhdr> div classtitle> strong>Timber Point Blue Course (Blue to White)/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:54:15.150976-05:00>Updated Dec 17, 2025 7:54 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://nysuffolkctyweb.myvscloud.com/webtrac/web/search.html?displaydetail&moduleGR target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseTimber Point Red Course (Red to Blue) data-course-idsuffolk-timber-point-red data-zip11739 data-lat40.7351 data-lng-73.1519 data-updated1765975930 > div classhdr> div classtitle> strong>Timber Point Red Course (Red to Blue)/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:52:10.454851-05:00>Updated Dec 17, 2025 7:52 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://nysuffolkctyweb.myvscloud.com/webtrac/web/search.html?displaydetail&moduleGR target_blank relnoopener>Confirm here/a>/p> /div> div classcard data-courseIndian Island Golf Course data-course-idsuffolk-indian-island data-zip11901 data-lat40.9404 data-lng-72.6592 data-updated1765975835 > div classhdr> div classtitle> strong>Indian Island Golf Course/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:50:35.045000-05:00>Updated Dec 17, 2025 7:50 AM/span> /div> div classtimes-wrap scrollable-wrapper> ul classtimes-list scrollable>li classhour-sep>span>9 AM/span>/li> li classslot> span classtime>9:00 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>2 players/span>/span> span classprice>/span> /li> li classslot> span classtime>9:10 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>9:20 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>9:30 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>9:40 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>9:50 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li>li classhour-sep>span>10 AM/span>/li> li classslot> span classtime>10:10 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>1 players/span>/span> span classprice>/span> /li> li classslot> span classtime>10:20 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>10:30 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>10:40 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>10:50 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li>li classhour-sep>span>11 AM/span>/li> li classslot> span classtime>11:00 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>2 players/span>/span> span classprice>/span> /li> li classslot> span classtime>11:20 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>11:30 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>11:40 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>11:50 am/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li>li classhour-sep>span>12 PM/span>/li> li classslot> span classtime>12:00 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>12:10 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>12:20 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>12:30 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>12:40 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>12:50 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li>li classhour-sep>span>1 PM/span>/li> li classslot> span classtime>1:00 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>1:10 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>1:20 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>1:30 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>1:40 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>1:50 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li>li classhour-sep>span>2 PM/span>/li> li classslot> span classtime>2:00 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>2:10 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>2:20 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>2:30 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>2:40 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li> li classslot> span classtime>2:50 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li>li classhour-sep>span>3 PM/span>/li> li classslot> span classtime>3:00 pm/span> span classchips>span classchip>i>⛳/i>18 (Front) holes/span> span classchip>i>👥/i>4 players/span>/span> span classprice>/span> /li>/ul> div classscroll-hint aria-hiddentrue>i>↓/i>Scroll for more/div> /div> p>a classbtn book hrefhttps://nysuffolkctyweb.myvscloud.com/webtrac/web/search.html?displaydetail&moduleGR target_blank relnoopener>Book here/a>/p> /div> div classcard empty data-courseBergen Point Golf Course data-course-idsuffolk-bergen-point data-zip11704 data-lat40.6997 data-lng-73.3267 data-updated1765975819 > div classhdr> div classtitle> strong>Bergen Point Golf Course/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:50:19.272968-05:00>Updated Dec 17, 2025 7:50 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://nysuffolkctyweb.myvscloud.com/webtrac/web/search.html?displaydetail&moduleGR target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseDix Hills data-course-iddixHills data-zip11746 data-lat40.81567 data-lng-73.32831 data-updated1765975716 > div classhdr> div classtitle> strong>Dix Hills/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:48:36.328536-05:00>Updated Dec 17, 2025 7:48 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://foreupsoftware.com/index.php/booking/21595/8315#/teetimes target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseBethpage 9 Holes Midday Front 9 data-course-idbethpage-2517 data-zip11735 data-lat40.743914477381 data-lng-73.455057073234 data-updated1765975659 > div classhdr> div classtitle> strong>Bethpage 9 Holes Midday Front 9/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:47:39.597422-05:00>Updated Dec 17, 2025 7:47 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://foreupsoftware.com/index.php/booking/19765/2517#/teetimes target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseBethpage Red Course data-course-idbethpage-2432 data-zip11735 data-lat40.743914477381 data-lng-73.455057073234 data-updated1765975639 > div classhdr> div classtitle> strong>Bethpage Red Course/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:47:19.416702-05:00>Updated Dec 17, 2025 7:47 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://foreupsoftware.com/index.php/booking/19765/2432#/teetimes target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseBethpage Blue Course data-course-idbethpage-2433 data-zip11735 data-lat40.743914477381 data-lng-73.455057073234 data-updated1765975619 > div classhdr> div classtitle> strong>Bethpage Blue Course/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:46:59.509087-05:00>Updated Dec 17, 2025 7:46 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://foreupsoftware.com/index.php/booking/19765/2433#/teetimes target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseBethpage Early AM 9 Holes Blue data-course-idbethpage-2539 data-zip11735 data-lat40.743914477381 data-lng-73.455057073234 data-updated1765975599 > div classhdr> div classtitle> strong>Bethpage Early AM 9 Holes Blue/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:46:39.659484-05:00>Updated Dec 17, 2025 7:46 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://foreupsoftware.com/index.php/booking/19765/2539#/teetimes target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseSunken Meadow data-course-idsunkenMeadow data-zip11754 data-lat40.915084339894 data-lng-73.277499637758 data-updated1765975571 > div classhdr> div classtitle> strong>Sunken Meadow/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:46:11.944565-05:00>Updated Dec 17, 2025 7:46 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://foreupsoftware.com/index.php/booking/19766/2437#/teetimes target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseCrab Meadow data-course-idcrabMeadow data-zip11768 data-lat40.91931 data-lng-73.32622 data-updated1765975539 > div classhdr> div classtitle> strong>Crab Meadow/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-12-17T07:45:39.841131-05:00>Updated Dec 17, 2025 7:45 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://foreupsoftware.com/index.php/booking/21593#/teetimes target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseBethpage Black Course data-course-idbethpage-2431 data-zip11735 data-lat40.743914477381 data-lng-73.455057073234 data-updated1763733233 > div classhdr> div classtitle> strong>Bethpage Black Course/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-11-21T08:53:53.184025-05:00>Updated Nov 21, 2025 8:53 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://foreupsoftware.com/index.php/booking/19765/2431#/teetimes target_blank relnoopener>Confirm here/a>/p> /div> div classcard empty data-courseBethpage Green Course data-course-idbethpage-2434 data-zip11735 data-lat40.743914477381 data-lng-73.455057073234 data-updated1763733169 > div classhdr> div classtitle> strong>Bethpage Green Course/strong> div classsubline> button typebutton classdistance-pill data-distance-label hidden>/button> /div> /div> span classmuted title2025-11-21T08:52:49.691083-05:00>Updated Nov 21, 2025 8:52 AM/span> /div> p classmuted>em>No tee times available/em>/p> p>a classbtn confirm hrefhttps://foreupsoftware.com/index.php/booking/19765/2434#/teetimes target_blank relnoopener>Confirm here/a>/p> /div> /div> /div> script srchttps://unpkg.com/leaflet@1.9.4/dist/leaflet.js crossorigin>/script> script> (function() { const grid document.querySelector(.grid); if (!grid) return; const cards Array.from(grid.querySelectorAll(.card)); if (!cards.length) return; const statusEl document.querySelector(data-location-status); const useLocationBtn document.getElementById(use-location); const chooseMapBtn document.getElementById(choose-map); const zipForm document.getElementById(zip-form); const zipInput document.getElementById(zip-input); const zipSubmit zipForm ? zipForm.querySelector(.zip-submit) : null; const mapModal document.getElementById(map-modal); const mapClose document.getElementById(map-close); const mapCancel document.getElementById(map-cancel); const mapContainer document.getElementById(map-picker); // Sticky mini-hero behavior const hero document.querySelector(.hero); const heroExtra document.getElementById(hero-extra); const heroToggle document.getElementById(hero-toggle); const miniHero document.getElementById(mini-hero); const miniHeroShow document.getElementById(mini-hero-show); const setCompact (on) > { document.body.classList.toggle(is-compact, !!on); if (heroToggle) heroToggle.setAttribute(aria-expanded, on ? false : true); if (miniHeroShow) miniHeroShow.setAttribute(aria-expanded, on ? true : false); }; const setCollapsed (on) > { document.body.classList.toggle(is-collapsed, !!on); if (heroToggle) heroToggle.textContent on ? Show options : Hide options; if (heroToggle) heroToggle.setAttribute(aria-expanded, on ? false : true); if (miniHeroShow) miniHeroShow.setAttribute(aria-expanded, on ? true : false); }; let lastCompact false; const updateHeroState () > { if (!hero) return; const rect hero.getBoundingClientRect(); const threshold (window.scrollY + rect.top) + rect.height; const compact window.scrollY > threshold; if (compact ! lastCompact) { setCompact(compact); lastCompact compact; } }; window.addEventListener(scroll, updateHeroState, { passive: true }); window.addEventListener(resize, updateHeroState); setTimeout(updateHeroState, 0); if (heroToggle) { heroToggle.addEventListener(click, () > { const collapsed document.body.classList.contains(is-collapsed); setCollapsed(!collapsed); }); } if (miniHeroShow) { miniHeroShow.addEventListener(click, () > { setCollapsed(false); window.scrollTo({ top: 0, behavior: smooth }); setCompact(false); }); } // Scrollable times list usability enhancements const scrollWrappers Array.from(document.querySelectorAll(.scrollable-wrapper)); scrollWrappers.forEach(wrapper > { const list wrapper.querySelector(.times-list.scrollable); const hint wrapper.querySelector(.scroll-hint); if (!list || !hint) return; // Keyboard-friendly: allow focusing the list to scroll with arrows/PageUp/PageDown if (!list.hasAttribute(tabindex)) list.setAttribute(tabindex, 0); if (!list.hasAttribute(role)) list.setAttribute(role, list); if (!list.hasAttribute(aria-label)) list.setAttribute(aria-label, Tee times. Scroll for more); let hasInteracted false; let activeTimer null; const updateHint () > { const canScroll list.scrollHeight - list.clientHeight > 1; if (!canScroll) { hint.classList.add(hidden); hint.classList.remove(dim, active); return; } const atBottom list.scrollTop + list.clientHeight > list.scrollHeight - 2; const atTop list.scrollTop 1; hint.classList.toggle(hidden, atBottom); // Dim once the user has interacted or when not at the very top hint.classList.toggle(dim, hasInteracted || !atTop); }; const onScroll () > { hasInteracted true; hint.classList.remove(hidden); hint.classList.add(active); updateHint(); if (activeTimer) clearTimeout(activeTimer); activeTimer setTimeout(() > hint.classList.remove(active), 200); }; const onPointer () > { hasInteracted true; updateHint(); }; list.addEventListener(scroll, onScroll, { passive: true }); list.addEventListener(wheel, onPointer, { passive: true }); list.addEventListener(touchstart, onPointer, { passive: true }); list.addEventListener(focus, onPointer); // Initial state after layout settles setTimeout(updateHint, 0); }); // Keep hints in sync on resize window.addEventListener(resize, () > { document.querySelectorAll(.scrollable-wrapper).forEach(wrapper > { const list wrapper.querySelector(.times-list.scrollable); const hint wrapper.querySelector(.scroll-hint); if (!list || !hint) return; const canScroll list.scrollHeight - list.clientHeight > 1; const atBottom list.scrollTop + list.clientHeight > list.scrollHeight - 2; hint.classList.toggle(hidden, !canScroll || atBottom); }); }); const zipCache new Map(); const courseZipCoords {11735:{lat:40.74391447738104,lng:-73.4550570732335},11768:{lat:40.91931,lng:-73.32622},11754:{lat:40.91508433989372,lng:-73.27749963775813},11746:{lat:40.81567,lng:-73.32831},11704:{lat:40.6997,lng:-73.3267},11901:{lat:40.9404,lng:-72.6592},11739:{lat:40.7351,lng:-73.1519},11796:{lat:40.7251,lng:-73.1013}}; const courseCoordList cards .map(card > { const lat Number.parseFloat(card.dataset.lat); const lng Number.parseFloat(card.dataset.lng); return Number.isFinite(lat) && Number.isFinite(lng) ? { lat, lng } : null; }) .filter(Boolean); const distancePills cards .map(card > card.querySelector(data-distance-label)) .filter(Boolean); const isAppleDevice /(?:iphone|ipad|ipod|macintosh)/i.test(navigator.userAgent || ); let currentLocation null; let currentLocationLabel ; let directionsPopover null; let directionsFocusReturn null; const defaultCenter (() > { if (!courseCoordList.length) return { lat: 40.85, lng: -73.2, zoom: 10 }; const sum courseCoordList.reduce((acc, cur) > { acc.lat + cur.lat; acc.lng + cur.lng; return acc; }, { lat: 0, lng: 0 }); const zoom courseCoordList.length 1 ? 13 : 11; return { lat: sum.lat / courseCoordList.length, lng: sum.lng / courseCoordList.length, zoom }; })(); const hideDirectionsPopover () > { if (!directionsPopover) return; directionsPopover.remove(); directionsPopover null; if (directionsFocusReturn && typeof directionsFocusReturn.focus function) { const focusTarget directionsFocusReturn; directionsFocusReturn null; setTimeout(() > focusTarget.focus(), 0); } else { directionsFocusReturn null; } }; const showDirectionsPopover (pill, destLat, destLng, courseName) > { if (!currentLocation) return; if (!Number.isFinite(destLat) || !Number.isFinite(destLng)) { if (statusEl) statusEl.textContent We do not have coordinates for that course yet.; return; } if (directionsPopover && directionsFocusReturn pill) { hideDirectionsPopover(); return; } hideDirectionsPopover(); directionsFocusReturn pill; const origin `${currentLocation.lat},${currentLocation.lng}`; const destination `${destLat},${destLng}`; const googleParams new URLSearchParams({ api: 1, origin, destination, travelmode: driving }); const googleUrl `https://www.google.com/maps/dir/?${googleParams.toString()}`; const appleParams new URLSearchParams({ saddr: origin, daddr: destination, dirflg: d }); const appleUrl `https://maps.apple.com/?${appleParams.toString()}`; directionsPopover document.createElement(div); directionsPopover.className directions-popover; const heading document.createElement(strong); heading.textContent courseName ? (Directions - + courseName) : Directions; directionsPopover.appendChild(heading); if (currentLocationLabel) { const fromLine document.createElement(p); fromLine.className dir-from; fromLine.textContent `From ${currentLocationLabel}`; directionsPopover.appendChild(fromLine); } const linksWrap document.createElement(div); linksWrap.className dir-links; const googleLink document.createElement(a); googleLink.href googleUrl; googleLink.target _blank; googleLink.rel noopener; googleLink.textContent Google Maps; linksWrap.appendChild(googleLink); const appleLink document.createElement(a); appleLink.href appleUrl; appleLink.target _blank; appleLink.rel noopener; appleLink.textContent Apple Maps; if (isAppleDevice) appleLink.classList.add(recommended); linksWrap.appendChild(appleLink); directionsPopover.appendChild(linksWrap); const closeBtn document.createElement(button); closeBtn.type button; closeBtn.className close-popover; closeBtn.textContent Close; closeBtn.addEventListener(click, hideDirectionsPopover); directionsPopover.appendChild(closeBtn); directionsPopover.addEventListener(click, ev > ev.stopPropagation()); document.body.appendChild(directionsPopover); const pillRect pill.getBoundingClientRect(); const popRect directionsPopover.getBoundingClientRect(); const margin 12; let top window.scrollY + pillRect.bottom + 8; let left window.scrollX + pillRect.left + (pillRect.width / 2) - (popRect.width / 2); const maxLeft window.scrollX + document.documentElement.clientWidth - popRect.width - margin; if (left > maxLeft) left maxLeft; if (left window.scrollX + margin) left window.scrollX + margin; if (top + popRect.height > window.scrollY + window.innerHeight - margin) { top window.scrollY + pillRect.top - popRect.height - 8; } if (top window.scrollY + margin) top window.scrollY + margin; directionsPopover.style.top `${top}px`; directionsPopover.style.left `${left}px`; }; const handleDistanceActivation event > { const pill event.currentTarget; const card pill ? pill.closest(.card) : null; if (!card) return; if (!currentLocation) { if (statusEl) statusEl.textContent Choose a starting location first to get directions.; return; } const destLat Number.parseFloat(card.dataset.lat); const destLng Number.parseFloat(card.dataset.lng); const courseName card.dataset.course || Course; event.preventDefault(); showDirectionsPopover(pill, destLat, destLng, courseName); }; distancePills.forEach(pill > { pill.disabled true; pill.addEventListener(click, handleDistanceActivation); pill.addEventListener(keydown, ev > { if (ev.key Enter || ev.key ) { handleDistanceActivation(ev); } }); }); document.addEventListener(click, ev > { if (directionsPopover && !directionsPopover.contains(ev.target) && !ev.target.closest(data-distance-label)) { hideDirectionsPopover(); } }); window.addEventListener(scroll, hideDirectionsPopover, { passive: true }); window.addEventListener(resize, hideDirectionsPopover); let mapInstance null; let mapMarker null; let lastFocus null; const toRadians deg > deg * Math.PI / 180; const haversine (lat1, lon1, lat2, lon2) > { const R 3958.8; // Earth radius in miles const dLat toRadians(lat2 - lat1); const dLon toRadians(lon2 - lon1); const a Math.sin(dLat / 2) ** 2 + Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * Math.sin(dLon / 2) ** 2; const c 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; }; const formatDistance miles > { if (!Number.isFinite(miles)) return ; if (miles 0.5) return `${Math.round(miles * 1760)} yd away`; if (miles 10) return `${miles.toFixed(1)} mi away`; return `${Math.round(miles)} mi away`; }; const closeMapModal () > { if (!mapModal) return; mapModal.setAttribute(aria-hidden, true); document.body.style.overflow ; const focusTarget lastFocus; lastFocus null; if (focusTarget && typeof focusTarget.focus function) { setTimeout(() > focusTarget.focus(), 0); } }; const ensureMap () > { if (mapInstance || !mapContainer || typeof L undefined) return typeof L ! undefined; mapInstance L.map(mapContainer, { scrollWheelZoom: true }); mapInstance.setView(defaultCenter.lat, defaultCenter.lng, defaultCenter.zoom); L.tileLayer(https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png, { maxZoom: 19, attribution: OpenStreetMap contributors }).addTo(mapInstance); mapInstance.on(click, ev > { if (!mapInstance) return; if (!mapMarker) { mapMarker L.marker(ev.latlng).addTo(mapInstance); } else { mapMarker.setLatLng(ev.latlng); } applyLocation(ev.latlng.lat, ev.latlng.lng, your map pin); closeMapModal(); }); return true; }; const openMapModal () > { if (!mapModal) return; if (typeof L undefined) { if (statusEl) statusEl.textContent Map library failed to load. Please enter a ZIP code instead.; return; } hideDirectionsPopover(); lastFocus document.activeElement; mapModal.setAttribute(aria-hidden, false); document.body.style.overflow hidden; const ok ensureMap(); if (ok && mapInstance) { setTimeout(() > { mapInstance.invalidateSize(); mapContainer && mapContainer.focus && mapContainer.focus(); }, 100); } }; const sortCards () > { const sorted ...cards.sort((a, b) > { const da Number.parseFloat(a.dataset.distance); const db Number.parseFloat(b.dataset.distance); const hasA Number.isFinite(da); const hasB Number.isFinite(db); if (hasA && hasB) { if (Math.abs(da - db) 0.05) { const ua Number.parseInt(a.dataset.updated || 0, 10); const ub Number.parseInt(b.dataset.updated || 0, 10); return ub - ua; } return da - db; } if (hasA) return -1; if (hasB) return 1; const ua Number.parseInt(a.dataset.updated || 0, 10); const ub Number.parseInt(b.dataset.updated || 0, 10); return ub - ua; }); sorted.forEach(card > grid.appendChild(card)); }; const applyLocation (lat, lng, label) > { currentLocation { lat, lng }; currentLocationLabel label || your location; hideDirectionsPopover(); let found 0; cards.forEach(card > { const cLat Number.parseFloat(card.dataset.lat); const cLng Number.parseFloat(card.dataset.lng); const distanceLabel card.querySelector(data-distance-label); if (Number.isFinite(cLat) && Number.isFinite(cLng)) { const distance haversine(lat, lng, cLat, cLng); card.dataset.distance distance.toFixed(3); if (distanceLabel) { const pretty formatDistance(distance); distanceLabel.textContent pretty; distanceLabel.hidden false; distanceLabel.disabled false; const courseName card.dataset.course || this course; distanceLabel.setAttribute(aria-label, `${pretty} from ${currentLocationLabel}. Open directions for ${courseName}.`); } found + 1; } else { delete card.dataset.distance; if (distanceLabel) { distanceLabel.hidden true; distanceLabel.disabled true; } } }); sortCards(); if (statusEl) { statusEl.textContent found ? `Sorting by distance to ${currentLocationLabel}. Tap or click the distance badge for directions.` : `Location set for ${currentLocationLabel}, but no course coordinates were available.`; } }; const handleGeoError err > { if (useLocationBtn) useLocationBtn.disabled false; if (!statusEl) return; if (err && err.code err.PERMISSION_DENIED) { statusEl.textContent Location permission denied. Use the map picker or enter a ZIP code instead.; } else { statusEl.textContent Unable to retrieve your location. Try the map picker or enter a ZIP code.; } }; const lookupZip async zip > { if (zipCache.has(zip)) return zipCache.get(zip); if (courseZipCoords && Object.prototype.hasOwnProperty.call(courseZipCoords, zip)) { const coords courseZipCoordszip; if (coords && Number.isFinite(coords.lat) && Number.isFinite(coords.lng)) { const result { lat: coords.lat, lng: coords.lng }; zipCache.set(zip, result); return result; } } const resp await fetch(`https://api.zippopotam.us/us/${zip}`); if (!resp.ok) throw new Error(zip-lookup-failed); const data await resp.json(); const place data.places && data.places0; const lat place ? Number.parseFloat(place.latitude) : NaN; const lng place ? Number.parseFloat(place.longitude) : NaN; if (!Number.isFinite(lat) || !Number.isFinite(lng)) throw new Error(zip-no-coords); const result { lat, lng }; zipCache.set(zip, result); return result; }; if (chooseMapBtn) { chooseMapBtn.addEventListener(click, () > { openMapModal(); }); } if (mapClose) mapClose.addEventListener(click, closeMapModal); if (mapCancel) mapCancel.addEventListener(click, closeMapModal); if (mapModal) { mapModal.addEventListener(click, ev > { if (ev.target mapModal) closeMapModal(); }); } document.addEventListener(keydown, ev > { if (ev.key Escape) { if (mapModal && mapModal.getAttribute(aria-hidden) false) { closeMapModal(); ev.preventDefault(); return; } if (directionsPopover) { hideDirectionsPopover(); ev.preventDefault(); } } }); if (useLocationBtn) { useLocationBtn.addEventListener(click, () > { if (!navigator.geolocation) { if (statusEl) statusEl.textContent Geolocation is not supported in this browser. Use the map picker or enter a ZIP code.; return; } useLocationBtn.disabled true; if (statusEl) statusEl.textContent Requesting your location...; navigator.geolocation.getCurrentPosition( position > { if (useLocationBtn) useLocationBtn.disabled false; const { latitude, longitude } position.coords; applyLocation(latitude, longitude, your device); }, handleGeoError, { enableHighAccuracy: false, timeout: 10000, maximumAge: 300000 } ); }); } if (zipForm && zipInput) { zipForm.addEventListener(submit, async ev > { ev.preventDefault(); const raw zipInput.value.trim(); if (!/^0-9{5}$/.test(raw)) { if (statusEl) statusEl.textContent Please enter a valid 5-digit ZIP code.; zipInput.focus(); return; } if (statusEl) statusEl.textContent `Looking up ZIP ${raw}...`; if (zipInput) zipInput.disabled true; if (zipSubmit) zipSubmit.disabled true; try { const coords await lookupZip(raw); applyLocation(coords.lat, coords.lng, `ZIP ${raw}`); } catch (error) { if (statusEl) statusEl.textContent Could not resolve that ZIP code. Try another ZIP or use the map picker.; } finally { if (zipInput) zipInput.disabled false; if (zipSubmit) zipSubmit.disabled false; } }); } })(); /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]