hjg
2024-07-09 30304784e82d4bba24121328da8eb8490aec4f4f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/*
 * jQuery Idle Timeout 1.2
 * Copyright (c) 2011 Eric Hynds
 *
 * http://www.erichynds.com/jquery/a-new-and-improved-jquery-idle-timeout-plugin/
 *
 * Depends:
 *  - jQuery 1.4.2+
 *  - jQuery Idle Timer (by Paul Irish, http://paulirish.com/2009/jquery-idletimer-plugin/)
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
*/
 
(function($, win){
    
    var idleTimeout = {
        init: function( element, resume, options ){
            var self = this, elem;
 
            this.warning = elem = $(element);
            this.resume = $(resume);
            this.options = options;
            this.countdownOpen = false;
            this.failedRequests = options.failedRequests;
            this._startTimer();
              this.title = document.title;
            
            // expose obj to data cache so peeps can call internal methods
            $.data( elem[0], 'idletimeout', this );
            
            // start the idle timer
            $.idleTimer(options.idleAfter * 1000);
            
            // once the user becomes idle
            $(document).bind("idle.idleTimer", function(){
                
                // if the user is idle and a countdown isn't already running
                if( $.data(document, 'idleTimer') === 'idle' && !self.countdownOpen ){
                    self._stopTimer();
                    self.countdownOpen = true;
                    self._idle();
                }
            });
            
            // bind continue link
            this.resume.bind("click", function(e){
                e.preventDefault();
                
                win.clearInterval(self.countdown); // stop the countdown
                self.countdownOpen = false; // stop countdown
                self._startTimer(); // start up the timer again
                self._keepAlive( false ); // ping server
                options.onResume.call( self.warning ); // call the resume callback
            });
        },
        
        _idle: function(){
            var self = this,
                options = this.options,
                warning = this.warning[0],
                counter = options.warningLength;
                
            // fire the onIdle function
            options.onIdle.call(warning);
            
            // set inital value in the countdown placeholder
            options.onCountdown.call(warning, counter);
            
            // create a timer that runs every second
            this.countdown = win.setInterval(function(){
                if(--counter === 0){
                    window.clearInterval(self.countdown);
                    options.onTimeout.call(warning);
                } else {
                    options.onCountdown.call(warning, counter);
          document.title = options.titleMessage.replace('%s', counter) + self.title;
                }
            }, 1000);
        },
        
        _startTimer: function(){
            var self = this;
 
            this.timer = win.setTimeout(function(){
                self._keepAlive();
            }, this.options.pollingInterval * 1000);
        },
        
        _stopTimer: function(){
            // reset the failed requests counter
            this.failedRequests = this.options.failedRequests;
            win.clearTimeout(this.timer);
        },
        
        _keepAlive: function( recurse ){
            var self = this,
                options = this.options;
                
            //Reset the title to what it was.
            document.title = self.title;
            
            // assume a startTimer/keepAlive loop unless told otherwise
            if( typeof recurse === "undefined" ){
                recurse = true;
            }
            
            // if too many requests failed, abort
            if( !this.failedRequests ){
                this._stopTimer();
                options.onAbort.call( this.warning[0] );
                return;
            }
            
            $.ajax({
                timeout: options.AJAXTimeout,
                url: options.keepAliveURL,
                error: function(){
                    self.failedRequests--;
                },
                success: function(response){
                    if($.trim(response) !== options.serverResponseEquals){
                        self.failedRequests--;
                    }
                },
                complete: function(){
                    if( recurse ){
                        self._startTimer();
                    }
                }
            });
        }
    };
    
    // expose
    $.idleTimeout = function(element, resume, options){
        idleTimeout.init( element, resume, $.extend($.idleTimeout.options, options) );
        return this;
    };
    
    // options
    $.idleTimeout.options = {
        // number of seconds after user is idle to show the warning
        warningLength: 30,
        
        // url to call to keep the session alive while the user is active
        keepAliveURL: "",
        
        // the response from keepAliveURL must equal this text:
        serverResponseEquals: "OK",
        
        // user is considered idle after this many seconds.  10 minutes default
        idleAfter: 600,
        
        // a polling request will be sent to the server every X seconds
        pollingInterval: 60,
        
        // number of failed polling requests until we abort this script
        failedRequests: 5,
        
        // the $.ajax timeout in MILLISECONDS!
        AJAXTimeout: 250,
        
        // %s will be replaced by the counter value
        titleMessage: 'Warning: %s seconds until log out | ',
        
        /*
            Callbacks
            "this" refers to the element found by the first selector passed to $.idleTimeout.
        */
        // callback to fire when the session times out
        onTimeout: $.noop,
        
        // fires when the user becomes idle
        onIdle: $.noop,
        
        // fires during each second of warningLength
        onCountdown: $.noop,
        
        // fires when the user resumes the session
        onResume: $.noop,
        
        // callback to fire when the script is aborted due to too many failed requests
        onAbort: $.noop
    };
    
})(jQuery, window);