jQuery.fn.WSStyleSelect = function() {
 var display = this.css('display');
 this.hide().after('<div class="FormSelectStyled"><ul></ul></div>').each(function() {
  var jSelect = jQuery(this);
  var jDiv = jQuery(this.nextSibling).css('display', display);
  var ul = jQuery(this.nextSibling.firstChild);
  var imgSrc = jSelect.attr('imgSrc');
  var activator;
  var updateActivator;
  if (false && imgSrc) {
   activator = jDiv.prepend('<img class="FormSelectActivator" />').find('img');
   activator.attr(imgSrc);
   updateActivator = function() { };
  } else {
   activator = jDiv.append('<span class="FormSelectActivator" >').find('span');
   updateActivator = function() {
    activator.text(jSelect.find(':selected').text());
   };
  }
  var choices = jDiv.find('ul').hide();


  var liHover = function() {
   var jThis = jQuery(this);
   var d = jThis.hasClass('disabled') || jThis.parent().hasClass('disabled');
   if (jThis.hasClass('disabled') || jThis.parent().hasClass('disabled')) return;
   choices.find('li').removeClass('active');
   jThis.addClass('active');
  };

  var newLI = function(container, src, labelFetcher, hover) {
   var li = jQuery(container.append('<li></li>')[0].lastChild).text(labelFetcher(src));
   if (src.is(':disabled')) {
    li.addClass('disabled');
    li.attr('disabled', src.attr('disabled'));
   }
   if (hover) li.hover(hover, function() {});
   return li;
  };
  var addOption = function(container, elm, labelFetcher) {
   var jThis = jQuery(elm);
   var thisVal = jThis.val();
   var li = newLI(container, jThis, labelFetcher, liHover);
   if (jSelect.val() == thisVal) li.addClass('active');
   if (!jThis.is(':disabled')) { 
    li.click(function() {
     if (jSelect.val() != thisVal) {
      jSelect.val(thisVal);
      jSelect.change();
     }
    });
   }
  };
  var addOptGroup = function(container, elm) {
   var jThis = jQuery(elm);
   var labelFetcher = function(e) { return e.attr('label'); };
   var li = newLI(container, jThis, labelFetcher, null);
   li.addClass('optgroup');
   var ul = jQuery(container.append('<ul></ul>')[0].lastChild); 
   if (jThis.is(':disabled')) ul.addClass('disabled');
   jThis.children('option').each(function() {
    addOption(ul, this, labelFetcher);
   });
  };
  updateActivator();
  activator.transientClick(
   function(e) {
    return choices.is(':hidden');
   },
   function (e) {
    var zIndex = choices.css('z-index');
    jSelect.children().each(function() {
     if (this.nodeName == 'OPTION') {
      addOption(choices, this, function(e) { return e.text(); });
     } else if (this.nodeName == 'OPTGROUP') {
      addOptGroup(choices, this);
     }
    });
    choices.slideDown(300).css('z-index', 1000);
    return function() {
     updateActivator();
     choices.slideUp(300, function() {
      choices.css('z-index', zIndex).empty();
     });
    };
   }
  );
 });
};

