jQuery.fn.cooltip = function( options ) { var element = $(this); if (this.cooltipped) return; var settings = { wrapper : element, link : null, tip : null, callback : { show : function() {}, hide : function() {} } }; if (options) $.extend(settings, options); var cooltip = this; $.extend( cooltip, options ); // this.settings = settings; cooltip.hidetimeout = null; cooltip.showtimeout = null; $(cooltip.link).bind('mouseover.namespace', function() { cooltip.set_showtimeout( function() { $(cooltip.tip).fadeIn(300); setTimeout( settings.callback.show, 300 ); } ); }); $(cooltip.link).bind('mouseout.namespace', function() { cooltip.clear_showtimeout(); cooltip.set_hidetimeout( function() { $(cooltip.tip).hide(); settings.callback.hide() } ) }); $(cooltip.tip).bind('mouseover.namespace', function(event) { cooltip.clear_hidetimeout(); }); $(cooltip.tip).bind('mouseout.namespace', function(event) { cooltip.set_hidetimeout( function() { $(cooltip.tip).hide(); } ) }); $(cooltip.tip).find('*').bind('mouseover.namespace', function(event) { cooltip.clear_hidetimeout(); }); cooltip.set_showtimeout = function( func ) { cooltip.showtimeout = setTimeout(func, 500); } cooltip.clear_showtimeout = function() { clearTimeout( cooltip.showtimeout ); } cooltip.set_hidetimeout = function( func ) { cooltip.hidetimeout = setTimeout(func, 500); } cooltip.clear_hidetimeout = function() { clearTimeout( cooltip.hidetimeout ); } this.cooltipped = true; }