var CalicoSearch = function (el, opts) {
  
  var settings = jQuery.extend({
    options : [
      [ 'test', 'test.php' ]
    ],
    insertAt : document.body,
    triggerContent : 'v'
  }, opts);
  
  
  var menuVisible = false;
  var trigger;
  var menu;
  var origAction;
  
  function init() {
    trigger = $(el).after('<a href="javascript:;" class="search-menu-trigger">'+ settings.triggerContent +'</a>').next();
    menu = $('<div class="search-menu-menu" style="display: none;"></div>');
    var ul = $('<ul/>');
    jQuery.each(settings.options, function(k, v) {
      var link;
      link = $('<a href="javascript:;">'+v[0]+'</a>');
      link.data('calico_search', [ v[1], v[2] || {} ]);
      var li = $('<li/>');
      li.append(link);
      ul.append(li);
    });
    menu.append(ul);
    menu.appendTo(settings.insertAt);
    trigger.bind('click', trigger_click);
    menu.bind('click', menu_click);
    origAction = el.form.action;
  }
  
  function show() {
    menu.show();
    menuVisible = true;
    setGlobalBindings();
  }
  
  function body_click(e) {
    if (menuVisible && e.target != trigger[0] && menu.find('*').index(e.target) == -1)
      hide();
  }
  
  function keypress(e) {
    if (e.keyCode == 27)
      hide();
  }

  function setGlobalBindings(bind) {
    if (bind === undefined) bind = true;
    var m = bind ? 'bind' : 'unbind';
    $(document)
      [m]('click', body_click)
      [m]('keypress', keypress);
  }
  
  function hide() {
    menuVisible = false;
    menu.hide();
    setGlobalBindings(false);
  }
  
  function setAction(uri) {
    if (uri)
      el.form.action = uri;
    else
      el.form.action = origAction;
  }
  
  function setHidden(params) {
    // console.log(params);
    var form = $(el.form);
    for (var i in params) {
      var hidden = form.find('input[name=' + i + ']');
      if (!hidden.length) {
        hidden = $('<input type="hidden" name="'+i+'" value="'+params[i]+'" />');
        form.append(hidden);
      }
      hidden.val(params[i]);
    }
  }
  
  function menu_click(e) {
    if ($(e.target).is('a')) {
      e.preventDefault(); // needed by IE6, otherwise the form will not be submitted
      var data = $(e.target).data('calico_search'); 
      setAction(data[0]);
      setHidden(data[1]);
      $(el.form).submit();
    }
  }
  
  
  function trigger_click(e) {
    e.preventDefault();
    e.stopPropagation();
    if (menuVisible)
      hide();
    else
      show();
  }
  
  init();
  
};

jQuery.fn.calicoSearch = function(opts) {
  return this.each(function() {
    CalicoSearch(this, opts);
  });
};