// ==UserScript==
// @name         FISO phpBB3 User Hide
// @include      *fiso.co.uk/forum/viewtopic.php*
// @include      *fiso.co.uk/forum/topic*.html
// @include      *fiso.co.uk/forum/post*.html#p*
// @description  Hides/unhides a user's posts
// @exclude
// ==/UserScript==

(function() {
	// Get stored hidden users from cookie
	var users = [];
	var cookieName = "phpUserHide";
	for (var i = 0; i < document.cookie.split('; ').length; i++) {
		var oneCookie = document.cookie.split('; ')[i].split('=');
		if (oneCookie[0] == cookieName) {
			users = oneCookie[1].split(', ');
			break;
		}
	}

	// Cursor functions
	var curPointer = function(event) {
		event.target.style.cursor = 'pointer';
		event.preventDefault();
	};
	var curDefault = function(event) {
		event.target.style.cursor = 'default';
		event.preventDefault();
	};

	// Add or remove a user from the cookie
	var addRemoveUser = function(event) {
		// Parse current cookie
		for(j = 0; j < document.cookie.split('; ').length; j++ ) {
			var oneCookie = document.cookie.split('; ')[j].split('=');
			if (oneCookie[0] == cookieName) {
				users = oneCookie[1].split(', ');
				break;
			}
		}
		var user = escape(event.target.nextSibling.innerHTML)
		notFound = true;
		for (var j = 0; j < users.length; j++) {
			if (users[j] == user) {
				users.splice(j, 1);
				notFound = false;
			}
		}
		if (notFound)
			users.push(user);
		if (users.length > 0) {
			var date = new Date();
			var days = 365;
			date.setTime(date.getTime() + (days*24*60*60*1000));
			var expires = '; expires=' + date.toGMTString();
			var value = users.join(', ');
			document.cookie = cookieName + '=' + value + expires + '; path=/';
		} else {
			document.cookie = cookieName + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
		}
		event.target.lastChild.nodeValue = (notFound ? '<X> ' : '<O> ');
		event.target.style.color = (notFound ? '#FF0000' : '#00C000');
		if (notFound) {
			event.target.setAttribute('title', "click to remove this forum from your hide list");
		} else {
			event.target.setAttribute('title', "click to add this forum to your hide list");
		}
		window.alert(unescape(user) + ' has been ' + (notFound ? 'added to' : 'removed from')
			+ ' your hide list\n'
			+ 'You must refresh the page to view the changes.');
		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);

		var containingRow = event.target.parentNode.parentNode.parentNode.previousSibling;
		while (containingRow.nodeType != 1)
			containingRow = containingRow.previousSibling;
		containingRow.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 = '';
		else
			displayState = 'none';
		event.target.setAttribute('displaystate', displayState);

		// Jump to parent row
		var containingRow = event.target.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("//b[@class='postauthor']", document, null,
		XPathResult.ANY_TYPE, null);
	var resultNodes = [];
	var aResult;
	while (aResult = results.iterateNext())
		resultNodes.push(aResult);

	// Loop through every user post on the page
	for (var i in resultNodes) {
		var containingRow = resultNodes[i].parentNode.parentNode.nextSibling;
		while (containingRow.nodeType != 1)
			containingRow = containingRow.nextSibling;
		var toggleRow = containingRow.nextSibling;
		while (toggleRow.nodeType != 1)
			toggleRow = toggleRow.nextSibling;
		// Format whitespace
		var user = escape(resultNodes[i].innerHTML);
		
		if (user == 'admin') continue;

		// Flag whether the user is in our hide list
		var notFound = true;
		for (var j = 0; j < users.length; j++) {
			if (users[j] == user) {
				notFound = false;
			}
		}

		// Add relevant event handlers to user's name and a toggler node
		var toggler = document.createElement('span');
		if (notFound) {
			toggler.setAttribute('title', "click to add this user to your hide list");
			toggler.appendChild(document.createTextNode('<O> '));
			toggler.style.color = "#00C000";
		}
		if (!notFound) {
			toggler.setAttribute('title', "click to remove this user from your hide list");
			toggler.appendChild(document.createTextNode('<X> '));
			toggler.style.color = "#FF0000";
		}
		toggler.style.fontSize = "7pt";
		toggler.style.fontWeight = "bold";
		toggler.addEventListener('mouseover', curPointer, true);
		toggler.addEventListener('mouseout', curDefault, true);
		toggler.addEventListener('click', addRemoveUser, true);

		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 = toggleRow.firstChild;
		while (elem.nodeType != 1)
			elem = elem.nextSibling;
		elem.setAttribute('nowrap', 'nowrap');

		// Create a span to control toggling
		var span = document.createElement('span');
		span.appendChild(document.createTextNode('Toggle Display'));
		span.style.fontSize = '7.5pt';
		span.style.color = '#4b5d8e';
		span.style.margin = '0 20px';
		span.style.padding = '2px 3px';
		span.style.border = '1px solid #4b5d8e';
		span.style.backgroundColor = '#ffffff';
		span.setAttribute('displaystate', 'none');
		span.addEventListener('mouseover', curPointer, true);
		span.addEventListener('mouseout', curDefault, true);
		span.addEventListener('click', togglePost, true);

		// Insert the span after the username and before the <br>
//		elem.insertBefore(span, elem.firstChild.firstChild.nextSibling);
		elem.firstChild.appendChild(span);
		containingRow.style.display = 'none';
	}

	// Find all the usernames quoted in the page
	var results = document.evaluate("//div[@class='quotetitle']", 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].nextSibling;
		while (containingRow.nodeType != 1)
			containingRow = containingRow.nextSibling;

		// Find username
		var usermatch = resultNodes[i].innerHTML.match(/(.*) wrote:$/);
		if (usermatch)
			var user = escape(usermatch[1]);
		else
			continue;

		// Flag whether the user is in our hide list
		var notFound = true;
		for (var j = 0; j < users.length; j++) {
			if (users[j] == user) {
				notFound = false;
			}
		}

		// 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.createTextNode('Toggle Display'));
		span.style.fontSize = "7.5pt";
		span.style.color = '#4b5d8e';
		span.style.margin = '0 20px';
		span.style.padding = '2px 3px';
		span.style.border = '1px solid #4b5d8e';
		span.style.backgroundColor = '#ffffff';
		span.setAttribute('displaystate', 'none');
		span.addEventListener('mouseover', curPointer, true);
		span.addEventListener('mouseout', curDefault, true);
		span.addEventListener('click', toggleQuote, true);

		resultNodes[i].appendChild(span);
		
		// Hide the quote
		containingRow.style.display = 'none';
	}

})();