1// æ¤ç´¢æ©è½ã®å®è£ 2 3// ã°ãã¼ãã«å¤æ° 4let selectedMapPosition = null; 5 6// ãæ°ã«å ¥ãæ½è¨ã®ãã£ãã·ã¥ï¼éè¤å¼ã³åºã鲿¢ï¼ 7let savedFacilitiesCache = null; 8let savedFacilitiesCacheTime = 0; 9const SAVED_FACILITIES_CACHE_TTL = 2000; // 2ç§éãã£ãã·ã¥ 10 11// loadUserFavoritesãå®äºãããã©ããã®ãã©ã° 12window.userFavoritesLoaded = false; 13let selectedAddressPosition = null; 14let mapClickListener = null; 15let currentSearchResultIndices = null; // ç¾å¨ã®æ¤ç´¢çµæã®ã¤ã³ããã¯ã¹ 16 17// ãã°ã¤ã³ç¶æ ã«å¿ãã¦ãã¤æ½è¨ãªãã·ã§ã³ã®æå¹/ç¡å¹ãåãæ¿ã 18function updateMyFacilityOption() { 19 const myFacilityOption = document.getElementById('myFacilityOption'); 20 const myFacilityRadio = document.getElementById('myFacilityRadio'); 21 22 if (window.currentUser && window.currentUser.facilityName) { 23 // ãã°ã¤ã³ä¸ï¼æå¹å 24 myFacilityOption.classList.remove('disabled'); 25 myFacilityRadio.disabled = false; 26 } else { 27 // ãã°ã¢ã¦ãä¸ï¼ç¡å¹å 28 myFacilityOption.classList.add('disabled'); 29 myFacilityRadio.disabled = true; 30 31 // ãã鏿ããã¦ããããGPSã«åãæ¿ã 32 if (myFacilityRadio.checked) { 33 document.querySelector('input[name="baseLocation"][value="gps"]').checked = true; 34 } 35 } 36} 37 38// æ¤ç´¢ã¢ã¼ãã«ãéãæã«ãªãã·ã§ã³ãæ´æ° 39window.addEventListener('DOMContentLoaded', updateMyFacilityOption); 40 41// ã¿ãåãæ¿ã 42function switchSearchTab(tabName) { 43 // ãã¹ã¦ã®ã¿ãã¨ã³ã³ãã³ãã® active ã¯ã©ã¹ãåé¤ 44 document.querySelectorAll('.search-tab').forEach(tab => { 45 tab.classList.remove('active'); 46 }); 47 document.querySelectorAll('.search-tab-content').forEach(content => { 48 content.classList.remove('active'); 49 }); 50 51 // 鏿ãããã¿ãã¨ã³ã³ãã³ãã« active ã¯ã©ã¹ã追å 52 document.querySelector(`[data-tab="${tabName}"]`).classList.add('active'); 53 document.getElementById(`tab-${tabName}`).classList.add('active'); 54 55 // ä¿åæ¸ã¿ã¿ãã鏿ãããããä¿åæ¸ã¿æ½è¨ãèªã¿è¾¼ã 56 if (tabName === 'saved') { 57 loadSavedFacilities(); 58 } 59 60 // å±¥æ´ã¿ãã鏿ãããããå±¥æ´ãèªã¿è¾¼ã 61 if (tabName === 'history') { 62 loadSearchHistory(); 63 } 64} 65 66// ä½ç½®é¸æã®å¤æ´å¦ç 67function handleLocationChange() { 68 const selectedValue = document.querySelector('input[name="baseLocation"]:checked').value; 69 const mapPositionInfo = document.getElementById('mapPositionInfo'); 70 const addressInput = document.getElementById('addressInput'); 71 72 // ãã¹ã¦é表示ã«ãã 73 mapPositionInfo.style.display = 'none'; 74 addressInput.style.display = 'none'; 75 76 if (selectedValue === 'map') { 77 // å°å³é¸æã¢ã¼ã - ã¢ã¼ãã«ã䏿çã«é ã 78 mapPositionInfo.style.display = 'block'; 79 const modal = document.getElementById('searchModal'); 80 modal.style.display = 'none'; 81 82 // éç¥ã表示 83 if (typeof showNotification === 'function') { 84 showNotification('å°å³ä¸ã§ä½ç½®ãã¯ãªãã¯ãã¦ãã ãã', 5000); 85 } else { 86 alert('å°å³ä¸ã§ä½ç½®ãã¯ãªãã¯ãã¦ãã ãã'); 87 } 88 89 enableMapSelection(); 90 } else if (selectedValue === 'address') { 91 // ä½æå ¥åã¢ã¼ã 92 addressInput.style.display = 'block'; 93 disableMapSelection(); 94 } else { 95 // ä»ã®ã¢ã¼ã 96 disableMapSelection(); 97 } 98} 99 100// 使ãã¸ãªã³ã¼ãã£ã³ã° 101window.geocodeAddress = function() { 102 const addressInput = document.getElementById('searchAddress').value; 103 const addressResult = document.getElementById('addressResult'); 104 105 if (!addressInput) { 106 alert('使ãå ¥åãã¦ãã ãã'); 107 return; 108 } 109 110 // geocoderãåå¾ã¾ãã¯ä½æ 111 let geocoderService = window.geocoder || (typeof geocoder !== 'undefined' ? geocoder : null); 112 113 if (!geocoderService) { 114 geocoderService = new google.maps.Geocoder(); 115 window.geocoder = geocoderService; 116 } 117 118 addressResult.textContent = 'æ¤ç´¢ä¸...'; 119 addressResult.style.display = 'block'; 120 121 geocoderService.geocode({ address: addressInput }, (results, status) => { 122 if (status === 'OK' && results[0]) { 123 const location = results[0].geometry.location; 124 selectedAddressPosition = { 125 lat: location.lat(), 126 lng: location.lng() 127 }; 128 129 addressResult.innerHTML = `â 使ãè¦ã¤ããã¾ãã<br>${results[0].formatted_address}`; 130 addressResult.style.background = '#e8f0fe'; 131 addressResult.style.color = '#1a73e8'; 132 133 console.log('Address geocoded:', selectedAddressPosition); 134 } else { 135 addressResult.innerHTML = 'â 使ãè¦ã¤ããã¾ããã§ãããå¥ã®ä½æã§è©¦ãã¦ãã ããã'; 136 addressResult.style.background = '#fce8e6'; 137 addressResult.style.color = '#d93025'; 138 selectedAddressPosition = null; 139 } 140 }); 141}; 142 143// å°å³é¸æã¢ã¼ããæå¹å 144function enableMapSelection() { 145 console.log('Map selection mode enabled'); 146 147 if (!window.map) { 148 console.error('Map not initialized yet'); 149 return; 150 } 151 152 if (mapClickListener) { 153 // æ¢åã®ãªã¹ãã¼ãããã°åé¤ 154 google.maps.event.removeListener(mapClickListener); 155 } 156 157 // å°å³ã¯ãªãã¯ã¤ãã³ãã追å 158 mapClickListener = map.addListener('click', function(event) { 159 selectedMapPosition = { 160 lat: event.latLng.lat(), 161 lng: event.latLng.lng() 162 }; 163 164 console.log('Selected position:', selectedMapPosition); 165 166 // 鏿ä½ç½®ã表示 167 document.getElementById('mapPositionInfo').innerHTML = 168 `ð 鏿ããä½ç½®: 緯度 ${selectedMapPosition.lat.toFixed(5)}, çµåº¦ ${selectedMapPosition.lng.toFixed(5)}`; 169 170 // ã¢ã¼ãã«ãå表示 171 const modal = document.getElementById('searchModal'); 172 modal.style.display = 'flex'; 173 174 // éç¥ã表示 175 if (typeof showNotification === 'function') { 176 showNotification('ä½ç½®ã鏿ããã¾ãã', 2000); 177 } 178 }); 179} 180 181// å°å³é¸æã¢ã¼ããç¡å¹å 182function disableMapSelection() { 183 console.log('Map selection mode disabled'); 184 185 if (mapClickListener) { 186 google.maps.event.removeListener(mapClickListener); 187 mapClickListener = null; 188 } 189 190 selectedMapPosition = null; 191} 192 193// è¿ãã®æ½è¨ãæ¤ç´¢ 194async function applyNearbySearch() { 195 console.log('=== applyNearbySearch called ==='); 196 197 const baseLocationRadio = document.querySelector('input[name="baseLocation"]:checked'); 198 if (!baseLocationRadio) { 199 console.error('No base location selected'); 200 alert('åºæºä½ç½®ã鏿ãã¦ãã ãã'); 201 return; 202 } 203 204 const baseLocation = baseLocationRadio.value; 205 const distanceRadio = document.querySelector('input[name="distance"]:checked'); 206 const distance = distanceRadio ? distanceRadio.value : 'all'; 207 const searchPeritoneal = document.getElementById('searchPeritoneal').checked;
208 const searchHomeDialysis = document.getElementById('searchHomeDialysis').checked; 209 const searchNightDialysis = document.getElementById('searchNightDialysis').checked; 210 const searchVAIVT = document.getElementById('searchVAIVT').checked; 211 const searchParking = document.getElementById('searchParking').checked; 212 const searchInpatient = document.getElementById('searchInpatient').checked; 213 214 console.log('Search params:', { baseLocation, distance, searchPeritoneal, searchHomeDialysis, searchNightDialysis, searchVAIVT, searchParking, searchInpatient }); 215 216 // åºæºä½ç½®ãåå¾ 217 let basePos = null; 218 219 if (baseLocation === 'my-facility') { 220 // ãã¤æ½è¨ãã 221 if (window.currentUser && window.currentUser.facilityName) { 222 const myFacilityIndex = window.facilities.findIndex(f => f.name === window.currentUser.facilityName); // ååOK:æ½è¨å(人ç©ã§ã¯ãªã) 223 224 if (myFacilityIndex !== -1 && window.facilityMarkers && window.facilityMarkers[myFacilityIndex]) { 225 // ãã¼ã«ã¼ãã座æ¨ãåå¾ 226 const marker = window.facilityMarkers[myFacilityIndex]; 227 const position = marker.getPosition(); 228 basePos = { lat: position.lat(), lng: position.lng() }; 229 } else { 230 alert('ãã¤æ½è¨ã®ä½ç½®ãè¦ã¤ããã¾ããã'); 231 return; 232 } 233 } else { 234 alert('ãã¤æ½è¨ã使ç¨ããã«ã¯ãã°ã¤ã³ãå¿ è¦ã§ãã'); 235 return; 236 } 237 } else if (baseLocation === 'gps') { 238 // GPSä½ç½®ãã 239 if (window.userLocation && window.userLocation.lat) { 240 basePos = { lat: window.userLocation.lat, lng: window.userLocation.lng }; 241 } else { 242 /* â 以åã¯ãåå¾ã§ãã¾ãããã¨åºãã¦çµããã ã£ã(2026-08-24 ãªã¼ãã¼ææ)ã 243 ä½ç½®ãã¾ã èãã¦ããªãã ãã®ãã¨ãå¤ãã®ã§ãããã§**ãã®å ´ã§èãç´ã**ã 244 æãããã»åããªãã£ãå ´åã¯ãåå ãã¨ã«ä½ãããã°ããããåºãã */ 245 requestGpsThenSearch(); 246 return; 247 } 248 } else if (baseLocation === 'map') { 249 // å°å³ä¸ã®é¸æä½ç½®ãã 250 if (selectedMapPosition) { 251 basePos = selectedMapPosition; 252 } else { 253 alert('å°å³ä¸ã§ä½ç½®ã鏿ãã¦ãã ããã'); 254 return; 255 } 256 } else if (baseLocation === 'address') { 257 // 使ãã 258 if (selectedAddressPosition) { 259 basePos = selectedAddressPosition; 260 } else { 261 alert('ä½æãæ¤ç´¢ãã¦ãã ããã'); 262 return; 263 } 264 } 265 266 console.log('Base position:', basePos); 267 268 // æ½è¨ãªã¹ããè·é¢è¨ç®ãã¦ã½ã¼ã 269 const facilitiesWithDistance = window.facilities.map((facility, index) => { 270 // ãã¼ã«ã¼ãã座æ¨ãåå¾ 271 let facilityLat, facilityLng; 272 273 if (window.facilityMarkers && window.facilityMarkers[index]) { 274 const marker = window.facilityMarkers[index]; 275 const position = marker.getPosition(); 276 facilityLat = position.lat(); 277 facilityLng = position.lng(); 278 } else { 279 console.warn(`No marker found for facility ${index}: ${facility.name}`); 280 return { ...facility, distance: NaN, originalIndex: index }; 281 } 282 283 const dist = calculateDistance( 284 basePos.lat, basePos.lng, 285 facilityLat, facilityLng 286 ); 287 288 // ãããã°ï¼æåã®3ä»¶ã®è·é¢è¨ç®ã表示 289 if (index < 3) { 290 console.log(`Facility ${index}: ${facility.name}`, { 291 facilityLat: facilityLat, 292 facilityLng: facilityLng, 293 baseLat: basePos.lat, 294 baseLng: basePos.lng, 295 distance: dist 296 }); 297 } 298 299 return { ...facility, distance: dist, originalIndex: index, lat: facilityLat, lng: facilityLng }; 300 }); 301 302 console.log(`Total facilities with distance: ${facilitiesWithDistance.length}`); 303 console.log(`First 3 distances:`, facilitiesWithDistance.slice(0, 3).map(f => ({ name: f.name, distance: f.distance }))); 304 305 // æ¡ä»¶ã§ãã£ã«ã¿ãªã³ã° 306 let filteredFacilities = facilitiesWithDistance; 307 308 // è·é¢ãã£ã«ã¿ã¼ 309 if (distance !== 'all') { 310 const maxDist = parseInt(distance); 311 console.log(`Filtering by distance <= ${maxDist} km`); 312 filteredFacilities = filteredFacilities.filter(f => { 313 const isValid = !isNaN(f.distance) && f.distance <= maxDist; 314 if (!isValid && f.distance !== undefined) { 315 console.log(`Filtered out: ${f.name}, distance: ${f.distance}`); 316 } 317 return isValid; 318 }); 319 console.log(`After distance filter: ${filteredFacilities.length} facilities`); 320 } 321 322 // è ¹èéæãã£ã«ã¿ã¼ 323 if (searchPeritoneal) { 324 filteredFacilities = filteredFacilities.filter(f => f.peritoneal === 'ãã'); 325 } 326 327 // å¨å® éæãã£ã«ã¿ã¼ 328 if (searchHomeDialysis) { 329 filteredFacilities = filteredFacilities.filter(f =>
329 f.homeDialysis === 'ãã'); 330 } 331 332 // å¤ééæãã£ã«ã¿ã¼ 333 if (searchNightDialysis) { 334 filteredFacilities = filteredFacilities.filter(f => f.nightDialysis === 'ãã'); 335 } 336 337 // VAIVTãã£ã«ã¿ã¼ 338 if (searchVAIVT) { 339 filteredFacilities = filteredFacilities.filter(f => f.vaivt && f.vaivt !== 'ãªã' && f.vaivt !== 'ããã'); 340 } 341 342 // é§è»å ´ãã£ã«ã¿ã¼ 343 if (searchParking) { 344 filteredFacilities = filteredFacilities.filter(f => f.parking === 'ãã'); 345 } 346 347 // å ¥é¢ããããã£ã«ã¿ã¼ 348 if (searchInpatient) { 349 filteredFacilities = filteredFacilities.filter(f => f.inpatient === 'ãã'); 350 } 351 352 // è·é¢ã§ã½ã¼ã 353 filteredFacilities.sort((a, b) => a.distance - b.distance); 354 355 console.log(`Found ${filteredFacilities.length} facilities`); 356 357 // æ¤ç´¢å±¥æ´ã«è¿½å 358 addToSearchHistory({ baseLocation, distance, facilityCount: filteredFacilities.length }); 359 360 // çµæãæ½è¨ä¸è¦§ã«è¡¨ç¤º 361 displaySearchResults(filteredFacilities); 362 363 // æ¤ç´¢è§£é¤ãã¿ã³ã表示ï¼ãµã¤ããã¼ã®ãã¿ã³ï¼ 364 const clearBtn = document.getElementById('searchClearBtn'); 365 if (clearBtn) { 366 clearBtn.style.display = 'flex'; 367 } 368 369 // ã¢ã¼ãã«å ã®æ¤ç´¢è§£é¤ãã¿ã³ã表示ï¼ã¢ã¼ãã«éããåã«ï¼ 370 const modalClearBtn = document.getElementById('searchModalClearBtn'); 371 if (modalClearBtn) { 372 modalClearBtn.style.display = 'block'; 373 } 374 375 // ã¢ã¼ãã«ãéããï¼æ¤ç´¢è§£é¤ãã¿ã³ã¯æ¬¡åéããæã«è¡¨ç¤ºãããï¼ 376 hideSearchModal(); 377 378 // ããããåºæºä½ç½®ã«ç§»åï¼ã¢ãã¡ã¼ã·ã§ã³ã¨ã¨ãã§ã¯ãä»ãï¼ 379 if (basePos && map) { 380 const targetPosition = new google.maps.LatLng(basePos.lat, basePos.lng); 381 382 // ã¹ã ã¼ãºã«ãºã¼ã ã¨ãã³ 383 map.panTo(targetPosition); 384 385 // ãºã¼ã ã¢ãã¡ã¼ã·ã§ã³ 386 const currentZoom = map.getZoom(); 387 const targetZoom = 13; 388 389 if (Math.abs(currentZoom - targetZoom) > 0.5) { 390 let step = 0; 391 const steps = 10; 392 const zoomDiff = targetZoom - currentZoom; 393 const zoomStep = zoomDiff / steps; 394 395 const zoomInterval = setInterval(() => { 396 step++; 397 map.setZoom(currentZoom + (zoomStep * step)); 398 399 if (step >= steps) { 400 clearInterval(zoomInterval); 401 map.setZoom(targetZoom); 402 403 // ã¨ãã§ã¯ã追å ï¼ãã¦ã³ããã¼ã«ã¼ï¼ 404 const bounceMarker = new google.maps.Marker({ 405 position: targetPosition, 406 map: map, 407 animation: google.maps.Animation.BOUNCE, 408 icon: { 409 path: google.maps.SymbolPath.CIRCLE, 410 scale: 15, 411 fillColor: '#4285f4', 412 fillOpacity: 0.8, 413 strokeColor: '#ffffff', 414 strokeWeight: 3 415 }, 416 zIndex: 10000 417 }); 418 419 // æ¾å°ç¶ã¨ãã§ã¯ã 420 if (typeof createPulseEffect === 'function') { 421 createPulseEffect(bounceMarker, targetPosition); 422 } 423 424 // 3ç§å¾ã«ãã¦ã³ããã¼ã«ã¼ãåé¤ 425 setTimeout(() => { 426 bounceMarker.setMap(null); 427 }, 3000); 428 } 429 }, 50); 430 } else { 431 // ãºã¼ã ä¸è¦ã®å ´åãã¨ãã§ã¯ã表示 432 setTimeout(() => { 433 const bounceMarker = new google.maps.Marker({ 434 position: targetPosition, 435 map: map, 436 animation: google.maps.Animation.BOUNCE, 437 icon: { 438 path: google.maps.SymbolPath.CIRCLE, 439 scale: 15, 440 fillColor: '#4285f4', 441 fillOpacity: 0.8, 442 strokeColor: '#ffffff', 443 strokeWeight: 3 444 }, 445 zIndex: 10000 446 }); 447 448 if (typeof createPulseEffect === 'function') { 449 createPulseEffect(bounceMarker, targetPosition); 450 } 451 452 setTimeout(() => { 453 bounceMarker.setMap(null); 454 }, 3000); 455 }, 500); 456 } 457 } 458} 459 460// 2ç¹éã®è·é¢ãè¨ç®ï¼kmï¼ 461function calculateDistance(lat1, lon1, lat2, lon2) { 462 // æ°å¤åã«å¤æ 463 const lat1Num = Number(lat1); 464 const lon1Num = Number(lon1); 465 const lat2Num = Number(lat2); 466 const lon2Num = Number(lon2); 467 468 // NaNãã§ã㯠469 if (isNaN(lat1Num) || isNaN(lon1Num) || isNaN(lat2Num) || isNaN(lon2Num)) { 470 console.error('Invalid coordinates:', { lat1, lon1, lat2, lon2 }); 471 return NaN; 472 } 473 474 const R = 6371; // å°çã®åå¾ï¼kmï¼ 475 const dLat = (lat2Num - lat1Num) * Math.PI / 180; 476 const dLon = (lon2Num - lon1Num) * Math.PI / 180; 477 const a = 478 Math.sin(dLat / 2) * Math.sin(dLat / 2) + 479 Math.cos(lat1Num * Math.PI / 180) * Math.cos(lat2Num * Math.PI / 180) * 480 Math.sin(dLon / 2) * Math.sin(dLon / 2); 481 const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 482 const distance = R * c; 483 return distance; 484} 485 486// æ¤ç´¢çµæã表示 487function displaySearchResults(facilities) { 488 // ãæ°ã«å ¥ããã£ã«ã¿ã¼ãè§£é¤ 489 const favoriteFilterBtn = document.getElementById('favoriteFilterBtn'); 490 if (favoriteFilterBtn && favoriteFilterBtn.classList.contains('active')) { 491 favoriteFilterBtn.classList.remove('active'); 492 if (favoriteFilterBtn.querySelector('.btn-icon')) { 493 favoriteFilterBtn.querySelector('.btn-icon').textContent = 'â'; 494 } 495 } 496 497 const listContainer = document.getElementById("facilityListItems"); 498 listContainer.innerHTML = ""; 499 500 if (facilities.length === 0) { 501 listContainer.innerHTML = ` 502 <div style="padding: 40px 20px; text-align: center; color: #666;"> 503 æ¡ä»¶ã«ä¸è´ããæ½è¨ãè¦ã¤ããã¾ããã§ãã 504 </div> 505 `; 506 return; 507 } 508
509 facilities.forEach((facility) => { 510 const colorData = getPatientColor(facility.patients); 511 const facilityItem = document.createElement("div"); 512 facilityItem.className = "facility-item"; 513 facilityItem.dataset.index = facility.originalIndex; 514 facilityItem.style.backgroundColor = colorData.lightColor; 515 facilityItem.style.borderLeftColor = colorData.color; 516 517 // è·é¢æ å ±ã追å 518 const distanceText = `<div style="color: #1a73e8; font-weight: bold; margin-bottom: 4px; display: flex; align-items: center; gap: 6px;"> 519 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="16" height="16"> 520 <path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/> 521 </svg> 522 ${facility.distance.toFixed(1)} km 523 </div>`; 524 525 facilityItem.innerHTML = ` 526 ${distanceText} 527 <div style="display: flex; justify-content: space-between; align-items: center;"> 528 <div class="facility-name">${facility.name}</div> 529 <button class="facility-star-btn" data-facility-index="${facility.originalIndex}" title="${isFacilitySaved(facility.originalIndex) ? 'ä¿åæ¸ã¿' : 'ãæ°ã«å ¥ãã«è¿½å '}"> 530 ${isFacilitySaved(facility.originalIndex) 531 ? '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#fbbf24" width="20" height="20"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg>' 532 : '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#9ca3af" stroke-width="2" width="20" height="20"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg>' 533 } 534 </button> 535 </div> 536 <div class="facility-patients" style="color: ${colorData.color};"> 537 æ£è æ°: ${facility.patients}人 | ãããæ°: ${facility.beds}åº 538 <button class="detail-btn" data-facility-index="${facility.originalIndex}">詳細</button> 539 </div> 540 <div class="facility-details" style="margin-top: 8px;"> 541 ${facility.postalCode ? ` 542 <div class="facility-detail-row"> 543 <span class="facility-detail-label">ã:</span> 544 <span class="facility-detail-value">${facility.postalCode}</span> 545 </div> 546 ` : ''} 547 <div class="facility-detail-row"> 548 <span class="facility-detail-label">使:</span> 549 <span class="facility-detail-value">${facility.address}</span> 550 </div> 551 <div class="facility-detail-row"> 552 <span class="facility-detail-label">é»è©±:</span> 553 <span class="facility-detail-value">${facility.phone}</span> 554 </div> 555 <div class="facility-detail-row"> 556 <span class="facility-detail-label">FAX:</span> 557 <span class="facility-detail-value">${facility.fax && facility.fax !== "undefined" ? facility.fax : "æ å ±ãªã"}</span> 558 </div> 559 ${facility.website && facility.website !== null ? ` 560 <div class="facility-detail-row"> 561 <span class="facility-detail-label">HP:</span> 562 <span class="facility-detail-value"> 563 <a href="${typeof normalizeUrl === 'function' ? normalizeUrl(facility.website) : facility.website}" target="_blank" rel="noopener noreferrer"> 564 ${facility.website} 565 </a> 566 </span> 567 </div> 568 ` : ` 569 <div class="facility-detail-row"> 570 <span class="facility-detail-label">HP:</span> 571 <span class="facility-detail-value">æªè¨å®</span> 572 </div> 573 `} 574 </div> 575 <div class="facility-extended-details" id="extended_${facility.originalIndex}" style="display: none;"> 576 <div class="detail-row"><span>éè¿å¯¾å¿:</span><span>${getExtendedData(facility.originalIndex, "transport", "æªè¨å®")}</span></div> 577 <div class="detail-row"><span>é§è»å ´:</span><span>${getExtendedData(facility.originalIndex, "parking", "æªè¨å®")}</span></div> 578 <div class="detail-row"><span>å ¥é¢ããã:</span><span>${getExtendedData(facility.originalIndex, "inpatient", "æªè¨å®")}</span></div> 579 <div class="detail-row"><span>æ´»åå¶é:</span><span>${getExtendedData(facility.originalIndex, "activity", "æªè¨å®")}</span></div> 580 <div class="detail-row"><span>çæ´»ä¿è·åãå ¥ã:</span><span>${getExtendedData(facility.originalIndex, "welfare", "æªè¨å®")}</span></div> 581 <div class="detail-row"><span>ç²¾ç¥ç¾æ£åãå ¥ã:</span><span>${getExtendedData(facility.originalIndex, "mental", "æªè¨å®")}</span></div> 582 <div class="detail-row"><span>è ¹èéæåãå ¥ã:</span><span>${getExtendedData(facility.originalIndex, "peritoneal", "æªè¨å®")}</span></div> 583 <div class="detail-row"><span>å¨å® éæ:</span><span>${getExtendedData(facility.originalIndex, "homeDialysis", "æªè¨å®")}</span></div> 584 <div class="detail-row"><span>å¤ééæ:</span><span>${getExtendedData(facility.originalIndex, "nightDialysis", "æªè¨å®")}</span></div> 585 <div class="detail-row"><span>VAIVT(PTA)å¯¾å¿æ½è¨:</span><span>${getExtendedData(facility.originalIndex, "vaivt", "æªè¨å®")}</span></div> 586 ${window.getVaivtReferralDisplay ? window.getVaivtReferralDisplay(facility.originalIndex) : ''} 587 <div class="detail-row"><span>æ è¡éæã®åãå ¥ã:</span><span>${getExtendedData(facility.originalIndex, "travelDialysis", "æªè¨å®")}</span></div> 588 <div style="margin-top: 10px;"> 589 <strong>æ¡å æ å ±:</strong><br> 590 ${getExtendedData(facility.originalIndex, "info", "æªè¨å®")} 591 </div>
592 ${window.generateOccupancyCharts ? window.generateOccupancyCharts(facility) : ''} 593 </div> 594 `; 595 596 // æãã¿ã³ã®ã¤ãã³ããªã¹ãã¼ã追å 597 const starBtn = facilityItem.querySelector('.facility-star-btn'); 598 if (starBtn) { 599 const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0; 600 601 const handleStarClick = (e) => { 602 e.preventDefault(); 603 e.stopPropagation(); 604 const facilityIndex = parseInt(starBtn.getAttribute('data-facility-index')); 605 console.log('Star button activated:', facilityIndex); 606 toggleSaveFacility(facilityIndex); 607 }; 608 609 if (isTouchDevice) { 610 starBtn.addEventListener('touchend', handleStarClick, { passive: false }); 611 } 612 613 // ãã¹ã¦ã®ããã¤ã¹ã§clickã¤ãã³ãã追å ï¼ãã©ã¼ã«ããã¯ï¼ 614 starBtn.addEventListener('click', handleStarClick); 615 } 616 617 // 詳細ãã¿ã³ã®ã¤ãã³ããªã¹ãã¼ã追å (Windows対å¿) 618 const detailBtn = facilityItem.querySelector('.detail-btn'); 619 if (detailBtn) { 620 const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0; 621 622 const handleDetailClick = (e) => { 623 e.preventDefault(); 624 e.stopPropagation(); 625 const facilityIndex = parseInt(detailBtn.getAttribute('data-facility-index')); 626 console.log('Detail button activated for facility:', facilityIndex); 627 628 // å°ãé å»¶ããã¦ç¢ºå®ã«å®è¡ 629 setTimeout(() => { 630 if (typeof window.toggleFacilityDetails === 'function') { 631 window.toggleFacilityDetails(facilityIndex); 632 } 633 }, 0); 634 }; 635 636 if (isTouchDevice) { 637 detailBtn.addEventListener('touchend', handleDetailClick, { passive: false }); 638 } 639 640 // ãã¹ã¦ã®ç°å¢ã§clickããªãã¹ã³ï¼ãã©ã¼ã«ããã¯ï¼ 641 detailBtn.addEventListener('click', handleDetailClick); 642 } 643 644 // ç´¹ä»ãã¿ã³ã®ã¤ãã³ããªã¹ãã¼ã追å 645 const referralBtn = facilityItem.querySelector('.referral-btn'); 646 if (referralBtn) { 647 const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0; 648 649 const handleReferralClick = (e) => { 650 e.preventDefault(); 651 e.stopPropagation(); 652 const facilityIndex = parseInt(referralBtn.getAttribute('data-facility-index')); 653 const facilityName = referralBtn.getAttribute('data-facility-name'); 654 const vaivt = referralBtn.getAttribute('data-vaivt'); 655 console.log('Referral button clicked for facility:', facilityName); 656 657 // VAIVTå¯¾å¿æ½è¨ãã©ããã§é¸æè¢ã表示 658 if (typeof window.showReferralOptions === 'function') { 659 window.showReferralOptions(facilityIndex, facilityName, vaivt); 660 } 661 }; 662 663 if (isTouchDevice) { 664 referralBtn.addEventListener('touchend', handleReferralClick, { passive: false }); 665 } 666 referralBtn.addEventListener('click', handleReferralClick); 667 } 668 669 facilityItem.addEventListener("click", (e) => { 670 if (!e.target.closest('.facility-star-btn') && !e.target.closest('.detail-btn') && !e.target.closest('.referral-btn')) { 671 selectFacilityFromList(facility.originalIndex); 672 } 673 }); 674 675 listContainer.appendChild(facilityItem); 676 }); 677 678 // æ¤ç´¢çµæã®ã¤ã³ããã¯ã¹ãåå¾ãã¦ä¿å 679 const searchResultIndices = facilities.map(f => f.originalIndex); 680 currentSearchResultIndices = searchResultIndices; 681 682 // ãããä¸ã®ãã¼ã«ã¼ã¨ã©ãã«ãæ¤ç´¢çµæã«çµãè¾¼ã 683 if (window.facilityMarkers) { 684 window.facilityMarkers.forEach((marker, index) => { 685 if (marker) { 686 marker.setVisible(searchResultIndices.includes(index)); 687 } 688 }); 689 } 690 691 if (window.facilityLabels) {
692 window.facilityLabels.forEach((label, index) => { 693 if (label && typeof label.setMap === 'function') { 694 if (searchResultIndices.includes(index)) { 695 if (window.map) { 696 label.setMap(window.map); 697 } 698 } else { 699 label.setMap(null); 700 } 701 } 702 }); 703 } 704 705 // ç·æ¥ãã¼ã«ã¼ã®è¡¨ç¤ºãæ´æ° 706 if (typeof window.updateEmergencyMarkersVisibility === 'function') { 707 window.updateEmergencyMarkersVisibility(); 708 } 709 710 // ãã°ã¤ã³ä¸ã®ã¦ã¼ã¶ã¼æ½è¨ã®ãã¤ã©ã¤ããé©ç¨ 711 if (window.currentUser && window.facilities) { 712 const userFacilityIndex = window.facilities.findIndex(f => 713 window.currentUser.facilityName && f.name === window.currentUser.facilityName // ååOK:æ½è¨å(人ç©ã§ã¯ãªã) 714 ); 715 if (userFacilityIndex !== -1) { 716 setTimeout(() => { 717 const facilityItem = document.querySelector(`[data-index="${userFacilityIndex}"]`); 718 if (facilityItem) { 719 facilityItem.classList.add('user-facility'); 720 } 721 }, 100); 722 } 723 } 724} 725 726// æ¤ç´¢æ¡ä»¶ããªã»ãã 727function resetSearch() { 728 // åºæºä½ç½®ãããã©ã«ãã« 729 const myFacilityRadio = document.querySelector('input[name="baseLocation"][value="my-facility"]'); 730 if (myFacilityRadio) { 731 myFacilityRadio.checked = true; 732 } 733 734 // è·é¢ãallã« 735 const allDistanceRadio = document.querySelector('input[name="distance"][value="all"]'); 736 if (allDistanceRadio) { 737 allDistanceRadio.checked = true; 738 } 739 740 // ãã§ãã¯ããã¯ã¹ããã¹ã¦ãªã 741 document.getElementById('searchPeritoneal').checked = false; 742 document.getElementById('searchHomeDialysis').checked = false; 743 document.getElementById('searchVAIVT').checked = false; 744 document.getElementById('searchParking').checked = false; 745 document.getElementById('searchInpatient').checked = false; 746 747 // å°å³é¸æã¢ã¼ããç¡å¹å 748 handleLocationChange(); 749 750 console.log('Search conditions reset'); 751} 752 753// æ½è¨ãä¿å/è§£é¤ï¼æ½è¨åãã¼ã¹ãæ½è¨IDã«ç´ã¥ãã¦ä¿åï¼ 754async function toggleSaveFacility(facilityIndex) { 755 // æ½è¨åãåå¾ 756 const facility = window.facilities[facilityIndex]; 757 if (!facility) { 758 console.error('Facility not found at index:', facilityIndex); 759 return; 760 } 761 const facilityName = facility.name; 762 763 // å®å ¨ãã§ãã¯ï¼æ½è¨åãæååã§ãªãå ´åã¯ã¨ã©ã¼ 764 if (typeof facilityName !== 'string' || !facilityName) { 765 console.error('â æ½è¨åãç¡å¹ã§ãï¼æååã®ã¿è¨±å¯ï¼:', facilityName); 766 return; 767 } 768 769 const savedFacilities = getSavedFacilities(); 770 const index = savedFacilities.indexOf(facilityName); 771 772 if (index > -1) { 773 // æ¢ã«ä¿åæ¸ã¿ãªãåé¤ 774 savedFacilities.splice(index, 1); 775 console.log('Facility removed from saved:', facilityName); 776 } else { 777 // æªä¿åãªã追å 778 savedFacilities.push(facilityName); 779 console.log('Facility added to saved:', facilityName); 780 } 781 782 // ãã°ã¤ã³ç¶æ ã«å¿ãã¦ä¿åå ã夿´ 783 console.log('Saving favorites - checking conditions:', { 784 hasCurrentUser: !!window.currentUser, 785 facilityId: window.currentUser?.facilityId, 786 hasFirebaseDB: !!window.firebaseDB, 787 hasFirebaseDBFunctions: !!window.firebaseDBFunctions 788 }); 789 790 if (window.currentUser && window.currentUser.facilityId && window.firebaseDB && window.firebaseDBFunctions) { 791 // ãã°ã¤ã³ä¸ï¼æ½è¨ããã¥ã¡ã³ãã«ä¿å 792 const currentFacilityId = window.currentUser.facilityId; 793 console.log('Attempting to save to Firestore for facility:', currentFacilityId); 794 const cacheKey = 'savedFacilities_' + currentFacilityId; 795 try { 796 const { doc, setDoc } = window.firebaseDBFunctions; 797 const facilityDoc = doc(window.firebaseDB, 'facilities', currentFacilityId); 798 await setDoc(facilityDoc, { 799 savedFacilities: savedFacilities 800 }, { merge: true }); 801 console.log('Favorites saved to Firestore successfully:', savedFacilities); 802 // ãã¼ã«ã«ãã£ãã·ã¥ãæ´æ° 803 localStorage.setItem(cacheKey, JSON.stringify(savedFacilities)); 804 // currentUserã«ãåæ 805 window.currentUser.savedFacilities = savedFacilities; 806 } catch (error) { 807 console.error('Error saving favorites to Firestore:', error); 808 // Firestoreã¸ã®ä¿åã«å¤±æããå ´åãlocalStorageã«ãã©ã¼ã«ãã㯠809 localStorage.setItem(cacheKey, JSON.stringify(savedFacilities)); 810 window.currentUser.savedFacilities = savedFacilities; 811 console.log('Fell back to localStorage due to error'); 812 } 813 } else { 814 // ãã°ã¢ã¦ãä¸ï¼localStorageã«ä¿åï¼æ°¸ç¶çã«ä¿åï¼ 815 localStorage.setItem('savedFacilities_guest', JSON.stringify(savedFacilities)); 816 console.log('Favorites saved to localStorage (persistent)'); 817 } 818 819 // ãã£ãã·ã¥ãç¡å¹å 820 invalidateSavedFacilitiesCache(); 821 822 // ãã¿ã³ã®è¡¨ç¤ºãæ´æ°ï¼éåæå¦çå®äºå¾ï¼ 823 setTimeout(() => { 824 // ãæ°ã«å ¥ããã£ã«ã¿ã¼ãã¢ã¯ãã£ããªå ´åã¯ããªã¹ããæ´æ° 825 const favoriteFilterBtn = document.getElementById('favoriteFilterBtn'); 826 const isFavoriteActive = favoriteFilterBtn && favoriteFilterBtn.classList.contains('active'); 827 828 if (isFavoriteActive) { 829 // ãæ°ã«å ¥ããã£ã«ã¿ã¼æå¹æã¯ãæ½è¨ãªã¹ããæ´æ°ï¼è¿½å /åé¤ãåæ ï¼ 830 filterFavoriteFacilities(); 831 } else { 832 // é常æã¯æã¢ã¤ã³ã³ã®ã¿æ´æ°ï¼ãªã¹ãå ¨ä½ãåçæããªãï¼ 833 updateStarButtons(); 834 } 835 // ä»ãå¤ãã®å¾ã¯ä¸çªä¸ããè¦ãã(2026-08-16 ãªã¼ãã¼æç¤º) 836 if (typeof window.scrollFacilityListTop === 'function') window.scrollFacilityListTop(); 837 }, 100); 838} 839 840// ä¿åæ¸ã¿æ½è¨ã®æ½è¨åé åãåå¾ï¼æ½è¨IDã«ç´ã¥ãã¦åå¾ï¼ 841// ãã£ãã·ã¥æ©æ§ä»ãï¼çæéã®éè¤å¼ã³åºãã鲿¢ 842function getSavedFacilities() {
843 // ãã£ãã·ã¥ãæå¹ãªå ´åã¯ãã£ãã·ã¥ããè¿ã 844 const now = Date.now(); 845 if (savedFacilitiesCache !== null && (now - savedFacilitiesCacheTime) < SAVED_FACILITIES_CACHE_TTL) { 846 return savedFacilitiesCache; 847 } 848 849 let result = []; 850 851 if (window.currentUser && window.currentUser.facilityId) { 852 // ãã°ã¤ã³ä¸ã®å ´åï¼æ½è¨IDããã¼ã«åå¾ 853 const cacheKey = 'savedFacilities_' + window.currentUser.facilityId; 854 const cached = localStorage.getItem(cacheKey); 855 856 if (cached) { 857 try { 858 const parsed = JSON.parse(cached); 859 if (Array.isArray(parsed) && parsed.length > 0) { 860 window.currentUser.savedFacilities = parsed; 861 result = parsed; 862 } 863 } catch (e) { 864 console.warn('â ï¸ Failed to parse cached favorites:', e); 865 } 866 } 867 868 if (result.length === 0 && Array.isArray(window.currentUser.savedFacilities) && window.currentUser.savedFacilities.length > 0) { 869 result = window.currentUser.savedFacilities; 870 } 871 } else if (window.authStateResolved) { 872 // ãã°ã¢ã¦ãæ¸ã¿ç¢ºå®ï¼ãæ°ã«å ¥ãã表示ããªã 873 result = []; 874 } else { 875 // èªè¨¼ç¶æ æªç¢ºå®ï¼ãã¼ã¸èªã¿è¾¼ã¿ä¸ï¼ï¼localStorageããsavedFacilities_*ãæ¤ç´¢ 876 for (let i = 0; i < localStorage.length; i++) { 877 const key = localStorage.key(i); 878 if (key && key.startsWith('savedFacilities_') && key !== 'savedFacilities_guest') { 879 try { 880 const data = JSON.parse(localStorage.getItem(key)); 881 if (Array.isArray(data) && data.length > 0) { 882 result = data; 883 console.log('ð getSavedFacilities: localStorageããçºè¦:', key); 884 break; 885 } 886 } catch (e) { /* ignore */ } 887 } 888 } 889 890 // è¦ã¤ãããªãå ´åã¯ã²ã¹ãç¨ãç¢ºèª 891 if (result.length === 0) { 892 const saved = localStorage.getItem('savedFacilities_guest'); 893 result = saved ? JSON.parse(saved) : []; 894 } 895 } 896 897 // æ°åãã¼ã¿ãé¤å¤ï¼æååã®æ½è¨åã®ã¿ãä¿æï¼ 898 const originalLength = result.length; 899 result = result.filter(item => typeof item === 'string'); 900 901 // æ°åãã¼ã¿ãå«ã¾ãã¦ããå ´åãlocalStorageã¨Firebaseãã¯ãªã¼ã³ã¢ãã 902 if (result.length !== originalLength) { 903 console.log('ð§¹ å¤ãæ°åãã¼ã¿ãåé¤:', originalLength - result.length, 'ä»¶'); 904 905 // localStorageã®å ¨savedFacilities_*ãã¼ãã¯ãªã¼ã³ã¢ãã 906 for (let i = 0; i < localStorage.length; i++) { 907 const key = localStorage.key(i); 908 if (key && key.startsWith('savedFacilities_')) { 909 try { 910 const data = JSON.parse(localStorage.getItem(key)); 911 if (Array.isArray(data)) { 912 const cleaned = data.filter(item => typeof item === 'string'); 913 localStorage.setItem(key, JSON.stringify(cleaned)); 914 } 915 } catch (e) { /* ignore */ } 916 } 917 } 918 919 // Firestoreãã¯ãªã¼ã³ã¢ããï¼ãã°ã¤ã³ä¸ã®ã¿ï¼ 920 if (window.currentUser && window.currentUser.facilityId && window.firebaseDB && window.firebaseDBFunctions) { 921 const { doc, setDoc } = window.firebaseDBFunctions; 922 const facilityDoc = doc(window.firebaseDB, 'facilities', window.currentUser.facilityId); 923 setDoc(facilityDoc, { savedFacilities: result }, { merge: true }) 924 .then(() => console.log('ð§¹ Firestoreã®å¤ãæ°åãã¼ã¿ãåé¤ãã¾ãã')) 925 .catch(e => console.warn('Firestoreã¯ãªã¼ã³ã¢ããã¨ã©ã¼:', e)); 926 } 927 } 928 929 // ãã£ãã·ã¥ãæ´æ° 930 savedFacilitiesCache = result; 931 savedFacilitiesCacheTime = now; 932 933 return result; 934} 935 936// ãã£ãã·ã¥ãç¡å¹åï¼ãæ°ã«å ¥ãã®è¿½å /å餿ã«å¼ã¶ï¼
937function invalidateSavedFacilitiesCache() { 938 savedFacilitiesCache = null; 939 savedFacilitiesCacheTime = 0; 940} 941window.invalidateSavedFacilitiesCache = invalidateSavedFacilitiesCache; 942window.updateStarButtons = updateStarButtons; 943 944// Firestoreãããæ°ã«å ¥ããèªã¿è¾¼ãï¼ãã°ã¤ã³æã«å¼ã°ããï¼ 945// æ½è¨ããã¥ã¡ã³ã(facilities/{facilityId})ãããæ°ã«å ¥ããåå¾ 946async function loadUserFavorites() { 947 if (!window.currentUser || !window.currentUser.facilityId || !window.firebaseDB || !window.firebaseDBFunctions) { 948 console.log('â ï¸ loadUserFavorites: å¿ è¦ãªæ¡ä»¶ãæã£ã¦ãã¾ãã', { 949 hasCurrentUser: !!window.currentUser, 950 facilityId: window.currentUser?.facilityId, 951 hasFirebaseDB: !!window.firebaseDB 952 }); 953 return; 954 } 955 956 const currentFacilityId = window.currentUser.facilityId; 957 const cacheKey = 'savedFacilities_' + currentFacilityId; 958 console.log('ð¥ loadUserFavorites: æ½è¨ID =', currentFacilityId); 959 960 // ã¾ãlocalStorageã®ãã£ãã·ã¥ãåå¾ 961 let cachedFavorites = []; 962 const cached = localStorage.getItem(cacheKey); 963 if (cached) { 964 try { 965 const parsed = JSON.parse(cached); 966 if (Array.isArray(parsed)) { 967 cachedFavorites = parsed; 968 } 969 } catch (e) { 970 console.warn('â ï¸ ãã£ãã·ã¥ã®ãã¼ã¹ã«å¤±æ:', e); 971 } 972 } 973 974 try { 975 const { doc, getDoc, setDoc } = window.firebaseDBFunctions; 976 const facilityDoc = doc(window.firebaseDB, 'facilities', currentFacilityId); 977 const docSnap = await getDoc(facilityDoc); 978 979 if (docSnap.exists() && docSnap.data().savedFacilities && docSnap.data().savedFacilities.length > 0) { 980 // Firestoreã«ãã¼ã¿ãããå ´åã¯ãããä½¿ç¨ 981 window.currentUser.savedFacilities = docSnap.data().savedFacilities; 982 console.log('â Firestoreãããæ°ã«å ¥ããèªã¿è¾¼ã¿ã¾ãã:', window.currentUser.savedFacilities); 983 984 // localStorageã«ãã£ãã·ã¥ãæ´æ° 985 try { 986 localStorage.setItem(cacheKey, JSON.stringify(window.currentUser.savedFacilities)); 987 console.log('ð¾ ãæ°ã«å ¥ãããã£ãã·ã¥ãã¾ãã'); 988 } catch (e) { 989 console.warn('â ï¸ Failed to cache favorites:', e); 990 } 991 } else if (cachedFavorites.length > 0) { 992 // Firestoreã«ã¯ãªãããlocalStorageã«ãã£ãã·ã¥ãããå ´å 993 // ãã£ãã·ã¥ãä¿æããFirestoreã«åæ 994 window.currentUser.savedFacilities = cachedFavorites; 995 console.log('ð¦ ãã£ãã·ã¥ãããæ°ã«å ¥ãã復å :', cachedFavorites); 996 console.log('ð Firestoreã«ãæ°ã«å ¥ããåæä¸...'); 997 998 try { 999 await setDoc(facilityDoc, { 1000 savedFacilities: cachedFavorites 1001 }, { merge: true }); 1002 console.log('â Firestoreã«ãæ°ã«å ¥ããåæãã¾ãã'); 1003 } catch (syncError) { 1004 console.warn('â ï¸ Firestoreã¸ã®åæã«å¤±æï¼ãã£ãã·ã¥ã¯ä¿æï¼:', syncError); 1005 } 1006 } else { 1007 // ã©ã¡ãã«ããã¼ã¿ããªãå ´åã®ã¿ç©ºé å 1008 window.currentUser.savedFacilities = []; 1009 console.log('â¹ï¸ ãæ°ã«å ¥ããã¼ã¿ã¯ããã¾ãã'); 1010 } 1011 1012 // ã¡ã¢ãªãã£ãã·ã¥ãç¡å¹åï¼å¤ããã¼ã¿ãç ´æ£ï¼ 1013 invalidateSavedFacilitiesCache(); 1014 console.log('ðï¸ ãæ°ã«å ¥ããã£ãã·ã¥ãç¡å¹å'); 1015 1016 // loadUserFavoriteså®äºãã©ã°ãè¨å® 1017 window.userFavoritesLoaded = true; 1018 console.log('â userFavoritesLoaded = true'); 1019 1020 // ãã¿ã³ã®è¡¨ç¤ºãæ´æ° 1021 updateStarButtons(); 1022 1023 // ãæ°ã«å ¥ããã£ã«ã¿ã¼ãã¢ã¯ãã£ããªå ´åã¯åé©ç¨ 1024 const favoriteFilterBtn = document.getElementById('favoriteFilterBtn'); 1025 if (favoriteFilterBtn && favoriteFilterBtn.classList.contains('active')) { 1026 console.log('ð ãæ°ã«å ¥ããã£ã«ã¿ã¼ãåé©ç¨'); 1027 filterFavoriteFacilities(); 1028 } 1029 1030 // ãæ°ã«å ¥ããã£ã«ã¿ã¼ç¶æ ã復å ï¼loadUserFavoriteså®äºå¾ã«å¼ã³åºãï¼ 1031 console.log('ð loadUserFavoriteså®äºããæ°ã«å ¥ããã£ã«ã¿ã¼ç¶æ ã復å '); 1032 restoreFavoriteFilterState(); 1033 } catch (error) { 1034 console.error('â ãæ°ã«å ¥ãã®èªã¿è¾¼ã¿ã¨ã©ã¼:', error); 1035 // ã¨ã©ã¼æã¯ãã£ãã·ã¥ã使ç¨ï¼ä¸æ¸ãããªãï¼ 1036 if (cachedFavorites.length > 0) { 1037 window.currentUser.savedFacilities = cachedFavorites; 1038 console.log('ð ã¨ã©ã¼ã®ãããã£ãã·ã¥ã使ç¨:', cachedFavorites); 1039 updateStarButtons(); 1040 } else { 1041 window.currentUser.savedFacilities = []; 1042 } 1043 // ã¨ã©ã¼æããã©ã°ãè¨å®ï¼ãªãã©ã¤ãæ¢ããããï¼ 1044 window.userFavoritesLoaded = true; 1045 } 1046} 1047 1048// æ½è¨ãä¿åæ¸ã¿ããã§ãã¯ï¼æ½è¨åã§å¤å®ï¼ 1049function isFacilitySaved(facilityIndex) { 1050 const facility = window.facilities[facilityIndex]; 1051 if (!facility) return false;
1052 1053 const savedFacilities = getSavedFacilities(); 1054 return savedFacilities.includes(facility.name); 1055} 1056 1057// æãã¿ã³ã®è¡¨ç¤ºãæ´æ°ï¼ãªã¹ãå ¨ä½ãåçæãããæã¢ã¤ã³ã³ã®ã¿æ´æ°ï¼ 1058function updateStarButtons() { 1059 // å ¨ã¦ã®æãã¿ã³ãåå¾ãã¦ãåå¥ã«ã¢ã¤ã³ã³ãæ´æ° 1060 const starButtons = document.querySelectorAll('.facility-star-btn'); 1061 1062 starButtons.forEach(btn => { 1063 const facilityIndex = parseInt(btn.getAttribute('data-facility-index')); 1064 if (isNaN(facilityIndex)) return; 1065 1066 const isSaved = isFacilitySaved(facilityIndex); 1067 1068 // ã¢ã¤ã³ã³ãæ´æ° 1069 if (isSaved) { 1070 btn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#fbbf24" width="20" height="20"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg>'; 1071 btn.title = 'ä¿åæ¸ã¿'; 1072 } else { 1073 btn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#9ca3af" stroke-width="2" width="20" height="20"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg>'; 1074 btn.title = 'ãæ°ã«å ¥ãã«è¿½å '; 1075 } 1076 }); 1077 1078 console.log('â æãã¿ã³ãæ´æ°ãã¾ããï¼ãªã¹ãåçæãªãï¼'); 1079} 1080 1081// ä¿åæ¸ã¿æ½è¨ãèªã¿è¾¼ãã§è¡¨ç¤ºï¼æ½è¨åãã¼ã¹ï¼ 1082function loadSavedFacilities() { 1083 const savedFacilityNames = getSavedFacilities(); 1084 const savedFacilitiesList = document.getElementById('savedFacilitiesList'); 1085 1086 if (savedFacilityNames.length === 0) { 1087 savedFacilitiesList.innerHTML = ` 1088 <p style="text-align: center; color: #666; padding: 40px 20px;"> 1089 ä¿åæ¸ã¿ã®æ½è¨ã¯ããã¾ãã<br> 1090 æ½è¨ä¸è¦§ã®<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#fbbf24" width="16" height="16" style="vertical-align: middle; margin: 0 2px;"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg>ãã¼ã¯ããä¿åã§ãã¾ã 1091 </p> 1092 `; 1093 return; 1094 } 1095 1096 savedFacilitiesList.innerHTML = ''; 1097 1098 savedFacilityNames.forEach(savedName => { 1099 const index = window.facilities.findIndex(f => f.name === savedName); // ååOK:æ½è¨å(人ç©ã§ã¯ãªã) 1100 if (index === -1) { 1101 console.warn('â ï¸ ä¿åæ¸ã¿æ½è¨ãè¦ã¤ããã¾ãã:', savedName); 1102 return; 1103 } 1104 const facility = window.facilities[index]; 1105 1106 const item = document.createElement('div'); 1107 item.className = 'saved-facility-item'; 1108 item.innerHTML = ` 1109 <div class="saved-facility-name">${facility.name}</div> 1110 <div class="saved-facility-address">${facility.address}</div> 1111 `; 1112 1113 item.addEventListener('click', () => { 1114 selectFacilityFromList(index); 1115 hideSearchModal(); 1116 }); 1117 1118 savedFacilitiesList.appendChild(item); 1119 }); 1120} 1121 1122// æ¤ç´¢å±¥æ´ã«è¿½å 1123function addToSearchHistory(searchParams) { 1124 const history = getSearchHistory(); 1125 1126 const historyItem = { 1127 timestamp: new Date().toISOString(), 1128 baseLocation: searchParams.baseLocation, 1129 distance: searchParams.distance, 1130 facilityCount: searchParams.facilityCount 1131 }; 1132 1133 history.unshift(historyItem); 1134 1135 // æå¤§10ä»¶ã¾ã§ä¿å 1136 if (history.length > 10) { 1137 history.pop(); 1138 } 1139 1140 localStorage.setItem('searchHistory', JSON.stringify(history)); 1141} 1142 1143// æ¤ç´¢å±¥æ´ãåå¾ 1144function getSearchHistory() { 1145 const history = localStorage.getItem('searchHistory'); 1146 return history ? JSON.parse(history) : []; 1147} 1148 1149// æ¤ç´¢å±¥æ´ã表示 1150function loadSearchHistory() { 1151 const history = getSearchHistory(); 1152 const historyList = document.getElementById('searchHistoryList'); 1153 1154 if (history.length === 0) { 1155 historyList.innerHTML = ` 1156 <p style="text-align: center; color: #666; padding: 40px 20px;"> 1157 æ¤ç´¢å±¥æ´ã¯ããã¾ãã 1158 </p> 1159 `; 1160 return; 1161 } 1162 1163 historyList.innerHTML = ''; 1164
1165 history.forEach((item, index) => { 1166 const historyItem = document.createElement('div'); 1167 historyItem.className = 'history-item'; 1168 1169 const locationText = 1170 item.baseLocation === 'my-facility' ? 'ãã¤æ½è¨ãã' : 1171 item.baseLocation === 'gps' ? 'ç¾å¨å°ï¼GPSï¼ãã' : 1172 'å°å³ä¸ã®ä½ç½®ãã'; 1173 1174 const distanceText = item.distance === 'all' ? 'ãã¹ã¦è¡¨ç¤º' : `${item.distance}km以å `; 1175 1176 const date = new Date(item.timestamp); 1177 const timeText = `${date.getMonth() + 1}/${date.getDate()} ${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}`; 1178 1179 historyItem.innerHTML = ` 1180 <div style="font-weight: 500; margin-bottom: 4px;">${locationText} · ${distanceText}</div> 1181 <div style="font-size: 13px; color: #5f6368;">${timeText} · ${item.facilityCount}ä»¶</div> 1182 `; 1183 1184 historyList.appendChild(historyItem); 1185 }); 1186} 1187 1188// ã¢ã¼ãã«ãéãã 1189/* ã¢ã¼ãã«ã®å¤å´ãæ¼ãã»Escã§éãã(2026-08-24 ãªã¼ãã¼è¦æ)ã 1190 ä¸èº«ãæ¼ããã¨ãã«éããªããããæ¼ããå ´æãã¢ã¼ãã«æ¬ä½ãã®ãã®ã®æã ãéãã */ 1191(function bindSearchModalDismiss() { 1192 function bind() { 1193 var m = document.getElementById('searchModal'); 1194 if (!m) { setTimeout(bind, 300); return; } 1195 if (m._dismissBound) return; 1196 m._dismissBound = true; 1197 m.addEventListener('mousedown', function (e) { 1198 if (e.target === m) hideSearchModal(); // å¤å´(æãé¨å)ãæ¼ãã 1199 }); 1200 document.addEventListener('keydown', function (e) { 1201 if (e.key === 'Escape' && m.style.display !== 'none') hideSearchModal(); 1202 }); 1203 } 1204 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', bind); 1205 else bind(); 1206})(); 1207 1208/* ä½ç½®æ å ±ããã®å ´ã§èãç´ãã¦ãåãããæ¤ç´¢ãç¶ãã(2026-08-24)ã 1209 åããªãã¨ãã¯åå ãã¨ã«æé ãåºãã使ã£ã¦ãã端æ«ã»ãã©ã¦ã¶ã§æ¡å ãå¤ããã */ 1210function requestGpsThenSearch() { 1211 var btn = document.querySelector('.search-apply-btn'); 1212 var label = btn ? btn.textContent : ''; 1213 if (btn) { btn.disabled = true; btn.textContent = 'ç¾å¨å°ã確èªãã¦ãã¾ãâ¦'; } 1214 var restore = function () { if (btn) { btn.disabled = false; btn.textContent = label; } }; 1215 1216 if (!navigator.geolocation) { 1217 restore(); 1218 _gpsHelp('ãã®ãã©ã¦ã¶ã¯ä½ç½®æ å ±ã«å¯¾å¿ãã¦ãã¾ããã', ['ããã¤æ½è¨ãããã¾ãã¯ãå°å³ä¸ã®ä½ç½®ããããã使ããã ããã']); 1219 return; 1220 } 1221 navigator.geolocation.getCurrentPosition( 1222 function (pos) { 1223 window.userLocation = { lat: pos.coords.latitude, lng: pos.coords.longitude }; 1224 restore(); 1225 applyNearbySearch(); // ä½ç½®ãåããã®ã§ããã®ã¾ã¾æ¤ç´¢ãç¶ãã 1226 }, 1227 function (err) { 1228 restore(); 1229 var isMac = /Macintosh/.test(navigator.userAgent); 1230 var isFx = /Firefox/.test(navigator.userAgent); 1231 var isSafari = /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent); 1232 var steps = []; 1233 if (err && err.code === 1) { // æããã 1234 if (isFx) steps.push('ã¢ãã¬ã¹ãã¼å·¦ã®é åã¢ã¤ã³ã³ãæ¼ãããä½ç½®æ å ±ã¸ã®ã¢ã¯ã»ã¹ããã許å¯ãã«å¤ãã¦ãã ããã'); 1235 else if (isSafari) steps.push('Safari ã®è¨å® âãWebãµã¤ããâãä½ç½®æ å ±ãã§ããã®ãµã¤ããã許å¯ãã«ãã¦ãã ããã'); 1236 else steps.push('ã¢ãã¬ã¹ãã¼å·¦ã®ã¢ã¤ã³ã³ããããã®ãµã¤ãã®ä½ç½®æ å ±ãã許å¯ãã«ãã¦ãã ããã'); 1237 if (isMac) steps.push('ããã§ãåºãªãã¨ãã¯ãMac ã®ãã·ã¹ãã è¨å® â ãã©ã¤ãã·ã¼ã¨ã»ãã¥ãªã㣠â ä½ç½®æ å ±ãµã¼ãã¹ãã§ãã使ãã®ãã©ã¦ã¶ãå ¥ã«ãªã£ã¦ããã確èªãã¦ãã ããã'); 1238 else steps.push('ã¹ãã¼ããã©ã³ã®å ´åã¯ãæ¬ä½ã®è¨å®ã§ä½ç½®æ å ±ãµã¼ãã¹ãå ¥ã«ãªã£ã¦ããã確èªãã¦ãã ããã'); 1239 } else if (err && err.code === 3) { // æéåã 1240 steps.push('黿³¢ã®å±ãå ´æã§ããä¸åº¦ã試ããã ããã'); 1241 }
1241 else { // åããªã 1242 steps.push('端æ«ã®ä½ç½®æ å ±ãµã¼ãã¹ãå ¥ã«ãªã£ã¦ããã確èªãã¦ãã ããã'); 1243 if (isMac) steps.push('Mac ã¯ãã·ã¹ãã è¨å® â ãã©ã¤ãã·ã¼ã¨ã»ãã¥ãªã㣠â ä½ç½®æ å ±ãµã¼ãã¹ãã§ãã使ãã®ãã©ã¦ã¶ãå ¥ã«ãã¾ãã'); 1244 } 1245 steps.push('æ¥ãã¨ãã¯ããã¤æ½è¨ãããã¾ãã¯ãå°å³ä¸ã®ä½ç½®ããããé¸ã¶ã¨ãç¾å¨å°ãªãã§æ¢ãã¾ãã'); 1246 _gpsHelp('ç¾å¨å°ãåå¾ã§ãã¾ããã§ããã', steps); 1247 }, 1248 { enableHighAccuracy: false, timeout: 10000, maximumAge: 5 * 60 * 1000 } 1249 ); 1250} 1251 1252/* æ¡å ã®åºãæ¹ãalert ã ã¨1è¡ã§èªã¿ã«ããã®ã§ãæ¤ç´¢ã®ç»é¢ã®ä¸ã«åºã */ 1253function _gpsHelp(title, steps) { 1254 var host = document.querySelector('#tab-nearby') || document.querySelector('.search-modal-content'); 1255 if (!host) { alert(title + '\n' + steps.join('\n')); return; } 1256 var old = document.getElementById('gpsHelpBox'); if (old) old.remove(); 1257 var box = document.createElement('div'); 1258 box.id = 'gpsHelpBox'; 1259 box.style.cssText = 'margin:10px 0;padding:12px 14px;border:1px solid #fecaca;background:#fff5f5;border-radius:10px;font-size:13px;color:#7f1d1d;line-height:1.7;'; 1260 box.innerHTML = '<b>' + title + '</b><ul style="margin:6px 0 0;padding-left:18px;">' + 1261 steps.map(function (t) { return '<li>' + t + '</li>'; }).join('') + '</ul>' + 1262 '<div style="text-align:right;margin-top:8px;"><button type="button" style="border:1px solid #fecaca;background:#fff;color:#7f1d1d;border-radius:6px;padding:3px 10px;cursor:pointer;" onclick="this.closest(\'#gpsHelpBox\').remove()">éãã</button></div>'; 1263 host.insertBefore(box, host.firstChild); 1264 box.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); 1265} 1266window.requestGpsThenSearch = requestGpsThenSearch; 1267 1268function hideSearchModal() { 1269 document.getElementById('searchModal').style.display = 'none'; 1270 disableMapSelection(); 1271} 1272 1273// ã¢ã¼ãã«ãéã 1274function showSearchModal() { 1275 document.getElementById('searchModal').style.display = 'flex'; 1276 1277 // ãã°ã¤ã³ç¶æ ã«å¿ãã¦ãã¤æ½è¨ãªãã·ã§ã³ãæ´æ° 1278 updateMyFacilityOption(); 1279 1280 // ããã©ã«ãã¿ããè¿ãã®æ½è¨ã« 1281 switchSearchTab('nearby'); 1282 1283 // åºæºä½ç½®ãGPSã«è¨å® 1284 const gpsRadio = document.querySelector('input[name="baseLocation"][value="gps"]'); 1285 if (gpsRadio) { 1286 gpsRadio.checked = true; 1287 } 1288 1289 // è·é¢ãallã«è¨å® 1290 const allDistanceRadio = document.querySelector('input[name="distance"][value="all"]'); 1291 if (allDistanceRadio) { 1292 allDistanceRadio.checked = true; 1293 } 1294 1295 // æ¤ç´¢è§£é¤ãã¿ã³ã®è¡¨ç¤ºç¶æ ãæ´æ° 1296 updateClearButtonVisibility(); 1297 1298 handleLocationChange(); 1299} 1300 1301// æ¤ç´¢è§£é¤ãã¿ã³ã®è¡¨ç¤ºç¶æ ãæ´æ° 1302function updateClearButtonVisibility() { 1303 const clearBtn = document.getElementById('searchClearBtn'); 1304 const modalClearBtn = document.getElementById('searchModalClearBtn'); 1305 1306 if (clearBtn && modalClearBtn) { 1307 const isVisible = clearBtn.style.display === 'flex'; 1308 modalClearBtn.style.display = isVisible ? 'block' : 'none'; 1309 } 1310} 1311 1312// æ¤ç´¢çµæãè§£é¤ãã¦å ¨æ½è¨ã表示 1313window.clearSearchResults = function() { 1314 console.log('Clearing search results...'); 1315 1316 // æ¤ç´¢çµæã¤ã³ããã¯ã¹ãã¯ãªã¢ 1317 currentSearchResultIndices = null; 1318 1319 // æ¤ç´¢è§£é¤ãã¿ã³ãé表示ï¼ä¸¡æ¹ï¼ 1320 const clearBtn = document.getElementById('searchClearBtn'); 1321 if (clearBtn) { 1322 clearBtn.style.display = 'none'; 1323 } 1324 const modalClearBtn = document.getElementById('searchModalClearBtn'); 1325 if (modalClearBtn) { 1326 modalClearBtn.style.display = 'none'; 1327 } 1328 1329 // ãæ°ã«å ¥ããã£ã«ã¿ã¼ãè§£é¤ 1330 const favoriteFilterBtn = document.getElementById('favoriteFilterBtn'); 1331 if (favoriteFilterBtn && favoriteFilterBtn.classList.contains('active')) { 1332 favoriteFilterBtn.classList.remove('active'); 1333 if (favoriteFilterBtn.querySelector('.btn-icon')) { 1334 favoriteFilterBtn.querySelector('.btn-icon').textContent = 'â'; 1335 } 1336 } 1337 1338 // ç¹æ®ãã£ã«ã¿ã¼ãONããã§ã㯠1339 const vaivtBtn = document.getElementById('vaivtBtn'); 1340 const peritonealBtn = document.getElementById('peritonealBtn'); 1341 const homeDialysisBtn = document.getElementById('homeDialysisBtn'); 1342 const nightDialysisBtn = document.getElementById('nightDialysisBtn'); 1343 1344 const isVAIVTActive = vaivtBtn && vaivtBtn.classList.contains('active'); 1345 const isPeritonealActive = peritonealBtn && peritonealBtn.classList.contains('active'); 1346 const isHomeDialysisActive = homeDialysisBtn && homeDialysisBtn.classList.contains('active'); 1347 const isNightDialysisActive = nightDialysisBtn && nightDialysisBtn.classList.contains('active'); 1348 1349 const hasSpecialFilter = isVAIVTActive || isPeritonealActive || isHomeDialysisActive || isNightDialysisActive; 1350 1351 // æ½è¨ãªã¹ãã表示 1352 if (hasSpecialFilter) { 1353 // ç¹æ®ãã£ã«ã¿ã¼ãONã®å ´åããã®ãã£ã«ã¿ã¼ã«å¿ããæ½è¨ãªã¹ãã表示 1354 if (isVAIVTActive && typeof window.filterFacilityList === 'function') { 1355 window.filterFacilityList('vaivt'); 1356 } else if (isPeritonealActive && typeof window.filterFacilityList === 'function') { 1357 window.filterFacilityList('peritoneal'); 1358 } else if (isHomeDialysisActive && typeof window.filterFacilityList === 'function') { 1359 window.filterFacilityList('homeDialysis'); 1360 } else if (isNightDialysisActive && typeof window.filterFacilityList === 'function') { 1361 window.filterFacilityList('nightDialysis'); 1362 } 1363 } else if (typeof createFacilityList === 'function') { 1364 // ç¹æ®ãã£ã«ã¿ã¼ãOFFãªãå ¨æ½è¨ã表示 1365 createFacilityList(); 1366 } 1367 1368 // ãããä¸ã®ãã¼ã«ã¼ã¨ã©ãã«ãå°åãã£ã«ã¿ã¼ã¨ç¹æ®ãã£ã«ã¿ã¼ã«å¾ã£ã¦å表示 1369 const currentRegionFilter = window.currentRegionFilter || 'all'; 1370 const allFacilities = window.allFacilities || window.facilities || []; 1371 1372 if (window.facilityMarkers) {
1373 window.facilityMarkers.forEach((marker, index) => { 1374 if (marker) { 1375 const facility = allFacilities[index]; 1376 let shouldShow = true; 1377 1378 // å°åãã£ã«ã¿ã¼ãã§ã㯠1379 if (currentRegionFilter !== 'all' && facility) { 1380 const regionInfo = window.getRegionInfo ? window.getRegionInfo(facility.prefecture || "å®®å") : null; 1381 shouldShow = regionInfo && (regionInfo.region === currentRegionFilter || facility.prefecture === currentRegionFilter); 1382 } 1383 1384 // ç¹æ®ãã£ã«ã¿ã¼ãã§ã㯠1385 if (shouldShow && hasSpecialFilter && facility) { 1386 if (isVAIVTActive) { 1387 shouldShow = facility.vaivt === "ã¯ã"; 1388 } else if (isPeritonealActive) { 1389 shouldShow = facility.peritoneal === "ãã"; 1390 } else if (isHomeDialysisActive) { 1391 shouldShow = facility.homeDialysis === "ãã"; 1392 } else if (isNightDialysisActive) { 1393 shouldShow = facility.nightDialysis === "ãã"; 1394 } 1395 } 1396 1397 marker.setVisible(shouldShow); 1398 } 1399 }); 1400 } 1401 1402 if (typeof window.updateLabelsVisibility === 'function') { 1403 window.updateLabelsVisibility(); 1404 } 1405 1406 // éç¥ã表示 1407 if (typeof showNotification === 'function') { 1408 showNotification('æ¤ç´¢ãè§£é¤ãã¾ãã', 2000); 1409 } 1410}; 1411 1412// ãæ°ã«å ¥ããã£ã«ã¿ã¼ãåãæ¿ã 1413function toggleFavoriteFilter() { 1414 const favoriteFilterBtn = document.getElementById('favoriteFilterBtn'); 1415 if (!favoriteFilterBtn) return; 1416 1417 // ãããã°ãã°ï¼ç¾å¨ã®ãã¿ã³ç¶æ 1418 console.log('ð toggleFavoriteFilter å¼ã³åºã:', { 1419 classList: Array.from(favoriteFilterBtn.classList), 1420 hasActive: favoriteFilterBtn.classList.contains('active'), 1421 innerHTML: favoriteFilterBtn.innerHTML.substring(0, 50), 1422 _favoriteFilterRestored: window._favoriteFilterRestored 1423 }); 1424 1425 // æ½è¨ãã¼ã¿ãã¾ã ãã¼ãããã¦ããªãå ´åã¯è¦åã表示 1426 if (!window.facilitiesDataLoaded || !window.facilities || window.facilities.length === 0) { 1427 console.warn('â ï¸ æ½è¨ãã¼ã¿ãã¾ã ãã¼ãããã¦ãã¾ãããå°ããå¾ ã¡ãã ããã'); 1428 alert('æ½è¨ãã¼ã¿ãèªã¿è¾¼ã¿ä¸ã§ããå°ããå¾ ã¡ãã ããã'); 1429 return; 1430 } 1431 1432 // â 以åã¯ããã§ã¹ã¯ãã¼ã«ä½ç½®ãä¿åãã¦å¾©å ãã¦ããããçµãè¾¼ãã¨ä¸èº«ãå¤ãããã 1433 // éä¸ã®ä½ç½®ã«æ»ãã¨åããã«ããã£ããä¸çªä¸ããè¦ãã(2026-08-16 ãªã¼ãã¼æç¤º) 1434 const listContent = document.querySelector('.facility-list-content'); 1435 1436 const isActive = favoriteFilterBtn.classList.contains('active'); 1437 console.log('ð toggleFavoriteFilter: isActive =', isActive); 1438 1439 if (isActive) { 1440 // ãã£ã«ã¿ã¼è§£é¤ 1441 favoriteFilterBtn.classList.remove('active'); 1442 favoriteFilterBtn.querySelector('.btn-icon').textContent = 'â'; 1443 1444 // éè¦: createFacilityListãå¼ã¶åã«localStorageãæ´æ°ãã 1445 // ããã«ããcreateFacilityListå ã§activeã¯ã©ã¹ãå追å ããããã¨ãé²ã 1446 localStorage.setItem('favoriteFilterActive', 'false'); 1447 window._favoriteFilterRestored = true; // 復å å¦çãã¹ãããããã 1448 1449 // ç¹æ®ãã£ã«ã¿ã¼ãONããã§ã㯠1450 const vaivtBtn = document.getElementById('vaivtBtn'); 1451 const peritonealBtn = document.getElementById('peritonealBtn'); 1452 const homeDialysisBtn = document.getElementById('homeDialysisBtn'); 1453 const nightDialysisBtn = document.getElementById('nightDialysisBtn'); 1454 1455 const isVAIVTActive = vaivtBtn && vaivtBtn.classList.contains('active'); 1456 const isPeritonealActive = peritonealBtn && peritonealBtn.classList.contains('active'); 1457 const isHomeDialysisActive = homeDialysisBtn && homeDialysisBtn.classList.contains('active'); 1458 const isNightDialysisActive = nightDialysisBtn && nightDialysisBtn.classList.contains('active'); 1459 1460 const hasSpecialFilter = isVAIVTActive || isPeritonealActive || isHomeDialysisActive || isNightDialysisActive; 1461 1462 // æ½è¨ãªã¹ãã表示 1463 if (hasSpecialFilter) { 1464 // ç¹æ®ãã£ã«ã¿ã¼ãONã®å ´åããã®ãã£ã«ã¿ã¼ã«å¿ããæ½è¨ãªã¹ãã表示 1465 if (isVAIVTActive && typeof window.filterFacilityList === 'function') { 1466 window.filterFacilityList('vaivt'); 1467 } else if (isPeritonealActive && typeof window.filterFacilityList === 'function') { 1468 window.filterFacilityList('peritoneal'); 1469 } else if (isHomeDialysisActive && typeof window.filterFacilityList === 'function') { 1470 window.filterFacilityList('homeDialysis'); 1471 } else if (isNightDialysisActive && typeof window.filterFacilityList === 'function') { 1472 window.filterFacilityList('nightDialysis'); 1473 } 1474 } else if (typeof createFacilityList === 'function') { 1475 // ç¹æ®ãã£ã«ã¿ã¼ãOFFãªãå ¨æ½è¨ã表示 1476 createFacilityList(); 1477 } 1478 1479 // ãããä¸ã®ãã¼ã«ã¼ã¨ã©ãã«ãå°åãã£ã«ã¿ã¼ã¨ç¹æ®ãã£ã«ã¿ã¼ã«å¾ã£ã¦å表示 1480 const currentRegionFilter = window.currentRegionFilter || 'all'; 1481 const allFacilities = window.allFacilities || window.facilities || []; 1482 1483 if (window.facilityMarkers) {
1484 window.facilityMarkers.forEach((marker, index) => { 1485 if (marker) { 1486 const facility = allFacilities[index]; 1487 let shouldShow = true; 1488 1489 // å°åãã£ã«ã¿ã¼ãã§ã㯠1490 if (currentRegionFilter !== 'all' && facility) { 1491 const regionInfo = window.getRegionInfo ? window.getRegionInfo(facility.prefecture || "å®®å") : null; 1492 shouldShow = regionInfo && (regionInfo.region === currentRegionFilter || facility.prefecture === currentRegionFilter); 1493 } 1494 1495 // ç¹æ®ãã£ã«ã¿ã¼ãã§ã㯠1496 if (shouldShow && hasSpecialFilter && facility) { 1497 if (isVAIVTActive) { 1498 shouldShow = facility.vaivt === "ã¯ã"; 1499 } else if (isPeritonealActive) { 1500 shouldShow = facility.peritoneal === "ãã"; 1501 } else if (isHomeDialysisActive) { 1502 shouldShow = facility.homeDialysis === "ãã"; 1503 } else if (isNightDialysisActive) { 1504 shouldShow = facility.nightDialysis === "ãã"; 1505 } 1506 } 1507 1508 marker.setVisible(shouldShow); 1509 } 1510 }); 1511 } 1512 1513 if (window.facilityLabels && typeof window.updateLabelsVisibility === 'function') { 1514 window.updateLabelsVisibility(); 1515 } 1516 1517 // ç·æ¥ãã¼ã«ã¼ã®è¡¨ç¤ºæ´æ° 1518 if (typeof window.updateEmergencyMarkersVisibility === 'function') { 1519 window.updateEmergencyMarkersVisibility(); 1520 } 1521 } else { 1522 // ãã£ã«ã¿ã¼æå¹å 1523 favoriteFilterBtn.classList.add('active'); 1524 favoriteFilterBtn.querySelector('.btn-icon').textContent = 'â'; 1525 1526 // éè¦: ãã£ã«ã¿ã¼ç¶æ ãå³åº§ã«ä¿åãã¦å¾©å ãã©ã°ãè¨å® 1527 localStorage.setItem('favoriteFilterActive', 'true'); 1528 window._favoriteFilterRestored = true; 1529 1530 // ãæ°ã«å ¥ãæ½è¨ã®ã¿ã表示 1531 filterFavoriteFacilities(); 1532 1533 // ç·æ¥ãã¼ã«ã¼ã®è¡¨ç¤ºæ´æ° 1534 if (typeof window.updateEmergencyMarkersVisibility === 'function') { 1535 window.updateEmergencyMarkersVisibility(); 1536 } 1537 } 1538 1539 // ãæ°ã«å ¥ããã£ã«ã¿ã¼ç¶æ ãlocalStorageã«ä¿åï¼æ¢ã«ä¸ã§è¨å®æ¸ã¿ã ã念ã®ããï¼ 1540 const newState = favoriteFilterBtn.classList.contains('active'); 1541 localStorage.setItem('favoriteFilterActive', newState ? 'true' : 'false'); 1542 console.log('ð¾ ãæ°ã«å ¥ããã£ã«ã¿ã¼ç¶æ ãä¿å:', newState); 1543 1544 // ä¸çªä¸ã«æ»ãï¼DOMã®æ´æ°å¾ã«å®è¡ï¼ 1545 setTimeout(() => { 1546 if (listContent) { 1547 listContent.scrollTop = 0; 1548 } 1549 }, 0); 1550} 1551 1552// ãæ°ã«å ¥ããã£ã«ã¿ã¼ç¶æ ã復å 1553function restoreFavoriteFilterState() { 1554 const savedState = localStorage.getItem('favoriteFilterActive'); 1555 console.log('ð ãæ°ã«å ¥ããã£ã«ã¿ã¼ç¶æ ãèªã¿è¾¼ã¿:', savedState); 1556 1557 if (savedState === 'true') { 1558 let retryCount = 0; 1559 const maxRetries = 100; // æå¤§10ç§å¾ æ© 1560 1561 // æ½è¨ãã¼ã¿ã¨ãæ°ã«å ¥ããã¼ã¿ããã¼ããããã¾ã§å¾ æ© 1562 const checkAndApply = () => { 1563 retryCount++; 1564 1565 // æ½è¨ãã¼ã¿ã®ãã§ã㯠1566 const facilitiesReady = window.facilitiesDataLoaded && window.facilities && window.facilities.length > 0; 1567 1568 // ãæ°ã«å ¥ããã¼ã¿ã®ãã§ã㯠1569 let favoritesReady = false; 1570 if (window.currentUser && window.currentUser.facilityId) { 1571 // ãã°ã¤ã³ä¸ï¼loadUserFavoritesãå®äºããããã§ã㯠1572 if (!window.userFavoritesLoaded) { 1573 console.log('ð restoreFavoriteFilterState: loadUserFavoritesãã¾ã å®äºãã¦ããªãããå¾ æ©'); 1574 favoritesReady = false; 1575 } else { 1576 // loadUserFavoriteså®äºæ¸ã¿ 1577 favoritesReady = true; 1578 } 1579 } else if (window.authStateResolved && !window.currentUser) { 1580 // èªè¨¼ç¶æ ãç¢ºå®æ¸ã¿ã§ã¦ã¼ã¶ã¼ãªã â ãã°ã¢ã¦ãç¶æ ï¼ãªãã©ã¤ä¸è¦ï¼ 1581 console.log('ð restoreFavoriteFilterState: ãã°ã¢ã¦ãç¶æ ã®ãã復å 䏿¢'); 1582 return; 1583 } else if (window.currentUser && !window.currentUser.facilityId) { 1584 // currentUserã¯åå¨ãããfacilityIdãã¾ã è¨å®ããã¦ããªã â èªè¨¼å¦çä¸ãå¾ æ© 1585 console.log('ð restoreFavoriteFilterState: facilityIdãã¾ã è¨å®ããã¦ããªãããå¾ æ©'); 1586 favoritesReady = false;
1587 } else if (!window.authStateResolved) { 1588 // èªè¨¼ç¶æ ãã¾ã 確å®ãã¦ããªã â å¾ æ© 1589 favoritesReady = false; 1590 } else { 1591 // ãã®ä»ã®ã±ã¼ã¹ï¼ã²ã¹ãã¦ã¼ã¶ã¼ãªã©ï¼ 1592 favoritesReady = true; 1593 } 1594 1595 console.log('ð restoreFavoriteFilterState ãã§ãã¯:', { 1596 facilitiesReady, 1597 favoritesReady, 1598 retryCount, 1599 hasFacilityId: window.currentUser?.facilityId 1600 }); 1601 1602 if (facilitiesReady && favoritesReady) { 1603 const favoriteFilterBtn = document.getElementById('favoriteFilterBtn'); 1604 if (favoriteFilterBtn && !favoriteFilterBtn.classList.contains('active')) { 1605 console.log('â ãæ°ã«å ¥ããã£ã«ã¿ã¼ã復å ï¼ãã¼ã¿ãã¼ãå®äºï¼'); 1606 toggleFavoriteFilter(); 1607 } 1608 } else if (retryCount < maxRetries) { 1609 // ã¾ã ãã¼ãããã¦ããªãå ´åã¯100mså¾ã«åè©¦è¡ 1610 setTimeout(checkAndApply, 100); 1611 } else { 1612 console.warn('â ï¸ ãæ°ã«å ¥ããã£ã«ã¿ã¼å¾©å ã¿ã¤ã ã¢ã¦ã'); 1613 } 1614 }; 1615 // å°ãé å»¶ããã¦ãããã§ãã¯éå§ 1616 setTimeout(checkAndApply, 200); 1617 } 1618} 1619 1620// ãæ°ã«å ¥ãæ½è¨ã®ã¿ãè¡¨ç¤ºï¼æ½è¨åãã¼ã¹ï¼ 1621function filterFavoriteFacilities() { 1622 const savedFacilityNames = getSavedFacilities(); 1623 console.log('filterFavoriteFacilities: savedFacilityNames =', savedFacilityNames); 1624 1625 // æ½è¨ãã¼ã¿ãã¾ã ãã¼ãããã¦ããªãå ´åã¯è¦åã表示ãã¦çµäº 1626 if (!window.facilities || window.facilities.length === 0) { 1627 console.warn('â ï¸ æ½è¨ãã¼ã¿ãã¾ã ãã¼ãããã¦ãã¾ãããå°ããå¾ ã¡ãã ããã'); 1628 const listContainer = document.getElementById("facilityListItems"); 1629 if (listContainer) { 1630 listContainer.innerHTML = ` 1631 <div style="padding: 40px 20px; text-align: center; color: #666;"> 1632 æ½è¨ãã¼ã¿ãèªã¿è¾¼ã¿ä¸ã§ã...<br> 1633 å°ããå¾ ã¡ãã ãã 1634 </div> 1635 `; 1636 } 1637 return; 1638 } 1639 1640 if (savedFacilityNames.length === 0) { 1641 const listContainer = document.getElementById("facilityListItems"); 1642 listContainer.innerHTML = ` 1643 <div style="padding: 40px 20px; text-align: center; color: #666;"> 1644 ãæ°ã«å ¥ãã«ç»é²ãããæ½è¨ã¯ããã¾ãã<br> 1645 æ½è¨ä¸è¦§ã®âãã¼ã¯ããç»é²ã§ãã¾ã 1646 </div> 1647 `; 1648 1649 // ãã¼ã«ã¼ãé表示ã«ãã 1650 if (window.facilityMarkers) { 1651 window.facilityMarkers.forEach(marker => { 1652 if (marker) marker.setVisible(false); 1653 }); 1654 } 1655 if (window.facilityLabels) {
1656 window.facilityLabels.forEach(label => { 1657 if (label && typeof label.setMap === 'function') { 1658 label.setMap(null); 1659 } 1660 }); 1661 } 1662 return; 1663 } 1664 1665 // ãæ°ã«å ¥ãæ½è¨ãæ½è¨åã§æ¤ç´¢ãã¦åå¾ 1666 let favoriteFacilities = []; 1667 savedFacilityNames.forEach(savedName => { 1668 const index = window.facilities.findIndex(f => f.name === savedName); // ååOK:æ½è¨å(人ç©ã§ã¯ãªã) 1669 if (index !== -1) { 1670 const facility = window.facilities[index]; 1671 favoriteFacilities.push({ ...facility, originalIndex: index }); 1672 } else { 1673 console.warn('â ï¸ ãæ°ã«å ¥ãæ½è¨ãè¦ã¤ããã¾ãã:', savedName); 1674 } 1675 }); 1676 1677 // ç¾å¨ã®å°åãã£ã«ã¿ã¼ãé©ç¨ 1678 const currentRegionFilter = window.currentRegionFilter || 'all'; 1679 if (currentRegionFilter !== 'all') { 1680 favoriteFacilities = favoriteFacilities.filter(facility => { 1681 const regionInfo = window.getRegionInfo ? window.getRegionInfo(facility.prefecture || "å®®å") : null; 1682 return regionInfo && (regionInfo.region === currentRegionFilter || facility.prefecture === currentRegionFilter); 1683 }); 1684 } 1685 1686 displayFavoriteFacilities(favoriteFacilities); 1687 1688 // ãããä¸ã®ãã¼ã«ã¼ã¨ã©ãã«ãæ´æ°ï¼å°åãã£ã«ã¿ã¼ãèæ ®ï¼ 1689 if (window.facilityMarkers) { 1690 window.facilityMarkers.forEach((marker, index) => { 1691 if (marker) { 1692 const facility = window.facilities[index]; 1693 const isFavorite = facility && savedFacilityNames.includes(facility.name); 1694 let isInRegion = true; 1695 1696 if (currentRegionFilter !== 'all' && facility) { 1697 const regionInfo = window.getRegionInfo ? window.getRegionInfo(facility.prefecture || "å®®å") : null; 1698 isInRegion = regionInfo && (regionInfo.region === currentRegionFilter || facility.prefecture === currentRegionFilter); 1699 } 1700 1701 marker.setVisible(isFavorite && isInRegion); 1702 } 1703 }); 1704 } 1705 1706 if (window.facilityLabels) {
1707 window.facilityLabels.forEach((label, index) => { 1708 const facility = window.facilities[index]; 1709 const isFavorite = facility && savedFacilityNames.includes(facility.name); 1710 let isInRegion = true; 1711 1712 if (currentRegionFilter !== 'all' && facility) { 1713 const regionInfo = window.getRegionInfo ? window.getRegionInfo(facility.prefecture || "å®®å") : null; 1714 isInRegion = regionInfo && (regionInfo.region === currentRegionFilter || facility.prefecture === currentRegionFilter); 1715 } 1716 1717 if (label && typeof label.setMap === 'function') { 1718 if (isFavorite && isInRegion) { 1719 if (window.map) { 1720 label.setMap(window.map); 1721 } 1722 } else { 1723 label.setMap(null); 1724 } 1725 } 1726 }); 1727 } 1728} 1729 1730// ãæ°ã«å ¥ãæ½è¨ã表示 1731function displayFavoriteFacilities(facilities) { 1732 const listContainer = document.getElementById("facilityListItems"); 1733 listContainer.innerHTML = ""; 1734 1735 // ã¹ã¯ãã¼ã«ä½ç½®ã¯ä¿æããï¼ã¦ã¼ã¶ã¼ä½é¨åä¸ã®ããï¼ 1736 1737 facilities.forEach((facility) => { 1738 const colorData = getPatientColor(facility.patients); 1739 const facilityItem = document.createElement("div"); 1740 facilityItem.className = "facility-item"; 1741 facilityItem.dataset.index = facility.originalIndex; 1742 facilityItem.style.backgroundColor = colorData.lightColor; 1743 facilityItem.style.borderLeftColor = colorData.color; 1744 1745 facilityItem.innerHTML = ` 1746 <div style="display: flex; justify-content: space-between; align-items: center;"> 1747 <div class="facility-name">${facility.name}</div> 1748 <button class="facility-star-btn" data-facility-index="${facility.originalIndex}" title="ãæ°ã«å ¥ãããåé¤"> 1749 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#fbbf24" width="20" height="20"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> 1750 </button> 1751 </div> 1752 <div class="facility-patients" style="color: ${colorData.color}; display: flex; align-items: center; justify-content: space-between; min-height: 24px;"> 1753 <span>æ£è æ°: ${facility.patients}人 | ãããæ°: ${facility.beds}åº</span> 1754 <div style="display: flex; gap: 8px; flex-shrink: 0;"> 1755 <button class="detail-btn" data-facility-index="${facility.originalIndex}">詳細</button> 1756 ${window.currentUser ? `<button class="referral-btn" data-facility-index="${facility.originalIndex}" data-facility-name="${facility.name}" data-vaivt="${facility.vaivt}">ç´¹ä»</button>` : ''} 1757 </div> 1758 </div> 1759 <div class="facility-details" style="margin-top: 8px;"> 1760 ${facility.postalCode ? ` 1761 <div class="facility-detail-row"> 1762 <span class="facility-detail-label">ã:</span> 1763 <span class="facility-detail-value">${facility.postalCode}</span> 1764 </div> 1765 ` : ''} 1766 <div class="facility-detail-row"> 1767 <span class="facility-detail-label">使:</span> 1768 <span class="facility-detail-value">${facility.address}</span> 1769 </div> 1770 <div class="facility-detail-row"> 1771 <span class="facility-detail-label">é»è©±:</span> 1772 <span class="facility-detail-value">${facility.phone}</span> 1773 </div> 1774 <div class="facility-detail-row"> 1775 <span class="facility-detail-label">FAX:</span> 1776 <span class="facility-detail-value">${facility.fax && facility.fax !== "undefined" ? facility.fax : "æ å ±ãªã"}</span> 1777 </div> 1778 ${facility.website && facility.website !== null ? ` 1779 <div class="facility-detail-row"> 1780 <span class="facility-detail-label">HP:</span> 1781 <span class="facility-detail-value"> 1782 <a href="${typeof normalizeUrl === 'function' ? normalizeUrl(facility.website) : facility.website}" target="_blank" rel="noopener noreferrer"> 1783 ${facility.website} 1784 </a> 1785 </span> 1786 </div> 1787 ` : ` 1788 <div class="facility-detail-row"> 1789 <span class="facility-detail-label">HP:</span>
1790 <span class="facility-detail-value">æªè¨å®</span> 1791 </div> 1792 `} 1793 </div> 1794 <div class="facility-extended-details" id="extended_${facility.originalIndex}" style="display: none;"> 1795 <div class="detail-row"><span>éè¿å¯¾å¿:</span><span>${getExtendedData(facility.originalIndex, "transport", "æªè¨å®")}</span></div> 1796 <div class="detail-row"><span>é§è»å ´:</span><span>${getExtendedData(facility.originalIndex, "parking", "æªè¨å®")}</span></div> 1797 <div class="detail-row"><span>å ¥é¢ããã:</span><span>${getExtendedData(facility.originalIndex, "inpatient", "æªè¨å®")}</span></div> 1798 <div class="detail-row"><span>æ´»åå¶é:</span><span>${getExtendedData(facility.originalIndex, "activity", "æªè¨å®")}</span></div> 1799 <div class="detail-row"><span>çæ´»ä¿è·åãå ¥ã:</span><span>${getExtendedData(facility.originalIndex, "welfare", "æªè¨å®")}</span></div> 1800 <div class="detail-row"><span>ç²¾ç¥ç¾æ£åãå ¥ã:</span><span>${getExtendedData(facility.originalIndex, "mental", "æªè¨å®")}</span></div> 1801 <div class="detail-row"><span>è ¹èéæåãå ¥ã:</span><span>${getExtendedData(facility.originalIndex, "peritoneal", "æªè¨å®")}</span></div> 1802 <div class="detail-row"><span>å¨å® éæ:</span><span>${getExtendedData(facility.originalIndex, "homeDialysis", "æªè¨å®")}</span></div> 1803 <div class="detail-row"><span>å¤ééæ:</span><span>${getExtendedData(facility.originalIndex, "nightDialysis", "æªè¨å®")}</span></div> 1804 <div class="detail-row"><span>VAIVT(PTA)å¯¾å¿æ½è¨:</span><span>${getExtendedData(facility.originalIndex, "vaivt", "æªè¨å®")}</span></div> 1805 ${window.getVaivtReferralDisplay ? window.getVaivtReferralDisplay(facility.originalIndex) : ''} 1806 <div class="detail-row"><span>æ è¡éæã®åãå ¥ã:</span><span>${getExtendedData(facility.originalIndex, "travelDialysis", "æªè¨å®")}</span></div> 1807 <div style="margin-top: 10px;"> 1808 <strong>æ¡å æ å ±:</strong><br> 1809 ${getExtendedData(facility.originalIndex, "info", "æªè¨å®")} 1810 </div> 1811 ${window.generateOccupancyCharts ? window.generateOccupancyCharts(facility) : ''} 1812 </div> 1813 `; 1814 1815 // æãã¿ã³ã®ã¤ãã³ããªã¹ãã¼ã追å 1816 const starBtn = facilityItem.querySelector('.facility-star-btn'); 1817 if (starBtn) { 1818 const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0; 1819 1820 const handleStarClick = (e) => { 1821 e.preventDefault(); 1822 e.stopPropagation(); 1823 const facilityIndex = parseInt(starBtn.getAttribute('data-facility-index')); 1824 console.log('Star button activated:', facilityIndex); 1825 toggleSaveFacility(facilityIndex); 1826 }; 1827 1828 if (isTouchDevice) { 1829 starBtn.addEventListener('touchend', handleStarClick, { passive: false }); 1830 } 1831 1832 // ãã¹ã¦ã®ããã¤ã¹ã§clickã¤ãã³ãã追å ï¼ãã©ã¼ã«ããã¯ï¼ 1833 starBtn.addEventListener('click', handleStarClick); 1834 } 1835 1836 // 詳細ãã¿ã³ã®ã¤ãã³ããªã¹ãã¼ã追å (Windows対å¿) 1837 const detailBtn = facilityItem.querySelector('.detail-btn'); 1838 if (detailBtn) { 1839 const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0; 1840 1841 const handleDetailClick = (e) => { 1842 e.preventDefault(); 1843 e.stopPropagation(); 1844 const facilityIndex = parseInt(detailBtn.getAttribute('data-facility-index')); 1845 console.log('Detail button activated for facility:', facilityIndex); 1846 1847 // å°ãé å»¶ããã¦ç¢ºå®ã«å®è¡ 1848 setTimeout(() => { 1849 if (typeof window.toggleFacilityDetails === 'function') { 1850 window.toggleFacilityDetails(facilityIndex); 1851 } 1852 }, 0); 1853 }; 1854 1855 if (isTouchDevice) { 1856 detailBtn.addEventListener('touchend', handleDetailClick, { passive: false }); 1857 } 1858 1859 // ãã¹ã¦ã®ç°å¢ã§clickããªãã¹ã³ï¼ãã©ã¼ã«ããã¯ï¼ 1860 detailBtn.addEventListener('click', handleDetailClick); 1861 } 1862 1863 // ç´¹ä»ãã¿ã³ã®ã¤ãã³ããªã¹ãã¼ã追å 1864 const referralBtn = facilityItem.querySelector('.referral-btn'); 1865 if (referralBtn) { 1866 const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0; 1867 1868 const handleReferralClick = (e) => { 1869 e.preventDefault(); 1870 e.stopPropagation(); 1871 const facilityIndex = parseInt(referralBtn.getAttribute('data-facility-index')); 1872 const facilityName = referralBtn.getAttribute('data-facility-name'); 1873 const vaivt = referralBtn.getAttribute('data-vaivt'); 1874 console.log('Referral button clicked for facility:', facilityName); 1875 1876 // VAIVTå¯¾å¿æ½è¨ãã©ããã§é¸æè¢ã表示 1877 if (typeof window.showReferralOptions === 'function') { 1878 window.showReferralOptions(facilityIndex, facilityName, vaivt); 1879 } 1880 }; 1881 1882 if (isTouchDevice) { 1883 referralBtn.addEventListener('touchend', handleReferralClick, { passive: false }); 1884 } 1885 referralBtn.addEventListener('click', handleReferralClick); 1886 } 1887 1888 facilityItem.addEventListener("click", (e) => { 1889 if (!e.target.closest('.facility-star-btn') && !e.target.closest('.detail-btn') && !e.target.closest('.referral-btn')) { 1890 selectFacilityFromList(facility.originalIndex); 1891 } 1892 }); 1893 1894 listContainer.appendChild(facilityItem); 1895 }); 1896 1897 // ãã°ã¤ã³ä¸ã®ã¦ã¼ã¶ã¼æ½è¨ã®ãã¤ã©ã¤ããé©ç¨ 1898 if (window.currentUser && window.facilities) { 1899 const userFacilityIndex = window.facilities.findIndex(f => 1900 window.currentUser.facilityName && f.name === window.currentUser.facilityName // ååOK:æ½è¨å(人ç©ã§ã¯ãªã) 1901 ); 1902 if (userFacilityIndex !== -1) { 1903 setTimeout(() => { 1904 const facilityItem = document.querySelector(`[data-index="${userFacilityIndex}"]`); 1905 if (facilityItem) { 1906 facilityItem.classList.add('user-facility'); 1907 } 1908 }, 100); 1909 } 1910 } 1911 if (typeof window.scrollFacilityListTop === 'function') window.scrollFacilityListTop(); 1912} 1913 1914// ã°ãã¼ãã«é¢æ°ã¨ãã¦å ¬é 1915window.switchSearchTab = switchSearchTab; 1916window.handleLocationChange = handleLocationChange; 1917window.applyNearbySearch = applyNearbySearch; 1918window.resetSearch = resetSearch; 1919window.toggleSaveFacility = toggleSaveFacility; 1920window.getSavedFacilities = getSavedFacilities; 1921window.isFacilitySaved = isFacilitySaved; 1922window.hideSearchModal = hideSearchModal;
1923window.showSearchModal = showSearchModal; 1924window.loadUserFavorites = loadUserFavorites; 1925window.toggleFavoriteFilter = toggleFavoriteFilter; 1926window.restoreFavoriteFilterState = restoreFavoriteFilterState; 1927 1928// ã°ãã¼ãã«å¤æ°ã¨ãã¦å ¬é 1929Object.defineProperty(window, 'currentSearchResultIndices', { 1930 get: function() { return currentSearchResultIndices; }, 1931 set: function(value) { currentSearchResultIndices = value; } 1932}); 1933 1934// search.jsèªã¿è¾¼ã¿å®äºæã«ãæ°ã«å ¥ããã£ã«ã¿ã¼å¾©å ãèªåå¼ã³åºã 1935console.log('ð search.js èªã¿è¾¼ã¿å®äºããæ°ã«å ¥ããã£ã«ã¿ã¼å¾©å ãã¹ã±ã¸ã¥ã¼ã«'); 1936setTimeout(() => { 1937 console.log('ð search.js ãããæ°ã«å ¥ããã£ã«ã¿ã¼å¾©å ãå®è¡'); 1938 restoreFavoriteFilterState(); 1939}, 1500);
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.