function query() { var total = 0, shown = 0, // HN is done with very unsemantic classes. job_list = Array.prototype.slice.call(document.querySelectorAll('.c5a,.cae,.c00,.c9c,.cdd,.c73,.c88')), query_list = Array.prototype.slice.call(arguments); // This traverses up the dom stack trying to find a match of a specific class function up_to(node, klass) { if (node.className === klass) { return node; } if(node === document.body) { throw new Exception(); } return up_to(node.parentNode, klass); } function display(node, what) { up_to(node, 'athing').style.display = what; } // Turn them all off job_list.forEach(function(node) { display(node, 'none'); total ++; }); query_list.forEach(function(query) { if (query.forEach) { var and_query_list = query.map(function(what) { return new RegExp(what.toString(), 'i'); }); job_list.forEach(function(node) { var doesMatch = true, toTest = node.innerHTML; and_query_list.forEach(function(query) { doesMatch &= (toTest.search(query) > -1); }) if(doesMatch) { display(node, 'block'); shown ++; } }); } else { query = new RegExp(query.toString(), 'i'); job_list.forEach(function(node) { if(node.innerHTML.search(query) !== -1) { display(node, 'block'); shown ++; } }); } }); return {shown: shown, total: total} }