/*!
 * Jodit Editor (https://xdsoft.net/jodit/)
 * Released under MIT see LICENSE.txt in the project root for license information.
 * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net
 */
import { Dom } from "../../core/dom/index.js";
import { pluginSystem } from "../../core/global.js";
import { Config } from "../../config.js";
/**
 * After loading the page into the editor once the focus is set
 */
Config.prototype.autofocus = false;
/**
 * Cursor position after autofocus
 */
Config.prototype.cursorAfterAutofocus = 'end';
/**
 * Save current selection on blur event
 */
Config.prototype.saveSelectionOnBlur = true;
export function focus(editor) {
    if (editor.o.saveSelectionOnBlur) {
        editor.e
            .on('blur', () => {
            if (editor.isEditorMode()) {
                editor.s.save(true);
            }
        })
            .on('focus', () => {
            editor.s.restore();
        });
    }
    const focus = () => {
        editor.s.focus();
        let textNode = null;
        switch (editor.o.cursorAfterAutofocus) {
            case 'start':
                textNode = Dom.first(editor.editor, node => Dom.isText(node));
                break;
            case 'end':
                textNode = Dom.last(editor.editor, node => Dom.isText(node));
                break;
        }
        if (textNode) {
            editor.s.setCursorIn(textNode, editor.o.cursorAfterAutofocus === 'start');
        }
    };
    editor.e.on('afterInit', () => {
        if (editor.o.autofocus) {
            if (editor.defaultTimeout) {
                editor.async.setTimeout(focus, 300);
            }
            else {
                focus();
            }
        }
    });
    editor.e.on('afterInit afterAddPlace', () => {
        editor.e
            .off(editor.editor, 'mousedown.autofocus')
            .on(editor.editor, 'mousedown.autofocus', (e) => {
            if (editor.isEditorMode() &&
                e.target &&
                Dom.isBlock(e.target) &&
                !e.target.childNodes.length) {
                if (editor.editor === e.target) {
                    editor.s.focus();
                }
                else {
                    editor.s.setCursorIn(e.target);
                }
            }
        });
    });
}
pluginSystem.add('focus', focus);
