hi-pda tools

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

当前为 2014-08-07 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name hi-pda tools
  3. // @namespace hi-pda-tools-by-2200
  4. // @description 屏蔽用户、名单同步;标识新帖;好孩子也看的见;
  5. // @include http://*.hi-pda.com/forum/*
  6. // @version 5.0
  7. // ==/UserScript==
  8. // Version 5.0
  9. // Date 2011-12-18
  10. // 增加同步功能
  11. // Version 4.0
  12. // Date 2011-12-06
  13. // 论坛改版
  14. // Version 3.0
  15. // Date 2011-7-13
  16. // 增加自动更新
  17. // Version 2.2
  18. // Date 2011-7-13
  19. // 修正zhuyi增加【只讨论2.0】板块后预读页面错误
  20. // 高亮功能修改为可选,颜色自定义
  21. // 屏蔽用户功能修改为分版面可选
  22. // Version 2.1
  23. // Date 2011-4-3
  24. // 修正Chrome错误
  25. // 脚本仅针对D版有效
  26. // Version 2.0
  27. // Date 2010-2-9
  28.  
  29. // @require http://userscript-updater-generator.appspot.com/?id=106358
  30. // Chrome浏览器不支GM_GetValue/GM_SetValue
  31. try{
  32. if (!this.GM_getValue || this.GM_getValue.toString().indexOf("not supported")>-1) {
  33. this.GM_getValue=function (key,def) {
  34. return localStorage[key] || def;
  35. };
  36. this.GM_setValue=function (key,value) {
  37. return localStorage[key]=value;
  38. };
  39. }
  40. }
  41. catch(e){}
  42.  
  43. var _pc = 1; // 当前页面的page值
  44. var _fid; // 当前版面fid
  45. var _uid; // 当前登录用户uid
  46. var _tid= 0; // 当前帖子的tid
  47. var _pxt; // 当前页面上“最后回复时间”的最大值
  48. var _pmt; // 当前页面上“最后回复时间”的最小值
  49. var _lvt; // 上次访问时间,页面关闭时,_pxt 存储为 _lvt
  50. var _today; // 与发帖日期比较,超过30天的发帖人单元格显示灰色
  51. var _first_time_use;
  52. var _max_read_pages = 5; // 不能读取更多啦,太多了容易死机
  53. var _hightlight_en; // 启用高亮功能
  54. var _hightlight_color; // 高亮颜色自定义
  55. var _blacklist_en_hpd; // 启用D版的黑名单功能
  56. var _blacklist_en_other; // 启用其他版的黑名单功能
  57. var _simple_style; // 启用精简风格
  58. var _hover_style; // 启用悬停风格
  59. var _reply_avatar; // 回复位置是否显示自己的头像
  60. var _font_size; // 论坛字体大小
  61. var blacklistArray; // 黑名单
  62. var blacklistLen; // 黑名单长度
  63. var blacklistStr;
  64. var serverBlacklist; // 同步冲突时服务器端的列表
  65. var serverListStr;
  66. var serverVersion;
  67. var newBlacklist // 同步冲突时的新列表
  68. var _syn_pending; // 正在同步
  69. var _syn_lastversion;
  70. var _syn_modified;
  71. var _att_max_width; // 帖子附件图片最大宽度
  72.  
  73. var grave_image; // 坟贴背景图片
  74. // var _old_post_bgcolor = "#E1E1E1";
  75. var _old_post_bgcolor = "#e9e9e9";
  76. var _today_post_color = "#FF0000";
  77. var now = new Date();
  78. var year = now.getYear()+1900;
  79. var month = now.getMonth()+1;
  80. var day = now.getDate();
  81. var hour = now.getHours();
  82. var min = now.getMinutes();
  83. var _bFORUMDISPLAY = location.href.indexOf('hi-pda.com/forum/forumdisplay.php?');
  84. var _bVIEWTHREAD = location.href.indexOf('hi-pda.com/forum/viewthread.php?');
  85.  
  86. // 工具函数
  87. var JSON;
  88. if (!JSON) {JSON = {};}
  89. (function () {
  90. 'use strict';
  91. function f(n) {return n < 10 ? '0' + n : n;}
  92.  
  93. if (typeof Date.prototype.toJSON !== 'function') {
  94.  
  95. Date.prototype.toJSON = function (key) {
  96.  
  97. return isFinite(this.valueOf()) ?
  98. this.getUTCFullYear() + '-' +
  99. f(this.getUTCMonth() + 1) + '-' +
  100. f(this.getUTCDate()) + 'T' +
  101. f(this.getUTCHours()) + ':' +
  102. f(this.getUTCMinutes()) + ':' +
  103. f(this.getUTCSeconds()) + 'Z' : null;
  104. };
  105.  
  106. String.prototype.toJSON =
  107. Number.prototype.toJSON =
  108. Boolean.prototype.toJSON = function (key) {
  109. return this.valueOf();
  110. };
  111. }
  112.  
  113. var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  114. escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  115. gap,
  116. indent,
  117. meta = { // table of character substitutions
  118. '\b': '\\b',
  119. '\t': '\\t',
  120. '\n': '\\n',
  121. '\f': '\\f',
  122. '\r': '\\r',
  123. '"' : '\\"',
  124. '\\': '\\\\'
  125. },
  126. rep;
  127.  
  128.  
  129. function quote(string) {
  130.  
  131. // If the string contains no control characters, no quote characters, and no
  132. // backslash characters, then we can safely slap some quotes around it.
  133. // Otherwise we must also replace the offending characters with safe escape
  134. // sequences.
  135.  
  136. escapable.lastIndex = 0;
  137. return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
  138. var c = meta[a];
  139. return typeof c === 'string' ? c :
  140. '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  141. }) + '"' : '"' + string + '"';
  142. }
  143.  
  144.  
  145. function str(key, holder) {
  146.  
  147. // Produce a string from holder[key].
  148.  
  149. var i, // The loop counter.
  150. k, // The member key.
  151. v, // The member value.
  152. length,
  153. mind = gap,
  154. partial,
  155. value = holder[key];
  156.  
  157. // If the value has a toJSON method, call it to obtain a replacement value.
  158.  
  159. if (value && typeof value === 'object' &&
  160. typeof value.toJSON === 'function') {
  161. value = value.toJSON(key);
  162. }
  163.  
  164. // If we were called with a replacer function, then call the replacer to
  165. // obtain a replacement value.
  166.  
  167. if (typeof rep === 'function') {
  168. value = rep.call(holder, key, value);
  169. }
  170.  
  171. // What happens next depends on the value's type.
  172.  
  173. switch (typeof value) {
  174. case 'string':
  175. return quote(value);
  176.  
  177. case 'number':
  178.  
  179. // JSON numbers must be finite. Encode non-finite numbers as null.
  180.  
  181. return isFinite(value) ? String(value) : 'null';
  182.  
  183. case 'boolean':
  184. case 'null':
  185.  
  186. // If the value is a boolean or null, convert it to a string. Note:
  187. // typeof null does not produce 'null'. The case is included here in
  188. // the remote chance that this gets fixed someday.
  189.  
  190. return String(value);
  191.  
  192. // If the type is 'object', we might be dealing with an object or an array or
  193. // null.
  194.  
  195. case 'object':
  196.  
  197. // Due to a specification blunder in ECMAScript, typeof null is 'object',
  198. // so watch out for that case.
  199.  
  200. if (!value) {
  201. return 'null';
  202. }
  203.  
  204. // Make an array to hold the partial results of stringifying this object value.
  205.  
  206. gap += indent;
  207. partial = [];
  208.  
  209. // Is the value an array?
  210.  
  211. if (Object.prototype.toString.apply(value) === '[object Array]') {
  212.  
  213. // The value is an array. Stringify every element. Use null as a placeholder
  214. // for non-JSON values.
  215.  
  216. length = value.length;
  217. for (i = 0; i < length; i += 1) {
  218. partial[i] = str(i, value) || 'null';
  219. }
  220.  
  221. // Join all of the elements together, separated with commas, and wrap them in
  222. // brackets.
  223.  
  224. v = partial.length === 0 ? '[]' : gap ?
  225. '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
  226. '[' + partial.join(',') + ']';
  227. gap = mind;
  228. return v;
  229. }
  230.  
  231. // If the replacer is an array, use it to select the members to be stringified.
  232.  
  233. if (rep && typeof rep === 'object') {
  234. length = rep.length;
  235. for (i = 0; i < length; i += 1) {
  236. k = rep[i];
  237. if (typeof k === 'string') {
  238. v = str(k, value);
  239. if (v) {
  240. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  241. }
  242. }
  243. }
  244. } else {
  245.  
  246. // Otherwise, iterate through all of the keys in the object.
  247.  
  248. for (k in value) {
  249. if (Object.prototype.hasOwnProperty.call(value, k)) {
  250. v = str(k, value);
  251. if (v) {
  252. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  253. }
  254. }
  255. }
  256. }
  257.  
  258. // Join all of the member texts together, separated with commas,
  259. // and wrap them in braces.
  260.  
  261. v = partial.length === 0 ? '{}' : gap ?
  262. '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
  263. '{' + partial.join(',') + '}';
  264. gap = mind;
  265. return v;
  266. }
  267. }
  268.  
  269. // If the JSON object does not yet have a stringify method, give it one.
  270.  
  271. if (typeof JSON.stringify !== 'function') {
  272. JSON.stringify = function (value, replacer, space) {
  273.  
  274. // The stringify method takes a value and an optional replacer, and an optional
  275. // space parameter, and returns a JSON text. The replacer can be a function
  276. // that can replace values, or an array of strings that will select the keys.
  277. // A default replacer method can be provided. Use of the space parameter can
  278. // produce text that is more easily readable.
  279.  
  280. var i;
  281. gap = '';
  282. indent = '';
  283.  
  284. // If the space parameter is a number, make an indent string containing that
  285. // many spaces.
  286.  
  287. if (typeof space === 'number') {
  288. for (i = 0; i < space; i += 1) {
  289. indent += ' ';
  290. }
  291.  
  292. // If the space parameter is a string, it will be used as the indent string.
  293.  
  294. } else if (typeof space === 'string') {
  295. indent = space;
  296. }
  297.  
  298. // If there is a replacer, it must be a function or an array.
  299. // Otherwise, throw an error.
  300.  
  301. rep = replacer;
  302. if (replacer && typeof replacer !== 'function' &&
  303. (typeof replacer !== 'object' ||
  304. typeof replacer.length !== 'number')) {
  305. throw new Error('JSON.stringify');
  306. }
  307.  
  308. // Make a fake root object containing our value under the key of ''.
  309. // Return the result of stringifying the value.
  310.  
  311. return str('', {'': value});
  312. };
  313. }
  314.  
  315.  
  316. // If the JSON object does not yet have a parse method, give it one.
  317.  
  318. if (typeof JSON.parse !== 'function') {
  319. JSON.parse = function (text, reviver) {
  320.  
  321. // The parse method takes a text and an optional reviver function, and returns
  322. // a JavaScript value if the text is a valid JSON text.
  323.  
  324. var j;
  325.  
  326. function walk(holder, key) {
  327.  
  328. // The walk method is used to recursively walk the resulting structure so
  329. // that modifications can be made.
  330.  
  331. var k, v, value = holder[key];
  332. if (value && typeof value === 'object') {
  333. for (k in value) {
  334. if (Object.prototype.hasOwnProperty.call(value, k)) {
  335. v = walk(value, k);
  336. if (v !== undefined) {
  337. value[k] = v;
  338. } else {
  339. delete value[k];
  340. }
  341. }
  342. }
  343. }
  344. return reviver.call(holder, key, value);
  345. }
  346.  
  347.  
  348. // Parsing happens in four stages. In the first stage, we replace certain
  349. // Unicode characters with escape sequences. JavaScript handles many characters
  350. // incorrectly, either silently deleting them, or treating them as line endings.
  351.  
  352. text = String(text);
  353. cx.lastIndex = 0;
  354. if (cx.test(text)) {
  355. text = text.replace(cx, function (a) {
  356. return '\\u' +
  357. ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  358. });
  359. }
  360.  
  361. // In the second stage, we run the text against regular expressions that look
  362. // for non-JSON patterns. We are especially concerned with '()' and 'new'
  363. // because they can cause invocation, and '=' because it can cause mutation.
  364. // But just to be safe, we want to reject all unexpected forms.
  365.  
  366. // We split the second stage into 4 regexp operations in order to work around
  367. // crippling inefficiencies in IE's and Safari's regexp engines. First we
  368. // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
  369. // replace all simple value tokens with ']' characters. Third, we delete all
  370. // open brackets that follow a colon or comma or that begin the text. Finally,
  371. // we look to see that the remaining characters are only whitespace or ']' or
  372. // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
  373.  
  374. if (/^[\],:{}\s]*$/
  375. .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
  376. .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
  377. .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
  378.  
  379. // In the third stage we use the eval function to compile the text into a
  380. // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
  381. // in JavaScript: it can begin a block or an object literal. We wrap the text
  382. // in parens to eliminate the ambiguity.
  383.  
  384. j = eval('(' + text + ')');
  385.  
  386. // In the optional fourth stage, we recursively walk the new structure, passing
  387. // each name/value pair to a reviver function for possible transformation.
  388.  
  389. return typeof reviver === 'function' ?
  390. walk({'': j}, '') : j;
  391. }
  392.  
  393. // If the text is not JSON parseable, then a SyntaxError is thrown.
  394.  
  395. throw new SyntaxError('JSON.parse');
  396. };
  397. }
  398.  
  399. // Augment the basic prototypes if they have not already been augmented.
  400. // These forms are obsolete. It is recommended that JSON.stringify and
  401. // JSON.parse be used instead.
  402.  
  403. if (!Object.prototype.toJSONString) {
  404. Object.prototype.toJSONString = function (filter) {
  405. return JSON.stringify(this, filter);
  406. };
  407. Object.prototype.parseJSON = function (filter) {
  408. return JSON.parse(this, filter);
  409. };
  410. }
  411. }());
  412. function $(select){
  413. var name = select.substring(1);
  414. switch(select.charAt(0)){
  415. case '#':
  416. return document.getElementById(name);
  417. case '.':
  418. return document.getElementsByClassName(name);
  419. case '/':
  420. return document.getElementsByTagName(name);
  421. default:
  422. return document.getElementsByName(select);
  423. }
  424. };
  425. function getNowTimeStamp(){ // 当前时刻 yyyy-m-d h:m:s
  426. var nowtime = new Date();
  427. var timestamp =(nowtime.getYear()+1900)+'-'+(nowtime.getMonth()+1)+'-'+nowtime.getDate()+' '+checkTime(nowtime.getHours())+':'+checkTime(nowtime.getMinutes())+':'+checkTime(nowtime.getSeconds());
  428. return timestamp;
  429. }
  430. function timeDiff(date1,date2){// 比较日期大小,年,月,日,小时,分钟
  431. var re=/^(\d{4})\S(\d{1,2})\S(\d{1,2})\s(\d{1,2})\S(\d{1,2})$/;
  432. var dt1,dt2;
  433. if (re.test(date1)) dt1=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3,RegExp.$4,RegExp.$5);
  434. if (re.test(date2)) dt2=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3,RegExp.$4,RegExp.$5);
  435. else dt2=new Date();
  436. return dt1>=dt2;
  437. }
  438. function dateDiff(date1,date2){// 比较日期大小,年月日
  439. var re=/^(\d{4})\S(\d{1,2})\S(\d{1,2})$/;
  440. var dt1,dt2;
  441. if (re.test(date1)) dt1=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3);
  442. if (re.test(date2)) dt2=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3);
  443. return Math.floor((dt2-dt1)/(1000*60*60*24))
  444. }
  445. function checkTime(i){ // 一位数的时间前加0
  446. if (i<10)
  447. {i="0" + i}
  448. return i
  449. }
  450. function getKeys(e){ // keycode 转换
  451. 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':'"'};
  452. var Keys = '';
  453. e.shiftKey && (e.keyCode != 16) && (Keys += 'shift+');
  454. e.ctrlKey && (e.keyCode != 17) && (Keys += 'ctrl+');
  455. e.altKey && (e.keyCode != 18) && (Keys += 'alt+');
  456. return Keys + (codetable[e.keyCode] || String.fromCharCode(e.keyCode) || '');
  457. };
  458. function addHotKey(codes,func){// 监视并执行快捷键对应的函数
  459. document.addEventListener('keydown', function(e){
  460. if ((e.target.tagName != 'INPUT') && (e.target.tagName != 'TEXTAREA') && getKeys(e) == codes){
  461. func();
  462. e.preventDefault();
  463. e.stopPropagation();
  464. }
  465. }, false);
  466. };
  467. // 触发函数
  468. function onToggleBlackList(e){// 黑名单[名字]触发
  469. var v = e.target.value;
  470. var bShow = e.target.checked;
  471. if(_bVIEWTHREAD>0){
  472. var s = document.evaluate("//div[@class='postinfo']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  473. for (var i = s.snapshotLength - 1; i >= 0; i--) {
  474. var t = s.snapshotItem(i);
  475. var a = t.getElementsByTagName('a')[0];
  476. if( a != undefined){
  477. var u = a.href.substring(a.href.indexOf('uid')+4);
  478. if((u+'='+a.text) == v)t.parentNode.parentNode.parentNode.parentNode.style.display = bShow?'none':'';
  479. }
  480. }
  481. }
  482. if(_bFORUMDISPLAY>0){
  483. var s = document.evaluate("//td[@class='f_author']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  484. for (var i = s.snapshotLength - 1; i >= 0; i--) { // 屏蔽BLACK_LIST的发帖
  485. var t = s.snapshotItem(i);
  486. var a = t.getElementsByTagName('a')[0];
  487. if( a != undefined){
  488. var n = a.text;
  489. var u = a.href.substring(a.href.indexOf('uid')+4);
  490. if((u+'='+a.text) == v)t.parentNode.style.display = bShow?'none':'';
  491. }
  492. }
  493. }
  494. };
  495. function onBlockUser(e){ // [屏蔽] 按钮触发
  496. var a = e.target.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('postinfo')[0].getElementsByTagName('a')[0];
  497. var nm= a.text;
  498. var id= a.href.substring(a.href.indexOf('uid')+4);
  499. if(blacklistStr.indexOf(id+'='+nm)<0){//检查有没有重复的
  500. blacklistArray.push(id+'='+nm);
  501. blacklistStr = blacklistArray.toString();
  502. GM_setValue('HiPDA_Discovery_BLACK_LIST',blacklistArray.join());
  503. blacklistLen=blacklistArray.length;
  504. }
  505. _syn_modified = true;
  506. GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
  507. // 重新激活同步按钮
  508. document.getElementById('s_syn').className="enable";
  509. document.getElementById('s_syn').innerHTML="₪ 同步";
  510. document.getElementById('s_syn').style.background='#eef9eb';
  511. document.getElementById('s_syn').style.color='#000';
  512. refreshConfigDiv();
  513. processBlackList();
  514. };
  515. function onWindowResize(){ // 调整body宽度
  516. // alert('resize');
  517. if(_simple_style){
  518. if(window.innerWidth>1600)
  519. GM_addStyle("body {width:65%;}");
  520. else if(window.innerWidth>1400)
  521. GM_addStyle("body {width:75%;}");
  522. else if(window.innerWidth>1200)
  523. GM_addStyle("body {width:85%;}");
  524. else
  525. GM_addStyle("body {width:980px;}");
  526. }
  527. }
  528. function onAttachImageLoaded(){ // 附件图片加载完成后修改宽度
  529. var newimg = new Image();
  530. newimg.src =this.src;
  531. if(newimg.width<=_att_max_width ){
  532. this.width=newimg.width;
  533. //去除zoom
  534. this.removeAttribute('onclick');
  535. this.className="nozoom";
  536. }
  537. else
  538. this.width=_att_max_width;
  539. }
  540. function onLoadNewPage(req){ // 后台读取页面完毕
  541. try {
  542. if (req.status == 200) {
  543. var newPageHTML = req.responseText.substring(req.responseText.indexOf('<table summary="forum_'),req.responseText.indexOf('</form>'));
  544. var newPageThread= newPageHTML.substring(newPageHTML.indexOf('<tbody id="normalthread_'),newPageHTML.indexOf('</table>'));
  545. var threadList = document.getElementsByName("moderate")[0].getElementsByClassName("datatable")[0];
  546. // 增加预取了页面的提示
  547. 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>";
  548. threadList.innerHTML = threadList.innerHTML + newpagetip + newPageThread;
  549. // 去除预取页面对应的选择导航按钮
  550. var pagenav=document.evaluate("//div[@class='pages']//a",
  551. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  552. for(var btncnt=pagenav.snapshotLength-1;btncnt>=0;btncnt--){
  553. var btn=pagenav.snapshotItem(btncnt);
  554. if(btn.text == _pc)btn.parentNode.removeChild(btn);
  555. }
  556. }
  557. } catch (e) {}
  558. refreshMinTime();
  559. _max_read_pages--;
  560. if( _max_read_pages && (timeDiff(_pmt,_lvt))){
  561. _pc++;
  562. GM_xmlhttpRequest({
  563. method: 'GET',
  564. url: 'http://'+document.domain+'/forum/forumdisplay.php?fid='+_fid+'&page='+_pc,
  565. onload: onLoadNewPage,
  566. overrideMimeType: "text/html; charset=gbk"
  567. });
  568. }
  569. processHighlightColor();
  570. processBlackList();
  571. }
  572. function onSynReply(req){ // 同步时,服务器返回结果
  573. document.getElementById('s_syn').className="disabled";
  574. // try {
  575. _syn_pending=false;
  576. if (req.status == 200) { // 200 OK
  577. var response=JSON.parse(req.responseText);
  578. // alert(response.list); // 输出中文,不乱码
  579. // response.result
  580. // .version
  581. // .list
  582. var nowtimestamp=getNowTimeStamp();
  583. switch(response.result){
  584. case "0": // 无更新
  585. document.getElementById('s_syn').style.background='#88ff88';
  586. document.getElementById('s_syn').innerHTML="√ 无更新";
  587. GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
  588. break;
  589. case "1": // OK,本地覆盖了服务器,返回新的版本号
  590. _syn_lastversion = response.version;
  591. _syn_modified = false;
  592. GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion);
  593. GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
  594. document.getElementById('s_syn').style.background='#88ff88';
  595. document.getElementById('s_syn').innerHTML="√ 已同步";
  596. GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
  597. break;
  598. case "2": // 服务器有更高版本覆盖本地列表
  599. var newblacklistArray = new Array();
  600. if( response.list )
  601. newblacklistArray = response.list.split(",");
  602. GM_setValue("HiPDA_Discovery_BLACK_LIST",newblacklistArray.join());
  603. _syn_lastversion = response.version;
  604. GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion);
  605. _syn_modified = false;
  606. GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
  607. document.getElementById('s_syn').style.background='#88ff88';
  608. document.getElementById('s_syn').innerHTML="√ 已更新";
  609. GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
  610. break;
  611. case "3": // 冲突 TODO
  612. serverBlacklist = new Array();
  613. if( response.list )
  614. serverBlacklist = response.list.split(",");
  615. serverListStr = serverBlacklist.join();
  616. document.getElementById('s_syn').addEventListener('click', processConflict, false);
  617. serverVersion = response.version;
  618. _syn_pending = true;
  619. processConflict();
  620. document.getElementById('s_syn').style.background='#f00';
  621. document.getElementById('s_syn').style.color='#fff';
  622. document.getElementById('s_syn').innerHTML="! 有冲突";
  623. document.getElementById('s_syn').title="版本有冲突";
  624. break;
  625. case "4": // 参数错误
  626. document.getElementById('s_syn').style.background='#f00';
  627. document.getElementById('s_syn').style.color='#fff';
  628. document.getElementById('s_syn').innerHTML="X 参数错误";
  629. document.getElementById('s_syn').title=response.list;
  630. break;
  631. case "5": // 频繁刷新
  632. document.getElementById('s_syn').style.background='#f00';
  633. document.getElementById('s_syn').style.color='#fff';
  634. document.getElementById('s_syn').innerHTML="服务器忙";
  635. document.getElementById('s_syn').title="限定10s一次";
  636. break;
  637. case "500": // 服务器错误
  638. document.getElementById('s_syn').style.background='#f00';
  639. document.getElementById('s_syn').style.color='#fff';
  640. document.getElementById('s_syn').innerHTML="服务器错误";
  641. break;
  642. default:
  643. document.getElementById('s_syn').innerHTML="! 未知错误";
  644. }
  645. refreshConfigDiv();
  646. }
  647. else { // 500,404,443,...
  648. document.getElementById('s_syn').style.background='#f00';
  649. document.getElementById('s_syn').style.color='#fff';
  650. document.getElementById('s_syn').innerHTML="X 网络错误";
  651. }
  652. // }
  653. // catch (e) {
  654. // document.getElementById('s_syn').style.background='#f00';
  655. // document.getElementById('s_syn').style.color='#fff';
  656. // document.getElementById('s_syn').innerHTML="! 格式错误";
  657. // }
  658. }
  659. function onSynChooseBtn(choose){ // 同步冲突界面选择按钮
  660. var nowtimestamp=getNowTimeStamp();
  661. switch (choose){
  662. case 0: // 使用 新列表
  663. // 把配置界面显示出来,等待服务器回应
  664. document.getElementById('hp_cfg_div').style.display = "";
  665. document.getElementById('s_syn').style.background='#999';
  666. document.getElementById('s_syn').innerHTML="同步中...";
  667. // _syn_pending=false;
  668. // 获取新列表
  669. var r = document.getElementsByClassName('hpdtool_syn_chk_new');
  670. for (var i = r.length-1; i >= 0; i--)
  671. if(r[i].checked)
  672. newBlacklist.push(r[i].value);
  673. // 存储新列表,服务器的版本号,标志已修改
  674. GM_setValue("HiPDA_Discovery_BLACK_LIST",newBlacklist.join());
  675. _syn_lastversion = serverVersion;
  676. GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion);
  677. _syn_modified = true;
  678. GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
  679. GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
  680. document.getElementById('s_syn').removeEventListener('click', processConflict, false);
  681. // 向服务器发起请求
  682. var data={
  683. "uid":_uid,
  684. "lastversion":_syn_lastversion,
  685. "modified":_syn_modified,
  686. "action":"update",
  687. "blacklist":newBlacklist
  688. };
  689. GM_xmlhttpRequest({
  690. method: 'GET',
  691. url: 'http://hipdatool.sinaapp.com/sync.php?data='+JSON.stringify(data),
  692. onload: onSynReply,
  693. overrideMimeType: "text/html; charset=gbk"
  694. });
  695. break;
  696. case 1: // 使用 服务器
  697. GM_setValue("HiPDA_Discovery_BLACK_LIST",serverBlacklist.join());
  698. _syn_lastversion = serverVersion;
  699. GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion);
  700. _syn_modified = false;
  701. GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
  702. document.getElementById('s_syn').style.background='#88ff88';
  703. document.getElementById('s_syn').innerHTML="√ 已更新";
  704. GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp);
  705. refreshConfigDiv();
  706. document.getElementById('hp_cfg_div').style.display = "";
  707. document.getElementById('s_syn').removeEventListener('click', processConflict, false);
  708. _syn_pending=false;
  709. break;
  710. case 2: // 使用 本地
  711. // 把配置界面显示出来,等待服务器回应
  712. document.getElementById('hp_cfg_div').style.display = "";
  713. document.getElementById('s_syn').style.background='#999';
  714. document.getElementById('s_syn').innerHTML="同步中...";
  715. // _syn_pending=false;
  716. // 向服务器发起请求
  717. var data={
  718. "uid":_uid,
  719. "lastversion":_syn_lastversion,
  720. "modified":_syn_modified,
  721. "action":"update",
  722. "blacklist":blacklistArray
  723. };
  724. GM_xmlhttpRequest({
  725. method: 'GET',
  726. url: 'http://hipdatool.sinaapp.com/sync.php?data='+JSON.stringify(data),
  727. onload: onSynReply,
  728. overrideMimeType: "text/html; charset=gbk"
  729. });
  730. document.getElementById('s_syn').removeEventListener('click', processConflict, false);
  731. break;
  732. default:
  733. _syn_pending=false;
  734. }
  735. document.getElementById('hpdtool_syn_list').innerHTML="";
  736. document.getElementById('hpdtool_syn_div').style.display = 'none';
  737. }
  738. function onClickSynBtn(){ // 点击同步按钮
  739. if(_syn_pending)return;
  740. if(_uid == 0) return;
  741. if(document.getElementById('s_syn').className=="disabled")return;
  742. _syn_pending=true;
  743. document.getElementById('s_syn').style.background='#999';
  744. document.getElementById('s_syn').innerHTML="同步中...";
  745. var data={
  746. "uid":_uid,
  747. "lastversion":_syn_lastversion,
  748. "modified":_syn_modified,
  749. "action":"sync",
  750. "blacklist":blacklistArray
  751. };
  752. GM_xmlhttpRequest({
  753. method: 'GET',
  754. url: 'http://hipdatool.sinaapp.com/sync.php?data='+JSON.stringify(data),
  755. onload: onSynReply,
  756. overrideMimeType: "text/html; charset=gbk"
  757. });
  758. }
  759. function onPageUnload(){ // 关闭页面时保存参数
  760. _lvt = year + "-" + month + "-" + day + " " + hour + ":" + min;
  761. if((_pc == 1)&&(timeDiff(_lvt,_pxt)))
  762. GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,_lvt);
  763. }
  764. function onSaveConfig(save){ // [保存]、[取消]按钮触发,保存hpd-tool参数以及黑名单编辑结果
  765. if(save){
  766. var r = document.getElementsByClassName('bl_chk');
  767. blacklistArray = new Array();
  768. for (var i = r.length-1; i >= 0; i--)
  769. if(r[i].checked)
  770. blacklistArray.push(r[i].value);
  771. GM_setValue('HiPDA_Discovery_BLACK_LIST',blacklistArray.join());
  772. if(blacklistLen != blacklistArray.length){ // 列表长度变化,表示列表进行了修改
  773. _syn_modified = true;
  774. GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified);
  775. // 重新激活同步按钮
  776. document.getElementById('s_syn').className="enable";
  777. document.getElementById('s_syn').innerHTML="₪ 同步";
  778. document.getElementById('s_syn').style.background='#eef9eb';
  779. document.getElementById('s_syn').style.color='#000';
  780. }
  781. blacklistLen=blacklistArray.length;
  782. blacklistStr=blacklistArray.toString();
  783. var temp = document.getElementById('_chk_hightlight_color').value;
  784. if(RegExp("#[A-F,a-f,0-9]{6}").test(temp)){
  785. var t = temp.indexOf("#");
  786. _hightlight_color = temp.substr(t,7);
  787. }/*else alert('wrong color');
  788. alert(_hightlight_color);*/
  789. GM_setValue("HiPDA_Discovery_HIGHLIGHT_COLOR",_hightlight_color);
  790.  
  791. var rd=document.getElementsByName('_radio_font_size');
  792. for(var i=0;i<rd.length;i++)
  793. if(rd[i].checked)_font_size = rd[i].value;
  794. GM_setValue("HiPDA_Discovery_FONT_SIZE",_font_size);
  795. // _hightlight_en = document.getElementById('_chk_hightlight_en').checked;
  796. // _blacklist_en_hpd = document.getElementById('_chk_blacklist_en_hpd').checked;
  797. // _blacklist_en_other = document.getElementById('_chk_blacklist_en_other').checked;
  798. // _simple_style = document.getElementById('_chk_simple_style').checked;
  799. // _hover_style = document.getElementById('_chk_hover_style').checked;
  800. // _reply_avatar = document.getElementById('_chk_reply_avatar').checked;
  801. _hightlight_en = document.getElementById('_chk_hightlight_en').checked;
  802. _blacklist_en_hpd = document.getElementById('_chk_blacklist_en_hpd').checked;
  803. _blacklist_en_other = document.getElementById('_chk_blacklist_en_other').checked;
  804. _simple_style = document.getElementById('_chk_simple_style').checked;
  805. _hover_style = document.getElementById('_chk_hover_style').checked;
  806. _reply_avatar = document.getElementById('_chk_reply_avatar').checked;
  807. GM_setValue("HiPDA_Discovery_HIGHLIGHT_ENABLE",_hightlight_en);
  808. GM_setValue("HiPDA_Discovery_BLACKLIST_ENABLE_HPD",_blacklist_en_hpd);
  809. GM_setValue("HiPDA_Discovery_BLACKLIST_ENABLE_OTHER",_blacklist_en_other);
  810. GM_setValue("HiPDA_Discovery_SIMPLE_STYLE",_simple_style);
  811. GM_setValue("HiPDA_Discovery_HOVER_STYLE",_hover_style);
  812. GM_setValue("HiPDA_Discovery_REPLY_AVATAR",_reply_avatar);
  813. }
  814. document.getElementById('hp_cfg_div').style.display = (document.getElementById('hp_cfg_div').style.display == 'none')?'':'none';
  815. changeFontSize(true);
  816. processBlackList();
  817. };
  818. // 论坛信息
  819. function readPageURL(){ // 取得当前的tid和page值
  820. var offset = window.location.search.indexOf("page=");
  821. if(offset>0){
  822. var t = window.location.search.substr(offset);
  823. if(t.indexOf("&") >0){
  824. _pc = t.slice(5,t.indexOf("&"));
  825. }else{
  826. _pc = t.slice(5);
  827. }
  828. }else{
  829. _pc = 1;
  830. }
  831. offset = window.location.search.indexOf("tid=");
  832. if(offset>0){
  833. var t = window.location.search.substr(offset);
  834. if(t.indexOf("&") >0){
  835. _tid = t.slice(4,t.indexOf("&"));
  836. }else{
  837. _tid = t.slice(4);
  838. }
  839. }
  840. }
  841. function refreshMinTime(){ // 取得当前页面的 _pmt —— 包含预读取的后续页面内容
  842. var snapResults3 = document.evaluate("//td [@class='lastpost']",
  843. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  844. for (var i = snapResults3.snapshotLength - 1; i >= 0; i--){
  845. var e = snapResults3.snapshotItem(i);
  846. //如果是置顶帖子,就不要取时间值
  847. var checkTop = e.parentNode.getElementsByClassName('folder');
  848. if(checkTop[0] != undefined){
  849. if(checkTop[0].innerHTML.indexOf('images/default/pin')<0 && checkTop[0].innerHTML.indexOf('images/default/folder_lock')<0 ){
  850. var _rt = e.getElementsByTagName('a')[1].text;
  851. if(timeDiff(_pmt,_rt))
  852. _pmt = _rt;
  853. }
  854. //else alert(e.getElementsByTagName('a')[1].text);
  855. }
  856. }
  857. }
  858. // 论坛界面修改
  859. function changeURL(){ // 把cnc页面上的连接都换成cnc.hi-pda.com
  860. var url = document.evaluate("//a",
  861. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  862. for(var i = url.snapshotLength-1;i>=0;i--){
  863. var a=url.snapshotItem(i);
  864. a.href=a.href.replace(/www.hi-pda.com/,document.domain);
  865. };
  866. }
  867. function changeFontSize(save){
  868. var sz=_font_size;
  869. if(save == false){ // 即时预览,未保存字体大小
  870. var rd=document.getElementsByName('_radio_font_size');
  871. for(var i=0;i<rd.length;i++){
  872. if(rd[i].checked == true)
  873. sz=rd[i].value;
  874. }
  875. }
  876. 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;}";
  877. GM_addStyle(fnt);
  878. fnt = ".postauthor dt {width:"+4*sz+"px} .mainbox td.postauthor{width:180px} .forumcontrol .modaction{width:150px;}";
  879. GM_addStyle(fnt);
  880. }
  881. function changeStyle(){ // 改变页面风格
  882. // 好孩子看不见
  883. GM_addStyle(".goodboysglasses {color:red;font-size:16;border:1px solid #ff0000;padding:15px 15px 15px 52px;width:75%;margin:20px 30px}");
  884. GM_addStyle(".goodboysglasses {background:url(data:img/png;base64,\
  885. iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
  886. bWFnZVJlYWR5ccllPAAAAqJJREFUeNrsV09rE0EUf7s7k91tTENBQ6FYegoUJRX8AiJegt5UUKkJ\
  887. JLd8A+9+gV5yS0KuirdC9SO0Fy8WwUuzh0hbYou20fyd9b1hdpumZbPohlzy4JHNZOb9fvN7895s\
  888. NNd1YZamw4xtTmBOQEPn9Xr9AKthRdM0yOfzJo71poQXQ6wuVZ4Q4kOhUHhBCiwQ+IOHjyCdXoda\
  889. rdalidMAp9iEQVi6rj/FMZsImMSI6Qasrt6GzMY9IJYRk5A7p9iEQViq/5j+GbBsE/b2duF7swmU\
  890. CrR4hATiFJNiEwZheWeQ+QRME05OfkCxWMzi1+Oo9c/lcvfxI1WpVHYIyzNJgOTgOKh2fqAItCPE\
  891. b6u4bcIgLO8K8BWIMcN7PFUepfWU8zGsCwJkg8EAqtXq0TTrnjBGzSfQ6XRhc/O1l4apGUlPWJcI\
  892. EGir1UJ9BOgT8AWm7s9AgIs9zCNLQV1dB82yQNONYAJiCEa/76/1FUhiaSy+/YwJmsCg58Lpmwwc\
  893. /TyDr/tf5ND6nbuweCsF+0tJmKQfHb3Mr/OrKTBNfIzbcCMWfD2ccwE2kt39+InaNpUsNa6dxy9f\
  894. QSLE5SII1LauEmCM4em0wGTBIXpCAOcMhsOhV7LymcYS6nKZpAAbrwLKoU4EuIkeTCDmCjl3pGSl\
  895. cdU6wxDgCvNyGWJQZliSgBbEfijk3HGjPSVCVoJx/fsAg9zGEnQGHGWOXev0G80Zax8XCjx7LlUI\
  896. dJzDx/sANodDp9FY3squwVZ28g5wrlwz0lwOHcdZXnv/LpQCDcfx15PaScMw0uVyeZtzngoToN/v\
  897. H5dKpSd4+L5JSf9jvabUu4m+otIYppLO0JvoLTX2z+u1kRQuUDsIeY6ol/6mzUS0foYvpfO/ZnMC\
  898. sybwV4ABAEMXBDR9AlSHAAAAAElFTkSuQmCC) no-repeat 10px 5px");
  899. if(_simple_style){ // 启用了精简风格
  900. onWindowResize();
  901. GM_addStyle("\
  902. body {margin:0 auto;background:#f0f0f0;}\
  903. .postact {line-height:20px}\
  904. .postact a,body, td, input, textarea, select, button,.posterinfo em {color:#222222 !important;}\
  905. .postauthor em a {color:#222222}\
  906. .postactions {border-top:0px}\
  907. .postinfo {border-bottom:0px}\
  908. .authorinfo em {margin:0px}\
  909. .posterinfo {color:#ffffff}\
  910. .posterinfo:hover {color:#222222}\
  911. .posterinfo:hover a {color:#222222}\
  912. .posterinfo .pagecontrol {display:none}\
  913. .posterinfo:hover .pagecontrol {display:block}\
  914. .authorinfo a {color:#ffffff}\
  915. .authorinfo:hover a {color:#222222}\
  916. #header .wrap {padding:0}\
  917. #umenu a {margin:0 2px}\
  918. #umenu {position:static;float:right}\
  919. .threadad td.postauthor,.adcontent {background: #f0f0f0;}\
  920. .signatures {font-size: 13px;color:#222222;max-height:100px !important;}\
  921. #moderate .colplural,.icon,#forumheader {display:none}\
  922. #nav {color:#000000;text-indent:0px;background:none;margin-bottom:8px;}\
  923. #nav a,#footlink,#footlink a,#rightinfo,#rightinfo a{color:#000000}\
  924. .datatable .subject{padding:2px 5px;}\
  925. td,.subject{font:13px/1.4em Verdana,Helvetica,Arial,sans-serif;}\
  926. ");
  927. }
  928. changeFontSize();
  929. if(!_hover_style){ // 用户 注册、积分、发帖数 等显示在头像下方
  930. var s = document.evaluate("//td[@class='postauthor']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  931. for (var i = s.snapshotLength - 1; i >= 0; i--) {
  932. var userdata=s.snapshotItem(i).getElementsByTagName('dl')[0];
  933. if(userdata != undefined){
  934. userdata.style.margin="0px 10px 0px 20px";
  935. // 去掉了一些项目
  936. userdata.removeChild(userdata.lastChild);
  937. userdata.removeChild(userdata.lastChild);
  938. var regtime1=userdata.lastChild;
  939. userdata.removeChild(userdata.lastChild);
  940. var regtime2=userdata.lastChild;
  941. userdata.removeChild(userdata.lastChild);
  942. userdata.removeChild(userdata.lastChild);
  943. userdata.removeChild(userdata.lastChild);
  944. userdata.appendChild(regtime2);
  945. userdata.appendChild(regtime1);
  946. s.snapshotItem(i).appendChild(userdata);
  947. // 去除头像悬停菜单
  948. var avatar=s.snapshotItem(i).getElementsByClassName('avatar')[0];
  949. avatar.removeAttribute('onmouseover');
  950. }
  951. }
  952. GM_addStyle(".postauthor dt,.postauthor dd {color:#222222;height:1.2em;line-height:1.2em;}");
  953. }
  954. if(!_reply_avatar && _bVIEWTHREAD>0 && document.getElementById('fastpostform') )document.getElementById('fastpostform').getElementsByClassName('avatar')[0].innerHTML="";
  955. // 【发表回复】、【发表新帖】
  956. if(document.getElementById('post_reply')) document.getElementById('post_reply').getElementsByTagName('a')[0].innerHTML="发表回复";
  957. if(document.getElementById('newspecial')) document.getElementById('newspecial').innerHTML="发表新帖";
  958. if(document.getElementById('newspecialtmp')) document.getElementById('newspecialtmp').innerHTML="发表新帖";
  959. 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}");
  960.  
  961. // 顶部菜单
  962. if(document.getElementById('menu')){
  963. document.getElementById('menu').style.display='none';
  964. if(_uid>0){
  965. document.getElementById('umenu').appendChild(document.createTextNode(" | "));
  966. var menuitem=document.createElement('a');
  967. menuitem.innerHTML="搜索";
  968. menuitem.href='http://'+document.domain+'/forum/search.php';
  969. document.getElementById('umenu').appendChild(menuitem);
  970. document.getElementById('umenu').appendChild(document.createTextNode(" | "));
  971. menuitem=document.createElement('a');
  972. menuitem.innerHTML="我的主题";
  973. menuitem.target="_blank";
  974. menuitem.href='http://'+document.domain+'/forum/my.php?item=threads';
  975. document.getElementById('umenu').appendChild(menuitem);
  976. document.getElementById('umenu').appendChild(document.createTextNode(" "));
  977. menuitem=document.createElement('a');
  978. menuitem.innerHTML="我的回复";
  979. menuitem.target="_blank";
  980. menuitem.href='http://'+document.domain+'/forum/my.php?item=posts';
  981. document.getElementById('umenu').appendChild(menuitem);
  982. document.getElementById('umenu').appendChild(document.createTextNode(" "));
  983. menuitem=document.createElement('a');
  984. menuitem.innerHTML="我的收藏";
  985. menuitem.target="_blank";
  986. menuitem.href='http://'+document.domain+'/forum/my.php?item=favorites&type=thread';
  987. document.getElementById('umenu').appendChild(menuitem);
  988. }
  989. }
  990. // 下一页
  991. // var nextpageurl=document.getElementsByClassName('pages')[1].getElementsByClassName('next')[0];
  992. // if(nextpageurl != undefined){
  993. // 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;}");
  994. // var nextpagebtn=document.createElement('div');
  995. // nextpagebtn.className="thread-follow-page";
  996. // nextpagebtn.innerHTML="<a href='"+nextpageurl.href+"'>点击显示下一页</a>"
  997. // var pagenav=document.getElementsByClassName('forumcontrol')[1];
  998. // if(pagenav != undefined){
  999. // document.getElementsByTagName('body')[0].appendChild(nextpagebtn);
  1000. // document.getElementById('wrap').insertBefore(nextpagebtn,pagenav);
  1001. // }
  1002. // }
  1003. }
  1004. function appendControl(){ // 添加[屏蔽]按钮
  1005. var s = document.evaluate("//div[@class='authorinfo']",
  1006. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1007. for (var i = s.snapshotLength - 1; i >= 0; i--) {
  1008. var t = s.snapshotItem(i);
  1009. var a1=document.createElement('a');
  1010. a1.innerHTML = '屏蔽';
  1011. a1.href = '###';
  1012. a1.addEventListener('click', onBlockUser,false);
  1013. t.appendChild(document.createTextNode(" | "));
  1014. t.appendChild(a1);
  1015. }
  1016. };
  1017. function addConfigDiv(){ // 添加Alt+O的界面
  1018. // 处理冲突界面
  1019. GM_addStyle('\
  1020. #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;}\
  1021. #hpdtool_syn_div hr {color: #bfbfbf;border: 1px solid;margin: 8px 0;}\
  1022. #hpdtool_syn_div,#hpdtool_syn_div td,.hpdtool_syn_srv,.hpdtool_syn_lcl {color:#ffffff !important;}\
  1023. #hpdtool_syn_list {margin-left:5px;max-height:600px;overflow:auto;}\
  1024. #hpdtool_syn_div a {padding:2px 5px;-moz-border-radius: 4px;background: #eef9eb;width: 50px;border: 1px solid #aaa;}\
  1025. #hpdtool_syn_div a:hover {border: 1px solid #aaa;background: #fff;color: #000;}\
  1026. #hpdtool_syn_div .hpdtool_syn_new {width:45px;text-align:center;border-right:1px solid #fff;}\
  1027. #hpdtool_syn_div .hpdtool_syn_srv {width:78px;max-width:78px;text-align:center;border-right:1px solid #fff;padding:2px 5px;}\
  1028. #hpdtool_syn_div .hpdtool_syn_lcl {width:78px;max-width:78px;text-align:center;padding:2px 5px;}\
  1029. ');
  1030. var hpdtool_syn = document.createElement("div");
  1031. hpdtool_syn.id = "hpdtool_syn_div";
  1032. hpdtool_syn.style.display = "none";
  1033. hpdtool_syn.innerHTML = "<div class='locker'><center><font face='Impact' size=3>同步冲突处理</font></center><hr>\
  1034. 本地与服务器黑名单差异部分,<b>相同部分已省略</b>。请点选对应的列表进行同步。\
  1035. <div id='hpdtool_syn_list'></div><br />\
  1036. <a href='javascript:void(0)' id='hpdtool_use_new' >新列表</a>\
  1037. <a href='javascript:void(0)' id='hpdtool_use_server' >服务器列表</a>\
  1038. &nbsp;&nbsp;<a href='javascript:void(0)' id='hpdtool_use_local' >本地列表</a>\
  1039. &nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:void(0)' id='hpdtool_use_nothing' >保持不变</a></div>";
  1040. document.getElementsByTagName('body')[0].appendChild(hpdtool_syn);
  1041. document.getElementById('hpdtool_use_new').addEventListener('click', function(){onSynChooseBtn(0);}, false);
  1042. document.getElementById('hpdtool_use_server').addEventListener('click', function(){onSynChooseBtn(1);}, false);
  1043. document.getElementById('hpdtool_use_local').addEventListener('click', function(){onSynChooseBtn(2);}, false);
  1044. document.getElementById('hpdtool_use_nothing').addEventListener('click', function(){onSynChooseBtn(3);}, false);
  1045. // Alt+O 控制界面
  1046. GM_addStyle('\
  1047. #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;}\
  1048. #hp_cfg_div input {height: 12px}\
  1049. #hp_cfg_div hr {color: #bfbfbf;border: 1px solid;margin: 8px 0;}\
  1050. #hp_cfg_div a {-moz-border-radius: 4px;background: #eef9eb;width: 50px;border: 1px solid #aaa;}\
  1051. #hp_cfg_div a:hover {border: 1px solid #aaa;background: #fff;color: #000;}\
  1052. #s_ok,#s_cl,#s_syn {padding:2px 5px;}\
  1053. #blacklist {margin-left:5px;max-height:600px;overflow:auto;}\
  1054. #_chk_hightlight_color {margin-left:4px;}\
  1055. ');
  1056. var hp_cfg = document.createElement("div");
  1057. hp_cfg.id = "hp_cfg_div";
  1058. hp_cfg.style.display = "none";
  1059. hp_cfg.innerHTML = '<center><font face="Impact" size=3 title="来自D版带着爱">hi-pda &hearts; tool</font> <sub>version 5.0</sub></center><hr />\
  1060. 字体大小:\
  1061. <input type="radio" id="_font_size_13px" name="_radio_font_size" value="13" /><font size=2>小</font>\
  1062. <input type="radio" id="_font_size_14px" name="_radio_font_size" value="14" /><font size=3>中</font>\
  1063. <input type="radio" id="_font_size_16px" name="_radio_font_size" value="16" /><font size=4.5>大</font>\
  1064. <br />\
  1065. 界面风格:\
  1066. <cite title="精简界面风格" ><input type="checkbox" id="_chk_simple_style" />简版</cite>\
  1067. <cite title="用户信息显示在悬浮菜单,不选则显示在头像下方" ><input type="checkbox" id="_chk_hover_style" />头像菜单</cite>\
  1068. <cite title="回帖时显示自己头像" ><input type="checkbox" id="_chk_reply_avatar" />回帖头像</cite>\
  1069. <br />\
  1070. 新帖高亮:\
  1071. <input id="_chk_hightlight_en" type="checkbox" />启用\
  1072. <input id="_chk_hightlight_color" type="text" style="width:65px;height:18px;" title="HTML颜色代码,&#13;输入无效代码将使用原来的设置" value="未定义"/><br />\
  1073. 屏蔽用户:\
  1074. <input id="_chk_blacklist_en_hpd" type="checkbox" />D版\
  1075. <input id="_chk_blacklist_en_other" type="checkbox" />其他\
  1076. <br />\
  1077. <div id="blacklist"></div><br /><br />\
  1078. <div align="center">\
  1079. <a href="javascript:void(0)" id="s_ok" >√ 确定</a>\
  1080. &nbsp;\
  1081. <a href="javascript:void(0)" id="s_cl" >X 取消</a>\
  1082. &nbsp;&nbsp;&nbsp;&nbsp;\
  1083. <a href="javascript:void(0)" id="s_syn" >₪ 同步</a>\
  1084. <br />\
  1085. </div>\
  1086. ';
  1087. document.getElementsByTagName('body')[0].appendChild(hp_cfg);
  1088. if(_uid == 0){
  1089. document.getElementById('s_syn').innerHTML="未登录";
  1090. document.getElementById('s_syn').href="http://"+document.domain+"/forum/logging.php?action=login";
  1091. }
  1092. document.getElementById('s_ok').addEventListener('click', function(){onSaveConfig(true);}, false);
  1093. document.getElementById('s_cl').addEventListener('click', function(){onSaveConfig(false);}, false);
  1094. document.getElementById('s_syn').addEventListener('click', function(){onClickSynBtn(false);}, false);
  1095. document.getElementById('_font_size_13px').addEventListener('click', function(){changeFontSize(false);}, false);
  1096. document.getElementById('_font_size_14px').addEventListener('click', function(){changeFontSize(false);}, false);
  1097. document.getElementById('_font_size_16px').addEventListener('click', function(){changeFontSize(false);}, false);
  1098. addHotKey('alt+O',function(){if(_syn_pending)return;refreshConfigDiv();onSaveConfig(false); });
  1099. addHotKey('Esc',function(){if(_syn_pending)return;else document.getElementById('hp_cfg_div').style.display = 'none'});
  1100. }
  1101. function readConfig(){
  1102. grave_image="url(data:img/png;base64,\
  1103. iVBORw0KGgoAAAANSUhEUgAAAJYAAACECAYAAAEFGOLkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
  1104. bWFnZVJlYWR5ccllPAAAA1xpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp\
  1105. bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6\
  1106. eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz\
  1107. NDM0MiwgMjAxMC8wMS8xMC0xODowNjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo\
  1108. dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw\
  1109. dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu\
  1110. MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz\
  1111. b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N\
  1112. Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMTIxRTYyMzYxMjZFMTExOTA1MkM0NDMxNTJG\
  1113. QzY0QSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyNUI0ODYyNDI2NjgxMUUxOEFEMkMyMzg3\
  1114. QkVENjI2OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyNUI0ODYyMzI2NjgxMUUxOEFEMkMy\
  1115. Mzg3QkVENjI2OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1Ij4gPHhtcE1N\
  1116. OkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDEyMUU2MjM2MTI2RTExMTkw\
  1117. NTJDNDQzMTUyRkM2NEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDEyMUU2MjM2MTI2RTEx\
  1118. MTkwNTJDNDQzMTUyRkM2NEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94Onht\
  1119. cG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5AxfV3AAAPxElEQVR42mL8//8/A7UAEwMVAQuMsfX8\
  1120. IRCF7ExGZIXehnbEG4ZmEJgPNIDx27dvYA6UxmoZFxcXdm/euX4LoZqRqRyfZQTDTEVTDc7ecu5A\
  1121. B4o3hE1RaHQDkQ2bjCUYfpISAYzISQMYCR+AFD+6Ikd1E7xmwMKMEVc6Axr8n2qGwQCWWMRpGFUT\
  1122. 7aAz7P+Auew/WekMFzh06BA+Qxnt7OxI9uZ2LGKrkTkAAcQ4uAtHaMG4HogDoOJ5yBmfmIIR7k2g\
  1123. YTpA9mU0OQ6gIT9hhSOWmMVZOF4+svsAmHHh5FmYmh/AwpGBnMKxzMbVAcwwMDdGqP7/D0UjUqGI\
  1124. 15s40xGw+GEkudQAVR7YVO6/eaaZrKQBMhBqaB6ScA3VstNo4UiT8ow2JS2xheM5IGWIReoOsGBU\
  1125. JdVlRljEvgCxKrIAQABRtXCkScMRqYxEB2JA/IoYw4gtQ0l2GJGp6hjQAdZoOReDjcVMRnyGwnI3\
  1126. rnQBdxRS2Y0CXjx9ZgVquIHKc7QyHd0cZMyAhU9evkSuBwqi0+BsWKUDbDhvo6BdQtCB6G1jkho8\
  1127. QCAArGs+YnMUrBL78/Y0nA9j46t2cYYYrvoJB/gArLdysIUUyBHIDsHiKLyBgBFi6DkLuSNAADwB\
  1128. hp4MOYUpthCjuBxDyonkGsRIVFQOFjDqsKHosP+07GL+p7bjWKjRdsI3aoTD0YyEQoxqzR5go41s\
  1129. g4CNOoxCHSCABmV7jGk0N1Kp1SoLxI8HQ4sV5JBH+OoxWgOMhE6o5YDeBMLTdEbP+kQ3o5lIbcqQ\
  1130. 0NxBL2DJbz7vWLcZ0aH79BlFDtbWh7XpCbTrye0mYxvwVge34Wsyi8GOANHgruv1Www8fLwMHeUN\
  1131. DHM2L6PIUkJqsHoV5LCEvHSGBZNmMXgE+aLI5VQXM0hIS1HiINISOgnpBQRMgIn+LK5xO+ROBY4O\
  1132. Bs5OBnpIzSLBUWdICSVCw3k4ow/o83RSghkYsmLEqMMRSsSnKRK7Yi+JdQgpDmMipoDEB4D9Q6o3\
  1133. M5gIlNx5A+EwottTwPSjAqRmArETFumfwM4qO7l9QvTcN9CdVaKKhNFG3mB11P/RkBp1FC2bLIN6\
  1134. wGOwRN9/WozAjLAeMrmVOp6+3X8CdR5WfRQ7ClSRHjp0CGToKhKiEqZuPhAnwRY/UDv6QFMooWTo\
  1135. S4R6hurRBwJeUHoeEBswYJ/1RAbnQV1JIA7DJgkQQIN2EnO0+hsNrJEDWPD0rbAJd0H7WsY4tIHW\
  1136. OZYyYF8DSTSg5kAqvVMWaCnXD2g1UYonoEAA1DmdxIAYVlw/IlIWFJwhEDiEQAA00AKBqWUDgQ43\
  1137. XjEym3Ukj7ijzzITm7JmUhhQyGA9MFvPpFK7l5TZR2rMVBJuOiCP1ILWo4DGsGHrUu5cv8kwYeks\
  1138. 8Ng2aAAexAeNeYOGknNqihnWLFjGAFrreOfaLQYVLTUwDV37mOdj5IBSnn39+oWenQNGWqUsMAAF\
  1139. Bmh2ArSwR0JGkuHIngMMLdN74fJgcWAgvXjyHBxQEDEThjXzl0MmCcoakJfhT9py7gCoghCEtkRD\
  1140. 6ZkyKDULX2CB52hAHoZN3+xYu4WBh5eXoSAaMugtIS0JnjEBpZo5m5fBZ1NA2wpAAfvi6TOwHA8f\
  1141. D7K5e4H4PbSVvJocj+EbridiKP8/LbIhTfrGUPAYWODLESjM/xMKDPSRe3xyxGZJSrKhKo0CSxYY\
  1142. GQvoOYBB6wIe3jgEsi9D21vUBlcc1U10BzCwGKlawENb1CAPgdazPqayY3VA0z9AHD/YUxXRKQuL\
  1143. XACNWucfgSmNn57+JyVlkRVYWNSC1q2AFgrXUMED34H4Bah/CQy4viERWPQCWGrD/4M1ZY0O0VB5\
  1144. 1GEUjAbWaGDRtK84mrJGA2tkBNb/wWznaMoiIcCYRniqIsl+ptGAIt4dTKMBRTxgGQRuYGQgb1qL\
  1145. orWq5OhnGSSRBvbEmTNncMmDJm5BExygqSDQgL4EA2Rk4jYQ22ppaeHtAAPNXQ3VizPwTUxMCDty\
  1146. MK2iOXToEGhpUOIAWO1lZ2e3fag1HZIYKFwnQQYApbrtRCX/0fVZxAOAAOydv2sUQRTHZyFlNNqE\
  1147. NFrIBQu1ULcSAtEqhgRyJPirOhSuS2otBMFUlmJjpRYSy/wDmkpBiD9AG0EsoqixNNfKOt/Zmc1m\
  1148. szv7a2Zvd/MehL3L/v7sm7ezN9/3lmDRsyHBIlgEi2CRxfbgE/SkcZY54T6r1VVPWsSzoCndZru6\
  1149. qS22V42H7wsHvRleYL4IF2rl8RRPw7A+HvJOH0RY0IK+Zr4SOatBi/pJQm53zArZMvM1DEUNkCd5\
  1150. HPqatEB0+D6jUjlsuoo7ua3o8D2846GBC/LKwkVOUi3nVTMba4ZQxPwxsA+o/PqGIZletjSshZRg\
  1151. nsceS1lSWVBVrpcZ1p5aCI9WfSk3SqmETX1X88MGLXzE+uHiNClFakyfsBFgI5p4JUwkBuzsCDCQ\
  1152. eAMMJNvQwkMfD9k2ZNyAM/g7EPOELp5PYSikg2VHDx9Cs747TM+w5Vmn1AdVKh/JATOL8wIMTl6V\
  1153. MkLRnqXeDaGR7634oUllYgDY7Qf3BGzY2NEja3xyIu6iVADKswUrCOyqTCqSBz6+3R1QUKVUAQKJ\
  1154. A4ASNsCEpwEcPA1e+PzlepfP+ia7I9jYu4qdw0qGxRv1ATk6YQ+DF6HJIZtiqXddgEDz/P3jZwBp\
  1155. ZnFOwMQ6KhVFlo1SHVts1G1K8ws6cXE/K8s715YK1PAQnLwK5KopYh5gIeUETQ75Oip/59r0vICp\
  1156. vDJUY2t17tx0ELs0iU7aDIu4DApNuat9512kU5oEy+aVDVJRND321LydJFhJ80zA0t27n1mCdUy+\
  1157. 6KDcbTyS0JSnVpmNTmnP4n5LJxzkrZtmIh6m9QptDXh2NN7lDQFeeVg8tqxY3PdyG3/POmNp333u\
  1158. XeeLeFCSF+nmVQKLe9dnPula2v/mxpfNs23yLCbLDMxaOoYNDmysNbAkMChNjls4BoDC+xLGKz53\
  1159. zxosCey7rLu5buHgtzmwF63wrAi0rgz8pjuuV+sMS/e4kyc58zKf3GdmKoz8439PL550b1Vx/qae\
  1160. DQuPDvP1L0kvwVBY5keblHct1hNWlaZ56V3tYJEwxHaAJ1hkBItgESyCRbAIFhnBIljmjIpgkGcR\
  1161. LILV2rhFsBrqWV7d902e1UDP8ppwDFReJcexUDOkrgPBGrqNNOQ4HUOxzklZ16m7Zzmag0ybVxR4\
  1162. 3HadJnmWoykJpcpBwfCCNJSDmpT/G7iuO5G0It8mlsUr5fDmt9k4QFnKQdUCVsxwOcpC4eSnmF8r\
  1163. K81GNZCZ3NadmOb3RG7/im7Ivs4x6z1Lf62eKVN1uqCCyaSAqdvdcBj60qmm3g3RNDp5TqCkfWD7\
  1164. y9s1BtbNmKDekcF8ouS2UQHgl7w5DCL7ynYHomJj2e2/AO2dO2gUQRzGJ8GgRTSkUINolaj4CPgI\
  1165. CCpBwcZHQBQVbAQRrUx3amEhaBOChcFGELXS+MJARATxQcRUURtBRIuAgiKBoFiY6pxvMxPGzd5l\
  1166. d28fM3vfB8Pd7c3e3u789j+P3f2GB4ti15AiWBTBoiiCRREsqp4VabwhgnOpX5vVuMF6lVaohOdW\
  1167. YQ80pV5/qnGBDyqN2nCQbHZNLQRYEQQj02MinP+dzlPN3+6XmH7GGA9o32Wx1VdVCHtO7dxYEsmZ\
  1168. KkItCtRB9fuDIplHiylLwUK19kQVdpaWMnjsGtcI4US8m8VYrKrwpEp5Rg4Ndq9sB8UyrQrj4BzD\
  1169. 5Xku1TphV2YKe40+qYiF6HTNoupoQHYsnisTCRtVFrU7Y5cT+h1rq8KSSMbuPGkBKsC11UKY0t6G\
  1170. 82B1iNomG8hCb3KOXHkUtnWARQVLj0fNElyTYUENaUNz2E6f6Dk6k0cv1/lhImxKuzTPJWxH+4Rj\
  1171. Hb8zvdQVmBwHOc7HdKB3pXCtASzSbTOysAaCen96GgGABBdqmMHDqhuO1fisvdBh8W3mf3Drjti+\
  1172. a4fnTA3o8D0svwHOtMN+s+dsDV91fAeA9O+1LV8mmhcu/D+crl1lOlxjaqlt+zbtqDrFVBXn67Qa\
  1173. 4ZmVrUuN90VBC1HogAMgAQTYn2ur8y8fP3nvAZ32gkf+DVumb5+GBTpmJEAeyPOPl3DAO14vA0RI\
  1174. kJdXQQWjfg+mgz3edjRUgPTqpcsrRl+MYED1kOpoPFPVuJ7Z4KxMuwrc488V+qjDDah/jvkXApqO\
  1175. Nau9QgZMSBCqNRS2uUwLkQmC/z689wEM8gPQc30XZuV9+nDYe4/ZHCDABPhQ1WK7Ohp6IEoglWf/\
  1176. usfvXrXJqHUqYF/6Chqpgv5n5kMVUSNW4LU7FKwfNECC6kwDZbbBAAei2uCrYQ+AH9++z1R/AAyw\
  1177. mO0oQIN814dvewBr2PCb3lwr8j2A1HOw+HRRwrVf1LcyPxGitrGEqlZOBjXe9XQpYQRoEKl0dRdF\
  1178. etajKCeEjFrbEmpjRS4k//wQYTzX46yTRpsrbhsrDlgYJ8Jod4tjZ23/3o3dZ/wLI46q1wxVGEgq\
  1179. TVSSB1xZjryjOjwgkpnmMEuV5IlRy/VMPnWSMlgQJgk95eD+DsQcPM0UqhSnJynbDpae7aPLwciF\
  1180. yz5HBGUnWAqutzItFdM34NmsKd/nQQlXKY/oEzYaxV3PlqgVp/GuofJ/h1tYMMQ+36ETC52QAztX\
  1181. d03VWdsqdCM+69tmgqIX7lHHs/B7HDrA+K9/X34aO8/Ky9KIFZAXwxKYBnOJQ8ejX6YhGcFG66A3\
  1182. GCpqZTmOFQosYx3cEYGR75JD1SQuXJckYHcJlqVg+dbHLTcADRPVOdEzy2GKMoJVq+TvYfR+q4Jt\
  1183. v5h9qzMe+8p7hB//4bdMvRKyRwTLAbCqbAc9zEWqfXZava7MoSrFnYmLJVBNjFjRZKVpq+phag3N\
  1184. UbVCCxR0LQrIFvV5vvouSH+N9tRvlferWn9KwvRW8DJONr3CImqOi9BFPjipRiyaglCpiGBRBIsi\
  1185. WBTBoiiCRREsynKVCRbFiEVRBIsiWJRb7SyCRRGsIvWair6fBItKBS6CRbEqZDXozj4TLELl3/cy\
  1186. wSJU1h4HgkWoUjkeBMuBWR5chItgUewVUu5oHg9B4mpgG45gmSCUEwapWr5yTnBH2XYDwUqhMMbG\
  1187. xlLfVmtra7m9vT2xH5X/uaEWYLq6kjNAIVjxdMN43ybTRpmaVQqtycnJWQA3NjaKzs5O0dRU3S5i\
  1188. YmJCjI+PV4pGf4z02VgG/ZCpN/WztN4fsa+kkZERDVCzAqejgLsJyF7LdB+puzs5oxdGrMqCP2nR\
  1189. 55tGtD2kEgBLjCwON1TWF5ne18m+3jSqSkaslGW2Q+4Z73XV2OboyfLd1wY7zuGG/HQ4RqPeBFH4\
  1190. GvaV3lfTH9+r8DXUTR3P+4Cx8U6lon91nfaudVT0FwAAAABJRU5ErkJggg==) no-repeat 90% 95%";
  1191.  
  1192. _hightlight_en = GM_getValue('HiPDA_Discovery_HIGHLIGHT_ENABLE');
  1193. if(_hightlight_en == undefined)_hightlight_en = false;
  1194. if(_hightlight_en == "false" || !_hightlight_en) _hightlight_en = false;
  1195. else _hightlight_en = true;
  1196. _blacklist_en_hpd = GM_getValue('HiPDA_Discovery_BLACKLIST_ENABLE_HPD');
  1197. if(_blacklist_en_hpd == undefined)_blacklist_en_hpd = true;
  1198. if(_blacklist_en_hpd == "false" || !_blacklist_en_hpd) _blacklist_en_hpd = false;
  1199. else _blacklist_en_hpd = true;
  1200. _blacklist_en_other = GM_getValue('HiPDA_Discovery_BLACKLIST_ENABLE_OTHER');
  1201. if(_blacklist_en_other == undefined)_blacklist_en_other = true;
  1202. if(_blacklist_en_other == "false" || !_blacklist_en_other) _blacklist_en_other = false;
  1203. else _blacklist_en_other = true;
  1204. _simple_style = GM_getValue('HiPDA_Discovery_SIMPLE_STYLE');
  1205. if(_simple_style == undefined)_simple_style = true;
  1206. if(_simple_style == "false" || !_simple_style) _simple_style = false;
  1207. else _simple_style = true;
  1208. _hover_style = GM_getValue('HiPDA_Discovery_HOVER_STYLE');
  1209. if(_hover_style == undefined)_hover_style = false;
  1210. if(_hover_style == "false" || !_hover_style) _hover_style = false;
  1211. else _hover_style = true;
  1212. _reply_avatar = GM_getValue('HiPDA_Discovery_REPLY_AVATAR');
  1213. if(_reply_avatar == undefined)_reply_avatar = false;
  1214. if(_reply_avatar == "false" || !_reply_avatar ) _reply_avatar = false;
  1215. else _reply_avatar = true;
  1216. _syn_modified = GM_getValue('HiPDA_Discovery_SYN_MODIFIED');
  1217. if(_syn_modified == undefined)_syn_modified = false;
  1218. if(_syn_modified == "false" || !_syn_modified) _syn_modified = false;
  1219. else _syn_modified = true;
  1220. _hightlight_color = GM_getValue('HiPDA_Discovery_HIGHLIGHT_COLOR');
  1221. if(_hightlight_color == undefined)_hightlight_color = "#F0E68C";
  1222. _font_size = GM_getValue('HiPDA_Discovery_FONT_SIZE');
  1223. if(_font_size == undefined)_font_size = '13';
  1224. _syn_lastversion = GM_getValue('HiPDA_Discovery_SYN_LASTVERSION');
  1225. if(_syn_lastversion == undefined)_syn_lastversion = 0;
  1226. var b = GM_getValue('HiPDA_Discovery_BLACK_LIST');
  1227. if(b == undefined)b='';
  1228. blacklistArray = '';
  1229. if(b.length)blacklistArray = b.split(",");
  1230. else blacklistArray = new Array();
  1231. blacklistLen=blacklistArray.length;
  1232. blacklistStr=blacklistArray.toString();
  1233.  
  1234. try{ // 取得当前登录用户 uid
  1235. var c = document.getElementById('umenu').getElementsByTagName('cite')[0].getElementsByTagName('a')[0].href;
  1236. _uid = c.substr(c.indexOf("uid=")+4);
  1237. if(c.indexOf("&")>0)
  1238. _uid = c.substr(0,c.indexOf("&"));
  1239. }catch (e) {_uid = 0;}
  1240.  
  1241. _today = year + "-" + month + "-" + day;
  1242. _pxt = "1900-1-1 01:01";
  1243. _pmt = year + "-" + month + "-" + day + " " + hour + ":" + min;
  1244. var offset = window.location.search.indexOf("page=");
  1245. if(offset>0){
  1246. var t = window.location.search.substr(offset);
  1247. if(t.indexOf("&") >0) _pc = t.slice(5,t.indexOf("&"));
  1248. else _pc = t.slice(5);
  1249. }
  1250. else _pc = 1;
  1251. offset = window.location.search.indexOf("fid=");
  1252. if(offset>0){
  1253. var t = window.location.search.substr(offset);
  1254. if(t.indexOf("&") >0)_fid = t.slice(4,t.indexOf("&"));
  1255. else _fid = t.slice(4);
  1256. }
  1257. else _fid = 2; // 默认D版好了
  1258. _lvt = GM_getValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid);
  1259. if(_lvt == undefined){
  1260. _lvt = year + "-" + month + "-" + day + " " + hour + ":" + min;
  1261. _first_time_use = true;
  1262. GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,_lvt);
  1263. }
  1264. else _first_time_use = false;
  1265. }
  1266. function refreshConfigDiv(){ // 刷新编辑黑名单的界面
  1267. readConfig();
  1268. document.getElementById('_chk_hightlight_color').value=_hightlight_color;
  1269. document.getElementById('_chk_hightlight_en').checked=( !_hightlight_en || _hightlight_en=="false")?0:1;
  1270. document.getElementById('_chk_blacklist_en_hpd').checked=( !_blacklist_en_hpd || _blacklist_en_hpd=="false")?0:1;
  1271. document.getElementById('_chk_blacklist_en_other').checked=( !_blacklist_en_other || _blacklist_en_other=="false")?0:1;
  1272. document.getElementById('_chk_simple_style').checked=( !_simple_style || _simple_style=="false")?0:1;
  1273. document.getElementById('_chk_hover_style').checked=( !_hover_style || _hover_style=="false")?0:1;
  1274. document.getElementById('_chk_reply_avatar').checked=( !_reply_avatar || _reply_avatar=="false")?0:1;
  1275. // 被点击过以后就不必更新此按钮,直到刷新页面
  1276. if(document.getElementById('s_syn').className != "disabled") {
  1277. if(_uid == 0){
  1278. document.getElementById('s_syn').innerHTML="未登录";
  1279. document.getElementById('s_syn').href="http://"+document.domain+"/forum/logging.php?action=login";
  1280. }
  1281. else {
  1282. document.getElementById('s_syn').innerHTML="₪ 同步";
  1283. document.getElementById('s_syn').style.background='#eef9eb';
  1284. document.getElementById('s_syn').style.color='#000';
  1285. }
  1286. }
  1287. document.getElementById('s_syn').title="上次同步时间:"+GM_getValue('HiPDA_Discovery_SYN_LASTTIME');
  1288. var rd=document.getElementsByName('_radio_font_size');
  1289. for(var i=0;i<rd.length;i++){
  1290. if(rd[i].value == _font_size)
  1291. rd[i].checked="true";
  1292. }
  1293. if(blacklistLen){
  1294. document.getElementById('blacklist').innerHTML='';
  1295. for(var i=0;i<blacklistLen;i++){
  1296. var t = blacklistArray[i];
  1297. var lst=document.createElement('input');
  1298. lst.className = 'bl_chk';
  1299. lst.value = t;
  1300. lst.type = 'checkbox';
  1301. lst.checked = true;
  1302. lst.addEventListener('click', onToggleBlackList,false);
  1303. var dv=document.createElement('div');
  1304. dv.appendChild(lst);
  1305. dv.appendChild(document.createTextNode(t.substr(t.indexOf('=')+1)));
  1306. document.getElementById('blacklist').appendChild(dv);
  1307. }
  1308. }else document.getElementById('blacklist').innerHTML = '您还没有屏蔽任何用户';
  1309. }
  1310. // 功能实现
  1311. function mouseOverPost(event){
  1312. this.style.background="";
  1313. this.removeAttribute('onmouseover');
  1314. }
  1315. function processBlackList(){ // 屏蔽黑名单
  1316. if( (_fid == 2)&&!_blacklist_en_hpd )return; // 当前浏览D版且未启用黑名单功能
  1317. else if(!_blacklist_en_other)return; // 浏览其他版块
  1318. if(_bVIEWTHREAD>0){ // 帖子
  1319. var s = document.evaluate("//div[@class='postinfo']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1320. for (var i = s.snapshotLength - 1; i >= 0; i--) {
  1321. var t = s.snapshotItem(i);
  1322. var a = t.getElementsByTagName('a')[0];
  1323. if( a != undefined){
  1324. var u = a.href.substring(a.href.indexOf('uid')+4);
  1325. t.parentNode.parentNode.parentNode.parentNode.style.display=(blacklistStr.indexOf(u+'='+a.text)>=0)?'none':'';
  1326. }
  1327. }
  1328. // 屏蔽 被引用 的黑名单用户发言
  1329. s = document.evaluate("//div[@class='quote']//blockquote//font//font[@color='#999999']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1330. for (var i = s.snapshotLength - 1; i >= 0; i--) {
  1331. var t = s.snapshotItem(i);
  1332. var n=t.innerHTML.substring(0,t.innerHTML.indexOf('发表于')-1);
  1333. if(blacklistStr.indexOf(('='+n+','))>=0)t.parentNode.parentNode.parentNode.style.display = 'none';
  1334. }
  1335. }
  1336. if(_bFORUMDISPLAY>0){ // 论坛列表
  1337. // 屏蔽BLACK_LIST的发帖
  1338. var s = document.evaluate("//td[@class='author']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1339. for (var i = s.snapshotLength - 1; i >= 0; i--) {
  1340. var t = s.snapshotItem(i);
  1341. var a = t.getElementsByTagName('a')[0];
  1342. if( a != undefined){
  1343. var n = a.text;
  1344. var u = a.href.substring(a.href.indexOf('uid')+4);
  1345. if(blacklistStr.indexOf(u+'='+n)>=0)t.parentNode.parentNode.style.display='none';
  1346. else t.parentNode.parentNode.style.display='';
  1347. }
  1348. }
  1349. // 隐藏BLACK_LIST在最后回复位置的显示
  1350. s = document.evaluate("//td[@class='lastpost']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1351. for (var i = s.snapshotLength - 1; i >= 0; i--) {
  1352. var t = s.snapshotItem(i);
  1353. var a = t.getElementsByTagName('a')[1];
  1354. if((a != undefined)&&(blacklistStr.indexOf(('='+a.text))>=0))a.innerHTML='anonymous';
  1355. }
  1356. }
  1357. };
  1358. function processShowHiddenText(){ // 好孩子看得见
  1359. var s = document.evaluate("//font[\
  1360. translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='white' \
  1361. or translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='#ffffff'\
  1362. or translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='#wheat'\
  1363. or translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='#lemonchiffon']",
  1364. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1365. for (var i = s.snapshotLength - 1; i >= 0; i--) {
  1366. var t=s.snapshotItem(i).innerHTML;
  1367. t=t.replace(/white/i,"red");
  1368. t=t.replace(/#ffffff/i,"red");
  1369. t=t.replace(/wheat/i,"red");
  1370. t=t.replace(/lemonchiffon/i,"red");
  1371. //t=s.snapshotItem(i).innerHTML='<fieldset class="goodboysglasses"><legend>好孩子看不见</legend>'+t+'</fieldset>';
  1372. t=s.snapshotItem(i).innerHTML='<div class="goodboysglasses" title="好孩子看不见">'+t+'</div>';
  1373. }
  1374. };
  1375. function processHighlightColor(){ // 对帖子进行高亮
  1376. if( !_hightlight_en ){ // 如果不启用高亮就把这次页面打开的时刻写进去
  1377. if( 1 == _pc )
  1378. GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,year + "-" + month + "-" + day + " " + hour + ":" + min)
  1379. return;
  1380. }
  1381. if(_bFORUMDISPLAY>0){
  1382. // 遍历页面中的帖子列表,将所有“最后回复时间”大于 _lvt 的帖子背景色换成 _hightlight_color
  1383. // 这里没有排除置顶帖子
  1384. var f = document.evaluate("//td[@class='lastpost']",
  1385. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1386. for (var i = f.snapshotLength - 1; i >= 0; i--){
  1387. var e = f.snapshotItem(i);
  1388. var a = e.getElementsByTagName('a')[1];
  1389. if( a != undefined){
  1390. var _rt = a.text;
  1391. if (timeDiff(_rt,_lvt)){
  1392. e.parentNode.style.background=_hightlight_color;
  1393. e.parentNode.addEventListener('mouseover',mouseOverPost,false);
  1394. }
  1395. if(timeDiff(_rt,_pxt))_pxt = _rt;
  1396. if(timeDiff(_pxt,_lvt)) GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,_pxt);
  1397. }
  1398. }
  1399. // 将发帖日期超过30天的帖子里发帖人单元格背景换成 _old_post_bgcolor :灰色
  1400. // 将当天发布的帖子里发帖日期颜色变成 _today_post_color :红色
  1401. var snapResults = document.evaluate("//td [@class='author']",
  1402. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1403. for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
  1404. var e = snapResults.snapshotItem(i).getElementsByTagName('em')[0];
  1405. if(e != undefined){
  1406. var dd = dateDiff(e.innerHTML,_today);
  1407. if (dd >= 30) {
  1408. if (e.parentNode.parentNode.innerHTML.indexOf("images/default/pin")==-1 && e.parentNode.parentNode.innerHTML.indexOf('images/default/folder_lock')==-1 ){
  1409. e.parentNode.parentNode.style.background=_old_post_bgcolor;
  1410. e.parentNode.parentNode.removeEventListener('mouseover',mouseOverPost,false);
  1411. }
  1412. }
  1413. if (dd == 0) {
  1414. if (e.parentNode.parentNode.innerHTML.indexOf("images/default/pin")==-1 && e.parentNode.parentNode.innerHTML.indexOf('images/default/folder_lock')==-1 )
  1415. e.style.color=_today_post_color;
  1416. }
  1417. }
  1418. }
  1419. }
  1420. if(_bVIEWTHREAD>0){
  1421. var pst=document.evaluate("//div[@class='postinfo']//strong//a//em",
  1422. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1423. for (var i = pst.snapshotLength - 1; i >= 0; i--){
  1424. if(pst.snapshotItem(i).innerHTML == 1){ // 1st floor
  1425. var t1=pst.snapshotItem(i).parentNode.parentNode.parentNode.getElementsByClassName('authorinfo')[0].getElementsByTagName('em')[0];
  1426. if(t1 != undefined){
  1427. var postdate=t1.innerHTML;
  1428. postdate = postdate.substr(4,postdate.indexOf(':')-7);
  1429. if(dateDiff(postdate,_today) >=30)
  1430. t1.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('defaultpost')[0].style.background=grave_image;
  1431. }
  1432. }
  1433. }
  1434. }
  1435. }
  1436. function processImageZoom(){ // 调整附件图片大小
  1437. var imglist=document.evaluate("//img[substring(@id,1,5)='aimg_']",
  1438. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  1439. for (var i = imglist.snapshotLength - 1; i >= 0; i--)
  1440. imglist.snapshotItem(i).addEventListener('load',onAttachImageLoaded,false);
  1441. }
  1442. function processConflict(){
  1443. document.getElementById('hp_cfg_div').style.display = 'none';
  1444. // 显示【勾选界面】,【服务器列表】,【本地列表】的差异换面和对应选项
  1445. // 如果以服务器为准,则存储response的version和list即可
  1446. // 如果以本地为准、或以新列表为准(先存储新列表),则请求action=update,等待返回结果【跳到 case 1:】
  1447. newBlacklist = new Array();
  1448. var listhtml="<table><tbody>";
  1449. var i;
  1450. for ( i in serverBlacklist ){
  1451. var item = serverBlacklist[i];
  1452. if(/\d+=.+/.test(item)){
  1453. if(blacklistStr.indexOf(item)>=0){ // 服务、本地名单都有
  1454. newBlacklist.push(item);
  1455. }
  1456. else{ // 服务器有,本地没有
  1457. var n = item.substr(item.indexOf('=')+1);
  1458. 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>";
  1459. }
  1460. }
  1461. }
  1462. for ( i in blacklistArray ){
  1463. var item = blacklistArray[i];
  1464. if( /\d+=.+/.test(item) && serverListStr.indexOf( item )<0 ){ // 本地有,服务器没有
  1465. var n = item.substr(item.indexOf('=')+1);
  1466. 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>";
  1467. }
  1468. }
  1469. listhtml = listhtml + "</tbody></table>";
  1470. document.getElementById('hpdtool_syn_list').innerHTML = listhtml;
  1471. document.getElementById('hpdtool_syn_div').style.display="";
  1472. }
  1473. readConfig();
  1474. changeStyle();
  1475. changeURL();
  1476. if(_bFORUMDISPLAY>0 || _bVIEWTHREAD>0){
  1477. addConfigDiv();
  1478. window.addEventListener('resize',onWindowResize,false);
  1479. }
  1480. if(_bFORUMDISPLAY>0){
  1481. window.addEventListener('unload',onPageUnload,false);
  1482. refreshMinTime(); // 一开始就刷新一次_pmt,否则直接就取下一页了
  1483. if(!_first_time_use && _hightlight_en){ //第一次用就不往后续读取了
  1484. if(timeDiff(_pmt,_lvt)){
  1485. _pc++;
  1486. GM_xmlhttpRequest({
  1487. method: 'GET',
  1488. url: 'http://'+document.domain+'/forum/forumdisplay.php?fid='+_fid+'&page='+_pc,
  1489. onload: onLoadNewPage,
  1490. overrideMimeType: "text/html; charset=gbk"
  1491. });
  1492. }
  1493. }
  1494. processHighlightColor();
  1495. processBlackList();
  1496. }
  1497. if(_bVIEWTHREAD>0){
  1498. appendControl();
  1499. processBlackList();
  1500. processHighlightColor();
  1501. processShowHiddenText();
  1502. _att_max_width=document.getElementsByClassName('t_msgfontfix')[0].clientWidth; // 最宽这么宽
  1503. if(_att_max_width<10)_att_max_width=600;
  1504. processImageZoom();
  1505. }