var whiteboardId = getQueryVariable("whiteboardid"); var randomid = getQueryVariable("randomid"); if (randomid && !whiteboardId) { //set random whiteboard on empty whiteboardid whiteboardId = Array(2).fill(null).map(() => Math.random().toString(36).substr(2)).join(''); const urlParams = new URLSearchParams(window.location.search); urlParams.set('whiteboardid', whiteboardId); window.location.search = urlParams; } whiteboardId = whiteboardId || "myNewWhiteboard"; whiteboardId = unescape(encodeURIComponent(whiteboardId)).replace(/[^a-zA-Z0-9 ]/g, ""); var myUsername = getQueryVariable("username"); var accessToken = getQueryVariable("accesstoken"); myUsername = myUsername || "unknown" + (Math.random() + "").substring(2, 6); accessToken = accessToken || ""; var accessDenied = false; // Custom Html Title var title = getQueryVariable("title"); if (!title === false) { document.title = decodeURIComponent(title); } var url = document.URL.substr(0, document.URL.lastIndexOf('/')); var signaling_socket = null; var urlSplit = url.split("/"); var subdir = ""; for (var i = 3; i < urlSplit.length; i++) { subdir = subdir + '/' + urlSplit[i]; } if (subdir != "") { signaling_socket = io("", { "path": subdir + "/socket.io" }); //Connect even if we are in a subdir behind a reverse proxy } else { signaling_socket = io(); } signaling_socket.on('connect', function () { console.log("Websocket connected!"); signaling_socket.on('drawToWhiteboard', function (content) { whiteboard.handleEventsAndData(content, true); }); signaling_socket.on('refreshUserBadges', function () { whiteboard.refreshUserBadges(); }); signaling_socket.on('wrongAccessToken', function () { if (!accessDenied) { accessDenied = true; showBasicAlert("Access denied! Wrong accessToken!") } }); signaling_socket.on('updateSmallestScreenResolution', function (widthHeight) { whiteboard.updateSmallestScreenResolution(widthHeight["w"], widthHeight["h"]); }); signaling_socket.emit('joinWhiteboard', { wid: whiteboardId, at: accessToken, windowWidthHeight: { w: $(window).width(), h: $(window).height() } }); }); $(document).ready(function () { if (getQueryVariable("webdav") == "true") { $("#uploadWebDavBtn").show(); } whiteboard.loadWhiteboard("#whiteboardContainer", { //Load the whiteboard whiteboardId: whiteboardId, username: btoa(myUsername), sendFunction: function (content) { content["at"] = accessToken; signaling_socket.emit('drawToWhiteboard', content); } }); // request whiteboard from server $.get(subdir + "/loadwhiteboard", { wid: whiteboardId, at: accessToken }).done(function (data) { whiteboard.loadData(data) }); $(window).resize(function () { signaling_socket.emit('updateScreenResolution', { at: accessToken, windowWidthHeight: { w: $(window).width(), h: $(window).height() } }); }) /*----------------/ Whiteboard actions /----------------*/ //Handle key actions $(document).on("keydown", function (e) { if (e.which == 16) { whiteboard.pressedKeys["shift"] = true; //Used for straight lines... } //console.log(e.which); }); $(document).on("keyup", function (e) { if (e.which == 16) { whiteboard.pressedKeys["shift"] = false; } }); var shortcutFunctions = { clearWhiteboard: function () { whiteboard.clearWhiteboard(); }, undoStep: function () { whiteboard.undoWhiteboardClick(); }, redoStep: function () { whiteboard.redoWhiteboardClick(); }, setTool_mouse: function () { $(".whiteboardTool[tool=mouse]").click(); }, setTool_recSelect: function () { $(".whiteboardTool[tool=recSelect]").click(); }, setTool_pen: function () { $(".whiteboardTool[tool=pen]").click(); whiteboard.redrawMouseCursor(); }, setTool_line: function () { $(".whiteboardTool[tool=line]").click(); }, setTool_rect: function () { $(".whiteboardTool[tool=rect]").click(); }, setTool_circle: function () { $(".whiteboardTool[tool=circle]").click(); }, setTool_text: function () { $(".whiteboardTool[tool=text]").click(); }, setTool_eraser: function () { $(".whiteboardTool[tool=eraser]").click(); whiteboard.redrawMouseCursor(); }, thickness_bigger: function () { var thickness = parseInt($("#whiteboardThicknessSlider").val()) + 1; $("#whiteboardThicknessSlider").val(thickness); whiteboard.setStrokeThickness(thickness); whiteboard.redrawMouseCursor(); }, thickness_smaller: function () { var thickness = parseInt($("#whiteboardThicknessSlider").val()) - 1; $("#whiteboardThicknessSlider").val(thickness); whiteboard.setStrokeThickness(thickness); whiteboard.redrawMouseCursor(); }, openColorPicker: function () { $("#whiteboardColorpicker").click(); }, saveWhiteboardAsImage: function () { $("#saveAsImageBtn").click(); }, saveWhiteboardAsJson: function () { $("#saveAsJSONBtn").click(); }, uploadWhiteboardToWebDav: function () { $("#uploadWebDavBtn").click(); }, uploadJsonToWhiteboard: function () { $("#uploadJsonBtn").click(); }, shareWhiteboard: function () { $("#shareWhiteboardBtn").click(); }, hideShowControls: function () { $("#minMaxBtn").click(); }, setDrawColorBlack: function () { whiteboard.setDrawColor("black"); whiteboard.redrawMouseCursor(); $("#whiteboardColorpicker").css({ "background": "black" }); }, setDrawColorRed: function () { whiteboard.setDrawColor("red"); whiteboard.redrawMouseCursor(); $("#whiteboardColorpicker").css({ "background": "red" }); }, setDrawColorGreen: function () { whiteboard.setDrawColor("green"); whiteboard.redrawMouseCursor(); $("#whiteboardColorpicker").css({ "background": "green" }); }, setDrawColorBlue: function () { whiteboard.setDrawColor("blue"); whiteboard.redrawMouseCursor(); $("#whiteboardColorpicker").css({ "background": "blue" }); }, setDrawColorYellow: function () { whiteboard.setDrawColor("yellow"); whiteboard.redrawMouseCursor(); $("#whiteboardColorpicker").css({ "background": "yellow" }); }, toggleLineRecCircle: function () { var activeTool = $(".whiteboardTool.active").attr("tool"); if (activeTool == "line") { $(".whiteboardTool[tool=rect]").click(); } else if (activeTool == "rect") { $(".whiteboardTool[tool=circle]").click(); } else { $(".whiteboardTool[tool=line]").click(); } }, togglePenEraser: function () { var activeTool = $(".whiteboardTool.active").attr("tool"); if (activeTool == "pen") { $(".whiteboardTool[tool=eraser]").click(); } else { $(".whiteboardTool[tool=pen]").click(); } }, toggleMainColors: function () { var bgColor = $("#whiteboardColorpicker")[0].style.backgroundColor; if (bgColor == "blue") { shortcutFunctions.setDrawColorGreen(); } else if (bgColor == "green") { shortcutFunctions.setDrawColorYellow(); } else if (bgColor == "yellow") { shortcutFunctions.setDrawColorRed(); } else if (bgColor == "red") { shortcutFunctions.setDrawColorBlack(); } else { shortcutFunctions.setDrawColorBlue(); } }, moveDraggableUp: function () { var elm = whiteboard.tool == "text" ? $("#" + whiteboard.latestActiveTextBoxId) : $(".dragMe")[0]; var p = $(elm).position(); $(elm).css({ top: p.top - 5, left: p.left }) }, moveDraggableDown: function () { var elm = whiteboard.tool == "text" ? $("#" + whiteboard.latestActiveTextBoxId) : $(".dragMe")[0]; var p = $(elm).position(); $(elm).css({ top: p.top + 5, left: p.left }) }, moveDraggableLeft: function () { var elm = whiteboard.tool == "text" ? $("#" + whiteboard.latestActiveTextBoxId) : $(".dragMe")[0]; var p = $(elm).position(); $(elm).css({ top: p.top, left: p.left - 5 }) }, moveDraggableRight: function () { var elm = whiteboard.tool == "text" ? $("#" + whiteboard.latestActiveTextBoxId) : $(".dragMe")[0]; var p = $(elm).position(); $(elm).css({ top: p.top, left: p.left + 5 }) }, dropDraggable: function () { $($(".dragMe")[0]).find('.addToCanvasBtn').click(); }, addToBackground: function () { $($(".dragMe")[0]).find('.addToBackgroundBtn').click(); }, cancelAllActions: function () { whiteboard.escKeyAction(); }, deleteSelection: function () { whiteboard.delKeyAction(); }, } //Load keybindings from keybinds.js to given functions for (var i in keybinds) { if (shortcutFunctions[keybinds[i]]) { keymage(i, shortcutFunctions[keybinds[i]], { preventDefault: true }); } else { console.error("function you want to keybind on key:", i, "named:", keybinds[i], "is not available!") } } // whiteboard clear button $("#whiteboardTrashBtn").click(function () { $("#whiteboardTrashBtnConfirm").show().focus(); $(this).css({ visibility: "hidden" }); }); $("#whiteboardTrashBtnConfirm").mouseout(function () { $(this).hide(); $("#whiteboardTrashBtn").css({ visibility: "inherit" }); }); $("#whiteboardTrashBtnConfirm").click(function () { $(this).hide(); $("#whiteboardTrashBtn").css({ visibility: "inherit" }); whiteboard.clearWhiteboard(); }); // undo button $("#whiteboardUndoBtn").click(function () { whiteboard.undoWhiteboardClick(); }); // redo button $("#whiteboardRedoBtn").click(function () { whiteboard.redoWhiteboardClick(); }); // switch tool $(".whiteboardTool").click(function () { $(".whiteboardTool").removeClass("active"); $(this).addClass("active"); var activeTool = $(this).attr("tool"); whiteboard.setTool(activeTool); if (activeTool == "mouse" || activeTool == "recSelect") { $(".activeToolIcon").empty(); } else { $(".activeToolIcon").html($(this).html()); //Set Active icon the same as the button icon } }); // upload image button $("#addImgToCanvasBtn").click(function () { showBasicAlert("Please drag the image into the browser."); }); // save image as png $("#saveAsImageBtn").click(function () { var imgData = whiteboard.getImageDataBase64(); var w = window.open('about:blank'); //Firefox will not allow downloads without extra window setTimeout(function () { //FireFox seems to require a setTimeout for this to work. var a = document.createElement('a'); a.href = imgData; a.download = 'whiteboard.png'; w.document.body.appendChild(a); a.click(); w.document.body.removeChild(a); setTimeout(function () { w.close(); }, 100); }, 0); }); // save image to json containing steps $("#saveAsJSONBtn").click(function () { var imgData = whiteboard.getImageDataJson(); var w = window.open('about:blank'); //Firefox will not allow downloads without extra window setTimeout(function () { //FireFox seems to require a setTimeout for this to work. var a = document.createElement('a'); a.href = window.URL.createObjectURL(new Blob([imgData], { type: 'text/json' })); a.download = 'whiteboard.json'; w.document.body.appendChild(a); a.click(); w.document.body.removeChild(a); setTimeout(function () { w.close(); }, 100); }, 0); }); $("#uploadWebDavBtn").click(function () { if ($(".webdavUploadBtn").length > 0) { return; } var webdavserver = localStorage.getItem('webdavserver') || "" var webdavpath = localStorage.getItem('webdavpath') || "/" var webdavusername = localStorage.getItem('webdavusername') || "" var webdavpassword = localStorage.getItem('webdavpassword') || "" var webDavHtml = $('
Server URL: | ' + '' + ' | ' + ' |
Path: | ' + '' + ' | path always have to start & end with "/" | ' + '
Username: | ' + '' + ' | ' + ' |
Password: | ' + '' + ' | ' + ' |
Note: You have to generate and use app credentials if you have 2 Factor Auth activated on your dav/nextcloud server! | ' + '||
' + ' | ' + ' |