// phpBB User Stuff
// version 0.1
// 2006-02-26
// Copyright (c) 2006, xamm
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script. To install it, you need
// Greasemonkey 0.3 or later: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "phpBB User Stuff", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ChangeLog
// 2006-02-26 - 0.2 - Fixed issue if you cancelled changing a users name
// 2006-02-26 - 0.1 - Initial release
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name phpBB User Stuff
// @description Allows you to hides users' posts, edit users' names and store a small amount of information about each user.
// @namespace http://www.otsegolectric.com/greasemonkey/
// @include */viewtopic.php*
// ==/UserScript==
// Get stored hidden users from cookie
var hiddenUsers = [];
var userNotes = [];
var usersNew = [];
var usersOld = [];
var cookieNameNew = "phpBBUserNew";
var cookieNameOld = "phpBBUserOld";
var hideCookieName = "phpBBUserHide";
var userName;
var userNote;
var hiddenUser;
for (var i = 0; i < document.cookie.split('; ').length; i++) {
var oneCookie = document.cookie.split('; ')[i].split('=');
if (oneCookie[0] == hideCookieName) {
hiddenUsers = oneCookie[1].split(', ');
break;
}
}
for (var i = 0; i < document.cookie.split('; ').length; i++) {
var oneCookie = document.cookie.split('; ')[i].split('=');
if(oneCookie[0] == cookieNameNew)
usersNew = oneCookie[1].split(', ');
else if(oneCookie[0] == cookieNameOld)
usersOld = oneCookie[1].split(', ');
}
/*for(var i = 0; i < usersOld.length; i++){
while(document.body.innerHTML.indexOf(usersOld[i]) != -1)
document.body.innerHTML = document.body.innerHTML.replace(usersOld[i], usersNew[i]);
}*/
var editNotes = function(event) {
var userNote = event.target.previousSibling.innerHTML.replace(/ /g, '');
GM_setValue(userNote, prompt( "Edit user note for [" + userNote + "]:", userNotes[userNote] ) );
window.location.reload(false);
};
// Add or remove a user from the cookie
var addRemoveUserRename = function(event) {
// Parse current cookie
for (var i = 0; i < document.cookie.split('; ').length; i++) {
var oneCookie = document.cookie.split('; ')[i].split('=');
if(oneCookie[0] == cookieNameNew)
usersNew = oneCookie[1].split(', ');
else if(oneCookie[0] == cookieNameOld)
usersOld = oneCookie[1].split(', ');
}
userName = escape(event.target.innerHTML);
notFound = true;
for (var j = 0; j < usersNew.length; j++) {
if (usersNew[j] == userName) {
usersOld.splice(j, 1);
usersNew.splice(j, 1);
notFound = false;
}
}
if (notFound){
var userNew = escape(prompt('Enter the new name for ' + unescape(userName), unescape(userName)));
if(userNew != "null"){
usersNew.push(userNew);
usersOld.push(userName);
}
}
if (usersOld.length > 0) {
var date = new Date();
date.setTime(date.getTime() + 31536000000);
var expires = '; expires=' + date.toGMTString();
var valueOld = usersOld.join(', ');
var valueNew = usersNew.join(', ');
document.cookie = cookieNameOld + '=' + valueOld + expires + '; path=/';
document.cookie = cookieNameNew + '=' + valueNew + expires + '; path=/';
} else {
document.cookie = cookieNameOld + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
document.cookie = cookieNameNew + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
}
window.location.reload(false);
event.preventDefault();
};
// Add or remove a user from the cookie
var addRemoveUserHide = function(event) {
// Parse current cookie
for(j = 0; j < document.cookie.split('; ').length; j++ ) {
var oneCookie = document.cookie.split('; ')[j].split('=');
if (oneCookie[0] == hideCookieName) {
hiddenUsers = oneCookie[1].split(', ');
break;
}
}
var hiddenUser = escape(event.target.nextSibling.innerHTML)
notFound = true;
for (var j = 0; j < hiddenUsers.length; j++) {
if (hiddenUsers[j] == hiddenUser) {
hiddenUsers.splice(j, 1);
notFound = false;
}
}
if (notFound)
hiddenUsers.push(hiddenUser);
if (hiddenUsers.length > 0) {
var date = new Date();
date.setTime(date.getTime() + 31536000000);
var expires = '; expires=' + date.toGMTString();
var value = hiddenUsers.join(', ');
document.cookie = hideCookieName + '=' + value + expires + '; path=/';
} else {
document.cookie = hideCookieName + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
}
window.location.reload(false);
event.preventDefault();
};
// Toggle display of user's post
var togglePost = function(event) {
var displayState = event.target.getAttribute('displaystate');
if (displayState == 'none')
displayState = '';
else
displayState = 'none';
event.target.setAttribute('displaystate', displayState);
containingRow = event.target.parentNode.parentNode;
var innerTags = containingRow.getElementsByTagName('*');
for (var i = 0; i < innerTags.length; i++) {
var tagClass = innerTags[i].getAttribute('class');
if (tagClass == 'postbody' || tagClass == 'postsig'
|| tagClass == 'postdetails' || innerTags[i].tagName == 'TABLE')
innerTags[i].style.display = displayState;
}
event.preventDefault();
};
// Toggle display of user's quote
var toggleQuote = function(event) {
var displayState = event.target.getAttribute('displaystate');
if (displayState == 'none')
displayState = 'table-row';
else
displayState = 'none';
event.target.setAttribute('displaystate', displayState);
// Jump to parent row
var containingRow = event.target.parentNode.parentNode.parentNode.parentNode.nextSibling;
// Find containing row
while (containingRow.nodeType != 1)
containingRow = containingRow.nextSibling;
containingRow.style.display = displayState;
event.preventDefault();
};
// Find all the usernames in the page
var results = document.evaluate("//span[@class='name']/b|//span[@class='name']/strong", document, null,
XPathResult.ANY_TYPE, null);
var resultNodes = [];
var aResult;
while (aResult = results.iterateNext()) {
resultNodes.push(aResult);
resultUser = aResult.innerHTML.replace(/ /g, '');
userNotes[resultUser] = ( GM_getValue( resultUser, '' ) ); // JW
}
// Loop through every user post on the page
for (var i in resultNodes) {
var containingRow = resultNodes[i].parentNode.parentNode.parentNode;
// Format whitespace
hiddenUser = escape(resultNodes[i].innerHTML);
userNote = resultNodes[i].innerHTML.replace(/ /g, '');
// Flag whether the user is in our hide list
var notFound = true;
for (var j = 0; j < hiddenUsers.length; j++) {
if (hiddenUsers[j] == hiddenUser) {
notFound = false;
}
}
var renameFound = false;
var newName;
for (var j = 0; j < usersOld.length; j++) {
if (usersOld[j] == hiddenUser) {
renameFound = true;
newName = unescape(usersNew[j]);
}
}
// Add relevant event handlers to user's name and a toggler node
var toggler = document.createElement('span');
toggler.setAttribute('title', "click to add or remove this user from your hide list");
toggler.appendChild(document.createTextNode('[X] '));
toggler.style.fontSize = "7pt";
toggler.style.cursor = 'pointer';
toggler.addEventListener('click', addRemoveUserHide, true);
var noteEdit = document.createElement('span');
noteEdit.title = userNotes[userNote];
noteEdit.appendChild(document.createTextNode(' [?]'));
noteEdit.style.fontSize = "7pt";
noteEdit.style.cursor = 'pointer';
noteEdit.addEventListener('click', editNotes, true);
resultNodes[i].title = 'click to rename this user';
resultNodes[i].style.cursor = 'pointer';
if(renameFound)
resultNodes[i].innerHTML = newName
resultNodes[i].addEventListener('click', addRemoveUserRename, true);
resultNodes[i].parentNode.insertBefore(noteEdit, resultNodes[i].nextSibling);
resultNodes[i].parentNode.insertBefore(toggler, resultNodes[i]);
// If this user isn't in our hide list, skip to the next user
if (notFound)
continue;
// Find the first element node (td) in the containing row
var elem = containingRow.firstChild;
while (elem.nodeType != 1)
elem = elem.nextSibling;
// Create a span to control toggling
var span = document.createElement('span');
span.appendChild(document.createTextNode('Toggle Display'));
span.appendChild(document.createElement('br'));
span.className = 'name';
span.setAttribute('displaystate', 'none');
span.style.cursor = 'pointer';
span.addEventListener('click', togglePost, true);
// Insert the span after the username and before the
elem.insertBefore(span, elem.firstChild.nextSibling.nextSibling);
// Insert a
after the username and before the span
elem.insertBefore(document.createElement('br'), elem.firstChild.nextSibling.nextSibling);
var innerTags = containingRow.getElementsByTagName('*');
for (var i = 0; i < innerTags.length; i++) {
var tagClass = innerTags[i].getAttribute('class');
if (tagClass == 'postbody' || tagClass == 'postsig'
|| tagClass == 'postdetails' || innerTags[i].tagName == 'TABLE')
innerTags[i].style.display = 'none';
}
}
// Find all the usernames quoted in the page
var results = document.evaluate("//td[@class='quote']/parent::*/preceding-sibling::*/td/span/b|//td[@class='quote']/parent::*/preceding-sibling::*/td/span/strong", document, null, XPathResult.ANY_TYPE, null);
var resultNodes = [];
var aResult;
while (aResult = results.iterateNext())
resultNodes.push(aResult);
// Loop through every user quote on the page
for (var i in resultNodes) {
var containingRow = resultNodes[i].parentNode.parentNode.parentNode.nextSibling;
while (containingRow.nodeType != 1)
containingRow = containingRow.nextSibling;
// Find username
var usermatch = resultNodes[i].innerHTML.match(/(.*) wrote:$/);
if (usermatch)
var hiddenUser = escape(usermatch[1]);
else
continue;
// Flag whether the user is in our hide list
var notFound = true;
for (var j = 0; j < hiddenUsers.length; j++) {
if (hiddenUsers[j] == hiddenUser) {
notFound = false;
}
}
for (var j = 0; j < usersOld.length; j++) {
if (usersOld[j] == hiddenUser) {
resultNodes[i].innerHTML = unescape(usersNew[j]) + " wrote:";
}
}
// If this user isn't in our hide list, skip to the next user
if (notFound)
continue;
// Create a span to control toggling
var span = document.createElement('span');
span.appendChild(document.createElement('br'));
span.appendChild(document.createTextNode('Toggle Display'));
span.className = 'gensmallbold';
span.setAttribute('displaystate', 'none');
span.style.cursor = 'pointer';
span.setAttribute('onClick', 'toggleQuote(this)');
resultNodes[i].appendChild(span);
// Hide the quote
containingRow.style.display = 'none';
}
var theScript = '';
theScript += 'function toggleQuote(event){';
theScript += ' var displayState = event.getAttribute(\'displaystate\');';
theScript += ' if (displayState == \'none\')';
theScript += ' displayState = \'table-row\';';
theScript += ' else';
theScript += ' displayState = \'none\';';
theScript += ' event.setAttribute(\'displaystate\', displayState);';
theScript += ' var containingRow = event.parentNode.parentNode.parentNode.parentNode.nextSibling;';
theScript += ' while (containingRow.nodeType != 1)';
theScript += ' containingRow = containingRow.nextSibling;';
theScript += ' containingRow.style.display = displayState;';
theScript += '}';
var theScriptObj=document.createElement('script');
theScriptObj.setAttribute('language','javascript');
theScriptObj.setAttribute('type','text/javascript');
theScriptObj.innerHTML = theScript;
document.getElementsByTagName('head')[0].appendChild(theScriptObj, document.getElementsByTagName('head')[0]);