Path: blob/main/public/games/files/webretro/assets/jswindow.js
1034 views
// creation args: title (string), icon(url string)1// open args: width, height, left, top (all are numbers)23function jswindow(args) {4// specify options here5var borderThickness = 2;6var defaultWidth = 250;7var defaultHeight = 150;8var topClip = 0;9var bottomClip = 24;10var leftClip = 48;11var rightClip = 24;1213// vWindow instead of this for event.target workaround14var vWindow = this;1516function randInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }17function clipRight() { return parseInt(vWindow.outerWindow.style.width) + parseInt(vWindow.outerWindow.style.left) + (borderThickness * 2) > window.innerWidth; }18function clipBottom() { return parseInt(vWindow.outerWindow.style.height) + parseInt(vWindow.outerWindow.style.top) + (borderThickness * 2) > window.innerHeight; }1920this.setTitle = function(text) {21vWindow.outerWindow.bar.wname.textContent = text;22}2324this.setIcon = function(url) {25vWindow.outerWindow.bar.icon.style.backgroundImage = 'url("' + url + '")';26}2728// open window with optional width and height (will otherwise be default) and distances from the top left (otherwise random)29this.open = function(args) {30vWindow.outerWindow.style.width = (args && args.width ? args.width + "px" : defaultWidth + "px");31vWindow.outerWindow.style.height = (args && args.height ? args.height + "px" : defaultHeight + "px");32vWindow.outerWindow.style.left = (args && args.left ? args.left + "px" : randInt(0, window.innerWidth - parseInt(vWindow.outerWindow.style.width)) + "px");33vWindow.outerWindow.style.top = (args && args.top ? args.top + "px" : randInt(0, window.innerHeight - parseInt(vWindow.outerWindow.style.height)) + "px");34vWindow.outerWindow.style.maxWidth = (window.innerWidth - (parseInt(vWindow.outerWindow.style.left) + (borderThickness * 2))) + "px";35vWindow.outerWindow.style.maxHeight = (window.innerHeight - (parseInt(vWindow.outerWindow.style.top) + (borderThickness * 2))) + "px";36document.body.appendChild(vWindow.outerWindow);37}3839this.onclose = function() {}4041this.close = function() {42vWindow.outerWindow.remove();43vWindow.onclose();44}4546// start constructor creation47// make nodes48vWindow.outerWindow = document.createElement("div");49vWindow.outerWindow.classList.add("window");5051vWindow.outerWindow.bar = document.createElement("div");52vWindow.outerWindow.bar.classList.add("windowbar");5354if (args && args.icon) {55vWindow.outerWindow.bar.icon = document.createElement("span");56vWindow.outerWindow.bar.icon.classList.add("windowicon");57vWindow.outerWindow.bar.icon.style.backgroundImage = 'url("' + args.icon + '")';58vWindow.outerWindow.bar.appendChild(vWindow.outerWindow.bar.icon);59}6061vWindow.outerWindow.bar.wname = document.createElement("span");62vWindow.outerWindow.bar.wname.appendChild(document.createTextNode(args && args.title ? args.title : ""));63vWindow.outerWindow.bar.wname.classList.add("windowtitle");6465vWindow.outerWindow.bar.close = document.createElement("span");66vWindow.outerWindow.bar.close.appendChild(document.createTextNode(String.fromCharCode(10006)));67vWindow.outerWindow.bar.close.classList.add("windowclose");68vWindow.outerWindow.bar.close.title = "Close";69vWindow.outerWindow.bar.close.onclick = vWindow.close;7071vWindow.innerWindow = document.createElement("div");72vWindow.innerWindow.classList.add("windowcontent");7374// icon already appended if specified75vWindow.outerWindow.bar.appendChild(vWindow.outerWindow.bar.wname);76vWindow.outerWindow.bar.appendChild(vWindow.outerWindow.bar.close);77vWindow.outerWindow.appendChild(vWindow.outerWindow.bar);78vWindow.outerWindow.appendChild(vWindow.innerWindow);7980// move window to front81vWindow.outerWindow.addEventListener("mousedown", function(e) {82var allwindows = Array.from(document.querySelectorAll("div.window"));83if ((allwindows.indexOf(vWindow.outerWindow) != (allwindows.length - 1)) && e.target != vWindow.outerWindow.bar.close) document.body.appendChild(vWindow.outerWindow);84}, false);8586// move window around87var oldcursorX, oldcursorY;88vWindow.outerWindow.bar.addEventListener("mousedown", function(e) {89if ((e.target != vWindow.outerWindow.bar.close) && (e.button == 0)) {90e.preventDefault();91oldcursorX = e.clientX;92oldcursorY = e.clientY;93document.addEventListener("mousemove", windowDrag, false);94document.addEventListener("mouseup", windowDragEnd, false);95}96}, false);9798function windowDrag(e) {99e.preventDefault();100vWindow.outerWindow.style.left = (vWindow.outerWindow.offsetLeft - (oldcursorX - e.clientX)) + "px";101oldcursorX = e.clientX;102vWindow.outerWindow.style.top = (vWindow.outerWindow.offsetTop - (oldcursorY - e.clientY)) + "px";103oldcursorY = e.clientY;104}105106// pop window back into view area, and set max dimensions if it's not clipping into bottom right107function windowDragEnd() {108document.removeEventListener("mousemove", windowDrag);109document.removeEventListener("mouseup", windowDragEnd);110vWindow.outerWindow.style.left = Math.min(Math.max(vWindow.outerWindow.offsetLeft, 0 - parseInt(vWindow.outerWindow.style.width) + leftClip), window.innerWidth - rightClip) + "px";111vWindow.outerWindow.style.top = Math.min(Math.max(vWindow.outerWindow.offsetTop, topClip), window.innerHeight - bottomClip) + "px";112if (!clipRight()) vWindow.outerWindow.style.maxWidth = (window.innerWidth - (parseInt(vWindow.outerWindow.style.left) + (borderThickness * 2))) + "px";113if (!clipBottom()) vWindow.outerWindow.style.maxHeight = (window.innerHeight - (parseInt(vWindow.outerWindow.style.top) + (borderThickness * 2))) + "px";114}115// end constructor creation116}117118