$(function() { var socket = io.connect(""); $.each([ "NETWORKS", "CHANNELS", "MESSAGES", "USERS" ], function(i, type) { socket.on(type, function(data) { console.log(data); render(type, data); }); }); var chat = $("#chat"); var sidebar = $("#sidebar"); // Templates var network_tpl = $("#network").html(); var channel_tpl = $("#channel").html(); var window_tpl = $("#window").html(); var message_tpl = $("#message").html(); var user_tpl = $("#user").html() function render(type, data) { switch (type) { case "NETWORKS": var windows = chat .find("#windows") .html(""); data.forEach(function(network) { windows.append(Mustache.render(window_tpl, network, { users: user_tpl, messages: message_tpl })); }); sidebar.find("#list").html( Mustache.render(network_tpl, {networks: data}, { channels: channel_tpl }) ).find(".channel") .first() .addClass("active"); chat.find(".messages").sticky().scrollToBottom(); chat.find(".window") .first() .bringToTop(); break; case "CHANNELS": if (data.action == "remove") { chat.find(".window[data-id='" + data.data.id + "']").remove(); sidebar.find(".channel[data-id='" + data.data.id + "']").remove(); return; } sidebar.find(".network[data-id='" + data.target + "']").append( Mustache.render(channel_tpl, {channels: data.data}, { channels: channel_tpl }) ); chat.find("#windows").append( Mustache.render(window_tpl, {channels: data.data}, { users: user_tpl, messages: message_tpl }) ); break; case "USERS": var target; if (typeof data.target !== "undefined") { target = chat.find(".window[data-id='" + data.target + "']"); } target = target.find(".users"); target.html(Mustache.render(user_tpl, {users: data.data})); break; case "MESSAGES": var target; if (typeof data.target !== "undefined") { target = chat.find(".window[data-id='" + data.target + "']"); } var message = data.data; if (message.type == "error") { target = target.parent().find(".active"); } target = target.find(".messages"); target.append(Mustache.render(message_tpl, {messages: message})); break; } } sidebar.on("click", ".channel", function(e) { e.preventDefault(); sidebar.find("#list .active").removeClass("active"); $("#viewport").removeClass(); var item = $(this) .addClass("active") .find(".badge") .html("") .end(); var id = item.data("id"); chat.find(".window[data-id='" + id + "']") .bringToTop(); }); sidebar.find("input[type=checkbox]").each(function() { var input = $(this); var value = input.val(); input.prop("checked", true).wrap("