( function( $ ) {
   var intentManager = function( domElement, settings ) {
      var that       = this;
      var domElement = $( domElement );

      domElement.mouseenter( function() {
         window.clearTimeout( that.leaveTimer );
         if( settings.enter.callback ) {
            that.enterTimer = window.setTimeout( function() {
               settings.enter.callback.apply(
                  settings.enter.context ? settings.enter.context : domElement,
                  settings.enter.args ? settings.enter.args : []
               );
            }, settings.enter.delay );
         }
      } );

      domElement.mouseleave( function() {
         window.clearTimeout( that.enterTimer );
         if( settings.leave.callback ) {
            that.leaveTimer = window.setTimeout( function() {
               settings.leave.callback.apply(
                  settings.leave.context ? settings.leave.context : domElement,
                  settings.leave.args ? settings.leave.args : []
               );
            }, settings.leave.delay );
         }
      } );
   }

   $.fn.myHoverIntent = function( options ) {
      var settings = $.extend( true, {
         enter : {
            delay : 1000
         },
         leave : {
            delay : 1000
         }
      }, options );

      this.map( function() {
         new intentManager( this, settings );
      } );

      return this;
   }
} )( jQuery );
