function sleep(time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}

Date.prototype.format = function (fmt) {
    var o = {
        "M+": this.getMonth() + 1,                 //月份
        "d+": this.getDate(),                    //日
        "h+": this.getHours(),                   //小时
        "m+": this.getMinutes(),                 //分
        "s+": this.getSeconds(),                 //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds()             //毫秒
    };
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    }
    for (var k in o) {
        if (new RegExp("(" + k + ")").test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        }
    }
    return fmt;
}

async function getDom(sel) {
    for (let i = 0; i < 100; i++) {
        let dom = document.querySelector(sel);
        if (dom) {
            return dom;
        } else {
            await sleep(100);
        }
    }
}

async function getDomAll(sel) {
    for (let i = 0; i < 100; i++) {
        let dom = document.querySelectorAll(sel);
        if (dom.length > 0) {
            return dom;
        } else {
            await sleep(100);
        }
    }
}

function addNewStyle(newStyle) {
    let styleElement = document.getElementById('styles_js');
    if (!styleElement) {
        styleElement = document.createElement('style');
        styleElement.type = 'text/css';
        styleElement.id = 'styles_js';
        document.getElementsByTagName('head')[0].appendChild(styleElement);
    }
    styleElement.appendChild(document.createTextNode(newStyle));
}

function getQueryStringByUrl(url, name) {
    let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
    let r = url.substring(url.indexOf('?') + 1).match(reg); //获取url中"?"符后的字符串并正则匹配
    let context = "";
    if (r != null)
        context = r[2];
    reg = null;
    r = null;
    return context == null || context === "" || context === "undefined" ? "" : decodeURI(context);
}

//直接读取浏览器url
function getQueryString(name) {
    return getQueryStringByUrl(location.href, name);
}


function getRandomInt(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min) + min); //The maximum is exclusive and the minimum is inclusive
}

function getOneFromArray(arr) {
    return arr[getRandomInt(0, arr.length)];
}

// 该函数用于创建一个<eleName k="attrs[k]">text</eleName>样式的页面元素
function createEle(eleName, text, attrs) {
    let ele = document.createElement(eleName);
    // innerText 也就是 <p>text会被添加到这里</p>
    ele.innerText = text;
    // attrs 的类型是一个 map
    for (let k in attrs) {
        // 遍历 attrs, 给节点 ele 添加我们想要的属性
        ele.setAttribute(k, attrs[k]);
    }
    // 返回节点
    return ele;
}

function myCopy(inner_html) {
    let tmpId = "tmpId123123" + getRandomInt(1, 10000);
    let a = document.createElement('div');
    a.id = tmpId;
    a.innerHTML = inner_html
    document.querySelector('body').appendChild(a)
    let range = document.createRange();
    range.selectNode(document.querySelector("#" + tmpId));
    // 清除选择
    window.getSelection().removeAllRanges();
    window.getSelection().addRange(range);
    console.log('复制成功');
    document.execCommand('copy');
    // 清除选择
    window.getSelection().removeAllRanges();
    document.querySelector("#" + tmpId).remove();
}


//自动关闭提示框
function myAlert(str, sec) {
    let bordercolor = "#336699";//提示窗口的边框颜色
    let sWidth, sHeight;
    //获取当前窗口尺寸
    sWidth = document.body.offsetWidth;
    sHeight = document.body.offsetHeight;
    //背景div
    const bgObj = document.createElement("div");
    bgObj.setAttribute('id', 'alertbgDiv');
    bgObj.style.position = "fixed";
    bgObj.style.top = "0";
    bgObj.style.background = "#E8E8E8";
    bgObj.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=3,opacity=25,finishOpacity=75";
    bgObj.style.opacity = "0.6";
    bgObj.style.left = "0";
    bgObj.style.width = sWidth + "px";
    bgObj.style.height = sHeight + "px";
    bgObj.style.zIndex = "10000";
    document.body.appendChild(bgObj);
    //创建提示窗口的div
    const msgObj = document.createElement("div");
    msgObj.setAttribute("id", "alertmsgDiv");
    msgObj.setAttribute("align", "center");
    msgObj.style.background = "white";
    msgObj.style.border = "1px solid " + bordercolor;
    msgObj.style.position = "fixed";
    msgObj.style.left = "50%";
    msgObj.style.font = "15px/1.6em Verdana, Geneva, Arial, Helvetica, sans-serif";
    //窗口距离左侧和顶端的距离
    msgObj.style.marginLeft = "-225px";
    //窗口被卷去的高+（屏幕可用工作区高/2）-150
    msgObj.style.top = document.body.scrollTop + (window.screen.availHeight / 2) - 150 + "px";
    msgObj.style.textAlign = "center";
    msgObj.style.lineHeight = "25px";
    msgObj.style.zIndex = "10001";
    msgObj.style.minWidth = "300px";
    document.body.appendChild(msgObj);
    //提示信息标题
    const title = document.createElement("h4");
    title.setAttribute("id", "alertmsgTitle");
    title.setAttribute("align", "left");
    title.style.margin = "0";
    title.style.padding = "3px";
    title.style.background = bordercolor;
    title.style.filter = "progid:DXImageTransform.Microsoft.Alpha(startX=20, startY=20, finishX=100, finishY=100,style=1,opacity=75,finishOpacity=100);";
    title.style.opacity = "0.75";
    title.style.border = "1px solid " + bordercolor;
    title.style.font = "12px Verdana, Geneva, Arial, Helvetica, sans-serif";
    title.style.color = "white";
    title.innerHTML = "提示信息";
    document.getElementById("alertmsgDiv").appendChild(title);
    //提示信息
    const txt = document.createElement("p");
    txt.setAttribute("id", "msgTxt");
    txt.style.margin = "16px 0";
    txt.innerHTML = str;
    document.getElementById("alertmsgDiv").appendChild(txt);
    //设置关闭时间
    window.setTimeout(() => {
        document.body.removeChild(document.getElementById("alertbgDiv"));
        document.getElementById("alertmsgDiv").removeChild(document.getElementById("alertmsgTitle"));
        document.body.removeChild(document.getElementById("alertmsgDiv"));
    }, sec * 1000);
}

function log(obj) {
    console.table(JSON.parse(JSON.stringify(obj)));
}


function addJSFile(js_url) {
    const eleScript = document.createElement("script");
    eleScript.type = "text/javascript";
    eleScript.src = js_url;
    document.getElementsByTagName("HEAD")[0].appendChild(eleScript);
}

function addJQ() {
    addJSFile("https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js");
    setInterval(() => {
        if (typeof (jQuery) == 'undefined') {
            addJSFile("");
        }
    }, 200)
}

/**
 * 复制
 * 需要添加：addJSFile("//cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.11/clipboard.min.js")
 * @param text
 * @param uri
 */
function copyTextToClipboard(text, uri) {
    let copyFrom, agent, body;

    copyFrom = document.createElement("a");
    copyFrom.setAttribute("id", "target");
    copyFrom.setAttribute("href", uri);
    copyFrom.innerHTML = text;
    agent = document.createElement("button");
    body = document.getElementsByTagName('body')[0];
    body.appendChild(copyFrom);
    body.appendChild(agent);
    // 麻烦：无法传入'.btn'元素 我们可以创建一个btn作为代理
    let clipboard = new ClipboardJS(agent, {
        target: function () {
            return document.querySelector('#target');
        }
    });

    clipboard.on('success', function (e) {
        console.log(e);
    });

    clipboard.on('error', function (e) {
        console.log(e);
    });
    agent.click();
    // copyFrom.focus();
    // copyFrom.select();  // 问题所在 无法对copyFrom对象使用select()方法
    // document.execCommand('copy'); // 采用Clipboard.js方案
    body.removeChild(copyFrom);
    body.removeChild(agent);


}

function addLink(domSelector, link_str, linkUrl) {
    const eleScript = document.createElement("a");
    eleScript.innerHTML = link_str.replaceAll(" ", "&nbsp;");
    eleScript.href = linkUrl;
    document.querySelector(domSelector).appendChild(eleScript);
}
