    var AWSessionTime;              
    var AWSessionWarningInterval;   
    var AWSessionTimeoutUrl;        
    var AWSessionExpTime;           
    var AWSessionWarningTime;       
    var AWSessionKeepAliveEnabled = false;
    var AWSessionTimeout;                   
    var AWSessionKeepAliveTimeout;          
    var AWSessionKeepAliveUpdateTimeout;    
    var AWShowSessionKeepAliveDiv = false;
    function awInitSessionTimeout (sessionWarningInterval, sessionTime, sessionTimeoutUrl)
    {
        AWSessionTime = sessionTime;
        AWSessionTimeoutUrl = sessionTimeoutUrl;
        AWSessionWarningInterval = sessionWarningInterval;
        awDomRegisterRefreshCallback(awStartInactivityTimer);
    }
    function awInitSessionKeepAlive ()
    {
        AWSessionKeepAliveEnabled = true;
        awStartKeepAliveTimer();
    }
    function awStartInactivityTimer ()
    {
        if (AWIsSessionWarningActive) {
            return;
        }
        awClearInactivityTimer();
        var sessionWarningTime = AWSessionTime - AWSessionWarningInterval;
        AWSessionTimeout = setTimeout(awSessionExpirationWarning, sessionWarningTime);
        var d = new Date();
        var currentTime = d.getTime();
        AWSessionExpTime = currentTime + AWSessionTime;
        AWSessionWarningTime = currentTime + sessionWarningTime;
    }
    function awClearInactivityTimer ()
    {
        if (AWSessionTimeout)
        {
            clearTimeout(AWSessionTimeout);
            AWSessionTimeout = null;
        }
    }
    var AWSessionExpirationDiv;
    var AWSessionExpirationCountdownDiv;
    var AWSessionTimeoutCountdown;
    var AWIsSessionWarningActive = false;
    function awSessionExpirationWarning ()
    {
        window.focus();
        AWSessionExpirationDiv = awgetElementById("AWSessionExpirationDiv");
        AWIsSessionWarningActive = true;
        if (awChildrenNeedLoading(AWSessionExpirationDiv)) {
            awloadLazyChildren(AWSessionExpirationDiv);
        }
        else {
            awSessionExpirationWarningLoaded();
        }
    }
    function awAWExtendSessionButtonCellFocus ()
    {
        var cell = awgetElementById("AWExtendSessionButtonCell");
        if (cell && cell.focus) {
            cell.focus();
        }
    }
    function awExtendSessionButtonFocus ()
    {
        var cell = awgetElementById("AWExtendSessionButtonCell");
        var button = _awFindChild(cell,"TD");
        button.focus();
    }
    var AWSessionExpirationDocClick;
    function awSessionExpirationWarningLoaded ()
    {
        awShowDialogDiv(AWSessionExpirationDiv, awDisablePage);
        var d = new Date();
        var currentTime = d.getTime();
        AWSessionExpirationCountdownDiv = awgetElementById("AWSessionExpirationTime");
        AWSessionTimeoutCountdown = m2s(AWSessionExpTime - currentTime);
        awSessionExpirationCountdown();
        awAWExtendSessionButtonCellFocus();
        AWSessionExpirationDocClick = window.document.onclick;
        window.document.onclick = awAWExtendSessionButtonCellFocus;
    }
    function awSessionExpirationCountdown ()
    {
        if (AWSessionTimeoutCountdown < 1) {
            awSetLocation(AWSessionTimeoutUrl);
        }
        else {
            AWSessionExpirationCountdownDiv.innerHTML = AWSessionTimeoutCountdown;
            AWSessionTimeout = setTimeout(awSessionExpirationCountdown, 1000);
            AWSessionTimeoutCountdown--;
        }
    }
    function awSetLocation (url)
    {
        top.location.href=url;
    }
    function awExtendSession ()
    {
        AWIsSessionWarningActive = false;
        if (!AWSessionKeepAliveEnabled) {
            awInitiateKeepAliveRequest(AWStandaloneSessionKeepAliveUrl);
        }
        if (AWSessionExpirationDiv) {
            awHideDialogDiv(AWSessionExpirationDiv);
            window.document.onclick = AWSessionExpirationDocClick;
            AWSessionExpirationDocClick = null;
            AWSessionExpirationDiv = null;
        }
        awEnablePage();
        awStartInactivityTimer();
    }
    function awStartKeepAliveTimer ()
    {
        if (AWSessionKeepAliveTimeout) {
            alert("existing keep alive timer");
        }
        else {
            var d = new Date();
            var currentTime = d.getTime();
            if (!AWSessionKeepAliveTime) {
                AWSessionKeepAliveTime = -1;
            }
            else {
                AWSessionKeepAliveTime = parseInt(AWSessionKeepAliveTime);
            }
            if (AWSessionKeepAliveTime < currentTime) {
                awDomRegisterUpdateCompleteCallback(awInitiateAuthKeepAlive);
                return;
            }
            else {
                var timeout = AWSessionKeepAliveTime - currentTime;
                AWSessionKeepAliveTimeout = setTimeout(awInitiateAuthKeepAlive, timeout);
            }
        }
    }
    var AWCurrentKeepAliveTime;
    function awKeepAliveTimeUpdateTimer ()
    {
        if (AWSessionKeepAliveTime == AWCurrentKeepAliveTime) {
            AWSessionKeepAliveUpdateTimeout =
                setTimeout(awKeepAliveTimeUpdateTimer, 1000);
        }
        else {
            clearTimeout(AWSessionKeepAliveTimeout);
            AWSessionKeepAliveTimeout = null;
            awCompleteKeepAliveRequest();
            awStartKeepAliveTimer();
            awDebugSessionManagement();
        }
    }
    function awInitiateAuthKeepAlive ()
    {
        if (AWSessionKeepAliveDebugTimeout) {
            clearTimeout(AWSessionKeepAliveDebugTimeout);
        }
        AWCurrentKeepAliveTime = AWSessionKeepAliveTime;
        awInitiateKeepAliveRequest(AWSessionKeepAliveUrl);
        AWSessionKeepAliveUpdateTimeout = setTimeout(awKeepAliveTimeUpdateTimer, 1000);
    }
    var AWSessionKeepAliveDebugTimeout;
    function awDebugSessionManagement ()
    {
        var d = new Date();
        var currentTime = d.getTime();
        var msg = "<a href='#' onmousedown='awSessionExpirationWarning();'>(timeout)</a>"+
                  "Session timeout: " + m2s(AWSessionExpTime - currentTime) + " seconds"+
                  " / warning: " + m2s(AWSessionWarningTime - currentTime) + " seconds<br/>";
        if (AWSessionKeepAliveEnabled) {
            if (AWSessionKeepAliveTime) {
                AWSessionKeepAliveTime = parseInt(AWSessionKeepAliveTime);
                var timeout = AWSessionKeepAliveTime - currentTime;
            }
            msg += "<a href='#' onmousedown='awInitiateAuthKeepAlive();'>(keepalive)</a>"+
                   "Next keep alive: " + new Date(AWSessionKeepAliveTime) +
                   " Keep alive timeout: " + m2s(timeout);
        } else {
            msg +="Session Keep Alive disabled.  Using app server session management.";
        }
        var iframeDiv = awgetElementById("AWSessionManagementDebugDiv");
        if (!iframeDiv) {
            return;
        }
        iframeDiv.innerHTML = msg;
        AWSessionKeepAliveDebugTimeout = setTimeout(awDebugSessionManagement, 1000);
    }
    function awUpdateClientKeepAlive (sessionKeepAliveTime)
    {
        try {
            parent.parent.AWSessionKeepAliveTime = sessionKeepAliveTime;
        }
        catch (e) {
        }
    }
    function m2s (m)
    {
        return (m-m%1000)/1000;
    }
    function awCompleteKeepAliveRequest ()
    {
        var iframeDiv = awgetElementById("AWSessionKeepAliveDiv");
        if (document && document.body) {
            document.body.removeChild(iframeDiv);
        }
        else {
            alert(getCaller() + " unable to find document / document.body");
        }
    }
    function awInitiateKeepAliveRequest (url)
    {
        var iframeDiv = awgetElementById("AWSessionKeepAliveDiv");
        if (!iframeDiv) {
            iframeDiv = document.createElement("div");
            iframeDiv.id = "AWSessionKeepAliveDiv";
            iframeDiv.style.display="none";
            if (document && document.body) {
                document.body.appendChild(iframeDiv);
            }
            else {
                alert("unable to find document / document.body");
            }
        }
        var height = AWShowSessionKeepAliveDiv ? "height='300px'" : " height='0px' width='0px'";
        iframeDiv.innerHTML = "<iframe src='" + url + "' id='AWSessionManagement' name='AWSessionManagement' style='border:0px'" + height +"></iframe>";
    }
    function awgetElementById (id)
    {
        var element = document.getElementById ?
                            document.getElementById(id) :
                            document.all[id];
        return element;
    }
