1(function() { 2'use strict'; 3if (typeof window.inbTbConfig === 'undefined') { 4console.warn('[INB TB] Configuration not found'); 5return; 6} 7var config = window.inbTbConfig; 8var settings = config.settings || {}; 9var pageData = config.pageData || {}; 10function debug(message, data) { 11if (config.debug) { 12console.log('[INB TB] ' + message, data || ''); 13} 14} 15var LEAD_EVENTS = [ 16'lead_formularz_wyslany', 17'lead_formularz_wyslany_thp', 18'lead_z_formularza_w_tabeli_mieszkan' 19]; 20function classifyEvent(eventName) { 21if (LEAD_EVENTS.indexOf(eventName) !== -1) return 'lead'; 22if (/_click$|^wyswietlenie_|^otwarcie_|^telefon_|^email_|^wyznaczanie_/.test(eventName)) { 23return 'micro'; 24} 25return 'other'; 26} 27var _uidSeq = 0; 28function generateTxId(prefix) { 29_uidSeq++; 30return (prefix || 'lead') + '-' + Date.now() + '-' + _uidSeq + '-' + Math.floor(Math.random() * 1e6); 31} 32function pushEvent(eventName, eventData) { 33var payload = Object.assign({}, { 34event: eventName, 35event_category: classifyEvent(eventName), 36tb_version: config.version, 37page_type: pageData.page_type, 38page_path: pageData.page_path || location.pathname, 39page_url: location.href, 40page_title: pageData.page_title || document.title, 41site_language: pageData.site_language || document.documentElement.lang || '', 42debug_mode: config.debug 43}, eventData); 44window.dataLayer = window.dataLayer || []; 45window.dataLayer.push(payload); 46debug('Event pushed: ' + eventName, payload); 47if (config.debug) { 48storeEventLog(payload); 49} 50} 51function storeEventLog(event) { 52try { 53var logs = JSON.parse(sessionStorage.getItem('inb_tb_event_log') || '[]'); 54logs.push({ 55timestamp: new Date().toISOString(), 56event: event 57}); 58if (logs.length > 20) { 59logs = logs.slice(-20); 60} 61sessionStorage.setItem('inb_tb_event_log', JSON.stringify(logs)); 62} catch (e) { 63} 64} 65function matchesSelector(element, selector) { 66if (!selector || !element) return false; 67try { 68return element.matches(selector) || element.closest(selector) !== null; 69} catch (e) { 70return false; 71} 72} 73function getPhoneLocation(element) { 74var selectors = settings.selectors || {}; 75if (selectors.stickyPhone && matchesSelector(element, selectors.stickyPhone)) { 76return 'mobile_sticky'; 77} 78if (selectors.headerPhone && matchesSelector(element, selectors.headerPhone)) { 79return 'header_menu'; 80} 81if (selectors.footerPhone && matchesSelector(element, selectors.footerPhone)) { 82return 'footer'; 83} 84if (selectors.contactPhone && matchesSelector(element, selectors.contactPhone)) { 85return 'contact_page'; 86} 87if (element.closest('header') || element.closest('[data-tb-zone="header"]')) { 88return 'header_menu'; 89} 90if (element.closest('footer') || element.closest('[data-tb-zone="footer"]')) { 91return 'footer'; 92} 93if (element.closest('[data-tb-zone="sticky"]')) { 94return 'mobile_sticky'; 95} 96if (pageData.page_type === 'contact') { 97return 'contact_page'; 98} 99return settings.locationMode === 'strict' ? 'unknown' : 'content'; 100} 101function getFormLocation(formElement) { 102var selectors = settings.selectors || {}; 103if (selectors.footerForm && matchesSelector(formElement, selectors.footerForm)) { 104return 'footer'; 105} 106if (selectors.contactForm && matchesSelector(formElement, selectors.contactForm)) { 107return 'contact_page'; 108} 109if (selectors.homeForm && matchesSelector(formElement, selectors.homeForm)) { 110return 'home'; 111} 112if (selectors.landingForm && matchesSelector(formElement, selectors.landingForm)) { 113return 'landing'; 114} 115if (formElement.closest('footer') || formElement.closest('[data-tb-zone="footer"]')) { 116return 'footer'; 117} 118if (pageData.page_type === 'contact') { 119return 'contact_page'; 120} 121if (pageData.page_type === 'home') { 122return 'home'; 123} 124if (pageData.page_type === 'landing') { 125return 'landing'; 126} 127return settings.locationMode === 'strict' ? 'unknown' : 'content'; 128} 129function normalizePhoneNumber(href) { 130return href.replace('tel:', '').replace(/\s+/g, ''); 131} 132function getLinkText(element) { 133return element.innerText.trim() || 134element.getAttribute('aria-label') || 135element.getAttribute('title') || 136''; 137} 138function initPhoneClickTracking() { 139if (!settings.trackPhoneClick) return; 140document.addEventListener('click', function(e) { 141var link = e.target.closest('a[href^="tel:"]'); 142if (!link) return; 143var phoneNumber = normalizePhoneNumber(link.getAttribute('href')); 144var phoneLocation = getPhoneLocation(link); 145var isMobile = window.matchMedia('(max-width: 767px)').matches; 146pushEvent('telefon_click', { 147phone_number: phoneNumber, 148phone_location: phoneLocation, 149link_text: getLinkText(link), 150element_id: link.id || '', 151element_classes: (link.className || '').substring(0, 200), 152is_mobile: isMobile 153}); 154}, true); 155debug('Phone click tracking initialized'); 156} 157function normalizeEmailAddress(href) { 158return href.replace('mailto:', '').split('?')[0].trim(); 159} 160function initEmailClickTracking() { 161if (!settings.trackEmailClick) return; 162document.addEventListener('click', function(e) { 163var link = e.target.closest('a[href^="mailto:"]'); 164if (!link) return; 165var emailAddress = normalizeEmailAddress(link.getAttribute('href')); 166var emailLocation = getPhoneLocation(link); 167var isMobile = window.matchMedia('(max-width: 767px)').matches; 168pushEvent('email_click', { 169email_address: emailAddress, 170email_location: emailLocation, 171link_text: getLinkText(link), 172element_id: link.id || '', 173element_classes: (link.className || '').substring(0, 200), 174is_mobile: isMobile 175}); 176}, true); 177debug('Email click tracking initialized'); 178} 179function getFormIdentity(form) { 180if (!form) return { id: '', name: '' }; 181var id = form.id 182|| form.getAttribute('data-form-id') 183|| form.getAttribute('data-id') 184|| ''; 185var name = form.getAttribute('data-form-name') 186|| form.getAttribute('data-name') 187|| form.getAttribute('aria-label') 188|| (form.querySelector('h2,h3,h4') || {}).innerText 189|| ''; 190return { id: String(id).substring(0, 100), name: String(name).substring(0, 200) }; 191} 192var _formFired = {}; 193var DEDUP_WINDOW_MS = 1500; 194function getFormFingerprint(provider, form, identity, extra) { 195if (extra && extra.form_id) { 196return provider + '|id:' + extra.form_id; 197} 198if (identity.id) return provider + '|id:' + identity.id; 199if (identity.name) return provider + '|name:' + identity.name; 200if (form && form.nodeType === 1) { 201var path = []; 202var node = form; 203var depth = 0; 204while (node && node.nodeType === 1 && depth < 6) { 205var ix = 0; 206var sib = node; 207while ((sib = sib.previousElementSibling) !== null) { ix++; } 208path.unshift(node.nodeName + ':' + ix); 209node = node.parentElement; 210depth++; 211} 212return provider + '|dom:' + path.join('>'); 213} 214return provider + '|generic'; 215} 216function fireFormEvent(provider, form, extra) { 217if (!settings.trackLeadForm) return; 218var identity = getFormIdentity(form); 219var key = getFormFingerprint(provider, form, identity, extra); 220if (_formFired[key]) { 221debug('Duplikat pominiÄty (dedup): ' + key); 222return; 223} 224_formFired[key] = true; 225setTimeout(function() { delete _formFired[key]; }, DEDUP_WINDOW_MS); 226var eventId = generateTxId('lead'); 227pushEvent('lead_formularz_wyslany', Object.assign({ 228event_id: eventId, 229transaction_id: eventId, 230form_provider: provider, 231form_id: identity.id, 232form_name: identity.name, 233form_location: getFormLocation(form || document.body), 234element_id: (form || {}).id || '', 235element_classes: ((form || {}).className || '').substring(0, 200) 236}, extra || {})); 237debug('Form event fired: ' + provider, identity); 238} 239function initElementorFormTracking() { 240if (!settings.trackLeadForm) return; 241function getElementorFormId(form) { 242if (!form || !form.querySelector) return ''; 243var hidden = form.querySelector('input[name="form_id"]'); 244var fid = hidden && hidden.value ? String(hidden.value) : ''; 245return fid.substring(0, 100); 246} 247document.addEventListener('submit_success', function(e) { 248var form = e.target; 249if (!form || !form.classList || !form.classList.contains('elementor-form')) return; 250fireFormEvent('elementor', form, { form_id: getElementorFormId(form) }); 251}, true); 252if (typeof MutationObserver !== 'undefined') { 253var observer = new MutationObserver(function(mutations) { 254mutations.forEach(function(mutation) { 255if (mutation.type !== 'childList') return; 256var target = mutation.target; 257var el = target && target.closest ? target.closest('.elementor-form') : null; 258if (el && el.querySelector('.elementor-message-success')) { 259fireFormEvent('elementor', el, { form_id: getElementorFormId(el) }); 260} 261}); 262}); 263var allElementorForms = document.querySelectorAll('.elementor-form');
264allElementorForms.forEach(function(form) { 265observer.observe(form, { subtree: true, childList: true }); 266}); 267} 268if (typeof jQuery !== 'undefined') { 269jQuery(document).on('ajaxComplete', function(event, xhr, ajaxSettings) { 270var dataStr = ''; 271if (typeof ajaxSettings.data === 'string') { 272dataStr = ajaxSettings.data; 273} else if (ajaxSettings.data && typeof ajaxSettings.data.get === 'function') { 274try { dataStr = ajaxSettings.data.get('action') || ''; } catch(e) {} 275} else if (ajaxSettings.data && typeof ajaxSettings.data === 'object') { 276dataStr = ajaxSettings.data.action || ''; 277} 278if (dataStr.indexOf('elementor') !== -1 && dataStr.indexOf('form') !== -1) { 279try { 280var response = xhr.responseJSON || JSON.parse(xhr.responseText); 281var hasFieldErrors = response && response.data && ( 282response.data.errors || response.data.error 283); 284if (response && response.success === true && !hasFieldErrors) { 285var ajaxFormId = ''; 286if (typeof ajaxSettings.data === 'string') { 287var m = ajaxSettings.data.match(/(?:^|&)form_id=([^&]*)/); 288if (m) { try { ajaxFormId = decodeURIComponent(m[1]); } catch(e) { ajaxFormId = m[1]; } } 289} else if (ajaxSettings.data && typeof ajaxSettings.data.get === 'function') { 290try { ajaxFormId = ajaxSettings.data.get('form_id') || ''; } catch(e) {} 291} 292var form = null; 293if (ajaxFormId) { 294if (window.CSS && CSS.escape) { 295var hidden = document.querySelector('.elementor-form input[name="form_id"][value="' + CSS.escape(ajaxFormId) + '"]'); 296if (hidden && hidden.closest) form = hidden.closest('.elementor-form'); 297} else { 298var candidates = document.querySelectorAll('.elementor-form input[name="form_id"]'); 299for (var ci = 0; ci < candidates.length; ci++) { 300if (candidates[ci].value === ajaxFormId && candidates[ci].closest) { 301form = candidates[ci].closest('.elementor-form'); 302break; 303} 304} 305} 306} 307if (!form) { 308form = document.querySelector('.elementor-form:not(.elementor-form-waiting)'); 309} 310if (form || ajaxFormId) { 311fireFormEvent('elementor', form, { form_id: ajaxFormId || getElementorFormId(form) }); 312} 313} 314} catch (err) {} 315} 316}); 317} 318debug('Elementor form tracking initialized (success-only)'); 319} 320function initCF7FormTracking() { 321if (!settings.trackLeadForm) return; 322document.addEventListener('wpcf7mailsent', function(e) { 323var detail = e.detail || {}; 324var wrapper = e.target; 325var form = wrapper ? wrapper.querySelector('form') : null; 326var id = String(detail.contactFormId || (form && form.id) || ''); 327fireFormEvent('contact_form_7', form || wrapper, { form_id: id }); 328}); 329debug('Contact Form 7 tracking initialized'); 330} 331function initWPFormsTracking() { 332if (!settings.trackLeadForm) return; 333if (typeof jQuery !== 'undefined') { 334jQuery(document).on('wpformsAjaxSubmitSuccess', function(e, response, formData) { 335var formId = response && response.data && response.data.form_id; 336var formEl = document.querySelector('#wpforms-form-' + formId); 337fireFormEvent('wpforms', formEl, { form_id: String(formId || '') }); 338}); 339} 340if (typeof MutationObserver !== 'undefined') { 341var wpfObserver = new MutationObserver(function(mutations) { 342mutations.forEach(function(mutation) { 343if (mutation.type !== 'childList') return; 344var target = mutation.target; 345var container = target && target.closest ? target.closest('.wpforms-container') : null; 346if (container && container.querySelector('.wpforms-confirmation-container, .wpforms-confirmation-container-full')) { 347var form = container.querySelector('form'); 348fireFormEvent('wpforms', form || container); 349} 350}); 351}); 352document.querySelectorAll('.wpforms-container').forEach(function(c) { 353wpfObserver.observe(c, { subtree: true, childList: true }); 354}); 355} 356debug('WPForms tracking initialized (success-only)'); 357} 358function initGravityFormsTracking() { 359if (!settings.trackLeadForm) return; 360if (typeof jQuery !== 'undefined') { 361jQuery(document).on('gform_confirmation_loaded', function(e, formId) { 362var formEl = document.querySelector('#gform_' + formId); 363fireFormEvent('gravity_forms', formEl, { form_id: String(formId) }); 364}); 365jQuery(document).on('gform_post_render', function(e, formId, currentPage) { 366if (currentPage === 1) return; 367}); 368} 369debug('Gravity Forms tracking initialized'); 370} 371function initNinjaFormsTracking() { 372if (!settings.trackLeadForm) return; 373document.addEventListener('nfFormSubmitResponse', function(e) { 374var detail = e.detail || {}; 375var response = detail.response || {}; 376var hasErrors = (response.errors && ( 377(response.errors.fields && Object.keys(response.errors.fields).length) || 378(response.errors.form && Object.keys(response.errors.form).length) 379)); 380if (hasErrors) {
381debug('Ninja Forms: odpowiedź z bÅÄdami walidacji - pomijam'); 382return; 383} 384var formId = String(detail.id || detail.formId || (response.data && response.data.form_id) || ''); 385var formEl = document.querySelector('#nf-form-' + formId + '-cont'); 386fireFormEvent('ninja_forms', formEl, { form_id: formId }); 387}); 388debug('Ninja Forms tracking initialized'); 389} 390function initFluentFormsTracking() { 391if (!settings.trackLeadForm) return; 392if (typeof jQuery !== 'undefined') { 393jQuery(document).on('fluentform_submission_success', function(e, response, formId) { 394var formEl = document.querySelector('#fluentform_' + formId); 395fireFormEvent('fluent_forms', formEl, { form_id: String(formId || '') }); 396}); 397} 398debug('Fluent Forms tracking initialized'); 399} 400function initMetFormTracking() { 401if (!settings.trackLeadForm) return; 402if (typeof jQuery !== 'undefined') { 403jQuery(document).on('metform:submit:success', function(e) { 404var formEl = e.target || document.body; 405fireFormEvent('metform', formEl); 406}); 407} 408debug('MetForm tracking initialized'); 409} 410function initAvadaFormTracking() { 411if (!settings.trackLeadForm) return; 412document.addEventListener('fusionFormSubmitSuccess', function(e) { 413var wrapper = e.target; 414var form = wrapper ? wrapper.querySelector('form') : null; 415fireFormEvent('avada_fusion_forms', form || wrapper); 416}); 417debug('Avada Fusion Forms tracking initialized'); 418} 419function initNativeFallbackFormTracking() { 420if (!settings.trackLeadForm) return; 421var LEAD_SELECTORS = [ 422'.wpcf7-form', 423'.elementor-form', 424'.gform_form', 425'.nf-form-cont form', 426'.ff-form-wrap form', 427'.fusion-form form', 428'.metform-form form', 429'.wpforms-form', 430'[class*="contact"] form', 431'[class*="kontakt"] form', 432'[id*="contact"] form', 433'[id*="kontakt"] form', 434'form[class*="contact"]', 435'form[class*="kontakt"]', 436'form[id*="contact"]', 437'form[id*="kontakt"]', 438]; 439var SKIP_IF_PROVIDER_CLASS = [ 440'wpcf7-form', 441'elementor-form', 442'gform_form', 443'ff-form-wrap', 444'metform-form', 445'wpforms-form', 446'inb-ef-form', 447'inb-nl-form', 448'inb-nl-confirm-form', 449]; 450function isSearchOrFilterForm(form) { 451if ((form.getAttribute('role') || '').toLowerCase() === 'search') return true; 452var method = (form.getAttribute('method') || 'get').toLowerCase(); 453if (method !== 'post') return true; 454if (form.querySelector('input[type="search"]')) return true; 455var blob = ((form.className || '') + ' ' + (form.id || '')).toLowerCase(); 456if (/search|szukaj|wyszuk|filter|filtr|newsletter|subscribe|zapis/.test(blob)) return true; 457var hasContactField = form.querySelector( 458'input[type="email"], input[type="tel"], input[name*="email" i], input[name*="mail" i], input[name*="phone" i], input[name*="tel" i]' 459); 460if (!hasContactField) return true; 461return false; 462} 463function requiredConsentsChecked(form) { 464var requiredBoxes = form.querySelectorAll('input[type="checkbox"][required]'); 465for (var i = 0; i < requiredBoxes.length; i++) { 466if (!requiredBoxes[i].checked) return false; 467} 468return true; 469} 470function hasSuccessConfirmation(container) { 471if (!container) return false; 472if (container.querySelector( 473'.elementor-message-success, .wpcf7-mail-sent-ok, .frm_message, .nf-response-msg, ' + 474'[class*="success" i]:not(input):not(button), [class*="sent" i]:not(input):not(button), ' + 475'[class*="thank" i]:not(input):not(button), [class*="confirm" i]:not(input):not(button)' 476)) return true; 477var text = (container.textContent || '').toLowerCase(); 478if (/dziÄkuj|dziekuj|zgÅoszenie zostaÅo|zgloszenie zostalo|pomyÅlnie przesÅane|pomyslnie przeslane|wiadomoÅÄ zostaÅa wysÅana|wiadomosc zostala wyslana|formularz zosta|message has been sent|thank you|successfully/.test(text)) return true; 479return false; 480} 481document.addEventListener('submit', function(e) { 482var form = e.target; 483if (!form || form.tagName !== 'FORM') return; 484if (form.id === 'mrep-contact-form' || 485(form.closest && form.closest('.mrep-popup, .mrep-offer-popup, [class*="mrep"]'))) { 486return; 487} 488var classes = (form.className || '') + ' ' + ((form.closest('[class]') || {}).className || ''); 489for (var i = 0; i < SKIP_IF_PROVIDER_CLASS.length; i++) { 490if (classes.indexOf(SKIP_IF_PROVIDER_CLASS[i]) !== -1) return; 491} 492var isLeadForm = LEAD_SELECTORS.some(function(sel) { 493try { return form.matches(sel) || form.closest(sel) !== null; } catch(x) { return false; } 494}); 495if (!isLeadForm) return; 496if (isSearchOrFilterForm(form)) { 497debug('Native fallback: pominiÄto formularz wyszukiwania/filtra'); 498return; 499} 500if (typeof form.checkValidity === 'function' && !form.checkValidity()) { 501debug('Native fallback: formularz nie przeszedÅ walidacji - pomijam'); 502return; 503} 504if (!requiredConsentsChecked(form)) { 505debug('Native fallback: wymagane zgody niezaznaczone - pomijam'); 506return; 507}
508var container = form.closest('div, section, article') || form.parentNode || form; 509var fired = false; 510function tryFire() { 511if (fired) return false; 512if (hasSuccessConfirmation(container)) { 513fired = true; 514fireFormEvent('native_html5', form); 515return true; 516} 517return false; 518} 519if (tryFire()) return; 520var observer = new MutationObserver(function() { tryFire(); }); 521observer.observe(container, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ['class', 'style'] }); 522setTimeout(function() { 523observer.disconnect(); 524if (!fired) { 525debug('Native fallback: brak potwierdzenia wysÅania w oknie czasowym - konwersji nie liczono'); 526} 527}, 6000); 528}, true); 529debug('Native fallback form tracking initialized'); 530} 531function initCalendarClickTracking() { 532if (!settings.trackCalendarClick) return; 533var patterns = settings.calendarPatterns || []; 534var linkSelector = settings.calendarLinkSelector || ''; 535if (patterns.length === 0) return; 536document.addEventListener('click', function(e) { 537var link = e.target.closest('a[href]'); 538if (!link) return; 539var href = link.getAttribute('href'); 540if (!href) return; 541if (linkSelector && !matchesSelector(link, linkSelector)) { 542return; 543} 544var matched = false; 545var matchedRule = ''; 546for (var i = 0; i < patterns.length; i++) { 547var pattern = patterns[i]; 548var patternValue = pattern.pattern || ''; 549if (!patternValue) continue; 550switch (pattern.match_type) { 551case 'contains': 552if (href.indexOf(patternValue) !== -1) { 553matched = true; 554matchedRule = 'contains:' + patternValue; 555} 556break; 557case 'starts_with': 558if (href.indexOf(patternValue) === 0) { 559matched = true; 560matchedRule = 'starts_with:' + patternValue; 561} 562break; 563case 'regex': 564try { 565if (new RegExp(patternValue).test(href)) { 566matched = true; 567matchedRule = 'regex:' + patternValue; 568} 569} catch (err) { 570debug('Invalid regex pattern: ' + patternValue); 571} 572break; 573} 574if (matched) break; 575} 576if (!matched) return; 577var linkLocation = getPhoneLocation(link); 578pushEvent('otwarcie_kalendarza', { 579calendar_provider: 'ms_bookings', 580link_url: href, 581link_text: getLinkText(link), 582link_location: linkLocation, 583matched_rule: matchedRule, 584is_outbound: href.indexOf(location.hostname) === -1 585}); 586}, true); 587debug('Calendar click tracking initialized'); 588} 589function initThankYouTracking() { 590if (!settings.trackThankyou) return; 591var rules = settings.thankyouRules || []; 592if (rules.length === 0) return; 593var currentPath = location.pathname + location.search; 594for (var i = 0; i < rules.length; i++) { 595var rule = rules[i]; 596var pattern = rule.pattern || ''; 597var matched = false; 598if (!pattern) continue; 599switch (rule.match_type) { 600case 'contains': 601matched = currentPath.indexOf(pattern) !== -1; 602break; 603case 'exact': 604matched = currentPath === pattern; 605break; 606case 'regex': 607try { 608matched = new RegExp(pattern).test(currentPath); 609} catch (err) { 610debug('Invalid regex pattern: ' + pattern); 611} 612break; 613} 614if (matched) { 615if (rule.fire_once) { 616var firedKey = 'inb_tb_thankyou_' + i; 617if (sessionStorage.getItem(firedKey)) { 618debug('Thank you rule already fired this session: ' + rule.rule_name); 619continue; 620} 621sessionStorage.setItem(firedKey, '1'); 622} 623var thpEventId = generateTxId('thp-' + (rule.rule_name || String(i))); 624pushEvent('lead_formularz_wyslany_thp', { 625event_id: thpEventId, 626transaction_id: thpEventId, 627thankyou_rule_id: rule.rule_name || String(i), 628thankyou_rule_pattern: pattern 629}); 630} 631} 632debug('Thank you page tracking initialized'); 633} 634function initPropertyPdfTracking() { 635if (!settings.trackPropertyPdf) return; 636document.addEventListener('click', function(e) { 637var link = e.target.closest('.mrep-pdf-link'); 638if (!link) return; 639var href = link.getAttribute('href') || ''; 640var row = link.closest('tr'); 641var propertyId = ''; 642var propertyNumber = ''; 643if (row) { 644var idCell = row.querySelector('.col-key-id .cell-content'); 645var numberCell = row.querySelector('.col-key-number .cell-content'); 646propertyId = idCell ? idCell.textContent.trim() : ''; 647propertyNumber = numberCell ? numberCell.textContent.trim() : ''; 648} 649pushEvent('wyswietlenie_karty_mieszkania', { 650property_id: propertyId, 651property_number: propertyNumber, 652pdf_url: href, 653conversion_type: 'micro' 654});
655if (settings.propertyPdfAsDownload) { 656var pdfPath = href.split('#')[0].split('?')[0]; 657var pdfExt = (pdfPath.match(/\.([a-z0-9]{1,8})$/i) || [null, 'pdf'])[1].toLowerCase(); 658pushEvent('pobranie_pliku', { 659file_url: href, 660file_name: (pdfPath.split('/').pop() || '').substring(0, 150), 661file_extension: pdfExt, 662property_id: propertyId, 663conversion_type: 'micro' 664}); 665} 666}, true); 667debug('Property PDF click tracking initialized'); 668} 669function initFileDownloadTracking() { 670if (!settings.trackFileDownload) return; 671var extList = String(settings.downloadExtensions || 'pdf,doc,docx,xls,xlsx,zip,rar') 672.toLowerCase().split(',') 673.map(function (e) { return e.replace(/[^a-z0-9]/g, ''); }) 674.filter(function (e) { return e.length > 0 && e.length <= 8; }); 675if (!extList.length) return; 676document.addEventListener('click', function (e) { 677var link = e.target.closest('a[href]'); 678if (!link) return; 679var href = link.getAttribute('href') || ''; 680if (!href || href.indexOf('#') === 0 || /^(mailto|tel):/i.test(href)) return; 681var path = href.split('#')[0].split('?')[0]; 682var m = path.match(/\.([a-z0-9]{1,8})$/i); 683if (!m) return; 684var ext = m[1].toLowerCase(); 685if (extList.indexOf(ext) === -1) return; 686if (link.classList && link.classList.contains('mrep-pdf-link')) return; 687var fileName = path.split('/').pop() || ''; 688pushEvent('pobranie_pliku', { 689file_url: href, 690file_name: fileName.substring(0, 150), 691file_extension: ext, 692link_text: (link.textContent || '').trim().substring(0, 100), 693link_location: getPhoneLocation(link), 694conversion_type: 'micro' 695}); 696}, true); 697debug('File download tracking initialized (' + extList.join(',') + ')'); 698} 699function initPropertyInquiryClickTracking() { 700if (!settings.trackPropertyInquiryClick) return; 701document.addEventListener('click', function(e) { 702var btn = e.target.closest('.mrep-offer-btn'); 703if (!btn) return; 704var propertyId = btn.getAttribute('data-id') || ''; 705var buttonText = btn.textContent.trim(); 706pushEvent('wyswietlenie_formularza_w_tabeli_mieszkan', { 707property_id: propertyId, 708button_text: buttonText, 709conversion_type: 'micro' 710}); 711}, true); 712debug('Property inquiry click tracking initialized'); 713} 714function initPropertyInquirySubmitTracking() { 715if (!settings.trackPropertyInquirySubmit) return; 716var _propertyFired = {}; 717if (typeof jQuery !== 'undefined') { 718jQuery(document).on('ajaxComplete', function(event, xhr, ajaxSettings) { 719if (ajaxSettings.data && ajaxSettings.data.indexOf('mrep_submit_form') !== -1) { 720try { 721var response = JSON.parse(xhr.responseText); 722if (response.success) { 723var apartmentId = ''; 724var match = ajaxSettings.data.match(/apartment_id=([^&]*)/); 725if (match) { 726apartmentId = decodeURIComponent(match[1]); 727} 728var pKey = 'mrep:' + (apartmentId || 'unknown'); 729if (_propertyFired[pKey]) { 730debug('Duplikat formularza tabeli pominiÄty: ' + pKey); 731return; 732} 733_propertyFired[pKey] = true; 734setTimeout(function() { delete _propertyFired[pKey]; }, 1500); 735var pEventId = generateTxId('mrep'); 736pushEvent('lead_z_formularza_w_tabeli_mieszkan', { 737event_id: pEventId, 738transaction_id: pEventId, 739property_id: apartmentId, 740form_provider: 'tabela_mieszkan', 741conversion_type: 'lead' 742}); 743} 744} catch (err) { 745debug('Error parsing AJAX response: ' + err.message); 746} 747} 748}); 749} 750debug('Property inquiry submit tracking initialized'); 751} 752function initMapsDirectionsTracking() { 753if (!settings.trackMapsDirections) return; 754var mapsPatterns = [ 755'google.com/maps/dir', 756'google.pl/maps/dir', 757'maps.google.com/maps?daddr', 758'maps.google.pl/maps?daddr', 759'google.com/maps/place', 760'google.pl/maps/place', 761'google.com/maps?q=', 762'google.pl/maps?q=', 763'google.com/maps/@', 764'google.pl/maps/@', 765'maps.app.goo.gl', 766'goo.gl/maps' 767]; 768var directionsButtonSelectors = [ 769'a[href*="maps"][href*="dir"]', 770'a[href*="daddr="]', 771'a[href*="destination="]', 772'.gm-style a[href*="maps"]', 773'.wpgmza_directions_button', 774'.wpgmza-directions', 775'a.wpgmza_gd', 776'.mmp-directions', 777'a[data-directions]', 778'.map-container a[href*="google"]', 779'.google-map a[href*="google"]', 780'[class*="map"] a[href*="google.com/maps"]', 781'[class*="map"] a[href*="google.pl/maps"]', 782'.elementor-widget-google_maps a', 783'.et_pb_map a', 784'a[href*="maps"][class*="direction"]', 785'a[href*="maps"][class*="route"]', 786'a[href*="maps"][class*="dojazd"]', 787'a[href*="maps"][class*="trasa"]', 788]; 789document.addEventListener('click', function(e) { 790var link = e.target.closest('a[href]'); 791if (!link) return; 792var href = link.getAttribute('href') || ''; 793var isGoogleMapsLink = false;
794var isDirectionsLink = false; 795for (var i = 0; i < mapsPatterns.length; i++) { 796if (href.indexOf(mapsPatterns[i]) !== -1) { 797isGoogleMapsLink = true; 798if (href.indexOf('/dir') !== -1 || href.indexOf('daddr') !== -1 || href.indexOf('destination=') !== -1) { 799isDirectionsLink = true; 800} 801break; 802} 803} 804if (!isGoogleMapsLink) { 805for (var j = 0; j < directionsButtonSelectors.length; j++) { 806try { 807if (link.matches(directionsButtonSelectors[j])) { 808isGoogleMapsLink = true; 809isDirectionsLink = true; 810break; 811} 812} catch (err) {} 813} 814} 815if (!isGoogleMapsLink) return; 816var linkLocation = getPhoneLocation(link); 817pushEvent('wyznaczanie_trasy_click', { 818link_url: href, 819link_text: getLinkText(link), 820link_location: linkLocation, 821conversion_type: isDirectionsLink ? 'directions' : 'map_view', 822is_directions: isDirectionsLink 823}); 824debug('Maps click tracked: ' + (isDirectionsLink ? 'directions' : 'map_view')); 825}, true); 826document.addEventListener('click', function(e) { 827var mapButton = e.target.closest( 828'[onclick*="maps.google"], ' + 829'[onclick*="google.com/maps"], ' + 830'[data-map-url], ' + 831'[data-directions-url], ' + 832'.open-map-btn, ' + 833'.directions-btn, ' + 834'.map-directions, ' + 835'.get-directions' 836); 837if (!mapButton) return; 838if (mapButton.tagName === 'A' && mapButton.getAttribute('href')) return; 839var mapUrl = mapButton.getAttribute('data-map-url') 840|| mapButton.getAttribute('data-directions-url') 841|| mapButton.getAttribute('onclick') || ''; 842pushEvent('wyznaczanie_trasy_click', { 843link_url: mapUrl.substring(0, 500), 844link_text: getLinkText(mapButton) || mapButton.innerText.trim(), 845link_location: getPhoneLocation(mapButton), 846conversion_type: 'button_click', 847is_directions: true 848}); 849debug('Maps button click tracked'); 850}, true); 851debug('Google Maps tracking initialized (enhanced)'); 852} 853function initCustomLinksTracking() { 854if (!settings.trackCustomLinks) return; 855var customLinks = settings.customLinks || []; 856if (customLinks.length === 0) return; 857document.addEventListener('click', function(e) { 858var link = e.target.closest('a[href]'); 859if (!link) return; 860var href = link.getAttribute('href') || ''; 861var matched = false; 862var matchedLink = null; 863for (var i = 0; i < customLinks.length; i++) { 864var linkConfig = customLinks[i]; 865var pattern = linkConfig.url || ''; 866if (!pattern) continue; 867switch (linkConfig.match_type) { 868case 'contains': 869if (href.indexOf(pattern) !== -1) { 870matched = true; 871matchedLink = linkConfig; 872} 873break; 874case 'exact': 875if (href === pattern) { 876matched = true; 877matchedLink = linkConfig; 878} 879break; 880case 'starts_with': 881if (href.indexOf(pattern) === 0) { 882matched = true; 883matchedLink = linkConfig; 884} 885break; 886case 'regex': 887try { 888if (new RegExp(pattern).test(href)) { 889matched = true; 890matchedLink = linkConfig; 891} 892} catch (err) { 893debug('Invalid regex pattern: ' + pattern); 894} 895break; 896} 897if (matched) break; 898} 899if (!matched || !matchedLink) return; 900var linkLocation = getPhoneLocation(link); 901var rawName = (matchedLink.name || 'link').trim(); 902var eventName = rawName 903.toLowerCase() 904.replace(/\s+/g, '_') 905.replace(/[^a-z0-9_]/g, '') 906+ '_link_click'; 907pushEvent(eventName, { 908link_name: matchedLink.name || '', 909link_url: href, 910link_text: getLinkText(link), 911link_location: linkLocation, 912matched_pattern: matchedLink.url, 913match_type: matchedLink.match_type 914}); 915}, true); 916debug('Custom links tracking initialized'); 917} 918function init() { 919debug('Initializing tracker v' + config.version); 920debug('Page data:', pageData); 921debug('Settings:', settings); 922initPhoneClickTracking(); 923initEmailClickTracking(); 924initElementorFormTracking(); 925initCF7FormTracking(); 926initWPFormsTracking(); 927initGravityFormsTracking(); 928initNinjaFormsTracking(); 929initFluentFormsTracking(); 930initMetFormTracking(); 931initAvadaFormTracking(); 932initNativeFallbackFormTracking(); 933initCalendarClickTracking(); 934initThankYouTracking(); 935initPropertyPdfTracking(); 936initPropertyInquiryClickTracking(); 937initPropertyInquirySubmitTracking(); 938initMapsDirectionsTracking(); 939initCustomLinksTracking(); 940initFileDownloadTracking(); 941debug('All tracking modules initialized'); 942} 943if (document.readyState === 'loading') { 944document.addEventListener('DOMContentLoaded', init); 945} else { 946init(); 947} 948})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.