初始版本
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..063b0e4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+.DS_Store
+Thumbs.db
+db.json
+*.log
+node_modules/
+public/
+.deploy*/
\ No newline at end of file
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..b01551e
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,100 @@
+# Hexo Configuration
+## Docs: https://hexo.io/docs/configuration.html
+## Source: https://github.com/hexojs/hexo/
+
+# Site
+title: 一卡通文档库
+subtitle:
+description:
+author: Supwisdom
+language: zh-cn
+timezone:
+
+# URL
+## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
+url: http://ykt.supwisdom.com
+root: /
+permalink: :title/
+permalink_defaults:
+
+# Directory
+source_dir: source
+public_dir: public
+tag_dir: tags
+archive_dir: archives
+category_dir: categories
+code_dir: downloads/code
+i18n_dir: :lang
+skip_render:
+
+# Writing
+new_post_name: :title.md # File name of new posts
+default_layout: post
+titlecase: false # Transform title into titlecase
+external_link: true # Open external links in new tab
+filename_case: 0
+render_drafts: false
+post_asset_folder: false
+relative_link: false
+future: true
+highlight:
+ enable: true
+ line_number: true
+ auto_detect: false
+ tab_replace:
+
+# Category & Tag
+default_category: uncategorized
+category_map:
+tag_map:
+
+toc:
+ maxDepth: 3
+
+excerpt_link: Read More
+fancybox: true
+
+theme_config:
+ # Header
+ navbar_brand: <img src="/imgs/logo.jpg" width="24" height="24">
+ menu:
+ Home: index.html
+ Archives: archives/
+
+ widgets:
+ - toc
+ - category
+ - archive
+ - recent_posts
+ - tag
+
+marked:
+ gfm: true
+ pedantic: false
+ sanitize: false
+ tables: true
+ breaks: true
+ smartLists: true
+ smartypants: true
+
+# Date / Time format
+## Hexo uses Moment.js to parse and display date
+## You can customize the date format as defined in
+## http://momentjs.com/docs/#/displaying/format/
+date_format: YYYY-MM-DD
+time_format: HH:mm:ss
+
+# Pagination
+## Set per_page to 0 to disable pagination
+per_page: 10
+pagination_dir: page
+
+# Extensions
+## Plugins: https://hexo.io/plugins/
+## Themes: https://hexo.io/themes/
+theme: bootstrap-blog
+
+# Deployment
+## Docs: https://hexo.io/docs/deployment.html
+deploy:
+ type:
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..6753fd8
--- /dev/null
+++ b/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "hexo-site",
+ "version": "0.0.0",
+ "private": true,
+ "hexo": {
+ "version": "3.2.0"
+ },
+ "dependencies": {
+ "hexo": "^3.2.0",
+ "hexo-excerpt": "^1.1.0",
+ "hexo-generator-archive": "^0.1.4",
+ "hexo-generator-category": "^0.1.3",
+ "hexo-generator-index": "^0.2.0",
+ "hexo-generator-tag": "^0.2.0",
+ "hexo-renderer-ejs": "^0.2.0",
+ "hexo-renderer-marked": "^0.2.10",
+ "hexo-renderer-stylus": "^0.3.1",
+ "hexo-server": "^0.2.0",
+ "hexo-tag-bootstrap": "0.0.8",
+ "hexo-tag-fontawesome": "^1.0.0",
+ "hexo-toc": "^1.0.0"
+ }
+}
diff --git a/scaffolds/draft.md b/scaffolds/draft.md
new file mode 100644
index 0000000..498e95b
--- /dev/null
+++ b/scaffolds/draft.md
@@ -0,0 +1,4 @@
+---
+title: {{ title }}
+tags:
+---
diff --git a/scaffolds/page.md b/scaffolds/page.md
new file mode 100644
index 0000000..f01ba3c
--- /dev/null
+++ b/scaffolds/page.md
@@ -0,0 +1,4 @@
+---
+title: {{ title }}
+date: {{ date }}
+---
diff --git a/scaffolds/post.md b/scaffolds/post.md
new file mode 100644
index 0000000..1f9b9a4
--- /dev/null
+++ b/scaffolds/post.md
@@ -0,0 +1,5 @@
+---
+title: {{ title }}
+date: {{ date }}
+tags:
+---
diff --git "a/source/_posts/\344\270\200\345\215\241\351\200\232v5\346\216\245\345\205\245\345\215\217\350\256\256\350\247\204\350\214\203.md" "b/source/_posts/\344\270\200\345\215\241\351\200\232v5\346\216\245\345\205\245\345\215\217\350\256\256\350\247\204\350\214\203.md"
new file mode 100644
index 0000000..85b5fa5
--- /dev/null
+++ "b/source/_posts/\344\270\200\345\215\241\351\200\232v5\346\216\245\345\205\245\345\215\217\350\256\256\350\247\204\350\214\203.md"
@@ -0,0 +1,5 @@
+---
+title: 一卡通v5接入协议规范
+date: 2016-06-20 14:41:40
+tags:
+---
diff --git a/themes/bootstrap-blog/.gitignore b/themes/bootstrap-blog/.gitignore
new file mode 100644
index 0000000..6e3a08a
--- /dev/null
+++ b/themes/bootstrap-blog/.gitignore
@@ -0,0 +1,3 @@
+.DS_Store
+node_modules
+tmp
\ No newline at end of file
diff --git a/themes/bootstrap-blog/LICENSE b/themes/bootstrap-blog/LICENSE
new file mode 100644
index 0000000..0f24f72
--- /dev/null
+++ b/themes/bootstrap-blog/LICENSE
@@ -0,0 +1,7 @@
+Copyright © 2015 Christopher Martin <cgmartin@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/themes/bootstrap-blog/README.md b/themes/bootstrap-blog/README.md
new file mode 100644
index 0000000..bd782f2
--- /dev/null
+++ b/themes/bootstrap-blog/README.md
@@ -0,0 +1,207 @@
+# hexo-theme-bootstrap-blog
+
+A simple [Bootstrap] v3 blog theme for [Hexo].
+
+Based on the [official Bootstrap Blog example template](http://getbootstrap.com/examples/blog/).
+
+[Demo site](http://cgmartin.github.io/hexo-theme-bootstrap-blog/) | [More Information](https://cgmartin.com/2016/01/05/bootstrap-blog-hexo-theme/)
+
+## Setup Instructions
+
+### Install
+
+**This theme requires Hexo 2.4 and above.**
+
+1) Install theme:
+
+```bash
+$ git clone https://github.com/cgmartin/hexo-theme-bootstrap-blog.git themes/bootstrap-blog
+```
+
+2) (optional) Install [hexo-tag-bootstrap](https://github.com/wzpan/hexo-tag-bootstrap) for more Bootstrap tags (textcolors, buttons, labels, badges, etc.):
+
+```bash
+$ npm install hexo-tag-bootstrap --save
+```
+
+3) (optional) Install [hexo-tag-fontawesome](https://github.com/akarzim/hexo-tag-fontawesome) for placing Font Awesome icons in your Markdown:
+
+```bash
+$ npm install hexo-tag-fontawesome --save
+```
+
+### Enable
+
+Modify the `theme` setting in `_config.yml` to `bootstrap-blog`.
+
+### Update
+
+```bash
+cd themes/bootstrap-blog
+git pull
+```
+
+## Configuration
+
+```yml
+# File: themes/bootstrap-blog/_config.yml
+
+# Header
+navbar_brand: false
+menu:
+ Home: index.html
+ Archives: archives/
+rss: /atom.xml
+
+# Content
+excerpt_link: Read More
+fancybox: true
+
+# Sidebar
+widgets:
+- about # See also: `about_content`
+- category
+- tag
+- tagcloud
+- archives
+- recent_posts
+about_widget_content: >
+ <p>Etiam porta <em>sem malesuada magna</em> mollis euismod.
+ Cras mattis consectetur purus sit amet fermentum. Aenean
+ lacinia bibendum nulla sed consectetur.</p>
+
+# Miscellaneous
+google_analytics:
+favicon:
+twitter:
+google_plus:
+```
+
+- **navbar_brand** - The HTML content for an optional ["navbar-brand"](http://getbootstrap.com/components/#navbar-brand-image). Can be text or an image. `false` to hide.
+- **menu** - Navigation menu (map of Titles to URLs)
+- **rss** - RSS link (ie. "/atom.xml")
+- **excerpt_link** - "Read More" link at the bottom of excerpted articles. `false` to hide the link.
+- **fancybox** - Enable [Fancybox] for images
+- **widgets** - Enable sidebar widgets ([more info below](#sidebar))
+- **about_widget_content** - The HTML content for the "About" sidebar widget ([more info below](#sidebar))
+- **google_analytics** - Google Analytics ID
+- **favicon** - Favicon path (ie. '/favicon.ico')
+- **twitter_id** - Twitter ID of the author (ie. `@c_g_martin`)
+- **google_plus** - Google+ profile link
+
+Instead of editing the layout's configuration file directly, you can override the theme settings from your project's root `_config.yml`, ie.:
+```yml
+theme_config:
+ # Header
+ navbar_brand: <img src="/navbrand.png">
+ menu:
+ Home: index.html
+ Archives: archives/
+ 'Another Page': page/index.html
+ widgets:
+ - about
+ - category
+ - archive
+ - recent_posts
+ - tag
+ about_widget_content: >
+ <p>This is <strong>custom content</strong> for the
+ "about" sidebar widget.</p>
+```
+
+## Features
+
+### Front-Matter Extras
+
+Optional settings in the front-matter can be added for various effects:
+```yml
+---
+author: Author Name # displays the post's author
+photos: # displays a Bootstrap thumbnail gallery
+- images/HNCK0537.jpg
+- images/HNCK6173.jpg
+---
+```
+
+### Fancybox
+
+This theme uses [Fancybox] to showcase your photos. You can use the image Markdown syntax or fancybox tag plugin to add your photos.
+
+Usage:
+```
+
+
+~or~
+
+{% fancybox img_url [img_thumbnail] [img_caption] %}
+```
+
+### Callouts
+
+A custom tag for the [Bootstrap "callout" style](http://cpratt.co/twitter-bootstrap-callout-css-styles/) is available for use.
+
+Usage:
+```
+{% callout [type:default|primary|success|info|warning|danger] %}
+...content...
+{% endcallout %}
+```
+
+Example:
+```
+{% callout info %}
+#### {% fa info-circle %} Info tip
+This is some callout content
+{% endcallout %}
+```
+
+### Sidebar
+
+This theme provides 6 built-in widgets that can be displayed in the sidebar:
+
+- [about](./layout/_widget/about.ejs) \*
+- [category](./layout/_widget/category.ejs)
+- [tag](./layout/_widget/tag.ejs)
+- [tagcloud](./layout/_widget/tagcloud.ejs)
+- [archives](./layout/_widget/archives.ejs)
+- [recent_posts](./layout/_widget/recent_posts.ejs)
+
+All widgets are enabled and displayed by default. You can toggle them on/off with the `widgets` setting in the theme's [_config.yml](./config.yml).
+
+\* **NOTE**: The "about" widget contains static Lorem Ipsum text by default. You'll want to edit the `about_widget_content` setting for your site or disable the widget in the [theme config](./config.yml). You can also modify the widget file itself to include contents from a Markdown page:
+```html
+<!-- file: ./layout/_widget/about.ejs -->
+<div class="sidebar-module sidebar-module-inset">
+ <h4>About</h4>
+ <%- site.pages['data'].find(function(p) { return p.path === 'about/index.html'; }).content %>
+</div>
+```
+...then run `hexo new page about` to create the Markdown page.
+
+### Bootstrap Paginator Helper
+
+A custom `bs_paginator()` helper is used to produce [Bootstrap-compatible pagination markup](http://getbootstrap.com/components/#pagination). It is a drop-in replacement for Hexo's built-in `paginator()`.
+
+```
+<%- bs_paginator({
+ prev_text: '<i class="fa fa-chevron-left"></i> Prev',
+ next_text: 'Next <i class="fa fa-chevron-right"></i>'
+ }) %>
+```
+
+## Development
+
+The [default Landscape Hexo theme](https://github.com/hexojs/hexo-theme-landscape) was used as the starting point and heavily edited for this theme.
+
+The Landscape Stylus styles have been replaced with standard CSS files which override `bootstrap.min.css`. Stylus is used only for [bundling the CSS files](./source/css/styles.styl). Feel free to convert the CSS to your pre-processor of choice (Stylus, LESS, Sass, etc.).
+
+## License
+
+[MIT License](http://cgm.mit-license.org/)
+
+Copyright © 2016 Christopher Martin
+
+[Hexo]: http://zespia.tw/hexo/
+[Fancybox]: http://fancyapps.com/fancybox/
+[Font Awesome]: http://fontawesome.io/
+[Bootstrap]: http://getbootstrap.com/
diff --git a/themes/bootstrap-blog/_config.yml b/themes/bootstrap-blog/_config.yml
new file mode 100644
index 0000000..66dd4bb
--- /dev/null
+++ b/themes/bootstrap-blog/_config.yml
@@ -0,0 +1,35 @@
+# Header
+navbar_brand: false
+menu:
+ Home: index.html
+ Archives: archives/
+rss: /atom.xml
+
+# Content
+excerpt_link: Read More
+fancybox: false
+
+# Sidebar
+widgets:
+- about # See also: `about_content`
+- category
+- tag
+- tagcloud
+- archive
+- recent_posts
+about_widget_content: >
+ <p>Etiam porta <em>sem malesuada magna</em> mollis euismod.
+ Cras mattis consectetur purus sit amet fermentum. Aenean
+ lacinia bibendum nulla sed consectetur.</p>
+
+# widget behavior
+archive_type: 'monthly'
+show_count: true
+
+# Miscellaneous
+google_analytics:
+favicon:
+twitter_id:
+google_plus:
+fb_admins:
+fb_app_id:
diff --git a/themes/bootstrap-blog/languages/default.yml b/themes/bootstrap-blog/languages/default.yml
new file mode 100644
index 0000000..f8c87cd
--- /dev/null
+++ b/themes/bootstrap-blog/languages/default.yml
@@ -0,0 +1,12 @@
+categories: Categories
+search: Search
+tags: Tags
+tagcloud: Tag Cloud
+tweets: Tweets
+prev: Prev
+next: Next
+comment: Comments
+archive_a: Archives
+archive_b: "Archives: %s"
+page: Page %d
+recent_posts: Recent Posts
\ No newline at end of file
diff --git a/themes/bootstrap-blog/languages/no.yml b/themes/bootstrap-blog/languages/no.yml
new file mode 100644
index 0000000..dc99a05
--- /dev/null
+++ b/themes/bootstrap-blog/languages/no.yml
@@ -0,0 +1,12 @@
+categories: Kategorier
+search: Søk
+tags: Tags
+tagcloud: Tag Cloud
+tweets: Tweets
+prev: Forrige
+next: Neste
+comment: Kommentarer
+archive_a: Arkiv
+archive_b: "Arkiv: %s"
+page: Side %d
+recent_posts: Siste innlegg
diff --git a/themes/bootstrap-blog/languages/zh-CN.yml b/themes/bootstrap-blog/languages/zh-CN.yml
new file mode 100644
index 0000000..db64407
--- /dev/null
+++ b/themes/bootstrap-blog/languages/zh-CN.yml
@@ -0,0 +1,12 @@
+categories: 分类
+search: 搜索
+tags: 标签
+tagcloud: 标签云
+tweets: 推文
+prev: 上一页
+next: 下一页
+comment: 留言
+archive_a: 归档
+archive_b: 归档:%s
+page: 第 %d 页
+recent_posts: 最新文章
\ No newline at end of file
diff --git a/themes/bootstrap-blog/languages/zh-TW.yml b/themes/bootstrap-blog/languages/zh-TW.yml
new file mode 100644
index 0000000..a33a15e
--- /dev/null
+++ b/themes/bootstrap-blog/languages/zh-TW.yml
@@ -0,0 +1,12 @@
+categories: 分類
+search: 搜尋
+tags: 標籤
+tagcloud: 標籤雲
+tweets: 推文
+prev: 上一頁
+next: 下一頁
+comment: 留言
+archive_a: 彙整
+archive_b: 彙整:%s
+page: 第 %d 頁
+recent_posts: 最新文章
\ No newline at end of file
diff --git a/themes/bootstrap-blog/layout/_partial/archive-post.ejs b/themes/bootstrap-blog/layout/_partial/archive-post.ejs
new file mode 100644
index 0000000..e74aed2
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/archive-post.ejs
@@ -0,0 +1,6 @@
+<article class="archive-article archive-type-<%= post.layout %>">
+ <header class="archive-article-header">
+ <%- partial('post/title', {class_name: 'archive-article-title'}) %>
+ <%- partial('post/date', {class_name: 'archive-article-date', date_format: 'MMMM Do'}) %>
+ </header>
+</article>
diff --git a/themes/bootstrap-blog/layout/_partial/archive.ejs b/themes/bootstrap-blog/layout/_partial/archive.ejs
new file mode 100644
index 0000000..cdda897
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/archive.ejs
@@ -0,0 +1,33 @@
+<% if (pagination == 2){ %>
+ <% page.posts.each(function(post){ %>
+ <%- partial('article', {post: post, index: true}) %>
+ <% }) %>
+<% } else { %>
+ <% var last; %>
+ <% page.posts.each(function(post, i){ %>
+ <% var year = post.date.year(); %>
+ <% if (last != year){ %>
+ <% if (last != null){ %>
+ </div></section>
+ <% } %>
+ <% last = year; %>
+ <section class="archives-wrap">
+ <div class="archive-year-wrap">
+ <a href="<%- url_for(config.archive_dir + '/' + year) %>" class="archive-year"><%= year %></a>
+ </div>
+ <div class="archives">
+ <% } %>
+ <%- partial('archive-post', {post: post, even: i % 2 == 0}) %>
+ <% }) %>
+ <% if (page.posts.length){ %>
+ </div></section>
+ <% } %>
+<% } %>
+<% if (page.total > 1){ %>
+ <div id="page-nav">
+ <%- bs_paginator({
+ prev_text: '<i class="fa fa-chevron-left"></i> Prev',
+ next_text: 'Next <i class="fa fa-chevron-right"></i>'
+ }) %>
+ </div>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_partial/article.ejs b/themes/bootstrap-blog/layout/_partial/article.ejs
new file mode 100644
index 0000000..ccc57d7
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/article.ejs
@@ -0,0 +1,54 @@
+<article id="<%= post.layout %>-<%= post.slug %>" class="article article-type-<%= post.layout %>" itemscope itemprop="blogPost">
+
+ <header class="article-header">
+ <%- partial('post/title', {class_name: 'article-title'}) %>
+ </header>
+
+ <div class="article-meta">
+ <%- partial('post/date', {class_name: 'article-date', date_format: null}) %>
+ <% if (post.author){ %><div class="article-author"><%= post.author %></div><% } %>
+ <%- partial('post/category') %>
+ </div>
+ <div class="article-inner">
+
+ <div class="article-entry" itemprop="articleBody">
+ <% if (post.excerpt && index){ %>
+ <%- post.excerpt %>
+ <% if (theme.excerpt_link){ %>
+ <p class="article-more-link">
+ <a class="btn btn-primary" href="<%- url_for(post.path) %>#more"><%= theme.excerpt_link %></a>
+ </p>
+ <% } %>
+ <% } else { %>
+ <%- post.content %>
+ <% } %>
+ </div>
+
+ <% if (!(post.excerpt && index)){ %>
+ <%- partial('post/gallery') %>
+ <% } %>
+
+ <footer class="article-footer">
+ <a data-url="<%- post.permalink %>" data-id="<%= post._id %>" class="article-share-link">
+ <i class="fa fa-share"></i> Share
+ </a>
+ <% if (post.comments && config.disqus_shortname){ %>
+ <a href="<%- post.permalink %>#disqus_thread" class="article-comment-link">
+ <i class="fa fa-comment"></i> Comments
+ </a>
+ <% } %>
+ <%- partial('post/tag') %>
+ </footer>
+ </div>
+ <% if (!index){ %>
+ <%- partial('post/nav') %>
+ <% } %>
+</article>
+
+<% if (!index && post.comments && config.disqus_shortname){ %>
+<section id="comments">
+ <div id="disqus_thread">
+ <noscript>Please enable JavaScript to view the <a href="//disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
+ </div>
+</section>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_partial/footer.ejs b/themes/bootstrap-blog/layout/_partial/footer.ejs
new file mode 100644
index 0000000..05a90df
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/footer.ejs
@@ -0,0 +1,8 @@
+<footer class="blog-footer">
+ <div class="container">
+ <div id="footer-info" class="inner">
+ © <%= date(new Date(), 'YYYY') %> <%= config.author || config.title %><br>
+ Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
+ </div>
+ </div>
+</footer>
diff --git a/themes/bootstrap-blog/layout/_partial/google-analytics.ejs b/themes/bootstrap-blog/layout/_partial/google-analytics.ejs
new file mode 100644
index 0000000..84e75f0
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/google-analytics.ejs
@@ -0,0 +1,14 @@
+<% if (theme.google_analytics){ %>
+<!-- Google Analytics -->
+<script type="text/javascript">
+(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+ga('create', '<%= theme.google_analytics %>', 'auto');
+ga('send', 'pageview');
+
+</script>
+<!-- End Google Analytics -->
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_partial/head.ejs b/themes/bootstrap-blog/layout/_partial/head.ejs
new file mode 100644
index 0000000..45c6d8c
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/head.ejs
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <%
+ var title = page.title;
+
+ if (is_archive()){
+ title = 'Archives';
+
+ if (is_month()){
+ title += ': ' + page.year + '/' + page.month;
+ } else if (is_year()){
+ title += ': ' + page.year;
+ }
+ } else if (is_category()){
+ title = 'Category: ' + page.category;
+ } else if (is_tag()){
+ title = 'Tag: ' + page.tag;
+ }
+ %>
+ <title><% if (title){ %><%= title %> | <% } %><%= config.title %></title>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+ <%- open_graph({twitter_id: theme.twitter_id, google_plus: theme.google_plus, fb_admins: theme.fb_admins, fb_app_id: theme.fb_app_id}) %>
+ <% if (theme.rss){ %>
+ <link rel="alternate" href="<%- theme.rss %>" title="<%= config.title %>" type="application/atom+xml">
+ <% } %>
+ <% if (theme.favicon){ %>
+ <link rel="icon" href="<%- theme.favicon %>">
+ <% } %>
+ <% if (config.highlight.enable){ %>
+ <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
+ <% } %>
+
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
+
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" integrity="sha384-XdYbMnZ/QjLh6iI4ogqCTaIjrFk87ip+ekIjefZch0Y+PvJ8CDYtEs1ipDmPorQ+" crossorigin="anonymous">
+
+ <%- css('css/styles') %>
+ <%- partial('google-analytics') %>
+</head>
diff --git a/themes/bootstrap-blog/layout/_partial/header.ejs b/themes/bootstrap-blog/layout/_partial/header.ejs
new file mode 100644
index 0000000..7d44c5b
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/header.ejs
@@ -0,0 +1,6 @@
+<div class="blog-header">
+ <h1 class="blog-title"><%= config.title %></h1>
+ <% if (theme.subtitle){ %>
+ <p class="lead blog-description"><%= theme.subtitle %></p>
+ <% } %>
+</div>
diff --git a/themes/bootstrap-blog/layout/_partial/inline-scripts.ejs b/themes/bootstrap-blog/layout/_partial/inline-scripts.ejs
new file mode 100644
index 0000000..0465772
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/inline-scripts.ejs
@@ -0,0 +1,26 @@
+<% if (config.disqus_shortname){ %>
+<script>
+ var disqus_shortname = '<%= config.disqus_shortname %>';
+ <% if (page.permalink){ %>
+ var disqus_url = '<%= page.permalink %>';
+ <% } %>
+ (function(){
+ var dsq = document.createElement('script');
+ dsq.type = 'text/javascript';
+ dsq.async = true;
+ dsq.src = '//' + disqus_shortname + '.disqus.com/<% if (page.comments) { %>embed.js<% } else { %>count.js<% } %>';
+ (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+ })();
+</script>
+<% } %>
+
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
+
+<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
+
+<% if (theme.fancybox){ %>
+ <%- css('fancybox/jquery.fancybox') %>
+ <%- js('fancybox/jquery.fancybox.pack') %>
+<% } %>
+
+<%- js('js/script') %>
diff --git a/themes/bootstrap-blog/layout/_partial/masthead.ejs b/themes/bootstrap-blog/layout/_partial/masthead.ejs
new file mode 100644
index 0000000..fb0f73c
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/masthead.ejs
@@ -0,0 +1,34 @@
+<nav class="navbar navbar-inverse">
+ <div class="container">
+ <!-- Brand and toggle get grouped for better mobile display -->
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#main-menu-navbar" aria-expanded="false">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <% if (theme.navbar_brand){ %>
+ <a class="navbar-brand" href="<%- config.root %>"><%- theme.navbar_brand %></a>
+ <% } %>
+ </div>
+
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <div class="collapse navbar-collapse" id="main-menu-navbar">
+ <ul class="nav navbar-nav">
+ <% for (var i in theme.menu){ %>
+ <li><a class="<%= is_current(theme.menu[i]) ? 'active' : '' %>"
+ href="<%- url_for(theme.menu[i]) %>"><%= i %></a></li>
+ <% } %>
+ </ul>
+
+ <!--
+ <ul class="nav navbar-nav navbar-right">
+ <% if (theme.rss){ %>
+ <li><a href="<%- theme.rss %>" title="RSS Feed"><i class="fa fa-rss"></i></a></li>
+ <% } %>
+ </ul>
+ -->
+ </div><!-- /.navbar-collapse -->
+ </div><!-- /.container-fluid -->
+</nav>
diff --git a/themes/bootstrap-blog/layout/_partial/post/category.ejs b/themes/bootstrap-blog/layout/_partial/post/category.ejs
new file mode 100644
index 0000000..be3fba3
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/post/category.ejs
@@ -0,0 +1,10 @@
+<% if (post.categories && post.categories.length){ %>
+ <div class="article-category">
+ <%- list_categories(post.categories, {
+ show_count: false,
+ class: 'article-category',
+ style: 'none',
+ separator: ' / '
+ }) %>
+ </div>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_partial/post/date.ejs b/themes/bootstrap-blog/layout/_partial/post/date.ejs
new file mode 100644
index 0000000..0751a1e
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/post/date.ejs
@@ -0,0 +1,3 @@
+<div class="article-datetime">
+ <a href="<%- url_for(post.path) %>" class="<%= class_name %>"><time datetime="<%= date_xml(post.date) %>" itemprop="datePublished"><%= date(post.date, date_format) %></time></a>
+</div>
diff --git a/themes/bootstrap-blog/layout/_partial/post/gallery.ejs b/themes/bootstrap-blog/layout/_partial/post/gallery.ejs
new file mode 100644
index 0000000..fa6e150
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/post/gallery.ejs
@@ -0,0 +1,11 @@
+<% if (post.photos && post.photos.length){ %>
+<div class="row article-gallery">
+ <% post.photos.forEach(function(photo, i){ %>
+ <div class="col-xs-6 col-md-4">
+ <a class="thumbnail image-link" href="<%- url_for(photo) %>" rel="gallery_<%= post._id %>">
+ <img src="<%- url_for(photo) %>" itemprop="image">
+ </a>
+ </div>
+ <% }) %>
+</div>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_partial/post/nav.ejs b/themes/bootstrap-blog/layout/_partial/post/nav.ejs
new file mode 100644
index 0000000..27c6aa0
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/post/nav.ejs
@@ -0,0 +1,20 @@
+<% if (post.prev || post.next){ %>
+<ul id="article-nav" class="nav nav-pills nav-justified">
+ <% if (post.next){ %>
+ <li role="presentation">
+ <a href="<%- url_for(post.next.path) %>" id="article-nav-older" class="article-nav-link-wrap">
+ <i class="fa fa-chevron-left pull-left"></i>
+ <span class="article-nav-link-title"><%= post.next.title || '(no title)' %></span>
+ </a>
+ </li>
+ <% } %>
+ <% if (post.prev){ %>
+ <li role="presentation">
+ <a href="<%- url_for(post.prev.path) %>" id="article-nav-newer" class="article-nav-link-wrap">
+ <span class="article-nav-link-title"><%= post.prev.title || '(no title)' %></span>
+ <i class="fa fa-chevron-right pull-right"></i>
+ </a>
+ </li>
+ <% } %>
+</ul>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_partial/post/tag.ejs b/themes/bootstrap-blog/layout/_partial/post/tag.ejs
new file mode 100644
index 0000000..35ded20
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/post/tag.ejs
@@ -0,0 +1,6 @@
+<% if (post.tags && post.tags.length){ %>
+ <%- list_tags(post.tags, {
+ show_count: false,
+ class: 'article-tag'
+ }) %>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_partial/post/title.ejs b/themes/bootstrap-blog/layout/_partial/post/title.ejs
new file mode 100644
index 0000000..f5ea7e9
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/post/title.ejs
@@ -0,0 +1,16 @@
+<% if (post.link){ %>
+ <h1 itemprop="name">
+ <a class="<%= class_name %>" href="<%- url_for(post.link) %>"
+ target="_blank" itemprop="url"><%= post.title || '(no title)' %></a>
+ </h1>
+<% } else { %>
+ <% if (index){ %>
+ <h1 itemprop="name">
+ <a class="<%= class_name %>" href="<%- url_for(post.path) %>"><%= post.title || '(no title)' %></a>
+ </h1>
+ <% } else { %>
+ <h1 class="<%= class_name %>" itemprop="name">
+ <%= post.title || '(no title)' %>
+ </h1>
+ <% } %>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_partial/sidebar.ejs b/themes/bootstrap-blog/layout/_partial/sidebar.ejs
new file mode 100644
index 0000000..2ad43f4
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_partial/sidebar.ejs
@@ -0,0 +1,3 @@
+<% theme.widgets.forEach(function(widget){ %>
+ <%- partial('_widget/' + widget) %>
+<% }) %>
diff --git a/themes/bootstrap-blog/layout/_widget/about.ejs b/themes/bootstrap-blog/layout/_widget/about.ejs
new file mode 100644
index 0000000..161e640
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_widget/about.ejs
@@ -0,0 +1,4 @@
+<div class="sidebar-module sidebar-module-inset">
+ <h4>About</h4>
+ <%- theme.about_widget_content %>
+</div>
diff --git a/themes/bootstrap-blog/layout/_widget/archive.ejs b/themes/bootstrap-blog/layout/_widget/archive.ejs
new file mode 100644
index 0000000..e7158da
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_widget/archive.ejs
@@ -0,0 +1,6 @@
+<% if (site.posts.length){ %>
+ <div class="sidebar-module">
+ <h4>Archives</h4>
+ <%- list_archives({show_count: theme.show_count, type: theme.archive_type, class: 'sidebar-module'}) %>
+ </div>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_widget/category.ejs b/themes/bootstrap-blog/layout/_widget/category.ejs
new file mode 100644
index 0000000..77f76cd
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_widget/category.ejs
@@ -0,0 +1,6 @@
+<% if (site.categories.length){ %>
+ <div class="sidebar-module">
+ <h4>Categories</h4>
+ <%- list_categories({show_count: theme.show_count, class: 'sidebar-module'}) %>
+ </div>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_widget/recent_posts.ejs b/themes/bootstrap-blog/layout/_widget/recent_posts.ejs
new file mode 100644
index 0000000..c86e098
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_widget/recent_posts.ejs
@@ -0,0 +1,12 @@
+<% if (site.posts.length){ %>
+ <div class="sidebar-module">
+ <h4>Recents</h4>
+ <ul class="sidebar-module-list">
+ <% site.posts.sort('date', -1).limit(5).each(function(post){ %>
+ <li>
+ <a href="<%- url_for(post.path) %>"><%= post.title || '(no title)' %></a>
+ </li>
+ <% }) %>
+ </ul>
+ </div>
+<% } %>
\ No newline at end of file
diff --git a/themes/bootstrap-blog/layout/_widget/tag.ejs b/themes/bootstrap-blog/layout/_widget/tag.ejs
new file mode 100644
index 0000000..22b9e61
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_widget/tag.ejs
@@ -0,0 +1,6 @@
+<% if (site.tags.length){ %>
+ <div class="sidebar-module">
+ <h4>Tags</h4>
+ <%- list_tags({show_count: theme.show_count, class: 'sidebar-module'}) %>
+ </div>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/_widget/tagcloud.ejs b/themes/bootstrap-blog/layout/_widget/tagcloud.ejs
new file mode 100644
index 0000000..15e07ec
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_widget/tagcloud.ejs
@@ -0,0 +1,8 @@
+<% if (site.tags.length){ %>
+ <div class="sidebar-module">
+ <h4>Tag Cloud</h4>
+ <p class="tagcloud">
+ <%- tagcloud() %>
+ </p>
+ </div>
+<% } %>
\ No newline at end of file
diff --git a/themes/bootstrap-blog/layout/_widget/toc.ejs b/themes/bootstrap-blog/layout/_widget/toc.ejs
new file mode 100644
index 0000000..d1d8a61
--- /dev/null
+++ b/themes/bootstrap-blog/layout/_widget/toc.ejs
@@ -0,0 +1,5 @@
+<%if (is_post()) { %>
+<div>
+<%- toc(page.content) %>
+</div>
+<% } %>
diff --git a/themes/bootstrap-blog/layout/archive.ejs b/themes/bootstrap-blog/layout/archive.ejs
new file mode 100644
index 0000000..dff5934
--- /dev/null
+++ b/themes/bootstrap-blog/layout/archive.ejs
@@ -0,0 +1 @@
+<%- partial('_partial/archive', {pagination: config.archive, index: true}) %>
diff --git a/themes/bootstrap-blog/layout/category.ejs b/themes/bootstrap-blog/layout/category.ejs
new file mode 100644
index 0000000..c5552ff
--- /dev/null
+++ b/themes/bootstrap-blog/layout/category.ejs
@@ -0,0 +1 @@
+<%- partial('_partial/archive', {pagination: config.category, index: true}) %>
diff --git a/themes/bootstrap-blog/layout/index.ejs b/themes/bootstrap-blog/layout/index.ejs
new file mode 100644
index 0000000..18d3216
--- /dev/null
+++ b/themes/bootstrap-blog/layout/index.ejs
@@ -0,0 +1 @@
+<%- partial('_partial/archive', {pagination: 2, index: true}) %>
diff --git a/themes/bootstrap-blog/layout/layout.ejs b/themes/bootstrap-blog/layout/layout.ejs
new file mode 100644
index 0000000..d8ef954
--- /dev/null
+++ b/themes/bootstrap-blog/layout/layout.ejs
@@ -0,0 +1,18 @@
+<%- partial('_partial/head') %>
+<body>
+ <%- partial('_partial/masthead') %>
+ <div class="container">
+ <%- partial('_partial/header', null, {cache: !config.relative_link}) %>
+ <div class="row">
+ <div class="col-sm-8 blog-main">
+ <%- body %>
+ </div>
+ <div class="col-sm-3 col-sm-offset-1 blog-sidebar">
+ <%- partial('_partial/sidebar', null, {cache: !config.relative_link}) %>
+ </div>
+ </div>
+ </div>
+ <%- partial('_partial/footer', null, {cache: !config.relative_link}) %>
+ <%- partial('_partial/inline-scripts') %>
+</body>
+</html>
diff --git a/themes/bootstrap-blog/layout/page.ejs b/themes/bootstrap-blog/layout/page.ejs
new file mode 100644
index 0000000..3020e1c
--- /dev/null
+++ b/themes/bootstrap-blog/layout/page.ejs
@@ -0,0 +1 @@
+<%- partial('_partial/article', {post: page, index: false}) %>
diff --git a/themes/bootstrap-blog/layout/post.ejs b/themes/bootstrap-blog/layout/post.ejs
new file mode 100644
index 0000000..3020e1c
--- /dev/null
+++ b/themes/bootstrap-blog/layout/post.ejs
@@ -0,0 +1 @@
+<%- partial('_partial/article', {post: page, index: false}) %>
diff --git a/themes/bootstrap-blog/layout/tag.ejs b/themes/bootstrap-blog/layout/tag.ejs
new file mode 100644
index 0000000..cc45ab8
--- /dev/null
+++ b/themes/bootstrap-blog/layout/tag.ejs
@@ -0,0 +1 @@
+<%- partial('_partial/archive', {pagination: config.tag, index: true}) %>
diff --git a/themes/bootstrap-blog/package.json b/themes/bootstrap-blog/package.json
new file mode 100644
index 0000000..2870a8f
--- /dev/null
+++ b/themes/bootstrap-blog/package.json
@@ -0,0 +1,5 @@
+{
+ "name": "hexo-theme-bootstrap-blog",
+ "version": "0.1.0",
+ "private": true
+}
diff --git a/themes/bootstrap-blog/scripts/bs_paginator.js b/themes/bootstrap-blog/scripts/bs_paginator.js
new file mode 100644
index 0000000..472f450
--- /dev/null
+++ b/themes/bootstrap-blog/scripts/bs_paginator.js
@@ -0,0 +1,120 @@
+'use strict';
+
+function bsPaginatorHelper(options){
+ /* jshint validthis: true */
+ options = options || {};
+
+ var current = options.current || this.page.current || 0;
+ var total = options.total || this.page.total || 1;
+ var endSize = options.hasOwnProperty('end_size') ? +options.end_size : 1;
+ var midSize = options.hasOwnProperty('mid_size') ? +options.mid_size : 2;
+ var space = options.hasOwnProperty('space') ? options.space : '…';
+ var base = options.base || this.page.base || this.config.root || '';
+ var format = options.format || this.config.pagination_dir + '/%d/';
+ var prevText = options.prev_text || 'Prev';
+ var nextText = options.next_text || 'Next';
+ var prevNext = options.hasOwnProperty('prev_next') ? options.prev_next : true;
+ var transform = options.transform;
+ var self = this;
+ var result = '';
+ var i;
+
+ if (!current) return '';
+
+ var currentPage = '<li class="active"><span class="page-number">' +
+ (transform ? transform(current) : current) +
+ '</span></li>';
+
+ function link(i){
+ return self.url_for(i === 1 ? base : base + format.replace('%d', i));
+ }
+
+ function pageLink(i){
+ return '<li><a class="page-number" href="' + link(i) + '">' +
+ (transform ? transform(i) : i) +
+ '</a></li>';
+ }
+
+ // Display the link to the previous page
+ if (prevNext){
+ if (current > 1) {
+ result += '<li><a class="page-prev" rel="prev" ' +
+ 'href="' + link(current - 1) + '">' + prevText + '</a></li>';
+ } else {
+ result += '<li class="disabled"><span class="page-prev">' + prevText + '</a></li>';
+ }
+ }
+
+ if (options.show_all){
+ // Display pages on the left side of the current page
+ for (i = 1; i < current; i++){
+ result += pageLink(i);
+ }
+
+ // Display the current page
+ result += currentPage;
+
+ // Display pages on the right side of the current page
+ for (i = current + 1; i <= total; i++){
+ result += pageLink(i);
+ }
+ } else {
+ // It's too complicated. May need refactor.
+ var leftEnd = current <= endSize ? current - 1 : endSize;
+ var rightEnd = total - current <= endSize ? current + 1 : total - endSize + 1;
+ var leftMid = current - midSize <= endSize ? current - midSize + endSize : current - midSize;
+ var rightMid = current + midSize + endSize > total ? current + midSize - endSize : current + midSize;
+ var spaceHtml = '<li class="disabled"><span class="page-space">' + space + '</span></li>';
+
+ // Display pages on the left edge
+ for (i = 1; i <= leftEnd; i++){
+ result += pageLink(i);
+ }
+
+ // Display spaces between edges and middle pages
+ if (space && current - endSize - midSize > 1){
+ result += spaceHtml;
+ }
+
+ // Display left middle pages
+ if (leftMid > leftEnd){
+ for (i = leftMid; i < current; i++){
+ result += pageLink(i);
+ }
+ }
+
+ // Display the current page
+ result += currentPage;
+
+ // Display right middle pages
+ if (rightMid < rightEnd){
+ for (i = current + 1; i <= rightMid; i++){
+ result += pageLink(i);
+ }
+ }
+
+ // Display spaces between edges and middle pages
+ if (space && total - endSize - midSize > current){
+ result += spaceHtml;
+ }
+
+ // Dispaly pages on the right edge
+ for (i = rightEnd; i <= total; i++){
+ result += pageLink(i);
+ }
+ }
+
+ // Display the link to the next page
+ if (prevNext){
+ if (current < total) {
+ result += '<li><a class="page-next" rel="next" ' +
+ 'href="' + link(current + 1) + '">' + nextText + '</a></li>';
+ } else {
+ result += '<li class="disabled"><span class="page-next">' + nextText + '</a></li>';
+ }
+ }
+
+ return '<nav><ul class="pagination">' + result + '</ul></nav>';
+}
+
+hexo.extend.helper.register('bs_paginator', bsPaginatorHelper);
diff --git a/themes/bootstrap-blog/scripts/callout.js b/themes/bootstrap-blog/scripts/callout.js
new file mode 100644
index 0000000..6413b33
--- /dev/null
+++ b/themes/bootstrap-blog/scripts/callout.js
@@ -0,0 +1,17 @@
+/**
+ * Bootstrap callout style
+ *
+ * Syntax:
+ * {% callout [type] %}
+ * Callout content
+ * {% endcallout %}
+ */
+
+hexo.extend.tag.register('callout', function(args, content) {
+ var calloutType = args.length ? args[0] : 'default';
+ var result = '';
+ result += '<div class="bs-callout bs-callout-' + calloutType + '">';
+ result += hexo.render.renderSync({text: content, engine: 'markdown'});
+ result += '</div>';
+ return result;
+}, true);
\ No newline at end of file
diff --git a/themes/bootstrap-blog/scripts/fancybox.js b/themes/bootstrap-blog/scripts/fancybox.js
new file mode 100644
index 0000000..50c154f
--- /dev/null
+++ b/themes/bootstrap-blog/scripts/fancybox.js
@@ -0,0 +1,24 @@
+var rUrl = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/;
+
+/**
+ * Fancybox tag
+ *
+ * Syntax:
+ * {% fancybox /path/to/image [/path/to/thumbnail] [title] %}
+ */
+
+hexo.extend.tag.register('fancybox', function(args){
+ var original = args.shift(),
+ thumbnail = '';
+
+ if (args.length && rUrl.test(args[0])){
+ thumbnail = args.shift();
+ }
+
+ var title = args.join(' ');
+
+ return '<a class="fancybox" href="' + original + '" title="' + title + '">' +
+ '<img src="' + (thumbnail || original) + '" alt="' + title + '">'
+ '</a>' +
+ (title ? '<span class="caption">' + title + '</span>' : '');
+});
\ No newline at end of file
diff --git a/themes/bootstrap-blog/source/css/callouts.css b/themes/bootstrap-blog/source/css/callouts.css
new file mode 100644
index 0000000..aabc3e6
--- /dev/null
+++ b/themes/bootstrap-blog/source/css/callouts.css
@@ -0,0 +1,65 @@
+/** Callout Styles */
+
+.bs-callout {
+ padding: 20px;
+ margin: 20px 0;
+ border: 1px solid #eee;
+ border-left-width: 5px;
+ border-radius: 3px;
+}
+.bs-callout h4,
+.bs-callout .fa {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+.bs-callout p:last-child {
+ margin-bottom: 0;
+}
+.bs-callout code {
+ border-radius: 3px;
+}
+.bs-callout+.bs-callout {
+ margin-top: -5px;
+}
+.bs-callout-default {
+ border-left-color: #777;
+}
+.bs-callout-default h4,
+.bs-callout-default .fa {
+ color: #777;
+}
+.bs-callout-primary {
+ border-left-color: #428bca;
+}
+.bs-callout-primary h4,
+.bs-callout-primary .fa {
+ color: #428bca;
+}
+.bs-callout-success {
+ border-left-color: #5cb85c;
+}
+.bs-callout-success h4,
+.bs-callout-success .fa {
+ color: #5cb85c;
+}
+.bs-callout-danger {
+ border-left-color: #d9534f;
+}
+.bs-callout-danger h4,
+.bs-callout-danger .fa {
+ color: #d9534f;
+}
+.bs-callout-warning {
+ border-left-color: #f0ad4e;
+}
+.bs-callout-warning h4,
+.bs-callout-warning .fa {
+ color: #f0ad4e;
+}
+.bs-callout-info {
+ border-left-color: #5bc0de;
+}
+.bs-callout-info h4,
+.bs-callout-info .fa {
+ color: #5bc0de;
+}
diff --git a/themes/bootstrap-blog/source/css/custom.css b/themes/bootstrap-blog/source/css/custom.css
new file mode 100644
index 0000000..afe121b
--- /dev/null
+++ b/themes/bootstrap-blog/source/css/custom.css
@@ -0,0 +1,311 @@
+/**
+ * Custom Bootstrap and Theme Overrides
+ *
+ * Bootstrap designers: Feel free to remove all of the styles in this
+ * file to start a fresh new design. Most of the critical/functional
+ * styles are found within the other CSS files, with this one included last.
+ *
+ * Bootstrap and Hexo markdown style overrides would typically happen here.
+ */
+
+/* Globals */
+
+body {
+ font-family: Georgia, "Times New Roman", Times, serif;
+ color: #555;
+}
+
+h1, .h1,
+h2, .h2,
+h3, .h3,
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+ margin-top: 1em;
+ margin-bottom: 15px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-weight: normal;
+ color: #333;
+}
+
+p {
+ margin: 0 0 15px;
+}
+
+code {
+ background-color: #eeeeee;
+ font-size: 80%;
+}
+
+.fa { margin-right: 0.25em; }
+
+/* Buttons */
+.btn {
+ border-radius: 30px;
+}
+.btn-primary {
+ background-color: #428bca;
+ border-color: #337ab7;
+}
+.nav-pills>li>a {
+ border-radius: 30px;
+}
+
+/* Override Bootstrap's default container width */
+@media (min-width: 1200px) {
+ .container {
+ width: 970px;
+ }
+}
+
+/*
+ * Masthead for nav
+ */
+
+.navbar {
+ background-color: #428bca;
+ -webkit-box-shadow: inset 0 -2px 5px rgba(0,0,0,.1);
+ box-shadow: inset 0 -2px 5px rgba(0,0,0,.1);
+}
+
+.navbar-inverse { border: 0; }
+
+.navbar-inverse .navbar-toggle {
+ border-color: #cdddeb;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+ background-color: #cdddeb;
+}
+
+.navbar-inverse .navbar-toggle:focus,
+.navbar-inverse .navbar-toggle:hover {
+ background-color: #65A2D6;
+}
+
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav>li>a {
+ color: #cdddeb;
+ font-weight: 500;
+}
+
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+ border-color: #cdddeb;
+}
+
+.navbar-inverse .navbar-nav>li>a.active {
+ color: #fff;
+}
+
+@media (min-width: 768px) {
+ .navbar {
+ border-radius: 0;
+ min-height: 40px;
+ }
+
+ /** The following may need modification depending on
+ the size of your `navbar-brand` (if enabled) */
+ #main-menu-navbar {
+ margin-left: -30px;
+ }
+ .navbar-nav>li>a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ }
+ /** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
+
+ .navbar-inverse .navbar-nav>li>a.active:after {
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ width: 0;
+ height: 0;
+ margin-left: -5px;
+ vertical-align: middle;
+ content: " ";
+ border-right: 5px solid transparent;
+ border-bottom: 5px solid;
+ border-left: 5px solid transparent;
+ }
+}
+
+/*
+ * Blog header and description
+ */
+
+.blog-header {
+ padding-bottom: 20px;
+}
+.blog-title {
+ margin-top: 30px;
+ margin-bottom: 0;
+ font-size: 60px;
+ font-weight: normal;
+}
+.blog-description {
+ font-size: 20px;
+ color: #999;
+}
+
+/*
+ * Main column and sidebar layout
+ */
+
+.blog-main {
+ font-size: 18px;
+ line-height: 1.5;
+}
+.blog-main > article:last-of-type {
+ margin-bottom: 30px;
+}
+
+/* Sidebar modules for boxing content */
+.sidebar-module {
+ padding: 15px;
+ margin: 0 -15px 15px;
+}
+.sidebar-module h4 {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+.sidebar-module-inset {
+ padding: 15px;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+}
+.sidebar-module-inset p:last-child,
+.sidebar-module-inset ul:last-child,
+.sidebar-module-inset ol:last-child {
+ margin-bottom: 0;
+}
+
+.sidebar-module-list {
+ padding-left: 0;
+ list-style: none;
+}
+.sidebar-module-list-child {
+ padding-left: 25px;
+}
+
+
+/*
+ * Blog posts
+ */
+
+.article {
+ margin-bottom: 60px;
+}
+
+.article-header h1 {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+.article-header h1 a {
+ color: #333;
+}
+.article-header h1 a:hover {
+ color: #23527c;
+ text-decoration: none;
+}
+
+.article-meta {
+ margin-bottom: 20px;
+ color: #999;
+ font-size: 0.9em;
+}
+.article-meta > * {
+ display: inline-block;
+ margin-right: 15px;
+}
+.article-meta a {
+ color: inherit;
+}
+
+.article-entry .article-more-link {
+ margin: 15px 0;
+}
+.article-entry .thumbnail .caption {
+ padding: 0;
+}
+.article-entry>*:last-child {
+ margin-bottom: 15px;
+}
+
+/* article footer content */
+.article-footer {
+ font-size: 0.85em;
+ border-top: 1px solid #eee;
+ padding-top: 15px;
+}
+.article-footer:after { /* clearfix */
+ content: " ";
+ visibility: hidden;
+ display: block;
+ height: 0;
+ clear: both;
+}
+.article-footer a {
+ color: #999;
+ text-decoration: none;
+}
+.article-footer a:hover {
+ color: #666;
+ text-decoration: underline;
+}
+
+/*
+ * Archives
+ */
+
+.archives-wrap {
+ margin-bottom: 30px;
+}
+
+.archive-year-wrap a,
+.archive-article .article-datetime a {
+ color: #333;
+ text-decoration: none;
+}
+
+.archive-article .article-datetime a {
+ color: #999;
+ text-decoration: none;
+}
+
+/*
+ * Pagination
+ */
+#page-nav {
+ text-align: center;
+}
+#page-nav .pagination {
+ margin-top: 0;
+ margin-bottom: 30px;
+}
+#page-nav .pagination .active>* {
+ background-color: #428bca;
+ border-color: #428bca;
+}
+#page-nav .pagination>li:last-child>* {
+ border-top-right-radius: 30px;
+ border-bottom-right-radius: 30px;
+}
+#page-nav .pagination>li:first-child>* {
+ border-top-left-radius: 30px;
+ border-bottom-left-radius: 30px;
+}
+
+/*
+ * Footer
+ */
+
+.blog-footer {
+ padding: 40px 0;
+ color: #999;
+ text-align: center;
+ background-color: #f9f9f9;
+ border-top: 1px solid #e5e5e5;
+}
+.blog-footer p:last-child {
+ margin-bottom: 0;
+}
diff --git a/themes/bootstrap-blog/source/css/hexo-base.css b/themes/bootstrap-blog/source/css/hexo-base.css
new file mode 100644
index 0000000..20af499
--- /dev/null
+++ b/themes/bootstrap-blog/source/css/hexo-base.css
@@ -0,0 +1,172 @@
+/**
+ * Base Hexo and Theme styles
+ *
+ * This stylesheet is meant to give a baseline style
+ * for the built-in Hexo tags and theme markdown. They shouldn't need
+ * to change as often as the styles in `custom.css` (in theory).
+ */
+
+/* Globals */
+
+.left, .alignleft {
+ float: left;
+}
+.right, .alignright {
+ float: right;
+}
+
+/* Sidebar */
+
+.sidebar-module-list-count {
+ padding-left: 5px;
+}
+.sidebar-module-list-count:before { content: "("; }
+.sidebar-module-list-count:after { content: ")"; }
+
+/* Articles */
+
+.article-entry {
+ overflow: hidden; /* fixes problems on small width devices */
+}
+
+.article-meta {
+ margin-bottom: 20px;
+}
+.article-meta > * {
+ display: inline-block;
+ margin-right: 15px;
+}
+
+.article-date:before,
+.article-author:before,
+.article-category-link:before {
+ display: inline-block;
+ font-family: FontAwesome;
+ margin-right: 0.25em;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+}
+.article-date:before { content: "\f073"; }
+.article-author:before { content: "\f007"; }
+.article-category-link:before { content: "\f07b"; }
+
+/* blockquote */
+.article-entry blockquote footer cite {
+ display: inline-block;
+}
+.article-entry blockquote footer cite::before {
+ content: "~";
+ padding: 0px 0.5em;
+}
+
+.article-entry .pullquote.right {
+ margin-right: 0.5em;
+ margin-left: 1em;
+}
+.article-entry .pullquote {
+ text-align: left;
+ width: 45%;
+ margin: 0;
+}
+
+/* article tags */
+.article-tag-list {
+ margin: 0;
+ padding: 0;
+ list-style-type: none;
+}
+.article-tag-list-item {
+ display: inline-block;
+ margin-right: 15px;
+}
+.article-tag-list-link:before {
+ display: inline-block;
+ font-family: FontAwesome;
+ content: "\f02b";
+ margin-right: 0.25em;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+}
+
+.article-footer {
+ border-top: 1px solid #eee;
+ padding-top: 15px;
+}
+
+.article-comment-link { display: inline-block; }
+.article-share-link {
+ cursor: pointer;
+ float: right;
+ margin-left: 20px;
+}
+
+/* prev/next navigation between articles */
+#article-nav {
+ margin-top: 30px;
+}
+#article-nav>li {
+ padding: 2px;
+ font-size: 0.8em;
+}
+#article-nav>li>a {
+ border: 1px solid #337ab7;
+}
+#article-nav>li>a:hover {
+ border: 1px solid #23527c;
+}
+.article-nav-link-wrap .fa {
+ margin: 4px 0;
+}
+
+/* article media */
+
+.article-entry img,
+.article-entry video {
+ max-width: 100%;
+ height: auto;
+ display: block;
+ margin: auto;
+}
+.article-entry .caption {
+ color: #999;
+ display: block;
+ font-size: 0.9em;
+ margin-top: 0.5em;
+ position: relative;
+ text-align: center;
+}
+.article-entry .video-container {
+ position: relative;
+ padding-top: 56.25%;
+ height: 0;
+ overflow: hidden;
+}
+.article-entry .video-container iframe,
+.article-entry .video-container object,
+.article-entry .video-container embed {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ margin-top: 0;
+}
+
+.article-gallery {
+ padding-top: 15px;
+ border-top: 1px solid #eee;
+}
+
+/* Archives */
+
+.archive-year-wrap {
+ border-bottom: 1px solid #eee;
+ font-size: 2em;
+}
+.archive-article {
+ margin: 30px 0;
+}
+.archive-article h1 {
+ margin: 0;
+ font-size: 1.3em;
+}
diff --git a/themes/bootstrap-blog/source/css/highlight-js.css b/themes/bootstrap-blog/source/css/highlight-js.css
new file mode 100644
index 0000000..3a164a2
--- /dev/null
+++ b/themes/bootstrap-blog/source/css/highlight-js.css
@@ -0,0 +1,128 @@
+/** Highlight.js Styles (Syntax Highlighting) */
+
+.highlight {
+ display: block;
+ background: white;
+ color: #333333;
+ overflow-x: auto;
+ margin-bottom: 15px;
+}
+
+.highlight .gutter pre {
+ border: 0;
+ text-align: right;
+ padding-right: 10px;
+ background-color: transparent;
+}
+.highlight .code {
+ width: 100%;
+}
+
+.highlight figcaption {
+ font-size: .8em;
+ color: #999;
+}
+.highlight figcaption a {
+ float: right;
+}
+
+.highlight table {
+ margin: 0;
+ width: 100%;
+}
+
+.highlight pre {
+ margin: 0;
+ background-color: #eeeeee;
+}
+
+.highlight .comment,
+.highlight .meta {
+ color: #969896;
+}
+
+.highlight .string,
+.highlight .value,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .strong,
+.highlight .emphasis,
+.highlight .quote,
+.highlight .inheritance,
+.highlight.ruby .symbol,
+.highlight.xml .cdata {
+ color: #df5000;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .type,
+.highlight.javascript .function {
+ color: #a71d5d;
+}
+
+.highlight .number,
+.highlight .preprocessor,
+.highlight .built_in,
+.highlight .params,
+.highlight .constant,
+.highlight .literal,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .attribute,
+.highlight.css .hexcolor {
+ color: #0086b3;
+}
+
+.highlight .section,
+.highlight .header,
+.highlight .name,
+.highlight .function,
+.highlight.python .decorator,
+.highlight.python .title,
+.highlight.ruby .function .title,
+.highlight.ruby .title .keyword,
+.highlight.perl .sub,
+.highlight.javascript .title,
+.highlight.coffeescript .title {
+ color: #63a35c;
+}
+
+.highlight .tag,
+.highlight .regexp {
+ color: #333333;
+}
+
+.highlight .title,
+.highlight .attr,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight.ruby .constant,
+.highlight.xml .tag .title,
+.highlight.xml .pi,
+.highlight.xml .doctype,
+.highlight.html .doctype,
+.highlight.css .id,
+.highlight.css .class,
+.highlight.css .pseudo,
+.highlight .class,
+.highlight.ruby .class .title,
+.highlight.css .rules .attribute {
+ color: #795da3;
+}
+
+.highlight .addition {
+ color: #55a532;
+ background-color: #eaffea;
+}
+
+.highlight .deletion {
+ color: #bd2c00;
+ background-color: #ffecec;
+}
+
+.highlight .link {
+ text-decoration: underline;
+}
diff --git a/themes/bootstrap-blog/source/css/share-box.css b/themes/bootstrap-blog/source/css/share-box.css
new file mode 100644
index 0000000..64c0e07
--- /dev/null
+++ b/themes/bootstrap-blog/source/css/share-box.css
@@ -0,0 +1,108 @@
+/*
+ * Social media sharing module
+ */
+.article-share-box {
+ position: absolute;
+ display: none;
+ background: #fff;
+ -webkit-box-shadow: 1px 2px 10px rgba(0,0,0,0.2);
+ box-shadow: 1px 2px 10px rgba(0,0,0,0.2);
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ margin-left: -145px;
+ overflow: hidden;
+ z-index: 1;
+}
+.article-share-box.on {
+ display: block;
+}
+.article-share-input {
+ width: 100%;
+ background: none;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ font: 14px "Helvetica Neue", Helvetica, Arial, sans-serif;
+ padding: 0 15px;
+ color: #555;
+ outline: none;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 3px 3px 0 0;
+ border-radius: 3px 3px 0 0;
+ height: 36px;
+ line-height: 36px;
+}
+.article-share-links {
+ zoom: 1;
+ background: #eee;
+ line-height: normal;
+}
+.article-share-links:before,
+.article-share-links:after {
+ content: "";
+ display: table;
+}
+.article-share-links:after {
+ clear: both;
+}
+.article-share-twitter,
+.article-share-facebook,
+.article-share-pinterest,
+.article-share-google {
+ width: 50px;
+ height: 36px;
+ display: block;
+ float: left;
+ position: relative;
+ color: #999;
+ text-shadow: 0 1px #fff;
+}
+.article-share-twitter:before,
+.article-share-facebook:before,
+.article-share-pinterest:before,
+.article-share-google:before {
+ font-size: 20px;
+ font-family: FontAwesome;
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -10px;
+ margin-left: -10px;
+ text-align: center;
+}
+.article-share-twitter:hover,
+.article-share-facebook:hover,
+.article-share-pinterest:hover,
+.article-share-google:hover {
+ color: #fff;
+}
+.article-share-twitter:before {
+ content: "\f099";
+}
+.article-share-twitter:hover {
+ background: #00aced;
+ text-shadow: 0 1px #008abe;
+}
+.article-share-facebook:before {
+ content: "\f09a";
+}
+.article-share-facebook:hover {
+ background: #3b5998;
+ text-shadow: 0 1px #2f477a;
+}
+.article-share-pinterest:before {
+ content: "\f0d2";
+}
+.article-share-pinterest:hover {
+ background: #cb2027;
+ text-shadow: 0 1px #a21a1f;
+}
+.article-share-google:before {
+ content: "\f0d5";
+}
+.article-share-google:hover {
+ background: #dd4b39;
+ text-shadow: 0 1px #be3221;
+}
diff --git a/themes/bootstrap-blog/source/css/styles.styl b/themes/bootstrap-blog/source/css/styles.styl
new file mode 100644
index 0000000..878188e
--- /dev/null
+++ b/themes/bootstrap-blog/source/css/styles.styl
@@ -0,0 +1,6 @@
+/* Concatenates the stylesheet files */
+@import "hexo-base.css"
+@import "callouts.css"
+@import "share-box.css"
+@import "highlight-js.css"
+@import "custom.css"
diff --git a/themes/bootstrap-blog/source/fancybox/blank.gif b/themes/bootstrap-blog/source/fancybox/blank.gif
new file mode 100644
index 0000000..35d42e8
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/blank.gif
Binary files differ
diff --git a/themes/bootstrap-blog/source/fancybox/fancybox_loading.gif b/themes/bootstrap-blog/source/fancybox/fancybox_loading.gif
new file mode 100644
index 0000000..a03a40c
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/fancybox_loading.gif
Binary files differ
diff --git a/themes/bootstrap-blog/source/fancybox/fancybox_loading@2x.gif b/themes/bootstrap-blog/source/fancybox/fancybox_loading@2x.gif
new file mode 100644
index 0000000..9205aeb
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/fancybox_loading@2x.gif
Binary files differ
diff --git a/themes/bootstrap-blog/source/fancybox/fancybox_overlay.png b/themes/bootstrap-blog/source/fancybox/fancybox_overlay.png
new file mode 100644
index 0000000..a439139
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/fancybox_overlay.png
Binary files differ
diff --git a/themes/bootstrap-blog/source/fancybox/fancybox_sprite.png b/themes/bootstrap-blog/source/fancybox/fancybox_sprite.png
new file mode 100644
index 0000000..fd8d5ca
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/fancybox_sprite.png
Binary files differ
diff --git a/themes/bootstrap-blog/source/fancybox/fancybox_sprite@2x.png b/themes/bootstrap-blog/source/fancybox/fancybox_sprite@2x.png
new file mode 100644
index 0000000..d0e4779
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/fancybox_sprite@2x.png
Binary files differ
diff --git a/themes/bootstrap-blog/source/fancybox/helpers/fancybox_buttons.png b/themes/bootstrap-blog/source/fancybox/helpers/fancybox_buttons.png
new file mode 100644
index 0000000..0787207
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/helpers/fancybox_buttons.png
Binary files differ
diff --git a/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-buttons.css b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-buttons.css
new file mode 100644
index 0000000..a26273a
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-buttons.css
@@ -0,0 +1,97 @@
+#fancybox-buttons {
+ position: fixed;
+ left: 0;
+ width: 100%;
+ z-index: 8050;
+}
+
+#fancybox-buttons.top {
+ top: 10px;
+}
+
+#fancybox-buttons.bottom {
+ bottom: 10px;
+}
+
+#fancybox-buttons ul {
+ display: block;
+ width: 166px;
+ height: 30px;
+ margin: 0 auto;
+ padding: 0;
+ list-style: none;
+ border: 1px solid #111;
+ border-radius: 3px;
+ -webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
+ -moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
+ box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
+ background: rgb(50,50,50);
+ background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51)));
+ background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
+ background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
+ background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
+ background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 );
+}
+
+#fancybox-buttons ul li {
+ float: left;
+ margin: 0;
+ padding: 0;
+}
+
+#fancybox-buttons a {
+ display: block;
+ width: 30px;
+ height: 30px;
+ text-indent: -9999px;
+ background-color: transparent;
+ background-image: url('fancybox_buttons.png');
+ background-repeat: no-repeat;
+ outline: none;
+ opacity: 0.8;
+}
+
+#fancybox-buttons a:hover {
+ opacity: 1;
+}
+
+#fancybox-buttons a.btnPrev {
+ background-position: 5px 0;
+}
+
+#fancybox-buttons a.btnNext {
+ background-position: -33px 0;
+ border-right: 1px solid #3e3e3e;
+}
+
+#fancybox-buttons a.btnPlay {
+ background-position: 0 -30px;
+}
+
+#fancybox-buttons a.btnPlayOn {
+ background-position: -30px -30px;
+}
+
+#fancybox-buttons a.btnToggle {
+ background-position: 3px -60px;
+ border-left: 1px solid #111;
+ border-right: 1px solid #3e3e3e;
+ width: 35px
+}
+
+#fancybox-buttons a.btnToggleOn {
+ background-position: -27px -60px;
+}
+
+#fancybox-buttons a.btnClose {
+ border-left: 1px solid #111;
+ width: 35px;
+ background-position: -56px 0px;
+}
+
+#fancybox-buttons a.btnDisabled {
+ opacity : 0.4;
+ cursor: default;
+}
\ No newline at end of file
diff --git a/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-buttons.js b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-buttons.js
new file mode 100644
index 0000000..352bb5f
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-buttons.js
@@ -0,0 +1,122 @@
+ /*!
+ * Buttons helper for fancyBox
+ * version: 1.0.5 (Mon, 15 Oct 2012)
+ * @requires fancyBox v2.0 or later
+ *
+ * Usage:
+ * $(".fancybox").fancybox({
+ * helpers : {
+ * buttons: {
+ * position : 'top'
+ * }
+ * }
+ * });
+ *
+ */
+;(function ($) {
+ //Shortcut for fancyBox object
+ var F = $.fancybox;
+
+ //Add helper object
+ F.helpers.buttons = {
+ defaults : {
+ skipSingle : false, // disables if gallery contains single image
+ position : 'top', // 'top' or 'bottom'
+ tpl : '<div id="fancybox-buttons"><ul><li><a class="btnPrev" title="Previous" href="javascript:;"></a></li><li><a class="btnPlay" title="Start slideshow" href="javascript:;"></a></li><li><a class="btnNext" title="Next" href="javascript:;"></a></li><li><a class="btnToggle" title="Toggle size" href="javascript:;"></a></li><li><a class="btnClose" title="Close" href="javascript:;"></a></li></ul></div>'
+ },
+
+ list : null,
+ buttons: null,
+
+ beforeLoad: function (opts, obj) {
+ //Remove self if gallery do not have at least two items
+
+ if (opts.skipSingle && obj.group.length < 2) {
+ obj.helpers.buttons = false;
+ obj.closeBtn = true;
+
+ return;
+ }
+
+ //Increase top margin to give space for buttons
+ obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30;
+ },
+
+ onPlayStart: function () {
+ if (this.buttons) {
+ this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn');
+ }
+ },
+
+ onPlayEnd: function () {
+ if (this.buttons) {
+ this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn');
+ }
+ },
+
+ afterShow: function (opts, obj) {
+ var buttons = this.buttons;
+
+ if (!buttons) {
+ this.list = $(opts.tpl).addClass(opts.position).appendTo('body');
+
+ buttons = {
+ prev : this.list.find('.btnPrev').click( F.prev ),
+ next : this.list.find('.btnNext').click( F.next ),
+ play : this.list.find('.btnPlay').click( F.play ),
+ toggle : this.list.find('.btnToggle').click( F.toggle ),
+ close : this.list.find('.btnClose').click( F.close )
+ }
+ }
+
+ //Prev
+ if (obj.index > 0 || obj.loop) {
+ buttons.prev.removeClass('btnDisabled');
+ } else {
+ buttons.prev.addClass('btnDisabled');
+ }
+
+ //Next / Play
+ if (obj.loop || obj.index < obj.group.length - 1) {
+ buttons.next.removeClass('btnDisabled');
+ buttons.play.removeClass('btnDisabled');
+
+ } else {
+ buttons.next.addClass('btnDisabled');
+ buttons.play.addClass('btnDisabled');
+ }
+
+ this.buttons = buttons;
+
+ this.onUpdate(opts, obj);
+ },
+
+ onUpdate: function (opts, obj) {
+ var toggle;
+
+ if (!this.buttons) {
+ return;
+ }
+
+ toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn');
+
+ //Size toggle button
+ if (obj.canShrink) {
+ toggle.addClass('btnToggleOn');
+
+ } else if (!obj.canExpand) {
+ toggle.addClass('btnDisabled');
+ }
+ },
+
+ beforeClose: function () {
+ if (this.list) {
+ this.list.remove();
+ }
+
+ this.list = null;
+ this.buttons = null;
+ }
+ };
+
+}(jQuery));
diff --git a/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-media.js b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-media.js
new file mode 100644
index 0000000..62737a5
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-media.js
@@ -0,0 +1,199 @@
+/*!
+ * Media helper for fancyBox
+ * version: 1.0.6 (Fri, 14 Jun 2013)
+ * @requires fancyBox v2.0 or later
+ *
+ * Usage:
+ * $(".fancybox").fancybox({
+ * helpers : {
+ * media: true
+ * }
+ * });
+ *
+ * Set custom URL parameters:
+ * $(".fancybox").fancybox({
+ * helpers : {
+ * media: {
+ * youtube : {
+ * params : {
+ * autoplay : 0
+ * }
+ * }
+ * }
+ * }
+ * });
+ *
+ * Or:
+ * $(".fancybox").fancybox({,
+ * helpers : {
+ * media: true
+ * },
+ * youtube : {
+ * autoplay: 0
+ * }
+ * });
+ *
+ * Supports:
+ *
+ * Youtube
+ * http://www.youtube.com/watch?v=opj24KnzrWo
+ * http://www.youtube.com/embed/opj24KnzrWo
+ * http://youtu.be/opj24KnzrWo
+ * http://www.youtube-nocookie.com/embed/opj24KnzrWo
+ * Vimeo
+ * http://vimeo.com/40648169
+ * http://vimeo.com/channels/staffpicks/38843628
+ * http://vimeo.com/groups/surrealism/videos/36516384
+ * http://player.vimeo.com/video/45074303
+ * Metacafe
+ * http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/
+ * http://www.metacafe.com/watch/7635964/
+ * Dailymotion
+ * http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people
+ * Twitvid
+ * http://twitvid.com/QY7MD
+ * Twitpic
+ * http://twitpic.com/7p93st
+ * Instagram
+ * http://instagr.am/p/IejkuUGxQn/
+ * http://instagram.com/p/IejkuUGxQn/
+ * Google maps
+ * http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17
+ * http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
+ * http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56
+ */
+;(function ($) {
+ "use strict";
+
+ //Shortcut for fancyBox object
+ var F = $.fancybox,
+ format = function( url, rez, params ) {
+ params = params || '';
+
+ if ( $.type( params ) === "object" ) {
+ params = $.param(params, true);
+ }
+
+ $.each(rez, function(key, value) {
+ url = url.replace( '$' + key, value || '' );
+ });
+
+ if (params.length) {
+ url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params;
+ }
+
+ return url;
+ };
+
+ //Add helper object
+ F.helpers.media = {
+ defaults : {
+ youtube : {
+ matcher : /(youtube\.com|youtu\.be|youtube-nocookie\.com)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i,
+ params : {
+ autoplay : 1,
+ autohide : 1,
+ fs : 1,
+ rel : 0,
+ hd : 1,
+ wmode : 'opaque',
+ enablejsapi : 1
+ },
+ type : 'iframe',
+ url : '//www.youtube.com/embed/$3'
+ },
+ vimeo : {
+ matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/,
+ params : {
+ autoplay : 1,
+ hd : 1,
+ show_title : 1,
+ show_byline : 1,
+ show_portrait : 0,
+ fullscreen : 1
+ },
+ type : 'iframe',
+ url : '//player.vimeo.com/video/$1'
+ },
+ metacafe : {
+ matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/,
+ params : {
+ autoPlay : 'yes'
+ },
+ type : 'swf',
+ url : function( rez, params, obj ) {
+ obj.swf.flashVars = 'playerVars=' + $.param( params, true );
+
+ return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf';
+ }
+ },
+ dailymotion : {
+ matcher : /dailymotion.com\/video\/(.*)\/?(.*)/,
+ params : {
+ additionalInfos : 0,
+ autoStart : 1
+ },
+ type : 'swf',
+ url : '//www.dailymotion.com/swf/video/$1'
+ },
+ twitvid : {
+ matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i,
+ params : {
+ autoplay : 0
+ },
+ type : 'iframe',
+ url : '//www.twitvid.com/embed.php?guid=$1'
+ },
+ twitpic : {
+ matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i,
+ type : 'image',
+ url : '//twitpic.com/show/full/$1/'
+ },
+ instagram : {
+ matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
+ type : 'image',
+ url : '//$1/p/$2/media/?size=l'
+ },
+ google_maps : {
+ matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i,
+ type : 'iframe',
+ url : function( rez ) {
+ return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed');
+ }
+ }
+ },
+
+ beforeLoad : function(opts, obj) {
+ var url = obj.href || '',
+ type = false,
+ what,
+ item,
+ rez,
+ params;
+
+ for (what in opts) {
+ if (opts.hasOwnProperty(what)) {
+ item = opts[ what ];
+ rez = url.match( item.matcher );
+
+ if (rez) {
+ type = item.type;
+ params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null));
+
+ url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params );
+
+ break;
+ }
+ }
+ }
+
+ if (type) {
+ obj.href = url;
+ obj.type = type;
+
+ obj.autoHeight = false;
+ }
+ }
+ };
+
+}(jQuery));
\ No newline at end of file
diff --git a/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-thumbs.css b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-thumbs.css
new file mode 100644
index 0000000..63d2943
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-thumbs.css
@@ -0,0 +1,55 @@
+#fancybox-thumbs {
+ position: fixed;
+ left: 0;
+ width: 100%;
+ overflow: hidden;
+ z-index: 8050;
+}
+
+#fancybox-thumbs.bottom {
+ bottom: 2px;
+}
+
+#fancybox-thumbs.top {
+ top: 2px;
+}
+
+#fancybox-thumbs ul {
+ position: relative;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+#fancybox-thumbs ul li {
+ float: left;
+ padding: 1px;
+ opacity: 0.5;
+}
+
+#fancybox-thumbs ul li.active {
+ opacity: 0.75;
+ padding: 0;
+ border: 1px solid #fff;
+}
+
+#fancybox-thumbs ul li:hover {
+ opacity: 1;
+}
+
+#fancybox-thumbs ul li a {
+ display: block;
+ position: relative;
+ overflow: hidden;
+ border: 1px solid #222;
+ background: #111;
+ outline: none;
+}
+
+#fancybox-thumbs ul li img {
+ display: block;
+ position: relative;
+ border: 0;
+ padding: 0;
+ max-width: none;
+}
\ No newline at end of file
diff --git a/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-thumbs.js b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-thumbs.js
new file mode 100644
index 0000000..58c9719
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/helpers/jquery.fancybox-thumbs.js
@@ -0,0 +1,165 @@
+ /*!
+ * Thumbnail helper for fancyBox
+ * version: 1.0.7 (Mon, 01 Oct 2012)
+ * @requires fancyBox v2.0 or later
+ *
+ * Usage:
+ * $(".fancybox").fancybox({
+ * helpers : {
+ * thumbs: {
+ * width : 50,
+ * height : 50
+ * }
+ * }
+ * });
+ *
+ */
+;(function ($) {
+ //Shortcut for fancyBox object
+ var F = $.fancybox;
+
+ //Add helper object
+ F.helpers.thumbs = {
+ defaults : {
+ width : 50, // thumbnail width
+ height : 50, // thumbnail height
+ position : 'bottom', // 'top' or 'bottom'
+ source : function ( item ) { // function to obtain the URL of the thumbnail image
+ var href;
+
+ if (item.element) {
+ href = $(item.element).find('img').attr('src');
+ }
+
+ if (!href && item.type === 'image' && item.href) {
+ href = item.href;
+ }
+
+ return href;
+ }
+ },
+
+ wrap : null,
+ list : null,
+ width : 0,
+
+ init: function (opts, obj) {
+ var that = this,
+ list,
+ thumbWidth = opts.width,
+ thumbHeight = opts.height,
+ thumbSource = opts.source;
+
+ //Build list structure
+ list = '';
+
+ for (var n = 0; n < obj.group.length; n++) {
+ list += '<li><a style="width:' + thumbWidth + 'px;height:' + thumbHeight + 'px;" href="javascript:jQuery.fancybox.jumpto(' + n + ');"></a></li>';
+ }
+
+ this.wrap = $('<div id="fancybox-thumbs"></div>').addClass(opts.position).appendTo('body');
+ this.list = $('<ul>' + list + '</ul>').appendTo(this.wrap);
+
+ //Load each thumbnail
+ $.each(obj.group, function (i) {
+ var el = obj.group[ i ],
+ href = thumbSource( el );
+
+ if (!href) {
+ return;
+ }
+
+ $("<img />").load(function () {
+ var width = this.width,
+ height = this.height,
+ widthRatio, heightRatio, parent;
+
+ if (!that.list || !width || !height) {
+ return;
+ }
+
+ //Calculate thumbnail width/height and center it
+ widthRatio = width / thumbWidth;
+ heightRatio = height / thumbHeight;
+
+ parent = that.list.children().eq(i).find('a');
+
+ if (widthRatio >= 1 && heightRatio >= 1) {
+ if (widthRatio > heightRatio) {
+ width = Math.floor(width / heightRatio);
+ height = thumbHeight;
+
+ } else {
+ width = thumbWidth;
+ height = Math.floor(height / widthRatio);
+ }
+ }
+
+ $(this).css({
+ width : width,
+ height : height,
+ top : Math.floor(thumbHeight / 2 - height / 2),
+ left : Math.floor(thumbWidth / 2 - width / 2)
+ });
+
+ parent.width(thumbWidth).height(thumbHeight);
+
+ $(this).hide().appendTo(parent).fadeIn(300);
+
+ })
+ .attr('src', href)
+ .attr('title', el.title);
+ });
+
+ //Set initial width
+ this.width = this.list.children().eq(0).outerWidth(true);
+
+ this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)));
+ },
+
+ beforeLoad: function (opts, obj) {
+ //Remove self if gallery do not have at least two items
+ if (obj.group.length < 2) {
+ obj.helpers.thumbs = false;
+
+ return;
+ }
+
+ //Increase bottom margin to give space for thumbs
+ obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15);
+ },
+
+ afterShow: function (opts, obj) {
+ //Check if exists and create or update list
+ if (this.list) {
+ this.onUpdate(opts, obj);
+
+ } else {
+ this.init(opts, obj);
+ }
+
+ //Set active element
+ this.list.children().removeClass('active').eq(obj.index).addClass('active');
+ },
+
+ //Center list
+ onUpdate: function (opts, obj) {
+ if (this.list) {
+ this.list.stop(true).animate({
+ 'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))
+ }, 150);
+ }
+ },
+
+ beforeClose: function () {
+ if (this.wrap) {
+ this.wrap.remove();
+ }
+
+ this.wrap = null;
+ this.list = null;
+ this.width = 0;
+ }
+ }
+
+}(jQuery));
\ No newline at end of file
diff --git a/themes/bootstrap-blog/source/fancybox/jquery.fancybox.css b/themes/bootstrap-blog/source/fancybox/jquery.fancybox.css
new file mode 100644
index 0000000..c75d051
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/jquery.fancybox.css
@@ -0,0 +1,273 @@
+/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
+.fancybox-wrap,
+.fancybox-skin,
+.fancybox-outer,
+.fancybox-inner,
+.fancybox-image,
+.fancybox-wrap iframe,
+.fancybox-wrap object,
+.fancybox-nav,
+.fancybox-nav span,
+.fancybox-tmp
+{
+ padding: 0;
+ margin: 0;
+ border: 0;
+ outline: none;
+ vertical-align: top;
+}
+
+.fancybox-wrap {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 8020;
+}
+
+.fancybox-skin {
+ position: relative;
+ background: #f9f9f9;
+ color: #444;
+ text-shadow: none;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.fancybox-opened {
+ z-index: 8030;
+}
+
+.fancybox-opened .fancybox-skin {
+ -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
+ -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
+}
+
+.fancybox-outer, .fancybox-inner {
+ position: relative;
+}
+
+.fancybox-inner {
+ overflow: hidden;
+}
+
+.fancybox-type-iframe .fancybox-inner {
+ -webkit-overflow-scrolling: touch;
+}
+
+.fancybox-error {
+ color: #444;
+ font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
+ margin: 0;
+ padding: 15px;
+ white-space: nowrap;
+}
+
+.fancybox-image, .fancybox-iframe {
+ display: block;
+ width: 100%;
+ height: 100%;
+}
+
+.fancybox-image {
+ max-width: 100%;
+ max-height: 100%;
+}
+
+#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
+ background-image: url(fancybox_sprite.png);
+}
+
+#fancybox-loading {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ margin-top: -22px;
+ margin-left: -22px;
+ background-position: 0 -108px;
+ opacity: 0.8;
+ cursor: pointer;
+ z-index: 8060;
+}
+
+#fancybox-loading div {
+ width: 44px;
+ height: 44px;
+ background: url(fancybox_loading.gif) center center no-repeat;
+}
+
+.fancybox-close {
+ position: absolute;
+ top: -18px;
+ right: -18px;
+ width: 36px;
+ height: 36px;
+ cursor: pointer;
+ z-index: 8040;
+}
+
+.fancybox-nav {
+ position: absolute;
+ top: 0;
+ width: 40%;
+ height: 100%;
+ cursor: pointer;
+ text-decoration: none;
+ background: transparent url(blank.gif); /* helps IE */
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
+ z-index: 8040;
+}
+
+.fancybox-prev {
+ left: 0;
+}
+
+.fancybox-next {
+ right: 0;
+}
+
+.fancybox-nav span {
+ position: absolute;
+ top: 50%;
+ width: 36px;
+ height: 34px;
+ margin-top: -18px;
+ cursor: pointer;
+ z-index: 8040;
+ visibility: hidden;
+}
+
+.fancybox-prev span {
+ left: 10px;
+ background-position: 0 -36px;
+}
+
+.fancybox-next span {
+ right: 10px;
+ background-position: 0 -72px;
+}
+
+.fancybox-nav:hover span {
+ visibility: visible;
+}
+
+.fancybox-tmp {
+ position: absolute;
+ top: -99999px;
+ left: -99999px;
+ max-width: 99999px;
+ max-height: 99999px;
+ overflow: visible !important;
+}
+
+/* Overlay helper */
+
+.fancybox-lock {
+ overflow: visible !important;
+ width: auto;
+}
+
+.fancybox-lock body {
+ overflow: hidden !important;
+}
+
+.fancybox-lock-test {
+ overflow-y: hidden !important;
+}
+
+.fancybox-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ overflow: hidden;
+ display: none;
+ z-index: 8010;
+ background: url(fancybox_overlay.png);
+}
+
+.fancybox-overlay-fixed {
+ position: fixed;
+ bottom: 0;
+ right: 0;
+}
+
+.fancybox-lock .fancybox-overlay {
+ overflow: auto;
+ overflow-y: scroll;
+}
+
+/* Title helper */
+
+.fancybox-title {
+ visibility: hidden;
+ font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
+ position: relative;
+ text-shadow: none;
+ z-index: 8050;
+}
+
+.fancybox-opened .fancybox-title {
+ visibility: visible;
+}
+
+.fancybox-title-float-wrap {
+ position: absolute;
+ bottom: 0;
+ right: 50%;
+ margin-bottom: -35px;
+ z-index: 8050;
+ text-align: center;
+}
+
+.fancybox-title-float-wrap .child {
+ display: inline-block;
+ margin-right: -100%;
+ padding: 2px 20px;
+ background: transparent; /* Fallback for web browsers that doesn't support RGBa */
+ background: rgba(0, 0, 0, 0.8);
+ -webkit-border-radius: 15px;
+ -moz-border-radius: 15px;
+ border-radius: 15px;
+ text-shadow: 0 1px 2px #222;
+ color: #FFF;
+ font-weight: bold;
+ line-height: 24px;
+ white-space: nowrap;
+}
+
+.fancybox-title-outside-wrap {
+ position: relative;
+ margin-top: 10px;
+ color: #fff;
+}
+
+.fancybox-title-inside-wrap {
+ padding-top: 10px;
+}
+
+.fancybox-title-over-wrap {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ color: #fff;
+ padding: 10px;
+ background: #000;
+ background: rgba(0, 0, 0, .8);
+}
+
+/*Retina graphics!*/
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
+ only screen and (min--moz-device-pixel-ratio: 1.5),
+ only screen and (min-device-pixel-ratio: 1.5){
+
+ #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
+ background-image: url(fancybox_sprite@2x.png);
+ background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/
+ }
+
+ #fancybox-loading div {
+ background-image: url(fancybox_loading@2x.gif);
+ background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/
+ }
+}
\ No newline at end of file
diff --git a/themes/bootstrap-blog/source/fancybox/jquery.fancybox.js b/themes/bootstrap-blog/source/fancybox/jquery.fancybox.js
new file mode 100644
index 0000000..7a0f8ac
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/jquery.fancybox.js
@@ -0,0 +1,2017 @@
+/*!
+ * fancyBox - jQuery Plugin
+ * version: 2.1.5 (Fri, 14 Jun 2013)
+ * requires jQuery v1.6 or later
+ *
+ * Examples at http://fancyapps.com/fancybox/
+ * License: www.fancyapps.com/fancybox/#license
+ *
+ * Copyright 2012 Janis Skarnelis - janis@fancyapps.com
+ *
+ */
+
+;(function (window, document, $, undefined) {
+ "use strict";
+
+ var H = $("html"),
+ W = $(window),
+ D = $(document),
+ F = $.fancybox = function () {
+ F.open.apply( this, arguments );
+ },
+ IE = navigator.userAgent.match(/msie/i),
+ didUpdate = null,
+ isTouch = document.createTouch !== undefined,
+
+ isQuery = function(obj) {
+ return obj && obj.hasOwnProperty && obj instanceof $;
+ },
+ isString = function(str) {
+ return str && $.type(str) === "string";
+ },
+ isPercentage = function(str) {
+ return isString(str) && str.indexOf('%') > 0;
+ },
+ isScrollable = function(el) {
+ return (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight)));
+ },
+ getScalar = function(orig, dim) {
+ var value = parseInt(orig, 10) || 0;
+
+ if (dim && isPercentage(orig)) {
+ value = F.getViewport()[ dim ] / 100 * value;
+ }
+
+ return Math.ceil(value);
+ },
+ getValue = function(value, dim) {
+ return getScalar(value, dim) + 'px';
+ };
+
+ $.extend(F, {
+ // The current version of fancyBox
+ version: '2.1.5',
+
+ defaults: {
+ padding : 15,
+ margin : 20,
+
+ width : 800,
+ height : 600,
+ minWidth : 100,
+ minHeight : 100,
+ maxWidth : 9999,
+ maxHeight : 9999,
+ pixelRatio: 1, // Set to 2 for retina display support
+
+ autoSize : true,
+ autoHeight : false,
+ autoWidth : false,
+
+ autoResize : true,
+ autoCenter : !isTouch,
+ fitToView : true,
+ aspectRatio : false,
+ topRatio : 0.5,
+ leftRatio : 0.5,
+
+ scrolling : 'auto', // 'auto', 'yes' or 'no'
+ wrapCSS : '',
+
+ arrows : true,
+ closeBtn : true,
+ closeClick : false,
+ nextClick : false,
+ mouseWheel : true,
+ autoPlay : false,
+ playSpeed : 3000,
+ preload : 3,
+ modal : false,
+ loop : true,
+
+ ajax : {
+ dataType : 'html',
+ headers : { 'X-fancyBox': true }
+ },
+ iframe : {
+ scrolling : 'auto',
+ preload : true
+ },
+ swf : {
+ wmode: 'transparent',
+ allowfullscreen : 'true',
+ allowscriptaccess : 'always'
+ },
+
+ keys : {
+ next : {
+ 13 : 'left', // enter
+ 34 : 'up', // page down
+ 39 : 'left', // right arrow
+ 40 : 'up' // down arrow
+ },
+ prev : {
+ 8 : 'right', // backspace
+ 33 : 'down', // page up
+ 37 : 'right', // left arrow
+ 38 : 'down' // up arrow
+ },
+ close : [27], // escape key
+ play : [32], // space - start/stop slideshow
+ toggle : [70] // letter "f" - toggle fullscreen
+ },
+
+ direction : {
+ next : 'left',
+ prev : 'right'
+ },
+
+ scrollOutside : true,
+
+ // Override some properties
+ index : 0,
+ type : null,
+ href : null,
+ content : null,
+ title : null,
+
+ // HTML templates
+ tpl: {
+ wrap : '<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',
+ image : '<img class="fancybox-image" src="{href}" alt="" />',
+ iframe : '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen' + (IE ? ' allowtransparency="true"' : '') + '></iframe>',
+ error : '<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',
+ closeBtn : '<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>',
+ next : '<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',
+ prev : '<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'
+ },
+
+ // Properties for each animation type
+ // Opening fancyBox
+ openEffect : 'fade', // 'elastic', 'fade' or 'none'
+ openSpeed : 250,
+ openEasing : 'swing',
+ openOpacity : true,
+ openMethod : 'zoomIn',
+
+ // Closing fancyBox
+ closeEffect : 'fade', // 'elastic', 'fade' or 'none'
+ closeSpeed : 250,
+ closeEasing : 'swing',
+ closeOpacity : true,
+ closeMethod : 'zoomOut',
+
+ // Changing next gallery item
+ nextEffect : 'elastic', // 'elastic', 'fade' or 'none'
+ nextSpeed : 250,
+ nextEasing : 'swing',
+ nextMethod : 'changeIn',
+
+ // Changing previous gallery item
+ prevEffect : 'elastic', // 'elastic', 'fade' or 'none'
+ prevSpeed : 250,
+ prevEasing : 'swing',
+ prevMethod : 'changeOut',
+
+ // Enable default helpers
+ helpers : {
+ overlay : true,
+ title : true
+ },
+
+ // Callbacks
+ onCancel : $.noop, // If canceling
+ beforeLoad : $.noop, // Before loading
+ afterLoad : $.noop, // After loading
+ beforeShow : $.noop, // Before changing in current item
+ afterShow : $.noop, // After opening
+ beforeChange : $.noop, // Before changing gallery item
+ beforeClose : $.noop, // Before closing
+ afterClose : $.noop // After closing
+ },
+
+ //Current state
+ group : {}, // Selected group
+ opts : {}, // Group options
+ previous : null, // Previous element
+ coming : null, // Element being loaded
+ current : null, // Currently loaded element
+ isActive : false, // Is activated
+ isOpen : false, // Is currently open
+ isOpened : false, // Have been fully opened at least once
+
+ wrap : null,
+ skin : null,
+ outer : null,
+ inner : null,
+
+ player : {
+ timer : null,
+ isActive : false
+ },
+
+ // Loaders
+ ajaxLoad : null,
+ imgPreload : null,
+
+ // Some collections
+ transitions : {},
+ helpers : {},
+
+ /*
+ * Static methods
+ */
+
+ open: function (group, opts) {
+ if (!group) {
+ return;
+ }
+
+ if (!$.isPlainObject(opts)) {
+ opts = {};
+ }
+
+ // Close if already active
+ if (false === F.close(true)) {
+ return;
+ }
+
+ // Normalize group
+ if (!$.isArray(group)) {
+ group = isQuery(group) ? $(group).get() : [group];
+ }
+
+ // Recheck if the type of each element is `object` and set content type (image, ajax, etc)
+ $.each(group, function(i, element) {
+ var obj = {},
+ href,
+ title,
+ content,
+ type,
+ rez,
+ hrefParts,
+ selector;
+
+ if ($.type(element) === "object") {
+ // Check if is DOM element
+ if (element.nodeType) {
+ element = $(element);
+ }
+
+ if (isQuery(element)) {
+ obj = {
+ href : element.data('fancybox-href') || element.attr('href'),
+ title : $('<div/>').text( element.data('fancybox-title') || element.attr('title') ).html(),
+ isDom : true,
+ element : element
+ };
+
+ if ($.metadata) {
+ $.extend(true, obj, element.metadata());
+ }
+
+ } else {
+ obj = element;
+ }
+ }
+
+ href = opts.href || obj.href || (isString(element) ? element : null);
+ title = opts.title !== undefined ? opts.title : obj.title || '';
+
+ content = opts.content || obj.content;
+ type = content ? 'html' : (opts.type || obj.type);
+
+ if (!type && obj.isDom) {
+ type = element.data('fancybox-type');
+
+ if (!type) {
+ rez = element.prop('class').match(/fancybox\.(\w+)/);
+ type = rez ? rez[1] : null;
+ }
+ }
+
+ if (isString(href)) {
+ // Try to guess the content type
+ if (!type) {
+ if (F.isImage(href)) {
+ type = 'image';
+
+ } else if (F.isSWF(href)) {
+ type = 'swf';
+
+ } else if (href.charAt(0) === '#') {
+ type = 'inline';
+
+ } else if (isString(element)) {
+ type = 'html';
+ content = element;
+ }
+ }
+
+ // Split url into two pieces with source url and content selector, e.g,
+ // "/mypage.html #my_id" will load "/mypage.html" and display element having id "my_id"
+ if (type === 'ajax') {
+ hrefParts = href.split(/\s+/, 2);
+ href = hrefParts.shift();
+ selector = hrefParts.shift();
+ }
+ }
+
+ if (!content) {
+ if (type === 'inline') {
+ if (href) {
+ content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7
+
+ } else if (obj.isDom) {
+ content = element;
+ }
+
+ } else if (type === 'html') {
+ content = href;
+
+ } else if (!type && !href && obj.isDom) {
+ type = 'inline';
+ content = element;
+ }
+ }
+
+ $.extend(obj, {
+ href : href,
+ type : type,
+ content : content,
+ title : title,
+ selector : selector
+ });
+
+ group[ i ] = obj;
+ });
+
+ // Extend the defaults
+ F.opts = $.extend(true, {}, F.defaults, opts);
+
+ // All options are merged recursive except keys
+ if (opts.keys !== undefined) {
+ F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false;
+ }
+
+ F.group = group;
+
+ return F._start(F.opts.index);
+ },
+
+ // Cancel image loading or abort ajax request
+ cancel: function () {
+ var coming = F.coming;
+
+ if (coming && false === F.trigger('onCancel')) {
+ return;
+ }
+
+ F.hideLoading();
+
+ if (!coming) {
+ return;
+ }
+
+ if (F.ajaxLoad) {
+ F.ajaxLoad.abort();
+ }
+
+ F.ajaxLoad = null;
+
+ if (F.imgPreload) {
+ F.imgPreload.onload = F.imgPreload.onerror = null;
+ }
+
+ if (coming.wrap) {
+ coming.wrap.stop(true, true).trigger('onReset').remove();
+ }
+
+ F.coming = null;
+
+ // If the first item has been canceled, then clear everything
+ if (!F.current) {
+ F._afterZoomOut( coming );
+ }
+ },
+
+ // Start closing animation if is open; remove immediately if opening/closing
+ close: function (event) {
+ F.cancel();
+
+ if (false === F.trigger('beforeClose')) {
+ return;
+ }
+
+ F.unbindEvents();
+
+ if (!F.isActive) {
+ return;
+ }
+
+ if (!F.isOpen || event === true) {
+ $('.fancybox-wrap').stop(true).trigger('onReset').remove();
+
+ F._afterZoomOut();
+
+ } else {
+ F.isOpen = F.isOpened = false;
+ F.isClosing = true;
+
+ $('.fancybox-item, .fancybox-nav').remove();
+
+ F.wrap.stop(true, true).removeClass('fancybox-opened');
+
+ F.transitions[ F.current.closeMethod ]();
+ }
+ },
+
+ // Manage slideshow:
+ // $.fancybox.play(); - toggle slideshow
+ // $.fancybox.play( true ); - start
+ // $.fancybox.play( false ); - stop
+ play: function ( action ) {
+ var clear = function () {
+ clearTimeout(F.player.timer);
+ },
+ set = function () {
+ clear();
+
+ if (F.current && F.player.isActive) {
+ F.player.timer = setTimeout(F.next, F.current.playSpeed);
+ }
+ },
+ stop = function () {
+ clear();
+
+ D.unbind('.player');
+
+ F.player.isActive = false;
+
+ F.trigger('onPlayEnd');
+ },
+ start = function () {
+ if (F.current && (F.current.loop || F.current.index < F.group.length - 1)) {
+ F.player.isActive = true;
+
+ D.bind({
+ 'onCancel.player beforeClose.player' : stop,
+ 'onUpdate.player' : set,
+ 'beforeLoad.player' : clear
+ });
+
+ set();
+
+ F.trigger('onPlayStart');
+ }
+ };
+
+ if (action === true || (!F.player.isActive && action !== false)) {
+ start();
+ } else {
+ stop();
+ }
+ },
+
+ // Navigate to next gallery item
+ next: function ( direction ) {
+ var current = F.current;
+
+ if (current) {
+ if (!isString(direction)) {
+ direction = current.direction.next;
+ }
+
+ F.jumpto(current.index + 1, direction, 'next');
+ }
+ },
+
+ // Navigate to previous gallery item
+ prev: function ( direction ) {
+ var current = F.current;
+
+ if (current) {
+ if (!isString(direction)) {
+ direction = current.direction.prev;
+ }
+
+ F.jumpto(current.index - 1, direction, 'prev');
+ }
+ },
+
+ // Navigate to gallery item by index
+ jumpto: function ( index, direction, router ) {
+ var current = F.current;
+
+ if (!current) {
+ return;
+ }
+
+ index = getScalar(index);
+
+ F.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ];
+ F.router = router || 'jumpto';
+
+ if (current.loop) {
+ if (index < 0) {
+ index = current.group.length + (index % current.group.length);
+ }
+
+ index = index % current.group.length;
+ }
+
+ if (current.group[ index ] !== undefined) {
+ F.cancel();
+
+ F._start(index);
+ }
+ },
+
+ // Center inside viewport and toggle position type to fixed or absolute if needed
+ reposition: function (e, onlyAbsolute) {
+ var current = F.current,
+ wrap = current ? current.wrap : null,
+ pos;
+
+ if (wrap) {
+ pos = F._getPosition(onlyAbsolute);
+
+ if (e && e.type === 'scroll') {
+ delete pos.position;
+
+ wrap.stop(true, true).animate(pos, 200);
+
+ } else {
+ wrap.css(pos);
+
+ current.pos = $.extend({}, current.dim, pos);
+ }
+ }
+ },
+
+ update: function (e) {
+ var type = (e && e.originalEvent && e.originalEvent.type),
+ anyway = !type || type === 'orientationchange';
+
+ if (anyway) {
+ clearTimeout(didUpdate);
+
+ didUpdate = null;
+ }
+
+ if (!F.isOpen || didUpdate) {
+ return;
+ }
+
+ didUpdate = setTimeout(function() {
+ var current = F.current;
+
+ if (!current || F.isClosing) {
+ return;
+ }
+
+ F.wrap.removeClass('fancybox-tmp');
+
+ if (anyway || type === 'load' || (type === 'resize' && current.autoResize)) {
+ F._setDimension();
+ }
+
+ if (!(type === 'scroll' && current.canShrink)) {
+ F.reposition(e);
+ }
+
+ F.trigger('onUpdate');
+
+ didUpdate = null;
+
+ }, (anyway && !isTouch ? 0 : 300));
+ },
+
+ // Shrink content to fit inside viewport or restore if resized
+ toggle: function ( action ) {
+ if (F.isOpen) {
+ F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView;
+
+ // Help browser to restore document dimensions
+ if (isTouch) {
+ F.wrap.removeAttr('style').addClass('fancybox-tmp');
+
+ F.trigger('onUpdate');
+ }
+
+ F.update();
+ }
+ },
+
+ hideLoading: function () {
+ D.unbind('.loading');
+
+ $('#fancybox-loading').remove();
+ },
+
+ showLoading: function () {
+ var el, viewport;
+
+ F.hideLoading();
+
+ el = $('<div id="fancybox-loading"><div></div></div>').click(F.cancel).appendTo('body');
+
+ // If user will press the escape-button, the request will be canceled
+ D.bind('keydown.loading', function(e) {
+ if ((e.which || e.keyCode) === 27) {
+ e.preventDefault();
+
+ F.cancel();
+ }
+ });
+
+ if (!F.defaults.fixed) {
+ viewport = F.getViewport();
+
+ el.css({
+ position : 'absolute',
+ top : (viewport.h * 0.5) + viewport.y,
+ left : (viewport.w * 0.5) + viewport.x
+ });
+ }
+
+ F.trigger('onLoading');
+ },
+
+ getViewport: function () {
+ var locked = (F.current && F.current.locked) || false,
+ rez = {
+ x: W.scrollLeft(),
+ y: W.scrollTop()
+ };
+
+ if (locked && locked.length) {
+ rez.w = locked[0].clientWidth;
+ rez.h = locked[0].clientHeight;
+
+ } else {
+ // See http://bugs.jquery.com/ticket/6724
+ rez.w = isTouch && window.innerWidth ? window.innerWidth : W.width();
+ rez.h = isTouch && window.innerHeight ? window.innerHeight : W.height();
+ }
+
+ return rez;
+ },
+
+ // Unbind the keyboard / clicking actions
+ unbindEvents: function () {
+ if (F.wrap && isQuery(F.wrap)) {
+ F.wrap.unbind('.fb');
+ }
+
+ D.unbind('.fb');
+ W.unbind('.fb');
+ },
+
+ bindEvents: function () {
+ var current = F.current,
+ keys;
+
+ if (!current) {
+ return;
+ }
+
+ // Changing document height on iOS devices triggers a 'resize' event,
+ // that can change document height... repeating infinitely
+ W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update);
+
+ keys = current.keys;
+
+ if (keys) {
+ D.bind('keydown.fb', function (e) {
+ var code = e.which || e.keyCode,
+ target = e.target || e.srcElement;
+
+ // Skip esc key if loading, because showLoading will cancel preloading
+ if (code === 27 && F.coming) {
+ return false;
+ }
+
+ // Ignore key combinations and key events within form elements
+ if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) {
+ $.each(keys, function(i, val) {
+ if (current.group.length > 1 && val[ code ] !== undefined) {
+ F[ i ]( val[ code ] );
+
+ e.preventDefault();
+ return false;
+ }
+
+ if ($.inArray(code, val) > -1) {
+ F[ i ] ();
+
+ e.preventDefault();
+ return false;
+ }
+ });
+ }
+ });
+ }
+
+ if ($.fn.mousewheel && current.mouseWheel) {
+ F.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) {
+ var target = e.target || null,
+ parent = $(target),
+ canScroll = false;
+
+ while (parent.length) {
+ if (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) {
+ break;
+ }
+
+ canScroll = isScrollable( parent[0] );
+ parent = $(parent).parent();
+ }
+
+ if (delta !== 0 && !canScroll) {
+ if (F.group.length > 1 && !current.canShrink) {
+ if (deltaY > 0 || deltaX > 0) {
+ F.prev( deltaY > 0 ? 'down' : 'left' );
+
+ } else if (deltaY < 0 || deltaX < 0) {
+ F.next( deltaY < 0 ? 'up' : 'right' );
+ }
+
+ e.preventDefault();
+ }
+ }
+ });
+ }
+ },
+
+ trigger: function (event, o) {
+ var ret, obj = o || F.coming || F.current;
+
+ if (obj) {
+ if ($.isFunction( obj[event] )) {
+ ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1));
+ }
+
+ if (ret === false) {
+ return false;
+ }
+
+ if (obj.helpers) {
+ $.each(obj.helpers, function (helper, opts) {
+ if (opts && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) {
+ F.helpers[helper][event]($.extend(true, {}, F.helpers[helper].defaults, opts), obj);
+ }
+ });
+ }
+ }
+
+ D.trigger(event);
+ },
+
+ isImage: function (str) {
+ return isString(str) && str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i);
+ },
+
+ isSWF: function (str) {
+ return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i);
+ },
+
+ _start: function (index) {
+ var coming = {},
+ obj,
+ href,
+ type,
+ margin,
+ padding;
+
+ index = getScalar( index );
+ obj = F.group[ index ] || null;
+
+ if (!obj) {
+ return false;
+ }
+
+ coming = $.extend(true, {}, F.opts, obj);
+
+ // Convert margin and padding properties to array - top, right, bottom, left
+ margin = coming.margin;
+ padding = coming.padding;
+
+ if ($.type(margin) === 'number') {
+ coming.margin = [margin, margin, margin, margin];
+ }
+
+ if ($.type(padding) === 'number') {
+ coming.padding = [padding, padding, padding, padding];
+ }
+
+ // 'modal' propery is just a shortcut
+ if (coming.modal) {
+ $.extend(true, coming, {
+ closeBtn : false,
+ closeClick : false,
+ nextClick : false,
+ arrows : false,
+ mouseWheel : false,
+ keys : null,
+ helpers: {
+ overlay : {
+ closeClick : false
+ }
+ }
+ });
+ }
+
+ // 'autoSize' property is a shortcut, too
+ if (coming.autoSize) {
+ coming.autoWidth = coming.autoHeight = true;
+ }
+
+ if (coming.width === 'auto') {
+ coming.autoWidth = true;
+ }
+
+ if (coming.height === 'auto') {
+ coming.autoHeight = true;
+ }
+
+ /*
+ * Add reference to the group, so it`s possible to access from callbacks, example:
+ * afterLoad : function() {
+ * this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : '');
+ * }
+ */
+
+ coming.group = F.group;
+ coming.index = index;
+
+ // Give a chance for callback or helpers to update coming item (type, title, etc)
+ F.coming = coming;
+
+ if (false === F.trigger('beforeLoad')) {
+ F.coming = null;
+
+ return;
+ }
+
+ type = coming.type;
+ href = coming.href;
+
+ if (!type) {
+ F.coming = null;
+
+ //If we can not determine content type then drop silently or display next/prev item if looping through gallery
+ if (F.current && F.router && F.router !== 'jumpto') {
+ F.current.index = index;
+
+ return F[ F.router ]( F.direction );
+ }
+
+ return false;
+ }
+
+ F.isActive = true;
+
+ if (type === 'image' || type === 'swf') {
+ coming.autoHeight = coming.autoWidth = false;
+ coming.scrolling = 'visible';
+ }
+
+ if (type === 'image') {
+ coming.aspectRatio = true;
+ }
+
+ if (type === 'iframe' && isTouch) {
+ coming.scrolling = 'scroll';
+ }
+
+ // Build the neccessary markup
+ coming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' );
+
+ $.extend(coming, {
+ skin : $('.fancybox-skin', coming.wrap),
+ outer : $('.fancybox-outer', coming.wrap),
+ inner : $('.fancybox-inner', coming.wrap)
+ });
+
+ $.each(["Top", "Right", "Bottom", "Left"], function(i, v) {
+ coming.skin.css('padding' + v, getValue(coming.padding[ i ]));
+ });
+
+ F.trigger('onReady');
+
+ // Check before try to load; 'inline' and 'html' types need content, others - href
+ if (type === 'inline' || type === 'html') {
+ if (!coming.content || !coming.content.length) {
+ return F._error( 'content' );
+ }
+
+ } else if (!href) {
+ return F._error( 'href' );
+ }
+
+ if (type === 'image') {
+ F._loadImage();
+
+ } else if (type === 'ajax') {
+ F._loadAjax();
+
+ } else if (type === 'iframe') {
+ F._loadIframe();
+
+ } else {
+ F._afterLoad();
+ }
+ },
+
+ _error: function ( type ) {
+ $.extend(F.coming, {
+ type : 'html',
+ autoWidth : true,
+ autoHeight : true,
+ minWidth : 0,
+ minHeight : 0,
+ scrolling : 'no',
+ hasError : type,
+ content : F.coming.tpl.error
+ });
+
+ F._afterLoad();
+ },
+
+ _loadImage: function () {
+ // Reset preload image so it is later possible to check "complete" property
+ var img = F.imgPreload = new Image();
+
+ img.onload = function () {
+ this.onload = this.onerror = null;
+
+ F.coming.width = this.width / F.opts.pixelRatio;
+ F.coming.height = this.height / F.opts.pixelRatio;
+
+ F._afterLoad();
+ };
+
+ img.onerror = function () {
+ this.onload = this.onerror = null;
+
+ F._error( 'image' );
+ };
+
+ img.src = F.coming.href;
+
+ if (img.complete !== true) {
+ F.showLoading();
+ }
+ },
+
+ _loadAjax: function () {
+ var coming = F.coming;
+
+ F.showLoading();
+
+ F.ajaxLoad = $.ajax($.extend({}, coming.ajax, {
+ url: coming.href,
+ error: function (jqXHR, textStatus) {
+ if (F.coming && textStatus !== 'abort') {
+ F._error( 'ajax', jqXHR );
+
+ } else {
+ F.hideLoading();
+ }
+ },
+ success: function (data, textStatus) {
+ if (textStatus === 'success') {
+ coming.content = data;
+
+ F._afterLoad();
+ }
+ }
+ }));
+ },
+
+ _loadIframe: function() {
+ var coming = F.coming,
+ iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime()))
+ .attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling)
+ .attr('src', coming.href);
+
+ // This helps IE
+ $(coming.wrap).bind('onReset', function () {
+ try {
+ $(this).find('iframe').hide().attr('src', '//about:blank').end().empty();
+ } catch (e) {}
+ });
+
+ if (coming.iframe.preload) {
+ F.showLoading();
+
+ iframe.one('load', function() {
+ $(this).data('ready', 1);
+
+ // iOS will lose scrolling if we resize
+ if (!isTouch) {
+ $(this).bind('load.fb', F.update);
+ }
+
+ // Without this trick:
+ // - iframe won't scroll on iOS devices
+ // - IE7 sometimes displays empty iframe
+ $(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show();
+
+ F._afterLoad();
+ });
+ }
+
+ coming.content = iframe.appendTo( coming.inner );
+
+ if (!coming.iframe.preload) {
+ F._afterLoad();
+ }
+ },
+
+ _preloadImages: function() {
+ var group = F.group,
+ current = F.current,
+ len = group.length,
+ cnt = current.preload ? Math.min(current.preload, len - 1) : 0,
+ item,
+ i;
+
+ for (i = 1; i <= cnt; i += 1) {
+ item = group[ (current.index + i ) % len ];
+
+ if (item.type === 'image' && item.href) {
+ new Image().src = item.href;
+ }
+ }
+ },
+
+ _afterLoad: function () {
+ var coming = F.coming,
+ previous = F.current,
+ placeholder = 'fancybox-placeholder',
+ current,
+ content,
+ type,
+ scrolling,
+ href,
+ embed;
+
+ F.hideLoading();
+
+ if (!coming || F.isActive === false) {
+ return;
+ }
+
+ if (false === F.trigger('afterLoad', coming, previous)) {
+ coming.wrap.stop(true).trigger('onReset').remove();
+
+ F.coming = null;
+
+ return;
+ }
+
+ if (previous) {
+ F.trigger('beforeChange', previous);
+
+ previous.wrap.stop(true).removeClass('fancybox-opened')
+ .find('.fancybox-item, .fancybox-nav')
+ .remove();
+ }
+
+ F.unbindEvents();
+
+ current = coming;
+ content = coming.content;
+ type = coming.type;
+ scrolling = coming.scrolling;
+
+ $.extend(F, {
+ wrap : current.wrap,
+ skin : current.skin,
+ outer : current.outer,
+ inner : current.inner,
+ current : current,
+ previous : previous
+ });
+
+ href = current.href;
+
+ switch (type) {
+ case 'inline':
+ case 'ajax':
+ case 'html':
+ if (current.selector) {
+ content = $('<div>').html(content).find(current.selector);
+
+ } else if (isQuery(content)) {
+ if (!content.data(placeholder)) {
+ content.data(placeholder, $('<div class="' + placeholder + '"></div>').insertAfter( content ).hide() );
+ }
+
+ content = content.show().detach();
+
+ current.wrap.bind('onReset', function () {
+ if ($(this).find(content).length) {
+ content.hide().replaceAll( content.data(placeholder) ).data(placeholder, false);
+ }
+ });
+ }
+ break;
+
+ case 'image':
+ content = current.tpl.image.replace(/\{href\}/g, href);
+ break;
+
+ case 'swf':
+ content = '<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="' + href + '"></param>';
+ embed = '';
+
+ $.each(current.swf, function(name, val) {
+ content += '<param name="' + name + '" value="' + val + '"></param>';
+ embed += ' ' + name + '="' + val + '"';
+ });
+
+ content += '<embed src="' + href + '" type="application/x-shockwave-flash" width="100%" height="100%"' + embed + '></embed></object>';
+ break;
+ }
+
+ if (!(isQuery(content) && content.parent().is(current.inner))) {
+ current.inner.append( content );
+ }
+
+ // Give a chance for helpers or callbacks to update elements
+ F.trigger('beforeShow');
+
+ // Set scrolling before calculating dimensions
+ current.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling));
+
+ // Set initial dimensions and start position
+ F._setDimension();
+
+ F.reposition();
+
+ F.isOpen = false;
+ F.coming = null;
+
+ F.bindEvents();
+
+ if (!F.isOpened) {
+ $('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove();
+
+ } else if (previous.prevMethod) {
+ F.transitions[ previous.prevMethod ]();
+ }
+
+ F.transitions[ F.isOpened ? current.nextMethod : current.openMethod ]();
+
+ F._preloadImages();
+ },
+
+ _setDimension: function () {
+ var viewport = F.getViewport(),
+ steps = 0,
+ canShrink = false,
+ canExpand = false,
+ wrap = F.wrap,
+ skin = F.skin,
+ inner = F.inner,
+ current = F.current,
+ width = current.width,
+ height = current.height,
+ minWidth = current.minWidth,
+ minHeight = current.minHeight,
+ maxWidth = current.maxWidth,
+ maxHeight = current.maxHeight,
+ scrolling = current.scrolling,
+ scrollOut = current.scrollOutside ? current.scrollbarWidth : 0,
+ margin = current.margin,
+ wMargin = getScalar(margin[1] + margin[3]),
+ hMargin = getScalar(margin[0] + margin[2]),
+ wPadding,
+ hPadding,
+ wSpace,
+ hSpace,
+ origWidth,
+ origHeight,
+ origMaxWidth,
+ origMaxHeight,
+ ratio,
+ width_,
+ height_,
+ maxWidth_,
+ maxHeight_,
+ iframe,
+ body;
+
+ // Reset dimensions so we could re-check actual size
+ wrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp');
+
+ wPadding = getScalar(skin.outerWidth(true) - skin.width());
+ hPadding = getScalar(skin.outerHeight(true) - skin.height());
+
+ // Any space between content and viewport (margin, padding, border, title)
+ wSpace = wMargin + wPadding;
+ hSpace = hMargin + hPadding;
+
+ origWidth = isPercentage(width) ? (viewport.w - wSpace) * getScalar(width) / 100 : width;
+ origHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height;
+
+ if (current.type === 'iframe') {
+ iframe = current.content;
+
+ if (current.autoHeight && iframe.data('ready') === 1) {
+ try {
+ if (iframe[0].contentWindow.document.location) {
+ inner.width( origWidth ).height(9999);
+
+ body = iframe.contents().find('body');
+
+ if (scrollOut) {
+ body.css('overflow-x', 'hidden');
+ }
+
+ origHeight = body.outerHeight(true);
+ }
+
+ } catch (e) {}
+ }
+
+ } else if (current.autoWidth || current.autoHeight) {
+ inner.addClass( 'fancybox-tmp' );
+
+ // Set width or height in case we need to calculate only one dimension
+ if (!current.autoWidth) {
+ inner.width( origWidth );
+ }
+
+ if (!current.autoHeight) {
+ inner.height( origHeight );
+ }
+
+ if (current.autoWidth) {
+ origWidth = inner.width();
+ }
+
+ if (current.autoHeight) {
+ origHeight = inner.height();
+ }
+
+ inner.removeClass( 'fancybox-tmp' );
+ }
+
+ width = getScalar( origWidth );
+ height = getScalar( origHeight );
+
+ ratio = origWidth / origHeight;
+
+ // Calculations for the content
+ minWidth = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth);
+ maxWidth = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth);
+
+ minHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight);
+ maxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight);
+
+ // These will be used to determine if wrap can fit in the viewport
+ origMaxWidth = maxWidth;
+ origMaxHeight = maxHeight;
+
+ if (current.fitToView) {
+ maxWidth = Math.min(viewport.w - wSpace, maxWidth);
+ maxHeight = Math.min(viewport.h - hSpace, maxHeight);
+ }
+
+ maxWidth_ = viewport.w - wMargin;
+ maxHeight_ = viewport.h - hMargin;
+
+ if (current.aspectRatio) {
+ if (width > maxWidth) {
+ width = maxWidth;
+ height = getScalar(width / ratio);
+ }
+
+ if (height > maxHeight) {
+ height = maxHeight;
+ width = getScalar(height * ratio);
+ }
+
+ if (width < minWidth) {
+ width = minWidth;
+ height = getScalar(width / ratio);
+ }
+
+ if (height < minHeight) {
+ height = minHeight;
+ width = getScalar(height * ratio);
+ }
+
+ } else {
+ width = Math.max(minWidth, Math.min(width, maxWidth));
+
+ if (current.autoHeight && current.type !== 'iframe') {
+ inner.width( width );
+
+ height = inner.height();
+ }
+
+ height = Math.max(minHeight, Math.min(height, maxHeight));
+ }
+
+ // Try to fit inside viewport (including the title)
+ if (current.fitToView) {
+ inner.width( width ).height( height );
+
+ wrap.width( width + wPadding );
+
+ // Real wrap dimensions
+ width_ = wrap.width();
+ height_ = wrap.height();
+
+ if (current.aspectRatio) {
+ while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) {
+ if (steps++ > 19) {
+ break;
+ }
+
+ height = Math.max(minHeight, Math.min(maxHeight, height - 10));
+ width = getScalar(height * ratio);
+
+ if (width < minWidth) {
+ width = minWidth;
+ height = getScalar(width / ratio);
+ }
+
+ if (width > maxWidth) {
+ width = maxWidth;
+ height = getScalar(width / ratio);
+ }
+
+ inner.width( width ).height( height );
+
+ wrap.width( width + wPadding );
+
+ width_ = wrap.width();
+ height_ = wrap.height();
+ }
+
+ } else {
+ width = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_)));
+ height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_)));
+ }
+ }
+
+ if (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) {
+ width += scrollOut;
+ }
+
+ inner.width( width ).height( height );
+
+ wrap.width( width + wPadding );
+
+ width_ = wrap.width();
+ height_ = wrap.height();
+
+ canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight;
+ canExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight));
+
+ $.extend(current, {
+ dim : {
+ width : getValue( width_ ),
+ height : getValue( height_ )
+ },
+ origWidth : origWidth,
+ origHeight : origHeight,
+ canShrink : canShrink,
+ canExpand : canExpand,
+ wPadding : wPadding,
+ hPadding : hPadding,
+ wrapSpace : height_ - skin.outerHeight(true),
+ skinSpace : skin.height() - height
+ });
+
+ if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) {
+ inner.height('auto');
+ }
+ },
+
+ _getPosition: function (onlyAbsolute) {
+ var current = F.current,
+ viewport = F.getViewport(),
+ margin = current.margin,
+ width = F.wrap.width() + margin[1] + margin[3],
+ height = F.wrap.height() + margin[0] + margin[2],
+ rez = {
+ position: 'absolute',
+ top : margin[0],
+ left : margin[3]
+ };
+
+ if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) {
+ rez.position = 'fixed';
+
+ } else if (!current.locked) {
+ rez.top += viewport.y;
+ rez.left += viewport.x;
+ }
+
+ rez.top = getValue(Math.max(rez.top, rez.top + ((viewport.h - height) * current.topRatio)));
+ rez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width) * current.leftRatio)));
+
+ return rez;
+ },
+
+ _afterZoomIn: function () {
+ var current = F.current;
+
+ if (!current) {
+ return;
+ }
+
+ F.isOpen = F.isOpened = true;
+
+ F.wrap.css('overflow', 'visible').addClass('fancybox-opened').hide().show(0);
+
+ F.update();
+
+ // Assign a click event
+ if ( current.closeClick || (current.nextClick && F.group.length > 1) ) {
+ F.inner.css('cursor', 'pointer').bind('click.fb', function(e) {
+ if (!$(e.target).is('a') && !$(e.target).parent().is('a')) {
+ e.preventDefault();
+
+ F[ current.closeClick ? 'close' : 'next' ]();
+ }
+ });
+ }
+
+ // Create a close button
+ if (current.closeBtn) {
+ $(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', function(e) {
+ e.preventDefault();
+
+ F.close();
+ });
+ }
+
+ // Create navigation arrows
+ if (current.arrows && F.group.length > 1) {
+ if (current.loop || current.index > 0) {
+ $(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev);
+ }
+
+ if (current.loop || current.index < F.group.length - 1) {
+ $(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next);
+ }
+ }
+
+ F.trigger('afterShow');
+
+ // Stop the slideshow if this is the last item
+ if (!current.loop && current.index === current.group.length - 1) {
+
+ F.play( false );
+
+ } else if (F.opts.autoPlay && !F.player.isActive) {
+ F.opts.autoPlay = false;
+
+ F.play(true);
+ }
+ },
+
+ _afterZoomOut: function ( obj ) {
+ obj = obj || F.current;
+
+ $('.fancybox-wrap').trigger('onReset').remove();
+
+ $.extend(F, {
+ group : {},
+ opts : {},
+ router : false,
+ current : null,
+ isActive : false,
+ isOpened : false,
+ isOpen : false,
+ isClosing : false,
+ wrap : null,
+ skin : null,
+ outer : null,
+ inner : null
+ });
+
+ F.trigger('afterClose', obj);
+ }
+ });
+
+ /*
+ * Default transitions
+ */
+
+ F.transitions = {
+ getOrigPosition: function () {
+ var current = F.current,
+ element = current.element,
+ orig = current.orig,
+ pos = {},
+ width = 50,
+ height = 50,
+ hPadding = current.hPadding,
+ wPadding = current.wPadding,
+ viewport = F.getViewport();
+
+ if (!orig && current.isDom && element.is(':visible')) {
+ orig = element.find('img:first');
+
+ if (!orig.length) {
+ orig = element;
+ }
+ }
+
+ if (isQuery(orig)) {
+ pos = orig.offset();
+
+ if (orig.is('img')) {
+ width = orig.outerWidth();
+ height = orig.outerHeight();
+ }
+
+ } else {
+ pos.top = viewport.y + (viewport.h - height) * current.topRatio;
+ pos.left = viewport.x + (viewport.w - width) * current.leftRatio;
+ }
+
+ if (F.wrap.css('position') === 'fixed' || current.locked) {
+ pos.top -= viewport.y;
+ pos.left -= viewport.x;
+ }
+
+ pos = {
+ top : getValue(pos.top - hPadding * current.topRatio),
+ left : getValue(pos.left - wPadding * current.leftRatio),
+ width : getValue(width + wPadding),
+ height : getValue(height + hPadding)
+ };
+
+ return pos;
+ },
+
+ step: function (now, fx) {
+ var ratio,
+ padding,
+ value,
+ prop = fx.prop,
+ current = F.current,
+ wrapSpace = current.wrapSpace,
+ skinSpace = current.skinSpace;
+
+ if (prop === 'width' || prop === 'height') {
+ ratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start);
+
+ if (F.isClosing) {
+ ratio = 1 - ratio;
+ }
+
+ padding = prop === 'width' ? current.wPadding : current.hPadding;
+ value = now - padding;
+
+ F.skin[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) ) );
+ F.inner[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) );
+ }
+ },
+
+ zoomIn: function () {
+ var current = F.current,
+ startPos = current.pos,
+ effect = current.openEffect,
+ elastic = effect === 'elastic',
+ endPos = $.extend({opacity : 1}, startPos);
+
+ // Remove "position" property that breaks older IE
+ delete endPos.position;
+
+ if (elastic) {
+ startPos = this.getOrigPosition();
+
+ if (current.openOpacity) {
+ startPos.opacity = 0.1;
+ }
+
+ } else if (effect === 'fade') {
+ startPos.opacity = 0.1;
+ }
+
+ F.wrap.css(startPos).animate(endPos, {
+ duration : effect === 'none' ? 0 : current.openSpeed,
+ easing : current.openEasing,
+ step : elastic ? this.step : null,
+ complete : F._afterZoomIn
+ });
+ },
+
+ zoomOut: function () {
+ var current = F.current,
+ effect = current.closeEffect,
+ elastic = effect === 'elastic',
+ endPos = {opacity : 0.1};
+
+ if (elastic) {
+ endPos = this.getOrigPosition();
+
+ if (current.closeOpacity) {
+ endPos.opacity = 0.1;
+ }
+ }
+
+ F.wrap.animate(endPos, {
+ duration : effect === 'none' ? 0 : current.closeSpeed,
+ easing : current.closeEasing,
+ step : elastic ? this.step : null,
+ complete : F._afterZoomOut
+ });
+ },
+
+ changeIn: function () {
+ var current = F.current,
+ effect = current.nextEffect,
+ startPos = current.pos,
+ endPos = { opacity : 1 },
+ direction = F.direction,
+ distance = 200,
+ field;
+
+ startPos.opacity = 0.1;
+
+ if (effect === 'elastic') {
+ field = direction === 'down' || direction === 'up' ? 'top' : 'left';
+
+ if (direction === 'down' || direction === 'right') {
+ startPos[ field ] = getValue(getScalar(startPos[ field ]) - distance);
+ endPos[ field ] = '+=' + distance + 'px';
+
+ } else {
+ startPos[ field ] = getValue(getScalar(startPos[ field ]) + distance);
+ endPos[ field ] = '-=' + distance + 'px';
+ }
+ }
+
+ // Workaround for http://bugs.jquery.com/ticket/12273
+ if (effect === 'none') {
+ F._afterZoomIn();
+
+ } else {
+ F.wrap.css(startPos).animate(endPos, {
+ duration : current.nextSpeed,
+ easing : current.nextEasing,
+ complete : F._afterZoomIn
+ });
+ }
+ },
+
+ changeOut: function () {
+ var previous = F.previous,
+ effect = previous.prevEffect,
+ endPos = { opacity : 0.1 },
+ direction = F.direction,
+ distance = 200;
+
+ if (effect === 'elastic') {
+ endPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px';
+ }
+
+ previous.wrap.animate(endPos, {
+ duration : effect === 'none' ? 0 : previous.prevSpeed,
+ easing : previous.prevEasing,
+ complete : function () {
+ $(this).trigger('onReset').remove();
+ }
+ });
+ }
+ };
+
+ /*
+ * Overlay helper
+ */
+
+ F.helpers.overlay = {
+ defaults : {
+ closeClick : true, // if true, fancyBox will be closed when user clicks on the overlay
+ speedOut : 200, // duration of fadeOut animation
+ showEarly : true, // indicates if should be opened immediately or wait until the content is ready
+ css : {}, // custom CSS properties
+ locked : !isTouch, // if true, the content will be locked into overlay
+ fixed : true // if false, the overlay CSS position property will not be set to "fixed"
+ },
+
+ overlay : null, // current handle
+ fixed : false, // indicates if the overlay has position "fixed"
+ el : $('html'), // element that contains "the lock"
+
+ // Public methods
+ create : function(opts) {
+ var parent;
+
+ opts = $.extend({}, this.defaults, opts);
+
+ if (this.overlay) {
+ this.close();
+ }
+
+ parent = F.coming ? F.coming.parent : opts.parent;
+
+ this.overlay = $('<div class="fancybox-overlay"></div>').appendTo( parent && parent.lenth ? parent : 'body' );
+ this.fixed = false;
+
+ if (opts.fixed && F.defaults.fixed) {
+ this.overlay.addClass('fancybox-overlay-fixed');
+
+ this.fixed = true;
+ }
+ },
+
+ open : function(opts) {
+ var that = this;
+
+ opts = $.extend({}, this.defaults, opts);
+
+ if (this.overlay) {
+ this.overlay.unbind('.overlay').width('auto').height('auto');
+
+ } else {
+ this.create(opts);
+ }
+
+ if (!this.fixed) {
+ W.bind('resize.overlay', $.proxy( this.update, this) );
+
+ this.update();
+ }
+
+ if (opts.closeClick) {
+ this.overlay.bind('click.overlay', function(e) {
+ if ($(e.target).hasClass('fancybox-overlay')) {
+ if (F.isActive) {
+ F.close();
+ } else {
+ that.close();
+ }
+
+ return false;
+ }
+ });
+ }
+
+ this.overlay.css( opts.css ).show();
+ },
+
+ close : function() {
+ W.unbind('resize.overlay');
+
+ if (this.el.hasClass('fancybox-lock')) {
+ $('.fancybox-margin').removeClass('fancybox-margin');
+
+ this.el.removeClass('fancybox-lock');
+
+ W.scrollTop( this.scrollV ).scrollLeft( this.scrollH );
+ }
+
+ $('.fancybox-overlay').remove().hide();
+
+ $.extend(this, {
+ overlay : null,
+ fixed : false
+ });
+ },
+
+ // Private, callbacks
+
+ update : function () {
+ var width = '100%', offsetWidth;
+
+ // Reset width/height so it will not mess
+ this.overlay.width(width).height('100%');
+
+ // jQuery does not return reliable result for IE
+ if (IE) {
+ offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth);
+
+ if (D.width() > offsetWidth) {
+ width = D.width();
+ }
+
+ } else if (D.width() > W.width()) {
+ width = D.width();
+ }
+
+ this.overlay.width(width).height(D.height());
+ },
+
+ // This is where we can manipulate DOM, because later it would cause iframes to reload
+ onReady : function (opts, obj) {
+ var overlay = this.overlay;
+
+ $('.fancybox-overlay').stop(true, true);
+
+ if (!overlay) {
+ this.create(opts);
+ }
+
+ if (opts.locked && this.fixed && obj.fixed) {
+ obj.locked = this.overlay.append( obj.wrap );
+ obj.fixed = false;
+ }
+
+ if (opts.showEarly === true) {
+ this.beforeShow.apply(this, arguments);
+ }
+ },
+
+ beforeShow : function(opts, obj) {
+ if (obj.locked && !this.el.hasClass('fancybox-lock')) {
+ if (this.fixPosition !== false) {
+ $('*').filter(function(){
+ return ($(this).css('position') === 'fixed' && !$(this).hasClass("fancybox-overlay") && !$(this).hasClass("fancybox-wrap") );
+ }).addClass('fancybox-margin');
+ }
+
+ this.el.addClass('fancybox-margin');
+
+ this.scrollV = W.scrollTop();
+ this.scrollH = W.scrollLeft();
+
+ this.el.addClass('fancybox-lock');
+
+ W.scrollTop( this.scrollV ).scrollLeft( this.scrollH );
+ }
+
+ this.open(opts);
+ },
+
+ onUpdate : function() {
+ if (!this.fixed) {
+ this.update();
+ }
+ },
+
+ afterClose: function (opts) {
+ // Remove overlay if exists and fancyBox is not opening
+ // (e.g., it is not being open using afterClose callback)
+ if (this.overlay && !F.coming) {
+ this.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this ));
+ }
+ }
+ };
+
+ /*
+ * Title helper
+ */
+
+ F.helpers.title = {
+ defaults : {
+ type : 'float', // 'float', 'inside', 'outside' or 'over',
+ position : 'bottom' // 'top' or 'bottom'
+ },
+
+ beforeShow: function (opts) {
+ var current = F.current,
+ text = current.title,
+ type = opts.type,
+ title,
+ target;
+
+ if ($.isFunction(text)) {
+ text = text.call(current.element, current);
+ }
+
+ if (!isString(text) || $.trim(text) === '') {
+ return;
+ }
+
+ title = $('<div class="fancybox-title fancybox-title-' + type + '-wrap">' + text + '</div>');
+
+ switch (type) {
+ case 'inside':
+ target = F.skin;
+ break;
+
+ case 'outside':
+ target = F.wrap;
+ break;
+
+ case 'over':
+ target = F.inner;
+ break;
+
+ default: // 'float'
+ target = F.skin;
+
+ title.appendTo('body');
+
+ if (IE) {
+ title.width( title.width() );
+ }
+
+ title.wrapInner('<span class="child"></span>');
+
+ //Increase bottom margin so this title will also fit into viewport
+ F.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) );
+ break;
+ }
+
+ title[ (opts.position === 'top' ? 'prependTo' : 'appendTo') ](target);
+ }
+ };
+
+ // jQuery plugin initialization
+ $.fn.fancybox = function (options) {
+ var index,
+ that = $(this),
+ selector = this.selector || '',
+ run = function(e) {
+ var what = $(this).blur(), idx = index, relType, relVal;
+
+ if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) {
+ relType = options.groupAttr || 'data-fancybox-group';
+ relVal = what.attr(relType);
+
+ if (!relVal) {
+ relType = 'rel';
+ relVal = what.get(0)[ relType ];
+ }
+
+ if (relVal && relVal !== '' && relVal !== 'nofollow') {
+ what = selector.length ? $(selector) : that;
+ what = what.filter('[' + relType + '="' + relVal + '"]');
+ idx = what.index(this);
+ }
+
+ options.index = idx;
+
+ // Stop an event from bubbling if everything is fine
+ if (F.open(what, options) !== false) {
+ e.preventDefault();
+ }
+ }
+ };
+
+ options = options || {};
+ index = options.index || 0;
+
+ if (!selector || options.live === false) {
+ that.unbind('click.fb-start').bind('click.fb-start', run);
+
+ } else {
+ D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-item, .fancybox-nav')", 'click.fb-start', run);
+ }
+
+ this.filter('[data-fancybox-start=1]').trigger('click');
+
+ return this;
+ };
+
+ // Tests that need a body at doc ready
+ D.ready(function() {
+ var w1, w2;
+
+ if ( $.scrollbarWidth === undefined ) {
+ // http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth
+ $.scrollbarWidth = function() {
+ var parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body'),
+ child = parent.children(),
+ width = child.innerWidth() - child.height( 99 ).innerWidth();
+
+ parent.remove();
+
+ return width;
+ };
+ }
+
+ if ( $.support.fixedPosition === undefined ) {
+ $.support.fixedPosition = (function() {
+ var elem = $('<div style="position:fixed;top:20px;"></div>').appendTo('body'),
+ fixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 );
+
+ elem.remove();
+
+ return fixed;
+ }());
+ }
+
+ $.extend(F.defaults, {
+ scrollbarWidth : $.scrollbarWidth(),
+ fixed : $.support.fixedPosition,
+ parent : $('body')
+ });
+
+ //Get real width of page scroll-bar
+ w1 = $(window).width();
+
+ H.addClass('fancybox-lock-test');
+
+ w2 = $(window).width();
+
+ H.removeClass('fancybox-lock-test');
+
+ $("<style type='text/css'>.fancybox-margin{margin-right:" + (w2 - w1) + "px;}</style>").appendTo("head");
+ });
+
+}(window, document, jQuery));
\ No newline at end of file
diff --git a/themes/bootstrap-blog/source/fancybox/jquery.fancybox.pack.js b/themes/bootstrap-blog/source/fancybox/jquery.fancybox.pack.js
new file mode 100644
index 0000000..2db1280
--- /dev/null
+++ b/themes/bootstrap-blog/source/fancybox/jquery.fancybox.pack.js
@@ -0,0 +1,46 @@
+/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
+(function(s,H,f,w){var K=f("html"),q=f(s),p=f(H),b=f.fancybox=function(){b.open.apply(this,arguments)},J=navigator.userAgent.match(/msie/i),C=null,t=H.createTouch!==w,u=function(a){return a&&a.hasOwnProperty&&a instanceof f},r=function(a){return a&&"string"===f.type(a)},F=function(a){return r(a)&&0<a.indexOf("%")},m=function(a,d){var e=parseInt(a,10)||0;d&&F(a)&&(e*=b.getViewport()[d]/100);return Math.ceil(e)},x=function(a,b){return m(a,b)+"px"};f.extend(b,{version:"2.1.5",defaults:{padding:15,margin:20,
+width:800,height:600,minWidth:100,minHeight:100,maxWidth:9999,maxHeight:9999,pixelRatio:1,autoSize:!0,autoHeight:!1,autoWidth:!1,autoResize:!0,autoCenter:!t,fitToView:!0,aspectRatio:!1,topRatio:0.5,leftRatio:0.5,scrolling:"auto",wrapCSS:"",arrows:!0,closeBtn:!0,closeClick:!1,nextClick:!1,mouseWheel:!0,autoPlay:!1,playSpeed:3E3,preload:3,modal:!1,loop:!0,ajax:{dataType:"html",headers:{"X-fancyBox":!0}},iframe:{scrolling:"auto",preload:!0},swf:{wmode:"transparent",allowfullscreen:"true",allowscriptaccess:"always"},
+keys:{next:{13:"left",34:"up",39:"left",40:"up"},prev:{8:"right",33:"down",37:"right",38:"down"},close:[27],play:[32],toggle:[70]},direction:{next:"left",prev:"right"},scrollOutside:!0,index:0,type:null,href:null,content:null,title:null,tpl:{wrap:'<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',image:'<img class="fancybox-image" src="{href}" alt="" />',iframe:'<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen'+
+(J?' allowtransparency="true"':"")+"></iframe>",error:'<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',closeBtn:'<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>',next:'<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',prev:'<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'},openEffect:"fade",openSpeed:250,openEasing:"swing",openOpacity:!0,
+openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null,isActive:!1,
+isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=u(a)?f(a).get():[a]),f.each(a,function(e,c){var l={},g,h,k,n,m;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),u(c)?(l={href:c.data("fancybox-href")||c.attr("href"),title:f("<div/>").text(c.data("fancybox-title")||c.attr("title")).html(),isDom:!0,element:c},
+f.metadata&&f.extend(!0,l,c.metadata())):l=c);g=d.href||l.href||(r(c)?c:null);h=d.title!==w?d.title:l.title||"";n=(k=d.content||l.content)?"html":d.type||l.type;!n&&l.isDom&&(n=c.data("fancybox-type"),n||(n=(n=c.prop("class").match(/fancybox\.(\w+)/))?n[1]:null));r(g)&&(n||(b.isImage(g)?n="image":b.isSWF(g)?n="swf":"#"===g.charAt(0)?n="inline":r(c)&&(n="html",k=c)),"ajax"===n&&(m=g.split(/\s+/,2),g=m.shift(),m=m.shift()));k||("inline"===n?g?k=f(r(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):l.isDom&&(k=c):
+"html"===n?k=g:n||g||!l.isDom||(n="inline",k=c));f.extend(l,{href:g,type:n,content:k,title:h,selector:m});a[e]=l}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==w&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1===b.trigger("onCancel")||(b.hideLoading(),a&&(b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(),
+b.coming=null,b.current||b._afterZoomOut(a)))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(b.isOpen&&!0!==a?(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]()):(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&&
+(b.player.timer=setTimeout(b.next,b.current.playSpeed))},c=function(){d();p.unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};!0===a||!b.player.isActive&&!1!==a?b.current&&(b.current.loop||b.current.index<b.group.length-1)&&(b.player.isActive=!0,p.bind({"onCancel.player beforeClose.player":c,"onUpdate.player":e,"beforeLoad.player":d}),e(),b.trigger("onPlayStart")):c()},next:function(a){var d=b.current;d&&(r(a)||(a=d.direction.next),b.jumpto(d.index+1,a,"next"))},prev:function(a){var d=
+b.current;d&&(r(a)||(a=d.direction.prev),b.jumpto(d.index-1,a,"prev"))},jumpto:function(a,d,e){var c=b.current;c&&(a=m(a),b.direction=d||c.direction[a>=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==w&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,l;c&&(l=b._getPosition(d),a&&"scroll"===a.type?(delete l.position,c.stop(!0,!0).animate(l,200)):(c.css(l),e.pos=f.extend({},e.dim,l)))},
+update:function(a){var d=a&&a.originalEvent&&a.originalEvent.type,e=!d||"orientationchange"===d;e&&(clearTimeout(C),C=null);b.isOpen&&!C&&(C=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),C=null)},e&&!t?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,t&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"),
+b.trigger("onUpdate")),b.update())},hideLoading:function(){p.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('<div id="fancybox-loading"><div></div></div>').click(b.cancel).appendTo("body");p.bind("keydown.loading",function(a){27===(a.which||a.keyCode)&&(a.preventDefault(),b.cancel())});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}));b.trigger("onLoading")},getViewport:function(){var a=b.current&&
+b.current.locked||!1,d={x:q.scrollLeft(),y:q.scrollTop()};a&&a.length?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=t&&s.innerWidth?s.innerWidth:q.width(),d.h=t&&s.innerHeight?s.innerHeight:q.height());return d},unbindEvents:function(){b.wrap&&u(b.wrap)&&b.wrap.unbind(".fb");p.unbind(".fb");q.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(q.bind("orientationchange.fb"+(t?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&p.bind("keydown.fb",function(e){var c=
+e.which||e.keyCode,l=e.target||e.srcElement;if(27===c&&b.coming)return!1;e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||l&&(l.type||f(l).is("[contenteditable]"))||f.each(d,function(d,l){if(1<a.group.length&&l[c]!==w)return b[d](l[c]),e.preventDefault(),!1;if(-1<f.inArray(c,l))return b[d](),e.preventDefault(),!1})}),f.fn.mousewheel&&a.mouseWheel&&b.wrap.bind("mousewheel.fb",function(d,c,l,g){for(var h=f(d.target||null),k=!1;h.length&&!(k||h.is(".fancybox-skin")||h.is(".fancybox-wrap"));)k=h[0]&&!(h[0].style.overflow&&
+"hidden"===h[0].style.overflow)&&(h[0].clientWidth&&h[0].scrollWidth>h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();0!==c&&!k&&1<b.group.length&&!a.canShrink&&(0<g||0<l?b.prev(0<g?"down":"left"):(0>g||0>l)&&b.next(0>g?"up":"right"),d.preventDefault())}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d,e){if(e&&
+b.helpers[d]&&f.isFunction(b.helpers[d][a]))b.helpers[d][a](f.extend(!0,{},b.helpers[d].defaults,e),c)})}p.trigger(a)},isImage:function(a){return r(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)},isSWF:function(a){return r(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c;a=m(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&&(d.padding=[c,c,
+c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive=!0;if("image"===
+c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=!0);"iframe"===c&&t&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(t?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,x(d.padding[a]))});b.trigger("onReady");
+if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");"image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width=
+this.width/b.opts.pixelRatio;b.coming.height=this.height/b.opts.pixelRatio;b._afterLoad()};a.onerror=function(){this.onload=this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming,
+d=f(a.tpl.iframe.replace(/\{rnd\}/g,(new Date).getTime())).attr("scrolling",t?"auto":a.iframe.scrolling).attr("src",a.href);f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);t||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload||
+b._afterLoad()},_preloadImages:function(){var a=b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,l,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());
+b.unbindEvents();e=a.content;c=a.type;l=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("<div>").html(e).find(a.selector):u(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('<div class="fancybox-placeholder"></div>').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder",
+!1)}));break;case "image":e=a.tpl.image.replace(/\{href\}/g,g);break;case "swf":e='<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="'+g+'"></param>',h="",f.each(a.swf,function(a,b){e+='<param name="'+a+'" value="'+b+'"></param>';h+=" "+a+'="'+b+'"'}),e+='<embed src="'+g+'" type="application/x-shockwave-flash" width="100%" height="100%"'+h+"></embed></object>"}u(e)&&e.parent().is(a.inner)||a.inner.append(e);b.trigger("beforeShow");
+a.inner.css("overflow","yes"===l?"scroll":"no"===l?"hidden":l);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(!b.isOpened)f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();else if(d.prevMethod)b.transitions[d.prevMethod]();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,l=b.skin,g=b.inner,h=b.current,c=h.width,k=h.height,n=h.minWidth,v=h.minHeight,p=h.maxWidth,
+q=h.maxHeight,t=h.scrolling,r=h.scrollOutside?h.scrollbarWidth:0,y=h.margin,z=m(y[1]+y[3]),s=m(y[0]+y[2]),w,A,u,D,B,G,C,E,I;e.add(l).add(g).width("auto").height("auto").removeClass("fancybox-tmp");y=m(l.outerWidth(!0)-l.width());w=m(l.outerHeight(!0)-l.height());A=z+y;u=s+w;D=F(c)?(a.w-A)*m(c)/100:c;B=F(k)?(a.h-u)*m(k)/100:k;if("iframe"===h.type){if(I=h.content,h.autoHeight&&1===I.data("ready"))try{I[0].contentWindow.document.location&&(g.width(D).height(9999),G=I.contents().find("body"),r&&G.css("overflow-x",
+"hidden"),B=G.outerHeight(!0))}catch(H){}}else if(h.autoWidth||h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(D),h.autoHeight||g.height(B),h.autoWidth&&(D=g.width()),h.autoHeight&&(B=g.height()),g.removeClass("fancybox-tmp");c=m(D);k=m(B);E=D/B;n=m(F(n)?m(n,"w")-A:n);p=m(F(p)?m(p,"w")-A:p);v=m(F(v)?m(v,"h")-u:v);q=m(F(q)?m(q,"h")-u:q);G=p;C=q;h.fitToView&&(p=Math.min(a.w-A,p),q=Math.min(a.h-u,q));A=a.w-z;s=a.h-s;h.aspectRatio?(c>p&&(c=p,k=m(c/E)),k>q&&(k=q,c=m(k*E)),c<n&&(c=n,k=m(c/
+E)),k<v&&(k=v,c=m(k*E))):(c=Math.max(n,Math.min(c,p)),h.autoHeight&&"iframe"!==h.type&&(g.width(c),k=g.height()),k=Math.max(v,Math.min(k,q)));if(h.fitToView)if(g.width(c).height(k),e.width(c+y),a=e.width(),z=e.height(),h.aspectRatio)for(;(a>A||z>s)&&c>n&&k>v&&!(19<d++);)k=Math.max(v,Math.min(q,k-10)),c=m(k*E),c<n&&(c=n,k=m(c/E)),c>p&&(c=p,k=m(c/E)),g.width(c).height(k),e.width(c+y),a=e.width(),z=e.height();else c=Math.max(n,Math.min(c,c-(a-A))),k=Math.max(v,Math.min(k,k-(z-s)));r&&"auto"===t&&k<B&&
+c+y+r<A&&(c+=r);g.width(c).height(k);e.width(c+y);a=e.width();z=e.height();e=(a>A||z>s)&&c>n&&k>v;c=h.aspectRatio?c<G&&k<C&&c<D&&k<B:(c<G||k<C)&&(c<D||k<B);f.extend(h,{dim:{width:x(a),height:x(z)},origWidth:D,origHeight:B,canShrink:e,canExpand:c,wPadding:y,hPadding:w,wrapSpace:z-l.outerHeight(!0),skinSpace:l.height()-k});!I&&h.autoHeight&&k>v&&k<q&&!c&&g.height("auto")},_getPosition:function(a){var d=b.current,e=b.getViewport(),c=d.margin,f=b.wrap.width()+c[1]+c[3],g=b.wrap.height()+c[0]+c[2],c={position:"absolute",
+top:c[0],left:c[3]};d.autoCenter&&d.fixed&&!a&&g<=e.h&&f<=e.w?c.position="fixed":d.locked||(c.top+=e.y,c.left+=e.x);c.top=x(Math.max(c.top,c.top+(e.h-g)*d.topRatio));c.left=x(Math.max(c.left,c.left+(e.w-f)*d.leftRatio));return c},_afterZoomIn:function(){var a=b.current;a&&((b.isOpen=b.isOpened=!0,b.wrap.css("overflow","visible").addClass("fancybox-opened"),b.update(),(a.closeClick||a.nextClick&&1<b.group.length)&&b.inner.css("cursor","pointer").bind("click.fb",function(d){f(d.target).is("a")||f(d.target).parent().is("a")||
+(d.preventDefault(),b[a.closeClick?"close":"next"]())}),a.closeBtn&&f(a.tpl.closeBtn).appendTo(b.skin).bind("click.fb",function(a){a.preventDefault();b.close()}),a.arrows&&1<b.group.length&&((a.loop||0<a.index)&&f(a.tpl.prev).appendTo(b.outer).bind("click.fb",b.prev),(a.loop||a.index<b.group.length-1)&&f(a.tpl.next).appendTo(b.outer).bind("click.fb",b.next)),b.trigger("afterShow"),a.loop||a.index!==a.group.length-1)?b.opts.autoPlay&&!b.player.isActive&&(b.opts.autoPlay=!1,b.play(!0)):b.play(!1))},
+_afterZoomOut:function(a){a=a||b.current;f(".fancybox-wrap").trigger("onReset").remove();f.extend(b,{group:{},opts:{},router:!1,current:null,isActive:!1,isOpened:!1,isOpen:!1,isClosing:!1,wrap:null,skin:null,outer:null,inner:null});b.trigger("afterClose",a)}});b.transitions={getOrigPosition:function(){var a=b.current,d=a.element,e=a.orig,c={},f=50,g=50,h=a.hPadding,k=a.wPadding,n=b.getViewport();!e&&a.isDom&&d.is(":visible")&&(e=d.find("img:first"),e.length||(e=d));u(e)?(c=e.offset(),e.is("img")&&
+(f=e.outerWidth(),g=e.outerHeight())):(c.top=n.y+(n.h-g)*a.topRatio,c.left=n.x+(n.w-f)*a.leftRatio);if("fixed"===b.wrap.css("position")||a.locked)c.top-=n.y,c.left-=n.x;return c={top:x(c.top-h*a.topRatio),left:x(c.left-k*a.leftRatio),width:x(f+k),height:x(g+h)}},step:function(a,d){var e,c,f=d.prop;c=b.current;var g=c.wrapSpace,h=c.skinSpace;if("width"===f||"height"===f)e=d.end===d.start?1:(a-d.start)/(d.end-d.start),b.isClosing&&(e=1-e),c="width"===f?c.wPadding:c.hPadding,c=a-c,b.skin[f](m("width"===
+f?c:c-g*e)),b.inner[f](m("width"===f?c:c-g*e-h*e))},zoomIn:function(){var a=b.current,d=a.pos,e=a.openEffect,c="elastic"===e,l=f.extend({opacity:1},d);delete l.position;c?(d=this.getOrigPosition(),a.openOpacity&&(d.opacity=0.1)):"fade"===e&&(d.opacity=0.1);b.wrap.css(d).animate(l,{duration:"none"===e?0:a.openSpeed,easing:a.openEasing,step:c?this.step:null,complete:b._afterZoomIn})},zoomOut:function(){var a=b.current,d=a.closeEffect,e="elastic"===d,c={opacity:0.1};e&&(c=this.getOrigPosition(),a.closeOpacity&&
+(c.opacity=0.1));b.wrap.animate(c,{duration:"none"===d?0:a.closeSpeed,easing:a.closeEasing,step:e?this.step:null,complete:b._afterZoomOut})},changeIn:function(){var a=b.current,d=a.nextEffect,e=a.pos,c={opacity:1},f=b.direction,g;e.opacity=0.1;"elastic"===d&&(g="down"===f||"up"===f?"top":"left","down"===f||"right"===f?(e[g]=x(m(e[g])-200),c[g]="+=200px"):(e[g]=x(m(e[g])+200),c[g]="-=200px"));"none"===d?b._afterZoomIn():b.wrap.css(e).animate(c,{duration:a.nextSpeed,easing:a.nextEasing,complete:b._afterZoomIn})},
+changeOut:function(){var a=b.previous,d=a.prevEffect,e={opacity:0.1},c=b.direction;"elastic"===d&&(e["down"===c||"up"===c?"top":"left"]=("up"===c||"left"===c?"-":"+")+"=200px");a.wrap.animate(e,{duration:"none"===d?0:a.prevSpeed,easing:a.prevEasing,complete:function(){f(this).trigger("onReset").remove()}})}};b.helpers.overlay={defaults:{closeClick:!0,speedOut:200,showEarly:!0,css:{},locked:!t,fixed:!0},overlay:null,fixed:!1,el:f("html"),create:function(a){var d;a=f.extend({},this.defaults,a);this.overlay&&
+this.close();d=b.coming?b.coming.parent:a.parent;this.overlay=f('<div class="fancybox-overlay"></div>').appendTo(d&&d.lenth?d:"body");this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this;a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(q.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay",
+function(a){if(f(a.target).hasClass("fancybox-overlay"))return b.isActive?b.close():d.close(),!1});this.overlay.css(a.css).show()},close:function(){q.unbind("resize.overlay");this.el.hasClass("fancybox-lock")&&(f(".fancybox-margin").removeClass("fancybox-margin"),this.el.removeClass("fancybox-lock"),q.scrollTop(this.scrollV).scrollLeft(this.scrollH));f(".fancybox-overlay").remove().hide();f.extend(this,{overlay:null,fixed:!1})},update:function(){var a="100%",b;this.overlay.width(a).height("100%");
+J?(b=Math.max(H.documentElement.offsetWidth,H.body.offsetWidth),p.width()>b&&(a=p.width())):p.width()>q.width()&&(a=p.width());this.overlay.width(a).height(p.height())},onReady:function(a,b){var e=this.overlay;f(".fancybox-overlay").stop(!0,!0);e||this.create(a);a.locked&&this.fixed&&b.fixed&&(b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){b.locked&&!this.el.hasClass("fancybox-lock")&&(!1!==this.fixPosition&&f("*").filter(function(){return"fixed"===
+f(this).css("position")&&!f(this).hasClass("fancybox-overlay")&&!f(this).hasClass("fancybox-wrap")}).addClass("fancybox-margin"),this.el.addClass("fancybox-margin"),this.scrollV=q.scrollTop(),this.scrollH=q.scrollLeft(),this.el.addClass("fancybox-lock"),q.scrollTop(this.scrollV).scrollLeft(this.scrollH));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.coming&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float",
+position:"bottom"},beforeShow:function(a){var d=b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(r(e)&&""!==f.trim(e)){d=f('<div class="fancybox-title fancybox-title-'+c+'-wrap">'+e+"</div>");switch(c){case "inside":c=b.skin;break;case "outside":c=b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),J&&d.width(d.width()),d.wrapInner('<span class="child"></span>'),b.current.margin[2]+=Math.abs(m(d.css("margin-bottom")))}d["top"===a.position?"prependTo":
+"appendTo"](c)}}};f.fn.fancybox=function(a){var d,e=f(this),c=this.selector||"",l=function(g){var h=f(this).blur(),k=d,l,m;g.ctrlKey||g.altKey||g.shiftKey||g.metaKey||h.is(".fancybox-wrap")||(l=a.groupAttr||"data-fancybox-group",m=h.attr(l),m||(l="rel",m=h.get(0)[l]),m&&""!==m&&"nofollow"!==m&&(h=c.length?f(c):e,h=h.filter("["+l+'="'+m+'"]'),k=h.index(this)),a.index=k,!1!==b.open(h,a)&&g.preventDefault())};a=a||{};d=a.index||0;c&&!1!==a.live?p.undelegate(c,"click.fb-start").delegate(c+":not('.fancybox-item, .fancybox-nav')",
+"click.fb-start",l):e.unbind("click.fb-start").bind("click.fb-start",l);this.filter("[data-fancybox-start=1]").trigger("click");return this};p.ready(function(){var a,d;f.scrollbarWidth===w&&(f.scrollbarWidth=function(){var a=f('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo("body"),b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});f.support.fixedPosition===w&&(f.support.fixedPosition=function(){var a=f('<div style="position:fixed;top:20px;"></div>').appendTo("body"),
+b=20===a[0].offsetTop||15===a[0].offsetTop;a.remove();return b}());f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")});a=f(s).width();K.addClass("fancybox-lock-test");d=f(s).width();K.removeClass("fancybox-lock-test");f("<style type='text/css'>.fancybox-margin{margin-right:"+(d-a)+"px;}</style>").appendTo("head")})})(window,document,jQuery);
\ No newline at end of file
diff --git a/themes/bootstrap-blog/source/js/script.js b/themes/bootstrap-blog/source/js/script.js
new file mode 100644
index 0000000..a2f255d
--- /dev/null
+++ b/themes/bootstrap-blog/source/js/script.js
@@ -0,0 +1,85 @@
+(function($){
+
+ // Share
+ $('body').on('click', function(){
+ $('.article-share-box.on').removeClass('on');
+ }).on('click', '.article-share-link', function(e){
+ e.stopPropagation();
+
+ var $this = $(this),
+ url = $this.attr('data-url'),
+ encodedUrl = encodeURIComponent(url),
+ id = 'article-share-box-' + $this.attr('data-id'),
+ offset = $this.offset();
+
+ if ($('#' + id).length){
+ var box = $('#' + id);
+
+ if (box.hasClass('on')){
+ box.removeClass('on');
+ return;
+ }
+ } else {
+ var html = [
+ '<div id="' + id + '" class="article-share-box">',
+ '<input class="article-share-input" value="' + url + '">',
+ '<div class="article-share-links">',
+ '<a href="https://twitter.com/intent/tweet?url=' + encodedUrl + '" class="article-share-twitter" target="_blank" title="Twitter"></a>',
+ '<a href="https://www.facebook.com/sharer.php?u=' + encodedUrl + '" class="article-share-facebook" target="_blank" title="Facebook"></a>',
+ '<a href="http://pinterest.com/pin/create/button/?url=' + encodedUrl + '" class="article-share-pinterest" target="_blank" title="Pinterest"></a>',
+ '<a href="https://plus.google.com/share?url=' + encodedUrl + '" class="article-share-google" target="_blank" title="Google+"></a>',
+ '</div>',
+ '</div>'
+ ].join('');
+
+ var box = $(html);
+
+ $('body').append(box);
+ }
+
+ $('.article-share-box.on').hide();
+
+ box.css({
+ top: offset.top + 25,
+ left: offset.left
+ }).addClass('on');
+ }).on('click', '.article-share-box', function(e){
+ e.stopPropagation();
+ }).on('click', '.article-share-box-input', function(){
+ $(this).select();
+ }).on('click', '.article-share-box-link', function(e){
+ e.preventDefault();
+ e.stopPropagation();
+
+ window.open(this.href, 'article-share-box-window-' + Date.now(), 'width=500,height=450');
+ });
+
+ // Caption
+ $('.article-entry').each(function(i){
+ $(this).find('img').each(function(){
+ if ($(this).parent().hasClass('image-link')) return;
+
+ var alt = this.alt;
+ if (alt) $(this).after('<span class="caption">' + alt + '</span>');
+
+ $(this).wrap('<a href="' + this.src + '" title="' + alt + '" class="image-link"></a>');
+ });
+
+ $(this).find('.image-link').each(function(){
+ $(this).attr('rel', 'article' + i);
+ });
+ });
+
+ // Bootstrap table style
+ $('.article-entry table').each(function(i, table) {
+ if ($(this).parent().hasClass('table-responsive')) return;
+ $(this).addClass('table');
+ $(this).wrap('<div class="table-responsive"></div>');
+ });
+
+ // Lightbox plugin
+ if ($.fancybox){
+ $('.image-link').fancybox();
+ }
+
+})(jQuery);
\ No newline at end of file