Replay Rewrite - Custom Graphics On Replay

Enables the use of custom fields when viewing plays with the replay rewrite script.

  1. // ==UserScript==
  2. // @name Replay Rewrite - Custom Graphics On Replay
  3. // @description Enables the use of custom fields when viewing plays with the replay rewrite script.
  4. // @namespace pbr/cgor
  5. // @include http://*goallineblitz.com/game/replay.pl?game_id=*&pbp_id=*
  6. // @include http://glb.warriorgeneral.com/game/replay.pl?game_id=*&pbp_id=*
  7. // @copyright 2010, pabst
  8. // @license (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/
  9. // @version 13.12.291
  10. // @require https://greasyfork.org/scripts/1371-libpbr2/code/libpbr2.js?version=3533
  11. // ==/UserScript==
  12.  
  13. var scriptName = "Custom Graphics";
  14. var scriptVersion = "13.12.29";
  15. var scriptWebpage = "http://userscripts.org/scripts/show/54524";
  16.  
  17. // XML stadium descriptions are at the bottom of this file
  18. var useXMLDescription = true;
  19. var useRemoteXML = true;
  20.  
  21. // if XML descriptions = true, set the booleans to image types you want to see.
  22. // if XML descriptions = false, set the booleans to image types you want to see and set the addresses here.
  23. // 1080x480
  24. var enableFieldLayer = true;
  25. var fieldImage = null; //"http://img242.imageshack.us/img242/6797/fieldnewbasefixedkp2.png";
  26. var fieldImageX = 520; //set to the x-axis length of your image if not using xml
  27. var fieldImageY = 1160; //set to the y-axis length of your image if not using xml
  28.  
  29. // 1080x480
  30. var enableLineLayer = true;
  31. var lineImage = "http://img527.imageshack.us/img527/3776/glblinesyk7.png";
  32.  
  33. // 480x91 including outline
  34. var enableLowerDecalLayer = true;
  35. var northEndZoneImage = "http://i10.photobucket.com/albums/a136/ggakma/GLB/ENDZONES/endzone-glb-top.jpg";
  36. var southEndZoneImage = "http://i10.photobucket.com/albums/a136/ggakma/GLB/ENDZONES/endzone-glb-bottom.jpg";
  37.  
  38. // x & y size MUST be set to the size of your image
  39. var enableMiddleDecalLayer = true;
  40. var middleDecalImage = "http://img184.imageshack.us/img184/320/glblogotx0.png";
  41. var middleDecalImageX = 224; //set to the x-axis length of your image if not using xml
  42. var middleDecalImageY = 140; //set to the y-axis length of your image if not using xml
  43.  
  44. // 1080x480
  45. var enableUpperDecalLayer = true;
  46. var upperDecalImage = "http://img515.imageshack.us/img515/9223/glboverlaymappedto100vu7.png";
  47.  
  48. // you can modify the previous variables
  49.  
  50. // don't screw with these
  51. var hometeam = unsafeWindow.home;
  52. var runUpdate = fieldGraphicsUpdate;
  53. var deff = "/images/game/fields/grass_plain.jpg";
  54.  
  55. window.setTimeout( function() {
  56. init();
  57. }, 100);
  58.  
  59. function activate(e) {
  60. console.log("activate custom graphics");
  61.  
  62. lock();
  63.  
  64. if (fieldImage == null) {
  65. if (document.getElementById("field_image") != null) {
  66. console.log("no field_image element yet! failure imminent?");
  67. fieldImage = document.getElementById("field_image").src;
  68. deff = fieldImage;
  69. }
  70. else {
  71. fieldImage = deff; //deff @ 51
  72. }
  73. }
  74. var inp = document.getElementById("use_graphics");
  75. if (inp == null) {
  76. var br = document.createElement("br");
  77. inp = document.createElement("input");
  78. inp.id = "use_graphics";
  79. inp.type = "checkbox";
  80. var data = "0";
  81. if (GM_getValue) {
  82. data = GM_getValue("use_graphics",0);
  83. if (data == "1") {
  84. inp.checked = true;
  85. }
  86. }
  87.  
  88. var text = document.createElement("text");
  89. text.textContent = " Use default field";
  90.  
  91. var footer = document.getElementById("replay_footer");
  92. footer.style.height = "90px";
  93.  
  94. var options = document.getElementById("options_popup");
  95. options.appendChild(br);
  96. options.appendChild(inp);
  97. options.appendChild(text);
  98.  
  99. inp.addEventListener("click",boxClicked,false);
  100. }
  101.  
  102. if (inp.checked == false) {
  103. runUpdate();
  104. }
  105. unlock();
  106. }
  107.  
  108. function boxClicked(e) {
  109. lock();
  110. if (e.target.checked == false) {
  111. if (GM_setValue) {
  112. GM_setValue("use_graphics",0);
  113. }
  114.  
  115. var addr = window.location.toString();
  116. addr = addr.split("game")[0]+"game/team.pl?team_id="+hometeam;
  117. getInetPage(addr, remoteXMLHandler, null);
  118. }
  119. else {
  120. if (GM_setValue) {
  121. GM_setValue("use_graphics",1);
  122. }
  123.  
  124. var ids = ["upperdecals","middledecals","lowerdecals","linelayer"];
  125. for (var i=0; i<ids.length; i++) {
  126. var div = document.getElementById(ids[i]);
  127. if (div != null) {
  128. div.parentNode.removeChild(div);
  129. }
  130. }
  131.  
  132. var saved = useRemoteXML;
  133. useRemoteXML = false;
  134. fieldGraphicsUpdate("<root><team id='"+hometeam+"'><field x='520' y='1160'>"+deff+"</field></team></root>");
  135. useRemoteXML = saved;
  136. }
  137. }
  138.  
  139. function remoteXMLHandler(addr, page) {
  140. //console.log(page.responseText);
  141. var xmlDesc = null;
  142. var src = page.responseText.split('<div id="team_note_content"');
  143. if (src.length > 1) {
  144. src = '<div id="team_note_content"'+src[1];
  145. src = src.split("</div>")[0]+"</div";
  146. var div = document.createElement("div");
  147. div.innerHTML = src;
  148. src = div.textContent;
  149. //console.log(src);
  150.  
  151. xmlDesc = '<root><team id="'+hometeam+'">';
  152. var found = false;
  153. var tags = ["field","north","south","middle","upper"];
  154. for (var i=0; i<tags.length; i++) {
  155. var layer = "";
  156. var start = src.indexOf("<"+tags[i]);
  157. if (start != -1) {
  158. var end = src.indexOf("</"+tags[i]+">")+("</"+tags[i]+">").length;
  159. layer = src.slice(start, end);
  160. xmlDesc += layer;
  161. found = true;
  162. }
  163. //console.log(start+" -- "+end+" : "+layer);
  164. }
  165. if (found == true) {
  166. xmlDesc += '</team></root>';
  167. }
  168. else {
  169. xmlDesc = null;
  170. }
  171. }
  172. else if (useXMLDescription == true) {
  173. console.log("No remote XML source. Using xmlDescription.");
  174. xmlDesc = xmlDescription;
  175. }
  176. var saved = useRemoteXML;
  177. useRemoteXML = false;
  178. fieldGraphicsUpdate(xmlDesc);
  179. useRemoteXML = saved;
  180. }
  181.  
  182. function fieldGraphicsUpdate(xml) {
  183. console.log("xml="+xml);
  184. if (useRemoteXML == true) {
  185. // console.log("hometeam="+hometeam);
  186. var addr = window.location.toString();
  187. addr = addr.split("game")[0]+"game/team.pl?team_id="+hometeam;
  188.  
  189. getInetPage(addr, remoteXMLHandler, null);
  190. return;
  191. }
  192.  
  193. if (xml != null) {
  194. var parser = new DOMParser();
  195. var xmlDoc = parser.parseFromString(xml, "application/xml");
  196. var teams = xmlDoc.getElementsByTagName("team");
  197. console.log("Remote XML: "+hometeam);
  198. var found = false;
  199. for (var i=0; i<teams.length; i++) {
  200. var t = teams[i];
  201. if (t.getAttribute("id") == hometeam) {
  202. if (setImages(t) == true) {
  203. fieldGraphicsInsert();
  204. found = true;
  205. break;
  206. }
  207. }
  208. }
  209. if (found == false) {
  210. for (var i=0; i<teams.length; i++) {
  211. var t = teams[i];
  212. if (t.getAttribute("id") == "-1") {
  213. if (setImages(t) == true) {
  214. fieldGraphicsInsert();
  215. break;
  216. }
  217. }
  218. }
  219. }
  220. }
  221. else if (useXMLDescription == true) {
  222. var parser = new DOMParser();
  223. var xmlDoc = parser.parseFromString(xmlDescription, "application/xml");
  224. var teams = xmlDoc.getElementsByTagName("team");
  225. console.log("Local XML: "+hometeam+": number of teams in XML = "+teams.length);
  226. var found = false;
  227. for (var i=0; i<teams.length; i++) {
  228. var t = teams[i];
  229. if (t.getAttribute("id") == hometeam) {
  230. if (setImages(t) == true) {
  231. fieldGraphicsInsert();
  232. found = true;
  233. break;
  234. }
  235. }
  236. }
  237. if (found == false) {
  238. for (var i=0; i<teams.length; i++) {
  239. var t = teams[i];
  240. if (t.getAttribute("id") == "-1") {
  241. if (setImages(t) == true) {
  242. fieldGraphicsInsert();
  243. break;
  244. }
  245. }
  246. }
  247. }
  248. }
  249. else {
  250. fieldGraphicsInsert();
  251. }
  252. }
  253.  
  254. function setImages(t) {
  255. var change = false;
  256. var f = t.getElementsByTagName("field")[0];
  257. if (f != null) {
  258. if ((f.textContent != null) && (f.textContent != "null")) {
  259. if (f.textContent.length > 0) {
  260. fieldImage = f.textContent;
  261. }
  262. }
  263.  
  264. var x = f.getAttribute("x");
  265. var y = f.getAttribute("y");
  266. if (x != null) fieldImageX = parseInt(x);
  267. if (y != null) fieldImageY = parseInt(y);
  268. change = true;
  269. }
  270. else {
  271. fieldImage = null;
  272.  
  273. }
  274.  
  275. var l = t.getElementsByTagName("line")[0];
  276. if (l != null) {
  277. lineImage = l.textContent;
  278. if (l.textContent.length == 0) lineImage = null;
  279. change = true;
  280. }
  281. else lineImage = null;
  282.  
  283. var n = t.getElementsByTagName("north")[0];
  284. if (n != null) {
  285. northEndZoneImage = n.textContent;
  286. if (n.textContent.length == 0) northEndZoneImage = null;
  287. change = true;
  288. }
  289. else northEndZoneImage = null;
  290.  
  291. var s = t.getElementsByTagName("south")[0];
  292. if (s != null) {
  293. southEndZoneImage = s.textContent;
  294. if (s.textContent.length == 0) southEndZoneImage = null;
  295. change = true;
  296. }
  297. else southEndZoneImage = null;
  298.  
  299. var u = t.getElementsByTagName("upper")[0];
  300. if (u != null) {
  301. upperDecalImage = u.textContent;
  302. if (u.textContent.length == 0) upperDecalImage = null;
  303. change = true;
  304. }
  305. else upperDecalImage = null;
  306.  
  307. var m = t.getElementsByTagName("middle")[0];
  308. if (m != null) {
  309. middleDecalImage = m.textContent;
  310. if (m.textContent.length == 0) middleDecalImage = null;
  311. else {
  312. middleDecalImageX = parseInt(m.getAttribute("xsize"));
  313. middleDecalImageY = parseInt(m.getAttribute("ysize"));
  314. change = true;
  315. if ((middleDecalImageX == null) || (middleDecalImageY == null)) {
  316. alert("Replay Rewrite: Image sizes for middle decal aren't included! Fix it!")
  317. change = false;
  318. }
  319. }
  320. }
  321. else middleDecalImage = null;
  322.  
  323. //console.log(middleDecalImage+" --- "+middleDecalImageX);
  324. return change;
  325. }
  326.  
  327. function fieldGraphicsInsert() {
  328. if (document.getElementById("field_image") == null) {
  329. console.log("FGI: no field_image element. delaying.");
  330. setTimeout( function() { fieldGraphicsInsert(); }, 1000);
  331. }
  332. if ((enableFieldLayer == true) && (fieldImage != null)) {
  333. // var field = document.getElementById("replay_area");
  334. // field.style.backgroundImage = "url("+fieldImage+")";
  335. var field = document.getElementById("field_image");
  336. field.src = fieldImage;
  337. field.style.position = "absolute";
  338. field.style.left = ((520-fieldImageX)>>1)+"px";
  339. field.style.top = ((1160-fieldImageY)>>1)+"px";
  340.  
  341. console.log("("+fieldImageX+","+fieldImageY+") "+fieldImage);
  342. }
  343.  
  344. if ((enableLowerDecalLayer == true) && (northEndZoneImage != null) && (southEndZoneImage != null)) {
  345. var d = document.getElementById("lowerdecals");
  346. if (d == null) {
  347. var repdiv = document.getElementById("replay_area");
  348. var parstyle = repdiv.getAttribute("style");
  349. if (parstyle == null) parstyle = "";
  350.  
  351. div = document.createElement("div");
  352. div.setAttribute("style","position:absolute; z-index:"+lowerDecalLayerZ+";");
  353. div.setAttribute("id","lowerdecals");
  354. div.zIndex=lowerDecalLayerZ;
  355.  
  356. var img = document.createElement("img");
  357. img.src = northEndZoneImage;
  358. img.setAttribute("style","position: absolute; top:0px; left:0px; z-index:"+lowerDecalLayerZ+";");
  359. img.zIndex=lowerDecalLayerZ;
  360. div.appendChild(img);
  361.  
  362. var img = document.createElement("img");
  363. img.src = southEndZoneImage;
  364. img.setAttribute("style","position: absolute; top:988px; left:0px; z-index:"+lowerDecalLayerZ+";");
  365. img.zIndex=lowerDecalLayerZ;
  366. div.appendChild(img);
  367.  
  368. repdiv.appendChild(div);
  369. }
  370. }
  371.  
  372. if ((enableLineLayer == true) && (lineImage != null)) {
  373. var d = document.getElementById("linelayer");
  374. if (d == null) {
  375. var repdiv = document.getElementById("replay_area");
  376.  
  377. div = document.createElement("div");
  378. div.setAttribute("style","position:absolute; z-index:"+lineLayerZ+";");
  379. div.setAttribute("id","linelayer");
  380. div.zIndex=lineLayerZ;
  381.  
  382. var img = document.createElement("img");
  383. img.src = lineImage;
  384. img.setAttribute("style","position: absolute; z-index:"+lineLayerZ+";");
  385. img.zIndex=lineLayerZ;
  386. div.appendChild(img);
  387.  
  388. repdiv.appendChild(div);
  389. }
  390. }
  391.  
  392. if ((enableMiddleDecalLayer == true) && (middleDecalImage != null)) {
  393. var d = document.getElementById("middledecals");
  394. if (d == null) {
  395. var repdiv = document.getElementById("replay_area");
  396. var parstyle = repdiv.getAttribute("style");
  397. if (parstyle == null) parstyle = "";
  398.  
  399. div = document.createElement("div");
  400. div.setAttribute("style","position:absolute; z-index:"+middleDecalLayerZ+";");
  401. div.setAttribute("id","middledecals");
  402. div.zIndex=middleDecalLayerZ;
  403.  
  404. //50 yard line image
  405. var imgysize = middleDecalImageX;
  406. var imgxsize = middleDecalImageY; //set to the y-axis length of your image
  407. var img = document.createElement("img");
  408. img.src = middleDecalImage;
  409. img.setAttribute("style","position: absolute; top:"+(540-(imgysize>>1))+"px; left:"+(240-(imgxsize>>1))+"px; z-index:"+middleDecalLayerZ+";");
  410. img.zIndex=middleDecalLayerZ;
  411. div.appendChild(img);
  412.  
  413. repdiv.appendChild(div);
  414. }
  415. }
  416.  
  417. if ((enableUpperDecalLayer == true) && (upperDecalImage != null)) {
  418. var d = document.getElementById("upperdecals");
  419. if (d == null) {
  420. var repdiv = document.getElementById("replay_area");
  421.  
  422. div = document.createElement("div");
  423. div.setAttribute("style","position:absolute; z-index:"+upperDecalLayerZ+";");
  424. div.setAttribute("id","upperdecals");
  425. div.zIndex=upperDecalLayerZ;
  426.  
  427. var img = document.createElement("img");
  428. img.src = upperDecalImage;
  429. img.setAttribute("style","position: absolute; opacity:0.45; z-index:"+upperDecalLayerZ+";");
  430. img.zIndex=upperDecalLayerZ;
  431. div.appendChild(img);
  432.  
  433. repdiv.appendChild(div);
  434. }
  435. }
  436. runUpdate = function() {
  437. someOwnersAreFuckingJackasses();
  438. };
  439. unlock();
  440. }
  441.  
  442. function someOwnersAreFuckingJackasses() {
  443. var fi = document.getElementById("field_image");
  444. console.log("Jackass who cannot follow directions ahoy!");
  445. if (fi.naturalWidth == 480) {
  446. fi.style.width = "480px";
  447. fi.style.height = "1080px";
  448. fi.style.top = "40px";
  449. fi.style.left = "20px";
  450. }
  451. }
  452.  
  453. //these fields have yard lines already. DISABLE THE LINE LAYER.
  454. //fields[fields.length] = 'http://img517.imageshack.us/img517/2792/glbfieldgrassph5.jpg';
  455. //fields[fields.length] = 'http://img517.imageshack.us/img517/2551/glbfieldturfhl0.jpg';
  456. //fields[fields.length] = 'http://img517.imageshack.us/img517/811/glbfieldwornwh2.jpg';
  457. //fields[fields.length] = 'http://img215.imageshack.us/img215/5927/glbfieldsloppyweatheryf1.jpg';
  458. //fields[fields.length] = 'http://img205.imageshack.us/img205/2179/glbfieldsnowvs1.jpg';
  459. //fields[fields.length] = 'http://img523.imageshack.us/img523/6463/glbfieldrb0.gif';
  460. //fields[fields.length] = 'http://img95.imageshack.us/img95/2734/myfield.jpg';
  461.  
  462. // upper decal images
  463. //img.src = "http://img409.imageshack.us/img409/8636/northshadowxf1.png";
  464. //img.src = "http://img510.imageshack.us/img510/1931/eastshadowhs0.png";
  465.  
  466.  
  467.  
  468.  
  469. //img.src = "http://img515.imageshack.us/img515/9223/glboverlaymappedto100vu7.png";
  470.  
  471. //my unlined field
  472. //"http://img296.imageshack.us/img296/4293/smoothfieldpq9.jpg"
  473.  
  474. // my lines
  475. //"http://img527.imageshack.us/img527/3776/glblinesyk7.png"
  476.  
  477. //two GLB endzones
  478. //north: "http://i10.photobucket.com/albums/a136/ggakma/GLB/ENDZONES/endzone-glb-top.jpg"
  479. //south: "http://i10.photobucket.com/albums/a136/ggakma/GLB/ENDZONES/endzone-glb-bottom.jpg"
  480.  
  481. // GLB logo for the middle
  482. // "http://img184.imageshack.us/img184/320/glblogotx0.png"; 224x140
  483.  
  484. /*
  485. * To add a stadium for a particular team, just copy/paste a new <team> --> </team> block.
  486. * set the id to that team's ID number and insert their particular images in the appropriate places.
  487. * The xsize/ysize options MUST BE SET for the mid field image.
  488. *
  489. * The block for id# -1 is the default stadium to use if no ID match can be found.
  490. */
  491. var xmlDescription = '\n\
  492. <root>\n\
  493. <team id="0">\n\
  494. <field>http://img296.imageshack.us/img296/4293/smoothfieldpq9.jpg</field>\n\
  495. <line>http://img527.imageshack.us/img527/3776/glblinesyk7.png</line>\n\
  496. <north>http://i10.photobucket.com/albums/a136/ggakma/GLB/ENDZONES/endzone-glb-top.jpg</north>\n\
  497. <south>http://i10.photobucket.com/albums/a136/ggakma/GLB/ENDZONES/endzone-glb-bottom.jpg</south>\n\
  498. <middle xsize="224" ysize="140">http://img184.imageshack.us/img184/320/glblogotx0.png</middle>\n\
  499. <upper></upper>\n\
  500. </team>\n\
  501. <team id="-1">\n\
  502. <field x="'+fieldImageX+'" y="'+fieldImageY+'">'+fieldImage+'</field>\n\
  503. <line></line>\n\
  504. <north></north>\n\
  505. <south></south>\n\
  506. <middle xsize="" ysize=""></middle>\n\
  507. <upper></upper>\n\
  508. </team>\n\
  509. </root>\n\
  510. ';