Advertisement
cuminmymeowth

Untitled

Jan 16th, 2016
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Callbacks = {
  2.  
  3.     error: function (reason) {
  4.         window.SOCKET_ERROR_REASON = reason;
  5.     },
  6.  
  7.     /* fired when socket connection completes */
  8.     connect: function() {
  9.         socket.emit("initChannelCallbacks");
  10.         socket.emit("joinChannel", {
  11.             name: CHANNEL.name
  12.         });
  13.  
  14.         if (CHANNEL.opts.password) {
  15.             socket.emit("channelPassword", CHANNEL.opts.password);
  16.         }
  17.  
  18.         if (CLIENT.name && CLIENT.guest) {
  19.             socket.emit("login", {
  20.                 name: CLIENT.name
  21.             });
  22.         }
  23.  
  24.         $("<div/>").addClass("server-msg-reconnect")
  25.             .text("Connected")
  26.             .appendTo($("#messagebuffer"));
  27.         scrollChat();
  28.     },
  29.  
  30.     disconnect: function() {
  31.         if(KICKED)
  32.             return;
  33.         $("<div/>")
  34.             .addClass("server-msg-disconnect")
  35.             .text("Disconnected from server.  Attempting reconnection...")
  36.             .appendTo($("#messagebuffer"));
  37.         scrollChat();
  38.     },
  39.  
  40.     errorMsg: function(data) {
  41.         if (data.alert) {
  42.             alert(data.msg);
  43.         } else {
  44.             errDialog(data.msg);
  45.         }
  46.     },
  47.  
  48.     costanza: function (data) {
  49.         hidePlayer();
  50.         $("#costanza-modal").modal("hide");
  51.         var modal = makeModal();
  52.         modal.attr("id", "costanza-modal")
  53.             .appendTo($("body"));
  54.  
  55.         var body = $("<div/>").addClass("modal-body")
  56.             .appendTo(modal.find(".modal-content"));
  57.         $("<img/>").attr("src", "http://i0.kym-cdn.com/entries/icons/original/000/005/498/1300044776986.jpg")
  58.             .appendTo(body);
  59.  
  60.         $("<strong/>").text(data.msg).appendTo(body);
  61.         hidePlayer();
  62.         modal.modal();
  63.     },
  64.  
  65.     announcement: function(data) {
  66.         $("#announcements").html("");
  67.         makeAlert(data.title, data.text)
  68.             .appendTo($("#announcements"));
  69.     },
  70.  
  71.     kick: function(data) {
  72.         KICKED = true;
  73.         $("<div/>").addClass("server-msg-disconnect")
  74.             .text("Kicked: " + data.reason)
  75.             .appendTo($("#messagebuffer"));
  76.         scrollChat();
  77.     },
  78.  
  79.     noflood: function(data) {
  80.         $("<div/>")
  81.             .addClass("server-msg-disconnect")
  82.             .text(data.action + ": " + data.msg)
  83.             .appendTo($("#messagebuffer"));
  84.         scrollChat();
  85.     },
  86.  
  87.     needPassword: function (wrongpw) {
  88.         var div = $("<div/>");
  89.         $("<strong/>").text("Channel Password")
  90.             .appendTo(div);
  91.         if (wrongpw) {
  92.             $("<br/>").appendTo(div);
  93.             $("<span/>").addClass("text-error")
  94.                 .text("Wrong Password")
  95.                 .appendTo(div);
  96.         }
  97.  
  98.         var pwbox = $("<input/>").addClass("form-control")
  99.             .attr("type", "password")
  100.             .appendTo(div);
  101.         var submit = $("<button/>").addClass("btn btn-xs btn-default btn-block")
  102.             .css("margin-top", "5px")
  103.             .text("Submit")
  104.             .appendTo(div);
  105.         var parent = chatDialog(div);
  106.         parent.attr("id", "needpw");
  107.         var sendpw = function () {
  108.             socket.emit("channelPassword", pwbox.val());
  109.             parent.remove();
  110.         };
  111.         submit.click(sendpw);
  112.         pwbox.keydown(function (ev) {
  113.             if (ev.keyCode == 13) {
  114.                 sendpw();
  115.             }
  116.         });
  117.         pwbox.focus();
  118.     },
  119.  
  120.     cancelNeedPassword: function () {
  121.         $("#needpw").remove();
  122.     },
  123.  
  124.     cooldown: function (time) {
  125.         time = time + 200;
  126.         $("#chatline").css("color", "#ff0000");
  127.         if (CHATTHROTTLE && $("#chatline").data("throttle_timer")) {
  128.             clearTimeout($("#chatline").data("throttle_timer"));
  129.         }
  130.         CHATTHROTTLE = true;
  131.         $("#chatline").data("throttle_timer", setTimeout(function () {
  132.             CHATTHROTTLE = false;
  133.             $("#chatline").css("color", "");
  134.         }, time));
  135.     },
  136.  
  137.     channelNotRegistered: function() {
  138.         var div = $("<div/>").addClass("alert alert-info")
  139.             .appendTo($("<div/>").addClass("col-md-12").appendTo($("#announcements")));
  140.  
  141.         $("<button/>").addClass("close pull-right")
  142.             .appendTo(div)
  143.             .click(function () {
  144.                 div.parent().remove();
  145.             })
  146.             .html("&times;");
  147.         $("<h4/>").appendTo(div).text("Unregistered channel");
  148.         $("<p/>").appendTo(div)
  149.             .html("This channel is not registered to a CyTube account.  You can still " +
  150.                   "use it, but some features will not be available.  To register a " +
  151.                   "channel to your account, visit your <a href='/account/channels'>" +
  152.                   "channels</a> page.");
  153.     },
  154.  
  155.     registerChannel: function(data) {
  156.         if ($("#chanregisterbtn").length > 0) {
  157.             $("#chanregisterbtn").text("Register it")
  158.                 .attr("disabled", false);
  159.         }
  160.         if(data.success) {
  161.             $("#chregnotice").remove();
  162.         }
  163.         else {
  164.             makeAlert("Error", data.error, "alert-danger")
  165.                 .insertAfter($("#chregnotice"));
  166.         }
  167.     },
  168.  
  169.     unregisterChannel: function(data) {
  170.         if(data.success) {
  171.             alert("Channel unregistered");
  172.         }
  173.         else {
  174.             alert(data.error);
  175.         }
  176.     },
  177.  
  178.     setMotd: function(data) {
  179.         CHANNEL.motd = data.html;
  180.         CHANNEL.motd_text = data.motd;
  181.         $("#motd").html(CHANNEL.motd);
  182.         $("#cs-motdtext").val(CHANNEL.motd_text);
  183.         if (data.motd != "") {
  184.             $("#motdwrap").show();
  185.             $("#motd").show();
  186.             $("#togglemotd").find(".glyphicon-plus")
  187.                 .removeClass("glyphicon-plus")
  188.                 .addClass("glyphicon-minus");
  189.         } else {
  190.             $("#motdwrap").hide();
  191.         }
  192.     },
  193.  
  194.     chatFilters: function(entries) {
  195.         var tbl = $("#cs-chatfilters table");
  196.         tbl.data("entries", entries);
  197.         formatCSChatFilterList();
  198.     },
  199.  
  200.     updateChatFilter: function (f) {
  201.         var entries = $("#cs-chatfilters table").data("entries") || [];
  202.         var found = false;
  203.         for (var i = 0; i < entries.length; i++) {
  204.             if (entries[i].name === f.name) {
  205.                 entries[i] = f;
  206.                 found = true;
  207.                 break;
  208.             }
  209.         }
  210.  
  211.         if (!found) {
  212.             entries.push(f);
  213.         }
  214.  
  215.         $("#cs-chatfilters table").data("entries", entries);
  216.         formatCSChatFilterList();
  217.     },
  218.  
  219.     deleteChatFilter: function (f) {
  220.         var entries = $("#cs-chatfilters table").data("entries") || [];
  221.         var found = false;
  222.         for (var i = 0; i < entries.length; i++) {
  223.             if (entries[i].name === f.name) {
  224.                 entries[i] = f;
  225.                 found = i;
  226.                 break;
  227.             }
  228.         }
  229.  
  230.         if (found !== false) {
  231.             entries.splice(found, 1);
  232.         }
  233.  
  234.         $("#cs-chatfilters table").data("entries", entries);
  235.         formatCSChatFilterList();
  236.     },
  237.  
  238.     channelOpts: function(opts) {
  239.         document.title = opts.pagetitle;
  240.         PAGETITLE = opts.pagetitle;
  241.  
  242.         if (!USEROPTS.ignore_channelcss &&
  243.             opts.externalcss !== CHANNEL.opts.externalcss) {
  244.             $("#chanexternalcss").remove();
  245.  
  246.             if (opts.externalcss.trim() !== "") {
  247.                 $("#chanexternalcss").remove();
  248.                 $("<link/>")
  249.                     .attr("rel", "stylesheet")
  250.                     .attr("href", opts.externalcss)
  251.                     .attr("id", "chanexternalcss")
  252.                     .appendTo($("head"));
  253.             }
  254.         }
  255.  
  256.         if(opts.externaljs.trim() != "" && !USEROPTS.ignore_channeljs &&
  257.            opts.externaljs !== CHANNEL.opts.externaljs) {
  258.             checkScriptAccess(opts.externaljs, "external", function (pref) {
  259.                 if (pref === "ALLOW") {
  260.                     $.getScript(opts.externaljs);
  261.                 }
  262.             });
  263.         }
  264.  
  265.         CHANNEL.opts = opts;
  266.  
  267.         if(opts.allow_voteskip)
  268.             $("#voteskip").attr("disabled", false);
  269.         else
  270.             $("#voteskip").attr("disabled", true);
  271.         handlePermissionChange();
  272.     },
  273.  
  274.     setPermissions: function(perms) {
  275.         CHANNEL.perms = perms;
  276.         genPermissionsEditor();
  277.         handlePermissionChange();
  278.     },
  279.  
  280.     channelCSSJS: function(data) {
  281.         $("#chancss").remove();
  282.         CHANNEL.css = data.css;
  283.         $("#csstext").val(data.css);
  284.         if(data.css && !USEROPTS.ignore_channelcss) {
  285.             $("<style/>").attr("type", "text/css")
  286.                 .attr("id", "chancss")
  287.                 .text(data.css)
  288.                 .appendTo($("head"));
  289.         }
  290.  
  291.         $("#chanjs").remove();
  292.         CHANNEL.js = data.js;
  293.         $("#jstext").val(data.js);
  294.  
  295.         if(data.js && !USEROPTS.ignore_channeljs) {
  296.             var src = data.js
  297.                 .replace(/&/g, "&amp;")
  298.                 .replace(/</g, "&lt;")
  299.                 .replace(/>/g, "&gt;")
  300.                 .replace(/\n/g, "<br>")
  301.                 .replace(/\t/g, "    ")
  302.                 .replace(/ /g, "&nbsp;");
  303.             src = encodeURIComponent(src);
  304.  
  305.             var viewsource = "data:text/html, <body style='font: 9pt monospace;" +
  306.                              "max-width:60rem;margin:0 auto;padding:4rem;'>" +
  307.                              src + "</body>";
  308.             checkScriptAccess(viewsource, "embedded", function (pref) {
  309.                 if (pref === "ALLOW") {
  310.                     $("<script/>").attr("type", "text/javascript")
  311.                         .attr("id", "chanjs")
  312.                         .text(data.js)
  313.                         .appendTo($("body"));
  314.                 }
  315.             });
  316.         }
  317.     },
  318.  
  319.     banlist: function(entries) {
  320.         var tbl = $("#cs-banlist table");
  321.         tbl.data("entries", entries);
  322.         formatCSBanlist();
  323.     },
  324.  
  325.     banlistRemove: function (data) {
  326.         var entries = $("#cs-banlist table").data("entries") || [];
  327.         var found = false;
  328.         for (var i = 0; i < entries.length; i++) {
  329.             if (entries[i].id === data.id) {
  330.                 found = i;
  331.                 break;
  332.             }
  333.         }
  334.  
  335.         if (found !== false) {
  336.             entries.splice(i, 1);
  337.             $("#cs-banlist table").data("entries", entries);
  338.         }
  339.  
  340.         formatCSBanlist();
  341.     },
  342.  
  343.     recentLogins: function(entries) {
  344.         var tbl = $("#loginhistory table");
  345.         // I originally added this check because of a race condition
  346.         // Now it seems to work without but I don't trust it
  347.         if(!tbl.hasClass("table")) {
  348.             setTimeout(function() {
  349.                 Callbacks.recentLogins(entries);
  350.             }, 100);
  351.             return;
  352.         }
  353.         if(tbl.children().length > 1) {
  354.             $(tbl.children()[1]).remove();
  355.         }
  356.         for(var i = 0; i < entries.length; i++) {
  357.             var tr = document.createElement("tr");
  358.             var name = $("<td/>").text(entries[i].name).appendTo(tr);
  359.             var aliases = $("<td/>").text(entries[i].aliases.join(", ")).appendTo(tr);
  360.             var time = new Date(entries[i].time).toTimeString();
  361.             $("<td/>").text(time).appendTo(tr);
  362.  
  363.             $(tr).appendTo(tbl);
  364.         }
  365.     },
  366.  
  367.     channelRanks: function(entries) {
  368.         var tbl = $("#cs-chanranks table");
  369.         tbl.data("entries", entries);
  370.         formatCSModList();
  371.     },
  372.  
  373.     channelRankFail: function (data) {
  374.         if ($("#cs-chanranks").is(":visible")) {
  375.             makeAlert("Error", data.msg, "alert-danger")
  376.                 .removeClass().addClass("vertical-spacer")
  377.                 .insertAfter($("#cs-chanranks form"));
  378.         } else {
  379.             Callbacks.noflood({ action: "/rank", msg: data.msg });
  380.         }
  381.     },
  382.  
  383.     readChanLog: function (data) {
  384.         var log = $("#cs-chanlog-text");
  385.         if (log.length == 0)
  386.             return;
  387.  
  388.         if (data.success) {
  389.             setupChanlogFilter(data.data);
  390.             filterChannelLog();
  391.         } else {
  392.             $("#cs-chanlog-text").text("Error reading channel log");
  393.         }
  394.     },
  395.  
  396.     voteskip: function(data) {
  397.         var icon = $("#voteskip").find(".glyphicon").remove();
  398.         if(data.count > 0) {
  399.             $("#voteskip").text(" ("+data.count+"/"+data.need+")");
  400.         } else {
  401.             $("#voteskip").text("");
  402.         }
  403.  
  404.         icon.prependTo($("#voteskip"));
  405.     },
  406.  
  407.     /* REGION Rank Stuff */
  408.  
  409.     rank: function(r) {
  410.         if(r >= 255)
  411.             SUPERADMIN = true;
  412.         CLIENT.rank = r;
  413.         handlePermissionChange();
  414.         if(SUPERADMIN && $("#setrank").length == 0) {
  415.             $("<a/>").attr("href", "/acp")
  416.                 .attr("target", "_blank")
  417.                 .text("ACP")
  418.                 .appendTo($("<li/>").appendTo($(".nav")[0]));
  419.             var li = $("<li/>").addClass("dropdown")
  420.                 .attr("id", "setrank")
  421.                 .appendTo($(".nav")[0]);
  422.             $("<a/>").addClass("dropdown-toggle")
  423.                 .attr("data-toggle", "dropdown")
  424.                 .attr("href", "javascript:void(0)")
  425.                 .html("Set Rank <b class='caret'></b>")
  426.                 .appendTo(li);
  427.             var menu = $("<ul/>").addClass("dropdown-menu")
  428.                 .appendTo(li);
  429.  
  430.             function addRank(r, disp) {
  431.                 var li = $("<li/>").appendTo(menu);
  432.                 $("<a/>").attr("href", "javascript:void(0)")
  433.                     .html(disp)
  434.                     .click(function() {
  435.                         socket.emit("borrow-rank", r);
  436.                     })
  437.                     .appendTo(li);
  438.             }
  439.  
  440.             addRank(0, "<span class='userlist_guest'>Guest</span>");
  441.             addRank(1, "<span>Registered</span>");
  442.             addRank(2, "<span class='userlist_op'>Moderator</span>");
  443.             addRank(3, "<span class='userlist_owner'>Admin</span>");
  444.             addRank(255, "<span class='userlist_siteadmin'>Superadmin</span>");
  445.         }
  446.     },
  447.  
  448.     login: function(data) {
  449.         if (!data.success) {
  450.             if (data.error != "Session expired") {
  451.                 errDialog(data.error);
  452.             }
  453.         } else {
  454.             CLIENT.name = data.name;
  455.             CLIENT.guest = data.guest;
  456.             CLIENT.logged_in = true;
  457.  
  458.             if (!CLIENT.guest) {
  459.                 socket.emit("initUserPLCallbacks");
  460.                 if ($("#loginform").length === 0) {
  461.                     return;
  462.                 }
  463.                 var logoutform = $("<p/>").attr("id", "logoutform")
  464.                     .addClass("navbar-text pull-right")
  465.                     .insertAfter($("#loginform"));
  466.  
  467.                 $("<span/>").attr("id", "welcome").text("Welcome, " + CLIENT.name)
  468.                     .appendTo(logoutform);
  469.                 $("<span/>").html("&nbsp;&middot;&nbsp;").appendTo(logoutform);
  470.                 var domain = $("#loginform").attr("action").replace("/login", "");
  471.                 $("<a/>").attr("id", "logout")
  472.                     .attr("href", domain + "/logout?redirect=/r/" + CHANNEL.name)
  473.                     .text("Logout")
  474.                     .appendTo(logoutform);
  475.  
  476.                 $("#loginform").remove();
  477.             }
  478.         }
  479.     },
  480.  
  481.     /* REGION Chat */
  482.     usercount: function(count) {
  483.         CHANNEL.usercount = count;
  484.         var text = count + " connected user";
  485.         if(count != 1) {
  486.             text += "s";
  487.         }
  488.         $("#usercount").text(text);
  489.     },
  490.  
  491.     chatMsg: function(data) {
  492.         addChatMessage(data);
  493.     },
  494.  
  495.     pm: function (data) {
  496.         var name = data.username;
  497.         if (IGNORED.indexOf(name) !== -1) {
  498.             return;
  499.         }
  500.  
  501.         if (data.username === CLIENT.name) {
  502.             name = data.to;
  503.         } else {
  504.             pingMessage(true);
  505.         }
  506.         var pm = initPm(name);
  507.         var msg = formatChatMessage(data, pm.data("last"));
  508.         var buffer = pm.find(".pm-buffer");
  509.         msg.appendTo(buffer);
  510.         buffer.scrollTop(buffer.prop("scrollHeight"));
  511.         if (pm.find(".panel-body").is(":hidden")) {
  512.             pm.removeClass("panel-default").addClass("panel-primary");
  513.         }
  514.     },
  515.  
  516.     joinMessage: function(data) {
  517.         if(USEROPTS.joinmessage)
  518.             addChatMessage(data);
  519.     },
  520.  
  521.     clearchat: function() {
  522.         $("#messagebuffer").html("");
  523.     },
  524.  
  525.     userlist: function(data) {
  526.         $(".userlist_item").remove();
  527.         for(var i = 0; i < data.length; i++) {
  528.             Callbacks.addUser(data[i]);
  529.         }
  530.     },
  531.  
  532.     addUser: function(data) {
  533.         var user = findUserlistItem(data.name);
  534.         // Remove previous instance of user, if there was one
  535.         if(user !== null)
  536.             user.remove();
  537.         var div = $("<div/>")
  538.             .addClass("userlist_item");
  539.         var icon = $("<span/>").appendTo(div);
  540.         var nametag = $("<span/>").text(data.name).appendTo(div);
  541.         div.data("name", data.name);
  542.         div.data("rank", data.rank);
  543.         div.data("leader", Boolean(data.leader));
  544.         div.data("profile", data.profile);
  545.         div.data("meta", data.meta);
  546.         div.data("afk", data.meta.afk);
  547.         if (data.meta.muted || data.meta.smuted) {
  548.             div.data("icon", "glyphicon-volume-off");
  549.         } else {
  550.             div.data("icon", false);
  551.         }
  552.         formatUserlistItem(div, data);
  553.         addUserDropdown(div, data);
  554.         div.appendTo($("#userlist"));
  555.         sortUserlist();
  556.     },
  557.  
  558.     setUserMeta: function (data) {
  559.         var user = findUserlistItem(data.name);
  560.         if (user == null) {
  561.             return;
  562.         }
  563.  
  564.         user.data("meta", data.meta);
  565.         if (data.meta.muted || data.meta.smuted) {
  566.             user.data("icon", "glyphicon-volume-off");
  567.         } else {
  568.             user.data("icon", false);
  569.         }
  570.  
  571.         formatUserlistItem(user, data);
  572.         addUserDropdown(user, data);
  573.         sortUserlist();
  574.     },
  575.  
  576.     setUserProfile: function (data) {
  577.         var user = findUserlistItem(data.name);
  578.         if (user === null)
  579.             return;
  580.         user.data("profile", data.profile);
  581.         formatUserlistItem(user);
  582.     },
  583.  
  584.     setLeader: function (name) {
  585.         $(".userlist_item").each(function () {
  586.             $(this).find(".glyphicon-star-empty").remove();
  587.             if ($(this).data("leader")) {
  588.                 $(this).data("leader", false);
  589.                 addUserDropdown($(this));
  590.             }
  591.         });
  592.         if (name === "") {
  593.             CLIENT.leader = false;
  594.             if(LEADTMR)
  595.                 clearInterval(LEADTMR);
  596.             LEADTMR = false;
  597.             return;
  598.         }
  599.         var user = findUserlistItem(name);
  600.         if (user) {
  601.             user.data("leader", true);
  602.             formatUserlistItem(user);
  603.             addUserDropdown(user);
  604.         }
  605.         if (name === CLIENT.name) {
  606.             CLIENT.leader = true;
  607.             // I'm a leader!  Set up sync function
  608.             if(LEADTMR)
  609.                 clearInterval(LEADTMR);
  610.             LEADTMR = setInterval(sendVideoUpdate, 5000);
  611.             handlePermissionChange();
  612.         } else if (CLIENT.leader) {
  613.             CLIENT.leader = false;
  614.             handlePermissionChange();
  615.             if(LEADTMR)
  616.                 clearInterval(LEADTMR);
  617.             LEADTMR = false;
  618.         }
  619.     },
  620.  
  621.     setUserRank: function (data) {
  622.         data.name = data.name.toLowerCase();
  623.         var entries = $("#cs-chanranks table").data("entries") || [];
  624.         var found = false;
  625.         for (var i = 0; i < entries.length; i++) {
  626.             if (entries[i].name.toLowerCase() === data.name) {
  627.                 entries[i].rank = data.rank;
  628.                 found = i;
  629.                 break;
  630.             }
  631.         }
  632.         if (found === false) {
  633.             entries.push(data);
  634.         } else if (entries[found].rank < 2) {
  635.             entries.splice(found, 1);
  636.         }
  637.         formatCSModList();
  638.  
  639.         var user = findUserlistItem(data.name);
  640.         if (user === null) {
  641.             return;
  642.         }
  643.  
  644.         user.data("rank", data.rank);
  645.         if (data.name === CLIENT.name) {
  646.             CLIENT.rank = data.rank;
  647.             handlePermissionChange();
  648.         }
  649.         formatUserlistItem(user);
  650.         addUserDropdown(user);
  651.         if (USEROPTS.sort_rank) {
  652.             sortUserlist();
  653.         }
  654.     },
  655.  
  656.     setUserIcon: function (data) {
  657.         var user = findUserlistItem(data.name);
  658.         if (user === null) {
  659.             return;
  660.         }
  661.  
  662.         user.data("icon", data.icon);
  663.         formatUserlistItem(user);
  664.     },
  665.  
  666.     setAFK: function (data) {
  667.         var user = findUserlistItem(data.name);
  668.         if(user === null)
  669.             return;
  670.         user.data("afk", data.afk);
  671.         formatUserlistItem(user);
  672.         if(USEROPTS.sort_afk)
  673.             sortUserlist();
  674.     },
  675.  
  676.     userLeave: function(data) {
  677.         var user = findUserlistItem(data.name);
  678.         if(user !== null)
  679.             user.remove();
  680.     },
  681.  
  682.     drinkCount: function(count) {
  683.         if(count != 0) {
  684.             var text = count + " drink";
  685.             if(count != 1) {
  686.                 text += "s";
  687.             }
  688.             $("#drinkcount").text(text);
  689.             $("#drinkbar").show();
  690.         }
  691.         else {
  692.             $("#drinkbar").hide();
  693.         }
  694.     },
  695.  
  696.     /* REGION Playlist Stuff */
  697.     playlist: function(data) {
  698.         PL_QUEUED_ACTIONS = [];
  699.         // Clear the playlist first
  700.         var q = $("#queue");
  701.         q.html("");
  702.  
  703.         for(var i = 0; i < data.length; i++) {
  704.             var li = makeQueueEntry(data[i], false);
  705.             li.attr("title", data[i].queueby
  706.                                 ? (" via " + data[i].queueby)
  707.                                 : " via Unknown");
  708.             li.appendTo(q);
  709.         }
  710.  
  711.         rebuildPlaylist();
  712.     },
  713.  
  714.     setPlaylistMeta: function(data) {
  715.         var c = data.count + " item";
  716.         if(data.count != 1)
  717.             c += "s";
  718.         $("#plcount").text(c);
  719.         $("#pllength").text(data.time);
  720.     },
  721.  
  722.     queue: function(data) {
  723.         PL_ACTION_QUEUE.queue(function (plq) {
  724.             var li = makeQueueEntry(data.item, true);
  725.             if (data.item.uid === PL_CURRENT)
  726.                 li.addClass("queue_active");
  727.             li.hide();
  728.             var q = $("#queue");
  729.             li.attr("title", data.item.queueby
  730.                                 ? (" via " + data.item.queueby)
  731.                                 : " via Unknown");
  732.             if (data.after === "prepend") {
  733.                 li.prependTo(q);
  734.                 li.show("fade", function () {
  735.                     plq.release();
  736.                 });
  737.             } else if (data.after === "append") {
  738.                 li.appendTo(q);
  739.                 li.show("fade", function () {
  740.                     plq.release();
  741.                 });
  742.             } else {
  743.                 var liafter = playlistFind(data.after);
  744.                 if (!liafter) {
  745.                     plq.release();
  746.                     return;
  747.                 }
  748.                 li.insertAfter(liafter);
  749.                 li.show("fade", function () {
  750.                     plq.release();
  751.                 });
  752.             }
  753.         });
  754.     },
  755.  
  756.     queueWarn: function (data) {
  757.         queueMessage(data, "alert-warning");
  758.     },
  759.  
  760.     queueFail: function (data) {
  761.         queueMessage(data, "alert-danger");
  762.     },
  763.  
  764.     setTemp: function(data) {
  765.         var li = $(".pluid-" + data.uid);
  766.         if(li.length == 0)
  767.             return false;
  768.  
  769.         if(data.temp)
  770.             li.addClass("queue_temp");
  771.         else
  772.             li.removeClass("queue_temp");
  773.  
  774.         li.data("temp", data.temp);
  775.         var btn = li.find(".qbtn-tmp");
  776.         if(btn.length > 0) {
  777.             if(data.temp) {
  778.                 btn.html(btn.html().replace("Make Temporary",
  779.                                             "Make Permanent"));
  780.             }
  781.             else {
  782.                 btn.html(btn.html().replace("Make Permanent",
  783.                                             "Make Temporary"));
  784.             }
  785.         }
  786.     },
  787.  
  788.     "delete": function(data) {
  789.         PL_ACTION_QUEUE.queue(function (plq) {
  790.             PL_WAIT_SCROLL = true;
  791.             var li = $(".pluid-" + data.uid);
  792.             li.hide("fade", function() {
  793.                 li.remove();
  794.                 plq.release();
  795.                 PL_WAIT_SCROLL = false;
  796.             });
  797.         });
  798.     },
  799.  
  800.     moveVideo: function(data) {
  801.         PL_ACTION_QUEUE.queue(function (plq) {
  802.             playlistMove(data.from, data.after, function () {
  803.                 plq.release();
  804.             });
  805.         });
  806.     },
  807.  
  808.     setCurrent: function(uid) {
  809.         PL_CURRENT = uid;
  810.         $("#queue li").removeClass("queue_active");
  811.         var li = $(".pluid-" + uid);
  812.         if (li.length !== 0) {
  813.             li.addClass("queue_active");
  814.             var tmr = setInterval(function () {
  815.                 if (!PL_WAIT_SCROLL) {
  816.                     scrollQueue();
  817.                     clearInterval(tmr);
  818.                 }
  819.             }, 100);
  820.         }
  821.     },
  822.  
  823.     changeMedia: function(data) {
  824.         if ($("body").hasClass("chatOnly") || $("#videowrap").length === 0) {
  825.             return;
  826.         }
  827.  
  828.         /* Failsafe */
  829.         if (isNaN(VOLUME) || VOLUME > 1 || VOLUME < 0) {
  830.             VOLUME = 1;
  831.         }
  832.  
  833.         var shouldResize = $("#ytapiplayer").html() === "";
  834.  
  835.         if (PLAYER && typeof PLAYER.getVolume === "function") {
  836.             PLAYER.getVolume(function (v) {
  837.                 if (typeof v === "number") {
  838.                     if (v < 0 || v > 1) {
  839.                         alert("Something went wrong with retrieving the volume.  " +
  840.                             "Please tell calzoneman the following: " +
  841.                             JSON.stringify({ v: v, t: PLAYER.type, i: PLAYER.videoId }));
  842.                     } else {
  843.                         VOLUME = v;
  844.                         setOpt("volume", VOLUME);
  845.                     }
  846.                 }
  847.             });
  848.         }
  849.  
  850.         if (CHANNEL.opts.allow_voteskip)
  851.             $("#voteskip").attr("disabled", false);
  852.  
  853.         $("#currenttitle").text(" " + data.title);
  854.  
  855.         if (data.type != "sc" && PLAYER.type == "sc")
  856.             // [](/goddamnitmango)
  857.             fixSoundcloudShit();
  858.  
  859.         if (data.type != "jw" && PLAYER.type == "jw") {
  860.             // Is it so hard to not mess up my DOM?
  861.             $("<div/>").attr("id", "ytapiplayer")
  862.                 .insertBefore($("#ytapiplayer_wrapper"));
  863.             $("#ytapiplayer_wrapper").remove();
  864.         }
  865.  
  866.         if (data.type === "fi") {
  867.             data.url = data.id;
  868.         }
  869.  
  870.         if (NO_VIMEO && data.type === "vi" && data.meta.direct) {
  871.             data = vimeoSimulator2014(data);
  872.         }
  873.  
  874.         /*
  875.          * Google Docs now uses the same simulator as Google+
  876.          */
  877.         if (data.type === "gp" || data.type === "gd") {
  878.             data = googlePlusSimulator2014(data);
  879.         }
  880.  
  881.         if (data.type != PLAYER.type) {
  882.             loadMediaPlayer(data);
  883.         }
  884.  
  885.         handleMediaUpdate(data);
  886.     },
  887.  
  888.     mediaUpdate: function(data) {
  889.         if ($("body").hasClass("chatOnly") || $("#videowrap").length === 0) {
  890.             return;
  891.         }
  892.  
  893.         handleMediaUpdate(data);
  894.     },
  895.  
  896.     setPlaylistLocked: function (locked) {
  897.         CHANNEL.openqueue = !locked;
  898.         handlePermissionChange();
  899.         if(CHANNEL.openqueue) {
  900.             $("#qlockbtn").removeClass("btn-danger")
  901.                 .addClass("btn-success")
  902.                 .attr("title", "Playlist Unlocked");
  903.             $("#qlockbtn").find("span")
  904.                 .removeClass("glyphicon-lock")
  905.                 .addClass("glyphicon-ok");
  906.         }
  907.         else {
  908.             $("#qlockbtn").removeClass("btn-success")
  909.                 .addClass("btn-danger")
  910.                 .attr("title", "Playlist Locked");
  911.             $("#qlockbtn").find("span")
  912.                 .removeClass("glyphicon-ok")
  913.                 .addClass("glyphicon-lock");
  914.         }
  915.     },
  916.  
  917.     searchResults: function(data) {
  918.         $("#search_clear").remove();
  919.         clearSearchResults();
  920.         $("#library").data("entries", data.results);
  921.         $("<button/>").addClass("btn btn-default btn-sm btn-block")
  922.             .css("margin-left", "0")
  923.             .attr("id", "search_clear")
  924.             .text("Clear Results")
  925.             .click(function() {
  926.                 clearSearchResults();
  927.             })
  928.             .insertBefore($("#library"));
  929.  
  930.  
  931.         $("#search_pagination").remove();
  932.         var opts = {
  933.             preLoadPage: function () {
  934.                 $("#library").html("");
  935.             },
  936.  
  937.             generator: function (item, page, index) {
  938.                 var li = makeSearchEntry(item, false);
  939.                 if(hasPermission("playlistadd")) {
  940.                     addLibraryButtons(li, item.id, data.source);
  941.                 }
  942.                 $(li).appendTo($("#library"));
  943.             },
  944.  
  945.             itemsPerPage: 100
  946.         };
  947.  
  948.         var p = Paginate(data.results, opts);
  949.         p.paginator.insertAfter($("#library"))
  950.             .addClass("pull-right")
  951.             .attr("id", "search_pagination");
  952.         $("#library").data("paginator", p);
  953.     },
  954.  
  955.     /* REGION Polls */
  956.     newPoll: function(data) {
  957.         Callbacks.closePoll();
  958.         var pollMsg = $("<div/>").addClass("poll-notify")
  959.             .html(data.initiator + " opened a poll: \"" + data.title + "\"")
  960.             .appendTo($("#messagebuffer"));
  961.         scrollChat();
  962.  
  963.         var poll = $("<div/>").addClass("well active").prependTo($("#pollwrap"));
  964.         $("<button/>").addClass("close pull-right").html("&times;")
  965.             .appendTo(poll)
  966.             .click(function() { poll.remove(); });
  967.         if(hasPermission("pollctl")) {
  968.             $("<button/>").addClass("btn btn-danger btn-sm pull-right").text("End Poll")
  969.                 .appendTo(poll)
  970.                 .click(function() {
  971.                     socket.emit("closePoll")
  972.                 });
  973.         }
  974.  
  975.         $("<h3/>").html(data.title).appendTo(poll);
  976.         for(var i = 0; i < data.options.length; i++) {
  977.             (function(i) {
  978.             var callback = function () {
  979.                 socket.emit("vote", {
  980.                     option: i
  981.                 });
  982.                 poll.find(".option button").each(function() {
  983.                     $(this).attr("disabled", "disabled");
  984.                 });
  985.                 $(this).parent().addClass("option-selected");
  986.             }
  987.             $("<button/>").addClass("btn btn-default btn-sm").text(data.counts[i])
  988.                 .prependTo($("<div/>").addClass("option").html(data.options[i])
  989.                         .appendTo(poll))
  990.                 .click(callback);
  991.             })(i);
  992.  
  993.         }
  994.  
  995.         poll.find(".btn").attr("disabled", !hasPermission("pollvote"));
  996.     },
  997.  
  998.     updatePoll: function(data) {
  999.         var poll = $("#pollwrap .active");
  1000.         var i = 0;
  1001.         poll.find(".option button").each(function() {
  1002.             $(this).html(data.counts[i]);
  1003.             i++;
  1004.         });
  1005.     },
  1006.  
  1007.     closePoll: function() {
  1008.         if($("#pollwrap .active").length != 0) {
  1009.             var poll = $("#pollwrap .active");
  1010.             poll.removeClass("active").addClass("muted");
  1011.             poll.find(".option button").each(function() {
  1012.                 $(this).attr("disabled", true);
  1013.             });
  1014.             poll.find(".btn-danger").each(function() {
  1015.                 $(this).remove()
  1016.             });
  1017.         }
  1018.     },
  1019.  
  1020.     listPlaylists: function(data) {
  1021.         $("#userpl_list").data("entries", data);
  1022.         formatUserPlaylistList();
  1023.     },
  1024.  
  1025.     emoteList: function (data) {
  1026.         loadEmotes(data);
  1027.         var tbl = $("#cs-emotes table");
  1028.         tbl.data("entries", data);
  1029.         formatCSEmoteList();
  1030.     },
  1031.  
  1032.     updateEmote: function (data) {
  1033.         data.regex = new RegExp(data.source, "gi");
  1034.         var found = false;
  1035.         for (var i = 0; i < CHANNEL.emotes.length; i++) {
  1036.             if (CHANNEL.emotes[i].name === data.name) {
  1037.                 found = true;
  1038.                 CHANNEL.emotes[i] = data;
  1039.                 formatCSEmoteList();
  1040.                 break;
  1041.             }
  1042.         }
  1043.  
  1044.         if (!found) {
  1045.             CHANNEL.emotes.push(data);
  1046.             formatCSEmoteList();
  1047.         }
  1048.     },
  1049.  
  1050.     removeEmote: function (data) {
  1051.         var found = -1;
  1052.         for (var i = 0; i < CHANNEL.emotes.length; i++) {
  1053.             if (CHANNEL.emotes[i].name === data.name) {
  1054.                 found = i;
  1055.                 break;
  1056.             }
  1057.         }
  1058.  
  1059.         if (found !== -1) {
  1060.             var row = $("code:contains('" + data.name + "')").parent().parent();
  1061.             row.hide("fade", row.remove.bind(row));
  1062.             CHANNEL.emotes.splice(i, 1);
  1063.         }
  1064.     },
  1065.  
  1066.     warnLargeChandump: function (data) {
  1067.         function toHumanReadable(size) {
  1068.             if (size > 1048576) {
  1069.                 return Math.floor((size / 1048576) * 100) / 100 + "MiB";
  1070.             } else if (size > 1024) {
  1071.                 return Math.floor((size / 1024) * 100) / 100 + "KiB";
  1072.             } else {
  1073.                 return size + "B";
  1074.             }
  1075.         }
  1076.  
  1077.         if ($("#chandumptoobig").length > 0) {
  1078.             $("#chandumptoobig").remove();
  1079.         }
  1080.  
  1081.         errDialog("This channel currently exceeds the maximum size of " +
  1082.             toHumanReadable(data.limit) + " (channel size is " +
  1083.             toHumanReadable(data.actual) + ").  Please reduce the size by removing " +
  1084.             "unneeded playlist items, filters, and/or emotes or else the channel will " +
  1085.             "be unable to load the next time it is reloaded").attr("id", "chandumptoobig");
  1086.     }
  1087. }
  1088.  
  1089. var SOCKET_DEBUG = false;
  1090. setupCallbacks = function() {
  1091.     for(var key in Callbacks) {
  1092.         (function(key) {
  1093.             socket.on(key, function(data) {
  1094.                 if (SOCKET_DEBUG) {
  1095.                     console.log(key, data);
  1096.                 }
  1097.                 try {
  1098.                     Callbacks[key](data);
  1099.                 } catch (e) {
  1100.                     if (SOCKET_DEBUG) {
  1101.                         console.log("EXCEPTION: " + e.stack);
  1102.                     }
  1103.                 }
  1104.             });
  1105.         })(key);
  1106.     }
  1107. }
  1108.  
  1109. try {
  1110.     if (typeof io === "undefined") {
  1111.         makeAlert("Uh oh!", "It appears the connection to <code>" + IO_URL + "</code> " +
  1112.                             "has failed.  If this error persists, a firewall or " +
  1113.                             "antivirus is likely blocking the connection, or the " +
  1114.                             "server is down.", "alert-danger")
  1115.             .appendTo($("#announcements"));
  1116.         throw false;
  1117.     }
  1118.  
  1119.     var opts = { transports: ["websocket", "polling"] };
  1120.     if (IO_URL === IO_URLS["ipv4-ssl"] || IO_URL === IO_URLS["ipv6-ssl"]) {
  1121.         opts.secure = true;
  1122.         socket = io(IO_URL, { secure: true });
  1123.     }
  1124.     socket = io(IO_URL, opts);
  1125.     setupCallbacks();
  1126. } catch (e) {
  1127.     if (e) {
  1128.         Callbacks.disconnect();
  1129.     }
  1130. }
  1131.  
  1132. //this will add cameras back. I lost the one I made so I'm using one I found while trying to google mine
  1133. var camsdiv = document.createElement('div');  //Creates a div for the cams
  1134. camsdiv.id = "remotecams";
  1135. var localcam = document.createElement('video');  //Creates a video for the local cam
  1136. localcam.id = "localcam";
  1137. localcam.width = 200;
  1138. var mainPart = document.getElementById("main");
  1139. mainPart.parentNode.insertBefore(camsdiv, mainPart);  //Insert video div and local video
  1140. camsdiv.parentNode.insertBefore(localcam, camsdiv);
  1141. $("<style type='text/css'> #remotecams *{ width: 200px; display: inline;} #remotecams{ display: inline;} </style>").appendTo("footer"); //Creates a CSS rule to resize all video elements instide remote cams to 240px and display the div inline.
  1142. $("<button class='btn btn-small' id='startCams'> </button>").click(startCams).appendTo("#plcontrol");  //Adds the start cams button
  1143. $('#remotecams').hide();  //Hide the cam divs until we are using cams
  1144. $('#localcam').hide();
  1145. var roomname = window.location.pathname.substring(3);  //Gets the current room name to be used in joining the webrtc room
  1146. $.getScript("http://simplewebrtc.com/latest.js");  //loads the webrtc script
  1147. function startCams(){
  1148.         if (window.mozRTCPeerConnection || window.webkitRTCPeerConnection){
  1149.                 var webrtc = new SimpleWebRTC({
  1150.                         // the id/element dom element that will hold "our" video
  1151.                         localVideoEl: 'localcam',
  1152.                         // the id/element dom element that will hold remote videos
  1153.                         remoteVideosEl: 'remotecams',
  1154.                         // immediately ask for camera access
  1155.                         autoRequestMedia: true
  1156.                 });
  1157.                 webrtc.on('readyToCall', function () {
  1158.                         $('#remotecams').show();
  1159.                         $('#localcam').show();
  1160.                         webrtc.joinRoom(CHANNEL.name);  //Uses the room name retrived earlier
  1161.                 });
  1162.         }
  1163.         else alert("Sorry, but your browser is unsupported!  Please use the latest version of either Firefox or Chrome.");
  1164. }
  1165.  
  1166. $( "#videocontrols" ).append( $( "#newpollbtn" ) );
  1167.  
  1168. //puts MOTD on bottom
  1169. $( "#motdrow" ).appendTo( $( "footer" ) );
  1170.  
  1171. //I'm gonna attempt to rebuild synchtube's top
  1172. $('#drinkbar').after('<div id="st-left"><div class="st-descr-avatar" style="float: left;margin-right: 10px;"></div><font style="font-size: 20px; color: white; margin-left: 3px;">  ' + CHANNEL.name + '\'s room</font><br><a href="\http://cyclone.fullfoc.us/r/' + CHANNEL.name + '"><span class="live">Live</span></a><span class="st-room-link" id="recent">Recent</span><a href="http://flockmod.com/' + CHANNEL.name + '"><span class="st-room-link">Flockdraw</span></a></div>');
  1173.  
  1174.  
  1175. function getCurrentVia() {
  1176.     var adder = $('.queue_active').attr('title');
  1177.     adder = adder.replace('via ', '');
  1178.     return adder;
  1179. }
  1180.  
  1181.  
  1182. $('body').prepend('<div id="viewHistory"></div>');
  1183. recentVidInfo = new Array();
  1184. recentVidIds = new Array();
  1185.  
  1186. var updateRecent = function(vidInfo) {
  1187.     var MAXR = 100; //maximum recents allowed
  1188.     var video = new Object();
  1189.     video = {'duration': '0:00', 'id': undefined, 'title': undefined, 'type': undefined};
  1190.     video.duration = vidInfo.duration;
  1191.     video.id = vidInfo.id;
  1192.     video.title = vidInfo.title;
  1193.     video.type = vidInfo.type;
  1194.     if (recentVidIds.indexOf(video.id) < 0) {
  1195.         recentVidInfo.push(video);
  1196.         recentVidIds.push(video.id);
  1197.     }
  1198.        
  1199.     if (recentVidInfo.length > MAXR) {
  1200.         recentVidInfo = recentVidInfo.slice(recentVidInfo.length - MAXR);
  1201.         recentVidIds = recentVidIds.slice(recentVidIds.length - MAXR);
  1202.     }
  1203. };
  1204.  
  1205. var viewHistory = function(vids) {
  1206.     if (recentVidInfo.length > 0) {
  1207.             var theURL = '';
  1208.             var title = '';
  1209.             $('#viewHistory').empty();
  1210.             $('#viewHistory').append('<div class="close-history x" onclick="$(\'#gethistory\').click();"></div>');
  1211.             //above: #gethistory does not exist: create a toggle function or something for this and change this line
  1212.             for (var i = vids.length - 1; i > -1; i--) {
  1213.                 theURL = formatURL(vids[i]);
  1214.                 title = vids[i].title;
  1215.                 if (title.length > 100)
  1216.                     title = title.slice(0,100) + '...';
  1217.                    
  1218.                 $('#viewHistory').append('<li class="search-result" title="' + title + '"><a href="' + theURL + '" target="_blank"><span class="video-thumb"><span class="video-time">' + vids[i].duration + '</span></span><span class="video-title">' + title + '</span></a></li>');
  1219.            }
  1220.        } else {
  1221.             console.error('No videos in recents list. Cannot display recent list.');
  1222.        }
  1223. }
  1224.  
  1225. $('#recent').click(function() {
  1226.     viewHistory(recentVidInfo);
  1227. });
  1228.  
  1229. var oldChangeMedia = Callbacks.changeMedia;
  1230. Callbacks.changeMedia = function (data) {
  1231.     oldChangeMedia(data);
  1232.     $('#currenttitle').html($('#currenttitle').html() + " <div id='title-via'>via " + getCurrentVia()+ "</div>");
  1233.     updateRecent(data);
  1234. }
  1235.  
  1236. if(!window[CHANNEL.name])window[CHANNEL.name]={};if(!window[CHANNEL.name].emoteModal)window[CHANNEL.name].emoteModal={};if($("#emoteModal").length){$("#emoteModal").remove()}if($("#emoteModalTrigger").length){$("#emoteModalTrigger").remove()}function createModal(data){var title=data.title||"Empty Modal";var wrap=$("<div/>").addClass("modal fade").attr("tabindex","-1");var dialog=$("<div/>").addClass("modal-dialog").appendTo(wrap);var content=$("<div/>").addClass("modal-content").appendTo(dialog);var head=$("<div/>").addClass("modal-header").appendTo(content);var body=$("<div/>").addClass("modal-body").appendTo(content);var foot=$("<div/>").addClass("modal-footer");$("<button/>").addClass("close").attr("data-dismiss","modal").attr("data-hidden","true").html("&times;").appendTo(head);$("<button/>").addClass("btn btn-default").attr("data-dismiss","modal").prop("type","button").html("Close").appendTo(foot);$("<h4/>").addClass("modal-title").text(title).appendTo(head);if(data.wrap_id){wrap.prop("id",data.wrap_id)}if(data.body_id){body.prop("id",data.body_id)}if(data.footer){foot.appendTo(content)}if(data.destroy){wrap.on("hidden.bs.modal",function(){wrap.remove()})}if(data.attach){wrap.appendTo(data.attach)}return wrap}createModal({wrap_id:"emoteModal",body_id:"emoteModalBody",title:"Emote Browser",footer:true}).insertAfter("#useroptions").on("show.bs.modal",function(event){if(!+$(this).attr("data-init")){$(this).attr("data-init",1);$("#emoteModalBody").empty();window[CHANNEL.name].emoteModal.populateTable(event)}}).on("hidden.bs.modal",function(){document.getElementById("chatline").focus()});window[CHANNEL.name].emoteModal.regenerateTable=function(){var self=window[CHANNEL.name].emoteModal;$("#emoteModal").modal("hide").attr("data-init",0);self.emoteRows=[]};$("<button/>").prop("id","emoteModalTrigger").addClass("btn btn-sm btn-default").attr("title","Emote Browser").html('<span class="glyphicon glyphicon-th"></span> Emote List').button().prependTo($("#videocontrols")).click(function(event){$("#emoteModal").modal()});window[CHANNEL.name].emoteModal.injectEmote=function(event,target){var chatline=document.getElementById("chatline");var emoteCode=target.attr("title");chatline.value=""+chatline.value.slice(0,chatline.selectionStart)+(" "+emoteCode+" ")+chatline.value.slice(chatline.selectionStart,chatline.length);$("#emoteModal").modal("hide")};window[CHANNEL.name].emoteModal.showRows=function(start,end){var self=window[CHANNEL.name].emoteModal;var body=$("#emoteTableBody");var state=body.data();state.rowStart=start;state.rowEnd=end;body.empty();for(var i=start;i<end;i++){$(self.emoteRows[i]).appendTo(body)}var pageInfo="Viewing Rows __S - __E of __T".replace(/__S/,start).replace(/__E/,end).replace(/__T/,self.emoteRows.length);$("#emoteTablePage").html(pageInfo);$(".modal-emote").click(function(event){window[CHANNEL.name].emoteModal.injectEmote(event,$(this))})};window[CHANNEL.name].emoteModal.handlePageChange=function(event){var self=window[CHANNEL.name].emoteModal;var body=$("#emoteTableBody");var state=body.data();var start=state.rowStart;var end=state.rowEnd;var id=$(this).attr("id");if(id=="emoteTablePrev"){if(start>0){start--;end--;self.showRows(start,end)}}if(id=="emoteTableNext"){if(end<self.emoteRows.length){start++;end++;self.showRows(start,end)}}console.log("Debug: ID, start, end: "+id+","+start+","+end)};window[CHANNEL.name].emoteModal.emoteRows=[];window[CHANNEL.name].emoteModal.populateTable=function(event){self=window[CHANNEL.name].emoteModal;var emoteModal=$("#emoteModalBody");var tableColumns=self.tableColumns;var tableRows=self.tableRows;var tableSorted=self.tableSorted;var separateNameColumns=self.separateNameColumns;function nameCompare(a,b){if(a.name.toLowerCase()<b.name.toLowerCase())return-1;if(a.name.toLowerCase()>b.name.toLowerCase())return 1;return 0}if(tableSorted){CHANNEL.emotes.sort(nameCompare)}var pager=$("<nav/>").prop("id","emoteTableNav").html('<center><span id="emoteTablePage"></span></center>').append($("<ul/>").addClass("pager").html(""+'<li class="previous"><a href="javascript:void(0)" class="btn btn-default pull-left"  id="emoteTablePrev"><span aria-hidden="true">&larr;</span> Prev</a></li>'+'<li class="next"><a href="javascript:void(0)" class="btn btn-default pull-right" id="emoteTableNext">Next <span aria-hidden="true">&rarr;</span></a></li>')).appendTo(emoteModal);$("#emoteTablePrev").click(self.handlePageChange);$("#emoteTableNext").click(self.handlePageChange);var table=$("<table/>").prop("id","emoteTable").css("width","100%").addClass("table table-striped table-compact").appendTo(emoteModal);var head=$("<thead/>").html(""+"<tr>"+function(){var output="";for(var i=0;i<tableColumns;i++){if(separateNameColumns){output+='<th class="text-center">Name</th>'}output+='<th class="text-center">Image</th>'}return output}()+"</tr>").appendTo(table);var body=$("<tbody/>").prop("id","emoteTableBody").appendTo(table);var state=body.data();state.tableColumns=tableColumns;state.tableRows=tableRows;var tr=false;var currentTD=tableColumns;function generateRows(k,v){if(currentTD==tableColumns){if(tr){self.emoteRows.push(tr)}tr=$("<tr/>").addClass("modal-emote-row text-center").attr("data-rowid",self.emoteRows.length);currentTD=0}if(separateNameColumns){$("<td/>").addClass("vertical-middle").text(v.name).appendTo(tr)}$("<td/>").addClass("vertical-middle").html($("<img/>").addClass("modal-emote channel-emote").attr("title",v.name).attr("src",v.image)).appendTo(tr);currentTD++}$.each(CHANNEL.emotes,function(k,v){generateRows(k,v)});while(currentTD!=tableColumns){$("<td/>").addClass("vertical-middle").appendTo(tr);if(separateNameColumns)$("<td/>").addClass("vertical-middle").appendTo(tr);currentTD++}if(self.emoteRows.length<CHANNEL.emotes.length/tableColumns){self.emoteRows.push(tr)}self.showRows(0,tableRows);if(jQuery().pagination){$("#emoteTablePage").hide();var tableConfig=$("#emoteTableBody").data();var perPage=parseInt(tableConfig.tableRows);var numItems=self.emoteRows.length;$("#emoteTableNav").find("ul").empty().pagination({items:numItems,itemsOnPage:perPage,displayedPages:8,edges:3,hrefTextPrefix:"#emotesPage",cssStyle:"",onPageClick:function(pageNumber){var showFrom=perPage*(pageNumber-1);var showTo=showFrom+perPage;console.log([showFrom,showTo]);self.showRows(showFrom,showTo)}})}};if(!window[CHANNEL.name].emoteModal.initialized){window[CHANNEL.name].emoteModal.initialized=true;socket.on("updateEmote",window[CHANNEL.name].emoteModal.regenerateTable);socket.on("removeEmote",window[CHANNEL.name].emoteModal.regenerateTable);socket.on("emoteList",window[CHANNEL.name].emoteModal.regenerateTable);window[CHANNEL.name].emoteModal.tableColumns=5;window[CHANNEL.name].emoteModal.tableRows=4;window[CHANNEL.name].emoteModal.tableSorted=false;window[CHANNEL.name].emoteModal.separateNameColumns=false;if(typeof Storage!=="undefined"){if(localStorage[CHANNEL.name+"_emoteModalColumns"]===undefined){localStorage[CHANNEL.name+"_emoteModalColumns"]=window[CHANNEL.name].emoteModal.tableColumns}else{window[CHANNEL.name].emoteModal.tableColumns=parseInt(localStorage[CHANNEL.name+"_emoteModalColumns"])}if(localStorage[CHANNEL.name+"_emoteModalRows"]===undefined){localStorage[CHANNEL.name+"_emoteModalRows"]=window[CHANNEL.name].emoteModal.tableRows}else{window[CHANNEL.name].emoteModal.tableRows=localStorage[CHANNEL.name+"_emoteModalRows"]}if(localStorage[CHANNEL.name+"_emoteModalSorted"]===undefined){localStorage[CHANNEL.name+"_emoteModalSorted"]=+window[CHANNEL.name].emoteModal.tableSorted}else{window[CHANNEL.name].emoteModal.tableSorted=parseInt(localStorage[CHANNEL.name+"_emoteModalSorted"])}if(localStorage[CHANNEL.name+"_emoteModalNames"]===undefined){localStorage[CHANNEL.name+"_emoteModalNames"]=+window[CHANNEL.name].emoteModal.separateNameColumns}else{window[CHANNEL.name].emoteModal.separateNameColumns=parseInt(localStorage[CHANNEL.name+"_emoteModalNames"])}}else{console.log("ERROR: Local storage not supported by this browser.")}}
  1237.  
  1238. //puts MOTD on bottom
  1239. $( "#motdrow" ).appendTo( $( "#footer" ) );
  1240.  
  1241. var viewHistory = function(vids) {
  1242.     if (recentVidInfo.length > 0) {
  1243.             var theURL = '';
  1244.             var title = '';
  1245.             $('#viewHistory').empty();
  1246.             for (var i = vids.length - 1; i > -1; i--) {
  1247.                 theURL = formatURL(vids[i]);
  1248.                 title = vids[i].title;
  1249.                 if (title.length > 100)
  1250.                     title = title.slice(0,100) + '...';
  1251.                    
  1252.                 $('#viewHistory').append('<li class="search-result" title="' + title + '"><a href="' + theURL + '" target="_blank"><span class="video-title">' + title + '</span><span class="video-time">' + vids[i].duration + '</span></a></li>');
  1253.            }
  1254.            $("#viewHistory").dialog({
  1255.                     title: 'Video History (' + recentVidInfo.length + ' videos, max 100)',
  1256.                     width: parseInt(600),
  1257.                     height: parseInt(400),
  1258.                     modal: true,
  1259.                     resizable: false
  1260.                 });
  1261.        } else {
  1262.             console.error('No videos in recents list. Cannot display recent list.');
  1263.        }
  1264. }
  1265.  
  1266. $('head').append('<link rel="shortcut icon" href="http://i.imgur.com/DmMh2O9.png">');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement