{"id":134,"date":"2026-03-24T08:54:20","date_gmt":"2026-03-23T21:54:20","guid":{"rendered":"https:\/\/greatlengths.com.au\/staging\/store\/"},"modified":"2026-06-05T12:07:45","modified_gmt":"2026-06-05T02:07:45","slug":"salon","status":"publish","type":"page","link":"https:\/\/greatlengths.com.au\/staging\/salon\/","title":{"rendered":""},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"134\" class=\"elementor elementor-134\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-28f3e9ae e-flex e-con-boxed e-con e-parent\" data-id=\"28f3e9ae\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-53def032 elementor-widget elementor-widget-text-editor\" data-id=\"53def032\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t\n<p><style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;1,300;1,400&family=Playfair+Display:ital,wght@0,400;1,400&family=DM+Sans:wght@300;400;500&display=swap');\n\n:root{--gold:#B09060;--gold-l:#C8A87A;--cream:#F5F0E8;--char:#1E1B18;--char2:#2A2720;--mid:#5C5850;--lt:#999186;--bdr:#DDD8CE;--sans:Lato,sans-serif}\n\n\/* HERO *\/\n.gl-loc-main{display:grid;grid-template-columns:1fr 420px;min-height:600px}\n.gl-locator{font-family:var(--sans);-webkit-font-smoothing:antialiased}\n.gl-locator *{box-sizing:border-box}\n.gl-loc-hero{background:linear-gradient(rgba(20,15,10,0.55),rgba(20,15,10,0.55)),url('https:\/\/greatlengths.com.au\/staging\/wp-content\/uploads\/2026\/05\/salon-finder_hero_image.jpg') center\/cover no-repeat;padding:clamp(5rem,10vw,8rem) clamp(1.5rem,5vw,5rem) clamp(3rem,5vw,4rem);padding-top:calc(clamp(5rem,10vw,8rem) + 230px);text-align:center;border-bottom:1px solid rgba(255,255,255,.06)}\n.gl-loc-breadcrumb{font-family:var(--sans);font-size:.62rem;letter-spacing:.12em;text-transform:uppercase;color:rgba(255,255,255,.3);margin-bottom:2rem;display:flex;align-items:center;justify-content:center;gap:.5rem}\n.gl-loc-breadcrumb a{color:var(--gold-l);text-decoration:none}\n.gl-loc-breadcrumb a:hover{color:#fff}\n.gl-loc-hero h1{font-family:'Cormorant Garamond',serif;font-size:clamp(2.8rem,5vw,5rem);font-weight:300;color:#fff;line-height:1.08;margin-bottom:1rem}\n.gl-loc-hero p{font-family:'Playfair Display',serif;font-style:italic;font-size:1.05rem;color:rgba(255,255,255,.45);max-width:48ch;margin:0 auto}\n\n\/* SEARCH BAR *\/\n.gl-loc-search{max-width:900px;margin:0 auto;padding:2rem clamp(1.5rem,5vw,5rem);display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;background:var(--cream);border-bottom:1px solid var(--bdr);position:sticky;top:0;z-index:40}\n.gl-loc-search-input{flex:1;min-width:220px}\n.gl-loc-search-input input{width:100%;padding:.85rem 1.25rem;border:1px solid var(--bdr);background:#fff;font-family:var(--sans);font-size:.9rem;color:var(--char);outline:none;transition:border-color .2s;border-radius:0}\n.gl-loc-search-input input:focus{border-color:var(--gold)}\n.gl-loc-search-input input::placeholder{color:var(--lt)}\n.gl-loc-btn{padding:.85rem 1.75rem;background:var(--gold);color:var(--char);border:none;font-family:var(--sans);font-size:.7rem;letter-spacing:.12em;text-transform:uppercase;font-weight:600;cursor:pointer;transition:background .2s;flex-shrink:0}\n.gl-loc-btn:hover{background:var(--gold-l)}\n.gl-loc-btn-location{padding:.85rem 1.25rem;background:#fff;color:var(--mid);border:1px solid var(--bdr);font-family:var(--sans);font-size:.72rem;letter-spacing:.06em;cursor:pointer;transition:all .2s;flex-shrink:0;display:flex;align-items:center;gap:.4rem}\n.gl-loc-btn-location:hover{border-color:var(--gold);color:var(--gold)}\n.gl-loc-filter-toggle{padding:.85rem 1.25rem;background:transparent;color:var(--mid);border:1px solid var(--bdr);font-family:var(--sans);font-size:.72rem;letter-spacing:.06em;cursor:pointer;transition:all .2s;flex-shrink:0}\n.gl-loc-filter-toggle:hover{border-color:var(--gold);color:var(--gold)}\n\n\/* FILTERS *\/\n.gl-loc-filters{background:#fff;border-bottom:1px solid var(--bdr);padding:1rem clamp(1.5rem,5vw,5rem);display:none}\n.gl-loc-filters.open{display:block}\n.gl-loc-filters-inner{max-width:900px;margin:0 auto;display:flex;gap:1.5rem;flex-wrap:wrap;align-items:center}\n.gl-loc-filters label{font-family:var(--sans);font-size:.68rem;letter-spacing:.08em;text-transform:uppercase;color:var(--lt);margin-right:.4rem}\n.gl-loc-filters select{padding:.45rem .9rem;border:1px solid var(--bdr);background:#fff;font-family:var(--sans);font-size:.82rem;color:var(--char);outline:none;cursor:pointer}\n.gl-loc-filters select:focus{border-color:var(--gold)}\n\n\/* MAIN LAYOUT *\/\n.gl-loc-body{display:grid;grid-template-columns:1fr 420px;min-height:600px}\n.gl-loc-map{position:sticky;top:0;height:calc(100vh - 120px);overflow:hidden;min-height:500px}\n.gl-loc-map iframe,.gl-loc-map #gl-map{width:100%;height:100%}\n\n\/* RESULTS PANEL *\/\n.gl-loc-list{overflow-y:auto;max-height:calc(100vh - 120px);border-left:1px solid var(--bdr)}\n.gl-loc-results-header{padding:1.25rem 1.5rem;border-bottom:1px solid var(--bdr);display:flex;justify-content:space-between;align-items:center;position:sticky;top:0;background:#fff;z-index:10}\n.gl-loc-results-title{font-family:'Cormorant Garamond',serif;font-size:1.3rem;font-weight:400;color:var(--char)}\n.gl-loc-results-count{font-family:var(--sans);font-size:.72rem;color:var(--lt)}\n\n\/* SALON CARD IN LIST *\/\n.gl-loc-salon-item{padding:1.25rem 1.5rem;border-bottom:1px solid var(--bdr);transition:background .15s;cursor:pointer;position:relative}\n.gl-loc-salon-item::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--gold);transform:scaleY(0);transition:transform .2s;transform-origin:bottom}\n.gl-loc-salon-item:hover,.gl-loc-salon-item.active{background:rgba(176,144,96,.04)}\n.gl-loc-salon-item:hover::before,.gl-loc-salon-item.active::before{transform:scaleY(1)}\n.gl-loc-salon-name{font-family:'Cormorant Garamond',serif;font-size:1.1rem;font-weight:400;color:var(--char);margin-bottom:.3rem}\n.gl-loc-salon-addr{font-family:var(--sans);font-size:.75rem;color:var(--lt);margin-bottom:.5rem;display:flex;align-items:center;gap:.3rem}\n.gl-loc-salon-tags{display:flex;gap:.3rem;flex-wrap:wrap;margin-bottom:.6rem}\n.gl-loc-salon-tag{font-family:var(--sans);font-size:.58rem;letter-spacing:.06em;text-transform:uppercase;padding:.2rem .55rem;border:1px solid var(--bdr);color:var(--lt)}\n.gl-loc-salon-link{font-family:var(--sans);font-size:.65rem;letter-spacing:.1em;text-transform:uppercase;color:var(--gold);text-decoration:none;border-bottom:1px solid rgba(176,144,96,.3);padding-bottom:1px;transition:all .18s}\n.gl-loc-salon-link:hover{color:var(--char);border-color:var(--char)}\n\n\/* LOADING *\/\n.gl-loc-loading{padding:3rem;text-align:center;font-family:var(--sans);font-size:.85rem;color:var(--lt)}\n\n@media(max-width:800px){.gl-loc-body{grid-template-columns:1fr}.gl-loc-map{height:350px;position:relative}.gl-loc-list{max-height:none}}\n\n\/* Hide extension type tags from cards *\/\n.gl-loc-card-methods{display:none!important;}\n\/* Card address line *\/\n.gl-loc-card-addr{font-size:.8rem;color:#888;margin:.15rem 0 .6rem;font-family:var(--sans);}\n\/* Distinction badge *\/\n.gl-loc-badge-plat{display:inline-block;font-size:.6rem;letter-spacing:.1em;text-transform:uppercase;padding:2px 8px;border-radius:2px;background:linear-gradient(135deg,#EFEFEF,#C8C8C8);color:#2A2720;margin-bottom:.4rem;font-family:var(--sans);}\n.gl-loc-badge-gold{display:inline-block;font-size:.6rem;letter-spacing:.1em;text-transform:uppercase;padding:2px 8px;border-radius:2px;background:linear-gradient(135deg,#D4AF5A,#B09060);color:#fff;margin-bottom:.4rem;font-family:var(--sans);}\n\/* Show more button fix *\/\n.gl-loc-show-more-wrap{text-align:center;padding:1.5rem 0;}\n\n\/* Radius filter - same styling as other filter groups *\/\n#gl-filter-radius{font-family:var(--sans);font-size:.75rem;}\n<\/style><\/p>\n<div class=\"gl-locator\">\n<div class=\"gl-loc-hero\">\n<div class=\"gl-loc-breadcrumb\"><a href=\"\/staging\/\">Home<\/a> \u00a0\/\u00a0 Find a Salon<\/div>\n<h1>Find a Great Lengths Salon Near You<\/h1>\n<p>Certified specialists in premium hair extensions, delivering natural, long-lasting results.<\/p>\n<\/div>\n<div class=\"gl-loc-search\">\n<div class=\"gl-loc-search-input\"><input id=\"gl-search-input\" autocomplete=\"off\" type=\"text\" placeholder=\"Enter a suburb, postcode, or city\" \/><\/div>\n<button id=\"gl-search-btn\" class=\"gl-loc-btn\">SEARCH<\/button> <button id=\"gl-location-btn\" class=\"gl-loc-btn-location\"> Use my location <\/button> <button id=\"gl-filter-toggle\" class=\"gl-loc-filter-toggle\">Filters <span class=\"arrow\">\u25bc<\/span><\/button><\/div>\n<div id=\"gl-filters\" class=\"gl-loc-filters\">\n<div class=\"gl-loc-filters-inner\">\n<div class=\"gl-loc-filter-group\"><label>Method<\/label><select id=\"gl-filter-method\">\n<option value=\"\">All Methods<\/option>\n<option value=\"keratin\">Keratin Bond<\/option>\n<option value=\"tape\">Tape Extensions<\/option>\n<option value=\"weft\">Weft Extensions<\/option>\n<\/select><\/div>\n<div class=\"gl-loc-filter-group\"><label>Salon Level<\/label><select id=\"gl-filter-level\">\n<option value=\"\">All Salons<\/option>\n<option value=\"elite\">Elite Only (Gold &amp; Platinum)<\/option>\n<\/select><\/div>\n<div class=\"gl-loc-filter-group\"><label>Radius<\/label><select id=\"gl-filter-radius\">\n<option value=\"\">Any Distance<\/option>\n<option value=\"5\">5 km<\/option>\n<option selected=\"selected\" value=\"10\">10 km<\/option>\n<option value=\"25\">25 km<\/option>\n<option value=\"50\">50 km<\/option>\n<option value=\"100\">100 km<\/option>\n<\/select><\/div>\n<\/div>\n<\/div>\n<div class=\"gl-loc-main\">\n<div class=\"gl-loc-map\">\n<div id=\"gl-map\">\u00a0<\/div>\n<\/div>\n<div id=\"gl-salon-list\" class=\"gl-loc-list\">\n<div class=\"gl-loc-results-header\">\n<h3>Our Salons<\/h3>\n<span id=\"gl-results-count\" class=\"gl-loc-results-count\"><\/span><\/div>\n<div id=\"gl-salon-cards\">\n<div class=\"gl-loc-loading\">Loading salons\u2026<\/div>\n<\/div>\n<div id=\"gl-show-more\" class=\"gl-loc-show-more\" style=\"display: none;\"><button id=\"gl-show-more-btn\">Show more salons<\/button><\/div>\n<div id=\"gl-no-results\" class=\"gl-loc-no-results\" style=\"display: none;\">\n<p>No salons found matching your search.<\/p>\n<p style=\"font-size: 13px; color: #a09888;\">Try a different suburb or remove filters.<\/p>\n<\/div>\n<div id=\"gl-detail-panel\" class=\"gl-loc-detail\">\u00a0<\/div>\n<\/div>\n<\/div>\n<div class=\"gl-loc-trust\">\n<div class=\"gl-loc-trust-item\">\n<div class=\"gl-loc-trust-icon\">\u00a0<\/div>\n<span class=\"gl-loc-trust-text\">Certified Salons<\/span><\/div>\n<div class=\"gl-loc-trust-item\">\n<div class=\"gl-loc-trust-icon\">\u00a0<\/div>\n<span class=\"gl-loc-trust-text\">100% Ethically Sourced<\/span><\/div>\n<div class=\"gl-loc-trust-item\">\n<div class=\"gl-loc-trust-icon\">\u00a0<\/div>\n<span class=\"gl-loc-trust-text\">Premium Quality Hair<\/span><\/div>\n<div class=\"gl-loc-trust-item\">\n<div class=\"gl-loc-trust-icon\">\u00a0<\/div>\n<span class=\"gl-loc-trust-text\">Expert Stylists<\/span><\/div>\n<div class=\"gl-loc-trust-item\">\n<div class=\"gl-loc-trust-icon\">\u00a0<\/div>\n<span class=\"gl-loc-trust-text\">Personalised Consultation<\/span><\/div>\n<\/div>\n<\/div>\n<p><script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.js\"><\/script> <script>\n(function(){\n  var SHEET_ID = '1AYnxs2QFsaixt6hV-HHGUG_puxBW9jTMhAr6oTNEsXc';\n  var SHEET_GID = '327706013';\n  var DEFAULT_LAT = -28.5;\n  var DEFAULT_LNG = 135;\n  var DEFAULT_ZOOM = 4;\n  var SHOW_INITIAL = 10;\n\n  var allSalons = [];\n  var filteredSalons = [];\n  var visibleCount = SHOW_INITIAL;\n  var map, markers = [];\n\n  function initMap() {\n    map = L.map('gl-map', {zoomControl: true, scrollWheelZoom: true}).setView([DEFAULT_LAT, DEFAULT_LNG], DEFAULT_ZOOM);\n    L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/light_all\/{z}\/{x}\/{y}{r}.png', {\n      attribution: '',\n      subdomains: 'abcd',\n      maxZoom: 19\n    }).addTo(map);\n    fetchSalons();\n  }\n\n  function fetchSalons() {\n    var url = 'https:\/\/docs.google.com\/spreadsheets\/d\/' + SHEET_ID + '\/gviz\/tq?tqx=out:json&gid=' + SHEET_GID + '&range=A2:R512';\n    fetch(url).then(function(r){ return r.text(); }).then(function(text){\n      var json = text.replace(\/^[^(]*\\(\/, '').replace(\/\\);?\\s*$\/, '');\n      var data = JSON.parse(json);\n      allSalons = data.table.rows.map(function(row, idx){\n        var c = row.c;\n        var gv = function(i){ return c[i] ? (c[i].v || '') : ''; };\n        var distinction = (gv(10) || '').toLowerCase().trim();\n        if (distinction.indexOf('plat') > -1) distinction = 'platinum';\n        else if (distinction.indexOf('gold') > -1) distinction = 'gold';\n        else distinction = 'none';\n        var methods = gv(9);\n        return {\n          id: idx + 1,\n          name: gv(0),\n          address: gv(1),\n          suburb: gv(2),\n          state: gv(3),\n          postcode: gv(4),\n          country: gv(5),\n          phone: gv(6),\n          website: gv(7),\n          instagram: gv(8),\n          methods: methods,\n          distinction: distinction,\n          lat: parseFloat(gv(11)) || 0,\n          lng: parseFloat(gv(12)) || 0,\n          info: gv(16),\n          tip: gv(17),\n          url: (function(u){ if (!u) return ''; var parts = u.replace(\/\\\/$\/,'').split('\/'); return '\/staging\/salon\/' + parts[parts.length-1] + '\/'; })(gv(13))\n        };\n      }).filter(function(s){ return s.name && s.lat && s.lng; });\n      filteredSalons = allSalons.slice();\n      renderList();\n      addMarkers();\n      useMyLocation();\n    });\n  }\n\n  var glIcon = L.divIcon({\n    className: 'gl-marker',\n    html: '<div style=\"width:28px;height:36px;position:relative\"><svg viewBox=\"0 0 24 30\" width=\"28\" height=\"36\"><path d=\"M12 0C5.4 0 0 5.4 0 12c0 9 12 18 12 18s12-9 12-18C24 5.4 18.6 0 12 0z\" fill=\"#5C4A3A\" stroke=\"#3A2E24\" stroke-width=\"1\"\/><text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#F5F0E1\" font-size=\"7\" font-weight=\"700\" font-family=\"Lato,sans-serif\">GL<\/text><\/svg><\/div>',\n    iconSize: [28, 36],\n    iconAnchor: [14, 36],\n    popupAnchor: [0, -36]\n  });\n\n  function addMarkers() {\n    clearMarkers();\n    var bounds = [];\n    filteredSalons.forEach(function(salon) {\n      if (!salon.lat || !salon.lng) return;\n      var marker = L.marker([salon.lat, salon.lng], {icon: glIcon}).addTo(map);\n      marker.bindTooltip(salon.name, {\n        permanent: false,\n        direction: 'top',\n        offset: [0, -36],\n        className: 'gl-map-tooltip'\n      });\n      marker.on('click', function() {\n        if (salon.url) {\n          window.location.href = salon.url;\n        }\n      });\n      markers.push(marker);\n      bounds.push([salon.lat, salon.lng]);\n    });\n    if (bounds.length > 0) map.fitBounds(bounds, {padding: [30, 30]});\n  }\n\n  function clearMarkers() { markers.forEach(function(m){ map.removeLayer(m); }); markers = []; }\n\n  function highlightCard(salonId) {\n    document.querySelectorAll('.gl-loc-card').forEach(function(c){ c.classList.remove('active'); });\n    var card = document.getElementById('gl-card-' + salonId);\n    if (card) { card.classList.add('active'); card.scrollIntoView({behavior:'smooth', block:'nearest'}); }\n  }\n\n  function renderList() {\n    var container = document.getElementById('gl-salon-cards');\n    var countEl = document.getElementById('gl-results-count');\n    var showMoreEl = document.getElementById('gl-show-more');\n    var noResultsEl = document.getElementById('gl-no-results');\n    container.innerHTML = '';\n    var showing = Math.min(visibleCount, filteredSalons.length);\n    countEl.textContent = 'Showing ' + showing + ' of ' + filteredSalons.length;\n    if (filteredSalons.length === 0) { noResultsEl.style.display = 'block'; showMoreEl.style.display = 'none'; return; }\n    noResultsEl.style.display = 'none';\n    for (var i = 0; i < showing; i++) {\n      var s = filteredSalons[i];\n      var card = document.createElement('div');\n      card.className = 'gl-loc-card';\n      card.id = 'gl-card-' + s.id;\n      var badgeHtml = '';\n      if (s.distinction === 'platinum') badgeHtml = '<span class=\"gl-loc-badge gl-loc-badge-platinum\">Platinum<\/span>';\n      else if (s.distinction === 'gold') badgeHtml = '<span class=\"gl-loc-badge gl-loc-badge-gold\">Gold<\/span>';\n      var methodsHtml = '';\n      if (s.methods) { s.methods.split(';').forEach(function(m){ m = m.trim(); if (m) methodsHtml += '<span class=\"gl-loc-method-tag\">' + m + '<\/span>'; }); }\n      if (s.distinction !== 'none') card.classList.add('gl-loc-card-distinguished');\ncard.innerHTML = '<div class=\"gl-loc-card-name\"><a href=\"' + s.url + '\" style=\"color:inherit;text-decoration:none\">' + s.name + '<\/a> ' + badgeHtml + '<\/div>' + '<div class=\"gl-loc-card-methods\">' + methodsHtml + '<\/div>' + '<div class=\"gl-loc-card-actions\"><a href=\"' + s.url + '\" class=\"gl-loc-card-link\">View Details<\/a><\/div>';\ncard.addEventListener('click', (function(salon){ return function(){ map.setView([salon.lat, salon.lng], 14); highlightCard(salon.id); }; })(s));\n      container.appendChild(card);\n    }\n    \/\/ View Details now links directly to salon pages\n    showMoreEl.style.display = (filteredSalons.length > visibleCount) ? 'block' : 'none';\n  }\n\n  \/\/ showDetail removed - View Details links directly to salon pages\n\n  function doSearch() {\n    var query = document.getElementById('gl-search-input').value.trim();\n    if (!query) { filteredSalons = applyFilters(allSalons); visibleCount = SHOW_INITIAL; renderList(); addMarkers(); return; }\n    var q = query.toLowerCase();\n    \/\/ Try postcode match first (pure number)\n    if (\/^\\d{4}$\/.test(query)) {\n      filteredSalons = applyFilters(allSalons).filter(function(s){ return s.postcode === query; });\n    } else {\n      filteredSalons = applyFilters(allSalons).filter(function(s){\n        return s.name.toLowerCase().indexOf(q) > -1 || s.suburb.toLowerCase().indexOf(q) > -1 || s.state.toLowerCase().indexOf(q) > -1 || s.postcode.indexOf(q) > -1;\n      });\n    }\n    \/\/ If no text matches, try geocoding via Nominatim\n    if (filteredSalons.length === 0) {\n      fetch('https:\/\/nominatim.openstreetmap.org\/search?format=json&q=' + encodeURIComponent(query + ', Australia') + '&limit=1')\n        .then(function(r){ return r.json(); })\n        .then(function(results){\n          if (results.length > 0) {\n            sortByDistance(parseFloat(results[0].lat), parseFloat(results[0].lon));\n          } else {\n            visibleCount = SHOW_INITIAL; renderList(); addMarkers();\n          }\n        });\n    } else {\n      visibleCount = SHOW_INITIAL; renderList(); addMarkers();\n    }\n  }\n\n  function sortByDistance(lat, lng) {\n    filteredSalons = applyFilters(allSalons).map(function(s) {\n      var dlat = s.lat - lat, dlng = s.lng - lng;\n      s._dist = Math.sqrt(dlat*dlat + dlng*dlng);\n      return s;\n    }).sort(function(a, b) { return a._dist - b._dist; });\n    visibleCount = SHOW_INITIAL; renderList(); addMarkers();\n    map.setView([lat, lng], 11);\n  }\n\n  function applyFilters(salons) {\n    var method = document.getElementById('gl-filter-method').value;\n    var level = document.getElementById('gl-filter-level').value;\n    return salons.filter(function(s) {\n      if (method) {\n        var m = s.methods.toLowerCase();\n        if (method === 'keratin' && m.indexOf('keratin') === -1) return false;\n        if (method === 'tape' && m.indexOf('tape') === -1) return false;\n        if (method === 'weft' && m.indexOf('weft') === -1) return false;\n      }\n      if (level === 'elite' && s.distinction === 'none') return false;\n      return true;\n    });\n  }\n\n  function useMyLocation() {\n    if (!navigator.geolocation) return;\n    navigator.geolocation.getCurrentPosition(function(pos) {\n      sortByDistance(pos.coords.latitude, pos.coords.longitude);\n      document.getElementById('gl-search-input').value = 'My Location';\n    });\n  }\n\n  document.getElementById('gl-search-btn').addEventListener('click', doSearch);\n  document.getElementById('gl-search-input').addEventListener('keypress', function(e) { if (e.key === 'Enter') doSearch(); });\n  document.getElementById('gl-location-btn').addEventListener('click', useMyLocation);\n  document.getElementById('gl-filter-toggle').addEventListener('click', function() { this.classList.toggle('open'); document.getElementById('gl-filters').classList.toggle('open'); });\n  document.getElementById('gl-filter-method').addEventListener('change', function() { filteredSalons = applyFilters(allSalons); visibleCount = SHOW_INITIAL; renderList(); addMarkers(); });\n  document.getElementById('gl-filter-level').addEventListener('change', function() { filteredSalons = applyFilters(allSalons); visibleCount = SHOW_INITIAL; renderList(); addMarkers(); });\n  document.getElementById('gl-show-more-btn').addEventListener('click', function() { visibleCount = filteredSalons.length; renderList(); });\n\n  initMap();\n})();\n\n\/\/ Post-render card enhancer\n(function() {\n  const PLAT_SALONS = ['christopher-hanna','pelo-by-lago','bonnie-donovan','elite-hair-extensions','xtreme-lengths','naomi-panizza','laura-dellolio','renee-yates'];\n  const GOLD_SALONS = ['lumiere-salon','evoke-hair','the-new-black','exhibit-a','lune-by-sara','gaia-studio','mister-morris','pelo-by-lago'];\n  \n  function enhanceCards() {\n    document.querySelectorAll('.gl-loc-card').forEach(card => {\n      if (card.dataset.enhanced) return;\n      card.dataset.enhanced = '1';\n      const link = card.querySelector('.gl-loc-card-link');\n      const nameEl = card.querySelector('.gl-loc-card-name');\n      if (!link || !nameEl) return;\n      const href = link.getAttribute('href') || '';\n      const slug = href.replace(\/.*\\\/salon\\\/\/, '').replace(\/\\\/$\/, '');\n      \/\/ Add badge\n      const isPlatinum = PLAT_SALONS.some(s => slug.includes(s));\n      const isGold = GOLD_SALONS.some(s => slug.includes(s));\n      if (isPlatinum) nameEl.insertAdjacentHTML('beforebegin', '<span class=\"gl-loc-badge-plat\">\u2605 Platinum<\/span>');\n      else if (isGold) nameEl.insertAdjacentHTML('beforebegin', '<span class=\"gl-loc-badge-gold\">\u2605 Gold<\/span>');\n    });\n  }\n  \n  const observer = new MutationObserver(enhanceCards);\n  observer.observe(document.body, { childList: true, subtree: true });\n  enhanceCards();\n})();\n\n\/\/ Radius filter integration\n(function() {\n  function haversine(lat1, lng1, lat2, lng2) {\n    const R = 6371;\n    const dLat = (lat2-lat1) * Math.PI\/180;\n    const dLng = (lng2-lng1) * Math.PI\/180;\n    const 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    return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n  }\n\n  \/\/ Hook into the search button to apply radius after results render\n  function applyRadiusFilter() {\n    const radiusEl = document.getElementById('gl-filter-radius');\n    const maxKm = radiusEl ? parseFloat(radiusEl.value) : null;\n    if (!maxKm) return; \/\/ \"Any Distance\" \u2014 show all\n\n    \/\/ Try to get the searched location from the map center\n    const mapEl = document.getElementById('gl-map');\n    if (!mapEl || !window._glMap) return;\n\n    const center = window._glMap.getCenter();\n    if (!center) return;\n\n    const cards = document.querySelectorAll('.gl-loc-card');\n    cards.forEach(card => {\n      const lat = parseFloat(card.dataset.lat);\n      const lng = parseFloat(card.dataset.lng);\n      if (isNaN(lat) || isNaN(lng)) return;\n      const dist = haversine(center.lat, center.lng, lat, lng);\n      card.closest('li, [class*=\"card-wrap\"]')?.style ?\n        (card.closest('li, [class*=\"card-wrap\"]').style.display = dist > maxKm ? 'none' : '') :\n        (card.style.display = dist > maxKm ? 'none' : '');\n    });\n  }\n\n  \/\/ Apply on filter change\n  document.addEventListener('change', function(e) {\n    if (e.target && e.target.id === 'gl-filter-radius') applyRadiusFilter();\n  });\n\n  \/\/ Also apply after search completes\n  const origShowMore = document.getElementById('gl-show-more-btn');\n  const observer = new MutationObserver(function() {\n    setTimeout(applyRadiusFilter, 300);\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n})();\n\n<\/script><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Home \u00a0\/\u00a0 Find a Salon Find a Great Lengths Salon Near You Certified specialists in premium hair extensions, delivering natural, long-lasting results. SEARCH Use my location Filters \u25bc MethodAll MethodsKeratin BondTape ExtensionsWeft Extensions Salon LevelAll SalonsElite Only (Gold &amp; Platinum) RadiusAny Distance5 km10 km25 km50 km100 km \u00a0 Our Salons Loading salons\u2026 Show more salons [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"content-type":"","footnotes":""},"class_list":["post-134","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Find a Great Lengths Salon Near You | Australia &amp; NZ<\/title>\n<meta name=\"description\" content=\"Find a certified Great Lengths salon near you. Our network of expert stylists across Australia and New Zealand deliver premium hair extension services.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/greatlengths.com.au\/staging\/salon\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Find a Great Lengths Salon Near You | Australia &amp; NZ\" \/>\n<meta property=\"og:description\" content=\"Find a certified Great Lengths salon near you. Our network of expert stylists across Australia and New Zealand deliver premium hair extension services.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/greatlengths.com.au\/staging\/salon\/\" \/>\n<meta property=\"og:site_name\" content=\"Great Lengths Australia &amp; New Zealand\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-05T02:07:45+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/salon\\\/\",\"url\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/salon\\\/\",\"name\":\"Find a Great Lengths Salon Near You | Australia & NZ\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/#website\"},\"datePublished\":\"2026-03-23T21:54:20+00:00\",\"dateModified\":\"2026-06-05T02:07:45+00:00\",\"description\":\"Find a certified Great Lengths salon near you. Our network of expert stylists across Australia and New Zealand deliver premium hair extension services.\",\"inLanguage\":\"en-AU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/salon\\\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/#website\",\"url\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/\",\"name\":\"Great Lengths Australia &amp; New Zealand\",\"description\":\"Premium Hair Extensions | Roma 1992\",\"publisher\":{\"@id\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-AU\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/#organization\",\"name\":\"Great Lengths Australia &amp; New Zealand\",\"url\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-AU\",\"@id\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/GL-ROMA1992-black.png\",\"contentUrl\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/GL-ROMA1992-black.png\",\"width\":1500,\"height\":527,\"caption\":\"Great Lengths Australia &amp; New Zealand\"},\"image\":{\"@id\":\"https:\\\/\\\/greatlengths.com.au\\\/staging\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Find a Great Lengths Salon Near You | Australia & NZ","description":"Find a certified Great Lengths salon near you. Our network of expert stylists across Australia and New Zealand deliver premium hair extension services.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/greatlengths.com.au\/staging\/salon\/","og_locale":"en_US","og_type":"article","og_title":"Find a Great Lengths Salon Near You | Australia & NZ","og_description":"Find a certified Great Lengths salon near you. Our network of expert stylists across Australia and New Zealand deliver premium hair extension services.","og_url":"https:\/\/greatlengths.com.au\/staging\/salon\/","og_site_name":"Great Lengths Australia &amp; New Zealand","article_modified_time":"2026-06-05T02:07:45+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/greatlengths.com.au\/staging\/salon\/","url":"https:\/\/greatlengths.com.au\/staging\/salon\/","name":"Find a Great Lengths Salon Near You | Australia & NZ","isPartOf":{"@id":"https:\/\/greatlengths.com.au\/staging\/#website"},"datePublished":"2026-03-23T21:54:20+00:00","dateModified":"2026-06-05T02:07:45+00:00","description":"Find a certified Great Lengths salon near you. Our network of expert stylists across Australia and New Zealand deliver premium hair extension services.","inLanguage":"en-AU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/greatlengths.com.au\/staging\/salon\/"]}]},{"@type":"WebSite","@id":"https:\/\/greatlengths.com.au\/staging\/#website","url":"https:\/\/greatlengths.com.au\/staging\/","name":"Great Lengths Australia &amp; New Zealand","description":"Premium Hair Extensions | Roma 1992","publisher":{"@id":"https:\/\/greatlengths.com.au\/staging\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/greatlengths.com.au\/staging\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-AU"},{"@type":"Organization","@id":"https:\/\/greatlengths.com.au\/staging\/#organization","name":"Great Lengths Australia &amp; New Zealand","url":"https:\/\/greatlengths.com.au\/staging\/","logo":{"@type":"ImageObject","inLanguage":"en-AU","@id":"https:\/\/greatlengths.com.au\/staging\/#\/schema\/logo\/image\/","url":"https:\/\/greatlengths.com.au\/staging\/wp-content\/uploads\/2026\/03\/GL-ROMA1992-black.png","contentUrl":"https:\/\/greatlengths.com.au\/staging\/wp-content\/uploads\/2026\/03\/GL-ROMA1992-black.png","width":1500,"height":527,"caption":"Great Lengths Australia &amp; New Zealand"},"image":{"@id":"https:\/\/greatlengths.com.au\/staging\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/greatlengths.com.au\/staging\/wp-json\/wp\/v2\/pages\/134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/greatlengths.com.au\/staging\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/greatlengths.com.au\/staging\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/greatlengths.com.au\/staging\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/greatlengths.com.au\/staging\/wp-json\/wp\/v2\/comments?post=134"}],"version-history":[{"count":105,"href":"https:\/\/greatlengths.com.au\/staging\/wp-json\/wp\/v2\/pages\/134\/revisions"}],"predecessor-version":[{"id":4650,"href":"https:\/\/greatlengths.com.au\/staging\/wp-json\/wp\/v2\/pages\/134\/revisions\/4650"}],"wp:attachment":[{"href":"https:\/\/greatlengths.com.au\/staging\/wp-json\/wp\/v2\/media?parent=134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}