( function( $ ) {
  $.fn.velvetMenu = function( options ) {
    var defaults = {
      'item' : '.item',
      'speed': 'fast',
      'wrap' : 'div'
    };
    var options = $.extend( defaults, options );
    var items = [];

    $( this ).find( options.item ).each( function( i ) {
      var me = $( this ),
          menuWrap = me.find( options.wrap ),
          menu = menuWrap.find( 'ul' ),
          cid = 'vm-item-'+ i;

      me.attr( 'id', cid );

      me.hover(
          function( event ) { menuWrap.fadeIn( options.speed );  },
          function( event ) { menuWrap.fadeOut( options.speed ); }
      );

      var wrapMin = parseInt( menuWrap.css( 'marginTop' ) ),
          wrapMax = menuWrap.height() + wrapMin,
          wrapTop = ( menuWrap.offset() ).top;
          y = 0,
          menuMax = menu.height() - wrapMax - wrapMin,
          wRatio = 0, mRatio = 0;

      items[cid] = [];
      items[cid]['wrapMin'] = wrapMin;
      items[cid]['wrapMax'] = wrapMax;
      items[cid]['wrapTop'] = wrapTop;
      items[cid]['menuMax'] = menuMax;

      if ( menuMax > 0 ) {
        me.mousemove( function( event ) {
          var wrapMin = items[cid]['wrapMin'];
          var wrapMax = items[cid]['wrapMax'];
          var wrapTop = items[cid]['wrapTop'];
          var menuMax = items[cid]['menuMax'];
          y = event.pageY - wrapTop;

          if ( y >= wrapMin && y <= wrapMax ) {
            wRatio = parseInt( ( y - wrapMin ) * 100 / ( wrapMax - wrapMin ) );
            mRatio = parseInt( menuMax * wRatio / 100 );
            menu.css( 'top', -mRatio );
          }
        } );
      }

      menuWrap.hide();
    } );
  }
} )( jQuery );
