/// /* * timeout-dialog.js v1.0.1, 01-03-2012 * * @author: Rodrigo Neri (@rigoneri) * * (The MIT License) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* String formatting, you might want to remove this if you already use it. * Example: * * var location = 'World'; * alert('Hello {0}'.format(location)); */ String.prototype.format = function() { var s = this, i = arguments.length; while (i--) { s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]); } return s; }; !function($) { $.timeoutDialog = function(options) { var settings = { timeout: 0, countdown: 0, title: 'Your session is about to expire!', message: 'Due to inactivity, the system will log you out in {0} seconds.', question: 'Do you want to stay signed in?', keep_alive_button_text: 'Yes', sign_out_button_text: 'No', keep_alive_url: '/keep-alive', logout_url: null, logout_redirect_url: '/', restart_on_yes: true, dialog_width: 350 }; $.extend(settings, options); var TimeoutDialog = { init: function () { this.setupDialogTimer(); }, setupDialogTimer: function() { var self = this; window.setTimeout(function() { self.setupDialog(); }, (settings.timeout - settings.countdown) * 1000); }, setupDialog: function() { var self = this; self.destroyDialog(); $('
' + '

' + settings.message.format('' + settings.countdown + '') + '

' + '

' + settings.question + '

' + '
') .appendTo('body') .dialog({ modal: true, width: settings.dialog_width, minHeight: 'auto', zIndex: 10000, closeOnEscape: false, draggable: false, resizable: false, dialogClass: 'timeout-dialog', title: settings.title, buttons : { 'keep-alive-button' : { text: settings.keep_alive_button_text, id: "timeout-keep-signin-btn", click: function() { self.keepAlive(); } }, 'sign-out-button' : { text: settings.sign_out_button_text, id: "timeout-sign-out-button", click: function() { self.signOut(true); } } } }); $('.timeout-dialog').css('left', '35%'); $('.timeout-dialog').css('top', '40%'); self.startCountdown(); }, destroyDialog: function() { if ($("#timeout-dialog").length) { $(this).dialog("close"); $('#timeout-dialog').remove(); } }, startCountdown: function() { var self = this, counter = settings.countdown; this.countdown = window.setInterval(function() { counter -= 1; $("#timeout-countdown").html(counter); if (counter <= 0) { window.clearInterval(self.countdown); self.signOut(false); } }, 1000); }, keepAlive: function() { var self = this; this.destroyDialog(); window.clearInterval(this.countdown); $.get(settings.keep_alive_url, function (data) { if (settings.restart_on_yes) { self.setupDialogTimer(); } }); }, signOut: function(is_forced) { var self = this; this.destroyDialog(); if (settings.logout_url != null) { $.post(settings.logout_url, function(data){ self.redirectLogout(is_forced); }); } else { self.redirectLogout(is_forced); } }, redirectLogout: function(is_forced){ var target = settings.logout_redirect_url; if (!is_forced) target += '&timeout=t'; window.location = target; } }; TimeoutDialog.init(); }; }(window.jQuery);