--- /dev/null
+/*
+ * Copyright (c) 2008 Greg Weber greg at gregweber.info
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * documentation at http://gregweber.info/projects/uitablefilter
+ *
+ * allows table rows to be filtered (made invisible)
+ * <code>
+ * t = $('table')
+ * $.uiTableFilter( t, phrase )
+ * </code>
+ * arguments:
+ * jQuery object containing table rows
+ * phrase to search for
+ * optional arguments:
+ * column to limit search too (the column title in the table header)
+ * ifHidden - callback to execute if one or more elements was hidden
+ */
+jQuery.uiTableFilter = function(jq, phrase, column, ifHidden){
+ var new_hidden = false;
+ if( this.last_phrase === phrase ) return false;
+
+ var phrase_length = phrase.length;
+ var words = phrase.toLowerCase().split(" ");
+
+ // these function pointers may change
+ var matches = function(elem) { elem.show() }
+ var noMatch = function(elem) { elem.hide(); new_hidden = true }
+ var getText = function(elem) { return elem.text() }
+
+ if( column ) {
+ var index = null;
+ jq.find("thead > tr:last > th").each( function(i){
+ if( $.trim($(this).text()) == column ){
+ index = i; return false;
+ }
+ });
+ if( index == null ) throw("given column: " + column + " not found")
+
+ getText = function(elem){ return jQuery(elem.find(
+ ("td:eq(" + index + ")") )).text()
+ }
+ }
+
+ // if added one letter to last time,
+ // just check newest word and only need to hide
+ if( (words.size > 1) && (phrase.substr(0, phrase_length - 1) ===
+ this.last_phrase) ) {
+
+ if( phrase[-1] === " " )
+ { this.last_phrase = phrase; return false; }
+
+ var words = words[-1]; // just search for the newest word
+
+ // only hide visible rows
+ matches = function(elem) {;}
+ var elems = jq.find("tbody > tr:visible")
+ }
+ else {
+ new_hidden = true;
+ var elems = jq.find("tbody > tr")
+ }
+
+ elems.each(function(){
+ var elem = jQuery(this);
+ jQuery.uiTableFilter.has_words( getText(elem), words, false ) ?
+ matches(elem) : noMatch(elem);
+ });
+
+ last_phrase = phrase;
+ if( ifHidden && new_hidden ) ifHidden();
+ return jq;
+};
+
+// caching for speedup
+jQuery.uiTableFilter.last_phrase = ""
+
+// not jQuery dependent
+// "" [""] -> Boolean
+// "" [""] Boolean -> Boolean
+jQuery.uiTableFilter.has_words = function( str, words, caseSensitive )
+{
+ var text = caseSensitive ? str : str.toLowerCase();
+ for (var i=0; i < words.length; i++) {
+ if (text.indexOf(words[i]) === -1) return false;
+ }
+ return true;
+}