Player Play Watch Or/And/Xor/Not

Only show the plays the selected players were in on a GLB play-by-play page.

目前為 2014-05-21 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);