window.Title = (() => {
    /**
     * Gère le titre de la page.
     */
    class Title
    {
        constructor()
        {
            Object.defineProperty(this, 'is_framed', {
                enumerable: false,
                configurable: false,
                writable: false,
                value: parent !== window
              });
              Object.defineProperty(this, 'defaultTitle', {
                enumerable: false,
                configurable: false,
                writable: false,
                value: window.document.title
              });
        }

        /**
         * Met à jours le titre de la page.
         * @param {string} id Si il ne vaut pas nul, il met à jours le titre de la page via le titre d'une frame. 
         * Sinon, il met à jours le titre html ou le titre de la page en fonction de si on est appelé via une frame ou non.
         * @param {boolean} focus si vrai, focus le titre html de la page après avoir mis à jours le titre.
         * @returns {void}
         */
        update(id = null, focus = true)
        {
            let doFocus = false;

            try {

                if (id !== null)
                {
                    if (this.is_framed)
                        top.Title.set(top.$("iframe#${id}")[0].contentWindow.document.title, focus);//mel_metapage.Functions.call(`Title.set($("iframe#${id}")[0].contentWindow.document.title, ${focus})`);
                    else
                        this.set($(`iframe#${id}`)[0].contentWindow.document.title, focus);
                }
                else if (this.is_framed)
                    this.set(window.document.title, focus);
                else
                {
                    $(`#${Title.idQuery}`).html(window.document.title);
                    doFocus = true;
                }

            } catch (error) {
                //console.error("###[Title.update]",error, this);
            }

            if (focus && doFocus)
                this.focusHidden();
        }

        async updateAsync(id = null, focus = false)
        {
            // let doFocus = false;

            // try {

            //     if (id !== null)
            //     {
            //         if (this.is_framed)
            //             await mel_metapage.Functions.callAsync(`await Title.set($("iframe#${id}")[0].contentWindow.document.title, ${focus})`);
            //         else
            //             await this.set($(`iframe#${id}`)[0].contentWindow.document.title, focus);
            //     }
            //     else if (this.is_framed)
            //         await this.set(window.document.title, focus);
            //     else
            //     {
            //         $(`#${Title.idQuery}`).html(window.document.title);
            //         doFocus = true;
            //     }

            // } catch (error) {
            //     //console.error("###[Title.update]",error, this);
            // }

            // if (focus && doFocus)
            //     this.focusHidden();
            this.update();
        }

        /**
         * Met à jours le titre du navigateur ainsi que le titre html.
         * @async
         * @param {string} title Nouveau titre.
         * @param {boolean} focus Si vrai, le titre html est focus après le changement de titre.
         */
        async set(title, focus = true)
        {
            //await mel_metapage.Functions.callAsync(`window.document.title = '${title}';$('#${Title.idQuery}').html('${title}');`);
            top.document.title = title;
            top.$(`#${Title.idQuery}`).html('${title}');

            if (focus)
                this.focusHidden();
        }

        /**
         * Focus le titre html caché.
         */
        focusHidden()
        {
            if (this.is_framed)
                top.Title.focusHidden();//mel_metapage.Functions.call('Title.focusHidden()');
            else
                $(`#${Title.idQuery}`).focus();
            
        }
    }

    Object.defineProperty(Title, 'idQuery', {
        enumerable: false,
        configurable: false,
        writable: false,
        value: "sr-document-title-focusable"
      });

    return new Title();
})();