
(function () {
  // ---------- shared helpers ----------
  var COMPARE_FIELDS = [
    ["total","$50K Total Cost"],["reset","Reset Fee"],["promo","Promo Code"],
    ["accountType","Account Type"],["platform","Platform"],["maxAccounts","Max Accounts"],
    ["drawdown","Drawdown"],["consistEval","Consistency Eval"],["consistPA","Consistency PA"],
    ["dailyLoss","Daily Loss Limit"],["profitTarget","Profit Target"],["daysToPass","Days to Pass"],
    ["daysToPayout","Days to Payout"],["buffer","Buffer"],["maxPayout","Max Payout"],
    ["price","Account Price"],["setupFee","Set Up Fee"],["profitSplit","Profit Split"],
    ["rules","Rules"]
  ];
  function esc(s){return String(s||"").replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');}
  function formatCell(v){return String(v||"").split(" | ").map(function(s){return s.trim();}).filter(Boolean);}
  function ready(fn){if(document.readyState!=='loading')fn();else document.addEventListener('DOMContentLoaded',fn);}

  // ---------- homepage compare picker ----------
  function initHomeCompare() {
    var card = null;
    var headers = document.querySelectorAll('p.h5, .h5');
    for (var i = 0; i < headers.length; i++) {
      if (/Pick two firms to compare/i.test(headers[i].textContent || '')) {
        card = headers[i].closest('.card');
        break;
      }
    }
    if (!card) return;
    var selects = card.querySelectorAll('select.form-select');
    var buttons = card.querySelectorAll('button');
    if (selects.length < 2 || buttons.length < 2) return;
    var selA = selects[0], selB = selects[1];
    var btnCompare = buttons[0], btnClear = buttons[1];
    var mount = document.createElement('div');
    card.appendChild(mount);

    // Populate option lists from PROP_FIRMS if empty (export keeps SSR minimal).
    var firmNames = Array.from(new Set((window.PROP_FIRMS||[]).map(function(p){return p.name;}))).sort();
    [selA, selB].forEach(function(sel){
      if (sel.options.length > 1) return;
      firmNames.forEach(function(n){
        var o = document.createElement('option');
        o.value = n; o.textContent = n;
        sel.appendChild(o);
      });
    });

    function findFirm(n){return (window.PROP_FIRMS||[]).find(function(p){return p.name===n;});}
    function syncDisabled(){
      btnCompare.disabled = !selA.value || !selB.value;
      btnClear.disabled = !selA.value && !selB.value && !mount.innerHTML;
    }
    function refreshOptions(){
      [[selA,selB.value],[selB,selA.value]].forEach(function(p){
        for (var i=0;i<p[0].options.length;i++){var o=p[0].options[i];o.disabled=(o.value && o.value===p[1]);}
      });
    }
    function renderTable(a,b){
      var rows = COMPARE_FIELDS.map(function(f){
        var ap = formatCell(a[f[0]]).map(function(p){return '<div>'+esc(p)+'</div>';}).join('');
        var bp = formatCell(b[f[0]]).map(function(p){return '<div>'+esc(p)+'</div>';}).join('');
        return '<tr><td class="px-3 py-3 fw-semibold text-brand">'+esc(f[1])+'</td>'+
          '<td class="px-3 py-3  small">'+ap+'</td>'+
          '<td class="px-3 py-3  small">'+bp+'</td></tr>';
      }).join('');
      return '<div class="mt-4 animate-fade-in">'+
        '<p class="small text-brand mb-3">Showing <strong>'+esc(a.name)+'</strong> vs <strong>'+esc(b.name)+'</strong>.</p>'+
        '<table class="table bs-table-dark-brand align-middle mb-1">'+
          '<thead><tr><th class="px-3 py-3" style="width:20%">Field</th>'+
          '<th class="px-3 py-3">'+esc(a.name)+'</th><th class="px-3 py-3">'+esc(b.name)+'</th></tr></thead>'+
          '<tbody>'+rows+'</tbody></table></div></div>';
    }
    selA.addEventListener('change',function(){refreshOptions();syncDisabled();});
    selB.addEventListener('change',function(){refreshOptions();syncDisabled();});
    btnCompare.addEventListener('click',function(){
      var a=findFirm(selA.value),b=findFirm(selB.value);
      if(!a||!b)return;
      mount.innerHTML=renderTable(a,b); syncDisabled();
    });
    btnClear.addEventListener('click',function(){
      if(mount.innerHTML){
        var c=mount.firstElementChild;
        if(c){c.classList.remove('animate-fade-in');c.classList.add('animate-fade-out');}
        setTimeout(function(){mount.innerHTML='';selA.value='';selB.value='';refreshOptions();syncDisabled();},500);
      } else {selA.value='';selB.value='';refreshOptions();syncDisabled();}
    });
    refreshOptions(); syncDisabled();
  }

  // ---------- compare page: tier helpers ----------
  var TIERS = ["gold","silver","yellow","pink"];
  function tierFor(name){
    var h=0; for(var i=0;i<name.length;i++) h=((h*31+name.charCodeAt(i))>>>0);
    return TIERS[h%TIERS.length];
  }
  function stripHtml(s){return String(s||'').replace(/<[^>]+>/g,'').replace(/\s+/g,' ').trim();}
  function escapeRe(s){return s.replace(/[.*+?^${}()|[\]\\]/g,'\\$&');}

  function nameCellHtml(name){
    var meta = (window.PROP_FIRMS_META||{})[name] || {url:'#', note:''};
    var url = meta.url || '#';
    var note = meta.note || (name + " — visit the firm's site for full program details.");
    var sentences = note.split(/(?<=\.)\s+/).filter(Boolean);
    var mid = Math.ceil(sentences.length/2);
    var p1 = esc(sentences.slice(0,mid).join(' ')) || esc(note.slice(0,200));
    var p2 = esc(sentences.slice(mid).join(' ')) || esc(name);
    var tier = tierFor(name);
    return '<div class="prop-name-wrap prop-tier-'+tier+'">'+
      '<div class="prop-name-main">'+
        '<span class="prop-name-text"><span class="tier-dot tier-'+tier+'" aria-hidden="true"></span>'+esc(name)+'</span>'+
        '<a href="'+esc(url)+'" target="_blank" rel="noopener noreferrer" class="prop-visit-btn" onclick="event.stopPropagation()">'+
          '<i class="bi bi-box-arrow-up-right"></i> Visit</a>'+
      '</div>'+
      '<span class="prop-info" onclick="event.stopPropagation()" aria-label="More information">'+
        '<i class="bi bi-info-circle-fill"></i>'+
        '<span class="prop-info-pop"><p>'+p1+'</p>'+(p2?'<p>'+p2+'</p>':'')+'</span>'+
      '</span>'+
    '</div>';
  }

  var TIER_LEGEND_HTML = '<div class="prop-tier-legend">'+
    '<span class="tier-badge tier-gold" data-tier="gold" role="button" tabindex="0" title="Filter Gold"><i class="bi bi-star-fill"></i><span class="tier-tooltip"><b>Gold</b><br><i>Top Ranked</i></span></span>'+
    '<span class="tier-badge tier-silver" data-tier="silver" role="button" tabindex="0" title="Filter Silver"><i class="bi bi-star-fill"></i><span class="tier-tooltip"><b>Silver</b><br><i>Good Standing</i></span></span>'+
    '<span class="tier-badge tier-yellow" data-tier="yellow" role="button" tabindex="0" title="Filter Yellow"><i class="bi bi-star-fill"></i><span class="tier-tooltip"><b>Yellow</b><br><i>New / Caution</i></span></span>'+
    '<span class="tier-badge tier-pink" data-tier="pink" role="button" tabindex="0" title="Filter Pink"><i class="bi bi-exclamation-triangle-fill"></i><span class="tier-tooltip"><b>Scam Alert</b><br><i>Don\'t Recommend!</i></span></span>'+
  '</div>';

  var FILTERS = {
    accountType: { label: "Account Type", options: ["Eval","Straight to Funded","Static","Swing"] },
    drawdown:    { label: "Drawdown Type", options: ["EOD","Intraday","Static","EOT"] },
    platform:    { label: "Platforms", options: ["NinjaTrader","Tradovate","TradingView","Quantower","Sierra Chart","Rithmic","EdgeProX","MotiveWave","DX Feed","ATAS","Tickblaze","Volumetrica","Blackarrow","Onyx","DeepCharts","WealthCharts","Tradesea","Alpha Trader"] },
    rules:       { label: "Rules Allowed", options: ["Microscalping","DCA","News","Bots","Copy Trading","VPN"] }
  };

  // ---------- floating prop-info tooltip ----------
  function setupPropInfoTooltip(){
    if (document.querySelector('.prop-info-floating')) return;
    var tip = document.createElement('div');
    tip.className = 'prop-info-floating';
    tip.style.cssText = 'position:fixed;z-index:9999;padding:1rem 1.25rem;background:#0a1828;border:1px solid rgba(77,212,196,0.45);border-radius:0.6rem;box-shadow:0 12px 36px rgba(0,0,0,0.6);color:rgba(255,255,255,0.9);font-size:0.85rem;line-height:1.55;opacity:0;pointer-events:none;transition:opacity .15s;max-height:50vh;overflow-y:auto;';
    document.body.appendChild(tip);
    document.addEventListener('mouseover', function(e){
      var t = e.target.closest('.prop-info'); if(!t) return;
      var pop = t.querySelector('.prop-info-pop');
      tip.innerHTML = pop ? pop.innerHTML : '';
      var r = t.getBoundingClientRect(), g = 16;
      tip.style.left = g + 'px';
      tip.style.width = (window.innerWidth - g*2) + 'px';
      tip.style.maxWidth = 'none';
      tip.style.opacity = '0'; tip.style.top = '0px';
      var h = tip.offsetHeight;
      var below = window.innerHeight - r.bottom - g, above = r.top - g;
      var top = (below >= h || below >= above)
        ? Math.min(r.bottom + 8, window.innerHeight - h - g)
        : Math.max(r.top - h - 8, g);
      tip.style.top = top + 'px'; tip.style.opacity = '1';
    });
    document.addEventListener('mouseout', function(e){
      if (e.target.closest('.prop-info')) tip.style.opacity = '0';
    });
  }

  // ---------- compare page table ----------
  function initPropRulesTable() {
    var host = document.getElementById('prop-rules-table-mount');
    if (!host || !window.jQuery || !window.jQuery.fn || !window.jQuery.fn.DataTable) return;
    var $ = window.jQuery;
    // Read firm names from the pre-rendered table rows.
    var firmNames = Array.from(new Set(
      $('#prop-rules-table tbody tr').map(function(){return this.getAttribute('data-name');}).get().filter(Boolean)
    )).sort();
    host.innerHTML = (
      '<div class="propsaver-dt">'+
        // Compare picker card
        '<div class="card bs-card-dark border-brand p-3 p-md-4 mb-3" data-pick-card>'+
          '<p class="h5 fw-bold mb-1">Pick two firms to compare</p>'+
          '<p class=" small mb-3">Select two firms below to filter the table down to just those rows for a clean side-by-side comparison.</p>'+
          '<div class="row g-2 align-items-center">'+
            '<div class="col-md-5"><select class="form-select" data-cmp="a"><option value="">Firm A…</option>'+
              firmNames.map(function(n){return '<option value="'+esc(n)+'">'+esc(n)+'</option>';}).join('')+'</select></div>'+
            '<div class="col-md-5"><select class="form-select" data-cmp="b"><option value="">Firm B…</option>'+
              firmNames.map(function(n){return '<option value="'+esc(n)+'">'+esc(n)+'</option>';}).join('')+'</select></div>'+
            '<div class="col-md-2 d-grid"><button type="button" class="btn btn-outline-brand" data-cmp-clear disabled>Clear</button></div>'+
          '</div>'+
          '<p class="small text-brand mb-0 mt-2 d-none" data-cmp-status></p>'+
        '</div>'+
        // Filters row
        '<div class="row g-2 mb-3" data-filters>'+
          Object.keys(FILTERS).map(function(k){
            return '<div class="col-6 col-lg-3"><div class="position-relative" data-filter="'+k+'">'+
              '<button type="button" class="btn btn-outline-brand w-100 d-flex align-items-center justify-content-between" data-filter-toggle>'+
                '<span class="text-truncate">'+esc(FILTERS[k].label)+'<span class="badge ms-2 text-brand d-none" style="background:rgba(77,212,196,0.15)" data-filter-count></span></span>'+
                '<i class="bi bi-chevron-down ms-2" data-filter-chev></i>'+
              '</button>'+
              '<div class="position-absolute card bs-card-dark border-brand mt-2 p-2 w-100 d-none" style="z-index:20;max-height:280px;overflow-y:auto" data-filter-menu>'+
                FILTERS[k].options.map(function(opt){
                  return '<label class="d-flex align-items-center gap-2 px-2 py-1 rounded" style="cursor:pointer">'+
                    '<input type="checkbox" class="form-check-input m-0" value="'+esc(opt)+'"/>'+
                    '<span class="small">'+esc(opt)+'</span></label>';
                }).join('')+
              '</div>'+
            '</div></div>';
          }).join('')+
          '<div class="col-12 d-none" data-clear-row><button type="button" class="btn btn-sm btn-outline-brand" data-clear-all>Clear filters (<span data-clear-count>0</span>)</button></div>'+
        '</div>'+
      '</div>'
    );

    // Initialize DataTables on the pre-rendered HTML table.
    var dt = $('#prop-rules-table').DataTable({
      pageLength: 25,
      lengthMenu: [10,25,50,100],
      order: [],
      autoWidth: false,
	  fixedHeader: true,
      columnDefs: [
        { targets: 0, className: 'prop-name-cell all', responsivePriority: 1, type: 'string' },
        { targets: '_all', responsivePriority: 10000 }
      ],
      responsive: { details: { type: 'inline', target: 0 } },
      language: { search: '', searchPlaceholder: 'Search firms…', lengthMenu: '_MENU_ entries per page',
        info: 'Showing _START_ to _END_ of _TOTAL_ entries',
        infoFiltered: ' (filtered from _MAX_ total entries)',
        paginate: { previous: '\u2039', next: '\u203a', first: '\u00ab', last: '\u00bb' } }
    });

    // State
    var selected = { accountType: [], drawdown: [], platform: [], rules: [] };
    var compare = { a: "", b: "" };
    // Tier filter state (multi-select)
    var tierFilter = [];

    // Custom search filter
    $.fn.dataTable.ext.search.push(function(settings, _data, dataIndex){
      if (settings.nTable.id !== 'prop-rules-table') return true;
      var tr = settings.aoData[dataIndex].nTr;
      if (!tr) return true;
      var name = tr.getAttribute('data-name') || '';
      var tier = tr.getAttribute('data-tier') || '';
      var acct = tr.getAttribute('data-accounttype') || '';
      var plat = tr.getAttribute('data-platform') || '';
      var draw = tr.getAttribute('data-drawdown') || '';
      var rules = tr.getAttribute('data-rules') || '';
      if (compare.a && compare.b && name !== compare.a && name !== compare.b) return false;
      if (tierFilter.length && tierFilter.indexOf(tier) < 0) return false;
      function any(vals, hay){return vals.length===0 || vals.some(function(v){return hay.toLowerCase().indexOf(v.toLowerCase())>=0;});}
      if (!any(selected.accountType, acct)) return false;
      if (!any(selected.drawdown, draw)) return false;
      if (!any(selected.platform, plat)) return false;
      if (selected.rules.length){
        var ok = selected.rules.every(function(r){return new RegExp(escapeRe(r)+'\\s*Yes','i').test(rules);});
        if (!ok) return false;
      }
      return true;
    });

    // Filter dropdowns
    host.querySelectorAll('[data-filter]').forEach(function(wrap){
      var key = wrap.getAttribute('data-filter');
      var btn = wrap.querySelector('[data-filter-toggle]');
      var chev = wrap.querySelector('[data-filter-chev]');
      var menu = wrap.querySelector('[data-filter-menu]');
      var countEl = wrap.querySelector('[data-filter-count]');
      btn.addEventListener('click', function(e){
        e.stopPropagation();
        var nowOpen = menu.classList.contains('d-none');
        host.querySelectorAll('[data-filter-menu]').forEach(function(m){m.classList.add('d-none');});
        host.querySelectorAll('[data-filter-chev]').forEach(function(c){c.className='bi bi-chevron-down ms-2';});
        if (nowOpen){ menu.classList.remove('d-none'); chev.className='bi bi-chevron-up ms-2'; }
      });
      menu.querySelectorAll('input[type=checkbox]').forEach(function(cb){
        cb.addEventListener('change', function(){
          var v = cb.value;
          var arr = selected[key];
          var i = arr.indexOf(v);
          if (cb.checked && i<0) arr.push(v);
          if (!cb.checked && i>=0) arr.splice(i,1);
          cb.closest('label').style.background = cb.checked ? 'rgba(77,212,196,0.1)' : 'transparent';
          if (arr.length){countEl.textContent=arr.length; countEl.classList.remove('d-none');}
          else countEl.classList.add('d-none');
          updateClearRow();
          dt.draw();
        });
      });
    });
    document.addEventListener('click', function(){
      host.querySelectorAll('[data-filter-menu]').forEach(function(m){m.classList.add('d-none');});
      host.querySelectorAll('[data-filter-chev]').forEach(function(c){c.className='bi bi-chevron-down ms-2';});
    });

    function totalSelected(){return selected.accountType.length+selected.drawdown.length+selected.platform.length+selected.rules.length;}
    function updateClearRow(){
      var n = totalSelected();
      var row = host.querySelector('[data-clear-row]');
      var num = host.querySelector('[data-clear-count]');
      if (n>0){row.classList.remove('d-none'); num.textContent=n;} else row.classList.add('d-none');
    }
    host.querySelector('[data-clear-all]').addEventListener('click', function(){
      ['accountType','drawdown','platform','rules'].forEach(function(k){selected[k]=[];});
      host.querySelectorAll('[data-filter] input[type=checkbox]').forEach(function(cb){cb.checked=false; cb.closest('label').style.background='transparent';});
      host.querySelectorAll('[data-filter-count]').forEach(function(c){c.classList.add('d-none');});
      updateClearRow(); dt.draw();
    });

    // Compare selects
    var selA = host.querySelector('[data-cmp="a"]');
    var selB = host.querySelector('[data-cmp="b"]');
    var btnClr = host.querySelector('[data-cmp-clear]');
    var statusEl = host.querySelector('[data-cmp-status]');
    function syncCmp(){
      compare.a = selA.value; compare.b = selB.value;
      btnClr.disabled = !compare.a && !compare.b;
      if (compare.a && compare.b){
        statusEl.classList.remove('d-none');
        statusEl.innerHTML = 'Showing <strong>'+esc(compare.a)+'</strong> vs <strong>'+esc(compare.b)+'</strong>.';
      } else {
        statusEl.classList.add('d-none');
      }
      dt.draw();
    }
    selA.addEventListener('change', syncCmp);
    selB.addEventListener('change', syncCmp);
    btnClr.addEventListener('click', function(){selA.value=''; selB.value=''; syncCmp();});

    // ---------- tier-color multi-select filter on header badges ----------
    function updateTierBadgeUI(){
      document.querySelectorAll('.tier-badge[data-tier]').forEach(function(b){
        var c = b.getAttribute('data-tier');
        b.classList.toggle('tier-filter-active', tierFilter.indexOf(c) >= 0);
      });
    }
    document.addEventListener('click', function(e){
      var badge = e.target.closest('.tier-badge[data-tier]');
      if (!badge) return;
      e.preventDefault();
      e.stopPropagation();
      var c = badge.getAttribute('data-tier');
      var i = tierFilter.indexOf(c);
      if (i >= 0) tierFilter.splice(i, 1);
      else tierFilter.push(c);
      updateTierBadgeUI();
      dt.draw();
    }, true);

  }

  // ---------- activity popup rotation ----------     

  function initActivityPopup() {
    var notices = [
	
      { icon: 'bi-trophy-fill', text: 'Aisha won a 100K evaluation account' },
      { icon: 'bi-person-plus-fill', text: 'Sarah just registered for PropSaver' },
      { icon: 'bi-person-plus-fill', text: 'Diego joined the May giveaway' },
      { icon: 'bi bi-currency-dollar', text: 'Marcus claimed a $2,500 payout reward' },
      { icon: 'bi-trophy-fill', text: 'John just won a 50K account' },
      { icon: 'bi bi-currency-dollar', text: 'Priya unlocked Master-tier rewards' },
    ];
    // Find existing popup container (rendered by SSR)
    var nodes = document.querySelectorAll('.position-fixed');
    var container = null;
    for (var i=0;i<nodes.length;i++){
      var n = nodes[i];
      if (n.style && /bottom/.test(n.style.bottom||'') && n.querySelector('.card.bs-card-dark.border-brand')) {
        container = n; break;
      }
    }
    if (!container) {
      container = document.createElement('div');
      container.className = 'position-fixed';
      container.setAttribute('style','bottom:1.5rem;left:1.5rem;z-index:1050;pointer-events:none;transition:all .5s ease;opacity:0;transform:translateY(1rem)');
      container.innerHTML = '<div class="card bs-card-dark border-brand d-flex flex-row align-items-center gap-3 px-3 py-2 shadow-brand-glow" style="border-radius:1rem;background:rgba(77,212,196,0.90);">'+
        '<span style="width:36px;height:36px;border-radius:50%;background:rgba(0,0,0,0.85);color:#4dd4c4;display:grid;place-items:center"><i class="bi" data-popup-icon></i></span>'+
        '<div><p class="fw-medium mb-0 small text-dark" data-popup-text></p><p class=" mb-0" style="font-size:0.72rem;color:#000000;">just now</p></div>'+
      '</div>';
      document.body.appendChild(container);
    }
    var iconEl = container.querySelector('i.bi');
    var textEl = container.querySelector('p.fw-medium');
    var idx = 0;
    function show(){
      var n = notices[idx];
      if (iconEl) iconEl.className = 'bi ' + n.icon;
      if (textEl) textEl.textContent = n.text;
      container.style.opacity = '1';
      container.style.transform = 'translateY(0)';
      setTimeout(function(){
        container.style.opacity = '0';
        container.style.transform = 'translateY(1rem)';
      }, 5000);
      setTimeout(function(){ idx = (idx+1) % notices.length; }, 5500);
    }
    setTimeout(show, 2500);
    setInterval(show, 9000);
  }

  // ---------- partner ticker (auto-scroll + drag) ----------
  function initPartnerTicker() {
    var wrap = document.querySelector('.offer-ticker-wrap');
    var track = wrap && wrap.querySelector('.offer-ticker-track');
    if (!wrap || !track) return;
    // Ensure horizontal scrolling works
    wrap.style.overflowX = wrap.style.overflowX || 'hidden';
    wrap.style.cursor = 'grab';
    var state = { down:false, moved:false, startX:0, startScroll:0, hover:false };
    var last = performance.now();
    var speed = 50;
    function tick(now){
      var dt = (now - last)/1000; last = now;
      if (!state.down && !state.hover) {
        var half = track.scrollWidth/2;
        wrap.scrollLeft += speed*dt;
        if (wrap.scrollLeft >= half) wrap.scrollLeft -= half;
      }
      requestAnimationFrame(tick);
    }
    requestAnimationFrame(tick);
    wrap.addEventListener('pointerenter', function(){ state.hover = true; });
    wrap.addEventListener('pointerleave', function(){ state.hover = false; });
    wrap.addEventListener('pointerdown', function(e){
      state.down=true; state.moved=false; state.startX=e.clientX; state.startScroll=wrap.scrollLeft;
      try{ wrap.setPointerCapture(e.pointerId);}catch(_){}
      wrap.style.cursor='grabbing';
    });
    wrap.addEventListener('pointermove', function(e){
      if (!state.down) return;
      var dx = e.clientX - state.startX;
      if (Math.abs(dx) > 4) state.moved = true;
      var half = track.scrollWidth/2;
      var next = state.startScroll - dx;
      while (next < 0) next += half;
      while (next >= half) next -= half;
      wrap.scrollLeft = next;
    });
    function up(e){
      state.down=false; wrap.style.cursor='grab';
      try{ wrap.releasePointerCapture(e.pointerId);}catch(_){}
    }
    wrap.addEventListener('pointerup', up);
    wrap.addEventListener('pointercancel', up);
    wrap.addEventListener('click', function(e){
      if (state.moved){ e.preventDefault(); e.stopPropagation(); }
    }, true);
  }

  // ---------- testimonials carousel ----------
  function initTestimonialsCarousel() {
    var prev = document.querySelector('.testimonial-nav-btn-prev');
    var next = document.querySelector('.testimonial-nav-btn-next');
    if (!prev || !next) return;
    var viewport = prev.parentElement.querySelector('.overflow-hidden');
    if (!viewport) return;
    var track = viewport.querySelector('.d-flex');
    if (!track) return;
    var slides = track.children;
    var count = slides.length;
    if (count < 2) return;
    var active = 0;
    var drag = null;
    var autoplay = null;

    function render(dxPct){
      var off = -active * 100 + (dxPct || 0);
      track.style.transition = drag ? 'none' : 'transform 0.5s ease';
      track.style.transform = 'translateX(' + off + '%)';
    }
    function go(dir){
      active = (active + dir + count) % count;
      render(0);
    }
    function startAuto(){
      stopAuto();
      autoplay = setInterval(function(){ go(1); }, 7000);
    }
    function stopAuto(){ if (autoplay) { clearInterval(autoplay); autoplay = null; } }

    prev.addEventListener('click', function(){ go(-1); startAuto(); });
    next.addEventListener('click', function(){ go(1); startAuto(); });

    viewport.addEventListener('pointerdown', function(e){
      drag = { startX: e.clientX, dx: 0 };
      try { e.target.setPointerCapture(e.pointerId); } catch(_){}
      viewport.style.cursor = 'grabbing';
      stopAuto();
    });
    viewport.addEventListener('pointermove', function(e){
      if (!drag) return;
      drag.dx = e.clientX - drag.startX;
      var w = viewport.clientWidth || 1;
      render((drag.dx / w) * 100);
    });
    function endDrag(){
      if (!drag) return;
      var w = viewport.clientWidth || 1;
      var thr = w * 0.15;
      if (drag.dx > thr) go(-1);
      else if (drag.dx < -thr) go(1);
      else render(0);
      drag = null;
      viewport.style.cursor = 'grab';
      startAuto();
    }
    viewport.addEventListener('pointerup', endDrag);
    viewport.addEventListener('pointercancel', endDrag);

    render(0);
    startAuto();
  }

  ready(function(){
    initHomeCompare();
    setupPropInfoTooltip();
    initPropRulesTable();
    initActivityPopup();
    initPartnerTicker();
    initTestimonialsCarousel();
  });
})();
