MeFi Navigator - fixed

Navigate users' comments in Metafilter threads. Fixed version of matthewr script.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name          MeFi Navigator - fixed
// @namespace     http://www.metafilter.com/
// @description   Navigate users' comments in Metafilter threads. Fixed version of matthewr script.
// @include       http://*.metafilter.com/*
// @include       http://metafilter.com/*
// @include       https://*.metafilter.com/*
// @include       https://metafilter.com/*
// @grant         none
// @version 0.0.1.20150630234118
// ==/UserScript==
if (/.*metafilter\.com\/(\d{1,7}\/|mefi\/|comments\.mefi).*/.test(window.location)) {
	var mfn_poster;
	var mfn_all = [];
	var mfn_div = document.createElement("div");
	mfn_preload();
	mfn_main(); // don't wait for page load event
}
function mfn_preload() {
	mfn_you = mfn_user();
	var css = document.createElement("style");
	css.setAttribute("type","text/css");
	css.innerHTML = "#mfn-dot { padding:0 2px 0 2px;font-size:9pt;line-height:0; } #mfn-arrow { padding:0 2px 0 2px;font-size:10pt;line-height:0;} #mfn-list{padding:0 2px 0 2px;font-size:9pt;line-height:0;} #navigator-list a { -moz-opacity:0.9;background:#666;font-size:8pt;font-family:Arial,sans-serif;border:1px solid #CCC;border-top:none;margin: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() { mfn_div.innerHTML = "";mfn_div.style.display = "none"; },true);
	mfn_div.setAttribute("id","navigator-list");
	mfn_div.setAttribute("style","display:none;position:absolute;left:0;top:0;padding:1px 0 0 0;");
	document.body.appendChild(mfn_div);
	mfn_posterNode = document.createElement("span");
	mfn_posterNode.innerHTML = "Poster";
	mfn_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;line-height:0;");
	mfn_adminNode = mfn_posterNode.cloneNode(true);
	mfn_adminNode.innerHTML = "Admin";
	mfn_adminNode.style.background = "white";
	mfn_userNode = mfn_adminNode.cloneNode(true);
	mfn_userNode.innerHTML = "Me";
	mfn_userNode.style.background = "#CC9";
	mfn_userNode.style.color = "#333";
	mfn_zeroNode = document.createTextNode("No other comments.");
	var htmlDot = "<b id=\"mfn-dot\">&middot;</b>";
	var htmlLeft = "<a href=\"javascript:void(0);\" target='_self' id='mfn-arrow'>&laquo;</a>";
	var htmlList = "<a href=\"javascript:void(0)\" target='_self' id='mfn-list' onfocus='blur();'>&equiv;</a>";
	var htmlRight = "<a href=\"javascript:void(0);\" target='_self' id='mfn-arrow'>&raquo;</a>";
	mfn_htmlFirst = htmlDot + htmlList + htmlRight;
	mfn_htmlNormal = htmlLeft + htmlList + htmlRight;
	mfn_htmlLast = htmlLeft + htmlList + htmlDot;
}
function mfn_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 mfn_main() {
	var elements = document.evaluate('//div[@class="comments" or @class="copy" or @class="comments bestleft"]/span[@class="smallcopy" or @class="smallcopy postbyline"]',document.body,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
	mfn_poster = elements.snapshotItem(0).getElementsByTagName('a').item(0).textContent.toString();
	for (var i=0,element;element = elements.snapshotItem(i);i++) {
		var author = element.getElementsByTagName('a').item(0).textContent.toString();
		if (typeof(mfn_all[author]) == "object") { // 'splice' problem
			mfn_all[author].push(element);
		} else{
			mfn_all[author] = [element,];
		}
	}
	for (var author in mfn_all) {
		for (var i = 0,lim=mfn_all[author].length;i<lim;i++) {
			if (mfn_you != false && author == mfn_you) {
				mfn_all[author][i].getElementsByTagName('a').item(0).appendChild(mfn_userNode.cloneNode(true));
			}
			if (author == mfn_poster && i > 0) {
				mfn_all[author][i].getElementsByTagName('a').item(0).appendChild(mfn_posterNode.cloneNode(true));
			}
			if (lim==1) {
				mfn_all[author][i].appendChild(mfn_zeroNode.cloneNode(false));
			} else {
				var panel = document.createElement("span");
				var buffer = ["Other&nbsp;<small style='line-height:0;'>[",];
				buffer.push((i+1),"/",lim,"]</small>:&nbsp;");
				if (i==0) {
					buffer.push(mfn_htmlFirst);
				} else if (i==(lim-1)) {
					buffer.push(mfn_htmlLast);
				} else {
					buffer.push(mfn_htmlNormal);
				}
				panel.innerHTML = buffer.join("");
				if (i > 0) panel.childNodes.item(3).addEventListener("click",function() {mfn_prev(this.parentNode);},true);
				panel.childNodes.item(4).addEventListener("click",function() {mfn_list(this);},true);
				if (i < (lim-1)) panel.childNodes.item(5).addEventListener("click",function() {mfn_next(this.parentNode);},true);
				mfn_all[author][i].appendChild(panel);
			}
		}
	}
}
mfn_prev = function (panel) {
	var author = panel.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent;
	var i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/"));
	if (author == mfn_poster && (i-2)==0) {
		window.location = "#top";
	} else {
		var link = mfn_all[author][i-2].getElementsByTagName('a').item(1).href;
		if (link.indexOf("faq.metafilter.com") !== -1) { //staff have an extra anchor element to the faq, we don't want that one
			link = mfn_all[author][i-2].getElementsByTagName('a').item(2).href;
		}
		window.location = link.substring(link.lastIndexOf("#"));
	}
};
mfn_list = function (icon) {
	var author = icon.parentNode.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent;
	var j = icon.parentNode.textContent.substring(icon.parentNode.textContent.indexOf("[")+1,icon.parentNode.textContent.indexOf("/"))*1;
	var buffer = [];
	if (author == mfn_poster) {
		var link = "#top";
	} else {
		var link = mfn_all[author][0].getElementsByTagName('a').item(1).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 = mfn_all[author][mfn_all[author].length-1].getElementsByTagName('a').item(1).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=mfn_all[author].length;i<lim;i++) {
		if (author == mfn_poster && i==0) {
			link = "#top";
		} else {
			link = mfn_all[author][i].getElementsByTagName('a').item(1).href;
			if (link.indexOf("faq.metafilter.com") !== -1) {
				link = mfn_all[author][i].getElementsByTagName('a').item(2).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>");
	mfn_div.innerHTML = buffer.join("");
	    var rect = icon.getBoundingClientRect();
    	var body = document.body
    	var docElem = document.documentElement    
    
    	var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
    	var scrollLeft =  window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
    
    	var clientTop = docElem.clientTop || body.clientTop || 0
    	var clientLeft = docElem.clientLeft || body.clientLeft || 0
    
    	var menu_top_pos = rect.bottom + scrollTop - clientTop;
    	var menu_left_pos = rect.left + scrollLeft - clientLeft;
    
    	mfn_div.style.left = Math.round(menu_left_pos) + 'px';
    	mfn_div.style.top = Math.round(menu_top_pos) + 'px';
        mfn_div.style.display = "block";
	mfn_div.childNodes.item(2).scrollTop = mfn_div.childNodes.item(2).childNodes.item(j-1).offsetTop-32; };
mfn_next = function (panel) {
	var author = panel.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent;
	var i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/"));
	var link = mfn_all[author][i].getElementsByTagName('a').item(1).href;
	if (link.indexOf("faq.metafilter.com") !== -1) { //staff have an extra anchor element to the faq, we don't want that one
		link = mfn_all[author][i].getElementsByTagName('a').item(2).href;
	}
	window.location = link.substring(link.lastIndexOf("#"));
};