text: var testTool = {
    b64EncodeUnicode: function (str) {
      // first we use encodeURIComponent to get percent-encoded UTF-8,
      // then we convert the percent encodings into raw bytes which
      // can be fed into btoa.
      return btoa(
        encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(
          match,
          p1
        ) {
          return String.fromCharCode("0x" + p1);
        })
      );
    },
    b64DecodeUnicode: function (str) {
      // Going backwards: from bytestream, to percent-encoding, to original string.
      return decodeURIComponent(
        atob(str)
          .split("")
          .map(function (c) {
            return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
          })
          .join("")
      );
    },
    isMobileDevice: function () {
      return (
        navigator.userAgent.match(/Android/i) ||
        navigator.userAgent.match(/webOS/i) ||
        navigator.userAgent.match(/iPhone/i) ||
        navigator.userAgent.match(/iPod/i) ||
        navigator.userAgent.match(/BlackBerry/i) ||
        navigator.userAgent.match(/Windows Phone/i)
      );
    },
    getMeetingConfig: function () {
      return {
        mn: parseInt(document.getElementById("meeting_number").value),
        name: testTool.b64EncodeUnicode(
          document.getElementById("display_name").value
        ),
        pwd: document.getElementById("meeting_pwd").value,
        role: parseInt(document.getElementById("meeting_role").value, 10),
        email: testTool.b64EncodeUnicode(
          document.getElementById("meeting_email").value
        ),
        lang: document.getElementById("meeting_lang").value,
        signature: "",
        china: document.getElementById("meeting_china").value,
      };
    },
    createZoomNode: function (id, url) {
      const zoomIframe = document.createElement("iframe");
      zoomIframe.id = id;
      zoomIframe.sandbox =
        "allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox";
      zoomIframe.allow = "microphone; camera; fullscreen;";
      zoomIframe.src = url;
      zoomIframe.style = "";
      if (typeof document.body.append === "function") {
        document.body.append(zoomIframe);
      } else {
        document.body.appendChild(zoomIframe);
      }
    },
    getCurrentDomain: function () {
      return (
        window.location.protocol +
        "//" +
        window.location.hostname +
        ":" +
        window.location.port
      );
    },
    parseQuery: function () {
      return (function () {
        var href = window.location.href;
        var queryString = href.substr(href.indexOf("?"));
        var query = {};
        var pairs = atob(queryString[0] === "?"
          ? queryString.substr(1)
          : queryString
        ).split("&");
        for (var i = 0; i < pairs.length; i += 1) {
          var pair = pairs[i].split("=");
          query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || "");
        }
        return query;
      })();
    },
    serialize: function (obj) {
      // eslint-disable-next-line no-shadow
      var keyOrderArr = ["name", "mn", "email", "pwd", "role", "lang", "signature", "china"];
  
      Array.intersect = function () {
        var result = new Array();
        var obj = {};
        for (var i = 0; i < arguments.length; i++) {
          for (var j = 0; j < arguments[i].length; j++) {
            var str = arguments[i][j];
            if (!obj[str]) {
              obj[str] = 1;
            } else {
              obj[str]++;
              if (obj[str] == arguments.length) {
                result.push(str);
              }
            }
          }
        }
        return result;
      };
  
      if (!Array.prototype.includes) {
        Object.defineProperty(Array.prototype, "includes", {
          enumerable: false,
          value: function (obj) {
            var newArr = this.filter(function (el) {
              return el === obj;
            });
            return newArr.length > 0;
          },
        });
      }
  
      var tmpInterArr = Array.intersect(keyOrderArr, Object.keys(obj));
      var sortedObj = [];
      keyOrderArr.forEach(function (key) {
        if (tmpInterArr.includes(key)) {
          sortedObj.push([key, obj[key]]);
        }
      });
      Object.keys(obj)
        .sort()
        .forEach(function (key) {
          if (!tmpInterArr.includes(key)) {
            sortedObj.push([key, obj[key]]);
          }
        });
      var tmpSortResult = (function (sortedObj) {
        var str = [];
        for (var p in sortedObj) {
          if (typeof sortedObj[p][1] !== "undefined") {
            str.push(
              encodeURIComponent(sortedObj[p][0]) +
                "=" +
                encodeURIComponent(sortedObj[p][1])
            );
          }
        }
        return str.join("&");
      })(sortedObj);
      return tmpSortResult;
    },
    detectOS: function () {
      var sUserAgent = navigator.userAgent;
      var isWin =
        navigator.platform === "Win32" || navigator.platform === "Windows";
      var isMac =
        navigator.platform === "Mac68K" ||
        navigator.platform === "MacPPC" ||
        navigator.platform === "Macintosh" ||
        navigator.platform === "MacIntel";
      if (isMac) return "Mac";
      var isUnix = navigator.platform === "X11" && !isWin && !isMac;
      if (isUnix) return "Unix";
      var isLinux = String(navigator.platform).indexOf("Linux") > -1;
      if (isLinux) return "Linux";
      if (isWin) {
        var isWin2K =
          sUserAgent.indexOf("Windows NT 5.0") > -1 ||
          sUserAgent.indexOf("Windows 2000") > -1;
        if (isWin2K) return "Win2000";
        var isWinXP =
          sUserAgent.indexOf("Windows NT 5.1") > -1 ||
          sUserAgent.indexOf("Windows XP") > -1;
        if (isWinXP) return "WinXP";
        var isWin2003 =
          sUserAgent.indexOf("Windows NT 5.2") > -1 ||
          sUserAgent.indexOf("Windows 2003") > -1;
        if (isWin2003) return "Win2003";
        var isWinVista =
          sUserAgent.indexOf("Windows NT 6.0") > -1 ||
          sUserAgent.indexOf("Windows Vista") > -1;
        if (isWinVista) return "WinVista";
        var isWin7 =
          sUserAgent.indexOf("Windows NT 6.1") > -1 ||
          sUserAgent.indexOf("Windows 7") > -1;
        if (isWin7) return "Win7";
        var isWin10 =
          sUserAgent.indexOf("Windows NT 10") > -1 ||
          sUserAgent.indexOf("Windows 10") > -1;
        if (isWin10) return "Win10";
      }
      return "other";
    },
    detectIE: function () {
      var ua = window.navigator.userAgent;
  
      // Test values; Uncomment to check result …
  
      // IE 10
      // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';
  
      // IE 11
      // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';
  
      // Edge 12 (Spartan)
      // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';
  
      // Edge 13
      // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';
  
      var msie = ua.indexOf("MSIE ");
      if (msie > 0) {
        // IE 10 or older => return version number
        return "IE" + parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)), 10);
      }
  
      var trident = ua.indexOf("Trident/");
      if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf("rv:");
        return "IE" + parseInt(ua.substring(rv + 3, ua.indexOf(".", rv)), 10);
      }
  
      var edge = ua.indexOf("Edge/");
      if (edge > 0) {
        // Edge (IE 12+) => return version number
        return (
          "Edge" + parseInt(ua.substring(edge + 5, ua.indexOf(".", edge)), 10)
        );
      }
  
      // other browser
      return false;
    },
    getBrowserInfo: function () {
      var agent = navigator.userAgent.toLowerCase();
      var regStr_ff = /firefox\/[\d.]+/gi;
      var regStr_chrome = /chrome\/[\d.]+/gi;
      var regStrChrome2 = /ipad; cpu os (\d+_\d+)/gi;
      var regStr_saf = /version\/[\d.]+/gi;
      var regStr_saf2 = /safari\/[\d.]+/gi;
    
      var regStr_edg = /edg\/[\d.]+/gi;
  
      // firefox
      if (agent.indexOf("firefox") > 0) {
        return agent.match(regStr_ff);
      }
  
      // Safari
      if (agent.indexOf("safari") > 0 && agent.indexOf("chrome") < 0) {
        var tmpInfo = "safari/unknow";
        var tmpInfo2;
        tmpInfo = agent.match(regStr_saf);
        tmpInfo2 = agent.match(regStr_saf2);
        if (tmpInfo) {
          tmpInfo = tmpInfo.toString().replace("version", "safari");
        }
        if (tmpInfo2) {
          tmpInfo = tmpInfo2.toString().replace("version", "safari");
        }
        return tmpInfo;
      }
  
      // IE / Eege
      var tmpIsIE = testTool.detectIE();
      if (tmpIsIE) {
        return tmpIsIE;
      }
      // Chrome
      if (agent.indexOf("chrome") > 0) {
        return agent.match(regStr_chrome);
      }
  
      return "other";
    },
    getRandomInt: function (max) {
      return Math.floor(Math.random() * Math.floor(max));
    },
    extractHostname: function (url) {
      var hostname;
      if (url.indexOf("//") > -1) {
        hostname = url.split("/")[2];
      } else {
        hostname = url.split("/")[0];
      }
      hostname = hostname.split(":")[0];
      hostname = hostname.split("?")[0];
      return hostname;
    },
    getDomainName: function (hostName) {
      return hostName.substring(
        hostName.lastIndexOf(".", hostName.lastIndexOf(".") - 1) + 1
      );
    },
    setCookie: function (cname, cvalue) {
      var exdays = 1;
      var d = new Date();
      d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);
      var expires = "expires=" + d.toUTCString();
      document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
    },
    getCookie: function (cname) {
      var name = cname + "=";
      var decodedCookie = decodeURIComponent(document.cookie);
      var ca = decodedCookie.split(";");
      for (var i = 0; i < ca.length; i += 1) {
        var c = ca[i];
        while (c.charAt(0) === " ") {
          c = c.substring(1);
        }
        if (c.indexOf(name) === 0) {
          return c.substring(name.length, c.length);
        }
      }
      return "";
    },
    deleteAllCookies: function () {
      var cookies = document.cookie.split(";");
      for (var i = 0; i < cookies.length; i++) {
        var cookie = cookies[i];
        var eqPos = cookie.indexOf("=");
        var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
        document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
      }
    },
  };
  
  window.testTool = testTool;
  