Change quotes to be consistent

Fixes Issue#11
This commit is contained in:
calzoneman 2013-03-24 12:23:48 -05:00
parent a5ca7d227e
commit 5f5049db12
12 changed files with 527 additions and 527 deletions

View file

@ -10,8 +10,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
*/
var RANK = 0;
var uname = readCookie('sync_uname');
var pw = readCookie('sync_pw');
var uname = readCookie("sync_uname");
var pw = readCookie("sync_pw");
var manageChannel = false;
var Rank = {
@ -27,44 +27,44 @@ initCallbacks();
function initCallbacks() {
socket.on('adm', function(data) {
socket.on("adm", function(data) {
console.log(data);
if(data.cmd == "listchannels")
handleChannelList(data);
});
socket.on('login', function(data) {
if(data.success && $('#password').val()) {
createCookie('sync_uname', uname, 1);
createCookie('sync_pw', pw, 1);
socket.on("login", function(data) {
if(data.success && $("#password").val()) {
createCookie("sync_uname", uname, 1);
createCookie("sync_pw", pw, 1);
}
if(data.success) {
$('#loggedin').css('display', '');
$('#logoutform').css('display', '');
$('#loginform').css('display', 'none');
$("#loggedin").css("display", "");
$("#logoutform").css("display", "");
$("#loginform").css("display", "none");
}
socket.emit('adm', {
socket.emit("adm", {
cmd: "listchannels"
});
});
}
function handleChannelList(data) {
if($('#chanlist').children.length > 1)
$($('#chanlist').children()[1]).remove();
if($("#chanlist").children.length > 1)
$($("#chanlist").children()[1]).remove();
for(var i = 0; i < data.chans.length; i++) {
var row = $('<tr/>').appendTo($('#chanlist'));
var name = $('<td/>').appendTo(row).text(data.chans[i].name);
var usercount = $('<td/>').appendTo(row).text(data.chans[i].usercount);
var nowplaying = $('<td/>').appendTo(row).text(data.chans[i].nowplaying);
var row = $("<tr/>").appendTo($("#chanlist"));
var name = $("<td/>").appendTo(row).text(data.chans[i].name);
var usercount = $("<td/>").appendTo(row).text(data.chans[i].usercount);
var nowplaying = $("<td/>").appendTo(row).text(data.chans[i].nowplaying);
}
}
var params = {};
if(window.location.search) {
var parameters = window.location.search.substring(1).split('&');
var parameters = window.location.search.substring(1).split("&");
for(var i = 0; i < parameters.length; i++) {
var s = parameters[i].split('=');
var s = parameters[i].split("=");
if(s.length != 2)
continue;
params[s[0]] = s[1];
@ -72,37 +72,37 @@ if(window.location.search) {
}
if(uname != null && pw != null && pw != "false") {
socket.emit('login', {
socket.emit("login", {
name: uname,
sha256: pw
});
}
function loginClick() {
uname = $('#username').val();
if($('#password').val() == "")
uname = $("#username").val();
if($("#password").val() == "")
pw = "";
else
pw = SHA256($('#password').val());
socket.emit('login', {
pw = SHA256($("#password").val());
socket.emit("login", {
name: uname,
sha256: pw
});
};
$('#login').click(loginClick);
$('#username').keydown(function(ev) {
$("#login").click(loginClick);
$("#username").keydown(function(ev) {
if(ev.key == 13)
loginClick();
});
$('#password').keydown(function(ev) {
$("#password").keydown(function(ev) {
if(ev.key == 13)
loginClick();
});
$('#logout').click(function() {
eraseCookie('sync_uname');
eraseCookie('sync_pw');
$("#logout").click(function() {
eraseCookie("sync_uname");
eraseCookie("sync_pw");
document.location.reload(true);
});
@ -119,10 +119,10 @@ function createCookie(name,value,days) {
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
var ca = document.cookie.split(";");
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
while (c.charAt(0)==" ") c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;

View file

@ -12,120 +12,120 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
// Wrapped in a function so I can ensure that the socket
// is defined before these statements are run
function initCallbacks() {
socket.on('disconnect', function() {
$('<div/>').addClass('alert').addClass('alert-error')
.insertAfter($('.row')[0])[0]
socket.on("disconnect", function() {
$("<div/>").addClass("alert").addClass("alert-error")
.insertAfter($(".row")[0])[0]
.innerHTML = "<h3>Disconnected from server</h3>";
});
socket.on('channelNotRegistered', function() {
socket.on("channelNotRegistered", function() {
showChannelRegistration();
});
socket.on('announcement', function(data) {
socket.on("announcement", function(data) {
showAnnouncement(data.title, data.text);
});
socket.on('registerChannel', function(data) {
socket.on("registerChannel", function(data) {
if(data.success) {
$('#chregnotice').remove();
$("#chregnotice").remove();
}
else {
alert(data.error);
}
});
socket.on('rank', function(data) {
socket.on("rank", function(data) {
if(data.rank >= Rank.Moderator) {
$('#playlist_controls').css("display", "block");
$('#playlist_controls button').each(function() {
$(this).attr('disabled', false);
$("#playlist_controls").css("display", "block");
$("#playlist_controls button").each(function() {
$(this).attr("disabled", false);
});
$('#qlockbtn').css("display", "block");
var poll = $('#pollcontainer .active');
$("#qlockbtn").css("display", "block");
var poll = $("#pollcontainer .active");
if(poll.length > 0) {
$('<button/>').addClass('btn btn-danger pull-right').text('Close Poll')
.insertAfter(poll.find('.close'))
$("<button/>").addClass("btn btn-danger pull-right").text("Close Poll")
.insertAfter(poll.find(".close"))
.click(function() {
socket.emit('closePoll')
socket.emit("closePoll")
});
}
var users = $('#userlist').children();
var users = $("#userlist").children();
for(var i = 0; i < users.length; i++) {
addUserDropdown(users[i], users[i].children[1].innerHTML);
}
$('#modnav').show();
$('#chancontrols').show();
$("#modnav").show();
$("#chancontrols").show();
}
RANK = data.rank;
});
socket.on('login', function(data) {
socket.on("login", function(data) {
if(!data.success)
alert(data.error);
else {
$('#welcome')[0].innerHTML = "Welcome, " + uname;
$('#loginform').css("display", "none");
$('#logoutform').css("display", "");
$('#loggedin').css("display", "");
$("#welcome")[0].innerHTML = "Welcome, " + uname;
$("#loginform").css("display", "none");
$("#logoutform").css("display", "");
$("#loggedin").css("display", "");
if(pw != "") {
createCookie('sync_uname', uname, 1);
createCookie('sync_pw', pw, 1);
createCookie("sync_uname", uname, 1);
createCookie("sync_pw", pw, 1);
}
}
});
socket.on('register', function(data) {
socket.on("register", function(data) {
if(data.error) {
alert(data.error);
}
});
socket.on('channelOpts', function(opts) {
$('#opt_qopen_allow_qnext').prop('checked', opts.qopen_allow_qnext);
$('#opt_qopen_allow_move').prop('checked', opts.qopen_allow_move);
$('#opt_qopen_allow_delete').prop('checked', opts.qopen_allow_delete);
$('#opt_qopen_allow_playnext').prop('checked', opts.qopen_allow_playnext);
$('#opt_pagetitle').attr('placeholder', opts.pagetitle);
socket.on("channelOpts", function(opts) {
$("#opt_qopen_allow_qnext").prop("checked", opts.qopen_allow_qnext);
$("#opt_qopen_allow_move").prop("checked", opts.qopen_allow_move);
$("#opt_qopen_allow_delete").prop("checked", opts.qopen_allow_delete);
$("#opt_qopen_allow_playnext").prop("checked", opts.qopen_allow_playnext);
$("#opt_pagetitle").attr("placeholder", opts.pagetitle);
document.title = opts.pagetitle;
$('opt_customcss').val(opts.customcss);
$('#customCss').remove();
$("opt_customcss").val(opts.customcss);
$("#customCss").remove();
if(opts.customcss != "") {
$('<link/>').attr("rel", "stylesheet")
$("<link/>").attr("rel", "stylesheet")
.attr("href", opts.customcss)
.attr("id", "customCss")
.insertAfter($('link[href="./assets/css/ytsync.css"]'));
.insertAfter($("link[href='./assets/css/ytsync.css']"));
}
CHANNELOPTS = opts;
if(opts.qopen_allow_qnext)
$('#queue_next').attr('disabled', false);
$("#queue_next").attr("disabled", false);
if(opts.qopen_allow_playnext)
$('#play_next').attr('disabled', false);
$("#play_next").attr("disabled", false);
rebuildPlaylist();
});
socket.on('banlist', function(data) {
socket.on("banlist", function(data) {
updateBanlist(data.entries);
});
socket.on('usercount', function(data) {
$('#usercount').text(data.count + " connected users");
socket.on("usercount", function(data) {
$("#usercount").text(data.count + " connected users");
});
socket.on('chatMsg', function(data) {
socket.on("chatMsg", function(data) {
var div = formatChatMessage(data);
$('#messagebuffer')[0].appendChild(div);
$("#messagebuffer")[0].appendChild(div);
// Cap chatbox at most recent 100 messages
if($('#messagebuffer').children().length > 100) {
$($('#messagebufer').children()[0]).remove();
if($("#messagebuffer").children().length > 100) {
$($("#messagebufer").children()[0]).remove();
}
$('#messagebuffer').scrollTop($('#messagebuffer').prop("scrollHeight"));
$("#messagebuffer").scrollTop($("#messagebuffer").prop("scrollHeight"));
});
socket.on('playlist', function(data) {
var ul = $('#queue')[0];
socket.on("playlist", function(data) {
var ul = $("#queue")[0];
var n = ul.children.length;
for(var i = 0; i < n; i++) {
ul.removeChild(ul.children[0]);
@ -138,71 +138,71 @@ function initCallbacks() {
}
});
socket.on('queue', function(data) {
socket.on("queue", function(data) {
var li = makeQueueEntry(data.media);
if(RANK >= Rank.Moderator || OPENQUEUE)
addQueueButtons(li);
$(li).css('display', 'none');
$(li).css("display", "none");
var idx = data.pos;
var ul = $('#queue')[0];
var ul = $("#queue")[0];
$(li).appendTo(ul);
if(idx < ul.children.length - 1)
moveVideo(ul.children.length - 1, idx);
$(li).show('blind');
$(li).show("blind");
});
socket.on('unqueue', function(data) {
if(data.pos == POSITION && $('#queue').children().length > POSITION + 1) {
$($('#queue').children()[POSITION+1]).addClass("alert alert-info");
socket.on("unqueue", function(data) {
if(data.pos == POSITION && $("#queue").children().length > POSITION + 1) {
$($("#queue").children()[POSITION+1]).addClass("alert alert-info");
}
var li = $('#queue').children()[data.pos];
//$(li).hide('blind', function() {
var li = $("#queue").children()[data.pos];
//$(li).hide("blind", function() {
$(li).remove();
//});
});
socket.on('moveVideo', function(data) {
socket.on("moveVideo", function(data) {
moveVideo(data.src, data.dest);
});
socket.on('queueLock', function(data) {
socket.on("queueLock", function(data) {
OPENQUEUE = !data.locked;
if(OPENQUEUE) {
$('#playlist_controls').css('display', '');
$("#playlist_controls").css("display", "");
if(RANK < Rank.Moderator) {
$('#qlockbtn').css('display', 'none');
$("#qlockbtn").css("display", "none");
rebuildPlaylist();
if(!CHANNELOPTS.qopen_allow_qnext)
$('#queue_next').attr('disabled', true);
$("#queue_next").attr("disabled", true);
if(!CHANNELOPTS.qopen_allow_playnext)
$('#play_next').attr('disabled', true);
$("#play_next").attr("disabled", true);
}
}
else if(RANK < Rank.Moderator) {
$('#playlist_controls').css('display', 'none');
$("#playlist_controls").css("display", "none");
}
if(OPENQUEUE) {
$('#qlockbtn').removeClass('btn-danger')
.addClass('btn-success')
.text('Lock Queue');
$("#qlockbtn").removeClass("btn-danger")
.addClass("btn-success")
.text("Lock Queue");
}
else {
$('#qlockbtn').removeClass('btn-success')
.addClass('btn-danger')
.text('Unlock Queue');
$("#qlockbtn").removeClass("btn-success")
.addClass("btn-danger")
.text("Unlock Queue");
}
});
socket.on('updatePlaylistIdx', function(data) {
var liold = $('#queue').children()[POSITION];
socket.on("updatePlaylistIdx", function(data) {
var liold = $("#queue").children()[POSITION];
$(liold).removeClass("alert alert-info");
var linew = $('#queue').children()[data.idx];
var linew = $("#queue").children()[data.idx];
$(linew).addClass("alert alert-info");
POSITION= data.idx;
});
socket.on('mediaUpdate', function(data) {
$('#currenttitle').text("Currently Playing: " + data.title);
socket.on("mediaUpdate", function(data) {
$("#currenttitle").text("Currently Playing: " + data.title);
if(data.type == "yt")
updateYT(data);
else if(data.type == "tw")
@ -217,24 +217,24 @@ function initCallbacks() {
updateDM(data);
});
socket.on('userlist', function(data) {
socket.on("userlist", function(data) {
for(var i = 0; i < data.length; i++) {
addUser(data[i].name, data[i].rank, data[i].leader);
}
});
socket.on('addUser', function(data) {
socket.on("addUser", function(data) {
addUser(data.name, data.rank, data.leader);
});
socket.on('updateUser', function(data) {
socket.on("updateUser", function(data) {
if(data.name == uname) {
LEADER = data.leader;
if(LEADER) {
// I'm a leader! Set up sync function
// I"m a leader! Set up sync function
sendVideoUpdate = function() {
if(MEDIATYPE == "yt") {
socket.emit('mediaUpdate', {
socket.emit("mediaUpdate", {
id: parseYTURL(PLAYER.getVideoUrl()),
seconds: PLAYER.getCurrentTime(),
paused: PLAYER.getPlayerState() == YT.PlayerState.PAUSED,
@ -243,7 +243,7 @@ function initCallbacks() {
}
else if(MEDIATYPE == "sc") {
PLAYER.getPosition(function(pos) {
socket.emit('mediaUpdate', {
socket.emit("mediaUpdate", {
id: PLAYER.mediaId,
seconds: pos / 1000,
paused: false,
@ -252,8 +252,8 @@ function initCallbacks() {
});
}
else if(MEDIATYPE == "vi") {
PLAYER.api('getCurrentTime', function(data) {
socket.emit('mediaUpdate', {
PLAYER.api("getCurrentTime", function(data) {
socket.emit("mediaUpdate", {
id: PLAYER.videoid,
seconds: data,
paused: false,
@ -262,7 +262,7 @@ function initCallbacks() {
});
}
else if(MEDIATYPE == "dm") {
socket.emit('mediaUpdate', {
socket.emit("mediaUpdate", {
id: PLAYER.mediaId,
seconds: PLAYER.currentTime,
paused: PLAYER.paused,
@ -271,16 +271,16 @@ function initCallbacks() {
}
};
}
// I'm not a leader. Don't send syncs to the server
// I"m not a leader. Don"t send syncs to the server
else {
sendVideoUpdate = function() { }
}
RANK = data.rank;
if(data.rank >= Rank.Moderator)
$('#playlist_controls').css("display", "block");
$("#playlist_controls").css("display", "block");
}
var users = $('#userlist').children();
var users = $("#userlist").children();
for(var i = 0; i < users.length; i++) {
var name = users[i].children[1].innerHTML;
// Reformat user
@ -290,22 +290,22 @@ function initCallbacks() {
}
});
socket.on('userLeave', function(data) {
var users = $('#userlist').children();
socket.on("userLeave", function(data) {
var users = $("#userlist").children();
for(var i = 0; i < users.length; i++) {
var name = users[i].children[1].innerHTML;
if(name == data.name) {
$('#userlist')[0].removeChild(users[i]);
$("#userlist")[0].removeChild(users[i]);
}
}
});
socket.on('librarySearchResults', function(data) {
var n = $('#library').children().length;
socket.on("librarySearchResults", function(data) {
var n = $("#library").children().length;
for(var i = 0; i < n; i++) {
$('#library')[0].removeChild($('#library').children()[0]);
$("#library")[0].removeChild($("#library").children()[0]);
}
var ul = $('#library')[0];
var ul = $("#library")[0];
for(var i = 0; i < data.results.length; i++) {
var li = makeQueueEntry(data.results[i]);
if(RANK >= Rank.Moderator || OPENQUEUE)
@ -314,15 +314,15 @@ function initCallbacks() {
}
});
socket.on('newPoll', function(data) {
socket.on("newPoll", function(data) {
addPoll(data);
});
socket.on('updatePoll', function(data) {
socket.on("updatePoll", function(data) {
updatePoll(data);
});
socket.on('closePoll', function() {
socket.on("closePoll", function() {
closePoll();
});
}

View file

@ -17,8 +17,8 @@ var POSITION = -1;
var RANK = 0;
var OPENQUEUE = false;
var CHANNELOPTS = {};
var uname = readCookie('sync_uname');
var pw = readCookie('sync_pw');
var uname = readCookie("sync_uname");
var pw = readCookie("sync_pw");
var Rank = {
Guest: 0,
@ -33,31 +33,31 @@ initCallbacks();
var params = {};
if(window.location.search) {
var parameters = window.location.search.substring(1).split('&');
var parameters = window.location.search.substring(1).split("&");
for(var i = 0; i < parameters.length; i++) {
var s = parameters[i].split('=');
var s = parameters[i].split("=");
if(s.length != 2)
continue;
params[s[0]] = s[1];
}
}
if(params['novideo'] != undefined) {
$('.span7').remove();
if(params["novideo"] != undefined) {
$(".span7").remove();
}
if(params['channel'] == undefined) {
var main = $($('.container')[1]);
var container = $('<div/>').addClass('container').insertBefore(main);
var row = $('<div/>').addClass('row').appendTo(container);
var div = $('<div/>').addClass('span6').appendTo(row);
if(params["channel"] == undefined) {
var main = $($(".container")[1]);
var container = $("<div/>").addClass("container").insertBefore(main);
var row = $("<div/>").addClass("row").appendTo(container);
var div = $("<div/>").addClass("span6").appendTo(row);
main.css("display", "none");
var label = $('<label/>').text('Enter Channel:').appendTo(div);
var entry = $('<input/>').attr('type', 'text').appendTo(div);
var label = $("<label/>").text("Enter Channel:").appendTo(div);
var entry = $("<input/>").attr("type", "text").appendTo(div);
entry.keydown(function(ev) {
if(ev.keyCode == 13) {
document.location = document.location + "?channel=" + entry.val();
socket.emit('joinChannel', {
socket.emit("joinChannel", {
name: entry.val()
});
container.remove();
@ -65,38 +65,38 @@ if(params['channel'] == undefined) {
}
});
}
else if(!params['channel'].match(/^[a-zA-Z0-9]+$/)) {
$('<div/>').addClass('alert alert-error')
.insertAfter($('.row')[0])[0]
else if(!params["channel"].match(/^[a-zA-Z0-9]+$/)) {
$("<div/>").addClass("alert alert-error")
.insertAfter($(".row")[0])[0]
.innerHTML = "<h3>Invalid Channel Name</h3><p>Channel names must conain only numbers and letters</p>";
}
else {
socket.emit('joinChannel', {
name: params['channel']
socket.emit("joinChannel", {
name: params["channel"]
});
}
// Load the youtube iframe API
var tag = document.createElement('script');
var tag = document.createElement("script");
tag.src = "http://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
var firstScriptTag = document.getElementsByTagName("script")[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// Load the Dailymotion iframe API
/*
var tag = document.createElement('script');
var tag = document.createElement("script");
tag.src = "http://api.dmcdn.net/all.js";
var firstScriptTag = document.getElementsByTagName('script')[0];
var firstScriptTag = document.getElementsByTagName("script")[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
*/
if(uname != null && pw != null && pw != "false") {
socket.emit('login', {
socket.emit("login", {
name: uname,
sha256: pw
});
@ -107,95 +107,95 @@ setInterval(function() {
sendVideoUpdate();
}, 5000);
$('#queue_end').click(function() {
var parsed = parseVideoURL($('#mediaurl').val());
$("#queue_end").click(function() {
var parsed = parseVideoURL($("#mediaurl").val());
var id = parsed[0];
var type = parsed[1];
if(id) {
$('#mediaurl').val("");
$("#mediaurl").val("");
}
socket.emit('queue', {
socket.emit("queue", {
id: id,
pos: "end",
type: type
});
});
$('#queue_next').click(function() {
var parsed = parseVideoURL($('#mediaurl').val());
$("#queue_next").click(function() {
var parsed = parseVideoURL($("#mediaurl").val());
var id = parsed[0];
var type = parsed[1];
if(id) {
$('#mediaurl').val("");
$("#mediaurl").val("");
}
socket.emit('queue', {
socket.emit("queue", {
id: id,
pos: "next",
type: type
});
});
$('#play_next').click(function() {
socket.emit('playNext');
$("#play_next").click(function() {
socket.emit("playNext");
});
$('#qlockbtn').click(function() {
socket.emit('queueLock', {
$("#qlockbtn").click(function() {
socket.emit("queueLock", {
locked: OPENQUEUE
});
});
function loginClick() {
uname = $('#username').val();
if($('#password').val() == "")
uname = $("#username").val();
if($("#password").val() == "")
pw = "";
else
pw = SHA256($('#password').val());
socket.emit('login', {
pw = SHA256($("#password").val());
socket.emit("login", {
name: uname,
sha256: pw
});
};
$('#login').click(loginClick);
$('#username').keydown(function(ev) {
$("#login").click(loginClick);
$("#username").keydown(function(ev) {
if(ev.key == 13)
loginClick();
});
$('#password').keydown(function(ev) {
$("#password").keydown(function(ev) {
if(ev.key == 13)
loginClick();
});
$('#logout').click(function() {
eraseCookie('sync_uname');
eraseCookie('sync_pw');
$("#logout").click(function() {
eraseCookie("sync_uname");
eraseCookie("sync_pw");
document.location.reload(true);
});
$('#register').click(function() {
uname = $('#username').val();
if($('#password').val() == "")
$("#register").click(function() {
uname = $("#username").val();
if($("#password").val() == "")
pw = "";
else
pw = SHA256($('#password').val());
socket.emit('register', {
pw = SHA256($("#password").val());
socket.emit("register", {
name: uname,
sha256: pw
});
});
$('#chatline').keydown(function(ev) {
if(ev.keyCode == 13 && $('#chatline').val() != '') {
socket.emit('chatMsg', {
msg: $('#chatline').val()
$("#chatline").keydown(function(ev) {
if(ev.keyCode == 13 && $("#chatline").val() != "") {
socket.emit("chatMsg", {
msg: $("#chatline").val()
});
$('#chatline').val('');
$("#chatline").val("");
}
else if(ev.keyCode == 9) { // Tab completion
var words = $('#chatline').val().split(' ');
var words = $("#chatline").val().split(" ");
var current = words[words.length - 1].toLowerCase();
var users = $('#userlist').children();
var users = $("#userlist").children();
var match = null;
for(var i = 0; i < users.length; i++) {
var name = users[i].children[1].innerHTML.toLowerCase();
@ -213,79 +213,79 @@ $('#chatline').keydown(function(ev) {
words[0] += ": ";
else
words[words.length - 1] += " ";
$('#chatline').val(words.join(' '));
$("#chatline").val(words.join(" "));
}
ev.preventDefault();
return false;
}
});
$('#opt_submit').click(function() {
var ptitle = $('#opt_pagetitle').val();
if(ptitle == '')
ptitle = $('#opt_pagetitle').attr('placeholder')
$("#opt_submit").click(function() {
var ptitle = $("#opt_pagetitle").val();
if(ptitle == "")
ptitle = $("#opt_pagetitle").attr("placeholder")
opts = {
qopen_allow_qnext: $('#opt_qopen_allow_qnext').prop('checked'),
qopen_allow_move: $('#opt_qopen_allow_move').prop('checked'),
qopen_allow_delete: $('#opt_qopen_allow_delete').prop('checked'),
qopen_allow_playnext: $('#opt_qopen_allow_playnext').prop('checked'),
qopen_allow_qnext: $("#opt_qopen_allow_qnext").prop("checked"),
qopen_allow_move: $("#opt_qopen_allow_move").prop("checked"),
qopen_allow_delete: $("#opt_qopen_allow_delete").prop("checked"),
qopen_allow_playnext: $("#opt_qopen_allow_playnext").prop("checked"),
pagetitle: ptitle,
customcss: $('#opt_customcss').val()
customcss: $("#opt_customcss").val()
};
socket.emit('channelOpts', opts);
socket.emit("channelOpts", opts);
});
$('#show_chancontrols').click(function() {
$('#show_chancontrols').parent().addClass("active");
$('#show_banlist').parent().removeClass("active");
$('#banlist').hide();
$('#chancontrols').show();
$("#show_chancontrols").click(function() {
$("#show_chancontrols").parent().addClass("active");
$("#show_banlist").parent().removeClass("active");
$("#banlist").hide();
$("#chancontrols").show();
});
$('#show_banlist').click(function() {
$('#show_chancontrols').parent().removeClass("active");
$('#show_banlist').parent().addClass("active");
$('#banlist').show();
$('#chancontrols').hide();
$("#show_banlist").click(function() {
$("#show_chancontrols").parent().removeClass("active");
$("#show_banlist").parent().addClass("active");
$("#banlist").show();
$("#chancontrols").hide();
});
function searchLibrary() {
socket.emit('searchLibrary', {
query: $('#library_query').val()
socket.emit("searchLibrary", {
query: $("#library_query").val()
});
}
$('#library_search').click(searchLibrary);
$('#library_query').keydown(function(ev) {
$("#library_search").click(searchLibrary);
$("#library_query").keydown(function(ev) {
if(ev.key == 13)
searchLibrary();
});
function onYouTubeIframeAPIReady() {
PLAYER = new YT.Player('ytapiplayer', {
height: '390',
width: '640',
videoId: '',
PLAYER = new YT.Player("ytapiplayer", {
height: "390",
width: "640",
videoId: "",
playerVars: {
'autoplay': 0,
'controls': 1,
"autoplay": 0,
"controls": 1,
},
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
"onReady": onPlayerReady,
"onStateChange": onPlayerStateChange
}
});
}
function onPlayerReady() {
socket.emit('playerReady');
socket.emit("playerReady");
}
function onPlayerStateChange(state) {
if(LEADER && state.data == YT.PlayerState.ENDED) {
socket.emit('playNext');
socket.emit("playNext");
}
else if(LEADER && state.data == YT.PlayerState.PAUSED) {
socket.emit('mediaUpdate', {
socket.emit("mediaUpdate", {
id: parseYTURL(PLAYER.getVideoUrl()),
seconds: PLAYER.getCurrentTime(),
type: "yt",
@ -293,7 +293,7 @@ function onPlayerStateChange(state) {
});
}
if(LEADER && state.data == YT.PlayerState.PLAYING) {
socket.emit('mediaUpdate', {
socket.emit("mediaUpdate", {
id: parseYTURL(PLAYER.getVideoUrl()),
seconds: PLAYER.getCurrentTime(),
type: "yt",
@ -314,10 +314,10 @@ function createCookie(name,value,days) {
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
var ca = document.cookie.split(";");
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
while (c.charAt(0)==" ") c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;

View file

@ -11,17 +11,17 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
// Adds a user to the chatbox userlist
function addUser(name, rank, leader) {
var div = document.createElement('div');
var div = document.createElement("div");
$(div).attr("class", "userlist_item");
var span = document.createElement('span');
var flair = document.createElement('span');
var span = document.createElement("span");
var flair = document.createElement("span");
span.innerHTML = name;
div.appendChild(flair);
div.appendChild(span);
fmtUserlistItem(div, rank, leader);
if(RANK >= Rank.Moderator)
addUserDropdown(div, name);
var users = $('#userlist').children();
var users = $("#userlist").children();
for(var i = 0; i < users.length; i++) {
var othername = users[i].children[1].innerHTML;
if(othername.toLowerCase() > name.toLowerCase()) {
@ -29,10 +29,10 @@ function addUser(name, rank, leader) {
return;
}
}
$('#userlist')[0].appendChild(div);
$("#userlist")[0].appendChild(div);
}
// Format a userlist entry based on a person's rank
// Format a userlist entry based on a person"s rank
function fmtUserlistItem(div, rank, leader) {
var span = div.children[1];
if(rank >= Rank.Siteadmin)
@ -54,63 +54,63 @@ function fmtUserlistItem(div, rank, leader) {
// Adds a dropdown with user actions (promote/demote/leader)
function addUserDropdown(entry, name) {
var div = $('<div />').addClass("dropdown").appendTo(entry);
var ul = $('<ul />').addClass("dropdown-menu").appendTo(div);
var div = $("<div />").addClass("dropdown").appendTo(entry);
var ul = $("<ul />").addClass("dropdown-menu").appendTo(div);
ul.attr("role", "menu");
ul.attr("aria-labelledby", "dropdownMenu");
var makeLeader = $('<li />').appendTo(ul);
var a = $('<a />').attr("tabindex", "-1").attr("href", "#").appendTo(makeLeader);
var makeLeader = $("<li />").appendTo(ul);
var a = $("<a />").attr("tabindex", "-1").attr("href", "#").appendTo(makeLeader);
a.text("Make Leader");
a.click(function() {
socket.emit('assignLeader', {
socket.emit("assignLeader", {
name: name
});
});
var takeLeader = $('<li />').appendTo(ul);
var a = $('<a />').attr("tabindex", "-1").attr("href", "#").appendTo(takeLeader);
var takeLeader = $("<li />").appendTo(ul);
var a = $("<a />").attr("tabindex", "-1").attr("href", "#").appendTo(takeLeader);
a.text("Take Leader");
a.click(function() {
socket.emit('assignLeader', {
socket.emit("assignLeader", {
name: ""
});
});
var kick = $('<li />').appendTo(ul);
var a = $('<a />').attr("tabindex", "-1").attr("href", "#").appendTo(kick);
var kick = $("<li />").appendTo(ul);
var a = $("<a />").attr("tabindex", "-1").attr("href", "#").appendTo(kick);
a.text("Kick");
a.click(function() {
socket.emit('chatMsg', {
socket.emit("chatMsg", {
msg: "/kick " + name
});
});
var ban = $('<li />').appendTo(ul);
var a = $('<a />').attr("tabindex", "-1").attr("href", "#").appendTo(ban);
var ban = $("<li />").appendTo(ul);
var a = $("<a />").attr("tabindex", "-1").attr("href", "#").appendTo(ban);
a.text("IP Ban");
a.click(function() {
socket.emit('chatMsg', {
socket.emit("chatMsg", {
msg: "/ban " + name
});
});
$('<li />').addClass("divider").appendTo(ul);
$("<li />").addClass("divider").appendTo(ul);
var promote = $('<li />').appendTo(ul);
var a = $('<a />').attr("tabindex", "-1").attr("href", "#").appendTo(promote);
var promote = $("<li />").appendTo(ul);
var a = $("<a />").attr("tabindex", "-1").attr("href", "#").appendTo(promote);
a.text("Promote");
a.click(function() {
socket.emit('promote', {
socket.emit("promote", {
name: name
});
});
var demote = $('<li />').appendTo(ul);
var a = $('<a />').attr("tabindex", "-1").attr("href", "#").appendTo(demote);
var demote = $("<li />").appendTo(ul);
var a = $("<a />").attr("tabindex", "-1").attr("href", "#").appendTo(demote);
a.text("Demote");
a.click(function() {
socket.emit('demote', {
socket.emit("demote", {
name: name
});
});
@ -127,18 +127,18 @@ function addUserDropdown(entry, name) {
}
function formatChatMessage(data) {
var div = document.createElement('div');
var div = document.createElement("div");
if(data.msg.indexOf(uname) != -1)
$(div).addClass('nick-highlight');
$(div).addClass("nick-highlight");
if(data.msgclass == "action") {
var message = document.createElement('span');
$(message).addClass('action');
var message = document.createElement("span");
$(message).addClass("action");
message.innerHTML = data.username + " " + data.msg;
div.appendChild(message);
}
else {
var name = document.createElement('span');
var message = document.createElement('span');
var name = document.createElement("span");
var message = document.createElement("span");
name.innerHTML = "<strong>&lt;" + data.username + "&gt;</strong> ";
if(data.msgclass == "shout")
$(name).addClass("shout");
@ -152,60 +152,60 @@ function formatChatMessage(data) {
// Creates and formats a queue entry
function makeQueueEntry(video) {
var li = $('<li />');
var li = $("<li />");
li.attr("class", "well");
var title = $('<span />').attr("class", "qe_title").appendTo(li);
var title = $("<span />").attr("class", "qe_title").appendTo(li);
title.text(video.title);
var time = $('<span />').attr("class", "qe_time").appendTo(li);
var time = $("<span />").attr("class", "qe_time").appendTo(li);
time.text(video.duration);
var clear = $('<div />').attr("class", "qe_clear").appendTo(li);
var clear = $("<div />").attr("class", "qe_clear").appendTo(li);
return li;
}
// Add buttons to a queue list entry
function addQueueButtons(li) {
var btnstrip = $('<div />').attr("class", "btn-group qe_buttons").prependTo(li);
var btnstrip = $("<div />").attr("class", "btn-group qe_buttons").prependTo(li);
var btnRemove = $('<button />').attr("class", "btn btn-danger qe_btn").appendTo(btnstrip);
$('<i />').attr("class", "icon-remove").appendTo(btnRemove);
var btnRemove = $("<button />").attr("class", "btn btn-danger qe_btn").appendTo(btnstrip);
$("<i />").attr("class", "icon-remove").appendTo(btnRemove);
var btnUp = $('<button />').attr("class", "btn qe_btn").appendTo(btnstrip);
$('<i />').attr("class", "icon-arrow-up").appendTo(btnUp);
var btnUp = $("<button />").attr("class", "btn qe_btn").appendTo(btnstrip);
$("<i />").attr("class", "icon-arrow-up").appendTo(btnUp);
var btnDown = $('<button />').attr("class", "btn qe_btn").appendTo(btnstrip);
$('<i />').attr("class", "icon-arrow-down").appendTo(btnDown);
var btnDown = $("<button />").attr("class", "btn qe_btn").appendTo(btnstrip);
$("<i />").attr("class", "icon-arrow-down").appendTo(btnDown);
var btnNext = $('<button />').attr("class", "btn qe_btn").appendTo(btnstrip);
//$('<i />').attr("class", "icon-play").appendTo(btnNext);
btnNext.text('Next');
var btnNext = $("<button />").attr("class", "btn qe_btn").appendTo(btnstrip);
//$("<i />").attr("class", "icon-play").appendTo(btnNext);
btnNext.text("Next");
// Callback time
$(btnRemove).click(function() {
btnstrip.remove();
var idx = $('#queue').children().index(li);
socket.emit('unqueue', { pos: idx });
var idx = $("#queue").children().index(li);
socket.emit("unqueue", { pos: idx });
});
$(btnUp).click(function() {
var idx = $('#queue').children().index(li);
socket.emit('moveMedia', {
var idx = $("#queue").children().index(li);
socket.emit("moveMedia", {
src: idx,
dest: idx-1
});
});
$(btnDown).click(function() {
var idx = $('#queue').children().index(li);
socket.emit('moveMedia', {
var idx = $("#queue").children().index(li);
socket.emit("moveMedia", {
src: idx,
dest: idx+1
});
});
$(btnNext).click(function() {
var idx = $('#queue').children().index(li);
var idx = $("#queue").children().index(li);
var dest = idx < POSITION ? POSITION : POSITION + 1;
socket.emit('moveMedia', {
socket.emit("moveMedia", {
src: idx,
dest: dest
});
@ -213,19 +213,19 @@ function addQueueButtons(li) {
if(RANK < Rank.Moderator && !LEADER) {
if(!CHANNELOPTS.qopen_allow_delete)
$(btnRemove).attr('disabled', true);
$(btnRemove).attr("disabled", true);
if(!CHANNELOPTS.qopen_allow_move) {
$(btnUp).attr('disabled', true);
$(btnDown).attr('disabled', true);
$(btnUp).attr("disabled", true);
$(btnDown).attr("disabled", true);
}
if(!CHANNELOPTS.qopen_allow_qnext)
$(btnNext).attr('disabled', true);
$(btnNext).attr("disabled", true);
}
}
function rebuildPlaylist() {
$('#queue li').each(function() {
$(this).find('.btn-group').remove();
$("#queue li").each(function() {
$(this).find(".btn-group").remove();
if(RANK >= Rank.Moderator || LEADER || OPENQUEUE)
addQueueButtons(this);
});
@ -233,27 +233,27 @@ function rebuildPlaylist() {
// Add buttons to a list entry for the library search results
function addLibraryButtons(li, id) {
var btnstrip = $('<div />').attr("class", "btn-group qe_buttons").prependTo(li);
var btnstrip = $("<div />").attr("class", "btn-group qe_buttons").prependTo(li);
var btnNext = $('<button />').attr("class", "btn qe_btn").appendTo(btnstrip);
//$('<i />').attr("class", "icon-play").appendTo(btnNext);
btnNext.text('Next');
var btnNext = $("<button />").attr("class", "btn qe_btn").appendTo(btnstrip);
//$("<i />").attr("class", "icon-play").appendTo(btnNext);
btnNext.text("Next");
var btnEnd = $('<button />').attr("class", "btn qe_btn").appendTo(btnstrip);
//$('<i />').attr("class", "icon-fast-forward").appendTo(btnEnd);
btnEnd.text('End');
var btnEnd = $("<button />").attr("class", "btn qe_btn").appendTo(btnstrip);
//$("<i />").attr("class", "icon-fast-forward").appendTo(btnEnd);
btnEnd.text("End");
// Callback time
$(btnNext).click(function() {
socket.emit('queue', {
socket.emit("queue", {
id: id,
pos: "next"
});
});
$(btnEnd).click(function() {
socket.emit('queue', {
socket.emit("queue", {
id: id,
pos: "end"
});
@ -262,17 +262,17 @@ function addLibraryButtons(li, id) {
// Rearranges the queue
function moveVideo(src, dest) {
var li = $('#queue').children()[src];
var ul = $('#queue')[0];
$(li).hide('blind', function() {
var li = $("#queue").children()[src];
var ul = $("#queue")[0];
$(li).hide("blind", function() {
ul.removeChild(li);
if(dest == ul.children.length) {
ul.appendChild(li);
}
else {
ul.insertBefore(li, ul.getElementsByTagName('li')[dest]);
ul.insertBefore(li, ul.getElementsByTagName("li")[dest]);
}
$(li).show('blind');
$(li).show("blind");
});
if(src < POSITION && dest >= POSITION)
POSITION--;
@ -286,24 +286,24 @@ function updateYT(data) {
removeCurrentPlayer();
MEDIATYPE = "yt";
// Note to Soundcloud/Vimeo API designers:
// YouTube's API is actually nice to use
PLAYER = new YT.Player('ytapiplayer', {
height: '390',
width: '640',
videoId: '',
// YouTube"s API is actually nice to use
PLAYER = new YT.Player("ytapiplayer", {
height: "390",
width: "640",
videoId: "",
playerVars: {
'autoplay': 0,
'controls': 1,
"autoplay": 0,
"controls": 1,
},
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
"onReady": onPlayerReady,
"onStateChange": onPlayerStateChange
}
});
}
// Load new video
if(PLAYER.getVideoUrl && data.id != parseYTURL(PLAYER.getVideoUrl())) {
PLAYER.loadVideoById(data.id, data.currentTime, $('#quality').val());
PLAYER.loadVideoById(data.id, data.currentTime, $("#quality").val());
if(data.paused)
PLAYER.pauseVideo();
}
@ -327,7 +327,7 @@ function updateSC(data) {
iframe.css("width", "100%").attr("height", "166")
.attr("frameborder", "no");
PLAYER = SC.Widget('ytapiplayer');
PLAYER = SC.Widget("ytapiplayer");
MEDIATYPE = "sc";
}
// Server is on a different soundcloud track than client
@ -338,7 +338,7 @@ function updateSC(data) {
// Keep track of current ID
PLAYER.mediaId = data.id;
}
// Soundcloud's API is async
// Soundcloud"s API is async
// Query the playback position and compare that with the sync packet
PLAYER.getPosition(function(pos) {
if(Math.abs(pos / 1000 - data.currentTime) > SYNC_THRESHOLD) {
@ -380,15 +380,15 @@ function updateVI(data) {
if(MEDIATYPE != "vi") {
initVI(data);
}
// Either vimeo's API doesn't support loading a new video
// or their terrible documentation doesn't document it
// Either vimeo"s API doesn"t support loading a new video
// or their terrible documentation doesn"t document it
else if(data.id != PLAYER.videoid) {
initVI(data);
}
PLAYER.api('getCurrentTime', function(time) {
PLAYER.api("getCurrentTime", function(time) {
if(Math.abs(time - data.currentTime) > SYNC_THRESHOLD) {
PLAYER.api('seekTo', data.currentTime);
PLAYER.api("seekTo", data.currentTime);
}
});
}
@ -398,16 +398,16 @@ function initVI(data) {
var currentEmbed = $("#ytapiplayer");
var div = currentEmbed.parent();
currentEmbed.remove();
// Ugly but it's the only way I managed to get the API calls to work
div[0].innerHTML += '<iframe id="ytapiplayer" src="http://player.vimeo.com/video/' + data.id + '?api=1&player_id=ytapiplayer" width="640" height="390" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>';
// $f() is defined by froogaloop, Vimeo's API wrapper
PLAYER = $f($('iframe')[0]);
// Ugly but it"s the only way I managed to get the API calls to work
div[0].innerHTML += "<iframe id=\"ytapiplayer\" src=\"http://player.vimeo.com/video/" + data.id + "?api=1&player_id=ytapiplayer\" width=\"640\" height=\"390\" frameborder=\"0\" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>";
// $f() is defined by froogaloop, Vimeo"s API wrapper
PLAYER = $f($("iframe")[0]);
// So we can retrieve the ID synchronously instead of waiting for
// getVideoId with a callback
PLAYER.videoid = data.id;
PLAYER.addEvent('ready', function() {
PLAYER.addEvent("ready", function() {
// Autoplay
PLAYER.api('play');
PLAYER.api("play");
});
MEDIATYPE = "vi";
}
@ -425,14 +425,14 @@ function loadTwitch(channel) {
id: "live_embed_player_flash",
flashvars:"hostname=www.twitch.tv&channel="+channel+"&auto_play=true&start_volume=100"
};
swfobject.embedSWF( url, "ytapiplayer", '640', '390', "8", null, null, params, {} );
swfobject.embedSWF( url, "ytapiplayer", "640", "390", "8", null, null, params, {} );
}
function loadLivestream(channel) {
MEDIATYPE = "li";
removeCurrentPlayer();
flashvars = { channel: channel };
params = { AllowScriptAccess: 'always' };
params = { AllowScriptAccess: "always" };
swfobject.embedSWF("http://cdn.livestream.com/chromelessPlayer/v20/playerapi.swf", "ytapiplayer", "640", "390", "9.0.0", "expressInstall.swf", flashvars, params);
}
@ -519,13 +519,13 @@ function parseDailymotion(url) {
}
function closePoll() {
if($('#pollcontainer .active').length != 0) {
var poll = $('#pollcontainer .active');
if($("#pollcontainer .active").length != 0) {
var poll = $("#pollcontainer .active");
poll.removeClass("active").addClass("muted");
poll.find('.option button').each(function() {
$(this).attr('disabled', 'disabled');
poll.find(".option button").each(function() {
$(this).attr("disabled", "disabled");
});
poll.find('.btn-danger').each(function() {
poll.find(".btn-danger").each(function() {
$(this).remove()
});
}
@ -533,34 +533,34 @@ function closePoll() {
function addPoll(data) {
closePoll();
var pollMsg = $('<div/>').addClass('poll-notify')
.text(data.initiator + ' opened a poll: "' + data.title + '"')
.appendTo($('#messagebuffer'));
var poll = $('<div/>').addClass('well active').prependTo($('#pollcontainer'));
$('<button/>').addClass('close pull-right').text('×')
var pollMsg = $("<div/>").addClass("poll-notify")
.text(data.initiator + " opened a poll: \"" + data.title + "\"")
.appendTo($("#messagebuffer"));
var poll = $("<div/>").addClass("well active").prependTo($("#pollcontainer"));
$("<button/>").addClass("close pull-right").text("×")
.appendTo(poll)
.click(function() { poll.remove(); });
if(RANK >= Rank.Moderator) {
$('<button/>').addClass('btn btn-danger pull-right').text('Close Poll')
$("<button/>").addClass("btn btn-danger pull-right").text("Close Poll")
.appendTo(poll)
.click(function() {
socket.emit('closePoll')
socket.emit("closePoll")
});
}
$('<h3/>').text(data.title).appendTo(poll);
$("<h3/>").text(data.title).appendTo(poll);
for(var i = 0; i < data.options.length; i++) {
var callback = (function(i) { return function() {
console.log(i);
socket.emit('vote', {
socket.emit("vote", {
option: i
});
poll.find('.option button').each(function() {
$(this).attr('disabled', 'disabled');
poll.find(".option button").each(function() {
$(this).attr("disabled", "disabled");
});
} })(i);
$('<button/>').addClass('btn').text(data.counts[i])
.prependTo($('<div/>').addClass('option').text(data.options[i])
$("<button/>").addClass("btn").text(data.counts[i])
.prependTo($("<div/>").addClass("option").text(data.options[i])
.appendTo(poll))
.click(callback);
@ -568,54 +568,54 @@ function addPoll(data) {
}
function updatePoll(data) {
var poll = $('#pollcontainer .active');
var poll = $("#pollcontainer .active");
var i = 0;
poll.find('.option button').each(function() {
poll.find(".option button").each(function() {
$(this).text(data.counts[i]);
i++;
});
}
function showChannelRegistration() {
var div = $('<div/>').addClass('alert alert-info').attr('id', 'chregnotice')
.insertAfter($('.row')[0]);
$('<button/>').addClass('close pull-right').text('×')
var div = $("<div/>").addClass("alert alert-info").attr("id", "chregnotice")
.insertAfter($(".row")[0]);
$("<button/>").addClass("close pull-right").text("×")
.appendTo(div)
.click(function() { div.remove(); });
$('<h3/>').text("This channel isn't registered").appendTo(div);
$('<button/>').addClass('btn btn-primary').text('Register it')
$("<h3/>").text("This channel isn"t registered").appendTo(div);
$("<button/>").addClass("btn btn-primary").text("Register it")
.appendTo(div)
.click(function() {
socket.emit('registerChannel');
socket.emit("registerChannel");
});
}
function showAnnouncement(title, text) {
var div = $('<div/>').addClass('alert')
.insertAfter($('.row')[0]);
$('<button/>').addClass('close pull-right').text('×')
var div = $("<div/>").addClass("alert")
.insertAfter($(".row")[0]);
$("<button/>").addClass("close pull-right").text("×")
.appendTo(div)
.click(function() { div.remove(); });
$('<h3/>').text(title).appendTo(div);
$('<p/>').html(text).appendTo(div);
$("<h3/>").text(title).appendTo(div);
$("<p/>").html(text).appendTo(div);
}
function updateBanlist(entries) {
var tbl = $('#banlist table');
var tbl = $("#banlist table");
if(tbl.children().length > 1) {
$(tbl.children()[1]).remove();
}
for(var i = 0; i < entries.length; i++) {
var tr = $('<tr/>').appendTo(tbl);
var remove = $('<button/>').addClass("btn btn-mini btn-danger")
.appendTo($('<td/>').appendTo(tr));
$('<i/>').addClass("icon-remove-circle").appendTo(remove);
var ip = $('<td/>').text(entries[i].ip).appendTo(tr);
var name = $('<td/>').text(entries[i].name).appendTo(tr);
var banner = $('<td/>').text(entries[i].banner).appendTo(tr);
var tr = $("<tr/>").appendTo(tbl);
var remove = $("<button/>").addClass("btn btn-mini btn-danger")
.appendTo($("<td/>").appendTo(tr));
$("<i/>").addClass("icon-remove-circle").appendTo(remove);
var ip = $("<td/>").text(entries[i].ip).appendTo(tr);
var name = $("<td/>").text(entries[i].name).appendTo(tr);
var banner = $("<td/>").text(entries[i].banner).appendTo(tr);
var callback = (function(ip) { return function() {
socket.emit('chatMsg', {
socket.emit("chatMsg", {
msg: "/unban " + ip
});
} })(entries[i].ip);