Greasy Fork is available in English.

hi-pda tools

屏蔽用户、名单同步;标识新帖;好孩子也看的见;

// ==UserScript==
// @name           hi-pda tools
// @namespace      hi-pda-tools-by-2200
// @description    屏蔽用户、名单同步;标识新帖;好孩子也看的见;
// @include        http*://*.hi-pda.com/forum/*
// @grant          GM_addStyle
// @license        MIT
// @version        5.2.3
// ==/UserScript==
// Version 5.2.3-by-Achilles
// 修改介绍和Changelog
// Version 5.2.2-by-Achilles
// 添加license
// Version 5.2.1-by-Achilles
// 修复了https失效的问题
// 兼容TamperMonkey
// Version 5.2
// 修正各种chrome不兼容的函数
// 因SAE挂掉,去除了同步功能
// Version 5.1 TODO
//  宽窄可选
//  opera支持
//  投票icon
//  枫叶版chrome兼容
//  点击显示图片
//  屏蔽用户hover改为帖子触发
//  预取几页可选
//  高亮自己的贴
// Version 5.0
// Date 2011-12-18
//  增加同步功能
// Version 4.0
// Date 2011-12-06
//  论坛改版
// Version 3.0
// Date 2011-7-13
//  增加自动更新
// Version 2.2
// Date 2011-7-13
//  修正zhuyi增加【只讨论2.0】板块后预读页面错误
//  高亮功能修改为可选,颜色自定义
//  屏蔽用户功能修改为分版面可选
// Version 2.1
// Date 2011-4-3
//  修正Chrome错误
//  脚本仅针对D版有效
// Version 2.0
// Date 2010-2-9

// @require        http://userscript-updater-generator.appspot.com/?id=106358
// Chrome浏览器不支GM_GetValue/GM_SetValue/GM_addStyle/GM_xmlhttpRequest
try{
  if (!this.GM_getValue || this.GM_getValue.toString().indexOf("not supported")>-1) {
      this.GM_getValue=function (key,def) {
          return localStorage[key] || def;
      };
      this.GM_setValue=function (key,value) {
          return localStorage[key]=value;
      };
  } 
  if (!this.GM_addStyle || this.GM_addStyle.toString().indexOf("not supported")>-1){ 
      this.GM_addStyle = function(css) {
      var head = document.getElementsByTagName('head')[0], style = document.createElement('style');
        if (!head) {return}
        style.type = 'text/css';
        try {style.innerHTML = css} catch(x) {style.innerText = css}
        head.appendChild(style);
      }
  }
  if ( !this.GM_xmlhttpRequest || this.GM_xmlhttpRequest.toString().indexOf("not supported")>-1 ) {
      this.GM_xmlhttpRequest = 
      function (details) {
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.onreadystatechange = function() {
              var responseState = {
                  responseXML:(xmlhttp.readyState==4 ? xmlhttp.responseXML : ''),
                  responseText:(xmlhttp.readyState==4 ? xmlhttp.responseText : ''),
                  readyState:xmlhttp.readyState,
                  responseHeaders:(xmlhttp.readyState==4 ? xmlhttp.getAllResponseHeaders() : ''),
                  status:(xmlhttp.readyState==4 ? xmlhttp.status : 0),
                  statusText:(xmlhttp.readyState==4 ? xmlhttp.statusText : '')
              }
              if (details["onreadystatechange"]) {
                  details["onreadystatechange"](responseState);
              }
              if (xmlhttp.readyState==4) {
                  if (details["onload"] && xmlhttp.status>=200 && xmlhttp.status<300) {
                      details["onload"](responseState);
                  }
                  if (details["onerror"] && (xmlhttp.status<200 || xmlhttp.status>=300)) {
                      details["onerror"](responseState);
                  }
              }
          }
          try {
            //cannot do cross domain
            xmlhttp.open(details.method, details.url);
          } catch(e) {
            if( details["onerror"] ) {
              //simulate a real error
              details["onerror"]({responseXML:'',responseText:'',readyState:4,responseHeaders:'',status:403,statusText:'Forbidden'});
            }
            return;
          }
          if (details.headers) {
              for (var prop in details.headers) {
                  xmlhttp.setRequestHeader(prop, details.headers[prop]);
              }
          }
          xmlhttp.send((typeof(details.data)!='undefined')?details.data:null);
      }
  }
}
catch(e){}

var _pc = 1;        // 当前页面的page值
var _fid;           // 当前版面fid
var _uid;           // 当前登录用户uid
var _tid= 0;        // 当前帖子的tid
var _pxt;           // 当前页面上“最后回复时间”的最大值
var _pmt;           // 当前页面上“最后回复时间”的最小值
var _lvt;           // 上次访问时间,页面关闭时,_pxt 存储为 _lvt
var _today;         // 与发帖日期比较,超过30天的发帖人单元格显示灰色
var _first_time_use;
var _max_read_pages  = 5;     // 不能读取更多啦,太多了容易死机
var _hightlight_en;           // 启用高亮功能
var _hightlight_color;        // 高亮颜色自定义
var _blacklist_en_hpd;        // 启用D版的黑名单功能
var _blacklist_en_other;      // 启用其他版的黑名单功能
var _simple_style;            // 启用精简风格
var _hover_style;             // 启用悬停风格
var _reply_avatar;            // 回复位置是否显示自己的头像
var _font_size;               // 论坛字体大小
var blacklistArray;           // 黑名单
var blacklistLen;             // 黑名单长度
var blacklistStr;
var serverBlacklist;          // 同步冲突时服务器端的列表
var serverListStr;
var serverVersion;
var newBlacklist              // 同步冲突时的新列表
var _syn_pending;             // 正在同步
var _syn_lastversion;
var _syn_modified;
var _att_max_width;           // 帖子附件图片最大宽度

var grave_image;              // 坟贴背景图片
// var _old_post_bgcolor  = "#E1E1E1";
var _old_post_bgcolor  = "#e9e9e9";
var _today_post_color  = "#FF0000";
var now = new Date();  
var year = now.getYear()+1900;
var month = now.getMonth()+1;
var day = now.getDate();
var hour = now.getHours();
var min = now.getMinutes();
var _bFORUMDISPLAY = location.href.indexOf('hi-pda.com/forum/forumdisplay.php?');
var _bVIEWTHREAD   = location.href.indexOf('hi-pda.com/forum/viewthread.php?');

// 工具函数
var JSON;
if (!JSON) {JSON = {};}
(function () {
    'use strict';
    function f(n) {return n < 10 ? '0' + n : n;}

    if (typeof Date.prototype.toJSON !== 'function') {

        Date.prototype.toJSON = function (key) {

            return isFinite(this.valueOf()) ?
                this.getUTCFullYear() + '-' +
                f(this.getUTCMonth() + 1) + '-' +
                f(this.getUTCDate()) + 'T' +
                f(this.getUTCHours()) + ':' +
                f(this.getUTCMinutes()) + ':' +
                f(this.getUTCSeconds()) + 'Z' : null;
        };

        String.prototype.toJSON =
            Number.prototype.toJSON =
            Boolean.prototype.toJSON = function (key) {
                return this.valueOf();
            };
    }

    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        gap,
        indent,
        meta = { // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        rep;


    function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

        escapable.lastIndex = 0;
        return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
            var c = meta[a];
            return typeof c === 'string' ? c :
                '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
        }) + '"' : '"' + string + '"';
    }


    function str(key, holder) {

// Produce a string from holder[key].

        var i, // The loop counter.
            k, // The member key.
            v, // The member value.
            length,
            mind = gap,
            partial,
            value = holder[key];

// If the value has a toJSON method, call it to obtain a replacement value.

        if (value && typeof value === 'object' &&
                typeof value.toJSON === 'function') {
            value = value.toJSON(key);
        }

// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.

        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }

// What happens next depends on the value's type.

        switch (typeof value) {
        case 'string':
            return quote(value);

        case 'number':

// JSON numbers must be finite. Encode non-finite numbers as null.

            return isFinite(value) ? String(value) : 'null';

        case 'boolean':
        case 'null':

// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce 'null'. The case is included here in
// the remote chance that this gets fixed someday.

            return String(value);

// If the type is 'object', we might be dealing with an object or an array or
// null.

        case 'object':

// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.

            if (!value) {
                return 'null';
            }

// Make an array to hold the partial results of stringifying this object value.

            gap += indent;
            partial = [];

// Is the value an array?

            if (Object.prototype.toString.apply(value) === '[object Array]') {

// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.

                length = value.length;
                for (i = 0; i < length; i += 1) {
                    partial[i] = str(i, value) || 'null';
                }

// Join all of the elements together, separated with commas, and wrap them in
// brackets.

                v = partial.length === 0 ? '[]' : gap ?
                    '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
                    '[' + partial.join(',') + ']';
                gap = mind;
                return v;
            }

// If the replacer is an array, use it to select the members to be stringified.

            if (rep && typeof rep === 'object') {
                length = rep.length;
                for (i = 0; i < length; i += 1) {
                    k = rep[i];
                    if (typeof k === 'string') {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            } else {

// Otherwise, iterate through all of the keys in the object.

                for (k in value) {
                    if (Object.prototype.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            }

// Join all of the member texts together, separated with commas,
// and wrap them in braces.

            v = partial.length === 0 ? '{}' : gap ?
                '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
                '{' + partial.join(',') + '}';
            gap = mind;
            return v;
        }
    }

// If the JSON object does not yet have a stringify method, give it one.

    if (typeof JSON.stringify !== 'function') {
        JSON.stringify = function (value, replacer, space) {

// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.

            var i;
            gap = '';
            indent = '';

// If the space parameter is a number, make an indent string containing that
// many spaces.

            if (typeof space === 'number') {
                for (i = 0; i < space; i += 1) {
                    indent += ' ';
                }

// If the space parameter is a string, it will be used as the indent string.

            } else if (typeof space === 'string') {
                indent = space;
            }

// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.

            rep = replacer;
            if (replacer && typeof replacer !== 'function' &&
                    (typeof replacer !== 'object' ||
                    typeof replacer.length !== 'number')) {
                throw new Error('JSON.stringify');
            }

// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.

            return str('', {'': value});
        };
    }


// If the JSON object does not yet have a parse method, give it one.

    if (typeof JSON.parse !== 'function') {
        JSON.parse = function (text, reviver) {

// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.

            var j;

            function walk(holder, key) {

// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.

                var k, v, value = holder[key];
                if (value && typeof value === 'object') {
                    for (k in value) {
                        if (Object.prototype.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value);
            }


// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.

            text = String(text);
            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function (a) {
                    return '\\u' +
                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                });
            }

// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.

// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.

            if (/^[\],:{}\s]*$/
                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

                j = eval('(' + text + ')');

// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.

                return typeof reviver === 'function' ?
                    walk({'': j}, '') : j;
            }

// If the text is not JSON parseable, then a SyntaxError is thrown.

            throw new SyntaxError('JSON.parse');
        };
    }

// Augment the basic prototypes if they have not already been augmented.
// These forms are obsolete. It is recommended that JSON.stringify and
// JSON.parse be used instead.

    if (!Object.prototype.toJSONString) {
        Object.prototype.toJSONString = function (filter) {
            return JSON.stringify(this, filter);
        };
        Object.prototype.parseJSON = function (filter) {
            return JSON.parse(this, filter);
        };
    }
}());
function $(select){
    var name = select.substring(1);
    switch(select.charAt(0)){
        case '#':
            return document.getElementById(name);
        case '.':
            return document.getElementsByClassName(name);
        case '/':
            return document.getElementsByTagName(name);
        default:
            return document.getElementsByName(select);
    }
};
function getNowTimeStamp(){    // 当前时刻 yyyy-m-d h:m:s
  var nowtime = new Date(); 
  var timestamp =(nowtime.getYear()+1900)+'-'+(nowtime.getMonth()+1)+'-'+nowtime.getDate()+' '+checkTime(nowtime.getHours())+':'+checkTime(nowtime.getMinutes())+':'+checkTime(nowtime.getSeconds());
  return timestamp;
}
function timeDiff(date1,date2){// 比较日期大小,年,月,日,小时,分钟
  var re=/^(\d{4})\S(\d{1,2})\S(\d{1,2})\s(\d{1,2})\S(\d{1,2})$/;  
  var dt1,dt2;  
  if (re.test(date1)) dt1=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3,RegExp.$4,RegExp.$5);  
  if (re.test(date2)) dt2=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3,RegExp.$4,RegExp.$5); 
  else dt2=new Date();
  return dt1>=dt2;
}
function dateDiff(date1,date2){// 比较日期大小,年月日
  var re=/^(\d{4})\S(\d{1,2})\S(\d{1,2})$/;  
  var dt1,dt2;  
  if (re.test(date1)) dt1=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3);  
  if (re.test(date2)) dt2=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3);  
  return Math.floor((dt2-dt1)/(1000*60*60*24))
}
function checkTime(i){         // 一位数的时间前加0
  if (i<10) 
    {i="0" + i}
    return i
}
function getKeys(e){           // keycode 转换
    var codetable={'96':'Numpad 0','97':'Numpad 1','98':'Numpad 2','99':'Numpad 3','100':'Numpad 4','101':'Numpad 5','102':'Numpad 6','103':'Numpad 7','104':'Numpad 8','105':'Numpad 9','106':'Numpad *','107':'Numpad +','108':'Numpad Enter','109':'Numpad -','110':'Numpad .','111':'Numpad /','112':'F1','113':'F2','114':'F3','115':'F4','116':'F5','117':'F6','118':'F7','119':'F8','120':'F9','121':'F10','122':'F11','123':'F12','8':'BackSpace','9':'Tab','12':'Clear','13':'Enter','16':'Shift','17':'Ctrl','18':'Alt','20':'Cape Lock','27':'Esc','32':'Spacebar','33':'Page Up','34':'Page Down','35':'End','36':'Home','37':'←','38':'↑','39':'→','40':'↓','45':'Insert','46':'Delete','144':'Num Lock','186':';:','187':'=+','188':',<','189':'-_','190':'.>','191':'/?','192':'`~','219':'[{','220':'\|','221':']}','222':'"'};
    var Keys = '';
    e.shiftKey && (e.keyCode != 16) && (Keys += 'shift+');
    e.ctrlKey && (e.keyCode != 17) && (Keys += 'ctrl+');
    e.altKey && (e.keyCode != 18) && (Keys += 'alt+');
    return Keys + (codetable[e.keyCode] || String.fromCharCode(e.keyCode) || '');
};
function addHotKey(codes,func){// 监视并执行快捷键对应的函数
    document.addEventListener('keydown', function(e){
        if ((e.target.tagName != 'INPUT') && (e.target.tagName != 'TEXTAREA') && getKeys(e) == codes){
            func();
            e.preventDefault();
            e.stopPropagation();
        }
    }, false);
};
// 触发函数
function onToggleBlackList(e){// 黑名单[名字]触发
    var v = e.target.value;
    var bShow = e.target.checked;
    if(_bVIEWTHREAD>0){
        var s = document.evaluate("//div[@class='postinfo']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        for (var i = s.snapshotLength - 1; i >= 0; i--) {
            var t = s.snapshotItem(i);
            var a = t.getElementsByTagName('a')[0];
            if( a != undefined){
                var u = a.href.substring(a.href.indexOf('uid')+4);
                if((u+'='+a.text) == v)t.parentNode.parentNode.parentNode.parentNode.style.display = bShow?'none':'';
            }
        }
    }
    if(_bFORUMDISPLAY>0){
        var s = document.evaluate("//td[@class='f_author']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        for (var i = s.snapshotLength - 1; i >= 0; i--) { // 屏蔽BLACK_LIST的发帖
            var t = s.snapshotItem(i);
            var a = t.getElementsByTagName('a')[0];
            if( a != undefined){
                var n = a.text;
                var u = a.href.substring(a.href.indexOf('uid')+4);
                if((u+'='+a.text) == v)t.parentNode.style.display = bShow?'none':'';
            }
        }
    }
};
function onBlockUser(e){      // [屏蔽] 按钮触发
    var a = e.target.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('postinfo')[0].getElementsByTagName('a')[0];
    var nm= a.text;
    var id= a.href.substring(a.href.indexOf('uid')+4);
    if(blacklistStr.indexOf(id+'='+nm)<0){//检查有没有重复的
      blacklistArray.push(id+'='+nm);
      blacklistStr = blacklistArray.toString();
      GM_setValue('HiPDA_Discovery_BLACK_LIST',blacklistArray.join());
      blacklistLen=blacklistArray.length;
    }
    _syn_modified = true;
    GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
    // 重新激活同步按钮
    document.getElementById('s_syn').className="enable";
    document.getElementById('s_syn').innerHTML="₪ 同步";
    document.getElementById('s_syn').style.background='#eef9eb';
    document.getElementById('s_syn').style.color='#000';
    refreshConfigDiv();
    processBlackList();
};
function onWindowResize(){    // 调整body宽度
  // alert('resize');
  if(_simple_style){
    if(window.innerWidth>1600)
      GM_addStyle("body {width:65%;}"); 
    else if(window.innerWidth>1400)
      GM_addStyle("body {width:75%;}"); 
    else if(window.innerWidth>1200)
      GM_addStyle("body {width:85%;}");
    else
      GM_addStyle("body {width:980px;}");
  }
}
function onAttachImageLoaded(){  // 附件图片加载完成后修改宽度
  var newimg = new Image();
  newimg.src =this.src;
  if(newimg.width<=_att_max_width ){
    this.width=newimg.width;
    //去除zoom
    this.removeAttribute('onclick');
    this.className="nozoom";
  }
  else
    this.width=_att_max_width;
}
function onLoadNewPage(req){  // 后台读取页面完毕
  try {
    if (req.status == 200) {
      var newPageHTML = req.responseText.substring(req.responseText.indexOf('<table summary="forum_'),req.responseText.indexOf('</form>'));
      var newPageThread= newPageHTML.substring(newPageHTML.indexOf('<tbody id="normalthread_'),newPageHTML.indexOf('</table>'));
      var threadList = document.getElementsByName("moderate")[0].getElementsByClassName("datatable")[0];
      // 增加预取了页面的提示
      // var newpagetip="<tbody><tr><td class='folder'></td><td><center>---------- 第"+_pc+"页 ----------</center></td><th class='subject'>&nbsp</th><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody>";
      var newpagetip="<tbody><tr><td colspan=5><center>---------- 第"+_pc+"页 ----------</center></td></tr></tbody>";
      threadList.innerHTML = threadList.innerHTML + newpagetip + newPageThread;
      
      // 去除预取页面对应的选择导航按钮
      var pagenav=document.evaluate("//div[@class='pages']//a", 
      document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
      for(var btncnt=pagenav.snapshotLength-1;btncnt>=0;btncnt--){
        var btn=pagenav.snapshotItem(btncnt);
        if(btn.text == _pc)btn.parentNode.removeChild(btn);
      }
    }
  } catch (e) {}
  refreshMinTime();
  _max_read_pages--;
  if( _max_read_pages && (timeDiff(_pmt,_lvt))){
    _pc++;
    GM_xmlhttpRequest({
        method: 'GET',
        url: 'http://'+document.domain+'/forum/forumdisplay.php?fid='+_fid+'&page='+_pc,
        onload: onLoadNewPage,
        overrideMimeType: "text/html; charset=gbk"
    });
  }
  processHighlightColor();
  processBlackList();
}
function onSynReply(req){     // 同步时,服务器返回结果
  document.getElementById('s_syn').className="disabled";
  // try {
    _syn_pending=false;
    if (req.status == 200) {  // 200 OK
      var response=JSON.parse(req.responseText);
      // alert(response.list); // 输出中文,不乱码
      //  response.result
      //          .version
      //          .list 
      var nowtimestamp=getNowTimeStamp();
      switch(response.result){
        case "0": // 无更新
          document.getElementById('s_syn').style.background='#88ff88';
          document.getElementById('s_syn').innerHTML="√ 无更新";
          GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
          break;
        case "1": // OK,本地覆盖了服务器,返回新的版本号
          _syn_lastversion = response.version;
          _syn_modified = false;
          GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion);
          GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
          document.getElementById('s_syn').style.background='#88ff88';
          document.getElementById('s_syn').innerHTML="√ 已同步";
          GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
          break;
        case "2": // 服务器有更高版本覆盖本地列表
          var newblacklistArray = new Array();
          if( response.list )
            newblacklistArray = response.list.split(",");
          GM_setValue("HiPDA_Discovery_BLACK_LIST",newblacklistArray.join());
          _syn_lastversion = response.version;
          GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion);
          _syn_modified = false;
          GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
          document.getElementById('s_syn').style.background='#88ff88';
          document.getElementById('s_syn').innerHTML="√ 已更新";
          GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
          break;
        case "3": // 冲突 TODO
          serverBlacklist = new Array();
          if( response.list )
            serverBlacklist = response.list.split(",");
          serverListStr = serverBlacklist.join();
          document.getElementById('s_syn').addEventListener('click', processConflict, false);
          serverVersion = response.version;
          _syn_pending = true;
          processConflict();          
          document.getElementById('s_syn').style.background='#f00';
          document.getElementById('s_syn').style.color='#fff';
          document.getElementById('s_syn').innerHTML="! 有冲突";
          document.getElementById('s_syn').title="版本有冲突";
          break;
        case "4": // 参数错误
          document.getElementById('s_syn').style.background='#f00';
          document.getElementById('s_syn').style.color='#fff';
          document.getElementById('s_syn').innerHTML="X 参数错误";
          document.getElementById('s_syn').title=response.list;
          break;
        case "5": // 频繁刷新
          document.getElementById('s_syn').style.background='#f00';
          document.getElementById('s_syn').style.color='#fff';
          document.getElementById('s_syn').innerHTML="服务器忙";
          document.getElementById('s_syn').title="限定10s一次";
          break;
        case "500": // 服务器错误
          document.getElementById('s_syn').style.background='#f00';
          document.getElementById('s_syn').style.color='#fff';
          document.getElementById('s_syn').innerHTML="服务器错误";
          break;
        default:
          document.getElementById('s_syn').innerHTML="! 未知错误";
      }
      refreshConfigDiv();
    }
    else {                    // 500,404,443,...
      document.getElementById('s_syn').style.background='#f00';
      document.getElementById('s_syn').style.color='#fff';
      document.getElementById('s_syn').innerHTML="X 网络错误";
    }
  // }
  // catch (e) {
    // document.getElementById('s_syn').style.background='#f00';
    // document.getElementById('s_syn').style.color='#fff';
    // document.getElementById('s_syn').innerHTML="! 格式错误";
  // }
}
function onSynChooseBtn(choose){ // 同步冲突界面选择按钮
  var nowtimestamp=getNowTimeStamp();
  switch (choose){
    case 0: // 使用 新列表
      // 把配置界面显示出来,等待服务器回应
      document.getElementById('hp_cfg_div').style.display = "";
      document.getElementById('s_syn').style.background='#999';
      document.getElementById('s_syn').innerHTML="同步中...";
      // _syn_pending=false;
      
      // 获取新列表
      var r = document.getElementsByClassName('hpdtool_syn_chk_new');
      for (var i = r.length-1; i >= 0; i--)
        if(r[i].checked)
          newBlacklist.push(r[i].value);
      // 存储新列表,服务器的版本号,标志已修改
      GM_setValue("HiPDA_Discovery_BLACK_LIST",newBlacklist.join());
      _syn_lastversion = serverVersion;
      GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion);
      _syn_modified = true;
      GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
      GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
      document.getElementById('s_syn').removeEventListener('click', processConflict, false);
      // 向服务器发起请求
      var data={
        "uid":_uid,
        "lastversion":_syn_lastversion,
        "modified":_syn_modified,
        "action":"update",
        "blacklist":newBlacklist
      };
      GM_xmlhttpRequest({
        method: 'GET',
        url: 'http://hipdatool.sinaapp.com/sync.php?data='+JSON.stringify(data),
        onload: onSynReply,
        overrideMimeType: "text/html; charset=gbk"
      });
      break;
    case 1: // 使用 服务器
      GM_setValue("HiPDA_Discovery_BLACK_LIST",serverBlacklist.join());
      _syn_lastversion = serverVersion;
      GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion);
      _syn_modified = false;
      GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
      document.getElementById('s_syn').style.background='#88ff88';
      document.getElementById('s_syn').innerHTML="√ 已更新";
      GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
      refreshConfigDiv();
      document.getElementById('hp_cfg_div').style.display = "";
      document.getElementById('s_syn').removeEventListener('click', processConflict, false);
      _syn_pending=false;
      break;
    case 2: // 使用 本地
      // 把配置界面显示出来,等待服务器回应
      document.getElementById('hp_cfg_div').style.display = "";
      document.getElementById('s_syn').style.background='#999';
      document.getElementById('s_syn').innerHTML="同步中...";
      // _syn_pending=false;
      
      // 向服务器发起请求
      var data={
        "uid":_uid,
        "lastversion":_syn_lastversion,
        "modified":_syn_modified,
        "action":"update",
        "blacklist":blacklistArray
      };
      GM_xmlhttpRequest({
        method: 'GET',
        url: 'http://hipdatool.sinaapp.com/sync.php?data='+JSON.stringify(data),
        onload: onSynReply,
        overrideMimeType: "text/html; charset=gbk"
      });
      document.getElementById('s_syn').removeEventListener('click', processConflict, false);
      break;
    default:
      _syn_pending=false;
  }
  document.getElementById('hpdtool_syn_list').innerHTML="";
  document.getElementById('hpdtool_syn_div').style.display = 'none';
}
function onClickSynBtn(){     // 点击同步按钮
  if(_syn_pending)return;
  if(_uid == 0) return;
  if(document.getElementById('s_syn').className=="disabled")return;
  _syn_pending=true;
  document.getElementById('s_syn').style.background='#999';
  document.getElementById('s_syn').innerHTML="同步中...";
  var data={
    "uid":_uid,
    "lastversion":_syn_lastversion,
    "modified":_syn_modified,
    "action":"sync",
    "blacklist":blacklistArray
  };
  GM_xmlhttpRequest({
    method: 'GET',
    url: 'http://hipdatool.sinaapp.com/sync.php?data='+JSON.stringify(data),
    onload: onSynReply,
    overrideMimeType: "text/html; charset=gbk"
  });
}
function onPageUnload(){      // 关闭页面时保存参数
    _lvt = year + "-" + month + "-" + day + " " + hour + ":" + min;
    if((_pc == 1)&&(timeDiff(_lvt,_pxt)))
      GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,_lvt);
}
function onSaveConfig(save){  // [保存]、[取消]按钮触发,保存hpd-tool参数以及黑名单编辑结果
    if(save){
        var r = document.getElementsByClassName('bl_chk');
        blacklistArray = new Array();
        for (var i = r.length-1; i >= 0; i--)
          if(r[i].checked)
            blacklistArray.push(r[i].value);
        GM_setValue('HiPDA_Discovery_BLACK_LIST',blacklistArray.join());
        if(blacklistLen != blacklistArray.length){ // 列表长度变化,表示列表进行了修改
          _syn_modified = true;
          GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
          // 重新激活同步按钮
          document.getElementById('s_syn').className="enable";
          document.getElementById('s_syn').innerHTML="₪ 同步";
          document.getElementById('s_syn').style.background='#eef9eb';
          document.getElementById('s_syn').style.color='#000';
        }
        blacklistLen=blacklistArray.length;
        blacklistStr=blacklistArray.toString();
        
        var temp = document.getElementById('_chk_hightlight_color').value;
        if(RegExp("#[A-F,a-f,0-9]{6}").test(temp)){
          var t = temp.indexOf("#");
          _hightlight_color = temp.substr(t,7);
        }/*else alert('wrong color');
        alert(_hightlight_color);*/
        GM_setValue("HiPDA_Discovery_HIGHLIGHT_COLOR",_hightlight_color);

        var rd=document.getElementsByName('_radio_font_size');
        for(var i=0;i<rd.length;i++)
          if(rd[i].checked)_font_size = rd[i].value;
        GM_setValue("HiPDA_Discovery_FONT_SIZE",_font_size);
                
        // _hightlight_en = document.getElementById('_chk_hightlight_en').checked;
        // _blacklist_en_hpd = document.getElementById('_chk_blacklist_en_hpd').checked;
        // _blacklist_en_other = document.getElementById('_chk_blacklist_en_other').checked;
        // _simple_style = document.getElementById('_chk_simple_style').checked;
        // _hover_style = document.getElementById('_chk_hover_style').checked;         
        // _reply_avatar = document.getElementById('_chk_reply_avatar').checked;         
        _hightlight_en = document.getElementById('_chk_hightlight_en').checked;
        _blacklist_en_hpd = document.getElementById('_chk_blacklist_en_hpd').checked;
        _blacklist_en_other = document.getElementById('_chk_blacklist_en_other').checked;
        _simple_style = document.getElementById('_chk_simple_style').checked;
        _hover_style = document.getElementById('_chk_hover_style').checked;
        _reply_avatar = document.getElementById('_chk_reply_avatar').checked;
        GM_setValue("HiPDA_Discovery_HIGHLIGHT_ENABLE",_hightlight_en);
        GM_setValue("HiPDA_Discovery_BLACKLIST_ENABLE_HPD",_blacklist_en_hpd);
        GM_setValue("HiPDA_Discovery_BLACKLIST_ENABLE_OTHER",_blacklist_en_other);
        GM_setValue("HiPDA_Discovery_SIMPLE_STYLE",_simple_style);
        GM_setValue("HiPDA_Discovery_HOVER_STYLE",_hover_style);
        GM_setValue("HiPDA_Discovery_REPLY_AVATAR",_reply_avatar);
    }
    document.getElementById('hp_cfg_div').style.display = (document.getElementById('hp_cfg_div').style.display == 'none')?'':'none';
    changeFontSize(true);
    processBlackList();
};
// 论坛信息
function readPageURL(){       // 取得当前的tid和page值
    var offset = window.location.search.indexOf("page=");
    if(offset>0){
        var t = window.location.search.substr(offset);
        if(t.indexOf("&") >0){
            _pc = t.slice(5,t.indexOf("&"));
        }else{
            _pc = t.slice(5);
        }
    }else{
        _pc = 1;
    }
    offset = window.location.search.indexOf("tid=");
    if(offset>0){
        var t = window.location.search.substr(offset);
        if(t.indexOf("&") >0){
            _tid = t.slice(4,t.indexOf("&"));
        }else{
            _tid = t.slice(4);
        }
    }
}
function refreshMinTime(){    // 取得当前页面的 _pmt —— 包含预读取的后续页面内容
  var snapResults3 = document.evaluate("//td [@class='lastpost']", 
      document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  for (var i = snapResults3.snapshotLength - 1; i >= 0; i--){
    var e = snapResults3.snapshotItem(i);
    //如果是置顶帖子,就不要取时间值
    var checkTop = e.parentNode.getElementsByClassName('folder');
    if(checkTop[0] != undefined){
      if(checkTop[0].innerHTML.indexOf('images/default/pin')<0 && checkTop[0].innerHTML.indexOf('images/default/folder_lock')<0 ){
        var _rt = e.getElementsByTagName('a')[1].text;
        if(timeDiff(_pmt,_rt))
          _pmt = _rt;
      }
      //else alert(e.getElementsByTagName('a')[1].text);
    }
  }
}
// 论坛界面修改
function changeURL(){         // 把cnc页面上的连接都换成cnc.hi-pda.com
  var url = document.evaluate("//a", 
    document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  for(var i = url.snapshotLength-1;i>=0;i--){
    var a=url.snapshotItem(i);
    a.href=a.href.replace(/www.hi-pda.com/,document.domain);
  };
}
function changeFontSize(save){
  var sz=_font_size;
  if(save == false){          // 即时预览,未保存字体大小
    var rd=document.getElementsByName('_radio_font_size');
    for(var i=0;i<rd.length;i++){
      if(rd[i].checked == true)
        sz=rd[i].value;
    }
  }
  var fnt=".t_msgfont,.t_msgfont td,td,th,.subject,.lastpost,.author,.nums,#newspecialtmp,#newspecial,#postreplay,.signatures,#umenu,#nav,.pages_btns,.threadtype{font-size: "+sz+"px;}";
  GM_addStyle(fnt);
  fnt = ".postauthor dt {width:"+4*sz+"px} .mainbox td.postauthor{width:180px} .forumcontrol .modaction{width:150px;}";
  GM_addStyle(fnt);
}
function changeStyle(){       // 改变页面风格
  // 好孩子看不见
  GM_addStyle(".goodboysglasses {color:red;font-size:16;border:1px solid #ff0000;padding:15px 15px 15px 52px;width:75%;margin:20px 30px}");
  GM_addStyle(".goodboysglasses {background:url(data:img/png;base64,\
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
bWFnZVJlYWR5ccllPAAAAqJJREFUeNrsV09rE0EUf7s7k91tTENBQ6FYegoUJRX8AiJegt5UUKkJ\
JLd8A+9+gV5yS0KuirdC9SO0Fy8WwUuzh0hbYou20fyd9b1hdpumZbPohlzy4JHNZOb9fvN7895s\
NNd1YZamw4xtTmBOQEPn9Xr9AKthRdM0yOfzJo71poQXQ6wuVZ4Q4kOhUHhBCiwQ+IOHjyCdXoda\
rdalidMAp9iEQVi6rj/FMZsImMSI6Qasrt6GzMY9IJYRk5A7p9iEQViq/5j+GbBsE/b2duF7swmU\
CrR4hATiFJNiEwZheWeQ+QRME05OfkCxWMzi1+Oo9c/lcvfxI1WpVHYIyzNJgOTgOKh2fqAItCPE\
b6u4bcIgLO8K8BWIMcN7PFUepfWU8zGsCwJkg8EAqtXq0TTrnjBGzSfQ6XRhc/O1l4apGUlPWJcI\
EGir1UJ9BOgT8AWm7s9AgIs9zCNLQV1dB82yQNONYAJiCEa/76/1FUhiaSy+/YwJmsCg58Lpmwwc\
/TyDr/tf5ND6nbuweCsF+0tJmKQfHb3Mr/OrKTBNfIzbcCMWfD2ccwE2kt39+InaNpUsNa6dxy9f\
QSLE5SII1LauEmCM4em0wGTBIXpCAOcMhsOhV7LymcYS6nKZpAAbrwLKoU4EuIkeTCDmCjl3pGSl\
cdU6wxDgCvNyGWJQZliSgBbEfijk3HGjPSVCVoJx/fsAg9zGEnQGHGWOXev0G80Zax8XCjx7LlUI\
dJzDx/sANodDp9FY3squwVZ28g5wrlwz0lwOHcdZXnv/LpQCDcfx15PaScMw0uVyeZtzngoToN/v\
H5dKpSd4+L5JSf9jvabUu4m+otIYppLO0JvoLTX2z+u1kRQuUDsIeY6ol/6mzUS0foYvpfO/ZnMC\
sybwV4ABAEMXBDR9AlSHAAAAAElFTkSuQmCC) no-repeat 10px 5px");
  if(_simple_style){ // 启用了精简风格
    onWindowResize();
    GM_addStyle("\
      body {margin:0 auto;background:#f0f0f0;}\
      .postact {line-height:20px}\
      .postact a,body, td, input, textarea, select, button,.posterinfo em {color:#222222 !important;}\
      .postauthor em a {color:#222222}\
      .postactions {border-top:0px}\
      .postinfo {border-bottom:0px}\
      .authorinfo em {margin:0px}\
      .posterinfo {color:#ffffff}\
      .posterinfo:hover {color:#222222}\
      .posterinfo:hover a {color:#222222}\
      .posterinfo .pagecontrol {display:none}\
      .posterinfo:hover .pagecontrol {display:block}\
      .authorinfo a {color:#ffffff}\
      .authorinfo:hover a {color:#222222}\
      #header .wrap {padding:0}\
      #umenu a {margin:0 2px}\
      #umenu {position:static;float:right}\
      .threadad td.postauthor,.adcontent {background: #f0f0f0;}\
      .signatures {font-size: 13px;color:#222222;max-height:100px !important;}\
      #moderate .colplural,#moderate .icon,.datatable .icon,#forumheader {display:none}\
      #nav {color:#000000;text-indent:0px;background:none;margin-bottom:8px;}\
      #nav a,#footlink,#footlink a,#rightinfo,#rightinfo a{color:#000000}\
      .datatable .subject{padding:2px 5px;}\
      td,.subject{font:13px/1.4em;}\
    ");
  }
  changeFontSize();
  if(!_hover_style){ // 用户 注册、积分、发帖数 等显示在头像下方
    var s = document.evaluate("//td[@class='postauthor']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = s.snapshotLength - 1; i >= 0; i--) {
      var userdata=s.snapshotItem(i).getElementsByTagName('dl')[0];
      if(userdata != undefined){
        userdata.style.margin="0px 10px 0px 20px";
        // 去掉了一些项目
        userdata.removeChild(userdata.lastChild);
        userdata.removeChild(userdata.lastChild);
        var regtime1=userdata.lastChild;
        userdata.removeChild(userdata.lastChild);
        var regtime2=userdata.lastChild;
        userdata.removeChild(userdata.lastChild);
        userdata.removeChild(userdata.lastChild);
        userdata.removeChild(userdata.lastChild);
        userdata.appendChild(regtime2);
        userdata.appendChild(regtime1);
        s.snapshotItem(i).appendChild(userdata);
        // 去除头像悬停菜单
        var avatar=s.snapshotItem(i).getElementsByClassName('avatar')[0];
        avatar.removeAttribute('onmouseover');
      }
    }
    GM_addStyle(".postauthor dt,.postauthor dd {color:#222222;height:1.2em;line-height:1.2em;}");
  }
  if(!_reply_avatar && _bVIEWTHREAD>0 && document.getElementById('fastpostform') )document.getElementById('fastpostform').getElementsByClassName('avatar')[0].innerHTML="";
  // 【发表回复】、【发表新帖】
  if(document.getElementById('post_reply'))    document.getElementById('post_reply').getElementsByTagName('a')[0].innerHTML="发表回复";
  if(document.getElementById('newspecial'))    document.getElementById('newspecial').innerHTML="发表新帖";
  if(document.getElementById('newspecialtmp')) document.getElementById('newspecialtmp').innerHTML="发表新帖";
  GM_addStyle("#post_reply,.forumcontrol #newspecial,.pages_btns #newspecial,.forumcontrol #newspecialtmp,.pages_btns #newspecialtmp{border:1px solid #003B54;line-height:22px;padding:2px 8px 2px 8px;float:left;margin:2px 5px 3px 5px}");

  // 顶部菜单
  if(document.getElementById('menu')){
    document.getElementById('menu').style.display='none';
    if(_uid>0){
      document.getElementById('umenu').appendChild(document.createTextNode(" | "));
      var menuitem=document.createElement('a');
      menuitem.innerHTML="搜索";
      menuitem.href='http://'+document.domain+'/forum/search.php';
      document.getElementById('umenu').appendChild(menuitem);
      
      document.getElementById('umenu').appendChild(document.createTextNode(" | "));
      menuitem=document.createElement('a');
      menuitem.innerHTML="我的主题";
      menuitem.target="_blank";
      menuitem.href='http://'+document.domain+'/forum/my.php?item=threads';
      document.getElementById('umenu').appendChild(menuitem);
      
      document.getElementById('umenu').appendChild(document.createTextNode(" "));
      menuitem=document.createElement('a');
      menuitem.innerHTML="我的回复";
      menuitem.target="_blank";
      menuitem.href='http://'+document.domain+'/forum/my.php?item=posts';
      document.getElementById('umenu').appendChild(menuitem);
      
      document.getElementById('umenu').appendChild(document.createTextNode(" "));
      menuitem=document.createElement('a');
      menuitem.innerHTML="我的收藏";
      menuitem.target="_blank";
      menuitem.href='http://'+document.domain+'/forum/my.php?item=favorites&type=thread';
      document.getElementById('umenu').appendChild(menuitem);
    }
  }
  // 下一页
  // var nextpageurl=document.getElementsByClassName('pages')[1].getElementsByClassName('next')[0];
  // if(nextpageurl != undefined){
    // GM_addStyle(".thread-follow-page{border:1px solid #f00;height:31px;line-height:31px;align:center} .thread-follow-page a:hover{text-decoration:none}.thread-follow-page a{background-color:#DFD0BD;display:block;width:100%;height:31px;}");
    // var nextpagebtn=document.createElement('div');
    // nextpagebtn.className="thread-follow-page";
    // nextpagebtn.innerHTML="<a href='"+nextpageurl.href+"'>点击显示下一页</a>"
    // var pagenav=document.getElementsByClassName('forumcontrol')[1];
    // if(pagenav != undefined){
      // document.getElementsByTagName('body')[0].appendChild(nextpagebtn);
      // document.getElementById('wrap').insertBefore(nextpagebtn,pagenav);
    // }
  // }
}
function appendControl(){     // 添加[屏蔽]按钮
  var s = document.evaluate("//div[@class='authorinfo']",
          document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  for (var i = s.snapshotLength - 1; i >= 0; i--) {
    var t = s.snapshotItem(i);
      
    var a1=document.createElement('a');
    a1.innerHTML = '屏蔽';
    a1.href = '###';
    a1.addEventListener('click', onBlockUser,false);
    
    t.appendChild(document.createTextNode(" | "));
    t.appendChild(a1);
  }
};
function addConfigDiv(){      // 添加Alt+O的界面
    // 处理冲突界面
    GM_addStyle('\
      #hpdtool_syn_div { position:fixed;width:303px;bottom:20px;right:20px;font-size:13px;z-index:999;text-align:left;background-color:#9287AE;padding:15px;border:2px solid #bfbfbf;-moz-border-radius:5px;opacity:0.95;}\
      #hpdtool_syn_div hr {color: #bfbfbf;border: 1px solid;margin: 8px 0;}\
      #hpdtool_syn_div,#hpdtool_syn_div td,.hpdtool_syn_srv,.hpdtool_syn_lcl {color:#ffffff !important;}\
      #hpdtool_syn_list {margin-left:5px;max-height:600px;overflow:auto;}\
      #hpdtool_syn_div a {padding:2px 5px;-moz-border-radius: 4px;background: #eef9eb;width: 50px;border: 1px solid #aaa;}\
      #hpdtool_syn_div a:hover {border: 1px solid #aaa;background: #fff;color: #000;}\
      #hpdtool_syn_div .hpdtool_syn_new {width:45px;text-align:center;border-right:1px solid #fff;}\
      #hpdtool_syn_div .hpdtool_syn_srv {width:78px;max-width:78px;text-align:center;border-right:1px solid #fff;padding:2px 5px;}\
      #hpdtool_syn_div .hpdtool_syn_lcl {width:78px;max-width:78px;text-align:center;padding:2px 5px;}\
      ');
    var hpdtool_syn = document.createElement("div");
    hpdtool_syn.id = "hpdtool_syn_div";
    hpdtool_syn.style.display = "none";
    hpdtool_syn.innerHTML = "<div class='locker'><center><font face='Impact' size=3>同步冲突处理</font></center><hr>\
      本地与服务器黑名单差异部分,<b>相同部分已省略</b>。请点选对应的列表进行同步。\
      <div id='hpdtool_syn_list'></div><br />\
      <a href='javascript:void(0)' id='hpdtool_use_new' >新列表</a>\
      <a href='javascript:void(0)' id='hpdtool_use_server' >服务器列表</a>\
      &nbsp;&nbsp;<a href='javascript:void(0)' id='hpdtool_use_local' >本地列表</a>\
      &nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:void(0)' id='hpdtool_use_nothing' >保持不变</a></div>";
    document.getElementsByTagName('body')[0].appendChild(hpdtool_syn);
    document.getElementById('hpdtool_use_new').addEventListener('click', function(){onSynChooseBtn(0);}, false);
    document.getElementById('hpdtool_use_server').addEventListener('click', function(){onSynChooseBtn(1);}, false);
    document.getElementById('hpdtool_use_local').addEventListener('click', function(){onSynChooseBtn(2);}, false);
    document.getElementById('hpdtool_use_nothing').addEventListener('click', function(){onSynChooseBtn(3);}, false);
    
    // Alt+O 控制界面
    GM_addStyle('\
      #hp_cfg_div {position:fixed;align:center;width: 303px;padding: 15px;bottom:20px;right:20px;z-index:99;color:#fff;background:#9287AE;border:2px solid #bfbfbf;-moz-border-radius:5px;opacity:0.95;text-align:left;font-size:14px !important;}\
      #hp_cfg_div input {height: 12px}\
      #s_syn {display: none}\
      #hp_cfg_div hr {color: #bfbfbf;border: 1px solid;margin: 8px 0;}\
      #hp_cfg_div a {-moz-border-radius: 4px;background: #eef9eb;width: 50px;border: 1px solid #aaa;}\
      #hp_cfg_div a:hover {border: 1px solid #aaa;background: #fff;color: #000;}\
      #s_ok,#s_cl,#s_syn {padding:2px 5px;}\
      #blacklist {margin-left:5px;max-height:600px;overflow:auto;}\
      #_chk_hightlight_color {margin-left:4px;}\
    ');
    var hp_cfg = document.createElement("div");
    hp_cfg.id = "hp_cfg_div";
    hp_cfg.style.display = "none";
    hp_cfg.innerHTML = '<center><font face="Impact" size=3 title="来自D版带着爱">hi-pda &hearts; tool</font> <sub>version 5.2</sub></center><hr />\
        字体大小:\
        <input type="radio" id="_font_size_13px" name="_radio_font_size" value="13" /><font size=2>小</font>\
        <input type="radio" id="_font_size_14px" name="_radio_font_size" value="14" /><font size=3>中</font>\
        <input type="radio" id="_font_size_16px" name="_radio_font_size" value="16" /><font size=4.5>大</font>\
        <br />\
        界面风格:\
        <cite title="精简界面风格" ><input type="checkbox" id="_chk_simple_style" />简版</cite>\
        <cite title="用户信息显示在悬浮菜单,不选则显示在头像下方" ><input type="checkbox" id="_chk_hover_style" />头像菜单</cite>\
        <cite title="回帖时显示自己头像" ><input type="checkbox" id="_chk_reply_avatar" />回帖头像</cite>\
        <br />\
        新帖高亮:\
        <input id="_chk_hightlight_en" type="checkbox" />启用\
        <input id="_chk_hightlight_color" type="text" style="width:65px;height:18px;" title="HTML颜色代码,&#13;输入无效代码将使用原来的设置" value="未定义"/><br />\
        屏蔽用户:\
        <input id="_chk_blacklist_en_hpd" type="checkbox" />D版\
        <input id="_chk_blacklist_en_other" type="checkbox" />其他\
        <br />\
        <div id="blacklist"></div><br /><br />\
        <div align="center">\
            <a href="javascript:void(0)" id="s_ok" >√ 确定</a>\
            &nbsp;\
            <a href="javascript:void(0)" id="s_cl" >X 取消</a>\
            &nbsp;&nbsp;&nbsp;&nbsp;\
            <a href="javascript:void(0)" id="s_syn" >₪ 同步</a>\
            <br />\
        </div>\
        ';
    document.getElementsByTagName('body')[0].appendChild(hp_cfg);
    if(_uid == 0){
      document.getElementById('s_syn').innerHTML="未登录";
      document.getElementById('s_syn').href="http://"+document.domain+"/forum/logging.php?action=login";
    }
    document.getElementById('s_ok').addEventListener('click', function(){onSaveConfig(true);}, false);
    document.getElementById('s_cl').addEventListener('click', function(){onSaveConfig(false);}, false);
    document.getElementById('s_syn').addEventListener('click', function(){onClickSynBtn(false);}, false);
    document.getElementById('_font_size_13px').addEventListener('click', function(){changeFontSize(false);}, false);
    document.getElementById('_font_size_14px').addEventListener('click', function(){changeFontSize(false);}, false);
    document.getElementById('_font_size_16px').addEventListener('click', function(){changeFontSize(false);}, false);
    addHotKey('alt+O',function(){if(_syn_pending)return;refreshConfigDiv();onSaveConfig(false); });
    addHotKey('Esc',function(){if(_syn_pending)return;else document.getElementById('hp_cfg_div').style.display = 'none'});
}
function readConfig(){
  grave_image="url(data:img/png;base64,\
iVBORw0KGgoAAAANSUhEUgAAAJYAAACECAYAAAEFGOLkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
bWFnZVJlYWR5ccllPAAAA1xpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp\
bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6\
eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz\
NDM0MiwgMjAxMC8wMS8xMC0xODowNjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo\
dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw\
dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu\
MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz\
b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N\
Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMTIxRTYyMzYxMjZFMTExOTA1MkM0NDMxNTJG\
QzY0QSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyNUI0ODYyNDI2NjgxMUUxOEFEMkMyMzg3\
QkVENjI2OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyNUI0ODYyMzI2NjgxMUUxOEFEMkMy\
Mzg3QkVENjI2OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1Ij4gPHhtcE1N\
OkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDEyMUU2MjM2MTI2RTExMTkw\
NTJDNDQzMTUyRkM2NEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDEyMUU2MjM2MTI2RTEx\
MTkwNTJDNDQzMTUyRkM2NEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94Onht\
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) no-repeat 90% 95%";

  _hightlight_en = GM_getValue('HiPDA_Discovery_HIGHLIGHT_ENABLE');
  if(_hightlight_en == undefined)_hightlight_en = false;
  if(_hightlight_en == "false" || !_hightlight_en) _hightlight_en = false;
  else                           _hightlight_en = true;
  
  _blacklist_en_hpd = GM_getValue('HiPDA_Discovery_BLACKLIST_ENABLE_HPD');
  if(_blacklist_en_hpd == undefined)_blacklist_en_hpd = true;
  if(_blacklist_en_hpd == "false" || !_blacklist_en_hpd) _blacklist_en_hpd = false;
  else                              _blacklist_en_hpd = true;
  
  _blacklist_en_other = GM_getValue('HiPDA_Discovery_BLACKLIST_ENABLE_OTHER');
  if(_blacklist_en_other == undefined)_blacklist_en_other = true;
  if(_blacklist_en_other == "false" || !_blacklist_en_other) _blacklist_en_other = false;
  else                                _blacklist_en_other = true;
  
  _simple_style = GM_getValue('HiPDA_Discovery_SIMPLE_STYLE');
  if(_simple_style == undefined)_simple_style = true;
  if(_simple_style == "false" || !_simple_style) _simple_style = false;
  else                          _simple_style = true;
  
  _hover_style = GM_getValue('HiPDA_Discovery_HOVER_STYLE');
  if(_hover_style == undefined)_hover_style = false;
  if(_hover_style == "false" || !_hover_style) _hover_style = false;
  else                         _hover_style = true;
  
  _reply_avatar = GM_getValue('HiPDA_Discovery_REPLY_AVATAR');
  if(_reply_avatar == undefined)_reply_avatar = false;
  if(_reply_avatar == "false" || !_reply_avatar ) _reply_avatar = false;
  else                          _reply_avatar = true;
  
  _syn_modified = GM_getValue('HiPDA_Discovery_SYN_MODIFIED');
  if(_syn_modified == undefined)_syn_modified = false;
  if(_syn_modified == "false" || !_syn_modified) _syn_modified = false;
  else                          _syn_modified = true;
  
  _hightlight_color = GM_getValue('HiPDA_Discovery_HIGHLIGHT_COLOR');
  if(_hightlight_color == undefined)_hightlight_color = "#F0E68C";
  
  _font_size = GM_getValue('HiPDA_Discovery_FONT_SIZE');
  if(_font_size == undefined)_font_size = '13';
  _syn_lastversion = GM_getValue('HiPDA_Discovery_SYN_LASTVERSION');
  if(_syn_lastversion == undefined)_syn_lastversion = 0;
  
  var b = GM_getValue('HiPDA_Discovery_BLACK_LIST');
  if(b == undefined)b='';
  blacklistArray = '';
  if(b.length)blacklistArray = b.split(",");
  else blacklistArray = new Array();
  blacklistLen=blacklistArray.length;
  blacklistStr=blacklistArray.toString();

  try{ // 取得当前登录用户 uid
    var c = document.getElementById('umenu').getElementsByTagName('cite')[0].getElementsByTagName('a')[0].href;
    _uid = c.substr(c.indexOf("uid=")+4);
    if(c.indexOf("&")>0)
    _uid = c.substr(0,c.indexOf("&"));
  }catch (e) {_uid = 0;}

  _today = year + "-" + month + "-" + day;
  _pxt = "1900-1-1 01:01";
  _pmt = year + "-" + month + "-" + day + " " + hour + ":" + min;
  var offset = window.location.search.indexOf("page=");
  if(offset>0){
      var t = window.location.search.substr(offset);
      if(t.indexOf("&") >0) _pc = t.slice(5,t.indexOf("&"));
      else _pc = t.slice(5);
  }
  else _pc = 1;
  offset = window.location.search.indexOf("fid=");
  if(offset>0){
    var t = window.location.search.substr(offset);
    if(t.indexOf("&") >0)_fid = t.slice(4,t.indexOf("&"));
    else _fid = t.slice(4);
  }
  else _fid = 2; // 默认D版好了
  
  _lvt = GM_getValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid);
  if(_lvt == undefined){
    _lvt = year + "-" + month + "-" + day + " " + hour + ":" + min;
    _first_time_use = true;
    GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,_lvt);
  }
  else _first_time_use = false;
}
function refreshConfigDiv(){  // 刷新编辑黑名单的界面
  readConfig();
  document.getElementById('_chk_hightlight_color').value=_hightlight_color;
  document.getElementById('_chk_hightlight_en').checked=( !_hightlight_en || _hightlight_en=="false")?0:1;
  document.getElementById('_chk_blacklist_en_hpd').checked=( !_blacklist_en_hpd || _blacklist_en_hpd=="false")?0:1;
  document.getElementById('_chk_blacklist_en_other').checked=( !_blacklist_en_other || _blacklist_en_other=="false")?0:1;
  document.getElementById('_chk_simple_style').checked=( !_simple_style || _simple_style=="false")?0:1;
  document.getElementById('_chk_hover_style').checked=( !_hover_style || _hover_style=="false")?0:1;
  document.getElementById('_chk_reply_avatar').checked=( !_reply_avatar || _reply_avatar=="false")?0:1;
  // 被点击过以后就不必更新此按钮,直到刷新页面
  if(document.getElementById('s_syn').className != "disabled") {
    if(_uid == 0){
      document.getElementById('s_syn').innerHTML="未登录";
      document.getElementById('s_syn').href="http://"+document.domain+"/forum/logging.php?action=login";
    }
    else {
      document.getElementById('s_syn').innerHTML="₪ 同步";
      document.getElementById('s_syn').style.background='#eef9eb';
      document.getElementById('s_syn').style.color='#000';
    }
  }
  document.getElementById('s_syn').title="上次同步时间:"+GM_getValue('HiPDA_Discovery_SYN_LASTTIME');
  var rd=document.getElementsByName('_radio_font_size');
  for(var i=0;i<rd.length;i++){
    if(rd[i].value == _font_size)
      rd[i].checked="true";
  }
  
  if(blacklistLen){
    document.getElementById('blacklist').innerHTML='';
    for(var i=0;i<blacklistLen;i++){
      var t = blacklistArray[i];
      var lst=document.createElement('input');
      lst.className = 'bl_chk';
      lst.value = t;
      lst.type  = 'checkbox';
      lst.checked   = true;
      lst.addEventListener('click', onToggleBlackList,false);
      var dv=document.createElement('div');
      dv.appendChild(lst);
      dv.appendChild(document.createTextNode(t.substr(t.indexOf('=')+1)));
      document.getElementById('blacklist').appendChild(dv);
    }
  }else document.getElementById('blacklist').innerHTML = '您还没有屏蔽任何用户';
}
// 功能实现
function mouseOverPost(event){
  this.style.background="";
  this.removeAttribute('onmouseover');
}
function processBlackList(){      // 屏蔽黑名单
  if( (_fid == 2)&&!_blacklist_en_hpd )return; // 当前浏览D版且未启用黑名单功能
  else if(!_blacklist_en_other)return;         // 浏览其他版块
  
  if(_bVIEWTHREAD>0){   // 帖子
      var s = document.evaluate("//div[@class='postinfo']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
      for (var i = s.snapshotLength - 1; i >= 0; i--) {
          var t = s.snapshotItem(i);
          var a = t.getElementsByTagName('a')[0];
          if( a != undefined){
              var u = a.href.substring(a.href.indexOf('uid')+4);
              t.parentNode.parentNode.parentNode.parentNode.style.display=(blacklistStr.indexOf(u+'='+a.text)>=0)?'none':'';
          }
      }
      // 屏蔽 被引用 的黑名单用户发言
      s = document.evaluate("//div[@class='quote']//blockquote//font//font[@color='#999999']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
      for (var i = s.snapshotLength - 1; i >= 0; i--) {
          var t = s.snapshotItem(i);
          var n=t.innerHTML.substring(0,t.innerHTML.indexOf('发表于')-1);
          if(blacklistStr.indexOf(('='+n+','))>=0)t.parentNode.parentNode.parentNode.style.display = 'none';
      }
  }
  if(_bFORUMDISPLAY>0){ // 论坛列表
    // 屏蔽BLACK_LIST的发帖
    var s = document.evaluate("//td[@class='author']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = s.snapshotLength - 1; i >= 0; i--) {
      var t = s.snapshotItem(i);
      var a = t.getElementsByTagName('a')[0];
      if( a != undefined){
        var n = a.text;
        var u = a.href.substring(a.href.indexOf('uid')+4);
        if(blacklistStr.indexOf(u+'='+n)>=0)t.parentNode.parentNode.style.display='none';
        else t.parentNode.parentNode.style.display='';
      }
    }
    // 隐藏BLACK_LIST在最后回复位置的显示
    s = document.evaluate("//td[@class='lastpost']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = s.snapshotLength - 1; i >= 0; i--) { 
      var t = s.snapshotItem(i);
      var a = t.getElementsByTagName('a')[1];
      if((a != undefined)&&(blacklistStr.indexOf(('='+a.text))>=0))a.innerHTML='anonymous';
    }
  }
};
function processShowHiddenText(){ // 好孩子看得见
    var s = document.evaluate("//font[\
              translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='white' \
              or translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='#ffffff'\
              or translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='#wheat'\
              or translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='#lemonchiffon']", 
            document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = s.snapshotLength - 1; i >= 0; i--) {
        var t=s.snapshotItem(i).innerHTML;
        t=t.replace(/white/i,"red");
        t=t.replace(/#ffffff/i,"red");
        t=t.replace(/wheat/i,"red");
        t=t.replace(/lemonchiffon/i,"red");
        //t=s.snapshotItem(i).innerHTML='<fieldset class="goodboysglasses"><legend>好孩子看不见</legend>'+t+'</fieldset>';
        t=s.snapshotItem(i).innerHTML='<div class="goodboysglasses" title="好孩子看不见">'+t+'</div>';
    }
};
function processHighlightColor(){ // 对帖子进行高亮
  if( !_hightlight_en ){  // 如果不启用高亮就把这次页面打开的时刻写进去
    if( 1 == _pc )
      GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,year + "-" + month + "-" + day + " " + hour + ":" + min)
    return;
  }
  
  if(_bFORUMDISPLAY>0){
  // 遍历页面中的帖子列表,将所有“最后回复时间”大于 _lvt 的帖子背景色换成 _hightlight_color
  // 这里没有排除置顶帖子
  var f = document.evaluate("//td[@class='lastpost']", 
      document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  for (var i = f.snapshotLength - 1; i >= 0; i--){
    var e = f.snapshotItem(i);
        var a = e.getElementsByTagName('a')[1];
        if( a != undefined){
            var _rt = a.text;
            if (timeDiff(_rt,_lvt)){
                e.parentNode.style.background=_hightlight_color;
                e.parentNode.addEventListener('mouseover',mouseOverPost,false);
                }
            if(timeDiff(_rt,_pxt))_pxt = _rt;
            if(timeDiff(_pxt,_lvt)) GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,_pxt);
        }
  }
  // 将发帖日期超过30天的帖子里发帖人单元格背景换成 _old_post_bgcolor :灰色
  // 将当天发布的帖子里发帖日期颜色变成 _today_post_color :红色
  var snapResults = document.evaluate("//td [@class='author']", 
      document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
    var e = snapResults.snapshotItem(i).getElementsByTagName('em')[0];
    if(e != undefined){
      var dd = dateDiff(e.innerHTML,_today);
      if (dd >= 30) {
        if (e.parentNode.parentNode.innerHTML.indexOf("images/default/pin")==-1 && e.parentNode.parentNode.innerHTML.indexOf('images/default/folder_lock')==-1 ){
          e.parentNode.parentNode.style.background=_old_post_bgcolor;
          e.parentNode.parentNode.removeEventListener('mouseover',mouseOverPost,false);
        }
      }
      if (dd == 0) {
        if (e.parentNode.parentNode.innerHTML.indexOf("images/default/pin")==-1 && e.parentNode.parentNode.innerHTML.indexOf('images/default/folder_lock')==-1 )
          e.style.color=_today_post_color;
      }
    }
  }
  }
  if(_bVIEWTHREAD>0){
    var pst=document.evaluate("//div[@class='postinfo']//strong//a//em", 
      document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = pst.snapshotLength - 1; i >= 0; i--){
      if(pst.snapshotItem(i).innerHTML == 1){  // 1st floor
        var t1=pst.snapshotItem(i).parentNode.parentNode.parentNode.getElementsByClassName('authorinfo')[0].getElementsByTagName('em')[0];
        if(t1 != undefined){
          var postdate=t1.innerHTML;
          postdate = postdate.substr(4,postdate.indexOf(':')-7);
          if(dateDiff(postdate,_today) >=30)
            t1.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('defaultpost')[0].style.background=grave_image;
        }
      }
    }
  }
}
function processImageZoom(){      // 调整附件图片大小
  var imglist=document.evaluate("//img[substring(@id,1,5)='aimg_']", 
            document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  for (var i = imglist.snapshotLength - 1; i >= 0; i--) 
    imglist.snapshotItem(i).addEventListener('load',onAttachImageLoaded,false);
}
function processConflict(){
  document.getElementById('hp_cfg_div').style.display = 'none';
  // 显示【勾选界面】,【服务器列表】,【本地列表】的差异换面和对应选项
  // 如果以服务器为准,则存储response的version和list即可
  // 如果以本地为准、或以新列表为准(先存储新列表),则请求action=update,等待返回结果【跳到 case 1:】
  newBlacklist = new Array();
  var listhtml="<table><tbody>";
  var i;
  for ( i in serverBlacklist ){
    var item = serverBlacklist[i];
    if(/\d+=.+/.test(item)){
      if(blacklistStr.indexOf(item)>=0){ // 服务、本地名单都有
        newBlacklist.push(item);
      }
      else{  // 服务器有,本地没有
        var n = item.substr(item.indexOf('=')+1);
        listhtml = listhtml +"<tr><td class='hpdtool_syn_new'><input class='hpdtool_syn_chk_new' type='checkbox' value='"+item+"'></td><td class='hpdtool_syn_srv' nowrap='nowrap'>"+n+"</td><td class='hpdtool_syn_lcl'>&nbsp;</td></tr>";
      }
      }
  }
  for ( i in blacklistArray ){
    var item = blacklistArray[i];
    if( /\d+=.+/.test(item) && serverListStr.indexOf( item )<0 ){ // 本地有,服务器没有
      var n = item.substr(item.indexOf('=')+1);
      listhtml = listhtml +"<tr><td class='hpdtool_syn_new'><input class='hpdtool_syn_chk_new' type='checkbox' value='"+item+"'></td><td class='hpdtool_syn_srv'>&nbsp;</td><td class='hpdtool_syn_lcl' nowrap='nowrap'>"+n+"</td></tr>";
    }
  }
  listhtml = listhtml + "</tbody></table>";
  document.getElementById('hpdtool_syn_list').innerHTML = listhtml;
  document.getElementById('hpdtool_syn_div').style.display="";
}
readConfig();
changeStyle();
changeURL();
if(_bFORUMDISPLAY>0 || _bVIEWTHREAD>0){
  addConfigDiv();
  window.addEventListener('resize',onWindowResize,false);
}
if(_bFORUMDISPLAY>0){
  window.addEventListener('unload',onPageUnload,false);
  refreshMinTime(); // 一开始就刷新一次_pmt,否则直接就取下一页了
  if(!_first_time_use && _hightlight_en){ //第一次用就不往后续读取了
    if(timeDiff(_pmt,_lvt)){
      _pc++;
      GM_xmlhttpRequest({
        method: 'GET',
        url: 'http://'+document.domain+'/forum/forumdisplay.php?fid='+_fid+'&page='+_pc,
        onload: onLoadNewPage,
        overrideMimeType: "text/html; charset=gbk"
      });
    }
  }
  processHighlightColor();
  processBlackList();
}
if(_bVIEWTHREAD>0){
  appendControl();
  processBlackList();
  processHighlightColor();
  processShowHiddenText();
  _att_max_width=document.getElementsByClassName('t_msgfontfix')[0].clientWidth; // 最宽这么宽
  if(_att_max_width<10)_att_max_width=600;
  processImageZoom();
}