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
JavaScript
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 & 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 © 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 © 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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}, 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") + ");"
},