Can karate infrastructure accelerate Southeast Asia MMA development the way wrestling fed American fighters into the UFC? Vietnam and Singapore are investing heavily in national karate programs, building coaching pipelines, sports science systems, and competitive pathways. But here’s the thing: the transfer won’t be direct athlete conversion. The real impact comes from coaching infrastructure that elevates regional MMA training quality. From cultural resistance to competitive psychology differences to the incentive structure that keeps elite karateka in their sport – understanding Southeast Asia MMA development in 2026 requires looking beyond simple athlete crossover to see the systematic foundation being built.
Can Karate Infrastructure Accelerate Southeast Asia MMA Development? Karate practitioners in training uniforms.
Support the Ringside Report Network

When Vietnam and Singapore start investing serious money into national karate programs and actually produce international medalists, that’s not just about traditional martial arts anymore. That’s infrastructure. That’s systematic athlete development. And if you’ve been following combat sports the way we have at Ringside Report Network, you know exactly where this conversation has to go next: can this traditional martial arts foundation accelerate Southeast Asia MMA development the same way wrestling programs fed American cage fighters into the UFC?

The obvious answer is yes. More discipline equals better fighters. Case closed, right? Come on. It’s way more complicated than that, and understanding Southeast Asia MMA development in 2026 requires looking beyond simple athlete conversion to see what’s actually being built in Vietnam, Singapore, and the broader region.

Here’s the thing—when you build legitimate martial arts infrastructure at the national level with government backing, coaching pipelines, and competitive pathways, something significant eventually happens. Whether that translates directly to MMA champions or creates the foundation for regional combat sports dominance depends on factors most Western observers are completely missing.

Support the Ringside Report Network
Support the Ringside Report Network
Rash Guards

Why Karate Infrastructure Actually Matters for MMA

Here’s what’s happening that most people miss: Vietnam and Singapore aren’t just throwing money at karate because they love kata competitions. They’re building national-level training systems with proper coaching pipelines, sports science integration, and competitive pathways from youth programs through elite international competition. When Vietnam produces karate medalists at regional championships, that represents years of systematic development—not just talented kids finding a dojo.

This matters for Southeast Asia MMA development because the infrastructure is what counts. You know what American wrestling gave MMA? Not just takedown skills. It gave us athletes who understood training camps, weight cutting, competitive psychology, and how to peak for specific dates. The technical wrestling helped, sure, but the systematic athlete development is what created champions.

Support the Ringside Report Network

Up to 40% Off Great Gifts

Southeast Asia’s karate investment could provide that same foundation. You’re talking about athletes who’ve been training striking fundamentals since childhood, who understand competition pressure, who’ve navigated national team selection processes. That’s the thing—these aren’t hobbyists. These are athletes with professional training habits before they ever think about cage fighting.


The Striking Base Advantage

And let’s be specific about what karate brings technically. Modern sport karate, especially at the Olympic level these days, emphasizes explosive in-and-out movement, precise distance management, and lightning-fast counter-striking. Sound familiar? That’s precisely what makes elite MMA strikers dangerous. Look at fighters like Stephen Thompson or Lyoto Machida—their karate backgrounds didn’t just teach them how to throw kicks, it taught them timing and angles that traditional boxing or kickboxing don’t emphasize the same way.

Southeast Asian karate programs focusing on international competition are producing athletes with these exact skills. Vietnam’s recent success in regional karate championships shows they’re not teaching traditional kata-heavy styles—they’re developing explosive, athletic competitors who can score in fractions of seconds.


Let’s Be Honest About the Massive Gaps

But here’s where I might be completely wrong about Southeast Asia MMA development through karate conversion: Karate doesn’t teach you how to defend takedowns. It doesn’t teach you what to do when someone’s in your guard, throwing elbows. And most importantly, the competitive psychology is entirely different.

Karate matches last minutes. MMA fights are wars of attrition. The mental approach to a three-round MMA fight versus a karate point-fighting match? Totally different animals. You can have perfect karate technique and get absolutely smothered by a mediocre wrestler who just wants to make you miserable for fifteen minutes.


The Cultural Resistance Factor

There’s also a cultural element that people ignore when discussing Southeast Asia MMA development. Traditional martial arts in Southeast Asia carry significant cultural prestige. Karate, like other traditional disciplines, is seen as character-building and respectable. MMA? Still fighting the “human cockfighting” perception in many Asian markets. Parents who’ll proudly send their kids to national karate programs might view MMA as barbaric.

What do you expect? These are cultures with deep martial arts traditions that emphasize discipline and respect. The cage-fighting aesthetic doesn’t always align with those values, regardless of how sophisticated modern MMA has become.


The Wrestling Comparison Doesn’t Actually Hold Up

Why America’s Path Won’t Work in Asia

Here’s the reality: American wrestlers transitioned to MMA because wrestling was already culturally embedded in schools and universities, but had limited professional opportunities. Karate in Vietnam and Singapore? It’s being built as a destination sport with government backing and international competition prestige. Why would elite karateka abandon that for the uncertainty of MMA careers?

The American wrestling-to-MMA pipeline worked because wrestlers had nowhere else to go professionally. Southeast Asian karate athletes have legitimate competitive pathways with national support. The incentive structure is completely different.

Plus, wrestling’s direct applicability to MMA control positions made the transition more natural. Karate’s striking skills are valuable, but you need to add entirely new grappling dimensions. That’s a bigger technical leap than wrestlers adding striking.


My Bold Prediction: It’ll Work But Not How You Think

The Real Impact Comes From Coaching Infrastructure

Here’s what I actually think happens with Southeast Asia MMA development over the next five years: the karate investment won’t directly create MMA champions through athlete conversion. Instead, it establishes coaching infrastructure and sports science expertise that MMA gyms can tap into.

The trainers developing Vietnam’s karate medalists understand periodization, strength and conditioning, sports psychology, and competition preparation. When MMA gyms in the region need to level up their programs, they’ll recruit these coaches or adopt their methodologies. That’s the real transfer of knowledge—not individual athletes switching sports, but systematic training expertise elevating the entire regional MMA ecosystem.

Look at Thailand. Their Muay Thai infrastructure didn’t create MMA dominance through direct athlete conversion. It made a culture of striking excellence and training methodology that MMA fighters could learn from. Southeast Asia’s karate programs will likely function similarly—as a resource that improves regional MMA quality without necessarily producing champions directly from karate ranks.


Where This Could Go Wrong

Of course, I could be completely missing a generation of young karate athletes who see MMA as the ultimate test of their skills. If ONE Championship or other Asian promotions start actively recruiting from karate programs with proper transition support, we might see a more direct pipeline develop. But that requires promoter investment and a cultural shift that isn’t guaranteed.


What Happens Next in 2026 and Beyond

The next five years will tell us everything about Southeast Asia MMA development and whether this karate investment pays off. If Vietnam and Singapore’s karate programs continue producing international success, watch whether their next generation of athletes starts cross-training in grappling. Watch whether MMA promotions start hosting events in these countries and actively recruiting from traditional martial arts programs. Watch whether the coaching expertise developed in karate programs starts appearing in MMA gyms.

Brother, Southeast Asia’s combat sports landscape is evolving faster than most Western observers realize. The karate investment is real, the infrastructure is being built, and the athlete development systems are producing results. Whether that translates to MMA dominance depends on factors beyond just technical skill—it’s about incentives, cultural acceptance, and promotional support.

But one thing’s sure: when you build legitimate martial arts infrastructure at the national level, something significant eventually comes from it. Maybe not what everyone expects, but something that changes the combat sports landscape. We’ve seen it happen before. We’ll see it happen again.

Ringside Report Network’s Combat Sports Gym Finder .gym-finder * { margin: 0; padding: 0; box-sizing: border-box; } .gym-finder { width: 100% !important; max-width: 700px !important; margin: 0 auto !important; background: #04010E !important; border-radius: 16px !important; overflow: hidden !important; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5) !important; border: 2px solid #4a6fa5 !important; font-family: -apple-system, BlinkMacSystemFont, ‘Segoe UI’, Roboto, Oxygen, Ubuntu, sans-serif !important; } .gym-finder-header { background: linear-gradient(135deg, #283655 0%, #336699 100%) !important; padding: 20px 24px !important; } .gym-finder-header h2 { color: #FFFFFF !important; font-size: 24px !important; font-weight: 700 !important; display: flex !important; align-items: center !important; gap: 10px !important; text-shadow: 0 2px 4px rgba(0,0,0,0.3) !important; margin: 0 !important; padding: 0 !important; } .gym-finder-header p { color: #FFFFFF !important; font-size: 14px !important; margin-top: 6px !important; opacity: 0.95 !important; font-weight: 500 !important; } .gym-finder-content { padding: 24px !important; background: #04010E !important; } .gym-finder .search-row { display: flex !important; gap: 10px !important; margin-bottom: 14px !important; } .gym-finder .search-input-wrapper { flex: 1 !important; position: relative !important; } .gym-finder .search-input { width: 100% !important; padding: 16px 16px 16px 48px !important; background: #FFFFFF !important; border: 2px solid #4a6fa5 !important; border-radius: 12px !important; color: #1a1a2e !important; font-size: 16px !important; font-weight: 500 !important; transition: all 0.2s !important; } .gym-finder .search-select { width: 100% !important; padding: 16px !important; background: #FFFFFF !important; border: 2px solid #4a6fa5 !important; border-radius: 12px !important; color: #1a1a2e !important; font-size: 16px !important; font-weight: 500 !important; transition: all 0.2s !important; cursor: pointer !important; appearance: none !important; background-image: url(“data:image/svg+xml,%3Csvg width=’12’ height=’12’ viewBox=’0 0 24 24′ fill=’none’ stroke=’%231a1a2e’ stroke-width=’3′ xmlns=’http://www.w3.org/2000/svg’%3E%3Cpath d=’m6 9 6 6 6-6’/%3E%3C/svg%3E”) !important; background-repeat: no-repeat !important; background-position: right 16px center !important; } .gym-finder .search-input:focus, .gym-finder .search-select:focus { outline: none !important; border-color: #32B258 !important; box-shadow: 0 0 0 4px rgba(50, 178, 88, 0.3) !important; } .gym-finder .search-input::placeholder { color: #666677 !important; font-weight: 400 !important; } .gym-finder .search-icon { position: absolute !important; left: 16px !important; top: 50% !important; transform: translateY(-50%) !important; color: #336699 !important; } .gym-finder .options-row { display: flex !important; gap: 10px !important; margin-bottom: 18px !important; flex-wrap: wrap !important; } .gym-finder .country-select-wrapper { flex: 1 !important; min-width: 150px !important; } .gym-finder .unit-toggle { display: flex !important; background: #FFFFFF !important; border: 2px solid #4a6fa5 !important; border-radius: 12px !important; overflow: hidden !important; } .gym-finder .unit-btn { padding: 16px 20px !important; background: transparent !important; border: none !important; color: #1a1a2e !important; font-size: 14px !important; font-weight: 700 !important; cursor: pointer !important; transition: all 0.2s !important; } .gym-finder .unit-btn.active { background: #336699 !important; color: #FFFFFF !important; } .gym-finder .unit-btn:hover:not(.active) { background: #e8f0f8 !important; } .gym-finder .btn { padding: 16px 20px !important; border: none !important; border-radius: 12px !important; font-size: 14px !important; font-weight: 700 !important; cursor: pointer !important; transition: all 0.2s !important; display: flex !important; align-items: center !important; gap: 8px !important; } .gym-finder .btn-primary { background: #32B258 !important; color: #FFFFFF !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; } .gym-finder .btn-primary:hover { background: #28a04a !important; } .gym-finder .btn-secondary { background: #336699 !important; color: #FFFFFF !important; } .gym-finder .btn-secondary:hover { background: #4080b8 !important; } .gym-finder .btn:disabled { opacity: 0.5 !important; cursor: not-allowed !important; } .gym-finder .filter-toggle { background: #1a2744 !important; border: 2px solid #4a6fa5 !important; border-radius: 12px !important; color: #FFFFFF !important; font-size: 14px !important; font-weight: 700 !important; cursor: pointer !important; display: flex !important; align-items: center !important; gap: 10px !important; padding: 14px 18px !important; transition: all 0.2s !important; width: 100% !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; } .gym-finder .filter-toggle:hover { background: #253350 !important; border-color: #32B258 !important; } .gym-finder .filters { display: none; flex-wrap: wrap !important; gap: 10px !important; padding: 20px !important; background: #0d1520 !important; border: 2px solid #4a6fa5 !important; border-radius: 12px !important; margin-top: 14px !important; margin-bottom: 18px !important; } .gym-finder .filters.show { display: flex !important; } .gym-finder .filter-btn { padding: 12px 20px !important; border: none !important; border-radius: 25px !important; font-size: 14px !important; font-weight: 700 !important; cursor: pointer !important; transition: all 0.2s !important; background: #FFFFFF !important; color: #1a1a2e !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; } .gym-finder .filter-btn:hover { background: #e8f0f8 !important; transform: translateY(-1px) !important; } .gym-finder .filter-btn.active { background: #32B258 !important; color: #FFFFFF !important; box-shadow: 0 4px 12px rgba(50, 178, 88, 0.4) !important; } .gym-finder .select-all-row { width: 100% !important; display: flex !important; gap: 10px !important; margin-bottom: 14px !important; padding-bottom: 14px !important; border-bottom: 2px solid #4a6fa5 !important; } .gym-finder .select-all-btn { padding: 10px 18px !important; border: none !important; border-radius: 8px !important; font-size: 13px !important; font-weight: 700 !important; cursor: pointer !important; background: #336699 !important; color: #FFFFFF !important; transition: all 0.2s !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; } .gym-finder .select-all-btn:hover { background: #4080b8 !important; } .gym-finder .error { padding: 14px 18px !important; background: #3d1a1f !important; border: 2px solid #ff6b7a !important; border-radius: 12px !important; color: #ff8a95 !important; font-size: 14px !important; font-weight: 600 !important; margin-bottom: 16px !important; } .gym-finder .warning { padding: 14px 18px !important; background: #3d3a1a !important; border: 2px solid #ffd54f !important; border-radius: 12px !important; color: #ffe082 !important; font-size: 14px !important; font-weight: 600 !important; margin-bottom: 16px !important; } .gym-finder .info { padding: 14px 18px !important; background: #1a2d3d !important; border: 2px solid #64b5f6 !important; border-radius: 12px !important; color: #90caf9 !important; font-size: 14px !important; font-weight: 600 !important; margin-bottom: 16px !important; } .gym-finder .results { margin-top: 20px !important; } .gym-finder .results-header { color: #FFFFFF !important; font-size: 18px !important; font-weight: 700 !important; margin-bottom: 16px !important; display: flex !important; align-items: center !important; gap: 10px !important; } .gym-finder .results-header svg { color: #32B258 !important; } .gym-finder .map-container { border-radius: 12px !important; overflow: hidden !important; border: 2px solid #4a6fa5 !important; margin-bottom: 16px !important; } .gym-finder .map-container iframe { display: block !important; width: 100% !important; height: 220px !important; border: none !important; } .gym-finder .gym-links { display: flex !important; flex-direction: column !important; gap: 10px !important; } .gym-finder .gym-link { display: flex !important; align-items: center !important; justify-content: space-between !important; padding: 18px 20px !important; background: #FFFFFF !important; border: 2px solid #4a6fa5 !important; border-radius: 12px !important; text-decoration: none !important; transition: all 0.2s !important; } .gym-finder .gym-link:hover { background: #e8f8ec !important; border-color: #32B258 !important; transform: translateY(-2px) !important; box-shadow: 0 4px 12px rgba(50, 178, 88, 0.2) !important; } .gym-finder .gym-link-text { color: #1a1a2e !important; font-weight: 700 !important; font-size: 16px !important; } .gym-finder .gym-link-subtext { color: #336699 !important; font-size: 14px !important; margin-left: 8px !important; font-weight: 500 !important; } .gym-finder .gym-link svg { color: #336699 !important; transition: color 0.2s !important; flex-shrink: 0 !important; } .gym-finder .gym-link:hover svg { color: #32B258 !important; } .gym-finder .results-footer { text-align: center !important; color: #FFFFFF !important; font-size: 13px !important; margin-top: 20px !important; font-weight: 500 !important; opacity: 0.8 !important; } .gym-finder .initial-state { text-align: center !important; padding: 50px 20px !important; } .gym-finder .initial-state-icon { width: 80px !important; height: 80px !important; background: #1a2744 !important; border: 2px solid #4a6fa5 !important; border-radius: 50% !important; display: flex !important; align-items: center !important; justify-content: center !important; margin: 0 auto 20px !important; } .gym-finder .initial-state-icon svg { color: #FFFFFF !important; opacity: 0.7 !important; } .gym-finder .initial-state p { color: #FFFFFF !important; font-size: 16px !important; font-weight: 500 !important; line-height: 1.6 !important; } .gym-finder-footer { padding: 16px 24px !important; background: #0d1520 !important; border-top: 2px solid #4a6fa5 !important; text-align: center !important; } .gym-finder-footer p { color: #FFFFFF !important; font-size: 13px !important; font-weight: 500 !important; opacity: 0.7 !important; } .gym-finder .spinner { animation: gym-finder-spin 1s linear infinite !important; } @keyframes gym-finder-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* MOBILE STYLES */ @media (max-width: 600px) { .gym-finder { border-radius: 12px !important; margin: 0 8px !important; } .gym-finder-header { padding: 16px 18px !important; } .gym-finder-header h2 { font-size: 20px !important; } .gym-finder-header h2 svg { width: 20px !important; height: 20px !important; } .gym-finder-content { padding: 16px !important; } .gym-finder .search-row { flex-wrap: wrap !important; } .gym-finder .search-input-wrapper { width: 100% !important; flex: none !important; } .gym-finder .search-input { padding: 16px 16px 16px 48px !important; font-size: 16px !important; } .gym-finder .btn { padding: 16px !important; } .gym-finder .btn-text { display: none !important; } .gym-finder .options-row { flex-direction: column !important; gap: 10px !important; } .gym-finder .country-select-wrapper { width: 100% !important; } .gym-finder .search-select { padding: 16px !important; font-size: 16px !important; } .gym-finder .unit-toggle { width: 100% !important; justify-content: center !important; } .gym-finder .unit-btn { flex: 1 !important; padding: 16px !important; font-size: 15px !important; } .gym-finder .filter-toggle { padding: 14px 16px !important; font-size: 13px !important; } .gym-finder .filters { padding: 16px !important; gap: 8px !important; } .gym-finder .filter-btn { padding: 12px 16px !important; font-size: 12px !important; flex-grow: 1 !important; text-align: center !important; min-width: calc(33% – 8px) !important; } .gym-finder .select-all-row { flex-wrap: wrap !important; } .gym-finder .select-all-btn { flex: 1 !important; text-align: center !important; padding: 12px !important; } .gym-finder .results-header { font-size: 16px !important; } .gym-finder .map-container iframe { height: 180px !important; } .gym-finder .gym-link { padding: 16px !important; } .gym-finder .gym-link-text { font-size: 14px !important; } .gym-finder .gym-link-subtext { display: none !important; } .gym-finder .initial-state { padding: 40px 16px !important; } .gym-finder .initial-state-icon { width: 64px !important; height: 64px !important; } .gym-finder .initial-state-icon svg { width: 28px !important; height: 28px !important; } .gym-finder .initial-state p { font-size: 14px !important; } .gym-finder-footer { padding: 14px 18px !important; } } /* Extra small screens */ @media (max-width: 380px) { .gym-finder .filter-btn { min-width: calc(50% – 6px) !important; font-size: 11px !important; padding: 10px 12px !important; } }

Ringside Report Network’s Combat Sports Gym Finder

Find BJJ, Boxing, Muay Thai & more near you

All Countries United States Canada United Kingdom Australia Brazil Germany France Japan Mexico Netherlands Ireland New Zealand Philippines Poland Russia South Africa South Korea Spain Sweden Thailand

Enter your location, select disciplines,
then search to find combat sports gyms nearby

(function() { // State let coordinates = null; let locationName = ”; let selectedTypes = []; let distanceUnit = ‘miles’; // Elements const locationInput = document.getElementById(‘locationInput’); const countrySelect = document.getElementById(‘countrySelect’); const searchBtn = document.getElementById(‘searchBtn’); const gpsBtn = document.getElementById(‘gpsBtn’); const filterToggle = document.getElementById(‘filterToggle’); const filters = document.getElementById(‘filters’); const filterCount = document.getElementById(‘filterCount’); const errorEl = document.getElementById(‘error’); const warningEl = document.getElementById(‘warning’); const infoEl = document.getElementById(‘info’); const initialState = document.getElementById(‘initialState’); const results = document.getElementById(‘results’); const locationNameEl = document.getElementById(‘locationName’); const mapFrame = document.getElementById(‘mapFrame’); const gymLinks = document.getElementById(‘gymLinks’); const filterBtns = document.querySelectorAll(‘.filter-btn’); const unitKm = document.getElementById(‘unitKm’); const unitMiles = document.getElementById(‘unitMiles’); const selectAllBtn = document.getElementById(‘selectAllBtn’); const clearAllBtn = document.getElementById(‘clearAllBtn’); // Icons const searchIcon = ”; const spinnerIcon = ”; const externalIcon = ”; // Functions function showError(message) { errorEl.textContent = message; errorEl.style.display = ‘block’; warningEl.style.display = ‘none’; infoEl.style.display = ‘none’; } function hideError() { errorEl.style.display = ‘none’; } function showWarning() { warningEl.style.display = ‘block’; errorEl.style.display = ‘none’; infoEl.style.display = ‘none’; } function hideWarning() { warningEl.style.display = ‘none’; } function showInfo(message) { infoEl.textContent = message; infoEl.style.display = ‘block’; } function hideInfo() { infoEl.style.display = ‘none’; } function setLoading(isLoading) { searchBtn.disabled = isLoading; gpsBtn.disabled = isLoading; searchBtn.innerHTML = isLoading ? spinnerIcon + ‘Searching…‘ : searchIcon + ‘Search‘; } function updateFilterCount() { filterCount.textContent = selectedTypes.length; if (selectedTypes.length > 0) { hideWarning(); } } function showResults() { if (selectedTypes.length === 0) { showWarning(); return; } hideWarning(); hideInfo(); initialState.style.display = ‘none’; results.style.display = ‘block’; // Show friendly location name const displayName = locationName.split(‘,’)[0].trim(); locationNameEl.textContent = displayName; // Update map const bbox = `${coordinates.lng – 0.05},${coordinates.lat – 0.05},${coordinates.lng + 0.05},${coordinates.lat + 0.05}`; mapFrame.src = `https://www.openstreetmap.org/export/embed.html?bbox=${bbox}&layer=mapnik&marker=${coordinates.lat},${coordinates.lng}`; // Update gym links gymLinks.innerHTML = ”; filterBtns.forEach(btn => { if (selectedTypes.includes(btn.dataset.type)) { const searchTerm = btn.dataset.search; const label = btn.textContent; const query = encodeURIComponent(`${searchTerm} near ${locationName}`); const url = `https://www.google.com/maps/search/${query}/@${coordinates.lat},${coordinates.lng},13z`; const link = document.createElement(‘a’); link.href = url; link.target = ‘_blank’; link.rel = ‘noopener noreferrer’; link.className = ‘gym-link’; link.innerHTML = `
${label} Gyms near you
${externalIcon} `; gymLinks.appendChild(link); } }); } // Geocoding with multiple fallback attempts async function geocodeLocation(query, country) { const searchQueries = []; // Build search queries in order of specificity if (country) { searchQueries.push(`${query}, ${country}`); } searchQueries.push(query); // If query looks like an address, also try just the city/region part if (query.includes(‘,’)) { const parts = query.split(‘,’).map(p => p.trim()); if (parts.length >= 2) { // Try city, country if (country) { searchQueries.push(`${parts[1]}, ${country}`); } searchQueries.push(parts[1]); } } // Try postal code pattern (for Canada: A1A 1A1, for US: 12345) const postalMatch = query.match(/[A-Za-z]\d[A-Za-z]\s*\d[A-Za-z]\d|\d{5}/); if (postalMatch && country) { searchQueries.push(`${postalMatch[0]}, ${country}`); } for (const searchQuery of searchQueries) { try { const response = await fetch( `https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(searchQuery)}&format=json&limit=1&addressdetails=1`, { headers: { ‘Accept’: ‘application/json’ } } ); if (!response.ok) continue; const data = await response.json(); if (data.length > 0) { return { lat: parseFloat(data[0].lat), lng: parseFloat(data[0].lon), displayName: data[0].display_name, searchUsed: searchQuery }; } } catch (err) { console.log(‘Geocode attempt failed for:’, searchQuery); continue; } } return null; } async function searchLocation() { const query = locationInput.value.trim(); const country = countrySelect.value; if (!query) { showError(‘Please enter a location’); return; } if (selectedTypes.length === 0) { showWarning(); return; } hideError(); hideWarning(); hideInfo(); setLoading(true); try { const result = await geocodeLocation(query, country); if (result) { coordinates = { lat: result.lat, lng: result.lng }; locationName = result.displayName.split(‘,’).slice(0, 3).join(‘,’); // Update input with friendly name const friendlyName = result.displayName.split(‘,’)[0].trim(); locationInput.value = friendlyName; showResults(); } else { showError(‘Location not found. Try a city name or postal code.’); } } catch (err) { showError(‘Error searching for location. Please try again.’); } setLoading(false); } function useGeolocation() { if (!navigator.geolocation) { showError(‘Geolocation is not supported by your browser’); return; } if (selectedTypes.length === 0) { showWarning(); return; } hideError(); hideWarning(); hideInfo(); setLoading(true); navigator.geolocation.getCurrentPosition( async (position) => { coordinates = { lat: position.coords.latitude, lng: position.coords.longitude }; try { const response = await fetch( `https://nominatim.openstreetmap.org/reverse?lat=${coordinates.lat}&lon=${coordinates.lng}&format=json&addressdetails=1` ); const data = await response.json(); const city = data.address?.city || data.address?.town || data.address?.village || data.address?.municipality || ”; const state = data.address?.state || data.address?.province || ”; const country = data.address?.country || ”; locationName = [city, state, country].filter(Boolean).join(‘, ‘); locationInput.value = city || locationName; } catch { locationName = `${coordinates.lat.toFixed(4)}, ${coordinates.lng.toFixed(4)}`; locationInput.value = locationName; } setLoading(false); showResults(); }, (err) => { let errorMsg = ‘Unable to get your location. ‘; if (err.code === 1) { errorMsg += ‘Please allow location access or enter your location manually.’; } else if (err.code === 2) { errorMsg += ‘Position unavailable. Please enter your location manually.’; } else { errorMsg += ‘Please enter your location manually.’; } showError(errorMsg); setLoading(false); }, { enableHighAccuracy: true, timeout: 10000 } ); } // Event Listeners searchBtn.addEventListener(‘click’, searchLocation); locationInput.addEventListener(‘keydown’, (e) => { if (e.key === ‘Enter’) searchLocation(); }); gpsBtn.addEventListener(‘click’, useGeolocation); filterToggle.addEventListener(‘click’, () => { filters.classList.toggle(‘show’); }); filterBtns.forEach(btn => { btn.addEventListener(‘click’, () => { const type = btn.dataset.type; if (btn.classList.contains(‘active’)) { selectedTypes = selectedTypes.filter(t => t !== type); btn.classList.remove(‘active’); } else { selectedTypes.push(type); btn.classList.add(‘active’); } updateFilterCount(); if (coordinates && selectedTypes.length > 0) { showResults(); } }); }); selectAllBtn.addEventListener(‘click’, () => { selectedTypes = []; filterBtns.forEach(btn => { btn.classList.add(‘active’); selectedTypes.push(btn.dataset.type); }); updateFilterCount(); if (coordinates) showResults(); }); clearAllBtn.addEventListener(‘click’, () => { selectedTypes = []; filterBtns.forEach(btn => { btn.classList.remove(‘active’); }); updateFilterCount(); }); // Unit toggle unitKm.addEventListener(‘click’, () => { distanceUnit = ‘km’; unitKm.classList.add(‘active’); unitMiles.classList.remove(‘active’); }); unitMiles.addEventListener(‘click’, () => { distanceUnit = ‘miles’; unitMiles.classList.add(‘active’); unitKm.classList.remove(‘active’); }); })();

Tags

LinkedIn
Pinterest
Facebook
X

In the Ring

The Ringside Report Network website contains links to affiliate websites, and we receive an affiliate commission for any purchases you make on the affiliate website using such links, including Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for us to earn advertising fees by linking to Amazon.com and affiliated websites.

The Latest