hi-pda tools

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

目前为 2014-12-02 提交的版本,查看 最新版本

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