// ==UserScript==
// @name Shacknews Soul Sucker Comment Filter
// @namespace http://www.lmnopc.com/greasemonkey/shackSoulSuckerFilter/
// @description Filter out Shacknews comments that will rape your soul
// @include http://*.shacknews.com/ja.zz?*
// @include http://shacknews.com/ja.zz?*
// ==/UserScript==
/*

	Shacknews Soul Sucker Comment Filter
	Author: ThomW -- http://www.lmnopc.com/

	If you like this script 
	------------------------
	Buy me shiny things: http://amazon.com/gp/registry/1YRBQ22VGN9PR
	or buy yourself shiny things using alerts from http://www.wishlistbuddy.com 

	Version info:
	---------------------------------------------------------------------------
	2006-06-27
		I made some changes (mostly on the server) to make it so that when a 
		user collapses a script it stays collapsed instead of reappearing on
		refresh.  
	
	2006.06.01: 
		Initial release

	Credits:
	---------------------------------------------------------------------------
	ThomW - http://www.shacknews.com/ja.zz?person=thomw
	

	Other contributors:
	---------------------------------------------------------------------------

*/

(function() {

	// don't run the script from the dthread iframe	
	if (window.name == 'bufferFrame')
		return;
	
	// grab start time of filtering
	var scriptStartTime = getTime();


	function getTime() 
	{
		benchmarkTimer = new Date();
		return benchmarkTimer.getTime();
	}


	function stripHtml(str)
	{
		var regExp=/<\S[^>]*>/g;
		return String(str).replace(regExp, ' ');
	}


	function findUsername()
	{
		var dbg = false;
		
		var div = document.getElementById('welcome');
		if (!div) {
			if (dbg) alert("Couldn't find div#welcome");
			return;
		}
		
		// make sure user is logged in
		if (!div.innerHTML.substr(0, 3) == "Hi ") {
			if (dbg) alert("Couldn't find 'Hi '");
				return;
		}
			
		// strip out the user link
		var anchors = div.getElementsByTagName('a');
		if (!anchors) {
			if (dbg) alert("Couldn't find anchors");
			return;
		}
			
		// get the first anchor's innerHTML and strip it,
		// which should leave us with just the user name
		str = anchors[0].innerHTML;
		str = stripHtml(str);
		
		// return the username
		return str;
	}

	
	function reportThread(event)
	{
		// find the user 
		var userName = findUsername();
		if (!userName) 
		{
			alert('You have to be logged in to Shacknews to report a soul-sucking post');
			return;
		}
		
		// var thread = String(event.target.getAttribute('id')).substr(2);
		var thread = event.target.getAttribute('id');
		thread = String(thread).substr(3);

		// 
		var addr = 'http://www.lmnopc.com/greasemonkey/shackSoulSuckerFilter/report.php?who=' + userName + '&what=' + thread;
		
		// use xmlhttpRequest to post the data 
	  	GM_xmlhttpRequest({ method:"GET", 
	  			url: addr,
			    onload:function(result)  {
			     	try {
			     		if (result.responseText != 'ok') {
			     			if (String(result.responseText).length) {
			     				alert(result.responseText);
			     			} else { 
			     				alert("Soul Sucker Filter didn't get the OK.  Your report may have failed.  Sorry.  :(");
			     			}
			     		} else {
			     			collapsePost(thread);
			     		}
			      } 
			      catch (e) { 
			      	alert('Report failed'); 
			      }
			    }
	  		});
	}


	function unFilter(event) 
	{
		var elem = event.target;
		if (!elem) {
			return;
		}
		
		// hide the filteron span
		elem.style.display = "none";
		
		// get threadid
		var id = elem.getAttribute('id');
		if (!id.length) {
			return;
		}
		id = id.substr(8);
		
		// find filteron's next sibling
		elem = elem.nextSibling;
		if (!elem) {
			return;
		}
			
		// display filteroff
		elem.style.display = '';
		
		// display the prevblock
		elem = document.getElementById('prevblock' + id);
		if (!elem) {
			return;
		}
		elem.style.display = '';							
	}

	function collapsePost(threadid)
	{
		var thread = document.getElementById('threadblock' + threadid);
		if (!thread) { return(false); }
		
		var divs = thread.getElementsByTagName('div');
		for (var i = 0; i < divs.length; i++) 
		{
			if (divs[i].getAttribute('class') == 'postbody')
			{
				//modify the post to include a filtered message and an ID so we can display it later
				divs[i].innerHTML = '<span id="filteron' + threadid + '" class="pseudolink">HAPPY HAPPY JOY JOY!</span><span style="display:none">' + divs[i].innerHTML + '</span>'
				
				// programmatically add filteron's unfilter function
				var filteron = document.getElementById('filteron' + threadid);
				filteron.addEventListener('click', unFilter, true);
				
				//hide preview block until we're ready to turn it back on
				document.getElementById('prevblock' + threadid).style.display = 'none';
				
				break;
			}
		}
		
	}
	
	// put in mr. frowny
	if (!document.all) 
	{
		var items = document.evaluate("//*[@class='thread']/..", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

		// make sure we're on a page that has comments before retrieving the list		
		if (items) {
			
			// get username
			var userName = findUsername();
			if (userName)
				userName = '?u=' + escape(userName);
			else
				userName = '';
			
			var addr = 'http://www.lmnopc.com/greasemonkey/shackSoulSuckerFilter/list.php' + userName;
			GM_xmlhttpRequest({ method:"GET",
				url: addr,
				onload:function(result) {
					try {
						if (result.responseText != '') {
							var list = String(result.responseText);
							list = list.split(',');
							for (var i = 0; i < list.length; i++) {
								collapsePost(list[i]);
							}
						}
					} catch (e) { 
						alert('Could not connect to Thom\'s server to grab the latest soul sucking threads :(');
					}
				}
			});
		}
		
		for (item = null, i = 0; item = items.snapshotItem(i); i++) 
		{

			// find id 
			var threadId = item.getAttribute('id');
			if (!threadId) return; 
			threadId = String(threadId).substr(11);
			
			// create soul sucker reporter
			var smImg = document.createElement('img');
			smImg.setAttribute('id', 'sk_' + threadId);
			smImg.setAttribute('title', 'Soul Sucker!');
			smImg.setAttribute('alt', 'Soul Sucker!');
			smImg.setAttribute('height', '14');
			smImg.setAttribute('width', '14');
			smImg.setAttribute('border', '0');
			smImg.style.paddingTop = '2px';
			smImg.style.paddingLeft = '2px';
			smImg.style.paddingRight = '2px';
			
			//http://software.hixie.ch/utilities/cgi/data/data : Used to convert GIF to base64 data
			smImg.setAttribute('src', 'data:image/gif;base64,R0lGODlhDQANAPcAAAAAAAEAAAMDAAUFABAAABUVABcXACkpACoqACsrAH8AAFxcCWJiCG1tB3FxCY0jAINVBsoNANUAANcAAN42CeoHB%2BwAAP8AAP9gAP8RnZiYBZmZBpmZB5qaBZycB6urAKqqBqurB7KyAMC%2BB9%2FfD%2F%2FLAPf3Avr6AP7%2BAP%2F%2FAP%2F%2FA%2F%2F%2FBv%2F%2FB%2F%2F%2FCP7%2B%2FgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABkALAAAAAANAA0AAAiAADMIzMCCRYoVLQYO1IAihUMAAEhsGNghBUSLLlwASMFBIEaNIDemyAACI8SMGh2GMHjiIkSRB1c4nEnToYoWKT4UeAnRgIgULDykEACAQACeA1J4yGARgAQLExS8HJlhQYoDES5ceJAAQQoGAx2YwKC1hMMGCgVCqEBhBFWBAQEAOw%3D%3D');
			
			smImg.style.cursor = 'pointer';
			smImg.addEventListener('click', reportThread, true);
			
			/* This is my top secret de-mod button */
			var smMod = document.createElement('img');
			smMod.setAttribute('id', 'sk_' + threadId);
			smMod.setAttribute('title', 'De-Moderate');
			smMod.setAttribute('alt', 'De-Moderate!');
			smMod.setAttribute('height', '7');
			smMod.setAttribute('width', '28');
			smMod.setAttribute('border', '0');
			smMod.style.paddingTop = '2px';
			smMod.style.paddingLeft = '2px';
			smMod.style.paddingRight = '2px';
			smMod.setAttribute('src', 'data:image/gif;base64,R0lGODlhHAAHALMAAADGAHMA7%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FyH5BAEAAAEALAAAAAAcAAcAAAQpMEggq7240pl7p0A4bWG5BaWWoixLcic4wunraq1443m7g7ogJ6dDhSIAOw%3D%3D');
			smMod.style.cursor = 'pointer';
			smMod.addEventListener('click', deModerate, true);
			
			// find the post's author and append this object to that object
			var spans = item.getElementsByTagName('span');
			for (p = 0; p < spans.length; p++)
			{
				if (spans[p].getAttribute('class') == 'flagnone')
				{
					// add images
					spans[p].appendChild(smImg);
					spans[p].appendChild(smMod);
					break;
				}
			}
		}
	}

	// log execution time
	GM_log((getTime() - scriptStartTime) + 'ms');
	
})();	