Advertisement
Guest User

Mefi Navigator fixes

a guest
Jun 25th, 2015
351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name          MeFi Navigator
  3. // @namespace     http://www.metafilter.com/
  4. // @description   Navigate users' comments in Metafilter threads.
  5. // @include       http://*.metafilter.com/*
  6. // @include       http://metafilter.com/*
  7. // @include       https://*.metafilter.com/*
  8. // @include       https://metafilter.com/*
  9. // @grant         none
  10. // ==/UserScript==
  11. if (/.*metafilter\.com\/(\d{1,7}\/|mefi\/|comments\.mefi).*/.test(window.location)) {
  12.     var mfn_poster;
  13.     var mfn_all = [];
  14.     var mfn_div = document.createElement("div");
  15.     mfn_preload();
  16.     mfn_main(); // don't wait for page load event
  17. }
  18. function mfn_preload() {
  19.     mfn_you = mfn_user();
  20.     var css = document.createElement("style");
  21.     css.setAttribute("type","text/css");
  22.     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;}";
  23.     document.getElementsByTagName("head")[0].appendChild(css);
  24.     document.body.addEventListener("click",function() { mfn_div.innerHTML = "";mfn_div.style.display = "none"; },true);
  25.     mfn_div.setAttribute("id","navigator-list");
  26.     mfn_div.setAttribute("style","display:none;position:absolute;left:0;top:0;padding:1px 0 0 0;");
  27.     document.body.appendChild(mfn_div);
  28.     mfn_posterNode = document.createElement("span");
  29.     mfn_posterNode.innerHTML = " poster ";
  30.     mfn_posterNode.setAttribute("style","background:#D0D000;color:#222;margin:0 .5ex;");
  31.     mfn_posterNode.setAttribute("class","staff");
  32.     mfn_adminNode = mfn_posterNode.cloneNode(true);
  33.     mfn_adminNode.innerHTML = "Admin";
  34.     mfn_adminNode.style.background = "white";
  35.     mfn_userNode = mfn_adminNode.cloneNode(true);
  36.     mfn_userNode.innerHTML = " me ";
  37.     mfn_userNode.setAttribute("style","background:#CC9;color:#333;margin:0 .5ex;");
  38.     mfn_userNode.setAttribute("class","staff");
  39.     mfn_zeroNode = document.createTextNode("No other comments.");
  40.     var htmlDot = "<b id=\"mfn-dot\">&middot;</b>";
  41.     var htmlLeft = "<a href=\"javascript:void(0);\" target='_self' id='mfn-arrow'>&laquo;</a>";
  42.     var htmlList = "<a href=\"javascript:void(0)\" target='_self' id='mfn-list' onfocus='blur();'>&equiv;</a>";
  43.     var htmlRight = "<a href=\"javascript:void(0);\" target='_self' id='mfn-arrow'>&raquo;</a>";
  44.     mfn_htmlFirst = htmlDot + htmlList + htmlRight;
  45.     mfn_htmlNormal = htmlLeft + htmlList + htmlRight;
  46.     mfn_htmlLast = htmlLeft + htmlList + htmlDot;
  47. }
  48. function mfn_user() {
  49.     var cookie = document.cookie.toString();
  50.     var i = cookie.indexOf("USER_NAME");
  51.     if (i == -1) {
  52.         return false;
  53.     } else {
  54.         var j = cookie.indexOf(';',i);
  55.         if (j == -1) j=cookie.length;
  56.         return unescape(cookie.substring(i+10,j));
  57.     }
  58. }
  59. function findPos(obj) {
  60.     var curleft = 0;
  61.     var curtop = 0;
  62.     if(obj.offsetLeft) curleft += parseInt(obj.offsetLeft);
  63.     if(obj.offsetTop) curtop += parseInt(obj.offsetTop);
  64.     if(obj.scrollTop && obj.scrollTop > 0) curtop -= parseInt(obj.scrollTop);
  65.     if(obj.offsetParent) {
  66.         var pos = findPos(obj.offsetParent);
  67.         curleft += pos[0];
  68.         curtop += pos[1];
  69.     } else if(obj.ownerDocument) {
  70.         var thewindow = obj.ownerDocument.defaultView;
  71.         if(!thewindow && obj.ownerDocument.parentWindow)
  72.             thewindow = obj.ownerDocument.parentWindow;
  73.         if(thewindow) {
  74.             if(thewindow.frameElement) {
  75.                 var pos = findPos(thewindow.frameElement);
  76.                 curleft += pos[0];
  77.                 curtop += pos[1];
  78.             }
  79.         }
  80.     }
  81.  
  82.     return [curleft,curtop];
  83. }
  84. function mfn_main() {
  85.     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);
  86.     mfn_poster = elements.snapshotItem(0).getElementsByTagName('a').item(0).textContent.toString();
  87.     for (var i=0,element;element = elements.snapshotItem(i);i++) {
  88.         var author = element.getElementsByTagName('a').item(0).textContent.toString();
  89.         if (typeof(mfn_all[author]) == "object") { // 'splice' problem
  90.             mfn_all[author].push(element);
  91.         } else{
  92.             mfn_all[author] = [element,];
  93.         }
  94.     }
  95.     for (var author in mfn_all) {
  96.         for (var i = 0,lim=mfn_all[author].length;i<lim;i++) {
  97.             if (mfn_you != false && author == mfn_you) {
  98.                 mfn_all[author][i].getElementsByTagName('a').item(0).appendChild(mfn_userNode.cloneNode(true));
  99.             }
  100.             if (author == mfn_poster && i > 0) {
  101.                 mfn_all[author][i].getElementsByTagName('a').item(0).appendChild(mfn_posterNode.cloneNode(true));
  102.             }
  103.             if (lim==1) {
  104.                 mfn_all[author][i].appendChild(mfn_zeroNode.cloneNode(false));
  105.             } else {
  106.                 var panel = document.createElement("span");
  107.                 var buffer = ["Other&nbsp;<small style='line-height:0;'>[",];
  108.                 buffer.push((i+1),"/",lim,"]</small>:&nbsp;");
  109.                 if (i==0) {
  110.                     buffer.push(mfn_htmlFirst);
  111.                 } else if (i==(lim-1)) {
  112.                     buffer.push(mfn_htmlLast);
  113.                 } else {
  114.                     buffer.push(mfn_htmlNormal);
  115.                 }
  116.                 panel.innerHTML = buffer.join("");
  117.                 if (i > 0) panel.childNodes.item(3).addEventListener("click",function() {mfn_prev(this.parentNode);},true);
  118.                 panel.childNodes.item(4).addEventListener("click",function() {mfn_list(this.parentNode);},true);
  119.                 if (i < (lim-1)) panel.childNodes.item(5).addEventListener("click",function() {mfn_next(this.parentNode);},true);
  120.                 mfn_all[author][i].appendChild(panel);
  121.             }
  122.         }
  123.     }
  124. }
  125. mfn_prev = function (panel) {
  126.     var author = panel.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent;
  127.     var i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/"));
  128.     if (author == mfn_poster && (i-2)==0) {
  129.         window.location = "#top";
  130.     } else {
  131.         var link = mfn_all[author][i-2].getElementsByTagName('a').item(1).href;
  132.         if (link.indexOf("faq.metafilter.com") !== -1) { //staff have an extra anchor element to the faq, we don't want that one
  133.             link = mfn_all[author][i-2].getElementsByTagName('a').item(2).href;
  134.         }
  135.         window.location = link.substring(link.lastIndexOf("#"));
  136.     }
  137. };
  138. mfn_list = function (icon) {
  139.     var author = icon.parentNode.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent;
  140.     var j = icon.parentNode.textContent.substring(icon.parentNode.textContent.indexOf("[")+1,icon.parentNode.textContent.indexOf("/"))*1;
  141.     var buffer = [];
  142.     if (author == mfn_poster) {
  143.         var link = "#top";
  144.     } else {
  145.         var link = mfn_all[author][0].getElementsByTagName('a').item(1).href;
  146.         link = link.substring(link.lastIndexOf("#"));
  147.     }
  148.     buffer.push("<a href='"+link+"' target='_self' style='float:left;font-size:8px;border-right:none;background:#111;' title='first'>&middot;&lt;</a>");
  149.     link = mfn_all[author][mfn_all[author].length-1].getElementsByTagName('a').item(1).href;
  150.     link = link.substring(link.lastIndexOf("#"));
  151.     buffer.push("<a href='"+link+"' target='_self' style='float:left;font-size:8px;background:#111' title='last'>&gt;&middot;</a>");
  152.     buffer.push("<div id='navigator-scroll' style='clear:both;height:200px;overflow:auto;'>");
  153.     for (var i=0,lim=mfn_all[author].length;i<lim;i++) {
  154.         if (author == mfn_poster && i==0) {
  155.             link = "#top";
  156.         } else {
  157.             link = mfn_all[author][i].getElementsByTagName('a').item(1).href;
  158.             if (link.indexOf("faq.metafilter.com") !== -1) {
  159.                 link = mfn_all[author][i].getElementsByTagName('a').item(2).href;
  160.             }
  161.             link = link.substring(link.lastIndexOf("#"));
  162.         }
  163.         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>");
  164.     }
  165.     buffer.push("</div>");
  166.     mfn_div.innerHTML = buffer.join("");
  167.     icon_pos = findPos(icon);
  168.     var new_left = icon_pos[0] + document.body.scrollLeft + "px";
  169.     var new_top = icon_pos[1] + document.body.scrollTop + 20 + "px";
  170.     mfn_div.setAttribute("style","display:block;position:absolute;left:"+(new_left)+";top:"+(new_top)+";padding:1px 0 0 0;");
  171. };
  172. mfn_next = function (panel) {
  173.     var author = panel.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent;
  174.     var i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/"));
  175.     var link = mfn_all[author][i].getElementsByTagName('a').item(1).href;
  176.     if (link.indexOf("faq.metafilter.com") !== -1) { //staff have an extra anchor element to the faq, we don't want that one
  177.         link = mfn_all[author][i].getElementsByTagName('a').item(2).href;
  178.     }
  179.     window.location = link.substring(link.lastIndexOf("#"));
  180. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement