Source for "LJ Thread Unfolder with "Unfold all""

By Henrik N
Has 78 other scripts.


// LJ Thread Unfolder
// version 0.2
// 2005-08-23
// Copyright (c) 2005, Tim Babych
// Homepage: http://clear.com.ua/projects/firefox/unfolder
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html

// Branched 2006-09-09 by Henrik Nyh <http://henrik.nyh.se>
// Added "Unfold all".

// ==UserScript==
// @name			LJ Thread Unfolder with "Unfold all" 
// @namespace		http://clear.com.ua/projects/firefox/unfolder+http://henrik.nyh.se
// @description		Expands nested discussion threads in place.
// @include			http://*.livejournal.com/*
// ==/UserScript==


var unfoldNodes = [];

function unfold_all() {
	unfoldNodes.forEach(unfold_thread);
}

var threadIdRE = /thread=(\d+)/;
var allReplies = $x("//td/a[contains(@href, '?thread')]");

allReplies.forEach(function(thisReplyLink) {
	t = document.createTextNode(' - ');
	thisReplyLink.parentNode.insertBefore(t, thisReplyLink.nextSibling);

	var threadId = thisReplyLink.href.match(threadIdRE)[1];

	a = document.createElement('A');
	with (a) {
		innerHTML = "Unfold";
		href = 'javascript:void(0)';
		addEventListener("click", unfold_click, false)
		setAttribute('thread_id', threadId);
		setAttribute('thread_href', thisReplyLink.href);
	}
	t.parentNode.insertBefore(a, t.nextSibling);
	unfoldNodes.push(a);

	d = document.createElement('div');
	d.style.display = 'none';
	d.id = 'thread_unfolder_temp_div_' + threadId;
	document.body.appendChild(d);
});
	

GM_addStyle(
	"a.unfold_thread {color:black; text-decoration:none; cursor:default; } " +
	"a.unfold_thread:hover {color:black; text-decoration:none; }" +
	"a.unfold_thread img { border:none; }"
);

// Inject "Unfold all" links

if (!unfoldNodes.length)
	return;
	
$x("//a[contains(@href, '?mode=reply')]/ancestor::b").forEach(function(b) {
	
	var comma = document.createTextNode(', ');
	b.appendChild(comma);
	
	var newA = document.createElement("A");
	with (newA) {
		innerHTML = "Unfold all";
		href = "javascript:void(0)";
		addEventListener("click", unfold_all, false);
	}
	
	b.appendChild(newA);
	b.insertBefore(newA, newA.previousSibling.previousSibling);
	b.insertBefore(comma, comma.previousSibling.previousSibling);
	
});


//	Workhorses

function unfold_click() {
	unfold_thread(this);
}

function unfold_thread(link) {	
	
	with (link) {
		className = 'unfold_thread';
		innerHTML = loader;
		blur();		
	}
	elem = link;
	
	// Closure yo!
	(function(elem) {

	GM_xmlhttpRequest({
	    method: 'GET',
	    url: link.getAttribute('thread_href'),
	    onload: function(responseDetails) {
		
			dummy = document.getElementById('thread_unfolder_temp_div_'+elem.getAttribute('thread_id'));
			dummy.innerHTML = responseDetails.responseText;
			reply = document.getElementById('ljcmt'+elem.getAttribute('thread_id'));
			
			try {  // If we fail, fail silently
			
				// get cell
				td = elem;
				while (td.nodeName != 'TD')
					td = td.parentNode;

				//cleanse cell
				while(td.firstChild)
					td.removeChild(td.firstChild);
										
				// remove nesting comments			
				tbody = td.parentNode.parentNode;
				my_padding = tbody.firstChild.firstChild.firstChild.width;
			

				next_comment = tbody.parentNode.nextSibling.nextSibling.nextSibling;
				while(next_comment && 
						next_comment.firstChild &&
						next_comment.firstChild.firstChild &&
						next_comment.firstChild.firstChild.firstChild &&
						next_comment.firstChild.firstChild.firstChild.firstChild &&
						(next_comment.firstChild.firstChild.firstChild.firstChild.width > my_padding)) {
					to_del = next_comment;
					next_comment = next_comment.nextSibling.nextSibling.nextSibling;
					to_del.parentNode.removeChild(to_del);
				}

				// add comments there
				while(reply && reply.nodeName != 'HR') {
					next_one = reply.nextSibling;
					td.appendChild(reply);
					reply = next_one;			
				}
			} catch(e) {}
						
			dummy.innerHTML = '';
			
		}
	});
	
	})(elem);
}

//========================================
//	ROUTINES
//========================================

loader = '<img src="data:image/gif;base64,R0lGODlhEAAQAMQAAP///+7u7t3d3bu7u6qqqpmZmYi'+
'IiHd3d2ZmZlVVVURERDMzMyIiIhEREQAR'+
'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'+
'fySDhGYQdDWGQyUhADs="> Loading...'


/* Staple functions */

function $(id) { return document.getElementById(id); }
function $x(path, root) {
	if (!root) root = document;
	var i, arr = [], xpr = document.evaluate(path, root, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (i = 0; item = xpr.snapshotItem(i); i++) arr.push(item);
	return arr;
}