AMQ Window Script

ฺBASIC AMQ Window Script

Version au 01/05/2025. Voir la dernière version.

Ce script ne doit pas être installé directement. C'est une librairie destinée à être incluse dans d'autres scripts avec la méta-directive // @require https://update.greatest.deepsurf.us/scripts/534648/1581420/AMQ%20Window%20Script.js

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// AMQ Window Script
// This code is fetched automatically
// Do not attempt to add it to tampermonkey

if (typeof Listener === "undefined") return;
windowSetup();

class AMQWindow {
    constructor(data) {
        this.id = data.id === undefined ? "" : data.id;
        this.title = data.title === undefined ? "Window" : data.title;
        this.resizable = data.resizable === undefined ? false : data.resizable;
        this.draggable = data.draggable === undefined ? false : data.draggable;
        this.width = data.width === undefined ? 200 : data.width;
        this.height = data.height === undefined ? 300 : data.height;
        this.minWidth = data.minWidth === undefined ? 200 : data.minWidth;
        this.minHeight = data.minHeight === undefined ? 300: data.minHeight;
        this.position = data.position === undefined ? {x: 0, y: 0} : data.position;
        this.closeHandler = data.closeHandler === undefined ? function () {} : data.closeHandler;
        this.zIndex = data.zIndex === undefined ? 1060 : data.zIndex;
        this.resizers = null;
        this.panels = [];

        this.window = $("<div></div>")
            .addClass("customWindow")
            .addClass(data.class === undefined ? "" : data.class)
            .attr("id", this.id)
            .css("position", "absolute")
            .css("z-index", this.zIndex.toString())
            .offset({
                top: this.position.y !== undefined ? this.position.y : 0,
                left: this.position.x !== undefined ? this.position.x : 0
            })
            .height(this.height)
            .width(this.width)

        this.content = $(`<div class="customWindowContent"></div>`);

        this.header = $("<div></div>")
            .addClass("modal-header customWindowHeader")
            .addClass(this.draggable === true ? "draggableWindow" : "")
            .append($(`<div class="close" type="button"><span aria-hidden="true">×</span></div>`)
                .click(() => {
                    this.close(this.closeHandler);
                })
            )
            .append($("<h2></h2>")
                .addClass("modal-title")
                .text(this.title)
            )

        this.body = $(`<div class="modal-body customWindowBody"></div>`)
            .addClass(this.resizable === true ? "resizableWindow" : "")
            .height(this.height - 75);

        if (this.resizable === true) {
            this.resizers = $(
                `<div class="windowResizers">
                    <div class="windowResizer top-left"></div>
                    <div class="windowResizer top-right"></div>
                    <div class="windowResizer bottom-left"></div>
                    <div class="windowResizer bottom-right"></div>
                </div>`
            );
        }

        this.content.append(this.header);
        this.content.append(this.body);
        if (this.resizers !== null) {
            this.window.append(this.resizers);
            let tmp = this;
            let startWidth = 0;
            let startHeight = 0;
            let startX = 0;
            let startY = 0;
            let startMouseX = 0;
            let startMouseY = 0;
            this.resizers.find(".windowResizer").each(function (index, resizer) {
                $(resizer).mousedown(function (event) {
                    tmp.window.css("user-select", "none");
                    startWidth = tmp.window.width();
                    startHeight = tmp.window.height();
                    startX = tmp.window.position().left;
                    startY = tmp.window.position().top;
                    startMouseX = event.originalEvent.clientX;
                    startMouseY = event.originalEvent.clientY;
                    let curResizer = $(this);
                    $(document.documentElement).mousemove(function (event) {
                        if (curResizer.hasClass("bottom-right")) {
                            let newWidth = startWidth + (event.originalEvent.clientX - startMouseX);
                            let newHeight = startHeight + (event.originalEvent.clientY - startMouseY);
                            if (newWidth > tmp.minWidth) {
                                tmp.window.width(newWidth);
                            }
                            if (newHeight > tmp.minHeight) {
                                tmp.body.height(newHeight - 103);
                                tmp.window.height(newHeight);
                            }
                        }
                        if (curResizer.hasClass("bottom-left")) {
                            let newWidth = startWidth - (event.originalEvent.clientX - startMouseX);
                            let newHeight = startHeight + (event.originalEvent.clientY - startMouseY);
                            let newLeft = startX + (event.originalEvent.clientX - startMouseX);
                            if (newWidth > tmp.minWidth) {
                                tmp.window.width(newWidth);
                                tmp.window.css("left", newLeft + "px");
                            }
                            if (newHeight > tmp.minHeight) {
                                tmp.body.height(newHeight - 103);
                                tmp.window.height(newHeight);
                            }
                        }
                        if (curResizer.hasClass("top-right")) {
                            let newWidth = startWidth + (event.originalEvent.clientX - startMouseX);
                            let newHeight = startHeight - (event.originalEvent.clientY - startMouseY);
                            let newTop = startY + (event.originalEvent.clientY - startMouseY);
                            if (newWidth > tmp.minWidth) {
                                tmp.window.width(newWidth);
                            }
                            if (newHeight > tmp.minHeight) {
                                tmp.window.css("top", newTop + "px");
                                tmp.body.height(newHeight - 103);
                                tmp.window.height(newHeight);
                            }
                        }
                        if (curResizer.hasClass("top-left")) {
                            let newWidth = startWidth - (event.originalEvent.clientX - startMouseX);
                            let newHeight = startHeight - (event.originalEvent.clientY - startMouseY);
                            let newLeft = startX + (event.originalEvent.clientX - startMouseX);
                            let newTop = startY + (event.originalEvent.clientY - startMouseY);
                            if (newWidth > tmp.minWidth) {
                                tmp.window.width(newWidth);
                                tmp.window.css("left", newLeft + "px");
                            }
                            if (newHeight > tmp.minHeight) {
                                tmp.window.css("top", newTop + "px");
                                tmp.body.height(newHeight - 103);
                                tmp.window.height(newHeight);
                            }
                        }
                    });
                    $(document.documentElement).mouseup(function (event) {
                        $(document.documentElement).off("mousemove");
                        $(document.documentElement).off("mouseup");
                        tmp.window.css("user-select", "text");
                    });
                });
            });
        }
        if (this.draggable === true) {
            this.window.draggable({
                handle: this.header,
                containment: "#gameContainer"
            });
        }

        this.window.append(this.content);
        $("#gameContainer").append(this.window);
    }

    setId(newId) {
        this.id = newId;
        this.window.attr("id", this.id);
    }

    addClass(newClass) {
        this.window.addClass(newClass);
    }

    removeClass(removedClass) {
        this.window.removeClass(removedClass);
    }

    setWidth(newWidth) {
        this.width = newWidth;
        this.window.width(this.width);
    }

    setTitle(newTitle) {
        this.title = newTitle;
        this.header.find(".modal-title").text(newTitle);
    }

    setZIndex(newZIndex) {
        this.zIndex = newZIndex;
        this.window.css("z-index", this.zIndex.toString());
    }

    isVisible() {
        return this.window.is(":visible");
    }

    clear() {
        this.body.children().remove();
    }

    open() {
        this.window.show();
    }

    open(handler) {
        this.window.show();
        if (handler !== undefined) {
            handler();
        }
    }

    close() {
        this.window.hide();
    }

    close(handler) {
        this.window.hide();
        if (handler !== undefined) {
            handler();
        }
    }

    addPanel(data) {
        let newPanel = new AMQWindowPanel(data);
        this.panels.push(newPanel);
        this.body.append(newPanel.panel);
    }
}

class AMQWindowPanel {
    constructor(data) {
        this.id = data.id === undefined ? "" : data.id;
        this.width = data.width === undefined ? 200 : data.width;
        this.height = data.height === undefined ? 300 : data.height;
        this.position = data.position === undefined ? {x: 0, y: 0} : data.position;
        this.scrollable = data.scrollable === undefined ? {x: false, y: false} : data.scrollable;
        this.panels = [];

        this.panel = $("<div></div>")
            .addClass("customWindowPanel")
            .addClass(data.class === undefined ? "" : data.class)
            .attr("id", this.id)
            .css("position", "absolute")

        this.updateWidth();
        this.updateHeight();
        this.updatePosition();
        this.updateScrollable();
    }

    setId(newId) {
        this.id = newId;
        this.panel.attr("id", this.id);
    }

    addClass(newClass) {
        this.panel.addClass(newClass);
    }

    removeClass(removedClass) {
        this.panel.removeClass(removedClass);
    }

    setWidth(newWidth) {
        this.width = newWidth;
        this.updateWidth();
    }

    setHeight(newHeight) {
        this.height = newHeight;
        this.updateHeight();
    }

    updateWidth() {
        if (typeof this.width === "string") {
            this.panel.css("width", this.width);
        }
        else if (parseFloat(this.width) >= 0.0 && parseFloat(this.width) <= 1.0) {
            this.panel.css("width", (parseFloat(this.width) * 100) + "%");
        }
        else {
            this.panel.width(parseInt(this.width));
        }
    }

    updateHeight() {
        if (typeof this.height === "string") {
            this.panel.css("height", this.height);
        }
        else if (parseFloat(this.height) >= 0.0 && parseFloat(this.height) <= 1.0) {
            this.panel.css("height", (parseFloat(this.height) * 100) + "%");
        }
        else {
            this.panel.height(parseInt(this.height));
        }
    }

    setPositionX(newPositionX) {
        this.position.x = newPositionX;
        this.updatePosition();
    }

    setPositionY(newPositionY) {
        this.position.y = newPositionY;
        this.updatePosition();
    }

    setPosition(newPosition) {
        this.position.x = newPosition.x;
        this.position.y = newPosition.y;
        this.updatePosition();
    }

    updatePosition() {
        if (typeof this.position.x === "string") {
            this.panel.css("left", this.position.x);
        }
        else if (parseFloat(this.position.x) >= 0.0 && parseFloat(this.position.x) <= 1.0) {
            this.panel.css("left", (parseFloat(this.position.x) * 100) + "%");
        }
        else {
            this.panel.css("left", parseInt(this.position.x) + "px");
        }

        if (typeof this.position.y === "string") {
            this.panel.css("top", this.position.y);
        }
        else if (parseFloat(this.position.y) >= 0.0 && parseFloat(this.position.y) <= 1.0) {
            this.panel.css("top", (parseFloat(this.position.y) * 100) + "%");
        }
        else {
            this.panel.css("top", parseInt(this.position.y) + "px");
        }
    }

    setScrollableX(newScrollableX) {
        this.scrollable.x = newScrollableX;
        this.updateScrollable();
    }

    setScrollableY(newScrollableY) {
        this.scrollable.y = newScrollableY;
        this.updateScrollable();
    }

    updateScrollable() {
        this.panel.css("overflow-x", this.scrollable.x === true ? "auto" : "hidden");
        this.panel.css("overflow-y", this.scrollable.y === true ? "auto" : "hidden");
    }

    show() {
        this.panel.show();
    }

    show(handler) {
        this.show();
        handler();
    }

    hide() {
        this.panel.hide();
    }

    hide(handler) {
        this.hide();
        handler();
    }

    addPanel(data) {
        let newPanel = new AMQWindowPanel(data);
        this.panels.push(newPanel);
        this.panel.append(newPanel.panel);
    }

    clear() {
        this.panel.children().remove();
    }
}

function windowSetup() {
    if ($("#customWindowStyle").length) return;
    let style = document.createElement("style");
    style.type = "text/css";
    style.id = "customWindowStyle";
    style.appendChild(document.createTextNode(`
        .customWindow {
            overflow-y: hidden;
            top: 0px;
            left: 0px;
            margin: 0px;
            background-color: #424242;
            border: 1px solid rgba(27, 27, 27, 0.2);
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
            user-select: text;
            display: none;
        }
        .draggableWindow {
            cursor: move;
        }
        .customWindowBody {
            width: 100%;
            overflow-y: auto;
        }
        .customWindowContent {
            width: 100%;
            position: absolute;
            top: 0px;
        }
        .customWindow .close {
            font-size: 32px;
        }
        .windowResizers {
            width: 100%;
            height: 100%;
        }
        .windowResizer {
            width: 10px;
            height: 10px;
            position: absolute;
            z-index: 100;
        }
        .windowResizer.top-left {
            top: 0px;
            left: 0px;
            cursor: nwse-resize;
        }
        .windowResizer.top-right {
            top: 0px;
            right: 0px;
            cursor: nesw-resize;
        }
        .windowResizer.bottom-left {
            bottom: 0px;
            left: 0px;
            cursor: nesw-resize;
        }
        .windowResizer.bottom-right {
            bottom: 0px;
            right: 0px;
            cursor: nwse-resize;
        }
    `));
    document.head.appendChild(style);
}