Greasy Fork is available in English.

Cumulative Team Results

Get a teams cumulative GLB record.

  1. // ==UserScript==
  2. // @name Cumulative Team Results
  3. // @namespace pbr/trb
  4. // @include http://goallineblitz.com/game/team.pl?*team_id=*
  5. // @include http://glb.warriorgeneral.com/game/team.pl?*team_id=*
  6. // @copyright 2011, pabst
  7. // @license (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/
  8. // @version 13.12.29
  9. // @description Get a teams cumulative GLB record.
  10. // ==/UserScript==
  11.  
  12. var blowout = 55;
  13. var maxLeaders = 10;
  14. var gamelinks = [ ];
  15.  
  16. window.setTimeout(function() {
  17. boxSetup();
  18. }, 3000);
  19.  
  20. var teamPageName = null;
  21. var teamPageId = parseInt(document.location.toString().split("team_id=")[1]);
  22.  
  23. var earliestSeason = null;
  24. var currentSeason = null;
  25. var useAllGames = false;
  26.  
  27. var gameTotals = new Array();
  28. var gameHistory = new Array();
  29.  
  30. function getSeasons() {
  31. var inp = document.getElementById("seasonsTRB");
  32. var seasons = inp.value.split(",");
  33. var output = [];
  34. for (var i=0; i<seasons.length; i++) {
  35. if (seasons[i].split("-").length > 1) {
  36. var first = parseInt(seasons[i].split("-")[0]);
  37. var second = parseInt(seasons[i].split("-")[1])
  38. for (var j=Math.min(first,second); j<=Math.max(first,second); j++) {
  39. output.push(j);
  40. }
  41. }
  42. else {
  43. output.push(parseInt(seasons[i]));
  44. }
  45. }
  46. return output.sort(function(a,b) { return a-b; });
  47. }
  48.  
  49. function mainHistorical() {
  50. var btn = document.getElementById("rbtbutton");
  51. btn.disabled = true;
  52.  
  53. useAllGames = document.getElementById("allGamesTeam").checked;
  54.  
  55. var links = new Array();
  56. var href = document.location.toString();
  57. if (href.match("season") != null) {
  58. href = href.split("season=")[0]+href.split("&")[1];
  59. }
  60. var seasons = getSeasons();
  61. for (var i=0; i<seasons.length; i++) {
  62. links.push(href+"&season="+seasons[i]);
  63. console.log(href+"&season="+seasons[i]);
  64. }
  65. getInetPage(links[0], getGameLinks, links.slice(1));
  66. }
  67.  
  68. function getGameLinks(address, page, data) {
  69. document.getElementById("rbtbutton").value = data.length+" seasons left";
  70.  
  71. var div = document.createElement("div");
  72. div.innerHTML = page.responseText.replace(/<img/g,"<div").replace(/\/img/g,"/div>");
  73.  
  74. var season = parseInt(address.split("season=")[1]);
  75. gameTotals[season] = new Array();
  76.  
  77. var count = 0;
  78. var links = div.getElementsByTagName("a");
  79. for (var i=0; i<links.length; i++) {
  80. var a = links[i];
  81. if (a.href.toString().indexOf("game.pl?game_id=") != -1) {
  82. gamelinks.push(a.href.toString());
  83. count++;
  84. var obj = new Object();
  85. obj.opp = links[i-1].innerHTML;
  86. obj.oppid = parseInt(links[i-1].href.split("=")[1]);
  87. obj.result = links[i].innerHTML;
  88. obj.type = "n";
  89.  
  90. var b = a.parentNode.parentNode.parentNode.parentNode.previousSibling.previousSibling.innerHTML;
  91. if (b.indexOf("Playoff") != -1) obj.type = "p";
  92. else if (b.indexOf("Scrimmage") != -1) obj.type = "s";
  93.  
  94. var b = a.parentNode.parentNode.innerHTML;
  95. if (b.indexOf(" (R)</b>") != -1) obj.type = "r";
  96. else if (b.indexOf(" (T)</b>") != -1) obj.type = "t";
  97.  
  98. gameTotals[season].push(obj);
  99. if (gameHistory.indexOf(parseInt(obj.oppid)) == -1) {
  100. gameHistory.push(parseInt(obj.oppid));
  101. }
  102. }
  103. }
  104. if (data.length > 0) {
  105. console.log(data.length+": "+data[0]);
  106. getInetPage(data[0], getGameLinks, data.slice(1));
  107. }
  108. else {
  109. console.log(gamelinks.length+" games requested");
  110. document.getElementById("rbtbutton").value = "Calculating Seasons. This might take a while.";
  111. console.log("calculating seasons");
  112. seasonTotals();
  113. document.getElementById("rbtbutton").value = "Calculating Teams. This might take a while.";
  114. console.log("calculating teams");
  115. historicalTotals();
  116. document.getElementById("rbtbutton").value = "Done.";
  117. }
  118. }
  119.  
  120. function createRecordTBody(title) {
  121. var tbody = document.createElement("tbody");
  122.  
  123. var hrow = document.createElement("tr");
  124. hrow.setAttribute("class", "nonalternating_color");
  125. var head = ["","Overall","Playoff","<"+1*blowout,"<"+2*blowout,"<"+3*blowout,">"+3*blowout,"Ranked","Tourn.","Scrim."];
  126.  
  127. for (var i=0; i<head.length; i++) {
  128. var h = head[i];
  129. var th = document.createElement("th");
  130. if (h != "") {
  131. th.setAttribute("style","text-align: center");
  132. th.colSpan = 3;
  133. }
  134. else {
  135. th.setAttribute("style","text-align: center");
  136. th.colSpan = 1;
  137. }
  138. th.innerHTML = h;
  139. hrow.appendChild(th);
  140. }
  141. tbody.appendChild(hrow);
  142.  
  143. var hrow = document.createElement("tr");
  144. hrow.setAttribute("class", "nonalternating_color2");
  145. var h2 = [title];
  146. for (var i=1; i<head.length; i++) {
  147. h2.push("W");
  148. h2.push("L");
  149. h2.push("T");
  150. }
  151.  
  152. for (var i=0; i<h2.length; i++) {
  153. var h = h2[i];
  154. var th = document.createElement("th");
  155. if (h == title) {
  156. th.setAttribute("style","color: black; text-align: left");
  157. th.colSpan = 1;
  158. }
  159. else {
  160. th.setAttribute("style","color: black; text-align: right");
  161. }
  162. th.innerHTML = h;
  163. hrow.appendChild(th);
  164. }
  165. tbody.appendChild(hrow);
  166.  
  167. return tbody;
  168. }
  169.  
  170. function historicalTotals() {
  171. var table = document.createElement("table");
  172. table.setAttribute("class","bscTable");
  173. table.cellSpacing = "0";
  174. table.cellPadding = "0";
  175. table.style.marginBottom = "0px";
  176. table.style.width = "960px";
  177.  
  178. var tbody = createRecordTBody("Opponent");
  179.  
  180. for (var z=0; z<gameHistory.length; z++) {
  181. var id = gameHistory[z];
  182. var opp = null;
  183.  
  184. var record = [0,0,0];
  185. var playoff = [0,0,0];
  186. var scrimmage = [0,0,0];
  187. var ranked = [0,0,0];
  188. var tourn = [0,0,0];
  189. var spreads = new Array();
  190. for (var s=0; s<gameTotals.length; s++) {
  191. if (gameTotals[s] != null) {
  192. for (var y=0; y<gameTotals[s].length; y++) {
  193. var g = gameTotals[s][y];
  194. if (g.oppid != id) continue;
  195. opp = g.opp;
  196.  
  197. var res;
  198. if (g.result.indexOf("W") != -1) {
  199. res = 0;
  200. }
  201. else if (g.result.indexOf("L") != -1) {
  202. res = 1;
  203. }
  204. else if (g.result.indexOf("T") != -1) {
  205. res = 2;
  206. }
  207.  
  208. if ((useAllGames == true) || ((g.type == "n") || (g.type == "p"))) {
  209. record[res]++;
  210.  
  211. var s1 = parseInt(g.result.split(" ")[1].split("-")[0]);
  212. var s2 = parseInt(g.result.split(" ")[1].split("-")[1]);
  213. var spread = Math.max(s1,s2) - Math.min(s1,s2);
  214. if (spreads[Math.min(Math.floor(spread/blowout),3)] == null) {
  215. spreads[Math.min(Math.floor(spread/blowout),3)] = [0,0,0];
  216. }
  217. spreads[Math.min(Math.floor(spread/blowout),3)][res]++;
  218. }
  219.  
  220. if (g.type == "p") playoff[res]++;
  221. if (g.type == "s") scrimmage[res]++;
  222. if (g.type == "r") ranked[res]++;
  223. if (g.type == "t") tourn[res]++;
  224. }
  225. }
  226. }
  227.  
  228. var href = "/game/team.pl?team_id="+id;
  229. var str = "<tr class='alternating_color"+((id%2)+1)+"'><td><a href='"+href+"'>"+opp+"</a></td>";
  230.  
  231. for (var i=0; i<3; i++) {
  232. str += "<td style='text-align:right'>"+record[i]+"</td>";
  233. }
  234. for (var i=0; i<3; i++) {
  235. str += "<td style='text-align:right'>"+playoff[i]+"</td>";
  236. }
  237.  
  238. for (var i=0; i<4; i++) {
  239. for (var j=0; j<3; j++) {
  240. if ((spreads[i] == null) || (spreads[i][j] == null)) {
  241. str += "<td style='text-align:right'>0</td>";
  242. }
  243. else {
  244. str += "<td style='text-align:right'>"+spreads[i][j]+"</td>";
  245. }
  246. }
  247. }
  248.  
  249. for (var i=0; i<3; i++) {
  250. str += "<td style='text-align:right'>"+ranked[i]+"</td>";
  251. }
  252. for (var i=0; i<3; i++) {
  253. str += "<td style='text-align:right'>"+tourn[i]+"</td>";
  254. }
  255. for (var i=0; i<3; i++) {
  256. str += "<td style='text-align:right'>"+scrimmage[i]+"</td>";
  257. }
  258.  
  259. str += "</tr>";
  260. tbody.innerHTML += str;
  261. }
  262.  
  263. table.appendChild(tbody);
  264.  
  265. for (var i=2; i<table.rows.length-1; i++) {
  266. for (var j=i+1; j<table.rows.length; j++) {
  267. var r1w = parseInt(table.rows[i].cells[1].innerHTML);
  268. var r1l = parseInt(table.rows[i].cells[2].innerHTML);
  269. var r1t = parseInt(table.rows[i].cells[3].innerHTML);
  270. var r2w = parseInt(table.rows[j].cells[1].innerHTML);
  271. var r2l = parseInt(table.rows[j].cells[2].innerHTML);
  272. var r2t = parseInt(table.rows[j].cells[3].innerHTML);
  273. if ((r2w+r2l+r2t) > (r1w+r1l+r1t)) {
  274. table.insertRow(i);
  275. table.rows[i].innerHTML = table.rows[j+1].innerHTML;
  276. var r = table.deleteRow(j+1);
  277. }
  278. else if (((r2w+r2l+r2t) == (r1w+r1l+r1t)) && (r2l < r1l)) {
  279. table.insertRow(i);
  280. table.rows[i].innerHTML = table.rows[j+1].innerHTML;
  281. var r = table.deleteRow(j+1);
  282. }
  283. table.rows[i].setAttribute("class","alternating_color"+((i%2)+1));
  284. }
  285. }
  286. var div = document.createElement("div");
  287. div.appendChild(table);
  288. document.getElementById("footer").parentNode.appendChild(div);
  289. }
  290.  
  291. function seasonTotals() {
  292. var table = document.createElement("table");
  293. table.setAttribute("class","bscTable");
  294. table.cellSpacing = "0";
  295. table.cellPadding = "0";
  296. table.style.marginBottom = "0px";
  297. table.style.width = "960px";
  298.  
  299. var tbody = createRecordTBody("Season");
  300.  
  301. var totals = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  302. for (var s=0; s<gameTotals.length; s++) {
  303. var record = [0,0,0];
  304. var playoff = [0,0,0];
  305. var scrimmage = [0,0,0];
  306. var ranked = [0,0,0];
  307. var tourn = [0,0,0];
  308. var spreads = new Array();
  309.  
  310. if (gameTotals[s] != null) {
  311. var str = "<tr class='alternating_color"+((s%2)+1)+"'>";
  312. str += "<td>"+s+"</td>";
  313. for (var z=0; z<gameTotals[s].length; z++) {
  314. var g = gameTotals[s][z];
  315. var res;
  316. if (g.result.indexOf("W") != -1) {
  317. res = 0;
  318. }
  319. else if (g.result.indexOf("L") != -1) {
  320. res = 1;
  321. }
  322. else if (g.result.indexOf("T") != -1) {
  323. res = 2;
  324. }
  325. if ((useAllGames == true) || ((g.type == "n") || (g.type == "p"))) {
  326. record[res]++;
  327.  
  328. var s1 = parseInt(g.result.split(" ")[1].split("-")[0]);
  329. var s2 = parseInt(g.result.split(" ")[1].split("-")[1]);
  330. var spread = Math.max(s1,s2) - Math.min(s1,s2);
  331. if (spreads[Math.min(Math.floor(spread/blowout),3)] == null) {
  332. spreads[Math.min(Math.floor(spread/blowout),3)] = [0,0,0];
  333. }
  334. spreads[Math.min(Math.floor(spread/blowout),3)][res]++;
  335. }
  336.  
  337. if (g.type == "p") playoff[res]++;
  338. if (g.type == "s") scrimmage[res]++;
  339. if (g.type == "r") ranked[res]++;
  340. if (g.type == "t") tourn[res]++;
  341. }
  342.  
  343. for (var i=0; i<3; i++) {
  344. str += "<td style='text-align:right'>"+record[i]+"</td>";
  345. totals[i] += record[i];
  346. }
  347. for (var i=0; i<3; i++) {
  348. str += "<td style='text-align:right'>"+playoff[i]+"</td>";
  349. totals[i+3] += playoff[i];
  350. }
  351. for (var i=0; i<4; i++) {
  352. for (var j=0; j<3; j++) {
  353. if ((spreads[i] == null) || (spreads[i][j] == null)) {
  354. str += "<td style='text-align:right'>0</td>";
  355. }
  356. else {
  357. str += "<td style='text-align:right'>"+spreads[i][j]+"</td>";
  358. totals[3+3+i*3+j] += spreads[i][j];
  359. }
  360. }
  361. }
  362.  
  363. for (var i=0; i<3; i++) {
  364. str += "<td style='text-align:right'>"+ranked[i]+"</td>";
  365. totals[i+18] += ranked[i];
  366. }
  367. for (var i=0; i<3; i++) {
  368. str += "<td style='text-align:right'>"+tourn[i]+"</td>";
  369. totals[i+21] += tourn[i];
  370. }
  371. for (var i=0; i<3; i++) {
  372. str += "<td style='text-align:right'>"+scrimmage[i]+"</td>";
  373. totals[i+24] += scrimmage[i];
  374. }
  375. str += "</tr>";
  376.  
  377. tbody.innerHTML += str;
  378. }
  379. }
  380.  
  381. var str = "<tr class='alternating_color"+((s%2)+1)+"'><td>Total</td>";
  382. for (var i=0; i<totals.length; i++) {
  383. str += "<td style='text-align:right'>"+totals[i]+"</td>";
  384. }
  385. str += "</tr>";
  386. tbody.innerHTML += str;
  387.  
  388. table.appendChild(tbody);
  389.  
  390. var div = document.createElement("div");
  391. div.appendChild(table);
  392. document.getElementById("footer").parentNode.appendChild(div);
  393. }
  394.  
  395. function boxSetup() {
  396. var div = document.createElement("div");
  397. div.style.clear = "both";
  398.  
  399. var button = document.createElement("input");
  400. button.setAttribute("value","Collect Team History");
  401. button.setAttribute("type","button");
  402. button.setAttribute("id","rbtbutton");
  403. button.addEventListener("click",mainHistorical,false);
  404. div.appendChild(button);
  405. var checkBox = document.createElement("input");
  406. checkBox.setAttribute("type","checkbox");
  407. checkBox.setAttribute("id","allGamesTeam");
  408. checkBox.setAttribute("class","GScheckbox");
  409. checkBox.style.marginLeft = "3px";
  410. checkBox.style.marginRight = "3px";
  411. div.appendChild(checkBox);
  412.  
  413. var span = document.createElement("span");
  414. span.innerHTML = "Use All Games";
  415. div.appendChild(span);
  416. var selects = document.getElementsByTagName("select");
  417. for (var i=0; i<selects.length; i++) {
  418. if (selects[i].name == "season") {
  419. earliestSeason = selects[i].value;
  420. currentSeason = selects[i].options[0].value;
  421. }
  422. }
  423.  
  424. var textBox = document.createElement("input");
  425. textBox.setAttribute("type","text");
  426. textBox.size = 16;
  427. textBox.defaultValue = earliestSeason+"-"+currentSeason;
  428. textBox.setAttribute("id","seasonsTRB");
  429. textBox.setAttribute("class","GStextbox");
  430. textBox.style.marginLeft = "3px";
  431. textBox.style.marginRight = "3px";
  432. textBox.addEventListener("mouseover",function(e) { over(e,false); }, false);
  433. textBox.addEventListener("mouseout",function(e) { out(e,false); }, false);
  434. div.appendChild(textBox);
  435.  
  436. var span = document.createElement("span");
  437. span.innerHTML = "Seasons";
  438. div.appendChild(span);
  439. var content = document.getElementById("content");
  440. content.parentNode.insertBefore(div, content.nextSibling);
  441. }
  442.  
  443. function over(e, left) {
  444. unsafeWindow.set_tip("Ex. 1,2,3,10,18,19,20 or 1-3,10,18-20", left, null, true);
  445. }
  446.  
  447. function out(e) {
  448. unsafeWindow.unset_tip();
  449. }
  450.  
  451. function merge(a, b, sortidx) {
  452. if (a.length == 0) return b;
  453. if (b.length == 0) return a;
  454.  
  455. var output = new Array();
  456. var idx = 0, aidx = 0, bidx = 0;
  457.  
  458. while ((aidx < a.length) && (bidx < b.length)) {
  459. if (parseFloat(a[aidx].cells[sortidx].textContent) > parseFloat(b[bidx].cells[sortidx].textContent)) {
  460. output.push(a[aidx++]);
  461. }
  462. else {
  463. output.push(b[bidx++]);
  464. }
  465. }
  466.  
  467. for (; aidx<a.length; aidx++) {
  468. output.push(a[aidx]);
  469. }
  470. for (; bidx<b.length; bidx++) {
  471. output.push(b[bidx]);
  472. }
  473.  
  474. return output;
  475. }
  476.  
  477. function sortColumn(data, sortidx) {
  478. // sort broken?
  479. if (data.length == 1) return data;
  480.  
  481. var center = Math.round(data.length/2);
  482.  
  483. var left = data.slice(0,center);
  484. left = sortColumn(left, sortidx);
  485.  
  486. var right = data.slice(center);
  487. right = sortColumn(right, sortidx);
  488.  
  489. var output = merge(left, right, sortidx);
  490. return output;
  491. }
  492.  
  493. function emit(target) {
  494. var evt = document.createEvent("HTMLEvents");
  495. evt.initEvent("click",false,false);
  496. target.dispatchEvent(evt);
  497. }
  498.  
  499. function makeSortable() {
  500. var tables = document.getElementsByClassName("bscTable");
  501. for (var j=0; j<tables.length; j++) {
  502. var t = tables[j];
  503. var head = t.getElementsByTagName("th");
  504. for (var i=0; i<head.length; i++) {
  505. var th = head[i];
  506. th.addEventListener("click", sort, false);
  507. }
  508. }
  509. }
  510.  
  511. function sort(event) {
  512. var tbl = event.target.parentNode.parentNode;
  513. var tbody = tbl.getElementsByTagName("tbody")[0];
  514.  
  515. var idx = event.target.cellIndex;
  516. if (idx == -1) return;
  517.  
  518. tbl.style.visibility = "hidden";
  519.  
  520. var stime = new Date();
  521. var results = sortColumn(getArray(tbl.rows), idx);
  522. var time = new Date() - stime;
  523. console.log("sort time : "+time.toFixed(0)+"ms");
  524.  
  525. var stime = new Date();
  526. while (tbl.rows.length > 2) {
  527. tbl.deleteRow(2);
  528. }
  529. var time = new Date() - stime;
  530. console.log("delete time : "+time.toFixed(0)+"ms");
  531.  
  532. var stime = new Date();
  533. for (var i=0; i<Math.min(results.length, results.length+2); i++) {
  534. results[i].setAttribute("class","alternating_color"+(i%2+1));
  535. if (gameLeaders == true) {
  536. if (i > (maxLeaders+2)) {
  537. results[i].style.visibility = "hidden";
  538. results[i].style.display = "none";
  539. }
  540. else {
  541. results[i].style.visibility = "visible";
  542. results[i].style.display = null;
  543. }
  544. }
  545. tbl.appendChild(results[i]);
  546. }
  547. results = null;
  548. var time = new Date() - stime;
  549. console.log("append time : "+time.toFixed(0)+"ms");
  550.  
  551. tbl.style.visibility = "visible";
  552. }
  553.  
  554. function getInetPage(address, func, data) {
  555. var req = new XMLHttpRequest();
  556. req.open( 'GET', address, true );
  557. req.onload = function() {
  558. if (this.status != 200) {
  559. inetErrors++;
  560. func(address, this, data);
  561. }
  562. else {
  563. func(address, this, data);
  564. }
  565. };
  566.  
  567. req.send(null);
  568. return req;
  569. }
  570.