Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/components/bitrix/main.ui.filter/templates/.default/
Upload File :
Current File : /var/www/homesaver/www/bitrix/components/bitrix/main.ui.filter/templates/.default/script.js

/* eslint-disable */
this.BX = this.BX || {};
(function (exports,ui_entitySelector,ui_notification,ui_icons_service,main_core_events,main_popup,main_core) {
	'use strict';

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['date-group'] = function (data) {
	    var group, select, deleteButton, label, dragButton;
	    group = {
	      block: 'main-ui-control-field-group',
	      name: data.name + '_datesel',
	      mix: 'mix' in data ? data.mix : null,
	      attrs: {
	        'data-type': 'type' in data ? data.type : '',
	        'data-name': 'name' in data ? data.name : '',
	        'data-time': data.enableTime
	      },
	      content: []
	    };
	    if ('label' in data && BX.type.isNotEmptyString(data.label)) {
	      var labelContent = data.label;
	      if ('icon' in data && BX.Type.isPlainObject(data.icon)) {
	        labelContent = [{
	          block: 'main-ui-control-field-label-icon',
	          tag: 'img',
	          attrs: {
	            title: data.icon.title ? data.icon.title : '',
	            src: data.icon.url
	          }
	        }, {
	          block: 'main-ui-control-field-label-text',
	          tag: 'span',
	          content: labelContent
	        }];
	      }
	      label = {
	        block: 'main-ui-control-field-label',
	        tag: 'span',
	        attrs: {
	          title: data.label
	        },
	        content: labelContent
	      };
	      group.content.push(label);
	    }
	    select = {
	      block: 'main-ui-control-field',
	      dragButton: false,
	      content: {
	        block: 'main-ui-select',
	        tabindex: 'tabindex' in data ? data.tabindex : '',
	        value: 'value' in data ? data.value : '',
	        items: 'items' in data ? data.items : '',
	        name: 'name' in data ? data.name + '_datesel' : '',
	        params: 'params' in data ? data.params : '',
	        valueDelete: false
	      }
	    };
	    group.content.push(select);
	    if ('content' in data && BX.type.isArray(data.content)) {
	      data.content.forEach(function (current) {
	        group.content.push(current);
	      });
	    }
	    if ('content' in data && (BX.type.isPlainObject(data.content) || BX.type.isNotEmptyString(data.content))) {
	      group.content.push(data.content);
	    }
	    deleteButton = {
	      block: 'main-ui-item-icon-container',
	      content: {
	        block: 'main-ui-item-icon',
	        mix: ['main-ui-delete', 'main-ui-filter-field-delete'],
	        tag: 'span',
	        attrs: {
	          title: 'deleteTitle' in data && data.deleteTitle ? data.deleteTitle : ''
	        }
	      }
	    };
	    group.content.push(deleteButton);
	    if (!('dragButton' in data) || data.dragButton !== false) {
	      dragButton = {
	        block: 'main-ui-filter-icon-grab',
	        mix: ['main-ui-item-icon'],
	        tag: 'span',
	        attrs: {
	          title: 'dragTitle' in data && data.dragTitle ? data.dragTitle : ''
	        }
	      };
	      group.content.push(dragButton);
	    }
	    return group;
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['main-ui-control-field'] = function (data) {
	    var field, deleteButton, valueDeleteButton, label, dragButton;
	    field = {
	      block: 'main-ui-control-field',
	      mix: 'mix' in data ? data.mix : null,
	      attrs: {
	        'data-type': 'type' in data ? data.type : '',
	        'data-name': 'name' in data ? data.name : ''
	      },
	      content: []
	    };
	    if ('label' in data && BX.type.isNotEmptyString(data.label)) {
	      var labelContent = data.label;
	      if ('icon' in data && BX.Type.isPlainObject(data.icon)) {
	        labelContent = [{
	          block: 'main-ui-control-field-label-icon',
	          tag: 'img',
	          attrs: {
	            title: data.icon.title ? data.icon.title : '',
	            src: data.icon.url
	          }
	        }, {
	          block: 'main-ui-control-field-label-text',
	          tag: 'span',
	          content: labelContent
	        }];
	      }
	      label = {
	        block: 'main-ui-control-field-label',
	        tag: 'span',
	        attrs: {
	          title: data.label
	        },
	        content: labelContent
	      };
	      field.content.push(label);
	    }
	    if (BX.type.isArray(data.content)) {
	      data.content.forEach(function (current) {
	        field.content.push(current);
	      });
	    } else if (BX.type.isPlainObject(data.content) || BX.type.isNotEmptyString(data.content)) {
	      field.content.push(data.content);
	    }
	    if ('valueDelete' in data && data.valueDelete === true) {
	      valueDeleteButton = {
	        block: 'main-ui-control-value-delete',
	        content: {
	          block: 'main-ui-control-value-delete-item',
	          tag: 'span'
	        }
	      };
	      field.content.push(valueDeleteButton);
	    }
	    if ('deleteButton' in data && data.deleteButton === true) {
	      deleteButton = {
	        block: 'main-ui-item-icon-container',
	        content: {
	          block: 'main-ui-item-icon',
	          mix: ['main-ui-delete', 'main-ui-filter-field-delete'],
	          tag: 'span',
	          attrs: {
	            title: 'deleteTitle' in data && data.deleteTitle ? data.deleteTitle : ''
	          }
	        }
	      };
	      field.content.push(deleteButton);
	    }
	    if (!('dragButton' in data) || data.dragButton !== false) {
	      dragButton = {
	        block: 'main-ui-filter-icon-grab',
	        mix: ['main-ui-item-icon'],
	        tag: 'span',
	        attrs: {
	          title: 'dragTitle' in data && data.dragTitle ? data.dragTitle : ''
	        }
	      };
	      field.content.push(dragButton);
	    }
	    return field;
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['main-ui-control-field-group'] = function (data) {
	    var field, deleteButton, label, dragButton;
	    field = {
	      block: 'main-ui-control-field-group',
	      mix: 'mix' in data ? data.mix : null,
	      attrs: {
	        'data-type': 'type' in data ? data.type : '',
	        'data-name': 'name' in data ? data.name : ''
	      },
	      content: []
	    };
	    if ('label' in data && BX.type.isNotEmptyString(data.label)) {
	      var labelContent = data.label;
	      if ('icon' in data && BX.Type.isPlainObject(data.icon)) {
	        labelContent = [{
	          block: 'main-ui-control-field-label-icon',
	          tag: 'img',
	          attrs: {
	            title: data.icon.title ? data.icon.title : '',
	            src: data.icon.url
	          }
	        }, {
	          block: 'main-ui-control-field-label-text',
	          tag: 'span',
	          content: labelContent
	        }];
	      }
	      label = {
	        block: 'main-ui-control-field-label',
	        tag: 'span',
	        attrs: {
	          title: data.label
	        },
	        content: labelContent
	      };
	      field.content.push(label);
	    }
	    if (BX.type.isArray(data.content)) {
	      data.content.forEach(function (current) {
	        field.content.push(current);
	      });
	    } else if (BX.type.isPlainObject(data.content) || BX.type.isNotEmptyString(data.content)) {
	      field.content.push(data.content);
	    }
	    if ('deleteButton' in data && data.deleteButton === true) {
	      deleteButton = {
	        block: 'main-ui-item-icon-container',
	        content: {
	          block: 'main-ui-item-icon',
	          mix: ['main-ui-delete', 'main-ui-filter-field-delete'],
	          tag: 'span',
	          attrs: {
	            title: 'deleteTitle' in data && data.deleteTitle ? data.deleteTitle : ''
	          }
	        }
	      };
	      field.content.push(deleteButton);
	    }
	    if (!('dragButton' in data) || data.dragButton !== false) {
	      dragButton = {
	        block: 'main-ui-filter-icon-grab',
	        mix: ['main-ui-item-icon'],
	        tag: 'span',
	        attrs: {
	          title: 'dragTitle' in data && data.dragTitle ? data.dragTitle : ''
	        }
	      };
	      field.content.push(dragButton);
	    }
	    return field;
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['main-ui-control-string'] = function (data) {
	    return {
	      block: 'main-ui-control-string',
	      mix: ['main-ui-control'],
	      tag: 'input',
	      attrs: {
	        type: 'type' in data ? data.type : 'text',
	        name: 'name' in data ? data.name : '',
	        placeholder: 'placeholder' in data ? data.placeholder : '',
	        tabindex: 'tabindex' in data ? data.tabindex : '',
	        value: 'value' in data ? data.value : ''
	      }
	    };
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['main-ui-control-textarea'] = function (data) {
	    return {
	      block: 'main-ui-control-string',
	      mix: ['main-ui-control main-ui-control-textarea'],
	      tag: 'textarea',
	      attrs: {
	        name: 'name' in data ? data.name : '',
	        placeholder: 'placeholder' in data ? data.placeholder : '',
	        tabindex: 'tabindex' in data ? data.tabindex : ''
	      },
	      content: 'value' in data ? data.value : ''
	    };
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['main-ui-filter-field-list-item'] = function (data) {
	    var label = {
	      block: 'main-ui-select-inner-label',
	      content: 'label' in data ? data.label : ''
	    };
	    var item = {
	      block: 'main-ui-filter-field-list-item',
	      mix: 'main-ui-select-inner-item',
	      attrs: {
	        'data-id': data.id,
	        'data-name': data.name,
	        'data-item': 'item' in data ? JSON.stringify(data.item) : {}
	      },
	      events: {
	        click: 'onClick' in data ? data.onClick : ''
	      },
	      content: label
	    };
	    return item;
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['main-ui-filter-info'] = function (data) {
	    return {
	      block: 'main-ui-filter-info',
	      tag: 'span',
	      content: data.content,
	      attrs: {
	        title: data.title
	      }
	    };
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['main-ui-number'] = function (data) {
	    var control, input, valueDelete;
	    control = {
	      block: 'main-ui-number',
	      mix: ['main-ui-control'],
	      content: []
	    };
	    if ('mix' in data && BX.type.isArray(data.mix)) {
	      data.mix.forEach(function (current) {
	        control.mix.push(current);
	      });
	    }
	    input = {
	      block: 'main-ui-number-input',
	      mix: ['main-ui-control-input'],
	      tag: 'input',
	      attrs: {
	        type: 'number',
	        name: 'name' in data ? data.name : '',
	        tabindex: 'tabindex' in data ? data.tabindex : '',
	        value: 'value' in data ? data.value : '',
	        placeholder: 'placeholder' in data ? data.placeholder : '',
	        autocomplete: 'off'
	      }
	    };
	    control.content.push(input);
	    if ('valueDelete' in data && data.valueDelete === true) {
	      valueDelete = {
	        block: 'main-ui-control-value-delete',
	        content: {
	          block: 'main-ui-control-value-delete-item',
	          tag: 'span'
	        }
	      };
	      control.content.push(valueDelete);
	    }
	    return control;
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['main-ui-search-square'] = function (data) {
	    var mix = ['main-ui-filter-search-square'];
	    if ('isPreset' in data && data.isPreset) {
	      mix.push('main-ui-filter-search-square-preset');
	    }
	    var title = 'title' in data ? data.title : '';
	    var name = 'name' in data ? BX.util.htmlspecialcharsback(data.name) : '';
	    if ('icon' in data && BX.Type.isPlainObject(data.icon)) {
	      var iconTitle = data.icon.title;
	      title = title.length ? iconTitle + ': ' + title : '';
	      name = name.length ? iconTitle + ': ' + name : '';
	    }
	    return {
	      block: 'main-ui-square',
	      mix: mix,
	      attrs: {
	        'data-item': 'item' in data ? JSON.stringify(data.item) : '',
	        'title': title
	      },
	      content: [{
	        block: 'main-ui-square-item',
	        content: name
	      }, {
	        block: 'main-ui-square-delete',
	        mix: ['main-ui-item-icon']
	      }]
	    };
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['number-group'] = function (data) {
	    var group, select, deleteButton, label, dragButton;
	    group = {
	      block: 'main-ui-control-field-group',
	      name: 'name' in data ? data.name + '_numsel' : '',
	      mix: 'mix' in data ? data.mix : null,
	      attrs: {
	        'data-type': 'type' in data ? data.type : '',
	        'data-name': 'name' in data ? data.name : ''
	      },
	      content: []
	    };
	    if ('label' in data && BX.type.isNotEmptyString(data.label)) {
	      var labelContent = data.label;
	      if ('icon' in data && BX.Type.isPlainObject(data.icon)) {
	        labelContent = [{
	          block: 'main-ui-control-field-label-icon',
	          tag: 'img',
	          attrs: {
	            title: data.icon.title ? data.icon.title : '',
	            src: data.icon.url
	          }
	        }, {
	          block: 'main-ui-control-field-label-text',
	          tag: 'span',
	          content: labelContent
	        }];
	      }
	      label = {
	        block: 'main-ui-control-field-label',
	        tag: 'span',
	        attrs: {
	          title: data.label
	        },
	        content: labelContent
	      };
	      group.content.push(label);
	    }
	    select = {
	      block: 'main-ui-control-field',
	      dragButton: false,
	      content: {
	        block: 'main-ui-select',
	        tabindex: 'tabindex' in data ? data.tabindex : '',
	        value: 'value' in data ? data.value : '',
	        items: 'items' in data ? data.items : '',
	        name: 'name' in data ? data.name + '_numsel' : '',
	        params: 'params' in data ? data.params : '',
	        valueDelete: false
	      }
	    };
	    group.content.push(select);
	    if ('content' in data && BX.type.isArray(data.content)) {
	      data.content.forEach(function (current) {
	        group.content.push(current);
	      });
	    }
	    if ('content' in data && (BX.type.isPlainObject(data.content) || BX.type.isNotEmptyString(data.content))) {
	      group.content.push(data.content);
	    }
	    deleteButton = {
	      block: 'main-ui-item-icon-container',
	      content: {
	        block: 'main-ui-item-icon',
	        mix: ['main-ui-delete', 'main-ui-filter-field-delete'],
	        tag: 'span',
	        attrs: {
	          title: 'deleteTitle' in data && data.deleteTitle ? data.deleteTitle : ''
	        }
	      }
	    };
	    group.content.push(deleteButton);
	    if (!('dragButton' in data) || data.dragButton !== false) {
	      dragButton = {
	        block: 'main-ui-filter-icon-grab',
	        mix: ['main-ui-item-icon'],
	        tag: 'span',
	        attrs: {
	          title: 'dragTitle' in data && data.dragTitle ? data.dragTitle : ''
	        }
	      };
	      group.content.push(dragButton);
	    }
	    return group;
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui.block');
	  BX.Main.ui.block['sidebar-item'] = function (data) {
	    return {
	      block: 'main-ui-filter-sidebar-item' + ('pinned' in data && data.pinned ? ' main-ui-item-pin' : ''),
	      attrs: {
	        'data-id': 'id' in data ? data.id : ''
	      },
	      content: [{
	        block: 'main-ui-filter-icon-grab',
	        tag: 'span',
	        mix: ['main-ui-item-icon'],
	        attrs: {
	          title: 'dragTitle' in data && data.dragTitle ? data.dragTitle : ''
	        }
	      }, {
	        block: 'main-ui-filter-sidebar-item-text-container',
	        tag: 'span',
	        content: [{
	          block: 'main-ui-filter-sidebar-item-input',
	          tag: 'input',
	          attrs: {
	            type: 'text',
	            placeholder: 'placeholder' in data ? data.placeholder : '',
	            value: 'text' in data ? BX.util.htmlspecialchars(BX.util.htmlspecialcharsback(data.text)) : ''
	          }
	        }, {
	          block: 'main-ui-filter-sidebar-item-text',
	          tag: 'span',
	          content: 'text' in data ? data.text : '',
	          attrs: {
	            title: 'text' in data ? data.text : ''
	          }
	        }, {
	          block: 'main-ui-filter-icon-pin',
	          tag: 'span',
	          mix: ['main-ui-item-icon'],
	          attrs: {
	            title: 'noEditPinTitle' in data && data.noEditPinTitle ? data.noEditPinTitle : ''
	          }
	        }]
	      }, {
	        block: 'main-ui-filter-icon-edit',
	        tag: 'span',
	        mix: ['main-ui-item-icon'],
	        attrs: {
	          title: 'editNameTitle' in data && data.editNameTitle ? data.editNameTitle : ''
	        }
	      }, {
	        block: 'main-ui-delete',
	        tag: 'span',
	        mix: ['main-ui-item-icon'],
	        attrs: {
	          title: 'removeTitle' in data && data.removeTitle ? data.removeTitle : ''
	        }
	      }, {
	        block: 'main-ui-filter-icon-pin',
	        tag: 'span',
	        mix: ['main-ui-item-icon'],
	        attrs: {
	          title: 'editPinTitle' in data && data.editPinTitle ? data.editPinTitle : ''
	        }
	      }, {
	        block: 'main-ui-filter-edit-mask'
	      }]
	    };
	  };
	})();

	(function () {

	  BX.namespace('BX.Filter');

	  /**
	   * @type {{
	   * 		cache: {},
	   * 		styleForEach: BX.Filter.Utils.styleForEach,
	   * 		closestParent: BX.Filter.Utils.closestParent,
	   * 		closestChilds: BX.Filter.Utils.closestChilds,
	   * 		getNext: BX.Filter.Utils.getNext,
	   * 		getPrev: BX.Filter.Utils.getPrev,
	   * 		collectionSort: BX.Filter.Utils.collectionSort,
	   * 		getIndex: BX.Filter.Utils.getIndex,
	   * 		getByClass: BX.Filter.Utils.getByClass,
	   * 		getByTag: BX.Filter.Utils.getByTag,
	   * 		getBySelector: BX.Filter.Utils.getBySelector,
	   * 		requestAnimationFrame: BX.Filter.Utils.requestAnimationFrame,
	   * 		sortObject: BX.Filter.Utils.sortObject,
	   * 		objectsIsEquals: BX.Filter.Utils.objectsIsEquals,
	   * 		isKey: BX.Filter.Utils.isKey
	   * 	}}
	   */
	  BX.Filter.Utils = {
	    /** @protected **/
	    cache: {},
	    /**
	     * Sets css properties for element or elements collection
	     * @param {?HTMLElement|?HTMLElement[]} collection
	     * @param {object} properties
	     */
	    styleForEach: function styleForEach(collection, properties) {
	      var keys;
	      properties = BX.type.isPlainObject(properties) ? properties : null;
	      keys = Object.keys(properties);
	      [].forEach.call(collection || [], function (current) {
	        keys.forEach(function (propKey) {
	          BX.style(current, propKey, properties[propKey]);
	        });
	      });
	    },
	    /**
	     * Gets closest parent or closest parent element with class name
	     * @param {HTMLElement} item
	     * @param {?string} [className]
	     * @return {?HTMLElement|?Node}
	     */
	    closestParent: function closestParent(item, className) {
	      if (item) {
	        if (!className) {
	          return item.parentNode || null;
	        } else {
	          return BX.findParent(item, {
	            className: className
	          });
	        }
	      }
	    },
	    /**
	     * Gets closest childs elements
	     * @param {HTMLElement} item
	     * @return {?HTMLElement}
	     */
	    closestChilds: function closestChilds(item) {
	      return !!item ? item.children : null;
	    },
	    /**
	     * Gets next element
	     * @param {HTMLElement} currentItem
	     * @return {?HTMLElement}
	     */
	    getNext: function getNext(currentItem) {
	      return !!currentItem ? currentItem.nextElementSibling : null;
	    },
	    /**
	     * Gets previews element
	     * @param {HTMLElement} currentItem
	     * @return {?HTMLElement}
	     */
	    getPrev: function getPrev(currentItem) {
	      return !!currentItem ? currentItem.previousElementSibling : null;
	    },
	    /**
	     * Move current item after target item
	     * @param {HTMLElement} current
	     * @param {HTMLElement} target
	     */
	    collectionSort: function collectionSort(current, target) {
	      var root, collection, collectionLength, currentIndex, targetIndex;
	      if (current && target && current !== target && current.parentNode === target.parentNode) {
	        root = this.closestParent(target);
	        collection = this.closestChilds(root);
	        collectionLength = collection.length;
	        currentIndex = this.getIndex(collection, current);
	        targetIndex = this.getIndex(collection, target);
	        if (collectionLength === targetIndex) {
	          root.appendChild(target);
	        }
	        if (currentIndex > targetIndex) {
	          root.insertBefore(current, target);
	        }
	        if (currentIndex < targetIndex && collectionLength !== targetIndex) {
	          root.insertBefore(current, this.getNext(target));
	        }
	      }
	    },
	    /**
	     * Gets collection item index
	     * @param {Array|HTMLCollection|NodeList} collection
	     * @param {*} item
	     * @return {int}
	     */
	    getIndex: function getIndex(collection, item) {
	      return [].indexOf.call(collection || [], item);
	    },
	    /**
	     * Gets elements by class name
	     * @param {HTMLElement|HTMLDocument} rootElement
	     * @param {string} className
	     * @param {boolean} [all = false]
	     * @returns {?HTMLElement|?HTMLElement[]}
	     */
	    getByClass: function getByClass(rootElement, className, all) {
	      var result = [];
	      if (className) {
	        result = (rootElement || document.body).getElementsByClassName(className);
	        if (!all) {
	          result = result.length ? result[0] : null;
	        } else {
	          result = [].slice.call(result);
	        }
	      }
	      return result;
	    },
	    /**
	     * Gets element or elements by tag name
	     * @param {HTMLElement|HTMLDocument} rootElement
	     * @param {string} tag
	     * @param {boolean} [all = false]
	     * @return {?HTMLElement|?HTMLElement[]}
	     */
	    getByTag: function getByTag(rootElement, tag, all) {
	      var result = [];
	      if (tag) {
	        result = (rootElement || document.body).getElementsByTagName(tag);
	        if (!all) {
	          result = result.length ? result[0] : null;
	        } else {
	          result = [].slice.call(result);
	        }
	      }
	      return result;
	    },
	    /**
	     * Gets element or elements by css selector
	     * @param {HTMLElement|HTMLDocument|Node} rootElement
	     * @param {string} selector
	     * @param {boolean} [all = false]
	     * @return {?HTMLElement|?HTMLElement[]}
	     */
	    getBySelector: function getBySelector(rootElement, selector, all) {
	      var result = [];
	      if (selector) {
	        if (!all) {
	          result = (rootElement || document.body).querySelector(selector);
	        } else {
	          result = (rootElement || document.body).querySelectorAll(selector);
	          result = [].slice.call(result);
	        }
	      }
	      return result;
	    },
	    requestAnimationFrame: function requestAnimationFrame() {
	      var raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame || function (callback) {
	        window.setTimeout(callback, 1000 / 60);
	      };
	      raf.apply(window, arguments);
	    },
	    /**
	     * Sorts object properties
	     * @param {object} input
	     * @return {object}
	     */
	    sortObject: function sortObject(input) {
	      var output = {};
	      Object.keys(input).sort().forEach(function (key) {
	        output[key] = input[key];
	      });
	      return output;
	    },
	    /**
	     * Compares two objects or arrays
	     * @param {object} object1
	     * @param {object} object2
	     * @return {boolean}
	     */
	    objectsIsEquals: function objectsIsEquals(object1, object2) {
	      return JSON.stringify(object1) === JSON.stringify(object2);
	    },
	    isKey: function isKey(event, keyCode) {
	      var keyboard = {
	        8: 'backspace',
	        9: 'tab',
	        13: 'enter',
	        16: 'shift',
	        17: 'ctrl',
	        18: 'alt',
	        27: 'escape',
	        32: 'space',
	        37: 'leftArrow',
	        38: 'upArrow',
	        39: 'rightArrow',
	        40: 'downArrow',
	        46: 'delete',
	        112: 'f1',
	        113: 'f2',
	        114: 'f3',
	        115: 'f4',
	        116: 'f5',
	        117: 'f6',
	        118: 'f7',
	        119: 'f8',
	        120: 'f9',
	        121: 'f10',
	        122: 'f11',
	        123: 'f12',
	        65: 'a'
	      };
	      var code = !!event ? 'keyCode' in event ? event.keyCode : 'which' in event ? event.which : 0 : 0;
	      return code in keyboard && keyboard[code] === keyCode;
	    }
	  };
	})();

	(function () {

	  BX.namespace('BX.Filter');
	  BX.Filter.DestinationSelectorManager = {
	    fields: [],
	    controls: {},
	    onSelect: function onSelect(isNumeric, prefix, params) {
	      if (!BX.type.isNotEmptyObject(params) || !BX.type.isNotEmptyObject(params.item) || !BX.type.isNotEmptyString(params.selectorId)) {
	        return;
	      }
	      var selectorId = params.selectorId,
	        item = params.item;
	      var control = BX.Filter.DestinationSelectorManager.controls[selectorId];
	      if (control) {
	        var value = item.id;
	        if (BX.type.isNotEmptyString(isNumeric) && isNumeric == 'Y' && BX.type.isNotEmptyString(prefix)) {
	          var re = new RegExp('^' + prefix + '(\\d+)$');
	          var found = value.match(re);
	          if (BX.type.isArray(found)) {
	            value = found[1];
	          }
	        } else {
	          var eventResult = {};
	          BX.onCustomEvent(window, 'BX.Filter.DestinationSelector:convert', [{
	            selectorId: selectorId,
	            value: value
	          }, eventResult]);
	          if (BX.type.isNotEmptyString(eventResult.value)) {
	            value = eventResult.value;
	          }
	        }
	        control.setData(BX.util.htmlspecialcharsback(item.name), value);
	        control.getLabelNode().value = '';
	        control.getLabelNode().blur();
	      }
	    },
	    onDialogOpen: function onDialogOpen(params) {
	      if (typeof params == 'undefined' || !BX.type.isNotEmptyString(params.selectorId)) {
	        return;
	      }
	      var selectorId = params.selectorId;
	      var item = BX.Filter.DestinationSelector.items[selectorId];
	      if (item) {
	        item.onDialogOpen();
	      }
	    },
	    onDialogClose: function onDialogClose(params) {
	      if (typeof params == 'undefined' || !BX.type.isNotEmptyString(params.selectorId)) {
	        return;
	      }
	      var selectorId = params.selectorId;
	      var item = BX.Filter.DestinationSelector.items[selectorId];
	      if (item) {
	        item.onDialogClose();
	      }
	    }
	  };
	  BX.Filter.DestinationSelector = function () {
	    this.id = "";
	    this.filterId = "";
	    this.settings = {};
	    this.fieldId = "";
	    this.control = null;
	    this.inited = null;
	  };
	  BX.Filter.DestinationSelector.items = {};
	  BX.Filter.DestinationSelector.create = function (id, settings) {
	    if (typeof this.items[id] != 'undefined') {
	      return this.items[id];
	    }
	    var self = new BX.Filter.DestinationSelector(id, settings);
	    self.initialize(id, settings);
	    this.items[id] = self;
	    BX.onCustomEvent(window, 'BX.Filter.DestinationSelector:create', [id]);
	    return self;
	  };
	  BX.Filter.DestinationSelector.prototype.getSetting = function (name, defaultval) {
	    return this.settings.hasOwnProperty(name) ? this.settings[name] : defaultval;
	  };
	  BX.Filter.DestinationSelector.prototype.getSearchInput = function () {
	    return this.control ? this.control.getLabelNode() : null;
	  };
	  BX.Filter.DestinationSelector.prototype.initialize = function (id, settings) {
	    this.id = id;
	    this.settings = settings ? settings : {};
	    this.fieldId = this.getSetting("fieldId", "");
	    this.filterId = this.getSetting("filterId", "");
	    this.inited = false;
	    this.opened = null;
	    var initialValue = this.getSetting("initialValue", false);
	    if (!!initialValue) {
	      var initialSettings = {};
	      initialSettings[this.fieldId] = initialValue.itemId;
	      initialSettings[this.fieldId + '_label'] = initialValue.itemName;
	      BX.Main.filterManager.getById(this.filterId).getApi().setFields(initialSettings);
	    }
	    BX.addCustomEvent(window, "BX.Main.Filter:customEntityFocus", BX.delegate(this.onCustomEntitySelectorOpen, this));
	    BX.addCustomEvent(window, "BX.Main.Filter:customEntityBlur", BX.delegate(this.onCustomEntitySelectorClose, this));
	    BX.addCustomEvent(window, "BX.Main.Filter:onGetStopBlur", BX.delegate(this.onGetStopBlur, this));
	    BX.addCustomEvent(window, "BX.Main.SelectorV2:beforeInitDialog", BX.delegate(this.onBeforeInitDialog, this));
	    BX.addCustomEvent(window, "BX.Main.Filter:customEntityRemove", BX.delegate(this.onCustomEntityRemove, this));
	  };
	  BX.Filter.DestinationSelector.prototype.open = function () {
	    var name = this.id;
	    if (!this.inited) {
	      var input = this.getSearchInput();
	      input.id = input.name;
	      BX.addCustomEvent(window, "BX.Main.SelectorV2:afterInitDialog", BX.delegate(function (params) {
	        if (typeof params.id != 'undefined' || params.id != this.id) {
	          return;
	        }
	        this.opened = true;
	      }, this));
	      BX.addCustomEvent(window, "BX.UI.SelectorManager:onCreate", BX.delegate(function (selectorId) {
	        if (!BX.type.isNotEmptyString(selectorId) || selectorId != this.id) {
	          return;
	        }
	        BX.onCustomEvent(window, 'BX.Filter.DestinationSelector:setSelected', [{
	          selectorId: selectorId,
	          current: this.control.getCurrentValues()
	        }]);
	      }, this));
	      BX.onCustomEvent(window, 'BX.Filter.DestinationSelector:openInit', [{
	        id: this.id,
	        inputId: input.id,
	        containerId: input.id
	      }]);
	    } else {
	      var currentValue = {};
	      currentValue[this.currentUser.entityId] = "users";
	      BX.onCustomEvent(window, 'BX.Filter.DestinationSelector:open', [{
	        id: this.id,
	        bindNode: this.control.getField(),
	        value: currentValue
	      }]);
	      this.opened = true;
	    }
	  };
	  BX.Filter.DestinationSelector.prototype.close = function () {
	    if (typeof BX.Main.selectorManagerV2.controls[this.id] !== "undefined") {
	      BX.Main.selectorManagerV2.controls[this.id].closeDialog();
	    }
	  };
	  BX.Filter.DestinationSelector.prototype.onCustomEntitySelectorOpen = function (control) {
	    var fieldId = control.getId();
	    if (this.fieldId !== fieldId) {
	      this.control = null;
	    } else {
	      this.control = control;
	      if (this.control) {
	        var current = this.control.getCurrentValues();
	        this.currentUser = {
	          entityId: current["value"]
	        };
	      }
	      BX.Filter.DestinationSelectorManager.controls[this.id] = this.control;
	      if (!this.opened) {
	        this.open();
	      } else {
	        this.close();
	      }
	    }
	  };
	  BX.Filter.DestinationSelector.prototype.onCustomEntitySelectorClose = function (control) {
	    if (this.fieldId === control.getId() && this.inited === true && this.opened === true) {
	      this.control = null;
	      window.setTimeout(BX.delegate(this.close, this), 0);
	    }
	  };
	  BX.Filter.DestinationSelector.prototype.onGetStopBlur = function (event, result) {
	    if (BX.findParent(event.target, {
	      className: 'bx-lm-box'
	    })) {
	      result.stopBlur = true;
	    }
	  };
	  BX.Filter.DestinationSelector.prototype.onCustomEntityRemove = function (control) {
	    if (this.fieldId === control.getId()) {
	      var instance = BX.UI.SelectorManager.instances[control.getId()];
	      if (instance && typeof control.hiddenInput != 'undefined' && typeof control.hiddenInput.value != 'undefined' && BX.type.isNotEmptyObject(instance.itemsSelected) && typeof instance.itemsSelected[control.hiddenInput.value] != 'undefined') {
	        delete instance.itemsSelected[control.hiddenInput.value];
	      }
	    }
	  };
	  BX.Filter.DestinationSelector.prototype.onBeforeInitDialog = function (params) {
	    if (typeof params.id == 'undefined' || params.id != this.id) {
	      return;
	    }
	    this.inited = true;
	    if (!this.control) {
	      params.blockInit = true;
	    }
	  };
	  BX.Filter.DestinationSelector.prototype.onDialogOpen = function () {
	    this.opened = true;
	  };
	  BX.Filter.DestinationSelector.prototype.onDialogClose = function () {
	    this.opened = false;
	  };
	})();

	function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
	function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { babelHelpers.defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
	var EntitySelector = /*#__PURE__*/function () {
	  function EntitySelector(id, settings) {
	    babelHelpers.classCallCheck(this, EntitySelector);
	    babelHelpers.defineProperty(this, "id", null);
	    babelHelpers.defineProperty(this, "filter", null);
	    babelHelpers.defineProperty(this, "dialog", null);
	    babelHelpers.defineProperty(this, "dialogOptions", null);
	    babelHelpers.defineProperty(this, "control", null);
	    babelHelpers.defineProperty(this, "isMultiple", false);
	    babelHelpers.defineProperty(this, "needAddEntityIdToFilter", false);
	    babelHelpers.defineProperty(this, "isActive", false);
	    babelHelpers.defineProperty(this, "needShowDialogOnEmptyInput", true);
	    this.id = id;
	    this.settings = settings ? settings : {};
	    this.filter = this.getSetting('filter', null);
	    if (!this.filter) {
	      throw new Error('Filter option is required for EntitySelector field');
	    }
	    this.isMultiple = !!this.getSetting('isMultiple', false);
	    this.needAddEntityIdToFilter = this.getSetting('addEntityIdToResult', 'N') === 'Y';
	    this.needShowDialogOnEmptyInput = !!this.getSetting('showDialogOnEmptyInput', true);
	    this.dialogOptions = this.prepareDialogOptions();
	    this.dialog = null;
	    main_core_events.EventEmitter.subscribe('BX.Main.Filter:customEntityFocus', this.onCustomEntityFocus.bind(this));
	    main_core_events.EventEmitter.subscribe('BX.Main.Filter:customEntityBlur', this.onCustomEntityBlur.bind(this));
	    main_core_events.EventEmitter.subscribe('BX.Main.Filter:onGetStopBlur', this.onGetStopBlur.bind(this));
	    main_core_events.EventEmitter.subscribe('BX.Main.Filter:move', this.onCustomEntityRemove.bind(this));
	    main_core_events.EventEmitter.subscribe('BX.Main.Filter:onApplyPreset', this.onApplyPreset.bind(this));
	    this.controlInputChangeHandler = this.onSearchInputChange.bind(this);
	  }
	  babelHelpers.createClass(EntitySelector, [{
	    key: "open",
	    value: function open() {
	      var _this = this;
	      this.isActive = true;
	      if (!this.dialog) {
	        this.initDialog().then(function () {
	          if (_this.isActive) {
	            _this.openDialog();
	          }
	        });
	      } else {
	        this.openDialog();
	      }
	    }
	  }, {
	    key: "close",
	    value: function close() {
	      this.isActive = false;
	      if (this.dialog && this.dialog.isOpen()) {
	        this.dialog.hide();
	      }
	    }
	  }, {
	    key: "getFilterField",
	    value: function getFilterField() {
	      return this.filter.getField(this.id);
	    }
	  }, {
	    key: "getFilterFieldInputWrapper",
	    value: function getFilterFieldInputWrapper() {
	      var field = this.getFilterField();
	      if (!field) {
	        return null;
	      }
	      return BX.Filter.Utils.getBySelector(field.node, '.main-ui-control-entity');
	    }
	  }, {
	    key: "getFilterFieldInput",
	    value: function getFilterFieldInput() {
	      var field = this.getFilterField();
	      if (!field) {
	        return null;
	      }
	      return BX.Filter.Utils.getBySelector(field.node, '.' + this.filter.settings.classStringInput + '[type="text"]');
	    }
	  }, {
	    key: "setControl",
	    value: function setControl(control) {
	      this.control = control;
	    }
	  }, {
	    key: "unsetControl",
	    value: function unsetControl() {
	      this.control = null;
	    }
	  }, {
	    key: "getSetting",
	    value: function getSetting(name, defaultValue) {
	      return this.settings.hasOwnProperty(name) ? this.settings[name] : defaultValue;
	    }
	  }, {
	    key: "prepareDialogOptions",
	    value: function prepareDialogOptions() {
	      var defaultOptions = {
	        enableSearch: false,
	        hideOnSelect: true,
	        autoHide: false,
	        hideByEsc: false
	      };
	      var dialogOptions = this.getSetting('dialogOptions', {});
	      dialogOptions = Object.assign(defaultOptions, dialogOptions);
	      return dialogOptions;
	    }
	  }, {
	    key: "openDialog",
	    value: function openDialog() {
	      if (this.dialog.isOpen()) {
	        return;
	      }
	      var inputWrapper = this.getFilterFieldInputWrapper();
	      var searchInput = this.getFilterFieldInput();
	      var searchQuery = main_core.Type.isDomNode(searchInput) ? searchInput.value.trim() : '';
	      this.dialog.setTargetNode(inputWrapper);
	      this.dialog.setWidth(inputWrapper.offsetWidth);
	      if (this.needShowDialogOnEmptyInput || searchQuery.length) {
	        this.dialog.show();
	      }
	      this.updateSelectedItemsInDialog(this.dialog);
	      if (searchQuery.length) {
	        this.dialog.search(searchQuery);
	      }
	    }
	  }, {
	    key: "initDialog",
	    value: function initDialog() {
	      var _this2 = this;
	      return EntitySelector.initDialogExtension().then(function (exports) {
	        var Dialog = exports.Dialog;
	        _this2.dialog = new Dialog(_objectSpread(_objectSpread({}, _this2.dialogOptions), {}, {
	          id: _this2.getDialogId(),
	          multiple: _this2.isMultiple
	        }));
	        main_core_events.EventEmitter.subscribe(_this2.dialog, 'Item:onSelect', _this2.onDialogItemSelect.bind(_this2));
	        main_core_events.EventEmitter.subscribe(_this2.dialog, 'Item:onDeselect', _this2.onDialogItemDeSelect.bind(_this2));
	        main_core_events.EventEmitter.subscribe(_this2.dialog, 'onLoad', _this2.onDialogLoad.bind(_this2));
	        var searchInput = _this2.getFilterFieldInput();
	        main_core.Event.bind(searchInput, 'input', _this2.controlInputChangeHandler);
	      });
	    }
	  }, {
	    key: "addItemToFilter",
	    value: function addItemToFilter(id, title) {
	      if (!this.control) {
	        return;
	      }
	      if (this.isMultiple) {
	        var currentValues = this.control.getCurrentValues();
	        if (!currentValues.filter(function (item) {
	          return item.value === id;
	        }).length) {
	          currentValues.push({
	            value: id,
	            label: title
	          });
	          this.control.setMultipleData(currentValues);
	        }
	      } else {
	        this.control.setSingleData(title, id);
	      }
	    }
	  }, {
	    key: "removeItemFromFilter",
	    value: function removeItemFromFilter(id) {
	      if (!this.control) {
	        return;
	      }
	      if (this.isMultiple) {
	        var currentValues = this.control.getCurrentValues();
	        this.control.setMultipleData(currentValues.filter(function (item) {
	          return item.value !== id;
	        }));
	      } else {
	        this.control.clearValue();
	      }
	    }
	  }, {
	    key: "getDialogId",
	    value: function getDialogId() {
	      return this.id + '_' + this.filter.getParam('FILTER_ID');
	    }
	  }, {
	    key: "getItemId",
	    value: function getItemId(item) {
	      if (this.needAddEntityIdToFilter) {
	        return JSON.stringify([item.getEntityId() + '', item.getId() + '']);
	      }
	      return item.getId() + '';
	    }
	  }, {
	    key: "updateSelectedItemsInDialog",
	    value: function updateSelectedItemsInDialog(dialog) {
	      var _this3 = this;
	      if (!this.control) {
	        return;
	      }
	      var currentValues = this.control.getCurrentValues();
	      if (!this.isMultiple) {
	        currentValues = [currentValues];
	      }
	      var selectedIds = currentValues.map(function (item) {
	        return item.value;
	      });
	      dialog.getItems().forEach(function (dialogItem) {
	        if (selectedIds.indexOf(_this3.getItemId(dialogItem)) > -1) {
	          dialogItem.select(true);
	        } else {
	          dialogItem.deselect();
	        }
	      });
	    }
	  }, {
	    key: "onCustomEntityFocus",
	    value: function onCustomEntityFocus(event) {
	      var _event$getData = event.getData(),
	        _event$getData2 = babelHelpers.slicedToArray(_event$getData, 1),
	        control = _event$getData2[0];
	      if (this.id !== control.getId()) {
	        return;
	      }
	      this.setControl(control);
	      this.open();
	    }
	  }, {
	    key: "onCustomEntityBlur",
	    value: function onCustomEntityBlur(event) {
	      var _event$getData3 = event.getData(),
	        _event$getData4 = babelHelpers.slicedToArray(_event$getData3, 1),
	        control = _event$getData4[0];
	      if (this.id !== control.getId()) {
	        return;
	      }
	      this.close();
	      this.unsetControl();
	    }
	  }, {
	    key: "onGetStopBlur",
	    value: function onGetStopBlur(event) {
	      var _event$getData5 = event.getData(),
	        _event$getData6 = babelHelpers.slicedToArray(_event$getData5, 2),
	        browserEvent = _event$getData6[0],
	        result = _event$getData6[1];
	      if (!(this.dialog && this.dialog.isOpen())) {
	        return; // if dialog wasn't shown, cancel blur is not required
	      }

	      var field = this.getFilterField();
	      if (!field) {
	        return;
	      }
	      var target = browserEvent.target;
	      if (target === field.node ||
	      // click on any child except field deletion button
	      field.node.contains(target) && !main_core.Dom.hasClass(target, this.filter.settings.classFieldDelete) || target === document.body) {
	        result.stopBlur = true;
	        return;
	      }
	      var dialogContainerElement = this.dialog.getPopup().getContentContainer();
	      if (target === dialogContainerElement || dialogContainerElement.contains(target)) {
	        result.stopBlur = true;
	      }
	    }
	  }, {
	    key: "onCustomEntityRemove",
	    value: function onCustomEntityRemove(event) {
	      var _event$getData7 = event.getData(),
	        _event$getData8 = babelHelpers.slicedToArray(_event$getData7, 1),
	        control = _event$getData8[0];
	      if (this.id !== control.getId()) {
	        return;
	      }
	      if (this.dialog) {
	        this.dialog.destroy();
	        this.dialog = null;
	      }
	      this.unsetControl();
	    }
	  }, {
	    key: "onApplyPreset",
	    value: function onApplyPreset(event) {
	      if (this.dialog) {
	        this.dialog.destroy();
	        this.dialog = null;
	      }
	      this.unsetControl();
	    }
	  }, {
	    key: "onSearchInputChange",
	    value: function onSearchInputChange(event) {
	      if (this.dialog) {
	        if (!this.needShowDialogOnEmptyInput) {
	          if (event.target.value) {
	            this.open();
	          } else {
	            this.close();
	          }
	        }
	        this.dialog.search(event.target.value);
	      }
	    }
	  }, {
	    key: "onDialogItemSelect",
	    value: function onDialogItemSelect(event) {
	      var _event$getData9 = event.getData(),
	        item = _event$getData9.item;
	      this.addItemToFilter(this.getItemId(item), item.getTitle());
	      this.getFilterFieldInput().value = ''; // clear search query
	    }
	  }, {
	    key: "onDialogItemDeSelect",
	    value: function onDialogItemDeSelect(event) {
	      var _event$getData10 = event.getData(),
	        item = _event$getData10.item;
	      this.removeItemFromFilter(this.getItemId(item));
	    }
	  }, {
	    key: "onDialogLoad",
	    value: function onDialogLoad(event) {
	      var dialog = event.getTarget();
	      this.updateSelectedItemsInDialog(dialog);
	    }
	  }], [{
	    key: "initDialogExtension",
	    value: function initDialogExtension() {
	      if (!EntitySelector.initExtensionPromise) {
	        EntitySelector.initExtensionPromise = main_core.Runtime.loadExtension('ui.entity-selector');
	      }
	      return EntitySelector.initExtensionPromise;
	    }
	  }, {
	    key: "create",
	    value: function create(id, settings) {
	      if (main_core.Type.isObject(this.items[id])) {
	        if (main_core.Type.isObject(settings.filter)) {
	          this.items[id].filter = settings.filter;
	        }
	        return this.items[id];
	      }
	      var self = new EntitySelector(id, settings);
	      this.items[id] = self;
	      return self;
	    }
	  }]);
	  return EntitySelector;
	}();
	babelHelpers.defineProperty(EntitySelector, "initExtensionPromise", null);
	babelHelpers.defineProperty(EntitySelector, "items", {});
	var namespace = main_core.Reflection.namespace('BX.Filter');
	namespace.EntitySelector = EntitySelector;

	(function () {

	  BX.namespace('BX.Filter');
	  BX.Filter.FieldController = function (field, parent) {
	    this.field = null;
	    this.parent = null;
	    this.type = null;
	    this.input = null;
	    this.deleteButton = null;
	    this.init(field, parent);
	  };
	  BX.Filter.FieldController.prototype = {
	    init: function init(field, parent) {
	      if (!BX.type.isDomNode(field)) {
	        throw 'BX.Filter.FieldController.init: field isn\'t dom node';
	      }
	      if (!(parent instanceof BX.Main.Filter)) {
	        throw 'BX.Filter.FieldController.init: parent not instance of BX.Main.ui.Filter';
	      }
	      this.field = field;
	      this.parent = parent;
	      this.bind();
	      this.isShowDelete() ? this.showDelete() : this.hideDelete();
	    },
	    isShowDelete: function isShowDelete() {
	      var squares = this.getSquares();
	      return this.getInputValue() || BX.type.isArray(squares) && squares.length;
	    },
	    getField: function getField() {
	      return this.field;
	    },
	    getInput: function getInput() {
	      var type, types;
	      if (!BX.type.isDomNode(this.input)) {
	        type = this.getType();
	        types = this.parent.types;
	        if (type === types.DATE) {
	          this.input = BX.Filter.Utils.getByClass(this.getField(), this.parent.settings.classDateInput);
	        }
	        if (type === types.NUMBER || type === 'number') {
	          this.input = BX.Filter.Utils.getByClass(this.getField(), this.parent.settings.classNumberInput);
	        }
	        if (type === types.STRING) {
	          this.input = BX.Filter.Utils.getByClass(this.getField(), this.parent.settings.classStringInput);
	        }
	        if (type === types.CUSTOM_ENTITY) {
	          this.input = BX.Filter.Utils.getBySelector(this.getField(), 'input[type="hidden"]');
	        }
	      }
	      return this.input;
	    },
	    getDeleteButton: function getDeleteButton() {
	      if (!BX.type.isDomNode(this.deleteButton)) {
	        this.deleteButton = BX.Filter.Utils.getByClass(this.getField(), this.parent.settings.classValueDelete);
	      }
	      return this.deleteButton;
	    },
	    getSquares: function getSquares() {
	      return BX.Filter.Utils.getByClass(this.getField(), this.parent.settings.classSquare);
	    },
	    bind: function bind() {
	      if (this.getType() !== this.parent.types.MULTI_SELECT && this.getType() !== this.parent.types.SELECT) {
	        BX.bind(this.getDeleteButton(), 'click', BX.delegate(this._onDeleteClick, this));
	        BX.bind(this.getInput(), 'input', BX.delegate(this._onInput, this));
	      }
	    },
	    clearInput: function clearInput() {
	      var input = this.getInput();
	      if (BX.type.isDomNode(input)) {
	        input.value = '';
	      }
	    },
	    hideDelete: function hideDelete() {
	      var deleteButton = this.getDeleteButton();
	      if (BX.type.isDomNode(deleteButton)) {
	        BX.addClass(deleteButton, this.parent.settings.classHide);
	      }
	    },
	    showDelete: function showDelete() {
	      var deleteButton = this.getDeleteButton();
	      if (BX.type.isDomNode(deleteButton)) {
	        BX.removeClass(deleteButton, this.parent.settings.classHide);
	      }
	    },
	    removeSquares: function removeSquares() {
	      var squares = this.getSquares();
	      if (BX.type.isArray(squares) && squares.length) {
	        squares.forEach(function (square) {
	          BX.remove(square);
	        });
	      }
	    },
	    _onDeleteClick: function _onDeleteClick() {
	      this.removeSquares();
	      this.clearInput();
	      this.hideDelete();
	    },
	    _onInput: function _onInput() {
	      this.getInputValue() ? this.showDelete() : this.hideDelete();
	    },
	    getInputValue: function getInputValue() {
	      var result = '';
	      var input = this.getInput();
	      if (BX.type.isDomNode(input)) {
	        result = input.value;
	      }
	      return result;
	    },
	    getType: function getType() {
	      if (!BX.type.isNotEmptyString(this.type)) {
	        this.type = BX.data(this.getField(), 'type');
	      }
	      return this.type;
	    }
	  };
	})();

	(function () {

	  BX.namespace('BX.Main.ui');
	  BX.Main.ui.CustomEntity = function () {
	    this.field = null;
	    this.labelInput = null;
	    this.hiddenInput = null;
	    this.popupContainer = null;
	    this.inputClass = 'main-ui-control-string';
	    this.squareClass = 'main-ui-square';
	    this.multiple = null;
	  };

	  /**
	   * @static
	   * @param {HTMLElement} field
	   * @return {boolean}
	   */
	  BX.Main.ui.CustomEntity.isMultiple = function (field) {
	    if (!!field && !BX.hasClass(field, 'main-ui-control-entity')) {
	      field = BX.Filter.Utils.getByClass(field, 'main-ui-control-entity');
	    }
	    return !!field && JSON.parse(BX.data(field, 'multiple'));
	  };

	  //noinspection JSUnusedGlobalSymbols
	  BX.Main.ui.CustomEntity.prototype = {
	    setField: function setField(field) {
	      if (this.field !== field) {
	        this.field = field;
	        this.reset();
	      }
	    },
	    isMultiple: function isMultiple() {
	      return BX.Main.ui.CustomEntity.isMultiple(this.getField());
	    },
	    reset: function reset() {
	      this.labelInput = null;
	      this.hiddenInput = null;
	    },
	    getField: function getField() {
	      return this.field;
	    },
	    getId: function getId() {
	      var hiddenNode = this.getHiddenNode();
	      var id = null;
	      if (BX.type.isDomNode(hiddenNode)) {
	        id = hiddenNode.name;
	      }
	      return id;
	    },
	    getLabelNode: function getLabelNode() {
	      if (!BX.type.isDomNode(this.labelInput)) {
	        this.labelInput = BX.Filter.Utils.getBySelector(this.getField(), '.' + this.inputClass + '[type="text"]');
	      }
	      return this.labelInput;
	    },
	    getHiddenNode: function getHiddenNode() {
	      if (!BX.type.isDomNode(this.hiddenInput)) {
	        this.hiddenInput = BX.Filter.Utils.getBySelector(this.getField(), '.' + this.inputClass + '[type="hidden"]');
	      }
	      return this.hiddenInput;
	    },
	    getSquareByValue: function getSquareByValue(value) {
	      return BX.Filter.Utils.getBySelector(this.getField(), ['[data-item*=":' + BX.util.jsencode(value) + '}"]', '[data-item*=":\\"' + BX.util.jsencode(value) + '\\"}"]'].join(', '));
	    },
	    getSquares: function getSquares() {
	      return BX.Filter.Utils.getByClass(this.getField(), this.squareClass, true);
	    },
	    removeSquares: function removeSquares() {
	      this.getSquares().forEach(BX.remove);
	    },
	    setSquare: function setSquare(label, value) {
	      var field = this.getField();
	      var squareData = {
	        block: 'main-ui-square',
	        name: label,
	        item: {
	          '_label': label,
	          '_value': value
	        }
	      };
	      var square = BX.decl(squareData);
	      var squares = this.getSquares();
	      if (!squares.length) {
	        BX.prepend(square, field);
	      } else {
	        BX.insertAfter(square, squares[squares.length - 1]);
	      }
	    },
	    getCurrentValues: function getCurrentValues() {
	      var squares = this.getSquares();
	      var data, result;
	      if (this.isMultiple()) {
	        result = [];
	        for (var i = 0, length = squares.length; i < length; i++) {
	          try {
	            data = JSON.parse(BX.data(squares[i], 'item'));
	            result.push({
	              label: data._label,
	              value: data._value
	            });
	          } catch (ex) {}
	        }
	      } else {
	        if (squares.length === 0) {
	          result = {
	            label: '',
	            value: ''
	          };
	        } else {
	          try {
	            data = JSON.parse(BX.data(squares[0], 'item'));
	            result = {
	              label: data._label,
	              value: data._value
	            };
	          } catch (ex) {
	            result = {
	              label: '',
	              value: ''
	            };
	          }
	        }
	      }
	      return result;
	    },
	    setData: function setData(label, value) {
	      return this.isMultiple() ? this.setMultipleData(label, value) : this.setSingleData(label, value);
	    },
	    setSingleData: function setSingleData(label, value) {
	      var hiddenNode = this.getHiddenNode();
	      this.removeSquares();
	      this.setSquare(label, value);
	      if (BX.type.isDomNode(hiddenNode)) {
	        hiddenNode.value = value;
	        BX.fireEvent(hiddenNode, 'input');
	      }
	    },
	    setMultipleData: function setMultipleData(items, value) {
	      var values = [];
	      var hiddenNode = this.getHiddenNode();
	      if (BX.type.isArray(items)) {
	        this.removeSquares();
	        if (BX.type.isArray(items)) {
	          items.forEach(function (item) {
	            values.push(item.value);
	            this.setSquare(item.label, item.value);
	          }, this);
	          if (BX.type.isDomNode(hiddenNode)) {
	            hiddenNode.value = JSON.stringify(values);
	            BX.fireEvent(hiddenNode, 'input');
	          }
	        }
	      }
	      if (!BX.type.isArray(items) && value !== null) {
	        if (!this.getSquareByValue(value)) {
	          this.setSquare(items, value);
	          this.getSquares().forEach(function (square) {
	            var squareData = JSON.parse(BX.data(square, 'item'));
	            if (BX.type.isPlainObject(squareData)) {
	              values.push(squareData._value);
	            }
	          });
	          hiddenNode.value = JSON.stringify(values);
	          BX.fireEvent(hiddenNode, 'input');
	        }
	      }
	    },
	    clearValue: function clearValue() {
	      this.removeSquares();
	      var hiddenNode = this.getHiddenNode();
	      hiddenNode.value = this.isMultiple() ? '[]' : '';
	    },
	    setPopupContainer: function setPopupContainer(container) {
	      if (BX.type.isDomNode(container)) {
	        this.popupContainer = container;
	      }
	    },
	    getPopupContainer: function getPopupContainer() {
	      return this.popupContainer;
	    }
	  };
	})();

	(function () {

	  BX.namespace('BX.Filter');

	  /**
	   * Filter search block class
	   * @param parent
	   * @constructor
	   */
	  BX.Filter.Search = function (parent) {
	    this.parent = null;
	    this.container = null;
	    this.input = null;
	    this.preset = null;
	    this.buttonsContainer = null;
	    this.delay = 800;
	    this.timeout = null;
	    this.init(parent);
	  };
	  BX.Filter.Search.prototype = {
	    init: function init(parent) {
	      this.parent = parent;
	      BX.bind(this.getInput(), 'input', BX.delegate(this._onInputWithoutDebounce, this));
	      if (this.parent.getParam('ENABLE_LIVE_SEARCH')) {
	        BX.bind(this.getInput(), 'input', BX.debounce(this._onInput, this.delay, this));
	      }
	      BX.bind(this.getInput(), 'keydown', BX.delegate(this._onKeyDown, this));
	      BX.bind(this.getFindButton(), 'click', BX.delegate(this._onSearchClick, this));
	      BX.bind(this.getContainer(), 'click', BX.delegate(this._onSearchContainerClick, this));
	      this.removeAutofocus();
	      this.firstInit = true;
	    },
	    /**
	     * Removes autofocus attr from search input
	     */
	    removeAutofocus: function removeAutofocus() {
	      var input = this.getInput();
	      if (!!input) {
	        input.blur();
	        input.autofocus = null;
	      }
	    },
	    getFindButton: function getFindButton() {
	      if (!BX.type.isDomNode(this.findButton)) {
	        this.findButton = BX.Filter.Utils.getByClass(this.getContainer(), this.parent.settings.classSearchButton);
	      }
	      return this.findButton;
	    },
	    _onSearchClick: function _onSearchClick() {
	      this.apply();
	    },
	    selectSquare: function selectSquare(square) {
	      !!square && BX.addClass(square, this.parent.settings.classSquareSelected);
	    },
	    selectSquares: function selectSquares() {
	      this.getSquares().forEach(this.selectSquare, this);
	    },
	    unselectSquare: function unselectSquare(square) {
	      !!square && BX.removeClass(square, this.parent.settings.classSquareSelected);
	    },
	    unselectSquares: function unselectSquares() {
	      this.getSquares().forEach(this.unselectSquare, this);
	    },
	    removeSquares: function removeSquares() {
	      this.getSquares().forEach(this.removeSquare, this);
	    },
	    isSquaresSelected: function isSquaresSelected() {
	      var squares = this.getSquares();
	      return squares.length && squares.every(this.isSquareSelected, this);
	    },
	    isSquareSelected: function isSquareSelected(square) {
	      return !!square && BX.hasClass(square, this.parent.settings.classSquareSelected);
	    },
	    getLastSquare: function getLastSquare() {
	      var squares = this.getSquares();
	      return !!squares ? squares[squares.length - 1] : null;
	    },
	    isTextSelected: function isTextSelected() {
	      var searchStringLength = this.getSearchString().length;
	      var searchInput = this.getInput();
	      var selectionStart = searchInput.selectionStart;
	      var selectionEnd = searchInput.selectionEnd;
	      return selectionStart === 0 && selectionEnd !== 0 && selectionEnd === searchStringLength;
	    },
	    isSelectionStart: function isSelectionStart() {
	      var searchInput = this.getInput();
	      var selectionStart = searchInput.selectionStart;
	      var selectionEnd = searchInput.selectionEnd;
	      return selectionStart === 0 && selectionEnd === 0;
	    },
	    isSquareRemoveButton: function isSquareRemoveButton(node) {
	      return !!node && BX.hasClass(node, this.parent.settings.classSquareDelete);
	    },
	    isClearButton: function isClearButton(node) {
	      return !!node && BX.hasClass(node, this.parent.settings.classClearSearchValueButton);
	    },
	    getClearButton: function getClearButton() {
	      return this.getContainer().querySelector("." + this.parent.settings.classClearSearchValueButton);
	    },
	    isSearchButton: function isSearchButton(node) {
	      return !!node && BX.hasClass(node, this.parent.settings.classSearchButton);
	    },
	    /**
	     * Adjust focus on search input
	     */
	    adjustFocus: function adjustFocus() {
	      if (!BX.browser.IsMobile()) {
	        var searchInput = this.getInput();
	        if (document.activeElement !== searchInput && window.scrollY < BX.pos(searchInput).top) {
	          //Puts cursor after last character
	          //noinspection SillyAssignmentJS
	          searchInput.value = searchInput.value;
	          searchInput.blur();
	          searchInput.focus();
	        }
	      }
	    },
	    findSquareByChild: function findSquareByChild(childNode) {
	      return BX.findParent(childNode, {
	        className: this.parent.settings.classSquare
	      }, true, false);
	    },
	    /**
	     * @param {HTMLElement} square
	     */
	    getSquareData: function getSquareData(square) {
	      var rawData = BX.data(square, 'item');
	      return !!square && !!rawData ? JSON.parse(rawData) : null;
	    },
	    /**
	     * @param {HTMLElement} square
	     * @return {boolean}
	     */
	    isSquareControl: function isSquareControl(square) {
	      var squareData = this.getSquareData(square);
	      return !!squareData && (squareData.type === 'control' || BX.type.isArray(squareData));
	    },
	    onPresetSquareRemove: function onPresetSquareRemove() {
	      var Filter = this.parent;
	      var Preset = Filter.getPreset();
	      var currentPresetId = Preset.getCurrentPresetId();
	      var isResetToDefaultMode = Filter.getParam('RESET_TO_DEFAULT_MODE');
	      var isValueRequiredModeMail = Filter.getParam('VALUE_REQUIRED');
	      var isPinned = Preset.isPinned(currentPresetId);
	      var squares = this.getSquares();
	      if (squares.length === 1) {
	        if (isValueRequiredModeMail && isPinned) {
	          this.parent.showPopup();
	          this.adjustPlaceholder();
	          this.parent.getPreset().deactivateAllPresets();
	        } else {
	          if (isResetToDefaultMode && isPinned || !isResetToDefaultMode) {
	            var resetWithoutSearch = true;
	            this.lastPromise = Filter.resetFilter(resetWithoutSearch);
	            Filter.closePopup();
	          }
	        }
	        if (isResetToDefaultMode && !isPinned) {
	          this.lastPromise = Filter.getPreset().applyPinnedPreset();
	        }
	      }
	      if (squares.length > 1) {
	        var currentPreset = Preset.getPreset(Preset.getCurrentPresetId());
	        var tmpPreset = Preset.getPreset('tmp_filter');
	        tmpPreset.FIELDS = BX.clone(currentPreset.ADDITIONAL);
	        currentPreset.ADDITIONAL = [];
	        Preset.deactivateAllPresets();
	        Preset.applyPreset('tmp_filter');
	        Filter.applyFilter();
	      }
	    },
	    onControlSquareRemove: function onControlSquareRemove(square) {
	      var Filter = this.parent;
	      var Preset = Filter.getPreset();
	      var isResetToDefaultMode = Filter.getParam('RESET_TO_DEFAULT_MODE');
	      var isValueRequiredModeMail = Filter.getParam('VALUE_REQUIRED');
	      var squareData;
	      if (isResetToDefaultMode && this.getSquares().length === 1) {
	        if (isValueRequiredModeMail) {
	          squareData = this.getSquareData(square);
	          Filter.clearControls(squareData);
	          this.parent.showPopup();
	          this.adjustPlaceholder();
	          this.parent.getPreset().deactivateAllPresets();
	        } else {
	          this.lastPromise = Filter.getPreset().applyPinnedPreset();
	        }
	      } else {
	        squareData = this.getSquareData(square);
	        Filter.clearControls(squareData);
	        Filter.closePopup();
	        if (BX.type.isArray(squareData)) {
	          squareData.forEach(function (square) {
	            Preset.removeAdditionalField(square.name);
	          });
	        }
	        if (BX.type.isPlainObject(squareData)) {
	          Preset.removeAdditionalField(squareData.name);
	        }
	        this.apply();
	      }
	    },
	    onValueRequiredSquareRemove: function onValueRequiredSquareRemove() {
	      var Filter = this.parent;
	      Filter.getPreset().deactivateAllPresets();
	      Filter.showPopup();
	      this.adjustPlaceholder();
	    },
	    /**
	     * @param {HTMLElement} square
	     */
	    complexSquareRemove: function complexSquareRemove(square) {
	      var isValueRequiredMode = this.parent.getParam('VALUE_REQUIRED_MODE');
	      var isPresetSquare = !this.isSquareControl(square);
	      if (isValueRequiredMode) {
	        this.onValueRequiredSquareRemove();
	      } else {
	        if (isPresetSquare) {
	          this.onPresetSquareRemove();
	        } else {
	          this.onControlSquareRemove(square);
	        }
	      }
	      this.removeSquare(square);
	      this.adjustClearButton();
	    },
	    adjustClearButton: function adjustClearButton() {
	      !!this.getLastSquare() ? this.showClearButton() : this.hideClearButton();
	    },
	    /**
	     * @param {HTMLElement} square
	     */
	    removeSquare: function removeSquare(square) {
	      !!square && BX.remove(square);
	    },
	    _onSearchContainerClick: function _onSearchContainerClick(event) {
	      var Filter = this.parent;
	      if (this.isClearButton(event.target)) {
	        if (!Filter.getParam('VALUE_REQUIRED')) {
	          if (!Filter.getParam('VALUE_REQUIRED_MODE')) {
	            if (Filter.getParam('RESET_TO_DEFAULT_MODE')) {
	              this.clearInput();
	              this.lastPromise = Filter.getPreset().applyPinnedPreset();
	            } else {
	              Filter.resetFilter();
	            }
	            Filter.closePopup();
	            this.adjustFocus();
	          } else {
	            this.removeSquares();
	            Filter.showPopup();
	            this.adjustPlaceholder();
	            this.hideClearButton();
	            Filter.getPreset().deactivateAllPresets();
	          }
	        } else {
	          var isPinned = Filter.getPreset().isPinned(Filter.getPreset().getCurrentPresetId());
	          if (isPinned || Filter.getPreset().getCurrentPresetId() === 'tmp_filter') {
	            var presetData = Filter.getPreset().getPreset(Filter.getPreset().getCurrentPresetId());
	            if (presetData.ADDITIONAL.length) {
	              presetData.ADDITIONAL = [];
	              this.lastPromise = Filter.getPreset().applyPreset(Filter.getPreset().getCurrentPresetId());
	              this.apply();
	            } else {
	              this.removeSquares();
	              Filter.showPopup();
	              this.adjustPlaceholder();
	              this.hideClearButton();
	              Filter.getPreset().deactivateAllPresets();
	            }
	          } else {
	            if (Filter.getParam('RESET_TO_DEFAULT_MODE')) {
	              this.lastPromise = Filter.getPreset().applyPinnedPreset();
	            } else {
	              Filter.resetFilter();
	            }
	            Filter.closePopup();
	            this.adjustFocus();
	          }
	          this.clearInput();
	        }
	      } else if (this.isSearchButton(event.target)) {
	        this.apply();
	        this.adjustFocus();
	      } else if (this.isSquareRemoveButton(event.target)) {
	        var square = this.findSquareByChild(event.target);
	        this.complexSquareRemove(square);
	        this.adjustFocus();
	      } else {
	        if (!Filter.getPopup().isShown()) {
	          Filter.showPopup();
	        } else {
	          var input = this.getInput();
	          var start = input.selectionStart;
	          var end = input.selectionEnd;
	          var searchLength = this.getSearchString().length;
	          if (!(searchLength && start === 0 && end === searchLength)) {
	            if (Filter.getParam('VALUE_REQUIRED')) {
	              if (!this.getSquares().length) {
	                this.lastPromise = Filter.getPreset().applyPinnedPreset();
	              } else {
	                Filter.closePopup();
	              }
	            } else {
	              Filter.closePopup();
	              if (Filter.getParam('VALUE_REQUIRED_MODE')) {
	                Filter.restoreRemovedPreset();
	              }
	            }
	          }
	        }
	      }
	    },
	    _onKeyDown: function _onKeyDown(event) {
	      var utils = BX.Filter.Utils;
	      var parent = this.parent;
	      if (utils.isKey(event, 'enter')) {
	        if (parent.getParam('VALUE_REQUIRED')) {
	          if (!this.getSquares().length) {
	            this.parent.getPreset().applyPinnedPreset();
	          } else {
	            this.apply();
	            this.firstInit = false;
	            this.lastSearchString = this.getSearchString();
	          }
	        } else {
	          this.apply();
	          this.firstInit = false;
	          this.lastSearchString = this.getSearchString();
	        }
	        parent.closePopup();
	      }
	      if (utils.isKey(event, 'tab') || utils.isKey(event, 'downArrow')) {
	        parent.showPopup();
	        parent.adjustFocus();
	        this.unselectSquares();
	      }
	      if (utils.isKey(event, 'upArrow')) {
	        parent.closePopup();
	        if (parent.getParam('VALUE_REQUIRED_MODE')) {
	          this.parent.restoreRemovedPreset();
	        }
	        if (parent.getParam('VALUE_REQUIRED')) {
	          if (!this.getSquares().length) {
	            this.parent.getPreset().applyPinnedPreset();
	          }
	        }
	      }
	      if (utils.isKey(event, 'a') && event.metaKey || utils.isKey(event, 'a') && event.ctrlKey) {
	        this.selectSquares();
	      }
	      if (utils.isKey(event, 'backspace') && this.isTextSelected() && this.isSquaresSelected()) {
	        clearTimeout(this.timeout);
	        if (this.parent.getParam('VALUE_REQUIRED')) {
	          var isPinned = this.parent.getPreset().isPinned(this.parent.getPreset().getCurrentPresetId());
	          if (isPinned) {
	            this.removeSquares();
	            this.parent.showPopup();
	            this.adjustPlaceholder();
	            this.hideClearButton();
	            this.parent.getPreset().deactivateAllPresets();
	          } else {
	            if (this.parent.getParam('RESET_TO_DEFAULT_MODE')) {
	              this.lastPromise = this.parent.getPreset().applyPinnedPreset();
	            } else {
	              this.parent.resetFilter();
	            }
	            this.parent.closePopup();
	            this.adjustFocus();
	          }
	          this.clearInput();
	        } else {
	          if (this.parent.getParam('RESET_TO_DEFAULT_MODE')) {
	            this.lastPromise = this.parent.getPreset().applyPinnedPreset();
	          } else {
	            this.lastPromise = this.parent.resetFilter();
	          }
	          this.parent.closePopup();
	        }
	      }
	      if (utils.isKey(event, 'backspace') && this.isSelectionStart()) {
	        clearTimeout(this.timeout);
	        var square = this.getLastSquare();
	        this.isSquareSelected(square) ? this.complexSquareRemove(square) : this.selectSquare(square);
	      }
	      if (!utils.isKey(event, 'backspace') && !event.metaKey && this.isSquaresSelected()) {
	        this.unselectSquares();
	      }
	    },
	    getSearchString: function getSearchString() {
	      var input = this.getInput();
	      return !!input ? input.value : '';
	    },
	    getSquares: function getSquares() {
	      return BX.Filter.Utils.getByClass(this.getContainer(), this.parent.settings.classSquare, true);
	    },
	    adjustPlaceholder: function adjustPlaceholder() {
	      if (this.parent.getParam("LIMITS_ENABLED")) {
	        this.setInputPlaceholder(this.parent.getParam('MAIN_UI_FILTER__PLACEHOLDER_LIMITS_EXCEEDED'));
	      } else if (this.parent.getParam("DISABLE_SEARCH") || !this.parent.settings.get('SEARCH')) {
	        this.setInputPlaceholder(this.parent.getParam('MAIN_UI_FILTER__PLACEHOLDER'));
	      } else {
	        this.setInputPlaceholder(this.parent.getParam('MAIN_UI_FILTER__PLACEHOLDER_DEFAULT'));
	      }
	    },
	    isResolvedRequest: function isResolvedRequest() {
	      return !this.lastPromise || !!this.lastPromise && this.lastPromise.state;
	    },
	    /**
	     * Calls BX.Main.Filter.applyFilter
	     * @return {BX.Promise}
	     */
	    apply: function apply() {
	      if (this.isResolvedRequest()) {
	        this.lastPromise = this.parent._onFindButtonClick();
	      }
	      return this.lastPromise;
	    },
	    /**
	     * Calls BX.Main.Filter.resetFilter()
	     * @return {BX.Promise}
	     */
	    reset: function reset() {
	      if (this.isResolvedRequest()) {
	        this.parent.getSearch().removePreset();
	        this.parent.getPreset().deactivateAllPresets();
	        this.parent.getPreset().resetPreset(true);
	        this.timeout = setTimeout(BX.delegate(function () {
	          this.lastPromise = this.parent.resetFilter();
	        }, this), this.delay);
	      }
	      return this.lastPromise;
	    },
	    _onInputWithoutDebounce: function _onInputWithoutDebounce() {
	      clearTimeout(this.timeout);
	      var searchString = this.getSearchString();
	      this.lastSearchString = !!this.lastSearchString ? this.lastSearchString : searchString;
	      if (searchString !== this.lastSearchString && (!this.parent.isIe() || !this.firstInit)) {
	        if (this.parent.getParam('ENABLE_LIVE_SEARCH')) {
	          this.parent.showGridAnimation();
	          BX.onCustomEvent(window, 'BX.Filter.Search:input', [this.parent.params.FILTER_ID, searchString]);
	        }
	        this.parent.getPopup().isShown() && this.parent.closePopup();
	      }
	      if (searchString) {
	        this.showClearButton();
	        this.parent.setIsSetOutsideState(false);
	        this.parent.setDefaultPresetAppliedState(false);
	      } else {
	        if (!this.getSquares().length && this.lastSearchString !== searchString) {
	          this.hideClearButton();
	          this.adjustPlaceholder();
	        }
	        if (this.parent.isAppliedDefaultPreset()) {
	          this.parent.setDefaultPresetAppliedState(true);
	        }
	      }
	      if (this.parent.isAppliedUserFilter()) {
	        BX.Dom.addClass(this.container, 'main-ui-filter-search--active');
	      } else {
	        BX.Dom.removeClass(this.container, 'main-ui-filter-search--active');
	      }
	    },
	    _onInput: function _onInput() {
	      var searchString = this.getSearchString();
	      if (searchString !== this.lastSearchString && (!this.parent.isIe() || !this.firstInit)) {
	        this.apply();
	      }
	      this.firstInit = false;
	      this.lastSearchString = searchString;
	    },
	    getButtonsContainer: function getButtonsContainer() {
	      if (!BX.type.isDomNode(this.buttonsContainer)) {
	        this.buttonsContainer = BX.Filter.Utils.getByClass(this.getContainer(), this.parent.settings.classSearchButtonsContainer);
	      }
	      return this.buttonsContainer;
	    },
	    showClearButton: function showClearButton() {
	      BX.addClass(this.getButtonsContainer(), this.parent.settings.classShow);
	    },
	    hideClearButton: function hideClearButton() {
	      BX.removeClass(this.getButtonsContainer(), this.parent.settings.classShow);
	    },
	    getInput: function getInput() {
	      var inputId;
	      if (!BX.type.isDomNode(this.input)) {
	        inputId = [this.parent.getParam('FILTER_ID', ''), '_search'].join('');
	        this.input = BX(inputId);
	      }
	      return this.input;
	    },
	    getContainer: function getContainer() {
	      var containerId;
	      if (!BX.type.isDomNode(this.container)) {
	        containerId = [this.parent.getParam('FILTER_ID'), '_search_container'].join('');
	        this.container = BX(containerId);
	      }
	      return this.container;
	    },
	    setInputPlaceholder: function setInputPlaceholder(text) {
	      var input = this.getInput();
	      input.placeholder = text;
	    },
	    clearInput: function clearInput() {
	      var form = this.getInput();
	      if (BX.type.isDomNode(form)) {
	        form.value = null;
	      }
	    },
	    clearForm: function clearForm() {
	      this.clearInput();
	      this.removePreset();
	    },
	    makeSquares: function makeSquares(squaresData, depth, additional) {
	      var square;
	      var tmpSquare = null;
	      var container = this.getContainer();
	      var result = {
	        squares: [],
	        moreSquares: []
	      };
	      squaresData.forEach(function (current, index) {
	        if (index < depth) {
	          square = BX.decl(current);
	          tmpSquare = tmpSquare || square;
	          if (!additional) {
	            if (index === 0) {
	              BX.prepend(square, container);
	            } else {
	              BX.insertAfter(square, tmpSquare);
	            }
	          } else {
	            var lastSquare = BX.Filter.Utils.getByClass(this.getContainer(), this.parent.settings.classSquare);
	            if (lastSquare) {
	              BX.insertAfter(square, lastSquare);
	            } else {
	              BX.prepend(square, container);
	            }
	          }
	          tmpSquare = square;
	          result.squares.push(square);
	        } else {
	          result.moreSquares.push({
	            type: 'control',
	            name: current.value,
	            title: current.title,
	            icon: current.icon
	          });
	        }
	      }, this);
	      return result;
	    },
	    squares: function squares(fields, depth, additional) {
	      var squaresData, moreSquares, square, squaresWidth, result;
	      var squares = BX.Filter.Utils.getByClass(this.getContainer(), this.parent.settings.classSquare, true);
	      if (additional) {
	        squares.forEach(function (current) {
	          var item = BX.data(current, 'item');
	          if (item) {
	            BX.remove(current);
	          }
	        });
	      } else {
	        squares.forEach(BX.remove);
	      }
	      squaresData = this.prepareSquaresData(fields);
	      moreSquares = this.makeSquares(squaresData, depth, additional);
	      squaresWidth = 0;
	      result = {
	        squaresData: squaresData,
	        width: 0
	      };
	      if (moreSquares.moreSquares.length) {
	        square = {
	          block: 'main-ui-search-square',
	          name: this.parent.getParam('MAIN_UI_FILTER__AND') + ' ' + this.parent.getParam('MAIN_UI_FILTER__MORE') + ' ' + moreSquares.moreSquares.length,
	          item: moreSquares.moreSquares,
	          title: moreSquares.moreSquares.map(function (curr) {
	            var title = curr.title;
	            if ('icon' in curr && BX.Type.isPlainObject(curr.icon)) {
	              var iconTitle = curr.icon.title;
	              title = title.length ? iconTitle + ': ' + title : '';
	            }
	            return title;
	          }).join(', \n')
	        };
	        square = BX.decl(square);
	        moreSquares.squares.push(square);
	        BX.insertAfter(square, moreSquares.squares[moreSquares.squares.length - 2]);
	        squaresWidth = moreSquares.squares.reduce(function (prev, curr) {
	          return prev + BX.width(curr) + (parseFloat(BX.style(curr, 'margin-right')) || 0);
	        }, 0);
	      }
	      result.width = squaresWidth;
	      return result;
	    },
	    setPreset: function setPreset(presetData) {
	      var container = this.getContainer();
	      var square, squares;
	      var squaresResult;
	      if (BX.type.isPlainObject(presetData)) {
	        squares = BX.Filter.Utils.getByClass(container, this.parent.settings.classSquare, true);
	        squares.forEach(BX.remove);
	        presetData = BX.clone(presetData);
	        presetData.ADDITIONAL = presetData.ADDITIONAL || [];
	        BX.onCustomEvent(window, 'BX.Filter.Search:beforeSquaresUpdate', [presetData, this]);
	        if (presetData.ID !== 'default_filter' && presetData.ID !== 'tmp_filter') {
	          square = BX.decl({
	            block: 'main-ui-search-square',
	            name: presetData.TITLE,
	            value: presetData.ID,
	            isPreset: true
	          });
	          BX.prepend(square, container);
	          if ('ADDITIONAL' in presetData && BX.type.isArray(presetData.ADDITIONAL) && presetData.ADDITIONAL.length) {
	            squaresResult = this.squares(presetData.ADDITIONAL, 1, true);
	            if (BX.width(container) - squaresResult.width < 100) {
	              squaresResult = this.squares(presetData.ADDITIONAL, 0, true);
	            }
	          }
	        } else {
	          if ('ADDITIONAL' in presetData && BX.type.isArray(presetData.ADDITIONAL) && presetData.ADDITIONAL.length) {
	            presetData.ADDITIONAL.forEach(function (current, index) {
	              if (!('ID' in current)) {
	                current.ID = 'ADDITIONAL_ID_' + index;
	              }
	              if (!('NAME' in current)) {
	                current.NAME = 'ADDITIONAL_NAME_' + index;
	              }
	              if (!('TYPE' in current)) {
	                current.TYPE = 'STRING';
	              }
	              if ('LABEL' in current && 'LABEL' in current) {
	                presetData.FIELDS.push(current);
	              }
	            });
	          }
	          if (BX.type.isArray(presetData.FIELDS) && presetData.FIELDS.length) {
	            squaresResult = this.squares(presetData.FIELDS, 2);
	            if (BX.width(container) - squaresResult.width < 100) {
	              squaresResult = this.squares(presetData.FIELDS, 1);
	            }
	          }
	        }
	        if (squaresResult && BX.type.isArray(squaresResult.squaresData) && squaresResult.squaresData.length || presetData.ID !== 'default_filter' && presetData.ID !== 'tmp_filter') {
	          if (this.parent.getParam("LIMITS_ENABLED")) {
	            this.setInputPlaceholder(this.parent.getParam('MAIN_UI_FILTER__PLACEHOLDER_LIMITS_EXCEEDED'));
	          } else {
	            this.setInputPlaceholder(this.parent.getParam('MAIN_UI_FILTER__PLACEHOLDER_WITH_FILTER'));
	          }
	          this.showClearButton();
	        } else {
	          this.adjustPlaceholder();
	        }
	        if (BX.type.isNotEmptyString(this.parent.getSearch().getInput().value)) {
	          this.showClearButton();
	        }
	      }
	    },
	    prepareSquaresData: function prepareSquaresData(fields) {
	      var value, tmpValues, title;
	      var result = [];
	      fields = fields.filter(function (current) {
	        return !!current && this.parent.params.FIELDS.some(function (currentField) {
	          return current.NAME === currentField.NAME;
	        });
	      }, this);
	      fields.map(function (current) {
	        value = null;
	        if (!BX.Type.isStringFilled(current.ADDITIONAL_FILTER)) {
	          switch (current.TYPE) {
	            case this.parent.types.DATE:
	              {
	                value = current.LABEL + ': ' + current.SUB_TYPE.NAME;
	                if (current.SUB_TYPE.VALUE === this.parent.dateTypes.QUARTER && BX.type.isNotEmptyString(current.VALUES._quarter)) {
	                  var quarter = current.QUARTERS.filter(function (curr) {
	                    return curr.VALUE == current.VALUES._quarter;
	                  }).map(function (curr) {
	                    return curr.NAME;
	                  });
	                  quarter = quarter.length ? quarter.join('') : '';
	                  value = current.LABEL + ': ' + quarter + ' ' + this.parent.getParam('MAIN_UI_FILTER__QUARTER').toLocaleLowerCase() + ' ' + current.VALUES._year;
	                }
	                if (current.SUB_TYPE.VALUE === this.parent.dateTypes.YEAR && BX.type.isNotEmptyString(current.VALUES._year)) {
	                  value = current.LABEL + ': ' + current.VALUES._year;
	                }
	                if (current.SUB_TYPE.VALUE === this.parent.dateTypes.MONTH && BX.type.isNotEmptyString(current.VALUES._month)) {
	                  var month = current.MONTHS.filter(function (curr) {
	                    return curr.VALUE == current.VALUES._month;
	                  }).map(function (curr) {
	                    return curr.NAME;
	                  });
	                  month = month.length ? month.join('') : '';
	                  value = current.LABEL + ': ' + month + ' ' + current.VALUES._year;
	                }
	                if (current.SUB_TYPE.VALUE === this.parent.dateTypes.EXACT && BX.type.isNotEmptyString(current.VALUES._from)) {
	                  value = current.LABEL + ': ' + current.VALUES._from;
	                }
	                if (current.SUB_TYPE.VALUE === this.parent.dateTypes.RANGE) {
	                  if (BX.type.isNotEmptyString(current.VALUES._from) && BX.type.isNotEmptyString(current.VALUES._to)) {
	                    value = current.LABEL + ': ' + current.VALUES._from + '-' + current.VALUES._to;
	                  } else if (!BX.type.isNotEmptyString(current.VALUES._from) && BX.type.isNotEmptyString(current.VALUES._to)) {
	                    value = current.LABEL + ': ' + this.parent.getParam('MAIN_UI_FILTER__BEFORE') + ' ' + current.VALUES._to;
	                  } else if (BX.type.isNotEmptyString(current.VALUES._from) && !BX.type.isNotEmptyString(current.VALUES._to)) {
	                    value = current.LABEL + ': ' + this.parent.getParam('MAIN_UI_FILTER__AFTER') + ' ' + current.VALUES._from;
	                  }
	                }
	                if ((current.SUB_TYPE.VALUE === this.parent.dateTypes.NEXT_DAYS || current.SUB_TYPE.VALUE === this.parent.dateTypes.PREV_DAYS) && !BX.type.isNumber(parseInt(current.VALUES._days))) {
	                  value = null;
	                }
	                if (current.SUB_TYPE.VALUE === this.parent.dateTypes.NEXT_DAYS && BX.type.isNumber(parseInt(current.VALUES._days))) {
	                  value = current.LABEL + ': ' + this.parent.getParam('MAIN_UI_FILTER__DATE_NEXT_DAYS_LABEL').replace('#N#', current.VALUES._days);
	                }
	                if (current.SUB_TYPE.VALUE === this.parent.dateTypes.PREV_DAYS && BX.type.isNumber(parseInt(current.VALUES._days))) {
	                  value = current.LABEL + ': ' + this.parent.getParam('MAIN_UI_FILTER__DATE_PREV_DAYS_LABEL').replace('#N#', current.VALUES._days);
	                }
	                if (current.SUB_TYPE.VALUE === this.parent.dateTypes.NONE) {
	                  value = null;
	                }
	                break;
	              }
	            case this.parent.types.CUSTOM_DATE:
	              {
	                if (BX.type.isArray(current.VALUE.days) && current.VALUE.days.length || BX.type.isArray(current.VALUE.months) && current.VALUE.months.length || BX.type.isArray(current.VALUE.years) && current.VALUE.years.length) {
	                  value = current.LABEL;
	                }
	                break;
	              }
	            case this.parent.types.SELECT:
	              {
	                if (BX.type.isPlainObject(current.VALUE) && current.VALUE.VALUE || current.STRICT) {
	                  value = current.LABEL + ': ' + current.VALUE.NAME;
	                }
	                break;
	              }
	            case this.parent.types.MULTI_SELECT:
	              {
	                if (BX.type.isArray(current.VALUE) && current.VALUE.length) {
	                  tmpValues = [];
	                  value = current.LABEL + ': ';
	                  current.VALUE.forEach(function (val, index) {
	                    if (index < 2) {
	                      tmpValues.push(val.NAME);
	                    }
	                  });
	                  value += tmpValues.join(', ');
	                  if (current.VALUE.length > 2) {
	                    title = [];
	                    current.VALUE.forEach(function (val) {
	                      title.push(val.NAME);
	                    });
	                    value = title.join(', ');
	                  }
	                }
	                break;
	              }
	            case this.parent.types.NUMBER:
	              {
	                if (current.SUB_TYPE.VALUE === 'exact') {
	                  if (BX.type.isNotEmptyString(current.VALUES._from)) {
	                    value = current.LABEL + ': ' + current.VALUES._from;
	                  } else {
	                    value = null;
	                  }
	                }
	                if (current.SUB_TYPE.VALUE === 'range') {
	                  if (BX.type.isNotEmptyString(current.VALUES._from) && BX.type.isNotEmptyString(current.VALUES._to)) {
	                    value = current.LABEL + ': ' + current.VALUES._from + '-' + current.VALUES._to;
	                  } else if (!BX.type.isNotEmptyString(current.VALUES._from) && BX.type.isNotEmptyString(current.VALUES._to)) {
	                    value = current.LABEL + ': ' + this.parent.getParam('MAIN_UI_FILTER__NUMBER_LESS') + ' ' + current.VALUES._to;
	                  } else if (BX.type.isNotEmptyString(current.VALUES._from) && !BX.type.isNotEmptyString(current.VALUES._to)) {
	                    value = current.LABEL + ': ' + this.parent.getParam('MAIN_UI_FILTER__NUMBER_MORE') + ' ' + current.VALUES._from;
	                  } else {
	                    value = null;
	                  }
	                }
	                if (current.SUB_TYPE.VALUE === 'more') {
	                  if (BX.type.isNotEmptyString(current.VALUES._from)) {
	                    value = current.LABEL + ': > ';
	                    value += current.VALUES._from;
	                  }
	                }
	                if (current.SUB_TYPE.VALUE === 'less') {
	                  if (BX.type.isNotEmptyString(current.VALUES._to)) {
	                    value = current.LABEL + ': < ';
	                    value += current.VALUES._to;
	                  }
	                }
	                if (current.SUB_TYPE.VALUE === 'before_n') {
	                  if (BX.type.isNotEmptyString(current.VALUES._to)) {
	                    value = current.LABEL + ': < ';
	                    value += current.VALUES._to;
	                  }
	                }
	                break;
	              }
	            case this.parent.types.CUSTOM_ENTITY:
	            case this.parent.types.DEST_SELECTOR:
	            case this.parent.types.ENTITY_SELECTOR:
	              {
	                if (current.MULTIPLE) {
	                  var label = !!current.VALUES._label ? current.VALUES._label : [];
	                  if (BX.type.isPlainObject(label)) {
	                    label = Object.keys(label).map(function (key) {
	                      return label[key];
	                    });
	                  }
	                  if (!BX.type.isArray(label)) {
	                    label = [label];
	                  }
	                  if (label.length > 0) {
	                    value = current.LABEL + ': ';
	                    value += label.join(', ');
	                  }
	                } else {
	                  if (BX.type.isNotEmptyString(current.VALUES._value) && BX.type.isNotEmptyString(current.VALUES._label)) {
	                    value = current.LABEL + ': ';
	                    value += current.VALUES._label;
	                  }
	                }
	                break;
	              }
	            case this.parent.types.CUSTOM:
	              {
	                value = '_VALUE' in current && BX.type.isNotEmptyString(current._VALUE) ? current.LABEL : null;
	                break;
	              }
	            default:
	              {
	                if (BX.type.isNotEmptyString(current.VALUE)) {
	                  value = current.LABEL + ': ' + current.VALUE;
	                }
	                break;
	              }
	          }
	        } else {
	          var squareItem = {
	            block: 'main-ui-search-square',
	            name: current.LABEL + ': ' + BX.Loc.getMessage('MAIN_UI_FILTER__ADDITIONAL_FILTER_PLACEHOLDER_IS_EMPTY'),
	            value: current.NAME,
	            icon: 'ICON' in current ? current.ICON : null,
	            item: {
	              type: 'control',
	              name: current.NAME
	            },
	            title: current.LABEL + ': ' + BX.Loc.getMessage('MAIN_UI_FILTER__ADDITIONAL_FILTER_PLACEHOLDER_IS_EMPTY')
	          };
	          if (current.ADDITIONAL_FILTER === BX.Filter.AdditionalFilter.Type.HAS_ANY_VALUE) {
	            squareItem.name = current.LABEL + ': ' + BX.Loc.getMessage('MAIN_UI_FILTER__ADDITIONAL_FILTER_PLACEHOLDER_HAS_ANY_VALUE');
	            squareItem.title = current.LABEL + ': ' + BX.Loc.getMessage('MAIN_UI_FILTER__ADDITIONAL_FILTER_PLACEHOLDER_HAS_ANY_VALUE');
	          }
	          result.push(squareItem);
	        }
	        if (value !== null) {
	          result.push({
	            block: 'main-ui-search-square',
	            name: value,
	            value: current.NAME,
	            icon: 'ICON' in current ? current.ICON : null,
	            item: {
	              type: 'control',
	              name: current.NAME
	            },
	            title: value
	          });
	        }
	      }, this);
	      return result;
	    },
	    getPreset: function getPreset() {
	      var container = this.getContainer();
	      var presetClass = this.parent.settings.classSquare;
	      var preset = null;
	      if (BX.type.isDomNode(container)) {
	        preset = BX.Filter.Utils.getByClass(container, presetClass);
	      }
	      return preset;
	    },
	    removePreset: function removePreset() {
	      var preset = this.getPreset();
	      if (BX.type.isDomNode(preset)) {
	        BX.remove(preset);
	        this.adjustPlaceholder();
	      }
	      this.hideClearButton();
	    },
	    updatePreset: function updatePreset(presetData) {
	      this.removePreset();
	      this.setPreset(presetData);
	    }
	  };
	})();

	(function () {

	  BX.namespace('BX.Filter');

	  /**
	   * Filter settings class
	   * @param options
	   * @param parent
	   * @constructor
	   */
	  BX.Filter.Settings = function (options, parent) {
	    /**
	     * Field
	     * @type {string}
	     */
	    this.classField = 'main-ui-control-field';
	    this.classFieldGroup = 'main-ui-control-field-group';
	    this.classFieldLine = 'main-ui-filter-field-line';
	    this.classFieldDelete = 'main-ui-filter-field-delete';
	    this.classFieldLabel = 'main-ui-control-field-label';
	    this.classFieldWithLabel = 'main-ui-filter-wield-with-label';
	    this.classPresetName = 'main-ui-filter-sidebar-item-text';
	    this.classControl = 'main-ui-control';
	    this.classDateInput = 'main-ui-date-input';
	    this.classHide = 'main-ui-hide';
	    this.classNumberInput = 'main-ui-number-input';
	    this.classSelect = 'main-ui-select';
	    this.classMultiSelect = 'main-ui-multi-select';
	    this.classValueDelete = 'main-ui-control-value-delete';
	    this.classStringInput = 'main-ui-control-string';
	    this.classAddField = 'main-ui-filter-field-add-item';
	    this.classAddPresetField = 'main-ui-filter-new-filter';
	    this.classAddPresetFieldInput = 'main-ui-filter-sidebar-edit-control';
	    this.classAddPresetButton = 'main-ui-filter-add-item';
	    this.classButtonsContainer = 'main-ui-filter-field-button-container';
	    this.classSaveButton = 'main-ui-filter-save';
	    this.classCancelButton = 'main-ui-filter-cancel';
	    this.classMenuItem = 'main-ui-select-inner-item';
	    this.classMenuItemText = 'main-ui-select-inner-item-element';
	    this.classMenuMultiItemText = 'main-ui-select-inner-label';
	    this.classMenuItemChecked = 'main-ui-checked';
	    this.classSearchContainer = 'main-ui-filter-search';
	    this.classDefaultPopup = 'popup-window';
	    this.classPopupFieldList = 'main-ui-filter-popup-field-list';
	    this.classPopupFieldList1Column = 'main-ui-filter-field-list-1-column';
	    this.classPopupFieldList2Column = 'main-ui-filter-field-list-2-column';
	    this.classPopupFieldList3Column = 'main-ui-filter-field-list-3-column';
	    this.classPopupFieldList4Column = 'main-ui-filter-field-list-4-column';
	    this.classPopupFieldList5Column = 'main-ui-filter-field-list-5-column';
	    this.classPopupFieldList6Column = 'main-ui-filter-field-list-6-column';
	    this.classFieldListItem = 'main-ui-filter-field-list-item';
	    this.classEditButton = 'main-ui-filter-add-edit';
	    this.classPresetEdit = 'main-ui-filter-edit';
	    this.classPresetNameEdit = 'main-ui-filter-edit-text';
	    this.classPresetDeleteButton = 'main-ui-delete';
	    this.classPresetDragButton = 'main-ui-filter-icon-grab';
	    this.classPresetEditButton = 'main-ui-filter-icon-edit';
	    this.classPresetEditInput = 'main-ui-filter-sidebar-item-input';
	    this.classPresetOndrag = 'main-ui-filter-sidebar-item-ondrag';
	    this.classSquare = 'main-ui-square';
	    this.classSquareDelete = 'main-ui-square-delete';
	    this.classSquareSelected = 'main-ui-square-selected';
	    this.classPresetsContainer = 'main-ui-filter-sidebar-item-container';
	    this.classPreset = 'main-ui-filter-sidebar-item';
	    this.classPresetCurrent = 'main-ui-filter-current-item';
	    this.classFilterContainer = 'main-ui-filter-wrapper';
	    this.classFileldControlList = 'main-ui-filter-field-container-list';
	    this.classRestoreFieldsButton = 'main-ui-filter-field-restore-items';
	    this.classClearSearchValueButton = 'main-ui-delete';
	    this.classSearchButtonsContainer = 'main-ui-item-icon-block';
	    this.classSearchButton = 'main-ui-search';
	    this.classDisabled = 'main-ui-disable';
	    this.classAnimationShow = 'main-ui-popup-show-animation';
	    this.classAnimationClose = 'main-ui-popup-close-animation';
	    this.classLimitsAnimation = 'main-ui-filter-field-limits-animate';
	    this.classSidebarControlsContainer = 'main-ui-filter-add-container';
	    this.searchContainerPostfix = '_search_container';
	    this.classPresetButtonsContainer = 'main-ui-filter-field-preset-button-container';
	    this.classFindButton = 'main-ui-filter-find';
	    this.classResetButton = 'main-ui-filter-reset';
	    this.classDefaultFilter = 'main-ui-filter-default-preset';
	    this.classRestoreButton = 'main-ui-filter-reset-link';
	    this.classPinButton = 'main-ui-filter-icon-pin';
	    this.classPopupOverlay = 'popup-window-overlay';
	    this.classSidePanelContainer = 'side-panel-container';
	    this.classPinnedPreset = 'main-ui-item-pin';
	    this.classWaitButtonClass = 'ui-btn-clock';
	    this.classForAllCheckbox = 'main-ui-filter-save-for-all';
	    this.classShow = 'main-ui-show';
	    this.classFocus = 'main-ui-focus';
	    this.classPresetField = 'main-ui-filter-preset-field';
	    this.classPopupSearchFieldListItemHidden = 'main-ui-filter-field-list-item-hidden';
	    this.classPopupSearchFieldListItemVisible = 'main-ui-filter-field-list-item-visible';
	    this.classPopupSearchSectionItem = 'main-ui-filter-popup-search-section-input';
	    this.classPopupSearchSectionItemIcon = 'main-ui-filter-popup-search-section-item-icon';
	    this.classPopupSearchSectionItemIconActive = 'main-ui-filter-popup-search-section-item-icon-active';
	    this.numberPostfix = '_numsel';
	    this.datePostfix = '_datesel';
	    this.toPostfix = '_to';
	    this.fromPostfix = '_from';
	    this.daysPostfix = '_days';
	    this.monthPostfix = '_month';
	    this.quarterPostfix = '_quarter';
	    this.yearPostfix = '_year';
	    this.generalTemplateId = '';
	    this.maxPopupColumnCount = 6;
	    this.popupWidth = 630;
	    this.init(options, parent);
	  };
	  BX.Filter.Settings.prototype = {
	    init: function init(options, parent) {
	      this.generalTemplateId = parent.getParam('FILTER_ID') + '_GENERAL_template';
	      this.mergeSettings(options);
	    },
	    get: function get(name, defaultValue) {
	      return name && name in this && !BX.type.isFunction(this[name]) ? this[name] : defaultValue;
	    },
	    mergeSettings: function mergeSettings(options) {
	      if (BX.type.isPlainObject(options)) {
	        Object.keys(options).forEach(function (key) {
	          if (!BX.type.isFunction(this[key])) {
	            this[key] = options[key];
	          }
	        }, this);
	      }
	    }
	  };
	})();

	var _templateObject, _templateObject2;
	function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
	function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { babelHelpers.defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }

	/**
	 * @memberOf BX.Filter
	 */
	var AdditionalFilter = /*#__PURE__*/function (_EventEmitter) {
	  babelHelpers.inherits(AdditionalFilter, _EventEmitter);
	  babelHelpers.createClass(AdditionalFilter, null, [{
	    key: "getInstance",
	    value: function getInstance() {
	      return AdditionalFilter.cache.remember('instance', function () {
	        return new AdditionalFilter();
	      });
	    }
	  }, {
	    key: "fetchAdditionalFilter",
	    value: function fetchAdditionalFilter(name, fields) {
	      if (main_core.Type.isStringFilled(name) && main_core.Type.isPlainObject(fields)) {
	        if ("".concat(name, "_").concat(AdditionalFilter.Type.IS_EMPTY) in fields) {
	          return AdditionalFilter.Type.IS_EMPTY;
	        }
	        if ("".concat(name, "_").concat(AdditionalFilter.Type.HAS_ANY_VALUE) in fields) {
	          return AdditionalFilter.Type.HAS_ANY_VALUE;
	        }
	      }
	      return null;
	    }
	  }]);
	  function AdditionalFilter() {
	    var _this;
	    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
	    babelHelpers.classCallCheck(this, AdditionalFilter);
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(AdditionalFilter).call(this));
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "cache", new main_core.Cache.MemoryCache());
	    _this.setEventNamespace('BX.Main.Filter.AdditionalFilter');
	    _this.options = _objectSpread$1({}, options);
	    main_core.Event.bind(document, 'click', _this.onDocumentClick.bind(babelHelpers.assertThisInitialized(_this)));
	    return _this;
	  }
	  babelHelpers.createClass(AdditionalFilter, [{
	    key: "getAdditionalFilterMenu",
	    value: function getAdditionalFilterMenu() {
	      var _this2 = this;
	      return this.cache.remember('menu', function () {
	        return new main_popup.Menu({
	          id: 'additional_filter_menu',
	          autoHide: false,
	          items: [{
	            id: 'isEmpty',
	            text: main_core.Loc.getMessage('MAIN_UI_FILTER__ADDITIONAL_FILTER_MENU_IS_EMPTY'),
	            onclick: _this2.onAdditionalFilterMenuItemClick.bind(_this2, AdditionalFilter.Type.IS_EMPTY)
	          }, {
	            id: 'hasAnyValue',
	            text: main_core.Loc.getMessage('MAIN_UI_FILTER__ADDITIONAL_FILTER_MENU_HAS_ANY_VALUE'),
	            onclick: _this2.onAdditionalFilterMenuItemClick.bind(_this2, AdditionalFilter.Type.HAS_ANY_VALUE)
	          }, {
	            id: 'delimiter',
	            delimiter: true
	          }, {
	            id: 'helper',
	            html: main_core.Loc.getMessage('MAIN_UI_FILTER__ADDITIONAL_FILTER_PLACEHOLDER_HOW') + '<span class="ui-hint"><span class="ui-hint-icon"></span></span>',
	            onclick: function onclick() {
	              if (top.BX.Helper) {
	                top.BX.Helper.show("redirect=detail&code=14006190");
	                event.preventDefault();
	              }
	            }
	          }]
	        });
	      });
	    }
	  }, {
	    key: "onAdditionalFilterMenuItemClick",
	    value: function onAdditionalFilterMenuItemClick(typeId) {
	      var node = this.getCurrentFieldNode();
	      this.initAdditionalFilter(node, typeId);
	    }
	  }, {
	    key: "onDocumentClick",
	    value: function onDocumentClick() {
	      this.getAdditionalFilterMenu().close();
	    }
	  }, {
	    key: "setCurrentFieldId",
	    value: function setCurrentFieldId(fieldId) {
	      this.cache.set('currentFieldId', fieldId);
	    }
	  }, {
	    key: "getCurrentFieldId",
	    value: function getCurrentFieldId() {
	      return this.cache.get('currentFieldId', '');
	    }
	  }, {
	    key: "setCurrentFieldNode",
	    value: function setCurrentFieldNode(node) {
	      this.cache.set('currentFieldNode', node);
	    }
	  }, {
	    key: "getCurrentFieldNode",
	    value: function getCurrentFieldNode() {
	      return this.cache.get('currentFieldNode');
	    }
	  }, {
	    key: "onAdditionalFilterButtonClick",
	    value: function onAdditionalFilterButtonClick(fieldId, event) {
	      event.stopPropagation();
	      var currentTarget = event.currentTarget;
	      this.setCurrentFieldId(fieldId);
	      this.setCurrentFieldNode(currentTarget.parentElement);
	      var menu = this.getAdditionalFilterMenu();
	      var allowedItems = String(main_core.Dom.attr(currentTarget, 'data-allowed-types')).split(',');
	      menu.getMenuItems().forEach(function (menuItem) {
	        var menuItemId = menuItem.getId();
	        if (allowedItems.includes(menuItemId) || menuItemId === 'helper' || menuItemId === 'delimiter') {
	          main_core.Dom.removeClass(menuItem.layout.item, 'main-ui-disable');
	        } else {
	          main_core.Dom.addClass(menuItem.layout.item, 'main-ui-disable');
	        }
	      });
	      if (menu.getPopupWindow().isShown()) {
	        if (menu.getPopupWindow().bindElement !== currentTarget) {
	          menu.getPopupWindow().setBindElement(currentTarget);
	          menu.getPopupWindow().adjustPosition();
	        } else {
	          menu.close();
	        }
	      } else {
	        menu.getPopupWindow().setBindElement(currentTarget);
	        menu.show();
	      }
	    }
	  }, {
	    key: "getAdditionalFilterButton",
	    value: function getAdditionalFilterButton(_ref) {
	      var _this3 = this;
	      var fieldId = _ref.fieldId,
	        enabled = _ref.enabled;
	      return this.cache.remember("field_".concat(fieldId), function () {
	        var disabled = !main_core.Type.isArrayFilled(enabled) && enabled !== true;
	        var allowedTypes = function () {
	          if (main_core.Type.isArrayFilled(enabled)) {
	            return enabled.join(',');
	          }
	          if (!disabled) {
	            return [AdditionalFilter.Type.IS_EMPTY, AdditionalFilter.Type.HAS_ANY_VALUE].join(',');
	          }
	          return '';
	        }();
	        return main_core.Tag.render(_templateObject || (_templateObject = babelHelpers.taggedTemplateLiteral(["\n\t\t\t\t<span \n\t\t\t\t\tclass=\"ui-icon ui-icon-service-light-other main-ui-filter-additional-filters-button", "\"\n\t\t\t\t\tonclick=\"", "\"\n\t\t\t\t\tdata-allowed-types=\"", "\"\n\t\t\t\t>\n\t\t\t\t\t<i></i>\n\t\t\t\t</span>\n\t\t\t"])), disabled ? ' main-ui-disable' : '', _this3.onAdditionalFilterButtonClick.bind(_this3, fieldId), allowedTypes);
	      });
	    }
	  }, {
	    key: "initAdditionalFilter",
	    value: function initAdditionalFilter(fieldNode, typeId) {
	      var currentFieldId = this.getCurrentFieldId();
	      if (currentFieldId === '') {
	        currentFieldId = fieldNode.attributes[1].value;
	      }
	      var placeholder = this.getAdditionalFilterPlaceholderField(currentFieldId, typeId);
	      main_core.Dom.addClass(fieldNode, 'main-ui-filter-field-with-additional-filter');
	      var currentPlaceholder = fieldNode.querySelector('.main-ui-filter-additional-filter-placeholder');
	      if (currentPlaceholder) {
	        main_core.Dom.replace(currentPlaceholder, placeholder);
	      } else {
	        main_core.Dom.append(placeholder, fieldNode);
	      }
	    }
	  }, {
	    key: "restoreField",
	    value: function restoreField(fieldNode) {
	      if (main_core.Type.isDomNode(fieldNode)) {
	        var placeholder = fieldNode.querySelector('.main-ui-filter-additional-filter-placeholder');
	        if (placeholder) {
	          main_core.Dom.remove(placeholder);
	        }
	        main_core.Dom.removeClass(fieldNode, 'main-ui-filter-field-with-additional-filter');
	      }
	    }
	  }, {
	    key: "getAdditionalFilterPlaceholderField",
	    value: function getAdditionalFilterPlaceholderField(fieldId, typeId) {
	      var _this4 = this;
	      return this.cache.remember("placeholder_".concat(fieldId, "_").concat(typeId), function () {
	        var message = function () {
	          if (typeId === AdditionalFilter.Type.HAS_ANY_VALUE) {
	            return main_core.Loc.getMessage('MAIN_UI_FILTER__ADDITIONAL_FILTER_PLACEHOLDER_HAS_ANY_VALUE');
	          }
	          return main_core.Loc.getMessage('MAIN_UI_FILTER__ADDITIONAL_FILTER_PLACEHOLDER_IS_EMPTY');
	        }();
	        var onRemoveClick = function onRemoveClick(event) {
	          _this4.restoreField(event.currentTarget.closest('.main-ui-filter-field-with-additional-filter'));
	        };
	        return main_core.Tag.render(_templateObject2 || (_templateObject2 = babelHelpers.taggedTemplateLiteral(["\n\t\t\t\t<div class=\"main-ui-control main-ui-filter-additional-filter-placeholder\" data-type=\"", "\">\n\t\t\t\t\t<div class=\"main-ui-square\">\n\t\t\t\t\t\t<div class=\"main-ui-square-item\">", "</div>\n\t\t\t\t\t\t<div class=\"main-ui-item-icon main-ui-square-delete\" onclick=\"", "\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t"])), typeId, message, onRemoveClick);
	      });
	    }
	  }, {
	    key: "getFilter",
	    value: function getFilter(fieldNode) {
	      if (main_core.Type.isDomNode(fieldNode)) {
	        var placeholder = fieldNode.querySelector('.main-ui-filter-additional-filter-placeholder');
	        if (main_core.Type.isDomNode(placeholder)) {
	          var type = main_core.Dom.attr(placeholder, 'data-type');
	          var fieldId = main_core.Dom.attr(fieldNode, 'data-name');
	          return babelHelpers.defineProperty({}, "".concat(fieldId, "_").concat(type), 'y');
	        }
	      }
	      return null;
	    }
	  }]);
	  return AdditionalFilter;
	}(main_core_events.EventEmitter);
	babelHelpers.defineProperty(AdditionalFilter, "Type", {
	  IS_EMPTY: 'isEmpty',
	  HAS_ANY_VALUE: 'hasAnyValue'
	});
	babelHelpers.defineProperty(AdditionalFilter, "cache", new main_core.Cache.MemoryCache());

	/* eslint-disable no-underscore-dangle */
	var Presets = /*#__PURE__*/function () {
	  function Presets(parent) {
	    babelHelpers.classCallCheck(this, Presets);
	    this.parent = null;
	    this.presets = null;
	    this.container = null;
	    this.init(parent);
	  }
	  babelHelpers.createClass(Presets, [{
	    key: "init",
	    value: function init(parent) {
	      this.parent = parent;
	    }
	  }, {
	    key: "bindOnPresetClick",
	    value: function bindOnPresetClick() {
	      var _this = this;
	      (this.getPresets() || []).forEach(function (current) {
	        main_core.Event.bind(current, 'click', BX.delegate(_this._onPresetClick, _this));
	      });
	    }
	    /**
	     * Gets add preset field
	     * @return {?HTMLElement}
	     */
	  }, {
	    key: "getAddPresetField",
	    value: function getAddPresetField() {
	      return this.getContainer().querySelector('.main-ui-filter-new-filter');
	    }
	    /**
	     * Gets add preset name input
	     * @return {?HTMLInputElement}
	     */
	  }, {
	    key: "getAddPresetFieldInput",
	    value: function getAddPresetFieldInput() {
	      return this.getAddPresetField().querySelector('.main-ui-filter-sidebar-edit-control');
	    }
	    /**
	     * Clears add preset input value
	     */
	  }, {
	    key: "clearAddPresetFieldInput",
	    value: function clearAddPresetFieldInput() {
	      var input = this.getAddPresetFieldInput();
	      if (main_core.Type.isDomNode(input)) {
	        input.value = '';
	      }
	    }
	    /**
	     * Finds preset node by child node
	     * @param {?HTMLElement} node
	     * @return {?HTMLElement}
	     */
	  }, {
	    key: "normalizePreset",
	    value: function normalizePreset(node) {
	      return node.closest('.main-ui-filter-sidebar-item');
	    }
	    /**
	     * Deactivates all presets
	     */
	  }, {
	    key: "deactivateAllPresets",
	    value: function deactivateAllPresets() {
	      this.getPresets().forEach(function (current) {
	        main_core.Dom.removeClass(current, 'main-ui-filter-current-item');
	      });
	    }
	    /**
	     * Creates sidebar preset item
	     * @param {string} id - Preset id
	     * @param {string} title - Preset title
	     * @param {boolean} [isPinned] - Pass true is preset pinned
	     */
	  }, {
	    key: "createSidebarItem",
	    value: function createSidebarItem(id, title, isPinned) {
	      return BX.decl({
	        block: 'sidebar-item',
	        text: main_core.Text.decode(title),
	        id: id,
	        pinned: isPinned,
	        noEditPinTitle: this.parent.getParam('MAIN_UI_FILTER__IS_SET_AS_DEFAULT_PRESET'),
	        editNameTitle: this.parent.getParam('MAIN_UI_FILTER__EDIT_PRESET_TITLE'),
	        removeTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_PRESET'),
	        editPinTitle: this.parent.getParam('MAIN_UI_FILTER__SET_AS_DEFAULT_PRESET'),
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_TITLE')
	      });
	    }
	    /**
	     * Highlights preset node as active
	     * @param {?HTMLElement|string} preset - preset node or preset id
	     */
	  }, {
	    key: "activatePreset",
	    value: function activatePreset(preset) {
	      var _this2 = this;
	      this.deactivateAllPresets();
	      var presetNode = function () {
	        if (main_core.Type.isString(preset)) {
	          return _this2.getPresetNodeById(preset);
	        }
	        return preset;
	      }();
	      if (main_core.Type.isDomNode(presetNode)) {
	        main_core.Dom.addClass(presetNode, 'main-ui-filter-current-item');
	      }
	    }
	    /**
	     * Gets preset node by preset id
	     * @param {string} id
	     * @return {?HTMLElement}
	     */
	  }, {
	    key: "getPresetNodeById",
	    value: function getPresetNodeById(id) {
	      return this.getPresets().find(function (current) {
	        return main_core.Dom.attr(current, 'data-id') === id;
	      });
	    }
	    /**
	     * Gets preset id by preset node
	     * @param {?HTMLElement} preset
	     */
	  }, {
	    key: "getPresetId",
	    value: function getPresetId(preset) {
	      return main_core.Dom.attr(preset, 'data-id');
	    }
	    /**
	     * Updates preset name
	     * @param {?HTMLElement} presetNode
	     * @param {string} name
	     */
	  }, {
	    key: "updatePresetName",
	    value: function updatePresetName(presetNode, name) {
	      if (main_core.Type.isDomNode(presetNode) && main_core.Type.isString(name) && name !== '') {
	        var nameNode = this.getPresetNameNode(presetNode);
	        if (main_core.Type.isDomNode(nameNode)) {
	          main_core.Runtime.html(nameNode, name);
	        }
	      }
	    }
	    /**
	     * Removes preset
	     * @param {HTMLElement} presetNode
	     * @param {string} presetId
	     * @param {boolean} isDefault
	     */
	  }, {
	    key: "removePreset",
	    value: function removePreset(presetNode, presetId, isDefault) {
	      var currentPresetId = this.getCurrentPresetId();
	      var newPresets = [];
	      var postData = {
	        preset_id: presetId,
	        is_default: isDefault
	      };
	      var getData = {
	        FILTER_ID: this.parent.getParam('FILTER_ID'),
	        action: 'REMOVE_FILTER'
	      };
	      this.parent.saveOptions(postData, getData);
	      BX.remove(presetNode);
	      if (BX.type.isArray(this.parent.params.PRESETS)) {
	        newPresets = this.parent.params.PRESETS.filter(function (current) {
	          return current.ID !== presetId;
	        }, this);
	        this.parent.params.PRESETS = newPresets;
	      }
	      if (BX.type.isArray(this.parent.editablePresets)) {
	        newPresets = this.parent.editablePresets.filter(function (current) {
	          return current.ID !== presetId;
	        }, this);
	        this.parent.editablePresets = newPresets;
	      }
	      if (presetId === currentPresetId) {
	        this.parent.getSearch().removePreset();
	        this.resetPreset();
	      }
	    }
	    /**
	     * Pin preset (Sets as default preset)
	     * @param {string} presetId
	     */
	  }, {
	    key: "pinPreset",
	    value: function pinPreset(presetId) {
	      if (!BX.type.isNotEmptyString(presetId)) {
	        presetId = 'default_filter';
	      }
	      var presetNode = this.getPresetNodeById(presetId);
	      if (this.parent.getParam('VALUE_REQUIRED_MODE')) {
	        if (presetId === 'default_filter') {
	          return;
	        }
	      }
	      var params = {
	        FILTER_ID: this.parent.getParam('FILTER_ID'),
	        GRID_ID: this.parent.getParam('GRID_ID'),
	        action: 'PIN_PRESET'
	      };
	      var data = {
	        preset_id: presetId
	      };
	      this.getPresets().forEach(function (current) {
	        main_core.Dom.removeClass(current, this.parent.settings.classPinnedPreset);
	      }, this);
	      BX.addClass(presetNode, this.parent.settings.classPinnedPreset);
	      this.parent.saveOptions(data, params);
	    }
	  }, {
	    key: "_onPresetClick",
	    value: function _onPresetClick(event) {
	      var presetNode;
	      var presetId;
	      var presetData;
	      var isDefault;
	      var target;
	      var settings;
	      var parent;
	      event.preventDefault();
	      parent = this.parent;
	      settings = parent.settings;
	      target = event.target;
	      presetNode = event.currentTarget;
	      presetId = this.getPresetId(presetNode);
	      presetData = this.getPreset(presetId);
	      if (main_core.Dom.hasClass(target, settings.classPinButton)) {
	        if (this.parent.isEditEnabled()) {
	          if (main_core.Dom.hasClass(presetNode, settings.classPinnedPreset)) {
	            this.pinPreset('default_filter');
	          } else {
	            this.pinPreset(presetId);
	          }
	        }
	      }
	      if (main_core.Dom.hasClass(target, settings.classPresetEditButton)) {
	        this.enableEditPresetName(presetNode);
	      }
	      if (main_core.Dom.hasClass(target, settings.classPresetDeleteButton)) {
	        isDefault = 'IS_DEFAULT' in presetData ? presetData.IS_DEFAULT : false;
	        this.removePreset(presetNode, presetId, isDefault);
	        return false;
	      }
	      if (!main_core.Dom.hasClass(target, settings.classPresetDragButton) && !main_core.Dom.hasClass(target, settings.classAddPresetFieldInput)) {
	        if (this.parent.isEditEnabled()) {
	          this.updateEditablePreset(this.getCurrentPresetId());
	        }
	        var currentPreset = this.getPreset(this.getCurrentPresetId());
	        var preset = this.getPreset(presetId);
	        currentPreset.ADDITIONAL = [];
	        preset.ADDITIONAL = [];
	        this.activatePreset(presetNode);
	        this.applyPreset(presetId);
	        if (!this.parent.isEditEnabled()) {
	          parent.applyFilter(null, true);
	          if (event.isTrusted) {
	            parent.closePopup();
	          }
	          if (parent.isAddPresetEnabled()) {
	            parent.disableAddPreset();
	          }
	        }
	      }
	    }
	    /**
	     * Applies default preset
	     * @return {BX.Promise}
	     */
	  }, {
	    key: "applyPinnedPreset",
	    value: function applyPinnedPreset() {
	      var Filter = this.parent;
	      var isPinned = this.isPinned(this.getCurrentPresetId());
	      var promise;
	      if (this.parent.getParam('VALUE_REQUIRED') && this.getPinnedPresetId() === 'default_filter') {
	        this.applyPreset('default_filter');
	        this.deactivateAllPresets();
	        promise = this.parent.applyFilter();
	      } else if (!isPinned) {
	        var pinnedPresetId = this.getPinnedPresetId();
	        var presetData = this.getPreset(pinnedPresetId);
	        presetData.ADDITIONAL = [];
	        var pinnedPresetNode = this.getPinnedPresetNode();
	        var clear = false;
	        var applyPreset = true;
	        this.deactivateAllPresets();
	        this.activatePreset(pinnedPresetNode);
	        this.applyPreset(pinnedPresetId);
	        promise = Filter.applyFilter(clear, applyPreset);
	        Filter.closePopup();
	      } else {
	        promise = Filter.resetFilter();
	      }
	      return promise;
	    }
	    /**
	     * Updates editable presets
	     * @param {string} presetId
	     */
	  }, {
	    key: "updateEditablePreset",
	    value: function updateEditablePreset(presetId) {
	      var fields = this.parent.getFilterFieldsValues();
	      var presetRows = this.getFields().map(function (curr) {
	        return BX.data(curr, 'name');
	      });
	      var presetFields = this.parent.preparePresetFields(fields, presetRows);
	      var preset = this.getPreset(presetId);
	      preset.FIELDS = presetFields;
	      preset.TITLE = this.getPresetInput(this.getPresetNodeById(presetId)).value;
	      preset.ROWS = presetRows;
	    }
	    /**
	     * Gets preset input node
	     * @param presetNode
	     * @return {?HTMLInputElement}
	     */
	  }, {
	    key: "getPresetInput",
	    value: function getPresetInput(presetNode) {
	      return BX.Filter.Utils.getByClass(presetNode, this.parent.settings.classPresetEditInput);
	    }
	    /**
	     * Enable edit preset name
	     * @param {HTMLElement} presetNode
	     */
	  }, {
	    key: "enableEditPresetName",
	    value: function enableEditPresetName(presetNode) {
	      var input = this.getPresetInput(presetNode);
	      BX.addClass(presetNode, this.parent.settings.classPresetNameEdit);
	      input.select();
	      // noinspection SillyAssignmentJS
	      input.value = BX.util.htmlspecialcharsback(input.value);
	      main_core.Event.bind(input, 'input', BX.delegate(this._onPresetNameInput, this));
	    }
	  }, {
	    key: "_onPresetNameInput",
	    value: function _onPresetNameInput(event) {
	      var Search = this.parent.getSearch();
	      var inputValue = event.currentTarget.value;
	      var presetNode = BX.findParent(event.currentTarget, {
	        className: this.parent.settings.classPreset
	      }, true, false);
	      var presetId = this.getPresetId(presetNode);
	      var currentPresetId = this.getCurrentPresetId();
	      var data = {
	        ID: presetId,
	        TITLE: inputValue
	      };
	      if (presetId === currentPresetId) {
	        Search.updatePreset(data);
	      }
	    }
	    /**
	     * Gets preset name node element
	     * @param {HTMLElement} presetNode
	     * @return {?HTMLElement}
	     */
	  }, {
	    key: "getPresetNameNode",
	    value: function getPresetNameNode(presetNode) {
	      return BX.Filter.Utils.getByClass(presetNode, this.parent.settings.classPresetName);
	    }
	    /**
	     * Disable edit name for preset
	     * @param {HTMLElement} presetNode
	     */
	  }, {
	    key: "disableEditPresetName",
	    value: function disableEditPresetName(presetNode) {
	      var input = this.getPresetInput(presetNode);
	      main_core.Dom.removeClass(presetNode, this.parent.settings.classPresetNameEdit);
	      if (BX.type.isDomNode(input)) {
	        input.blur();
	        BX.unbind(input, 'input', BX.delegate(this._onPresetNameInput, this));
	      }
	    }
	    /**
	     * Gets preset object
	     * @param {string} presetId
	     * @param {boolean} [isDefault = false] - gets from default presets collection
	     * @return {?object}
	     */
	  }, {
	    key: "getPreset",
	    value: function getPreset(presetId, isDefault) {
	      var presets = this.parent.getParam(isDefault ? 'DEFAULT_PRESETS' : 'PRESETS', []);
	      if (this.parent.isEditEnabled() && !isDefault) {
	        presets = this.parent.editablePresets;
	      }
	      var filtered = presets.filter(function (current) {
	        return current.ID === presetId;
	      });
	      if (presetId === 'tmp_filter' && !filtered.length) {
	        var tmpPreset = BX.clone(this.getPreset('default_filter'));
	        tmpPreset.ID = 'tmp_filter';
	        presets.push(tmpPreset);
	        filtered.push(tmpPreset);
	      }
	      return filtered.length !== 0 ? filtered[0] : null;
	    }
	    /**
	     * Gets preset field by preset name (id)
	     * @param {string} presetId
	     * @param {string} fieldName
	     * @return {?object}
	     */
	  }, {
	    key: "getPresetField",
	    value: function getPresetField(presetId, fieldName) {
	      var preset = this.getPreset(presetId);
	      var field = null;
	      if (BX.type.isPlainObject(preset) && 'FIELDS' in preset && BX.type.isArray(preset.FIELDS)) {
	        field = preset.FIELDS.filter(function (current) {
	          return current.NAME === fieldName;
	        });
	        field = field.length ? field[0] : null;
	      }
	      return field;
	    }
	    /**
	     * Applies preset by id
	     * @param {string} presetId
	     * @param {boolean} [noValues = false]
	     */
	  }, {
	    key: "applyPreset",
	    value: function applyPreset(presetId, noValues) {
	      presetId = noValues ? 'default_filter' : presetId || 'default_filter';
	      var preset = this.getPreset(presetId);
	      if (presetId !== 'default_preset') {
	        preset = this.extendPreset(preset);
	      }
	      this.parent.getSearch().updatePreset(preset);
	      this.updatePresetFields(preset, noValues);
	      BX.onCustomEvent('BX.Main.Filter:onApplyPreset', [presetId]);
	    }
	    /**
	     * Extends preset
	     * @param {object} preset
	     * @return {object}
	     */
	  }, {
	    key: "extendPreset",
	    value: function extendPreset(preset) {
	      var defaultPreset = BX.clone(this.getPreset('default_filter'));
	      if (BX.type.isPlainObject(preset)) {
	        preset = BX.clone(preset);
	        preset.FIELDS.forEach(function (curr) {
	          var index;
	          var someField = defaultPreset.FIELDS.some(function (defCurr, defIndex) {
	            var result = false;
	            if (defCurr.NAME === curr.NAME) {
	              index = defIndex;
	              result = true;
	            }
	            return result;
	          }, this);
	          if (someField && index || someField && index === 0) {
	            defaultPreset.FIELDS[index] = curr;
	          } else if (!this.isEmptyField(curr)) {
	            defaultPreset.FIELDS.push(curr);
	          }
	        }, this);
	        preset.FIELDS = defaultPreset.FIELDS;
	      }
	      return preset;
	    }
	    /**
	     * Checks field is empty
	     * @param {object} field
	     * @return {boolean}
	     */
	  }, {
	    key: "isEmptyField",
	    value: function isEmptyField(field) {
	      var result = true;
	      if (main_core.Type.isStringFilled(field.ADDITIONAL_FILTER)) {
	        return false;
	      }
	      if (field.TYPE === this.parent.types.STRING) {
	        if (field.VALUE && field.VALUE.length) {
	          result = false;
	        }
	      }
	      if (field.TYPE === this.parent.types.SELECT) {
	        if (BX.type.isPlainObject(field.VALUE) && 'VALUE' in field.VALUE && field.VALUE.VALUE) {
	          result = false;
	        }
	      }
	      if (field.TYPE === this.parent.types.MULTI_SELECT) {
	        if (BX.type.isArray(field.VALUE) && field.VALUE.length) {
	          result = false;
	        }
	      }
	      if (field.TYPE === this.parent.types.CUSTOM_DATE) {
	        if (BX.type.isArray(field.VALUE.days) && field.VALUE.days.length || BX.type.isArray(field.VALUE.months) && field.VALUE.months.length || BX.type.isArray(field.VALUE.years) && field.VALUE.years.length) {
	          result = false;
	        }
	      }
	      if (field.TYPE === this.parent.types.CUSTOM_ENTITY || field.TYPE === this.parent.types.DEST_SELECTOR || field.TYPE === this.parent.types.ENTITY_SELECTOR) {
	        if (BX.type.isPlainObject(field.VALUES)) {
	          if (BX.type.isNotEmptyString(field.VALUES._label) && BX.type.isNotEmptyString(field.VALUES._value)) {
	            result = false;
	          }
	          if (BX.type.isPlainObject(field.VALUES._label) && BX.type.isPlainObject(field.VALUES._value) && Object.keys(field.VALUES._label).length && Object.keys(field.VALUES._value).length) {
	            result = false;
	          }
	          if (BX.type.isArray(field.VALUES._label) && BX.type.isArray(field.VALUES._value) && field.VALUES._label.length && field.VALUES._value.length) {
	            result = false;
	          }
	          if ((BX.type.isArray(field.VALUES._label) && field.VALUES._label.length || BX.type.isPlainObject(field.VALUES._label) && Object.keys(field.VALUES._label).length) && (BX.type.isArray(field.VALUES._value) && field.VALUES._value.length || BX.type.isPlainObject(field.VALUES._value) && Object.keys(field.VALUES._value).length)) {
	            result = false;
	          }
	        }
	      }
	      if (field.TYPE === this.parent.types.DATE) {
	        var datesel = '_datesel' in field.VALUES ? field.VALUES._datesel : field.SUB_TYPE.VALUE;
	        if (BX.type.isPlainObject(field.VALUES) && (field.VALUES._from || field.VALUES._to || field.VALUES._quarter || field.VALUES._month && !BX.type.isArray(field.VALUES._month) || field.VALUES._year && !BX.type.isArray(field.VALUES._year) || field.VALUES._days && !BX.type.isArray(field.VALUES._days)) || BX.type.isArray(field.VALUES._days) && field.VALUES._days.length || BX.type.isArray(field.VALUES._month) && field.VALUES._month.length || BX.type.isArray(field.VALUES._year) && field.VALUES._year.length || datesel === this.parent.dateTypes.CURRENT_DAY || datesel === this.parent.dateTypes.CURRENT_WEEK || datesel === this.parent.dateTypes.CURRENT_MONTH || datesel === this.parent.dateTypes.CURRENT_QUARTER || datesel === this.parent.dateTypes.LAST_7_DAYS || datesel === this.parent.dateTypes.LAST_30_DAYS || datesel === this.parent.dateTypes.LAST_60_DAYS || datesel === this.parent.dateTypes.LAST_90_DAYS || datesel === this.parent.dateTypes.LAST_WEEK || datesel === this.parent.dateTypes.LAST_MONTH || datesel === this.parent.dateTypes.TOMORROW || datesel === this.parent.dateTypes.YESTERDAY || datesel === this.parent.dateTypes.NEXT_WEEK || datesel === this.parent.dateTypes.NEXT_MONTH) {
	          result = false;
	        }
	      }
	      if (field.TYPE === this.parent.types.NUMBER) {
	        if (BX.type.isPlainObject(field.VALUES) && (field.VALUES._from || field.VALUES._to)) {
	          result = false;
	        }
	      }
	      if (field.TYPE === this.parent.types.CHECKBOX) {
	        if (BX.type.isPlainObject(field.VALUE) && field.VALUE.VALUE) {
	          result = false;
	        }
	      }
	      return result;
	    }
	    /**
	     * Resets preset
	     * @param {boolean} [noValues]
	     */
	  }, {
	    key: "resetPreset",
	    value: function resetPreset(noValues) {
	      this.applyPreset('', noValues);
	    }
	    /**
	     * Gets preset fields elements
	     * @return {?HTMLElement[]}
	     */
	  }, {
	    key: "getFields",
	    value: function getFields() {
	      var container = this.parent.getFieldListContainer();
	      var fields = null;
	      if (BX.type.isDomNode(container)) {
	        fields = BX.Filter.Utils.getBySelector(container.parentNode, ".".concat(this.parent.settings.classFileldControlList, " > div"), true);
	      }
	      return fields;
	    }
	    /**
	     * Gets field element by field object
	     * @param {object} fieldData
	     * @return {?HTMLElement}
	     */
	  }, {
	    key: "getField",
	    value: function getField(fieldData) {
	      var fields = this.getFields();
	      var field = null;
	      var tmpName;
	      var filtered;
	      if (BX.type.isArray(fields) && fields.length) {
	        filtered = fields.filter(function (current) {
	          if (BX.type.isDomNode(current)) {
	            tmpName = BX.data(current, 'name');
	          }
	          return tmpName === fieldData.NAME;
	        }, this);
	        field = filtered.length > 0 ? filtered[0] : null;
	      }
	      return field;
	    }
	    /**
	     * Removes field element by field object
	     * @param {object} field
	     * @param {boolean} disableSaveFieldsSort
	     */
	  }, {
	    key: "removeField",
	    value: function removeField(field) {
	      var disableSaveFieldsSort = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
	      var index;
	      var fieldName;
	      disableSaveFieldsSort = disableSaveFieldsSort || false;
	      if (BX.type.isPlainObject(field)) {
	        fieldName = field.NAME;
	        field = this.getField(field);
	        if (BX.type.isArray(this.parent.fieldsList)) {
	          index = this.parent.fieldsList.indexOf(field);
	          if (index !== -1) {
	            delete this.parent.fieldsList[index];
	          }
	        }
	        this.parent.unregisterDragItem(field);
	      }
	      if (BX.type.isDomNode(field)) {
	        fieldName = BX.data(field, 'name');
	        this.parent.getFields().deleteField(field);
	      }
	      if (!this.parent.isEditEnabled() && !this.parent.isAddPresetEnabled()) {
	        var currentPresetId = this.getCurrentPresetId();
	        var currentPresetField = this.getPresetField(currentPresetId, fieldName);
	        if (currentPresetField && !this.isEmptyField(currentPresetField)) {
	          this.deactivateAllPresets();
	          this.parent.applyFilter();
	        }
	      }
	      if (!disableSaveFieldsSort) {
	        this.parent.saveFieldsSort();
	      }
	    }
	    /**
	     * Removes field elements by field objects.
	     * @param {object[]} fields
	     */
	  }, {
	    key: "removeFields",
	    value: function removeFields(fields) {
	      fields.forEach(function (field) {
	        this.removeField(field, true);
	      }, this);
	      this.parent.saveFieldsSort();
	    }
	    /**
	     * Adds field into filter field list by field object
	     * @param {object} fieldData
	     */
	  }, {
	    key: "addField",
	    value: function addField(fieldData) {
	      var disableSaveFieldsSort = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
	      var container;
	      var control;
	      var controls;
	      if (BX.type.isPlainObject(fieldData)) {
	        container = this.parent.getFieldListContainer();
	        controls = this.parent.getControls();
	        control = BX.type.isArray(controls) ? controls[controls.length - 1] : null;
	        if (BX.type.isDomNode(control)) {
	          if (control.nodeName !== 'INPUT') {
	            control = BX.Filter.Utils.getByTag(control, 'input');
	          }
	          if (BX.type.isDomNode(control)) {
	            fieldData.TABINDEX = parseInt(control.getAttribute('tabindex')) + 1;
	          }
	        } else {
	          fieldData.TABINDEX = 2;
	        }
	        if (BX.type.isDomNode(container)) {
	          control = this.createControl(fieldData);
	          if (BX.type.isDomNode(control)) {
	            BX.append(control, container);
	            if (BX.type.isArray(this.parent.fieldsList)) {
	              this.parent.fieldsList.push(control);
	            }
	            this.parent.registerDragItem(control);
	          }
	        }
	      }
	      if (!this.parent.isEditEnabled() && !this.parent.isAddPresetEnabled()) {
	        var currentPresetId = this.getCurrentPresetId();
	        var currentPresetField = this.getPresetField(currentPresetId, fieldData.NAME);
	        if (currentPresetField && !this.isEmptyField(currentPresetField)) {
	          this.parent.updatePreset('tmp_filter');
	          this.deactivateAllPresets();
	          this.parent.getSearch().updatePreset(this.getPreset('tmp_filter'));
	        }
	      }
	      if (!disableSaveFieldsSort) {
	        this.parent.saveFieldsSort();
	      }
	    }
	    /**
	     * Creates field control by field object
	     * @param {object} fieldData
	     * @return {?HTMLElement}
	     */
	  }, {
	    key: "createControl",
	    value: function createControl(fieldData) {
	      var control;
	      switch (fieldData.TYPE) {
	        case this.parent.types.STRING:
	          {
	            control = this.parent.getFields().createInputText(fieldData);
	            break;
	          }
	        case this.parent.types.TEXTAREA:
	          {
	            control = this.parent.getFields().createTextarea(fieldData);
	            break;
	          }
	        case this.parent.types.SELECT:
	          {
	            control = this.parent.getFields().createSelect(fieldData);
	            break;
	          }
	        case this.parent.types.MULTI_SELECT:
	          {
	            control = this.parent.getFields().createMultiSelect(fieldData);
	            break;
	          }
	        case this.parent.types.NUMBER:
	          {
	            control = this.parent.getFields().createNumber(fieldData);
	            break;
	          }
	        case this.parent.types.DATE:
	          {
	            control = this.parent.getFields().createDate(fieldData);
	            break;
	          }
	        case this.parent.types.CUSTOM_DATE:
	          {
	            control = this.parent.getFields().createCustomDate(fieldData);
	            break;
	          }
	        case this.parent.types.DEST_SELECTOR:
	          {
	            control = this.parent.getFields().createDestSelector(fieldData);
	            break;
	          }
	        case this.parent.types.ENTITY_SELECTOR:
	          {
	            control = this.parent.getFields().createEntitySelector(fieldData);
	            break;
	          }
	        case this.parent.types.CUSTOM:
	          {
	            control = this.parent.getFields().createCustom(fieldData);
	            break;
	          }
	        case this.parent.types.CUSTOM_ENTITY:
	          {
	            control = this.parent.getFields().createCustomEntity(fieldData);
	            break;
	          }
	        default:
	          {
	            break;
	          }
	      }
	      if (this.parent.getParam('ENABLE_ADDITIONAL_FILTERS')) {
	        var additionalFilterInstance = AdditionalFilter.getInstance();
	        var button = additionalFilterInstance.getAdditionalFilterButton({
	          fieldId: fieldData.NAME,
	          enabled: fieldData.ADDITIONAL_FILTER_ALLOWED
	        });
	        main_core.Dom.append(button, control);
	        if (!fieldData.ADDITIONAL_FILTER_ALLOWED) {
	          BX.Dom.addClass(control, 'main-ui-filter-additional-filters-hide');
	        }
	        if (main_core.Type.isStringFilled(fieldData.ADDITIONAL_FILTER)) {
	          additionalFilterInstance.initAdditionalFilter(control, fieldData.ADDITIONAL_FILTER);
	        }
	      }
	      if (BX.type.isDomNode(control)) {
	        control.dataset.name = fieldData.NAME;
	        control.FieldController = new BX.Filter.FieldController(control, this.parent);
	        if (fieldData.REQUIRED) {
	          var removeButton = control.querySelector('.main-ui-filter-field-delete');
	          if (removeButton) {
	            BX.remove(removeButton);
	          }
	        }
	      }
	      return control;
	    }
	    /**
	     * Removes not compared properties
	     * @param {object} fields
	     * @param {boolean} [noClean]
	     */
	  }, {
	    key: "removeNotCompareVariables",
	    value: function removeNotCompareVariables(fields, noClean) {
	      if (BX.type.isPlainObject(fields)) {
	        var dateType = this.parent.dateTypes;
	        var additionalDateTypes = this.parent.additionalDateTypes;
	        if ('FIND' in fields) {
	          delete fields.FIND;
	        }
	        if (!noClean) {
	          Object.keys(fields).forEach(function (key) {
	            if (key.indexOf('_numsel') !== -1) {
	              delete fields[key];
	            }
	            if (key.indexOf('_datesel') !== -1) {
	              var datesel = fields[key];
	              if (datesel === dateType.EXACT || datesel === dateType.RANGE || datesel === additionalDateTypes.PREV_DAY || datesel === additionalDateTypes.NEXT_DAY || datesel === additionalDateTypes.MORE_THAN_DAYS_AGO || datesel === additionalDateTypes.AFTER_DAYS || datesel === dateType.PREV_DAYS || datesel === dateType.NEXT_DAYS || datesel === dateType.YEAR || datesel === dateType.MONTH || datesel === dateType.QUARTER || datesel === dateType.NONE || datesel === dateType.CUSTOM_DATE) {
	                delete fields[key];
	              }
	            }
	            var field = this.parent.getFieldByName(key);
	            if (fields[key] === '' && (!field || !field.STRICT)) {
	              delete fields[key];
	            }
	          }, this);
	        }
	      }
	    }
	    /**
	     * Checks is modified preset field values
	     * @param {string} presetId
	     * @returns {boolean}
	     */
	  }, {
	    key: "isPresetValuesModified",
	    value: function isPresetValuesModified(presetId) {
	      var currentPresetData = this.getPreset(presetId);
	      var presetFields = this.parent.preparePresetSettingsFields(currentPresetData.FIELDS);
	      var currentFields = this.parent.getFilterFieldsValues();
	      this.removeNotCompareVariables(presetFields);
	      this.removeNotCompareVariables(currentFields);
	      var comparedPresetFields = BX.Filter.Utils.sortObject(presetFields);
	      var comparedCurrentFields = BX.Filter.Utils.sortObject(currentFields);
	      return !Object.keys(comparedPresetFields).every(function (key) {
	        return comparedPresetFields[key] === comparedCurrentFields[key] || (BX.type.isPlainObject(comparedPresetFields[key]) || BX.type.isArray(comparedPresetFields[key])) && BX.Filter.Utils.objectsIsEquals(comparedPresetFields[key], comparedCurrentFields[key]);
	      });
	    }
	    /**
	     * Gets additional preset values
	     * @param {string} presetId
	     * @return {?object}
	     */
	  }, {
	    key: "getAdditionalValues",
	    value: function getAdditionalValues(presetId) {
	      var currentPresetData = this.getPreset(presetId);
	      var notEmptyFields = currentPresetData.FIELDS.filter(function (field) {
	        return !this.isEmptyField(field);
	      }, this);
	      var presetFields = this.parent.preparePresetSettingsFields(notEmptyFields);
	      var currentFields = this.parent.getFilterFieldsValues();
	      this.removeNotCompareVariables(presetFields, true);
	      this.removeNotCompareVariables(currentFields, true);
	      this.removeSameProperties(currentFields, presetFields);
	      return currentFields;
	    }
	    /**
	     * Removes same object properties
	     * @param {object} object1
	     * @param {object} object2
	     */
	  }, {
	    key: "removeSameProperties",
	    value: function removeSameProperties(object1, object2) {
	      if (BX.type.isPlainObject(object1) && BX.type.isPlainObject(object2)) {
	        Object.keys(object2).forEach(function (key) {
	          if (key in object1) {
	            delete object1[key];
	          }
	        });
	      }
	    }
	    /**
	     * Removes additional field by field name
	     * @param {string} name
	     */
	  }, {
	    key: "removeAdditionalField",
	    value: function removeAdditionalField(name) {
	      var preset = this.getPreset(this.getCurrentPresetId());
	      if (BX.type.isArray(preset.ADDITIONAL)) {
	        preset.ADDITIONAL = preset.ADDITIONAL.filter(function (field) {
	          return field.NAME !== name;
	        });
	      }
	    }
	    /**
	     * Updates preset fields list
	     * @param {object} preset
	     * @param {boolean} [noValues = false]
	     */
	  }, {
	    key: "updatePresetFields",
	    value: function updatePresetFields(preset, noValues) {
	      var _this3 = this;
	      var fields;
	      var fieldListContainer;
	      var fieldNodes = [];
	      if (BX.type.isPlainObject(preset) && 'FIELDS' in preset) {
	        fields = preset.FIELDS;
	        if (BX.type.isArray(preset.ADDITIONAL)) {
	          preset.ADDITIONAL.filter(function (field) {
	            return _this3.parent.params.FIELDS.some(function (currentField) {
	              return field.NAME === currentField.NAME;
	            });
	          }).forEach(function (field) {
	            var replaced = false;
	            field.IS_PRESET_FIELD = true;
	            fields.forEach(function (presetField, index) {
	              if (field.NAME === presetField.NAME) {
	                fields[index] = field;
	                replaced = true;
	              }
	            });
	            if (!replaced) {
	              fields.push(field);
	            }
	          });
	        }
	        (fields || []).filter(function (field) {
	          return _this3.parent.params.FIELDS.some(function (currentField) {
	            return field.NAME === currentField.NAME;
	          });
	        }).forEach(function (fieldData, index) {
	          fieldData.TABINDEX = index + 1;
	          if (noValues) {
	            switch (fieldData.TYPE) {
	              case this.parent.types.SELECT:
	                {
	                  fieldData.VALUE = fieldData.ITEMS[0];
	                  break;
	                }
	              case this.parent.types.MULTI_SELECT:
	                {
	                  fieldData.VALUE = [];
	                  break;
	                }
	              case this.parent.types.DATE:
	                {
	                  fieldData.SUB_TYPE = fieldData.SUB_TYPES[0];
	                  fieldData.VALUES = {
	                    _from: '',
	                    _to: '',
	                    _days: ''
	                  };
	                  break;
	                }
	              case this.parent.types.CUSTOM_DATE:
	                {
	                  fieldData.VALUE = {
	                    days: [],
	                    months: [],
	                    years: []
	                  };
	                  break;
	                }
	              case this.parent.types.NUMBER:
	                {
	                  fieldData.SUB_TYPE = fieldData.SUB_TYPES[0];
	                  fieldData.VALUES = {
	                    _from: '',
	                    _to: ''
	                  };
	                  break;
	                }
	              case this.parent.types.CUSTOM_ENTITY:
	                {
	                  fieldData.VALUES = {
	                    _label: '',
	                    _value: ''
	                  };
	                  break;
	                }
	              case this.parent.types.CUSTOM:
	                {
	                  fieldData._VALUE = '';
	                  break;
	                }
	              default:
	                {
	                  if ('VALUE' in fieldData) {
	                    if (BX.type.isArray(fieldData.VALUE)) {
	                      fieldData.VALUE = [];
	                    } else {
	                      fieldData.VALUE = '';
	                    }
	                  }
	                  break;
	                }
	            }
	          }
	          fieldNodes.push(this.createControl(fieldData));
	        }, this);
	        this.parent.disableFieldsDragAndDrop();
	        fieldListContainer = this.parent.getFieldListContainer();
	        BX.cleanNode(fieldListContainer);
	        if (fieldNodes.length) {
	          fieldNodes.forEach(function (current, index) {
	            if (BX.type.isDomNode(current)) {
	              if (preset.ID !== 'tmp_filter' && preset.ID !== 'default_filter' && !('IS_PRESET_FIELD' in fields[index]) && !this.isEmptyField(fields[index])) {
	                BX.addClass(current, this.parent.settings.classPresetField);
	              }
	              BX.append(current, fieldListContainer);
	              if (BX.type.isString(fields[index].HTML)) {
	                var wrap = BX.create('div');
	                this.parent.getHiddenElement().appendChild(wrap);
	                BX.html(wrap, fields[index].HTML);
	              }
	            }
	          }, this);
	          this.parent.enableFieldsDragAndDrop();
	        }
	      }
	    }
	    /**
	     * Shows current preset fields
	     */
	  }, {
	    key: "showCurrentPresetFields",
	    value: function showCurrentPresetFields() {
	      var preset = this.getCurrentPresetData();
	      this.updatePresetFields(preset);
	    }
	    /**
	     * Gets current preset element
	     * @return {?HTMLElement}
	     */
	  }, {
	    key: "getCurrentPreset",
	    value: function getCurrentPreset() {
	      return BX.Filter.Utils.getByClass(this.getContainer(), this.parent.settings.classPresetCurrent);
	    }
	    /**
	     * Gets current preset id
	     * @return {*}
	     */
	  }, {
	    key: "getCurrentPresetId",
	    value: function getCurrentPresetId() {
	      var current = this.getCurrentPreset();
	      var currentId = null;
	      if (BX.type.isDomNode(current)) {
	        currentId = this.getPresetId(current);
	      } else {
	        currentId = 'tmp_filter';
	      }
	      return currentId;
	    }
	    /**
	     * Gets current preset data
	     * @return {?object}
	     */
	  }, {
	    key: "getCurrentPresetData",
	    value: function getCurrentPresetData() {
	      var currentId = this.getCurrentPresetId();
	      var currentData = null;
	      if (BX.type.isNotEmptyString(currentId)) {
	        currentData = this.getPreset(currentId);
	        currentData = this.extendPreset(currentData);
	      }
	      return currentData;
	    }
	    /**
	     * Gets presets container element
	     * @return {?HTMLElement}
	     */
	  }, {
	    key: "getContainer",
	    value: function getContainer() {
	      return BX.Filter.Utils.getByClass(this.parent.getFilter(), this.parent.settings.classPresetsContainer);
	    }
	    /**
	     * Gets preset nodes
	     * @return {?HTMLElement[]}
	     */
	  }, {
	    key: "getPresets",
	    value: function getPresets() {
	      return BX.Filter.Utils.getByClass(this.getContainer(), this.parent.settings.classPreset, true);
	    }
	    /**
	     * Gets default presets elements
	     * @return {?HTMLElement[]}
	     */
	  }, {
	    key: "getDefaultPresets",
	    value: function getDefaultPresets() {
	      return BX.Filter.Utils.getByClass(this.getContainer(), this.parent.settings.classDefaultFilter, true);
	    }
	    /**
	     * Gets default preset element
	     * @return {?HTMLElement}
	     */
	  }, {
	    key: "getPinnedPresetNode",
	    value: function getPinnedPresetNode() {
	      return BX.Filter.Utils.getByClass(this.getContainer(), this.parent.settings.classPinnedPreset);
	    }
	    /**
	     * Checks preset is pinned (default)
	     * @param presetId
	     * @return {boolean}
	     */
	  }, {
	    key: "isPinned",
	    value: function isPinned(presetId) {
	      return this.getPinnedPresetId() === presetId;
	    }
	    /**
	     * Gets pinned (default) preset id
	     * @return {string}
	     */
	  }, {
	    key: "getPinnedPresetId",
	    value: function getPinnedPresetId() {
	      var node = this.getPinnedPresetNode();
	      var id = 'default_filter';
	      if (node) {
	        var dataId = BX.data(node, 'id');
	        id = dataId || id;
	      }
	      return id;
	    }
	  }]);
	  return Presets;
	}();

	var _templateObject$1, _templateObject2$1, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8;
	function _regeneratorRuntime() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == babelHelpers["typeof"](value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
	function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
	function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$2(Object(source), !0).forEach(function (key) { babelHelpers.defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
	(function () {

	  BX.namespace('BX.Main');

	  /**
	   * General filter class
	   * @param {object} params Component params
	   * @param {object} options Extends BX.Filter.Settings
	   * @param {object} types Field types from Bitrix\Main\UI\Filter\Type
	   * @param types.STRING
	   * @param types.SELECT
	   * @param types.DATE
	   * @param types.CUSTOM_DATE
	   * @param types.MULTI_SELECT
	   * @param types.NUMBER
	   * @param types.DEST_SELECTOR
	   * @param types.ENTITY_SELECTOR
	   * @param types.CUSTOM_ENTITY
	   * @param types.CHECKBOX
	   * @param types.CUSTOM
	   * @param types.ENTITY
	   * @param {object} dateTypes Date field types from Bitrix\Main\UI\Filter\DateType
	   * @param dateTypes.NONE
	   * @param dateTypes.YESTERDAY
	   * @param dateTypes.CURRENT_DAY
	   * @param dateTypes.CURRENT_WEEK
	   * @param dateTypes.CURRENT_MONTH
	   * @param dateTypes.CURRENT_QUARTER
	   * @param dateTypes.LAST_7_DAYS
	   * @param dateTypes.LAST_30_DAYS
	   * @param dateTypes.LAST_60_DAYS
	   * @param dateTypes.LAST_90_DAYS
	   * @param dateTypes.MONTH
	   * @param dateTypes.QUARTER
	   * @param dateTypes.YEAR
	   * @param dateTypes.EXACT
	   * @param dateTypes.LAST_WEEK
	   * @param dateTypes.LAST_MONTH
	   * @param dateTypes.RANGE
	   * @param dateTypes.NEXT_DAYS
	   * @param dateTypes.PREV_DAYS
	   * @param dateTypes.TOMORROW
	   * @param dateTypes.NEXT_MONTH
	   * @param dateTypes.NEXT_WEEK
	   * @param {object} numberTypes Number field types from Bitrix\Main\UI\Filter\NumberType
	   * @memberOf {BX.Main}
	   */
	  BX.Main.Filter = function (params, options, types, dateTypes, numberTypes, additionalDateTypes, additionalNumberTypes) {
	    this.params = params;
	    this.search = null;
	    this.popup = null;
	    this.checkboxListPopup = null;
	    this.presets = null;
	    this.fields = null;
	    this.types = types;
	    this.dateTypes = dateTypes;
	    this.additionalDateTypes = additionalDateTypes;
	    this.additionalNumberTypes = additionalNumberTypes;
	    this.numberTypes = numberTypes;
	    this.settings = new BX.Filter.Settings(options, this);
	    this.filter = null;
	    this.api = null;
	    this.isAddPresetModeState = false;
	    this.firstInit = true;
	    this.analyticsLabel = null;
	    this.emitter = new BX.Event.EventEmitter();
	    this.emitter.setEventNamespace('BX.Filter.Field');
	    this.emitter.subscribe = function (eventName, listener) {
	      BX.Event.EventEmitter.subscribe(this.emitter, eventName.replace('BX.Filter.Field:', ''), listener);
	    }.bind(this);
	    this.enableFieldsSearch = null;
	    this.enableHeadersSections = null;
	    this.init();
	  };

	  /**
	   * Converts string to camel case
	   * @param {string} string
	   * @return {*}
	   */
	  function toCamelCase(string) {
	    if (BX.type.isString(string)) {
	      string = string.toLowerCase();
	      string = string.replace(/[\-_\s]+(.)?/g, function (match, chr) {
	        return chr ? chr.toUpperCase() : '';
	      });
	      return string.substr(0, 1).toLowerCase() + string.substr(1);
	    }
	    return string;
	  }

	  //noinspection JSUnusedGlobalSymbols
	  BX.Main.Filter.prototype = {
	    init: function init() {
	      BX.bind(document, 'mousedown', BX.delegate(this._onDocumentClick, this));
	      BX.bind(document, 'keydown', BX.delegate(this._onDocumentKeydown, this));
	      BX.bind(window, 'load', BX.delegate(this.onWindowLoad, this));
	      BX.addCustomEvent('Grid::ready', BX.delegate(this._onGridReady, this));
	      this.getSearch().updatePreset(this.getParam('CURRENT_PRESET'));
	      this.enableFieldsSearch = this.getParam('ENABLE_FIELDS_SEARCH', false);
	      this.enableHeadersSections = this.getParam('HEADERS_SECTIONS', false);
	      if (this.isAppliedDefaultPreset()) {
	        this.setDefaultPresetAppliedState(true);
	      }
	    },
	    getEmitter: function getEmitter() {
	      return this.emitter;
	    },
	    onWindowLoad: function onWindowLoad() {
	      this.settings.get('AUTOFOCUS') && this.adjustFocus();
	    },
	    /**
	     * Removes apply_filter param from url
	     */
	    clearGet: function clearGet() {
	      if ('history' in window) {
	        var url = window.location.toString();
	        var clearUrl = BX.util.remove_url_param(url, 'apply_filter');
	        window.history.replaceState(null, '', clearUrl);
	      }
	    },
	    /**
	     * Adjusts focus on search field
	     */
	    adjustFocus: function adjustFocus() {
	      this.getSearch().adjustFocus();
	    },
	    _onAddPresetKeydown: function _onAddPresetKeydown(event) {
	      if (BX.Filter.Utils.isKey(event, 'enter')) {
	        this._onSaveButtonClick();
	      }
	    },
	    _onDocumentKeydown: function _onDocumentKeydown(event) {
	      if (BX.Filter.Utils.isKey(event, 'escape')) {
	        if (this.getPopup().isShown()) {
	          BX.onCustomEvent(window, 'BX.Main.Filter:blur', [this]);
	          this.closePopup();
	          if (this.getParam('VALUE_REQUIRED_MODE')) {
	            this.restoreRemovedPreset();
	          }
	          if (this.getParam('VALUE_REQUIRED')) {
	            if (!this.getSearch().getSquares().length) {
	              this.getPreset().applyPinnedPreset();
	            }
	          }
	        }
	      }
	    },
	    /**
	     * Gets BX.Filter.Api instance
	     * @return {BX.Filter.Api}
	     */
	    getApi: function getApi() {
	      if (!(this.api instanceof BX.Filter.Api)) {
	        this.api = new BX.Filter.Api(this);
	      }
	      return this.api;
	    },
	    /**
	     * Adds sidebar item
	     * @param {string} id
	     * @param {string} name
	     * @param {boolean} [pinned = false]
	     */
	    addSidebarItem: function addSidebarItem(id, name, pinned) {
	      var Presets$$1 = this.getPreset();
	      var presetsContainer = Presets$$1.getContainer();
	      var sidebarItem = Presets$$1.createSidebarItem(id, name, pinned);
	      var preset = Presets$$1.getPresetNodeById(id);
	      if (BX.type.isDomNode(preset)) {
	        BX.remove(preset);
	        presetsContainer.insertBefore(sidebarItem, Presets$$1.getAddPresetField());
	      } else {
	        presetsContainer && presetsContainer.insertBefore(sidebarItem, Presets$$1.getAddPresetField());
	      }
	      BX.bind(sidebarItem, 'click', BX.delegate(Presets$$1._onPresetClick, Presets$$1));
	    },
	    /**
	     * Saves user settings
	     * @param {boolean} [forAll = false]
	     */
	    saveUserSettings: function saveUserSettings(forAll) {
	      var optionsParams = {
	        'FILTER_ID': this.getParam('FILTER_ID'),
	        'GRID_ID': this.getParam('GRID_ID'),
	        'action': 'SET_FILTER_ARRAY'
	      };
	      var Presets$$1 = this.getPreset();
	      var currentPresetId = Presets$$1.getCurrentPresetId();
	      var presetsSettings = {};
	      this.params['PRESETS'] = BX.clone(this.editablePresets);
	      presetsSettings.current_preset = currentPresetId;
	      Presets$$1.getPresets().forEach(function (current, index) {
	        var presetId = Presets$$1.getPresetId(current);
	        if (presetId && presetId !== 'tmp_filter') {
	          var presetData = Presets$$1.getPreset(presetId);
	          presetData.TITLE = BX.util.htmlspecialchars(BX.util.htmlspecialcharsback(presetData.TITLE));
	          presetData.SORT = index;
	          Presets$$1.updatePresetName(current, presetData.TITLE);
	          presetsSettings[presetId] = {
	            sort: index,
	            name: presetData.TITLE,
	            fields: this.preparePresetSettingsFields(presetData.FIELDS),
	            rows: presetData.FIELDS.map(function (field) {
	              return field.NAME;
	            }),
	            for_all: forAll && !BX.type.isBoolean(presetData.FOR_ALL) || forAll && presetData.FOR_ALL === true
	          };
	        }
	      }, this);
	      this.saveOptions(presetsSettings, optionsParams, null, forAll);
	    },
	    /**
	     * Checks is for all
	     * @return {boolean}
	     */
	    isForAll: function isForAll(forAll) {
	      var checkbox = this.getForAllCheckbox();
	      return BX.type.isBoolean(forAll) && forAll || !!checkbox && !!checkbox.checked;
	    },
	    /**
	     * Gets for all checkbox
	     * @return {?HTMLElement}
	     */
	    getForAllCheckbox: function getForAllCheckbox() {
	      if (!this.forAllCheckbox) {
	        this.forAllCheckbox = BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classForAllCheckbox);
	      }
	      return this.forAllCheckbox;
	    },
	    /**
	     * Prepares preset settings fields
	     * @param fields
	     * @return {?object}
	     */
	    preparePresetSettingsFields: function preparePresetSettingsFields(fields) {
	      var result = {};
	      var valuesKeys;
	      (fields || []).forEach(function (current) {
	        switch (current.TYPE) {
	          case this.types.STRING:
	            {
	              result[current.NAME] = current.VALUE;
	              break;
	            }
	          case this.types.TEXTAREA:
	            {
	              result[current.NAME] = current.VALUE;
	              break;
	            }
	          case this.types.SELECT:
	            {
	              result[current.NAME] = 'VALUE' in current.VALUE ? current.VALUE.VALUE : '';
	              break;
	            }
	          case this.types.MULTI_SELECT:
	            {
	              if (BX.type.isArray(current.VALUE) && current.VALUE.length) {
	                current.VALUE.forEach(function (curr, index) {
	                  result[current.NAME] = BX.type.isPlainObject(result[current.NAME]) ? result[current.NAME] : {};
	                  result[current.NAME][index] = curr.VALUE;
	                }, this);
	              }
	              break;
	            }
	          case this.types.CHECKBOX:
	            {
	              if (BX.type.isArray(current.VALUE) && current.VALUE.length) {
	                current.VALUE.forEach(function (curr, index) {
	                  result[current.NAME] = BX.type.isPlainObject(result[current.NAME]) ? result[current.NAME] : {};
	                  result[current.NAME][index] = curr.VALUE;
	                }, this);
	              }
	              break;
	            }
	          case this.types.DATE:
	            {
	              if (BX.type.isPlainObject(current.VALUES)) {
	                valuesKeys = Object.keys(current.VALUES);
	                result[current.NAME + '_datesel'] = current.SUB_TYPE.VALUE;
	                valuesKeys.forEach(function (curr) {
	                  result[current.NAME + curr] = current.VALUES[curr];
	                }, this);
	              }
	              break;
	            }
	          case this.types.NUMBER:
	            {
	              if (BX.type.isPlainObject(current.VALUES)) {
	                valuesKeys = Object.keys(current.VALUES);
	                result[current.NAME + '_numsel'] = current.SUB_TYPE.VALUE;
	                valuesKeys.forEach(function (curr) {
	                  result[current.NAME + curr] = current.VALUES[curr];
	                }, this);
	              }
	              break;
	            }
	          case this.types.DEST_SELECTOR:
	            {
	              if (BX.type.isPlainObject(current.VALUES)) {
	                result[current.NAME] = current.VALUES._value;
	                result[current.NAME + '_label'] = current.VALUES._label;
	              }
	              break;
	            }
	          case this.types.DEST_SELECTOR:
	          case this.types.ENTITY_SELECTOR:
	          case this.types.CUSTOM_ENTITY:
	            {
	              if (BX.type.isPlainObject(current.VALUES)) {
	                result[current.NAME] = current.VALUES._value;
	                result[current.NAME + '_label'] = current.VALUES._label;
	              }
	              break;
	            }
	          default:
	            {
	              break;
	            }
	        }
	      }, this);
	      return result;
	    },
	    /**
	     * Saves preset
	     */
	    savePreset: function savePreset() {
	      var presetId = 'filter_' + +new Date();
	      var presetName = BX.util.htmlspecialcharsback(this.getPreset().getAddPresetFieldInput().value);
	      this.updatePreset(presetId, presetName, null, true, null, null, true);
	      this.addSidebarItem(presetId, presetName);
	      this.getPreset().applyPreset(presetId);
	      this.getPreset().activatePreset(presetId);
	      this.applyFilter();
	    },
	    /**
	     * Updates preset
	     * @param {string} presetId
	     * @param {?string} [presetName]
	     * @param {?boolean} [reset]
	     * @param {?boolean} [sort]
	     * @param {?function} [beforeLoad]
	     * @param {?function} [afterLoad]
	     * @param {boolean} [isNew]
	     * @return {BX.Promise}
	     */
	    updatePreset: function updatePreset(presetId, presetName, reset, sort, beforeLoad, afterLoad, isNew) {
	      var fields = this.getFilterFieldsValues();
	      var sourceFields = this.getPreset().getFields().map(function (curr) {
	        return BX.data(curr, 'name');
	      });
	      var preset = this.getPreset().getCurrentPresetData();
	      var params = {
	        'FILTER_ID': this.getParam('FILTER_ID'),
	        'GRID_ID': this.getParam('GRID_ID'),
	        'action': 'SET_FILTER'
	      };
	      var rows, value, tmpPresetNode, tmpPresetInput, presets;
	      var data = {};
	      data.additional = {};
	      if (presetId !== 'tmp_filter' && presetId !== 'default_filter' && !isNew) {
	        var additional = BX.type.isArray(preset.ADDITIONAL) ? preset.ADDITIONAL : [];
	        additional.forEach(function (field) {
	          Object.keys(fields).forEach(function (key) {
	            if (key.indexOf(field.NAME) !== -1) {
	              data.additional[key] = fields[key];
	              delete fields[key];
	            }
	          });
	        });
	      }
	      rows = Object.keys(fields);
	      if (!reset) {
	        data.apply_filter = 'Y';
	      } else {
	        data.clear_filter = 'Y';
	      }
	      data.save = 'Y';
	      data.fields = fields;
	      data.rows = sourceFields.join(',');
	      data.preset_id = presetId || preset.ID;
	      if (BX.type.isNotEmptyString(presetName)) {
	        data.name = BX.util.htmlspecialchars(presetName);
	      } else {
	        tmpPresetNode = this.getPreset().getPresetNodeById(data.preset_id);
	        tmpPresetInput = this.getPreset().getPresetInput(tmpPresetNode);
	        if (BX.type.isDomNode(tmpPresetInput) && BX.type.isNotEmptyString(tmpPresetInput.value)) {
	          data.name = tmpPresetInput.value;
	        } else {
	          data.name = preset.TITLE;
	        }
	      }
	      if ((!('sort' in data) || !BX.type.isNumber(data.sort)) && sort) {
	        presets = this.getParam('PRESETS');
	        data.sort = presets.length + 2;
	      }
	      if (!reset) {
	        rows.forEach(function (key) {
	          if (BX.type.isArray(data.fields[key])) {
	            value = data.fields[key].length ? {} : '';
	            data.fields[key].forEach(function (val, index) {
	              value[index] = val;
	            }, this);
	            if (value || BX.type.isNumber(value) || BX.type.isBoolean(value)) {
	              data.fields[key] = value;
	            }
	          }
	        }, this);
	      }
	      if (data.preset_id === 'tmp_filter' || this.isAddPresetEnabled() || reset) {
	        this.updateParams(data);
	      }
	      if (BX.type.isFunction(beforeLoad)) {
	        beforeLoad();
	      }
	      var promise = new BX.Promise(null, this);
	      promise.setAutoResolve('fulfill', 0);
	      promise.then(function () {
	        var afterPromise = new BX.Promise(null, this);
	        this.saveOptions(data, params, BX.proxy(afterPromise.fulfill, afterPromise));
	        return afterPromise;
	      }).then(function () {
	        !!afterLoad && afterLoad();
	      });
	      return promise;
	    },
	    /**
	     * Saves fields sort
	     */
	    saveFieldsSort: function saveFieldsSort() {
	      var params = {
	        'FILTER_ID': this.getParam('FILTER_ID'),
	        'GRID_ID': this.getParam('GRID_ID'),
	        'action': 'SET_FILTER'
	      };
	      var fields = this.getPreset().getFields();
	      var data = {};
	      data.preset_id = 'default_filter';
	      if (BX.type.isArray(fields)) {
	        data.rows = fields.map(function (current) {
	          return BX.data(current, 'name');
	        });
	        data.rows = data.rows.join(',');
	      }
	      this.updateParams(data);
	      this.saveOptions(data, params);
	    },
	    /**
	     * Updates params
	     * @param {object} data
	     */
	    updateParams: function updateParams(data) {
	      var preset, presets;
	      if (BX.type.isPlainObject(data) && 'preset_id' in data) {
	        preset = this.getPreset().getPreset(data.preset_id);
	        if (BX.type.isPlainObject(preset)) {
	          if ('name' in data && BX.type.isNotEmptyString(data.name)) {
	            preset.TITLE = data.name;
	          }
	          if ('rows' in data && !('fields' in data)) {
	            data.fields = {};
	            data.rows.split(',').forEach(function (curr) {
	              data.fields[curr] = '';
	            });
	          }
	          if ('fields' in data) {
	            preset.FIELDS = this.preparePresetFields(data.fields, data.rows);
	          }
	          if ('additional' in data && preset.ID !== 'tmp_filter') {
	            preset.ADDITIONAL = this.preparePresetFields(data.additional, data.rows);
	          }
	        } else {
	          presets = this.getParam('PRESETS');
	          preset = {
	            ID: data.preset_id,
	            TITLE: data.name,
	            SORT: presets.length + 2,
	            FIELDS: this.preparePresetFields(data.fields, data.rows)
	          };
	          presets.push(preset);
	        }
	      }
	    },
	    /**
	     * Prepares preset fields
	     * @param {object[]} dataFields
	     * @param rows
	     * @return {object[]}
	     */
	    preparePresetFields: function preparePresetFields(dataFields, rows) {
	      var fieldKeys, field;
	      var fields = [];
	      if (BX.type.isPlainObject(dataFields)) {
	        rows = BX.type.isNotEmptyString(rows) ? rows.split(',') : [];
	        fieldKeys = rows.length ? rows : Object.keys(dataFields);
	        fieldKeys.forEach(function (current) {
	          current = current.replace('_datesel', '').replace('_numsel', '').replace('_' + BX.Filter.AdditionalFilter.Type.IS_EMPTY, '').replace('_' + BX.Filter.AdditionalFilter.Type.HAS_ANY_VALUE, '');
	          field = BX.clone(this.getFieldByName(current));
	          if (BX.type.isPlainObject(field)) {
	            field.ADDITIONAL_FILTER = BX.Filter.AdditionalFilter.fetchAdditionalFilter(current, dataFields);
	            if (!BX.Type.isStringFilled(field.ADDITIONAL_FILTER)) {
	              if (field.TYPE === this.types.STRING) {
	                field.VALUE = dataFields[current];
	              }
	              if (field.TYPE === this.types.TEXTAREA) {
	                field.VALUE = dataFields[current];
	              }
	              if (field.TYPE === this.types.MULTI_SELECT) {
	                field.VALUE = this.prepareMultiSelectValue(dataFields[current], field.ITEMS);
	              }
	              if (field.TYPE === this.types.SELECT || field.TYPE === this.types.CHECKBOX) {
	                field.VALUE = this.prepareSelectValue(dataFields[current], field.ITEMS);
	              }
	              if (field.TYPE === this.types.DATE) {
	                field.SUB_TYPE = this.prepareSelectValue(dataFields[current + '_datesel'], field.SUB_TYPES);
	                field.VALUES = {
	                  '_from': dataFields[current + '_from'],
	                  '_to': dataFields[current + '_to'],
	                  '_days': dataFields[current + '_days'],
	                  '_month': dataFields[current + '_month'],
	                  '_quarter': dataFields[current + '_quarter'],
	                  '_year': dataFields[current + '_year'],
	                  '_allow_year': dataFields[current + '_allow_year']
	                };
	              }
	              if (field.TYPE === this.types.CUSTOM_DATE) {
	                field.VALUE = {
	                  'days': Object.keys(dataFields[current + '_days'] || {}).map(function (index) {
	                    return dataFields[current + '_days'][index];
	                  }),
	                  'months': Object.keys(dataFields[current + '_months'] || {}).map(function (index) {
	                    return dataFields[current + '_months'][index];
	                  }),
	                  'years': Object.keys(dataFields[current + '_years'] || {}).map(function (index) {
	                    return dataFields[current + '_years'][index];
	                  })
	                };
	              }
	              if (field.TYPE === this.types.NUMBER) {
	                field.SUB_TYPE = this.prepareSelectValue(dataFields[current + '_numsel'], field.SUB_TYPES);
	                field.VALUES = {
	                  '_from': dataFields[current + '_from'],
	                  '_to': dataFields[current + '_to']
	                };
	              }
	              if (field.TYPE === this.types.DEST_SELECTOR || field.TYPE === this.types.ENTITY_SELECTOR || field.TYPE === this.types.CUSTOM_ENTITY) {
	                if (typeof dataFields[current + '_label'] !== 'undefined') {
	                  field.VALUES._label = dataFields[current + '_label'];
	                }
	                if (typeof dataFields[current] !== 'undefined') {
	                  field.VALUES._value = dataFields[current];
	                }
	              }
	              if (field.TYPE === this.types.CUSTOM) {
	                field._VALUE = dataFields[current];
	              }
	            }
	            fields.push(field);
	          }
	        }, this);
	      }
	      return fields;
	    },
	    /**
	     * Prepares select values
	     * @param value
	     * @param items
	     * @return {object}
	     */
	    prepareSelectValue: function prepareSelectValue(value, items) {
	      var result = {};
	      var tmpResult;
	      if (BX.type.isNotEmptyString(value) && BX.type.isArray(items)) {
	        tmpResult = this.prepareMultiSelectValue({
	          0: value
	        }, items);
	        result = tmpResult.length > 0 ? tmpResult[0] : {};
	      } else {
	        result = items[0];
	      }
	      return result;
	    },
	    /**
	     * Prepares multiselect value
	     * @param values
	     * @param items
	     * @return {Array}
	     */
	    prepareMultiSelectValue: function prepareMultiSelectValue(values, items) {
	      var result = [];
	      if (BX.type.isPlainObject(values) && BX.type.isArray(items)) {
	        var valuesKeys = Object.keys(values);
	        var valuesValues = valuesKeys.map(function (curr) {
	          return values[curr];
	        });
	        result = items.filter(function (current) {
	          return valuesValues.some(function (val) {
	            return val === current.VALUE;
	          });
	        }, this);
	      }
	      return result;
	    },
	    /**
	     * Get field by name
	     * @param {string} name
	     * @return {?object}
	     */
	    getFieldByName: function getFieldByName(name) {
	      var fields = this.getParam('FIELDS');
	      var field = fields.find(function (current) {
	        return current.NAME === name;
	      });
	      if (field) {
	        return field;
	      }
	      var node = this.getFieldListContainer().querySelector('[data-name="' + name + '"]');
	      field = BX.Filter.Field.instances.get(node);
	      if (field) {
	        return field.options;
	      }
	      return null;
	    },
	    /**
	     * @private
	     * @return {Promise}
	     */
	    confirmSaveForAll: function confirmSaveForAll() {
	      return new Promise(function (resolve) {
	        var action = {
	          CONFIRM: true,
	          CONFIRM_MESSAGE: this.getParam('MAIN_UI_FILTER__CONFIRM_MESSAGE_FOR_ALL'),
	          CONFIRM_APPLY_BUTTON: this.getParam('MAIN_UI_FILTER__CONFIRM_APPLY_FOR_ALL'),
	          CONFIRM_CANCEL_BUTTON: this.getParam('CONFIRM_CANCEL')
	        };
	        this.confirmDialog(action, resolve);
	      }.bind(this));
	    },
	    /**
	     * Save options
	     * @param {object} data
	     * @param {object} [params]
	     * @param {function} [callback]
	     * @param {boolean} [forAll = false]
	     */
	    saveOptions: function saveOptions(data, params, callback, forAll) {
	      params.action = toCamelCase(params.action);
	      params.forAll = this.isForAll(forAll);
	      params.commonPresetsId = this.getParam('COMMON_PRESETS_ID');
	      params.apply_filter = data.apply_filter || "N";
	      params.clear_filter = data.clear_filter || "N";
	      params.with_preset = data.with_preset || "N";
	      params.save = data.save || "N";
	      params.isSetOutside = this.isSetOutside();
	      var requestData = {
	        params: params,
	        data: data
	      };
	      delete data.apply_filter;
	      delete data.save;
	      delete data.clear_filter;
	      delete data.with_preset;
	      if (params.forAll && params.action === 'setFilterArray') {
	        return this.confirmSaveForAll().then(function () {
	          return this.backend(params.action, requestData);
	        }.bind(this)).then(function () {
	          this.disableEdit();
	          this.disableAddPreset();
	        }.bind(this));
	      }
	      return this.backend(params.action, requestData).then(function () {
	        BX.removeClass(this.getFindButton(), this.settings.classWaitButtonClass);
	        BX.type.isFunction(callback) && callback();
	      }.bind(this));
	    },
	    /**
	     *
	     * @param {string} action
	     * @param data
	     */
	    backend: function backend(action, data) {
	      var analyticsLabel = this.analyticsLabel || {};
	      this.analyticsLabel = {};
	      return BX.ajax.runComponentAction('bitrix:main.ui.filter', action, {
	        mode: 'ajax',
	        data: data,
	        analyticsLabel: _objectSpread$2({
	          FILTER_ID: this.getParam('FILTER_ID'),
	          GRID_ID: this.getParam('GRID_ID'),
	          PRESET_ID: data['data']['preset_id'],
	          FIND: data['data'].hasOwnProperty('fields') && data['data']['fields'].hasOwnProperty('FIND') && !!data['data']['fields']['FIND'] ? "Y" : "N",
	          ROWS: BX.Type.isObject(data['data']['additional']) && Object.keys(data['data']['additional']).length == 0 ? "N" : "Y"
	        }, analyticsLabel)
	      });
	    },
	    /**
	     * Sends analytics when limit is enabled
	     */
	    limitAnalyticsSend: function limitAnalyticsSend() {
	      BX.ajax.runComponentAction('bitrix:main.ui.filter', 'limitAnalytics', {
	        mode: 'ajax',
	        data: {},
	        analyticsLabel: {
	          FILTER_ID: this.getParam('FILTER_ID'),
	          LIMIT: this.getParam('FILTER_ID')
	        }
	      });
	    },
	    /**
	     * Prepares event.path
	     * @param event
	     * @return {*}
	     */
	    prepareEvent: function prepareEvent(event) {
	      var i, x;
	      if (!('path' in event) || !event.path.length) {
	        event.path = [event.target];
	        i = 0;
	        while ((x = event.path[i++].parentNode) !== null) {
	          event.path.push(x);
	        }
	      }
	      return event;
	    },
	    /**
	     * Restores removed preset values
	     * VALUE_REQUIRED_MODE = true only
	     */
	    restoreRemovedPreset: function restoreRemovedPreset() {
	      if (this.getParam('VALUE_REQUIRED_MODE')) {
	        var currentPreset = this.getParam('CURRENT_PRESET');
	        if (BX.type.isPlainObject(currentPreset)) {
	          var currentPresetId = currentPreset.ID;
	          var presetNode = this.getPreset().getPresetNodeById(currentPresetId);
	          this.getPreset().applyPreset(currentPresetId);
	          this.getPreset().activatePreset(presetNode);
	        }
	      }
	    },
	    /**
	     * Checks that the event occurred on the scroll bar
	     * @param {MouseEvent} event
	     * @return {boolean}
	     */
	    hasScrollClick: function hasScrollClick(event) {
	      var x = 'clientX' in event ? event.clientX : 'x' in event ? event.x : 0;
	      return x >= document.documentElement.offsetWidth;
	    },
	    /**
	     * Checks whether to use common presets
	     * @return {boolean}
	     */
	    isUseCommonPresets: function isUseCommonPresets() {
	      return !!this.getParam('COMMON_PRESETS_ID');
	    },
	    /**
	     * Checks whether event is inside filter
	     * @param {MouseEvent} event
	     * @returns {boolean}
	     */
	    isInsideFilterEvent: function isInsideFilterEvent(event) {
	      event = this.prepareEvent(event);
	      return (event.path || []).some(function (current) {
	        return BX.type.isDomNode(current) && (BX.hasClass(current, this.settings.classFilterContainer) || BX.hasClass(current, this.settings.classSearchContainer) || BX.hasClass(current, this.settings.classDefaultPopup) || BX.hasClass(current, this.settings.classPopupOverlay) || BX.hasClass(current, this.settings.classSidePanelContainer));
	      }, this);
	    },
	    _onDocumentClick: function _onDocumentClick(event) {
	      var popup = this.getPopup();
	      if (!this.isInsideFilterEvent(event) && !this.hasScrollClick(event)) {
	        if (popup && popup.isShown()) {
	          this.closePopup();
	          if (this.getParam('VALUE_REQUIRED_MODE')) {
	            this.restoreRemovedPreset();
	          }
	          if (this.getParam('VALUE_REQUIRED')) {
	            if (!this.getSearch().getSquares().length) {
	              this.getPreset().applyPinnedPreset();
	            }
	          }
	        }
	        BX.onCustomEvent(window, 'BX.Main.Filter:blur', [this]);
	      }
	    },
	    _onAddFieldClick: function _onAddFieldClick(event) {
	      var _this = this;
	      event.stopPropagation();
	      event.preventDefault();
	      if (this.getParam('USE_CHECKBOX_LIST_FOR_SETTINGS_POPUP')) {
	        BX.Runtime.loadExtension('ui.dialogs.checkbox-list').then(function () {
	          if (BX.UI && BX.Type.isFunction(BX.UI.CheckboxList)) {
	            _this.showFieldsSettingsCheckboxList();
	            return;
	          }
	          _this.showFieldsSettingsPopup();
	        });
	        return;
	      }
	      this.showFieldsSettingsPopup();
	    },
	    showFieldsSettingsPopup: function showFieldsSettingsPopup() {
	      var popup = this.getFieldsPopup();
	      if (popup && !popup.isShown()) {
	        this.showFieldsPopup();
	        this.syncFields();
	        return;
	      }
	      this.closeFieldListPopup();
	    },
	    showFieldsSettingsCheckboxList: function showFieldsSettingsCheckboxList() {
	      var _this2 = this;
	      if (this.checkboxListPopup) {
	        this.checkboxListPopup.show();
	        this.syncCheckboxFields();
	        return;
	      }
	      this.getFieldsListPopupContent().then(function (content) {
	        var _this2$getPreparedChe = _this2.getPreparedCheckboxListData(content),
	          sections = _this2$getPreparedChe.sections,
	          categories = _this2$getPreparedChe.categories,
	          options = _this2$getPreparedChe.options;
	        var enableFieldsSearch = _this2.enableFieldsSearch,
	          enableHeadersSections = _this2.enableHeadersSections;
	        var context = {
	          parentType: 'filter'
	        };
	        _this2.checkboxListPopup = new BX.UI.CheckboxList({
	          popupOptions: {
	            width: _this2.settings.popupWidth
	          },
	          lang: {
	            title: main_core.Loc.getMessage('MAIN_UI_FILTER__FIELDS_SETTINGS_TITLE'),
	            placeholder: main_core.Loc.getMessage('MAIN_UI_FILTER__FIELD_SEARCH_PLACEHOLDER'),
	            emptyStateTitle: main_core.Loc.getMessage('MAIN_UI_FILTER__FIELD_EMPTY_STATE_TITLE'),
	            emptyStateDescription: main_core.Loc.getMessage('MAIN_UI_FILTER__FIELD_EMPTY_STATE_DESCRIPTION'),
	            allSectionsDisabledTitle: main_core.Loc.getMessage('MAIN_UI_FILTER__FIELD_ALL_SECTIONS_DISABLED')
	          },
	          sections: sections,
	          categories: categories,
	          options: options,
	          events: {
	            onApply: function onApply(event) {
	              return _this2.onCheckboxListApply(event.data.fields);
	            }
	          },
	          params: {
	            destroyPopupAfterClose: false,
	            useSearch: enableFieldsSearch,
	            useSectioning: enableHeadersSections
	          },
	          context: context
	        });
	        _this2.checkboxListPopup.show();
	      });
	    },
	    syncCheckboxFields: function syncCheckboxFields() {
	      var _this3 = this;
	      var fields = this.getPreset().getFields();
	      var checkedFields = this.checkboxListPopup.getSelectedOptions();
	      checkedFields.forEach(function (fieldName) {
	        if (!fields.some(function (field) {
	          return field.dataset.name === fieldName;
	        })) {
	          _this3.checkboxListPopup.handleOptionToggled(fieldName);
	        }
	      });
	    },
	    /**
	     * @param content
	     * @returns {{options: [], categories: [], sections: []}}
	     */
	    getPreparedCheckboxListData: function getPreparedCheckboxListData(content) {
	      var _preset$parent$getPar,
	        _preset$parent$getPar2,
	        _this4 = this;
	      var defaultHeaderSection = this.getDefaultHeaderSection();
	      var sectionIds = new Set();
	      var headerSections = this.getHeadersSections();
	      var sections = [];
	      var categories = [];
	      var options = [];
	      var preset = this.getPreset();
	      var checkedFields = preset.getFields();
	      var defaultPresetFields = (_preset$parent$getPar = (_preset$parent$getPar2 = preset.parent.getParam('CURRENT_PRESET')) === null || _preset$parent$getPar2 === void 0 ? void 0 : _preset$parent$getPar2.FIELDS) !== null && _preset$parent$getPar !== void 0 ? _preset$parent$getPar : [];
	      var restrictedFields = this.getParam('RESTRICTED_FIELDS', []);
	      content.forEach(function (item) {
	        var sectionId = item.sectionId.length ? item.sectionId : defaultHeaderSection === null || defaultHeaderSection === void 0 ? void 0 : defaultHeaderSection.id;
	        if (_this4.enableHeadersSections && !sectionIds.has(sectionId)) {
	          var title = headerSections[sectionId].name;
	          sectionIds.add(sectionId);
	          sections.push({
	            title: title,
	            key: sectionId,
	            value: true
	          });
	          categories.push({
	            title: title,
	            sectionKey: sectionId,
	            key: sectionId
	          });
	        }
	        var name = item.name;
	        options.push({
	          title: item.label,
	          value: checkedFields.some(function (field) {
	            return field.dataset.name === name;
	          }),
	          categoryKey: sectionId,
	          defaultValue: defaultPresetFields.some(function (defaultField) {
	            return defaultField.NAME === name;
	          }),
	          id: name,
	          locked: restrictedFields.includes(name)
	        });
	      });
	      return {
	        sections: sections,
	        categories: categories,
	        options: options
	      };
	    },
	    /**
	     * Synchronizes field list in popup and filter field list
	     * @param {?{cache: boolean}} [options]
	     */
	    syncFields: function syncFields(options) {
	      if (BX.type.isPlainObject(options)) {
	        if (options.cache === false) {
	          this.fieldsPopupItems = null;
	        }
	      }
	      var fields = this.getPreset().getFields();
	      var items = this.getFieldsPopupItems();
	      var currentId, isNeedCheck;
	      if (BX.type.isArray(items) && items.length) {
	        items.forEach(function (current) {
	          currentId = BX.data(current, 'name').replace('_datesel', '').replace('_numsel', '');
	          isNeedCheck = fields.some(function (field) {
	            return BX.data(field, 'name') === currentId;
	          });
	          if (isNeedCheck) {
	            BX.addClass(current, this.settings.classMenuItemChecked);
	          } else {
	            BX.removeClass(current, this.settings.classMenuItemChecked);
	          }
	        }, this);
	      }
	    },
	    /**
	     * Gets items of popup window with a list of available fields
	     * @return {?HTMLElement[]}
	     */
	    getFieldsPopupItems: function getFieldsPopupItems() {
	      if (!BX.type.isArray(this.fieldsPopupItems)) {
	        var popup = this.getFieldsPopup();
	        if ('contentContainer' in popup && BX.type.isDomNode(popup.contentContainer)) {
	          this.fieldsPopupItems = BX.Filter.Utils.getByClass(popup.contentContainer, this.settings.classMenuItem, true);
	        }
	        this.prepareAnimation();
	      }
	      return this.fieldsPopupItems;
	    },
	    /**
	     * Gets popup container class name by popup items count
	     * @param {int|string} itemsCount
	     * @return {string}
	     */
	    getFieldListContainerClassName: function getFieldListContainerClassName(itemsCount) {
	      var popupColumnsCount = parseInt(this.settings.get('popupColumnsCount', 0), 10);
	      if (popupColumnsCount > 0 && popupColumnsCount <= this.settings.maxPopupColumnCount) {
	        return this.settings.get('classPopupFieldList' + popupColumnsCount + 'Column');
	      }
	      var containerClass = this.settings.classPopupFieldList1Column;
	      if (itemsCount > 6 && itemsCount < 12) {
	        containerClass = this.settings.classPopupFieldList2Column;
	      }
	      if (itemsCount > 12) {
	        containerClass = this.settings.classPopupFieldList3Column;
	      }
	      return containerClass;
	    },
	    /**
	     * Prepares fields declarations
	     * @param {object[]} fields
	     * @return {object[]}
	     */
	    prepareFieldsDecl: function prepareFieldsDecl(fields) {
	      return (fields || []).map(function (item) {
	        return {
	          block: 'main-ui-filter-field-list-item',
	          label: 'LABEL' in item ? item.LABEL : '',
	          id: 'ID' in item ? item.ID : '',
	          name: 'NAME' in item ? item.NAME : '',
	          item: item,
	          sectionId: 'SECTION_ID' in item ? item.SECTION_ID : '',
	          onClick: BX.delegate(this._clickOnFieldListItem, this)
	        };
	      }, this);
	    },
	    /**
	     * Gets lazy load field list
	     * @return {BX.Promise}
	     */
	    getLazyLoadFields: function getLazyLoadFields() {
	      var listUrl = this.getParam('LAZY_LOAD')['GET_LIST'];
	      var p = new BX.Promise();
	      if (BX.Type.isPlainObject(listUrl)) {
	        var component = listUrl.component,
	          action = listUrl.action,
	          data = listUrl.data;
	        BX.ajax.runComponentAction(component, action, {
	          mode: 'ajax',
	          data: data
	        }).then(function (response) {
	          var _response$data$fields;
	          p.fulfill((_response$data$fields = response.data.fields) !== null && _response$data$fields !== void 0 ? _response$data$fields : []);
	        });
	      } else {
	        BX.ajax({
	          method: 'GET',
	          url: listUrl,
	          dataType: 'json',
	          onsuccess: function onsuccess(response) {
	            return p.fulfill(response);
	          }
	        });
	      }
	      return p;
	    },
	    /**
	     * Gets fields list popup content
	     * @return {BX.Promise}
	     */
	    getFieldsListPopupContent: function getFieldsListPopupContent() {
	      var p = new BX.Promise();
	      var fields = this.getParam('FIELDS');
	      var fieldsCount = BX.type.isArray(fields) ? fields.length : 0;
	      if (this.getParam('LAZY_LOAD')) {
	        var callback = function (response) {
	          p.fulfill(this.getPopupContent(this.settings.classPopupFieldList, this.getFieldListContainerClassName(response.length), this.prepareFieldsDecl(response)));
	        }.bind(this);
	        if (BX.type.isNotEmptyObject(this.getParam('LAZY_LOAD')['CONTROLLER'])) {
	          var sourceComponentName = this.getParam('LAZY_LOAD')['CONTROLLER']['componentName'];
	          var sourceComponentSignedParameters = this.getParam('LAZY_LOAD')['CONTROLLER']['signedParameters'];
	          BX.ajax.runAction(this.getParam('LAZY_LOAD')['CONTROLLER']['getList'], {
	            data: {
	              filterId: this.getParam('FILTER_ID'),
	              componentName: BX.type.isNotEmptyString(sourceComponentName) ? sourceComponentName : '',
	              signedParameters: BX.type.isNotEmptyString(sourceComponentSignedParameters) ? sourceComponentSignedParameters : ''
	            }
	          }).then(function (response) {
	            callback(response.data);
	          }.bind(this), function (response) {});
	        } else {
	          this.getLazyLoadFields().then(callback);
	        }
	        return p;
	      }
	      p.fulfill(this.getPopupContent(this.settings.classPopupFieldList, this.getFieldListContainerClassName(fieldsCount), this.prepareFieldsDecl(fields)));
	      return p;
	    },
	    getPopupContent: function getPopupContent(block, mix, content) {
	      if (this.getParam('USE_CHECKBOX_LIST_FOR_SETTINGS_POPUP') && BX.UI && BX.Type.isFunction(BX.UI.CheckboxList)) {
	        return content;
	      }
	      var wrapper = BX.Tag.render(_templateObject$1 || (_templateObject$1 = babelHelpers.taggedTemplateLiteral(["<div></div>"])));
	      if (!this.enableHeadersSections) {
	        var fieldsContent = BX.decl({
	          content: content,
	          block: block,
	          mix: mix
	        });
	        this.setPopupElementWidthFromSettings(fieldsContent);
	        wrapper.appendChild(fieldsContent);
	        if (this.enableFieldsSearch) {
	          this.preparePopupContentHeader(wrapper);
	        }
	        return wrapper;
	      }
	      var defaultHeaderSection = this.getDefaultHeaderSection();
	      var sections = {};
	      content.forEach(function (item) {
	        var sectionId = item.sectionId.length ? item.sectionId : defaultHeaderSection.id;
	        if (sections[sectionId] === undefined) {
	          sections[sectionId] = [];
	        }
	        sections[sectionId].push(item);
	      });
	      this.preparePopupContentHeader(wrapper);
	      this.preparePopupContentFields(wrapper, sections, block, mix);
	      return wrapper;
	    },
	    onCheckboxListApply: function onCheckboxListApply(selectedFields) {
	      var _this5 = this;
	      return babelHelpers.asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
	        var presetFields, oldFields, fieldsData, fieldsForAdd, fieldsForRemove, disableSaveFieldsSort;
	        return _regeneratorRuntime().wrap(function _callee$(_context) {
	          while (1) switch (_context.prev = _context.next) {
	            case 0:
	              presetFields = _this5.getPreset().getFields();
	              oldFields = [];
	              presetFields.forEach(function (field) {
	                oldFields.push(field.dataset.name);
	              });
	              if (!_this5.isFieldsChangePrevented(selectedFields, oldFields)) {
	                _context.next = 5;
	                break;
	              }
	              return _context.abrupt("return");
	            case 5:
	              _context.next = 7;
	              return _this5.fetchFields(selectedFields, oldFields);
	            case 7:
	              fieldsData = _context.sent;
	              if (main_core.Type.isArray(fieldsData)) {
	                _context.next = 11;
	                break;
	              }
	              if (main_core.Type.isPlainObject(fieldsData) && fieldsData !== null && fieldsData !== void 0 && fieldsData.ERROR) {
	                ui_notification.UI.Notification.Center.notify({
	                  content: fieldsData.ERROR
	                });
	              }
	              return _context.abrupt("return");
	            case 11:
	              fieldsData.forEach(function (field) {
	                return _this5.params.FIELDS.push(field);
	              });
	              fieldsForAdd = selectedFields.filter(function (field) {
	                return !oldFields.includes(field);
	              });
	              fieldsForRemove = oldFields.filter(function (field) {
	                return !selectedFields.includes(field);
	              });
	              disableSaveFieldsSort = true;
	              fieldsForAdd.forEach(function (fieldId) {
	                var field = fieldsData.find(function (item) {
	                  return item.NAME === fieldId;
	                });
	                if (field) {
	                  _this5.getPreset().addField(field, disableSaveFieldsSort);

	                  // // @todo check this
	                  if (main_core.Type.isString(field.HTML)) {
	                    var wrap = BX.create('div');
	                    _this5.getHiddenElement().appendChild(wrap);
	                    BX.html(wrap, field.HTML);
	                  }
	                }
	              });
	              fieldsForRemove.forEach(function (fieldId) {
	                var field = fieldsData.find(function (item) {
	                  return item.NAME === fieldId;
	                });
	                if (field) {
	                  _this5.getPreset().removeField(field, disableSaveFieldsSort);
	                }
	              });
	              _this5.saveFieldsSort();
	            case 18:
	            case "end":
	              return _context.stop();
	          }
	        }, _callee);
	      }))();
	    },
	    fetchFields: function fetchFields(fields, oldFields) {
	      var _this6 = this;
	      return babelHelpers.asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
	        var ids, controller, componentName, signedParameters, getFields;
	        return _regeneratorRuntime().wrap(function _callee2$(_context2) {
	          while (1) switch (_context2.prev = _context2.next) {
	            case 0:
	              if (_this6.getParam('LAZY_LOAD')) {
	                _context2.next = 2;
	                break;
	              }
	              return _context2.abrupt("return", _this6.getParam('FIELDS'));
	            case 2:
	              // @todo show loader ?
	              ids = babelHelpers.toConsumableArray(new Set([].concat(babelHelpers.toConsumableArray(fields), babelHelpers.toConsumableArray(oldFields))));
	              controller = _this6.getParam('LAZY_LOAD')['CONTROLLER'];
	              if (!controller) {
	                _context2.next = 7;
	                break;
	              }
	              componentName = controller.componentName, signedParameters = controller.signedParameters, getFields = controller.getFields;
	              return _context2.abrupt("return", new Promise(function (resolve) {
	                BX.ajax.runAction(getFields, {
	                  data: {
	                    filterId: _this6.getParam('FILTER_ID'),
	                    ids: ids,
	                    componentName: BX.type.isNotEmptyString(componentName) ? componentName : '',
	                    signedParameters: BX.type.isNotEmptyString(signedParameters) ? signedParameters : ''
	                  }
	                }).then(function (response) {
	                  return resolve(response.data);
	                });
	              }));
	            case 7:
	              return _context2.abrupt("return", _this6.getLazyLoadFieldsByIds(ids));
	            case 8:
	            case "end":
	              return _context2.stop();
	          }
	        }, _callee2);
	      }))();
	    },
	    getLazyLoadFieldsByIds: function getLazyLoadFieldsByIds(ids) {
	      var _this7 = this;
	      return babelHelpers.asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
	        var getFieldsUrl, url;
	        return _regeneratorRuntime().wrap(function _callee3$(_context3) {
	          while (1) switch (_context3.prev = _context3.next) {
	            case 0:
	              getFieldsUrl = _this7.getParam('LAZY_LOAD')['GET_FIELDS'];
	              url = BX.Uri.addParam(getFieldsUrl, {
	                ids: ids
	              });
	              return _context3.abrupt("return", new Promise(function (resolve) {
	                BX.ajax({
	                  method: 'get',
	                  url: url,
	                  dataType: 'json',
	                  onsuccess: function onsuccess(response) {
	                    return resolve(response);
	                  }
	                });
	              }));
	            case 3:
	            case "end":
	              return _context3.stop();
	          }
	        }, _callee3);
	      }))();
	    },
	    isFieldsChangePrevented: function isFieldsChangePrevented(fields, oldFields) {
	      var event = new BX.Event.BaseEvent({
	        data: {
	          fields: fields,
	          oldFields: oldFields
	        }
	      });
	      this.emitter.emit('onBeforeChangeFilterItems', event);
	      return event.isDefaultPrevented();
	    },
	    preparePopupContentHeader: function preparePopupContentHeader(wrapper) {
	      var headerWrapper = BX.Tag.render(_templateObject2$1 || (_templateObject2$1 = babelHelpers.taggedTemplateLiteral(["\n\t\t\t\t<div class=\"main-ui-filter-popup-search-header-wrapper\">\n\t\t\t\t\t<div class=\"ui-form-row-inline\"></div>\n\t\t\t\t</div>\n\t\t\t"])));
	      wrapper.prepend(headerWrapper);
	      this.preparePopupContentHeaderSections(headerWrapper);
	      this.preparePopupContentHeaderSearch(headerWrapper);
	    },
	    preparePopupContentHeaderSections: function preparePopupContentHeaderSections(headerWrapper) {
	      if (!this.enableHeadersSections) {
	        return;
	      }
	      var headerSectionsWrapper = BX.Tag.render(_templateObject3 || (_templateObject3 = babelHelpers.taggedTemplateLiteral(["\n\t\t\t\t<div class=\"ui-form-row\">\n\t\t\t\t\t<div class=\"ui-form-content main-ui-filter-popup-search-section-wrapper\"></div>\n\t\t\t\t</div>\n\t\t\t"])));
	      headerWrapper.firstElementChild.appendChild(headerSectionsWrapper);
	      var headersSections = this.getHeadersSections();
	      for (var key in headersSections) {
	        var itemClass = this.settings.classPopupSearchSectionItemIcon + (headersSections[key].selected ? " ".concat(this.settings.classPopupSearchSectionItemIconActive) : '');
	        var headerSectionItem = BX.Tag.render(_templateObject4 || (_templateObject4 = babelHelpers.taggedTemplateLiteral(["\n\t\t\t\t\t<div class=\"main-ui-filter-popup-search-section-item\" data-ui-popup-filter-section-button=\"", "\">\n\t\t\t\t\t\t<div class=\"", "\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t", "\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t"])), key, itemClass, BX.Text.encode(headersSections[key].name));
	        BX.bind(headerSectionItem, 'click', this.onFilterSectionClick.bind(this, headerSectionItem));
	        headerSectionsWrapper.firstElementChild.appendChild(headerSectionItem);
	      }
	    },
	    onFilterSectionClick: function onFilterSectionClick(item) {
	      var activeClass = this.settings.classPopupSearchSectionItemIconActive;
	      var sectionId = item.dataset.uiPopupFilterSectionButton;
	      var section = document.querySelectorAll("[data-ui-popup-filter-section='" + sectionId + "']");
	      if (BX.Dom.hasClass(item.firstElementChild, activeClass)) {
	        BX.Dom.removeClass(item.firstElementChild, activeClass);
	        BX.Dom.hide(section[0]);
	      } else {
	        BX.Dom.addClass(item.firstElementChild, activeClass);
	        BX.Dom.show(section[0]);
	      }
	    },
	    preparePopupContentHeaderSearch: function preparePopupContentHeaderSearch(headerWrapper) {
	      if (!this.enableFieldsSearch) {
	        return;
	      }
	      var searchForm = BX.Tag.render(_templateObject5 || (_templateObject5 = babelHelpers.taggedTemplateLiteral(["\n\t\t\t\t<div class=\"ui-form-row\">\n\t\t\t\t\t<div class=\"ui-form-content main-ui-filter-popup-search-input-wrapper\">\n\t\t\t\t\t\t<div class=\"ui-ctl ui-ctl-textbox ui-ctl-before-icon ui-ctl-after-icon\">\n\t\t\t\t\t\t\t<div class=\"ui-ctl-before ui-ctl-icon-search\"></div>\n\t\t\t\t\t\t\t<button class=\"ui-ctl-after ui-ctl-icon-clear\"></button>\n\t\t\t\t\t\t\t<input type=\"text\" class=\"ui-ctl-element ", "\">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t"])), this.settings.classPopupSearchSectionItem);
	      headerWrapper.firstElementChild.appendChild(searchForm);
	      var inputs = searchForm.getElementsByClassName(this.settings.classPopupSearchSectionItem);
	      if (inputs.length) {
	        var input = inputs[0];
	        BX.bind(input, 'input', this.onFilterSectionSearchInput.bind(this, input));
	        BX.bind(input.previousElementSibling, 'click', this.onFilterSectionSearchInputClear.bind(this, input));
	      }
	    },
	    preparePopupContentFields: function preparePopupContentFields(wrapper, sections, block, mix) {
	      if (!this.enableHeadersSections) {
	        return;
	      }
	      var sectionsWrapper = BX.Tag.render(_templateObject6 || (_templateObject6 = babelHelpers.taggedTemplateLiteral(["<div class=\"main-ui-filter-popup-search-sections-wrapper\"></div>"])));
	      wrapper.appendChild(sectionsWrapper);
	      for (var key in sections) {
	        var sectionWrapper = BX.Tag.render(_templateObject7 || (_templateObject7 = babelHelpers.taggedTemplateLiteral(["\n\t\t\t\t\t<div class=\"main-ui-filter-popup-section-wrapper\" data-ui-popup-filter-section=\"", "\"></div>\n\t\t\t\t"])), key);
	        this.setPopupElementWidthFromSettings(sectionWrapper);
	        if (!this.getHeadersSectionParam(key, 'selected')) {
	          sectionWrapper.setAttribute('hidden', '');
	        }
	        var sectionTitle = BX.Tag.render(_templateObject8 || (_templateObject8 = babelHelpers.taggedTemplateLiteral(["\n\t\t\t\t\t<h3 class=\"main-ui-filter-popup-title\">\n\t\t\t\t\t\t", "\n\t\t\t\t\t</h3>\n\t\t\t\t"])), BX.Text.encode(this.getHeadersSectionParam(key, 'name')));
	        var fieldsBlock = BX.decl({
	          block: block,
	          mix: mix,
	          content: sections[key]
	        });
	        sectionWrapper.appendChild(sectionTitle);
	        sectionWrapper.appendChild(fieldsBlock);
	        sectionsWrapper.appendChild(sectionWrapper);
	      }
	    },
	    prepareAnimation: function prepareAnimation() {
	      var _this8 = this;
	      if (this.enableFieldsSearch) {
	        this.fieldsPopupItems.forEach(function (item) {
	          BX.bind(item, 'animationend', _this8.onAnimationEnd.bind(_this8, item));
	        });
	      }
	    },
	    onAnimationEnd: function onAnimationEnd(item) {
	      item.style.display = BX.Dom.hasClass(item, this.settings.classPopupSearchFieldListItemHidden) ? 'none' : 'inline-block';
	    },
	    onFilterSectionSearchInput: function onFilterSectionSearchInput(input) {
	      var search = input.value;
	      if (search.length) {
	        search = search.toLowerCase();
	      }
	      this.getFieldsPopupItems().forEach(function (item) {
	        var title = item.innerText.toLowerCase();
	        if (search.length && title.indexOf(search) === -1) {
	          BX.Dom.removeClass(item, this.settings.classPopupSearchFieldListItemVisible);
	          BX.Dom.addClass(item, this.settings.classPopupSearchFieldListItemHidden);
	        } else {
	          BX.Dom.removeClass(item, this.settings.classPopupSearchFieldListItemHidden);
	          BX.Dom.addClass(item, this.settings.classPopupSearchFieldListItemVisible);
	          item.style.display = 'inline-block';
	        }
	      }.bind(this));
	    },
	    onFilterSectionSearchInputClear: function onFilterSectionSearchInputClear(input) {
	      if (input.value.length) {
	        input.value = '';
	        this.onFilterSectionSearchInput(input);
	      }
	    },
	    getDefaultHeaderSection: function getDefaultHeaderSection() {
	      var headersSections = this.getHeadersSections();
	      for (var key in headersSections) {
	        if ('selected' in headersSections[key] && headersSections[key].selected) {
	          return headersSections[key];
	        }
	      }
	      return null;
	    },
	    getHeadersSections: function getHeadersSections() {
	      return this.getParam('HEADERS_SECTIONS');
	    },
	    getHeadersSectionParam: function getHeadersSectionParam(sectionId, paramName, defaultValue) {
	      if (this.getHeadersSections()[sectionId] !== undefined && this.getHeadersSections()[sectionId][paramName] !== undefined) {
	        return this.getHeadersSections()[sectionId][paramName];
	      }
	      return defaultValue;
	    },
	    /**
	     * Gets field loader
	     * @return {BX.Loader}
	     */
	    getFieldLoader: function getFieldLoader() {
	      if (!this.fieldLoader) {
	        this.fieldLoader = new BX.Loader({
	          mode: "custom",
	          size: 18,
	          offset: {
	            left: "5px",
	            top: "5px"
	          }
	        });
	      }
	      return this.fieldLoader;
	    },
	    _clickOnFieldListItem: function _clickOnFieldListItem(event) {
	      var target = event.target;
	      var data;
	      if (!BX.hasClass(target, this.settings.classFieldListItem)) {
	        target = BX.findParent(target, {
	          className: this.settings.classFieldListItem
	        }, true, false);
	      }
	      if (BX.type.isDomNode(target)) {
	        try {
	          data = JSON.parse(BX.data(target, 'item'));
	        } catch (err) {}
	        if (this.isFieldChangePrevented(data, BX.hasClass(target, this.settings.classMenuItemChecked))) {
	          return;
	        }
	        var p = new BX.Promise();
	        if (this.getParam("LAZY_LOAD")) {
	          this.getFieldLoader().show(target);
	          var label = target.querySelector(".main-ui-select-inner-label");
	          if (label) {
	            label.classList.add("main-ui-no-before");
	          }
	          var callback = function (response) {
	            p.fulfill(response);
	            this.getFieldLoader().hide();
	            if (label) {
	              label.classList.remove("main-ui-no-before");
	            }
	          }.bind(this);
	          if (BX.type.isNotEmptyObject(this.getParam('LAZY_LOAD')['CONTROLLER'])) {
	            var sourceComponentName = this.getParam('LAZY_LOAD')['CONTROLLER']['componentName'];
	            var sourceComponentSignedParameters = this.getParam('LAZY_LOAD')['CONTROLLER']['signedParameters'];
	            BX.ajax.runAction(this.getParam('LAZY_LOAD')['CONTROLLER']['getField'], {
	              data: {
	                filterId: this.getParam('FILTER_ID'),
	                id: data.NAME,
	                componentName: BX.type.isNotEmptyString(sourceComponentName) ? sourceComponentName : '',
	                signedParameters: BX.type.isNotEmptyString(sourceComponentSignedParameters) ? sourceComponentSignedParameters : ''
	              }
	            }).then(function (response) {
	              callback(response.data);
	            }.bind(this), function (response) {});
	          } else {
	            this.getLazyLoadField(data.NAME).then(callback);
	          }
	        } else {
	          p.fulfill(data);
	        }
	        p.then(function (response) {
	          this.params.FIELDS.push(response);
	          if (BX.hasClass(target, this.settings.classMenuItemChecked)) {
	            BX.removeClass(target, this.settings.classMenuItemChecked);
	            this.getPreset().removeField(response);
	          } else {
	            if (BX.type.isPlainObject(response)) {
	              this.getPreset().addField(response);
	              BX.addClass(target, this.settings.classMenuItemChecked);
	              if (BX.type.isString(response.HTML)) {
	                var wrap = BX.create("div");
	                this.getHiddenElement().appendChild(wrap);
	                BX.html(wrap, response.HTML);
	              }
	            }
	          }
	          this.syncFields();
	        }.bind(this));
	      }
	    },
	    /**
	     * @return {boolean}
	     */
	    isFieldChangePrevented: function isFieldChangePrevented(data, isChecked) {
	      var eventParams;
	      if (isChecked) {
	        eventParams = {
	          fields: [],
	          oldFields: [data.NAME]
	        };
	      } else {
	        eventParams = {
	          fields: [data.NAME],
	          oldFields: []
	        };
	      }
	      var event = new BX.Event.BaseEvent({
	        data: eventParams
	      });
	      this.emitter.emit('onBeforeChangeFilterItems', event);
	      return event.isDefaultPrevented();
	    },
	    getHiddenElement: function getHiddenElement() {
	      if (!this.hiddenElement) {
	        this.hiddenElement = BX.create("div");
	        document.body.appendChild(this.hiddenElement);
	      }
	      return this.hiddenElement;
	    },
	    /**
	     * Gets lazy load fields
	     * @param id
	     * @return {BX.Promise}
	     */
	    getLazyLoadField: function getLazyLoadField(id) {
	      var fieldUrl = this.getParam('LAZY_LOAD')['GET_FIELD'];
	      var p = new BX.Promise();
	      if (BX.Type.isPlainObject(fieldUrl)) {
	        var component = fieldUrl.component,
	          action = fieldUrl.action,
	          data = fieldUrl.data;
	        data.fieldId = id;
	        BX.ajax.runComponentAction(component, action, {
	          mode: 'ajax',
	          data: data
	        }).then(function (response) {
	          var _response$data$field;
	          p.fulfill((_response$data$field = response.data.field) !== null && _response$data$field !== void 0 ? _response$data$field : []);
	        });
	      } else {
	        BX.ajax({
	          method: 'get',
	          url: BX.util.add_url_param(fieldUrl, {
	            id: id
	          }),
	          dataType: 'json',
	          onsuccess: function onsuccess(response) {
	            return p.fulfill(response);
	          }
	        });
	      }
	      return p;
	    },
	    /**
	     * Shows fields list popup
	     */
	    showFieldsPopup: function showFieldsPopup() {
	      var popup = this.getFieldsPopup();
	      this.adjustFieldListPopupPosition();
	      popup.show();
	    },
	    /**
	     * Closes fields list popup
	     */
	    closeFieldListPopup: function closeFieldListPopup() {
	      if (this.getParam('USE_CHECKBOX_LIST_FOR_SETTINGS_POPUP') && BX.UI && BX.Type.isFunction(BX.UI.CheckboxList)) {
	        if (this.checkboxListPopup) {
	          this.checkboxListPopup.destroy();
	          this.checkboxListPopup = null;
	        }
	        return;
	      }
	      var popup = this.getFieldsPopup();
	      popup.close();
	    },
	    /**
	     * Adjusts field list popup position
	     */
	    adjustFieldListPopupPosition: function adjustFieldListPopupPosition() {
	      var popup = this.getFieldsPopup();
	      var pos = BX.pos(this.getAddField());
	      pos.forceBindPosition = true;
	      popup.adjustPosition(pos);
	    },
	    /**
	     * Gets field list popup instance
	     * @return {BX.PopupWindow}
	     */
	    getFieldsPopup: function getFieldsPopup() {
	      var bindElement = this.settings.get('showPopupInCenter', false) ? null : this.getAddField();
	      if (!this.fieldsPopup) {
	        this.fieldsPopup = new BX.PopupWindow(this.getParam('FILTER_ID') + '_fields_popup', bindElement, {
	          autoHide: true,
	          offsetTop: 4,
	          offsetLeft: 0,
	          lightShadow: true,
	          closeIcon: bindElement === null,
	          closeByEsc: bindElement === null,
	          noAllPaddings: true,
	          zIndex: 13
	        });
	        this.fieldsPopupLoader = new BX.Loader({
	          target: this.fieldsPopup.contentContainer
	        });
	        this.fieldsPopupLoader.show();
	        this.setPopupElementWidthFromSettings(this.fieldsPopup.contentContainer);
	        this.fieldsPopup.contentContainer.style.height = "330px";
	        this.getFieldsListPopupContent().then(function (res) {
	          this.fieldsPopup.contentContainer.removeAttribute("style");
	          this.fieldsPopupLoader.hide();
	          this.fieldsPopup.setContent(res);
	          this.syncFields({
	            cache: false
	          });
	          this.adjustFieldListPopupPosition();
	        }.bind(this));
	      }
	      return this.fieldsPopup;
	    },
	    setPopupElementWidthFromSettings: function setPopupElementWidthFromSettings(element) {
	      element.style.width = this.settings.popupWidth + 'px';
	    },
	    _onAddPresetClick: function _onAddPresetClick() {
	      this.enableAddPreset();
	    },
	    /**
	     * Enables shows wait spinner for button
	     * @param {HTMLElement} button
	     */
	    enableWaitSate: function enableWaitSate(button) {
	      !!button && BX.addClass(button, this.settings.classWaitButtonClass);
	    },
	    /**
	     * Disables shows wait spinner for button
	     * @param {HTMLElement} button
	     */
	    disableWaitState: function disableWaitState(button) {
	      !!button && BX.removeClass(button, this.settings.classWaitButtonClass);
	    },
	    _onSaveButtonClick: function _onSaveButtonClick() {
	      var forAll = !!this.getSaveForAllCheckbox() && this.getSaveForAllCheckbox().checked;
	      var input = this.getPreset().getAddPresetFieldInput();
	      var mask = input.parentNode.querySelector(".main-ui-filter-edit-mask");
	      var presetName;
	      function onAnimationEnd(event) {
	        if (event.animationName === "fieldError") {
	          event.currentTarget.removeEventListener("animationend", onAnimationEnd);
	          event.currentTarget.removeEventListener("oAnimationEnd", onAnimationEnd);
	          event.currentTarget.removeEventListener("webkitAnimationEnd", onAnimationEnd);
	          event.currentTarget.classList.remove("main-ui-filter-error");
	        }
	      }
	      function showLengthError(mask) {
	        mask.addEventListener("animationend", onAnimationEnd);
	        mask.addEventListener("oAnimationEnd", onAnimationEnd);
	        mask.addEventListener("webkitAnimationEnd", onAnimationEnd);
	        mask.classList.add("main-ui-filter-error");
	        var promise = new BX.Promise();
	        promise.fulfill(true);
	        return promise;
	      }
	      this.enableWaitSate(this.getFindButton());
	      if (this.isAddPresetEnabled() && !forAll) {
	        presetName = input.value;
	        if (presetName.length) {
	          this.savePreset();
	          this.disableAddPreset();
	        } else {
	          showLengthError(mask).then(function () {
	            input.focus();
	          });
	        }
	      }
	      if (this.isEditEnabled()) {
	        var preset = this.getPreset();
	        var currentPresetId = preset.getCurrentPresetId();
	        var presetNode = preset.getPresetNodeById(currentPresetId);
	        var presetNameInput = preset.getPresetInput(presetNode);
	        if (presetNameInput.value.length === 0 && currentPresetId === 'default_filter') {
	          var currentPresetData = preset.getCurrentPresetData();
	          if (currentPresetData) {
	            BX.Dom.attr(presetNameInput, 'value', currentPresetData.TITLE);
	          }
	        }
	        if (presetNameInput.value.length > 0) {
	          preset.updateEditablePreset(currentPresetId);
	          this.saveUserSettings(forAll);
	          if (!forAll) {
	            this.disableEdit();
	          }
	        } else {
	          var presetMask = presetNode.querySelector(".main-ui-filter-edit-mask");
	          showLengthError(presetMask).then(function () {
	            presetNameInput.focus();
	          });
	        }
	      }
	    },
	    _onCancelButtonClick: function _onCancelButtonClick() {
	      this.setIsSetOutsideState(false);
	      this.disableAddPreset();
	      this.getPreset().clearAddPresetFieldInput();
	      this.disableEdit();
	      !!this.getSaveForAllCheckbox() && (this.getSaveForAllCheckbox().checked = null);
	    },
	    _onGridReady: function _onGridReady(grid) {
	      if (!this.grid && grid.getContainerId() === this.getParam('GRID_ID')) {
	        this.grid = grid;
	      }
	    },
	    _onFilterMousedown: function _onFilterMousedown(event) {
	      var target = event.target;
	      if (this.getFields().isDragButton(target)) {
	        var inputs = BX.Filter.Utils.getByTag(target.parentNode, 'input', true);
	        (inputs || []).forEach(function (item) {
	          BX.fireEvent(item, 'blur');
	        });
	        BX.fireEvent(this.getFilter(), 'click');
	      }
	    },
	    _onFilterClick: function _onFilterClick(event) {
	      var Fields = this.getFields();
	      var Presets$$1 = this.getPreset();
	      var field;
	      if (Fields.isFieldDelete(event.target)) {
	        field = Fields.getField(event.target);
	        Presets$$1.removeField(field);
	      }
	      if (Fields.isFieldValueDelete(event.target)) {
	        field = Fields.getField(event.target);
	        Fields.clearFieldValue(field);
	      }
	    },
	    /**
	     * Gets filter buttons container
	     * @return {?HTMLElement}
	     */
	    getButtonsContainer: function getButtonsContainer() {
	      return BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classButtonsContainer);
	    },
	    /**
	     * Gets save button element
	     * @return {?HTMLElement}
	     */
	    getSaveButton: function getSaveButton() {
	      return BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classSaveButton);
	    },
	    /**
	     * Gets cancel element
	     * @return {?HTMLElement}
	     */
	    getCancelButton: function getCancelButton() {
	      return BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classCancelButton);
	    },
	    /**
	     * Gets find button element
	     * @return {?HTMLElement}
	     */
	    getFindButton: function getFindButton() {
	      return BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classFindButton);
	    },
	    /**
	     * Gets reset button element
	     * @return {?HTMLElement}
	     */
	    getResetButton: function getResetButton() {
	      return BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classResetButton);
	    },
	    /**
	     * Gets add preset button
	     * @return {?HTMLElement}
	     */
	    getAddPresetButton: function getAddPresetButton() {
	      return BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classAddPresetButton);
	    },
	    /**
	     * Checks that add preset mode enabled
	     * @return {boolean}
	     */
	    isAddPresetEnabled: function isAddPresetEnabled() {
	      return this.isAddPresetModeState;
	    },
	    /**
	     * Enables add preset mode
	     */
	    enableAddPreset: function enableAddPreset() {
	      var Preset = this.getPreset();
	      var addPresetField = Preset.getAddPresetField();
	      var addPresetFieldInput = Preset.getAddPresetFieldInput();
	      var buttonsContainer = this.getButtonsContainer();
	      BX.show(addPresetField);
	      BX.show(buttonsContainer);
	      BX.hide(this.getPresetButtonsContainer());
	      this.hideForAllCheckbox();
	      if (BX.type.isDomNode(addPresetFieldInput)) {
	        addPresetFieldInput.focus();
	      }
	      BX.addClass(this.getSidebarControlsContainer(), this.settings.classDisabled);
	      this.isAddPresetModeState = true;
	    },
	    /**
	     * Disables add preset mode
	     */
	    disableAddPreset: function disableAddPreset() {
	      var Preset = this.getPreset();
	      var addPresetField = Preset.getAddPresetField();
	      var buttonsContainer = this.getButtonsContainer();
	      BX.hide(addPresetField);
	      BX.hide(buttonsContainer);
	      BX.show(this.getPresetButtonsContainer());
	      this.showForAllCheckbox();
	      Preset.getAddPresetFieldInput().value = '';
	      BX.removeClass(this.getSidebarControlsContainer(), this.settings.classDisabled);
	      this.isAddPresetModeState = false;
	    },
	    /**
	     * Gets control from field list
	     * @return {?HTMLElement[]}
	     */
	    getControls: function getControls() {
	      var container = this.getFieldListContainer();
	      var controls = null;
	      if (BX.type.isDomNode(container)) {
	        controls = BX.Filter.Utils.getByClass(container, this.settings.classControl, true);
	      }
	      return controls;
	    },
	    /**
	     * Gets filter fields
	     * @return {?HTMLElement[]}
	     */
	    getFilterFields: function getFilterFields() {
	      var container = this.getFieldListContainer();
	      var fields = [];
	      var groups = [];
	      if (BX.type.isDomNode(container)) {
	        fields = BX.Filter.Utils.getByClass(container, this.settings.classField, true);
	        groups = BX.Filter.Utils.getByClass(container, this.settings.classFieldGroup, true);
	        if (!BX.type.isArray(fields)) {
	          fields = [];
	        }
	        if (BX.type.isArray(groups)) {
	          groups.forEach(function (current) {
	            fields.push(current);
	          });
	        }
	      }
	      return fields;
	    },
	    /**
	     * Gets filter fields values
	     * @return {object}
	     */
	    getFilterFieldsValues: function getFilterFieldsValues() {
	      var fields = this.getPreset().getFields();
	      var Search = this.getSearch();
	      var values = {};
	      var type, name;
	      values['FIND'] = Search.getInput().value;
	      if (BX.type.isArray(fields) && fields.length) {
	        fields.forEach(function (current) {
	          var additionalFilter = BX.Filter.AdditionalFilter.getInstance().getFilter(current);
	          if (additionalFilter) {
	            Object.assign(values, additionalFilter);
	            return;
	          }
	          type = BX.data(current, 'type');
	          name = BX.data(current, 'name');
	          switch (type) {
	            case this.types.STRING:
	              {
	                this.prepareControlStringValue(values, current);
	                break;
	              }
	            case this.types.TEXTAREA:
	              {
	                this.prepareControlTextareaValue(values, current);
	                break;
	              }
	            case this.types.NUMBER:
	              {
	                this.prepareControlNumberValue(values, name, current);
	                break;
	              }
	            case this.types.DATE:
	              {
	                this.prepareControlDateValue(values, name, current);
	                break;
	              }
	            case this.types.CUSTOM_DATE:
	              {
	                this.prepareControlCustomDateValue(values, name, current);
	                break;
	              }
	            case this.types.SELECT:
	              {
	                this.prepareControlSelectValue(values, name, current);
	                break;
	              }
	            case this.types.MULTI_SELECT:
	              {
	                this.prepareControlMultiselectValue(values, name, current);
	                break;
	              }
	            case this.types.DEST_SELECTOR:
	            case this.types.CUSTOM_ENTITY:
	            case this.types.ENTITY_SELECTOR:
	              {
	                this.prepareControlCustomEntityValue(values, name, current);
	                break;
	              }
	            case this.types.CUSTOM:
	              {
	                this.prepareControlCustomValue(values, name, current);
	                break;
	              }
	            default:
	              {
	                break;
	              }
	          }
	        }, this);
	      }
	      return values;
	    },
	    /**
	     * @param values
	     * @param name
	     * @param field
	     */
	    prepareControlCustomEntityValue: function prepareControlCustomEntityValue(values, name, field) {
	      var squares = this.fetchSquares(field);
	      var squaresData = this.fetchSquaresData(squares);
	      var isMultiple = BX.Main.ui.CustomEntity.isMultiple(field);
	      values[name] = '';
	      values[name + '_label'] = '';
	      if (isMultiple) {
	        values[name] = [];
	        values[name + '_label'] = [];
	        !!squaresData && squaresData.forEach(function (item) {
	          values[name].push(item._value.toString());
	          values[name + '_label'].push(item._label.toString());
	        });
	      } else {
	        if (squaresData.length) {
	          values[name] = squaresData[0]._value.toString();
	          values[name + '_label'] = squaresData[0]._label.toString();
	        }
	      }
	    },
	    /**
	     * @param {HTMLElement} field
	     * @return {HTMLElement[]}
	     */
	    fetchSquares: function fetchSquares(field) {
	      return !!field ? BX.Filter.Utils.getByClass(field, this.settings.classSquare, true) : [];
	    },
	    /**
	     * @param {HTMLElement[]} squares
	     * @return {object[]}
	     */
	    fetchSquaresData: function fetchSquaresData(squares) {
	      return squares.map(function (square) {
	        return JSON.parse(BX.data(square, 'item'));
	      }, this);
	    },
	    /**
	     * @param {object} values
	     * @param {string} name
	     * @param {HTMLElement} field
	     */
	    prepareControlCustomValue: function prepareControlCustomValue(values, name, field) {
	      var stringFields = BX.Filter.Utils.getByTag(field, 'input', true);
	      values[name] = '';
	      if (BX.type.isArray(stringFields)) {
	        stringFields.forEach(function (current) {
	          if (BX.type.isNotEmptyString(current.name)) {
	            values[current.name] = current.value;
	          }
	        });
	      }
	    },
	    prepareControlMultiselectValue: function prepareControlMultiselectValue(values, name, field) {
	      var select = BX.Filter.Utils.getByClass(field, this.settings.classMultiSelect);
	      var value = JSON.parse(BX.data(select, 'value'));
	      values[name] = '';
	      if (BX.type.isArray(value) && value.length) {
	        values[name] = {};
	        value.forEach(function (current, index) {
	          values[name][index] = current.VALUE;
	        });
	      }
	    },
	    prepareControlSelectValue: function prepareControlSelectValue(values, name, field) {
	      var select = BX.Filter.Utils.getByClass(field, this.settings.classSelect);
	      var value = JSON.parse(BX.data(select, 'value'));
	      values[name] = value.VALUE;
	    },
	    prepareControlCustomDateValue: function prepareControlCustomDateValue(values, name, field) {
	      var daysControl = field.querySelector("[data-name=\"" + name + '_days' + "\"]");
	      if (daysControl) {
	        var daysValue = JSON.parse(daysControl.dataset.value);
	        values[name + '_days'] = daysValue.map(function (item) {
	          return item.VALUE;
	        });
	      }
	      var monthsControl = field.querySelector("[data-name=\"" + name + '_months' + "\"]");
	      if (monthsControl) {
	        var monthsValue = JSON.parse(monthsControl.dataset.value);
	        values[name + '_months'] = monthsValue.map(function (item) {
	          return item.VALUE;
	        });
	      }
	      var yearsControl = field.querySelector("[data-name=\"" + name + '_years' + "\"]");
	      if (yearsControl) {
	        var yearsValue = JSON.parse(yearsControl.dataset.value);
	        values[name + '_years'] = yearsValue.map(function (item) {
	          return item.VALUE;
	        });
	      }
	    },
	    prepareControlDateValue: function prepareControlDateValue(values, name, field, withAdditional) {
	      var additionalFieldsContainer = field.querySelector('.main-ui-filter-additional-fields-container');
	      if (additionalFieldsContainer && !withAdditional) {
	        BX.remove(additionalFieldsContainer);
	      }
	      var select = BX.Filter.Utils.getByClass(field, this.settings.classSelect);
	      var yearsSwitcher = field.querySelector(".main-ui-select[data-name*=\"_allow_year\"]");
	      var selectName = name + this.settings.datePostfix;
	      var fromName = name + this.settings.fromPostfix;
	      var toName = name + this.settings.toPostfix;
	      var daysName = name + this.settings.daysPostfix;
	      var monthName = name + this.settings.monthPostfix;
	      var quarterName = name + this.settings.quarterPostfix;
	      var yearName = name + this.settings.yearPostfix;
	      var yearsSwitcherName = name + "_allow_year";
	      var selectValue, stringFields, controls, controlName, yearsSwitcherValue;
	      values[selectName] = '';
	      values[fromName] = '';
	      values[toName] = '';
	      values[daysName] = '';
	      values[monthName] = '';
	      values[quarterName] = '';
	      values[yearName] = '';
	      var input = field.querySelector(".main-ui-date-input");
	      if (input && input.dataset.isValid === "false") {
	        return;
	      }
	      selectValue = JSON.parse(BX.data(select, 'value'));
	      values[selectName] = selectValue.VALUE;
	      if (yearsSwitcher) {
	        yearsSwitcherValue = JSON.parse(BX.data(yearsSwitcher, 'value'));
	        values[yearsSwitcherName] = yearsSwitcherValue.VALUE;
	      }
	      switch (selectValue.VALUE) {
	        case this.dateTypes.EXACT:
	          {
	            stringFields = BX.Filter.Utils.getByClass(field, this.settings.classDateInput);
	            values[fromName] = stringFields.value;
	            values[toName] = stringFields.value;
	            break;
	          }
	        case this.dateTypes.QUARTER:
	          {
	            controls = BX.Filter.Utils.getByClass(field, this.settings.classControl, true);
	            if (BX.type.isArray(controls)) {
	              controls.forEach(function (current) {
	                controlName = BX.data(current, 'name');
	                if (controlName && controlName.indexOf('_quarter') !== -1) {
	                  values[quarterName] = JSON.parse(BX.data(current, 'value')).VALUE;
	                }
	                if (controlName && controlName.endsWith('_year') && !controlName.endsWith('_allow_year')) {
	                  values[yearName] = JSON.parse(BX.data(current, 'value')).VALUE;
	                }
	              }, this);
	            }
	            break;
	          }
	        case this.dateTypes.YEAR:
	          {
	            controls = BX.Filter.Utils.getByClass(field, this.settings.classControl, true);
	            if (BX.type.isArray(controls)) {
	              controls.forEach(function (current) {
	                controlName = BX.data(current, 'name');
	                if (controlName && controlName.endsWith('_year') && !controlName.endsWith('_allow_year')) {
	                  values[yearName] = JSON.parse(BX.data(current, 'value')).VALUE;
	                }
	              }, this);
	            }
	            break;
	          }
	        case this.dateTypes.MONTH:
	          {
	            controls = BX.Filter.Utils.getByClass(field, this.settings.classControl, true);
	            if (BX.type.isArray(controls)) {
	              controls.forEach(function (current) {
	                controlName = BX.data(current, 'name');
	                if (controlName && controlName.indexOf('_month') !== -1) {
	                  values[monthName] = JSON.parse(BX.data(current, 'value')).VALUE;
	                }
	                if (controlName && controlName.endsWith('_year') && !controlName.endsWith('_allow_year')) {
	                  values[yearName] = JSON.parse(BX.data(current, 'value')).VALUE;
	                }
	              }, this);
	            }
	            break;
	          }
	        case this.additionalDateTypes.PREV_DAY:
	        case this.additionalDateTypes.NEXT_DAY:
	        case this.additionalDateTypes.MORE_THAN_DAYS_AGO:
	        case this.additionalDateTypes.AFTER_DAYS:
	        case this.dateTypes.NEXT_DAYS:
	        case this.dateTypes.PREV_DAYS:
	          {
	            var control = BX.Filter.Utils.getByClass(field, this.settings.classNumberInput);
	            if (!!control && control.name === daysName) {
	              values[daysName] = control.value;
	            }
	            break;
	          }
	        case this.dateTypes.RANGE:
	          {
	            stringFields = BX.Filter.Utils.getByClass(field, this.settings.classDateInput, true);
	            stringFields.forEach(function (current) {
	              if (current.name === fromName) {
	                values[fromName] = current.value;
	              } else if (current.name === toName) {
	                values[toName] = current.value;
	              }
	            }, this);
	            break;
	          }
	        case "CUSTOM_DATE":
	          {
	            var customValues = {};
	            this.prepareControlCustomDateValue(customValues, name, field);
	            values[name + '_days'] = customValues[name + '_days'];
	            values[monthName] = customValues[name + '_months'];
	            values[yearName] = customValues[name + '_years'];
	            break;
	          }
	        default:
	          {
	            break;
	          }
	      }
	      if (additionalFieldsContainer && !withAdditional) {
	        BX.append(additionalFieldsContainer, field);
	      }
	      var additionalFields = Array.from(field.querySelectorAll('.main-ui-filter-additional-fields-container > [data-type="DATE"]'));
	      if (additionalFields) {
	        additionalFields.forEach(function (additionalField) {
	          var name = additionalField.dataset.name;
	          this.prepareControlDateValue(values, name, additionalField, true);
	        }, this);
	      }
	    },
	    prepareControlNumberValue: function prepareControlNumberValue(values, name, field) {
	      var stringFields = BX.Filter.Utils.getByClass(field, this.settings.classNumberInput, true);
	      var select = BX.Filter.Utils.getByClass(field, this.settings.classSelect);
	      var selectName = name + this.settings.numberPostfix;
	      var fromName = name + this.settings.fromPostfix;
	      var toName = name + this.settings.toPostfix;
	      var selectValue;
	      values[fromName] = '';
	      values[toName] = '';
	      selectValue = JSON.parse(BX.data(select, 'value'));
	      values[selectName] = selectValue.VALUE;
	      stringFields.forEach(function (current) {
	        if (current.name.indexOf(this.settings.fromPostfix) !== -1) {
	          values[fromName] = current.value || '';
	          if (values[selectName] === 'exact') {
	            values[toName] = current.value || '';
	          }
	        } else if (current.name.indexOf(this.settings.toPostfix) !== -1) {
	          values[toName] = current.value || '';
	        }
	      }, this);
	    },
	    prepareControlStringValue: function prepareControlStringValue(values, field) {
	      var control = BX.Filter.Utils.getByClass(field, this.settings.classStringInput);
	      var name;
	      if (BX.type.isDomNode(control)) {
	        name = control.name;
	        values[name] = control.value;
	      }
	    },
	    prepareControlTextareaValue: function prepareControlTextareaValue(values, field) {
	      var control = BX.Filter.Utils.getByClass(field, this.settings.classStringInput);
	      var name;
	      if (BX.type.isDomNode(control)) {
	        name = control.name;
	        values[name] = control.value;
	      }
	    },
	    /**
	     * Shows grid animation
	     */
	    showGridAnimation: function showGridAnimation() {
	      this.grid && this.grid.tableFade();
	    },
	    /**
	     * Hides grid animations
	     */
	    hideGridAnimation: function hideGridAnimation() {
	      this.grid && this.grid.tableUnfade();
	    },
	    /**
	     * @private
	     * @param {?Boolean} clear - is need reset filter
	     * @param {?Boolean} applyPreset - is need apply preset
	     * @return {String}
	     */
	    getPresetId: function getPresetId(clear, applyPreset) {
	      var presetId = this.getPreset().getCurrentPresetId();
	      if (!this.isEditEnabled() && !this.isAddPresetEnabled() && !applyPreset || presetId === 'default_filter' && !clear) {
	        presetId = 'tmp_filter';
	      }
	      return presetId;
	    },
	    isAppliedUserFilter: function isAppliedUserFilter() {
	      var _this9 = this;
	      var presetOptions = this.getPreset().getCurrentPresetData();
	      if (BX.Type.isPlainObject(presetOptions)) {
	        var hasFields = BX.Type.isArrayFilled(presetOptions.FIELDS) && presetOptions.FIELDS.some(function (field) {
	          return !_this9.getPreset().isEmptyField(field);
	        });
	        var hasAdditional = BX.Type.isArrayFilled(presetOptions.ADDITIONAL) && presetOptions.ADDITIONAL.some(function (field) {
	          return !_this9.getPreset().isEmptyField(field);
	        });
	        return !presetOptions.IS_PINNED && (hasFields || hasAdditional) || presetOptions.IS_PINNED && BX.Type.isArrayFilled(presetOptions.ADDITIONAL) || BX.Type.isStringFilled(this.getSearch().getSearchString());
	      }
	      return false;
	    },
	    isAppliedDefaultPreset: function isAppliedDefaultPreset() {
	      var _this10 = this;
	      var presetData = this.getPreset().getCurrentPresetData();
	      if (!presetData.IS_PINNED) {
	        return false;
	      }
	      if (BX.Type.isArrayFilled(presetData.ADDITIONAL)) {
	        var hasAdditional = presetData.ADDITIONAL.some(function (field) {
	          return !_this10.getPreset().isEmptyField(field);
	        });
	        if (hasAdditional) {
	          return false;
	        }
	      }
	      if (BX.Type.isStringFilled(this.getSearch().getSearchString())) {
	        return false;
	      }
	      return true;
	    },
	    /**
	     * Applies filter
	     * @param {?Boolean} [clear] - is need reset filter
	     * @param {?Boolean} [applyPreset] - is need apply preset
	     * @param {?Boolean} [isSetOutside] - is filter sets from outside
	     * @return {BX.Promise}
	     */
	    applyFilter: function applyFilter(clear, applyPreset, isSetOutside) {
	      this.setIsSetOutsideState(isSetOutside);
	      var filterId = this.getParam('FILTER_ID');
	      var promise = new BX.Promise(null, this);
	      var Preset = this.getPreset();
	      var Search = this.getSearch();
	      var applyParams = {
	        autoResolve: !this.grid
	      };
	      var self = this;
	      this.setDefaultPresetAppliedState(this.isAppliedDefaultPreset());
	      if (this.isAppliedUserFilter()) {
	        BX.Dom.addClass(this.getSearch().container, 'main-ui-filter-search--active');
	      } else {
	        BX.Dom.removeClass(this.getSearch().container, 'main-ui-filter-search--active');
	      }
	      this.clearGet();
	      this.showGridAnimation();
	      var action = clear ? "clear" : "apply";
	      BX.onCustomEvent(window, 'BX.Main.Filter:beforeApply', [filterId, {
	        action: action
	      }, this, promise]);
	      // presetId defined  after `beforeApply` because current preset may be changed by the event's handlers
	      var presetId = this.getPresetId(clear, applyPreset);
	      this.updatePreset(presetId, null, clear, null).then(function () {
	        Search.updatePreset(Preset.getPreset(presetId));
	        if (self.getParam('VALUE_REQUIRED')) {
	          if (!Search.getSquares().length) {
	            self.lastPromise = Preset.applyPinnedPreset();
	          }
	        }
	      }).then(function () {
	        var params = {
	          apply_filter: 'Y',
	          clear_nav: 'Y'
	        };
	        var fulfill = BX.delegate(promise.fulfill, promise);
	        var reject = BX.delegate(promise.reject, promise);
	        self.grid && self.grid.reloadTable('POST', params, fulfill, reject);
	        BX.onCustomEvent(window, 'BX.Main.Filter:apply', [filterId, {
	          action: action
	        }, self, promise, applyParams]);
	        applyParams.autoResolve && promise.fulfill();
	      });
	      return promise;
	    },
	    /**
	     * Gets add field buttons
	     * @return {?HTMLElement}
	     */
	    getAddField: function getAddField() {
	      return BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classAddField);
	    },
	    /**
	     * Gets fields list container
	     * @return {?HTMLElement}
	     */
	    getFieldListContainer: function getFieldListContainer() {
	      return BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classFileldControlList);
	    },
	    /**
	     * @return {BX.Filter.Fields}
	     */
	    getFields: function getFields() {
	      if (!(this.fields instanceof BX.Filter.Fields)) {
	        this.fields = new BX.Filter.Fields(this);
	      }
	      return this.fields;
	    },
	    getPreset: function getPreset() {
	      if (!(this.presets instanceof Presets)) {
	        this.presets = new Presets(this);
	      }
	      return this.presets;
	    },
	    /**
	     * @param controlData
	     * @return {*}
	     */
	    resetControlData: function resetControlData(controlData) {
	      if (BX.type.isPlainObject(controlData)) {
	        switch (controlData.TYPE) {
	          case this.types.MULTI_SELECT:
	            {
	              controlData.VALUE = [];
	              break;
	            }
	          case this.types.SELECT:
	            {
	              controlData.VALUE = controlData.ITEMS[0];
	              break;
	            }
	          case this.types.DATE:
	            {
	              controlData.SUB_TYPE = controlData.SUB_TYPES[0];
	              controlData.VALUES = {
	                '_from': '',
	                '_to': '',
	                '_days': '',
	                '_quarter': '',
	                '_year': ''
	              };
	              break;
	            }
	          case this.types.CUSTOM_DATE:
	            {
	              controlData.VALUES = {
	                'days': [],
	                'months': [],
	                'years': []
	              };
	              break;
	            }
	          case this.types.NUMBER:
	            {
	              controlData.SUB_TYPE = controlData.SUB_TYPES[0];
	              controlData.VALUES = {
	                '_from': '',
	                '_to': ''
	              };
	              break;
	            }
	          case this.types.DEST_SELECTOR:
	          case this.types.ENTITY_SELECTOR:
	          case this.types.CUSTOM_ENTITY:
	            {
	              controlData.VALUES = {
	                '_label': '',
	                '_value': ''
	              };
	              break;
	            }
	          case this.types.CUSTOM:
	            {
	              controlData._VALUE = '';
	              break;
	            }
	          default:
	            {
	              controlData.VALUE = '';
	            }
	        }
	      }
	      return controlData;
	    },
	    clearControl: function clearControl(name) {
	      var control = this.getPreset().getField({
	        NAME: name
	      });
	      var controlData, newControl;
	      if (BX.type.isDomNode(control)) {
	        controlData = this.getFieldByName(name);
	        controlData = this.resetControlData(controlData);
	        newControl = this.getPreset().createControl(controlData);
	        BX.insertAfter(newControl, control);
	        BX.remove(control);
	      }
	    },
	    clearControls: function clearControls(squareData) {
	      if (BX.type.isArray(squareData)) {
	        squareData.forEach(function (item) {
	          'name' in item && this.clearControl(item.name);
	        }, this);
	      } else if (BX.type.isPlainObject(squareData) && 'name' in squareData) {
	        this.clearControl(squareData.name);
	      }
	    },
	    /**
	     * Gets filter popup template
	     * @return {?string}
	     */
	    getTemplate: function getTemplate() {
	      return BX.html(BX(this.settings.generalTemplateId));
	    },
	    isIe: function isIe() {
	      if (!BX.type.isBoolean(this.ie)) {
	        this.ie = BX.hasClass(document.documentElement, 'bx-ie');
	      }
	      return this.ie;
	    },
	    /**
	     * Closes filter popup
	     */
	    closePopup: function closePopup() {
	      var popup = this.getPopup();
	      var popupContainer = popup.popupContainer;
	      var configCloseDelay = this.settings.get('FILTER_CLOSE_DELAY');
	      var closeDelay;
	      BX.Dom.removeClass(this.getSearch().container, 'main-ui-filter-search--showed');
	      setTimeout(BX.delegate(function () {
	        if (!this.isIe()) {
	          BX.removeClass(popupContainer, this.settings.classAnimationShow);
	          BX.addClass(popupContainer, this.settings.classAnimationClose);
	          closeDelay = parseFloat(BX.style(popupContainer, 'animation-duration'));
	          if (BX.type.isNumber(closeDelay)) {
	            closeDelay = closeDelay * 1000;
	          }
	          setTimeout(function () {
	            popup.close();
	          }, closeDelay);
	        } else {
	          popup.close();
	        }
	      }, this), configCloseDelay);
	      if (this.getParam("LIMITS_ENABLED")) {
	        BX.removeClass(this.getFilter(), this.settings.classLimitsAnimation);
	      }
	      this.closeFieldListPopup();
	      this.adjustFocus();
	    },
	    /**
	     * Shows filter popup
	     */
	    showPopup: function showPopup() {
	      var popup = this.getPopup();
	      var popupContainer;
	      if (!popup.isShown()) {
	        BX.Dom.addClass(this.getSearch().container, 'main-ui-filter-search--showed');
	        this.isOpened = true;
	        var showDelay = this.settings.get('FILTER_SHOW_DELAY');
	        if (this.getParam('LIMITS_ENABLED') === true) {
	          this.limitAnalyticsSend();
	        }
	        setTimeout(BX.delegate(function () {
	          popup.show();
	          if (!this.isIe()) {
	            popupContainer = popup.popupContainer;
	            BX.removeClass(popupContainer, this.settings.classAnimationClose);
	            BX.addClass(popupContainer, this.settings.classAnimationShow);
	            BX.onCustomEvent(window, "BX.Main.Filter:show", [this]);
	          }
	          var textareas = [].slice.call(this.getFieldListContainer().querySelectorAll('textarea'));
	          textareas.forEach(function (item) {
	            BX.style(item, 'height', item.scrollHeight + 'px');
	          });
	        }, this), showDelay);
	      }
	    },
	    /**
	     * Gets save for all checkbox element
	     * @return {?HTMLInputElement}
	     */
	    getSaveForAllCheckbox: function getSaveForAllCheckbox() {
	      if (!this.saveForAllCheckbox && !!this.getSaveForAllCheckboxContainer()) {
	        this.saveForAllCheckbox = BX.Filter.Utils.getBySelector(this.getSaveForAllCheckboxContainer(), 'input[type="checkbox"]');
	      }
	      return this.saveForAllCheckbox;
	    },
	    /**
	     * Gets save for all checkbox container
	     * @return {?HTMLElement}
	     */
	    getSaveForAllCheckboxContainer: function getSaveForAllCheckboxContainer() {
	      if (!this.saveForAllCheckboxContainer) {
	        this.saveForAllCheckboxContainer = BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classForAllCheckbox);
	      }
	      return this.saveForAllCheckboxContainer;
	    },
	    /**
	     * Shows for all checkbox
	     */
	    showForAllCheckbox: function showForAllCheckbox() {
	      !!this.getSaveForAllCheckboxContainer() && BX.removeClass(this.getSaveForAllCheckboxContainer(), this.settings.classHide);
	    },
	    /**
	     * Hides for all checkbox
	     */
	    hideForAllCheckbox: function hideForAllCheckbox() {
	      !!this.getSaveForAllCheckboxContainer() && BX.addClass(this.getSaveForAllCheckboxContainer(), this.settings.classHide);
	    },
	    /**
	     * Gets popup bind element
	     * @return {?HTMLElement}
	     */
	    getPopupBindElement: function getPopupBindElement() {
	      if (!this.popupBindElement) {
	        var selector = this.settings.get('POPUP_BIND_ELEMENT_SELECTOR');
	        var result = null;
	        if (BX.type.isNotEmptyString(selector)) {
	          result = BX.Filter.Utils.getBySelector(document, selector);
	        }
	        this.popupBindElement = !!result ? result : this.getSearch().getContainer();
	      }
	      return this.popupBindElement;
	    },
	    /**
	     * Gets filter popup window instance
	     * @return {BX.PopupWindow}
	     */
	    getPopup: function getPopup() {
	      if (!(this.popup instanceof BX.PopupWindow)) {
	        this.popup = new BX.PopupWindow(this.getParam('FILTER_ID') + this.settings.searchContainerPostfix, this.getPopupBindElement(), {
	          autoHide: false,
	          offsetTop: parseInt(this.settings.get('POPUP_OFFSET_TOP')),
	          offsetLeft: parseInt(this.settings.get('POPUP_OFFSET_LEFT')),
	          lightShadow: true,
	          closeIcon: false,
	          closeByEsc: false,
	          noAllPaddings: true,
	          zIndex: 12
	        });
	        this.popup.setContent(this.getTemplate());
	        BX.bind(this.getFieldListContainer(), 'keydown', BX.delegate(this._onFieldsContainerKeydown, this));
	        BX.bind(this.getFilter(), 'click', BX.delegate(this._onFilterClick, this));
	        BX.bind(this.getAddPresetButton(), 'click', BX.delegate(this._onAddPresetClick, this));
	        BX.bind(this.getPreset().getAddPresetFieldInput(), 'keydown', BX.delegate(this._onAddPresetKeydown, this));
	        BX.bind(this.getPreset().getContainer(), 'keydown', BX.delegate(this._onPresetInputKeydown, this));
	        BX.bind(this.getSaveButton(), 'click', BX.delegate(this._onSaveButtonClick, this));
	        BX.bind(this.getCancelButton(), 'click', BX.delegate(this._onCancelButtonClick, this));
	        BX.bind(this.getFindButton(), 'click', BX.delegate(this._onFindButtonClick, this));
	        BX.bind(this.getResetButton(), 'click', BX.delegate(this._onResetButtonClick, this));
	        BX.bind(this.getAddField(), 'click', BX.delegate(this._onAddFieldClick, this));
	        BX.bind(this.getEditButton(), 'click', BX.delegate(this._onEditButtonClick, this));
	        BX.bind(this.getRestoreButton(), 'click', BX.delegate(this._onRestoreButtonClick, this));
	        BX.bind(this.getRestoreFieldsButton(), 'click', BX.delegate(this._onRestoreFieldsButtonClick, this));
	        this.getFilter().addEventListener('mousedown', BX.delegate(this._onFilterMousedown, this), true);
	        this.getPreset().showCurrentPresetFields();
	        this.getPreset().bindOnPresetClick();
	      }
	      return this.popup;
	    },
	    _onRestoreFieldsButtonClick: function _onRestoreFieldsButtonClick() {
	      this.restoreDefaultFields();
	    },
	    /**
	     * Restores default fields list
	     */
	    restoreDefaultFields: function restoreDefaultFields() {
	      var defaultPreset = this.getPreset().getPreset('default_filter', true);
	      var presets = this.getParam('PRESETS');
	      var currentPresetId = this.getPreset().getCurrentPresetId();
	      var params = {
	        'FILTER_ID': this.getParam('FILTER_ID'),
	        'GRID_ID': this.getParam('GRID_ID'),
	        'action': 'SET_FILTER'
	      };
	      var fields = defaultPreset.FIELDS.map(function (curr) {
	        return curr.NAME;
	      });
	      var rows = fields.join(',');
	      presets.forEach(function (current, index) {
	        if (current.ID === 'default_filter') {
	          presets[index] = BX.clone(defaultPreset);
	        }
	      }, this);
	      if (BX.type.isArray(this.editablePresets)) {
	        this.editablePresets.forEach(function (current, index) {
	          if (current.ID === 'default_filter') {
	            this.editablePresets[index] = BX.clone(defaultPreset);
	          }
	        }, this);
	      }
	      this.getPreset().applyPreset(currentPresetId);
	      this.updatePreset(currentPresetId);
	      this.saveOptions({
	        preset_id: "default_filter",
	        rows: rows,
	        save: "Y",
	        apply_filter: "N"
	      }, params);
	    },
	    /**
	     * Gets restore default fields button
	     * @return {?HTMLElement}
	     */
	    getRestoreFieldsButton: function getRestoreFieldsButton() {
	      if (!this.restoreFieldsButton) {
	        this.restoreFieldsButton = BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classRestoreFieldsButton);
	      }
	      return this.restoreFieldsButton;
	    },
	    /**
	     * Restores filter
	     */
	    restoreFilter: function restoreFilter() {
	      var defaultPresets = this.getParam('DEFAULT_PRESETS');
	      var allPresets = this.getParam('PRESETS');
	      var isReplace = false;
	      var replaceIndex, applyPresetId, presetNode;
	      if (BX.type.isArray(defaultPresets)) {
	        defaultPresets.sort(function (a, b) {
	          return a.SORT - b.SORT;
	        });
	        defaultPresets.forEach(function (defPreset) {
	          isReplace = allPresets.some(function (current, index) {
	            if (current.ID === defPreset.ID) {
	              replaceIndex = index;
	              return true;
	            }
	          });
	          if (isReplace) {
	            allPresets[replaceIndex] = BX.clone(defPreset);
	          } else {
	            allPresets.push(BX.clone(defPreset));
	          }
	          if (defPreset.ID !== 'default_filter') {
	            this.addSidebarItem(defPreset.ID, defPreset.TITLE, defPreset.IS_PINNED);
	            if (defPreset.IS_PINNED) {
	              applyPresetId = defPreset.ID;
	            }
	          }
	        }, this);
	      }
	      this.saveRestoreFilter();
	      this.disableAddPreset();
	      this.disableEdit();
	      if (!applyPresetId) {
	        applyPresetId = "default_filter";
	      }
	      presetNode = this.getPreset().getPresetNodeById(applyPresetId);
	      if (presetNode) {
	        BX.fireEvent(presetNode, 'click');
	      }
	    },
	    saveRestoreFilter: function saveRestoreFilter() {
	      var params = {
	        'FILTER_ID': this.getParam('FILTER_ID'),
	        'GRID_ID': this.getParam('GRID_ID'),
	        'action': 'RESTORE_FILTER'
	      };
	      var presets = this.getParam('PRESETS');
	      var data = {};
	      var rows;
	      if (BX.type.isArray(presets)) {
	        presets.forEach(function (current) {
	          rows = current.FIELDS.map(function (field) {
	            return field.NAME;
	          });
	          rows = rows.join(',');
	          data[current.ID] = {
	            name: current.TITLE || null,
	            sort: current.SORT,
	            preset_id: current.ID,
	            fields: this.prepareFields(current.FIELDS),
	            rows: rows,
	            for_all: current.FOR_ALL
	          };
	        }, this);
	        this.saveOptions(data, params);
	      }
	    },
	    /**
	     * Prepares fields
	     * @param {object[]} fields
	     * @return {object}
	     */
	    prepareFields: function prepareFields(fields) {
	      var result = {};
	      var valuesKeys;
	      if (BX.type.isArray(fields)) {
	        fields.forEach(function (current) {
	          if (current.TYPE === this.types.SELECT) {
	            result[current.NAME] = 'VALUE' in current.VALUE ? current.VALUE.VALUE : '';
	          }
	          if (current.TYPE === this.types.MULTI_SELECT) {
	            current.VALUE.forEach(function (val, i) {
	              result[current.NAME] = result[current.NAME] || {};
	              result[current.NAME][i] = val.VALUE;
	            });
	            result[current.NAME] = result[current.NAME] || '';
	          }
	          if (current.TYPE === this.types.DATE || current.TYPE === this.types.NUMBER) {
	            valuesKeys = Object.keys(current.VALUES);
	            valuesKeys.forEach(function (key) {
	              result[current.NAME + key] = current.VALUES[key];
	            });
	            if (current.TYPE === this.types.DATE) {
	              result[current.NAME + '_datesel'] = 'VALUE' in current.SUB_TYPE ? current.SUB_TYPE.VALUE : current.SUB_TYPES[0].VALUE;
	            }
	            if (current.TYPE === this.types.NUMBER) {
	              result[current.NAME + '_numsel'] = 'VALUE' in current.SUB_TYPE ? current.SUB_TYPE.VALUE : current.SUB_TYPES[0].VALUE;
	            }
	          }
	          if (current.TYPE === this.types.DEST_SELECTOR || current.TYPE === this.types.ENTITY_SELECTOR || current.TYPE === this.types.CUSTOM_ENTITY) {
	            result[current.NAME + '_label'] = current.VALUES._label;
	            result[current.NAME + '_value'] = current.VALUES._value;
	          }
	        }, this);
	      }
	      return result;
	    },
	    /**
	     * Gets restore button
	     * @return {?HTMLElement}
	     */
	    getRestoreButton: function getRestoreButton() {
	      if (!BX.type.isDomNode(this.restoreButton)) {
	        this.restoreButton = BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classRestoreButton);
	      }
	      return this.restoreButton;
	    },
	    _onPresetInputKeydown: function _onPresetInputKeydown(event) {
	      if (BX.Filter.Utils.isKey(event, 'enter') && event.target.tagName === 'INPUT') {
	        BX.fireEvent(this.getSaveButton(), 'click');
	      }
	    },
	    _onFieldsContainerKeydown: function _onFieldsContainerKeydown(event) {
	      if (BX.Filter.Utils.isKey(event, 'enter') && event.target.tagName === 'INPUT') {
	        BX.fireEvent(this.getFindButton(), 'click');
	      }
	    },
	    _onFindButtonClick: function _onFindButtonClick() {
	      this.setIsSetOutsideState(false);
	      var presets = this.getPreset();
	      var currentPresetId = presets.getCurrentPresetId();
	      var promise;
	      if (currentPresetId !== 'tmp_filter' && currentPresetId !== 'default_filter' && !presets.isPresetValuesModified(currentPresetId)) {
	        var preset = presets.getPreset(currentPresetId);
	        var additional = presets.getAdditionalValues(currentPresetId);
	        var rows = presets.getFields().map(function (current) {
	          return BX.data(current, 'name');
	        });
	        preset.ADDITIONAL = this.preparePresetFields(additional, rows);
	        preset.ADDITIONAL = preset.ADDITIONAL.filter(function (field) {
	          return !this.getPreset().isEmptyField(field);
	        }, this);
	        promise = this.applyFilter(false, currentPresetId);
	        this.closePopup();
	      } else {
	        presets.deactivateAllPresets();
	        promise = this.applyFilter();
	        this.closePopup();
	      }
	      return promise;
	    },
	    _onResetButtonClick: function _onResetButtonClick() {
	      if (this.getParam('VALUE_REQUIRED')) {
	        var preset = this.getPreset().getCurrentPresetData();
	        if (preset.ADDITIONAL.length) {
	          this.closePopup();
	        }
	        BX.fireEvent(this.getSearch().getClearButton(), 'click');
	      } else {
	        if (this.getParam('RESET_TO_DEFAULT_MODE')) {
	          this.getSearch().clearInput();
	          this.getPreset().applyPinnedPreset();
	        } else {
	          this.resetFilter();
	        }
	        this.closePopup();
	      }
	    },
	    /**
	     * @param withoutSearch
	     * @return {BX.Promise}
	     */
	    resetFilter: function resetFilter(withoutSearch) {
	      var Search = this.getSearch();
	      var Presets$$1 = this.getPreset();
	      if (!withoutSearch) {
	        Search.clearInput();
	      }
	      Search.removePreset();
	      Presets$$1.deactivateAllPresets();
	      Presets$$1.resetPreset(true);
	      Search.hideClearButton();
	      Search.adjustPlaceholder();
	      return this.applyFilter(true, true);
	    },
	    _onEditButtonClick: function _onEditButtonClick() {
	      if (!this.isEditEnabled()) {
	        this.enableEdit();
	      } else {
	        this.disableEdit();
	      }
	    },
	    /**
	     * Enables fields drag and drop
	     */
	    enableFieldsDragAndDrop: function enableFieldsDragAndDrop() {
	      var fields = this.getPreset().getFields();
	      this.fieldsList = [];
	      if (BX.type.isArray(fields)) {
	        this.fieldsList = fields.map(this.registerDragItem, this);
	      }
	    },
	    /**
	     * Register drag item
	     * @param {HTMLElement} item
	     * @return {HTMLElement}
	     */
	    registerDragItem: function registerDragItem(item) {
	      var dragButton = this.getDragButton(item);
	      if (dragButton) {
	        dragButton.onbxdragstart = BX.delegate(this._onFieldDragStart, this);
	        dragButton.onbxdragstop = BX.delegate(this._onFieldDragStop, this);
	        dragButton.onbxdrag = BX.delegate(this._onFieldDrag, this);
	        jsDD.registerObject(dragButton);
	        jsDD.registerDest(dragButton);
	      }
	      return item;
	    },
	    /**
	     * Unregister drag item
	     * @param {HTMLElement} item
	     */
	    unregisterDragItem: function unregisterDragItem(item) {
	      var dragButton = this.getDragButton(item);
	      if (dragButton) {
	        jsDD.unregisterObject(dragButton);
	        jsDD.unregisterDest(dragButton);
	      }
	    },
	    _onFieldDragStart: function _onFieldDragStart() {
	      this.dragItem = this.getFields().getField(jsDD.current_node);
	      this.dragIndex = BX.Filter.Utils.getIndex(this.fieldsList, this.dragItem);
	      this.dragRect = this.dragItem.getBoundingClientRect();
	      this.offset = this.dragRect.height;
	      this.dragStartOffset = jsDD.start_y - (this.dragRect.top + BX.scrollTop(window));
	      BX.Filter.Utils.styleForEach(this.fieldsList, {
	        'transition': '100ms'
	      });
	      BX.addClass(this.dragItem, this.settings.classPresetOndrag);
	      BX.bind(document, 'mousemove', BX.delegate(this._onMouseMove, this));
	    },
	    _onFieldDragStop: function _onFieldDragStop() {
	      BX.unbind(document, 'mousemove', BX.delegate(this._onMouseMove, this));
	      BX.removeClass(this.dragItem, this.settings.classPresetOndrag);
	      BX.Filter.Utils.styleForEach(this.fieldsList, {
	        'transition': '',
	        'transform': ''
	      });
	      BX.Filter.Utils.collectionSort(this.dragItem, this.targetItem);
	      this.fieldsList = this.getPreset().getFields();
	      this.saveFieldsSort();
	    },
	    _onFieldDrag: function _onFieldDrag() {
	      var self = this;
	      var currentRect, currentMiddle;
	      this.dragOffset = this.realY - this.dragRect.top - this.dragStartOffset;
	      this.sortOffset = self.realY + BX.scrollTop(window);
	      BX.Filter.Utils.styleForEach([this.dragItem], {
	        'transition': '0ms',
	        'transform': 'translate3d(0px, ' + this.dragOffset + 'px, 0px)'
	      });
	      this.fieldsList.forEach(function (current, index) {
	        if (current) {
	          currentRect = current.getBoundingClientRect();
	          currentMiddle = currentRect.top + BX.scrollTop(window) + currentRect.height / 2;
	          if (index > self.dragIndex && self.sortOffset > currentMiddle && current.style.transform !== 'translate3d(0px, ' + -self.offset + 'px, 0px)' && current.style.transform !== '') {
	            self.targetItem = current;
	            BX.style(current, 'transform', 'translate3d(0px, ' + -self.offset + 'px, 0px)');
	            BX.style(current, 'transition', '300ms');
	          }
	          if (index < self.dragIndex && self.sortOffset < currentMiddle && current.style.transform !== 'translate3d(0px, ' + self.offset + 'px, 0px)' && current.style.transform !== '') {
	            self.targetItem = current;
	            BX.style(current, 'transform', 'translate3d(0px, ' + self.offset + 'px, 0px)');
	            BX.style(current, 'transition', '300ms');
	          }
	          if ((index < self.dragIndex && self.sortOffset > currentMiddle || index > self.dragIndex && self.sortOffset < currentMiddle) && current.style.transform !== 'translate3d(0px, 0px, 0px)') {
	            if (current.style.transform !== '') {
	              self.targetItem = current;
	            }
	            BX.style(current, 'transform', 'translate3d(0px, 0px, 0px)');
	            BX.style(current, 'transition', '300ms');
	          }
	        }
	      });
	    },
	    /**
	     * Disables fields drag and drop
	     */
	    disableFieldsDragAndDrop: function disableFieldsDragAndDrop() {
	      if (BX.type.isArray(this.fieldsList) && this.fieldsList.length) {
	        this.fieldsList.map(this.unregisterDragItem, this);
	      }
	    },
	    /**
	     * Enables presets drag and drop
	     */
	    enablePresetsDragAndDrop: function enablePresetsDragAndDrop() {
	      var Preset, presets, dragButton, presetId;
	      Preset = this.getPreset();
	      presets = Preset.getPresets();
	      this.presetsList = [];
	      if (BX.type.isArray(presets) && presets.length) {
	        presets.forEach(function (current) {
	          presetId = Preset.getPresetId(current);
	          if (!BX.hasClass(current, this.settings.classAddPresetField) && presetId !== 'default_filter' && !BX.hasClass(current, this.settings.classDefaultFilter)) {
	            dragButton = this.getDragButton(current);
	            dragButton.onbxdragstart = BX.delegate(this._onDragStart, this);
	            dragButton.onbxdragstop = BX.delegate(this._onDragStop, this);
	            dragButton.onbxdrag = BX.delegate(this._onDrag, this);
	            jsDD.registerObject(dragButton);
	            jsDD.registerDest(dragButton);
	            this.presetsList.push(current);
	          }
	        }, this);
	      }
	    },
	    /**
	     * Gets drag button
	     * @param {HTMLElement} presetNode
	     * @return {?HTMLElement}
	     */
	    getDragButton: function getDragButton(presetNode) {
	      return BX.Filter.Utils.getByClass(presetNode, this.settings.classPresetDragButton);
	    },
	    /**
	     * Disables presets drag and drop
	     */
	    disablePresetsDragAndDrop: function disablePresetsDragAndDrop() {
	      if (BX.type.isArray(this.presetsList) && this.presetsList.length) {
	        this.presetsList.forEach(function (current) {
	          if (!BX.hasClass(current, this.settings.classAddPresetField)) {
	            jsDD.unregisterObject(current);
	            jsDD.unregisterDest(current);
	          }
	        }, this);
	      }
	    },
	    _onDragStart: function _onDragStart() {
	      this.dragItem = this.getPreset().normalizePreset(jsDD.current_node);
	      this.dragIndex = BX.Filter.Utils.getIndex(this.presetsList, this.dragItem);
	      this.dragRect = this.dragItem.getBoundingClientRect();
	      this.offset = this.dragRect.height;
	      this.dragStartOffset = jsDD.start_y - (this.dragRect.top + BX.scrollTop(window));
	      BX.Filter.Utils.styleForEach(this.list, {
	        'transition': '100ms'
	      });
	      BX.addClass(this.dragItem, this.settings.classPresetOndrag);
	      BX.bind(document, 'mousemove', BX.delegate(this._onMouseMove, this));
	    },
	    _onMouseMove: function _onMouseMove(event) {
	      this.realX = event.clientX;
	      this.realY = event.clientY;
	    },
	    /**
	     * Gets drag offset
	     * @return {number}
	     */
	    getDragOffset: function getDragOffset() {
	      return jsDD.x - this.startDragOffset - this.dragRect.left;
	    },
	    _onDragStop: function _onDragStop() {
	      var Preset, presets;
	      BX.unbind(document, 'mousemove', BX.delegate(this._onMouseMove, this));
	      BX.removeClass(this.dragItem, this.settings.classPresetOndrag);
	      BX.Filter.Utils.styleForEach(this.presetsList, {
	        'transition': '',
	        'transform': ''
	      });
	      BX.Filter.Utils.collectionSort(this.dragItem, this.targetItem);
	      Preset = this.getPreset();
	      presets = Preset.getPresets();
	      this.presetsList = [];
	      if (BX.type.isArray(presets) && presets.length) {
	        presets.forEach(function (current) {
	          if (!BX.hasClass(current, this.settings.classAddPresetField) && !BX.hasClass(current, this.settings.classDefaultFilter)) {
	            this.presetsList.push(current);
	          }
	        }, this);
	      }
	    },
	    _onDrag: function _onDrag() {
	      var self = this;
	      var currentRect, currentMiddle;
	      this.dragOffset = this.realY - this.dragRect.top - this.dragStartOffset;
	      this.sortOffset = self.realY + BX.scrollTop(window);
	      BX.Filter.Utils.styleForEach([this.dragItem], {
	        'transition': '0ms',
	        'transform': 'translate3d(0px, ' + this.dragOffset + 'px, 0px)'
	      });
	      this.presetsList.forEach(function (current, index) {
	        if (current) {
	          currentRect = current.getBoundingClientRect();
	          currentMiddle = currentRect.top + BX.scrollTop(window) + currentRect.height / 2;
	          if (index > self.dragIndex && self.sortOffset > currentMiddle && current.style.transform !== 'translate3d(0px, ' + -self.offset + 'px, 0px)' && current.style.transform !== '') {
	            self.targetItem = current;
	            BX.style(current, 'transform', 'translate3d(0px, ' + -self.offset + 'px, 0px)');
	            BX.style(current, 'transition', '300ms');
	          }
	          if (index < self.dragIndex && self.sortOffset < currentMiddle && current.style.transform !== 'translate3d(0px, ' + self.offset + 'px, 0px)' && current.style.transform !== '') {
	            self.targetItem = current;
	            BX.style(current, 'transform', 'translate3d(0px, ' + self.offset + 'px, 0px)');
	            BX.style(current, 'transition', '300ms');
	          }
	          if ((index < self.dragIndex && self.sortOffset > currentMiddle || index > self.dragIndex && self.sortOffset < currentMiddle) && current.style.transform !== 'translate3d(0px, 0px, 0px)') {
	            if (current.style.transform !== '') {
	              self.targetItem = current;
	            }
	            BX.style(current, 'transform', 'translate3d(0px, 0px, 0px)');
	            BX.style(current, 'transition', '300ms');
	          }
	        }
	      });
	    },
	    /**
	     * Gets sidebar controls container
	     * @return {?HTMLElement}
	     */
	    getSidebarControlsContainer: function getSidebarControlsContainer() {
	      if (!BX.type.isDomNode(this.sidebarControlsContainer)) {
	        this.sidebarControlsContainer = BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classSidebarControlsContainer);
	      }
	      return this.sidebarControlsContainer;
	    },
	    /**
	     * Enables edit mode
	     */
	    enableEdit: function enableEdit() {
	      var Preset = this.getPreset();
	      var presets = Preset.getPresets();
	      var presetId;
	      if (BX.type.isArray(presets) && presets.length) {
	        presets.forEach(function (current) {
	          presetId = Preset.getPresetId(current);
	          if (!BX.hasClass(current, this.settings.classAddPresetField) && presetId !== 'default_filter') {
	            BX.addClass(current, this.settings.classPresetEdit);
	          }
	        }, this);
	      }
	      this.enablePresetsDragAndDrop();
	      BX.show(this.getButtonsContainer());
	      BX.hide(this.getPresetButtonsContainer());
	      BX.addClass(this.getSidebarControlsContainer(), this.settings.classDisabled);
	      this.editablePresets = BX.clone(this.getParam('PRESETS'));
	      this.isEditEnabledState = true;
	    },
	    /**
	     * Disables edit mode
	     */
	    disableEdit: function disableEdit() {
	      var Preset = this.getPreset();
	      var presets = Preset.getPresets();
	      if (BX.type.isArray(presets) && presets.length) {
	        presets.forEach(function (current) {
	          if (!BX.hasClass(current, this.settings.classAddPresetField)) {
	            BX.removeClass(current, this.settings.classPresetEdit);
	            this.getPreset().disableEditPresetName(current);
	          }
	        }, this);
	      }
	      this.disablePresetsDragAndDrop();
	      if (!this.isAddPresetEnabled()) {
	        BX.style(this.getButtonsContainer(), 'display', '');
	      }
	      BX.show(this.getPresetButtonsContainer());
	      BX.removeClass(this.getSidebarControlsContainer(), this.settings.classDisabled);
	      this.editablePresets = null;
	      this.isEditEnabledState = false;
	      this.applyFilter(null, true);
	    },
	    /**
	     * Get preset buttons container
	     * @return {?HTMLElement}
	     */
	    getPresetButtonsContainer: function getPresetButtonsContainer() {
	      if (!BX.type.isDomNode(this.presetButtonsContainer)) {
	        this.presetButtonsContainer = BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classPresetButtonsContainer);
	      }
	      return this.presetButtonsContainer;
	    },
	    /**
	     * Checks is edit mode enabled
	     * @return {boolean}
	     */
	    isEditEnabled: function isEditEnabled() {
	      return this.isEditEnabledState;
	    },
	    /**
	     * Gets edit button element
	     * @return {?HTMLElement}
	     */
	    getEditButton: function getEditButton() {
	      return BX.Filter.Utils.getByClass(this.getFilter(), this.settings.classEditButton);
	    },
	    /**
	     * Gets component param by param name
	     * @param {string} paramName
	     * @param {*} [defaultValue] - Be returns if param with paramName not set
	     * @returns {*}
	     */
	    getParam: function getParam(paramName, defaultValue) {
	      return paramName in this.params ? this.params[paramName] : defaultValue;
	    },
	    /**
	     * Gets container of filter popup
	     * @returns {HTMLElement|null}
	     */
	    getFilter: function getFilter() {
	      return BX.Filter.Utils.getByClass(this.getPopup().contentContainer, this.settings.classFilterContainer);
	    },
	    /**
	     * @returns {BX.Filter.Search}
	     */
	    getSearch: function getSearch() {
	      if (!(this.search instanceof BX.Filter.Search)) {
	        this.search = new BX.Filter.Search(this);
	      }
	      return this.search;
	    },
	    _onRestoreButtonClick: function _onRestoreButtonClick() {
	      var action = {
	        CONFIRM: true,
	        CONFIRM_MESSAGE: this.getParam('CONFIRM_MESSAGE'),
	        CONFIRM_APPLY_BUTTON: this.getParam('CONFIRM_APPLY'),
	        CONFIRM_CANCEL_BUTTON: this.getParam('CONFIRM_CANCEL')
	      };
	      this.confirmDialog(action, BX.delegate(this.restoreFilter, this));
	    },
	    /**
	     * Shows confirmation popup
	     * @param {object} action - Popup properties
	     * @param {boolean} action.CONFIRM - true If the user must confirm the action
	     * @param {string} action.CONFIRM_MESSAGE - Message of confirm popup
	     * @param {string} action.CONFIRM_APPLY_BUTTON - Text of apply button
	     * @param {string} action.CONFIRM_CANCEL_BUTTON - Text of cancel button
	     * @param {string} [action.CONFIRM_TITLE] - Title of confirm popup
	     * @param {function} then - Callback after a successful confirmation
	     * @param {function} [cancel] - callback after cancel confirmation
	     */
	    confirmDialog: function confirmDialog(action, then, cancel) {
	      if ('CONFIRM' in action && action.CONFIRM) {
	        var dialogId = this.getParam('FILTER_ID') + '-confirm-dialog';
	        var popupMessage = '<div class="main-ui-filter-confirm-content">' + action.CONFIRM_MESSAGE + '</div>';
	        var popupTitle = 'CONFIRM_TITLE' in action ? action.CONFIRM_TITLE : '';
	        var applyButton = new BX.PopupWindowButton({
	          text: action.CONFIRM_APPLY_BUTTON,
	          events: {
	            click: function click() {
	              BX.type.isFunction(then) ? then() : null;
	              this.popupWindow.close();
	              this.popupWindow.destroy();
	            }
	          }
	        });
	        var cancelButton = new BX.PopupWindowButtonLink({
	          text: action.CONFIRM_CANCEL_BUTTON,
	          events: {
	            click: function click() {
	              BX.type.isFunction(cancel) ? cancel() : null;
	              this.popupWindow.close();
	              this.popupWindow.destroy();
	            }
	          }
	        });
	        var dialog = new BX.PopupWindow(dialogId, null, {
	          content: popupMessage,
	          titleBar: popupTitle,
	          autoHide: false,
	          zIndex: 9999,
	          overlay: 0.4,
	          offsetTop: -100,
	          closeIcon: true,
	          closeByEsc: true,
	          buttons: [applyButton, cancelButton]
	        });
	        BX.addCustomEvent(dialog, 'onPopupClose', BX.delegate(function () {
	          !!this.getSaveForAllCheckbox() && (this.getSaveForAllCheckbox().checked = null);
	        }, this));
	        if (!dialog.isShown()) {
	          dialog.show();
	          var popupContainer = dialog.popupContainer;
	          BX.removeClass(popupContainer, this.settings.classAnimationShow);
	          BX.addClass(popupContainer, this.settings.classAnimationShow);
	        }
	      } else {
	        BX.type.isFunction(then) ? then() : null;
	      }
	    },
	    getInitialValue: function getInitialValue(name) {
	      if (BX.type.isString(name)) {
	        var values = this.params.INITIAL_FILTER;
	        if (BX.type.isPlainObject(values)) {
	          var filteredEntries = Object.entries(values).reduce(function (acc, item) {
	            if (item[0].startsWith(name)) {
	              acc.push(item);
	            }
	            return acc;
	          }, []);
	          if (filteredEntries.length === 1) {
	            return filteredEntries[0][1];
	          }
	          if (filteredEntries.length > 1) {
	            return filteredEntries.reduce(function (acc, item) {
	              acc[item[0].replace(name, '')] = item[1];
	              return acc;
	            }, {});
	          }
	        }
	      }
	      return '';
	    },
	    getField: function getField(name) {
	      var node = this.getFieldListContainer().querySelector('[data-name="' + name + '"]');
	      return BX.Filter.Field.instances.get(node);
	    },
	    isSetOutside: function isSetOutside() {
	      return BX.Text.toBoolean(this.isSetOutsideState);
	    },
	    setIsSetOutsideState: function setIsSetOutsideState(state) {
	      this.isSetOutsideState = BX.Text.toBoolean(state);
	      var searchContainer = this.getSearch().getContainer();
	      if (this.isSetOutsideState) {
	        BX.Dom.addClass(searchContainer, 'main-ui-filter-set-outside');
	        BX.Dom.removeClass(searchContainer, 'main-ui-filter-set-inside');
	      } else {
	        BX.Dom.addClass(searchContainer, 'main-ui-filter-set-inside');
	        BX.Dom.removeClass(searchContainer, 'main-ui-filter-set-outside');
	      }
	    },
	    setDefaultPresetAppliedState: function setDefaultPresetAppliedState(state) {
	      this.isDefaultPresetAppliedState = BX.Text.toBoolean(state);
	      var searchContainer = this.getSearch().getContainer();
	      if (this.isDefaultPresetAppliedState) {
	        BX.Dom.addClass(searchContainer, 'main-ui-filter-default-applied');
	      } else {
	        BX.Dom.removeClass(searchContainer, 'main-ui-filter-default-applied');
	      }
	    }
	  };
	})();
	(function () {
	  BX.Main.filterManager = {
	    data: {},
	    push: function push(id, instance) {
	      if (BX.type.isNotEmptyString(id) && instance) {
	        this.data[id] = instance;
	      }
	    },
	    getById: function getById(id) {
	      var result = null;
	      if (id in this.data) {
	        result = this.data[id];
	      }
	      return result;
	    },
	    getList: function getList() {
	      return Object.values(this.data);
	    }
	  };
	})();

	var _templateObject$2;
	function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
	function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$3(Object(source), !0).forEach(function (key) { babelHelpers.defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
	var onValueChange = Symbol('onValueChange');
	var Field = /*#__PURE__*/function (_Event$EventEmitter) {
	  babelHelpers.inherits(Field, _Event$EventEmitter);
	  function Field(options) {
	    var _this;
	    babelHelpers.classCallCheck(this, Field);
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(Field).call(this, options));
	    _this.setEventNamespace('BX.Filter.Field');
	    _this.id = options.options.NAME;
	    _this.parent = options.parent;
	    _this.node = options.node;
	    _this.options = _objectSpread$3({}, options.options);
	    _this.cache = new main_core.Cache.MemoryCache();
	    _this[onValueChange] = _this[onValueChange].bind(babelHelpers.assertThisInitialized(_this));
	    main_core.Event.bind(_this.node, 'input', _this[onValueChange]);
	    main_core.Event.bind(_this.node, 'change', _this[onValueChange]);
	    var clearButtons = babelHelpers.toConsumableArray(_this.node.querySelectorAll('.main-ui-control-value-delete'));
	    clearButtons.forEach(function (button) {
	      button.addEventListener('click', function () {
	        setTimeout(function () {
	          _this[onValueChange]();
	        });
	      });
	    });
	    var MO = new MutationObserver(function () {
	      _this[onValueChange]();
	    });
	    var selects = babelHelpers.toConsumableArray(_this.node.querySelectorAll('.main-ui-select'));
	    selects.forEach(function (select) {
	      MO.observe(select, {
	        attributes: true,
	        attributeFilter: ['data-value']
	      });
	    });
	    Field.instances.set(_this.node, babelHelpers.assertThisInitialized(_this));
	    return _this;
	  }
	  babelHelpers.createClass(Field, [{
	    key: "subscribe",
	    value: function subscribe(eventName, listener) {
	      main_core.Event.EventEmitter.subscribe(this, eventName.replace('BX.Filter.Field:', ''), listener);
	    }
	  }, {
	    key: onValueChange,
	    value: function value() {
	      this.emit('change', {
	        field: this,
	        value: this.getValue()
	      });
	    }
	    /**
	     * @private
	     * @return {HTMLDivElement}
	     */
	  }, {
	    key: "getAdditionalFieldContainer",
	    value: function getAdditionalFieldContainer() {
	      return this.cache.remember('additionalFieldsContainer', function () {
	        return main_core.Tag.render(_templateObject$2 || (_templateObject$2 = babelHelpers.taggedTemplateLiteral(["\n\t\t\t\t<div class=\"main-ui-filter-additional-fields-container\"></div>\n\t\t\t"])));
	      });
	    }
	    /**
	     * @private
	     * @return {boolean}
	     */
	  }, {
	    key: "hasAdditional",
	    value: function hasAdditional() {
	      return main_core.Dom.hasClass(this.node, 'main-ui-filter-field-with-additional-fields');
	    }
	  }, {
	    key: "addAdditionalField",
	    value: function addAdditionalField(field) {
	      if (!this.hasAdditional()) {
	        main_core.Dom.addClass(this.node, 'main-ui-filter-field-with-additional-fields');
	        main_core.Dom.append(this.getAdditionalFieldContainer(), this.node);
	      }
	      var preset = this.parent.getPreset();
	      var options = this.prepareFieldOptions(field);
	      var renderedField = preset.createControl(options);
	      this.appendRenderedField(renderedField);
	      return Field.instances.get(renderedField);
	    } // eslint-disable-next-line class-methods-use-this
	  }, {
	    key: "prepareListItems",
	    value: function prepareListItems() {
	      var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
	      if (main_core.Type.isPlainObject(items)) {
	        return Object.entries(items).map(function (_ref) {
	          var _ref2 = babelHelpers.slicedToArray(_ref, 2),
	            VALUE = _ref2[0],
	            NAME = _ref2[1];
	          return {
	            NAME: NAME,
	            VALUE: VALUE
	          };
	        });
	      }
	      return {};
	    }
	    /**
	     * @private
	     * @return {object}
	     */
	  }, {
	    key: "prepareFieldOptions",
	    value: function prepareFieldOptions(options) {
	      var _this2 = this;
	      if (main_core.Type.isPlainObject(options)) {
	        var stubs = this.parent.params.FIELDS_STUBS;
	        var _options$type = options.type,
	          type = _options$type === void 0 ? 'string' : _options$type;
	        var stub = stubs.find(function (item) {
	          return item.NAME === type;
	        });
	        if (main_core.Type.isPlainObject(stub)) {
	          var baseField = _objectSpread$3(_objectSpread$3({}, stub), {}, {
	            NAME: options.id,
	            LABEL: options.name,
	            TYPE: type === 'checkbox' ? 'SELECT' : stub.TYPE,
	            VALUE_REQUIRED: options.valueRequired === true
	          });
	          if (type === 'list') {
	            return _objectSpread$3(_objectSpread$3({}, baseField), {}, {
	              ITEMS: [].concat(babelHelpers.toConsumableArray(baseField.ITEMS), [this.prepareListItems(options.items)]),
	              params: {
	                isMulti: function () {
	                  if (main_core.Type.isPlainObject(options.params)) {
	                    return options.params === true;
	                  }
	                  return false;
	                }()
	              }
	            });
	          }
	          if (type === 'date') {
	            var subType = function () {
	              if (main_core.Type.isPlainObject(options.value) && Reflect.has(options.value, '_datesel')) {
	                // eslint-disable-next-line no-underscore-dangle
	                return options.value._datesel;
	              }
	              return _this2.parent.dateTypes.NONE;
	            }();
	            return _objectSpread$3(_objectSpread$3({}, baseField), {}, {
	              SUB_TYPES: function () {
	                if (main_core.Type.isArray(options.exclude)) {
	                  return baseField.SUB_TYPES.filter(function (item) {
	                    return !options.exclude.includes(item.VALUE);
	                  });
	                }
	                return baseField.SUB_TYPES;
	              }(),
	              SUB_TYPE: function () {
	                return baseField.SUB_TYPES.find(function (item) {
	                  return item.VALUE === subType;
	                });
	              }(),
	              VALUES: function () {
	                if (main_core.Type.isPlainObject(options.value)) {
	                  return _objectSpread$3({}, options.value);
	                }
	                return baseField.VALUES;
	              }()
	            });
	          }
	          if (type === 'string' || type === 'custom_date' || type === 'number' || type === 'checkbox' || type === 'custom_entity') {
	            return baseField;
	          }
	        }
	      }
	      return options;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "appendRenderedField",
	    value: function appendRenderedField(field) {
	      if (main_core.Type.isDomNode(field)) {
	        var additionalFieldsContainer = this.getAdditionalFieldContainer();
	        main_core.Dom.append(field, additionalFieldsContainer);
	      }
	    }
	  }, {
	    key: "getValue",
	    value: function getValue() {
	      var allValues = this.parent.getFilterFieldsValues();
	      var _this$options = this.options,
	        TYPE = _this$options.TYPE,
	        NAME = _this$options.NAME;
	      if (TYPE === 'DATE' || TYPE === 'NUMBER') {
	        return Object.entries(allValues).reduce(function (acc, _ref3) {
	          var _ref4 = babelHelpers.slicedToArray(_ref3, 2),
	            key = _ref4[0],
	            value = _ref4[1];
	          if (key.startsWith(NAME)) {
	            acc[key.replace(NAME, '')] = value;
	          }
	          return acc;
	        }, {});
	      }
	      if (NAME in allValues) {
	        return allValues[NAME];
	      }
	      return '';
	    }
	  }, {
	    key: "setValue",
	    value: function setValue(value) {
	      var _this3 = this;
	      var type = this.options.TYPE;
	      if (type === 'DATE' || type === 'NUMBER') {
	        if (main_core.Type.isPlainObject(value)) {
	          var container = this.parent.getFieldListContainer();
	          Object.entries(value).forEach(function (_ref5) {
	            var _ref6 = babelHelpers.slicedToArray(_ref5, 2),
	              key = _ref6[0],
	              fieldValue = _ref6[1];
	            var fieldNode = container.querySelector("[data-name=\"".concat(_this3.id, "\"] [data-name=\"").concat(_this3.id).concat(key, "\"], [data-name=\"").concat(_this3.id, "\"] [name=\"").concat(_this3.id).concat(key, "\"]"));
	            if (fieldNode) {
	              if (main_core.Dom.hasClass(fieldNode, 'main-ui-select')) {
	                var items = main_core.Dom.attr(fieldNode, 'data-items');
	                if (main_core.Type.isArray(items)) {
	                  var item = items.find(function (currentItem) {
	                    return currentItem.VALUE === fieldValue;
	                  });
	                  if (main_core.Type.isPlainObject(item)) {
	                    main_core.Dom.attr(fieldNode, 'data-value', item);
	                    var nameNode = fieldNode.querySelector('.main-ui-select-name');
	                    if (nameNode) {
	                      nameNode.innerText = item.NAME;
	                    }
	                    var result = BX.Main.ui.Factory.get(fieldNode);
	                    if (!result) {
	                      result = {
	                        node: fieldNode,
	                        instance: new BX.Main.ui.select(fieldNode)
	                      };
	                      BX.Main.ui.Factory.data.push(result);
	                    }
	                    if (main_core.Type.isPlainObject(result)) {
	                      BX.onCustomEvent(window, 'UI::Select::Change', [result.instance, item]);
	                    }
	                  }
	                }
	              } else if (fieldNode.tagName === 'INPUT') {
	                fieldNode.value = fieldValue;
	              }
	            }
	          });
	        }
	      }
	    }
	  }]);
	  return Field;
	}(main_core.Event.EventEmitter);
	babelHelpers.defineProperty(Field, "instances", new WeakMap());

	var Api = /*#__PURE__*/function () {
	  function Api(parent) {
	    babelHelpers.classCallCheck(this, Api);
	    /**
	     * @var {BX.Main.Filter}
	     */
	    this.parent = parent;
	  }
	  babelHelpers.createClass(Api, [{
	    key: "setFields",
	    value: function setFields(fields) {
	      if (main_core.Type.isPlainObject(fields)) {
	        this.parent.getPopup();
	        var preset = this.parent.getPreset();
	        preset.deactivateAllPresets();
	        var data = {
	          preset_id: 'tmp_filter',
	          fields: fields
	        };
	        this.parent.updateParams(data);
	        preset.applyPreset('tmp_filter');
	      }
	    }
	  }, {
	    key: "setFilter",
	    value: function setFilter(filter) {
	      var analyticsLabel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
	      this.setAnalyticsLabel(analyticsLabel);
	      if (main_core.Type.isObject(filter)) {
	        this.parent.updateParams(filter);
	        this.parent.getPreset().deactivateAllPresets();
	        this.parent.getPreset().activatePreset(filter.preset_id);
	        this.parent.getPreset().applyPreset(filter.preset_id);
	        if (!filter.checkFields || !this.parent.getPreset().isPresetValuesModified(filter.preset_id)) {
	          var isSetOutside = true;
	          this.parent.applyFilter(false, filter.preset_id, isSetOutside);
	        } else {
	          var newFields = {};
	          if (main_core.Type.isPlainObject(filter.fields)) {
	            newFields = Object.assign({}, filter.fields);
	          }
	          if (main_core.Type.isPlainObject(filter.additional)) {
	            newFields = Object.assign({}, filter.additional);
	          }
	          this.parent.getPreset().deactivateAllPresets();
	          this.setFields(newFields);
	          this.apply();
	        }
	      }
	    }
	    /**
	     * Extends current applied filter
	     * @param {Object.<String, *>} fields
	     * @param {boolean} [force = false]
	     */
	  }, {
	    key: "extendFilter",
	    value: function extendFilter(fields) {
	      var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
	      var analyticsLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
	      this.setAnalyticsLabel(analyticsLabel);
	      if (main_core.Type.isObject(fields)) {
	        Object.keys(fields).forEach(function (key) {
	          if (main_core.Type.isNumber(fields[key])) {
	            fields[key] = String(fields[key]);
	          }
	        });
	        var currentPresetId = this.parent.getPreset().getCurrentPresetId();
	        if (force || currentPresetId === 'tmp_filter' || currentPresetId === 'default_filter') {
	          var newFields = Object.assign({}, this.parent.getFilterFieldsValues(), fields);
	          this.setFields(newFields);
	          this.apply();
	          return;
	        }
	        var previewsAdditionalValues = this.parent.getPreset().getAdditionalValues(currentPresetId);
	        if (main_core.Type.isPlainObject(previewsAdditionalValues) && Object.keys(previewsAdditionalValues).length) {
	          fields = Object.assign({}, previewsAdditionalValues, fields);
	        }
	        this.setFilter({
	          preset_id: currentPresetId,
	          additional: fields,
	          checkFields: true
	        });
	      }
	    }
	  }, {
	    key: "apply",
	    value: function apply() {
	      var analyticsLabel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
	      this.setAnalyticsLabel(analyticsLabel);
	      if (!this.parent.isEditEnabled()) {
	        if (!this.parent.isEditEnabled()) {
	          var clear = false;
	          var applyPreset = false;
	          var isSetOutside = true;
	          this.parent.applyFilter(clear, applyPreset, isSetOutside);
	        }
	        this.parent.closePopup();
	        if (this.parent.isAddPresetEnabled()) {
	          this.parent.disableAddPreset();
	        }
	      }
	    }
	  }, {
	    key: "getEmitter",
	    value: function getEmitter() {
	      return this.parent.emitter;
	    }
	  }, {
	    key: "setAnalyticsLabel",
	    value: function setAnalyticsLabel() {
	      var analyticsLabel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
	      if (main_core.Type.isObject(analyticsLabel)) {
	        this.parent.analyticsLabel = analyticsLabel;
	      }
	    }
	  }]);
	  return Api;
	}();

	function createDateInputDecl(options) {
	  return {
	    block: 'main-ui-control-field',
	    type: options.type,
	    dragButton: false,
	    content: {
	      block: 'main-ui-date',
	      mix: ['filter-type-single'],
	      calendarButton: true,
	      valueDelete: true,
	      placeholder: options.placeholder,
	      name: options.name,
	      tabindex: options.tabindex,
	      value: options.value,
	      enableTime: options.enableTime
	    }
	  };
	}

	function createNumberInputDecl(options) {
	  return {
	    block: 'main-ui-control-field',
	    type: options.type,
	    dragButton: false,
	    content: {
	      block: 'main-ui-number',
	      mix: ['filter-type-single'],
	      valueDelete: true,
	      placeholder: options.placeholder,
	      name: options.name,
	      tabindex: options.tabindex,
	      value: options.value
	    }
	  };
	}

	function createLineDecl() {
	  return {
	    block: 'main-ui-filter-field-line',
	    content: {
	      block: 'main-ui-filter-field-line-item',
	      tag: 'span'
	    }
	  };
	}

	function createSelectDecl(options) {
	  return {
	    block: 'main-ui-control-field',
	    dragButton: false,
	    content: {
	      block: 'main-ui-select',
	      tabindex: options.tabindex,
	      value: options.value,
	      items: options.items,
	      name: options.name,
	      valueDelete: false
	    }
	  };
	}

	var _templateObject$3;
	function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
	function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$4(Object(source), !0).forEach(function (key) { babelHelpers.defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
	var errorMessages = new WeakMap();
	var errorMessagesTypes = new WeakMap();
	var values = new WeakMap();
	var Fields = /*#__PURE__*/function () {
	  function Fields(parent) {
	    babelHelpers.classCallCheck(this, Fields);
	    this.parent = null;
	    this.init(parent);
	  }
	  babelHelpers.createClass(Fields, [{
	    key: "init",
	    value: function init(parent) {
	      this.parent = parent;
	      BX.addCustomEvent(window, 'UI::Select::change', this._onDateTypeChange.bind(this));
	    }
	  }, {
	    key: "deleteField",
	    value: function deleteField(node) {
	      main_core.Dom.remove(node);
	    }
	  }, {
	    key: "isFieldDelete",
	    value: function isFieldDelete(node) {
	      return main_core.Dom.hasClass(node, this.parent.settings.classFieldDelete);
	    }
	  }, {
	    key: "isFieldValueDelete",
	    value: function isFieldValueDelete(node) {
	      return main_core.Dom.hasClass(node, this.parent.settings.classValueDelete) || main_core.Dom.hasClass(node.parentNode, this.parent.settings.classValueDelete);
	    }
	  }, {
	    key: "isDragButton",
	    value: function isDragButton(node) {
	      return node && main_core.Dom.hasClass(node, this.parent.settings.classPresetDragButton);
	    }
	    /**
	     * Clears values of filter field node
	     * @param {HTMLElement} field
	     */
	  }, {
	    key: "clearFieldValue",
	    value: function clearFieldValue(field) {
	      if (field) {
	        var controls = babelHelpers.toConsumableArray(field.querySelectorAll('.main-ui-control'));
	        var squares = babelHelpers.toConsumableArray(field.querySelectorAll('.main-ui-square'));
	        squares.forEach(function (square) {
	          return main_core.Dom.remove(square);
	        });
	        controls.forEach(function (control) {
	          if (Reflect.has(control, 'value')) {
	            control.value = '';
	          }
	        });
	      }
	    }
	  }, {
	    key: "getField",
	    value: function getField(node) {
	      if (main_core.Type.isDomNode(node)) {
	        return node.closest('.main-ui-control-field, .main-ui-control-field-group');
	      }
	      return null;
	    }
	  }, {
	    key: "render",
	    value: function render(template, data) {
	      if (main_core.Type.isString(template) && main_core.Type.isPlainObject(data)) {
	        var html = Object.entries(data).reduce(function (acc, _ref) {
	          var _ref2 = babelHelpers.slicedToArray(_ref, 2),
	            key = _ref2[0],
	            value = _ref2[1];
	          return acc.replace(new RegExp("{{".concat(key, "}}"), 'g'), value);
	        }, template);
	        var wrapped = main_core.Dom.create('div', {
	          html: html
	        });
	        var fieldGroup = wrapped.querySelector('.main-ui-control-field-group');
	        if (fieldGroup) {
	          return fieldGroup;
	        }
	        var field = wrapped.querySelector('.main-ui-control-field');
	        if (field) {
	          return field;
	        }
	        var fieldLine = wrapped.querySelector('.main-ui-filter-field-line');
	        if (fieldLine) {
	          return fieldLine;
	        }
	      }
	      return null;
	    }
	  }, {
	    key: "createInputText",
	    value: function createInputText(fieldData) {
	      var field = {
	        block: 'main-ui-control-field',
	        mix: this.parent.getParam('ENABLE_LABEL') ? [this.parent.settings.classFieldWithLabel] : null,
	        deleteButton: true,
	        valueDelete: true,
	        name: fieldData.NAME,
	        type: fieldData.TYPE,
	        label: this.parent.getParam('ENABLE_LABEL') ? fieldData.LABEL : '',
	        icon: this.parent.getParam('ENABLE_LABEL') && fieldData.ICON ? fieldData.ICON : null,
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_FIELD_TITLE'),
	        deleteTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_FIELD'),
	        content: [{
	          block: 'main-ui-control-string',
	          name: fieldData.NAME,
	          placeholder: fieldData.PLACEHOLDER || '',
	          value: main_core.Type.isString(fieldData.VALUE) || main_core.Type.isNumber(fieldData.VALUE) ? fieldData.VALUE : '',
	          tabindex: fieldData.TABINDEX
	        }]
	      };
	      var renderedField = BX.decl(field);
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, fieldData),
	          node: renderedField
	        })
	      });
	      return renderedField;
	    }
	  }, {
	    key: "createTextarea",
	    value: function createTextarea(fieldData) {
	      var field = BX.decl({
	        block: 'main-ui-control-field',
	        mix: this.parent.getParam('ENABLE_LABEL') ? [this.parent.settings.classFieldWithLabel] : null,
	        deleteButton: true,
	        valueDelete: true,
	        name: fieldData.NAME,
	        type: fieldData.TYPE,
	        label: this.parent.getParam('ENABLE_LABEL') ? fieldData.LABEL : '',
	        icon: this.parent.getParam('ENABLE_LABEL') && fieldData.ICON ? fieldData.ICON : null,
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_FIELD_TITLE'),
	        deleteTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_FIELD'),
	        content: [{
	          block: 'main-ui-control-textarea',
	          name: fieldData.NAME,
	          placeholder: fieldData.PLACEHOLDER || '',
	          value: main_core.Type.isString(fieldData.VALUE) || main_core.Type.isNumber(fieldData.VALUE) ? fieldData.VALUE : '',
	          tabindex: fieldData.TABINDEX
	        }]
	      });
	      var textarea = field.querySelector('textarea');
	      var onChange = function onChange() {
	        main_core.Dom.style(textarea, 'height', '1px');
	        main_core.Dom.style(textarea, 'height', "".concat(textarea.scrollHeight, "px"));
	      };
	      main_core.Event.bind(textarea, 'input', onChange);
	      main_core.Event.bind(textarea, 'change', onChange);
	      main_core.Event.bind(textarea, 'keyup', onChange);
	      main_core.Event.bind(textarea, 'cut', onChange);
	      main_core.Event.bind(textarea, 'paste', onChange);
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, fieldData),
	          node: field
	        })
	      });
	      return field;
	    }
	  }, {
	    key: "createCustomEntityFieldLayout",
	    value: function createCustomEntityFieldLayout(fieldData) {
	      var field = {
	        block: 'main-ui-control-field',
	        mix: this.parent.getParam('ENABLE_LABEL') ? [this.parent.settings.classFieldWithLabel] : null,
	        deleteButton: true,
	        valueDelete: true,
	        name: fieldData.NAME,
	        type: fieldData.TYPE,
	        label: this.parent.getParam('ENABLE_LABEL') ? fieldData.LABEL : '',
	        icon: this.parent.getParam('ENABLE_LABEL') && fieldData.ICON ? fieldData.ICON : null,
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_FIELD_TITLE'),
	        deleteTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_FIELD'),
	        content: {
	          block: 'main-ui-control-entity',
	          mix: 'main-ui-control',
	          attrs: {
	            'data-multiple': JSON.stringify(fieldData.MULTIPLE)
	          },
	          content: []
	        }
	      };
	      if ('_label' in fieldData.VALUES && !!fieldData.VALUES._label) {
	        if (fieldData.MULTIPLE) {
	          var label = fieldData.VALUES._label ? fieldData.VALUES._label : [];
	          if (main_core.Type.isPlainObject(label)) {
	            label = Object.keys(label).map(function (key) {
	              return label[key];
	            });
	          }
	          if (!main_core.Type.isArray(label)) {
	            label = [label];
	          }
	          var value = fieldData.VALUES._value ? fieldData.VALUES._value : [];
	          if (main_core.Type.isPlainObject(value)) {
	            value = Object.keys(value).map(function (key) {
	              return value[key];
	            });
	          }
	          if (!main_core.Type.isArray(value)) {
	            value = [value];
	          }
	          label.forEach(function (currentLabel, index) {
	            field.content.content.push({
	              block: 'main-ui-square',
	              tag: 'span',
	              name: currentLabel,
	              item: {
	                _label: currentLabel,
	                _value: value[index]
	              }
	            });
	          });
	        } else {
	          field.content.content.push({
	            block: 'main-ui-square',
	            tag: 'span',
	            name: '_label' in fieldData.VALUES ? fieldData.VALUES._label : '',
	            item: fieldData.VALUES
	          });
	        }
	      }
	      field.content.content.push({
	        block: 'main-ui-square-search',
	        tag: 'span',
	        content: {
	          block: 'main-ui-control-string',
	          name: "".concat(fieldData.NAME, "_label"),
	          tabindex: fieldData.TABINDEX,
	          type: 'text',
	          placeholder: fieldData.PLACEHOLDER || ''
	        }
	      }, {
	        block: 'main-ui-control-string',
	        name: fieldData.NAME,
	        type: 'hidden',
	        placeholder: fieldData.PLACEHOLDER || '',
	        value: '_value' in fieldData.VALUES ? fieldData.VALUES._value : '',
	        tabindex: fieldData.TABINDEX
	      });
	      field = BX.decl(field);
	      var input = BX.Filter.Utils.getBySelector(field, '.main-ui-control-string[type="text"]');
	      BX.addClass(input, 'main-ui-square-search-item');
	      input.autocomplete = 'off';
	      main_core.Event.bind(input, 'focus', BX.proxy(this._onCustomEntityInputFocus, this));
	      main_core.Event.bind(input, 'click', BX.proxy(this._onCustomEntityInputClick, this));
	      if (!this.bindDocument) {
	        main_core.Event.bind(document, 'click', BX.proxy(this._onCustomEntityBlur, this));
	        document.addEventListener('focus', BX.proxy(this._onDocumentFocus, this), true);
	        this.bindDocument = true;
	      }
	      main_core.Event.bind(input, 'keydown', BX.proxy(this._onCustomEntityKeydown, this));
	      main_core.Event.bind(field, 'click', BX.proxy(this._onCustomEntityFieldClick, this));
	      return field;
	    }
	  }, {
	    key: "createDestSelector",
	    value: function createDestSelector(fieldData) {
	      var field = this.createCustomEntityFieldLayout(fieldData);
	      BX.ready(BX.proxy(function () {
	        BX.Filter.DestinationSelector.create(fieldData.NAME, {
	          filterId: this.parent.getParam('FILTER_ID'),
	          fieldId: fieldData.NAME
	        });
	      }, this));
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, fieldData),
	          node: field
	        })
	      });
	      return field;
	    }
	  }, {
	    key: "createEntitySelector",
	    value: function createEntitySelector(fieldData) {
	      var field = this.createCustomEntityFieldLayout(fieldData);
	      BX.Filter.EntitySelector.create(fieldData.NAME, {
	        filter: this.parent,
	        isMultiple: fieldData.MULTIPLE,
	        addEntityIdToResult: fieldData.ADD_ENTITY_ID_TO_RESULT,
	        showDialogOnEmptyInput: fieldData.SHOW_DIALOG_ON_EMPTY_INPUT,
	        dialogOptions: fieldData.DIALOG_OPTIONS
	      });
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, fieldData),
	          node: field
	        })
	      });
	      return field;
	    }
	  }, {
	    key: "createCustomEntity",
	    value: function createCustomEntity(fieldData) {
	      var field = this.createCustomEntityFieldLayout(fieldData);
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, fieldData),
	          node: field
	        })
	      });
	      return field;
	    }
	  }, {
	    key: "_onCustomEntityInputFocus",
	    value: function _onCustomEntityInputFocus(event) {
	      BX.fireEvent(event.currentTarget, 'click');
	    }
	  }, {
	    key: "_onCustomEntityInputClick",
	    value: function _onCustomEntityInputClick(event) {
	      event.preventDefault();
	      event.stopPropagation();
	      if (event.isTrusted) {
	        this.trustTimestamp = event.timeStamp;
	        this.notTrustTimestamp = this.notTrustTimestamp || event.timeStamp;
	      } else {
	        this.notTrustTimestamp = event.timeStamp;
	      }
	      var trustDate = new Date(this.trustTimestamp);
	      var notTrustDate = new Date(this.notTrustTimestamp);
	      var trustTime = "".concat(trustDate.getMinutes(), ":").concat(trustDate.getSeconds());
	      var notTrustTime = "".concat(notTrustDate.getMinutes(), ":").concat(notTrustDate.getSeconds());
	      if (trustTime !== notTrustTime) {
	        this._onCustomEntityFocus(event);
	      }
	    }
	  }, {
	    key: "_onDocumentFocus",
	    value: function _onDocumentFocus(event) {
	      var CustomEntity = this.getCustomEntityInstance();
	      var popupContainer = CustomEntity.getPopupContainer();
	      var isOnInputField = CustomEntity.getLabelNode() === event.target;
	      var isInsidePopup = !!popupContainer && popupContainer.contains(event.target);
	      if (!isOnInputField && !isInsidePopup) {
	        this._onCustomEntityBlur(event);
	      }
	    }
	  }, {
	    key: "_onCustomEntityKeydown",
	    value: function _onCustomEntityKeydown(event) {
	      var target = event.target,
	        currentTarget = event.currentTarget;
	      var parentNode = target.parentNode.parentNode;
	      var squares = parentNode.querySelectorAll('.main-ui-square');
	      var square = squares[squares.length - 1];
	      if (!main_core.Type.isDomNode(square)) {
	        return;
	      }
	      if (BX.Filter.Utils.isKey(event, 'backspace') && currentTarget.selectionStart === 0) {
	        if (main_core.Dom.hasClass(square, 'main-ui-square-selected')) {
	          var input = parentNode.querySelector('input[type="hidden"]');
	          if (main_core.Type.isDomNode(input)) {
	            input.value = '';
	            BX.fireEvent(input, 'input');
	          }
	          main_core.Dom.remove(square);
	          return;
	        }
	        main_core.Dom.addClass(square, 'main-ui-square-selected');
	        return;
	      }
	      main_core.Dom.removeClass(square, 'main-ui-square-selected');
	    }
	  }, {
	    key: "_onCustomEntityFieldClick",
	    value: function _onCustomEntityFieldClick(_ref3) {
	      var target = _ref3.target;
	      if (main_core.Dom.hasClass(target, 'main-ui-square-delete')) {
	        var square = target.closest('.main-ui-square');
	        if (main_core.Type.isDomNode(square)) {
	          var CustomEntity = this.getCustomEntityInstance();
	          BX.onCustomEvent(window, 'BX.Main.Filter:customEntityRemove', [CustomEntity]);
	          main_core.Dom.remove(square);
	        }
	        return;
	      }
	      var input = target.querySelector('input[type="text"]');
	      if (main_core.Type.isDomNode(input)) {
	        BX.fireEvent(input, 'focus');
	      }
	    }
	  }, {
	    key: "_onCustomEntityBlur",
	    value: function _onCustomEntityBlur(event) {
	      var eventData = {
	        stopBlur: false
	      };
	      BX.onCustomEvent(window, 'BX.Main.Filter:onGetStopBlur', [event, eventData]);
	      if (typeof eventData.stopBlur === 'undefined' || !eventData.stopBlur) {
	        var CustomEntity = this.getCustomEntityInstance();
	        BX.onCustomEvent(window, 'BX.Main.Filter:customEntityBlur', [CustomEntity]);
	        main_core.Event.unbind(CustomEntity.getPopupContainer(), 'click', this._stopPropagation);
	        main_core.Dom.removeClass(CustomEntity.getField(), 'main-ui-focus');
	      }
	    }
	  }, {
	    key: "_stopPropagation",
	    value: function _stopPropagation(event) {
	      event.stopPropagation();
	    }
	  }, {
	    key: "getCustomEntityInstance",
	    value: function getCustomEntityInstance() {
	      if (!(this.customEntityInstance instanceof BX.Main.ui.CustomEntity)) {
	        this.customEntityInstance = new BX.Main.ui.CustomEntity();
	      }
	      return this.customEntityInstance;
	    }
	  }, {
	    key: "_onCustomEntityFocus",
	    value: function _onCustomEntityFocus(event) {
	      event.stopPropagation();
	      var currentTarget = event.currentTarget;
	      var field = currentTarget.closest('.main-ui-control-entity');
	      var CustomEntity = this.getCustomEntityInstance();
	      CustomEntity.setField(field);
	      BX.onCustomEvent('BX.Main.Filter:customEntityFocus', [CustomEntity]);
	      var popupContainer = CustomEntity.getPopupContainer();
	      if (main_core.Type.isElementNode(popupContainer)) {
	        main_core.Event.bind(popupContainer, 'click', this._stopPropagation);
	      }
	      main_core.Dom.addClass(field, 'main-ui-focus');
	    }
	  }, {
	    key: "createCustom",
	    value: function createCustom(fieldData) {
	      var field = BX.decl({
	        block: 'main-ui-control-field',
	        mix: this.parent.getParam('ENABLE_LABEL') ? [this.parent.settings.classFieldWithLabel] : null,
	        name: fieldData.NAME,
	        type: fieldData.TYPE,
	        deleteButton: true,
	        label: this.parent.getParam('ENABLE_LABEL') ? fieldData.LABEL : '',
	        icon: this.parent.getParam('ENABLE_LABEL') && fieldData.ICON ? fieldData.ICON : null,
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_FIELD_TITLE'),
	        deleteTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_FIELD'),
	        content: {
	          block: 'main-ui-custom',
	          mix: ['main-ui-control', 'main-ui-custom-style'],
	          attrs: {
	            'data-name': fieldData.NAME
	          },
	          content: ''
	        }
	      });
	      if (main_core.Type.isString(fieldData.VALUE)) {
	        var fieldValue = function () {
	          if (Reflect.has(fieldData, '_VALUE')) {
	            return fieldData._VALUE;
	          }
	          return '';
	        }();
	        var html = main_core.Text.decode(fieldData.VALUE).replace("name=\"".concat(fieldData.NAME, "\""), "name=\"".concat(fieldData.NAME, "\" value=\"").concat(fieldValue, "\""));
	        var control = field.querySelector('.main-ui-custom');
	        main_core.Runtime.html(control, html);
	      }
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, fieldData),
	          node: field
	        })
	      });
	      return field;
	    }
	  }, {
	    key: "createSelect",
	    value: function createSelect(fieldData) {
	      var field = BX.decl({
	        block: 'main-ui-control-field',
	        mix: this.parent.getParam('ENABLE_LABEL') ? [this.parent.settings.classFieldWithLabel] : null,
	        name: fieldData.NAME,
	        type: fieldData.TYPE,
	        deleteButton: true,
	        label: this.parent.getParam('ENABLE_LABEL') ? fieldData.LABEL : '',
	        icon: this.parent.getParam('ENABLE_LABEL') && fieldData.ICON ? fieldData.ICON : null,
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_FIELD_TITLE'),
	        deleteTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_FIELD'),
	        content: {
	          block: this.parent.settings.classSelect,
	          name: fieldData.NAME,
	          items: fieldData.ITEMS,
	          value: 'VALUE' in fieldData ? fieldData.VALUE : fieldData.ITEMS[0],
	          params: fieldData.PARAMS,
	          tabindex: fieldData.TABINDEX,
	          valueDelete: false
	        }
	      });
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, fieldData),
	          node: field
	        })
	      });
	      return field;
	    }
	  }, {
	    key: "createMultiSelect",
	    value: function createMultiSelect(fieldData) {
	      var field = BX.decl({
	        block: 'main-ui-control-field',
	        mix: this.parent.getParam('ENABLE_LABEL') ? [this.parent.settings.classFieldWithLabel] : null,
	        name: fieldData.NAME,
	        type: fieldData.TYPE,
	        deleteButton: true,
	        label: this.parent.getParam('ENABLE_LABEL') ? fieldData.LABEL : '',
	        icon: this.parent.getParam('ENABLE_LABEL') && fieldData.ICON ? fieldData.ICON : null,
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_FIELD_TITLE'),
	        deleteTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_FIELD'),
	        content: {
	          block: 'main-ui-multi-select',
	          name: fieldData.NAME,
	          tabindex: 'TABINDEX' in fieldData ? fieldData.TABINDEX : '',
	          placeholder: !this.parent.getParam('ENABLE_LABEL') && 'PLACEHOLDER' in fieldData ? fieldData.PLACEHOLDER : '',
	          items: 'ITEMS' in fieldData ? fieldData.ITEMS : [],
	          value: 'VALUE' in fieldData ? fieldData.VALUE : [],
	          params: 'PARAMS' in fieldData ? fieldData.PARAMS : {
	            isMulti: true
	          },
	          valueDelete: true
	        }
	      });
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, fieldData),
	          node: field
	        })
	      });
	      return field;
	    }
	  }, {
	    key: "createCustomDate",
	    value: function createCustomDate(fieldData) {
	      var group = {
	        block: 'main-ui-control-field-group',
	        type: fieldData.TYPE,
	        mix: this.parent.getParam('ENABLE_LABEL') ? [this.parent.settings.classFieldWithLabel, 'main-ui-filter-date-group'] : ['main-ui-filter-date-group'],
	        label: this.parent.getParam('ENABLE_LABEL') ? fieldData.LABEL : '',
	        icon: this.parent.getParam('ENABLE_LABEL') && fieldData.ICON ? fieldData.ICON : null,
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_FIELD_TITLE'),
	        deleteTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_FIELD'),
	        tabindex: 'TABINDEX' in fieldData ? fieldData.TABINDEX : '',
	        name: 'NAME' in fieldData ? fieldData.NAME : '',
	        deleteButton: true,
	        content: []
	      };
	      if (main_core.Type.isPlainObject(fieldData.VALUE.days)) {
	        fieldData.VALUE.days = Object.keys(fieldData.VALUE.days).map(function (index) {
	          return fieldData.VALUE.days[index];
	        });
	      }
	      var daysValue = fieldData.DAYS.filter(function (item) {
	        return fieldData.VALUE.days.some(function (value) {
	          return value === item.VALUE;
	        });
	      });
	      var days = {
	        block: 'main-ui-control-field',
	        mix: ['main-ui-control-custom-date'],
	        placeholder: fieldData.DAYS_PLACEHOLDER,
	        dragButton: false,
	        content: {
	          block: 'main-ui-multi-select',
	          name: "".concat(fieldData.NAME, "_days"),
	          tabindex: 'TABINDEX' in fieldData ? fieldData.TABINDEX : '',
	          items: fieldData.DAYS,
	          value: daysValue,
	          params: 'PARAMS' in fieldData ? fieldData.PARAMS : {
	            isMulti: true
	          },
	          valueDelete: true,
	          attrs: {
	            'data-placeholder': fieldData.DAYS_PLACEHOLDER
	          }
	        }
	      };
	      if (main_core.Type.isPlainObject(fieldData.VALUE.months)) {
	        fieldData.VALUE.months = Object.keys(fieldData.VALUE.months).map(function (index) {
	          return fieldData.VALUE.months[index];
	        });
	      }
	      var monthsValue = fieldData.MONTHS.filter(function (item) {
	        return fieldData.VALUE.months.some(function (value) {
	          return value === item.VALUE;
	        });
	      });
	      var months = {
	        block: 'main-ui-control-field',
	        mix: ['main-ui-control-custom-date'],
	        dragButton: false,
	        content: {
	          block: 'main-ui-multi-select',
	          name: "".concat(fieldData.NAME, "_months"),
	          tabindex: 'TABINDEX' in fieldData ? fieldData.TABINDEX : '',
	          items: fieldData.MONTHS,
	          value: monthsValue,
	          params: 'PARAMS' in fieldData ? fieldData.PARAMS : {
	            isMulti: true
	          },
	          valueDelete: true,
	          attrs: {
	            'data-placeholder': fieldData.MONTHS_PLACEHOLDER
	          }
	        }
	      };
	      if (main_core.Type.isPlainObject(fieldData.VALUE.years)) {
	        fieldData.VALUE.years = Object.keys(fieldData.VALUE.years).map(function (index) {
	          return fieldData.VALUE.years[index];
	        });
	      }
	      var yearsValue = fieldData.YEARS.filter(function (item) {
	        return fieldData.VALUE.years.some(function (value) {
	          return value === item.VALUE;
	        });
	      });
	      var years = {
	        block: 'main-ui-control-field',
	        mix: ['main-ui-control-custom-date'],
	        dragButton: false,
	        content: {
	          block: 'main-ui-multi-select',
	          name: "".concat(fieldData.NAME, "_years"),
	          tabindex: 'TABINDEX' in fieldData ? fieldData.TABINDEX : '',
	          items: fieldData.YEARS,
	          value: yearsValue,
	          params: 'PARAMS' in fieldData ? fieldData.PARAMS : {
	            isMulti: true
	          },
	          valueDelete: true,
	          attrs: {
	            'data-placeholder': fieldData.YEARS_PLACEHOLDER
	          }
	        }
	      };
	      group.content.push(days);
	      group.content.push(months);
	      group.content.push(years);
	      var field = BX.decl(group);
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, fieldData),
	          node: field
	        })
	      });
	      return field;
	    }
	  }, {
	    key: "_onDateTypeChange",
	    value: function _onDateTypeChange(instance, data) {
	      var _this = this;
	      if (this.parent.getPopup().contentContainer.contains(instance.node)) {
	        var fieldData = {};
	        var dateGroup = null;
	        var label;
	        var controls;
	        var index;
	        if (main_core.Type.isPlainObject(data) && Reflect.has(data, 'VALUE')) {
	          var fieldNode = instance.getNode();
	          var params = instance.getParams();
	          var name = fieldNode.dataset.name;
	          if (!main_core.Type.isPlainObject(params) && (name.endsWith('_datesel') || name.endsWith('_numsel'))) {
	            var group = fieldNode.parentNode.parentNode;
	            fieldData.TABINDEX = instance.getInput().getAttribute('tabindex');
	            fieldData.SUB_TYPES = instance.getItems();
	            fieldData.SUB_TYPE = data;
	            fieldData.NAME = group.dataset.name;
	            fieldData.TYPE = group.dataset.type;
	            fieldData.VALUE_REQUIRED = group.dataset.valueRequired === 'true';
	            var presetData = this.parent.getPreset().getCurrentPresetData();
	            if (main_core.Type.isArray(presetData.FIELDS)) {
	              var presetField = presetData.FIELDS.find(function (current) {
	                return current.NAME === fieldData.NAME;
	              });
	              if (main_core.Type.isNil(presetField)) {
	                presetField = this.parent.params.FIELDS_STUBS.find(function (current) {
	                  return current.TYPE === fieldData.TYPE;
	                });
	              }
	              if (!main_core.Type.isNil(presetField)) {
	                if (name.endsWith('_datesel')) {
	                  fieldData.MONTHS = presetField.MONTHS;
	                  fieldData.MONTH = presetField.MONTH;
	                  fieldData.YEARS = presetField.YEARS;
	                  fieldData.YEAR = presetField.YEAR;
	                  fieldData.QUARTERS = presetField.QUARTERS;
	                  fieldData.QUARTER = presetField.QUARTER;
	                  fieldData.ENABLE_TIME = presetField.ENABLE_TIME;
	                  fieldData.YEARS_SWITCHER = presetField.YEARS_SWITCHER;
	                }
	                fieldData.VALUES = presetField.VALUES;
	                fieldData.REQUIRED = presetField.REQUIRED;
	              }
	            }
	            if (this.parent.getParam('ENABLE_LABEL')) {
	              label = group.querySelector('.main-ui-control-field-label');
	              fieldData.LABEL = label.innerText;
	            }
	            if (name.endsWith('_datesel')) {
	              dateGroup = this.createDate(fieldData);
	            } else {
	              dateGroup = this.createNumber(fieldData);
	            }
	            if (main_core.Type.isArray(this.parent.fieldsList)) {
	              index = this.parent.fieldsList.indexOf(group);
	              if (index !== -1) {
	                this.parent.fieldsList[index] = dateGroup;
	                this.parent.registerDragItem(dateGroup);
	              }
	            }
	            this.parent.unregisterDragItem(group);
	            controls = babelHelpers.toConsumableArray(dateGroup.querySelectorAll('.main-ui-control-field'));
	            if (main_core.Type.isArray(controls) && controls.length) {
	              controls.forEach(function (control) {
	                control.FieldController = new BX.Filter.FieldController(control, _this.parent);
	              });
	            }
	            if (this.parent.getParam('ENABLE_ADDITIONAL_FILTERS')) {
	              var button = AdditionalFilter.getInstance().getAdditionalFilterButton({
	                fieldId: fieldData.NAME,
	                enabled: fieldData.ADDITIONAL_FILTER_ALLOWED
	              });
	              main_core.Dom.append(button, dateGroup);
	            }
	            main_core.Dom.insertAfter(dateGroup, group);
	            main_core.Dom.remove(group);
	          }
	        }
	      }
	    }
	  }, {
	    key: "createNumber",
	    value: function createNumber(options) {
	      var _this$parent = this.parent,
	        numberTypes = _this$parent.numberTypes,
	        additionalNumberTypes = _this$parent.additionalNumberTypes;
	      var ENABLE_LABEL = this.parent.params.ENABLE_LABEL;
	      var _options$SUB_TYPE = options.SUB_TYPE,
	        SUB_TYPE = _options$SUB_TYPE === void 0 ? {} : _options$SUB_TYPE,
	        _options$SUB_TYPES = options.SUB_TYPES,
	        SUB_TYPES = _options$SUB_TYPES === void 0 ? [] : _options$SUB_TYPES,
	        _options$TABINDEX = options.TABINDEX,
	        TABINDEX = _options$TABINDEX === void 0 ? '' : _options$TABINDEX,
	        _options$VALUES = options.VALUES,
	        VALUES = _options$VALUES === void 0 ? {
	          _from: '',
	          _to: ''
	        } : _options$VALUES,
	        _options$LABEL = options.LABEL,
	        LABEL = _options$LABEL === void 0 ? '' : _options$LABEL,
	        _options$ICON = options.ICON,
	        ICON = _options$ICON === void 0 ? null : _options$ICON,
	        TYPE = options.TYPE;
	      var subType = SUB_TYPE.VALUE || numberTypes.SINGLE;
	      var placeholder = SUB_TYPE.PLACEHOLDER || '';
	      var fieldName = options.NAME.replace('_numsel', '');
	      var classes = function () {
	        if (ENABLE_LABEL) {
	          return ['main-ui-filter-wield-with-label', 'main-ui-filter-number-group'];
	        }
	        return ['main-ui-filter-number-group'];
	      }();
	      var fieldGroup = {
	        block: 'number-group',
	        type: TYPE,
	        mix: classes,
	        label: ENABLE_LABEL ? LABEL : '',
	        icon: ENABLE_LABEL ? ICON : null,
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_FIELD_TITLE'),
	        deleteTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_FIELD'),
	        tabindex: TABINDEX,
	        value: SUB_TYPE,
	        items: SUB_TYPES,
	        name: fieldName,
	        deleteButton: true,
	        content: []
	      };
	      if (subType !== numberTypes.LESS && subType !== additionalNumberTypes.BEFORE_N) {
	        var from = {
	          block: 'main-ui-control-field',
	          type: TYPE,
	          dragButton: false,
	          content: {
	            block: 'main-ui-number',
	            mix: ['filter-type-single'],
	            calendarButton: true,
	            valueDelete: true,
	            placeholder: placeholder,
	            name: "".concat(fieldName, "_from"),
	            tabindex: TABINDEX,
	            value: VALUES._from || ''
	          }
	        };
	        fieldGroup.content.push(from);
	      }
	      if (subType === numberTypes.RANGE) {
	        var line = {
	          block: 'main-ui-filter-field-line',
	          content: {
	            block: 'main-ui-filter-field-line-item',
	            tag: 'span'
	          }
	        };
	        fieldGroup.content.push(line);
	      }
	      if (subType === numberTypes.RANGE || subType === numberTypes.LESS || subType === additionalNumberTypes.BEFORE_N) {
	        var to = {
	          block: 'main-ui-control-field',
	          type: TYPE,
	          dragButton: false,
	          content: {
	            block: 'main-ui-number',
	            calendarButton: true,
	            valueDelete: true,
	            name: "".concat(fieldName, "_to"),
	            tabindex: TABINDEX,
	            value: VALUES._to || ''
	          }
	        };
	        fieldGroup.content.push(to);
	      }
	      var field = BX.decl(fieldGroup);
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4({}, options),
	          node: field
	        })
	      });
	      return field;
	    }
	  }, {
	    key: "createDate",
	    value: function createDate(options) {
	      var _this2 = this;
	      var _this$parent2 = this.parent,
	        dateTypes = _this$parent2.dateTypes,
	        additionalDateTypes = _this$parent2.additionalDateTypes;
	      var _options$SUB_TYPE2 = options.SUB_TYPE,
	        SUB_TYPE = _options$SUB_TYPE2 === void 0 ? {} : _options$SUB_TYPE2,
	        _options$SUB_TYPES2 = options.SUB_TYPES,
	        SUB_TYPES = _options$SUB_TYPES2 === void 0 ? [] : _options$SUB_TYPES2,
	        _options$PLACEHOLDER = options.PLACEHOLDER,
	        PLACEHOLDER = _options$PLACEHOLDER === void 0 ? '' : _options$PLACEHOLDER,
	        _options$VALUES2 = options.VALUES,
	        VALUES = _options$VALUES2 === void 0 ? {
	          _from: '',
	          _to: '',
	          _quarter: '',
	          _days: '',
	          _month: '',
	          _year: '',
	          _allow_year: ''
	        } : _options$VALUES2,
	        _options$TABINDEX2 = options.TABINDEX,
	        TABINDEX = _options$TABINDEX2 === void 0 ? '' : _options$TABINDEX2,
	        _options$ENABLE_TIME = options.ENABLE_TIME,
	        ENABLE_TIME = _options$ENABLE_TIME === void 0 ? false : _options$ENABLE_TIME,
	        _options$LABEL2 = options.LABEL,
	        LABEL = _options$LABEL2 === void 0 ? '' : _options$LABEL2,
	        _options$ICON2 = options.ICON,
	        ICON = _options$ICON2 === void 0 ? null : _options$ICON2,
	        TYPE = options.TYPE,
	        _options$VALUE_REQUIR = options.VALUE_REQUIRED,
	        VALUE_REQUIRED = _options$VALUE_REQUIR === void 0 ? false : _options$VALUE_REQUIR,
	        _options$REQUIRED = options.REQUIRED,
	        REQUIRED = _options$REQUIRED === void 0 ? false : _options$REQUIRED;
	      var ENABLE_LABEL = this.parent.params.ENABLE_LABEL;
	      var subType = SUB_TYPE.VALUE || dateTypes.NONE;
	      var fieldName = options.NAME.replace('_datesel', '');
	      var classes = function () {
	        if (ENABLE_LABEL) {
	          return ['main-ui-filter-wield-with-label', 'main-ui-filter-date-group'];
	        }
	        return ['main-ui-filter-date-group'];
	      }();
	      var fieldGroup = {
	        block: 'date-group',
	        type: TYPE,
	        mix: classes,
	        label: ENABLE_LABEL ? LABEL : '',
	        icon: ENABLE_LABEL ? ICON : null,
	        dragTitle: this.parent.getParam('MAIN_UI_FILTER__DRAG_FIELD_TITLE'),
	        deleteTitle: this.parent.getParam('MAIN_UI_FILTER__REMOVE_FIELD'),
	        tabindex: TABINDEX,
	        value: SUB_TYPE,
	        items: SUB_TYPES,
	        name: fieldName,
	        enableTime: ENABLE_TIME,
	        deleteButton: true,
	        content: []
	      };
	      if (subType === dateTypes.EXACT) {
	        var fieldDecl = createDateInputDecl({
	          type: TYPE,
	          name: "".concat(fieldName.NAME, "_from"),
	          placeholder: PLACEHOLDER,
	          tabindex: TABINDEX,
	          value: VALUES._from || '',
	          enableTime: ENABLE_TIME
	        });
	        fieldGroup.content.push(fieldDecl);
	      }
	      if (subType === dateTypes.NEXT_DAYS || subType === dateTypes.PREV_DAYS || subType === additionalDateTypes.PREV_DAY || subType === additionalDateTypes.NEXT_DAY || subType === additionalDateTypes.MORE_THAN_DAYS_AGO || subType === additionalDateTypes.AFTER_DAYS) {
	        var _fieldDecl = createNumberInputDecl({
	          type: TYPE,
	          name: "".concat(fieldName, "_days"),
	          tabindex: TABINDEX,
	          value: VALUES._days || '',
	          placeholder: PLACEHOLDER
	        });
	        fieldGroup.content.push(_fieldDecl);
	      }
	      if (subType === dateTypes.RANGE) {
	        var rangeGroup = {
	          block: 'main-ui-filter-range-group',
	          content: [createDateInputDecl({
	            type: TYPE,
	            name: "".concat(fieldName, "_from"),
	            placeholder: PLACEHOLDER,
	            tabindex: TABINDEX,
	            value: VALUES._from || '',
	            enableTime: ENABLE_TIME
	          }), createLineDecl(), createDateInputDecl({
	            type: TYPE,
	            name: "".concat(fieldName, "_to"),
	            placeholder: PLACEHOLDER,
	            tabindex: TABINDEX,
	            value: VALUES._to || '',
	            enableTime: ENABLE_TIME
	          })]
	        };
	        fieldGroup.content.push(rangeGroup);
	      }
	      if (subType === dateTypes.MONTH) {
	        var MONTHS = options.MONTHS,
	          MONTH = options.MONTH,
	          YEARS = options.YEARS,
	          YEAR = options.YEAR;
	        var monthValue = MONTHS.find(function (item) {
	          return item.VALUE === VALUES._month;
	        }) || MONTH || MONTHS[0];
	        var yearValue = YEARS.find(function (item) {
	          return item.VALUE === VALUES._year;
	        }) || YEAR || YEARS[0];
	        fieldGroup.content.push(createSelectDecl({
	          name: "".concat(fieldName, "_month"),
	          value: monthValue,
	          items: MONTHS,
	          tabindex: TABINDEX
	        }), createSelectDecl({
	          name: "".concat(fieldName, "_year"),
	          value: yearValue,
	          items: YEARS,
	          tabindex: TABINDEX
	        }));
	      }
	      if (subType === dateTypes.QUARTER) {
	        var _YEARS = options.YEARS,
	          _YEAR = options.YEAR,
	          QUARTERS = options.QUARTERS,
	          QUARTER = options.QUARTER,
	          PARAMS = options.PARAMS;
	        var _yearValue = _YEARS.find(function (item) {
	          return item.VALUE === VALUES._year;
	        }) || _YEAR || _YEARS[0];
	        var quarterValue = QUARTERS.find(function (item) {
	          return item.VALUE === VALUES._quarter;
	        }) || QUARTER || QUARTERS[0];
	        fieldGroup.content.push(createSelectDecl({
	          name: "".concat(fieldName, "_year"),
	          value: _yearValue,
	          items: _YEARS,
	          tabindex: TABINDEX
	        }), createSelectDecl({
	          name: "".concat(fieldName, "_quarter"),
	          value: quarterValue,
	          items: QUARTERS,
	          tabindex: TABINDEX,
	          params: PARAMS
	        }));
	      }
	      if (subType === dateTypes.YEAR) {
	        var _YEARS2 = options.YEARS,
	          _YEAR2 = options.YEAR;
	        var _yearValue2 = _YEARS2.find(function (item) {
	          return item.VALUE === VALUES._year;
	        }) || _YEAR2 || _YEARS2[0];
	        fieldGroup.content.push(createSelectDecl({
	          name: "".concat(fieldName, "_year"),
	          value: _yearValue2,
	          items: _YEARS2,
	          tabindex: TABINDEX
	        }));
	      }
	      if (subType === 'CUSTOM_DATE') {
	        var customDateSubType = SUB_TYPES.find(function (item) {
	          return item.VALUE === 'CUSTOM_DATE';
	        });
	        if (customDateSubType) {
	          var customDateDecl = main_core.Runtime.clone(customDateSubType.DECL);
	          if (main_core.Type.isArray(VALUES._days)) {
	            customDateDecl.VALUE.days = VALUES._days;
	          }
	          if (main_core.Type.isArray(VALUES._month)) {
	            customDateDecl.VALUE.months = VALUES._month;
	          }
	          if (main_core.Type.isArray(VALUES._year)) {
	            customDateDecl.VALUE.years = VALUES._year;
	          }
	          var renderedField = this.createCustomDate(customDateDecl);
	          main_core.Dom.removeClass(renderedField, 'main-ui-filter-wield-with-label');
	          var buttons = babelHelpers.toConsumableArray(renderedField.querySelectorAll('.main-ui-item-icon-container, .main-ui-filter-icon-grab'));
	          buttons.forEach(function (button) {
	            return main_core.Dom.remove(button);
	          });
	          fieldGroup.content.push(renderedField);
	          fieldGroup.mix.push('main-ui-filter-custom-date-group');
	        }
	      }
	      if (subType !== dateTypes.NONE && subType !== additionalDateTypes.CUSTOM_DATE && options.YEARS_SWITCHER) {
	        var YEARS_SWITCHER = main_core.Runtime.clone(options.YEARS_SWITCHER);
	        var ITEMS = YEARS_SWITCHER.ITEMS;
	        YEARS_SWITCHER.VALUE = ITEMS.reduce(function (acc, item) {
	          return item.VALUE === VALUES._allow_year ? item : acc;
	        });
	        var _renderedField = this.createSelect(YEARS_SWITCHER);
	        main_core.Dom.addClass(_renderedField, ['main-ui-filter-year-switcher', 'main-ui-filter-with-padding']);
	        main_core.Dom.removeClass(_renderedField, 'main-ui-filter-wield-with-label');
	        var _buttons = babelHelpers.toConsumableArray(_renderedField.querySelectorAll('.main-ui-item-icon-container, .main-ui-filter-icon-grab'));
	        _buttons.forEach(function (button) {
	          return main_core.Dom.remove(button);
	        });
	        var lastIndex = fieldGroup.content.length - 1;
	        var lastContentItem = fieldGroup.content[lastIndex];
	        if (main_core.Type.isPlainObject(lastContentItem)) {
	          if (!main_core.Type.isArray(lastContentItem.mix)) {
	            lastContentItem.mix = [];
	          }
	          lastContentItem.mix.push('main-ui-filter-remove-margin-right');
	        }
	        if (main_core.Type.isDomNode(lastContentItem)) {
	          main_core.Dom.addClass(lastContentItem, 'main-ui-filter-remove-margin-right');
	        }
	        requestAnimationFrame(function () {
	          main_core.Dom.addClass(_renderedField.previousElementSibling, 'main-ui-filter-remove-margin-right');
	        });
	        fieldGroup.content.push(_renderedField);
	        fieldGroup.mix.push('main-ui-filter-date-with-years-switcher');
	      }
	      var renderedFieldGroup = BX.decl(fieldGroup);
	      var onDateChange = main_core.Runtime.debounce(this.onDateChange, 500, this);
	      var inputs = babelHelpers.toConsumableArray(renderedFieldGroup.querySelectorAll('.main-ui-date-input'));
	      inputs.forEach(function (input) {
	        input.addEventListener('change', onDateChange);
	        input.addEventListener('input', onDateChange);
	        var parentNode = input.parentNode;
	        var clearButton = parentNode.querySelector('.main-ui-control-value-delete');
	        if (clearButton) {
	          clearButton.addEventListener('click', function () {
	            setTimeout(function () {
	              _this2.onDateChange({
	                target: input
	              });
	            });
	          });
	        }
	      });
	      if (VALUE_REQUIRED) {
	        renderedFieldGroup.dataset.valueRequired = true;
	        var allInputs = [].concat(babelHelpers.toConsumableArray(inputs), babelHelpers.toConsumableArray(renderedFieldGroup.querySelectorAll('.main-ui-number-input')));
	        allInputs.forEach(function (input) {
	          input.addEventListener('change', _this2.checkRequiredDateValue.bind(_this2));
	          input.addEventListener('input', _this2.checkRequiredDateValue.bind(_this2));
	          var parentNode = input.parentNode;
	          var clearButton = parentNode.querySelector('.main-ui-control-value-delete');
	          if (clearButton) {
	            clearButton.addEventListener('click', function () {
	              setTimeout(function () {
	                _this2.checkRequiredDateValue({
	                  target: input
	                });
	              });
	            });
	          }
	          main_core.Event.bindOnce(input, 'mouseout', function () {
	            _this2.checkRequiredDateValue({
	              target: input
	            });
	          });
	        });
	      }
	      if (REQUIRED) {
	        var removeButton = renderedFieldGroup.querySelector('.main-ui-filter-field-delete');
	        if (removeButton) {
	          BX.remove(removeButton);
	        }
	      }
	      var currentValues = {};
	      this.parent.prepareControlDateValue(currentValues, fieldName, renderedFieldGroup);
	      Object.entries(currentValues).forEach(function (_ref4) {
	        var _ref5 = babelHelpers.slicedToArray(_ref4, 2),
	          key = _ref5[0],
	          value = _ref5[1];
	        currentValues[key.replace(fieldName, '')] = value;
	        delete currentValues[key];
	      });
	      this.parent.getEmitter().emit('init', {
	        field: new Field({
	          parent: this.parent,
	          options: _objectSpread$4(_objectSpread$4({}, options), {}, {
	            VALUES: currentValues
	          }),
	          node: renderedFieldGroup
	        })
	      });
	      return renderedFieldGroup;
	    }
	  }, {
	    key: "checkRequiredDateValue",
	    value: function checkRequiredDateValue(event) {
	      if (event.target.value === '') {
	        this.showError({
	          id: 'valueError',
	          target: event.target,
	          text: this.parent.params.MAIN_UI_FILTER__VALUE_REQUIRED
	        });
	        return;
	      }
	      this.hideError({
	        id: 'valueError',
	        target: event.target
	      });
	    }
	  }, {
	    key: "onDateChange",
	    value: function onDateChange(event) {
	      var _this3 = this;
	      if (values.get(event.target) === event.target.value) {
	        return;
	      }
	      values.set(event.target, event.target.value);
	      if (event.target.value === '') {
	        this.hideError({
	          id: 'formatError',
	          target: event.target
	        });
	        return;
	      }
	      BX.ajax.runComponentAction('bitrix:main.ui.filter', 'checkDateFormat', {
	        mode: 'ajax',
	        data: {
	          value: event.target.value,
	          format: BX.message('FORMAT_DATETIME')
	        }
	      }).then(function (result) {
	        if (!result.data.result) {
	          _this3.showError({
	            id: 'formatError',
	            target: event.target
	          });
	          return;
	        }
	        _this3.hideError({
	          id: 'formatError',
	          target: event.target
	        });
	      });
	    }
	  }, {
	    key: "showError",
	    value: function showError(_ref6) {
	      var id = _ref6.id,
	        target = _ref6.target,
	        _ref6$text = _ref6.text,
	        text = _ref6$text === void 0 ? null : _ref6$text;
	      main_core.Dom.style(target, 'border-color', '#FF5752');
	      if (errorMessages.has(target) && errorMessagesTypes.get(target) === id) {
	        main_core.Dom.remove(errorMessages.get(target));
	      }
	      var _this$parent$params = this.parent.params,
	        MAIN_UI_FILTER__DATE_ERROR_TITLE = _this$parent$params.MAIN_UI_FILTER__DATE_ERROR_TITLE,
	        MAIN_UI_FILTER__DATE_ERROR_LABEL = _this$parent$params.MAIN_UI_FILTER__DATE_ERROR_LABEL;
	      var errorText = text || "".concat(MAIN_UI_FILTER__DATE_ERROR_LABEL, " ").concat(main_core.Loc.getMessage('FORMAT_DATE'));
	      var dateErrorMessage = main_core.Tag.render(_templateObject$3 || (_templateObject$3 = babelHelpers.taggedTemplateLiteral(["\n\t\t\t<div \n\t\t\t\tclass=\"main-ui-filter-error-message\" \n\t\t\t\ttitle=\"", "\">\n\t\t\t\t", "\n\t\t\t</div>\n\t\t"])), MAIN_UI_FILTER__DATE_ERROR_TITLE, errorText);
	      errorMessages.set(target, dateErrorMessage);
	      errorMessagesTypes.set(target, id);
	      main_core.Dom.insertAfter(dateErrorMessage, target);
	      main_core.Dom.attr(target, 'is-valid', 'false');
	    }
	  }, {
	    key: "hideError",
	    value: function hideError(_ref7) {
	      var id = _ref7.id,
	        target = _ref7.target;
	      main_core.Dom.style(target, 'border-color', null);
	      if (errorMessages.has(target) && errorMessagesTypes.get(target) === id) {
	        main_core.Dom.remove(errorMessages.get(target));
	      }
	      main_core.Dom.attr(target, 'is-valid', 'true');
	    }
	  }]);
	  return Fields;
	}();

	exports.Field = Field;
	exports.Api = Api;
	exports.Fields = Fields;
	exports.Presets = Presets;
	exports.AdditionalFilter = AdditionalFilter;

}((this.BX.Filter = this.BX.Filter || {}),BX.UI.EntitySelector,BX,BX,BX.Event,BX.Main,BX));
//# sourceMappingURL=script.js.map