├── Procfile ├── app.js ├── models ├── comment.js ├── db.js ├── post.js └── user.js ├── mongodb_start_hisign.bat ├── package.json ├── public ├── bootstrap │ ├── blog_model.html │ ├── blog_model.html.bak │ ├── carousel │ │ ├── bootstrap-alert.js │ │ ├── bootstrap-button.js │ │ ├── bootstrap-carousel.js │ │ ├── bootstrap-collapse.js │ │ ├── bootstrap-dropdown.js │ │ ├── bootstrap-modal.js │ │ ├── bootstrap-popover.js │ │ ├── bootstrap-scrollspy.js │ │ ├── bootstrap-tab.js │ │ ├── bootstrap-tooltip.js │ │ ├── bootstrap-transition.js │ │ ├── bootstrap-typeahead.js │ │ ├── browser-icon-chrome.png │ │ ├── browser-icon-firefox.png │ │ ├── browser-icon-safari.png │ │ ├── holder.js │ │ └── jquery.js │ ├── css │ │ ├── bootstrap-responsive.css │ │ ├── bootstrap-responsive.min.css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ ├── img │ │ ├── glyphicons-halflings-white.png │ │ └── glyphicons-halflings.png │ ├── js │ │ ├── bootstrap.js │ │ └── bootstrap.min.js │ ├── 新建文本文档.html │ └── 新建文本文档.html.bak ├── css │ └── style.css ├── favicon.ico ├── images │ ├── 54wall.png │ ├── WalkingDead │ │ ├── person │ │ │ ├── 54wall_little.jpg │ │ │ ├── 卡尔.jpg │ │ │ ├── 格伦.jpg │ │ │ ├── 瑞克·格莱姆斯.jpg │ │ │ └── 达里尔.jpg │ │ └── poster │ │ │ └── s1.jpg │ ├── images │ │ ├── content_bg.gif │ │ ├── date_bg.png │ │ ├── fbg_bg.gif │ │ ├── footer_bg.gif │ │ ├── header_bg.jpg │ │ ├── img1.jpg │ │ ├── img2.jpg │ │ ├── main_bg.gif │ │ ├── menu_a.gif │ │ ├── pix1.jpg │ │ ├── pix2.jpg │ │ ├── pix3.jpg │ │ ├── pix4.jpg │ │ ├── pix5.jpg │ │ ├── pix6.jpg │ │ ├── profile_01.jpg │ │ ├── sanye.jpg │ │ ├── search.gif │ │ ├── search_btn.gif │ │ ├── spacer.gif │ │ ├── submit.gif │ │ └── userpic.gif │ ├── slide-01.jpg │ ├── slide-02.jpg │ └── slide-03.jpg ├── javascripts │ └── js │ │ ├── arial.js │ │ ├── cuf_run.js │ │ ├── cufon-yui.js │ │ ├── jquery-1.3.2.min.js │ │ └── radius.js └── stylesheets │ ├── down.css │ ├── markdown.css │ └── style.css ├── readme.md ├── readme_resouce ├── N-Blog-WalkingDeading_01.jpg ├── N-Blog-WalkingDeading_02.jpg └── N-Blog-WalkingDeading_03.jpg ├── routes ├── index.js └── users.js ├── settings.js └── views ├── about.html ├── archive.ejs ├── article.ejs ├── blog.html ├── comment.ejs ├── contact.html ├── edit.ejs ├── error.ejs ├── footer.ejs ├── header.ejs ├── header_carousel.ejs ├── index.ejs ├── index_blog.ejs ├── index_bootcss.ejs ├── index_carousel.ejs ├── login.ejs ├── news.ejs ├── paging.ejs ├── post.ejs ├── reg.ejs ├── review.ejs ├── roles.ejs ├── support.html ├── tag.ejs ├── tags.ejs ├── upload.ejs ├── user.ejs └── user_carousel.ejs /Procfile: -------------------------------------------------------------------------------- 1 | web: node app.js -------------------------------------------------------------------------------- /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 | 8 | var routes = require('./routes/index'); 9 | var settings = require('./settings'); 10 | var flash = require('connect-flash'); 11 | var app = express(); 12 | 13 | var session = require('express-session'); 14 | var MongoStore = require('connect-mongo')(session); 15 | app.use(session({ 16 | secret: settings.cookieSecret, 17 | //key: settings.db,//cookie name 18 | cookie: {maxAge: 1000 * 60 * 60 * 24 * 30},//30 days 19 | url: settings.url 20 | })); 21 | 22 | /*增加app.set('port', process.env.PORT || 3000);可以直接使用node app.js启动网页了,但是在webStorm中就会报错*///app.set('port', process.env.PORT || 3000); 23 | app.set('port', process.env.PORT || 3000); 24 | app.set('views', path.join(__dirname, 'views')); 25 | app.set('view engine', 'ejs'); 26 | app.use(flash()); 27 | 28 | app.use(favicon(__dirname + '/public/favicon.ico')); 29 | app.use(logger('dev')); 30 | app.use(bodyParser.json()); 31 | app.use(bodyParser.urlencoded({ extended: true })); 32 | app.use(cookieParser()); 33 | app.use(express.static(path.join(__dirname, 'public'))); 34 | 35 | routes(app); 36 | 37 | app.listen(app.get('port'), function() { 38 | console.log('Express server listening on port ' + app.get('port')); 39 | }); 40 | module.exports = app; -------------------------------------------------------------------------------- /models/comment.js: -------------------------------------------------------------------------------- 1 | var mongodb = require('mongodb'), 2 | settings = require('../settings'); 3 | 4 | function Comment(name, day, title, comment) { 5 | this.name = name; 6 | this.day = day; 7 | this.title = title; 8 | this.comment = comment; 9 | } 10 | 11 | module.exports = Comment; 12 | 13 | //存储一条留言信息 14 | Comment.prototype.save = function(callback) { 15 | var name = this.name, 16 | day = this.day, 17 | title = this.title, 18 | comment = this.comment; 19 | //打开数据库 20 | mongodb.MongoClient.connect(settings.url, function (err, db) { 21 | if (err) { 22 | return callback(err); 23 | } 24 | //读取 posts 集合 25 | db.collection('posts', function (err, collection) { 26 | if (err) { 27 | db.close(); 28 | return callback(err); 29 | } 30 | //通过用户名、时间及标题查找文档,并把一条留言对象添加到该文档的 comments 数组里 31 | collection.update({ 32 | "name": name, 33 | "time.day": day, 34 | "title": title 35 | }, { 36 | $push: {"comments": comment} 37 | } , function (err) { 38 | db.close(); 39 | if (err) { 40 | return callback(err); 41 | } 42 | callback(null); 43 | }); 44 | }); 45 | }); 46 | }; -------------------------------------------------------------------------------- /models/db.js: -------------------------------------------------------------------------------- 1 | var settings = require('../settings'), 2 | Db = require('mongodb').Db, 3 | Connection = require('mongodb').Connection, 4 | Server = require('mongodb').Server; 5 | module.exports = new Db(settings.db, new Server(settings.host, settings.port), 6 | {safe: true}); -------------------------------------------------------------------------------- /models/user.js: -------------------------------------------------------------------------------- 1 | var mongodb = require('mongodb'), 2 | settings = require('../settings'); 3 | 4 | function User(user) { 5 | this.name = user.name; 6 | this.password = user.password; 7 | this.email = user.email; 8 | }; 9 | 10 | module.exports = User; 11 | 12 | //存储用户信息 13 | User.prototype.save = function(callback) { 14 | //要存入数据库的用户文档 15 | var user = { 16 | name: this.name, 17 | password: this.password, 18 | email: this.email 19 | }; 20 | //打开数据库 21 | mongodb.MongoClient.connect(settings.url, function (err, db) { 22 | if (err) { 23 | return callback(err);//错误,返回 err 信息 24 | } 25 | //读取 users 集合 26 | db.collection('users', function (err, collection) { 27 | if (err) { 28 | db.close(); 29 | return callback(err);//错误,返回 err 信息 30 | } 31 | //将用户数据插入 users 集合 32 | collection.insert(user, { 33 | safe: true 34 | }, function (err, user) { 35 | db.close(); 36 | if (err) { 37 | return callback(err);//错误,返回 err 信息 38 | } 39 | callback(null, user[0]);//成功!err 为 null,并返回存储后的用户文档 40 | }); 41 | }); 42 | }); 43 | }; 44 | 45 | //读取用户信息 46 | User.get = function(name, callback) { 47 | //打开数据库 48 | mongodb.MongoClient.connect(settings.url, function (err, db) { 49 | if (err) { 50 | return callback(err);//错误,返回 err 信息 51 | } 52 | //读取 users 集合 53 | db.collection('users', function (err, collection) { 54 | if (err) { 55 | db.close(); 56 | return callback(err);//错误,返回 err 信息 57 | } 58 | //查找用户名(name键)值为 name 一个文档 59 | collection.findOne({ 60 | name: name 61 | }, function (err, user) { 62 | db.close(); 63 | if (err) { 64 | return callback(err);//失败!返回 err 信息 65 | } 66 | callback(null, user);//成功!返回查询的用户信息 67 | }); 68 | }); 69 | }); 70 | }; -------------------------------------------------------------------------------- /mongodb_start_hisign.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | set filename=mongod.exe 3 | set filepath=C:\Program" "Files\MongoDB\Server\3.2\bin\ 4 | start %filepath%%filename% --dbpath D:\MyNode\db_mongodb 5 | cmd.exe -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "N-blog", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "body-parser": "~1.15.1", 10 | "cookie-parser": "~1.4.3", 11 | "debug": "~2.2.0", 12 | "ejs": "~2.4.1", 13 | "express": "~4.13.4", 14 | "morgan": "~1.7.0", 15 | "serve-favicon": "~2.3.0", 16 | "express-session": "1.9.1", 17 | "connect-mongo": "0.8.2", 18 | "mongodb":"2.0.42", 19 | "connect-flash": "0.1.1", 20 | "markdown": "0.5.0", 21 | "multer": "1.1.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /public/bootstrap/blog_model.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Blog Template for Bootstrap 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 29 | 30 | 31 | 32 | 33 |
34 |
35 | 42 |
43 |
44 | 45 |
46 | 47 |
48 |

The Bootstrap Blog

49 |

The official example template of creating a blog with Bootstrap.

50 |
51 | 52 |
53 | 54 |
55 | 56 |
57 |

Sample blog post

58 | 59 | 60 |

This blog post shows a few different types of content that's supported and styled with Bootstrap. Basic typography, images, and code are all supported.

61 |
62 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis consectetur purus sit amet fermentum.

63 |
64 |

Curabitur blandit tempus porttitor. Nullam quis risus eget urna mollis ornare vel eu leo. Nullam id dolor id nibh ultricies vehicula ut id elit.

65 |
66 |

Etiam porta sem malesuada magna mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.

67 |

Heading

68 |

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.

69 |

Sub-heading

70 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

71 |
Example code block
72 |

Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.

73 |

Sub-heading

74 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

75 |
    76 |
  • Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
  • 77 |
  • Donec id elit non mi porta gravida at eget metus.
  • 78 |
  • Nulla vitae elit libero, a pharetra augue.
  • 79 |
80 |

Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.

81 |
    82 |
  1. Vestibulum id ligula porta felis euismod semper.
  2. 83 |
  3. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
  4. 84 |
  5. Maecenas sed diam eget risus varius blandit sit amet non magna.
  6. 85 |
86 |

Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis.

87 |
88 | 89 |
90 |

Another blog post

91 | 92 | 93 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis consectetur purus sit amet fermentum.

94 |
95 |

Curabitur blandit tempus porttitor. Nullam quis risus eget urna mollis ornare vel eu leo. Nullam id dolor id nibh ultricies vehicula ut id elit.

96 |
97 |

Etiam porta sem malesuada magna mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.

98 |

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.

99 |
100 | 101 |
102 |

New feature

103 | 104 | 105 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

106 |
    107 |
  • Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
  • 108 |
  • Donec id elit non mi porta gravida at eget metus.
  • 109 |
  • Nulla vitae elit libero, a pharetra augue.
  • 110 |
111 |

Etiam porta sem malesuada magna mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.

112 |

Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.

113 |
114 | 115 | 121 | 122 |
123 | 124 |
125 | 129 | 146 | 154 |
155 | 156 |
157 | 158 |
159 | 160 | 166 | 167 | 168 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /public/bootstrap/blog_model.html.bak: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Blog Template for Bootstrap 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 29 | 30 | 31 | 32 | 33 |
34 |
35 | 42 |
43 |
44 | 45 |
46 | 47 |
48 |

The Bootstrap Blog

49 |

The official example template of creating a blog with Bootstrap.

50 |
51 | 52 |
53 | 54 |
55 | 56 |
57 |

Sample blog post

58 | 59 | 60 |

This blog post shows a few different types of content that's supported and styled with Bootstrap. Basic typography, images, and code are all supported.

61 |
62 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis consectetur purus sit amet fermentum.

63 |
64 |

Curabitur blandit tempus porttitor. Nullam quis risus eget urna mollis ornare vel eu leo. Nullam id dolor id nibh ultricies vehicula ut id elit.

65 |
66 |

Etiam porta sem malesuada magna mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.

67 |

Heading

68 |

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.

69 |

Sub-heading

70 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

71 |
Example code block
72 |

Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.

73 |

Sub-heading

74 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

75 |
    76 |
  • Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
  • 77 |
  • Donec id elit non mi porta gravida at eget metus.
  • 78 |
  • Nulla vitae elit libero, a pharetra augue.
  • 79 |
80 |

Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.

81 |
    82 |
  1. Vestibulum id ligula porta felis euismod semper.
  2. 83 |
  3. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
  4. 84 |
  5. Maecenas sed diam eget risus varius blandit sit amet non magna.
  6. 85 |
86 |

Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis.

87 |
88 | 89 |
90 |

Another blog post

91 | 92 | 93 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis consectetur purus sit amet fermentum.

94 |
95 |

Curabitur blandit tempus porttitor. Nullam quis risus eget urna mollis ornare vel eu leo. Nullam id dolor id nibh ultricies vehicula ut id elit.

96 |
97 |

Etiam porta sem malesuada magna mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.

98 |

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.

99 |
100 | 101 |
102 |

New feature

103 | 104 | 105 |

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

106 |
    107 |
  • Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
  • 108 |
  • Donec id elit non mi porta gravida at eget metus.
  • 109 |
  • Nulla vitae elit libero, a pharetra augue.
  • 110 |
111 |

Etiam porta sem malesuada magna mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.

112 |

Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.

113 |
114 | 115 | 121 | 122 |
123 | 124 |
125 | 129 | 146 | 154 |
155 | 156 |
157 | 158 |
159 | 160 | 166 | 167 | 168 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /public/bootstrap/carousel/bootstrap-alert.js: -------------------------------------------------------------------------------- 1 | /* ========================================================== 2 | * bootstrap-alert.js v2.3.2 3 | * http://twbs.github.com/bootstrap/javascript.html#alerts 4 | * ========================================================== 5 | * Copyright 2013 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ========================================================== */ 19 | 20 | 21 | !function ($) { 22 | 23 | "use strict"; // jshint ;_; 24 | 25 | 26 | /* ALERT CLASS DEFINITION 27 | * ====================== */ 28 | 29 | var dismiss = '[data-dismiss="alert"]' 30 | , Alert = function (el) { 31 | $(el).on('click', dismiss, this.close) 32 | } 33 | 34 | Alert.prototype.close = function (e) { 35 | var $this = $(this) 36 | , selector = $this.attr('data-target') 37 | , $parent 38 | 39 | if (!selector) { 40 | selector = $this.attr('href') 41 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 42 | } 43 | 44 | $parent = $(selector) 45 | 46 | e && e.preventDefault() 47 | 48 | $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) 49 | 50 | $parent.trigger(e = $.Event('close')) 51 | 52 | if (e.isDefaultPrevented()) return 53 | 54 | $parent.removeClass('in') 55 | 56 | function removeElement() { 57 | $parent 58 | .trigger('closed') 59 | .remove() 60 | } 61 | 62 | $.support.transition && $parent.hasClass('fade') ? 63 | $parent.on($.support.transition.end, removeElement) : 64 | removeElement() 65 | } 66 | 67 | 68 | /* ALERT PLUGIN DEFINITION 69 | * ======================= */ 70 | 71 | var old = $.fn.alert 72 | 73 | $.fn.alert = function (option) { 74 | return this.each(function () { 75 | var $this = $(this) 76 | , data = $this.data('alert') 77 | if (!data) $this.data('alert', (data = new Alert(this))) 78 | if (typeof option == 'string') data[option].call($this) 79 | }) 80 | } 81 | 82 | $.fn.alert.Constructor = Alert 83 | 84 | 85 | /* ALERT NO CONFLICT 86 | * ================= */ 87 | 88 | $.fn.alert.noConflict = function () { 89 | $.fn.alert = old 90 | return this 91 | } 92 | 93 | 94 | /* ALERT DATA-API 95 | * ============== */ 96 | 97 | $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) 98 | 99 | }(window.jQuery); -------------------------------------------------------------------------------- /public/bootstrap/carousel/bootstrap-button.js: -------------------------------------------------------------------------------- 1 | /* ============================================================ 2 | * bootstrap-button.js v2.3.2 3 | * http://twbs.github.com/bootstrap/javascript.html#buttons 4 | * ============================================================ 5 | * Copyright 2013 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ============================================================ */ 19 | 20 | 21 | !function ($) { 22 | 23 | "use strict"; // jshint ;_; 24 | 25 | 26 | /* BUTTON PUBLIC CLASS DEFINITION 27 | * ============================== */ 28 | 29 | var Button = function (element, options) { 30 | this.$element = $(element) 31 | this.options = $.extend({}, $.fn.button.defaults, options) 32 | } 33 | 34 | Button.prototype.setState = function (state) { 35 | var d = 'disabled' 36 | , $el = this.$element 37 | , data = $el.data() 38 | , val = $el.is('input') ? 'val' : 'html' 39 | 40 | state = state + 'Text' 41 | data.resetText || $el.data('resetText', $el[val]()) 42 | 43 | $el[val](data[state] || this.options[state]) 44 | 45 | // push to event loop to allow forms to submit 46 | setTimeout(function () { 47 | state == 'loadingText' ? 48 | $el.addClass(d).attr(d, d) : 49 | $el.removeClass(d).removeAttr(d) 50 | }, 0) 51 | } 52 | 53 | Button.prototype.toggle = function () { 54 | var $parent = this.$element.closest('[data-toggle="buttons-radio"]') 55 | 56 | $parent && $parent 57 | .find('.active') 58 | .removeClass('active') 59 | 60 | this.$element.toggleClass('active') 61 | } 62 | 63 | 64 | /* BUTTON PLUGIN DEFINITION 65 | * ======================== */ 66 | 67 | var old = $.fn.button 68 | 69 | $.fn.button = function (option) { 70 | return this.each(function () { 71 | var $this = $(this) 72 | , data = $this.data('button') 73 | , options = typeof option == 'object' && option 74 | if (!data) $this.data('button', (data = new Button(this, options))) 75 | if (option == 'toggle') data.toggle() 76 | else if (option) data.setState(option) 77 | }) 78 | } 79 | 80 | $.fn.button.defaults = { 81 | loadingText: 'loading...' 82 | } 83 | 84 | $.fn.button.Constructor = Button 85 | 86 | 87 | /* BUTTON NO CONFLICT 88 | * ================== */ 89 | 90 | $.fn.button.noConflict = function () { 91 | $.fn.button = old 92 | return this 93 | } 94 | 95 | 96 | /* BUTTON DATA-API 97 | * =============== */ 98 | 99 | $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { 100 | var $btn = $(e.target) 101 | if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') 102 | $btn.button('toggle') 103 | }) 104 | 105 | }(window.jQuery); -------------------------------------------------------------------------------- /public/bootstrap/carousel/bootstrap-carousel.js: -------------------------------------------------------------------------------- 1 | /* ========================================================== 2 | * bootstrap-carousel.js v2.3.2 3 | * http://twbs.github.com/bootstrap/javascript.html#carousel 4 | * ========================================================== 5 | * Copyright 2013 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ========================================================== */ 19 | 20 | 21 | !function ($) { 22 | 23 | "use strict"; // jshint ;_; 24 | 25 | 26 | /* CAROUSEL CLASS DEFINITION 27 | * ========================= */ 28 | 29 | var Carousel = function (element, options) { 30 | this.$element = $(element) 31 | this.$indicators = this.$element.find('.carousel-indicators') 32 | this.options = options 33 | this.options.pause == 'hover' && this.$element 34 | .on('mouseenter', $.proxy(this.pause, this)) 35 | .on('mouseleave', $.proxy(this.cycle, this)) 36 | } 37 | 38 | Carousel.prototype = { 39 | 40 | cycle: function (e) { 41 | if (!e) this.paused = false 42 | if (this.interval) clearInterval(this.interval); 43 | this.options.interval 44 | && !this.paused 45 | && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) 46 | return this 47 | } 48 | 49 | , getActiveIndex: function () { 50 | this.$active = this.$element.find('.item.active') 51 | this.$items = this.$active.parent().children() 52 | return this.$items.index(this.$active) 53 | } 54 | 55 | , to: function (pos) { 56 | var activeIndex = this.getActiveIndex() 57 | , that = this 58 | 59 | if (pos > (this.$items.length - 1) || pos < 0) return 60 | 61 | if (this.sliding) { 62 | return this.$element.one('slid', function () { 63 | that.to(pos) 64 | }) 65 | } 66 | 67 | if (activeIndex == pos) { 68 | return this.pause().cycle() 69 | } 70 | 71 | return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) 72 | } 73 | 74 | , pause: function (e) { 75 | if (!e) this.paused = true 76 | if (this.$element.find('.next, .prev').length && $.support.transition.end) { 77 | this.$element.trigger($.support.transition.end) 78 | this.cycle(true) 79 | } 80 | clearInterval(this.interval) 81 | this.interval = null 82 | return this 83 | } 84 | 85 | , next: function () { 86 | if (this.sliding) return 87 | return this.slide('next') 88 | } 89 | 90 | , prev: function () { 91 | if (this.sliding) return 92 | return this.slide('prev') 93 | } 94 | 95 | , slide: function (type, next) { 96 | var $active = this.$element.find('.item.active') 97 | , $next = next || $active[type]() 98 | , isCycling = this.interval 99 | , direction = type == 'next' ? 'left' : 'right' 100 | , fallback = type == 'next' ? 'first' : 'last' 101 | , that = this 102 | , e 103 | 104 | this.sliding = true 105 | 106 | isCycling && this.pause() 107 | 108 | $next = $next.length ? $next : this.$element.find('.item')[fallback]() 109 | 110 | e = $.Event('slide', { 111 | relatedTarget: $next[0] 112 | , direction: direction 113 | }) 114 | 115 | if ($next.hasClass('active')) return 116 | 117 | if (this.$indicators.length) { 118 | this.$indicators.find('.active').removeClass('active') 119 | this.$element.one('slid', function () { 120 | var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) 121 | $nextIndicator && $nextIndicator.addClass('active') 122 | }) 123 | } 124 | 125 | if ($.support.transition && this.$element.hasClass('slide')) { 126 | this.$element.trigger(e) 127 | if (e.isDefaultPrevented()) return 128 | $next.addClass(type) 129 | $next[0].offsetWidth // force reflow 130 | $active.addClass(direction) 131 | $next.addClass(direction) 132 | this.$element.one($.support.transition.end, function () { 133 | $next.removeClass([type, direction].join(' ')).addClass('active') 134 | $active.removeClass(['active', direction].join(' ')) 135 | that.sliding = false 136 | setTimeout(function () { that.$element.trigger('slid') }, 0) 137 | }) 138 | } else { 139 | this.$element.trigger(e) 140 | if (e.isDefaultPrevented()) return 141 | $active.removeClass('active') 142 | $next.addClass('active') 143 | this.sliding = false 144 | this.$element.trigger('slid') 145 | } 146 | 147 | isCycling && this.cycle() 148 | 149 | return this 150 | } 151 | 152 | } 153 | 154 | 155 | /* CAROUSEL PLUGIN DEFINITION 156 | * ========================== */ 157 | 158 | var old = $.fn.carousel 159 | 160 | $.fn.carousel = function (option) { 161 | return this.each(function () { 162 | var $this = $(this) 163 | , data = $this.data('carousel') 164 | , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) 165 | , action = typeof option == 'string' ? option : options.slide 166 | if (!data) $this.data('carousel', (data = new Carousel(this, options))) 167 | if (typeof option == 'number') data.to(option) 168 | else if (action) data[action]() 169 | else if (options.interval) data.pause().cycle() 170 | }) 171 | } 172 | 173 | $.fn.carousel.defaults = { 174 | interval: 5000 175 | , pause: 'hover' 176 | } 177 | 178 | $.fn.carousel.Constructor = Carousel 179 | 180 | 181 | /* CAROUSEL NO CONFLICT 182 | * ==================== */ 183 | 184 | $.fn.carousel.noConflict = function () { 185 | $.fn.carousel = old 186 | return this 187 | } 188 | 189 | /* CAROUSEL DATA-API 190 | * ================= */ 191 | 192 | $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { 193 | var $this = $(this), href 194 | , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 195 | , options = $.extend({}, $target.data(), $this.data()) 196 | , slideIndex 197 | 198 | $target.carousel(options) 199 | 200 | if (slideIndex = $this.attr('data-slide-to')) { 201 | $target.data('carousel').pause().to(slideIndex).cycle() 202 | } 203 | 204 | e.preventDefault() 205 | }) 206 | 207 | }(window.jQuery); -------------------------------------------------------------------------------- /public/bootstrap/carousel/bootstrap-collapse.js: -------------------------------------------------------------------------------- 1 | /* ============================================================= 2 | * bootstrap-collapse.js v2.3.2 3 | * http://twbs.github.com/bootstrap/javascript.html#collapse 4 | * ============================================================= 5 | * Copyright 2013 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ============================================================ */ 19 | 20 | 21 | !function ($) { 22 | 23 | "use strict"; // jshint ;_; 24 | 25 | 26 | /* COLLAPSE PUBLIC CLASS DEFINITION 27 | * ================================ */ 28 | 29 | var Collapse = function (element, options) { 30 | this.$element = $(element) 31 | this.options = $.extend({}, $.fn.collapse.defaults, options) 32 | 33 | if (this.options.parent) { 34 | this.$parent = $(this.options.parent) 35 | } 36 | 37 | this.options.toggle && this.toggle() 38 | } 39 | 40 | Collapse.prototype = { 41 | 42 | constructor: Collapse 43 | 44 | , dimension: function () { 45 | var hasWidth = this.$element.hasClass('width') 46 | return hasWidth ? 'width' : 'height' 47 | } 48 | 49 | , show: function () { 50 | var dimension 51 | , scroll 52 | , actives 53 | , hasData 54 | 55 | if (this.transitioning || this.$element.hasClass('in')) return 56 | 57 | dimension = this.dimension() 58 | scroll = $.camelCase(['scroll', dimension].join('-')) 59 | actives = this.$parent && this.$parent.find('> .accordion-group > .in') 60 | 61 | if (actives && actives.length) { 62 | hasData = actives.data('collapse') 63 | if (hasData && hasData.transitioning) return 64 | actives.collapse('hide') 65 | hasData || actives.data('collapse', null) 66 | } 67 | 68 | this.$element[dimension](0) 69 | this.transition('addClass', $.Event('show'), 'shown') 70 | $.support.transition && this.$element[dimension](this.$element[0][scroll]) 71 | } 72 | 73 | , hide: function () { 74 | var dimension 75 | if (this.transitioning || !this.$element.hasClass('in')) return 76 | dimension = this.dimension() 77 | this.reset(this.$element[dimension]()) 78 | this.transition('removeClass', $.Event('hide'), 'hidden') 79 | this.$element[dimension](0) 80 | } 81 | 82 | , reset: function (size) { 83 | var dimension = this.dimension() 84 | 85 | this.$element 86 | .removeClass('collapse') 87 | [dimension](size || 'auto') 88 | [0].offsetWidth 89 | 90 | this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') 91 | 92 | return this 93 | } 94 | 95 | , transition: function (method, startEvent, completeEvent) { 96 | var that = this 97 | , complete = function () { 98 | if (startEvent.type == 'show') that.reset() 99 | that.transitioning = 0 100 | that.$element.trigger(completeEvent) 101 | } 102 | 103 | this.$element.trigger(startEvent) 104 | 105 | if (startEvent.isDefaultPrevented()) return 106 | 107 | this.transitioning = 1 108 | 109 | this.$element[method]('in') 110 | 111 | $.support.transition && this.$element.hasClass('collapse') ? 112 | this.$element.one($.support.transition.end, complete) : 113 | complete() 114 | } 115 | 116 | , toggle: function () { 117 | this[this.$element.hasClass('in') ? 'hide' : 'show']() 118 | } 119 | 120 | } 121 | 122 | 123 | /* COLLAPSE PLUGIN DEFINITION 124 | * ========================== */ 125 | 126 | var old = $.fn.collapse 127 | 128 | $.fn.collapse = function (option) { 129 | return this.each(function () { 130 | var $this = $(this) 131 | , data = $this.data('collapse') 132 | , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) 133 | if (!data) $this.data('collapse', (data = new Collapse(this, options))) 134 | if (typeof option == 'string') data[option]() 135 | }) 136 | } 137 | 138 | $.fn.collapse.defaults = { 139 | toggle: true 140 | } 141 | 142 | $.fn.collapse.Constructor = Collapse 143 | 144 | 145 | /* COLLAPSE NO CONFLICT 146 | * ==================== */ 147 | 148 | $.fn.collapse.noConflict = function () { 149 | $.fn.collapse = old 150 | return this 151 | } 152 | 153 | 154 | /* COLLAPSE DATA-API 155 | * ================= */ 156 | 157 | $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { 158 | var $this = $(this), href 159 | , target = $this.attr('data-target') 160 | || e.preventDefault() 161 | || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 162 | , option = $(target).data('collapse') ? 'toggle' : $this.data() 163 | $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') 164 | $(target).collapse(option) 165 | }) 166 | 167 | }(window.jQuery); -------------------------------------------------------------------------------- /public/bootstrap/carousel/bootstrap-dropdown.js: -------------------------------------------------------------------------------- 1 | /* ============================================================ 2 | * bootstrap-dropdown.js v2.3.2 3 | * http://twbs.github.com/bootstrap/javascript.html#dropdowns 4 | * ============================================================ 5 | * Copyright 2013 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ============================================================ */ 19 | 20 | 21 | !function ($) { 22 | 23 | "use strict"; // jshint ;_; 24 | 25 | 26 | /* DROPDOWN CLASS DEFINITION 27 | * ========================= */ 28 | 29 | var toggle = '[data-toggle=dropdown]' 30 | , Dropdown = function (element) { 31 | var $el = $(element).on('click.dropdown.data-api', this.toggle) 32 | $('html').on('click.dropdown.data-api', function () { 33 | $el.parent().removeClass('open') 34 | }) 35 | } 36 | 37 | Dropdown.prototype = { 38 | 39 | constructor: Dropdown 40 | 41 | , toggle: function (e) { 42 | var $this = $(this) 43 | , $parent 44 | , isActive 45 | 46 | if ($this.is('.disabled, :disabled')) return 47 | 48 | $parent = getParent($this) 49 | 50 | isActive = $parent.hasClass('open') 51 | 52 | clearMenus() 53 | 54 | if (!isActive) { 55 | if ('ontouchstart' in document.documentElement) { 56 | // if mobile we we use a backdrop because click events don't delegate 57 | $('