// Manage the relationship between filter selects (drop downs) and a composite filter term

GCR_JS.macFilter = function(form, options) {
  options = options || {};
  var selectors = [];
  var form = $(form);
  var textField = form.down('input.behaviour-filter-text');
  var filterSelects = $(form).up().down('.filter-selects');
  var hideAdvancedLink = null;
  var autoGo = options.autoGo;
  if (typeof(autoGo) == 'undefined') {
    autoGo = true;
  }
  
  var returnObject = {
    
    observeAdvancedFilters: function(n) {
      var realThis = this;
      textField.observe('focus', function(event) {
        realThis.showAdvanced();
      });
    },
    
    showAdvanced: function() {
      if (!filterSelects.visible()) {
        filterSelects.slideDown({duration: 0.3});
      }
    },

    hideAdvanced: function() {
      if (filterSelects.visible()) {
        filterSelects.slideUp({duration: 0.3});
      }
    },

    addSelector: function(id) {
      selectors.push($(id));
    },

    select: function(element) {
      var key, value;
      var range = [];

      Element.extend(element);
      key = element.readAttribute('id');
      value = $F(element);
      if (element.hasClassName('plain-filter')) {
        element.childElements().each(function(o) {
          range.push(o.value);
        });
        this.swap(value, range);
      } else {
        this.change(key, value);
      }
    },

    swap: function(value, range) {
      var words = this.readFilter().split(' ');
      var re = new RegExp("^(" + range.join('|') + ")$")
      var found = false;
      var i;

      for (i = 0; i < words.length; i++) {
        if (re.match(words[i])) {
          words[i] = value;
          found = true;
        }
      }
      if (!found) {
        words.push(value);
      }
      textField.value = words.join(' ');
      MAC_JS.show_hint(textField);
      if (autoGo) {
        this.go();
      }
    },

    change: function(key, value) {
      var words = this.readFilter().split(' ');
      var re = new RegExp("^" + key + ":")
      var found = false;
      var i;

      for (i = 0; i < words.length; i++) {
        if (re.match(words[i])) {
          words[i] = value === '' ? '' : key + ':' + value;
          found = true;
        }
      }
      if (!found && value != '') {
        words.push(key + ':' + value);
      }
      textField.value = words.join(' ');
      MAC_JS.show_hint(textField);
      if (autoGo) {
        this.go();
      }
    },

    detect: function() {
      var words = this.readFilter().split(' ');
      var s, prefix, selector, found, w, word;

      for (s = 0; s < selectors.length; s++) {
        selector = selectors[s];
        prefix = "";
        if (!selector.hasClassName('plain-filter')) {
          prefix = selector.id + ":";
        }
        found = false;
        selector.childElements().each(function(n) {
          option = n.readAttribute('value') || n.innerHTML;
          for (w = 0; w < words.length; w++) {
            word = words[w];
            if (word === prefix + option) {
              selector.value = option;
              found = true;
            }
          }
        });
        if (!found) {
          selector.value = '';
        }
      }
    },

    go: function() {
      var hint = textField.readAttribute('hint');
      form.submit();
      if (hint) {
        MAC_JS.show_hint(textField);
      }
    },

    readFilter: function() {
      var hint = textField.readAttribute('hint');
      if ($F(textField) === hint) {
        return '';
      } else {
        return $F(textField);
      }
    }
  };
  
  $(form).up('.search-form').select('select').each(function(n) {
    returnObject.addSelector(n);
    n.observe('change', function(e){returnObject.select(n)});
  });
  
  new Form.Element.Observer(textField, 0.2, function(element, value) {returnObject.detect()})

  if (filterSelects) {
    returnObject.observeAdvancedFilters(textField);
    hideAdvancedLink = filterSelects.down('a.hide');
    if (hideAdvancedLink) {
      hideAdvancedLink.observe('click', function() { returnObject.hideAdvanced() });
    }
  }

  return returnObject;
}

