﻿/*
Copyright 2008 Safetec Compliance Systems, Inc.
*/
/// <reference path="~/App_Javascript/jquery.min.js" />

var timeoutMinutes = 15;
var pingInterval = timeoutMinutes - 3;
var sessionTimeout;
var lastUserEvent;
var lastPing;
var nextPing;
var sessionDialogOpen = false;
var sessionDialog;
var sessionAboutToExpireMessage = "Your session is about to expire!";
var continueWithMyCurrentSessionMessage = "Continue with my current session";
var logOutAndEndMySessionMessage = "Log out and end my session";
var logInToStartANewSessionMessage = "Log in to start a new session";
var yourSessionExpiredMessage = "Your session expired";
var yourSessionExpiredFullMessage = "Your session has expired and you have been logged out. For security, online sessions expire automatically after {0} minutes of inactivity."
var yourSessionExpiredShortMessage = "Your session expired after {0} minutes of inactivity";
var sessionAboutToExpireFullMessage = "Your current session is about to expire. For security, online sessions expire automatically after {0} minutes of inactivity."
var sessionAboutToExpireShortMessage = "Your session will expire in {0} minutes."

var sessionAspForm = theForm;

$(document).ready(function () {

    if (jqSettings.session) {
        timeoutMinutes = jqSettings.session.timeout || timeoutMinutes;
        pingInterval = jqSettings.session.pingInterval || pingInterval;
        sessionAboutToExpireMessage = jqSettings.session.sessionAboutToExpireMessage || sessionAboutToExpireMessage;
        continueWithMyCurrentSessionMessage = jqSettings.session.continueWithMyCurrentSessionMessage || continueWithMyCurrentSessionMessage;
        logOutAndEndMySessionMessage = jqSettings.session.logOutAndEndMySessionMessage || logOutAndEndMySessionMessage;
        logInToStartANewSessionMessage = jqSettings.session.logInToStartANewSessionMessage || logInToStartANewSessionMessage;
        yourSessionExpiredMessage = jqSettings.session.yourSessionExpiredMessage || yourSessionExpiredMessage;
        yourSessionExpiredFullMessage = jqSettings.session.yourSessionExpiredFullMessage || yourSessionExpiredFullMessage;
        yourSessionExpiredShortMessage = jqSettings.session.yourSessionExpiredShortMessage || yourSessionExpiredShortMessage;
        sessionAboutToExpireFullMessage = jqSettings.session.sessionAboutToExpireFullMessage || sessionAboutToExpireFullMessage;
        sessionAboutToExpireShortMessage = jqSettings.session.sessionAboutToExpireShortMessage || sessionAboutToExpireShortMessage;
    }

    lastUserEvent = new Date();
    lastPing = new Date();
    nextPing = addSeconds(lastPing, pingInterval * 60);
    sessionTimeout = addSeconds(lastPing, timeoutMinutes * 60);

    $(this).click(function () { lastUserEvent = new Date(); }); // Detect Mouse
    $(this).keydown(function () { lastUserEvent = new Date(); }); // Detect Keyboard
    $(this).mouseover(function () { lastUserEvent = new Date(); }); // Detect mouse movement

    setTimeout("sessionCheck()", 1000);

    $(document).keydown(function (event) { keyboardHandler(event); })
});

function sessionCheck() {
    var now = new Date();

    if (now >= nextPing && now < sessionTimeout) {
        if (sessionDialogOpen == false) {
            if (lastUserEvent > lastPing) {
                ping();
            } else {
                sessionAlert();
            }
        }

        setTimeout("sessionCheck()", 1000);

    } else if (now >= sessionTimeout) {
        if (sessionDialog != undefined) { sessionClosed(); }
    } else {

        setTimeout("sessionCheck()", 1000);
    }
}

function sessionClosed() {

    sessionDialog = $(document.createElement('div'));
    sessionDialog.addClass('session-dialog');

    sessionDialog.append("<h1>" + yourSessionExpiredMessage + "</h1>");
    sessionDialog.append("<p>" + yourSessionExpiredFullMessage + "</p>");
    sessionDialog.append("<h2>" + yourSessionExpiredShortMessage + "</h2>");

    sessionDialog.append("<div class='options'>");

    var btnLogin = $(document.createElement('a'));
    btnLogin.html(logInToStartANewSessionMessage);
    btnLogin.addClass('session-dialog-ok');
    btnLogin.attr('href', '/Login.aspx?signout=1');

    sessionDialog.append("</div>");
    sessionDialog.append(btnLogin);

    sessionDialog.dialog2();
    sessionDialog.dialog2.show();

    sessionDialog.dialog2.setOverlayStyle({ opacity: .9 });

    $("body").addClass("session-closed");

}

function sessionAlert() {

    sessionDialog = $(document.createElement('div'));
    sessionDialog.addClass('session-dialog');

    sessionDialog.append("<h1>" + sessionAboutToExpireMessage + "</h1>");
    sessionDialog.append("<p>" + sessionAboutToExpireFullMessage + "</p>");
    sessionDialog.append("<h2>" + sessionAboutToExpireShortMessage + "</h2>");
    sessionDialog.append("<div class='options'>");

    var btnOk = $(document.createElement('a'));
    btnOk.html(continueWithMyCurrentSessionMessage);
    btnOk.addClass('session-dialog-ok');
    btnOk.click(function() {
        ping();
        lastUserEvent = new Date();
        sessionDialog.dialog2.close();
        sessionDialogOpen = false;
    });

    var btnCancel = $(document.createElement('a'));
    btnCancel.html(logOutAndEndMySessionMessage);
    btnCancel.addClass('session-dialog-cancel');
    btnCancel.attr('href','/Login.aspx?signout=1');

    sessionDialog.append("</div>");

    sessionDialog.append(btnOk);
    sessionDialog.append(btnCancel);

    sessionDialog.dialog2()
    sessionDialog.dialog2.show();
    sessionDialogOpen = true;
}

function ping() {
    $.get("../App_SecuredMethods/Ping.aspx?anticache=" + Math.random(), function(s) { });
    lastPing = new Date();
    nextPing = addSeconds(lastPing, pingInterval * 60);
    sessionTimeout = addSeconds(lastPing, timeoutMinutes * 60);
}

function addSeconds(d, seconds) {
    var newTime = new Date(d.valueOf())
    newTime.setSeconds(newTime.getSeconds() + seconds);
    return newTime
}

var keyQueue = "";
var keyQueueLen = 4;
function keyboardHandler(event) {
    event = event.originalEvent ? event.originalEvent : event; /*fix*/
    if (event.altKey && !(event.keyCode == 18)) {
        keyQueue = Right(keyQueue + String.fromCharCode(event.keyCode), keyQueueLen);
        if (Right(keyQueue, 3) == String.fromCharCode(81) + String.fromCharCode(81) + String.fromCharCode(81)) {
            keyQueue = "";
        }
    }
}

function Right(str, n) {
    if (n <= 0)
        return "";
    else if (n > String(str).length)
        return str;
    else {
        var iLen = String(str).length;
        return String(str).substring(iLen, iLen - n);
    }
}


