Paradise Realty FLA Joseph Capra Licensed Real Estate Broker
"A Veteran-Owned Company"
6103 SE Federal Highway, Stuart, FL 34997
DRE#: 1066402
Equal Housing Opportunity.
Paradise Realty FLA is pledged to the letter and spirit of U.S. policy for the achievement of equal housing opportunity
and does business in accordance with the Federal Fair Housing Act and the Florida Fair Housing Act.
(function () {
var LABELS = { loan_amount: "Loan amount", annual_interest_rate: "Annual interest rate (%)", term_of_loan: "Loan term (years)" };
var IDS = { "js-sort-search": "Sort results", "id_county": "County", "id_type_Home": "Property type: Home", "id_type_Condo": "Property type: Condo", "id_type_Townhouse": "Property type: Townhouse", "id_city": "City", "cityIndex": "City", "id_list_price_min": "Minimum price", "id_list_price_max": "Maximum price", "id_beds_min": "Minimum beds", "id_baths_min": "Minimum baths" };
// Real Geeks' search bundle tries to cache a 6.6 MB autocomplete list in
// localStorage and throws QuotaExceededError on every listing page (the
// "Script error." Clarity logs in 21% of sessions). Suggestions work from
// memory, so the failed write is harmless; swallow it for that key only so
// the error metric means something again. Reported to Real Geeks 2026-11-01.
try {
var _set = Storage.prototype.setItem;
Storage.prototype.setItem = function (k, v) {
try { return _set.call(this, k, v); }
catch (e) { if (String(k).indexOf("autocomplete-options") !== -1) return; throw e; }
};
} catch (e) {}
function fixAriaAttrs() {
document.querySelectorAll("[aria-labelled-by]").forEach(function (el) {
var val = el.getAttribute("aria-labelled-by");
if (val && !el.getAttribute("aria-labelledby")) el.setAttribute("aria-labelledby", val);
el.removeAttribute("aria-labelled-by");
});
document.querySelectorAll("[aria-role]").forEach(function (el) {
var val = el.getAttribute("aria-role");
if (val && !el.getAttribute("role")) el.setAttribute("role", val);
el.removeAttribute("aria-role");
});
}
function hasName(el) {
if (el.getAttribute("aria-label") || el.getAttribute("aria-labelledby")) return true;
var wrap = el.closest("label");
if (wrap && wrap.textContent.replace(/\s/g, "").length > 0) return true;
if (!el.id) return false;
var lbl = document.querySelector('label[for="' + el.id + '"]');
return !!(lbl && lbl.textContent.replace(/\s/g, "").length > 0);
}
// Track community context for listing page navigation
var communityNavDone = false;
function communityNav() {
var path = location.pathname.toLowerCase();
var COMMUNITY_RE = /^\/(listings\/subdivision\/|[a-z]+-county\/|[a-z0-9-]+-(port-saint-lucie|fort-pierce|stuart|palm-city|hobe-sound|jensen-beach|vero-beach|sebastian|jupiter|tequesta|loxahatchee|west-palm-beach|palm-beach-gardens|wellington|royal-palm-beach|boynton-beach|delray-beach|boca-raton|lake-worth|palm-bay|melbourne))/;
var isListing = /^\/property\//.test(path);
var isArea = COMMUNITY_RE.test(path);
// On community/area pages, store context
if (isArea && !isListing) {
var h1 = document.querySelector("h1");
var name = h1 ? h1.textContent.replace(/\s+/g, " ").trim().replace(/\s*(Real Estate|Homes?|Condos?|for Sale|Listings?)$/i, "").trim() : "";
if (name) {
try {
sessionStorage.setItem("prfCommunity", JSON.stringify({ name: name, url: location.pathname }));
} catch (e) {}
}
}
// On listing pages, show navigation if we have community context
if (!isListing || communityNavDone) return;
communityNavDone = true;
var ctx = null;
try { ctx = JSON.parse(sessionStorage.getItem("prfCommunity")); } catch (e) {}
if (!ctx || !ctx.name || !ctx.url) return;
// Find insertion point - after the property details section
var target = document.querySelector(".additional-information.results-details") || document.querySelector(".property-details-section");
if (!target) return;
var nav = document.createElement("div");
nav.id = "prflaCommunityNav";
nav.innerHTML = '
Back to ' + ctx.name + ' ' +
'
More homes in ' + ctx.name + ' ';
target.parentNode.insertBefore(nav, target.nextSibling);
}
function fix() {
fixAriaAttrs();
listingCta();
communityCta();
communityNav();
document.querySelectorAll("input:not([type=hidden]):not([type=submit]):not([type=button]), select, textarea").forEach(function (el) {
if (hasName(el)) return;
var t = LABELS[el.name] || IDS[el.id] || el.getAttribute("placeholder") || el.getAttribute("title");
if (t) el.setAttribute("aria-label", t);
});
var h1 = document.querySelector("h1"), place = h1 ? h1.textContent.replace(/\s+/g, " ").trim() : "Property";
document.querySelectorAll("img.fotorama__img").forEach(function (img) {
if (!img.getAttribute("alt")) img.setAttribute("alt", place + " - listing photo");
});
[["prev", "Previous photo"], ["next", "Next photo"]].forEach(function (d) {
document.querySelectorAll(".fotorama__arr--" + d[0]).forEach(function (el) {
if (!el.getAttribute("aria-label")) { el.setAttribute("aria-label", d[1]); el.setAttribute("role", "button"); }
});
});
var OFFICE = "7722477110";
var OFFICE_RE = /\(?772\)?[\s.-]*247[\s.-]*7110/;
var digits = function (h) { return (h || "").replace(/\D/g, "").replace(/^1(?=\d{10}$)/, ""); };
var btn = document.getElementById("floatingCallBtn");
var agent = btn ? digits(btn.getAttribute("href")) : "";
var target = agent.length === 10 ? agent : OFFICE;
var pretty = "(" + target.slice(0, 3) + ") " + target.slice(3, 6) + "-" + target.slice(6);
document.querySelectorAll('a[href^="tel:"]').forEach(function (a) {
if (a === btn) return;
var d = digits(a.getAttribute("href"));
if (d !== "" && d !== OFFICE) return;
var label = a.textContent.replace(/\s+/g, " ").trim();
var template = a.matches(".phone-number, .link-phone") || !!a.closest("header") || /^Call( Now)?\b/.test(label);
if (d !== "" && !template) return;
if (a.getAttribute("href") !== "tel:" + target) a.setAttribute("href", "tel:" + target);
var txt = a.textContent.trim();
if (target !== OFFICE && template) {
var walker = document.createTreeWalker(a, NodeFilter.SHOW_TEXT), node;
while ((node = walker.nextNode())) {
if (OFFICE_RE.test(node.nodeValue)) node.nodeValue = node.nodeValue.replace(OFFICE_RE, pretty);
}
}
if (!txt) a.setAttribute("aria-label", "Call Paradise Realty FLA");
});
var chat = document.getElementById("prf-chat-frame");
if (chat && !chat.getAttribute("title")) chat.setAttribute("title", "Paradise Realty FLA chat assistant");
// ADA fix: all iframes must have accessible names (axe frame-title)
// Fallback for any iframe without a title - derive from src host
document.querySelectorAll("iframe:not([title])").forEach(function (f) {
var src = f.getAttribute("src") || f.getAttribute("data-src") || "";
var host = "";
try { host = new URL(src, location.href).hostname.replace(/^www\./, ""); } catch (e) {}
if (host.indexOf("instagram.com") !== -1) { f.setAttribute("title", "Instagram embedded content"); }
else if (host.indexOf("youtube.com") !== -1 || host.indexOf("youtu.be") !== -1) { f.setAttribute("title", "YouTube video"); }
else if (host.indexOf("vimeo.com") !== -1) { f.setAttribute("title", "Vimeo video"); }
else if (host.indexOf("google.com") !== -1 && src.indexOf("/maps") !== -1) { f.setAttribute("title", "Google Maps"); }
else if (host.indexOf("facebook.com") !== -1) { f.setAttribute("title", "Facebook embedded content"); }
else if (host) { f.setAttribute("title", "Embedded content from " + host); }
else { f.setAttribute("title", "Embedded content"); }
});
}
var queued = false;
// Listing pages on phones: one clear next step. The floating row's second
// button becomes "Schedule Showing" (the template's own schedule-tour popup)
// and the five-button action grid is quieter. Reversible by removing this block.
var ctaDone = false;
function listingCta() {
if (ctaDone || !/^\/property\//.test(location.pathname) || window.innerWidth > 640) return;
var sched = document.querySelector('.m-sub-bar a[href*="/schedule-tour/"]:not([href*="virtual"])');
var btn = document.getElementById("prfOpenBtn");
if (!sched || !btn) return;
var nb = btn.cloneNode(false);
nb.textContent = "Schedule Showing";
nb.setAttribute("aria-label", "Schedule a showing");
nb.addEventListener("click", function (e) { e.preventDefault(); sched.click(); });
btn.parentNode.replaceChild(nb, btn);
var css = document.createElement("style");
css.id = "prflaListingCta";
css.textContent = "@media (max-width:640px){.m-sub-bar a{font-size:13px;padding-top:8px;padding-bottom:8px;font-weight:400}}";
document.head.appendChild(css);
ctaDone = true;
}
// Community and area pages on phones: the hero's "View Listings" button sits
// just under the first screen (Clarity: it is the top tap where visible).
// Tighten the hero on small screens and, if the button is still below the
// fold, show a slim sticky bar with the same link until the visitor reaches it.
var commDone = false;
function communityCta() {
if (commDone || window.innerWidth > 640) return;
var btn = document.querySelector('section.hero a[href="#listings"]');
if (!btn) return;
commDone = true;
var css = document.createElement("style");
css.id = "prflaCommunityCta";
css.textContent = "@media (max-width:640px){section.hero{padding-top:10px !important}section.hero .hero-badge{margin-bottom:4px !important}section.hero h1{margin:4px 0 8px !important;font-size:32px !important;line-height:1.1 !important}section.hero h1 + div{margin:10px 0 16px !important}#prflaViewListings{position:sticky;top:0;z-index:98;display:flex;justify-content:center;background:#fff;border-bottom:1px solid #dbe8ec;padding:8px 12px}#prflaViewListings a{display:inline-block;background:#15803d;color:#fff;text-decoration:none;font-weight:600;font-size:14px;padding:9px 18px;border-radius:6px}}";
document.head.appendChild(css);
var r = btn.getBoundingClientRect();
if (r.bottom + window.scrollY > window.innerHeight) {
var bar = document.createElement("div");
bar.id = "prflaViewListings";
bar.innerHTML = '
View Listings ';
var main = document.getElementById("content") || document.body;
main.insertBefore(bar, main.firstChild);
var hide = function () { if (window.scrollY + window.innerHeight > btn.getBoundingClientRect().top + window.scrollY + 60) { bar.style.display = "none"; window.removeEventListener("scroll", hide); } };
window.addEventListener("scroll", hide, { passive: true });
}
}
function schedule() { if (queued) return; queued = true; setTimeout(function () { queued = false; fix(); }, 300); }
function start() {
fix(); setTimeout(fix, 1500); setTimeout(fix, 4000);
if (window.MutationObserver) new MutationObserver(schedule).observe(document.body, { childList: true, subtree: true });
}
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start();
})();