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