Pronax / 网易BUFF价格比例(找挂刀)插件

// ==UserScript==
// @name            网易BUFF价格比例(找挂刀)插件
// @homepageURL     https://greasyfork.org/zh-CN/users/412840-newell-gabe-l
// @description     找挂刀,看比例,挑玄学
// @version         2.1.17
// @note            更新于2021年4月19日00:19:09
// @author          Pronax
// @copyright       2021, Pronax
// @supportURL      https://jq.qq.com/?_wv=1027&k=U8mqorxQ
// @feedback-url    https://jq.qq.com/?_wv=1027&k=U8mqorxQ
// @license         AGPL-3.0-only
// @match           https://buff.163.com/market/goods*
// @match           https://buff.163.com/market/?game=*
// @icon            https://gitee.com/pronax/buffMarketHelper/raw/feature/Wingman.png
// @run-at          document-body
// @grant           GM_xmlhttpRequest
// @grant           GM_addStyle
// @grant           GM_setValue
// @grant           GM_getValue
// @grant           GM_info
// @grant           GM_registerMenuCommand
// ==/UserScript==

(function () {

  'use strict';

  const steanOrderScaleTemp = "<span class=\"f_12px f_Bold l_Right\" style=\"margin-top: inherit;\"></span>";
  const steanOrderNumberTemp = "<span class=\"f_12px c_Gray f_Bold l_Right\" style=\"margin-top: inherit;\"></span>";
  const steanOrderNumberErrorTemp = "<span class=\"f_12px c_Gray f_Bold l_Right\" style=\"margin-top: inherit;color:#e45302 !important\"></span>";
  const g_rgCurrencyData = {
    "AED": {
      "strCode": "AED",
      "eCurrencyCode": 32,
      "strSymbol": "AED",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "ARS": {
      "strCode": "ARS",
      "eCurrencyCode": 34,
      "strSymbol": "ARS$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": ".",
      "strSymbolAndNumberSeparator": " "
    },
    "AUD": {
      "strCode": "AUD",
      "eCurrencyCode": 21,
      "strSymbol": "A$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "BGN": {
      "strCode": "BGN",
      "eCurrencyCode": 42,
      "strSymbol": "лв",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "BRL": {
      "strCode": "BRL",
      "eCurrencyCode": 7,
      "strSymbol": "R$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": ".",
      "strSymbolAndNumberSeparator": " "
    },
    "BYN": {
      "strCode": "BYN",
      "eCurrencyCode": 36,
      "strSymbol": "Br",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "CAD": {
      "strCode": "CAD",
      "eCurrencyCode": 20,
      "strSymbol": "CDN$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "CHF": {
      "strCode": "CHF",
      "eCurrencyCode": 4,
      "strSymbol": "CHF",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": " ",
      "strSymbolAndNumberSeparator": " "
    },
    "CLP": {
      "strCode": "CLP",
      "eCurrencyCode": 25,
      "strSymbol": "CLP$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": ".",
      "strSymbolAndNumberSeparator": " "
    },
    "CNY": {
      "strCode": "CNY",
      "eCurrencyCode": 23,
      "strSymbol": "¥",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "COP": {
      "strCode": "COP",
      "eCurrencyCode": 27,
      "strSymbol": "COL$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": ".",
      "strSymbolAndNumberSeparator": " "
    },
    "CRC": {
      "strCode": "CRC",
      "eCurrencyCode": 40,
      "strSymbol": "₡",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": ".",
      "strSymbolAndNumberSeparator": ""
    },
    "CZK": {
      "strCode": "CZK",
      "eCurrencyCode": 44,
      "strSymbol": "Kč",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "DKK": {
      "strCode": "DKK",
      "eCurrencyCode": 45,
      "strSymbol": "kr.",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "EUR": {
      "strCode": "EUR",
      "eCurrencyCode": 3,
      "strSymbol": "€",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": " ",
      "strSymbolAndNumberSeparator": ""
    },
    "GBP": {
      "strCode": "GBP",
      "eCurrencyCode": 2,
      "strSymbol": "£",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "HKD": {
      "strCode": "HKD",
      "eCurrencyCode": 29,
      "strSymbol": "HK$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "HRK": {
      "strCode": "HRK",
      "eCurrencyCode": 43,
      "strSymbol": "kn",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "HUF": {
      "strCode": "HUF",
      "eCurrencyCode": 46,
      "strSymbol": "Ft",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "IDR": {
      "strCode": "IDR",
      "eCurrencyCode": 10,
      "strSymbol": "Rp",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": " ",
      "strSymbolAndNumberSeparator": " "
    },
    "ILS": {
      "strCode": "ILS",
      "eCurrencyCode": 35,
      "strSymbol": "₪",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "INR": {
      "strCode": "INR",
      "eCurrencyCode": 24,
      "strSymbol": "₹",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "JPY": {
      "strCode": "JPY",
      "eCurrencyCode": 8,
      "strSymbol": "¥",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "KRW": {
      "strCode": "KRW",
      "eCurrencyCode": 16,
      "strSymbol": "₩",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "KWD": {
      "strCode": "KWD",
      "eCurrencyCode": 38,
      "strSymbol": "KD",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "KZT": {
      "strCode": "KZT",
      "eCurrencyCode": 37,
      "strSymbol": "₸",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": " ",
      "strSymbolAndNumberSeparator": ""
    },
    "MXN": {
      "strCode": "MXN",
      "eCurrencyCode": 19,
      "strSymbol": "Mex$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "MYR": {
      "strCode": "MYR",
      "eCurrencyCode": 11,
      "strSymbol": "RM",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "NOK": {
      "strCode": "NOK",
      "eCurrencyCode": 9,
      "strSymbol": "kr",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": ".",
      "strSymbolAndNumberSeparator": " "
    },
    "NXP": {
      "strCode": "NXP",
      "eCurrencyCode": 9001,
      "strSymbol": "원",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "NZD": {
      "strCode": "NZD",
      "eCurrencyCode": 22,
      "strSymbol": "NZ$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "PEN": {
      "strCode": "PEN",
      "eCurrencyCode": 26,
      "strSymbol": "S/.",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "PHP": {
      "strCode": "PHP",
      "eCurrencyCode": 12,
      "strSymbol": "P",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "PLN": {
      "strCode": "PLN",
      "eCurrencyCode": 6,
      "strSymbol": "zł",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": " ",
      "strSymbolAndNumberSeparator": ""
    },
    "QAR": {
      "strCode": "QAR",
      "eCurrencyCode": 39,
      "strSymbol": "QR",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "RMB": {
      "strCode": "RMB",
      "eCurrencyCode": 9000,
      "strSymbol": "刀币",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": "",
      "strSymbolAndNumberSeparator": " "
    },
    "RON": {
      "strCode": "RON",
      "eCurrencyCode": 47,
      "strSymbol": "lei",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "RUB": {
      "strCode": "RUB",
      "eCurrencyCode": 5,
      "strSymbol": "pуб.",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": "",
      "strSymbolAndNumberSeparator": " "
    },
    "SAR": {
      "strCode": "SAR",
      "eCurrencyCode": 31,
      "strSymbol": "SR",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "SEK": {
      "strCode": "SEK",
      "eCurrencyCode": 33,
      "strSymbol": "kr",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "SGD": {
      "strCode": "SGD",
      "eCurrencyCode": 13,
      "strSymbol": "S$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "THB": {
      "strCode": "THB",
      "eCurrencyCode": 14,
      "strSymbol": "฿",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "TRY": {
      "strCode": "TRY",
      "eCurrencyCode": 17,
      "strSymbol": "TL",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": ".",
      "strSymbolAndNumberSeparator": " "
    },
    "TWD": {
      "strCode": "TWD",
      "eCurrencyCode": 30,
      "strSymbol": "NT$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": " "
    },
    "UAH": {
      "strCode": "UAH",
      "eCurrencyCode": 18,
      "strSymbol": "₴",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": " ",
      "strSymbolAndNumberSeparator": ""
    },
    "USD": {
      "strCode": "USD",
      "eCurrencyCode": 1,
      "strSymbol": "$",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": ",",
      "strSymbolAndNumberSeparator": ""
    },
    "UYU": {
      "strCode": "UYU",
      "eCurrencyCode": 41,
      "strSymbol": "$U",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": ".",
      "strSymbolAndNumberSeparator": ""
    },
    "VND": {
      "strCode": "VND",
      "eCurrencyCode": 15,
      "strSymbol": "₫",
      "bSymbolIsPrefix": false,
      "bWholeUnitsOnly": true,
      "strDecimalSymbol": ",",
      "strThousandsSeparator": ".",
      "strSymbolAndNumberSeparator": ""
    },
    "ZAR": {
      "strCode": "ZAR",
      "eCurrencyCode": 28,
      "strSymbol": "R",
      "bSymbolIsPrefix": true,
      "bWholeUnitsOnly": false,
      "strDecimalSymbol": ".",
      "strThousandsSeparator": " ",
      "strSymbolAndNumberSeparator": " "
    }
  }
  const strLengthLimit = {
    "USD": 18,
    "RUB": 17,
    "CNY": 18,
    "EUR": 19
  };
  const defaultConfig = {
    maxRange: 1,
    minRange: 0.63,
    needSort: null,
    ajaxTimeOut: 5000,
    pageSize: 20,
    overrideSortRule: false,
    sortAfterAllDone: true,
    marketColorLow: "#ff1e1e",
    marketColorHigh: "#5027ff",
    steamCurrency: "CNY",
    currencyDisplayMode: "strCode"
  };
  var steam_lowest_sell_order_detail = 0; // 商品详情页专用-steam最低出售价
  var steam_highest_buy_order_detail = 0; // 商品详情页专用-steam最高求购价
  var helper_config = loadConfig();
  var displayCurrency = getDisplayCurrency();
  var steamCurrency;
  var steamConnection = undefined;
  var steamFailedTimes = 0;
  var market_color_high = [];
  var market_color_low = [];
  var itemCount = 0;
  var itemNum = 0;
  var needSort;

  // 设置界面
  GM_addStyle(".helper-setting input[type=number]{max-width:70px}input[type=\"number\"]{-moz-appearance:textfield}.helper-setting-shadow{position:fixed;justify-content:center;align-items:center;display:none;z-index:100;top:0;right:0;bottom:0;left:0;margin:0;background:#00000066}.helper-setting{background:#fff;border-radius:5px;padding:40px 54px;top:25%}.w-Checkbox.helper-setting-option>span:first-child{margin:0!important;font-size:14px}.helper-setting-steamConnection i.icon{margin-left:0!important}.helper-setting .list_tb span,.helper-setting .list_tb i.icon{margin-left:12px}.helper-setting .icon_status_progressing{animation:rotate-L 1.5s linear infinite;-webkit-animation:rotate-L 1.5s linear infinite}");
  $("body").append('<div class="cont_main helper-setting-shadow"><div class="helper-setting"><b>基础设定</b><span id="helper-version" style="float: right;">插件版本:</span><table class="list_tb"><tbody><tr><td class="t_Left c_Gray">STEAM连接性:</td><td class="t_Left helper-setting-steamConnection"><span class="c_Yellow"><i class="icon icon_status_waiting"></i>未知</span></td><td class="t_Right"><a href="javascript:void(0);" id="helper-setting-checkBtn" class="i_Btn i_Btn_small">检测</a></td></tr><tr><td class="t_Left c_Gray" width="120">覆盖排序规则 <i class="icon icon_qa j_tips_handler" data-title="说明:" data-content="开启后使用buff排序(比如当你按价格排序时)比例排序规则重置为默认,不再按比例排序(刷新页面后会恢复保存的规则)" data-direction="right"></i></td><td class="t_Left"><span><div id="helper-setting-stickerSort" class="w-Checkbox helper-setting-option" data-option-target="overrideSortRule" value=""><span value="true"><i class="icon icon_checkbox"></i>启用 </span></div></span></td><td class="t_Right"></td></tr><tr><td class="t_Left c_Gray" width="120">完成后排序 <i class="icon icon_qa j_tips_handler" data-title="说明:" data-content="启用时会等所有饰品比例都加载完成再进行排序,关闭时每加载完一个饰品就排序一次" data-direction="right"></i></td><td class="t_Left"><span><div id="helper-setting-sortAfterAllDone" class="w-Checkbox helper-setting-option" data-option-target="sortAfterAllDone" value=""><span value="true"><i class="icon icon_checkbox"></i>启用 </span></div></span></td><td class="t_Right"></td></tr><tr><td class="t_Left c_Gray">默认排序规则</td><td class="t_Left"><span><div id="helper-setting-sortRule" class="w-Select helper-setting-option" data-option-target="needSort" style="width: 130px; visibility: visible;"><h3 style="margin:0;font-weight:normal;">不排序</h3><i class="icon icon_drop"></i><ul style="width: 130px;"><li value="null">不排序</li><li value="buff-sort_asc">按buff比例从低到高</li><li value="buff-sort_desc">按buff比例从高到低</li><li value="order-sort_asc">按求购比例从低到高</li><li value="order-sort_desc">按求购比例从高到低</li></ul></div></span></td><td class="t_Right"></td></tr><tr><td class="t_Left c_Gray">steam参考货币 </td><td class="t_Left"><span><div id="helper-setting-currency" class="w-Select helper-setting-option" data-option-target="steamCurrency" style="width: 120px; visibility: visible;"><h3 style="margin:0;font-weight:normal;">默认</h3><i class="icon icon_drop"></i><ul style="width: 120px;height: 200px;overflow: auto;" class="steam-currency-selector"></ul></div></span></td><td class="t_Center"><i class="icon icon_qa j_tips_handler" style="margin-left: 0;" data-title="&lt;p class=&quot;c_Red&quot;&gt;没有特殊需求就不要改&lt;/p&gt;" data-content="选择获取steam数据时使用什么货币,buff价格依旧是人民币,乱改会导致比例错误。默认为CNY(¥)" data-direction="right"></i><span><div id="helper-setting-currencyDisplayMode" class="w-Select helper-setting-option" data-option-target="currencyDisplayMode" style="width: 80px; visibility: visible;"><h3 style="margin:0;font-weight:normal;">默认</h3><i class="icon icon_drop"></i><ul style="width: 80px;"><li value="strCode">缩写</li><li value="strSymbol">符号</li></ul></div></span></td></tr><tr><td class="t_Left c_Gray">每页显示数量</td><td class="t_Left" style="position: relative;"><span><input type="number" id="helper-setting-pageSize" data-option-target="pageSize" class="i_Text helper-setting-option" min="1" max="80" step="1"></span><i class="icon icon_qa j_tips_handler" data-title="&lt;p class=&quot;c_Red&quot;&gt;可能加大封号风险&lt;/p&gt;" data-content="修改每页显示数量,由于buff反爬虫机制尚不明确,封号概率可能增加也可能减少,谨慎使用,默认值20" data-direction="right"></i></td><td class="t_Right"></td></tr><tr><td class="t_Left c_Gray">请求超时时间 <i class="icon icon_qa j_tips_handler" data-title="关于超时时间:" data-content="如果你可以访问steam市场但是却经常提示你连接steam超时时,你应该增大这个值,默认值为5000" data-direction="right"></i></td><td class="t_Left" style="position: relative;"><span><input type="number" id="helper-setting-ajaxTimeout" data-option-target="ajaxTimeOut" class="i_Text helper-setting-option" min="1000" max="60000" step="100"></span><span class="c_DGray">ms</span></td><td class="t_Left"><span class="c_DGray f_12px helper-setting-adaptiveTimeout"></span></td></tr><tr><td class="t_Left c_Gray">渐变色(市场)</td><td class="t_Center" style="position: relative;"><span class="c_DGray">最小 <input type="color" id="helper-setting-marketColorLow" data-option-target="marketColorLow" class="helper-setting-option"></span><i class="icon icon_qa j_tips_handler" data-title="" data-content="渐变最小值:比例越接近最小值(默认是0.63)会越趋近这个颜色<br/>渐变最大值:比例越接近最大值(默认是1)会越趋近这个颜色" data-direction="bottom"></i></td><td class="t_Center"><span class="c_DGray">最大 <input type="color" id="helper-setting-marketColorHigh" data-option-target="marketColorHigh" class="helper-setting-option"></span></td></tr><tr><td class="t_Left c_Gray">比例极值 </td><td class="t_Center" style="position: relative;"><span class="c_DGray">最小 <input type="number" id="helper-setting-minRange" data-option-target="minRange" class="i_Text helper-setting-option" min="0" max="1" step="0.01"></span><i class="icon icon_qa j_tips_handler" data-title="" data-content="比例最小值:小于等于这个值的比例会直接渲染成最小值渐变色<br/>比例最大值:大于等于这个值的比例会直接渲染成最大值渐变色" data-direction="bottom"></i></td><td class="t_Center"><span class="c_DGray">最大 <input type="number" id="helper-setting-maxRange" data-option-target="maxRange" class="i_Text helper-setting-option" min="1" max="100"></span></td></tr><tr><td class="t_Center" colspan="3"><a href="https://jq.qq.com/?_wv=1027&k=U8mqorxQ">反馈QQ群:544144372</a><span><a href="javascript:void(0);" id="helper-setting-resetAll" class="i_Btn i_Btn_small">恢复默认设置</a></span></td></tr></tbody></table></div></div>');
  initCurrency();
  $("#helper-version").text($("#helper-version").text() + GM_info.script.version);
  $("#helper-setting-checkBtn").click(() => {
    checkSteamConnection();
  });
  $("#helper-setting-resetAll").click(() => {
    resetConfig();
  });
  $(".helper-setting-shadow").click(function (e) {
    if (e.target == this) {
      $(this).fadeOut();
    }
  });
  $(".helper-setting").change(function (e) {
    let target = e.target;
    let optionTarget = target.dataset.optionTarget;
    let val = target.getAttribute("value") ? target.getAttribute("value") : target.value;
    helper_config[optionTarget] = val;
    GM_setValue("helper_config", helper_config);
    if (optionTarget == "currencyDisplayMode") {
      initCurrency();
    }
    init();
  });
  GM_registerMenuCommand('打开设置面板', () => {
    openSettingPanel();
  });

  function loadConfig() {
    let config = GM_getValue("helper_config");
    if (config) {
      return config;
    }
    adaptiveTimeout();
    return clone(defaultConfig);
  }

  function resetConfig() {
    GM_setValue("helper_config", null);
    helper_config = clone(defaultConfig);
    init();
  }

  function openSettingPanel() {
    updateSteamStatus();
    $(".helper-setting-shadow").css({
      "opacity": 0,
      "display": "flex"
    }).animate({
      opacity: '1'
    }, 300);
  }

  function initCurrency() {
    let list = $(".steam-currency-selector>li");
    if (list.length == 0) {
      for (let key in g_rgCurrencyData) {
        $(".steam-currency-selector").append("<li value=" + g_rgCurrencyData[key].strCode + ">" + g_rgCurrencyData[key][helper_config.currencyDisplayMode] + "</li>");
      }
    }
    else {
      for (let li of list) {
        let jq = $(li);
        jq.text(g_rgCurrencyData[jq.attr("value")][helper_config.currencyDisplayMode]);
      }
    }
  }

  function syncCurrency() {
    steamCurrency = g_rgCurrencyData[helper_config.steamCurrency];
    $("#helper-setting-currencyDisplayMode").attr("value", helper_config.currencyDisplayMode);
    $("#helper-setting-currencyDisplayMode>h3").text($("#helper-setting-currencyDisplayMode li[value=" + helper_config.currencyDisplayMode + "]").addClass("on").text());
    $("#helper-setting-currency").attr("value", steamCurrency.strCode);
    $("#helper-setting-currency>h3").text($("#helper-setting-currency li[value=" + steamCurrency.strCode + "]").addClass("on").text());
  }

  function getDisplayCurrency() {
    let currencyList = {
      "/¥/": "CNY",
      "/\\$/": "USD",
      "/€/": "EUR",
      "/₽/": "RUB"
    };
    let text = $(".w-Counter-input").text();
    for (let key in currencyList) {
      if (eval(key).test(text)) {
        return g_rgCurrencyData[currencyList[key]];
      }
    }
  }

  function parseColor() {
    market_color_high = helper_config.marketColorHigh.match(/[0-9a-f]{2}/ig);
    market_color_low = helper_config.marketColorLow.match(/[0-9a-f]{2}/ig);
    for (let i = 2; i >= 0; i--) {
      market_color_high[i] = parseInt(market_color_high[i], 16);
      market_color_low[i] = parseInt(market_color_low[i], 16);
    }
  }

  function failedSteamConnection() {
    if (++steamFailedTimes > (itemNum >> 2)) {
      steamConnection = false;
    }
  }

  function updateSteamStatus() {
    if (steamConnection === undefined) {}
    else if (steamConnection) {
      if (!$(".helper-setting-steamConnection>.c_Green").text()) {
        $(".helper-setting-steamConnection").html("<span class=\"c_Green\"><i class=\"icon icon_status_success\"></i>正常</span>");
      }
    }
    else {
      $(".helper-setting-steamConnection").html("<span class=\"c_DRed\"><i class=\"icon icon_status_failed\"></i>无法连接</span>");
    }
  }

  function sortGoods(sortRule, isAsc) {
    $("#j_list_card>ul>li").sort(function (a, b) {
      let av = $(a).attr(sortRule) - 0;
      let bv = $(b).attr(sortRule) - 0;
      let result = 0;
      if (isAsc) {
        result = av - bv;
      }
      else {
        result = bv - av;
      }
      return result === NaN ? 0 : result;
    }).appendTo("#j_list_card>ul");
  }

  function syncSort() {
    needSort = helper_config.needSort;
    $("#helper-setting-sortRule>h3").text($("#helper-setting-sortRule li[value=" + helper_config.needSort + "]").addClass("on").text());
    $("#helper-sort-text").text($(".buff-helper-sort li[data-value=" + helper_config.needSort + "]").click().text());
  }

  function init() {
    $(".helper-setting>.list_tb .on").removeClass("on");
    if (helper_config.overrideSortRule) {
      $("#helper-setting-stickerSort").attr("value", helper_config.overrideSortRule).children(":first").addClass("on");
    }
    if (helper_config.sortAfterAllDone) {
      $("#helper-setting-sortAfterAllDone").attr("value", helper_config.sortAfterAllDone).children(":first").addClass("on");
    }
    if (helper_config.needSort) {
      syncSort();
    }
    $("#helper-setting-pageSize").val(helper_config.pageSize);
    $("#helper-setting-maxRange").val(helper_config.maxRange);
    $("#helper-setting-minRange").val(helper_config.minRange);
    $("#helper-setting-ajaxTimeout").val(helper_config.ajaxTimeOut);
    $("#helper-setting-marketColorLow").val(helper_config.marketColorLow);
    $("#helper-setting-marketColorHigh").val(helper_config.marketColorHigh);
    updateSteamStatus();
    try {
      syncCurrency();
    }
    catch (error) {
      if (helper_config.steamCurrency.constructor === Object) {
        helper_config.steamCurrency = helper_config.steamCurrency.strCode;
        GM_setValue("helper_config", helper_config);
        syncCurrency();
      }
    }
    parseColor();
  }

  function addHelperBtn() {
    if ($(".floatbar>ul").length == 0) {
      setTimeout(() => {
        addHelperBtn();
      }, 100);
      return;
    }
    if ($("#buff_tool_nextpage").length != 0) {
      return;
    }
    // 设置按钮
    $(".floatbar>ul").prepend("<li><a id='buff_tool_setting'><i class='icon icon_menu_setting'></i><p>设置</p></a></li>");
    $("#buff_tool_setting").click(function () {
      openSettingPanel();
    }).parent().css("cursor", "pointer");
    // 下一页按钮
    $(".floatbar>ul").prepend("<li><a id='buff_tool_nextpage'><i class='icon icon_slide_right2' style='height: 40px;width: 39px;'></i><p>下一页</p></a></li>");
    $("#buff_tool_nextpage").click(function () {
      $(".page-link.next").click();
      $("#sort_scale").removeClass();
    }).parent().css("cursor", "pointer");
  }

  async function adaptiveTimeout() {
    let delay = 0;
    for (let i = 0; i < 3; i++) {
      let r = await delayTest();
      delay = r > delay ? r : delay;
    }
    if (delay > 5000) {
      $("#helper-setting-ajaxTimeout").val(Math.round(delay * 1.5 / 100) * 100).change();
    }
    GM_setValue("helper_config", helper_config);

    function delayTest() {
      return new Promise((resolve, reject) => {
        let startTime = new Date().getTime();
        let endTime = 0;
        GM_xmlhttpRequest({
          url: "https://steamcommunity.com/market/",
          method: "get",
          onload: function (res) {
            if (res && res.status == 200) {
              endTime = new Date().getTime();
              resolve(endTime - startTime);
              return;
            }
            resolve(0);
          },
          onerror: function (err) {
            resolve(0);
          },
          ontimeout: function () {
            steamConnection = false;
            updateSteamStatus();
            resolve(0);
          }
        });
      });
    }
  }

  function checkSteamConnection() {
    $(".helper-setting-steamConnection").html("<span class=\"c_Blue\"><i class=\"icon icon_status_progressing\"></i>检测中</span>");
    $("#helper-setting-checkBtn").css("visibility", "hidden");
    let startTime = new Date().getTime();
    let endTime = 0;
    steamConnection = undefined;
    GM_xmlhttpRequest({
      url: "https://steamcommunity.com/market/",
      method: "get",
      timeout: helper_config.ajaxTimeOut,
      onload: function (res) {
        if (res && res.status == 200) {
          endTime = new Date().getTime();
          changeSteamStatus(true);
        }
        else {
          console.log("检测steam连接性出错:状态错误", res);
          changeSteamStatus(false);
        }
      },
      onerror: function (err) {
        console.log("检测steam连接性出错:连接错误", err);
        changeSteamStatus(false);
      },
      ontimeout: function () {
        console.log("检测steam连接性出错:尝试超时");
        changeSteamStatus(false);
      }
    });

    function changeSteamStatus(status) {
      steamConnection = status;
      if (status) {
        $(".helper-setting-steamConnection").html("<span class=\"c_Green\"><i class=\"icon icon_status_success\"></i>正常</span><span class=\"c_DGray f_12px\">" + (endTime - startTime) + "ms</span>");
      }
      else {
        $(".helper-setting-steamConnection").html("<span class=\"c_DRed\"><i class=\"icon icon_status_failed\"></i>无法连接</span>");
      }
      $("#helper-setting-checkBtn").css("visibility", "visible");
    }

  }

  // 保留2位小数
  function roundToTwo(num) {
    return Math.round(num * 100) / 100;
  }

  function getWithoutFeePrice(originPrice) {
    return roundToTwo(originPrice / 1.15);
  }

  function getScale(originPrice, withFeePrice) {
    return roundToTwo(originPrice / (withFeePrice / 1.15));
  }

  function clone(obj) {
    return JSON.parse(JSON.stringify(obj));
  }

  function gradient(max, min, f) {
    if (f == "∞") {
      return max;
    }
    if (f >= helper_config.maxRange || f <= helper_config.minRange) {
      f = f >= helper_config.maxRange ? 1 : 0;
    }
    else {
      f = (f - helper_config.minRange) / (helper_config.maxRange - helper_config.minRange);
    }
    return max >= min ? f * (max - min) + min : (1 - f) * (min - max) + max;
  }

  function getUrlParam(name, url) {
    let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
    let result;
    if (url) {
      result = url.substr(34).match(reg); //匹配目标参数
    }
    else {
      result = window.location.search.substr(1).match(reg); //匹配目标参数
    }
    if (result != null) return unescape(result[2]);
    return null; //返回参数值
  }

  function updateProgressBar(ID, progress, option) {
    let bar = $("#helper-progress-bar-" + ID);
    if (!progress && !option) {
      bar.width(++itemCount / itemNum * 100 + "%")
    }
    else {
      let widthP = Math.round(bar.width() / document.body.clientWidth * 100);
      switch (option) {
        case "set":
          bar.width(progress + "%");
          break;
        default:
        case "add":
          itemCount++;
          widthP += progress;
          bar.width(widthP + "%");
          break;
        case "sub":
          itemCount--;
          widthP -= progress;
          bar.width(widthP < 0 ? 0 : widthP + "%");
          break;
      }
    }
    if (itemCount >= itemNum) {
      itemCount = 0;
      $("#helper-loading-" + ID).remove();
      bar.fadeOut(500);
    }
  }

  function paintingGradient(scale, target, position, targetTemplate) {
    let template;
    if (targetTemplate) {
      template = targetTemplate;
    }
    else {
      template = '<strong class="f_16px f_Strong price_scale l_Right"></strong>';
    }
    let red = gradient(market_color_high[0], market_color_low[0], scale);
    let green = gradient(market_color_high[1], market_color_low[1], scale);
    let blue = gradient(market_color_high[2], market_color_low[2], scale);
    switch (position) {
      case 1:
        $(target).before($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale));
        break;
      case 2:
        $(target).prepend($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale));
        break;
      case 3:
        $(target).append($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale));
        break;
      case 4:
        $(target).after($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale));
        break;
      default:
        $(target).append($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale));
    }
  }

  function getItemId(buff_item_id, steamLink) {
    return new Promise(function (resolve, reject) {
      let steam_item_id = GM_getValue(buff_item_id);
      if (steam_item_id) {
        resolve(steam_item_id);
        return;
      }
      else if (steam_item_id === null) {
        reject({
          status: 404,
          statusText: "物品不在货架上"
        });
      }
      GM_xmlhttpRequest({
        url: steamLink,
        method: "get",
        timeout: helper_config.ajaxTimeOut,
        onload: function (res) {
          if (res.status == 200) {
            let html = res.response;
            try {
              steam_item_id = html.match(/(?<=Market_LoadOrderSpread\(\s)\d+(?=\s\);)/)[0];
            }
            catch (error) {
              steamConnection = true;
              GM_setValue(buff_item_id, null);
              res.status = 404;
              res.statusText = "物品不在货架上";
              console.log("获取itemID状态异常:", res);
              reject(res);
              return;
            }
            GM_setValue(buff_item_id, steam_item_id);
            resolve(steam_item_id);
          }
          else {
            console.log("获取itemID状态异常:", res);
            reject(res);
          }
        },
        onerror: function (err) {
          console.log("获取itemID错误:", err);
          reject(err);
        },
        ontimeout: function () {
          failedSteamConnection();
          let err = {
            "status": 408,
            "statusText": "连接steam超时"
          };
          console.log("获取itemID超时:", err);
          reject(err);
        }
      });
    });
  }

  function getSteamOrderList(buff_item_id, steamLink) {
    return new Promise(function (resolve, reject) {
      if (!steamConnection && steamConnection != undefined) {
        let err = {
          "status": 408,
          "statusText": "无法访问steam"
        };
        reject(err);
        return;
      }
      getItemId(buff_item_id, steamLink).then(function onFulfilled(steam_item_id) {
        GM_xmlhttpRequest({
          url: window.location.protocol + "//steamcommunity.com/market/itemordershistogram?country=CN&language=schinese&currency=" + steamCurrency.eCurrencyCode + "&item_nameid=" + steam_item_id + "&two_factor=0",
          method: "get",
          timeout: helper_config.ajaxTimeOut,
          onload: function (res) {
            if (res.status == 200) {
              steamConnection = true;
              resolve(JSON.parse(res.response));
            }
            else {
              console.log("访问steamorder状态异常:", res);
              reject(res);
            }
          },
          onerror: function (err) {
            console.log("访问steamorder列表出错:", err);
            reject(err);
          },
          ontimeout: function () {
            failedSteamConnection();
            let err = {
              "status": 408,
              "statusText": "连接steam超时"
            };
            console.log("访问steamorder列表超时:", err);
            reject(err);
          }
        });
      }).catch(function onRejected(err) {
        reject(err);
      });
    });
  }

  function marketListLoadData(item, good, randomID, secendTry) {
    let target = $(good).find("p>strong.f_Strong")[0];
    let error = false;
    let buff_item_id = item.id; // buff商品ID
    let buff_buy_num = item.buy_num; // buff求购数量
    let buff_buy_max_price = item.buy_max_price; // buff求购最高价
    let buff_sell_num = item.quick_price; // buff出售数量
    let buff_sell_min_price = item.sell_min_price; // buff出售最低价
    let steam_price_cny = item.goods_info.steam_price_cny; // buff提供的steam国区售价
    let steam_market_url = item.steam_market_url; // steam市场链接
    let buff_sell_reference_price = item.sell_reference_price; // buff出售参考价(没卵用)
    let steam_highest_buy_order = 0; // steam最高求购价
    let steam_lowest_sell_order = 0; // steam最低出售价
    $(good).attr("data-order-sort", Infinity);
    getSteamOrderList(buff_item_id, steam_market_url, secendTry).then(function onFulfilled(json) {
      steam_highest_buy_order = json.highest_buy_order / 100;
      steam_lowest_sell_order = json.lowest_sell_order / 100;
      let orderNumber = $(json.buy_order_summary)[0].innerText;
      let steamOrderScale = getScale(buff_sell_min_price, steam_highest_buy_order);
      $(good).attr("data-order-sort", steamOrderScale);
      $(target).after($(steanOrderNumberTemp).text(orderNumber + "┊"));
      paintingGradient(steamOrderScale, target, 4, steanOrderScaleTemp);
    }).catch(function onRejected(err) {
      switch (err.status) {
        case 429:
          steamConnection = true;
          err.statusText = "请求次数过多";
          break;
        case 500:
          if (!secendTry) {
            console.log("正在自动重试状态异常项目");
            error = true;
            return;
          }
          err.statusText = "内部服务器错误";
          break;
        case 0:
          failedSteamConnection();
          err.statusText = "无法访问steam";
          break;
      }
      $(target).after($(steanOrderNumberErrorTemp).text(err.statusText));
    }).finally(() => {
      if (error) {
        marketListLoadData(item, good, randomID, true);
        return;
      }
      let lowest_sell_price = steam_lowest_sell_order ? steam_lowest_sell_order : steam_price_cny;
      let withoutFeePrice = getWithoutFeePrice(lowest_sell_price);
      let scale = getScale(buff_sell_min_price, lowest_sell_price);
      $(good).attr("data-buff-sort", scale);
      if (scale === Infinity) {
        withoutFeePrice = "";
        scale = "∞";
      }
      let limit = strLengthLimit[displayCurrency.strCode];
      let displayPrice = $(target).text().match(/([€₽\$¥]\s)((\d+)(\.\d{1,2})?)/);
      let strLenth = ("" + displayPrice[0] + withoutFeePrice + scale).length;
      let tryMe = 0;
      while (strLenth > limit) {
        switch (tryMe++) {
          case 0: // 0/1
            withoutFeePrice = Math.round(withoutFeePrice * 10) / 10;
            break;
          case 1: // 0/2
            withoutFeePrice = Math.round(withoutFeePrice);
            break;
          case 2: // 0/1
            scale = Math.round(scale * 10) / 10;
            break;
          case 3: // 0/3
            $(target).text(displayPrice[1] + Math.ceil(displayPrice[2]));
            displayPrice = $(target).text().match(/([€₽\$¥]\s)((\d+)(\.\d{1,2})?)/);
            break;
          case 4: // 0/2
            scale = Math.round(scale);
            break;
          case 5: // no one's gonna know
            $(target).text("0x" + parseInt(displayPrice[3]).toString(16));
            withoutFeePrice = withoutFeePrice.toString(16);
            strLenth = 0;
            continue;
        }
        strLenth = ("" + displayPrice[0] + withoutFeePrice + scale).length;
      }
      $(target).append($("<span class=\"f_12px f_Bold c_Gray\"></span>").css("margin-left", "5px").text(withoutFeePrice));
      paintingGradient(scale, target, 3);
      if (needSort && (helper_config.sortAfterAllDone ? itemCount == itemNum - 1 : true)) {
        let arr = needSort.split("_");
        sortGoods("data-" + arr[0], arr[1] == "asc");
      }
      updateProgressBar(randomID);
    });
  }

  // 商品详情
  window.buff_csgo_goods_scale_plugin_load = function (data) {
    // 检测商品是否加载完成
    if ($("#market-selling-list").length == 0) {
      setTimeout(buff_csgo_goods_scale_plugin_load, 100);
      return;
    }
    if ($("#market-selling-list").hasClass("calculated") || data.total_count == 0) {
      return;
    }
    $(".detail-cont").append("<i class=\"icon icon_uploading helper-loading\" style='margin: 5px;'></i>");
    let price_list = $(".f_Strong");
    let isLogined = $("#navbar-cash-amount").length == 1;
    let isFirstTime = $(".good_scale").length == 0;
    let steamLink = document.getElementsByClassName("detail-summ")[0].lastElementChild.href;
    let buff_item_id = getUrlParam("goods_id");
    let items = data.items;
    let steam_price_cny = data.goods_infos[buff_item_id].steam_price_cny;
    let steam_price_without_fee = 0; // steam卖出实收      
    steamFailedTimes = items.length;
    let pm = new Promise(function (resolve, reject) {
      if (isFirstTime) {
        getSteamOrderList(buff_item_id, steamLink).then(function onFulfilled(json) {
          steam_highest_buy_order_detail = json.highest_buy_order / 100;
          steam_lowest_sell_order_detail = json.lowest_sell_order / 100;
          $(".detail-cont").append("<div id='steam_order'>" + json.buy_order_summary + "</div>");
        }).catch(function onRejected(err) {
          switch (err.status) {
            case 429:
              steamConnection = true;
              err.statusText = "请求次数过多";
              break;
            case 500:
              err.statusText = "内部服务器错误,请稍后重试";
              break;
            case 0:
              failedSteamConnection();
            case 408:
              err.statusText = "访问steam超时,请检查steam市场连接性";
              break;
          }
          $(".detail-cont").append("<div id='steam_order_error'>" + err.statusText + "</div>");
        }).finally(() => {
          resolve();
        });
      }
      else {
        reject();
      }
    });
    pm.catch(e => {}).finally(function onFulfilled() {
      $(".helper-loading").remove();
      $(".list_tb_csgo>tr>th:nth-child(5)").after('<th style="width: 45px;" class="t_Left"><span>比例<i class="icon icon_order"></i></span></th>');
      steam_price_without_fee = getWithoutFeePrice(steam_lowest_sell_order_detail ? steam_lowest_sell_order_detail : steam_price_cny);
      for (let i = 0; i < items.length; i++) {
        let buff_sell_price = items[i].price;
        let scale = roundToTwo(buff_sell_price / steam_price_without_fee);
        if (scale === Infinity) {
          scale = "∞";
        }
        if (!i) {
          $(".f_Strong .hide-usd")[0].innerText = steam_price_without_fee;
          let color;
          switch (true) {
            case scale > 0.9:
              color = "#a0ffc5";
              break;
            case scale > 0.8:
              color = "#b8ff8a";
              break;
            case scale > 0.74:
              color = "#fff054";
              break;
            case scale > 0.67:
              color = "#ff7e15";
              break;
            default:
              color = "#ff0049";
              break;
          }
          if (isFirstTime) {
            $(".detail-summ>a").prop("href", $(".detail-summ>a").prop("href") + "?buffPrice=" + buff_sell_price);
            $(".market_commodity_orders_header_promote:last").after("<small class='market_listing_price_with_fee'>" + getScale(buff_sell_price, steam_highest_buy_order_detail) + "</small>");
            $(price_list[isLogined ? 1 : 0]).append($("<big class='good_scale' style='color: " + color + ";margin-left: 6px'>" + scale + "</big>"));
          }
          else {
            $(".detail-summ>a").prop("href", $(".detail-summ>a").prop("href").replace(/\d{0,6}[.]?\d{0,2}$/, buff_sell_price));
            $(".good_scale").text(scale).css("color", color);
            $(".market_listing_price_with_fee").text(getScale(buff_sell_price, steam_highest_buy_order_detail));
          }
        }
        if (scale > 10) { // 防止价格太长换行
          scale = scale > 100 ? Math.round(scale) : Math.round(scale * 10) / 10;
        }
        $(price_list[i + (isLogined ? 2 : 1)]).parents("td").after('<td class="t_Left"><div style="display: table-cell;"><b class="seller_scale">' + scale + '</b></div></td>');
      }
      $("#market-selling-list").addClass("calculated");
    });
  }

  // 市场目录
  window.buff_csgo_list_scale_plugin_load = function (items) {
    // 检测商品是否加载完成
    if ($("#j_list_card>ul>li").length == 0) {
      setTimeout(buff_csgo_list_scale_plugin_load, 100);
      return;
    }
    if ($("#j_list_card").hasClass("calculated")) {
      return;
    }
    $(".list_card li>p>span.l_Right").removeClass("l_Right").addClass("l_Left");
    let randomID = Math.round(Math.random() * 1000);
    let goods = $("#j_list_card>ul>li");
    itemNum = items.length;
    // 添加进度条
    $(".tab>li.on").append("<i id=helper-loading-" + randomID + " class=\"icon icon_uploading helper-loading\"></i>");
    $(".market-list .blank20").prepend('<div id=helper-progress-bar-' + randomID + ' class="helper-progress-bar"></div>');
    for (let i = 0; i < goods.length; i++) {
      $(goods[i]).attr("data-default-sort", i);
      marketListLoadData(items[i], goods[i], randomID);
    }
    $("#j_list_card").addClass("calculated");
  }

  if (location.pathname === "/market/goods") {
    GM_addStyle(".icon_payment_alipay{background-position:-417px -331px}.icon_payment_others{background-position:-510px 0}.market_commodity_orders_header_promote {color: whitesmoke;}#steam_order{margin-top:5px}#steam_order_error{margin-top:5px;font-size: medium;font-weight: bold;color: #ff1e3e;}.market_listing_price_with_fee{color: #d4b527;font-size: 12px;margin-left: 6px;}");
    // 设置初始化
    init();
    $(document).ajaxSuccess(function (event, status, header, result) {
      if (header.url.startsWith("/api/market/goods/sell_order") && result.data) {
        steamFailedTimes = 0;
        // 批量购买(未完成)
        // if ($("#helper-bulk-buy").length == 0) {
        //     $("#batch-buy-btn").after($('<a href="javascript:" class="i_Btn i_Btn_mid" id="helper-bulk-buy">批量购买</a>'));
        // }
        buff_csgo_goods_scale_plugin_load(result.data);
      }
    });
  }
  else if (location.pathname === "/market/") {
    // 样式
    GM_addStyle("#sort_scale{display:inline-block;padding:0 6px 0 16px;cursor:pointer;height:32px;margin-left:5px;line-height:32px;text-align:center;border-radius:4px;min-width:60px;border:1px solid #45536c;color:#63779b;vertical-align:middle}#sort_scale.enabled{background:#45536c;color:#fff}.list_card li h3{margin: 8px 12px 9px;}.list_card li>p>span.l_Left{margin-top:inherit}.list_card li>p>strong.f_Strong{display:block;font-size:20px;min-height:20px;}.price_scale{padding-top:2px}");
    GM_addStyle(".helper-loading{position:absolute;margin:11px}.helper-progress-bar{height:20px;background:linear-gradient(90deg,rgb(22 122 193 / 70%) 0,rgb(51 177 159 / 50%) 70%,transparent);width:0;z-index:1000}");
    // 翻页和设置按钮
    addHelperBtn();
    // 排序按钮
    $(".block-header>.l_Right").append($('<div class="w-Select-Multi w-Select-scroll buff-helper-sort" style="visibility: visible; width: 140px;"><h3 id="helper-sort-text">比例排序</h3><i class="icon icon_drop"></i><ul style="width: 140px;"><li data-value="null">默认</li><li data-value="buff-sort_asc"><span class="w-Order_asc">buff比例从低到高<i class="icon icon_order"></i></span></li><li data-value="buff-sort_desc"><span class="w-Order_des">buff比例从高到低<i class="icon icon_order"></i></span></li><li data-value="order-sort_asc"><span class="w-Order_asc">求购比例从低到高<i class="icon icon_order"></i></span></li><li data-value="order-sort_desc"><span class="w-Order_des">求购比例从高到低<i class="icon icon_order"></i></span></li></ul></div>'));
    var sortBtnTimeout;
    $(".buff-helper-sort").click(function () {
      $(this).addClass("on");
      clearTimeout(sortBtnTimeout);
    }).mouseleave(function () {
      let t = $(this);
      if (t.hasClass("on")) {
        sortBtnTimeout = setTimeout(() => t.removeClass("on"), 300);
      }
    });
    $(".buff-helper-sort li").click(function (e) {
      e.stopPropagation();
      needSort = this.dataset.value;
      if (this.dataset.value == "null") {
        $("#helper-sort-text").text("比例排序");
        sortGoods("data-default-sort", true);
      }
      else {
        $("#helper-sort-text").text(this.innerText);
        let arr = this.dataset.value.split("_");
        sortGoods("data-" + arr[0], arr[1] == "asc");
      }
      $(".buff-helper-sort").removeClass("on");
    });
    // 设置初始化
    init();
    setTimeout(() => {
      // 修改buff排序时重置比例排序规则
      $("div[name='sort_by']").change(function () {
        if (helper_config.overrideSortRule && this.getAttribute("value")) {
          needSort = this.dataset.value;
          $("#helper-sort-text").text("默认");
        }
      });
    }, 500);
    $(document).ajaxSend(function (event, status, header, result) {
      if (header.url.startsWith("/api/market/goods")) {
        let page_size = helper_config.pageSize;
        if (!page_size) {
          page_size = 20;
          $("#helper-setting-pageSize").val(20).change();
        }
        header.url += "&page_size=" + page_size;
        $(".helper-progress-bar").remove();
        $(".helper-loading").remove();
      }
    });
    $(document).ajaxSuccess(function (event, status, header, result) {
      if (header.url.startsWith("/api/market/goods") && result.data.items) {
        steamFailedTimes = 0;
        buff_csgo_list_scale_plugin_load(result.data.items);
      }
    });
  }

})();