Source: ContainerController.js

/**
 * @summary 追加コンテナの表示制御
 *
 * @class ContainerController
 */
class ContainerController
{
    /**
     * @summary コンストラクタ
     * @param {HTMLElement}                         container           ルートコンテナ(Viewerクラスのcontainer_element)
     * @param {object}                              options             表示オプション
     * @param {boolean}                             options.visibility  表示・非表示
     * @param {ContainerPosition}                   options.position    表示位置
     * @memberof ContainerController
     */
    constructor( container, options )
    {
        this._visibility = ( options && options.visibility ) || true;
        this._position = ( options && options.position ) || ContainerPosition.TOP_LEFT;

        var container_element;
        if ( typeof container == "string" ) {
            // コンテナを ID 指定したとき
            container_element = document.getElementById( container );
        }
        else {
            // コンテナを直接要素で指定のとき
            container_element = container;
        }

        this._viewer_container = container_element;
        this._container = null;
        this._is_compact = false;

        var self = this;
        window.addEventListener("resize", function() { self._sizeChanged(); }, false);
    }

    /**
     * @summary 表示・非表示の設定
     *
     * @param {boolean} visibility
     * @memberof ContainerController
     */
    setVisibility( visibility )
    {
        this._visibility = visibility;

        // 表示状態の更新
        this._setContainerVisibility();
    }

    /**
     * @summary 表示位置
     *
     * @param {ContainerPosition}   position
     * @memberof ContainerController
     */
    setPosition( position )
    {
        this._position = position;

        // コンテナの再作成
        this._deleteContainer();
        this.createContainer();
    }

    /**
     * @summary コンテナの表示設定
     *
     * @memberof ContainerController
     */
    _setContainerVisibility()
    {
        if(this._container)
        {
            ( this._visibility ) ? this._container.style.visibility = "visible" : this._container.style.visibility = "collapse"
        }
    }

    /**
     * @summary インスタンスの破棄
     *
     * @memberof ContainerController
     */
    _destroy()
    {
        var self = this;
        window.removeEventListener( "resize", function () { self._sizeChanged(); }, false );

        this._deleteContainer();
    }

    /**
     * @summary 追加コンテナの削除
     *
     * @memberof ContainerController
     */
    _deleteContainer()
    {
        var parent_container = this._container.parentElement;
        parent_container.removeChild( this._container );
        this._container = null;
    }

    /**
     * @summary リサイズイベント
     *
     * @memberof ContainerController
     * @abstract
     */
    _sizeChanged()
    {

    }

    /**
     * @summary 追加コンテナの作成
     *
     * @memberof ContainerController
     * @abstract
     */
    createContainer()
    {
    }
}

/**
 * @summary ロゴ・著作権表示位置の列挙型
 * @enum {object}
 * @memberof ContainerController
 * @constant
 */
var ContainerPosition = {
    /** 
     * 左上
     */
    TOP_LEFT: { id: "top-left" },

    /** 
     * 右上 
     */
    TOP_RIGHT: { id: "top-right" },

    /**
     * 左下
     */
    BOTTOM_LEFT: { id: "bottom-left" },

    /**
     * 右下
     */
    BOTTOM_RIGHT: { id: "bottom-right" }
};

{
    ContainerController._compact_size = 500;

    ContainerController.ContainerPosition = ContainerPosition;
}

export default ContainerController;