{"id":25,"date":"2024-12-15T04:28:57","date_gmt":"2024-12-15T04:28:57","guid":{"rendered":"https:\/\/ipaphysio.arelidev.com\/orange-county\/?page_id=25"},"modified":"2026-03-03T23:58:20","modified_gmt":"2026-03-03T23:58:20","slug":"home","status":"publish","type":"page","link":"https:\/\/ipaphysio.arelidev.com\/portland\/","title":{"rendered":"Home"},"content":{"rendered":"\n<div  class=\"ipa-hero-block relative flex flex-col justify-center\">\n            \n                    <!-- Default Layout -->\n            <div class=\"ipa-hero-block-inner relative z-10 h-[505px] md:h-[680px] md:w-[45%] h-[340px] md:h-[680px] slide-in-left flex items-center justify-center md:justify-start\">\n                <div class=\"text-white bg-primary\/80 px-10 pt-40 pb-16 md:pb-20 md:px-14 w-full h-full flex items-center\">\n                    <div class=\"content-inner max-w-xl\">\n                        <h1 class=\"text-[42px] md:text-[75px] mb-8 mt-8 leading-tight\">\n                            IPA Physio Portland                        <\/h1>\n                        <div class=\"text-[18px] md:text-[24px] mb-5 md:max-w-[30rem]\">\n                            <p>Providing the Highest Quality Personalized Physical Therapy<\/p>\n                        <\/div>\n                                                    <a href=\"https:\/\/ipaphysio.arelidev.com\/portland\/#portland-contact\" target=\"\" class=\"button button-white\">\n                                Get Started                            <\/a>\n                                            <\/div>\n                <\/div>\n            <\/div>\n        \n                    <div class=\"w-full absolute h-full top-0 \">\n                <img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"680\" src=\"https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2025\/10\/Portland-Resize-1440x680.jpg\" class=\"object-cover w-full h-full\" alt=\"\" \/>            <\/div>\n        \n    <\/div>\n\n\n<div class=\"wp-block-group sm:px-4 is-layout-constrained wp-container-core-group-is-layout-48c9aa2a wp-block-group sm:px-4-is-layout-constrained\"><!-- Adjust the top value below if your nav\/header height changes -->\n<div  class=\"sticky-cta sticky top-20 bg-[#1D2224] shadow-lg z-50 rounded-md\">\n    <div class=\"max-w-7xl mx-auto flex flex-col md:flex-row items-center px-[50px] py-[30px] gap-4\">\n        <div class=\"w-full md:w-3\/4 flex items-center text-white mb-6 md:mb-0\">\n                            <div class=\"prose max-w-none m-0 !text-white font-sans text-[20px] md:text-[28px] not-italic font-normal leading-[2rem] prose-a:!text-white prose-p:mb-0\">\n                    <p>Meet Face-to-Face: Complimentary 30-Minute Discovery Session to Unlock Your Path to Recovery<\/p>\n                <\/div>\n                    <\/div>\n        <div class=\"w-full md:w-1\/4 flex items-center cta-content justify-center md:justify-end\">\n                            <a \n                    href=\"https:\/\/ipaphysio.arelidev.com\/portland\/#portland-contact\" \n                    class=\"tracking-[0.8px] md:tracking-[0.9px] button !text-white\"\n                                    >\n                    Schedule Now                <\/a>\n                    <\/div>\n    <\/div>\n<\/div>\n\n<\/div>\n\n\n\n<div class=\"wp-block-group sm:px-4 is-layout-constrained wp-container-core-group-is-layout-406cf11c wp-block-group sm:px-4-is-layout-constrained\" style=\"padding-right:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\" style=\"font-size:48px\">Discover Personalized Care That Fits You<\/h1>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center\" style=\"font-size:24px\"><em>A Discovery Session is a free, 30-minute informational visit to see if you would benefit from physical therapy at IPA Physio. The Discovery Session will give us a chance to review your symptoms, perform an abbreviated exam, discuss your goals and determine if we are the best providers to serve your needs. We offer as much information as possible to help you in the moment and provide value for our respective time together.<\/em><\/p>\n\n\n\n<p class=\"has-text-align-center\"><strong>Set up your free 30-minute Discovery Session today.<br><\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<p class=\"ipa-button-block text-center\">\n    <a href=\"https:\/\/ipaphysio.arelidev.com\/portland\/#portland-contact\"\n       target=\"\"\n       class=\"tracking-[0.8px] md:tracking-[0.9px] button\">\n        Contact Us    <\/a>\n<\/p>\n<\/div>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group sm:px-4 is-layout-flow wp-block-group sm:px-4-is-layout-flow\">\n<div class=\"ipa-split-content-block\" >\n    <div class=\"ipa-split-content-block-inner md:flex\">\n                    \n    <div class=\"content-column md:w-1\/2 text-gray-800 bg-gray-100 py-20 px-10 md:py-44 md:px-24 flex flex-col items-center relative\">\n        <div class=\"slide-in-bottom absolute inset-0 bg-cover bg-no-repeat hidden md:flex\" style=\"background-image: url('https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/themes\/ipa-physio\/img\/ipa-bg-icon.png'); background-position: 32% center;\"><\/div>\n        <div class=\"max-w-md relative\">\n            <h3 class=\"text-[40px] md:text-[40px] mb-8\">About IPA Physio Portland<\/h3>\n            <div class=\"mb-8 block\"><p>IPA Physio Portland specializes in managing complex conditions that may have not been solved by other medical interventions. If you feel like you have lost your quality of life, come to IPA Physio to discover how we can help you regain the quality of life you deserve.<\/p>\n<p>Your journey to a new you begins here.<\/p>\n<\/div>\n            <a href=\"\/treatments\/\" target=\"\" \n               class=\"button button-primary\">What We Treat<\/a>\n        <\/div>\n    <\/div>            <div class=\"media-column md:w-1\/2 relative overflow-hidden\"><img loading=\"lazy\" decoding=\"async\" width=\"1686\" height=\"1365\" src=\"https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF9528-1-e1772580980266.jpg\" class=\"object-cover h-60 md:h-full w-full md:absolute\" alt=\"\" srcset=\"https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF9528-1-e1772580980266.jpg 1686w, https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF9528-1-e1772580980266-300x243.jpg 300w, https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF9528-1-e1772580980266-1024x829.jpg 1024w, https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF9528-1-e1772580980266-768x622.jpg 768w, https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF9528-1-e1772580980266-1536x1244.jpg 1536w\" sizes=\"auto, (max-width: 1686px) 100vw, 1686px\" \/><\/div>            <\/div>\n<\/div>\n\n\n<div class=\"ipa-split-content-block\" >\n    <div class=\"ipa-split-content-block-inner md:flex\">\n                    <div class=\"media-column md:w-1\/2 relative overflow-hidden\"><img loading=\"lazy\" decoding=\"async\" width=\"1857\" height=\"1018\" src=\"https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF0124-1-e1775415727315.jpg\" class=\"object-cover h-60 md:h-full w-full md:absolute\" alt=\"\" srcset=\"https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF0124-1-e1775415727315.jpg 1857w, https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF0124-1-e1775415727315-300x164.jpg 300w, https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF0124-1-e1775415727315-1024x561.jpg 1024w, https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF0124-1-e1775415727315-768x421.jpg 768w, https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/uploads\/sites\/8\/2026\/03\/DSCF0124-1-e1775415727315-1536x842.jpg 1536w\" sizes=\"auto, (max-width: 1857px) 100vw, 1857px\" \/><\/div>            \n    <div class=\"content-column md:w-1\/2 text-white bg-primary py-20 px-10 md:py-44 md:px-24 flex flex-col items-center relative\">\n        <div class=\"slide-in-bottom absolute inset-0 bg-cover bg-no-repeat hidden md:flex\" style=\"background-image: url('https:\/\/ipaphysio.arelidev.com\/portland\/wp-content\/themes\/ipa-physio\/img\/ipa-bg-icon.png'); background-position: 32% center;\"><\/div>\n        <div class=\"max-w-md relative\">\n            <h3 class=\"text-[40px] md:text-[40px] mb-8\">About Our Team<\/h3>\n            <div class=\"mb-8 block\"><p>Our knowledgeable team of experts are trained to not only help you resolve any pain or discomfort, but more importantly, identify the true cause of the issue. We can help you restore the movement you have lost and regain the quality of life you deserve.<\/p>\n<p>For our Portland staff, your well-being and positive experience are our top priorities. <\/p>\n<\/div>\n            <a href=\"\/portland\/meet-the-team\/\" target=\"\" \n               class=\"button button-white\">Meet the Team<\/a>\n        <\/div>\n    <\/div>            <\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group sm:px-4 is-layout-constrained wp-block-group sm:px-4-is-layout-constrained\">\n<div style=\"height:38px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group sm:px-4 sm:px-4 slide-in-top is-layout-constrained wp-block-group sm:px-4 sm:px-4-is-layout-constrained\">\n<h3 class=\"wp-block-heading has-text-align-center\" style=\"font-size:40px\">Life-Changing Stories<\/h3>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center has-regular-font-size\">Helping people is our passion and motivation to go to work each day. Hear from a number of our patients why IPA Physio is the best choice to help you eliminate pain, improve your body\u2019s function, and achieve your goals.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n\n\n<p><\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<p class=\"ipa-button-block text-center\">\n    <a href=\"\/stories\/\"\n       target=\"\"\n       class=\"tracking-[0.8px] md:tracking-[0.9px] button\">\n        Read More Life-Changing Stories    <\/a>\n<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\" id=\"portland-contact\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n\n<div id=\"fmt-blocks-block_8bd9698c03d06eebb00e91e6f070e9cc\" class=\"location-selector-block w-full flex flex-col md:flex-row min-h-[500px] md:min-h-[400px]\">\n            <!-- Form Column First (Left), Map Column Second (Right) -->\n        \n<div class=\"hidden md:flex md:w-1\/2 w-full bg-[#2B2F36] md:pl-[11rem] md:pr-[4rem] px-6 py-8 md:py-12 items-center justify-center\">\n    <div class=\"w-full flex flex-col items-start\">\n        <h3 class=\"text-2xl md:text-3xl text-white mb-2 font-sans\" style=\"font-family: Inter, sans-serif;\">Contact<\/h3>\n        <div class=\"text-gray-200 mb-4 md:mb-6\">\n                <div class=\"my-2\">HOURS<\/div><div class=\"text-sm md:text-base\">Monday: 7 \u2013 6<\/div><div class=\"text-sm md:text-base\">Tuesday: 7 \u2013 6<\/div><div class=\"text-sm md:text-base\">Wednesday: 7 \u2013 4<\/div><div class=\"text-sm md:text-base\">Thursday: 7 \u2013 6<\/div><div class=\"text-sm md:text-base\">Friday: 7 \u2013 4<\/div><div class=\"text-sm md:text-base\">Saturday &amp; Sunday: Closed<\/div><\/div>\n        <div class=\"w-full flex justify-start max-w-sm\">\n            <script charset=\"utf-8\" type=\"text\/javascript\" src=\"\/\/js-na2.hsforms.net\/forms\/embed\/v2.js\"><\/script>\r\n<script>\r\n  hbspt.forms.create({\r\n    portalId: \"47487699\",\r\n    formId: \"dc4d79d2-93c9-453b-a354-b6446eeda1b0\",\r\n    region: \"na2\"\r\n  });\r\n<\/script>\r\n\n        <\/div>\n    <\/div>\n<\/div>        \n<div class=\"w-full md:w-1\/2 h-[500px] md:h-auto flex flex-col items-center justify-center relative overflow-hidden\">\n    <!-- Google Maps View - Full Column -->\n    <div id=\"map-container\" class=\"absolute inset-0 w-full h-full\">\n        <div id=\"map\" class=\"w-full h-full\"><\/div>\n        \n        <!-- ZIP Code Lookup Overlay (hidden by default) -->\n        <div id=\"zip-lookup-overlay\" class=\"absolute inset-0 bg-white bg-opacity-90 items-center justify-center z-10 p-4 hidden\">\n            <div class=\"bg-white p-6 md:p-8 rounded-lg shadow-lg text-center max-w-sm w-full\">\n                <h2 class=\"text-xl md:text-2xl font-semibold mb-2 text-gray-900 leading-tight\">FIND THE IPA PHYSIO LOCATION NEAR YOU.<\/h2>\n                <h3 class=\"text-base md:text-lg mb-4 md:mb-6 text-gray-700\">ENTER YOUR ZIP CODE<\/h3>\n                <input \n                    type=\"text\" \n                    id=\"zip-code-input\" \n                    placeholder=\"Postal Code\"\n                    class=\"w-full px-4 py-3 border border-gray-300 rounded-lg mb-4 text-center text-base md:text-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n                >\n                <button \n                    id=\"update-location-btn\"\n                    class=\"w-full bg-[#3B5795] text-white py-3 px-6 rounded-lg font-semibold hover:bg-[#2A4278] transition-colors text-base md:text-lg\"\n                >\n                    UPDATE\n                <\/button>\n            <\/div>\n        <\/div>\n        \n        <!-- Mobile Location Cards Slider (hidden initially) -->\n        <div id=\"mobile-location-slider\" class=\"absolute inset-0 bg-white z-10 hidden md:hidden\">\n            <div class=\"flex flex-col h-full\">\n                <div class=\"flex items-center justify-between p-4 border-b border-gray-200\">\n                    <h3 class=\"text-lg font-semibold text-gray-900\">Nearby Locations<\/h3>\n                    <button id=\"close-mobile-slider\" class=\"text-[#3B5795] font-medium\">\n                        \u2715\n                    <\/button>\n                <\/div>\n                <div class=\"flex-1 overflow-hidden\">\n                    <div id=\"location-cards-container\" class=\"flex h-full overflow-x-auto snap-x snap-mandatory\">\n                        <!-- Location cards will be dynamically inserted here -->\n                    <\/div>\n                <\/div>\n                <div class=\"p-4 text-center\">\n                    <button \n                        id=\"mobile-search-again-btn\"\n                        class=\"bg-[#3B5795] text-white px-6 py-2 rounded-lg font-medium hover:bg-[#2A4278] transition-colors\"\n                    >\n                        Search Again\n                    <\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n        <!-- Find Nearest Location Button (visible by default) -->\n        <button \n            id=\"search-again-btn\"\n            class=\"absolute bottom-4 right-4 md:bottom-6 md:right-6 bg-[#3B5795] text-white px-3 py-2 md:px-4 md:py-2 rounded-lg shadow-lg font-medium hover:bg-[#2A4278] transition-colors z-10 text-sm md:text-base\"\n        >\n            Find Nearest Location\n        <\/button>\n    <\/div>\n<\/div>        <\/div>\n<\/div>\n\n<!-- Google Maps JavaScript -->\n<script>\nlet map;\nlet geocoder;\nlet infoWindow;\nlet markers = [];\n\n\/\/ Location data\nconst locations = [{\"name\":\"IPA Physio Orange County\",\"url\":\"https:\\\/\\\/ipaphysio.arelidev.com\\\/orange-county\\\/\",\"address\":\"\",\"phone\":\"\",\"site_logo\":\"\",\"source\":\"subsite\"},{\"name\":\"IPA Physio Steamboat Springs\",\"url\":\"https:\\\/\\\/ipaphysio.arelidev.com\\\/steamboat\\\/\",\"address\":\"\",\"phone\":\"\",\"site_logo\":\"\",\"source\":\"subsite\"},{\"name\":\"IPA Physio Dallas\",\"url\":\"https:\\\/\\\/ipaphysio.arelidev.com\\\/dallas\\\/\",\"address\":\"\",\"phone\":\"\",\"site_logo\":\"\",\"source\":\"subsite\"},{\"name\":\"IPA Physio NYC\",\"url\":\"https:\\\/\\\/ipaphysio.arelidev.com\\\/nyc\\\/\",\"address\":\"\",\"phone\":\"\",\"site_logo\":\"\",\"source\":\"subsite\"},{\"name\":\"IPA Physio Portland\",\"url\":\"https:\\\/\\\/ipaphysio.arelidev.com\\\/portland\\\/\",\"address\":\"\",\"phone\":\"\",\"site_logo\":\"\",\"source\":\"subsite\"},{\"name\":\"IPA Physio Long Beach\",\"url\":\"https:\\\/\\\/ipaphysio.arelidev.com\\\/lbc\\\/\",\"address\":\"\",\"phone\":\"\",\"site_logo\":\"\",\"source\":\"subsite\"},{\"name\":\"Portland, OR\",\"url\":\"\\\/portland\",\"address\":\"7412 SW Beaverton Hillsdale Highway Suite 110 Portland, OR 97225\",\"phone\":\"(503) 616-0313\",\"hours\":\"Monday: 7 \\u2013 6\\r\\n\\r\\nTuesday: 7 \\u2013 6\\r\\n\\r\\nWednesday: 7 \\u2013 4\\r\\n\\r\\nThursday: 7 \\u2013 6\\r\\n\\r\\nFriday: 7 \\u2013 4\\r\\n\\r\\nSaturday & Sunday: Closed\",\"description\":\"\",\"latitude\":\"45.48812881436382\",\"longitude\":\"-122.75381432272724\",\"site_logo\":\"https:\\\/\\\/ipaphysio.arelidev.com\\\/portland\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/11\\\/IPAPhysio_Nashville_Logos_IPA-Physio-Main-Logo-1.svg\",\"source\":\"theme_options\"}];\n\n\/\/ Debug: Log locations data to see if logos are included\nconsole.log('Locations data:', locations);\n\n\/\/ Mobile detection\nfunction isMobileDevice() {\n    return window.innerWidth <= 768;\n}\n\nfunction initMap() {\n    \/\/ Initialize map centered on US with grey\/white styling\n    map = new google.maps.Map(document.getElementById(\"map\"), {\n        zoom: 4,\n        center: { lat: 39.8283, lng: -98.5795 }, \/\/ Center of US\n        styles: [\n            {\n                \"featureType\": \"all\",\n                \"elementType\": \"geometry\",\n                \"stylers\": [{\"color\": \"#f5f5f5\"}]\n            },\n            {\n                \"featureType\": \"all\",\n                \"elementType\": \"labels.icon\",\n                \"stylers\": [{\"visibility\": \"off\"}]\n            },\n            {\n                \"featureType\": \"all\",\n                \"elementType\": \"labels.text.fill\",\n                \"stylers\": [{\"color\": \"#616161\"}]\n            },\n            {\n                \"featureType\": \"all\",\n                \"elementType\": \"labels.text.stroke\",\n                \"stylers\": [{\"color\": \"#f5f5f5\"}]\n            },\n            {\n                \"featureType\": \"administrative.land_parcel\",\n                \"elementType\": \"labels.text.fill\",\n                \"stylers\": [{\"color\": \"#bdbdbd\"}]\n            },\n            {\n                \"featureType\": \"poi\",\n                \"elementType\": \"geometry\",\n                \"stylers\": [{\"color\": \"#eeeeee\"}]\n            },\n            {\n                \"featureType\": \"poi\",\n                \"elementType\": \"labels.text.fill\",\n                \"stylers\": [{\"color\": \"#757575\"}]\n            },\n            {\n                \"featureType\": \"poi.park\",\n                \"elementType\": \"geometry\",\n                \"stylers\": [{\"color\": \"#e5e5e5\"}]\n            },\n            {\n                \"featureType\": \"poi.park\",\n                \"elementType\": \"labels.text.fill\",\n                \"stylers\": [{\"color\": \"#9e9e9e\"}]\n            },\n            {\n                \"featureType\": \"road\",\n                \"elementType\": \"geometry\",\n                \"stylers\": [{\"color\": \"#ffffff\"}]\n            },\n            {\n                \"featureType\": \"road.arterial\",\n                \"elementType\": \"labels.text.fill\",\n                \"stylers\": [{\"color\": \"#757575\"}]\n            },\n            {\n                \"featureType\": \"road.highway\",\n                \"elementType\": \"geometry\",\n                \"stylers\": [{\"color\": \"#dadada\"}]\n            },\n            {\n                \"featureType\": \"road.highway\",\n                \"elementType\": \"labels.text.fill\",\n                \"stylers\": [{\"color\": \"#616161\"}]\n            },\n            {\n                \"featureType\": \"road.local\",\n                \"elementType\": \"labels.text.fill\",\n                \"stylers\": [{\"color\": \"#9e9e9e\"}]\n            },\n            {\n                \"featureType\": \"transit.line\",\n                \"elementType\": \"geometry\",\n                \"stylers\": [{\"color\": \"#e5e5e5\"}]\n            },\n            {\n                \"featureType\": \"transit.station\",\n                \"elementType\": \"geometry\",\n                \"stylers\": [{\"color\": \"#eeeeee\"}]\n            },\n            {\n                \"featureType\": \"water\",\n                \"elementType\": \"geometry\",\n                \"stylers\": [{\"color\": \"#c9c9c9\"}]\n            },\n            {\n                \"featureType\": \"water\",\n                \"elementType\": \"labels.text.fill\",\n                \"stylers\": [{\"color\": \"#9e9e9e\"}]\n            }\n        ]\n    });\n    \n    geocoder = new google.maps.Geocoder();\n    infoWindow = new google.maps.InfoWindow();\n    \n    \/\/ Add markers for all locations (you'll need to geocode these or store coordinates)\n    addLocationMarkers();\n    \n    \/\/ Handle ZIP code lookup\n    document.getElementById('update-location-btn').addEventListener('click', handleZipCodeLookup);\n    document.getElementById('zip-code-input').addEventListener('keypress', function(e) {\n        if (e.key === 'Enter') {\n            handleZipCodeLookup();\n        }\n    });\n    \n    \/\/ Handle search again button\n    document.getElementById('search-again-btn').addEventListener('click', showSearchOverlay);\n    \n    \/\/ Handle mobile slider controls\n    document.getElementById('close-mobile-slider').addEventListener('click', showSearchOverlay);\n    document.getElementById('mobile-search-again-btn').addEventListener('click', showSearchOverlay);\n}\n\nfunction addLocationMarkers() {\n    locations.forEach((location, index) => {\n        \/\/ Use manual coordinates if available, otherwise geocode address\n        if (location.latitude && location.longitude) {\n            \/\/ Use manual coordinates\n            const position = new google.maps.LatLng(parseFloat(location.latitude), parseFloat(location.longitude));\n            createMarker(location, position);\n        } else if (location.address && location.address.trim()) {\n            \/\/ Geocode the address\n            geocoder.geocode({ address: location.address }, (results, status) => {\n                if (status === 'OK') {\n                    const position = results[0].geometry.location;\n                    createMarker(location, position);\n                }\n            });\n        }\n    });\n}\n\nfunction createMarker(location, position) {\n    const marker = new google.maps.Marker({\n        position: position,\n        map: map,\n        title: location.name,\n        icon: {\n            url: 'data:image\/svg+xml;charset=UTF-8,' + encodeURIComponent(`\n                <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                    <circle cx=\"20\" cy=\"20\" r=\"16\" fill=\"#3B5795\" stroke=\"white\" stroke-width=\"3\"\/>\n                    <circle cx=\"20\" cy=\"20\" r=\"6\" fill=\"white\"\/>\n                <\/svg>\n            `),\n            scaledSize: new google.maps.Size(40, 40),\n            anchor: new google.maps.Point(20, 20)\n        }\n    });\n    \n    \/\/ Create clean info window content with Tailwind CSS\n    let infoContent = `\n        <div class=\"w-72 font-sans p-5 bg-white rounded-lg shadow-md\">\n            <h3 class=\"m-0 mb-3 text-lg font-semibold text-gray-900\">${location.name}<\/h3>\n    `;\n    \n    if (location.address) {\n        \/\/ Create Google Maps link\n        const mapsUrl = `https:\/\/www.google.com\/maps\/search\/?api=1&query=${encodeURIComponent(location.address)}`;\n        infoContent += `<div class=\"mb-2\"><a href=\"${mapsUrl}\" target=\"_blank\" class=\"text-gray-900 underline text-xs leading-relaxed\">${location.address}<\/a><\/div>`;\n    }\n    \n    if (location.phone) {\n        infoContent += `<div class=\"mb-3\"><a href=\"tel:${location.phone}\" class=\"text-gray-900 underline text-xs\">${location.phone}<\/a><\/div>`;\n    }\n    \n    if (location.hours) {\n        \/\/ Parse hours into two columns like the design\n        const hoursLines = location.hours.split('\\n').filter(line => line.trim());\n        let leftColumn = [];\n        let rightColumn = [];\n        \n        hoursLines.forEach(line => {\n            const day = line.toLowerCase();\n            if (day.includes('monday') || day.includes('tuesday') || day.includes('wednesday') || day.includes('thursday')) {\n                leftColumn.push(line);\n            } else {\n                rightColumn.push(line);\n            }\n        });\n        \n        infoContent += `\n            <div>\n                <h4 class=\"m-0 mb-2 text-sm font-semibold text-gray-900\">Hours of Operation<\/h4>\n                <div class=\"flex gap-5\">\n                    <div class=\"flex-1 leading-tight text-gray-600\" style=\"font-size: 8px;\">\n                        ${leftColumn.join('<br>')}\n                    <\/div>\n                    <div class=\"flex-1 leading-tight text-gray-600\" style=\"font-size: 8px;\">\n                        ${rightColumn.join('<br>')}\n                    <\/div>\n                <\/div>\n            <\/div>\n        `;\n    }\n    \n    infoContent += `<\/div>`;\n    \n    marker.addListener('click', () => {\n        infoWindow.setContent(infoContent);\n        infoWindow.open(map, marker);\n    });\n    \n    markers.push(marker);\n    \n    \/\/ Auto-fit map bounds to include all markers\n    updateMapBounds();\n}\n\nfunction updateMapBounds() {\n    if (markers.length > 0) {\n        const bounds = new google.maps.LatLngBounds();\n        markers.forEach(marker => bounds.extend(marker.getPosition()));\n        map.fitBounds(bounds);\n        \n        \/\/ Ensure minimum zoom level for single markers\n        if (markers.length === 1) {\n            google.maps.event.addListenerOnce(map, 'bounds_changed', function() {\n                if (map.getZoom() > 15) {\n                    map.setZoom(15);\n                }\n            });\n        }\n    }\n}\n\nfunction handleZipCodeLookup() {\n    const zipCode = document.getElementById('zip-code-input').value.trim();\n    \n    if (!zipCode) {\n        alert('Please enter a ZIP code');\n        return;\n    }\n    \n    geocoder.geocode({ address: zipCode }, (results, status) => {\n        if (status === 'OK') {\n            const userLocation = results[0].geometry.location;\n            \n            \/\/ Hide the overlay\n            const overlay = document.getElementById('zip-lookup-overlay');\n            overlay.classList.add('hidden');\n            overlay.classList.remove('flex');\n            \n            if (isMobileDevice()) {\n                \/\/ Show mobile location cards slider\n                showMobileLocationCards(userLocation);\n            } else {\n                \/\/ Show desktop map with pins and find closest\n                findClosestLocation(userLocation);\n            }\n            \n        } else {\n            alert('Unable to find location for ZIP code: ' + zipCode);\n        }\n    });\n}\n\nfunction showMobileLocationCards(userLocation) {\n    \/\/ Calculate distances and sort locations\n    const locationsWithDistance = [];\n    let processedCount = 0;\n    \n    locations.forEach((location, index) => {\n        if (location.latitude && location.longitude) {\n            \/\/ Use manual coordinates\n            const locationPos = new google.maps.LatLng(parseFloat(location.latitude), parseFloat(location.longitude));\n            const distance = google.maps.geometry.spherical.computeDistanceBetween(userLocation, locationPos);\n            locationsWithDistance.push({ ...location, distance, index });\n            processedCount++;\n            \n            if (processedCount === locations.length) {\n                displayMobileCards(locationsWithDistance);\n            }\n        } else if (location.address && location.address.trim()) {\n            \/\/ Geocode the address\n            geocoder.geocode({ address: location.address }, (results, status) => {\n                if (status === 'OK') {\n                    const locationPos = results[0].geometry.location;\n                    const distance = google.maps.geometry.spherical.computeDistanceBetween(userLocation, locationPos);\n                    locationsWithDistance.push({ ...location, distance, index });\n                }\n                processedCount++;\n                \n                if (processedCount === locations.length) {\n                    displayMobileCards(locationsWithDistance);\n                }\n            });\n        } else {\n            processedCount++;\n            if (processedCount === locations.length) {\n                displayMobileCards(locationsWithDistance);\n            }\n        }\n    });\n}\n\nfunction displayMobileCards(locationsWithDistance) {\n    \/\/ Sort by distance\n    locationsWithDistance.sort((a, b) => a.distance - b.distance);\n    \n    \/\/ Generate cards HTML\n    const cardsContainer = document.getElementById('location-cards-container');\n    cardsContainer.innerHTML = '';\n    \n    locationsWithDistance.forEach((location, index) => {\n        const cardHtml = createLocationCard(location, index, locationsWithDistance.length);\n        cardsContainer.appendChild(cardHtml);\n    });\n    \n    \/\/ Show the mobile slider\n    document.getElementById('mobile-location-slider').classList.remove('hidden');\n    \n    \/\/ Set up pagination dots functionality\n    setupPaginationDots(locationsWithDistance.length);\n}\n\nfunction createLocationCard(location, index, totalCards) {\n    const card = document.createElement('div');\n    card.className = 'flex-shrink-0 w-full snap-center p-4';\n    card.setAttribute('data-card-index', index);\n    \n    \/\/ Parse hours into two columns\n    const hoursLines = location.hours ? location.hours.split('\\n').filter(line => line.trim()) : [];\n    let leftColumn = [];\n    let rightColumn = [];\n    \n    hoursLines.forEach(line => {\n        const day = line.toLowerCase();\n        if (day.includes('monday') || day.includes('tuesday') || day.includes('wednesday') || day.includes('thursday')) {\n            leftColumn.push(line);\n        } else {\n            rightColumn.push(line);\n        }\n    });\n    \n    \/\/ Create maps URL\n    const mapsUrl = location.address ? `https:\/\/www.google.com\/maps\/search\/?api=1&query=${encodeURIComponent(location.address)}` : '#';\n    \n    \/\/ Create pagination dots\n    let paginationDots = '';\n    for (let i = 0; i < totalCards; i++) {\n        const opacity = i === index ? 'opacity-100' : 'opacity-40';\n        paginationDots += `<div class=\"w-2 h-2 bg-white rounded-full ${opacity} transition-opacity duration-300\"><\/div>`;\n    }\n    \n    card.innerHTML = `\n        <div class=\"bg-white rounded-lg shadow-lg overflow-hidden h-full flex flex-col\">\n            <!-- Header with Location Name and Logo -->\n            <div class=\"bg-gradient-to-br from-[#3B5795] to-[#5A72B5] h-24 relative overflow-hidden\">\n                <div class=\"absolute inset-0 flex flex-col items-center justify-center px-4 pt-2 pb-8\">\n                    <!-- Logo centered at top -->\n                    ${location.site_logo ? \n                        `<div class=\"mb-2\">\n                            <img decoding=\"async\" src=\"${location.site_logo}\" alt=\"${location.name} logo\" class=\"object-contain\" style=\"width: 132.275px; height: 50px;\">\n                        <\/div>` : \n                        `<div class=\"mb-2\">\n                            <svg width=\"40\" height=\"40\" viewBox=\"0 0 32 32\" class=\"text-white\">\n                                <path fill=\"currentColor\" d=\"M16 2L8 8v12l8 6 8-6V8l-8-6zm0 2.5L22.5 9v10L16 24.5 9.5 19V9L16 4.5z\"\/>\n                                <path fill=\"currentColor\" d=\"M12 12h8v2h-8v-2zm0 3h8v2h-8v-2z\"\/>\n                            <\/svg>\n                        <\/div>`\n                    }\n                    <!-- Location name centered below logo -->\n                    <div class=\"text-white text-center\">\n                        <div class=\"text-lg font-bold leading-tight\">${location.name}<\/div>\n                    <\/div>\n                <\/div>\n                <!-- Pagination dots -->\n                <div class=\"absolute bottom-2 left-1\/2 transform -translate-x-1\/2 flex space-x-2 pagination-dots\">\n                    ${paginationDots}\n                <\/div>\n            <\/div>\n            \n            <!-- Content -->\n            <div class=\"flex-1 p-5\">\n                <!-- Location Name with IPA Physio prefix -->\n                <div class=\"mb-3\">\n                    <h3 class=\"text-gray-900\" style=\"font-family: var(--font-mirage, mirage, serif); font-size: 18px;\">\n                        IPA Physio ${location.name}\n                    <\/h3>\n                <\/div>\n                \n                ${location.address ? `<div class=\"mb-2\">\n                    <a href=\"${mapsUrl}\" target=\"_blank\" class=\"text-gray-900 underline text-sm leading-relaxed block\">\n                        ${location.address}\n                    <\/a>\n                <\/div>` : ''}\n                \n                ${location.phone ? `<div class=\"mb-4\">\n                    <a href=\"tel:${location.phone}\" class=\"text-gray-900 underline text-sm\">\n                        ${location.phone}\n                    <\/a>\n                <\/div>` : ''}\n                \n                ${location.hours ? `<div>\n                    <h4 class=\"text-sm font-semibold text-gray-900 mb-2\">Hours of Operation<\/h4>\n                    <div class=\"flex gap-4\">\n                        <div class=\"flex-1 leading-tight text-gray-600\" style=\"font-size: 10px;\">\n                            ${leftColumn.join('<br>')}\n                        <\/div>\n                        <div class=\"flex-1 leading-tight text-gray-600\" style=\"font-size: 10px;\">\n                            ${rightColumn.join('<br>')}\n                        <\/div>\n                    <\/div>\n                <\/div>` : ''}\n            <\/div>\n        <\/div>\n    `;\n    \n    return card;\n}\n\nfunction setupPaginationDots(totalCards) {\n    const container = document.getElementById('location-cards-container');\n    \n    \/\/ Update pagination dots on scroll\n    container.addEventListener('scroll', () => {\n        const scrollLeft = container.scrollLeft;\n        const cardWidth = container.offsetWidth;\n        const currentIndex = Math.round(scrollLeft \/ cardWidth);\n        \n        \/\/ Update all pagination dots\n        const allCards = container.querySelectorAll('[data-card-index]');\n        allCards.forEach((card, index) => {\n            const dots = card.querySelectorAll('.pagination-dots div');\n            dots.forEach((dot, dotIndex) => {\n                if (dotIndex === currentIndex) {\n                    dot.classList.remove('opacity-40');\n                    dot.classList.add('opacity-100');\n                } else {\n                    dot.classList.remove('opacity-100');\n                    dot.classList.add('opacity-40');\n                }\n            });\n        });\n    });\n}\n\nfunction showSearchOverlay() {\n    \/\/ Hide all result views and show overlay\n    document.getElementById('mobile-location-slider').classList.add('hidden');\n    const overlay = document.getElementById('zip-lookup-overlay');\n    overlay.classList.remove('hidden');\n    overlay.classList.add('flex');\n    \n    \/\/ Clear the input and focus\n    document.getElementById('zip-code-input').value = '';\n    document.getElementById('zip-code-input').focus();\n}\n\nfunction findClosestLocation(userLocation) {\n    let closestMarker = null;\n    let closestDistance = Infinity;\n    \n    markers.forEach(marker => {\n        const distance = google.maps.geometry.spherical.computeDistanceBetween(\n            userLocation,\n            marker.getPosition()\n        );\n        \n        if (distance < closestDistance) {\n            closestDistance = distance;\n            closestMarker = marker;\n        }\n    });\n    \n    if (closestMarker) {\n        \/\/ Center the map on the closest location\n        map.setCenter(closestMarker.getPosition());\n        map.setZoom(12);\n        \n        \/\/ Animate the closest marker\n        closestMarker.setAnimation(google.maps.Animation.BOUNCE);\n        setTimeout(() => {\n            closestMarker.setAnimation(null);\n        }, 2000);\n    }\n}\n\n\/\/ Initialize map when Google Maps API is loaded\n\/\/ The API is enqueued by functions.php\nfunction waitForGoogleMaps() {\n    if (typeof google !== 'undefined' && \n        typeof google.maps !== 'undefined' && \n        typeof google.maps.Map !== 'undefined') {\n        initMap();\n    } else {\n        setTimeout(waitForGoogleMaps, 100);\n    }\n}\nwaitForGoogleMaps();\n<\/script>\n\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Discover Personalized Care That Fits You A Discovery Session is a free, 30-minute informational visit to see if you would benefit from physical therapy at IPA Physio. The Discovery Session will give us a chance to review your symptoms, perform an abbreviated exam, discuss your goals and determine if we are the best providers to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-25","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/ipaphysio.arelidev.com\/portland\/wp-json\/wp\/v2\/pages\/25","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ipaphysio.arelidev.com\/portland\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ipaphysio.arelidev.com\/portland\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ipaphysio.arelidev.com\/portland\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ipaphysio.arelidev.com\/portland\/wp-json\/wp\/v2\/comments?post=25"}],"version-history":[{"count":23,"href":"https:\/\/ipaphysio.arelidev.com\/portland\/wp-json\/wp\/v2\/pages\/25\/revisions"}],"predecessor-version":[{"id":647,"href":"https:\/\/ipaphysio.arelidev.com\/portland\/wp-json\/wp\/v2\/pages\/25\/revisions\/647"}],"wp:attachment":[{"href":"https:\/\/ipaphysio.arelidev.com\/portland\/wp-json\/wp\/v2\/media?parent=25"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}