/* * 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);