// ==UserScript==
// @name          MeFi Navigator
// @namespace     http://www.metafilter.com/
// @description   Navigate users' comments in Metafilter threads.
// @include       http://*.metafilter.com/*
// @include       http://metafilter.com/*
// ==/UserScript==
if (/.*metafilter\.com\/(\d{1,7}\/|mefi\/|comments\.mefi).*/.test(window.location))
{
	var admins = ["mathowie", "jessamyn", "cortex"];
	var poster;
	var all = [];
	var list = document.createElement("div");
	if (window.location.toString().substring(7,15)=="metatalk") var metatalk = true;
	
	preload();
	window.addEventListener('load',main,false);
}
function preload()
{
	you = user();
	css = document.createElement("style");
	css.setAttribute("type","text/css");
	css.innerHTML = "#navigator-list a { -moz-opacity:0.9;background:#666;font-size:8pt;font-family:Arial,sans-serif;border:1px solid #CCC;margin:-1px 0 0 0;display:block;padding:1px 3px 1px 3px;text-align:center; } #navigator-list li { border:0;margin:0;padding:0;} #navigator-list a:hover { -moz-opacity:1;}";
	document.getElementsByTagName("head")[0].appendChild(css);
	document.body.addEventListener("click",function() { list.innerHTML = "";list.style.display = "none"; },true);
	list.setAttribute("id","navigator-list");
	list.setAttribute("style","display:none;position:absolute;left:0;top:0;padding:1px 0 0 0;");
	document.body.appendChild(list);
	posterNode = document.createElement("span");
	posterNode.innerHTML = "Poster";
	posterNode.setAttribute("style","font-family:Arial,sans-serif;-moz-opacity:0.8;background:#D0D000;color:#222;margin-left:4px;padding:0px 2px 0px 2px;font-weight:bold;font-size:9px;");
	adminNode = posterNode.cloneNode(true);
	adminNode.innerHTML = "Admin";
	adminNode.style.background = "white";
	userNode = adminNode.cloneNode(true);
	userNode.innerHTML = "Me";
	userNode.style.background = "#CC9";
	userNode.style.color = "#333";
}
function user()
{
	var cookie = document.cookie.toString();
	var i = cookie.indexOf("USER_NAME");
	if (i == -1)
	{
		return false;
	} else {
		var j = cookie.indexOf(';',i);
		if (j == -1) j=cookie.length; 
		return unescape(cookie.substring(i+10,j));
	}
}
function main()
{
	var elements = document.evaluate('//div/span[@class="smallcopy"]/a/parent::node()',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
	poster = elements.snapshotItem(0).childNodes.item(1).textContent.toString();
	for (var i=0,element;element = elements.snapshotItem(i);i++)
	{
		author = element.childNodes.item(1).textContent.toString();
		if (you != false && author == you)
		{
			element.childNodes.item(1).appendChild(userNode.cloneNode(true));
		}
		if (author == poster && i > 0)
		{
			element.childNodes.item(1).appendChild(posterNode.cloneNode(true));
		}
		if (metatalk == true && admins.indexOf(author) != -1)
		{
			element.childNodes.item(1).appendChild(adminNode.cloneNode(true));
		}
		if (typeof(all[author]) == "object") // 'splice' problem
		{
			all[author].push(element);
		}
		else
		{
			all[author] = [element,];
		}
	}
	for (var author in all)
	{
		comments = all[author];
		if (comments.length == 1)
		{
//			comments[0].appendChild(document.createTextNode("No other comments."));
			continue;
		}
		for (var i = 0,lim=comments.length;i<lim;i++)
		{
			var panel = document.createElement("span");
			var buffer = [" <small>["+(i+1)+"/"+lim+"]</small>: ",];
			if (i==0)
			{
				buffer.push("<b style='padding:0 2px 0 2px;font-size:9pt;'>&middot;</b>");
			} else {
				buffer.push("<a href=\"javascript:void(0);\" target='_self' id='m_prev' style='padding:0 2px 0 2px;font-size:10pt;'>&laquo;</a>");
			}
			buffer.push("<a href=\"javascript:void(0);\" id='m_list' target='_self' style='padding:0 2px 0 2px;font-size:9pt;'>&equiv;</a>");
			if (i==(lim-1))
			{
				buffer.push("<b style='padding:0 2px 0 2px;font-size:9pt;'>&middot;</b>");
			} else {
				buffer.push("<a href=\"javascript:void(0);\" id='m_next' target='_self' style='padding:0 2px 0 2px;font-size:10pt;'>&raquo;</a>");
			}
			panel.innerHTML = buffer.join("");
			if (i > 0) panel.childNodes.item(3).addEventListener("click",function() { m_prev(this.parentNode); },true);
			panel.childNodes.item(4).addEventListener("click",function() { m_list(this); },true);
			if (i < (lim-1)) panel.childNodes.item(5).addEventListener("click",function() { m_next(this.parentNode); },true);
			comments[i].appendChild(panel);
		}
	}
}
m_prev = function (panel) {
	author = panel.parentNode.childNodes.item(1).childNodes.item(0).textContent;
	i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/"));
	if (author == poster && (i-2)==0)
	{
		window.location = "#top";
	} else {
		link = all[author][i-2].childNodes.item(3).href;
		window.location = link.substring(link.lastIndexOf("#"));
	}
};
m_list = function (icon) {
	author = icon.parentNode.parentNode.childNodes.item(1).childNodes.item(0).textContent;
	j = icon.parentNode.textContent.substring(icon.parentNode.textContent.indexOf("[")+1,icon.parentNode.textContent.indexOf("/"))*1;
	buffer = [];
	if (author == poster)
	{
		link = "#top";
	} else {
		link = all[author][0].childNodes.item(3).href;
		link = link.substring(link.lastIndexOf("#"));
	}
	buffer.push("<a href='"+link+"' target='_self' style='float:left;font-size:8px;border-right:none;background:#111;' title='first'>&middot;&lt;</a>");
	link = all[author][all[author].length-1].childNodes.item(3).href;
	link = link.substring(link.lastIndexOf("#"));
	buffer.push("<a href='"+link+"' target='_self' style='float:left;font-size:8px;background:#111' title='last'>&gt;&middot;</a>");
	buffer.push("<div id='navigator-scroll' style='clear:both;height:200px;overflow:auto;'>");
	for (var i=0,lim=all[author].length;i<lim;i++)
	{
		if (author == poster && i==0)
		{
			link = "#top";
		} else {
			link = all[author][i].childNodes.item(3).href;
			link = link.substring(link.lastIndexOf("#"));
		}
		buffer.push("<a href='"+link+"' target='_self' style='background:#"+(i%2==0?'444':'111')+((i+1)==j?';text-decoration:underline;color:white;':';')+"'>"+(i+1)+"</a>");

	}
	buffer.push("</div>");
	list.innerHTML = buffer.join("");
	list.style.left = icon.offsetLeft-1;
	list.style.top = icon.offsetTop-1;
	list.style.display = "block";
	list.childNodes.item(2).scrollTop = list.childNodes.item(2).childNodes.item(j-1).offsetTop-32;
};
m_next = function (panel) {
	author = panel.parentNode.childNodes.item(1).childNodes.item(0).textContent;
	i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/"));
	link = all[author][i].childNodes.item(3).href;
	window.location = link.substring(link.lastIndexOf("#"));
};