// Copyright 2007 Istvan Karaszi <iwiw@spam.raszi.hu>.
// All rights Reserved.
// ==UserScript==
// @name iWiW messageboard userblock
// @namespace http://persistent.info/greasemonkey
// @description Do you have a too talkative friend? You can block his/her messages from message board.
// @include http://*wiw.hu/*
// @include https://*wiw.hu/*
// ==/UserScript==
const COOKIENAME = "iwiw-blocked-users";
const SPLITCHAR = ":";
const CSSRULES = [
"div.blocked { min-height: 0 !important; } ",
"div.blocked p { display: none; } ",
"div.blocked a.user_image { display: none; } ",
"div.blocked a { color: #a8b8de !important; }"
];
var users = _getBlockedUsers();
_appendCSSRules();
_addBlockButtons();
_formatMessageBoard();
function _appendCSSRules() {
for (var i = 0; i < CSSRULES.length; i++) {
GM_addStyle(CSSRULES[i])
}
}
function _getItems() {
var items = _XPath("//xhtml:div[contains(@class, 'messageboard')]//xhtml:div[contains(@class, 'item')]");
return items;
}
function _addBlockButtons() {
var items = _getItems();
for(var i = 0; i < items.snapshotLength; i++) {
var item = items.snapshotItem(i);
var uid = _getUserID(item);
if (!uid) continue;
_addBlockButton(uid, item);
}
}
function _formatMessageBoard() {
var items = _getItems();
for(var i = 0; i < items.snapshotLength; i++) {
var item = items.snapshotItem(i);
var uid = _getUserID(item);
if (!uid) continue;
_formatItem(uid, item);
}
}
function _isUserBlocked( uid ) {
for(var i = 0; i < users.length; i++) {
if (users[i] == uid) return i;
}
return null;
}
function _getBlockedUsers() {
var users = new String(GM_getValue(COOKIENAME, ""));
return users.split(SPLITCHAR);
}
function _setBlockedUsers() {
GM_setValue(COOKIENAME, users.join(SPLITCHAR));
}
function _addBlockedUser( uid ) {
if (_isUserBlocked(uid) == null) {
users.push(uid);
_setBlockedUsers(users);
}
}
function _removeBlockedUser( uid ) {
var pos = _isUserBlocked(uid);
if (pos != null) {
users.splice(pos, 1);
_setBlockedUsers(users);
}
}
function _formatItem( uid, item ) {
if (_isUserBlocked(uid) != null) {
// user is blocked
_addClass(item, "blocked");
} else {
_removeClass(item, "blocked");
}
}
function _addBlockButton( uid, item ) {
var h5s = _XPath(".//xhtml:h5[1]", item);
if (h5s.snapshotLength == 0) return;
var h5 = h5s.snapshotItem(0);
h5.appendChild(unsafeWindow.document.createTextNode(" "));
var blockButton = unsafeWindow.document.createElement("a");
blockButton.href = "#";
blockButton.className = "block";
blockButton.appendChild(unsafeWindow.document.createTextNode("[block/unblock]"));
blockButton.onclick = function() {
return _handleClick(uid, item);
}
h5.appendChild(blockButton);
}
function _handleClick( uid, item ) {
if (_isUserBlocked(uid) == null) {
_addBlockedUser(uid);
} else {
_removeBlockedUser(uid);
}
_formatMessageBoard();
return false;
}
function _addClass( item, newclass ) {
var currentClass = new String(item.className);
item.className = currentClass.concat(" blocked");
}
function _removeClass( item, oldclass ) {
var currentClass = new String(item.className);
var classes = currentClass.split(" ");
var newclasses = new Array();
for(var i = 0; i < classes.length; i++) {
if (classes[i] == oldclass) continue;
newclasses.push(classes[i]);
}
item.className = newclasses.join(" ");
}
function _getUserID( item ) {
var results = _XPath(".//xhtml:h5/xhtml:a[contains(@href, 'userID')]", item);
if (!results.snapshotLength) return null;
var anchor = results.snapshotItem(0);
var url = new String(anchor.href);
var regex = /userID=(\d+)/;
var matches = url.match(regex);
if (!matches) return null;
if (matches.length == 0) return null;
return matches[1];
}
function _XPath( query, context ) {
if (!context) context = document;
return document.evaluate(query, context, nsResolver, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}
function nsResolver( prefix ) {
var ns = {
'xhtml' : 'http://www.w3.org/1999/xhtml'
};
return ns[prefix] || null;
}