hi-pda tools

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

目前为 2021-10-26 提交的版本。查看 最新版本

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