$.fn.previewMenu = function(settings) {

    var menu = this;
    var closeTimer = 0;
    var timeout    = 500;
    var menuItem = 0;
    var newMenu = null;
    var previewItem = null;
    var prevPreviewLink = null;


    var defaultSettings = {
        'menuButtonClass'     : 'drop-down-item',
        'previewBlockClass'   : 'drop-down-block',
        'previewItemClass'    : 'menu-preview'
    };

    init();
    _bindEvents();

    function init() {
        settings = $.extend({}, defaultSettings, settings);
    }

    function _menuOpen() {
        _cancelTimer();
        container = $( this ).parent( "li" );
        newMenu = container.find("." + settings.previewBlockClass);
        _menuClose();

        menuItem = newMenu;
        newMenu = null;
        if ( menuItem.css( "display" ) != "block" )
        {
          menuItem.fadeIn( 150 );
          _showFirstPreview();
          //ieZIndexFix( true );
        }
    }

    function _showFirstPreview() {
        $( "." + settings.previewItemClass, menuItem ).hide();
        previewItem = $( "." + settings.previewItemClass + ":first", menuItem );
        previewItem.show();
    }

    function _menuClose() {
        if (menuItem)
        {
          if ( newMenu == null )
          {
            //menuItem.slideUp( "fast", function() { ieZIndexFix( false ); } );
            menuItem.fadeOut( "fast" );
          }
          else
          {
            if ( newMenu.attr("id") != menuItem.attr("id") )
            {
              menuItem.fadeOut( 150 );
            }
          }
        }
    }

    function _startTimer() {
        closeTimer = window.setTimeout(_menuClose, timeout);
    }

    function _cancelTimer() {
        if (closeTimer) {
          window.clearTimeout(closeTimer);
          closeTimer = null;
        }
    }

    function _closeMenuByClick() {
        if (menuItem) {
          menuItem.fadeOut();
        }
    }

    function _showPreview() {
        if (prevPreviewLink) {
            prevPreviewLink.removeClass("hover");
        }
        $( this ).addClass("hover");
        prevPreviewLink = $( this );
        if ($( this ).attr("id").length != 0)
        {
            var idPreviewItem = "#" + $( this ).attr("id") + "-block";
            if ( previewItem != null )
            {
                previewItem.hide();
            }
            previewItem = $(idPreviewItem, menuItem);
            previewItem.show();
        }
    }

    function _bindEvents() {
        var menuButton   = $("li ." + settings.menuButtonClass, menu);
        var previewBlock = $("li ." + settings.previewBlockClass, menu);
        var previewLinks = $("ul a", previewBlock);
        menuButton.bind('mouseover', _menuOpen);
        menuButton.bind('mouseout',  _startTimer);
        previewBlock.bind('mouseover',  _cancelTimer);
        previewBlock.bind('mouseout',  _startTimer);
        previewLinks.bind('mouseover', _showPreview);
        document.onclick = _closeMenuByClick;
    }
}
