jQuery.fn.product_filter = function(products_wrapper) {
  return this.each(function() {
    
    var form = jQuery(this),
        children = products_wrapper.children().hide();
    
    form.submit(function() {
      
      var elements = form.serializeArray();
      children.hide();
      
      
      var local_children = children;
      var class_names = "";
      
      for (var i=0; i < elements.length; i++) {
        if (elements[i].value != "0") {
          local_children = local_children.filter("." + elements[i].name + "_" + elements[i].value);
        }
      };
      
      local_children.show();
      
      return false;
      
    });
    
    var cache = {};
    
    form.find("select").change(function(event) {
      form.submit();
    }).each(function(){
      var name = this.name;
      
      if (!(name in cache)) {
        cache[name] = {};
      };
      
      jQuery(this).find("option").each(function() {
        var value = this.value;       
        cache[name][value] = children.filter("."+name+"_"+value);
      });
      
    });
    
    form.submit();
    
  });
};
