// ==UserScript==
// @name Player Play Watch Or/And/Xor/Not
// @namespace GLB
// @include http://goallineblitz.com/game/game.pl?game_id=*&mode=pbp
// @include http://glb.warriorgeneral.com/game/game.pl?game_id=*&mode=pbp
// @author numone (http://userscripts.org/users/74270)
// @version 13.12.29
// @description Only show the plays the selected players were in on a GLB play-by-play page.
// ==/UserScript==
// pabst added Or/And/Xor/Not on 7/23/2013
var CACHE = {};
PlayerWatch = function(){
var that = this;
// div that holds everything
this.mainDiv = document.createElement('DIV');
var area = document.getElementById('pbp');
area.insertBefore(this.mainDiv,area.firstChild);
// open/close list button
this.button = document.createElement('Input');
this.button.setAttribute('type','button');
this.button.setAttribute('value','Open Pannel');
this.button.addEventListener('click',function() { that.gatherLists.apply(that); },false);
this.mainDiv.appendChild(this.button);
// div that holds the player's names
this.innerDiv = document.createElement('DIV');
this.mainDiv.appendChild(this.innerDiv);
this.innerDiv.style.display = 'none';
};
PlayerWatch.prototype = {};
PlayerWatch.prototype.gatherLists = function(){
// take care of the button and div
var that = this;
this.button.setAttribute('value','Close Pannel');
this.button.addEventListener('click',function() { that.closeLists.apply(that); },false);
this.innerDiv.style.display = 'block';
if(this.isLoaded){
return;
}
// get the team's names and links
this.team1 = {};
this.team2 = {};
var temp = document.getElementById('scoreboard');
var links = temp.getElementsByTagName('A');
this.team1.name = links[0].innerHTML;
this.team1.link = links[0].getAttribute('href');
this.team1.teamID = this.team1.link.split('=')[1];
this.team1.rosterLink = '/game/roster.pl?team_id=' + this.team1.teamID;
this.team2.name = links[1].innerHTML;
this.team2.link = links[1].getAttribute('href');
this.team2.teamID = this.team2.link.split('=')[1];
this.team2.rosterLink = '/game/roster.pl?team_id=' + this.team2.teamID;
this.getAjaxRequest(this.team1.rosterLink,this.setRoster1,this.innerDiv);
};
PlayerWatch.prototype.setRoster1 = function(address,xmlhttp){
this.team1.results = xmlhttp;
this.team1.holder = document.createElement('SPAN');
this.team1.holder.innerHTML = xmlhttp.responseText;
//this.mainDiv.appendChild(this.team1.holder);
this.getAjaxRequest(this.team2.rosterLink,this.setRoster2,this.innerDiv);
};
PlayerWatch.prototype.setRoster2 = function(address,xmlhttp){
var that = this;
this.isLoaded = true;
this.innerDiv.innerHTML = '';
// embed the results
this.team2.holder = document.createElement('SPAN');
this.team2.holder.innerHTML = xmlhttp.responseText;
// create results table
this.mainTable = document.createElement('table');
var tbody = document.createElement('tbody');
var tr = document.createElement('tr');
tr.setAttribute('class','nonalternating_color');
this.innerDiv.appendChild(this.mainTable);
this.mainTable.appendChild(tbody);
tbody.appendChild(tr);
// create the team names
var td = document.createElement('td');
td.setAttribute('colSpan','2');
tr.appendChild(td);
td.innerHTML = this.team1.name + ':'
td = document.createElement('td');
td.setAttribute('colSpan','2');
tr.appendChild(td);
td.innerHTML = this.team2.name + ':'
// team 1
this.team1.rows = [];
var rosTable = this.team1.holder.getElementsByTagName('TABLE')[0].parentNode;
this.team1.rows = rosTable.getElementsByTagName('TR');
this.team1.stat = 0;
// team 2
this.team2.rows = [];
rosTable = this.team2.holder.getElementsByTagName('TABLE')[0].parentNode;
this.team2.rows = rosTable.getElementsByTagName('TR');
this.team2.stat = 0;
// writes the team to the div
this.printTheTeams();
this.orButton = document.createElement('input');
this.orButton.setAttribute('id','playerPlayWatch_Or');
this.orButton.setAttribute('type','radio');
this.orButton.setAttribute('name','logic');
this.orButton.setAttribute('checked', true);
this.orLabel = document.createElement('label');
this.orLabel.innerHTML = "Or";
this.orSpan = document.createElement('span');
this.orSpan.appendChild(this.orButton);
this.orSpan.appendChild(this.orLabel);
this.innerDiv.appendChild(this.orSpan);
this.andButton = document.createElement('input');
this.andButton.setAttribute('id','playerPlayWatch_And');
this.andButton.setAttribute('type','radio');
this.andButton.setAttribute('name','logic');
this.andLabel = document.createElement('label');
this.andLabel.innerHTML = "And";
this.andSpan = document.createElement('span');
this.andSpan.appendChild(this.andButton);
this.andSpan.appendChild(this.andLabel);
this.innerDiv.appendChild(this.andSpan);
this.xorButton = document.createElement('input');
this.xorButton.setAttribute('id','playerPlayWatch_Xor');
this.xorButton.setAttribute('type','radio');
this.xorButton.setAttribute('name','logic');
this.xorLabel = document.createElement('label');
this.xorLabel.innerHTML = "Xor";
this.xorSpan = document.createElement('span');
this.xorSpan.appendChild(this.xorButton);
this.xorSpan.appendChild(this.xorLabel);
this.innerDiv.appendChild(this.xorSpan);
this.notButton = document.createElement('input');
this.notButton.setAttribute('id','playerPlayWatch_Not');
this.notButton.setAttribute('type','radio');
this.notButton.setAttribute('name','logic');
this.notLabel = document.createElement('label');
this.notLabel.innerHTML = "Not";
this.notSpan = document.createElement('span');
this.notSpan.appendChild(this.notButton);
this.notSpan.appendChild(this.notLabel);
this.innerDiv.appendChild(this.notSpan);
// create the button to filter the results
this.runButton = document.createElement('input');
this.runButton.setAttribute('type','button');
this.runButton.setAttribute('value','Filter Results');
this.innerDiv.appendChild(this.runButton);
this.runButton.addEventListener('click',function() { that.startFiltering.apply(that); },false);
// create a status div
this.statusDiv = document.createElement('DIV');
this.innerDiv.appendChild(this.statusDiv);
this.info1 = document.createElement('SPAN');
this.info2 = document.createElement('SPAN');
this.info3 = document.createElement('SPAN');
this.statusDiv.appendChild(this.info1);
this.statusDiv.appendChild(this.info2);
this.statusDiv.appendChild(this.info3);
};
PlayerWatch.prototype.startFiltering = function(){
var checkboxs = this.mainTable.getElementsByTagName('input');
var names = [];
for(var i=0;i<checkboxs.length;i++){
if(checkboxs[i].checked){
names.push(checkboxs[i].getAttribute('playerName'));
}
}
if(names.length == 0){
alert('No Names Checked');
return;
}
//this.runButton.setAttribute('disabled',true);
// for(var i=0;i<names.length;i++){
// console.log('checked: ' + names[i]);
// }
if(!this.cached){
this.names = names;
this.cachePlays(names);
}else{
this.filterRows(names);
}
};
PlayerWatch.prototype.cachePlays = function(names){
var that = this;
this.hasMonsterkill = document.getElementById('statsDiv') ? true : false;
console.log('monsterkill: ' + this.hasMonsterkill);
var table = document.getElementById('play_by_play_table');
var rows = table.getElementsByTagName('TR');
// remove rows that aren't needed and count the total rows needed
var useRows = [];
for(var i=0;i<rows.length;i++){
var c = " " + rows[i].className + " ";
// it is a play
if(c.indexOf(" pbp_play_row ") != -1 || c.indexOf(" pbp_play_row_scoring ") != -1 || c.indexOf(" pbp_play_row_turnover ") != -1){
//console.log('row innerhtml: ' + rows[i].innerHTML);
var link = rows[i].lastChild.previousSibling.firstChild.href;
if(this.hasMonsterkill && link){
if(this.isTimeout(rows[i])){
useRows.push(rows[i]);
continue;
}else{
useRows.push(rows[i]);
i = i + 2;
continue;
}
}else{ // replays only take up 1 row with MK
useRows.push(rows[i]);
continue;
}
}
}
this.totalPlays = useRows.length;
this.playNum = 0;
this.info1.innerHTML = 'Cacheing play ';
this.info2.innerHTML = this.playNum;
this.info3.innerHTML = ' of ' + this.totalPlays;
for(var i=0;i<useRows.length;i++){
var link = useRows[i].lastChild.previousSibling.firstChild.href;
if(link){
this.cachePlay(link);
}else{
this.postCachePlay();
}
}
};
PlayerWatch.prototype.isTimeout = function(row){
var td = getElementsByClassName('pbp_play',row)[0];
//console.log('td innerhtml: ' + td.innerHTML);
if(td.innerHTML == 'Offensive Timeout Called: ' + this.team1.name ||
td.innerHTML == 'Offensive Timeout Called: ' + this.team2.name ||
td.innerHTML == this.team1.name + ' calls timeout' ||
td.innerHTML == this.team2.name + ' calls timeout' ||
td.innerHTML == 'Defensive Timeout Called: ' + this.team1.name ||
td.innerHTML == 'Defensive Timeout Called: ' + this.team2.name){
return true;
}
return false;
};
PlayerWatch.prototype.cachePlay = function(link){
this.getAjaxRequest(link,this.postCachePlay);
};
PlayerWatch.prototype.postCachePlay = function(link,xmlhttp){
this.playNum++;
this.info2.innerHTML = this.playNum;
if(this.playNum == this.totalPlays){
this.cached = true;
this.filterRows(this.names);
}
};
PlayerWatch.prototype.filterRows = function(names){
var that = this;
this.hasMonsterkill = document.getElementById('statsDiv') ? true : false;
var table = document.getElementById('play_by_play_table');
var rows = table.getElementsByTagName('TR');
// remove rows that aren't needed and count the total rows needed
var useRows = [];
for(var i=0;i<rows.length;i++){
var c = " " + rows[i].className + " ";
// it is a play
if(c.indexOf(" pbp_play_row ") != -1 || c.indexOf(" pbp_play_row_scoring ") != -1 || c.indexOf(" pbp_play_row_turnover ") != -1){
var link = rows[i].lastChild.previousSibling.firstChild;
link.target = '_blank';
link = link.href;
if(this.hasMonsterkill && link){
if(this.isTimeout(rows[i])){
useRows.push(rows[i]);
continue;
}else{
useRows.push(rows[i]);
i = i + 2;
continue;
}
}else{ // replays only take up 1 row with MK
useRows.push(rows[i]);
continue;
}
}
}
this.totalRows = useRows.length;
this.currPlay = 0;
this.info1.innerHTML = 'Processing play ';
this.info2.innerHTML = this.currPlay;
this.info3.innerHTML = ' of ' + this.totalRows;
for(var i=0;i<useRows.length;i++){
if(useRows[i]){
var link = useRows[i].lastChild.previousSibling.firstChild.href;
if(!link){
this.filterFGPlays(useRows[i],names);
}else{
this.runFilter(link,useRows[i],names);
}
}
}
};
PlayerWatch.prototype.filterFGPlays = function(row,names){
var str = row.getElementsByTagName('TD')[3].innerHTML;
for(var i=0;i<names.length;i++){
if(str.indexOf(names[i]) != -1){
row.style.display = '';
return;
}
}
row.style.display = 'none';
this.currPlay++;
this.info2.innerHTML = this.currPlay;
if(this.currPlay >= this.totalRows){
this.finishUpFiltering();
}
};
// nextSibling can include line breaks in FF, this function will ignore them
PlayerWatch.prototype.nextSibling = function(node){
var endBrother = node.nextSibling;
while(endBrother.nodeType != 1){
if(!endBrother.nextSibling){
console.log('%o',node);
}
endBrother = endBrother.nextSibling;
}
return endBrother;
};
PlayerWatch.prototype.runFilter = function(link,row,names){
var that = this;
if(this.isTimeout(row)){
row.style.display = 'none';
this.currPlay++;
this.info2.innerHTML = this.currPlay;
if(this.currPlay >= this.totalRows){
this.finishUpFiltering();
}
return;
}
this.getAjaxRequest(link,function(theLink,xmlhttp){
if(that.processPlay(names,xmlhttp)){
row.style.display = '';
if(that.hasMonsterkill){
row = that.nextSibling(row);
row.style.display = '';
row = that.nextSibling(row);
row.style.display = '';
}
}else{
row.style.display = 'none';
if(that.hasMonsterkill){
row = that.nextSibling(row);
row.style.display = 'none';
row = that.nextSibling(row);
row.style.display = 'none';
}
}
that.currPlay++;
that.info2.innerHTML = that.currPlay;
if(that.currPlay >= that.totalRows){
that.finishUpFiltering();
}
});
};
PlayerWatch.prototype.finishUpFiltering = function(){
var that = this;
window.setTimeout(function(){
that.info1.innerHTML = '';
that.info2.innerHTML = '';
that.info3.innerHTML = '';
},250);
//this.runButton.setAttribute('disabled',false);
};
PlayerWatch.prototype.processPlay = function(names,result){
var span = document.createElement('SPAN');
span.innerHTML = result.responseText;
var replayNames = getElementsByClassName('player_name',span);
//console.log('replayNames length: ' + replayNames.length);
var pbpNames = [];
for (var k=0; k<replayNames.length; k++) {
pbpNames.push(replayNames[k].innerHTML);
}
if (document.getElementById("playerPlayWatch_Or").checked) {
for (var k=0; k<names.length; k++){
var idx = pbpNames.indexOf(names[k]);
if (idx != -1) return true;
}
return false;
}
if (document.getElementById("playerPlayWatch_Xor").checked) {
var result = 0;
for (var k=0; k<names.length; k++){
var idx = pbpNames.indexOf(names[k]);
if (idx != -1) result++;
if (result > 1) return false;
}
return (result == 1);
}
if (document.getElementById("playerPlayWatch_And").checked) {
var result = 0;
for (var k=0; k<names.length; k++){
var idx = pbpNames.indexOf(names[k]);
if (idx == -1) return false;
}
return true;
}
if (document.getElementById("playerPlayWatch_Not").checked) {
for (var k=0; k<names.length; k++){
var idx = pbpNames.indexOf(names[k]);
if (idx != -1) return false;
}
return true;
}
return false;
};
PlayerWatch.prototype.printTheTeams = function(){
// see which team has the most players
var count = this.team1.rows.length > this.team2.rows.length ? this.team1.rows.length : this.team2.rows.length;
for(var i=0;i<count;i++){
// create the row
var tr = document.createElement('TR');
if(i % 2 == 0){
tr.setAttribute('class','alternating_color1');
}else{
tr.setAttribute('class','alternating_color2');
}
this.mainTable.appendChild(tr);
if(this.team1.rows.length > i){// if this row exists for this team
if(this.team1.rows[i].getElementsByTagName('A').length > 0){// see if it was a player or header
var aID = this.team1.rows[i].getElementsByTagName('A').length > 2 ? 2 : 0;
var td = document.createElement('TD');
tr.appendChild(td);
var checkbox = document.createElement('input');
checkbox.setAttribute('type','checkbox');
checkbox.setAttribute('playerName',this.team1.rows[i].getElementsByTagName('A')[aID].innerHTML);
td.appendChild(checkbox);
td = document.createElement('TD');
tr.appendChild(td);
td.innerHTML = this.team1.rows[i].getElementsByTagName('A')[aID].innerHTML;
var tds = getElementsByClassName('player_position',this.team1.rows[i]);
td.innerHTML += ' (' + tds[0].firstChild.innerHTML.replace('<div></div>','') + ')';
}else{
var td = document.createElement('TD');
td.setAttribute('colSpan','2');
tr.appendChild(td);
if(this.team1.stat == 0){
td.innerHTML = 'Offense';
this.team1.stat++;
}else if(this.team1.stat == 1){
td.innerHTML = 'Defense';
this.team1.stat++;
}else if(this.team1.stat == 2){
td.innerHTML = 'Kicker';
this.team1.stat++;
}
}
}else{
var td = document.createElement('TD');
td.setAttribute('colSpan','2');
tr.appendChild(td);
}
if(this.team2.rows.length > i){
if(this.team2.rows[i].getElementsByTagName('A').length > 0){
var aID = this.team2.rows[i].getElementsByTagName('A').length > 2 ? 2 : 0;
var td = document.createElement('TD');
tr.appendChild(td);
var checkbox = document.createElement('input');
checkbox.setAttribute('type','checkbox');
checkbox.setAttribute('playerName',this.team2.rows[i].getElementsByTagName('A')[aID].innerHTML);
td.appendChild(checkbox);
td = document.createElement('TD');
tr.appendChild(td);
td.innerHTML = this.team2.rows[i].getElementsByTagName('A')[aID].innerHTML;
var tds = getElementsByClassName('player_position',this.team2.rows[i]);
td.innerHTML += ' (' + tds[0].firstChild.innerHTML.replace('<div></div>','') + ')';
}else{
var td = document.createElement('TD');
td.setAttribute('colSpan','2');
tr.appendChild(td);
if(this.team2.stat == 0){
td.innerHTML = 'Offense';
this.team2.stat++;
}else if(this.team2.stat == 1){
td.innerHTML = 'Defense';
this.team2.stat++;
}else if(this.team2.stat == 2){
td.innerHTML = 'Kicker';
this.team2.stat++;
}
}
}else{
var td = document.createElement('TD');
td.setAttribute('colSpan','2');
tr.appendChild(td);
}
}
};
PlayerWatch.prototype.closeLists = function(){
var that = this;
this.innerDiv.style.display = 'none';
this.button.setAttribute('value','Open Pannel');
this.button.addEventListener('click',function() { that.gatherLists.apply(that); },false);
};
PlayerWatch.prototype.mergeArrays = function(oldArray,newArray){
for(var i=0;i<newArray.length;i++){
oldArray.push(newArray[i]);
}
return oldArray;
};
PlayerWatch.prototype.getAjaxRequest = function(address,callback,loadingDiv){
var that = this;
if(loadingDiv){
loadingDiv.innerHTML = 'Loading...';
}
if(!CACHE[address]){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open( 'GET', address, true );
xmlhttp.onload = function() {
if (this.status != 200) {
alert("Error loading a page: Error "+this.status+" loading "+address);
}else {
console.log("loaded: "+address);
CACHE[address] = this;
if(callback){
callback.apply(that,[address,this]);
}
}
};
xmlhttp.send(null);
return xmlhttp;
}else{
console.log("loaded from cache: "+address);
if(callback){
callback.apply(that,[address,CACHE[address]]);
}
}
};
function getElementsByClassName(classname, par){
var a=[];
var re = new RegExp('\\b' + classname + '\\b');
var els = par.getElementsByTagName("*");
for(var i=0,j=els.length; i<j; i++){
if(re.test(els[i].className)){
a.push(els[i]);
}
}
return a;
};
window.setTimeout(function() { new PlayerWatch(); },0);