天使动漫一键评分

在天使动漫论坛版块页面里,为所选的帖子进行一键评分(可自行修改默认评分设置)

// ==UserScript==
// @name        天使动漫一键评分
// @namespace   https://greasyfork.org/users/4514
// @author      喵拉布丁
// @homepage    https://github.com/miaolapd/TsdmOneKeyRating
// @description 在天使动漫论坛版块页面里,为所选的帖子进行一键评分(可自行修改默认评分设置)
// @include     http://www.tsdm.net/forum.php?mod=forumdisplay*
// @include     http://www.tsdm.me/forum.php?mod=forumdisplay*
// @require     https://code.jquery.com/jquery-3.1.1.min.js
// @version     1.3
// @grant       none
// @run-at      document-end
// @license     MIT
// @include-jquery   true
// ==/UserScript==
/**
 * 配置项
 */
var Config = {
    // 是否在选择的时候排除已评分的帖子,true:开启;false:关闭
    excludeRatingThreadEnabled: true,
    // 是否在选择的时候排除自己的帖子,true:开启;false:关闭
    excludeMyThreadEnabled: true,
    // 是否在关闭评分结果对话框后自动刷新页面,true:开启;false:关闭
    refreshPageAfterCloseRatingResultDialogEnabled: true,
    // ajax请求的时间间隔(毫秒)
    ajaxInterval: 200,
    // ajax请求的超时时间(毫秒)
    ajaxTimeout: 20000
};

/**
 * 默认评分设置
 * 关键字:可通过jQuery选择的dom对象
 * 值:想要设置的预设值
 * @example
 * var DefValueConfig = {
 *     '[name="score1"]': '+1', // 将威望设为+1
 *     '[name="score2"]': '+2', // 将天使币设为+1
 *     '[name="score3"]': '+3', // 将宣传设为+1
 *     '[name="score4"]': '+4', // 将天然设为+1
 *     '[name="score5"]': '+5', // 将腹黑设为+1
 *     '[name="score6"]': '-1', // 将精灵设为-1
 *     '#reason': '很给力', // 将评分理由设为“很给力”
 *     '#highlight_thread': true, // 高亮帖子
 *     '[name="highlight_color"]': '4', // 将帖子高亮颜色设为深绿色
 *     '#highlight_op_1': true, // 将帖子标题设为粗体
 *     '#highlight_op_2': true, // 将帖子标题设为斜体
 *     '#highlight_op_3': true, // 为帖子标题添加下划线
 *     '[name="sendreasonpm"]': true, // 勾选通知作者的复选框
 * };
 */
var DefValueConfig = {
    '[name="score1"]': '+10',
    '[name="score2"]': '+20',
    '#highlight_thread': true,
    '[name="highlight_color"]': '4',
    '#highlight_op_1': true,
};

jQuery.noConflict();
(function ($) {
    // 用户的formHash
    var formHash = '';
    // 自己的用户名
    var userName = '';
    // window对象
    var w = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window;
    // 高亮颜色可选项
    var highlightColorOptions = {
        '0': '#000',
        '1': '#EE1B2E',
        '2': '#EE5023',
        '3': '#996600',
        '4': '#3C9D40',
        '5': '#2897C5',
        '6': '#2B65B7',
        '7': '#8F2A90',
        '8': '#EC1282'
    };

    /**
     * 添加CSS
     */
    var appendCss = function () {
        $('head').append(
            '<style>' +
            '.pd_rating_btns { margin: 10px 0; padding: 0 5px; }' +
            '.pd_rating_btns input { vertical-align: middle; }' +
            '.pd_mask { position: fixed; width: 100%; height: 100%; left: 0; top: 0; z-index: 400; }' +
            '.pd_msg_text strong { margin-left: 15px; float: none; color: #369; }' +
            '.pd_msg_text strong em { color: #FF6600; float: none; }' +
            '.flb .pd_select_thread_num { margin: 0 3px; color: #F26C4F; float: none; }' +
            '.flb .pd_fail_num { color: #3C9D40; }' +
            '.pd_dialog_main { max-height: 620px; overflow-y: auto; }' +
            '#floatlayout_topicadmin.pd_dialog_main { width: 350px; }' +
            '#pd_rating_result { padding: 10px; width: 770px; }' +
            '#pd_rating_result h4 { color: #369; font-size: 14px; }' +
            '#pd_rating_result ol { list-style-position: inside; list-style-type: decimal-leading-zero; }' +
            '#pd_rating_result li { line-height: 2em; }' +
            '#pd_rating_result a, #pd_rating_result em {' +
            '  display: inline-block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: top;' +
            '}' +
            '#pd_rating_result a { color: #2B65B7; width: 400px; }' +
            '#pd_rating_result em { margin-left: 5px; max-width: 300px; }' +
            '#pd_rating_result em b { color: #F26C4F; }' +
            '</style>'
        );
    };

    /**
     * 显示提示消息
     * @param {string} msg 提示消息
     * @param {boolean} [canClose=false] 是否可以关闭
     * @returns {jQuery} 消息框的jQuery对象
     */
    var showMsg = function (msg, canClose) {
        if (!$('.pd_mask').length) $('<div class="pd_mask"></div>').appendTo('body');
        var $msg = $(
            '<div id="fwin_dialog" class="fwinmask" style="position: fixed; z-index: 401;">' +
            '  <table class="fwin" cellpadding="0" cellspacing="0">' +
            '    <tbody>' +
            '    <tr>' +
            '      <td class="t_l"></td>' +
            '      <td class="t_c"></td>' +
            '      <td class="t_r"></td>' +
            '    </tr>' +
            '    <tr>' +
            '      <td class="m_l">&nbsp;&nbsp;</td>' +
            '      <td class="m_c">' +
            '        <h3 class="flb">' +
            '          <em class="pd_msg_text"><img style="width: 16px; height: 16px;" src="static/image/common/loading.gif"> {0}</em>'.replace('{0}', msg) +
            '          <span style="display: none"><a href="javascript:;" class="flbc pd_msg_close" title="关闭">关闭</a></span>' +
            '        </h3>' +
            '      </td>' +
            '      <td class="m_r"></td>' +
            '    </tr>' +
            '    <tr>' +
            '      <td class="b_l"></td>' +
            '      <td class="b_c"></td>' +
            '      <td class="b_r"></td>' +
            '    </tr>' +
            '    </tbody>' +
            '  </table>' +
            '</div>'
        ).appendTo('#append_parent');

        if (canClose) {
            $msg.find('.pd_msg_close').click(function () {
                $(this).closest('#fwin_dialog').data('stop', true);
            }).parent().css('display', 'inline');
        }

        $msg.css('top', $(window).height() / 2 - $msg.height() / 2)
            .css('left', $(window).width() / 2 - $msg.width() / 2);

        return $msg;
    };

    /**
     * 隐藏提示消息
     * @param {jQuery} $msg 消息框的jQuery对象
     */
    var hideMsg = function ($msg) {
        $msg.remove();
        $('.pd_mask').remove();
    };

    /**
     * 输出经过格式化后的控制台消息
     * @param {string} type 消息类别
     * @param {string} msg 回应消息
     */
    var showFormatLog = function (type, msg) {
        var result = '';
        if (/succeedhandle_/i.test(msg)) {
            var matches = /succeedhandle_\w+\('[^']*',\s*'([^']*)'/i.exec(msg);
            if (matches) result = $.trim(matches[1]);
        }
        else if (/errorhandle_/i.test(msg)) {
            var matches = /errorhandle_\w+\('([^']*)'/i.exec(msg);
            if (matches) result = $.trim(matches[1]);
        }
        if (!result) result = '未能获得预期的回应';
        console.log('【{0}】回应:{1}'.replace('{0}', type).replace('{1}', result));
    };

    /**
     * 获取经过本地编码后的字符串
     * @param {string} str 待编码的字符串
     * @returns {string} 经过本地编码后的字符串
     */
    var getLocaleEncodeString = function (str) {
        var img = $('<img />').appendTo('body').get(0);
        img.src = 'nothing?sp=' + str;
        var encodeStr = img.src.split('nothing?sp=').pop();
        $(img).remove();
        return encodeStr;
    };

    /**
     * 排除置顶的帖子
     */
    var excludeTopThread = function () {
        $('input[name="moderate[]"]:checked').each(function () {
            var $this = $(this);
            if ($this.parent('td').prev('td').find('a[title*="置顶"]').length > 0) {
                $this.prop('checked', false);
            }
        });
    };

    /**
     * 排除已评分的帖子
     */
    var excludeRatingThread = function () {
        $('input[name="moderate[]"]:checked').each(function () {
            var $this = $(this);
            if ($this.parent('td').next().find('img[title="帖子被加分"]').length > 0) {
                $this.prop('checked', false);
            }
        });
    };

    /**
     * 排除自己的帖子
     */
    var excludeMyThread = function () {
        $('input[name="moderate[]"]:checked').each(function () {
            var $this = $(this);
            if ($this.parent('td').next().next('td').find('cite > a').text() === userName) {
                $this.prop('checked', false);
            }
        });
    };

    /**
     * 添加一键评分相关按钮
     */
    var addRatingBtns = function () {
        $(
            '<div class="pd_rating_btns">' +
            '  <button class="pn" data-action="selectAll"><span>全选</span></button>' +
            '  <button class="pn" data-action="selectInverse"><span>反选</span></button>' +
            '  <button class="pn" data-action="oneKeyRating" style="color: #F00"><span>一键评分</span></button>' +
            '  <label><input id="pd_exclude_rating" type="checkbox"{0} /> 排除已评分的帖子</label>'
                .replace('{0}', Config.excludeRatingThreadEnabled ? ' checked="checked"' : '') +
            '  <label><input id="pd_exclude_my_thread" type="checkbox"{0} /> 排除自己的帖子</label>'
                .replace('{0}', Config.excludeMyThreadEnabled ? ' checked="checked"' : '') +
            '</div>'
        ).insertBefore('#diyfastposttop').on('click', 'button', function (e) {
            e.preventDefault();
            var action = $(this).data('action');
            if (action === 'selectAll') {
                $('input[name="moderate[]"]').prop('checked', true);
                excludeTopThread();
                if ($('#pd_exclude_rating').prop('checked')) excludeRatingThread();
                if ($('#pd_exclude_my_thread').prop('checked')) excludeMyThread();
            }
            else if (action === 'selectInverse') {
                $('input[name="moderate[]"]').each(function () {
                    $(this).prop('checked', !$(this).prop('checked'));
                });
                excludeTopThread();
                if ($('#pd_exclude_rating').prop('checked')) excludeRatingThread();
                if ($('#pd_exclude_my_thread').prop('checked')) excludeMyThread();
            }
            else if (action === 'oneKeyRating') {
                if (!$('input[name="moderate[]"]:checked').length) {
                    alert('请选择要评分的帖子');
                    return;
                }
                showRatingDialog();
            }
        });

        $(document).on('click', 'input[name="moderate[]"]', function () {
            if ($('.pd_select_thread_num').length > 0) {
                $('.pd_select_thread_num').text($('input[name="moderate[]"]:checked').length);
            }
        });
    };

    /**
     * 显示一键评分对话框
     */
    var showRatingDialog = function () {
        if ($('#fwin_rate').length > 0) return;
        $('#mdly').remove();
        w.pd_modeRateData = null;
        var $dialog = $(
            '<div style="position: fixed; z-index: 201;" class="fwinmask" id="fwin_rate">' +
            '  <table class="fwin" cellpadding="0" cellspacing="0">' +
            '    <tbody>' +
            '    <tr>' +
            '      <td class="t_l"></td>' +
            '      <td class="t_c" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)" ondblclick="hideWindow(\'rate\')"></td>' +
            '      <td class="t_r"></td>' +
            '    </tr>' +
            '    <tr>' +
            '      <td class="m_l" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)" ondblclick="hideWindow(\'rate\')">&nbsp;&nbsp;</td>' +
            '      <td fwin="rate" style="" class="m_c" id="fwin_content_rate">' +
            '        <div fwin="rate" class="tm_c pd_dialog_main" id="floatlayout_topicadmin">' +
            '          <h3 id="fctrl_rate" class="flb">' +
            '            <em fwin="rate" id="return_rate">一键评分 (共选择了<span class="pd_select_thread_num">0</span>个帖子)</em><span><a href="javascript:;" class="flbc" onclick="hideWindow(\'rate\')" title="关闭">关闭</a></span>' +
            '          </h3>' +

            /* 评分form */
            '          <form fwin="rate" id="rateform" method="post" autocomplete="off">' +
            '            <input name="formhash" value="" type="hidden" />' +
            '            <input name="referer" value="" type="hidden" />' +
            '            <input name="handlekey" value="rate" type="hidden" />' +
            '            <div class="c">' +
            '              <table class="dt mbm" cellpadding="0" cellspacing="0">' +
            '                <tbody>' +
            '                <tr>' +
            '                  <th>单位</th>' +
            '                  <th width="65">数值</th>' +
            '                </tr>' +
            '                <tr>' +
            '                  <td> 威望</td>' +
            '                  <td>' +
            '                    <input fwin="rate" name="score1" id="score1" class="px z" value="0" style="width: 25px;" type="text" />' +
            '                    <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score1\', \'scoreoption1\')">^</a>' +
            '                    <ul fwin="rate" id="scoreoption1" style="display:none">' +
            '                      <li>+100</li>' +
            '                      <li>+89</li>' +
            '                      <li>+78</li>' +
            '                      <li>+67</li>' +
            '                      <li>+56</li>' +
            '                      <li>+45</li>' +
            '                      <li>+34</li>' +
            '                      <li>+23</li>' +
            '                      <li>+12</li>' +
            '                      <li>+1</li>' +
            '                      <li>-10</li>' +
            '                    </ul>' +
            '                  </td>' +
            '                </tr>' +
            '                <tr>' +
            '                  <td> 天使币</td>' +
            '                  <td>' +
            '                    <input fwin="rate" name="score2" id="score2" class="px z" value="0" style="width: 25px;" type="text" />' +
            '                    <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score2\', \'scoreoption2\')">^</a>' +
            '                    <ul fwin="rate" id="scoreoption2" style="display:none">' +
            '                      <li>+200</li>' +
            '                      <li>+179</li>' +
            '                      <li>+158</li>' +
            '                      <li>+137</li>' +
            '                      <li>+116</li>' +
            '                      <li>+95</li>' +
            '                      <li>+74</li>' +
            '                      <li>+53</li>' +
            '                      <li>+32</li>' +
            '                      <li>+11</li>' +
            '                      <li>-10</li>' +
            '                    </ul>' +
            '                  </td>' +
            '                </tr>' +
            '                <tr>' +
            '                  <td> 宣传</td>' +
            '                  <td>' +
            '                    <input fwin="rate" name="score3" id="score3" class="px z" value="0" style="width: 25px;" type="text" />' +
            '                    <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score3\', \'scoreoption3\')">^</a>' +
            '                    <ul fwin="rate" id="scoreoption3" style="display:none">' +
            '                      <li>+50</li>' +
            '                      <li>+45</li>' +
            '                      <li>+40</li>' +
            '                      <li>+35</li>' +
            '                      <li>+30</li>' +
            '                      <li>+25</li>' +
            '                      <li>+20</li>' +
            '                      <li>+15</li>' +
            '                      <li>+10</li>' +
            '                      <li>+5</li>' +
            '                    </ul>' +
            '                  </td>' +
            '                </tr>' +
            '                <tr>' +
            '                  <td> 天然</td>' +
            '                  <td>' +
            '                    <input fwin="rate" name="score4" id="score4" class="px z" value="0" style="width: 25px;" type="text" />' +
            '                    <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score4\', \'scoreoption4\')">^</a>' +
            '                    <ul fwin="rate" id="scoreoption4" style="display:none">' +
            '                      <li>+20</li>' +
            '                      <li>+16</li>' +
            '                      <li>+12</li>' +
            '                      <li>+8</li>' +
            '                      <li>+4</li>' +
            '                      <li>-4</li>' +
            '                      <li>-8</li>' +
            '                      <li>-12</li>' +
            '                    </ul>' +
            '                  </td>' +
            '                </tr>' +
            '                <tr>' +
            '                  <td> 腹黑</td>' +
            '                  <td>' +
            '                    <input fwin="rate" name="score5" id="score5" class="px z" value="0" style="width: 25px;" type="text" />' +
            '                    <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score5\', \'scoreoption5\')">^</a>' +
            '                    <ul fwin="rate" id="scoreoption5" style="display:none">' +
            '                      <li>+20</li>' +
            '                      <li>+16</li>' +
            '                      <li>+12</li>' +
            '                      <li>+8</li>' +
            '                      <li>+4</li>' +
            '                      <li>-4</li>' +
            '                      <li>-8</li>' +
            '                      <li>-12</li>' +
            '                    </ul>' +
            '                  </td>' +
            '                </tr>' +
            '                <tr>' +
            '                  <td> 精灵</td>' +
            '                  <td>' +
            '                    <input fwin="rate" name="score6" id="score6" class="px z" value="0" style="width: 25px;" type="text" />' +
            '                    <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score6\', \'scoreoption6\')">^</a>' +
            '                    <ul fwin="rate" id="scoreoption6" style="display:none">' +
            '                      <li>+2</li>' +
            '                      <li>+1</li>' +
            '                    </ul>' +
            '                  </td>' +
            '                </tr>' +
            '                </tbody>' +
            '              </table>' +
            '              <div class="tpclg">' +
            '                <h4>可选评分理由:</h4>' +
            '                <table class="reason_slct" cellpadding="0" cellspacing="0">' +
            '                  <tbody>' +
            '                  <tr>' +
            '                    <td>' +
            '                      <ul fwin="rate" id="reasonselect" class="reasonselect pt">' +
            '                        <li class="">很给力!</li>' +
            '                        <li class="">神马都是浮云</li>' +
            '                        <li>赞一个!</li>' +
            '                        <li>淡定</li>' +
            '                        <li>恶意灌水</li>' +
            '                        <li>违规帖子</li>' +
            '                      </ul>' +
            '                    </td>' +
            '                  </tr>' +
            '                  <tr>' +
            '                    <td><input fwin="rate" id="reason" class="px" type="text" /></td>' +
            '                  </tr>' +
            '                  </tbody>' +
            '                </table>' +
            '              </div>' +
            '            </div>' +
            '          </form>' +

            /* 高亮form */
            '          <form fwin="mods" id="moderateform" method="post" autocomplete="off">' +
            '            <input name="formhash" value="" type="hidden" />' +
            '            <input name="fid" value="" type="hidden" />' +
            '            <input name="redirect" value="" type="hidden" />' +
            '            <input name="handlekey" value="mods" type="hidden" />' +
            '            <div class="c">' +
            '              <ul class="tpcl">' +
            '                <li class="copt" fwin="mods" id="itemcp_highlight">' +
            '                  <table cellpadding="5" cellspacing="0">' +
            '                    <tbody>' +
            '                    <tr>' +
            '                      <td width="15"><input id="highlight_thread" name="operations[]" class="pc" value="highlight" type="checkbox" /></td>' +
            '                      <td class="hasd"><label class="labeltxt" style="color: #444">高亮</label>' +
            '                        <div class="dopt">' +
            '                          <span class="hasd">' +
            '                            <input fwin="mods" id="highlight_color" name="highlight_color" value="" type="hidden" />' +
            '                            <input fwin="mods" id="highlight_style_1" name="highlight_style[1]" value="" type="hidden" />' +
            '                            <input fwin="mods" id="highlight_style_2" name="highlight_style[2]" value="" type="hidden" />' +
            '                            <input fwin="mods" id="highlight_style_3" name="highlight_style[3]" value="" type="hidden" />' +
            '                            <a fwin="mods" href="javascript:;" id="highlight_color_ctrl" onclick="showHighLightColor(\'highlight_color\')" class="pn colorwd"></a>' +
            '                          </span>' +
            '                          <a fwin="mods" href="javascript:;" id="highlight_op_1" data-id="1" class="dopt_b" style="text-indent:0;text-decoration:none;font-weight:700;" title="文字加粗">B</a>' +
            '                          <a fwin="mods" href="javascript:;" id="highlight_op_2" data-id="2" class="dopt_i" style="text-indent:0;text-decoration:none;font-style:italic;" title="文字斜体">I</a>' +
            '                          <a fwin="mods" href="javascript:;" id="highlight_op_3" data-id="3" class="dopt_l" style="text-indent:0;text-decoration:underline;" title="文字加下划线">U</a>' +
            '                        </div>' +
            '                      </td>' +
            '                    </tr>' +
            '                    <tr class="dopt">' +
            '                      <td>&nbsp;</td>' +
            '                      <td>' +
            '                        <p class="hasd">' +
            '                          <label for="expirationhighlight" class="labeltxt" style="color: #444">有效期</label>' +
            '                          <input fwin="mods" name="expirationhighlight" id="expirationhighlight" class="px" autocomplete="off" value="" tabindex="1" type="text" style="width:120px" />' +
            '                          <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'expirationhighlight\')">^</a>' +
            '                        </p>' +
            '                      </td>' +
            '                    </tr>' +
            '                    </tbody>' +
            '                  </table>' +
            '                </li>' +
            '              </ul>' +
            '            </div>' +
            '          </form>' +

            /* 提交按钮 */
            '          <p class="o pns">' +
            '            <label for="sendreasonpm"><input fwin="rate" name="sendreasonpm" id="sendreasonpm" class="pc" type="checkbox" />通知作者</label>' +
            '            <button id="ratesubmit" name="ratesubmit" type="submit" value="true" class="pn pnc"><span>确定</span></button>' +
            '          </p>' +

            '        </div>' +
            '      </td>' +
            '      <td class="m_r" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)" ondblclick="hideWindow(\'rate\')"></td></tr>' +
            '    <tr>' +
            '      <td class="b_l"></td>' +
            '      <td class="b_c" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)" ondblclick="hideWindow(\'rate\')"></td>' +
            '      <td class="b_r"></td>' +
            '    </tr>' +
            '    </tbody>' +
            '  </table>' +
            '</div>'
        ).appendTo('#append_parent');

        $dialog.end().find('.pd_select_thread_num').text($('input[name="moderate[]"]:checked').length)
            .end().find('input[name="formhash"]').val(formHash)
            .end().find('input[name="fid"]').val($('input[name="srhfid"]').val())
            .end().find('input[name="referer"]').val(location.href)
            .end().find('input[name="redirect"]').val(location.href);

        $dialog.find('#reasonselect').on('mouseover', 'li', function () {
            $(this).addClass('xi2 cur1');
        }).on('mouseout', 'li', function () {
            $(this).removeClass('xi2 cur1');
        }).on('click', 'li', function () {
            $('#reason').val($(this).text());
        }).end().find('#reason').keyup(function (e) {
            if (e.keyCode === 13) $dialog.find('#ratesubmit').click();
        });

        $dialog.on('click', '[id^="highlight_op_"]', function () {
            var $this = $(this);
            var id = $this.data('id');
            if (parseInt($('#highlight_style_' + id).val())) {
                $('#highlight_style_' + id).val(0);
                $this.removeClass('cnt');
            }
            else {
                $('#highlight_style_' + id).val(1);
                $this.addClass('cnt');
            }
        });
        w.showHighLightColor = function (hlid) {
            var showid = hlid + '_ctrl';
            if (!document.getElementById(showid + '_menu')) {
                var str = '';
                var coloroptions = highlightColorOptions;
                var menu = document.createElement('div');
                menu.id = showid + '_menu';
                menu.className = 'cmen';
                menu.style.display = 'none';
                for (var i in coloroptions) {
                    str += '<a href="javascript:;" onclick="document.getElementById(\'' + hlid + '\').value=' + i + ';document.getElementById(\'' + showid + '\').style.backgroundColor=\'' + coloroptions[i] + '\';hideMenu(\'' + menu.id + '\')" style="background:' + coloroptions[i] + ';color:' + coloroptions[i] + ';">' + coloroptions[i] + '</a>';
                }
                menu.innerHTML = str;
                document.getElementById('append_parent').appendChild(menu);
            }
            showMenu({'ctrlid': hlid + '_ctrl', 'evt': 'click', 'showid': showid});
        };
        w.today = new Date();

        $dialog.find('form').submit(function (e) {
            e.preventDefault();
            $dialog.find('#ratesubmit').click();
        }).end().find('#ratesubmit').click(function (e) {
            e.preventDefault();
            if (!$('input[name="moderate[]"]:checked').length) {
                alert('请选择要评分的帖子');
                return;
            }
            batchRating($dialog);
        });

        $.each(DefValueConfig, function (key, value) {
            if (key.indexOf('highlight_color') > -1) {
                $dialog.find(key).val(value)
                    .end().find('#highlight_color_ctrl').css('background-color', highlightColorOptions[value]);
            }
            else if (typeof value === 'boolean') {
                if (value) $dialog.find(key).click();
            }
            else {
                $dialog.find(key).val(value);
            }
        });

        $dialog.css('top', $(window).height() / 2 - $dialog.height() / 2)
            .css('left', $(window).width() / 2 - $dialog.width() / 2);
    };

    /**
     * 批量评分
     * @param {jQuery} $dialog 评分对话框的jQuery对象
     */
    var batchRating = function ($dialog) {
        var tidList = [], pidList = {};
        $('input[name="moderate[]"]:checked').each(function () {
            tidList.push($(this).val());
        });
        var rateData = $dialog.find('#rateform').serialize();
        var modeRateData = $dialog.find('#moderateform').serialize();
        var reason = $.trim($dialog.find('#reason').val());
        if (reason) {
            rateData += '&reason=' + getLocaleEncodeString(reason);
        }
        if ($dialog.find('#sendreasonpm').prop('checked')) {
            rateData += '&sendreasonpm=on';
        }
        modeRateData += '&moderate%5B%5D={0}'.replace('{0}', tidList[0]);
        if ($dialog.find('input[name="operations[]"][value="highlight"]').prop('checked')) {
            w.pd_modeRateData = modeRateData;
        }

        $dialog.remove();
        var $msg = showMsg('正在获取各帖子的pid,请稍后...<strong>剩余数量:<em id="pd_count">{0}</em></strong>'.replace('{0}', tidList.length), true);
        var count = 0;
        var itvFuncList = [];
        $.each(tidList, function (index, tid) {
            var itvFunc = window.setTimeout(function () {
                $.ajax({
                    type: 'GET',
                    url: 'forum.php?mod=viewthread&tid=' + tid,
                    timeout: Config.ajaxTimeout,
                    success: function (html) {
                        var matches = /<table id="pid(\d+)"/.exec(html);
                        if (matches) pidList[tid] = parseInt(matches[1]);
                    },
                    error: function () {
                        //pidList[tid] = 0;
                    },
                    complete: function () {
                        count++;
                        var $count = $('#pd_count');
                        $count.text(tidList.length - count);
                        var isStop = $count.closest('#fwin_dialog').data('stop');

                        if (isStop) {
                            hideMsg($msg);
                            $.each(itvFuncList, function (i, itvFunc) {
                                if (itvFunc) window.clearTimeout(itvFunc);
                            });
                        }
                        else if (count >= tidList.length) {
                            hideMsg($msg);
                            rating(tidList, pidList, rateData);
                        }
                    }
                });
            }, index * Config.ajaxInterval);
            itvFuncList.push(itvFunc);
        });
    };

    /**
     * 评分
     * @param {number[]} tidList 帖子ID列表
     * @param {{}} pidList 帖子顶楼的pid列表
     * @param {string} rateData 提交评分的数据
     */
    var rating = function (tidList, pidList, rateData) {
        var $msg = showMsg('正在进行评分,请稍后...<strong>剩余数量:<em id="pd_count">{0}</em></strong>'.replace('{0}', tidList.length));
        var successNum = 0, failNum = 0;
        var failList = [];
        $.each(tidList, function (index, tid) {
            window.setTimeout(function () {
                var pid = pidList[tid] ? pidList[tid] : 0;
                $.ajax({
                    type: 'POST',
                    url: 'forum.php?mod=misc&action=rate&ratesubmit=yes&infloat=yes&inajax=1',
                    data: rateData + '&tid={0}&pid={1}'.replace('{0}', tid).replace('{1}', pid),
                    timeout: Config.ajaxTimeout,
                    success: function (xml) {
                        var msg = xml.documentElement ? xml.documentElement.textContent : '';
                        showFormatLog('评分', msg);
                        if (/succeedhandle_rate\(/i.test(msg)) {
                            successNum++;
                        }
                        else if (/errorhandle_rate\(/i.test(msg)) {
                            failNum++;
                            var matches = /errorhandle_rate\('([^']*)'/i.exec(msg);
                            failList.push({tid: tid, pid: pid, failMsg: matches ? matches[1] : '未知的回应'});
                        }
                        else {
                            failNum++;
                            failList.push({tid: tid, pid: pid, failMsg: '未知的回应'});
                        }
                    },
                    error: function () {
                        failNum++;
                        failList.push({tid: tid, pid: pid, failMsg: '连接超时'});
                    },
                    complete: function () {
                        $('#pd_count').text(tidList.length - successNum - failNum);

                        if (successNum + failNum >= tidList.length) {
                            hideMsg($msg);
                            showRatingResultDialog(successNum, failNum, failList);
                            if (w.pd_modeRateData) highlightThread(tidList, w.pd_modeRateData);
                        }
                    }
                });
            }, index * Config.ajaxInterval);
        });
    };

    /**
     * 显示一键评分结果的对话框
     * @param {number} successNum 评分成功数量
     * @param {number} failNum 评分失败数量
     * @param {[]} failList 评分失败列表
     */
    var showRatingResultDialog = function (successNum, failNum, failList) {
        var $dialog = $(
            '<div style="position: fixed; z-index: 201;" class="fwinmask" id="fwin_rate">' +
            '  <table class="fwin" cellpadding="0" cellspacing="0">' +
            '    <tbody>' +
            '    <tr>' +
            '      <td class="t_l"></td>' +
            '      <td class="t_c" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)"></td>' +
            '      <td class="t_r"></td>' +
            '    </tr>' +
            '    <tr>' +
            '      <td class="m_l" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)">&nbsp;&nbsp;</td>' +
            '      <td fwin="rate" style="" class="m_c" id="fwin_content_rate">' +
            '        <div fwin="rate" class="tm_c" id="floatlayout_topicadmin">' +
            '          <h3 id="fctrl_rate" class="flb">' +
            ('            <em fwin="rate" id="return_rate" style="{0}">评分结果 (共有<span class="pd_select_thread_num">{1}</span>个帖子评分成功,' +
            '共有<span class="pd_select_thread_num pd_fail_num">{2}</span>个帖子评分失败<i style="font-style: normal;" id="pd_highlight_thread_result"></i>)</em>')
                .replace('{0}', w.pd_modeRateData ? 'min-width:540px' : '')
                .replace('{1}', successNum)
                .replace('{2}', failNum) +
            '            <span><a href="javascript:;" class="flbc" title="关闭">关闭</a></span>' +
            '          </h3>' +
            '          <div class="pd_dialog_main" id="pd_rating_result" style="display: none;"></div>' +
            '        </div>' +
            '      </td>' +
            '      <td class="m_r" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)"></td></tr>' +
            '    <tr>' +
            '      <td class="b_l"></td>' +
            '      <td class="b_c" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)"></td>' +
            '      <td class="b_r"></td>' +
            '    </tr>' +
            '    </tbody>' +
            '  </table>' +
            '</div>'
        ).appendTo('#append_parent');

        var result = '';
        $.each(failList, function (index, obj) {
            var $node = $('input[name="moderate[]"][value="{0}"]'.replace('{0}', obj.tid));
            if (!$node.length) return;
            var $link = $node.parent('td').next().find('span > a.xst');
            if (!$link.length) return;
            result += '<li><a target="_blank" href="{0}" title="《{1}》by:{2}">{1}</a> <em title="失败原因:{3}"><b>失败原因:</b>{3}</em></li>'
                .replace('{0}', $link.attr('href'))
                .replace(/\{1\}/g, $link.text())
                .replace('{2}', $node.parent('td').next().next('td').find('cite > a').text())
                .replace(/\{3\}/g, obj.failMsg);
        });
        if (result) {
            $dialog.find('#pd_rating_result').html('<h4>评分失败项目:</h4><ol>' + result + '</ol>').css('display', 'block');
        }

        $dialog.find('.flbc').click(function () {
            $dialog.remove();
            if (Config.refreshPageAfterCloseRatingResultDialogEnabled) location.reload();
        });

        $dialog.css('top', $(window).height() / 2 - $dialog.height() / 2)
            .css('left', $(window).width() / 2 - $dialog.width() / 2);
    };

    /**
     * 高亮帖子
     * @param {number[]} tidList 帖子ID列表
     * @param {string} modeRateData 提交高亮帖子的数据
     */
    var highlightThread = function (tidList, modeRateData) {
        var $msg = showMsg('正在高亮帖子,请稍后...');
        $.each(tidList, function (i, tid) {
            modeRateData += '&moderate%5B%5D=' + tid;
        });
        var isSuccess = false;
        var failReason = '';
        $.ajax({
            type: 'POST',
            url: 'forum.php?mod=topicadmin&action=moderate&optgroup=1&modsubmit=yes&infloat=yes&inajax=1',
            data: modeRateData,
            timeout: Config.ajaxTimeout,
            success: function (xml) {
                var msg = xml.documentElement ? xml.documentElement.textContent : '';
                showFormatLog('高亮帖子', msg);
                if (/succeedhandle_mods\(/i.test(msg)) {
                    isSuccess = true;
                }
                else if (/errorhandle_mods\(/i.test(msg)) {
                    var matches = /errorhandle_mods\('([^']*)'/i.exec(msg);
                    failReason = matches ? matches[1] : '未知的回应';
                }
                else {
                    failReason = '未知的回应';
                }
            },
            error: function () {
                failReason = '连接超时';
            },
            complete: function () {
                hideMsg($msg);
                if (isSuccess) {
                    $('#pd_highlight_thread_result').html(',共有<span class="pd_select_thread_num">{0}</span>个帖子高亮成功'.replace('{0}', tidList.length));
                }
                else {
                    $('#pd_highlight_thread_result')
                        .html(',共有<span class="pd_select_thread_num pd_fail_num">{0}</span>个帖子高亮失败'.replace('{0}', tidList.length))
                        .attr('title', '原因:' + failReason)
                        .css('cursor', 'help');
                }
            }
        });
        w.pd_modeRateData = null;
    };

    /**
     * 初始化
     */
    var init = function () {
        if (!$('input[name="moderate[]"]').length) return;

        var hashMatches = /formhash=(\w+)/i.exec($('#toptb a[href*="formhash="]').attr('href'));
        if (hashMatches) formHash = hashMatches[1];
        else return;

        userName = $('#toptb a[href*="home.php?mod=space&uid="]').text();
        if (!userName) return;

        appendCss();
        addRatingBtns();
        console.log('【天使动漫一键评分】加载完毕');
    };

    init();
}(jQuery));