Friday, February 4, 2011

Filter Google search results to hide unwanted sites by domain


// ==UserScript==
// @name           Google Hit Hider by Domain
// @namespace      JeffersonScher
// @copyright      © 2011 Jefferson Scher
// @license        CC BY http://creativecommons.org/licenses/by/3.0/
// @description    Filter Google search results to hide unwanted sites by domain v0.72 2011-02-03
// @include        http://www.google.tld/*
// @include        http://news.google.tld/*
// DISCLAIMER: Use at your own risk. Functionality and harmlessness NOT warranteed.
// ==/UserScript==

// Edit these to change the style of the script's buttons and panes, e.g., for accessibility
GM_addStyle("div.ghhider{color:#888;}");
GM_addStyle("button.ghhider{color:#555;background-color:#fcfcfc;font-size:0.85em;margin-left:4px;border:1px solid #ccc;-moz-border-radius:4px;padding:2px 3px;}");
GM_addStyle("button.ghhider:hover{color:#000;background:#ff8;}");
GM_addStyle(".ghh1time{background:#eee;}");
GM_addStyle(".ghhpane{position:absolute;color:#333;background-color:#fcfcfc;border:1px solid #ccc;-moz-border-radius:4px;padding:0.25em 1.5em;display:none}");
GM_addStyle("#ghhsitelist {background:#fff;list-style-type:none;}");
GM_addStyle("#ghhsitelist li{width:95%;line-height:1.5em;padding:0 0.25em;cursor:pointer;}");
GM_addStyle(".ghhdel{text-decoration:line-through;color:#333;}");

var hosts, prefShow, hhd;
if (document.body){
  // Retrieve list from settings and stash in the page
  hosts = GM_getValue("hideyhosts");
  prefShow = GM_getValue("shownotc");
  if (!hosts || hosts.length == 0) hosts = "|bigresource.com|";
  hhd = document.createElement("div");
  hhd.appendChild(document.createTextNode(hosts));
  hhd.id = "hideyhostlist";
  hhd.style.visibility = "hidden";
  if (!prefShow || prefShow.length == 0) {
    prefShow = "Y";
  }
  if (prefShow == "Y") hhd.setAttribute("showbtn","yes");
  else hhd.setAttribute("showbtn","no");
  document.body.appendChild(hhd);
  // Add buttons, hide unwanted domains
  hidehits(false);
  // Create skeleton of manage form
  if (!document.getElementById("ghhmngform")) addManageForm();
  // Add manage button
  if (!document.getElementById("ghhMngBtn")) addMngBtn();
  // Create block form
  if (!document.getElementById("ghhblockform")) addBlockForm();
  // Watch for changes that could be new instant or AJAX search results
  document.body.addEventListener("DOMSubtreeModified", checkOlist, false);
}

function hidehits(ovrd){
  if (!document.getElementById("res")) return;
  var list = document.getElementById("res").getElementsByTagName("ol")[0];
  if (!list) return;
  var liels, hosts, showpref, hiders, nhider, i, j, k, hid, ael, dom, dompart, btn, apar;
  liels = list.getElementsByTagName("li");
  hosts = ""; 
  showpref = document.getElementById("hideyhostlist").getAttribute("showbtn");
  for (i=0; i<liels.length; i++){
    if (liels[i].parentNode.nodeName.toLowerCase() != "ol") return; // Images, for example
    hiders = liels[i].getElementsByClassName("ghhider");
    nhider = hiders.length;
    if (nhider == 0 || ovrd == true){ // skip if a button is there
      if (hosts.length == 0){
        hosts = document.getElementById("hideyhostlist").textContent;
        if (!hosts || hosts.length == 0) hosts = "|bigresource.com|";
      }
      hid = false;
      ael = liels[i].getElementsByTagName("a")[0]; // first link only (no work in video or book blocks)
      if (ael){if(ael.hasAttribute("href")){if (ael.getAttribute("href").indexOf("http")==0){
        dom = ael.getAttribute("href").split("/")[2];
        dompart = dom;
        while (dompart.indexOf(".")> -1) {
          if (hosts.indexOf("|"+dompart+"|")>-1) { // These domains suck
            if (nhider > 0){
              for (k=hiders.length-1; k=0; k--){
                hiders[k].parentNode.removeChild(hiders[k]);
                nhider = liels[i].getElementsByClassName("ghhider").length;
              }
            }
            if (liels[i].className.indexOf("ghh1time")<0){
              if (showpref=="yes") replaceHit(dompart,ael,liels[i],"");
              else replaceHit(dompart,ael,liels[i],"none");
              for (j=0; j<liels[i].children.length; j++){
                if (liels[i].children[j].className.indexOf("ghhider")<0) liels[i].children[j].style.display="none";
              }
            }
            hid = true;
            break;
          }
          else {
            dompart = dompart.slice(dom.indexOf(".")+1);
          }
        }
        if (hid == false && nhider > 1) { // Remove previous block
          liels[i].removeChild(liels[i].children[0]);
          for (j=0; j<liels[i].children.length; j++){
            if (liels[i].children[j].style.display=="none") liels[i].children[j].style.display="";
          }
        }
        if (hid == false && nhider == 0) { // These domains are okay
          apar = ael.parentNode;
          if (apar != undefined) {
            btn = document.createElement("button");
            btn.appendChild(document.createTextNode("block"));
            btn.className="ghhider";
            btn.setAttribute("meta",dom);
            btn.setAttribute("title","Add "+dom+" to the block list");
            btn.addEventListener("click",showbfd,true);
            apar.parentNode.insertBefore(btn,apar.nextSibling);
          }
        }
      }}}
    }
  }
  if (!document.getElementById("ghhMngBtn")) addMngBtn();
  else if(document.getElementById("ghhMngBtn").parentNode.id != "guser") moveMngBtn();
  if (document.getElementsByClassName("unbtn").length > 1) undupMngBtn();
}
function replaceHit(sdomain,oa,oli,ddis){
  var fc = oli.firstChild;
  if (fc.nodeName.toLowerCase()=="div" && fc.className.indexOf("ghhider")>-1) return;
  var dnew = document.createElement("div");
  dnew.appendChild(document.createTextNode(oa.textContent+" on "+sdomain));
  dnew.className="ghhider ghhd";
  dnew.setAttribute("title","Click for available actions");
  dnew.style.cursor = "pointer";
  dnew.style.display = ddis;
  dnew.addEventListener("click",showactions,true);
  oli.insertBefore(dnew,oli.firstChild);
  var btn = document.createElement("button");
  btn.appendChild(document.createTextNode("Show Hit"));
  btn.className="ghhider";
  btn.setAttribute("title","Show this result, but don't unblock the site");
  btn.style.display="none";
  btn.addEventListener("click",reshow,true);
  dnew.appendChild(btn);
  btn = document.createElement("button");
  btn.appendChild(document.createTextNode("Unblock"));
  btn.className="ghhider";
  btn.setAttribute("title","Unblock this site");
  btn.style.display="none";
  btn.setAttribute("dom",sdomain);
  btn.addEventListener("click",unblock,true);
  dnew.appendChild(btn);
}
function checkOlist(e){ // Check for new results
  // Ignore events on some elements
  if (e.target.nodeName == "BODY") return;
  if (e.target.hasAttribute("id")){
    if (e.target.id == "guser" || e.target.id == "foot" || e.target.id == "showNotcBtn" || e.target.id == "hideyhostlist" ||
        e.target.id == "ghhtemp" || e.target.id == "ghhblockform" || e.target.id == "ghhmanageform" || e.target.id == "ghhsitelist") return;
  }
  if (e.target.hasAttribute("class")){
    if (e.target.className.indexOf("ghhider") > -1 || e.target.className.indexOf("goog-date-picker") > -1) return;
  }
  // Hide hits if list is visible now
  var ir = document.getElementById("res");
  if (ir){
    var olist = ir.getElementsByTagName("ol")[0];
    if (olist){
      if (window.getComputedStyle(olist,null).getPropertyValue("visibility") == "visible" && 
          window.getComputedStyle(olist,null).getPropertyValue("display") != "none"){
        //GM_log("Calling hidehits; event target nodeName="+e.target.nodeName+"; id="+e.target.id+"; className="+e.target.className);
        if (olist.getElementsByTagName("li").length > 0) hidehits(false);
      }
    }
  }
}
// Show hit without unblocking
function reshow(e){
  var liel, k;
  liel = e.target.parentNode.parentNode;
  while (liel.nodeName.toLowerCase()!= "li"){
    liel=liel.parentNode;
    if (liel.nodeName.toLowerCase()=="body") return;
  }
  liel.className += " ghh1time";
  for (k=1; k<liel.children.length; k++) liel.children[k].style.display="";
  e.target.parentNode.style.display="none"; // Hide div
}
// Hide or Show hit notices
function updtpref(e){
  var showstat, btns, j, hds, s;
  showstat = document.getElementById("hideyhostlist").getAttribute("showbtn");
  if (showstat == "yes"){
    if (e.target.id) if (e.target.id == "showNotcBtn") alert("Blocked site notices are displayed");
    else {
      if (confirm("No longer show titles or buttons for suppressed results?")){
        GM_setValue("shownotc","N");
        document.getElementById("hideyhostlist").setAttribute("showbtn","no");
        if(e.target.className.indexOf("ghhsave")<0) e.target.parentNode.style.display="none";
        var btns = e.target.parentNode.getElementsByTagName("button");
        for (j=0; j<btns.length; j++) {
          if(btns[j].className.indexOf("ghhsave")<0) btns[j].style.display = "none";
        }
        togHiderDivs("no");
      }
    }
  } else {
    if (e.target.id) if (e.target.id == "hideNotcBtn") alert("Blocked site notices are hidden");
    else {
      hds = document.getElementsByClassName("ghhd");
      if (hds.length > 0) s = (hds.length == 1) ? "is 1 blocked hit" : "are "+hds.length+" blocked hits";
      else s = "are no blocked hits";
      if (confirm("Show titles and buttons for suppressed results? (There "+s+" on this page.)")){
        GM_setValue("shownotc","Y");
        document.getElementById("hideyhostlist").setAttribute("showbtn","yes");
        e.target.parentNode.style.display="";
        togHiderDivs("yes");
      }
    }
  }
  e.target.blur();
}
function togHiderDivs(sShow){
  var dh, i;
  dh = document.getElementsByClassName("ghhider");
  for(i=0;i<dh.length;i++) {
    if (dh[i].nodeName.toLowerCase() == "div") {
      if (sShow == "yes") dh[i].style.display = "";
      else dh[i].style.display = "none";
    }
  }
}
function unblock(e){
  var tgt, sdom, hlist;
  tgt = e.target;
  sdom = tgt.getAttribute("dom");
  if (sdom.length<4){
    alert("Problem with domain to unblock");
    return;
  }
  hlist = GM_getValue("hideyhosts");
  hlist = hlist.replace("|"+sdom,"");
  GM_setValue("hideyhosts",hlist);
  document.getElementById("hideyhostlist").innerHTML = hlist;
  hidehits(true);
  if (document.getElementById("ghhmngform")){
    if(document.getElementById("ghhmngform").style.display=="block") refreshSiteList();
  }
}
function showactions(e){
  var btns = e.target.getElementsByTagName("button");
  for(var i=0; i<btns.length; i++){
    btns[i].style.display = "";
  }
}
function addMngBtn(){
  var mbtn;
  mbtn = document.createElement("button");
  mbtn.appendChild(document.createTextNode("Manage Hiding"));
  mbtn.className="ghhider unbtn";
  mbtn.setAttribute("title","Manage Google Hit Hider Settings");
  mbtn.id = "ghhMngBtn";
  mbtn.addEventListener("click",showManageForm,true);
  if (document.getElementById("guser")) {
    document.getElementById("guser").appendChild(mbtn);
  } else {
    mbtn.style.position = "absolute";
    mbtn.style.right = "0";
    mbtn.style.top = "1.5em";    
    document.body.appendChild(mbtn);
  }
}
function moveMngBtn(){
  var newpar, mbtn;
  newpar = document.getElementById("guser");
  if (!newpar) return;
  mbtn = document.getElementById("ghhMngBtn");
  mbtn.style.position = "";
  newpar.appendChild(mbtn);
}
function undupMngBtn(){
  var unbtns = document.getElementsByClassName("unbtn");
  while (unbtns.length > 1){
    unbtns[unbtns.length - 1].parentNode.removeChild(unbtns[unbtns.length - 1]);
  }
}
function addBlockForm(){
  var bfd = document.createElement("div");
  bfd.id = "ghhblockform";
  bfd.className = "ghhpane";
  bfd.setAttribute("style","z-index:105;")
  bfd.innerHTML = "<form onsubmit=\"return false;\"><p><strong>Add to blocklist:</strong></p><p><label style=\"white-space:pre\"><input type=\"radio\" name=\"ghhdom\" value=\"f\"> <span id=\"ghhfulldom\"></span></label><br>" +
    "<label><input type=\"radio\" name=\"ghhdom\" value=\"p\"> <span id=\"ghhpartdom\"></span></label></p><p style=\"text-align:center;white-space:pre\"><button id=\"ghhbf1\">OK</button> <button id=\"ghhbf2\">Cancel</button></p></form>";
  document.body.appendChild(bfd);
  document.getElementById("ghhbf1").addEventListener("click",addblock,true);
  document.getElementById("ghhbf2").addEventListener("click",ghhcloseform,true);
}
function showbfd(e) {
  var bbtn, bfdiv, fdom, pdom, fspan, pspan, tdiv, lt;
  bbtn = e.target;
  fdom = bbtn.getAttribute("meta");
  if (!document.getElementById("ghhblockform")) addBlockForm();
  fspan = document.getElementById("ghhfulldom");
  fspan.textContent = fdom;
  fspan.previousElementSibling.checked = true; 
  pdom = fdom.substr(fdom.indexOf(".")+1);
  pspan = document.getElementById("ghhpartdom");
  if (pdom.indexOf(".") > -1) {
    pspan.textContent = pdom;
    pspan.parentNode.style.display = "";
  } else {
    pspan.parentNode.style.display = "none";
  }
  bfdiv = document.getElementById("ghhblockform");
  tdiv = document.createElement("div");
  tdiv.id = "ghhtemp";
  lt = bbtn.offsetLeft + bbtn.offsetWidth + 16;
  tdiv.setAttribute("style", "position:absolute;left:" +  lt + "px;top:-3.5em;z-index:100;");
  if (bbtn.nextElementSibling) bbtn.parentNode.insertBefore(tdiv,bbtn.nextElementSibling);
  else bbtn.parentNode.appendChild(tdiv);
  tdiv.appendChild(bfdiv);
  bfdiv.style.display = "block";
  document.getElementById("ghhbf1").focus();
}
function addblock(e){
  // adds to greasemonkey.scriptvals.JeffersonScher/Google Hit Hider by Domain.hideyhosts
  // to repair or reset, use about:config
  var hosts, els, i, sdom, useredit, btns, oli;
  hosts = GM_getValue("hideyhosts"); 
  if (!hosts || hosts.length == 0) hosts = "|bigresource.com|";
  els = e.target.form.getElementsByTagName("input");
  for (i=0; i<els.length; i++){
    if(els[i].checked == true){
      sdom = els[i].nextElementSibling.textContent;
      break; 
    } 
  }
  ghhcloseform(e);
  hosts += sdom + "|";
  GM_setValue("hideyhosts",hosts);
  document.getElementById("hideyhostlist").innerHTML = hosts;
  hidehits(true);
  if (document.getElementById("ghhmngform")){
    if(document.getElementById("ghhmngform").style.display=="block") refreshSiteList();
  }
}
function ghhcloseform(e){
  if(e.target.id.indexOf("ghhbf") == 0){
    var bfdiv = document.getElementById("ghhblockform");
    var tdiv = document.getElementById("ghhtemp");
    bfdiv.style.display = "none";
    document.body.appendChild(bfdiv);
    tdiv.parentNode.removeChild(tdiv);
  }
  if(e.target.id.indexOf("ghhmf") == 0){
    document.getElementById("ghhmngform").style.display = "none";
  }
}
function addManageForm(){
  var mfd = document.createElement("div");
  mfd.id = "ghhmngform";
  mfd.className = "ghhpane";
  mfd.setAttribute("style","position:fixed;top:4px;right:4px;z-index:101;");
  mfd.innerHTML = "<form onsubmit=\"return false;\"><div style=\"text-align:center\"><p><strong>Manage Google Hit Hider</strong></p><p style=\"border-bottom:1px solid black;padding-bottom:1em;\">" +
    "<button id=\"hideNotcBtn\" title=\"Suppress hidden result titles\" class=\"ghhider ghhsave\">Hide Notices</button>" +
    "<button id=\"showNotcBtn\" title=\"UnHide Hidden Hits\" class=\"ghhider ghhsave\">Show Notices</button></p></div>" +
    "<p>Click to remove from block list:</p><div style=\"margin-top:1em;height:15em;overflow-y:scroll;border:1px solid #333;\"><ul id=\"ghhsitelist\"></ul></div><p style=\"text-align:center;white-space:pre\">" +
    "<button id=\"ghhmf1\">Save Changes</button> <button id=\"ghhmf2\">Close</button></p></form>";
  document.body.insertBefore(mfd,document.body.children[0]);
  document.getElementById("ghhsitelist").addEventListener("click",togglesite,true);
  document.getElementById("ghhmf1").addEventListener("click",saveedits,true);
  document.getElementById("ghhmf2").addEventListener("click",ghhcloseform,true);
  document.getElementById("hideNotcBtn").addEventListener("click",updtpref,true);
  document.getElementById("showNotcBtn").addEventListener("click",updtpref,true);
}
function togglesite(e){
  if(e.target.className == "ghhdel") e.target.className = "";
  else e.target.className = "ghhdel";
}
function saveedits(e){
  var slist, i, stemp, hld, sarray, litem;
  slist = document.getElementById("ghhsitelist");
  stemp = "";
  for (i=0;i<slist.children.length;i++){
    if (slist.children[i].nodeName.toLowerCase() == "li") {
      if(slist.children[i].className != "ghhdel") stemp += slist.children[i].textContent + "|";
    }
  }
  hld = document.getElementById("hideyhostlist");
  hld.innerHTML = "|" + stemp;
  GM_setValue("hideyhosts","|" + stemp);
  hidehits(true);
  refreshSiteList(e);  
}
function showManageForm(e){
  var mfd;
  if (!document.getElementById("ghhmngform")) addManageForm();
  mfd = document.getElementById("ghhmngform");
  refreshSiteList();
  mfd.style.display = "block";
  e.target.blur();
}
function refreshSiteList(e){
  var hld, sarray, slist, i, litem;
  hld = document.getElementById("hideyhostlist");
  sarray = hld.innerHTML.substr(1).split("|");
  slist = document.getElementById("ghhsitelist");
  slist.innerHTML = "";
  for (i=0; i<sarray.length-1; i++){
    litem = document.createElement("li");
    litem.textContent = sarray[i];
    litem.value = sarray[i];
    if (i % 2 == 0) litem.style.background = "#fcfcaa";
    slist.appendChild(litem);
  }
}

0 comments:

Post a Comment