// ==UserScript==
// @name           Guardian commenter blocker
// @namespace      http://www.dracos.co.uk/
// @description    Block people who annoy you on guardian.co.uk
// @include        http://*.guardian.co.uk/*
// @exclude        http://*.guardian.co.uk/ver1.0*
// ==/UserScript==

var Users;

function add_jquery() {
	var GM_JQ = document.createElement('script');
	GM_JQ.src = 'http://jquery.com/src/jquery-latest.js';
	GM_JQ.type = 'text/javascript';
	document.getElementsByTagName('head')[0].appendChild(GM_JQ);
	GM_wait();
}

function GM_wait() {
    if(typeof unsafeWindow.jQuery == 'undefined') {
        window.setTimeout(GM_wait, 100);
    } else {
        $ = unsafeWindow.jQuery;
    }
}

function get_name(l) {
	l = l.getElementsByClassName('author-profile-picture');
	l = l[0];
	l = l.nextSibling.nextSibling;
	name = l.innerHTML;
	name = name.replace(/^\s+/, '').replace(/\s+$/, '');
	return name;
}

function unblock_user(e) {
	e.stopPropagation();
	e.preventDefault();
	var link = e.currentTarget;
	var name = link.innerHTML;
	for(var i=0; i<Users.length; i++){
		if(name==Users[i]) Users.splice(i, 1);
	}
	var str = Users.join('|');
	GM_setValue('Gblocked', str);
	var ul = document.getElementById('MSblockList');
	$(ul).hide('slow');
	alert(name + ' has been unblocked');
}

function block_user(e) {
	e.stopPropagation();
	e.preventDefault();
	var link = e.currentTarget;
	link = link.parentNode.parentNode.parentNode;
	name = get_name(link);
	Users.push(name);
	var str = Users.join('|');
	GM_setValue('Gblocked', str);
	checkComments(1);
}

function add_block_links() {
	var p = document.getElementsByClassName('pluck-comment-tools');
	if (!p.length) {
		window.setTimeout(add_block_links, 1000);
		return;
	}
	for (var i=0; i<p.length; i++) {
		var tools = p[i].getElementsByTagName('ul')[0];
		var a = document.createElement('a');
		a.href = '#';
		a.addEventListener('click', block_user, true);
		a.innerHTML = 'Block';
		var b = document.createTextNode('| ');
		tools.appendChild(b);
		tools.appendChild(a);
	}
}

function checkComments(slide) {
	var allDivs = document.getElementsByClassName('pluck-content');
	if (!allDivs.length) {
		window.setTimeout(checkComments, 1000);
		return;
	}
	for (var i = 0; i < allDivs.length; i++) {
		var thisDiv = allDivs[i];
		name = get_name(thisDiv);
		for (var j=0; j<Users.length; j++) {
			if (name == Users[j]) {
				if (slide) {
					$(thisDiv).hide('slow');
				} else {
					thisDiv.parentNode.removeChild(thisDiv);
				}
			}
		}
	}
}

function add_footer_link() {
	var footer = document.getElementById('copyright-links').getElementsByTagName('li')[0];
	var b = document.createTextNode(' | ');
	var a = document.createElement('a');
	a.href = '#';
	a.innerHTML = 'Block list'
	a.addEventListener('click', open_list, true);
	footer.appendChild(b);
	footer.appendChild(a);

	ul = document.createElement('ul');	
	ul.id = 'MSblockList';
	ul.style.display = 'none';
	ul.style.position = 'absolute';
	ul.style.bottom = '5px';
	ul.style.left = '280px';
	ul.style.border = 'solid 2px black';
	ul.style.backgroundColor = 'white';
	ul.style.color = 'black';
	ul.style.fontSize = '16px';
	ul.style.padding = '5px';
	footer.appendChild(ul);
}

function open_list(e) {
	e.preventDefault();
	var ul = document.getElementById('MSblockList');

	if (ul.style.display == 'block') {
		$(ul).hide('slow');
		return;
	}

	if (!Users.length) {
		alert('You have not blocked anyone');
		return;
	}

	ul.innerHTML = '';
	var h2 = document.createElement('h2');
	h2.style.fontWeight = 'bold';
	h2.style.marginBottom = '0.5em';
	h2.innerHTML = 'Block List';
	ul.appendChild(h2);
	for (var i=0; i<Users.length; i++) {
		var li = document.createElement('li');
		li.style.paddingBottom = '0.5em';
		var a = document.createElement('a');
		a.href = '#';
		a.innerHTML = Users[i];
		a.addEventListener('click', unblock_user, true);
		li.appendChild(a);
		ul.appendChild(li);
	}
	var li = document.createElement('li');
	li.style.textAlign = 'right';
	var a = document.createElement('a');
	a.href = '#'; a.innerHTML = 'Close';
	a.addEventListener('click', open_list, true);
	li.appendChild(a);
	ul.appendChild(li);
	$(ul).show('slow');
}

if (document.getElementById('pluck-container')) {
	Users = GM_getValue('Gblocked', '');
	if (Users) {
		Users = Users.split('|');
	} else {
		Users = [];
	}
	add_jquery();
	window.setTimeout(add_block_links, 2000);
	window.setTimeout(checkComments, 2000, 0);
	add_footer_link();
}

