if (typeof SessionRefresh == 'undefined') {

    var ajaxCaller = {
        ajaxGetText: function(url, callbackFunction) {
            var xReq = this._createXMLHttpRequest();
            var call = {
                xReq: xReq,
                callbackFunction: callbackFunction,
                url: url
            };
            xReq.onreadystatechange = function() {
                ajaxCaller._onResponseStateChange(call);
            }
            xReq.open("GET", url, true);
            xReq.send(null);
        },
        _onResponseStateChange: function(call) {
            var xReq = call.xReq;
            if (xReq.readyState == 4) {
                var callbackFunction = call.callbackFunction;
                callbackFunction(xReq.responseText);
            }
        },
        _tryThese: function() {
            for (var i = 0; i < arguments.length; i++) {
                var lambda = arguments[i];
                try {
                    return lambda();
                } catch (e) {}
            }
        },
        _createXMLHttpRequest: function() {
            return this._tryThese(
                    function() {return new XMLHttpRequest()},
                    function() {return new ActiveXObject('Msxml2.XMLHTTP')},
                    function() {return new ActiveXObject('Microsoft.XMLHTTP')}
                    ) || false;
        }
    };

    var SessionRefresh = {
        refreshInterval: null,
        _addOnloadEvent: function(callback) {
            if (window.addEventListener) {
                window.addEventListener("load", callback, false);
            } else if (window.attachEvent) {
                window.attachEvent("onload", callback);
            } else if (document.getElementById) {
                window.onload = callback;
            }
        },
        _callRefreshServlet: function(action, callbackFunction) {
            var timestamp = new Date().getTime();
            var url = "/banka/__session__keepalive?timestamp=" + timestamp + "&action=" + action;
            ajaxCaller.ajaxGetText(url, function(responseText) {
                try {
                    var responseJSON = eval('(' + responseText + ')');
                    callbackFunction(responseJSON);
                } catch (e) {}
            });
        },
        init: function(keepaliveEnabled, refreshInterval) {
            this.keepaliveEnabled = keepaliveEnabled;
            this.refreshInterval = refreshInterval;
            this.scheduleNextRefresh();
        },
        scheduleNextRefresh: function() {
            if (this.keepaliveEnabled) {
                window.setTimeout(this._refreshConnection, this.refreshInterval);
            }
        },
        _refreshConnection: function() {
            SessionRefresh._callRefreshServlet("keepalive", function(responseJSON) {
                if (responseJSON.keepaliveEnabled) {
                    SessionRefresh.scheduleNextRefresh();
                }
            });
        },
        _asyncInit: function() {
            SessionRefresh._callRefreshServlet("init", function(responseJSON) {
                SessionRefresh.init(responseJSON.keepaliveEnabled, responseJSON.refreshInterval);
            });
        },
        delayedInit: function(delay) {
            this._addOnloadEvent(function() {
                window.setTimeout(SessionRefresh._asyncInit, delay);
            });
        }
    };

    SessionRefresh.delayedInit(5 * 60 * 1000);

}
