UNPKG

ihave.to

Version:

Catch ideas. As they come and let them grow with your team in real time

1,040 lines (1,016 loc) 742 kB
function Apprise(a, b) { if (void 0 === a || !a) return !1; var c = this, d = $('<div class="apprise-inner">'), e = $('<div class="apprise-buttons">'), f = $('<input type="text">'), g = { animation: 700, buttons: { confirm: { action: function() { c.dissapear(); }, className: null, id: "confirm", text: "Ok" } }, input: !1, override: !0 }; return $.extend(g, b), "close" == a ? void $cA.dissapear() : $Apprise.is(":visible") ? void AppriseQueue.push({ text: a, options: g }) : (this.adjustWidth = function() { var a = $window.width(), b = "20%", c = "40%"; a <= 800 ? (b = "90%", c = "5%") : a <= 1400 && a > 800 ? (b = "70%", c = "15%") : a <= 1800 && a > 1400 ? (b = "50%", c = "25%") : a <= 2200 && a > 1800 && (b = "30%", c = "35%"), $Apprise.css("width", b).css("left", c); }, this.dissapear = function() { $Apprise.animate({ top: "-100%" }, g.animation, function() { $overlay.fadeOut(300), $Apprise.hide(), $window.unbind("beforeunload"), $window.unbind("keydown"), AppriseQueue[0] && (Apprise(AppriseQueue[0].text, AppriseQueue[0].options), AppriseQueue.splice(0, 1)); }); }, this.keyPress = function() { $window.bind("keydown", function(a) { 27 === a.keyCode ? g.buttons.cancel ? $("#apprise-btn-" + g.buttons.cancel.id).trigger("click") : c.dissapear() : 13 === a.keyCode && (g.buttons.confirm ? $("#apprise-btn-" + g.buttons.confirm.id).trigger("click") : c.dissapear()); }); }, $.each(g.buttons, function(a, b) { if (b) { var c = $('<button id="apprise-btn-' + b.id + '">').append(b.text); b.className && c.addClass(b.className), e.append(c), c.on("click", function() { var a = { clicked: b, input: f.val() ? f.val() : null }; b.action(a); }); } }), g.override && $window.bind("beforeunload", function(a) { return "An alert requires attention"; }), c.adjustWidth(), $window.resize(function() { c.adjustWidth(); }), $Apprise.html("").append(d.append('<div class="apprise-content">' + a + "</div>")).append(e), $cA = this, g.input && d.find(".apprise-content").append($('<div class="apprise-input">').append(f)), $overlay.fadeIn(300), $Apprise.show().animate({ top: "20%" }, g.animation, function() { c.keyPress(); }), void (g.input && f.focus())); } window.LANGUAGE = { DE: { MOBILE_TITLE: "iHave.to", POST: "Memo", POSTS: "Memos", SIGN_IN: "Lege Dein neues Board an.", LOGIN_SHORT_DESC: "Keine Registrierung notwendig.<br>Beliebigen Namen &amp; Passwort eintragen — Fertig.", YOUR_PREFERED_BOARDNAME: "", PASSWORD: "", NOTICE: "Hinweis:", NOTICE_TEXT: "<br/>Dein Board wird zur maximalen Sicherheit auf deinem Rechner verschlüsselt. Deshalb ist es sehr wichtig, dass du dein Passwort nicht vergisst da es sonst keiner wiederherstellen kann", DO_LOGIN: "Login – Memoboard wird erstellt wenn nicht vorhanden", CONNECTING: "verbinde...", TO_SHORT: "zu kurz", WEAK: "schwach", GOOD: "gut", STRONG: "sicher", NOGO: "verboten", CONFIRM_RESTORE_POST: "Soll das ausgewählte Memo wiederhergestellt werden?", ENTER_YOUR_NAME: "Gebe für die Timeline deinen Namen ein wenn du das Memoboard collaborativ einsetzen möchtest.<br/>(Mit ESC oder RETURN kannst du diesen Schritt überspringen)", REALLY_DELETE_THE_SELECTED_SCREENS: "Sollen die gewählten Arbeitsflächen wirklich gelöscht werden?", CONFIRM_DELETE_POST: "Soll dieses Memo wirklich gelöscht werden?<br/>Aus der Timeline kannst du diesen wiederherstellen", OK: "Ok", ABORT: "Abbrechen", BOARD_WAS_ENCRYPTED: "Dein Memoboard wurde entschlüsselt", WELCOME_ON_IHAVETO: "Hallo und viel Spass mit dem iHave.to Memoboard ", WELCOME_BACK: "Hallo zurück ", PLEASE_ENTER_A_VALID_PASSWORD: "Dieses Passwort ist zu kurz", SYNC_FINISHED: "Deine Änderung(en) wurden gespeichert", INVALID_SCREEN_NAME: "Du hast keinen Namen für dein Memoboard eingegeben", INVALID_IMAGE_URL: "Diese Bild URL enthält Fehler", SCREEN_WAS_CREATED: "Arbeitsfläche wurde angelegt", ORDERED_POSTS_CHRONOLOGICAL: "Deine Memos wurden von neu nach alt sortiret", ENTERED_BOARD: "hat das Memoboard betreten", LEFT_BOARD: "hat das Memoboard verlassen", RESTORE_CONSISTENCY_NOW: "Das Board wird synchronisiert", RECEIVED_CHANGES_WICH_DONT_AFFECT_CURRENT_SCREEN: "Memoboard wurde synchronisiert", CHANGE_ON_WORKSPACES: "Es wurden Änderungen an den Arbeitsflächen vorgenommen", A_USER_DELETED_THIS_SCREEN_CHANGE_NOW: "Deine aktive Arbeitsfläche wurde gelöscht", REMOVE_POST: "Das Memo wurde gelöscht", CANT_DELETE_ACTIVE_SCREEN: "Eine lokal geöffnete Arbeitsfläche kann nicht gelöscht werden", SELECT_SCREENS_TO_DELETE: "Wähle die zu löschenden Arbeitsflächen aus", RECONNECTING: "Verbindung wird wiederhergestellt", CANT_STORE_EMPTY_POST: "Das Memo ist leer", CHANGED: "änderte", POSTS_POSITION: "änderte die Position eines Memos", POSTS_CONTENT: "änderte den Inhalt eines Memos", POSTS_COLOR: "änderte die Farbe eines Memos", DELETED_POST: "hat ein Memo gelöscht", STRORE_NEW_POST: "Memo wurde angelegt", STRORE_MODIFIED_POST: "Memo wurde gespeichert", NOTHING_CHANGED: "Es wurden keine Änderungen vorgenommen", SCREEN_ALREADY_EXISTS: "existiert bereits", IOS_ERROR_OPENWINDOW: "In der Webbapp kannst du keine neuen Tabs öffnen", CHANGED_PRIO_NAME: "Farbbedeeutung wurde geändert", WAS_ADDED_TO_BOARD: "ist dem Board beigetreten", PLEASE_ENTER_VALID_PASSWORD: "Dein Passwort ist zu kurz", PLEASE_ENTER_A_VALID_BOARDNAME: "Es wurde kein Name für das Memoboard gewählt", HOME_INFO: "Hier gehts zur Starseite von iHave.to", LOGIN_INFO: "Hier kannst du auf deine Memoboard zugreifen bzw. ein neues erstellen", HELP_INFO: "Hier erfährst du wie iHave.to funktioniert", NEW_POST_INFO: "Hier kannst du einen neuen Memos anlegen", CHRONO_INFO: "Hier kannst du deine Memos von neu nach alt sortieren", SCREEN_INFO: "Hier kannst du weitere Boards anlegen & aufrufen", SETTINGS_INFO: "Hier kannst du die den Memofarben Bedeutungen zuweisen", SYSTEM_INFO: "iHave.to ist ein Projekt von Bernhard Behrendt &copy; 2016/17", STORE_POST_INFO: "Hier wird das neue bzw. bearbeitete Memo gespeichert", CANCEL_INFO: "Hier kannst du den aktuellen Vorgang abbrechen", BACK_INFO: "Hier gehts zurück zu den Memos", NEW_SCREEN_INFO: "Hier kannst du ein neues Board anlegen", WORKSPACE: "Arbeitsfläche", TRASH_EMPTY_INFO: "Hier kannst du deine alten Board löschen", TRASH_FULL_INFO: "Hier kannst deine zum löschen gewählten Board(s) löschen", TIMELINE_INFO: "Hier kannst du alle Änderungen an deinem Board nachvollziehen", ENCRYPT_SELECTED_SCREEN: "Das Board wird entschlüsselt.", POST_WITH_COLOR_BLUE: "Blau bedeutet:", POST_WITH_COLOR_TURKIS: "Türkis bedeutet:", POST_WITH_COLOR_GREEN: "Grün bedeutet:", POST_WITH_COLOR_YELLOW: "Gelb bedeutet:", POST_WITH_COLOR_ORANGE: "Orange bedeutet:", POST_WITH_COLOR_RED: "Rot bedeutet:", POST_WITH_COLOR_PINK: "Pink bedeutet:", POST_WITH_COLOR_GREY: "Grau bedeutet:", POST_WITH_COLOR_WHITE: "Weiß bedeutet:", BLUE: "Blau", TURKIS: "Türkis", GREEN: "Grün", YELOW: "Gelb", ORANGE: "Orange", RED: "Rot", PINK: "Pink", GREY: "Grau", WHITE: "Weiß", IS_MARKED_AS: "bedeutet", NEW_SCREEN_NAME: "Name der neuen Arbeitsfläche", NEW_BG_URL: "URL zu deinem Hintergrundbild", DROP_IMAGEFILE_HERE: "Ziehe das Hintergrundbild auf diese Fläche", FILETYPE_NOT_ALLOWED: "Dieser Datentyp ist nicht erlaubt (Ausschließlich: JPG, PNG, GIF, SVG)", UPLOADING_FILE: "Upload gestartet", UPLOADING_FINISH: "Datei ist gespeichert", UPLOADING_ERROR: "Es ist ein Fehler beim Upload aufgetreten", SET_PRIOTITIES_HERE: "Gebe den Memofarben eine Bedeutung (Tag)", DESCRIPTION_PRIORITIES_SETTINGS: "Dann ist es einfacher, zu erkennen worum es auf einem Memo in etwa geht und um deine Notizen sind besser strukturiert.", NEW_POST: "Neues Memo anlegen", EDIT_POST: "Memo bearbeiten", REALLY_RESTORE_MEMO: "Soll das Memo wiederhergestellt werden?", EXAMPLE_TEXT: 'Das ist das erste Memo auf deinem Board.<br>Lege deine Notizen, Links <a style="background-image:url(http://github.com/favicon.ico)" title="https://github.com/BernhardBezdek" target="_blank" href="https://github.com/BernhardBezdek"></a> oder Foto oder Youtube Video URL\'s hier ab.<br><br>Viel Spass mit iHave.to' }, EN: { MOBILE_TITLE: "iHave.to", POST: "Memo", POSTS: "Memos", SIGN_IN: "Create your new memo board", LOGIN_SHORT_DESC: "No registration required.<br/>Choose a name, set your password and start your memo taking.", YOUR_PREFERED_BOARDNAME: "", PASSWORD: "", NOTICE: "Notice:", NOTICE_TEXT: "<br/>To ensure your privacy the board is en/decrypted on your local device. So it's very important you never loose your login data because it's impossible to restore your board.", DO_LOGIN: "Login – memo board is created if not existing right now", CONNECTING: "connect...", TO_SHORT: "to short", WEAK: "weak", GOOD: "good", STRONG: "safe", NOGO: "forbidden", CONFIRM_RESTORE_POST: "Restore selected memo?", ENTER_YOUR_NAME: "Enter your name if you plan to use this memo board in a collaborative way (Press ESC or RETURN to skip this step)", REALLY_DELETE_THE_SELECTED_SCREENS: "Really delete selected workspaces?", CONFIRM_DELETE_POST: "Really delete this memo? (you have also access after deletion via timeline)", OK: "Ok", ABORT: "Cancel", BOARD_WAS_ENCRYPTED: "Your memo board was encrypted", WELCOME_ON_IHAVETO: "Have fun using iHave.to/do", WELCOME_BACK: "Welcome back", PLEASE_ENTER_A_VALID_PASSWORD: "The password is to short", SYNC_FINISHED: "Stored changes", INVALID_SCREEN_NAME: "Missing memo board name", INVALID_IMAGE_URL: "Image url is invalid", SCREEN_WAS_CREATED: "Workspace was created", ORDERED_POSTS_CHRONOLOGICAL: "Your memos were ordered in descending order", ENTERED_BOARD: "has entered the memo board", LEFT_BOARD: "has left the memo board", RESTORE_CONSISTENCY_NOW: "synchronizing memo board", RECEIVED_CHANGES_WICH_DONT_AFFECT_CURRENT_SCREEN: "Memo board was synchronized", CHANGE_ON_WORKSPACES: "Received changes on workspaces", A_USER_DELETED_THIS_SCREEN_CHANGE_NOW: "The workspace you're currently staying on was deleted ", REMOVE_POST: "Memo was removed", CANT_DELETE_ACTIVE_SCREEN: "You can't delete currently active workspace", SELECT_SCREENS_TO_DELETE: "Choose workspace(s) to delete", RECONNECTING: "Reconnecting", CANT_STORE_EMPTY_POST: "You can't create empty memos", CHANGED: "changed", POSTS_POSITION: "changed memo position", POSTS_CONTENT: "changed memo text", POSTS_COLOR: "changed memo color", DELETED_POST: "deleted a memo", STRORE_NEW_POST: "Memo was created", STRORE_MODIFIED_POST: "Memo was stored", NOTHING_CHANGED: "Noting was changed", SCREEN_ALREADY_EXISTS: "already exists", IOS_ERROR_OPENWINDOW: "In web app you can't open links in new window", CHANGED_PRIO_NAME: "Color meaning was changed", WAS_ADDED_TO_BOARD: "entered the board", PLEASE_ENTER_VALID_PASSWORD: "Password to short", PLEASE_ENTER_A_VALID_BOARDNAME: "Missing memoboard name", HOME_INFO: "Home", LOGIN_INFO: "Here you can create and/or access your memoboard", HELP_INFO: "Here yo get information abot iHave.to is working", NEW_POST_INFO: "Create your new memo here", CHRONO_INFO: "Order your memo by date descending here", SCREEN_INFO: "Create new workspaces here", SETTINGS_INFO: "Here you can change the color meaning", SYSTEM_INFO: "iHave.to is was found by Bernhard Behrendt &copy; 2013", STORE_POST_INFO: "Here you can save changes made on a memo", CANCEL_INFO: "Here you can abort your current modification", BACK_INFO: "Back to memo view", NEW_SCREEN_INFO: "Create your new workspaces here", WORKSPACE: "Workspace", TRASH_EMPTY_INFO: "Delete your previously marked workspaces here", TRASH_FULL_INFO: "Remove marked workspaces finally here", TIMELINE_INFO: "You can open a full qualified timeline here for current board", ENCRYPT_SELECTED_SCREEN: "Memo board was decrypted", POST_WITH_COLOR_BLUE: "Blue means:", POST_WITH_COLOR_TURKIS: "Turkis means:", POST_WITH_COLOR_GREEN: "Green means:", POST_WITH_COLOR_YELLOW: "Yellow means:", POST_WITH_COLOR_ORANGE: "Orange means:", POST_WITH_COLOR_RED: "Red means:", POST_WITH_COLOR_PINK: "Pink means:", POST_WITH_COLOR_GREY: "Grey means:", POST_WITH_COLOR_WHITE: "White means:", BLUE: "Blue", TURKIS: "Turkis", GREEN: "Green", YELOW: "Yellow", ORANGE: "Orange", RED: "Red", PINK: "Pink", GREY: "Grey", WHITE: "White", IS_MARKED_AS: "marked as", NEW_SCREEN_NAME: "New memo boards name", NEW_BG_URL: "url to your custom background image", DROP_IMAGEFILE_HERE: "Drop wallpaper for new workspace here", FILETYPE_NOT_ALLOWED: "This filetype is not alowed (JPG, PNG, GIF, SVG)", UPLOADING_FILE: "Uploading file", UPLOADING_FINISH: "File was stored", UPLOADING_ERROR: "An error occurred during file upload ", SET_PRIOTITIES_HERE: "Here you can assign a meaning to colors", DESCRIPTION_PRIORITIES_SETTINGS: "This will give you a better overview what a memo means only by color.", NEW_POST: "Create a new memo", EDIT_POST: "Modify an existing memo", REALLY_RESTORE_MEMO: "Restore this memo?", EXAMPLE_TEXT: 'This is the first Memo on your board.<br>Place your notices, links <a style="background-image:url(http://www.iHave.to/favicon.ico)" title="http://www.iHave.to" target="_blank" href="http://www.iHave.to"></a>, photo or youtube URL\'s here<br><br>Have fun using ihave.to/do' } }; var CONF; !function() { "use strict"; var a = (navigator.language ? navigator.language : navigator.userLanguage).toUpperCase().slice(0, 2); CONF = { BOARD: null, DOM: { CMD: null, CMD_INFO: null, BOARD: null, BOARDPOSTS: null, BOARDSCREENS: null, POST: null, SCREENS: null, SCREENOVERVIEW: null, UIMESSAGING: null, UILOADER: null, UIWINDOW: null }, COM: { SOCKET: null }, EVENTS: { CLICK: null, FORCED_CLICK: "click" }, PROPS: { BOOLEAN: { LOG: !1, DRAGGING: !1 }, INT: { MAX_UPLOAD: 14, CMD_INFO_MIN_WIDTH: 300, DEF_MARGIN_UNIT: 16, FAST: 125, NORMAL: 250, SLOW: 500, SCREENWIDTH: null, MASTERCLOCK: 1e3, TMP_A: null, TMP_B: null, WHO: null }, STRING: { LANGUAGE: "undefined" !== LANGUAGE[a] ? a : "EN", ENABLED: "enabled", ACTIVE: "active", DROPON_ACTIVE: "dropon_active", DROPON_HOVER: "dropon_hover", INVISIBLE: "invisible", UD: "undefined", OBJ: "object", NUM: "number", SALT: null, SCREEN_DEFAULT_BG: "/img/wallpaper-default.jpg", BLOCKRESIZE: 'input[type="text"]:focus, textarea' }, ARRAY: { COLORS: [ "blue", "turkis", "green", "yellow", "orange", "red", "pink", "grey", "white" ], ALLOWED_FILES: [ ".jpg", ".JPG", ".jpeg", ".JPEG", ".png", ".PNG", ".gif", ".GIF", ".svg", ".SVG" ] }, OBJECT: { STORAGE: null } } }; }(); var isMobile; !function() { "use strict"; isMobile = function(a) { var b; void 0 === a && (a = ""); var c = [ "iphone", "ipad", "android", "blackberry", "nokia", "opera mini", "windows mobile" ]; for (b = 0; b < c.length; b += 1) if (c[b] !== a && window.navigator.userAgent.toLowerCase().indexOf(c[b]) > 0) return !0; return !1; }; }(); var log; !function() { "use strict"; log = function(a) { void 0 !== console && !0 === CONF.PROPS.BOOLEAN.LOG && console.log(a); }; }(), function() { "use strict"; function a(b) { for (var c = a.options, d = c.parser[c.strictMode ? "strict" : "loose"].exec(b.toString()), e = {}, f = 14; f -= 1; ) e[c.key[f]] = d[f] || ""; return e[c.q.name] = {}, e[c.key[12]].replace(c.q.parser, function(a, b, d) { b && (e[c.q.name][b] = d); }), e; } String.prototype.toHtml = function(a) { var b, c = this; if ("object" == typeof a) for (b in a) if (a.hasOwnProperty(b)) { var d = new RegExp("{" + b + "}", "g"); c = c.replace(d, a[b]); } return c.replace(/{[A-Z_]*}/gi, "").toString(); }, String.prototype.translate = function(a) { if (void 0 === a && (a = LANGUAGE), "object" == typeof a && null === CONF.PROPS.STRING.LANGUAGE) { log("No language was set"), log("Set language to GERMAN"), CONF.PROPS.STRING.LANGUAGE = "GERMAN"; } return void 0 !== a[CONF.PROPS.STRING.LANGUAGE] ? void 0 !== a[CONF.PROPS.STRING.LANGUAGE][this] ? a[CONF.PROPS.STRING.LANGUAGE][this].toString() : (CONF.PROPS.BOOLEAN.LOG && log("No translation found for " + this + " in language " + CONF.PROPS.STRING.LANGUAGE), this.toString()) : (log("No translation object was given"), ""); }, String.prototype.isImageURL = function() { return /(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*\.(?:jpg|jpeg|gif|png|svg|PNG|GIF|JPG|JPEG|SVG))(?:\?([^#]*))?(?:#(.*))?/.test(this.toString()); }, String.prototype.escapeHtml = function() { return this.toString().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;"); }, String.prototype.br2nl = function() { return this.toString().replace(/<br\/>/g, "\n").replace(/<br>/g, "\n"); }, String.prototype.nl2br = function() { return this.toString().replace(/\n/g, "<br/>"); }, String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); }, String.prototype.urlToLink = function() { var b = this; b = b.replace(/Www/g, "www").replace(/WWw/g, "www").replace(/WWW/, "www"), null === b.match(/https:\/\//) && null === b.match(/http:\/\//) && null === b.match(/www\./) || (null !== b.match(/www\./) && null === b.match(/http:\/\//) && null === b.match(/https:\/\//) && (b = b.replace(/www./g, "http://www.")), b = b.replace(/(http:\/\/){2,}/g, "http://"), b = b.replace(/(https:\/\/){2,}/g, "https://")); var c = /\b((http:\/\/|https:\/\/)[\w\\/\-?=\.:]+)/g; return b = b.replace(c, function(b) { var d = a(b), e = "$1"; return null !== b.match("https://www.youtube.com") || null !== b.match("https://youtube.com") || null !== b.match("http://youtube.com") || null !== b.match("http://youtu.be") || null !== b.match("http://www.youtube.com") || null !== b.match("http://www.youtu.be") ? (e = b.match("&") ? b.substr(0, b.search(/&/)) + " " + b.substr(b.search(/&/), b.length) : b, e = e.replace(/&[\S]*/, ""), e = e.replace("youtube.com/watch?v=", "youtube.com/embed/"), e = e.replace("youtu.be", "youtube.com/embed/"), 0 !== b.indexOf("https://www.youtube.com") && 0 !== b.indexOf("https://youtube.com") && 0 !== b.indexOf("http://youtube.com") && 0 !== b.indexOf("http://www.youtube.com") && 0 !== b.indexOf("http://youtu.be") && 0 !== b.indexOf("http://www.youtu.be") || (e = e.replace(c, '<iframe width="100%" height="114" src="$1" frameborder="0" allowfullscreen></iframe><br/>').replace(/^http:\/\//, "https://"))) : e = b.isImageURL() ? '<a class="imageLink" href="' + b + '" target="_blank"><img src="' + b + '"/></a>' : '<a href="' + b + '" target="_blank" style="background-image:url(' + d.protocol + "://" + d.host + '/favicon.ico)"></a>', e; }); }, a.options = { strictMode: !1, key: [ "source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor" ], q: { name: "queryKey", parser: /(?:^|&)([^&=]*)=?([^&]*)/g }, parser: { strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ } }; }(); var Board; !function() { "use strict"; Board = function(a) { this._oScreen = a, this._setDeleted = {}, this._oScreenPost = {}; }, Board.prototype._oScreen = null, Board.prototype._oScreen = null, Board.prototype._oScreenPost = null, Board.prototype.getTemplate = function() { return this.setBackground(), { DIV: this._createTemplate() }; }, Board.prototype._createTemplate = function() { var a, b, c, d, e, f = []; if (void 0 !== this._oScreen.SCREEN.POSTS) { c = this._oScreen.SCREEN.POSTS; for (d in c) if (c.hasOwnProperty(d)) if ((b = c[d]) instanceof Array) for (var g = 0; g < b.length; g += 1) this._addPost(this._createPost(b[g])); else this._addPost(this._createPost(b)); } e = this._oScreenPost; for (a in e) if (e.hasOwnProperty(a)) { if (!0 === this._setDeleted[a]) { delete e[a]; continue; } f.push(this._oScreenPost[a]); } return f; }, Board.prototype._createPost = function(a) { var b = !1, c = "", d = "", e = !1, f = !1; return void 0 !== a.TGT && (e = a.TGT), "color" === a.ACN && (d = a.TO), "content" === a.ACN && (b = a.TO), "position" === a.ACN && (f = "left:" + a.TO[0] + "%; top:" + a.TO[1] + "%;"), "deleted" === a.ACN && (c = "deleted"), { ID: e, CLASSES: "post " + d + c, STYLE: f, CONTENT: { DIV: { CLASSES: "content", CONTENT: { P: { CONTENT: b } } } } }; }, Board.prototype._addPost = function(a) { void 0 === this._oScreenPost[a.ID] ? this._oScreenPost[a.ID] = a : (!1 !== a.CONTENT.DIV.CONTENT.P.CONTENT && (this._oScreenPost[a.ID].CONTENT.DIV.CONTENT.P.CONTENT = a.CONTENT.DIV.CONTENT.P.CONTENT, void 0 !== this._setDeleted[a.ID] && delete this._setDeleted[a.ID]), a.CLASSES.length > 5 && (-1 !== a.CLASSES.indexOf("deleted") ? this._setDeleted[a.ID] = !0 : (this._oScreenPost[a.ID].CLASSES = a.CLASSES, void 0 !== this._setDeleted[a.ID] && delete this._setDeleted[a.ID])), !1 !== a.STYLE && void 0 !== this._oScreenPost[a.ID] && (this._oScreenPost[a.ID].STYLE = a.STYLE, void 0 !== this._setDeleted[a.ID] && delete this._setDeleted[a.ID])); }, Board.prototype.setBackground = function() { $("body").css("background-image", "url(" + this._oScreen.SCREEN.META.BG + ")"); }, Board.prototype.enableDroppable = function(a) { a.dropzone({ url: "/upload-postimage", paramName: "file", maxFilesize: CONF.PROPS.INT.MAX_UPLOAD, maxFiles: 1, clickable: !1, accept: function(a, b) { -1 === CONF.PROPS.ARRAY.ALLOWED_FILES.indexOf(a.name.substring(a.name.length - 4, a.name.length)) ? showMessage("FILETYPE_NOT_ALLOWED", "error") : (showMessage("UPLOADING_FILE"), $("footer").addClass("disabled"), b(), void 0 === window.uploadProgresses && (window.uploadProgresses = 0), window.uploadProgresses += 1); }, uploadprogress: function(a, b) { var c = $("#memoUploadProgress"); c.hasClass("active") || (c.addClass("active"), $("#dropImage").hide()), c.children("div.bar").css("width", b + "%").text(Math.round(b) + "%"), b >= 100 && (c.removeClass("active"), c.children("div.bar").removeAttr("style").text(""), $("#dropImage").show()); }, complete: function(a) { this.removeFile(a), window.uploadProgresses -= 1, 0 === window.uploadProgresses && $("footer").removeClass("disabled"); }, success: function(a, b) { if (showMessage("UPLOADING_FINISH"), 0 === b.indexOf("upload/")) { var c, d, e, f = $(this.element), g = CONF.DOM.BOARDPOSTS.data("activescreen"), h = new Date().getTime(), i = JSON.parse('{"PRIVATE":{"SCREENS":{"' + g + '":{"POSTS":{"' + h + '":{}}}}}}'); e = (window.location.toString().replace("/do/", "/").replace("/do", "/") + b).urlToLink(), c = f.find("p").html() + "<br/><br/>" + e, d = { ACN: "content", BY: CONF.PROPS.INT.WHO, TGT: parseInt(f.attr("id"), 10), TO: c }, CONF.BOARD.PRIVATE.SCREENS[g].POSTS[h] = d, i.PRIVATE.SCREENS[g].POSTS[h] = d, f.find("p").html(c), CONF.COM.SOCKET.saveChanges(i); } }, error: function() { showMessage("UPLOADING_ERROR"); } }); }; }(); var Buttons; !function() { "use strict"; Buttons = function(a, b) { var c, d = []; if (void 0 === b && (b = "slim"), void 0 !== a) for (c = 0; c < a.length; c += 1) d[c] = { CLASSES: "button " + a[c].TYPE, CONTENT: { LINK: { ID: a[c].ID, URL: "#", CONTENT: a[c].LABEL.translate() } } }; return { UL: { CLASSES: "buttons " + b, CONTENT: { LI: d } } }; }; }(); var Connection; !function() { "use strict"; Connection = function() { this.socket = io.connect(), this.socket.on("disconnect", function() { showMessage("RECONNECTING".translate(), "error"), $(".screen, #cmd").empty(), CONF.COM.SOCKET.connect(); }); }, Connection.prototype.socket = null, Connection.prototype._encryption = null, Connection.prototype._data = null, Connection.prototype._verifier = null, Connection.prototype._board = null, Connection.prototype.connect = function(a) { var b = this; null === this._board && void 0 !== a && (this._board = a), void 0 !== this._board && null !== this._board ? (this.socket.emit("init", this._board), this.socket.on("connected", function(a) { $("#cmd").removeAttr("style"), b.setData(a), b.handleData(); })) : window.location.reload(); }, Connection.prototype.initBroadcast = function(a) { var b = this; this.socket.on("enter-" + a, function(a) { showMessage(b.decrypt(a) + " " + "ENTERED_BOARD".translate()); }), this.socket.on("goodbye-" + a, function(a) { showMessage(b.decrypt(a) + " " + "LEFT_BOARD".translate(), "error"); }), this.socket.on("bc-" + a, function(a) { var c, d, e, f, g, h, i = JSON.parse(CONF.COM.SOCKET.decrypt(a)); if ($.extend(!0, CONF.BOARD, i), g = CONF.DOM.BOARDPOSTS.data("activescreen"), void 0 !== i.PRIVATE && void 0 !== i.PRIVATE.SCREENS) { for (e in CONF.BOARD.PRIVATE.SCREENS) CONF.BOARD.PRIVATE.SCREENS.hasOwnProperty(e) && !CONF.BOARD.PRIVATE.SCREENS[e] && delete CONF.BOARD.PRIVATE.SCREENS[e]; if (void 0 !== i.PRIVATE.SCREENS[g]) if (void 0 !== CONF.BOARD.PRIVATE.SCREENS[g]) { var j = !1; for (d in i.PRIVATE.SCREENS[g].POSTS) if (i.PRIVATE.SCREENS[g].POSTS.hasOwnProperty(d)) { var k = i.PRIVATE.SCREENS[g].POSTS[d]; j = b.updateScreen(k); } j || (c = CONF.BOARD.PRIVATE.SCREENS[g], showMessage("RESTORE_CONSISTENCY_NOW"), h = new Board({ NAME: g, SCREEN: c, FROMTIME: !1 }), CONF.DOM.BOARDSCREENS.html(new Template(h.getTemplate()).toHtml()), CONF.DOM.BOARD.trigger("uiBoard")); } else f = Object.keys(CONF.BOARD.PRIVATE.SCREENS)[0], CONF.DOM.BOARDPOSTS.data("activescreen", f), c = CONF.BOARD.PRIVATE.SCREENS[f], showMessage("A_USER_DELETED_THIS_SCREEN_CHANGE_NOW"), $("#back, .mobile").trigger("click"), 1 === $("#edit").length && CONF.DOM.CMD.trigger("setMainNav"), h = new Board({ NAME: f, SCREEN: c, FROMTIME: !1 }), CONF.DOM.BOARDSCREENS.html(new Template(h.getTemplate()).toHtml()), CONF.DOM.BOARD.trigger("uiBoard"); b.updateCurrentView(); } if (void 0 !== i.USERS) { var l = Object.keys(i.USERS)[0]; showMessage(l + " " + "WAS_ADDED_TO_BOARD".translate()); } }); }, Connection.prototype.updateCurrentView = function() { CONF.DOM.UIWINDOW.children(".cmd").children(".screen").length > 0 && this.updateScreenOverview(), CONF.DOM.UIWINDOW.children(".cmd").children(".lifecycles").length > 0 && this.updateLifecycleOverview(); }, Connection.prototype.updateScreenOverview = function() { var a, b, c = [], d = $("#trash_empty.active, #trash_full"); if (1 === d.length && ($.each(CONF.DOM.UIWINDOW.children(".cmd").children(".screen.do"), function() { c.push($(this).attr("id")); }), d.prev().remove(), d.removeAttr("id").attr("id", "trash_empty").removeClass("active")), CONF.DOM.UIWINDOW.children(".cmd").children(".screen").remove(), CONF.DOM.UIWINDOW.children(".cmd").append(new Template(new Screens().getOverview()).toHtml()), c.length > 0) for ($("#trash_empty").trigger(CONF.EVENTS.CLICK), a = 0; a < c.length; a += 1) b = $("#" + c[a]), 1 === b.length && b.trigger(CONF.EVENTS.CLICK); }, Connection.prototype.updateLifecycleOverview = function() { var a = CONF.DOM.BOARDPOSTS.data("activescreen"); CONF.DOM.UIWINDOW.trigger("showUi"), CONF.DOM.CMD.trigger("setTimelineNav"); var b = new Timeline(CONF.BOARD.PRIVATE.SCREENS[a].POSTS, CONF.BOARD.SETTINGS.COLORS); CONF.DOM.UIWINDOW.children(".cmd").html(b.render()); }, Connection.prototype.updateScreen = function(a) { var b, c, d, e, f = !1; if (a instanceof Array) for (b = 0; b < a.length; b += 1) f ? this.updateScreen(a[b]) : f = this.updateScreen(a[b]); else if (void 0 !== a.TGT && (d = $("div.screen").find("#" + a.TGT), 1 === d.length)) { f = !0, "position" === a.ACN && $(d).animate({ left: a.TO[0] + "%", top: a.TO[1] + "%" }, 750), "content" === a.ACN && $(d).find(".content").children("p").html(a.TO), "deleted" === a.ACN && $(d).fadeOut(250, function() { $(this).remove(); }), "color" === a.ACN && (e = Object.keys(CONF.BOARD.SETTINGS.COLORS).join(" ").toLowerCase(), e = e.replace(a.TO, ""), $(d).removeClass(e).addClass(a.TO)); for (c in CONF.BOARD.USERS) if (CONF.BOARD.USERS.hasOwnProperty(c) && CONF.BOARD.USERS[c] === a.BY) break; } return f; }, Connection.prototype.handleData = function() { var a, b, c, d, e; -1 === this.getData().indexOf("{") ? (CONF.BOARD = JSON.parse(this.decrypt()), this.initBroadcast(CONF.BOARD.META.VERIFIER), window.lock || this.personalize(), CONF.DOM.UIWINDOW.trigger("hideUi"), CONF.DOM.CMD.trigger("setMainNav"), showMessage("BOARD_WAS_ENCRYPTED"), null !== CONF.DOM.BOARDPOSTS && (a = CONF.DOM.BOARDPOSTS.data("activescreen")), b = Object.keys(CONF.BOARD.PRIVATE.SCREENS)[0], void 0 !== a && void 0 !== CONF.BOARD.PRIVATE.SCREENS[a] && (b = a), CONF.DOM.BOARD.trigger("setupBoard", { NAME: b, SCREEN: CONF.BOARD.PRIVATE.SCREENS[b], FROMTIME: !1 })) : (c = JSON.parse(this.getData()), d = "WORKSPACE".translate(), e = parseInt(new Date().getTime(), 10), c.PRIVATE.SCREENS[d] = { META: { BG: CONF.PROPS.STRING.SCREEN_DEFAULT_BG }, POSTS: {} }, c.PRIVATE.SCREENS[d].POSTS[e] = [ { TGT: e, ACN: "color", TO: "blue" }, { TGT: e, ACN: "content", TO: "EXAMPLE_TEXT".translate() }, { TGT: e, ACN: "position", TO: [ 10, 10 ] } ], CONF.COM.SOCKET.setData(JSON.stringify(c)), this.setVerifier(c.META.VERIFIER), this.socket.emit(this.getVerifier(), this.encrypt().toString()), $("#do-login").trigger(CONF.EVENTS.CLICK)); }, Connection.prototype.saveChanges = function(a) { this.setData(JSON.stringify(CONF.BOARD)), this.socket.emit(CONF.BOARD.META.VERIFIER, this.encrypt().toString()), void 0 !== a && this.socket.emit("sync", this.encrypt(JSON.stringify(a)).toString()); }, Connection.prototype.setEncryptionPhrase = function(a) { this._encryption = CryptoJS.SHA3(a).toString(); }, Connection.prototype.getEncryptionPhrase = function() { return this._encryption; }, Connection.prototype.encrypt = function(a) { var b = a; return void 0 === b && (b = this.getData()), CryptoJS.AES.encrypt(b, this.getEncryptionPhrase()); }, Connection.prototype.decrypt = function(a) { var b = null, c = !1, d = a; for (void 0 === d && (d = this.getData()); !c; ) try { b = CryptoJS.AES.decrypt(d, this.getEncryptionPhrase()).toString(CryptoJS.enc.Utf8), c = !0; } catch (a) { c = !1; } return b; }, Connection.prototype.setData = function(a) { this._data = a; }, Connection.prototype.getData = function() { return this._data; }, Connection.prototype.setVerifier = function(a) { this._verifier = a; }, Connection.prototype.getVerifier = function() { return this._verifier; }, Connection.prototype.personalize = function() { var a = this._board, b = CONF.PROPS.OBJECT.STORAGE.getItem(a), c = this; if (null === b) window.lock = !0, Apprise("ENTER_YOUR_NAME".translate(), { animation: 250, buttons: { confirm: { action: function(b) { var d, e, f; $("input").blur(), delete window.lock, d = null !== b.input && b.input.length > 0 ? b.input : "Anonymous", CONF.PROPS.OBJECT.STORAGE.setItem(a, d), void 0 === CONF.BOARD.USERS[d] && (e = Object.keys(CONF.BOARD.USERS).length, f = JSON.parse('{"USERS":{}}'), f.USERS[d] = e, CONF.BOARD.USERS[d] = e, c.saveChanges(f)), CONF.PROPS.INT.WHO = CONF.BOARD.USERS[d], Apprise("close"); }, className: "blue", id: "confirm", text: "OK".translate() } }, input: !0, override: !0 }); else { var d; if (void 0 === CONF.BOARD.USERS[b]) CONF.PROPS.OBJECT.STORAGE.removeItem(a), this.personalize(); else for (d in CONF.BOARD.USERS) if (CONF.BOARD.USERS.hasOwnProperty(d) && b === d) { CONF.PROPS.INT.WHO = CONF.BOARD.USERS[d], CONF.COM.SOCKET.socket.emit("enter", this.encrypt(b).toString()); break; } } }; }(); var Login; !function() { "use strict"; Login = function() { return { DIV: { ID: "login-window", CONTENT: { DIV: { ID: "login-content", CONTENT: { H: { NO: 1, CONTENT: "SIGN_IN".translate() }, P: { CONTENT: "LOGIN_SHORT_DESC".translate() }, DIV: { ID: "login-form", CONTENT: { INPUT: [ { TYPE: "text", NAME: "boardname", ID: "boardname", VALUE: "YOUR_PREFERED_BOARDNAME".translate() }, { TYPE: "password", NAME: "boardpw", ID: "boardpw", VALUE: "PASSWORD".translate() } ], PIPE: { CONTENT: new Buttons([ { LABEL: "DO_LOGIN", TYPE: "ok", ID: "do-login" } ], "xwide") }, SPAN: { CLASS: "notice", INSERT: { STRONG: { CONTENT: "NOTICE".translate() }, PIPE: { CONTENT: "NOTICE_TEXT".translate() } } } } } } } } } }; }; }(); var Menu; !function() { "use strict"; Menu = function() {}, Menu.prototype.getMenuCorpus = function() { return { UL: { CONTENT: { LI: null } } }; }, Menu.prototype.getMenuCmds = function(a) { var b = this.getMenuCorpus(); return a[a.length] = { CLASSES: "fixline", AFTER: " " }, b.UL.CONTENT.LI = a, b; }, Menu.prototype.getLoginsMenue = function(a) { var b, c = [], d = []; for (void 0 === a && (a = ""), b = 0; b < c.length; b += 1) d[b] = { CONTENT: { LINK: { URL: "#", ID: c[b], CLASSES: c[b] === a ? "active" : "" } }, AFTER: " " }; return d; }, Menu.prototype.getPrivateMain = function(a) { var b, c = [ "new_post", "screen", "timeline", "settings" ], d = []; for (void 0 === a && (a = ""), b = 0; b < c.length; b += 1) d[b] = { CONTENT: { LINK: { URL: "#", ID: c[b], CLASSES: c[b] === a ? "active" : "" } }, AFTER: " " }; return d; }, Menu.prototype.getTimelineMenu = function(a) { var b, c = [ "back" ], d = []; for (void 0 === a && (a = ""), b = 0; b < c.length; b += 1) d[b] = { CONTENT: { LINK: { URL: "#", ID: c[b], CLASSES: c[b] === a ? "active" : "" } }, AFTER: " " }; return d; }, Menu.prototype.getPostMenue = function(a) { void 0 === a && (a = ""); var b, c = [ "back", "store_post" ], d = []; for (b = 0; b < c.length; b += 1) d[b] = { CONTENT: { LINK: { URL: "#", ID: c[b], CLASSES: c[b] === a ? "active" : "" } }, AFTER: " " }; return d; }, Menu.prototype.getPostEdit = function(a) { void 0 === a && (a = ""); var b, c = [ "edit", "delete" ], d = []; for (b = 0; b < c.length; b += 1) d[b] = { CONTENT: { LINK: { URL: "#", ID: c[b], CLASSES: c[b] === a ? "active" : "" } }, AFTER: " " }; return d; }, Menu.prototype.getScreenMenue = function(a) { var b, c = [ "back", "new_screen", "trash_empty" ], d = []; for (void 0 === a && (a = ""), b = 0; b < c.length; b += 1) d[b] = { CONTENT: { LINK: { URL: "#", ID: c[b], CLASSES: c[b] === a ? "active" : "" } }, AFTER: " " }; return d; }, Menu.prototype.getSettingsMenue = function(a) { void 0 === a && (a = ""); for (var b = [ "back" ], c = [], d = 0; d < b.length; d += 1) c[d] = { CONTENT: { LINK: { URL: "#", ID: b[d], CLASSES: b[d] === a ? "active" : "" } }, AFTER: " " }; return c; }; }(); var Post; !function() { "use strict"; Post = function(a) { this.oPost = void 0 !== a && a; }, Post.prototype.getColor = function() { var a, b = !1; for (a = 0; a < CONF.PROPS.ARRAY.COLORS.length; a += 1) this.oPost.hasClass(CONF.PROPS.ARRAY.COLORS[a]) && (b = CONF.PROPS.ARRAY.COLORS[a]); return b; }, Post.prototype.getId = function() { return this.oPost.attr("id") || null; }, Post.prototype.getContent = function() { var a, b = this.oPost.children(".content").children("p"); $("<div/>", { id: "temp_content_grep", html: b.html() }).appendTo(b), a = $("#temp_content_grep"), $.each(a.find("a"), function() { $(this).after($(this).attr("href")), $(this).remove(); }), $.each(a.find("iframe"), function() { $(this).after($(this).attr("src")), $(this).remove(); }); var c = a.html(); return a.remove(), c; }, Post.prototype.getTools = function() { return $("#post-functions").remove(), new Template({ DIV: { ID: "post-functions", CONTENT: { LINK: [ { ID: "edit", CLASSES: "post-function", URL: "#" }, { ID: "move", CLASSES: "post-function", URL: "#" }, { ID: "callendar", CLASSES: "post-function", URL: "#" }, { ID: "delete", CLASSES: "post-function", URL: "#" } ] } } }).toHtml(); }; }(); var PostWindow; !function() { "use strict"; PostWindow = function(a) { var b, c, d = [], e = ""; for (void 0 === a ? a = { defaultcolor: "yellow", content: "", headline: "NEW_POST".translate(), origin: "" } : (void 0 === a.origin && (a.origin = ""), void 0 === a.defaultcolor && (a.defaultcolor = "yellow"), void 0 === a.content && (a.content = ""), void 0 === a.headline && (a.headline = "NEW_POST".translate())), b = 0; b < CONF.PROPS.ARRAY.COLORS.length; b += 1) c = CONF.BOARD.SETTINGS.COLORS[CONF.PROPS.ARRAY.COLORS[b].toUpperCase()], null !== c && (e = CONF.PROPS.ARRAY.COLORS[b].toUpperCase().translate() + " " + "IS_MARKED_AS".translate() + " " + c), CONF.PROPS.ARRAY.COLORS[b] === a.defaultcolor ? d[d.length] = { CLASSES: CONF.PROPS.ARRAY.COLORS[b], CONTENT: { LINK: { TITLE: e, CLASSES: "selected", URL: "#" } } } : d[d.length] = { CLASSES: CONF.PROPS.ARRAY.COLORS[b], CONTENT: { LINK: { TITLE: e, URL: "#" } } }; this.postTemplate = new Template({ DIV: { ID: "post-window", CONTENT: { H: { NO: 2, CONTENT: a.headline }, TEXTAREA: { ID: a.origin.length > 0 ? "origin-" + a.origin : "", CLASS: a.defaultcolor, INSERT: a.content }, UL: { CLASSES: "color_select", CONTENT: { LI: d } } } } }).toHtml(); }, PostWindow.prototype.deliver = function() { return this.postTemplate; }; }(); var Screens; !function() { "use strict"; Screens = function() {}, Screens.prototype.getStats = function(a) { var b, c, d, e = "", f = {}, g = {}; for (c in a.POSTS) a.POSTS.hasOwnProperty(c) && (a.POSTS[c] instanceof Array ? e.search(-1 === a.POSTS[c][0].TGT) && (e += a.POSTS[c][0].TGT + "|", "color" === a.POSTS[c][0].ACN && (f[a.POSTS[c][0].TGT] = a.POSTS[c][0].TO)) : -1 === e.search(a.POSTS[c].TGT) ? (e += a.POSTS[c].TGT + "|", "color" === a.POSTS[c].ACN && (f[a.POSTS[c].TGT] = a.POSTS[c].TO)) : ("move" !== a.POSTS[c].ACN && "deleted" !== a.POSTS[c].ACN || (e = e.replace(a.POSTS[c].TGT + "|", "")), "color" === a.POSTS[c].ACN && (f[a.POSTS[c].TGT] = a.POSTS[c].TO), "deleted" === a.POSTS[c].ACN && void 0 !== f[a.POSTS[c].TGT] && delete f[a.POSTS[c].TGT])); for (b in f) f.hasOwnProperty(b) && (void 0 === g[f[b]] ? g[f[b]] = 1 : g[f[b]] += 1); for (d in g) g.hasOwnProperty(d) && (g[d] = Math.floor(100 * g[d] / Object.keys(f).length)); return { items: e.split("|").length - 1, steepening: g }; }, Screens.prototype.sortStats = function(a) { return _.sortBy(a, function(a) { return a.PART; }); }, Screens.prototype.getOverview = function() { var a, b, c, d, e, f = []; for (c in CONF.BOARD.PRIVATE.SCREENS) if (CONF.BOARD.PRIVATE.SCREENS.hasOwnProperty(c)) { b = CONF.BOARD.PRIVATE.SCREENS[c], d = this.getStats(b), e = []; for (a in d.steepening) d.steepening.hasOwnProperty(a) && e.push({ PART: d.steepening[a], CLASSES: a, STYLE: "width:" + d.steepening[a] + "%;" }); e = this.sortStats(e), f[f.length] = { ID: c, CLASSES: "screen " + (CONF.DOM.BOARDPOSTS.data("activescreen") === c ? "curent" : ""), CONTENT: { IMG: { SRC: "img/textures/onboard.png", CLASSES: "screen-icon", STYLE: "background-image:url(" + b.META.BG.replace(/(.[A-Za-z]*)$/, ".thumb$1").replace("thumb.svg", "svg") + ");" },