UI/Menu/MenuElement.js

/**
* Выполняет callback для каждого элемента меню.
* @param {function} callback         Выполняется для каждого элемента, имеет три параметра `element, i, len`.
* @param {boolean}  [includeSpecial] Нужно ли включать в цикл специальные элементы из {@link Menu#specialElements}.
*/
Menu.prototype.forEachElement = function(callback, includeSpecial){
	var ii = 0, i = 0;
	var len = includeSpecial ? this.elements.length : this.elements.length - this.specialElements.length;

	for(; i < this.elements.length; i++){
		var element = this.elements[i];

		if(~this.specialElements.indexOf(element) && !includeSpecial){
			continue;
		}

		callback.call(this, this.elements[i], ii, i, len);
		ii++;
	}
};

/**
* Удаляет и опционально уничтожает все элементы меню.
* @param  {boolean} [destroy] нужно ли уничтожать объекты
*/
Menu.prototype.removeAllElements = function(destroy){
	this.forEachElement(function(el){
		this.remove(el, destroy);
	});
	this.layout.length = 0;
	this.hiddenElements.length = 0;
	this.disabledElements.length = 0;
	this.elements = this.specialElements.slice();
};

/**
* Возвращает элемент меню с указанным именем.
* @param {string} name Имя элемента.
*
* @return {DisplayObject} Элемент с `name`, равным указанному.
*/
Menu.prototype.getElementByName = function(name){
	for (var i = 0; i < this.elements.length; i++){

		if (this.elements[i].name === name){
			return this.elements[i];
		}

	}
	return null;
};

/** 
* Прячет элемент меню с указанным именем.
* Чтобы элемент прятался только при следующем открытии меню, нужно предварительно запустить `fadeOut`.
* @param {string} name Имя элемента.
*/
Menu.prototype.hideElement = function(name){
	var el = this.getElementByName(name);
	var i = this.hiddenElements.indexOf(el);

	if(!el || ~i){
		return;
	}

	this.hiddenElements.push(el);
	if(this._fading != -1){
		el.hide();

		if(this.visible){
			this.updatePosition();
		}
	}
};

/** 
* Прячет элемент меню с указанным именем.
* Чтобы элемент показывался только при следующем открытии меню, нужно предварительно запустить `fadeOut`.
* @param {string} name Имя элемента.
*/
Menu.prototype.showElement = function(name){
	var el = this.getElementByName(name);
	var i = this.hiddenElements.indexOf(el);

	if(!el || !~i){
		return;
	}

	this.hiddenElements.splice(i, 1);

	if(this._fading != -1){
		el.show();

		if(this.visible){
			this.updatePosition();
		}
	}
};

/**
* Отключает элемент с указанным именем.
* @param {string} name Имя элемента.
*/
Menu.prototype.disableElement = function(name){
	var el = this.getElementByName(name);
	var i = this.disabledElements.indexOf(el);

	if(!el || ~i){
		return;
	}

	this.disabledElements.push(el);
	if(this._fading == 0){
		el.disable();
	}
};

/**
* Включает элемент с указанным именем.
* @param {string} name Имя элемента.
*/
Menu.prototype.enableElement = function(name){
	var el = this.getElementByName(name);
	var i = this.disabledElements.indexOf(el);

	if(!el || !~i){
		return;
	}

	this.disabledElements.splice(i, 1);
	if(this._fading == 0){
		el.enable();
	}
};