rrrspec-web 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/assets/javascripts/helpers.coffee +27 -0
  4. data/assets/javascripts/index.coffee +75 -0
  5. data/{app/js → assets/javascripts}/models.coffee +41 -69
  6. data/assets/javascripts/tasksets.coffee +400 -0
  7. data/{app/js → assets/javascripts}/vendor/backbone-min.js +0 -0
  8. data/{app/js → assets/javascripts}/vendor/backbone-min.map +0 -0
  9. data/{app/js → assets/javascripts}/vendor/backbone.js +0 -0
  10. data/assets/javascripts/vendor/handlebars-v1.3.0.js +2746 -0
  11. data/{app/js → assets/javascripts}/vendor/jquery-1.10.2.js +0 -0
  12. data/{app/js → assets/javascripts}/vendor/jquery-1.10.2.min.js +0 -0
  13. data/{app/js → assets/javascripts}/vendor/jquery-1.10.2.min.map +0 -0
  14. data/{app/js → assets/javascripts}/vendor/moment.min.js +0 -0
  15. data/{app/js → assets/javascripts}/vendor/underscore-min.js +0 -0
  16. data/{app/js → assets/javascripts}/vendor/underscore-min.map +0 -0
  17. data/{app/js → assets/javascripts}/vendor/underscore.js +0 -0
  18. data/assets/stylesheets/application.sass +188 -0
  19. data/lib/rrrspec/web/api.rb +61 -0
  20. data/lib/rrrspec/web/app.rb +9 -30
  21. data/lib/rrrspec/web/configuration.rb +1 -0
  22. data/lib/rrrspec/web/persistent_models.rb +7 -2
  23. data/lib/rrrspec/web/version.rb +1 -1
  24. data/rrrspec-web.gemspec +9 -7
  25. data/spec/rrrspec/web/api_spec.rb +278 -47
  26. data/tasks/assets.rake +3 -6
  27. data/views/index.haml +4 -14
  28. data/views/taskset.haml +61 -68
  29. data/views/user.haml +2 -2
  30. metadata +108 -84
  31. data/app/css/application.sass +0 -124
  32. data/app/css/vendor/bootstrap-theme.css +0 -384
  33. data/app/css/vendor/bootstrap-theme.min.css +0 -1
  34. data/app/css/vendor/bootstrap.css +0 -6805
  35. data/app/css/vendor/bootstrap.min.css +0 -9
  36. data/app/js/index.coffee +0 -51
  37. data/app/js/tasksets.coffee +0 -305
  38. data/app/js/vendor/bootstrap.js +0 -1999
  39. data/app/js/vendor/bootstrap.min.js +0 -6
  40. data/app/js/vendor/mustache.js +0 -551
@@ -1,9 +0,0 @@
1
- /*!
2
- * Bootstrap v3.0.0
3
- *
4
- * Copyright 2013 Twitter, Inc
5
- * Licensed under the Apache License v2.0
6
- * http://www.apache.org/licenses/LICENSE-2.0
7
- *
8
- * Designed and built with all the love in the world by @mdo and @fat.
9
- *//*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}button,input,select[multiple],textarea{background-image:none}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16.099999999999998px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-warning{color:#c09853}.text-danger{color:#b94a48}.text-success{color:#468847}.text-info{color:#3a87ad}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}h1 small,.h1 small{font-size:24px}h2 small,.h2 small{font-size:18px}h3 small,.h3 small,h4 small,.h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.428571429;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.428571429}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11{float:left}.col-xs-1{width:8.333333333333332%}.col-xs-2{width:16.666666666666664%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333333333%}.col-xs-5{width:41.66666666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333333333336%}.col-xs-8{width:66.66666666666666%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333333334%}.col-xs-11{width:91.66666666666666%}.col-xs-12{width:100%}@media(min-width:768px){.container{max-width:750px}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media(min-width:992px){.container{max-width:970px}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media(min-width:1200px){.container{max-width:1170px}.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table thead>tr>th,.table tbody>tr>th,.table tfoot>tr>th,.table thead>tr>td,.table tbody>tr>td,.table tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed thead>tr>th,.table-condensed tbody>tr>th,.table-condensed tfoot>tr>th,.table-condensed thead>tr>td,.table-condensed tbody>tr>td,.table-condensed tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8;border-color:#d6e9c6}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td{background-color:#d0e9c6;border-color:#c9e2b3}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede;border-color:#eed3d7}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td{background-color:#ebcccc;border-color:#e6c1c7}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3;border-color:#fbeed5}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td{background-color:#faf2cc;border-color:#f8e5be}@media(max-width:768px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0;background-color:#fff}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>thead>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>thead>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .help-block,.has-error .control-label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .help-block,.has-success .control-label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{padding-top:7px;margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-print:before{content:"\e045"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-briefcase:before{content:"\1f4bc"}.glyphicon-calendar:before{content:"\1f4c5"}.glyphicon-pushpin:before{content:"\1f4cc"}.glyphicon-paperclip:before{content:"\1f4ce"}.glyphicon-camera:before{content:"\1f4f7"}.glyphicon-lock:before{content:"\1f512"}.glyphicon-bell:before{content:"\1f514"}.glyphicon-bookmark:before{content:"\1f516"}.glyphicon-fire:before{content:"\1f525"}.glyphicon-wrench:before{content:"\1f527"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid #000;border-right:4px solid transparent;border-bottom:0 dotted;border-left:4px solid transparent;content:""}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#428bca}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0 dotted;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-default .caret{border-top-color:#333}.btn-primary .caret,.btn-success .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret{border-top-color:#fff}.dropup .btn-default .caret{border-bottom-color:#333}.dropup .btn-primary .caret,.dropup .btn-success .caret,.dropup .btn-warning .caret,.dropup .btn-danger .caret,.dropup .btn-info .caret{border-bottom-color:#fff}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:5px 10px;padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified .btn{display:table-cell;float:none;width:1%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}}.nav-tabs.nav-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs.nav-justified>.active>a{border-bottom-color:#fff}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:5px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs-justified>.active>a{border-bottom-color:#fff}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.nav .caret{border-top-color:#428bca;border-bottom-color:#428bca}.nav a:hover .caret{border-top-color:#2a6496;border-bottom-color:#2a6496}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;z-index:1000;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-collapse .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-collapse .navbar-text:last-child{margin-right:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;border-width:0 0 1px}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;z-index:1030}.navbar-fixed-bottom{bottom:0;margin-bottom:0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-text{float:left;margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{margin-right:15px;margin-left:15px}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e6e6e6}.navbar-default .navbar-nav>.dropdown>a:hover .caret,.navbar-default .navbar-nav>.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:hover .caret,.navbar-default .navbar-nav>.open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.btn .badge{position:relative;top:-1px}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.thumbnail{display:inline-block;display:block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img{display:block;height:auto;max-width:100%}a.thumbnail:hover,a.thumbnail:focus{border-color:#428bca}.thumbnail>img{margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table{margin-bottom:0}.panel>.panel-body+.table{border-top:1px solid #ddd}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;margin-bottom:0;font-size:16px}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#fbeed5}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#eed3d7}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#eed3d7}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}body.modal-open,.modal-open .navbar-fixed-top,.modal-open .navbar-fixed-bottom{margin-right:15px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{z-index:1050;width:auto;padding:10px;margin-right:auto;margin-left:auto}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{right:auto;left:50%;width:600px;padding-top:30px;padding-bottom:30px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;left:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media screen and (max-width:400px){@-ms-viewport{width:320px}}.hidden{display:none!important;visibility:hidden!important}.visible-xs{display:none!important}tr.visible-xs{display:none!important}th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm{display:none!important}tr.visible-sm{display:none!important}th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md{display:none!important}tr.visible-md{display:none!important}th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg{display:none!important}tr.visible-lg{display:none!important}th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs{display:none!important}tr.hidden-xs{display:none!important}th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm{display:none!important}tr.hidden-xs.hidden-sm{display:none!important}th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md{display:none!important}tr.hidden-xs.hidden-md{display:none!important}th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg{display:none!important}tr.hidden-xs.hidden-lg{display:none!important}th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs{display:none!important}tr.hidden-sm.hidden-xs{display:none!important}th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}tr.hidden-sm{display:none!important}th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md{display:none!important}tr.hidden-sm.hidden-md{display:none!important}th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg{display:none!important}tr.hidden-sm.hidden-lg{display:none!important}th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs{display:none!important}tr.hidden-md.hidden-xs{display:none!important}th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm{display:none!important}tr.hidden-md.hidden-sm{display:none!important}th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}tr.hidden-md{display:none!important}th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg{display:none!important}tr.hidden-md.hidden-lg{display:none!important}th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs{display:none!important}tr.hidden-lg.hidden-xs{display:none!important}th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm{display:none!important}tr.hidden-lg.hidden-sm{display:none!important}th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md{display:none!important}tr.hidden-lg.hidden-md{display:none!important}th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg{display:none!important}tr.hidden-lg{display:none!important}th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print{display:none!important}tr.visible-print{display:none!important}th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print{display:none!important}tr.hidden-print{display:none!important}th.hidden-print,td.hidden-print{display:none!important}}
@@ -1,51 +0,0 @@
1
- class TasksetsView extends Backbone.View
2
- initialize: (options) ->
3
- @subviews = []
4
- @listenTo(@collection, "add", @appendItem)
5
- @$('.previous').click(=>
6
- @$('.tasksets').empty()
7
- @subviews = []
8
- @collection.fetchPreviousPage(success: -> @render)
9
- )
10
- @$('.next').click(=>
11
- @$('.tasksets').empty()
12
- @subviews = []
13
- @collection.fetchNextPage(success: -> @render)
14
- )
15
- @render()
16
- for obj in @collection.models
17
- @appendItem(obj)
18
-
19
- appendItem: (model) ->
20
- view = new TasksetView({model: model})
21
- @subviews.push(view)
22
- view.render()
23
- @$('.tasksets').append(view.$el)
24
-
25
- render: ->
26
- for view in @subviews
27
- view.render()
28
-
29
- class TasksetView extends Backbone.View
30
- tagName: 'li'
31
- className: 'list-group-item'
32
-
33
- render: ->
34
- @$el.html(Mustache.render($('#taskset-template').html(), @model.forTemplate()))
35
-
36
- $(->
37
- actives = new ActiveTasksets()
38
- actives.fetch()
39
- activesView = new TasksetsView({collection: actives, el: '.active-tasksets'})
40
- activesView.render()
41
-
42
- recents = new RecentTasksets()
43
- recents.fetch()
44
- recentsView = new TasksetsView({collection: recents, el: '.recent-tasksets'})
45
- recentsView.render()
46
-
47
- slave_failed = new SlaveFailedTasksets()
48
- slave_failed .fetch()
49
- recentsView = new TasksetsView({collection: slave_failed, el: '.slave-failed-tasksets'})
50
- recentsView.render()
51
- )
@@ -1,305 +0,0 @@
1
-
2
- dateFormat = (date)->
3
- moment(date).format("YYYY-MM-DD HH:mm:ss z")
4
-
5
- dateDuration = (start, finish)->
6
- moment.duration(moment(finish).diff(moment(start))).humanize()
7
-
8
- taskIdFromTrialId = (trialId)->
9
- trialId.match(/^(.*):trial:/)[1]
10
-
11
- class TasksetRouter extends Backbone.Router
12
- routes:
13
- 'slave/:slave_id': 'slave'
14
- 'trial/:trial_id': 'trial'
15
-
16
- router = new TasksetRouter()
17
- Backbone.history.start()
18
-
19
- class TasksetView extends Backbone.View
20
- el: '.taskset'
21
-
22
- initialize: ->
23
- @headView = new HeadView({model: @model})
24
- @progressbarView = new ProgressBarView({model: @model})
25
- @taskListView = new TaskListView({collection: @model.get('tasks')})
26
- @workerLogListView = new WorkerLogListView({collection: @model.get('worker_logs')})
27
- @slaveListView = new SlaveListView({collection: @model.get('slaves')})
28
-
29
- render: ->
30
- @headView.render()
31
- @progressbarView.render()
32
- @taskListView.render()
33
- @workerLogListView.render()
34
- @slaveListView.render()
35
-
36
- class HeadView extends Backbone.View
37
- el: '.head'
38
-
39
- render: ->
40
- @$el.html(Mustache.render($('#head-template').html(), @model.forTemplate()))
41
- @$('.panel-heading .status').addClass(
42
- switch @model.get('status')
43
- when 'running' then 'label-active'
44
- when 'succeeded' then 'label-success'
45
- when 'cancelled' then 'label-warning'
46
- when 'failed' then 'label-danger'
47
- else ''
48
- )
49
-
50
- class ProgressBarView extends Backbone.View
51
- el: '.progressbars'
52
-
53
- render: ->
54
- tasks = @model.get('tasks')
55
- if @model.isFinished()
56
- @$('.spec-progress').removeClass('progress-striped active')
57
- @$('.spec-progress-bar').attr('style', 'width: 0%')
58
- @$('.spec-progress-bar').text('')
59
- if tasks.numPassedTask > 0
60
- @$('.passed-spec-bar').attr('style', "width: #{100*tasks.numPassedTask/tasks.numTask}%")
61
- @$('.passed-spec-bar').text(tasks.numPassedTask)
62
- if tasks.numPendingTask > 0
63
- @$('.pending-spec-bar').attr('style', "width: #{100*tasks.numPendingTask/tasks.numTask}%")
64
- @$('.pending-spec-bar').text(tasks.numPendingTask)
65
- if tasks.numFailedTask > 0
66
- @$('.failed-spec-bar').attr('style', "width: #{100*tasks.numFailedTask/tasks.numTask}%")
67
- @$('.failed-spec-bar').text(tasks.numFailedTask)
68
- else
69
- numFinishedTask = tasks.numPassedTask + tasks.numPendingTask + tasks.numFailedTask
70
- percentage = 100*numFinishedTask/tasks.numTask
71
- @$('.spec-progress').addClass('progress-striped active')
72
- @$('.spec-progress-bar').attr('style', "width: #{percentage}%")
73
- @$('.spec-progress-bar').text("#{numFinishedTask}/#{tasks.numTask}(#{percentage}%)")
74
- @$('.passed-spec-bar').attr('style', 'width: 0%')
75
- @$('.passed-spec-bar').text('')
76
- @$('.pending-spec-bar').attr('style', 'width: 0%')
77
- @$('.pending-spec-bar').text('')
78
- @$('.failed-spec-bar').attr('style', 'width: 0%')
79
- @$('.failed-spec-bar').text('')
80
-
81
- if tasks.numPassedExample > 0
82
- @$('.passed-example-bar').attr('style', "width: #{100*tasks.numPassedExample/tasks.numExample}%")
83
- @$('.passed-example-bar').text(tasks.numPassedExample)
84
- else
85
- @$('.passed-example-bar').attr('style', "width: 0%")
86
- @$('.passed-example-bar').text('')
87
- if tasks.numPendingExample > 0
88
- @$('.pending-example-bar').attr('style', "width: #{100*tasks.numPendingExample/tasks.numExample}%")
89
- @$('.pending-example-bar').text(tasks.numPendingExample)
90
- else
91
- @$('.pending-example-bar').attr('style', "width: 0%")
92
- @$('.pending-example-bar').text('')
93
- if tasks.numFailedExample > 0
94
- @$('.failed-example-bar').attr('style', "width: #{100*tasks.numFailedExample/tasks.numExample}%")
95
- @$('.failed-example-bar').text(tasks.numFailedExample)
96
- else
97
- @$('.failed-example-bar').attr('style', "width: 0%")
98
- @$('.failed-example-bar').text('')
99
-
100
- class TaskListView extends Backbone.View
101
- el: '.tasklist'
102
-
103
- initialize: (options) ->
104
- @subviews = {}
105
- @$ul = @$('.tasklist-list')
106
- @heading = @$('.panel-heading')
107
- @heading.click(=>
108
- if @heading.text() == "FAILED TASKS"
109
- @heading.text("TASKS")
110
- else
111
- @heading.text("FAILED TASKS")
112
- for key, view of @subviews
113
- view.toggle()
114
- )
115
- for model in @collection.models
116
- @appendItem(model)
117
- router.on('route:trial', (trialId) =>
118
- taskId = taskIdFromTrialId(trialId)
119
- target = @subviews[taskId]
120
- target.show()
121
- target.showBody()
122
- target.scrollIntoViewOfTrial(trialId)
123
- )
124
-
125
- appendItem: (model) ->
126
- view = new TaskView({model: model})
127
- @subviews[model.attributes.key] = view
128
- view.render()
129
- @$ul.append(view.$el)
130
-
131
- render: ->
132
- for key, view in @subviews
133
- view.render()
134
-
135
- class TaskView extends Backbone.View
136
- tagName: 'li'
137
- className: 'list-group-item'
138
-
139
- initialize: (options) ->
140
- @subviews = {}
141
- render: ->
142
- @$el.html(Mustache.render($('#tasklist-template').html(), @model.forTemplate()))
143
- body = @$('.body')
144
- @$('.header').click(-> body.collapse('toggle'))
145
- switch @model.get('status')
146
- when 'running' then @$el.addClass('running')
147
- when 'passed' then @$el.addClass('passed')
148
- when 'pending' then @$el.addClass('pending')
149
- when 'failed' then @$el.addClass('failed')
150
-
151
- trialsContainer = @$('.trials')
152
- for trial in @model.get('trials')
153
- view = new TrialView({model: trial})
154
- @subviews[trial.attributes.key] = view
155
- view.render()
156
- trialsContainer.append(view.$el)
157
-
158
- if @shouldHide()
159
- @$el.addClass('hidden')
160
-
161
- shouldHide: ->
162
- status = @model.get('status')
163
- return status == 'passed' || status == 'pending'
164
-
165
- toggle: ->
166
- if @shouldHide()
167
- @$el.toggleClass('hidden')
168
-
169
- show: ->
170
- @$el.removeClass('hidden')
171
-
172
- showBody: ->
173
- @$('.body').collapse('show')
174
-
175
- scrollIntoViewOfTrial: (trialId) ->
176
- @subviews[trialId].scrollIntoView()
177
-
178
- class TrialView extends Backbone.View
179
- className: 'panel'
180
-
181
- render: ->
182
- @$el.html(Mustache.render($('#trial-template').html(), @model.forTemplate()))
183
-
184
- scrollIntoView: ->
185
- $('html, body').animate(
186
- scrollTop: @$el.offset().top
187
- )
188
-
189
- class WorkerLogListView extends Backbone.View
190
- el: '.worker-logs'
191
-
192
- initialize: (options) ->
193
- @subviews = []
194
- @$ul = @$('.worker-logs-list')
195
- @$('.panel-heading').click(((subviews)-> ->
196
- for view in subviews
197
- view.toggle()
198
- )(@subviews))
199
- @listenTo(@collection, "add", @appendItem)
200
- for obj in @collection.models
201
- @appendItem(obj)
202
-
203
- appendItem: (model) ->
204
- view = new WorkerLogView({model: model})
205
- @subviews.push(view)
206
- view.render()
207
- @$ul.append(view.$el)
208
-
209
- render: ->
210
- for view in @subviews
211
- view.render()
212
-
213
- class WorkerLogView extends Backbone.View
214
- tagName: 'li'
215
- className: 'list-group-item hidden'
216
-
217
- render: ->
218
- @$el.html(Mustache.render($('#worker-log-template').html(), @model.forTemplate()))
219
- body = @$('.body')
220
- @$('.header').click(-> body.collapse('toggle'))
221
-
222
- toggle: ->
223
- @$el.toggleClass('hidden')
224
-
225
- class SlaveListView extends Backbone.View
226
- el: '.slaves'
227
-
228
- initialize: (options) ->
229
- @subviews = {}
230
- @$ul = @$('.slaves-list')
231
- @$('.panel-heading').click(=>
232
- for key, view of @subviews
233
- view.toggle()
234
- )
235
- @listenTo(@collection, "add", @appendItem)
236
- for obj in @collection.models
237
- @appendItem(obj)
238
- router.on('route:slave', (slaveId) =>
239
- for key, view of @subviews
240
- view.show()
241
- target = @subviews[slaveId]
242
- target.scrollIntoView()
243
- target.showBody()
244
- )
245
-
246
- appendItem: (model) ->
247
- view = new SlaveView({model: model})
248
- @subviews[model.attributes.key] = view
249
- view.render()
250
- @$ul.append(view.$el)
251
-
252
- render: ->
253
- for key, view of @subviews
254
- view.render()
255
-
256
- class SlaveView extends Backbone.View
257
- tagName: 'li'
258
- className: 'list-group-item hidden'
259
-
260
- render: ->
261
- @$el.html(Mustache.render($('#slave-template').html(), @model.forTemplate()))
262
- body = @$('.body')
263
- @$('.header').click(-> body.collapse('toggle'))
264
-
265
- switch @model.get('status')
266
- when 'normal_exit' then @$el.addClass('normal')
267
- when 'timeout_exit' then @$el.addClass('timeout')
268
- when 'failure_exit' then @$el.addClass('failure')
269
-
270
- scrollIntoView: ->
271
- $('html, body').animate(
272
- scrollTop: @$el.offset().top
273
- )
274
-
275
- show: ->
276
- @$el.removeClass('hidden')
277
-
278
- showBody: ->
279
- @$('.body').collapse('show')
280
-
281
- toggle: ->
282
- @$el.toggleClass('hidden')
283
-
284
- $(->
285
- if document.URL.match(/\/tasksets\/(.*?)(#.*)?$/)
286
- taskset = new Taskset({key: RegExp.$1})
287
- taskset.fetch({
288
- success: (model, response, options) ->
289
- if model.isFull()
290
- tasksetView = new TasksetView({model: model})
291
- tasksetView.render()
292
- tasksetView.$el.removeClass('hidden')
293
-
294
- # Force re-route
295
- fragment = Backbone.history.fragment
296
- router.navigate('')
297
- router.navigate(fragment, { trigger: true })
298
- else
299
- $('#notfound-modal').modal({keyboard: false})
300
- error: (model, response, options) ->
301
- $('#notfound-modal').modal({keyboard: false})
302
- })
303
- else
304
- $('#notfound-modal').modal({keyboard: false})
305
- )
@@ -1,1999 +0,0 @@
1
- /**
2
- * bootstrap.js v3.0.0 by @fat and @mdo
3
- * Copyright 2013 Twitter Inc.
4
- * http://www.apache.org/licenses/LICENSE-2.0
5
- */
6
- if (!jQuery) { throw new Error("Bootstrap requires jQuery") }
7
-
8
- /* ========================================================================
9
- * Bootstrap: transition.js v3.0.0
10
- * http://twbs.github.com/bootstrap/javascript.html#transitions
11
- * ========================================================================
12
- * Copyright 2013 Twitter, Inc.
13
- *
14
- * Licensed under the Apache License, Version 2.0 (the "License");
15
- * you may not use this file except in compliance with the License.
16
- * You may obtain a copy of the License at
17
- *
18
- * http://www.apache.org/licenses/LICENSE-2.0
19
- *
20
- * Unless required by applicable law or agreed to in writing, software
21
- * distributed under the License is distributed on an "AS IS" BASIS,
22
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23
- * See the License for the specific language governing permissions and
24
- * limitations under the License.
25
- * ======================================================================== */
26
-
27
-
28
- +function ($) { "use strict";
29
-
30
- // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
31
- // ============================================================
32
-
33
- function transitionEnd() {
34
- var el = document.createElement('bootstrap')
35
-
36
- var transEndEventNames = {
37
- 'WebkitTransition' : 'webkitTransitionEnd'
38
- , 'MozTransition' : 'transitionend'
39
- , 'OTransition' : 'oTransitionEnd otransitionend'
40
- , 'transition' : 'transitionend'
41
- }
42
-
43
- for (var name in transEndEventNames) {
44
- if (el.style[name] !== undefined) {
45
- return { end: transEndEventNames[name] }
46
- }
47
- }
48
- }
49
-
50
- // http://blog.alexmaccaw.com/css-transitions
51
- $.fn.emulateTransitionEnd = function (duration) {
52
- var called = false, $el = this
53
- $(this).one($.support.transition.end, function () { called = true })
54
- var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
55
- setTimeout(callback, duration)
56
- return this
57
- }
58
-
59
- $(function () {
60
- $.support.transition = transitionEnd()
61
- })
62
-
63
- }(window.jQuery);
64
-
65
- /* ========================================================================
66
- * Bootstrap: alert.js v3.0.0
67
- * http://twbs.github.com/bootstrap/javascript.html#alerts
68
- * ========================================================================
69
- * Copyright 2013 Twitter, Inc.
70
- *
71
- * Licensed under the Apache License, Version 2.0 (the "License");
72
- * you may not use this file except in compliance with the License.
73
- * You may obtain a copy of the License at
74
- *
75
- * http://www.apache.org/licenses/LICENSE-2.0
76
- *
77
- * Unless required by applicable law or agreed to in writing, software
78
- * distributed under the License is distributed on an "AS IS" BASIS,
79
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
80
- * See the License for the specific language governing permissions and
81
- * limitations under the License.
82
- * ======================================================================== */
83
-
84
-
85
- +function ($) { "use strict";
86
-
87
- // ALERT CLASS DEFINITION
88
- // ======================
89
-
90
- var dismiss = '[data-dismiss="alert"]'
91
- var Alert = function (el) {
92
- $(el).on('click', dismiss, this.close)
93
- }
94
-
95
- Alert.prototype.close = function (e) {
96
- var $this = $(this)
97
- var selector = $this.attr('data-target')
98
-
99
- if (!selector) {
100
- selector = $this.attr('href')
101
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
102
- }
103
-
104
- var $parent = $(selector)
105
-
106
- if (e) e.preventDefault()
107
-
108
- if (!$parent.length) {
109
- $parent = $this.hasClass('alert') ? $this : $this.parent()
110
- }
111
-
112
- $parent.trigger(e = $.Event('close.bs.alert'))
113
-
114
- if (e.isDefaultPrevented()) return
115
-
116
- $parent.removeClass('in')
117
-
118
- function removeElement() {
119
- $parent.trigger('closed.bs.alert').remove()
120
- }
121
-
122
- $.support.transition && $parent.hasClass('fade') ?
123
- $parent
124
- .one($.support.transition.end, removeElement)
125
- .emulateTransitionEnd(150) :
126
- removeElement()
127
- }
128
-
129
-
130
- // ALERT PLUGIN DEFINITION
131
- // =======================
132
-
133
- var old = $.fn.alert
134
-
135
- $.fn.alert = function (option) {
136
- return this.each(function () {
137
- var $this = $(this)
138
- var data = $this.data('bs.alert')
139
-
140
- if (!data) $this.data('bs.alert', (data = new Alert(this)))
141
- if (typeof option == 'string') data[option].call($this)
142
- })
143
- }
144
-
145
- $.fn.alert.Constructor = Alert
146
-
147
-
148
- // ALERT NO CONFLICT
149
- // =================
150
-
151
- $.fn.alert.noConflict = function () {
152
- $.fn.alert = old
153
- return this
154
- }
155
-
156
-
157
- // ALERT DATA-API
158
- // ==============
159
-
160
- $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
161
-
162
- }(window.jQuery);
163
-
164
- /* ========================================================================
165
- * Bootstrap: button.js v3.0.0
166
- * http://twbs.github.com/bootstrap/javascript.html#buttons
167
- * ========================================================================
168
- * Copyright 2013 Twitter, Inc.
169
- *
170
- * Licensed under the Apache License, Version 2.0 (the "License");
171
- * you may not use this file except in compliance with the License.
172
- * You may obtain a copy of the License at
173
- *
174
- * http://www.apache.org/licenses/LICENSE-2.0
175
- *
176
- * Unless required by applicable law or agreed to in writing, software
177
- * distributed under the License is distributed on an "AS IS" BASIS,
178
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
179
- * See the License for the specific language governing permissions and
180
- * limitations under the License.
181
- * ======================================================================== */
182
-
183
-
184
- +function ($) { "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
- }
193
-
194
- Button.DEFAULTS = {
195
- loadingText: 'loading...'
196
- }
197
-
198
- Button.prototype.setState = function (state) {
199
- var d = 'disabled'
200
- var $el = this.$element
201
- var val = $el.is('input') ? 'val' : 'html'
202
- var data = $el.data()
203
-
204
- state = state + 'Text'
205
-
206
- if (!data.resetText) $el.data('resetText', $el[val]())
207
-
208
- $el[val](data[state] || this.options[state])
209
-
210
- // push to event loop to allow forms to submit
211
- setTimeout(function () {
212
- state == 'loadingText' ?
213
- $el.addClass(d).attr(d, d) :
214
- $el.removeClass(d).removeAttr(d);
215
- }, 0)
216
- }
217
-
218
- Button.prototype.toggle = function () {
219
- var $parent = this.$element.closest('[data-toggle="buttons"]')
220
-
221
- if ($parent.length) {
222
- var $input = this.$element.find('input')
223
- .prop('checked', !this.$element.hasClass('active'))
224
- .trigger('change')
225
- if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')
226
- }
227
-
228
- this.$element.toggleClass('active')
229
- }
230
-
231
-
232
- // BUTTON PLUGIN DEFINITION
233
- // ========================
234
-
235
- var old = $.fn.button
236
-
237
- $.fn.button = function (option) {
238
- return this.each(function () {
239
- var $this = $(this)
240
- var data = $this.data('bs.button')
241
- var options = typeof option == 'object' && option
242
-
243
- if (!data) $this.data('bs.button', (data = new Button(this, options)))
244
-
245
- if (option == 'toggle') data.toggle()
246
- else if (option) data.setState(option)
247
- })
248
- }
249
-
250
- $.fn.button.Constructor = Button
251
-
252
-
253
- // BUTTON NO CONFLICT
254
- // ==================
255
-
256
- $.fn.button.noConflict = function () {
257
- $.fn.button = old
258
- return this
259
- }
260
-
261
-
262
- // BUTTON DATA-API
263
- // ===============
264
-
265
- $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
266
- var $btn = $(e.target)
267
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
268
- $btn.button('toggle')
269
- e.preventDefault()
270
- })
271
-
272
- }(window.jQuery);
273
-
274
- /* ========================================================================
275
- * Bootstrap: carousel.js v3.0.0
276
- * http://twbs.github.com/bootstrap/javascript.html#carousel
277
- * ========================================================================
278
- * Copyright 2012 Twitter, Inc.
279
- *
280
- * Licensed under the Apache License, Version 2.0 (the "License");
281
- * you may not use this file except in compliance with the License.
282
- * You may obtain a copy of the License at
283
- *
284
- * http://www.apache.org/licenses/LICENSE-2.0
285
- *
286
- * Unless required by applicable law or agreed to in writing, software
287
- * distributed under the License is distributed on an "AS IS" BASIS,
288
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
289
- * See the License for the specific language governing permissions and
290
- * limitations under the License.
291
- * ======================================================================== */
292
-
293
-
294
- +function ($) { "use strict";
295
-
296
- // CAROUSEL CLASS DEFINITION
297
- // =========================
298
-
299
- var Carousel = function (element, options) {
300
- this.$element = $(element)
301
- this.$indicators = this.$element.find('.carousel-indicators')
302
- this.options = options
303
- this.paused =
304
- this.sliding =
305
- this.interval =
306
- this.$active =
307
- this.$items = null
308
-
309
- this.options.pause == 'hover' && this.$element
310
- .on('mouseenter', $.proxy(this.pause, this))
311
- .on('mouseleave', $.proxy(this.cycle, this))
312
- }
313
-
314
- Carousel.DEFAULTS = {
315
- interval: 5000
316
- , pause: 'hover'
317
- , wrap: true
318
- }
319
-
320
- Carousel.prototype.cycle = function (e) {
321
- e || (this.paused = false)
322
-
323
- this.interval && clearInterval(this.interval)
324
-
325
- this.options.interval
326
- && !this.paused
327
- && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
328
-
329
- return this
330
- }
331
-
332
- Carousel.prototype.getActiveIndex = function () {
333
- this.$active = this.$element.find('.item.active')
334
- this.$items = this.$active.parent().children()
335
-
336
- return this.$items.index(this.$active)
337
- }
338
-
339
- Carousel.prototype.to = function (pos) {
340
- var that = this
341
- var activeIndex = this.getActiveIndex()
342
-
343
- if (pos > (this.$items.length - 1) || pos < 0) return
344
-
345
- if (this.sliding) return this.$element.one('slid', function () { that.to(pos) })
346
- if (activeIndex == pos) return this.pause().cycle()
347
-
348
- return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
349
- }
350
-
351
- Carousel.prototype.pause = function (e) {
352
- e || (this.paused = true)
353
-
354
- if (this.$element.find('.next, .prev').length && $.support.transition.end) {
355
- this.$element.trigger($.support.transition.end)
356
- this.cycle(true)
357
- }
358
-
359
- this.interval = clearInterval(this.interval)
360
-
361
- return this
362
- }
363
-
364
- Carousel.prototype.next = function () {
365
- if (this.sliding) return
366
- return this.slide('next')
367
- }
368
-
369
- Carousel.prototype.prev = function () {
370
- if (this.sliding) return
371
- return this.slide('prev')
372
- }
373
-
374
- Carousel.prototype.slide = function (type, next) {
375
- var $active = this.$element.find('.item.active')
376
- var $next = next || $active[type]()
377
- var isCycling = this.interval
378
- var direction = type == 'next' ? 'left' : 'right'
379
- var fallback = type == 'next' ? 'first' : 'last'
380
- var that = this
381
-
382
- if (!$next.length) {
383
- if (!this.options.wrap) return
384
- $next = this.$element.find('.item')[fallback]()
385
- }
386
-
387
- this.sliding = true
388
-
389
- isCycling && this.pause()
390
-
391
- var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
392
-
393
- if ($next.hasClass('active')) return
394
-
395
- if (this.$indicators.length) {
396
- this.$indicators.find('.active').removeClass('active')
397
- this.$element.one('slid', function () {
398
- var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
399
- $nextIndicator && $nextIndicator.addClass('active')
400
- })
401
- }
402
-
403
- if ($.support.transition && this.$element.hasClass('slide')) {
404
- this.$element.trigger(e)
405
- if (e.isDefaultPrevented()) return
406
- $next.addClass(type)
407
- $next[0].offsetWidth // force reflow
408
- $active.addClass(direction)
409
- $next.addClass(direction)
410
- $active
411
- .one($.support.transition.end, function () {
412
- $next.removeClass([type, direction].join(' ')).addClass('active')
413
- $active.removeClass(['active', direction].join(' '))
414
- that.sliding = false
415
- setTimeout(function () { that.$element.trigger('slid') }, 0)
416
- })
417
- .emulateTransitionEnd(600)
418
- } else {
419
- this.$element.trigger(e)
420
- if (e.isDefaultPrevented()) return
421
- $active.removeClass('active')
422
- $next.addClass('active')
423
- this.sliding = false
424
- this.$element.trigger('slid')
425
- }
426
-
427
- isCycling && this.cycle()
428
-
429
- return this
430
- }
431
-
432
-
433
- // CAROUSEL PLUGIN DEFINITION
434
- // ==========================
435
-
436
- var old = $.fn.carousel
437
-
438
- $.fn.carousel = function (option) {
439
- return this.each(function () {
440
- var $this = $(this)
441
- var data = $this.data('bs.carousel')
442
- var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
443
- var action = typeof option == 'string' ? option : options.slide
444
-
445
- if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
446
- if (typeof option == 'number') data.to(option)
447
- else if (action) data[action]()
448
- else if (options.interval) data.pause().cycle()
449
- })
450
- }
451
-
452
- $.fn.carousel.Constructor = Carousel
453
-
454
-
455
- // CAROUSEL NO CONFLICT
456
- // ====================
457
-
458
- $.fn.carousel.noConflict = function () {
459
- $.fn.carousel = old
460
- return this
461
- }
462
-
463
-
464
- // CAROUSEL DATA-API
465
- // =================
466
-
467
- $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
468
- var $this = $(this), href
469
- var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
470
- var options = $.extend({}, $target.data(), $this.data())
471
- var slideIndex = $this.attr('data-slide-to')
472
- if (slideIndex) options.interval = false
473
-
474
- $target.carousel(options)
475
-
476
- if (slideIndex = $this.attr('data-slide-to')) {
477
- $target.data('bs.carousel').to(slideIndex)
478
- }
479
-
480
- e.preventDefault()
481
- })
482
-
483
- $(window).on('load', function () {
484
- $('[data-ride="carousel"]').each(function () {
485
- var $carousel = $(this)
486
- $carousel.carousel($carousel.data())
487
- })
488
- })
489
-
490
- }(window.jQuery);
491
-
492
- /* ========================================================================
493
- * Bootstrap: collapse.js v3.0.0
494
- * http://twbs.github.com/bootstrap/javascript.html#collapse
495
- * ========================================================================
496
- * Copyright 2012 Twitter, Inc.
497
- *
498
- * Licensed under the Apache License, Version 2.0 (the "License");
499
- * you may not use this file except in compliance with the License.
500
- * You may obtain a copy of the License at
501
- *
502
- * http://www.apache.org/licenses/LICENSE-2.0
503
- *
504
- * Unless required by applicable law or agreed to in writing, software
505
- * distributed under the License is distributed on an "AS IS" BASIS,
506
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
507
- * See the License for the specific language governing permissions and
508
- * limitations under the License.
509
- * ======================================================================== */
510
-
511
-
512
- +function ($) { "use strict";
513
-
514
- // COLLAPSE PUBLIC CLASS DEFINITION
515
- // ================================
516
-
517
- var Collapse = function (element, options) {
518
- this.$element = $(element)
519
- this.options = $.extend({}, Collapse.DEFAULTS, options)
520
- this.transitioning = null
521
-
522
- if (this.options.parent) this.$parent = $(this.options.parent)
523
- if (this.options.toggle) this.toggle()
524
- }
525
-
526
- Collapse.DEFAULTS = {
527
- toggle: true
528
- }
529
-
530
- Collapse.prototype.dimension = function () {
531
- var hasWidth = this.$element.hasClass('width')
532
- return hasWidth ? 'width' : 'height'
533
- }
534
-
535
- Collapse.prototype.show = function () {
536
- if (this.transitioning || this.$element.hasClass('in')) return
537
-
538
- var startEvent = $.Event('show.bs.collapse')
539
- this.$element.trigger(startEvent)
540
- if (startEvent.isDefaultPrevented()) return
541
-
542
- var actives = this.$parent && this.$parent.find('> .panel > .in')
543
-
544
- if (actives && actives.length) {
545
- var hasData = actives.data('bs.collapse')
546
- if (hasData && hasData.transitioning) return
547
- actives.collapse('hide')
548
- hasData || actives.data('bs.collapse', null)
549
- }
550
-
551
- var dimension = this.dimension()
552
-
553
- this.$element
554
- .removeClass('collapse')
555
- .addClass('collapsing')
556
- [dimension](0)
557
-
558
- this.transitioning = 1
559
-
560
- var complete = function () {
561
- this.$element
562
- .removeClass('collapsing')
563
- .addClass('in')
564
- [dimension]('auto')
565
- this.transitioning = 0
566
- this.$element.trigger('shown.bs.collapse')
567
- }
568
-
569
- if (!$.support.transition) return complete.call(this)
570
-
571
- var scrollSize = $.camelCase(['scroll', dimension].join('-'))
572
-
573
- this.$element
574
- .one($.support.transition.end, $.proxy(complete, this))
575
- .emulateTransitionEnd(350)
576
- [dimension](this.$element[0][scrollSize])
577
- }
578
-
579
- Collapse.prototype.hide = function () {
580
- if (this.transitioning || !this.$element.hasClass('in')) return
581
-
582
- var startEvent = $.Event('hide.bs.collapse')
583
- this.$element.trigger(startEvent)
584
- if (startEvent.isDefaultPrevented()) return
585
-
586
- var dimension = this.dimension()
587
-
588
- this.$element
589
- [dimension](this.$element[dimension]())
590
- [0].offsetHeight
591
-
592
- this.$element
593
- .addClass('collapsing')
594
- .removeClass('collapse')
595
- .removeClass('in')
596
-
597
- this.transitioning = 1
598
-
599
- var complete = function () {
600
- this.transitioning = 0
601
- this.$element
602
- .trigger('hidden.bs.collapse')
603
- .removeClass('collapsing')
604
- .addClass('collapse')
605
- }
606
-
607
- if (!$.support.transition) return complete.call(this)
608
-
609
- this.$element
610
- [dimension](0)
611
- .one($.support.transition.end, $.proxy(complete, this))
612
- .emulateTransitionEnd(350)
613
- }
614
-
615
- Collapse.prototype.toggle = function () {
616
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
617
- }
618
-
619
-
620
- // COLLAPSE PLUGIN DEFINITION
621
- // ==========================
622
-
623
- var old = $.fn.collapse
624
-
625
- $.fn.collapse = function (option) {
626
- return this.each(function () {
627
- var $this = $(this)
628
- var data = $this.data('bs.collapse')
629
- var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
630
-
631
- if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
632
- if (typeof option == 'string') data[option]()
633
- })
634
- }
635
-
636
- $.fn.collapse.Constructor = Collapse
637
-
638
-
639
- // COLLAPSE NO CONFLICT
640
- // ====================
641
-
642
- $.fn.collapse.noConflict = function () {
643
- $.fn.collapse = old
644
- return this
645
- }
646
-
647
-
648
- // COLLAPSE DATA-API
649
- // =================
650
-
651
- $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
652
- var $this = $(this), href
653
- var target = $this.attr('data-target')
654
- || e.preventDefault()
655
- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
656
- var $target = $(target)
657
- var data = $target.data('bs.collapse')
658
- var option = data ? 'toggle' : $this.data()
659
- var parent = $this.attr('data-parent')
660
- var $parent = parent && $(parent)
661
-
662
- if (!data || !data.transitioning) {
663
- if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
664
- $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
665
- }
666
-
667
- $target.collapse(option)
668
- })
669
-
670
- }(window.jQuery);
671
-
672
- /* ========================================================================
673
- * Bootstrap: dropdown.js v3.0.0
674
- * http://twbs.github.com/bootstrap/javascript.html#dropdowns
675
- * ========================================================================
676
- * Copyright 2012 Twitter, Inc.
677
- *
678
- * Licensed under the Apache License, Version 2.0 (the "License");
679
- * you may not use this file except in compliance with the License.
680
- * You may obtain a copy of the License at
681
- *
682
- * http://www.apache.org/licenses/LICENSE-2.0
683
- *
684
- * Unless required by applicable law or agreed to in writing, software
685
- * distributed under the License is distributed on an "AS IS" BASIS,
686
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
687
- * See the License for the specific language governing permissions and
688
- * limitations under the License.
689
- * ======================================================================== */
690
-
691
-
692
- +function ($) { "use strict";
693
-
694
- // DROPDOWN CLASS DEFINITION
695
- // =========================
696
-
697
- var backdrop = '.dropdown-backdrop'
698
- var toggle = '[data-toggle=dropdown]'
699
- var Dropdown = function (element) {
700
- var $el = $(element).on('click.bs.dropdown', this.toggle)
701
- }
702
-
703
- Dropdown.prototype.toggle = function (e) {
704
- var $this = $(this)
705
-
706
- if ($this.is('.disabled, :disabled')) return
707
-
708
- var $parent = getParent($this)
709
- var isActive = $parent.hasClass('open')
710
-
711
- clearMenus()
712
-
713
- if (!isActive) {
714
- if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
715
- // if mobile we we use a backdrop because click events don't delegate
716
- $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
717
- }
718
-
719
- $parent.trigger(e = $.Event('show.bs.dropdown'))
720
-
721
- if (e.isDefaultPrevented()) return
722
-
723
- $parent
724
- .toggleClass('open')
725
- .trigger('shown.bs.dropdown')
726
-
727
- $this.focus()
728
- }
729
-
730
- return false
731
- }
732
-
733
- Dropdown.prototype.keydown = function (e) {
734
- if (!/(38|40|27)/.test(e.keyCode)) return
735
-
736
- var $this = $(this)
737
-
738
- e.preventDefault()
739
- e.stopPropagation()
740
-
741
- if ($this.is('.disabled, :disabled')) return
742
-
743
- var $parent = getParent($this)
744
- var isActive = $parent.hasClass('open')
745
-
746
- if (!isActive || (isActive && e.keyCode == 27)) {
747
- if (e.which == 27) $parent.find(toggle).focus()
748
- return $this.click()
749
- }
750
-
751
- var $items = $('[role=menu] li:not(.divider):visible a', $parent)
752
-
753
- if (!$items.length) return
754
-
755
- var index = $items.index($items.filter(':focus'))
756
-
757
- if (e.keyCode == 38 && index > 0) index-- // up
758
- if (e.keyCode == 40 && index < $items.length - 1) index++ // down
759
- if (!~index) index=0
760
-
761
- $items.eq(index).focus()
762
- }
763
-
764
- function clearMenus() {
765
- $(backdrop).remove()
766
- $(toggle).each(function (e) {
767
- var $parent = getParent($(this))
768
- if (!$parent.hasClass('open')) return
769
- $parent.trigger(e = $.Event('hide.bs.dropdown'))
770
- if (e.isDefaultPrevented()) return
771
- $parent.removeClass('open').trigger('hidden.bs.dropdown')
772
- })
773
- }
774
-
775
- function getParent($this) {
776
- var selector = $this.attr('data-target')
777
-
778
- if (!selector) {
779
- selector = $this.attr('href')
780
- selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
781
- }
782
-
783
- var $parent = selector && $(selector)
784
-
785
- return $parent && $parent.length ? $parent : $this.parent()
786
- }
787
-
788
-
789
- // DROPDOWN PLUGIN DEFINITION
790
- // ==========================
791
-
792
- var old = $.fn.dropdown
793
-
794
- $.fn.dropdown = function (option) {
795
- return this.each(function () {
796
- var $this = $(this)
797
- var data = $this.data('dropdown')
798
-
799
- if (!data) $this.data('dropdown', (data = new Dropdown(this)))
800
- if (typeof option == 'string') data[option].call($this)
801
- })
802
- }
803
-
804
- $.fn.dropdown.Constructor = Dropdown
805
-
806
-
807
- // DROPDOWN NO CONFLICT
808
- // ====================
809
-
810
- $.fn.dropdown.noConflict = function () {
811
- $.fn.dropdown = old
812
- return this
813
- }
814
-
815
-
816
- // APPLY TO STANDARD DROPDOWN ELEMENTS
817
- // ===================================
818
-
819
- $(document)
820
- .on('click.bs.dropdown.data-api', clearMenus)
821
- .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
822
- .on('click.bs.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
823
- .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
824
-
825
- }(window.jQuery);
826
-
827
- /* ========================================================================
828
- * Bootstrap: modal.js v3.0.0
829
- * http://twbs.github.com/bootstrap/javascript.html#modals
830
- * ========================================================================
831
- * Copyright 2012 Twitter, Inc.
832
- *
833
- * Licensed under the Apache License, Version 2.0 (the "License");
834
- * you may not use this file except in compliance with the License.
835
- * You may obtain a copy of the License at
836
- *
837
- * http://www.apache.org/licenses/LICENSE-2.0
838
- *
839
- * Unless required by applicable law or agreed to in writing, software
840
- * distributed under the License is distributed on an "AS IS" BASIS,
841
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
842
- * See the License for the specific language governing permissions and
843
- * limitations under the License.
844
- * ======================================================================== */
845
-
846
-
847
- +function ($) { "use strict";
848
-
849
- // MODAL CLASS DEFINITION
850
- // ======================
851
-
852
- var Modal = function (element, options) {
853
- this.options = options
854
- this.$element = $(element)
855
- this.$backdrop =
856
- this.isShown = null
857
-
858
- if (this.options.remote) this.$element.load(this.options.remote)
859
- }
860
-
861
- Modal.DEFAULTS = {
862
- backdrop: true
863
- , keyboard: true
864
- , show: true
865
- }
866
-
867
- Modal.prototype.toggle = function (_relatedTarget) {
868
- return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
869
- }
870
-
871
- Modal.prototype.show = function (_relatedTarget) {
872
- var that = this
873
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
874
-
875
- this.$element.trigger(e)
876
-
877
- if (this.isShown || e.isDefaultPrevented()) return
878
-
879
- this.isShown = true
880
-
881
- this.escape()
882
-
883
- this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
884
-
885
- this.backdrop(function () {
886
- var transition = $.support.transition && that.$element.hasClass('fade')
887
-
888
- if (!that.$element.parent().length) {
889
- that.$element.appendTo(document.body) // don't move modals dom position
890
- }
891
-
892
- that.$element.show()
893
-
894
- if (transition) {
895
- that.$element[0].offsetWidth // force reflow
896
- }
897
-
898
- that.$element
899
- .addClass('in')
900
- .attr('aria-hidden', false)
901
-
902
- that.enforceFocus()
903
-
904
- var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
905
-
906
- transition ?
907
- that.$element.find('.modal-dialog') // wait for modal to slide in
908
- .one($.support.transition.end, function () {
909
- that.$element.focus().trigger(e)
910
- })
911
- .emulateTransitionEnd(300) :
912
- that.$element.focus().trigger(e)
913
- })
914
- }
915
-
916
- Modal.prototype.hide = function (e) {
917
- if (e) e.preventDefault()
918
-
919
- e = $.Event('hide.bs.modal')
920
-
921
- this.$element.trigger(e)
922
-
923
- if (!this.isShown || e.isDefaultPrevented()) return
924
-
925
- this.isShown = false
926
-
927
- this.escape()
928
-
929
- $(document).off('focusin.bs.modal')
930
-
931
- this.$element
932
- .removeClass('in')
933
- .attr('aria-hidden', true)
934
- .off('click.dismiss.modal')
935
-
936
- $.support.transition && this.$element.hasClass('fade') ?
937
- this.$element
938
- .one($.support.transition.end, $.proxy(this.hideModal, this))
939
- .emulateTransitionEnd(300) :
940
- this.hideModal()
941
- }
942
-
943
- Modal.prototype.enforceFocus = function () {
944
- $(document)
945
- .off('focusin.bs.modal') // guard against infinite focus loop
946
- .on('focusin.bs.modal', $.proxy(function (e) {
947
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
948
- this.$element.focus()
949
- }
950
- }, this))
951
- }
952
-
953
- Modal.prototype.escape = function () {
954
- if (this.isShown && this.options.keyboard) {
955
- this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
956
- e.which == 27 && this.hide()
957
- }, this))
958
- } else if (!this.isShown) {
959
- this.$element.off('keyup.dismiss.bs.modal')
960
- }
961
- }
962
-
963
- Modal.prototype.hideModal = function () {
964
- var that = this
965
- this.$element.hide()
966
- this.backdrop(function () {
967
- that.removeBackdrop()
968
- that.$element.trigger('hidden.bs.modal')
969
- })
970
- }
971
-
972
- Modal.prototype.removeBackdrop = function () {
973
- this.$backdrop && this.$backdrop.remove()
974
- this.$backdrop = null
975
- }
976
-
977
- Modal.prototype.backdrop = function (callback) {
978
- var that = this
979
- var animate = this.$element.hasClass('fade') ? 'fade' : ''
980
-
981
- if (this.isShown && this.options.backdrop) {
982
- var doAnimate = $.support.transition && animate
983
-
984
- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
985
- .appendTo(document.body)
986
-
987
- this.$element.on('click.dismiss.modal', $.proxy(function (e) {
988
- if (e.target !== e.currentTarget) return
989
- this.options.backdrop == 'static'
990
- ? this.$element[0].focus.call(this.$element[0])
991
- : this.hide.call(this)
992
- }, this))
993
-
994
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
995
-
996
- this.$backdrop.addClass('in')
997
-
998
- if (!callback) return
999
-
1000
- doAnimate ?
1001
- this.$backdrop
1002
- .one($.support.transition.end, callback)
1003
- .emulateTransitionEnd(150) :
1004
- callback()
1005
-
1006
- } else if (!this.isShown && this.$backdrop) {
1007
- this.$backdrop.removeClass('in')
1008
-
1009
- $.support.transition && this.$element.hasClass('fade')?
1010
- this.$backdrop
1011
- .one($.support.transition.end, callback)
1012
- .emulateTransitionEnd(150) :
1013
- callback()
1014
-
1015
- } else if (callback) {
1016
- callback()
1017
- }
1018
- }
1019
-
1020
-
1021
- // MODAL PLUGIN DEFINITION
1022
- // =======================
1023
-
1024
- var old = $.fn.modal
1025
-
1026
- $.fn.modal = function (option, _relatedTarget) {
1027
- return this.each(function () {
1028
- var $this = $(this)
1029
- var data = $this.data('bs.modal')
1030
- var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
1031
-
1032
- if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
1033
- if (typeof option == 'string') data[option](_relatedTarget)
1034
- else if (options.show) data.show(_relatedTarget)
1035
- })
1036
- }
1037
-
1038
- $.fn.modal.Constructor = Modal
1039
-
1040
-
1041
- // MODAL NO CONFLICT
1042
- // =================
1043
-
1044
- $.fn.modal.noConflict = function () {
1045
- $.fn.modal = old
1046
- return this
1047
- }
1048
-
1049
-
1050
- // MODAL DATA-API
1051
- // ==============
1052
-
1053
- $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
1054
- var $this = $(this)
1055
- var href = $this.attr('href')
1056
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
1057
- var option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1058
-
1059
- e.preventDefault()
1060
-
1061
- $target
1062
- .modal(option, this)
1063
- .one('hide', function () {
1064
- $this.is(':visible') && $this.focus()
1065
- })
1066
- })
1067
-
1068
- $(document)
1069
- .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
1070
- .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
1071
-
1072
- }(window.jQuery);
1073
-
1074
- /* ========================================================================
1075
- * Bootstrap: tooltip.js v3.0.0
1076
- * http://twbs.github.com/bootstrap/javascript.html#tooltip
1077
- * Inspired by the original jQuery.tipsy by Jason Frame
1078
- * ========================================================================
1079
- * Copyright 2012 Twitter, Inc.
1080
- *
1081
- * Licensed under the Apache License, Version 2.0 (the "License");
1082
- * you may not use this file except in compliance with the License.
1083
- * You may obtain a copy of the License at
1084
- *
1085
- * http://www.apache.org/licenses/LICENSE-2.0
1086
- *
1087
- * Unless required by applicable law or agreed to in writing, software
1088
- * distributed under the License is distributed on an "AS IS" BASIS,
1089
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1090
- * See the License for the specific language governing permissions and
1091
- * limitations under the License.
1092
- * ======================================================================== */
1093
-
1094
-
1095
- +function ($) { "use strict";
1096
-
1097
- // TOOLTIP PUBLIC CLASS DEFINITION
1098
- // ===============================
1099
-
1100
- var Tooltip = function (element, options) {
1101
- this.type =
1102
- this.options =
1103
- this.enabled =
1104
- this.timeout =
1105
- this.hoverState =
1106
- this.$element = null
1107
-
1108
- this.init('tooltip', element, options)
1109
- }
1110
-
1111
- Tooltip.DEFAULTS = {
1112
- animation: true
1113
- , placement: 'top'
1114
- , selector: false
1115
- , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
1116
- , trigger: 'hover focus'
1117
- , title: ''
1118
- , delay: 0
1119
- , html: false
1120
- , container: false
1121
- }
1122
-
1123
- Tooltip.prototype.init = function (type, element, options) {
1124
- this.enabled = true
1125
- this.type = type
1126
- this.$element = $(element)
1127
- this.options = this.getOptions(options)
1128
-
1129
- var triggers = this.options.trigger.split(' ')
1130
-
1131
- for (var i = triggers.length; i--;) {
1132
- var trigger = triggers[i]
1133
-
1134
- if (trigger == 'click') {
1135
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
1136
- } else if (trigger != 'manual') {
1137
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
1138
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
1139
-
1140
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1141
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1142
- }
1143
- }
1144
-
1145
- this.options.selector ?
1146
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1147
- this.fixTitle()
1148
- }
1149
-
1150
- Tooltip.prototype.getDefaults = function () {
1151
- return Tooltip.DEFAULTS
1152
- }
1153
-
1154
- Tooltip.prototype.getOptions = function (options) {
1155
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1156
-
1157
- if (options.delay && typeof options.delay == 'number') {
1158
- options.delay = {
1159
- show: options.delay
1160
- , hide: options.delay
1161
- }
1162
- }
1163
-
1164
- return options
1165
- }
1166
-
1167
- Tooltip.prototype.getDelegateOptions = function () {
1168
- var options = {}
1169
- var defaults = this.getDefaults()
1170
-
1171
- this._options && $.each(this._options, function (key, value) {
1172
- if (defaults[key] != value) options[key] = value
1173
- })
1174
-
1175
- return options
1176
- }
1177
-
1178
- Tooltip.prototype.enter = function (obj) {
1179
- var self = obj instanceof this.constructor ?
1180
- obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
1181
-
1182
- clearTimeout(self.timeout)
1183
-
1184
- self.hoverState = 'in'
1185
-
1186
- if (!self.options.delay || !self.options.delay.show) return self.show()
1187
-
1188
- self.timeout = setTimeout(function () {
1189
- if (self.hoverState == 'in') self.show()
1190
- }, self.options.delay.show)
1191
- }
1192
-
1193
- Tooltip.prototype.leave = function (obj) {
1194
- var self = obj instanceof this.constructor ?
1195
- obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
1196
-
1197
- clearTimeout(self.timeout)
1198
-
1199
- self.hoverState = 'out'
1200
-
1201
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
1202
-
1203
- self.timeout = setTimeout(function () {
1204
- if (self.hoverState == 'out') self.hide()
1205
- }, self.options.delay.hide)
1206
- }
1207
-
1208
- Tooltip.prototype.show = function () {
1209
- var e = $.Event('show.bs.'+ this.type)
1210
-
1211
- if (this.hasContent() && this.enabled) {
1212
- this.$element.trigger(e)
1213
-
1214
- if (e.isDefaultPrevented()) return
1215
-
1216
- var $tip = this.tip()
1217
-
1218
- this.setContent()
1219
-
1220
- if (this.options.animation) $tip.addClass('fade')
1221
-
1222
- var placement = typeof this.options.placement == 'function' ?
1223
- this.options.placement.call(this, $tip[0], this.$element[0]) :
1224
- this.options.placement
1225
-
1226
- var autoToken = /\s?auto?\s?/i
1227
- var autoPlace = autoToken.test(placement)
1228
- if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1229
-
1230
- $tip
1231
- .detach()
1232
- .css({ top: 0, left: 0, display: 'block' })
1233
- .addClass(placement)
1234
-
1235
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1236
-
1237
- var pos = this.getPosition()
1238
- var actualWidth = $tip[0].offsetWidth
1239
- var actualHeight = $tip[0].offsetHeight
1240
-
1241
- if (autoPlace) {
1242
- var $parent = this.$element.parent()
1243
-
1244
- var orgPlacement = placement
1245
- var docScroll = document.documentElement.scrollTop || document.body.scrollTop
1246
- var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
1247
- var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
1248
- var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
1249
-
1250
- placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
1251
- placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
1252
- placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
1253
- placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
1254
- placement
1255
-
1256
- $tip
1257
- .removeClass(orgPlacement)
1258
- .addClass(placement)
1259
- }
1260
-
1261
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1262
-
1263
- this.applyPlacement(calculatedOffset, placement)
1264
- this.$element.trigger('shown.bs.' + this.type)
1265
- }
1266
- }
1267
-
1268
- Tooltip.prototype.applyPlacement = function(offset, placement) {
1269
- var replace
1270
- var $tip = this.tip()
1271
- var width = $tip[0].offsetWidth
1272
- var height = $tip[0].offsetHeight
1273
-
1274
- // manually read margins because getBoundingClientRect includes difference
1275
- var marginTop = parseInt($tip.css('margin-top'), 10)
1276
- var marginLeft = parseInt($tip.css('margin-left'), 10)
1277
-
1278
- // we must check for NaN for ie 8/9
1279
- if (isNaN(marginTop)) marginTop = 0
1280
- if (isNaN(marginLeft)) marginLeft = 0
1281
-
1282
- offset.top = offset.top + marginTop
1283
- offset.left = offset.left + marginLeft
1284
-
1285
- $tip
1286
- .offset(offset)
1287
- .addClass('in')
1288
-
1289
- // check to see if placing tip in new offset caused the tip to resize itself
1290
- var actualWidth = $tip[0].offsetWidth
1291
- var actualHeight = $tip[0].offsetHeight
1292
-
1293
- if (placement == 'top' && actualHeight != height) {
1294
- replace = true
1295
- offset.top = offset.top + height - actualHeight
1296
- }
1297
-
1298
- if (/bottom|top/.test(placement)) {
1299
- var delta = 0
1300
-
1301
- if (offset.left < 0) {
1302
- delta = offset.left * -2
1303
- offset.left = 0
1304
-
1305
- $tip.offset(offset)
1306
-
1307
- actualWidth = $tip[0].offsetWidth
1308
- actualHeight = $tip[0].offsetHeight
1309
- }
1310
-
1311
- this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
1312
- } else {
1313
- this.replaceArrow(actualHeight - height, actualHeight, 'top')
1314
- }
1315
-
1316
- if (replace) $tip.offset(offset)
1317
- }
1318
-
1319
- Tooltip.prototype.replaceArrow = function(delta, dimension, position) {
1320
- this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
1321
- }
1322
-
1323
- Tooltip.prototype.setContent = function () {
1324
- var $tip = this.tip()
1325
- var title = this.getTitle()
1326
-
1327
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1328
- $tip.removeClass('fade in top bottom left right')
1329
- }
1330
-
1331
- Tooltip.prototype.hide = function () {
1332
- var that = this
1333
- var $tip = this.tip()
1334
- var e = $.Event('hide.bs.' + this.type)
1335
-
1336
- function complete() {
1337
- if (that.hoverState != 'in') $tip.detach()
1338
- }
1339
-
1340
- this.$element.trigger(e)
1341
-
1342
- if (e.isDefaultPrevented()) return
1343
-
1344
- $tip.removeClass('in')
1345
-
1346
- $.support.transition && this.$tip.hasClass('fade') ?
1347
- $tip
1348
- .one($.support.transition.end, complete)
1349
- .emulateTransitionEnd(150) :
1350
- complete()
1351
-
1352
- this.$element.trigger('hidden.bs.' + this.type)
1353
-
1354
- return this
1355
- }
1356
-
1357
- Tooltip.prototype.fixTitle = function () {
1358
- var $e = this.$element
1359
- if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
1360
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1361
- }
1362
- }
1363
-
1364
- Tooltip.prototype.hasContent = function () {
1365
- return this.getTitle()
1366
- }
1367
-
1368
- Tooltip.prototype.getPosition = function () {
1369
- var el = this.$element[0]
1370
- return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
1371
- width: el.offsetWidth
1372
- , height: el.offsetHeight
1373
- }, this.$element.offset())
1374
- }
1375
-
1376
- Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
1377
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1378
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1379
- placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
1380
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
1381
- }
1382
-
1383
- Tooltip.prototype.getTitle = function () {
1384
- var title
1385
- var $e = this.$element
1386
- var o = this.options
1387
-
1388
- title = $e.attr('data-original-title')
1389
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1390
-
1391
- return title
1392
- }
1393
-
1394
- Tooltip.prototype.tip = function () {
1395
- return this.$tip = this.$tip || $(this.options.template)
1396
- }
1397
-
1398
- Tooltip.prototype.arrow = function () {
1399
- return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
1400
- }
1401
-
1402
- Tooltip.prototype.validate = function () {
1403
- if (!this.$element[0].parentNode) {
1404
- this.hide()
1405
- this.$element = null
1406
- this.options = null
1407
- }
1408
- }
1409
-
1410
- Tooltip.prototype.enable = function () {
1411
- this.enabled = true
1412
- }
1413
-
1414
- Tooltip.prototype.disable = function () {
1415
- this.enabled = false
1416
- }
1417
-
1418
- Tooltip.prototype.toggleEnabled = function () {
1419
- this.enabled = !this.enabled
1420
- }
1421
-
1422
- Tooltip.prototype.toggle = function (e) {
1423
- var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
1424
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
1425
- }
1426
-
1427
- Tooltip.prototype.destroy = function () {
1428
- this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
1429
- }
1430
-
1431
-
1432
- // TOOLTIP PLUGIN DEFINITION
1433
- // =========================
1434
-
1435
- var old = $.fn.tooltip
1436
-
1437
- $.fn.tooltip = function (option) {
1438
- return this.each(function () {
1439
- var $this = $(this)
1440
- var data = $this.data('bs.tooltip')
1441
- var options = typeof option == 'object' && option
1442
-
1443
- if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1444
- if (typeof option == 'string') data[option]()
1445
- })
1446
- }
1447
-
1448
- $.fn.tooltip.Constructor = Tooltip
1449
-
1450
-
1451
- // TOOLTIP NO CONFLICT
1452
- // ===================
1453
-
1454
- $.fn.tooltip.noConflict = function () {
1455
- $.fn.tooltip = old
1456
- return this
1457
- }
1458
-
1459
- }(window.jQuery);
1460
-
1461
- /* ========================================================================
1462
- * Bootstrap: popover.js v3.0.0
1463
- * http://twbs.github.com/bootstrap/javascript.html#popovers
1464
- * ========================================================================
1465
- * Copyright 2012 Twitter, Inc.
1466
- *
1467
- * Licensed under the Apache License, Version 2.0 (the "License");
1468
- * you may not use this file except in compliance with the License.
1469
- * You may obtain a copy of the License at
1470
- *
1471
- * http://www.apache.org/licenses/LICENSE-2.0
1472
- *
1473
- * Unless required by applicable law or agreed to in writing, software
1474
- * distributed under the License is distributed on an "AS IS" BASIS,
1475
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1476
- * See the License for the specific language governing permissions and
1477
- * limitations under the License.
1478
- * ======================================================================== */
1479
-
1480
-
1481
- +function ($) { "use strict";
1482
-
1483
- // POPOVER PUBLIC CLASS DEFINITION
1484
- // ===============================
1485
-
1486
- var Popover = function (element, options) {
1487
- this.init('popover', element, options)
1488
- }
1489
-
1490
- if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1491
-
1492
- Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {
1493
- placement: 'right'
1494
- , trigger: 'click'
1495
- , content: ''
1496
- , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1497
- })
1498
-
1499
-
1500
- // NOTE: POPOVER EXTENDS tooltip.js
1501
- // ================================
1502
-
1503
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1504
-
1505
- Popover.prototype.constructor = Popover
1506
-
1507
- Popover.prototype.getDefaults = function () {
1508
- return Popover.DEFAULTS
1509
- }
1510
-
1511
- Popover.prototype.setContent = function () {
1512
- var $tip = this.tip()
1513
- var title = this.getTitle()
1514
- var content = this.getContent()
1515
-
1516
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1517
- $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
1518
-
1519
- $tip.removeClass('fade top bottom left right in')
1520
-
1521
- // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
1522
- // this manually by checking the contents.
1523
- if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
1524
- }
1525
-
1526
- Popover.prototype.hasContent = function () {
1527
- return this.getTitle() || this.getContent()
1528
- }
1529
-
1530
- Popover.prototype.getContent = function () {
1531
- var $e = this.$element
1532
- var o = this.options
1533
-
1534
- return $e.attr('data-content')
1535
- || (typeof o.content == 'function' ?
1536
- o.content.call($e[0]) :
1537
- o.content)
1538
- }
1539
-
1540
- Popover.prototype.arrow = function () {
1541
- return this.$arrow = this.$arrow || this.tip().find('.arrow')
1542
- }
1543
-
1544
- Popover.prototype.tip = function () {
1545
- if (!this.$tip) this.$tip = $(this.options.template)
1546
- return this.$tip
1547
- }
1548
-
1549
-
1550
- // POPOVER PLUGIN DEFINITION
1551
- // =========================
1552
-
1553
- var old = $.fn.popover
1554
-
1555
- $.fn.popover = function (option) {
1556
- return this.each(function () {
1557
- var $this = $(this)
1558
- var data = $this.data('bs.popover')
1559
- var options = typeof option == 'object' && option
1560
-
1561
- if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
1562
- if (typeof option == 'string') data[option]()
1563
- })
1564
- }
1565
-
1566
- $.fn.popover.Constructor = Popover
1567
-
1568
-
1569
- // POPOVER NO CONFLICT
1570
- // ===================
1571
-
1572
- $.fn.popover.noConflict = function () {
1573
- $.fn.popover = old
1574
- return this
1575
- }
1576
-
1577
- }(window.jQuery);
1578
-
1579
- /* ========================================================================
1580
- * Bootstrap: scrollspy.js v3.0.0
1581
- * http://twbs.github.com/bootstrap/javascript.html#scrollspy
1582
- * ========================================================================
1583
- * Copyright 2012 Twitter, Inc.
1584
- *
1585
- * Licensed under the Apache License, Version 2.0 (the "License");
1586
- * you may not use this file except in compliance with the License.
1587
- * You may obtain a copy of the License at
1588
- *
1589
- * http://www.apache.org/licenses/LICENSE-2.0
1590
- *
1591
- * Unless required by applicable law or agreed to in writing, software
1592
- * distributed under the License is distributed on an "AS IS" BASIS,
1593
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1594
- * See the License for the specific language governing permissions and
1595
- * limitations under the License.
1596
- * ======================================================================== */
1597
-
1598
-
1599
- +function ($) { "use strict";
1600
-
1601
- // SCROLLSPY CLASS DEFINITION
1602
- // ==========================
1603
-
1604
- function ScrollSpy(element, options) {
1605
- var href
1606
- var process = $.proxy(this.process, this)
1607
-
1608
- this.$element = $(element).is('body') ? $(window) : $(element)
1609
- this.$body = $('body')
1610
- this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
1611
- this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
1612
- this.selector = (this.options.target
1613
- || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1614
- || '') + ' .nav li > a'
1615
- this.offsets = $([])
1616
- this.targets = $([])
1617
- this.activeTarget = null
1618
-
1619
- this.refresh()
1620
- this.process()
1621
- }
1622
-
1623
- ScrollSpy.DEFAULTS = {
1624
- offset: 10
1625
- }
1626
-
1627
- ScrollSpy.prototype.refresh = function () {
1628
- var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
1629
-
1630
- this.offsets = $([])
1631
- this.targets = $([])
1632
-
1633
- var self = this
1634
- var $targets = this.$body
1635
- .find(this.selector)
1636
- .map(function () {
1637
- var $el = $(this)
1638
- var href = $el.data('target') || $el.attr('href')
1639
- var $href = /^#\w/.test(href) && $(href)
1640
-
1641
- return ($href
1642
- && $href.length
1643
- && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
1644
- })
1645
- .sort(function (a, b) { return a[0] - b[0] })
1646
- .each(function () {
1647
- self.offsets.push(this[0])
1648
- self.targets.push(this[1])
1649
- })
1650
- }
1651
-
1652
- ScrollSpy.prototype.process = function () {
1653
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1654
- var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
1655
- var maxScroll = scrollHeight - this.$scrollElement.height()
1656
- var offsets = this.offsets
1657
- var targets = this.targets
1658
- var activeTarget = this.activeTarget
1659
- var i
1660
-
1661
- if (scrollTop >= maxScroll) {
1662
- return activeTarget != (i = targets.last()[0]) && this.activate(i)
1663
- }
1664
-
1665
- for (i = offsets.length; i--;) {
1666
- activeTarget != targets[i]
1667
- && scrollTop >= offsets[i]
1668
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1669
- && this.activate( targets[i] )
1670
- }
1671
- }
1672
-
1673
- ScrollSpy.prototype.activate = function (target) {
1674
- this.activeTarget = target
1675
-
1676
- $(this.selector)
1677
- .parents('.active')
1678
- .removeClass('active')
1679
-
1680
- var selector = this.selector
1681
- + '[data-target="' + target + '"],'
1682
- + this.selector + '[href="' + target + '"]'
1683
-
1684
- var active = $(selector)
1685
- .parents('li')
1686
- .addClass('active')
1687
-
1688
- if (active.parent('.dropdown-menu').length) {
1689
- active = active
1690
- .closest('li.dropdown')
1691
- .addClass('active')
1692
- }
1693
-
1694
- active.trigger('activate')
1695
- }
1696
-
1697
-
1698
- // SCROLLSPY PLUGIN DEFINITION
1699
- // ===========================
1700
-
1701
- var old = $.fn.scrollspy
1702
-
1703
- $.fn.scrollspy = function (option) {
1704
- return this.each(function () {
1705
- var $this = $(this)
1706
- var data = $this.data('bs.scrollspy')
1707
- var options = typeof option == 'object' && option
1708
-
1709
- if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
1710
- if (typeof option == 'string') data[option]()
1711
- })
1712
- }
1713
-
1714
- $.fn.scrollspy.Constructor = ScrollSpy
1715
-
1716
-
1717
- // SCROLLSPY NO CONFLICT
1718
- // =====================
1719
-
1720
- $.fn.scrollspy.noConflict = function () {
1721
- $.fn.scrollspy = old
1722
- return this
1723
- }
1724
-
1725
-
1726
- // SCROLLSPY DATA-API
1727
- // ==================
1728
-
1729
- $(window).on('load', function () {
1730
- $('[data-spy="scroll"]').each(function () {
1731
- var $spy = $(this)
1732
- $spy.scrollspy($spy.data())
1733
- })
1734
- })
1735
-
1736
- }(window.jQuery);
1737
-
1738
- /* ========================================================================
1739
- * Bootstrap: tab.js v3.0.0
1740
- * http://twbs.github.com/bootstrap/javascript.html#tabs
1741
- * ========================================================================
1742
- * Copyright 2012 Twitter, Inc.
1743
- *
1744
- * Licensed under the Apache License, Version 2.0 (the "License");
1745
- * you may not use this file except in compliance with the License.
1746
- * You may obtain a copy of the License at
1747
- *
1748
- * http://www.apache.org/licenses/LICENSE-2.0
1749
- *
1750
- * Unless required by applicable law or agreed to in writing, software
1751
- * distributed under the License is distributed on an "AS IS" BASIS,
1752
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1753
- * See the License for the specific language governing permissions and
1754
- * limitations under the License.
1755
- * ======================================================================== */
1756
-
1757
-
1758
- +function ($) { "use strict";
1759
-
1760
- // TAB CLASS DEFINITION
1761
- // ====================
1762
-
1763
- var Tab = function (element) {
1764
- this.element = $(element)
1765
- }
1766
-
1767
- Tab.prototype.show = function () {
1768
- var $this = this.element
1769
- var $ul = $this.closest('ul:not(.dropdown-menu)')
1770
- var selector = $this.attr('data-target')
1771
-
1772
- if (!selector) {
1773
- selector = $this.attr('href')
1774
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1775
- }
1776
-
1777
- if ($this.parent('li').hasClass('active')) return
1778
-
1779
- var previous = $ul.find('.active:last a')[0]
1780
- var e = $.Event('show.bs.tab', {
1781
- relatedTarget: previous
1782
- })
1783
-
1784
- $this.trigger(e)
1785
-
1786
- if (e.isDefaultPrevented()) return
1787
-
1788
- var $target = $(selector)
1789
-
1790
- this.activate($this.parent('li'), $ul)
1791
- this.activate($target, $target.parent(), function () {
1792
- $this.trigger({
1793
- type: 'shown.bs.tab'
1794
- , relatedTarget: previous
1795
- })
1796
- })
1797
- }
1798
-
1799
- Tab.prototype.activate = function (element, container, callback) {
1800
- var $active = container.find('> .active')
1801
- var transition = callback
1802
- && $.support.transition
1803
- && $active.hasClass('fade')
1804
-
1805
- function next() {
1806
- $active
1807
- .removeClass('active')
1808
- .find('> .dropdown-menu > .active')
1809
- .removeClass('active')
1810
-
1811
- element.addClass('active')
1812
-
1813
- if (transition) {
1814
- element[0].offsetWidth // reflow for transition
1815
- element.addClass('in')
1816
- } else {
1817
- element.removeClass('fade')
1818
- }
1819
-
1820
- if (element.parent('.dropdown-menu')) {
1821
- element.closest('li.dropdown').addClass('active')
1822
- }
1823
-
1824
- callback && callback()
1825
- }
1826
-
1827
- transition ?
1828
- $active
1829
- .one($.support.transition.end, next)
1830
- .emulateTransitionEnd(150) :
1831
- next()
1832
-
1833
- $active.removeClass('in')
1834
- }
1835
-
1836
-
1837
- // TAB PLUGIN DEFINITION
1838
- // =====================
1839
-
1840
- var old = $.fn.tab
1841
-
1842
- $.fn.tab = function ( option ) {
1843
- return this.each(function () {
1844
- var $this = $(this)
1845
- var data = $this.data('bs.tab')
1846
-
1847
- if (!data) $this.data('bs.tab', (data = new Tab(this)))
1848
- if (typeof option == 'string') data[option]()
1849
- })
1850
- }
1851
-
1852
- $.fn.tab.Constructor = Tab
1853
-
1854
-
1855
- // TAB NO CONFLICT
1856
- // ===============
1857
-
1858
- $.fn.tab.noConflict = function () {
1859
- $.fn.tab = old
1860
- return this
1861
- }
1862
-
1863
-
1864
- // TAB DATA-API
1865
- // ============
1866
-
1867
- $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1868
- e.preventDefault()
1869
- $(this).tab('show')
1870
- })
1871
-
1872
- }(window.jQuery);
1873
-
1874
- /* ========================================================================
1875
- * Bootstrap: affix.js v3.0.0
1876
- * http://twbs.github.com/bootstrap/javascript.html#affix
1877
- * ========================================================================
1878
- * Copyright 2012 Twitter, Inc.
1879
- *
1880
- * Licensed under the Apache License, Version 2.0 (the "License");
1881
- * you may not use this file except in compliance with the License.
1882
- * You may obtain a copy of the License at
1883
- *
1884
- * http://www.apache.org/licenses/LICENSE-2.0
1885
- *
1886
- * Unless required by applicable law or agreed to in writing, software
1887
- * distributed under the License is distributed on an "AS IS" BASIS,
1888
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1889
- * See the License for the specific language governing permissions and
1890
- * limitations under the License.
1891
- * ======================================================================== */
1892
-
1893
-
1894
- +function ($) { "use strict";
1895
-
1896
- // AFFIX CLASS DEFINITION
1897
- // ======================
1898
-
1899
- var Affix = function (element, options) {
1900
- this.options = $.extend({}, Affix.DEFAULTS, options)
1901
- this.$window = $(window)
1902
- .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
1903
- .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
1904
-
1905
- this.$element = $(element)
1906
- this.affixed =
1907
- this.unpin = null
1908
-
1909
- this.checkPosition()
1910
- }
1911
-
1912
- Affix.RESET = 'affix affix-top affix-bottom'
1913
-
1914
- Affix.DEFAULTS = {
1915
- offset: 0
1916
- }
1917
-
1918
- Affix.prototype.checkPositionWithEventLoop = function () {
1919
- setTimeout($.proxy(this.checkPosition, this), 1)
1920
- }
1921
-
1922
- Affix.prototype.checkPosition = function () {
1923
- if (!this.$element.is(':visible')) return
1924
-
1925
- var scrollHeight = $(document).height()
1926
- var scrollTop = this.$window.scrollTop()
1927
- var position = this.$element.offset()
1928
- var offset = this.options.offset
1929
- var offsetTop = offset.top
1930
- var offsetBottom = offset.bottom
1931
-
1932
- if (typeof offset != 'object') offsetBottom = offsetTop = offset
1933
- if (typeof offsetTop == 'function') offsetTop = offset.top()
1934
- if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
1935
-
1936
- var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
1937
- offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
1938
- offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
1939
-
1940
- if (this.affixed === affix) return
1941
- if (this.unpin) this.$element.css('top', '')
1942
-
1943
- this.affixed = affix
1944
- this.unpin = affix == 'bottom' ? position.top - scrollTop : null
1945
-
1946
- this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))
1947
-
1948
- if (affix == 'bottom') {
1949
- this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })
1950
- }
1951
- }
1952
-
1953
-
1954
- // AFFIX PLUGIN DEFINITION
1955
- // =======================
1956
-
1957
- var old = $.fn.affix
1958
-
1959
- $.fn.affix = function (option) {
1960
- return this.each(function () {
1961
- var $this = $(this)
1962
- var data = $this.data('bs.affix')
1963
- var options = typeof option == 'object' && option
1964
-
1965
- if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
1966
- if (typeof option == 'string') data[option]()
1967
- })
1968
- }
1969
-
1970
- $.fn.affix.Constructor = Affix
1971
-
1972
-
1973
- // AFFIX NO CONFLICT
1974
- // =================
1975
-
1976
- $.fn.affix.noConflict = function () {
1977
- $.fn.affix = old
1978
- return this
1979
- }
1980
-
1981
-
1982
- // AFFIX DATA-API
1983
- // ==============
1984
-
1985
- $(window).on('load', function () {
1986
- $('[data-spy="affix"]').each(function () {
1987
- var $spy = $(this)
1988
- var data = $spy.data()
1989
-
1990
- data.offset = data.offset || {}
1991
-
1992
- if (data.offsetBottom) data.offset.bottom = data.offsetBottom
1993
- if (data.offsetTop) data.offset.top = data.offsetTop
1994
-
1995
- $spy.affix(data)
1996
- })
1997
- })
1998
-
1999
- }(window.jQuery);