Contact Us
Would you like to be contacted about our community? Complete the form below and a member of our team will respond shortly.
Office Hours
9:30am - 5:30pm
9:30am - 6:00pm
9:30am - 5:30pm
10:00am - 5:00pm
Closed
<script> |
// --------------------------------------------------------------------------- |
// Bootstrap: wait for OneTrust geolocation, then evaluate the session |
// --------------------------------------------------------------------------- |
let attempts = 0; |
const maxAttempts = 6; |
const poll = setInterval(function () { |
attempts++; |
if (window.OneTrust && OneTrust.getGeolocationData()) { |
clearInterval(poll); |
innrHandleConsentRevocation(); |
innrEvaluateAndTrackSession(); |
} else if (attempts >= maxAttempts) { |
clearInterval(poll); |
} |
}, 300); |
// sessions that were built but couldn't be persisted yet because consent (C0002) wasn't granted |
let innrPendingSessions = null; |
function innrCollectData(customEvent = null, customProperties = {}, timeoutValue = 100) { |
setTimeout(function () { |
if (customEvent && typeof customEvent === 'string') { |
innrTrack({ |
event: customEvent, |
event_properties: customProperties, |
type: 'action', |
labels: ['ux'] |
}); |
} |
}, timeoutValue); |
} |
function innrGlobalTrackingAllowed() { |
// Global Privacy Control - if the browser/user has this signal set, no tracking of any kind is allowed |
return navigator.globalPrivacyControl !== true; |
} |
function innrTrack(toSend) { |
if (!innrGlobalTrackingAllowed()) return; |
const data = JSON.stringify(toSend); |
const url = 'https://g5-real-page-attribution-data.uc.r.appspot.com/app_activity'; |
if (navigator.sendBeacon) { |
const blob = new Blob([data], { type: 'text/plain' }); |
navigator.sendBeacon(url, blob); |
} |
} |
// --------------------------------------------------------------------------- |
// Consent & storage |
// --------------------------------------------------------------------------- |
function innrStorageAllowed() { |
try { |
if (!innrGlobalTrackingAllowed()) return false; |
const geo = OneTrust.getGeolocationData(); |
// Tier 1 states: persistent attribution requires Performance Cookies (C0002) |
if (geo.country === 'US' && (geo.state === 'CA' || geo.state === 'FL' || geo.state === 'PA')) { |
return OnetrustActiveGroups.includes('C0002'); |
} |
return true; |
} catch (e) { |
return false; |
} |
} |
function innrIsOptedOut() { |
try { |
return localStorage.getItem('mcreff') === 'opt-out'; |
} catch (e) { |
return false; |
} |
} |
function innrGetSessions() { |
try { |
if (innrIsOptedOut()) return []; |
if (!innrStorageAllowed()) return []; |
const raw = localStorage.getItem('mcreff'); |
return raw ? JSON.parse(raw) : []; |
} catch (e) { |
return []; |
} |
} |
// attribution value to attach to lead/phone events - null unless consent rules allow and value is well-formed |
function innrGetValidMcreff() { |
try { |
const sessions = innrGetSessions(); // already enforces GPC, opt-out and Tier-1 consent |
if (!Array.isArray(sessions) || sessions.length === 0) return null; |
const wellFormed = sessions.every(function (s) { |
return s && typeof s.timestamp === 'string' && typeof s.landing_page === 'string'; |
}); |
return wellFormed ? JSON.stringify(sessions) : null; |
} catch (e) { |
return null; |
} |
} |
function innrSaveSessions(sessions) { |
try { |
if (innrIsOptedOut()) { |
// permanently opted out - never write again |
innrPendingSessions = null; |
return; |
} |
if (!innrStorageAllowed()) { |
// keep in memory - consent may be granted later in this same page view |
innrPendingSessions = sessions; |
return; |
} |
localStorage.setItem('mcreff', JSON.stringify(sessions)); |
innrPendingSessions = null; |
} catch (e) { |
// storage unavailable (private mode, quota, etc.) - fail silently |
} |
} |
function innrTryPersistPendingSession() { |
if (!innrPendingSessions) return; |
try { |
if (innrIsOptedOut()) { |
innrPendingSessions = null; |
return; |
} |
if (!innrStorageAllowed()) return; |
localStorage.setItem('mcreff', JSON.stringify(innrPendingSessions)); |
innrPendingSessions = null; |
} catch (e) { |
// storage unavailable (private mode, quota, etc.) - fail silently |
} |
} |
function innrHandleConsentRevocation() { |
try { |
// only act once the user has explicitly made a choice (accepted, rejected, or saved |
// preferences) - not opting in yet (banner still open) should NOT be treated as a rejection |
if (!OneTrust.IsAlertBoxClosedAndValid()) return; |
const hasConsent = OnetrustActiveGroups.includes('C0002'); |
if (!hasConsent && !innrIsOptedOut()) { |
// user explicitly rejected performance cookies (or revoked previously granted consent) |
// - applies regardless of state - opt out of localStorage for good |
try { |
localStorage.setItem('mcreff', 'opt-out'); |
} catch (e) { |
// storage unavailable - fail silently |
} |
innrPendingSessions = null; |
} |
} catch (e) { |
// OneTrust not ready |
} |
} |
// --------------------------------------------------------------------------- |
// URL / referrer helpers |
// --------------------------------------------------------------------------- |
function innrGetUrlParams(urlString) { |
const params = {}; |
try { |
const searchParams = new URL(urlString).searchParams; |
[ |
'utm_campaign', 'utm_medium', 'utm_source', 'utm_term', 'utm_content', 'utm_id', |
'gclid', 'fbclid', 'msclkid', 'li_fat_id', 'twclid', 'rdt_cid', 'fp_ref' |
].forEach(function (key) { |
const value = searchParams.get(key); |
if (value) { |
params[key] = value; |
} |
}); |
} catch (e) { |
// invalid/relative URL - treat as no params |
} |
return params; |
} |
function innrHasAnyParam(params) { |
return Object.keys(params).length > 0; |
} |
function innrParamsAreDifferent(newParams, oldParams) { |
for (const key of Object.keys(newParams)) { |
if (newParams[key] !== oldParams[key]) { |
return true; |
} |
} |
return false; |
} |
function innrGetHostname(urlString) { |
try { |
return new URL(urlString).hostname; |
} catch (e) { |
return ''; |
} |
} |
// --------------------------------------------------------------------------- |
// Session detection |
// --------------------------------------------------------------------------- |
function innrEvaluateAndTrackSession() { |
if (!innrGlobalTrackingAllowed()) return; |
const sessions = innrGetSessions(); |
const lastSession = sessions.length ? sessions[sessions.length - 1] : null; |
const currentPageURL = document.location.href; |
const currentHostname = document.location.hostname; |
const rawReferrer = document.referrer || ''; |
const referrerHostname = rawReferrer ? innrGetHostname(rawReferrer) : ''; |
const isSelfReferrer = rawReferrer !== '' && referrerHostname === currentHostname; |
const referrer = isSelfReferrer ? '' : rawReferrer; |
const currentParams = innrGetUrlParams(currentPageURL); |
const now = new Date().toISOString(); |
let isNewSession = false; |
if (!lastSession) { |
// no history (no consent / opted out / first visit): stateless rule from the board |
isNewSession = !isSelfReferrer || innrHasAnyParam(currentParams); |
} else { |
// history available: only fire on referrer change or param change |
if (!isSelfReferrer && referrer !== lastSession.referrer) { |
isNewSession = true; |
} |
if (!isNewSession && innrHasAnyParam(currentParams)) { |
const lastParams = innrGetUrlParams(lastSession.landing_page); |
if (innrParamsAreDifferent(currentParams, lastParams)) { |
isNewSession = true; |
} |
} |
} |
if (isNewSession) { |
sessions.push({ |
timestamp: now, |
landing_page: currentPageURL, |
referrer: referrer |
}); |
innrSaveSessions(sessions); |
innrCollectData('start_session', { landing_page: currentPageURL, referrer: referrer }); |
} |
} |
// consent can change later in the same page view - catch that: |
// - if consent is granted, persist any session that was held in memory |
// - if consent (C0002) is revoked, write the opt-out marker and stop tracking storage for good |
window.addEventListener('OneTrustGroupsUpdated', function () { |
innrHandleConsentRevocation(); |
innrTryPersistPendingSession(); |
}); |
// --------------------------------------------------------------------------- |
// Phone number clicks |
// --------------------------------------------------------------------------- |
document.addEventListener('mousedown', function (e) { |
let currentEl = e.target; |
while (currentEl) { |
if (currentEl.tagName === 'A' && currentEl.hasAttribute('href') && /^tel:/i.test(currentEl.getAttribute('href'))) { |
const phoneNumber = currentEl.getAttribute('href') |
.replace(/<[^>]*>/g, '') |
.replace(/^tel:\/*/i, '') |
.trim(); |
innrCollectData('phone number click', { |
phone_number: phoneNumber, |
pageURL: document.location.href, |
mcreff: innrGetValidMcreff() |
}); |
break; |
} |
currentEl = currentEl.parentElement; |
} |
}); |
// --------------------------------------------------------------------------- |
// Lead forms (page + same-origin iframes) |
// A submit click only captures the lead in memory; the event is sent when G5 |
// signals a successful submission via its jQuery event G5FormResponseComplete. |
// --------------------------------------------------------------------------- |
const INNR_PENDING_LEAD_TTL_MS = 15000; // discard a captured lead if no success signal within 60s |
let innrPendingLead = null; |
function innrFindClosestInput(startEl, selector) { |
let container = startEl.parentElement; |
while (container) { |
const match = container.querySelector(selector); |
if (match) return match; |
container = container.parentElement; |
} |
return null; |
} |
function innrHandleClick(e) { |
const button = e.target.closest('input[type="submit"], button'); |
if (!button) return; |
const emailInput = |
innrFindClosestInput(button, 'input[type="email"]') || |
innrFindClosestInput(button, 'input[data-mapping="customer[email]"]') || |
innrFindClosestInput(button, 'input[name="email"]'); |
const phoneInput = |
innrFindClosestInput(button, 'input[type="tel"]') || |
innrFindClosestInput(button, 'input[data-mapping="customer[phone]"]') || |
innrFindClosestInput(button, 'input[name="tel"]'); |
if ((emailInput && emailInput.value) || (phoneInput && phoneInput.value)) { |
// hold the lead - it is only sent once G5 confirms the submission |
innrPendingLead = { |
email: emailInput ? emailInput.value : '', |
phone: phoneInput ? phoneInput.value : '', |
pageURL: document.location.href, |
capturedAt: Date.now() |
}; |
} |
} |
function innrSendPendingLead() { |
const lead = innrPendingLead; |
innrPendingLead = null; |
if (!lead) return; |
if (Date.now() - lead.capturedAt > INNR_PENDING_LEAD_TTL_MS) return; |
innrCollectData('form submitted', { |
email: lead.email, |
phone: lead.phone, |
pageURL: lead.pageURL, |
mcreff: innrGetValidMcreff() |
}, 0); |
} |
// G5 fires this with jQuery's trigger(), so it must be bound with jQuery - a native |
// window.addEventListener never sees it |
if (window.jQuery) { |
jQuery(window).on('G5FormResponseComplete', function () { |
innrSendPendingLead(); |
}); |
} |
function innrAttachToDoc(doc) { |
if (!doc || doc.__innrClickBound) return; |
try { |
doc.addEventListener('click', innrHandleClick); |
doc.__innrClickBound = true; |
} catch (err) { |
// cross-origin, can't attach |
} |
} |
function innrIsSameOrigin(iframe) { |
try { |
// throws if cross-origin |
void iframe.contentDocument.location.href; |
return true; |
} catch (err) { |
return false; |
} |
} |
function innrAttachToIframe(iframe) { |
if (!innrIsSameOrigin(iframe)) return; |
innrAttachToDoc(iframe.contentDocument); |
// content may not be ready yet (or gets replaced) - reattach on load |
if (!iframe.__innrLoadBound) { |
iframe.__innrLoadBound = true; |
iframe.addEventListener('load', function () { |
if (innrIsSameOrigin(iframe)) { |
innrAttachToDoc(iframe.contentDocument); |
} |
}); |
} |
} |
function innrScanIframes(root) { |
root.querySelectorAll('iframe').forEach(innrAttachToIframe); |
} |
// capture submit clicks on page |
innrAttachToDoc(document); |
// capture submit clicks in same-origin iframes |
innrScanIframes(document); |
// catch iframes added dynamically after page load |
new MutationObserver(function (mutations) { |
mutations.forEach(function (m) { |
m.addedNodes.forEach(function (node) { |
if (node.nodeType !== 1) return; |
if (node.tagName === 'IFRAME') innrAttachToIframe(node); |
else if (node.querySelectorAll) innrScanIframes(node); |
}); |
}); |
}).observe(document.documentElement, { childList: true, subtree: true }); |
</script> |

TWO MONTHS RENT FREE on classic apartment homes! *
ONE MONTH RENT FREE on all other floor plans! *
*The rent credit will be applied to the first full month's rent on new leases of 10 months or longer. To qualify, applicants must apply on or after 8/21/26 and move in by 9/26/26. Offer is subject to approval and may be modified or discontinued at any time.

TWO MONTHS RENT FREE on classic apartment homes! *
ONE MONTH RENT FREE on all other floor plans! *
*The rent credit will be applied to the first full month's rent on new leases of 10 months or longer. To qualify, applicants must apply on or after 8/21/26 and move in by 9/26/26. Offer is subject to approval and may be modified or discontinued at any time.
Would you like to be contacted about our community? Complete the form below and a member of our team will respond shortly.
Office Hours