/**
 * HTML элемент-контейнер
 *
 * @extends Element_Abstract
 */
function Container_Element_Abstract()
{
    Container_Element_Abstract.superclass.constructor.call(this);
    
    /**
     * Нод-контейнер. Включает в себя все элементы, добавленные в этот Container_Element_Abstract
     * 
     * @var DOM Element
     */
    this._containerElement = {};
    
    /**
     * Элемент для хранения безопасно удаленных DOM элементов из контейнера
     * 
     * @see Container_Element_Abstract._removeChildsSafe()
     *  
     * @var DOM Element
     */
    this._tempElement = Rup.create('div');
    
    /**
     * Список добавленных элементов в контейнер (как DOM Element, так и Element_Abstract)
     * 
     * @var Array
     */
    this._childs = [];
}

Rup.extend(Container_Element_Abstract, Element_Abstract);

/**
 * @param DOM Element
 */
Container_Element_Abstract.prototype._setContainerElement = function(element)
{
    this._containerElement = element;
}

/**
 * Безопасно уничтожает элементы в контейнере путем переброски их DOM Element в темповый элемент. Служит для того, 
 * чтобы HTML из удаленных Element_Abstract не уничтожался в IE (сборщик мусора, судя по всему, не обращает внимания, что
 * на элементы еще есть ссылки и удаляет объекты после того, как удаляется HTML из элемента-контейнера)
 */
Container_Element_Abstract.prototype._removeChildsSafe = function()
{
    for( var i = 0; i < this._childs.length; i++ )
    {
        this._tempElement.appendChild( this._childs[i] instanceof Element_Abstract ? this._childs[i]._baseElement : this._childs[i] );
    }
    this._childs = [];
}


/**
 * Обычное удаление всех дочерних элементов
 */
Container_Element_Abstract.prototype._removeChilds = function()
{
    this._containerElement.innerHTML = '';
    this._childs = [];
}

/**
 * Добавление элемента в контейнер
 * 
 * @param 
 *   DOM Element
 *   Element_Abstract
 */
Container_Element_Abstract.prototype.appendChild = function( element )
{
    if( element instanceof Element_Abstract )
    {
        this._containerElement.appendChild(element._baseElement);
        element._parentElement = this;
    }
    else
    {
        this._containerElement.appendChild(element);
    }
    this._childs.push(element);
}

/**
 * Удаление элемента из контейнера
 * 
 * @param DOM Element | Element_Abstract
 */
Container_Element_Abstract.prototype.removeChild = function( element )
{
	var domElement = element instanceof Element_Abstract ? element.dom() : element;
	
	for( var i = 0; i < this._childs.length; i++)
	{
		var tmpEl = this._childs[i];
		if(tmpEl == element)
		{
			this._tempElement.appendChild(domElement);
			this._childs.splice(i, 1);
		}
	}
}