| 
					
				 | 
			
			
				@@ -16,6 +16,152 @@ const utils = require('./utils'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var dbConnection = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// station stuff 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var stations = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//TODO Find better name for this (createStation will be to add a station to the db) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function makeStation(id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!getStation(id)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var station = new Station(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		stations.push(station); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return station; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function getStation(id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	stations.forEach(function(station) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		this.station = station; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return this.station; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function Station(id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//TODO Add startedAt and timePaused 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var playlist = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			mid: "3498fd83", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			duration: 20000, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			title: "Test1" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			mid: "3498fd83434", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			duration: 10000, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			title: "Test2" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	];//TODO Get this from RethinkDB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var currentSong = playlist[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var currentSongIndex = 0;//TODO Get this from RethinkDB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var paused = true;//TODO Get this from RethinkDB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var locked = false;//TODO Get this from RethinkDB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var skipVotes = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var timer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.skipSong = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (playlist.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (timer !== undefined) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				timer.pause(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (currentSongIndex+1 < playlist.length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				currentSongIndex++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				currentSongIndex = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			skipVotes = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			currentSong = playlist[currentSongIndex]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			timer = new Timer(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				console.log("Skip!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				self.skipSong(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, currentSong.duration, paused); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//io.emit("skipSong " + id, currentSong); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.toggleVoteSkip = function(userId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (skipVotes.indexOf(userId) === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			skipVotes.push(userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			skipVotes = skipVotes.splice(skipVotes.indexOf(userId), 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//TODO Calculate if enough people voted to skip 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//TODO Emit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.retrievePlaylist = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//TODO Use Rethink to get the Playlist for this room 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.pause = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (!paused) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			paused = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			timer.pause(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//TODO Emit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.unpause = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (paused) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			paused = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			timer.resume(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//TODO Emit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.isPaused = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return paused; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.getCurrentSong = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return currentSong; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.lock = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (!locked) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			locked = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//TODO Emit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.unlock = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (locked) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			locked = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//TODO Emit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.isLocked = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return locked; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.skipSong(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function Timer(callback, delay, paused) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var timerId, start, remaining = delay; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var timeWhenPaused = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var timePaused = Date.now(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.pause = function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		clearTimeout(timerId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		remaining -= Date.now() - start; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		timePaused = Date.now(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.resume = function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		start = Date.now(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		clearTimeout(timerId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		timerId = setTimeout(callback, remaining); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		timeWhenPaused += Date.now() - timePaused; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.resetTimeWhenPaused = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		timeWhenPaused = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this.timeWhenPaused = function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return timeWhenPaused; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (paused === false) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		this.resume(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 module.exports = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	setup: function (dbConn) { 
			 |