GLB Game Log Totals

Show stat totals on the GLB Player Log page by team, by score, and by game type.

  1. // ==UserScript==
  2. // @name GLB Game Log Totals
  3. // @namespace pbr
  4. // @include http://goallineblitz.com/game/player_game_log.pl?*player_id=*
  5. // @include http://glb.warriorgeneral.com/game/player_game_log.pl?*player_id=*
  6. // @copyright 2009, pabst
  7. // @license (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/
  8. // @version 13.12.29
  9. // @description Show stat totals on the GLB Player Log page by team, by score, and by game type.
  10. // ==/UserScript==
  11.  
  12. var blowout = 55;
  13. var titles = ["Scrim","Seas","Post","Diff <"+blowout,"Diff >"+blowout];
  14.  
  15. window.setTimeout(
  16. function() {
  17. game_log_main();
  18. },
  19. 500
  20. );
  21.  
  22. function game_log_main() {
  23. var table = document.getElementById("career_stats");
  24. table.style.display = "none";
  25.  
  26. tableSetup();
  27. getStats();
  28.  
  29. var table = document.getElementById("career_stats");
  30. table.style.display = "";
  31. }
  32.  
  33. function Game() {
  34. this.week = null;
  35. this.team = null;
  36. this.teamLink = null;
  37. this.res = null;
  38. this.diff = null;
  39. this.stats = new Array();
  40.  
  41. this.toString = function() {
  42. return (this.week+" : "+this.team+"("+this.teamLink.href.split("=")[1]+" vs. "+this.oppLink.href.split("=")[1]+") -"+this.res+"- "+this.diff+" -- "+this.stats.toString());
  43. }
  44. }
  45.  
  46. function getStats() {
  47. var games = new Array();
  48. var table = document.getElementById("career_stats");
  49. for (var i=2; i<table.rows.length; i++) {
  50. if ((table.rows[i].id.indexOf("total_") == -1) &&
  51. (table.rows[i].className.indexOf("nonalternating") == -1)) {
  52. games.push(getGame(table.rows[i]));
  53. }
  54. }
  55.  
  56. var scrim = new Array();
  57. var seas = new Array();
  58. var post = new Array();
  59. var bl = new Array();
  60. var nbl = new Array();
  61.  
  62. for (var i=0; i<games.length; i++) {
  63. var g = games[i];
  64. //console.log(g.toString());
  65. if (g.week == 0) {
  66. scrim.push(g);
  67. }
  68. else if (g.week < 17) {
  69. seas.push(g);
  70. if (g.diff < blowout) {
  71. nbl.push(g);
  72. }
  73. else {
  74. bl.push(g);
  75. }
  76. }
  77. else {
  78. var found = false;
  79. for (var j=0; j<seas.length; j++) {
  80. if (seas[j].oppLink.href == g.oppLink.href) {
  81. post.push(g);
  82. found = true;
  83. break;
  84. }
  85. }
  86. if (found == false) {
  87. if (g.week == 20) {
  88. var champion = true;
  89. for (var gidx=games.length-4; gidx<games.length-1; gidx++) {
  90. //console.log(games[gidx].toString()+" <> "+games[gidx].res);
  91. if (games[gidx].res == "L") {
  92. champion = false;
  93. break;
  94. }
  95. }
  96. if (champion == true) {
  97. post.push(g);
  98. }
  99. else {
  100. scrim.push(g);
  101. }
  102. }
  103. else {
  104. scrim.push(g);
  105. }
  106. }
  107. }
  108. }
  109.  
  110. // console.log(scrim.length+" - "+seas.length+" - "+post.length+" - "+nbl.length+" - "+bl.length);
  111. var types = [scrim,seas,post,nbl,bl];
  112. for (var i=0; i<types.length; i++) {
  113. if (types[i].length == 0) continue;
  114. var total = getTotal(types[i]);
  115. //console.log(titles[i]+" : "+total);
  116. var el = document.getElementById("total_"+titles[i]);
  117. insertTotals(el, types[i], total);
  118.  
  119. var teams = getTeams(types[i]);
  120. if (teams.length > 1) {
  121. el.cells[1].setAttribute("align","left");
  122. el.cells[1].innerHTML = "---";
  123. for (var t=0; t<teams.length; t++) {
  124. var tr = document.createElement("tr");
  125. tr.setAttribute("class",el.getAttribute("class"));
  126. for (var j=0; j<el.cells.length; j++) {
  127. tr.insertCell(0);
  128. tr.cells[j].setAttribute("align",el.cells[j].getAttribute("align"));
  129. }
  130. var a = document.createElement("a");
  131. a.href = teams[t][0].teamLink;
  132. a.textContent = teams[t][0].team;
  133. tr.cells[1].appendChild(a);
  134. insertTotals(tr, teams[t], getTotal(teams[t]));
  135. table.insertBefore(tr, el.nextSibling);
  136. }
  137. }
  138. }
  139. }
  140.  
  141. var start = 4;
  142.  
  143. function insertTotals(el, g, t) {
  144. el.cells[2].setAttribute("align","left");
  145. el.cells[2].innerHTML = g.length;
  146.  
  147. var win = 0;
  148. for (var i=0; i<g.length; i++) {
  149. if (g[i].res == "W") win++;
  150. }
  151. el.cells[3].setAttribute("align","center");
  152. el.cells[3].innerHTML = win+"-"+(g.length-win);
  153.  
  154. var start=5;
  155. for (var i=start; i<el.cells.length; i++) {
  156. el.cells[i].setAttribute("align","right");
  157. if (t[i-start] != null) {
  158. el.cells[i].innerHTML = t[i-start];
  159. }
  160. else {
  161. el.cells[i].innerHTML = "&nbsp;";
  162. }
  163. }
  164. }
  165.  
  166. function getTeams(g) {
  167. var idx = -1;
  168. var ids = new Array();
  169. var teams = new Array();
  170. for (var i=0; i<g.length; i++) {
  171. idx = ids.indexOf(g[i].team);
  172. // console.log(ids+" -- "+idx);
  173. if (idx == -1) {
  174. idx = ids.length;
  175. ids.push(g[i].team);
  176. teams[idx] = new Array();
  177. }
  178. teams[idx].push(g[i]);
  179. }
  180. /*
  181. console.log(teams.length);
  182. for (var i=0; i<teams.length; i++) {
  183. console.log(teams[i]+" --> "+teams[i].length);
  184. }
  185. */
  186. return teams;
  187. }
  188.  
  189. function getTotal(g) {
  190. var pos = document.getElementsByClassName("position")[0].innerHTML;
  191.  
  192. var result = new Array();
  193. switch (pos) {
  194. case "C" : ;
  195. case "G" : ;
  196. case "OT" : result = olTotal(g);
  197. break;
  198. case "QB" : result = qbTotal(g);
  199. break;
  200. case "HB" : ;
  201. case "FB" : result = rbTotal(g);
  202. break;
  203. case "TE" : result = teTotal(g);
  204. break;
  205. case "WR" : result = wrTotal(g);
  206. break;
  207. case "DT" : ;
  208. case "DE" : ;
  209. case "LB" : ;
  210. case "FS" : ;
  211. case "SS" : result = defTotal(g);
  212. break;
  213. case "CB" : result = cbTotal(g);
  214. break;
  215. case "P" : result = pTotal(g);
  216. break;
  217. case "K" : result = kTotal(g);
  218. break;
  219. }
  220. return result;
  221. }
  222.  
  223. function defTotal(g) {
  224. var result = new Array();
  225. if (g.length == 0) return result;
  226. for (var i=0; i<g[0].stats.length; i++) {
  227. result[i] = 0;
  228. }
  229.  
  230. for (var i=0; i<g.length; i++) {
  231. for (var j=0; j<result.length; j++) {
  232. if (g[i].stats[j] != null) {
  233. result[j] += parseInt(g[i].stats[j]);
  234. }
  235. }
  236. }
  237. return result;
  238. }
  239.  
  240. function olTotal(g) {
  241. var result = defTotal(g);
  242. return result;
  243. }
  244.  
  245. function cbTotal(g) {
  246. var result = defTotal(g);
  247. result[7] = avg(result, 5, 6);
  248. result[11] = avg(result, 9, 10);
  249. result[6] = result[6].toFixed(0);
  250. result[10] = result[10].toFixed(0);
  251. return result;
  252. }
  253. function qbTotal(g) {
  254. var result = defTotal(g);
  255. result[3] = (100*result[1] / result[2]).toFixed(1);
  256. result[5] = avg(result, 2, 4);
  257. result[11] = avg(result, 9, 10);
  258. result[0] = qbrating(result).toFixed(1);
  259. result[4] = result[4].toFixed(0);
  260. result[10] = result[10].toFixed(0);
  261. return result;
  262. }
  263. function rbTotal(g) {
  264. var result = defTotal(g);
  265. result[2] = avg(result, 0, 1);
  266. result[6] = avg(result, 4, 5);
  267. result[7] = yac(g, 4, 7);
  268. result[1] = result[1].toFixed(0);
  269. result[5] = result[5].toFixed(0);
  270. return result;
  271. }
  272. function wrTotal(g) {
  273. var result = defTotal(g);
  274. result[2] = avg(result, 0, 1);
  275. result[7] = avg(result, 5, 6);
  276. result[11] = avg(result, 9, 10);
  277. result[3] = yac(g, 0, 3);
  278. result[1] = result[1].toFixed(0);
  279. result[6] = result[6].toFixed(0);
  280. result[10] = result[10].toFixed(0);
  281. return result;
  282. }
  283. function teTotal(g) {
  284. var result = defTotal(g);
  285. result[2] = avg(result, 0, 1);
  286. result[3] = yac(g, 0, 3);
  287. result[1] = result[1].toFixed(0);
  288. result[6] = result[6].toFixed(0);
  289. return result;
  290. }
  291. function pTotal(g) {
  292. var result = defTotal(g);
  293. result[2] = avg(result, 0, 1);
  294. result[1] = result[1].toFixed(0);
  295. return result;
  296. }
  297. function kTotal(g) {
  298. var result = defTotal(g);
  299. for (var i=2; i<7; i++) {
  300. result[i] = fgTotal(g,i);
  301. }
  302. return result;
  303. }
  304.  
  305. function fgTotal(g, idx) {
  306. var fg = 0;
  307. var att = 0;
  308. for (var i=0; i<g.length; i++) {
  309. fg += parseInt(g[i].stats[idx]);
  310. att += parseInt(g[i].stats[idx].split("/")[1]);
  311. }
  312. return fg+"/"+att;
  313. }
  314.  
  315. function avg(arr, a, y) {
  316. var res = (arr[y] / arr[a]).toFixed(1);
  317. if (isNaN(res) == true) {
  318. res = "0.0";
  319. }
  320. return res;
  321. }
  322. function yac(g, r, y) {
  323. var rec = 0;
  324. var yac = 0;
  325. for (var i=0; i<g.length; i++) {
  326. rec += g[i].stats[r];
  327. yac += g[i].stats[r]*g[i].stats[y];
  328. }
  329. if (rec == 0) return "0.0";
  330. return (yac/rec).toFixed(1);
  331. }
  332. function qbrating(arr) {
  333. var x = arr[1] / arr[2];
  334. x -= 0.3;
  335. x /= 0.2;
  336. x = Math.max(x,0);
  337. x = Math.min(x,2.375);
  338.  
  339. var y = arr[4] / arr[2];
  340. y -= 3;
  341. y /= 4;
  342. y = Math.max(y,0);
  343. y = Math.min(y,2.375);
  344.  
  345. var z = arr[6] / arr[2];
  346. z /= 0.05;
  347. z = Math.max(z,0);
  348. z = Math.min(z,2.375);
  349.  
  350. var w = arr[7] / arr[2];
  351. w = 0.095 - w;
  352. w /= 0.04;
  353. w = Math.max(w,0);
  354. w = Math.min(w,2.375);
  355. //console.log(x+" - "+y+" - "+z+" - "+w);
  356. rating = (x+y+z+w)*100/6;
  357. rating = Math.round(rating*10);
  358. rating /= 10;
  359. return rating;
  360. }
  361.  
  362. function getGame(row) {
  363. var g = new Game();
  364. g.week = row.cells[0].textContent;
  365. g.team = row.cells[1].firstChild.innerHTML;
  366. g.teamLink = row.cells[1].firstChild;
  367. g.opp = row.cells[2].firstChild.innerHTML;
  368. g.oppLink = row.cells[2].firstChild;
  369. g.res = row.cells[3].firstChild.innerHTML.slice(0,1);
  370.  
  371. var diff = row.cells[3].firstChild.innerHTML;
  372. diff = diff.slice(1).split("-");
  373. g.diff = Math.max(parseInt(diff[0]),parseInt(diff[1])) - Math.min(parseInt(diff[0]),parseInt(diff[1]));
  374.  
  375. g.stats = new Array();
  376. // if (isNaN(parseFloat(row.cells[4].textContent)) == true) start++;
  377. var start=5;
  378. for (var i=start; i<row.cells.length; i++) {
  379. if (row.cells[i].textContent.indexOf("/") == -1) {
  380. g.stats.push(parseFloat(row.cells[i].textContent));
  381. }
  382. else {
  383. g.stats.push(row.cells[i].textContent);
  384. }
  385. }
  386. return g;
  387. }
  388.  
  389. function tableSetup() {
  390. var table = document.getElementById("career_stats");
  391. if (table == null) return;
  392. var count = table.rows[1].cells.length;
  393.  
  394. var tr = document.createElement("tr");
  395. tr.setAttribute("class","nonalternating_color2");
  396. for (var i=0; i<count; i++) {
  397. var td = tr.insertCell(tr.cells.length);
  398. var align = "right";
  399. if (i < 3) align = "left";
  400. else if (i == 3) align = "center";
  401. td.setAttribute("align",align);
  402. if (i == 1) td.innerHTML = "Team";
  403. else if (i == 2) td.innerHTML = "G";
  404. else if (i == 3) td.innerHTML = "W-L";
  405. else if (i < 4) td.innerHTML = '&nbsp;';
  406. else td.innerHTML = table.rows[1].cells[i].innerHTML;
  407. }
  408. table.appendChild(tr);
  409.  
  410. for (var j=0; j<5; j++) {
  411. var tr = document.createElement("tr");
  412. tr.setAttribute("class","alternating_color"+((j%2)+1));
  413. tr.setAttribute("id","total_"+titles[j]);
  414. for (var i=0; i<count; i++) {
  415. var td = tr.insertCell(0);
  416. td.innerHTML = '&nbsp;';
  417. }
  418. tr.cells[0].setAttribute("style","font-weight:bold");
  419. tr.cells[0].innerHTML = titles[j];
  420. table.appendChild(tr);
  421.  
  422. if (j == 2) {
  423. var tr = document.createElement("tr");
  424. tr.setAttribute("class","nonalternating_color2");
  425. for (var i=0; i<count; i++) {
  426. var td = tr.insertCell(tr.cells.length);
  427. td.innerHTML = '&nbsp;';
  428. }
  429. table.appendChild(tr);
  430. }
  431. }
  432.  
  433. var tr = document.createElement("tr");
  434. tr.setAttribute("class","nonalternating_color2");
  435. for (var i=0; i<count; i++) {
  436. var td = tr.insertCell(tr.cells.length);
  437. td.innerHTML = '&nbsp;';
  438. }
  439. table.appendChild(tr);
  440. }
  441.