Merge "Set visibility on class properties of UnregisteredLocalFile"
[lhc/web/wiklou.git] / resources / jquery / jquery.delayedBind.js
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, '-' );
8 }
9
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 }
46
47 // Bottom half
48 $(this).bind( '_delayedBind-' + encEvent + '-' + timeout, data, callback );
49 } );
50 },
51
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 },
64
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 } );
75
76 }( jQuery ) );