(function ($) {
  $.fn.fauxSelect = function (options) {
    return this.each(function () {
      var selectBox = $(this),
          selected  = selectBox.find('option:selected'),

          // build faux selectbox html
          mahDL = $('<dl class="faux-select"></dl>'),
          mahDT = $('<dt><span>' + selected.text() + '</span><span class="trigger"></span></dt>'),
          mahDD = $('<dd></dd>'),
          mahOptions = $('<ul class="options"></ul>');

      if (selectBox.data('initialized.fauxSelect') === true) {
        return;
      }

      mahDD.data('ignoreHide', false);

      selectBox.data('initialized.fauxSelect', true);

      // assemble faux selectbox
      mahDD.append(mahOptions);
      mahDL.append(mahDT, mahDD);
      selectBox.after(mahDL);

      // copy each real option to the faux selectbox
      selectBox.find('option').each(function () {
        var currentOption = $(this),
            text = currentOption.text(),
            data = currentOption.val();

        mahOptions.append('<li data-value="' + data + '"> ' + text + ' </li>');
      });

      // open the faux select
      mahDT.bind('click.fauxSelect', function (evt) {
        //evt.stopPropagation();
        mahDD.toggle();
        mahDD.data('ignoreHide', true);
        var zIndex = 210;
        $(this).parent().css('z-index', zIndex);
        $(this).parents('li').siblings().find('dl').css('z-index', 200);
      });

      // select an option (delegation)
      mahDD.delegate('li', 'click.fauxSelect', function () {
        var currentLi = $(this),
            selectedText = currentLi.text(),
            selectedData = currentLi.attr('data-value');

        mahDT.find('span:not(.trigger)').text(selectedText);
        selectBox.find('option[value="' + $.trim(selectedData) + '"]')[0].selected = true;
        
        mahDD.hide();

        mahDD.triggerHandler('selectionMade', [selectedData]);
      });

      // close on other click
      $(document).bind('click.fauxSelect keyup.fauxSelect', function (evt) {
        var close  = false;

        // escape is pressed or 'ignoreHide' flag was set in mahDL click
        if (evt.type == 'keyup' && evt.which == 27 || mahDD.data('ignoreHide') == false) {
          close = true;
        }

        mahDD.data('ignoreHide', false);

        if (close) {
          mahDD.hide();
        }
      });
    });
  }
})(jQuery);
