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