text: var socketio = require('socket.io');
  var io;
  var guestNumber = 1;
  var nickNames = {};
  var namesUsed = [];
  var currentRoom = {};
  
  exports.listen = function (server) {
  	io = socketio(server);
  
  	io.sockets.on('connection', function (socket) {
  		guestNumber = assignGuestName(socket, guestNumber, nickNames, namesUsed);
  		joinRoom(socket, 'Lobby');
  
  		handleMessageBroadcasting(socket, nickNames);
  		handleNameChangeAttempts(socket, nickNames, namesUsed);
  		handleRoomJoining(socket);
  
  		socket.on('rooms', function() {
  			// Provides user with list of occupied rooms on request
  			socket.emit('rooms', io.sockets.adapter.rooms);
  		});
  
  		handleClientDisconnection(socket, nickNames, namesUsed);
  	});
  };
  
  function assignGuestName(socket, guestNumber, nickNames, namesUsed) {
  	var name = 'Guest' + guestNumber;
  	nickNames[socket.id] = name;
  	socket.emit('nameResult', {
  		success: true,
  		name: name
  	});
  	namesUsed.push(name);
  	return guestNumber + 1;
  }
  
  function joinRoom(socket, room) {
  	socket.join(room);
  	currentRoom[socket.id] = room;
  	socket.emit('joinResult', {room: room});
  	socket.broadcast.to(room).emit('message', {
  		text: nickNames[socket.id] + ' has joined ' + room + '.'
  	});
  
  	var usersInRoom = io.sockets.adapter.rooms[room];
  	var usersInRoomSummary = 'Users currently in ' + room + ': ';
  	var index = 0;
  	for (var userSocketId in usersInRoom) {
  		if (userSocketId != socket.id) {
  			if (index > 0) {
  				usersInRoomSummary += ', ';
  			}
  			usersInRoomSummary += nickNames[userSocketId];
  			index++;
  		}
  	}
  	usersInRoomSummary += '.';
  	socket.emit('message', {text: usersInRoomSummary});
  }
  
  function handleNameChangeAttempts(socket, nickNames, namesUsed) {
  	socket.on('nameAttempt', function(name) {
  		if (name.indexOf('Guest') === 0) {
  			socket.emit('nameResult', {
  				success: false,
  				message: 'Names cannot begin with "Guest".'
  			});
  		} else {
  			if (namesUsed.indexOf(name) == -1) {
  				var previousName = nickNames[socket.id];
  				var previousNameIndex = namesUsed.indexOf(previousName);
  				namesUsed.push(name);
  				nickNames[socket.id] = name;
  				delete namesUsed[previousNameIndex];
  
  				socket.emit('nameResult', {
  					success: true,
  					name: name
  				});
  				socket.broadcast.to(currentRoom[socket.id]).emit('message', {
  					text: previousName + ' is now known as ' + name + '.'
  				});
  			} else {
  				socket.emit('nameResult', {
  					success: false,
  					message: 'That name is already in use.'
  				});
  			}
  		}
  	});
  }
  
  function handleMessageBroadcasting(socket) {
  	socket.on('message', function (message) {
  		socket.broadcast.to(message.room).emit('message', {
  			text: nickNames[socket.id] + ': ' + message.text
  		});
  	});
  }
  
  function handleRoomJoining(socket) {
  	socket.on('join', function (room) {
  		socket.leave(currentRoom[socket.id]);
  		joinRoom(socket, room.newRoom);
  	});
  }
  
  function handleClientDisconnection(socket) {
  	socket.on('disconnect', function () {
  		var nameIndex = namesUsed.indexOf(nickNames[socket.id]);
  		delete namesUsed[nameIndex];
  		delete nickNames[socket.id];
  	});
  }
  