%PDF- %PDF- 403WebShell
403Webshell
Server IP : 37.220.80.31  /  Your IP : 18.191.239.251
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64
User : www-root ( 1010)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/www-root/data/www/dev.artlot24.ru/bitrix/js/ui/selector/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/js/ui/selector/selector.js
(function() {

var BX = window.BX;

BX.namespace('BX.UI');

if (!!BX.UI.Selector)
{
	return;
}

BX.UI.Selector = function(params)
{
	this.statuses = {
		searchWaiterEnabled: false
	};
	this.manager = BX.UI.SelectorManager;
	this.id = (BX.type.isNotEmptyString(params.id) ? params.id : null);
	this.fieldName = (BX.type.isNotEmptyString(params.fieldName) ? params.fieldName : null);
	this.tabs = {
		list: {},
		selected: null
	};
	this.dialogGroups = {};
	this.entities = (BX.type.isNotEmptyObject(params.entities) ? params.entities : {});
	this.networkItems = {};
	this.sortData = {};
	this.itemsSelected = (BX.type.isNotEmptyObject(params.itemsSelected) ? params.itemsSelected : {}); // obItemsSelected
	this.itemsUndeletable = (BX.type.isNotEmptyObject(params.itemsUndeletable) ? params.itemsUndeletable : []);
	this.options = (BX.type.isNotEmptyObject(params.options) ? params.options : {});

	this.bindOptions = (BX.type.isNotEmptyObject(params.bindOptions) ? params.bindOptions : {});
	this.bindOptions.forceBindPosition = true;

	this.popups = {
		container: null,
		main: null, // popupWindow
		search: null,
		inviteEmailUser: null // inviteEmailUserWindow
	};
	this.nodes = {
		input: (BX.type.isDomNode(params.input) ? params.input : null),
		inputBox: (BX.type.isDomNode(params.inputBox) ? params.inputBox : null),
		inputItemsContainer: (BX.type.isDomNode(params.inputItemsContainer) ? params.inputItemsContainer : null),
		tag: (BX.type.isDomNode(params.tag) ? params.tag : null),
		containerContentsContainer: null,
		searchContentsContainer: null,
		contentWaiter: null, // bx-lm-box-waiter-content-text
		searchWaiter: null
	};
	this.cursors = {}; // obCursorPosition
	this.result = {
		search: []
	}; // obResult
	this.resultChanged = {}; // bResultMoved
	this.tmpSearchResult = {
		client: [],
		ajax: []
	}; // tmpSearchResult
	this.callback = (BX.type.isNotEmptyObject(params.callback) ? params.callback : {});
	this.callbackBefore = (BX.type.isNotEmptyObject(params.callbackBefore) ? params.callbackBefore : {});
	this.searchXhr = null;
	this.searchRequestId = null;
	this.timeouts = {
		search: null
	};

	this.dialogNodes = {
		tabsContainer: null,
		contentsContainer: null
	};

	this.treeItemLoaded = {};

	this.clientDBSearchResult = {
		users: {}
	}; // oDbUserSearchResult
	this.ajaxSearchResult = {
		users: {}
	}; // oAjaxUserSearchResult
	this.containerSearchResult = {};

	this.searchInstance = null;
	this.navigationInstance = null;
	this.renderInstance = null;

	this.postponeSearch = false;
	this.closeByEmptySearchResult = false;

	var searchOptions = this.getOption('search');
 	if (
		BX.type.isNotEmptyString(searchOptions.useClientDatabase)
		&& searchOptions.useClientDatabase == 'Y'
	)
	{
		BX.onCustomEvent('BX.UI.SelectorManager:initClientDatabase', []);
	}
};

BX.UI.Selector.create = function(params)
{
	var selectorInstance = new BX.UI.Selector(params);
	BX.UI.SelectorManager.instances[params.id] = selectorInstance;

	BX.onCustomEvent('BX.UI.SelectorManager:onCreate', [ params.id ]);

	return selectorInstance;
};

BX.UI.Selector.prototype.getSearchInstance = function()
{
	if (this.searchInstance === null)
	{
		this.searchInstance = BX.UI.Selector.Search.create({
			selectorInstance: this
		});
	}
	return this.searchInstance;
};

BX.UI.Selector.prototype.getNavigationInstance = function()
{
	if (this.navigationInstance === null)
	{
		this.navigationInstance = BX.UI.Selector.Navigation.create({
			selectorInstance: this
		});
	}

	return this.navigationInstance;
};

BX.UI.Selector.prototype.getRenderInstance = function()
{
	if (this.renderInstance === null)
	{
		this.renderInstance = BX.UI.Selector.Render.create({
			selectorInstance: this
		});
	}

	return this.renderInstance;
};

BX.UI.Selector.prototype.getPopupBind = function()
{
	return (
		BX.type.isNotEmptyObject(this.bindOptions.position)
			? this.bindOptions.position
			: this.bindOptions.node
	);
};

BX.UI.Selector.prototype.getPopupZIndex = function()
{
	return (
		BX.type.isNotEmptyObject(this.bindOptions)
		&& typeof this.bindOptions.zIndex != 'undefined'
			? this.bindOptions.zIndex
			: 1200
	);
};

BX.UI.Selector.prototype.openDialog = function()
{
	var popupBind = this.getPopupBind();
	if (
		BX.type.isDomNode(popupBind)
		&& !document.body.contains(popupBind)
	)
	{
		return;
	}

	var isPromiseReturned = false;
	var promise = null;

	if (typeof this.callbackBefore.openDialog == 'function')
	{
		if (BX.type.isNotEmptyObject(this.callbackBefore.context))
		{
			promise = this.callbackBefore.openDialog.bind(this.callbackBefore.context)();
			isPromiseReturned =
				promise &&
				(
					Object.prototype.toString.call(promise) === "[object Promise]" ||
					promise.toString() === "[object BX.Promise]"
				)
			;
		}
	}

	if (!isPromiseReturned)
	{
		promise = Promise.resolve();
	}

	promise.then(
		this.openDialogPromiseFulfilled.bind(this),
		this.openDialogPromiseRejected.bind(this)
	);
};

BX.UI.Selector.prototype.openDialogPromiseFulfilled = function(result)
{
	var popupBind = this.getPopupBind();

	if (
		BX.type.isDomNode(popupBind)
		&& !document.body.contains(popupBind)
	)
	{
		return;
	}

	if (this.getOption('useContainer') == 'Y') // obUseContainer
	{
		if (!this.openContainer())
		{
			return false;
		}

		BX.cleanNode(this.nodes.containerContentsContainer);
		this.nodes.containerContentsContainer.appendChild(this.getDialogContent());

		var entityType = null;

		for (var itemId in this.itemsSelected)
		{
			if (this.itemsSelected.hasOwnProperty(itemId))
			{
				entityType = this.manager.convertEntityType(this.itemsSelected[itemId]);
				if (this.callback.select)
				{
					this.callback.select({
						item: this.entities[entityType].items[itemId],
						entityType: entityType,
						selectorId: this.id,
						state: 'init'
					})
				}
			}
		}

		this.popups.container.setAngle({});
		this.popups.container.setBindElement(popupBind);
		this.popups.container.show();
	}
	else
	{
		this.popups.main = new BX.PopupWindow({
			id: 'bx-selector-dialog-' + this.id,
			bindElement: popupBind,
			autoHide: (this.getOption('popupAutoHide') != 'N'),
			zIndex: this.getPopupZIndex(),
			className: this.getRenderInstance().class.popup,
			offsetLeft: this.bindOptions.offsetLeft,
			offsetTop: this.bindOptions.offsetTop,
			bindOptions: this.bindOptions,
			cacheable: false,
			closeByEsc: true,
			closeIcon: (
				this.getOption('showCloseIcon') == 'Y'
					? {
						top: '12px',
						right: '15px'
					}
					: false
			),
			lightShadow: true,
			events: {
				onPopupShow: function() {
					if (
						this.manager.statuses.allowSendEvent
						&& this.callback.openDialog
					)
					{
						this.callback.openDialog({
							selectorId: this.id
						});
					}

					if (
						this.popups.inviteEmailUser
						&& this.popups.inviteEmailUser.isShown()
					)
					{
						this.popups.inviteEmailUser.close();
					}
				}.bind(this),
				onPopupDestroy : function() {
					this.popups.main = null;

					if (
						this.manager.statuses.allowSendEvent
						&& this.callback.closeDialog
					)
					{
						this.callback.closeDialog({
							selectorId: this.id
						});
					}
				}.bind(this)
			},
			content: this.getDialogContent()
		});

		this.popups.main.setAngle({});
		this.popups.main.show();
	}

	if (this.getOption('enableLast') != 'N')
	{
		this.tabs.selected = 'last';
	}

	if (
		this.getOption('enableLast') == 'N'
		&& this.getOption('enableSonetgroups') != 'Y'
		&& this.getOption('enableDepartments') == 'Y'
	)
	{
		this.switchTab({
			code: 'departments'
		});

		if (this.getOption('useContainer') == 'Y')
		{
			this.popups.container.adjustPosition();
		}
		else
		{
			this.popups.main.adjustPosition();
		}
	}

	this.getNavigationInstance().hoverFirstItem({
		tab: this.tabs.selected
	});
};

BX.UI.Selector.prototype.openDialogPromiseRejected = function(reason)
{
	this.callback.closeDialog({
		selectorId: this.id
	});
};

BX.UI.Selector.prototype.openContainer = function()
{
	if(this.popups.container)
	{
		this.popups.container.destroy();
	}

	this.popups.container = new BX.PopupWindow({
		id: 'bx-selector-dialog-' + this.id + '-container',
		bindElement: this.getPopupBind(),
		autoHide: (this.getOption('popupAutoHide') != 'N'),
		zIndex: this.getPopupZIndex(),
		className: this.getRenderInstance().class.popup,
		offsetLeft: this.bindOptions.offsetLeft,
		offsetTop: this.bindOptions.offsetTop,
		bindOptions: this.bindOptions,
		cacheable: false,
		closeByEsc: true,
		closeIcon: (
			this.getOption('showCloseIcon') == 'Y'
				? {
					top: 0,
					right: 0
				}
				: false
		),
		lightShadow: true,
		events: {
			onPopupShow: function() {
				if (
					this.manager.statuses.allowSendEvent
					&& this.callback.openDialog
				)
				{
					this.callback.openDialog({
						selectorId: this.id
					});
				}

				if (
					this.popups.inviteEmailUser
					&& this.popups.inviteEmailUser.isShown()
				)
				{
					this.popups.inviteEmailUser.close();
				}

			}.bind(this),
			onPopupDestroy : function() {
				this.popups.container = null;
				if (this.manager.statuses.allowSendEvent)
				{
					if (this.callback.closeDialog)
					{
						this.callback.closeDialog({
							selectorId: this.id
						});
					}
					if (this.callback.closeSearch)
					{
						this.callback.closeSearch({
							selectorId: this.id
						});
					}
				}
			}.bind(this)
		},
		content: this.getContainerContent()
	});

//	this.popups.container.setAngle({});
//	this.popups.container.show();

	return true;
};

BX.UI.Selector.prototype.openSearch = function(params)
{
	this.manager.statuses.allowSendEvent = false;
	if (this.popups.main != null)
	{
		this.popups.main.close();
	}
	this.manager.statuses.allowSendEvent = true;

	if (this.popups.search != null)
	{
		this.popups.search.close();
		return false;
	}

	if (this.getOption('useContainer') == 'Y') // obUseContainer
	{
		this.containerSearchResult = params.itemsList;

		if (this.nodes.searchContent)
		{
			BX.cleanNode(this.nodes.searchContent);
			var contentCollection = this.buildContentCollection({
				type: 'search',
				items: params.itemsList
			});
			for (i = 0; i < contentCollection.length; i++)
			{
				this.nodes.searchContent.appendChild(contentCollection[i]);
			}
		}
		else
		{
			BX.cleanNode(this.nodes.searchContent);
			BX(this.nodes.searchContent).appendChild(this.getSearchContent({
				itemsList: params.itemsList
			}));
		}

		this.switchTab({
			code: 'search'
		});

		this.popups.container.setAngle({});
	}
	else
	{
		this.popups.search = new BX.PopupWindow({
			id: 'bx-selector-dialog-' + this.id + '-search',
			bindElement: this.getPopupBind(),
			autoHide: true,
			zIndex: this.getPopupZIndex(),
			className: this.getRenderInstance().class.popup,
			offsetLeft: this.bindOptions.offsetLeft,
			offsetTop: this.bindOptions.offsetTop,
			bindOptions: this.bindOptions,
			cacheable: false,
			closeByEsc: true,
			closeIcon: false,
			lightShadow: true,
			events: {
				onPopupShow: function() {
					if (
						this.manager.statuses.allowSendEvent
						&& this.callback.openSearch
					)
					{
						this.callback.openSearch({
							selectorId: this.id
						});
					}

					if (
						this.popups.inviteEmailUser
						&& this.popups.inviteEmailUser.isShown()
					)
					{
						this.popups.inviteEmailUser.close();
					}

				}.bind(this),
				onPopupDestroy : function() {
					this.popups.search = null;
					this.getSearchInstance().abortSearchRequest();
					if (
						this.manager.statuses.allowSendEvent
						&& this.callback.closeSearch
					)
					{
						this.callback.closeSearch({
							selectorId: this.id
						});
					}
				}.bind(this)
			},
			content: this.getSearchContent({
				itemsList: params.itemsList
			})
		});

		this.popups.search.setAngle({});
		this.popups.search.show();
	}

	this.getNavigationInstance().hoverFirstItem({
		tab: 'search'
	});
};

BX.UI.Selector.prototype.getDialogContent = function()
{
	this.dialogNodes.tabsContainer = BX.create('DIV', {
		props: {
			className: this.getRenderInstance().class.tabsContainer
		}
	});

	var
		tab = null,
		tabIndex = 0,
		tabSort = [];

	for (var code in this.tabs.list)
	{
		if (this.tabs.list.hasOwnProperty(code))
		{
			tab = this.tabs.list[code];
			tabSort.push({
				code: code,
				value: (typeof tab['sort'] != 'undefined' && parseInt(tab['sort']) > 0 ? parseInt(tab['sort']) : 100)
			});
		}
	}

	if (
		this.getOption('useContainer') == 'Y'
		&& !BX.type.isNotEmptyObject(this.tabs.list['search'])
	)
	{
		this.tabs.list['search'] = {
			name: BX.message('MAIN_UI_SELECTOR_SEARCH_TAB_TITLE')
		};
		tabSort.push({
			code: 'search',
			value: 10000
		});
	}

	tabSort.sort(function(a, b) {
		if (a.value < b.value)
		{
			return -1;
		}
		if (a.value > b.value)
		{
			return 1;
		}
		return 0;
	});

	var contentsNodesList = [];
	var tabNode = null;

	for (var i = 0; i < tabSort.length; i++)
	{
		code = tabSort[i].code;
		tab = this.tabs.list[code];

		if (tabIndex === 0)
		{
			this.tabs.selected = code;
		}

		tabNode = BX.create('A', {
			attrs: {
				hidefocus: 'true',
				'data-code': code
			},
			props: {
				className: this.getRenderInstance().class.tab + ' ' + this.getRenderInstance().class.tabLast + ' ' + (tabIndex == 0 ? this.getRenderInstance().class.tabSelected : '')
			},
			events: {
				click: function (e) {
					this.switchTab({
						code: e.target.getAttribute('data-code')
					});
					e.stopPropagation();
					return e.preventDefault();
				}.bind(this)
			},
			html: tab.name
		});

		this.dialogNodes.tabsContainer.appendChild(tabNode);

		contentsNodesList.push(this.buildContentNode({
			type: code
		}));

		tabIndex++;
	}

	this.dialogNodes.contentsContainer = BX.create('DIV', { // id: 'bx-lm-box-last-content'
		props: {
			className: this.getRenderInstance().class.tabsContentContainer + ' ' + this.getRenderInstance().class.tabsContentContainerWindow
		},
		children: [
			BX.create('TABLE', {
				props: {
					className: this.getRenderInstance().class.tabsContentContainerTable
				},
				children: [
					BX.create('TR', {
						children: [
							BX.create('TD', {
								props: {
									className: this.getRenderInstance().class.tabsContentContainerCell
								},
								children: contentsNodesList
							})
						]
					})
				]
			})
		]
	});

	var windowClass = this.getOption('windowClass');

	return BX.create('DIV', {
		style: {
			minWidth: '650px',
			paddingBottom: '8px'
		},
		props: {
			className: this.getRenderInstance().class.boxCommon + ' ' + this.getRenderInstance().class.boxContainer + ' ' + this.getRenderInstance().class.boxContainerVertical + ' ' + (windowClass ? windowClass : this.getRenderInstance().class.boxDefault)
		},
		children: [
			this.dialogNodes.tabsContainer,
			this.dialogNodes.contentsContainer
		]
	});
};

BX.UI.Selector.prototype.getContainerContent = function()
{
	var
		windowClass = this.getOption('windowClass'),
		i = null;

	this.nodes.containerContentsContainer = BX.create('div', {
		props: {
			className: this.getRenderInstance().class.containerContent
		}
	});

	this.nodes.inputItemsContainer = BX.create('SPAN', {
		attrs: {
			id: 'bx-dest-internal-item'
		}
	});

	var result = BX.create('DIV', {
		children: [
			BX.create('DIV', {
				props: {
					className: this.getRenderInstance().class.boxCommon + ' ' + this.getRenderInstance().class.boxContainer + ' ' + this.getRenderInstance().class.boxContainerVertical + ' ' + (windowClass ? windowClass : this.getRenderInstance().class.boxDefault)
				},
				style: {
					minWidth: '650px',
					paddingBottom: '8px',
					overflow: 'hidden'
				},
				children: [
					BX.create('DIV', {
						props: {
							className: this.getRenderInstance().class.containerSearchBlock
						},
						children: [
							BX.create('DIV', {
								props: {
									className: this.getRenderInstance().class.containerSearchBlockCell
								},
								children: [
									this.nodes.inputItemsContainer,
									BX.create('SPAN', {
										attrs: {
											id: "bx-dest-internal-input-box",
										},
										style: {
											display: 'inline-block'
										},
										props: {
											className: this.getRenderInstance().class.containerSearchBlockInputBox
										},
										children: [
											this.getSearchInput()
										]
									})
								],
								events: {
									click: function(e) {
										BX.focus(this.nodes.input);
										return e.preventDefault();
									}.bind(this)
								}
							})
						]
					}),
					this.nodes.containerContentsContainer
				]
			})
		]
	});

	BX.bind(this.nodes.input, 'keydown', function(e) { this.getSearchInstance().beforeSearchHandler({ event: e }); }.bind(this));
	BX.bind(this.nodes.input, 'keyup', function(e) { this.getSearchInstance().searchHandler({ event: e }); }.bind(this));
	BX.bind(this.nodes.input, 'paste', function(e) { this.getSearchInstance().searchHandler({ event: e }); }.bind(this));

	BX.defer(BX.focus)(this.nodes.input);

	return result;
};

BX.UI.Selector.prototype.getSearchInput = function()
{
	this.nodes.input = BX.create('INPUT', {
		attrs: {
			type: "text"
		},
		props: {
			className: this.getRenderInstance().class.containerSearchBlockInput
		}
	});

	return this.nodes.input;
};


BX.UI.Selector.prototype.getSearchContent = function(params)
{
	this.nodes.searchContentsContainer = BX.create('DIV', {
		attrs: {
//			id: 'bx-lm-box-search-content'
		},
		props: {
			className: this.getRenderInstance().class.tabsContentContainer + ' ' + this.getRenderInstance().class.tabsContentContainerWindow
		},
		children: [
			BX.create('TABLE', {
				props: {
					className: this.getRenderInstance().class.tabsContentContainerTable
				},
				children: [
					BX.create('TR', {
						children: [
							BX.create('TD', {
								props: {
									className: this.getRenderInstance().class.tabsContentContainerCell
								},
								children: [
									this.buildContentNode({
										type: 'search',
										items: params.itemsList
									})
								]
							})
						]
					})
				]
			})
		]
	});

	var windowClass = this.getOption('windowClass');

	return BX.create('DIV', {
		style: {
			minWidth: '650px',
			paddingBottom: '8px'
		},
		props: {
			className: this.getRenderInstance().class.boxCommon + ' ' + this.getRenderInstance().class.boxContainer + ' ' + this.getRenderInstance().class.boxContainerVertical + ' ' + (windowClass ? windowClass : this.getRenderInstance().class.boxDefault)
		},
		children: [
			this.nodes.searchContentsContainer,
			(this.getOption('useContainer') == 'Y' ? null : this.getSearchInstance().buildSearchWaiter())
		]
	});
};

BX.UI.Selector.prototype.switchTab = function(params)
{
	var code = (BX.type.isNotEmptyString(params.code) ? params.code : null);
	if (!code)
	{
		return;
	}

	var
		i = null,
		j = null;

	this.tabs.selected = code;

	var nodes = BX.findChildren(this.dialogNodes.tabsContainer, { className: this.getRenderInstance().class.tab }, true);
	if (nodes)
	{
		for (i = 0; i < nodes.length; i++)
		{
			if (nodes[i].getAttribute('data-code') == code)
			{
				nodes[i].classList.add(this.getRenderInstance().class.tabSelected);
			}
			else
			{
				nodes[i].classList.remove(this.getRenderInstance().class.tabSelected);
			}
		}
	}

	nodes = BX.findChildren(this.dialogNodes.contentsContainer, { className: this.getRenderInstance().class.tabContent }, true);
	if (nodes)
	{
		for (i = 0; i < nodes.length; i++)
		{
			if (nodes[i].getAttribute('data-code') == code)
			{
				BX.cleanNode(nodes[i]);

				var contentCollection = this.buildContentCollection({
					type: code,
					items: (code == 'search' ? this.containerSearchResult : null)
				});
				for (j = 0; j < contentCollection.length; j++)
				{
					nodes[i].appendChild(contentCollection[j]);
				}

				nodes[i].classList.add(this.getRenderInstance().class.tabContentSelected);
			}
			else
			{
				nodes[i].classList.remove(this.getRenderInstance().class.tabContentSelected);
			}
		}
	}

	this.getNavigationInstance().hoverFirstItem({
		tab: code
	});

	if (this.getOption('focusInputOnSwitchTab') != 'N')
	{
		BX.focus(this.input);
	}


	var popup = (this.getOption('useContainer') == 'Y' ? this.popups.container : this.popups.main);

	setTimeout(function () {
		popup.bindOptions.forceTop = true;
		popup.bindOptions.position = this.getPopupPosition(popup);
		popup.adjustPosition();
		popup.bindOptions.forceTop = false;
	}.bind(this), 0);
};

BX.UI.Selector.prototype.getPopupPosition = function(popup)
{
	var
		popupPos = BX.pos(popup.getPopupContainer(), false),
		bindElementPos = BX.pos(popup.bindElement, false);

	return (
		popupPos.top < bindElementPos.top
			? 'top'
			: 'bottom'
	);
};

BX.UI.Selector.prototype.setOption = function(optionId, value, entityType)
{
	if (!BX.type.isNotEmptyString(entityType))
	{
		this.options[optionId] = value;
	}
	else
	{
		entityType = entityType.toUpperCase();
		if (BX.type.isNotEmptyObject(this.entities[entityType]))
		{
			if (!BX.type.isNotEmptyObject(this.entities[entityType].options))
			{
				this.entities[entityType].options = {};
			}
			this.entities[entityType].options[optionId] = value;
		}
	}
};

BX.UI.Selector.prototype.getOption = function(optionId, entityType)
{
	if (!BX.type.isNotEmptyString(entityType))
	{
		return (
			typeof this.options[optionId] != 'undefined'
				? this.options[optionId]
				: null
		);
	}
	else
	{
		entityType = entityType.toUpperCase();
		return (
			BX.type.isNotEmptyObject(this.entities[entityType])
			&& BX.type.isNotEmptyObject(this.entities[entityType].options)
			&& BX.type.isNotEmptyString(this.entities[entityType].options[optionId])
				? this.entities[entityType].options[optionId]
				: null
		);
	}
};

BX.UI.Selector.prototype.buildContentNode = function(params)
{
	var type = params.type;
	var tabsListToFill = [ this.tabs.selected ];

	if (this.getOption('useContainer') != 'Y')
	{
		tabsListToFill.push('search');
	}

	var contentCollection = [];

	if (BX.util.in_array(type, tabsListToFill))
	{
		contentCollection = this.buildContentCollection(params);
	}

	var result = BX.create('DIV', {
		attrs: {
			'data-code': type
		},
		props: {
			className: this.getRenderInstance().class.tabContent + ' ' + this.getRenderInstance().class.tabContentPrefix + type + ' ' + (BX.util.in_array(type, [ this.tabs.selected, 'search' ]) ? this.getRenderInstance().class.tabContentSelected : '')
		},
		children: contentCollection
	});

	if (type == 'search')
	{
		this.nodes.searchContent = result;
	}

	return result;
};

BX.UI.Selector.prototype.getItemsCodeList = function(params)
{
	var
		type = params.type,
		result = null;

	if (type == 'last')
	{
		result = this.getLastItems();
	}
	else if (type == 'search')
	{
		result = params.items;
	}
	else
	{
		result = this.getEntityItems(this.entities[type.toUpperCase()]);
	}

	return result;

};

BX.UI.Selector.prototype.buildContentCollection = function(params)
{
	var
		type = params.type,
		result = [],
		dialogGroup = null,
		groupNode = null,
		i = null;

	var itemsCodeList = this.getItemsCodeList(params);

	var useDialogGroups = BX.util.in_array(type, [ 'last', 'search' ]);
	if (useDialogGroups)
	{
		var dialogGroupsSort = [];

		for (var groupCode in this.dialogGroups)
		{
			if (this.dialogGroups.hasOwnProperty(groupCode))
			{
				dialogGroup = this.dialogGroups[groupCode];
				dialogGroupsSort.push({
					code: groupCode,
					value: (typeof dialogGroup.SORT != 'undefined' && parseInt(dialogGroup.SORT) > 0 ? parseInt(dialogGroup.SORT) : 100)
				});
			}
		}

		dialogGroupsSort.sort(function(a, b) {
			if (a.value < b.value)
			{
				return -1;
			}
			if (a.value > b.value)
			{
				return 1;
			}
			return 0;
		});

		var navData = {
			tab: type,
			group: 0
		};

		for (i=0; i < dialogGroupsSort.length; i++)
		{
			groupCode = dialogGroupsSort[i].code;

			groupNode = this.drawItemsGroup({
				groupCode: groupCode,
				itemsCodeList: itemsCodeList,
				descLessMode: (
					BX.type.isNotEmptyString(this.dialogGroups[groupCode].DESC_LESS_MODE)
					&& this.dialogGroups[groupCode].DESC_LESS_MODE == 'Y'
				),
				navData: navData
			});
			if (groupNode)
			{
				result.push(groupNode);
			}
		}
	}
	else if (BX.type.isNotEmptyObject(this.entities[type.toUpperCase()]))
	{
		var drawParams = {
			type: type,
			itemsCodeList: itemsCodeList,
			descLessMode: (
				BX.type.isNotEmptyObject(this.entities[type.toUpperCase()].additionalData)
				&& BX.type.isNotEmptyString(this.entities[type.toUpperCase()].additionalData.DESC_LESS_MODE)
				&& this.entities[type.toUpperCase()].additionalData.DESC_LESS_MODE == 'Y'
			)
		};

		if (
			BX.type.isNotEmptyObject(this.entities[type.toUpperCase()].additionalData)
			&& BX.type.isNotEmptyString(this.entities[type.toUpperCase()].additionalData.TYPE)
			&& this.entities[type.toUpperCase()].additionalData.TYPE == 'tree'
		)
		{
			var tabNodesCollection = this.drawItemsTreeTabNode(drawParams);
			for (i = 0; i < tabNodesCollection.length; i++)
			{
				result.push(tabNodesCollection[i]);
			}
		}
		else
		{
			var tabNode = this.drawItemsTab(drawParams);
			if (tabNode)
			{
				result.push(tabNode);
			}
		}
	}

	var emptyResult = false;

	if (result.length <= 0)
	{
		if (type == 'search')
		{
			emptyResult = true;

			this.nodes.contentWaiter = BX.create('SPAN', {
				props: {
					className: this.getRenderInstance().class.groupBoxContent
				},
				html: BX.message('MAIN_UI_SELECTOR_STUB_PLEASE_WAIT') // : 'MAIN_UI_SELECTOR_STUB_EMPTY_LIST')
			});

			var groupBox = BX.create('SPAN', {
				props: {
					className: this.getRenderInstance().class.groupBox + ' ' + this.getRenderInstance().class.groupBoxSearch
				},
				children: [
					this.nodes.contentWaiter
				]
			});

			if (
				this.getOption('useContainer') == 'Y'
				&& this.nodes.input
				&& !BX.type.isNotEmptyString(this.nodes.input.value)
			)
			{
				this.nodes.contentWaiter.style.display = 'none';
			}

			result.push(groupBox);
		}
		else
		{
			result.push(BX.create('SPAN', {
				props: {
					className: this.getRenderInstance().class.groupBox + ' ' + this.getRenderInstance().class.groupBoxSearch
				},
				children: [
					BX.create('SPAN', {
						props: {
							className: this.getRenderInstance().class.groupBoxContent
						},
						html: BX.message('MAIN_UI_SELECTOR_STUB_EMPTY_LIST')
					})
				]
			}));
		}
	}

	if (typeof this.result[type] != 'undefined')
	{
		this.cursors[type] = {
			firstItem: (!emptyResult ? this.result[type][0][0][0] : null), // obSearchFirstElement
			currentItem: (!emptyResult ? this.result[type][0][0][0] : null), // obCurrentElement.search
			position: { // obCursorPosition.search
				group: 0,
				row: 0,
				column: 0
			}
		};
	}

	return result;
};

BX.UI.Selector.prototype.getLastItems = function()
{
	var result = {};

	for (var entityCode in this.entities)
	{
		if (
			this.entities.hasOwnProperty(entityCode)
			&& BX.type.isArray(this.entities[entityCode].itemsLast)
		)
		{
			if (typeof result[entityCode] == 'undefined')
			{
				result[entityCode] = [];
			}

			for (var i=0; i < this.entities[entityCode].itemsLast.length; i++)
			{
				if (BX.util.in_array(this.entities[entityCode].itemsLast[i], result[entityCode]))
				{
					continue;
				}

				result[entityCode].push(this.entities[entityCode].itemsLast[i]);
			}
		}
	}

	return result;
};

BX.UI.Selector.prototype.getEntityItems = function(entityData)
{
	var result = [];

	if (!BX.type.isNotEmptyObject(entityData))
	{
		return result;
	}

	for (var entityCode in entityData.items)
	{
		if (entityData.items.hasOwnProperty(entityCode))
		{
			if (
				BX.util.in_array(entityCode, result)
				|| (
					BX.type.isNotEmptyString(entityData.items[entityCode].selectable)
					&& entityData.items[entityCode].selectable == 'N'
				)
			)
			{
				continue;
			}

			result.push(entityCode);
		}
	}

	return result;
};

BX.UI.Selector.prototype.drawItemsGroup = function(params)
{
	var result = null;

	var groupCode = params.groupCode;
	var itemsCodeList = params.itemsCodeList;

	if (
		!groupCode
		|| !BX.type.isNotEmptyObject(this.dialogGroups[groupCode])
	)
	{
		return result;
	}

	var
		groupContentNodeList = [],
		key, itemKey, entityType, item = null;

	if (BX.type.isNotEmptyObject(this.dialogGroups[groupCode].TYPE_LIST))
	{
		var itemsToDraw = [];
		for (key in this.dialogGroups[groupCode].TYPE_LIST)
		{
			if (this.dialogGroups[groupCode].TYPE_LIST.hasOwnProperty(key))
			{
				entityType = this.dialogGroups[groupCode].TYPE_LIST[key];
				if (BX.type.isNotEmptyObject(itemsCodeList[entityType]))
				{
					for (itemKey in itemsCodeList[entityType])
					{
						if (itemsCodeList[entityType].hasOwnProperty(itemKey))
						{
							item = {
								entityType: entityType,
								itemCode: itemsCodeList[entityType][itemKey]
							};
							if (BX.type.isNotEmptyObject(this.sortData[item.itemCode]))
							{
								item.sort = this.sortData[item.itemCode];
							}

							itemsToDraw.push(item);
						}
					}
				}
			}
		}

		itemsToDraw.sort(function(a, b) {
			if (
				typeof a.sort == 'undefined'
				&& typeof b.sort == 'undefined'
			)
			{
				return 0;
			}
			else if (
				typeof a.sort != 'undefined'
				&& typeof b.sort == 'undefined'
			)
			{
				return -1;
			}
			else if (
				typeof a.sort == 'undefined'
				&& typeof b.sort != 'undefined'
			)
			{
				return 1;
			}
			else
			{
				if (
					typeof a.sort.Y != 'undefined'
					&& typeof b.sort.Y == 'undefined'
				)
				{
					return -1;
				}
				else if (
					typeof a.sort.Y == 'undefined'
					&& typeof b.sort.Y != 'undefined'
				)
				{
					return 1;
				}
				else if (
					typeof a.sort.Y != 'undefined'
					&& typeof b.sort.Y != 'undefined'
				)
				{
					if (parseInt(a.sort.Y) > parseInt(b.sort.Y))
					{
						return -1;
					}
					else if (parseInt(a.sort.Y) < parseInt(b.sort.Y))
					{
						return 1;
					}
					else
					{
						return 0;
					}
				}
				else
				{
					if (parseInt(a.sort.N) > parseInt(b.sort.N))
					{
						return -1;
					}
					else if (parseInt(a.sort.N) < parseInt(b.sort.N))
					{
						return 1;
					}
					else
					{
						return 0;
					}
				}
			}
		});

		var
			drawResult = null,
			found = false,
			row = 0,
			column = 0;

		for (var i = 0; i < itemsToDraw.length; i++)
		{
			if (i == 0)
			{
				if (typeof this.result[params.navData.tab] == 'undefined')
				{
					this.result[params.navData.tab] = [];
				}
				this.result[params.navData.tab][params.navData.group] = [];
				found = true;
			}
			if (column == 2)
			{
				column = 0;
				row++;
			}

			if (typeof this.result[params.navData.tab][params.navData.group][row] == 'undefined')
			{
				this.result[params.navData.tab][params.navData.group][row] = [];
			}

			drawResult = this.drawItem(itemsToDraw[i]);
			if (drawResult)
			{
				this.result[params.navData.tab][params.navData.group][row][column] = {
					entityType: itemsToDraw[i].entityType,
					itemCode: itemsToDraw[i].itemCode
				};
				groupContentNodeList.push(drawResult);
				column++;
			}
		}

		if (found)
		{
			params.navData.group++;
		}
	}

	if (groupContentNodeList.length > 0)
	{
		result = BX.create('SPAN', {
			props: {
				className: this.getRenderInstance().class.groupBox + ' ' + this.getRenderInstance().class.groupBoxPrefix + groupCode
			},
			children: [
				BX.create('SPAN', {
					props: {
						className: this.getRenderInstance().class.groupBoxName
					},
					html: this.dialogGroups[groupCode].TITLE
				}),
				BX.create('SPAN', {
					props: {
						className: this.getRenderInstance().class.groupBoxContent
					},
					children: groupContentNodeList
				})
			]
		});
	}

	return result;
};

BX.UI.Selector.prototype.drawItemsTab = function(params)
{
	var type = params.type;
	var itemsCodeList = params.itemsCodeList;

	var
		groupContentNodeList = [],
		i = 0,
		row = 0,
		column = 0,
		item = null;

	if (BX.type.isNotEmptyObject(itemsCodeList))
	{
		for (var itemKey in itemsCodeList)
		{
			if (itemsCodeList.hasOwnProperty(itemKey))
			{
				if (i == 0)
				{
					this.result[params.type] = [];
					this.result[params.type][0] = [];
				}
				if (column == 2)
				{
					column = 0;
					row++;
				}

				if (typeof this.result[params.type][0][row] == 'undefined')
				{
					this.result[params.type][0][row] = [];
				}

				item = {
					entityType: type.toUpperCase(),
					itemCode: itemsCodeList[itemKey]
				};
				this.result[params.type][0][row][column] = item;
				groupContentNodeList.push(this.drawItem(item));
				column++;
			}
			i++;
		}
	}

	return BX.create('SPAN', {
		props: {
			className: this.getRenderInstance().class.groupBox + ' ' + this.getRenderInstance().class.groupBoxPrefix + type
		},
		children: [
			BX.create('SPAN', {
				props: {
					className: this.getRenderInstance().class.groupBoxContent
				},
				children: groupContentNodeList
			})
		]
	});
};

BX.UI.Selector.prototype.drawItemsTreeTabNode = function(params)
{
	var result = [];

	var
		type = (BX.type.isNotEmptyString(params.type) ? params.type : false),
		relation = (params.relation != 'undefined' ? params.relation : false),
		categoryId = (params.categoryId != 'undefined' ? params.categoryId : false),
		categoryOpened = params.categoryOpened,
		firstRelation = false,
		itemCode = null,
		category = null,
		i = null;

	if (
		!relation
		&& BX.type.isNotEmptyObject(this.entities[type.toUpperCase() + '_RELATION'])
		&& BX.type.isNotEmptyObject(this.entities[type.toUpperCase() + '_RELATION'].items)
	) // root
	{
		relation = this.entities[type.toUpperCase() + '_RELATION'].items;
		firstRelation = true;
	}

	if (!relation)
	{
		return result;
	}

	var selectText = (
		BX.type.isNotEmptyObject(this.entities[type.toUpperCase()].additionalData)
		&& BX.type.isNotEmptyString(this.entities[type.toUpperCase()].additionalData.SELECT_TEXT)
			? this.entities[type.toUpperCase()].additionalData.SELECT_TEXT
			: BX.message('MAIN_UI_SELECTOR_SELECT_TEXT')
	);
	var selectFlatText = (
		BX.type.isNotEmptyObject(this.entities[type.toUpperCase()].additionalData)
		&& BX.type.isNotEmptyString(this.entities[type.toUpperCase()].additionalData.SELECT_FLAT_TEXT)
			? this.entities[type.toUpperCase()].additionalData.SELECT_FLAT_TEXT
			: BX.message('MAIN_UI_SELECTOR_SELECT_FLAT_TEXT')
	);

	var
		branchNode = null,
		leavesContainer = null,
		checkBoxNode = null,
		nodeChildren = null;

	for (itemCode in relation)
	{
		if (
			relation.hasOwnProperty(itemCode)
			&& relation[itemCode].type == 'category'
		)
		{
			category = this.entities[type.toUpperCase()].items[relation[itemCode].id];
			firstRelation = (firstRelation && category.id != 'EX');

			branchNode = BX.create('DIV', {
				props: {
					className: this.getRenderInstance().class.treeBranch + ' ' + (firstRelation ? this.getRenderInstance().class.treeBranchOpened : '')
				},
				children: [
					BX.create('A', {
						attrs: {
							href: '#' + category.id,
							hidefocus: 'true',
							'data-entity-id': category.entityId
						},
						props: {
							className: this.getRenderInstance().class.treeBranchInner
						},
						events: {
							click: function(e) {
								this.openTreeItem({
									treeItemNode: e.currentTarget.parentNode,
									entityType: type,
									categoryId: e.currentTarget.getAttribute('data-entity-id')
								});
								e.stopPropagation();
								return e.preventDefault();
							}.bind(this)
						},
						children: [
							BX.create('DIV', {
								props: {
									className: this.getRenderInstance().class.treeBranchArrow
								}
							}),
							BX.create('DIV', {
								props: {
									className: this.getRenderInstance().class.treeBranchText
								},
								html: category.name
							})
						]
					})
				]
			});

			result.push(branchNode);

			checkBoxNode = (
				BX.type.isNotEmptyObject(this.entities[type.toUpperCase()].additionalData)
				&& BX.type.isNotEmptyString(this.entities[type.toUpperCase()].additionalData.ALLOW_SELECT)
				&& this.entities[type.toUpperCase()].additionalData.ALLOW_SELECT == 'Y'
				&& !firstRelation
				&& category.id != 'EX'
					? BX.create('A', {
						attrs: {
							hidefocus: 'true',
							href: '#' + relation[itemCode].id,
							'data-item-id': relation[itemCode].id,
							'data-entity-type': type.toUpperCase()
						},
						props: {
							className: this.getRenderInstance().class.treeBranchCheckBox + ' ' + (typeof this.itemsSelected[relation[itemCode].id] != 'undefined' ? this.getRenderInstance().class.treeBranchCheckBoxSelected : '') + ' ' + this.getRenderInstance().class.itemElement
						},
						events: {
							click: function(e) {
								this.selectItem({
									itemId: e.currentTarget.getAttribute('data-item-id'),
									entityType: e.currentTarget.getAttribute('data-entity-type'),
									itemNode: e.currentTarget,
									className: this.getRenderInstance().class.treeBranchCheckBoxSelected
								}); // 'department',  relation[itemCode].id, 'department'
								e.stopPropagation();
								return e.preventDefault();
							}.bind(this)
						},
						children: [
							BX.create('SPAN', {
								props: {
									className: this.getRenderInstance().class.treeBranchCheckBoxInner
								},
								children: [
									BX.create('DIV', {
										props: {
											className: this.getRenderInstance().class.treeBranchCheckBoxArrow
										}
									}),
									BX.create('DIV', {
										attrs: {
											rel: category.name + ': ' + selectText
										},
										props: {
											className: this.getRenderInstance().class.treeBranchCheckBoxText
										},
										html: selectText
									})
								]
							})
						]
					})
					: null
			);

			nodeChildren = [
				checkBoxNode
			];

			if (
				BX.type.isNotEmptyObject(this.entities[type.toUpperCase()].additionalData)
				&& BX.type.isNotEmptyString(this.entities[type.toUpperCase()].additionalData.ALLOW_FLAT)
				&& this.entities[type.toUpperCase()].additionalData.ALLOW_FLAT == 'Y'
//				&& !firstRelation
				&& category.id != 'EX'
				&& BX.type.isNotEmptyString(this.entities[type.toUpperCase()].items[relation[itemCode].id].idFlat)
			)
			{
				checkBoxNode = BX.create('A', {
					attrs: {
						hidefocus: 'true',
						href: '#' + this.entities[type.toUpperCase()].items[relation[itemCode].id].idFlat,
						'data-item-id': this.entities[type.toUpperCase()].items[relation[itemCode].id].idFlat,
						'data-entity-type': type.toUpperCase()
					},
					props: {
						className: this.getRenderInstance().class.treeBranchCheckBox + ' ' + (typeof this.itemsSelected[relation[itemCode].id] != 'undefined' ? this.getRenderInstance().class.treeBranchCheckBoxSelected : '') + ' ' + this.getRenderInstance().class.itemElement
					},
					events: {
						click: function(e) {
							this.selectItem({
								itemId: e.currentTarget.getAttribute('data-item-id'),
								entityType: e.currentTarget.getAttribute('data-entity-type'),
								itemNode: e.currentTarget,
								className: this.getRenderInstance().class.treeBranchCheckBoxSelected
							}); // 'department',  relation[itemCode].id, 'department'
							e.stopPropagation();
							return e.preventDefault();
						}.bind(this)
					},
					children: [
						BX.create('SPAN', {
							props: {
								className: this.getRenderInstance().class.treeBranchCheckBoxInner
							},
							children: [
								BX.create('DIV', {
									props: {
										className: this.getRenderInstance().class.treeBranchCheckBoxArrow
									}
								}),
								BX.create('DIV', {
									attrs: {
										rel: category.name + ': ' + selectFlatText
									},
									props: {
										className: this.getRenderInstance().class.treeBranchCheckBoxText
									},
									html: selectFlatText
								})
							]
						})
					]
				});

				nodeChildren.push(checkBoxNode);
			}

			var subParams = BX.clone(params);
			subParams.relation = relation[itemCode].items;
			subParams.categoryId = category.entityId;
			subParams.categoryOpened = firstRelation;

			var subResult = this.drawItemsTreeTabNode(subParams);

			if (subResult.length > 0)
			{
				for (i=0; i < subResult.length; i++)
				{
					nodeChildren.push(subResult[i]);
				}
			}

			leavesContainer = BX.create('DIV', {
				props: {
					className: this.getRenderInstance().class.treeBranchLeavesContainer + ' ' + (firstRelation ? this.getRenderInstance().class.treeBranchLeavesContainerOpened : '')
				},
				children: nodeChildren
			});

			result.push(leavesContainer);
		}
	}

	if (categoryId)
	{
		var
			relationNodesCollection = [],
			leafItem = null,
			leavesCount = 0;

		for (i in relation)
		{
			if (
				relation.hasOwnProperty(i)
				&& relation[i].type == this.entities[type.toUpperCase()].additionalData.RELATION_ENTITY_TYPE
			)
			{
				leafItem = this.entities[relation[i].type].items[relation[i].id];
				if (!leafItem)
				{
					continue;
				}

				relationNodesCollection.push(this.drawTreeLeafItem({
					entityType: relation[i].type,
					item: leafItem
				}));
				leavesCount++;
			}
		}

		if (leavesCount <= 0)
		{
			if (
				!BX.type.isNotEmptyObject(this.treeItemLoaded[type])
				|| !this.treeItemLoaded[type][categoryId]
			)
			{
				relationNodesCollection.push(BX.create('DIV', {
					props: {
						className: this.getRenderInstance().class.treeBranchLeavesWaiter
					},
					html: BX.message('MAIN_UI_SELECTOR_PLEASE_WAIT')
				}));
			}

			if (categoryOpened)
			{
				this.getTreeItemRelation({
					entityType: type,
					categoryId: categoryId
				});
			}
		}

		result.push(BX.create('DIV', {
			attrs: {
				id: 'bx-lm-category-relation-' + categoryId
			},
			props: {
				className: this.getRenderInstance().class.treeLeavesList
			},
			children: relationNodesCollection
		}));
	}

	return result;
};

BX.UI.Selector.prototype.drawTreeLeafItem = function(params)
{
	var
		entityType = params.entityType,
		leafItem = params.item;

	var activeClass = (
		typeof this.itemsSelected[leafItem.id] != 'undefined'
			? this.getRenderInstance().class.treeLeafSelected
			: ''
	);

	return BX.create('A', {
		attrs: {
			href: '#' + leafItem.id,
			rel: leafItem.id,
			hidefocus: 'true',
			'data-item-id': leafItem.id,
			'data-entity-type': entityType
		},
		props: {
			className: this.getRenderInstance().class.treeLeaf + ' ' + activeClass + ' ' + this.getRenderInstance().class.itemElement
		},
		events: {
			click: function(e)
			{
				this.selectItem({
					itemNode: e.currentTarget,
					itemId: e.currentTarget.getAttribute('data-item-id'),
					entityType: e.currentTarget.getAttribute('data-entity-type'),
					className: this.getRenderInstance().class.treeLeafSelected
				});
				e.stopPropagation();
				return e.preventDefault();
			}.bind(this)
		},
		children: [
			BX.create('DIV', {
				props: {
					className: this.getRenderInstance().class.treeLeafInfo
				},
				children: [
					BX.create('DIV', {
						props: {
							className: this.getRenderInstance().class.treeLeafName
						},
						html: leafItem.name
					}),
					BX.create('DIV', {
						props: {
							className: this.getRenderInstance().class.treeLeafDescription
						},
						html: leafItem.desc
					})
				]
			}),
			BX.create('DIV', {
				attrs: {
					style: (leafItem.avatar ? "background:url('" + leafItem.avatar + "') no-repeat center center; background-size: cover;" : "")
				},
				props: {
					className: this.getRenderInstance().class.treeLeafAvatar
				}
			})
		]
	});
};


BX.UI.Selector.prototype.openTreeItem = function(params)
{
	var
		treeItemNode = BX.type.isDomNode(params.treeItemNode) ? params.treeItemNode : null,
		categoryId = params.categoryId,
		entityType = params.entityType;

	var doOpen = !BX.hasClass(treeItemNode, this.getRenderInstance().class.treeBranchOpened);

	BX.toggleClass(treeItemNode, this.getRenderInstance().class.treeBranchOpened);

	var nextDiv = BX.findNextSibling(treeItemNode, {
		tagName: "div"
	});

	if (BX.hasClass(nextDiv, this.getRenderInstance().class.treeBranchLeavesContainer))
	{
		BX.toggleClass(nextDiv, this.getRenderInstance().class.treeBranchLeavesContainerOpened);
	}

	if (doOpen)
	{
		this.getTreeItemRelation({
			entityType: entityType,
			categoryId: categoryId
		});
	}

	return false;
};

BX.UI.Selector.prototype.getTreeItemRelation = function(params)
{
	var categoryId = params.categoryId; // departmentId

	if (!BX.type.isUndefined(this.treeItemLoaded[categoryId]))
	{
		return false;
	}

	params.callback = this.getTreeItemRelationCallback.bind(this);
	params.entityType = params.entityType.toUpperCase();
	params.selectorId = this.id;
	params.allowSearchSelf = (BX.type.isNotEmptyObject(this.entities['USERS']) && this.entities['USERS'].options.allowSearchSelf);

	BX.onCustomEvent(this, 'BX.UI.SelectorManager:getTreeItemRelation', [ params ]);
};

BX.UI.Selector.prototype.getTreeItemRelationCallback = function(params)
{
	if (
		typeof params.selectorInstanceId == 'undefined'
		|| this.id != params.selectorInstanceId
	)
	{
		return;
	}

	var
		entityType = params.entityType,
		categoryId = params.categoryId,
		data = params.data,
		relationItems = {},
		leafEntityType = null;

	if (categoryId != 'EX')
	{
		categoryId = parseInt(categoryId);
	}

	if (typeof this.treeItemLoaded[entityType] == 'undefined')
	{
		this.treeItemLoaded[entityType] = {};
	}

	this.treeItemLoaded[entityType][categoryId] = true;

	var relationItem = BX.util.object_search_key(
		(categoryId == 'EX' ? categoryId : this.entities[entityType.toUpperCase()].additionalData.PREFIX + categoryId),
		this.entities[entityType.toUpperCase() + '_RELATION'].items
	);

	if (
		BX.type.isNotEmptyObject(this.entities[entityType.toUpperCase()])
		&& BX.type.isNotEmptyObject(this.entities[entityType.toUpperCase()].additionalData)
		&& BX.type.isNotEmptyString(this.entities[entityType.toUpperCase()].additionalData.RELATION_ENTITY_TYPE)
	)
	{
		leafEntityType = this.entities[entityType.toUpperCase()].additionalData.RELATION_ENTITY_TYPE;
		relationItems = data[leafEntityType]; // data.USERS
	}

	// clean leaves
	var i = null;
	if (BX.type.isNotEmptyObject(relationItem.items))
	{
		for(i in relationItem.items)
		{
			if (!relationItem.items.hasOwnProperty(i))
			{
				continue;
			}

			if (relationItem.items[i].type == leafEntityType)
			{
				delete(relationItem.items[i]);
			}
		}
	}

	BX.cleanNode(BX('bx-lm-category-relation-' + categoryId));

	// add leaves
	for(i in relationItems)
	{
		if (
			relationItems.hasOwnProperty(i)
			&& BX.type.isNotEmptyObject(this.entities[leafEntityType])
		)
		{
			if (!BX.type.isNotEmptyObject(this.entities[leafEntityType].items[i]))
			{
				this.entities[leafEntityType].items[i] = relationItems[i];
			}

			if (
				BX('bx-lm-category-relation-' + categoryId)
				&& !relationItem.items[i]
			)
			{
				relationItem.items[i] = {
					id: i,
					type: leafEntityType
				};

				BX('bx-lm-category-relation-' + categoryId).appendChild(this.drawTreeLeafItem({
					entityType: leafEntityType,
					item: this.entities[leafEntityType].items[i]
				}));
			}
		}
	}

	if (this.popups.container)
	{
		this.popups.container.adjustPosition();
	}
	if (this.popups.main)
	{
		this.popups.main.adjustPosition();
	}
};

BX.UI.Selector.prototype.drawItem = function(params)
{
	var result = null;
	var entityType = (BX.type.isNotEmptyString(params.entityType) ? params.entityType : null);
	var itemCode = (BX.type.isNotEmptyString(params.itemCode) ? params.itemCode : null);

	if (
		!entityType
		|| !itemCode
	)
	{
		return result;
	}


	var item = (
		BX.type.isNotEmptyObject(this.entities[entityType])
		&& BX.type.isNotEmptyObject(this.entities[entityType].items)
		&& BX.type.isNotEmptyObject(this.entities[entityType].items[itemCode])
			? this.entities[entityType].items[itemCode]
			: null
	);

	if (!item)
	{
		return result;
	}

	var
		itemName = item.name,
		itemDesc = (BX.type.isNotEmptyString(item.desc) ? item.desc : '');

	if(
		this.getOption('emailDescMode') != 'Y'
		&& BX.type.isNotEmptyString(item.showEmail)
		&& item.showEmail == 'Y'
		&& BX.type.isNotEmptyString(item.email)
	)
	{
		itemName += ' (' + item.email + ')';
	}

	var showDescription = BX.type.isNotEmptyString(item.desc);
	showDescription = params.descLessMode && params.descLessMode == true ? false : showDescription;
	showDescription = showDescription || item.showDesc;

	var emailDescMode = (typeof params.emailDescMode != 'undefined' && params.emailDescMode == true);
	if (emailDescMode === true)
	{
		showDescription = true;
	}

	var avatarNode = null;

	if (BX.type.isNotEmptyString(item.avatar))
	{
		avatarNode = BX.create('DIV', {
			props: {
				className: this.getRenderInstance().class.itemAvatar
			},
			children: [
				BX.create('IMG', {
					attrs: {
						src: item.avatar,
						'bx-lm-item-id': item.id,
						'bx-lm-item-type': entityType.toLowerCase()
					},
					props: {
						className: this.getRenderInstance().class.itemAvatarImage
					},
					events: {
						error: function() {
							BX.onCustomEvent('removeClientDbObject', [ BX.UI.SelectorManager, this.getAttribute('bx-lm-item-id'), this.getAttribute('bx-lm-item-type') ]);
							BX.cleanNode(this, true);
						}
					}
				}),
				BX.create('SPAN', {
					props: {
						className: this.getRenderInstance().class.itemAvatarStatus
					}
				})
			]
		});
	}
	else
	{
		avatarNode = BX.create('DIV', {
			props: {
				className: this.getRenderInstance().class.itemAvatar + ' ' + (item.iconCustom ? this.getRenderInstance().class.itemAvatarCustom : '')
			},
			html: (item.iconCustom ? item.iconCustom : '')
		});
	}

	return BX.create('A', {
		attrs: {
			id: this.getItemNodeId({ entityType: entityType, itemId: item.id }),
			hidefocus: 'true',
			rel: item.id,
			'data-entity-type': entityType
		},
		props: {
			className: (
				this.getRenderInstance().class.item + ' ' +
				this.getRenderInstance().class.itemElement + ' ' +
				( typeof this.itemsSelected[item.id] != 'undefined' ? this.getRenderInstance().class.itemSelected : '') + ' ' +
				(params.itemHover ? this.getRenderInstance().class.itemHover : '') + ' ' + // when the first element in
				(showDescription ? this.getRenderInstance().class.itemShowDescriptionMode : '') + ' ' +
				(params.className ? ' ' + params.className : '') + ' ' +
				this.getRenderInstance().class.itemElementTypePrefix + entityType.toLowerCase()  + ' ' +
				(this.getOption('avatarLessMode') == 'Y' ? this.getRenderInstance().class.itemAvatarlessMode : '') + ' ' +
				(
					(BX.type.isNotEmptyString(item.isExtranet) && item.isExtranet == 'Y')
					|| (BX.type.isNotEmptyString(item.isNetwork) && item.isNetwork == 'Y')
						? this.getRenderInstance().class.itemElementExtranet
						: ''
				) + ' ' +
				(
					BX.type.isNotEmptyString(item.isCrmEmail)
					&& item.isCrmEmail == 'Y'
						? this.getRenderInstance().class.itemElementCrmEmail
						: ''
				) + ' ' +
				(
					BX.type.isNotEmptyString(item.isEmail)
					&& item.isEmail == 'Y'
						? this.getRenderInstance().class.itemElementEmail
						: ''
				) + ' ' +
				(
					entityType.toLowerCase() == 'users'
					&& this.getOption('showVacations') == 'Y'
					&& BX.type.isNotEmptyObject(this.entities[entityType].additionalData)
					&& BX.type.isNotEmptyObject(this.entities[entityType].additionalData['USERS_VACATION'])
					&& BX.type.isNotEmptyString(this.entities[entityType].additionalData['USERS_VACATION'][item.entityId])
						? this.getRenderInstance().class.itemElementVacation
						: ''
				)
			)
		},
		events: {
			click: function(e)
			{
				this.selectItem({
					entityType: e.currentTarget.getAttribute('data-entity-type'),
					itemNode: e.currentTarget,
					itemId: item.id
				});
				e.stopPropagation();
				return e.preventDefault();
			}.bind(this)
		},
		children: [
			avatarNode,
			BX.create('DIV', {
				props: {
					className: this.getRenderInstance().class.itemSpace
				}
			}),
			BX.create('DIV', {
				props: {
					className: this.getRenderInstance().class.itemInfo
				},
				children: [
					BX.create('DIV', {
						props: {
							className: this.getRenderInstance().class.itemName
						},
						html: itemName
					}),
					(
						showDescription
							? BX.create('DIV', {
								props: {
									className: this.getRenderInstance().class.itemDescription
								},
								html: itemDesc
							})
							: null
					)
				]
			})
		]
	});
};

BX.UI.Selector.prototype.isDialogOpen = function() // isOpenDialog
{
	return (
		this.popups.main != null
		|| this.popups.container != null
	);
};

BX.UI.Selector.prototype.isContainerOpen = function() // isOpenContainer
{
	return (this.popups.container != null);
};

BX.UI.Selector.prototype.isSearchOpen = function() // isOpenDialog
{
	return (
		this.popups.search != null
		|| this.popups.container != null
	);
};

BX.UI.Selector.prototype.closeDialog = function(params)
{
	var silent = (BX.type.isNotEmptyObject(params) && !!params.silent);

	if (this.popups.main != null)
	{
		if (silent)
		{
			this.popups.main.destroy();
		}
		else
		{
			this.popups.main.close();
		}
	}
	else if (this.popups.container != null)
	{
		if (silent)
		{
			this.popups.container.destroy();
		}
		else
		{
			this.popups.container.close();
		}
	}

	BX.onCustomEvent('BX.UI.SelectorManager:onDialogClose', [ this ]);
	return true;
};

BX.UI.Selector.prototype.closeSearch = function()
{
	if (this.popups.search)
	{
		this.popups.search.close();
	}
	else if (this.popups.container)
	{
		this.popups.container.close();
	}

	this.closeByEmptySearchResult = false;

	return true;
};

BX.UI.Selector.prototype.closeAllPopups = function()
{
	for (var code in this.popups)
	{
		if (!this.popups.hasOwnProperty(code))
		{
			continue;
		}

		if (this.popups[code])
		{
			this.popups[code].close();
		}
	}
};

BX.UI.Selector.prototype.getItemNodeId = function(params)
{
	return (this.id + '_' + (this.tabs.selected ? this.tabs.selected : '') + '_' + params.entityType + '_' + params.itemId).toLowerCase()
};

BX.UI.Selector.prototype.getAdditionalEntitiesData = function()
{
	var result = {};

	for (var entityType in this.entities) // group
	{
		if (!this.entities.hasOwnProperty(entityType))
		{
			continue;
		}

		result[entityType] = {};

		if (BX.type.isNotEmptyObject(this.entities[entityType].additionalData))
		{
			result[entityType] = this.entities[entityType].additionalData;
		}
	}

	return result;
};

BX.UI.Selector.prototype.setTagTitle = function() // BXfpSetLinkName
{
	if (BX.type.isDomNode(this.nodes.tag))
	{
		if (
			Object.keys(this.itemsSelected).length <= 0
			&& this.getOption('tagLink1')
		)
		{
			this.nodes.tag.innerHTML = this.getOption('tagLink1');
		}
		else if (
			Object.keys(this.itemsSelected).length > 0
			&& this.getOption('tagLink2')
		)
		{
			this.nodes.tag.innerHTML = this.getOption('tagLink2');
		}
	}
};

BX.UI.Selector.prototype.selectItem = function(params)
{
	var itemId = params.itemId,
		entityType = params.entityType, // type
		itemNode = params.itemNode, // element
		className = (BX.type.isNotEmptyString(params.className) ? params.className : this.getRenderInstance().class.itemSelected), // template
		tab = (BX.type.isNotEmptyString(params.tab) ? params.tab : ''); // template

	if (!BX.type.isNotEmptyString(itemId))
	{
		return false;
	}

	var isPromiseReturned = false;
	var promise = null;

	if (typeof this.callbackBefore.select == 'function')
	{
		if (BX.type.isNotEmptyObject(this.callbackBefore.context))
		{
			promise = this.callbackBefore.select.bind(this.callbackBefore.context)(itemId);
			isPromiseReturned =
				promise &&
				(
					Object.prototype.toString.call(promise) === "[object Promise]" ||
					promise.toString() === "[object BX.Promise]"
				)
			;
		}
	}

	if (!isPromiseReturned)
	{
		promise = Promise.resolve();
	}

	promise.then(
		function(result)
		{
			this.selectItemPromiseFulfilled({
				itemId: itemId,
				entityType: entityType,
				itemNode: itemNode,
				className: className,
				tab: tab
			});
		}.bind(this),
		function(reason)
		{
			this.selectItemPromiseRejected({
				itemId: itemId,
				entityType: entityType,
				itemNode: itemNode,
				className: className,
				tab: tab
			});
		}.bind(this)
	);
};

BX.UI.Selector.prototype.selectItemPromiseFulfilled = function(data)
{
	var
		itemId = data.itemId,
		entityType = data.entityType,
		itemNode = data.itemNode,
		className = data.className,
		tab = data.tab;

	if (this.getOption('focusInputOnSelectItem') != 'N')
	{
		BX.focus(this.input);
	}

	if (typeof this.itemsSelected[itemId] != 'undefined')
	{
		return this.unselectItem({
			itemNode: itemNode,
			itemId: itemId,
			entityType: entityType,
			className: className
		});
	}
	else
	{
		if (this.getOption('multiple') != 'Y')
		{
			this.itemsSelected = {};
		}
		this.itemsSelected[itemId] = entityType.toLowerCase();
	}

	if (!BX.type.isArray(this.entities[entityType].itemsLast))
	{
		this.entities[entityType].itemsLast = [];
	}

	if (!BX.util.in_array(itemId, this.entities[entityType].itemsLast))
	{
		this.entities[entityType].itemsLast.push(itemId);
	}

	BX.addClass(itemNode, className); // changeItemClass

	BX.onCustomEvent('BX.UI.Selector:onSelectItem', [ {
		selectorId: this.id,
		itemId: itemId
	} ]);

	BX.onCustomEvent('BX.UI.Selector:onChange', [{selectorId: this.id}]);

	if (this.callback.select)
	{
		this.callback.select({
			item: this.entities[entityType].items[itemId],
			entityType: entityType,
			selectorId: this.id,
			state: 'select',
			tab: tab
		});
	}

	if (this.popups.search)
	{
		this.popups.search.close();
	}

	if (
		this.getOption('multiple') != 'Y'
		&& this.getOption('preventCloseAfterSelect') != 'Y'
	)
	{
		if (this.popups.container)
		{
			this.popups.container.close();
		}
		if (this.popups.main)
		{
			this.popups.main.close();
		}
	}

	this.getSearchInstance().abortSearchRequest();
};

BX.UI.Selector.prototype.selectItemPromiseRejected = function(data)
{
};

BX.UI.Selector.prototype.deleteSelectedItem = function(params)
{
	var itemId = params.itemId;

	if (!BX.type.isNotEmptyString(itemId))
	{
		return false;
	}

	if (this.popups.main)
	{
		var itemNodes = BX.findChildren(this.popups.main.popupContainer, { attrs: { rel: itemId} }, true);
		if (itemNodes)
		{
			for (var i = 0; i < itemNodes.length; i++)
			{
				BX.removeClass(itemNodes[i], this.getRenderInstance().class.itemSelected);
				BX.removeClass(itemNodes[i], this.getRenderInstance().class.treeLeafSelected);
			}
		}
	}

	BX.onCustomEvent('BX.UI.Selector:onChange', [{selectorId: this.id}]);

	delete this.itemsSelected[itemId];
};

BX.UI.Selector.prototype.unselectItem = function(params)
{
	var
		itemId = params.itemId,
		entityType = params.entityType, // type
		itemNode = params.itemNode, // element
		className = (BX.type.isNotEmptyString(params.className) ? params.className : this.getRenderInstance().class.itemSelected); // template

	if (!BX.type.isNotEmptyString(itemId))
	{
		return false;
	}

	if (
		(
			!BX.type.isNotEmptyString(params.mode)
			|| params.mode != 'reinit'
		)
		&& (
			typeof this.itemsSelected[itemId] == 'undefined'
			|| BX.util.in_array(itemId, this.itemsUndeletable)
		)
	)
	{
		return false;
	}
	else
	{
		delete this.itemsSelected[itemId];
	}

	BX.removeClass(itemNode, className); // changeItemClass

	if (this.callback.unSelect)
	{
		this.callback.unSelect({
			item: this.entities[entityType].items[itemId],
			entityType: entityType,
			selectorId: this.id
		});
	}

	if (
		this.getOption('multiple') != 'Y'
		&& this.getOption('preventCloseAfterSelect') != 'Y'
	)
	{
		if (this.popups.container)
		{
			this.popups.container.close();
		}
		if (this.popups.main)
		{
			this.popups.main.close();
		}
		if (this.popups.search)
		{
			this.popups.search.close();
		}
	}

	return false;
};

BX.UI.Selector.prototype.deleteLastItem = function()
{
	var lastId = false;
	for (var itemId in this.itemsSelected)
	{
		if (this.itemsSelected.hasOwnProperty(itemId))
		{
			lastId = itemId;
		}
	}

	if (
		lastId
		&& !BX.util.in_array(lastId, this.itemsUndeletable)
	)
	{
		var entityType = this.itemsSelected[lastId];

		delete this.itemsSelected[lastId];

		if (this.callback.unSelect)
		{
			this.callback.unSelect({
				item: this.entities[entityType.toUpperCase()].items[lastId],
				entityType: entityType.toUpperCase(),
				selectorId: this.id
			});
		}
	}
};

BX.UI.Selector.prototype.reinit = function() // reInit
{
	var entityType = null;

	if (this.callback.select)
	{
		for (var itemId in this.itemsSelected)
		{
			if (this.itemsSelected.hasOwnProperty(itemId))
			{
				entityType = this.itemsSelected[itemId];
				if (
					BX.type.isNotEmptyObject(this.entities[entityType.toUpperCase()])
					&& BX.type.isNotEmptyObject(this.entities[entityType.toUpperCase()].items)
					&& BX.type.isNotEmptyObject(this.entities[entityType.toUpperCase()].items[itemId])
				)
				{
					this.callback.select({
						item: this.entities[entityType.toUpperCase()].items[itemId],
						entityType: entityType,
						selectorId: this.id,
						state: 'init'
					});
				}
			}
		}
	}
};

BX.UI.Selector.prototype.getItemsSelectedSorted = function() // reInit
{
	var
		result = [],
		entityType = null;

	for (var itemId in this.itemsSelected)
	{
		if (this.itemsSelected.hasOwnProperty(itemId))
		{
			entityType = this.itemsSelected[itemId];
			result.push({
				itemId: itemId,
				entityType: entityType,
				sort: (
					BX.type.isNotEmptyObject(this.entities)
					&& BX.type.isNotEmptyObject(this.entities[entityType.toUpperCase()])
					&& BX.type.isNotEmptyObject(this.entities[entityType.toUpperCase()].additionalData)
					&& typeof this.entities[entityType.toUpperCase()].additionalData.SORT_SELECTED != 'undefined'
						? parseInt(this.entities[entityType.toUpperCase()].additionalData.SORT_SELECTED)
						: 100
				)
			});
		}
	}

	result.sort(function(a, b) {
		if (a.sort < b.sort)
		{
			return -1;
		}
		if (a.sort > b.sort)
		{
			return 1;
		}
		return 0;
	});

	return result;


};
})();

Youez - 2016 - github.com/yon3zu
LinuXploit