(function(waubotex, config) {
  var version = '1.0';
  var client = {};
  var events = false;
  var iid = randID(10);
  var queue = [];
  var submitInterval = false;
  var submitPeriod = 500;
  var initTime = Date.now();
  var urlAccept = 'https://wauhs.com/botex/accept.php';

  //init
  function init() {
    logger("botex-init: " + version);
    setupEventListeners('install');

    client.screen = {
      width: screen.width || 0,
      height: screen.height || 0,
      colorDepth: screen.colorDepth || 0,
      availWidth: screen.availWidth || 0,
      availHeight: screen.availHeight || 0,
      availLeft: screen.availLeft || 0,
      availTop: screen.availTop || 0,
      pixelDepth: screen.pixelDepth || 0,
      orientation: {
        angle: screen.orientation.angle || 0,
        type: screen.orientation.type || false,
      }
    };
    client.timing = performance.timing;
    client.nav = {
      ref: document.referrer,
      ua: navigator.userAgent,
    };
    queue.push({
      type: 'client',
      client: client
    });
    submitQueue();

    submitInterval = setTimeout(submitQueue, submitPeriod);

    if(navigator.sendBeacon) {
      window.addEventListener('pagehide', function() {
        navigator.sendBeacon(urlAccept+"?unload=pagehide", JSON.stringify({
          meta: {
            reqAgent: 'botex/'+version,
            reqID: randID(5),
            rid: config.rid,
          },
          payload: [
            {type: 'unload', event: 'pagehide'},
          ],
        }));
      });
    }
  }

  //add/remove event listenets
  function setupEventListeners(action) {
    if (action == 'install') {
      window.addEventListener('scroll', scrollHandler);
      window.addEventListener('resize', resizeHandler);
      window.addEventListener('mousemove', mouseMoveHandler);
      window.addEventListener('click', mouseClickHandler);
    } else {
      window.removeEventListener('scroll', scrollHandler);
      window.removeEventListener('resize', resizeHandler);
      window.removeEventListener('mousemove', mouseMoveHandler);
      window.removeEventListener('click', mouseClickHandler);
    }
  }

  //submit the data to the server periodically
  function submitQueue() {
    submit(queue);
    queue = [];

    if (Date.now() - initTime < 5000) {
      submitPeriod = Math.floor(submitPeriod + (submitPeriod * 0.5));
      submitInterval = setTimeout(submitQueue, submitPeriod);
    } else {
      setupEventListeners('remove');
    }
  }

  function submit(payload) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', urlAccept, true); 
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.onreadystatechange = function() {
      if (this.readyState === XMLHttpRequest.DONE) {
        //console.log(xhr.responseText);
      }
    };

    payload = {
      meta: {
        reqAgent: 'botex/'+version,
        reqID: randID(5),
        rid: config.rid,
        length: queue.length,
      },
      payload: payload,
    };
    xhr.send(JSON.stringify(payload));
  }

  //event handler: scroll
  function scrollHandler(e) {
    queue.push({
      type: 'event.scroll',
      ts: e.timeStamp,
      scrollTop: document.documentElement.scrollTop || document.body.scrollTop,
      docHeight: document.body.clientHeight,
      scrollLeft: document.documentElement.scrollLeft || document.body.scrollLeft,
      docWidth: document.body.clientWidth,
      windowHeight: window.innerHeight,
      windowWidth: window.innerWidth,
    });
  }

  //event handler: resize
  function resizeHandler(e) {
    queue.push({
      type: 'event.resize',
      ts: e.timeStamp,
      docHeight: document.body.clientHeight,
      docWidth: document.body.clientWidth,
      windowHeight: window.innerHeight,
      windowWidth: window.innerWidth,
    });
  }

  //event handler: mousemove
  function mouseMoveHandler(e) {
    queue.push({
      type: 'event.mousemove',
      ts: e.timeStamp,
      x: event.clientX,
      y: event.clientY,
    });
  }

  //event handler: mousemove
  function mouseClickHandler(e) {
    queue.push({
      type: 'event.click',
      ts: e.timeStamp,
      x: event.clientX,
      y: event.clientY,
    });
  }

  //logger
  function logger(msg) {
    console.log("_waubotex : " + msg);
  };

  //create id
  function randID(length) {
    var id = '';
    var lib = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var len = lib.length;
    for (var i = 0; i < length; i++) {
      id += lib.charAt(Math.floor(Math.random() * len));
    }

    return id;
  }


  //--------------------------
  //----- PUBLIC METHODS -----
  //--------------------------
  waubotex.stats = function() {
    console.log("_waubotex stats would get dumped here");
  };

  //----- CONSTRUCTOR -----
  var instance = false;
  if (instance == false) {
    instance = true;
    if (document.readyState != "loading") {
      init();
    } else {
      document.addEventListener("DOMContentLoaded", function(ev) { init(); });
    }
  }
}(window._waubotex = window._waubotex || {}, {"ts":1743110212,"rid":"20250327211652.IVprdMHFMV"}));