hi-pda tools

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

目前為 2016-12-11 提交的版本,檢視 最新版本

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