|
|
|
|
@@ -7,23 +7,22 @@ var SENTINEL_PASSWORD = "************";
|
|
|
|
|
var CHAT_SCROLLBACK_LIMIT = 50; // Once over 2x $limit, the first $limit will be trimmed off the list
|
|
|
|
|
var EXTERN_ROOT = window.location.protocol + "//" + window.location.host + "/";
|
|
|
|
|
|
|
|
|
|
var $ = (document.querySelectorAll ?
|
|
|
|
|
function(s) {
|
|
|
|
|
var r = document.querySelectorAll(s);
|
|
|
|
|
return (s[0] === '#' && r.length === 1) ? r[0] : r;
|
|
|
|
|
} :
|
|
|
|
|
function(s) {
|
|
|
|
|
var el = function(s) {
|
|
|
|
|
// There used to be a querySelectorAll implementation, but, better that we don't have
|
|
|
|
|
// potentially-incompatible implementations if this one does actually work.
|
|
|
|
|
// i'm not writing a selector engine...
|
|
|
|
|
if (! s.length) return [];
|
|
|
|
|
if (! s.length) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (s[0] === '#') {
|
|
|
|
|
return document.getElementById(s.slice(1));
|
|
|
|
|
return document.getElementById(s.slice(1)); // single element
|
|
|
|
|
} else if (s[0] === '.') {
|
|
|
|
|
return document.getElementsByClassName(s.slice(1));
|
|
|
|
|
return document.getElementsByClassName(s.slice(1)); // multiple elements
|
|
|
|
|
} else {
|
|
|
|
|
return document.getElementsByTagName(s);
|
|
|
|
|
return document.getElementsByTagName(s); // multiple elements
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var nmdc_escape = function(str) {
|
|
|
|
|
return (
|
|
|
|
|
@@ -47,8 +46,8 @@ var fmtBytes = function(b) {
|
|
|
|
|
|
|
|
|
|
var k = 1024;
|
|
|
|
|
var sizes = [' B', ' KiB', ' MiB', ' GiB', ' TiB'];
|
|
|
|
|
var i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
|
|
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(3)) + sizes[i];
|
|
|
|
|
var i = Math.floor(Math.log(b) / Math.log(k));
|
|
|
|
|
return parseFloat((b / Math.pow(k, i)).toFixed(3)) + sizes[i];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -96,7 +95,7 @@ var b64 = function(str) {
|
|
|
|
|
})).replace(/=/g, '');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// https://gist.github.com/eligrey/1276030
|
|
|
|
|
// @ref https://gist.github.com/eligrey/1276030
|
|
|
|
|
var appendInnerHTML = function($el, html) {
|
|
|
|
|
var child = document.createElement("span");
|
|
|
|
|
child.innerHTML = html;
|
|
|
|
|
@@ -107,7 +106,7 @@ var appendInnerHTML = function($el, html) {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// http://stackoverflow.com/a/5598797
|
|
|
|
|
// @ref http://stackoverflow.com/a/5598797
|
|
|
|
|
function getOffsetLeft( elem ) {
|
|
|
|
|
var offsetLeft = 0;
|
|
|
|
|
do {
|
|
|
|
|
@@ -147,17 +146,23 @@ var date_format = function(d, format) {
|
|
|
|
|
|
|
|
|
|
/* */
|
|
|
|
|
|
|
|
|
|
var notify = function(title, body) {
|
|
|
|
|
var notify = function(title, body, tab) {
|
|
|
|
|
if (!("Notification" in window)) {
|
|
|
|
|
return; // not supported by browser
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (window.Notification.permission) {
|
|
|
|
|
case "granted": {
|
|
|
|
|
new Notification(title, {
|
|
|
|
|
var n = new Notification(title, {
|
|
|
|
|
body: body,
|
|
|
|
|
icon: EXTERN_ROOT + "/favicon.ico"
|
|
|
|
|
});
|
|
|
|
|
n.onclick = function() {
|
|
|
|
|
parent.focus(); // recent chrome
|
|
|
|
|
window.focus(); // older browsers
|
|
|
|
|
tab_set(tab);
|
|
|
|
|
this.close();
|
|
|
|
|
};
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
case "denied": return;
|
|
|
|
|
@@ -174,7 +179,7 @@ var notify = function(title, body) {
|
|
|
|
|
/* Tab writers */
|
|
|
|
|
|
|
|
|
|
var write = function(tab) {
|
|
|
|
|
var $tab = $('#inner-'+tab);
|
|
|
|
|
var $tab = el('#inner-'+tab);
|
|
|
|
|
return {
|
|
|
|
|
'cls': function() {
|
|
|
|
|
$tab.innerHTML = '';
|
|
|
|
|
@@ -243,15 +248,14 @@ var userMenu = function(u, ev) {
|
|
|
|
|
usermenu.show();
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
ev.preventDefault();
|
|
|
|
|
return false;
|
|
|
|
|
return noprop(ev);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var userlist = {
|
|
|
|
|
'add': function(u) {
|
|
|
|
|
if (this.has(u)) return;
|
|
|
|
|
|
|
|
|
|
var userlists = $(".userlist");
|
|
|
|
|
var userlists = el(".userlist");
|
|
|
|
|
for (var l = 0, e = userlists.length; l !== e; ++l) {
|
|
|
|
|
var userlist = userlists[l];
|
|
|
|
|
|
|
|
|
|
@@ -280,7 +284,7 @@ var userlist = {
|
|
|
|
|
return this;
|
|
|
|
|
},
|
|
|
|
|
'del': function(u) {
|
|
|
|
|
var userlists = $(".userlist");
|
|
|
|
|
var userlists = el(".userlist");
|
|
|
|
|
for (var l = 0, e = userlists.length; l !== e; ++l) {
|
|
|
|
|
if (! userlists[l].children) continue;
|
|
|
|
|
var userlist = userlists[l];
|
|
|
|
|
@@ -297,7 +301,7 @@ var userlist = {
|
|
|
|
|
return this;
|
|
|
|
|
},
|
|
|
|
|
'clear': function() {
|
|
|
|
|
var userlists = $(".userlist");
|
|
|
|
|
var userlists = el(".userlist");
|
|
|
|
|
for (var i in userlists) {
|
|
|
|
|
if (! userlists[i].children) continue;
|
|
|
|
|
var userlist = userlists[i];
|
|
|
|
|
@@ -310,7 +314,7 @@ var userlist = {
|
|
|
|
|
return this;
|
|
|
|
|
},
|
|
|
|
|
'names': function() {
|
|
|
|
|
var userlist = $(".userlist")[0].children;
|
|
|
|
|
var userlist = el(".userlist")[0].children;
|
|
|
|
|
var ret = [];
|
|
|
|
|
for (var i = 0, e = userlist.length; i < e; ++i) {
|
|
|
|
|
ret.push( textContent(userlist[i]) );
|
|
|
|
|
@@ -318,14 +322,14 @@ var userlist = {
|
|
|
|
|
return ret;
|
|
|
|
|
},
|
|
|
|
|
'has': function(u) {
|
|
|
|
|
return $(".user-" + b64(u)).length !== 0; /* there are two - large and non-large */
|
|
|
|
|
return el(".user-" + b64(u)).length !== 0; /* there are two - large and non-large */
|
|
|
|
|
},
|
|
|
|
|
'count': function() {
|
|
|
|
|
return $(".userlist")[0].children.length;
|
|
|
|
|
return el(".userlist")[0].children.length;
|
|
|
|
|
},
|
|
|
|
|
'setInfo': function(nick, props) {
|
|
|
|
|
var baseClass = "user-" + b64(nick);
|
|
|
|
|
var $el = $("." + baseClass);
|
|
|
|
|
var $el = el("." + baseClass);
|
|
|
|
|
var prop_str = [];
|
|
|
|
|
if (props.Description.length > 0) {
|
|
|
|
|
prop_str.push(props.Description);
|
|
|
|
|
@@ -336,6 +340,9 @@ var userlist = {
|
|
|
|
|
if (props.ClientTag.length > 0) {
|
|
|
|
|
prop_str.push(props.ClientTag + " " + props.ClientVersion);
|
|
|
|
|
}
|
|
|
|
|
if (props.IPAddress.length > 0) {
|
|
|
|
|
prop_str.push(props.IPAddress);
|
|
|
|
|
}
|
|
|
|
|
prop_str.push("Sharing " + fmtBytes(props.ShareSize));
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < $el.length; ++i) {
|
|
|
|
|
@@ -351,7 +358,7 @@ var userlist = {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var submit = function() {
|
|
|
|
|
var str = $("#chatbox").value;
|
|
|
|
|
var str = el("#chatbox").value;
|
|
|
|
|
if (! str.length) return;
|
|
|
|
|
|
|
|
|
|
if (hub_state === STATE_READY_FOR_LOGIN) {
|
|
|
|
|
@@ -365,7 +372,7 @@ var submit = function() {
|
|
|
|
|
}
|
|
|
|
|
if (hub_pass === SENTINEL_PASSWORD) {
|
|
|
|
|
// Probably not a real password. Attempt to load a better one from the saved state
|
|
|
|
|
var cache = persistence_get("login");
|
|
|
|
|
var cache = persistence_get("login", "");
|
|
|
|
|
if (cache.indexOf(":") != -1) {
|
|
|
|
|
hub_pass = cache.substr(cache.indexOf(":") + 1);
|
|
|
|
|
}
|
|
|
|
|
@@ -394,7 +401,7 @@ var submit = function() {
|
|
|
|
|
write("tab-main").system("Invalid internal state.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$("#chatbox").value = '';
|
|
|
|
|
el("#chatbox").value = '';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* page visibility */
|
|
|
|
|
@@ -441,13 +448,13 @@ var pagevis_setup = function(fnActive, fnInactive) {
|
|
|
|
|
*/
|
|
|
|
|
var tab_set = function(tab) {
|
|
|
|
|
|
|
|
|
|
var tabs = $(".tabpane");
|
|
|
|
|
var tabs = el(".tabpane");
|
|
|
|
|
for (var i in tabs) {
|
|
|
|
|
try {
|
|
|
|
|
tabs[i].style.display = (tabs[i].id === tab ? 'block' : 'none');
|
|
|
|
|
} catch (e) {};
|
|
|
|
|
}
|
|
|
|
|
var tabitems = $(".tabitem");
|
|
|
|
|
var tabitems = el(".tabitem");
|
|
|
|
|
for (var i in tabitems) {
|
|
|
|
|
try {
|
|
|
|
|
// Update UNREAD/SELECTED flags for the target
|
|
|
|
|
@@ -475,13 +482,13 @@ var tab_set = function(tab) {
|
|
|
|
|
updateTitle();
|
|
|
|
|
|
|
|
|
|
write(tab).scroll();
|
|
|
|
|
$("#chatbox").focus();
|
|
|
|
|
el("#chatbox").focus();
|
|
|
|
|
last_tab = tab;
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var tab_new = function(id, name) {
|
|
|
|
|
appendInnerHTML($("#bar"),
|
|
|
|
|
appendInnerHTML(el("#bar"),
|
|
|
|
|
' <div class="tabitem" data-tab="tab-ext-'+id+'" id="tabitem-tab-ext-'+id+'">'+
|
|
|
|
|
'<span class="tab-label">'+
|
|
|
|
|
hesc(name)+
|
|
|
|
|
@@ -489,7 +496,7 @@ var tab_new = function(id, name) {
|
|
|
|
|
'<a class="tab-closer" data-tab="tab-ext-'+id+'">×</a>'+
|
|
|
|
|
'</div> '
|
|
|
|
|
);
|
|
|
|
|
appendInnerHTML($("#extratabs"),
|
|
|
|
|
appendInnerHTML(el("#extratabs"),
|
|
|
|
|
' <div class="tabpane content placement-mid" id="tab-ext-'+id+'" style="display:none;">'+
|
|
|
|
|
'<div class="content-inner" id="inner-tab-ext-'+id+'"></div>'+
|
|
|
|
|
'</div>'
|
|
|
|
|
@@ -502,10 +509,10 @@ var tab_free = function(id) {
|
|
|
|
|
if (id === "tab-main") return;
|
|
|
|
|
|
|
|
|
|
// remove tab item and body
|
|
|
|
|
var el = $("#tabitem-"+id);
|
|
|
|
|
var el = el("#tabitem-"+id);
|
|
|
|
|
el.parentNode.removeChild(el);
|
|
|
|
|
|
|
|
|
|
var el = $("#"+id);
|
|
|
|
|
var el = el("#"+id);
|
|
|
|
|
el.parentNode.removeChild(el);
|
|
|
|
|
|
|
|
|
|
// clear from PM tabs
|
|
|
|
|
@@ -525,38 +532,40 @@ var tab_free = function(id) {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var noprop = function(ev) {
|
|
|
|
|
if (ev.preventDefault) {
|
|
|
|
|
ev.preventDefault();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ev.stopPropagation) {
|
|
|
|
|
ev.stopPropagation();
|
|
|
|
|
} else {
|
|
|
|
|
ev.cancelBubble = true; // oldIE
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var tab_addHandlers = function() {
|
|
|
|
|
var tabitems = $(".tabitem");
|
|
|
|
|
var tabitems = el(".tabitem");
|
|
|
|
|
for (var i = 0; i < tabitems.length; i++) {
|
|
|
|
|
if (! tabitems[i]) continue;
|
|
|
|
|
|
|
|
|
|
tabitems[i].onclick = function(ev) {
|
|
|
|
|
tab_set( this.getAttribute('data-tab') );
|
|
|
|
|
|
|
|
|
|
// 360nobubble
|
|
|
|
|
if (ev.stopPropagation) {
|
|
|
|
|
ev.stopPropagation();
|
|
|
|
|
} else {
|
|
|
|
|
ev.cancelBubble = true; // oldIE
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
return noprop(ev);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var tabclosers = $(".tab-closer");
|
|
|
|
|
var tabclosers = el(".tab-closer");
|
|
|
|
|
for (var i = 0; i < tabclosers.length; i++) {
|
|
|
|
|
if (! tabclosers[i]) continue;
|
|
|
|
|
|
|
|
|
|
tabclosers[i].onclick = function(ev) {
|
|
|
|
|
tab_free( this.getAttribute('data-tab') );
|
|
|
|
|
|
|
|
|
|
// 360nobubble
|
|
|
|
|
if (ev.stopPropagation) {
|
|
|
|
|
ev.stopPropagation();
|
|
|
|
|
} else {
|
|
|
|
|
ev.cancelBubble = true; // oldIE
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
return noprop(ev);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
@@ -589,7 +598,7 @@ var tabcomplete_state = '';
|
|
|
|
|
|
|
|
|
|
var tabcompletion_start = function(direction) {
|
|
|
|
|
|
|
|
|
|
var cursor = $("#chatbox").value.replace(/^.*\s([^\s]+)$/, '$1');
|
|
|
|
|
var cursor = el("#chatbox").value.replace(/^.*\s([^\s]+)$/, '$1');
|
|
|
|
|
|
|
|
|
|
if (tabcomplete_state === '') {
|
|
|
|
|
// new tab completion
|
|
|
|
|
@@ -625,10 +634,10 @@ var tabcompletion_start = function(direction) {
|
|
|
|
|
|
|
|
|
|
// Replace in textbox
|
|
|
|
|
|
|
|
|
|
var chatprefix = $("#chatbox").value.substr(0, $("#chatbox").value.length - cursor.length);
|
|
|
|
|
var chatprefix = el("#chatbox").value.substr(0, el("#chatbox").value.length - cursor.length);
|
|
|
|
|
|
|
|
|
|
$("#chatbox").value = chatprefix + targetName;
|
|
|
|
|
$("#chatbox").focus();
|
|
|
|
|
el("#chatbox").value = chatprefix + targetName;
|
|
|
|
|
el("#chatbox").focus();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var tabcompletion_inactive = function() {
|
|
|
|
|
@@ -677,7 +686,7 @@ MenuList.prototype.toggle = function() {
|
|
|
|
|
|
|
|
|
|
/* */
|
|
|
|
|
|
|
|
|
|
var menu = new MenuList($("#menubutton"));
|
|
|
|
|
var menu = new MenuList(el("#menubutton"));
|
|
|
|
|
|
|
|
|
|
menu.reset = function() {
|
|
|
|
|
this.clear();
|
|
|
|
|
@@ -773,7 +782,7 @@ var toggle_joinparts = function(ev) {
|
|
|
|
|
|
|
|
|
|
var updateTitle = function() {
|
|
|
|
|
var prefix = "";
|
|
|
|
|
var unrTabs = $(".unread");
|
|
|
|
|
var unrTabs = el(".unread");
|
|
|
|
|
if (unrTabs.length === 1 && unrTabs[0].getAttribute('data-tab') == "tab-main") {
|
|
|
|
|
prefix = "[" + mainchat_unread_count + " NEW] "
|
|
|
|
|
} else if (unrTabs.length > 0) {
|
|
|
|
|
@@ -848,7 +857,7 @@ var desktop_notifications_toggle = function(ev) {
|
|
|
|
|
persistence_set("notifications", desktop_notifications_enabled);
|
|
|
|
|
|
|
|
|
|
if (desktop_notifications_enabled) {
|
|
|
|
|
desktop_notifications_onEnable();
|
|
|
|
|
notify(hub_hubname, "Desktop popups enabled", "tab-main");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
persistence_set("popups", desktop_notifications_enabled);
|
|
|
|
|
@@ -856,10 +865,6 @@ var desktop_notifications_toggle = function(ev) {
|
|
|
|
|
$el.innerHTML = desktop_notifications_fmtstr();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var desktop_notifications_onEnable = function() {
|
|
|
|
|
notify(hub_hubname, "Desktop popups enabled");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var scrollback_move = function(delta) {
|
|
|
|
|
if (chat_scrollback.length === 0) {
|
|
|
|
|
return; // no effect
|
|
|
|
|
@@ -878,7 +883,7 @@ var scrollback_move = function(delta) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$("#chatbox").value = chat_scrollback[chat_scrollback_index];
|
|
|
|
|
el("#chatbox").value = chat_scrollback[chat_scrollback_index];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* */
|
|
|
|
|
@@ -903,25 +908,25 @@ var transition = function(new_state) {
|
|
|
|
|
switch(new_state) {
|
|
|
|
|
case STATE_DISCONNECTED: {
|
|
|
|
|
userlist.clear();
|
|
|
|
|
$("#chatbox").disabled = true;
|
|
|
|
|
$("#chatbox").value = ''; // clear
|
|
|
|
|
el("#chatbox").disabled = true;
|
|
|
|
|
el("#chatbox").value = ''; // clear
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
case STATE_READY_FOR_LOGIN: {
|
|
|
|
|
userlist.clear();
|
|
|
|
|
$("#chatbox").spellcheck = false;
|
|
|
|
|
$("#chatbox").disabled = false;
|
|
|
|
|
$("#chatbox").value = ''; // clear
|
|
|
|
|
el("#chatbox").spellcheck = false;
|
|
|
|
|
el("#chatbox").disabled = false;
|
|
|
|
|
el("#chatbox").value = ''; // clear
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
case STATE_CONNECTING: {
|
|
|
|
|
$("#chatbox").disabled = true;
|
|
|
|
|
el("#chatbox").disabled = true;
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
case STATE_ACTIVE: {
|
|
|
|
|
write("tab-main").system("Now talking on "+hub_hubname);
|
|
|
|
|
$("#chatbox").disabled = false;
|
|
|
|
|
$("#chatbox").spellcheck = true;
|
|
|
|
|
el("#chatbox").disabled = false;
|
|
|
|
|
el("#chatbox").spellcheck = true;
|
|
|
|
|
} break;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
@@ -931,12 +936,49 @@ var tab_is_visible = function(tabref) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var tab_mark_unread = function(tabref) {
|
|
|
|
|
if ($("#tabitem-"+tabref).className.indexOf('unread') === -1) {
|
|
|
|
|
$("#tabitem-"+tabref).className += " unread";
|
|
|
|
|
if (el("#tabitem-"+tabref).className.indexOf('unread') === -1) {
|
|
|
|
|
el("#tabitem-"+tabref).className += " unread";
|
|
|
|
|
updateTitle();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
var contented_url = "";
|
|
|
|
|
var contented_loaded_sdk = false;
|
|
|
|
|
var contented_load = function() {
|
|
|
|
|
if (contented_url.length === 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var onceSDKLoaded = function() {
|
|
|
|
|
contented.init("#inner-tab-main", function(items) {
|
|
|
|
|
var val = el("#chatbox").value;
|
|
|
|
|
for (var i = 0; i < items.length; ++i) {
|
|
|
|
|
if (val.length > 0) {
|
|
|
|
|
val += " ";
|
|
|
|
|
}
|
|
|
|
|
val += contented.getPreviewURL(items[i]);
|
|
|
|
|
}
|
|
|
|
|
el("#chatbox").value = val;
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (contented_loaded_sdk) {
|
|
|
|
|
onceSDKLoaded();
|
|
|
|
|
} else {
|
|
|
|
|
var scriptElement = document.createElement('script');
|
|
|
|
|
scriptElement.onload = function() {
|
|
|
|
|
contented_loaded_sdk = true;
|
|
|
|
|
onceSDKLoaded();
|
|
|
|
|
};
|
|
|
|
|
scriptElement.src = contented_url + "sdk.js";
|
|
|
|
|
document.body.appendChild(scriptElement);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
window.onload = function() {
|
|
|
|
|
write("tab-main").system("Communicating with server...");
|
|
|
|
|
|
|
|
|
|
@@ -946,29 +988,24 @@ window.onload = function() {
|
|
|
|
|
|
|
|
|
|
// HTML event handlers
|
|
|
|
|
|
|
|
|
|
$("#form-none").onsubmit = function(ev) {
|
|
|
|
|
el("#form-none").onsubmit = function(ev) {
|
|
|
|
|
submit();
|
|
|
|
|
|
|
|
|
|
// don't submit form
|
|
|
|
|
ev.preventDefault();
|
|
|
|
|
return false;
|
|
|
|
|
return noprop(ev); // don't submit form
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
$("#chatbox").onkeydown = function(ev) {
|
|
|
|
|
el("#chatbox").onkeydown = function(ev) {
|
|
|
|
|
if (ev.keyCode === 9 /* Tab */) {
|
|
|
|
|
tabcompletion_start( ev.shiftKey ? -1 : 1 );
|
|
|
|
|
ev.preventDefault();
|
|
|
|
|
return false;
|
|
|
|
|
return noprop(ev);
|
|
|
|
|
|
|
|
|
|
} else if (ev.keyCode == 38 /* ArrowUp */ && ev.ctrlKey) {
|
|
|
|
|
scrollback_move(-1);
|
|
|
|
|
ev.preventDefault();
|
|
|
|
|
return false;
|
|
|
|
|
return noprop(ev);
|
|
|
|
|
|
|
|
|
|
} else if (ev.keyCode == 40 /* ArrowDown */ && ev.ctrlKey) {
|
|
|
|
|
scrollback_move(1);
|
|
|
|
|
ev.preventDefault();
|
|
|
|
|
return false;
|
|
|
|
|
return noprop(ev);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
tabcompletion_inactive();
|
|
|
|
|
@@ -985,11 +1022,9 @@ window.onload = function() {
|
|
|
|
|
usermenu.hide();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
$("#menubutton").onclick = function(ev) {
|
|
|
|
|
el("#menubutton").onclick = function(ev) {
|
|
|
|
|
menu.toggle();
|
|
|
|
|
ev.preventDefault();
|
|
|
|
|
ev.stopPropagation();
|
|
|
|
|
return false;
|
|
|
|
|
return noprop(ev);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
window.onclick = function() {
|
|
|
|
|
@@ -1009,13 +1044,9 @@ window.onload = function() {
|
|
|
|
|
|
|
|
|
|
timestamp_format_index = persistence_get("timestamps", 0);
|
|
|
|
|
|
|
|
|
|
should_warn_on_close = persistence_get("warnonclose");
|
|
|
|
|
should_warn_on_close = persistence_get("warnonclose", false);
|
|
|
|
|
|
|
|
|
|
desktop_notifications_enabled = persistence_get("popups");
|
|
|
|
|
if (desktop_notifications_enabled) {
|
|
|
|
|
// prompt for permissions
|
|
|
|
|
desktop_notifications_onEnable();
|
|
|
|
|
}
|
|
|
|
|
desktop_notifications_enabled = persistence_get("popups", false);
|
|
|
|
|
|
|
|
|
|
menu.reset();
|
|
|
|
|
|
|
|
|
|
@@ -1049,7 +1080,7 @@ window.onload = function() {
|
|
|
|
|
if (pre_login.indexOf(":") !== -1) {
|
|
|
|
|
pre_login = pre_login.substr(0, pre_login.indexOf(":")) + ":" + SENTINEL_PASSWORD;
|
|
|
|
|
}
|
|
|
|
|
$("#chatbox").value = pre_login;
|
|
|
|
|
el("#chatbox").value = pre_login;
|
|
|
|
|
|
|
|
|
|
if (have_cleared_once) {
|
|
|
|
|
// re-log-in automatically
|
|
|
|
|
@@ -1090,7 +1121,7 @@ window.onload = function() {
|
|
|
|
|
tab_mark_unread( pm_tabs[data.user] );
|
|
|
|
|
|
|
|
|
|
if (desktop_notifications_enabled) {
|
|
|
|
|
notify("Message from " + data.user, data.message);
|
|
|
|
|
notify("Message from " + data.user, data.message, pm_tabs[data.user]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
@@ -1143,6 +1174,12 @@ window.onload = function() {
|
|
|
|
|
sock.on('usercommand', function(data) {
|
|
|
|
|
process_usercommand(data);
|
|
|
|
|
});
|
|
|
|
|
sock.on('contented', function(url) {
|
|
|
|
|
contented_url = url;
|
|
|
|
|
menu.add("Upload", function() {
|
|
|
|
|
contented_load();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//IIFEMODE:})();
|
|
|
|
|
|