HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/TDijk1/erp-apps.eu/wwwroot/CMSModules/Chat/Controls/SupportChatHeader.js
ChatSupportHeader = function (options) {
    var $ = window.$cmsj,
        config = {
		    headerIconId: '',
		    btnLoginId: '',
		    btnLoginShortcutId: '',
		    btnLogoutId: '',
		    btnSettingsId: '',
		    loginShortcutWrapperId: '',
		    lblNotificationNumberId: '',
		    ulActiveRequestsId: '',
		    ulNewRequestsId: '',
		    lnkNewRequestsId: '',
		    lblNewRequestsId: '',
		
		    resRoomNewMessagesFormat: '',
		    resNewRequestsSingular: '',
		    resNewRequestsPlural: '',

		    settingsUrl: '',
		    notificationManagerOptions: null
        };

	$.extend(config, options);

	var $btnLogin = $('#' + config.btnLoginId),
	    $btnLoginShortcut = $('#' + config.btnLoginShortcutId),
	    $loginShortcutWrapper = $('#' + config.loginShortcutWrapperId),
	    $btnSettings = $('#' + config.btnSettingsId),
	    $btnLogout = $('#' + config.btnLogoutId),
	    $statusIcon = $('#' + config.headerIconId + ' i.icon-bubble'),
	    $navbar = $("#cms-nav-chat"),
	    $lblNotificationNumber = $('#' + config.lblNotificationNumberId),
	    $ulActiveRequests = $('#' + config.ulActiveRequestsId),
	    $ulNewRequests = $('#' + config.ulNewRequestsId),
	    $lnkNewRequests = $('#' + config.lnkNewRequestsId),
	    $liNewRequestsLink = $lnkNewRequests.parent('li'),
	    $lblNewRequests = $('#' + config.lblNewRequestsId),	    
	    notifyRequestEventName = 'supportnewrequest',
	    notifyMessageEventName = 'supportnewmessage',
	    focusTimeStamp = new Date(0),
	    roomsLastUpdate = new Date(0);
	
	function goOnline() {
		$btnLogin.hide();
		$loginShortcutWrapper.hide();
		$statusIcon.addClass('chat-navbar-online');
		$btnLogout.removeClass('hide');
		$lnkNewRequests.removeClass('hide');
		showRooms();
	}
	
	function goOffline() {
		$btnLogin.show();
		$loginShortcutWrapper.show();
		$statusIcon.removeClass('chat-navbar-online');
		$btnLogout.addClass('hide');
		$lnkNewRequests.addClass('hide');
		showRooms();
	}
	
	function showRooms(rooms) {
		if (!rooms) {
			rooms = {};
		}
		var activeRequests = [],
		    requests = [],
		    // How many requests requires user's attention (waiting requests and active requests with unread messages)
		    notifyCount = 0,
		    requestsLastChange = 0,
		    activeUnreadLastChange = 0,
		    activeReadLastChange = 0,
		    newMessagesInClosedWindow = false;

		for (var key in rooms) {
			var room = rooms[key];
			if (room.isTaken) {
				// Active request
				if (room.unreadMessagesCount > 0) {
					if (room.lastChange > activeUnreadLastChange) {
						activeUnreadLastChange = room.lastChange;
						if (!newMessagesInClosedWindow && !room.openedWindow || room.openedWindow.closed) {
							newMessagesInClosedWindow = true;
						}
					}
					notifyCount++;
				} else if (room.lastChange > activeReadLastChange) {
					activeReadLastChange = room.lastChange;
				}
				activeRequests.push(room);
			} else {
				// New request
				if (room.lastChange > requestsLastChange) {
					requestsLastChange = room.lastChange;
				}
				requests.push(room);
			}
		}
		
		if (requestsLastChange > roomsLastUpdate) {
			// There are new support requests - play sound and start changing title
			notifyNewRequests();
		}
		else if (activeUnreadLastChange > roomsLastUpdate) {
			// There are new messages in active requests - start changing title
			notifyNewMessages(newMessagesInClosedWindow);
		}
		else if (!rooms.length || (activeReadLastChange > roomsLastUpdate && activeUnreadLastChange < focusTimeStamp && requestsLastChange < focusTimeStamp)) {
			// Messages in all active rooms were read and there are no new requests - stop changing title
			notifyStop();
		}

		notifyCount += requests.length;
		if (notifyCount) {
			$lblNotificationNumber.removeClass('hide').text(notifyCount);
		} else {
			$lblNotificationNumber.addClass('hide').empty();
		}
		
		showRequests(requests);
		showActiveRequests(activeRequests);
		resizeFrame();
		roomsLastUpdate = new Date();
	}
	
	function showRequests(requests) {
		var requestsCount = requests.length;
		$lblNewRequests.text((requestsCount === 1 ? config.resNewRequestsSingular : config.resNewRequestsPlural).replace('{0}', requestsCount));
		if (requestsCount) {
			$lnkNewRequests.removeClass('disabled');
			$lnkNewRequests.attr('href', '#');
		} else {
			$lnkNewRequests.addClass('disabled');
			$liNewRequestsLink.removeClass('open');
			$lnkNewRequests.removeAttr('href');
		}
		$ulNewRequests.empty();
		for (var i = 0; i < requestsCount; i++) {
			var request = requests[i];
			$ulNewRequests.append($('<li></li>')
				.append($('<a href="#"></a>')
					.text(getRoomName(request))
					.click(generateTakeRoomFn(request.roomId))
				)
			);
		}
	}
	
	function showActiveRequests(requests) {
		requests = requests.sort(compareRoomsByName);
		$ulActiveRequests.empty();
		for (var i = 0; i < requests.length; i++) {
			var request = requests[i];
			$ulActiveRequests.append($('<li' + (request.unreadMessagesCount > 0 ? ' class="active"' : '') + '></li>')
				.append($('<a href="#"></a>')
					.text(getRoomName(request))
					.click(generateTakeRoomFn(request.roomId))
				)
			);
		}
	}
	
	function generateTakeRoomFn(roomId) {
		return function() {
			ChatSupportManager.takeSupportRoom(roomId);
			return false;
		};
	}
	
	function compareRoomsByName(roomA, roomB) {
		return roomA.name - roomB.name;
	}
	
	function getRoomName(room) {
		return room.unreadMessagesCount ? config.resRoomNewMessagesFormat.replace('{0}', room.unreadMessagesCount).replace('{1}', room.name) : room.name;
	}
	
	function notifyNewRequests() {
		if (ChatNotificationManager) {
			ChatNotificationManager.NotifySound(notifyRequestEventName, true);
			ChatNotificationManager.NotifyTab(notifyRequestEventName);
		}
	}

	function notifyNewMessages(playSound) {
		if (ChatNotificationManager) {
			ChatNotificationManager.NotifyTab(notifyMessageEventName);
			if (playSound) {
				ChatNotificationManager.NotifySound(notifyMessageEventName, true);
			}
		}
	}
	
	function notifyStop() {
		if (ChatNotificationManager) {
			ChatNotificationManager.StopNotify(notifyRequestEventName);
			ChatNotificationManager.StopNotify(notifyMessageEventName);
		}
	}
	
	function showError(message) {
		alert(message);
	}

	function resizeFrame() {
	    // Make sure that layout resizing will happen after
	    // the DOM rerendering finishes
	    setTimeout(function () {
	        window.top.layouts[0].resizeAll();
	    }, 0);
	}
	
	function init() {
		if (!ChatSupportManager || !ChatSupportManager.ready) {
			$('#' + config.headerIconId).hide();
			return;
		}

		// Move chat bar into placeholder in header
	    $navbar.appendTo($("#cms-header-placeholder"))
	        .on("show.bs.collapse", resizeFrame)
	        .on("hide.bs.collapse", resizeFrame);
		
		// Subscribe to callbacks
		ChatSupportManager.callbackGoOnline.add(goOnline);
		ChatSupportManager.callbackGoOffline.add(goOffline);
		ChatSupportManager.callbackError.add(showError);
		ChatSupportManager.callbackUpdateRooms.add(showRooms);
		
		if (ChatSupportManager.getOnlineStatus()) {
			goOnline();
		} else {
			goOffline();
		}

		// Support login button function
		var loginFn = function (e) {
			e.preventDefault();
			ChatSupportManager.goOnline();
			return false;
		};

		$btnLogin.click(loginFn);
		$btnLoginShortcut.click(loginFn);

		// Support logout button function
		$btnLogout.click(function (e) {
			e.preventDefault();
			ChatSupportManager.goOffline();
			return false;
		});

		// Support setting button function
		$btnSettings.click(function (e) {
			e.preventDefault();
			modalDialog(config.settingsUrl, 'SupportChatSettings', 700, 530);
			return false;
		});
		
		if (ChatNotificationManagerSetup && config.notificationManagerOptions) {
			ChatNotificationManagerSetup({
				eventName: notifyRequestEventName,
				soundFile: config.notificationManagerOptions.soundFileRequest,
				notifyTitle: config.notificationManagerOptions.notifyTitle
			});
			ChatNotificationManagerSetup({
				eventName: notifyMessageEventName,
				soundFile: config.notificationManagerOptions.soundFileMessage,
				notifyTitle: config.notificationManagerOptions.notifyTitle
			});

			$cmsj(window).focus(function () {
				focusTimeStamp = new Date();
			});
		}
	}

	init();
};