// ==UserScript== // @name hi-pda tools // @namespace hi-pda-tools-by-2200 // @description 屏蔽用户、名单同步;标识新帖;好孩子也看的见; // @include http*://*.hi-pda.com/forum/* // @grant GM_addStyle // @license MIT // @version 5.2.3 // @downloadURL https://update.greasyfork.icu/scripts/3962/hi-pda%20tools.user.js // @updateURL https://update.greasyfork.icu/scripts/3962/hi-pda%20tools.meta.js // ==/UserScript== // Version 5.2.3-by-Achilles // 修改介绍和Changelog // Version 5.2.2-by-Achilles // 添加license // Version 5.2.1-by-Achilles // 修复了https失效的问题 // 兼容TamperMonkey // Version 5.2 // 修正各种chrome不兼容的函数 // 因SAE挂掉,去除了同步功能 // Version 5.1 TODO // 宽窄可选 // opera支持 // 投票icon // 枫叶版chrome兼容 // 点击显示图片 // 屏蔽用户hover改为帖子触发 // 预取几页可选 // 高亮自己的贴 // Version 5.0 // Date 2011-12-18 // 增加同步功能 // Version 4.0 // Date 2011-12-06 // 论坛改版 // Version 3.0 // Date 2011-7-13 // 增加自动更新 // Version 2.2 // Date 2011-7-13 // 修正zhuyi增加【只讨论2.0】板块后预读页面错误 // 高亮功能修改为可选,颜色自定义 // 屏蔽用户功能修改为分版面可选 // Version 2.1 // Date 2011-4-3 // 修正Chrome错误 // 脚本仅针对D版有效 // Version 2.0 // Date 2010-2-9 // @require http://userscript-updater-generator.appspot.com/?id=106358 // Chrome浏览器不支GM_GetValue/GM_SetValue/GM_addStyle/GM_xmlhttpRequest try{ if (!this.GM_getValue || this.GM_getValue.toString().indexOf("not supported")>-1) { this.GM_getValue=function (key,def) { return localStorage[key] || def; }; this.GM_setValue=function (key,value) { return localStorage[key]=value; }; } if (!this.GM_addStyle || this.GM_addStyle.toString().indexOf("not supported")>-1){ this.GM_addStyle = function(css) { var head = document.getElementsByTagName('head')[0], style = document.createElement('style'); if (!head) {return} style.type = 'text/css'; try {style.innerHTML = css} catch(x) {style.innerText = css} head.appendChild(style); } } if ( !this.GM_xmlhttpRequest || this.GM_xmlhttpRequest.toString().indexOf("not supported")>-1 ) { this.GM_xmlhttpRequest = function (details) { var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { var responseState = { responseXML:(xmlhttp.readyState==4 ? xmlhttp.responseXML : ''), responseText:(xmlhttp.readyState==4 ? xmlhttp.responseText : ''), readyState:xmlhttp.readyState, responseHeaders:(xmlhttp.readyState==4 ? xmlhttp.getAllResponseHeaders() : ''), status:(xmlhttp.readyState==4 ? xmlhttp.status : 0), statusText:(xmlhttp.readyState==4 ? xmlhttp.statusText : '') } if (details["onreadystatechange"]) { details["onreadystatechange"](responseState); } if (xmlhttp.readyState==4) { if (details["onload"] && xmlhttp.status>=200 && xmlhttp.status<300) { details["onload"](responseState); } if (details["onerror"] && (xmlhttp.status<200 || xmlhttp.status>=300)) { details["onerror"](responseState); } } } try { //cannot do cross domain xmlhttp.open(details.method, details.url); } catch(e) { if( details["onerror"] ) { //simulate a real error details["onerror"]({responseXML:'',responseText:'',readyState:4,responseHeaders:'',status:403,statusText:'Forbidden'}); } return; } if (details.headers) { for (var prop in details.headers) { xmlhttp.setRequestHeader(prop, details.headers[prop]); } } xmlhttp.send((typeof(details.data)!='undefined')?details.data:null); } } } catch(e){} var _pc = 1; // 当前页面的page值 var _fid; // 当前版面fid var _uid; // 当前登录用户uid var _tid= 0; // 当前帖子的tid var _pxt; // 当前页面上“最后回复时间”的最大值 var _pmt; // 当前页面上“最后回复时间”的最小值 var _lvt; // 上次访问时间,页面关闭时,_pxt 存储为 _lvt var _today; // 与发帖日期比较,超过30天的发帖人单元格显示灰色 var _first_time_use; var _max_read_pages = 5; // 不能读取更多啦,太多了容易死机 var _hightlight_en; // 启用高亮功能 var _hightlight_color; // 高亮颜色自定义 var _blacklist_en_hpd; // 启用D版的黑名单功能 var _blacklist_en_other; // 启用其他版的黑名单功能 var _simple_style; // 启用精简风格 var _hover_style; // 启用悬停风格 var _reply_avatar; // 回复位置是否显示自己的头像 var _font_size; // 论坛字体大小 var blacklistArray; // 黑名单 var blacklistLen; // 黑名单长度 var blacklistStr; var serverBlacklist; // 同步冲突时服务器端的列表 var serverListStr; var serverVersion; var newBlacklist // 同步冲突时的新列表 var _syn_pending; // 正在同步 var _syn_lastversion; var _syn_modified; var _att_max_width; // 帖子附件图片最大宽度 var grave_image; // 坟贴背景图片 // var _old_post_bgcolor = "#E1E1E1"; var _old_post_bgcolor = "#e9e9e9"; var _today_post_color = "#FF0000"; var now = new Date(); var year = now.getYear()+1900; var month = now.getMonth()+1; var day = now.getDate(); var hour = now.getHours(); var min = now.getMinutes(); var _bFORUMDISPLAY = location.href.indexOf('hi-pda.com/forum/forumdisplay.php?'); var _bVIEWTHREAD = location.href.indexOf('hi-pda.com/forum/viewthread.php?'); // 工具函数 var JSON; if (!JSON) {JSON = {};} (function () { 'use strict'; function f(n) {return n < 10 ? '0' + n : n;} if (typeof Date.prototype.toJSON !== 'function') { Date.prototype.toJSON = function (key) { return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z' : null; }; String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (key) { return this.valueOf(); }; } var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { // table of character substitutions '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, rep; function quote(string) { // If the string contains no control characters, no quote characters, and no // backslash characters, then we can safely slap some quotes around it. // Otherwise we must also replace the offending characters with safe escape // sequences. escapable.lastIndex = 0; return escapable.test(string) ? '"' + string.replace(escapable, function (a) { var c = meta[a]; return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; } function str(key, holder) { // Produce a string from holder[key]. var i, // The loop counter. k, // The member key. v, // The member value. length, mind = gap, partial, value = holder[key]; // If the value has a toJSON method, call it to obtain a replacement value. if (value && typeof value === 'object' && typeof value.toJSON === 'function') { value = value.toJSON(key); } // If we were called with a replacer function, then call the replacer to // obtain a replacement value. if (typeof rep === 'function') { value = rep.call(holder, key, value); } // What happens next depends on the value's type. switch (typeof value) { case 'string': return quote(value); case 'number': // JSON numbers must be finite. Encode non-finite numbers as null. return isFinite(value) ? String(value) : 'null'; case 'boolean': case 'null': // If the value is a boolean or null, convert it to a string. Note: // typeof null does not produce 'null'. The case is included here in // the remote chance that this gets fixed someday. return String(value); // If the type is 'object', we might be dealing with an object or an array or // null. case 'object': // Due to a specification blunder in ECMAScript, typeof null is 'object', // so watch out for that case. if (!value) { return 'null'; } // Make an array to hold the partial results of stringifying this object value. gap += indent; partial = []; // Is the value an array? if (Object.prototype.toString.apply(value) === '[object Array]') { // The value is an array. Stringify every element. Use null as a placeholder // for non-JSON values. length = value.length; for (i = 0; i < length; i += 1) { partial[i] = str(i, value) || 'null'; } // Join all of the elements together, separated with commas, and wrap them in // brackets. v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; gap = mind; return v; } // If the replacer is an array, use it to select the members to be stringified. if (rep && typeof rep === 'object') { length = rep.length; for (i = 0; i < length; i += 1) { k = rep[i]; if (typeof k === 'string') { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } else { // Otherwise, iterate through all of the keys in the object. for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } // Join all of the member texts together, separated with commas, // and wrap them in braces. v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; gap = mind; return v; } } // If the JSON object does not yet have a stringify method, give it one. if (typeof JSON.stringify !== 'function') { JSON.stringify = function (value, replacer, space) { // The stringify method takes a value and an optional replacer, and an optional // space parameter, and returns a JSON text. The replacer can be a function // that can replace values, or an array of strings that will select the keys. // A default replacer method can be provided. Use of the space parameter can // produce text that is more easily readable. var i; gap = ''; indent = ''; // If the space parameter is a number, make an indent string containing that // many spaces. if (typeof space === 'number') { for (i = 0; i < space; i += 1) { indent += ' '; } // If the space parameter is a string, it will be used as the indent string. } else if (typeof space === 'string') { indent = space; } // If there is a replacer, it must be a function or an array. // Otherwise, throw an error. rep = replacer; if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { throw new Error('JSON.stringify'); } // Make a fake root object containing our value under the key of ''. // Return the result of stringifying the value. return str('', {'': value}); }; } // If the JSON object does not yet have a parse method, give it one. if (typeof JSON.parse !== 'function') { JSON.parse = function (text, reviver) { // The parse method takes a text and an optional reviver function, and returns // a JavaScript value if the text is a valid JSON text. var j; function walk(holder, key) { // The walk method is used to recursively walk the resulting structure so // that modifications can be made. var k, v, value = holder[key]; if (value && typeof value === 'object') { for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); } // Parsing happens in four stages. In the first stage, we replace certain // Unicode characters with escape sequences. JavaScript handles many characters // incorrectly, either silently deleting them, or treating them as line endings. text = String(text); cx.lastIndex = 0; if (cx.test(text)) { text = text.replace(cx, function (a) { return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }); } // In the second stage, we run the text against regular expressions that look // for non-JSON patterns. We are especially concerned with '()' and 'new' // because they can cause invocation, and '=' because it can cause mutation. // But just to be safe, we want to reject all unexpected forms. // We split the second stage into 4 regexp operations in order to work around // crippling inefficiencies in IE's and Safari's regexp engines. First we // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we // replace all simple value tokens with ']' characters. Third, we delete all // open brackets that follow a colon or comma or that begin the text. Finally, // we look to see that the remaining characters are only whitespace or ']' or // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. if (/^[\],:{}\s]*$/ .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { // In the third stage we use the eval function to compile the text into a // JavaScript structure. The '{' operator is subject to a syntactic ambiguity // in JavaScript: it can begin a block or an object literal. We wrap the text // in parens to eliminate the ambiguity. j = eval('(' + text + ')'); // In the optional fourth stage, we recursively walk the new structure, passing // each name/value pair to a reviver function for possible transformation. return typeof reviver === 'function' ? walk({'': j}, '') : j; } // If the text is not JSON parseable, then a SyntaxError is thrown. throw new SyntaxError('JSON.parse'); }; } // Augment the basic prototypes if they have not already been augmented. // These forms are obsolete. It is recommended that JSON.stringify and // JSON.parse be used instead. if (!Object.prototype.toJSONString) { Object.prototype.toJSONString = function (filter) { return JSON.stringify(this, filter); }; Object.prototype.parseJSON = function (filter) { return JSON.parse(this, filter); }; } }()); function $(select){ var name = select.substring(1); switch(select.charAt(0)){ case '#': return document.getElementById(name); case '.': return document.getElementsByClassName(name); case '/': return document.getElementsByTagName(name); default: return document.getElementsByName(select); } }; function getNowTimeStamp(){ // 当前时刻 yyyy-m-d h:m:s var nowtime = new Date(); var timestamp =(nowtime.getYear()+1900)+'-'+(nowtime.getMonth()+1)+'-'+nowtime.getDate()+' '+checkTime(nowtime.getHours())+':'+checkTime(nowtime.getMinutes())+':'+checkTime(nowtime.getSeconds()); return timestamp; } function timeDiff(date1,date2){// 比较日期大小,年,月,日,小时,分钟 var re=/^(\d{4})\S(\d{1,2})\S(\d{1,2})\s(\d{1,2})\S(\d{1,2})$/; var dt1,dt2; if (re.test(date1)) dt1=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3,RegExp.$4,RegExp.$5); if (re.test(date2)) dt2=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3,RegExp.$4,RegExp.$5); else dt2=new Date(); return dt1>=dt2; } function dateDiff(date1,date2){// 比较日期大小,年月日 var re=/^(\d{4})\S(\d{1,2})\S(\d{1,2})$/; var dt1,dt2; if (re.test(date1)) dt1=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3); if (re.test(date2)) dt2=new Date(RegExp.$1,RegExp.$2-1,RegExp.$3); return Math.floor((dt2-dt1)/(1000*60*60*24)) } function checkTime(i){ // 一位数的时间前加0 if (i<10) {i="0" + i} return i } function getKeys(e){ // keycode 转换 var codetable={'96':'Numpad 0','97':'Numpad 1','98':'Numpad 2','99':'Numpad 3','100':'Numpad 4','101':'Numpad 5','102':'Numpad 6','103':'Numpad 7','104':'Numpad 8','105':'Numpad 9','106':'Numpad *','107':'Numpad +','108':'Numpad Enter','109':'Numpad -','110':'Numpad .','111':'Numpad /','112':'F1','113':'F2','114':'F3','115':'F4','116':'F5','117':'F6','118':'F7','119':'F8','120':'F9','121':'F10','122':'F11','123':'F12','8':'BackSpace','9':'Tab','12':'Clear','13':'Enter','16':'Shift','17':'Ctrl','18':'Alt','20':'Cape Lock','27':'Esc','32':'Spacebar','33':'Page Up','34':'Page Down','35':'End','36':'Home','37':'←','38':'↑','39':'→','40':'↓','45':'Insert','46':'Delete','144':'Num Lock','186':';:','187':'=+','188':',<','189':'-_','190':'.>','191':'/?','192':'`~','219':'[{','220':'\|','221':']}','222':'"'}; var Keys = ''; e.shiftKey && (e.keyCode != 16) && (Keys += 'shift+'); e.ctrlKey && (e.keyCode != 17) && (Keys += 'ctrl+'); e.altKey && (e.keyCode != 18) && (Keys += 'alt+'); return Keys + (codetable[e.keyCode] || String.fromCharCode(e.keyCode) || ''); }; function addHotKey(codes,func){// 监视并执行快捷键对应的函数 document.addEventListener('keydown', function(e){ if ((e.target.tagName != 'INPUT') && (e.target.tagName != 'TEXTAREA') && getKeys(e) == codes){ func(); e.preventDefault(); e.stopPropagation(); } }, false); }; // 触发函数 function onToggleBlackList(e){// 黑名单[名字]触发 var v = e.target.value; var bShow = e.target.checked; if(_bVIEWTHREAD>0){ var s = document.evaluate("//div[@class='postinfo']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = s.snapshotLength - 1; i >= 0; i--) { var t = s.snapshotItem(i); var a = t.getElementsByTagName('a')[0]; if( a != undefined){ var u = a.href.substring(a.href.indexOf('uid')+4); if((u+'='+a.text) == v)t.parentNode.parentNode.parentNode.parentNode.style.display = bShow?'none':''; } } } if(_bFORUMDISPLAY>0){ var s = document.evaluate("//td[@class='f_author']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = s.snapshotLength - 1; i >= 0; i--) { // 屏蔽BLACK_LIST的发帖 var t = s.snapshotItem(i); var a = t.getElementsByTagName('a')[0]; if( a != undefined){ var n = a.text; var u = a.href.substring(a.href.indexOf('uid')+4); if((u+'='+a.text) == v)t.parentNode.style.display = bShow?'none':''; } } } }; function onBlockUser(e){ // [屏蔽] 按钮触发 var a = e.target.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('postinfo')[0].getElementsByTagName('a')[0]; var nm= a.text; var id= a.href.substring(a.href.indexOf('uid')+4); if(blacklistStr.indexOf(id+'='+nm)<0){//检查有没有重复的 blacklistArray.push(id+'='+nm); blacklistStr = blacklistArray.toString(); GM_setValue('HiPDA_Discovery_BLACK_LIST',blacklistArray.join()); blacklistLen=blacklistArray.length; } _syn_modified = true; GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified); // 重新激活同步按钮 document.getElementById('s_syn').className="enable"; document.getElementById('s_syn').innerHTML="₪ 同步"; document.getElementById('s_syn').style.background='#eef9eb'; document.getElementById('s_syn').style.color='#000'; refreshConfigDiv(); processBlackList(); }; function onWindowResize(){ // 调整body宽度 // alert('resize'); if(_simple_style){ if(window.innerWidth>1600) GM_addStyle("body {width:65%;}"); else if(window.innerWidth>1400) GM_addStyle("body {width:75%;}"); else if(window.innerWidth>1200) GM_addStyle("body {width:85%;}"); else GM_addStyle("body {width:980px;}"); } } function onAttachImageLoaded(){ // 附件图片加载完成后修改宽度 var newimg = new Image(); newimg.src =this.src; if(newimg.width<=_att_max_width ){ this.width=newimg.width; //去除zoom this.removeAttribute('onclick'); this.className="nozoom"; } else this.width=_att_max_width; } function onLoadNewPage(req){ // 后台读取页面完毕 try { if (req.status == 200) { var newPageHTML = req.responseText.substring(req.responseText.indexOf('')); var threadList = document.getElementsByName("moderate")[0].getElementsByClassName("datatable")[0]; // 增加预取了页面的提示 // var newpagetip=""; var newpagetip=""; threadList.innerHTML = threadList.innerHTML + newpagetip + newPageThread; // 去除预取页面对应的选择导航按钮 var pagenav=document.evaluate("//div[@class='pages']//a", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var btncnt=pagenav.snapshotLength-1;btncnt>=0;btncnt--){ var btn=pagenav.snapshotItem(btncnt); if(btn.text == _pc)btn.parentNode.removeChild(btn); } } } catch (e) {} refreshMinTime(); _max_read_pages--; if( _max_read_pages && (timeDiff(_pmt,_lvt))){ _pc++; GM_xmlhttpRequest({ method: 'GET', url: 'http://'+document.domain+'/forum/forumdisplay.php?fid='+_fid+'&page='+_pc, onload: onLoadNewPage, overrideMimeType: "text/html; charset=gbk" }); } processHighlightColor(); processBlackList(); } function onSynReply(req){ // 同步时,服务器返回结果 document.getElementById('s_syn').className="disabled"; // try { _syn_pending=false; if (req.status == 200) { // 200 OK var response=JSON.parse(req.responseText); // alert(response.list); // 输出中文,不乱码 // response.result // .version // .list var nowtimestamp=getNowTimeStamp(); switch(response.result){ case "0": // 无更新 document.getElementById('s_syn').style.background='#88ff88'; document.getElementById('s_syn').innerHTML="√ 无更新"; GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp); break; case "1": // OK,本地覆盖了服务器,返回新的版本号 _syn_lastversion = response.version; _syn_modified = false; GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion); GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified); document.getElementById('s_syn').style.background='#88ff88'; document.getElementById('s_syn').innerHTML="√ 已同步"; GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp); break; case "2": // 服务器有更高版本覆盖本地列表 var newblacklistArray = new Array(); if( response.list ) newblacklistArray = response.list.split(","); GM_setValue("HiPDA_Discovery_BLACK_LIST",newblacklistArray.join()); _syn_lastversion = response.version; GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion); _syn_modified = false; GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified); document.getElementById('s_syn').style.background='#88ff88'; document.getElementById('s_syn').innerHTML="√ 已更新"; GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp); break; case "3": // 冲突 TODO serverBlacklist = new Array(); if( response.list ) serverBlacklist = response.list.split(","); serverListStr = serverBlacklist.join(); document.getElementById('s_syn').addEventListener('click', processConflict, false); serverVersion = response.version; _syn_pending = true; processConflict(); document.getElementById('s_syn').style.background='#f00'; document.getElementById('s_syn').style.color='#fff'; document.getElementById('s_syn').innerHTML="! 有冲突"; document.getElementById('s_syn').title="版本有冲突"; break; case "4": // 参数错误 document.getElementById('s_syn').style.background='#f00'; document.getElementById('s_syn').style.color='#fff'; document.getElementById('s_syn').innerHTML="X 参数错误"; document.getElementById('s_syn').title=response.list; break; case "5": // 频繁刷新 document.getElementById('s_syn').style.background='#f00'; document.getElementById('s_syn').style.color='#fff'; document.getElementById('s_syn').innerHTML="服务器忙"; document.getElementById('s_syn').title="限定10s一次"; break; case "500": // 服务器错误 document.getElementById('s_syn').style.background='#f00'; document.getElementById('s_syn').style.color='#fff'; document.getElementById('s_syn').innerHTML="服务器错误"; break; default: document.getElementById('s_syn').innerHTML="! 未知错误"; } refreshConfigDiv(); } else { // 500,404,443,... document.getElementById('s_syn').style.background='#f00'; document.getElementById('s_syn').style.color='#fff'; document.getElementById('s_syn').innerHTML="X 网络错误"; } // } // catch (e) { // document.getElementById('s_syn').style.background='#f00'; // document.getElementById('s_syn').style.color='#fff'; // document.getElementById('s_syn').innerHTML="! 格式错误"; // } } function onSynChooseBtn(choose){ // 同步冲突界面选择按钮 var nowtimestamp=getNowTimeStamp(); switch (choose){ case 0: // 使用 新列表 // 把配置界面显示出来,等待服务器回应 document.getElementById('hp_cfg_div').style.display = ""; document.getElementById('s_syn').style.background='#999'; document.getElementById('s_syn').innerHTML="同步中..."; // _syn_pending=false; // 获取新列表 var r = document.getElementsByClassName('hpdtool_syn_chk_new'); for (var i = r.length-1; i >= 0; i--) if(r[i].checked) newBlacklist.push(r[i].value); // 存储新列表,服务器的版本号,标志已修改 GM_setValue("HiPDA_Discovery_BLACK_LIST",newBlacklist.join()); _syn_lastversion = serverVersion; GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion); _syn_modified = true; GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified); GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp); document.getElementById('s_syn').removeEventListener('click', processConflict, false); // 向服务器发起请求 var data={ "uid":_uid, "lastversion":_syn_lastversion, "modified":_syn_modified, "action":"update", "blacklist":newBlacklist }; GM_xmlhttpRequest({ method: 'GET', url: 'http://hipdatool.sinaapp.com/sync.php?data='+JSON.stringify(data), onload: onSynReply, overrideMimeType: "text/html; charset=gbk" }); break; case 1: // 使用 服务器 GM_setValue("HiPDA_Discovery_BLACK_LIST",serverBlacklist.join()); _syn_lastversion = serverVersion; GM_setValue("HiPDA_Discovery_SYN_LASTVERSION",_syn_lastversion); _syn_modified = false; GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified); document.getElementById('s_syn').style.background='#88ff88'; document.getElementById('s_syn').innerHTML="√ 已更新"; GM_setValue('HiPDA_Discovery_SYN_LASTTIME',nowtimestamp); refreshConfigDiv(); document.getElementById('hp_cfg_div').style.display = ""; document.getElementById('s_syn').removeEventListener('click', processConflict, false); _syn_pending=false; break; case 2: // 使用 本地 // 把配置界面显示出来,等待服务器回应 document.getElementById('hp_cfg_div').style.display = ""; document.getElementById('s_syn').style.background='#999'; document.getElementById('s_syn').innerHTML="同步中..."; // _syn_pending=false; // 向服务器发起请求 var data={ "uid":_uid, "lastversion":_syn_lastversion, "modified":_syn_modified, "action":"update", "blacklist":blacklistArray }; GM_xmlhttpRequest({ method: 'GET', url: 'http://hipdatool.sinaapp.com/sync.php?data='+JSON.stringify(data), onload: onSynReply, overrideMimeType: "text/html; charset=gbk" }); document.getElementById('s_syn').removeEventListener('click', processConflict, false); break; default: _syn_pending=false; } document.getElementById('hpdtool_syn_list').innerHTML=""; document.getElementById('hpdtool_syn_div').style.display = 'none'; } function onClickSynBtn(){ // 点击同步按钮 if(_syn_pending)return; if(_uid == 0) return; if(document.getElementById('s_syn').className=="disabled")return; _syn_pending=true; document.getElementById('s_syn').style.background='#999'; document.getElementById('s_syn').innerHTML="同步中..."; var data={ "uid":_uid, "lastversion":_syn_lastversion, "modified":_syn_modified, "action":"sync", "blacklist":blacklistArray }; GM_xmlhttpRequest({ method: 'GET', url: 'http://hipdatool.sinaapp.com/sync.php?data='+JSON.stringify(data), onload: onSynReply, overrideMimeType: "text/html; charset=gbk" }); } function onPageUnload(){ // 关闭页面时保存参数 _lvt = year + "-" + month + "-" + day + " " + hour + ":" + min; if((_pc == 1)&&(timeDiff(_lvt,_pxt))) GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,_lvt); } function onSaveConfig(save){ // [保存]、[取消]按钮触发,保存hpd-tool参数以及黑名单编辑结果 if(save){ var r = document.getElementsByClassName('bl_chk'); blacklistArray = new Array(); for (var i = r.length-1; i >= 0; i--) if(r[i].checked) blacklistArray.push(r[i].value); GM_setValue('HiPDA_Discovery_BLACK_LIST',blacklistArray.join()); if(blacklistLen != blacklistArray.length){ // 列表长度变化,表示列表进行了修改 _syn_modified = true; GM_setValue("HiPDA_Discovery_SYN_MODIFIED",_syn_modified); // 重新激活同步按钮 document.getElementById('s_syn').className="enable"; document.getElementById('s_syn').innerHTML="₪ 同步"; document.getElementById('s_syn').style.background='#eef9eb'; document.getElementById('s_syn').style.color='#000'; } blacklistLen=blacklistArray.length; blacklistStr=blacklistArray.toString(); var temp = document.getElementById('_chk_hightlight_color').value; if(RegExp("#[A-F,a-f,0-9]{6}").test(temp)){ var t = temp.indexOf("#"); _hightlight_color = temp.substr(t,7); }/*else alert('wrong color'); alert(_hightlight_color);*/ GM_setValue("HiPDA_Discovery_HIGHLIGHT_COLOR",_hightlight_color); var rd=document.getElementsByName('_radio_font_size'); for(var i=0;i0){ var t = window.location.search.substr(offset); if(t.indexOf("&") >0){ _pc = t.slice(5,t.indexOf("&")); }else{ _pc = t.slice(5); } }else{ _pc = 1; } offset = window.location.search.indexOf("tid="); if(offset>0){ var t = window.location.search.substr(offset); if(t.indexOf("&") >0){ _tid = t.slice(4,t.indexOf("&")); }else{ _tid = t.slice(4); } } } function refreshMinTime(){ // 取得当前页面的 _pmt —— 包含预读取的后续页面内容 var snapResults3 = document.evaluate("//td [@class='lastpost']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = snapResults3.snapshotLength - 1; i >= 0; i--){ var e = snapResults3.snapshotItem(i); //如果是置顶帖子,就不要取时间值 var checkTop = e.parentNode.getElementsByClassName('folder'); if(checkTop[0] != undefined){ if(checkTop[0].innerHTML.indexOf('images/default/pin')<0 && checkTop[0].innerHTML.indexOf('images/default/folder_lock')<0 ){ var _rt = e.getElementsByTagName('a')[1].text; if(timeDiff(_pmt,_rt)) _pmt = _rt; } //else alert(e.getElementsByTagName('a')[1].text); } } } // 论坛界面修改 function changeURL(){ // 把cnc页面上的连接都换成cnc.hi-pda.com var url = document.evaluate("//a", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var i = url.snapshotLength-1;i>=0;i--){ var a=url.snapshotItem(i); a.href=a.href.replace(/www.hi-pda.com/,document.domain); }; } function changeFontSize(save){ var sz=_font_size; if(save == false){ // 即时预览,未保存字体大小 var rd=document.getElementsByName('_radio_font_size'); for(var i=0;i= 0; i--) { var userdata=s.snapshotItem(i).getElementsByTagName('dl')[0]; if(userdata != undefined){ userdata.style.margin="0px 10px 0px 20px"; // 去掉了一些项目 userdata.removeChild(userdata.lastChild); userdata.removeChild(userdata.lastChild); var regtime1=userdata.lastChild; userdata.removeChild(userdata.lastChild); var regtime2=userdata.lastChild; userdata.removeChild(userdata.lastChild); userdata.removeChild(userdata.lastChild); userdata.removeChild(userdata.lastChild); userdata.appendChild(regtime2); userdata.appendChild(regtime1); s.snapshotItem(i).appendChild(userdata); // 去除头像悬停菜单 var avatar=s.snapshotItem(i).getElementsByClassName('avatar')[0]; avatar.removeAttribute('onmouseover'); } } GM_addStyle(".postauthor dt,.postauthor dd {color:#222222;height:1.2em;line-height:1.2em;}"); } if(!_reply_avatar && _bVIEWTHREAD>0 && document.getElementById('fastpostform') )document.getElementById('fastpostform').getElementsByClassName('avatar')[0].innerHTML=""; // 【发表回复】、【发表新帖】 if(document.getElementById('post_reply')) document.getElementById('post_reply').getElementsByTagName('a')[0].innerHTML="发表回复"; if(document.getElementById('newspecial')) document.getElementById('newspecial').innerHTML="发表新帖"; if(document.getElementById('newspecialtmp')) document.getElementById('newspecialtmp').innerHTML="发表新帖"; GM_addStyle("#post_reply,.forumcontrol #newspecial,.pages_btns #newspecial,.forumcontrol #newspecialtmp,.pages_btns #newspecialtmp{border:1px solid #003B54;line-height:22px;padding:2px 8px 2px 8px;float:left;margin:2px 5px 3px 5px}"); // 顶部菜单 if(document.getElementById('menu')){ document.getElementById('menu').style.display='none'; if(_uid>0){ document.getElementById('umenu').appendChild(document.createTextNode(" | ")); var menuitem=document.createElement('a'); menuitem.innerHTML="搜索"; menuitem.href='http://'+document.domain+'/forum/search.php'; document.getElementById('umenu').appendChild(menuitem); document.getElementById('umenu').appendChild(document.createTextNode(" | ")); menuitem=document.createElement('a'); menuitem.innerHTML="我的主题"; menuitem.target="_blank"; menuitem.href='http://'+document.domain+'/forum/my.php?item=threads'; document.getElementById('umenu').appendChild(menuitem); document.getElementById('umenu').appendChild(document.createTextNode(" ")); menuitem=document.createElement('a'); menuitem.innerHTML="我的回复"; menuitem.target="_blank"; menuitem.href='http://'+document.domain+'/forum/my.php?item=posts'; document.getElementById('umenu').appendChild(menuitem); document.getElementById('umenu').appendChild(document.createTextNode(" ")); menuitem=document.createElement('a'); menuitem.innerHTML="我的收藏"; menuitem.target="_blank"; menuitem.href='http://'+document.domain+'/forum/my.php?item=favorites&type=thread'; document.getElementById('umenu').appendChild(menuitem); } } // 下一页 // var nextpageurl=document.getElementsByClassName('pages')[1].getElementsByClassName('next')[0]; // if(nextpageurl != undefined){ // GM_addStyle(".thread-follow-page{border:1px solid #f00;height:31px;line-height:31px;align:center} .thread-follow-page a:hover{text-decoration:none}.thread-follow-page a{background-color:#DFD0BD;display:block;width:100%;height:31px;}"); // var nextpagebtn=document.createElement('div'); // nextpagebtn.className="thread-follow-page"; // nextpagebtn.innerHTML="点击显示下一页" // var pagenav=document.getElementsByClassName('forumcontrol')[1]; // if(pagenav != undefined){ // document.getElementsByTagName('body')[0].appendChild(nextpagebtn); // document.getElementById('wrap').insertBefore(nextpagebtn,pagenav); // } // } } function appendControl(){ // 添加[屏蔽]按钮 var s = document.evaluate("//div[@class='authorinfo']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = s.snapshotLength - 1; i >= 0; i--) { var t = s.snapshotItem(i); var a1=document.createElement('a'); a1.innerHTML = '屏蔽'; a1.href = '###'; a1.addEventListener('click', onBlockUser,false); t.appendChild(document.createTextNode(" | ")); t.appendChild(a1); } }; function addConfigDiv(){ // 添加Alt+O的界面 // 处理冲突界面 GM_addStyle('\ #hpdtool_syn_div { position:fixed;width:303px;bottom:20px;right:20px;font-size:13px;z-index:999;text-align:left;background-color:#9287AE;padding:15px;border:2px solid #bfbfbf;-moz-border-radius:5px;opacity:0.95;}\ #hpdtool_syn_div hr {color: #bfbfbf;border: 1px solid;margin: 8px 0;}\ #hpdtool_syn_div,#hpdtool_syn_div td,.hpdtool_syn_srv,.hpdtool_syn_lcl {color:#ffffff !important;}\ #hpdtool_syn_list {margin-left:5px;max-height:600px;overflow:auto;}\ #hpdtool_syn_div a {padding:2px 5px;-moz-border-radius: 4px;background: #eef9eb;width: 50px;border: 1px solid #aaa;}\ #hpdtool_syn_div a:hover {border: 1px solid #aaa;background: #fff;color: #000;}\ #hpdtool_syn_div .hpdtool_syn_new {width:45px;text-align:center;border-right:1px solid #fff;}\ #hpdtool_syn_div .hpdtool_syn_srv {width:78px;max-width:78px;text-align:center;border-right:1px solid #fff;padding:2px 5px;}\ #hpdtool_syn_div .hpdtool_syn_lcl {width:78px;max-width:78px;text-align:center;padding:2px 5px;}\ '); var hpdtool_syn = document.createElement("div"); hpdtool_syn.id = "hpdtool_syn_div"; hpdtool_syn.style.display = "none"; hpdtool_syn.innerHTML = "
同步冲突处理

\ 本地与服务器黑名单差异部分,相同部分已省略。请点选对应的列表进行同步。\

\ 新列表\ 服务器列表\   本地列表\     保持不变
"; document.getElementsByTagName('body')[0].appendChild(hpdtool_syn); document.getElementById('hpdtool_use_new').addEventListener('click', function(){onSynChooseBtn(0);}, false); document.getElementById('hpdtool_use_server').addEventListener('click', function(){onSynChooseBtn(1);}, false); document.getElementById('hpdtool_use_local').addEventListener('click', function(){onSynChooseBtn(2);}, false); document.getElementById('hpdtool_use_nothing').addEventListener('click', function(){onSynChooseBtn(3);}, false); // Alt+O 控制界面 GM_addStyle('\ #hp_cfg_div {position:fixed;align:center;width: 303px;padding: 15px;bottom:20px;right:20px;z-index:99;color:#fff;background:#9287AE;border:2px solid #bfbfbf;-moz-border-radius:5px;opacity:0.95;text-align:left;font-size:14px !important;}\ #hp_cfg_div input {height: 12px}\ #s_syn {display: none}\ #hp_cfg_div hr {color: #bfbfbf;border: 1px solid;margin: 8px 0;}\ #hp_cfg_div a {-moz-border-radius: 4px;background: #eef9eb;width: 50px;border: 1px solid #aaa;}\ #hp_cfg_div a:hover {border: 1px solid #aaa;background: #fff;color: #000;}\ #s_ok,#s_cl,#s_syn {padding:2px 5px;}\ #blacklist {margin-left:5px;max-height:600px;overflow:auto;}\ #_chk_hightlight_color {margin-left:4px;}\ '); var hp_cfg = document.createElement("div"); hp_cfg.id = "hp_cfg_div"; hp_cfg.style.display = "none"; hp_cfg.innerHTML = '
hi-pda ♥ tool version 5.2

\ 字体大小:\ \ \ \
\ 界面风格:\ 简版\ 头像菜单\ 回帖头像\
\ 新帖高亮:\ 启用\
\ 屏蔽用户:\ D版\ 其他\
\


\
\ √ 确定\  \ X 取消\     \ ₪ 同步\
\
\ '; document.getElementsByTagName('body')[0].appendChild(hp_cfg); if(_uid == 0){ document.getElementById('s_syn').innerHTML="未登录"; document.getElementById('s_syn').href="http://"+document.domain+"/forum/logging.php?action=login"; } document.getElementById('s_ok').addEventListener('click', function(){onSaveConfig(true);}, false); document.getElementById('s_cl').addEventListener('click', function(){onSaveConfig(false);}, false); document.getElementById('s_syn').addEventListener('click', function(){onClickSynBtn(false);}, false); document.getElementById('_font_size_13px').addEventListener('click', function(){changeFontSize(false);}, false); document.getElementById('_font_size_14px').addEventListener('click', function(){changeFontSize(false);}, false); document.getElementById('_font_size_16px').addEventListener('click', function(){changeFontSize(false);}, false); addHotKey('alt+O',function(){if(_syn_pending)return;refreshConfigDiv();onSaveConfig(false); }); addHotKey('Esc',function(){if(_syn_pending)return;else document.getElementById('hp_cfg_div').style.display = 'none'}); } function readConfig(){ grave_image="url(data:img/png;base64,\ iVBORw0KGgoAAAANSUhEUgAAAJYAAACECAYAAAEFGOLkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\ bWFnZVJlYWR5ccllPAAAA1xpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp\ bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6\ eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz\ NDM0MiwgMjAxMC8wMS8xMC0xODowNjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo\ dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw\ dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu\ MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz\ b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N\ Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMTIxRTYyMzYxMjZFMTExOTA1MkM0NDMxNTJG\ QzY0QSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyNUI0ODYyNDI2NjgxMUUxOEFEMkMyMzg3\ QkVENjI2OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyNUI0ODYyMzI2NjgxMUUxOEFEMkMy\ Mzg3QkVENjI2OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1Ij4gPHhtcE1N\ OkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDEyMUU2MjM2MTI2RTExMTkw\ NTJDNDQzMTUyRkM2NEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDEyMUU2MjM2MTI2RTEx\ MTkwNTJDNDQzMTUyRkM2NEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94Onht\ 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) no-repeat 90% 95%"; _hightlight_en = GM_getValue('HiPDA_Discovery_HIGHLIGHT_ENABLE'); if(_hightlight_en == undefined)_hightlight_en = false; if(_hightlight_en == "false" || !_hightlight_en) _hightlight_en = false; else _hightlight_en = true; _blacklist_en_hpd = GM_getValue('HiPDA_Discovery_BLACKLIST_ENABLE_HPD'); if(_blacklist_en_hpd == undefined)_blacklist_en_hpd = true; if(_blacklist_en_hpd == "false" || !_blacklist_en_hpd) _blacklist_en_hpd = false; else _blacklist_en_hpd = true; _blacklist_en_other = GM_getValue('HiPDA_Discovery_BLACKLIST_ENABLE_OTHER'); if(_blacklist_en_other == undefined)_blacklist_en_other = true; if(_blacklist_en_other == "false" || !_blacklist_en_other) _blacklist_en_other = false; else _blacklist_en_other = true; _simple_style = GM_getValue('HiPDA_Discovery_SIMPLE_STYLE'); if(_simple_style == undefined)_simple_style = true; if(_simple_style == "false" || !_simple_style) _simple_style = false; else _simple_style = true; _hover_style = GM_getValue('HiPDA_Discovery_HOVER_STYLE'); if(_hover_style == undefined)_hover_style = false; if(_hover_style == "false" || !_hover_style) _hover_style = false; else _hover_style = true; _reply_avatar = GM_getValue('HiPDA_Discovery_REPLY_AVATAR'); if(_reply_avatar == undefined)_reply_avatar = false; if(_reply_avatar == "false" || !_reply_avatar ) _reply_avatar = false; else _reply_avatar = true; _syn_modified = GM_getValue('HiPDA_Discovery_SYN_MODIFIED'); if(_syn_modified == undefined)_syn_modified = false; if(_syn_modified == "false" || !_syn_modified) _syn_modified = false; else _syn_modified = true; _hightlight_color = GM_getValue('HiPDA_Discovery_HIGHLIGHT_COLOR'); if(_hightlight_color == undefined)_hightlight_color = "#F0E68C"; _font_size = GM_getValue('HiPDA_Discovery_FONT_SIZE'); if(_font_size == undefined)_font_size = '13'; _syn_lastversion = GM_getValue('HiPDA_Discovery_SYN_LASTVERSION'); if(_syn_lastversion == undefined)_syn_lastversion = 0; var b = GM_getValue('HiPDA_Discovery_BLACK_LIST'); if(b == undefined)b=''; blacklistArray = ''; if(b.length)blacklistArray = b.split(","); else blacklistArray = new Array(); blacklistLen=blacklistArray.length; blacklistStr=blacklistArray.toString(); try{ // 取得当前登录用户 uid var c = document.getElementById('umenu').getElementsByTagName('cite')[0].getElementsByTagName('a')[0].href; _uid = c.substr(c.indexOf("uid=")+4); if(c.indexOf("&")>0) _uid = c.substr(0,c.indexOf("&")); }catch (e) {_uid = 0;} _today = year + "-" + month + "-" + day; _pxt = "1900-1-1 01:01"; _pmt = year + "-" + month + "-" + day + " " + hour + ":" + min; var offset = window.location.search.indexOf("page="); if(offset>0){ var t = window.location.search.substr(offset); if(t.indexOf("&") >0) _pc = t.slice(5,t.indexOf("&")); else _pc = t.slice(5); } else _pc = 1; offset = window.location.search.indexOf("fid="); if(offset>0){ var t = window.location.search.substr(offset); if(t.indexOf("&") >0)_fid = t.slice(4,t.indexOf("&")); else _fid = t.slice(4); } else _fid = 2; // 默认D版好了 _lvt = GM_getValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid); if(_lvt == undefined){ _lvt = year + "-" + month + "-" + day + " " + hour + ":" + min; _first_time_use = true; GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,_lvt); } else _first_time_use = false; } function refreshConfigDiv(){ // 刷新编辑黑名单的界面 readConfig(); document.getElementById('_chk_hightlight_color').value=_hightlight_color; document.getElementById('_chk_hightlight_en').checked=( !_hightlight_en || _hightlight_en=="false")?0:1; document.getElementById('_chk_blacklist_en_hpd').checked=( !_blacklist_en_hpd || _blacklist_en_hpd=="false")?0:1; document.getElementById('_chk_blacklist_en_other').checked=( !_blacklist_en_other || _blacklist_en_other=="false")?0:1; document.getElementById('_chk_simple_style').checked=( !_simple_style || _simple_style=="false")?0:1; document.getElementById('_chk_hover_style').checked=( !_hover_style || _hover_style=="false")?0:1; document.getElementById('_chk_reply_avatar').checked=( !_reply_avatar || _reply_avatar=="false")?0:1; // 被点击过以后就不必更新此按钮,直到刷新页面 if(document.getElementById('s_syn').className != "disabled") { if(_uid == 0){ document.getElementById('s_syn').innerHTML="未登录"; document.getElementById('s_syn').href="http://"+document.domain+"/forum/logging.php?action=login"; } else { document.getElementById('s_syn').innerHTML="₪ 同步"; document.getElementById('s_syn').style.background='#eef9eb'; document.getElementById('s_syn').style.color='#000'; } } document.getElementById('s_syn').title="上次同步时间:"+GM_getValue('HiPDA_Discovery_SYN_LASTTIME'); var rd=document.getElementsByName('_radio_font_size'); for(var i=0;i0){ // 帖子 var s = document.evaluate("//div[@class='postinfo']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = s.snapshotLength - 1; i >= 0; i--) { var t = s.snapshotItem(i); var a = t.getElementsByTagName('a')[0]; if( a != undefined){ var u = a.href.substring(a.href.indexOf('uid')+4); t.parentNode.parentNode.parentNode.parentNode.style.display=(blacklistStr.indexOf(u+'='+a.text)>=0)?'none':''; } } // 屏蔽 被引用 的黑名单用户发言 s = document.evaluate("//div[@class='quote']//blockquote//font//font[@color='#999999']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = s.snapshotLength - 1; i >= 0; i--) { var t = s.snapshotItem(i); var n=t.innerHTML.substring(0,t.innerHTML.indexOf('发表于')-1); if(blacklistStr.indexOf(('='+n+','))>=0)t.parentNode.parentNode.parentNode.style.display = 'none'; } } if(_bFORUMDISPLAY>0){ // 论坛列表 // 屏蔽BLACK_LIST的发帖 var s = document.evaluate("//td[@class='author']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = s.snapshotLength - 1; i >= 0; i--) { var t = s.snapshotItem(i); var a = t.getElementsByTagName('a')[0]; if( a != undefined){ var n = a.text; var u = a.href.substring(a.href.indexOf('uid')+4); if(blacklistStr.indexOf(u+'='+n)>=0)t.parentNode.parentNode.style.display='none'; else t.parentNode.parentNode.style.display=''; } } // 隐藏BLACK_LIST在最后回复位置的显示 s = document.evaluate("//td[@class='lastpost']",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = s.snapshotLength - 1; i >= 0; i--) { var t = s.snapshotItem(i); var a = t.getElementsByTagName('a')[1]; if((a != undefined)&&(blacklistStr.indexOf(('='+a.text))>=0))a.innerHTML='anonymous'; } } }; function processShowHiddenText(){ // 好孩子看得见 var s = document.evaluate("//font[\ translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='white' \ or translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='#ffffff'\ or translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='#wheat'\ or translate(@color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz')='#lemonchiffon']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = s.snapshotLength - 1; i >= 0; i--) { var t=s.snapshotItem(i).innerHTML; t=t.replace(/white/i,"red"); t=t.replace(/#ffffff/i,"red"); t=t.replace(/wheat/i,"red"); t=t.replace(/lemonchiffon/i,"red"); //t=s.snapshotItem(i).innerHTML='
好孩子看不见'+t+'
'; t=s.snapshotItem(i).innerHTML='
'+t+'
'; } }; function processHighlightColor(){ // 对帖子进行高亮 if( !_hightlight_en ){ // 如果不启用高亮就把这次页面打开的时刻写进去 if( 1 == _pc ) GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,year + "-" + month + "-" + day + " " + hour + ":" + min) return; } if(_bFORUMDISPLAY>0){ // 遍历页面中的帖子列表,将所有“最后回复时间”大于 _lvt 的帖子背景色换成 _hightlight_color // 这里没有排除置顶帖子 var f = document.evaluate("//td[@class='lastpost']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = f.snapshotLength - 1; i >= 0; i--){ var e = f.snapshotItem(i); var a = e.getElementsByTagName('a')[1]; if( a != undefined){ var _rt = a.text; if (timeDiff(_rt,_lvt)){ e.parentNode.style.background=_hightlight_color; e.parentNode.addEventListener('mouseover',mouseOverPost,false); } if(timeDiff(_rt,_pxt))_pxt = _rt; if(timeDiff(_pxt,_lvt)) GM_setValue("HiPDA_Discovery_LAST_VISIT_TIME"+_fid,_pxt); } } // 将发帖日期超过30天的帖子里发帖人单元格背景换成 _old_post_bgcolor :灰色 // 将当天发布的帖子里发帖日期颜色变成 _today_post_color :红色 var snapResults = document.evaluate("//td [@class='author']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = snapResults.snapshotLength - 1; i >= 0; i--) { var e = snapResults.snapshotItem(i).getElementsByTagName('em')[0]; if(e != undefined){ var dd = dateDiff(e.innerHTML,_today); if (dd >= 30) { if (e.parentNode.parentNode.innerHTML.indexOf("images/default/pin")==-1 && e.parentNode.parentNode.innerHTML.indexOf('images/default/folder_lock')==-1 ){ e.parentNode.parentNode.style.background=_old_post_bgcolor; e.parentNode.parentNode.removeEventListener('mouseover',mouseOverPost,false); } } if (dd == 0) { if (e.parentNode.parentNode.innerHTML.indexOf("images/default/pin")==-1 && e.parentNode.parentNode.innerHTML.indexOf('images/default/folder_lock')==-1 ) e.style.color=_today_post_color; } } } } if(_bVIEWTHREAD>0){ var pst=document.evaluate("//div[@class='postinfo']//strong//a//em", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = pst.snapshotLength - 1; i >= 0; i--){ if(pst.snapshotItem(i).innerHTML == 1){ // 1st floor var t1=pst.snapshotItem(i).parentNode.parentNode.parentNode.getElementsByClassName('authorinfo')[0].getElementsByTagName('em')[0]; if(t1 != undefined){ var postdate=t1.innerHTML; postdate = postdate.substr(4,postdate.indexOf(':')-7); if(dateDiff(postdate,_today) >=30) t1.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('defaultpost')[0].style.background=grave_image; } } } } } function processImageZoom(){ // 调整附件图片大小 var imglist=document.evaluate("//img[substring(@id,1,5)='aimg_']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = imglist.snapshotLength - 1; i >= 0; i--) imglist.snapshotItem(i).addEventListener('load',onAttachImageLoaded,false); } function processConflict(){ document.getElementById('hp_cfg_div').style.display = 'none'; // 显示【勾选界面】,【服务器列表】,【本地列表】的差异换面和对应选项 // 如果以服务器为准,则存储response的version和list即可 // 如果以本地为准、或以新列表为准(先存储新列表),则请求action=update,等待返回结果【跳到 case 1:】 newBlacklist = new Array(); var listhtml="
---------- 第"+_pc+"页 ----------
    
---------- 第"+_pc+"页 ----------
"; var i; for ( i in serverBlacklist ){ var item = serverBlacklist[i]; if(/\d+=.+/.test(item)){ if(blacklistStr.indexOf(item)>=0){ // 服务、本地名单都有 newBlacklist.push(item); } else{ // 服务器有,本地没有 var n = item.substr(item.indexOf('=')+1); listhtml = listhtml +""; } } } for ( i in blacklistArray ){ var item = blacklistArray[i]; if( /\d+=.+/.test(item) && serverListStr.indexOf( item )<0 ){ // 本地有,服务器没有 var n = item.substr(item.indexOf('=')+1); listhtml = listhtml +""; } } listhtml = listhtml + "
"+n+" 
 "+n+"
"; document.getElementById('hpdtool_syn_list').innerHTML = listhtml; document.getElementById('hpdtool_syn_div').style.display=""; } readConfig(); changeStyle(); changeURL(); if(_bFORUMDISPLAY>0 || _bVIEWTHREAD>0){ addConfigDiv(); window.addEventListener('resize',onWindowResize,false); } if(_bFORUMDISPLAY>0){ window.addEventListener('unload',onPageUnload,false); refreshMinTime(); // 一开始就刷新一次_pmt,否则直接就取下一页了 if(!_first_time_use && _hightlight_en){ //第一次用就不往后续读取了 if(timeDiff(_pmt,_lvt)){ _pc++; GM_xmlhttpRequest({ method: 'GET', url: 'http://'+document.domain+'/forum/forumdisplay.php?fid='+_fid+'&page='+_pc, onload: onLoadNewPage, overrideMimeType: "text/html; charset=gbk" }); } } processHighlightColor(); processBlackList(); } if(_bVIEWTHREAD>0){ appendControl(); processBlackList(); processHighlightColor(); processShowHiddenText(); _att_max_width=document.getElementsByClassName('t_msgfontfix')[0].clientWidth; // 最宽这么宽 if(_att_max_width<10)_att_max_width=600; processImageZoom(); }