Proxer Statistics

Zählt die bereits geschauten/gelesenen Animes/Mangas und erlaubt es die Tabellen per Klick zusammenzuklappen bzw. sich mehr Details anzeigen zu lassen.

当前为 2016-11-27 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Proxer Statistics
  3. // @namespace *
  4. // @version 1.0
  5. // @description Zählt die bereits geschauten/gelesenen Animes/Mangas und erlaubt es die Tabellen per Klick zusammenzuklappen bzw. sich mehr Details anzeigen zu lassen.
  6. // @author Deimos
  7. // @include http://proxer.me/*
  8. // @include https://proxer.me/*
  9. // @include http://www.proxer.me/*
  10. // @include https://www.proxer.me/*
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14. var page = 0;
  15. var cookie = "vvvvvvvv"; //v:= visible h:= hidden
  16.  
  17. createObserver();
  18. tableListener();
  19.  
  20. //Observer um auf AJAX zu reagieren
  21. function createObserver()
  22. {
  23. var target = $("#main").get(0);
  24.  
  25. var observer = new MutationObserver(function(mutations) {
  26. mutations.forEach(function(mutation) {
  27. console.log(mutation.type);
  28. tableListener();
  29. });
  30. });
  31.  
  32. var config = { attributes: true, childList: true, characterData: true };
  33. observer.observe(target, config);
  34. }
  35.  
  36. //Ermitteeln der Tabellenlänge und setzen der EventListener
  37. function tableListener()
  38. {
  39. var tables = $("table");
  40. page = getPage(tables[0].rows[0].getElementsByTagName("th")[0].innerHTML);
  41.  
  42. if(page == 1 || page == 2)
  43. {
  44. cookie=checkCookie();
  45. for(i = 0; i<tables.length;i++)
  46. {
  47. var tr = tables[i].rows;
  48. var l = tr.length;
  49. var message= ": " + (l-2);
  50.  
  51. tr[0].getElementsByTagName("th")[0].innerHTML+= message;
  52. tr[0].addEventListener("click",action);
  53. tr[0].id ="tr"+(i+(page*4)-4);
  54.  
  55. if(cookie[i+(page*4)-4]=="h")
  56. hide(tr);
  57. }
  58. }
  59. }
  60.  
  61. //Auswahl ob "hide" oder "details"
  62. function action(e)
  63. {
  64. var tr = this.parentElement.parentElement.rows;
  65. var xPosition = e.clientX;
  66. var rect = tr[0].getBoundingClientRect();
  67. var width = tr[0].offsetWidth;
  68.  
  69. if(xPosition<width/2)
  70. details(tr);
  71. else
  72. {
  73. hide(tr);
  74. setCookie("proxStat",cookie,365);
  75. }
  76. }
  77.  
  78. //Anzeigen der genaueren Details der ausgewählten Tabelle
  79. function details(tr)
  80. {
  81. var text = tr[0].getElementsByTagName("th")[0].innerHTML;
  82. if(text.includes("<br>"))
  83. {
  84. text = text.slice(0,text.indexOf("<br>"));
  85. tr[0].getElementsByTagName("th")[0].innerHTML = text;
  86. return true;
  87. }
  88.  
  89. var l = tr.length;
  90. var movies = 0;
  91. var ovas = 0;
  92. var animes = 0;
  93. var mangas = 0;
  94. var doujinshis = 0;
  95. var one_shots = 0;
  96. var h_mangas = 0;
  97.  
  98. for(i = 2; i<l; i++)
  99. {
  100. var type = tr[i].getElementsByTagName("td")[2].innerHTML;
  101. switch(type)
  102. {
  103. case "Movie":
  104. movies++;
  105. break;
  106. case "OVA":
  107. ovas++;
  108. break;
  109. case "Animeserie":
  110. animes++;
  111. break;
  112. case "Mangaserie":
  113. mangas++;
  114. break;
  115. case "H-Manga":
  116. h_mangas++;
  117. break;
  118. case "Doujinshi":
  119. doujinshis++;
  120. break;
  121. case "One-Shot":
  122. one_shots++;
  123. break;
  124. }
  125. }
  126.  
  127. var message= "";
  128. if(animes!==0)
  129. message+= "<br> Animeserien: "+animes;
  130. if(movies!==0)
  131. message+= "<br> Movies: "+movies;
  132. if(ovas!==0)
  133. message+= "<br> OVAs: "+ovas;
  134. if(mangas!==0)
  135. message+= "<br> Mangaserien: "+mangas;
  136. if(h_mangas!==0)
  137. message+= "<br> H-Mangas: "+h_mangas;
  138. if(doujinshis!==0)
  139. message+= "<br> Doujinshis:: "+doujinshis;
  140. if(one_shots!==0)
  141. message+= "<br> One-Shots: "+one_shots;
  142.  
  143. tr[0].getElementsByTagName("th")[0].innerHTML+= message;
  144. }
  145.  
  146. //Einklappen der ausgewählten Tabelle
  147. function hide(tr)
  148. {
  149. var id = parseInt(tr[0].id[2]);
  150. var visibility;
  151. var char;
  152. if(tr[1].style.display == "none")
  153. {
  154. visibility = "table-row";
  155. char = "v";
  156. }
  157. else
  158. {
  159. visibility = "none";
  160. char = "h";
  161. }
  162.  
  163. cookie = cookie.substring(0,id) + char + cookie.substring(id+1, cookie.length);
  164. for(e = 1; e < tr.length; e++)
  165. {
  166. tr[e].style.display =visibility;
  167. }
  168. }
  169.  
  170. //Befindet sich der User auf seinem Manga oder Anime Verzeichnis?
  171. function getPage(innerHTML)
  172. {
  173. switch(innerHTML)
  174. {
  175. case "Gelesen": //Mangas
  176. return 1;
  177. case "Geschaut": //Animes
  178. return 2;
  179. default: //Anderes
  180. return 0;
  181. }
  182. }
  183.  
  184.  
  185. //Cookie, welcher speichert ob eine Tabelle versteckt ist, oder nicht
  186. function checkCookie()
  187. {
  188. var cookie = getCookie("proxStat");
  189. if (cookie == "")
  190. {
  191. cookie = "vvvvvvvv";
  192. setCookie("proxStat", cookie, 365);
  193. }
  194. return cookie;
  195. }
  196. function getCookie(cname)
  197. {
  198. var name = cname + "=";
  199. var ca = document.cookie.split(";");
  200. for(var i = 0; i < ca.length; i++) {
  201. var c = ca[i];
  202. while (c.charAt(0) == ' ') {
  203. c = c.substring(1);
  204. }
  205. if (c.indexOf(name) == 0) {
  206. return c.substring(name.length, c.length);
  207. }
  208. }
  209. return "";
  210. }
  211. function setCookie(cname, cvalue, exdays)
  212. {
  213. var d = new Date();
  214. d.setTime(d.getTime() + (exdays*24*60*60*1000));
  215. var expires = "expires="+d.toUTCString();
  216. document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
  217. }