﻿// --------------------------------------------------------------------------------------------------------------------
// <copyright file="SessionTimeout.js" company="Wellpoint">
//   Copyright (c) Wellpoint Inc.  All rights reserved.
// </copyright>
// <summary>
//   Client script used by the SessionTimeout control.
//   Dependent on /Controls/Common/SessionTimeout.ascx
// </summary>
// --------------------------------------------------------------------------------------------------------------------

(function($) {

  $.SessionTimeoutControl = {
    // Declares the message types that this control will accept
    // This variable is used to setup the control with the observer
    acceptedMessagesTypes: 'ResetSessionTimeoutServer;ResetSessionTimeoutClient',
    controlIdentifier: 'SessionTimeout',
    sessionTimoutTimer: null,
    sessionWarningTimer: null,
    timeoutDialogVisible: false,
    endingSession: false,
    warningDialogCreated: false,
    timeoutDialogCreated: false,
    redirectingToTimout: false,
    sessionTimeoutMinutes: 15,
    sessionWarningMinutes: 2,
    loggedIn: false,
    timeoutReduceSeconds: 20,
    timeoutUrl: null,
    ADELogOffPageUrl: "/adelogoff"
  };

  // Handles the event that is raised when the page is loaded
  $(document).ready(function() {
    pageobserver.subscribe($.SessionTimeoutControl.handleObserverNotification, $.SessionTimeoutControl.acceptedMessagesTypes, $.SessionTimeoutControl.controlIdentifier);
    $.SessionTimeoutControl.readSettings();
    $.SessionTimeoutControl.startTimer();
    $.SessionTimeoutControl.displayTimeoutIfRedirected();

    // After every ajax call - reset the local timer
    $(document).ajaxSuccess(function(event, request, settings) {
      if ($.SessionTimeoutControl.timeoutDialogVisible != true && $.SessionTimeoutControl.endingSession != true) {
        $.SessionTimeoutControl.startTimer();
      }
    });
  });

  // Handle messages from other controls
  $.SessionTimeoutControl.handleObserverNotification = function(message) {
    var messagedata = JSON.parse(message);
    switch (messagedata.messagetype) {
      case "ResetSessionTimeoutServer":
        $.SessionTimeoutControl.resetSessionTimeoutServer();
        break;
      case "ResetSessionTimeoutClient":
        $.SessionTimeoutControl.resetSessionTimeoutClient();
        break;
      default:
        break;
    }
  };

  $.SessionTimeoutControl.resetSessionTimeoutServer = function() {
    $.ajax({
      type: "POST",
      url: "/ols/LogonService.asmx/ResetSessionTimeout",
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      dataFilter: function(response) {
        var jsonObject = JSON.parse(response);
        if (jsonObject.d) {
          jsonObject = jsonObject.d;
        }
        return JSON.stringify(jsonObject);
      },
      success: function(data) {
        $.SessionTimeoutControl.resetSessionTimeoutClient();
      },
      error: function(xhr, ajaxOptions, errorThrown) {
        // AJAX call failed
        // alert("Cannot reset session (" + (errorThrown ? errorThrown : xhr.Status) + ").");
      },
      async: true
    });
  };

  $.SessionTimeoutControl.logOff = function() {
    $.ajax({
      type: "POST",
      url: "/ols/LogonService.asmx/Logoff",
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      dataFilter: function(response) {
        var jsonObject = JSON.parse(response);
        if (jsonObject.d) {
          jsonObject = jsonObject.d;
        }
        return JSON.stringify(jsonObject);
      },
      success: function(data) {
      },
      error: function(xhr, ajaxOptions, errorThrown) {
        // AJAX call failed
        // alert("Cannot end session (" + (errorThrown ? errorThrown : xhr.Status) + ").");
      },
      async: false
    });
  };

  $.SessionTimeoutControl.endUserSession = function() {
    $.SessionTimeoutControl.endingSession = true;
    $.ajax({
      type: "POST",
      url: "/ols/LogonService.asmx/EndSession",
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      dataFilter: function(response) {
        var jsonObject = JSON.parse(response);
        if (jsonObject.d) {
          jsonObject = jsonObject.d;
        }
        return JSON.stringify(jsonObject);
      },
      success: function(data) {
      },
      error: function(xhr, ajaxOptions, errorThrown) {
        // AJAX call failed
        // alert("Cannot end session (" + (errorThrown ? errorThrown : xhr.Status) + ").");
      },
      async: false
    });
  };

  // Server has renewed the session - reset the client timers
  $.SessionTimeoutControl.resetSessionTimeoutClient = function(result) {
    $.SessionTimeoutControl.startTimer();
  };

  // Read the settings sent from the server control
  $.SessionTimeoutControl.readSettings = function() {
    try {
      var settings = JSON.parse($("#SessionTimeoutStorage").val());
      $.SessionTimeoutControl.sessionTimeoutMinutes = settings.TimeoutMinutes;
      $.SessionTimeoutControl.sessionWarningMinutes = settings.WarningMinutes;
      $.SessionTimeoutControl.loggedIn = settings.LoggedIn;
      $.SessionTimeoutControl.timeoutUrl = settings.TimeoutUrl;
    } catch (ex) {
      // alert("SessionTimoutStorage value not valid: " + $("#SessionTimeoutStorage").val());
      $.SessionTimeoutControl.sessionTimeoutMinutes = 15;
      $.SessionTimeoutControl.sessionWarningMinutes = 2;
      $.SessionTimeoutControl.loggedIn = false;
      $.SessionTimeoutControl.timeoutUrl = "/";
    }
  };

  // Stop the timeout timer
  $.SessionTimeoutControl.stopTimer = function() {
    clearTimeout($.SessionTimeoutControl.sessionTimoutTimer);
    clearTimeout($.SessionTimeoutControl.sessionWarningTimer);
  };

  // Start counting how much time is left
  $.SessionTimeoutControl.startTimer = function() {
    $.SessionTimeoutControl.stopTimer();
    $.SessionTimeoutControl.sessionTimoutTimer = setTimeout($.SessionTimeoutControl.displaySessionTimeout, ($.SessionTimeoutControl.sessionTimeoutMinutes * 1000 * 60) - ($.SessionTimeoutControl.timeoutReduceSeconds * 1000));
    $.SessionTimeoutControl.sessionWarningTimer = setTimeout($.SessionTimeoutControl.displaySessionWarning, (($.SessionTimeoutControl.sessionTimeoutMinutes - $.SessionTimeoutControl.sessionWarningMinutes) * 1000 * 60) - ($.SessionTimeoutControl.timeoutReduceSeconds * 1000));
  };

  // Session is about to timeout - display a warning
  $.SessionTimeoutControl.displaySessionWarning = function() {

    $("#WarningContinueButton").die();
    $("#WarningContinueButton").click(function() {
      $("#SessionTimeoutWarningDialog").dialog('close');
      return false;
    });

    if ($.SessionTimeoutControl.loggedIn) {
      $("#WarningLogoutButton").die();
      $("#WarningLogoutButton").click(function() {
        if ($.SessionTimeoutControl.timeoutUrl.indexOf($.SessionTimeoutControlADELogOffPageUrl) == -1) {
          $.SessionTimeoutControl.logOff();
        }
        $("#SessionTimeoutWarningDialog").dialog('close');
        document.location = $.SessionTimeoutControl.timeoutUrl; // Don't display the logged out message
        return false;
      });
    } else {
      $("#WarningLogoutButton").hide();
    }

    $.SessionTimeoutControl.displayTime($("#SessionTimeoutWarningDialog .SessionTimeoutMessageTime"));

    if ($.SessionTimeoutControl.warningDialogCreated == false) {
      $.SessionTimeoutControl.warningDialogCreated = true;
      $("#SessionTimeoutWarningDialog").dialog({
        showPrint: false,
        title: $("#SessionTimeoutWarningDialog h2").html(),
        modal: true,
        autoOpen: false,
        dialogClass: 'olsmodal',
        height: 150,
        position: 'center',
        close: function(event, ui) {
          if ($.SessionTimeoutControl.redirectingToTimout == false) {
            $.SessionTimeoutControl.resetSessionTimeoutServer();
          }
          $("#SessionTimeoutWarningDialog").dialog("destroy");
          $.SessionTimeoutControl.warningDialogCreated = false;
        }
      });
    }
    $.SessionTimeoutControl.redirectingToTimout = false;
    $("#SessionTimeoutWarningDialog").dialog('open');
  };

  // Session timed out - go to home page and display a message there
  $.SessionTimeoutControl.displaySessionTimeout = function() {
    $.SessionTimeoutControl.redirectingToTimout = true;
    $("#SessionTimeoutWarningDialog").dialog('close');
    if ($.SessionTimeoutControl.loggedIn) {
      if ($.SessionTimeoutControl.timeoutUrl.indexOf($.SessionTimeoutControlADELogOffPageUrl) == -1) {
        $.SessionTimeoutControl.logOff();
      }
    }
    document.location = $.SessionTimeoutControl.timeoutUrl + "#sessiontimeout-" + $.SessionTimeoutControl.loggedIn;

    // If we were already on the home page, then the following needs to open the timeout dialog
    // Since the document.location change above won't reload the page
    setTimeout(function() {
      $.SessionTimeoutControl.displayTimeout($.SessionTimeoutControl.loggedIn);
    }, (15 * 1000));
  };

  // Have we been redirected to a page that needs to display the timeout
  $.SessionTimeoutControl.displayTimeoutIfRedirected = function() {
    var stringIndex = document.location.hash.indexOf("sessiontimeout");
    if (stringIndex > -1) {
      var wasLoggedIn = document.location.hash.substring(stringIndex + 15);
      $.SessionTimeoutControl.displayTimeout(wasLoggedIn);
    }
  };

  // Display the timeout message, and remove the hash from the url
  $.SessionTimeoutControl.displayTimeout = function(wasLoggedIn) {

    $.SessionTimeoutControl.stopTimer();

    if (wasLoggedIn == "true") {
      $("#SessionTimeoutMessageLoggedOut").show();
      $("#SessionTimeoutMessage").hide();
    } else {
      $("#SessionTimeoutMessageLoggedOut").hide();
      $("#SessionTimeoutMessage").show();
    }

    $("#TimeoutCloseButton").die();
    $("#TimeoutCloseButton").click(function() {
      $("#SessionTimeoutDialog").dialog('close');
      return false;
    });

    $.SessionTimeoutControl.displayTime($("#SessionTimeoutDialog .SessionTimeoutMessageTime"));

    if ($.SessionTimeoutControl.timeoutDialogCreated == false) {
      $.SessionTimeoutControl.timeoutDialogCreated = true;
      $("#SessionTimeoutDialog").dialog({
        showPrint: false,
        title: $("#SessionTimeoutDialog h2").html(),
        modal: true,
        autoOpen: false,
        dialogClass: 'olsmodal',
        height: 130,
        position: 'center',
        close: function(event, ui) {
          if ($.SessionTimeoutControl.timeoutUrl.indexOf($.SessionTimeoutControlADELogOffPageUrl) == -1) {
            $.SessionTimeoutControl.endUserSession();
          }
          $.SessionTimeoutControl.timeoutDialogVisible = false;

          var newUrl = $.SessionTimeoutControl.timeoutUrl;
          if (newUrl.indexOf('?') > -1) {
            newUrl = newUrl + "&";
          }
          else {
            newUrl = $.SessionTimeoutControl.timeoutUrl + "?";
          }
          newUrl = newUrl + "reload=" + $.SessionTimeoutControl.getFormattedTimeForUrl(); // Remove hash and start new session
          document.location = newUrl;
        }
      });
    }
    $.SessionTimeoutControl.timeoutDialogVisible = true;
    $("#SessionTimeoutDialog").dialog('open');
  };

  // Format the current time and return as a string
  $.SessionTimeoutControl.getFormattedTimeForUrl = function() {
    var currentTime = new Date();
    var hours = currentTime.getHours();
    var minutes = currentTime.getMinutes();
    var seconds = currentTime.getSeconds();
    if (minutes < 10) {
      minutes = "0" + minutes;
    }
    if (seconds < 10) {
      seconds = "0" + seconds;
    }
    var formattedTime = hours + "_" + minutes + "_" + seconds;
    return formattedTime;
  };

  // Format the current time and return as a string
  $.SessionTimeoutControl.getFormattedTimeForDisplay = function() {
    var currentTime = new Date();
    var hours = currentTime.getHours();
    var minutes = currentTime.getMinutes();
    var suffix = " a.m.";
    if (hours >= 12) {
      suffix = " p.m.";
      hours = hours - 12;
    }
    if (hours == 0) {
      hours = 12;
    }
    if (minutes < 10) {
      minutes = "0" + minutes;
    }
    var formattedTime = hours + ":" + minutes + suffix;
    return formattedTime;
  };

  // Format the current time and insert into element html
  $.SessionTimeoutControl.displayTime = function(timeMessageElement) {
    timeMessageElement.html($.SessionTimeoutControl.getFormattedTimeForDisplay());
  };

})(jQuery);

