/*
 * Copyright (c) 2008 Greg Weber webs.dev gmail
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * 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, phrases, columns, ifHidden){
  //console.log(phrases);
  //console.log(columns);
  var new_hidden = false;
  var phrasesEqual = true;
  jQuery.each(columns, function(i, val) {
    //console.log(val);
    //console.log(jQuery.uiTableFilter.last_phrases[val]);
    if ((jQuery.uiTableFilter.last_phrases[val]) && (jQuery.uiTableFilter.last_phrases[val] != phrases[i])) {
      phrasesEqual = false;
    }
  });
  //console.log(phrasesEqual);
  if( phrasesEqual == false ) return false;

  var phrase_lengths = jQuery.map(phrases, function(val) {
    return val.length;
  });
  //console.log(phrase_lengths);

  var words = jQuery.map(phrases, function(val) {
    return val.toLowerCase();
  });
  jQuery.each(words, function(i, val) {
    words[i] = words[i].split(" ");
  });
  //console.log(words);

  var success = function(elem) { elem.show() }
  var failure = function(elem) { elem.hide() }

  if( columns ) {
    var index = null;
    var search_text = {};
    jq.find("thead > tr:first > th").each( function(i){
      var colIndex = jQuery.inArray(jQuery(this).text(), columns);
      if( colIndex != -1 ){
        var iselector = "td:eq(" + i + ")";
        search_text[columns[colIndex]] = function(wordsIndex, elem) {
          return jQuery.uiTableFilter.has_words( jQuery(elem.find(iselector)).text(), words[wordsIndex] );
        };
      }
    });
  }
  else {
    var search_text = function(){
        var elem = jQuery(this);
        jQuery.uiTableFilter.has_words( elem.text(), words ) ? elem.show() : elem.hide();
    }
  }

  new_hidden = true;
  jq.find("tbody > tr").each(function(i) {
    var allPassed = true;
    var elem = jQuery(this);
    jQuery.each(columns, function(ind, val) {
      var funcToCall = search_text[columns[ind]];
      allPassed = allPassed && funcToCall(ind, elem);
    });
    //console.log("i: " + i + " allPassed: " + allPassed);
    if (allPassed == true) {
      elem.show();
    } else {
      elem.hide();
    }
  });

  last_phrases = {};
  if( new_hidden ) ifHidden();
  return jq;
};
jQuery.uiTableFilter.last_phrases = {};

// 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;
}
