var feedbackData;
function gup( name, url ) {
if (!url) url = location.href;
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^]*)";
var regex = new RegExp( regexS );
var results = regex.exec( url );
return results == null ? null : results[1];
}
function getSpotifyInfo(title, cb, artist) {
var q = "";
q = title;
if (artist !== undefined) {
q += " artist:" + artist;
}
$.ajax({
type: "GET",
url: 'https://api.spotify.com/v1/search?q=' + encodeURIComponent(q) + '&type=track',
applicationType: "application/json",
contentType: "json",
success: function (data) {
cb(data);
}
});
}
function executeCommand(command, params){
if (command === "help" || command === "commands") {
$('#helpModal').modal('show');
return true;
} else if (command === "volume") {
if (params.length === 1) {
var volume = Number(params[0]);
if (volume >= 0 || volume <= 100) {
if (volume === 0) {
$("#volume-icon").removeClass("fa-volume-down").addClass("fa-volume-off")
} else {
$("#volume-icon").removeClass("fa-volume-off").addClass("fa-volume-down")
}
$("#volume-slider").slider("setValue", volume);
if (YTPlayer !== undefined) {
YTPlayer.setVolume(volume);
localStorage.setItem("volume", volume);
}
return true;
}
}
} else if(command === "mute"){
$("#volume-slider").slider("setValue", 0);
$("#volume-icon").removeClass("fa-volume-down").addClass("fa-volume-off");
if (YTPlayer !== undefined) {
YTPlayer.setVolume(0);
localStorage.setItem("volume", 0);
}
} else if(command === "ban"){
var user = params[0];
var time = params[1];
var reason = params[2];
Meteor.call("banUser", user, time, reason, function(err, res){
if(err){
console.log(err);
}
});
} else if(command === "silence"){
var user = params[0];
var time = params[1];
Meteor.call("muteUser", user, time, function(err, res){
if(err){
console.log(err);
}
});
} else if(command === "unban"){
var user = params[0];
Meteor.call("unbanUser", user, function(err, res){
if(err){
console.log(err);
}
});
} else if(command === "unsilence"){
var user = params[0];
Meteor.call("unsilenceUser", user, function(err, res){
if(err){
console.log(err);
}
});
} else if(command === "pause"){
Meteor.call("pauseRoom", Session.get("type"), function(err, res){
if(err){
console.log(err);
}
});
} else if(command === "resume"){
Meteor.call("resumeRoom", Session.get("type"), function(err, res){
if(err){
console.log(err);
}
});
} else if(command === "shuffle"){
Meteor.call("shufflePlaylist", Session.get("type"), function(err, res){
if(err){
console.log(err);
}
});
} else if(command === "skip"){
Meteor.call("skipSong", Session.get("type"), function(err, res){
if(err){
console.log(err);
}
});
}
}
function sendMessage() {
var message = $("#chat-input").val();
if (!$("#chat-input").hasClass("disabled")) {
if (message.length > 0 && message[0] !== " ") {
if (message[0] === "/") {
message = message.split("");
message.shift();
message = message.join("");
var params = message.split(" ");
params = params.map(function(param) {
return param.replace(/\r?\n|\r/g, "");
});
var command = params.shift();
command = command.replace(/\r?\n|\r/g, "");
if (executeCommand(command, params)) {
$("#chat-input").val("");
} else {
$("#chat-input").val("");
}
} else {
$("#chat-input").addClass("disabled");
$("#chat-input").attr("disabled", "");
Meteor.call("sendMessage", Session.get("type"), message, function (err, res) {
if(err){
$("#chat-input").val("");
$("#chat-input").removeAttr("disabled");
$("#chat-input").removeClass("disabled");
}
if (res) {
$("#chat-input").val("");
$("#chat-input").removeAttr("disabled");
$("#chat-input").removeClass("disabled");
}
});
}
}
}
}
function sendMessageGlobal() {
var message = $("#chat-message").val();
if (!$("#chat-message").hasClass("disabled")) {
if (message.length > 0 && message[0] !== " ") {
if (message[0] === "/") {
message = message.split("");
message.shift();
message = message.join("");
var params = message.split(" ");
var command = params.shift();
command = command.replace(/\r?\n|\r/g, "");
if (executeCommand(command, params)) {
$("#chat-message").val("");
} else {
$("#chat-message").val("");
}
} else {
Meteor.call("sendMessage", "global", message, function (err, res) {
if (res) {
$("#chat-message").val("");
}
});
}
}
}
}
Template.admin.events({
"click a": function(e) {
var target = $(e.target);
if (target.hasClass("activate-alert-button") || target.parent().hasClass("activate-alert-button")) {
var id = target.data("id") || target.parent().data("id");
Meteor.call("activateAlert", id);
} else if (target.hasClass("deactivate-alert-button") || target.parent().hasClass("deactivate-alert-button")) {
var id = target.data("id") || target.parent().data("id");
Meteor.call("deactivateAlert", id);
}
},
"click #croom_create": function() {
Meteor.call("createRoom", $("#croom_display").val(), $("#croom_tag").val(), $("#croom_private").prop("checked"), $("#croom_desc").val(), function (err, res) {
if (err) {
var $toastContent = $('Room not added. ' + err.reason + '');
Materialize.toast($toastContent, 8000);
} else {
window.location = "/" + $("#croom_tag").val();
}
});
},
"click #submit-alert": function(){
var alertDesc = $("#alert-desc").val()
if(alertDesc !== ""){
Meteor.call("addAlert", alertDesc);
}
},
"click .delete-alert-button": function(e) {
var target = $(e.target);
var id = $(e.target).data("id") || target.parent().data("id");
Meteor.call("deleteAlert", id);
}
});
Template.feedback.events({
"click #feedback_submit": function(){
if(Meteor.userId()){
if($("#feedback_message").val().length !== 0 && $("#feedback_message").hasClass("invalid") === false){
Meteor.call("sendFeedback", $("#feedback_message").val());
$("#feedback_message").val("");
$("#createFeedback").closeModal()
} else{
var $toastContent = $('Feedback not sent. Possible reasons include:
');
Materialize.toast($toastContent, 8000);
}
} else {
var $toastContent = $('Feedback not sent. You must be logged in.');
Materialize.toast($toastContent, 4000);
}
},
"click .upvote": function(){
var message = $(this).parent("card").prevObject[0].message;
Meteor.call("upvoteFeedback", message);
},
"click #delete": function(){
var message = $(this).parent("card").prevObject[0].message;
Meteor.call("deleteFeedback", message);
},
"click #edit": function(){
$("#editModal").click()
var data = Feedback.findOne({"message": $(this).parent("card").prevObject[0].message});
feedbackData = data.message;
$("#edit_feedback_message").val(data.message);
},
"click #edit_feedback_submit": function(){
var oldMessage = feedbackData;
var newMessage = $("#edit_feedback_message").val()
$("#edit_feedback_message").val("")
Meteor.call("updateFeedback", oldMessage, newMessage);
$("#editFeedback").closeModal();
}
});
Template.header.events({
"click .logout": function(e){
e.preventDefault();
Meteor.logout();
},
"click #profile": function(){
window.location = "/u/" + Meteor.user().profile.username;
}
});
Template.playlist.events({
"keyup #search-playlist": function(){
if($("#search-playlist").val().length === 0){
$(".pl-item").show();
$("#up-next").show();
} else {
$("#up-next").hide();
$(".pl-item").hide();
var input = $("#search-playlist").val().toLowerCase();
$(".pl-item .pl-title").each(function(i, el){
if($(el).text().toLowerCase().indexOf(input) !== -1){
$(el).parent(".pl-item").show();
}
})
$(".pl-item #pl-artist").each(function(i, el){
if($(el).text().toLowerCase().indexOf(input) !== -1){
$(el).parent(".pl-item").show();
}
})
}
}
});
Template.profile.events({
//Edit real name
"click #edit-name": function(){
$("#name").hide();
$("#name-div").show();
$("#edit-name").hide();
$("#cancel-edit").show();
},
"click #submit-name": function(){
var user = Meteor.user();
$("#name").show();
$("#name-div").hide();
$("#edit-name").show();
$("#cancel-edit").hide();
var realname = $("#input-name").val();
var username = user.profile.username;
$("#name").text("Name: " + realname);
$("#input-name").val("")
Meteor.call("updateRealName", realname);
},
"click #cancel-edit": function(){
$("#name").show();
$("#name-div").hide();
$("#edit-name").show();
$("#cancel-edit").hide();
$("#input-name").val("");
},
//Edit username
"click #edit-username": function(){
$("#username").hide();
$("#username-div").show();
$("#edit-username").hide();
$("#cancel-username").show();
},
"click #submit-username": function(){
var user = Meteor.user()
$("#username").show();
$("#username-div").hide();
$("#edit-username").show();
$("#cancel-username").hide();
var username = user.username;
var newUserName = $("#input-username").val();
$("#profile-name").text(newUserName)
$("#username").text("Username: " + newUserName);
$("#input-username").val("")
Meteor.call("updateUserName", newUserName);
window.location = "/u/" + newUserName;
},
"click #cancel-username": function(){
$("#username").show();
$("#username-div").hide();
$("#edit-username").show();
$("#cancel-username").hide();
$("#input-username").val("");
},
// Admins only Edit Rank
"click #edit-rank": function() {
$("#rank").hide();
$("#rank-div").show();
$("#edit-rank").hide();
$("#cancel-rank").show();
},
"click #promote-rank": function() {
var username = Session.get("username");
Meteor.call("promoteUserRank", username);
},
"click #demote-rank": function() {
var username = Session.get("username");
Meteor.call("demoteUserRank", username);
},
"click #cancel-rank": function() {
$("#rank").show();
$("#rank-div").hide();
$("#edit-rank").show();
$("#cancel-rank").hide();
}
});
var seekerBarInterval = undefined;
Template.queues.events({
/* TODO Add undo delete button */
"input #id": function() {
$("#previewPlayerContainer").addClass("hide-preview");
},
"input #img": function() {
var url = $("#img").val();
Session.set("image_url", url);
},
"click .preview-button": function(e){
Session.set("song", this);
$("#previewModal").openModal();
},
"click #previewImageButton": function() {
$("#preview-image").attr("src", Session.get("song").img);
},
"click .edit-queue-button": function(e){
Session.set("song", this);
Session.set("genre", $(e.target).data("genre"));
Session.set("type", "queue");
$("#mid").val(this.mid).change();
$("#artist").val(this.artist).change();
$("#title").val(this.title).change();
$("#img").val(this.img).change();
$("#id").val(this.id).change();
$("#likes").val(this.likes).change();
$("#dislikes").val(this.dislikes).change();
$("#duration").val(this.duration).change();
$("#skip-duration").val(this.skipDuration).change();
$("#genres").val(this.genres).change();
$("#genres").material_select();
$("#previewPlayerContainer").addClass("hide-preview");
Session.set("image_url", this.img);
Session.set("editing", true);
$("#editModal").openModal({
complete : function() {
Session.set("editing", false);
if (YTPlayer !== undefined && YTPlayer.stopVideo !== undefined) {
YTPlayer.stopVideo();
}
}
});
},
"click .add-song-button": function(e){
var genre = $(e.target).data("genre") || $(e.target).parent().data("genre");
Meteor.call("addSongToPlaylist", this, function(err) {
console.log(err);
if (err) {
var $toastContent = $('Song not added. ' + err.reason + '');
Materialize.toast($toastContent, 8000);
}
});
},
"click .deny-song-button": function(e){
var genre = $(e.target).data("genre") || $(e.target).parent().data("genre");
Meteor.call("removeSongFromQueue", this.mid);
},
"click #play": function() {
var duration = Session.get("song").duration;
var d = moment.duration(parseInt(duration), 'seconds');
$("#time-total").text(d.minutes() + ":" + ("0" + d.seconds()).slice(-2));
$("#previewPlayerContainer").removeClass("hide-preview");
var song = Session.get("song");
var id = song.id;
var volume = localStorage.getItem("volume") || 20;
if (song.duration !== 0) {
$("#play").attr("disabled", true);
$("#stop").attr("disabled", false);
$("#pause").attr("disabled", false);
$("#forward").attr("disabled", false);
if (YTPlayer === undefined) {
YTPlayer = new YT.Player("previewPlayer", {
height: 540,
width: 568,
videoId: id,
playerVars: {autoplay: 1, controls: 0, iv_load_policy: 3, showinfo: 0, fs: 0},
events: {
'onReady': function(event) {
event.target.seekTo(Number(song.skipDuration));
event.target.playVideo();
event.target.setVolume(volume);
},
'onStateChange': function(event){
if (event.data == YT.PlayerState.PAUSED) {
if (seekerBarInterval !== undefined) {
Meteor.clearInterval(seekerBarInterval);
seekerBarInterval = undefined;
}
}
// if (event.data == YT.PlayerState.UNSTARTED) {
// if (seekerBarInterval !== undefined) {
// Meteor.clearInterval(seekerBarInterval);
// seekerBarInterval = undefined;
// }
// $(".seeker-bar").css({width: "0"});
// $("#time-elapsed").text("0:00");
// $("#previewPlayerContainer").addClass("hide-preview");
// console.log("HIDE MEY STACY!!!!")
// }
if (event.data == YT.PlayerState.PLAYING) {
seekerBarInterval = Meteor.setInterval(function() {
var duration = Session.get("song").duration;
var timeElapsed = YTPlayer.getCurrentTime();
var skipDuration = Session.get("song").skipDuration;
if (duration <= (timeElapsed - skipDuration)) {
YTPlayer.stopVideo();
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
$("#previewPlayerContainer").addClass("hide-preview");
$(".seeker-bar").css({width: "0"});
$("#time-elapsed").text("0:00");
Meteor.clearInterval(seekerBarInterval);
} else {
var percentComplete = (timeElapsed - skipDuration) / duration * 100;
$(".seeker-bar").css({width: percentComplete + "%"});
var d = moment.duration(timeElapsed - skipDuration, 'seconds');
$("#time-elapsed").text(d.minutes() + ":" + ("0" + d.seconds()).slice(-2));
}
}, 100);
$("#play").attr("disabled", true);
$("#stop").attr("disabled", false);
$("#pause").attr("disabled", false);
$("#forward").attr("disabled", false);
} else {
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
}
}
}
});
} else {
if (YTPlayer.getPlayerState() === 2) {
YTPlayer.playVideo();
} else {
YTPlayer.loadVideoById(id);
YTPlayer.seekTo(Number(song.skipDuration));
}
}
$("#previewPlayerContainer").removeClass("hide-preview");
}
},
"click #stop": function() {
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
if (previewEndSongTimeout !== undefined) {
Meteor.clearTimeout(previewEndSongTimeout);
}
if (YTPlayer !== undefined && YTPlayer.stopVideo !== undefined) {
YTPlayer.stopVideo();
}
},
"click #pause": function() {
$("#play").attr("disabled", false);
$("#stop").attr("disabled", false);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
if (previewEndSongTimeout !== undefined) {
Meteor.clearTimeout(previewEndSongTimeout);
}
if (YTPlayer !== undefined && YTPlayer.pauseVideo !== undefined) {
YTPlayer.pauseVideo();
}
},
"click #forward": function() {
var error = false;
if (YTPlayer !== undefined) {
var duration = Number(Session.get("song").duration) | 0;
var skipDuration = Number(Session.get("song").skipDuration) | 0;
if (YTPlayer.getDuration() < duration + skipDuration) {
var $toastContent = $('Error. The song duration is longer than the length of the video.');
Materialize.toast($toastContent, 8000);
error = true;
} else {
YTPlayer.seekTo(skipDuration + duration - 10);
}
}
if (!error) {
if (previewEndSongTimeout !== undefined) {
Meteor.clearTimeout(previewEndSongTimeout);
}
previewEndSongTimeout = Meteor.setTimeout(function() {
if (YTPlayer !== undefined) {
YTPlayer.stopVideo();
}
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
$("#previewPlayerContainer").addClass("hide-preview");
}, 10000);
}
},
"click #get-spotify-info": function() {
var search = $("#title").val();
var artistName = $("#artist").val();
getSpotifyInfo(search, function(data) {
for(var i in data){
for(var j in data[i].items){
if(search.indexOf(data[i].items[j].name) !== -1 && artistName.indexOf(data[i].items[j].artists[0].name) !== -1){
$("#img").val(data[i].items[j].album.images[0].url).change();
$("#duration").val(data[i].items[j].duration_ms / 1000).change();
return;
}
}
}
}, artistName);
},
"click #save-song-button": function() {
var newSong = {};
newSong.mid = $("#mid").val();
newSong.id = $("#id").val();
newSong.likes = Number($("#likes").val());
newSong.dislikes = Number($("#dislikes").val());
newSong.title = $("#title").val();
newSong.artist = $("#artist").val();
newSong.img = $("#img").val();
newSong.duration = Number($("#duration").val());
newSong.skipDuration = $("#skip-duration").val();
newSong.requestedBy = Session.get("song").requestedBy;
newSong.genres = $("#genres").val() || [];
if(newSong.skipDuration === undefined){
newSong.skipDuration = 0;
}
Meteor.call("updateQueueSong", newSong.mid, newSong, function(err, res) {
if (err) {
var $toastContent = $('Song not saved. ' + err.reason + '');
Materialize.toast($toastContent, 8000);
} else {
$("#editModal").closeModal();
var $toastContent = $('Song saved! No errors were found.');
Materialize.toast($toastContent, 4000);
Session.set("song", newSong);
}
});
}
});
Template.manageStation.events({
/* TODO Add undo delete button */
"click #editDescButton": function() {
var parts = location.href.split('/');
parts.pop();
var id = parts.pop();
var type = id.toLowerCase();
var editingDesc = Session.get("editingDesc");
if (!editingDesc) {
Session.set("editingDesc", !editingDesc);
} else {
var newDesc = $("#editDesc").val();
Meteor.call("editRoomDesc", type, newDesc);
Session.set("editingDesc", !editingDesc);
}
},
"input #id": function() {
$("#previewPlayerContainer").addClass("hide-preview");
},
"input #img": function() {
var url = $("#img").val();
Session.set("image_url", url);
},
"click .preview-button": function(e){
Session.set("song", this);
$("#previewModal").openModal();
},
"click #previewImageButton": function() {
$("#preview-image").attr("src", Session.get("song").img);
},
"click .edit-song-button": function(e){
Session.set("song", this);
Session.set("genre", $(e.target).data("genre"));
$("#mid").val(this.mid).change();
$("#artist").val(this.artist).change();
$("#title").val(this.title).change();
$("#img").val(this.img).change();
$("#id").val(this.id).change();
$("#likes").val(this.likes).change();
$("#dislikes").val(this.dislikes).change();
$("#duration").val(this.duration).change();
$("#skip-duration").val(this.skipDuration).change();
$("#previewPlayerContainer").addClass("hide-preview");
Session.set("image_url", this.img);
Session.set("editing", true);
$("#editModal").openModal({
complete : function() {
Session.set("editing", false);
if (YTPlayer !== undefined && YTPlayer.stopVideo !== undefined) {
YTPlayer.stopVideo();
}
}
});
},
"click .remove-song-button": function(e){
var genre = $(e.target).data("genre") || $(e.target).parent().data("genre");
Meteor.call("removeSongFromPlaylist", genre, this.mid);
},
"click #play": function() {
var duration = Session.get("song").duration;
var d = moment.duration(parseInt(duration), 'seconds');
$("#time-total").text(d.minutes() + ":" + ("0" + d.seconds()).slice(-2));
$("#previewPlayerContainer").removeClass("hide-preview");
var song = Session.get("song");
var id = song.id;
var volume = localStorage.getItem("volume") || 20;
if (song.duration !== 0) {
$("#play").attr("disabled", true);
$("#stop").attr("disabled", false);
$("#pause").attr("disabled", false);
$("#forward").attr("disabled", false);
if (YTPlayer === undefined) {
YTPlayer = new YT.Player("previewPlayer", {
height: 540,
width: 568,
videoId: id,
playerVars: {autoplay: 1, controls: 0, iv_load_policy: 3, showinfo: 0, fs: 0},
events: {
'onReady': function(event) {
event.target.seekTo(Number(song.skipDuration));
event.target.playVideo();
event.target.setVolume(volume);
},
'onStateChange': function(event){
if (event.data == YT.PlayerState.PAUSED) {
if (seekerBarInterval !== undefined) {
Meteor.clearInterval(seekerBarInterval);
seekerBarInterval = undefined;
}
}
// if (event.data == YT.PlayerState.UNSTARTED) {
// if (seekerBarInterval !== undefined) {
// Meteor.clearInterval(seekerBarInterval);
// seekerBarInterval = undefined;
// }
// $(".seeker-bar").css({width: "0"});
// $("#time-elapsed").text("0:00");
// $("#previewPlayerContainer").addClass("hide-preview");
// }
if (event.data == YT.PlayerState.PLAYING) {
seekerBarInterval = Meteor.setInterval(function() {
var duration = Session.get("song").duration;
var timeElapsed = YTPlayer.getCurrentTime();
var skipDuration = Session.get("song").skipDuration;
if (duration <= (timeElapsed - skipDuration)) {
YTPlayer.stopVideo();
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
$("#previewPlayerContainer").addClass("hide-preview");
$(".seeker-bar").css({width: "0"});
$("#time-elapsed").text("0:00");
Meteor.clearInterval(seekerBarInterval);
} else {
var percentComplete = (timeElapsed - skipDuration) / duration * 100;
$(".seeker-bar").css({width: percentComplete + "%"});
var d = moment.duration(timeElapsed - skipDuration, 'seconds');
$("#time-elapsed").text(d.minutes() + ":" + ("0" + d.seconds()).slice(-2));
}
}, 100);
$("#play").attr("disabled", true);
$("#stop").attr("disabled", false);
$("#pause").attr("disabled", false);
$("#forward").attr("disabled", false);
} else {
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
}
}
}
});
} else {
if (YTPlayer.getPlayerState() === 2) {
YTPlayer.playVideo();
} else {
YTPlayer.loadVideoById(id);
YTPlayer.seekTo(Number(song.skipDuration));
}
}
$("#previewPlayerContainer").removeClass("hide-preview");
}
},
"click #stop": function() {
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
if (previewEndSongTimeout !== undefined) {
Meteor.clearTimeout(previewEndSongTimeout);
}
if (YTPlayer !== undefined && YTPlayer.stopVideo !== undefined) {
YTPlayer.stopVideo();
}
},
"click #pause": function() {
$("#play").attr("disabled", false);
$("#stop").attr("disabled", false);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
if (previewEndSongTimeout !== undefined) {
Meteor.clearTimeout(previewEndSongTimeout);
}
if (YTPlayer !== undefined && YTPlayer.pauseVideo !== undefined) {
YTPlayer.pauseVideo();
}
},
"click #forward": function() {
var error = false;
if (YTPlayer !== undefined) {
var duration = Number(Session.get("song").duration) | 0;
var skipDuration = Number(Session.get("song").skipDuration) | 0;
if (YTPlayer.getDuration() < duration + skipDuration) {
var $toastContent = $('Error. The song duration is longer than the length of the video.');
Materialize.toast($toastContent, 8000);
error = true;
} else {
YTPlayer.seekTo(skipDuration + duration - 10);
}
}
if (!error) {
if (previewEndSongTimeout !== undefined) {
Meteor.clearTimeout(previewEndSongTimeout);
}
previewEndSongTimeout = Meteor.setTimeout(function() {
if (YTPlayer !== undefined) {
YTPlayer.stopVideo();
}
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
$("#previewPlayerContainer").addClass("hide-preview");
}, 10000);
}
},
"click #get-spotify-info": function() {
var search = $("#title").val();
var artistName = $("#artist").val();
getSpotifyInfo(search, function(data) {
for(var i in data){
for(var j in data[i].items){
if(search.indexOf(data[i].items[j].name) !== -1 && artistName.indexOf(data[i].items[j].artists[0].name) !== -1){
$("#img").val(data[i].items[j].album.images[0].url).change();
$("#duration").val(data[i].items[j].duration_ms / 1000).change();
return;
}
}
}
}, artistName);
},
"click #save-song-button": function() {
var newSong = {};
newSong.mid = $("#mid").val();
newSong.id = $("#id").val();
newSong.likes = Number($("#likes").val());
newSong.dislikes = Number($("#dislikes").val());
newSong.title = $("#title").val();
newSong.artist = $("#artist").val();
newSong.img = $("#img").val();
newSong.duration = Number($("#duration").val());
newSong.skipDuration = $("#skip-duration").val();
newSong.requestedBy = Session.get("song").requestedBy;
newSong.genres = $("#genres").val();
Meteor.call("updatePlaylistSong", newSong.mid, newSong, function(err, res) {
console.log(err, res);
if (err) {
var $toastContent = $('Song not saved. ' + err.reason + '');
Materialize.toast($toastContent, 8000);
} else {
var $toastContent = $('Song saved! No errors were found.');
Materialize.toast($toastContent, 4000);
Session.set("song", newSong);
}
});
},
"click .remove-report-button": function(){
var parts = location.href.split('/');
parts.pop();
var id = parts.pop();
var query = {room: id.toLowerCase()};
var obj = $(this)[0];
Meteor.call("removeReport", query, obj);
},
"click #deleteRoom": function(){
var type = location.href.split("/")[3];
Meteor.call("deleteRoom", type, function(err,res){
window.location.href = "/";
})
}
});
Template.manageSongs.events({
/* TODO Add undo delete button */
"change #show_genres_cb": function() {
var selected = $("#show_genres_cb").is(":checked");
Session.set("showGenres", selected);
},
"change #show_no_genres_cb": function() {
var selected = $("#show_no_genres_cb").is(":checked");
Session.set("showNoGenres", selected);
},
"input #id": function() {
$("#previewPlayerContainer").addClass("hide-preview");
},
"input #img": function() {
var url = $("#img").val();
Session.set("image_url", url);
},
"click .preview-button": function(e){
Session.set("song", this);
$("#previewModal").openModal();
},
"click #previewImageButton": function() {
$("#preview-image").attr("src", Session.get("song").img);
},
"click .edit-song-button": function(e){
Session.set("song", this);
Session.set("genre", $(e.target).data("genre"));
$("#mid").val(this.mid).change();
$("#artist").val(this.artist).change();
$("#title").val(this.title).change();
$("#img").val(this.img).change();
$("#id").val(this.id).change();
$("#likes").val(this.likes).change();
$("#dislikes").val(this.dislikes).change();
$("#duration").val(this.duration).change();
$("#skip-duration").val(this.skipDuration).change();
$("#genres").val(this.genres).change();
$("#genres").material_select();
$("#previewPlayerContainer").addClass("hide-preview");
Session.set("image_url", this.img);
Session.set("editing", true);
$("#editModal").openModal({
complete : function() {
Session.set("editing", false);
if (YTPlayer !== undefined && YTPlayer.stopVideo !== undefined) {
YTPlayer.stopVideo();
}
}
});
},
"click .remove-song-button": function(){
Meteor.call("deleteSong", this.mid);
},
"click #play": function() {
var duration = Session.get("song").duration;
var d = moment.duration(parseInt(duration), 'seconds');
$("#time-total").text(d.minutes() + ":" + ("0" + d.seconds()).slice(-2));
$("#previewPlayerContainer").removeClass("hide-preview");
var song = Session.get("song");
var id = song.id;
var volume = localStorage.getItem("volume") || 20;
if (song.duration !== 0) {
$("#play").attr("disabled", true);
$("#stop").attr("disabled", false);
$("#pause").attr("disabled", false);
$("#forward").attr("disabled", false);
if (YTPlayer === undefined) {
YTPlayer = new YT.Player("previewPlayer", {
height: 540,
width: 568,
videoId: id,
playerVars: {autoplay: 1, controls: 0, iv_load_policy: 3, showinfo: 0, fs: 0},
events: {
'onReady': function(event) {
event.target.seekTo(Number(song.skipDuration));
event.target.playVideo();
event.target.setVolume(volume);
},
'onStateChange': function(event){
if (event.data == YT.PlayerState.PAUSED) {
if (seekerBarInterval !== undefined) {
Meteor.clearInterval(seekerBarInterval);
seekerBarInterval = undefined;
}
}
// if (event.data == YT.PlayerState.UNSTARTED) {
// if (seekerBarInterval !== undefined) {
// Meteor.clearInterval(seekerBarInterval);
// seekerBarInterval = undefined;
// }
// $(".seeker-bar").css({width: "0"});
// $("#time-elapsed").text("0:00");
// $("#previewPlayerContainer").addClass("hide-preview");
// }
if (event.data == YT.PlayerState.PLAYING) {
seekerBarInterval = Meteor.setInterval(function() {
var duration = Session.get("song").duration;
var timeElapsed = YTPlayer.getCurrentTime();
var skipDuration = Session.get("song").skipDuration;
if (duration <= (timeElapsed - skipDuration)) {
YTPlayer.stopVideo();
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
$("#previewPlayerContainer").addClass("hide-preview");
$(".seeker-bar").css({width: "0"});
$("#time-elapsed").text("0:00");
Meteor.clearInterval(seekerBarInterval);
} else {
var percentComplete = (timeElapsed - skipDuration) / duration * 100;
$(".seeker-bar").css({width: percentComplete + "%"});
var d = moment.duration(timeElapsed - skipDuration, 'seconds');
$("#time-elapsed").text(d.minutes() + ":" + ("0" + d.seconds()).slice(-2));
}
}, 100);
$("#play").attr("disabled", true);
$("#stop").attr("disabled", false);
$("#pause").attr("disabled", false);
$("#forward").attr("disabled", false);
} else {
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
}
}
}
});
} else {
if (YTPlayer.getPlayerState() === 2) {
YTPlayer.playVideo();
} else {
YTPlayer.loadVideoById(id);
YTPlayer.seekTo(Number(song.skipDuration));
}
}
$("#previewPlayerContainer").removeClass("hide-preview");
}
},
"click #stop": function() {
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
if (previewEndSongTimeout !== undefined) {
Meteor.clearTimeout(previewEndSongTimeout);
}
if (YTPlayer !== undefined && YTPlayer.stopVideo !== undefined) {
YTPlayer.stopVideo();
}
},
"click #pause": function() {
$("#play").attr("disabled", false);
$("#stop").attr("disabled", false);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
if (previewEndSongTimeout !== undefined) {
Meteor.clearTimeout(previewEndSongTimeout);
}
if (YTPlayer !== undefined && YTPlayer.pauseVideo !== undefined) {
YTPlayer.pauseVideo();
}
},
"click #forward": function() {
var error = false;
if (YTPlayer !== undefined) {
var duration = Number(Session.get("song").duration) | 0;
var skipDuration = Number(Session.get("song").skipDuration) | 0;
if (YTPlayer.getDuration() < duration + skipDuration) {
var $toastContent = $('Error. The song duration is longer than the length of the video.');
Materialize.toast($toastContent, 8000);
error = true;
} else {
YTPlayer.seekTo(skipDuration + duration - 10);
}
}
if (!error) {
if (previewEndSongTimeout !== undefined) {
Meteor.clearTimeout(previewEndSongTimeout);
}
previewEndSongTimeout = Meteor.setTimeout(function() {
if (YTPlayer !== undefined) {
YTPlayer.stopVideo();
}
$("#play").attr("disabled", false);
$("#stop").attr("disabled", true);
$("#pause").attr("disabled", true);
$("#forward").attr("disabled", true);
$("#previewPlayerContainer").addClass("hide-preview");
}, 10000);
}
},
"click #get-spotify-info": function() {
var search = $("#title").val();
var artistName = $("#artist").val();
getSpotifyInfo(search, function(data) {
for(var i in data){
for(var j in data[i].items){
if(search.indexOf(data[i].items[j].name) !== -1 && artistName.indexOf(data[i].items[j].artists[0].name) !== -1){
$("#img").val(data[i].items[j].album.images[0].url).change();
$("#duration").val(data[i].items[j].duration_ms / 1000).change();
return;
}
}
}
}, artistName);
},
"click #save-song-button": function() {_
var newSong = {};
newSong.mid = $("#mid").val();
newSong.id = $("#id").val();
newSong.likes = Number($("#likes").val());
newSong.dislikes = Number($("#dislikes").val());
newSong.title = $("#title").val();
newSong.artist = $("#artist").val();
newSong.img = $("#img").val();
newSong.duration = Number($("#duration").val());
newSong.skipDuration = $("#skip-duration").val();
newSong.requestedBy = Session.get("song").requestedBy;
newSong.genres = $("#genres").val() || [];
Meteor.call("updatePlaylistSong", newSong.mid, newSong, function(err, res) {
console.log(err, res);
if (err) {
var $toastContent = $('Song not saved. ' + err.reason + '');
Materialize.toast($toastContent, 8000);
} else {
var $toastContent = $('Song saved! No errors were found.');
Materialize.toast($toastContent, 4000);
Session.set("song", newSong);
}
});
}
});
Template.loginRegister.events({
"submit #register_form": function(e){
e.preventDefault();
var username = $("#register_username").val();
var email = $("#register_email").val();
var password = $("#register_password").val();
var acceptedTermsAndPrivacy = $("#termsPrivacyBTN").is(":checked");
var captchaData = grecaptcha.getResponse();
if (acceptedTermsAndPrivacy) {
Meteor.call("createUserMethod", {username: username, email: email, password: password}, captchaData, function(err, res) {
grecaptcha.reset();
if (err) {
console.log(err);
var $toastContent = $('Oh snap! ' + err.reason + '');
Materialize.toast($toastContent, 8000);
} else {
Meteor.loginWithPassword(username, password);
Accounts.onLogin(function(){
window.location.href = "/";
})
}
});
} else {
var $toastContent = $('Oh snap! Please read and accept the Terms and Conditions and the Privacy Policy.');
Materialize.toast($toastContent, 8000);
}
},
"submit #login_form": function(e){
e.preventDefault();
Session.set("github", false);
var username = $("#login_username").val()
var password = $("#login_password").val();
Meteor.loginWithPassword(username, password, function(err) {
if (err) {
var $toastContent = $('Oh snap! ' + err.reason + '');
Materialize.toast($toastContent, 8000);
} else {
window.location.href = "/";
}
});
},
"click #github-login": function(){
Meteor.loginWithGithub({loginStyle: "redirect"}, function(err, res) {
console.log(err, res);
});
}
});
Template.news.events({
"click #createArticleButton": function() {
var title = $("#title").val();
var content = $("#content").val();
var content = content.replace(/(?:\r\n|\r|\n)/g, '
'); var anonymous = $("#anonymous").is(":checked"); Meteor.call("createArticle", {title: title, content: content, anonymous: anonymous}, function(err, res) { if (err) { var $toastContent = $('Article not created. ' + err.reason + ''); Materialize.toast($toastContent, 8000); } else { $('#createArticle').closeModal() $("#title").val("").change(); $("#content").val("").change(); $("#anonymous").prop("checked", false).change(); } }); } }); Template.room.events({ "click #logout": function() { Meteor.logout(); }, "input #volume_slider": function() { var volume = Number($("#volume_slider").val()); localStorage.setItem("volume", volume); if (YTPlayer !== undefined) { YTPlayer.setVolume(volume); } }, "click #add-song-modal-button": function() { Session.set("songResults", []); }, "click #return-button": function() { Session.set("editingSong", false); }, "click #removeSong": function(e) { var id = $(e.target).data("result"); var songs = Session.get("songResults"); var currentSong; songs = songs.filter(function(song) { return id !== song.id; }); Session.set("songResults", []); Session.set("songResults", songs); }, "click #addSong": function(e) { var id = $(e.target).data("result"); var songs = Session.get("songResults"); var currentSong; songs.forEach(function(song) { if (song.id === id) { currentSong = song; } }); Session.set("editingSong", true); var title = currentSong.title; var artist = currentSong.artist; var img = currentSong.img; getSpotifyInfo(title.replace(/\[.*\]/g, ""), function (data) { if (data.tracks.items.length > 0) { title = data.tracks.items[0].name; var artists = []; img = data.tracks.items[0].album.images[0].url; data.tracks.items[0].artists.forEach(function (artist) { artists.push(artist.name); }); artist = artists.join(", "); $("#title").val(title).change(); $("#artist").val(artist).change(); $("#img").val(img).change(); $("#id").val(id).change(); $("#genres").val(null).change(); } else { $("#title").val(title).change(); $("#artist").val(artist).change(); $("#img").val(img).change(); $("#id").val(id).change(); $("#genres").val(null).change(); // I give up for now... Will fix this later. -Kris } }); }, "click #import-playlist-button": function () { if (!Session.get("importingPlaylist")) { Session.set("songResults", []); var playlist_link = $("#playlist-url").val(); var playlist_id = gup("list", playlist_link); var ytImportQueue = []; var totalVideos = 0; var videosInvalid = 0; var videosInQueue = 0; var videosInPlaylist = 0; var ranOnce = false; Session.set("importingPlaylist", true); $("#import-playlist-button").attr("disabled", ""); $("#import-playlist-button").addClass("disabled"); $("#playlist-url").attr("disabled", ""); $("#playlist-url").addClass("disabled"); $("#import-progress").css({width: "0%"}); function makeAPICall(playlist_id, nextPageToken) { if (nextPageToken !== undefined) { nextPageToken = "&pageToken=" + nextPageToken; } else { nextPageToken = ""; } $.ajax({ type: "GET", url: "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=" + playlist_id + nextPageToken + "&key=AIzaSyAgBdacEWrHCHVPPM4k-AFM7uXg-Q__YXY", applicationType: "application/json", contentType: "json", success: function (data) { if (!ranOnce) { ranOnce = true; totalVideos = data.pageInfo.totalResults; } var nextToken = data.nextPageToken; for (var i in data.items) { var item = data.items[i]; if (item.snippet.thumbnails !== undefined) { var genre = Session.get("type"); if (Playlists.find({ type: genre, "songs.id": item.snippet.resourceId.videoId }, {songs: {$elemMatch: {id: item.snippet.resourceId.videoId}}}).count() !== 0) { videosInPlaylist++; } else if (Queues.find({ type: genre, "songs.id": item.snippet.resourceId.videoId }, {songs: {$elemMatch: {id: item.snippet.resourceId.videoId}}}).count() !== 0) { videosInQueue++; } else { var percentage = ytImportQueue.length / (totalVideos - videosInvalid) * 100; $("#import-progress").css({width: percentage + "%"}); ytImportQueue.push({title: item.snippet.title, artist: item.snippet.channelTitle, id: item.snippet.resourceId.videoId, image: item.snippet.thumbnails.medium.url}); } } else { videosInvalid++; } } if (nextToken !== undefined) { makeAPICall(playlist_id, nextToken); } else { /*$("#playlist-import-queue > div > i").click(function () { var title = $(this).parent().find("div > .song-result-title").text(); for (var i in ytImportQueue) { if (ytImportQueue[i].title === title) { ytImportQueue.splice(i, 1); } } $(this).parent().remove(); Session.set("YTImportQueue", ytImportQueue); });*/ Session.set("importingPlaylist", false); $("#import-progress").css({width: "100%"}); $("#import-playlist-button").removeAttr("disabled"); $("#import-playlist-button").removeClass("disabled"); $("#playlist-url").removeAttr("disabled"); $("#playlist-url").removeClass("disabled"); Session.set("YTImportQueue", ytImportQueue); Session.set("songResults", ytImportQueue); } }, error: function() { Session.set("importingPlaylist", false); $("#import-progress").css({width: "0%"}); $("#import-playlist-button").removeAttr("disabled"); $("#import-playlist-button").removeClass("disabled"); $("#playlist-url").removeAttr("disabled"); $("#playlist-url").removeClass("disabled"); } }) } makeAPICall(playlist_id); } }, "click #confirm-import": function () { var YTImportQueue = Session.get("YTImportQueue"); $("#import-playlist-button").attr("disabled", ""); $("#import-playlist-button").addClass("disabled"); $("#playlist-url").attr("disabled", ""); $("#playlist-url").addClass("disabled"); $("#import-progress").css({width: "0%"}); var failed = 0; var success = 0; var processed = 0; var total = YTImportQueue.length; YTImportQueue.forEach(function (song) { var songData = {id: song.id, title: song.title, artist: "NONE", genres: [Session.get("type")]}; Meteor.call("addSongToQueue", songData, function (err, res) { if (err) { console.log(err); failed++; } else { success++; } processed++; var percentage = processed / total * 100; $("#import-progress").css({width: percentage + "%"}); if (processed === total) { $("#import-progress").css({width: "0%"}); var $toastContent = $('' + failed + ' songs failed to import. ' + success + ' songs successfully imported.'); Materialize.toast($toastContent, 4000); } }); }); $("#import-playlist-button").removeAttr("disabled"); $("#import-playlist-button").removeClass("disabled"); $("#playlist-url").removeAttr("disabled", ""); $("#playlist-url").removeClass("disabled"); Session.set("songResults", []); Session.set("YTImportQueue", []) }, "click #global-chat-tab": function () { $("#global-chat-tab").removeClass("unread-messages"); }, "click #sync": function () { if (Session.get("currentSong") !== undefined) { var room = Rooms.findOne({type: Session.get("type")}); if (room !== undefined) { var timeIn = Date.now() - Session.get("currentSong").started - room.timePaused; var skipDuration = Number(Session.get("currentSong").skipDuration) | 0; if (YTPlayer !== undefined) { YTPlayer.seekTo(skipDuration + timeIn / 1000); } } } }, "click #lock": function () { Meteor.call("lockRoom", Session.get("type"), function(err) { if(err){ var $toastContent = $('Room not locked. ' + err.reason + ''); Materialize.toast($toastContent, 4000); } else { var $toastContent = $('Room locked.'); Materialize.toast($toastContent, 4000); } }); }, "click #unlock": function () { Meteor.call("unlockRoom", Session.get("type"), function(err) { if(err){ var $toastContent = $('Room not unlocked. ' + err.reason + ''); Materialize.toast($toastContent, 4000); } else { var $toastContent = $('Room unlocked.'); Materialize.toast($toastContent, 4000); } }); }, "click #submit": function () { if(Meteor.userId()){ sendMessageGlobal(); Meteor.setTimeout(function () { $(".chat-ul").scrollTop(100000); }, 1000) } else { var $toastContent = $('Message not sent. You must log in'); Materialize.toast($toastContent, 2000); } }, "keyup #chat-message": function (e) { if (e.type === "keyup" && e.which === 13) { if(Meteor.userId()){ e.preventDefault(); if (!$('#chat-message').data('dropdownshown')) { sendMessageGlobal(); Meteor.setTimeout(function () { $(".chat-ul").scrollTop(100000); }, 1000) } } else { var $toastContent = $('Message not sent. You must log in'); Materialize.toast($toastContent, 2000); } } }, "click #like": function (e) { $("#like").blur(); Meteor.call("likeSong", Session.get("currentSong").mid); }, "click #dislike": function (e) { $("#dislike").blur(); Meteor.call("dislikeSong", Session.get("currentSong").mid); }, "click #vote-skip": function () { Meteor.call("voteSkip", Session.get("type"), function (err, res) { $("#vote-skip").addClass("disabled"); if(err){ var $toastContent = $('Vote not submitted ' + err.reason + ''); Materialize.toast($toastContent, 4000); } }); }, "click #report-prev": function (e) { if (Session.get("previousSong") !== undefined) { Session.set("reportPrevious", true); $("#report-prev").addClass("disabled"); $("#report-curr").removeClass("disabled"); } }, "click #report-curr": function (e) { Session.set("reportPrevious", false); $("#report-prev").removeClass("disabled"); $("#report-curr").addClass("disabled"); }, "click #report-modal": function () { Session.set("currentSongR", Session.get("currentSong")); Session.set("previousSongR", Session.get("previousSong")); }, "click #add-song-button": function (e) { e.preventDefault(); parts = location.href.split('/'); var roomType = parts.pop(); var genre = roomType.toLowerCase(); var type = $("#type").val(); id = $("#id").val(); var title = $("#title").val(); var artist = $("#artist").val(); var genres = $("#genres").val() || []; var songData = {type: type, id: id, title: title, artist: artist, genres: genres}; if (Songs.find({"id": songData.id}).count() > 0) { var $toastContent = $('Song not added. This song has already been added.'); Materialize.toast($toastContent, 8000); } else if (Queues.find({"id": songData.id}).count() > 0) { var $toastContent = $('Song not added. This song has already been requested.'); Materialize.toast($toastContent, 3000); } else { Meteor.call("addSongToQueue", songData, function (err, res) { console.log(err, res); if (err) { var $toastContent = $('Song not added. ' + err.reason + ''); Materialize.toast($toastContent, 3000); } else { var $toastContent = $('Song added. Your song has succesfully been added to the queue.'); Materialize.toast($toastContent, 3000); $('#add_song_modal').closeModal(); Session.set("editingSong", false); } }); } }, "click #toggle-video": function (e) { e.preventDefault(); if (Session.get("mediaHidden")) { $("#media-container").removeClass("hidden"); $("#toggle-video").text("Hide video"); Session.set("mediaHidden", false); } else { $("#media-container").addClass("hidden"); $("#toggle-video").text("Show video"); Session.set("mediaHidden", true); } }, "click #return": function (e) { $("#add-info").hide(); $("#search-info").show(); }, "click #search-song": function () { var songs = []; Session.set("songResults", songs); $.ajax({ type: "GET", url: "https://www.googleapis.com/youtube/v3/search?part=snippet&q=" + $("#song-input").val() + "&key=AIzaSyAgBdacEWrHCHVPPM4k-AFM7uXg-Q__YXY&type=video&maxResults=25", applicationType: "application/json", contentType: "json", success: function (data) { for (var i in data.items) { var item = data.items[i]; songs.push({title: item.snippet.title, artist: item.snippet.channelTitle, id: item.id.videoId, image: item.snippet.thumbnails.medium.url}); } Session.set("songResults", songs); /*$("#song-results > div").click(function () { $("#search-info").hide(); $("#add-info").show(); var title = $(this).find("div > .song-result-title").text(); for (var i in songs) { if (songs[i].title === title) { var songObj = { id: songs[i].id, title: songs[i].title, type: "youtube" }; $("#title").val(songObj.title); $("#artist").val(""); $("#id").val(songObj.id); getSpotifyInfo(songObj.title.replace(/\[.*\]/g, ""), function (data) { if (data.tracks.items.length > 0) { $("#title").val(data.tracks.items[0].name); var artists = []; $("#img").val(data.tracks.items[0].album.images[2].url); data.tracks.items[0].artists.forEach(function (artist) { artists.push(artist.name); }); $("#artist").val(artists.join(", ")); } }); } } })*/ } }) }, "click #volume-icon": function () { var volume = 0; var slider = $("#volume-slider").slider(); $("#volume-icon").removeClass("fa-volume-down").addClass("fa-volume-off") if (YTPlayer !== undefined) { YTPlayer.setVolume(volume); localStorage.setItem("volume", volume); $("#volume-slider").slider("setValue", volume); } }, "click #play": function () { Meteor.call("resumeRoom", Session.get("type"), function (err, res) { if (err) { var $toastContent = $('Room not resumed. ' + err.reason + ''); Materialize.toast($toastContent, 4000); } else { var $toastContent = $('Room resumed.'); Materialize.toast($toastContent, 4000); } }); }, "click #pause": function () { Meteor.call("pauseRoom", Session.get("type"), function (err, res) { if (err) { var $toastContent = $('Room not paused. ' + err.reason + ''); Materialize.toast($toastContent, 4000); } else { var $toastContent = $('Room paused.'); Materialize.toast($toastContent, 4000); } }); }, "click #skip": function () { Meteor.call("skipSong", Session.get("type")); }, "click #shuffle": function () { Meteor.call("shufflePlaylist", Session.get("type")); }, "change input": function (e) { /*if (e.target && e.target.id) { var partsOfId = e.target.id.split("-"); partsOfId[1] = partsOfId[1].charAt(0).toUpperCase() + partsOfId[1].slice(1); var camelCase = partsOfId.join(""); Session.set(camelCase, e.target.checked); }*/ }, "click #report-song-button": function () { var room = Session.get("type"); var reportData = {}; if (Session.get("reportPrevious") === false) { reportData.song = Session.get("previousSongR").mid; } else { reportData.song = Session.get("currentSongR").mid; } reportData.type = []; reportData.reason = []; $(".report-layer-1 > div > input:checked").each(function (){ reportData.type.push(this.id); }); $(".report-layer-2 input:checked").each(function () { reportData.reason.push(this.id); }); Meteor.call("submitReport", room, reportData, function () { $("report_modal").closeModal(); }); }, "change #si_or_pl": function () { Session.set("songResults", []); Session.set("si_or_pl", $("#si_or_pl").val()); }, "click #close-modal-a": function () { $("#select_single").attr("selected", true); $("#search-info").show(); $("#playlist-import").hide(); }, "click #admin-dropdown a": function(){ Meteor.setTimeout(function(){ $(".dropdown-button").click(); }, 10); } }); Template.communityStation.events({ "click #search-song": function () { var songs = []; Session.set("songResults", songs); $.ajax({ type: "GET", url: "https://www.googleapis.com/youtube/v3/search?part=snippet&q=" + $("#song-input").val() + "&key=AIzaSyAgBdacEWrHCHVPPM4k-AFM7uXg-Q__YXY&type=video&maxResults=15", applicationType: "application/json", contentType: "json", success: function (data) { for (var i in data.items) { var item = data.items[i]; songs.push({title: item.snippet.title, artist: item.snippet.channelTitle, id: item.id.videoId, image: item.snippet.thumbnails.medium.url}); } Session.set("songResults", songs); } }) }, "click #add-song-to-queue-search-button": function () { var songs = []; Session.set("songResultsQueue", songs); $.ajax({ type: "GET", url: "https://www.googleapis.com/youtube/v3/search?part=snippet&q=" + $("#add-song-to-queue-search").val() + "&key=AIzaSyAgBdacEWrHCHVPPM4k-AFM7uXg-Q__YXY&type=video&maxResults=15", applicationType: "application/json", contentType: "json", success: function (data) { for (var i in data.items) { var item = data.items[i]; songs.push({title: item.snippet.title, artist: item.snippet.channelTitle, id: item.id.videoId, image: item.snippet.thumbnails.medium.url}); } Session.set("songResultsQueue", songs); } }) }, "click #logout": function() { Meteor.logout(); }, "click #delete_room": function() { var name = Session.get("CommunityStationName"); Meteor.call("deleteCommunityStation", name, function(err) { if (err) { console.log(err); var $toastContent = $('Room not deleted. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Room deleted.'); Materialize.toast($toastContent, 2000); } }); $("#edit_room_modal").closeModal(); }, "click #save_edit_room_changes": function() { var name = Session.get("CommunityStationName"); var display = $("#edit_room_display").val(); var desc = $("#edit_room_description").val(); var privacy = $("#edit_room_privacy").val(); var room = CommunityStations.findOne({name: name}); var partyMode = $("#partyModeEnabled").is(":checked"); if (desc !== room.roomDesc) { Meteor.call("changeCommunityStationDescription", name, desc, function (err) { if (err) { var $toastContent = $('Description not changed. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Description changed.'); Materialize.toast($toastContent, 2000); } }); } if (display !== room.displayName) { Meteor.call("changeCommunityStationDisplayName", name, display, function (err) { if (err) { var $toastContent = $('Display Name not changed. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Display Name changed.'); Materialize.toast($toastContent, 2000); } }); } if (privacy !== room.privacy) { Meteor.call("changeCommunityStationPrivacy", name, privacy, function (err) { if (err) { var $toastContent = $('Privacy not changed. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Privacy changed.'); Materialize.toast($toastContent, 2000); } }); } if (partyMode !== room.partyModeEnabled) { Meteor.call("setCommunityStationPartyMode", name, partyMode, function (err) { if (err) { var $toastContent = $('Party mode not changed. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Party mode changed.'); Materialize.toast($toastContent, 2000); } }); } if (partyMode) { var queueLocked = $("#queueLocked").is(":checked"); if (queueLocked !== room.queueLocked) { Meteor.call("setCommunityStationQueueLocked", name, queueLocked, function (err, res) { if (err) { if (queueLocked) { var $toastContent = $('Queue not locked. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Queue not unlocked. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } } else { if (queueLocked) { var $toastContent = $('Queue locked.'); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Queue unlocked.'); Materialize.toast($toastContent, 2000); } } }); } } $("#edit_room_modal").closeModal(); }, "input #volume_slider": function() { var volume = Number($("#volume_slider").val()); localStorage.setItem("volume", volume); if (YTPlayer !== undefined) { YTPlayer.setVolume(volume); } }, "click #global-chat-tab": function () { $("#global-chat-tab").removeClass("unread-messages"); }, "click #sync": function () { if (Session.get("currentSong") !== undefined) { var room = CommunityStations.findOne({name: Session.get("CommunityStationName")}); if (room !== undefined) { var timeIn = Date.now() - Session.get("currentSong").started - room.timePaused; if (YTPlayer !== undefined) { YTPlayer.seekTo(timeIn / 1000); } } } }, "click #submit": function () { if(Meteor.userId()){ sendMessageGlobal(); Meteor.setTimeout(function () { $("#chat-ul").scrollTop(100000); }, 1000) } else { var $toastContent = $('Message not sent. You must log in'); Materialize.toast($toastContent, 2000); } }, "keyup #chat-message": function (e) { if (e.type === "keyup" && e.which === 13) { if(Meteor.userId()){ e.preventDefault(); if (!$('#chat-message').data('dropdownshown')) { sendMessageGlobal(); Meteor.setTimeout(function () { $("#chat-ul").scrollTop(100000); }, 1000) } } else { var $toastContent = $('Message not sent. You must log in'); Materialize.toast($toastContent, 2000); } } }, "click #add-allowed-submit": function (e) { if(Meteor.userId()){ e.preventDefault(); Meteor.call("addAllowedToCommunityStation", Session.get("CommunityStationName"), $("#add-allowed").val(), function(err) { if (err) { console.log(err); var $toastContent = $('User not added. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('User added.'); Materialize.toast($toastContent, 2000); } }); $("#add-allowed").val(""); } else { var $toastContent = $('User not added. You must log in'); Materialize.toast($toastContent, 2000); } }, "keyup #add-allowed": function (e) { if (e.type === "keyup" && e.which === 13) { $("#add-allowed-submit").click(); } }, "click #vote-skip": function () { Meteor.call("votePrivateSkip", Session.get("CommunityStationName"), function (err, res) { $("#vote-skip").addClass("disabled"); if(err){ var $toastContent = $('Vote not submitted. ' + err.reason + ''); Materialize.toast($toastContent, 4000); } }); }, "click #volume-icon": function () { var volume = 0; var slider = $("#volume-slider").slider(); $("#volume-icon").removeClass("fa-volume-down").addClass("fa-volume-off") if (YTPlayer !== undefined) { YTPlayer.setVolume(volume); localStorage.setItem("volume", volume); $("#volume-slider").slider("setValue", volume); } }, "click #play": function () { Meteor.call("resumeCommunityStation", Session.get("CommunityStationName"), function(err) { if (err) { console.log(err); var $toastContent = $('Room not played. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Room played.'); Materialize.toast($toastContent, 2000); } }); }, "click #pause": function () { Meteor.call("pauseCommunityStation", Session.get("CommunityStationName"), function(err) { if (err) { console.log(err); var $toastContent = $('Room not paused. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Room paused.'); Materialize.toast($toastContent, 2000); } }); }, "click #skip": function () { Meteor.call("skipPrivateSong", Session.get("CommunityStationName"), function(err) { if (err) { console.log(err); var $toastContent = $('Room not skipped. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Room skipped.'); Materialize.toast($toastContent, 2000); } }); }, "click #admin-dropdown a": function(){ Meteor.setTimeout(function(){ $(".dropdown-button").click(); }, 10); }, "click .remove-allowed": function(e) { var user = $(e.target).data("user"); if (user === undefined) { user = $(e.target).parent().data("user"); } Meteor.call("removeAllowedFromCommunityStation", Session.get("CommunityStationName"), user, function(err) { if (err) { console.log(err); var $toastContent = $('User not removed. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('User removed.'); Materialize.toast($toastContent, 2000); } }); }, "click #clear-queue-search": function() { Session.set("songResultsQueue", []); }, "click .queue-item-remove": function(e) { var id = $(e.target).attr("data-id"); if (id === undefined) { id = $(e.target).parent().attr("data-id"); } Meteor.call("removeIdFromCommunityStationQueue", Session.get("CommunityStationName"), id, function(err, res) { console.log(111, err, res); if (err) { var $toastContent = $('Song not removed. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Song removed.'); Materialize.toast($toastContent, 2000); } }); }, "click .edit-playlist-button": function(e) { if ($(e.target).hasClass("edit-playlist-button")) { Session.set("editingPlaylistName", $(e.target).data("playlist")); } }, "click #rename-playlist-button": function(e) { var newName = $("#rename-playlist-name").val(); var newDisplayName = $("#rename-playlist-display-name").val(); var playlist = PrivatePlaylists.findOne({owner: Meteor.userId(), name: Session.get("editingPlaylistName")}); var currentName = playlist.name; var currentDisplayName = playlist.displayName; if (newName !== currentName) { Meteor.call("renamePrivatePlaylistName", Session.get("editingPlaylistName"), newName, function (err) { if (err) { var $toastContent = $('Playlist name not changed. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Playlist name changed.'); Materialize.toast($toastContent, 2000); Session.set("editingPlaylistName", newName) } }); } if (newDisplayName !== currentDisplayName) { Meteor.call("renamePrivatePlaylistDisplayName", Session.get("editingPlaylistName"), newDisplayName, function (err) { if (err) { var $toastContent = $('Playlist display name not changed. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Playlist display name changed.'); Materialize.toast($toastContent, 2000); } }); } }, "click .addSong": function(e) { var id = $(e.target).attr("data-result"); var pp = Session.get("editingPlaylistName"); Meteor.call("addVideoToPrivatePlaylist", pp, id, function(err) { if (err) { console.log(err); var $toastContent = $('Video not added. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Video added.'); Materialize.toast($toastContent, 2000); } }); $("#add_playlist_video").val(""); }, "click .addSongQueue": function(e) { var id = $(e.target).attr("data-result"); Meteor.call("addSongToCommunityStationQueue", Session.get("CommunityStationName"), id, function(err) { if (err) { console.log(err); var $toastContent = $('Video not added to queue. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Video added to queue.'); Materialize.toast($toastContent, 2000); $("#add-song-to-queue-search").val(""); $("#add-song-to-queue").closeModal(); } }); }, "click .playlistSongRemove": function(e) { var id = $(e.target).attr("data-id"); if (id === undefined) { id = $(e.target).parent().attr("data-id"); } Meteor.call("removeVideoFromPrivatePlaylist", Session.get("editingPlaylistName"), id, function(err) { if (err) { console.log(err); var $toastContent = $('Video not deleted. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Video deleted.'); Materialize.toast($toastContent, 2000); } }); },"click .playlistQueueSelect": function(e) { var name = $(e.target).attr("data-name"); if (name === undefined) { name = $(e.target).parent().attr("data-name"); } console.log(name); Session.set("playlistQueueName", name); var currentSong = Session.get("playlistQueueCurrentSong"); if (currentSong === undefined) { var playlist = PrivatePlaylists.findOne({owner: Meteor.userId(), name: name}); var songs = playlist.songs; var song = songs[0]; // Add song to queue Meteor.call("addSongToCommunityStationQueue", Session.get("CommunityStationName"), song.id, function(err) { if (!err) { Session.set("playlistQueueCurrentSong", song); } }); } },"click .playlistQueueDeselect": function(e) { var name = $(e.target).attr("data-name"); if (name === undefined) { name = $(e.target).parent().attr("data-name"); } console.log(name); Session.set("playlistQueueName", undefined); }, "click .playlistSongDown": function(e) { var id = $(e.target).attr("data-id"); if (id === undefined) { id = $(e.target).parent().attr("data-id"); } Meteor.call("moveVideoToBottomOfPrivatePlaylist", Session.get("editingPlaylistName"), id, function(err, res) { if (err) { console.log(err); var $toastContent = $('Video not moved. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else if (res) { var $toastContent = $('Video moved.'); Materialize.toast($toastContent, 2000); } }); }, "click .playlistSongUp": function(e) { var id = $(e.target).attr("data-id"); if (id === undefined) { id = $(e.target).parent().attr("data-id"); } Meteor.call("moveVideoToTopOfPrivatePlaylist", Session.get("editingPlaylistName"), id, function(err, res) { if (err) { console.log(err); var $toastContent = $('Video not moved. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else if (res) { var $toastContent = $('Video moved.'); Materialize.toast($toastContent, 2000); } }); }, "click #delete_playlist": function() { Meteor.call("deletePrivatePlaylist", Session.get("editingPlaylistName"), function(err) { if (err) { console.log(err); var $toastContent = $('Playlist not deleted. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Playlist deleted.'); Materialize.toast($toastContent, 2000); } }); $("#edit_playlist_modal").closeModal(); }, "click #import-youtube-playlist": function() { if (!Session.get("importingPlaylist")) { Session.set("songResults", []); var playlist_link = $("#import_youtube_playlist_input").val(); var playlist_id = gup("list", playlist_link); var ytImportQueue = []; var totalVideos = 0; var videosInPlaylist = 0; var videosInvalid = 0; var ranOnce = false; Session.set("importingPlaylist", true); $("#import-progress").css({width: "0%"}); function makeAPICall(playlist_id, nextPageToken) { if (nextPageToken !== undefined) { nextPageToken = "&pageToken=" + nextPageToken; } else { nextPageToken = ""; } $.ajax({ type: "GET", url: "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=" + playlist_id + nextPageToken + "&key=AIzaSyAgBdacEWrHCHVPPM4k-AFM7uXg-Q__YXY", applicationType: "application/json", contentType: "json", success: function (data) { if (!ranOnce) { ranOnce = true; totalVideos = data.pageInfo.totalResults; } var nextToken = data.nextPageToken; for (var i in data.items) { var item = data.items[i]; if (item.snippet.thumbnails !== undefined) { var name = Session.get("editingPlaylistName"); if (PrivatePlaylists.find({ type: name, "songs.id": item.snippet.resourceId.videoId }, {songs: {$elemMatch: {id: item.snippet.resourceId.videoId}}}).count() !== 0) { videosInPlaylist++; } else { var percentage = ytImportQueue.length / (totalVideos - videosInvalid) * 100; $("#import-progress").css({width: percentage + "%"}); ytImportQueue.push({id: item.snippet.resourceId.videoId}); } } else { videosInvalid++; } } if (nextToken !== undefined) { makeAPICall(playlist_id, nextToken); } else { Session.set("importingPlaylist", false); $("#import-progress").css({width: "100%"}); var failed = 0; var successful = 0; ytImportQueue.forEach(function(item) { Meteor.call("addVideoToPrivatePlaylist", Session.get("editingPlaylistName"), item.id, function(err, res) { if (err) { console.log(err); failed++; } else if (res) { successful++; } checkDone(); }); }); function checkDone() { if (failed + successful === ytImportQueue.length) { var $toastContent = $('Imported songs. Success: ' + successful + '. Failed: ' + failed + '.'); Materialize.toast($toastContent, 2000); } } } }, error: function() { Session.set("importingPlaylist", false); $("#import-progress").css({width: "0%"}); $("#import-playlist-button").removeAttr("disabled"); $("#import-playlist-button").removeClass("disabled"); $("#playlist-url").removeAttr("disabled"); $("#playlist-url").removeClass("disabled"); } }) } makeAPICall(playlist_id); } }, "click #create_playlist_submit": function() { var name = $("#create_playlist_name").val(); var displayName = $("#create_playlist_display_name").val(); Meteor.call("createPrivatePlaylist", name, displayName, function(err) { if (err) { console.log(err); var $toastContent = $('Playlist not created. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Playlist created.'); Materialize.toast($toastContent, 2000); } }); $("#create_playlist_modal").closeModal(); $("#create_playlist_name").val(""); $("#create_playlist_display_name").val(""); setTimeout(function() { $(".edit-playlist-button").leanModal({ dismissible: true, opacity: .5, in_duration: 500, out_duration: 200 }); }, 500); }, "click .select-playlist": function(e) { e.preventDefault(); $("#edit_playlist_modal").closeModal(); var name = $(e.target).data("playlist"); Meteor.call("setPlaylistForCommunityStation", Session.get("CommunityStationName"), name); } }); Template.home.events({ "click #create_community_station_submit": function () { var name = $("#create_community_station_name").val(); var displayName = $("#create_community_station_display_name").val(); var description = $("#create_community_station_description").val(); Meteor.call("createCommunityStation", name, displayName, true, description, function(err) { if (err) { console.log(err); var $toastContent = $('Community room not created. ' + err.reason + ''); Materialize.toast($toastContent, 2000); } else { var $toastContent = $('Community room created.'); Materialize.toast($toastContent, 2000); } }); $("#create_community_station_name").val(""); $("#create_community_station_display_name").val(""); $("#create_community_station_description").val(""); $("#create_community_station").closeModal(); } }); // Settings Template Template.settings.events({ "change #showRating": function() { Meteor.call("updateSettings", $("#showRating").is(":checked"), function(){}); }, "click #delete-account": function(){ $("#delete-account").text("Click to confirm"); $("#delete-account").click(function(){ var bool = confirm("Are you sure you want to delete your account?"); if(bool) { Meteor.call("deleteAccount"); } else{ $("#delete-account").text("Delete"); } }) }, "click #change-password": function(){ var oldPassword = $("#old-password").val(); var newPassword= $("#new-password").val(); var confirmPassword = $("#confirm-password").val(); if(newPassword === confirmPassword){ Accounts.changePassword(oldPassword, newPassword, function(err){ if(err){ $("#old-password").val(""); $("#new-password").val(""); $("#confirm-password").val(""); $("