var tools = require("../tools/tools");

var warn = tools.warn;
var replaceVars = tools.replaceVariables;

var KEYCODE_ENTER = 13;
var KEYCODE_ESCAPE = 27;

var ui = {

    confirm: function (interpreter, args) {

        var title, message, trueText, falseText, callback, root, dialog;
        var tEl, mEl, yesEl, noEl, container, pause, oldState, doNext;

        interpreter.waitCounter += 1;

        args = args || {};
        title = args.title || "Confirm?";
        message = args.message || "Do you want to proceed?";
        trueText = args.trueText || "Yes";
        falseText = args.falseText || "No";
        callback = typeof args.callback === "function" ? args.callback : function () {};
        root = args.parent || interpreter.stage;
        pause = args.pause === true ? true : false;
        oldState = interpreter.state;
        doNext = args.doNext === true ? true : false;

        if (pause === true) {
            interpreter.state = "pause";
        }

        container = document.createElement("div");
        container.setAttribute("class", "WSEUIContainer");
        container.setAttribute("data-wse-remove", "true");
        dialog = document.createElement("div");
        dialog.setAttribute("class", "WSEUIDialog WSEUIConfirm");

        tEl = document.createElement("div");
        tEl.innerHTML = title;
        tEl.setAttribute("class", "title");

        mEl = document.createElement("div");
        mEl.innerHTML = message;
        mEl.setAttribute("class", "message");

        yesEl = document.createElement("input");
        yesEl.setAttribute("value", trueText);
        yesEl.value = trueText;
        yesEl.setAttribute("class", "true button");
        yesEl.setAttribute("type", "button");
        yesEl.addEventListener("click",

        function (ev) {

            ev.stopPropagation();
            ev.preventDefault();
            root.removeChild(container);
            interpreter.waitCounter -= 1;
            //                     interpreter.keysDisabled -= 1;

            if (pause === true) {
                interpreter.state = oldState;
            }

            callback(true);

            if (doNext === true) {
                setTimeout(function () {
                    interpreter.next();
                }, 0);
            }
        });

        noEl = document.createElement("input");
        noEl.setAttribute("value", falseText);
        noEl.value = falseText;
        noEl.setAttribute("class", "false button");
        noEl.setAttribute("type", "button");
        noEl.addEventListener("click",

        function (ev) {

            ev.stopPropagation();
            ev.preventDefault();
            root.removeChild(container);
            interpreter.waitCounter -= 1;

            if (pause === true) {
                interpreter.state = oldState;
            }

            callback(false);

            if (doNext === true) {
                setTimeout(function () {
                    interpreter.next();
                }, 0);
            }
        });

        dialog.appendChild(tEl);
        dialog.appendChild(mEl);
        dialog.appendChild(yesEl);
        dialog.appendChild(noEl);
        container.appendChild(dialog);
        root.appendChild(container);

        yesEl.focus();
    },

    alert: function (interpreter, args) {

        var title, message, okText, callback, root, dialog;
        var tEl, mEl, buttonEl, container, pause, oldState, doNext;

        interpreter.waitCounter += 1;

        args = args || {};
        title = args.title || "Alert!";
        message = args.message || "Please take notice of this!";
        okText = args.okText || "OK";
        callback = typeof args.callback === "function" ? args.callback : function () {};
        root = args.parent || interpreter.stage;
        pause = args.pause === true ? true : false;
        oldState = interpreter.state;
        doNext = args.doNext === true ? true : false;

        if (pause === true) {
            interpreter.state = "pause";
        }

        container = document.createElement("div");
        container.setAttribute("class", "WSEUIContainer");
        container.setAttribute("data-wse-remove", "true");
        dialog = document.createElement("div");
        dialog.setAttribute("class", "WSEUIDialog WSEUIConfirm");

        tEl = document.createElement("div");
        tEl.innerHTML = title;
        tEl.setAttribute("class", "title");

        mEl = document.createElement("div");
        mEl.innerHTML = message;
        mEl.setAttribute("class", "message");

        buttonEl = document.createElement("input");
        buttonEl.setAttribute("value", okText);
        buttonEl.value = okText;
        buttonEl.setAttribute("class", "true button");
        buttonEl.setAttribute("type", "button");
        buttonEl.addEventListener("click",

        function (ev) {

            ev.stopPropagation();
            ev.preventDefault();
            root.removeChild(container);
            interpreter.waitCounter -= 1;

            if (pause === true) {
                interpreter.state = oldState;
            }

            callback(true);

            if (doNext === true) {
                setTimeout(function () {
                    interpreter.next();
                }, 0);
            }
        });

        dialog.appendChild(tEl);
        dialog.appendChild(mEl);
        dialog.appendChild(buttonEl);
        container.appendChild(dialog);
        root.appendChild(container);

        buttonEl.focus();
    },

    prompt: function (interpreter, args) {

        var title, message, submitText, cancelText, callback, root, dialog, oldState;
        var tEl, mEl, buttonEl, cancelEl, inputEl, container, pause, doNext;
        var allowEmptyInput, hideCancelButton, prefill;

        interpreter.waitCounter += 1;

        args = args || {};
        title = args.title || "Input required";
        message = args.message || "Please enter something:";
        submitText = args.submitText || "Submit";
        cancelText = args.cancelText || "Cancel";
        callback = typeof args.callback === "function" ? args.callback : function () {};
        root = args.parent || interpreter.stage;
        pause = args.pause === true ? true : false;
        oldState = interpreter.state;
        doNext = args.doNext === true ? true : false;
        allowEmptyInput = args.allowEmptyInput;
        hideCancelButton = args.hideCancelButton;
        prefill = args.prefill || "";

        if (pause === true) {
            interpreter.state = "pause";
        }

        container = document.createElement("div");
        container.setAttribute("class", "WSEUIContainer");
        container.setAttribute("data-wse-remove", "true");
        dialog = document.createElement("div");
        dialog.setAttribute("class", "WSEUIDialog WSEUIPrompt");

        tEl = document.createElement("div");
        tEl.innerHTML = title;
        tEl.setAttribute("class", "title");

        mEl = document.createElement("div");
        mEl.innerHTML = message;
        mEl.setAttribute("class", "message");

        inputEl = document.createElement("input");
        inputEl.setAttribute("value", prefill);
        inputEl.value = prefill;
        inputEl.setAttribute("class", "input text");
        inputEl.setAttribute("type", "text");

        inputEl.addEventListener("keyup", function (event) {

            if (cancelOnEscape()) {
                return;
            }

            if (allowEmptyInput) {
                submitOnEnter();
                return;
            }

            if (inputEl.value) {
                buttonEl.disabled = false;
                submitOnEnter();
            }
            else {
                buttonEl.disabled = true;
            }

            function submitOnEnter () {

                if (event.keyCode === KEYCODE_ENTER) {
                    buttonEl.click();
                }
            }

            function cancelOnEscape () {

                if (event.keyCode === KEYCODE_ESCAPE && !hideCancelButton) {
                    cancelEl.click();
                    return true;
                }

                return false;
            }
        });

        buttonEl = document.createElement("input");
        buttonEl.setAttribute("value", submitText);
        buttonEl.value = submitText;
        buttonEl.setAttribute("class", "submit button");
        buttonEl.setAttribute("type", "button");

        if (!allowEmptyInput && !prefill) {
            buttonEl.disabled = true;
        }

        buttonEl.addEventListener("click", function (ev) {

            var val = inputEl.value;

            if (!allowEmptyInput && !val) {
                return;
            }

            ev.stopPropagation();
            ev.preventDefault();
            root.removeChild(container);
            interpreter.waitCounter -= 1;

            if (pause === true) {
                interpreter.state = oldState;
            }

            callback(val);

            if (doNext === true) {

                setTimeout(function () {
                    interpreter.next();
                }, 0);
            }
        });

        cancelEl = document.createElement("input");
        cancelEl.setAttribute("value", cancelText);
        cancelEl.value = cancelText;
        cancelEl.setAttribute("class", "cancel button");
        cancelEl.setAttribute("type", "button");

        cancelEl.addEventListener("click", function (ev) {

            ev.stopPropagation();
            ev.preventDefault();
            root.removeChild(container);
            interpreter.waitCounter -= 1;

            if (pause === true) {
                interpreter.state = oldState;
            }

            callback(null);

            if (doNext === true) {

                setTimeout(function () {
                    interpreter.next();
                }, 0);
            }
        });

        dialog.appendChild(tEl);
        dialog.appendChild(mEl);
        dialog.appendChild(inputEl);
        dialog.appendChild(buttonEl);

        if (!hideCancelButton) {
            dialog.appendChild(cancelEl);
        }

        container.appendChild(dialog);
        root.appendChild(container);

        inputEl.focus();
    }

};

ui.makeInputFn = function (type) {

    return function (command, interpreter) {

        var title, message, container, key, doNext, hideCancelButton, allowEmptyInput;
        var submitText, cancelText, prefill;

        title = command.getAttribute("title") || "Input required...";
        message = command.getAttribute("message") || "Your input is required:";
        key = command.getAttribute("var") || null;
        submitText = command.getAttribute("submitText") || "";
        cancelText = command.getAttribute("cancelText") || "";
        prefill = command.getAttribute("prefill") || "";

        allowEmptyInput =
            replaceVars(command.getAttribute("allowEmptyInput") || "", interpreter) === "no" ?
                false :
                true;

        hideCancelButton =
            replaceVars(command.getAttribute("hideCancelButton") || "", interpreter) === "yes" ?
                true :
                false;

        doNext = replaceVars(command.getAttribute("next") || "", interpreter) === "false" ?
            false :
            true;

        if (key !== null) {
            key = replaceVars(key, interpreter);
        }

        title = replaceVars(title, interpreter);
        message = replaceVars(message, interpreter);
        cancelText = replaceVars(cancelText, interpreter);
        submitText = replaceVars(submitText, interpreter);
        prefill = replaceVars(prefill, interpreter);

        interpreter.bus.trigger("wse.interpreter.commands." + type, command);

        if (key === null) {
            warn(interpreter.bus, "No 'var' attribute defined on " + type +
                " command. Command ignored.", command);
            return {
                doNext: true
            };
        }

        container = interpreter.runVars;

        ui[type](
            interpreter,
            {
                title: title,
                message: message,
                pause: true,
                doNext: doNext,
                callback: function (decision) {
                    container[key] = "" + decision;
                },
                allowEmptyInput: allowEmptyInput,
                hideCancelButton: hideCancelButton,
                submitText: submitText,
                cancelText: cancelText,
                prefill: prefill
            }
        );

        return {
            doNext: true
        };
    };
};

module.exports = ui;

Documents

docs/reference/elements/nametemplate.md
docs/reference/elements/stop.md
docs/development.md
docs/documentation.md
docs/downloads.md
docs/examples.md
docs/games.md
docs/index.md
docs/reference/elements/alert.md
docs/reference/elements/animation.md
docs/reference/elements/assets.md
docs/reference/elements/audio.md
docs/reference/elements/background.md
docs/reference/elements/break.md
docs/reference/elements/character.md
docs/reference/elements/choice.md
docs/reference/elements/clear.md
docs/reference/elements/composite.md
docs/reference/elements/conditionals.md
docs/reference/elements/confirm.md
docs/reference/elements/curtain.md
docs/reference/elements/displayname.md
docs/reference/elements/do.md
docs/reference/elements/easing_attribute.md
docs/reference/elements/else.md
docs/reference/elements/flash.md
docs/reference/elements/flicker.md
docs/reference/elements/fn.md
docs/reference/elements/global.md
docs/reference/elements/globalize.md
docs/reference/elements/goto.md
docs/reference/elements/group.md
docs/reference/elements/hide.md
docs/reference/elements/image.md
docs/reference/elements/imagepack.md
docs/reference/elements/line.md
docs/reference/elements/localize.md
docs/reference/elements/move.md
docs/community.md
docs/reference/elements/option.md
docs/reference/elements/pause.md
docs/reference/elements/play.md
docs/reference/elements/prompt.md
docs/reference/elements/restart.md
docs/reference/elements/scene.md
docs/reference/elements/scenes.md
docs/reference/elements/set.md
docs/reference/elements/set_vars.md
docs/reference/elements/settings.md
docs/reference/elements/shake.md
docs/reference/elements/show.md
docs/reference/elements/source.md
docs/reference/elements/stage.md
docs/reference/elements/start.md
docs/beginners-guide.md
docs/reference/elements/sub.md
docs/reference/elements/tag.md
docs/reference/elements/textbox.md
docs/reference/elements/track.md
docs/reference/elements/transform.md
docs/reference/elements/trigger.md
docs/reference/elements/trigger_command.md
docs/reference/elements/triggers.md
docs/reference/elements/var.md
docs/reference/elements/wait.md
docs/reference/elements/when.md
docs/reference/elements/while.md
docs/reference/elements/with.md
docs/reference/elements/ws.md
docs/reference/elements.md
docs/reference/language.md
docs/reference/structure.md
docs/reference/syntax.md
docs/web-servers.md
libs/MO5/README.md
libs/MO5/libs/using.js/README.md
libs/MO5/js/EventBus.js
libs/MO5/js/Animation.js
libs/MO5/js/CoreObject.js
libs/MO5/js/Exception.js
libs/MO5/js/List.js
libs/MO5/js/MO5.js
libs/MO5/js/Map.js
libs/MO5/js/Point.js
libs/MO5/js/Promise.js
libs/MO5/js/Queue.js
libs/MO5/js/Result.js
libs/MO5/js/Set.js
libs/MO5/js/Size.js
libs/MO5/js/Timer.js
libs/MO5/js/TimerWatcher.js
libs/MO5/js/ajax.js
libs/MO5/js/assert.js
libs/MO5/js/dom.Element.js
libs/MO5/js/dom.effects.typewriter.js
libs/MO5/js/dom.escape.js
libs/MO5/js/easing.js
libs/MO5/js/fail.js
libs/MO5/js/globals.document.js
libs/MO5/js/globals.window.js
libs/MO5/js/range.js
libs/MO5/js/tools.js
libs/MO5/js/transform.js
libs/MO5/js/types.js
libs/MO5/libs/using.js/tests/index.js
libs/MO5/libs/using.js/tests/module1.js
libs/MO5/libs/using.js/tests/module2.js
libs/MO5/libs/using.js/tests/module3.js
libs/MO5/libs/using.js/using.js
libs/MO5/tests/node/EventBus.test.js
libs/MO5/tests/node/Set.test.js
src/savegames.js
src/tools/reveal.js
src/tools/ui.js
src/loader.js
src/tools/tools.js
src/tools/compile.js
src/functions.js
src/DisplayObject.js
src/Game.js
src/Interpreter.js
src/Keys.js
src/LoadingScreen.js
src/Trigger.js
src/assets/Audio.js
src/assets/Background.js
src/assets/Character.js
src/assets/Composite.js
src/assets/Curtain.js
src/assets/Imagepack.js
src/assets/Textbox.js
src/assets.js
src/bus.js
src/commands/alert.js
src/commands/break.js
src/commands/choice.js
src/commands/confirm.js
src/commands/do.js
src/commands/fn.js
src/commands/global.js
src/commands/globalize.js
src/commands/goto.js
src/commands/line.js
src/commands/localize.js
src/commands/prompt.js
src/commands/restart.js
src/commands/set_vars.js
src/commands/sub.js
src/commands/trigger.js
src/commands/var.js
src/commands/wait.js
src/commands/while.js
src/commands/with.js
src/commands.js
src/dataSources/LocalStorage.js
src/dataSources.js
src/engine.js
src/extensions/button.js
src/extensions/colored-rectangle.js
src/extensions/get-backtrace.js
src/extensions/hello.js
src/extensions/side-images.js
CHANGELOG.md
LICENSE.md
README.md
build.js
index.js
index.md
package.js