{"id":7,"date":"2025-12-14T21:22:43","date_gmt":"2025-12-14T21:22:43","guid":{"rendered":"https:\/\/www.aireserv.ca\/locations\/?page_id=7"},"modified":"2026-02-15T18:47:00","modified_gmt":"2026-02-15T18:47:00","slug":"locations","status":"publish","type":"page","link":"https:\/\/www.aireserv.ca\/locations\/","title":{"rendered":"Locations"},"content":{"rendered":"\n<section class=\"wp-block-nbly-headline\"><div class=\"nbly-block-container\"><h1>Locations<\/h1><\/div><\/section>\n\n\n<section class=\"wp-block-nbly-locations-original\">\n\t\t\t<div class=\"nbly-block-container\">\n\t\t\t\t<div class=\"wp-block-nbly-locations-original-list\">\n                    <form class=\"form-container\">\n                        <div class=\"location-search-wrapper\">  \n                            <label for=\"location-search\" class=\"sr-only\">Search for your local Aire Serv<\/label>  \n                            <input class=\"modal-search-input\" type=\"search\" id=\"location-search\" placeholder=\"City, State or ZIP Code\" required>\n                            <button class=\"primary-btn nbly-use-my-location\">\n                                <svg>\n                                    <use xlink:href=\"\/locations\/wp-content\/themes\/nbly\/assets\/images\/hero-icon-sprite.svg#map-pin-white\"><\/use>\n                                <\/svg>\n                                Use My Location\n                            <\/button>\n                        <\/div>\n                        <button type=\"submit\" class=\"nbly-do-find-location primary-btn\">Find My Nearest Aire Serv<\/button>\n                    <\/form>\n                    <p class=\"location-text\">\n                        \n                    <\/p>\n                    <div class=\"location-total-text\">\n                        <svg>\n                            <use xlink:href=\"\/locations\/wp-content\/themes\/nbly\/assets\/images\/hero-icon-sprite.svg#map-pin-gray-900\"><\/use>\n                        <\/svg>\n                        <span>2 locations found<\/span>\n                    <\/div>\n                    <ul class=\"view-tabs\">\n                        <li class=\"view-tablist\">\n                            <input type=\"radio\" class=\"view-radio hidden\" id=\"map-view\" data-nbly=\"map-view\" name=\"view-type\" value=\"map-view\"\">\n                            <label for=\"map-view\" class=\"view-btn\">Map View<\/label>\n                        <\/li>\n                        <li class=\"view-tablist\">\n                            <input type=\"radio\" class=\"view-radio hidden\" id=\"list-view\" data-nbly=\"list-view\" name=\"view-type\" value=\"list-view\" checked=\"\">\n                            <label for=\"list-view\" class=\"view-btn selected\">List View<\/label>\n                        <\/li>\n                    <\/ul>\n                    <ul class=\"location-list\">\n                        <li class=\"location-item\">\n                <a class=\"location-title\" href=\"https:\/\/www.aireserv.ca\/greater-victoria\/\">Aire Serv of Greater Victoria<\/a>\n                <p>Victoria, BC, V9B 6E2<\/p>\n                <a class=\"location-phone\" href=\"tel:2509848017\">Contact Us: (250) 984-8017<\/a>\n                <a class=\"primary-btn\" href=\"\/schedule-service\/\">Schedule Service<\/a>\n            <\/li><li class=\"location-item\">\n                <a class=\"location-title\" href=\"https:\/\/www.aireserv.ca\/thunder-bay\/\">Aire Serv of Thunder Bay<\/a>\n                <p>Thunder Bay, ON, P7C 3R1<\/p>\n                <a class=\"location-phone\" href=\"tel:8077017105\">Contact Us: (807) 701-7105<\/a>\n                <a class=\"primary-btn\" href=\"\/schedule-service\/\">Schedule Service<\/a>\n            <\/li>\n                    <\/ul>\n                <\/div>\n                <div class=\"wp-block-nbly-locations-original-map\">\n                    <div id=\"map\" role=\"presentation\"><\/div>\n                    <script>\n                        (g=>{var h,a,k,p=\"The Google Maps JavaScript API\",c=\"google\",l=\"importLibrary\",q=\"__ib__\",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement(\"script\"));e.set(\"libraries\",[...r]+\"\");for(k in g)e.set(k.replace(\/[A-Z]\/g,t=>\"_\"+t[0].toLowerCase()),g[k]);e.set(\"callback\",c+\".maps.\"+q);a.src=`https:\/\/maps.${c}apis.com\/maps\/api\/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+\" could not load.\"));a.nonce=m.querySelector(\"script[nonce]\")?.nonce||\"\";m.head.append(a)}));d[l]?console.warn(p+\" only loads once. Ignoring:\",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({\n                            key: \"AIzaSyB5EWlTnMdPZcDx7yk_VevuESgWVCwNEZ4\",\n                            v: \"weekly\",\n                        });\n                    <\/script>\n                    <script src=\"https:\/\/unpkg.com\/@googlemaps\/markerclusterer\/dist\/index.min.js\"><\/script>\n                    <script>\n                        var map;\n                        async function initMap() {\n                            const { Map, InfoWindow } = await google.maps.importLibrary(\"maps\");\n                            const { AdvancedMarkerElement, PinElement } = await google.maps.importLibrary(\"marker\",);\n                            map = new google.maps.Map(document.getElementById(\"map\"), {\n                                zoom: 3,\n                                center: { lat: -28.024, lng: 140.887 },\n                                streetViewControl: false,\n                                fullscreenControl: false,\n                                mapTypeControl: false,\n                                mapId: \"fe7cac85af94d16c\",\n                            });\n                            \n                            map.addListener(\"idle\", () => {\n                                jQuery(\".location-list\").show();\n                                var bounds = map.getBounds();\n                                let markerList = [];\n                                for (var i = 0; i < markers.length; i++) {\n                                    if (bounds.contains(markers[i].position) === true) {\n                                        locations.map((location, j) => {\n                                            if (markers[i].zIndex == location.id) {\n                                                markerList.push({title:markers[i].title, url:location.url, address:location.address, phone:location.phone, lat:location.lat, lng:location.lng});\n                                            }\n                                        });\n                                    }\n                                }\n                                \n                                \/\/ Sort by distance if a search position exists\n                                if (typeof searchPosition !== \"undefined\" && searchPosition !== null) {\n                                    markerList.sort((a, b) => {\n                                        var distA = nblyCalculateDistance(searchPosition.lat(), searchPosition.lng(), a.lat, a.lng);\n                                        var distB = nblyCalculateDistance(searchPosition.lat(), searchPosition.lng(), b.lat, b.lng);\n                                        return distA - distB;\n                                    });\n                                }\n                                \n                                nblyBuildList(markerList);\n                            });\n\n                            const infoWindow = new google.maps.InfoWindow({\n                                content: \"\",\n                                disableAutoPan: true,\n                            });\n                            \n                            const locations = [{ id: 8733, title: \"Aire Serv of Greater Victoria\", address: \"Victoria, BC, V9B 6E2\",phone: \"2509848017\",url: \"https:\/\/www.aireserv.ca\/greater-victoria\/\",lat: 48.480, lng: -123.511 },{ id: 18585, title: \"Aire Serv of Thunder Bay\", address: \"Thunder Bay, ON, P7C 3R1\",phone: \"8077017105\",url: \"https:\/\/www.aireserv.ca\/thunder-bay\/\",lat: 48.389, lng: -89.246 },];\n                            const markers = locations.map((position, i) => {\n                                const markerImg = document.createElement(\"img\");\n                                markerImg.src = \"https:\/\/www.aireserv.ca\/locations\/wp-content\/themes\/nbly\/brands\/asvca\/images\/map-view.svg\";\n                                markerImg.setAttribute(\"height\", \"30px\");\n                                markerImg.setAttribute(\"width\", \"30px\");\n                                const _marker = new google.maps.LatLng(position.lat, position.lng); \n                                const marker = new google.maps.marker.AdvancedMarkerElement({\n                                    position: _marker,\n                                    content: markerImg,\n                                    title: position.title,\n                                    zIndex: position.id\n                                });\n\n                                marker.addListener(\"gmp-click\", () => {\n                                    infoWindow.setContent(\"<div class='modal-body'><div class='modal-heading'>\" + position.title + \"<\/div><div class='modal-text'>\" + position.address + \"<\/div><div class='modal-cta'><a href='tel:\" + position.phone + \"'>\" + nblyFormatPhoneNumber(position.phone) + \"<\/a><a href='\/schedule-service\/'>Schedule Service<\/a><a href='\" + position.url + \"'>Website<\/a><\/div><\/div>\");\n                                    infoWindow.open(map, marker);\n                                    map.setCenter(marker.position);\n                                });\n                            \n                                return marker;\n                            });\n\n                            const svg = window.btoa(`<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" height=\"32\" width=\"32\"><circle class=\"c\" cx=\"16\" cy=\"16\" r=\"14\" fill=\"none\" stroke=\"#0033a0\" stroke-width=\"3\"\/><circle class=\"d\" cx=\"16\" cy=\"16\" r=\"5\" fill=\"#0033a0\" stroke=\"#0033a0\" stroke-width=\"10\"\/><\/svg>`);\n                            const renderer = {\n                                render: ({ count, position }) =>\n                                    new google.maps.Marker({\n                                        label: { text: String(count), color: \"#ffffff\", fontSize: \"13px\", fontWeight: \"600\" },\n                                        icon: {\n                                            url: `data:image\/svg+xml;base64,${svg}`,\n                                            scaledSize: new google.maps.Size(32, 32),\n                                        },\n                                        position,\n                                        zIndex: Number(google.maps.Marker.MAX_ZINDEX) + count,\n                                    })\n                            };\n\n                        const markerCluster = new markerClusterer.MarkerClusterer({ markers, map, renderer });\n\n                        let bounds = new google.maps.LatLngBounds();\n                        locations.forEach(function(LatLng) {\n                            bounds.extend(LatLng);\n                        });\n                        \n                        map.fitBounds(bounds);\n                        if (markers.length == 1) \n                            map.setOptions({maxZoom: 9});\n                        }\n\n                        initMap();\n\n                        \/\/ Calculate distance between two points using Haversine formula (returns miles)\n                        function nblyCalculateDistance(lat1, lng1, lat2, lng2) {\n                            var R = 3959; \/\/ Earths radius in miles\n                            var dLat = (lat2 - lat1) * Math.PI \/ 180;\n                            var dLng = (lng2 - lng1) * Math.PI \/ 180;\n                            var a = Math.sin(dLat\/2) * Math.sin(dLat\/2) +\n                                    Math.cos(lat1 * Math.PI \/ 180) * Math.cos(lat2 * Math.PI \/ 180) *\n                                    Math.sin(dLng\/2) * Math.sin(dLng\/2);\n                            var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n                            return R * c;\n                        }\n\n                        function nblyBuildList(markerList) {\n                            let list_contents = \"\";\n                            for (var i = 0; i < markerList.length; i++) {\n                                list_contents = list_contents + nblyBuildListItem(markerList[i]);\n                            }\n                            jQuery(\".location-list\").html(list_contents);\n                            if (markerList.length == 1) { \n                                jQuery(\".location-total-text span\").html(markerList.length + \" location found\");\n                            } else {\n                                jQuery(\".location-total-text span\").html(markerList.length + \" locations found\");\n                            }\n                        }\n\n                        function nblyBuildListItem(obj) {\n                            return \"<li class='location-item'><a class='location-title' href='\" + obj.url + \"'>\" + obj.title + \"<\/a><p>\" + obj.address + \"<\/p><a class='location-phone' href='tel:\" + obj.phone + \"'>Contact Us: \" + nblyFormatPhoneNumber(obj.phone) + \"<\/a><a class='primary-btn' a href='\/schedule-service\/'>Schedule Service<\/a><\/li>\";\n                        }\n                    <\/script>\n                <\/div>\n            <\/div>\n        <\/section>\n\n<section class=\"wp-block-discover-neighborly\">\n                        <div class=\"nbly-block-container\">\n                            <div class=\"discover-logos\">\n                                <a href=\"\/\" target=\"_blank\" title=\"Aire Serv - opens in new tab\">\n                                    <img decoding=\"async\" src=\"https:\/\/www.aireserv.ca\/locations\/wp-content\/themes\/nbly\/brands\/asvca\/images\/footer-logo.svg\" alt=\"\" loading=\"lazy\" alt=\"Aire Serv Logo\" \/>\n                                <\/a>\n                                <div><\/div>\n                                <a href=\"https:\/\/www.neighborly.com\/\" target=\"_blank\" title=\"Neigborly - opens in new tab\">\n                                    <img decoding=\"async\" src=\"\/locations\/wp-content\/themes\/nbly\/assets\/images\/nbly-logo-tagline-ca.svg\" alt=\"\" loading=\"lazy\" alt=\"Neigborly logo with tagline\" \/>\n                                <\/a>\n                            <\/div>\n                            <div class=\"discover-tagline\">\n                                Aire Serv is part of the Neighbourly family of home and commercial service providers.\n                            <\/div>\n                            <p>\n                                Searching through dozens of home and commercial service providers is a thing of the past. Rely on Neighbourly\u2019s national network of trusted, local service professionals for all your home and commercial service needs.\n                            <\/p>\n                            <div class=\"discover-lower\">\n                                <div class=\"discover-lower-container\">\n                                    <div>Neighbourly is all you need to remember<\/div>\n                                    <div>\n                                        <a href=\"https:\/\/www.neighborly.com\/ca\/\" class=\"primary-btn\" target=\"_blank\" title=\"Discover Neighbourly - opens in new tab\">\n                                            Discover Neighbourly\n                                            <svg>\n                                                <use xlink:href=\"\/locations\/wp-content\/themes\/nbly\/assets\/images\/hero-icon-sprite.svg#arrow-small-right-white\"><\/use>\n                                            <\/svg>\n                                        <\/a>\n                                    <\/div>\n                                <\/div>\n                                <div class=\"discover-lower-container\" style=\"display:none !important;\">\n                                    <div>Download the App<\/div>\n                                    <div>\n                                        <a href=\"https:\/\/apps.apple.com\/us\/app\/neighborly-home-services\/id1504241093\" class=\"primary-btn\" target=\"_blank\" title=\"App Store - opens in new tab\">\n                                            <img decoding=\"async\" src=\"\/locations\/wp-content\/themes\/nbly\/assets\/images\/apple.svg\" alt=\"\" loading=\"lazy\" \/>\n                                            App Store\n                                        <\/a>\n                                        <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.nbly.custapp\" class=\"primary-btn\" target=\"_blank\" title=\"Google Play Store - opens in new tab\">\n                                            <img decoding=\"async\" src=\"\/locations\/wp-content\/themes\/nbly\/assets\/images\/google-play.svg\" alt=\"\" loading=\"lazy\" \/>\n                                            Google Play Store\n                                        <\/a>\n                                    <\/div>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/section>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-7","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.aireserv.ca\/locations\/wp-json\/wp\/v2\/pages\/7","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aireserv.ca\/locations\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.aireserv.ca\/locations\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.aireserv.ca\/locations\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aireserv.ca\/locations\/wp-json\/wp\/v2\/comments?post=7"}],"version-history":[{"count":1,"href":"https:\/\/www.aireserv.ca\/locations\/wp-json\/wp\/v2\/pages\/7\/revisions"}],"predecessor-version":[{"id":9,"href":"https:\/\/www.aireserv.ca\/locations\/wp-json\/wp\/v2\/pages\/7\/revisions\/9"}],"wp:attachment":[{"href":"https:\/\/www.aireserv.ca\/locations\/wp-json\/wp\/v2\/media?parent=7"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}