// ==UserScript==
// @name Player Progression Tracker
// @namespace Deep Route
// @author Triplex
// @version 1.5
// @description Stores player attributes for the Deeproute.com online football game
// @grant GM_getValue
// @grant GM_setValue
// @include http://deeproute.com/default.asp?js=oneplayer&lookatplayer=*&leagueno=*
// @include http://deeproute.com/default.asp?js=oneplayer&lookatplayer=*&myleagueno=*
// @include http://deeproute.com/?js=oneplayer&lookatplayer=*&leagueno=*
// @include http://deeproute.com/?js=oneplayer&lookatplayer=*&myleagueno=*
// @include http://deeproute.com/default.asp?js=rosters&myleagueno=*&myteamno=*
// @include http://deeproute.com/?js=rosters&myleagueno=*&myteamno=*
// @include http://deeproute.com/?js=oneplayer&leagueno=*&lookatplayer=*
// @include http://deeproute.com/?js=oneplayer&myleagueno=*&lookatplayer=*
// @include http://deeproute.com/default.asp?js=oneplayer&leagueno=*&lookatplayer=*
// ==/UserScript==
var prefix="DR_progress";
var run=0, attr=[], attrstr="", lgno=0, playerid=0, curryear=-1, counter=0, pidlist=[];
function addtr(intable, incol, isBold) {
var tr1 = document.createElement("tr"), color;
intable.appendChild(tr1);
if (counter++%2===0) {
color='#FFFFDD';
}
else {
color='#EEFFFF';
}
for (var x=0; x<incol.length; x++) {
var td1 = document.createElement("td");
td1.setAttribute('align','center');
var newDiv = document.createElement('div');
newDiv.innerHTML=incol[x];
td1.appendChild(newDiv);
if (isBold || x===0) {
td1.setAttribute('style', 'font-weight: bold;');
}
td1.setAttribute('bgcolor', color);
tr1.appendChild(td1);
}
}
function parseData(instr) {
var ptr1=0, ptr2, ptr3, year, str1;
alldata=[];
while (1) {
ptr2=instr.indexOf(":", ptr1);
ptr3=instr.indexOf(".", ptr2+1);
if (ptr2<0 || ptr3<0) {
break;
}
var tmp=new Array (1);
year=parseInt(instr.substring(ptr1, ptr2));
str1=instr.substring(ptr2+1, ptr3);
ptr1=ptr3+1;
tmp[0]=year;
for (var x=0; x<str1.length; x+=2) {
ptr2=str1.substring(x, x+2);
if (ptr2.substring(0, 1) == '0') {
ptr3=ptr2.substring(1, 2);
ptr2=ptr3;
}
tmp[tmp.length]=parseInt(ptr2);
}
alldata[alldata.length]=tmp;
}
for (var x=0; x<alldata.length; x++) {
for (var y=x+1; y<alldata.length; y++) {
if (alldata[x][0] > alldata[y][0]) {
var tmp0=alldata[x];
alldata[x]=alldata[y];
alldata[y]=tmp0;
}
}
}
}
function constructCols(inname, index1, index2) {
var cols=[];
cols[0]=inname;
var gainStyling = "style='font-weight: bold; color: DarkGreen'";
var lossStyling = "style='font-weight: bold; color: DarkRed'";
for (var x=0; x<alldata.length; x++) {
var cell = (alldata[x][index1]).toString() + "/" + (alldata[x][index2]).toString();
if (x > 0) {
var curDelta;
var potDelta;
var currentDeltaInt = alldata[x][index1] - alldata[x-1][index1];
var potentialDeltaInt = alldata[x][index2] - alldata[x-1][index2];
if (currentDeltaInt < 0) {
curDelta = "<span class='attLoss' " + lossStyling + ">" + currentDeltaInt.toString() + "</span>";
}
else if (currentDeltaInt > 0) {
curDelta = "<span class='attGain' " + gainStyling + ">+" + currentDeltaInt.toString() + "</span>";
}
else {
curDelta = "+" + currentDeltaInt.toString();
}
if (potentialDeltaInt < 0) {
potDelta = "<span class='potentialLoss' " + lossStyling + ">" + potentialDeltaInt.toString() + "</span>";
}
else if (potentialDeltaInt > 0) {
potDelta = "<span class='potentialGain' " + gainStyling + ">+" + potentialDeltaInt.toString() + "</span>";
}
else {
potDelta = "+" + potentialDeltaInt.toString();
}
cell = cell.concat("<span class='delta" + x + "' style='display: none'> (" + curDelta + "/" + potDelta + ")</span>");
}
cols[x+1]=cell;
}
// compare current atts to the last column of historical atts
var curCell = (attr[index1-1]).toString() + "/" + (attr[index2-1]).toString();
var lastIndex = alldata.length - 1;
var curDelta;
var potDelta;
var currentDeltaInt = attr[index1-1] - alldata[lastIndex][index1];
var potentialDeltaInt = attr[index2-1] - alldata[lastIndex][index2];
if (currentDeltaInt < 0) {
curDelta = "<span class='attLoss' " + lossStyling + ">" + currentDeltaInt.toString() + "</span>";
}
else if (currentDeltaInt > 0) {
curDelta = "<span class='attGain' " + gainStyling + ">+" + currentDeltaInt.toString() + "</span>";
}
else {
curDelta = "+" + currentDeltaInt.toString();
}
if (potentialDeltaInt < 0) {
potDelta = "<span class='potentialLoss' " + lossStyling + ">" + potentialDeltaInt.toString() + "</span>";
}
else if (potentialDeltaInt > 0) {
potDelta = "<span class='potentialGain' " + gainStyling + ">+" + potentialDeltaInt.toString() + "</span>";
}
else {
potDelta = "+" + potentialDeltaInt.toString();
}
curCell = curCell.concat("<span class='delta" + x + "' style='display: none'> (" + curDelta + "/" + potDelta + ")</span>");
cols[cols.length] = curCell;
return cols;
}
function print_progression() {
var indexstr=prefix+"_"+lgno+"_"+playerid;
var storedata=GM_getValue(indexstr, null);
var divptr=document.getElementById("progress_mesg"), cols;
if (storedata===null || storedata=="deleted") {
divptr.innerHTML="No historical data is saved previously or data of this player is deleted";
}
else if (run==1) {
run=2;
document.getElementById("print_progression").setAttribute("value", "Show Progression");
document.getElementById("combine table").style.display = "none";
document.getElementById("progress_mesg").style.visibility = "hidden";
//divptr.innerHTML="Progression table is displayed already";
}
else if (run==2) {
run=1;
// make existant table visible
document.getElementById("print_progression").setAttribute("value", "Hide Progression");
document.getElementById("combine table").style.display = "table";
document.getElementById("progress_mesg").style.visibility = "visible";
}
else {
run=1;
parseData(storedata);
var outtable = document.createElement("table");
outtable.setAttribute("border","1");
outtable.setAttribute("cellspacing","0");
outtable.setAttribute('style','width: 100%; table-layout: fixed');
outtable.setAttribute('id',"combine table");
cols=[];
cols[0]="Season";
for (var x=0; x<alldata.length; x++) {
if (x === 0) {
cols[x+1]=alldata[x][0];
}
else {
cols[x+1]=alldata[x][0] + " " + addShowHideButtons(x);
}
}
cols[cols.length]="Current " + addShowHideButtons(cols.length - 1);
addtr(outtable, cols, 1);
addtr(outtable, constructCols("Overall", 187, 188) ,0);
addtr(outtable, constructCols("Strength/Size", 9, 10) ,0);
addtr(outtable, constructCols("Stamina", 49, 50) ,0);
addtr(outtable, constructCols("Toughness", 51, 52) ,0);
addtr(outtable, constructCols("Athleticism", 57, 58) ,0);
addtr(outtable, constructCols("Intelligence", 11, 12) ,0);
addtr(outtable, constructCols("Leadership", 13, 14) ,0);
addtr(outtable, constructCols("Discipline", 27, 28) ,0);
addtr(outtable, constructCols("Clutch", 23, 24) ,0);
addtr(outtable, constructCols("Consistency", 53, 54) ,0);
addtr(outtable, constructCols("Passing Arm", 1, 2) ,0);
addtr(outtable, constructCols("Passing Accuracy", 3, 4) ,0);
addtr(outtable, constructCols("Handle Snap", 63, 64) ,0);
addtr(outtable, constructCols("Escapability", 5, 6) ,0);
addtr(outtable, constructCols("Speed/Size", 33, 34) ,0);
addtr(outtable, constructCols("Footwork", 35, 36) ,0);
addtr(outtable, constructCols("Cover Skills/Size", 81, 82) ,0);
addtr(outtable, constructCols("Protect ball", 37, 38) ,0);
addtr(outtable, constructCols("Shed Blocker", 59, 60) ,0);
addtr(outtable, constructCols("Pass Catching", 15, 16) ,0);
addtr(outtable, constructCols("Route", 17, 18) ,0);
addtr(outtable, constructCols("First Step", 25, 26) ,0);
addtr(outtable, constructCols("Run Blocking", 19, 20) ,0);
addtr(outtable, constructCols("Pass Blocking", 21, 22) ,0);
addtr(outtable, constructCols("Snapping", 61, 62) ,0);
addtr(outtable, constructCols("Motor", 7, 8) ,0);
addtr(outtable, constructCols("Read Opposition", 55, 56) ,0);
addtr(outtable, constructCols("Tackling", 29, 30) ,0);
addtr(outtable, constructCols("Leaping", 31, 32) ,0);
addtr(outtable, constructCols("Feel Pressure", 45, 46) ,0);
addtr(outtable, constructCols("Find Opening", 47, 48) ,0);
addtr(outtable, constructCols("FG Accuracy", 41, 42) ,0);
addtr(outtable, constructCols("Kicking Strength", 39, 40) ,0);
addtr(outtable, constructCols("Punting Accuracy", 43, 44) ,0);
divptr.innerHTML="Player Progression:";
var divptr=document.getElementById("progress_mesg");
divptr.parentNode.insertBefore(outtable, divptr.nextSibling);
document.getElementById("print_progression").setAttribute("value", "Hide Progression");
}
for (var i=1; i<=alldata.length; i++) {
var showButtonName = "showDelta" + i;
var hideButtonName = "hideDelta" + i;
var deltaSpanName = "delta" + i;
var showDeltaButton = document.getElementById(showButtonName);
showDeltaButton.addEventListener("click", showDelta.bind(null, deltaSpanName, showButtonName, hideButtonName), false);
var hideDeltaButton = document.getElementById(hideButtonName);
hideDeltaButton.addEventListener("click", hideDelta.bind(null, deltaSpanName, showButtonName, hideButtonName), false);
}
}
function save_data() {
var indexstr=prefix+"_"+lgno+"_"+playerid;
var storedata=GM_getValue(indexstr, null);
if ((storedata===null || storedata=="deleted") && attr!=="" && curryear!=-1) {
GM_setValue(indexstr, curryear.toString()+":"+attrstr+".");
var divptr=document.getElementById("progress_mesg");
divptr.innerHTML="Attributes Saved";
}
else if (curryear!=-1) {
parseData(storedata);
var found=0;
for (var x=0; x<alldata.length; x++) {
if (alldata[x][0] == curryear) {
found=1;
break;
}
}
var divptr=document.getElementById("progress_mesg");
if (found===0) {
GM_setValue(indexstr, storedata+curryear.toString()+":"+attrstr+".");
divptr.innerHTML="Attributes Saved";
}
else {
divptr.innerHTML="This season's attributes are already saved";
}
}
else {
var divptr=document.getElementById("progress_mesg");
divptr.innerHTML="Save failed: Can't find current year info in the page. Try saving whole team instead";
}
}
function save_all() {
for (var x=0; x<pidlist.length; x++) {
var indexstr=prefix+"_"+lgno+"_"+pidlist[x];
var str1="pattnoinj"+pidlist[x];
var attsptr=document.getElementsByName(str1);
var atts=attsptr[0].value.toString();
var storedata=GM_getValue(indexstr, null);
if (storedata===null || storedata=="deleted") {
GM_setValue(indexstr, curryear.toString()+":"+atts+".");
}
else {
parseData(storedata);
var found=0;
for (var y=0; y<alldata.length; y++) {
if (alldata[y][0] == curryear) {
found=1;
break;
}
}
if (found===0) {
GM_setValue(indexstr, storedata+curryear.toString()+":"+atts+".");
}
}
}
var divptr=document.getElementById("progress_all_mesg");
divptr.innerHTML="Attributes of all players saved";
}
function delete_all() {
var shouldDelete = confirm("are you sure you want to delete all records?");
if (shouldDelete === true) {
for (var x=0; x<pidlist.length; x++) {
var indexstr=prefix+"_"+lgno+"_"+pidlist[x];
var storedata=GM_getValue(indexstr, null);
if (storedata!==null) {
GM_setValue(indexstr, "deleted");
}
}
var divptr=document.getElementById("progress_all_mesg");
divptr.innerHTML="Attribuite records deleted";
}
}
function delete_data() {
var shouldDelete = confirm("are you sure you want to delete this player's records?");
if (shouldDelete === true) {
var indexstr=prefix+"_"+lgno+"_"+playerid;
GM_setValue(indexstr, "deleted");
var divptr=document.getElementById("progress_mesg");
divptr.innerHTML="Old data deleted";
}
}
function addShowHideButtons(x) {
var buttons = "<a id='showDelta" + x + "' title='Display the change in attributes from the previous season' style='display: inline'>(+/-)</a>" +
"<a id='hideDelta" + x + "' title='Hide the change in attributes from the previous season' style='display: none'>(+/-)</a>";
return buttons;
}
// hide the difference in attributes from the previous year
function hideDelta(className, showButtonName, hideButtonName) {
var toHide = document.getElementsByClassName(className);
for (var i=0; i<toHide.length; i++) {
toHide[i].style.display = "none";
}
var showDeltaButton = document.getElementById(showButtonName);
showDeltaButton.style.display = "inline";
var hideDeltaButton = document.getElementById(hideButtonName);
hideDeltaButton.style.display = "none";
}
// show the difference in attributes from the previous year
function showDelta(className, showButtonName, hideButtonName) {
var toShow = document.getElementsByClassName(className);
for (var i=0; i<toShow.length; i++) {
toShow[i].style.display = "inline";
}
var showDeltaButton = document.getElementById(showButtonName);
showDeltaButton.style.display = "none";
var hideDeltaButton = document.getElementById(hideButtonName);
hideDeltaButton.style.display = "inline";
}
window.setTimeout( function() {
var url=window.location.toString();
if (url.indexOf("oneplayer",0) >= 0) {
var buttontable = document.createElement('table');
buttontable.setAttribute('cellspacing', '0');
buttontable.setAttribute('cellpadding', '0');
buttontable.setAttribute('id', 'track_table');
var newtr=document.createElement('tr');
buttontable.appendChild(newtr);
var newtd1 = document.createElement('td');
newtd1.setAttribute('colspan', '10');
var newDiv2 = document.createElement('div');
newDiv2.align = 'center';
newDiv2.innerHTML = '<input id="print_progression" type="button" style="font-size: 10pt; font-weight: bold; width: 100%; height: 30px" value="Show Progression">';
newDiv2.addEventListener('click', function() { print_progression(); }, true);
newtd1.appendChild(newDiv2);
newtr.appendChild(newtd1);
newtd1 = document.createElement('td');
newtd1.setAttribute('colspan', '10');
newDiv2 = document.createElement('div');
newDiv2.align = 'center';
newDiv2.innerHTML = '<input type="button" style="font-size: 10pt; font-weight: bold; width: 100%; height: 30px" value="Save current season\'s Attributes">';
newDiv2.addEventListener('click', function() { save_data(); }, true);
newtd1.appendChild(newDiv2);
newtr.appendChild(newtd1);
newtd1 = document.createElement('td');
newtd1.setAttribute('colspan', '10');
newDiv2 = document.createElement('div');
newDiv2.align = 'center';
newDiv2.innerHTML = '<input type="button" style="font-size: 10pt; font-weight: bold; width: 100%; height: 30px" value="Delete saved data">';
newDiv2.addEventListener('click', function() { delete_data(); }, true);
newtd1.appendChild(newDiv2);
newtr.appendChild(newtd1);
var newDiv = document.createElement('div');
newDiv.setAttribute("id", "progress_mesg");
newDiv.innerHTML=' ';
var target = document.getElementById('hili1');
if (target) {
target.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.insertBefore(
newDiv, target.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.nextSibling);
target.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.insertBefore(
buttontable, target.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.nextSibling);
}
var ptr1, ptr2, ptr3, input=document.body.innerHTML, lgptr=document.getElementById("mylgno"), yearptr=document.getElementById("hiyear");
if (lgptr!==null) lgno=lgptr.value;
var yearptr1=document.getElementById("thisyear");
if (yearptr1!==null) curryear=parseInt(yearptr1.value);
else {
if (yearptr!==null) {
curryear=parseInt(yearptr.value);
if (curryear<10) {
curryear=-1;
}
}
}
ptr1=input.indexOf("by Game Stats");
if (ptr1>=0) {
ptr2=input.lastIndexOf("\">", ptr1);
ptr3=input.lastIndexOf("lookatplayer=", ptr1);
if (ptr3>=0 && ptr2>ptr3) {
playerid=parseInt(input.substring(ptr3+13, ptr2));
}
}
ptr1=input.indexOf("attsnoinj", 0);
attrstr="";
if (ptr1>=0) {
ptr2=input.indexOf("value=\"", ptr1);
ptr3=input.indexOf("\"", ptr2+7);
if (ptr2>=0 && ptr3>ptr2) {
attrstr=input.substring(ptr2+7, ptr3);
for (var x=0; x<attrstr.length; x+=2) {
ptr1=attrstr.substring(x, x+2);
if (ptr1.substring(0, 1) == '0') {
ptr2=ptr1.substring(1, 2);
ptr1=ptr2;
}
attr[attr.length]=parseInt(ptr1);
}
}
}
}
else if (url.indexOf("rosters",0) >= 0) {
var lgptr=document.getElementById("mylgno"), pids=document.getElementsByName("pid"), yearptr=document.getElementById("myseason");
var currptr=0, ptr1, ptr2, str1;
if (lgptr!==null) lgno=lgptr.value;
if (yearptr!==null) curryear=parseInt(yearptr.value);
str1=(pids[0].value).toString();
while (1) {
ptr1=str1.indexOf("!", currptr);
ptr2=str1.indexOf(" ", ptr1+1);
if (ptr1<0 || ptr2<0) {
break;
}
pidlist[pidlist.length]=parseInt(str1.substring(ptr1+1, ptr2));
currptr=ptr2;
}
var buttontable = document.createElement('table');
buttontable.setAttribute('cellspacing', '0');
buttontable.setAttribute('cellpadding', '0');
buttontable.setAttribute('id', 'track_table');
var newtr=document.createElement('tr');
buttontable.appendChild(newtr);
var newtd1 = document.createElement('td');
newtd1.setAttribute('colspan', '10');
var newDiv2 = document.createElement('div');
newDiv2.align = 'center';
newDiv2.innerHTML = '<input type="button" style="font-size: 10pt; font-weight: bold; width: 100%; height: 30px" value="Record all players\' attributes">';
newDiv2.addEventListener('click', function() { save_all(); }, true);
newtd1.appendChild(newDiv2);
newtr.appendChild(newtd1);
newtr=document.createElement('tr');
buttontable.appendChild(newtr);
newtd1 = document.createElement('td');
newtd1.setAttribute('colspan', '10');
newDiv2 = document.createElement('div');
newDiv2.align = 'center';
newDiv2.innerHTML = '<input type="button" style="font-size: 10pt; font-weight: bold; width: 100%; height: 30px" value="Delete all players\' records">';
newDiv2.addEventListener('click', function() { delete_all(); }, true);
newtd1.appendChild(newDiv2);
newtr.appendChild(newtd1);
var newDiv = document.createElement('div');
newDiv.setAttribute("id", "progress_all_mesg");
newDiv.innerHTML=' ';
var target = document.getElementById('storeme');
if (target) {
target.parentNode.parentNode.parentNode.parentNode.parentNode.insertBefore(newDiv,
target.parentNode.parentNode.parentNode.parentNode.nextSibling);
target.parentNode.parentNode.parentNode.parentNode.parentNode.insertBefore(buttontable,
target.parentNode.parentNode.parentNode.parentNode.nextSibling);
}
}
}, 200);