// ==UserScript==
// @namespace     http://afunamatata.com/greasemonkey/
// @name          LJSupport: Filter tagged requests
// @description   Filter requests by [tagname]
// @include       http://www.livejournal.com/support/help.bml*
// @tags          ljsupport
// ==/UserScript==

// need to check for entries|styles stuff

function trim(item){return item.replace(/^\s+|\s+$/g, ""); } 
function processList() { 
    return document.getElementById("tags").value.replace("/","-").split(",").map(trim);
}

function doHide() {
  var list = processList();
  style.textContent = ".t-"+list.join(", .t-") + "{display: none} tr {display: table-row;}";
}

function doFilter() {  
  var list = processList();
  style.textContent = ".t-"+list.join(", .t-") + "{display: table-row} tr{display: none;}";
}

// this won't work in some site schemes
var table = document.getElementsByTagName("table")[0];
var xpath = ".//tr/td/b[contains(text(),'[') or contains(text(), '(')]/ancestor::tr";
var tagged = document.evaluate(xpath, table, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

var style = document.createElement("style");
style.type = "text/css";
document.getElementsByTagName("head")[0].appendChild(style);


// figure out a way to do this regular expression so that it doesn't keep the first character
// abuse also uses parentheses
re = /(?:\[([^\[\]]+))|(?:\(([^\(\)]+))/g;
var idCell = (table.rows[0].cells.length==6) ? 2 : 1;
for(var i=0; i < tagged.snapshotLength; ++i ) {  
  var row = tagged.snapshotItem(i);  
  var tags = row.cells[idCell].textContent.match(re);
  for(var j = 0; j < tags.length; ++j) {
    row.className += " t-" + tags[j].substr(1).replace("/","-");
  }
}


var form = document.createElement("form");
var pageForm = document.getElementsByName("state")[0].form;
pageForm.parentNode.insertBefore(form, pageForm.nextSibling);

form.appendChild(document.createTextNode("Comma-separated list (e.g. ru, subs): "));

var input = document.createElement("input");
input.setAttribute("name", "tags");
input.setAttribute("id", "tags");
form.appendChild(input);

var hide = document.createElement("button");
hide.textContent = "hide";
form.appendChild(hide);

hide.addEventListener("click", function(event) {
  GM_setValue("filtermode", "hide");
  if(GM_getValue("persist", false))
    GM_setValue("filterlist", document.getElementById("tags").value);  
  doHide();
  event.stopPropagation();
  event.preventDefault();
}, false);


var filter = document.createElement("button");
filter.textContent = "filter by [tag]";
form.appendChild(filter);

filter.addEventListener("click", function(event) {
  GM_setValue("filtermode", "filter");
  if(GM_getValue("persist", false))
    GM_setValue("filterlist", document.getElementById("tags").value);
  doFilter();
  event.stopPropagation();
  event.preventDefault();
}, false);


var showAll = document.createElement("button");
showAll.textContent = "show all";
form.appendChild(showAll);

showAll.addEventListener("click", function(event) {
    style.textContent = "tr {display: table-row;}";
    event.stopPropagation();
    event.preventDefault();
}, false);

var persistCheckbox = document.createElement("input");
persistCheckbox.setAttribute("id", "persist");
persistCheckbox.setAttribute("type", "checkbox");
if(GM_getValue("persist", false)) persistCheckbox.checked = "true";
form.appendChild(persistCheckbox);

var persistLabel = document.createElement("label");
persistLabel.setAttribute("for",  "persist");
persistLabel.textContent = "Persistent?";
form.appendChild(persistLabel);

persistCheckbox.addEventListener("click", function() {
  GM_setValue("persist", persistCheckbox.checked);
}, false);
  

var persist = GM_getValue("persist", false);

var filterlist = GM_getValue("filterlist", "");
document.getElementById("tags").value = filterlist;
if(!persist) return;

var filtermode = GM_getValue("filtermode", "filter");   
if(filtermode == "filter") doFilter();
else doHide();
 
