text: /**
   * Module dependencies.
   */
  var express = require('express');
  var cookieParser = require('cookie-parser');
  var compress = require('compression');
  var favicon = require('serve-favicon');
  var session = require('express-session');
  var bodyParser = require('body-parser');
  var logger = require('morgan');
  var errorHandler = require('errorhandler');
  var lusca = require('lusca');
  var methodOverride = require('method-override');
  var dotenv = require('dotenv');
  var MongoStore = require('connect-mongo/es5')(session);
  var flash = require('express-flash');
  var path = require('path');
  var mongoose = require('mongoose');
  var passport = require('passport');
  var expressValidator = require('express-validator');
  var sass = require('node-sass-middleware');
  var _ = require('lodash');
  
  /**
   * Load environment variables from .env file, where API keys and passwords are configured.
   *
   * Default path: .env
   */
  dotenv.load({ path: '.env.example' });
  
  /**
   * Controllers (route handlers).
   */
  var homeController = require('./controllers/home');
  var userController = require('./controllers/user');
  var apiController = require('./controllers/api');
  var contactController = require('./controllers/contact');
  
  /**
   * API keys and Passport configuration.
   */
  var passportConf = require('./config/passport');
  
  /**
   * Create Express server.
   */
  var app = express();
  var server = require('http').Server(app);
  
  /**
   * Start Socket.io
   */
  var io = require('socket.io')(server);
  
  /**
   * Connect to MongoDB.
   */
  
  console.log('BEFORE MONGO CONNECT');
  
  
  mongoose.connect(process.env.MONGOLAB_URI || 'mongodb://heroku_p53fr611:ttmmvadib4imnmtoqrftj2mqqf@ds049925.mongolab.com:49925/heroku_p53fr611'); 
  mongoose.connection.on('error', function() {
    console.log('MongoDB Connection Error. Please make sure that MongoDB is running.');
    process.exit(1);
  });
  
  console.log('AFTER MONGO CONNECT');
  
  /**
   * Express configuration.
   */
  app.set('port', process.env.PORT || 3000);
  app.set('views', path.join(__dirname, 'views'));
  app.set('view engine', 'jade');
  app.use(compress());
  app.use(sass({
    src: path.join(__dirname, 'public'),
    dest: path.join(__dirname, 'public'),
    debug: true,
    sourceMap: true,
    outputStyle: 'expanded'
  }));
  app.use(logger('dev'));
  app.use(favicon(path.join(__dirname, 'public', 'favicon.png')));
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: true }));
  app.use(expressValidator());
  app.use(methodOverride());
  app.use(cookieParser());
  app.use(session({
    resave: true,
    saveUninitialized: true,
    secret: process.env.SESSION_SECRET,
    store: new MongoStore({
      url: process.env.MONGOLAB_URI || 'mongodb://heroku_p53fr611:ttmmvadib4imnmtoqrftj2mqqf@ds049925.mongolab.com:49925/heroku_p53fr611',
      autoReconnect: true
    })
  }));
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(flash());
  app.use(lusca({
    csrf: true,
    xframe: 'SAMEORIGIN',
    xssProtection: true
  }));
  app.use(function(req, res, next) {
    res.locals.user = req.user;
    next();
  });
  app.use(function(req, res, next) {
    if (/api/i.test(req.path)) {
      req.session.returnTo = req.path;
    }
    next();
  });
  app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
  
  
  /**
   * Primary app routes.
   */
  app.get('/', homeController.index);
  /**
   * Chat history
  **/ 
  
  app.get('/login', userController.getLogin);
  app.post('/login', userController.postLogin);
  app.get('/logout', userController.logout);
  app.get('/forgot', userController.getForgot);
  app.post('/forgot', userController.postForgot);
  app.get('/reset/:token', userController.getReset);
  app.post('/reset/:token', userController.postReset);
  app.get('/signup', userController.getSignup);
  app.post('/signup', userController.postSignup);
  app.get('/contact', contactController.getContact);
  app.post('/contact', contactController.postContact);
  app.get('/account', passportConf.isAuthenticated, userController.getAccount);
  app.post('/account/profile', passportConf.isAuthenticated, userController.postUpdateProfile);
  app.post('/account/password', passportConf.isAuthenticated, userController.postUpdatePassword);
  app.post('/account/delete', passportConf.isAuthenticated, userController.postDeleteAccount);
  app.get('/account/unlink/:provider', passportConf.isAuthenticated, userController.getOauthUnlink);
  
  
  /**
   * API examples routes.
   */
  app.get('/api', apiController.getApi);
  app.get('/api/lastfm', apiController.getLastfm);
  app.get('/api/nyt', apiController.getNewYorkTimes);
  app.get('/api/aviary', apiController.getAviary);
  app.get('/api/steam', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.getSteam);
  app.get('/api/stripe', apiController.getStripe);
  app.post('/api/stripe', apiController.postStripe);
  app.get('/api/scraping', apiController.getScraping);
  app.get('/api/twilio', apiController.getTwilio);
  app.post('/api/twilio', apiController.postTwilio);
  app.get('/api/clockwork', apiController.getClockwork);
  app.post('/api/clockwork', apiController.postClockwork);
  app.get('/api/foursquare', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.getFoursquare);
  app.get('/api/tumblr', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.getTumblr);
  app.get('/api/facebook', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.getFacebook);
  app.get('/api/github', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.getGithub);
  app.get('/api/twitter', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.getTwitter);
  app.post('/api/twitter', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.postTwitter);
  app.get('/api/venmo', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.getVenmo);
  app.post('/api/venmo', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.postVenmo);
  app.get('/api/linkedin', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.getLinkedin);
  app.get('/api/instagram', passportConf.isAuthenticated, passportConf.isAuthorized, apiController.getInstagram);
  app.get('/api/yahoo', apiController.getYahoo);
  app.get('/api/paypal', apiController.getPayPal);
  app.get('/api/paypal/success', apiController.getPayPalSuccess);
  app.get('/api/paypal/cancel', apiController.getPayPalCancel);
  app.get('/api/lob', apiController.getLob);
  app.get('/api/bitgo', apiController.getBitGo);
  app.post('/api/bitgo', apiController.postBitGo);
  
  /**
   * OAuth authentication routes. (Sign in)
   */
  app.get('/auth/instagram', passport.authenticate('instagram'));
  app.get('/auth/instagram/callback', passport.authenticate('instagram', { failureRedirect: '/login' }), function(req, res) {
    res.redirect(req.session.returnTo || '/');
  });
  app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['email', 'user_location'] }));
  app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }), function(req, res) {
    res.redirect(req.session.returnTo || '/');
  });
  app.get('/auth/github', passport.authenticate('github'));
  app.get('/auth/github/callback', passport.authenticate('github', { failureRedirect: '/login' }), function(req, res) {
    res.redirect(req.session.returnTo || '/');
  });
  app.get('/auth/google', passport.authenticate('google', { scope: 'profile email' }));
  app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/login' }), function(req, res) {
    res.redirect(req.session.returnTo || '/');
  });
  app.get('/auth/twitter', passport.authenticate('twitter'));
  app.get('/auth/twitter/callback', passport.authenticate('twitter', { failureRedirect: '/login' }), function(req, res) {
    res.redirect(req.session.returnTo || '/');
  });
  app.get('/auth/linkedin', passport.authenticate('linkedin', { state: 'SOME STATE' }));
  app.get('/auth/linkedin/callback', passport.authenticate('linkedin', { failureRedirect: '/login' }), function(req, res) {
    res.redirect(req.session.returnTo || '/');
  });
  
  /**
   * OAuth authorization routes. (API examples)
   */
  app.get('/auth/foursquare', passport.authorize('foursquare'));
  app.get('/auth/foursquare/callback', passport.authorize('foursquare', { failureRedirect: '/api' }), function(req, res) {
    res.redirect('/api/foursquare');
  });
  app.get('/auth/tumblr', passport.authorize('tumblr'));
  app.get('/auth/tumblr/callback', passport.authorize('tumblr', { failureRedirect: '/api' }), function(req, res) {
    res.redirect('/api/tumblr');
  });
  app.get('/auth/venmo', passport.authorize('venmo', { scope: 'make_payments access_profile access_balance access_email access_phone' }));
  app.get('/auth/venmo/callback', passport.authorize('venmo', { failureRedirect: '/api' }), function(req, res) {
    res.redirect('/api/venmo');
  });
  app.get('/auth/steam', passport.authorize('openid', { state: 'SOME STATE' }));
  app.get('/auth/steam/callback', passport.authorize('openid', { failureRedirect: '/login' }), function(req, res) {
    res.redirect(req.session.returnTo || '/');
  });
  
  
  /**
   * Error Handler.
   */
  app.use(errorHandler());
  
  /**
   * Start Express server.
   */
  server.listen(app.get('port'), function() {
    console.log('Express server listening on port %d in %s mode', app.get('port'), app.get('env'));
  });
  
  module.exports = app;
  
  var clients = [];
  
  var people = {};
  
  var rooms = ['Lobby'];
  
  var words = ['Apple', 'Orange', 'Sushi', 'Basketball'];
  
  
  io.on('connection', function(socket) {
  
    function playGame(room, user1, user2) {
      //incomplete!!
      var word = words[Math.floor(Math.random() * 4)];
      io.sockets.in(room).connected[user1.id].emit("chat", "You're the host! The word is: " + word);
      io.sockets.in(room).connected[user2.id].emit("chat", "You're the guesser!");
      io.sockets.in(room).emit('You have 60 seconds to play.');
      people[user1.id].curWord = word;
      people[user2.id].curWord = word;
      setTimeout(function(){ alert('Time\'s up!')}, 60000);
      
    }
    
    function hasMatch(newUser) {
      for (var i = 0; i < clients.length; ++i) {
        var client = clients[i];
        if (newUser.id == client.id) continue;
        if (people[newUser.id].nativeLang == people[client.id].interestLang 
          && people[newUser.id].interestLang == people[client.id].nativeLang
          && people[client.id].room == 'Lobby') {
          var roomName = people[newUser.id].email;
          rooms.push(roomName);
          people[newUser.id].room = roomName;
          people[client.id].room = roomName;
          client.leave('Lobby');
          client.join(roomName);
          newUser.join(roomName);
          playGame(roomName, client, newUser);
          return true;
        }
      }
      return false;
    }
    
    socket.on('addUser', function(data) {
      console.log(data);
      // gotta make sure user is logged in
      clients.push(socket);
      people[socket.id] = { email: data.email, nativeLang: data.nativeLang,
        interestLang: data.interestLang, room: 'Lobby'
      };
  
      if (!hasMatch(socket)) {
        people[socket.id].room = 'Lobby';
        console.log('no match');
        console.log(people[socket.id].room);
        socket.join('Lobby');
      }
    });
  
    socket.on('chat', function(data) {
      if (people[socket.id] != null) {
        var roomName = people[socket.id].room;
        if (roomName == null) roomName = 'Lobby';
        var curWord = people[socket.id].curWord;
        if (curWord) {
          // regex data for curWord
        }
        io.sockets.in(roomName).emit('chat', data);
      }
    });
  
    socket.on('disconnect', function() {
      if (people[socket.id] != null) {
        var roomName = people[socket.id].room;
        if (roomName == null) roomName = 'Lobby';
        socket.leave(roomName);
      }
      console.log('Socket disconnected');
    });
  
  
  });
  
  