Greasy Fork

来自缓存

Greasy Fork is available in English.

艾宾浩斯收藏夹

多终端同步收藏夹,支持艾宾浩斯提醒功能,防止在收藏夹中吃灰。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         艾宾浩斯收藏夹
// @namespace    http://www.51gongjuxiang.com/
// @version      0.1
// @description  多终端同步收藏夹,支持艾宾浩斯提醒功能,防止在收藏夹中吃灰。
// @author       smoking
// @license      MIT
// @match        *://*/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// @grant        GM.xmlHttpRequest
// @connect      www.51gongjuxiang.com
// @connect      www.layuicdn.com
// @connect      npm.elemecdn.com
// ==/UserScript==

var mainMenuDataOk = false;
var baseUrl = "http://www.51gongjuxiang.com/aib/";
var aibEditWindowId = '';
var currentCurr = 1;
var aibEditPrevData = {};
var mainPannelInit = false;


function updateAibTable(articles) {
	function genTable(articles) {
        var fuid = getFuid();
        var alertIcon = '<svg class="bell" version="1.1" width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><g class="bell__body" fill="none" fill-rule="evenodd"><g transform="translate(-135 -1900)"><g transform="translate(113 532)"><g transform="translate(22 1368)" fill="currentColor" fill-rule="nonzero"><path class="bell__hull" d="m19.192 13.581c-1.0751 0-1.9497-0.8615-1.9497-1.9204v-4.527c0-3.9334-3.2489-7.1335-7.2424-7.1335-3.9935 0-7.2424 3.2001-7.2424 7.1335v4.527c0 1.059-0.87465 1.9204-1.9497 1.9204-0.44617 0-0.80789 0.35628-0.80789 0.79579s0.36172 0.79575 0.80789 0.79575h18.384c0.44621 0 0.80789-0.35624 0.80789-0.79575s-0.36168-0.79579-0.80789-0.79579zm-15.4 0c0.36758-0.55224 0.58156-1.2122 0.58156-1.9204v-4.527c0-3.0559 2.5241-5.542 5.6266-5.542s5.6266 2.4861 5.6266 5.542v4.527c0 0.70822 0.21398 1.3682 0.58152 1.9204h-12.416z"/><path class="bell__clapper" d="m12.009 17.36c-0.38848-0.24401-0.88605-0.10076-1.1114 0.31983-0.28696 0.5357-0.92289 0.71866-1.4176 0.4079-0.15596-0.097953-0.28626-0.23903-0.37672-0.4079-0.22532-0.42063-0.72293-0.56375-1.1114-0.31983-0.38844 0.24397-0.52066 0.78277-0.29534 1.2034 0.23235 0.4337 0.56689 0.79593 0.96744 1.0475 0.41954 0.26355 0.87866 0.38875 1.332 0.38875 0.91932 0 1.8148-0.51505 2.3084-1.4363 0.22532-0.42055 0.093138-0.95935-0.29534-1.2033z"/></g></g></g></g></svg>';
		var ret = '<table class="layui-table" lay-even lay-skin="line"><thead><tr><th>日期</th><th>标题</th><th>提醒</th><th>操作</th></tr></thead><tbody>';
		for (var i = 0; i < articles.length; i++) {
			var article = articles[i];
            var url = getArticleUrl() + '?fuid=' + fuid + "&id=" + article.id;
			ret += '<tr aibid="' + article.id + '"><td style="width: 180px;min-width:180px;">' + createTime(article.createdate) + '</td>';
			ret += '<td style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:300px;max-width:300px"><span name="aibOpen" class="aibTitle"><a target="_blank" href="' + url + '">' + htmlEncode(article.title) + '</a></span></td>';
            if (article.isaib) {
                if (article.aibdate > 2145887000) {
                    ret += '<td style="text-align:center"><div class="aibAlertWrapper" data="提醒已完成">' + alertIcon + '</div></td>';
                } else {
                    if (article.alert) {
                        ret += '<td style="text-align:center"><div class="aibAlertWrapper aibAlertActive aibAlertShake" data="提醒日期:' + createDate(article.aibdate) + '">' + alertIcon + '</div></td>';
                    } else {
                        ret += '<td style="text-align:center"><div class="aibAlertWrapper aibAlertActive" data="提醒日期:' + createDate(article.aibdate) + '">' + alertIcon + '</div></td>';
                    }
                }
            } else {
                ret += '<td style="text-align:center"><div class="aibAlertStrikethrough aibAlertWrapper" + data="无提醒">' + alertIcon + '</div></td>';
            }
			ret += '<td><button name="aibEdit" type="button" class="layui-btn layui-btn-sm">编辑</button><button name="aibDelete" type="button" class="layui-btn layui-btn-sm layui-btn-danger">删除</button></td></tr>';
		}
		ret += "</tbody></table>";
		return ret;
	}
	var tableStr = genTable(articles);
	document.getElementById('aibtable').innerHTML = tableStr;
    function getAibId(event) {
        return layui.$(event.target).parents("tr").attr("aibid") * 1;
    }
    addTips("span[name='aibOpen'] a", function(event) {return event.target.innerHTML;});
    addTips("div.aibAlertWrapper", function(event) {return layui.$(event.target).closest('div').attr('data');});
    layui.$("span[name='aibOpen']").click(function(event) {onAibListOpen(getAibId(event));});
    layui.$("button[name='aibEdit']").click(function(event){onAibListEdit(getAibId(event));});
    layui.$("button[name='aibDelete']").click(function(event){onAibListDelete(getAibId(event));});
}

function onAibCircleClick() {
    initLayui(function(){
        var windowId = layui.layer.tips('<span name="menuWrapper"><ul><li><button name="menuAdd" style="width:100%;" class="layui-btn layui-btn-sm layui-btn-normal">新增收藏</button></li><li><button name="menuMain" style="width:100%;margin-top: 5px;" class="layui-btn layui-btn-sm layui-btn-normal">收藏列表</button></li><li><button name="menuStopAlert" style="width:100%;margin-top: 5px;" class="layui-btn layui-btn-sm layui-btn-normal">今日勿扰</button></li></ul></span>', '#circleWrapper', {
            tips: [4, '#fff'],
            time: 5000
        });
        setTimeout(function(){
            layui.$('span[name="menuWrapper"]').mouseleave(function(){closeMenu();});
            layui.$('button[name="menuAdd"]').click(function(){closeMenu();onAibMenuAdd();});
            layui.$('button[name="menuMain"]').click(function(){closeMenu();onAibMenuMain();})
            layui.$('button[name="menuStopAlert"]').click(function(){closeMenu();onAibMenuStopAlert();});
        }, 100);
        function closeMenu() {
            layui.layer.close(windowId);
        }
    });
}

function onAibMenuAdd() {
    initAibEdit();
    aibEditPrevData = {};
    layui.form.val('aibEdit', {aibId: "", aibType: "0", aibTitle: document.title, aibIsAib: "on", aibContent: document.location.href});
    layui.$('#aibIsAibWrapper').show();
    aibEditWindowId = layui.layer.open({type: 1,title: '新增',content: layui.$('#aibEdit')});
}

function onAibMenuMain() {
    if (!mainPannelInit) {
        mainPannelInit = true;
        layui.$('#aibid').click(function(){
            initAibSyncTable();
            var fuid = getFuid();
            layui.$("input[name='syncId']").val(fuid);
            layui.layer.open({
                type: 1,
                title: '同步',
                content: layui.$('#aibSyncWrapper')
            });
        });
        // 绑定搜索事件
        layui.$('input[name="aibSearch"]').keypress(function(e){
            if (e.which == 13) {
                currentCurr = 1;
                renderPage();
            }
        });
        layui.$('#aibSearchButton').click(function(){
            currentCurr = 1;
            renderPage();
        });
    }

    mainMenuDataOk = false;
    layui.$('input[name="aibSearch"]').val('');
    currentCurr = 1;
    renderPage();
    waitAndDo(function() {return mainMenuDataOk}, function() {
        layui.layer.open({
            type: 1,
            title: '全能收藏夹',
            content: layui.$('#aibcontainer')
        });
    });
    // 其他终端添加的条目,在这里异步更新。
    var oldTotal = GM_getValue('prefetchData').total;
    forcePrefetch(function() {
        var newTotal = GM_getValue('prefetchData').total;
        if (oldTotal != newTotal) {
            renderPage();
        }
    })
}

function onAibMenuStopAlert() {
    GM_setValue('notAlert', (new Date()).toDateString());
    document.getElementsByClassName("bigcircle2")[0].style.display="none";
}

function onAibListOpen(id) {
    forcePrefetch();
}

function onAibListEdit(id) {
    var fuid = getFuid();
    var postData = {fuid: fuid, id: id, method: 'GET'};
    post(getArticleUrl(), postData, function(res) {
        if (res && res.errMsg) {
            layui.layer.msg(res.errMsg, {icon: 5});
        } else {
            initAibEdit();
            layui.form.val('aibEdit', {aibId: res.id + "", aibType: res.type + "", aibTitle: res.title, aibContent: res.content});
            layui.$('#aibIsAibWrapper').hide();
            aibEditWindowId = layui.layer.open({type: 1,title: '编辑',content: layui.$('#aibEdit')});
        }
    });
}

function onAibListDelete(id) {
    var fuid = getFuid();
    var postData = {fuid: fuid, id: id, method: 'DELETE'};
    post(getArticleUrl(), postData, function(res) {
        if (res && res.errMsg) {
            layui.layer.msg(res.errMsg, {icon: 5});
        } else {
            forcePrefetch(function() {
                renderPage();
                layui.layer.msg('删除成功');
            });
        }
    });
}


(function() {
    if (self != top) { // 只在顶层窗口生效
        return;
    }
    // 添加style
    var style = document.createElement("style");
    style.type = "text/css";
    var styleStr = ".smallcircle2{width: 30px; height: 30px;background-color: #0062d4;border-radius: 50%;position: absolute;}";
    styleStr += ".bigcircle2{display:none;width: 30px;height: 30px;background-color: #0062d4;opacity: 0.4;border-radius: 50%;position: absolute;animation: scales 1s infinite cubic-bezier(0,0,0.49,1.02);}";
    styleStr += "@keyframes scales {0%{transform: scale(1);}50%,75%{transform: scale(3);}68%,100%{opacity: 0;}}";
    styleStr += ".aibTitle a{color: #333} .aibTitle a:visited{color: #333}";
    styleStr += ".aibAlertShake .bell__body {  animation: bell 1s infinite ease-in-out;  transform-origin: 50% 30%; } .aibAlertShake .bell__clapper {  animation: clapper 1s infinite ease-in-out;  transform-origin: center center; }   @keyframes bell {  0% {  transform: rotate(0);  }  20% {  transform: rotate(12.5deg);  }  40% {  transform: rotate(-12.5deg);  }  60% {  transform: rotate(12.5deg);  }  80% {  transform: rotate(2deg);  }  85% {  transform: rotate(0);  }  100% {  transform: rotate(0);  } }   @keyframes clapper {  0% {  transform: translateX(0);  }  25% {  transform: translateX(-3px);  }  50% {  transform: translateX(4px);  }  75% {  transform: translateX(-2px);  }  100% {  transform: translateX(0);  } }";
    styleStr += ".aibAlertActive {color: #16baaa}";
    styleStr += ".aibAlertWrapper {width: 20px;height:20px}";
    styleStr += ".aibAlertStrikethrough {position: relative;}.aibAlertStrikethrough:before {display: block;width: 22px;position: absolute;content:'';left: 0;top: 50%;right: 0;border-top: 2px solid;border-color: inherit;transform:rotate(-45deg);}";
    styleStr += ".layui-form-label{box-sizing: content-box;}";
    styleStr += ".layui-layer-page{text-align:left;}";
    style.innerHTML = styleStr;
    document.getElementsByTagName("HEAD").item(0).appendChild(style);
    // 添加入口小圆圈
    var circleWrapper = document.createElement("div");
    circleWrapper.id = "circleWrapper";
    circleWrapper.style.position = "fixed";
    circleWrapper.style.right = "60px";
    circleWrapper.style.bottom = "120px";
    circleWrapper.style["z-index"]=999999999;
    circleWrapper.oncontextmenu = function(){return false;};
    circleWrapper.innerHTML = '<div class="bigcircle2"></div><div class="smallcircle2"></div>';
    document.body.appendChild(circleWrapper);
    // 小圆圈可拖动
    var circle = document.getElementById("circleWrapper");
    dragable(circle);
    // 主框
    var mainPannel = document.createElement("div");
    mainPannel.id = "aibcontainer";
    mainPannel.style.display = "none";
    mainPannel.style['min-width'] = "700px";
    mainPannel.innerHTML = '<div id="aibheader" style="box-sizing: content-box;height:25px;padding: 10px"><span style="float:left"><div class="layui-input-group"><input type="text" name="aibSearch" placeholder="搜索关键字" class="layui-input"><div id="aibSearchButton" class="layui-input-split layui-input-suffix" style="cursor: pointer;">搜索</div></div></span><span style="float:right;margin-top:10px">用户ID: <span id="aibid" style="cursor:pointer;text-decoration:underline"></span></span></div><div id="aibtable"></div><div id="aibfooter"></div>';
    document.body.appendChild(mainPannel);

    prefetch();
})();


function renderPage() {
    function jmp(obj) {
        var fuid = getFuid();
        currentCurr = obj.curr;
        var keyword = layui.$('input[name="aibSearch"]').val();
        post(baseUrl + "articles.php", {fuid: fuid, page: obj.curr - 1, size: obj.limit, keyword: keyword}, function(data) {
            updateAibTable(data['articles']);
            mainMenuDataOk = true;
        });
    }
    var keyword = layui.$('input[name="aibSearch"]').val();
    if (keyword !== "") {
        var fuid = getFuid();
        post(baseUrl + "articles.php", {fuid: fuid, keyword: keyword, countOnly: true}, function(data) {
            var cnt = data['count'];
            layui.laypage.render({
                elem: 'aibfooter',
                count: cnt,
                curr: currentCurr,
                jump: function(obj) {
                    jmp(obj);
                }
            });
        });
    } else {
        var prefetchData = GM_getValue('prefetchData');
        layui.laypage.render({
            elem: 'aibfooter',
            count: prefetchData.total,
            curr: currentCurr,
            jump: function(obj) {
                jmp(obj);
            }
        });
    }
}

var layuiInited = false;
function initLayui(callback) { // 延迟加载,只在打开列表的时候才加载layui
    if (layuiInited) {
        callback();
        return;
    }
    //CSP策略下初始化layui
    function initLayuiWithCSP(callback) {
        get("https://www.layuicdn.com/layui/css/layui.css", function(res) {
            var element = document.createElement('style');
            element.setAttribute('type', 'text/css');
            element.innerText = res;
            document.getElementsByTagName("HEAD").item(0).appendChild(element);
        });
        get("https://www.layuicdn.com/layui/layui.js", function(res) {
            eval(res);
            if (callback) {
                callback();
            }
        });
    }
    layuiInited = true;
    var element = document.createElement('script');
    element.setAttribute('type', 'text/javascript');
    element.src = "https://www.layuicdn.com/layui/layui.js";
    document.documentElement.appendChild(element);
    element = document.createElement('link');
    element.id = 'layuicss';
    element.setAttribute('rel', 'stylesheet');
    element.setAttribute('type', 'text/css');
    element.href = "https://www.layuicdn.com/layui/css/layui.css";
    document.documentElement.appendChild(element);
    waitAndDo(function() {
        try {
            layui.use(['layer', 'laypage', 'form'], callback);
            return true;
        } catch (e) {
            return false;
        }
    }, function(){}, 100, function(){
        // 如果0.1秒还没有加载layui的话,则认为被csp策略限制了。这时要使用另外的方式加载layui
        initLayuiWithCSP(function() {
            waitAndDo(function() {
                try {
                    layui.use(['layer', 'laypage', 'form'], callback);
                    return true;
                } catch (e) {
                    return false;
                }
            }, function(){});
        });
    });
}

var aibSyncTableInited = false;
function initAibSyncTable() {
    if (aibSyncTableInited) {
        return;
    }
    aibSyncTableInited = true;
    var syncStr = '<div style="display:none" id="aibSyncWrapper" class="aibSyncWrapper"><DIV style="text-align:center;color:red">输入其他电脑的同步ID,可实现内容的合并与同步。</DIV><div class="layui-form-item">';
    syncStr += '<div class="layui-inline"><label class="layui-form-label">同步ID: </label><div style="width:300px" class="layui-input-inline layui-input-wrap"><input type="text" name="syncId" class="layui-input"></div>';
    syncStr += '<div class="layui-form-mid" style="padding: 0!important;"> <button id="aibSyncBtn" type="button" class="layui-btn layui-btn-normal" >确认</button></div></div></div></div>';
    var doc = document.createElement('div');
    doc.innerHTML = syncStr;
    document.body.appendChild(doc);
    layui.form.render();
    layui.$("#aibSyncBtn").click(function(){
        var fuid = getFuid();
        var syncId = layui.$("input[name='syncId']").val();
        if (fuid == syncId) {
             layui.layer.msg('同步ID没有改动,无需同步');
        } else {
            post(baseUrl + "sync.php", {fuid: fuid, action: 'sync', syncId: syncId}, function(res) {
                if (res && res.errMsg) {
                    layui.layer.msg(res.errMsg, {icon: 5});
                } else {
                    GM_setValue('fuid', res.data);
                    forcePrefetch(function(){
                        renderPage();
                    });
                    layui.layer.msg('同步完成');
                }
            });
        }
    });
}


var aibEditInited = false;
function initAibEdit() {
    if (aibEditInited) {
        return;
    }
    aibEditInited = true;
    var aibEditStr = '<div style="display:none" id="aibEdit"><form class="layui-form" style="width:800px;padding:20px;display:inline-block" lay-filter="aibEdit">';
    aibEditStr += '<div style="display:none;"><input name="aibId" type="text"></input></div>';
    aibEditStr += '<div class="layui-form-item"><label class="layui-form-label">类型</label><div class="layui-input-block"><input type="radio" name="aibType" value="0" title="网址" checked="" lay-filter="aibTypeChange"></input><input type="radio" name="aibType" value="1" title="文本" lay-filter="aibTypeChange"></input></div></div>';
    aibEditStr += '<div class="layui-form-item"><label class="layui-form-label">标题</label><div class="layui-input-block"><input type="text" name="aibTitle" autocomplete="off" placeholder="请输入标题" class="layui-input"></input></div></div>';
    aibEditStr += '<div class="layui-form-item" id="aibIsAibWrapper"><label class="layui-form-label">艾宾浩斯</label><div class="layui-input-block"><input type="checkbox" checked="" name="aibIsAib" lay-skin="switch"  lay-text="开启|关闭"></input></div></div>';
    aibEditStr += '<div class="layui-form-item"><label class="layui-form-label">内容</label><div class="layui-input-block"><textarea name="aibContent" placeholder="请输入内容" class="layui-textarea"></textarea></div></div>';
    aibEditStr += '<div class="layui-form-item"><label class="layui-form-label"></label><div class="layui-input-block"><button id="aibSave" type="button" class="layui-btn">保存</button></div></div></form></div>';
    var doc = document.createElement('div');
    doc.innerHTML = aibEditStr;
    document.body.appendChild(doc);
    layui.form.render();
    layui.form.on('radio(aibTypeChange)', function(e){
        var formVal = layui.form.val('aibEdit');
        if (formVal.aibId == "") {
            var tmp = {aibTitle: formVal.aibTitle, aibContent: formVal.aibContent};
            layui.form.val('aibEdit', {aibTitle: aibEditPrevData.aibTitle, aibContent: aibEditPrevData.aibContent});
            aibEditPrevData = tmp;
        }
    });
    layui.$("#aibSave").click(function(){
        var formVal = layui.form.val('aibEdit');
        var fuid = getFuid();
        var postData = {fuid: fuid, title: formVal.aibTitle, content: formVal.aibContent, type: formVal.aibType * 1};
        if (formVal.aibId) {
            postData['method'] = 'UPDATE';
            postData['id'] = formVal.aibId * 1;
            post(getArticleUrl(), postData, function(res) {
                if (res && res.errMsg) {
                    layui.layer.msg(res.errMsg, {icon: 5});
                } else {
                    layui.layer.close(aibEditWindowId);
                    forcePrefetch(function() {
                        renderPage();
                        layui.layer.msg('修改成功');
                    });
                }
            });
        } else {
            postData['method'] = 'POST';
            postData['isaib'] = (formVal.aibIsAib == 'on' ? 1 : 0);
            post(getArticleUrl(), postData, function(res) {
                if (res && res.errMsg) {
                    layui.layer.msg(res.errMsg, {icon: 5});
                } else {
                    layui.layer.close(aibEditWindowId);
                    forcePrefetch();
                    layui.layer.msg('添加成功');
                }
            });
        }
    });
}

function forcePrefetch(callback) {
    GM_setValue('aibTTL', null);
    prefetch(callback);
}

function prefetch(callback) {
    function handleFetchData(fetchResult) {
        document.getElementById("aibid").innerHTML = fetchResult.id;
        if (fetchResult.alert > 0 && GM_getValue('notAlert') !== (new Date()).toDateString()) {
            document.getElementsByClassName("bigcircle2")[0].style.display="block";
        } else {
            document.getElementsByClassName("bigcircle2")[0].style.display="none";
        }
    }
    var ttl = GM_getValue('aibTTL');
    if (ttl && ttl > (new Date()).getTime()) {
        handleFetchData(GM_getValue('prefetchData'));
        if (callback) {
            callback();
        }
        return;
    }
	var fuid = getFuid();
	if (!fuid) {
		fuid = 'none';
	}

    var timer = -1;
    function timerFunc() {
        post(baseUrl + "prefetch.php", {fuid: fuid}, function(data){
            if (data.fuid != 'none') {
                if (timer != -1) {
                    clearInterval(timer);
                }
                GM_setValue('aibTTL', (new Date()).getTime() + data.ttl * 60000);
                GM_setValue('fuid', data.fuid);
                GM_setValue('prefetchData', data);
                handleFetchData(data);
                if (callback) {
                    callback();
                }
            } else {
                fuid = data.fuid;
            }
        });
    }
    timer = setInterval(timerFunc, 6000);
    timerFunc();
}

function dragable(obj) {
    function getScrollbarWidth() {
        var w1, w2, outer,inner;
        outer = document.createElement('div');
        inner = document.createElement('div');
        outer.appendChild(inner);
        outer.style.display = 'block';
        outer.style.position = 'absolute';
        outer.style.width = '50px';
        outer.style.height = '50px';
        outer.style.overflow = 'hidden';
        inner.style.height = '100px';
        inner.style.width = 'auto';
        document.body.appendChild(outer);
        w1 = inner.offsetWidth;
        outer.style.overflow = 'scroll';
        w2 = inner.offsetWidth;
        if (w1 === w2) {
            w2 = outer.clientWidth;
        }
        document.body.removeChild(outer);
        return w1 - w2;
    }
    function getScrollbarVisiable(){
        return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight);
    }
    var scrollbarWidth = getScrollbarWidth();
    var scrollbarVisiable = getScrollbarVisiable();
    var downX, downY;
    obj.onmousedown = function(event) {
        downX = event.clientX;
        downY = event.clientY;
        event = event || window.event;
        var ol = event.clientX - obj.offsetLeft;
        var ot = event.clientY - obj.offsetTop;
        document.onmousemove = function(event){
            event = event || window.event;
            var left = event.clientX - ol;
            var top = event.clientY - ot;
            if (scrollbarVisiable) {
                obj.style.right = (window.innerWidth - scrollbarWidth - left)+"px";
            } else {
                obj.style.right = (window.innerWidth - left)+"px";
            }
            obj.style.bottom = (window.innerHeight - top)+"px";
        };
        document.onmouseup = function(eventInner){
            document.onmousemove = null;
            document.onmouseup = null;
            if (eventInner.clientX == downX && eventInner.clientY == downY) {
                onAibCircleClick();
            }
        };
        return false;
    };
}

function waitAndDo(condition, callback, timeoutInMs, timeoutCallback) {
    var deadLine = 0;
    if (timeoutInMs) {
        deadLine = (new Date()).getTime() + timeoutInMs;
    }
    var timer = setInterval(function() {
        var now = (new Date()).getTime();
        if (deadLine != 0 && now > deadLine) {
            clearInterval(timer);
            timeoutCallback();
            return;
        }
        if (condition()) {
            clearInterval(timer);
            callback();
        }
    }, 20);
}

function post(url, data, callback) {
	GM.xmlHttpRequest({
		method: "POST",
		url: url,
        data: JSON.stringify(data),
		onload: function(res) {
            try {
                if (res.response) {
                    callback(JSON.parse(res.response));
                } else {
                    callback();
                }
            } catch (e) {
                console.log(res);
                console.log(res.response);
                layui.layer.msg("请稍后重试", {icon: 5});
            }
		}
	});
}

function get(url, callback) {
	GM.xmlHttpRequest({
		method: "GET",
		url: url,
		onload: function(res) {
			callback(res.response);
		}
	});
}

function createTime(v){
    var now = new Date(v * 1000);
    var yy = now.getFullYear();
    var mm = now.getMonth() + 1;
    var dd = now.getDate();
    var hh = now.getHours();
    var ii = now.getMinutes();
    var ss = now.getSeconds();
    var clock = yy + "-";
    if(mm < 10) clock += "0";
    clock += mm + "-";
    if(dd < 10) clock += "0";
    clock += dd + " ";
    if(hh < 10) clock += "0";
    clock += hh + ":";
    if (ii < 10) clock += '0';
    clock += ii + ":";
    if (ss < 10) clock += '0';
    clock += ss;
    return clock;
}

function createDate(v) {
    var now = new Date(v * 1000);
    var yy = now.getFullYear();
    var mm = now.getMonth() + 1;
    var dd = now.getDate();
    var clock = yy + "-";
    if(mm < 10) clock += "0";
    clock += mm + "-";
    if(dd < 10) clock += "0";
    clock += dd;
    return clock;
}

function htmlEncode(rawStr) {
    return rawStr.replace(/[\u00A0-\u9999<>\&]/g, function(i) {
        return '&#'+i.charCodeAt(0)+';';
    });
}

function getFuid() {
    return GM_getValue('fuid');
}

function getArticleUrl() {
    return baseUrl + 'article.php';
}

function addTips(elementSelector, msgSupplier) {
    var tmpWindowId;
    var tmpWindowTimer;
    layui.$(elementSelector).mouseenter(function(event){
        tmpWindowTimer = setTimeout(function() {
            tmpWindowTimer = 0;
            tmpWindowId = layui.layer.tips(msgSupplier(event), event.target, {
                tips: [1, ''],
                time: 5000
            });
        }, 500);
    });
    layui.$(elementSelector).mouseleave(function(event){
        if (tmpWindowTimer) {
            clearTimeout(tmpWindowTimer);
        } else {
            layui.layer.close(tmpWindowId);
        }
    });
}