// ==UserScript==
// @name         FISO Forum Hide Select
// @include      *fiso.co.uk/forum/viewforum.php*
// @include      *fiso.co.uk/forum/*-f*.html
// @include      *fiso.co.uk/forum/index.php*
// @include      *fiso.co.uk/forum/
// @include      *fiso.co.uk/forum/?sid*
// @description  Selects forums to hide from search results
// @exclude
// ==/UserScript==

(function() {
	// Get stored hidden forums from cookie
	var forums = [];
	var cookieName = "phpForumHide";
	for (var i = 0; i < document.cookie.split('; ').length; i++) {
		var oneCookie = document.cookie.split('; ')[i].split('=');
		if (oneCookie[0] == cookieName) {
			forums = 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 forum from the cookie
	var addRemoveForum = 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) {
				forums = oneCookie[1].split(', ');
				break;
			}
		}
		var fhref = event.target.nextSibling.getAttribute('href');
		var fhtml = fhref.indexOf('.html');
		var fequal = fhref.lastIndexOf('f',fhtml)+1;
		var forum = fhref.substring(fequal,fhtml);
		var fname = escape(event.target.nextSibling.innerHTML)
		notFound = true;
		for (var j = 0; j < forums.length; j++) {
			if (forums[j] == forum) {
				forums.splice(j, 1);
				notFound = false;
			}
		}
		if (notFound)
			forums.push(forum);
		if (forums.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 = forums.join(', ');
			document.cookie = cookieName + '=' + value + expires + '; path=/';
		} else {
			document.cookie = cookieName + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
		}
//		window.alert(unescape(fname) + ' has been ' + (notFound ? 'added to' : 'removed from')
//			+ ' your hide list.');
		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");
		}
		event.preventDefault();
	};
	// Find all the forums in the page
	var results = document.evaluate("//a[@class='forumlink']", document, null, XPathResult.ANY_TYPE, null);
	var resultNodes = [];
	var aResult;
	while (aResult = results.iterateNext())
		resultNodes.push(aResult);

	// Loop through every forum link on the page
	for (var i in resultNodes) {
		// Format whitespace
		var fhref = resultNodes[i].getAttribute('href');
		var fhtml = fhref.indexOf('.html');
		var fequal = fhref.lastIndexOf('f',fhtml)+1;
		var forum = fhref.substring(fequal,fhtml);
		
		if (forum == 33 || forum == 38) continue;

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

		// Add relevant event handlers to forum's name and a toggler node
		var toggler = document.createElement('span');
		if (notFound) {
			toggler.setAttribute('title', "click to add this forum to your hide list");
			toggler.appendChild(document.createTextNode('<O> '));
			toggler.style.color = "#00C000";
		}
		if (!notFound) {
			toggler.setAttribute('title', "click to remove this forum 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', addRemoveForum, true);

		resultNodes[i].parentNode.insertBefore(toggler, resultNodes[i]);

	}

})();