├── .gitignore ├── Gemfile ├── LICENSE.txt ├── README.md ├── _config.yml ├── _data └── menu.yml ├── _includes ├── footer.html ├── header.html └── sidebar-content.html ├── _layouts ├── default.html ├── page.html └── post.html ├── _posts ├── 2016-08-02-testing-pages.md ├── 2016-08-07-more-pages.md ├── 2016-09-06-another-post.md └── 2016-09-07-example-post.md ├── _sass └── rlstevenson.scss ├── index.html └── static ├── css ├── bootstrap.css ├── bootstrap.min.css └── rlstevenson.scss ├── fonts ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff └── glyphicons-halflings-regular.woff2 └── js ├── bootstrap.js └── bootstrap.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | Gemfile.lock 3 | .sass-cache 4 | *.gem 5 | *.gemspec 6 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | gemspec 3 | gem 'jekyll-paginate' -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 ExchangeRate-API 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RLStevenson - Bootstrap Clone of Hyde 2 | 3 | RLStevenson was built for people who like the original Jekyll theme [Hyde](https://github.com/poole/hyde) but would like to use [Bootstrap](http://getbootstrap.com). 4 | 5 | The theme was built from an empty Bootstrap 3 template with the goal of easy modification for end users. The code is as simple as possible - clearly formatted HTML and a single stylesheet. It's a two column responsive design and currently includes version 3.3.7 of Bootstrap. 6 | 7 | Pull requests are welcome. 8 | 9 | ![RLStevenson Screenshot](http://i.imgur.com/yLkV7Ws.png) 10 | 11 | ## Installation 12 | 13 | Add this line to your Jekyll site's Gemfile: 14 | 15 | ```ruby 16 | gem "rlstevenson-jekyll-theme" 17 | ``` 18 | 19 | And add this line to your Jekyll site: 20 | 21 | ```yaml 22 | theme: rlstevenson-jekyll-theme 23 | ``` 24 | 25 | And then execute: 26 | 27 | $ bundle 28 | 29 | Or install it yourself as: 30 | 31 | $ gem install rlstevenson-jekyll-theme 32 | 33 | The Ruby Gem page is here: [rlstevenson-jekyll-theme](https://rubygems.org/gems/rlstevenson-jekyll-theme) 34 | 35 | ## Usage & Config Options 36 | 37 | There are a number of options you can set in your `_config.yml` file. 38 | 39 | The `description` variable will appear after the Title of your site in your `` meta tag: 40 | 41 | description: 'A two coloumn blog theme built with Bootstrap for Jekyll.' 42 | 43 | ### Sidebar 44 | 45 | The `description` variable will also appear below the title in your sidebar. 46 | 47 | The `freetext` will appear in a free paragraph below the Title & sidebarDescription and above the menu links. Set it to "" if you don't want it. 48 | 49 | freetext: 'A optional paragraph of free text. Set to blank in _config.yml to clear...' 50 | 51 | ### Sidebar Menu Links 52 | 53 | Take a look at `_data/menu.yml` file to see how you can add menu items to your sidebar. 54 | 55 | ### Pagination 56 | 57 | Simply set the `paginate:` option in your `_config.yml` file to the number of articles you want to show per page. You may need to use the `bundle install` command with Jekyll 3 to make sure you have the `jekyll-paginate` gem. 58 | 59 | Alternatively you can disable pagination by not including the `paginate:` option. 60 | 61 | ### Color Schemes 62 | 63 | In keeping with our attempt to replicate the original Hyde in Bootstrap we've included some colour scheme options. These are not the same as in the original, but we used palettes from the same [Base16](https://github.com/chriskempson/base16) project. 64 | 65 | ![RLStevenson in Gulf Racing](http://i.imgur.com/ktfByqp.png) 66 | 67 | Using a theme is as simple as changing the `colorscheme` param in your `_config.yml`. 68 | 69 | The themes are: 70 | 71 | - Dark Brown (`colorscheme: 'scheme-darkbrown'`) 72 | - Light Brown (`colorscheme: 'scheme-lightbrown'`) 73 | - Green (`colorscheme: 'scheme-green'`) 74 | - Orange (`colorscheme: 'scheme-orange'`) 75 | - Slate (`colorscheme: 'scheme-slate'`) 76 | 77 | And then a bonus theme that isn't from Base16: 78 | 79 | - Gulf Racing (`colorscheme: 'scheme-gulfracing'`) 80 | 81 | #### Creating Your Own Color Scheme 82 | 83 | To create your own custom color scheme simply scroll to the end of the `rlstevenson.scss` stylesheet in the `_sass` folder and edit the template we've left there. 84 | 85 | We'll happily accept pull requests for quality color schemes. 86 | 87 | ### Analytics 88 | 89 | This theme supports GA & Piwik integration. 90 | 91 | For Google Analytics, simply set your UA number in your `_config.yml` file. Example: 92 | 93 | ga: 'UA-123-456' 94 | 95 | For Piwik, use the following two variables: 96 | 97 | piwikSiteID: '' 98 | piwikURL: '' 99 | 100 | ## Example Config 101 | 102 | Here is a full example `_config.yml`: 103 | 104 | ## 105 | # RLStevenson Theme Options 106 | #### 107 | 108 | title: RLStevenson 109 | description: 'A Bootstrap based clone of the Hyde theme by mdo.' 110 | freetext: 'Released under an MIT license - feel free to make pull requests.' 111 | url: / 112 | baseurl: / 113 | paginate: 5 114 | version: 0.1.0 115 | colorscheme: scheme-lightbrown 116 | 117 | ga: 'UA-123-456' 118 | piwikSiteID: '' 119 | piwikURL: '' 120 | 121 | author: 122 | url: https://www.exchangerate-api.com 123 | name: 'ExchangeRate-API' 124 | 125 | gems: [jekyll-paginate] 126 | 127 | exclude: ['README.md', 'Gemfile.lock', 'Gemfile', 'rlstevenson.gemspec'] 128 | 129 | 130 | ## Author 131 | 132 | **ExchangeRate-API.com** 133 | 134 | - <https://github.com/ExchangeRate-API/> 135 | - <https://www.exchangerate-api.com> 136 | 137 | #### RLStevenson Uses Bootstrap 138 | 139 | **Bootstrap** 140 | 141 | - <http://getbootstrap.com> 142 | 143 | 144 | ## Inspired By 145 | 146 | **Mark Otto** - creator of the Hyde theme 147 | 148 | - <https://github.com/mdo> 149 | - <https://twitter.com/mdo> 150 | 151 | 152 | ## Contributing 153 | 154 | Bug reports and pull requests are welcomed. 155 | 156 | 157 | ## License 158 | 159 | The theme is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | 2 | ## 3 | # RLStevenson Theme Options 4 | #### 5 | 6 | # For baseurl: 7 | # Use '' for / or '/your-dir' for another directory 8 | 9 | title: RLStevenson 10 | description: 'A Bootstrap based clone of the Hyde theme by mdo.' 11 | freetext: 'Released under an MIT license - feel free to make pull requests.' 12 | baseurl: '/' 13 | paginate: 3 14 | version: 0.1.0 15 | colorscheme: scheme-gulfracing 16 | 17 | ga: 'UA-123-456' 18 | piwikSiteID: '' 19 | piwikURL: '' 20 | 21 | author: 22 | url: https://www.exchangerate-api.com 23 | name: 'ExchangeRate-API' 24 | 25 | github: 26 | repo: https://github.com/ExchangeRate-API/rlstevenson-jekyll-theme 27 | 28 | gems: [jekyll-paginate] 29 | 30 | exclude: ['README.md', 'Gemfile.lock', 'Gemfile', '*.gemspec', '*.gem'] 31 | -------------------------------------------------------------------------------- /_data/menu.yml: -------------------------------------------------------------------------------- 1 | - text: ExchangeRate-API 2 | url: / 3 | 4 | - text: Jekyll 5 | url: https://jekyllrb.com 6 | 7 | - text: Bootstrap 8 | url: http://getbootstrap.com 9 | 10 | - text: Hyde 11 | url: https://github.com/poole/hyde -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 2 | {% if site.piwikSiteID != '' %} 3 | {% if site.piwikURL != '' %} 4 | 5 | <!-- Piwik --> 6 | <script type="text/javascript"> 7 | var _paq = _paq || []; 8 | _paq.push(['trackPageView']); 9 | _paq.push(['enableLinkTracking']); 10 | (function() { 11 | var u="//{{ site.piwikURL }}/"; 12 | _paq.push(['setTrackerUrl', u+'piwik.php']); 13 | _paq.push(['setSiteId', {{ site.piwikSiteID }}]); 14 | var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; 15 | g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); 16 | })(); 17 | </script> 18 | <!-- End Piwik Code --> 19 | 20 | {% endif %} 21 | {% endif %} 22 | 23 | {% if site.ga != '' %} 24 | 25 | <script> 26 | 27 | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 28 | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 29 | m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 30 | })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); 31 | 32 | ga('create', '{{ site.ga }}', 'auto'); 33 | ga('send', 'pageview'); 34 | 35 | </script> 36 | 37 | {% endif %} 38 | 39 | <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> 40 | <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 41 | <!-- Include all compiled plugins (below), or include individual files as needed --> 42 | <script src="{{ site.baseurl }}/static/js/bootstrap.min.js"></script> 43 | 44 | </body> 45 | </html> -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html lang="en"> 3 | <head> 4 | <meta charset="utf-8"> 5 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 | <meta name="viewport" content="width=device-width, initial-scale=1"> 7 | 8 | <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> 9 | <title>{{ site.title }} - {{ site.description }} 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 20 | 21 | 25 | 26 | -------------------------------------------------------------------------------- /_includes/sidebar-content.html: -------------------------------------------------------------------------------- 1 | 2 | 32 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | {% include header.html %} 2 | 3 |
4 |
5 | 10 |
11 | 12 | {{ content }} 13 | 14 |
15 |
16 |
17 |
18 |
19 | 20 | {% include footer.html %} -------------------------------------------------------------------------------- /_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |
6 | 7 |
8 |

{{ page.title }}

9 |
10 | 11 | {{ content }} 12 | 13 |
14 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |
6 | 7 |
8 |

{{ page.title }}

9 | 10 |
11 | 12 | {{ content }} 13 | 14 |
15 | -------------------------------------------------------------------------------- /_posts/2016-08-02-testing-pages.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Testing Pages 4 | author: ExchangeRate-API 5 | date: 2016-08-02 6 | --- 7 | 8 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. 9 | 10 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. Vestibulum ut feugiat nibh. Sed faucibus felis purus, sed convallis leo dictum vehicula. 11 | 12 | ## H2 Lorem Ipsum 13 | ----- 14 | 15 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. Vestibulum ut feugiat nibh. Sed faucibus felis purus, sed convallis leo dictum vehicula. 16 | 17 | Nam maximus tempor feugiat. Mauris tristique imperdiet nulla id egestas. Proin eget lobortis magna. Duis consectetur nibh at elit viverra congue. Ut eu turpis enim. Suspendisse laoreet, diam sed consequat sodales, felis dolor accumsan justo, nec scelerisque mi sem quis dolor. Etiam ornare venenatis massa, a suscipit ex. Ut quis lectus id nibh mattis rutrum. Nunc vel cursus eros, at blandit mi. Vivamus ac posuere libero. -------------------------------------------------------------------------------- /_posts/2016-08-07-more-pages.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: More Pages 4 | author: ExchangeRate-API 5 | date: 2016-08-07 6 | --- 7 | 8 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. 9 | 10 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. Vestibulum ut feugiat nibh. Sed faucibus felis purus, sed convallis leo dictum vehicula. 11 | 12 | ## H2 Lorem Ipsum 13 | ----- 14 | 15 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. Vestibulum ut feugiat nibh. Sed faucibus felis purus, sed convallis leo dictum vehicula. 16 | 17 | Nam maximus tempor feugiat. Mauris tristique imperdiet nulla id egestas. Proin eget lobortis magna. Duis consectetur nibh at elit viverra congue. Ut eu turpis enim. Suspendisse laoreet, diam sed consequat sodales, felis dolor accumsan justo, nec scelerisque mi sem quis dolor. Etiam ornare venenatis massa, a suscipit ex. Ut quis lectus id nibh mattis rutrum. Nunc vel cursus eros, at blandit mi. Vivamus ac posuere libero. -------------------------------------------------------------------------------- /_posts/2016-09-06-another-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Another Post Example 4 | author: ExchangeRate-API 5 | date: 2016-09-06 6 | --- 7 | 8 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. 9 | 10 | # Header 11 | 12 | # Header 1 13 | 14 | ## Header 2 15 | 16 | ### Header 3 17 | 18 | #### Header 4 19 | 20 | ##### Header 5 21 | 22 | ###### Header 6 23 | 24 | Some example text, okay? It's normal, right? :) 25 | 26 | There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc. 27 | 28 | **bold text** 29 | 30 | *italic text* 31 | 32 | > And this is a blockquote 33 | 34 | ~~~ 35 | And this is a source code in a block 36 | Yeah, don't use highligth :D 37 | ~~~ 38 | 39 | But if you like `inline code`, it's fine. 40 | 41 | And, of course, links: [lampiaosec]. 42 | 43 | # Lists 44 | 45 | * Item x 46 | * Item z 47 | 48 | 1. Item 01 49 | 2. Item 02 50 | 51 | ## Table of content 52 | 53 | * toc 54 | {:toc} 55 | -------------------------------------------------------------------------------- /_posts/2016-09-07-example-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: RLStevenson Jekyll Theme 4 | author: ExchangeRate-API 5 | date: 2016-09-07 6 | --- 7 | 8 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. 9 | 10 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. Vestibulum ut feugiat nibh. Sed faucibus felis purus, sed convallis leo dictum vehicula. 11 | 12 | ## H2 Lorem Ipsum 13 | ----- 14 | 15 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam imperdiet urna eu dolor placerat varius. Vivamus eros augue, consequat id scelerisque nec, fringilla in est. Proin pellentesque malesuada mauris, quis aliquam augue vestibulum ac. Vestibulum ut feugiat nibh. Sed faucibus felis purus, sed convallis leo dictum vehicula. 16 | 17 | Nam maximus tempor feugiat. Mauris tristique imperdiet nulla id egestas. Proin eget lobortis magna. Duis consectetur nibh at elit viverra congue. Ut eu turpis enim. Suspendisse laoreet, diam sed consequat sodales, felis dolor accumsan justo, nec scelerisque mi sem quis dolor. Etiam ornare venenatis massa, a suscipit ex. Ut quis lectus id nibh mattis rutrum. Nunc vel cursus eros, at blandit mi. Vivamus ac posuere libero. -------------------------------------------------------------------------------- /_sass/rlstevenson.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* 4 | * 5 | * RLStevenson CSS 6 | * ------------ 7 | * 8 | * Built by ExchangeRate-API with Bootstrap - inspired by 9 | * Hyde (https://github.com/mdo/hyde). 10 | * 11 | * 12 | * CSS SECTIONS 13 | * 14 | * Defaults 15 | * Blog Content 16 | * Sidebar 17 | * Themes 18 | * 19 | */ 20 | 21 | 22 | /* DEFAULTS */ 23 | 24 | 25 | html, body { 26 | height: 100% 27 | } 28 | h1, h2, h3, h4 { 29 | font-family: Roboto, sans-serif; 30 | } 31 | p { 32 | font-family: Roboto, sans-serif; 33 | font-size: 1.2em; 34 | } 35 | 36 | 37 | 38 | /* BLOG CONTENT */ 39 | 40 | 41 | .content { 42 | padding-left: 5em; 43 | } 44 | @media (max-width: 768px) { 45 | .content { 46 | padding-left: 1em; 47 | } 48 | } 49 | .post { 50 | margin-bottom: 3em; 51 | } 52 | .post .post-heading { 53 | margin-bottom: 1em; 54 | } 55 | .post .post-heading h1 { 56 | margin-top: 1.4em; 57 | } 58 | .post h1 { 59 | font-size: 2.6em; 60 | margin-bottom: 0.2em; 61 | margin-top: 1em; 62 | font-weight: bold; 63 | } 64 | .post h2 { 65 | font-size: 1.8em; 66 | margin-bottom: 0.2em; 67 | margin-top: 1em; 68 | font-weight: bold; 69 | } 70 | .post .post-heading span { 71 | font-size:1.4em; 72 | } 73 | .next { 74 | margin-left:10px; 75 | } 76 | .previous { 77 | margin-right:10px; 78 | } 79 | 80 | 81 | /* SIDEBAR */ 82 | 83 | 84 | .sidebar { 85 | padding: 2em; 86 | font-size: 1.3em; 87 | text-align: left; 88 | } 89 | .sidebar .sidebar-content { 90 | width:85%; 91 | margin:0 auto; 92 | } 93 | .sidebar .sidebar-freetext { 94 | margin-top: 1.5em; 95 | } 96 | .sidebar .sidebar-menus { 97 | padding-left: 0; 98 | margin-left: 0; 99 | margin-top: 1.5em; 100 | } 101 | .sidebar .sidebar-menus li { 102 | list-style: none; 103 | font-size:1em; 104 | } 105 | .sidebar .sidebar-recent { 106 | margin-top: 1.5em; 107 | } 108 | .sidebar .sidebar-menus li a { 109 | text-decoration:underline; 110 | } 111 | @media (min-width: 768px) { 112 | .sidebar { 113 | top: 0; 114 | bottom: 0; 115 | left: 0; 116 | position: fixed; 117 | } 118 | .sidebar-content { 119 | bottom: 1em; 120 | left: 1em; 121 | right: 1em; 122 | position: absolute; 123 | } 124 | .sidebar .sidebar-content { 125 | width:75%; 126 | margin:0 auto; 127 | } 128 | } 129 | @media (max-width: 992px) { 130 | .sidebar { 131 | font-size: 1em; 132 | } 133 | } 134 | @media (max-width: 1200px) { 135 | .sidebar { 136 | font-size: 1.1em; 137 | } 138 | } 139 | .sidebar h1 { 140 | font-size: 1.8em; 141 | font-weight: bold; 142 | margin-bottom: 0; 143 | } 144 | .sidebar li { 145 | font-size: 0.8em; 146 | } 147 | p.copyright { 148 | font-size: 0.7em; 149 | border-top: 1px dotted #ccc; 150 | padding-top: 1em; 151 | margin-top: 2em; 152 | margin-bottom: 0.1em; 153 | } 154 | p.attr { 155 | margin-top: 0; 156 | font-size: 0.6em; 157 | } 158 | 159 | 160 | /* THEMES */ 161 | 162 | 163 | /* Gulf Racing Scheme */ 164 | .scheme-gulfracing { 165 | .sidebar h1 { 166 | color: #1C1C28; 167 | } 168 | .sidebar { 169 | background-color: #85B2D3; 170 | color: #444; 171 | } 172 | } 173 | .scheme-gulfracing .sidebar a { 174 | color: #444; 175 | } 176 | .scheme-gulfracing .content a { 177 | color: #E75E16; 178 | } 179 | .scheme-gulfracing .post .post-heading span { 180 | color: #9a9a9a; 181 | } 182 | 183 | /* YOUR SCHEME HERE */ 184 | /*.scheme-custom .sidebar { 185 | background-color: #85B2D3; 186 | color: #444; 187 | } 188 | .scheme-custom .sidebar h1 { 189 | color: #1C1C28; 190 | } 191 | .scheme-custom .sidebar a { 192 | color: #444; 193 | } 194 | .scheme-custom .content a { 195 | color: #E75E16; 196 | } 197 | .scheme-custom .post .post-heading span { 198 | color: #9a9a9a; 199 | }*/ 200 | 201 | /* 202 | * The original Hyde theme uses Base16 for colour schemes so 203 | * we decided to also use this project. We picked different 204 | * colors though. We also used the Ocean and 80's palettes in 205 | * addition to the Default palette. 206 | * 207 | * Base16: (http://chriskempson.github.io/base16) 208 | * 209 | */ 210 | 211 | /* Dark Brown Scheme */ 212 | .scheme-darkbrown .sidebar { 213 | background-color: #2d2d2d; 214 | color: #f2f0ec; 215 | } 216 | .scheme-darkbrown .sidebar h1 { 217 | color: #99cc99; 218 | } 219 | .scheme-darkbrown .sidebar a { 220 | color: #99cc99; 221 | } 222 | .scheme-darkbrown .content a { 223 | color: #2d2d2d; 224 | } 225 | .scheme-darkbrown .post .post-heading span { 226 | color: #9a9a9a; 227 | } 228 | 229 | /* Light Brown Scheme */ 230 | .scheme-lightbrown .sidebar { 231 | background-color: #d3d0c8; 232 | color: #393939; 233 | } 234 | .scheme-lightbrown .sidebar h1 { 235 | color: #393939; 236 | } 237 | .scheme-lightbrown .sidebar a { 238 | color: #515151; 239 | } 240 | .scheme-lightbrown .content a { 241 | color: #393939; 242 | } 243 | .scheme-lightbrown .post .post-heading span { 244 | color: #9a9a9a; 245 | } 246 | 247 | /* Orange Scheme */ 248 | .scheme-orange .sidebar { 249 | background-color: #f99157; 250 | color: #f2f0ec; 251 | } 252 | .scheme-orange .sidebar h1 { 253 | color: #515151; 254 | } 255 | .scheme-orange .sidebar a { 256 | color: #747369; 257 | } 258 | .scheme-orange .content a { 259 | color: #393939; 260 | } 261 | .scheme-orange .post .post-heading span { 262 | color: #9a9a9a; 263 | } 264 | 265 | /* Green Scheme */ 266 | .scheme-green .sidebar { 267 | background-color: #a3be8c; 268 | color: #4f5b66; 269 | } 270 | .scheme-green .sidebar h1 { 271 | color: #2b303b; 272 | } 273 | .scheme-green .sidebar a { 274 | color: #eff1f5; 275 | } 276 | .scheme-green .content a { 277 | color: #2d2d2d; 278 | } 279 | .scheme-green .post .post-heading span { 280 | color: #9a9a9a; 281 | } 282 | 283 | /* Slate Scheme */ 284 | .scheme-slate .sidebar { 285 | background-color: #a7adba; 286 | color: #343d46; 287 | } 288 | .scheme-slate .sidebar h1 { 289 | color: #2b303b; 290 | } 291 | .scheme-slate .sidebar a { 292 | color: #bf616a; 293 | } 294 | .scheme-slate .content a { 295 | color: #65737e; 296 | } 297 | .scheme-slate .post .post-heading span { 298 | color: #9a9a9a; 299 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |
6 | 7 | 8 | {% for post in paginator.posts %} 9 |
10 | 11 |
12 |

{{ post.title }}

13 | {{ post.date | date_to_string }} by {{ post.author }} 14 |
15 | 16 | {{ post.excerpt }} 17 | 18 |

» View Post

19 | 20 |
21 | {% endfor %} 22 | 23 |
24 | 25 | 26 | 37 | -------------------------------------------------------------------------------- /static/css/rlstevenson.scss: -------------------------------------------------------------------------------- 1 | --- 2 | # this ensures Jekyll reads the file to be transformed into CSS later 3 | # only Main files contain this front matter, not partials. 4 | --- 5 | 6 | @import "rlstevenson"; -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExchangeRate-API/rlstevenson-jekyll-theme/d1ae01d7c1895fd809c2b590d3b73424c0f4927c/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExchangeRate-API/rlstevenson-jekyll-theme/d1ae01d7c1895fd809c2b590d3b73424c0f4927c/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExchangeRate-API/rlstevenson-jekyll-theme/d1ae01d7c1895fd809c2b590d3b73424c0f4927c/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExchangeRate-API/rlstevenson-jekyll-theme/d1ae01d7c1895fd809c2b590d3b73424c0f4927c/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /static/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under the MIT license 5 | */ 6 | 7 | if (typeof jQuery === 'undefined') { 8 | throw new Error('Bootstrap\'s JavaScript requires jQuery') 9 | } 10 | 11 | +function ($) { 12 | 'use strict'; 13 | var version = $.fn.jquery.split(' ')[0].split('.') 14 | if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { 15 | throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') 16 | } 17 | }(jQuery); 18 | 19 | /* ======================================================================== 20 | * Bootstrap: transition.js v3.3.7 21 | * http://getbootstrap.com/javascript/#transitions 22 | * ======================================================================== 23 | * Copyright 2011-2016 Twitter, Inc. 24 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 25 | * ======================================================================== */ 26 | 27 | 28 | +function ($) { 29 | 'use strict'; 30 | 31 | // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 32 | // ============================================================ 33 | 34 | function transitionEnd() { 35 | var el = document.createElement('bootstrap') 36 | 37 | var transEndEventNames = { 38 | WebkitTransition : 'webkitTransitionEnd', 39 | MozTransition : 'transitionend', 40 | OTransition : 'oTransitionEnd otransitionend', 41 | transition : 'transitionend' 42 | } 43 | 44 | for (var name in transEndEventNames) { 45 | if (el.style[name] !== undefined) { 46 | return { end: transEndEventNames[name] } 47 | } 48 | } 49 | 50 | return false // explicit for ie8 ( ._.) 51 | } 52 | 53 | // http://blog.alexmaccaw.com/css-transitions 54 | $.fn.emulateTransitionEnd = function (duration) { 55 | var called = false 56 | var $el = this 57 | $(this).one('bsTransitionEnd', function () { called = true }) 58 | var callback = function () { if (!called) $($el).trigger($.support.transition.end) } 59 | setTimeout(callback, duration) 60 | return this 61 | } 62 | 63 | $(function () { 64 | $.support.transition = transitionEnd() 65 | 66 | if (!$.support.transition) return 67 | 68 | $.event.special.bsTransitionEnd = { 69 | bindType: $.support.transition.end, 70 | delegateType: $.support.transition.end, 71 | handle: function (e) { 72 | if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) 73 | } 74 | } 75 | }) 76 | 77 | }(jQuery); 78 | 79 | /* ======================================================================== 80 | * Bootstrap: alert.js v3.3.7 81 | * http://getbootstrap.com/javascript/#alerts 82 | * ======================================================================== 83 | * Copyright 2011-2016 Twitter, Inc. 84 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 85 | * ======================================================================== */ 86 | 87 | 88 | +function ($) { 89 | 'use strict'; 90 | 91 | // ALERT CLASS DEFINITION 92 | // ====================== 93 | 94 | var dismiss = '[data-dismiss="alert"]' 95 | var Alert = function (el) { 96 | $(el).on('click', dismiss, this.close) 97 | } 98 | 99 | Alert.VERSION = '3.3.7' 100 | 101 | Alert.TRANSITION_DURATION = 150 102 | 103 | Alert.prototype.close = function (e) { 104 | var $this = $(this) 105 | var selector = $this.attr('data-target') 106 | 107 | if (!selector) { 108 | selector = $this.attr('href') 109 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 110 | } 111 | 112 | var $parent = $(selector === '#' ? [] : selector) 113 | 114 | if (e) e.preventDefault() 115 | 116 | if (!$parent.length) { 117 | $parent = $this.closest('.alert') 118 | } 119 | 120 | $parent.trigger(e = $.Event('close.bs.alert')) 121 | 122 | if (e.isDefaultPrevented()) return 123 | 124 | $parent.removeClass('in') 125 | 126 | function removeElement() { 127 | // detach from parent, fire event then clean up data 128 | $parent.detach().trigger('closed.bs.alert').remove() 129 | } 130 | 131 | $.support.transition && $parent.hasClass('fade') ? 132 | $parent 133 | .one('bsTransitionEnd', removeElement) 134 | .emulateTransitionEnd(Alert.TRANSITION_DURATION) : 135 | removeElement() 136 | } 137 | 138 | 139 | // ALERT PLUGIN DEFINITION 140 | // ======================= 141 | 142 | function Plugin(option) { 143 | return this.each(function () { 144 | var $this = $(this) 145 | var data = $this.data('bs.alert') 146 | 147 | if (!data) $this.data('bs.alert', (data = new Alert(this))) 148 | if (typeof option == 'string') data[option].call($this) 149 | }) 150 | } 151 | 152 | var old = $.fn.alert 153 | 154 | $.fn.alert = Plugin 155 | $.fn.alert.Constructor = Alert 156 | 157 | 158 | // ALERT NO CONFLICT 159 | // ================= 160 | 161 | $.fn.alert.noConflict = function () { 162 | $.fn.alert = old 163 | return this 164 | } 165 | 166 | 167 | // ALERT DATA-API 168 | // ============== 169 | 170 | $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) 171 | 172 | }(jQuery); 173 | 174 | /* ======================================================================== 175 | * Bootstrap: button.js v3.3.7 176 | * http://getbootstrap.com/javascript/#buttons 177 | * ======================================================================== 178 | * Copyright 2011-2016 Twitter, Inc. 179 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 180 | * ======================================================================== */ 181 | 182 | 183 | +function ($) { 184 | 'use strict'; 185 | 186 | // BUTTON PUBLIC CLASS DEFINITION 187 | // ============================== 188 | 189 | var Button = function (element, options) { 190 | this.$element = $(element) 191 | this.options = $.extend({}, Button.DEFAULTS, options) 192 | this.isLoading = false 193 | } 194 | 195 | Button.VERSION = '3.3.7' 196 | 197 | Button.DEFAULTS = { 198 | loadingText: 'loading...' 199 | } 200 | 201 | Button.prototype.setState = function (state) { 202 | var d = 'disabled' 203 | var $el = this.$element 204 | var val = $el.is('input') ? 'val' : 'html' 205 | var data = $el.data() 206 | 207 | state += 'Text' 208 | 209 | if (data.resetText == null) $el.data('resetText', $el[val]()) 210 | 211 | // push to event loop to allow forms to submit 212 | setTimeout($.proxy(function () { 213 | $el[val](data[state] == null ? this.options[state] : data[state]) 214 | 215 | if (state == 'loadingText') { 216 | this.isLoading = true 217 | $el.addClass(d).attr(d, d).prop(d, true) 218 | } else if (this.isLoading) { 219 | this.isLoading = false 220 | $el.removeClass(d).removeAttr(d).prop(d, false) 221 | } 222 | }, this), 0) 223 | } 224 | 225 | Button.prototype.toggle = function () { 226 | var changed = true 227 | var $parent = this.$element.closest('[data-toggle="buttons"]') 228 | 229 | if ($parent.length) { 230 | var $input = this.$element.find('input') 231 | if ($input.prop('type') == 'radio') { 232 | if ($input.prop('checked')) changed = false 233 | $parent.find('.active').removeClass('active') 234 | this.$element.addClass('active') 235 | } else if ($input.prop('type') == 'checkbox') { 236 | if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false 237 | this.$element.toggleClass('active') 238 | } 239 | $input.prop('checked', this.$element.hasClass('active')) 240 | if (changed) $input.trigger('change') 241 | } else { 242 | this.$element.attr('aria-pressed', !this.$element.hasClass('active')) 243 | this.$element.toggleClass('active') 244 | } 245 | } 246 | 247 | 248 | // BUTTON PLUGIN DEFINITION 249 | // ======================== 250 | 251 | function Plugin(option) { 252 | return this.each(function () { 253 | var $this = $(this) 254 | var data = $this.data('bs.button') 255 | var options = typeof option == 'object' && option 256 | 257 | if (!data) $this.data('bs.button', (data = new Button(this, options))) 258 | 259 | if (option == 'toggle') data.toggle() 260 | else if (option) data.setState(option) 261 | }) 262 | } 263 | 264 | var old = $.fn.button 265 | 266 | $.fn.button = Plugin 267 | $.fn.button.Constructor = Button 268 | 269 | 270 | // BUTTON NO CONFLICT 271 | // ================== 272 | 273 | $.fn.button.noConflict = function () { 274 | $.fn.button = old 275 | return this 276 | } 277 | 278 | 279 | // BUTTON DATA-API 280 | // =============== 281 | 282 | $(document) 283 | .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { 284 | var $btn = $(e.target).closest('.btn') 285 | Plugin.call($btn, 'toggle') 286 | if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { 287 | // Prevent double click on radios, and the double selections (so cancellation) on checkboxes 288 | e.preventDefault() 289 | // The target component still receive the focus 290 | if ($btn.is('input,button')) $btn.trigger('focus') 291 | else $btn.find('input:visible,button:visible').first().trigger('focus') 292 | } 293 | }) 294 | .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { 295 | $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) 296 | }) 297 | 298 | }(jQuery); 299 | 300 | /* ======================================================================== 301 | * Bootstrap: carousel.js v3.3.7 302 | * http://getbootstrap.com/javascript/#carousel 303 | * ======================================================================== 304 | * Copyright 2011-2016 Twitter, Inc. 305 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 306 | * ======================================================================== */ 307 | 308 | 309 | +function ($) { 310 | 'use strict'; 311 | 312 | // CAROUSEL CLASS DEFINITION 313 | // ========================= 314 | 315 | var Carousel = function (element, options) { 316 | this.$element = $(element) 317 | this.$indicators = this.$element.find('.carousel-indicators') 318 | this.options = options 319 | this.paused = null 320 | this.sliding = null 321 | this.interval = null 322 | this.$active = null 323 | this.$items = null 324 | 325 | this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) 326 | 327 | this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element 328 | .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) 329 | .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) 330 | } 331 | 332 | Carousel.VERSION = '3.3.7' 333 | 334 | Carousel.TRANSITION_DURATION = 600 335 | 336 | Carousel.DEFAULTS = { 337 | interval: 5000, 338 | pause: 'hover', 339 | wrap: true, 340 | keyboard: true 341 | } 342 | 343 | Carousel.prototype.keydown = function (e) { 344 | if (/input|textarea/i.test(e.target.tagName)) return 345 | switch (e.which) { 346 | case 37: this.prev(); break 347 | case 39: this.next(); break 348 | default: return 349 | } 350 | 351 | e.preventDefault() 352 | } 353 | 354 | Carousel.prototype.cycle = function (e) { 355 | e || (this.paused = false) 356 | 357 | this.interval && clearInterval(this.interval) 358 | 359 | this.options.interval 360 | && !this.paused 361 | && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) 362 | 363 | return this 364 | } 365 | 366 | Carousel.prototype.getItemIndex = function (item) { 367 | this.$items = item.parent().children('.item') 368 | return this.$items.index(item || this.$active) 369 | } 370 | 371 | Carousel.prototype.getItemForDirection = function (direction, active) { 372 | var activeIndex = this.getItemIndex(active) 373 | var willWrap = (direction == 'prev' && activeIndex === 0) 374 | || (direction == 'next' && activeIndex == (this.$items.length - 1)) 375 | if (willWrap && !this.options.wrap) return active 376 | var delta = direction == 'prev' ? -1 : 1 377 | var itemIndex = (activeIndex + delta) % this.$items.length 378 | return this.$items.eq(itemIndex) 379 | } 380 | 381 | Carousel.prototype.to = function (pos) { 382 | var that = this 383 | var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) 384 | 385 | if (pos > (this.$items.length - 1) || pos < 0) return 386 | 387 | if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" 388 | if (activeIndex == pos) return this.pause().cycle() 389 | 390 | return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) 391 | } 392 | 393 | Carousel.prototype.pause = function (e) { 394 | e || (this.paused = true) 395 | 396 | if (this.$element.find('.next, .prev').length && $.support.transition) { 397 | this.$element.trigger($.support.transition.end) 398 | this.cycle(true) 399 | } 400 | 401 | this.interval = clearInterval(this.interval) 402 | 403 | return this 404 | } 405 | 406 | Carousel.prototype.next = function () { 407 | if (this.sliding) return 408 | return this.slide('next') 409 | } 410 | 411 | Carousel.prototype.prev = function () { 412 | if (this.sliding) return 413 | return this.slide('prev') 414 | } 415 | 416 | Carousel.prototype.slide = function (type, next) { 417 | var $active = this.$element.find('.item.active') 418 | var $next = next || this.getItemForDirection(type, $active) 419 | var isCycling = this.interval 420 | var direction = type == 'next' ? 'left' : 'right' 421 | var that = this 422 | 423 | if ($next.hasClass('active')) return (this.sliding = false) 424 | 425 | var relatedTarget = $next[0] 426 | var slideEvent = $.Event('slide.bs.carousel', { 427 | relatedTarget: relatedTarget, 428 | direction: direction 429 | }) 430 | this.$element.trigger(slideEvent) 431 | if (slideEvent.isDefaultPrevented()) return 432 | 433 | this.sliding = true 434 | 435 | isCycling && this.pause() 436 | 437 | if (this.$indicators.length) { 438 | this.$indicators.find('.active').removeClass('active') 439 | var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) 440 | $nextIndicator && $nextIndicator.addClass('active') 441 | } 442 | 443 | var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" 444 | if ($.support.transition && this.$element.hasClass('slide')) { 445 | $next.addClass(type) 446 | $next[0].offsetWidth // force reflow 447 | $active.addClass(direction) 448 | $next.addClass(direction) 449 | $active 450 | .one('bsTransitionEnd', function () { 451 | $next.removeClass([type, direction].join(' ')).addClass('active') 452 | $active.removeClass(['active', direction].join(' ')) 453 | that.sliding = false 454 | setTimeout(function () { 455 | that.$element.trigger(slidEvent) 456 | }, 0) 457 | }) 458 | .emulateTransitionEnd(Carousel.TRANSITION_DURATION) 459 | } else { 460 | $active.removeClass('active') 461 | $next.addClass('active') 462 | this.sliding = false 463 | this.$element.trigger(slidEvent) 464 | } 465 | 466 | isCycling && this.cycle() 467 | 468 | return this 469 | } 470 | 471 | 472 | // CAROUSEL PLUGIN DEFINITION 473 | // ========================== 474 | 475 | function Plugin(option) { 476 | return this.each(function () { 477 | var $this = $(this) 478 | var data = $this.data('bs.carousel') 479 | var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) 480 | var action = typeof option == 'string' ? option : options.slide 481 | 482 | if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) 483 | if (typeof option == 'number') data.to(option) 484 | else if (action) data[action]() 485 | else if (options.interval) data.pause().cycle() 486 | }) 487 | } 488 | 489 | var old = $.fn.carousel 490 | 491 | $.fn.carousel = Plugin 492 | $.fn.carousel.Constructor = Carousel 493 | 494 | 495 | // CAROUSEL NO CONFLICT 496 | // ==================== 497 | 498 | $.fn.carousel.noConflict = function () { 499 | $.fn.carousel = old 500 | return this 501 | } 502 | 503 | 504 | // CAROUSEL DATA-API 505 | // ================= 506 | 507 | var clickHandler = function (e) { 508 | var href 509 | var $this = $(this) 510 | var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 511 | if (!$target.hasClass('carousel')) return 512 | var options = $.extend({}, $target.data(), $this.data()) 513 | var slideIndex = $this.attr('data-slide-to') 514 | if (slideIndex) options.interval = false 515 | 516 | Plugin.call($target, options) 517 | 518 | if (slideIndex) { 519 | $target.data('bs.carousel').to(slideIndex) 520 | } 521 | 522 | e.preventDefault() 523 | } 524 | 525 | $(document) 526 | .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) 527 | .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) 528 | 529 | $(window).on('load', function () { 530 | $('[data-ride="carousel"]').each(function () { 531 | var $carousel = $(this) 532 | Plugin.call($carousel, $carousel.data()) 533 | }) 534 | }) 535 | 536 | }(jQuery); 537 | 538 | /* ======================================================================== 539 | * Bootstrap: collapse.js v3.3.7 540 | * http://getbootstrap.com/javascript/#collapse 541 | * ======================================================================== 542 | * Copyright 2011-2016 Twitter, Inc. 543 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 544 | * ======================================================================== */ 545 | 546 | /* jshint latedef: false */ 547 | 548 | +function ($) { 549 | 'use strict'; 550 | 551 | // COLLAPSE PUBLIC CLASS DEFINITION 552 | // ================================ 553 | 554 | var Collapse = function (element, options) { 555 | this.$element = $(element) 556 | this.options = $.extend({}, Collapse.DEFAULTS, options) 557 | this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + 558 | '[data-toggle="collapse"][data-target="#' + element.id + '"]') 559 | this.transitioning = null 560 | 561 | if (this.options.parent) { 562 | this.$parent = this.getParent() 563 | } else { 564 | this.addAriaAndCollapsedClass(this.$element, this.$trigger) 565 | } 566 | 567 | if (this.options.toggle) this.toggle() 568 | } 569 | 570 | Collapse.VERSION = '3.3.7' 571 | 572 | Collapse.TRANSITION_DURATION = 350 573 | 574 | Collapse.DEFAULTS = { 575 | toggle: true 576 | } 577 | 578 | Collapse.prototype.dimension = function () { 579 | var hasWidth = this.$element.hasClass('width') 580 | return hasWidth ? 'width' : 'height' 581 | } 582 | 583 | Collapse.prototype.show = function () { 584 | if (this.transitioning || this.$element.hasClass('in')) return 585 | 586 | var activesData 587 | var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') 588 | 589 | if (actives && actives.length) { 590 | activesData = actives.data('bs.collapse') 591 | if (activesData && activesData.transitioning) return 592 | } 593 | 594 | var startEvent = $.Event('show.bs.collapse') 595 | this.$element.trigger(startEvent) 596 | if (startEvent.isDefaultPrevented()) return 597 | 598 | if (actives && actives.length) { 599 | Plugin.call(actives, 'hide') 600 | activesData || actives.data('bs.collapse', null) 601 | } 602 | 603 | var dimension = this.dimension() 604 | 605 | this.$element 606 | .removeClass('collapse') 607 | .addClass('collapsing')[dimension](0) 608 | .attr('aria-expanded', true) 609 | 610 | this.$trigger 611 | .removeClass('collapsed') 612 | .attr('aria-expanded', true) 613 | 614 | this.transitioning = 1 615 | 616 | var complete = function () { 617 | this.$element 618 | .removeClass('collapsing') 619 | .addClass('collapse in')[dimension]('') 620 | this.transitioning = 0 621 | this.$element 622 | .trigger('shown.bs.collapse') 623 | } 624 | 625 | if (!$.support.transition) return complete.call(this) 626 | 627 | var scrollSize = $.camelCase(['scroll', dimension].join('-')) 628 | 629 | this.$element 630 | .one('bsTransitionEnd', $.proxy(complete, this)) 631 | .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) 632 | } 633 | 634 | Collapse.prototype.hide = function () { 635 | if (this.transitioning || !this.$element.hasClass('in')) return 636 | 637 | var startEvent = $.Event('hide.bs.collapse') 638 | this.$element.trigger(startEvent) 639 | if (startEvent.isDefaultPrevented()) return 640 | 641 | var dimension = this.dimension() 642 | 643 | this.$element[dimension](this.$element[dimension]())[0].offsetHeight 644 | 645 | this.$element 646 | .addClass('collapsing') 647 | .removeClass('collapse in') 648 | .attr('aria-expanded', false) 649 | 650 | this.$trigger 651 | .addClass('collapsed') 652 | .attr('aria-expanded', false) 653 | 654 | this.transitioning = 1 655 | 656 | var complete = function () { 657 | this.transitioning = 0 658 | this.$element 659 | .removeClass('collapsing') 660 | .addClass('collapse') 661 | .trigger('hidden.bs.collapse') 662 | } 663 | 664 | if (!$.support.transition) return complete.call(this) 665 | 666 | this.$element 667 | [dimension](0) 668 | .one('bsTransitionEnd', $.proxy(complete, this)) 669 | .emulateTransitionEnd(Collapse.TRANSITION_DURATION) 670 | } 671 | 672 | Collapse.prototype.toggle = function () { 673 | this[this.$element.hasClass('in') ? 'hide' : 'show']() 674 | } 675 | 676 | Collapse.prototype.getParent = function () { 677 | return $(this.options.parent) 678 | .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') 679 | .each($.proxy(function (i, element) { 680 | var $element = $(element) 681 | this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) 682 | }, this)) 683 | .end() 684 | } 685 | 686 | Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { 687 | var isOpen = $element.hasClass('in') 688 | 689 | $element.attr('aria-expanded', isOpen) 690 | $trigger 691 | .toggleClass('collapsed', !isOpen) 692 | .attr('aria-expanded', isOpen) 693 | } 694 | 695 | function getTargetFromTrigger($trigger) { 696 | var href 697 | var target = $trigger.attr('data-target') 698 | || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 699 | 700 | return $(target) 701 | } 702 | 703 | 704 | // COLLAPSE PLUGIN DEFINITION 705 | // ========================== 706 | 707 | function Plugin(option) { 708 | return this.each(function () { 709 | var $this = $(this) 710 | var data = $this.data('bs.collapse') 711 | var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) 712 | 713 | if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false 714 | if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) 715 | if (typeof option == 'string') data[option]() 716 | }) 717 | } 718 | 719 | var old = $.fn.collapse 720 | 721 | $.fn.collapse = Plugin 722 | $.fn.collapse.Constructor = Collapse 723 | 724 | 725 | // COLLAPSE NO CONFLICT 726 | // ==================== 727 | 728 | $.fn.collapse.noConflict = function () { 729 | $.fn.collapse = old 730 | return this 731 | } 732 | 733 | 734 | // COLLAPSE DATA-API 735 | // ================= 736 | 737 | $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { 738 | var $this = $(this) 739 | 740 | if (!$this.attr('data-target')) e.preventDefault() 741 | 742 | var $target = getTargetFromTrigger($this) 743 | var data = $target.data('bs.collapse') 744 | var option = data ? 'toggle' : $this.data() 745 | 746 | Plugin.call($target, option) 747 | }) 748 | 749 | }(jQuery); 750 | 751 | /* ======================================================================== 752 | * Bootstrap: dropdown.js v3.3.7 753 | * http://getbootstrap.com/javascript/#dropdowns 754 | * ======================================================================== 755 | * Copyright 2011-2016 Twitter, Inc. 756 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 757 | * ======================================================================== */ 758 | 759 | 760 | +function ($) { 761 | 'use strict'; 762 | 763 | // DROPDOWN CLASS DEFINITION 764 | // ========================= 765 | 766 | var backdrop = '.dropdown-backdrop' 767 | var toggle = '[data-toggle="dropdown"]' 768 | var Dropdown = function (element) { 769 | $(element).on('click.bs.dropdown', this.toggle) 770 | } 771 | 772 | Dropdown.VERSION = '3.3.7' 773 | 774 | function getParent($this) { 775 | var selector = $this.attr('data-target') 776 | 777 | if (!selector) { 778 | selector = $this.attr('href') 779 | selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 780 | } 781 | 782 | var $parent = selector && $(selector) 783 | 784 | return $parent && $parent.length ? $parent : $this.parent() 785 | } 786 | 787 | function clearMenus(e) { 788 | if (e && e.which === 3) return 789 | $(backdrop).remove() 790 | $(toggle).each(function () { 791 | var $this = $(this) 792 | var $parent = getParent($this) 793 | var relatedTarget = { relatedTarget: this } 794 | 795 | if (!$parent.hasClass('open')) return 796 | 797 | if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return 798 | 799 | $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) 800 | 801 | if (e.isDefaultPrevented()) return 802 | 803 | $this.attr('aria-expanded', 'false') 804 | $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) 805 | }) 806 | } 807 | 808 | Dropdown.prototype.toggle = function (e) { 809 | var $this = $(this) 810 | 811 | if ($this.is('.disabled, :disabled')) return 812 | 813 | var $parent = getParent($this) 814 | var isActive = $parent.hasClass('open') 815 | 816 | clearMenus() 817 | 818 | if (!isActive) { 819 | if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { 820 | // if mobile we use a backdrop because click events don't delegate 821 | $(document.createElement('div')) 822 | .addClass('dropdown-backdrop') 823 | .insertAfter($(this)) 824 | .on('click', clearMenus) 825 | } 826 | 827 | var relatedTarget = { relatedTarget: this } 828 | $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) 829 | 830 | if (e.isDefaultPrevented()) return 831 | 832 | $this 833 | .trigger('focus') 834 | .attr('aria-expanded', 'true') 835 | 836 | $parent 837 | .toggleClass('open') 838 | .trigger($.Event('shown.bs.dropdown', relatedTarget)) 839 | } 840 | 841 | return false 842 | } 843 | 844 | Dropdown.prototype.keydown = function (e) { 845 | if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return 846 | 847 | var $this = $(this) 848 | 849 | e.preventDefault() 850 | e.stopPropagation() 851 | 852 | if ($this.is('.disabled, :disabled')) return 853 | 854 | var $parent = getParent($this) 855 | var isActive = $parent.hasClass('open') 856 | 857 | if (!isActive && e.which != 27 || isActive && e.which == 27) { 858 | if (e.which == 27) $parent.find(toggle).trigger('focus') 859 | return $this.trigger('click') 860 | } 861 | 862 | var desc = ' li:not(.disabled):visible a' 863 | var $items = $parent.find('.dropdown-menu' + desc) 864 | 865 | if (!$items.length) return 866 | 867 | var index = $items.index(e.target) 868 | 869 | if (e.which == 38 && index > 0) index-- // up 870 | if (e.which == 40 && index < $items.length - 1) index++ // down 871 | if (!~index) index = 0 872 | 873 | $items.eq(index).trigger('focus') 874 | } 875 | 876 | 877 | // DROPDOWN PLUGIN DEFINITION 878 | // ========================== 879 | 880 | function Plugin(option) { 881 | return this.each(function () { 882 | var $this = $(this) 883 | var data = $this.data('bs.dropdown') 884 | 885 | if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) 886 | if (typeof option == 'string') data[option].call($this) 887 | }) 888 | } 889 | 890 | var old = $.fn.dropdown 891 | 892 | $.fn.dropdown = Plugin 893 | $.fn.dropdown.Constructor = Dropdown 894 | 895 | 896 | // DROPDOWN NO CONFLICT 897 | // ==================== 898 | 899 | $.fn.dropdown.noConflict = function () { 900 | $.fn.dropdown = old 901 | return this 902 | } 903 | 904 | 905 | // APPLY TO STANDARD DROPDOWN ELEMENTS 906 | // =================================== 907 | 908 | $(document) 909 | .on('click.bs.dropdown.data-api', clearMenus) 910 | .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) 911 | .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) 912 | .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) 913 | .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) 914 | 915 | }(jQuery); 916 | 917 | /* ======================================================================== 918 | * Bootstrap: modal.js v3.3.7 919 | * http://getbootstrap.com/javascript/#modals 920 | * ======================================================================== 921 | * Copyright 2011-2016 Twitter, Inc. 922 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 923 | * ======================================================================== */ 924 | 925 | 926 | +function ($) { 927 | 'use strict'; 928 | 929 | // MODAL CLASS DEFINITION 930 | // ====================== 931 | 932 | var Modal = function (element, options) { 933 | this.options = options 934 | this.$body = $(document.body) 935 | this.$element = $(element) 936 | this.$dialog = this.$element.find('.modal-dialog') 937 | this.$backdrop = null 938 | this.isShown = null 939 | this.originalBodyPad = null 940 | this.scrollbarWidth = 0 941 | this.ignoreBackdropClick = false 942 | 943 | if (this.options.remote) { 944 | this.$element 945 | .find('.modal-content') 946 | .load(this.options.remote, $.proxy(function () { 947 | this.$element.trigger('loaded.bs.modal') 948 | }, this)) 949 | } 950 | } 951 | 952 | Modal.VERSION = '3.3.7' 953 | 954 | Modal.TRANSITION_DURATION = 300 955 | Modal.BACKDROP_TRANSITION_DURATION = 150 956 | 957 | Modal.DEFAULTS = { 958 | backdrop: true, 959 | keyboard: true, 960 | show: true 961 | } 962 | 963 | Modal.prototype.toggle = function (_relatedTarget) { 964 | return this.isShown ? this.hide() : this.show(_relatedTarget) 965 | } 966 | 967 | Modal.prototype.show = function (_relatedTarget) { 968 | var that = this 969 | var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) 970 | 971 | this.$element.trigger(e) 972 | 973 | if (this.isShown || e.isDefaultPrevented()) return 974 | 975 | this.isShown = true 976 | 977 | this.checkScrollbar() 978 | this.setScrollbar() 979 | this.$body.addClass('modal-open') 980 | 981 | this.escape() 982 | this.resize() 983 | 984 | this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) 985 | 986 | this.$dialog.on('mousedown.dismiss.bs.modal', function () { 987 | that.$element.one('mouseup.dismiss.bs.modal', function (e) { 988 | if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true 989 | }) 990 | }) 991 | 992 | this.backdrop(function () { 993 | var transition = $.support.transition && that.$element.hasClass('fade') 994 | 995 | if (!that.$element.parent().length) { 996 | that.$element.appendTo(that.$body) // don't move modals dom position 997 | } 998 | 999 | that.$element 1000 | .show() 1001 | .scrollTop(0) 1002 | 1003 | that.adjustDialog() 1004 | 1005 | if (transition) { 1006 | that.$element[0].offsetWidth // force reflow 1007 | } 1008 | 1009 | that.$element.addClass('in') 1010 | 1011 | that.enforceFocus() 1012 | 1013 | var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) 1014 | 1015 | transition ? 1016 | that.$dialog // wait for modal to slide in 1017 | .one('bsTransitionEnd', function () { 1018 | that.$element.trigger('focus').trigger(e) 1019 | }) 1020 | .emulateTransitionEnd(Modal.TRANSITION_DURATION) : 1021 | that.$element.trigger('focus').trigger(e) 1022 | }) 1023 | } 1024 | 1025 | Modal.prototype.hide = function (e) { 1026 | if (e) e.preventDefault() 1027 | 1028 | e = $.Event('hide.bs.modal') 1029 | 1030 | this.$element.trigger(e) 1031 | 1032 | if (!this.isShown || e.isDefaultPrevented()) return 1033 | 1034 | this.isShown = false 1035 | 1036 | this.escape() 1037 | this.resize() 1038 | 1039 | $(document).off('focusin.bs.modal') 1040 | 1041 | this.$element 1042 | .removeClass('in') 1043 | .off('click.dismiss.bs.modal') 1044 | .off('mouseup.dismiss.bs.modal') 1045 | 1046 | this.$dialog.off('mousedown.dismiss.bs.modal') 1047 | 1048 | $.support.transition && this.$element.hasClass('fade') ? 1049 | this.$element 1050 | .one('bsTransitionEnd', $.proxy(this.hideModal, this)) 1051 | .emulateTransitionEnd(Modal.TRANSITION_DURATION) : 1052 | this.hideModal() 1053 | } 1054 | 1055 | Modal.prototype.enforceFocus = function () { 1056 | $(document) 1057 | .off('focusin.bs.modal') // guard against infinite focus loop 1058 | .on('focusin.bs.modal', $.proxy(function (e) { 1059 | if (document !== e.target && 1060 | this.$element[0] !== e.target && 1061 | !this.$element.has(e.target).length) { 1062 | this.$element.trigger('focus') 1063 | } 1064 | }, this)) 1065 | } 1066 | 1067 | Modal.prototype.escape = function () { 1068 | if (this.isShown && this.options.keyboard) { 1069 | this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { 1070 | e.which == 27 && this.hide() 1071 | }, this)) 1072 | } else if (!this.isShown) { 1073 | this.$element.off('keydown.dismiss.bs.modal') 1074 | } 1075 | } 1076 | 1077 | Modal.prototype.resize = function () { 1078 | if (this.isShown) { 1079 | $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) 1080 | } else { 1081 | $(window).off('resize.bs.modal') 1082 | } 1083 | } 1084 | 1085 | Modal.prototype.hideModal = function () { 1086 | var that = this 1087 | this.$element.hide() 1088 | this.backdrop(function () { 1089 | that.$body.removeClass('modal-open') 1090 | that.resetAdjustments() 1091 | that.resetScrollbar() 1092 | that.$element.trigger('hidden.bs.modal') 1093 | }) 1094 | } 1095 | 1096 | Modal.prototype.removeBackdrop = function () { 1097 | this.$backdrop && this.$backdrop.remove() 1098 | this.$backdrop = null 1099 | } 1100 | 1101 | Modal.prototype.backdrop = function (callback) { 1102 | var that = this 1103 | var animate = this.$element.hasClass('fade') ? 'fade' : '' 1104 | 1105 | if (this.isShown && this.options.backdrop) { 1106 | var doAnimate = $.support.transition && animate 1107 | 1108 | this.$backdrop = $(document.createElement('div')) 1109 | .addClass('modal-backdrop ' + animate) 1110 | .appendTo(this.$body) 1111 | 1112 | this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { 1113 | if (this.ignoreBackdropClick) { 1114 | this.ignoreBackdropClick = false 1115 | return 1116 | } 1117 | if (e.target !== e.currentTarget) return 1118 | this.options.backdrop == 'static' 1119 | ? this.$element[0].focus() 1120 | : this.hide() 1121 | }, this)) 1122 | 1123 | if (doAnimate) this.$backdrop[0].offsetWidth // force reflow 1124 | 1125 | this.$backdrop.addClass('in') 1126 | 1127 | if (!callback) return 1128 | 1129 | doAnimate ? 1130 | this.$backdrop 1131 | .one('bsTransitionEnd', callback) 1132 | .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : 1133 | callback() 1134 | 1135 | } else if (!this.isShown && this.$backdrop) { 1136 | this.$backdrop.removeClass('in') 1137 | 1138 | var callbackRemove = function () { 1139 | that.removeBackdrop() 1140 | callback && callback() 1141 | } 1142 | $.support.transition && this.$element.hasClass('fade') ? 1143 | this.$backdrop 1144 | .one('bsTransitionEnd', callbackRemove) 1145 | .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : 1146 | callbackRemove() 1147 | 1148 | } else if (callback) { 1149 | callback() 1150 | } 1151 | } 1152 | 1153 | // these following methods are used to handle overflowing modals 1154 | 1155 | Modal.prototype.handleUpdate = function () { 1156 | this.adjustDialog() 1157 | } 1158 | 1159 | Modal.prototype.adjustDialog = function () { 1160 | var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight 1161 | 1162 | this.$element.css({ 1163 | paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', 1164 | paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' 1165 | }) 1166 | } 1167 | 1168 | Modal.prototype.resetAdjustments = function () { 1169 | this.$element.css({ 1170 | paddingLeft: '', 1171 | paddingRight: '' 1172 | }) 1173 | } 1174 | 1175 | Modal.prototype.checkScrollbar = function () { 1176 | var fullWindowWidth = window.innerWidth 1177 | if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 1178 | var documentElementRect = document.documentElement.getBoundingClientRect() 1179 | fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) 1180 | } 1181 | this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth 1182 | this.scrollbarWidth = this.measureScrollbar() 1183 | } 1184 | 1185 | Modal.prototype.setScrollbar = function () { 1186 | var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) 1187 | this.originalBodyPad = document.body.style.paddingRight || '' 1188 | if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) 1189 | } 1190 | 1191 | Modal.prototype.resetScrollbar = function () { 1192 | this.$body.css('padding-right', this.originalBodyPad) 1193 | } 1194 | 1195 | Modal.prototype.measureScrollbar = function () { // thx walsh 1196 | var scrollDiv = document.createElement('div') 1197 | scrollDiv.className = 'modal-scrollbar-measure' 1198 | this.$body.append(scrollDiv) 1199 | var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth 1200 | this.$body[0].removeChild(scrollDiv) 1201 | return scrollbarWidth 1202 | } 1203 | 1204 | 1205 | // MODAL PLUGIN DEFINITION 1206 | // ======================= 1207 | 1208 | function Plugin(option, _relatedTarget) { 1209 | return this.each(function () { 1210 | var $this = $(this) 1211 | var data = $this.data('bs.modal') 1212 | var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) 1213 | 1214 | if (!data) $this.data('bs.modal', (data = new Modal(this, options))) 1215 | if (typeof option == 'string') data[option](_relatedTarget) 1216 | else if (options.show) data.show(_relatedTarget) 1217 | }) 1218 | } 1219 | 1220 | var old = $.fn.modal 1221 | 1222 | $.fn.modal = Plugin 1223 | $.fn.modal.Constructor = Modal 1224 | 1225 | 1226 | // MODAL NO CONFLICT 1227 | // ================= 1228 | 1229 | $.fn.modal.noConflict = function () { 1230 | $.fn.modal = old 1231 | return this 1232 | } 1233 | 1234 | 1235 | // MODAL DATA-API 1236 | // ============== 1237 | 1238 | $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { 1239 | var $this = $(this) 1240 | var href = $this.attr('href') 1241 | var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 1242 | var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) 1243 | 1244 | if ($this.is('a')) e.preventDefault() 1245 | 1246 | $target.one('show.bs.modal', function (showEvent) { 1247 | if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown 1248 | $target.one('hidden.bs.modal', function () { 1249 | $this.is(':visible') && $this.trigger('focus') 1250 | }) 1251 | }) 1252 | Plugin.call($target, option, this) 1253 | }) 1254 | 1255 | }(jQuery); 1256 | 1257 | /* ======================================================================== 1258 | * Bootstrap: tooltip.js v3.3.7 1259 | * http://getbootstrap.com/javascript/#tooltip 1260 | * Inspired by the original jQuery.tipsy by Jason Frame 1261 | * ======================================================================== 1262 | * Copyright 2011-2016 Twitter, Inc. 1263 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 1264 | * ======================================================================== */ 1265 | 1266 | 1267 | +function ($) { 1268 | 'use strict'; 1269 | 1270 | // TOOLTIP PUBLIC CLASS DEFINITION 1271 | // =============================== 1272 | 1273 | var Tooltip = function (element, options) { 1274 | this.type = null 1275 | this.options = null 1276 | this.enabled = null 1277 | this.timeout = null 1278 | this.hoverState = null 1279 | this.$element = null 1280 | this.inState = null 1281 | 1282 | this.init('tooltip', element, options) 1283 | } 1284 | 1285 | Tooltip.VERSION = '3.3.7' 1286 | 1287 | Tooltip.TRANSITION_DURATION = 150 1288 | 1289 | Tooltip.DEFAULTS = { 1290 | animation: true, 1291 | placement: 'top', 1292 | selector: false, 1293 | template: '', 1294 | trigger: 'hover focus', 1295 | title: '', 1296 | delay: 0, 1297 | html: false, 1298 | container: false, 1299 | viewport: { 1300 | selector: 'body', 1301 | padding: 0 1302 | } 1303 | } 1304 | 1305 | Tooltip.prototype.init = function (type, element, options) { 1306 | this.enabled = true 1307 | this.type = type 1308 | this.$element = $(element) 1309 | this.options = this.getOptions(options) 1310 | this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) 1311 | this.inState = { click: false, hover: false, focus: false } 1312 | 1313 | if (this.$element[0] instanceof document.constructor && !this.options.selector) { 1314 | throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') 1315 | } 1316 | 1317 | var triggers = this.options.trigger.split(' ') 1318 | 1319 | for (var i = triggers.length; i--;) { 1320 | var trigger = triggers[i] 1321 | 1322 | if (trigger == 'click') { 1323 | this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) 1324 | } else if (trigger != 'manual') { 1325 | var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' 1326 | var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' 1327 | 1328 | this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) 1329 | this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) 1330 | } 1331 | } 1332 | 1333 | this.options.selector ? 1334 | (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : 1335 | this.fixTitle() 1336 | } 1337 | 1338 | Tooltip.prototype.getDefaults = function () { 1339 | return Tooltip.DEFAULTS 1340 | } 1341 | 1342 | Tooltip.prototype.getOptions = function (options) { 1343 | options = $.extend({}, this.getDefaults(), this.$element.data(), options) 1344 | 1345 | if (options.delay && typeof options.delay == 'number') { 1346 | options.delay = { 1347 | show: options.delay, 1348 | hide: options.delay 1349 | } 1350 | } 1351 | 1352 | return options 1353 | } 1354 | 1355 | Tooltip.prototype.getDelegateOptions = function () { 1356 | var options = {} 1357 | var defaults = this.getDefaults() 1358 | 1359 | this._options && $.each(this._options, function (key, value) { 1360 | if (defaults[key] != value) options[key] = value 1361 | }) 1362 | 1363 | return options 1364 | } 1365 | 1366 | Tooltip.prototype.enter = function (obj) { 1367 | var self = obj instanceof this.constructor ? 1368 | obj : $(obj.currentTarget).data('bs.' + this.type) 1369 | 1370 | if (!self) { 1371 | self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) 1372 | $(obj.currentTarget).data('bs.' + this.type, self) 1373 | } 1374 | 1375 | if (obj instanceof $.Event) { 1376 | self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true 1377 | } 1378 | 1379 | if (self.tip().hasClass('in') || self.hoverState == 'in') { 1380 | self.hoverState = 'in' 1381 | return 1382 | } 1383 | 1384 | clearTimeout(self.timeout) 1385 | 1386 | self.hoverState = 'in' 1387 | 1388 | if (!self.options.delay || !self.options.delay.show) return self.show() 1389 | 1390 | self.timeout = setTimeout(function () { 1391 | if (self.hoverState == 'in') self.show() 1392 | }, self.options.delay.show) 1393 | } 1394 | 1395 | Tooltip.prototype.isInStateTrue = function () { 1396 | for (var key in this.inState) { 1397 | if (this.inState[key]) return true 1398 | } 1399 | 1400 | return false 1401 | } 1402 | 1403 | Tooltip.prototype.leave = function (obj) { 1404 | var self = obj instanceof this.constructor ? 1405 | obj : $(obj.currentTarget).data('bs.' + this.type) 1406 | 1407 | if (!self) { 1408 | self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) 1409 | $(obj.currentTarget).data('bs.' + this.type, self) 1410 | } 1411 | 1412 | if (obj instanceof $.Event) { 1413 | self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false 1414 | } 1415 | 1416 | if (self.isInStateTrue()) return 1417 | 1418 | clearTimeout(self.timeout) 1419 | 1420 | self.hoverState = 'out' 1421 | 1422 | if (!self.options.delay || !self.options.delay.hide) return self.hide() 1423 | 1424 | self.timeout = setTimeout(function () { 1425 | if (self.hoverState == 'out') self.hide() 1426 | }, self.options.delay.hide) 1427 | } 1428 | 1429 | Tooltip.prototype.show = function () { 1430 | var e = $.Event('show.bs.' + this.type) 1431 | 1432 | if (this.hasContent() && this.enabled) { 1433 | this.$element.trigger(e) 1434 | 1435 | var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) 1436 | if (e.isDefaultPrevented() || !inDom) return 1437 | var that = this 1438 | 1439 | var $tip = this.tip() 1440 | 1441 | var tipId = this.getUID(this.type) 1442 | 1443 | this.setContent() 1444 | $tip.attr('id', tipId) 1445 | this.$element.attr('aria-describedby', tipId) 1446 | 1447 | if (this.options.animation) $tip.addClass('fade') 1448 | 1449 | var placement = typeof this.options.placement == 'function' ? 1450 | this.options.placement.call(this, $tip[0], this.$element[0]) : 1451 | this.options.placement 1452 | 1453 | var autoToken = /\s?auto?\s?/i 1454 | var autoPlace = autoToken.test(placement) 1455 | if (autoPlace) placement = placement.replace(autoToken, '') || 'top' 1456 | 1457 | $tip 1458 | .detach() 1459 | .css({ top: 0, left: 0, display: 'block' }) 1460 | .addClass(placement) 1461 | .data('bs.' + this.type, this) 1462 | 1463 | this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) 1464 | this.$element.trigger('inserted.bs.' + this.type) 1465 | 1466 | var pos = this.getPosition() 1467 | var actualWidth = $tip[0].offsetWidth 1468 | var actualHeight = $tip[0].offsetHeight 1469 | 1470 | if (autoPlace) { 1471 | var orgPlacement = placement 1472 | var viewportDim = this.getPosition(this.$viewport) 1473 | 1474 | placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : 1475 | placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : 1476 | placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : 1477 | placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : 1478 | placement 1479 | 1480 | $tip 1481 | .removeClass(orgPlacement) 1482 | .addClass(placement) 1483 | } 1484 | 1485 | var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) 1486 | 1487 | this.applyPlacement(calculatedOffset, placement) 1488 | 1489 | var complete = function () { 1490 | var prevHoverState = that.hoverState 1491 | that.$element.trigger('shown.bs.' + that.type) 1492 | that.hoverState = null 1493 | 1494 | if (prevHoverState == 'out') that.leave(that) 1495 | } 1496 | 1497 | $.support.transition && this.$tip.hasClass('fade') ? 1498 | $tip 1499 | .one('bsTransitionEnd', complete) 1500 | .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : 1501 | complete() 1502 | } 1503 | } 1504 | 1505 | Tooltip.prototype.applyPlacement = function (offset, placement) { 1506 | var $tip = this.tip() 1507 | var width = $tip[0].offsetWidth 1508 | var height = $tip[0].offsetHeight 1509 | 1510 | // manually read margins because getBoundingClientRect includes difference 1511 | var marginTop = parseInt($tip.css('margin-top'), 10) 1512 | var marginLeft = parseInt($tip.css('margin-left'), 10) 1513 | 1514 | // we must check for NaN for ie 8/9 1515 | if (isNaN(marginTop)) marginTop = 0 1516 | if (isNaN(marginLeft)) marginLeft = 0 1517 | 1518 | offset.top += marginTop 1519 | offset.left += marginLeft 1520 | 1521 | // $.fn.offset doesn't round pixel values 1522 | // so we use setOffset directly with our own function B-0 1523 | $.offset.setOffset($tip[0], $.extend({ 1524 | using: function (props) { 1525 | $tip.css({ 1526 | top: Math.round(props.top), 1527 | left: Math.round(props.left) 1528 | }) 1529 | } 1530 | }, offset), 0) 1531 | 1532 | $tip.addClass('in') 1533 | 1534 | // check to see if placing tip in new offset caused the tip to resize itself 1535 | var actualWidth = $tip[0].offsetWidth 1536 | var actualHeight = $tip[0].offsetHeight 1537 | 1538 | if (placement == 'top' && actualHeight != height) { 1539 | offset.top = offset.top + height - actualHeight 1540 | } 1541 | 1542 | var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) 1543 | 1544 | if (delta.left) offset.left += delta.left 1545 | else offset.top += delta.top 1546 | 1547 | var isVertical = /top|bottom/.test(placement) 1548 | var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight 1549 | var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' 1550 | 1551 | $tip.offset(offset) 1552 | this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) 1553 | } 1554 | 1555 | Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { 1556 | this.arrow() 1557 | .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') 1558 | .css(isVertical ? 'top' : 'left', '') 1559 | } 1560 | 1561 | Tooltip.prototype.setContent = function () { 1562 | var $tip = this.tip() 1563 | var title = this.getTitle() 1564 | 1565 | $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) 1566 | $tip.removeClass('fade in top bottom left right') 1567 | } 1568 | 1569 | Tooltip.prototype.hide = function (callback) { 1570 | var that = this 1571 | var $tip = $(this.$tip) 1572 | var e = $.Event('hide.bs.' + this.type) 1573 | 1574 | function complete() { 1575 | if (that.hoverState != 'in') $tip.detach() 1576 | if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. 1577 | that.$element 1578 | .removeAttr('aria-describedby') 1579 | .trigger('hidden.bs.' + that.type) 1580 | } 1581 | callback && callback() 1582 | } 1583 | 1584 | this.$element.trigger(e) 1585 | 1586 | if (e.isDefaultPrevented()) return 1587 | 1588 | $tip.removeClass('in') 1589 | 1590 | $.support.transition && $tip.hasClass('fade') ? 1591 | $tip 1592 | .one('bsTransitionEnd', complete) 1593 | .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : 1594 | complete() 1595 | 1596 | this.hoverState = null 1597 | 1598 | return this 1599 | } 1600 | 1601 | Tooltip.prototype.fixTitle = function () { 1602 | var $e = this.$element 1603 | if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { 1604 | $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') 1605 | } 1606 | } 1607 | 1608 | Tooltip.prototype.hasContent = function () { 1609 | return this.getTitle() 1610 | } 1611 | 1612 | Tooltip.prototype.getPosition = function ($element) { 1613 | $element = $element || this.$element 1614 | 1615 | var el = $element[0] 1616 | var isBody = el.tagName == 'BODY' 1617 | 1618 | var elRect = el.getBoundingClientRect() 1619 | if (elRect.width == null) { 1620 | // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 1621 | elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) 1622 | } 1623 | var isSvg = window.SVGElement && el instanceof window.SVGElement 1624 | // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. 1625 | // See https://github.com/twbs/bootstrap/issues/20280 1626 | var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) 1627 | var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } 1628 | var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null 1629 | 1630 | return $.extend({}, elRect, scroll, outerDims, elOffset) 1631 | } 1632 | 1633 | Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { 1634 | return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : 1635 | placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : 1636 | placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : 1637 | /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } 1638 | 1639 | } 1640 | 1641 | Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { 1642 | var delta = { top: 0, left: 0 } 1643 | if (!this.$viewport) return delta 1644 | 1645 | var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 1646 | var viewportDimensions = this.getPosition(this.$viewport) 1647 | 1648 | if (/right|left/.test(placement)) { 1649 | var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll 1650 | var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight 1651 | if (topEdgeOffset < viewportDimensions.top) { // top overflow 1652 | delta.top = viewportDimensions.top - topEdgeOffset 1653 | } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow 1654 | delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset 1655 | } 1656 | } else { 1657 | var leftEdgeOffset = pos.left - viewportPadding 1658 | var rightEdgeOffset = pos.left + viewportPadding + actualWidth 1659 | if (leftEdgeOffset < viewportDimensions.left) { // left overflow 1660 | delta.left = viewportDimensions.left - leftEdgeOffset 1661 | } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow 1662 | delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset 1663 | } 1664 | } 1665 | 1666 | return delta 1667 | } 1668 | 1669 | Tooltip.prototype.getTitle = function () { 1670 | var title 1671 | var $e = this.$element 1672 | var o = this.options 1673 | 1674 | title = $e.attr('data-original-title') 1675 | || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) 1676 | 1677 | return title 1678 | } 1679 | 1680 | Tooltip.prototype.getUID = function (prefix) { 1681 | do prefix += ~~(Math.random() * 1000000) 1682 | while (document.getElementById(prefix)) 1683 | return prefix 1684 | } 1685 | 1686 | Tooltip.prototype.tip = function () { 1687 | if (!this.$tip) { 1688 | this.$tip = $(this.options.template) 1689 | if (this.$tip.length != 1) { 1690 | throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') 1691 | } 1692 | } 1693 | return this.$tip 1694 | } 1695 | 1696 | Tooltip.prototype.arrow = function () { 1697 | return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) 1698 | } 1699 | 1700 | Tooltip.prototype.enable = function () { 1701 | this.enabled = true 1702 | } 1703 | 1704 | Tooltip.prototype.disable = function () { 1705 | this.enabled = false 1706 | } 1707 | 1708 | Tooltip.prototype.toggleEnabled = function () { 1709 | this.enabled = !this.enabled 1710 | } 1711 | 1712 | Tooltip.prototype.toggle = function (e) { 1713 | var self = this 1714 | if (e) { 1715 | self = $(e.currentTarget).data('bs.' + this.type) 1716 | if (!self) { 1717 | self = new this.constructor(e.currentTarget, this.getDelegateOptions()) 1718 | $(e.currentTarget).data('bs.' + this.type, self) 1719 | } 1720 | } 1721 | 1722 | if (e) { 1723 | self.inState.click = !self.inState.click 1724 | if (self.isInStateTrue()) self.enter(self) 1725 | else self.leave(self) 1726 | } else { 1727 | self.tip().hasClass('in') ? self.leave(self) : self.enter(self) 1728 | } 1729 | } 1730 | 1731 | Tooltip.prototype.destroy = function () { 1732 | var that = this 1733 | clearTimeout(this.timeout) 1734 | this.hide(function () { 1735 | that.$element.off('.' + that.type).removeData('bs.' + that.type) 1736 | if (that.$tip) { 1737 | that.$tip.detach() 1738 | } 1739 | that.$tip = null 1740 | that.$arrow = null 1741 | that.$viewport = null 1742 | that.$element = null 1743 | }) 1744 | } 1745 | 1746 | 1747 | // TOOLTIP PLUGIN DEFINITION 1748 | // ========================= 1749 | 1750 | function Plugin(option) { 1751 | return this.each(function () { 1752 | var $this = $(this) 1753 | var data = $this.data('bs.tooltip') 1754 | var options = typeof option == 'object' && option 1755 | 1756 | if (!data && /destroy|hide/.test(option)) return 1757 | if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) 1758 | if (typeof option == 'string') data[option]() 1759 | }) 1760 | } 1761 | 1762 | var old = $.fn.tooltip 1763 | 1764 | $.fn.tooltip = Plugin 1765 | $.fn.tooltip.Constructor = Tooltip 1766 | 1767 | 1768 | // TOOLTIP NO CONFLICT 1769 | // =================== 1770 | 1771 | $.fn.tooltip.noConflict = function () { 1772 | $.fn.tooltip = old 1773 | return this 1774 | } 1775 | 1776 | }(jQuery); 1777 | 1778 | /* ======================================================================== 1779 | * Bootstrap: popover.js v3.3.7 1780 | * http://getbootstrap.com/javascript/#popovers 1781 | * ======================================================================== 1782 | * Copyright 2011-2016 Twitter, Inc. 1783 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 1784 | * ======================================================================== */ 1785 | 1786 | 1787 | +function ($) { 1788 | 'use strict'; 1789 | 1790 | // POPOVER PUBLIC CLASS DEFINITION 1791 | // =============================== 1792 | 1793 | var Popover = function (element, options) { 1794 | this.init('popover', element, options) 1795 | } 1796 | 1797 | if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') 1798 | 1799 | Popover.VERSION = '3.3.7' 1800 | 1801 | Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { 1802 | placement: 'right', 1803 | trigger: 'click', 1804 | content: '', 1805 | template: '' 1806 | }) 1807 | 1808 | 1809 | // NOTE: POPOVER EXTENDS tooltip.js 1810 | // ================================ 1811 | 1812 | Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) 1813 | 1814 | Popover.prototype.constructor = Popover 1815 | 1816 | Popover.prototype.getDefaults = function () { 1817 | return Popover.DEFAULTS 1818 | } 1819 | 1820 | Popover.prototype.setContent = function () { 1821 | var $tip = this.tip() 1822 | var title = this.getTitle() 1823 | var content = this.getContent() 1824 | 1825 | $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) 1826 | $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events 1827 | this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' 1828 | ](content) 1829 | 1830 | $tip.removeClass('fade top bottom left right in') 1831 | 1832 | // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do 1833 | // this manually by checking the contents. 1834 | if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() 1835 | } 1836 | 1837 | Popover.prototype.hasContent = function () { 1838 | return this.getTitle() || this.getContent() 1839 | } 1840 | 1841 | Popover.prototype.getContent = function () { 1842 | var $e = this.$element 1843 | var o = this.options 1844 | 1845 | return $e.attr('data-content') 1846 | || (typeof o.content == 'function' ? 1847 | o.content.call($e[0]) : 1848 | o.content) 1849 | } 1850 | 1851 | Popover.prototype.arrow = function () { 1852 | return (this.$arrow = this.$arrow || this.tip().find('.arrow')) 1853 | } 1854 | 1855 | 1856 | // POPOVER PLUGIN DEFINITION 1857 | // ========================= 1858 | 1859 | function Plugin(option) { 1860 | return this.each(function () { 1861 | var $this = $(this) 1862 | var data = $this.data('bs.popover') 1863 | var options = typeof option == 'object' && option 1864 | 1865 | if (!data && /destroy|hide/.test(option)) return 1866 | if (!data) $this.data('bs.popover', (data = new Popover(this, options))) 1867 | if (typeof option == 'string') data[option]() 1868 | }) 1869 | } 1870 | 1871 | var old = $.fn.popover 1872 | 1873 | $.fn.popover = Plugin 1874 | $.fn.popover.Constructor = Popover 1875 | 1876 | 1877 | // POPOVER NO CONFLICT 1878 | // =================== 1879 | 1880 | $.fn.popover.noConflict = function () { 1881 | $.fn.popover = old 1882 | return this 1883 | } 1884 | 1885 | }(jQuery); 1886 | 1887 | /* ======================================================================== 1888 | * Bootstrap: scrollspy.js v3.3.7 1889 | * http://getbootstrap.com/javascript/#scrollspy 1890 | * ======================================================================== 1891 | * Copyright 2011-2016 Twitter, Inc. 1892 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 1893 | * ======================================================================== */ 1894 | 1895 | 1896 | +function ($) { 1897 | 'use strict'; 1898 | 1899 | // SCROLLSPY CLASS DEFINITION 1900 | // ========================== 1901 | 1902 | function ScrollSpy(element, options) { 1903 | this.$body = $(document.body) 1904 | this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) 1905 | this.options = $.extend({}, ScrollSpy.DEFAULTS, options) 1906 | this.selector = (this.options.target || '') + ' .nav li > a' 1907 | this.offsets = [] 1908 | this.targets = [] 1909 | this.activeTarget = null 1910 | this.scrollHeight = 0 1911 | 1912 | this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) 1913 | this.refresh() 1914 | this.process() 1915 | } 1916 | 1917 | ScrollSpy.VERSION = '3.3.7' 1918 | 1919 | ScrollSpy.DEFAULTS = { 1920 | offset: 10 1921 | } 1922 | 1923 | ScrollSpy.prototype.getScrollHeight = function () { 1924 | return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) 1925 | } 1926 | 1927 | ScrollSpy.prototype.refresh = function () { 1928 | var that = this 1929 | var offsetMethod = 'offset' 1930 | var offsetBase = 0 1931 | 1932 | this.offsets = [] 1933 | this.targets = [] 1934 | this.scrollHeight = this.getScrollHeight() 1935 | 1936 | if (!$.isWindow(this.$scrollElement[0])) { 1937 | offsetMethod = 'position' 1938 | offsetBase = this.$scrollElement.scrollTop() 1939 | } 1940 | 1941 | this.$body 1942 | .find(this.selector) 1943 | .map(function () { 1944 | var $el = $(this) 1945 | var href = $el.data('target') || $el.attr('href') 1946 | var $href = /^#./.test(href) && $(href) 1947 | 1948 | return ($href 1949 | && $href.length 1950 | && $href.is(':visible') 1951 | && [[$href[offsetMethod]().top + offsetBase, href]]) || null 1952 | }) 1953 | .sort(function (a, b) { return a[0] - b[0] }) 1954 | .each(function () { 1955 | that.offsets.push(this[0]) 1956 | that.targets.push(this[1]) 1957 | }) 1958 | } 1959 | 1960 | ScrollSpy.prototype.process = function () { 1961 | var scrollTop = this.$scrollElement.scrollTop() + this.options.offset 1962 | var scrollHeight = this.getScrollHeight() 1963 | var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() 1964 | var offsets = this.offsets 1965 | var targets = this.targets 1966 | var activeTarget = this.activeTarget 1967 | var i 1968 | 1969 | if (this.scrollHeight != scrollHeight) { 1970 | this.refresh() 1971 | } 1972 | 1973 | if (scrollTop >= maxScroll) { 1974 | return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) 1975 | } 1976 | 1977 | if (activeTarget && scrollTop < offsets[0]) { 1978 | this.activeTarget = null 1979 | return this.clear() 1980 | } 1981 | 1982 | for (i = offsets.length; i--;) { 1983 | activeTarget != targets[i] 1984 | && scrollTop >= offsets[i] 1985 | && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) 1986 | && this.activate(targets[i]) 1987 | } 1988 | } 1989 | 1990 | ScrollSpy.prototype.activate = function (target) { 1991 | this.activeTarget = target 1992 | 1993 | this.clear() 1994 | 1995 | var selector = this.selector + 1996 | '[data-target="' + target + '"],' + 1997 | this.selector + '[href="' + target + '"]' 1998 | 1999 | var active = $(selector) 2000 | .parents('li') 2001 | .addClass('active') 2002 | 2003 | if (active.parent('.dropdown-menu').length) { 2004 | active = active 2005 | .closest('li.dropdown') 2006 | .addClass('active') 2007 | } 2008 | 2009 | active.trigger('activate.bs.scrollspy') 2010 | } 2011 | 2012 | ScrollSpy.prototype.clear = function () { 2013 | $(this.selector) 2014 | .parentsUntil(this.options.target, '.active') 2015 | .removeClass('active') 2016 | } 2017 | 2018 | 2019 | // SCROLLSPY PLUGIN DEFINITION 2020 | // =========================== 2021 | 2022 | function Plugin(option) { 2023 | return this.each(function () { 2024 | var $this = $(this) 2025 | var data = $this.data('bs.scrollspy') 2026 | var options = typeof option == 'object' && option 2027 | 2028 | if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) 2029 | if (typeof option == 'string') data[option]() 2030 | }) 2031 | } 2032 | 2033 | var old = $.fn.scrollspy 2034 | 2035 | $.fn.scrollspy = Plugin 2036 | $.fn.scrollspy.Constructor = ScrollSpy 2037 | 2038 | 2039 | // SCROLLSPY NO CONFLICT 2040 | // ===================== 2041 | 2042 | $.fn.scrollspy.noConflict = function () { 2043 | $.fn.scrollspy = old 2044 | return this 2045 | } 2046 | 2047 | 2048 | // SCROLLSPY DATA-API 2049 | // ================== 2050 | 2051 | $(window).on('load.bs.scrollspy.data-api', function () { 2052 | $('[data-spy="scroll"]').each(function () { 2053 | var $spy = $(this) 2054 | Plugin.call($spy, $spy.data()) 2055 | }) 2056 | }) 2057 | 2058 | }(jQuery); 2059 | 2060 | /* ======================================================================== 2061 | * Bootstrap: tab.js v3.3.7 2062 | * http://getbootstrap.com/javascript/#tabs 2063 | * ======================================================================== 2064 | * Copyright 2011-2016 Twitter, Inc. 2065 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 2066 | * ======================================================================== */ 2067 | 2068 | 2069 | +function ($) { 2070 | 'use strict'; 2071 | 2072 | // TAB CLASS DEFINITION 2073 | // ==================== 2074 | 2075 | var Tab = function (element) { 2076 | // jscs:disable requireDollarBeforejQueryAssignment 2077 | this.element = $(element) 2078 | // jscs:enable requireDollarBeforejQueryAssignment 2079 | } 2080 | 2081 | Tab.VERSION = '3.3.7' 2082 | 2083 | Tab.TRANSITION_DURATION = 150 2084 | 2085 | Tab.prototype.show = function () { 2086 | var $this = this.element 2087 | var $ul = $this.closest('ul:not(.dropdown-menu)') 2088 | var selector = $this.data('target') 2089 | 2090 | if (!selector) { 2091 | selector = $this.attr('href') 2092 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 2093 | } 2094 | 2095 | if ($this.parent('li').hasClass('active')) return 2096 | 2097 | var $previous = $ul.find('.active:last a') 2098 | var hideEvent = $.Event('hide.bs.tab', { 2099 | relatedTarget: $this[0] 2100 | }) 2101 | var showEvent = $.Event('show.bs.tab', { 2102 | relatedTarget: $previous[0] 2103 | }) 2104 | 2105 | $previous.trigger(hideEvent) 2106 | $this.trigger(showEvent) 2107 | 2108 | if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return 2109 | 2110 | var $target = $(selector) 2111 | 2112 | this.activate($this.closest('li'), $ul) 2113 | this.activate($target, $target.parent(), function () { 2114 | $previous.trigger({ 2115 | type: 'hidden.bs.tab', 2116 | relatedTarget: $this[0] 2117 | }) 2118 | $this.trigger({ 2119 | type: 'shown.bs.tab', 2120 | relatedTarget: $previous[0] 2121 | }) 2122 | }) 2123 | } 2124 | 2125 | Tab.prototype.activate = function (element, container, callback) { 2126 | var $active = container.find('> .active') 2127 | var transition = callback 2128 | && $.support.transition 2129 | && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) 2130 | 2131 | function next() { 2132 | $active 2133 | .removeClass('active') 2134 | .find('> .dropdown-menu > .active') 2135 | .removeClass('active') 2136 | .end() 2137 | .find('[data-toggle="tab"]') 2138 | .attr('aria-expanded', false) 2139 | 2140 | element 2141 | .addClass('active') 2142 | .find('[data-toggle="tab"]') 2143 | .attr('aria-expanded', true) 2144 | 2145 | if (transition) { 2146 | element[0].offsetWidth // reflow for transition 2147 | element.addClass('in') 2148 | } else { 2149 | element.removeClass('fade') 2150 | } 2151 | 2152 | if (element.parent('.dropdown-menu').length) { 2153 | element 2154 | .closest('li.dropdown') 2155 | .addClass('active') 2156 | .end() 2157 | .find('[data-toggle="tab"]') 2158 | .attr('aria-expanded', true) 2159 | } 2160 | 2161 | callback && callback() 2162 | } 2163 | 2164 | $active.length && transition ? 2165 | $active 2166 | .one('bsTransitionEnd', next) 2167 | .emulateTransitionEnd(Tab.TRANSITION_DURATION) : 2168 | next() 2169 | 2170 | $active.removeClass('in') 2171 | } 2172 | 2173 | 2174 | // TAB PLUGIN DEFINITION 2175 | // ===================== 2176 | 2177 | function Plugin(option) { 2178 | return this.each(function () { 2179 | var $this = $(this) 2180 | var data = $this.data('bs.tab') 2181 | 2182 | if (!data) $this.data('bs.tab', (data = new Tab(this))) 2183 | if (typeof option == 'string') data[option]() 2184 | }) 2185 | } 2186 | 2187 | var old = $.fn.tab 2188 | 2189 | $.fn.tab = Plugin 2190 | $.fn.tab.Constructor = Tab 2191 | 2192 | 2193 | // TAB NO CONFLICT 2194 | // =============== 2195 | 2196 | $.fn.tab.noConflict = function () { 2197 | $.fn.tab = old 2198 | return this 2199 | } 2200 | 2201 | 2202 | // TAB DATA-API 2203 | // ============ 2204 | 2205 | var clickHandler = function (e) { 2206 | e.preventDefault() 2207 | Plugin.call($(this), 'show') 2208 | } 2209 | 2210 | $(document) 2211 | .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) 2212 | .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) 2213 | 2214 | }(jQuery); 2215 | 2216 | /* ======================================================================== 2217 | * Bootstrap: affix.js v3.3.7 2218 | * http://getbootstrap.com/javascript/#affix 2219 | * ======================================================================== 2220 | * Copyright 2011-2016 Twitter, Inc. 2221 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 2222 | * ======================================================================== */ 2223 | 2224 | 2225 | +function ($) { 2226 | 'use strict'; 2227 | 2228 | // AFFIX CLASS DEFINITION 2229 | // ====================== 2230 | 2231 | var Affix = function (element, options) { 2232 | this.options = $.extend({}, Affix.DEFAULTS, options) 2233 | 2234 | this.$target = $(this.options.target) 2235 | .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) 2236 | .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) 2237 | 2238 | this.$element = $(element) 2239 | this.affixed = null 2240 | this.unpin = null 2241 | this.pinnedOffset = null 2242 | 2243 | this.checkPosition() 2244 | } 2245 | 2246 | Affix.VERSION = '3.3.7' 2247 | 2248 | Affix.RESET = 'affix affix-top affix-bottom' 2249 | 2250 | Affix.DEFAULTS = { 2251 | offset: 0, 2252 | target: window 2253 | } 2254 | 2255 | Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { 2256 | var scrollTop = this.$target.scrollTop() 2257 | var position = this.$element.offset() 2258 | var targetHeight = this.$target.height() 2259 | 2260 | if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false 2261 | 2262 | if (this.affixed == 'bottom') { 2263 | if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' 2264 | return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' 2265 | } 2266 | 2267 | var initializing = this.affixed == null 2268 | var colliderTop = initializing ? scrollTop : position.top 2269 | var colliderHeight = initializing ? targetHeight : height 2270 | 2271 | if (offsetTop != null && scrollTop <= offsetTop) return 'top' 2272 | if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' 2273 | 2274 | return false 2275 | } 2276 | 2277 | Affix.prototype.getPinnedOffset = function () { 2278 | if (this.pinnedOffset) return this.pinnedOffset 2279 | this.$element.removeClass(Affix.RESET).addClass('affix') 2280 | var scrollTop = this.$target.scrollTop() 2281 | var position = this.$element.offset() 2282 | return (this.pinnedOffset = position.top - scrollTop) 2283 | } 2284 | 2285 | Affix.prototype.checkPositionWithEventLoop = function () { 2286 | setTimeout($.proxy(this.checkPosition, this), 1) 2287 | } 2288 | 2289 | Affix.prototype.checkPosition = function () { 2290 | if (!this.$element.is(':visible')) return 2291 | 2292 | var height = this.$element.height() 2293 | var offset = this.options.offset 2294 | var offsetTop = offset.top 2295 | var offsetBottom = offset.bottom 2296 | var scrollHeight = Math.max($(document).height(), $(document.body).height()) 2297 | 2298 | if (typeof offset != 'object') offsetBottom = offsetTop = offset 2299 | if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) 2300 | if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) 2301 | 2302 | var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) 2303 | 2304 | if (this.affixed != affix) { 2305 | if (this.unpin != null) this.$element.css('top', '') 2306 | 2307 | var affixType = 'affix' + (affix ? '-' + affix : '') 2308 | var e = $.Event(affixType + '.bs.affix') 2309 | 2310 | this.$element.trigger(e) 2311 | 2312 | if (e.isDefaultPrevented()) return 2313 | 2314 | this.affixed = affix 2315 | this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null 2316 | 2317 | this.$element 2318 | .removeClass(Affix.RESET) 2319 | .addClass(affixType) 2320 | .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') 2321 | } 2322 | 2323 | if (affix == 'bottom') { 2324 | this.$element.offset({ 2325 | top: scrollHeight - height - offsetBottom 2326 | }) 2327 | } 2328 | } 2329 | 2330 | 2331 | // AFFIX PLUGIN DEFINITION 2332 | // ======================= 2333 | 2334 | function Plugin(option) { 2335 | return this.each(function () { 2336 | var $this = $(this) 2337 | var data = $this.data('bs.affix') 2338 | var options = typeof option == 'object' && option 2339 | 2340 | if (!data) $this.data('bs.affix', (data = new Affix(this, options))) 2341 | if (typeof option == 'string') data[option]() 2342 | }) 2343 | } 2344 | 2345 | var old = $.fn.affix 2346 | 2347 | $.fn.affix = Plugin 2348 | $.fn.affix.Constructor = Affix 2349 | 2350 | 2351 | // AFFIX NO CONFLICT 2352 | // ================= 2353 | 2354 | $.fn.affix.noConflict = function () { 2355 | $.fn.affix = old 2356 | return this 2357 | } 2358 | 2359 | 2360 | // AFFIX DATA-API 2361 | // ============== 2362 | 2363 | $(window).on('load', function () { 2364 | $('[data-spy="affix"]').each(function () { 2365 | var $spy = $(this) 2366 | var data = $spy.data() 2367 | 2368 | data.offset = data.offset || {} 2369 | 2370 | if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom 2371 | if (data.offsetTop != null) data.offset.top = data.offsetTop 2372 | 2373 | Plugin.call($spy, data) 2374 | }) 2375 | }) 2376 | 2377 | }(jQuery); 2378 | -------------------------------------------------------------------------------- /static/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under the MIT license 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); --------------------------------------------------------------------------------