Merge "Whitelist the <wbr> element."
[mediawiki.git] / resources / jquery / jquery.delayedBind.js
blob40f3d44eb5df9bbe00a08a7c1f024c04b46c22e4
1 ( function ( $ ) {
2 /**
3  * Function that escapes spaces in event names. This is needed because
4  * "_delayedBind-foo bar-1000" refers to two events
5  */
6 function encodeEvent( event ) {
7         return event.replace( /-/g, '--' ).replace( / /g, '-' );
10 $.fn.extend( {
11         /**
12          * Bind a callback to an event in a delayed fashion.
13          * In detail, this means that the callback will be called a certain
14          * time after the event fires, but the timer is reset every time
15          * the event fires.
16          * @param timeout Number of milliseconds to wait
17          * @param event Name of the event (string)
18          * @param data Data to pass to the event handler (optional)
19          * @param callback Function to call
20          */
21         delayedBind: function ( timeout, event, data, callback ) {
22                 if ( arguments.length === 3 ) {
23                         // Shift optional parameter down
24                         callback = data;
25                         data = undefined;
26                 }
27                 var encEvent = encodeEvent( event );
28                 return this.each( function () {
29                         var that = this;
30                         // Bind the top half
31                         // Do this only once for every (event, timeout) pair
32                         if (  !( $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout ) ) ) {
33                                 $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout, true );
34                                 $(this).bind( event, function () {
35                                         var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout );
36                                         // Cancel the running timer
37                                         if ( timerID !== null ) {
38                                                 clearTimeout( timerID );
39                                         }
40                                         timerID = setTimeout( function () {
41                                                 $(that).trigger( '_delayedBind-' + encEvent + '-' + timeout );
42                                         }, timeout );
43                                         $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout, timerID );
44                                 } );
45                         }
47                         // Bottom half
48                         $(this).bind( '_delayedBind-' + encEvent + '-' + timeout, data, callback );
49                 } );
50         },
52         /**
53          * Cancel the timers for delayed events on the selected elements.
54          */
55         delayedBindCancel: function ( timeout, event ) {
56                 var encEvent = encodeEvent( event );
57                 return this.each( function () {
58                         var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout );
59                         if ( timerID !== null ) {
60                                 clearTimeout( timerID );
61                         }
62                 } );
63         },
65         /**
66          * Unbind an event bound with delayedBind()
67          */
68         delayedBindUnbind: function ( timeout, event, callback ) {
69                 var encEvent = encodeEvent( event );
70                 return this.each( function () {
71                         $(this).unbind( '_delayedBind-' + encEvent + '-' + timeout, callback );
72                 } );
73         }
74 } );
76 }( jQuery ) );