├── .gitignore ├── client ├── favicon.ico ├── assets │ ├── img │ │ ├── bike.png │ │ ├── cat.png │ │ ├── avatar.png │ │ ├── hands.png │ │ ├── violin.png │ │ ├── about-me.png │ │ ├── hands-big.png │ │ ├── jobs │ │ │ ├── cook.jpg │ │ │ ├── driver.jpg │ │ │ ├── carpenter.jpg │ │ │ ├── hometutor.jpg │ │ │ ├── mechanic.jpg │ │ │ ├── painter.jpg │ │ │ ├── plumber.jpg │ │ │ ├── electrician.jpg │ │ │ └── interiordesigner.jpg │ │ ├── smartguy.png │ │ └── alljobs │ │ │ ├── cook.jpg │ │ │ ├── driver.jpg │ │ │ ├── mechanic.jpg │ │ │ ├── painter.jpg │ │ │ ├── plumber.jpg │ │ │ ├── carpenter.jpg │ │ │ ├── electrician.jpg │ │ │ ├── hometutor.jpg │ │ │ └── interiordesigner.jpg │ ├── js │ │ ├── ng-infinite-scroll.min.js │ │ ├── cookie-js.js │ │ ├── angular-resource.js │ │ ├── modernizr-custom.js │ │ ├── app.js │ │ └── bootstrap.min.js │ └── css │ │ ├── bootstrap-theme.min.css │ │ └── styles-bluegreen.css └── html │ ├── home.html │ ├── marked_view.html │ ├── view.html │ ├── formedit.html │ ├── form.html │ └── job_single.html ├── server ├── views │ ├── error.ejs │ ├── login.ejs │ └── index.ejs ├── routes │ ├── index.js │ ├── users.js │ └── job.js ├── models │ ├── likes.js │ ├── comments.js │ ├── notifications.js │ ├── user.js │ └── job.js ├── passport │ └── config.js └── app.js ├── README.md ├── package.json └── bin └── www /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/* -------------------------------------------------------------------------------- /client/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/favicon.ico -------------------------------------------------------------------------------- /client/assets/img/bike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/bike.png -------------------------------------------------------------------------------- /client/assets/img/cat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/cat.png -------------------------------------------------------------------------------- /server/views/error.ejs: -------------------------------------------------------------------------------- 1 |

<%= message %>

2 |

<%= error.status %>

3 |
<%= error.stack %>
4 | -------------------------------------------------------------------------------- /client/assets/img/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/avatar.png -------------------------------------------------------------------------------- /client/assets/img/hands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/hands.png -------------------------------------------------------------------------------- /client/assets/img/violin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/violin.png -------------------------------------------------------------------------------- /client/assets/img/about-me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/about-me.png -------------------------------------------------------------------------------- /client/assets/img/hands-big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/hands-big.png -------------------------------------------------------------------------------- /client/assets/img/jobs/cook.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/jobs/cook.jpg -------------------------------------------------------------------------------- /client/assets/img/smartguy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/smartguy.png -------------------------------------------------------------------------------- /client/assets/img/jobs/driver.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/jobs/driver.jpg -------------------------------------------------------------------------------- /client/assets/img/alljobs/cook.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/alljobs/cook.jpg -------------------------------------------------------------------------------- /client/assets/img/alljobs/driver.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/alljobs/driver.jpg -------------------------------------------------------------------------------- /client/assets/img/jobs/carpenter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/jobs/carpenter.jpg -------------------------------------------------------------------------------- /client/assets/img/jobs/hometutor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/jobs/hometutor.jpg -------------------------------------------------------------------------------- /client/assets/img/jobs/mechanic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/jobs/mechanic.jpg -------------------------------------------------------------------------------- /client/assets/img/jobs/painter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/jobs/painter.jpg -------------------------------------------------------------------------------- /client/assets/img/jobs/plumber.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/jobs/plumber.jpg -------------------------------------------------------------------------------- /client/assets/img/alljobs/mechanic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/alljobs/mechanic.jpg -------------------------------------------------------------------------------- /client/assets/img/alljobs/painter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/alljobs/painter.jpg -------------------------------------------------------------------------------- /client/assets/img/alljobs/plumber.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/alljobs/plumber.jpg -------------------------------------------------------------------------------- /client/assets/img/jobs/electrician.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/jobs/electrician.jpg -------------------------------------------------------------------------------- /client/assets/img/alljobs/carpenter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/alljobs/carpenter.jpg -------------------------------------------------------------------------------- /client/assets/img/alljobs/electrician.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/alljobs/electrician.jpg -------------------------------------------------------------------------------- /client/assets/img/alljobs/hometutor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/alljobs/hometutor.jpg -------------------------------------------------------------------------------- /client/assets/img/jobs/interiordesigner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/jobs/interiordesigner.jpg -------------------------------------------------------------------------------- /client/assets/img/alljobs/interiordesigner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashish-r/mean-stack-job-portal/HEAD/client/assets/img/alljobs/interiordesigner.jpg -------------------------------------------------------------------------------- /client/html/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Home 6 | 7 | 8 |

Welcome Home

9 | 10 | -------------------------------------------------------------------------------- /server/routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET home page. */ 5 | router.get('*', function(req, res, next) { 6 | if(req.user){ 7 | return res.render('index'); 8 | } 9 | else{ 10 | return res.render('login'); 11 | } 12 | }); 13 | 14 | module.exports = router; 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![DeepScan grade](https://deepscan.io/api/teams/10012/projects/12692/branches/199335/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=10012&pid=12692&bid=199335) 2 | 3 | MEAN Stack Website -Freelancer- Add Remove Job Website based on MEAN Stack (MongoDb, Express JS, Angular JS, Node JS) 4 | Demo: https://freelancer-mean-stack.herokuapp.com/ 5 | -------------------------------------------------------------------------------- /server/models/likes.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'); 2 | var Schema = mongoose.Schema; 3 | 4 | var LikeSchema = new Schema ({ 5 | user: {type: String, required: true, ref: 'User'}, 6 | liked_at: {type: Date, default: Date.now()}, 7 | job: {type: String, required: true, ref: 'Job'}, 8 | }); 9 | 10 | 11 | 12 | module.exports = mongoose.model('Like', LikeSchema); -------------------------------------------------------------------------------- /server/models/comments.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by MUNAZIR AHSAN on 21-04-2016. 3 | */ 4 | var mongoose = require('mongoose'); 5 | var Schema = mongoose.Schema; 6 | 7 | var CommentSchema = new Schema ({ 8 | body: {type: String, required: true}, 9 | user: {type: String, required: true, ref: 'User'}, 10 | created_at: {type: Date, default: Date.now()}, 11 | job: {type: String, required: true, ref: 'Job'}, 12 | }); 13 | 14 | 15 | 16 | module.exports = mongoose.model('Comment', CommentSchema); 17 | -------------------------------------------------------------------------------- /server/models/notifications.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by codea on 25-04-2016. 3 | */ 4 | var mongoose = require('mongoose'); 5 | var Schema = mongoose.Schema; 6 | 7 | var NotificationSchema = new Schema ({ 8 | userfrom: {type: String, required: true, ref: 'User'}, 9 | userto: {type: String, required: true, ref: 'User'}, 10 | created_at: {type: Date, default: Date.now()}, 11 | job: {type: String, required: true, ref: 'Job'}, 12 | }); 13 | 14 | 15 | 16 | module.exports = mongoose.model('Notification', NotificationSchema); -------------------------------------------------------------------------------- /server/models/user.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Pratyush on 28-03-2016. 3 | */ 4 | 5 | var mongoose = require('mongoose'); 6 | var Schema = mongoose.Schema; 7 | 8 | var UserSchema = new Schema({ 9 | id: {type: String, required: true, index: {unique: true}}, 10 | name: {type: String, required: true}, 11 | gender: {type: String, required: true}, 12 | profile_pic: {type: String, required: true}, 13 | created_at: {type: Date, default: Date.now()} 14 | }); 15 | 16 | module.exports = mongoose.model('User',UserSchema); 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pool_car", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "async-foreach": "^0.1.3", 10 | "bcrypt-node": "^0.1.0", 11 | "body-parser": "~1.13.2", 12 | "cookie-parser": "~1.3.5", 13 | "debug": "~2.2.0", 14 | "ejs": "~2.3.3", 15 | "express": "~4.13.1", 16 | "express-session": "^1.13.0", 17 | "mongoose": "^4.4.12", 18 | "morgan": "~1.6.1", 19 | "nodemon": "^1.9.1", 20 | "passport-facebook": "^2.1.0", 21 | "serve-favicon": "~2.3.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /server/models/job.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by pritish on 14-04-2016. 3 | */ 4 | var mongoose = require('mongoose'); 5 | var Schema = mongoose.Schema; 6 | 7 | var JobSchema = new Schema({ 8 | service: {type: String, required: true}, 9 | city: {type: String, required: true}, 10 | duration: {type: Number, required: true}, 11 | person: {type: Number, required: true}, 12 | description: {type: String, required: true}, 13 | price_min: {type: Number, required: true}, 14 | price_max: {type: Number, required: true}, 15 | locality: {type: String, required: true}, 16 | begin: {type: Date, required: true}, 17 | user: {type: String, required: true, ref: 'User'}, 18 | image: {type: String}, 19 | created_at: {type: Date, default: Date.now()} 20 | }); 21 | 22 | 23 | module.exports = mongoose.model('Job', JobSchema); -------------------------------------------------------------------------------- /client/assets/js/ng-infinite-scroll.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by codea on 01-05-2016. 3 | */ 4 | /* ng-infinite-scroll - v1.0.0 - 2013-02-23 */ 5 | var mod;mod=angular.module("infinite-scroll",[]),mod.directive("infiniteScroll",["$rootScope","$window","$timeout",function(i,n,e){return{link:function(t,l,o){var r,c,f,a;return n=angular.element(n),f=0,null!=o.infiniteScrollDistance&&t.$watch(o.infiniteScrollDistance,function(i){return f=parseInt(i,10)}),a=!0,r=!1,null!=o.infiniteScrollDisabled&&t.$watch(o.infiniteScrollDisabled,function(i){return a=!i,a&&r?(r=!1,c()):void 0}),c=function(){var e,c,u,d;return d=n.height()+n.scrollTop(),e=l.offset().top+l.height(),c=e-d,u=n.height()*f>=c,u&&a?i.$$phase?t.$eval(o.infiniteScroll):t.$apply(o.infiniteScroll):u?r=!0:void 0},n.on("scroll",c),t.$on("$destroy",function(){return n.off("scroll",c)}),e(function(){return o.infiniteScrollImmediateCheck?t.$eval(o.infiniteScrollImmediateCheck)?c():void 0:c()},0)}}}]); -------------------------------------------------------------------------------- /server/routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var User = require('../models/user'); 4 | var passport = require('passport'); 5 | /* GET users listing. */ 6 | router.get('/', function(req, res, next) { 7 | User.find({}, function(err, car) { 8 | res.json(car); 9 | }); 10 | }); 11 | 12 | router.get('/cuser', function(req, res, next) { 13 | res.json(req.user); 14 | }); 15 | 16 | /* Transfer call to facebook */ 17 | router.get('/auth/facebook', passport.authenticate('facebook')); 18 | /* Handle callback requests */ 19 | router.get('/facebook/callback', function(req, res, next) { 20 | console.log('Enter'); 21 | passport.authenticate('facebook', function(user) { 22 | // Checking if user object is present 23 | if(user.user){ 24 | req.logIn(user.user, function(err){}); 25 | } 26 | res.redirect('/'); 27 | })(req, res, next); 28 | }); 29 | /* logout */ 30 | router.get('/logout', function(req, res) { 31 | req.logout(); 32 | res.redirect('/'); 33 | }); 34 | /* Get Current User */ 35 | router.get('/user', function (req, res) { 36 | if (req.user) { 37 | res.json(req.user); 38 | } else { 39 | res.json({error: 'Not Logged In!'}); 40 | } 41 | }); 42 | /* Demo login */ 43 | 44 | router.get('/dlogin', function(req, res) { 45 | User.findOne({ 46 | name: 'Prashant Kumar' 47 | }, function(err, user) { 48 | if (err || !user) { 49 | return res.send('False'); 50 | } 51 | req.logIn(user, function(err) {}); 52 | res.json(req.user); 53 | }); 54 | }); 55 | 56 | //logout 57 | router.get('/logout', function(req, res) { 58 | req.logout(); 59 | res.send({success: 'Logout successful'}); 60 | }); 61 | 62 | module.exports = router; 63 | -------------------------------------------------------------------------------- /server/passport/config.js: -------------------------------------------------------------------------------- 1 | var User = require('../models/user'); 2 | var FacebookStrategy = require('passport-facebook').Strategy; 3 | module.exports = { 4 | deserialize: function(id, done) { 5 | User.findOne({ 6 | _id: id 7 | }, function(err, user) { 8 | done(err, user); 9 | }) 10 | }, 11 | serialize: function(user, done) { 12 | done(null, user._id); 13 | }, 14 | facebookStrategy: new FacebookStrategy({ 15 | clientID: '271757209831174', 16 | clientSecret: 'f220b7b975fb118c828a78bc48363190', 17 | callbackURL: "https://freelancer-mean-stack.herokuapp.com/api/users/facebook/callback", 18 | profileFields: ['id', 'displayName', 'picture', 'emails', 'gender', 'about', 'bio'] 19 | }, function(accessToken, refreshToken, profile, cb) { 20 | var error = {error: 'Could not log in'}; 21 | console.log(profile); 22 | User.findOne({id: profile.id}, function(err, user){ 23 | 24 | if(err){ 25 | return res.send(error); 26 | } 27 | 28 | if(user){ 29 | var sendUser = {}; 30 | sendUser.type = 'Old user'; 31 | sendUser.user = user; 32 | return cb(sendUser); 33 | } 34 | 35 | var newUser = new User(); 36 | newUser.id = profile.id; 37 | newUser.name = profile.displayName; 38 | newUser.gender = profile.gender; 39 | newUser.profile_pic = profile.photos[0].value; 40 | newUser.save(function(err, user){ 41 | if(err || !user){ 42 | console.log(err); 43 | return cb(error); 44 | } 45 | 46 | var sendUser = {}; 47 | sendUser.type = 'New user'; 48 | sendUser.user = user; 49 | return cb(sendUser); 50 | 51 | }); 52 | 53 | }); 54 | 55 | }) 56 | }; 57 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../server/app'); 8 | var debug = require('debug')('pool_car:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3030'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | 33 | 34 | /* Socket IO */ 35 | var io = app.io; 36 | io.listen(server); 37 | io.on('connection', function(socket){ 38 | console.log('User connected'); 39 | }); 40 | 41 | /** 42 | * Normalize a port into a number, string, or false. 43 | */ 44 | 45 | function normalizePort(val) { 46 | var port = parseInt(val, 10); 47 | 48 | if (isNaN(port)) { 49 | // named pipe 50 | return val; 51 | } 52 | 53 | if (port >= 0) { 54 | // port number 55 | return port; 56 | } 57 | 58 | return false; 59 | } 60 | 61 | /** 62 | * Event listener for HTTP server "error" event. 63 | */ 64 | 65 | function onError(error) { 66 | if (error.syscall !== 'listen') { 67 | throw error; 68 | } 69 | 70 | var bind = typeof port === 'string' 71 | ? 'Pipe ' + port 72 | : 'Port ' + port; 73 | 74 | // handle specific listen errors with friendly messages 75 | switch (error.code) { 76 | case 'EACCES': 77 | console.error(bind + ' requires elevated privileges'); 78 | process.exit(1); 79 | break; 80 | case 'EADDRINUSE': 81 | console.error(bind + ' is already in use'); 82 | process.exit(1); 83 | break; 84 | default: 85 | throw error; 86 | } 87 | } 88 | 89 | /** 90 | * Event listener for HTTP server "listening" event. 91 | */ 92 | 93 | function onListening() { 94 | var addr = server.address(); 95 | var bind = typeof addr === 'string' 96 | ? 'pipe ' + addr 97 | : 'port ' + addr.port; 98 | debug('Listening on ' + bind); 99 | } 100 | -------------------------------------------------------------------------------- /client/html/marked_view.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | 50 | 51 | 52 |
53 |
54 |
 
55 |
56 |
57 | -------------------------------------------------------------------------------- /client/html/view.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | 50 | 51 | 52 |
53 |
54 |
 
55 |
56 |
57 | 58 | 59 | 60 |
61 | More   62 | 63 |
-------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var path = require('path'); 3 | var favicon = require('serve-favicon'); 4 | var logger = require('morgan'); 5 | var cookieParser = require('cookie-parser'); 6 | var bodyParser = require('body-parser'); 7 | var mongoose = require('mongoose'); 8 | var passport = require('passport'); 9 | var passConfig = require('./passport/config.js'); 10 | 11 | 12 | var app = express(); 13 | var io = require('socket.io')(); 14 | app.io = io; 15 | 16 | 17 | 18 | // view engine setup 19 | app.set('views', path.join(__dirname, 'views')); 20 | app.set('view engine', 'ejs'); 21 | //mongoose 22 | mongoose.connect('mongodb://ashish:freelancer12x01y@ds044699.mlab.com:44699/freelancer12x01y'); 23 | // uncomment after placing your favicon in /public 24 | //app.use(favicon(path.join(__dirname, '../client', 'favicon.ico'))); 25 | app.use(logger('dev')); 26 | app.use(bodyParser.json()); 27 | app.use(bodyParser.urlencoded({ 28 | extended: false 29 | })); 30 | app.use(cookieParser()); 31 | app.use(express.static(path.join(__dirname, '../client'))); 32 | app.use(require('express-session')({ 33 | secret: 'keyboard cat', 34 | resave: false, 35 | saveUninitialized: false 36 | })); 37 | app.use(passport.initialize()); 38 | app.use(passport.session()); 39 | passport.serializeUser(passConfig.serialize); 40 | passport.deserializeUser(passConfig.deserialize); 41 | passport.use('facebook', passConfig.facebookStrategy); 42 | 43 | var routes = require('./routes/index'); 44 | var users = require('./routes/users'); 45 | 46 | app.use('/api/jobs', require('./routes/job')(io)); 47 | 48 | app.use('/api/users', users); 49 | 50 | app.use('*', routes); 51 | 52 | 53 | 54 | 55 | // catch 404 and forward to error handler 56 | app.use(function(req, res, next) { 57 | var err = new Error('Not Found'); 58 | err.status = 404; 59 | next(err); 60 | }); 61 | // error handlers 62 | // development error handler 63 | // will print stacktrace 64 | if (app.get('env') === 'development') { 65 | app.use(function(err, req, res, next) { 66 | res.status(err.status || 500); 67 | res.render('error', { 68 | message: err.message, 69 | error: err 70 | }); 71 | }); 72 | } 73 | // production error handler 74 | // no stacktraces leaked to user 75 | app.use(function(err, req, res, next) { 76 | res.status(err.status || 500); 77 | res.render('error', { 78 | message: err.message, 79 | error: {} 80 | }); 81 | }); 82 | module.exports = app; 83 | -------------------------------------------------------------------------------- /client/html/formedit.html: -------------------------------------------------------------------------------- 1 | 2 | Edit Job 3 | 4 |
5 | 6 |
7 | 18 |
19 |
20 | 21 |
22 | 23 |
24 | 31 |
32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 |
40 | 41 | 42 |
43 | 44 |
45 | 46 |
47 |
48 | 49 |
50 | 51 |
52 | 53 | Max length: 100 words 54 |
55 |
56 | 57 |
58 | 59 |
60 | 61 |
62 |
63 | 64 |
65 | 66 |
67 | 68 |
69 |
70 | 71 |
72 | 73 |
74 | 75 | 76 |
77 |
78 |
79 | 80 |
81 | 82 |
83 |
84 | 85 | 86 |
87 | 88 | 89 | 90 |
91 | 92 | 93 | -------------------------------------------------------------------------------- /client/html/form.html: -------------------------------------------------------------------------------- 1 | 2 | Post Job 3 | 4 |
5 | 6 |
7 | 18 |
19 |
20 | 21 |
22 | 23 |
24 | 31 |
32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 |
40 | 41 | 42 |
43 | 44 |
45 | 46 |
47 |
48 | 49 |
50 | 51 |
52 | 53 | Max length: 100 words 54 |
55 |
56 | 57 |
58 | 59 |
60 | 61 |
62 |
63 | 64 |
65 | 66 |
67 | 68 |
69 |
70 | 71 |
72 | 73 |
74 | 75 | 76 |
77 |
78 |
79 | 80 |
81 | 82 |
83 |
84 | 85 | 86 |
87 | 88 | 89 | 90 |
91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /client/assets/js/cookie-js.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * JavaScript Cookie v2.1.0 3 | * https://github.com/js-cookie/js-cookie 4 | * 5 | * Copyright 2006, 2015 Klaus Hartl & Fagner Brack 6 | * Released under the MIT license 7 | */ 8 | (function (factory) { 9 | if (typeof define === 'function' && define.amd) { 10 | define(factory); 11 | } else if (typeof exports === 'object') { 12 | module.exports = factory(); 13 | } else { 14 | var _OldCookies = window.Cookies; 15 | var api = window.Cookies = factory(); 16 | api.noConflict = function () { 17 | window.Cookies = _OldCookies; 18 | return api; 19 | }; 20 | } 21 | }(function () { 22 | function extend () { 23 | var i = 0; 24 | var result = {}; 25 | for (; i < arguments.length; i++) { 26 | var attributes = arguments[ i ]; 27 | for (var key in attributes) { 28 | result[key] = attributes[key]; 29 | } 30 | } 31 | return result; 32 | } 33 | 34 | function init (converter) { 35 | function api (key, value, attributes) { 36 | var result; 37 | 38 | // Write 39 | 40 | if (arguments.length > 1) { 41 | attributes = extend({ 42 | path: '/' 43 | }, api.defaults, attributes); 44 | 45 | if (typeof attributes.expires === 'number') { 46 | var expires = new Date(); 47 | expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5); 48 | attributes.expires = expires; 49 | } 50 | 51 | try { 52 | result = JSON.stringify(value); 53 | if (/^[\{\[]/.test(result)) { 54 | value = result; 55 | } 56 | } catch (e) {} 57 | 58 | if (!converter.write) { 59 | value = encodeURIComponent(String(value)) 60 | .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent); 61 | } else { 62 | value = converter.write(value, key); 63 | } 64 | 65 | key = encodeURIComponent(String(key)); 66 | key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent); 67 | key = key.replace(/[\(\)]/g, escape); 68 | 69 | return (document.cookie = [ 70 | key, '=', value, 71 | attributes.expires && '; expires=' + attributes.expires.toUTCString(), // use expires attribute, max-age is not supported by IE 72 | attributes.path && '; path=' + attributes.path, 73 | attributes.domain && '; domain=' + attributes.domain, 74 | attributes.secure ? '; secure' : '' 75 | ].join('')); 76 | } 77 | 78 | // Read 79 | 80 | if (!key) { 81 | result = {}; 82 | } 83 | 84 | // To prevent the for loop in the first place assign an empty array 85 | // in case there are no cookies at all. Also prevents odd result when 86 | // calling "get()" 87 | var cookies = document.cookie ? document.cookie.split('; ') : []; 88 | var rdecode = /(%[0-9A-Z]{2})+/g; 89 | var i = 0; 90 | 91 | for (; i < cookies.length; i++) { 92 | var parts = cookies[i].split('='); 93 | var name = parts[0].replace(rdecode, decodeURIComponent); 94 | var cookie = parts.slice(1).join('='); 95 | 96 | if (cookie.charAt(0) === '"') { 97 | cookie = cookie.slice(1, -1); 98 | } 99 | 100 | try { 101 | cookie = converter.read ? 102 | converter.read(cookie, name) : converter(cookie, name) || 103 | cookie.replace(rdecode, decodeURIComponent); 104 | 105 | if (this.json) { 106 | try { 107 | cookie = JSON.parse(cookie); 108 | } catch (e) {} 109 | } 110 | 111 | if (key === name) { 112 | result = cookie; 113 | break; 114 | } 115 | 116 | if (!key) { 117 | result[name] = cookie; 118 | } 119 | } catch (e) {} 120 | } 121 | 122 | return result; 123 | } 124 | 125 | api.get = api.set = api; 126 | api.getJSON = function () { 127 | return api.apply({ 128 | json: true 129 | }, [].slice.call(arguments)); 130 | }; 131 | api.defaults = {}; 132 | 133 | api.remove = function (key, attributes) { 134 | api(key, '', extend(attributes, { 135 | expires: -1 136 | })); 137 | }; 138 | 139 | api.withConverter = init; 140 | 141 | return api; 142 | } 143 | 144 | return init(function () {}); 145 | })); 146 | -------------------------------------------------------------------------------- /server/views/login.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Freelancer 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
51 |
52 |
53 | 58 | 59 |
60 | 61 | Login 62 | 63 |
64 | 65 | 74 | 75 |
76 |
77 | 78 | 79 |
80 | 81 | 82 | 83 |
84 |
85 |
86 |

Login

87 |
88 | 98 | 99 |
100 |
101 | 102 |
103 | 104 | 105 | 106 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /client/assets/js/angular-resource.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.5.0 3 | (c) 2010-2016 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(Q,d,G){'use strict';function H(t,g){g=g||{};d.forEach(g,function(d,q){delete g[q]});for(var q in t)!t.hasOwnProperty(q)||"$"===q.charAt(0)&&"$"===q.charAt(1)||(g[q]=t[q]);return g}var z=d.$$minErr("$resource"),N=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;d.module("ngResource",["ng"]).provider("$resource",function(){var t=/^https?:\/\/[^\/]*/,g=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}}; 7 | this.$get=["$http","$log","$q","$timeout",function(q,M,I,J){function A(d,h){return encodeURIComponent(d).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,h?"%20":"+")}function B(d,h){this.template=d;this.defaults=v({},g.defaults,h);this.urlParams={}}function K(e,h,n,k){function c(a,b){var c={};b=v({},h,b);u(b,function(b,h){x(b)&&(b=b());var f;if(b&&b.charAt&&"@"==b.charAt(0)){f=a;var l=b.substr(1);if(null==l||""===l||"hasOwnProperty"===l||!N.test("."+ 8 | l))throw z("badmember",l);for(var l=l.split("."),m=0,k=l.length;m 2 |
3 |

{{jobSingle.service | uppercase}}


4 |

₹{{jobSingle.price_min}} - ₹{{jobSingle.price_max}}, {{jobSingle.city}}

5 |
6 | {{jobSingle.service}} 7 |
8 | 9 |
10 | 11 | {{jobSingle.user.name}} 12 |
13 |
14 | 15 | {{jobSingle.begin| date}} 16 |
17 |
18 | 19 | {{jobSingle.person}} Person(s) 20 |
21 |
22 | 23 |
24 |
25 | 26 | 29 | 30 | 31 | 32 | 36 | 37 |
38 |
39 |
40 |
41 |
42 | 43 | 44 | 45 |

{{jobSingle.description}}
46 | 47 | 48 | Locality: {{jobSingle.locality}}
49 | 50 | Duration: {{jobSingle.duration}} days

51 | 52 |
53 | 54 | 55 | 56 | 65 |
66 | 116 | 117 | -------------------------------------------------------------------------------- /client/assets/js/modernizr-custom.js: -------------------------------------------------------------------------------- 1 | /*! modernizr 3.2.0 (Custom Build) | MIT * 2 | * http://modernizr.com/download/?-inlinesvg-domprefixes-hasevent-prefixed-prefixes-shiv-testallprops-testprop-teststyles !*/ 3 | !function(e,t,n){function r(e,t){return typeof e===t}function o(){var e,t,n,o,i,a,s;for(var l in C)if(C.hasOwnProperty(l)){if(e=[],t=C[l],t.name&&(e.push(t.name.toLowerCase()),t.options&&t.options.aliases&&t.options.aliases.length))for(n=0;nd;d++)if(h=e[d],v=P.style[h],l(h,"-")&&(h=a(h)),P.style[h]!==n){if(i||r(o,"undefined"))return u(),"pfx"==t?h:!0;try{P.style[h]=o}catch(y){}if(P.style[h]!=v)return u(),"pfx"==t?h:!0}return u(),!1}function v(e,t,n,o,i){var a=e.charAt(0).toUpperCase()+e.slice(1),s=(e+" "+j.join(a+" ")+a).split(" ");return r(t,"string")||r(t,"undefined")?h(s,t,o,i):(s=(e+" "+w.join(a+" ")+a).split(" "),d(s,t,n))}function g(e,t,r){return v(e,n,n,t,r)}var y=[],C=[],E={_version:"3.2.0",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,t){var n=this;setTimeout(function(){t(n[e])},0)},addTest:function(e,t,n){C.push({name:e,fn:t,options:n})},addAsyncTest:function(e){C.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=E,Modernizr=new Modernizr;var S=E._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):[];E._prefixes=S;var b="Moz O ms Webkit",w=E._config.usePrefixes?b.toLowerCase().split(" "):[];E._domPrefixes=w;var x=t.documentElement,_="svg"===x.nodeName.toLowerCase();_||!function(e,t){function n(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function r(){var e=C.elements;return"string"==typeof e?e.split(" "):e}function o(e,t){var n=C.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof e&&(e=e.join(" ")),C.elements=n+" "+e,u(t)}function i(e){var t=y[e[v]];return t||(t={},g++,e[v]=g,y[g]=t),t}function a(e,n,r){if(n||(n=t),c)return n.createElement(e);r||(r=i(n));var o;return o=r.cache[e]?r.cache[e].cloneNode():h.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e),!o.canHaveChildren||m.test(e)||o.tagUrn?o:r.frag.appendChild(o)}function s(e,n){if(e||(e=t),c)return e.createDocumentFragment();n=n||i(e);for(var o=n.frag.cloneNode(),a=0,s=r(),l=s.length;l>a;a++)o.createElement(s[a]);return o}function l(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return C.shivMethods?a(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'})+");return n}")(C,t.frag)}function u(e){e||(e=t);var r=i(e);return!C.shivCSS||f||r.hasCSS||(r.hasCSS=!!n(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),c||l(e,r),e}var f,c,d="3.7.3",p=e.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,h=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",g=0,y={};!function(){try{var e=t.createElement("a");e.innerHTML="",f="hidden"in e,c=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(n){f=!0,c=!0}}();var C={elements:p.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:p.shivCSS!==!1,supportsUnknownElements:c,shivMethods:p.shivMethods!==!1,type:"default",shivDocument:u,createElement:a,createDocumentFragment:s,addElements:o};e.html5=C,u(t),"object"==typeof module&&module.exports&&(module.exports=C)}("undefined"!=typeof e?e:this,t);var N=function(e){function n(t,n){var o;return t?(n&&"string"!=typeof n||(n=s(n||"div")),t="on"+t,o=t in n,!o&&r&&(n.setAttribute||(n=s("div")),n.setAttribute(t,""),o="function"==typeof n[t],n[t]!==e&&(n[t]=e),n.removeAttribute(t)),o):!1}var r=!("onblur"in t.documentElement);return n}();E.hasEvent=N,Modernizr.addTest("inlinesvg",function(){var e=s("div");return e.innerHTML="","http://www.w3.org/2000/svg"==("undefined"!=typeof SVGRect&&e.firstChild&&e.firstChild.namespaceURI)});var j=E._config.usePrefixes?b.split(" "):[];E._cssomPrefixes=j;var k=function(t){var r,o=S.length,i=e.CSSRule;if("undefined"==typeof i)return n;if(!t)return!1;if(t=t.replace(/^@/,""),r=t.replace(/-/g,"_").toUpperCase()+"_RULE",r in i)return"@"+t;for(var a=0;o>a;a++){var s=S[a],l=s.toUpperCase()+"_"+r;if(l in i)return"@-"+s.toLowerCase()+"-"+t}return!1};E.atRule=k;var z=(E.testStyles=f,{elem:s("modernizr")});Modernizr._q.push(function(){delete z.elem});var P={style:z.elem.style};Modernizr._q.unshift(function(){delete P.style});E.testProp=function(e,t,r){return h([e],n,t,r)};E.testAllProps=v;E.prefixed=function(e,t,n){return 0===e.indexOf("@")?k(e):(-1!=e.indexOf("-")&&(e=a(e)),t?v(e,t,n):v(e,"pfx"))};E.testAllProps=g,o(),i(y),delete E.addTest,delete E.addAsyncTest;for(var T=0;T 2 | 3 | 4 | 5 | 6 | 7 | 8 | Freelancer 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
56 |
57 |
58 | 63 | 64 |
65 | 66 | 67 | 68 | {{notifications.length}} 69 |
70 | 71 | 115 | 116 |
117 |
118 | 119 | 120 |
121 | 122 |
123 |
124 |
125 |
126 | 127 |
128 | 185 |
186 |
187 |
188 | 189 |
190 | 191 | 197 |
198 | 199 | 200 | 201 | 202 | 203 | 204 | -------------------------------------------------------------------------------- /client/assets/js/app.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('myApp', ['ngResource', 'ngRoute', 'infinite-scroll']); 2 | 3 | app.factory('socket', function ($rootScope) { 4 | var socket = io.connect(); 5 | return { 6 | on: function (eventName, callback) { 7 | socket.on(eventName, function () { 8 | var args = arguments; 9 | $rootScope.$apply(function () { 10 | callback.apply(socket, args); 11 | }); 12 | }); 13 | }, 14 | emit: function (eventName, data, callback) { 15 | socket.emit(eventName, data, function () { 16 | var args = arguments; 17 | $rootScope.$apply(function () { 18 | if (callback) { 19 | callback.apply(socket, args); 20 | } 21 | }); 22 | }) 23 | } 24 | }; 25 | }); 26 | 27 | 28 | app.factory('Job', function ($resource) { 29 | return $resource('/api/jobs/:jobid/:exparams', null, { 30 | 'update': {method: 'PUT'}, 31 | 'liked': { 32 | method: 'GET', 33 | params: { 34 | exparams: 'liked' 35 | } 36 | } 37 | }); 38 | }); 39 | 40 | app.factory('UserJob', function ($resource) { 41 | return $resource('/api/jobs/users/:userId/jobs', null, { 42 | 'update': {method: 'PUT'} 43 | }); 44 | } 45 | ); 46 | 47 | app.factory('MarkedJob', function ($resource) { 48 | return $resource('/api/jobs/users/:userId/likes/:lid', null, { 49 | 'update': {method: 'PUT'} 50 | }); 51 | } 52 | ); 53 | 54 | app.factory('Like', function ($resource) { 55 | return $resource('/api/jobs/:jid/likes/:lid', null, { 56 | 'update': {method: 'PUT'} 57 | }); 58 | } 59 | ); 60 | 61 | app.factory('Notification', function ($resource) { 62 | return $resource('/api/jobs/users/:userId/notifications/:nId', null, { 63 | 'update': {method: 'PUT'} 64 | }); 65 | } 66 | ); 67 | 68 | app.factory('Comment', function ($resource) { 69 | return $resource('/api/jobs/:jid/comments/:cid', null, { 70 | 'update': {method: 'PUT'} 71 | }); 72 | } 73 | ); 74 | 75 | app.controller('JobController', function ($scope, $rootScope, $http, socket, $routeParams, Job, Comment, Notification) { 76 | $scope.jobObject = {}; 77 | $scope.showEditBox = []; 78 | if ($routeParams.jobid) { 79 | $scope.jobSingle = Job.get({jobid: $routeParams.jobid}); 80 | $scope.comments = Comment.query({jid: $routeParams.jobid}); 81 | 82 | } 83 | 84 | $scope.cancelpostJob = function(){ 85 | $scope.jobObject.begin=''; 86 | $scope.jobObject.city=''; 87 | $scope.jobObject.description=''; 88 | $scope.jobObject.duration=''; 89 | $scope.jobObject.locality =''; 90 | $scope.jobObject.person =''; 91 | $scope.jobObject.price_max =''; 92 | $scope.jobObject.price_min =''; 93 | $scope.jobObject.service =''; 94 | 95 | 96 | } 97 | 98 | $scope.postJob = function () { 99 | var newJob = new Job(); 100 | newJob.begin = $scope.jobObject.begin; 101 | newJob.city = $scope.jobObject.city; 102 | newJob.description = $scope.jobObject.description; 103 | newJob.duration = $scope.jobObject.duration; 104 | newJob.locality = $scope.jobObject.locality; 105 | newJob.person = $scope.jobObject.person; 106 | newJob.price_max = $scope.jobObject.price_max; 107 | newJob.price_min = $scope.jobObject.price_min; 108 | newJob.service = $scope.jobObject.service; 109 | 110 | 111 | newJob.$save(function (job) { 112 | console.log(job); 113 | if (!job.error) { 114 | window.location = '/' 115 | } 116 | }, 117 | function (err) { 118 | console.log(err); 119 | }) 120 | } 121 | 122 | socket.on('comment', function (comment) { 123 | $scope.comments.unshift(comment); 124 | }); 125 | 126 | 127 | // Moment js 128 | $rootScope.timeInWords = function (date) { 129 | return moment(date).fromNow(); 130 | }; 131 | 132 | $scope.postComment = function () { 133 | var newComment = new Comment(); 134 | 135 | newComment.comment = $scope.commentBody; 136 | newComment.$save({jid: $routeParams.jobid}, function (comment) { 137 | console.log(comment); 138 | if (!comment.error) { 139 | $scope.commentBody = ''; 140 | $scope.commentBox = ''; 141 | } 142 | }); 143 | 144 | 145 | } 146 | 147 | $scope.cancelComment = function () { 148 | $scope.commentBody = ''; 149 | $scope.commentBox = ''; 150 | } 151 | 152 | 153 | $scope.showEditBoxfunction = function(index) { 154 | $scope.showEditBox[index] = !$scope.showEditBox[index]; 155 | } 156 | 157 | //edit comment 158 | $scope.updateComment = function(jid, comment, index) { 159 | var updateComment = new Comment(); 160 | updateComment.body = $scope.editComment; 161 | Comment.update({ 162 | jid: jid, 163 | cid: comment._id 164 | }, comment, function(comment) { 165 | console.log(comment); 166 | $scope.showEditBoxfunction(index); 167 | }, function(err) { 168 | console.log(err); 169 | }) 170 | } 171 | 172 | 173 | 174 | $scope.delComment = function (jid, comId, index) { 175 | Comment.remove({jid: jid, cid: comId}, function (comment, err) { 176 | if (comment.error) { 177 | console.log(err); 178 | } 179 | $scope.comments.splice(index, 1); 180 | }); 181 | }; 182 | 183 | }); 184 | 185 | app.controller('UserJobController', function ($scope, $rootScope, socket, $http, $routeParams, UserJob) { 186 | $rootScope.jobs = UserJob.query({userId: $routeParams.userId}); 187 | 188 | 189 | }); 190 | 191 | 192 | app.controller('MarkJobController', function ($scope, $rootScope, socket, $http, $routeParams, MarkedJob, Job, Like) { 193 | var likeUnmark = false; 194 | $scope.marks = MarkedJob.query({userId: $routeParams.userId}); 195 | 196 | $rootScope.timeInWords = function (date) { 197 | return moment(date).fromNow(); 198 | }; 199 | 200 | $rootScope.delJob = function (jobId, index) { 201 | Job.remove({jobid: jobId}, function (job, err) { 202 | if (job.error) { 203 | console.log(err); 204 | } 205 | $scope.marks.splice(index, 1); 206 | }); 207 | }; 208 | 209 | $rootScope.postLike = function (jobid) { 210 | var newLike = new Like(); 211 | newLike.$save({jid: jobid}, function (like) { 212 | console.log(like); 213 | 214 | if (!like.error) { 215 | 216 | } 217 | }); 218 | } 219 | }); 220 | 221 | app.controller('ViewController', function ($scope, $routeParams, $rootScope, $http, Job, socket, Like, Notification) { 222 | $rootScope.jobs = []; 223 | $scope.lastJobId = undefined; 224 | $scope.loadBool = false; 225 | $rootScope.jobs = Job.query(function(jobs) { 226 | for (var i in jobs) { 227 | if (jobs[i]._id) { 228 | $scope.lastJobId = jobs[jobs.length - 1]._id; 229 | } 230 | } 231 | $scope.loadBool = true; 232 | }); 233 | 234 | //edit job 235 | $rootScope.editJob = function(index) { 236 | $rootScope.index = index; 237 | } 238 | 239 | $rootScope.updateEditJob= function(jid, job) { 240 | Job.update({jobid: jid}, job, function(job) { 241 | console.log(job); 242 | window.location ="/" 243 | }, function(err) { 244 | console.log(err); 245 | }) 246 | 247 | } 248 | 249 | $rootScope.canceleditJob = function(){ 250 | window.location ='/'; 251 | } 252 | 253 | 254 | $scope.loadMore = function() { 255 | if (!$scope.loadBool) { 256 | return; 257 | } 258 | $scope.loadBool = false; 259 | Job.query({ 260 | lid: $scope.lastJobId 261 | }, function(jobs) { 262 | for (var i in jobs) { 263 | if (jobs[i]._id) { 264 | $scope.lastJobId = jobs[i]._id; 265 | $rootScope.jobs.unshift(jobs[i]); 266 | } 267 | } 268 | $scope.loadBool = true; 269 | }); 270 | 271 | }; 272 | 273 | 274 | $http.get('/api/users/cuser') 275 | .success(function (currentUser) { 276 | $rootScope.currentUser = currentUser; 277 | console.log(currentUser); 278 | $rootScope.notifications = Notification.query({userId: $rootScope.currentUser._id}, function (data) { 279 | console.log(data); 280 | }, function (err) { 281 | console.log(err); 282 | }); 283 | //logout function 284 | $rootScope.logout = function() { 285 | $http.get('/api/users/logout').then(function(response) { 286 | window.location.reload(); 287 | }); 288 | } 289 | 290 | // Check Notifications 291 | $rootScope.checkNoti = function (notId, index) { 292 | Notification.remove({nId: notId, userId: $rootScope.currentUser._id}, function (notification, err) { 293 | if (notification.error) { 294 | console.log(err); 295 | } 296 | $scope.notifications.splice(index, 1); 297 | }); 298 | 299 | }; 300 | 301 | 302 | $rootScope.delJob = function (jobId, index) { 303 | Job.remove({jobid: jobId}, function (job, err) { 304 | if (job.error) { 305 | console.log(err); 306 | } 307 | $rootScope.jobs.splice(index, 1); 308 | }); 309 | }; 310 | 311 | 312 | }); 313 | $rootScope.isLiked = function (id) { 314 | return Job.liked({jobid: id}); 315 | }; 316 | 317 | 318 | 319 | // Moment js 320 | $scope.timeInWords = function (date) { 321 | return moment(date).fromNow(); 322 | }; 323 | 324 | socket.on('notification', function (notification) { 325 | $scope.notifications.unshift(notification); 326 | }); 327 | 328 | socket.on('job', function (job) { 329 | $rootScope.jobs.unshift(job); 330 | }); 331 | 332 | $rootScope.postLike = function (jobid) { 333 | 334 | var newLike = new Like(); 335 | newLike.$save({jid: jobid}, function (like) { 336 | 337 | if (like.error) { 338 | console.log(err); 339 | } 340 | console.log(like); 341 | 342 | }); 343 | } 344 | 345 | }); 346 | 347 | 348 | app.config(function ($routeProvider, $locationProvider) { 349 | $routeProvider 350 | 351 | .when('/home', { 352 | templateUrl: '/html/home.html', 353 | controller: 'ViewController' 354 | }) 355 | .when('/postjob', { 356 | templateUrl: '/html/form.html', 357 | controller: 'JobController' 358 | }) 359 | .when('/editjob', { 360 | templateUrl: '/html/formedit.html', 361 | controller: 'ViewController' 362 | }) 363 | .when('/jobs/:jobid', { 364 | templateUrl: '/html/job_single.html', 365 | controller: 'JobController' 366 | }) 367 | .when('/user/:userId/jobs', { 368 | templateUrl: '/html/view.html', 369 | controller: 'UserJobController' 370 | }) 371 | .when('/user/:userId/markedjobs', { 372 | templateUrl: '/html/marked_view.html', 373 | controller: 'MarkJobController' 374 | }) 375 | 376 | .otherwise({ 377 | templateUrl: '/html/view.html', 378 | controller: 'ViewController' 379 | }); 380 | 381 | // configure html5 to get links working on jsfiddle 382 | $locationProvider.html5Mode({ 383 | enabled: true, 384 | requireBase: false 385 | }); 386 | 387 | }); -------------------------------------------------------------------------------- /server/routes/job.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by pritish on 14-04-2016. 3 | */ 4 | module.exports = function (io) { 5 | var express = require('express'); 6 | var router = express.Router(); 7 | var User = require('../models/user'); 8 | var Job = require('../models/job'); 9 | var Comment = require('../models/comments'); 10 | var Like = require('../models/likes'); 11 | var Notification = require('../models/notifications'); 12 | var forEach = require('async-foreach').forEach; 13 | 14 | router.get('/', function (req, res) { 15 | var search = {}; 16 | if (req.query.lid) { 17 | search = { 18 | _id: { 19 | $lt: req.query.lid 20 | } 21 | } 22 | } 23 | 24 | Job.find(search).limit(12) 25 | .populate('user') 26 | .sort({_id: -1}) 27 | .lean() 28 | .exec(function (err, jobs) { 29 | if (err) { 30 | return res.json({error: err}); 31 | } 32 | 33 | forEach(jobs, function (item, index, array) { 34 | var done = this.async(); 35 | Like.findOne({user: req.user._id, job: jobs[index]._id}, function (err, like) { 36 | if (err) { 37 | console.log(err); 38 | done(); 39 | return false; 40 | } 41 | if (like) { 42 | jobs[index].like = true; 43 | } else { 44 | jobs[index].like = false; 45 | } 46 | done(); 47 | }); 48 | 49 | }, function (err, jobsArr) { 50 | return res.json(jobs) 51 | }); 52 | 53 | }); 54 | }) 55 | 56 | 57 | router.post('/', function (req, res) { 58 | 59 | var job = new Job(); 60 | job.duration = req.body.duration; 61 | job.person = req.body.person; 62 | job.description = req.body.description; 63 | job.price_min = req.body.price_min; 64 | job.price_max = req.body.price_max; 65 | job.locality = req.body.locality; 66 | job.begin = req.body.begin; 67 | job.city = req.body.city; 68 | job.service = req.body.service; 69 | job.user = req.user._id; 70 | job.save(function (err, job) { 71 | if (err) { 72 | return res.json(err) 73 | } 74 | job.user = req.user; 75 | io.emit('job', job); 76 | return res.json(job) 77 | }) 78 | }) 79 | 80 | router.get('/:id', function (req, res) { 81 | 82 | Job.findOne({_id: req.params.id}) 83 | .populate('user') 84 | .exec(function (err, job) { 85 | if (err) { 86 | return res.json(err); 87 | } 88 | return res.json(job); 89 | }) 90 | }) 91 | 92 | router.put('/:id', function (req, res) { 93 | var jobEdit = {}; 94 | jobEdit.begin = req.body.begin; 95 | jobEdit.city = req.body.city; 96 | jobEdit.description = req.body.description; 97 | jobEdit.duration = req.body.duration; 98 | jobEdit.locality = req.body.locality; 99 | jobEdit.person = req.body.person; 100 | jobEdit.price_max = req.body.price_max; 101 | jobEdit.price_min = req.body.price_min; 102 | jobEdit.service = req.body.service; 103 | 104 | Job.findOneAndUpdate({_id: req.params.id}, jobEdit, function (err, job) { 105 | if (err) { 106 | return res.json(err); 107 | } 108 | return res.json(job); 109 | }) 110 | 111 | }); 112 | router.delete('/:id', function (req, res) { 113 | 114 | Job.findOneAndRemove({_id: req.params.id}, function (err, job) { 115 | if (err) { 116 | return res.json(err); 117 | } 118 | Like.remove({job: req.params.id}, function (err, likes) { 119 | if (err) { 120 | return res.json(err); 121 | } 122 | Comment.remove({job: req.params.id}, function (err, comments) { 123 | if (err) { 124 | return res.json(err); 125 | } 126 | return res.json(job); 127 | }) 128 | }) 129 | 130 | }) 131 | }); 132 | 133 | router.delete('/:id/comments/:cid', function (req, res) { 134 | Comment.findOneAndRemove({_id: req.params.cid}, function (err, comment) { 135 | if (err) { 136 | return res.json(err); 137 | } 138 | return res.json(comment); 139 | }) 140 | }); 141 | 142 | router.put('/:id/comments/:cid', function(req, res, next) { 143 | var commentEdit = {}; 144 | commentEdit.body = req.body.body; 145 | 146 | Comment.findByIdAndUpdate({_id: req.params.cid}, commentEdit, function(err, comment) { 147 | if (err) { 148 | return res.send(err); 149 | } 150 | return res.send(comment); 151 | }); 152 | }); 153 | 154 | router.get('/:id/comments', function (req, res) { 155 | Comment.find({job: req.params.id}) 156 | .populate('user') 157 | .sort({_id: -1}) 158 | .lean() 159 | 160 | .exec(function (err, comments) { 161 | if (err) { 162 | return res.json({error: err}); 163 | } 164 | return res.json(comments) 165 | }); 166 | }) 167 | 168 | router.post('/:id/comments', function (req, res, next) { 169 | 170 | if (!req.user) { 171 | res.json({error: 'Not signed in'}); 172 | } else { 173 | 174 | var comment = new Comment(); 175 | comment.body = req.body.comment; 176 | comment.user = req.user._id; 177 | comment.job = req.params.id; 178 | comment.save(function (err, comment) { 179 | if (err || !comment) { 180 | console.log(err); 181 | return res.json({error: 'comment not posted'}); 182 | } else { 183 | Job.findOne({_id: req.params.id}, function (err, job) { 184 | if (err) { 185 | console.log(err); 186 | return res.send({error: err}); 187 | } 188 | var notification = new Notification(); 189 | notification.userfrom = req.user._id; 190 | notification.job = req.params.id; 191 | notification.userto = job.user; 192 | if (notification.userfrom == notification.userto) { 193 | comment.user = req.user; 194 | io.emit('comment', comment); 195 | res.json(comment); 196 | } 197 | else { 198 | notification.save(function (err, notification) { 199 | if (err) { 200 | console.log(err); 201 | return res.send({error: err}); 202 | } 203 | comment.user = req.user; 204 | notification.userfrom = req.user; 205 | notification.job = job; 206 | io.emit('comment', comment); 207 | io.emit('notification', notification); 208 | res.json(comment); 209 | }); 210 | } 211 | }) 212 | } 213 | }); 214 | } 215 | 216 | }); 217 | 218 | 219 | router.get('/users/:userId/likes', function (req, res) { 220 | Like.find({user: req.params.userId}) 221 | .populate('job') 222 | .sort({_id: -1}) 223 | .lean() 224 | .exec(function (err, likes) { 225 | if (err) { 226 | return res.json({error: err}); 227 | } 228 | User.populate(likes, {path: 'job.user'}, function (err, data) { 229 | if (err) { 230 | return res.send({error: err}); 231 | } 232 | 233 | return res.json(likes) 234 | }) 235 | }); 236 | }) 237 | 238 | router.get('/:jid/liked', function (req, res) { 239 | if (!req.user) { 240 | res.json({error: 'Not signed in'}); 241 | } else { 242 | Like.find({user: req.user._id, job: req.params.jid}, function (err, like) { 243 | if (err) { 244 | console.log(err); 245 | return res.send({error: err}); 246 | } 247 | else { 248 | if (like[0] == null) { 249 | return res.json({class: false}); 250 | } else { 251 | return res.json({class: true}); 252 | } 253 | } 254 | 255 | }) 256 | } 257 | }); 258 | 259 | router.post('/:jid/likes', function (req, res) { 260 | 261 | if (!req.user) { 262 | res.json({error: 'Not signed in'}); 263 | } else { 264 | Like.find({user: req.user._id, job: req.params.jid}, function (err, like) { 265 | if (err) { 266 | console.log(err); 267 | return res.send({error: err}); 268 | } 269 | else { 270 | if (like[0] == null) { 271 | 272 | var like = new Like(); 273 | like.user = req.user._id; 274 | like.job = req.params.jid; 275 | like.save(function (err, like) { 276 | if (err || !like) { 277 | res.json({error: 'not liked'}); 278 | } else { 279 | 280 | res.json(like); 281 | } 282 | 283 | }); 284 | } 285 | else { 286 | Like.remove({user: req.user._id, job: req.params.jid}, function (err, like) { 287 | if (err) { 288 | return res.json(err); 289 | } 290 | 291 | return res.json({success: 'unliked'}); 292 | }); 293 | } 294 | } 295 | }) 296 | 297 | 298 | } 299 | 300 | }); 301 | 302 | //notifications for a user 303 | router.get('/users/:id/notifications', function (req, res) { 304 | Notification.find({userto: req.params.id}) 305 | 306 | .populate('job userfrom userto') 307 | 308 | .exec(function (err, notifications) { 309 | if (err) { 310 | return res.json({error: err}); 311 | } 312 | return res.json(notifications) 313 | }); 314 | }) 315 | 316 | //delete a notification 317 | 318 | router.delete('/users/:id/notifications/:nId', function (req, res) { 319 | 320 | Notification.findOneAndRemove({_id: req.params.nId}, function (err, notification) { 321 | if (err) { 322 | return res.json(err); 323 | } 324 | return res.json(notification); 325 | }) 326 | 327 | }); 328 | 329 | 330 | //return all posted jobs by a user 331 | router.get('/users/:id/jobs', function (req, res) { 332 | 333 | Job.find({user: req.params.id}) 334 | .populate('user') 335 | .sort({_id: -1}) 336 | .lean() 337 | .exec(function (err, jobs) { 338 | if (err) { 339 | console.log(err); 340 | return res.json({error: 'Error'}); 341 | } 342 | res.json(jobs); 343 | }); 344 | 345 | 346 | }); 347 | 348 | return router; 349 | } -------------------------------------------------------------------------------- /client/assets/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.6 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} 6 | /*# sourceMappingURL=bootstrap-theme.min.css.map */ -------------------------------------------------------------------------------- /client/assets/css/styles-bluegreen.css: -------------------------------------------------------------------------------- 1 | /* General Content styles such as links, body text, or headings */ 2 | body { 3 | font-size: 16px; 4 | line-height: 27px; 5 | font-family: 'Open Sans', sans-serif; 6 | color: #404b55; 7 | background-color: #feffff; 8 | 9 | } 10 | a { 11 | color: #5b6268; 12 | } 13 | a:hover, 14 | a:focus { 15 | text-decoration: none; 16 | color: #5b6268; 17 | } 18 | h1 { 19 | font-size: 45px; 20 | line-height: 60px; 21 | font-weight: normal; 22 | font-family: 'PT Serif', serif; 23 | } 24 | h2 { 25 | font-size: 30px; 26 | line-height: 40px; 27 | font-family: 'Open Sans', sans-serif; 28 | } 29 | h3 { 30 | font-size: 21px; 31 | line-height: 30px; 32 | font-weight: normal; 33 | font-family: 'Open Sans', sans-serif; 34 | } 35 | hr { 36 | border-top-color: #ced5db; 37 | } 38 | /* Font Awesome Icons */ 39 | 40 | ::selection { 41 | background: #566572; 42 | /* Safari */ 43 | color: #feffff; 44 | } 45 | ::-moz-selection { 46 | background: #566572; 47 | /* Firefox */ 48 | color: #feffff; 49 | } 50 | /* Layout styles that deal with the overall page structure */ 51 | /* Masthead is the upper part of the header, containing logo and navigation*/ 52 | .masthead { 53 | padding-top: 55px; 54 | padding-bottom: 55px; 55 | } 56 | .masthead #logo { 57 | float: left; 58 | display: block; 59 | color: #f8f8f9; 60 | font-family: 'PT Serif', serif; 61 | font-size: 39px; 62 | text-transform: uppercase; 63 | margin-top: 10px; 64 | } 65 | .masthead #logo img { 66 | margin-top: -10px; 67 | } 68 | /* Widewrappers that span the whole width of the page */ 69 | .widewrapper { 70 | background-color: #feffff; 71 | } 72 | .widewrapper.main { 73 | -webkit-box-shadow: inset 1px 10px 8px -8px #ababab; 74 | -moz-box-shadow: inset 1px 10px 8px -8px #ababab; 75 | box-shadow: inset 1px 10px 8px -8px #ababab; 76 | } 77 | .widewrapper.masthead { 78 | background-color: #242b32; 79 | color: #f8f8f9; 80 | } 81 | .widewrapper.subheader { 82 | background-color: #37424c; 83 | color: #b6bfc8; 84 | font-size: 16px; 85 | min-height: 63px; 86 | } 87 | .widewrapper.footer { 88 | background-color: #242b32; 89 | color: #b3b5b7; 90 | font-size: 14px; 91 | } 92 | .widewrapper.footer a { 93 | color: #7b8690; 94 | } 95 | .widewrapper.footer h1, 96 | .widewrapper.footer h2, 97 | .widewrapper.footer h3, 98 | .widewrapper.footer h4, 99 | .widewrapper.footer h5 { 100 | color: #e6e6e6; 101 | } 102 | .widewrapper.copyright { 103 | background-color: #37424c; 104 | color: #b6bfc8; 105 | padding-top: 15px; 106 | padding-bottom: 15px; 107 | } 108 | .widewrapper.copyright a { 109 | color: #e2e5e9; 110 | } 111 | /* Styles for the navigation, both mobile and desktop */ 112 | /* Desktop version of the navigation */ 113 | .tales-nav .nav-pills { 114 | margin-top: 10px; 115 | margin-bottom: 0; 116 | font-size: 16px; 117 | } 118 | .tales-nav .nav-pills > li { 119 | margin-left: 10px; 120 | } 121 | .tales-nav .nav-pills > li > a { 122 | color: #f8f8f9; 123 | padding: 11px 16px; 124 | line-height: 14px; 125 | } 126 | .tales-nav .nav-pills > li > a:hover, 127 | .tales-nav .nav-pills > li > a:focus { 128 | color: #f8f8f9; 129 | background-color: #37424c; 130 | } 131 | .tales-nav .nav-pills > li.dropdown.open.active > a:hover, 132 | .tales-nav .nav-pills > li.dropdown.open.active > a:focus { 133 | background-color: #37424c; 134 | } 135 | .tales-nav .nav-pills .open .dropdown-toggle { 136 | background-color: #37424c; 137 | } 138 | .tales-nav .nav-pills > .active > a { 139 | background-color: #37424c; 140 | } 141 | .tales-nav .nav-pills > .active > a:hover, 142 | .tales-nav .nav-pills > .active > a:focus { 143 | background-color: #37424c; 144 | } 145 | .tales-nav .nav-pills .dropdown-menu { 146 | font-size: 16px; 147 | border-radius: 6px; 148 | } 149 | .tales-nav .caret { 150 | border-color: #f8f8f9 transparent transparent transparent !important; 151 | display: none; 152 | } 153 | .tales-nav .dropdown .caret { 154 | margin-left: 7px; 155 | } 156 | .tales-nav .dropdown-menu { 157 | background-color: #49545d; 158 | border-color: transparent; 159 | /*IE 8 Legacy */ 160 | border: 1px solid rgba(0, 0, 0, 0.2); 161 | -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 162 | -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 163 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 164 | margin: 2px 0 0; 165 | min-width: 160px; 166 | padding: 5px 0; 167 | } 168 | .tales-nav .dropdown-menu > li > a { 169 | color: #f8f8f9; 170 | line-height: 30px; 171 | white-space: nowrap; 172 | } 173 | .tales-nav .dropdown-menu > li > a:hover, 174 | .tales-nav .dropdown-menu > li > a:focus { 175 | background-color: #636c74; 176 | background-color: rgba(255, 255, 255, 0.15); 177 | background-image: none; 178 | color: #f8f8f9; 179 | filter: none; 180 | } 181 | .tales-nav .navbar-collapse { 182 | box-shadow: none; 183 | } 184 | .tales-nav .navbar-nav > li > .dropdown-menu { 185 | margin-top: 2px; 186 | } 187 | /* The button that expands the navigation in mobile-mode */ 188 | #mobile-nav-toggle { 189 | display: none; 190 | margin-top: 10px; 191 | } 192 | @media (max-width: 767px) { 193 | #mobile-nav-toggle { 194 | display: block; 195 | } 196 | } 197 | #mobile-nav-toggle a:hover, 198 | #mobile-nav-toggle a:focus { 199 | text-decoration: none; 200 | } 201 | #mobile-nav-toggle .fa { 202 | color: #f8f8f9; 203 | } 204 | /* Mobile version of the navigation */ 205 | @media (max-width: 767px) { 206 | .masthead { 207 | padding-bottom: 0px; 208 | } 209 | .tales-nav { 210 | box-shadow: none; 211 | background-color: #37424c; 212 | float: left !important; 213 | width: 100%; 214 | margin-top: 30px; 215 | margin-bottom: 20px; 216 | -webkit-border-radius: 6px; 217 | -moz-border-radius: 6px; 218 | border-radius: 6px; 219 | } 220 | .tales-nav .navbar-collapse { 221 | max-height: none; 222 | } 223 | .tales-nav .nav-pills > li { 224 | margin-left: 0; 225 | float: none; 226 | } 227 | .tales-nav .nav-pills > li > a { 228 | margin-left: 40px; 229 | margin-right: 40px; 230 | } 231 | .tales-nav .nav-pills > li a { 232 | font-weight: normal; 233 | font-size: 20px; 234 | line-height: 30px; 235 | padding-left: 10px; 236 | padding-right: 10px; 237 | -webkit-border-radius: 0px; 238 | -moz-border-radius: 0px; 239 | border-radius: 0px; 240 | } 241 | .tales-nav .nav-pills > li:first-child > a { 242 | border-top: none; 243 | } 244 | .tales-nav .nav-pills > li > a:hover, 245 | .tales-nav .nav-pills > li > a:focus { 246 | background: transparent; 247 | } 248 | .tales-nav .nav-pills > li.dropdown.open.active > a:hover, 249 | .tales-nav .nav-pills > li.dropdown.open.active > a:focus { 250 | background: transparent; 251 | } 252 | .tales-nav .nav-pills .active > a, 253 | .tales-nav .nav-pills .active > a:hover, 254 | .tales-nav .nav-pills .active > a:focus { 255 | background: transparent; 256 | } 257 | .tales-nav .nav-pills .open .dropdown-toggle { 258 | background-color: transparent; 259 | border-color: #3e4953; 260 | padding-bottom: 7px; 261 | } 262 | .tales-nav .nav-pills .dropdown-toggle .caret { 263 | float: right; 264 | margin-top: 14px; 265 | } 266 | .tales-nav .nav-pills .dropdown-menu { 267 | background-color: #49545d; 268 | } 269 | .tales-nav .nav-pills .dropdown.open { 270 | background-color: #49545d; 271 | } 272 | .tales-nav .caret { 273 | border-color: #f8f8f9 transparent transparent transparent !important; 274 | border-width: 6px; 275 | display: block; 276 | } 277 | .tales-nav .dropdown-menu { 278 | margin-top: 0; 279 | padding-top: 0; 280 | -webkit-box-shadow: none; 281 | -moz-box-shadow: none; 282 | box-shadow: none; 283 | border: none; 284 | } 285 | .tales-nav .dropdown-menu > li { 286 | margin-left: 35px; 287 | } 288 | .tales-nav .dropdown-menu > li > a { 289 | padding-top: 9px; 290 | padding-bottom: 9px !important; 291 | font-size: 18px; 292 | line-height: 27px; 293 | } 294 | .tales-nav .dropdown-menu > li > a:hover, 295 | .tales-nav .dropdown-menu > li > a:focus { 296 | background-color: transparent; 297 | } 298 | .tales-nav .navbar-nav .open .dropdown-menu > li > a { 299 | padding-top: 9px; 300 | padding-bottom: 9px; 301 | line-height: 27px; 302 | } 303 | } 304 | /* Elements that are used througout Tales, such as Searchboxes, Blog elements, Widgets, etc. etc. */ 305 | .tales-breadcrumb { 306 | color: #b6bfc8; 307 | float: left; 308 | margin-top: 19px; 309 | } 310 | .tales-breadcrumb a { 311 | color: #b6bfc8; 312 | } 313 | .tales-breadcrumb a:hover, 314 | .tales-breadcrumb a:focus { 315 | text-decoration: none; 316 | } 317 | .tales-breadcrumb .separator { 318 | margin: 0 10px 0 10px; 319 | } 320 | /* The searchbox in the subheader on top of the site */ 321 | .tales-searchbox { 322 | float: right; 323 | display: inline-block; 324 | min-width: 210px; 325 | margin-bottom: 10px; 326 | } 327 | 328 | .jobform { 329 | margin-top: 20px; 330 | margin-bottom: 5px; 331 | } 332 | 333 | .formbutton { 334 | margin-top: 40px; 335 | float:right 336 | } 337 | 338 | .tales-searchbox form { 339 | margin: 0; 340 | } 341 | .tales-searchbox .fa { 342 | color: #b6bfc8; 343 | font-size: 19px; 344 | } 345 | .tales-searchbox .searchbutton, 346 | .tales-searchbox .searchfield { 347 | color: #b6bfc8; 348 | background-color: #FEFFFF; 349 | } 350 | .tales-searchbox .searchbutton { 351 | display: inline-block; 352 | border: none; 353 | line-height: 20px; 354 | padding: 4px 5px 4px 15px; 355 | height: 31px; 356 | vertical-align: middle; 357 | -webkit-border-top-left-radius: 15px; 358 | -moz-border-radius-topleft: 15px; 359 | border-top-left-radius: 15px; 360 | -webkit-border-bottom-left-radius: 15px; 361 | -moz-border-radius-bottomleft: 15px; 362 | border-bottom-left-radius: 15px; 363 | -webkit-box-shadow: inset 3px 5px 0px -4px rgb(229,229,229); 364 | -moz-box-shadow: inset 3px 5px 0px -4px rgb(229,229,229); 365 | box-shadow: inset 3px 5px 0px -4px rgb(229,229,229); 366 | } 367 | .tales-searchbox .searchbutton a:hover, 368 | .tales-searchbox .searchbutton a:focus { 369 | text-decoration: none; 370 | } 371 | .tales-searchbox .searchfield { 372 | border: none; 373 | height: 22px; 374 | width: 155px; 375 | line-height: 12px; 376 | -webkit-box-sizing: content-box; 377 | -moz-box-sizing: content-box; 378 | box-sizing: content-box; 379 | padding: 4px 6px 5px 6px; 380 | vertical-align: middle; 381 | display: inline-block; 382 | margin-bottom: 0; 383 | font-size: 16px; 384 | -webkit-border-top-right-radius: 15px; 385 | -moz-border-radius-topright: 15px; 386 | border-top-right-radius: 15px; 387 | -webkit-border-bottom-right-radius: 15px; 388 | -moz-border-radius-bottomright: 15px; 389 | border-bottom-right-radius: 15px; 390 | -webkit-border-top-left-radius: 15px; 391 | -moz-border-radius-topleft: 15px; 392 | border-top-left-radius: 15px; 393 | -webkit-border-bottom-left-radius: 15px; 394 | -moz-border-radius-bottomleft: 15px; 395 | border-bottom-left-radius: 15px; 396 | -webkit-box-shadow: inset 2px 2px 2px 2px rgb(229,229,229); 397 | -moz-box-shadow: inset 2px 2px 2px 2px rgb(229,229,229); 398 | box-shadow: inset 2px 2px 2px 2px rgb(229,229,229); 399 | 400 | -webkit-border-top-left-radius: 15px; 401 | -moz-border-radius-topleft: 15px; 402 | border-top-left-radius: 15px; 403 | -webkit-border-bottom-left-radius: 15px; 404 | -moz-border-radius-bottomleft: 15px; 405 | border-bottom-left-radius: 15px; 406 | -webkit-box-shadow: inset 2px 2px 2px 2px rgb(229,229,229); 407 | -moz-box-shadow: inset 2px 2px 2px 2px rgb(229,229,229); 408 | box-shadow: inset 2px 2px 2px 2px rgb(229,229,229); 409 | margin-left: -4px; 410 | outline: none; 411 | } 412 | .tales-searchbox .searchfield::-webkit-input-placeholder { 413 | color: #b6bfc8; 414 | } 415 | .tales-searchbox .searchfield:-moz-placeholder { 416 | color: #b6bfc8; 417 | } 418 | .tales-searchbox .searchfield::-moz-placeholder { 419 | color: #b6bfc8; 420 | } 421 | .tales-searchbox .searchfield:-ms-input-placeholder { 422 | color: #b6bfc8; 423 | } 424 | .tales-searchbox .searchfield:focus { 425 | -webkit-box-shadow: none; 426 | -moz-box-shadow: none; 427 | box-shadow: none; 428 | -webkit-box-shadow: inset 3px 5px 0px -4px rgba(0, 0, 0, 0.06); 429 | -moz-box-shadow: inset 3px 5px 0px -4px rgba(0, 0, 0, 0.06); 430 | box-shadow: inset 3px 5px 0px -4px rgba(0, 0, 0, 0.06); 431 | } 432 | /* The list with special bullet points, used both on blog widgets as well as in the footer (both styled here) */ 433 | .tales-list { 434 | list-style: none; 435 | } 436 | .tales-list li { 437 | line-height: 23px; 438 | margin-bottom: 14px; 439 | } 440 | .tales-list li a:hover, 441 | .tales-list li a:focus { 442 | color: #55a773; 443 | } 444 | .tales-list li:before { 445 | content: ""; 446 | border-color: transparent transparent transparent #757e88; 447 | border-style: solid; 448 | border-width: 3px 8px; 449 | display: block; 450 | width: 8px; 451 | left: -20px; 452 | top: 15px; 453 | position: relative; 454 | } 455 | .footer .tales-list { 456 | margin-top: -6px; 457 | padding-left: 23px; 458 | } 459 | .footer .tales-list li { 460 | margin-bottom: 5px; 461 | } 462 | .footer .tales-list li a { 463 | color: #b3b5b7; 464 | padding-bottom: 5px; 465 | } 466 | .footer .tales-list li:before { 467 | left: -21px; 468 | border-color: transparent transparent transparent #b3b5b7; 469 | } 470 | /* Footer widgets */ 471 | .footer-widget { 472 | margin-top: 25px; 473 | margin-bottom: 50px; 474 | line-height: 23px; 475 | } 476 | .footer-widget h3 { 477 | margin-bottom: 20px; 478 | } 479 | .footer-widget h3 .fa { 480 | font-size: 21px; 481 | margin-right: 11px; 482 | } 483 | .footer-widget .stats { 484 | margin-top: 23px; 485 | } 486 | .footer-widget .stats .line { 487 | font-size: 18px; 488 | margin-top: 10px; 489 | } 490 | .footer-widget .stats .line .counter { 491 | font-weight: 600; 492 | float: left; 493 | display: block; 494 | } 495 | .footer-widget .stats .line .caption { 496 | color: #7b8690; 497 | margin-left: 56px; 498 | display: block; 499 | } 500 | .footer-widget .email { 501 | display: block; 502 | margin-top: 10px; 503 | } 504 | /* Blog styles */ 505 | .blog-main, 506 | .blog-aside { 507 | position: relative; 508 | } 509 | .blog-main:before, 510 | .blog-aside:before { 511 | border-left: 1px solid #ced5db; 512 | height: 100%; 513 | content: ""; 514 | position: absolute; 515 | top: 0; 516 | width: 1px; 517 | } 518 | @media (max-width: 767px) { 519 | .blog-main:before, 520 | .blog-aside:before { 521 | display: none; 522 | } 523 | } 524 | .blog-main { 525 | padding-top: 36px; 526 | padding-bottom: 20px; 527 | } 528 | .blog-main:before { 529 | right: -16px; 530 | } 531 | @media (min-width: 768px) and (max-width: 979px) { 532 | .blog-main:before { 533 | display: none; 534 | } 535 | } 536 | .blog-aside { 537 | padding-top: 90px; 538 | } 539 | @media (max-width: 767px) { 540 | .blog-aside { 541 | padding-top: 50px; 542 | } 543 | } 544 | .blog-aside:before { 545 | left: 15px; 546 | } 547 | @media (min-width: 768px) and (max-width: 979px) { 548 | .blog-aside:before { 549 | display: none; 550 | } 551 | } 552 | /* Blog aside widgets */ 553 | .aside-widget { 554 | margin-bottom: 100px; 555 | } 556 | .aside-widget header { 557 | background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f6f5f5), to(#ebeaea)); 558 | background-image: -webkit-linear-gradient(top, #f6f5f5, 0%, #ebeaea, 100%); 559 | background-image: -moz-linear-gradient(top, #f6f5f5 0%, #ebeaea 100%); 560 | background-image: linear-gradient(to bottom, #f6f5f5 0%, #ebeaea 100%); 561 | background-repeat: repeat-x; 562 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6f5f5', endColorstr='#ffebeaea', GradientType=0); 563 | border: 1px #ced5db solid; 564 | } 565 | .aside-widget header h3 { 566 | font-size: 24px; 567 | padding: 10px 20px 3px 20px; 568 | margin-top: 0; 569 | color: #48535f; 570 | } 571 | .aside-widget .body { 572 | margin-top: 30px; 573 | padding-left: 20px; 574 | } 575 | .aside-widget a { 576 | color: #5b6268; 577 | } 578 | /* The tags widget */ 579 | .tags { 580 | list-style: none; 581 | margin: 0; 582 | padding-left: 0; 583 | } 584 | .tags li { 585 | float: left; 586 | } 587 | .tags li a { 588 | padding: 10px 15px; 589 | margin-right: 16px; 590 | margin-bottom: 17px; 591 | display: inline-block; 592 | background: #e6e6e6; 593 | -webkit-border-radius: 5px; 594 | -moz-border-radius: 5px; 595 | border-radius: 5px; 596 | } 597 | .tags li a:focus, 598 | .tags li a:hover { 599 | background-color: #c1d2e1; 600 | } 601 | /* The blog main page boxes */ 602 | .blog-teaser { 603 | background-color: #ececec; 604 | -webkit-border-radius: 10px; 605 | -moz-border-radius: 10px; 606 | border-radius: 10px; 607 | -webkit-box-shadow: 0px 1px 5px #a8a8a8; 608 | -moz-box-shadow: 0px 1px 5px #a8a8a8; 609 | box-shadow: 0px 1px 5px #a8a8a8; 610 | margin-bottom: 40px; 611 | } 612 | @media (min-width: 768px) and (max-width: 979px) { 613 | .blog-teaser { 614 | display: block; 615 | float: none; 616 | width: 95%; 617 | } 618 | } 619 | .blog-teaser header { 620 | padding-top: 20px; 621 | padding-right: 45px; 622 | padding-left: 45px; 623 | text-align: center; 624 | } 625 | .blog-teaser header img { 626 | margin-bottom: 20px; 627 | -webkit-border-radius: 200px; 628 | -moz-border-radius: 200px; 629 | border-radius: 200px; 630 | } 631 | .blog-teaser header h3 { 632 | color: #454a4e; 633 | margin-top: 0; 634 | font-size: 25px; 635 | margin-bottom: 10px; 636 | } 637 | .blog-teaser header h3 a, 638 | .blog-teaser header h3 a:focus, 639 | .blog-teaser header h3 a:hover { 640 | color: #454a4e; 641 | } 642 | .blog-teaser header .meta { 643 | color: #5a6065; 644 | } 645 | .blog-teaser header hr { 646 | border-top-color: #ced5db; 647 | border-bottom: none; 648 | } 649 | .blog-teaser .body { 650 | padding-right: 45px; 651 | padding-left: 45px; 652 | margin-bottom: 10px; 653 | color: #343a3f; 654 | } 655 | .body .btn { 656 | float: right; 657 | margin-right: 45px; 658 | margin-bottom: 18px; 659 | } 660 | /* Blog main page paging */ 661 | .paging { 662 | margin-bottom: 20px; 663 | text-align: right; 664 | } 665 | .paging a:hover, 666 | .paging a:focus { 667 | color: #55a773; 668 | } 669 | .paging i { 670 | font-size: 16px; 671 | } 672 | .paging a, 673 | .paging span { 674 | margin-left: 10px; 675 | } 676 | .paging .newer i { 677 | margin-right: 5px; 678 | } 679 | .paging .older i { 680 | margin-left: 5px; 681 | } 682 | /* ... aand the main blog article */ 683 | .blog-post { 684 | margin-bottom: 90px; 685 | } 686 | .blog-post header h1 { 687 | font-family: 'PT Serif', serif; 688 | } 689 | .blog-post header .lead-image { 690 | position: relative; 691 | } 692 | .blog-post header .lead-image .meta { 693 | padding-left: 30px; 694 | padding-bottom: 10px; 695 | position: absolute; 696 | bottom: 15px; 697 | background-color: #55a773; 698 | background-color: rgba(85, 167, 115, 0.85); 699 | color: #ccecd7; 700 | } 701 | .blog-post header .lead-image .meta a { 702 | color: #ccecd7; 703 | } 704 | @media (max-width: 979px) { 705 | .blog-post header .lead-image .meta { 706 | position: relative; 707 | bottom: 0; 708 | } 709 | } 710 | .blog-post header .lead-image .meta .author, 711 | .blog-post header .lead-image .meta .date, 712 | .blog-post header .lead-image .meta .comments { 713 | float: left; 714 | margin: 10px 55px 0 0; 715 | } 716 | .blog-post header .lead-image .meta .author .data, 717 | .blog-post header .lead-image .meta .date .data, 718 | .blog-post header .lead-image .meta .comments .data { 719 | line-height: 30px; 720 | } 721 | @media (min-width: 980px) and (max-width: 1199px) { 722 | .blog-post header .lead-image .meta .author, 723 | .blog-post header .lead-image .meta .date, 724 | .blog-post header .lead-image .meta .comments { 725 | margin-right: 20px; 726 | } 727 | } 728 | .blog-post header .lead-image .meta .author i, 729 | .blog-post header .lead-image .meta .date i, 730 | .blog-post header .lead-image .meta .comments i { 731 | font-size: 30px; 732 | float: left; 733 | margin-right: 10px; 734 | } 735 | .blog-post .body { 736 | margin-top: 20px; 737 | } 738 | @media (min-width: 1200px) { 739 | .blog-post .body { 740 | padding-right: 30px; 741 | } 742 | } 743 | .blog-post .body p { 744 | margin-bottom: 20px; 745 | } 746 | /* The round social icons including the animations */ 747 | .social-icons { 748 | text-align: center; 749 | } 750 | .social-icon { 751 | position: relative; 752 | margin-bottom: 90px; 753 | display: inline-block; 754 | width: 135px; 755 | height: 135px; 756 | margin-left: 70px; 757 | border-radius: 200px; 758 | } 759 | .social-icon .inner-circle { 760 | position: absolute; 761 | top: 11px; 762 | left: 11px; 763 | display: block; 764 | height: 113px; 765 | width: 113px; 766 | border-radius: 200px; 767 | -webkit-transition: all 0.5s ease-in; 768 | -moz-transition: all 0.5s ease-in; 769 | -o-transition: all 0.5s ease-in; 770 | transition: all 0.5s ease-in; 771 | } 772 | .social-icon:hover .inner-circle { 773 | top: 0; 774 | left: 0; 775 | width: 135px; 776 | height: 135px; 777 | } 778 | .social-icon i { 779 | color: #f8f8f9; 780 | font-size: 70px; 781 | position: absolute; 782 | top: 36px; 783 | left: 37px; 784 | } 785 | .social-icon i.fa-google-plus { 786 | left: 25px; 787 | } 788 | .social-icon i.fa-facebook { 789 | left: 45px; 790 | } 791 | .social-icon i.fa-github-alt { 792 | top: 32px; 793 | } 794 | .social-icon:first-child { 795 | margin-left: 0; 796 | } 797 | @media (min-width: 980px) and (max-width: 1199px) { 798 | .span6 .social-icon { 799 | margin-left: 15px; 800 | } 801 | } 802 | @media (min-width: 768px) and (max-width: 979px) { 803 | .social-icon { 804 | margin-left: 40px; 805 | width: 122px; 806 | height: 122px; 807 | } 808 | .span6 .social-icon { 809 | margin-left: -8px; 810 | } 811 | .social-icon .inner-circle { 812 | position: absolute; 813 | top: 11px; 814 | left: 11px; 815 | display: block; 816 | height: 100px; 817 | width: 100px; 818 | } 819 | .social-icon:hover .inner-circle { 820 | width: 122px; 821 | height: 122px; 822 | } 823 | .social-icon i { 824 | font-size: 50px; 825 | top: 36px; 826 | left: 37px; 827 | } 828 | .social-icon i.fa-facebook { 829 | left: 50px; 830 | } 831 | } 832 | @media (max-width: 767px) { 833 | .social-icon { 834 | margin-left: 10px; 835 | width: 81px; 836 | height: 81px; 837 | margin-bottom: 40px; 838 | } 839 | .social-icon .inner-circle { 840 | position: absolute; 841 | top: 8px; 842 | left: 8px; 843 | display: block; 844 | height: 65px; 845 | width: 65px; 846 | } 847 | .social-icon:hover .inner-circle { 848 | height: 65px; 849 | width: 65px; 850 | top: 8px; 851 | left: 8px; 852 | } 853 | .social-icon i { 854 | font-size: 35px; 855 | top: 25px; 856 | left: 25px; 857 | } 858 | .social-icon i.fa-facebook { 859 | left: 32px; 860 | } 861 | .social-icon i.fa-github-alt { 862 | top: 22px; 863 | } 864 | } 865 | .social-icon.color-one { 866 | background-color: #7dbd95; 867 | } 868 | .social-icon.color-one .inner-circle { 869 | background-color: #55a773; 870 | } 871 | .social-icon.color-two { 872 | background-color: #bb9ce2; 873 | } 874 | .social-icon.color-two .inner-circle { 875 | background-color: #74549f; 876 | } 877 | .social-icon.color-three { 878 | background-color: #64c4ee; 879 | } 880 | .social-icon.color-three .inner-circle { 881 | background-color: #3f8ebd; 882 | } 883 | /* Comments on blog detail page */ 884 | aside.comments, 885 | aside.create-comment { 886 | margin-bottom: 100px; 887 | } 888 | aside.comments hr, 889 | aside.create-comment hr { 890 | width: 515px; 891 | margin-left: auto; 892 | margin-right: auto; 893 | border-top-color: #ced5db; 894 | margin-bottom: 130px; 895 | } 896 | @media (min-width: 768px) and (max-width: 979px) { 897 | aside.comments hr, 898 | aside.create-comment hr { 899 | width: 415px; 900 | } 901 | } 902 | @media (max-width: 767px) { 903 | aside.comments hr, 904 | aside.create-comment hr { 905 | width: 100%; 906 | } 907 | } 908 | aside.comments h2, 909 | aside.create-comment h2 { 910 | text-align: center; 911 | font-weight: normal; 912 | margin-bottom: 130px; 913 | } 914 | aside.comments h2 i, 915 | aside.create-comment h2 i { 916 | font-size: 36px; 917 | } 918 | aside.comments .comment { 919 | margin: 130px 0 0 0; 920 | } 921 | aside.comments .comment.reply { 922 | margin-left: 100px; 923 | } 924 | aside.comments .comment header img { 925 | float: left; 926 | border-radius: 100px; 927 | } 928 | aside.comments .comment header .meta { 929 | margin-left: 100px; 930 | font-size: 14px; 931 | } 932 | aside.comments .comment header .meta h3 { 933 | margin: 10px 0 0 0; 934 | line-height: 27px; 935 | } 936 | aside.comments .comment header .meta h3 a { 937 | color: #5b6268; 938 | } 939 | aside.comments .comment header .meta a { 940 | color: #55a773; 941 | } 942 | aside.comments .comment .body { 943 | margin-top: 10px; 944 | margin-left: 100px; 945 | margin-bottom: 50px 946 | } 947 | /* Add commment form */ 948 | .create-comment input, 949 | .contact-form input, 950 | .create-comment textarea, 951 | .contact-form textarea { 952 | margin-top: 15px; 953 | } 954 | 955 | .body .btn, 956 | .create-comment .btn, 957 | .contact-form .btn { 958 | margin: 15px 0 0 25px; 959 | float: right; 960 | } 961 | 962 | .content, 963 | .about { 964 | padding-top: 36px; 965 | padding-bottom: 80px; 966 | } 967 | /* About me page */ 968 | .about hr { 969 | margin-top: 75px; 970 | } 971 | .about-portrait { 972 | float: right; 973 | margin-top: 20px; 974 | margin-left: 70px; 975 | -webkit-border-radius: 180px; 976 | -moz-border-radius: 180px; 977 | border-radius: 180px; 978 | } 979 | @media (max-width: 767px) { 980 | .about-portrait { 981 | float: none; 982 | margin: 40px auto; 983 | } 984 | } 985 | .about-button { 986 | margin-top: 30px; 987 | } 988 | /* The various styles that are used in the about me text chunk */ 989 | .about-bold { 990 | font-weight: bold; 991 | } 992 | .about-italic { 993 | font-style: italic; 994 | } 995 | .about-large, 996 | .about-medium, 997 | .about-small { 998 | font-family: 'PT Serif', serif; 999 | line-height: 60px; 1000 | } 1001 | @media (max-width: 767px) { 1002 | .about-large, 1003 | .about-medium, 1004 | .about-small { 1005 | display: block; 1006 | } 1007 | } 1008 | .about-large { 1009 | font-size: 40px; 1010 | } 1011 | .about-medium { 1012 | font-size: 36px; 1013 | } 1014 | .about-small { 1015 | font-size: 30px; 1016 | } 1017 | /* The centered blocks under about me, used for "Social" and "Contact" */ 1018 | .tales-superblock { 1019 | margin-bottom: 80px; 1020 | } 1021 | .tales-superblock h2 { 1022 | font-size: 40px; 1023 | text-align: center; 1024 | margin-bottom: 80px; 1025 | } 1026 | /* The image credits page */ 1027 | @media (max-width: 767px) { 1028 | .credits { 1029 | text-align: center; 1030 | } 1031 | .credits img { 1032 | margin-left: auto; 1033 | margin-right: auto; 1034 | } 1035 | } 1036 | .credits .image { 1037 | margin-top: 60px; 1038 | } 1039 | .credits .details { 1040 | margin-top: 60px; 1041 | margin-bottom: 75px; 1042 | } 1043 | @media (min-width: 768px) and (max-width: 979px) { 1044 | .credits .details { 1045 | margin-top: 45px; 1046 | } 1047 | } 1048 | @media (max-width: 767px) { 1049 | .credits .details { 1050 | margin-top: 10px; 1051 | } 1052 | } 1053 | .credits img { 1054 | -webkit-border-radius: 200px; 1055 | -moz-border-radius: 200px; 1056 | border-radius: 200px; 1057 | } 1058 | .credits .bold { 1059 | font-weight: bold; 1060 | } 1061 | /* Form styles */ 1062 | .form-control:focus { 1063 | border-color: #74c893; 1064 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px #74c893; 1065 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px #74c893; 1066 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px #74c893; 1067 | } 1068 | .form-control { 1069 | background-color: #ffffff; 1070 | border-color: #cccccc; 1071 | color: #555555; 1072 | } 1073 | .form-control::-webkit-input-placeholder { 1074 | color: #a5b1bc; 1075 | } 1076 | .form-control:-moz-placeholder { 1077 | color: #a5b1bc; 1078 | } 1079 | .form-control::-moz-placeholder { 1080 | color: #a5b1bc; 1081 | } 1082 | .form-control:-ms-input-placeholder { 1083 | color: #a5b1bc; 1084 | } 1085 | /* Buttons used in Tales */ 1086 | .btn-tales-one { 1087 | color: #ffffff; 1088 | background-color: #69bc87; 1089 | border-color: #549f6f; 1090 | background-image: -webkit-gradient(linear, left 0%, left 100%, from(#69bc87), to(#48a068)); 1091 | background-image: -webkit-linear-gradient(top, #69bc87, 0%, #48a068, 100%); 1092 | background-image: -moz-linear-gradient(top, #69bc87 0%, #48a068 100%); 1093 | background-image: linear-gradient(to bottom, #69bc87 0%, #48a068 100%); 1094 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff69bc87', endColorstr='#ff48a068', GradientType=0); 1095 | background-repeat: repeat-x; 1096 | border-color: #449963; 1097 | } 1098 | .btn-tales-one:hover, 1099 | .btn-tales-one:focus, 1100 | .btn-tales-one:active, 1101 | .btn-tales-one.active, 1102 | .open .dropdown-toggle.btn-tales-one { 1103 | color: #ffffff; 1104 | background-color: #4eae71; 1105 | border-color: #3f7753; 1106 | } 1107 | .btn-tales-one:active, 1108 | .btn-tales-one.active, 1109 | .open .dropdown-toggle.btn-tales-one { 1110 | background-image: none; 1111 | } 1112 | .btn-tales-one.disabled, 1113 | .btn-tales-one[disabled], 1114 | fieldset[disabled] .btn-tales-one, 1115 | .btn-tales-one.disabled:hover, 1116 | .btn-tales-one[disabled]:hover, 1117 | fieldset[disabled] .btn-tales-one:hover, 1118 | .btn-tales-one.disabled:focus, 1119 | .btn-tales-one[disabled]:focus, 1120 | fieldset[disabled] .btn-tales-one:focus, 1121 | .btn-tales-one.disabled:active, 1122 | .btn-tales-one[disabled]:active, 1123 | fieldset[disabled] .btn-tales-one:active, 1124 | .btn-tales-one.disabled.active, 1125 | .btn-tales-one[disabled].active, 1126 | fieldset[disabled] .btn-tales-one.active { 1127 | background-color: #69bc87; 1128 | border-color: #549f6f; 1129 | } 1130 | .btn-tales-one:hover, 1131 | .btn-tales-one:focus { 1132 | background-color: #48a068; 1133 | background-position: 0 -15px; 1134 | } 1135 | .btn-tales-one:active, 1136 | .btn-tales-one.active { 1137 | background-color: #48a068; 1138 | border-color: #449963; 1139 | } 1140 | .btn-tales-one .caret { 1141 | border-top-color: #ffffff; 1142 | } 1143 | 1144 | 1145 | .btn-tales-ashish { 1146 | color: #8c8c8c; 1147 | background-color: #E5E5E5; 1148 | border-color: #bfbfbf; 1149 | 1150 | background-image: -webkit-gradient(linear, left 0%, left 100%, from(#E5E5E5), to(#bfbfbf)); 1151 | background-image: -webkit-linear-gradient(top, #E5E5E5, 0%, #bfbfbf, 100%); 1152 | background-image: -moz-linear-gradient(top, #E5E5E5 0%, #bfbfbf 100%); 1153 | background-image: linear-gradient(to bottom, #E5E5E5 0%, #bfbfbf 100%); 1154 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffE5E5E5', endColorstr='#ffbfbfbf', GradientType=0); 1155 | background-repeat: repeat-x; 1156 | } 1157 | 1158 | 1159 | .btn-tales-two { 1160 | color: #ffffff; 1161 | background-color: #485561; 1162 | border-color: #3c4852; 1163 | background-image: -webkit-gradient(linear, left 0%, left 100%, from(#485561), to(#2e363e)); 1164 | background-image: -webkit-linear-gradient(top, #485561, 0%, #2e363e, 100%); 1165 | background-image: -moz-linear-gradient(top, #485561 0%, #2e363e 100%); 1166 | background-image: linear-gradient(to bottom, #485561 0%, #2e363e 100%); 1167 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff485561', endColorstr='#ff2e363e', GradientType=0); 1168 | background-repeat: repeat-x; 1169 | border-color: #2a3138; 1170 | } 1171 | .btn-tales-two:hover, 1172 | .btn-tales-two:focus, 1173 | .btn-tales-two:active, 1174 | .btn-tales-two.active, 1175 | .open .dropdown-toggle.btn-tales-two { 1176 | color: #ffffff; 1177 | background-color: #37404a; 1178 | border-color: #22292f; 1179 | } 1180 | .btn-tales-two:active, 1181 | .btn-tales-two.active, 1182 | .open .dropdown-toggle.btn-tales-two { 1183 | background-image: none; 1184 | } 1185 | .btn-tales-two.disabled, 1186 | .btn-tales-two[disabled], 1187 | fieldset[disabled] .btn-tales-two, 1188 | .btn-tales-two.disabled:hover, 1189 | .btn-tales-two[disabled]:hover, 1190 | fieldset[disabled] .btn-tales-two:hover, 1191 | .btn-tales-two.disabled:focus, 1192 | .btn-tales-two[disabled]:focus, 1193 | fieldset[disabled] .btn-tales-two:focus, 1194 | .btn-tales-two.disabled:active, 1195 | .btn-tales-two[disabled]:active, 1196 | fieldset[disabled] .btn-tales-two:active, 1197 | .btn-tales-two.disabled.active, 1198 | .btn-tales-two[disabled].active, 1199 | fieldset[disabled] .btn-tales-two.active { 1200 | background-color: #485561; 1201 | border-color: #3c4852; 1202 | } 1203 | .btn-tales-two:hover, 1204 | .btn-tales-two:focus { 1205 | background-color: #2e363e; 1206 | background-position: 0 -15px; 1207 | } 1208 | .btn-tales-two:active, 1209 | .btn-tales-two.active { 1210 | background-color: #2e363e; 1211 | border-color: #2a3138; 1212 | } 1213 | .btn-tales-two .caret { 1214 | border-top-color: #ffffff; 1215 | } 1216 | .btn-xlarge { 1217 | padding: 12px 46px; 1218 | font-size: 20px; 1219 | line-height: normal; 1220 | border-radius: 5px; 1221 | } 1222 | -------------------------------------------------------------------------------- /client/assets/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.6 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under the MIT license 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); --------------------------------------------------------------------------------