<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="https://marketing.moosemediafsj.ca/wp-sitemap-index.xsl" ?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap><loc>https://marketing.moosemediafsj.ca/wp-sitemap-posts-post-1.xml</loc></sitemap><sitemap><loc>https://marketing.moosemediafsj.ca/wp-sitemap-posts-page-1.xml</loc></sitemap><sitemap><loc>https://marketing.moosemediafsj.ca/wp-sitemap-posts-product-1.xml</loc></sitemap><sitemap><loc>https://marketing.moosemediafsj.ca/wp-sitemap-taxonomies-category-1.xml</loc></sitemap><sitemap><loc>https://marketing.moosemediafsj.ca/wp-sitemap-taxonomies-product_cat-1.xml</loc></sitemap><sitemap><loc>https://marketing.moosemediafsj.ca/wp-sitemap-users-1.xml</loc></sitemap></sitemapindex>


<!-- MM Remote Tracker Script Start -->
<script type="text/javascript" id="mm-remote-tracker-inline">
console.log("MM Remote Tracker: Script is loading at 2026-04-05 23:52:25!");
window.mmRemoteTrackerConfig={"ajaxUrl":"https:\/\/marketing.moosemediafsj.ca\/wp-admin\/admin-ajax.php","nonce":"cf8f40e8d1"};
(function (window, document) {
  'use strict';

  if (!window || !document) {
    return;
  }

  console.log('MM Remote Tracker: Script loaded at ' + new Date().toISOString());
  
  var config;
  var trackingInProgress = false;
  var initialized = false;

  function setCookie(name, value, days) {
    try {
      var expires = new Date();
      expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);
      
      // Build cookie string with all required attributes
      var cookieString = name + '=' + encodeURIComponent(value);
      cookieString += '; expires=' + expires.toUTCString();
      cookieString += '; path=/';
      cookieString += '; SameSite=Lax';
      
      // Add domain for cross-page support
      var hostname = window.location.hostname;
      console.log('MM Remote Tracker: Hostname for cookie:', hostname);
      
      // Skip localhost/IP addresses
      if (hostname !== 'localhost' && !hostname.match(/^\d+\.\d+\.\d+\.\d+$/)) {
        var parts = hostname.split('.');
        var domain;
        
        if (parts.length >= 2) {
          // Get base domain (last 2 parts: example.com from sub.example.com)
          domain = parts.slice(-2).join('.');
          // Add leading dot for subdomain compatibility
          cookieString += '; domain=.' + domain;
          console.log('MM Remote Tracker: Setting cookie with domain=.' + domain);
        }
      }
      
      console.log('MM Remote Tracker: Cookie string:', cookieString);
      document.cookie = cookieString;
      
      // Verify cookie was set
      var test = getCookie(name);
      if (!test) {
        console.warn('MM Remote Tracker: Cookie not found after setting. Cookies may be blocked.');
        console.log('MM Remote Tracker: All cookies:', document.cookie);
        return false;
      }
      console.log('MM Remote Tracker: Cookie set successfully:', name, 'Value:', test.substring(0, 50) + '...');
      return true;
    } catch (e) {
      console.warn('MM Remote Tracker: Failed to set cookie:', e);
      return false;
    }
  }

  function getCookie(name) {
    var nameEQ = name + '=';
    var cookies = document.cookie.split(';');
    for (var i = 0; i < cookies.length; i += 1) {
      var cookie = cookies[i].trim();
      if (cookie.indexOf(nameEQ) === 0) {
        return decodeURIComponent(cookie.substring(nameEQ.length));
      }
    }
    return null;
  }

  function setLocalStorage(key, value) {
    try {
      window.localStorage.setItem(key, value);
      return true;
    } catch (e) {
      console.warn('MM Remote Tracker: Failed to set localStorage:', e);
      return false;
    }
  }

  function getLocalStorage(key) {
    try {
      return window.localStorage.getItem(key);
    } catch (e) {
      console.warn('MM Remote Tracker: Failed to get localStorage:', e);
      return null;
    }
  }

  function getContactFromPortalCookie() {
    try {
      var cookieValue = getCookie('mmca_tracking_session');
      if (cookieValue) {
        // Check for suspiciously large cookies
        if (cookieValue.length > 5000) {
          console.error('MM Remote Tracker: Portal cookie is too large (' + cookieValue.length + ' bytes) - clearing corrupted cookie');
          document.cookie = 'mmca_tracking_session=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
          return { contact_id: '', contact_email: '' };
        }
        
        console.log('MM Remote Tracker: Raw portal cookie (first 100 chars):', cookieValue.substring(0, 100));
        var decoded = window.atob(cookieValue);
        console.log('MM Remote Tracker: Decoded portal cookie (first 100 chars):', decoded.substring(0, 100));
        var data = JSON.parse(decoded);
        return {
          contact_id: data.contact_id || '',
          contact_email: data.contact_email || '',
        };
      }
    } catch (e) {
      console.error('MM Remote Tracker: Failed to parse portal cookie:', e);
      console.error('MM Remote Tracker: Cookie value length:', cookieValue ? cookieValue.length : 0);
      if (cookieValue && cookieValue.length > 100) {
        console.error('MM Remote Tracker: Portal cookie corrupted. First 200 chars:', cookieValue.substring(0, 200));
      }
      // Clear corrupted portal cookie
      console.warn('MM Remote Tracker: Clearing corrupted portal cookie');
      document.cookie = 'mmca_tracking_session=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
    }
    return { contact_id: '', contact_email: '' };
  }

  function setContactCookie(contactId, contactEmail) {
    if (!contactId && !contactEmail) {
      return false;
    }

    var cookieData = {
      contact_id: contactId || '',
      contact_email: contactEmail || '',
      timestamp: Date.now(),
    };

    var cookieSet = setCookie('mmct_contact_info', JSON.stringify(cookieData), 30);
    var verify = getCookie('mmct_contact_info');
    console.log(
      'MM Remote Tracker: setContactCookie called - id=',
      contactId,
      'email=',
      contactEmail,
      'cookieSet=',
      cookieSet,
      'verify=',
      verify ? 'found' : 'not found'
    );

    return cookieSet;
  }

  function getContactFromCookie() {
    try {
      var cookieValue = getCookie('mmct_contact_info');
      console.log('MM Remote Tracker: getContactFromCookie - cookieValue=', cookieValue);
      if (cookieValue) {
        // Check for suspiciously large cookies (normal cookie should be ~100-200 bytes)
        if (cookieValue.length > 5000) {
          console.error('MM Remote Tracker: Cookie is too large (' + cookieValue.length + ' bytes) - clearing corrupted cookie');
          // Clear the corrupted cookie
          document.cookie = 'mmct_contact_info=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
          return { contact_id: '', contact_email: '' };
        }
        
        // Check if cookie value looks like valid JSON
        if (!cookieValue.startsWith('{') || !cookieValue.endsWith('}')) {
          console.warn('MM Remote Tracker: Invalid cookie format - not JSON object. Clearing cookie.');
          document.cookie = 'mmct_contact_info=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
          return { contact_id: '', contact_email: '' };
        }
        
        var data = JSON.parse(cookieValue);
        console.log('MM Remote Tracker: getContactFromCookie - parsed data=', data);
        return {
          contact_id: data.contact_id || '',
          contact_email: data.contact_email || '',
        };
      }
    } catch (e) {
      console.error('MM Remote Tracker: Failed to parse tracker cookie:', e);
      console.error('MM Remote Tracker: Cookie length:', cookieValue ? cookieValue.length : 0);
      if (cookieValue && cookieValue.length > 100) {
        console.error('MM Remote Tracker: Cookie appears corrupted. First 200 chars:', cookieValue.substring(0, 200));
        console.error('MM Remote Tracker: Last 200 chars:', cookieValue.substring(cookieValue.length - 200));
      }
      // Clear the corrupted cookie
      console.warn('MM Remote Tracker: Clearing corrupted cookie');
      document.cookie = 'mmct_contact_info=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
    }
    return { contact_id: '', contact_email: '' };
  }

  function getContactInfo() {
    var urlParams = new URLSearchParams(window.location.search);
    var urlContactId = urlParams.get('mmct_contact_id');
    var urlContactEmail = urlParams.get('mmct_contact_email');

    if (urlContactId || urlContactEmail) {
      setContactCookie(urlContactId, urlContactEmail);
      if (urlContactId) {
        setLocalStorage('mmct_contact_id', urlContactId);
      }
      if (urlContactEmail) {
        setLocalStorage('mmct_contact_email', urlContactEmail);
      }
      return {
        contact_id: urlContactId || '',
        contact_email: urlContactEmail || '',
      };
    }

    var cookieContact = getContactFromCookie();
    if (cookieContact.contact_id || cookieContact.contact_email) {
      if (cookieContact.contact_id) {
        setLocalStorage('mmct_contact_id', cookieContact.contact_id);
      }
      if (cookieContact.contact_email) {
        setLocalStorage('mmct_contact_email', cookieContact.contact_email);
      }
      return cookieContact;
    }

    var portalCookie = getContactFromPortalCookie();
    if (portalCookie.contact_id || portalCookie.contact_email) {
      setContactCookie(portalCookie.contact_id, portalCookie.contact_email);
      if (portalCookie.contact_id) {
        setLocalStorage('mmct_contact_id', portalCookie.contact_id);
      }
      if (portalCookie.contact_email) {
        setLocalStorage('mmct_contact_email', portalCookie.contact_email);
      }
      return portalCookie;
    }

    var storedId = getLocalStorage('mmct_contact_id');
    var storedEmail = getLocalStorage('mmct_contact_email');
    if (storedId || storedEmail) {
      setContactCookie(storedId, storedEmail);
      return {
        contact_id: storedId || '',
        contact_email: storedEmail || '',
      };
    }

    return { contact_id: '', contact_email: '' };
  }

  function sendAjaxRequest(data, callback) {
    if (!config || !config.ajaxUrl) {
      console.error('MM Remote Tracker: Cannot send request - config not available');
      if (callback && callback.error) {
        callback.error(0, 'Config not available');
      }
      return;
    }

    // Check if ajaxUrl is valid
    if (!config.ajaxUrl || config.ajaxUrl.indexOf('admin-ajax.php') === -1) {
      console.error('MM Remote Tracker: Invalid AJAX URL:', config.ajaxUrl);
      if (callback && callback.error) {
        callback.error(0, 'Invalid AJAX URL');
      }
      return;
    }

    var formData = new FormData();
    for (var key in data) {
      if (data.hasOwnProperty(key)) {
        formData.append(key, data[key]);
      }
    }

    var xhr = new XMLHttpRequest();
    xhr.open('POST', config.ajaxUrl, true);
    xhr.timeout = 10000; // 10 second timeout
    
    xhr.onload = function () {
      if (xhr.status >= 200 && xhr.status < 300) {
        if (callback && callback.success) {
          callback.success(xhr.responseText);
        }
      } else {
        console.warn('MM Remote Tracker: Request failed with status:', xhr.status);
        if (callback && callback.error) {
          callback.error(xhr.status, xhr.responseText);
        }
      }
    };
    
    xhr.onerror = function () {
      console.warn('MM Remote Tracker: Network error sending request to:', config.ajaxUrl);
      if (callback && callback.error) {
        callback.error(0, 'Network error');
      }
    };
    
    xhr.ontimeout = function () {
      console.warn('MM Remote Tracker: Request timeout');
      if (callback && callback.error) {
        callback.error(0, 'Request timeout');
      }
    };
    
    try {
      xhr.send(formData);
    } catch (e) {
      console.error('MM Remote Tracker: Exception sending request:', e);
      if (callback && callback.error) {
        callback.error(0, 'Exception: ' + e.message);
      }
    }
  }

  function trackPageView() {
    // Prevent concurrent tracking requests
    if (trackingInProgress) {
      console.log('MM Remote Tracker: Tracking already in progress, skipping duplicate call');
      return;
    }

    var contact = getContactInfo();

    console.log('MM Remote Tracker: getContactInfo() returned:', contact);
    console.log('MM Remote Tracker: Cookie mmct_contact_info =', getCookie('mmct_contact_info'));
    console.log('MM Remote Tracker: localStorage mmct_contact_id =', getLocalStorage('mmct_contact_id'));
    console.log(
      'MM Remote Tracker: localStorage mmct_contact_email =',
      getLocalStorage('mmct_contact_email')
    );

    if (!contact.contact_id && !contact.contact_email) {
      console.warn('MM Remote Tracker: Skipping page view - no contact info available', {
        mmct_contact_id: new URLSearchParams(window.location.search).get('mmct_contact_id'),
        mmct_contact_email: new URLSearchParams(window.location.search).get('mmct_contact_email'),
      });
      return;
    }

    var currentUrl = window.location.href;
    var lastTracked = window.sessionStorage.getItem('mmct_last_tracked');
    var lastTrackedTime = window.sessionStorage.getItem('mmct_last_tracked_time');
    var now = Date.now();

    // Prevent duplicates: same URL within 30 seconds (allowing page refreshes after that)
    if (lastTracked === currentUrl && lastTrackedTime && now - parseInt(lastTrackedTime, 10) < 30000) {
      console.log('MM Remote Tracker: Skipping duplicate page view for:', currentUrl, 'Last tracked:', Math.floor((now - parseInt(lastTrackedTime, 10)) / 1000), 'seconds ago');
      return;
    }

    console.log('MM Remote Tracker: Tracking page view:', {
      url: currentUrl,
      title: document.title,
      contact_id: contact.contact_id,
      contact_email: contact.contact_email,
    });

    window.sessionStorage.setItem('mmct_last_tracked', currentUrl);
    window.sessionStorage.setItem('mmct_last_tracked_time', now.toString());

    // Set flag to prevent concurrent calls
    trackingInProgress = true;

    sendAjaxRequest(
      {
        action: 'mm_remote_track_page_view',
        nonce: config.nonce,
        page_url: window.location.href,
        page_title: document.title,
        referrer: document.referrer || '',
        user_agent: window.navigator.userAgent || '',
        timestamp: new Date().toISOString(),
        contact_id: contact.contact_id,
        contact_email: contact.contact_email,
      },
      {
        success: function () {
          console.log('MM Remote Tracker: Page view tracked successfully');
          trackingInProgress = false;
        },
        error: function (status, responseText) {
          console.error('MM Remote Tracker: Failed to track page view:', status, responseText);
          trackingInProgress = false;
        },
      }
    );
  }

  function handleLinkClick(event) {
    var link = event.target.closest && event.target.closest('a[href]');
    if (!link) {
      return;
    }

    var href = link.getAttribute('href');
    if (!href || typeof href !== 'string') {
      return;
    }

    var lower = href.toLowerCase();
    if (lower.indexOf('/wp-admin/admin-ajax.php') !== -1 && lower.indexOf('mm_remote_track_link_click') !== -1) {
      sendAjaxRequest(
        {
          action: 'mm_remote_track_link_click',
          nonce: config.nonce,
          link_url: href,
          page_url: window.location.href,
          timestamp: new Date().toISOString(),
        },
        {
          success: function () {
            console.log('MM Remote Tracker: Link click tracked');
          },
          error: function (status, responseText) {
            console.error('MM Remote Tracker: Failed to track link click:', status, responseText);
          },
        }
      );
    }
  }

  function init() {
    // Prevent multiple initializations
    if (initialized) {
      console.log('MM Remote Tracker: Already initialized, skipping duplicate init() call');
      return;
    }
    initialized = true;

    // Get config from window
    config = window.mmRemoteTrackerConfig;
    
    if (!config || !config.ajaxUrl) {
      console.error('MM Remote Tracker: Config not available during init', config);
      initialized = false; // Allow retry if config is missing
      return;
    }
    
    console.log('MM Remote Tracker: Initializing with config:', config);
    
    // Set the initial URL BEFORE calling trackPageView to prevent setInterval from triggering
    window.sessionStorage.setItem('mmct_last_checked_url', window.location.href);
    
    // Track initial page view
    trackPageView();

    // Rate limit: only check URL changes every 5 seconds
    setInterval(function () {
      if (window.location.href !== window.sessionStorage.getItem('mmct_last_checked_url')) {
        window.sessionStorage.setItem('mmct_last_checked_url', window.location.href);
        console.log('MM Remote Tracker: URL changed to ' + window.location.href + ' - calling trackPageView');
        setTimeout(trackPageView, 100);
      }
    }, 5000); // Increased from 1000ms to 5000ms to reduce request frequency

    // Only track when page becomes visible AFTER being hidden (not on initial load)
    var wasHidden = false;
    document.addEventListener('visibilitychange', function () {
      if (document.hidden) {
        wasHidden = true;
      } else if (wasHidden) {
        // Only track if page was previously hidden
        trackPageView();
        wasHidden = false;
      }
    });

    document.addEventListener('click', handleLinkClick);

    window.addEventListener('popstate', function () {
      window.setTimeout(trackPageView, 100);
    });

    console.log('MM Remote Tracker: Script initialization complete');
  }

  // Wait for config to be available
  function waitForDependencies() {
    if (typeof window.mmRemoteTrackerConfig === 'undefined') {
      console.log('MM Remote Tracker: Waiting for config...');
      setTimeout(waitForDependencies, 100);
      return;
    }
    
    // Config is available, initialize ONCE
    console.log('MM Remote Tracker: Config found, readyState=' + document.readyState);
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', function() {
        console.log('MM Remote Tracker: DOMContentLoaded fired, calling init()');
        init();
      });
    } else {
      console.log('MM Remote Tracker: DOM already ready, calling init() immediately');
      init();
    }
  }
  
  waitForDependencies();
})(window, document);


</script>
<!-- MM Remote Tracker Script End -->

