// LJ Thread Expand All

//
// ==UserScript==
// @name		LJ Thread Expand All 
// @namespace		http://murklins.talkoncorners.net
// @description		Clicks all the comment Expand links for you.
// @include		http://*.livejournal.com/*
// ==/UserScript==

function xp(query, root) { return document.evaluate(query, root || document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); }
function with_each(query, cb, root) {
	var results = xp(query, root);
	for (var i = 0, j = results.snapshotLength; i < j; i++)
		cb(results.snapshotItem(i));
}

var expandNodes = [];
var allReplies = xp("//a[contains(@href, '?thread')]");	
for (var i = 0; i < allReplies.snapshotLength; i++) {
	var thisOne = allReplies.snapshotItem(i);
	if (thisOne.textContent == "Thread") {
		if (thisOne.nextSibling.nextSibling) {
			if(thisOne.nextSibling.nextSibling.textContent == "Expand") {
				expandNodes[expandNodes.length] = thisOne.nextSibling.nextSibling;
			}
		}
	}	
}


function unfold_all() {
	var allReplies = xp("//a[contains(@href, '?thread')]");	
	for (var i = 0; i < allReplies.snapshotLength; i++) {
		var thisOne = allReplies.snapshotItem(i);
		if (thisOne.textContent == "Thread") {
			if (thisOne.nextSibling.nextSibling) {
				if(thisOne.nextSibling.nextSibling.textContent == "Expand") {
					expandNodes[expandNodes.length] = thisOne.nextSibling.nextSibling;
				}
			}
		}	
	}
	for (var i = 0; i < expandNodes.length; i++) {
		var thisOne = expandNodes[i];
		var evt = document.createEvent("MouseEvents");
		evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
		var canceled = !thisOne.dispatchEvent(evt);
	}
}

//================================
//	INIT
//================================


// Inject "Expand all" links

if (!expandNodes.length)
	return;

with_each("//a[.='Post a new comment']/ancestor::p", function(b) {	
	
	var br = document.createElement("BR");
	b.appendChild(br);
	
	var newA = document.createElement("A");
	newA.innerHTML = "Expand all";
	newA.href = "javascript:void(0)";
	newA.addEventListener("click", unfold_all, false);
	b.appendChild(newA);
	
});