function CBXSession() { var _this = this; this.mess = {}; this.timeout = null; this.sessid = null; this.bShowMess = true; this.dateStart = new Date(); this.dateInput = new Date(); this.dateCheck = new Date(); this.activityInterval = 0; this.notifier = null; this.Expand = function(timeout, sessid, bShowMess, key) { this.timeout = timeout; this.sessid = sessid; this.bShowMess = bShowMess; this.key = key; BX.ready(function(){ BX.bind(document, "keypress", _this.OnUserInput); BX.bind(document.body, "mousemove", _this.OnUserInput); BX.bind(document.body, "click", _this.OnUserInput); setTimeout(_this.CheckSession, (_this.timeout-60)*1000); }) }; this.OnUserInput = function() { var curr = new Date(); _this.dateInput.setTime(curr.valueOf()); }; this.CheckSession = function() { var curr = new Date(); if(curr.valueOf() - _this.dateCheck.valueOf() < 30000) return; _this.activityInterval = Math.round((_this.dateInput.valueOf() - _this.dateStart.valueOf())/1000); _this.dateStart.setTime(_this.dateInput.valueOf()); var interval = (_this.activityInterval > _this.timeout? (_this.timeout-60) : _this.activityInterval); var config = { 'method': 'GET', 'dataType': 'html', 'url': '/bitrix/tools/public_session.php?sessid='+_this.sessid+'&interval='+interval+'&k='+_this.key, 'data': '', 'onsuccess': function(data){_this.CheckResult(data)}, 'lsId': 'sess_expand', //caching the result in the local storage for multiple tabs 'lsTimeout': 60 }; if(interval > 0) { //forced request config.lsForce = true; } BX.ajax(config); }; this.CheckResult = function(data) { if(data == 'SESSION_EXPIRED') { if(_this.bShowMess) { if(!_this.notifier) { _this.notifier = document.body.appendChild(BX.create('DIV', { props: {className: 'bx-session-message'}, style: {top: '0px'}, html: ''+_this.mess.messSessExpired })); var windowScroll = BX.GetWindowScrollPos(); var windowSize = BX.GetWindowInnerSize(); _this.notifier.style.left = parseInt(windowScroll.scrollLeft + windowSize.innerWidth / 2 - parseInt(_this.notifier.clientWidth) / 2) + 'px'; if(BX.browser.IsIE()) { _this.notifier.style.top = windowScroll.scrollTop + 'px'; BX.bind(window, 'scroll', function() { var windowScroll = BX.GetWindowScrollPos(); _this.notifier.style.top = windowScroll.scrollTop + 'px'; }); } else { _this.notifier.style.position='fixed'; } } _this.notifier.style.display = ''; } } else { var timeout; if(data == 'SESSION_CHANGED') timeout = (_this.timeout-60); else timeout = (_this.activityInterval < 60? 60 : (_this.activityInterval > _this.timeout? (_this.timeout-60) : _this.activityInterval)); var curr = new Date(); _this.dateCheck.setTime(curr.valueOf()); setTimeout(_this.CheckSession, timeout*1000); } }; this.Close = function() { this.notifier.style.display = 'none'; } } var bxSession = new CBXSession();