2014-03-06 10:11:25 -05:00
|
|
|
$(function() {
|
2014-04-19 17:40:36 -04:00
|
|
|
var chat = $("#chat");
|
|
|
|
var sidebar = $("#sidebar");
|
|
|
|
|
2014-04-07 17:19:20 -04:00
|
|
|
var commands = [
|
|
|
|
"/connect",
|
|
|
|
"/deop",
|
|
|
|
"/devoice",
|
|
|
|
"/disconnect",
|
|
|
|
"/join",
|
|
|
|
"/kick",
|
|
|
|
"/leave",
|
|
|
|
"/mode",
|
2014-04-23 14:44:44 -04:00
|
|
|
"/msg",
|
2014-04-07 17:19:20 -04:00
|
|
|
"/nick",
|
|
|
|
"/op",
|
|
|
|
"/part",
|
|
|
|
"/query",
|
|
|
|
"/quit",
|
|
|
|
"/server",
|
|
|
|
"/topic",
|
|
|
|
"/voice",
|
|
|
|
"/whois",
|
|
|
|
];
|
|
|
|
|
2014-03-06 10:11:25 -05:00
|
|
|
var socket = io.connect("");
|
2014-04-23 14:44:44 -04:00
|
|
|
var events = [
|
|
|
|
"join",
|
|
|
|
"msg",
|
|
|
|
"networks",
|
|
|
|
"nick",
|
|
|
|
"part",
|
|
|
|
"users",
|
|
|
|
].forEach(function(e) {
|
|
|
|
socket.on(e, function(data) {
|
|
|
|
event(e, data);
|
2014-03-12 09:10:53 -04:00
|
|
|
});
|
2014-03-06 22:18:53 -05:00
|
|
|
});
|
2014-04-08 10:18:06 -04:00
|
|
|
|
2014-03-19 13:30:06 -04:00
|
|
|
var tpl = [];
|
2014-04-23 14:44:44 -04:00
|
|
|
function render(id, data) {
|
|
|
|
tpl[id] = tpl[id] || Handlebars.compile($(id).remove().html());
|
|
|
|
return tpl[id](data);
|
2014-03-19 13:30:06 -04:00
|
|
|
}
|
2014-03-22 19:42:07 -04:00
|
|
|
|
2014-04-23 14:44:44 -04:00
|
|
|
function event(e, data) {
|
|
|
|
switch (e) {
|
|
|
|
case "join":
|
|
|
|
chat.append(render("#windows", {
|
|
|
|
windows: [data.chan],
|
|
|
|
})).find(".window")
|
|
|
|
.last()
|
|
|
|
.find(".input")
|
2014-04-13 19:49:22 -04:00
|
|
|
.tabComplete({after: " ", list: commands})
|
2014-04-13 20:47:59 -04:00
|
|
|
.inputHistory({submit: true})
|
2014-04-07 17:19:20 -04:00
|
|
|
.end()
|
|
|
|
.bringToTop()
|
2014-04-23 14:44:44 -04:00
|
|
|
.find(".messages")
|
|
|
|
.scrollGlue({speed: 400})
|
2014-04-07 17:19:20 -04:00
|
|
|
.end();
|
2014-04-23 14:44:44 -04:00
|
|
|
$("#network-" + data.id).append(render("#channels", {
|
|
|
|
channels: [data.chan],
|
|
|
|
})).find(".channel")
|
2014-03-18 19:08:11 -04:00
|
|
|
.last()
|
2014-04-23 14:44:44 -04:00
|
|
|
.uniqueClass("active")
|
|
|
|
.end();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "msg":
|
|
|
|
$("#window-" + data.id).find(".messages").append(render("#messages", {
|
|
|
|
messages: [data.msg],
|
|
|
|
}));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "networks":
|
|
|
|
chat.html(render("#windows", {
|
|
|
|
windows: $.map(data.networks, function(n) { return n.channels; }),
|
|
|
|
})).find(".window")
|
|
|
|
.find(".input")
|
2014-04-13 19:49:22 -04:00
|
|
|
.tabComplete({after: " ", list: commands})
|
2014-04-13 20:47:59 -04:00
|
|
|
.inputHistory({submit: true})
|
2014-04-07 17:19:20 -04:00
|
|
|
.end()
|
2014-03-18 19:08:11 -04:00
|
|
|
.find(".messages")
|
2014-04-23 14:44:44 -04:00
|
|
|
.scrollGlue({speed: 400})
|
|
|
|
.end()
|
|
|
|
.last()
|
|
|
|
.bringToTop()
|
|
|
|
.end();
|
|
|
|
sidebar.html(render("#networks", {
|
|
|
|
networks: data.networks,
|
|
|
|
})).find(".channel")
|
|
|
|
.last()
|
|
|
|
.addClass("active")
|
2014-04-07 17:19:20 -04:00
|
|
|
.end();
|
2014-03-17 12:24:32 -04:00
|
|
|
break;
|
2014-04-23 14:44:44 -04:00
|
|
|
|
|
|
|
case "nick":
|
|
|
|
// Not yet implemented.
|
2014-03-12 09:10:53 -04:00
|
|
|
break;
|
2014-04-23 14:44:44 -04:00
|
|
|
|
|
|
|
case "part":
|
|
|
|
$("#channel-" + data.id + ", #window-" + data.id).remove();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "users":
|
|
|
|
$("#window-" + data.id).find(".users").html(render("#users", {
|
|
|
|
users: data.users,
|
|
|
|
}));
|
2014-03-12 09:10:53 -04:00
|
|
|
break;
|
|
|
|
}
|
2014-03-06 22:18:53 -05:00
|
|
|
}
|
2014-04-23 14:44:44 -04:00
|
|
|
|
2014-03-31 18:02:28 -04:00
|
|
|
chat.on("submit", "form", function() {
|
|
|
|
var input = $(this).find(".input");
|
2014-04-23 14:44:44 -04:00
|
|
|
var text = input.val();
|
2014-03-31 18:02:28 -04:00
|
|
|
if (text == "") {
|
|
|
|
return false;
|
2014-03-15 11:51:21 -04:00
|
|
|
}
|
2014-03-31 18:02:28 -04:00
|
|
|
input.val("");
|
2014-03-15 11:51:21 -04:00
|
|
|
socket.emit("input", {
|
2014-03-31 18:02:28 -04:00
|
|
|
id: input.data("target"),
|
2014-04-06 16:53:07 -04:00
|
|
|
text: text,
|
2014-03-15 11:51:21 -04:00
|
|
|
});
|
2014-03-06 10:11:25 -05:00
|
|
|
});
|
2014-04-23 14:44:44 -04:00
|
|
|
|
|
|
|
chat.on("focus", ".input", function() {
|
|
|
|
var input = $(this).parents().eq(1).find(".messages").scrollToBottom();
|
|
|
|
});
|
|
|
|
|
2014-04-23 18:03:35 -04:00
|
|
|
chat.on("click", ".user", function() {
|
2014-04-23 14:44:44 -04:00
|
|
|
var user = $(this);
|
2014-04-23 18:03:35 -04:00
|
|
|
var id = user.closest(".window").find(".input").data("target");
|
2014-04-23 14:44:44 -04:00
|
|
|
var name = user.text().trim();
|
2014-04-10 17:34:53 -04:00
|
|
|
if (name == "-!-" || name.indexOf(".") != -1) {
|
|
|
|
return;
|
|
|
|
}
|
2014-04-09 16:54:04 -04:00
|
|
|
socket.emit("input", {
|
|
|
|
id: id,
|
2014-04-23 14:44:44 -04:00
|
|
|
text: "/whois " + name,
|
2014-04-09 16:54:04 -04:00
|
|
|
});
|
2014-03-31 18:02:28 -04:00
|
|
|
});
|
2014-04-23 18:03:35 -04:00
|
|
|
|
|
|
|
chat.on("click", ".close", function() {
|
|
|
|
var id = $(this).closest(".window").find(".input").data("target");
|
|
|
|
socket.emit("input", {
|
|
|
|
id: id,
|
|
|
|
text: "/part",
|
|
|
|
});
|
|
|
|
});
|
2014-03-31 18:02:28 -04:00
|
|
|
|
2014-04-23 14:44:44 -04:00
|
|
|
sidebar.on("click", ".channel", function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
$("#window-" + $(this).attr("id").replace("channel-", ""))
|
|
|
|
.bringToTop();
|
2014-04-06 16:53:07 -04:00
|
|
|
});
|
2014-04-23 14:44:44 -04:00
|
|
|
|
|
|
|
// Utils
|
2014-04-21 06:27:43 -04:00
|
|
|
|
|
|
|
function uri(text) {
|
|
|
|
return URI.withinString(text, function(url) {
|
2014-04-23 14:44:44 -04:00
|
|
|
return "<a href='" + url.replace(/^www/, "//www") + "' target='_blank'>" + url + "</a>";
|
2014-04-21 06:27:43 -04:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function escape(string) {
|
|
|
|
var e = {
|
|
|
|
"<": "<",
|
|
|
|
">": ">",
|
|
|
|
};
|
|
|
|
return string.replace(/[<>]/g, function (s) {
|
|
|
|
return e[s];
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2014-04-23 14:44:44 -04:00
|
|
|
// Helpers
|
|
|
|
|
2014-04-21 06:27:43 -04:00
|
|
|
Handlebars.registerHelper(
|
|
|
|
"uri",
|
|
|
|
function(text) {
|
|
|
|
return uri(escape(text));
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
Handlebars.registerHelper(
|
|
|
|
"partial",
|
|
|
|
function(id) {
|
|
|
|
return new Handlebars.SafeString(render(id, this));
|
|
|
|
}
|
|
|
|
);
|
2014-03-22 19:42:07 -04:00
|
|
|
});
|