diff options
Diffstat (limited to 'rt/share/static/js/jquery.event.hover-1.0.js')
-rw-r--r-- | rt/share/static/js/jquery.event.hover-1.0.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/rt/share/static/js/jquery.event.hover-1.0.js b/rt/share/static/js/jquery.event.hover-1.0.js new file mode 100644 index 000000000..6883ad21d --- /dev/null +++ b/rt/share/static/js/jquery.event.hover-1.0.js @@ -0,0 +1,85 @@ +;(function($){ // secure $ jQuery alias +/*******************************************************************************************/ +// jquery.event.hover.js - rev 5 +// Copyright (c) 2008, Three Dub Media (http://threedubmedia.com) +// Liscensed under the MIT License (MIT-LICENSE.txt) +// http://www.opensource.org/licenses/mit-license.php +// Created: 2008-06-02 | Updated: 2008-07-30 +/*******************************************************************************************/ + +// USE THESE PROPERTIES TO CUSTOMIZE SETTINGS... + +// $.event.special.hover.delay = 100; +// Defines the delay (msec) while mouse is inside the element before checking the speed + +// $.event.special.hover.speed = 100; +// Defines the maximum speed (px/sec) the mouse may be moving to trigger the hover event + +// save the old jquery "hover" method +$.fn._hover = $.fn.hover; + +// jquery method +$.fn.hover = function( fn1, fn2, fn3 ) { + if ( fn3 ) this.bind('hoverstart', fn1 ); // 3 args + if ( fn2 ) this.bind('hoverend', fn3 ? fn3 : fn2 ); // 2+ args + return !fn1 ? this.trigger('hover') // 0 args + : this.bind('hover', fn3 ? fn2 : fn1 ); // 1+ args + }; + +// special event configuration +var hover = $.event.special.hover = { + delay: 100, // milliseconds + speed: 100, // pixels per second + setup: function( data ){ + data = $.extend({ speed: hover.speed, delay: hover.delay, hovered:0 }, data||{} ); + $.event.add( this, "mouseenter mouseleave", hoverHandler, data ); + }, + teardown: function(){ + $.event.remove( this, "mouseenter mouseleave", hoverHandler ); + } + }; + +// shared event handler +function hoverHandler( event ){ + var data = event.data || event; + switch ( event.type ){ + case 'mouseenter': // mouseover + data.dist2 = 0; // init mouse distance² + data.event = event; // store the event + event.type = "hoverstart"; // hijack event + if ( $.event.handle.call( this, event ) !== false ){ // handle "hoverstart" + data.elem = this; // ref to the current element + $.event.add( this, "mousemove", hoverHandler, data ); // track the mouse + data.timer = setTimeout( compare, data.delay ); // start async compare + } + break; + case 'mousemove': // track the event, mouse distance² = x² + y² + data.dist2 += Math.pow( event.pageX-data.event.pageX, 2 ) + + Math.pow( event.pageY-data.event.pageY, 2 ); + data.event = event; // store current event + break; + case 'mouseleave': // mouseout + clearTimeout( data.timer ); // uncompare + if ( data.hovered ){ + event.type = "hoverend"; // hijack event + $.event.handle.call( this, event ); // handle "hoverend" + data.hovered--; // reset flag + } + else $.event.remove( data.elem, "mousemove", hoverHandler ); // untrack + break; + default: // timeout compare // distance² = x² + y² = ( speed * time )² + if ( data.dist2 <= Math.pow( data.speed*( data.delay/1e3 ), 2 ) ){ // speed acceptable + $.event.remove( data.elem, "mousemove", hoverHandler ); // untrack + data.event.type = "hover"; // hijack event + if ( $.event.handle.call( data.elem, data.event ) !== false ) // handle "hover" + data.hovered++; // flag for "hoverend" + } + else data.timer = setTimeout( compare, data.delay ); // async recurse + data.dist2 = 0; // reset distance² for next compare + break; + } + function compare(){ hoverHandler( data ); }; // timeout/recursive function + }; + +/*******************************************************************************************/ +})(jQuery); // confine scope
\ No newline at end of file |