1 (function () {
  2   var express = require('express');
  3   var jade = require('jade');
  4   var couchlib = require(__dirname + '/lib/couchlib.js');
  5   var filterlib = require(__dirname + '/lib/filterlib.js');
  6   var fbauth = require(__dirname + '/lib/fbauth.js');
  7   var lib = require(__dirname + '/lib/lib.js');
  8 
  9   exports.fbauth = fbauth;
 10   exports.couchlib = couchlib;
 11   exports.filterlib = filterlib;
 12   exports.lib = lib;
 13 
 14   var create = function (static_dir, session_key, register_code, base_navs, unauth_navs, authed_navs, couchdb_opts) {
 15     var loadUser = function (req, res, next) {
 16       if (typeof req.session.username != 'undefined' && req.session.username.length > 0) {
 17         var cdb = couchlib.get_couchdb_schema(couchdb_opts, 'users');
 18         cdb.get(req.session.username, function (err, doc) {
 19           if (err) {
 20             req.user = false;
 21           } else {
 22             req.user = doc;
 23           }
 24           next();
 25         });
 26       } else {
 27         req.user = false;
 28         next();
 29       }
 30     };
 31     exports.loadUser = loadUser;
 32   
 33     var getNavs = function (req, res, next) {
 34       req.navs = lib.clone(base_navs);
 35       if (req.user == false) {
 36         for(var i in unauth_navs) {
 37           if(unauth_navs.hasOwnProperty(i)) {
 38             req.navs[i] = unauth_navs[i];
 39           };
 40         };
 41       } else {
 42         for(var i in authed_navs) {
 43           if(authed_navs.hasOwnProperty(i)) {
 44             req.navs[i] = authed_navs[i];
 45           };
 46         };
 47       }
 48       next();
 49     };
 50     exports.getNavs = getNavs;
 51 
 52     var app = express.createServer();
 53     app.configure(function() {
 54       app.set('view engine', 'jade');
 55       app.use(express.cookieParser());
 56       app.use(express.bodyParser());
 57       app.use(express.static(static_dir));
 58       app.use(express.responseTime());
 59       app.use(express.session({secret: session_key}));
 60     });
 61 
 62     app.get('/', loadUser, getNavs, function (req, res, next) {
 63       res.render('index.jade', { locals: { navs: req.navs, news: [] } });
 64     });
 65 
 66     app.get('/about', loadUser, getNavs, function (req, res, next) {
 67       res.render('about.jade', { locals: { navs: req.navs } });
 68     });
 69 
 70     var register_vars = function (navs, message, code, username, displayname, email) {
 71       return {navs: navs, message: message, code: code, username: username, displayname: displayname, email: email};
 72     };
 73 
 74     app.get('/register', loadUser, getNavs, function (req, res, next) {
 75       res.render('register.jade', { locals: register_vars(req.navs, '', '', '', '', '') });
 76     });
 77 
 78     app.post('/register', loadUser, getNavs, function (req, res, next) {
 79       var code = filterlib.alphanumeric(req.body.code);
 80       var username = filterlib.alphanumeric_lower(req.body.username);
 81       var displayname = filterlib.alphanumeric(req.body.displayname);
 82       var email = req.body.email;
 83       var password = req.body.password;
 84       var password2 = req.body.password2;
 85       if (register_code.length > 0 && register_code != code) {
 86         res.render('register.jade', { locals: register_vars(req.navs, 'Invalid code', '', username, displayname, email) });
 87       } else {
 88         if (password != password2) {
 89           res.render('register.jade', { locals: register_vars(req.navs, 'Both password fields should be the same.', code, username, displayname, email) });
 90         } else {
 91           fbauth.check_for_user(couchdb_opts, username, function (err, exists) {
 92             if (err) {
 93               res.render('register.jade', { locals: register_vars(req.navs, 'Some error occured!', code, username, displayname, email) });
 94             } else if (exists == true) {
 95               res.render('register.jade', { locals: register_vars(req.navs, 'User already exists, please choose a different username.', code, username, displayname, email) });
 96             } else {
 97               fbauth.check_for_displayname(couchdb_opts, displayname, function (err, exists) {
 98                 if (err) {
 99                   res.render('register.jade', { locals: register_vars(req.navs, 'Some error occured!', code, username, displayname, email) });
100                 } else if (exists == true) {
101                   res.render('register.jade', { locals: register_vars(req.navs, 'Display name already exists, please choose a different display name.', code, username, displayname, email) });
102                 } else {
103                   fbauth.add_user(couchdb_opts, username, displayname, email, password, function (err, success) {
104                     if (err) {
105                       res.render('register.jade', { locals: register_vars(req.navs, 'Some error occured!', code, username, displayname, email) });
106                     } else {
107                       if (success == true) {
108                         req.session.username = username;
109                         res.redirect('/');
110                       } else {
111                         res.render('register.jade', { locals: register_vars(req.navs, 'Some error occured!', code, username, displayname, email) });
112                       }
113                     }
114                   });
115                 }
116               });
117             }
118           });
119         }
120       }
121     });
122 
123     app.get('/login', loadUser, getNavs, function (req, res, next) {
124       res.render('login.jade', { locals: { navs: req.navs, message: '' } });
125     });
126 
127     app.post('/login', loadUser, getNavs, function (req, res, next) {
128       var username = filterlib.alphanumeric_lower(req.body.username);
129       var password = req.body.password;
130       fbauth.login_user(couchdb_opts, username, password, function (err, user) {
131         if (err) {
132           if (err.error == 'not_found') {
133             res.render('login.jade', { locals: { navs: req.navs, message: 'Invalid username or password.' } });
134           } else {
135             if (err == 'invalid_username_password') {
136               res.render('login.jade', { locals: { navs: req.navs, message: 'Invalid username or password.' } });
137             } else {
138               res.render('login.jade', { locals: { navs: req.navs, message: 'Some odd error occured, please tell someone about it.' } });
139             }
140           }
141         } else {
142           req.session.username = username;
143           res.redirect('/');
144         }
145       });
146     });
147 
148     app.get('/logout', function (req, res, next) {
149       req.session.destroy();
150       res.redirect('/');
151     });
152 
153     return app;
154   };
155   exports.create = create;
156 })();
157