Enhance HKEPC trading forum
目前為
// ==UserScript==
// @name HKEPC+
// @namespace http://www.hkepc.com/
// @version 0.1
// @description Enhance HKEPC trading forum
// @author lacek
// @match http://www.hkepc.com/forum/*
// @grant none
// ==/UserScript==
/* jshint -W097 */
'use strict';
(function() {
var HKEPC = {
init: function() {
this.fixSearch();
var page = this.determinePage();
this.processPage(page);
},
determinePage: function() {
var page = null;
var url = window.location.href.toLowerCase();
var file = url.substring(url.lastIndexOf('/') + 1);
if (file === "index.php" || file === "") {
page = 'index';
}
else if (file.indexOf("index.php?gid=") === 0) {
page = 'group';
}
else if (file.indexOf("forumdisplay.php") === 0) {
page = 'forum';
}
else if (file.indexOf("viewthread.php") === 0) {
page = 'thread';
}
return page;
},
processPage: function(page) {
if (page !== null) {
if (typeof (this[page + "PageProcessor"]) == 'function') {
this[page + "PageProcessor"]();
}
}
},
indexPageProcessor: function() {
//add '&orderby=dateline' to links to trading forums
var searchStart = 200; //((19*3-9)°Ï)*4+8
var searchEnd = 300;
var linksPerBlock = 2;
var tradeLinks = ['?fid=14', '?fid=81', '?fid=119'];
var aTag = document.getElementById('mainIndex').getElementsByTagName('a');
var linksChanged = 0;
for (var i = 0; i < tradeLinks.length; i++) {
for (var j = searchStart; j < searchEnd; j++) {
if (aTag[j].href.indexOf(tradeLinks[i]) != -1) {
aTag[j].href += '&orderby=dateline';
linksChanged++;
if (linksChanged >= linksPerBlock) {
linksChanged = 0;
break; //seach for next link
}
}
}
}
},
groupPageProcessor: function() {
},
forumPageProcessor: function() {
this.patchForumPageHotkey();
this.patchThreadLinks();
this.removeForumAd();
},
threadPageProcessor: function() {
if(this.getQueryValue(window.location.href, "extra") !== "") this.patchThreadPageHotkey();
},
//patch arrow hotkey links that contains '&'
patchForumPageHotkey: function() {
var oldScript = document.querySelector('#wrap > script[type="text/javascript"]');
var newScript = document.createElement('script');
newScript.innerHTML = oldScript.innerHTML.replace(/\amp;/g, "");
oldScript.parentNode.appendChild(newScript);
oldScript.parentNode.removeChild(oldScript);
},
//patch arrow hotkey link that misses parameters
patchThreadPageHotkey: function() {
var oldScript = document.getElementById('wrap').getElementsByTagName('script');
var oldUrl = null;
for (var i = 0; i < oldScript.length; i++) {
if ((oldUrl = oldScript[i].innerHTML.match(/'viewthread.php\?tid=[0-9]+'/)) !== null) {
var newScript = document.createElement('script');
oldUrl = oldUrl[0].substring(1, oldUrl[0].length - 1);
var newUrl = oldUrl + "&extra=" + this.getQueryValue(window.location.href, 'extra');
newScript.innerHTML = oldScript[i].innerHTML.replace(oldUrl, newUrl);
oldScript[i].parentNode.appendChild(newScript);
oldScript[i].parentNode.removeChild(oldScript[i]);
break;
}
}
},
//patch forum incorrect links containing '&'
patchThreadLinks: function() {
var spanTag = document.getElementById("threadlist").getElementsByTagName("span");
var spanTagLen = spanTag.length;
var aTag;
for (var i = 0; i < spanTagLen; i++) {
if (spanTag[i].id.indexOf('thread_') === 0) {
aTag = spanTag[i].getElementsByTagName("a")[0];
aTag.href = aTag.href.replace(/\amp%3B/g, "");
}
}
},
removeForumAd: function() {
var ths = this.$x('//form[@id="moderate"]/table[@class="datatable"]/tbody[not(@id)]/tr/th[@class="subject" and descendant::script]');
for (var i = 0; i < ths.length; i++) {
var tbody = ths[i].parentNode;
if (tbody) {
tbody.parentNode.removeChild(tbody);
}
}
},
fixSearch: function() {
var input = this.$x('//input[@name="srchtxt"]');
if (input && input.length) input = input[0];
if (input) {
input.style.width = '145px';
}
},
//Get the value of parameter from a URL
getQueryValue: function(url, name) {
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec(url);
return (results === null) ? "" : results[1];
},
$x: function () {
var x='';
var node=document;
var type=0;
var fix=true;
var i=0;
var cur;
function toArray(xp) {
var final=[], next;
next=xp.iterateNext();
while (next) {
final.push(next);
next=xp.iterateNext();
}
return final;
}
cur=arguments[i++];
while (cur) {
switch (typeof cur) {
case "string": x+=(x==='') ? cur : " | " + cur; continue;
case "number": type=cur; continue;
case "object": node=cur; continue;
case "boolean": fix=cur; continue;
}
cur=arguments[i++];
}
if (fix) {
if (type==6) type=4;
if (type==7) type=5;
}
// selection mistake helper
if (!/^\//.test(x)) x="//"+x;
// context mistake helper
if (node!=document && !/^\./.test(x)) x="."+x;
var result=document.evaluate(x, node, null, type, null);
if (fix) {
// automatically return special type
switch (type) {
case 1: return result.numberValue;
case 2: return result.stringValue;
case 3: return result.booleanValue;
case 8:
case 9: return result.singleNodeValue;
}
}
return fix ? toArray(result) : result;
}
};
HKEPC.init();
})();