// ==UserScript==
// @name bahamut Comment enhanced
// @namespace http://userscripts/user
// @include http://forum.gamer.com.tw/C.php?*
// @include http://forum.gamer.com.tw/Co.php?*
// @include https://forum.gamer.com.tw/C.php?*
// @include https://forum.gamer.com.tw/Co.php?*
// @description 可調整巴哈姆特哈啦討論區留言的顯示順序(新留言在上或舊留言在上)、切換直接顯示留言者帳號、加入留言樓層數字
// @version 1.10
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// ==/UserScript==
//滑鼠移上留言時背景底色變化
GM_addStyle(".c-reply__item:hover {background-color : #eaeaea !important;}");
GM_addStyle(".user--sm {display :none !important;}");
GM_addStyle(".reply-content__time {text-align :right !important; float:right !important;}");
//記錄最後使用的留言排列順序
var BHCOA;
var BHCO = GM_getValue("BHCO",false);
var rk = GM_getValue("BHCO",false);
var BHCNW = GM_getValue("BHCNW",false);
var BHCNE = GM_getValue("BHCNE",true);
var oldextendComment = unsafeWindow.extendComment;
var oldfoldedComment = unsafeWindow.foldedComment;
//在原函式 extendComment 中加入新功能
function extendComment(bsn,snB){
var cptext = "Commendlist_"+snB;
var where = "showoldCommend_"+snB;
var cptmp = unsafeWindow.document.getElementById(cptext).getElementsByClassName("c-reply__item");
var ntmp = parseInt(unsafeWindow.document.getElementById(where).innerHTML.substring(42))+cptmp.length;
oldextendComment(bsn,snB);
BHCWait(cptmp,ntmp,unsafeWindow.document.getElementById(where).parentNode.firstChild.firstChild.innerHTML.substring(5));
BHCOA = BHCO;
}
//在原函式 foldedComment 中加入新功能
function foldedComment(snB){
oldfoldedComment(snB);
var cptext = "Commendlist_"+snB;
var where = "showoldCommend_"+snB;
var cptmp = unsafeWindow.document.getElementById(cptext).getElementsByClassName("c-reply__item");
if((parseInt(cptmp[0].id.substring(15))>parseInt(cptmp[1].id.substring(15)) && unsafeWindow.document.getElementById(where).parentNode.firstChild.firstChild.innerHTML.substring(5) == "↑")||(parseInt(cptmp[0].id.substring(15))<parseInt(cptmp[1].id.substring(15)) && unsafeWindow.document.getElementById(where).parentNode.firstChild.firstChild.innerHTML.substring(5) == "↓")){
CommentOrder(cptmp,false);
CommentAccountName(cptmp,true);
}
else{
CommentOrder(cptmp,true);
CommentAccountName(cptmp,true);
}
}
//開啟所有舊留言,在讀取完留言後進行新功能
function BHCWait(cps,num,ud){
if(cps.length<num && cps.length<6)
window.setTimeout(function(){unsafeWindow.BHCWait(cps,num,ud)}, 50);
else {
if(ud=="↑"){
CommentOrder(cps,true,num);
CommentAccountName(cps,true);
}
else{
CommentOrder(cps,false,num);
CommentAccountName(cps,true);
}
}
}
//留言加入樓數、排列順序
function CommentOrder(BHCA,rkey,num){
var l;
if(num && num>1000)
l=num-1000;
else
l=0;
var k = BHCA.length;
if(k>0){
var nodetmp,nodeIdtmp,nodeNametmp,j,m,nodeid,nodeName,showtmp;
var SA = BHCA[0].parentNode.parentNode.firstChild.getElementsByTagName("span");
if(SA.length > 0 && SA[0].parentNode.className == "more-reply"){
m = parseInt(SA[0].innerHTML.substring(2));
}
else
m = l;
for(j = 0;j<parseInt(k/2);j++){
if(BHCA[j].firstChild.tagName == "BUTTON" || BHCA[j].firstChild.tagName == "button"){
var newnode1 = unsafeWindow.document.createElement("span");
var newnode2 = unsafeWindow.document.createElement("span");
newnode1.innerHTML = (j+1+m) + " :";
newnode2.innerHTML = (k-j+m) + " :";
newnode1.setAttribute("style","color:#585858;margin:0 5px 0 -2px;float:left;");
newnode2.setAttribute("style","color:#585858;margin:0 5px 0 -2px;float:left;");
newnode1.setAttribute("nickname",BHCA[j].childNodes[4].childNodes[1].innerHTML);
newnode2.setAttribute("nickname",BHCA[k-j-1].childNodes[4].childNodes[1].innerHTML);
newnode1.setAttribute("account",BHCA[j].childNodes[4].childNodes[1].href.substring(26));
newnode2.setAttribute("account",BHCA[k-j-1].childNodes[4].childNodes[1].href.substring(26));
BHCA[j].insertBefore(newnode1,BHCA[j].firstChild);
BHCA[k-j-1].insertBefore(newnode2,BHCA[k-j-1].firstChild);
}
if(rkey){
nodetmp = BHCA[j].innerHTML;
nodeIdtmp = BHCA[j].getAttribute("id");
BHCA[j].innerHTML = BHCA[k-j-1].innerHTML;
BHCA[j].setAttribute("id",BHCA[k-j-1].getAttribute("id"));
BHCA[k-j-1].innerHTML = nodetmp;
BHCA[k-j-1].setAttribute("id",nodeIdtmp);
}
}
if(j == (k-j-1) && (BHCA[j].firstChild.tagName == "BUTTON" || BHCA[j].firstChild.tagName == "button")){
var newnode3 = unsafeWindow.document.createElement("span");
newnode3.innerHTML = (j+1+m) + " :";
newnode3.setAttribute("style","color:#585858;margin:0 5px 0 -2px;float:left;");
newnode3.setAttribute("nickname",BHCA[j].childNodes[4].childNodes[1].innerHTML);
newnode3.setAttribute("account",BHCA[j].childNodes[4].childNodes[1].href.substring(26));
BHCA[j].insertBefore(newnode3,BHCA[j].firstChild);
}
}
}
//變更留言者帳號、暱稱
function CommentAccountName(BHCA,check){
var k = BHCA.length;
if(k>0){
var j,AN,NN,sk;
if(BHCNW){
if(BHCNE)
sk = 1;
else
sk = 2;
}
else{
if(BHCNE)
sk = 0;
else
sk = 3;
}
if(check){
var Ctmp = BHCA[0].parentNode.parentNode.getElementsByClassName("c-reply__head nocontent");
if(Ctmp.length > 0)
switch(sk){
case 1:
Ctmp[0].childNodes[1].childNodes[0].innerHTML = "帳號(暱稱)";
break;
case 2:
Ctmp[0].childNodes[1].childNodes[0].innerHTML = "帳號";
break;
case 3:
Ctmp[0].childNodes[1].childNodes[0].innerHTML = "頭像";
break;
default:
Ctmp[0].childNodes[1].childNodes[0].innerHTML ="暱稱";
}
}
for(j = 0;j<k;j++){
var AC = BHCA[j].getElementsByClassName("reply-content__user");
var AP = BHCA[j].getElementsByClassName("reply-avatar user--sm")
NN = BHCA[j].firstChild.getAttribute("nickname");
AN = BHCA[j].firstChild.getAttribute("account");
var Namenode = unsafeWindow.document.createElement("span");
switch(sk){
case 1:
Namenode.innerHTML = " (" + NN + ")";
Namenode.setAttribute("style","color:#282828;margin:0 5px 0 -2px;");
AC[0].innerHTML = AN;
AC[0].title = AN;
AP[0].style = "display:none !important;";
break;
case 2:
AC[0].innerHTML = AN;
AC[0].title = NN;
AP[0].style = "display:none !important;";
break;
case 3:
AC[0].innerHTML = NN;
AC[0].title = AN;
AP[0].style = "display:block !important;";
break;
default:
AC[0].innerHTML = NN;
AC[0].title = AN;
AP[0].style = "display:none !important;";
}
if(AC[0].nextElementSibling.tagName != "SPAN" && AC[0].nextElementSibling.tagName != "span"){
switch(sk){
case 1:
AC[0].parentNode.insertBefore(Namenode,AC[0].parentNode.childNodes[2]);
break;
case 2:
case 3:
default:
}
}
else{
switch(sk){
case 1:
break;
case 2:
case 3:
default:
AC[0].parentNode.removeChild(AC[0].parentNode.childNodes[2]);
}
}
}
}
}
//調整留言排列順序
function GamerCommentReverse(event){
var BHDivs =(event) ? event.currentTarget.parentNode.parentNode.getElementsByTagName("div") : unsafeWindow.document.getElementsByTagName("div");
var ek = (event) ? true : false;
if(event){
rk = (rk) ? false : true;
BHCO = rk;
if(event.currentTarget.firstChild.innerHTML == "↑留言順序↑")
event.currentTarget.firstChild.innerHTML = "↓留言順序↓";
else
event.currentTarget.firstChild.innerHTML = "↑留言順序↑" ;
GM_setValue("BHCO",rk);
}
for(i = 0;i < BHDivs.length;i++){
var SC = 0;
if(BHDivs[i].id.substring(0,11) == "Commendlist"){
var BHDivCA = BHDivs[i].getElementsByClassName("c-reply__item");
CommentOrder(BHDivCA,ek||rk);
}
}
}
//切換直接顯示留言者帳號
function GamerCommentNameSwitch(event){
var ktmp;
var BHDivs =(event) ? event.currentTarget.parentNode.parentNode.getElementsByTagName("div") : unsafeWindow.document.getElementsByTagName("div");
if(event){
if(BHCNW){
if(BHCNE)
BHCNE = false;
else{
BHCNW = false ;
BHCNE = true;
}
}
else{
if(BHCNE){
BHCNW = false;
BHCNE = false;
}
else{
BHCNW = true;
BHCNE = true;
}
}
if(BHCNW){
if(BHCNE)
event.currentTarget.firstChild.innerHTML = "帳號(暱稱)";
else
event.currentTarget.firstChild.innerHTML = "帳號";
}
else{
if(BHCNE)
event.currentTarget.firstChild.innerHTML = "暱稱";
else
event.currentTarget.firstChild.innerHTML = "頭像";
}
GM_setValue("BHCNW",BHCNW);
GM_setValue("BHCNE",BHCNE);
}
for(i = 0;i < BHDivs.length;i++){
if(BHDivs[i].id.substring(0,11) == "Commendlist"){
var BHCs = BHDivs[i].getElementsByClassName("c-reply__item");
CommentAccountName(BHCs);
}
}
}
//加入改變留言順序的連結點
function BHCES(){
unsafeWindow.BHCWait = exportFunction(BHCWait,unsafeWindow);
unsafeWindow.extendComment = exportFunction(extendComment,unsafeWindow);
unsafeWindow.foldedComment = exportFunction(foldedComment,unsafeWindow);
unsafeWindow.GamerCommentReverse = exportFunction(GamerCommentReverse,unsafeWindow);
unsafeWindow.GamerCommentNameSwitch = exportFunction(GamerCommentNameSwitch,unsafeWindow);
GamerCommentReverse();
GamerCommentNameSwitch();
var BHDivA = unsafeWindow.document.getElementsByTagName("div");
for(i = 0;i < BHDivA.length;i++){
if(BHDivA[i].className == "c-post__footer c-reply"){
var j,pchecked1 = false,pchecked2 = false,pchecked3 = false;
var tmp = (BHCO) ? "↑" : "↓";
var ANtmp
if(BHCNW)
ANtmp = (BHCNE) ? "帳號(暱稱)" : "帳號";
else
ANtmp = (BHCNE) ? "暱稱" : "頭像";
for(j = 0;j < BHDivA[i].childNodes.length;j++){
if(BHDivA[i].childNodes[j].className == "c-reply__head nocontent")
pchecked1 = true;
if(BHDivA[i].childNodes[j].id.substring(0,11) == "Commendlist" && BHDivA[i].childNodes[j].childNodes.length > 2)
pchecked2 = true;
else if(BHDivA[i].childNodes[j].id.substring(0,11) == "Commendlist" && BHDivA[i].childNodes[j].childNodes.length > 0)
pchecked3 = true;
}
if(!pchecked1 && pchecked2){
BHDivA[i].innerHTML = '<div class="c-reply__head nocontent"><span style="text-align:left;float:left;"><a href ="javascript:;" title="變換留言的顯示順序">'+tmp+'留言順序'+tmp+'</a></span><span style="text-align:left;float:left;"><a href ="javascript:;" title="切換顯示留言者的帳號、暱稱">'+ANtmp+'</a></span></div>' + BHDivA[i].innerHTML;
BHDivA[i].firstChild.firstChild.addEventListener('click',unsafeWindow.GamerCommentReverse,true);
BHDivA[i].firstChild.childNodes[1].addEventListener('click',unsafeWindow.GamerCommentNameSwitch,true);
}
else if(!pchecked1 && pchecked3){
BHDivA[i].innerHTML = '<div class="c-reply__head nocontent"><span style="text-align:left;float:left;"><a href ="javascript:;" title="切換顯示留言者的帳號、暱稱">'+ANtmp+'</a></span></div>' + BHDivA[i].innerHTML;
BHDivA[i].firstChild.firstChild.addEventListener('click',unsafeWindow.GamerCommentNameSwitch,true);
}
else if(pchecked1){
BHDivA[i].firstChild.innerHTML = '<span style="text-align:left;float:left;"><a href ="javascript:;" title="變換留言的顯示順序">'+tmp+'留言順序'+tmp+'</a></span><span style="text-align:left;float:left;"><a href ="javascript:;" title="切換顯示留言者的帳號、暱稱">'+ANtmp+'</a></span>' + BHDivA[i].firstChild.innerHTML;
BHDivA[i].firstChild.firstChild.addEventListener('click',unsafeWindow.GamerCommentReverse,true);
BHDivA[i].firstChild.childNodes[1].addEventListener('click',unsafeWindow.GamerCommentNameSwitch,true);
}
}
}
}
BHCES();