jQuery.fn.uiSelect = function(options) {
  var options = jQuery.extend({
    onSelection: function() {}
  }, options);

  return this.each(function() {
    var select = jQuery(this);
    var on = select.find('li[class=on]');
    on = (on.length)? on : select.find('li:first');
    select.find('ul').hide();
    select.prepend('<p>'+on.text()+'</p>');

    select.bind('ui:select:click', click);
    select.bind('ui:select:selected', selected);

    // Show select choices if triggered.
    select.find('p').bind('click', function(e) {
      e.preventDefault();
      select.trigger('ui:select:click', [select]);
    });

    // Trigger selected methods if list element is selected.
    select.find('li a').bind('click', function(e) {
      select.trigger('ui:select:selected', [this, select]);
    });

    // Listen for clicks outside and close if one is detected.
    jQuery(document).bind('click', function(e) {
      closeSelect(select);
    });

    // Prevent propagation of inside clicks.
    select.bind('click', function(e) {
      e.stopPropagation();
    });
  });

  function click(e, select) {
    select.toggleClass('ui_select_on');
    select.find('ul').toggle();
  };

  function selected(e, selected, select) {
    select.find('p').text(jQuery(selected).text())
    closeSelect(select);
    options.onSelection();
  };

  function closeSelect(select) {
    select.removeClass('ui_select_on');
    select.find('ul').hide();
  };
};