bahamut commend enhanced

可調整巴哈姆特哈啦討論區留言的顯示順序(新留言在上或舊留言在上)、加入留言樓層數字、單獨開啟關閉某篇文章圖片影像

  1. // ==UserScript==
  2. // @name bahamut commend enhanced
  3. // @namespace http://userscripts/user
  4. // @include http://forum.gamer.com.tw/C.php?*
  5. // @include http://forum.gamer.com.tw/Co.php?*
  6. // @description 可調整巴哈姆特哈啦討論區留言的顯示順序(新留言在上或舊留言在上)、加入留言樓層數字、單獨開啟關閉某篇文章圖片影像
  7. // @version 1.04.3
  8. // @grant GM_getValue
  9. // @grant GM_setValue
  10. // @grant GM_addStyle
  11. // ==/UserScript==
  12. //滑鼠移上留言時背景底色變化
  13. GM_addStyle(".FM-cbox10 p:hover { background-color : #eaeaea !important;}");
  14. //記錄最後使用的留言排列順序
  15. BHCO = GM_getValue("BHCO",false);
  16. var rk = GM_getValue("BHCO",false);
  17. var oldallCommend = unsafeWindow.allCommend;
  18. var oldcloseallCommend = unsafeWindow.closeallCommend;
  19. var oldforumShowAllMedia = unsafeWindow.forumShowAllMedia;
  20. var oldmoreCommend = unsafeWindow.moreCommend;
  21. //在原函式 moreCommend 中加入新功能
  22. unsafeWindow.moreCommend = function (bsn,snB,where){
  23. var cptext = "Commendlist_"+snB;
  24. var cptmp = unsafeWindow.document.getElementById(cptext).getElementsByTagName("p");
  25. var ntmp = parseInt(unsafeWindow.document.getElementById("showoldCommend_"+snB).innerHTML.substring(6)) + parseInt(unsafeWindow.document.getElementById("Commendlist5_"+snB).childNodes.length)-1;
  26. oldmoreCommend(bsn,snB,where);
  27. BHC1000Wait(cptmp,ntmp,snB);
  28. BHCOA = BHCO;
  29. }
  30. //在原函式 allCommend 中加入新功能
  31. unsafeWindow.allCommend = function (bsn,snB,where){
  32. var cptext = "Commendlist_"+snB;
  33. var cptmp = unsafeWindow.document.getElementById(cptext).getElementsByTagName("p");
  34. var ntmp = parseInt(unsafeWindow.document.getElementById(where).innerHTML.substring(6))+cptmp.length;
  35. oldallCommend(bsn,snB,where);
  36. BHCWait(cptmp,ntmp);
  37. BHCOA = BHCO;
  38. }
  39. //在原函式 closeallCommend 中加入新功能
  40. unsafeWindow.closeallCommend = function (bsn,snB,where){
  41. oldcloseallCommend(bsn,snB,where);
  42. var cptext = "Commendlist_"+snB;
  43. var cptmp = unsafeWindow.document.getElementById(cptext).getElementsByTagName("p");
  44. if(BHCO == BHCOA)
  45. CommendOrder(cptmp,false);
  46. else
  47. CommendOrder(cptmp,true);
  48. }
  49. //在原函式 forumShowAllMedia 中加入新功能
  50. forumShowAllMedia = function (a){
  51. GamerChangeAllBtnToClose();
  52. return oldforumShowAllMedia(a);
  53. }
  54. //開啟所有舊留言,在讀取完留言後進行新功能
  55. function BHCWait(cps,num){
  56. if(cps.length<num && cps.length<6)
  57. unsafeWindow.setTimeout(function(){BHCWait(cps,num)}, 50);
  58. else
  59. CommendOrder(cps,BHCO,num);
  60. }//開啟超過1000則的舊留言,在讀取完留言後進行新功能
  61. function BHC1000Wait(cps,num,snB){
  62. if(unsafeWindow.document.getElementById("CommendMore_"+snB).style.display != "none")
  63. unsafeWindow.setTimeout(function(){BHC1000Wait(cps,num,snB)}, 50);
  64. else
  65. {
  66. var cptext = "Commendlist_"+snB;
  67. var cptmp = unsafeWindow.document.getElementById(cptext).getElementsByTagName("p");
  68. var newnode;
  69. for(i=num-1000;i>0;i--){
  70. newnode = unsafeWindow.document.createElement("span");
  71. newnode.innerHTML = i + "&nbsp:";
  72. newnode.setAttribute("style","color:#585858;margin:0 5px 0 -2px;");
  73. cptmp[i-1].insertBefore(newnode,cptmp[i-1].firstChild);
  74. if(BHCO)
  75. cptmp[i-1].parentNode.appendChild(cptmp[i-1]);
  76. }
  77. }
  78. }
  79.  
  80. //留言加入樓數、排列順序
  81. function CommendOrder(BHpA,rkey,num){
  82. var l;
  83. if(num && num>1000)
  84. l=num-1000;
  85. else
  86. l=0;
  87. var k = BHpA.length;
  88. if(k>0){
  89. var nodetmp,nodeIdtmp,nodeNametmp,j,m,nodeid,nodeName;
  90. var BHpp = BHpA[0].parentNode.parentNode.getElementsByTagName("p");
  91. if(BHpp[0].className == "FM-cbox10D" && k < 6 && (BHpp[0].firstChild.tagName == "A" || BHpp[0].firstChild.tagName == "a"))
  92. m = parseInt(BHpp[0].firstChild.innerHTML.substring(6));
  93. else
  94. m = l;
  95. for(j = 0;j<parseInt(k/2);j++){
  96. if(BHpA[j].firstChild.tagName == "BUTTON" || BHpA[j].firstChild.tagName == "button"){
  97. var newnode1 = unsafeWindow.document.createElement("span");
  98. var newnode2 = unsafeWindow.document.createElement("span");
  99. newnode1.innerHTML = (j+1+m) + "&nbsp:";
  100. newnode2.innerHTML = (k-j+m) + "&nbsp:";
  101. newnode1.setAttribute("style","color:#585858;margin:0 5px 0 -2px;");
  102. newnode2.setAttribute("style","color:#585858;margin:0 5px 0 -2px;");
  103. BHpA[j].insertBefore(newnode1,BHpA[j].firstChild);
  104. BHpA[k-j-1].insertBefore(newnode2,BHpA[k-j-1].firstChild);
  105. }
  106. if(rkey){
  107. nodetmp = BHpA[j].innerHTML;
  108. nodeIdtmp = BHpA[j].getAttribute("id");
  109. nodeNametmp = BHpA[j].getAttribute("name");
  110. BHpA[j].innerHTML = BHpA[k-j-1].innerHTML;
  111. BHpA[j].setAttribute("id",BHpA[k-j-1].getAttribute("id"));
  112. BHpA[j].setAttribute("name",BHpA[k-j-1].getAttribute("name"));
  113. BHpA[k-j-1].innerHTML = nodetmp;
  114. BHpA[k-j-1].setAttribute("id",nodeIdtmp);
  115. BHpA[k-j-1].setAttribute("name",nodeNametmp);
  116. }
  117. }
  118. if(j == (k-j-1) && (BHpA[j].firstChild.tagName == "BUTTON" || BHpA[j].firstChild.tagName == "button")){
  119. var newnode1 = unsafeWindow.document.createElement("span");
  120. newnode1.innerHTML = (j+1+m) + "&nbsp:";
  121. newnode1.setAttribute("style","color:#585858;margin:0 5px 0 -2px;");
  122. BHpA[j].insertBefore(newnode1,BHpA[j].firstChild);
  123. }
  124. }
  125. }
  126. //調整留言排列順序
  127. function GamerCommendReverse(event){
  128. var BHDivs =(event) ? event.currentTarget.parentNode.parentNode.getElementsByTagName("div") : unsafeWindow.document.getElementsByTagName("div");
  129. var ek = (event) ? true : false;
  130. if(event){
  131. rk = (rk) ? false : true;
  132. BHCO = rk;
  133. GM_setValue("BHCO",rk);
  134. }
  135. for(i = 0;i < BHDivs.length;i++){
  136. if(BHDivs[i].className == "FM-msgbg"){
  137. var BHps = BHDivs[i].getElementsByTagName("p");
  138. CommendOrder(BHps,ek||rk);
  139. }
  140. }
  141. }
  142. GamerCommendReverse();
  143. //更改開啟圖像為關閉圖像
  144. function GamerChangeBtnToClose(BE){
  145. if(BE.innerHTML != "關閉圖像"){
  146. BE.innerHTML = "關閉圖像";
  147. BE.removeEventListener('click',GamerOpenImage,true);
  148. BE.addEventListener('click',GamerCloseImage,true);
  149. }
  150. }
  151. //更改關閉圖像為開啟圖像
  152. function GamerChangeBtnToOpen (BE){
  153. BE.innerHTML = "開啟圖像";
  154. BE.removeEventListener('click',GamerCloseImage,true);
  155. BE.addEventListener('click',GamerOpenImage,true);
  156. }
  157. //點擊開啟全部圖像時,更改單篇開啟圖像為關閉圖像
  158. function GamerChangeAllBtnToClose(){
  159. var BHPA = unsafeWindow.document.getElementsByTagName("p");
  160. var i;
  161. for(i = 0;i < BHPA.length;i++){
  162. if(BHPA[i].className == "FM-cbox4" && BHPA[i].childNodes.length > 2){
  163. GamerChangeBtnToClose(BHPA[i].lastChild);
  164. }
  165. }
  166. }
  167. //開啟單篇文章的圖片、影像
  168. function GamerOpenImage(event){
  169. var EDivA = event.currentTarget.parentNode.parentNode.parentNode.getElementsByTagName("div");
  170. GamerChangeBtnToClose(event.currentTarget);
  171. var i,j,Mid;
  172. for(i = 0;i < EDivA.length;i++){
  173. if(BHPDivA[i].className.substring(0,8) == "FM-cbox7"){
  174. var EAA = EDivA[i].getElementsByTagName("a");
  175. if(EAA){
  176. for (j = 0; j < EAA.length; j++) {
  177. if(EAA[j].name == "attachImgName")
  178. unsafeWindow.attachIMG(EAA[j], 'show');
  179. if(EAA[j].name == "attachMovieName")
  180. unsafeWindow.attachMOVIE(EAA[j]);
  181. }
  182. }
  183. }
  184. }
  185. }
  186. //關閉單篇文章的圖片、影像
  187. function GamerCloseImage(event){
  188. var EDivA = event.currentTarget.parentNode.parentNode.parentNode.getElementsByTagName("div");
  189. GamerChangeBtnToOpen(event.currentTarget);
  190. var i,j;
  191. for(i = 0;i < EDivA.length;i++){
  192. if(BHPDivA[i].className.substring(0,8) == "FM-cbox7"){
  193. var EAA = EDivA[i].getElementsByTagName("a");
  194. if(EAA){
  195. for (j = 0; j < EAA.length; j++) {
  196. if(EAA[j].name == "attachImgName")
  197. EAA[j].innerHTML = '<script language="javascript">showMediaClick("img")</script>請點選觀看圖片';
  198. if(EAA[j].name == "attachMovieName"){
  199. EAA[j].href = EAA[j].firstChild.getAttribute("src");
  200. EAA[j].innerHTML = '<script language="javascript">showMediaClick("movie")</script>請點選觀看影片';
  201. }
  202. }
  203. }
  204. }
  205. }
  206. }
  207. //單篇文章的影像、圖片若已全部開啟,將開啟圖像改為關閉圖像
  208. function GamerImgOpenCheck(event){
  209. var i,ImgOpenF = true;
  210. var CTAA = event.currentTarget.parentNode.parentNode.getElementsByTagName("a");
  211. for(i = 0; i < CTAA.length; i++){
  212. if((CTAA[i].name == "attachImgName" || CTAA[i].name == "attachMovieName") && CTAA[i].firstChild.tagName == "SCRIPT"){
  213. ImgOpenF = false;
  214. break;
  215. }
  216. }
  217. if(ImgOpenF){
  218. var CTPA,CTPNA = event.currentTarget.parentNode.parentNode.parentNode.parentNode;
  219. if(CTPNA.className != "FM-cbox1")
  220. CTPNA = event.currentTarget.parentNode.parentNode.parentNode;
  221. CTPA = CTPNA.getElementsByTagName("p");
  222. for (i = 0; i < CTPA.length; i++){
  223. if(CTPA[i].className == "FM-cbox4" && CTPA[i].childNodes.length > 2)
  224. GamerChangeBtnToClose(CTPA[i].lastChild);
  225. }
  226. }
  227. }
  228. //加入改變留言順序的連結點
  229. var BHDivA = unsafeWindow.document.getElementsByTagName("div");
  230. for(i = 0;i < BHDivA.length;i++){
  231. if(BHDivA[i].className == "FM-cbox10"){
  232. var pchecked1 = false;
  233. var pchecked2 = false;
  234. for(j = 0;j < BHDivA[i].childNodes.length;j++){
  235. if(BHDivA[i].childNodes[j].className == "FM-cbox10D")
  236. pchecked1 = true;
  237. if(BHDivA[i].childNodes[j].className == "FM-msgbg" && BHDivA[i].childNodes[j].childNodes.length > 2)
  238. pchecked2 = true;
  239. }
  240. if(!pchecked1 && pchecked2){
  241. BHDivA[i].innerHTML = '<p class="FM-cbox10D"><span style="text-align:left;float:left;"><a href ="javascript:;">留言順序</a></span></p>' + BHDivA[i].innerHTML;
  242. BHDivA[i].firstChild.firstChild.addEventListener('click',GamerCommendReverse,true);
  243. }
  244. else if(pchecked1 && pchecked2){
  245. PA = BHDivA[i].getElementsByTagName("p");
  246. PA[0].innerHTML = '<span style="text-align:left;float:left;"><a href ="javascript:;">留言順序</a></span>' + PA[0].innerHTML;
  247. PA[0].firstChild.addEventListener('click',GamerCommendReverse,true);
  248. }
  249. }
  250. }
  251. //修改開啟圖片按鈕的連結點
  252. var BHPA = unsafeWindow.document.getElementsByTagName("p");
  253. for(i = 0;i < BHPA.length;i++){
  254. if(BHPA[i].className == "FM-cbox4"){
  255. BHPA[i].removeChild(BHPA[i].childNodes[2]);
  256. var BHPDivA = BHPA[i].parentNode.parentNode.getElementsByTagName("div");
  257. var k,j,Iflag = false,Oflag = true;
  258. for(k = 0;k < BHPDivA.length;k++){
  259. if(BHPDivA[k].className.substring(0,8) == "FM-cbox7"){
  260. var EAA = BHPDivA[k].getElementsByTagName("a");
  261. if(EAA){
  262. for(j = 0; j < EAA.length; j++){
  263. if(EAA[j].name == "attachImgName" || EAA[j].name == "attachMovieName"){
  264. Iflag = true;
  265. EAA[j].addEventListener('click',GamerImgOpenCheck,true);
  266. if(EAA[j].firstChild.tagName == "SCRIPT")
  267. Oflag = false;
  268. }
  269. }
  270. }
  271. }
  272. }
  273. if(Iflag){
  274. if(Oflag){
  275. BHPA[i].innerHTML = BHPA[i].innerHTML + '<a href ="javascript:;">關閉圖像</a>';
  276. BHPA[i].childNodes[BHPA[i].childNodes.length - 1].addEventListener('click',GamerCloseImage,true);
  277. }
  278. else{
  279. BHPA[i].innerHTML = BHPA[i].innerHTML + '<a href ="javascript:;">開啟圖像</a>';
  280. BHPA[i].childNodes[BHPA[i].childNodes.length - 1].addEventListener('click',GamerOpenImage,true);
  281. }
  282. }
  283. }
  284. }
  285. //將原有的開啟所有圖片按鈕移到右邊的浮動功能列
  286. var BHSpanBtn = unsafeWindow.document.getElementById("groupbtn");
  287. BHSpanBtn.innerHTML = BHSpanBtn.innerHTML + '<a class="BH-slave_btnB" href="javascript:;">開啟全部圖像</a>';
  288. BHSpanBtn.lastChild.addEventListener('click',forumShowAllMedia,true);
  289.