Greasy Fork is available in English.

Google select text translator

Translate any selected text into the language you wants with google translator

As of 31.08.2019. See ბოლო ვერსია.

// ==UserScript==
// @id              googletranslatorbytoprapid
// @name            Google select text translator
// @name:zh-CN      谷歌点击划词翻译
// @version         3.62
// @namespace       https://greasyfork.org/en/scripts/36842
// @author          Toprapid
// @copyright       2017+,toprapid
// @description     Translate any selected text into the language you wants with google translator
// @description:zh-cn      谷歌点击划词翻译综合插件
// @match           http://*/*
// @match           https://*/*
// @grant           GM_registerMenuCommand
// @grant           GM_addStyle
// @grant           GM_xmlhttpRequest
// @grant           GM_getValue
// @grant           GM_setValue
// ==/UserScript==

//版本
var gtVer="3.62";

//缓存已经翻译过的信息内容
var transCache = [];
var transMd5Cache=[];
//缓存已经取得的音频数据内容
var transSoundCache=[];
var transSoundMd5Cache=[];
//
var sourceTranslateLanguageNameInStorage = "sourceTranslateLanguage";
var targetTranslateLanguageNameInStorage = "targetTranslateLanguage";
var translatorSettingLanguageInStorage="translatorSettingLanguage";
var defaultSourceLanguage = "-1";
var defaultTranslateLanguage = "0";
var currentSourceLanguage = parseInt(GM_getValue(sourceTranslateLanguageNameInStorage, defaultSourceLanguage));
var currentTranslateLanguage= parseInt(GM_getValue(targetTranslateLanguageNameInStorage, defaultTranslateLanguage));
var translatorSettingLanguage = GM_getValue(translatorSettingLanguageInStorage, "0") === "0" ? 0 : 1;
//国家与语言代码字符串
//国家
var uLanguageNames = [["中文", "中文", "中文", "英语", "英语", "英语", "英语", "英语", "英语", "英语", "英语", "芬兰语", "英语", "丹麦语", "英语", "希伯来语", "英语", "英语", "英语", "英语", "英语", "英语", "英语", "英语", "英语", "英语", "韩文", "日语", "荷兰语", "荷兰语", "葡萄牙语", "葡萄牙语", "法语", "法语", "法语", "法语", "法语", "西班牙语", "西班牙语", "西班牙语", "西班牙语", "西班牙语", "西班牙语", "西班牙语", "德语", "德语", "德语", "俄语","乌克兰语", "意大利语", "希腊语", "挪威语", "匈牙利语", "土耳其语", "捷克语", "斯洛文尼亚语", "波兰语", "瑞典语", "西班牙语"], ["Chinese", "Chinese", "Chinese", "English", "English", "English", "English", "English", "English", "English", "English", "Finnish", "English", "Danish", "English", "Hebrew", "English", "English", "English", "English", "English", "English", "English", "English", "English", "English", "Korean", "Japanese", "Dutch", "Dutch", "Portuguese", "Portuguese", "French", "French", "French", "French", "French", "Spanish", "Spanish", "Spanish", "Spanish", "Spanish", "Spanish", "Spanish", "German", "German", "German", "Russian","Ukrainian", "Italian", "Greek", "Norwegian", "Hungarian", "Turkish", "Czech", "Slovenian", "Polish", "Sweden Language", "Spanish"]];
//国家所对应的地区
var uRegionNames = [["简体", "繁体台湾", "繁体香港", "香港", "美国", "英国", "全球", "加拿大", "澳大利亚", "爱尔兰", "芬兰", "芬兰", "丹麦", "丹麦", "以色列", "以色列", "南非", "印度", "挪威", "新加坡", "新西兰", "印度尼西亚", "菲律宾", "泰国", "马来西亚", "阿拉伯", "韩国", "日本", "荷兰", "比利时", "葡萄牙", "巴西", "法国", "卢森堡", "瑞士", "比利时", "加拿大", "拉丁美洲", "西班牙", "阿根廷", "美国", "墨西哥", "哥伦比亚", "波多黎各", "德国", "奥地利", "瑞士", "俄罗斯", "乌克兰","意大利", "希腊", "挪威", "匈牙利", "土耳其", "捷克共和国", "斯洛文尼亚语", "波兰", "瑞典", "智利"],["Simplified", "Traditional Taiwan", "Traditional Hong Kong", "Hong Kong", "America", "United Kingdom", "Global", "Canada", "Australia", "Irish", "Finland", "Finland", "Denmark", "Denmark", "Israel", "Israel", "South Africa", "Indian", "Norway", "Singapore", "New Zealand", "Indonesia", "the Philippines", "Thai", "Malaysia", "Arab", "Korea", "Japan", "Dutch", "Belgium", "Portugal", "Brazil", "French", "Luxembourg", "Switzerland", "Belgium", "Canada", "Latin America", "Spain", "Argentina", "America", "Mexico", "Columbia", "Puerto Rico", "Germany", "Austria", "Switzerland", "Russia", "Ukraine","Italy", "Greece", "Norway", "Hungary", "Turkey", "Czech Republic", "Slovenian", "Poland", "Sweden", "Chile"]];
//最终代码
var uLanguageCode = ["zh-cn", "zh-tw", "zh-hk", "en-hk", "en-us", "en-gb", "en-ww", "en-ca", "en-au", "en-ie", "en-fi", "fi-fi", "en-dk", "da-dk", "en-il", "he-il", "en-za", "en-in", "en-no", "en-sg", "en-nz", "en-id", "en-ph", "en-th", "en-my", "en-xa", "ko-kr", "ja-jp", "nl-nl", "nl-be", "pt-pt", "pt-br", "fr-fr", "fr-lu", "fr-ch", "fr-be", "fr-ca", "es-la", "es-es", "es-ar", "es-us", "es-mx", "es-co", "es-pr", "de-de", "de-at", "de-ch", "ru-ru", "uk-uk","it-it", "el-gr", "no-no", "hu-hu", "tr-tr", "cs-cz", "sl-sl", "pl-pl", "sv-se", "es-cl"];
//google翻译api变量
var UA = navigator.userAgent;
var googleDomain = ["translate.google.cn", "translate.google.com"];
var dictURL = "https://" + googleDomain[translatorSettingLanguage] + "/translate_a/single?client=t";
var ttsURL = "http://" + googleDomain[translatorSettingLanguage] + "/translate_tts?client=t";
var audioContext= new AudioContext();
var tokenNameInStorage=["google_value_tk_zh_cn","google_value_tk_en_us"];
var isEnabled = true;
var isTranslatorDisabledTemporarily=false;
var oldText = "";
var searchedTextCache=[];
var searchedTextIndex=-1;
var speakerIconBase64Data="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QEQDhUFQkzk7wAAAIpJREFUOMtj/P//PwNFgAQD3jMwMDRg6MVjwHw0/n4GBob/DAwM5xkYGAQIGTAfqhgdFEDF1+MzAKYZl9P6oXIO2AxA1owsAXc2lH7PwMCwHtmA/zgwPLygYYBi0f///xmYSIgwByT2QxiDiYFCQIoBB5DY8rgSEtmBSLVopEpCokpSJjozMVKanQFy4nkNOfntnwAAAABJRU5ErkJggg==";
var settingIconBase64Data="data:image/png;base64,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";
var closeIconBase64Data="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFfUlEQVR4XuzQQQEAIAwAoWn/zrOEv4MInN2dsjtxAgTECRAQJ0BAnAABcQIE/CXgMWtuvW0UUQCeXa+96+56fQvGASInjh3fkiI1XF4QUPFUeADhXIUA5QfAX+g7/IK89oE2oQ1CgrYg0byUN96oE19L04KoFLW1vbtxbMe7nPE6o6zlQSi01ZxktRtrb983M2fOJFlZyZ9bXl34cmk1/8HS0pL3/wLgeyyuLF5YXMl/ge/NQTApAGCjq58sPhAk8VY4PPaVfMZ3mRfQXQB44/QyP57lBa4ky2c2xsLhrwWPtL28uvhn/tP8OFMCANLjEtBPkUg0mstk/RMTr4ipVNIXj09FQcIvIOGt0/Qkjnf/OjkVm8ikU75YLCbmchl1fDwa8fRct9bW1iR2eoBw9I7b7Y5Hoy8KGAD3UrwFAgGUmplRXG50gyaBDi9sJ5LTajgUwvciWyQSETyi+LLRbrzLjgCLe8HrJcPd8cI+1YdSqTRFAh0+mUqoIBBDOzYckiRx8MwoSzmgcdhpW8fwwxJUkJBJZ0AC55BAg0+lk2owEBwJj/eHh4cmZ3J1ZgR8e2XrervTftCoNzDwaAl+FWWzWSKBBp/OpNRgMESFrzfqqN3u/LW5ee17ZgRYEEc98/N79/c0TdepEvwgYTaXIxKG4TO5tBoK0eF1w0D37u1pR1bvMwuCqWnw6uWrv5ld9H61Wv13CQE/mpubIxL68C5hOzebhYQXpsOD2HK5rOFn4GcxWQhtbm7exhLwi2pNjSohABJePXu2LwHDz87l1HCYDq9pGiqWSn14/AyWK0EioVgq682GhmiJMRgKovn5eWX+3Dl1LDyGeJ4fCd9sNNHubkl3wLMsgEg4si7sFot6s+mQ4DjGOQEPCQyPYxi+AfA7u0Ud34vAsymALmFnZ1dvNBpOePqeRB2uKRR2HPCMC6BLKICE+pP68YxB9kMb+bxer6PCnQIFnmEB9JwAEgo7Bk5mpmmiTqeDixmYz9uo2+06JOhwzp3fC0avS+CfaQjoOcaBcdAXYNlNTbo+zgEul8s+p9VCzzOe+T9I4LneJXA344kpWZGVE/AcPnDkAPyFv3VNR5VaDTI/U0Pg9PDTibjsU3x9aH7Q4pxzbws5sYBKJhIKL5CKkfkeQIdPxnHL23CkdMasjtcY/hk2nA8MVK5USDJkWAAdHlreMc1Z+Jis6tqD5a04ACAnkNCaukMC2wIIPIJuPy2rquqY/0G2LQI2wzBQqVg28IepVFJRfD4CQM4bRLPZxBJYL4UJ/I2p6SnZB0DD1R3P28cHA/ie1VnoQcsWSxXIezoWQ3LCSRmKoqBEIuHj3eg6FsykgIXVhTd5G16Bbm9Pd5ZF9nbYS9riAH7zm62bx8USCNG1puaoCeBacr0iy2g6Pt2XAM96jakhAK3ihRerTsZiL/n9fiLFuQCy4SvlCsB3+/DDvQdn/ZkkHg7ycLXoKJH39u7/4VcCqfX19S4TPYDjzLe9klcegndA2Ov5E/CUshknvOGecDICINgrSeHHjccfMTMETI6bFCVRpAmClgf4qmEOwdMkVGpVrTmQMCpEyeOCnZ8ZAbxllqHM7YyCMg4OULVSM0xEgaf8PqF2twZ50RgJ0GodWrxlPWFGQCAwdhsWOA/39/dNR8trOgX+v0sYLKVJ7O8/Qp1O+2E2O/cdI0mQJLEE7+Z+8Hg844oiS+3WYQtav2P1essbG9e2T/l3xteRS9iQRCksih4eVpAWwP9t9Y7yV65s3WGuEDp//rwQiYTfsziUBrX3Jbf886VLl4yncM8Poc/7OJN7BC3/48WLF82nOQ3+054dFAEAACAM8uwf2iCyCHxnj18FAAAAAAAAAAAAAAAAAAAAABh6fiXP0juK5QAAAABJRU5ErkJggg==";
var copyIconBase64Data="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAB/UlEQVR4Xq2VMWvCUBDHLzFFsYiKOqi4iMZBUBMoFId+gWDpJnR0KDhKh36MrrWrLTgLguAiTi2hODuIH8DBRQU1mt4VHsRgYlLyh4MLgfu9/93jHqfrOpA4VLfbfaIUTDocDrDdbvVGo/EOADpcENVkEliiKMptvV5/AwttNhvIZrOPkUjkoVKpLMGheMMpebsTkYtisXi3Wq2+JpNJ1ClAMBThWH48Hun7BLDf72E+n4MkSSICvqbT6W2hUFg6BhhA1G8KKnjSIp7nQVVViMVi4mKxcAQRrFoym81AlmUaPpwRORLH43EH03sybTcDqwKgaRpYidpYLpcVhKjoJGoPcC8CMJcytYsgngJYK4PBIOC1FQmCM4t4BvD5fJBKpWA4HMJoNIJEIiGiiw/PAIIgQCgUgnw+D7lcjm4YxONxhX7ZAsg2CztRwXA4DMlkEjKZDKTTaSiVSrQRbiyvKQ2O9g4L1EVIIBAwH5CzdMBWAgXlXoi3ckC5FzI78B5gM4Oz324lYLAHR0cRhA2QrXHjUCn+BxgMBt/tdvsZt+gVgrj1en1VrVZfEHhteDNoR7kGMGmtVuuVPZm1Wq2Brna48BBgLzfrWqdgLWND9wxghmFxzS2ADuYI0Ov1PjudjoTbMuMU4Pf7t/1+/8epg12z2XzGxAfORXZPbsEvSLk9F+qUJXIAAAAASUVORK5CYII=";
var pinIconBase64Data="data:image/png;base64,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";
var nextIconBase64Data="data:image/png;base64,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";
var previousIconBase64Data="data:image/png;base64,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";
var searchIconBase64Data="data:image/png;base64,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";
var forbiddenIconBase64Data="data:image/png;base64,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";
var translatorIconBase64Data="data:image/png;base64,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";
var detailedIconBase64Data="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADVUlEQVR4Xr2WTYscRRzGf/+q6nEnmlVZEMFcsllEwYCZjSFmMYkgZCEXD549iAcPcY9eFhJEEI8LmYsnv4AHD8Z485CQSMwtgiJrcjABb4IkSjbT/Zhqumiane2Zxsn8TgUzXc/Tz/+FNiC8+Omlb/7J7eyjQkg8Ucwgc8Y+r0t/Xjj7LsD+xfPfad5EzagdgIX45pGbN37CeY85h2HMEiFUFBR5ztFjb1BpLgTAUuyh1+PWz7e4d/cukmYcvfHSgQMcfu0wkUrTAjWEkD0W/4Nz5z4unYrZYFAmOxxe5MjrAxqa1OC9QxJ5nvPLr78xS1595WUkRY0WA86naFhc3J+i43/QKKVUauxtwDmHAd57lpaWmCXxTis1WhLAxMHlQwyHQ3YjEGBpPoyuLC+vYEZLAmacWFvj5KlTVfQGCAEqBBLeAt4FDNdtCCV2Rg/Z2fm3pQdC4Pr1a9y5fZsmcGhlhZNrp/nqypdc276K4emCyDm+fIL33/xgnAFVYxj4fXubjY0NiqJo9Mbw4pB3Tp95LH6Fzz5ZAQWYOoUCbMTmF1f58K2PkqXxUwAqxX+8cRMzQxLHjx0lEnyGySMFvv7h+/j/iRtTiLzIee/tdQwfy9fSA94lY2RZlgw09gQYJmMhW4iXTRxTKRoYYbI0DRP2ABGV5agNqCqFT2d6Wa+DAUeJJoyhS5epdFobUP27AFUGvU1nwBwIoaTRtoojqs7JgKC5RgW9kOGm7AFfGAhAbSVIEQMqS0ACpRIAqhLwYWoDhRki3eEmNaEQNJyKEsynK2MCPcw8RjsC5PIUAM6PM6BmE6altIs0JBJZCDjzTEMhAylpUKLxCdQlqBOoUhHUPUoWsqnXsXCpeXF+dxPWb10VWbXT2qyoEWQ+dDBQ1CLpHfdqQilNRKhUm44lECILPcC6fBEmA3s3Ic5IhOCQNGbOBSgm0MkACKQ2A01CCEhgxlie6mV0RURaDaSF4+n3+ymB9K1IpNAI53P29bslEJ+RRpMNDAYDtra2sKZzVldXiawfOcPm55cxQhd9xIj1wTrjeKG/+a3mTdSM2g4g8455kzQDwNOB+89euPzMo7ygEE8UZ6V4qfk3YMBzwEHgecCYDwL+Au4E4EE8APeYLztR+z++nDG+ugE5XAAAAABJRU5ErkJggg==";
var simplifiedIconBase64Data="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4wgXBy0V6QJP6gAAA8hJREFUWMO9l01vW1UQhp+ZOefaqdN8KCmEIkFSUiAbWFCqSixgQaVKFRJ/gA1iwa9oxT9i07IGiQ8Jqa3KokgURSrQD9okpU0T4o87LM6913btuLFDOwvLC59z3nnnfWfGAoSlry59vdOR863ccee5hghEFY6YX7p78fynAEdnLlz2Fx0zFy47cDQA9Vae0v7xpx/Yy5vsNHfp5DmC/g85Ow7UYuRIrFPXOqdOv0/xZj0AUtK+2dzk2u0rXP/jenvryT+taNnh6AZydzre4uTLq1PLi8s3Pl49twaUpZbQe+D21j1ubf3Ghx80wrGF2eB5VlwDPsHjKTp0aHLjxjbX1n+ZP/f2J32/6wOwvbfD5s591t5c4dVF5a/NhyCKikxAPOR5h3ot8Epjnj/v3OPWg7u7Zro/gKiRIBmdduTm3Tt8e+UqpkYw68vpoHXfa+6xODfH2dNnUM/IrIap7Q9AVNNDDqZGLWSohgLAmAy448GJFhGXdK+A6ggGeittqtSyGipGsDAuAQUHkIWIiCTVeeoD+zMg5WlHVQkWUDVMLV0yJoBO6GAFew4sTi+uqIxgQNXwsoICaoZJAsABAUhBf2LR0AqAc//xg/UYspUhALwAoJQeVZRohoqhasgELggeCKXoPH1kIesrdz8DPfSICGYBFR1Q7kF9ENywSnSJVdMwygVS1U9EEoWiEzLg5Jp3WS3FbaNsKJKOegIQNSAFiGFOGa4BqXTkljL2Uhf+DBtKz/UiyQUiOnDooBoAuhoAxBnoqk+5QKsmopLoUlFUtPL1wWdBSkdNqdwtBypBQp8YMES0uGz8CCQLV9bGn1ECla5gRTAzBEUnBCBC4aBSF6BDh5F36+6lCxCCBgQZrwv2Rp5auvQsANbXF4aUoFSsqKQZcAgAIlq4wCuRqw0RoVeNqPSBo2hF38QAkKoReTFjyi3PR4mw/B7MkgAnrIBramZlCdzh6TUzMDgOAcdMyWI45DoKMWi5YqSsRwFod9q02v9Sqzkz0fDZbGDDG7cdxyA0VFFtsdfaHWLVnliYneO1xWWuXt/h15uPabdsYvorO6tjlvPkUYN3VtamRwJ4Y+l1Trz01sPvfv6++ffWRrsW63gPgIWjC8c3Hm/cHmstz3PaeZP3Vt+dOXVy7Xfg2ACAsv+sLK3yxdkv5z776HNy927y/SwcH3cgOBDNqMXame7o7wEQi+4ULRKnItNTPPeIpuyWABqB7dmL30y3Ojn5c/5zqpIebwS2HxXkzgErwDyHk9y4Dt0C1gWIQAPIeLHRBJ78B15HplODYzQFAAAAAElFTkSuQmCC";
var ANS_TYPE_GOOGLE_RESULT=0,ANS_TYPE_ZDIC_HTML=2,ANS_TYPE_YOUDAO_WORD=3,ANS_TYPE_YOUDAO_SENTENCE=4;
var CACHE_TYPE_GOOGLE_RESULT=0,CACHE_TYPE_ZDIC_HTML=1,CACHE_TYPE_YOUDAO_WORD=2,CACHE_TYPE_YOUDAO_SENTENCE=3;

var lingoesServerConfigNameInStorage="lingoesServerConfig";
var defaultLingoesServerConfigValue="0|0|127.0.0.1|11111";
var lingoes_isEnabled=!1,lingoes_showingWay=0,lingoes_serverIp="127.0.0.1",lingoes_serverPort="11111";
var youdaoConfigNameInStorage="youdaoConfig";
var defaultYoudaoConfigValue="0|0|0";
var youdao_isEnabled=!1,youdao_isOnlyForSingleWord=!0;
var hotKeyNameInStorage="hotKeyName";
var hotKeyNameForQSInStorage = "QSHotKeyName";
var defaultHotKeyValue= "1|1|1|81"; //Ctrl+Alt+Q enabled
var defaultHotKeyValueForQS="1|1|1|68"; //Ctrl+Alt+D enabled
var hotKey_Ctrl=!0,hotKey_Alt=!0,hotKey_Code=81, hotkey_isActive = !0, isHotkeyEventRegistered=!1;
var hotKey_Ctrl_forQS = !0, hotKey_Alt_forQS = !0, hotKey_Code_forQS = 68, hotkey_isActive_forQS = !0, isHotkeyEventRegistered_forQS = !1;
var hotkeyType_forPlugin=0;
var hotkeyType_forQS=1;
var isPinned=!1;
var isToolBarMoving=!1;
var tBarOffsetX=0;
var tBarOffsetY=0;
var isEnableSimpleMode=!1;
var isEnableSimpleModeDefaultConfig="0";
var isEnableSimpleModeConfigString="isEnableSimpleModeConfigString";
//current target language for playing sound
var curTarLanForSpeaker = uLanguageCode[currentTranslateLanguage];

getHotKeyValue(hotkeyType_forPlugin);
getHotKeyValue(hotkeyType_forQS);
getLingoesConfigValue();
getYoudaoConfigValue();
getSimpleModeConfigValue();

window.document.body.addEventListener("mouseup", googleTranslate, false);

var on = function (node, e, f) {
    node.addEventListener(e, f, false);
};
var $ = function (s) {
    return document.getElementById('gt_prefs_' + s);
};


var setup=function() {
    var d = document;
    if ($('setup')) return;
    var div = d.createElement('div');
    div.id = 'gt_prefs_setup';
    d.body.appendChild(div);
    var styleNode = GM_addStyle(`
            #gt_prefs_setup {opacity:0.9; box-shadow:-2px 0px 9px 5px #898D91;position:fixed;z-index:2147483647;top:30px;right:60px;padding:20px 30px;background:radial-gradient(circle, rgba(31,103,127,1) 0%, rgba(83,160,124,1) 94%, rgba(132,175,155,1) 96%, rgba(31,96,161,1) 98%, rgba(56,115,173,1) 98%, rgba(5,183,246,1) 100%);width:600px;border:1px solid black; border-radius:10px;}
            #gt_prefs_setup * { color:#deff08;text-align:left;line-height:normal;font-size:12px; }
            #gt_prefs_setup a { color:black;text-decoration:underline; }
            #gt_prefs_setup div { text-align:center;font-weight:bold;font-size:14px; }
            #gt_prefs_setup ul { margin:15px 0 15px 0;padding:0;list-style:none;border:0; }
            #gt_prefs_setup input,select {border:1px solid blue;border-radius:5px;width:auto;padding:2px;background:#53a07c;text-align:center;}
            #gt_prefs_setup li { margin:0;padding:6px 0;vertical-align:middle;border:0 }
            #gt_prefs_setup button { background:transparent;width:150px;margin:0 10px;text-align:center;border:1px blue solid;border-radius:5px;box-shadow:2px 2px 2px 1px #2C3E50;}
            #gt_prefs_setup textarea { width:98%; height:60px; margin:3px 0; text-align:center;border-radius:5px;}
            #gt_prefs_setup b { font-weight: bold; font-family: "微软雅黑", sans-serif; }
            #gt_prefs_setup button:disabled { color: graytext; }
    `);
    var sb_Title=["谷歌点击划词翻译设置","Google select text translator Setting"],
        sb_CurStatus = [["(启用中)", "(禁用中)"], ["(Enabled)", "(Disabled)"]],
        sb_HotkeyForQuickSearch = ["快速查询热键:", "Hotkey for Quick Search:"],
        sb_HotkeyActivatorForQuickSearch = ["启用热键", "Enable Hotkey"],
        sb_Usage = ["插件开关热键:", "Hotkey for Plugin switch:"],
        sb_HotKeyActivator=["启用热键","Enable Hotkey"],
        sb_CurVersion=["当前版本:","Current Version "],
        sb_CurAuthor=[",作者:",", Author: "],
        sb_CurUILanguage=[",Current UI Language:",", 当前界面语言:"],
        sb_UILanguage=[["Chinese Simplified","English"],["英文","中文"]],
        sb_SourceLanguage = ["指定源语言:", "Select the source language:"],
        sb_SourceLanguageSetToAuto = ["自动检测", "Auto Detect"],
        sb_TargetLanguage=["设置目标翻译语言:","Select the target language to translate:"],
        sb_Confirmation=[["确定","取消"],["Save","Cancel"]],
        sb_UseLingoesAPILocalServer=["启用本地灵格斯API服务(需要本机安装灵格斯词典软件,并在其设置中启用API服务器)。","Enable Lingoes Local API Server (Need Lingoes software installed, and enable it's API server)."],
        sb_LingoesAPIServerIP=["灵格斯API服务器 -- IP地址:","Lingoes Local API Server -- IP:"],
        sb_LingoesAPIServerPort=["端口号:","Port:"],
        sb_LingoesShowingWay=[["显示取词窗口","主界面取词","主界面翻译文字","查询方式:"],["Showing query result","Main UI query","Main UI translator","Query way:"]],
        sb_LingoesErrorWarning=[["输入的IPv4地址不规范!本地地址一般为:127.0.0.1","端口号必须为0-65535间的数字!"],["The Ipv4 address is wrong! For localhost server, use 127.0.0.1 please!","Port number must be a digital between 0 to 65535"]],
        sb_UseYoudaoSever=["启用有道翻译代替谷歌翻译引擎(注:仅限中英互译):","Use Youdao translator (PS: only used between Chinese and English):"],
        sb_YoudaoTranslationWay=[["全面启用","仅限单词"],["Totaly enabled","Only for words"]],
        sb_ErrorWarning=["输入的热键必须为字母或数字!","The hot key must be alphabet or digital!"],
        sb_SimpleMode=["简洁模式(仅翻译成目标语言)","Simple Mode (Show translated content only)"];
    var divHtml = `
        <div>${sb_Title[translatorSettingLanguage]}${sb_CurStatus[translatorSettingLanguage][(isEnabled ? 0:1)]}</div>
            <ul>
                <li>${sb_CurVersion[translatorSettingLanguage]} <b>${gtVer}</b>${sb_CurAuthor[translatorSettingLanguage]}<b>Toprapid</b>${sb_CurUILanguage[translatorSettingLanguage]}
                    <select id="gt_prefs_se_curUILanguage">
                        <option value="0" selected="selected">${sb_UILanguage[translatorSettingLanguage][0]}</option>
                        <option value="1">${sb_UILanguage[translatorSettingLanguage][1]}</option>
                    </select>
                </li>
                <li>${sb_Usage[translatorSettingLanguage]}
                    <input type="checkbox" id="gt_prefs_cb_ctrl" value="Ctrl" />Ctrl<b>+</b>
                    <input type="checkbox" id="gt_prefs_cb_alt" value="Alt" />Alt<b>+</b>
                    <input type="text" maxlength="1" style="text-transform:uppercase;" onclick="javascript:this.select();" id="gt_prefs_txt_key" value="${String.fromCharCode(hotKey_Code)}" />
                    <input type="checkbox" id="gt_prefs_cb_stat" value="isActive" />${sb_HotKeyActivator[translatorSettingLanguage]}
                </li>
                <li>${sb_HotkeyForQuickSearch[translatorSettingLanguage]}
                    <input type="checkbox" id="gt_prefs_cb_ctrl_forQS" value="Ctrl" />Ctrl<b>+</b>
                    <input type="checkbox" id="gt_prefs_cb_alt_forQS" value="Alt" />Alt<b>+</b>
                    <input type="text" maxlength="1" style="text-transform:uppercase;" onclick="javascript:this.select();" id="gt_prefs_txt_key_forQS" value="${String.fromCharCode(hotKey_Code_forQS)}" />
                    <input type="checkbox" id="gt_prefs_cb_stat_forQS" value="isActive" />${sb_HotkeyActivatorForQuickSearch[translatorSettingLanguage]}
                </li>
                <li><input type="checkbox" id="gt_prefs_cb_stat_enable_simple_mode" value="isEnableSimpleMode" />${sb_SimpleMode[translatorSettingLanguage]}</li>
                <li><input type="checkbox" id="gt_prefs_cb_stat_using_lingoes" onclick="javascript:document.getElementById('gt_prefs_li_lingoes_config').style.display=(this.checked ? 'block':'none');" value="isActive" />${sb_UseLingoesAPILocalServer[translatorSettingLanguage]}</li>
                <li id="gt_prefs_li_lingoes_config">${sb_LingoesAPIServerIP[translatorSettingLanguage]}
                       <input type="text" maxlength="15" onclick="javascript:this.select();" id="gt_prefs_txt_lingoes_ip" value="${lingoes_serverIp}" />
                       ${sb_LingoesAPIServerPort[translatorSettingLanguage]}
                       <input type="text" maxlength="15" onclick="javascript:this.select();" id="gt_prefs_txt_lingoes_port" value="${lingoes_serverPort}" />
                       <br/>
                       ${sb_LingoesShowingWay[translatorSettingLanguage][3]}
                       <select id="gt_prefs_se_lingoes_showingWay">
                       `;
    for (let i=0;i<3;i++){
            divHtml+=`<option value="${i}" ${lingoes_showingWay===i ? 'selected="selected"':''}>${sb_LingoesShowingWay[translatorSettingLanguage][i]}</option>`
    }
        divHtml+=`</select></li>
                <li>
                    <input type="checkbox" id="gt_prefs_cb_stat_using_youdao" value="isActive" />${sb_UseYoudaoSever[translatorSettingLanguage]}
                    <select id="gt_prefs_se_youdao_trans_way">
                        <option value="0" ${!youdao_isOnlyForSingleWord ? 'selected="selected"' : ''}>${sb_YoudaoTranslationWay[translatorSettingLanguage][0]}</option>
                        <option value="1" ${youdao_isOnlyForSingleWord ? 'selected="selected"' : ''}>${sb_YoudaoTranslationWay[translatorSettingLanguage][1]}</option>
                    </select>
                </li>
                <li>${sb_SourceLanguage[translatorSettingLanguage]}
                    <select id="gt_prefs_se_curSourceLanguage">
                        <option value="0" ${currentSourceLanguage < 0 ? 'selected="selected"' : ''}>${sb_SourceLanguageSetToAuto[translatorSettingLanguage]}</option>`;
    for (let i = 0; i < uLanguageCode.length; i++) {
        if (currentSourceLanguage === i) divHtml += `<option value="${i}" selected="selected">${uLanguageNames[translatorSettingLanguage][i]}-${uRegionNames[translatorSettingLanguage][i]}(${uLanguageCode[i]})</option>`;
        else divHtml += `<option value="${i}">${uLanguageNames[translatorSettingLanguage][i]}-${uRegionNames[translatorSettingLanguage][i]}(${uLanguageCode[i]})</option>`;
    }
    divHtml+=`</select>
                </li>
                <li>${sb_TargetLanguage[translatorSettingLanguage]}
                    <select id="gt_prefs_se_curTargetLanguage">`;
    for (let i=0;i<uLanguageCode.length;i++){
        if (currentTranslateLanguage===i) divHtml += `<option value="${i}" selected="selected">${uLanguageNames[translatorSettingLanguage][i]}-${uRegionNames[translatorSettingLanguage][i]}(${uLanguageCode[i]})</option>`;
        else divHtml+=`<option value="${i}">${uLanguageNames[translatorSettingLanguage][i]}-${uRegionNames[translatorSettingLanguage][i]}(${uLanguageCode[i]})</option>`;
    }
    divHtml += `</select>
                </li>
            </ul>
        <div><button id="gt_prefs_ok">${sb_Confirmation[translatorSettingLanguage][0]}</button><button id="gt_prefs_cancel">${sb_Confirmation[translatorSettingLanguage][1]}</button></div>`;
    div.innerHTML= divHtml;
    div = null;

    var close = function () {
        if (styleNode) {
            styleNode.parentNode.removeChild(styleNode);
        }
        var div = $('setup');
        div.parentNode.removeChild(div);
    };

    on($('ok'), 'click', function () {
        //save lingoes server config
        if(!/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/.test($("txt_lingoes_ip").value.trim())){
            alert(sb_LingoesErrorWarning[translatorSettingLanguage][0]);
            return;
        }
        if (!/^[0-9]{1,5}$/.test($("txt_lingoes_port").value.trim())){
            alert(sb_LingoesErrorWarning[translatorSettingLanguage][1]);
            return;
        }
        var portNum=parseInt($("txt_lingoes_port").value.trim());
        if (portNum<0&&portNum>65535){
            alert(sb_LingoesErrorWarning[translatorSettingLanguage][1]);
            return;
        }
        saveLingoesSettings($("cb_stat_using_lingoes").checked, $("se_lingoes_showingWay").selectedIndex, $("txt_lingoes_ip").value.trim(), $("txt_lingoes_port").value.trim());
        saveYoudaoSettings($("cb_stat_using_youdao").checked, $("se_youdao_trans_way").selectedIndex, null);
        saveSimpleModeSetting($("cb_stat_enable_simple_mode").checked);
        if (translatorSettingLanguage===0){
            youdao_isEnabled= $("cb_stat_using_youdao").checked;
            GM_setValue(youdaoConfigNameInStorage,(youdao_isEnabled ? "1":"0")+"|1|0");
        }
        if ($("se_curUILanguage").selectedIndex > 0){
            translatorSettingLanguage= translatorSettingLanguage===0 ? 1:0;
            GM_setValue(translatorSettingLanguageInStorage, translatorSettingLanguage.toString());
            dictURL = "https://" + googleDomain[translatorSettingLanguage] + "/translate_a/single?client=t";
        }
        if ($("se_curSourceLanguage").selectedIndex !== currentSourceLanguage) {
            currentSourceLanguage = $("se_curSourceLanguage").selectedIndex - 1;
            GM_setValue(sourceTranslateLanguageNameInStorage, currentSourceLanguage.toString());
        }
        if ($("se_curTargetLanguage").selectedIndex!==currentTranslateLanguage){
            currentTranslateLanguage= $("se_curTargetLanguage").selectedIndex;
            GM_setValue(targetTranslateLanguageNameInStorage,currentTranslateLanguage.toString());
        }
        var kyc= $("txt_key").value.toUpperCase().charCodeAt(0);
        if (kyc!==hotKey_Code || $("cb_ctrl").checked!==hotKey_Ctrl || $("cb_alt").checked!==hotKey_Alt || $("cb_stat").checked!==hotkey_isActive){
            if (kyc<=128){
                makeAndSaveHotKeyValue($("cb_stat").checked, $("cb_ctrl").checked, $("cb_alt").checked, kyc, hotkeyType_forPlugin);
            }
            else{
                alert(sb_ErrorWarning[translatorSettingLanguage]);
            }
        }
        kyc = $("txt_key_forQS").value.toUpperCase().charCodeAt(0);
        if (kyc !== hotKey_Code_forQS || $("cb_ctrl_forQS").checked !== hotKey_Ctrl_forQS || $("cb_alt_forQS").checked !== hotKey_Alt_forQS || $("cb_stat_forQS").checked !== hotkey_isActive_forQS) {
            if (kyc <= 128) {
                makeAndSaveHotKeyValue($("cb_stat_forQS").checked, $("cb_ctrl_forQS").checked, $("cb_alt_forQS").checked, kyc, hotkeyType_forQS);
            }
            else {
                alert(sb_ErrorWarning[translatorSettingLanguage]);
            }
        }
        close();
    });
    if (lingoes_isEnabled) $("cb_stat_using_lingoes").checked = true;
    if(isEnableSimpleMode) $("cb_stat_enable_simple_mode").checked=true;
    else $("li_lingoes_config").style.display = "none";
    $("se_youdao_trans_way").selectedIndex = youdao_isOnlyForSingleWord ? 1 : 0;
    $("cb_stat_using_youdao").checked = youdao_isEnabled;
    if (hotkey_isActive) $("cb_stat").checked = true;
    if (hotKey_Ctrl)$("cb_ctrl").checked = true;
    if (hotKey_Alt) $("cb_alt").checked = true;
    if (hotkey_isActive_forQS) $("cb_stat_forQS").checked = true;
    if (hotKey_Ctrl_forQS) $("cb_ctrl_forQS").checked = true;
    if (hotKey_Alt_forQS) $("cb_alt_forQS").checked = true;
    on($('cancel'), 'click', close);
};

function saveLingoesSettings(isEnabled,showingWay,ip,port){
    lingoes_isEnabled=isEnabled;
    var lingoesConfigStr = (lingoes_isEnabled ? "1|" : "0|") + (lingoes_showingWay = showingWay).toString() + "|" + (lingoes_serverIp = ip) + "|" + (lingoes_serverPort = port);
    GM_setValue(lingoesServerConfigNameInStorage, lingoesConfigStr);
}

function saveYoudaoSettings(isEnabled,showingWay,Reserved) {
    youdao_isEnabled=isEnabled;
    youdao_isOnlyForSingleWord = showingWay === 1;
    GM_setValue(youdaoConfigNameInStorage, (youdao_isEnabled ? "1|" : "0|") + (youdao_isOnlyForSingleWord ? "1|" : "0|") + (Reserved == null ? "0" : Reserved));
}

function saveSimpleModeSetting(isEnable){
    GM_setValue(isEnableSimpleModeConfigString, ((isEnableSimpleMode=isEnable)==true ? "1":"0"));
}

function makeAndSaveHotKeyValue(hkStat,hkCtrl,hkAlt,keyCode,hotkeyType) {
    var kv;
    switch(hotkeyType){
        case hotkeyType_forPlugin:
            kv = ((hotkey_isActive = hkStat) ? "1|" : "0|") + ((hotKey_Ctrl = hkCtrl) ? "1|" : "0|") + ((hotKey_Alt = hkAlt) ? "1|" : "0|") + (hotKey_Code = keyCode).toString();
            GM_setValue(hotKeyNameInStorage, kv);
            break;
        case hotkeyType_forQS:
            kv = ((hotkey_isActive_forQS = hkStat) ? "1|" : "0|") + ((hotKey_Ctrl_forQS = hkCtrl) ? "1|" : "0|") + ((hotKey_Alt_forQS = hkAlt) ? "1|" : "0|") + (hotKey_Code_forQS = keyCode).toString();
            GM_setValue(hotKeyNameForQSInStorage,kv);
            break;
        default:
            console.log("Error occured while make and save hot key value.");
            return;
    }
    registerHotKeyEvent(hotkeyType);
}

function getHotKeyValue(hotkeyType) {
    var keyCodes="";
    switch (hotkeyType){
        case hotkeyType_forPlugin:
            keyCodes = GM_getValue(hotKeyNameInStorage, defaultHotKeyValue).split("|");
            if (keyCodes.length !== 4) keyCodes = defaultHotKeyValue.split("|");
            hotKey_Ctrl = keyCodes[1] === "1";
            hotKey_Alt = keyCodes[2] === "1";
            hotKey_Code = parseInt(keyCodes[3]);
            hotkey_isActive = keyCodes[0] === "1";
            break;
        case hotkeyType_forQS:
            keyCodes = GM_getValue(hotKeyNameForQSInStorage, defaultHotKeyValueForQS).split("|");
            if (keyCodes.length !== 4) keyCodes = defaultHotKeyValueForQS.split("|");
            hotKey_Ctrl_forQS = keyCodes[1] === "1";
            hotKey_Alt_forQS = keyCodes[2] === "1";
            hotKey_Code_forQS= parseInt(keyCodes[3]);
            hotkey_isActive_forQS = keyCodes[0] === "1";
            break;
        default:
            return;
    }
    registerHotKeyEvent(hotkeyType);
}

function getLingoesConfigValue(){
    var rst = GM_getValue(lingoesServerConfigNameInStorage, defaultLingoesServerConfigValue).split("|");
    lingoes_isEnabled = rst[0] === "1";
    lingoes_showingWay = parseInt(rst[1]);
    lingoes_serverIp = rst[2];
    lingoes_serverPort = rst[3];
}

function getSimpleModeConfigValue(){
    let rst=GM_getValue(isEnableSimpleModeConfigString,isEnableSimpleModeDefaultConfig);
    isEnableSimpleMode= rst===isEnableSimpleModeDefaultConfig ? false:true;
}

function getYoudaoConfigValue() {
    var rst = GM_getValue(youdaoConfigNameInStorage, defaultYoudaoConfigValue);
    youdao_isEnabled = rst[0] === "1";
    youdao_isOnlyForSingleWord = rst[1] === "1";
}

function registerHotKeyEvent(hotkeyType){
    switch(hotkeyType){
        case hotkeyType_forPlugin:
            if (hotkey_isActive) {
                if (!isHotkeyEventRegistered) {
                    window.document.body.addEventListener("keyup", toggleGoogleTranslate, false);
                    isHotkeyEventRegistered = !0;
                }
            }
            else {
                if (isHotkeyEventRegistered) {
                    window.document.body.removeEventListener("keyup", toggleGoogleTranslate, false);
                    isHotkeyEventRegistered = !1;
                }
            }
            break;
        case hotkeyType_forQS:
            if (hotkey_isActive_forQS) {
                if (!isHotkeyEventRegistered_forQS) {
                    window.document.body.addEventListener("keyup", toggleQuickSearch, false);
                    isHotkeyEventRegistered_forQS = !0;
                }
            }
            else {
                if (isHotkeyEventRegistered_forQS) {
                    window.document.body.removeEventListener("keyup", toggleQuickSearch, false);
                    isHotkeyEventRegistered_forQS = !1;
                }
            }
            break;
        default:
            return;
    }
}

GM_registerMenuCommand("Google select text translator Setting(谷歌划词设置)", setup);

function createToolTip(){
    let tp=$("toolTip");
    if(!tp){
        tp=document.createElement("span");
        tp.id="gt_prefs_toolTip";
        document.body.appendChild(tp);
        GM_addStyle(`
        #gt_prefs_toolTip{position: absolute;background: #eafdff;border-radius: .4em;display:none;color:blue;font-weight:bold;font-size:14px;}
        #gt_prefs_toolTip:after {content: '';position:absolute;bottom: 0;left: 50%;width:auto;height:auto;border: 20px solid transparent;border-top-color: #eafdff;border-bottom: 0;border-left: 0;margin-left: -10px;margin-bottom: -20px;}
        `)
    }
    return tp;
}

function createTranslatorIcon(){
    let ci=$("translator_icon");
    if(!ci){
        ci=document.createElement("img");
        ci.id="gt_prefs_translator_icon";
        ci.setAttribute("src",translatorIconBase64Data);
        ci.width=32;
        ci.height=32;
        ci.style.display="none";
        ci.style.position="absolute";
        ci.onmouseover=function(e){
            ci.style.display="none";
            toolTip.show(this,e);
            setTimeout(function(){
                toolTip.hide();
            },2000);
            isTranslatorDisabledTemporarily=!1;
            googleTranslate(e);
        }
        document.body.appendChild(ci);
    }
    return ci;
}

var toolTip={
    s:{"gt_prefs_iconForbidden":["暂停","Disable"],"gt_prefs_iconPrevious":["上一个","Previous"],"gt_prefs_iconSetting":["设置","Setting"],"gt_prefs_iconSearch":["搜索","Search"],"gt_prefs_iconClose":["关闭","Close"],"gt_prefs_iconNext":["下一个","Next"],"gt_prefs_iconCopy":["拷贝","Copy"],"gt_prefs_iconPin":["固定","Pin to screen"],"gt_prefs_translator_icon":["翻译中...","Translating..."],"gt_prefs_iconDetailed":["详解模式","Detailed Mode"],"gt_prefs_iconSimplified":["简洁模式","Simplified Mode"]},
    show(el,e){
        let tp=createToolTip();
        tp.innerHTML=toolTip.s[el.id][translatorSettingLanguage];
        tp.style.left=(el.offsetLeft+$("translatorDiv").offsetLeft+$("tBar").offsetLeft-(tp.innerHTML.length*5/2))+"px";
        tp.style.top=(el.offsetTop+el.parentNode.offsetTop+el.parentNode.parentNode.offsetTop-40)+"px";
        tp.style.display="block";
    },
    hide(){
        $("toolTip").style.display="none";
    }
};

function toggleGoogleTranslate(e) {
    if(e.keyCode === 27){
        if(isToolBarMoving){
            window.removeEventListener("mousemove", divMove, true);
            isToolBarMoving=!1;
            return;
        }
    }
    if (e.keyCode === hotKey_Code && (hotKey_Alt ? e.altKey : e.altKey === false) && (hotKey_Ctrl ? e.ctrlKey : e.ctrlKey === false)) {
        if (isEnabled) {
            window.document.body.removeEventListener("mouseup", googleTranslate, false);
            alert(translatorSettingLanguage ? "Google select text translator is disabled!":"谷歌点击划词翻译,已禁用!");
            isEnabled = isTranslatorDisabledTemporarily = false;
            $('translatorDiv').style.display="none";
        } else {
            iconForbidden.style.border="1px solid red";
            window.document.body.addEventListener("mouseup", googleTranslate, false);
            alert(translatorSettingLanguage ? "Google select text translator is enabled!" : "谷歌点击划词翻译,已启用!");
            isEnabled = isTranslatorDisabledTemporarily = true;
            $('translatorDiv').style.display="block";
        }
    }
}

var quickSearchDiv=null;
var searchBox=null;
var oldSIdx=-1,oldDIdx=-1;
function showQuickSearch(){
  //Showing quick searching pannel
  if (!quickSearchDiv){
    GM_addStyle(`
        #gt_prefs_quickSearch { position:fixed;z-index:998;top:30%;left:30%;width:40%;padding:0.3%;background:radial-gradient(ellipse at center, #EDF4FC 0%,#e3edf9 60%,#c9d7e5 80%, #c3cedb 90%, #bac6d3 95%, #adb5bc 100%);border:1px solid black;box-shadow:-2px 0px 9px 5px #898D91;opacity:0.9; border-radius:5px;}
        #gt_prefs_quickSearch * { color:black;text-align:left;line-height:normal;font-size:12px; }
        #gt_prefs_quickSearch a { color:black;text-decoration:underline; }
        #gt_prefs_quickSearch div { text-align:center;font-weight:bold;font-size:14px; }
        #gt_prefs_quickSearch ul { margin:15px 0 15px 0;padding:0;list-style:none;background:#eee;border:0; }
        #gt_prefs_quickSearch input {width:99%;border:1px solid gray;padding:2px;background:white;text-align:center;}
        #gt_prefs_quickSearch select {width:auto;border:1px solid gray;padding:2px;background:white;text-align:center;color:Green;}
        #gt_prefs_quickSearch li { margin:0;padding:6px 0;vertical-align:middle;background:#eee;border:0 }
        #gt_prefs_quickSearch button { width:150px;margin:0 10px;text-align:center;background:transparent;border-radius:5px;box-shadow:2px 2px 2px 1px gray;}
        #gt_prefs_quickSearch textarea { width:98%; height:98%; margin:3px 0; }
        #gt_prefs_quickSearch p,b { font-weight: bold;color:Green; margin:2px 0px; font-family: "微软雅黑", sans-serif;text-align:center; }
        #gt_prefs_quickSearch button:disabled { color: graytext; }
    `);
    quickSearchDiv = document.createElement('div');
    quickSearchDiv.id = 'gt_prefs_quickSearch';
    document.body.appendChild(quickSearchDiv);
    searchBox=null;
    searchBox=document.createElement("input");
    searchBox.id ="gt_prefs_searchBox";
    searchBox.value = "";
    searchBox.align="center";
    searchBox.onkeyup=function (e) {
        //ENTER
        if (e.keyCode===13){
            queryIt();
        }
        //ESC
        if (e.keyCode===27){
            if (searchBox.value==="") quickSearchDiv.style.display = "none";
            else searchBox.value="";
        }
    }
    var queryIt=function () {
        var queryStr = searchBox.value.trim();
        if (queryStr === "") {
            quickSearchDiv.style.display = "none";
            return;
        }
        var nSIdx= $("srcLanguageSelector").selectedIndex;
        var nDIdx= $("dstLanguageSelector").selectedIndex;
        if (oldText===queryStr){
            if (nSIdx===oldSIdx&&nDIdx===oldDIdx) {
                var translatorDiv = $("translatorDiv");
                if (translatorDiv) {
                    if (translatorDiv.style.display === "none") translatorDiv.style.display = "block";
                }
                return;
            }
        }
        translateIt((oldSIdx=nSIdx) <= 0 ? "auto" : uLanguageCode[nSIdx - 1], uLanguageCode[(oldDIdx=nDIdx)], oldText = queryStr, quickSearchDiv.offsetLeft, quickSearchDiv.offsetTop + quickSearchDiv.offsetHeight);
    }
    var hintText=document.createElement("p");
    hintText.id = "gt_prefs_hintText";
    hintText.innerText=translatorSettingLanguage===0 ? "输入要查询的单词或句子(按回车进行查询,按ESC退出查询):":"Enter the word or sentence you want to query ( Press enter to query, ESC to exit or clear.) :";
    var srcLanguageSelector=document.createElement("select");
    srcLanguageSelector.id = "gt_prefs_srcLanguageSelector";
    var divHtml=`<option value="0" ${currentSourceLanguage < 0 ? 'selected="selected"' : ''}>${translatorSettingLanguage===0 ? "自动检测":"Auto Detect"}</option>;`;
    for (let i = 0; i < uLanguageCode.length; i++) {
        if (currentSourceLanguage === i) divHtml += `<option value="${i}" selected="selected">${uLanguageNames[translatorSettingLanguage][i]}-${uRegionNames[translatorSettingLanguage][i]}(${uLanguageCode[i]})</option>`;
        else divHtml += `<option value="${i}">${uLanguageNames[translatorSettingLanguage][i]}-${uRegionNames[translatorSettingLanguage][i]}(${uLanguageCode[i]})</option>`;
    }
    srcLanguageSelector.innerHTML=divHtml;
    var dstLanguageSelector=document.createElement("select");
    dstLanguageSelector.id="gt_prefs_dstLanguageSelector";
    divHtml = "";
    for (let i = 0; i < uLanguageCode.length; i++) {
        if (currentTranslateLanguage === i) divHtml += `<option value="${i}" selected="selected">${uLanguageNames[translatorSettingLanguage][i]}-${uRegionNames[translatorSettingLanguage][i]}(${uLanguageCode[i]})</option>`;
        else divHtml += `<option value="${i}">${uLanguageNames[translatorSettingLanguage][i]}-${uRegionNames[translatorSettingLanguage][i]}(${uLanguageCode[i]})</option>`;
    }
    dstLanguageSelector.innerHTML=divHtml;
    var languageChooseParagraph= document.createElement("p");
    languageChooseParagraph.appendChild(document.createTextNode(translatorSettingLanguage === 0 ? "源语言:" : "Source:"));
    languageChooseParagraph.appendChild(srcLanguageSelector);
    languageChooseParagraph.appendChild(document.createTextNode(translatorSettingLanguage === 0 ? "==>目标语言:" : "==>Destination:"));
    languageChooseParagraph.appendChild(dstLanguageSelector);
    var btnQuery=document.createElement("button");
    btnQuery.onclick=queryIt;
    btnQuery.innerText = translatorSettingLanguage === 0 ? "查询" : "Query";
    var btnExit=document.createElement("button");
    btnExit.onclick=function (e) {
        quickSearchDiv.style.display = "none";
    }
    btnExit.innerText = translatorSettingLanguage === 0 ? "退出" : "Exit";
    var btnParagraph=document.createElement("p");
    btnParagraph.appendChild(btnQuery);
    btnParagraph.appendChild(btnExit);
    quickSearchDiv.appendChild(hintText);
    quickSearchDiv.appendChild(searchBox);
    quickSearchDiv.appendChild(languageChooseParagraph);
    quickSearchDiv.appendChild(btnParagraph);
    searchBox.focus();
    return;
}
if (quickSearchDiv.style.display === "none"){
    quickSearchDiv.style.display = "block";
    searchBox.focus();
}
else quickSearchDiv.style.display="none";
}
function toggleQuickSearch(e) {
    if (e.keyCode === hotKey_Code_forQS && (hotKey_Alt_forQS ? e.altKey : e.altKey === false) && (hotKey_Ctrl_forQS ? e.ctrlKey : e.ctrlKey === false)) {
      showQuickSearch();
    }
}

function GetTranslation(queryStr, mx, my) {
    currentTranslateLanguage = parseInt(GM_getValue(targetTranslateLanguageNameInStorage, defaultTranslateLanguage));
    currentSourceLanguage = parseInt(GM_getValue(sourceTranslateLanguageNameInStorage, defaultSourceLanguage));
    queryStr=optimizeQueryString(queryStr);
    if (lingoes_isEnabled){
        var url=null;
        if (lingoes_showingWay<2){
            if (!/\s+/gi.test(queryStr)) {
                switch(lingoes_showingWay){
                    case 0:
                        url = `http://${lingoes_serverIp}:${lingoes_serverPort}/lingoes?cmd=mini_search&text=${encodeURI(queryStr)}&pos_x=${mx}&pos_y=${my}`;
                        break;
                    case 1:
                        url = `http://${lingoes_serverIp}:${lingoes_serverPort}/lingoes?cmd=main_search&text=${encodeURI(queryStr)}&pos_x=${mx}&pos_y=${my}`;
                        break;
                }
            }
        }
        else{
            url = `http://${lingoes_serverIp}:${lingoes_serverPort}/lingoes?cmd=main_translator&text=${encodeURI(queryStr)}&pos_x=${mx}&pos_y=${my}`;
        }
        if (url!=null){
            GM_xmlhttpRequest({
                method:"GET",
                url:url,
                headers: {
                    "User-Agent": UA,
                    "Accept": "application/json"
                },
                onerror: function (err) {
                    alert(translatorSettingLanguage===0 ? "与灵格斯API服务器的通信失败,已自动禁用灵格斯词典调用功能!\n请保证您的电脑安装有灵格斯词典软件,并在设置中启用了API服务器,且正确的设置了IP与端口地址!":"Failed to fetch from lingoes API sever, disable the query from lingoes automatically!\n Please ensure you got a lingoes, and enabled the API server from it's setting, and sets the right ip and port number in the setting of this plugin.");
                    console.log("failed to fetch from lingoes sever, disable lingoes server automatically.",err);
                    saveLingoesSettings(false,lingoes_showingWay,lingoes_serverIp,lingoes_serverPort);
                }
            });
        }
    }
    translateIt(currentSourceLanguage < 0 ? "auto" : uLanguageCode[currentSourceLanguage], uLanguageCode[currentTranslateLanguage], queryStr, mx, my);
}

function checkIsSoundIconClicked(e) {
    return (e.target.className === "gt_prefs_img_for_play_sound"||e.target.id==="gt_prefs_show_or_hide_examples");
    //return e.target.id === "gt_prefs_img_for_play_sound1" || e.target.id === "gt_prefs_img_for_play_sound2" || e.target.id === "gt_prefs_img_for_play_sound3";
}

function mouseDown(e){
    window.addEventListener('mousemove', divMove, true);
    isToolBarMoving=!0;
    var div =  $("translatorDiv");
    tBarOffsetX=e.clientX-div.offsetLeft;
    tBarOffsetY=e.clientY-div.offsetTop;
}

function divMove(e){
    var div =  $("translatorDiv");
    div.style.position = 'absolute';
    let xpos=e.clientX - tBarOffsetX;
    let ypos=e.clientY - tBarOffsetY;
    div.style.top = ypos + "px";
    div.style.left = xpos + "px";
}
function optimizeQueryString(t){
    return t.replace('-\n', '').replace('\n', ' ').replace(/[&]+/g, currentSourceLanguage >= 0 && currentSourceLanguage < 3 ? "和" : " and ").replace(/[\+]+/g, currentSourceLanguage >= 0 && currentSourceLanguage < 3 ? "加" : " plus ");
}
function googleTranslate(e) {
    if(isToolBarMoving){
        window.removeEventListener("mousemove", divMove, true);
        isToolBarMoving=!1;
        return;
    }
    if (checkIsSoundIconClicked(e))return;
    var selectObj = document.getSelection();
    var translatorDiv = $("translatorDiv");
    // if #text node
    if (selectObj.anchorNode && selectObj.anchorNode.nodeType == 3) {
        var selectedText = selectObj.toString().trim();
        if (selectedText === "") {
            translatorDiv.style.display="none";
            return;
        }
        if (translatorDiv) if (selectedText === oldText && $('iconPrevious').style.display==="block"){
            translatorDiv.style.display="block";
            return;
        }
        if(isTranslatorDisabledTemporarily){
            let ci=createTranslatorIcon();
            ci.style.top=(e.clientY+15)+"px";
            ci.style.left=(e.clientX+15)+"px";
            ci.style.display="block";
            setTimeout(function(){
                $("translator_icon").style.display="none";
            },2000);
            return;
        }
        oldText = selectedText;
        searchedTextProcessor.addText(oldText);
        GetTranslation(oldText, e.clientX, e.clientY);
    }
    else translatorDiv.style.display="none";
}

var timerHide=-1;
function popup(mx, my, result) {
    var translatorDiv = $("translatorDiv");
    var contentDiv=$("contentDiv");
    var clearTimerHide=function () {
        if (timerHide > 0){
            clearTimeout(timerHide);
            timerHide=-1;
        }
    }
    if (!translatorDiv){
        translatorDiv = document.createElement('div');
        translatorDiv.id = "gt_prefs_translatorDiv";
        document.body.appendChild(translatorDiv);
        translatorDiv.style.color = "black";
		translatorDiv.style.fontSize="12px";
        translatorDiv.style.textAlign = "left";
        translatorDiv.style.display = "block";
        translatorDiv.style.position = "absolute";
        translatorDiv.style.background = "radial-gradient(ellipse at center, #EDF4FC 0%,#e3edf9 60%,#c9d7e5 80%, #c3cedb 90%, #bac6d3 95%, #adb5bc 100%)";
        translatorDiv.style.borderRadius = "5px";
		translatorDiv.style.boxShadow = "-2px 0px 9px 5px #898D91";
        translatorDiv.style.opacity = "0.9";
        translatorDiv.style.padding="5px";
        translatorDiv.style.margin="0";
		translatorDiv.style.zIndex = 900;
        translatorDiv.style.width = "400px";
        translatorDiv.style.height="auto";
        translatorDiv.style.wordWrap = "break-word";
        translatorDiv.onmouseleave=function (e) {
            if(!isPinned){
                timerHide=setTimeout(function(){translatorDiv.style.display = "none"},10000);
            }
        }
        translatorDiv.onmouseenter= clearTimerHide;
        GM_addStyle(`
            .gt_prefs_img_for_play_sound{width:16px;height:16px;}
            .gt_prefs_translator_div_li{list-style:none;margin:0;padding:2px;background:none;width:100%;color:inherit;font-family:Tahoma;font-size:14px;font-weight:bold;}
            .gt_prefs_translator_div_li b{color:Green;}
            .gt_prefs_translator_div_li a{color:Blue;}
            .gt_prefs_translator_div_li span{color:#39538c;font-weight:normal;}
            .gt_prefs_translator_div_li p{color:Red;font-size:16px;}
            .gt_prefs_translator_div_li em{color:#131930;font-style:normal;}
            .gt_prefs_translator_div_li h1{color:#771b1b;font-size:18px;}
            #gt_prefs_sample_ul li{font-weight:normal;list-style-type:upper-roman;}
            .gt_prefs_main_word{font-weight:bold;color:#116f89;};
        `);
        let tBar=document.createElement('div');
        tBar.id="gt_prefs_tBar";
        tBar.style.width="100%";
        tBar.style.height="20px";
        on(tBar,'mousedown', mouseDown);
        let iconForbidden=document.createElement('img');
        let iconSimplified=document.createElement('img');
        let iconDetailed=document.createElement('img');
        let iconPrevious=document.createElement('img');
        let iconSetting=document.createElement('img');
        let iconSearch=document.createElement('img');
        let iconClose=document.createElement('img');
        let iconNext=document.createElement('img');
        let iconCopy=document.createElement('img');
        let iconPin=document.createElement('img');
        tBar.style.margin=iconForbidden.style.margin=iconSimplified.style.margin=iconDetailed.style.margin=iconPrevious.style.margin=iconSetting.style.margin=iconSearch.style.margin=iconClose.style.margin=iconNext.style.margin=iconCopy.style.margin=iconPin.style.margin="0";
        tBar.style.padding=iconForbidden.style.padding=iconSimplified.style.padding=iconDetailed.style.padding=iconPrevious.style.padding=iconSetting.style.padding=iconSearch.style.padding=iconClose.style.padding=iconNext.style.padding=iconCopy.style.padding=iconPin.style.padding="0";
        iconForbidden.setAttribute('src',forbiddenIconBase64Data);
        iconSimplified.setAttribute('src',simplifiedIconBase64Data);
        iconDetailed.setAttribute('src',detailedIconBase64Data);
        iconPrevious.setAttribute('src',previousIconBase64Data);
        iconSetting.setAttribute('src',settingIconBase64Data);
        iconSearch.setAttribute('src',searchIconBase64Data);
        iconClose.setAttribute('src',closeIconBase64Data);
        iconNext.setAttribute('src',nextIconBase64Data);
        iconCopy.setAttribute('src',copyIconBase64Data);
        iconPin.setAttribute('src',pinIconBase64Data);
        iconForbidden.width=iconSimplified.width=iconDetailed.width=iconPrevious.width=iconSetting.width=iconSearch.width=iconClose.width=iconNext.width=iconCopy.width=iconPin.width=20;
        iconForbidden.height=iconSimplified.height=iconDetailed.height=iconPrevious.height=iconSetting.height=iconSearch.height=iconClose.height=iconNext.height=iconCopy.height=iconPin.height=20;
        iconForbidden.style.cssFloat=iconSimplified.style.cssFloat=iconDetailed.style.cssFloat=iconPrevious.style.cssFloat=iconSetting.style.cssFloat=iconSearch.style.cssFloat=iconClose.style.cssFloat=iconNext.style.cssFloat=iconCopy.style.cssFloat=iconPin.style.cssFloat="right";
        iconForbidden.id="gt_prefs_iconForbidden";
        iconForbidden.style.border=(isEnabled ? "none":"1px solid red");
        iconForbidden.onclick=function(e){
            isTranslatorDisabledTemporarily=!0;
            $("translatorDiv").style.display="none";
        }
        iconForbidden.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconForbidden.onmouseleave=function(e){
            toolTip.hide();
        }
        iconSimplified.id="gt_prefs_iconSimplified";
        iconSimplified.onclick=function(e){
            this.style.display="none";
            $("iconDetailed").style.display="block";
            isEnableSimpleMode=false;
        }
        iconSimplified.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconSimplified.onmouseleave=function(e){
            toolTip.hide();
        }
        iconDetailed.id="gt_prefs_iconDetailed";
        iconDetailed.onclick=function(e){
            this.style.display="none";
            $("iconSimplified").style.display="block";
            isEnableSimpleMode=true;
        }
        iconDetailed.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconDetailed.onmouseleave=function(e){
            toolTip.hide();
        }
        isEnableSimpleMode==!1 ? iconSimplified.style.display="none":iconDetailed.style.display="none";
        iconPrevious.id="gt_prefs_iconPrevious";
        iconPrevious.style.display="none";
        iconPrevious.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconPrevious.onmouseleave=function(e){
            toolTip.hide();
        }
        iconPrevious.onclick=function(e){
            searchedTextProcessor.showPreviousText();
        }
        iconNext.id="gt_prefs_iconNext";
        iconNext.style.display="none";
        iconNext.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconNext.onmouseleave=function(e){
            toolTip.hide();
        }
        iconNext.onclick=function(e){
            searchedTextProcessor.showNextText();
        }
        iconSearch.id="gt_prefs_iconSearch";
        iconSearch.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconSearch.onmouseleave=function(e){
            toolTip.hide();
        }
        iconSearch.onclick=function(e){
            showQuickSearch();
        }
        iconSetting.id="gt_prefs_iconSetting";
        iconSetting.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconSetting.onmouseleave=function(e){
            toolTip.hide();
        }
        iconSetting.onclick=function(e){
            setup();
            $("setup").style.display=  $("setup").style.display==="block" ? "none":"block";

        }
        iconClose.id="gt_prefs_iconClose";
        iconClose.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconClose.onmouseleave=function(e){
            toolTip.hide();
        }
        iconClose.onclick=function(e){
            $("translatorDiv").style.display="none";
        }
        iconCopy.id="gt_prefs_iconCopy";
        iconCopy.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconCopy.onmouseleave=function(e){
            toolTip.hide();
        }
        iconCopy.onclick=function(e){
            if(window.getSelection){
                let range = document.createRange();
                range.selectNode($("contentDiv"));
                window.getSelection().removeAllRanges();
                window.getSelection().addRange(range);
                document.execCommand("Copy",false,null);
				window.getSelection().removeAllRanges();
                alert(translatorSettingLanguage===0 ? "复制成功":"Copy Done");
            }
        }
        iconPin.id="gt_prefs_iconPin";
        iconPin.style.border="1px none";
        iconPin.onmouseenter=function(e){
            toolTip.show(this,e);
        }
        iconPin.onmouseleave=function(e){
            toolTip.hide();
        }
        iconPin.onclick=function(e){
            iconPin.style.border=((isPinned=!isPinned) ? "solid":"none");
        }
        tBar.appendChild(iconClose);
        tBar.appendChild(iconPin);
        tBar.appendChild(iconSetting);
        tBar.appendChild(iconSearch);
        tBar.appendChild(iconForbidden);
        tBar.appendChild(iconSimplified);
        tBar.appendChild(iconDetailed);
        tBar.appendChild(iconCopy);
        tBar.appendChild(iconNext);
        tBar.appendChild(iconPrevious);
        translatorDiv.appendChild(tBar);
        contentDiv=document.createElement("div");
        contentDiv.id="gt_prefs_contentDiv";
        contentDiv.style.margin=contentDiv.style.padding="0";
        contentDiv.onclick = function (e) {
            if(!isPinned){
                if(!checkIsSoundIconClicked(e))translatorDiv.style.display="none";
            }
        }
        translatorDiv.appendChild(contentDiv);
    }
    else{
        contentDiv.innerHTML="";
        clearTimerHide();
        translatorDiv.style.display="block";
    }
    // parse
    var resultTxt = getTargetAnswer(result);
    if (resultTxt) createShower();
    else {
        console.log("resultTxt is null!");
        return;
    }
    // main window
    // first insert into dom then there is offsetHeight!IMPORTANT!
    if(!isPinned){
        translatorDiv.style.left = mx + "px";
        if (mx + 400 + 30 >= window.innerWidth) {
            translatorDiv.style.left = parseInt(translatorDiv.style.left) - 400 + "px";
        }
        if(translatorDiv.offsetHeight>=window.innerHeight){
            translatorDiv.style.height=(window.innerHeight/2)+"px";
            translatorDiv.style.overflow="auto";
        }
        else{
            translatorDiv.style.height="auto";
            translatorDiv.style.overflow="visible";
        }
        translatorDiv.style.top=(my>(window.innerHeight-translatorDiv.offsetHeight) ? window.innerHeight-translatorDiv.offsetHeight+self.pageYOffset:my+self.pageYOffset)+"px";
    }

    function createShower() {
        var el = null;
        switch (resultTxt[0]) {
            case ANS_TYPE_ZDIC_HTML:
                el = document.createElement("div");
                el.id="shiyi_content";
                el.innerHTML=zdictStyle+resultTxt[1];
                el.style.height = "500px";
                el.style.width="100%";
                el.style.margin = "0";
                el.style.padding = "0";
                el.style.border="none";
                el.style.color="black";
                el.style.textDecoration="none";
                el.style.overflow = "auto";
                break;
            case ANS_TYPE_YOUDAO_SENTENCE:
                el = document.createElement('ul');
                el.style.margin = "0";
                el.style.padding = "0";
                resultTxt[1]['translation'].map(function (trans) {
                    var li = document.createElement('li');
                    li.className="gt_prefs_translator_div_li";
                    li.appendChild(document.createTextNode(trans));
                    el.appendChild(li);
                });
                break;
            case ANS_TYPE_YOUDAO_WORD:
                el = document.createElement("div");
                el.style.fontSize = "12px";
                el.style.fontFamily="Tahoma";
                el.style.margin = "0";
                el.style.padding = "0";
                var basic = resultTxt[1]['basic'];
                var header = document.createElement('p');
                // header
                var span = document.createElement('span');
                span.innerHTML = resultTxt[1]["query"];
                header.appendChild(span);
                // phonetic if there is
                var phonetic = basic['phonetic'];
                if (phonetic) {
                    var phoneticNode = document.createElement('span');
                    phoneticNode.innerHTML = '[' + phonetic + ']&nbsp;&nbsp;';
                    phoneticNode.style.cursor = "pointer";
                    header.appendChild(phoneticNode);
                    var img3 = document.createElement('img');
                    img3.setAttribute('src', speakerIconBase64Data);
                    img3.className = "gt_prefs_img_for_play_sound";
                    img3.onclick = function (e) {
                        if (e.target === img3) {
                            e.stopPropagation();
                            YouDaoPlay(resultTxt[1]["query"]);
                        }
                    }
                    header.appendChild(img3);
                }
                header.style.color = "darkBlue";
                header.style.margin = "0";
                header.style.padding = "0";
                span.style.fontweight = "900";
                span.style.color = "black";

                el.appendChild(header);
                var hr = document.createElement('hr');
                hr.style.margin = "0";
                hr.style.padding = "0";
                hr.style.height = "1px";
                hr.style.borderTop = "dashed 1px black";
                el.appendChild(hr);
                var ul = document.createElement('ul');
                // ul style
                ul.style.margin = "0";
                ul.style.padding = "0";
                basic['explains'].map(function (trans) {
                    var li = document.createElement('li');
                    li.style.listStyle = "none";
                    li.style.margin = "0";
                    li.style.padding = "0";
                    li.style.background = "none";
                    li.style.color = "inherit";
                    li.appendChild(document.createTextNode(trans));
                    ul.appendChild(li);
                });
                el.appendChild(ul);
                break;
            case ANS_TYPE_GOOGLE_RESULT:
                el=processGoogleResult(JSON.parse(resultTxt[1]));
                break;
            default:
                return;
        }
        contentDiv.appendChild(el);
    }
}

function processGoogleResult(arr){
    let el = document.createElement('ul');
    el.className="gt_prefs_translator_div_li";
    el.style.padding = el.style.margin = "0";
    let z={
        sb_details:["【翻译】","<< Translation >>"],
        sb_meaning:["【释义】","<< Meaning >>"],
        sb_suggestedTranslation:["【可能的翻译】","<< Other Translation >>"],
        sb_more:["【点击显示例句】","<< Click to show examples >>"],
        sb_hideMore:["【点击隐藏例句】","<< Click to hide examples >>"],
        ce:function(tpe){
            let n=document.createElement(tpe);
            if(tpe==="li")n.className = "gt_prefs_translator_div_li";
            return n;
        },
        ap:function(elm){
            if(elm){
                el.appendChild(elm);
                return el;
            }
            return null;
        },
        app:function(els,eld){
            if(els){
                if(eld){
                    els.appendChild(eld);
                    return els;
                }
            }
            return null;
        },
        aps:function(ela,tpe,innerStr){
            if(innerStr){
                if(tpe==="pr"){
                    innerStr="["+innerStr+"]";
                    tpe="a";
                }
                let s=z.ce(tpe);
                s.style.padding=s.style.margin="0";
                s.innerHTML= innerStr;
                ela.appendChild(s);
                return ela;
            }
            return null;
        },
        cv:function(txt,lan){
            if(txt){
                var img1 = z.ce('img');
                img1.setAttribute('src', speakerIconBase64Data);
                img1.className = "gt_prefs_img_for_play_sound";
                img1.onclick=function () {
                    playTTS(lan,txt);
                }
                return img1;
            }
        },
        apv:function(ela,txt,lan){
            if(txt){
                ela.appendChild(z.cv(txt,lan));
                return ela;
            }
            return null;
        },
        gor:function(arr,el,isShowTitle){
            if(arr[5]){
                if(arr[5][0][2]){
                    if(isShowTitle)z.app(el,z.aps(z.ce("li"),"h1",z.sb_suggestedTranslation[translatorSettingLanguage]));
                    for(let i=0;i<arr[5][0][2].length;i++){
                        let lis=z.ce("li");
                        lis.innerHTML=`<i>${i+1}.&nbsp</i>`;
                        for(let ii=0;ii<arr[5].length;ii++){
                            if(arr[5][ii][2]){
                                if(arr[5][ii][2][i]){
                                    z.aps(lis,"span",arr[5][ii][2][i][0]);
                                }
                            }
                        }
                        z.app(el,lis);
                    }
                }
            }
        }
    };
    if(arr){
        let len=arr.length;
        if(len>8){
            if(isEnableSimpleMode){
                z.gor(arr,el,false);
                return el;
            }
            if(arr[0]){
                let totalRet=arr[0].length-1;
                let b1=new Array(totalRet);
                let b2=new Array(totalRet);
                let v1=new Array(totalRet);
                let v2=new Array(totalRet);
                for(let k=0;k<totalRet;k++){
                        if(arr[0][k]){
                            if(arr[0][k][1]){
                                b1[k] = z.ce("b");
                                b1[k].innerHTML=arr[0][k][1];
                                v1[k]=z.cv(arr[0][k][1],arr[2]);
                            }
                            if(arr[0][k][0]){
                                b2[k]=z.ce("b");
                                b2[k].innerHTML=arr[0][k][0];
                                v2[k]=z.cv(arr[0][k][0],curTarLanForSpeaker);
                            }
                        }
                }
                let li1=z.ce("li");
                let li2=z.ce("li");
                switch(totalRet){
                    case -1:
                        console.log("Error occured. Google result return an unnormal data.");
                        break;
                    case 0:
                            if(arr[0][0]){
                                if(arr[0][0][1]){
                                    let l1=z.ce("li");
                                    z.aps(l1,"b",arr[0][0][1]);
                                    z.apv(l1,arr[0][0][1],arr[2]);
                                    z.ap(l1);
                                }
                                if(arr[0][0][0]){
                                    let l2=z.ce("li");
                                    z.aps(l2,"b",arr[0][0][0]);
                                    z.apv(l2,arr[0][0][0],curTarLanForSpeaker);
                                    z.ap(l2);
                                }
                            }
                        break;
                    case 1:
                            z.app(li1,b1[0]);
                            z.app(li2,b2[0]);
                            if(arr[0][1]){
                                if(arr[0][1][0]){
                                    z.app(li1,v1[0]);
                                    z.aps(li1,"b",arr[0][1][1]);
                                    z.apv(li1,arr[0][1][1],arr[2]);
                                    z.app(li2,v2[0]);
                                    z.aps(li2,"b",arr[0][1][0]);
                                    z.apv(li2,arr[0][1][0],curTarLanForSpeaker);
                                    z.ap(li1);
                                    z.ap(li2);
                                    break;
                                }
                                z.aps(li1,"pr",arr[0][1][3]);
                                z.aps(li2,"pr",arr[0][1][2]);
                            }
                            z.ap(z.app(li1,v1[0]));
                            z.ap(z.app(li2,v2[0]));
                        break;
                    default:
                            for(let k=0;k<totalRet;k++){
                                z.app(li1,b1[k]);
                                z.app(li1,v1[k]);
                                z.app(li2,b2[k]);
                                z.app(li2,v2[k]);
                            }
                            if(arr[0][totalRet]){
                                z.ap(li1);
                                z.ap(z.aps(z.ce("p"),"pr",arr[0][totalRet][3]));
                                z.ap(li2);
                                z.ap(z.aps(z.ce("p"),"pr",arr[0][totalRet][2]));
                            }
                            else{
                                z.ap(li1);
                                z.ap(li2);
                            }
                        break;
                }
            }
            if(arr[1]){
                z.ap(z.aps(z.ce("li"),"h1",z.sb_details[translatorSettingLanguage]));
                for(let i=0;i<arr[1].length;i++){
                    let lit=z.ce("li");
                    z.aps(lit,"p",arr[1][i][0]);
                    for(let ii=0;ii<arr[1][i][2].length;ii++){
                        z.aps(lit,"em",arr[1][i][2][ii][0]);
                        let t="("
                        for(let iii=0;iii<arr[1][i][2][ii][1].length;iii++){
                            t+=arr[1][i][2][ii][1][iii]+", ";
                        }
                        t=t.substr(0,t.length-2)+");&nbsp;";
                        z.aps(lit,"span",t);
                    }
                    z.ap(lit);
                }
            }
            z.gor(arr,el,true);
        }
        if(len>12){
            if(arr[12]){
                z.ap(z.aps(z.ce("li"),"h1",z.sb_meaning[translatorSettingLanguage]));
                for(let o=0;o<arr[12].length;o++){
                    z.ap(z.aps(z.ce("li"),"p",arr[12][o][0]));
                    for(let oo=0;oo<arr[12][o][1].length;oo++){
                        z.ap(z.aps(z.ce("li"),"b",arr[12][o][1][oo][0]));
                        if(arr[12][o][1][oo][2])z.ap(z.aps(z.ce("li"),"span",arr[12][o][1][oo][2]));
                    }
                }
            }
        }
        if(len>13){
            if(arr[13]){
                let liSample=z.ce("li");
                liSample.id="gt_prefs_liSample";
                liSample.onclick=function(e){
                    let divSample=$('dSample');
                    let lSample=$('liSample');
                    if(divSample){
                        if(divSample.style.display==="none"){
                            divSample.style.display="block";
                            liSample.innerHTML=`<h1 id="gt_prefs_show_or_hide_examples">${z.sb_hideMore[translatorSettingLanguage]}<h1>`;
                        }
                        else{
                            divSample.style.display="none";
                            liSample.innerHTML=`<h1 id="gt_prefs_show_or_hide_examples">${z.sb_more[translatorSettingLanguage]}<h1>`;
                        }
                    }
                }
                liSample.innerHTML=`<h1 id="gt_prefs_show_or_hide_examples">${z.sb_more[translatorSettingLanguage]}<h1>`;
                z.ap(liSample);
                let dSample=z.ce("li");
                dSample.id="gt_prefs_dSample";
                let ulSample=z.ce("ul");
                ulSample.id="gt_prefs_sample_ul";
                for(let j=0;j<arr[13][0].length;j++){
                    z.aps(ulSample,"li",arr[13][0][j][0]);
                }
                dSample.appendChild(ulSample);
                z.ap(dSample);
                dSample.style.display="none";
            }
        }
        return el;
    }
    return null;
}

var searchedTextProcessor={
        addText:function(txt){
            if(searchedTextProcessor.isTextNotExisted(txt)){
                searchedTextCache.push(txt);
                searchedTextIndex=searchedTextCache.length-1;
                let iconNext=$('iconNext');
                if(iconNext)iconNext.style.display="none";
            }
            if(searchedTextIndex>0){
                let iconPrevious=$('iconPrevious');
                if(iconPrevious)iconPrevious.style.display="block";
            }
        },
        getCurrentText:function(){
            return searchedTextCache[searchedTextIndex];
        },
        isTextNotExisted:function(txt){
                for(let n=0;n<searchedTextCache.length;n++){
                    if(searchedTextCache[n]===txt)return false;
                }
                return true;
        },
        showTranslation:function(){
            let translatorDiv=document.getElementById('gt_prefs_translatorDiv');
            GetTranslation(searchedTextCache[searchedTextIndex],translatorDiv.offsetLeft,translatorDiv.offsetTop);
        },
        showPreviousText:function(){
            let iconPrevious=document.getElementById('gt_prefs_iconPrevious');
            let iconNext=document.getElementById('gt_prefs_iconNext');
            if(--searchedTextIndex<0){
                iconPrevious.style.display="none";
                searchedTextIndex=0;
            }
            else{
                if(searchedTextIndex===0){
                    iconPrevious.style.display="none";
                }
                if(searchedTextIndex<searchedTextCache.length-1){
                    iconNext.style.display="block";
                }
                this.showTranslation();
            }
        },
        showNextText:function(){
            let iconPrevious=document.getElementById('gt_prefs_iconPrevious');
            let iconNext=document.getElementById('gt_prefs_iconNext');
            if(++searchedTextIndex>searchedTextCache.length-1){
                iconNext.style.display="none";
                searchedTextIndex=searchedTextCache.length-1;
            }
            else{
                if(searchedTextIndex===searchedTextCache.length-1){
                    iconNext.style.display="none";
                }
                if(searchedTextIndex>0){
                    iconPrevious.style.display="block";
                }
                this.showTranslation();
            }
        }
};

function checkIsWordOrNot(txt,maxWordLength, isChineseWord) {
    if (isChineseWord)return txt.length <= maxWordLength && /^([\u4E00-\u9FA5]|[\uFF00-\uFF20]|[\u3000-\u301C])+$/g.test(txt);
    else return txt.length <= maxWordLength && !/\s+/gi.test(txt);
}

function translateIt(srcLanguage, dstLanguage, queryStr, mx, my) {
    queryStr = queryStr.trim();
    if (queryStr === "") return;
    curTarLanForSpeaker=dstLanguage;
    var targetMd5 = MD5(queryStr, srcLanguage + dstLanguage, null);
    var sps = searchInTranslateCache(targetMd5);
    if (sps) {
        popup(mx, my, sps);
    }
    else {
        var googleCallBackFunc = function (arrayTxt) {
            //console.log("返回值为:" + arrayTxt);
            if (arrayTxt != 'undefined' && arrayTxt != null) {
                transCache.push([CACHE_TYPE_GOOGLE_RESULT, arrayTxt]);
                transMd5Cache.push(targetMd5);
                popup(mx, my, [CACHE_TYPE_GOOGLE_RESULT, arrayTxt]);
            }
        };
        var youdaoCallBackFunc=function (repArray, bIsSuccess) {
            if (bIsSuccess) {
                if (repArray != null || repArray != "undefined") {
                    var dictJson = JSON.parse(repArray);
                    transCache.push([dictJson['basic'] ? CACHE_TYPE_YOUDAO_WORD:CACHE_TYPE_YOUDAO_SENTENCE, dictJson]);
                    transMd5Cache.push(targetMd5);
                    popup(mx, my, [dictJson['basic'] ? CACHE_TYPE_YOUDAO_WORD : CACHE_TYPE_YOUDAO_SENTENCE, dictJson]);
                    return;
                }
            }
            Request(queryStr, srcLanguage, dstLanguage, googleCallBackFunc);
        };
        var getYoudaoTranslation=function (maxWordLength) {
            if (youdao_isEnabled) {
                if (youdao_isOnlyForSingleWord) {
                    if (checkIsWordOrNot(queryStr, maxWordLength, false)) YoudaoRequest(queryStr, youdaoCallBackFunc);
                    else Request(queryStr, srcLanguage, dstLanguage, googleCallBackFunc);
                }
                else YoudaoRequest(queryStr, youdaoCallBackFunc);
            }
            else Request(queryStr, srcLanguage, dstLanguage, googleCallBackFunc);
        };
        switch (dstLanguage){
            case "zh-cn":
            case "zh-tw":
            case "zh-hk":
                //if query string is chinese word with max four characters
                if (checkIsWordOrNot(queryStr, 4, true)) {
                    ZdicRequest(queryStr, function (repHtml, finalUrl, bIsSuccess) {
                        if (bIsSuccess) {
                            if (repHtml != null && repHtml != "undefined" && repHtml.trim()!="") {
                                transCache.push([CACHE_TYPE_ZDIC_HTML, repHtml]);
                                transMd5Cache.push(targetMd5);
                                popup(mx, my, [CACHE_TYPE_ZDIC_HTML, repHtml]);
                                return;
                            }
                        }
                        getYoudaoTranslation(8);
                    });
                    return;
                }
                else getYoudaoTranslation(8);
                return;
            case "en-hk":
            case "en-us":
            case "en-gb":
            case "en-ww":
            case "en-ca":
            case "en-au":
                //if translate from Chinese to English
                if (/([\u4E00-\u9FA5]|[\uFF00-\uFF20]|[\u3000-\u301C])+/g.test(queryStr)){
                    getYoudaoTranslation(30);
                    return;
                }
                break;
            default:
                break;
        }
        Request(queryStr, srcLanguage, dstLanguage, googleCallBackFunc);
    }
}

function getYoudaoTranslation(queryStr, youdaoCallBackFunc, googleCallBackFunc){
    if (youdao_isEnabled) {
        if (youdao_isOnlyForSingleWord) {
            if (checkIsWordOrNot(queryStr, 30, false)) YoudaoRequest(queryStr, youdaoCallBackFunc);
            else Request(queryStr, srcLanguage, dstLanguage, googleCallBackFunc);
        }
        else YoudaoRequest(queryStr, youdaoCallBackFunc);
    }
}

function playSound(buffer) {
    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    var source = audioContext.createBufferSource();
    source.buffer = buffer;
    source.connect(audioContext.destination);
    source.start(0);
}

function YouDaoPlay(word) {
    var txtMd5 = MD5(word, "YouDaoEnToCn" + CACHE_TYPE_YOUDAO_WORD, null);
    var buf = searchInTransSoundCache(txtMd5);
    if (buf) {
        playSound(buf);
        return;
    }
    GM_xmlhttpRequest({
        method: "GET",
        url: `https://dict.youdao.com/dictvoice?type=2&audio=${encodeURI(word)}`,
        responseType: 'arraybuffer',
        onload: function(resp) {
            try {
                audioContext.decodeAudioData(resp.response, function (buffer) {
                    transSoundMd5Cache.push(txtMd5);
                    transSoundCache.push(buffer);
                    playSound(buffer);
                });
            } catch (e) {
                console.log(e);
            }
        }
    });
}

function YoudaoRequest(queryStr,callBackFunc) {
    GM_xmlhttpRequest({
        method: "GET",
        url: `http://fanyi.youdao.com/openapi.do?type=data&doctype=json&version=1.1&relatedUrl=http%3A%2F%2Ffanyi.youdao.com%2F%23&keyfrom=fanyiweb&key=null&translate=on&q=${queryStr}&ts=${(new Date().getTime()).toString()}`,
        headers: {
            "Accept": "application/json"
        },
        onload: function (resp) {
            if (resp.statusText==="OK"){
                callBackFunc(resp.responseText,true);
                return;
            }
            callBackFunc(null,false);
        }
    });
}

function ZdicRequest(queryStr,callBackFunc) {
    GM_xmlhttpRequest({
        method: "GET",
        url: "https://www.zdic.net/hans/"+encodeURI(queryStr),
        headers:{
            "User-Agent": UA,
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
            "Accept-Encoding": "GBK,gzip,deflate"
        },
        onload: function (resp) {
                try {
                    if (resp.readyState === 4) {
						let repTxt=resp.responseText;
                        //if got the right answer
                        if (resp.responseText.indexOf("<title>查无此结果</title>") < 0) {
                            if (resp.responseText.indexOf("<title>全站搜索</title>") < 0) {
                                let beginIndex=repTxt.indexOf(`<div class="homograph-entry">`);
                                let endIndex=repTxt.lastIndexOf(`<div class="res_c_right">`)-7;
                                var result1=repTxt.substring(beginIndex,endIndex);//.replace(/src="\/\/img\.zdic\.net/gi,`src="https://img.zdic.net`).replace(/data-original="\/\/img\.zdic\.net\//gi,`data-original="https://img.zdic.net/`);
                                callBackFunc(result1, resp.finalUrl, true);
                                return;
                            }
                        }
                    }
                } catch (e) {
                    console.log(e);
                }
               callBackFunc(null, null, false);
        }
    });
}

function getTargetAnswer(resultObj) {
    if (resultObj) {
        switch(resultObj[0]){
            case CACHE_TYPE_ZDIC_HTML:
                return [ANS_TYPE_ZDIC_HTML, resultObj[1]];
            case CACHE_TYPE_YOUDAO_SENTENCE:
                return [ANS_TYPE_YOUDAO_SENTENCE, resultObj[1]];
            case CACHE_TYPE_YOUDAO_WORD:
                return [ANS_TYPE_YOUDAO_WORD, resultObj[1]];
            case CACHE_TYPE_GOOGLE_RESULT:
                return [ANS_TYPE_GOOGLE_RESULT, resultObj[1]];
            default:
                break;
        }
    }
    return null;
}

function searchInTranslateCache(targetMd5) {
    for (var n = 0; n < transCache.length; n++) {
        if (transMd5Cache[n] === targetMd5) return transCache[n];
    }
    return null;
}

function searchInTransSoundCache(targetMd5) {
    for (var n = 0; n < transSoundCache.length; n++) {
        if (transSoundMd5Cache[n] === targetMd5) return transSoundCache[n];
    }
    return null;
}

function init_google_value_tk() {
    var url = "https://" + googleDomain[translatorSettingLanguage];
    var timeout = setTimeout(function () {
        this.abort();
    }, 2000);
    GM_xmlhttpRequest({
        method: "GET",
        url: url,
        onreadystatechange: function (resp) {
            if (resp.readyState == 4) {
                clearTimeout(timeout);
                if (resp.status == 200) {
                    init_google_value_tk_parse(resp.responseText);
                }
            }
        }
    });
}

function init_google_value_tk_parse(responseText) {
	let indexStr=",tkk:'";
	let bIdx=responseText.indexOf(indexStr);
	if(bIdx>0){
		bIdx+=indexStr.length;
		let eIdx=responseText.indexOf("',",bIdx);
		if(eIdx>0){
			let tkk=responseText.substring(bIdx,eIdx);
			if(tkk!=null)GM_setValue(tokenNameInStorage[translatorSettingLanguage], tkk);
			return;
		}
	}
}


// return token for the new API
function googleTK(text) {
    // view-source:https://translate.google.com/translate/releases/twsfe_w_20151214_RC03/r/js/desktop_module_main.js && TKK from HTML
    var uM = GM_getValue(tokenNameInStorage[translatorSettingLanguage]);
    if (uM == 'undefined' || uM == null) {
        init_google_value_tk();
        uM = GM_getValue(tokenNameInStorage[translatorSettingLanguage]);
    }
    ;
    var cb = "&";
    var k = "";
    var Gf = "=";
    var Vb = "+-a^+6";
    var t = "a";
    var Yb = "+";
    var Zb = "+-3^+b+-f";
    var jd = ".";
    var sM = function (a) {
        return function () {
            return a;
        };
    };
    var tM = function (a, b) {
        for (var c = 0; c < b.length - 2; c += 3) {
            var d = b.charAt(c + 2), d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
                d = b.charAt(c + 1) == Yb ? a >>> d : a << d;
            a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d;
        }
        return a;
    };
    var vM = function (a) {
        var b;
        if (null !== uM) {
            b = uM;
        } else {
            b = sM(String.fromCharCode(84));
            var c = sM(String.fromCharCode(75));
            b = [b(), b()];
            b[1] = c();
            b = (uM = window[b.join(c())] || k) || k;
        }
        var d = sM(String.fromCharCode(116)), c = sM(String.fromCharCode(107)), d = [d(), d()];
        d[1] = c();
        c = cb + d.join(k) + Gf;
        d = b.split(jd);
        b = Number(d[0]) || 0;

        for (var e = [], f = 0, g = 0; g < a.length; g++) {
            var m = a.charCodeAt(g);
            128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023), e[f++] = m >> 18 | 240, e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224, e[f++] = m >> 6 & 63 | 128), e[f++] = m & 63 | 128);
        }
        a = b || 0;
        for (f = 0; f < e.length; f++) {
            a += e[f], a = tM(a, Vb)
        }
        a = tM(a, Zb);
        a ^= Number(d[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return a.toString() + jd + (a ^ b);
    };
    return vM(text);
}

// Google Translate Request
function Request(txt, sl, tl, parse) {
    var tk = googleTK(txt);
    var Url = dictURL +
        "&hl=auto" +
        "&sl=" + sl + "&tl=" + tl +
        "&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&ie=UTF-8&oe=UTF-8&otf=2&trs=1&inputm=1&ssel=0&tsel=0&source=btn&kc=3" +
        "&tk=" + tk +
        "&q=" + encodeURI(txt);
    var method = 'POST';
    var Data = '';
    var Hdr = {
        "User-Agent": UA,
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate"
    };
    var Q = Url.split('&q=');
    Url = Q[0];
    Data = '&q=' + Q[1];
    Hdr["Content-Length"] = Data.length + '';
    Hdr["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8";
    GM_xmlhttpRequest({
        method: method,
        url: Url,
        data: Data,
        headers: Hdr,
        onload: function (resp) {
            try {
				//console.log(resp.responseText);
                parse(resp.responseText, tl);
            } catch (e) {
                console.log(e);
            }
        }
    });
}


function playTTS(lang,text) {
    text = text.replace(/[«»'"]/g, ' ');
    var txtMd5 = MD5(text, lang + CACHE_TYPE_GOOGLE_RESULT, null);
    var buf= searchInTransSoundCache(txtMd5);
    if (buf){
        playSound(buf);
        return;
    }
    var tk = googleTK(text);
    var Url = ttsURL + "&ie=UTF-8&total=1&idx=0" +
        "&tl=" + lang +
        "&q=" + text +
        "&textlen=" + text.length +
        "&tk=" + tk;
    GM_xmlhttpRequest({
        method: "GET",
        url: Url,
        responseType: 'arraybuffer',
        onload: function (response) {
            try {
                audioContext.decodeAudioData(response.response, function (buffer) {
                    transSoundMd5Cache.push(txtMd5);
                    transSoundCache.push(buffer);
                    playSound(buffer);
                });
            } catch (e) {
                console.log(e);
            }
        }
    });
}


'use strict';

/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
function safe_add(x, y) {
    var lsw = (x & 0xFFFF) + (y & 0xFFFF),
        msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    return (msw << 16) | (lsw & 0xFFFF);
}

/*
* Bitwise rotate a 32-bit number to the left.
*/
function bit_rol(num, cnt) {
    return (num << cnt) | (num >>> (32 - cnt));
}

/*
* These functions implement the four basic operations the algorithm uses.
*/
function md5_cmn(q, a, b, x, s, t) {
    return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
}

function md5_ff(a, b, c, d, x, s, t) {
    return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}

function md5_gg(a, b, c, d, x, s, t) {
    return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}

function md5_hh(a, b, c, d, x, s, t) {
    return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5_ii(a, b, c, d, x, s, t) {
    return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}

/*
* Calculate the MD5 of an array of little-endian words, and a bit length.
*/
function binl_md5(x, len) {
    /* append padding */
    x[len >> 5] |= 0x80 << ((len) % 32);
    x[(((len + 64) >>> 9) << 4) + 14] = len;

    var i, olda, oldb, oldc, oldd,
        a = 1732584193,
        b = -271733879,
        c = -1732584194,
        d = 271733878;

    for (i = 0; i < x.length; i += 16) {
        olda = a;
        oldb = b;
        oldc = c;
        oldd = d;

        a = md5_ff(a, b, c, d, x[i], 7, -680876936);
        d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
        c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
        b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
        a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
        d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
        c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
        b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
        a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
        d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
        c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
        b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
        a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
        d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
        c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
        b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);

        a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
        d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
        c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
        b = md5_gg(b, c, d, a, x[i], 20, -373897302);
        a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
        d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
        c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
        b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
        a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
        d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
        c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
        b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
        a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
        d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
        c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
        b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);

        a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
        d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
        c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
        b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
        a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
        d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
        c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
        b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
        a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
        d = md5_hh(d, a, b, c, x[i], 11, -358537222);
        c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
        b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
        a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
        d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
        c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
        b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);

        a = md5_ii(a, b, c, d, x[i], 6, -198630844);
        d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
        c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
        b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
        a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
        d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
        c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
        b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
        a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
        d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
        c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
        b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
        a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
        d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
        c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
        b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);

        a = safe_add(a, olda);
        b = safe_add(b, oldb);
        c = safe_add(c, oldc);
        d = safe_add(d, oldd);
    }
    return [a, b, c, d];
}

/*
* Convert an array of little-endian words to a string
*/
function binl2rstr(input) {
    var i,
        output = '';
    for (i = 0; i < input.length * 32; i += 8) {
        output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
    }
    return output;
}

/*
* Convert a raw string to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*/
function rstr2binl(input) {
    var i,
        output = [];
    output[(input.length >> 2) - 1] = undefined;
    for (i = 0; i < output.length; i += 1) {
        output[i] = 0;
    }
    for (i = 0; i < input.length * 8; i += 8) {
        output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
    }
    return output;
}

/*
* Calculate the MD5 of a raw string
*/
function rstr_md5(s) {
    return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
}

/*
* Calculate the HMAC-MD5, of a key and some data (raw strings)
*/
function rstr_hmac_md5(key, data) {
    var i,
        bkey = rstr2binl(key),
        ipad = [],
        opad = [],
        hash;
    ipad[15] = opad[15] = undefined;
    if (bkey.length > 16) {
        bkey = binl_md5(bkey, key.length * 8);
    }
    for (i = 0; i < 16; i += 1) {
        ipad[i] = bkey[i] ^ 0x36363636;
        opad[i] = bkey[i] ^ 0x5C5C5C5C;
    }
    hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
    return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
}

/*
* Convert a raw string to a hex string
*/
function rstr2hex(input) {
    var hex_tab = '0123456789abcdef',
        output = '',
        x,
        i;
    for (i = 0; i < input.length; i += 1) {
        x = input.charCodeAt(i);
        output += hex_tab.charAt((x >>> 4) & 0x0F) +
            hex_tab.charAt(x & 0x0F);
    }
    return output;
}

/*
* Encode a string as utf-8
*/
function str2rstr_utf8(input) {
    return unescape(encodeURIComponent(input));
}

/*
* Take string arguments and return either raw or hex encoded strings
*/
function raw_md5(s) {
    return rstr_md5(str2rstr_utf8(s));
}

function hex_md5(s) {
    return rstr2hex(raw_md5(s));
}

function raw_hmac_md5(k, d) {
    return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d));
}

function hex_hmac_md5(k, d) {
    return rstr2hex(raw_hmac_md5(k, d));
}

function MD5(string, key, raw) {
    if (!key) {
        if (!raw) {
            return hex_md5(string);
        } else {
            return raw_md5(string);
        }
    }
    if (!raw) {
        return hex_hmac_md5(key, string);
    } else {
        return raw_hmac_md5(key, string);
    }
}
var zdictStyle=`
<style type="text/css">
#shiyi_content{height: 500px; width: 100%; margin: 0px; padding: 0px; border: none; color: black; text-decoration: none; overflow: auto;background:transparent;}
#shiyi_content .homograph-entry{margin: 0px; padding: 0px; border: none;word-wrap:break-word;box-sizing:border-box;}
#shiyi_content  .page{font-size:16px;}
#shiyi_content .nr-box{ padding-top: 0;border: 1px solid #af9a87;padding: 15px;background: transparent;margin-bottom: 20px;-webkit-column-break-inside: avoid;page-break-inside: avoid;break-inside: avoid;} 
#shiyi_content .nr-box-shiyi .jbjs {border-right: solid 4px #c99464;}
#shiyi_content .nr-box-header {background: #f3e8df;padding: 10px 15px;margin: 0 -15px 1em -15px;font-size: 12px;}
#shiyi_content .zib-title {float: right;font-size: 16px;}
#shiyi_content .nr-box-shiyi h2.h2_entry {font-size: 1.8em;margin-bottom: 0;}
#shiyi_content .h2_entry {font-size: 1.4em;margin-bottom: .5em;}
#shiyi_content .page .dictname {font-size: .7em;}
#shiyi_content .page .zdict .definitions, .page .zdict .derivs, .page .zdict .etyms {margin-bottom: 1em;}
#shiyi_content span.z_ts2, span.z_ts3, span.z_ts4 {background-image:transparent;height: 18px;line-height: 18px;color: #660000;font-size: 12px;text-align: center;display: inline-block;font-weight: normal;margin-right: 5px;padding: 0;}
#shiyi_content span.z_ts2 {background-position: 0 -78px;width: 33px;}
#shiyi_content .jnr, .bknr, .wknr {margin: .5em;line-height: 1.5em;}
#shiyi_content .p, p {margin-bottom: 1em;}
#shiyi_content .dicpy {font-size: 20px;font-family: Arial;color: #660000;font-weight: normal;}
#shiyi_content .encs {color: #339900;}
#shiyi_content .diczx1 {color: #660000;}
#shiyi_content .h_line1 {clear: both;height: 3px;width: 98%; margin-bottom: 3px;background-color:gray;text-indent: -9999px;}
#shiyi_content span.z_ts4 {background-position: 0 -114px;width: 55px;}
#shiyi_content span.z_ts2, span.z_ts3, span.z_ts4 {background-color:#F1DED6;border:1px #B07D7E solid;border-radius:3px;height: 18px;line-height: 18px;color: #660000;font-size: 12px;text-align: center;display: inline-block;font-weight: normal;margin-right: 5px;padding: 0;}
#shiyi_content .gnr .gycd {line-height: 1.5;padding-bottom: 5px;}
#shiyi_content .pz {border-bottom: 1px dashed #F1E9E7;padding-bottom: 5px;}
#shiyi_content ruby {display: inline-table;text-align: center;white-space: nowrap;text-indent: 0;margin: 0;vertical-align: -20%;}
#shiyi_content ruby > rb, ruby > rbc {display: table-row-group;line-height: 90%;}
#shiyi_content rbc > rb, rtc > rt {display: table-cell;letter-spacing: 0;}
#shiyi_content rt {text-indent: 0px;line-height: normal;-webkit-text-emphasis: none;}
#shiyi_content .gnr .pz ruby rtc {font-size: 12px;color: #8F6652;line-height: 30px;}
#shiyi_content .pz ruby rtc {font-size: 12px;color: #8F6652;line-height: 30px;}
#shiyi_content ruby > rt, ruby > rbc + rtc {display: table-header-group;font-size: 60%;line-height: 40%;letter-spacing: 0;}
#shiyi_content ruby > rbc + rtc + rtc {display: table-footer-group;font-size: 60%;line-height: 40%;letter-spacing: 0;}
#shiyi_content ol, ul {list-style-type: none;}
#shiyi_content .gnr .gycd {line-height: 1.5;padding-bottom: 5px;}
#shiyi_content .gnr .gc_uono {list-style: outside none none;text-indent: 2em;}
#shiyi_content .gnr .def {margin: 5px 0 5px;line-height: 1.6em;}
#shiyi_content .gnr .gc_sy {clear: both;display: block;margin-bottom: 2pt;}
#shiyi_content .gnr .gc_lz {clear: both;display: block;}
#shiyi_content .gnr .gc_fy, .gc_jy {clear: both;display: block;font-size: 85%;margin-top: 2px;font-weight: 700;color: #666;}
#shiyi_content .gnr .gc_jfy_i {background-color: #633;border-radius: 4px;color: white;font-size: 100%;line-height: 1;padding: 2px;margin-right: 5px;}
#shiyi_content .page .copyright {color: gray;font-size: small;margin-top: 10px;}
#shiyi_content .contentslot, .mpuslot_b {margin-top: 20px;text-align: center;}
#shiyi_content .nr-box-shiyi.wljs {border-right: solid 4px #aea4a4;}
#shiyi_content .page .zdict .definitions, .page .zdict .derivs, .page .zdict .etyms {margin-bottom: 1em;}
#shiyi_content .cnr h3 {color: #660000;font-size: 16px;line-height: 2em;font-weight: bold;}
#shiyi_content .jnr, .bknr, .wknr {margin: .5em;line-height: 1.5em;}
#shiyi_content .cnr li {counter-increment: li;}
#shiyi_content .jnr ol {list-style: none;counter-reset: li;}
#shiyi_content .jnr li {counter-increment: li;}
#shiyi_content .dichr {margin-top: 5px;width: 100%;clear: both;color: #af9a87;border-bottom: solid 1px;}
#shiyi_content .enbox {padding: 10px 0 5px 0;border-top: 1px solid #efe3e3;margin: 5px;background:transparent;}
#shiyi_content .jnr p {margin-bottom: .5em;line-height: 1.5em;}
#shiyi_content .enbox p {font-size: 14px;color: #327311;}
#shiyi_content .wytl{display:none;}
</style>
`;