var Admin = { beginning:true, admin_listener: function() { socket.on("toast", function(msg) { switch(msg) { case "addedsong": msg=Helper.rnd(["I added your song", "Your song has been added", "Yay, more songs!", "Thats a cool song!", "I added that song for you", "I see you like adding songs..."]) break; case "savedsettings": msg=Helper.rnd(["I've saved your settings", "I stored all your settings", "Your settings have been stored in a safe place"]) break; case "wrongpass": msg=Helper.rnd(["That's not the right password!", "Wrong! Better luck next time...", "You seem to have mistyped the password", "Incorrect. Have you tried meditating?","Nope, wrong password!", "Wrong password. The authorities have been notified."]) Crypt.remove_pass(chan.toLowerCase()); Admin.display_logged_out(); w_p = true; break; case "shuffled": msg=Helper.rnd(["♫ You stir me right round, baby. ♫","♫ Stir, stir, stir my boat ♫","I vigorously stirred your playlist!", "I hope you like your list stirred, not shaken.", "I shuffled your playlist with the cosmic background radiation as a seed. Enjoy.", "100% randomized, for your listening pleasure!", "I hope you enjoy your fresh playlist!"]) break; case "deletesong": msg=Helper.rnd(["Your song is now in a better place...", "You won't be seeing any more of that video...", "EXTERMINATE! EXTERMINATE! EXTERMINATE!", "I killed it with fire", "Thanks for deleting that song. I didn't like it anyways...", "Removed song securely."]) break; case "voted": msg=Helper.rnd(["You voted!", "You vote like a boss", "Voting is the key to democracy", "May you get your song to the very top!", "I love that song! I vouch for you.", "Only you vote that good", "I like the way you vote...", "Up the video goes!", "Voted Zöff for president", "Only 999 more to go!"]) break; case "alreadyvoted": msg=Helper.rnd(["You can't vote twice on that song!", "I see you have voted on that song before", "One vote per person!", "I know you want to hear your song, but have patience!", "I'm sorry, but I can't let you vote twice, Dave."]) break; case "skip": msg=Helper.rnd(["The song was skipped", "I have skipped a song", "Skipped to the beat", "Skipmaster3000", "They see me skippin', they hatin'"]) break; case "listhaspass": msg=Helper.rnd(["I'm sorry, but you have to be an admin to do that!", "Only admins can do that", "You're not allowed to do that, try logging in!", "I can't let you do that", "Please log in to do that"]) break; case "noskip": msg=Helper.rnd(["Only Admins can skip songs, peasant!", "You have to log in to skip songs on this channel", "Try clicking the settings icon and logging in before you skip"]) break; case "alreadyskip": msg=Helper.rnd(["Skipping is democratic, only one vote per person!", "More people have to vote to skip, not just you!", "Get someone else to skip too! You can't do it on yourself."]) break; case "notyetskip": msg="Skipping is disabled the first 10 seconds."; break; case "correctpass": msg="Correct password. You now have access to the sacred realm of The Admin."; break; case "changedpass": msg="Your password has been changed!"; break; case "suggested": msg="Your song was suggested!"; break; case "alreadyplay": msg="Seems the song you want is already playing. No fooling the system!"; break; } Materialize.toast(msg, 4000); }); socket.on("pw", function(msg) { w_p = false; adminpass = msg; names = ["vote","addsongs","longsongs","frontpage", "allvideos", "removeplay", "skip", "shuffle"]; Crypt.set_pass(chan.toLowerCase(), Crypt.decrypt_pass(msg)) for (var i = 0; i < names.length; i++) { $("input[name="+names[i]+"]").attr("disabled", false); } $(".card-action").removeClass("hide"); $("#admin-lock").removeClass("mdi-action-lock"); $("#password").val(""); $("#password").attr("placeholder", "Change channel password") if(!window.mobilecheck()){ $(".playlist-tabs").removeClass("hide"); $("#top-button").toggleClass("top-button-with-tabs"); $("#wrapper").toggleClass("tabs_height"); } if(!Helper.contains($("#admin-lock").attr("class").split(" "), "mdi-action-lock-open")) $("#admin-lock").addClass("mdi-action-lock-open clickable"); }); socket.on("conf", function(msg) { Crypt.init(); Admin.set_conf(msg[0]); if(Crypt.get_pass(chan.toLowerCase()) !== undefined && Admin.beginning && Crypt.get_pass(chan.toLowerCase()) != ""){ socket.emit("password", [Crypt.crypt_pass(Crypt.get_pass(chan.toLowerCase())), chan.toLowerCase()]); Admin.beginning = false; } }); }, pass_save: function() { if(!w_p) { socket.emit('password', [Crypt.crypt_pass(CryptoJS.SHA256(document.getElementById("password").value).toString()), chan.toLowerCase(), Crypt.crypt_pass(Crypt.get_pass(chan.toLowerCase()))]); } else { socket.emit('password', [Crypt.crypt_pass(CryptoJS.SHA256(document.getElementById("password").value).toString()), chan.toLowerCase()]); } }, log_out: function(){ if(Crypt.get_pass(chan.toLowerCase())){ Crypt.remove_pass(chan.toLowerCase()); Admin.display_logged_out(); Materialize.toast("Logged out", 4000); }else{ Materialize.toast("Not logged in", 4000); } }, display_logged_out: function() { w_p = true; adminpass = ""; names = ["vote","addsongs","longsongs","frontpage", "allvideos", "removeplay", "skip", "shuffle"]; document.getElementById("password").value = ""; for (i = 0; i < names.length; i++) { $("input[name="+names[i]+"]").attr("disabled", true); } if(!Helper.contains($("#admin-lock").attr("class").split(" "), "mdi-action-lock")){ $("#admin-lock").addClass("mdi-action-lock"); } if(!Helper.contains($(".playlist-tabs").attr("class").split(" "), "hide")){ $(".playlist-tabs").addClass("hide"); } if($(".card-action").length != 0 && !Helper.contains($(".card-action").attr("class").split(" "), "hide")){ $(".card-action").addClass("hide"); } $('ul.tabs').tabs('select_tab', 'wrapper'); $("#wrapper").removeClass("tabs_height"); $("#admin-lock").removeClass("mdi-action-lock-open clickable"); $("#password").attr("placeholder", "Enter channel password"); $("#top-button").removeClass("top-button-with-tabs"); }, //function used in html onlick save: function(){ Admin.submitAdmin(document.getElementById("adminForm").elements); }, set_conf: function(conf_array) { music = conf_array["allvideos"]; longsongs = conf_array["longsongs"]; names = ["vote","addsongs","longsongs","frontpage", "allvideos", "removeplay", "skip", "shuffle"]; if(conf_array['adminpass'] == "" || !w_p){ hasadmin = false; if(!window.mobilecheck()){ $(".playlist-tabs").removeClass("hide"); $("#wrapper").toggleClass("tabs_height"); } } else hasadmin = true; for (var i = 0; i < names.length; i++) { document.getElementsByName(names[i])[0].checked = (conf_array[names[i]] === true); $("input[name="+names[i]+"]").attr("disabled", hasadmin); } if((hasadmin)){ Admin.display_logged_out(); }else if(!hasadmin && Crypt.get_pass(chan.toLowerCase()) === undefined){ $("#password").attr("placeholder", "Create channel password"); } /*if(conf_array.desc !== undefined) { document.getElementById("description").innerHTML = conf_array.desc; }*/ }, submitAdmin: function(form) { voting = form.vote.checked; addsongs = form.addsongs.checked; longsongs = form.longsongs.checked; frontpage = form.frontpage.checked; allvideos = form.allvideos.checked; removeplay = form.removeplay.checked; skipping = form.skip.checked; shuffling = form.shuffle.checked; configs = [voting, addsongs, longsongs, frontpage, allvideos, removeplay, adminpass, skipping, shuffling]; socket.emit("conf", configs); }, hide_settings: function(){ $('#settings').sideNav('hide'); }, shuffle: function() { socket.emit('shuffle', adminpass !== undefined ? adminpass : ""); }, get_admin:function() { return [w_p, hasadmin]; } } var Chat = { namechange: function(newName) { socket.emit("namechange", newName); Crypt.set_name(newName); }, removename: function() { socket.emit("removename"); Crypt.remove_name(); }, chat: function(data) { if(data.value.length > 150) return; if(data.value.startsWith("/name ")){ Chat.namechange(data.value.substring(6)); }else if(data.value.startsWith("/removename")){ Chat.removename(); } else if($(".tab a.active").attr("href") == "#all_chat") socket.emit("all,chat", data.value); else socket.emit("chat", data.value); data.value = ""; return; }, allchat_listener: function() { socket.on("chat.all", function(inp) { if($("#chat-bar").position()["left"] != 0) { //$("#chat-btn").css("color", "grey"); if(!blink_interval_exists && inp.indexOf("changed name to") > -1) { $("#favicon").attr("href", "static/images/highlogo.png"); blink_interval_exists = true; unseen = true; blink_interval = setInterval(Chat.chat_blink, 2000); } }else if(document.hidden) { $("#favicon").attr("href", "static/images/highlogo.png"); unseen = true; } var color = Helper.intToARGB(Helper.hashCode(inp[0])).substring(0,6); $("#chatall").append("
  • "+inp[0]+"
  • "); var in_text = document.createTextNode(inp[1]); $("#chatall li:last")[0].appendChild(in_text); document.getElementById("chatall").scrollTop = document.getElementById("chatall").scrollHeight }); }, setup_chat_listener: function(channel) { socket.on("chat", function(data) { if($("#chat-bar").position()["left"] != 0) { if(data[1].indexOf(":") >= 0){ //$("#chat-btn").css("color", "grey"); if(!blink_interval_exists && data.indexOf("changed name to") > -1) { $("#favicon").attr("href", "static/images/highlogo.png"); blink_interval_exists = true; blink_interval = setInterval(Chat.chat_blink, 2000); } } } var color = Helper.intToARGB(Helper.hashCode(data[0])).substring(0,6); $("#chatchannel").append("
  • "+data[0]+"
  • "); var in_text = document.createTextNode(data[1]); $("#chatchannel li:last")[0].appendChild(in_text); document.getElementById("chatchannel").scrollTop = document.getElementById("chatchannel").scrollHeight }); }, chat_blink: function() { $("#chat-btn i").css("opacity", 0.5); setTimeout(function(){$("#chat-btn i").css("opacity", 1);}, 1000); } } var Crypt = { conf_pass: undefined, init: function(){ document.cookie = chan.toLowerCase() + '=; path=/' + chan.toLowerCase() + '; expires=' + new Date(0).toUTCString(); try{ conf_arr = Crypt.decrypt(Crypt.getCookie("_opt"), "_opt"); }catch(err){ conf_arr = Crypt.decrypt(Crypt.create_cookie("_opt"), "_opt"); } try{ Crypt.conf_pass = Crypt.decrypt(Crypt.getCookie(chan.toLowerCase()), chan.toLowerCase()); }catch(err){ Crypt.conf_pass = Crypt.decrypt(Crypt.create_cookie(chan.toLowerCase()), chan.toLowerCase()); } Hostcontroller.change_enabled(conf_arr.remote); if(conf_arr["width"] != 100) Player.set_width(conf_arr["width"]); if(conf_arr["name"] != undefined && conf_arr["name"] != "") Chat.namechange(conf_arr["name"]); }, decrypt: function(cookie, name){ if(Crypt.getCookie(name) === undefined) { cookie = Crypt.create_cookie(name); } var decrypted = CryptoJS.AES.decrypt( cookie,navigator.userAgent+navigator.languages, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); return $.parseJSON(decrypted.toString(CryptoJS.enc.Utf8)); }, decrypt_pass: function(pass){ var decrypted = CryptoJS.AES.decrypt( pass,socket.id, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); return decrypted.toString(CryptoJS.enc.Utf8); }, encrypt: function(json_formated, cookie){ var to_encrypt = JSON.stringify(json_formated); var encrypted = CryptoJS.AES.encrypt( to_encrypt, navigator.userAgent+navigator.languages, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); var CookieDate = new Date; CookieDate.setFullYear(CookieDate.getFullYear( ) +1); document.cookie = cookie+"="+encrypted.toString()+";expires="+CookieDate.toGMTString()+";path=/;"; }, encrypt_string: function(string){ var encrypted = CryptoJS.AES.encrypt( string, socket.id, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); return encrypted.toString(); }, get_volume: function(){ return Crypt.decrypt(Crypt.getCookie("_opt"), "_opt").volume; //return conf_arr.volume; }, set_volume: function(val){ conf_arr.volume = val; Crypt.encrypt(conf_arr, "_opt"); }, create_cookie: function(name){ if(name == "_opt") cookie_object = {volume: 100, width: 100, remote: true, name: ""}; else cookie_object = {passwords: {}}; var string_it = JSON.stringify(cookie_object); var encrypted = CryptoJS.AES.encrypt( string_it, navigator.userAgent+navigator.languages, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); var CookieDate = new Date; CookieDate.setFullYear(CookieDate.getFullYear( ) +1); document.cookie = name+"="+encrypted.toString()+";expires="+CookieDate.toGMTString()+";path=/;"; //document.cookie = name+"="+encrypted.toString()+";expires="+CookieDate.toGMTString()+";path=/;" //document.cookie = na"="+encrypted.toString()+";expires="+CookieDate.toGMTString()+";path=/;" return Crypt.getCookie(name); }, set_pass: function(chan, pass){ Crypt.conf_pass.passwords[chan] = pass; Crypt.encrypt(Crypt.conf_pass, chan); }, remove_pass:function(chan){ delete Crypt.conf_pass.passwords[chan]; Crypt.encrypt(Crypt.conf_pass, chan.toLowerCase()); }, set_name:function(name){ conf_arr.name = name; Crypt.encrypt(conf_arr, "_opt"); }, remove_name:function(){ conf_arr.name = ""; Crypt.encrypt(conf_arr, "_opt"); }, get_pass: function(chan){ if(Crypt.conf_pass != undefined) return Crypt.conf_pass.passwords[chan]; return undefined; }, set_remote: function(val){ conf_arr.remote = val; Crypt.encrypt(conf_arr, "_opt"); }, get_remote: function(val){ return conf_arr.remote; }, crypt_pass: function(pass){ var encrypted = CryptoJS.AES.encrypt( pass, socket.id, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); return encrypted.toString(); }, get_width: function(){ return conf_arr["width"]; }, set_width: function(val){ conf_arr["width"] = val; Crypt.encrypt(conf_arr, "_opt"); }, getCookie: function(name) { var value = "; " + document.cookie; var parts = value.split("; " + name + "="); if (parts.length == 2) return parts.pop().split(";").shift(); } } window.mobilecheck = function() { var check = false; (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true;})(navigator.userAgent||navigator.vendor||window.opera); return check; }; var Helper = { rnd: function(arr) { return arr[Math.floor(Math.random() * arr.length)]; }, predicate: function() { var fields = [], n_fields = arguments.length, field, name, cmp; var default_cmp = function (a, b) { if (a === b) return 0; return a < b ? -1 : 1; }, getCmpFunc = function (primer, reverse) { var dfc = default_cmp, // closer in scope cmp = default_cmp; if (primer) { cmp = function (a, b) { return dfc(primer(a), primer(b)); }; } if (reverse) { return function (a, b) { return -1 * cmp(a, b); }; } return cmp; }; // preprocess sorting options for (var i = 0; i < n_fields; i++) { field = arguments[i]; if (typeof field === 'string') { name = field; cmp = default_cmp; } else { name = field.name; cmp = getCmpFunc(field.primer, field.reverse); } fields.push({ name: name, cmp: cmp }); } // final comparison function return function (A, B) { var name, result; for (var i = 0; i < n_fields; i++) { result = 0; field = fields[i]; name = field.name; result = field.cmp(A[name], B[name]); if (result !== 0) break; } return result; }; }, hashCode: function(str) { // java String#hashCode var hash = 0; for (var i = 0; i < str.length; i++) { hash = str.charCodeAt(i) + ((hash << 5) - hash); } return hash; }, intToARGB: function(i){ return ((i>>24)&0xFF).toString(16) + ((i>>16)&0xFF).toString(16) + ((i>>8)&0xFF).toString(16) + (i&0xFF).toString(16); }, pad: function(n) { return n < 10 ? "0"+Math.floor(n) : Math.floor(n); }, contains: function(a, obj) { var i = a.length; while (i--) { if (a[i] === obj) { return true; } } return false; }, sample: function() { if (Date.now() - lastSample >= SAMPLE_RATE * 2) { socket.removeAllListeners() socket.disconnect(); socket.connect(); Player.setup_all_listeners(); } lastSample = Date.now(); setTimeout(Helper.sample, SAMPLE_RATE); }, loadjsfile: function(filename) { if (filesadded.indexOf("["+filename+"]")==-1){ var fileref=document.createElement('script'); fileref.setAttribute("type","text/javascript"); fileref.setAttribute("src", filename); document.getElementsByTagName("head")[0].appendChild(fileref); filesadded+="["+filename+"]"; } }, msieversion: function() { var ua = window.navigator.userAgent; var msie = ua.indexOf("MSIE "); if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer, return version number return true; else // If another browser, return 0 return false; }, getRandomInt: function(min, max) { return Math.floor(Math.random() * (max - min)) + min; }, rgbToHsl: function(arr){ r = arr[0], g = arr[1], b = arr[2]; r /= 255, g /= 255, b /= 255; var max = Math.max(r, g, b), min = Math.min(r, g, b); var h, s, l = (max + min) / 2; if(max == min){ h = s = 0; // achromatic }else{ var d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch(max){ case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } if(l>0.5)l=0.5; //make sure it isnt too light return "hsl("+Math.floor(h*360)+", "+Math.floor(s*100)+"%, "+Math.floor(l*100)+"%)"; }, componentToHex: function(c) { var hex = c.toString(16); return hex.length == 1 ? "0" + hex : hex; }, rgbToHex: function(r, g, b) { return "#" + Helper.componentToHex(r) + Helper.componentToHex(g) + Helper.componentToHex(b); }, upperFirst: function(string){ return string.substring(0,1).toUpperCase()+string.substring(1).toLowerCase(); }, addClass: function(object, toAdd){ if(!Helper.contains($(object).attr("class").split(" "), toAdd)){ $(object).addClass(toAdd); } }, send_mail: function(from, message){ if(from != "" && message != ""){ $("#submit-contact-form").addClass("hide"); $("#send-loader").removeClass("hide"); $("#contact-form-from").attr("disabled", "true"); $("#contact-form-message").attr("disabled", "true"); /* $.ajax({ type: "POST", data: {from: from, message: message}, url: "/php/mail.php", success: function(data){ if(data == "success"){ $("#contact-container").empty(); $("#contact-container").html("Mail has been sent, we'll be back with you shortly.") }else{ $("#contact-container").empty(); $("#contact-container").html("Something went wrong, sorry about that. You could instead try with your own mail-client: contact@zoff.no") } } });*/ var from = $("#contact-form-from").val(); var message = $("#contact-form-message").val(); $("#contact-container").empty(); newWindow = window.open("mailto:contact@zoff.no?Subject=Contact%20Zoff&Body=" + message, "_blank"); $("#contact-container").html("Something went wrong, sorry about that. You could instead try with your own mail-client: contact@zoff.no"); setTimeout(function(){newWindow.close()},500); } } } $(document).on('submit', '#contact-form', function(e){ e.preventDefault(); var message = $("#contact-form-message").val(); var from = $("#contact-form-from").val(); Helper.send_mail(from, message); }); Element.prototype.remove = function() { this.parentElement.removeChild(this); } NodeList.prototype.remove = HTMLCollection.prototype.remove = function() { for(var i = 0, len = this.length; i < len; i++) { if(this[i] && this[i].parentElement) { this[i].parentElement.removeChild(this[i]); } } } String.prototype.startsWith = function(searchString, position) { position = position || 0; return this.indexOf(searchString, position) === position; } var Hostcontroller = { enabled: true, host_listener: function() { var old_id; socket.on("id", function(id) { if(old_id === undefined) old_id = id; else { socket.removeAllListeners(id); began = false; old_id = id; } var codeURL = "https://remote."+window.location.hostname+"/"+id; $("#code-text").text(id) $("#code-qr").attr("src", "https://chart.googleapis.com/chart?chs=221x221&cht=qr&choe=UTF-8&chld=L|1&chl="+codeURL); $("#code-link").attr("href", codeURL); if(!began) { began = true; socket.on(id, function(arr) { if(enabled){ if(arr[0] == "volume"){ $("#volume").slider("value", arr[1]); Player.ytplayer.setVolume(arr[1]); localStorage.setItem("volume", arr[1]); Playercontrols.choose_button(arr[1], false); }else if(arr[0] == "channel"){ socket.emit("change_channel"); Admin.beginning = true; chan = arr[1].toLowerCase(); $("#chan").html(Helper.upperFirst(chan)); w_p = true; socket.emit("list", chan.toLowerCase()); /*if(Crypt.get_pass(chan.toLowerCase()) !== undefined && Crypt.get_pass(chan.toLowerCase()) != ""){ socket.emit("password", [Crypt.crypt_pass(Crypt.get_pass(chan.toLowerCase())), chan.toLowerCase()]); }*/ window.history.pushState("object or string", "Title", "/"+chan.toLowerCase()); }else if(arr[0] == "pause") Player.ytplayer.pauseVideo() else if(arr[0] == "play") Player.ytplayer.playVideo(); else if(arr[0] == "skip") List.skip(); } }); } }); $('input[class=remote_switch_class]').change(function() { enabled = document.getElementsByName("remote_switch")[0].checked; Crypt.set_remote(enabled); }); }, change_enabled:function(val){ enabled = val; document.getElementsByName("remote_switch")[0].checked = enabled; } } var List = { empty: false, channel_listener: function() { socket.on("channel", function(msg){ List.channel_function(msg); }); }, channel_function: function(msg) { switch(msg[0]) { case "list": List.populate_list(msg[1]); break; case "added": List.added_song(msg[1]); break; case "deleted": List.deleted_song(msg[1]); break; case "vote": List.voted_song(msg[1], msg[2]); break; case "song_change": List.song_change(msg[1]); break; } }, populate_list: function(msg) { if(list_html == undefined) list_html = $("#list-song-html").html(); full_playlist = msg; List.sortList(); $("#wrapper").empty(); if(full_playlist.length > 1){ $.each(full_playlist, function(j, current_song){ if(!current_song.now_playing){ //check that the song isnt playing $("#wrapper").append(List.generateSong(current_song, false, lazy_load, true)); } }); if(lazy_load){ if(window.mobilecheck()) $(".list-image").lazyload({}); else{ $(".list-image").lazyload({container: $("#wrapper")}).removeClass("lazy"); document.getElementById('wrapper').scrollTop += 1; document.getElementById('wrapper').scrollTop += -1; } } }else{ List.empty = true; $("#wrapper").append("The playlist is empty."); } $("#settings").css("visibility", "visible"); $("#settings").css("opacity", "1"); $("#wrapper").css("opacity", "1"); }, added_song: function(added){ full_playlist.push(added); List.sortList(); $("#suggested-"+added.id).remove(); if(List.empty){ $("#empty-channel-message").remove(); List.empty = false; } List.insertAtIndex(added, true); }, deleted_song: function(deleted){ var index = List.getIndexOfSong(deleted); var to_delete = $("#wrapper").children()[index]; try{ to_delete.style.height = 0; setTimeout(function() { $("#"+deleted).remove(); full_playlist.splice(List.getIndexOfSong(deleted), 1); }, 305); document.getElementById('wrapper').scrollTop += 1; document.getElementById('wrapper').scrollTop += -1; }catch(err){ full_playlist.splice(List.getIndexOfSong(deleted), 1); if(!List.empty) $("#wrapper").children()[$("#wrapper").children().length-1].remove(); } if(full_playlist.length <= 2){ List.empty = true; $("#wrapper").append("The playlist is empty."); } $("#suggested-"+deleted).remove(); Suggestions.checkUserEmpty(); }, voted_song: function(voted, time){ var index_of_song = List.getIndexOfSong(voted); var song_voted_on = full_playlist[index_of_song]; full_playlist[index_of_song].votes += 1; full_playlist[index_of_song].added = time; List.sortList(); $("#"+voted).remove(); List.insertAtIndex(song_voted_on, false); }, song_change: function(time){ var length = full_playlist.length-1; full_playlist[0].now_playing = true; full_playlist[0].votes = 0; full_playlist[0].guids = []; full_playlist[0].added = time; full_playlist[length].now_playing = false; try{ full_playlist.push(full_playlist.shift()); if(!List.empty) $("#wrapper").children()[0].remove(); List.insertAtIndex(full_playlist[length-1], false); document.getElementById('wrapper').scrollTop += 1; document.getElementById('wrapper').scrollTop += -1; }catch(e){} }, vote: function(id, vote){ socket.emit('vote', [chan, id, vote, adminpass]); return true; }, skip: function(){ socket.emit('skip', {pass: adminpass, id:video_id}); return true; }, importOldList: function(chan){ var ids=""; var num=0; playlist_url = "lists/"+chan+".json"; list = $.parseJSON($.ajax({ type: "GET", url: playlist_url, async: false }).responseText); $.each(list.songs, function(i,data) { ids+=data.id+","; if(num>45){ Search.addVideos(ids); ids = ""; num = 0; } num++; }); Search.addVideos(ids); document.getElementById("search").value = ""; }, sortList: function() { full_playlist.sort(Helper.predicate({ name: 'votes', reverse: true }, 'added')); }, show: function(){ if(!window.mobilecheck()) { if(showToggle){ showToggle=false; $("#toptitle").empty(); $("#chan").addClass("bigChan"); //$("#chan").html("zoff.no/"+encodeURI(chan)); $("#chan").html("zoff.no/"+chan.toLowerCase()); }else{ showToggle=true; $("#toptitle").html("Zöff"); $("#chan").removeClass("bigChan"); $("#chan").html(chan); } } }, insertAtIndex: function(song_info, transition) { i = List.getIndexOfSong(song_info.id); if(i === 0) $("#wrapper").prepend(List.generateSong(song_info, transition, false, true, false)); else $("#wrapper > div:nth-child(" + (i) + ")").after(List.generateSong(song_info, transition, false, true, false)); if(transition) { setTimeout(function(){ var added = $("#wrapper").children()[i]; $(added).css("height", 66); },5); } }, generateSong: function(song_info, transition, lazy, list, user) { var video_id = song_info.id; var video_title = song_info.title; var video_votes = song_info.votes; var video_thumb = "background-image:url('//img.youtube.com/vi/"+video_id+"/mqdefault.jpg');"; var song = $("
    "+list_html+"
    "); var image_attr = "style"; var attr; var del_attr; if(transition) song.find("#list-song").css("height", 0); if(!w_p) song.find(".card-action").removeClass("hide"); if(video_votes == 1)song.find(".vote-text").text("vote"); if(lazy){ video_thumb = "//img.youtube.com/vi/"+video_id+"/mqdefault.jpg"; image_attr = "data-original"; } if(list){ song.find(".list-votes").text(video_votes); song.find("#list-song").attr("id", video_id); song.find(".vote-container").attr("title", video_title); attr = ".vote-container"; del_attr = "del"; }else if(!list){ song.find(".vote-text").text(song_info.duration); attr = ".add-suggested"; if(user) del_attr = "del_user_suggested"; else del_attr = "del_suggested"; song.find(".vote-container").attr("class", "clickable add-suggested"); song.find(".add-suggested").attr("title", video_title); song.find("#del").attr("id", del_attr); song.find(attr).attr("data-video-title", video_title); song.find(attr).attr("data-video-length", song_info.length); song.find("#list-song").attr("id", "suggested-" + video_id); song.find(".list-image").attr("class", song.find(".list-image").attr("class").replace("list-image", "list-suggested-image")); } song.find(".list-title").text(video_title); song.find(".list-title").attr("title", video_title); //song.find(".vote-container").attr("onclick", "vote('"+video_id+"','pos')"); song.find(attr).attr("data-video-id", video_id); song.find(".list-image").attr(image_attr,video_thumb); song.find(".list-suggested-image").attr(image_attr,video_thumb); song.find("#"+del_attr).attr("data-video-id", video_id); //song.find("#del").attr("onclick", "vote('"+video_id+"', 'del')"); return song.html(); }, getIndexOfSong: function(id) { indexes = $.map(full_playlist, function(obj, index) { if(obj.id == id) { return index; } }); return indexes[0]; }, scrollTop: function(){ $("#wrapper").scrollTop(0); }, scrollBottom: function(){ $("#wrapper").scrollTop($("#wrapper")[0].scrollHeight); } } var chan = $("#chan").html(); var w_p = true; var hasadmin = 0; var showToggle = true; var list_html = $("#list-song-html").html(); var blink_interval_exists = false; var unseen = false; //var timer = 0; var api_key = "***REMOVED***"; var result_html = $("#temp-results-container"); var empty_results_html = $("#empty-results-container").html(); var searching = false var time_regex = /P((([0-9]*\.?[0-9]*)Y)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)W)?(([0-9]*\.?[0-9]*)D)?)?(T(([0-9]*\.?[0-9]*)H)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)S)?)?/ var conf = []; var music = 0; var frontpage = 1; var adminpass = ""; var filesadded = ""; var player_ready = false; var viewers = 1; var paused = false; var playing = false; var SAMPLE_RATE = 6000; // 6 seconds var lastSample = Date.now(); var began = false; var i = -1; var lazy_load = true; var embed = false; var autoplay = true; var durationBegun = false; var mobile_beginning; var timeout_search; var id; var full_playlist; var conf; var blink_interval; var tag; var firstScriptTag; var title; var viewers; var video_id; var list; var seekTo; var song_title; var previous_video_id; var socket; var connection_options = { 'sync disconnect on unload':true, 'secure': true, 'force new connection': true }; $().ready(function(){ if(!window.fromFront && window.location.pathname != "/") init(); }); function init(){ chan = $("#chan").html(); mobile_beginning = window.mobilecheck(); window.onpopstate = function(e){ onepage_load(); } share_link_modifier_channel(); if(window.location.hostname == "zoff.no") add = "https://zoff.no"; else add = "localhost"; //setTimeout(function(){ if(Player != undefined) Player.stopInterval= false; //window.vote = List.vote; //window.submit = Search.submit; //window.submitAndClose = Search.submitAndClose; if(!localStorage["list_update"] || localStorage["list_update"] != "13.06.15") { localStorage.setItem("list_update", "13.06.15"); window.location.reload(true); } $('ul.tabs').tabs(); $("#settings").sideNav({ menuWidth: 300, // Default is 240 edge: 'right', // Choose the horizontal origin closeOnClick: false // Closes side-nav on clicks, useful for Angular/Meteor }); $('.collapsible').collapsible({ accordion : true // A setting that changes the collapsible behavior to expandable instead of the default accordion style }); //awdwad $(".video-container").resizable({ start: function(event, ui) { $('iframe').css('pointer-events','none'); }, stop: function(event, ui) { $('iframe').css('pointer-events','auto'); Crypt.set_width($(this).width()); }, handles: "e", minWidth: 350 }); /* if(localStorage[chan.toLowerCase()]) { if(localStorage[chan.toLowerCase()].length != 64) localStorage.removeItem(chan.toLowerCase()); else socket.emit("password", [localStorage[chan.toLowerCase()], chan.toLowerCase()]); }*/ socket = io.connect(''+add+':8880', connection_options); Player.setup_youtube_listener(chan); Admin.admin_listener(); List.channel_listener(); socket.on("get_list", function(){ //setTimeout(function(){ socket.emit('list', chan.toLowerCase()); /*if(Crypt.get_pass(chan.toLowerCase()) != undefined){ socket.emit("password", [Crypt.crypt_pass(Crypt.get_pass(chan.toLowerCase())), chan.toLowerCase()]); }*/ }); socket.on("suggested", function(params){ var single = true; if(params.id == undefined) single = false; //setTimeout(function(){ Suggestions.catchUserSuggests(params, single); //}, 1000); }); socket.on("viewers", function(view) { viewers = view; if(song_title !== undefined) Player.getTitle(song_title, viewers); }); if(/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream){ document.getElementById("search").blur(); Player.readyLooks(); }else{ Chat.setup_chat_listener(chan); Chat.allchat_listener(); if(!window.mobilecheck()) Hostcontroller.host_listener(); window.onYouTubeIframeAPIReady = Player.onYouTubeIframeAPIReady; Player.loadPlayer(); $("#chat-btn").sideNav({ menuWidth: 272, // Default is 240 edge: 'left', // Choose the horizontal origin closeOnClick: false // Closes side-nav on clicks, useful for Angular/Meteor }); if($(".drag-target").length > 0) $(".drag-target")[1].remove(); if(!Helper.msieversion()) Notification.requestPermission(); git_info = $.ajax({ type: "GET", url: "https://api.github.com/repos/zoff-music/zoff/commits", async: false }).responseText; git_info = $.parseJSON(git_info); $("#latest-commit").html("Latest Commit:
    " + git_info[0].commit.author.date.substring(0,10) + ": " + git_info[0].committer.login + "
    " + git_info[0].sha.substring(0,10) + ": " + git_info[0].commit.message+"'); $("#search").attr("placeholder", "Find song on YouTube..."); } window.init = init; $(document).keyup(function(e) { if(event.keyCode == 27){ $("#results").html(""); if(!Helper.contains($("#search-wrapper").attr("class").split(" "), "hide")) $("#search-wrapper").toggleClass("hide"); if(Helper.contains($("#song-title").attr("class").split(" "), "hide")) $("#song-title").toggleClass("hide"); if($("#search-btn i").attr('class') == "mdi-navigation-close") { $("#search-btn i").toggleClass("mdi-navigation-close"); $("#search-btn i").toggleClass("mdi-action-search"); } $("#results").toggleClass("hide"); }else if ($("div.result").length > 2){ children = $("#mock-div").children(); if (e.keyCode == 40) { $(children[i-1]).removeClass("hoverResults"); $(children[i]).addClass("hoverResults"); if(i < children.length -2) i++; } else if (e.keyCode == 38) { if(i > 1) i--; $(children[i]).removeClass("hoverResults"); $(children[i-1]).addClass("hoverResults"); } else if(e.keyCode == 13) { i = 0; var elem = document.getElementsByClassName("hoverResults")[0]; if (typeof elem.onclick == "function") { elem.onclick.apply(elem); } $("div.hoverResults").removeClass("hoverResults"); $("#results").html(''); document.getElementById("search").value = ""; } } }); $('input[class=conf]').change(function() { Admin.save(); }); $("#clickme").click(function(){ Player.ytplayer.playVideo(); }); $('#listImport').on("submit", function(){ Search.importPlaylist(document.getElementById("import").value); }); $(window).focus(function(){ if(unseen) { $("#favicon").attr("href", "static/images/favicon.png"); unseen = false; } }); $(document).on("change", "#autoplay", function() { if(this.checked) { $("#embed-area").val(''); } else { $("#embed-area").val(''); } }); $(document).on("click", "#chat-btn", function(){ $("#text-chat-input").focus(); //$("#chat-btn").css("color", "white"); $("#chat-btn i").css("opacity", 1); clearInterval(blink_interval); blink_interval_exists = false; unseen = false; $("#favicon").attr("href", "static/images/favicon.png"); }); $(document).on("click", ".chat-tab", function(){ $("#text-chat-input").focus(); }); $(document).on("click", "#skip", function(e){ e.preventDefault(); List.skip(); }); $(document).on("click", "#chan", function(e){ e.preventDefault(); List.show(); }); $(document).on("submit", "#adminForm", function(e){ e.preventDefault(); Admin.pass_save(); }); $(document).on("submit", "#chatForm", function(){ Chat.chat(document.getElementById("chatForm").input); }); $(document).on("click", "#shuffle", function(e) { e.preventDefault(); Admin.shuffle(); }); $(document).on("click", "#search-btn", function(e) { e.preventDefault(); Search.showSearch(); }); $(document).on("click", "#song-title", function(e) { e.preventDefault(); Search.showSearch(); }); $(document).on("click", "#admin-lock", function(e) { e.preventDefault(); Admin.log_out(); }); $(document).on("click", "#closeSettings", function(e) { e.preventDefault(); Admin.hide_settings(); }); $(document).on( "click", ".result-object", function(e){ var $html = $(e.target); var substr = $html.prop('outerHTML').substring(0,4); if(substr != "= 48 && adminpass != "")) && $("#wrapper").scrollTop() > 0){ $("#top-button").removeClass("hide"); Helper.addClass("#bottom-button", "hide"); }else if(y >= $("#playlist").height() - 18 && $("#wrapper").scrollTop() < $("#wrapper")[0].scrollHeight - $("#wrapper").height() - 1){ $("#bottom-button").removeClass("hide"); Helper.addClass("#top-button", "hide"); }else{ Helper.addClass("#bottom-button", "hide"); Helper.addClass("#top-button", "hide"); } }); $(document).on("mouseleave", "#playlist", function(){ Helper.addClass("#bottom-button", "hide"); Helper.addClass("#top-button", "hide"); }); $(document).on("click", "#top-button", function(){ List.scrollTop(); }); $(document).on("click", "#bottom-button", function(){ List.scrollBottom(); }); function share_link_modifier_channel(){ $("#facebook-code-link").attr("href", "https://www.facebook.com/sharer/sharer.php?u=https://zoff.no/" + chan.toLowerCase()); $("#facebook-code-link").attr("onclick", "window.open('https://www.facebook.com/sharer/sharer.php?u=https://zoff.no/" + chan.toLowerCase() + "', 'Share Playlist','width=600,height=300'); return false;"); $("#twitter-code-link").attr("href", "http://twitter.com/intent/tweet?url=https://zoff.no/" + chan.toLowerCase() + "&text=Check%20out%20this%20playlist%20" + chan.toLowerCase() + "%20on%20Zöff!&via=zoffmusic") $("#twitter-code-link").attr("onclick", "window.open('http://twitter.com/intent/tweet?url=https://zoff.no/" + chan.toLowerCase() + "/&text=Check%20out%20this%20playlist%20" + chan.toLowerCase() + "%20on%20Zöff!&via=zoffmusic','Share Playlist','width=600,height=300'); return false;"); $("#qr-code-link").attr("href", "//chart.googleapis.com/chart?chs=500x500&cht=qr&chl=https://zoff.no/" + chan.toLowerCase() + "&choe=UTF-8&chld=L%7C1"); $("#qr-code-image-link").attr("src", "//chart.googleapis.com/chart?chs=150x150&cht=qr&chl=https://zoff.no/" + chan.toLowerCase() + "&choe=UTF-8&chld=L%7C1"); } function onepage_load(){ var url_split = window.location.href.split("/"); if(url_split[3].substr(0,1) != "#!" && url_split[3] != "" && !(url_split.length == 5 && url_split[4].substr(0,1) == "#")){ socket.emit("change_channel"); Admin.beginning = true; chan = url_split[3].replace("#", ""); $("#chan").html(Helper.upperFirst(chan)); w_p = true; socket.emit("list", chan.toLowerCase()); }else if(url_split[3] == ""){ $("#channel-load").css("display", "block"); window.scrollTo(0, 0); Player.stopInterval = true; Admin.display_logged_out(); Admin.beginning = true; chan = ""; began = false; durationBegun = false; $("#embed-button").css("display", "none"); socket.removeAllListeners(); $.ajax({ url: "php/nochan.php", success: function(e){ socket.disconnect(); document.getElementById("volume-button").removeEventListener("click", Playercontrols.mute_video); document.getElementById("playpause").removeEventListener("click", Playercontrols.play_pause); document.getElementById("fullscreen").removeEventListener("click", Playercontrols.fullscreen); video_id = ""; song_title = ""; $("meta[name=theme-color]").attr("content", "#2D2D2D"); Player.ytplayer.destroy(); $(".drag-target").remove(); $("#sidenav-overlay").remove(); $("main").attr("class", "center-align container"); $("body").attr("id", ""); $("body").attr("style", ""); $("header").html($($(e)[57]).html()); $($(e)[59]).insertAfter("header"); $($(e)[61]).insertAfter(".mega"); $("main").html($($(e)[65]).html()); if($("#alreadyfp").length == 1){ window.initfp(); }else { window.fromChannel = true; window.initfp(); } if($("#alreadychannel").length == 0){ $("head").append("
    "; num++; //if(num>19)break; } document.getElementById("preloader").style.display = "none"; document.getElementById("searches").innerHTML = output; //Materialize.fadeInImage('#channels'); $("#channels").fadeIn(800); $("#searchFrontpage").focus(); }, sortFunction: function(a, b) { var o1 = a[0]; var o2 = b[0]; var p1 = a[4]; var p2 = b[4]; if (o1 < o2) return 1; if (o1 > o2) return -1; if (p1 < p2) return 1; if (p1 > p2) return -1; return 0; }, getCookie: function(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i= list.length || i >= 8) i = 0; var id = list[i][1]; if(Nochan.blob_list[i] !== undefined){ //$(".room-namer").css("opacity", 0); setTimeout(function(){ if(frontpage){ $("#mega-background").css("background", "url(data:image/png;base64,"+Nochan.blob_list[i]+")"); $("#mega-background").css("background-size" , "200%"); $("#mega-background").css("opacity", 1); $("#searchFrontpage").attr("placeholder", list[i][3]); //$(".room-namer").css("opacity", 1); } },500); }else{ var img = new Image(); img.src = "/static/images/thumbnails/"+id+".jpg"; img.onerror = function(){ // Failed to load $.ajax({ type: "POST", data: {id:id}, url: "/php/imageblob.php", success: function(data){ Nochan.blob_list.push(data); //data will contain the vote count echoed by the controller i.e. //$(".room-namer").css("opacity", 0); setTimeout(function(){ $("#mega-background").css("background", "url(data:image/png;base64,"+data+")"); $("#mega-background").css("background-size" , "200%"); $("#mega-background").css("opacity", 1); $("#searchFrontpage").attr("placeholder", list[i][3]); //$(".room-namer").css("opacity", 1); },500); //then append the result where ever you want like //$("span#votes_number").html(data); //data will be containing the vote count which you have echoed from the controller } }); }; img.onload = function(){ // Loaded successfully $("#mega-background").css("background", "url("+img.src+")"); $("#mega-background").css("background-size" , "200%"); $("#mega-background").css("opacity", 1); $("#searchFrontpage").attr("placeholder", list[i][3]); }; } setTimeout(function(){ if(Nochan.times_rotated == 50 && frontpage){ Nochan.times_rotated = 0; i = 0; socket.emit("frontpage_lists"); }else if(frontpage){ Nochan.times_rotated += 1; Nochan.add_backdrop(list, i+1); } },6000); }, start_snowfall: function(){ setTimeout(function(){ var x = Math.floor((Math.random() * window.innerWidth) + 1); var snow = document.createElement("div"); var parent = document.getElementsByClassName("mega")[0]; snow.className = "snow"; //snow.attr("left", x); snow.style.left = x+"px"; snow.style.top = "0px"; parent.appendChild(snow); Nochan.fall_snow(snow); Nochan.start_snowfall(); }, 800); }, fall_snow: function(corn){ corn.style.top = (parseInt(corn.style.top.replace("px", ""))+2)+"px"; if(parseInt(corn.style.top.replace("px", "")) < document.getElementById("mega-background").offsetHeight-2.5){ setTimeout(function(){ Nochan.fall_snow(corn); },50); }else{ corn.remove(); } }, set_viewers: function(viewers){ if(viewers > 0){ var to_add = viewers > 1 ? "listeners" : "listener"; $("#frontpage-viewer-counter").html(viewers + " " + to_add); } }, to_channel: function(chan, popstate){ $("#channel-load").css("display", "block"); window.scrollTo(0, 0); frontpage = false; socket.removeAllListeners(); $.ajax({ url: chan + "/php/index.php", success: function(e){ $("body").css("background-color", "#2d2d2d"); socket.disconnect(); if(!popstate) window.history.pushState("to the channel!", "Title", "/" + chan + "/"); $(".mega").remove(); $(".mobile-search").remove(); $("main").attr("class", "container center-align main"); $("body").attr("id", "channelpage"); $("header").html($($(e)[57]).html()); $("main").html($($(e)[61]).html()); $("#search").attr("placeholder", "Find song on YouTube..."); if($("#alreadychannel").length == 1){ window.init(); }else{ window.fromFront = true; window.init(); } if($("#alreadyfp").length == 0) $("head").append("
    "); } }); } } String.prototype.capitalizeFirstLetter = function() { return this.charAt(0).toUpperCase() + this.slice(1); } $().ready(function(){ if(!window.fromChannel && window.location.pathname == "/") initfp(); }); function share_link_modifier_frontpage(){ $("#facebook-code-link").attr("href", "https://www.facebook.com/sharer/sharer.php?u=https://zoff.no/"); $("#facebook-code-link").attr("onclick", "window.open('https://www.facebook.com/sharer/sharer.php?u=https://zoff.no/', 'Share Zöff','width=600,height=300'); return false;"); $("#twitter-code-link").attr("href", "http://twitter.com/intent/tweet?url=https://zoff.no/&text=Check%20out%20Zöff!&via=zoffmusic") $("#twitter-code-link").attr("onclick", "window.open('http://twitter.com/intent/tweet?url=https://zoff.no/&text=Check%20out%20Zöff!&via=zoffmusic','Share Playlist','width=600,height=300'); return false;"); $("#qr-code-link").attr("href", "//chart.googleapis.com/chart?chs=500x500&cht=qr&chl=https://zoff.no/&choe=UTF-8&chld=L%7C1"); $("#qr-code-image-link").attr("src", "//chart.googleapis.com/chart?chs=150x150&cht=qr&chl=https://zoff.no/&choe=UTF-8&chld=L%7C1"); } function initfp(){ var date = new Date(); if(date.getMonth() == 3 && date.getDate() == 1){ $(".mega").css("-webkit-transform", "rotate(180deg)"); $(".mega").css("-moz-transform", "rotate(180deg)"); //Materialize.toast('

    We suck at pranks..Agreed

    ', 100000); } window.onpopstate = function(e){ var url_split = window.location.href.split("/"); if(url_split[3] != "" && url_split[3].substring(0,1) != "#"){ Nochan.to_channel(url_split[3], true); } } channel_list = $("#channel-list-container").html(); share_link_modifier_frontpage(); var connection_options = { 'secure': true, 'force new connection': true }; if(window.location.hostname == "zoff.no") add = "https://zoff.no"; else add = "localhost"; socket = io.connect(''+add+':8880', connection_options); socket.on('playlists', function(msg){ $("#channels").empty(); Nochan.populate_channels(msg.channels); Nochan.set_viewers(msg.viewers); }); socket.emit('frontpage_lists'); $("#channel-load").css("display", "none"); //Materialize.toast("Try out our new feature, remote!", 8000) if(window.location.hash == "#donation") { window.location.hash = "#"; $('#donation').openModal() } //window.channel_list = channel_list; if(!localStorage["ok_cookie"]) Materialize.toast("We're using cookies to enhance your experience! ok", 10000); var pad = 0; document.getElementById("zicon").addEventListener("click", function(){ pad+=10; document.getElementById("zicon").style.paddingLeft = pad+"%"; if(pad >= 100) window.location.href = 'http://etys.no'; }); if(!window.mobilecheck() && Nochan.winter) Nochan.start_snowfall(); /*if(navigator.userAgent.toLowerCase().indexOf("android") > -1){ //console.log("android"); if(Nochan.getCookie("show_prompt") == ""){ var r = confirm("Do you want to download the native app for this webpage?"); if(r) window.location.href = 'https://play.google.com/store/apps/details?id=no.lqasse.zoff'; else { var d = new Date(); d.setTime(d.getTime() + (10*24*60*60*1000)); var expires = "expires="+d.toUTCString(); document.cookie = "show_prompt=false;"+expires; } } }*/ git_info = $.ajax({ type: "GET", url: "https://api.github.com/repos/zoff-music/zoff/commits", async: false }).responseText; git_info = $.parseJSON(git_info); $("#latest-commit").html("Latest Commit:
    " + git_info[0].commit.author.date.substring(0,10) + ": " + git_info[0].committer.login + "
    " + git_info[0].sha.substring(0,10) + ": " + git_info[0].commit.message+" 1 ? "viewers" : "viewer"; var title = decodeURIComponent(titt); var elem = document.getElementById('song-title'); var getTitleViews = document.getElementById('viewers'); document.title = title + " • Zöff / "+chan; elem.innerHTML = title; getTitleViews.innerHTML = v + " " + outPutWord; elem.title = title + " • " + v + " " + outPutWord; }, errorHandler: function(newState) { if(newState.data == 5 || newState.data == 100 || newState.data == 101 || newState.data == 150) { /*if(Player.count == 2){ Player.count = 0;*/ /*console.log("Before: " + Player.before_load); console.log("Now: " + video_id); console.log("After: " + Player.after_load); console.log(Player.before_load == Player.ytplayer.getVideoUrl);*/ curr_playing = Player.ytplayer.getVideoUrl().replace("https://www.youtube.com/watch?v=", ""); socket.emit("skip", {error: newState.data, id: video_id, pass: adminpass}); //console.log(video_id, Player.ytplayer.getVideoUrl(), Player.ytplayer.getPlayerState()); /*}else{ setTimeout(function(){ Player.ytplayer.loadVideoById(video_id); Player.count ++; }, Math.floor((Math.random() * 100) + 1)); }*/ }else if(video_id !== undefined) Player.ytplayer.loadVideoById(video_id); }, onPlayerReady: function(event) { $("#channel-load").css("display", "none"); try{ beginning = true; player_ready = true; if(!window.MSStream) { $("#player").css("opacity", "1"); $("#controls").css("opacity", "1"); $(".playlist").css("opacity", "1"); Player.ytplayer.loadVideoById(video_id); if(autoplay && !window.mobilecheck()) Player.ytplayer.playVideo(); if(!durationBegun) Player.durationSetter(); if(embed){ setTimeout(function(){ Player.ytplayer.seekTo(seekTo); if(!autoplay){ Player.ytplayer.pauseVideo(); Playercontrols.play_pause_show(); } }, 1000); }else Player.ytplayer.seekTo(seekTo); } Player.readyLooks(); Playercontrols.initYoutubeControls(Player.ytplayer); Playercontrols.initSlider(); Player.ytplayer.setVolume(Crypt.get_volume()); $(".video-container").removeClass("no-opacity"); }catch(e){} }, readyLooks: function() { Player.setBGimage(video_id); }, setBGimage: function(id){ if(id !== undefined && !embed) { var img = new Image(); img.onload = function () { var colorThief = new ColorThief(); var color = colorThief.getColor(img); document.getElementsByTagName("body")[0].style.backgroundColor = Helper.rgbToHsl(color); /*document.getElementById("top-button").style.backgroundColor = Helper.rgbToHsl(color); document.getElementById("bottom-button").style.backgroundColor = Helper.rgbToHsl(color);*/ $("meta[name=theme-color]").attr("content", Helper.rgbToHex(color[0], color[1], color[2])); }; img.crossOrigin = 'Anonymous'; img.src = 'https://zoff.no:8080/https://img.youtube.com/vi/'+id+'/mqdefault.jpg'; } }, set_width: function(val){ $(".video-container").width(val); }, notifyUser: function(id, title) { title = title.replace(/\\\'/g, "'").replace(/"/g,"'").replace(/&/g,"&"); if (Notification.permission === "granted" && document.hidden) { var notification = new Notification("Now Playing", {body: title, icon: "http://i.ytimg.com/vi/"+id+"/mqdefault.jpg", iconUrl: "http://i.ytimg.com/vi/"+id+"/mqdefault.jpg"}); notification.onclick = function(x) { window.focus(); this.cancel(); }; setTimeout(function(){ notification.close(); },5000); } }, setup_all_listeners: function() { socket.on("get_list", function(){ socket.emit('list', chan.toLowerCase()); }); Player.setup_youtube_listener(chan); Admin.admin_listener(); Chat.setup_chat_listener(chan); Chat.allchat_listener(); List.channel_listener(); }, onYouTubeIframeAPIReady: function() { Player.ytplayer = new YT.Player('player', { videoId: video_id, playerVars: { rel:"0", wmode:"transparent", controls: "0" , iv_load_policy: "3", theme:"light", color:"white", showinfo: 0}, events: { 'onReady': Player.onPlayerReady, 'onStateChange': Player.onPlayerStateChange, 'onError': Player.errorHandler } }); //Youtube.durationSetter(); }, durationSetter: function() { /*try{ //duration = Player.ytplayer.getDuration(); }catch(e){};*/ if(duration != undefined){ try{ if(!Player.stopInterval) durationBegun = true; dMinutes = Math.floor(duration / 60); dSeconds = duration - dMinutes * 60; currDurr = Player.ytplayer.getCurrentTime() != undefined ? Math.floor(Player.ytplayer.getCurrentTime()) : seekTo; if(currDurr > duration) currDurr = duration; minutes = Math.floor(currDurr / 60); seconds = currDurr - (minutes * 60); document.getElementById("duration").innerHTML = Helper.pad(minutes)+":"+Helper.pad(seconds)+" / "+Helper.pad(dMinutes)+":"+Helper.pad(dSeconds); per = (100 / duration) * currDurr; if(per >= 100) per = 100; else if(duration == 0) per = 0; $("#bar").width(per+"%"); }catch(e){ } } if(!Player.stopInterval) setTimeout(Player.durationSetter, 1000); }, loadPlayer: function() { if($("script[src='https://www.youtube.com/iframe_api']")["length"] == 1){ Player.onYouTubeIframeAPIReady(); }else{ tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); } } } var Playercontrols = { stopInterval: false, initYoutubeControls: function() { if(window.mobilecheck() && !/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream){ $("#controls").appendTo("#playbar"); } Playercontrols.initControls(); }, initControls: function() { document.getElementById("volume-button").addEventListener("click", Playercontrols.mute_video); document.getElementById("playpause").addEventListener("click", Playercontrols.play_pause); document.getElementById("fullscreen").addEventListener("click", Playercontrols.fullscreen); }, initSlider: function() { try{ vol = (Crypt.get_volume()); }catch(e){} $("#volume").slider({ min: 0, max: 100, value: vol, range: "min", animate: true, slide: function(event, ui) { Playercontrols.setVolume(ui.value); //localStorage.setItem("volume", ui.value); try{Crypt.set_volume(ui.value);}catch(e){} } }); Playercontrols.choose_button(vol, false); //$("#volume").slider("value", ytplayer.getVolume()); }, fullscreen: function() { var playerElement = document.getElementById("player"); var requestFullScreen = playerElement.requestFullScreen || playerElement.mozRequestFullScreen || playerElement.webkitRequestFullScreen; if (requestFullScreen) { requestFullScreen.bind(playerElement)(); } }, play_pause: function() { if(Player.ytplayer.getPlayerState() == 1) { Player.ytplayer.pauseVideo(); if(window.mobilecheck() && !/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream){ document.getElementById("player").style.display = "none"; $(".page-footer").toggleClass("padding-bottom-extra"); } }else if(Player.ytplayer.getPlayerState() == 2 || Player.ytplayer.getPlayerState() == 0) { Player.ytplayer.playVideo(); if(window.mobilecheck() && !/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream){ document.getElementById("player").style.display = "block"; $(".page-footer").toggleClass("padding-bottom-extra"); } } }, play_pause_show: function() { if(document.getElementById("pause").className.split(" ").length == 1) $("#pause").toggleClass("hide"); if(document.getElementById("play").className.split(" ").length == 2) $("#play").toggleClass("hide"); }, settings: function() { $("#qS").toggleClass("hide"); }, changeQuality: function(wantedQ) { if(Player.ytplayer.getPlaybackQuality != wantedQ) { Player.ytplayer.setPlaybackQuality(wantedQ); Player.ytplayer.getPlaybackQuality(); } $("#qS").toggleClass("hide"); }, mute_video: function() { if(!Player.ytplayer.isMuted()) { Playercontrols.choose_button(0, true); Player.ytplayer.mute(); }else { Player.ytplayer.unMute(); Playercontrols.choose_button(Player.ytplayer.getVolume(), false); } }, setVolume: function(vol) { Player.ytplayer.setVolume(vol); Playercontrols.choose_button(vol, false); if(Player.ytplayer.isMuted()) Player.ytplayer.unMute(); }, choose_button: function(vol, mute) { if(!mute){ if(vol >= 0 && vol <= 33){ if(document.getElementById("v-full").className.split(" ").length == 1) $("#v-full").toggleClass("hide"); if(document.getElementById("v-medium").className.split(" ").length == 1) $("#v-medium").toggleClass("hide"); if(document.getElementById("v-low").className.split(" ").length == 2) $("#v-low").toggleClass("hide"); if(document.getElementById("v-mute").className.split(" ").length == 1) $("#v-mute").toggleClass("hide"); }else if(vol >= 34 && vol <= 66){ if(document.getElementById("v-full").className.split(" ").length == 1) $("#v-full").toggleClass("hide"); if(document.getElementById("v-medium").className.split(" ").length == 2) $("#v-medium").toggleClass("hide"); if(document.getElementById("v-low").className.split(" ").length == 1) $("#v-low").toggleClass("hide"); if(document.getElementById("v-mute").className.split(" ").length == 1) $("#v-mute").toggleClass("hide"); }else if(vol >= 67 && vol <= 100){ if(document.getElementById("v-full").className.split(" ").length == 2) $("#v-full").toggleClass("hide"); if(document.getElementById("v-medium").className.split(" ").length == 1) $("#v-medium").toggleClass("hide"); if(document.getElementById("v-low").className.split(" ").length == 1) $("#v-low").toggleClass("hide"); if(document.getElementById("v-mute").className.split(" ").length == 1) $("#v-mute").toggleClass("hide"); } }else { if(document.getElementById("v-full").className.split(" ").length == 1) $("#v-full").toggleClass("hide"); if(document.getElementById("v-medium").className.split(" ").length == 1) $("#v-medium").toggleClass("hide"); if(document.getElementById("v-low").className.split(" ").length == 1) $("#v-low").toggleClass("hide"); if(document.getElementById("v-mute").className.split(" ").length == 2) $("#v-mute").toggleClass("hide"); } }, playPause: function() { state = Player.ytplayer.getPlayerState(); button = document.getElementById("playpause"); if(state == 1) { Player.ytplayer.pauseVideo(); }else if(state == 2) { Player.ytplayer.playVideo(); } }, volumeOptions: function() { if(Player.ytplayer.isMuted()) { Player.ytplayer.unMute(); vol = Player.ytplayer.getVolume(); $("#volume").slider("value", Player.ytplayer.getVolume()); } else { Player.ytplayer.mute(); $("#volume").slider("value", 0); } }, hoverMute: function(foo) { vol = Player.ytplayer.getVolume(); } } var Search = { showSearch: function(){ $("#search-wrapper").toggleClass("hide"); if(window.mobilecheck()) { $(".search_input").focus(); } $("#song-title").toggleClass("hide"); $("#results").toggleClass("hide"); $("#results").empty(); $("#search-btn i").toggleClass("mdi-navigation-close"); $("#search-btn i").toggleClass("mdi-action-search"); $("#search").focus(); }, search: function(search_input){ if(result_html == undefined || empty_results_html == undefined) { result_html = $("#temp-results-container"); empty_results_html = $("#empty-results-container").html(); } $(".search_results").html(''); if(window.search_input !== ""){ searching = true; var keyword= encodeURIComponent(window.search_input); //response= x var yt_url = "https://www.googleapis.com/youtube/v3/search?key="+api_key+"&videoEmbeddable=true&part=id&fields=items(id)&type=video&order=viewCount&safeSearch=none&maxResults=25"; yt_url+="&q="+keyword; if(music)yt_url+="&videoCategoryId=10"; var vid_url = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key="+api_key+"&id="; if(Helper.contains($("#search_loader").attr("class").split(" "), "hide")) $("#search_loader").removeClass("hide"); if(Helper.contains($("#results").attr("class").split(" "), "hide")) $("#results").removeClass("hide"); $.ajax({ type: "GET", url: yt_url, dataType:"jsonp", success: function(response){ if(response.items.length == 0) { $("").appendTo($("#results")).show("blind", 83.33); if(!Helper.contains($("#search_loader").attr("class").split(" "), "hide")) $("#search_loader").addClass("hide"); }else if(response.items){ //get list of IDs and make new request for video info $.each(response.items, function(i,data) { vid_url += data.id.videoId+","; }); $.ajax({ type: "GET", url: vid_url, dataType:"jsonp", success: function(response){ var output = ""; var pre_result = $(result_html); //$("#results").append(result_html); $.each(response.items, function(i,song) { var duration=song.contentDetails.duration; secs=Search.durationToSeconds(duration) if(!longsongs || secs<720){ title=song.snippet.title; enc_title=title;//encodeURIComponent(title).replace(/'/g, "\\\'"); id=song.id; duration = duration.replace("PT","").replace("H","h ").replace("M","m ").replace("S","s") thumb=song.snippet.thumbnails.medium.url; //$("#results").append(result_html); var songs = pre_result; songs.find(".search-title").text(title); songs.find(".result_info").text(duration); songs.find(".thumb").attr("data-original", thumb); //songs.find(".add-many").attr("onclick", "submit('"+id+"','"+enc_title+"',"+secs+");"); songs.find("#add-many").attr("data-video-id", id); songs.find("#add-many").attr("data-video-title", enc_title); songs.find("#add-many").attr("data-video-length", secs); //$($(songs).find("div")[0]).attr("onclick", "submitAndClose('"+id+"','"+enc_title+"',"+secs+");"); songs.find("#temp-results").attr("data-video-id", id); songs.find("#temp-results").attr("data-video-title", enc_title); songs.find("#temp-results").attr("data-video-length", secs); //$($(songs).find("div")[0]).attr("id", id) output += songs.html(); } }); $("").appendTo($("#results")).show("blind", (response.items.length-1) * 83.33); setTimeout(function(){$(".thumb").lazyload({container: $("#results")})}, 250); if(!Helper.contains($("#search_loader").attr("class").split(" "), "hide")) $("#search_loader").addClass("hide"); $(".add-many").click(function(e) { e.preventDefault(); e.stopPropagation(); return false; }); } }); } } }); }else{ $(".main").removeClass("blurT"); $("#controls").removeClass("blurT"); $(".main").removeClass("clickthrough"); } }, submitAndClose: function(id,title,duration){ Search.submit(id,title, duration); $("#results").html(''); Search.showSearch(); document.getElementById("search").value = ""; $("#results").html = ""; $(".main").removeClass("blurT"); $("#controls").removeClass("blurT"); $(".main").removeClass("clickthrough"); }, importPlaylist: function(pId,pageToken){ token = ""; if(pageToken !== undefined) token = "&pageToken="+pageToken; playlist_url = "https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails&maxResults=49&key="+api_key+"&playlistId="+pId+token; $.ajax({ type: "GET", url: playlist_url, dataType:"jsonp", success: function(response) { var ids=""; Search.addVideos(response.items[0].contentDetails.videoId); $.each(response.items, function(i,data) { ids+=data.contentDetails.videoId+","; }); Search.addVideos(ids); if(response.nextPageToken) Search.importPlaylist(pId, response.nextPageToken); document.getElementById("import").value = ""; } }); }, addVideos: function(ids){ var request_url="https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key=***REMOVED***&id="; request_url += ids; $.ajax({ type: "POST", url: request_url, dataType:"jsonp", success: function(response){ $.each(response.items, function(i,song) { var duration=Search.durationToSeconds(song.contentDetails.duration); if(!longsongs || duration<720){ enc_title= song.snippet.title;//encodeURIComponent(song.snippet.title); Search.submit(song.id, enc_title, duration); } }); } }); }, submit: function(id,title,duration){ socket.emit("add", [id, decodeURIComponent(title), adminpass, duration]); }, durationToSeconds: function(duration) { var matches = duration.match(time_regex); hours= parseInt(matches[12])||0, minutes= parseInt(matches[14])||0, seconds= parseInt(matches[16])||0 return hours*60*60+minutes*60+seconds; } } var Suggestions = { catchUserSuggests: function(params, single){ if(single){ Suggestions.createSuggested(params); }else{ for(x in params){ Suggestions.createSuggested(params[x]); } } Suggestions.checkUserEmpty(); }, createSuggested: function(params){ var secs = params.duration; var video_id = params.id; var video_title = params.title; var minutes = Math.floor(secs / 60); var seconds = secs - minutes * 60; duration = minutes+"m " + seconds + "s"; var song = List.generateSong({id: video_id, title: video_title, length: secs, duration: duration}, false, false, false, true); $("#user-suggest-html").append(song); }, fetchYoutubeSuggests: function(id){ var get_url = "https://www.googleapis.com/youtube/v3/search?part=snippet&relatedToVideoId="+id+"&type=video&key="+api_key; var video_urls = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key="+api_key+"&id="; $.ajax({ type: "GET", url: get_url, dataType:"jsonp", success: function(response) { $.each(response.items.slice(0,5), function(i,data){ video_urls += data.id.videoId+","; }); $.ajax({ type: "GET", url: video_urls, dataType: "jsonp", success: function(response) { $("#suggest-song-html").empty(); $.each(response.items, function(i,song) { var duration = song.contentDetails.duration; var secs = Search.durationToSeconds(duration); var video_id = song.id; var video_title = song.snippet.title; duration = duration.replace("PT","").replace("H","h ").replace("M","m ").replace("S","s") $("#suggest-song-html").append(List.generateSong({id: video_id, title: video_title, length: secs, duration: duration}, false, false, false)); }); } }); } }); }, checkUserEmpty: function(){ var length = $("#user-suggest-html").children().length if(length == 0){ if(!Helper.contains($("#user_suggests").attr("class").split(" "), "hide")) $("#user_suggests").addClass("hide"); }else{ $("#user_suggests").removeClass("hide"); } }, }