HEX
Server: Apache
System: Linux 185.122.168.184.host.secureserver.net 5.14.0-570.60.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Nov 5 05:00:59 EST 2025 x86_64
User: barbeatleanalyti (1024)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: /home/barbeatleanalyti/www/public_html/webmail/modules/CoreWebclient/js/App.js
'use strict';

// UserSettings use koExtendings
require('%PathToCoreWebclientModule%/js/koExtendings.js');

var
	_ = require('underscore'),
	$ = require('jquery'),
	ko = require('knockout'),
	modernizr = require('%PathToCoreWebclientModule%/js/vendors/modernizr.js'),
	
	TextUtils = require('%PathToCoreWebclientModule%/js/utils/Text.js'),
	Types = require('%PathToCoreWebclientModule%/js/utils/Types.js'),
	UrlUtils = require('%PathToCoreWebclientModule%/js/utils/Url.js'),
	
	Api = require('%PathToCoreWebclientModule%/js/Api.js'),
	Browser = require('%PathToCoreWebclientModule%/js/Browser.js'),
	ModulesManager = require('%PathToCoreWebclientModule%/js/ModulesManager.js'),
	Routing = require('%PathToCoreWebclientModule%/js/Routing.js'),
	Screens = require('%PathToCoreWebclientModule%/js/Screens.js'),
	UserSettings = require('%PathToCoreWebclientModule%/js/Settings.js'),
	WindowOpener = require('%PathToCoreWebclientModule%/js/WindowOpener.js'),
	
	Popups = require('%PathToCoreWebclientModule%/js/Popups.js'),
	ConfirmPopup = require('%PathToCoreWebclientModule%/js/popups/ConfirmPopup.js')
;

require('%PathToCoreWebclientModule%/js/enums.js');

require('%PathToCoreWebclientModule%/js/koBindings.js');

require('%PathToCoreWebclientModule%/js/vendors/inputosaurus.js');

require('%PathToCoreWebclientModule%/js/vendors/jquery.cookie.js');

function InitNotMobileRequires()
{
	require('%PathToCoreWebclientModule%/js/CustomTooltip.js');
	require('%PathToCoreWebclientModule%/js/koBindingsNotMobile.js');
}

/**
 * Modernizr build:
 * Method - addTest
 * CSS classes - cssanimations, csstransitions
 */
function InitModernizr()
{
	if (modernizr && navigator)
	{
		modernizr.addTest('pdf', function() {
			return !!_.find(navigator.mimeTypes, function (oMimeType) {
				return 'application/pdf' === oMimeType.type;
			}) || Browser.firefox; // FireFox have stopped supporting of 'application/pdf' mime type in navigator since 2016
		});

		modernizr.addTest('newtab', function() {
			return App.isNewTab();
		});

		modernizr.addTest('mobile', function() {
			return App.isMobile();
		});
		
		if (navigator)
		{
			modernizr.addTest('native-android-browser', function() {
				var ua = navigator.userAgent;
				return (ua.indexOf('Mozilla/5.0') > -1 && ua.indexOf('Android ') > -1 && ua.indexOf('534') > -1 && ua.indexOf('AppleWebKit') > -1);
			});
		}
	}
}

function CApp()
{
	this.iUserRole = window.auroraAppData.User ? Types.pInt(window.auroraAppData.User.Role) : Enums.UserRole.Anonymous;
	this.iTenantId = window.auroraAppData.User ? Types.pInt(window.auroraAppData.User.TenantId) : 0;
	this.sUserName = window.auroraAppData.User ? Types.pString(window.auroraAppData.User.Name) : '';
	this.sUserPublicId = window.auroraAppData.User ? Types.pString(window.auroraAppData.User.PublicId) : '';
	this.iUserId = window.auroraAppData.User ? Types.pInt(window.auroraAppData.User.Id) : 0;
	this.bPublic = false;
	this.bNewTab = false;
	
	this.userAuthAccountsCountsArray = ko.observableArray([]);
	this.userAccountsCount = ko.computed(function () {
		var iCount = _.reduce(this.userAuthAccountsCountsArray(), function (iSum, koUserAccountsCount) {
			return iSum + koUserAccountsCount();
		}, 0);
		return iCount;
	}, this);
	
	this.userAccountsWithPass = ko.observableArray([]);
	this.firstAccountWithPassLogin = ko.computed(function () {
		var sLogin = '';
		_.each(this.userAccountsWithPass(), function (koAccountsWithPass) {
			var aAccountsLogins = koAccountsWithPass();
			if (!Types.isNonEmptyString(sLogin) && aAccountsLogins.length > 0 && Types.isNonEmptyString(aAccountsLogins[0]))
			{
				sLogin = aAccountsLogins[0];
			}
		});
		return sLogin;
	}, this);
	this.mobileCredentialsHintText = ko.computed(function () {
		var sLogin = this.firstAccountWithPassLogin() || this.getUserPublicId();
		return TextUtils.i18n('COREWEBCLIENT/INFO_MOBILE_CREDENTIALS', {'LOGIN': sLogin});
	}, this);
}

CApp.prototype.registerUserAccountsCount = function (koUserAccountsCount)
{
	this.userAuthAccountsCountsArray.push(koUserAccountsCount);
};

CApp.prototype.registerAccountsWithPass = function (koAccountsWithPass)
{
	this.userAccountsWithPass.push(koAccountsWithPass);
};

CApp.prototype.isAccountDeletingAvailable = function ()
{
	if (this.userAccountsCount() <= 1)
	{
		Screens.showError(TextUtils.i18n('%MODULENAME%/ERROR_ACCOUNT_DELETING_DISABLE'), true);
		return false;
	}
	return true;
};

CApp.prototype.getUserRole = function ()
{
	return this.iUserRole;
};

CApp.prototype.getTenantId = function ()
{
	return this.iTenantId;
};

CApp.prototype.getUserName = function ()
{
	return this.sUserName;
};

CApp.prototype.getUserPublicId = function ()
{
	return this.sUserPublicId;
};

CApp.prototype.getUserId = function ()
{
	return this.iUserId;
};

CApp.prototype.setPublic = function ()
{
	this.bPublic = true;
};

CApp.prototype.isPublic = function ()
{
	return this.bPublic;
};

CApp.prototype.setNewTab = function ()
{
	this.bNewTab = true;
};

CApp.prototype.isNewTab = function ()
{
	return this.bNewTab;
};

CApp.prototype.isMobile = function ()
{
	return UserSettings.IsMobile === 1;
};

CApp.prototype.init = function ()
{
	ModulesManager.run('StandardLoginFormWebclient', 'beforeAppRunning', [this.iUserRole !== Enums.UserRole.Anonymous]);
	
	if (UserSettings.AllowChangeSettings && !this.isMobile())
	{
		ModulesManager.run('SettingsWebclient', 'registerSettingsTab', [
			function () { return require('%PathToCoreWebclientModule%/js/views/CommonSettingsFormView.js'); },
			'common',
			TextUtils.i18n('%MODULENAME%/LABEL_COMMON_SETTINGS_TABNAME')
		]);
	}
		
	if (App.getUserRole() === Enums.UserRole.SuperAdmin)
	{
		ModulesManager.run('AdminPanelWebclient', 'registerAdminPanelTab', [
			function(resolve) {
				require.ensure(
					['%PathToCoreWebclientModule%/js/views/CommonSettingsFormView.js'],
					function() {
						resolve(require('%PathToCoreWebclientModule%/js/views/CommonSettingsFormView.js'));
					},
					"admin-bundle"
				);
			},
			'system',
			TextUtils.i18n('%MODULENAME%/LABEL_COMMON_SETTINGS_TABNAME')
		]);
	}
		
	if (Browser.iosDevice && this.iUserRole !== Enums.UserRole.Anonymous && UserSettings.SyncIosAfterLogin && UserSettings.AllowIosProfile && $.cookie('skip-ios') !== '1')
	{
		$.cookie('skip-ios', '1');
		window.location.href = '?ios';
	}
	
	if (this.iUserRole !== Enums.UserRole.Anonymous && !this.bPublic)
	{
		var AccountList = ModulesManager.run('MailWebclient', 'getAccountList');
		if (AccountList)
		{
			this.currentAccountId = AccountList.currentId;
			this.hasAccountWithId = _.bind(AccountList.hasAccountWithId, AccountList);

			this.currentAccountEmail = ko.computed(function () {
				var oAccount = AccountList.getAccount(this.currentAccountId());
				return oAccount ? oAccount.email() : '';
			}, this);

			this.getAttendee = function (aAttendees) {
				return AccountList.getAttendee(
					_.map(aAttendees, function (mAttendee) {
						return Types.isString(mAttendee) ? mAttendee : mAttendee.email;
					}, this)
				);
			};
		}
		else
		{
			this.currentAccountEmail = _.bind(function () { return this.sUserName; }, this);
		}
	}
	
	if (!this.isMobile())
	{
		InitNotMobileRequires();
	}
	
	Screens.init(this.iUserRole === Enums.UserRole.Anonymous);
	Routing.init();
	
	require('%PathToCoreWebclientModule%/js/AppTab.js');
	if (!this.bNewTab)
	{
		require('%PathToCoreWebclientModule%/js/Prefetcher.js');
	}

	this.useGoogleAnalytics();

	if (!this.isMobile())
	{
		$(window).unload(function() {
			WindowOpener.closeAll();
		});
	}
	
	window.onbeforeunload = _.bind(function () {
		if (Screens.hasUnsavedChanges() || Popups.hasUnsavedChanges())
		{
			return '';
		}
	}, this);
	
	if (Browser.ie8AndBelow)
	{
		$('body').css('overflow', 'hidden');
	}
	
	this.checkCookies();
	
	this.showLastErrorOnLogin();
	
	if (UserSettings.IsSystemConfigured === false)
	{
		Screens.showError(TextUtils.i18n('%MODULENAME%/ERROR_SYSTEM_NOT_CONFIGURED'), true);
	}
};

CApp.prototype.showLastErrorOnLogin = function ()
{
	if (this.iUserRole === Enums.UserRole.Anonymous)
	{
		var
			iError = Types.pInt(UrlUtils.getRequestParam('error')),
			sErrorModule = Types.pString(UrlUtils.getRequestParam('module'))
		;
		
		if (iError !== 0)
		{
			Api.showErrorByCode({'ErrorCode': iError, 'Module': sErrorModule}, '', true);
		}
		
		if (UserSettings.LastErrorCode === Enums.Errors.AuthError)
		{
			Screens.showError(TextUtils.i18n('%MODULENAME%/ERROR_AUTH_PROBLEM'), true);
		}
	}
};

/**
 * Makes user logout if there are no changes in current screen or popup or user chose to discard them.
 */
CApp.prototype.logout = function ()
{
	if (Screens.hasUnsavedChanges() || Popups.hasUnsavedChanges())
	{
		this.askDiscardChanges(this.logoutAndGotoLogin.bind(this));
	}
	else
	{
		this.logoutAndGotoLogin();
	}
};

/**
 * Makes user logout and relocate to login screen after that.
 * @param {number=} iLastErrorCode
 */
CApp.prototype.logoutAndGotoLogin = function (iLastErrorCode)
{
	var Ajax = require('%PathToCoreWebclientModule%/js/Ajax.js');

	Ajax.send('Core', 'Logout', iLastErrorCode ? {'LastErrorCode': iLastErrorCode} : null);

	Ajax.abortAndStopSendRequests();

	$.removeCookie('AuthToken');

	window.onbeforeunload = null;
	
	WindowOpener.closeAll();
	
	Routing.finalize();
	
	if (Types.isNonEmptyString(UserSettings.CustomLogoutUrl))
	{
		window.location.href = UserSettings.CustomLogoutUrl;
	}
	else
	{
		UrlUtils.clearAndReloadLocation(Browser.ie8AndBelow, true);
	}
};

/**
 * Asks user if he prefer discard changes or stay on current screen/popup.
 * @param {function} fOnDiscard Function to execute if user prefer to discard changes.
 * @param {function} fOnNotDiscard Function to execute if user prefer to stay on current screen/popup.
 * @param {object} oCurrentScreen Current screen object.
 */
CApp.prototype.askDiscardChanges = function (fOnDiscard, fOnNotDiscard, oCurrentScreen)
{
	var
		sConfirm = TextUtils.i18n('COREWEBCLIENT/CONFIRM_DISCARD_CHANGES'),
		fOnConfirm = _.bind(function (bOk) {
			if (bOk && _.isFunction(fOnDiscard))
			{
				if (oCurrentScreen && _.isFunction(oCurrentScreen.discardChanges))
				{
					oCurrentScreen.discardChanges();
				}
				fOnDiscard();
			}
			else if (_.isFunction(fOnNotDiscard))
			{
				fOnNotDiscard();
			}
		}, this)
	;

	Popups.showPopup(ConfirmPopup, [sConfirm, fOnConfirm]);
};

CApp.prototype.tokenProblem = function ()
{
	var
		sReloadFunc = 'window.location.reload(); return false;',
		sHtmlError = TextUtils.i18n('%MODULENAME%/ERROR_TOKEN_PROBLEM_HTML', {'RELOAD_FUNC': sReloadFunc})
	;
	Screens.showError(sHtmlError, true);
};

CApp.prototype.checkMobile = function () {
	/**
	 * UserSettings.IsMobile:
	 *	-1 - first time, mobile is not determined
	 *	0 - mobile is switched off
	 *	1 - mobile is switched on
	 */
	
	if (UserSettings.AllowMobile && UserSettings.IsMobile === -1)
	{
		var
			Ajax = require('%PathToCoreWebclientModule%/js/Ajax.js'),
			bMobile = !window.matchMedia('all and (min-width: 768px)').matches
		;

		Ajax.send('Core', 'SetMobile', {'Mobile': bMobile}, function (oResponse) {
			if (bMobile && oResponse.Result)
			{
				window.location.reload();
			}
		}, this);
		
		return bMobile;
	}
	else if (this.iUserRole === Enums.UserRole.SuperAdmin && UserSettings.AllowMobile && UserSettings.IsMobile === 1)
	{
		// There is no admin panel for mobile version so go to full version
		var Ajax = require('%PathToCoreWebclientModule%/js/Ajax.js');

		Ajax.send('Core', 'SetMobile', {'Mobile': false}, function (oResponse) {
			window.location.reload();
		}, this);
		
		return false;
	}
	
	return false;
};

CApp.prototype.useGoogleAnalytics = function ()
{
	var
		oGoogleAnalytics = null,
		oFirstScript = null
	;
	
	if (UserSettings.GoogleAnalyticsAccount && 0 < UserSettings.GoogleAnalyticsAccount.length)
	{
		window._gaq = window._gaq || [];
		window._gaq.push(['_setAccount', UserSettings.GoogleAnalyticsAccount]);
		window._gaq.push(['_trackPageview']);

		oGoogleAnalytics = document.createElement('script');
		oGoogleAnalytics.type = 'text/javascript';
		oGoogleAnalytics.async = true;
		oGoogleAnalytics.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
		oFirstScript = document.getElementsByTagName('script')[0];
		oFirstScript.parentNode.insertBefore(oGoogleAnalytics, oFirstScript);
	}
};

/**
 * @returns {Boolean}
 */
CApp.prototype.checkCookies = function ()
{
	$.cookie.defaults = { path: UserSettings.CookiePath };
	
	$.cookie('checkCookie', '1');
	var bCookieWorks = $.cookie('checkCookie') === '1';
	$.removeCookie('checkCookie');
	
	if (!bCookieWorks)
	{
		Screens.showError(TextUtils.i18n('%MODULENAME%/ERROR_COOKIES_DISABLED'), true);
	}
	else
	{
		if (this.iUserRole === Enums.UserRole.Anonymous)
		{
			$.removeCookie('AuthToken');
		}
		else
		{
			var sAuthToken = $.cookie('AuthToken');
			if (sAuthToken)
			{
				$.cookie('AuthToken', sAuthToken, { expires: 30 });
			}
		}
	}
	
	return bCookieWorks;
};

CApp.prototype.getCommonRequestParameters = function ()
{
	var oParameters = {
		TenantName: UserSettings.TenantName
	};
	
	return oParameters;
};

CApp.prototype.broadcastEvent = function (sEventName, oArguments)
{
	if (_.isArray(this.aEventsCallbacks) && _.isArray(this.aEventsCallbacks[sEventName]))
	{
		_.each(this.aEventsCallbacks[sEventName], function (fCallback) {
			fCallback(oArguments);
		});
		return true;
	}
	return  false;
};

CApp.prototype.subscribeEvent = function (sEventName, fCallback)
{
	if (!_.isArray(this.aEventsCallbacks))
	{
		this.aEventsCallbacks = [];
	}
	
	if (!_.isArray(this.aEventsCallbacks[sEventName]))
	{
		this.aEventsCallbacks[sEventName] = [];
	}
	
	this.aEventsCallbacks[sEventName].push(fCallback);
};

var App = new CApp();

InitModernizr();
	
module.exports = App;